[
  {
    "path": ".aiAutoMinify.json",
    "content": "{\n    \"pkgs\": {\n        \"@microsoft/applicationinsights-core-js\": {\n            \"constEnums\": [\n                \"_eSetDynamicPropertyFlags\",\n                \"ePendingOp\",\n                \"CallbackType\",\n                \"eW3CTraceFlags\",\n                \"eRequestHeaders\",\n                \"eTraceStateKeyType\",\n                \"eOfflineValue\",\n                \"eDependencyTypes\",\n                \"eStorageType\",\n                \"FieldType\",\n                \"eDistributedTracingModes\",\n                \"EventPersistenceValue\",\n                \"eEventsDiscardedReason\",\n                \"eBatchDiscardedReason\",\n                \"FeatureOptInMode\",\n                \"CdnFeatureMode\",\n                \"eActiveStatus\",\n                \"eLoggingSeverity\",\n                \"_eInternalMessageId\",\n                \"SendRequestReason\",\n                \"eStatsType\",\n                \"TelemetryUnloadReason\",\n                \"TelemetryUpdateReason\",\n                \"eTraceHeadersMode\",\n                \"eUrlRedactionOptions\",\n                \"eValueKind\",\n                \"EventLatencyValue\",\n                \"eEventPropertyType\",\n                \"EventSendType\",\n                \"eTraceLevel\",\n                \"_eExtendedInternalMessageId\",\n                \"GuidStyle\",\n                \"FieldValueSanitizerType\",\n                \"TransportType\",\n                \"eAttributeChangeOp\",\n                \"eOTelSamplingDecision\",\n                \"eOTelSpanKind\",\n                \"eOTelSpanStatusCode\",\n                \"eAttributeSource\",\n                \"AddAttributeResult\",\n                \"DataPointType\",\n                \"DependencyKind\",\n                \"DependencySourceType\",\n                \"eSeverityLevel\",\n                \"eAttributeFilter\",\n                \"DataSanitizerValues\"\n            ]\n        },\n        \"@microsoft/applicationinsights-perfmarkmeasure-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-common\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-properties-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-dependencies-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-debugplugin-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-channel-js\": {\n            \"constEnums\": [\n                \"eSerializeType\"\n            ]\n        },\n        \"@microsoft/applicationinsights-react-native\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-clickanalytics-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-web-basic\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-analytics-js\": {\n            \"constEnums\": [\n                \"eRouteTraceStrategy\"\n            ]\n        },\n        \"@microsoft/applicationinsights-web\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-react-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-teechannel-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/applicationinsights-cfgsync-js\": {\n            \"constEnums\": [\n                \"ICfgSyncMode\"\n            ]\n        },\n        \"@microsoft/1ds-core-js\": {\n            \"constEnums\": []\n        },\n        \"@microsoft/1ds-post-js\": {\n            \"constEnums\": [\n                \"EventBatchNotificationReason\"\n            ]\n        },\n        \"@microsoft/applicationinsights-offlinechannel-js\": {\n            \"constEnums\": [\n                \"eStorageType\",\n                \"eBatchSendStatus\",\n                \"eBatchStoreStatus\",\n                \"CursorProcessResult\",\n                \"eStorageProviders\",\n                \"ValueQueryType\"\n            ]\n        },\n        \"@microsoft/applicationinsights-osplugin-js\": {\n            \"constEnums\": []\n        }\n    }\n}"
  },
  {
    "path": ".eslintrc",
    "content": "{\n    \"env\": {\n        \"browser\": true,\n        \"es2021\": true\n    },\n    \"plugins\": [\n        \"security\"\n    ],\n    \"extends\": [\n        \"eslint:recommended\",\n        \"plugin:@typescript-eslint/recommended\",\n        \"plugin:security/recommended\"\n    ],\n    \"rules\": {\n        \"indent\": [\"error\"],                                        // Enabling for auto fixing\n        \"quotes\": [\"warn\", \"double\"],                               // Enabled for auto fixing\n        \"curly\": [ \"error\" ],                                       // Enabling for auto fixing\n        \"brace-style\": [ \"error\" ],                                 // Enabling for auto fixing\n        \"prefer-const\": \"off\",\n        \"prefer-spread\": \"off\",\n        \"no-var\": \"off\",\n        \"no-extra-boolean-cast\": \"off\",\n        \"prefer-rest-params\": \"off\",\n        \"no-case-declarations\": \"off\",\n        \"no-prototype-builtins\": \"off\",\n        \"no-useless-escape\": \"off\",                                 // Suppressing Error -- need to Review Later\n        \"no-trailing-spaces\": [ \"warn\", { \"skipBlankLines\": true }],// Enabled for auto fixing\n        \"no-const-assign\": \"error\",\n        \"comma-dangle\": [ \"error\", \"never\" ],                       // Enabled for auto fixing\n        \"security/detect-object-injection\": \"off\",                  // Suppress Warning -- need to Review Later\n        \"security/detect-non-literal-fs-filename\": \"off\",           // This was causing a bunch of false positive matches for dynamic config \"watch\" function\n        \"@typescript-eslint/ban-types\": \"off\",\n        \"@typescript-eslint/no-unused-vars\": [ \"warn\", { \"vars\": \"all\", \"args\": \"none\", \"argsIgnorePattern\": \"^_\", \"ignoreRestSiblings\": true } ],\n        \"@typescript-eslint/triple-slash-reference\": \"off\",\n        \"@typescript-eslint/no-inferrable-types\": \"off\",\n        \"@typescript-eslint/no-this-alias\": \"off\",\n        \"@typescript-eslint/no-explicit-any\": \"off\",\n        \"@typescript-eslint/no-empty-function\": \"off\",\n        \"@typescript-eslint/no-empty-interface\": \"off\",\n        \"@typescript-eslint/explicit-module-boundary-types\": \"off\",\n        \"@typescript-eslint/no-extra-semi\": \"error\",                // Enabled for auto fixing\n        \"@typescript-eslint/no-non-null-assertion\": \"error\"\n    }\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n# Don't allow people to merge changes to these generated files, because the result\n# may be invalid.  You need to run \"rush update\" again.\nshrinkwrap.yaml              merge=binary\nnpm-shrinkwrap.json          merge=binary\nyarn.lock                    merge=binary\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "* @microsoft/ApplicationInsights-JS-owners\n* @microsoft/ApplicationInsights-JS-CodeOwners\n/.github/CODEOWNERS @microsoft/ApplicationInsights-JS-owners\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a new bug report\ntitle: \"[BUG]\"\nlabels: ''\nassignees: ''\n\n---\n\n**Description/Screenshot**\n\n**Steps to Reproduce**\n\n - OS/Browser:\n - SDK Version [e.g. 22]:\n - How you initialized the SDK:\n\n**Expected behavior**\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/codeql/codeql-config.yml",
    "content": "name: \"CodeQL config\"\n\nqueries:\n  - uses: security-and-quality\n\npaths-ignore:\n  - '**/test/'\n  - '**/Tests/'\n  - '**/dist-history/'\n  - '**/rollup.config.js'\n  - '**/docs/webSdk/'\n  - '**/tools/**/*.jsonc'\n  - '**/node_modules/'\n  - '**/*.d.ts'\n  - '**/out/'\n  - '**/build/'\n  - '**/bundle/'\n  - '**/dist/'\n  - '**/dist-es*/'\n  - 'common/temp/'\n  - '**/samples/'\n"
  },
  {
    "path": ".github/copilot-instructions.md",
    "content": "# GitHub Copilot Instructions for Application Insights JavaScript SDK\n\n## Workflow Prompts\n\nDetailed step-by-step workflow instructions are available as prompt files in `.github/prompts/`. When asked to perform one of these tasks, **always read and follow the corresponding prompt file**:\n\n- **Release PR**: `.github/prompts/release-pr.prompt.md` — Full workflow for creating a release PR (version bump, README updates, RELEASES.md, gruntfile, lint, commit, and build validation)\n\n## Project Overview\nThis is the **Microsoft Application Insights JavaScript SDK** - a browser-based telemetry library for monitoring web applications. The SDK tracks page views, user interactions, performance metrics, exceptions, and custom events.\n\n## Architecture & Structure\n\n### Monorepo Structure\n- **AISKU/**: Main Application Insights SDK package\n- **AISKULight/**: Lightweight version of the SDK\n- **shared/**: Core shared libraries (AppInsightsCore, AppInsightsCommon, 1ds-core-js)\n- **extensions/**: Plugin-based extensions (analytics, dependencies, etc.)\n- **channels/**: Data transmission channels (online, offline, tee)\n- **tools/**: Build and development tools\n- **examples/**: Sample implementations\n\n### Key Technologies\n- **TypeScript/JavaScript**: Primary languages (ES5 target for browser compatibility)\n- **Rush**: Monorepo management tool\n- **Rollup**: Module bundler\n- **Grunt**: Task runner\n- **Dynamic Proto**: Dynamic prototype pattern for performance\n\n## Code Style & Patterns\n\n### Required Before Each Commit\n- Do not commit any changes that are only end-of-file whitespace changes\n- Ensure all TypeScript files are formatted and imports are reordered correctly by running `npm run lint-fix` before committing\n  - This will apply ESLint fixes to all TypeScript files\n  - It will also reorder imports to maintain consistent style\n\n### TypeScript/JavaScript Conventions\n- Use **ES5-compatible** syntax for browser support and target ES5 for modern browsers\n- Prefer `function` declarations over arrow functions for better IE compatibility\n- Use `var` instead of `let/const` in JavaScript files for ES5 compatibility (use `let/const` in TypeScript files)\n- Always use semicolons\n- Use 4-space indentation\n- Maximum line length: 140 characters\n\n### Naming Conventions\n- **Classes**: PascalCase (e.g., `PageViewManager`, `TelemetryContext`)\n- **Interfaces**: PascalCase with `I` prefix (e.g., `ITelemetryItem`, `IPageViewTelemetry`)\n- **Methods/Functions**: camelCase (e.g., `trackPageView`, `sendTelemetry`)\n- **Constants**: UPPER_SNAKE_CASE (e.g., `MAX_DURATION_ALLOWED`)\n- **Private variables**: underscore prefix (e.g., `_logger`, `_hasInitialized`)\n- **Enums**: PascalCase with `e` prefix (e.g., `eLoggingSeverity`, `eInternalMessageId`)\n  - Must be const enums with integer values (not strings)\n  - Use `createEnumStyle` helper for exported enums\n  - All usage should reference the const enum directly\n\n### Dynamic Proto Pattern\nThis project uses a unique `dynamicProto` pattern for performance optimization. This pattern should be used for all classes:\n\n```typescript\nexport class MyClass {\n    constructor() {\n        dynamicProto(MyClass, this, (_self, _base) => {\n            // Private variables should be included inside the constructor closure\n            // They are not publicly visible on the class\n            let _logger = _self._logger;\n            let _hasInitialized = false;\n            \n            // Public methods need @DynamicProtoStub comment for TypeScript definitions\n            _self.myMethod = () => {\n                // Method implementation\n            };\n        });\n    }\n    \n    /**\n     * @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n     */\n    public myMethod(): void {\n        // This stub will be replaced by the dynamicProto implementation\n    }\n}\n```\n\nKey requirements:\n- Use this pattern for all classes\n- Private variables must be inside the constructor closure\n- Public functions need `@DynamicProtoStub` comment for TypeScript definition generation\n- Never add implementation code to the stub methods\n\n### Error Handling\n- Use `_throwInternal` for logging diagnostic errors\n- Always include telemetry context in error messages\n- Use appropriate logging severity levels: `CRITICAL`, `WARNING`, `INFORMATION`\n\n```typescript\n_throwInternal(_logger,\n    eLoggingSeverity.WARNING,\n    _eInternalMessageId.InvalidDurationValue,\n    \"Invalid page load duration value\",\n    { total, network, request, response, dom });\n```\n\n### Performance Considerations\n- Minimize object allocations in hot paths\n- Use `doPerf()` wrapper for performance tracking\n- Avoid synchronous operations that could block the browser\n- Implement lazy initialization where possible\n- Use object pooling for frequently created objects\n- Minimize the size of generated JavaScript by avoiding certain TypeScript features:\n  - Do not use the spread `...` operator\n  - Do not use optional chaining `?.` operator\n  - Do not use the nullish coalescing `??` operator - use `||` instead\n  - These restrictions will be removed once ES5 support is discontinued\n\n## Browser Compatibility\n\n### Target Support\n- **Modern browsers**: Chrome, Firefox, Safari, Edge (targeting ES5 for modern browsers)\n- **Legacy support**: Internet Explorer 8+ (ES5 compatibility required)\n- **Mobile browsers**: iOS Safari, Android Chrome\n- **Non-browser runtimes**: Node.js and other browser-like environments (for worker contexts and server-side rendering)\n\n### Compatibility Patterns\n- Feature detection over browser detection\n- Graceful degradation for missing APIs\n- Use existing polyfills rather than creating new ones\n- Safe API usage with null checks\n\n### Async Operations Support\nSupport async operations using ts-async helpers instead of native async/await:\n- Use `doAwait` for `await` operations\n- Use `doAwaitResponse` to handle catch operations for asynchronous operations\n- Use `createPromise`, `createSyncPromise`, `createIdlePromise` instead of declaring functions as `async`\n- Return type should use `IPromise` instead of `Promise` for IE support\n\n```typescript\nconst perf = getPerformance();\nif (perf && perf.timing && perf.timing.navigationStart) {\n    // Use performance API\n}\n```\n\n## Telemetry & Data Collection\n\n### Core Telemetry Types\n- **Page Views**: `IPageViewTelemetry` - Track page navigation\n- **Events**: `IEventTelemetry` - Custom user actions\n- **Metrics**: `IMetricTelemetry` - Numeric measurements\n- **Exceptions**: `IExceptionTelemetry` - Error tracking\n- **Dependencies**: `IDependencyTelemetry` - External calls\n- **Traces**: `ITraceTelemetry` - Logging messages\n\n### Data Privacy & Compliance\n- Never collect PII (personally identifiable information) by default\n- Sanitize URLs and remove sensitive query parameters\n- Implement data sampling and throttling\n- Support opt-out mechanisms\n- Follow GDPR/privacy regulations\n\n### Performance Monitoring\n- Use `IPerfManager` and `IPerfEvent` for internal performance tracking\n- Collect browser timing APIs (Navigation Timing, Resource Timing)\n- Track page load performance metrics\n- Monitor SDK overhead and impact\n\n## Plugin Architecture\n\n### Plugin Development\n- Extend `BaseTelemetryPlugin` for new plugins\n- Implement `ITelemetryPlugin` interface\n- Use `IProcessTelemetryContext` for processing pipeline\n- Support plugin chaining and dependencies\n\n```typescript\nexport class MyPlugin extends BaseTelemetryPlugin {\n    public processTelemetry(evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // Process telemetry\n        this.processNext(evt, itemCtx);\n    }\n}\n```\n\n### Extension Points\n- **Telemetry Initializers**: Modify telemetry before sending\n- **Dependency Listeners**: Track AJAX/fetch calls\n- **Channels**: Custom data transmission\n\n## Testing Patterns\n\n### Unit Testing\n- Use framework-agnostic test patterns\n- Mock browser APIs consistently\n- Test both success and failure scenarios\n- Verify telemetry data structure and content\n\n### Testing Framework Requirements\n- **Extend AITestClass**: All test classes must extend `AITestClass` from `@microsoft/ai-test-framework`\n- **Use Framework Tools**: Leverage existing framework helpers like `this.hookFetch()`, `this.useFakeTimers()`, and `this.onDone()`\n- **Proper Registration**: Implement `registerTests()` method and use `this.testCase()` for test registration\n- **Async Tests**: Return `IPromise` from test functions for asynchronous operations (do not use deprecated `testCaseAsync`)\n\n### Critical Cleanup & Resource Management\n- **Mandatory Core Cleanup**: Always call `appInsightsCore.unload(false)` in test cleanup to prevent hook pollution between tests\n- **Extension Teardown**: Only call `teardown()` on extension instances that were NOT added to a core instance; `core.unload()` handles teardown for initialized extensions\n- **Hook Validation**: The framework validates that all hooks are properly removed; tests will fail if cleanup is incomplete\n- **Resource Isolation**: Each test must be completely isolated - no shared state or leftover hooks\n\n### Configuration Testing Requirements\n- **Static Configuration**: Test initial configuration setup and validation\n- **Dynamic Configuration**: **REQUIRED** - All tests that touch configuration must include post-initialization configuration change tests\n- **onConfigChange Testing**: Components using `onConfigChange` callbacks must be tested for runtime configuration updates\n- **Configuration Validation**: Test both valid and invalid configuration scenarios with proper error handling\n\n```typescript\n// Example dynamic configuration test pattern\npublic testDynamicConfig() {\n    // Initial setup with one config\n    let initialConfig = { enableFeature: false };\n    core.initialize(initialConfig, channels);\n    \n    // Verify initial behavior\n    Assert.equal(false, component.isFeatureEnabled());\n    \n    // Update configuration dynamically\n    core.config.enableFeature = true;\n    // Note: core.onConfigChange() only registers callbacks, it doesn't trigger changes\n    \n    // To trigger config change detection, use one of these patterns:\n    \n    // Option 1: Using fake timers (synchronous)\n    this.clock.tick(1); // Trigger 1ms timer for config change detection\n    \n    // Option 2: Async test without fake timers\n    // return createPromise((resolve) => {\n    //     setTimeout(() => {\n    //         Assert.equal(true, component.isFeatureEnabled());\n    //         resolve();\n    //     }, 10);\n    // });\n    \n    // Verify behavior changed (when using fake timers)\n    Assert.equal(true, component.isFeatureEnabled());\n}\n```\n\n### Package Organization & Dependencies\n- **Respect Package Boundaries**: Place tests in the package that owns the functionality being tested\n- **Dependency Injection**: Extensions must include dependencies in `config.extensions` array for proper initialization\n- **Cross-Package Coordination**: Understand which package owns which functionality when testing integrated features\n- **Import Resolution**: Use proper module imports and avoid direct file path dependencies\n\n### HTTP API & Network Testing\n- **Use Framework Helpers**: Use `this.hookFetch()` instead of custom fetch mocking implementations\n- **XMLHttpRequest Testing**: Use framework's built-in mechanisms for XHR validation\n- **Header Validation**: Test both presence and absence of headers based on different configuration modes\n- **Network Scenarios**: Test success, failure, timeout, and edge cases consistently\n\n### Async Testing Patterns\n- **IPromise Return**: Use `this.testCase()` and return `IPromise` for asynchronous operations instead of deprecated `testCaseAsync`\n- **Promise Handling**: Handle both resolution and rejection paths in async tests\n- **Timing Control**: Use `this.clock.tick()` when `useFakeTimers: true` for deterministic timing\n- **Cleanup in Async**: Ensure cleanup happens in both success and failure paths of async tests\n\n```typescript\n// Example async test pattern\nthis.testCase({\n    name: \"Async operation test\",\n    test: () => {\n        return createPromise((resolve, reject) => {\n            // Setup async operation\n            someAsyncOperation().then(() => {\n                try {\n                    // Assertions\n                    Assert.ok(true, \"Operation succeeded\");\n                    resolve();\n                } catch (e) {\n                    reject(e);\n                }\n            }).catch(reject);\n        });\n    }\n});\n```\n\n### Unit Testing Best Practices\n- **Comprehensive Coverage**: Test all major code paths including edge cases and error conditions\n- **Mock Browser APIs**: Mock browser APIs consistently using framework-provided mechanisms\n- **Telemetry Validation**: Verify telemetry data structure, content, and proper formatting\n- **State Testing**: Test both empty/null states and populated states for data structures\n\n### Browser Testing\n- **Cross-browser Compatibility**: Test across different browser environments and API availability\n- **Performance Regression**: Monitor test execution time and detect performance regressions\n- **Memory Leak Detection**: Verify proper cleanup and resource management in long-running scenarios\n- **API Graceful Degradation**: Test behavior when browser APIs are unavailable or disabled\n\n### Test Organization\n- **Collocate Tests**: Place tests in `Tests/` directories within the same package as source code\n- **Descriptive Naming**: Use clear, descriptive test names that explain the scenario being tested\n- **Logical Grouping**: Group related tests in test suites within the same test class\n- **Documentation**: Include comments explaining complex test scenarios and edge cases\n\n### Common Anti-Patterns to Avoid\n- **Skipping Cleanup**: Not calling `unload()` or `teardown()` methods leads to test interference\n- **Custom Implementations**: Implementing custom mocks/helpers instead of using framework-provided tools\n- **Configuration Gaps**: Testing only static configuration without dynamic configuration change scenarios\n- **Hook Pollution**: Leaving hooks active between tests causing false positives/negatives\n- **Incomplete Coverage**: Missing edge cases, error conditions, or state transitions\n- **Deprecated Async**: Using deprecated `testCaseAsync` instead of `testCase` with `IPromise` return\n\n## Configuration & Initialization\n\n### SDK Configuration\n- Support both snippet and npm installation\n- Provide sensible defaults\n- Allow runtime configuration changes\n- Validate configuration parameters\n- Configuration names should be descriptive but mindful of browser bundle size by keeping names concise and readable\n\n```typescript\nconst config: IConfiguration = {\n    instrumentationKey: \"your-key\",\n    enableAutoRouteTracking: true,\n    disableTelemetry: false,\n    samplingPercentage: 100\n};\n```\n\n### Initialization Patterns\n- Lazy initialization to minimize startup impact\n- Graceful handling of initialization failures\n- Support for multiple SDK instances\n- Plugin dependency resolution\n\n## Performance Guidelines\n\n### Bundle Size Optimization\n- Tree-shaking friendly exports\n- Conditional feature loading\n- Minimize third-party dependencies\n- Use rollup for optimal bundling\n\n### Runtime Performance\n- Avoid blocking the main thread\n- Use requestIdleCallback when available\n- Batch telemetry operations\n- Implement efficient queuing mechanisms\n\n### Memory Management\n- Clean up event listeners on teardown\n- Avoid memory leaks in long-running applications\n- Use weak references where appropriate\n- Implement proper disposal patterns\n\n### Code Organization & Tree-Shaking\n- Each package should be side-effect free to enable proper tree-shaking\n- All code should be tree-shakable - avoid global side effects\n- Use lazy initialization for any globals via `ILazyValue` interface or similar patterns\n- Distinguish between \"value not yet checked/assigned\" vs \"resulting value is null/undefined\"\n- Export functions and classes individually rather than as default exports\n- Avoid executing code at module load time\n\n## Common Patterns & Anti-Patterns\n\n### ✅ Good Practices\n- Use TypeScript interfaces for contracts\n- Implement proper error boundaries\n- Follow the plugin architecture\n- Use performance monitoring internally\n- Sanitize all user inputs\n- Support both sync and async operations\n\n### ❌ Anti-Patterns\n- Don't block the browser UI thread\n- Avoid throwing unhandled exceptions\n- Don't collect sensitive user data\n- Avoid tight coupling between components\n- Don't ignore browser compatibility\n- Avoid memory leaks in event handlers\n\n## Documentation Standards\n\n### Code Comments\n- Use TypeDoc format for public APIs\n- Document complex algorithms and business logic\n- Include examples for public methods\n- Explain browser compatibility considerations\n\n### Interface Documentation\n- Document all public interfaces thoroughly using TypeDoc comments\n- Include parameter validation requirements\n- Include defaults and any relevant examples\n- Specify return value contracts\n- Note any side effects or state changes\n\n## Build & Deployment\n\n### Build Process\n- Rush for monorepo management\n- TypeScript compilation with strict settings\n- Rollup bundling with multiple output formats\n- Minification and size optimization\n\n### Release Process\n\n#### Version Management\nThe project uses `version.json` in the root to track release versions and an automated `setVersion.js` script to update all packages consistently.\n\n**`version.json` key fields:**\n- `release`: The current base version (e.g., `\"3.4.0\"`)\n- `next`: The default increment type for `-next` flag (`\"patch\"`, `\"minor\"`, or `\"major\"`)\n- `pkgs`: Per-package version overrides (some packages like `1ds-*` or `offline-channel` have independent version numbers)\n\n**Using the setVersion script:**\n```bash\n# Common release commands:\nnpm run setVersion -- -next           # Increment based on version.json \"next\" field (e.g., patch: 3.3.11 => 3.3.12)\nnpm run setVersion -- -next -release  # Increment and remove any pre-release tag\nnpm run setVersion -- -patch          # Force patch increment (x.y.z => x.y.[z+1])\nnpm run setVersion -- -minor          # Force minor increment (x.y.z => x.[y+1].0)\nnpm run setVersion -- -major          # Force major increment (x.y.z => [x+1].0.0)\nnpm run setVersion -- 3.4.0           # Set an explicit version\n\n# Pre-release variants:\nnpm run setVersion -- -next -dev      # Increment + dev pre-release tag (x.y.z-dev)\nnpm run setVersion -- -next -beta     # Increment + beta pre-release tag (x.y.z-beta)\nnpm run setVersion -- -next -alpha    # Increment + alpha pre-release tag (x.y.z-alpha)\nnpm run setVersion -- -release        # Strip pre-release tag from current version (x.y.z-beta => x.y.z)\n\n# Dry run (logs changes without modifying files):\nnpm run setVersion -- -next -test\n```\n\n**What setVersion updates:**\n1. `version.json` — updates `release` and per-package versions in `pkgs`\n2. All `package.json` files — updates `version`, `publishConfig.tag`, and all internal `@microsoft/applicationinsights-*` and `@microsoft/1ds-*` dependency references\n3. Source files (`.ts`, `.tsx`, `.html`) — replaces hardcoded version strings\n\n#### Creating a Release PR\nFor the full step-by-step release PR workflow (version bump, README updates, RELEASES.md, gruntfile, lint, commit, and build validation), see the prompt file at `.github/prompts/release-pr.prompt.md`.\n\nSummary of the steps:\n1. Run `npm run setVersion -- -next -release` to bump the version\n2. Update `AISKU/README.md` CDN version table\n3. Update `RELEASES.md` with the new version entry, moving the \"Unreleased Changes\" content into the new version section\n4. Update `gruntfile.js` perfTestVersions array\n5. Run `npm run lint-fix`\n6. Commit all changes\n7. Run `npm run fullCleanBuild` to validate (must be run outside VS Code due to file locks)\n\n#### Publishing (post-merge)\n- `npm run npm-package` — Creates `.tgz` packages for a package group\n- `npm run npm-publish` — Publishes packages to npm\n- `npm run npm-set-latest` — Updates the npm `latest` tag\n- Package groups are defined in `tools/release-tools/package_groups.json`\n\n#### General Guidelines\n- Semantic versioning\n- Automated testing before release\n- Bundle size monitoring\n- Browser compatibility verification\n\n---\n\n*This document helps GitHub Copilot understand the unique patterns, architecture, and requirements of the Application Insights JavaScript SDK project.*\n"
  },
  {
    "path": ".github/prompts/release-pr.prompt.md",
    "content": "---\ndescription: \"Create a release PR: bump version, update READMEs, RELEASES.md, gruntfile, and commit\"\nagent: \"agent\"\n---\n\n# Create Release PR\n\nPrepare a release by incrementing the version and updating all required files. Do NOT create a new branch — use the current branch.\n\n## Step 1: Increment the Version\n\n**IMPORTANT: You MUST run the setVersion command FIRST and wait for it to complete BEFORE reading `version.json`.** Do NOT read `version.json` beforehand — the current value is the *old* version. The script increments the version, and only after it finishes will `version.json` contain the correct new version.\n\nRun the following command from the repo root to bump the version based on the `next` field in `version.json`:\n\n```\nnpm run setVersion -- -next\n```\n\nAfter the command completes, THEN read `version.json` to determine the new version number (the `release` field). This is referred to as `X.Y.Z` in the steps below. Do NOT assume you know the version from any prior reading of the file.\n\n## Step 2: Update AISKU/README.md CDN Version Table\n\nIn [AISKU/README.md](../AISKU/README.md), find the `## CDN Version Release Summary (with Size tracking)` table.\n\nAdd a new row for `X.Y.Z` immediately after the nightly row and before the previous release entry. Use this exact format (substitute the actual version):\n\n```\n| X.Y.Z:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.X.Y.Z.js.svg)](https://js.monitor.azure.com/scripts/b/ai.X.Y.Z.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.X.Y.Z.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.X.Y.Z.min.js.gzip.svg)\n```\n\nRemove the oldest version row from the v3.x section to keep the table from growing unbounded (keep the last ~25 v3.x entries). Do NOT remove any v2.x entries.\n\n## Step 3: Update RELEASES.md\n\nIn [RELEASES.md](../RELEASES.md):\n\n1. **Create a new release heading** at the top of the file (after the initial note and before any existing release entries), using format:\n   ```\n   ## X.Y.Z (Month DDth, YYYY)\n   ```\n   Use today's date. The new release section is always inserted at the top — above all existing entries including any beta/alpha/pre-release entries.\n\n2. **Include Significant Changes**: If this release includes significant new features, breaking changes, behavioral changes, package deprecations, or other notable updates, add a `### Significant Changes (since PREV_VERSION)` section (where `PREV_VERSION` is the previous full release version) summarizing them. Review the existing beta/pre-release entry (if any) for content that should be carried forward (duplicated) into the new release. This section should be human-readable and describe the impact to users.\n\n   **You MUST always thoroughly review every PR/commit since the previous release** to identify all significant changes — do not rely solely on what was already written in the beta or unreleased sections. PRs that introduce new features, change behavior, deprecate packages, modify default configuration values, or improve reliability/performance should all be included as significant changes even if they were not called out in prior sections.\n\n   If any packages have been merged, deprecated, or are now published only as compatibility shims, add a `### Package Deprecation` section describing which packages are affected, that they are still published as shims, and that consumers should migrate to the new package.\n\n   If any of the significant changes were previously included in a beta/alpha/pre-release, add a blockquote note immediately after the heading:\n   ```\n   > The following are the significant changes since the previous full release (PREV_VERSION). Some of these changes were previously included in the X.Y.Z-beta release.\n   ```\n   This makes it clear why content may appear duplicated across release entries.\n\n3. **Include Breaking Changes and Potential Breaking Changes**: If the existing unreleased or beta sections contain `### Breaking Changes` or `### Potential Breaking Changes` or `### Potential behavioral changes` sections, duplicate them into the new release section. Do NOT remove them from the original beta/pre-release entry.\n\n4. **Build the Changelog**: Combine:\n   - All entries currently under `## Unreleased Changes (from Main)` changelog\n   - All entries from any beta/pre-release section changelog (e.g., `## X.Y.Z-beta`) — these should be **duplicated** into the new release, NOT moved\n   - Review git history since the last release tag for any significant PRs that may have been missed\n   - Do NOT include PRs that only bump dependency versions (e.g., \"bump @microsoft/xxx from A to B\")\n   - Each entry should be a clickable link: `- #NNNN Description` where `#NNNN` links to the GitHub PR\n\n   **CRITICAL: NEVER strip or remove sub-bullet details from changelog entries.** If an entry in the Unreleased section or a prior release includes sub-bullets with additional context (e.g., potential breaking changes, enhancement notes, configuration details), those sub-bullets MUST be preserved exactly as-is in the new release changelog. Do not flatten detailed entries into single-line summaries.\n\n5. **Add a comparison link** at the end of the new release section:\n   ```\n   **Full Changelog**: https://github.com/microsoft/ApplicationInsights-JS/compare/PREV_VERSION...X.Y.Z\n   ```\n   Where `PREV_VERSION` is the previous release version tag.\n\n6. **Clean up the Unreleased section only**: Remove or comment out the `## Unreleased Changes (from Main)` section content. Leave behind a commented placeholder:\n   ```\n   <!-- ## Unreleased Changes -->\n   ```\n\n   **CRITICAL: NEVER delete or remove any existing release entries from RELEASES.md** — this includes beta, alpha, RC, and all prior full releases. Even if a beta/pre-release contains the same changes as the new full release, the beta entry must remain in the file. The only section that gets removed is the `## Unreleased Changes (from Main)` section.\n\n   Even when told to use version X.Y.Z as the \"previous release\" for changelog purposes, this only affects which PRs to include in the new entry and the comparison link — it does NOT mean you should delete any intervening release entries (beta, alpha, etc.) from the file.\n\n## Step 4: Update gruntfile.js perfTestVersions\n\nIn [gruntfile.js](../gruntfile.js), update the `perfTestVersions` array to include the new version:\n\n```javascript\nconst perfTestVersions=[\"X.Y.Z\"];\n```\n\nReplace the existing version value — this array should contain only the new release version.\n\n## Step 5: Run lint-fix\n\nRun the following command to ensure all files are properly formatted:\n\n```\nnpm run lint-fix\n```\n\n## Step 6: Commit\n\nStage all changes and commit with the message:\n\n```\n[Release] Increase version to X.Y.Z\n```\n\nIf there are significant changes worth calling out (breaking changes, major new features), add them as additional lines after the subject line. It is valid for this commit to have no additional body content beyond the subject.\n\nDo NOT push the branch — just create the local commit.\n\n## Step 7: Validate the Build\n\nRun the full clean build to ensure no build issues:\n\n```\nnpm run fullCleanBuild\n```\n\n- **If running from GitHub Actions, automation, or a CI environment**: Run this command directly before creating the PR. Resolve any unexpected build failures before proceeding.\n- **If running interactively from VS Code or Visual Studio**: This command cannot be run from within the editor because open editors and extensions hold file locks that will cause the clean build step to fail. Instead, inform the user that they need to **manually** run `npm run fullCleanBuild` from a **separate terminal** (e.g., Windows Terminal, PowerShell, or Command Prompt) pointed at the repo root, and resolve any issues before creating the PR.\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: Node.js CI\n\non:\n  push:\n    branches: [ main, master, beta, Release2.7, release-3.0 ]\n  pull_request:\n    branches: [ main, master, beta, Release2.7, release-3.0 ]\n  merge_group:\n    branches: [ \"main\", \"master\", \"beta\", \"Release*\", \"release*\", \"*-legacy\", \"legacy-v1\" ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [ 16, 18, 20 ]\n\n    steps:\n    - uses: actions/checkout@v4\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v4\n      with:\n        node-version: ${{ matrix.node-version }}\n    - name: Update rush shrinkwrap dependencies (for different node versions)\n      run: node common/scripts/install-run-rush.js update --full --recheck\n    - run: npm install rollup -g\n    - run: npm install grunt-cli\n    - run: npm install\n    - run: node common/scripts/install-run-rush.js check\n    - run: node common/scripts/install-run-rush.js update --full --recheck\n    - run: npm run build --verbose\n      timeout-minutes: 20\n    - run: npm run test --verbose\n      timeout-minutes: 30\n"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL\"\n\non:\n  push:\n    branches: [ \"main\", \"master\", \"beta\", \"Release*\", \"release*\", \"*-legacy\", \"legacy-v1\" ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ \"main\", \"master\", \"beta\", \"Release*\", \"release*\", \"*-legacy\", \"legacy-v1\" ]\n  schedule:\n    - cron: '15 17 * * 2'  # Every Tuesday at 17:15 UTC\n\njobs:\n  analyze:\n    name: Analyze (${{ matrix.language }})\n    runs-on: ubuntu-latest\n    permissions:\n      # required for all workflows\n      security-events: write\n      # required to fetch internal or private CodeQL packs\n      packages: read\n      # only required for workflows in private repositories\n      actions: read\n      contents: read\n      \n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - language: actions\n          - language: javascript\n          - language: javascript-typescript\n            node-version: '18'\n        # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'\n        # Use `c-cpp` to analyze code written in C, C++ or both\n        # Use 'java-kotlin' to analyze code written in Java, Kotlin or both\n        # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both\n        # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,\n        # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.\n        # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how\n        # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v4\n\n    # Setup Node.js for JavaScript projects\n    - name: Setup Node.js ${{ matrix.node-version }}\n      # Only run the build for Typescript/JavaScript language match\n      if: matrix.language == 'javascript-typescript' \n      uses: actions/setup-node@v4\n      with:\n        node-version: ${{ matrix.node-version }}\n        \n    # Install dependencies for JavaScript projects\n    - name: Install dependencies\n      # Only run the build for Typescript/JavaScript language match\n      if: matrix.language == 'javascript-typescript'\n      run: |\n        node common/scripts/install-run-rush.js update --full --recheck\n        npm install rollup -g\n        npm install grunt-cli\n        npm install\n        node common/scripts/install-run-rush.js update --full --recheck\n        \n    # Initializes the CodeQL tools for scanning\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        languages: ${{ matrix.language }}\n        config-file: ./.github/codeql/codeql-config.yml\n        \n    # Build JavaScript project specifically (skipping autobuild for JavaScript)\n    - name: Build JavaScript\n      # Only run the build for Typescript/JavaScript language match\n      if: matrix.language == 'javascript-typescript'\n      run: npm run build\n\n    # Perform the CodeQL Analysis\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v3\n      with:\n        category: \"/language:${{matrix.language}}\"\n        upload-database: false\n        \n    # Debug CodeQL configuration\n    - name: Debug CodeQL configuration\n      if: always()\n      run: |\n        echo \"Executed CodeQL for language: ${{ matrix.language }}\"\n        echo \"Category used: /language:${{ matrix.language }}\"\n        echo \"Node version: ${{ matrix.node-version || 'N/A' }}\""
  },
  {
    "path": ".github/workflows/delete-merged-branches.yml",
    "content": "---\nname: 'Delete Merged Branches'\n\n# This workflow automatically deletes branches that are associated with\n# closed or merged pull requests. It runs weekly on Sundays at midnight UTC.\n#\n# Protected branches (will NOT be deleted):\n# - main\n# - master\n# - beta\n# - otel-sdk\n# - release* (case-insensitive: release-1.0, release/v2.0, etc.)\n# - Release* (case-insensitive: Release-1.0, Release/v2.0, etc.)\n# - legacy-* (e.g., legacy-v1, legacy-old)\n# - *-legacy (e.g., old-legacy, v1-legacy)\n#\n# The workflow will only delete branches that:\n# 1. Have associated pull requests\n# 2. All PRs for the branch are either merged or closed (no open PRs)\n# 3. Do not match any protected branch pattern\n\non:\n  schedule:\n    # Run every Sunday at midnight UTC\n    - cron: '0 0 * * 0'\n  workflow_dispatch:\n\n# Required permissions for this workflow:\n# - contents: write - Required to delete branch references via GitHub API\n# - pull-requests: read - Required to query PR status and metadata\n# See: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions\n# See: https://docs.github.com/en/rest/overview/permissions-required-for-github-apps\npermissions:\n  contents: write\n  pull-requests: read\n\njobs:\n  delete-merged-branches:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Delete merged branches\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          # Weekly branch cleanup script\n          #\n          # This script safely deletes branches associated with merged PRs\n          # while protecting important branches like main, master, release, etc.\n          #\n          # Logic:\n          # 1. Get all remote branches\n          # 2. Filter out protected branches using pattern matching\n          # 3. For each non-protected branch:\n          #    - Check if it has associated PRs\n          #    - Skip if no PRs found\n          #    - Skip if any PRs are still open\n          #    - Delete if all PRs are closed or merged\n          # Protected branch patterns (case-insensitive matching)\n          PROTECTED_PATTERNS=(\n            \"main\"\n            \"master\"\n            \"beta\"\n            \"otel-sdk\"\n            \"release*\"\n            \"Release*\"\n            \"legacy-*\"\n            \"*-legacy\"\n          )\n\n          echo \"Starting branch cleanup...\"\n\n          # Get all remote branches except HEAD\n          git fetch --all --prune\n          branches=$(git for-each-ref \\\n            --format='%(refname:short)' refs/remotes/origin | \\\n            grep -v 'origin/HEAD' | sed 's|origin/||')\n\n          for branch in $branches; do\n            echo \"Checking branch: $branch\"\n\n            # Check if branch matches any protected pattern\n            # Use [[ ]] pattern matching instead of case statement to properly\n            # support wildcard patterns stored in variables (e.g., \"release*\", \"*-legacy\")\n            # See: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html\n            protected=false\n            for pattern in \"${PROTECTED_PATTERNS[@]}\"; do\n              if [[ \"$branch\" =~ $pattern ]]; then\n                protected=true\n                echo \"  → Protected (matches: $pattern), skipping\"\n                break\n              fi\n            done\n\n            if [ \"$protected\" = true ]; then\n              continue\n            fi\n\n            # Check if branch is associated with a merged or closed PR\n            echo \"  → Checking PR status for branch: $branch\"\n\n            # Get PRs for this branch (both merged and closed)\n            # GitHub context variables used here:\n            # - github.repository: owner/repo-name (e.g., microsoft/ApplicationInsights-JS)\n            # - github.repository_owner: repository owner (e.g., microsoft)\n            # - GITHUB_TOKEN: automatically provided GitHub token for API access\n            # See: https://docs.github.com/en/actions/learn-github-actions/contexts#github-context\n            repo_api=\"https://api.github.com/repos/${{ github.repository }}\"\n            query=\"?head=${{ github.repository_owner }}:$branch&state=all\"\n            pr_response=$(curl -s \\\n              -H \"Authorization: token $GITHUB_TOKEN\" \\\n              -H \"Accept: application/vnd.github.v3+json\" \\\n              \"${repo_api}/pulls${query}\")\n\n            # Check if any PRs exist for this branch\n            pr_count=$(echo \"$pr_response\" | jq '. | length')\n\n            if [ \"$pr_count\" -eq 0 ]; then\n              echo \"  → No PR found for branch, skipping\"\n              continue\n            fi\n\n            # Check if all PRs for this branch are either merged or closed\n            open_prs=$(echo \"$pr_response\" | jq '[.[] | select(.state == \"open\")] | length')\n\n            if [ \"$open_prs\" -gt 0 ]; then\n              echo \"  → Branch has open PR(s), skipping\"\n              continue\n            fi\n\n            # All PRs are either merged or closed, safe to delete\n            merged_prs=$(echo \"$pr_response\" | jq '[.[] | select(.merged_at != null)] | length')\n            closed_prs=$(echo \"$pr_response\" | jq '[.[] | select(.state == \"closed\" and .merged_at == null)] | length')\n\n            echo \"  → Branch has $merged_prs merged and $closed_prs closed PRs\"\n            echo \"  → Deleting branch: $branch\"\n\n            # Delete the remote branch using GitHub REST API\n            # See: https://docs.github.com/en/rest/git/refs#delete-a-reference\n            delete_url=\"https://api.github.com/repos/${{ github.repository }}\"\n            delete_response=$(curl -s -X DELETE \\\n              -H \"Authorization: token $GITHUB_TOKEN\" \\\n              -H \"Accept: application/vnd.github.v3+json\" \\\n              \"${delete_url}/git/refs/heads/$branch\")\n\n            if echo \"$delete_response\" | jq -e '.message' > /dev/null 2>&1; then\n              error_msg=$(echo \"$delete_response\" | jq -r '.message')\n              echo \"  → Error deleting branch: $error_msg\"\n            else\n              echo \"  → Successfully deleted branch: $branch\"\n            fi\n          done\n\n          echo \"Branch cleanup completed!\"\n"
  },
  {
    "path": ".github/workflows/jekyll-gh-pages.yml",
    "content": "# Sample workflow for building and deploying a Jekyll site to GitHub Pages\nname: Deploy Jekyll with GitHub Pages dependencies preinstalled\n\non:\n  # Runs on pushes targeting the default branch\n  push:\n    branches: [\"main\"]\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\n# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.\n# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: false\n\njobs:\n  # Build job\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n      - name: Update rush shrinkwrap dependencies (for different node versions)\n        run: node common/scripts/install-run-rush.js update --full\n      - run: npm install rollup -g\n      - run: npm install grunt-cli\n      - run: npm install\n      - run: node common/scripts/install-run-rush.js check\n      - run: node common/scripts/install-run-rush.js update --full --recheck\n      - run: npm run build --verbose\n        timeout-minutes: 20\n      - name: doc generate\n        run:  npm run api-docs\n      - name: Inject Script\n        run:  node ./tools/github-page-script-injection/injectScript.js\n      - name: Setup Pages\n        uses: actions/configure-pages@v4\n      - name: Build with Jekyll\n        uses: actions/jekyll-build-pages@v1\n        with:\n          source: ./docs\n          destination: ./_site\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n\n  # Deployment job\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".github/workflows/lock.yml",
    "content": "name: 'Lock Threads'\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n\npermissions:\n  actions: write\n  issues: write\n  pull-requests: write\n\njobs:\n  action:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: dessant/lock-threads@v2\n        with:\n          github-token: ${{ github.token }}\n          issue-lock-comment: >\n            This issue has been automatically locked since there\n            has not been any recent activity after it was closed.\n            Please open a new issue for related bugs.\n          process-only: 'issues'"
  },
  {
    "path": ".github/workflows/stale-assigned.yml",
    "content": "name: 'Stale issue handler'\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 7 * * *'\n\npermissions:\n  actions: write\n  issues: write\n  pull-requests: write\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@v9\n        id: stale\n        with:\n          stale-issue-message: 'This Issue will be closed in 30 days. Please remove the \"Stale\" label or comment to avoid closure with no action.'\n          stale-pr-message: 'This PR will be closed in 30 days. Please remove the \"Stale\" label or comment to avoid closure with no action.'\n          operations-per-run: 200\n          days-before-stale: 300\n          days-before-close: 30\n          stale-issue-label: 'stale'\n          stale-pr-label: 'stale'\n          close-issue-label: 'closed'\n          close-pr-label: 'closed'\n          exempt-issue-labels: 'bug,enhancement,documentation,waiting,keep'\n          exempt-pr-labels: 'waiting,keep'\n          include-only-assigned: true"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: 'Stale issue handler'\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 7 * * *'\n\npermissions:\n  actions: write\n  issues: write\n  pull-requests: write\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@v9\n        id: stale\n        with:\n          stale-issue-message: 'This Issue will be closed in 30 days. Please remove the \"Stale\" label or comment to avoid closure with no action.'\n          stale-pr-message: 'This PR will be closed in 30 days. Please remove the \"Stale\" label or comment to avoid closure with no action.'\n          operations-per-run: 200\n          days-before-stale: 240\n          days-before-close: 30\n          stale-issue-label: 'stale'\n          stale-pr-label: 'stale'\n          close-issue-label: 'closed'\n          close-pr-label: 'closed'\n          exempt-issue-labels: 'bug,enhancement,documentation,waiting,keep'\n          exempt-pr-labels: 'waiting,keep'\n          exempt-all-milestones: true\n          exempt-all-assignees: true\n          \n  mark-abandoned:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@v9\n        id: mark-abandoned\n        with:\n          days-before-stale: 30\n          days-before-close: -1\n          days-before-issue-stale: -1\n          days-before-issue-close: -1\n          stale-pr-message: 'This PR has been inactive for 30 days and has been marked as abandoned. You can remove this label by commenting or pushing new changes. If it remains inactive with the abandoned label, it will eventually also be marked as stale and closed.'\n          stale-pr-label: 'abandoned'\n          exempt-pr-labels: 'keep,wontfix,stale'\n          operations-per-run: 100\n          remove-stale-when-updated: true\n          exempt-all-milestones: false\n          exempt-all-assignees: false\n\n  stale-wontfix:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@v9\n        id: stale-wontfix\n        with:\n          stale-issue-message: 'This Issue will be closed in 14 days. Please remove the \"Stale\" label or comment to avoid closure with no action.'\n          stale-pr-message: 'This PR will be closed in 14 days. Please remove the \"Stale\" label or comment to avoid closure with no action.'\n          operations-per-run: 100\n          days-before-stale: 14\n          days-before-close: 14\n          stale-issue-label: 'stale'\n          stale-pr-label: 'stale'\n          close-issue-label: 'closed'\n          close-pr-label: 'closed'\n          any-of-labels: 'wontfix,abandoned'\n          exempt-issue-labels: 'keep'\n          exempt-pr-labels: 'keep'\n          exempt-all-milestones: false\n          exempt-all-assignees: false\n"
  },
  {
    "path": ".gitignore",
    "content": "﻿## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.sln.docstates\n\n# Build results\n[Dd]ebug/\n[Rr]elease/\n[Bb]in/\n[Oo]bj/\n[Oo]bj//Core/Javascript/ai*.[tj]s*\n\n# Telemetry output\n*.onesipkg\n\n# Enable \"build/\" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets\n!packages/*/build/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\nreport.*.json\n\n*_i.c\n*_p.c\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.log\n*.scc\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Local tgz files\n*.tgz\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# Visual Studio Code\n.vscode/**\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n*.ncrunch*\n.*crunch*.local.xml\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.Publish.xml\n\n# NuGet binaries downloaded automatically\npackages/\n\n# Windows Azure Build Output\ncsx\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Others\nsql/\n*.Cache\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.[Pp]ublish.xml\n*.publishsettings\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file to a newer\n# Visual Studio version. Backup files are not needed, because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\nApp_Data/*.mdf\nApp_Data/*.ldf\n\n\n#LightSwitch generated files\nGeneratedArtifacts/\n_Pvt_Extensions/\nModelManifest.xml\n\n# =========================\n# Windows detritus\n# =========================\n\n# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Mac desktop service store files\n.DS_Store\n\n# Build log files\n*.err\n*.prf\n*.wrn\n\n# Visual studio 2015 user specific files\nlegacy/JavaScript/.vs\n\n# Temp directories\nbundle/\nnode_modules/\nout/\ncoreSDK/node_modules\nbuild/\ndist-es*/\nbrowser/\ntypes/\ndist/\ndest/\ndrop/\n.cdn/\n\n# Don't commit the sub resource integrity generated files\n**/*.integrity.json\n\n# Grunt\n.tscache\n**/Tests/Selenium/*tests.js\n**/Tests/Selenium/*tests.d.ts\n**/Tests/Selenium/*tests.js.map\n\n# Misc\nstatistics.html\nnpm\ntests_output\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\njspm_packages/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\n# next.js build output\n.next\n\n# Common toolchain intermediate files\ntemp\n\n# Rush files\ncommon/temp/**\npackage-deps.json\npackage-lock.json\nrush-logs/\n\n# test output\naicore.tests.js*\naicore.tests.d.ts\nai.tests.d.ts\n/.vs\n/index.html\n\n# Generated Constant File\n**/__DynamicConstants.ts\n\n# Generated Docs\ndocs/webSdk/applicationinsights*/**\ndocs/webSdk/1ds*/**"
  },
  {
    "path": ".npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!/package.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!/docs/API-reference.md\n!/bundle/ai.module.*\n!/dist/ai.js\n!/dist/ai.js.map\n!/dist/ai.0.js\n!/dist/ai.0.js.map"
  },
  {
    "path": ".travis/test_react_native.sh",
    "content": "cd extensions/applicationinsights-react-native\n\necho -en 'travis_fold:end:change\\\\r'\necho 'Checking for inconsistent dependency versions' && echo -en 'travis_fold:start:check\\\\r'\nnode common/scripts/install-run-rush.js check\n\necho -en 'travis_fold:end:check\\\\r'\necho 'Installing...' && echo -en 'travis_fold:start:install\\\\r'\nrm -rf common/temp/npm-local\nnode common/scripts/install-run-rush.js install\n\nnpm install\nnpm run build\nnpm run test\nnpm run lint\n"
  },
  {
    "path": ".travis/test_rush.sh",
    "content": "set -e\nset NO_UPDATE_NOTIFIER=1\n# echo 'Checking for missing change logs...' && echo -en 'travis_fold:start:change\\\\r'\n# git fetch origin master:refs/remotes/origin/master -a\n# node common/scripts/install-run-rush.js change -v\n\necho -en 'travis_fold:end:change\\\\r'\necho 'Checking for inconsistent dependency versions' && echo -en 'travis_fold:start:check\\\\r'\nnode common/scripts/install-run-rush.js check\n\necho -en 'travis_fold:end:check\\\\r'\necho 'Installing...' && echo -en 'travis_fold:start:install\\\\r'\nrm -rf common/temp/npm-local\nnode common/scripts/install-run-rush.js install\n\necho -en 'travis_fold:end:install\\\\r'\necho 'Building...' && echo -en 'travis_fold:start:build\\\\r'\nnode common/scripts/install-run-rush.js rebuild --verbose\n\necho -en 'travis_fold:end:build\\\\r'\necho 'Running test...' && echo -en 'travis_fold:start:tests\\\\r'\nnode common/scripts/install-run-rush.js test --verbose\n\necho -en 'travis_fold:end:tests\\\\r'\necho 'Running tslint...' && echo -en 'travis_fold:start:lint\\\\r'\nnode common/scripts/install-run-rush.js lint --verbose\necho -en 'travis_fold:end:lint\\\\r'\n"
  },
  {
    "path": "AISKU/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**\n"
  },
  {
    "path": "AISKU/API.md",
    "content": "### trackPageView\n\n```ts\napplicationInsights.trackPageView(pageView: IPageViewTelemetry, customProperties?: { [key: string]: any })\n```\n\nThe [`IPageViewTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html) interface is below:\n\nParameter | Type | Description\n---|---|---\n[`name?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#name) | string | **Optional**<br>Name of the pageview. Defaults to the document `title`.\n[`uri?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#uri) | string | **Optional**<br>A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n[`refUri?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#refUri) | string | **Optional**<br>The URL of the previous page that sent the user to the current page.\n[`pageType?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#pageType) | string | **Optional**<br>Page Type string. Describes how you classify this page, e.g. errorPage, formPage, etc.\n[`isLoggedIn?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#isLoggedIn) | boolean | **Optional**<br>Whether or not the user is logged in\n[`pageTags?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#pageTags) | dictionary | **Optional**<br>Property bag to contain an extension to domain properties - extension to Part B\n\n\n### startTrackPage\n\n```ts\nstartTrackPage(name?: string)\n```\n\nStarts the timer for tracking a page load time. Use this instead of `trackPageView` if you want to control when the page view timer starts and stops, but don't want to calculate the duration yourself. This method doesn't send any telemetry. Call `stopTrackPage` to log the end of the page view and send the event.\n\nParameter | Type | Description\n---|---|---\n`name?` | string | **Optional**<br>The name used to identify the page in the portal. Defaults to the document title.\n\n### stopTrackPage\n\n```ts\nstopTrackPage(name?: string, url?: string, customProperties?: { [name: string]: any; });\n```\n\nStops the timer that was started by calling `startTrackPage` and sends the pageview load time telemetry with the specified properties and measurements. The duration of the page view will be the time between calling `startTrackPage` and `stopTrackPage`.\n\nParameter | Type | Description\n---|---|---\n`name?` | string | **Optional**<br>The name used to identify the page in the portal. Defaults to the document title.\n`url?` |  string | **Optional**<br>A relative or absolute URL that identifies the page or similar item. Defaults to the window location.\n`customProperties?` | dictionary | **Optional**<br>Map of string to string: Additional data used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n\n### trackMetric\n\n```ts\ntrackMetric(metric: IMetricTelemetry, customProperties?: {[name: string]: any})\n```\n\nLog a positive numeric value that is not associated with a specific event. Typically used to send regular reports of performance indicators.\n\nTo send a single measurement, use just the first two parameters. If you take measurements very frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements and sending the resulting `average` and `sampleCount` at intervals.\n\n[`IMetricTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html) is described below\n\nParameter | Type | Description\n---|---|---\n[`name`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#name) | string | **Required**<br>A string that identifies the metric. In the portal, you can select metrics for display by name.\n[`average`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#average) | number | **Required**<br>Either a single measurement, or the average of several measurements. Should be >=0 to be correctly displayed.\n[`sampleCount?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#sampleCount) | number | **Optional**<br>Count of measurements represented by the average. Defaults to 1. Should be >=1.\n[`min?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#min) | number | **Optional**<br>The smallest measurement in the sample. Defaults to the average. Should be >= 0.\n[`max?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#max) | number | **Optional**<br>The largest measurement in the sample. Defaults to the average. Should be >= 0.\n[`stdDev?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#stdDev) | number | **Optional**<br>The standard deviation for the sample. Defaults to undefined which is reported as zero (0).\n\n```typescript\nappInsights.trackMetric({ name: \"my_custom_metric\", average: 1.5, sampleCount: 2, min: 1, max: 2, stdDev: 1.0 });\n```\n\n### trackException\n\n```ts\ntrackException(exception: IExceptionTelemtry, customProperties?: {[key: string]: any})\n```\n\nLog an exception you have caught. Exceptions caught by the browser are also automatically logged.\n\n[`IExceptionTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IExceptionTelemetry.html) is described below\n\nParameter | Type | Description\n---|---|---\n[`error`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IExceptionTelemetry.html#exception) | [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) | **Required**<br>Error object\n[`severityLevel?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IExceptionTelemetry.html#severityLevel) | [SeverityLevel (number)](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-common/enums/eSeverityLevel.html) | **Optional**<br>Severity of the message, ranging from verbose to critical\n\nBy default, uncaught browser exceptions are caught by the SDK and reported to the portal. To disable this behavior, insert the following line in the config section below your connection string:\n\n```ts\n{\n  connectionString: \"your connection string\",\n  disableExceptionTracking: true\n}\n```\n\n### trackTrace\n\n```ts\ntrackTrace(trace: ITraceTelemetry, customProperties?: {[key: string]: any})\n```\n\nLog a diagnostic event such as entering or leaving a method.\n\n\nThe [`ITraceTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ITraceTelemetry.html) interface is described below\n\nParameter | Type | Description\n---|---|---\n[`message`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ITraceTelemetry.html#message) | string | **Required**<br>Diagnostic data. Can be much longer than an event's name.\n[`severityLevel?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ITraceTelemetry.html#severityLevel) | [SeverityLevel (number)](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-common/enums/eSeverityLevel.html) | **Optional**<br>Severity of the message, ranging from verbose to critical\n\nIn the portal, you can search on message content and [display individual trackTrace events](https://azure.microsoft.com/documentation/articles/app-insights-diagnostic-search/).\n(Unlike `trackEvent`, you can't filter on the message content in the portal.)\n\n\n### trackDependencyData\n\n```ts\ntrackDependencyData(dependency: IDependencyTelemetry, customProperties?: {[key: string]: any}, systemProperties?: {[key: string]: any})\n```\n\nLog a dependency call (for instance: ajax)\n\nThe [`IDependencyTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html) interface is described below\n\nParameter | Type | Description\n---|---|---\n[`id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#id) | string | **Required**<br>Unique id, this is used by the backend to correlate server requests.\n[`absoluteUrl`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#absoluteUrl) | string | **Required**<br>Absolute url used to make the dependency request\n[`success`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#success) | boolean | **Required**<br>Whether or not the request was successful or not (e.g., `responseCode` in the range 200-299)\n[`resultCode`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#resultCode) | number | **Required**<br>Response code returned by the dependency request (e.g., `200` for a success)\n[`commandName?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#commandName) | string| **Optional**<br>Command used to make the dependency request\n[`duration?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#duration) | number | **Optional**<br>Elapsed time of request & reply\n[`method?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#method) | string | **Optional**<br>Represents request verb (GET, POST, etc.)\n\n### flush\n\n```ts\nflush(async?: boolean = true)\n```\n\nImmediately send all queued telemetry. By default, it is sent async.\n\n> *Note:* You don't have to use flush, as it is automatically called at an interval and when the user closes the window.\n\n<a name=\"setAuthenticatedUserContext\"></a>\n### setAuthenticatedUserContext\n\n```ts\nsetAuthenticatedUserContext(authenticatedUserId: string, accountId?: string, storeInCookie = false)\n```\n\nSet the authenticated user id and the account id. Use this when you have identified a specific signed-in user. Parameters must not contain spaces or ,;=|\n\nThe method will only set the `authenticatedUserId` and `accountId` for all events in the current page view. To set them for all events within the whole session, you should either call this method on every page view or set `storeInCookie = true`.\n\n Parameter | Type |Description\n---|---|--\n`authenticatedUserId` | string | **Required**<br>An id that uniquely identifies a user of your app. No spaces, comma, semicolon, equals or vertical bar.\n`accountId?` | string | **Optional**<br>An optional account id, if your app groups users into accounts. No spaces, comma, semicolon, equals or vertical bar.\n\nIn the portal, this will add to the count of authenticated users. Authenticated users provide a more reliable count of the number of real users than the count of anonymous users.\n\nThe authenticated user id will be available as part of the context of the telemetry sent to the portal, so that you can filter and search on it. It will also be saved as a cookie and sent to the server, where the server SDK (if installed) will attach it to server telemetry.\n\n### clearAuthenticatedUserContext\n\n```ts\nclearAuthenticatedUserContext ()\n```\n\nClears the authenticated user id and the account id from the user context, and clears the associated cookie.\n\n\n### addTelemetryInitializer\n\n```ts\npublic addTelemetryInitializer(telemetryInitializer: (item: ITelemetryItem) => boolean | void)\n```\n\nAdds a telemetry initializer to the collection. Telemetry initializers will be called one by one, in the order they were added,\nbefore the telemetry item is pushed for sending.\nIf one of the telemetry initializers returns false or throws an error, then the telemetry item will not be sent.\n\nSee [`ITelemetryItem`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryItem.html) for the full interface definition.\n\n```ts\ninterface ITelemetryItem {\n    /**\n     * Unique name of the telemetry item\n     */\n    name: string;\n\n    /**\n     * Timestamp when item was sent\n     */\n    timestamp?: Date;\n\n    /**\n     * Identifier of the resource that uniquely identifies which resource data is sent to\n     */\n    instrumentationKey?: string;\n\n    /**\n     * System properties with well defined extensions, documentation coming soon\n     */\n    ctx?: {[key: string]: any};\n\n    /**\n     * Part A custom extensions\n     */\n    tags?: Tags; // Tags[] is deprecated since 4.1.0\n\n    /**\n     * Telemetry type used for part B\n     */\n    baseType?: string;\n\n    /**\n     * Based on schema for part B\n     */\n    baseData?: { [key: string]: any };\n\n    /**\n     * Telemetry data used for Part C\n     */\n    data?: {\n        [key: string]: any;\n    },\n}\n```\n\n### Custom extension\n\nA custom plugin can be loaded by the SDK through config.extensions. All plugins must implement [`ITelemetryPlugin`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryPlugin.html) interface. These provide the capability of inspecting and updating data as it leaves the system, but also provides additional functionality to for one time initialization of extension state and pass in custom configuration through SKU configuration etc.\n\n```ts\ninterface ITelemetryPlugin {\n    /**\n    * Call back for telemetry processing before it is sent to next plugin for processing (needs to be invoked by caller)\n    */\n    processTelemetry: (env: ITelemetryItem) => void;\n\n    /**\n    * Extension name\n    */\n    identifier: string;\n\n    /**\n    * Set next extension for telemetry processing\n    */\n    setNextPlugin: (next: ITelemetryPlugin) => void;\n\n    /**\n    * Priority of the extension\n    *\n    * 1 - 100: customer plugins\n    * 100 - 199: reserved for internal plugins.\n    * > 200: channel plugins (that implement IChannelControls to send data to an endpoint)\n    */\n    priority: number;\n}\n```\n\n## [`ITelemetryContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryContext.html)\n\n### context.application\n\n```ts\napplication: IApplication\n```\n\nDetails of the app you're monitoring. See [`IApplication`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IApplication.html).\n\nProperty | Type | Description\n---|---|---\n[`application.ver`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IApplication.html#ver) | string | Application version\n[`application.build`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IApplication.html#build) | string | Application build\n\n### context.device\n\n```ts\ndevice: IDevice\n```\n\nThe device the app is running on. See [`IDevice`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html).\n\nProperty | Type | Description\n---|---|---\n[`device.id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#id) | string | Unique ID\n[`device.deviceClass`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#deviceClass) | string | Device class\n[`device.model`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#model) | string | Device model\n[`device.resolution`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#resolution) | string | Screen resolution\n[`device.ip`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#ip) | string | IP address\n\n### context.user\n\n```ts\nuser: IUserContext\n```\n\nData about the current user. Users are identified by cookie, so one person can look like\nmore than one user if they use different machines or browsers, or delete cookies. See [`IUserContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html).\n\nProperty | Type | Description\n---|---|---\n[`user.id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#id) | string | Unique, cookie-based user id, automatically assigned.\n[`user.authenticatedId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#authenticatedId) | string | Id set by your app using [`setAuthenticatedUserContext`](#setAuthenticatedUserContext) when the user signs in.\n[`user.accountId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#accountId) | string | Set by your app when the user signs in, if your app groups users into accounts.\n[`user.accountAcquisitionDate`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#accountAcquisitionDate) | string | Account acquisition date\n\n\n### context.session\n\n```ts\nsession: ISession\n```\n\nThe user session. A session represents a series of user actions. A session starts with a user action.\nIt ends at the last user activity when there is no more activity for sessionRenewalMs, or if it lasts longer than sessionExpirationMs. See [`ISession`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html).\n\nProperty | Type | Description\n---|---|---\n[`session.id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html#id) | string | Automatically assigned id\n[`session.acquisitionDate`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html#acquisitionDate) | number | The dateTime when this session was created.\n[`session.renewalDate`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html#renewalDate) | number | DateTime when telemetry was last sent with this session.\n\n\n### context.location\n\n```ts\nlocation: ILocation\n```\n\nData from which the geographical location of the user's device can be guessed. See [`ILocation`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ILocation.html).\n\nProperty | Type | Description\n---|---|---\n[`location.ip`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ILocation.html#ip) | string | IP address\n\n### context.telemetryTrace\n\n> **Deprecated:** Use [`appInsights.getTraceCtx()`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html#getTraceCtx) instead to get/set the current trace context. This returns an [`IDistributedTraceContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html) which supports distributed tracing and allows the core to manage the trace context.\n\n```ts\ntelemetryTrace: ITelemetryTrace\n```\n\nRepresents the distributed trace context. See [`ITelemetryTrace`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html).\n\nProperty | Type | Description\n---|---|---\n[`telemetryTrace.traceID`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#traceID) | string | Trace ID\n[`telemetryTrace.parentID`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#parentID) | string | Parent ID\n[`telemetryTrace.traceFlags`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#traceFlags) | number | W3C trace flags\n[`telemetryTrace.name`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#name) | string | Operation name\n\n### Distributed Trace Context (Recommended)\n\nUse [`getTraceCtx()`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html#getTraceCtx) to access the current [`IDistributedTraceContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html). This is the recommended replacement for the deprecated `telemetryTrace`.\n\n```ts\n// Get the current trace context - using the standard SKU (AISKU)\nlet traceCtx = appInsights.getTraceCtx();\n\n// Or when using the core directly\n// let traceCtx = appInsights.core.getTraceCtx();\n\n// Read trace values\nlet traceId = traceCtx.traceId;\nlet spanId = traceCtx.spanId;\nlet traceFlags = traceCtx.traceFlags;\nlet pageName = traceCtx.pageName;\n\n// Update trace values (updates current context only)\ntraceCtx.traceId = \"new-trace-id\";\ntraceCtx.spanId = \"new-span-id\";\ntraceCtx.traceFlags = 1;\ntraceCtx.pageName = \"my-page\";\n\n// Replace the entire trace context\nappInsights.core.setTraceCtx(newTraceCtx);\n```\n\nProperty | Type | Description\n---|---|---\n[`traceId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#traceId) | string | 32 lowercase hex character trace ID, shared across all spans in a trace\n[`spanId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#spanId) | string | 16 lowercase hex character span ID, unique identifier for this span\n[`traceFlags`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#traceFlags) | number | W3C trace flags (8-bit bitmap), bit 0x01 indicates sampling\n[`pageName`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#pageName) | string | Current page name\n[`traceState`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#traceState) | IW3cTraceState | Vendor-specific trace state for cross-system correlation\n[`parentCtx`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#parentCtx) | IDistributedTraceContext | Parent context (read-only)\n[`isRemote`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#isRemote) | boolean | Whether context was propagated from a remote parent\n"
  },
  {
    "path": "AISKU/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "AISKU/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "AISKU/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "AISKU/README.md",
    "content": "<properties\n\tpageTitle=\"Application Insights JavaScript SDK - AISKU\"\n\tdescription=\"Reference doc\"\n\tservices=\"application-insights\"\n    documentationCenter=\".net\"\n/>\n\n<tags\n\tms.service=\"application-insights\"\n\tms.workload=\"tbd\"\n\tms.tgt_pltfrm=\"ibiza\"\n\tms.devlang=\"na\"\n\tms.topic=\"article\"\n\tms.date=\"10/8/2019\"/>\n\n# Microsoft Application Insights JavaScript SDK - Web\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status/AppInsights%20-%20DevTools/1DS%20JavaScript%20SDK%20web%20SKU%20vNext?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web)\n\nApplication Insights SDK is a package that combines commonly used packages for Web scenarios.\nRefer to [our GitHub page](https://github.com/microsoft/applicationinsights-js) for more details on getting started.\n\n## V3.x Release Breaking changes\n\n- Removed ES3 / IE8 Support\n- Removed V1 API Backward Compatibility (Upgrading V1 -> V3)\n\nSee [Breaking Changes](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v3_BreakingChanges.html)\n\n## CDN Version Release Summary (with Size tracking)\n\n| Version | Full Size | Raw Minified | GZip Size\n|---------|-----------|--------------|-------------\n| [&lt;nightly3&gt;](https://github.com/microsoft/ApplicationInsights-JS/tree/main/AISKU)  | [![full size size](https://js.monitor.azure.com/nightly/ai.3-nightly3.js.svg)](https://js.monitor.azure.com/nightly/ai.3-nightly3.js.svg)| ![minified size size](https://js.monitor.azure.com/nightly/ai.3-nightly3.min.js.svg) | ![gzip size](https://js.monitor.azure.com/nightly/ai.3-nightly3.min.js.gzip.svg)\n| 3.4.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.4.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.4.1.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.4.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.4.1.min.js.gzip.svg)\n| 3.4.0-beta:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.4.0-beta.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.4.0-beta.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.4.0-beta.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.11.min.js.gzip.svg)\n| 3.3.11:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.11.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.11.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.11.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.11.min.js.gzip.svg)\n| 3.3.10:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.10.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.10.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.10.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.10.min.js.gzip.svg)\n| 3.3.9:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.9.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.9.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.9.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.9.min.js.gzip.svg)\n| 3.3.8:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.8.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.8.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.8.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.8.min.js.gzip.svg)\n| 3.3.7:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.7.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.7.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.7.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.7.min.js.gzip.svg)\n| 3.3.6:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.6.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.6.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.6.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.6.min.js.gzip.svg)\n| 3.3.5:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.5.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.5.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.5.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.5.min.js.gzip.svg)\n| 3.3.4:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.4.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.4.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.4.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.4.min.js.gzip.svg)\n| 3.3.3:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.3.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.3.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.3.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.3.min.js.gzip.svg)\n| 3.3.2:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.2.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.2.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.2.min.js.gzip.svg)\n| 3.3.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.1.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.1.min.js.gzip.svg)\n| 3.3.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.3.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.3.0.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.3.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.3.0.min.js.gzip.svg)\n| 3.2.2:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.2.2.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.2.2.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.2.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.2.2.min.js.gzip.svg)\n| 3.2.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.2.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.2.1.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.2.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.2.1.min.js.gzip.svg)\n| 3.2.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.2.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.2.0.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.2.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.2.0.min.js.gzip.svg)\n| 3.1.2:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.1.2.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.1.2.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.1.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.1.2.min.js.gzip.svg)\n| 3.1.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.1.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.1.1.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.1.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.1.1.min.js.gzip.svg)\n| 3.1.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.1.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.1.0.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.1.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.1.0.min.js.gzip.svg)\n| 3.0.9:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.0.9.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.0.9.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.0.9.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.0.8.min.js.gzip.svg)\n| 3.0.8:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.0.8.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.0.8.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.0.8.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.0.8.min.js.gzip.svg)\n| 3.0.7:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.0.7.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.0.7.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.0.7.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.0.7.min.js.gzip.svg)\n| 3.0.6:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.0.6.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.0.6.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.0.6.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.0.5.min.js.gzip.svg)\n| 3.0.5:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.0.5.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.0.5.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.0.5.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.0.5.min.js.gzip.svg)\n| 3.0.4:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.3.0.4.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.0.4.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.0.4.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.0.4.min.js.gzip.svg)\n| [<nightly>](https://github.com/microsoft/ApplicationInsights-JS/tree/master/AISKU)  | [![full size size](https://js.monitor.azure.com/nightly/ai.2-nightly.js.svg)](https://js.monitor.azure.com/nightly/ai.2-nightly.js.svg)| ![minified size size](https://js.monitor.azure.com/nightly/ai.2-nightly.min.js.svg) | ![gzip size](https://js.monitor.azure.com/nightly/ai.2-nightly.min.js.gzip.svg)\n| 2.8.18:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.18.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.18.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.18.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.18.min.js.gzip.svg)\n| 2.8.17:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.17.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.17.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.17.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.17.min.js.gzip.svg)\n| 2.8.16:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.16.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.16.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.16.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.16.min.js.gzip.svg)\n| 2.8.15:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.15.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.15.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.15.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.15.min.js.gzip.svg)\n| 2.8.14:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.14.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.14.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.14.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.14.min.js.gzip.svg)\n| 2.8.13:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.13.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.13.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.13.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.13.min.js.gzip.svg)\n| [2.8.12](https://github.com/microsoft/ApplicationInsights-JS/tree/master/AISKU):  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.12.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.12.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.12.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.12.min.js.gzip.svg)\n| 2.8.11:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.11.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.11.js.svg)| ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.11.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.11.min.js.gzip.svg)\n| 2.8.10: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.10.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.10.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.10.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.10.min.js.gzip.svg)\n| 2.8.9: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.9.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.9.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.9.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.9.min.js.gzip.svg)\n| 2.8.8: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.8.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.8.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.8.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.8.min.js.gzip.svg)\n| 2.8.7: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.7.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.7.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.7.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.7.min.js.gzip.svg)\n| 2.8.6: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.6.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.6.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.6.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.6.min.js.gzip.svg)\n| 2.8.5: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.5.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.5.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.5.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.5.min.js.gzip.svg)\n| 2.8.4: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.4.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.4.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.4.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.4.min.js.gzip.svg)\n| 2.8.3: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.3.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.3.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.3.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.3.min.js.gzip.svg)\n| 2.8.2: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.2.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.2.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.2.min.js.gzip.svg)\n| 2.8.1: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.1.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.1.min.js.gzip.svg)\n| 2.8.0: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.8.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.8.0.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.8.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.8.0.min.js.gzip.svg)\n| 2.7.4: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.7.4.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.7.4.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.7.4.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.7.4.min.js.gzip.svg)\n| 2.7.3: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.7.3.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.7.3.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.7.3.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.7.3.min.js.gzip.svg)\n| 2.7.2: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.7.2.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.7.2.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.7.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.7.2.min.js.gzip.svg)\n| 2.7.1: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.7.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.7.1.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.7.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.7.1.min.js.gzip.svg)\n| 2.7.0: | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.7.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.7.0.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.7.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.7.0.min.js.gzip.svg)\n| 2.6.5:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.6.5.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.6.5.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.6.5.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.6.5.min.js.gzip.svg)\n| 2.6.4:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.6.4.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.6.4.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.6.4.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.6.4.min.js.gzip.svg)\n| 2.6.3:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.6.3.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.6.3.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.6.3.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.6.3.min.js.gzip.svg)\n| 2.6.2:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.6.2.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.6.2.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.6.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.6.2.min.js.gzip.svg)\n| 2.6.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.6.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.6.1.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.6.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.6.1.min.js.gzip.svg)\n| 2.6.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.6.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.6.0.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.6.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.6.0.min.js.gzip.svg)\n| 2.5.11:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.11.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.11.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.11.min.js.gzip.svg)\n| 2.5.10:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.10.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.10.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.10.min.js.gzip.svg)\n| 2.5.9:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.9.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.9.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.9.min.js.gzip.svg)\n| 2.5.8:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.8.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.8.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.8.min.js.gzip.svg)\n| 2.5.7:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.7.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.7.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.7.min.js.gzip.svg)\n| 2.5.6:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.6.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.6.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.6.min.js.gzip.svg)\n| 2.5.5:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.5.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.5.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.5.min.js.gzip.svg)\n| 2.5.4:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.4.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.4.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.4.min.js.gzip.svg)\n| 2.5.3:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.3.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.3.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.3.min.js.gzip.svg)\n| 2.5.2:  | ![full size size](https://js.monitor.azure.com/scripts/b/ai.2.5.2.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.5.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.5.2.min.js.gzip.svg)\n| 2.5.0 - 2.5.1 | Not Deployed to CDN |  |\n| 2.4.4:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.4.4.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.4.4.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.4.4.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.4.4.min.js.gzip.svg)\n| 2.4.3:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.4.3.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.4.3.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.4.3.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.4.3.min.js.gzip.svg)\n| 2.4.2:  | Not Deployed to CDN\n| 2.4.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.4.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.4.1.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.4.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.4.1.min.js.gzip.svg)\n| 2.4.0:  | Not Deployed to CDN\n| 2.3.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.3.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.3.1.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.3.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.3.1.min.js.gzip.svg)\n| 2.3.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.3.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.3.0.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.3.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.3.0.min.js.gzip.svg)\n| 2.2.2:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.2.2.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.2.2.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.2.2.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.2.2.min.js.gzip.svg)\n| 2.2.1:  | Not Deployed to CDN\n| 2.2.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.2.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.2.0.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.2.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.2.0.min.js.gzip.svg)\n| 2.1.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.1.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.1.0.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.1.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.1.0.min.js.gzip.svg)\n| 2.0.1:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.0.1.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.0.1.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.0.1.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.0.1.min.js.gzip.svg)\n| 2.0.0:  | [![full size size](https://js.monitor.azure.com/scripts/b/ai.2.0.0.js.svg)](https://js.monitor.azure.com/scripts/b/ai.2.0.0.js.svg) | ![minified size size](https://js.monitor.azure.com/scripts/b/ai.2.0.0.min.js.svg) | ![gzip size](https://js.monitor.azure.com/scripts/b/ai.2.0.0.min.js.gzip.svg)\n\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "AISKU/Tests/Manual/HelloWorld.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Home Page - HelloWorld</title>\n    <!-- <link rel=\"stylesheet\" href=\"/lib/bootstrap/dist/css/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"/css/site.css\" /> -->\n</head>\n<body>\n    <header>\n        <nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\">\n            <div class=\"container\">\n                <h1 class=\"display-4\">Welcome</h1>\n            </div>\n        </nav>\n    </header>\n    <div class=\"container\">\n        <main role=\"main\" class=\"pb-3\">\n            \n<div class=\"text-center\">\n    From your repository<br/>\n    Perform a full build <code>rush rebuild</code><br/>\n    Enable the test http server <code>npm run serve</code><br />\n    <a href=\"http://localhost:9001/AISKU/Tests/Manual/HelloWorld.html\">Load this page from the local service</a>\n    <ul>\n        <li>Load in different browsers and ensure that the events are attempted to be sent</li>\n        <li>Use different browsers, Firefox, Chrome and Edge</li>\n        <li>Using Edge enable IE Mode</li>\n        <div>\n            Use IEChooser to debug and change the Emulation mode\n            <ul>\n                <li>Default IE 11</li>\n                <li>Default IE 10</li>\n                <li>Default IE 9</li>\n                <li>Default IE 8</li>\n                <li>Default IE 7 - This will fail due to no JSON implementation, the console should show a warning</li>\n            </ul>\n\n        </div>\n    </ul>\n    Note: The send attempt will fail, but you should see the outbound network attempt. If not debug the code and find out why!\n</div>\n<div>\n    <textarea id=\"log\" style=\"width:45%; min-height: 400px;\"></textarea>\n    <textarea id=\"cfg\" style=\"width:50%; min-height: 400px;\"></textarea>\n</div>\n\n<script>\n    //Promise = null;\n    var _message = {\n        log: \"\", \n        cfg: \"\"\n    };\n\n    function logMessage(message, dest, line) {\n        var dateTime = new Date().toLocaleString();\n        var target = dest || \"log\";\n        var elm = document.getElementById(target);\n        _message[target] = dateTime + \": \" + message + \"\\n\" + (line ? \"------------------------\\n\" : \"\") + (_message[target] ||\"\");\n        if (_message[target].length > 4096) {\n            _message[target] = _message[target].substring(0, 4090) + \"...\\n\";\n        }\n\n        elm.innerHTML = _message[target];\n    }\n</script>\n\n<!-- <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js\"></script> -->\n\n<!-- <script src=\"file://./ai.2.8.0.js\"></script> -->\n<script src=\"http://localhost:9001/AISKU/browser/es5/ai.3.js\"></script>\n<!-- <script src=\"https://js.monitor.azure.com/scripts/b/ai.2.7.4.js\" crossorigin=\"anonymous\"></script> -->\n<!-- <script src=\"https://js.monitor.azure.com/scripts/b/ai.2.8.0.js\" crossorigin=\"anonymous\"></script> -->\n<!-- <script>\n    // Snippet v5\n    var enableDebug = true;\n    var instrumentationKey = \"2bd72339-a683-4cce-8ed7-b1b0e8700000\";\n\n    !function(T,l,y){var S=T.location,k=\"script\",D=\"instrumentationKey\",C=\"ingestionendpoint\",I=\"disableExceptionTracking\",E=\"ai.device.\",b=\"toLowerCase\",w=\"crossOrigin\",N=\"POST\",e=\"appInsightsSDK\",t=y.name||\"appInsights\";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:\"5\",version:2,config:d};function v(e,t){var n={},a=\"Browser\";return n[E+\"id\"]=a[b](),n[E+\"type\"]=a,n[\"ai.operation.name\"]=S&&S.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=\"\"+e;return 1===t.length&&(t=\"0\"+t),t}return e.getUTCFullYear()+\"-\"+t(1+e.getUTCMonth())+\"-\"+t(e.getUTCDate())+\"T\"+t(e.getUTCHours())+\":\"+t(e.getUTCMinutes())+\":\"+t(e.getUTCSeconds())+\".\"+((e.getUTCMilliseconds()/1e3).toFixed(3)+\"\").slice(2,5)+\"Z\"}(),iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(\";\"),a=0;a<n.length;a++){var i=n[a].split(\"=\");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]=\"https://\"+(o?o+\".\":\"\")+\"dc.\"+(r||\"services.visualstudio.com\")}return e}(),c=s[D]||d[D]||\"\",u=s[C],p=u?u+\"/v2/track\":d.endpointUrl,(l=[]).push((n=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=t,i=p,(o=(r=v(c,\"Exception\")).data).baseType=\"ExceptionData\",o.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:n.replace(/\\./g,\"-\"),hasFullStack:!1,stack:n+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(S&&S.pathname||\"_unknown_\")+\"\\nEndpoint: \"+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,\"Message\"),r=i.data;r.baseType=\"MessageData\";var o=r.baseData;return o.message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+n+\")\").replace(/\\\"/g,\"\")+'\"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:\"cors\"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader(\"Content-type\",\"application/json\"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&\"\"!==e||\"undefined\"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){\"loaded\"!==n.readyState&&\"complete\"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName(\"head\")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n=\"track\",r=\"TrackPage\",o=\"TrackEvent\";t([n+\"Event\",n+\"PageView\",n+\"Exception\",n+\"Trace\",n+\"DependencyData\",n+\"Metric\",n+\"PageViewPerformance\",\"start\"+r,\"stop\"+r,\"start\"+o,\"stop\"+o,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c=\"onerror\";t([\"_\"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m[\"_\"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{\n    src: \"http://localhost:9001/AISKU/browser/ai.2x.js\", // The SDK URL Source\n    // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n    // crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument - the sdk instance (DO NOT ADD anything to the sdk.queue - As they won't get called)\n    cfg: { // Application Insights Configuration\n        connectionString: \"InstrumentationKey=\" + instrumentationKey + \";IngestionEndpoint=http://localhost:9001\",\n        //extensions: [reactPlugin],\n        enableDebug: true,\n        loggingLevelConsole: enableDebug ? 2 : 0,\n        loggingLevelTelemetry: enableDebug ? 2 : 1,\n        autoTrackPageVisitTime: true,\n        enableAutoRouteTracking: true,\n        enableDebugExceptions: enableDebug,\n        enableUnhandledPromiseRejectionTracking: true,\n        enableCorsCorrelation: false,\n        enableRequestHeaderTracking: true,\n        enableResponseHeaderTracking: true\n    }});\n</script> -->\n<script>\n    // Snippet v5\n    var enableDebug = true;\n    var instrumentationKey = \"2bd72339-a683-4cce-8ed7-b1b0e8700000\";\n\n    !(function (cfg){function e(){cfg.onInit&&cfg.onInit(a)}var v,y,T,t,n,a,k=window,S=document,D=k.location,C=\"script\",x=\"ingestionendpoint\",w=\"disableExceptionTracking\",I=\"ai.device.\";\"instrumentationKey\"[v=\"toLowerCase\"](),y=\"crossOrigin\",T=\"POST\",t=\"appInsightsSDK\",n=cfg.name||\"appInsights\",(cfg.name||k[t])&&(k[t]=n),a=k[n]||function(l){var u=!1,d=!1,g={initialize:!0,queue:[],sv:\"7\",version:2,config:l};function f(e,t){var n={},a=\"Browser\";function i(e){e=\"\"+e;return 1===e.length?\"0\"+e:e}return n[I+\"id\"]=a[v](),n[I+\"type\"]=a,n[\"ai.operation.name\"]=D&&D.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(g.sv||g.version),{time:(a=new Date).getUTCFullYear()+\"-\"+i(1+a.getUTCMonth())+\"-\"+i(a.getUTCDate())+\"T\"+i(a.getUTCHours())+\":\"+i(a.getUTCMinutes())+\":\"+i(a.getUTCSeconds())+\".\"+(a.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+\"Z\",iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}},ver:4,seq:\"1\",aiDataContract:undefined}}var n,a,e,i,m=l.url||cfg.src;m&&((o=navigator)&&(~(o=(o.userAgent||\"\").toLowerCase()).indexOf(\"msie\")||~o.indexOf(\"trident/\"))&&~m.indexOf(\"ai.3\")&&(m=m.replace(/(\\/)(ai\\.3\\.)([^\\d]*)$/,function(e,t,n){return t+\"ai.2\"+n})),n=function(e){var t,n,a,i,o,r,s,c,p;u=!0,g.queue=[],d||(d=!0,i=m,s=(c=function(){var e,t={},n=l.connectionString;if(n)for(var a=n.split(\";\"),i=0;i<a.length;i++){var o=a[i].split(\"=\");2===o.length&&(t[o[0][v]()]=o[1])}return t[x]||(e=(n=t.endpointsuffix)?t.location:null,t[x]=\"https://\"+(e?e+\".\":\"\")+\"dc.\"+(n||\"services.visualstudio.com\")),t}()).instrumentationkey||l.instrumentationKey||\"\",c=(c=c[x])?c+\"/v2/track\":l.endpointUrl,(p=[]).push((t=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",n=i,o=c,(r=(a=f(s,\"Exception\")).data).baseType=\"ExceptionData\",r.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:t.replace(/\\./g,\"-\"),hasFullStack:!1,stack:t+\"\\nSnippet failed to load [\"+n+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(D&&D.pathname||\"_unknown_\")+\"\\nEndpoint: \"+o,parsedStack:[]}],a)),p.push((r=i,t=c,(o=(n=f(s,\"Message\")).data).baseType=\"MessageData\",(a=o.baseData).message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+r+\")\").replace(/\\\"/g,\"\")+'\"',a.properties={endpoint:t},n)),i=p,s=c,JSON&&((o=k.fetch)&&!cfg.useXhr?o(s,{method:T,body:JSON.stringify(i),mode:\"cors\"}):XMLHttpRequest&&((r=new XMLHttpRequest).open(T,s),r.setRequestHeader(\"Content-type\",\"application/json\"),r.send(JSON.stringify(i)))))},a=function(e,t){d||setTimeout(function(){!t&&g.core||n()},500)},(i=S.createElement(C)).src=m,!(o=cfg[y])&&\"\"!==o||\"undefined\"==i[y]||(i[y]=o),i.onload=a,i.onerror=n,i.onreadystatechange=function(e,t){\"loaded\"!==i.readyState&&\"complete\"!==i.readyState||a(0,t)},e=i,cfg.ld&&cfg.ld<0?S.getElementsByTagName(\"head\")[0].appendChild(e):setTimeout(function(){S.getElementsByTagName(C)[0].parentNode.appendChild(e)},cfg.ld||0));try{g.cookie=S.cookie}catch(h){}function t(e){for(;e.length;)!function(t){g[t]=function(){var e=arguments;u||g.queue.push(function(){g[t].apply(g,e)})}}(e.pop())}var r,s,o=\"track\",c=\"TrackPage\",p=\"TrackEvent\",o=(t([o+\"Event\",o+\"PageView\",o+\"Exception\",o+\"Trace\",o+\"DependencyData\",o+\"Metric\",o+\"PageViewPerformance\",\"start\"+c,\"stop\"+c,\"start\"+p,\"stop\"+p,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),g.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(l.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==l[w]&&!0!==o[w]&&(t([\"_\"+(r=\"onerror\")]),s=k[r],k[r]=function(e,t,n,a,i){var o=s&&s(e,t,n,a,i);return!0!==o&&g[\"_\"+r]({message:e,url:t,lineNumber:n,columnNumber:a,error:i,evt:k.event}),o},l.autoExceptionInstrumented=!0),g}(cfg.cfg),(k[n]=a).queue&&0===a.queue.length?(a.queue.push(e),a.trackPageView({})):e();})({\n        src: \"http://localhost:9001/AISKU/browser/ai.2x.js\", // The SDK URL Source\n        // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n        // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n        // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n        // crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n        // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n        cfg: { // Application Insights Configuration\n            connectionString: \"InstrumentationKey=\" + instrumentationKey + \";IngestionEndpoint=http://localhost:9001\",\n            //extensions: [reactPlugin],\n            enableDebug: true,\n            loggingLevelConsole: enableDebug ? 2 : 0,\n            loggingLevelTelemetry: enableDebug ? 2 : 1,\n            autoTrackPageVisitTime: true,\n            enableAutoRouteTracking: true,\n            enableDebugExceptions: enableDebug,\n            enableUnhandledPromiseRejectionTracking: true,\n            enableCorsCorrelation: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true\n        }\n    });\n</script>\n\n<script>\n\n    //var sdkInstance=\"appInsightsSDK\";window[sdkInstance]=\"appInsights\";var aiName=window[sdkInstance],aisdk=window[aiName]||function(e){function n(e){t[e]=function(){var n=arguments;t.queue.push(function(){t[e].apply(t,n)})}}var t={config:e};t.initialize=!0;var i=document,a=window;setTimeout(function(){var n=i.createElement(\"script\");n.src=e.url||\"https://az416426.vo.msecnd.net/scripts/b/ai.2.min.js\",i.getElementsByTagName(\"script\")[0].parentNode.appendChild(n)});try{t.cookie=i.cookie}catch(e){}t.queue=[],t.version=2;for(var r=[\"Event\",\"PageView\",\"Exception\",\"Trace\",\"DependencyData\",\"Metric\",\"PageViewPerformance\"];r.length;)n(\"track\"+r.pop());n(\"startTrackPage\"),n(\"stopTrackPage\");var s=\"Track\"+r[0];if(n(\"start\"+s),n(\"stop\"+s),n(\"addTelemetryInitializer\"),n(\"setAuthenticatedUserContext\"),n(\"clearAuthenticatedUserContext\"),n(\"flush\"),t.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},!(!0===e.disableExceptionTracking||e.extensionConfig&&e.extensionConfig.ApplicationInsightsAnalytics&&!0===e.extensionConfig.ApplicationInsightsAnalytics.disableExceptionTracking)){n(\"_\"+(r=\"onerror\"));var o=a[r];a[r]=function(e,n,i,a,s){var c=o&&o(e,n,i,a,s);return!0!==c&&t[\"_\"+r]({message:e,url:n,lineNumber:i,columnNumber:a,error:s}),c},e.autoExceptionInstrumented=!0}return t}(\n    //    {\n    //        instrumentationKey: \"2bd72339-a683-4cce-8ed7-b1b0e8767295\"\n    //    }\n    //); window[aiName] = aisdk, aisdk.queue && 0 === aisdk.queue.length && aisdk.trackPageView({});\n\n\n    // var sdkInstance=\"appInsightsSDK\";window[sdkInstance]=\"appInsights\";var aiName=window[sdkInstance],aisdk=window[aiName]||function(e){function n(e){t[e]=function(){var n=arguments;t.queue.push(function(){t[e].apply(t,n)})}}var t={config:e};t.initialize=!0;var i=document,a=window;setTimeout(function(){var n=i.createElement(\"script\");n.src=e.url||\"https://az416426.vo.msecnd.net/scripts/b/ai.2.8.0.js\",i.getElementsByTagName(\"script\")[0].parentNode.appendChild(n)});try{t.cookie=i.cookie}catch(e){}t.queue=[],t.version=2;for(var r=[\"Event\",\"PageView\",\"Exception\",\"Trace\",\"DependencyData\",\"Metric\",\"PageViewPerformance\"];r.length;)n(\"track\"+r.pop());n(\"startTrackPage\"),n(\"stopTrackPage\");var s=\"Track\"+r[0];if(n(\"start\"+s),n(\"stop\"+s),n(\"addTelemetryInitializer\"),n(\"setAuthenticatedUserContext\"),n(\"clearAuthenticatedUserContext\"),n(\"flush\"),t.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},!(!0===e.disableExceptionTracking||e.extensionConfig&&e.extensionConfig.ApplicationInsightsAnalytics&&!0===e.extensionConfig.ApplicationInsightsAnalytics.disableExceptionTracking)){n(\"_\"+(r=\"onerror\"));var o=a[r];a[r]=function(e,n,i,a,s){var c=o&&o(e,n,i,a,s);return!0!==c&&t[\"_\"+r]({message:e,url:n,lineNumber:i,columnNumber:a,error:s}),c},e.autoExceptionInstrumented=!0}return t}(\n    //     {\n    //         url: \"./ai.2.8.0.js\",\n    //         instrumentationKey: \"2bd72339-a683-4cce-8ed7-b1b0e8767295\",\n    //         enableCorsCorrelation: true,\n    //         enableApplicationInsightsTrace: true\n    //     }\n    // ); window[aiName] = aisdk;\n\n    // if (aisdk.queue && aisdk.queue.length === 0) {\n    //     setTimeout(function() {\n    //         aisdk.properties.context.telemetryTrace.traceID = \"<server operation id>\"\n    //         aisdk.properties.context.telemetryTrace.parentID = \"<server request id>\"\n    //         aisdk.properties.context.telemetryTrace.name = \"<server operation name>\"\n    //         aisdk.trackPageView();\n    //     }, 100);\n    // }\n\n    var enableDebug = true;\n    var instrumentationKey = \"2bd72339-a683-4cce-8ed7-b1b0e8700000\";\n    var appInsights = new Microsoft.ApplicationInsights.ApplicationInsights({\n        config: {\n            instrumentationKey: instrumentationKey,\n            endpointUrl: \"http://localhost:9001/v2/track\",\n            //extensions: [reactPlugin],\n            enableDebug: false,\n            loggingLevelConsole: enableDebug ? 2 : 0,\n            loggingLevelTelemetry: enableDebug ? 2 : 1,\n            autoTrackPageVisitTime: true,\n            enableAutoRouteTracking: true,\n            enableDebugExceptions: enableDebug,\n            enableUnhandledPromiseRejectionTracking: true,\n            enableCorsCorrelation: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            hello: \"World\"\n        }\n    });\n\n    appInsights.onCfgChange(function (details) {\n        logMessage(\"onCfgChange 1 - called\", null, true);\n\n        logMessage(\"endpointUrl: \" + details.cfg.endpointUrl);\n    });\n\n    appInsights.onCfgChange(function (details) {\n        logMessage(\"onCfgChange 2 - called\", null, true);\n\n        logMessage(\"instrumentationKey: \" + details.cfg.instrumentationKey);\n    });\n\n    appInsights.onCfgChange(function (details) {\n        logMessage(JSON.stringify(details.cfg, stringifyReplacer, 4), \"cfg\");\n        logMessage(\"onCfgChange 3 - called\", \"cfg\");\n    });\n\n    appInsights.onCfgChange(function (details) {\n        logMessage(\"onCfgChange 4 - called\", null, true);\n        if (details.cfg.enableDebug) {\n            logMessage(\"Debug Enable - \" + details.cfg.loggingLevelConsole);\n        } else {\n            logMessage(\"Debug Not enabled!\");\n        }\n    });\n\n    \n    appInsights.loadAppInsights();\n    appInsights.trackPageView();    \n\n\n    function stringifyReplacer(name, value) {\n        if (name === \"extensions\" || name === \"channels\") {\n            return \"[... (\" + (value ? value.length : 0) + \") ...]\";\n        }\n\n        return value;\n    }\n\n    //$.ajax({\n    //    url: \"https://www.mocky.io/v2/5185415ba171ea3a00704eed\",\n    //    type: 'GET',\n    //    dataType: 'json', // added data type\n    //    success: function(res) {\n    //        console.log(res.hello);\n    //        alert(res.hello);\n    //    }\n    //});\n\n</script>\n        </main>\n    </div>\n\n    <footer class=\"border-top footer text-muted\">\n        <div class=\"container\">\n            &copy; 2019 - HelloWorld\n        </div>\n    </footer>\n    \n</body>\n</html>"
  },
  {
    "path": "AISKU/Tests/Manual/README.md",
    "content": "# Span API End-to-End (E2E) Tests\n\nThis directory contains end-to-end tests for the new Span APIs that send real telemetry to Azure Application Insights (Breeze endpoint) for manual validation in the Azure Portal.\n\n## 📁 Files\n\n- **`SpanE2E.Tests.ts`** - Automated E2E test suite that can be configured to send real telemetry\n- **`span-e2e-manual-test.html`** - Interactive HTML page for manual testing with visual feedback\n\n## 🚀 Quick Start - Manual HTML Testing\n\nThe easiest way to test is using the interactive HTML page:\n\n1. **Get your Application Insights credentials**:\n   - Go to [Azure Portal](https://portal.azure.com)\n   - Navigate to your Application Insights resource (or create a new one)\n   - Copy the **Instrumentation Key** or **Connection String** from the Overview page\n\n2. **Open the test page**:\n   ```bash\n   # Option 1: Open directly in browser\n   open AISKU/Tests/Manual/span-e2e-manual-test.html\n   \n   # Option 2: Serve via local web server\n   cd AISKU/Tests/Manual\n   python -m http.server 8080\n   # Then open http://localhost:8080/span-e2e-manual-test.html\n   ```\n\n3. **Run tests**:\n   - Paste your Instrumentation Key or Connection String\n   - Click \"Initialize SDK\"\n   - Run individual tests or click \"Run All Tests\"\n   - Watch the output log for confirmation\n\n4. **View results in Azure Portal**:\n   - Wait 1-2 minutes for telemetry to arrive\n   - Go to your Application Insights resource\n   - Navigate to **Performance** → **Dependencies** or **Requests**\n   - Use **Search** to find specific test scenarios\n   - Click **\"View in End-to-End Transaction\"** to see distributed traces\n\n## 🧪 Automated Test Suite\n\n### Configuration\n\nTo run the automated test suite with real telemetry:\n\n1. Open [`SpanE2E.Tests.ts`](../Unit/src/SpanE2E.Tests.ts)\n\n2. Update the configuration:\n   ```typescript\n   // Set to true to send real telemetry\n   private static readonly MANUAL_E2E_TEST = true;\n   \n   // Replace with your instrumentation key\n   private static readonly _instrumentationKey = \"YOUR-IKEY-HERE\";\n   ```\n\n3. Run the tests:\n   ```bash\n   # From repository root\n   rush build\n   rush test\n   ```\n\n### Test Scenarios Included\n\nThe test suite covers:\n\n#### Basic Span Tests\n- ✅ CLIENT span → RemoteDependency\n- ✅ SERVER span → Request  \n- ✅ Failed span → success=false\n\n#### Distributed Trace Tests\n- ✅ Parent-child relationships\n- ✅ 3-level nested hierarchy\n- ✅ Context propagation\n\n#### HTTP Dependency Tests\n- ✅ Various HTTP methods (GET, POST, PUT, DELETE)\n- ✅ Multiple status codes (2xx, 4xx, 5xx)\n- ✅ Full HTTP details (headers, body size, response time)\n\n#### Database Dependency Tests\n- ✅ MySQL, PostgreSQL, MongoDB, Redis, SQL Server\n- ✅ SQL statements and operations\n- ✅ Slow query scenarios\n\n#### Complex Scenarios\n- ✅ E-commerce checkout flow (7 dependencies)\n- ✅ Mixed success and failure operations\n- ✅ Rich custom properties for filtering\n\n## 🔍 What to Look For in the Portal\n\n### Performance Blade\n\n**Dependencies Tab**:\n- Look for CLIENT, PRODUCER, and INTERNAL spans\n- Verify dependency types (Http, mysql, postgresql, redis, etc.)\n- Check duration, target, and result codes\n- Examine custom properties in the details pane\n\n**Requests Tab**:\n- Look for SERVER and CONSUMER spans\n- Verify URLs, methods, and status codes\n- Check success/failure status\n- View response codes and durations\n\n### Search Feature\n\nFilter by custom properties to find specific test runs:\n```\ncustomDimensions.test.scenario == \"ecommerce\"\ncustomDimensions.test.timestamp >= datetime(2025-12-01)\ncustomDimensions.business.tenant == \"manual-test-corp\"\n```\n\n### End-to-End Transaction View\n\n1. Click any request or dependency\n2. Click **\"View in End-to-End Transaction\"**\n3. See the complete distributed trace:\n   - Timeline showing span durations\n   - Parent-child relationships\n   - All related dependencies\n   - Custom properties at each level\n\n### Transaction Timeline\n\nLook for:\n- ✅ Correct parent-child relationships (indentation)\n- ✅ Proper span nesting (visual hierarchy)\n- ✅ Accurate duration calculations\n- ✅ Operation IDs matching across spans\n- ✅ Custom dimensions preserved throughout\n\n## 📊 Expected Results\n\n### Test: Basic CLIENT Span\n- **Portal Location**: Performance → Dependencies\n- **Dependency Type**: \"Dependency\" or \"Http\"\n- **Custom Properties**: test.scenario, test.timestamp\n\n### Test: Parent-Child Trace\n- **Portal Location**: End-to-End Transaction view\n- **Expected**: 1 Request + 2 Dependencies\n- **Relationship**: Both children reference same parent operation.id\n\n### Test: E-commerce Checkout\n- **Portal Location**: End-to-End Transaction view\n- **Expected**: 1 Request + 7 Dependencies\n- **Types**: Http (inventory, payment, email), Database (create order), Redis (cache)\n- **Duration**: Parent spans entire operation\n\n### Test: Rich Custom Properties\n- **Portal Location**: Search → Custom dimensions filter\n- **Expected Properties**: \n  - business.tenant\n  - user.subscription\n  - feature.* flags\n  - performance.* metrics\n\n## 🐛 Troubleshooting\n\n### Telemetry not appearing in portal\n\n1. **Wait longer**: Initial ingestion can take 1-3 minutes\n2. **Check time filter**: Ensure portal is showing last 30 minutes\n3. **Verify iKey**: Confirm instrumentation key is correct\n4. **Check browser console**: Look for SDK errors\n5. **Flush telemetry**: Call `appInsights.flush()` in tests\n\n### SDK initialization fails\n\n1. **Valid credentials**: Verify instrumentation key format\n2. **CORS issues**: Ensure application is running on http/https (not file://)\n3. **Browser compatibility**: Use modern browser (Chrome, Edge, Firefox)\n\n### Missing custom properties\n\n1. **Property name limits**: Check for truncation (8192 char limit)\n2. **Reserved names**: Some property names are filtered (http.*, db.*, microsoft.*)\n3. **Type preservation**: Ensure values are correct types (string, number, boolean)\n\n## 📝 Adding New Test Scenarios\n\nTo add a new E2E test scenario:\n\n1. **In SpanE2E.Tests.ts**:\n   ```typescript\n   this.testCase({\n       name: \"E2E: Your new scenario\",\n       test: () => {\n           const span = this._ai.startSpan(\"E2E-YourScenario\", {\n               kind: eOTelSpanKind.CLIENT,\n               attributes: {\n                   \"test.scenario\": \"your-scenario\",\n                   \"custom.property\": \"value\"\n               }\n           });\n           \n           if (span) {\n               span.setStatus({ code: eOTelSpanStatusCode.OK });\n               span.end();\n           }\n           \n           this._ai.flush();\n           Assert.ok(span, \"Span created\");\n       }\n   });\n   ```\n\n2. **In span-e2e-manual-test.html**:\n   ```javascript\n   function testYourScenario() {\n       if (!appInsights) return;\n       \n       const span = appInsights.startSpan('E2E-Manual-YourScenario', {\n           kind: 1, // CLIENT\n           attributes: {\n               'test.scenario': 'your-scenario',\n               'custom.property': 'value'\n           }\n       });\n       \n       if (span) {\n           span.setStatus({ code: 1 });\n           span.end();\n           log('✅ Your scenario sent', 'success');\n       }\n       appInsights.flush();\n   }\n   ```\n\n## 🎯 Best Practices\n\n1. **Use descriptive names**: Prefix test spans with \"E2E-\" or \"Manual-\"\n2. **Include timestamps**: Add test.timestamp for filtering\n3. **Add scenario tags**: Use test.scenario for grouping\n4. **Flush after tests**: Always call `flush()` to send immediately\n5. **Wait before checking**: Give telemetry 1-2 minutes to arrive\n6. **Use unique identifiers**: Help distinguish between test runs\n7. **Clean up regularly**: Archive or delete old test data\n\n## 🔗 Resources\n\n- [Application Insights Overview](https://docs.microsoft.com/azure/azure-monitor/app/app-insights-overview)\n- [OpenTelemetry Specification](https://opentelemetry.io/docs/specs/otel/trace/api/)\n- [Azure Portal](https://portal.azure.com)\n- [Application Insights SDK Documentation](../../../README.md)\n\n## 🤝 Contributing\n\nWhen adding new E2E tests:\n1. Follow existing naming conventions (E2E-* prefix)\n2. Include relevant custom properties\n3. Document expected portal behavior\n4. Update this README with new scenarios\n5. Test manually before committing\n"
  },
  {
    "path": "AISKU/Tests/Manual/ai1.test.js",
    "content": "\"use strict\";var AI,Microsoft,__extends=this&&this.__extends||function(){var i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(e,t){function n(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}}();function _endsWith(e,t){var n=e.length,i=n-t.length;return e.substring(0<=i?i:0,n)===t}!function(e){e.ApplicationInsights||(e.ApplicationInsights={})}(Microsoft||(Microsoft={})),function(e){var t;t=function n(){},(e.Telemetry||(e.Telemetry={})).Base=t}(Microsoft||(Microsoft={})),function(e){var t;t=function n(){this.ver=1,this.sampleRate=100,this.tags={}},(e.Telemetry||(e.Telemetry={})).Envelope=t}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(t.Context={})}(Microsoft||(Microsoft={})),function(e){e.ApplicationInsights||(e.ApplicationInsights={})}(Microsoft||(Microsoft={})),function(e){e.ApplicationInsights||(e.ApplicationInsights={})}(Microsoft||(Microsoft={})),function(e){e.ApplicationInsights||(e.ApplicationInsights={})}(Microsoft||(Microsoft={})),function(e){var t;(t=e.SeverityLevel||(e.SeverityLevel={}))[t.Verbose=0]=\"Verbose\",t[t.Information=1]=\"Information\",t[t.Warning=2]=\"Warning\",t[t.Error=3]=\"Error\",t[t.Critical=4]=\"Critical\"}(AI||(AI={})),function(e){e.ApplicationInsights||(e.ApplicationInsights={})}(Microsoft||(Microsoft={})),function(e){!function(s){var l,e,c,t;(e=l=s.LoggingSeverity||(s.LoggingSeverity={}))[e.CRITICAL=0]=\"CRITICAL\",e[e.WARNING=1]=\"WARNING\",(t=c=s._InternalMessageId||(s._InternalMessageId={}))[t.BrowserDoesNotSupportLocalStorage=0]=\"BrowserDoesNotSupportLocalStorage\",t[t.BrowserCannotReadLocalStorage=1]=\"BrowserCannotReadLocalStorage\",t[t.BrowserCannotReadSessionStorage=2]=\"BrowserCannotReadSessionStorage\",t[t.BrowserCannotWriteLocalStorage=3]=\"BrowserCannotWriteLocalStorage\",t[t.BrowserCannotWriteSessionStorage=4]=\"BrowserCannotWriteSessionStorage\",t[t.BrowserFailedRemovalFromLocalStorage=5]=\"BrowserFailedRemovalFromLocalStorage\",t[t.BrowserFailedRemovalFromSessionStorage=6]=\"BrowserFailedRemovalFromSessionStorage\",t[t.CannotSendEmptyTelemetry=7]=\"CannotSendEmptyTelemetry\",t[t.ClientPerformanceMathError=8]=\"ClientPerformanceMathError\",t[t.ErrorParsingAISessionCookie=9]=\"ErrorParsingAISessionCookie\",t[t.ErrorPVCalc=10]=\"ErrorPVCalc\",t[t.ExceptionWhileLoggingError=11]=\"ExceptionWhileLoggingError\",t[t.FailedAddingTelemetryToBuffer=12]=\"FailedAddingTelemetryToBuffer\",t[t.FailedMonitorAjaxAbort=13]=\"FailedMonitorAjaxAbort\",t[t.FailedMonitorAjaxDur=14]=\"FailedMonitorAjaxDur\",t[t.FailedMonitorAjaxOpen=15]=\"FailedMonitorAjaxOpen\",t[t.FailedMonitorAjaxRSC=16]=\"FailedMonitorAjaxRSC\",t[t.FailedMonitorAjaxSend=17]=\"FailedMonitorAjaxSend\",t[t.FailedMonitorAjaxGetCorrelationHeader=18]=\"FailedMonitorAjaxGetCorrelationHeader\",t[t.FailedToAddHandlerForOnBeforeUnload=19]=\"FailedToAddHandlerForOnBeforeUnload\",t[t.FailedToSendQueuedTelemetry=20]=\"FailedToSendQueuedTelemetry\",t[t.FailedToReportDataLoss=21]=\"FailedToReportDataLoss\",t[t.FlushFailed=22]=\"FlushFailed\",t[t.MessageLimitPerPVExceeded=23]=\"MessageLimitPerPVExceeded\",t[t.MissingRequiredFieldSpecification=24]=\"MissingRequiredFieldSpecification\",t[t.NavigationTimingNotSupported=25]=\"NavigationTimingNotSupported\",t[t.OnError=26]=\"OnError\",t[t.SessionRenewalDateIsZero=27]=\"SessionRenewalDateIsZero\",t[t.SenderNotInitialized=28]=\"SenderNotInitialized\",t[t.StartTrackEventFailed=29]=\"StartTrackEventFailed\",t[t.StopTrackEventFailed=30]=\"StopTrackEventFailed\",t[t.StartTrackFailed=31]=\"StartTrackFailed\",t[t.StopTrackFailed=32]=\"StopTrackFailed\",t[t.TelemetrySampledAndNotSent=33]=\"TelemetrySampledAndNotSent\",t[t.TrackEventFailed=34]=\"TrackEventFailed\",t[t.TrackExceptionFailed=35]=\"TrackExceptionFailed\",t[t.TrackMetricFailed=36]=\"TrackMetricFailed\",t[t.TrackPVFailed=37]=\"TrackPVFailed\",t[t.TrackPVFailedCalc=38]=\"TrackPVFailedCalc\",t[t.TrackTraceFailed=39]=\"TrackTraceFailed\",t[t.TransmissionFailed=40]=\"TransmissionFailed\",t[t.FailedToSetStorageBuffer=41]=\"FailedToSetStorageBuffer\",t[t.FailedToRestoreStorageBuffer=42]=\"FailedToRestoreStorageBuffer\",t[t.InvalidBackendResponse=43]=\"InvalidBackendResponse\",t[t.FailedToFixDepricatedValues=44]=\"FailedToFixDepricatedValues\",t[t.InvalidDurationValue=45]=\"InvalidDurationValue\",t[t.CannotSerializeObject=46]=\"CannotSerializeObject\",t[t.CannotSerializeObjectNonSerializable=47]=\"CannotSerializeObjectNonSerializable\",t[t.CircularReferenceDetected=48]=\"CircularReferenceDetected\",t[t.ClearAuthContextFailed=49]=\"ClearAuthContextFailed\",t[t.ExceptionTruncated=50]=\"ExceptionTruncated\",t[t.IllegalCharsInName=51]=\"IllegalCharsInName\",t[t.ItemNotInArray=52]=\"ItemNotInArray\",t[t.MaxAjaxPerPVExceeded=53]=\"MaxAjaxPerPVExceeded\",t[t.MessageTruncated=54]=\"MessageTruncated\",t[t.NameTooLong=55]=\"NameTooLong\",t[t.SampleRateOutOfRange=56]=\"SampleRateOutOfRange\",t[t.SetAuthContextFailed=57]=\"SetAuthContextFailed\",t[t.SetAuthContextFailedAccountName=58]=\"SetAuthContextFailedAccountName\",t[t.StringValueTooLong=59]=\"StringValueTooLong\",t[t.StartCalledMoreThanOnce=60]=\"StartCalledMoreThanOnce\",t[t.StopCalledWithoutStart=61]=\"StopCalledWithoutStart\",t[t.TelemetryInitializerFailed=62]=\"TelemetryInitializerFailed\",t[t.TrackArgumentsNotSpecified=63]=\"TrackArgumentsNotSpecified\",t[t.UrlTooLong=64]=\"UrlTooLong\",t[t.SessionStorageBufferFull=65]=\"SessionStorageBufferFull\",t[t.CannotAccessCookie=66]=\"CannotAccessCookie\",t[t.IdTooLong=67]=\"IdTooLong\";var g=function(){function a(e,t,n,i){void 0===n&&(n=!1),this.messageId=e,this.message=(n?a.AiUserActionablePrefix:a.AiNonUserActionablePrefix)+c[e].toString();var o=(t?\" message:\"+a.sanitizeDiagnosticText(t):\"\")+(i?\" props:\"+a.sanitizeDiagnosticText(JSON.stringify(i)):\"\");this.message+=o}return a.sanitizeDiagnosticText=function(e){return'\"'+e.replace(/\\\"/g,\"\")+'\"'},a.AiNonUserActionablePrefix=\"AI (Internal): \",a.AiUserActionablePrefix=\"AI: \",a}();s._InternalLogMessage=g;var n=function(){function r(){}return r.throwInternal=function(e,t,n,i,o){void 0===o&&(o=!1);var a=new g(t,n,o,i);if(this.enableDebugExceptions())throw a;if(void 0!==a&&a&&\"undefined\"!=typeof a.message){if(o){var r=c[a.messageId];this._messageLogged[r]&&!this.verboseLogging()||(this.warnToConsole(a.message),this._messageLogged[r]=!0)}else this.verboseLogging()&&this.warnToConsole(a.message);this.logInternalMessage(e,a)}},r.warnToConsole=function(e){\"undefined\"!=typeof console&&console&&(\"function\"==typeof console.warn?console.warn(e):\"function\"==typeof console.log&&console.log(e))},r.resetInternalMessageCount=function(){this._messageCount=0,this._messageLogged={}},r.clearInternalMessageLoggedTypes=function(){if(s.Util.canUseSessionStorage())for(var e=s.Util.getSessionStorageKeys(),t=0;t<e.length;t++)0===e[t].indexOf(r.AIInternalMessagePrefix)&&s.Util.removeSessionStorage(e[t])},r.setMaxInternalMessageLimit=function(e){if(!e)throw new Error(\"limit cannot be undefined.\");this.MAX_INTERNAL_MESSAGE_LIMIT=e},r.logInternalMessage=function(e,t){if(!this._areInternalMessagesThrottled()){var n=!0,i=r.AIInternalMessagePrefix+c[t.messageId];if(s.Util.canUseSessionStorage())s.Util.getSessionStorage(i)?n=!1:s.Util.setSessionStorage(i,\"1\");else this._messageLogged[i]?n=!1:this._messageLogged[i]=!0;if(n&&((this.verboseLogging()||e===l.CRITICAL)&&(this.queue.push(t),this._messageCount++),this._messageCount==this.MAX_INTERNAL_MESSAGE_LIMIT)){var o=\"Internal events throttle limit per PageView reached for this app.\",a=new g(c.MessageLimitPerPVExceeded,o,!1);this.queue.push(a),this.warnToConsole(o)}}},r._areInternalMessagesThrottled=function(){return this._messageCount>=this.MAX_INTERNAL_MESSAGE_LIMIT},r.AIInternalMessagePrefix=\"AITR_\",r.enableDebugExceptions=function(){return!1},r.verboseLogging=function(){return!1},r.queue=[],r.MAX_INTERNAL_MESSAGE_LIMIT=25,r._messageCount=0,r._messageLogged={},r}();s._InternalLogging=n}(e.ApplicationInsights||(e.ApplicationInsights={}))}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function(){function e(){}return e.newId=function(){for(var e=\"\",t=1073741824*Math.random();0<t;){e+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(t%64),t=Math.floor(t/64)}return e},e}(),t.UtilHelpers=n}(Microsoft||(Microsoft={})),function(e){!function(o){var a,e;(e=a||(a={}))[e.LocalStorage=0]=\"LocalStorage\",e[e.SessionStorage=1]=\"SessionStorage\";var t=function(){function r(){}return r.disableStorage=function(){r._canUseLocalStorage=!1,r._canUseSessionStorage=!1},r._getLocalStorageObject=function(){return r.canUseLocalStorage()?r._getVerifiedStorageObject(a.LocalStorage):null},r._getVerifiedStorageObject=function(e){var t,n,i=null;try{n=new Date,(i=e===a.LocalStorage?window.localStorage:window.sessionStorage).setItem(n,n),t=i.getItem(n)!=n,i.removeItem(n),t&&(i=null)}catch(o){i=null}return i},r.isInternalApplicationInsightsEndpoint=function(e){return-1!==r._internalEndpoints.indexOf(e.toLowerCase())},r.canUseLocalStorage=function(){return r._canUseLocalStorage===undefined&&(r._canUseLocalStorage=!!r._getVerifiedStorageObject(a.LocalStorage)),r._canUseLocalStorage},r.getStorage=function(e){var t=r._getLocalStorageObject();if(null!==t)try{return t.getItem(e)}catch(n){r._canUseLocalStorage=!1,o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.BrowserCannotReadLocalStorage,\"Browser failed read of local storage. \"+r.getExceptionName(n),{exception:r.dump(n)})}return null},r.setStorage=function(e,t){var n=r._getLocalStorageObject();if(null!==n)try{return n.setItem(e,t),!0}catch(i){r._canUseLocalStorage=!1,o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.BrowserCannotWriteLocalStorage,\"Browser failed write to local storage. \"+r.getExceptionName(i),{exception:r.dump(i)})}return!1},r.removeStorage=function(e){var t=r._getLocalStorageObject();if(null!==t)try{return t.removeItem(e),!0}catch(n){r._canUseLocalStorage=!1,o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.BrowserFailedRemovalFromLocalStorage,\"Browser failed removal of local storage item. \"+r.getExceptionName(n),{exception:r.dump(n)})}return!1},r._getSessionStorageObject=function(){return r.canUseSessionStorage()?r._getVerifiedStorageObject(a.SessionStorage):null},r.canUseSessionStorage=function(){return r._canUseSessionStorage===undefined&&(r._canUseSessionStorage=!!r._getVerifiedStorageObject(a.SessionStorage)),r._canUseSessionStorage},r.getSessionStorageKeys=function(){var e=[];if(r.canUseSessionStorage())for(var t in window.sessionStorage)e.push(t);return e},r.getSessionStorage=function(e){var t=r._getSessionStorageObject();if(null!==t)try{return t.getItem(e)}catch(n){r._canUseSessionStorage=!1,o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.BrowserCannotReadSessionStorage,\"Browser failed read of session storage. \"+r.getExceptionName(n),{exception:r.dump(n)})}return null},r.setSessionStorage=function(e,t){var n=r._getSessionStorageObject();if(null!==n)try{return n.setItem(e,t),!0}catch(i){r._canUseSessionStorage=!1,o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.BrowserCannotWriteSessionStorage,\"Browser failed write to session storage. \"+r.getExceptionName(i),{exception:r.dump(i)})}return!1},r.removeSessionStorage=function(e){var t=r._getSessionStorageObject();if(null!==t)try{return t.removeItem(e),!0}catch(n){r._canUseSessionStorage=!1,o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.BrowserFailedRemovalFromSessionStorage,\"Browser failed removal of session storage item. \"+r.getExceptionName(n),{exception:r.dump(n)})}return!1},r.disableCookies=function(){r._canUseCookies=!1},r.canUseCookies=function(){if(r._canUseCookies===undefined){r._canUseCookies=!1;try{r._canUseCookies=r.document.cookie!==undefined}catch(e){o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.CannotAccessCookie,\"Cannot access document.cookie - \"+r.getExceptionName(e),{exception:r.dump(e)})}}return r._canUseCookies},r.disallowsSameSiteNone=function(e){return\"string\"==typeof e&&(-1!==e.indexOf(\"CPU iPhone OS 12\")||-1!==e.indexOf(\"iPad; CPU OS 12\")||(-1!==e.indexOf(\"Macintosh; Intel Mac OS X 10_14\")&&-1!==e.indexOf(\"Version/\")&&-1!==e.indexOf(\"Safari\")||(!(-1===e.indexOf(\"Macintosh; Intel Mac OS X 10_14\")||!_endsWith(e,\"AppleWebKit/605.1.15 (KHTML, like Gecko)\"))||(-1!==e.indexOf(\"Chrome/5\")||-1!==e.indexOf(\"Chrome/6\")||(-1!==e.indexOf(\"UnrealEngine\")&&-1===e.indexOf(\"Chrome\")||(-1!==e.indexOf(\"UCBrowser/12\")||-1!==e.indexOf(\"UCBrowser/11\")))))))},r.setCookie=function(e,t,n){var i=\"\",o=\"\";n&&(i=\";domain=\"+n),r.document.location&&\"https:\"===r.document.location.protocol&&(o=\";secure\",null===r._uaDisallowsSameSiteNone&&\"undefined\"!=typeof navigator&&(r._uaDisallowsSameSiteNone=r.disallowsSameSiteNone(navigator.userAgent)),r._uaDisallowsSameSiteNone||(t+=\";SameSite=None\")),r.canUseCookies()&&(r.document.cookie=e+\"=\"+t+i+\";path=/\"+o)},r.stringToBoolOrDefault=function(e,t){return void 0===t&&(t=!1),e===undefined||null===e?t:\"true\"===e.toString().toLowerCase()},r.getCookie=function(e){if(r.canUseCookies()){var t=\"\";if(e&&e.length)for(var n=e+\"=\",i=r.document.cookie.split(\";\"),o=0;o<i.length;o++){var a=i[o];if((a=r.trim(a))&&0===a.indexOf(n)){t=a.substring(n.length,i[o].length);break}}return t}},r.deleteCookie=function(e){r.canUseCookies()&&(r.document.cookie=e+\"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\")},r.trim=function(e){return\"string\"!=typeof e?e:e.replace(/^\\s+|\\s+$/g,\"\")},r.newId=function(){return o.UtilHelpers.newId()},r.isArray=function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},r.isError=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)},r.isDate=function(e){return\"[object Date]\"===Object.prototype.toString.call(e)},r.toISOStringForIE8=function(e){if(r.isDate(e)){if(Date.prototype.toISOString)return e.toISOString();var t=function(e){var t=String(e);return 1===t.length&&(t=\"0\"+t),t};return e.getUTCFullYear()+\"-\"+t(e.getUTCMonth()+1)+\"-\"+t(e.getUTCDate())+\"T\"+t(e.getUTCHours())+\":\"+t(e.getUTCMinutes())+\":\"+t(e.getUTCSeconds())+\".\"+String((e.getUTCMilliseconds()/1e3).toFixed(3)).slice(2,5)+\"Z\"}},r.getIEVersion=function(e){void 0===e&&(e=null);var t=e?e.toLowerCase():navigator.userAgent.toLowerCase();return-1!=t.indexOf(\"msie\")?parseInt(t.split(\"msie\")[1]):null},r.msToTimeSpan=function(e){(isNaN(e)||e<0)&&(e=0);var t=\"\"+(e=Math.round(e))%1e3,n=\"\"+Math.floor(e/1e3)%60,i=\"\"+Math.floor(e/6e4)%60,o=\"\"+Math.floor(e/36e5)%24,a=Math.floor(e/864e5);return t=1===t.length?\"00\"+t:2===t.length?\"0\"+t:t,n=n.length<2?\"0\"+n:n,i=i.length<2?\"0\"+i:i,(0<a?a+\".\":\"\")+(o=o.length<2?\"0\"+o:o)+\":\"+i+\":\"+n+\".\"+t},r.isCrossOriginError=function(e,t,n,i,o){return(\"Script error.\"===e||\"Script error\"===e)&&!o},r.dump=function(e){var t=Object.prototype.toString.call(e),n=JSON.stringify(e);return\"[object Error]\"===t&&(n=\"{ stack: '\"+e.stack+\"', message: '\"+e.message+\"', name: '\"+e.name+\"'\"),t+n},r.getExceptionName=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)?e.name:\"\"},r.addEventHandler=function(e,t){if(!window||\"string\"!=typeof e||\"function\"!=typeof t)return!1;var n=\"on\"+e;if(window.addEventListener)window.addEventListener(e,t,!1);else{if(!window.attachEvent)return!1;window.attachEvent(n,t)}return!0},r.IsBeaconApiSupported=function(){return\"sendBeacon\"in navigator&&navigator.sendBeacon},r.document=\"undefined\"!=typeof document?document:{},r._canUseCookies=undefined,r._canUseLocalStorage=undefined,r._canUseSessionStorage=undefined,r._uaDisallowsSameSiteNone=null,r._internalEndpoints=[\"https://dc.services.visualstudio.com/v2/track\",\"https://breeze.aimon.applicationinsights.io/v2/track\",\"https://dc-int.services.visualstudio.com/v2/track\"],r.NotSpecified=\"not_specified\",r}();o.Util=t;var r=function(){function i(){}return i.parseUrl=function(e){return i.htmlAnchorElement||(i.htmlAnchorElement=i.document.createElement?i.document.createElement(\"a\"):{host:i.parseHost(e)}),i.htmlAnchorElement.href=e,i.htmlAnchorElement},i.parseHost=function(e){var t=e.match(/:\\/\\/(www[0-9]?\\.)?(.[^/:]+)/i);return null!=t&&2<t.length&&\"string\"==typeof t[2]&&0<t[2].length?t[2]:null},i.getAbsoluteUrl=function(e){var t,n=i.parseUrl(e);return n&&(t=n.href),t},i.getPathName=function(e){var t,n=i.parseUrl(e);return n&&(t=n.pathname),t},i.getCompleteUrl=function(e,t){return e?e.toUpperCase()+\" \"+t:t},i.document=\"undefined\"!=typeof document?document:{},i}();o.UrlHelper=r;var n=function(){function n(){}return n.canIncludeCorrelationHeader=function(e,t,n){if(e&&e.disableCorrelationHeaders)return!1;if(!t)return!1;var i=r.parseUrl(t).host.toLowerCase();if(!(e&&e.enableCorsCorrelation||i===n))return!1;var o=e&&e.correlationHeaderExcludedDomains;if(!o||0==o.length)return!0;for(var a=0;a<o.length;a++){if(new RegExp(o[a].toLowerCase().replace(/\\./g,\".\").replace(/\\*/g,\".*\")).test(i))return!1}return!0},n.getCorrelationContext=function(e){if(e){var t=n.getCorrelationContextValue(e,o.RequestHeaders.requestContextTargetKey);if(t&&t!==n.correlationIdPrefix)return t}},n.getCorrelationContextValue=function(e,t){if(e)for(var n=e.split(\",\"),i=0;i<n.length;++i){var o=n[i].split(\"=\");if(2==o.length&&o[0]==t)return o[1]}},n.correlationIdPrefix=\"cid-v1:\",n}();o.CorrelationIdHelper=n}(e.ApplicationInsights||(e.ApplicationInsights={}))}(Microsoft||(Microsoft={})),function(e){!function(f){var h,e;(e=h=f.FieldType||(f.FieldType={}))[e.Default=0]=\"Default\",e[e.Required=1]=\"Required\",e[e.Array=2]=\"Array\",e[e.Hidden=4]=\"Hidden\";var t=function(){function d(){}return d.serialize=function(e){var t=d._serializeObject(e,\"root\");return JSON.stringify(t)},d._serializeObject=function(e,t){var n=\"__aiCircularRefCheck\",i={};if(!e)return f._InternalLogging.throwInternal(f.LoggingSeverity.CRITICAL,f._InternalMessageId.CannotSerializeObject,\"cannot serialize object because it is null or undefined\",{name:t},!0),i;if(e[n])return f._InternalLogging.throwInternal(f.LoggingSeverity.WARNING,f._InternalMessageId.CircularReferenceDetected,\"Circular reference detected while serializing object\",{name:t},!0),i;if(!e.aiDataContract){if(\"measurements\"===t)i=d._serializeStringMap(e,\"number\",t);else if(\"properties\"===t)i=d._serializeStringMap(e,\"string\",t);else if(\"tags\"===t)i=d._serializeStringMap(e,\"string\",t);else if(f.Util.isArray(e))i=d._serializeArray(e,t);else{f._InternalLogging.throwInternal(f.LoggingSeverity.WARNING,f._InternalMessageId.CannotSerializeObjectNonSerializable,\"Attempting to serialize an object which does not implement ISerializable\",{name:t},!0);try{JSON.stringify(e),i=e}catch(p){f._InternalLogging.throwInternal(f.LoggingSeverity.CRITICAL,f._InternalMessageId.CannotSerializeObject,p&&\"function\"==typeof p.toString?p.toString():\"Error serializing object\",null,!0)}}return i}for(var o in e[n]=!0,e.aiDataContract){var a,r=e.aiDataContract[o],s=\"function\"==typeof r?r()&h.Required:r&h.Required,l=\"function\"==typeof r?r()&h.Hidden:r&h.Hidden,c=r&h.Array,g=e[o]!==undefined,u=\"object\"==typeof e[o]&&null!==e[o];if(!s||g||c){if(!l)(a=u?c?d._serializeArray(e[o],o):d._serializeObject(e[o],o):e[o])!==undefined&&(i[o]=a)}else f._InternalLogging.throwInternal(f.LoggingSeverity.CRITICAL,f._InternalMessageId.MissingRequiredFieldSpecification,\"Missing required field specification. The field is required but not present on source\",{field:o,name:t})}return delete e[n],i},d._serializeArray=function(e,t){var n=undefined;if(e)if(f.Util.isArray(e)){n=[];for(var i=0;i<e.length;i++){var o=e[i],a=d._serializeObject(o,t+\"[\"+i+\"]\");n.push(a)}}else f._InternalLogging.throwInternal(f.LoggingSeverity.CRITICAL,f._InternalMessageId.ItemNotInArray,\"This field was specified as an array in the contract but the item is not an array.\\r\\n\",{name:t},!0);return n},d._serializeStringMap=function(e,t,n){var i=undefined;if(e)for(var o in i={},e){var a=e[o];if(\"string\"===t)a===undefined?i[o]=\"undefined\":null===a?i[o]=\"null\":a.toString?i[o]=a.toString():i[o]=\"invalid field: toString() is not defined.\";else if(\"number\"===t)if(a===undefined)i[o]=\"undefined\";else if(null===a)i[o]=\"null\";else{var r=parseFloat(a);isNaN(r)?i[o]=\"NaN\":i[o]=r}else i[o]=\"invalid field: \"+n+\" is of unknown type.\",f._InternalLogging.throwInternal(f.LoggingSeverity.CRITICAL,i[o],null,!0)}return i},d}();f.Serializer=t}(e.ApplicationInsights||(e.ApplicationInsights={}))}(Microsoft||(Microsoft={})),function(e){var o,t,a,n;o=e.ApplicationInsights||(e.ApplicationInsights={}),t=o.Telemetry||(o.Telemetry={}),a=t.Common||(t.Common={}),n=function(i){function e(e,t){var n=i.call(this)||this;return n.name=a.DataSanitizer.sanitizeString(t)||o.Util.NotSpecified,n.data=e,n.time=o.Util.toISOStringForIE8(new Date),n.aiDataContract={time:o.FieldType.Required,iKey:o.FieldType.Required,name:o.FieldType.Required,sampleRate:function(){return 100==n.sampleRate?o.FieldType.Hidden:o.FieldType.Required},tags:o.FieldType.Required,data:o.FieldType.Required},n}return __extends(e,i),e}(e.Telemetry.Envelope),a.Envelope=n}(Microsoft||(Microsoft={})),function(e){var t,n,i,o;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=t.Telemetry||(t.Telemetry={}),i=n.Common||(n.Common={}),o=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.aiDataContract={},e}return __extends(e,t),e}(e.Telemetry.Base),i.Base=o}(Microsoft||(Microsoft={})),function(e){var t=function n(){this.applicationVersion=\"ai.application.ver\",this.applicationBuild=\"ai.application.build\",this.applicationTypeId=\"ai.application.typeId\",this.applicationId=\"ai.application.applicationId\",this.applicationLayer=\"ai.application.layer\",this.deviceId=\"ai.device.id\",this.deviceIp=\"ai.device.ip\",this.deviceLanguage=\"ai.device.language\",this.deviceLocale=\"ai.device.locale\",this.deviceModel=\"ai.device.model\",this.deviceFriendlyName=\"ai.device.friendlyName\",this.deviceNetwork=\"ai.device.network\",this.deviceNetworkName=\"ai.device.networkName\",this.deviceOEMName=\"ai.device.oemName\",this.deviceOS=\"ai.device.os\",this.deviceOSVersion=\"ai.device.osVersion\",this.deviceRoleInstance=\"ai.device.roleInstance\",this.deviceRoleName=\"ai.device.roleName\",this.deviceScreenResolution=\"ai.device.screenResolution\",this.deviceType=\"ai.device.type\",this.deviceMachineName=\"ai.device.machineName\",this.deviceVMName=\"ai.device.vmName\",this.deviceBrowser=\"ai.device.browser\",this.deviceBrowserVersion=\"ai.device.browserVersion\",this.locationIp=\"ai.location.ip\",this.locationCountry=\"ai.location.country\",this.locationProvince=\"ai.location.province\",this.locationCity=\"ai.location.city\",this.operationId=\"ai.operation.id\",this.operationName=\"ai.operation.name\",this.operationParentId=\"ai.operation.parentId\",this.operationRootId=\"ai.operation.rootId\",this.operationSyntheticSource=\"ai.operation.syntheticSource\",this.operationCorrelationVector=\"ai.operation.correlationVector\",this.sessionId=\"ai.session.id\",this.sessionIsFirst=\"ai.session.isFirst\",this.sessionIsNew=\"ai.session.isNew\",this.userAccountAcquisitionDate=\"ai.user.accountAcquisitionDate\",this.userAccountId=\"ai.user.accountId\",this.userAgent=\"ai.user.userAgent\",this.userId=\"ai.user.id\",this.userStoreRegion=\"ai.user.storeRegion\",this.userAuthUserId=\"ai.user.authUserId\",this.userAnonymousUserAcquisitionDate=\"ai.user.anonUserAcquisitionDate\",this.userAuthenticatedUserAcquisitionDate=\"ai.user.authUserAcquisitionDate\",this.cloudName=\"ai.cloud.name\",this.cloudRole=\"ai.cloud.role\",this.cloudRoleVer=\"ai.cloud.roleVer\",this.cloudRoleInstance=\"ai.cloud.roleInstance\",this.cloudEnvironment=\"ai.cloud.environment\",this.cloudLocation=\"ai.cloud.location\",this.cloudDeploymentUnit=\"ai.cloud.deploymentUnit\",this.internalSdkVersion=\"ai.internal.sdkVersion\",this.internalAgentVersion=\"ai.internal.agentVersion\",this.internalNodeName=\"ai.internal.nodeName\"};(AI||(AI={})).ContextTagKeys=t}(),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function i(){},(t.Context||(t.Context={})).Application=n}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function i(){this.id=\"browser\",this.type=\"Browser\"},(t.Context||(t.Context={})).Device=n}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function i(e){this.sdkVersion=(e.sdkExtension()?e.sdkExtension()+\"_\":\"\")+\"javascript:\"+t.Version},(t.Context||(t.Context={})).Internal=n}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function i(){},(t.Context||(t.Context={})).Location=n}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function i(){this.id=t.Util.newId(),window&&window.location&&window.location.pathname&&(this.name=window.location.pathname)},(t.Context||(t.Context={})).Operation=n}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function(){function i(){}return i.prototype.getHashCodeScore=function(e){return 100*(this.getHashCode(e)/i.INT_MAX_VALUE)},i.prototype.getHashCode=function(e){if(\"\"==e)return 0;for(;e.length<i.MIN_INPUT_LENGTH;)e=e.concat(e);for(var t=5381,n=0;n<e.length;++n)t=(t<<5)+t+e.charCodeAt(n),t&=t;return Math.abs(t)},i.INT_MAX_VALUE=2147483647,i.MIN_INPUT_LENGTH=8,i}(),t.HashCodeScoreGenerator=n}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function(){function e(){this.hashCodeGeneragor=new t.HashCodeScoreGenerator}return e.prototype.getSamplingScore=function(e){var t=new AI.ContextTagKeys;return e.tags[t.userId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.userId]):e.tags[t.operationId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.operationId]):Math.random()},e}(),t.SamplingScoreGenerator=n}(Microsoft||(Microsoft={})),function(e){var t,n,i;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=t.Context||(t.Context={}),i=function(){function e(e){this.INT_MAX_VALUE=2147483647,(100<e||e<0)&&(t._InternalLogging.throwInternal(t.LoggingSeverity.WARNING,t._InternalMessageId.SampleRateOutOfRange,\"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\",{samplingRate:e},!0),this.sampleRate=100),this.sampleRate=e,this.samplingScoreGenerator=new t.SamplingScoreGenerator}return e.prototype.isSampledIn=function(e){return 100==this.sampleRate||this.samplingScoreGenerator.getSamplingScore(e)<this.sampleRate},e}(),n.Sample=i}(Microsoft||(Microsoft={})),function(e){var l;(function(e){var t=function i(){};e.Session=t;var n=function(){function i(e){e||(e={}),\"function\"!=typeof e.sessionExpirationMs&&(e.sessionExpirationMs=function(){return i.acquisitionSpan}),\"function\"!=typeof e.sessionRenewalMs&&(e.sessionRenewalMs=function(){return i.renewalSpan}),this.config=e,this.automaticSession=new t}return i.prototype.update=function(){this.automaticSession.id||this.initializeAutomaticSession();var e=l.dateTime.Now(),t=e-this.automaticSession.acquisitionDate>this.config.sessionExpirationMs(),n=e-this.automaticSession.renewalDate>this.config.sessionRenewalMs();t||n?(this.automaticSession.isFirst=undefined,this.renew()):(!this.cookieUpdatedTimestamp||e-this.cookieUpdatedTimestamp>i.cookieUpdateInterval)&&(this.automaticSession.renewalDate=e,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate))},i.prototype.backup=function(){this.setStorage(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate)},i.prototype.initializeAutomaticSession=function(){var e=l.Util.getCookie(\"ai_session\");if(e&&\"function\"==typeof e.split)this.initializeAutomaticSessionWithData(e);else{var t=l.Util.getStorage(\"ai_session\");t&&this.initializeAutomaticSessionWithData(t)}this.automaticSession.id||(this.automaticSession.isFirst=!0,this.renew())},i.prototype.initializeAutomaticSessionWithData=function(e){var t=e.split(\"|\");0<t.length&&(this.automaticSession.id=t[0]);try{if(1<t.length){var n=+t[1];this.automaticSession.acquisitionDate=+new Date(n),this.automaticSession.acquisitionDate=0<this.automaticSession.acquisitionDate?this.automaticSession.acquisitionDate:0}if(2<t.length){var i=+t[2];this.automaticSession.renewalDate=+new Date(i),this.automaticSession.renewalDate=0<this.automaticSession.renewalDate?this.automaticSession.renewalDate:0}}catch(o){l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.ErrorParsingAISessionCookie,\"Error parsing ai_session cookie, session will be reset: \"+l.Util.getExceptionName(o),{exception:l.Util.dump(o)})}0==this.automaticSession.renewalDate&&l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.SessionRenewalDateIsZero,\"AI session renewal date is 0, session will be reset.\")},i.prototype.renew=function(){var e=l.dateTime.Now();this.automaticSession.id=l.Util.newId(),this.automaticSession.acquisitionDate=e,this.automaticSession.renewalDate=e,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate),l.Util.canUseLocalStorage()||l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.BrowserDoesNotSupportLocalStorage,\"Browser does not support local storage. Session durations will be inaccurate.\")},i.prototype.setCookie=function(e,t,n){var i=t+this.config.sessionExpirationMs(),o=n+this.config.sessionRenewalMs(),a=new Date,r=[e,t,n];i<o?a.setTime(i):a.setTime(o);var s=this.config.cookieDomain?this.config.cookieDomain():null;l.Util.setCookie(\"ai_session\",r.join(\"|\")+\";expires=\"+a.toUTCString(),s),this.cookieUpdatedTimestamp=l.dateTime.Now()},i.prototype.setStorage=function(e,t,n){l.Util.setStorage(\"ai_session\",[e,t,n].join(\"|\"))},i.acquisitionSpan=864e5,i.renewalSpan=18e5,i.cookieUpdateInterval=6e4,i}();e._SessionManager=n})((l=e.ApplicationInsights||(e.ApplicationInsights={})).Context||(l.Context={}))}(Microsoft||(Microsoft={})),function(e){var g,t,n;g=e.ApplicationInsights||(e.ApplicationInsights={}),t=g.Context||(g.Context={}),n=function(){function c(e){var t=g.Util.getCookie(c.userCookieName);if(t){var n=t.split(c.cookieSeparator);0<n.length&&(this.id=n[0])}if(this.config=e,!this.id){this.id=g.Util.newId();var i=new Date,o=g.Util.toISOStringForIE8(i);this.accountAcquisitionDate=o,i.setTime(i.getTime()+31536e6);var a=[this.id,o],r=this.config.cookieDomain?this.config.cookieDomain():undefined;g.Util.setCookie(c.userCookieName,a.join(c.cookieSeparator)+\";expires=\"+i.toUTCString(),r),g.Util.removeStorage(\"ai_session\")}this.accountId=e.accountId?e.accountId():undefined;var s=g.Util.getCookie(c.authUserCookieName);if(s){var l=(s=decodeURI(s)).split(c.cookieSeparator);l[0]&&(this.authenticatedId=l[0]),1<l.length&&l[1]&&(this.accountId=l[1])}}return c.prototype.setAuthenticatedUserContext=function(e,t,n){if(void 0===n&&(n=!1),!this.validateUserInput(e)||t&&!this.validateUserInput(t))g._InternalLogging.throwInternal(g.LoggingSeverity.WARNING,g._InternalMessageId.SetAuthContextFailedAccountName,\"Setting auth user context failed. User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\",!0);else{this.authenticatedId=e;var i=this.authenticatedId;t&&(this.accountId=t,i=[this.authenticatedId,this.accountId].join(c.cookieSeparator)),n&&g.Util.setCookie(c.authUserCookieName,encodeURI(i),this.config.cookieDomain())}},c.prototype.clearAuthenticatedUserContext=function(){this.authenticatedId=null,this.accountId=null,g.Util.deleteCookie(c.authUserCookieName)},c.prototype.validateUserInput=function(e){return!(\"string\"!=typeof e||!e||e.match(/,|;|=| |\\|/))},c.cookieSeparator=\"|\",c.userCookieName=\"ai_user\",c.authUserCookieName=\"ai_authUser\",c}(),t.User=n}(Microsoft||(Microsoft={})),function(e){!function(r){var o=function(){function e(){}return e.IsNullOrUndefined=function(e){return null==e},e}();r.extensions=o;var e=function(){function e(){}return e.GetLength=function(e){var t=0;if(!o.IsNullOrUndefined(e)){var n=\"\";try{n=e.toString()}catch(i){}t=n.length,t=isNaN(t)?0:t}return t},e}();r.stringUtils=e;var t=function(){function e(){}return e.Now=window.performance&&window.performance.now&&window.performance.timing?function(){return window.performance.now()+window.performance.timing.navigationStart}:function(){return(new Date).getTime()},e.GetDuration=function(e,t){var n=null;return 0===e||0===t||o.IsNullOrUndefined(e)||o.IsNullOrUndefined(t)||(n=t-e),n},e}();r.dateTime=t;var n=function(){function e(){}return e.AttachEvent=function(e,t,n){var i=!1;return o.IsNullOrUndefined(e)||(o.IsNullOrUndefined(e.attachEvent)?o.IsNullOrUndefined(e.addEventListener)||(e.addEventListener(t,n,!1),i=!0):(e.attachEvent(\"on\"+t,n),i=!0)),i},e.DetachEvent=function(e,t,n){o.IsNullOrUndefined(e)||(o.IsNullOrUndefined(e.detachEvent)?o.IsNullOrUndefined(e.removeEventListener)||e.removeEventListener(t,n,!1):e.detachEvent(\"on\"+t,n))},e}();r.EventHelper=n;var i=function(){function e(){}return e.ParseDependencyPath=function(e,t,n){var i,o;if(e&&0<e.length){var a=r.UrlHelper.parseUrl(e);if(i=a.host,null!=a.pathname)\"/\"!==(n=0===a.pathname.length?\"/\":a.pathname).charAt(0)&&(n=\"/\"+n),o=r.Telemetry.Common.DataSanitizer.sanitizeString(t?t+\" \"+n:n);else o=r.Telemetry.Common.DataSanitizer.sanitizeString(e)}else o=i=n;return{target:i,name:o}},e}();r.AjaxHelper=i}(e.ApplicationInsights||(e.ApplicationInsights={}))}(Microsoft||(Microsoft={})),function(e){!function(t){var n=function i(){this.openDone=!1,this.setRequestHeaderDone=!1,this.sendDone=!1,this.abortDone=!1,this.onreadystatechangeCallbackAttached=!1};t.XHRMonitoringState=n;var e=function(){function e(e){this.completed=!1,this.requestHeadersSize=null,this.ttfb=null,this.responseReceivingDuration=null,this.callbackDuration=null,this.ajaxTotalDuration=null,this.aborted=null,this.pageUrl=null,this.requestUrl=null,this.requestSize=0,this.method=null,this.status=null,this.requestSentTime=null,this.responseStartedTime=null,this.responseFinishedTime=null,this.callbackFinishedTime=null,this.endTime=null,this.originalOnreadystatechage=null,this.xhrMonitoringState=new n,this.clientFailure=0,this.CalculateMetrics=function(){this.ajaxTotalDuration=Math.round(1e3*t.dateTime.GetDuration(this.requestSentTime,this.responseFinishedTime))/1e3},this.id=e}return e.prototype.getAbsoluteUrl=function(){return this.requestUrl?t.UrlHelper.getAbsoluteUrl(this.requestUrl):null},e.prototype.getPathName=function(){return this.requestUrl?t.Telemetry.Common.DataSanitizer.sanitizeUrl(t.UrlHelper.getCompleteUrl(this.method,this.requestUrl)):null},e}();t.ajaxRecord=e}(e.ApplicationInsights||(e.ApplicationInsights={}))}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function(){function e(){}return e.requestContextHeader=\"Request-Context\",e.requestContextTargetKey=\"appId\",e.requestContextAppIdFormat=\"appId=cid-v1:\",e.requestIdHeader=\"Request-Id\",e.sdkContextHeader=\"Sdk-Context\",e.sdkContextHeaderAppIdRequest=\"appId\",e.requestContextHeaderLowerCase=\"request-context\",e}(),t.RequestHeaders=n}(Microsoft||(Microsoft={})),function(e){var t;t=function n(){},(e.Telemetry||(e.Telemetry={})).Domain=t}(Microsoft||(Microsoft={})),function(e){var t=function(t){function e(){var e=t.call(this)||this;return e.ver=2,e.properties={},e.measurements={},e}return __extends(e,t),e}(Microsoft.Telemetry.Domain);e.EventData=t}(AI||(AI={})),function(e){var t=function(t){function e(){var e=t.call(this)||this;return e.ver=2,e.properties={},e.measurements={},e}return __extends(e,t),e}(e.EventData);e.PageViewData=t}(AI||(AI={})),function(e){var t=function(t){function e(){var e=t.call(this)||this;return e.ver=2,e.success=!0,e.properties={},e.measurements={},e}return __extends(e,t),e}(Microsoft.Telemetry.Domain);e.RemoteDependencyData=t}(AI||(AI={})),function(e){var i,t,n,o;i=e.ApplicationInsights||(e.ApplicationInsights={}),t=i.Telemetry||(i.Telemetry={}),n=t.Common||(t.Common={}),o=function(){function r(){}return r.sanitizeKeyAndAddUniqueness=function(e,t){var n=e.length,i=r.sanitizeKey(e);if(i.length!==n){for(var o=0,a=i;t[a]!==undefined;)o++,a=i.substring(0,r.MAX_NAME_LENGTH-3)+r.padNumber(o);i=a}return i},r.sanitizeKey=function(e){return e&&(e=i.Util.trim(e.toString())).length>r.MAX_NAME_LENGTH&&(e=e.substring(0,r.MAX_NAME_LENGTH),i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.NameTooLong,\"name is too long.  It has been truncated to \"+r.MAX_NAME_LENGTH+\" characters.\",{name:e},!0)),e},r.sanitizeString=function(e,t){return void 0===t&&(t=r.MAX_STRING_LENGTH),e&&(t=t||r.MAX_STRING_LENGTH,(e=i.Util.trim(e)).toString().length>t&&(e=e.toString().substring(0,t),i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.StringValueTooLong,\"string value is too long. It has been truncated to \"+t+\" characters.\",{value:e},!0))),e},r.sanitizeUrl=function(e){return r.sanitizeInput(e,r.MAX_URL_LENGTH,i._InternalMessageId.UrlTooLong)},r.sanitizeMessage=function(e){return e&&e.length>r.MAX_MESSAGE_LENGTH&&(e=e.substring(0,r.MAX_MESSAGE_LENGTH),i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.MessageTruncated,\"message is too long, it has been truncated to \"+r.MAX_MESSAGE_LENGTH+\" characters.\",{message:e},!0)),e},r.sanitizeException=function(e){return e&&e.length>r.MAX_EXCEPTION_LENGTH&&(e=e.substring(0,r.MAX_EXCEPTION_LENGTH),i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.ExceptionTruncated,\"exception is too long, it has been truncated to \"+r.MAX_EXCEPTION_LENGTH+\" characters.\",{exception:e},!0)),e},r.sanitizeProperties=function(e){if(e){var t={};for(var n in e){var i=r.sanitizeString(e[n],r.MAX_PROPERTY_LENGTH);t[n=r.sanitizeKeyAndAddUniqueness(n,t)]=i}e=t}return e},r.sanitizeMeasurements=function(e){if(e){var t={};for(var n in e){var i=e[n];t[n=r.sanitizeKeyAndAddUniqueness(n,t)]=i}e=t}return e},r.sanitizeId=function(e){return e?r.sanitizeInput(e,r.MAX_ID_LENGTH,i._InternalMessageId.IdTooLong).toString():e},r.sanitizeInput=function(e,t,n){return e&&(e=i.Util.trim(e)).length>t&&(e=e.substring(0,t),i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,n,\"input is too long, it has been truncated to \"+t+\" characters.\",{data:e},!0)),e},r.padNumber=function(e){var t=\"00\"+e;return t.substr(t.length-3)},r.MAX_NAME_LENGTH=150,r.MAX_ID_LENGTH=128,r.MAX_PROPERTY_LENGTH=8192,r.MAX_STRING_LENGTH=1024,r.MAX_URL_LENGTH=2048,r.MAX_MESSAGE_LENGTH=32768,r.MAX_EXCEPTION_LENGTH=32768,r}(),n.DataSanitizer=o}(Microsoft||(Microsoft={})),function(e){var p,d,t;p=e.ApplicationInsights||(e.ApplicationInsights={}),d=p.Telemetry||(p.Telemetry={}),t=function(u){function e(e,t,n,i,o,a,r,s,l){var c=u.call(this)||this;c.aiDataContract={id:p.FieldType.Required,ver:p.FieldType.Required,name:p.FieldType.Default,resultCode:p.FieldType.Default,duration:p.FieldType.Default,success:p.FieldType.Default,data:p.FieldType.Default,target:p.FieldType.Default,type:p.FieldType.Default,properties:p.FieldType.Default,measurements:p.FieldType.Default,kind:p.FieldType.Default,value:p.FieldType.Default,count:p.FieldType.Default,min:p.FieldType.Default,max:p.FieldType.Default,stdDev:p.FieldType.Default,dependencyKind:p.FieldType.Default,dependencySource:p.FieldType.Default,commandName:p.FieldType.Default,dependencyTypeName:p.FieldType.Default},c.id=e,c.duration=p.Util.msToTimeSpan(i),c.success=o,c.resultCode=a+\"\",c.type=\"Ajax\",c.data=d.Common.DataSanitizer.sanitizeUrl(n);var g=p.AjaxHelper.ParseDependencyPath(t,r,n);return c.target=g.target,c.name=g.name,c.properties=p.Telemetry.Common.DataSanitizer.sanitizeProperties(s),c.measurements=p.Telemetry.Common.DataSanitizer.sanitizeMeasurements(l),c}return __extends(e,u),e.envelopeType=\"Microsoft.ApplicationInsights.{0}.RemoteDependency\",e.dataType=\"RemoteDependencyData\",e}(AI.RemoteDependencyData),d.RemoteDependencyData=t}(Microsoft||(Microsoft={})),function(s){var l,e;l=s.ApplicationInsights||(s.ApplicationInsights={}),e=function(){function r(e){this.currentWindowHost=\"object\"==typeof window?window.location.host&&window.location.host.toLowerCase():undefined,this.appInsights=e,this.initialized=!1,this.Init()}return r.prototype.Init=function(){this.supportsMonitoring()&&(this.instrumentOpen(),this.instrumentSend(),this.instrumentAbort(),this.initialized=!0)},r.prototype.isMonitoredInstance=function(e,t){return this.initialized&&(!0===t||!l.extensions.IsNullOrUndefined(e.ajaxData))&&!0!==e[r.DisabledPropertyName]},r.prototype.supportsMonitoring=function(){var e=!0;(\"function\"!=typeof XMLHttpRequest||l.extensions.IsNullOrUndefined(XMLHttpRequest)||l.extensions.IsNullOrUndefined(XMLHttpRequest.prototype)||l.extensions.IsNullOrUndefined(XMLHttpRequest.prototype.open)||l.extensions.IsNullOrUndefined(XMLHttpRequest.prototype.send)||l.extensions.IsNullOrUndefined(XMLHttpRequest.prototype.abort))&&(e=!1);try{\" a \".trim()}catch(t){e=!1}return e},r.prototype.instrumentOpen=function(){var o=XMLHttpRequest.prototype.open,a=this;XMLHttpRequest.prototype.open=function(e,t,n){try{!a.isMonitoredInstance(this,!0)||this.ajaxData&&this.ajaxData.xhrMonitoringState.openDone||a.openHandler(this,e,t,n)}catch(i){l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.FailedMonitorAjaxOpen,\"Failed to monitor XMLHttpRequest.open, monitoring data for this ajax call may be incorrect.\",{ajaxDiagnosticsMessage:r.getFailedAjaxDiagnosticsMessage(this),exception:s.ApplicationInsights.Util.dump(i)})}return o.apply(this,arguments)}},r.prototype.openHandler=function(e,t,n,i){var o=\"|\"+this.appInsights.context.operation.id+\".\"+l.Util.newId(),a=new l.ajaxRecord(o);a.method=t,a.requestUrl=n,a.xhrMonitoringState.openDone=!0,e.ajaxData=a,this.attachToOnReadyStateChange(e)},r.getFailedAjaxDiagnosticsMessage=function(e){var t=\"\";try{l.extensions.IsNullOrUndefined(e)||l.extensions.IsNullOrUndefined(e.ajaxData)||l.extensions.IsNullOrUndefined(e.ajaxData.requestUrl)||(t+=\"(url: '\"+e.ajaxData.requestUrl+\"')\")}catch(n){}return t},r.prototype.instrumentSend=function(){var n=XMLHttpRequest.prototype.send,i=this;XMLHttpRequest.prototype.send=function(e){try{i.isMonitoredInstance(this)&&!this.ajaxData.xhrMonitoringState.sendDone&&i.sendHandler(this,e)}catch(t){l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.FailedMonitorAjaxSend,\"Failed to monitor XMLHttpRequest, monitoring data for this ajax call may be incorrect.\",{ajaxDiagnosticsMessage:r.getFailedAjaxDiagnosticsMessage(this),exception:s.ApplicationInsights.Util.dump(t)})}return n.apply(this,arguments)}},r.prototype.sendHandler=function(e,t){if(e.ajaxData.requestSentTime=l.dateTime.Now(),l.CorrelationIdHelper.canIncludeCorrelationHeader(this.appInsights.config,e.ajaxData.getAbsoluteUrl(),this.currentWindowHost)&&(e.setRequestHeader(l.RequestHeaders.requestIdHeader,e.ajaxData.id),this.appInsights.context)){var n=this.appInsights.context.appId();n&&e.setRequestHeader(l.RequestHeaders.requestContextHeader,l.RequestHeaders.requestContextAppIdFormat+n)}e.ajaxData.xhrMonitoringState.sendDone=!0},r.prototype.instrumentAbort=function(){var t=XMLHttpRequest.prototype.abort,n=this;XMLHttpRequest.prototype.abort=function(){try{n.isMonitoredInstance(this)&&!this.ajaxData.xhrMonitoringState.abortDone&&(this.ajaxData.aborted=1,this.ajaxData.xhrMonitoringState.abortDone=!0)}catch(e){l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.FailedMonitorAjaxAbort,\"Failed to monitor XMLHttpRequest.abort, monitoring data for this ajax call may be incorrect.\",{ajaxDiagnosticsMessage:r.getFailedAjaxDiagnosticsMessage(this),exception:s.ApplicationInsights.Util.dump(e)})}return t.apply(this,arguments)}},r.prototype.attachToOnReadyStateChange=function(n){var i=this;n.ajaxData.xhrMonitoringState.onreadystatechangeCallbackAttached=l.EventHelper.AttachEvent(n,\"readystatechange\",function(){try{i.isMonitoredInstance(n)&&4===n.readyState&&i.onAjaxComplete(n)}catch(t){var e=s.ApplicationInsights.Util.dump(t);e&&-1!=e.toLowerCase().indexOf(\"c00c023f\")||l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.FailedMonitorAjaxRSC,\"Failed to monitor XMLHttpRequest 'readystatechange' event handler, monitoring data for this ajax call may be incorrect.\",{ajaxDiagnosticsMessage:r.getFailedAjaxDiagnosticsMessage(n),exception:s.ApplicationInsights.Util.dump(t)})}})},r.prototype.onAjaxComplete=function(e){if(e.ajaxData.responseFinishedTime=l.dateTime.Now(),e.ajaxData.status=e.status,e.ajaxData.CalculateMetrics(),e.ajaxData.ajaxTotalDuration<0)l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.FailedMonitorAjaxDur,\"Failed to calculate the duration of the ajax call, monitoring data for this ajax call won't be sent.\",{ajaxDiagnosticsMessage:r.getFailedAjaxDiagnosticsMessage(e),requestSentTime:e.ajaxData.requestSentTime,responseFinishedTime:e.ajaxData.responseFinishedTime});else{var t=new l.Telemetry.RemoteDependencyData(e.ajaxData.id,e.ajaxData.getAbsoluteUrl(),e.ajaxData.getPathName(),e.ajaxData.ajaxTotalDuration,200<=+e.ajaxData.status&&+e.ajaxData.status<400,+e.ajaxData.status,e.ajaxData.method),n=this.getCorrelationContext(e);n&&(t.target=t.target+\" | \"+n),this.appInsights.trackDependencyData(t),e.ajaxData=null}},r.prototype.getCorrelationContext=function(e){try{var t=e.getAllResponseHeaders();if(null!==t)if(-1!==t.toLowerCase().indexOf(l.RequestHeaders.requestContextHeaderLowerCase)){var n=e.getResponseHeader(l.RequestHeaders.requestContextHeader);return l.CorrelationIdHelper.getCorrelationContext(n)}}catch(i){l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.FailedMonitorAjaxGetCorrelationHeader,\"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\",{ajaxDiagnosticsMessage:r.getFailedAjaxDiagnosticsMessage(e),exception:s.ApplicationInsights.Util.dump(i)})}},r.instrumentedByAppInsightsName=\"InstrumentedByAppInsights\",r.DisabledPropertyName=\"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\",r}(),l.AjaxMonitor=e}(Microsoft||(Microsoft={})),function(e){!function(o){var e=function(){function e(e){this._config=e,this._buffer=[]}return e.prototype.enqueue=function(e){this._buffer.push(e)},e.prototype.count=function(){return this._buffer.length},e.prototype.clear=function(){this._buffer.length=0},e.prototype.getItems=function(){return this._buffer.slice(0)},e.prototype.batchPayloads=function(e){return e&&0<e.length?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},e.prototype.markAsSent=function(e){this.clear()},e.prototype.clearSent=function(e){},e}();o.ArraySendBuffer=e;var t=function(){function i(e){this._bufferFullMessageSent=!1,this._config=e;var t=this.getBuffer(i.BUFFER_KEY),n=this.getBuffer(i.SENT_BUFFER_KEY);this._buffer=t.concat(n),this._buffer.length>i.MAX_BUFFER_SIZE&&(this._buffer.length=i.MAX_BUFFER_SIZE),this.setBuffer(i.SENT_BUFFER_KEY,[]),this.setBuffer(i.BUFFER_KEY,this._buffer)}return i.prototype.enqueue=function(e){this._buffer.length>=i.MAX_BUFFER_SIZE?this._bufferFullMessageSent||(o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.SessionStorageBufferFull,\"Maximum buffer size reached: \"+this._buffer.length,!0),this._bufferFullMessageSent=!0):(this._buffer.push(e),this.setBuffer(i.BUFFER_KEY,this._buffer))},i.prototype.count=function(){return this._buffer.length},i.prototype.clear=function(){this._buffer.length=0,this.setBuffer(i.BUFFER_KEY,[]),this.setBuffer(i.SENT_BUFFER_KEY,[]),this._bufferFullMessageSent=!1},i.prototype.getItems=function(){return this._buffer.slice(0)},i.prototype.batchPayloads=function(e){return e&&0<e.length?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},i.prototype.markAsSent=function(e){this._buffer=this.removePayloadsFromBuffer(e,this._buffer),this.setBuffer(i.BUFFER_KEY,this._buffer);var t=this.getBuffer(i.SENT_BUFFER_KEY);t instanceof Array&&e instanceof Array&&((t=t.concat(e)).length>i.MAX_BUFFER_SIZE&&(o._InternalLogging.throwInternal(o.LoggingSeverity.CRITICAL,o._InternalMessageId.SessionStorageBufferFull,\"Sent buffer reached its maximum size: \"+t.length,!0),t.length=i.MAX_BUFFER_SIZE),this.setBuffer(i.SENT_BUFFER_KEY,t))},i.prototype.clearSent=function(e){var t=this.getBuffer(i.SENT_BUFFER_KEY);t=this.removePayloadsFromBuffer(e,t),this.setBuffer(i.SENT_BUFFER_KEY,t)},i.prototype.removePayloadsFromBuffer=function(e,t){var n=[];for(var i in t){var o=!1;for(var a in e)if(e[a]===t[i]){o=!0;break}o||n.push(t[i])}return n},i.prototype.getBuffer=function(e){try{var t=o.Util.getSessionStorage(e);if(t){var n=JSON.parse(t);if(n)return n}}catch(i){o._InternalLogging.throwInternal(o.LoggingSeverity.CRITICAL,o._InternalMessageId.FailedToRestoreStorageBuffer,\" storage key: \"+e+\", \"+o.Util.getExceptionName(i),{exception:o.Util.dump(i)})}return[]},i.prototype.setBuffer=function(e,t){try{var n=JSON.stringify(t);o.Util.setSessionStorage(e,n)}catch(i){o.Util.setSessionStorage(e,JSON.stringify([])),o._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.FailedToSetStorageBuffer,\" storage key: \"+e+\", \"+o.Util.getExceptionName(i)+\". Buffer cleared\",{exception:o.Util.dump(i)})}},i.BUFFER_KEY=\"AI_buffer\",i.SENT_BUFFER_KEY=\"AI_sentBuffer\",i.MAX_BUFFER_SIZE=2e3,i}();o.SessionStorageSendBuffer=t}(e.ApplicationInsights||(e.ApplicationInsights={}))}(Microsoft||(Microsoft={})),function(e){var l,t;l=e.ApplicationInsights||(e.ApplicationInsights={}),t=function(){function e(e){(this._XMLHttpRequestSupported=!1,this._consecutiveErrors=0,this._retryAt=null,this._lastSend=0,this._config=e,this._sender=null,this._buffer=l.Util.canUseSessionStorage()&&this._config.enableSessionStorageBuffer()?new l.SessionStorageSendBuffer(e):new l.ArraySendBuffer(e),!this._config.isBeaconApiDisabled()&&l.Util.IsBeaconApiSupported())?this._sender=this._beaconSender:\"undefined\"!=typeof XMLHttpRequest&&(\"withCredentials\"in new XMLHttpRequest?(this._sender=this._xhrSender,this._XMLHttpRequestSupported=!0):\"undefined\"!=typeof XDomainRequest&&(this._sender=this._xdrSender))}return e.prototype.send=function(e){try{if(this._config.disableTelemetry())return;if(!e)return void l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.CannotSendEmptyTelemetry,\"Cannot send empty telemetry\");if(!this._sender)return void l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.SenderNotInitialized,\"Sender was not initialized\");var t=l.Serializer.serialize(e),n=this._buffer.getItems(),i=this._buffer.batchPayloads(n);i&&i.length+t.length>this._config.maxBatchSizeInBytes()&&this.triggerSend(),this._buffer.enqueue(t),this._setupTimer()}catch(o){l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.FailedAddingTelemetryToBuffer,\"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \"+l.Util.getExceptionName(o),{exception:l.Util.dump(o)})}},e.prototype._setupTimer=function(){var e=this;if(!this._timeoutHandle){var t=this._retryAt?Math.max(0,this._retryAt-Date.now()):0,n=Math.max(this._config.maxBatchInterval(),t);this._timeoutHandle=setTimeout(function(){e.triggerSend()},n)}},e.prototype._getSizeInBytes=function(e){var t=0;if(e&&e.length)for(var n=0;n<e.length;n++){var i=e[n];i&&i.length&&(t+=i.length)}return t},e.prototype.triggerSend=function(e){void 0===e&&(e=!0);try{if(this._config.disableTelemetry())this._buffer.clear();else{if(0<this._buffer.count()){var t=this._buffer.getItems();this._sender(t,e)}this._lastSend=+new Date}clearTimeout(this._timeoutHandle),this._timeoutHandle=null,this._retryAt=null}catch(n){(!l.Util.getIEVersion()||9<l.Util.getIEVersion())&&l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.TransmissionFailed,\"Telemetry transmission failed, some telemetry will be lost: \"+l.Util.getExceptionName(n),{exception:l.Util.dump(n)})}},e.prototype._setRetryTime=function(){var e;if(this._consecutiveErrors<=1)e=10;else{var t=(Math.pow(2,this._consecutiveErrors)-1)/2,n=Math.floor(Math.random()*t*10)+1;e=Math.max(Math.min(n,3600),10)}var i=Date.now()+1e3*e;this._retryAt=i},e.prototype._parseResponse=function(e){try{if(e&&\"\"!==e){var t=JSON.parse(e);if(t&&t.itemsReceived&&t.itemsReceived>=t.itemsAccepted&&t.itemsReceived-t.itemsAccepted==t.errors.length)return t}}catch(n){l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.InvalidBackendResponse,\"Cannot parse the response. \"+l.Util.getExceptionName(n),{response:e})}return null},e.prototype._isRetriable=function(e){return 408==e||429==e||500==e||503==e},e.prototype._resendPayload=function(e){if(e&&0!==e.length){this._buffer.clearSent(e),this._consecutiveErrors++;for(var t=0,n=e;t<n.length;t++){var i=n[t];this._buffer.enqueue(i)}this._setRetryTime(),this._setupTimer()}},e.prototype._formatErrorMessageXhr=function(e,t){return e?\"XMLHttpRequest,Status:\"+e.status+\",Response:\"+e.responseText||e.response||\"\":t},e.prototype._formatErrorMessageXdr=function(e,t){return e?\"XDomainRequest,Response:\"+e.responseText||\"\":t},e.prototype._xhrSender=function(t,e){var n=this,i=new XMLHttpRequest;i[l.AjaxMonitor.DisabledPropertyName]=!0,i.open(\"POST\",this._config.endpointUrl(),e),i.setRequestHeader(\"Content-type\",\"application/json\"),l.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())&&i.setRequestHeader(l.RequestHeaders.sdkContextHeader,l.RequestHeaders.sdkContextHeaderAppIdRequest),i.onreadystatechange=function(){return n._xhrReadyStateChange(i,t,t.length)},i.onerror=function(e){return n._onError(t,n._formatErrorMessageXhr(i),e)};var o=this._buffer.batchPayloads(t);i.send(o),this._buffer.markAsSent(t)},e.prototype._xdrSender=function(t,e){var n=this,i=new XDomainRequest;i.onload=function(){return n._xdrOnLoad(i,t)},i.onerror=function(e){return n._onError(t,n._formatErrorMessageXdr(i),e)};var o=window.location.protocol;if(0!==this._config.endpointUrl().lastIndexOf(o,0))return l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.TransmissionFailed,\". Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\"),void this._buffer.clear();var a=this._config.endpointUrl().replace(/^(https?:)/,\"\");i.open(\"POST\",a);var r=this._buffer.batchPayloads(t);i.send(r),this._buffer.markAsSent(t)},e.prototype._beaconSender=function(e,t){var n=this._config.endpointUrl(),i=this._buffer.batchPayloads(e),o=new Blob([i],{type:\"text/plain;charset=UTF-8\"});navigator.sendBeacon(n,o)?this._buffer.markAsSent(e):l._InternalLogging.throwInternal(l.LoggingSeverity.CRITICAL,l._InternalMessageId.TransmissionFailed,\". Failed to send telemetry with Beacon API.\")},e.prototype._xhrReadyStateChange=function(e,t,n){if(4===e.readyState){var i=null;this._appId||(i=this._parseResponse(e.responseText||e.response))&&i.appId&&(this._appId=i.appId),(e.status<200||300<=e.status)&&0!==e.status?!this._config.isRetryDisabled()&&this._isRetriable(e.status)?(this._resendPayload(t),l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.TransmissionFailed,\". Response code \"+e.status+\". Will retry to send \"+t.length+\" items.\")):this._onError(t,this._formatErrorMessageXhr(e)):206===e.status?(i||(i=this._parseResponse(e.responseText||e.response)),i&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,i):this._onError(t,this._formatErrorMessageXhr(e))):(this._consecutiveErrors=0,this._onSuccess(t,n))}},e.prototype._xdrOnLoad=function(e,t){if(!e||e.responseText+\"\"!=\"200\"&&\"\"!==e.responseText){var n=this._parseResponse(e.responseText);n&&n.itemsReceived&&n.itemsReceived>n.itemsAccepted&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,n):this._onError(t,this._formatErrorMessageXdr(e))}else this._consecutiveErrors=0,this._onSuccess(t,0)},e.prototype._onPartialSuccess=function(e,t){for(var n=[],i=[],o=0,a=t.errors.reverse();o<a.length;o++){var r=a[o],s=e.splice(r.index,1)[0];this._isRetriable(r.statusCode)?i.push(s):n.push(s)}0<e.length&&this._onSuccess(e,t.itemsAccepted),0<n.length&&this._onError(n,this._formatErrorMessageXhr(null,[\"partial success\",t.itemsAccepted,\"of\",t.itemsReceived].join(\" \"))),0<i.length&&(this._resendPayload(i),l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.TransmissionFailed,\"Partial success. Delivered: \"+e.length+\", Failed: \"+n.length+\". Will retry to send \"+i.length+\" our of \"+t.itemsReceived+\" items\"))},e.prototype._onError=function(e,t,n){l._InternalLogging.throwInternal(l.LoggingSeverity.WARNING,l._InternalMessageId.OnError,\"Failed to send telemetry.\",{message:t}),this._buffer.clearSent(e)},e.prototype._onSuccess=function(e,t){this._buffer.clearSent(e)},e.MaxBeaconPayloadSize=65536,e}(),l.Sender=t}(Microsoft||(Microsoft={})),function(e){var t=function(t){function e(){var e=t.call(this)||this;return e.ver=2,e.properties={},e}return __extends(e,t),e}(Microsoft.Telemetry.Domain);e.MessageData=t}(AI||(AI={})),function(e){var a,r,t;a=e.ApplicationInsights||(e.ApplicationInsights={}),r=a.Telemetry||(a.Telemetry={}),t=function(o){function e(e,t,n){var i=o.call(this)||this;return i.aiDataContract={ver:a.FieldType.Required,message:a.FieldType.Required,severityLevel:a.FieldType.Default,properties:a.FieldType.Default},e=e||a.Util.NotSpecified,i.message=r.Common.DataSanitizer.sanitizeMessage(e),i.properties=r.Common.DataSanitizer.sanitizeProperties(t),n&&(i.severityLevel=n),i}return __extends(e,o),e.envelopeType=\"Microsoft.ApplicationInsights.{0}.Message\",e.dataType=\"MessageData\",e}(AI.MessageData),r.Trace=t}(Microsoft||(Microsoft={})),function(e){var a,t,n;a=e.ApplicationInsights||(e.ApplicationInsights={}),t=a.Telemetry||(a.Telemetry={}),n=function(o){function e(e,t,n){var i=o.call(this)||this;return i.aiDataContract={ver:a.FieldType.Required,name:a.FieldType.Required,properties:a.FieldType.Default,measurements:a.FieldType.Default},i.name=a.Telemetry.Common.DataSanitizer.sanitizeString(e)||a.Util.NotSpecified,i.properties=a.Telemetry.Common.DataSanitizer.sanitizeProperties(t),i.measurements=a.Telemetry.Common.DataSanitizer.sanitizeMeasurements(n),i}return __extends(e,o),e.envelopeType=\"Microsoft.ApplicationInsights.{0}.Event\",e.dataType=\"EventData\",e}(AI.EventData),t.Event=n}(Microsoft||(Microsoft={})),function(e){var t=function n(){this.hasFullStack=!0,this.parsedStack=[]};(AI||(AI={})).ExceptionDetails=t}(),function(e){var t=function(t){function e(){var e=t.call(this)||this;return e.ver=2,e.exceptions=[],e.properties={},e.measurements={},e}return __extends(e,t),e}(Microsoft.Telemetry.Domain);e.ExceptionData=t}(AI||(AI={})),function(e){var t=function n(){};(AI||(AI={})).StackFrame=t}(),function(e){var s;(function(o){var e=function(a){function e(e,t,n,i){var o=a.call(this)||this;return o.aiDataContract={ver:s.FieldType.Required,exceptions:s.FieldType.Required,severityLevel:s.FieldType.Default,properties:s.FieldType.Default,measurements:s.FieldType.Default},o.properties=s.Telemetry.Common.DataSanitizer.sanitizeProperties(t),o.measurements=s.Telemetry.Common.DataSanitizer.sanitizeMeasurements(n),o.exceptions=[new r(e)],i&&(o.severityLevel=i),o}return __extends(e,a),e.CreateSimpleException=function(e,t,n,i,o,a){return{exceptions:[{hasFullStack:!0,message:e,stack:o,typeName:t}]}},e.envelopeType=\"Microsoft.ApplicationInsights.{0}.Exception\",e.dataType=\"ExceptionData\",e}(AI.ExceptionData);o.Exception=e;var r=function(i){function e(e){var t=i.call(this)||this;t.aiDataContract={id:s.FieldType.Default,outerId:s.FieldType.Default,typeName:s.FieldType.Required,message:s.FieldType.Required,hasFullStack:s.FieldType.Default,stack:s.FieldType.Default,parsedStack:s.FieldType.Array},t.typeName=o.Common.DataSanitizer.sanitizeString(e.name)||s.Util.NotSpecified,t.message=o.Common.DataSanitizer.sanitizeMessage(e.message)||s.Util.NotSpecified;var n=e.stack;return t.parsedStack=t.parseStack(n),t.stack=o.Common.DataSanitizer.sanitizeException(n),t.hasFullStack=s.Util.isArray(t.parsedStack)&&0<t.parsedStack.length,t}return __extends(e,i),e.prototype.parseStack=function(e){var t=undefined;if(\"string\"==typeof e){var n=e.split(\"\\n\");t=[];for(var i=0,o=0,a=0;a<=n.length;a++){var r=n[a];if(f.regex.test(r)){var s=new f(n[a],i++);o+=s.sizeInBytes,t.push(s)}}if(32768<o)for(var l=0,c=t.length-1,g=0,u=l,p=c;l<c;){if(32768<(g+=t[l].sizeInBytes+t[c].sizeInBytes)){var d=p-u+1;t.splice(u,d);break}u=l,p=c,l++,c--}}return t},e}(AI.ExceptionDetails),f=function(o){function a(e,t){var n=o.call(this)||this;n.sizeInBytes=0,n.aiDataContract={level:s.FieldType.Required,method:s.FieldType.Required,assembly:s.FieldType.Default,fileName:s.FieldType.Default,line:s.FieldType.Default},n.level=t,n.method=\"<no_method>\",n.assembly=s.Util.trim(e);var i=e.match(a.regex);return i&&5<=i.length&&(n.method=s.Util.trim(i[2])||n.method,n.fileName=s.Util.trim(i[4]),n.line=parseInt(i[5])||0),n.sizeInBytes+=n.method.length,n.sizeInBytes+=n.fileName.length,n.sizeInBytes+=n.assembly.length,n.sizeInBytes+=a.baseSize,n.sizeInBytes+=n.level.toString().length,n.sizeInBytes+=n.line.toString().length,n}return __extends(a,o),a.regex=/^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/,a.baseSize=58,a}(AI.StackFrame);o._StackFrame=f})((s=e.ApplicationInsights||(e.ApplicationInsights={})).Telemetry||(s.Telemetry={}))}(Microsoft||(Microsoft={})),function(e){var t;(t=e.DataPointType||(e.DataPointType={}))[t.Measurement=0]=\"Measurement\",t[t.Aggregation=1]=\"Aggregation\"}(AI||(AI={})),function(e){var t=function n(){this.kind=e.DataPointType.Measurement};e.DataPoint=t}(AI||(AI={})),function(e){var t=function(t){function e(){var e=t.call(this)||this;return e.ver=2,e.metrics=[],e.properties={},e}return __extends(e,t),e}(Microsoft.Telemetry.Domain);e.MetricData=t}(AI||(AI={})),function(e){var n,t,i,o;n=e.ApplicationInsights||(e.ApplicationInsights={}),t=n.Telemetry||(n.Telemetry={}),i=t.Common||(t.Common={}),o=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.aiDataContract={name:n.FieldType.Required,kind:n.FieldType.Default,value:n.FieldType.Required,count:n.FieldType.Default,min:n.FieldType.Default,max:n.FieldType.Default,stdDev:n.FieldType.Default},e}return __extends(e,t),e}(AI.DataPoint),i.DataPoint=o}(Microsoft||(Microsoft={})),function(c){var g,u,e;g=c.ApplicationInsights||(c.ApplicationInsights={}),u=g.Telemetry||(g.Telemetry={}),e=function(l){function e(e,t,n,i,o,a){var r=l.call(this)||this;r.aiDataContract={ver:g.FieldType.Required,metrics:g.FieldType.Required,properties:g.FieldType.Default};var s=new c.ApplicationInsights.Telemetry.Common.DataPoint;return s.count=0<n?n:undefined,s.max=isNaN(o)||null===o?undefined:o,s.min=isNaN(i)||null===i?undefined:i,s.name=u.Common.DataSanitizer.sanitizeString(e)||g.Util.NotSpecified,s.value=t,r.metrics=[s],r.properties=g.Telemetry.Common.DataSanitizer.sanitizeProperties(a),r}return __extends(e,l),e.envelopeType=\"Microsoft.ApplicationInsights.{0}.Metric\",e.dataType=\"MetricData\",e}(AI.MetricData),u.Metric=e}(Microsoft||(Microsoft={})),function(e){var l,c,t;l=e.ApplicationInsights||(e.ApplicationInsights={}),c=l.Telemetry||(l.Telemetry={}),t=function(s){function e(e,t,n,i,o,a){var r=s.call(this)||this;return r.aiDataContract={ver:l.FieldType.Required,name:l.FieldType.Default,url:l.FieldType.Default,duration:l.FieldType.Default,properties:l.FieldType.Default,measurements:l.FieldType.Default,id:l.FieldType.Default},r.id=c.Common.DataSanitizer.sanitizeId(a),r.url=c.Common.DataSanitizer.sanitizeUrl(t),r.name=c.Common.DataSanitizer.sanitizeString(e)||l.Util.NotSpecified,isNaN(n)||(r.duration=l.Util.msToTimeSpan(n)),r.properties=l.Telemetry.Common.DataSanitizer.sanitizeProperties(i),r.measurements=l.Telemetry.Common.DataSanitizer.sanitizeMeasurements(o),r}return __extends(e,s),e.envelopeType=\"Microsoft.ApplicationInsights.{0}.Pageview\",e.dataType=\"PageviewData\",e}(AI.PageViewData),c.PageView=t}(Microsoft||(Microsoft={})),function(e){var t=function(t){function e(){var e=t.call(this)||this;return e.ver=2,e.properties={},e.measurements={},e}return __extends(e,t),e}(e.PageViewData);e.PageViewPerfData=t}(AI||(AI={})),function(e){var f,h,t;f=e.ApplicationInsights||(e.ApplicationInsights={}),h=f.Telemetry||(f.Telemetry={}),t=function(p){function d(e,t,n,i,o){var a=p.call(this)||this;a.aiDataContract={ver:f.FieldType.Required,name:f.FieldType.Default,url:f.FieldType.Default,duration:f.FieldType.Default,perfTotal:f.FieldType.Default,networkConnect:f.FieldType.Default,sentRequest:f.FieldType.Default,receivedResponse:f.FieldType.Default,domProcessing:f.FieldType.Default,properties:f.FieldType.Default,measurements:f.FieldType.Default},a.isValid=!1;var r=d.getPerformanceTiming();if(r){var s=d.getDuration(r.navigationStart,r.loadEventEnd),l=d.getDuration(r.navigationStart,r.connectEnd),c=d.getDuration(r.requestStart,r.responseStart),g=d.getDuration(r.responseStart,r.responseEnd),u=d.getDuration(r.responseEnd,r.loadEventEnd);0==s?f._InternalLogging.throwInternal(f.LoggingSeverity.WARNING,f._InternalMessageId.ErrorPVCalc,\"error calculating page view performance.\",{total:s,network:l,request:c,response:g,dom:u}):d.shouldCollectDuration(s,l,c,g,u)?s<Math.floor(l)+Math.floor(c)+Math.floor(g)+Math.floor(u)?f._InternalLogging.throwInternal(f.LoggingSeverity.WARNING,f._InternalMessageId.ClientPerformanceMathError,\"client performance math error.\",{total:s,network:l,request:c,response:g,dom:u}):(a.durationMs=s,a.perfTotal=a.duration=f.Util.msToTimeSpan(s),a.networkConnect=f.Util.msToTimeSpan(l),a.sentRequest=f.Util.msToTimeSpan(c),a.receivedResponse=f.Util.msToTimeSpan(g),a.domProcessing=f.Util.msToTimeSpan(u),a.isValid=!0):f._InternalLogging.throwInternal(f.LoggingSeverity.WARNING,f._InternalMessageId.InvalidDurationValue,\"Invalid page load duration value. Browser perf data won't be sent.\",{total:s,network:l,request:c,response:g,dom:u})}return a.url=h.Common.DataSanitizer.sanitizeUrl(t),a.name=h.Common.DataSanitizer.sanitizeString(e)||f.Util.NotSpecified,a.properties=f.Telemetry.Common.DataSanitizer.sanitizeProperties(i),a.measurements=f.Telemetry.Common.DataSanitizer.sanitizeMeasurements(o),a}return __extends(d,p),d.prototype.getIsValid=function(){return this.isValid},d.prototype.getDurationMs=function(){return this.durationMs},d.getPerformanceTiming=function(){return d.isPerformanceTimingSupported()?window.performance.timing:null},d.isPerformanceTimingSupported=function(){return\"undefined\"!=typeof window&&window.performance&&window.performance.timing},d.isPerformanceTimingDataReady=function(){var e=window.performance.timing;return 0<e.domainLookupStart&&0<e.navigationStart&&0<e.responseStart&&0<e.requestStart&&0<e.loadEventEnd&&0<e.responseEnd&&0<e.connectEnd&&0<e.domLoading},d.getDuration=function(e,t){var n=undefined;return isNaN(e)||isNaN(t)||(n=Math.max(t-e,0)),n},d.shouldCollectDuration=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=[\"googlebot\",\"adsbot-google\",\"apis-google\",\"mediapartners-google\"],i=navigator.userAgent,o=!1;if(i)for(var a=0;a<n.length;a++)o=o||-1!==i.toLowerCase().indexOf(n[a]);if(o)return!1;for(var r=0;r<e.length;r++)if(e[r]>=d.MAX_DURATION_ALLOWED)return!1;return!0},d.envelopeType=\"Microsoft.ApplicationInsights.{0}.PageviewPerformance\",d.dataType=\"PageviewPerformanceData\",d.MAX_DURATION_ALLOWED=36e5,d}(AI.PageViewPerfData),h.PageViewPerformance=t}(Microsoft||(Microsoft={})),function(o){var s,e;s=o.ApplicationInsights||(o.ApplicationInsights={}),e=function(){function e(e){var t=this;this._config=e,this._sender=new s.Sender(e),this.appId=function(){return t._sender._appId},e.appId()&&(this._sender._appId=e.appId()),this.telemetryInitializers=[],\"undefined\"!=typeof window&&(this._sessionManager=new s.Context._SessionManager(e),this.application=new s.Context.Application,this.device=new s.Context.Device,this.internal=new s.Context.Internal(e),this.location=new s.Context.Location,this.user=new s.Context.User(e),this.operation=new s.Context.Operation,this.session=new s.Context.Session,this.sample=new s.Context.Sample(e.sampleRate())),this._addDefaultTelemetryInitializers()}return e.prototype.addTelemetryInitializer=function(e){this.telemetryInitializers.push(e)},e.prototype.track=function(e){return e?(e.name===s.Telemetry.PageView.envelopeType&&s._InternalLogging.resetInternalMessageCount(),this.session&&\"string\"!=typeof this.session.id&&this._sessionManager.update(),this._track(e)):s._InternalLogging.throwInternal(s.LoggingSeverity.CRITICAL,s._InternalMessageId.TrackArgumentsNotSpecified,\"cannot call .track() with a null or undefined argument\",null,!0),e},e.prototype._addDefaultTelemetryInitializers=function(){if(!this._config.isBrowserLinkTrackingEnabled()){var i=[\"/browserLinkSignalR/\",\"/__browserLink/\"];this.addTelemetryInitializer(function(e){if(e.name===o.ApplicationInsights.Telemetry.RemoteDependencyData.envelopeType){var t=e.data;if(t&&t.baseData)for(var n=0;n<i.length;n++)if(0<=t.baseData.name.indexOf(i[n]))return!1}return!0})}},e.prototype._track=function(e){this.session&&(\"string\"==typeof this.session.id?this._applySessionContext(e,this.session):this._applySessionContext(e,this._sessionManager.automaticSession)),this._applyApplicationContext(e,this.application),this._applyDeviceContext(e,this.device),this._applyInternalContext(e,this.internal),this._applyLocationContext(e,this.location),this._applySampleContext(e,this.sample),this._applyUserContext(e,this.user),this._applyOperationContext(e,this.operation),e.iKey=this._config.instrumentationKey();var t=!1;try{for(var n=this.telemetryInitializers.length,i=0;i<n;++i){var o=this.telemetryInitializers[i];if(o&&!1===o.apply(null,[e])){t=!0;break}}}catch(r){t=!0,s._InternalLogging.throwInternal(s.LoggingSeverity.CRITICAL,s._InternalMessageId.TelemetryInitializerFailed,\"One of telemetry initializers failed, telemetry item will not be sent: \"+s.Util.getExceptionName(r),{exception:s.Util.dump(r)},!0)}if(!t)if(e.name===s.Telemetry.Metric.envelopeType||this.sample.isSampledIn(e)){var a=this._config.instrumentationKey().replace(/-/g,\"\");e.name=e.name.replace(\"{0}\",a),this._sender.send(e)}else s._InternalLogging.throwInternal(s.LoggingSeverity.WARNING,s._InternalMessageId.TelemetrySampledAndNotSent,\"Telemetry is sampled and not sent to the AI service.\",{SampleRate:this.sample.sampleRate},!0);return e},e.prototype._applyApplicationContext=function(e,t){if(t){var n=new AI.ContextTagKeys;\"string\"==typeof t.ver&&(e.tags[n.applicationVersion]=t.ver),\"string\"==typeof t.build&&(e.tags[n.applicationBuild]=t.build)}},e.prototype._applyDeviceContext=function(e,t){var n=new AI.ContextTagKeys;t&&(\"string\"==typeof t.id&&(e.tags[n.deviceId]=t.id),\"string\"==typeof t.ip&&(e.tags[n.deviceIp]=t.ip),\"string\"==typeof t.language&&(e.tags[n.deviceLanguage]=t.language),\"string\"==typeof t.locale&&(e.tags[n.deviceLocale]=t.locale),\"string\"==typeof t.model&&(e.tags[n.deviceModel]=t.model),\"undefined\"!=typeof t.network&&(e.tags[n.deviceNetwork]=t.network),\"string\"==typeof t.oemName&&(e.tags[n.deviceOEMName]=t.oemName),\"string\"==typeof t.os&&(e.tags[n.deviceOS]=t.os),\"string\"==typeof t.osversion&&(e.tags[n.deviceOSVersion]=t.osversion),\"string\"==typeof t.resolution&&(e.tags[n.deviceScreenResolution]=t.resolution),\"string\"==typeof t.type&&(e.tags[n.deviceType]=t.type))},e.prototype._applyInternalContext=function(e,t){if(t){var n=new AI.ContextTagKeys;\"string\"==typeof t.agentVersion&&(e.tags[n.internalAgentVersion]=t.agentVersion),\"string\"==typeof t.sdkVersion&&(e.tags[n.internalSdkVersion]=t.sdkVersion)}},e.prototype._applyLocationContext=function(e,t){if(t){var n=new AI.ContextTagKeys;\"string\"==typeof t.ip&&(e.tags[n.locationIp]=t.ip)}},e.prototype._applyOperationContext=function(e,t){if(t){var n=new AI.ContextTagKeys;\"string\"==typeof t.id&&(e.tags[n.operationId]=t.id),\"string\"==typeof t.name&&(e.tags[n.operationName]=t.name),\"string\"==typeof t.parentId&&(e.tags[n.operationParentId]=t.parentId),\"string\"==typeof t.rootId&&(e.tags[n.operationRootId]=t.rootId),\"string\"==typeof t.syntheticSource&&(e.tags[n.operationSyntheticSource]=t.syntheticSource)}},e.prototype._applySampleContext=function(e,t){t&&(e.sampleRate=t.sampleRate)},e.prototype._applySessionContext=function(e,t){if(t){var n=new AI.ContextTagKeys;\"string\"==typeof t.id&&(e.tags[n.sessionId]=t.id),\"undefined\"!=typeof t.isFirst&&(e.tags[n.sessionIsFirst]=t.isFirst)}},e.prototype._applyUserContext=function(e,t){if(t){var n=new AI.ContextTagKeys;\"string\"==typeof t.accountId&&(e.tags[n.userAccountId]=t.accountId),\"string\"==typeof t.agent&&(e.tags[n.userAgent]=t.agent),\"string\"==typeof t.id&&(e.tags[n.userId]=t.id),\"string\"==typeof t.authenticatedId&&(e.tags[n.userAuthUserId]=t.authenticatedId),\"string\"==typeof t.storeRegion&&(e.tags[n.userStoreRegion]=t.storeRegion)}},e}(),s.TelemetryContext=e}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.Telemetry||(e.Telemetry={}),n=function(e){function t(){return e.call(this)||this}return __extends(t,e),t}(e.Telemetry.Base),t.Data=n}(Microsoft||(Microsoft={})),function(e){var o,t,n,i;o=e.ApplicationInsights||(e.ApplicationInsights={}),t=o.Telemetry||(o.Telemetry={}),n=t.Common||(t.Common={}),i=function(i){function e(e,t){var n=i.call(this)||this;return n.aiDataContract={baseType:o.FieldType.Required,baseData:o.FieldType.Required},n.baseType=e,n.baseData=t,n}return __extends(e,i),e}(e.Telemetry.Data),n.Data=i}(Microsoft||(Microsoft={})),function(e){var u,p,t;u=e.ApplicationInsights||(e.ApplicationInsights={}),p=u.Telemetry||(u.Telemetry={}),t=function(){function e(e,t){this.pageViewPerformanceSent=!1,this.overridePageViewDuration=!1,this.overridePageViewDuration=t,this.appInsights=e}return e.prototype.trackPageView=function(n,i,o,a,e){var r=this;\"string\"!=typeof n&&(n=window.document&&window.document.title||\"\"),\"string\"!=typeof i&&(i=window.location&&window.location.href||\"\");var s=!1,l=undefined;if(p.PageViewPerformance.isPerformanceTimingSupported()){var c=p.PageViewPerformance.getPerformanceTiming().navigationStart;l=p.PageViewPerformance.getDuration(c,+new Date),p.PageViewPerformance.shouldCollectDuration(l)||(l=undefined)}else this.appInsights.sendPageViewInternal(n,i,isNaN(e)?undefined:e,o,a),this.appInsights.flush(),s=!0;if(s||!this.overridePageViewDuration&&isNaN(e)||(this.appInsights.sendPageViewInternal(n,i,isNaN(e)?l:e,o,a),this.appInsights.flush(),s=!0),p.PageViewPerformance.isPerformanceTimingSupported())var g=setInterval(function(){try{if(p.PageViewPerformance.isPerformanceTimingDataReady()){clearInterval(g);var e=new p.PageViewPerformance(n,i,null,o,a);e.getIsValid()||s?(s||r.appInsights.sendPageViewInternal(n,i,e.getDurationMs(),o,a),r.pageViewPerformanceSent||(r.appInsights.sendPageViewPerformanceInternal(e),r.pageViewPerformanceSent=!0)):r.appInsights.sendPageViewInternal(n,i,l,o,a),r.appInsights.flush()}else 6e4<p.PageViewPerformance.getDuration(c,+new Date)&&(clearInterval(g),s||(r.appInsights.sendPageViewInternal(n,i,6e4,o,a),r.appInsights.flush()))}catch(t){u._InternalLogging.throwInternal(u.LoggingSeverity.CRITICAL,u._InternalMessageId.TrackPVFailedCalc,\"trackPageView failed on page load calculation: \"+u.Util.getExceptionName(t),{exception:u.Util.dump(t)})}},100);else u._InternalLogging.throwInternal(u.LoggingSeverity.WARNING,u._InternalMessageId.NavigationTimingNotSupported,\"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\")},e}(),p.PageViewManager=t}(Microsoft||(Microsoft={})),function(e){var r;(function(e){var t=function(){function e(e){this.prevPageVisitDataKeyName=\"prevPageVisitData\",this.pageVisitTimeTrackingHandler=e}return e.prototype.trackPreviousPageVisit=function(e,t){try{var n=this.restartPageVisitTimer(e,t);n&&this.pageVisitTimeTrackingHandler(n.pageName,n.pageUrl,n.pageVisitTime)}catch(i){r._InternalLogging.warnToConsole(\"Auto track page visit time failed, metric will not be collected: \"+r.Util.dump(i))}},e.prototype.restartPageVisitTimer=function(e,t){try{var n=this.stopPageVisitTimer();return this.startPageVisitTimer(e,t),n}catch(i){return r._InternalLogging.warnToConsole(\"Call to restart failed: \"+r.Util.dump(i)),null}},e.prototype.startPageVisitTimer=function(e,t){try{if(r.Util.canUseSessionStorage()){if(null!=r.Util.getSessionStorage(this.prevPageVisitDataKeyName))throw new Error(\"Cannot call startPageVisit consecutively without first calling stopPageVisit\");var n=new a(e,t),i=JSON.stringify(n);r.Util.setSessionStorage(this.prevPageVisitDataKeyName,i)}}catch(o){r._InternalLogging.warnToConsole(\"Call to start failed: \"+r.Util.dump(o))}},e.prototype.stopPageVisitTimer=function(){try{if(r.Util.canUseSessionStorage()){var e=Date.now(),t=r.Util.getSessionStorage(this.prevPageVisitDataKeyName);if(t){var n=JSON.parse(t);return n.pageVisitTime=e-n.pageVisitStartTime,r.Util.removeSessionStorage(this.prevPageVisitDataKeyName),n}return null}return null}catch(i){return r._InternalLogging.warnToConsole(\"Stop page visit timer failed: \"+r.Util.dump(i)),null}},e}();e.PageVisitTimeManager=t;var a=function n(e,t){this.pageVisitStartTime=Date.now(),this.pageName=e,this.pageUrl=t};e.PageVisitData=a})((r=e.ApplicationInsights||(e.ApplicationInsights={})).Telemetry||(r.Telemetry={}))}(Microsoft||(Microsoft={})),function(e){var t,n;t=e.ApplicationInsights||(e.ApplicationInsights={}),n=function(){function e(){this.hashCodeGeneragor=new t.HashCodeScoreGenerator}return e.prototype.isEnabled=function(e,t){return this.hashCodeGeneragor.getHashCodeScore(e)<t},e}(),t.SplitTest=n}(Microsoft||(Microsoft={})),function(r){!function(p){p.Version=\"1.0.21\";var e=function(){function o(e){var l=this;this._trackAjaxAttempts=0,this.config=e||{};var t=o.defaultConfig;if(t!==undefined)for(var n in t)this.config[n]===undefined&&(this.config[n]=t[n]);p._InternalLogging.verboseLogging=function(){return l.config.verboseLogging},p._InternalLogging.enableDebugExceptions=function(){return l.config.enableDebug};var i={instrumentationKey:function(){return l.config.instrumentationKey},accountId:function(){return l.config.accountId},sessionRenewalMs:function(){return l.config.sessionRenewalMs},sessionExpirationMs:function(){return l.config.sessionExpirationMs},endpointUrl:function(){return l.config.endpointUrl},emitLineDelimitedJson:function(){return l.config.emitLineDelimitedJson},maxBatchSizeInBytes:function(){return!l.config.isBeaconApiDisabled&&p.Util.IsBeaconApiSupported()?Math.min(l.config.maxBatchSizeInBytes,p.Sender.MaxBeaconPayloadSize):l.config.maxBatchSizeInBytes},maxBatchInterval:function(){return l.config.maxBatchInterval},disableTelemetry:function(){return l.config.disableTelemetry},sampleRate:function(){return l.config.samplingPercentage},cookieDomain:function(){return l.config.cookieDomain},enableSessionStorageBuffer:function(){return(l.config.isBeaconApiDisabled||!p.Util.IsBeaconApiSupported())&&l.config.enableSessionStorageBuffer},isRetryDisabled:function(){return l.config.isRetryDisabled},isBeaconApiDisabled:function(){return l.config.isBeaconApiDisabled},sdkExtension:function(){return l.config.sdkExtension},isBrowserLinkTrackingEnabled:function(){return l.config.isBrowserLinkTrackingEnabled},appId:function(){return l.config.appId}};this.config.isCookieUseDisabled&&p.Util.disableCookies(),this.config.isStorageUseDisabled&&p.Util.disableStorage(),this.context=new p.TelemetryContext(i),this._pageViewManager=new r.ApplicationInsights.Telemetry.PageViewManager(this,this.config.overridePageViewDuration),this._eventTracking=new a(\"trackEvent\"),this._eventTracking.action=function(e,t,n,i,o){o?isNaN(o.duration)&&(o.duration=n):o={duration:n};var a=new p.Telemetry.Event(e,i,o),r=new p.Telemetry.Common.Data(p.Telemetry.Event.dataType,a),s=new p.Telemetry.Common.Envelope(r,p.Telemetry.Event.envelopeType);l.context.track(s)},this._pageTracking=new a(\"trackPageView\"),this._pageTracking.action=function(e,t,n,i,o){l.sendPageViewInternal(e,t,n,i,o)},this._pageVisitTimeManager=new p.Telemetry.PageVisitTimeManager(function(e,t,n){return l.trackPageVisitTime(e,t,n)}),this.config.disableAjaxTracking||(this._ajaxMonitor=new r.ApplicationInsights.AjaxMonitor(this))}return o.prototype.sendPageViewInternal=function(e,t,n,i,o){var a=new p.Telemetry.PageView(e,t,n,i,o,this.context.operation.id),r=new p.Telemetry.Common.Data(p.Telemetry.PageView.dataType,a),s=new p.Telemetry.Common.Envelope(r,p.Telemetry.PageView.envelopeType);this.context.track(s),this._trackAjaxAttempts=0},o.prototype.sendPageViewPerformanceInternal=function(e){var t=new p.Telemetry.Common.Data(p.Telemetry.PageViewPerformance.dataType,e),n=new p.Telemetry.Common.Envelope(t,p.Telemetry.PageViewPerformance.envelopeType);this.context.track(n)},o.prototype.startTrackPage=function(e){try{\"string\"!=typeof e&&(e=window.document&&window.document.title||\"\"),this._pageTracking.start(e)}catch(t){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.StartTrackFailed,\"startTrackPage failed, page view may not be collected: \"+p.Util.getExceptionName(t),{exception:p.Util.dump(t)})}},o.prototype.stopTrackPage=function(e,t,n,i){try{\"string\"!=typeof e&&(e=window.document&&window.document.title||\"\"),\"string\"!=typeof t&&(t=window.location&&window.location.href||\"\"),this._pageTracking.stop(e,t,n,i),this.config.autoTrackPageVisitTime&&this._pageVisitTimeManager.trackPreviousPageVisit(e,t)}catch(o){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.StopTrackFailed,\"stopTrackPage failed, page view will not be collected: \"+p.Util.getExceptionName(o),{exception:p.Util.dump(o)})}},o.prototype.trackPageView=function(e,t,n,i,o){try{this._pageViewManager.trackPageView(e,t,n,i,o),this.config.autoTrackPageVisitTime&&this._pageVisitTimeManager.trackPreviousPageVisit(e,t)}catch(a){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.TrackPVFailed,\"trackPageView failed, page view will not be collected: \"+p.Util.getExceptionName(a),{exception:p.Util.dump(a)})}},o.prototype.startTrackEvent=function(e){try{this._eventTracking.start(e)}catch(t){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.StartTrackEventFailed,\"startTrackEvent failed, event will not be collected: \"+p.Util.getExceptionName(t),{exception:p.Util.dump(t)})}},o.prototype.stopTrackEvent=function(e,t,n){try{this._eventTracking.stop(e,undefined,t,n)}catch(i){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.StopTrackEventFailed,\"stopTrackEvent failed, event will not be collected: \"+p.Util.getExceptionName(i),{exception:p.Util.dump(i)})}},o.prototype.trackEvent=function(e,t,n){try{var i=new p.Telemetry.Event(e,t,n),o=new p.Telemetry.Common.Data(p.Telemetry.Event.dataType,i),a=new p.Telemetry.Common.Envelope(o,p.Telemetry.Event.envelopeType);this.context.track(a)}catch(r){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.TrackEventFailed,\"trackEvent failed, event will not be collected: \"+p.Util.getExceptionName(r),{exception:p.Util.dump(r)})}},o.prototype.trackDependency=function(e,t,n,i,o,a,r,s,l){if(-1===this.config.maxAjaxCallsPerView||this._trackAjaxAttempts<this.config.maxAjaxCallsPerView){var c=new p.Telemetry.RemoteDependencyData(e,n,i,o,a,r,t,s,l),g=new p.Telemetry.Common.Data(p.Telemetry.RemoteDependencyData.dataType,c),u=new p.Telemetry.Common.Envelope(g,p.Telemetry.RemoteDependencyData.envelopeType);this.context.track(u)}else this._trackAjaxAttempts===this.config.maxAjaxCallsPerView&&p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.MaxAjaxPerPVExceeded,\"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\",!0);++this._trackAjaxAttempts},o.prototype.trackDependencyData=function(e){if(-1===this.config.maxAjaxCallsPerView||this._trackAjaxAttempts<this.config.maxAjaxCallsPerView){var t=new p.Telemetry.Common.Data(p.Telemetry.RemoteDependencyData.dataType,e),n=new p.Telemetry.Common.Envelope(t,p.Telemetry.RemoteDependencyData.envelopeType);this.context.track(n)}else this._trackAjaxAttempts===this.config.maxAjaxCallsPerView&&p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.MaxAjaxPerPVExceeded,\"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\",!0);++this._trackAjaxAttempts},o.prototype.trackAjax=function(e,t,n,i,o,a,r){this.trackDependency(e,null,t,n,i,o,a)},o.prototype.trackException=function(e,t,n,i,o){try{if(!p.Util.isError(e))try{throw new Error(e)}catch(l){e=l}var a=new p.Telemetry.Exception(e,n,i,o),r=new p.Telemetry.Common.Data(p.Telemetry.Exception.dataType,a),s=new p.Telemetry.Common.Envelope(r,p.Telemetry.Exception.envelopeType);this.context.track(s)}catch(c){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.TrackExceptionFailed,\"trackException failed, exception will not be collected: \"+p.Util.getExceptionName(c),{exception:p.Util.dump(c)})}},o.prototype.trackMetric=function(e,t,n,i,o,a){try{var r=new p.Telemetry.Metric(e,t,n,i,o,a),s=new p.Telemetry.Common.Data(p.Telemetry.Metric.dataType,r),l=new p.Telemetry.Common.Envelope(s,p.Telemetry.Metric.envelopeType);this.context.track(l)}catch(c){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.TrackMetricFailed,\"trackMetric failed, metric will not be collected: \"+p.Util.getExceptionName(c),{exception:p.Util.dump(c)})}},o.prototype.trackTrace=function(e,t,n){try{var i=new p.Telemetry.Trace(e,t,n),o=new p.Telemetry.Common.Data(p.Telemetry.Trace.dataType,i),a=new p.Telemetry.Common.Envelope(o,p.Telemetry.Trace.envelopeType);this.context.track(a)}catch(r){p._InternalLogging.throwInternal(p.LoggingSeverity.WARNING,p._InternalMessageId.TrackTraceFailed,\"trackTrace failed, trace will not be collected: \"+p.Util.getExceptionName(r),{exception:p.Util.dump(r)})}},o.prototype.trackPageVisitTime=function(e,t,n){var i={PageName:e,PageUrl:t};this.trackMetric(\"PageVisitTime\",n,1,n,n,i)},o.prototype.flush=function(e){void 0===e&&(e=!0);try{this.context._sender.triggerSend(e)}catch(t){p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.FlushFailed,\"flush failed, telemetry will not be collected: \"+p.Util.getExceptionName(t),{exception:p.Util.dump(t)})}},o.prototype.setAuthenticatedUserContext=function(e,t,n){void 0===n&&(n=!1);try{this.context.user.setAuthenticatedUserContext(e,t,n)}catch(i){p._InternalLogging.throwInternal(p.LoggingSeverity.WARNING,p._InternalMessageId.SetAuthContextFailed,\"Setting auth user context failed. \"+p.Util.getExceptionName(i),{exception:p.Util.dump(i)},!0)}},o.prototype.clearAuthenticatedUserContext=function(){try{this.context.user.clearAuthenticatedUserContext()}catch(e){p._InternalLogging.throwInternal(p.LoggingSeverity.WARNING,p._InternalMessageId.SetAuthContextFailed,\"Clearing auth user context failed. \"+p.Util.getExceptionName(e),{exception:p.Util.dump(e)},!0)}},o.prototype.SendCORSException=function(e){var t=r.ApplicationInsights.Telemetry.Exception.CreateSimpleException(\"Script error.\",\"Error\",\"unknown\",\"unknown\",\"The browser's same-origin policy prevents us from getting the details of this exception. Consider using 'crossorigin' attribute.\",0);t.properties=e;var n=new p.Telemetry.Common.Data(p.Telemetry.Exception.dataType,t),i=new p.Telemetry.Common.Envelope(n,p.Telemetry.Exception.envelopeType);this.context.track(i)},o.prototype._onerror=function(e,t,n,i,o){try{var a={url:t||document.URL};if(p.Util.isCrossOriginError(e,t,n,i,o))this.SendCORSException(a);else{if(!p.Util.isError(o)){var r=\"window.onerror@\"+a.url+\":\"+n+\":\"+(i||0);(o=new Error(e)).stack=r}this.trackException(o,null,a)}}catch(c){var s=o?o.name+\", \"+o.message:\"null\",l=p.Util.dump(c);p._InternalLogging.throwInternal(p.LoggingSeverity.CRITICAL,p._InternalMessageId.ExceptionWhileLoggingError,\"_onerror threw exception while logging error, error will not be collected: \"+p.Util.getExceptionName(c),{exception:l,errorString:s})}},o}();p.AppInsights=e;var a=function(){function e(e){this._name=e,this._events={}}return e.prototype.start=function(e){\"undefined\"!=typeof this._events[e]&&p._InternalLogging.throwInternal(p.LoggingSeverity.WARNING,p._InternalMessageId.StartCalledMoreThanOnce,\"start was called more than once for this event without calling stop.\",{name:this._name,key:e},!0),this._events[e]=+new Date},e.prototype.stop=function(e,t,n,i){var o=this._events[e];if(isNaN(o))p._InternalLogging.throwInternal(p.LoggingSeverity.WARNING,p._InternalMessageId.StopCalledWithoutStart,\"stop was called without a corresponding start.\",{name:this._name,key:e},!0);else{var a=+new Date,r=p.Telemetry.PageViewPerformance.getDuration(o,a);this.action(e,t,r,n,i)}delete this._events[e],this._events[e]=undefined},e}()}(r.ApplicationInsights||(r.ApplicationInsights={}))}(Microsoft||(Microsoft={})),function(e){var o,t;o=e.ApplicationInsights||(e.ApplicationInsights={}),t=function(){function i(){}return i.reset=function(){i.isEnabled()&&(o.Util.setSessionStorage(i.ITEMS_QUEUED_KEY,\"0\"),o.Util.setSessionStorage(i.ISSUES_REPORTED_KEY,\"0\"),i.itemsRestoredFromSessionBuffer=0)},i.isEnabled=function(){return i.enabled&&null!=i.appInsights&&i.appInsights.context._sender._XMLHttpRequestSupported&&o.Util.canUseSessionStorage()},i.getIssuesReported=function(){return!i.isEnabled()||isNaN(+o.Util.getSessionStorage(i.ISSUES_REPORTED_KEY))?0:+o.Util.getSessionStorage(i.ISSUES_REPORTED_KEY)},i.incrementItemsQueued=function(){try{if(i.isEnabled()){var e=i.getNumberOfLostItems();++e,o.Util.setSessionStorage(i.ITEMS_QUEUED_KEY,e.toString())}}catch(t){}},i.decrementItemsQueued=function(e){try{if(i.isEnabled()){var t=i.getNumberOfLostItems();(t-=e)<0&&(t=0),o.Util.setSessionStorage(i.ITEMS_QUEUED_KEY,t.toString())}}catch(n){}},i.getNumberOfLostItems=function(){var e=0;try{i.isEnabled()&&(e=isNaN(+o.Util.getSessionStorage(i.ITEMS_QUEUED_KEY))?0:+o.Util.getSessionStorage(i.ITEMS_QUEUED_KEY))}catch(t){e=0}return e},i.reportLostItems=function(){try{if(i.isEnabled()&&i.getIssuesReported()<i.LIMIT_PER_SESSION&&0<i.getNumberOfLostItems()){var e=i.getNumberOfLostItems()-i.itemsRestoredFromSessionBuffer;i.appInsights.trackTrace('AI (Internal): Internal report DATALOSS:\"'+e+'\"',null),i.appInsights.flush();var t=i.getIssuesReported();++t,o.Util.setSessionStorage(i.ISSUES_REPORTED_KEY,t.toString())}}catch(n){o._InternalLogging.throwInternal(o.LoggingSeverity.CRITICAL,o._InternalMessageId.FailedToReportDataLoss,\"Failed to report data loss: \"+o.Util.getExceptionName(n),{exception:o.Util.dump(n)})}finally{try{i.reset()}catch(n){}}},i.enabled=!1,i.itemsRestoredFromSessionBuffer=0,i.LIMIT_PER_SESSION=10,i.ITEMS_QUEUED_KEY=\"AI_itemsQueued\",i.ISSUES_REPORTED_KEY=\"AI_lossIssuesReported\",i}(),o.DataLossAnalyzer=t}(Microsoft||(Microsoft={})),function(a){var o,e;o=a.ApplicationInsights||(a.ApplicationInsights={}),e=function(){function n(e){e.queue=e.queue||[];var t=e.config||{};if(t&&!t.instrumentationKey)if((t=e).iKey)a.ApplicationInsights.Version=\"0.10.0.0\",t.instrumentationKey=t.iKey;else{if(!t.applicationInsightsId)throw new Error(\"Cannot load Application Insights SDK, no instrumentationKey was provided.\");a.ApplicationInsights.Version=\"0.7.2.0\",t.instrumentationKey=t.applicationInsightsId}t=n.getDefaultConfig(t),this.snippet=e,this.config=t}return n.prototype.loadAppInsights=function(){var i=new a.ApplicationInsights.AppInsights(this.config);if(this.config.iKey){var o=i.trackPageView;i.trackPageView=function(e,t,n){o.apply(i,[null,e,t,n])}}var e=\"logPageView\";\"function\"==typeof this.snippet[e]&&(i[e]=function(e,t,n){i.trackPageView(null,e,t,n)});var t=\"logEvent\";return\"function\"==typeof this.snippet[t]&&(i[t]=function(e,t,n){i.trackEvent(e,t,n)}),i},n.prototype.emptyQueue=function(){try{if(a.ApplicationInsights.Util.isArray(this.snippet.queue)){for(var e=this.snippet.queue.length,t=0;t<e;t++){(0,this.snippet.queue[t])()}this.snippet.queue=undefined,delete this.snippet.queue}}catch(i){var n={};i&&\"function\"==typeof i.toString&&(n.exception=i.toString()),a.ApplicationInsights._InternalLogging.throwInternal(o.LoggingSeverity.WARNING,o._InternalMessageId.FailedToSendQueuedTelemetry,\"Failed to send queued telemetry\",n)}},n.prototype.pollInteralLogs=function(i){return setInterval(function(){for(var e=a.ApplicationInsights._InternalLogging.queue,t=e.length,n=0;n<t;n++)i.trackTrace(e[n].message);e.length=0},this.config.diagnosticLogInterval)},n.prototype.addHousekeepingBeforeUnload=function(e){if(!e.config.disableFlushOnBeforeUnload&&\"onbeforeunload\"in window){a.ApplicationInsights.Util.addEventHandler(\"beforeunload\",function(){e.context._sender.triggerSend(),e.context._sessionManager.backup()})||a.ApplicationInsights._InternalLogging.throwInternal(a.ApplicationInsights.LoggingSeverity.CRITICAL,a.ApplicationInsights._InternalMessageId.FailedToAddHandlerForOnBeforeUnload,\"Could not add handler for beforeunload\")}},n.getDefaultConfig=function(e){return e||(e={}),e.endpointUrl=e.endpointUrl||\"https://dc.services.visualstudio.com/v2/track\",e.sessionRenewalMs=18e5,e.sessionExpirationMs=864e5,e.maxBatchSizeInBytes=0<e.maxBatchSizeInBytes?e.maxBatchSizeInBytes:102400,e.maxBatchInterval=isNaN(e.maxBatchInterval)?15e3:e.maxBatchInterval,e.enableDebug=o.Util.stringToBoolOrDefault(e.enableDebug),e.disableExceptionTracking=o.Util.stringToBoolOrDefault(e.disableExceptionTracking),e.disableTelemetry=o.Util.stringToBoolOrDefault(e.disableTelemetry),e.verboseLogging=o.Util.stringToBoolOrDefault(e.verboseLogging),e.emitLineDelimitedJson=o.Util.stringToBoolOrDefault(e.emitLineDelimitedJson),e.diagnosticLogInterval=e.diagnosticLogInterval||1e4,e.autoTrackPageVisitTime=o.Util.stringToBoolOrDefault(e.autoTrackPageVisitTime),(isNaN(e.samplingPercentage)||e.samplingPercentage<=0||100<=e.samplingPercentage)&&(e.samplingPercentage=100),e.disableAjaxTracking=o.Util.stringToBoolOrDefault(e.disableAjaxTracking),e.maxAjaxCallsPerView=isNaN(e.maxAjaxCallsPerView)?500:e.maxAjaxCallsPerView,e.isBeaconApiDisabled=o.Util.stringToBoolOrDefault(e.isBeaconApiDisabled,!0),e.disableCorrelationHeaders=o.Util.stringToBoolOrDefault(e.disableCorrelationHeaders),e.correlationHeaderExcludedDomains=e.correlationHeaderExcludedDomains||[\"*.blob.core.windows.net\",\"*.blob.core.chinacloudapi.cn\",\"*.blob.core.cloudapi.de\",\"*.blob.core.usgovcloudapi.net\"],e.disableFlushOnBeforeUnload=o.Util.stringToBoolOrDefault(e.disableFlushOnBeforeUnload),e.enableSessionStorageBuffer=o.Util.stringToBoolOrDefault(e.enableSessionStorageBuffer,!0),e.isRetryDisabled=o.Util.stringToBoolOrDefault(e.isRetryDisabled),e.isCookieUseDisabled=o.Util.stringToBoolOrDefault(e.isCookieUseDisabled),e.isStorageUseDisabled=o.Util.stringToBoolOrDefault(e.isStorageUseDisabled),e.isBrowserLinkTrackingEnabled=o.Util.stringToBoolOrDefault(e.isBrowserLinkTrackingEnabled),e.enableCorsCorrelation=o.Util.stringToBoolOrDefault(e.enableCorsCorrelation),e},n}(),o.Initialization=e}(Microsoft||(Microsoft={})),function(s){!function(e){try{if(\"undefined\"!=typeof window&&\"undefined\"!=typeof JSON){var t=\"appInsights\";if(window[t]===undefined)s.ApplicationInsights.AppInsights.defaultConfig=s.ApplicationInsights.Initialization.getDefaultConfig();else{var n=window[t]||{},i=new s.ApplicationInsights.Initialization(n),o=i.loadAppInsights();for(var a in o)n[a]=o[a];i.emptyQueue(),i.pollInteralLogs(o),i.addHousekeepingBeforeUnload(o)}}}catch(r){s.ApplicationInsights._InternalLogging.warnToConsole(\"Failed to initialize AppInsights JS SDK: \"+r.message)}}(s.ApplicationInsights||(s.ApplicationInsights={}))}(Microsoft||(Microsoft={}));\n//# sourceMappingURL=ai.0.js.map"
  },
  {
    "path": "AISKU/Tests/Manual/ai2.test.js",
    "content": "/*!\n * Application Insights JavaScript SDK - Web, 2.8.14\n * Copyright (c) Microsoft and contributors. All rights reserved.\n */\n'use strict';\n\n(function (global, factory) {\n    var undef = \"undefined\";\n    typeof exports === \"object\" && typeof module !== undef ? factory(exports) :\n    typeof define === \"function\" && define.amd ? define([\"exports\"], factory) :\n    (function(global){\n        var nsKey, key, nm, theExports = {}, modName = \"esm_ai_2_8_14\", msMod=\"__ms$mod__\";\n        var mods={}, modDetail=mods[modName]={}, ver=\"2.8.14\";\n        var baseNs=global, nsKey=\"Microsoft\", baseNs=baseNs[nsKey]=(baseNs[nsKey]||{});\n        // Versioned namespace \"Microsoft.ApplicationInsights2\"\n        var exportNs=baseNs, nsKey=\"ApplicationInsights2\", exportNs=exportNs[nsKey]=(exportNs[nsKey]||{});\n        // Global namespace \"Microsoft.ApplicationInsights\"\n        var destNs=baseNs, nsKey=\"ApplicationInsights\", destNs=destNs[nsKey]=(destNs[nsKey]||{});\n        var expNsDetail=(exportNs[msMod]=(exportNs[msMod] || {})), expNameVer=(expNsDetail[\"v\"]=(expNsDetail[\"v\"] || []));\n        var destNsDetail=(destNs[msMod]=(destNs[msMod] || {})), destNameVer=(destNsDetail[\"v\"]=(destNsDetail[\"v\"] || []));\n        (destNsDetail[\"o\"]=(destNsDetail[\"o\"] || [])).push(mods);\n        factory(theExports);\n        for(var key in theExports) {\n            // Always set the imported value into the \"export\" versioned namespace (last-write wins)\n            nm=\"x\", exportNs[key]=theExports[key], expNameVer[key]=ver;\n            // Overwrite every elements in namespace and record (last-write wins)\n            nm=\"n\", destNs[key]=theExports[key],  destNameVer[key]=ver;\n            (modDetail[nm] = (modDetail[nm] || [])).push(key);\n        }\n    })(typeof globalThis !== undef ? globalThis : global || self);\n})(this, (function (exports) {\n'use strict';\n\n\n(function(obj, prop, descriptor) { /* ai_es3_polyfil defineProperty */ var func = Object[\"defineProperty\"]; if (func) { try { return func(obj, prop, descriptor); } catch(e) { /* IE8 defines defineProperty, but will throw */ } } if (descriptor && typeof descriptor.value !== undefined) { obj[prop] = descriptor.value; } return obj; })(exports, '__esModule', { value: true });\n\nvar strShimFunction = \"function\";\nvar strShimObject = \"object\";\nvar strShimUndefined = \"undefined\";\nvar strShimPrototype = \"prototype\";\nvar strShimHasOwnProperty = \"hasOwnProperty\";\nvar ObjClass = Object;\nvar ObjProto = ObjClass[strShimPrototype];\nvar ObjAssign = ObjClass[\"assign\"];\nvar ObjCreate = ObjClass[\"create\"];\nvar ObjDefineProperty = ObjClass[\"defineProperty\"];\nvar ObjHasOwnProperty = ObjProto[strShimHasOwnProperty];\n\nvar _cachedGlobal = null;\nfunction getGlobal(useCached) {\n    if (useCached === void 0) { useCached = true; }\n    var result = useCached === false ? null : _cachedGlobal;\n    if (!result) {\n        if (typeof globalThis !== strShimUndefined) {\n            result = globalThis;\n        }\n        if (!result && typeof self !== strShimUndefined) {\n            result = self;\n        }\n        if (!result && typeof window !== strShimUndefined) {\n            result = window;\n        }\n        if (!result && typeof global !== strShimUndefined) {\n            result = global;\n        }\n        _cachedGlobal = result;\n    }\n    return result;\n}\nfunction throwTypeError(message) {\n    throw new TypeError(message);\n}\nfunction objCreateFn(obj) {\n    var func = ObjCreate;\n    if (func) {\n        return func(obj);\n    }\n    if (obj == null) {\n        return {};\n    }\n    var type = typeof obj;\n    if (type !== strShimObject && type !== strShimFunction) {\n        throwTypeError(\"Object prototype may only be an Object:\" + obj);\n    }\n    function tmpFunc() { }\n    tmpFunc[strShimPrototype] = obj;\n    return new tmpFunc();\n}\n\n(getGlobal() || {})[\"Symbol\"];\n(getGlobal() || {})[\"Reflect\"];\nvar __objAssignFnImpl = function (t) {\n    for (var s, i = 1, n = arguments.length; i < n; i++) {\n        s = arguments[i];\n        for (var p in s) {\n            if (ObjProto[strShimHasOwnProperty].call(s, p)) {\n                t[p] = s[p];\n            }\n        }\n    }\n    return t;\n};\nvar __assignFn = ObjAssign || __objAssignFnImpl;\nvar extendStaticsFn = function (d, b) {\n    extendStaticsFn = ObjClass[\"setPrototypeOf\"] ||\n        ({ __proto__: [] } instanceof Array && function (d, b) {\n            d.__proto__ = b;\n        }) ||\n        function (d, b) {\n            for (var p in b) {\n                if (b[strShimHasOwnProperty](p)) {\n                    d[p] = b[p];\n                }\n            }\n        };\n    return extendStaticsFn(d, b);\n};\nfunction __extendsFn(d, b) {\n    if (typeof b !== strShimFunction && b !== null) {\n        throwTypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n    }\n    extendStaticsFn(d, b);\n    function __() {\n        this.constructor = d;\n    }\n    d[strShimPrototype] = b === null ? objCreateFn(b) : (__[strShimPrototype] = b[strShimPrototype], new __());\n}\nfunction __spreadArrayFn(to, from) {\n    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) {\n        to[j] = from[i];\n    }\n    return to;\n}\n\nvar _DYN_INITIALIZE = \"initialize\";\nvar _DYN_NAME$3 = \"name\";\nvar _DYN_GET_NOTIFY_MGR = \"getNotifyMgr\";\nvar _DYN_IDENTIFIER = \"identifier\";\nvar _DYN_PUSH$2 = \"push\";\nvar _DYN_IS_INITIALIZED = \"isInitialized\";\nvar _DYN_CONFIG$2 = \"config\";\nvar _DYN_INSTRUMENTATION_KEY$2 = \"instrumentationKey\";\nvar _DYN_LOGGER = \"logger\";\nvar _DYN_LENGTH$5 = \"length\";\nvar _DYN_TIME = \"time\";\nvar _DYN_PROCESS_NEXT = \"processNext\";\nvar _DYN_GET_PROCESS_TEL_CONT0 = \"getProcessTelContext\";\nvar _DYN_ADD_NOTIFICATION_LIS1 = \"addNotificationListener\";\nvar _DYN_REMOVE_NOTIFICATION_2 = \"removeNotificationListener\";\nvar _DYN_STOP_POLLING_INTERNA3 = \"stopPollingInternalLogs\";\nvar _DYN_ON_COMPLETE = \"onComplete\";\nvar _DYN_GET_PLUGIN = \"getPlugin\";\nvar _DYN_FLUSH = \"flush\";\nvar _DYN__EXTENSIONS = \"_extensions\";\nvar _DYN_SPLICE = \"splice\";\nvar _DYN_TEARDOWN = \"teardown\";\nvar _DYN_MESSAGE_ID = \"messageId\";\nvar _DYN_MESSAGE$2 = \"message\";\nvar _DYN_IS_ASYNC = \"isAsync\";\nvar _DYN__DO_TEARDOWN = \"_doTeardown\";\nvar _DYN_UPDATE$1 = \"update\";\nvar _DYN_GET_NEXT = \"getNext\";\nvar _DYN_DIAG_LOG$2 = \"diagLog\";\nvar _DYN_SET_NEXT_PLUGIN = \"setNextPlugin\";\nvar _DYN_CREATE_NEW = \"createNew\";\nvar _DYN_COOKIE_CFG = \"cookieCfg\";\nvar _DYN_INDEX_OF$2 = \"indexOf\";\nvar _DYN_SUBSTRING$1 = \"substring\";\nvar _DYN_USER_AGENT = \"userAgent\";\nvar _DYN_SPLIT$1 = \"split\";\nvar _DYN_SET_ENABLED = \"setEnabled\";\nvar _DYN_SUBSTR = \"substr\";\nvar _DYN_NODE_TYPE = \"nodeType\";\nvar _DYN_APPLY = \"apply\";\nvar _DYN_REPLACE = \"replace\";\nvar _DYN_ENABLE_DEBUG_EXCEPTI4 = \"enableDebugExceptions\";\nvar _DYN_LOG_INTERNAL_MESSAGE = \"logInternalMessage\";\nvar _DYN_TO_LOWER_CASE$2 = \"toLowerCase\";\nvar _DYN_CALL = \"call\";\nvar _DYN_TYPE = \"type\";\nvar _DYN_HANDLER = \"handler\";\nvar _DYN_LISTENERS = \"listeners\";\nvar _DYN_IS_CHILD_EVT = \"isChildEvt\";\nvar _DYN_GET_CTX = \"getCtx\";\nvar _DYN_SET_CTX = \"setCtx\";\nvar _DYN_COMPLETE = \"complete\";\nvar _DYN_TRACE_ID$2 = \"traceId\";\nvar _DYN_SPAN_ID$1 = \"spanId\";\nvar _DYN_TRACE_FLAGS$1 = \"traceFlags\";\nvar _DYN_VERSION$1 = \"version\";\n\nvar STR_EMPTY = \"\";\nvar STR_CHANNELS = \"channels\";\nvar STR_CORE = \"core\";\nvar STR_CREATE_PERF_MGR = \"createPerfMgr\";\nvar STR_DISABLED = \"disabled\";\nvar STR_EXTENSION_CONFIG = \"extensionConfig\";\nvar STR_EXTENSIONS = \"extensions\";\nvar STR_PROCESS_TELEMETRY = \"processTelemetry\";\nvar STR_PRIORITY = \"priority\";\nvar STR_EVENTS_SENT = \"eventsSent\";\nvar STR_EVENTS_DISCARDED = \"eventsDiscarded\";\nvar STR_EVENTS_SEND_REQUEST = \"eventsSendRequest\";\nvar STR_PERF_EVENT = \"perfEvent\";\nvar STR_ERROR_TO_CONSOLE = \"errorToConsole\";\nvar STR_WARN_TO_CONSOLE = \"warnToConsole\";\nvar STR_GET_PERF_MGR = \"getPerfMgr\";\n\nvar strToISOString = \"toISOString\";\nvar cStrEndsWith = \"endsWith\";\nvar strIndexOf = \"indexOf\";\nvar strMap = \"map\";\nvar strReduce = \"reduce\";\nvar cStrTrim = \"trim\";\nvar strToString = \"toString\";\nvar str__Proto$1 = \"__proto__\";\nvar strConstructor = \"constructor\";\nvar _objDefineProperty$1 = ObjDefineProperty;\nvar _objFreeze = ObjClass.freeze;\nvar _objKeys = ObjClass.keys;\nvar StringProto = String[strShimPrototype];\nvar _strTrim = StringProto[cStrTrim];\nvar _strEndsWith = StringProto[cStrEndsWith];\nvar DateProto = Date[strShimPrototype];\nvar _dataToISOString = DateProto[strToISOString];\nvar _isArray = Array.isArray;\nvar _objToString = ObjProto[strToString];\nvar _fnToString = ObjHasOwnProperty[strToString];\nvar _objFunctionString = _fnToString[_DYN_CALL ](ObjClass);\nvar rCamelCase = /-([a-z])/g;\nvar rNormalizeInvalid = /([^\\w\\d_$])/g;\nvar rLeadingNumeric = /^(\\d+[\\w\\d_$])/;\nvar _objGetPrototypeOf$1 = Object[\"getPrototypeOf\"];\nfunction _getObjProto$1(target) {\n    if (target) {\n        if (_objGetPrototypeOf$1) {\n            return _objGetPrototypeOf$1(target);\n        }\n        var newProto = target[str__Proto$1] || target[strShimPrototype] || target[strConstructor];\n        if (newProto) {\n            return newProto;\n        }\n    }\n    return null;\n}\nfunction isTypeof(value, theType) {\n    return typeof value === theType;\n}\nfunction isUndefined(value) {\n    return value === undefined || typeof value === strShimUndefined;\n}\nfunction isNullOrUndefined(value) {\n    return (value === null || isUndefined(value));\n}\nfunction isNotNullOrUndefined(value) {\n    return !isNullOrUndefined(value);\n}\nfunction hasOwnProperty(obj, prop) {\n    return !!(obj && ObjHasOwnProperty[_DYN_CALL ](obj, prop));\n}\nfunction isObject(value) {\n    return !!(value && typeof value === strShimObject);\n}\nfunction isFunction(value) {\n    return !!(value && typeof value === strShimFunction);\n}\nfunction normalizeJsName(name) {\n    var value = name;\n    if (value && isString(value)) {\n        value = value[_DYN_REPLACE ](rCamelCase, function (_all, letter) {\n            return letter.toUpperCase();\n        });\n        value = value[_DYN_REPLACE ](rNormalizeInvalid, \"_\");\n        value = value[_DYN_REPLACE ](rLeadingNumeric, function (_all, match) {\n            return \"_\" + match;\n        });\n    }\n    return value;\n}\nfunction objForEachKey(target, callbackfn) {\n    if (target) {\n        for (var prop in target) {\n            if (ObjHasOwnProperty[_DYN_CALL ](target, prop)) {\n                callbackfn[_DYN_CALL ](target, prop, target[prop]);\n            }\n        }\n    }\n}\nfunction strEndsWith(value, search) {\n    var result = false;\n    if (value && search && !(result = value === search)) {\n        result = _strEndsWith ? value[cStrEndsWith](search) : _strEndsWithPoly(value, search);\n    }\n    return result;\n}\nfunction _strEndsWithPoly(value, search) {\n    var result = false;\n    var searchLen = search ? search[_DYN_LENGTH$5 ] : 0;\n    var valLen = value ? value[_DYN_LENGTH$5 ] : 0;\n    if (searchLen && valLen && valLen >= searchLen && !(result = value === search)) {\n        var pos = valLen - 1;\n        for (var lp = searchLen - 1; lp >= 0; lp--) {\n            if (value[pos] != search[lp]) {\n                return false;\n            }\n            pos--;\n        }\n        result = true;\n    }\n    return result;\n}\nfunction strContains(value, search) {\n    if (value && search) {\n        return value[_DYN_INDEX_OF$2 ](search) !== -1;\n    }\n    return false;\n}\nfunction isDate(obj) {\n    return !!(obj && _objToString[_DYN_CALL ](obj) === \"[object Date]\");\n}\nvar isArray = _isArray || _isArrayPoly;\nfunction _isArrayPoly(obj) {\n    return !!(obj && _objToString[_DYN_CALL ](obj) === \"[object Array]\");\n}\nfunction isError(obj) {\n    return !!(obj && _objToString[_DYN_CALL ](obj) === \"[object Error]\");\n}\nfunction isString(value) {\n    return typeof value === \"string\";\n}\nfunction isNumber(value) {\n    return typeof value === \"number\";\n}\nfunction isBoolean(value) {\n    return typeof value === \"boolean\";\n}\nfunction isPlainObject(value) {\n    var result = false;\n    if (value && typeof value === \"object\") {\n        var proto = _objGetPrototypeOf$1 ? _objGetPrototypeOf$1(value) : _getObjProto$1(value);\n        if (!proto) {\n            result = true;\n        }\n        else {\n            if (proto[strConstructor] && ObjHasOwnProperty[_DYN_CALL ](proto, strConstructor)) {\n                proto = proto[strConstructor];\n            }\n            result = typeof proto === strShimFunction && _fnToString[_DYN_CALL ](proto) === _objFunctionString;\n        }\n    }\n    return result;\n}\nfunction toISOString(date) {\n    if (date) {\n        return _dataToISOString ? date[strToISOString]() : _toISOStringPoly(date);\n    }\n}\nfunction _toISOStringPoly(date) {\n    if (date && date.getUTCFullYear) {\n        var pad = function (num) {\n            var r = String(num);\n            if (r[_DYN_LENGTH$5 ] === 1) {\n                r = \"0\" + r;\n            }\n            return r;\n        };\n        return date.getUTCFullYear()\n            + \"-\" + pad(date.getUTCMonth() + 1)\n            + \"-\" + pad(date.getUTCDate())\n            + \"T\" + pad(date.getUTCHours())\n            + \":\" + pad(date.getUTCMinutes())\n            + \":\" + pad(date.getUTCSeconds())\n            + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n            + \"Z\";\n    }\n}\nfunction arrForEach(arr, callbackfn, thisArg) {\n    var len = arr[_DYN_LENGTH$5 ];\n    try {\n        for (var idx = 0; idx < len; idx++) {\n            if (idx in arr) {\n                if (callbackfn[_DYN_CALL ](thisArg || arr, arr[idx], idx, arr) === -1) {\n                    break;\n                }\n            }\n        }\n    }\n    catch (e) {\n    }\n}\nfunction arrIndexOf(arr, searchElement, fromIndex) {\n    if (arr) {\n        if (arr[strIndexOf]) {\n            return arr[strIndexOf](searchElement, fromIndex);\n        }\n        var len = arr[_DYN_LENGTH$5 ];\n        var from = fromIndex || 0;\n        try {\n            for (var lp = Math.max(from >= 0 ? from : len - Math.abs(from), 0); lp < len; lp++) {\n                if (lp in arr && arr[lp] === searchElement) {\n                    return lp;\n                }\n            }\n        }\n        catch (e) {\n        }\n    }\n    return -1;\n}\nfunction arrMap(arr, callbackfn, thisArg) {\n    var results;\n    if (arr) {\n        if (arr[strMap]) {\n            return arr[strMap](callbackfn, thisArg);\n        }\n        var len = arr[_DYN_LENGTH$5 ];\n        var _this = thisArg || arr;\n        results = new Array(len);\n        try {\n            for (var lp = 0; lp < len; lp++) {\n                if (lp in arr) {\n                    results[lp] = callbackfn[_DYN_CALL ](_this, arr[lp], arr);\n                }\n            }\n        }\n        catch (e) {\n        }\n    }\n    return results;\n}\nfunction arrReduce(arr, callbackfn, initialValue) {\n    var value;\n    if (arr) {\n        if (arr[strReduce]) {\n            return arr[strReduce](callbackfn, initialValue);\n        }\n        var len = arr[_DYN_LENGTH$5 ];\n        var lp = 0;\n        if (arguments[_DYN_LENGTH$5 ] >= 3) {\n            value = arguments[2];\n        }\n        else {\n            while (lp < len && !(lp in arr)) {\n                lp++;\n            }\n            value = arr[lp++];\n        }\n        while (lp < len) {\n            if (lp in arr) {\n                value = callbackfn(value, arr[lp], lp, arr);\n            }\n            lp++;\n        }\n    }\n    return value;\n}\nfunction strTrim(str) {\n    if (str) {\n        str = (_strTrim && str[cStrTrim]) ? str[cStrTrim]() : (str[_DYN_REPLACE ] ? str[_DYN_REPLACE ](/^\\s+|(?=\\s)\\s+$/g, STR_EMPTY) : str);\n    }\n    return str;\n}\nvar _objKeysHasDontEnumBug = !({ toString: null }).propertyIsEnumerable(\"toString\");\nvar _objKeysDontEnums = [\n    \"toString\",\n    \"toLocaleString\",\n    \"valueOf\",\n    \"hasOwnProperty\",\n    \"isPrototypeOf\",\n    \"propertyIsEnumerable\",\n    \"constructor\"\n];\nfunction objKeys(obj) {\n    var objType = typeof obj;\n    if (objType !== strShimFunction && (objType !== strShimObject || obj === null)) {\n        throwTypeError(\"objKeys called on non-object\");\n    }\n    if (!_objKeysHasDontEnumBug && _objKeys) {\n        return _objKeys(obj);\n    }\n    var result = [];\n    for (var prop in obj) {\n        if (obj && ObjHasOwnProperty[_DYN_CALL ](obj, prop)) {\n            result[_DYN_PUSH$2 ](prop);\n        }\n    }\n    if (_objKeysHasDontEnumBug) {\n        var dontEnumsLength = _objKeysDontEnums[_DYN_LENGTH$5 ];\n        for (var lp = 0; lp < dontEnumsLength; lp++) {\n            if (obj && ObjHasOwnProperty[_DYN_CALL ](obj, _objKeysDontEnums[lp])) {\n                result[_DYN_PUSH$2 ](_objKeysDontEnums[lp]);\n            }\n        }\n    }\n    return result;\n}\nfunction objDefineAccessors(target, prop, getProp, setProp) {\n    if (_objDefineProperty$1) {\n        try {\n            var descriptor = {\n                enumerable: true,\n                configurable: true\n            };\n            if (getProp) {\n                descriptor.get = getProp;\n            }\n            if (setProp) {\n                descriptor.set = setProp;\n            }\n            _objDefineProperty$1(target, prop, descriptor);\n            return true;\n        }\n        catch (e) {\n        }\n    }\n    return false;\n}\nfunction _doNothing(value) {\n    return value;\n}\nfunction deepFreeze(obj) {\n    if (_objFreeze) {\n        objForEachKey(obj, function (name, value) {\n            if (isArray(value) || isObject(value)) {\n                _objFreeze(value);\n            }\n        });\n    }\n    return objFreeze(obj);\n}\nvar objFreeze = _objFreeze || _doNothing;\nfunction dateNow() {\n    var dt = Date;\n    return dt.now ? dt.now() : new dt().getTime();\n}\nfunction getExceptionName(object) {\n    if (isError(object)) {\n        return object[_DYN_NAME$3 ];\n    }\n    return STR_EMPTY;\n}\nfunction setValue(target, field, value, valChk, srcChk) {\n    var theValue = value;\n    if (target) {\n        theValue = target[field];\n        if (theValue !== value && (!srcChk || srcChk(theValue)) && (!valChk || valChk(value))) {\n            theValue = value;\n            target[field] = theValue;\n        }\n    }\n    return theValue;\n}\nfunction getSetValue(target, field, defValue) {\n    var theValue;\n    if (target) {\n        theValue = target[field];\n        if (!theValue && isNullOrUndefined(theValue)) {\n            theValue = !isUndefined(defValue) ? defValue : {};\n            target[field] = theValue;\n        }\n    }\n    else {\n        theValue = !isUndefined(defValue) ? defValue : {};\n    }\n    return theValue;\n}\nfunction getCfgValue(theValue, defaultValue) {\n    return !isNullOrUndefined(theValue) ? theValue : defaultValue;\n}\nfunction isTruthy(value) {\n    return !!value;\n}\nfunction throwError(message) {\n    throw new Error(message);\n}\nfunction _createProxyFunction(source, funcName) {\n    var srcFunc = null;\n    var src = null;\n    if (isFunction(source)) {\n        srcFunc = source;\n    }\n    else {\n        src = source;\n    }\n    return function () {\n        var originalArguments = arguments;\n        if (srcFunc) {\n            src = srcFunc();\n        }\n        if (src) {\n            return src[funcName][_DYN_APPLY ](src, originalArguments);\n        }\n    };\n}\nfunction proxyAssign(target, source, chkSet) {\n    if (target && source && isObject(target) && isObject(source)) {\n        var _loop_1 = function (field) {\n            if (isString(field)) {\n                var value = source[field];\n                if (isFunction(value)) {\n                    if (!chkSet || chkSet(field, true, source, target)) {\n                        target[field] = _createProxyFunction(source, field);\n                    }\n                }\n                else if (!chkSet || chkSet(field, false, source, target)) {\n                    if (hasOwnProperty(target, field)) {\n                        delete target[field];\n                    }\n                    if (!objDefineAccessors(target, field, function () {\n                        return source[field];\n                    }, function (theValue) {\n                        source[field] = theValue;\n                    })) {\n                        target[field] = value;\n                    }\n                }\n            }\n        };\n        for (var field in source) {\n            _loop_1(field);\n        }\n    }\n    return target;\n}\nfunction proxyFunctionAs(target, name, source, theFunc, overwriteTarget) {\n    if (target && name && source) {\n        if (overwriteTarget !== false || isUndefined(target[name])) {\n            target[name] = _createProxyFunction(source, theFunc);\n        }\n    }\n}\nfunction proxyFunctions(target, source, functionsToProxy, overwriteTarget) {\n    if (target && source && isObject(target) && isArray(functionsToProxy)) {\n        arrForEach(functionsToProxy, function (theFuncName) {\n            if (isString(theFuncName)) {\n                proxyFunctionAs(target, theFuncName, source, theFuncName, overwriteTarget);\n            }\n        });\n    }\n    return target;\n}\nfunction createClassFromInterface(defaults) {\n    return /** @class */ (function () {\n        function class_1() {\n            var _this_1 = this;\n            if (defaults) {\n                objForEachKey(defaults, function (field, value) {\n                    _this_1[field] = value;\n                });\n            }\n        }\n        return class_1;\n    }());\n}\nfunction optimizeObject(theObject) {\n    if (theObject && ObjAssign) {\n        theObject = ObjClass(ObjAssign({}, theObject));\n    }\n    return theObject;\n}\nfunction objExtend(obj1, obj2, obj3, obj4, obj5, obj6) {\n    var theArgs = arguments;\n    var extended = theArgs[0] || {};\n    var argLen = theArgs[_DYN_LENGTH$5 ];\n    var deep = false;\n    var idx = 1;\n    if (argLen > 0 && isBoolean(extended)) {\n        deep = extended;\n        extended = theArgs[idx] || {};\n        idx++;\n    }\n    if (!isObject(extended)) {\n        extended = {};\n    }\n    for (; idx < argLen; idx++) {\n        var arg = theArgs[idx];\n        var isArgArray = isArray(arg);\n        var isArgObj = isObject(arg);\n        for (var prop in arg) {\n            var propOk = (isArgArray && (prop in arg)) || (isArgObj && (ObjHasOwnProperty[_DYN_CALL ](arg, prop)));\n            if (!propOk) {\n                continue;\n            }\n            var newValue = arg[prop];\n            var isNewArray = void 0;\n            if (deep && newValue && ((isNewArray = isArray(newValue)) || isPlainObject(newValue))) {\n                var clone = extended[prop];\n                if (isNewArray) {\n                    if (!isArray(clone)) {\n                        clone = [];\n                    }\n                }\n                else if (!isPlainObject(clone)) {\n                    clone = {};\n                }\n                newValue = objExtend(deep, clone, newValue);\n            }\n            if (newValue !== undefined) {\n                extended[prop] = newValue;\n            }\n        }\n    }\n    return extended;\n}\n\nfunction createEnumStyle(values) {\n    var enumClass = {};\n    objForEachKey(values, function (field, value) {\n        enumClass[field] = value;\n        enumClass[value] = field;\n    });\n    return deepFreeze(enumClass);\n}\nfunction createValueMap(values) {\n    var mapClass = {};\n    objForEachKey(values, function (field, value) {\n        mapClass[field] = value[1];\n        mapClass[value[0]] = value[1];\n    });\n    return deepFreeze(mapClass);\n}\n\n/*!\n * Microsoft Dynamic Proto Utility, 1.1.9\n * Copyright (c) Microsoft and contributors. All rights reserved.\n */\nvar _a$3;\nvar UNDEFINED = \"undefined\";\nvar Constructor = 'constructor';\nvar Prototype = 'prototype';\nvar strFunction = 'function';\nvar DynInstFuncTable = '_dynInstFuncs';\nvar DynProxyTag = '_isDynProxy';\nvar DynClassName = '_dynClass';\nvar DynClassNamePrefix = '_dynCls$';\nvar DynInstChkTag = '_dynInstChk';\nvar DynAllowInstChkTag = DynInstChkTag;\nvar DynProtoDefaultOptions = '_dfOpts';\nvar UnknownValue = '_unknown_';\nvar str__Proto = \"__proto__\";\nvar DynProtoBaseProto = \"_dyn\" + str__Proto;\nvar DynProtoGlobalSettings = \"__dynProto$Gbl\";\nvar DynProtoCurrent = \"_dynInstProto\";\nvar strUseBaseInst = 'useBaseInst';\nvar strSetInstFuncs = 'setInstFuncs';\nvar Obj = Object;\nvar _objGetPrototypeOf = Obj[\"getPrototypeOf\"];\nvar _objGetOwnProps = Obj[\"getOwnPropertyNames\"];\nfunction _getGlobal() {\n    var result;\n    if (typeof globalThis !== UNDEFINED) {\n        result = globalThis;\n    }\n    if (!result && typeof self !== UNDEFINED) {\n        result = self;\n    }\n    if (!result && typeof window !== UNDEFINED) {\n        result = window;\n    }\n    if (!result && typeof global !== UNDEFINED) {\n        result = global;\n    }\n    return result || {};\n}\nvar _gbl = _getGlobal();\nvar _gblInst = _gbl[DynProtoGlobalSettings] || (_gbl[DynProtoGlobalSettings] = {\n    o: (_a$3 = {},\n        _a$3[strSetInstFuncs] = true,\n        _a$3[strUseBaseInst] = true,\n        _a$3),\n    n: 1000\n});\nfunction _hasOwnProperty(obj, prop) {\n    return obj && Obj[Prototype].hasOwnProperty.call(obj, prop);\n}\nfunction _isObjectOrArrayPrototype(target) {\n    return target && (target === Obj[Prototype] || target === Array[Prototype]);\n}\nfunction _isObjectArrayOrFunctionPrototype(target) {\n    return _isObjectOrArrayPrototype(target) || target === Function[Prototype];\n}\nfunction _getObjProto(target) {\n    var newProto;\n    if (target) {\n        if (_objGetPrototypeOf) {\n            return _objGetPrototypeOf(target);\n        }\n        var curProto = target[str__Proto] || target[Prototype] || (target[Constructor] ? target[Constructor][Prototype] : null);\n        newProto = target[DynProtoBaseProto] || curProto;\n        if (!_hasOwnProperty(target, DynProtoBaseProto)) {\n            delete target[DynProtoCurrent];\n            newProto = target[DynProtoBaseProto] = target[DynProtoCurrent] || target[DynProtoBaseProto];\n            target[DynProtoCurrent] = curProto;\n        }\n    }\n    return newProto;\n}\nfunction _forEachProp(target, func) {\n    var props = [];\n    if (_objGetOwnProps) {\n        props = _objGetOwnProps(target);\n    }\n    else {\n        for (var name_1 in target) {\n            if (typeof name_1 === \"string\" && _hasOwnProperty(target, name_1)) {\n                props.push(name_1);\n            }\n        }\n    }\n    if (props && props.length > 0) {\n        for (var lp = 0; lp < props.length; lp++) {\n            func(props[lp]);\n        }\n    }\n}\nfunction _isDynamicCandidate(target, funcName, skipOwn) {\n    return (funcName !== Constructor && typeof target[funcName] === strFunction && (skipOwn || _hasOwnProperty(target, funcName)));\n}\nfunction _throwTypeError(message) {\n    throw new TypeError(\"DynamicProto: \" + message);\n}\nfunction _getInstanceFuncs(thisTarget) {\n    var instFuncs = {};\n    _forEachProp(thisTarget, function (name) {\n        if (!instFuncs[name] && _isDynamicCandidate(thisTarget, name, false)) {\n            instFuncs[name] = thisTarget[name];\n        }\n    });\n    return instFuncs;\n}\nfunction _hasVisited(values, value) {\n    for (var lp = values.length - 1; lp >= 0; lp--) {\n        if (values[lp] === value) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction _getBaseFuncs(classProto, thisTarget, instFuncs, useBaseInst) {\n    function _instFuncProxy(target, funcHost, funcName) {\n        var theFunc = funcHost[funcName];\n        if (theFunc[DynProxyTag] && useBaseInst) {\n            var instFuncTable = target[DynInstFuncTable] || {};\n            if (instFuncTable[DynAllowInstChkTag] !== false) {\n                theFunc = (instFuncTable[funcHost[DynClassName]] || {})[funcName] || theFunc;\n            }\n        }\n        return function () {\n            return theFunc.apply(target, arguments);\n        };\n    }\n    var baseFuncs = {};\n    _forEachProp(instFuncs, function (name) {\n        baseFuncs[name] = _instFuncProxy(thisTarget, instFuncs, name);\n    });\n    var baseProto = _getObjProto(classProto);\n    var visited = [];\n    while (baseProto && !_isObjectArrayOrFunctionPrototype(baseProto) && !_hasVisited(visited, baseProto)) {\n        _forEachProp(baseProto, function (name) {\n            if (!baseFuncs[name] && _isDynamicCandidate(baseProto, name, !_objGetPrototypeOf)) {\n                baseFuncs[name] = _instFuncProxy(thisTarget, baseProto, name);\n            }\n        });\n        visited.push(baseProto);\n        baseProto = _getObjProto(baseProto);\n    }\n    return baseFuncs;\n}\nfunction _getInstFunc(target, funcName, proto, currentDynProtoProxy) {\n    var instFunc = null;\n    if (target && _hasOwnProperty(proto, DynClassName)) {\n        var instFuncTable = target[DynInstFuncTable] || {};\n        instFunc = (instFuncTable[proto[DynClassName]] || {})[funcName];\n        if (!instFunc) {\n            _throwTypeError(\"Missing [\" + funcName + \"] \" + strFunction);\n        }\n        if (!instFunc[DynInstChkTag] && instFuncTable[DynAllowInstChkTag] !== false) {\n            var canAddInst = !_hasOwnProperty(target, funcName);\n            var objProto = _getObjProto(target);\n            var visited = [];\n            while (canAddInst && objProto && !_isObjectArrayOrFunctionPrototype(objProto) && !_hasVisited(visited, objProto)) {\n                var protoFunc = objProto[funcName];\n                if (protoFunc) {\n                    canAddInst = (protoFunc === currentDynProtoProxy);\n                    break;\n                }\n                visited.push(objProto);\n                objProto = _getObjProto(objProto);\n            }\n            try {\n                if (canAddInst) {\n                    target[funcName] = instFunc;\n                }\n                instFunc[DynInstChkTag] = 1;\n            }\n            catch (e) {\n                instFuncTable[DynAllowInstChkTag] = false;\n            }\n        }\n    }\n    return instFunc;\n}\nfunction _getProtoFunc(funcName, proto, currentDynProtoProxy) {\n    var protoFunc = proto[funcName];\n    if (protoFunc === currentDynProtoProxy) {\n        protoFunc = _getObjProto(proto)[funcName];\n    }\n    if (typeof protoFunc !== strFunction) {\n        _throwTypeError(\"[\" + funcName + \"] is not a \" + strFunction);\n    }\n    return protoFunc;\n}\nfunction _populatePrototype(proto, className, target, baseInstFuncs, setInstanceFunc) {\n    function _createDynamicPrototype(proto, funcName) {\n        var dynProtoProxy = function () {\n            var instFunc = _getInstFunc(this, funcName, proto, dynProtoProxy) || _getProtoFunc(funcName, proto, dynProtoProxy);\n            return instFunc.apply(this, arguments);\n        };\n        dynProtoProxy[DynProxyTag] = 1;\n        return dynProtoProxy;\n    }\n    if (!_isObjectOrArrayPrototype(proto)) {\n        var instFuncTable = target[DynInstFuncTable] = target[DynInstFuncTable] || {};\n        var instFuncs_1 = instFuncTable[className] = (instFuncTable[className] || {});\n        if (instFuncTable[DynAllowInstChkTag] !== false) {\n            instFuncTable[DynAllowInstChkTag] = !!setInstanceFunc;\n        }\n        _forEachProp(target, function (name) {\n            if (_isDynamicCandidate(target, name, false) && target[name] !== baseInstFuncs[name]) {\n                instFuncs_1[name] = target[name];\n                delete target[name];\n                if (!_hasOwnProperty(proto, name) || (proto[name] && !proto[name][DynProxyTag])) {\n                    proto[name] = _createDynamicPrototype(proto, name);\n                }\n            }\n        });\n    }\n}\nfunction _checkPrototype(classProto, thisTarget) {\n    if (_objGetPrototypeOf) {\n        var visited = [];\n        var thisProto = _getObjProto(thisTarget);\n        while (thisProto && !_isObjectArrayOrFunctionPrototype(thisProto) && !_hasVisited(visited, thisProto)) {\n            if (thisProto === classProto) {\n                return true;\n            }\n            visited.push(thisProto);\n            thisProto = _getObjProto(thisProto);\n        }\n        return false;\n    }\n    return true;\n}\nfunction _getObjName(target, unknownValue) {\n    if (_hasOwnProperty(target, Prototype)) {\n        return target.name || unknownValue || UnknownValue;\n    }\n    return (((target || {})[Constructor]) || {}).name || unknownValue || UnknownValue;\n}\nfunction dynamicProto(theClass, target, delegateFunc, options) {\n    if (!_hasOwnProperty(theClass, Prototype)) {\n        _throwTypeError(\"theClass is an invalid class definition.\");\n    }\n    var classProto = theClass[Prototype];\n    if (!_checkPrototype(classProto, target)) {\n        _throwTypeError(\"[\" + _getObjName(theClass) + \"] not in hierarchy of [\" + _getObjName(target) + \"]\");\n    }\n    var className = null;\n    if (_hasOwnProperty(classProto, DynClassName)) {\n        className = classProto[DynClassName];\n    }\n    else {\n        className = DynClassNamePrefix + _getObjName(theClass, \"_\") + \"$\" + _gblInst.n;\n        _gblInst.n++;\n        classProto[DynClassName] = className;\n    }\n    var perfOptions = dynamicProto[DynProtoDefaultOptions];\n    var useBaseInst = !!perfOptions[strUseBaseInst];\n    if (useBaseInst && options && options[strUseBaseInst] !== undefined) {\n        useBaseInst = !!options[strUseBaseInst];\n    }\n    var instFuncs = _getInstanceFuncs(target);\n    var baseFuncs = _getBaseFuncs(classProto, target, instFuncs, useBaseInst);\n    delegateFunc(target, baseFuncs);\n    var setInstanceFunc = !!_objGetPrototypeOf && !!perfOptions[strSetInstFuncs];\n    if (setInstanceFunc && options) {\n        setInstanceFunc = !!options[strSetInstFuncs];\n    }\n    _populatePrototype(classProto, className, target, instFuncs, setInstanceFunc !== false);\n}\ndynamicProto[DynProtoDefaultOptions] = _gblInst.o;\n\nvar strWindow = \"window\";\nvar strDocument = \"document\";\nvar strDocumentMode = \"documentMode\";\nvar strNavigator = \"navigator\";\nvar strHistory = \"history\";\nvar strLocation = \"location\";\nvar strConsole = \"console\";\nvar strPerformance = \"performance\";\nvar strJSON = \"JSON\";\nvar strCrypto = \"crypto\";\nvar strMsCrypto = \"msCrypto\";\nvar strReactNative = \"ReactNative\";\nvar strMsie = \"msie\";\nvar strTrident = \"trident/\";\nvar strXMLHttpRequest = \"XMLHttpRequest\";\nvar _isTrident = null;\nvar _navUserAgentCheck = null;\nvar _enableMocks = false;\nvar _useXDomainRequest = null;\nvar _beaconsSupported = null;\nfunction _hasProperty(theClass, property) {\n    var supported = false;\n    if (theClass) {\n        try {\n            supported = property in theClass;\n            if (!supported) {\n                var proto = theClass[strShimPrototype];\n                if (proto) {\n                    supported = property in proto;\n                }\n            }\n        }\n        catch (e) {\n        }\n        if (!supported) {\n            try {\n                var tmp = new theClass();\n                supported = !isUndefined(tmp[property]);\n            }\n            catch (e) {\n            }\n        }\n    }\n    return supported;\n}\nfunction getGlobalInst(name) {\n    var gbl = getGlobal();\n    if (gbl && gbl[name]) {\n        return gbl[name];\n    }\n    if (name === strWindow && hasWindow()) {\n        return window;\n    }\n    return null;\n}\nfunction hasWindow() {\n    return Boolean(typeof window === strShimObject && window);\n}\nfunction getWindow() {\n    if (hasWindow()) {\n        return window;\n    }\n    return getGlobalInst(strWindow);\n}\nfunction hasDocument() {\n    return Boolean(typeof document === strShimObject && document);\n}\nfunction getDocument() {\n    if (hasDocument()) {\n        return document;\n    }\n    return getGlobalInst(strDocument);\n}\nfunction hasNavigator() {\n    return Boolean(typeof navigator === strShimObject && navigator);\n}\nfunction getNavigator() {\n    if (hasNavigator()) {\n        return navigator;\n    }\n    return getGlobalInst(strNavigator);\n}\nfunction hasHistory() {\n    return Boolean(typeof history === strShimObject && history);\n}\nfunction getHistory() {\n    if (hasHistory()) {\n        return history;\n    }\n    return getGlobalInst(strHistory);\n}\nfunction getLocation(checkForMock) {\n    if (checkForMock && _enableMocks) {\n        var mockLocation = getGlobalInst(\"__mockLocation\");\n        if (mockLocation) {\n            return mockLocation;\n        }\n    }\n    if (typeof location === strShimObject && location) {\n        return location;\n    }\n    return getGlobalInst(strLocation);\n}\nfunction getConsole() {\n    if (typeof console !== strShimUndefined) {\n        return console;\n    }\n    return getGlobalInst(strConsole);\n}\nfunction getPerformance() {\n    return getGlobalInst(strPerformance);\n}\nfunction hasJSON() {\n    return Boolean((typeof JSON === strShimObject && JSON) || getGlobalInst(strJSON) !== null);\n}\nfunction getJSON() {\n    if (hasJSON()) {\n        return JSON || getGlobalInst(strJSON);\n    }\n    return null;\n}\nfunction getCrypto() {\n    return getGlobalInst(strCrypto);\n}\nfunction getMsCrypto() {\n    return getGlobalInst(strMsCrypto);\n}\nfunction isReactNative() {\n    var nav = getNavigator();\n    if (nav && nav.product) {\n        return nav.product === strReactNative;\n    }\n    return false;\n}\nfunction isIE() {\n    var nav = getNavigator();\n    if (nav && (nav[_DYN_USER_AGENT ] !== _navUserAgentCheck || _isTrident === null)) {\n        _navUserAgentCheck = nav[_DYN_USER_AGENT ];\n        var userAgent = (_navUserAgentCheck || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]();\n        _isTrident = (strContains(userAgent, strMsie) || strContains(userAgent, strTrident));\n    }\n    return _isTrident;\n}\nfunction getIEVersion(userAgentStr) {\n    if (userAgentStr === void 0) { userAgentStr = null; }\n    if (!userAgentStr) {\n        var navigator_1 = getNavigator() || {};\n        userAgentStr = navigator_1 ? (navigator_1[_DYN_USER_AGENT ] || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]() : STR_EMPTY;\n    }\n    var ua = (userAgentStr || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]();\n    if (strContains(ua, strMsie)) {\n        var doc = getDocument() || {};\n        return Math.max(parseInt(ua[_DYN_SPLIT$1 ](strMsie)[1]), (doc[strDocumentMode] || 0));\n    }\n    else if (strContains(ua, strTrident)) {\n        var tridentVer = parseInt(ua[_DYN_SPLIT$1 ](strTrident)[1]);\n        if (tridentVer) {\n            return tridentVer + 4;\n        }\n    }\n    return null;\n}\nfunction dumpObj(object) {\n    var objectTypeDump = Object[strShimPrototype].toString[_DYN_CALL ](object);\n    var propertyValueDump = STR_EMPTY;\n    if (objectTypeDump === \"[object Error]\") {\n        propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object[_DYN_NAME$3 ] + \"'\";\n    }\n    else if (hasJSON()) {\n        propertyValueDump = getJSON().stringify(object);\n    }\n    return objectTypeDump + propertyValueDump;\n}\nfunction isBeaconsSupported() {\n    if (_beaconsSupported === null) {\n        _beaconsSupported = hasNavigator() && Boolean(getNavigator().sendBeacon);\n    }\n    return _beaconsSupported;\n}\nfunction isFetchSupported(withKeepAlive) {\n    var isSupported = false;\n    try {\n        isSupported = !!getGlobalInst(\"fetch\");\n        var request = getGlobalInst(\"Request\");\n        if (isSupported && withKeepAlive && request) {\n            isSupported = _hasProperty(request, \"keepalive\");\n        }\n    }\n    catch (e) {\n    }\n    return isSupported;\n}\nfunction useXDomainRequest() {\n    if (_useXDomainRequest === null) {\n        _useXDomainRequest = (typeof XDomainRequest !== strShimUndefined);\n        if (_useXDomainRequest && isXhrSupported()) {\n            _useXDomainRequest = _useXDomainRequest && !_hasProperty(getGlobalInst(strXMLHttpRequest), \"withCredentials\");\n        }\n    }\n    return _useXDomainRequest;\n}\nfunction isXhrSupported() {\n    var isSupported = false;\n    try {\n        var xmlHttpRequest = getGlobalInst(strXMLHttpRequest);\n        isSupported = !!xmlHttpRequest;\n    }\n    catch (e) {\n    }\n    return isSupported;\n}\nfunction _getNamedValue(values, name) {\n    if (values) {\n        for (var i = 0; i < values[_DYN_LENGTH$5 ]; i++) {\n            var value = values[i];\n            if (value[_DYN_NAME$3 ]) {\n                if (value[_DYN_NAME$3 ] === name) {\n                    return value;\n                }\n            }\n        }\n    }\n    return {};\n}\nfunction findMetaTag(name) {\n    var doc = getDocument();\n    if (doc && name) {\n        return _getNamedValue(doc.querySelectorAll(\"meta\"), name).content;\n    }\n    return null;\n}\nfunction findNamedServerTiming(name) {\n    var value;\n    var perf = getPerformance();\n    if (perf) {\n        var navPerf = perf.getEntriesByType(\"navigation\") || [];\n        value = _getNamedValue((navPerf[_DYN_LENGTH$5 ] > 0 ? navPerf[0] : {}).serverTiming, name).description;\n    }\n    return value;\n}\n\nvar listenerFuncs = [\"eventsSent\", \"eventsDiscarded\", \"eventsSendRequest\", \"perfEvent\"];\nvar _aiNamespace = null;\nvar _debugListener;\nfunction _listenerProxyFunc(name, config) {\n    return function () {\n        var args = arguments;\n        var dbgExt = getDebugExt(config);\n        if (dbgExt) {\n            var listener = dbgExt.listener;\n            if (listener && listener[name]) {\n                listener[name][_DYN_APPLY ](listener, args);\n            }\n        }\n    };\n}\nfunction _getExtensionNamespace() {\n    var target = getGlobalInst(\"Microsoft\");\n    if (target) {\n        _aiNamespace = target[\"ApplicationInsights\"];\n    }\n    return _aiNamespace;\n}\nfunction getDebugExt(config) {\n    var ns = _aiNamespace;\n    if (!ns && config.disableDbgExt !== true) {\n        ns = _aiNamespace || _getExtensionNamespace();\n    }\n    return ns ? ns[\"ChromeDbgExt\"] : null;\n}\nfunction getDebugListener(config) {\n    if (!_debugListener) {\n        _debugListener = {};\n        for (var lp = 0; lp < listenerFuncs[_DYN_LENGTH$5 ]; lp++) {\n            _debugListener[listenerFuncs[lp]] = _listenerProxyFunc(listenerFuncs[lp], config);\n        }\n    }\n    return _debugListener;\n}\n\nvar AiNonUserActionablePrefix = \"AI (Internal): \";\nvar AiUserActionablePrefix = \"AI: \";\nvar AIInternalMessagePrefix = \"AITR_\";\nfunction _sanitizeDiagnosticText(text) {\n    if (text) {\n        return \"\\\"\" + text[_DYN_REPLACE ](/\\\"/g, STR_EMPTY) + \"\\\"\";\n    }\n    return STR_EMPTY;\n}\nfunction _logToConsole(func, message) {\n    var theConsole = getConsole();\n    if (!!theConsole) {\n        var logFunc = \"log\";\n        if (theConsole[func]) {\n            logFunc = func;\n        }\n        if (isFunction(theConsole[logFunc])) {\n            theConsole[logFunc](message);\n        }\n    }\n}\nvar _InternalLogMessage = /** @class */ (function () {\n    function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n        if (isUserAct === void 0) { isUserAct = false; }\n        var _self = this;\n        _self[_DYN_MESSAGE_ID ] = msgId;\n        _self[_DYN_MESSAGE$2 ] =\n            (isUserAct ? AiUserActionablePrefix : AiNonUserActionablePrefix) +\n                msgId;\n        var strProps = STR_EMPTY;\n        if (hasJSON()) {\n            strProps = getJSON().stringify(properties);\n        }\n        var diagnosticText = (msg ? \" message:\" + _sanitizeDiagnosticText(msg) : STR_EMPTY) +\n            (properties ? \" props:\" + _sanitizeDiagnosticText(strProps) : STR_EMPTY);\n        _self[_DYN_MESSAGE$2 ] += diagnosticText;\n    }\n    _InternalLogMessage.dataType = \"MessageData\";\n    return _InternalLogMessage;\n}());\nfunction safeGetLogger(core, config) {\n    return (core || {})[_DYN_LOGGER ] || new DiagnosticLogger(config);\n}\nvar DiagnosticLogger = /** @class */ (function () {\n    function DiagnosticLogger(config) {\n        this.identifier = \"DiagnosticLogger\";\n        this.queue = [];\n        var _messageCount = 0;\n        var _messageLogged = {};\n        var _loggingLevelConsole;\n        var _loggingLevelTelemetry;\n        var _maxInternalMessageLimit;\n        var _enableDebug;\n        dynamicProto(DiagnosticLogger, this, function (_self) {\n            _setDefaultsFromConfig(config || {});\n            _self.consoleLoggingLevel = function () { return _loggingLevelConsole; };\n            _self.telemetryLoggingLevel = function () { return _loggingLevelTelemetry; };\n            _self.maxInternalMessageLimit = function () { return _maxInternalMessageLimit; };\n            _self[_DYN_ENABLE_DEBUG_EXCEPTI4 ] = function () { return _enableDebug; };\n            _self.throwInternal = function (severity, msgId, msg, properties, isUserAct) {\n                if (isUserAct === void 0) { isUserAct = false; }\n                var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n                if (_enableDebug) {\n                    throw dumpObj(message);\n                }\n                else {\n                    var logFunc = severity === 1  ? STR_ERROR_TO_CONSOLE : STR_WARN_TO_CONSOLE;\n                    if (!isUndefined(message[_DYN_MESSAGE$2 ])) {\n                        if (isUserAct) {\n                            var messageKey = +message[_DYN_MESSAGE_ID ];\n                            if (!_messageLogged[messageKey] && _loggingLevelConsole >= severity) {\n                                _self[logFunc](message[_DYN_MESSAGE$2 ]);\n                                _messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            if (_loggingLevelConsole >= severity) {\n                                _self[logFunc](message[_DYN_MESSAGE$2 ]);\n                            }\n                        }\n                        _logInternalMessage(severity, message);\n                    }\n                    else {\n                        _debugExtMsg(\"throw\" + (severity === 1  ? \"Critical\" : \"Warning\"), message);\n                    }\n                }\n            };\n            _self[STR_WARN_TO_CONSOLE ] = function (message) {\n                _logToConsole(\"warn\", message);\n                _debugExtMsg(\"warning\", message);\n            };\n            _self[STR_ERROR_TO_CONSOLE ] = function (message) {\n                _logToConsole(\"error\", message);\n                _debugExtMsg(\"error\", message);\n            };\n            _self.resetInternalMessageCount = function () {\n                _messageCount = 0;\n                _messageLogged = {};\n            };\n            _self[_DYN_LOG_INTERNAL_MESSAGE ] = _logInternalMessage;\n            function _logInternalMessage(severity, message) {\n                if (_areInternalMessagesThrottled()) {\n                    return;\n                }\n                var logMessage = true;\n                var messageKey = AIInternalMessagePrefix + message[_DYN_MESSAGE_ID ];\n                if (_messageLogged[messageKey]) {\n                    logMessage = false;\n                }\n                else {\n                    _messageLogged[messageKey] = true;\n                }\n                if (logMessage) {\n                    if (severity <= _loggingLevelTelemetry) {\n                        _self.queue[_DYN_PUSH$2 ](message);\n                        _messageCount++;\n                        _debugExtMsg((severity === 1  ? \"error\" : \"warn\"), message);\n                    }\n                    if (_messageCount === _maxInternalMessageLimit) {\n                        var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                        var throttleMessage = new _InternalLogMessage(23 , throttleLimitMessage, false);\n                        _self.queue[_DYN_PUSH$2 ](throttleMessage);\n                        if (severity === 1 ) {\n                            _self[STR_ERROR_TO_CONSOLE ](throttleLimitMessage);\n                        }\n                        else {\n                            _self[STR_WARN_TO_CONSOLE ](throttleLimitMessage);\n                        }\n                    }\n                }\n            }\n            function _setDefaultsFromConfig(config) {\n                _loggingLevelConsole = getCfgValue(config.loggingLevelConsole, 0);\n                _loggingLevelTelemetry = getCfgValue(config.loggingLevelTelemetry, 1);\n                _maxInternalMessageLimit = getCfgValue(config.maxMessageLimit, 25);\n                _enableDebug = getCfgValue(config.enableDebug, getCfgValue(config[_DYN_ENABLE_DEBUG_EXCEPTI4 ], false));\n            }\n            function _areInternalMessagesThrottled() {\n                return _messageCount >= _maxInternalMessageLimit;\n            }\n            function _debugExtMsg(name, data) {\n                var dbgExt = getDebugExt(config || {});\n                if (dbgExt && dbgExt[_DYN_DIAG_LOG$2 ]) {\n                    dbgExt[_DYN_DIAG_LOG$2 ](name, data);\n                }\n            }\n        });\n    }\n    DiagnosticLogger.__ieDyn=1;\n    return DiagnosticLogger;\n}());\nfunction _getLogger(logger) {\n    return (logger || new DiagnosticLogger());\n}\nfunction _throwInternal(logger, severity, msgId, msg, properties, isUserAct) {\n    if (isUserAct === void 0) { isUserAct = false; }\n    _getLogger(logger).throwInternal(severity, msgId, msg, properties, isUserAct);\n}\nfunction _warnToConsole(logger, message) {\n    _getLogger(logger)[STR_WARN_TO_CONSOLE ](message);\n}\nfunction _logInternalMessage(logger, severity, message) {\n    _getLogger(logger)[_DYN_LOG_INTERNAL_MESSAGE ](severity, message);\n}\n\nvar strExecutionContextKey = \"ctx\";\nvar strParentContextKey = \"ParentContextKey\";\nvar strChildrenContextKey = \"ChildrenContextKey\";\nvar _defaultPerfManager = null;\nvar PerfEvent = /** @class */ (function () {\n    function PerfEvent(name, payloadDetails, isAsync) {\n        var _self = this;\n        var accessorDefined = false;\n        _self.start = dateNow();\n        _self[_DYN_NAME$3 ] = name;\n        _self[_DYN_IS_ASYNC ] = isAsync;\n        _self[_DYN_IS_CHILD_EVT ] = function () { return false; };\n        if (isFunction(payloadDetails)) {\n            var theDetails_1;\n            accessorDefined = objDefineAccessors(_self, \"payload\", function () {\n                if (!theDetails_1 && isFunction(payloadDetails)) {\n                    theDetails_1 = payloadDetails();\n                    payloadDetails = null;\n                }\n                return theDetails_1;\n            });\n        }\n        _self[_DYN_GET_CTX ] = function (key) {\n            if (key) {\n                if (key === PerfEvent[strParentContextKey] || key === PerfEvent[strChildrenContextKey]) {\n                    return _self[key];\n                }\n                return (_self[strExecutionContextKey] || {})[key];\n            }\n            return null;\n        };\n        _self[_DYN_SET_CTX ] = function (key, value) {\n            if (key) {\n                if (key === PerfEvent[strParentContextKey]) {\n                    if (!_self[key]) {\n                        _self[_DYN_IS_CHILD_EVT ] = function () { return true; };\n                    }\n                    _self[key] = value;\n                }\n                else if (key === PerfEvent[strChildrenContextKey]) {\n                    _self[key] = value;\n                }\n                else {\n                    var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                    ctx[key] = value;\n                }\n            }\n        };\n        _self[_DYN_COMPLETE ] = function () {\n            var childTime = 0;\n            var childEvts = _self[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);\n            if (isArray(childEvts)) {\n                for (var lp = 0; lp < childEvts[_DYN_LENGTH$5 ]; lp++) {\n                    var childEvt = childEvts[lp];\n                    if (childEvt) {\n                        childTime += childEvt[_DYN_TIME ];\n                    }\n                }\n            }\n            _self[_DYN_TIME ] = dateNow() - _self.start;\n            _self.exTime = _self[_DYN_TIME ] - childTime;\n            _self[_DYN_COMPLETE ] = function () { };\n            if (!accessorDefined && isFunction(payloadDetails)) {\n                _self.payload = payloadDetails();\n            }\n        };\n    }\n    PerfEvent.ParentContextKey = \"parent\";\n    PerfEvent.ChildrenContextKey = \"childEvts\";\n    return PerfEvent;\n}());\nvar PerfManager = /** @class */ (function () {\n    function PerfManager(manager) {\n        this.ctx = {};\n        dynamicProto(PerfManager, this, function (_self) {\n            _self.create = function (src, payloadDetails, isAsync) {\n                return new PerfEvent(src, payloadDetails, isAsync);\n            };\n            _self.fire = function (perfEvent) {\n                if (perfEvent) {\n                    perfEvent[_DYN_COMPLETE ]();\n                    if (manager && isFunction(manager[STR_PERF_EVENT ])) {\n                        manager[STR_PERF_EVENT ](perfEvent);\n                    }\n                }\n            };\n            _self[_DYN_SET_CTX ] = function (key, value) {\n                if (key) {\n                    var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                    ctx[key] = value;\n                }\n            };\n            _self[_DYN_GET_CTX ] = function (key) {\n                return (_self[strExecutionContextKey] || {})[key];\n            };\n        });\n    }\n    PerfManager.__ieDyn=1;\n    return PerfManager;\n}());\nvar doPerfActiveKey = \"CoreUtils.doPerf\";\nfunction doPerf(mgrSource, getSource, func, details, isAsync) {\n    if (mgrSource) {\n        var perfMgr = mgrSource;\n        if (perfMgr[STR_GET_PERF_MGR]) {\n            perfMgr = perfMgr[STR_GET_PERF_MGR]();\n        }\n        if (perfMgr) {\n            var perfEvt = void 0;\n            var currentActive = perfMgr[_DYN_GET_CTX ](doPerfActiveKey);\n            try {\n                perfEvt = perfMgr.create(getSource(), details, isAsync);\n                if (perfEvt) {\n                    if (currentActive && perfEvt[_DYN_SET_CTX ]) {\n                        perfEvt[_DYN_SET_CTX ](PerfEvent[strParentContextKey], currentActive);\n                        if (currentActive[_DYN_GET_CTX ] && currentActive[_DYN_SET_CTX ]) {\n                            var children = currentActive[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);\n                            if (!children) {\n                                children = [];\n                                currentActive[_DYN_SET_CTX ](PerfEvent[strChildrenContextKey], children);\n                            }\n                            children[_DYN_PUSH$2 ](perfEvt);\n                        }\n                    }\n                    perfMgr[_DYN_SET_CTX ](doPerfActiveKey, perfEvt);\n                    return func(perfEvt);\n                }\n            }\n            catch (ex) {\n                if (perfEvt && perfEvt[_DYN_SET_CTX ]) {\n                    perfEvt[_DYN_SET_CTX ](\"exception\", ex);\n                }\n            }\n            finally {\n                if (perfEvt) {\n                    perfMgr.fire(perfEvt);\n                }\n                perfMgr[_DYN_SET_CTX ](doPerfActiveKey, currentActive);\n            }\n        }\n    }\n    return func();\n}\nfunction getGblPerfMgr() {\n    return _defaultPerfManager;\n}\n\nvar UInt32Mask = 0x100000000;\nvar MaxUInt32 = 0xffffffff;\nvar _mwcSeeded = false;\nvar _mwcW = 123456789;\nvar _mwcZ = 987654321;\nfunction _mwcSeed(seedValue) {\n    if (seedValue < 0) {\n        seedValue >>>= 0;\n    }\n    _mwcW = (123456789 + seedValue) & MaxUInt32;\n    _mwcZ = (987654321 - seedValue) & MaxUInt32;\n    _mwcSeeded = true;\n}\nfunction _autoSeedMwc() {\n    try {\n        var now = dateNow() & 0x7fffffff;\n        _mwcSeed(((Math.random() * UInt32Mask) ^ now) + now);\n    }\n    catch (e) {\n    }\n}\nfunction randomValue(maxValue) {\n    if (maxValue > 0) {\n        return Math.floor((random32() / MaxUInt32) * (maxValue + 1)) >>> 0;\n    }\n    return 0;\n}\nfunction random32(signed) {\n    var value = 0;\n    var c = getCrypto() || getMsCrypto();\n    if (c && c.getRandomValues) {\n        value = c.getRandomValues(new Uint32Array(1))[0] & MaxUInt32;\n    }\n    if (value === 0 && isIE()) {\n        if (!_mwcSeeded) {\n            _autoSeedMwc();\n        }\n        value = mwcRandom32() & MaxUInt32;\n    }\n    if (value === 0) {\n        value = Math.floor((UInt32Mask * Math.random()) | 0);\n    }\n    if (!signed) {\n        value >>>= 0;\n    }\n    return value;\n}\nfunction mwcRandomSeed(value) {\n    if (!value) {\n        _autoSeedMwc();\n    }\n    else {\n        _mwcSeed(value);\n    }\n}\nfunction mwcRandom32(signed) {\n    _mwcZ = (36969 * (_mwcZ & 0xFFFF) + (_mwcZ >> 16)) & MaxUInt32;\n    _mwcW = (18000 * (_mwcW & 0xFFFF) + (_mwcW >> 16)) & MaxUInt32;\n    var value = (((_mwcZ << 16) + (_mwcW & 0xFFFF)) >>> 0) & MaxUInt32 | 0;\n    if (!signed) {\n        value >>>= 0;\n    }\n    return value;\n}\nfunction newId(maxLength) {\n    if (maxLength === void 0) { maxLength = 22; }\n    var base64chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var number = random32() >>> 0;\n    var chars = 0;\n    var result = STR_EMPTY;\n    while (result[_DYN_LENGTH$5 ] < maxLength) {\n        chars++;\n        result += base64chars.charAt(number & 0x3F);\n        number >>>= 6;\n        if (chars === 5) {\n            number = (((random32() << 2) & 0xFFFFFFFF) | (number & 0x03)) >>> 0;\n            chars = 0;\n        }\n    }\n    return result;\n}\n\nvar _objDefineProperty = ObjDefineProperty;\nvar version = '2.8.14';\nvar instanceName = \".\" + newId(6);\nvar _dataUid = 0;\nfunction _createAccessor(target, prop, value) {\n    if (_objDefineProperty) {\n        try {\n            _objDefineProperty(target, prop, {\n                value: value,\n                enumerable: false,\n                configurable: true\n            });\n            return true;\n        }\n        catch (e) {\n        }\n    }\n    return false;\n}\nfunction _canAcceptData(target) {\n    return target[_DYN_NODE_TYPE ] === 1 || target[_DYN_NODE_TYPE ] === 9 || !(+target[_DYN_NODE_TYPE ]);\n}\nfunction _getCache(data, target) {\n    var theCache = target[data.id];\n    if (!theCache) {\n        theCache = {};\n        try {\n            if (_canAcceptData(target)) {\n                if (!_createAccessor(target, data.id, theCache)) {\n                    target[data.id] = theCache;\n                }\n            }\n        }\n        catch (e) {\n        }\n    }\n    return theCache;\n}\nfunction createUniqueNamespace(name, includeVersion) {\n    if (includeVersion === void 0) { includeVersion = false; }\n    return normalizeJsName(name + (_dataUid++) + (includeVersion ? \".\" + version : STR_EMPTY) + instanceName);\n}\nfunction createElmNodeData(name) {\n    var data = {\n        id: createUniqueNamespace(\"_aiData-\" + (name || STR_EMPTY) + \".\" + version),\n        accept: function (target) {\n            return _canAcceptData(target);\n        },\n        get: function (target, name, defValue, addDefault) {\n            var theCache = target[data.id];\n            if (!theCache) {\n                if (addDefault) {\n                    theCache = _getCache(data, target);\n                    theCache[normalizeJsName(name)] = defValue;\n                }\n                return defValue;\n            }\n            return theCache[normalizeJsName(name)];\n        },\n        kill: function (target, name) {\n            if (target && target[name]) {\n                try {\n                    delete target[name];\n                }\n                catch (e) {\n                }\n            }\n        }\n    };\n    return data;\n}\n\nvar strToGMTString = \"toGMTString\";\nvar strToUTCString = \"toUTCString\";\nvar strCookie = \"cookie\";\nvar strExpires = \"expires\";\nvar strEnabled = \"enabled\";\nvar strIsCookieUseDisabled = \"isCookieUseDisabled\";\nvar strDisableCookiesUsage = \"disableCookiesUsage\";\nvar strConfigCookieMgr = \"_ckMgr\";\nvar _supportsCookies = null;\nvar _allowUaSameSite = null;\nvar _parsedCookieValue = null;\nvar _doc = getDocument();\nvar _cookieCache = {};\nvar _globalCookieConfig = {};\nfunction _gblCookieMgr(config, logger) {\n    var inst = createCookieMgr[strConfigCookieMgr] || _globalCookieConfig[strConfigCookieMgr];\n    if (!inst) {\n        inst = createCookieMgr[strConfigCookieMgr] = createCookieMgr(config, logger);\n        _globalCookieConfig[strConfigCookieMgr] = inst;\n    }\n    return inst;\n}\nfunction _isMgrEnabled(cookieMgr) {\n    if (cookieMgr) {\n        return cookieMgr.isEnabled();\n    }\n    return true;\n}\nfunction _createCookieMgrConfig(rootConfig) {\n    var cookieMgrCfg = rootConfig[_DYN_COOKIE_CFG ] = rootConfig[_DYN_COOKIE_CFG ] || {};\n    setValue(cookieMgrCfg, \"domain\", rootConfig.cookieDomain, isNotNullOrUndefined, isNullOrUndefined);\n    setValue(cookieMgrCfg, \"path\", rootConfig.cookiePath || \"/\", null, isNullOrUndefined);\n    if (isNullOrUndefined(cookieMgrCfg[strEnabled])) {\n        var cookieEnabled = void 0;\n        if (!isUndefined(rootConfig[strIsCookieUseDisabled])) {\n            cookieEnabled = !rootConfig[strIsCookieUseDisabled];\n        }\n        if (!isUndefined(rootConfig[strDisableCookiesUsage])) {\n            cookieEnabled = !rootConfig[strDisableCookiesUsage];\n        }\n        cookieMgrCfg[strEnabled] = cookieEnabled;\n    }\n    return cookieMgrCfg;\n}\nfunction _isIgnoredCookie(cookieMgrCfg, name) {\n    if (name && cookieMgrCfg && isArray(cookieMgrCfg.ignoreCookies)) {\n        return cookieMgrCfg.ignoreCookies[_DYN_INDEX_OF$2 ](name) !== -1;\n    }\n    return false;\n}\nfunction _isBlockedCookie(cookieMgrCfg, name) {\n    if (name && cookieMgrCfg && isArray(cookieMgrCfg.blockedCookies)) {\n        if (cookieMgrCfg.blockedCookies[_DYN_INDEX_OF$2 ](name) !== -1) {\n            return true;\n        }\n    }\n    return _isIgnoredCookie(cookieMgrCfg, name);\n}\nfunction safeGetCookieMgr(core, config) {\n    var cookieMgr;\n    if (core) {\n        cookieMgr = core.getCookieMgr();\n    }\n    else if (config) {\n        var cookieCfg = config[_DYN_COOKIE_CFG ];\n        if (cookieCfg[strConfigCookieMgr]) {\n            cookieMgr = cookieCfg[strConfigCookieMgr];\n        }\n        else {\n            cookieMgr = createCookieMgr(config);\n        }\n    }\n    if (!cookieMgr) {\n        cookieMgr = _gblCookieMgr(config, (core || {})[_DYN_LOGGER ]);\n    }\n    return cookieMgr;\n}\nfunction createCookieMgr(rootConfig, logger) {\n    var _a;\n    var cookieMgrConfig = _createCookieMgrConfig(rootConfig || _globalCookieConfig);\n    var _path = cookieMgrConfig.path || \"/\";\n    var _domain = cookieMgrConfig.domain;\n    var _enabled = cookieMgrConfig[strEnabled] !== false;\n    var cookieMgr = (_a = {\n            isEnabled: function () {\n                var enabled = _enabled && areCookiesSupported(logger);\n                var gblManager = _globalCookieConfig[strConfigCookieMgr];\n                if (enabled && gblManager && cookieMgr !== gblManager) {\n                    enabled = _isMgrEnabled(gblManager);\n                }\n                return enabled;\n            }\n        },\n        _a[_DYN_SET_ENABLED ] = function (value) {\n            _enabled = value !== false;\n        },\n        _a.set = function (name, value, maxAgeSec, domain, path) {\n            var result = false;\n            if (_isMgrEnabled(cookieMgr) && !_isBlockedCookie(cookieMgrConfig, name)) {\n                var values = {};\n                var theValue = strTrim(value || STR_EMPTY);\n                var idx = theValue[_DYN_INDEX_OF$2 ](\";\");\n                if (idx !== -1) {\n                    theValue = strTrim(value[_DYN_SUBSTRING$1 ](0, idx));\n                    values = _extractParts(value[_DYN_SUBSTRING$1 ](idx + 1));\n                }\n                setValue(values, \"domain\", domain || _domain, isTruthy, isUndefined);\n                if (!isNullOrUndefined(maxAgeSec)) {\n                    var _isIE = isIE();\n                    if (isUndefined(values[strExpires])) {\n                        var nowMs = dateNow();\n                        var expireMs = nowMs + (maxAgeSec * 1000);\n                        if (expireMs > 0) {\n                            var expiry = new Date();\n                            expiry.setTime(expireMs);\n                            setValue(values, strExpires, _formatDate(expiry, !_isIE ? strToUTCString : strToGMTString) || _formatDate(expiry, _isIE ? strToGMTString : strToUTCString) || STR_EMPTY, isTruthy);\n                        }\n                    }\n                    if (!_isIE) {\n                        setValue(values, \"max-age\", STR_EMPTY + maxAgeSec, null, isUndefined);\n                    }\n                }\n                var location_1 = getLocation();\n                if (location_1 && location_1.protocol === \"https:\") {\n                    setValue(values, \"secure\", null, null, isUndefined);\n                    if (_allowUaSameSite === null) {\n                        _allowUaSameSite = !uaDisallowsSameSiteNone((getNavigator() || {})[_DYN_USER_AGENT ]);\n                    }\n                    if (_allowUaSameSite) {\n                        setValue(values, \"SameSite\", \"None\", null, isUndefined);\n                    }\n                }\n                setValue(values, \"path\", path || _path, null, isUndefined);\n                var setCookieFn = cookieMgrConfig.setCookie || _setCookieValue;\n                setCookieFn(name, _formatCookieValue(theValue, values));\n                result = true;\n            }\n            return result;\n        },\n        _a.get = function (name) {\n            var value = STR_EMPTY;\n            if (_isMgrEnabled(cookieMgr) && !_isIgnoredCookie(cookieMgrConfig, name)) {\n                value = (cookieMgrConfig.getCookie || _getCookieValue)(name);\n            }\n            return value;\n        },\n        _a.del = function (name, path) {\n            var result = false;\n            if (_isMgrEnabled(cookieMgr)) {\n                result = cookieMgr.purge(name, path);\n            }\n            return result;\n        },\n        _a.purge = function (name, path) {\n            var _a;\n            var result = false;\n            if (areCookiesSupported(logger)) {\n                var values = (_a = {},\n                    _a[\"path\"] = path ? path : \"/\",\n                    _a[strExpires] = \"Thu, 01 Jan 1970 00:00:01 GMT\",\n                    _a);\n                if (!isIE()) {\n                    values[\"max-age\"] = \"0\";\n                }\n                var delCookie = cookieMgrConfig.delCookie || _setCookieValue;\n                delCookie(name, _formatCookieValue(STR_EMPTY, values));\n                result = true;\n            }\n            return result;\n        },\n        _a);\n    cookieMgr[strConfigCookieMgr] = cookieMgr;\n    return cookieMgr;\n}\nfunction areCookiesSupported(logger) {\n    if (_supportsCookies === null) {\n        _supportsCookies = false;\n        try {\n            var doc = _doc || {};\n            _supportsCookies = doc[strCookie] !== undefined;\n        }\n        catch (e) {\n            _throwInternal(logger, 2 , 68 , \"Cannot access document.cookie - \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return _supportsCookies;\n}\nfunction _extractParts(theValue) {\n    var values = {};\n    if (theValue && theValue[_DYN_LENGTH$5 ]) {\n        var parts = strTrim(theValue)[_DYN_SPLIT$1 ](\";\");\n        arrForEach(parts, function (thePart) {\n            thePart = strTrim(thePart || STR_EMPTY);\n            if (thePart) {\n                var idx = thePart[_DYN_INDEX_OF$2 ](\"=\");\n                if (idx === -1) {\n                    values[thePart] = null;\n                }\n                else {\n                    values[strTrim(thePart[_DYN_SUBSTRING$1 ](0, idx))] = strTrim(thePart[_DYN_SUBSTRING$1 ](idx + 1));\n                }\n            }\n        });\n    }\n    return values;\n}\nfunction _formatDate(theDate, func) {\n    if (isFunction(theDate[func])) {\n        return theDate[func]();\n    }\n    return null;\n}\nfunction _formatCookieValue(value, values) {\n    var cookieValue = value || STR_EMPTY;\n    objForEachKey(values, function (name, theValue) {\n        cookieValue += \"; \" + name + (!isNullOrUndefined(theValue) ? \"=\" + theValue : STR_EMPTY);\n    });\n    return cookieValue;\n}\nfunction _getCookieValue(name) {\n    var cookieValue = STR_EMPTY;\n    if (_doc) {\n        var theCookie = _doc[strCookie] || STR_EMPTY;\n        if (_parsedCookieValue !== theCookie) {\n            _cookieCache = _extractParts(theCookie);\n            _parsedCookieValue = theCookie;\n        }\n        cookieValue = strTrim(_cookieCache[name] || STR_EMPTY);\n    }\n    return cookieValue;\n}\nfunction _setCookieValue(name, cookieValue) {\n    if (_doc) {\n        _doc[strCookie] = name + \"=\" + cookieValue;\n    }\n}\nfunction uaDisallowsSameSiteNone(userAgent) {\n    if (!isString(userAgent)) {\n        return false;\n    }\n    if (strContains(userAgent, \"CPU iPhone OS 12\") || strContains(userAgent, \"iPad; CPU OS 12\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strContains(userAgent, \"Version/\") && strContains(userAgent, \"Safari\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strEndsWith(userAgent, \"AppleWebKit/605.1.15 (KHTML, like Gecko)\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"Chrome/5\") || strContains(userAgent, \"Chrome/6\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"UnrealEngine\") && !strContains(userAgent, \"Chrome\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"UCBrowser/12\") || strContains(userAgent, \"UCBrowser/11\")) {\n        return true;\n    }\n    return false;\n}\n\nvar strOnPrefix = \"on\";\nvar strAttachEvent = \"attachEvent\";\nvar strAddEventHelper = \"addEventListener\";\nvar strDetachEvent = \"detachEvent\";\nvar strRemoveEventListener = \"removeEventListener\";\nvar strEvents = \"events\";\nvar strVisibilityChangeEvt = \"visibilitychange\";\nvar strPageHide = \"pagehide\";\nvar strUnload = \"unload\";\nvar strBeforeUnload = \"beforeunload\";\nvar strPageHideNamespace = createUniqueNamespace(\"aiEvtPageHide\");\ncreateUniqueNamespace(\"aiEvtPageShow\");\nvar rRemoveEmptyNs = /\\.[\\.]+/g;\nvar rRemoveTrailingEmptyNs = /[\\.]+$/;\nvar _guid = 1;\nvar elmNodeData = createElmNodeData(\"events\");\nvar eventNamespace = /^([^.]*)(?:\\.(.+)|)/;\nfunction _normalizeNamespace(name) {\n    if (name && name[_DYN_REPLACE ]) {\n        return name[_DYN_REPLACE ](/^[\\s\\.]+|(?=[\\s\\.])[\\.\\s]+$/g, STR_EMPTY);\n    }\n    return name;\n}\nfunction _getEvtNamespace(eventName, evtNamespace) {\n    var _a;\n    if (evtNamespace) {\n        var theNamespace_1 = STR_EMPTY;\n        if (isArray(evtNamespace)) {\n            theNamespace_1 = STR_EMPTY;\n            arrForEach(evtNamespace, function (name) {\n                name = _normalizeNamespace(name);\n                if (name) {\n                    if (name[0] !== \".\") {\n                        name = \".\" + name;\n                    }\n                    theNamespace_1 += name;\n                }\n            });\n        }\n        else {\n            theNamespace_1 = _normalizeNamespace(evtNamespace);\n        }\n        if (theNamespace_1) {\n            if (theNamespace_1[0] !== \".\") {\n                theNamespace_1 = \".\" + theNamespace_1;\n            }\n            eventName = (eventName || STR_EMPTY) + theNamespace_1;\n        }\n    }\n    var parsedEvent = (eventNamespace.exec(eventName || STR_EMPTY) || []);\n    return _a = {},\n        _a[_DYN_TYPE ] = parsedEvent[1],\n        _a.ns = ((parsedEvent[2] || STR_EMPTY).replace(rRemoveEmptyNs, \".\").replace(rRemoveTrailingEmptyNs, STR_EMPTY)[_DYN_SPLIT$1 ](\".\").sort()).join(\".\"),\n        _a;\n}\nfunction _getRegisteredEvents(target, evtName, addDefault) {\n    if (addDefault === void 0) { addDefault = true; }\n    var aiEvts = elmNodeData.get(target, strEvents, {}, addDefault);\n    var registeredEvents = aiEvts[evtName];\n    if (!registeredEvents) {\n        registeredEvents = aiEvts[evtName] = [];\n    }\n    return registeredEvents;\n}\nfunction _doDetach(obj, evtName, handlerRef, useCapture) {\n    if (obj && evtName && evtName[_DYN_TYPE ]) {\n        if (obj[strRemoveEventListener]) {\n            obj[strRemoveEventListener](evtName[_DYN_TYPE ], handlerRef, useCapture);\n        }\n        else if (obj[strDetachEvent]) {\n            obj[strDetachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);\n        }\n    }\n}\nfunction _doAttach(obj, evtName, handlerRef, useCapture) {\n    var result = false;\n    if (obj && evtName && evtName[_DYN_TYPE ] && handlerRef) {\n        if (obj[strAddEventHelper]) {\n            obj[strAddEventHelper](evtName[_DYN_TYPE ], handlerRef, useCapture);\n            result = true;\n        }\n        else if (obj[strAttachEvent]) {\n            obj[strAttachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);\n            result = true;\n        }\n    }\n    return result;\n}\nfunction _doUnregister(target, events, evtName, unRegFn) {\n    var idx = events[_DYN_LENGTH$5 ];\n    while (idx--) {\n        var theEvent = events[idx];\n        if (theEvent) {\n            if (!evtName.ns || evtName.ns === theEvent.evtName.ns) {\n                if (!unRegFn || unRegFn(theEvent)) {\n                    _doDetach(target, theEvent.evtName, theEvent[_DYN_HANDLER ], theEvent.capture);\n                    events[_DYN_SPLICE ](idx, 1);\n                }\n            }\n        }\n    }\n}\nfunction _unregisterEvents(target, evtName, unRegFn) {\n    if (evtName[_DYN_TYPE ]) {\n        _doUnregister(target, _getRegisteredEvents(target, evtName[_DYN_TYPE ]), evtName, unRegFn);\n    }\n    else {\n        var eventCache = elmNodeData.get(target, strEvents, {});\n        objForEachKey(eventCache, function (evtType, events) {\n            _doUnregister(target, events, evtName, unRegFn);\n        });\n        if (objKeys(eventCache)[_DYN_LENGTH$5 ] === 0) {\n            elmNodeData.kill(target, strEvents);\n        }\n    }\n}\nfunction mergeEvtNamespace(theNamespace, namespaces) {\n    var newNamespaces;\n    if (namespaces) {\n        if (isArray(namespaces)) {\n            newNamespaces = [theNamespace].concat(namespaces);\n        }\n        else {\n            newNamespaces = [theNamespace, namespaces];\n        }\n        newNamespaces = (_getEvtNamespace(\"xx\", newNamespaces).ns)[_DYN_SPLIT$1 ](\".\");\n    }\n    else {\n        newNamespaces = theNamespace;\n    }\n    return newNamespaces;\n}\nfunction eventOn(target, eventName, handlerRef, evtNamespace, useCapture) {\n    var _a;\n    if (useCapture === void 0) { useCapture = false; }\n    var result = false;\n    if (target) {\n        try {\n            var evtName = _getEvtNamespace(eventName, evtNamespace);\n            result = _doAttach(target, evtName, handlerRef, useCapture);\n            if (result && elmNodeData.accept(target)) {\n                var registeredEvent = (_a = {\n                        guid: _guid++,\n                        evtName: evtName\n                    },\n                    _a[_DYN_HANDLER ] = handlerRef,\n                    _a.capture = useCapture,\n                    _a);\n                _getRegisteredEvents(target, evtName.type)[_DYN_PUSH$2 ](registeredEvent);\n            }\n        }\n        catch (e) {\n        }\n    }\n    return result;\n}\nfunction eventOff(target, eventName, handlerRef, evtNamespace, useCapture) {\n    if (useCapture === void 0) { useCapture = false; }\n    if (target) {\n        try {\n            var evtName_1 = _getEvtNamespace(eventName, evtNamespace);\n            var found_1 = false;\n            _unregisterEvents(target, evtName_1, function (regEvent) {\n                if ((evtName_1.ns && !handlerRef) || regEvent[_DYN_HANDLER ] === handlerRef) {\n                    found_1 = true;\n                    return true;\n                }\n                return false;\n            });\n            if (!found_1) {\n                _doDetach(target, evtName_1, handlerRef, useCapture);\n            }\n        }\n        catch (e) {\n        }\n    }\n}\nfunction attachEvent(obj, eventNameWithoutOn, handlerRef, useCapture) {\n    if (useCapture === void 0) { useCapture = false; }\n    return eventOn(obj, eventNameWithoutOn, handlerRef, null, useCapture);\n}\nfunction addEventHandler(eventName, callback, evtNamespace) {\n    var result = false;\n    var w = getWindow();\n    if (w) {\n        result = eventOn(w, eventName, callback, evtNamespace);\n        result = eventOn(w[\"body\"], eventName, callback, evtNamespace) || result;\n    }\n    var doc = getDocument();\n    if (doc) {\n        result = eventOn(doc, eventName, callback, evtNamespace) || result;\n    }\n    return result;\n}\nfunction removeEventHandler(eventName, callback, evtNamespace) {\n    var w = getWindow();\n    if (w) {\n        eventOff(w, eventName, callback, evtNamespace);\n        eventOff(w[\"body\"], eventName, callback, evtNamespace);\n    }\n    var doc = getDocument();\n    if (doc) {\n        eventOff(doc, eventName, callback, evtNamespace);\n    }\n}\nfunction _addEventListeners(events, listener, excludeEvents, evtNamespace) {\n    var added = false;\n    if (listener && events && events[_DYN_LENGTH$5 ] > 0) {\n        arrForEach(events, function (name) {\n            if (name) {\n                if (!excludeEvents || arrIndexOf(excludeEvents, name) === -1) {\n                    added = addEventHandler(name, listener, evtNamespace) || added;\n                }\n            }\n        });\n    }\n    return added;\n}\nfunction addEventListeners(events, listener, excludeEvents, evtNamespace) {\n    var added = false;\n    if (listener && events && isArray(events)) {\n        added = _addEventListeners(events, listener, excludeEvents, evtNamespace);\n        if (!added && excludeEvents && excludeEvents[_DYN_LENGTH$5 ] > 0) {\n            added = _addEventListeners(events, listener, null, evtNamespace);\n        }\n    }\n    return added;\n}\nfunction removeEventListeners(events, listener, evtNamespace) {\n    if (events && isArray(events)) {\n        arrForEach(events, function (name) {\n            if (name) {\n                removeEventHandler(name, listener, evtNamespace);\n            }\n        });\n    }\n}\nfunction addPageUnloadEventListener(listener, excludeEvents, evtNamespace) {\n    return addEventListeners([strBeforeUnload, strUnload, strPageHide], listener, excludeEvents, evtNamespace);\n}\nfunction removePageUnloadEventListener(listener, evtNamespace) {\n    removeEventListeners([strBeforeUnload, strUnload, strPageHide], listener, evtNamespace);\n}\nfunction addPageHideEventListener(listener, excludeEvents, evtNamespace) {\n    function _handlePageVisibility(evt) {\n        var doc = getDocument();\n        if (listener && doc && doc.visibilityState === \"hidden\") {\n            listener(evt);\n        }\n    }\n    var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);\n    var pageUnloadAdded = _addEventListeners([strPageHide], listener, excludeEvents, newNamespaces);\n    if (!excludeEvents || arrIndexOf(excludeEvents, strVisibilityChangeEvt) === -1) {\n        pageUnloadAdded = _addEventListeners([strVisibilityChangeEvt], _handlePageVisibility, excludeEvents, newNamespaces) || pageUnloadAdded;\n    }\n    if (!pageUnloadAdded && excludeEvents) {\n        pageUnloadAdded = addPageHideEventListener(listener, null, evtNamespace);\n    }\n    return pageUnloadAdded;\n}\nfunction removePageHideEventListener(listener, evtNamespace) {\n    var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);\n    removeEventListeners([strPageHide], listener, newNamespaces);\n    removeEventListeners([strVisibilityChangeEvt], null, newNamespaces);\n}\n\nvar _cookieMgrs = null;\nvar _canUseCookies;\nfunction newGuid() {\n    var uuid = generateW3CId();\n    return uuid[_DYN_SUBSTRING$1 ](0, 8) + \"-\" + uuid[_DYN_SUBSTRING$1 ](8, 12) + \"-\" + uuid[_DYN_SUBSTRING$1 ](12, 16) + \"-\" + uuid[_DYN_SUBSTRING$1 ](16, 20) + \"-\" + uuid[_DYN_SUBSTRING$1 ](20);\n}\nfunction perfNow() {\n    var perf = getPerformance();\n    if (perf && perf.now) {\n        return perf.now();\n    }\n    return dateNow();\n}\nfunction generateW3CId() {\n    var hexValues = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\n    var oct = STR_EMPTY, tmp;\n    for (var a = 0; a < 4; a++) {\n        tmp = random32();\n        oct +=\n            hexValues[tmp & 0xF] +\n                hexValues[tmp >> 4 & 0xF] +\n                hexValues[tmp >> 8 & 0xF] +\n                hexValues[tmp >> 12 & 0xF] +\n                hexValues[tmp >> 16 & 0xF] +\n                hexValues[tmp >> 20 & 0xF] +\n                hexValues[tmp >> 24 & 0xF] +\n                hexValues[tmp >> 28 & 0xF];\n    }\n    var clockSequenceHi = hexValues[8 + (random32() & 0x03) | 0];\n    return oct[_DYN_SUBSTR ](0, 8) + oct[_DYN_SUBSTR ](9, 4) + \"4\" + oct[_DYN_SUBSTR ](13, 3) + clockSequenceHi + oct[_DYN_SUBSTR ](16, 3) + oct[_DYN_SUBSTR ](19, 12);\n}\nvar CoreUtils = {\n    _canUseCookies: undefined,\n    isTypeof: isTypeof,\n    isUndefined: isUndefined,\n    isNullOrUndefined: isNullOrUndefined,\n    hasOwnProperty: hasOwnProperty,\n    isFunction: isFunction,\n    isObject: isObject,\n    isDate: isDate,\n    isArray: isArray,\n    isError: isError,\n    isString: isString,\n    isNumber: isNumber,\n    isBoolean: isBoolean,\n    toISOString: toISOString,\n    arrForEach: arrForEach,\n    arrIndexOf: arrIndexOf,\n    arrMap: arrMap,\n    arrReduce: arrReduce,\n    strTrim: strTrim,\n    objCreate: objCreateFn,\n    objKeys: objKeys,\n    objDefineAccessors: objDefineAccessors,\n    addEventHandler: addEventHandler,\n    dateNow: dateNow,\n    isIE: isIE,\n    disableCookies: disableCookies,\n    newGuid: newGuid,\n    perfNow: perfNow,\n    newId: newId,\n    randomValue: randomValue,\n    random32: random32,\n    mwcRandomSeed: mwcRandomSeed,\n    mwcRandom32: mwcRandom32,\n    generateW3CId: generateW3CId\n};\nfunction _legacyCookieMgr(config, logger) {\n    var cookieMgr = _gblCookieMgr(config, logger);\n    var legacyCanUseCookies = CoreUtils._canUseCookies;\n    if (_cookieMgrs === null) {\n        _cookieMgrs = [];\n        _canUseCookies = legacyCanUseCookies;\n        objDefineAccessors(CoreUtils, \"_canUseCookies\", function () {\n            return _canUseCookies;\n        }, function (value) {\n            _canUseCookies = value;\n            arrForEach(_cookieMgrs, function (mgr) {\n                mgr[_DYN_SET_ENABLED ](value);\n            });\n        });\n    }\n    if (arrIndexOf(_cookieMgrs, cookieMgr) === -1) {\n        _cookieMgrs[_DYN_PUSH$2 ](cookieMgr);\n    }\n    if (isBoolean(legacyCanUseCookies)) {\n        cookieMgr[_DYN_SET_ENABLED ](legacyCanUseCookies);\n    }\n    if (isBoolean(_canUseCookies)) {\n        cookieMgr[_DYN_SET_ENABLED ](_canUseCookies);\n    }\n    return cookieMgr;\n}\nfunction disableCookies() {\n    _legacyCookieMgr()[_DYN_SET_ENABLED ](false);\n}\nfunction canUseCookies(logger) {\n    return _legacyCookieMgr(null, logger).isEnabled();\n}\nfunction getCookie(logger, name) {\n    return _legacyCookieMgr(null, logger).get(name);\n}\nfunction setCookie(logger, name, value, domain) {\n    _legacyCookieMgr(null, logger).set(name, value, null, domain);\n}\nfunction deleteCookie(logger, name) {\n    return _legacyCookieMgr(null, logger).del(name);\n}\n\nvar TRACE_PARENT_REGEX = /^([\\da-f]{2})-([\\da-f]{32})-([\\da-f]{16})-([\\da-f]{2})(-[^\\s]*)?$/;\nvar DEFAULT_VERSION = \"00\";\nvar INVALID_VERSION = \"ff\";\nvar INVALID_TRACE_ID = \"00000000000000000000000000000000\";\nvar INVALID_SPAN_ID = \"0000000000000000\";\nfunction _isValid(value, len, invalidValue) {\n    if (value && value[_DYN_LENGTH$5 ] === len && value !== invalidValue) {\n        return !!value.match(/^[\\da-f]*$/);\n    }\n    return false;\n}\nfunction _formatValue(value, len, defValue) {\n    if (_isValid(value, len)) {\n        return value;\n    }\n    return defValue;\n}\nfunction _formatFlags(value) {\n    if (isNaN(value) || value < 0 || value > 255) {\n        value = 0x01;\n    }\n    var result = value.toString(16);\n    while (result[_DYN_LENGTH$5 ] < 2) {\n        result = \"0\" + result;\n    }\n    return result;\n}\nfunction createTraceParent(traceId, spanId, flags, version) {\n    var _a;\n    return _a = {},\n        _a[_DYN_VERSION$1 ] = _isValid(version, 2, INVALID_VERSION) ? version : DEFAULT_VERSION,\n        _a[_DYN_TRACE_ID$2 ] = isValidTraceId(traceId) ? traceId : generateW3CId(),\n        _a.spanId = isValidSpanId(spanId) ? spanId : generateW3CId()[_DYN_SUBSTR ](0, 16),\n        _a.traceFlags = flags >= 0 && flags <= 0xFF ? flags : 1,\n        _a;\n}\nfunction parseTraceParent(value) {\n    var _a;\n    if (!value) {\n        return null;\n    }\n    if (isArray(value)) {\n        value = value[0] || \"\";\n    }\n    if (!value || !isString(value) || value[_DYN_LENGTH$5 ] > 8192) {\n        return null;\n    }\n    var match = TRACE_PARENT_REGEX.exec(strTrim(value));\n    if (!match ||\n        match[1] === INVALID_VERSION ||\n        match[2] === INVALID_TRACE_ID ||\n        match[3] === INVALID_SPAN_ID) {\n        return null;\n    }\n    return _a = {},\n        _a[_DYN_VERSION$1 ] = match[1],\n        _a[_DYN_TRACE_ID$2 ] = match[2],\n        _a[_DYN_SPAN_ID$1 ] = match[3],\n        _a[_DYN_TRACE_FLAGS$1 ] = parseInt(match[4], 16),\n        _a;\n}\nfunction isValidTraceId(value) {\n    return _isValid(value, 32, INVALID_TRACE_ID);\n}\nfunction isValidSpanId(value) {\n    return _isValid(value, 16, INVALID_SPAN_ID);\n}\nfunction formatTraceParent(value) {\n    if (value) {\n        var flags = _formatFlags(value[_DYN_TRACE_FLAGS$1 ]);\n        if (!_isValid(flags, 2)) {\n            flags = \"01\";\n        }\n        var version = value[_DYN_VERSION$1 ] || DEFAULT_VERSION;\n        if (version !== \"00\" && version !== \"ff\") {\n            version = DEFAULT_VERSION;\n        }\n        return \"\".concat(version, \"-\").concat(_formatValue(value.traceId, 32, INVALID_TRACE_ID), \"-\").concat(_formatValue(value.spanId, 16, INVALID_SPAN_ID), \"-\").concat(flags);\n    }\n    return \"\";\n}\nfunction findW3cTraceParent() {\n    var name = \"traceparent\";\n    var traceParent = parseTraceParent(findMetaTag(name));\n    if (!traceParent) {\n        traceParent = parseTraceParent(findNamedServerTiming(name));\n    }\n    return traceParent;\n}\n\nvar pluginStateData = createElmNodeData(\"plugin\");\nfunction _getPluginState(plugin) {\n    return pluginStateData.get(plugin, \"state\", {}, true);\n}\nfunction initializePlugins(processContext, extensions) {\n    var initPlugins = [];\n    var lastPlugin = null;\n    var proxy = processContext[_DYN_GET_NEXT ]();\n    var pluginState;\n    while (proxy) {\n        var thePlugin = proxy[_DYN_GET_PLUGIN ]();\n        if (thePlugin) {\n            if (lastPlugin &&\n                isFunction(lastPlugin[_DYN_SET_NEXT_PLUGIN ]) &&\n                isFunction(thePlugin[STR_PROCESS_TELEMETRY ])) {\n                lastPlugin[_DYN_SET_NEXT_PLUGIN ](thePlugin);\n            }\n            var isInitialized = false;\n            if (isFunction(thePlugin[_DYN_IS_INITIALIZED ])) {\n                isInitialized = thePlugin[_DYN_IS_INITIALIZED ]();\n            }\n            else {\n                pluginState = _getPluginState(thePlugin);\n                isInitialized = pluginState[_DYN_IS_INITIALIZED ];\n            }\n            if (!isInitialized) {\n                initPlugins[_DYN_PUSH$2 ](thePlugin);\n            }\n            lastPlugin = thePlugin;\n            proxy = proxy[_DYN_GET_NEXT ]();\n        }\n    }\n    arrForEach(initPlugins, function (thePlugin) {\n        var core = processContext[STR_CORE]();\n        thePlugin[_DYN_INITIALIZE ](processContext.getCfg(), core, extensions, processContext[_DYN_GET_NEXT ]());\n        pluginState = _getPluginState(thePlugin);\n        if (!thePlugin[STR_CORE] && !pluginState[STR_CORE]) {\n            pluginState[STR_CORE] = core;\n        }\n        pluginState[_DYN_IS_INITIALIZED ] = true;\n        delete pluginState[_DYN_TEARDOWN ];\n    });\n}\nfunction sortPlugins(plugins) {\n    return plugins.sort(function (extA, extB) {\n        var result = 0;\n        if (extB) {\n            var bHasProcess = isFunction(extB[STR_PROCESS_TELEMETRY]);\n            if (isFunction(extA[STR_PROCESS_TELEMETRY])) {\n                result = bHasProcess ? extA[STR_PRIORITY] - extB[STR_PRIORITY] : 1;\n            }\n            else if (bHasProcess) {\n                result = -1;\n            }\n        }\n        else {\n            result = extA ? 1 : -1;\n        }\n        return result;\n    });\n}\nfunction createDistributedTraceContext(parentCtx) {\n    var trace = {};\n    return {\n        getName: function () {\n            return trace[_DYN_NAME$3 ];\n        },\n        setName: function (newValue) {\n            parentCtx && parentCtx.setName(newValue);\n            trace[_DYN_NAME$3 ] = newValue;\n        },\n        getTraceId: function () {\n            return trace[_DYN_TRACE_ID$2 ];\n        },\n        setTraceId: function (newValue) {\n            parentCtx && parentCtx.setTraceId(newValue);\n            if (isValidTraceId(newValue)) {\n                trace[_DYN_TRACE_ID$2 ] = newValue;\n            }\n        },\n        getSpanId: function () {\n            return trace[_DYN_SPAN_ID$1 ];\n        },\n        setSpanId: function (newValue) {\n            parentCtx && parentCtx.setSpanId(newValue);\n            if (isValidSpanId(newValue)) {\n                trace[_DYN_SPAN_ID$1 ] = newValue;\n            }\n        },\n        getTraceFlags: function () {\n            return trace[_DYN_TRACE_FLAGS$1 ];\n        },\n        setTraceFlags: function (newTraceFlags) {\n            parentCtx && parentCtx.setTraceFlags(newTraceFlags);\n            trace[_DYN_TRACE_FLAGS$1 ] = newTraceFlags;\n        }\n    };\n}\n\nvar strTelemetryPluginChain = \"TelemetryPluginChain\";\nvar strHasRunFlags = \"_hasRun\";\nvar strGetTelCtx = \"_getTelCtx\";\nvar _chainId = 0;\nfunction _getNextProxyStart(proxy, core, startAt) {\n    while (proxy) {\n        if (proxy[_DYN_GET_PLUGIN ]() === startAt) {\n            return proxy;\n        }\n        proxy = proxy[_DYN_GET_NEXT ]();\n    }\n    return createTelemetryProxyChain([startAt], core[_DYN_CONFIG$2 ] || {}, core);\n}\nfunction _createInternalContext(telemetryChain, config, core, startAt) {\n    var _nextProxy = null;\n    var _onComplete = [];\n    if (startAt !== null) {\n        _nextProxy = startAt ? _getNextProxyStart(telemetryChain, core, startAt) : telemetryChain;\n    }\n    var context = {\n        _next: _moveNext,\n        ctx: {\n            core: function () {\n                return core;\n            },\n            diagLog: function () {\n                return safeGetLogger(core, config);\n            },\n            getCfg: function () {\n                return config;\n            },\n            getExtCfg: _getExtCfg,\n            getConfig: _getConfig,\n            hasNext: function () {\n                return !!_nextProxy;\n            },\n            getNext: function () {\n                return _nextProxy;\n            },\n            setNext: function (nextPlugin) {\n                _nextProxy = nextPlugin;\n            },\n            iterate: _iterateChain,\n            onComplete: _addOnComplete\n        }\n    };\n    function _addOnComplete(onComplete, that) {\n        var args = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            args[_i - 2] = arguments[_i];\n        }\n        if (onComplete) {\n            _onComplete[_DYN_PUSH$2 ]({\n                func: onComplete,\n                self: !isUndefined(that) ? that : context.ctx,\n                args: args\n            });\n        }\n    }\n    function _moveNext() {\n        var nextProxy = _nextProxy;\n        _nextProxy = nextProxy ? nextProxy[_DYN_GET_NEXT ]() : null;\n        if (!nextProxy) {\n            var onComplete = _onComplete;\n            if (onComplete && onComplete[_DYN_LENGTH$5 ] > 0) {\n                arrForEach(onComplete, function (completeDetails) {\n                    try {\n                        completeDetails.func[_DYN_CALL ](completeDetails.self, completeDetails.args);\n                    }\n                    catch (e) {\n                        _throwInternal(core[_DYN_LOGGER ], 2 , 73 , \"Unexpected Exception during onComplete - \" + dumpObj(e));\n                    }\n                });\n                _onComplete = [];\n            }\n        }\n        return nextProxy;\n    }\n    function _getExtCfg(identifier, defaultValue, mergeDefault) {\n        if (defaultValue === void 0) { defaultValue = {}; }\n        if (mergeDefault === void 0) { mergeDefault = 0 ; }\n        var theConfig;\n        if (config) {\n            var extConfig = config[STR_EXTENSION_CONFIG ];\n            if (extConfig && identifier) {\n                theConfig = extConfig[identifier];\n            }\n        }\n        if (!theConfig) {\n            theConfig = defaultValue;\n        }\n        else if (isObject(defaultValue)) {\n            if (mergeDefault !== 0 ) {\n                var newConfig_1 = objExtend(true, defaultValue, theConfig);\n                if (config && mergeDefault === 2 ) {\n                    objForEachKey(defaultValue, function (field) {\n                        if (isNullOrUndefined(newConfig_1[field])) {\n                            var cfgValue = config[field];\n                            if (!isNullOrUndefined(cfgValue)) {\n                                newConfig_1[field] = cfgValue;\n                            }\n                        }\n                    });\n                }\n                theConfig = newConfig_1;\n            }\n        }\n        return theConfig;\n    }\n    function _getConfig(identifier, field, defaultValue) {\n        if (defaultValue === void 0) { defaultValue = false; }\n        var theValue;\n        var extConfig = _getExtCfg(identifier, null);\n        if (extConfig && !isNullOrUndefined(extConfig[field])) {\n            theValue = extConfig[field];\n        }\n        else if (config && !isNullOrUndefined(config[field])) {\n            theValue = config[field];\n        }\n        return !isNullOrUndefined(theValue) ? theValue : defaultValue;\n    }\n    function _iterateChain(cb) {\n        var nextPlugin;\n        while (!!(nextPlugin = context._next())) {\n            var plugin = nextPlugin[_DYN_GET_PLUGIN ]();\n            if (plugin) {\n                cb(plugin);\n            }\n        }\n    }\n    return context;\n}\nfunction createProcessTelemetryContext(telemetryChain, config, core, startAt) {\n    var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n    var context = internalContext.ctx;\n    function _processNext(env) {\n        var nextPlugin = internalContext._next();\n        nextPlugin && nextPlugin[STR_PROCESS_TELEMETRY ](env, context);\n        return !nextPlugin;\n    }\n    function _createNew(plugins, startAt) {\n        if (plugins === void 0) { plugins = null; }\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config, core, startAt);\n        }\n        return createProcessTelemetryContext(plugins || context[_DYN_GET_NEXT ](), config, core, startAt);\n    }\n    context[_DYN_PROCESS_NEXT ] = _processNext;\n    context[_DYN_CREATE_NEW ] = _createNew;\n    return context;\n}\nfunction createProcessTelemetryUnloadContext(telemetryChain, core, startAt) {\n    var config = core[_DYN_CONFIG$2 ] || {};\n    var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n    var context = internalContext.ctx;\n    function _processNext(unloadState) {\n        var nextPlugin = internalContext._next();\n        nextPlugin && nextPlugin.unload(context, unloadState);\n        return !nextPlugin;\n    }\n    function _createNew(plugins, startAt) {\n        if (plugins === void 0) { plugins = null; }\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config, core, startAt);\n        }\n        return createProcessTelemetryUnloadContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);\n    }\n    context[_DYN_PROCESS_NEXT ] = _processNext;\n    context[_DYN_CREATE_NEW ] = _createNew;\n    return context;\n}\nfunction createProcessTelemetryUpdateContext(telemetryChain, core, startAt) {\n    var config = core[_DYN_CONFIG$2 ] || {};\n    var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n    var context = internalContext.ctx;\n    function _processNext(updateState) {\n        return context.iterate(function (plugin) {\n            if (isFunction(plugin[_DYN_UPDATE$1 ])) {\n                plugin[_DYN_UPDATE$1 ](context, updateState);\n            }\n        });\n    }\n    function _createNew(plugins, startAt) {\n        if (plugins === void 0) { plugins = null; }\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config, core, startAt);\n        }\n        return createProcessTelemetryUpdateContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);\n    }\n    context[_DYN_PROCESS_NEXT ] = _processNext;\n    context[_DYN_CREATE_NEW ] = _createNew;\n    return context;\n}\nfunction createTelemetryProxyChain(plugins, config, core, startAt) {\n    var firstProxy = null;\n    var add = startAt ? false : true;\n    if (isArray(plugins) && plugins[_DYN_LENGTH$5 ] > 0) {\n        var lastProxy_1 = null;\n        arrForEach(plugins, function (thePlugin) {\n            if (!add && startAt === thePlugin) {\n                add = true;\n            }\n            if (add && thePlugin && isFunction(thePlugin[STR_PROCESS_TELEMETRY ])) {\n                var newProxy = createTelemetryPluginProxy(thePlugin, config, core);\n                if (!firstProxy) {\n                    firstProxy = newProxy;\n                }\n                if (lastProxy_1) {\n                    lastProxy_1._setNext(newProxy);\n                }\n                lastProxy_1 = newProxy;\n            }\n        });\n    }\n    if (startAt && !firstProxy) {\n        return createTelemetryProxyChain([startAt], config, core);\n    }\n    return firstProxy;\n}\nfunction createTelemetryPluginProxy(plugin, config, core) {\n    var nextProxy = null;\n    var hasProcessTelemetry = isFunction(plugin[STR_PROCESS_TELEMETRY ]);\n    var hasSetNext = isFunction(plugin[_DYN_SET_NEXT_PLUGIN ]);\n    var chainId;\n    if (plugin) {\n        chainId = plugin[_DYN_IDENTIFIER ] + \"-\" + plugin[STR_PRIORITY ] + \"-\" + _chainId++;\n    }\n    else {\n        chainId = \"Unknown-0-\" + _chainId++;\n    }\n    var proxyChain = {\n        getPlugin: function () {\n            return plugin;\n        },\n        getNext: function () {\n            return nextProxy;\n        },\n        processTelemetry: _processTelemetry,\n        unload: _unloadPlugin,\n        update: _updatePlugin,\n        _id: chainId,\n        _setNext: function (nextPlugin) {\n            nextProxy = nextPlugin;\n        }\n    };\n    function _getTelCtx() {\n        var itemCtx;\n        if (plugin && isFunction(plugin[strGetTelCtx])) {\n            itemCtx = plugin[strGetTelCtx]();\n        }\n        if (!itemCtx) {\n            itemCtx = createProcessTelemetryContext(proxyChain, config, core);\n        }\n        return itemCtx;\n    }\n    function _processChain(itemCtx, processPluginFn, name, details, isAsync) {\n        var hasRun = false;\n        var identifier = plugin ? plugin[_DYN_IDENTIFIER ] : strTelemetryPluginChain;\n        var hasRunContext = itemCtx[strHasRunFlags];\n        if (!hasRunContext) {\n            hasRunContext = itemCtx[strHasRunFlags] = {};\n        }\n        itemCtx.setNext(nextProxy);\n        if (plugin) {\n            doPerf(itemCtx[STR_CORE ](), function () { return identifier + \":\" + name; }, function () {\n                hasRunContext[chainId] = true;\n                try {\n                    var nextId = nextProxy ? nextProxy._id : STR_EMPTY;\n                    if (nextId) {\n                        hasRunContext[nextId] = false;\n                    }\n                    hasRun = processPluginFn(itemCtx);\n                }\n                catch (error) {\n                    var hasNextRun = nextProxy ? hasRunContext[nextProxy._id] : true;\n                    if (hasNextRun) {\n                        hasRun = true;\n                    }\n                    if (!nextProxy || !hasNextRun) {\n                        _throwInternal(itemCtx[_DYN_DIAG_LOG$2 ](), 1 , 73 , \"Plugin [\" + identifier + \"] failed during \" + name + \" - \" + dumpObj(error) + \", run flags: \" + dumpObj(hasRunContext));\n                    }\n                }\n            }, details, isAsync);\n        }\n        return hasRun;\n    }\n    function _processTelemetry(env, itemCtx) {\n        itemCtx = itemCtx || _getTelCtx();\n        function _callProcessTelemetry(itemCtx) {\n            if (!plugin || !hasProcessTelemetry) {\n                return false;\n            }\n            var pluginState = _getPluginState(plugin);\n            if (pluginState[_DYN_TEARDOWN ] || pluginState[STR_DISABLED]) {\n                return false;\n            }\n            if (hasSetNext) {\n                plugin[_DYN_SET_NEXT_PLUGIN ](nextProxy);\n            }\n            plugin[STR_PROCESS_TELEMETRY ](env, itemCtx);\n            return true;\n        }\n        if (!_processChain(itemCtx, _callProcessTelemetry, \"processTelemetry\", function () { return ({ item: env }); }, !(env.sync))) {\n            itemCtx[_DYN_PROCESS_NEXT ](env);\n        }\n    }\n    function _unloadPlugin(unloadCtx, unloadState) {\n        function _callTeardown() {\n            var hasRun = false;\n            if (plugin) {\n                var pluginState = _getPluginState(plugin);\n                var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];\n                if (plugin && (!pluginCore || pluginCore === unloadCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {\n                    pluginState[STR_CORE ] = null;\n                    pluginState[_DYN_TEARDOWN ] = true;\n                    pluginState[_DYN_IS_INITIALIZED ] = false;\n                    if (plugin[_DYN_TEARDOWN ] && plugin[_DYN_TEARDOWN ](unloadCtx, unloadState) === true) {\n                        hasRun = true;\n                    }\n                }\n            }\n            return hasRun;\n        }\n        if (!_processChain(unloadCtx, _callTeardown, \"unload\", function () { }, unloadState[_DYN_IS_ASYNC ])) {\n            unloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n        }\n    }\n    function _updatePlugin(updateCtx, updateState) {\n        function _callUpdate() {\n            var hasRun = false;\n            if (plugin) {\n                var pluginState = _getPluginState(plugin);\n                var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];\n                if (plugin && (!pluginCore || pluginCore === updateCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {\n                    if (plugin[_DYN_UPDATE$1 ] && plugin[_DYN_UPDATE$1 ](updateCtx, updateState) === true) {\n                        hasRun = true;\n                    }\n                }\n            }\n            return hasRun;\n        }\n        if (!_processChain(updateCtx, _callUpdate, \"update\", function () { }, false)) {\n            updateCtx[_DYN_PROCESS_NEXT ](updateState);\n        }\n    }\n    return objFreeze(proxyChain);\n}\n\nvar ChannelControllerPriority = 500;\nvar ChannelValidationMessage = \"Channel has invalid priority - \";\nfunction _addChannelQueue(channelQueue, queue, core) {\n    if (queue && isArray(queue) && queue[_DYN_LENGTH$5 ] > 0) {\n        queue = queue.sort(function (a, b) {\n            return a[STR_PRIORITY ] - b[STR_PRIORITY ];\n        });\n        arrForEach(queue, function (queueItem) {\n            if (queueItem[STR_PRIORITY ] < ChannelControllerPriority) {\n                throwError(ChannelValidationMessage + queueItem[_DYN_IDENTIFIER ]);\n            }\n        });\n        channelQueue[_DYN_PUSH$2 ]({\n            queue: objFreeze(queue),\n            chain: createTelemetryProxyChain(queue, core[_DYN_CONFIG$2 ], core)\n        });\n    }\n}\nfunction createChannelControllerPlugin(channelQueue, core) {\n    function _getTelCtx() {\n        return createProcessTelemetryContext(null, core[_DYN_CONFIG$2 ], core, null);\n    }\n    function _processChannelQueue(theChannels, itemCtx, processFn, onComplete) {\n        var waiting = theChannels ? (theChannels[_DYN_LENGTH$5 ] + 1) : 1;\n        function _runChainOnComplete() {\n            waiting--;\n            if (waiting === 0) {\n                onComplete && onComplete();\n                onComplete = null;\n            }\n        }\n        if (waiting > 0) {\n            arrForEach(theChannels, function (channels) {\n                if (channels && channels.queue[_DYN_LENGTH$5 ] > 0) {\n                    var channelChain = channels.chain;\n                    var chainCtx = itemCtx[_DYN_CREATE_NEW ](channelChain);\n                    chainCtx[_DYN_ON_COMPLETE ](_runChainOnComplete);\n                    processFn(chainCtx);\n                }\n                else {\n                    waiting--;\n                }\n            });\n        }\n        _runChainOnComplete();\n    }\n    function _doUpdate(updateCtx, updateState) {\n        var theUpdateState = updateState || {\n            reason: 0\n        };\n        _processChannelQueue(channelQueue, updateCtx, function (chainCtx) {\n            chainCtx[_DYN_PROCESS_NEXT ](theUpdateState);\n        }, function () {\n            updateCtx[_DYN_PROCESS_NEXT ](theUpdateState);\n        });\n        return true;\n    }\n    function _doTeardown(unloadCtx, unloadState) {\n        var theUnloadState = unloadState || {\n            reason: 0 ,\n            isAsync: false\n        };\n        _processChannelQueue(channelQueue, unloadCtx, function (chainCtx) {\n            chainCtx[_DYN_PROCESS_NEXT ](theUnloadState);\n        }, function () {\n            unloadCtx[_DYN_PROCESS_NEXT ](theUnloadState);\n            isInitialized = false;\n        });\n        return true;\n    }\n    function _getChannel(pluginIdentifier) {\n        var thePlugin = null;\n        if (channelQueue && channelQueue[_DYN_LENGTH$5 ] > 0) {\n            arrForEach(channelQueue, function (channels) {\n                if (channels && channels.queue[_DYN_LENGTH$5 ] > 0) {\n                    arrForEach(channels.queue, function (ext) {\n                        if (ext[_DYN_IDENTIFIER ] === pluginIdentifier) {\n                            thePlugin = ext;\n                            return -1;\n                        }\n                    });\n                    if (thePlugin) {\n                        return -1;\n                    }\n                }\n            });\n        }\n        return thePlugin;\n    }\n    var isInitialized = false;\n    var channelController = {\n        identifier: \"ChannelControllerPlugin\",\n        priority: ChannelControllerPriority,\n        initialize: function (config, core, extensions, pluginChain) {\n            isInitialized = true;\n            arrForEach(channelQueue, function (channels) {\n                if (channels && channels.queue[_DYN_LENGTH$5 ] > 0) {\n                    initializePlugins(createProcessTelemetryContext(channels.chain, config, core), extensions);\n                }\n            });\n        },\n        isInitialized: function () {\n            return isInitialized;\n        },\n        processTelemetry: function (item, itemCtx) {\n            _processChannelQueue(channelQueue, itemCtx || _getTelCtx(), function (chainCtx) {\n                chainCtx[_DYN_PROCESS_NEXT ](item);\n            }, function () {\n                itemCtx[_DYN_PROCESS_NEXT ](item);\n            });\n        },\n        update: _doUpdate,\n        pause: function () {\n            _processChannelQueue(channelQueue, _getTelCtx(), function (chainCtx) {\n                chainCtx.iterate(function (plugin) {\n                    plugin.pause && plugin.pause();\n                });\n            }, null);\n        },\n        resume: function () {\n            _processChannelQueue(channelQueue, _getTelCtx(), function (chainCtx) {\n                chainCtx.iterate(function (plugin) {\n                    plugin.resume && plugin.resume();\n                });\n            }, null);\n        },\n        teardown: _doTeardown,\n        getChannel: _getChannel,\n        flush: function (isAsync, callBack, sendReason, cbTimeout) {\n            var waiting = 1;\n            var doneIterating = false;\n            var cbTimer = null;\n            cbTimeout = cbTimeout || 5000;\n            function doCallback() {\n                waiting--;\n                if (doneIterating && waiting === 0) {\n                    if (cbTimer) {\n                        clearTimeout(cbTimer);\n                        cbTimer = null;\n                    }\n                    callBack && callBack(doneIterating);\n                    callBack = null;\n                }\n            }\n            _processChannelQueue(channelQueue, _getTelCtx(), function (chainCtx) {\n                chainCtx.iterate(function (plugin) {\n                    if (plugin[_DYN_FLUSH ]) {\n                        waiting++;\n                        var handled_1 = false;\n                        if (!plugin[_DYN_FLUSH ](isAsync, function () {\n                            handled_1 = true;\n                            doCallback();\n                        }, sendReason)) {\n                            if (!handled_1) {\n                                if (isAsync && cbTimer == null) {\n                                    cbTimer = setTimeout(function () {\n                                        cbTimer = null;\n                                        doCallback();\n                                    }, cbTimeout);\n                                }\n                                else {\n                                    doCallback();\n                                }\n                            }\n                        }\n                    }\n                });\n            }, function () {\n                doneIterating = true;\n                doCallback();\n            });\n            return true;\n        },\n        _setQueue: function (queue) {\n            channelQueue = queue;\n        }\n    };\n    return channelController;\n}\nfunction createChannelQueues(channels, extensions, core) {\n    var channelQueue = [];\n    if (channels) {\n        arrForEach(channels, function (queue) { return _addChannelQueue(channelQueue, queue, core); });\n    }\n    if (extensions) {\n        var extensionQueue_1 = [];\n        arrForEach(extensions, function (plugin) {\n            if (plugin[STR_PRIORITY ] > ChannelControllerPriority) {\n                extensionQueue_1[_DYN_PUSH$2 ](plugin);\n            }\n        });\n        _addChannelQueue(channelQueue, extensionQueue_1, core);\n    }\n    return channelQueue;\n}\n\nfunction createUnloadHandlerContainer() {\n    var handlers = [];\n    function _addHandler(handler) {\n        if (handler) {\n            handlers[_DYN_PUSH$2 ](handler);\n        }\n    }\n    function _runHandlers(unloadCtx, unloadState) {\n        arrForEach(handlers, function (handler) {\n            try {\n                handler(unloadCtx, unloadState);\n            }\n            catch (e) {\n                _throwInternal(unloadCtx[_DYN_DIAG_LOG$2 ](), 2 , 73 , \"Unexpected error calling unload handler - \" + dumpObj(e));\n            }\n        });\n        handlers = [];\n    }\n    return {\n        add: _addHandler,\n        run: _runHandlers\n    };\n}\n\nvar strGetPlugin = \"getPlugin\";\nvar BaseTelemetryPlugin = /** @class */ (function () {\n    function BaseTelemetryPlugin() {\n        var _self = this;\n        var _isinitialized;\n        var _rootCtx;\n        var _nextPlugin;\n        var _unloadHandlerContainer;\n        var _hooks;\n        _initDefaults();\n        dynamicProto(BaseTelemetryPlugin, _self, function (_self) {\n            _self[_DYN_INITIALIZE ] = function (config, core, extensions, pluginChain) {\n                _setDefaults(config, core, pluginChain);\n                _isinitialized = true;\n            };\n            _self[_DYN_TEARDOWN ] = function (unloadCtx, unloadState) {\n                var _a;\n                var core = _self[STR_CORE ];\n                if (!core || (unloadCtx && core !== unloadCtx[STR_CORE ]())) {\n                    return;\n                }\n                var result;\n                var unloadDone = false;\n                var theUnloadCtx = unloadCtx || createProcessTelemetryUnloadContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                var theUnloadState = unloadState || (_a = {\n                        reason: 0\n                    },\n                    _a[_DYN_IS_ASYNC ] = false,\n                    _a);\n                function _unloadCallback() {\n                    if (!unloadDone) {\n                        unloadDone = true;\n                        _unloadHandlerContainer.run(theUnloadCtx, unloadState);\n                        var oldHooks = _hooks;\n                        _hooks = [];\n                        arrForEach(oldHooks, function (fn) {\n                            fn.rm();\n                        });\n                        if (result === true) {\n                            theUnloadCtx[_DYN_PROCESS_NEXT ](theUnloadState);\n                        }\n                        _initDefaults();\n                    }\n                }\n                if (!_self[_DYN__DO_TEARDOWN ] || _self[_DYN__DO_TEARDOWN ](theUnloadCtx, theUnloadState, _unloadCallback) !== true) {\n                    _unloadCallback();\n                }\n                else {\n                    result = true;\n                }\n                return result;\n            };\n            _self[_DYN_UPDATE$1 ] = function (updateCtx, updateState) {\n                var core = _self[STR_CORE ];\n                if (!core || (updateCtx && core !== updateCtx[STR_CORE ]())) {\n                    return;\n                }\n                var result;\n                var updateDone = false;\n                var theUpdateCtx = updateCtx || createProcessTelemetryUpdateContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                var theUpdateState = updateState || {\n                    reason: 0\n                };\n                function _updateCallback() {\n                    if (!updateDone) {\n                        updateDone = true;\n                        _setDefaults(theUpdateCtx.getCfg(), theUpdateCtx.core(), theUpdateCtx[_DYN_GET_NEXT ]());\n                    }\n                }\n                if (!_self._doUpdate || _self._doUpdate(theUpdateCtx, theUpdateState, _updateCallback) !== true) {\n                    _updateCallback();\n                }\n                else {\n                    result = true;\n                }\n                return result;\n            };\n            _self._addHook = function (hooks) {\n                if (hooks) {\n                    if (isArray(hooks)) {\n                        _hooks = _hooks.concat(hooks);\n                    }\n                    else {\n                        _hooks[_DYN_PUSH$2 ](hooks);\n                    }\n                }\n            };\n            proxyFunctionAs(_self, \"_addUnloadCb\", function () { return _unloadHandlerContainer; }, \"add\");\n        });\n        _self[_DYN_DIAG_LOG$2 ] = function (itemCtx) {\n            return _getTelCtx(itemCtx)[_DYN_DIAG_LOG$2 ]();\n        };\n        _self[_DYN_IS_INITIALIZED ] = function () {\n            return _isinitialized;\n        };\n        _self.setInitialized = function (isInitialized) {\n            _isinitialized = isInitialized;\n        };\n        _self[_DYN_SET_NEXT_PLUGIN ] = function (next) {\n            _nextPlugin = next;\n        };\n        _self[_DYN_PROCESS_NEXT ] = function (env, itemCtx) {\n            if (itemCtx) {\n                itemCtx[_DYN_PROCESS_NEXT ](env);\n            }\n            else if (_nextPlugin && isFunction(_nextPlugin[STR_PROCESS_TELEMETRY ])) {\n                _nextPlugin[STR_PROCESS_TELEMETRY ](env, null);\n            }\n        };\n        _self._getTelCtx = _getTelCtx;\n        function _getTelCtx(currentCtx) {\n            if (currentCtx === void 0) { currentCtx = null; }\n            var itemCtx = currentCtx;\n            if (!itemCtx) {\n                var rootCtx = _rootCtx || createProcessTelemetryContext(null, {}, _self[STR_CORE ]);\n                if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                    itemCtx = rootCtx[_DYN_CREATE_NEW ](null, _nextPlugin[strGetPlugin]);\n                }\n                else {\n                    itemCtx = rootCtx[_DYN_CREATE_NEW ](null, _nextPlugin);\n                }\n            }\n            return itemCtx;\n        }\n        function _setDefaults(config, core, pluginChain) {\n            if (config) {\n                setValue(config, STR_EXTENSION_CONFIG, [], null, isNullOrUndefined);\n            }\n            if (!pluginChain && core) {\n                pluginChain = core[_DYN_GET_PROCESS_TEL_CONT0 ]()[_DYN_GET_NEXT ]();\n            }\n            var nextPlugin = _nextPlugin;\n            if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                nextPlugin = _nextPlugin[strGetPlugin]();\n            }\n            _self[STR_CORE ] = core;\n            _rootCtx = createProcessTelemetryContext(pluginChain, config, core, nextPlugin);\n        }\n        function _initDefaults() {\n            _isinitialized = false;\n            _self[STR_CORE ] = null;\n            _rootCtx = null;\n            _nextPlugin = null;\n            _hooks = [];\n            _unloadHandlerContainer = createUnloadHandlerContainer();\n        }\n    }\n    BaseTelemetryPlugin.__ieDyn=1;\n    return BaseTelemetryPlugin;\n}());\n\nvar TelemetryInitializerPlugin = /** @class */ (function (_super) {\n    __extendsFn(TelemetryInitializerPlugin, _super);\n    function TelemetryInitializerPlugin() {\n        var _this = _super.call(this) || this;\n        _this.identifier = \"TelemetryInitializerPlugin\";\n        _this.priority = 199;\n        var _id;\n        var _initializers;\n        _initDefaults();\n        dynamicProto(TelemetryInitializerPlugin, _this, function (_self, _base) {\n            _self.addTelemetryInitializer = function (telemetryInitializer) {\n                var theInitializer = {\n                    id: _id++,\n                    fn: telemetryInitializer\n                };\n                _initializers[_DYN_PUSH$2 ](theInitializer);\n                var handler = {\n                    remove: function () {\n                        arrForEach(_initializers, function (initializer, idx) {\n                            if (initializer.id === theInitializer.id) {\n                                _initializers[_DYN_SPLICE ](idx, 1);\n                                return -1;\n                            }\n                        });\n                    }\n                };\n                return handler;\n            };\n            _self[STR_PROCESS_TELEMETRY ] = function (item, itemCtx) {\n                var doNotSendItem = false;\n                var telemetryInitializersCount = _initializers[_DYN_LENGTH$5 ];\n                for (var i = 0; i < telemetryInitializersCount; ++i) {\n                    var telemetryInitializer = _initializers[i];\n                    if (telemetryInitializer) {\n                        try {\n                            if (telemetryInitializer.fn[_DYN_APPLY ](null, [item]) === false) {\n                                doNotSendItem = true;\n                                break;\n                            }\n                        }\n                        catch (e) {\n                            _throwInternal(itemCtx[_DYN_DIAG_LOG$2 ](), 1 , 64 , \"One of telemetry initializers failed, telemetry item will not be sent: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n                        }\n                    }\n                }\n                if (!doNotSendItem) {\n                    _self[_DYN_PROCESS_NEXT ](item, itemCtx);\n                }\n            };\n            _self[_DYN__DO_TEARDOWN ] = function () {\n                _initDefaults();\n            };\n        });\n        function _initDefaults() {\n            _id = 0;\n            _initializers = [];\n        }\n        return _this;\n    }\n    TelemetryInitializerPlugin.__ieDyn=1;\n    return TelemetryInitializerPlugin;\n}(BaseTelemetryPlugin));\n\nvar strValidationError = \"Plugins must provide initialize method\";\nvar strNotificationManager = \"_notificationManager\";\nvar strSdkUnloadingError = \"SDK is still unloading...\";\nvar strSdkNotInitialized = \"SDK is not initialized\";\nvar defaultInitConfig = {\n    loggingLevelConsole: 1\n};\nfunction _createPerfManager(core, notificationMgr) {\n    return new PerfManager(notificationMgr);\n}\nfunction _validateExtensions(logger, channelPriority, allExtensions) {\n    var _a;\n    var coreExtensions = [];\n    var extPriorities = {};\n    arrForEach(allExtensions, function (ext) {\n        if (isNullOrUndefined(ext) || isNullOrUndefined(ext[_DYN_INITIALIZE ])) {\n            throwError(strValidationError);\n        }\n        var extPriority = ext[STR_PRIORITY ];\n        var identifier = ext[_DYN_IDENTIFIER ];\n        if (ext && extPriority) {\n            if (!isNullOrUndefined(extPriorities[extPriority])) {\n                _warnToConsole(logger, \"Two extensions have same priority #\" + extPriority + \" - \" + extPriorities[extPriority] + \", \" + identifier);\n            }\n            else {\n                extPriorities[extPriority] = identifier;\n            }\n        }\n        if (!extPriority || extPriority < channelPriority) {\n            coreExtensions[_DYN_PUSH$2 ](ext);\n        }\n    });\n    return _a = {\n            all: allExtensions\n        },\n        _a[STR_CORE ] = coreExtensions,\n        _a;\n}\nfunction _isPluginPresent(thePlugin, plugins) {\n    var exists = false;\n    arrForEach(plugins, function (plugin) {\n        if (plugin === thePlugin) {\n            exists = true;\n            return -1;\n        }\n    });\n    return exists;\n}\nfunction _createDummyNotificationManager() {\n    var _a;\n    return objCreateFn((_a = {},\n        _a[_DYN_ADD_NOTIFICATION_LIS1 ] = function (listener) { },\n        _a[_DYN_REMOVE_NOTIFICATION_2 ] = function (listener) { },\n        _a[STR_EVENTS_SENT ] = function (events) { },\n        _a[STR_EVENTS_DISCARDED ] = function (events, reason) { },\n        _a[STR_EVENTS_SEND_REQUEST ] = function (sendReason, isAsync) { },\n        _a));\n}\nvar BaseCore = /** @class */ (function () {\n    function BaseCore() {\n        var _config;\n        var _isInitialized;\n        var _eventQueue;\n        var _notificationManager;\n        var _perfManager;\n        var _cfgPerfManager;\n        var _cookieManager;\n        var _pluginChain;\n        var _configExtensions;\n        var _coreExtensions;\n        var _channelControl;\n        var _channelConfig;\n        var _channelQueue;\n        var _isUnloading;\n        var _telemetryInitializerPlugin;\n        var _internalLogsEventName;\n        var _evtNamespace;\n        var _unloadHandlers;\n        var _debugListener;\n        var _traceCtx;\n        var _internalLogPoller = 0;\n        var _forceStopInternalLogPoller = false;\n        dynamicProto(BaseCore, this, function (_self) {\n            _initDefaults();\n            _self[_DYN_IS_INITIALIZED ] = function () { return _isInitialized; };\n            _self[_DYN_INITIALIZE ] = function (config, extensions, logger, notificationManager) {\n                if (_isUnloading) {\n                    throwError(strSdkUnloadingError);\n                }\n                if (_self[_DYN_IS_INITIALIZED ]()) {\n                    throwError(\"Core should not be initialized more than once\");\n                }\n                _config = config || {};\n                _self[_DYN_CONFIG$2 ] = _config;\n                if (isNullOrUndefined(config[_DYN_INSTRUMENTATION_KEY$2 ])) {\n                    throwError(\"Please provide instrumentation key\");\n                }\n                _notificationManager = notificationManager;\n                _self[strNotificationManager] = notificationManager;\n                _initDebugListener();\n                _initPerfManager();\n                _initExtConfig();\n                if (logger) {\n                    _self[_DYN_LOGGER ] = logger;\n                }\n                var cfgExtensions = getSetValue(_config, STR_EXTENSIONS, []);\n                _configExtensions = [];\n                _configExtensions[_DYN_PUSH$2 ].apply(_configExtensions, __spreadArrayFn(__spreadArrayFn([], extensions, false), cfgExtensions));\n                _channelConfig = getSetValue(_config, STR_CHANNELS, []);\n                _initPluginChain(null);\n                if (!_channelQueue || _channelQueue[_DYN_LENGTH$5 ] === 0) {\n                    throwError(\"No \" + STR_CHANNELS + \" available\");\n                }\n                _isInitialized = true;\n                _self.releaseQueue();\n            };\n            _self.getTransmissionControls = function () {\n                var controls = [];\n                if (_channelQueue) {\n                    arrForEach(_channelQueue, function (channels) {\n                        controls[_DYN_PUSH$2 ](channels.queue);\n                    });\n                }\n                return objFreeze(controls);\n            };\n            _self.track = function (telemetryItem) {\n                telemetryItem.iKey = telemetryItem.iKey || _config[_DYN_INSTRUMENTATION_KEY$2 ];\n                telemetryItem[_DYN_TIME ] = telemetryItem[_DYN_TIME ] || toISOString(new Date());\n                telemetryItem.ver = telemetryItem.ver || \"4.0\";\n                if (!_isUnloading && _self[_DYN_IS_INITIALIZED ]()) {\n                    _createTelCtx()[_DYN_PROCESS_NEXT ](telemetryItem);\n                }\n                else {\n                    _eventQueue[_DYN_PUSH$2 ](telemetryItem);\n                }\n            };\n            _self[_DYN_GET_PROCESS_TEL_CONT0 ] = _createTelCtx;\n            _self[_DYN_GET_NOTIFY_MGR ] = function () {\n                if (!_notificationManager) {\n                    _notificationManager = _createDummyNotificationManager();\n                    _self[strNotificationManager] = _notificationManager;\n                }\n                return _notificationManager;\n            };\n            _self[_DYN_ADD_NOTIFICATION_LIS1 ] = function (listener) {\n                if (_notificationManager) {\n                    _notificationManager[_DYN_ADD_NOTIFICATION_LIS1 ](listener);\n                }\n            };\n            _self[_DYN_REMOVE_NOTIFICATION_2 ] = function (listener) {\n                if (_notificationManager) {\n                    _notificationManager[_DYN_REMOVE_NOTIFICATION_2 ](listener);\n                }\n            };\n            _self.getCookieMgr = function () {\n                if (!_cookieManager) {\n                    _cookieManager = createCookieMgr(_config, _self[_DYN_LOGGER ]);\n                }\n                return _cookieManager;\n            };\n            _self.setCookieMgr = function (cookieMgr) {\n                _cookieManager = cookieMgr;\n            };\n            _self[STR_GET_PERF_MGR ] = function () {\n                if (!_perfManager && !_cfgPerfManager) {\n                    if (getCfgValue(_config.enablePerfMgr)) {\n                        var createPerfMgr = getCfgValue(_config[STR_CREATE_PERF_MGR ]);\n                        if (isFunction(createPerfMgr)) {\n                            _cfgPerfManager = createPerfMgr(_self, _self[_DYN_GET_NOTIFY_MGR ]());\n                        }\n                    }\n                }\n                return _perfManager || _cfgPerfManager || getGblPerfMgr();\n            };\n            _self.setPerfMgr = function (perfMgr) {\n                _perfManager = perfMgr;\n            };\n            _self.eventCnt = function () {\n                return _eventQueue[_DYN_LENGTH$5 ];\n            };\n            _self.releaseQueue = function () {\n                if (_isInitialized && _eventQueue[_DYN_LENGTH$5 ] > 0) {\n                    var eventQueue = _eventQueue;\n                    _eventQueue = [];\n                    arrForEach(eventQueue, function (event) {\n                        _createTelCtx()[_DYN_PROCESS_NEXT ](event);\n                    });\n                }\n            };\n            _self.pollInternalLogs = function (eventName) {\n                _internalLogsEventName = eventName || null;\n                _forceStopInternalLogPoller = false;\n                if (_internalLogPoller) {\n                    clearInterval(_internalLogPoller);\n                    _internalLogPoller = null;\n                }\n                return _startInternalLogTimer(true);\n            };\n            function _startInternalLogTimer(alwaysStart) {\n                if (!_internalLogPoller && !_forceStopInternalLogPoller) {\n                    var shouldStart = alwaysStart || (_self[_DYN_LOGGER ] && _self[_DYN_LOGGER ].queue[_DYN_LENGTH$5 ] > 0);\n                    if (shouldStart) {\n                        var interval = getCfgValue(_config.diagnosticLogInterval);\n                        if (!interval || !(interval > 0)) {\n                            interval = 10000;\n                        }\n                        _internalLogPoller = setInterval(function () {\n                            clearInterval(_internalLogPoller);\n                            _internalLogPoller = 0;\n                            _flushInternalLogs();\n                        }, interval);\n                    }\n                }\n                return _internalLogPoller;\n            }\n            _self[_DYN_STOP_POLLING_INTERNA3 ] = function () {\n                _forceStopInternalLogPoller = true;\n                if (_internalLogPoller) {\n                    clearInterval(_internalLogPoller);\n                    _internalLogPoller = 0;\n                    _flushInternalLogs();\n                }\n            };\n            proxyFunctions(_self, function () { return _telemetryInitializerPlugin; }, [\"addTelemetryInitializer\"]);\n            _self.unload = function (isAsync, unloadComplete, cbTimeout) {\n                var _a;\n                if (isAsync === void 0) { isAsync = true; }\n                if (!_isInitialized) {\n                    throwError(strSdkNotInitialized);\n                }\n                if (_isUnloading) {\n                    throwError(strSdkUnloadingError);\n                }\n                var unloadState = (_a = {\n                        reason: 50\n                    },\n                    _a[_DYN_IS_ASYNC ] = isAsync,\n                    _a.flushComplete = false,\n                    _a);\n                var processUnloadCtx = createProcessTelemetryUnloadContext(_getPluginChain(), _self);\n                processUnloadCtx[_DYN_ON_COMPLETE ](function () {\n                    _initDefaults();\n                    unloadComplete && unloadComplete(unloadState);\n                }, _self);\n                function _doUnload(flushComplete) {\n                    unloadState.flushComplete = flushComplete;\n                    _isUnloading = true;\n                    _unloadHandlers.run(processUnloadCtx, unloadState);\n                    _self[_DYN_STOP_POLLING_INTERNA3 ]();\n                    processUnloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n                }\n                _flushInternalLogs();\n                if (!_flushChannels(isAsync, _doUnload, 6 , cbTimeout)) {\n                    _doUnload(false);\n                }\n            };\n            _self[_DYN_GET_PLUGIN ] = _getPlugin;\n            _self.addPlugin = function (plugin, replaceExisting, isAsync, addCb) {\n                if (!plugin) {\n                    addCb && addCb(false);\n                    _logOrThrowError(strValidationError);\n                    return;\n                }\n                var existingPlugin = _getPlugin(plugin[_DYN_IDENTIFIER ]);\n                if (existingPlugin && !replaceExisting) {\n                    addCb && addCb(false);\n                    _logOrThrowError(\"Plugin [\" + plugin[_DYN_IDENTIFIER ] + \"] is already loaded!\");\n                    return;\n                }\n                var updateState = {\n                    reason: 16\n                };\n                function _addPlugin(removed) {\n                    _configExtensions[_DYN_PUSH$2 ](plugin);\n                    updateState.added = [plugin];\n                    _initPluginChain(updateState);\n                    addCb && addCb(true);\n                }\n                if (existingPlugin) {\n                    var removedPlugins_1 = [existingPlugin.plugin];\n                    var unloadState = {\n                        reason: 2 ,\n                        isAsync: !!isAsync\n                    };\n                    _removePlugins(removedPlugins_1, unloadState, function (removed) {\n                        if (!removed) {\n                            addCb && addCb(false);\n                        }\n                        else {\n                            updateState.removed = removedPlugins_1;\n                            updateState.reason |= 32 ;\n                            _addPlugin();\n                        }\n                    });\n                }\n                else {\n                    _addPlugin();\n                }\n            };\n            _self.evtNamespace = function () {\n                return _evtNamespace;\n            };\n            _self[_DYN_FLUSH ] = _flushChannels;\n            _self.getTraceCtx = function (createNew) {\n                if (!_traceCtx) {\n                    _traceCtx = createDistributedTraceContext();\n                }\n                return _traceCtx;\n            };\n            _self.setTraceCtx = function (traceCtx) {\n                _traceCtx = traceCtx || null;\n            };\n            proxyFunctionAs(_self, \"addUnloadCb\", function () { return _unloadHandlers; }, \"add\");\n            function _initDefaults() {\n                _isInitialized = false;\n                _config = objExtend(true, {}, defaultInitConfig);\n                _self[_DYN_CONFIG$2 ] = _config;\n                _self[_DYN_LOGGER ] = new DiagnosticLogger(_config);\n                _self[_DYN__EXTENSIONS ] = [];\n                _telemetryInitializerPlugin = new TelemetryInitializerPlugin();\n                _eventQueue = [];\n                _notificationManager = null;\n                _perfManager = null;\n                _cfgPerfManager = null;\n                _cookieManager = null;\n                _pluginChain = null;\n                _coreExtensions = null;\n                _configExtensions = [];\n                _channelControl = null;\n                _channelConfig = null;\n                _channelQueue = null;\n                _isUnloading = false;\n                _internalLogsEventName = null;\n                _evtNamespace = createUniqueNamespace(\"AIBaseCore\", true);\n                _unloadHandlers = createUnloadHandlerContainer();\n                _traceCtx = null;\n            }\n            function _createTelCtx() {\n                var theCtx = createProcessTelemetryContext(_getPluginChain(), _config, _self);\n                theCtx[_DYN_ON_COMPLETE ](_startInternalLogTimer);\n                return theCtx;\n            }\n            function _initPluginChain(updateState) {\n                var theExtensions = _validateExtensions(_self[_DYN_LOGGER ], ChannelControllerPriority, _configExtensions);\n                _coreExtensions = theExtensions[STR_CORE ];\n                _pluginChain = null;\n                var allExtensions = theExtensions.all;\n                _channelQueue = objFreeze(createChannelQueues(_channelConfig, allExtensions, _self));\n                if (_channelControl) {\n                    var idx = arrIndexOf(allExtensions, _channelControl);\n                    if (idx !== -1) {\n                        allExtensions[_DYN_SPLICE ](idx, 1);\n                    }\n                    idx = arrIndexOf(_coreExtensions, _channelControl);\n                    if (idx !== -1) {\n                        _coreExtensions[_DYN_SPLICE ](idx, 1);\n                    }\n                    _channelControl._setQueue(_channelQueue);\n                }\n                else {\n                    _channelControl = createChannelControllerPlugin(_channelQueue, _self);\n                }\n                allExtensions[_DYN_PUSH$2 ](_channelControl);\n                _coreExtensions[_DYN_PUSH$2 ](_channelControl);\n                _self[_DYN__EXTENSIONS ] = sortPlugins(allExtensions);\n                _channelControl[_DYN_INITIALIZE ](_config, _self, allExtensions);\n                var initCtx = _createTelCtx();\n                initializePlugins(initCtx, allExtensions);\n                _self[_DYN__EXTENSIONS ] = objFreeze(sortPlugins(_coreExtensions || [])).slice();\n                if (updateState) {\n                    _doUpdate(updateState);\n                }\n            }\n            function _getPlugin(pluginIdentifier) {\n                var _a;\n                var theExt = null;\n                var thePlugin = null;\n                arrForEach(_self[_DYN__EXTENSIONS ], function (ext) {\n                    if (ext[_DYN_IDENTIFIER ] === pluginIdentifier && ext !== _channelControl && ext !== _telemetryInitializerPlugin) {\n                        thePlugin = ext;\n                        return -1;\n                    }\n                });\n                if (!thePlugin && _channelControl) {\n                    thePlugin = _channelControl.getChannel(pluginIdentifier);\n                }\n                if (thePlugin) {\n                    theExt = (_a = {\n                            plugin: thePlugin\n                        },\n                        _a[_DYN_SET_ENABLED ] = function (enabled) {\n                            _getPluginState(thePlugin)[STR_DISABLED] = !enabled;\n                        },\n                        _a.isEnabled = function () {\n                            var pluginState = _getPluginState(thePlugin);\n                            return !pluginState[_DYN_TEARDOWN ] && !pluginState[STR_DISABLED];\n                        },\n                        _a.remove = function (isAsync, removeCb) {\n                            var _a;\n                            if (isAsync === void 0) { isAsync = true; }\n                            var pluginsToRemove = [thePlugin];\n                            var unloadState = (_a = {\n                                    reason: 1\n                                },\n                                _a[_DYN_IS_ASYNC ] = isAsync,\n                                _a);\n                            _removePlugins(pluginsToRemove, unloadState, function (removed) {\n                                if (removed) {\n                                    _initPluginChain({\n                                        reason: 32 ,\n                                        removed: pluginsToRemove\n                                    });\n                                }\n                                removeCb && removeCb(removed);\n                            });\n                        },\n                        _a);\n                }\n                return theExt;\n            }\n            function _getPluginChain() {\n                if (!_pluginChain) {\n                    var extensions = (_coreExtensions || []).slice();\n                    if (arrIndexOf(extensions, _telemetryInitializerPlugin) === -1) {\n                        extensions[_DYN_PUSH$2 ](_telemetryInitializerPlugin);\n                    }\n                    _pluginChain = createTelemetryProxyChain(sortPlugins(extensions), _config, _self);\n                }\n                return _pluginChain;\n            }\n            function _removePlugins(thePlugins, unloadState, removeComplete) {\n                if (thePlugins && thePlugins[_DYN_LENGTH$5 ] > 0) {\n                    var unloadChain = createTelemetryProxyChain(thePlugins, _config, _self);\n                    var unloadCtx = createProcessTelemetryUnloadContext(unloadChain, _self);\n                    unloadCtx[_DYN_ON_COMPLETE ](function () {\n                        var removed = false;\n                        var newConfigExtensions = [];\n                        arrForEach(_configExtensions, function (plugin, idx) {\n                            if (!_isPluginPresent(plugin, thePlugins)) {\n                                newConfigExtensions[_DYN_PUSH$2 ](plugin);\n                            }\n                            else {\n                                removed = true;\n                            }\n                        });\n                        _configExtensions = newConfigExtensions;\n                        var newChannelConfig = [];\n                        if (_channelConfig) {\n                            arrForEach(_channelConfig, function (queue, idx) {\n                                var newQueue = [];\n                                arrForEach(queue, function (channel) {\n                                    if (!_isPluginPresent(channel, thePlugins)) {\n                                        newQueue[_DYN_PUSH$2 ](channel);\n                                    }\n                                    else {\n                                        removed = true;\n                                    }\n                                });\n                                newChannelConfig[_DYN_PUSH$2 ](newQueue);\n                            });\n                            _channelConfig = newChannelConfig;\n                        }\n                        removeComplete && removeComplete(removed);\n                        _startInternalLogTimer();\n                    });\n                    unloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n                }\n                else {\n                    removeComplete(false);\n                }\n            }\n            function _flushInternalLogs() {\n                if (_self[_DYN_LOGGER ] && _self[_DYN_LOGGER ].queue) {\n                    var queue = _self[_DYN_LOGGER ].queue.slice(0);\n                    _self[_DYN_LOGGER ].queue[_DYN_LENGTH$5 ] = 0;\n                    arrForEach(queue, function (logMessage) {\n                        var _a;\n                        var item = (_a = {},\n                            _a[_DYN_NAME$3 ] = _internalLogsEventName ? _internalLogsEventName : \"InternalMessageId: \" + logMessage[_DYN_MESSAGE_ID ],\n                            _a.iKey = getCfgValue(_config[_DYN_INSTRUMENTATION_KEY$2 ]),\n                            _a.time = toISOString(new Date()),\n                            _a.baseType = _InternalLogMessage.dataType,\n                            _a.baseData = { message: logMessage[_DYN_MESSAGE$2 ] },\n                            _a);\n                        _self.track(item);\n                    });\n                }\n            }\n            function _flushChannels(isAsync, callBack, sendReason, cbTimeout) {\n                if (_channelControl) {\n                    return _channelControl[_DYN_FLUSH ](isAsync, callBack, sendReason || 6 , cbTimeout);\n                }\n                callBack && callBack(false);\n                return true;\n            }\n            function _initDebugListener() {\n                var disableDbgExt = getCfgValue(_config.disableDbgExt);\n                if (disableDbgExt === true && _debugListener) {\n                    _notificationManager[_DYN_REMOVE_NOTIFICATION_2 ](_debugListener);\n                    _debugListener = null;\n                }\n                if (_notificationManager && !_debugListener && disableDbgExt !== true) {\n                    _debugListener = getDebugListener(_config);\n                    _notificationManager[_DYN_ADD_NOTIFICATION_LIS1 ](_debugListener);\n                }\n            }\n            function _initPerfManager() {\n                var enablePerfMgr = getCfgValue(_config.enablePerfMgr);\n                if (!enablePerfMgr && _cfgPerfManager) {\n                    _cfgPerfManager = null;\n                }\n                if (enablePerfMgr) {\n                    getSetValue(_config, STR_CREATE_PERF_MGR, _createPerfManager);\n                }\n            }\n            function _initExtConfig() {\n                var extConfig = getSetValue(_config, STR_EXTENSION_CONFIG, {});\n                extConfig.NotificationManager = _notificationManager;\n            }\n            function _doUpdate(updateState) {\n                var updateCtx = createProcessTelemetryUpdateContext(_getPluginChain(), _self);\n                updateCtx[_DYN_ON_COMPLETE ](_startInternalLogTimer);\n                if (!_self._updateHook || _self._updateHook(updateCtx, updateState) !== true) {\n                    updateCtx[_DYN_PROCESS_NEXT ](updateState);\n                }\n            }\n            function _logOrThrowError(message) {\n                var logger = _self[_DYN_LOGGER ];\n                if (logger) {\n                    _throwInternal(logger, 2 , 73 , message);\n                    _startInternalLogTimer();\n                }\n                else {\n                    throwError(message);\n                }\n            }\n        });\n    }\n    BaseCore.__ieDyn=1;\n    return BaseCore;\n}());\n\nfunction _runListeners(listeners, name, isAsync, callback) {\n    arrForEach(listeners, function (listener) {\n        if (listener && listener[name]) {\n            if (isAsync) {\n                setTimeout(function () { return callback(listener); }, 0);\n            }\n            else {\n                try {\n                    callback(listener);\n                }\n                catch (e) {\n                }\n            }\n        }\n    });\n}\nvar NotificationManager = /** @class */ (function () {\n    function NotificationManager(config) {\n        this.listeners = [];\n        var perfEvtsSendAll = !!(config || {}).perfEvtsSendAll;\n        dynamicProto(NotificationManager, this, function (_self) {\n            _self[_DYN_ADD_NOTIFICATION_LIS1 ] = function (listener) {\n                _self.listeners[_DYN_PUSH$2 ](listener);\n            };\n            _self[_DYN_REMOVE_NOTIFICATION_2 ] = function (listener) {\n                var index = arrIndexOf(_self[_DYN_LISTENERS ], listener);\n                while (index > -1) {\n                    _self.listeners[_DYN_SPLICE ](index, 1);\n                    index = arrIndexOf(_self[_DYN_LISTENERS ], listener);\n                }\n            };\n            _self[STR_EVENTS_SENT ] = function (events) {\n                _runListeners(_self[_DYN_LISTENERS ], STR_EVENTS_SENT, true, function (listener) {\n                    listener[STR_EVENTS_SENT ](events);\n                });\n            };\n            _self[STR_EVENTS_DISCARDED ] = function (events, reason) {\n                _runListeners(_self[_DYN_LISTENERS ], STR_EVENTS_DISCARDED, true, function (listener) {\n                    listener[STR_EVENTS_DISCARDED ](events, reason);\n                });\n            };\n            _self[STR_EVENTS_SEND_REQUEST ] = function (sendReason, isAsync) {\n                _runListeners(_self[_DYN_LISTENERS ], STR_EVENTS_SEND_REQUEST, isAsync, function (listener) {\n                    listener[STR_EVENTS_SEND_REQUEST ](sendReason, isAsync);\n                });\n            };\n            _self[STR_PERF_EVENT ] = function (perfEvent) {\n                if (perfEvent) {\n                    if (perfEvtsSendAll || !perfEvent[_DYN_IS_CHILD_EVT ]()) {\n                        _runListeners(_self[_DYN_LISTENERS ], STR_PERF_EVENT, false, function (listener) {\n                            if (perfEvent[_DYN_IS_ASYNC ]) {\n                                setTimeout(function () { return listener[STR_PERF_EVENT ](perfEvent); }, 0);\n                            }\n                            else {\n                                listener[STR_PERF_EVENT ](perfEvent);\n                            }\n                        });\n                    }\n                }\n            };\n        });\n    }\n    NotificationManager.__ieDyn=1;\n    return NotificationManager;\n}());\n\nvar AppInsightsCore = /** @class */ (function (_super) {\n    __extendsFn(AppInsightsCore, _super);\n    function AppInsightsCore() {\n        var _this = _super.call(this) || this;\n        dynamicProto(AppInsightsCore, _this, function (_self, _base) {\n            _self[_DYN_INITIALIZE ] = function (config, extensions, logger, notificationManager) {\n                _base[_DYN_INITIALIZE ](config, extensions, logger || new DiagnosticLogger(config), notificationManager || new NotificationManager(config));\n            };\n            _self.track = function (telemetryItem) {\n                doPerf(_self[STR_GET_PERF_MGR ](), function () { return \"AppInsightsCore:track\"; }, function () {\n                    if (telemetryItem === null) {\n                        _notifyInvalidEvent(telemetryItem);\n                        throwError(\"Invalid telemetry item\");\n                    }\n                    _validateTelemetryItem(telemetryItem);\n                    _base.track(telemetryItem);\n                }, function () { return ({ item: telemetryItem }); }, !(telemetryItem.sync));\n            };\n            function _validateTelemetryItem(telemetryItem) {\n                if (isNullOrUndefined(telemetryItem[_DYN_NAME$3 ])) {\n                    _notifyInvalidEvent(telemetryItem);\n                    throwError(\"telemetry name required\");\n                }\n            }\n            function _notifyInvalidEvent(telemetryItem) {\n                var manager = _self[_DYN_GET_NOTIFY_MGR ]();\n                if (manager) {\n                    manager[STR_EVENTS_DISCARDED ]([telemetryItem], 2 );\n                }\n            }\n        });\n        return _this;\n    }\n    AppInsightsCore.__ieDyn=1;\n    return AppInsightsCore;\n}(BaseCore));\n\nvar _a$2;\nvar FAILED = \"Failed\";\nvar FAILED_MONITOR_AJAX = FAILED + \"MonitorAjax\";\nvar TRACK = \"Track\";\nvar START = \"Start\";\nvar STOP = \"Stop\";\nvar EVENT = \"Event\";\nvar AUTH_CONTEXT = \"AuthContext\";\nvar EXCEPTION = \"Exception\";\nvar LOCAL = \"Local\";\nvar SESSION = \"Session\";\nvar STORAGE = \"Storage\";\nvar BROWSER = \"Browser\";\nvar CANNOT = \"Cannot\";\nvar BUFFER = \"Buffer\";\nvar INSTRUMENTATION_KEY = \"InstrumentationKey\";\nvar LoggingSeverity = createEnumStyle({\n    CRITICAL: 1 ,\n    WARNING: 2\n});\ncreateEnumStyle((_a$2 = {},\n    _a$2[BROWSER + \"DoesNotSupport\" + LOCAL + STORAGE] = 0 ,\n    _a$2[BROWSER + CANNOT + \"Read\" + LOCAL + STORAGE] = 1 ,\n    _a$2[BROWSER + CANNOT + \"Read\" + SESSION + STORAGE] = 2 ,\n    _a$2[BROWSER + CANNOT + \"Write\" + LOCAL + STORAGE] = 3 ,\n    _a$2[BROWSER + CANNOT + \"Write\" + SESSION + STORAGE] = 4 ,\n    _a$2[BROWSER + FAILED + \"RemovalFrom\" + LOCAL + STORAGE] = 5 ,\n    _a$2[BROWSER + FAILED + \"RemovalFrom\" + SESSION + STORAGE] = 6 ,\n    _a$2[CANNOT + \"SendEmptyTelemetry\"] = 7 ,\n    _a$2.ClientPerformanceMathError = 8 ,\n    _a$2[\"ErrorParsingAI\" + SESSION + \"Cookie\"] = 9 ,\n    _a$2.ErrorPVCalc = 10 ,\n    _a$2[EXCEPTION + \"WhileLoggingError\"] = 11 ,\n    _a$2[FAILED + \"AddingTelemetryTo\" + BUFFER] = 12 ,\n    _a$2[FAILED_MONITOR_AJAX + \"Abort\"] = 13 ,\n    _a$2[FAILED_MONITOR_AJAX + \"Dur\"] = 14 ,\n    _a$2[FAILED_MONITOR_AJAX + \"Open\"] = 15 ,\n    _a$2[FAILED_MONITOR_AJAX + \"RSC\"] = 16 ,\n    _a$2[FAILED_MONITOR_AJAX + \"Send\"] = 17 ,\n    _a$2[FAILED_MONITOR_AJAX + \"GetCorrelationHeader\"] = 18 ,\n    _a$2[FAILED + \"ToAddHandlerForOnBeforeUnload\"] = 19 ,\n    _a$2[FAILED + \"ToSendQueuedTelemetry\"] = 20 ,\n    _a$2[FAILED + \"ToReportDataLoss\"] = 21 ,\n    _a$2[\"Flush\" + FAILED] = 22 ,\n    _a$2.MessageLimitPerPVExceeded = 23 ,\n    _a$2.MissingRequiredFieldSpecification = 24 ,\n    _a$2.NavigationTimingNotSupported = 25 ,\n    _a$2.OnError = 26 ,\n    _a$2[SESSION + \"RenewalDateIsZero\"] = 27 ,\n    _a$2.SenderNotInitialized = 28 ,\n    _a$2[START + TRACK + EVENT + FAILED] = 29 ,\n    _a$2[STOP + TRACK + EVENT + FAILED] = 30 ,\n    _a$2[START + TRACK + FAILED] = 31 ,\n    _a$2[STOP + TRACK + FAILED] = 32 ,\n    _a$2.TelemetrySampledAndNotSent = 33 ,\n    _a$2[TRACK + EVENT + FAILED] = 34 ,\n    _a$2[TRACK + EXCEPTION + FAILED] = 35 ,\n    _a$2[TRACK + \"Metric\" + FAILED] = 36 ,\n    _a$2[TRACK + \"PV\" + FAILED] = 37 ,\n    _a$2[TRACK + \"PV\" + FAILED + \"Calc\"] = 38 ,\n    _a$2[TRACK + \"Trace\" + FAILED] = 39 ,\n    _a$2[\"Transmission\" + FAILED] = 40 ,\n    _a$2[FAILED + \"ToSet\" + STORAGE + BUFFER] = 41 ,\n    _a$2[FAILED + \"ToRestore\" + STORAGE + BUFFER] = 42 ,\n    _a$2.InvalidBackendResponse = 43 ,\n    _a$2[FAILED + \"ToFixDepricatedValues\"] = 44 ,\n    _a$2.InvalidDurationValue = 45 ,\n    _a$2.TelemetryEnvelopeInvalid = 46 ,\n    _a$2.CreateEnvelopeError = 47 ,\n    _a$2[CANNOT + \"SerializeObject\"] = 48 ,\n    _a$2[CANNOT + \"SerializeObjectNonSerializable\"] = 49 ,\n    _a$2.CircularReferenceDetected = 50 ,\n    _a$2[\"Clear\" + AUTH_CONTEXT + FAILED] = 51 ,\n    _a$2[EXCEPTION + \"Truncated\"] = 52 ,\n    _a$2.IllegalCharsInName = 53 ,\n    _a$2.ItemNotInArray = 54 ,\n    _a$2.MaxAjaxPerPVExceeded = 55 ,\n    _a$2.MessageTruncated = 56 ,\n    _a$2.NameTooLong = 57 ,\n    _a$2.SampleRateOutOfRange = 58 ,\n    _a$2[\"Set\" + AUTH_CONTEXT + FAILED] = 59 ,\n    _a$2[\"Set\" + AUTH_CONTEXT + FAILED + \"AccountName\"] = 60 ,\n    _a$2.StringValueTooLong = 61 ,\n    _a$2.StartCalledMoreThanOnce = 62 ,\n    _a$2.StopCalledWithoutStart = 63 ,\n    _a$2[\"TelemetryInitializer\" + FAILED] = 64 ,\n    _a$2.TrackArgumentsNotSpecified = 65 ,\n    _a$2.UrlTooLong = 66 ,\n    _a$2[SESSION + STORAGE + BUFFER + \"Full\"] = 67 ,\n    _a$2[CANNOT + \"AccessCookie\"] = 68 ,\n    _a$2.IdTooLong = 69 ,\n    _a$2.InvalidEvent = 70 ,\n    _a$2[FAILED_MONITOR_AJAX + \"SetRequestHeader\"] = 71 ,\n    _a$2[\"Send\" + BROWSER + \"InfoOnUserInit\"] = 72 ,\n    _a$2[\"Plugin\" + EXCEPTION] = 73 ,\n    _a$2[\"Notification\" + EXCEPTION] = 74 ,\n    _a$2.SnippetScriptLoadFailure = 99 ,\n    _a$2[\"Invalid\" + INSTRUMENTATION_KEY] = 100 ,\n    _a$2[CANNOT + \"ParseAiBlobValue\"] = 101 ,\n    _a$2.InvalidContentBlob = 102 ,\n    _a$2[TRACK + \"PageAction\" + EVENT + FAILED] = 103 ,\n    _a$2[FAILED + \"AddingCustomDefinedRequestContext\"] = 104 ,\n    _a$2[\"InMemory\" + STORAGE + BUFFER + \"Full\"] = 105 ,\n    _a$2[INSTRUMENTATION_KEY + \"Deprecation\"] = 106 ,\n    _a$2));\n\nvar aiInstrumentHooks = \"_aiHooks\";\nvar cbNames = [\n    \"req\", \"rsp\", \"hkErr\", \"fnErr\"\n];\nfunction _arrLoop(arr, fn) {\n    if (arr) {\n        for (var lp = 0; lp < arr[_DYN_LENGTH$5 ]; lp++) {\n            if (fn(arr[lp], lp)) {\n                break;\n            }\n        }\n    }\n}\nfunction _doCallbacks(hooks, callDetails, cbArgs, hookCtx, type) {\n    if (type >= 0  && type <= 2 ) {\n        _arrLoop(hooks, function (hook, idx) {\n            var cbks = hook.cbks;\n            var cb = cbks[cbNames[type]];\n            if (cb) {\n                callDetails.ctx = function () {\n                    var ctx = hookCtx[idx] = (hookCtx[idx] || {});\n                    return ctx;\n                };\n                try {\n                    cb[_DYN_APPLY ](callDetails.inst, cbArgs);\n                }\n                catch (err) {\n                    var orgEx = callDetails.err;\n                    try {\n                        var hookErrorCb = cbks[cbNames[2 ]];\n                        if (hookErrorCb) {\n                            callDetails.err = err;\n                            hookErrorCb[_DYN_APPLY ](callDetails.inst, cbArgs);\n                        }\n                    }\n                    catch (e) {\n                    }\n                    finally {\n                        callDetails.err = orgEx;\n                    }\n                }\n            }\n        });\n    }\n}\nfunction _createFunctionHook(aiHook) {\n    return function () {\n        var _a;\n        var funcThis = this;\n        var orgArgs = arguments;\n        var hooks = aiHook.h;\n        var funcArgs = (_a = {},\n            _a[_DYN_NAME$3 ] = aiHook.n,\n            _a.inst = funcThis,\n            _a.ctx = null,\n            _a.set = _replaceArg,\n            _a);\n        var hookCtx = [];\n        var cbArgs = _createArgs([funcArgs], orgArgs);\n        funcArgs.evt = getGlobalInst(\"event\");\n        function _createArgs(target, theArgs) {\n            _arrLoop(theArgs, function (arg) {\n                target[_DYN_PUSH$2 ](arg);\n            });\n            return target;\n        }\n        function _replaceArg(idx, value) {\n            orgArgs = _createArgs([], orgArgs);\n            orgArgs[idx] = value;\n            cbArgs = _createArgs([funcArgs], orgArgs);\n        }\n        _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 0 );\n        var theFunc = aiHook.f;\n        if (theFunc) {\n            try {\n                funcArgs.rslt = theFunc[_DYN_APPLY ](funcThis, orgArgs);\n            }\n            catch (err) {\n                funcArgs.err = err;\n                _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 3 );\n                throw err;\n            }\n        }\n        _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 1 );\n        return funcArgs.rslt;\n    };\n}\nfunction _getOwner(target, name, checkPrototype, checkParentProto) {\n    var owner = null;\n    if (target) {\n        if (hasOwnProperty(target, name)) {\n            owner = target;\n        }\n        else if (checkPrototype) {\n            owner = _getOwner(_getObjProto$1(target), name, checkParentProto, false);\n        }\n    }\n    return owner;\n}\nfunction InstrumentProto(target, funcName, callbacks) {\n    if (target) {\n        return InstrumentFunc(target[strShimPrototype], funcName, callbacks, false);\n    }\n    return null;\n}\nfunction _createInstrumentHook(owner, funcName, fn, callbacks) {\n    var aiHook = fn && fn[aiInstrumentHooks];\n    if (!aiHook) {\n        aiHook = {\n            i: 0,\n            n: funcName,\n            f: fn,\n            h: []\n        };\n        var newFunc = _createFunctionHook(aiHook);\n        newFunc[aiInstrumentHooks] = aiHook;\n        owner[funcName] = newFunc;\n    }\n    var theHook = {\n        id: aiHook.i,\n        cbks: callbacks,\n        rm: function () {\n            var id = this.id;\n            _arrLoop(aiHook.h, function (hook, idx) {\n                if (hook.id === id) {\n                    aiHook.h[_DYN_SPLICE ](idx, 1);\n                    return 1;\n                }\n            });\n        }\n    };\n    aiHook.i++;\n    aiHook.h[_DYN_PUSH$2 ](theHook);\n    return theHook;\n}\nfunction InstrumentFunc(target, funcName, callbacks, checkPrototype, checkParentProto) {\n    if (checkPrototype === void 0) { checkPrototype = true; }\n    if (target && funcName && callbacks) {\n        var owner = _getOwner(target, funcName, checkPrototype, checkParentProto);\n        if (owner) {\n            var fn = owner[funcName];\n            if (typeof fn === strShimFunction) {\n                return _createInstrumentHook(owner, funcName, fn, callbacks);\n            }\n        }\n    }\n    return null;\n}\nfunction InstrumentEvent(target, evtName, callbacks, checkPrototype, checkParentProto) {\n    if (target && evtName && callbacks) {\n        var owner = _getOwner(target, evtName, checkPrototype, checkParentProto) || target;\n        if (owner) {\n            return _createInstrumentHook(owner, evtName, owner[evtName], callbacks);\n        }\n    }\n    return null;\n}\n\nvar DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\nvar SampleRate = \"sampleRate\";\nvar ProcessLegacy = \"ProcessLegacy\";\nvar HttpMethod = \"http.method\";\nvar DEFAULT_BREEZE_ENDPOINT = \"https://dc.services.visualstudio.com\";\nvar DEFAULT_BREEZE_PATH = \"/v2/track\";\nvar strNotSpecified = \"not_specified\";\nvar strIkey = \"iKey\";\n\nfunction createDomEvent(eventName) {\n    var event = null;\n    if (isFunction(Event)) {\n        event = new Event(eventName);\n    }\n    else {\n        var doc = getDocument();\n        if (doc && doc.createEvent) {\n            event = doc.createEvent(\"Event\");\n            event.initEvent(eventName, true, true);\n        }\n    }\n    return event;\n}\n\nvar _DYN_SPLIT = \"split\";\nvar _DYN_LENGTH$4 = \"length\";\nvar _DYN_TO_LOWER_CASE$1 = \"toLowerCase\";\nvar _DYN_INGESTIONENDPOINT = \"ingestionendpoint\";\nvar _DYN_TO_STRING$2 = \"toString\";\nvar _DYN_REMOVE_ITEM = \"removeItem\";\nvar _DYN_NAME$2 = \"name\";\nvar _DYN_MESSAGE$1 = \"message\";\nvar _DYN_COUNT$1 = \"count\";\nvar _DYN_STRINGIFY$1 = \"stringify\";\nvar _DYN_PATHNAME = \"pathname\";\nvar _DYN_CORRELATION_HEADER_E0 = \"correlationHeaderExcludePatterns\";\nvar _DYN_INDEX_OF$1 = \"indexOf\";\nvar _DYN_EXTENSION_CONFIG = \"extensionConfig\";\nvar _DYN_EXCEPTIONS = \"exceptions\";\nvar _DYN_PARSED_STACK = \"parsedStack\";\nvar _DYN_PROPERTIES = \"properties\";\nvar _DYN_MEASUREMENTS$1 = \"measurements\";\nvar _DYN_SIZE_IN_BYTES = \"sizeInBytes\";\nvar _DYN_TYPE_NAME = \"typeName\";\nvar _DYN_SEVERITY_LEVEL = \"severityLevel\";\nvar _DYN_PROBLEM_GROUP = \"problemGroup\";\nvar _DYN_IS_MANUAL = \"isManual\";\nvar _DYN__CREATE_FROM_INTERFA1 = \"CreateFromInterface\";\nvar _DYN_ASSEMBLY = \"assembly\";\nvar _DYN_FILE_NAME = \"fileName\";\nvar _DYN_HAS_FULL_STACK = \"hasFullStack\";\nvar _DYN_LEVEL = \"level\";\nvar _DYN_METHOD$1 = \"method\";\nvar _DYN_LINE = \"line\";\nvar _DYN_DURATION$1 = \"duration\";\nvar _DYN_RECEIVED_RESPONSE = \"receivedResponse\";\nvar _DYN_SUBSTRING = \"substring\";\nvar _DYN_SANITIZE_KEY_AND_ADD2 = \"sanitizeKeyAndAddUniqueness\";\nvar _DYN_SANITIZE_EXCEPTION = \"sanitizeException\";\nvar _DYN_SANITIZE_PROPERTIES = \"sanitizeProperties\";\nvar _DYN_SANITIZE_MEASUREMENT3 = \"sanitizeMeasurements\";\n\nvar strEmpty = \"\";\nfunction stringToBoolOrDefault(str, defaultValue) {\n    if (defaultValue === void 0) { defaultValue = false; }\n    if (str === undefined || str === null) {\n        return defaultValue;\n    }\n    return str.toString()[_DYN_TO_LOWER_CASE$1 ]() === \"true\";\n}\nfunction msToTimeSpan(totalms) {\n    if (isNaN(totalms) || totalms < 0) {\n        totalms = 0;\n    }\n    totalms = Math.round(totalms);\n    var ms = strEmpty + totalms % 1000;\n    var sec = strEmpty + Math.floor(totalms / 1000) % 60;\n    var min = strEmpty + Math.floor(totalms / (1000 * 60)) % 60;\n    var hour = strEmpty + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n    var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n    ms = ms[_DYN_LENGTH$4 ] === 1 ? \"00\" + ms : ms[_DYN_LENGTH$4 ] === 2 ? \"0\" + ms : ms;\n    sec = sec[_DYN_LENGTH$4 ] < 2 ? \"0\" + sec : sec;\n    min = min[_DYN_LENGTH$4 ] < 2 ? \"0\" + min : min;\n    hour = hour[_DYN_LENGTH$4 ] < 2 ? \"0\" + hour : hour;\n    return (days > 0 ? days + \".\" : strEmpty) + hour + \":\" + min + \":\" + sec + \".\" + ms;\n}\nfunction getExtensionByName(extensions, identifier) {\n    var extension = null;\n    arrForEach(extensions, function (value) {\n        if (value.identifier === identifier) {\n            extension = value;\n            return -1;\n        }\n    });\n    return extension;\n}\nfunction isCrossOriginError(message, url, lineNumber, columnNumber, error) {\n    return !error && isString(message) && (message === \"Script error.\" || message === \"Script error\");\n}\n\nvar RequestHeaders = createValueMap({\n    requestContextHeader: [0 , \"Request-Context\"],\n    requestContextTargetKey: [1 , \"appId\"],\n    requestContextAppIdFormat: [2 , \"appId=cid-v1:\"],\n    requestIdHeader: [3 , \"Request-Id\"],\n    traceParentHeader: [4 , \"traceparent\"],\n    traceStateHeader: [5 , \"tracestate\"],\n    sdkContextHeader: [6 , \"Sdk-Context\"],\n    sdkContextHeaderAppIdRequest: [7 , \"appId\"],\n    requestContextHeaderLowerCase: [8 , \"request-context\"]\n});\n\nvar StorageType = createEnumStyle({\n    LocalStorage: 0 ,\n    SessionStorage: 1\n});\nvar DistributedTracingModes = createEnumStyle({\n    AI: 0 ,\n    AI_AND_W3C: 1 ,\n    W3C: 2\n});\n\nvar _canUseLocalStorage = undefined;\nvar _canUseSessionStorage = undefined;\nvar _storagePrefix = \"\";\nfunction _getLocalStorageObject() {\n    if (utlCanUseLocalStorage()) {\n        return _getVerifiedStorageObject(StorageType.LocalStorage);\n    }\n    return null;\n}\nfunction _getVerifiedStorageObject(storageType) {\n    try {\n        if (isNullOrUndefined(getGlobal())) {\n            return null;\n        }\n        var uid = (new Date)[_DYN_TO_STRING$2 ]();\n        var storage = getGlobalInst(storageType === StorageType.LocalStorage ? \"localStorage\" : \"sessionStorage\");\n        var name_1 = _storagePrefix + uid;\n        storage.setItem(name_1, uid);\n        var fail = storage.getItem(name_1) !== uid;\n        storage[_DYN_REMOVE_ITEM ](name_1);\n        if (!fail) {\n            return storage;\n        }\n    }\n    catch (exception) {\n    }\n    return null;\n}\nfunction _getSessionStorageObject() {\n    if (utlCanUseSessionStorage()) {\n        return _getVerifiedStorageObject(StorageType.SessionStorage);\n    }\n    return null;\n}\nfunction utlDisableStorage() {\n    _canUseLocalStorage = false;\n    _canUseSessionStorage = false;\n}\nfunction utlSetStoragePrefix(storagePrefix) {\n    _storagePrefix = storagePrefix || \"\";\n}\nfunction utlEnableStorage() {\n    _canUseLocalStorage = utlCanUseLocalStorage(true);\n    _canUseSessionStorage = utlCanUseSessionStorage(true);\n}\nfunction utlCanUseLocalStorage(reset) {\n    if (reset || _canUseLocalStorage === undefined) {\n        _canUseLocalStorage = !!_getVerifiedStorageObject(StorageType.LocalStorage);\n    }\n    return _canUseLocalStorage;\n}\nfunction utlGetLocalStorage(logger, name) {\n    var storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            return storage.getItem(name);\n        }\n        catch (e) {\n            _canUseLocalStorage = false;\n            _throwInternal(logger, 2 , 1 , \"Browser failed read of local storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return null;\n}\nfunction utlSetLocalStorage(logger, name, data) {\n    var storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            storage.setItem(name, data);\n            return true;\n        }\n        catch (e) {\n            _canUseLocalStorage = false;\n            _throwInternal(logger, 2 , 3 , \"Browser failed write to local storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\nfunction utlRemoveStorage(logger, name) {\n    var storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            storage[_DYN_REMOVE_ITEM ](name);\n            return true;\n        }\n        catch (e) {\n            _canUseLocalStorage = false;\n            _throwInternal(logger, 2 , 5 , \"Browser failed removal of local storage item. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\nfunction utlCanUseSessionStorage(reset) {\n    if (reset || _canUseSessionStorage === undefined) {\n        _canUseSessionStorage = !!_getVerifiedStorageObject(StorageType.SessionStorage);\n    }\n    return _canUseSessionStorage;\n}\nfunction utlGetSessionStorageKeys() {\n    var keys = [];\n    if (utlCanUseSessionStorage()) {\n        objForEachKey(getGlobalInst(\"sessionStorage\"), function (key) {\n            keys.push(key);\n        });\n    }\n    return keys;\n}\nfunction utlGetSessionStorage(logger, name) {\n    var storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            return storage.getItem(name);\n        }\n        catch (e) {\n            _canUseSessionStorage = false;\n            _throwInternal(logger, 2 , 2 , \"Browser failed read of session storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return null;\n}\nfunction utlSetSessionStorage(logger, name, data) {\n    var storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            storage.setItem(name, data);\n            return true;\n        }\n        catch (e) {\n            _canUseSessionStorage = false;\n            _throwInternal(logger, 2 , 4 , \"Browser failed write to session storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\nfunction utlRemoveSessionStorage(logger, name) {\n    var storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            storage[_DYN_REMOVE_ITEM ](name);\n            return true;\n        }\n        catch (e) {\n            _canUseSessionStorage = false;\n            _throwInternal(logger, 2 , 6 , \"Browser failed removal of session storage item. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\n\nvar _a$1;\nfunction dataSanitizeKeyAndAddUniqueness(logger, key, map) {\n    var origLength = key[_DYN_LENGTH$4 ];\n    var field = dataSanitizeKey(logger, key);\n    if (field[_DYN_LENGTH$4 ] !== origLength) {\n        var i = 0;\n        var uniqueField = field;\n        while (map[uniqueField] !== undefined) {\n            i++;\n            uniqueField = field[_DYN_SUBSTRING ](0, 150  - 3) + dsPadNumber(i);\n        }\n        field = uniqueField;\n    }\n    return field;\n}\nfunction dataSanitizeKey(logger, name) {\n    var nameTrunc;\n    if (name) {\n        name = strTrim(name[_DYN_TO_STRING$2 ]());\n        if (name[_DYN_LENGTH$4 ] > 150 ) {\n            nameTrunc = name[_DYN_SUBSTRING ](0, 150 );\n            _throwInternal(logger, 2 , 57 , \"name is too long.  It has been truncated to \" + 150  + \" characters.\", { name: name }, true);\n        }\n    }\n    return nameTrunc || name;\n}\nfunction dataSanitizeString(logger, value, maxLength) {\n    if (maxLength === void 0) { maxLength = 1024 ; }\n    var valueTrunc;\n    if (value) {\n        maxLength = maxLength ? maxLength : 1024 ;\n        value = strTrim(value);\n        if (value.toString()[_DYN_LENGTH$4 ] > maxLength) {\n            valueTrunc = value[_DYN_TO_STRING$2 ]()[_DYN_SUBSTRING ](0, maxLength);\n            _throwInternal(logger, 2 , 61 , \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n        }\n    }\n    return valueTrunc || value;\n}\nfunction dataSanitizeUrl(logger, url) {\n    return dataSanitizeInput(logger, url, 2048 , 66 );\n}\nfunction dataSanitizeMessage(logger, message) {\n    var messageTrunc;\n    if (message) {\n        if (message[_DYN_LENGTH$4 ] > 32768 ) {\n            messageTrunc = message[_DYN_SUBSTRING ](0, 32768 );\n            _throwInternal(logger, 2 , 56 , \"message is too long, it has been truncated to \" + 32768  + \" characters.\", { message: message }, true);\n        }\n    }\n    return messageTrunc || message;\n}\nfunction dataSanitizeException(logger, exception) {\n    var exceptionTrunc;\n    if (exception) {\n        var value = \"\" + exception;\n        if (value[_DYN_LENGTH$4 ] > 32768 ) {\n            exceptionTrunc = value[_DYN_SUBSTRING ](0, 32768 );\n            _throwInternal(logger, 2 , 52 , \"exception is too long, it has been truncated to \" + 32768  + \" characters.\", { exception: exception }, true);\n        }\n    }\n    return exceptionTrunc || exception;\n}\nfunction dataSanitizeProperties(logger, properties) {\n    if (properties) {\n        var tempProps_1 = {};\n        objForEachKey(properties, function (prop, value) {\n            if (isObject(value) && hasJSON()) {\n                try {\n                    value = getJSON()[_DYN_STRINGIFY$1 ](value);\n                }\n                catch (e) {\n                    _throwInternal(logger, 2 , 49 , \"custom property is not valid\", { exception: e }, true);\n                }\n            }\n            value = dataSanitizeString(logger, value, 8192 );\n            prop = dataSanitizeKeyAndAddUniqueness(logger, prop, tempProps_1);\n            tempProps_1[prop] = value;\n        });\n        properties = tempProps_1;\n    }\n    return properties;\n}\nfunction dataSanitizeMeasurements(logger, measurements) {\n    if (measurements) {\n        var tempMeasurements_1 = {};\n        objForEachKey(measurements, function (measure, value) {\n            measure = dataSanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements_1);\n            tempMeasurements_1[measure] = value;\n        });\n        measurements = tempMeasurements_1;\n    }\n    return measurements;\n}\nfunction dataSanitizeId(logger, id) {\n    return id ? dataSanitizeInput(logger, id, 128 , 69 )[_DYN_TO_STRING$2 ]() : id;\n}\nfunction dataSanitizeInput(logger, input, maxLength, _msgId) {\n    var inputTrunc;\n    if (input) {\n        input = strTrim(input);\n        if (input[_DYN_LENGTH$4 ] > maxLength) {\n            inputTrunc = input[_DYN_SUBSTRING ](0, maxLength);\n            _throwInternal(logger, 2 , _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n        }\n    }\n    return inputTrunc || input;\n}\nfunction dsPadNumber(num) {\n    var s = \"00\" + num;\n    return s.substr(s[_DYN_LENGTH$4 ] - 3);\n}\nvar DataSanitizer = (_a$1 = {\n        MAX_NAME_LENGTH: 150 ,\n        MAX_ID_LENGTH: 128 ,\n        MAX_PROPERTY_LENGTH: 8192 ,\n        MAX_STRING_LENGTH: 1024 ,\n        MAX_URL_LENGTH: 2048 ,\n        MAX_MESSAGE_LENGTH: 32768 ,\n        MAX_EXCEPTION_LENGTH: 32768\n    },\n    _a$1[_DYN_SANITIZE_KEY_AND_ADD2 ] = dataSanitizeKeyAndAddUniqueness,\n    _a$1.sanitizeKey = dataSanitizeKey,\n    _a$1.sanitizeString = dataSanitizeString,\n    _a$1.sanitizeUrl = dataSanitizeUrl,\n    _a$1.sanitizeMessage = dataSanitizeMessage,\n    _a$1[_DYN_SANITIZE_EXCEPTION ] = dataSanitizeException,\n    _a$1[_DYN_SANITIZE_PROPERTIES ] = dataSanitizeProperties,\n    _a$1[_DYN_SANITIZE_MEASUREMENT3 ] = dataSanitizeMeasurements,\n    _a$1.sanitizeId = dataSanitizeId,\n    _a$1.sanitizeInput = dataSanitizeInput,\n    _a$1.padNumber = dsPadNumber,\n    _a$1.trim = strTrim,\n    _a$1);\n\nvar _document = getDocument() || {};\nvar _htmlAnchorIdx = 0;\nvar _htmlAnchorElement = [null, null, null, null, null];\nfunction urlParseUrl(url) {\n    var anchorIdx = _htmlAnchorIdx;\n    var anchorCache = _htmlAnchorElement;\n    var tempAnchor = anchorCache[anchorIdx];\n    if (!_document.createElement) {\n        tempAnchor = { host: urlParseHost(url, true) };\n    }\n    else if (!anchorCache[anchorIdx]) {\n        tempAnchor = anchorCache[anchorIdx] = _document.createElement(\"a\");\n    }\n    tempAnchor.href = url;\n    anchorIdx++;\n    if (anchorIdx >= anchorCache[_DYN_LENGTH$4 ]) {\n        anchorIdx = 0;\n    }\n    _htmlAnchorIdx = anchorIdx;\n    return tempAnchor;\n}\nfunction urlGetAbsoluteUrl(url) {\n    var result;\n    var a = urlParseUrl(url);\n    if (a) {\n        result = a.href;\n    }\n    return result;\n}\nfunction urlGetPathName(url) {\n    var result;\n    var a = urlParseUrl(url);\n    if (a) {\n        result = a[_DYN_PATHNAME ];\n    }\n    return result;\n}\nfunction urlGetCompleteUrl(method, absoluteUrl) {\n    if (method) {\n        return method.toUpperCase() + \" \" + absoluteUrl;\n    }\n    return absoluteUrl;\n}\nfunction urlParseHost(url, inclPort) {\n    var fullHost = urlParseFullHost(url, inclPort) || \"\";\n    if (fullHost) {\n        var match = fullHost.match(/(www\\d{0,5}\\.)?([^\\/:]{1,256})(:\\d{1,20})?/i);\n        if (match != null && match[_DYN_LENGTH$4 ] > 3 && isString(match[2]) && match[2][_DYN_LENGTH$4 ] > 0) {\n            return match[2] + (match[3] || \"\");\n        }\n    }\n    return fullHost;\n}\nfunction urlParseFullHost(url, inclPort) {\n    var result = null;\n    if (url) {\n        var match = url.match(/(\\w{1,150}):\\/\\/([^\\/:]{1,256})(:\\d{1,20})?/i);\n        if (match != null && match[_DYN_LENGTH$4 ] > 2 && isString(match[2]) && match[2][_DYN_LENGTH$4 ] > 0) {\n            result = match[2] || \"\";\n            if (inclPort && match[_DYN_LENGTH$4 ] > 2) {\n                var protocol = (match[1] || \"\")[_DYN_TO_LOWER_CASE$1 ]();\n                var port = match[3] || \"\";\n                if (protocol === \"http\" && port === \":80\") {\n                    port = \"\";\n                }\n                else if (protocol === \"https\" && port === \":443\") {\n                    port = \"\";\n                }\n                result += port;\n            }\n        }\n    }\n    return result;\n}\n\nvar _internalEndpoints = [\n    DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH,\n    \"https://breeze.aimon.applicationinsights.io\" + DEFAULT_BREEZE_PATH,\n    \"https://dc-int.services.visualstudio.com\" + DEFAULT_BREEZE_PATH\n];\nfunction isInternalApplicationInsightsEndpoint(endpointUrl) {\n    return arrIndexOf(_internalEndpoints, endpointUrl[_DYN_TO_LOWER_CASE$1 ]()) !== -1;\n}\nvar Util = {\n    NotSpecified: strNotSpecified,\n    createDomEvent: createDomEvent,\n    disableStorage: utlDisableStorage,\n    isInternalApplicationInsightsEndpoint: isInternalApplicationInsightsEndpoint,\n    canUseLocalStorage: utlCanUseLocalStorage,\n    getStorage: utlGetLocalStorage,\n    setStorage: utlSetLocalStorage,\n    removeStorage: utlRemoveStorage,\n    canUseSessionStorage: utlCanUseSessionStorage,\n    getSessionStorageKeys: utlGetSessionStorageKeys,\n    getSessionStorage: utlGetSessionStorage,\n    setSessionStorage: utlSetSessionStorage,\n    removeSessionStorage: utlRemoveSessionStorage,\n    disableCookies: disableCookies,\n    canUseCookies: canUseCookies,\n    disallowsSameSiteNone: uaDisallowsSameSiteNone,\n    setCookie: setCookie,\n    stringToBoolOrDefault: stringToBoolOrDefault,\n    getCookie: getCookie,\n    deleteCookie: deleteCookie,\n    trim: strTrim,\n    newId: newId,\n    random32: function () {\n        return random32(true);\n    },\n    generateW3CId: generateW3CId,\n    isArray: isArray,\n    isError: isError,\n    isDate: isDate,\n    toISOStringForIE8: toISOString,\n    getIEVersion: getIEVersion,\n    msToTimeSpan: msToTimeSpan,\n    isCrossOriginError: isCrossOriginError,\n    dump: dumpObj,\n    getExceptionName: getExceptionName,\n    addEventHandler: attachEvent,\n    IsBeaconApiSupported: isBeaconsSupported,\n    getExtension: getExtensionByName\n};\nvar UrlHelper = {\n    parseUrl: urlParseUrl,\n    getAbsoluteUrl: urlGetAbsoluteUrl,\n    getPathName: urlGetPathName,\n    getCompleteUrl: urlGetCompleteUrl,\n    parseHost: urlParseHost,\n    parseFullHost: urlParseFullHost\n};\nvar CorrelationIdHelper = {\n    correlationIdPrefix: \"cid-v1:\",\n    canIncludeCorrelationHeader: function (config, requestUrl, currentHost) {\n        if (!requestUrl || (config && config.disableCorrelationHeaders)) {\n            return false;\n        }\n        if (config && config[_DYN_CORRELATION_HEADER_E0 ]) {\n            for (var i = 0; i < config.correlationHeaderExcludePatterns[_DYN_LENGTH$4 ]; i++) {\n                if (config[_DYN_CORRELATION_HEADER_E0 ][i].test(requestUrl)) {\n                    return false;\n                }\n            }\n        }\n        var requestHost = urlParseUrl(requestUrl).host[_DYN_TO_LOWER_CASE$1 ]();\n        if (requestHost && (requestHost[_DYN_INDEX_OF$1 ](\":443\") !== -1 || requestHost[_DYN_INDEX_OF$1 ](\":80\") !== -1)) {\n            requestHost = (urlParseFullHost(requestUrl, true) || \"\")[_DYN_TO_LOWER_CASE$1 ]();\n        }\n        if ((!config || !config.enableCorsCorrelation) && (requestHost && requestHost !== currentHost)) {\n            return false;\n        }\n        var includedDomains = config && config.correlationHeaderDomains;\n        if (includedDomains) {\n            var matchExists_1;\n            arrForEach(includedDomains, function (domain) {\n                var regex = new RegExp(domain.toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n                matchExists_1 = matchExists_1 || regex.test(requestHost);\n            });\n            if (!matchExists_1) {\n                return false;\n            }\n        }\n        var excludedDomains = config && config.correlationHeaderExcludedDomains;\n        if (!excludedDomains || excludedDomains[_DYN_LENGTH$4 ] === 0) {\n            return true;\n        }\n        for (var i = 0; i < excludedDomains[_DYN_LENGTH$4 ]; i++) {\n            var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n            if (regex.test(requestHost)) {\n                return false;\n            }\n        }\n        return requestHost && requestHost[_DYN_LENGTH$4 ] > 0;\n    },\n    getCorrelationContext: function (responseHeader) {\n        if (responseHeader) {\n            var correlationId = CorrelationIdHelper.getCorrelationContextValue(responseHeader, RequestHeaders[1 ]);\n            if (correlationId && correlationId !== CorrelationIdHelper.correlationIdPrefix) {\n                return correlationId;\n            }\n        }\n    },\n    getCorrelationContextValue: function (responseHeader, key) {\n        if (responseHeader) {\n            var keyValues = responseHeader[_DYN_SPLIT ](\",\");\n            for (var i = 0; i < keyValues[_DYN_LENGTH$4 ]; ++i) {\n                var keyValue = keyValues[i][_DYN_SPLIT ](\"=\");\n                if (keyValue[_DYN_LENGTH$4 ] === 2 && keyValue[0] === key) {\n                    return keyValue[1];\n                }\n            }\n        }\n    }\n};\nfunction AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName) {\n    var target, name = commandName, data = commandName;\n    if (absoluteUrl && absoluteUrl[_DYN_LENGTH$4 ] > 0) {\n        var parsedUrl = urlParseUrl(absoluteUrl);\n        target = parsedUrl.host;\n        if (!name) {\n            if (parsedUrl[_DYN_PATHNAME ] != null) {\n                var pathName = (parsedUrl.pathname[_DYN_LENGTH$4 ] === 0) ? \"/\" : parsedUrl[_DYN_PATHNAME ];\n                if (pathName.charAt(0) !== \"/\") {\n                    pathName = \"/\" + pathName;\n                }\n                data = parsedUrl[_DYN_PATHNAME ];\n                name = dataSanitizeString(logger, method ? method + \" \" + pathName : pathName);\n            }\n            else {\n                name = dataSanitizeString(logger, absoluteUrl);\n            }\n        }\n    }\n    else {\n        target = commandName;\n        name = commandName;\n    }\n    return {\n        target: target,\n        name: name,\n        data: data\n    };\n}\nfunction dateTimeUtilsNow() {\n    var perf = getPerformance();\n    if (perf && perf.now && perf.timing) {\n        var now = perf.now() + perf.timing.navigationStart;\n        if (now > 0) {\n            return now;\n        }\n    }\n    return dateNow();\n}\nfunction dateTimeUtilsDuration(start, end) {\n    var result = null;\n    if (start !== 0 && end !== 0 && !isNullOrUndefined(start) && !isNullOrUndefined(end)) {\n        result = end - start;\n    }\n    return result;\n}\nvar DateTimeUtils = {\n    Now: dateTimeUtilsNow,\n    GetDuration: dateTimeUtilsDuration\n};\nfunction createDistributedTraceContextFromTrace(telemetryTrace, parentCtx) {\n    var trace = telemetryTrace || {};\n    return {\n        getName: function () {\n            return trace[_DYN_NAME$2 ];\n        },\n        setName: function (newValue) {\n            parentCtx && parentCtx.setName(newValue);\n            trace[_DYN_NAME$2 ] = newValue;\n        },\n        getTraceId: function () {\n            return trace.traceID;\n        },\n        setTraceId: function (newValue) {\n            parentCtx && parentCtx.setTraceId(newValue);\n            if (isValidTraceId(newValue)) {\n                trace.traceID = newValue;\n            }\n        },\n        getSpanId: function () {\n            return trace.parentID;\n        },\n        setSpanId: function (newValue) {\n            parentCtx && parentCtx.setSpanId(newValue);\n            if (isValidSpanId(newValue)) {\n                trace.parentID = newValue;\n            }\n        },\n        getTraceFlags: function () {\n            return trace.traceFlags;\n        },\n        setTraceFlags: function (newTraceFlags) {\n            parentCtx && parentCtx.setTraceFlags(newTraceFlags);\n            trace.traceFlags = newTraceFlags;\n        }\n    };\n}\n\nvar _FIELDS_SEPARATOR = \";\";\nvar _FIELD_KEY_VALUE_SEPARATOR = \"=\";\nfunction parseConnectionString(connectionString) {\n    if (!connectionString) {\n        return {};\n    }\n    var kvPairs = connectionString[_DYN_SPLIT ](_FIELDS_SEPARATOR);\n    var result = arrReduce(kvPairs, function (fields, kv) {\n        var kvParts = kv[_DYN_SPLIT ](_FIELD_KEY_VALUE_SEPARATOR);\n        if (kvParts[_DYN_LENGTH$4 ] === 2) {\n            var key = kvParts[0][_DYN_TO_LOWER_CASE$1 ]();\n            var value = kvParts[1];\n            fields[key] = value;\n        }\n        return fields;\n    }, {});\n    if (objKeys(result)[_DYN_LENGTH$4 ] > 0) {\n        if (result.endpointsuffix) {\n            var locationPrefix = result.location ? result.location + \".\" : \"\";\n            result[_DYN_INGESTIONENDPOINT ] = result[_DYN_INGESTIONENDPOINT ] || (\"https://\" + locationPrefix + \"dc.\" + result.endpointsuffix);\n        }\n        result[_DYN_INGESTIONENDPOINT ] = result[_DYN_INGESTIONENDPOINT ] || DEFAULT_BREEZE_ENDPOINT;\n    }\n    return result;\n}\nvar ConnectionStringParser = {\n    parse: parseConnectionString\n};\n\nvar Envelope = /** @class */ (function () {\n    function Envelope(logger, data, name) {\n        var _this = this;\n        var _self = this;\n        _self.ver = 1;\n        _self.sampleRate = 100.0;\n        _self.tags = {};\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        _self.data = data;\n        _self.time = toISOString(new Date());\n        _self.aiDataContract = {\n            time: 1 ,\n            iKey: 1 ,\n            name: 1 ,\n            sampleRate: function () {\n                return (_this.sampleRate === 100) ? 4  : 1 ;\n            },\n            tags: 1 ,\n            data: 1\n        };\n    }\n    return Envelope;\n}());\n\nvar Event$1 = /** @class */ (function () {\n    function Event(logger, name, properties, measurements) {\n        this.aiDataContract = {\n            ver: 1 ,\n            name: 1 ,\n            properties: 0 ,\n            measurements: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n    Event.dataType = \"EventData\";\n    return Event;\n}());\n\nvar NoMethod = \"<no_method>\";\nvar strError = \"error\";\nvar strStack = \"stack\";\nvar strStackDetails = \"stackDetails\";\nvar strErrorSrc = \"errorSrc\";\nvar strMessage = \"message\";\nvar strDescription = \"description\";\nfunction _stringify(value, convertToString) {\n    var result = value;\n    if (result && !isString(result)) {\n        if (JSON && JSON[_DYN_STRINGIFY$1 ]) {\n            result = JSON[_DYN_STRINGIFY$1 ](value);\n            if (convertToString && (!result || result === \"{}\")) {\n                if (isFunction(value[_DYN_TO_STRING$2 ])) {\n                    result = value[_DYN_TO_STRING$2 ]();\n                }\n                else {\n                    result = \"\" + value;\n                }\n            }\n        }\n        else {\n            result = \"\" + value + \" - (Missing JSON.stringify)\";\n        }\n    }\n    return result || \"\";\n}\nfunction _formatMessage(theEvent, errorType) {\n    var evtMessage = theEvent;\n    if (theEvent) {\n        if (evtMessage && !isString(evtMessage)) {\n            evtMessage = theEvent[strMessage] || theEvent[strDescription] || evtMessage;\n        }\n        if (evtMessage && !isString(evtMessage)) {\n            evtMessage = _stringify(evtMessage, true);\n        }\n        if (theEvent[\"filename\"]) {\n            evtMessage = evtMessage + \" @\" + (theEvent[\"filename\"] || \"\") + \":\" + (theEvent[\"lineno\"] || \"?\") + \":\" + (theEvent[\"colno\"] || \"?\");\n        }\n    }\n    if (errorType && errorType !== \"String\" && errorType !== \"Object\" && errorType !== \"Error\" && (evtMessage || \"\")[_DYN_INDEX_OF$1 ](errorType) === -1) {\n        evtMessage = errorType + \": \" + evtMessage;\n    }\n    return evtMessage || \"\";\n}\nfunction _isExceptionDetailsInternal(value) {\n    try {\n        if (isObject(value)) {\n            return \"hasFullStack\" in value && \"typeName\" in value;\n        }\n    }\n    catch (e) {\n    }\n    return false;\n}\nfunction _isExceptionInternal(value) {\n    try {\n        if (isObject(value)) {\n            return (\"ver\" in value && \"exceptions\" in value && \"properties\" in value);\n        }\n    }\n    catch (e) {\n    }\n    return false;\n}\nfunction _isStackDetails(details) {\n    return details && details.src && isString(details.src) && details.obj && isArray(details.obj);\n}\nfunction _convertStackObj(errorStack) {\n    var src = errorStack || \"\";\n    if (!isString(src)) {\n        if (isString(src[strStack])) {\n            src = src[strStack];\n        }\n        else {\n            src = \"\" + src;\n        }\n    }\n    var items = src[_DYN_SPLIT ](\"\\n\");\n    return {\n        src: src,\n        obj: items\n    };\n}\nfunction _getOperaStack(errorMessage) {\n    var stack = [];\n    var lines = errorMessage[_DYN_SPLIT ](\"\\n\");\n    for (var lp = 0; lp < lines[_DYN_LENGTH$4 ]; lp++) {\n        var entry = lines[lp];\n        if (lines[lp + 1]) {\n            entry += \"@\" + lines[lp + 1];\n            lp++;\n        }\n        stack.push(entry);\n    }\n    return {\n        src: errorMessage,\n        obj: stack\n    };\n}\nfunction _getStackFromErrorObj(errorObj) {\n    var details = null;\n    if (errorObj) {\n        try {\n            if (errorObj[strStack]) {\n                details = _convertStackObj(errorObj[strStack]);\n            }\n            else if (errorObj[strError] && errorObj[strError][strStack]) {\n                details = _convertStackObj(errorObj[strError][strStack]);\n            }\n            else if (errorObj[\"exception\"] && errorObj.exception[strStack]) {\n                details = _convertStackObj(errorObj.exception[strStack]);\n            }\n            else if (_isStackDetails(errorObj)) {\n                details = errorObj;\n            }\n            else if (_isStackDetails(errorObj[strStackDetails])) {\n                details = errorObj[strStackDetails];\n            }\n            else if (window && window[\"opera\"] && errorObj[strMessage]) {\n                details = _getOperaStack(errorObj[_DYN_MESSAGE$1 ]);\n            }\n            else if (errorObj[\"reason\"] && errorObj.reason[strStack]) {\n                details = _convertStackObj(errorObj.reason[strStack]);\n            }\n            else if (isString(errorObj)) {\n                details = _convertStackObj(errorObj);\n            }\n            else {\n                var evtMessage = errorObj[strMessage] || errorObj[strDescription] || \"\";\n                if (isString(errorObj[strErrorSrc])) {\n                    if (evtMessage) {\n                        evtMessage += \"\\n\";\n                    }\n                    evtMessage += \" from \" + errorObj[strErrorSrc];\n                }\n                if (evtMessage) {\n                    details = _convertStackObj(evtMessage);\n                }\n            }\n        }\n        catch (e) {\n            details = _convertStackObj(e);\n        }\n    }\n    return details || {\n        src: \"\",\n        obj: null\n    };\n}\nfunction _formatStackTrace(stackDetails) {\n    var stack = \"\";\n    if (stackDetails) {\n        if (stackDetails.obj) {\n            arrForEach(stackDetails.obj, function (entry) {\n                stack += entry + \"\\n\";\n            });\n        }\n        else {\n            stack = stackDetails.src || \"\";\n        }\n    }\n    return stack;\n}\nfunction _parseStack(stack) {\n    var parsedStack;\n    var frames = stack.obj;\n    if (frames && frames[_DYN_LENGTH$4 ] > 0) {\n        parsedStack = [];\n        var level_1 = 0;\n        var totalSizeInBytes_1 = 0;\n        arrForEach(frames, function (frame) {\n            var theFrame = frame[_DYN_TO_STRING$2 ]();\n            if (_StackFrame.regex.test(theFrame)) {\n                var parsedFrame = new _StackFrame(theFrame, level_1++);\n                totalSizeInBytes_1 += parsedFrame[_DYN_SIZE_IN_BYTES ];\n                parsedStack.push(parsedFrame);\n            }\n        });\n        var exceptionParsedStackThreshold = 32 * 1024;\n        if (totalSizeInBytes_1 > exceptionParsedStackThreshold) {\n            var left = 0;\n            var right = parsedStack[_DYN_LENGTH$4 ] - 1;\n            var size = 0;\n            var acceptedLeft = left;\n            var acceptedRight = right;\n            while (left < right) {\n                var lSize = parsedStack[left][_DYN_SIZE_IN_BYTES ];\n                var rSize = parsedStack[right][_DYN_SIZE_IN_BYTES ];\n                size += lSize + rSize;\n                if (size > exceptionParsedStackThreshold) {\n                    var howMany = acceptedRight - acceptedLeft + 1;\n                    parsedStack.splice(acceptedLeft, howMany);\n                    break;\n                }\n                acceptedLeft = left;\n                acceptedRight = right;\n                left++;\n                right--;\n            }\n        }\n    }\n    return parsedStack;\n}\nfunction _getErrorType(errorType) {\n    var typeName = \"\";\n    if (errorType) {\n        typeName = errorType.typeName || errorType[_DYN_NAME$2 ] || \"\";\n        if (!typeName) {\n            try {\n                var funcNameRegex = /function (.{1,200})\\(/;\n                var results = (funcNameRegex).exec((errorType).constructor[_DYN_TO_STRING$2 ]());\n                typeName = (results && results[_DYN_LENGTH$4 ] > 1) ? results[1] : \"\";\n            }\n            catch (e) {\n            }\n        }\n    }\n    return typeName;\n}\nfunction _formatErrorCode(errorObj) {\n    if (errorObj) {\n        try {\n            if (!isString(errorObj)) {\n                var errorType = _getErrorType(errorObj);\n                var result = _stringify(errorObj, false);\n                if (!result || result === \"{}\") {\n                    if (errorObj[strError]) {\n                        errorObj = errorObj[strError];\n                        errorType = _getErrorType(errorObj);\n                    }\n                    result = _stringify(errorObj, true);\n                }\n                if (result[_DYN_INDEX_OF$1 ](errorType) !== 0 && errorType !== \"String\") {\n                    return errorType + \":\" + result;\n                }\n                return result;\n            }\n        }\n        catch (e) {\n        }\n    }\n    return \"\" + (errorObj || \"\");\n}\nvar Exception = /** @class */ (function () {\n    function Exception(logger, exception, properties, measurements, severityLevel, id) {\n        this.aiDataContract = {\n            ver: 1 ,\n            exceptions: 1 ,\n            severityLevel: 0 ,\n            properties: 0 ,\n            measurements: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        if (!_isExceptionInternal(exception)) {\n            if (!properties) {\n                properties = {};\n            }\n            _self[_DYN_EXCEPTIONS ] = [new _ExceptionDetails(logger, exception, properties)];\n            _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n            if (severityLevel) {\n                _self[_DYN_SEVERITY_LEVEL ] = severityLevel;\n            }\n            if (id) {\n                _self.id = id;\n            }\n        }\n        else {\n            _self[_DYN_EXCEPTIONS ] = exception[_DYN_EXCEPTIONS ] || [];\n            _self[_DYN_PROPERTIES ] = exception[_DYN_PROPERTIES ];\n            _self[_DYN_MEASUREMENTS$1 ] = exception[_DYN_MEASUREMENTS$1 ];\n            if (exception[_DYN_SEVERITY_LEVEL ]) {\n                _self[_DYN_SEVERITY_LEVEL ] = exception[_DYN_SEVERITY_LEVEL ];\n            }\n            if (exception.id) {\n                _self.id = exception.id;\n            }\n            if (exception[_DYN_PROBLEM_GROUP ]) {\n                _self[_DYN_PROBLEM_GROUP ] = exception[_DYN_PROBLEM_GROUP ];\n            }\n            if (!isNullOrUndefined(exception[_DYN_IS_MANUAL ])) {\n                _self[_DYN_IS_MANUAL ] = exception[_DYN_IS_MANUAL ];\n            }\n        }\n    }\n    Exception.CreateAutoException = function (message, url, lineNumber, columnNumber, error, evt, stack, errorSrc) {\n        var _a;\n        var errorType = _getErrorType(error || evt || message);\n        return _a = {},\n            _a[_DYN_MESSAGE$1 ] = _formatMessage(message, errorType),\n            _a.url = url,\n            _a.lineNumber = lineNumber,\n            _a.columnNumber = columnNumber,\n            _a.error = _formatErrorCode(error || evt || message),\n            _a.evt = _formatErrorCode(evt || message),\n            _a[_DYN_TYPE_NAME ] = errorType,\n            _a.stackDetails = _getStackFromErrorObj(stack || error || evt),\n            _a.errorSrc = errorSrc,\n            _a;\n    };\n    Exception.CreateFromInterface = function (logger, exception, properties, measurements) {\n        var exceptions = exception[_DYN_EXCEPTIONS ]\n            && arrMap(exception[_DYN_EXCEPTIONS ], function (ex) { return _ExceptionDetails[_DYN__CREATE_FROM_INTERFA1 ](logger, ex); });\n        var exceptionData = new Exception(logger, __assignFn(__assignFn({}, exception), { exceptions: exceptions }), properties, measurements);\n        return exceptionData;\n    };\n    Exception.prototype.toInterface = function () {\n        var _a;\n        var _b = this, exceptions = _b.exceptions, properties = _b.properties, measurements = _b.measurements, severityLevel = _b.severityLevel, problemGroup = _b.problemGroup, id = _b.id, isManual = _b.isManual;\n        var exceptionDetailsInterface = exceptions instanceof Array\n            && arrMap(exceptions, function (exception) { return exception.toInterface(); })\n            || undefined;\n        return _a = {\n                ver: \"4.0\"\n            },\n            _a[_DYN_EXCEPTIONS ] = exceptionDetailsInterface,\n            _a.severityLevel = severityLevel,\n            _a.properties = properties,\n            _a.measurements = measurements,\n            _a.problemGroup = problemGroup,\n            _a.id = id,\n            _a.isManual = isManual,\n            _a;\n    };\n    Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n        var _a;\n        return {\n            exceptions: [\n                (_a = {},\n                    _a[_DYN_HAS_FULL_STACK ] = true,\n                    _a.message = message,\n                    _a.stack = details,\n                    _a.typeName = typeName,\n                    _a)\n            ]\n        };\n    };\n    Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n    Exception.dataType = \"ExceptionData\";\n    Exception.formatError = _formatErrorCode;\n    return Exception;\n}());\nvar _ExceptionDetails = /** @class */ (function () {\n    function _ExceptionDetails(logger, exception, properties) {\n        this.aiDataContract = {\n            id: 0 ,\n            outerId: 0 ,\n            typeName: 1 ,\n            message: 1 ,\n            hasFullStack: 0 ,\n            stack: 0 ,\n            parsedStack: 2\n        };\n        var _self = this;\n        if (!_isExceptionDetailsInternal(exception)) {\n            var error = exception;\n            var evt = error && error.evt;\n            if (!isError(error)) {\n                error = error[strError] || evt || error;\n            }\n            _self[_DYN_TYPE_NAME ] = dataSanitizeString(logger, _getErrorType(error)) || strNotSpecified;\n            _self[_DYN_MESSAGE$1 ] = dataSanitizeMessage(logger, _formatMessage(exception || error, _self[_DYN_TYPE_NAME ])) || strNotSpecified;\n            var stack = exception[strStackDetails] || _getStackFromErrorObj(exception);\n            _self[_DYN_PARSED_STACK ] = _parseStack(stack);\n            if (isArray(_self[_DYN_PARSED_STACK ])) {\n                arrMap(_self[_DYN_PARSED_STACK ], function (frame) {\n                    frame[_DYN_ASSEMBLY ] = dataSanitizeString(logger, frame[_DYN_ASSEMBLY ]);\n                    frame[_DYN_FILE_NAME ] = dataSanitizeString(logger, frame[_DYN_FILE_NAME ]);\n                });\n            }\n            _self[strStack] = dataSanitizeException(logger, _formatStackTrace(stack));\n            _self.hasFullStack = isArray(_self.parsedStack) && _self.parsedStack[_DYN_LENGTH$4 ] > 0;\n            if (properties) {\n                properties[_DYN_TYPE_NAME ] = properties[_DYN_TYPE_NAME ] || _self[_DYN_TYPE_NAME ];\n            }\n        }\n        else {\n            _self[_DYN_TYPE_NAME ] = exception[_DYN_TYPE_NAME ];\n            _self[_DYN_MESSAGE$1 ] = exception[_DYN_MESSAGE$1 ];\n            _self[strStack] = exception[strStack];\n            _self[_DYN_PARSED_STACK ] = exception[_DYN_PARSED_STACK ] || [];\n            _self[_DYN_HAS_FULL_STACK ] = exception[_DYN_HAS_FULL_STACK ];\n        }\n    }\n    _ExceptionDetails.prototype.toInterface = function () {\n        var _a;\n        var _self = this;\n        var parsedStack = _self[_DYN_PARSED_STACK ] instanceof Array\n            && arrMap(_self[_DYN_PARSED_STACK ], function (frame) { return frame.toInterface(); });\n        var exceptionDetailsInterface = (_a = {\n                id: _self.id,\n                outerId: _self.outerId,\n                typeName: _self[_DYN_TYPE_NAME ],\n                message: _self[_DYN_MESSAGE$1 ],\n                hasFullStack: _self[_DYN_HAS_FULL_STACK ],\n                stack: _self[strStack]\n            },\n            _a[_DYN_PARSED_STACK ] = parsedStack || undefined,\n            _a);\n        return exceptionDetailsInterface;\n    };\n    _ExceptionDetails.CreateFromInterface = function (logger, exception) {\n        var parsedStack = (exception[_DYN_PARSED_STACK ] instanceof Array\n            && arrMap(exception[_DYN_PARSED_STACK ], function (frame) { return _StackFrame[_DYN__CREATE_FROM_INTERFA1 ](frame); }))\n            || exception[_DYN_PARSED_STACK ];\n        var exceptionDetails = new _ExceptionDetails(logger, __assignFn(__assignFn({}, exception), { parsedStack: parsedStack }));\n        return exceptionDetails;\n    };\n    return _ExceptionDetails;\n}());\nvar _StackFrame = /** @class */ (function () {\n    function _StackFrame(sourceFrame, level) {\n        this.aiDataContract = {\n            level: 1 ,\n            method: 1 ,\n            assembly: 0 ,\n            fileName: 0 ,\n            line: 0\n        };\n        var _self = this;\n        _self[_DYN_SIZE_IN_BYTES ] = 0;\n        if (typeof sourceFrame === \"string\") {\n            var frame = sourceFrame;\n            _self[_DYN_LEVEL ] = level;\n            _self[_DYN_METHOD$1 ] = NoMethod;\n            _self[_DYN_ASSEMBLY ] = strTrim(frame);\n            _self[_DYN_FILE_NAME ] = \"\";\n            _self[_DYN_LINE ] = 0;\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches[_DYN_LENGTH$4 ] >= 5) {\n                _self[_DYN_METHOD$1 ] = strTrim(matches[2]) || _self[_DYN_METHOD$1 ];\n                _self[_DYN_FILE_NAME ] = strTrim(matches[4]);\n                _self[_DYN_LINE ] = parseInt(matches[5]) || 0;\n            }\n        }\n        else {\n            _self[_DYN_LEVEL ] = sourceFrame[_DYN_LEVEL ];\n            _self[_DYN_METHOD$1 ] = sourceFrame[_DYN_METHOD$1 ];\n            _self[_DYN_ASSEMBLY ] = sourceFrame[_DYN_ASSEMBLY ];\n            _self[_DYN_FILE_NAME ] = sourceFrame[_DYN_FILE_NAME ];\n            _self[_DYN_LINE ] = sourceFrame[_DYN_LINE ];\n            _self[_DYN_SIZE_IN_BYTES ] = 0;\n        }\n        _self.sizeInBytes += _self.method[_DYN_LENGTH$4 ];\n        _self.sizeInBytes += _self.fileName[_DYN_LENGTH$4 ];\n        _self.sizeInBytes += _self.assembly[_DYN_LENGTH$4 ];\n        _self[_DYN_SIZE_IN_BYTES ] += _StackFrame.baseSize;\n        _self.sizeInBytes += _self.level.toString()[_DYN_LENGTH$4 ];\n        _self.sizeInBytes += _self.line.toString()[_DYN_LENGTH$4 ];\n    }\n    _StackFrame.CreateFromInterface = function (frame) {\n        return new _StackFrame(frame, null );\n    };\n    _StackFrame.prototype.toInterface = function () {\n        var _self = this;\n        return {\n            level: _self[_DYN_LEVEL ],\n            method: _self[_DYN_METHOD$1 ],\n            assembly: _self[_DYN_ASSEMBLY ],\n            fileName: _self[_DYN_FILE_NAME ],\n            line: _self[_DYN_LINE ]\n        };\n    };\n    _StackFrame.regex = /^([\\s]+at)?[\\s]{0,50}([^\\@\\()]+?)[\\s]{0,50}(\\@|\\()([^\\(\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n    _StackFrame.baseSize = 58;\n    return _StackFrame;\n}());\n\nvar DataPoint = /** @class */ (function () {\n    function DataPoint() {\n        this.aiDataContract = {\n            name: 1 ,\n            kind: 0 ,\n            value: 1 ,\n            count: 0 ,\n            min: 0 ,\n            max: 0 ,\n            stdDev: 0\n        };\n        this.kind = 0 ;\n    }\n    return DataPoint;\n}());\n\nvar Metric = /** @class */ (function () {\n    function Metric(logger, name, value, count, min, max, stdDev, properties, measurements) {\n        this.aiDataContract = {\n            ver: 1 ,\n            metrics: 1 ,\n            properties: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        var dataPoint = new DataPoint();\n        dataPoint[_DYN_COUNT$1 ] = count > 0 ? count : undefined;\n        dataPoint.max = isNaN(max) || max === null ? undefined : max;\n        dataPoint.min = isNaN(min) || min === null ? undefined : min;\n        dataPoint[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        dataPoint.value = value;\n        dataPoint.stdDev = isNaN(stdDev) || stdDev === null ? undefined : stdDev;\n        _self.metrics = [dataPoint];\n        _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n    Metric.dataType = \"MetricData\";\n    return Metric;\n}());\n\nvar PageView = /** @class */ (function () {\n    function PageView(logger, name, url, durationMs, properties, measurements, id) {\n        this.aiDataContract = {\n            ver: 1 ,\n            name: 0 ,\n            url: 0 ,\n            duration: 0 ,\n            properties: 0 ,\n            measurements: 0 ,\n            id: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self.id = dataSanitizeId(logger, id);\n        _self.url = dataSanitizeUrl(logger, url);\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        if (!isNaN(durationMs)) {\n            _self[_DYN_DURATION$1 ] = msToTimeSpan(durationMs);\n        }\n        _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n    PageView.dataType = \"PageviewData\";\n    return PageView;\n}());\n\nvar RemoteDependencyData = /** @class */ (function () {\n    function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, requestAPI, correlationContext, properties, measurements) {\n        if (requestAPI === void 0) { requestAPI = \"Ajax\"; }\n        this.aiDataContract = {\n            id: 1 ,\n            ver: 1 ,\n            name: 0 ,\n            resultCode: 0 ,\n            duration: 0 ,\n            success: 0 ,\n            data: 0 ,\n            target: 0 ,\n            type: 0 ,\n            properties: 0 ,\n            measurements: 0 ,\n            kind: 0 ,\n            value: 0 ,\n            count: 0 ,\n            min: 0 ,\n            max: 0 ,\n            stdDev: 0 ,\n            dependencyKind: 0 ,\n            dependencySource: 0 ,\n            commandName: 0 ,\n            dependencyTypeName: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self.id = id;\n        _self[_DYN_DURATION$1 ] = msToTimeSpan(value);\n        _self.success = success;\n        _self.resultCode = resultCode + \"\";\n        _self.type = dataSanitizeString(logger, requestAPI);\n        var dependencyFields = AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName);\n        _self.data = dataSanitizeUrl(logger, commandName) || dependencyFields.data;\n        _self.target = dataSanitizeString(logger, dependencyFields.target);\n        if (correlationContext) {\n            _self.target = \"\".concat(_self.target, \" | \").concat(correlationContext);\n        }\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, dependencyFields[_DYN_NAME$2 ]);\n        _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n    RemoteDependencyData.dataType = \"RemoteDependencyData\";\n    return RemoteDependencyData;\n}());\n\nvar Trace = /** @class */ (function () {\n    function Trace(logger, message, severityLevel, properties, measurements) {\n        this.aiDataContract = {\n            ver: 1 ,\n            message: 1 ,\n            severityLevel: 0 ,\n            properties: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        message = message || strNotSpecified;\n        _self[_DYN_MESSAGE$1 ] = dataSanitizeMessage(logger, message);\n        _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        if (severityLevel) {\n            _self[_DYN_SEVERITY_LEVEL ] = severityLevel;\n        }\n    }\n    Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n    Trace.dataType = \"MessageData\";\n    return Trace;\n}());\n\nvar PageViewPerformance = /** @class */ (function () {\n    function PageViewPerformance(logger, name, url, unused, properties, measurements, cs4BaseData) {\n        this.aiDataContract = {\n            ver: 1 ,\n            name: 0 ,\n            url: 0 ,\n            duration: 0 ,\n            perfTotal: 0 ,\n            networkConnect: 0 ,\n            sentRequest: 0 ,\n            receivedResponse: 0 ,\n            domProcessing: 0 ,\n            properties: 0 ,\n            measurements: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self.url = dataSanitizeUrl(logger, url);\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        if (cs4BaseData) {\n            _self.domProcessing = cs4BaseData.domProcessing;\n            _self[_DYN_DURATION$1 ] = cs4BaseData[_DYN_DURATION$1 ];\n            _self.networkConnect = cs4BaseData.networkConnect;\n            _self.perfTotal = cs4BaseData.perfTotal;\n            _self[_DYN_RECEIVED_RESPONSE ] = cs4BaseData[_DYN_RECEIVED_RESPONSE ];\n            _self.sentRequest = cs4BaseData.sentRequest;\n        }\n    }\n    PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n    PageViewPerformance.dataType = \"PageviewPerformanceData\";\n    return PageViewPerformance;\n}());\n\nvar Data = /** @class */ (function () {\n    function Data(baseType, data) {\n        this.aiDataContract = {\n            baseType: 1 ,\n            baseData: 1\n        };\n        this.baseType = baseType;\n        this.baseData = data;\n    }\n    return Data;\n}());\n\nvar SeverityLevel = createEnumStyle({\n    Verbose: 0 ,\n    Information: 1 ,\n    Warning: 2 ,\n    Error: 3 ,\n    Critical: 4\n});\n\nvar ConfigurationManager = /** @class */ (function () {\n    function ConfigurationManager() {\n    }\n    ConfigurationManager.getConfig = function (config, field, identifier, defaultValue) {\n        if (defaultValue === void 0) { defaultValue = false; }\n        var configValue;\n        if (identifier && config[_DYN_EXTENSION_CONFIG ] && config[_DYN_EXTENSION_CONFIG ][identifier] && !isNullOrUndefined(config[_DYN_EXTENSION_CONFIG ][identifier][field])) {\n            configValue = config[_DYN_EXTENSION_CONFIG ][identifier][field];\n        }\n        else {\n            configValue = config[field];\n        }\n        return !isNullOrUndefined(configValue) ? configValue : defaultValue;\n    };\n    return ConfigurationManager;\n}());\n\nfunction _aiNameFunc(baseName) {\n    var aiName = \"ai.\" + baseName + \".\";\n    return function (name) {\n        return aiName + name;\n    };\n}\nvar _aiApplication = _aiNameFunc(\"application\");\nvar _aiDevice = _aiNameFunc(\"device\");\nvar _aiLocation = _aiNameFunc(\"location\");\nvar _aiOperation = _aiNameFunc(\"operation\");\nvar _aiSession = _aiNameFunc(\"session\");\nvar _aiUser = _aiNameFunc(\"user\");\nvar _aiCloud = _aiNameFunc(\"cloud\");\nvar _aiInternal = _aiNameFunc(\"internal\");\nvar ContextTagKeys = /** @class */ (function (_super) {\n    __extendsFn(ContextTagKeys, _super);\n    function ContextTagKeys() {\n        return _super.call(this) || this;\n    }\n    return ContextTagKeys;\n}(createClassFromInterface({\n    applicationVersion: _aiApplication(\"ver\"),\n    applicationBuild: _aiApplication(\"build\"),\n    applicationTypeId: _aiApplication(\"typeId\"),\n    applicationId: _aiApplication(\"applicationId\"),\n    applicationLayer: _aiApplication(\"layer\"),\n    deviceId: _aiDevice(\"id\"),\n    deviceIp: _aiDevice(\"ip\"),\n    deviceLanguage: _aiDevice(\"language\"),\n    deviceLocale: _aiDevice(\"locale\"),\n    deviceModel: _aiDevice(\"model\"),\n    deviceFriendlyName: _aiDevice(\"friendlyName\"),\n    deviceNetwork: _aiDevice(\"network\"),\n    deviceNetworkName: _aiDevice(\"networkName\"),\n    deviceOEMName: _aiDevice(\"oemName\"),\n    deviceOS: _aiDevice(\"os\"),\n    deviceOSVersion: _aiDevice(\"osVersion\"),\n    deviceRoleInstance: _aiDevice(\"roleInstance\"),\n    deviceRoleName: _aiDevice(\"roleName\"),\n    deviceScreenResolution: _aiDevice(\"screenResolution\"),\n    deviceType: _aiDevice(\"type\"),\n    deviceMachineName: _aiDevice(\"machineName\"),\n    deviceVMName: _aiDevice(\"vmName\"),\n    deviceBrowser: _aiDevice(\"browser\"),\n    deviceBrowserVersion: _aiDevice(\"browserVersion\"),\n    locationIp: _aiLocation(\"ip\"),\n    locationCountry: _aiLocation(\"country\"),\n    locationProvince: _aiLocation(\"province\"),\n    locationCity: _aiLocation(\"city\"),\n    operationId: _aiOperation(\"id\"),\n    operationName: _aiOperation(\"name\"),\n    operationParentId: _aiOperation(\"parentId\"),\n    operationRootId: _aiOperation(\"rootId\"),\n    operationSyntheticSource: _aiOperation(\"syntheticSource\"),\n    operationCorrelationVector: _aiOperation(\"correlationVector\"),\n    sessionId: _aiSession(\"id\"),\n    sessionIsFirst: _aiSession(\"isFirst\"),\n    sessionIsNew: _aiSession(\"isNew\"),\n    userAccountAcquisitionDate: _aiUser(\"accountAcquisitionDate\"),\n    userAccountId: _aiUser(\"accountId\"),\n    userAgent: _aiUser(\"userAgent\"),\n    userId: _aiUser(\"id\"),\n    userStoreRegion: _aiUser(\"storeRegion\"),\n    userAuthUserId: _aiUser(\"authUserId\"),\n    userAnonymousUserAcquisitionDate: _aiUser(\"anonUserAcquisitionDate\"),\n    userAuthenticatedUserAcquisitionDate: _aiUser(\"authUserAcquisitionDate\"),\n    cloudName: _aiCloud(\"name\"),\n    cloudRole: _aiCloud(\"role\"),\n    cloudRoleVer: _aiCloud(\"roleVer\"),\n    cloudRoleInstance: _aiCloud(\"roleInstance\"),\n    cloudEnvironment: _aiCloud(\"environment\"),\n    cloudLocation: _aiCloud(\"location\"),\n    cloudDeploymentUnit: _aiCloud(\"deploymentUnit\"),\n    internalNodeName: _aiInternal(\"nodeName\"),\n    internalSdkVersion: _aiInternal(\"sdkVersion\"),\n    internalAgentVersion: _aiInternal(\"agentVersion\"),\n    internalSnippet: _aiInternal(\"snippet\"),\n    internalSdkSrc: _aiInternal(\"sdkSrc\")\n})));\n\nfunction createTelemetryItem(item, baseType, envelopeName, logger, customProperties, systemProperties) {\n    var _a;\n    envelopeName = dataSanitizeString(logger, envelopeName) || strNotSpecified;\n    if (isNullOrUndefined(item) ||\n        isNullOrUndefined(baseType) ||\n        isNullOrUndefined(envelopeName)) {\n        throwError(\"Input doesn't contain all required fields\");\n    }\n    var iKey = \"\";\n    if (item[strIkey]) {\n        iKey = item[strIkey];\n        delete item[strIkey];\n    }\n    var telemetryItem = (_a = {},\n        _a[_DYN_NAME$2 ] = envelopeName,\n        _a.time = toISOString(new Date()),\n        _a.iKey = iKey,\n        _a.ext = systemProperties ? systemProperties : {},\n        _a.tags = [],\n        _a.data = {},\n        _a.baseType = baseType,\n        _a.baseData = item\n    ,\n        _a);\n    if (!isNullOrUndefined(customProperties)) {\n        objForEachKey(customProperties, function (prop, value) {\n            telemetryItem.data[prop] = value;\n        });\n    }\n    return telemetryItem;\n}\nvar TelemetryItemCreator = /** @class */ (function () {\n    function TelemetryItemCreator() {\n    }\n    TelemetryItemCreator.create = createTelemetryItem;\n    return TelemetryItemCreator;\n}());\n\nvar Extensions = {\n    UserExt: \"user\",\n    DeviceExt: \"device\",\n    TraceExt: \"trace\",\n    WebExt: \"web\",\n    AppExt: \"app\",\n    OSExt: \"os\",\n    SessionExt: \"ses\",\n    SDKExt: \"sdk\"\n};\nvar CtxTagKeys = new ContextTagKeys();\n\nvar PropertiesPluginIdentifier = \"AppInsightsPropertiesPlugin\";\nvar BreezeChannelIdentifier = \"AppInsightsChannelPlugin\";\nvar AnalyticsPluginIdentifier = \"ApplicationInsightsAnalytics\";\n\nvar STR_DURATION$1 = \"duration\";\nvar STR_PROPERTIES = \"properties\";\n\nvar _DYN_REQUEST_URL = \"requestUrl\";\nvar _DYN_INST = \"inst\";\nvar _DYN_LENGTH$3 = \"length\";\nvar _DYN_TRACE_ID$1 = \"traceID\";\nvar _DYN_SPAN_ID = \"spanID\";\nvar _DYN_TRACE_FLAGS = \"traceFlags\";\nvar _DYN_CONTEXT$1 = \"context\";\nvar _DYN_ABORTED = \"aborted\";\nvar _DYN_TRACE_ID0 = \"traceId\";\nvar _DYN_SPAN_ID1 = \"spanId\";\nvar _DYN_CORE$1 = \"core\";\nvar _DYN_INCLUDE_CORRELATION_2 = \"includeCorrelationHeaders\";\nvar _DYN_CAN_INCLUDE_CORRELAT3 = \"canIncludeCorrelationHeader\";\nvar _DYN_GET_ABSOLUTE_URL = \"getAbsoluteUrl\";\nvar _DYN_HEADERS = \"headers\";\nvar _DYN_REQUEST_HEADERS = \"requestHeaders\";\nvar _DYN_APP_ID = \"appId\";\nvar _DYN_SET_REQUEST_HEADER$1 = \"setRequestHeader\";\nvar _DYN_TRACK_DEPENDENCY_DAT4 = \"trackDependencyDataInternal\";\nvar _DYN_DISTRIBUTED_TRACING_5 = \"distributedTracingMode\";\nvar _DYN_START_TIME = \"startTime\";\nvar _DYN_TO_LOWER_CASE = \"toLowerCase\";\nvar _DYN_ENABLE_REQUEST_HEADE6 = \"enableRequestHeaderTracking\";\nvar _DYN_ENABLE_AJAX_ERROR_ST7 = \"enableAjaxErrorStatusText\";\nvar _DYN_ENABLE_AJAX_PERF_TRA8 = \"enableAjaxPerfTracking\";\nvar _DYN_MAX_AJAX_CALLS_PER_V9 = \"maxAjaxCallsPerView\";\nvar _DYN_ENABLE_RESPONSE_HEAD10 = \"enableResponseHeaderTracking\";\nvar _DYN_EXCLUDE_REQUEST_FROM11 = \"excludeRequestFromAutoTrackingPatterns\";\nvar _DYN_ADD_REQUEST_CONTEXT = \"addRequestContext\";\nvar _DYN_DISABLE_AJAX_TRACKIN12 = \"disableAjaxTracking\";\nvar _DYN_DISABLE_FETCH_TRACKI13 = \"disableFetchTracking\";\nvar _DYN_STATUS = \"status\";\nvar _DYN_STATUS_TEXT = \"statusText\";\nvar _DYN_HEADER_MAP = \"headerMap\";\nvar _DYN_OPEN_DONE = \"openDone\";\nvar _DYN_SEND_DONE = \"sendDone\";\nvar _DYN_REQUEST_SENT_TIME = \"requestSentTime\";\nvar _DYN_ABORT_DONE = \"abortDone\";\nvar _DYN_GET_TRACE_ID = \"getTraceId\";\nvar _DYN_GET_TRACE_FLAGS = \"getTraceFlags\";\nvar _DYN_METHOD = \"method\";\nvar _DYN_ERROR_STATUS_TEXT = \"errorStatusText\";\nvar _DYN_STATE_CHANGE_ATTACHE14 = \"stateChangeAttached\";\nvar _DYN_RESPONSE_TEXT = \"responseText\";\nvar _DYN_RESPONSE_FINISHED_TI15 = \"responseFinishedTime\";\nvar _DYN__CREATE_TRACK_ITEM = \"CreateTrackItem\";\nvar _DYN_RESPONSE = \"response\";\nvar _DYN_GET_ALL_RESPONSE_HEA16 = \"getAllResponseHeaders\";\nvar _DYN_GET_PART_APROPS = \"getPartAProps\";\nvar _DYN_GET_CORRELATION_CONT17 = \"getCorrelationContext\";\nvar _DYN_PERF_MARK = \"perfMark\";\nvar _DYN_AJAX_PERF_LOOKUP_DEL18 = \"ajaxPerfLookupDelay\";\nvar _DYN_NAME$1 = \"name\";\nvar _DYN_PERF_TIMING = \"perfTiming\";\nvar _DYN_CORRELATION_CONTEXT = \"correlationContext\";\nvar _DYN_AJAX_TOTAL_DURATION = \"ajaxTotalDuration\";\nvar _DYN_EVENT_TRACE_CTX = \"eventTraceCtx\";\n\nfunction _calcPerfDuration(resourceEntry, start, end) {\n    var result = 0;\n    var from = resourceEntry[start];\n    var to = resourceEntry[end];\n    if (from && to) {\n        result = dateTimeUtilsDuration(from, to);\n    }\n    return result;\n}\nfunction _setPerfDuration(props, name, resourceEntry, start, end) {\n    var result = 0;\n    var value = _calcPerfDuration(resourceEntry, start, end);\n    if (value) {\n        result = _setPerfValue(props, name, msToTimeSpan(value));\n    }\n    return result;\n}\nfunction _setPerfValue(props, name, value) {\n    var strPerf = \"ajaxPerf\";\n    var result = 0;\n    if (props && name && value) {\n        var perfData = props[strPerf] = (props[strPerf] || {});\n        perfData[name] = value;\n        result = 1;\n    }\n    return result;\n}\nfunction _populatePerfData(ajaxData, dependency) {\n    var resourceEntry = ajaxData[_DYN_PERF_TIMING ];\n    var props = dependency[STR_PROPERTIES ] || {};\n    var propsSet = 0;\n    var strName = \"name\";\n    var strStart = \"Start\";\n    var strEnd = \"End\";\n    var strDomainLookup = \"domainLookup\";\n    var strConnect = \"connect\";\n    var strRedirect = \"redirect\";\n    var strRequest = \"request\";\n    var strResponse = \"response\";\n    var strStartTime = \"startTime\";\n    var strDomainLookupStart = strDomainLookup + strStart;\n    var strDomainLookupEnd = strDomainLookup + strEnd;\n    var strConnectStart = strConnect + strStart;\n    var strConnectEnd = strConnect + strEnd;\n    var strRequestStart = strRequest + strStart;\n    var strRequestEnd = strRequest + strEnd;\n    var strResponseStart = strResponse + strStart;\n    var strResponseEnd = strResponse + strEnd;\n    var strRedirectStart = strRedirect + strStart;\n    var strRedirectEnd = strRedirect = strEnd;\n    var strTransferSize = \"transferSize\";\n    var strEncodedBodySize = \"encodedBodySize\";\n    var strDecodedBodySize = \"decodedBodySize\";\n    var strServerTiming = \"serverTiming\";\n    if (resourceEntry) {\n        propsSet |= _setPerfDuration(props, strRedirect, resourceEntry, strRedirectStart, strRedirectEnd);\n        propsSet |= _setPerfDuration(props, strDomainLookup, resourceEntry, strDomainLookupStart, strDomainLookupEnd);\n        propsSet |= _setPerfDuration(props, strConnect, resourceEntry, strConnectStart, strConnectEnd);\n        propsSet |= _setPerfDuration(props, strRequest, resourceEntry, strRequestStart, strRequestEnd);\n        propsSet |= _setPerfDuration(props, strResponse, resourceEntry, strResponseStart, strResponseEnd);\n        propsSet |= _setPerfDuration(props, \"networkConnect\", resourceEntry, strStartTime, strConnectEnd);\n        propsSet |= _setPerfDuration(props, \"sentRequest\", resourceEntry, strRequestStart, strResponseEnd);\n        var duration = resourceEntry[STR_DURATION$1 ];\n        if (!duration) {\n            duration = _calcPerfDuration(resourceEntry, strStartTime, strResponseEnd) || 0;\n        }\n        propsSet |= _setPerfValue(props, STR_DURATION$1, duration);\n        propsSet |= _setPerfValue(props, \"perfTotal\", duration);\n        var serverTiming = resourceEntry[strServerTiming];\n        if (serverTiming) {\n            var server_1 = {};\n            arrForEach(serverTiming, function (value, idx) {\n                var name = normalizeJsName(value[strName] || \"\" + idx);\n                var newValue = server_1[name] || {};\n                objForEachKey(value, function (key, val) {\n                    if (key !== strName && isString(val) || isNumber(val)) {\n                        if (newValue[key]) {\n                            val = newValue[key] + \";\" + val;\n                        }\n                        if (val || !isString(val)) {\n                            newValue[key] = val;\n                        }\n                    }\n                });\n                server_1[name] = newValue;\n            });\n            propsSet |= _setPerfValue(props, strServerTiming, server_1);\n        }\n        propsSet |= _setPerfValue(props, strTransferSize, resourceEntry[strTransferSize]);\n        propsSet |= _setPerfValue(props, strEncodedBodySize, resourceEntry[strEncodedBodySize]);\n        propsSet |= _setPerfValue(props, strDecodedBodySize, resourceEntry[strDecodedBodySize]);\n    }\n    else {\n        if (ajaxData[_DYN_PERF_MARK ]) {\n            propsSet |= _setPerfValue(props, \"missing\", ajaxData.perfAttempts);\n        }\n    }\n    if (propsSet) {\n        dependency[STR_PROPERTIES ] = props;\n    }\n}\nvar XHRMonitoringState = /** @class */ (function () {\n    function XHRMonitoringState() {\n        var self = this;\n        self[_DYN_OPEN_DONE ] = false;\n        self.setRequestHeaderDone = false;\n        self[_DYN_SEND_DONE ] = false;\n        self[_DYN_ABORT_DONE ] = false;\n        self[_DYN_STATE_CHANGE_ATTACHE14 ] = false;\n    }\n    return XHRMonitoringState;\n}());\nvar ajaxRecord = /** @class */ (function () {\n    function ajaxRecord(traceId, spanId, logger, traceCtx) {\n        var _a;\n        var self = this;\n        var _logger = logger;\n        var strResponseText = \"responseText\";\n        self[_DYN_PERF_MARK ] = null;\n        self.completed = false;\n        self.requestHeadersSize = null;\n        self[_DYN_REQUEST_HEADERS ] = null;\n        self.responseReceivingDuration = null;\n        self.callbackDuration = null;\n        self[_DYN_AJAX_TOTAL_DURATION ] = null;\n        self[_DYN_ABORTED ] = 0;\n        self.pageUrl = null;\n        self[_DYN_REQUEST_URL ] = null;\n        self.requestSize = 0;\n        self[_DYN_METHOD ] = null;\n        self[_DYN_STATUS ] = null;\n        self[_DYN_REQUEST_SENT_TIME ] = null;\n        self.responseStartedTime = null;\n        self[_DYN_RESPONSE_FINISHED_TI15 ] = null;\n        self.callbackFinishedTime = null;\n        self.endTime = null;\n        self.xhrMonitoringState = new XHRMonitoringState();\n        self.clientFailure = 0;\n        self[_DYN_TRACE_ID$1 ] = traceId;\n        self[_DYN_SPAN_ID ] = spanId;\n        self[_DYN_TRACE_FLAGS ] = traceCtx === null || traceCtx === void 0 ? void 0 : traceCtx.getTraceFlags();\n        if (traceCtx) {\n            self[_DYN_EVENT_TRACE_CTX ] = (_a = {},\n                _a[_DYN_TRACE_ID0 ] = traceCtx[_DYN_GET_TRACE_ID ](),\n                _a[_DYN_SPAN_ID1 ] = traceCtx.getSpanId(),\n                _a[_DYN_TRACE_FLAGS ] = traceCtx[_DYN_GET_TRACE_FLAGS ](),\n                _a);\n        }\n        else {\n            self[_DYN_EVENT_TRACE_CTX ] = null;\n        }\n        dynamicProto(ajaxRecord, self, function (self) {\n            self.getAbsoluteUrl = function () {\n                return self[_DYN_REQUEST_URL ] ? urlGetAbsoluteUrl(self[_DYN_REQUEST_URL ]) : null;\n            };\n            self.getPathName = function () {\n                return self[_DYN_REQUEST_URL ] ? dataSanitizeUrl(_logger, urlGetCompleteUrl(self[_DYN_METHOD ], self[_DYN_REQUEST_URL ])) : null;\n            };\n            self[_DYN__CREATE_TRACK_ITEM ] = function (ajaxType, enableRequestHeaderTracking, getResponse) {\n                var _a;\n                self.ajaxTotalDuration = Math.round(dateTimeUtilsDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n                if (self[_DYN_AJAX_TOTAL_DURATION ] < 0) {\n                    return null;\n                }\n                var dependency = (_a = {\n                        id: \"|\" + self[_DYN_TRACE_ID$1 ] + \".\" + self[_DYN_SPAN_ID ],\n                        target: self[_DYN_GET_ABSOLUTE_URL ]()\n                    },\n                    _a[_DYN_NAME$1 ] = self.getPathName(),\n                    _a.type = ajaxType,\n                    _a[_DYN_START_TIME ] = null,\n                    _a.duration = self[_DYN_AJAX_TOTAL_DURATION ],\n                    _a.success = (+(self[_DYN_STATUS ])) >= 200 && (+(self[_DYN_STATUS ])) < 400,\n                    _a.responseCode = (+(self[_DYN_STATUS ])),\n                    _a[STR_PROPERTIES] = { HttpMethod: self[_DYN_METHOD ] },\n                    _a);\n                var props = dependency[STR_PROPERTIES];\n                if (self[_DYN_ABORTED ]) {\n                    props[_DYN_ABORTED ] = true;\n                }\n                if (self[_DYN_REQUEST_SENT_TIME ]) {\n                    dependency[_DYN_START_TIME ] = new Date();\n                    dependency[_DYN_START_TIME ].setTime(self[_DYN_REQUEST_SENT_TIME ]);\n                }\n                _populatePerfData(self, dependency);\n                if (enableRequestHeaderTracking) {\n                    if (objKeys(self.requestHeaders)[_DYN_LENGTH$3 ] > 0) {\n                        props[_DYN_REQUEST_HEADERS ] = self[_DYN_REQUEST_HEADERS ];\n                    }\n                }\n                if (getResponse) {\n                    var response = getResponse();\n                    if (response) {\n                        var correlationContext = response[_DYN_CORRELATION_CONTEXT ];\n                        if (correlationContext) {\n                            dependency.correlationContext =  correlationContext;\n                        }\n                        if (response[_DYN_HEADER_MAP ]) {\n                            if (objKeys(response.headerMap)[_DYN_LENGTH$3 ] > 0) {\n                                props.responseHeaders = response[_DYN_HEADER_MAP ];\n                            }\n                        }\n                        if (self[_DYN_ERROR_STATUS_TEXT ]) {\n                            if (self[_DYN_STATUS ] >= 400) {\n                                var responseType = response.type;\n                                if (responseType === \"\" || responseType === \"text\") {\n                                    props.responseText = response.responseText ? response[_DYN_STATUS_TEXT ] + \" - \" + response[strResponseText] : response[_DYN_STATUS_TEXT ];\n                                }\n                                if (responseType === \"json\") {\n                                    props.responseText = response.response ? response[_DYN_STATUS_TEXT ] + \" - \" + JSON.stringify(response[_DYN_RESPONSE ]) : response[_DYN_STATUS_TEXT ];\n                                }\n                            }\n                            else if (self[_DYN_STATUS ] === 0) {\n                                props.responseText = response[_DYN_STATUS_TEXT ] || \"\";\n                            }\n                        }\n                    }\n                }\n                return dependency;\n            };\n            self[_DYN_GET_PART_APROPS ] = function () {\n                var _a;\n                var partA = null;\n                var traceCtx = self[_DYN_EVENT_TRACE_CTX ];\n                if (traceCtx && (traceCtx[_DYN_TRACE_ID0 ] || traceCtx[_DYN_SPAN_ID1 ])) {\n                    partA = {};\n                    var traceExt = partA[Extensions.TraceExt] = (_a = {},\n                        _a[_DYN_TRACE_ID$1 ] = traceCtx[_DYN_TRACE_ID0 ],\n                        _a.parentID = traceCtx[_DYN_SPAN_ID1 ],\n                        _a);\n                    if (!isNullOrUndefined(traceCtx[_DYN_TRACE_FLAGS ])) {\n                        traceExt[_DYN_TRACE_FLAGS ] = traceCtx[_DYN_TRACE_FLAGS ];\n                    }\n                }\n                return partA;\n            };\n        });\n    }\n    ajaxRecord.__ieDyn=1;\n    return ajaxRecord;\n}());\n\nvar AJAX_MONITOR_PREFIX = \"ai.ajxmn.\";\nvar strDiagLog = \"diagLog\";\nvar strAjaxData = \"ajaxData\";\nvar STR_FETCH = \"fetch\";\nvar ERROR_HEADER = \"Failed to monitor XMLHttpRequest\";\nvar ERROR_PREFIX = \", monitoring data for this ajax call \";\nvar ERROR_POSTFIX = ERROR_PREFIX + \"may be incorrect.\";\nvar ERROR_NOT_SENT = ERROR_PREFIX + \"won't be sent.\";\nvar CORRELATION_HEADER_ERROR = \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\";\nvar CUSTOM_REQUEST_CONTEXT_ERROR = \"Failed to add custom defined request context as configured call back may missing a null check.\";\nvar FAILED_TO_CALCULATE_DURATION_ERROR = \"Failed to calculate the duration of the \";\nvar _markCount = 0;\nfunction _supportsFetch() {\n    var _global = getGlobal();\n    if (!_global ||\n        isNullOrUndefined(_global.Request) ||\n        isNullOrUndefined(_global.Request[strShimPrototype]) ||\n        isNullOrUndefined(_global[STR_FETCH])) {\n        return null;\n    }\n    return _global[STR_FETCH];\n}\nvar _isWebWorker$1 = null;\nfunction isWebWorker$1() {\n    if (_isWebWorker$1 == null) {\n        try {\n            _isWebWorker$1 = !!(self && self instanceof WorkerGlobalScope);\n        }\n        catch (e) {\n            _isWebWorker$1 = false;\n        }\n    }\n    return _isWebWorker$1;\n}\nfunction _supportsAjaxMonitoring(ajaxMonitorInstance) {\n    var result = false;\n    if (isXhrSupported()) {\n        var proto = XMLHttpRequest[strShimPrototype];\n        result = !isNullOrUndefined(proto) &&\n            !isNullOrUndefined(proto.open) &&\n            !isNullOrUndefined(proto.send) &&\n            !isNullOrUndefined(proto.abort);\n    }\n    var ieVer = getIEVersion();\n    if (ieVer && ieVer < 9) {\n        result = false;\n    }\n    if (result) {\n        try {\n            var xhr = new XMLHttpRequest();\n            xhr[strAjaxData] = {};\n            var theOpen = XMLHttpRequest[strShimPrototype].open;\n            XMLHttpRequest[strShimPrototype].open = theOpen;\n        }\n        catch (e) {\n            result = false;\n            _throwInternalCritical(ajaxMonitorInstance, 15 , \"Failed to enable XMLHttpRequest monitoring, extension is not supported\", {\n                exception: dumpObj(e)\n            });\n        }\n    }\n    return result;\n}\nfunction _getFailedAjaxDiagnosticsMessage(xhr) {\n    var result = \"\";\n    try {\n        if (xhr && xhr[strAjaxData] && xhr[strAjaxData][_DYN_REQUEST_URL ]) {\n            result += \"(url: '\" + xhr[strAjaxData][_DYN_REQUEST_URL ] + \"')\";\n        }\n    }\n    catch (e) {\n    }\n    return result;\n}\nfunction _throwInternalCritical(ajaxMonitorInstance, msgId, message, properties, isUserAct) {\n    _throwInternal(ajaxMonitorInstance[strDiagLog](), 1 , msgId, message, properties, isUserAct);\n}\nfunction _throwInternalWarning(ajaxMonitorInstance, msgId, message, properties, isUserAct) {\n    _throwInternal(ajaxMonitorInstance[strDiagLog](), 2 , msgId, message, properties, isUserAct);\n}\nfunction _createErrorCallbackFunc(ajaxMonitorInstance, internalMessage, message) {\n    return function (args) {\n        _throwInternalCritical(ajaxMonitorInstance, internalMessage, message, {\n            ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(args[_DYN_INST ]),\n            exception: dumpObj(args.err)\n        });\n    };\n}\nfunction _indexOf(value, match) {\n    if (value && match) {\n        return value.indexOf(match);\n    }\n    return -1;\n}\nfunction _addHandler(container, id, theFunc) {\n    var theHandler = {\n        id: id,\n        fn: theFunc\n    };\n    container.push(theHandler);\n    return {\n        remove: function () {\n            arrForEach(container, function (initializer, idx) {\n                if (initializer.id === theHandler.id) {\n                    container.splice(idx, 1);\n                    return -1;\n                }\n            });\n        }\n    };\n}\nfunction _processDependencyContainer(core, container, details, message) {\n    var result = true;\n    arrForEach(container, function (theFunc, idx) {\n        try {\n            if (theFunc.fn.call(null, details) === false) {\n                result = false;\n            }\n        }\n        catch (e) {\n            _throwInternal(core && core.logger, 1 , 64 , \"Dependency \" + message + \" [#\" + idx + \"] failed: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n        }\n    });\n    return result;\n}\nfunction _processDependencyListeners(listeners, core, ajaxData, xhr, input, init) {\n    var initializersCount = listeners[_DYN_LENGTH$3 ];\n    if (initializersCount > 0) {\n        var details = {\n            core: core,\n            xhr: xhr,\n            input: input,\n            init: init,\n            traceId: ajaxData[_DYN_TRACE_ID$1 ],\n            spanId: ajaxData[_DYN_SPAN_ID ],\n            traceFlags: ajaxData[_DYN_TRACE_FLAGS ],\n            context: ajaxData[_DYN_CONTEXT$1 ] || {},\n            aborted: !!ajaxData[_DYN_ABORTED ]\n        };\n        _processDependencyContainer(core, listeners, details, \"listener\");\n        ajaxData[_DYN_TRACE_ID$1 ] = details[_DYN_TRACE_ID0 ];\n        ajaxData[_DYN_SPAN_ID ] = details[_DYN_SPAN_ID1 ];\n        ajaxData[_DYN_TRACE_FLAGS ] = details[_DYN_TRACE_FLAGS ];\n        ajaxData[_DYN_CONTEXT$1 ] = details[_DYN_CONTEXT$1 ];\n    }\n}\nvar BLOB_CORE = \"*.blob.core.\";\nvar DfltAjaxCorrelationHeaderExDomains = deepFreeze([\n    BLOB_CORE + \"windows.net\",\n    BLOB_CORE + \"chinacloudapi.cn\",\n    BLOB_CORE + \"cloudapi.de\",\n    BLOB_CORE + \"usgovcloudapi.net\"\n]);\nvar _internalExcludeEndpoints = [\n    /https:\\/\\/[^\\/]*(\\.pipe\\.aria|aria\\.pipe|events\\.data|collector\\.azure)\\.[^\\/]+\\/(OneCollector\\/1|Collector\\/3)\\.0/i\n];\nfunction _getDefaultConfig$1() {\n    var config = {\n        maxAjaxCallsPerView: 500,\n        disableAjaxTracking: false,\n        disableFetchTracking: false,\n        excludeRequestFromAutoTrackingPatterns: undefined,\n        disableCorrelationHeaders: false,\n        distributedTracingMode: 1 ,\n        correlationHeaderExcludedDomains: DfltAjaxCorrelationHeaderExDomains,\n        correlationHeaderDomains: undefined,\n        correlationHeaderExcludePatterns: undefined,\n        appId: undefined,\n        enableCorsCorrelation: false,\n        enableRequestHeaderTracking: false,\n        enableResponseHeaderTracking: false,\n        enableAjaxErrorStatusText: false,\n        enableAjaxPerfTracking: false,\n        maxAjaxPerfLookupAttempts: 3,\n        ajaxPerfLookupDelay: 25,\n        ignoreHeaders: [\n            \"Authorization\",\n            \"X-API-Key\",\n            \"WWW-Authenticate\"\n        ],\n        addRequestContext: undefined,\n        addIntEndpoints: true\n    };\n    return config;\n}\nfunction _getEmptyConfig() {\n    var emptyConfig = _getDefaultConfig$1();\n    objForEachKey(emptyConfig, function (value) {\n        emptyConfig[value] = undefined;\n    });\n    return emptyConfig;\n}\nvar AjaxMonitor = /** @class */ (function (_super) {\n    __extendsFn(AjaxMonitor, _super);\n    function AjaxMonitor() {\n        var _this = _super.call(this) || this;\n        _this.identifier = AjaxMonitor.identifier;\n        _this.priority = 120;\n        var _fetchInitialized;\n        var _xhrInitialized;\n        var _currentWindowHost;\n        var _config;\n        var _enableRequestHeaderTracking;\n        var _enableAjaxErrorStatusText;\n        var _trackAjaxAttempts;\n        var _context;\n        var _isUsingW3CHeaders;\n        var _isUsingAIHeaders;\n        var _markPrefix;\n        var _enableAjaxPerfTracking;\n        var _maxAjaxCallsPerView;\n        var _enableResponseHeaderTracking;\n        var _disabledUrls;\n        var _disableAjaxTracking;\n        var _disableFetchTracking;\n        var _excludeRequestFromAutoTrackingPatterns;\n        var _addRequestContext;\n        var _evtNamespace;\n        var _dependencyHandlerId;\n        var _dependencyListeners;\n        var _dependencyInitializers;\n        dynamicProto(AjaxMonitor, _this, function (_self, _base) {\n            var _addHook = _base._addHook;\n            _initDefaults();\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                if (!_self.isInitialized()) {\n                    _base.initialize(config, core, extensions, pluginChain);\n                    _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"ajax\"), core && core.evtNamespace && core.evtNamespace());\n                    _populateDefaults(config);\n                    _instrumentXhr();\n                    _instrumentFetch();\n                    _populateContext();\n                }\n            };\n            _self._doTeardown = function () {\n                _initDefaults();\n            };\n            _self.trackDependencyData = function (dependency, properties) {\n                _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE$1 ], null, dependency, properties);\n            };\n            _self[_DYN_INCLUDE_CORRELATION_2 ] = function (ajaxData, input, init, xhr) {\n                var currentWindowHost = _self[\"_currentWindowHost\"] || _currentWindowHost;\n                _processDependencyListeners(_dependencyListeners, _self[_DYN_CORE$1 ], ajaxData, xhr, input, init);\n                if (input) {\n                    if (CorrelationIdHelper[_DYN_CAN_INCLUDE_CORRELAT3 ](_config, ajaxData[_DYN_GET_ABSOLUTE_URL ](), currentWindowHost)) {\n                        if (!init) {\n                            init = {};\n                        }\n                        var headers = new Headers(init[_DYN_HEADERS ] || (input instanceof Request ? (input[_DYN_HEADERS ] || {}) : {}));\n                        if (_isUsingAIHeaders) {\n                            var id = \"|\" + ajaxData[_DYN_TRACE_ID$1 ] + \".\" + ajaxData[_DYN_SPAN_ID ];\n                            headers.set(RequestHeaders[3 ], id);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[3 ]] = id;\n                            }\n                        }\n                        var appId = _config[_DYN_APP_ID ] || (_context && _context[_DYN_APP_ID ]());\n                        if (appId) {\n                            headers.set(RequestHeaders[0 ], RequestHeaders[2 ] + appId);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[0 ]] = RequestHeaders[2 ] + appId;\n                            }\n                        }\n                        if (_isUsingW3CHeaders) {\n                            var traceFlags = ajaxData[_DYN_TRACE_FLAGS ];\n                            if (isNullOrUndefined(traceFlags)) {\n                                traceFlags = 0x01;\n                            }\n                            var traceParent = formatTraceParent(createTraceParent(ajaxData[_DYN_TRACE_ID$1 ], ajaxData[_DYN_SPAN_ID ], traceFlags));\n                            headers.set(RequestHeaders[4 ], traceParent);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[4 ]] = traceParent;\n                            }\n                        }\n                        init[_DYN_HEADERS ] = headers;\n                    }\n                    return init;\n                }\n                else if (xhr) {\n                    if (CorrelationIdHelper[_DYN_CAN_INCLUDE_CORRELAT3 ](_config, ajaxData[_DYN_GET_ABSOLUTE_URL ](), currentWindowHost)) {\n                        if (_isUsingAIHeaders) {\n                            var id = \"|\" + ajaxData[_DYN_TRACE_ID$1 ] + \".\" + ajaxData[_DYN_SPAN_ID ];\n                            xhr[_DYN_SET_REQUEST_HEADER$1 ](RequestHeaders[3 ], id);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[3 ]] = id;\n                            }\n                        }\n                        var appId = _config[_DYN_APP_ID ] || (_context && _context[_DYN_APP_ID ]());\n                        if (appId) {\n                            xhr[_DYN_SET_REQUEST_HEADER$1 ](RequestHeaders[0 ], RequestHeaders[2 ] + appId);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[0 ]] = RequestHeaders[2 ] + appId;\n                            }\n                        }\n                        if (_isUsingW3CHeaders) {\n                            var traceFlags = ajaxData[_DYN_TRACE_FLAGS ];\n                            if (isNullOrUndefined(traceFlags)) {\n                                traceFlags = 0x01;\n                            }\n                            var traceParent = formatTraceParent(createTraceParent(ajaxData[_DYN_TRACE_ID$1 ], ajaxData[_DYN_SPAN_ID ], traceFlags));\n                            xhr[_DYN_SET_REQUEST_HEADER$1 ](RequestHeaders[4 ], traceParent);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[4 ]] = traceParent;\n                            }\n                        }\n                    }\n                    return xhr;\n                }\n                return undefined;\n            };\n            _self[_DYN_TRACK_DEPENDENCY_DAT4 ] = function (dependency, properties, systemProperties) {\n                if (_maxAjaxCallsPerView === -1 || _trackAjaxAttempts < _maxAjaxCallsPerView) {\n                    if ((_config[_DYN_DISTRIBUTED_TRACING_5 ] === 2\n                        || _config[_DYN_DISTRIBUTED_TRACING_5 ] === 1 )\n                        && typeof dependency.id === \"string\" && dependency.id[dependency.id[_DYN_LENGTH$3 ] - 1] !== \".\") {\n                        dependency.id += \".\";\n                    }\n                    if (isNullOrUndefined(dependency[_DYN_START_TIME ])) {\n                        dependency[_DYN_START_TIME ] = new Date();\n                    }\n                    var item = createTelemetryItem(dependency, RemoteDependencyData.dataType, RemoteDependencyData.envelopeType, _self[strDiagLog](), properties, systemProperties);\n                    _self[_DYN_CORE$1 ].track(item);\n                }\n                else if (_trackAjaxAttempts === _maxAjaxCallsPerView) {\n                    _throwInternalCritical(_self, 55 , \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n                }\n                ++_trackAjaxAttempts;\n            };\n            _self.addDependencyListener = function (dependencyListener) {\n                return _addHandler(_dependencyListeners, _dependencyHandlerId++, dependencyListener);\n            };\n            _self.addDependencyInitializer = function (dependencyInitializer) {\n                return _addHandler(_dependencyInitializers, _dependencyHandlerId++, dependencyInitializer);\n            };\n            function _initDefaults() {\n                var location = getLocation();\n                _fetchInitialized = false;\n                _xhrInitialized = false;\n                _currentWindowHost = location && location.host && location.host[_DYN_TO_LOWER_CASE ]();\n                _config = AjaxMonitor.getEmptyConfig();\n                _enableRequestHeaderTracking = false;\n                _enableAjaxErrorStatusText = false;\n                _trackAjaxAttempts = 0;\n                _context = null;\n                _isUsingW3CHeaders = false;\n                _isUsingAIHeaders = false;\n                _markPrefix = null;\n                _enableAjaxPerfTracking = false;\n                _maxAjaxCallsPerView = 0;\n                _enableResponseHeaderTracking = false;\n                _disabledUrls = {};\n                _disableAjaxTracking = false;\n                _disableFetchTracking = false;\n                _excludeRequestFromAutoTrackingPatterns = null;\n                _addRequestContext = null;\n                _evtNamespace = null;\n                _dependencyHandlerId = 0;\n                _dependencyListeners = [];\n                _dependencyInitializers = [];\n            }\n            function _populateDefaults(config) {\n                var ctx = createProcessTelemetryContext(null, config, _self[_DYN_CORE$1 ]);\n                _config = _getEmptyConfig();\n                var defaultConfig = _getDefaultConfig$1();\n                objForEachKey(defaultConfig, function (field, value) {\n                    _config[field] = ctx.getConfig(AjaxMonitor.identifier, field, value);\n                });\n                var distributedTracingMode = _config[_DYN_DISTRIBUTED_TRACING_5 ];\n                _enableRequestHeaderTracking = _config[_DYN_ENABLE_REQUEST_HEADE6 ];\n                _enableAjaxErrorStatusText = _config[_DYN_ENABLE_AJAX_ERROR_ST7 ];\n                _enableAjaxPerfTracking = _config[_DYN_ENABLE_AJAX_PERF_TRA8 ];\n                _maxAjaxCallsPerView = _config[_DYN_MAX_AJAX_CALLS_PER_V9 ];\n                _enableResponseHeaderTracking = _config[_DYN_ENABLE_RESPONSE_HEAD10 ];\n                _excludeRequestFromAutoTrackingPatterns = [].concat(_config[_DYN_EXCLUDE_REQUEST_FROM11 ] || [], _config.addIntEndpoints !== false ? _internalExcludeEndpoints : []);\n                _addRequestContext = _config[_DYN_ADD_REQUEST_CONTEXT ];\n                _isUsingAIHeaders = distributedTracingMode === 0  || distributedTracingMode === 1 ;\n                _isUsingW3CHeaders = distributedTracingMode === 1  || distributedTracingMode === 2 ;\n                if (_enableAjaxPerfTracking) {\n                    var iKey = config.instrumentationKey || \"unkwn\";\n                    if (iKey[_DYN_LENGTH$3 ] > 5) {\n                        _markPrefix = AJAX_MONITOR_PREFIX + iKey.substring(iKey[_DYN_LENGTH$3 ] - 5) + \".\";\n                    }\n                    else {\n                        _markPrefix = AJAX_MONITOR_PREFIX + iKey + \".\";\n                    }\n                }\n                _disableAjaxTracking = !!_config[_DYN_DISABLE_AJAX_TRACKIN12 ];\n                _disableFetchTracking = !!_config[_DYN_DISABLE_FETCH_TRACKI13 ];\n            }\n            function _populateContext() {\n                var propExt = _self[_DYN_CORE$1 ].getPlugin(PropertiesPluginIdentifier);\n                if (propExt) {\n                    _context = propExt.plugin[_DYN_CONTEXT$1 ];\n                }\n            }\n            function _canIncludeHeaders(header) {\n                var rlt = true;\n                if (header || _config.ignoreHeaders) {\n                    arrForEach(_config.ignoreHeaders, (function (key) {\n                        if (key[_DYN_TO_LOWER_CASE ]() === header[_DYN_TO_LOWER_CASE ]()) {\n                            rlt = false;\n                            return -1;\n                        }\n                    }));\n                }\n                return rlt;\n            }\n            function _instrumentFetch() {\n                var fetch = _supportsFetch();\n                if (!fetch) {\n                    return;\n                }\n                var global = getGlobal();\n                var isPolyfill = fetch.polyfill;\n                if (!_disableFetchTracking && !_fetchInitialized) {\n                    _addHook(InstrumentFunc(global, STR_FETCH, {\n                        ns: _evtNamespace,\n                        req: function (callDetails, input, init) {\n                            var fetchData;\n                            if (!_disableFetchTracking && _fetchInitialized &&\n                                !_isDisabledRequest(null, input, init) &&\n                                !(isPolyfill && _xhrInitialized)) {\n                                var ctx = callDetails.ctx();\n                                fetchData = _createFetchRecord(input, init);\n                                var newInit = _self[_DYN_INCLUDE_CORRELATION_2 ](fetchData, input, init);\n                                if (newInit !== init) {\n                                    callDetails.set(1, newInit);\n                                }\n                                ctx.data = fetchData;\n                            }\n                        },\n                        rsp: function (callDetails, input) {\n                            if (!_disableFetchTracking) {\n                                var fetchData_1 = callDetails.ctx().data;\n                                if (fetchData_1) {\n                                    callDetails.rslt = callDetails.rslt.then(function (response) {\n                                        _reportFetchMetrics(callDetails, (response || {})[_DYN_STATUS ], input, response, fetchData_1, function () {\n                                            var ajaxResponse = {\n                                                statusText: (response || {})[_DYN_STATUS_TEXT ],\n                                                headerMap: null,\n                                                correlationContext: _getFetchCorrelationContext(response)\n                                            };\n                                            if (_enableResponseHeaderTracking && response) {\n                                                var responseHeaderMap_1 = {};\n                                                response.headers.forEach(function (value, name) {\n                                                    if (_canIncludeHeaders(name)) {\n                                                        responseHeaderMap_1[name] = value;\n                                                    }\n                                                });\n                                                ajaxResponse[_DYN_HEADER_MAP ] = responseHeaderMap_1;\n                                            }\n                                            return ajaxResponse;\n                                        });\n                                        return response;\n                                    })[\"catch\"](function (reason) {\n                                        _reportFetchMetrics(callDetails, 0, input, null, fetchData_1, null, { error: reason.message || dumpObj(reason) });\n                                        throw reason;\n                                    });\n                                }\n                            }\n                        },\n                        hkErr: _createErrorCallbackFunc(_self, 15 , \"Failed to monitor Window.fetch\" + ERROR_POSTFIX)\n                    }, true, isWebWorker$1()));\n                    _fetchInitialized = true;\n                }\n                else if (isPolyfill) {\n                    _addHook(InstrumentFunc(global, STR_FETCH, {\n                        ns: _evtNamespace,\n                        req: function (callDetails, input, init) {\n                            _isDisabledRequest(null, input, init);\n                        }\n                    }));\n                }\n                if (isPolyfill) {\n                    global[STR_FETCH].polyfill = isPolyfill;\n                }\n            }\n            function _hookProto(target, funcName, callbacks) {\n                _addHook(InstrumentProto(target, funcName, callbacks));\n            }\n            function _instrumentXhr() {\n                if (_supportsAjaxMonitoring(_self) && !_disableAjaxTracking && !_xhrInitialized) {\n                    _hookProto(XMLHttpRequest, \"open\", {\n                        ns: _evtNamespace,\n                        req: function (args, method, url, async) {\n                            if (!_disableAjaxTracking) {\n                                var xhr = args[_DYN_INST ];\n                                var ajaxData = xhr[strAjaxData];\n                                if (!_isDisabledRequest(xhr, url) && _isMonitoredXhrInstance(xhr, true)) {\n                                    if (!ajaxData || !ajaxData.xhrMonitoringState[_DYN_OPEN_DONE ]) {\n                                        _openHandler(xhr, method, url, async);\n                                    }\n                                    _attachToOnReadyStateChange(xhr);\n                                }\n                            }\n                        },\n                        hkErr: _createErrorCallbackFunc(_self, 15 , ERROR_HEADER + \".open\" + ERROR_POSTFIX)\n                    });\n                    _hookProto(XMLHttpRequest, \"send\", {\n                        ns: _evtNamespace,\n                        req: function (args, context) {\n                            if (!_disableAjaxTracking) {\n                                var xhr = args[_DYN_INST ];\n                                var ajaxData = xhr[strAjaxData];\n                                if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState[_DYN_SEND_DONE ]) {\n                                    _createMarkId(\"xhr\", ajaxData);\n                                    ajaxData[_DYN_REQUEST_SENT_TIME ] = dateTimeUtilsNow();\n                                    _self[_DYN_INCLUDE_CORRELATION_2 ](ajaxData, undefined, undefined, xhr);\n                                    ajaxData.xhrMonitoringState[_DYN_SEND_DONE ] = true;\n                                }\n                            }\n                        },\n                        hkErr: _createErrorCallbackFunc(_self, 17 , ERROR_HEADER + ERROR_POSTFIX)\n                    });\n                    _hookProto(XMLHttpRequest, \"abort\", {\n                        ns: _evtNamespace,\n                        req: function (args) {\n                            if (!_disableAjaxTracking) {\n                                var xhr = args[_DYN_INST ];\n                                var ajaxData = xhr[strAjaxData];\n                                if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState[_DYN_ABORT_DONE ]) {\n                                    ajaxData[_DYN_ABORTED ] = 1;\n                                    ajaxData.xhrMonitoringState[_DYN_ABORT_DONE ] = true;\n                                }\n                            }\n                        },\n                        hkErr: _createErrorCallbackFunc(_self, 13 , ERROR_HEADER + \".abort\" + ERROR_POSTFIX)\n                    });\n                    _hookProto(XMLHttpRequest, \"setRequestHeader\", {\n                        ns: _evtNamespace,\n                        req: function (args, header, value) {\n                            if (!_disableAjaxTracking && _enableRequestHeaderTracking) {\n                                var xhr = args[_DYN_INST ];\n                                if (_isMonitoredXhrInstance(xhr) && _canIncludeHeaders(header)) {\n                                    xhr[strAjaxData][_DYN_REQUEST_HEADERS ][header] = value;\n                                }\n                            }\n                        },\n                        hkErr: _createErrorCallbackFunc(_self, 71 , ERROR_HEADER + \".setRequestHeader\" + ERROR_POSTFIX)\n                    });\n                    _xhrInitialized = true;\n                }\n            }\n            function _isDisabledRequest(xhr, request, init) {\n                var isDisabled = false;\n                var theUrl = ((!isString(request) ? (request || {}).url || \"\" : request) || \"\")[_DYN_TO_LOWER_CASE ]();\n                arrForEach(_excludeRequestFromAutoTrackingPatterns, function (regex) {\n                    var theRegex = regex;\n                    if (isString(regex)) {\n                        theRegex = new RegExp(regex);\n                    }\n                    if (!isDisabled) {\n                        isDisabled = theRegex.test(theUrl);\n                    }\n                });\n                if (isDisabled) {\n                    return isDisabled;\n                }\n                var idx = _indexOf(theUrl, \"?\");\n                var idx2 = _indexOf(theUrl, \"#\");\n                if (idx === -1 || (idx2 !== -1 && idx2 < idx)) {\n                    idx = idx2;\n                }\n                if (idx !== -1) {\n                    theUrl = theUrl.substring(0, idx);\n                }\n                if (!isNullOrUndefined(xhr)) {\n                    isDisabled = xhr[DisabledPropertyName] === true || theUrl[DisabledPropertyName] === true;\n                }\n                else if (!isNullOrUndefined(request)) {\n                    isDisabled = (typeof request === \"object\" ? request[DisabledPropertyName] === true : false) ||\n                        (init ? init[DisabledPropertyName] === true : false);\n                }\n                if (!isDisabled && theUrl && isInternalApplicationInsightsEndpoint(theUrl)) {\n                    isDisabled = true;\n                }\n                if (isDisabled) {\n                    if (!_disabledUrls[theUrl]) {\n                        _disabledUrls[theUrl] = 1;\n                    }\n                }\n                else {\n                    if (_disabledUrls[theUrl]) {\n                        isDisabled = true;\n                    }\n                }\n                return isDisabled;\n            }\n            function _isMonitoredXhrInstance(xhr, excludeAjaxDataValidation) {\n                var ajaxValidation = true;\n                var initialized = _xhrInitialized;\n                if (!isNullOrUndefined(xhr)) {\n                    ajaxValidation = excludeAjaxDataValidation === true || !isNullOrUndefined(xhr[strAjaxData]);\n                }\n                return initialized\n                    && ajaxValidation;\n            }\n            function _getDistributedTraceCtx() {\n                var distributedTraceCtx = null;\n                if (_self[_DYN_CORE$1 ] && _self[_DYN_CORE$1 ].getTraceCtx) {\n                    distributedTraceCtx = _self[_DYN_CORE$1 ].getTraceCtx(false);\n                }\n                if (!distributedTraceCtx && _context && _context.telemetryTrace) {\n                    distributedTraceCtx = createDistributedTraceContextFromTrace(_context.telemetryTrace);\n                }\n                return distributedTraceCtx;\n            }\n            function _openHandler(xhr, method, url, async) {\n                var _a;\n                var distributedTraceCtx = _getDistributedTraceCtx();\n                var traceID = (distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_ID ]()) || generateW3CId();\n                var spanID = generateW3CId().substr(0, 16);\n                var ajaxData = new ajaxRecord(traceID, spanID, _self[strDiagLog](), (_a = _self.core) === null || _a === void 0 ? void 0 : _a.getTraceCtx());\n                ajaxData[_DYN_TRACE_FLAGS ] = distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_FLAGS ]();\n                ajaxData[_DYN_METHOD ] = method;\n                ajaxData[_DYN_REQUEST_URL ] = url;\n                ajaxData.xhrMonitoringState[_DYN_OPEN_DONE ] = true;\n                ajaxData[_DYN_REQUEST_HEADERS ] = {};\n                ajaxData.async = async;\n                ajaxData[_DYN_ERROR_STATUS_TEXT ] = _enableAjaxErrorStatusText;\n                xhr[strAjaxData] = ajaxData;\n            }\n            function _attachToOnReadyStateChange(xhr) {\n                xhr[strAjaxData].xhrMonitoringState[_DYN_STATE_CHANGE_ATTACHE14 ] = eventOn(xhr, \"readystatechange\", function () {\n                    try {\n                        if (xhr && xhr.readyState === 4 && _isMonitoredXhrInstance(xhr)) {\n                            _onAjaxComplete(xhr);\n                        }\n                    }\n                    catch (e) {\n                        var exceptionText = dumpObj(e);\n                        if (!exceptionText || _indexOf(exceptionText[_DYN_TO_LOWER_CASE ](), \"c00c023f\") === -1) {\n                            _throwInternalCritical(_self, 16 , ERROR_HEADER + \" 'readystatechange' event handler\" + ERROR_POSTFIX, {\n                                ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(xhr),\n                                exception: exceptionText\n                            });\n                        }\n                    }\n                }, _evtNamespace);\n            }\n            function _getResponseText(xhr) {\n                try {\n                    var responseType = xhr.responseType;\n                    if (responseType === \"\" || responseType === \"text\") {\n                        return xhr[_DYN_RESPONSE_TEXT ];\n                    }\n                }\n                catch (e) {\n                }\n                return null;\n            }\n            function _onAjaxComplete(xhr) {\n                var ajaxData = xhr[strAjaxData];\n                ajaxData[_DYN_RESPONSE_FINISHED_TI15 ] = dateTimeUtilsNow();\n                ajaxData[_DYN_STATUS ] = xhr[_DYN_STATUS ];\n                function _reportXhrError(e, failedProps) {\n                    var errorProps = failedProps || {};\n                    errorProps[\"ajaxDiagnosticsMessage\"] = _getFailedAjaxDiagnosticsMessage(xhr);\n                    if (e) {\n                        errorProps[\"exception\"] = dumpObj(e);\n                    }\n                    _throwInternalWarning(_self, 14 , FAILED_TO_CALCULATE_DURATION_ERROR + \"ajax call\" + ERROR_NOT_SENT, errorProps);\n                }\n                _findPerfResourceEntry(\"xmlhttprequest\", ajaxData, function () {\n                    try {\n                        var dependency = ajaxData[_DYN__CREATE_TRACK_ITEM ](\"Ajax\", _enableRequestHeaderTracking, function () {\n                            var ajaxResponse = {\n                                statusText: xhr[_DYN_STATUS_TEXT ],\n                                headerMap: null,\n                                correlationContext: _getAjaxCorrelationContext(xhr),\n                                type: xhr.responseType,\n                                responseText: _getResponseText(xhr),\n                                response: xhr[_DYN_RESPONSE ]\n                            };\n                            if (_enableResponseHeaderTracking) {\n                                var headers = xhr[_DYN_GET_ALL_RESPONSE_HEA16 ]();\n                                if (headers) {\n                                    var arr = strTrim(headers).split(/[\\r\\n]+/);\n                                    var responseHeaderMap_2 = {};\n                                    arrForEach(arr, function (line) {\n                                        var parts = line.split(\": \");\n                                        var header = parts.shift();\n                                        var value = parts.join(\": \");\n                                        if (_canIncludeHeaders(header)) {\n                                            responseHeaderMap_2[header] = value;\n                                        }\n                                    });\n                                    ajaxResponse[_DYN_HEADER_MAP ] = responseHeaderMap_2;\n                                }\n                            }\n                            return ajaxResponse;\n                        });\n                        var properties = void 0;\n                        try {\n                            if (!!_addRequestContext) {\n                                properties = _addRequestContext({ status: xhr[_DYN_STATUS ], xhr: xhr });\n                            }\n                        }\n                        catch (e) {\n                            _throwInternalWarning(_self, 104 , CUSTOM_REQUEST_CONTEXT_ERROR);\n                        }\n                        if (dependency) {\n                            if (properties !== undefined) {\n                                dependency[STR_PROPERTIES ] = __assignFn(__assignFn({}, dependency.properties), properties);\n                            }\n                            var sysProperties = ajaxData[_DYN_GET_PART_APROPS ]();\n                            _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE$1 ], ajaxData, dependency, null, sysProperties);\n                        }\n                        else {\n                            _reportXhrError(null, {\n                                requestSentTime: ajaxData[_DYN_REQUEST_SENT_TIME ],\n                                responseFinishedTime: ajaxData[_DYN_RESPONSE_FINISHED_TI15 ]\n                            });\n                        }\n                    }\n                    finally {\n                        try {\n                            xhr[strAjaxData] = null;\n                        }\n                        catch (e) {\n                        }\n                    }\n                }, function (e) {\n                    _reportXhrError(e, null);\n                });\n            }\n            function _getAjaxCorrelationContext(xhr) {\n                try {\n                    var responseHeadersString = xhr[_DYN_GET_ALL_RESPONSE_HEA16 ]();\n                    if (responseHeadersString !== null) {\n                        var index = _indexOf(responseHeadersString[_DYN_TO_LOWER_CASE ](), RequestHeaders[8 ]);\n                        if (index !== -1) {\n                            var responseHeader = xhr.getResponseHeader(RequestHeaders[0 ]);\n                            return CorrelationIdHelper[_DYN_GET_CORRELATION_CONT17 ](responseHeader);\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternalWarning(_self, 18 , CORRELATION_HEADER_ERROR, {\n                        ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(xhr),\n                        exception: dumpObj(e)\n                    });\n                }\n            }\n            function _createMarkId(type, ajaxData) {\n                if (ajaxData[_DYN_REQUEST_URL ] && _markPrefix && _enableAjaxPerfTracking) {\n                    var performance_1 = getPerformance();\n                    if (performance_1 && isFunction(performance_1.mark)) {\n                        _markCount++;\n                        var markId = _markPrefix + type + \"#\" + _markCount;\n                        performance_1.mark(markId);\n                        var entries = performance_1.getEntriesByName(markId);\n                        if (entries && entries[_DYN_LENGTH$3 ] === 1) {\n                            ajaxData[_DYN_PERF_MARK ] = entries[0];\n                        }\n                    }\n                }\n            }\n            function _findPerfResourceEntry(initiatorType, ajaxData, trackCallback, reportError) {\n                var perfMark = ajaxData[_DYN_PERF_MARK ];\n                var performance = getPerformance();\n                var maxAttempts = _config.maxAjaxPerfLookupAttempts;\n                var retryDelay = _config[_DYN_AJAX_PERF_LOOKUP_DEL18 ];\n                var requestUrl = ajaxData[_DYN_REQUEST_URL ];\n                var attempt = 0;\n                (function locateResourceTiming() {\n                    try {\n                        if (performance && perfMark) {\n                            attempt++;\n                            var perfTiming = null;\n                            var entries = performance.getEntries();\n                            for (var lp = entries[_DYN_LENGTH$3 ] - 1; lp >= 0; lp--) {\n                                var entry = entries[lp];\n                                if (entry) {\n                                    if (entry.entryType === \"resource\") {\n                                        if (entry.initiatorType === initiatorType &&\n                                            (_indexOf(entry[_DYN_NAME$1 ], requestUrl) !== -1 || _indexOf(requestUrl, entry[_DYN_NAME$1 ]) !== -1)) {\n                                            perfTiming = entry;\n                                        }\n                                    }\n                                    else if (entry.entryType === \"mark\" && entry[_DYN_NAME$1 ] === perfMark[_DYN_NAME$1 ]) {\n                                        ajaxData[_DYN_PERF_TIMING ] = perfTiming;\n                                        break;\n                                    }\n                                    if (entry[_DYN_START_TIME ] < perfMark[_DYN_START_TIME ] - 1000) {\n                                        break;\n                                    }\n                                }\n                            }\n                        }\n                        if (!perfMark ||\n                            ajaxData[_DYN_PERF_TIMING ] ||\n                            attempt >= maxAttempts ||\n                            ajaxData.async === false) {\n                            if (perfMark && isFunction(performance.clearMarks)) {\n                                performance.clearMarks(perfMark[_DYN_NAME$1 ]);\n                            }\n                            ajaxData.perfAttempts = attempt;\n                            trackCallback();\n                        }\n                        else {\n                            setTimeout(locateResourceTiming, retryDelay);\n                        }\n                    }\n                    catch (e) {\n                        reportError(e);\n                    }\n                })();\n            }\n            function _createFetchRecord(input, init) {\n                var _a;\n                var distributedTraceCtx = _getDistributedTraceCtx();\n                var traceID = (distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_ID ]()) || generateW3CId();\n                var spanID = generateW3CId().substr(0, 16);\n                var ajaxData = new ajaxRecord(traceID, spanID, _self[strDiagLog](), (_a = _self.core) === null || _a === void 0 ? void 0 : _a.getTraceCtx());\n                ajaxData[_DYN_TRACE_FLAGS ] = distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_FLAGS ]();\n                ajaxData[_DYN_REQUEST_SENT_TIME ] = dateTimeUtilsNow();\n                ajaxData[_DYN_ERROR_STATUS_TEXT ] = _enableAjaxErrorStatusText;\n                if (input instanceof Request) {\n                    ajaxData[_DYN_REQUEST_URL ] = input ? input.url : \"\";\n                }\n                else {\n                    ajaxData[_DYN_REQUEST_URL ] = input;\n                }\n                var method = \"GET\";\n                if (init && init[_DYN_METHOD ]) {\n                    method = init[_DYN_METHOD ];\n                }\n                else if (input && input instanceof Request) {\n                    method = input[_DYN_METHOD ];\n                }\n                ajaxData[_DYN_METHOD ] = method;\n                var requestHeaders = {};\n                if (_enableRequestHeaderTracking) {\n                    var headers = new Headers((init ? init[_DYN_HEADERS ] : 0) || (input instanceof Request ? (input[_DYN_HEADERS ] || {}) : {}));\n                    headers.forEach(function (value, key) {\n                        if (_canIncludeHeaders(key)) {\n                            requestHeaders[key] = value;\n                        }\n                    });\n                }\n                ajaxData[_DYN_REQUEST_HEADERS ] = requestHeaders;\n                _createMarkId(STR_FETCH, ajaxData);\n                return ajaxData;\n            }\n            function _getFailedFetchDiagnosticsMessage(input) {\n                var result = \"\";\n                try {\n                    if (!isNullOrUndefined(input)) {\n                        if (typeof (input) === \"string\") {\n                            result += \"(url: '\".concat(input, \"')\");\n                        }\n                        else {\n                            result += \"(url: '\".concat(input.url, \"')\");\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternalCritical(_self, 15 , \"Failed to grab failed fetch diagnostics message\", { exception: dumpObj(e) });\n                }\n                return result;\n            }\n            function _reportFetchMetrics(callDetails, status, input, response, ajaxData, getResponse, properties) {\n                if (!ajaxData) {\n                    return;\n                }\n                function _reportFetchError(msgId, e, failedProps) {\n                    var errorProps = failedProps || {};\n                    errorProps[\"fetchDiagnosticsMessage\"] = _getFailedFetchDiagnosticsMessage(input);\n                    if (e) {\n                        errorProps[\"exception\"] = dumpObj(e);\n                    }\n                    _throwInternalWarning(_self, msgId, FAILED_TO_CALCULATE_DURATION_ERROR + \"fetch call\" + ERROR_NOT_SENT, errorProps);\n                }\n                ajaxData[_DYN_RESPONSE_FINISHED_TI15 ] = dateTimeUtilsNow();\n                ajaxData[_DYN_STATUS ] = status;\n                _findPerfResourceEntry(STR_FETCH, ajaxData, function () {\n                    var dependency = ajaxData[_DYN__CREATE_TRACK_ITEM ](\"Fetch\", _enableRequestHeaderTracking, getResponse);\n                    var properties;\n                    try {\n                        if (!!_addRequestContext) {\n                            properties = _addRequestContext({ status: status, request: input, response: response });\n                        }\n                    }\n                    catch (e) {\n                        _throwInternalWarning(_self, 104 , CUSTOM_REQUEST_CONTEXT_ERROR);\n                    }\n                    if (dependency) {\n                        if (properties !== undefined) {\n                            dependency[STR_PROPERTIES ] = __assignFn(__assignFn({}, dependency.properties), properties);\n                        }\n                        var sysProperties = ajaxData[_DYN_GET_PART_APROPS ]();\n                        _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE$1 ], ajaxData, dependency, null, sysProperties);\n                    }\n                    else {\n                        _reportFetchError(14 , null, {\n                            requestSentTime: ajaxData[_DYN_REQUEST_SENT_TIME ],\n                            responseFinishedTime: ajaxData[_DYN_RESPONSE_FINISHED_TI15 ]\n                        });\n                    }\n                }, function (e) {\n                    _reportFetchError(18 , e, null);\n                });\n            }\n            function _getFetchCorrelationContext(response) {\n                if (response && response[_DYN_HEADERS ]) {\n                    try {\n                        var responseHeader = response[_DYN_HEADERS ].get(RequestHeaders[0 ]);\n                        return CorrelationIdHelper[_DYN_GET_CORRELATION_CONT17 ](responseHeader);\n                    }\n                    catch (e) {\n                        _throwInternalWarning(_self, 18 , CORRELATION_HEADER_ERROR, {\n                            fetchDiagnosticsMessage: _getFailedFetchDiagnosticsMessage(response),\n                            exception: dumpObj(e)\n                        });\n                    }\n                }\n            }\n            function _reportDependencyInternal(initializers, core, ajaxData, dependency, properties, systemProperties) {\n                var result = true;\n                var initializersCount = initializers[_DYN_LENGTH$3 ];\n                if (initializersCount > 0) {\n                    var details = {\n                        item: dependency,\n                        properties: properties,\n                        sysProperties: systemProperties,\n                        context: ajaxData ? ajaxData[_DYN_CONTEXT$1 ] : null,\n                        aborted: ajaxData ? !!ajaxData[_DYN_ABORTED ] : false\n                    };\n                    result = _processDependencyContainer(core, initializers, details, \"initializer\");\n                }\n                if (result) {\n                    _self[_DYN_TRACK_DEPENDENCY_DAT4 ](dependency, properties, systemProperties);\n                }\n            }\n        });\n        return _this;\n    }\n    AjaxMonitor.prototype.processTelemetry = function (item, itemCtx) {\n        this.processNext(item, itemCtx);\n    };\n    AjaxMonitor.prototype.addDependencyInitializer = function (dependencyInitializer) {\n        return null;\n    };\n    AjaxMonitor.identifier = \"AjaxDependencyPlugin\";\n    AjaxMonitor.getDefaultConfig = _getDefaultConfig$1;\n    AjaxMonitor.getEmptyConfig = _getEmptyConfig;\n    return AjaxMonitor;\n}(BaseTelemetryPlugin));\n\nvar _AUTHENTICATED_USER_CONTEXT = \"AuthenticatedUserContext\";\nvar _TRACK = \"track\";\nvar STR_SNIPPET = \"snippet\";\nvar STR_GET_COOKIE_MGR = \"getCookieMgr\";\nvar STR_START_TRACK_PAGE = \"startTrackPage\";\nvar STR_STOP_TRACK_PAGE = \"stopTrackPage\";\nvar STR_FLUSH = \"flush\";\nvar STR_START_TRACK_EVENT = \"startTrackEvent\";\nvar STR_STOP_TRACK_EVENT = \"stopTrackEvent\";\nvar STR_ADD_TELEMETRY_INITIALIZER = \"addTelemetryInitializer\";\nvar STR_ADD_TELEMETRY_INITIALIZERS = STR_ADD_TELEMETRY_INITIALIZER + \"s\";\nvar STR_POLL_INTERNAL_LOGS = \"pollInternalLogs\";\nvar STR_GET_PLUGIN = \"getPlugin\";\nvar STR_EVT_NAMESPACE = \"evtNamespace\";\nvar STR_TRACK_EVENT = _TRACK + \"Event\";\nvar STR_TRACK_TRACE = _TRACK + \"Trace\";\nvar STR_TRACK_METRIC = _TRACK + \"Metric\";\nvar STR_TRACK_PAGE_VIEW = _TRACK + \"PageView\";\nvar STR_TRACK_EXCEPTION = _TRACK + \"Exception\";\nvar STR_TRACK_DEPENDENCY_DATA = _TRACK + \"DependencyData\";\nvar STR_SET_AUTHENTICATED_USER_CONTEXT = \"set\" + _AUTHENTICATED_USER_CONTEXT;\nvar STR_CLEAR_AUTHENTICATED_USER_CONTEXT = \"clear\" + _AUTHENTICATED_USER_CONTEXT;\n\nvar _DYN_UPDATE_SNIPPET_DEFIN0 = \"updateSnippetDefinitions\";\nvar _DYN_LOAD_APP_INSIGHTS = \"loadAppInsights\";\nvar _DYN_ENDPOINT_URL$1 = \"endpointUrl\";\nvar _DYN_MAX_BATCH_SIZE_IN_BY1$1 = \"maxBatchSizeInBytes\";\nvar _DYN_MAX_BATCH_INTERVAL$1 = \"maxBatchInterval\";\nvar _DYN_DISABLE_EXCEPTION_TR2 = \"disableExceptionTracking\";\nvar _DYN_DISABLE_TELEMETRY$1 = \"disableTelemetry\";\nvar _DYN_EMIT_LINE_DELIMITED_3 = \"emitLineDelimitedJson\";\nvar _DYN_DIAGNOSTIC_LOG_INTER4 = \"diagnosticLogInterval\";\nvar _DYN_AUTO_TRACK_PAGE_VISI5 = \"autoTrackPageVisitTime\";\nvar _DYN_SAMPLING_PERCENTAGE$2 = \"samplingPercentage\";\nvar _DYN_DISABLE_AJAX_TRACKIN6 = \"disableAjaxTracking\";\nvar _DYN_MAX_AJAX_CALLS_PER_V7 = \"maxAjaxCallsPerView\";\nvar _DYN_IS_BEACON_API_DISABL8 = \"isBeaconApiDisabled\";\nvar _DYN_DISABLE_CORRELATION_9 = \"disableCorrelationHeaders\";\nvar _DYN_CORRELATION_HEADER_E10 = \"correlationHeaderExcludedDomains\";\nvar _DYN_DISABLE_FLUSH_ON_BEF11 = \"disableFlushOnBeforeUnload\";\nvar _DYN_DISABLE_FLUSH_ON_UNL12 = \"disableFlushOnUnload\";\nvar _DYN_ENABLE_SESSION_STORA13 = \"enableSessionStorageBuffer\";\nvar _DYN_IS_COOKIE_USE_DISABL14 = \"isCookieUseDisabled\";\nvar _DYN_IS_STORAGE_USE_DISAB15 = \"isStorageUseDisabled\";\nvar _DYN_IS_BROWSER_LINK_TRAC16 = \"isBrowserLinkTrackingEnabled\";\nvar _DYN_ENABLE_CORS_CORRELAT17 = \"enableCorsCorrelation\";\nvar _DYN_CONFIG$1 = \"config\";\nvar _DYN_CONTEXT = \"context\";\nvar _DYN_PUSH$1 = \"push\";\nvar _DYN_VERSION = \"version\";\nvar _DYN_QUEUE = \"queue\";\nvar _DYN_CONNECTION_STRING = \"connectionString\";\nvar _DYN_INSTRUMENTATION_KEY$1 = \"instrumentationKey\";\nvar _DYN_APP_INSIGHTS = \"appInsights\";\nvar _DYN_DISABLE_IKEY_DEPRECA18 = \"disableIkeyDeprecationMessage\";\nvar _DYN_GET_TRANSMISSION_CON19 = \"getTransmissionControls\";\nvar _DYN_ONUNLOAD_FLUSH = \"onunloadFlush\";\nvar _DYN_ADD_HOUSEKEEPING_BEF20 = \"addHousekeepingBeforeUnload\";\nvar _DYN_INDEX_OF = \"indexOf\";\n\nvar _ignoreUpdateSnippetProperties$1 = [\n    STR_SNIPPET, \"getDefaultConfig\", \"_hasLegacyInitializers\", \"_queue\", \"_processLegacyInitializers\"\n];\nfunction getDefaultConfig(config) {\n    if (!config) {\n        config = {};\n    }\n    config[_DYN_ENDPOINT_URL$1 ] = config[_DYN_ENDPOINT_URL$1 ] || DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n    config.sessionRenewalMs = 30 * 60 * 1000;\n    config.sessionExpirationMs = 24 * 60 * 60 * 1000;\n    config[_DYN_MAX_BATCH_SIZE_IN_BY1$1 ] = config[_DYN_MAX_BATCH_SIZE_IN_BY1$1 ] > 0 ? config[_DYN_MAX_BATCH_SIZE_IN_BY1$1 ] : 102400;\n    config[_DYN_MAX_BATCH_INTERVAL$1 ] = !isNaN(config[_DYN_MAX_BATCH_INTERVAL$1 ]) ? config[_DYN_MAX_BATCH_INTERVAL$1 ] : 15000;\n    config.enableDebug = stringToBoolOrDefault(config.enableDebug);\n    config[_DYN_DISABLE_EXCEPTION_TR2 ] = stringToBoolOrDefault(config[_DYN_DISABLE_EXCEPTION_TR2 ]);\n    config[_DYN_DISABLE_TELEMETRY$1 ] = stringToBoolOrDefault(config[_DYN_DISABLE_TELEMETRY$1 ]);\n    config.verboseLogging = stringToBoolOrDefault(config.verboseLogging);\n    config[_DYN_EMIT_LINE_DELIMITED_3 ] = stringToBoolOrDefault(config[_DYN_EMIT_LINE_DELIMITED_3 ]);\n    config[_DYN_DIAGNOSTIC_LOG_INTER4 ] = config[_DYN_DIAGNOSTIC_LOG_INTER4 ] || 10000;\n    config[_DYN_AUTO_TRACK_PAGE_VISI5 ] = stringToBoolOrDefault(config[_DYN_AUTO_TRACK_PAGE_VISI5 ]);\n    if (isNaN(config[_DYN_SAMPLING_PERCENTAGE$2 ]) || config[_DYN_SAMPLING_PERCENTAGE$2 ] <= 0 || config[_DYN_SAMPLING_PERCENTAGE$2 ] >= 100) {\n        config[_DYN_SAMPLING_PERCENTAGE$2 ] = 100;\n    }\n    config[_DYN_DISABLE_AJAX_TRACKIN6 ] = stringToBoolOrDefault(config[_DYN_DISABLE_AJAX_TRACKIN6 ]);\n    config[_DYN_MAX_AJAX_CALLS_PER_V7 ] = !isNaN(config[_DYN_MAX_AJAX_CALLS_PER_V7 ]) ? config[_DYN_MAX_AJAX_CALLS_PER_V7 ] : 500;\n    config[_DYN_IS_BEACON_API_DISABL8 ] = stringToBoolOrDefault(config[_DYN_IS_BEACON_API_DISABL8 ], true);\n    config[_DYN_DISABLE_CORRELATION_9 ] = stringToBoolOrDefault(config[_DYN_DISABLE_CORRELATION_9 ]);\n    config[_DYN_CORRELATION_HEADER_E10 ] = config[_DYN_CORRELATION_HEADER_E10 ] || DfltAjaxCorrelationHeaderExDomains;\n    config[_DYN_DISABLE_FLUSH_ON_BEF11 ] = stringToBoolOrDefault(config[_DYN_DISABLE_FLUSH_ON_BEF11 ]);\n    config.disableFlushOnUnload = stringToBoolOrDefault(config.disableFlushOnUnload, config[_DYN_DISABLE_FLUSH_ON_BEF11 ]);\n    config[_DYN_ENABLE_SESSION_STORA13 ] = stringToBoolOrDefault(config[_DYN_ENABLE_SESSION_STORA13 ], true);\n    config.isRetryDisabled = stringToBoolOrDefault(config.isRetryDisabled);\n    config[_DYN_IS_COOKIE_USE_DISABL14 ] = stringToBoolOrDefault(config[_DYN_IS_COOKIE_USE_DISABL14 ]);\n    config[_DYN_IS_STORAGE_USE_DISAB15 ] = stringToBoolOrDefault(config[_DYN_IS_STORAGE_USE_DISAB15 ]);\n    config[_DYN_IS_BROWSER_LINK_TRAC16 ] = stringToBoolOrDefault(config[_DYN_IS_BROWSER_LINK_TRAC16 ]);\n    config[_DYN_ENABLE_CORS_CORRELAT17 ] = stringToBoolOrDefault(config[_DYN_ENABLE_CORS_CORRELAT17 ]);\n    return config;\n}\nvar AppInsightsDeprecated = /** @class */ (function () {\n    function AppInsightsDeprecated(snippet, appInsightsNew) {\n        var _this = this;\n        var _hasLegacyInitializers = false;\n        var _queue = [];\n        var _config;\n        dynamicProto(AppInsightsDeprecated, this, function (_self) {\n            _config = getDefaultConfig(snippet[_DYN_CONFIG$1 ]);\n            _self[_DYN_CONFIG$1 ] = _config;\n            _self[STR_SNIPPET ] = snippet;\n            _self.appInsightsNew = appInsightsNew;\n            _self[_DYN_CONTEXT ] = { addTelemetryInitializer: _addTelemetryInitializers.bind(_self) };\n            _self[STR_ADD_TELEMETRY_INITIALIZERS ] = _addTelemetryInitializers;\n            function _addTelemetryInitializers(callBack) {\n                if (!_hasLegacyInitializers) {\n                    appInsightsNew[STR_ADD_TELEMETRY_INITIALIZER ](function (item) {\n                        _processLegacyInitializers(item);\n                    });\n                    _hasLegacyInitializers = true;\n                }\n                _queue[_DYN_PUSH$1 ](callBack);\n            }\n            proxyFunctions(_self, appInsightsNew, [\n                STR_GET_COOKIE_MGR,\n                STR_START_TRACK_PAGE,\n                STR_STOP_TRACK_PAGE,\n                STR_FLUSH,\n                STR_START_TRACK_EVENT,\n                STR_STOP_TRACK_EVENT\n            ]);\n            _self[STR_TRACK_PAGE_VIEW ] = function (name, url, properties, measurements, duration) {\n                var telemetry = {\n                    name: name,\n                    uri: url,\n                    properties: properties,\n                    measurements: measurements\n                };\n                appInsightsNew[STR_TRACK_PAGE_VIEW ](telemetry);\n            };\n            _self[STR_TRACK_EVENT ] = function (name, properties, measurements) {\n                appInsightsNew[STR_TRACK_EVENT ]({ name: name });\n            };\n            _self.trackDependency = function (id, method, absoluteUrl, pathName, totalTime, success, resultCode) {\n                appInsightsNew[STR_TRACK_DEPENDENCY_DATA ]({\n                    id: id,\n                    target: absoluteUrl,\n                    type: pathName,\n                    duration: totalTime,\n                    properties: { HttpMethod: method },\n                    success: success,\n                    responseCode: resultCode\n                });\n            };\n            _self[STR_TRACK_EXCEPTION ] = function (exception, handledAt, properties, measurements, severityLevel) {\n                appInsightsNew[STR_TRACK_EXCEPTION ]({\n                    exception: exception\n                });\n            };\n            _self[STR_TRACK_METRIC ] = function (name, average, sampleCount, min, max, properties) {\n                appInsightsNew[STR_TRACK_METRIC ]({ name: name, average: average, sampleCount: sampleCount, min: min, max: max });\n            };\n            _self[STR_TRACK_TRACE ] = function (message, properties, severityLevel) {\n                appInsightsNew[STR_TRACK_TRACE ]({ message: message, severityLevel: severityLevel });\n            };\n            _self[STR_SET_AUTHENTICATED_USER_CONTEXT ] = function (authenticatedUserId, accountId, storeInCookie) {\n                appInsightsNew[_DYN_CONTEXT ].user[STR_SET_AUTHENTICATED_USER_CONTEXT ](authenticatedUserId, accountId, storeInCookie);\n            };\n            _self[STR_CLEAR_AUTHENTICATED_USER_CONTEXT ] = function () {\n                appInsightsNew[_DYN_CONTEXT ].user[STR_CLEAR_AUTHENTICATED_USER_CONTEXT ]();\n            };\n            _self._onerror = function (message, url, lineNumber, columnNumber, error) {\n                appInsightsNew._onerror({ message: message, url: url, lineNumber: lineNumber, columnNumber: columnNumber, error: error });\n            };\n            _self.downloadAndSetup = function (config) {\n                throwError(\"downloadAndSetup not implemented in web SKU\");\n            };\n            _self[_DYN_UPDATE_SNIPPET_DEFIN0 ] = function (snippet) {\n                proxyAssign(snippet, _this, function (name) {\n                    return name && arrIndexOf(_ignoreUpdateSnippetProperties$1, name) === -1;\n                });\n            };\n            _self[_DYN_LOAD_APP_INSIGHTS ] = function () {\n                if (_self[_DYN_CONFIG$1 ][\"iKey\"]) {\n                    var originalTrackPageView_1 = _self[STR_TRACK_PAGE_VIEW ];\n                    _self[STR_TRACK_PAGE_VIEW ] = function (pagePath, properties, measurements) {\n                        originalTrackPageView_1.apply(_self, [null, pagePath, properties, measurements]);\n                    };\n                }\n                var legacyPageView = \"logPageView\";\n                if (isFunction(_self[STR_SNIPPET ][legacyPageView])) {\n                    _this[legacyPageView] = function (pagePath, properties, measurements) {\n                        _self[STR_TRACK_PAGE_VIEW ](null, pagePath, properties, measurements);\n                    };\n                }\n                var legacyEvent = \"logEvent\";\n                if (isFunction(_self[STR_SNIPPET ][legacyEvent])) {\n                    _this[legacyEvent] = function (name, props, measurements) {\n                        _self[STR_TRACK_EVENT ](name, props, measurements);\n                    };\n                }\n                return _this;\n            };\n            function _processLegacyInitializers(item) {\n                item.tags[ProcessLegacy] = _queue;\n                return item;\n            }\n        });\n    }\n    AppInsightsDeprecated.__ieDyn=1;\n    return AppInsightsDeprecated;\n}());\n\nvar _DYN_TO_STRING$1 = \"toString\";\nvar _DYN_DISABLE_EXCEPTION_TR0 = \"disableExceptionTracking\";\nvar _DYN_AUTO_TRACK_PAGE_VISI1 = \"autoTrackPageVisitTime\";\nvar _DYN_OVERRIDE_PAGE_VIEW_D2 = \"overridePageViewDuration\";\nvar _DYN_ENABLE_UNHANDLED_PRO3 = \"enableUnhandledPromiseRejectionTracking\";\nvar _DYN_SAMPLING_PERCENTAGE$1 = \"samplingPercentage\";\nvar _DYN_IS_STORAGE_USE_DISAB4 = \"isStorageUseDisabled\";\nvar _DYN_IS_BROWSER_LINK_TRAC5 = \"isBrowserLinkTrackingEnabled\";\nvar _DYN_ENABLE_AUTO_ROUTE_TR6 = \"enableAutoRouteTracking\";\nvar _DYN_NAME_PREFIX$2 = \"namePrefix\";\nvar _DYN_DISABLE_FLUSH_ON_BEF7 = \"disableFlushOnBeforeUnload\";\nvar _DYN_CORE = \"core\";\nvar _DYN_DATA_TYPE$1 = \"dataType\";\nvar _DYN_ENVELOPE_TYPE$1 = \"envelopeType\";\nvar _DYN_DIAG_LOG$1 = \"diagLog\";\nvar _DYN_TRACK = \"track\";\nvar _DYN_TRACK_PAGE_VIEW = \"trackPageView\";\nvar _DYN_TRACK_PREVIOUS_PAGE_9 = \"trackPreviousPageVisit\";\nvar _DYN_SEND_PAGE_VIEW_INTER10 = \"sendPageViewInternal\";\nvar _DYN_SEND_PAGE_VIEW_PERFO11 = \"sendPageViewPerformanceInternal\";\nvar _DYN_POPULATE_PAGE_VIEW_P12 = \"populatePageViewPerformanceEvent\";\nvar _DYN_HREF = \"href\";\nvar _DYN_SEND_EXCEPTION_INTER13 = \"sendExceptionInternal\";\nvar _DYN_EXCEPTION = \"exception\";\nvar _DYN_ERROR = \"error\";\nvar _DYN__ONERROR = \"_onerror\";\nvar _DYN_ERROR_SRC = \"errorSrc\";\nvar _DYN_LINE_NUMBER = \"lineNumber\";\nvar _DYN_COLUMN_NUMBER = \"columnNumber\";\nvar _DYN_MESSAGE = \"message\";\nvar _DYN__CREATE_AUTO_EXCEPTI14 = \"CreateAutoException\";\nvar _DYN_ADD_TELEMETRY_INITIA15 = \"addTelemetryInitializer\";\nvar _DYN_DURATION = \"duration\";\nvar _DYN_LENGTH$2 = \"length\";\nvar _DYN_IS_PERFORMANCE_TIMIN16 = \"isPerformanceTimingSupported\";\nvar _DYN_GET_PERFORMANCE_TIMI17 = \"getPerformanceTiming\";\nvar _DYN_NAVIGATION_START = \"navigationStart\";\nvar _DYN_SHOULD_COLLECT_DURAT18 = \"shouldCollectDuration\";\nvar _DYN_IS_PERFORMANCE_TIMIN19 = \"isPerformanceTimingDataReady\";\nvar _DYN_GET_ENTRIES_BY_TYPE = \"getEntriesByType\";\nvar _DYN_RESPONSE_START = \"responseStart\";\nvar _DYN_REQUEST_START = \"requestStart\";\nvar _DYN_LOAD_EVENT_END = \"loadEventEnd\";\nvar _DYN_RESPONSE_END = \"responseEnd\";\nvar _DYN_CONNECT_END = \"connectEnd\";\nvar _DYN_PAGE_VISIT_START_TIM20 = \"pageVisitStartTime\";\n\nvar _isWebWorker = null;\nfunction isWebWorker() {\n    if (_isWebWorker == null) {\n        try {\n            _isWebWorker = !!(self && self instanceof WorkerGlobalScope);\n        }\n        catch (e) {\n            _isWebWorker = false;\n        }\n    }\n    return _isWebWorker;\n}\nvar PageViewManager = /** @class */ (function () {\n    function PageViewManager(appInsights, overridePageViewDuration, core, pageViewPerformanceManager) {\n        dynamicProto(PageViewManager, this, function (_self) {\n            var queueTimer = null;\n            var itemQueue = [];\n            var pageViewPerformanceSent = false;\n            var _logger;\n            if (core) {\n                _logger = core.logger;\n            }\n            function _flushChannels(isAsync) {\n                if (core) {\n                    core.flush(isAsync);\n                }\n            }\n            function _startTimer() {\n                if (!queueTimer) {\n                    queueTimer = setTimeout((function () {\n                        queueTimer = null;\n                        var allItems = itemQueue.slice(0);\n                        var doFlush = false;\n                        itemQueue = [];\n                        arrForEach(allItems, function (item) {\n                            if (!item()) {\n                                itemQueue.push(item);\n                            }\n                            else {\n                                doFlush = true;\n                            }\n                        });\n                        if (itemQueue[_DYN_LENGTH$2 ] > 0) {\n                            _startTimer();\n                        }\n                        if (doFlush) {\n                            _flushChannels(true);\n                        }\n                    }), 100);\n                }\n            }\n            function _addQueue(cb) {\n                itemQueue.push(cb);\n                _startTimer();\n            }\n            _self[_DYN_TRACK_PAGE_VIEW ] = function (pageView, customProperties) {\n                var name = pageView.name;\n                if (isNullOrUndefined(name) || typeof name !== \"string\") {\n                    var doc = getDocument();\n                    name = pageView.name = doc && doc.title || \"\";\n                }\n                var uri = pageView.uri;\n                if (isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                    var location_1 = getLocation();\n                    uri = pageView.uri = location_1 && location_1[_DYN_HREF ] || \"\";\n                }\n                if (!pageViewPerformanceManager[_DYN_IS_PERFORMANCE_TIMIN16 ]()) {\n                    appInsights[_DYN_SEND_PAGE_VIEW_INTER10 ](pageView, customProperties);\n                    _flushChannels(true);\n                    if (!isWebWorker()) {\n                        _throwInternal(_logger, 2 , 25 , \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                    }\n                    return;\n                }\n                var pageViewSent = false;\n                var customDuration;\n                var start = pageViewPerformanceManager[_DYN_GET_PERFORMANCE_TIMI17 ]()[_DYN_NAVIGATION_START ];\n                if (start > 0) {\n                    customDuration = dateTimeUtilsDuration(start, +new Date);\n                    if (!pageViewPerformanceManager[_DYN_SHOULD_COLLECT_DURAT18 ](customDuration)) {\n                        customDuration = undefined;\n                    }\n                }\n                var duration;\n                if (!isNullOrUndefined(customProperties) &&\n                    !isNullOrUndefined(customProperties[_DYN_DURATION ])) {\n                    duration = customProperties[_DYN_DURATION ];\n                }\n                if (overridePageViewDuration || !isNaN(duration)) {\n                    if (isNaN(duration)) {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[_DYN_DURATION ] = customDuration;\n                    }\n                    appInsights[_DYN_SEND_PAGE_VIEW_INTER10 ](pageView, customProperties);\n                    _flushChannels(true);\n                    pageViewSent = true;\n                }\n                var maxDurationLimit = 60000;\n                if (!customProperties) {\n                    customProperties = {};\n                }\n                _addQueue(function () {\n                    var processed = false;\n                    try {\n                        if (pageViewPerformanceManager[_DYN_IS_PERFORMANCE_TIMIN19 ]()) {\n                            processed = true;\n                            var pageViewPerformance = {\n                                name: name,\n                                uri: uri\n                            };\n                            pageViewPerformanceManager[_DYN_POPULATE_PAGE_VIEW_P12 ](pageViewPerformance);\n                            if (!pageViewPerformance.isValid && !pageViewSent) {\n                                customProperties[_DYN_DURATION ] = customDuration;\n                                appInsights[_DYN_SEND_PAGE_VIEW_INTER10 ](pageView, customProperties);\n                            }\n                            else {\n                                if (!pageViewSent) {\n                                    customProperties[_DYN_DURATION ] = pageViewPerformance.durationMs;\n                                    appInsights[_DYN_SEND_PAGE_VIEW_INTER10 ](pageView, customProperties);\n                                }\n                                if (!pageViewPerformanceSent) {\n                                    appInsights[_DYN_SEND_PAGE_VIEW_PERFO11 ](pageViewPerformance, customProperties);\n                                    pageViewPerformanceSent = true;\n                                }\n                            }\n                        }\n                        else if (start > 0 && dateTimeUtilsDuration(start, +new Date) > maxDurationLimit) {\n                            processed = true;\n                            if (!pageViewSent) {\n                                customProperties[_DYN_DURATION ] = maxDurationLimit;\n                                appInsights[_DYN_SEND_PAGE_VIEW_INTER10 ](pageView, customProperties);\n                            }\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(_logger, 1 , 38 , \"trackPageView failed on page load calculation: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                    return processed;\n                });\n            };\n            _self.teardown = function (unloadCtx, unloadState) {\n                if (queueTimer) {\n                    clearTimeout(queueTimer);\n                    queueTimer = null;\n                    var allItems = itemQueue.slice(0);\n                    itemQueue = [];\n                    arrForEach(allItems, function (item) {\n                        if (item()) ;\n                    });\n                }\n            };\n        });\n    }\n    PageViewManager.__ieDyn=1;\n    return PageViewManager;\n}());\n\nvar MAX_DURATION_ALLOWED = 3600000;\nvar botAgentNames = [\"googlebot\", \"adsbot-google\", \"apis-google\", \"mediapartners-google\"];\nfunction _isPerformanceTimingSupported() {\n    var perf = getPerformance();\n    return perf && !!perf.timing;\n}\nfunction _isPerformanceNavigationTimingSupported() {\n    var perf = getPerformance();\n    return perf && perf.getEntriesByType && perf.getEntriesByType(\"navigation\")[_DYN_LENGTH$2 ] > 0;\n}\nfunction _isPerformanceTimingDataReady() {\n    var perf = getPerformance();\n    var timing = perf ? perf.timing : 0;\n    return timing\n        && timing.domainLookupStart > 0\n        && timing[_DYN_NAVIGATION_START ] > 0\n        && timing[_DYN_RESPONSE_START ] > 0\n        && timing[_DYN_REQUEST_START ] > 0\n        && timing[_DYN_LOAD_EVENT_END ] > 0\n        && timing[_DYN_RESPONSE_END ] > 0\n        && timing[_DYN_CONNECT_END ] > 0\n        && timing.domLoading > 0;\n}\nfunction _getPerformanceTiming() {\n    if (_isPerformanceTimingSupported()) {\n        return getPerformance().timing;\n    }\n    return null;\n}\nfunction _getPerformanceNavigationTiming() {\n    if (_isPerformanceNavigationTimingSupported()) {\n        return getPerformance()[_DYN_GET_ENTRIES_BY_TYPE ](\"navigation\")[0];\n    }\n    return null;\n}\nfunction _shouldCollectDuration() {\n    var durations = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        durations[_i] = arguments[_i];\n    }\n    var _navigator = getNavigator() || {};\n    var userAgent = _navigator.userAgent;\n    var isGoogleBot = false;\n    if (userAgent) {\n        for (var i = 0; i < botAgentNames[_DYN_LENGTH$2 ]; i++) {\n            isGoogleBot = isGoogleBot || userAgent.toLowerCase().indexOf(botAgentNames[i]) !== -1;\n        }\n    }\n    if (isGoogleBot) {\n        return false;\n    }\n    else {\n        for (var i = 0; i < durations[_DYN_LENGTH$2 ]; i++) {\n            if (durations[i] < 0 || durations[i] >= MAX_DURATION_ALLOWED) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nvar PageViewPerformanceManager = /** @class */ (function () {\n    function PageViewPerformanceManager(core) {\n        var _logger = safeGetLogger(core);\n        dynamicProto(PageViewPerformanceManager, this, function (_self) {\n            _self[_DYN_POPULATE_PAGE_VIEW_P12 ] = function (pageViewPerformance) {\n                pageViewPerformance.isValid = false;\n                var navigationTiming = _getPerformanceNavigationTiming();\n                var timing = _getPerformanceTiming();\n                var total = 0;\n                var network = 0;\n                var request = 0;\n                var response = 0;\n                var dom = 0;\n                if (navigationTiming || timing) {\n                    if (navigationTiming) {\n                        total = navigationTiming[_DYN_DURATION ];\n                        network = navigationTiming.startTime === 0 ? navigationTiming[_DYN_CONNECT_END ] : dateTimeUtilsDuration(navigationTiming.startTime, navigationTiming[_DYN_CONNECT_END ]);\n                        request = dateTimeUtilsDuration(navigationTiming.requestStart, navigationTiming[_DYN_RESPONSE_START ]);\n                        response = dateTimeUtilsDuration(navigationTiming[_DYN_RESPONSE_START ], navigationTiming[_DYN_RESPONSE_END ]);\n                        dom = dateTimeUtilsDuration(navigationTiming.responseEnd, navigationTiming[_DYN_LOAD_EVENT_END ]);\n                    }\n                    else {\n                        total = dateTimeUtilsDuration(timing[_DYN_NAVIGATION_START ], timing[_DYN_LOAD_EVENT_END ]);\n                        network = dateTimeUtilsDuration(timing[_DYN_NAVIGATION_START ], timing[_DYN_CONNECT_END ]);\n                        request = dateTimeUtilsDuration(timing.requestStart, timing[_DYN_RESPONSE_START ]);\n                        response = dateTimeUtilsDuration(timing[_DYN_RESPONSE_START ], timing[_DYN_RESPONSE_END ]);\n                        dom = dateTimeUtilsDuration(timing.responseEnd, timing[_DYN_LOAD_EVENT_END ]);\n                    }\n                    if (total === 0) {\n                        _throwInternal(_logger, 2 , 10 , \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                    }\n                    else if (!_self[_DYN_SHOULD_COLLECT_DURAT18 ](total, network, request, response, dom)) {\n                        _throwInternal(_logger, 2 , 45 , \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                    }\n                    else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                        _throwInternal(_logger, 2 , 8 , \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                    }\n                    else {\n                        pageViewPerformance.durationMs = total;\n                        pageViewPerformance.perfTotal = pageViewPerformance[_DYN_DURATION ] = msToTimeSpan(total);\n                        pageViewPerformance.networkConnect = msToTimeSpan(network);\n                        pageViewPerformance.sentRequest = msToTimeSpan(request);\n                        pageViewPerformance.receivedResponse = msToTimeSpan(response);\n                        pageViewPerformance.domProcessing = msToTimeSpan(dom);\n                        pageViewPerformance.isValid = true;\n                    }\n                }\n            };\n            _self[_DYN_GET_PERFORMANCE_TIMI17 ] = _getPerformanceTiming;\n            _self[_DYN_IS_PERFORMANCE_TIMIN16 ] = _isPerformanceTimingSupported;\n            _self[_DYN_IS_PERFORMANCE_TIMIN19 ] = _isPerformanceTimingDataReady;\n            _self[_DYN_SHOULD_COLLECT_DURAT18 ] = _shouldCollectDuration;\n        });\n    }\n    PageViewPerformanceManager.__ieDyn=1;\n    return PageViewPerformanceManager;\n}());\n\nvar PageVisitTimeManager = /** @class */ (function () {\n    function PageVisitTimeManager(logger, pageVisitTimeTrackingHandler) {\n        var prevPageVisitDataKeyName = \"prevPageVisitData\";\n        dynamicProto(PageVisitTimeManager, this, function (_self) {\n            _self[_DYN_TRACK_PREVIOUS_PAGE_9 ] = function (currentPageName, currentPageUrl) {\n                try {\n                    var prevPageVisitTimeData = restartPageVisitTimer(currentPageName, currentPageUrl);\n                    if (prevPageVisitTimeData) {\n                        pageVisitTimeTrackingHandler(prevPageVisitTimeData.pageName, prevPageVisitTimeData.pageUrl, prevPageVisitTimeData.pageVisitTime);\n                    }\n                }\n                catch (e) {\n                    _warnToConsole(logger, \"Auto track page visit time failed, metric will not be collected: \" + dumpObj(e));\n                }\n            };\n            function restartPageVisitTimer(pageName, pageUrl) {\n                var prevPageVisitData = null;\n                try {\n                    prevPageVisitData = stopPageVisitTimer();\n                    startPageVisitTimer(pageName, pageUrl);\n                }\n                catch (e) {\n                    _warnToConsole(logger, \"Call to restart failed: \" + dumpObj(e));\n                    prevPageVisitData = null;\n                }\n                return prevPageVisitData;\n            }\n            function startPageVisitTimer(pageName, pageUrl) {\n                try {\n                    if (utlCanUseSessionStorage()) {\n                        if (utlGetSessionStorage(logger, prevPageVisitDataKeyName) != null) {\n                            throwError(\"Cannot call startPageVisit consecutively without first calling stopPageVisit\");\n                        }\n                        var currPageVisitData = new PageVisitData(pageName, pageUrl);\n                        var currPageVisitDataStr = getJSON().stringify(currPageVisitData);\n                        utlSetSessionStorage(logger, prevPageVisitDataKeyName, currPageVisitDataStr);\n                    }\n                }\n                catch (e) {\n                    _warnToConsole(logger, \"Call to start failed: \" + dumpObj(e));\n                }\n            }\n            function stopPageVisitTimer() {\n                var prevPageVisitData = null;\n                try {\n                    if (utlCanUseSessionStorage()) {\n                        var pageVisitEndTime = dateNow();\n                        var pageVisitDataJsonStr = utlGetSessionStorage(logger, prevPageVisitDataKeyName);\n                        if (pageVisitDataJsonStr && hasJSON()) {\n                            prevPageVisitData = getJSON().parse(pageVisitDataJsonStr);\n                            prevPageVisitData.pageVisitTime = pageVisitEndTime - prevPageVisitData[_DYN_PAGE_VISIT_START_TIM20 ];\n                            utlRemoveSessionStorage(logger, prevPageVisitDataKeyName);\n                        }\n                    }\n                }\n                catch (e) {\n                    _warnToConsole(logger, \"Stop page visit timer failed: \" + dumpObj(e));\n                    prevPageVisitData = null;\n                }\n                return prevPageVisitData;\n            }\n            objDefineAccessors(_self, \"_logger\", function () { return logger; });\n            objDefineAccessors(_self, \"pageVisitTimeTrackingHandler\", function () { return pageVisitTimeTrackingHandler; });\n        });\n    }\n    PageVisitTimeManager.__ieDyn=1;\n    return PageVisitTimeManager;\n}());\nvar PageVisitData = /** @class */ (function () {\n    function PageVisitData(pageName, pageUrl) {\n        this[_DYN_PAGE_VISIT_START_TIM20 ] = dateNow();\n        this.pageName = pageName;\n        this.pageUrl = pageUrl;\n    }\n    return PageVisitData;\n}());\n\nvar Timing = /** @class */ (function () {\n    function Timing(logger, name) {\n        var _self = this;\n        var _events = {};\n        _self.start = function (name) {\n            if (typeof _events[name] !== \"undefined\") {\n                _throwInternal(logger, 2 , 62 , \"start was called more than once for this event without calling stop.\", { name: name, key: name }, true);\n            }\n            _events[name] = +new Date;\n        };\n        _self.stop = function (name, url, properties, measurements) {\n            var start = _events[name];\n            if (isNaN(start)) {\n                _throwInternal(logger, 2 , 63 , \"stop was called without a corresponding start.\", { name: name, key: name }, true);\n            }\n            else {\n                var end = +new Date;\n                var duration = dateTimeUtilsDuration(start, end);\n                _self.action(name, url, duration, properties, measurements);\n            }\n            delete _events[name];\n            _events[name] = undefined;\n        };\n    }\n    return Timing;\n}());\n\nvar strEvent = \"event\";\nfunction _dispatchEvent(target, evnt) {\n    if (target && target.dispatchEvent && evnt) {\n        target.dispatchEvent(evnt);\n    }\n}\nfunction _getReason(error) {\n    if (error && error.reason) {\n        var reason = error.reason;\n        if (!isString(reason) && isFunction(reason[_DYN_TO_STRING$1 ])) {\n            return reason[_DYN_TO_STRING$1 ]();\n        }\n        return dumpObj(reason);\n    }\n    return error || \"\";\n}\nvar MinMilliSeconds = 60000;\nfunction _configMilliseconds(value, defValue) {\n    value = value || defValue;\n    if (value < MinMilliSeconds) {\n        value = MinMilliSeconds;\n    }\n    return value;\n}\nfunction _getDefaultConfig(config) {\n    if (!config) {\n        config = {};\n    }\n    config.sessionRenewalMs = _configMilliseconds(config.sessionRenewalMs, 30 * 60 * 1000);\n    config.sessionExpirationMs = _configMilliseconds(config.sessionExpirationMs, 24 * 60 * 60 * 1000);\n    config[_DYN_DISABLE_EXCEPTION_TR0 ] = stringToBoolOrDefault(config[_DYN_DISABLE_EXCEPTION_TR0 ]);\n    config[_DYN_AUTO_TRACK_PAGE_VISI1 ] = stringToBoolOrDefault(config[_DYN_AUTO_TRACK_PAGE_VISI1 ]);\n    config[_DYN_OVERRIDE_PAGE_VIEW_D2 ] = stringToBoolOrDefault(config[_DYN_OVERRIDE_PAGE_VIEW_D2 ]);\n    config[_DYN_ENABLE_UNHANDLED_PRO3 ] = stringToBoolOrDefault(config[_DYN_ENABLE_UNHANDLED_PRO3 ]);\n    if (isNaN(config[_DYN_SAMPLING_PERCENTAGE$1 ]) || config[_DYN_SAMPLING_PERCENTAGE$1 ] <= 0 || config[_DYN_SAMPLING_PERCENTAGE$1 ] >= 100) {\n        config[_DYN_SAMPLING_PERCENTAGE$1 ] = 100;\n    }\n    config[_DYN_IS_STORAGE_USE_DISAB4 ] = stringToBoolOrDefault(config[_DYN_IS_STORAGE_USE_DISAB4 ]);\n    config[_DYN_IS_BROWSER_LINK_TRAC5 ] = stringToBoolOrDefault(config[_DYN_IS_BROWSER_LINK_TRAC5 ]);\n    config[_DYN_ENABLE_AUTO_ROUTE_TR6 ] = stringToBoolOrDefault(config[_DYN_ENABLE_AUTO_ROUTE_TR6 ]);\n    config[_DYN_NAME_PREFIX$2 ] = config[_DYN_NAME_PREFIX$2 ] || \"\";\n    config.enableDebug = stringToBoolOrDefault(config.enableDebug);\n    config[_DYN_DISABLE_FLUSH_ON_BEF7 ] = stringToBoolOrDefault(config[_DYN_DISABLE_FLUSH_ON_BEF7 ]);\n    config.disableFlushOnUnload = stringToBoolOrDefault(config.disableFlushOnUnload, config[_DYN_DISABLE_FLUSH_ON_BEF7 ]);\n    return config;\n}\nfunction _updateStorageUsage(extConfig) {\n    if (!isUndefined(extConfig[_DYN_IS_STORAGE_USE_DISAB4 ])) {\n        if (extConfig[_DYN_IS_STORAGE_USE_DISAB4 ]) {\n            utlDisableStorage();\n        }\n        else {\n            utlEnableStorage();\n        }\n    }\n}\nvar AnalyticsPlugin = /** @class */ (function (_super) {\n    __extendsFn(AnalyticsPlugin, _super);\n    function AnalyticsPlugin() {\n        var _this = _super.call(this) || this;\n        _this.identifier = AnalyticsPluginIdentifier;\n        _this.priority = 180;\n        _this.autoRoutePVDelay = 500;\n        var _eventTracking;\n        var _pageTracking;\n        var _pageViewManager;\n        var _pageViewPerformanceManager;\n        var _pageVisitTimeManager;\n        var _preInitTelemetryInitializers;\n        var _isBrowserLinkTrackingEnabled;\n        var _browserLinkInitializerAdded;\n        var _enableAutoRouteTracking;\n        var _historyListenerAdded;\n        var _disableExceptionTracking;\n        var _autoExceptionInstrumented;\n        var _enableUnhandledPromiseRejectionTracking;\n        var _autoUnhandledPromiseInstrumented;\n        var _prevUri;\n        var _currUri;\n        var _evtNamespace;\n        dynamicProto(AnalyticsPlugin, _this, function (_self, _base) {\n            var _addHook = _base._addHook;\n            _initDefaults();\n            _self.getCookieMgr = function () {\n                return safeGetCookieMgr(_self[_DYN_CORE ]);\n            };\n            _self.processTelemetry = function (env, itemCtx) {\n                _self.processNext(env, itemCtx);\n            };\n            _self.trackEvent = function (event, customProperties) {\n                try {\n                    var telemetryItem = createTelemetryItem(event, Event$1[_DYN_DATA_TYPE$1 ], Event$1[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                    _self[_DYN_CORE ][_DYN_TRACK ](telemetryItem);\n                }\n                catch (e) {\n                    _throwInternal(2 , 39 , \"trackTrace failed, trace will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.startTrackEvent = function (name) {\n                try {\n                    _eventTracking.start(name);\n                }\n                catch (e) {\n                    _throwInternal(1 , 29 , \"startTrackEvent failed, event will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.stopTrackEvent = function (name, properties, measurements) {\n                try {\n                    _eventTracking.stop(name, undefined, properties, measurements);\n                }\n                catch (e) {\n                    _throwInternal(1 , 30 , \"stopTrackEvent failed, event will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.trackTrace = function (trace, customProperties) {\n                try {\n                    var telemetryItem = createTelemetryItem(trace, Trace[_DYN_DATA_TYPE$1 ], Trace[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                    _self[_DYN_CORE ][_DYN_TRACK ](telemetryItem);\n                }\n                catch (e) {\n                    _throwInternal(2 , 39 , \"trackTrace failed, trace will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.trackMetric = function (metric, customProperties) {\n                try {\n                    var telemetryItem = createTelemetryItem(metric, Metric[_DYN_DATA_TYPE$1 ], Metric[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                    _self[_DYN_CORE ][_DYN_TRACK ](telemetryItem);\n                }\n                catch (e) {\n                    _throwInternal(1 , 36 , \"trackMetric failed, metric will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN_TRACK_PAGE_VIEW ] = function (pageView, customProperties) {\n                try {\n                    var inPv = pageView || {};\n                    _pageViewManager[_DYN_TRACK_PAGE_VIEW ](inPv, __assignFn(__assignFn(__assignFn({}, inPv.properties), inPv.measurements), customProperties));\n                    if (_self.config[_DYN_AUTO_TRACK_PAGE_VISI1 ]) {\n                        _pageVisitTimeManager[_DYN_TRACK_PREVIOUS_PAGE_9 ](inPv.name, inPv.uri);\n                    }\n                }\n                catch (e) {\n                    _throwInternal(1 , 37 , \"trackPageView failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN_SEND_PAGE_VIEW_INTER10 ] = function (pageView, properties, systemProperties) {\n                var doc = getDocument();\n                if (doc) {\n                    pageView.refUri = pageView.refUri === undefined ? doc.referrer : pageView.refUri;\n                }\n                var telemetryItem = createTelemetryItem(pageView, PageView[_DYN_DATA_TYPE$1 ], PageView[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties, systemProperties);\n                _self[_DYN_CORE ][_DYN_TRACK ](telemetryItem);\n            };\n            _self[_DYN_SEND_PAGE_VIEW_PERFO11 ] = function (pageViewPerformance, properties, systemProperties) {\n                var telemetryItem = createTelemetryItem(pageViewPerformance, PageViewPerformance[_DYN_DATA_TYPE$1 ], PageViewPerformance[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties, systemProperties);\n                _self[_DYN_CORE ][_DYN_TRACK ](telemetryItem);\n            };\n            _self.trackPageViewPerformance = function (pageViewPerformance, customProperties) {\n                var inPvp = pageViewPerformance || {};\n                try {\n                    _pageViewPerformanceManager[_DYN_POPULATE_PAGE_VIEW_P12 ](inPvp);\n                    _self[_DYN_SEND_PAGE_VIEW_PERFO11 ](inPvp, customProperties);\n                }\n                catch (e) {\n                    _throwInternal(1 , 37 , \"trackPageViewPerformance failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.startTrackPage = function (name) {\n                try {\n                    if (typeof name !== \"string\") {\n                        var doc = getDocument();\n                        name = doc && doc.title || \"\";\n                    }\n                    _pageTracking.start(name);\n                }\n                catch (e) {\n                    _throwInternal(1 , 31 , \"startTrackPage failed, page view may not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.stopTrackPage = function (name, url, properties, measurement) {\n                try {\n                    if (typeof name !== \"string\") {\n                        var doc = getDocument();\n                        name = doc && doc.title || \"\";\n                    }\n                    if (typeof url !== \"string\") {\n                        var loc = getLocation();\n                        url = loc && loc[_DYN_HREF ] || \"\";\n                    }\n                    _pageTracking.stop(name, url, properties, measurement);\n                    if (_self.config[_DYN_AUTO_TRACK_PAGE_VISI1 ]) {\n                        _pageVisitTimeManager[_DYN_TRACK_PREVIOUS_PAGE_9 ](name, url);\n                    }\n                }\n                catch (e) {\n                    _throwInternal(1 , 32 , \"stopTrackPage failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN_SEND_EXCEPTION_INTER13 ] = function (exception, customProperties, systemProperties) {\n                var theError = (exception && (exception[_DYN_EXCEPTION ] || exception[_DYN_ERROR ])) ||\n                    isError(exception) && exception ||\n                    { name: (exception && typeof exception), message: exception || strNotSpecified };\n                exception = exception || {};\n                var exceptionPartB = new Exception(_self[_DYN_DIAG_LOG$1 ](), theError, exception.properties || customProperties, exception.measurements, exception.severityLevel, exception.id).toInterface();\n                var telemetryItem = createTelemetryItem(exceptionPartB, Exception[_DYN_DATA_TYPE$1 ], Exception[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties, systemProperties);\n                _self[_DYN_CORE ][_DYN_TRACK ](telemetryItem);\n            };\n            _self.trackException = function (exception, customProperties) {\n                if (exception && !exception[_DYN_EXCEPTION ] && exception[_DYN_ERROR ]) {\n                    exception[_DYN_EXCEPTION ] = exception[_DYN_ERROR ];\n                }\n                try {\n                    _self[_DYN_SEND_EXCEPTION_INTER13 ](exception, customProperties);\n                }\n                catch (e) {\n                    _throwInternal(1 , 35 , \"trackException failed, exception will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN__ONERROR ] = function (exception) {\n                var error = exception && exception[_DYN_ERROR ];\n                var evt = exception && exception.evt;\n                try {\n                    if (!evt) {\n                        var _window = getWindow();\n                        if (_window) {\n                            evt = _window[strEvent];\n                        }\n                    }\n                    var url = (exception && exception.url) || (getDocument() || {}).URL;\n                    var errorSrc = exception[_DYN_ERROR_SRC ] || \"window.onerror@\" + url + \":\" + (exception[_DYN_LINE_NUMBER ] || 0) + \":\" + (exception[_DYN_COLUMN_NUMBER ] || 0);\n                    var properties = {\n                        errorSrc: errorSrc,\n                        url: url,\n                        lineNumber: exception[_DYN_LINE_NUMBER ] || 0,\n                        columnNumber: exception[_DYN_COLUMN_NUMBER ] || 0,\n                        message: exception[_DYN_MESSAGE ]\n                    };\n                    if (isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception[_DYN_ERROR ])) {\n                        _sendCORSException(Exception[_DYN__CREATE_AUTO_EXCEPTI14 ](\"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\", url, exception[_DYN_LINE_NUMBER ] || 0, exception[_DYN_COLUMN_NUMBER ] || 0, error, evt, null, errorSrc), properties);\n                    }\n                    else {\n                        if (!exception[_DYN_ERROR_SRC ]) {\n                            exception[_DYN_ERROR_SRC ] = errorSrc;\n                        }\n                        _self.trackException({ exception: exception, severityLevel: 3  }, properties);\n                    }\n                }\n                catch (e) {\n                    var errorString = error ? (error.name + \", \" + error[_DYN_MESSAGE ]) : \"null\";\n                    _throwInternal(1 , 11 , \"_onError threw exception while logging error, error will not be collected: \"\n                        + getExceptionName(e), { exception: dumpObj(e), errorString: errorString });\n                }\n            };\n            _self[_DYN_ADD_TELEMETRY_INITIA15 ] = function (telemetryInitializer) {\n                if (_self[_DYN_CORE ]) {\n                    return _self[_DYN_CORE ][_DYN_ADD_TELEMETRY_INITIA15 ](telemetryInitializer);\n                }\n                if (!_preInitTelemetryInitializers) {\n                    _preInitTelemetryInitializers = [];\n                }\n                _preInitTelemetryInitializers.push(telemetryInitializer);\n            };\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                if (_self.isInitialized()) {\n                    return;\n                }\n                if (isNullOrUndefined(core)) {\n                    throwError(\"Error initializing\");\n                }\n                _base.initialize(config, core, extensions, pluginChain);\n                if (config.storagePrefix) {\n                    utlSetStoragePrefix(config.storagePrefix);\n                }\n                try {\n                    _evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());\n                    if (_preInitTelemetryInitializers) {\n                        arrForEach(_preInitTelemetryInitializers, function (initializer) {\n                            core[_DYN_ADD_TELEMETRY_INITIA15 ](initializer);\n                        });\n                        _preInitTelemetryInitializers = null;\n                    }\n                    var extConfig = _populateDefaults(config);\n                    _updateStorageUsage(extConfig);\n                    _pageViewPerformanceManager = new PageViewPerformanceManager(_self[_DYN_CORE ]);\n                    _pageViewManager = new PageViewManager(_self, extConfig[_DYN_OVERRIDE_PAGE_VIEW_D2 ], _self[_DYN_CORE ], _pageViewPerformanceManager);\n                    _pageVisitTimeManager = new PageVisitTimeManager(_self[_DYN_DIAG_LOG$1 ](), function (pageName, pageUrl, pageVisitTime) { return trackPageVisitTime(pageName, pageUrl, pageVisitTime); });\n                    _updateBrowserLinkTracking(extConfig, config);\n                    _eventTracking = new Timing(_self[_DYN_DIAG_LOG$1 ](), \"trackEvent\");\n                    _eventTracking.action =\n                        function (name, url, duration, properties, measurements) {\n                            if (!properties) {\n                                properties = {};\n                            }\n                            if (!measurements) {\n                                measurements = {};\n                            }\n                            properties.duration = duration[_DYN_TO_STRING$1 ]();\n                            _self.trackEvent({ name: name, properties: properties, measurements: measurements });\n                        };\n                    _pageTracking = new Timing(_self[_DYN_DIAG_LOG$1 ](), \"trackPageView\");\n                    _pageTracking.action = function (name, url, duration, properties, measurements) {\n                        if (isNullOrUndefined(properties)) {\n                            properties = {};\n                        }\n                        properties.duration = duration[_DYN_TO_STRING$1 ]();\n                        var pageViewItem = {\n                            name: name,\n                            uri: url,\n                            properties: properties,\n                            measurements: measurements\n                        };\n                        _self[_DYN_SEND_PAGE_VIEW_INTER10 ](pageViewItem, properties);\n                    };\n                    if (hasWindow()) {\n                        _updateExceptionTracking(extConfig);\n                        _updateLocationChange(extConfig);\n                    }\n                }\n                catch (e) {\n                    _self.setInitialized(false);\n                    throw e;\n                }\n            };\n            _self._doTeardown = function (unloadCtx, unloadState) {\n                _pageViewManager && _pageViewManager.teardown(unloadCtx, unloadState);\n                eventOff(window, null, null, _evtNamespace);\n                _initDefaults();\n            };\n            function _populateDefaults(config) {\n                var ctx = createProcessTelemetryContext(null, config, _self[_DYN_CORE ]);\n                var identifier = _self.identifier;\n                var defaults = _getDefaultConfig(config);\n                var extConfig = _self.config = ctx.getExtCfg(identifier);\n                if (defaults !== undefined) {\n                    objForEachKey(defaults, function (field, value) {\n                        extConfig[field] = ctx.getConfig(identifier, field, value);\n                        if (extConfig[field] === undefined) {\n                            extConfig = value;\n                        }\n                    });\n                }\n                return extConfig;\n            }\n            function _updateBrowserLinkTracking(extConfig, config) {\n                _isBrowserLinkTrackingEnabled = extConfig[_DYN_IS_BROWSER_LINK_TRAC5 ] || config[_DYN_IS_BROWSER_LINK_TRAC5 ];\n                _addDefaultTelemetryInitializers();\n            }\n            function trackPageVisitTime(pageName, pageUrl, pageVisitTime) {\n                var properties = { PageName: pageName, PageUrl: pageUrl };\n                _self.trackMetric({\n                    name: \"PageVisitTime\",\n                    average: pageVisitTime,\n                    max: pageVisitTime,\n                    min: pageVisitTime,\n                    sampleCount: 1\n                }, properties);\n            }\n            function _addDefaultTelemetryInitializers() {\n                if (!_browserLinkInitializerAdded && _isBrowserLinkTrackingEnabled) {\n                    var browserLinkPaths_1 = [\"/browserLinkSignalR/\", \"/__browserLink/\"];\n                    var dropBrowserLinkRequests = function (envelope) {\n                        if (_isBrowserLinkTrackingEnabled && envelope.baseType === RemoteDependencyData[_DYN_DATA_TYPE$1 ]) {\n                            var remoteData = envelope.baseData;\n                            if (remoteData) {\n                                for (var i = 0; i < browserLinkPaths_1[_DYN_LENGTH$2 ]; i++) {\n                                    if (remoteData.target && remoteData.target.indexOf(browserLinkPaths_1[i]) >= 0) {\n                                        return false;\n                                    }\n                                }\n                            }\n                        }\n                        return true;\n                    };\n                    _self[_DYN_ADD_TELEMETRY_INITIA15 ](dropBrowserLinkRequests);\n                    _browserLinkInitializerAdded = true;\n                }\n            }\n            function _sendCORSException(exception, properties) {\n                var telemetryItem = createTelemetryItem(exception, Exception[_DYN_DATA_TYPE$1 ], Exception[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties);\n                _self[_DYN_CORE ][_DYN_TRACK ](telemetryItem);\n            }\n            function _updateExceptionTracking(extConfig) {\n                var _window = getWindow();\n                var locn = getLocation(true);\n                _disableExceptionTracking = extConfig[_DYN_DISABLE_EXCEPTION_TR0 ];\n                if (!_disableExceptionTracking && !_autoExceptionInstrumented && !extConfig.autoExceptionInstrumented) {\n                    _addHook(InstrumentEvent(_window, \"onerror\", {\n                        ns: _evtNamespace,\n                        rsp: function (callDetails, message, url, lineNumber, columnNumber, error) {\n                            if (!_disableExceptionTracking && callDetails.rslt !== true) {\n                                _self[_DYN__ONERROR ](Exception[_DYN__CREATE_AUTO_EXCEPTI14 ](message, url, lineNumber, columnNumber, error, callDetails.evt));\n                            }\n                        }\n                    }, false));\n                    _autoExceptionInstrumented = true;\n                }\n                _addUnhandledPromiseRejectionTracking(extConfig, _window, locn);\n            }\n            function _updateLocationChange(extConfig) {\n                var win = getWindow();\n                var locn = getLocation(true);\n                _enableAutoRouteTracking = extConfig[_DYN_ENABLE_AUTO_ROUTE_TR6 ] === true;\n                if (win && _enableAutoRouteTracking && hasHistory()) {\n                    var _history = getHistory();\n                    if (isFunction(_history.pushState) && isFunction(_history.replaceState) && typeof Event !== strShimUndefined) {\n                        _addHistoryListener(extConfig, win, _history, locn);\n                    }\n                }\n            }\n            function _getDistributedTraceCtx() {\n                var distributedTraceCtx = null;\n                if (_self[_DYN_CORE ] && _self[_DYN_CORE ].getTraceCtx) {\n                    distributedTraceCtx = _self[_DYN_CORE ].getTraceCtx(false);\n                }\n                if (!distributedTraceCtx) {\n                    var properties = _self[_DYN_CORE ].getPlugin(PropertiesPluginIdentifier);\n                    if (properties) {\n                        var context = properties.plugin.context;\n                        if (context) {\n                            distributedTraceCtx = createDistributedTraceContextFromTrace(context.telemetryTrace);\n                        }\n                    }\n                }\n                return distributedTraceCtx;\n            }\n            function _addHistoryListener(extConfig, win, history, locn) {\n                var namePrefix = extConfig[_DYN_NAME_PREFIX$2 ] || \"\";\n                function _popstateHandler() {\n                    if (_enableAutoRouteTracking) {\n                        _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                    }\n                }\n                function _locationChangeHandler() {\n                    if (_currUri) {\n                        _prevUri = _currUri;\n                        _currUri = locn && locn[_DYN_HREF ] || \"\";\n                    }\n                    else {\n                        _currUri = locn && locn[_DYN_HREF ] || \"\";\n                    }\n                    if (_enableAutoRouteTracking) {\n                        var distributedTraceCtx = _getDistributedTraceCtx();\n                        if (distributedTraceCtx) {\n                            distributedTraceCtx.setTraceId(generateW3CId());\n                            var traceLocationName = \"_unknown_\";\n                            if (locn && locn.pathname) {\n                                traceLocationName = locn.pathname + (locn.hash || \"\");\n                            }\n                            distributedTraceCtx.setName(dataSanitizeString(_self[_DYN_DIAG_LOG$1 ](), traceLocationName));\n                        }\n                        setTimeout((function (uri) {\n                            _self[_DYN_TRACK_PAGE_VIEW ]({ refUri: uri, properties: { duration: 0 } });\n                        }).bind(_self, _prevUri), _self.autoRoutePVDelay);\n                    }\n                }\n                if (!_historyListenerAdded) {\n                    _addHook(InstrumentEvent(history, \"pushState\", {\n                        ns: _evtNamespace,\n                        rsp: function () {\n                            if (_enableAutoRouteTracking) {\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"pushState\"));\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                            }\n                        }\n                    }, true));\n                    _addHook(InstrumentEvent(history, \"replaceState\", {\n                        ns: _evtNamespace,\n                        rsp: function () {\n                            if (_enableAutoRouteTracking) {\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"replaceState\"));\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                            }\n                        }\n                    }, true));\n                    eventOn(win, namePrefix + \"popstate\", _popstateHandler, _evtNamespace);\n                    eventOn(win, namePrefix + \"locationchange\", _locationChangeHandler, _evtNamespace);\n                    _historyListenerAdded = true;\n                }\n            }\n            function _addUnhandledPromiseRejectionTracking(extConfig, _window, _location) {\n                _enableUnhandledPromiseRejectionTracking = extConfig[_DYN_ENABLE_UNHANDLED_PRO3 ] === true;\n                if (_enableUnhandledPromiseRejectionTracking && !_autoUnhandledPromiseInstrumented) {\n                    _addHook(InstrumentEvent(_window, \"onunhandledrejection\", {\n                        ns: _evtNamespace,\n                        rsp: function (callDetails, error) {\n                            if (_enableUnhandledPromiseRejectionTracking && callDetails.rslt !== true) {\n                                _self[_DYN__ONERROR ](Exception[_DYN__CREATE_AUTO_EXCEPTI14 ](_getReason(error), _location ? _location[_DYN_HREF ] : \"\", 0, 0, error, callDetails.evt));\n                            }\n                        }\n                    }, false));\n                    _autoUnhandledPromiseInstrumented = true;\n                    extConfig.autoUnhandledPromiseInstrumented = _autoUnhandledPromiseInstrumented;\n                }\n            }\n            function _throwInternal(severity, msgId, msg, properties, isUserAct) {\n                _self[_DYN_DIAG_LOG$1 ]().throwInternal(severity, msgId, msg, properties, isUserAct);\n            }\n            function _initDefaults() {\n                _eventTracking = null;\n                _pageTracking = null;\n                _pageViewManager = null;\n                _pageViewPerformanceManager = null;\n                _pageVisitTimeManager = null;\n                _preInitTelemetryInitializers = null;\n                _isBrowserLinkTrackingEnabled = false;\n                _browserLinkInitializerAdded = false;\n                _enableAutoRouteTracking = false;\n                _historyListenerAdded = false;\n                _disableExceptionTracking = false;\n                _autoExceptionInstrumented = false;\n                _enableUnhandledPromiseRejectionTracking = false;\n                _autoUnhandledPromiseInstrumented = false;\n                var location = getLocation(true);\n                _prevUri = location && location[_DYN_HREF ] || \"\";\n                _currUri = null;\n                _evtNamespace = null;\n            }\n            objDefineAccessors(_self, \"_pageViewManager\", function () { return _pageViewManager; });\n            objDefineAccessors(_self, \"_pageViewPerformanceManager\", function () { return _pageViewPerformanceManager; });\n            objDefineAccessors(_self, \"_pageVisitTimeManager\", function () { return _pageVisitTimeManager; });\n            objDefineAccessors(_self, \"_evtNamespace\", function () { return \".\" + _evtNamespace; });\n        });\n        return _this;\n    }\n    AnalyticsPlugin.Version = '2.8.14';\n    AnalyticsPlugin.getDefaultConfig = _getDefaultConfig;\n    return AnalyticsPlugin;\n}(BaseTelemetryPlugin));\n\nvar STR_DURATION = \"duration\";\n\nvar _DYN_TAGS = \"tags\";\nvar _DYN_DEVICE_TYPE = \"deviceType\";\nvar _DYN_DATA = \"data\";\nvar _DYN_NAME = \"name\";\nvar _DYN_TRACE_ID = \"traceID\";\nvar _DYN_LENGTH$1 = \"length\";\nvar _DYN_STRINGIFY = \"stringify\";\nvar _DYN_MEASUREMENTS = \"measurements\";\nvar _DYN_DATA_TYPE = \"dataType\";\nvar _DYN_ENVELOPE_TYPE = \"envelopeType\";\nvar _DYN_TO_STRING = \"toString\";\nvar _DYN_ON_LINE = \"onLine\";\nvar _DYN_IS_ONLINE = \"isOnline\";\nvar _DYN_ENQUEUE = \"enqueue\";\nvar _DYN_COUNT = \"count\";\nvar _DYN_PUSH = \"push\";\nvar _DYN_EMIT_LINE_DELIMITED_0 = \"emitLineDelimitedJson\";\nvar _DYN_CLEAR = \"clear\";\nvar _DYN_BATCH_PAYLOADS = \"batchPayloads\";\nvar _DYN_MARK_AS_SENT = \"markAsSent\";\nvar _DYN_CLEAR_SENT = \"clearSent\";\nvar _DYN_BUFFER_OVERRIDE = \"bufferOverride\";\nvar _DYN__BUFFER__KEY = \"BUFFER_KEY\";\nvar _DYN__SENT__BUFFER__KEY = \"SENT_BUFFER_KEY\";\nvar _DYN__MAX__BUFFER__SIZE = \"MAX_BUFFER_SIZE\";\nvar _DYN_NAME_PREFIX$1 = \"namePrefix\";\nvar _DYN_MAX_BATCH_SIZE_IN_BY1 = \"maxBatchSizeInBytes\";\nvar _DYN_TRIGGER_SEND = \"triggerSend\";\nvar _DYN_DIAG_LOG = \"diagLog\";\nvar _DYN_ONUNLOAD_DISABLE_BEA2 = \"onunloadDisableBeacon\";\nvar _DYN_IS_BEACON_API_DISABL3 = \"isBeaconApiDisabled\";\nvar _DYN__SENDER = \"_sender\";\nvar _DYN__SENDER_CONFIG = \"_senderConfig\";\nvar _DYN_ENABLE_SESSION_STORA4 = \"enableSessionStorageBuffer\";\nvar _DYN__BUFFER = \"_buffer\";\nvar _DYN_SAMPLING_PERCENTAGE = \"samplingPercentage\";\nvar _DYN_INSTRUMENTATION_KEY = \"instrumentationKey\";\nvar _DYN_ENDPOINT_URL = \"endpointUrl\";\nvar _DYN_CUSTOM_HEADERS = \"customHeaders\";\nvar _DYN_DISABLE_XHR = \"disableXhr\";\nvar _DYN_ONUNLOAD_DISABLE_FET5 = \"onunloadDisableFetch\";\nvar _DYN_DISABLE_TELEMETRY = \"disableTelemetry\";\nvar _DYN_BASE_TYPE = \"baseType\";\nvar _DYN_SAMPLE_RATE = \"sampleRate\";\nvar _DYN_CONVERT_UNDEFINED = \"convertUndefined\";\nvar _DYN__XHR_READY_STATE_CHA6 = \"_xhrReadyStateChange\";\nvar _DYN__ON_ERROR = \"_onError\";\nvar _DYN__ON_PARTIAL_SUCCESS = \"_onPartialSuccess\";\nvar _DYN__ON_SUCCESS = \"_onSuccess\";\nvar _DYN_ITEMS_ACCEPTED = \"itemsAccepted\";\nvar _DYN_ITEMS_RECEIVED = \"itemsReceived\";\nvar _DYN_IS_RETRY_DISABLED = \"isRetryDisabled\";\nvar _DYN_SET_REQUEST_HEADER = \"setRequestHeader\";\nvar _DYN_MAX_BATCH_INTERVAL = \"maxBatchInterval\";\nvar _DYN_EVENTS_SEND_REQUEST = \"eventsSendRequest\";\nvar _DYN_DISABLE_INSTRUMENTAT7 = \"disableInstrumentationKeyValidation\";\nvar _DYN_GET_SAMPLING_SCORE = \"getSamplingScore\";\nvar _DYN_GET_HASH_CODE_SCORE = \"getHashCodeScore\";\n\nvar strBaseType = \"baseType\";\nvar strBaseData = \"baseData\";\nvar strProperties = \"properties\";\nvar strTrue = \"true\";\nfunction _setValueIf(target, field, value) {\n    return setValue(target, field, value, isTruthy);\n}\nfunction _extractPartAExtensions(logger, item, env) {\n    var envTags = env[_DYN_TAGS ] = env[_DYN_TAGS ] || {};\n    var itmExt = item.ext = item.ext || {};\n    var itmTags = item[_DYN_TAGS ] = item[_DYN_TAGS ] || [];\n    var extUser = itmExt.user;\n    if (extUser) {\n        _setValueIf(envTags, CtxTagKeys.userAuthUserId, extUser.authId);\n        _setValueIf(envTags, CtxTagKeys.userId, extUser.id || extUser.localId);\n    }\n    var extApp = itmExt.app;\n    if (extApp) {\n        _setValueIf(envTags, CtxTagKeys.sessionId, extApp.sesId);\n    }\n    var extDevice = itmExt.device;\n    if (extDevice) {\n        _setValueIf(envTags, CtxTagKeys.deviceId, extDevice.id || extDevice.localId);\n        _setValueIf(envTags, CtxTagKeys[_DYN_DEVICE_TYPE ], extDevice.deviceClass);\n        _setValueIf(envTags, CtxTagKeys.deviceIp, extDevice.ip);\n        _setValueIf(envTags, CtxTagKeys.deviceModel, extDevice.model);\n        _setValueIf(envTags, CtxTagKeys[_DYN_DEVICE_TYPE ], extDevice[_DYN_DEVICE_TYPE ]);\n    }\n    var web = item.ext.web;\n    if (web) {\n        _setValueIf(envTags, CtxTagKeys.deviceLanguage, web.browserLang);\n        _setValueIf(envTags, CtxTagKeys.deviceBrowserVersion, web.browserVer);\n        _setValueIf(envTags, CtxTagKeys.deviceBrowser, web.browser);\n        var envData = env[_DYN_DATA ] = env[_DYN_DATA ] || {};\n        var envBaseData = envData[strBaseData] = envData[strBaseData] || {};\n        var envProps = envBaseData[strProperties] = envBaseData[strProperties] || {};\n        _setValueIf(envProps, \"domain\", web.domain);\n        _setValueIf(envProps, \"isManual\", web.isManual ? strTrue : null);\n        _setValueIf(envProps, \"screenRes\", web.screenRes);\n        _setValueIf(envProps, \"userConsent\", web.userConsent ? strTrue : null);\n    }\n    var extOs = itmExt.os;\n    if (extOs) {\n        _setValueIf(envTags, CtxTagKeys.deviceOS, extOs[_DYN_NAME ]);\n    }\n    var extTrace = itmExt.trace;\n    if (extTrace) {\n        _setValueIf(envTags, CtxTagKeys.operationParentId, extTrace.parentID);\n        _setValueIf(envTags, CtxTagKeys.operationName, dataSanitizeString(logger, extTrace[_DYN_NAME ]));\n        _setValueIf(envTags, CtxTagKeys.operationId, extTrace[_DYN_TRACE_ID ]);\n    }\n    var tgs = {};\n    for (var i = itmTags[_DYN_LENGTH$1 ] - 1; i >= 0; i--) {\n        var tg = itmTags[i];\n        objForEachKey(tg, function (key, value) {\n            tgs[key] = value;\n        });\n        itmTags.splice(i, 1);\n    }\n    objForEachKey(itmTags, function (tg, value) {\n        tgs[tg] = value;\n    });\n    var theTags = __assignFn(__assignFn({}, envTags), tgs);\n    if (!theTags[CtxTagKeys.internalSdkVersion]) {\n        theTags[CtxTagKeys.internalSdkVersion] = dataSanitizeString(logger, \"javascript:\".concat(EnvelopeCreator.Version), 64);\n    }\n    env[_DYN_TAGS ] = optimizeObject(theTags);\n}\nfunction _extractPropsAndMeasurements(data, properties, measurements) {\n    if (!isNullOrUndefined(data)) {\n        objForEachKey(data, function (key, value) {\n            if (isNumber(value)) {\n                measurements[key] = value;\n            }\n            else if (isString(value)) {\n                properties[key] = value;\n            }\n            else if (hasJSON()) {\n                properties[key] = getJSON()[_DYN_STRINGIFY ](value);\n            }\n        });\n    }\n}\nfunction _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue) {\n    if (!isNullOrUndefined(properties)) {\n        objForEachKey(properties, function (key, value) {\n            properties[key] = value || customUndefinedValue;\n        });\n    }\n}\nfunction _createEnvelope(logger, envelopeType, telemetryItem, data) {\n    var envelope = new Envelope(logger, data, envelopeType);\n    _setValueIf(envelope, \"sampleRate\", telemetryItem[SampleRate]);\n    if ((telemetryItem[strBaseData] || {}).startTime) {\n        envelope.time = toISOString(telemetryItem[strBaseData].startTime);\n    }\n    envelope.iKey = telemetryItem.iKey;\n    var iKeyNoDashes = telemetryItem.iKey.replace(/-/g, \"\");\n    envelope[_DYN_NAME ] = envelope[_DYN_NAME ].replace(\"{0}\", iKeyNoDashes);\n    _extractPartAExtensions(logger, telemetryItem, envelope);\n    telemetryItem[_DYN_TAGS ] = telemetryItem[_DYN_TAGS ] || [];\n    return optimizeObject(envelope);\n}\nfunction EnvelopeCreatorInit(logger, telemetryItem) {\n    if (isNullOrUndefined(telemetryItem[strBaseData])) {\n        _throwInternal(logger, 1 , 46 , \"telemetryItem.baseData cannot be null.\");\n    }\n}\nvar EnvelopeCreator = {\n    Version: '2.8.14'\n};\nfunction DependencyEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    var customProperties = telemetryItem[strBaseData][strProperties] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    var bd = telemetryItem[strBaseData];\n    if (isNullOrUndefined(bd)) {\n        _warnToConsole(logger, \"Invalid input for dependency data\");\n        return null;\n    }\n    var method = bd[strProperties] && bd[strProperties][HttpMethod] ? bd[strProperties][HttpMethod] : \"GET\";\n    var remoteDepData = new RemoteDependencyData(logger, bd.id, bd.target, bd[_DYN_NAME ], bd[STR_DURATION ], bd.success, bd.responseCode, method, bd.type, bd.correlationContext, customProperties, customMeasurements);\n    var data = new Data(RemoteDependencyData[_DYN_DATA_TYPE ], remoteDepData);\n    return _createEnvelope(logger, RemoteDependencyData[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction EventEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var customProperties = {};\n    var customMeasurements = {};\n    if (telemetryItem[strBaseType] !== Event$1[_DYN_DATA_TYPE ]) {\n        customProperties[\"baseTypeSource\"] = telemetryItem[strBaseType];\n    }\n    if (telemetryItem[strBaseType] === Event$1[_DYN_DATA_TYPE ]) {\n        customProperties = telemetryItem[strBaseData][strProperties] || {};\n        customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    }\n    else {\n        if (telemetryItem[strBaseData]) {\n            _extractPropsAndMeasurements(telemetryItem[strBaseData], customProperties, customMeasurements);\n        }\n    }\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    var eventName = telemetryItem[strBaseData][_DYN_NAME ];\n    var eventData = new Event$1(logger, eventName, customProperties, customMeasurements);\n    var data = new Data(Event$1[_DYN_DATA_TYPE ], eventData);\n    return _createEnvelope(logger, Event$1[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction ExceptionEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    var customProperties = telemetryItem[strBaseData][strProperties] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    var bd = telemetryItem[strBaseData];\n    var exData = Exception.CreateFromInterface(logger, bd, customProperties, customMeasurements);\n    var data = new Data(Exception[_DYN_DATA_TYPE ], exData);\n    return _createEnvelope(logger, Exception[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction MetricEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var baseData = telemetryItem[strBaseData];\n    var props = baseData[strProperties] || {};\n    var measurements = baseData[_DYN_MEASUREMENTS ] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], props, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n    }\n    var baseMetricData = new Metric(logger, baseData[_DYN_NAME ], baseData.average, baseData.sampleCount, baseData.min, baseData.max, baseData.stdDev, props, measurements);\n    var data = new Data(Metric[_DYN_DATA_TYPE ], baseMetricData);\n    return _createEnvelope(logger, Metric[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction PageViewEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var duration;\n    var baseData = telemetryItem[strBaseData];\n    if (!isNullOrUndefined(baseData) &&\n        !isNullOrUndefined(baseData[strProperties]) &&\n        !isNullOrUndefined(baseData[strProperties][STR_DURATION])) {\n        duration = baseData[strProperties][STR_DURATION];\n        delete baseData[strProperties][STR_DURATION];\n    }\n    else if (!isNullOrUndefined(telemetryItem[_DYN_DATA ]) &&\n        !isNullOrUndefined(telemetryItem[_DYN_DATA ][STR_DURATION])) {\n        duration = telemetryItem[_DYN_DATA ][STR_DURATION];\n        delete telemetryItem[_DYN_DATA ][STR_DURATION];\n    }\n    var bd = telemetryItem[strBaseData];\n    var currentContextId;\n    if (((telemetryItem.ext || {}).trace || {})[_DYN_TRACE_ID ]) {\n        currentContextId = telemetryItem.ext.trace[_DYN_TRACE_ID ];\n    }\n    var id = bd.id || currentContextId;\n    var name = bd[_DYN_NAME ];\n    var url = bd.uri;\n    var properties = bd[strProperties] || {};\n    var measurements = bd[_DYN_MEASUREMENTS ] || {};\n    if (!isNullOrUndefined(bd.refUri)) {\n        properties[\"refUri\"] = bd.refUri;\n    }\n    if (!isNullOrUndefined(bd.pageType)) {\n        properties[\"pageType\"] = bd.pageType;\n    }\n    if (!isNullOrUndefined(bd.isLoggedIn)) {\n        properties[\"isLoggedIn\"] = bd.isLoggedIn[_DYN_TO_STRING ]();\n    }\n    if (!isNullOrUndefined(bd[strProperties])) {\n        var pageTags = bd[strProperties];\n        objForEachKey(pageTags, function (key, value) {\n            properties[key] = value;\n        });\n    }\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], properties, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n    }\n    var pageViewData = new PageView(logger, name, url, duration, properties, measurements, id);\n    var data = new Data(PageView[_DYN_DATA_TYPE ], pageViewData);\n    return _createEnvelope(logger, PageView[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction PageViewPerformanceEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var bd = telemetryItem[strBaseData];\n    var name = bd[_DYN_NAME ];\n    var url = bd.uri || bd.url;\n    var properties = bd[strProperties] || {};\n    var measurements = bd[_DYN_MEASUREMENTS ] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], properties, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n    }\n    var baseData = new PageViewPerformance(logger, name, url, undefined, properties, measurements, bd);\n    var data = new Data(PageViewPerformance[_DYN_DATA_TYPE ], baseData);\n    return _createEnvelope(logger, PageViewPerformance[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction TraceEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var message = telemetryItem[strBaseData].message;\n    var severityLevel = telemetryItem[strBaseData].severityLevel;\n    var props = telemetryItem[strBaseData][strProperties] || {};\n    var measurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], props, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n    }\n    var baseData = new Trace(logger, message, severityLevel, props, measurements);\n    var data = new Data(Trace[_DYN_DATA_TYPE ], baseData);\n    return _createEnvelope(logger, Trace[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\n\nfunction _disableEvents(target, evtNamespace) {\n    eventOff(target, null, null, evtNamespace);\n}\nfunction createOfflineListener(parentEvtNamespace) {\n    var _a;\n    var _document = getDocument();\n    var _navigator = getNavigator();\n    var _isListening = false;\n    var _onlineStatus = true;\n    var _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"OfflineListener\"), parentEvtNamespace);\n    try {\n        if (_enableEvents(getWindow())) {\n            _isListening = true;\n        }\n        if (_document) {\n            var target = _document.body || _document;\n            if (target.ononline) {\n                if (_enableEvents(target)) {\n                    _isListening = true;\n                }\n            }\n        }\n        if (_isListening) {\n            if (_navigator && !isNullOrUndefined(_navigator[_DYN_ON_LINE ])) {\n                _onlineStatus = _navigator[_DYN_ON_LINE ];\n            }\n        }\n    }\n    catch (e) {\n        _isListening = false;\n    }\n    function _enableEvents(target) {\n        var enabled = false;\n        if (target) {\n            enabled = eventOn(target, \"online\", _setOnline, _evtNamespace);\n            if (enabled) {\n                eventOn(target, \"offline\", _setOffline, _evtNamespace);\n            }\n        }\n        return enabled;\n    }\n    function _setOnline() {\n        _onlineStatus = true;\n    }\n    function _setOffline() {\n        _onlineStatus = false;\n    }\n    function _isOnline() {\n        var result = true;\n        if (_isListening) {\n            result = _onlineStatus;\n        }\n        else if (_navigator && !isNullOrUndefined(_navigator[_DYN_ON_LINE ])) {\n            result = _navigator[_DYN_ON_LINE ];\n        }\n        return result;\n    }\n    function _unload() {\n        var win = getWindow();\n        if (win && _isListening) {\n            _disableEvents(win, _evtNamespace);\n            if (_document) {\n                var target = _document.body || _document;\n                if (!isUndefined(target.ononline)) {\n                    _disableEvents(target, _evtNamespace);\n                }\n            }\n            _isListening = false;\n        }\n    }\n    return _a = {},\n        _a[_DYN_IS_ONLINE ] = _isOnline,\n        _a.isListening = function () { return _isListening; },\n        _a.unload = _unload,\n        _a;\n}\n\nvar BaseSendBuffer = /** @class */ (function () {\n    function BaseSendBuffer(logger, config) {\n        var _buffer = [];\n        var _bufferFullMessageSent = false;\n        this._get = function () {\n            return _buffer;\n        };\n        this._set = function (buffer) {\n            _buffer = buffer;\n            return _buffer;\n        };\n        dynamicProto(BaseSendBuffer, this, function (_self) {\n            _self[_DYN_ENQUEUE ] = function (payload) {\n                if (_self[_DYN_COUNT ]() >= config.eventsLimitInMem()) {\n                    if (!_bufferFullMessageSent) {\n                        _throwInternal(logger, 2 , 105 , \"Maximum in-memory buffer size reached: \" + _self[_DYN_COUNT ](), true);\n                        _bufferFullMessageSent = true;\n                    }\n                    return;\n                }\n                _buffer[_DYN_PUSH ](payload);\n            };\n            _self[_DYN_COUNT ] = function () {\n                return _buffer[_DYN_LENGTH$1 ];\n            };\n            _self.size = function () {\n                var size = _buffer[_DYN_LENGTH$1 ];\n                for (var lp = 0; lp < _buffer[_DYN_LENGTH$1 ]; lp++) {\n                    size += _buffer[lp][_DYN_LENGTH$1 ];\n                }\n                if (!config[_DYN_EMIT_LINE_DELIMITED_0 ]()) {\n                    size += 2;\n                }\n                return size;\n            };\n            _self[_DYN_CLEAR ] = function () {\n                _buffer = [];\n                _bufferFullMessageSent = false;\n            };\n            _self.getItems = function () {\n                return _buffer.slice(0);\n            };\n            _self[_DYN_BATCH_PAYLOADS ] = function (payload) {\n                if (payload && payload[_DYN_LENGTH$1 ] > 0) {\n                    var batch = config[_DYN_EMIT_LINE_DELIMITED_0 ]() ?\n                        payload.join(\"\\n\") :\n                        \"[\" + payload.join(\",\") + \"]\";\n                    return batch;\n                }\n                return null;\n            };\n        });\n    }\n    BaseSendBuffer.__ieDyn=1;\n    return BaseSendBuffer;\n}());\nvar ArraySendBuffer = /** @class */ (function (_super) {\n    __extendsFn(ArraySendBuffer, _super);\n    function ArraySendBuffer(logger, config) {\n        var _this = _super.call(this, logger, config) || this;\n        dynamicProto(ArraySendBuffer, _this, function (_self, _base) {\n            _self[_DYN_MARK_AS_SENT ] = function (payload) {\n                _base[_DYN_CLEAR ]();\n            };\n            _self[_DYN_CLEAR_SENT ] = function (payload) {\n            };\n        });\n        return _this;\n    }\n    ArraySendBuffer.__ieDyn=1;\n    return ArraySendBuffer;\n}(BaseSendBuffer));\nvar SessionStorageSendBuffer = /** @class */ (function (_super) {\n    __extendsFn(SessionStorageSendBuffer, _super);\n    function SessionStorageSendBuffer(logger, config) {\n        var _this = _super.call(this, logger, config) || this;\n        var _bufferFullMessageSent = false;\n        var _a = config[_DYN_BUFFER_OVERRIDE ]() || { getItem: utlGetSessionStorage, setItem: utlSetSessionStorage }, getItem = _a.getItem, setItem = _a.setItem;\n        dynamicProto(SessionStorageSendBuffer, _this, function (_self, _base) {\n            var bufferItems = _getBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ]);\n            var notDeliveredItems = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n            var buffer = _self._set(bufferItems.concat(notDeliveredItems));\n            if (buffer[_DYN_LENGTH$1 ] > SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                buffer[_DYN_LENGTH$1 ] = SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ];\n            }\n            _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], []);\n            _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], buffer);\n            _self[_DYN_ENQUEUE ] = function (payload) {\n                if (_self[_DYN_COUNT ]() >= SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                    if (!_bufferFullMessageSent) {\n                        _throwInternal(logger, 2 , 67 , \"Maximum buffer size reached: \" + _self[_DYN_COUNT ](), true);\n                        _bufferFullMessageSent = true;\n                    }\n                    return;\n                }\n                _base[_DYN_ENQUEUE ](payload);\n                _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], _self._get());\n            };\n            _self[_DYN_CLEAR ] = function () {\n                _base[_DYN_CLEAR ]();\n                _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], _self._get());\n                _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], []);\n                _bufferFullMessageSent = false;\n            };\n            _self[_DYN_MARK_AS_SENT ] = function (payload) {\n                _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], _self._set(_removePayloadsFromBuffer(payload, _self._get())));\n                var sentElements = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n                if (sentElements instanceof Array && payload instanceof Array) {\n                    sentElements = sentElements.concat(payload);\n                    if (sentElements[_DYN_LENGTH$1 ] > SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                        _throwInternal(logger, 1 , 67 , \"Sent buffer reached its maximum size: \" + sentElements[_DYN_LENGTH$1 ], true);\n                        sentElements[_DYN_LENGTH$1 ] = SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ];\n                    }\n                    _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], sentElements);\n                }\n            };\n            _self[_DYN_CLEAR_SENT ] = function (payload) {\n                var sentElements = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n                sentElements = _removePayloadsFromBuffer(payload, sentElements);\n                _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], sentElements);\n            };\n            function _removePayloadsFromBuffer(payloads, buffer) {\n                var remaining = [];\n                arrForEach(buffer, function (value) {\n                    if (!isFunction(value) && arrIndexOf(payloads, value) === -1) {\n                        remaining[_DYN_PUSH ](value);\n                    }\n                });\n                return remaining;\n            }\n            function _getBuffer(key) {\n                var prefixedKey = key;\n                try {\n                    prefixedKey = config[_DYN_NAME_PREFIX$1 ] && config[_DYN_NAME_PREFIX$1 ]() ? config[_DYN_NAME_PREFIX$1 ]() + \"_\" + prefixedKey : prefixedKey;\n                    var bufferJson = getItem(logger, prefixedKey);\n                    if (bufferJson) {\n                        var buffer_1 = getJSON().parse(bufferJson);\n                        if (isString(buffer_1)) {\n                            buffer_1 = getJSON().parse(buffer_1);\n                        }\n                        if (buffer_1 && isArray(buffer_1)) {\n                            return buffer_1;\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternal(logger, 1 , 42 , \" storage key: \" + prefixedKey + \", \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n                return [];\n            }\n            function _setBuffer(key, buffer) {\n                var prefixedKey = key;\n                try {\n                    prefixedKey = config[_DYN_NAME_PREFIX$1 ] && config[_DYN_NAME_PREFIX$1 ]() ? config[_DYN_NAME_PREFIX$1 ]() + \"_\" + prefixedKey : prefixedKey;\n                    var bufferJson = JSON[_DYN_STRINGIFY ](buffer);\n                    setItem(logger, prefixedKey, bufferJson);\n                }\n                catch (e) {\n                    setItem(logger, prefixedKey, JSON[_DYN_STRINGIFY ]([]));\n                    _throwInternal(logger, 2 , 41 , \" storage key: \" + prefixedKey + \", \" + getExceptionName(e) + \". Buffer cleared\", { exception: dumpObj(e) });\n                }\n            }\n        });\n        return _this;\n    }\n    SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n    SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n    SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n    return SessionStorageSendBuffer;\n}(BaseSendBuffer));\n\nvar Serializer = /** @class */ (function () {\n    function Serializer(logger) {\n        dynamicProto(Serializer, this, function (_self) {\n            _self.serialize = function (input) {\n                var output = _serializeObject(input, \"root\");\n                try {\n                    return getJSON()[_DYN_STRINGIFY ](output);\n                }\n                catch (e) {\n                    _throwInternal(logger, 1 , 48 , (e && isFunction(e[_DYN_TO_STRING ])) ? e[_DYN_TO_STRING ]() : \"Error serializing object\", null, true);\n                }\n            };\n            function _serializeObject(source, name) {\n                var circularReferenceCheck = \"__aiCircularRefCheck\";\n                var output = {};\n                if (!source) {\n                    _throwInternal(logger, 1 , 48 , \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                    return output;\n                }\n                if (source[circularReferenceCheck]) {\n                    _throwInternal(logger, 2 , 50 , \"Circular reference detected while serializing object\", { name: name }, true);\n                    return output;\n                }\n                if (!source.aiDataContract) {\n                    if (name === \"measurements\") {\n                        output = _serializeStringMap(source, \"number\", name);\n                    }\n                    else if (name === \"properties\") {\n                        output = _serializeStringMap(source, \"string\", name);\n                    }\n                    else if (name === \"tags\") {\n                        output = _serializeStringMap(source, \"string\", name);\n                    }\n                    else if (isArray(source)) {\n                        output = _serializeArray(source, name);\n                    }\n                    else {\n                        _throwInternal(logger, 2 , 49 , \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                        try {\n                            getJSON()[_DYN_STRINGIFY ](source);\n                            output = source;\n                        }\n                        catch (e) {\n                            _throwInternal(logger, 1 , 48 , (e && isFunction(e[_DYN_TO_STRING ])) ? e[_DYN_TO_STRING ]() : \"Error serializing object\", null, true);\n                        }\n                    }\n                    return output;\n                }\n                source[circularReferenceCheck] = true;\n                objForEachKey(source.aiDataContract, function (field, contract) {\n                    var isRequired = (isFunction(contract)) ? (contract() & 1 ) : (contract & 1 );\n                    var isHidden = (isFunction(contract)) ? (contract() & 4 ) : (contract & 4 );\n                    var isArray = contract & 2 ;\n                    var isPresent = source[field] !== undefined;\n                    var isObj = isObject(source[field]) && source[field] !== null;\n                    if (isRequired && !isPresent && !isArray) {\n                        _throwInternal(logger, 1 , 24 , \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    }\n                    else if (!isHidden) {\n                        var value = void 0;\n                        if (isObj) {\n                            if (isArray) {\n                                value = _serializeArray(source[field], field);\n                            }\n                            else {\n                                value = _serializeObject(source[field], field);\n                            }\n                        }\n                        else {\n                            value = source[field];\n                        }\n                        if (value !== undefined) {\n                            output[field] = value;\n                        }\n                    }\n                });\n                delete source[circularReferenceCheck];\n                return output;\n            }\n            function _serializeArray(sources, name) {\n                var output;\n                if (!!sources) {\n                    if (!isArray(sources)) {\n                        _throwInternal(logger, 1 , 54 , \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                    }\n                    else {\n                        output = [];\n                        for (var i = 0; i < sources[_DYN_LENGTH$1 ]; i++) {\n                            var source = sources[i];\n                            var item = _serializeObject(source, name + \"[\" + i + \"]\");\n                            output[_DYN_PUSH ](item);\n                        }\n                    }\n                }\n                return output;\n            }\n            function _serializeStringMap(map, expectedType, name) {\n                var output;\n                if (map) {\n                    output = {};\n                    objForEachKey(map, function (field, value) {\n                        if (expectedType === \"string\") {\n                            if (value === undefined) {\n                                output[field] = \"undefined\";\n                            }\n                            else if (value === null) {\n                                output[field] = \"null\";\n                            }\n                            else if (!value[_DYN_TO_STRING ]) {\n                                output[field] = \"invalid field: toString() is not defined.\";\n                            }\n                            else {\n                                output[field] = value[_DYN_TO_STRING ]();\n                            }\n                        }\n                        else if (expectedType === \"number\") {\n                            if (value === undefined) {\n                                output[field] = \"undefined\";\n                            }\n                            else if (value === null) {\n                                output[field] = \"null\";\n                            }\n                            else {\n                                var num = parseFloat(value);\n                                if (isNaN(num)) {\n                                    output[field] = \"NaN\";\n                                }\n                                else {\n                                    output[field] = num;\n                                }\n                            }\n                        }\n                        else {\n                            output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                            _throwInternal(logger, 1 , output[field], null, true);\n                        }\n                    });\n                }\n                return output;\n            }\n        });\n    }\n    Serializer.__ieDyn=1;\n    return Serializer;\n}());\n\nvar MIN_INPUT_LENGTH = 8;\nvar HashCodeScoreGenerator = /** @class */ (function () {\n    function HashCodeScoreGenerator() {\n    }\n    HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n        var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n        return score * 100;\n    };\n    HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n        if (input === \"\") {\n            return 0;\n        }\n        while (input[_DYN_LENGTH$1 ] < MIN_INPUT_LENGTH) {\n            input = input.concat(input);\n        }\n        var hash = 5381;\n        for (var i = 0; i < input[_DYN_LENGTH$1 ]; ++i) {\n            hash = ((hash << 5) + hash) + input.charCodeAt(i);\n            hash = hash & hash;\n        }\n        return Math.abs(hash);\n    };\n    HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n    return HashCodeScoreGenerator;\n}());\n\nvar SamplingScoreGenerator = /** @class */ (function () {\n    function SamplingScoreGenerator() {\n        var _self = this;\n        var hashCodeGenerator = new HashCodeScoreGenerator();\n        var keys = new ContextTagKeys();\n        _self[_DYN_GET_SAMPLING_SCORE ] = function (item) {\n            var score = 0;\n            if (item[_DYN_TAGS ] && item[_DYN_TAGS ][keys.userId]) {\n                score = hashCodeGenerator.getHashCodeScore(item[_DYN_TAGS ][keys.userId]);\n            }\n            else if (item.ext && item.ext.user && item.ext.user.id) {\n                score = hashCodeGenerator[_DYN_GET_HASH_CODE_SCORE ](item.ext.user.id);\n            }\n            else if (item[_DYN_TAGS ] && item[_DYN_TAGS ][keys.operationId]) {\n                score = hashCodeGenerator.getHashCodeScore(item[_DYN_TAGS ][keys.operationId]);\n            }\n            else if (item.ext && item.ext.telemetryTrace && item.ext.telemetryTrace[_DYN_TRACE_ID ]) {\n                score = hashCodeGenerator.getHashCodeScore(item.ext.telemetryTrace[_DYN_TRACE_ID ]);\n            }\n            else {\n                score = (Math.random() * 100);\n            }\n            return score;\n        };\n    }\n    return SamplingScoreGenerator;\n}());\n\nvar Sample = /** @class */ (function () {\n    function Sample(sampleRate, logger) {\n        this.INT_MAX_VALUE = 2147483647;\n        var _logger = logger || safeGetLogger(null);\n        if (sampleRate > 100 || sampleRate < 0) {\n            _logger.throwInternal(2 , 58 , \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n            sampleRate = 100;\n        }\n        this[_DYN_SAMPLE_RATE ] = sampleRate;\n        this.samplingScoreGenerator = new SamplingScoreGenerator();\n    }\n    Sample.prototype.isSampledIn = function (envelope) {\n        var samplingPercentage = this[_DYN_SAMPLE_RATE ];\n        var isSampledIn = false;\n        if (samplingPercentage === null || samplingPercentage === undefined || samplingPercentage >= 100) {\n            return true;\n        }\n        else if (envelope.baseType === Metric[_DYN_DATA_TYPE ]) {\n            return true;\n        }\n        isSampledIn = this.samplingScoreGenerator[_DYN_GET_SAMPLING_SCORE ](envelope) < samplingPercentage;\n        return isSampledIn;\n    };\n    return Sample;\n}());\n\nvar _a;\nvar FetchSyncRequestSizeLimitBytes = 65000;\nfunction _getResponseText(xhr) {\n    try {\n        return xhr.responseText;\n    }\n    catch (e) {\n    }\n    return null;\n}\nfunction _getDefaultAppInsightsChannelConfig() {\n    var _a;\n    var defaultValue;\n    var defaultCustomHeaders;\n    return _a = {\n            endpointUrl: function () { return DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH; }\n        },\n        _a[_DYN_EMIT_LINE_DELIMITED_0 ] = function () { return false; },\n        _a[_DYN_MAX_BATCH_INTERVAL ] = function () { return 15000; },\n        _a[_DYN_MAX_BATCH_SIZE_IN_BY1 ] = function () { return 102400; },\n        _a[_DYN_DISABLE_TELEMETRY ] = function () { return false; },\n        _a[_DYN_ENABLE_SESSION_STORA4 ] = function () { return true; },\n        _a[_DYN_BUFFER_OVERRIDE ] = function () { return false; },\n        _a[_DYN_IS_RETRY_DISABLED ] = function () { return false; },\n        _a[_DYN_IS_BEACON_API_DISABL3 ] = function () { return true; },\n        _a[_DYN_DISABLE_XHR ] = function () { return false; },\n        _a[_DYN_ONUNLOAD_DISABLE_FET5 ] = function () { return false; },\n        _a[_DYN_ONUNLOAD_DISABLE_BEA2 ] = function () { return false; },\n        _a[_DYN_INSTRUMENTATION_KEY ] = function () { return defaultValue; },\n        _a[_DYN_NAME_PREFIX$1 ] = function () { return defaultValue; },\n        _a[_DYN_SAMPLING_PERCENTAGE ] = function () { return 100; },\n        _a[_DYN_CUSTOM_HEADERS ] = function () { return defaultCustomHeaders; },\n        _a[_DYN_CONVERT_UNDEFINED ] = function () { return defaultValue; },\n        _a.eventsLimitInMem = function () { return 10000; },\n        _a;\n}\nvar EnvelopeTypeCreator = (_a = {},\n    _a[Event$1.dataType] = EventEnvelopeCreator,\n    _a[Trace.dataType] = TraceEnvelopeCreator,\n    _a[PageView.dataType] = PageViewEnvelopeCreator,\n    _a[PageViewPerformance.dataType] = PageViewPerformanceEnvelopeCreator,\n    _a[Exception.dataType] = ExceptionEnvelopeCreator,\n    _a[Metric.dataType] = MetricEnvelopeCreator,\n    _a[RemoteDependencyData.dataType] = DependencyEnvelopeCreator,\n    _a);\nvar Sender = /** @class */ (function (_super) {\n    __extendsFn(Sender, _super);\n    function Sender() {\n        var _this = _super.call(this) || this;\n        _this.priority = 1001;\n        _this.identifier = BreezeChannelIdentifier;\n        _this._senderConfig = _getDefaultAppInsightsChannelConfig();\n        var _consecutiveErrors;\n        var _retryAt;\n        var _paused;\n        var _timeoutHandle;\n        var _serializer;\n        var _stamp_specific_redirects;\n        var _headers;\n        var _syncFetchPayload = 0;\n        var _fallbackSender;\n        var _syncUnloadSender;\n        var _offlineListener;\n        var _evtNamespace;\n        dynamicProto(Sender, _this, function (_self, _base) {\n            _initDefaults();\n            _self.pause = function () {\n                _clearScheduledTimer();\n                _paused = true;\n            };\n            _self.resume = function () {\n                if (_paused) {\n                    _paused = false;\n                    _retryAt = null;\n                    if (_self._buffer.size() > _self._senderConfig[_DYN_MAX_BATCH_SIZE_IN_BY1 ]()) {\n                        _self[_DYN_TRIGGER_SEND ](true, null, 10 );\n                    }\n                    _setupTimer();\n                }\n            };\n            _self.flush = function (isAsync, callBack, sendReason) {\n                if (isAsync === void 0) { isAsync = true; }\n                if (!_paused) {\n                    _clearScheduledTimer();\n                    try {\n                        _self[_DYN_TRIGGER_SEND ](isAsync, null, sendReason || 1 );\n                    }\n                    catch (e) {\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 22 , \"flush failed, telemetry will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                }\n            };\n            _self.onunloadFlush = function () {\n                if (!_paused) {\n                    if ((_self._senderConfig[_DYN_ONUNLOAD_DISABLE_BEA2 ]() === false || _self[_DYN__SENDER_CONFIG ][_DYN_IS_BEACON_API_DISABL3 ]() === false) && isBeaconsSupported()) {\n                        try {\n                            _self[_DYN_TRIGGER_SEND ](true, _doUnloadSend, 2 );\n                        }\n                        catch (e) {\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 20 , \"failed to flush with beacon sender on page unload, telemetry will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                    }\n                    else {\n                        _self.flush();\n                    }\n                }\n            };\n            _self.addHeader = function (name, value) {\n                _headers[name] = value;\n            };\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                if (_self.isInitialized()) {\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 28 , \"Sender is already initialized\");\n                }\n                _base.initialize(config, core, extensions, pluginChain);\n                var ctx = _self._getTelCtx();\n                var identifier = _self.identifier;\n                _serializer = new Serializer(core.logger);\n                _consecutiveErrors = 0;\n                _retryAt = null;\n                _self[_DYN__SENDER ] = null;\n                _stamp_specific_redirects = 0;\n                var diagLog = _self[_DYN_DIAG_LOG ]();\n                _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"Sender\"), core.evtNamespace && core.evtNamespace());\n                _offlineListener = createOfflineListener(_evtNamespace);\n                var defaultConfig = _getDefaultAppInsightsChannelConfig();\n                objForEachKey(defaultConfig, function (field, value) {\n                    _self[_DYN__SENDER_CONFIG ][field] = function () {\n                        var theValue = ctx.getConfig(identifier, field, value());\n                        if (!theValue && field === \"endpointUrl\") {\n                            theValue = value();\n                        }\n                        return theValue;\n                    };\n                });\n                if (config.storagePrefix) {\n                    utlSetStoragePrefix(config.storagePrefix);\n                }\n                var useSessionStorage = _self[_DYN__SENDER_CONFIG ][_DYN_ENABLE_SESSION_STORA4 ]() &&\n                    !!(_self._senderConfig[_DYN_BUFFER_OVERRIDE ]() || utlCanUseSessionStorage());\n                _self[_DYN__BUFFER ] = useSessionStorage\n                    ? new SessionStorageSendBuffer(diagLog, _self[_DYN__SENDER_CONFIG ])\n                    : new ArraySendBuffer(diagLog, _self[_DYN__SENDER_CONFIG ]);\n                _self._sample = new Sample(_self[_DYN__SENDER_CONFIG ][_DYN_SAMPLING_PERCENTAGE ](), diagLog);\n                if (!_validateInstrumentationKey(config)) {\n                    _throwInternal(diagLog, 1 , 100 , \"Invalid Instrumentation key \" + config[_DYN_INSTRUMENTATION_KEY ]);\n                }\n                if (!isInternalApplicationInsightsEndpoint(_self._senderConfig.endpointUrl()) && _self._senderConfig.customHeaders() && _self._senderConfig.customHeaders()[_DYN_LENGTH$1 ] > 0) {\n                    arrForEach(_self[_DYN__SENDER_CONFIG ][_DYN_CUSTOM_HEADERS ](), function (customHeader) {\n                        _this.addHeader(customHeader.header, customHeader.value);\n                    });\n                }\n                var senderConfig = _self[_DYN__SENDER_CONFIG ];\n                var sendPostFunc = null;\n                if (!senderConfig[_DYN_DISABLE_XHR ]() && useXDomainRequest()) {\n                    sendPostFunc = _xdrSender;\n                }\n                else if (!senderConfig[_DYN_DISABLE_XHR ]() && isXhrSupported()) {\n                    sendPostFunc = _xhrSender;\n                }\n                if (!sendPostFunc && isFetchSupported()) {\n                    sendPostFunc = _fetchSender;\n                }\n                _fallbackSender = sendPostFunc || _xhrSender;\n                if (!senderConfig[_DYN_IS_BEACON_API_DISABL3 ]() && isBeaconsSupported()) {\n                    sendPostFunc = _beaconSender;\n                }\n                _self[_DYN__SENDER ] = sendPostFunc || _xhrSender;\n                if (!senderConfig[_DYN_ONUNLOAD_DISABLE_FET5 ]() && isFetchSupported(true)) {\n                    _syncUnloadSender = _fetchKeepAliveSender;\n                }\n                else if (isBeaconsSupported()) {\n                    _syncUnloadSender = _beaconSender;\n                }\n                else if (!senderConfig[_DYN_DISABLE_XHR ]() && useXDomainRequest()) {\n                    _syncUnloadSender = _xdrSender;\n                }\n                else if (!senderConfig[_DYN_DISABLE_XHR ]() && isXhrSupported()) {\n                    _syncUnloadSender = _xhrSender;\n                }\n                else {\n                    _syncUnloadSender = _fallbackSender;\n                }\n            };\n            _self.processTelemetry = function (telemetryItem, itemCtx) {\n                itemCtx = _self._getTelCtx(itemCtx);\n                var diagLogger = itemCtx[_DYN_DIAG_LOG ]();\n                try {\n                    if (_self[_DYN__SENDER_CONFIG ][_DYN_DISABLE_TELEMETRY ]()) {\n                        return;\n                    }\n                    if (!telemetryItem) {\n                        _throwInternal(diagLogger, 1 , 7 , \"Cannot send empty telemetry\");\n                        return;\n                    }\n                    if (telemetryItem.baseData && !telemetryItem[_DYN_BASE_TYPE ]) {\n                        _throwInternal(diagLogger, 1 , 70 , \"Cannot send telemetry without baseData and baseType\");\n                        return;\n                    }\n                    if (!telemetryItem[_DYN_BASE_TYPE ]) {\n                        telemetryItem[_DYN_BASE_TYPE ] = \"EventData\";\n                    }\n                    if (!_self[_DYN__SENDER ]) {\n                        _throwInternal(diagLogger, 1 , 28 , \"Sender was not initialized\");\n                        return;\n                    }\n                    if (!_isSampledIn(telemetryItem)) {\n                        _throwInternal(diagLogger, 2 , 33 , \"Telemetry item was sampled out and not sent\", { SampleRate: _self._sample[_DYN_SAMPLE_RATE ] });\n                        return;\n                    }\n                    else {\n                        telemetryItem[SampleRate] = _self._sample[_DYN_SAMPLE_RATE ];\n                    }\n                    var convertUndefined = _self[_DYN__SENDER_CONFIG ][_DYN_CONVERT_UNDEFINED ]() || undefined;\n                    var defaultEnvelopeIkey = telemetryItem.iKey || _self[_DYN__SENDER_CONFIG ][_DYN_INSTRUMENTATION_KEY ]();\n                    var aiEnvelope_1 = Sender.constructEnvelope(telemetryItem, defaultEnvelopeIkey, diagLogger, convertUndefined);\n                    if (!aiEnvelope_1) {\n                        _throwInternal(diagLogger, 1 , 47 , \"Unable to create an AppInsights envelope\");\n                        return;\n                    }\n                    var doNotSendItem_1 = false;\n                    if (telemetryItem[_DYN_TAGS ] && telemetryItem[_DYN_TAGS ][ProcessLegacy]) {\n                        arrForEach(telemetryItem[_DYN_TAGS ][ProcessLegacy], function (callBack) {\n                            try {\n                                if (callBack && callBack(aiEnvelope_1) === false) {\n                                    doNotSendItem_1 = true;\n                                    _warnToConsole(diagLogger, \"Telemetry processor check returns false\");\n                                }\n                            }\n                            catch (e) {\n                                _throwInternal(diagLogger, 1 , 64 , \"One of telemetry initializers failed, telemetry item will not be sent: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n                            }\n                        });\n                        delete telemetryItem[_DYN_TAGS ][ProcessLegacy];\n                    }\n                    if (doNotSendItem_1) {\n                        return;\n                    }\n                    var payload = _serializer.serialize(aiEnvelope_1);\n                    var buffer = _self[_DYN__BUFFER ];\n                    var bufferSize = buffer.size();\n                    if ((bufferSize + payload[_DYN_LENGTH$1 ]) > _self[_DYN__SENDER_CONFIG ][_DYN_MAX_BATCH_SIZE_IN_BY1 ]()) {\n                        if (!_offlineListener || _offlineListener[_DYN_IS_ONLINE ]()) {\n                            _self[_DYN_TRIGGER_SEND ](true, null, 10 );\n                        }\n                    }\n                    buffer[_DYN_ENQUEUE ](payload);\n                    _setupTimer();\n                }\n                catch (e) {\n                    _throwInternal(diagLogger, 2 , 12 , \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n                _self.processNext(telemetryItem, itemCtx);\n            };\n            _self[_DYN__XHR_READY_STATE_CHA6 ] = function (xhr, payload, countOfItemsInPayload) {\n                if (xhr.readyState === 4) {\n                    _checkResponsStatus(xhr.status, payload, xhr.responseURL, countOfItemsInPayload, _formatErrorMessageXhr(xhr), _getResponseText(xhr) || xhr.response);\n                }\n            };\n            _self[_DYN_TRIGGER_SEND ] = function (async, forcedSender, sendReason) {\n                if (async === void 0) { async = true; }\n                if (!_paused) {\n                    try {\n                        var buffer = _self[_DYN__BUFFER ];\n                        if (!_self[_DYN__SENDER_CONFIG ][_DYN_DISABLE_TELEMETRY ]()) {\n                            if (buffer[_DYN_COUNT ]() > 0) {\n                                var payload = buffer.getItems();\n                                _notifySendRequest(sendReason || 0 , async);\n                                if (forcedSender) {\n                                    forcedSender.call(_self, payload, async);\n                                }\n                                else {\n                                    _self[_DYN__SENDER ](payload, async);\n                                }\n                            }\n                        }\n                        else {\n                            buffer[_DYN_CLEAR ]();\n                        }\n                        _clearScheduledTimer();\n                    }\n                    catch (e) {\n                        var ieVer = getIEVersion();\n                        if (!ieVer || ieVer > 9) {\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 40 , \"Telemetry transmission failed, some telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                    }\n                }\n            };\n            _self._doTeardown = function (unloadCtx, unloadState) {\n                _self.onunloadFlush();\n                _offlineListener.unload();\n                _initDefaults();\n            };\n            _self[_DYN__ON_ERROR ] = function (payload, message, event) {\n                _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 26 , \"Failed to send telemetry.\", { message: message });\n                _self._buffer && _self._buffer[_DYN_CLEAR_SENT ](payload);\n            };\n            _self[_DYN__ON_PARTIAL_SUCCESS ] = function (payload, results) {\n                var failed = [];\n                var retry = [];\n                var errors = results.errors.reverse();\n                for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                    var error = errors_1[_i];\n                    var extracted = payload.splice(error.index, 1)[0];\n                    if (_isRetriable(error.statusCode)) {\n                        retry[_DYN_PUSH ](extracted);\n                    }\n                    else {\n                        failed[_DYN_PUSH ](extracted);\n                    }\n                }\n                if (payload[_DYN_LENGTH$1 ] > 0) {\n                    _self[_DYN__ON_SUCCESS ](payload, results[_DYN_ITEMS_ACCEPTED ]);\n                }\n                if (failed[_DYN_LENGTH$1 ] > 0) {\n                    _self[_DYN__ON_ERROR ](failed, _formatErrorMessageXhr(null, [\"partial success\", results[_DYN_ITEMS_ACCEPTED ], \"of\", results.itemsReceived].join(\" \")));\n                }\n                if (retry[_DYN_LENGTH$1 ] > 0) {\n                    _resendPayload(retry);\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \"Partial success. \" +\n                        \"Delivered: \" + payload[_DYN_LENGTH$1 ] + \", Failed: \" + failed[_DYN_LENGTH$1 ] +\n                        \". Will retry to send \" + retry[_DYN_LENGTH$1 ] + \" our of \" + results[_DYN_ITEMS_RECEIVED ] + \" items\");\n                }\n            };\n            _self[_DYN__ON_SUCCESS ] = function (payload, countOfItemsInPayload) {\n                _self._buffer && _self._buffer[_DYN_CLEAR_SENT ](payload);\n            };\n            _self._xdrOnLoad = function (xdr, payload) {\n                var responseText = _getResponseText(xdr);\n                if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\n                    _consecutiveErrors = 0;\n                    _self[_DYN__ON_SUCCESS ](payload, 0);\n                }\n                else {\n                    var results = _parseResponse(responseText);\n                    if (results && results.itemsReceived && results.itemsReceived > results[_DYN_ITEMS_ACCEPTED ]\n                        && !_self[_DYN__SENDER_CONFIG ][_DYN_IS_RETRY_DISABLED ]()) {\n                        _self[_DYN__ON_PARTIAL_SUCCESS ](payload, results);\n                    }\n                    else {\n                        _self[_DYN__ON_ERROR ](payload, _formatErrorMessageXdr(xdr));\n                    }\n                }\n            };\n            function _isSampledIn(envelope) {\n                return _self._sample.isSampledIn(envelope);\n            }\n            function _checkResponsStatus(status, payload, responseUrl, countOfItemsInPayload, errorMessage, res) {\n                var response = null;\n                if (!_self._appId) {\n                    response = _parseResponse(res);\n                    if (response && response.appId) {\n                        _self._appId = response.appId;\n                    }\n                }\n                if ((status < 200 || status >= 300) && status !== 0) {\n                    if (status === 301 || status === 307 || status === 308) {\n                        if (!_checkAndUpdateEndPointUrl(responseUrl)) {\n                            _self[_DYN__ON_ERROR ](payload, errorMessage);\n                            return;\n                        }\n                    }\n                    if (!_self[_DYN__SENDER_CONFIG ][_DYN_IS_RETRY_DISABLED ]() && _isRetriable(status)) {\n                        _resendPayload(payload);\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" +\n                            \"Response code \" + status + \". Will retry to send \" + payload[_DYN_LENGTH$1 ] + \" items.\");\n                    }\n                    else {\n                        _self[_DYN__ON_ERROR ](payload, errorMessage);\n                    }\n                }\n                else if (_offlineListener && !_offlineListener[_DYN_IS_ONLINE ]()) {\n                    if (!_self[_DYN__SENDER_CONFIG ][_DYN_IS_RETRY_DISABLED ]()) {\n                        var offlineBackOffMultiplier = 10;\n                        _resendPayload(payload, offlineBackOffMultiplier);\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". Offline - Response Code: \".concat(status, \". Offline status: \").concat(!_offlineListener.isOnline(), \". Will retry to send \").concat(payload.length, \" items.\"));\n                    }\n                }\n                else {\n                    _checkAndUpdateEndPointUrl(responseUrl);\n                    if (status === 206) {\n                        if (!response) {\n                            response = _parseResponse(res);\n                        }\n                        if (response && !_self[_DYN__SENDER_CONFIG ][_DYN_IS_RETRY_DISABLED ]()) {\n                            _self[_DYN__ON_PARTIAL_SUCCESS ](payload, response);\n                        }\n                        else {\n                            _self[_DYN__ON_ERROR ](payload, errorMessage);\n                        }\n                    }\n                    else {\n                        _consecutiveErrors = 0;\n                        _self[_DYN__ON_SUCCESS ](payload, countOfItemsInPayload);\n                    }\n                }\n            }\n            function _checkAndUpdateEndPointUrl(responseUrl) {\n                if (_stamp_specific_redirects >= 10) {\n                    return false;\n                }\n                if (!isNullOrUndefined(responseUrl) && responseUrl !== \"\") {\n                    if (responseUrl !== _self[_DYN__SENDER_CONFIG ][_DYN_ENDPOINT_URL ]()) {\n                        _self[_DYN__SENDER_CONFIG ][_DYN_ENDPOINT_URL ] = function () { return responseUrl; };\n                        ++_stamp_specific_redirects;\n                        return true;\n                    }\n                }\n                return false;\n            }\n            function _doUnloadSend(payload, isAsync) {\n                if (_syncUnloadSender) {\n                    _syncUnloadSender(payload, false);\n                }\n                else {\n                    _beaconSender(payload);\n                }\n            }\n            function _doBeaconSend(payload) {\n                var nav = getNavigator();\n                var buffer = _self[_DYN__BUFFER ];\n                var url = _self[_DYN__SENDER_CONFIG ][_DYN_ENDPOINT_URL ]();\n                var batch = _self._buffer[_DYN_BATCH_PAYLOADS ](payload);\n                var plainTextBatch = new Blob([batch], { type: \"text/plain;charset=UTF-8\" });\n                var queued = nav.sendBeacon(url, plainTextBatch);\n                if (queued) {\n                    buffer[_DYN_MARK_AS_SENT ](payload);\n                    _self._onSuccess(payload, payload[_DYN_LENGTH$1 ]);\n                }\n                return queued;\n            }\n            function _beaconSender(payload, isAsync) {\n                if (isArray(payload) && payload[_DYN_LENGTH$1 ] > 0) {\n                    if (!_doBeaconSend(payload)) {\n                        var droppedPayload = [];\n                        for (var lp = 0; lp < payload[_DYN_LENGTH$1 ]; lp++) {\n                            var thePayload = payload[lp];\n                            if (!_doBeaconSend([thePayload])) {\n                                droppedPayload[_DYN_PUSH ](thePayload);\n                            }\n                        }\n                        if (droppedPayload[_DYN_LENGTH$1 ] > 0) {\n                            _fallbackSender && _fallbackSender(droppedPayload, true);\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" + \"Failed to send telemetry with Beacon API, retried with normal sender.\");\n                        }\n                    }\n                }\n            }\n            function _xhrSender(payload, isAsync) {\n                var xhr = new XMLHttpRequest();\n                var endPointUrl = _self[_DYN__SENDER_CONFIG ][_DYN_ENDPOINT_URL ]();\n                try {\n                    xhr[DisabledPropertyName] = true;\n                }\n                catch (e) {\n                }\n                xhr.open(\"POST\", endPointUrl, isAsync);\n                xhr[_DYN_SET_REQUEST_HEADER ](\"Content-type\", \"application/json\");\n                if (isInternalApplicationInsightsEndpoint(endPointUrl)) {\n                    xhr[_DYN_SET_REQUEST_HEADER ](RequestHeaders[6 ], RequestHeaders[7 ]);\n                }\n                arrForEach(objKeys(_headers), function (headerName) {\n                    xhr[_DYN_SET_REQUEST_HEADER ](headerName, _headers[headerName]);\n                });\n                xhr.onreadystatechange = function () { return _self._xhrReadyStateChange(xhr, payload, payload[_DYN_LENGTH$1 ]); };\n                xhr.onerror = function (event) { return _self[_DYN__ON_ERROR ](payload, _formatErrorMessageXhr(xhr), event); };\n                var batch = _self._buffer[_DYN_BATCH_PAYLOADS ](payload);\n                xhr.send(batch);\n                _self._buffer[_DYN_MARK_AS_SENT ](payload);\n            }\n            function _fetchKeepAliveSender(payload, isAsync) {\n                if (isArray(payload)) {\n                    var payloadSize = payload[_DYN_LENGTH$1 ];\n                    for (var lp = 0; lp < payload[_DYN_LENGTH$1 ]; lp++) {\n                        payloadSize += payload[lp][_DYN_LENGTH$1 ];\n                    }\n                    if ((_syncFetchPayload + payloadSize) <= FetchSyncRequestSizeLimitBytes) {\n                        _doFetchSender(payload, false);\n                    }\n                    else if (isBeaconsSupported()) {\n                        _beaconSender(payload);\n                    }\n                    else {\n                        _fallbackSender && _fallbackSender(payload, true);\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" + \"Failed to send telemetry with Beacon API, retried with xhrSender.\");\n                    }\n                }\n            }\n            function _fetchSender(payload, isAsync) {\n                _doFetchSender(payload, true);\n            }\n            function _doFetchSender(payload, isAsync) {\n                var _a;\n                var endPointUrl = _self[_DYN__SENDER_CONFIG ][_DYN_ENDPOINT_URL ]();\n                var batch = _self._buffer[_DYN_BATCH_PAYLOADS ](payload);\n                var plainTextBatch = new Blob([batch], { type: \"application/json\" });\n                var requestHeaders = new Headers();\n                var batchLength = batch[_DYN_LENGTH$1 ];\n                var ignoreResponse = false;\n                var responseHandled = false;\n                if (isInternalApplicationInsightsEndpoint(endPointUrl)) {\n                    requestHeaders.append(RequestHeaders[6 ], RequestHeaders[7 ]);\n                }\n                arrForEach(objKeys(_headers), function (headerName) {\n                    requestHeaders.append(headerName, _headers[headerName]);\n                });\n                var init = (_a = {\n                        method: \"POST\",\n                        headers: requestHeaders,\n                        body: plainTextBatch\n                    },\n                    _a[DisabledPropertyName] = true\n                ,\n                    _a);\n                if (!isAsync) {\n                    init.keepalive = true;\n                    ignoreResponse = true;\n                    _syncFetchPayload += batchLength;\n                }\n                var request = new Request(endPointUrl, init);\n                try {\n                    request[DisabledPropertyName] = true;\n                }\n                catch (e) {\n                }\n                _self._buffer[_DYN_MARK_AS_SENT ](payload);\n                try {\n                    fetch(request).then(function (response) {\n                        if (!isAsync) {\n                            _syncFetchPayload -= batchLength;\n                            batchLength = 0;\n                        }\n                        if (!responseHandled) {\n                            responseHandled = true;\n                            if (!response.ok) {\n                                _self[_DYN__ON_ERROR ](payload, response.statusText);\n                            }\n                            else {\n                                response.text().then(function (text) {\n                                    _checkResponsStatus(response.status, payload, response.url, payload[_DYN_LENGTH$1 ], response.statusText, text);\n                                });\n                            }\n                        }\n                    })[\"catch\"](function (error) {\n                        if (!isAsync) {\n                            _syncFetchPayload -= batchLength;\n                            batchLength = 0;\n                        }\n                        if (!responseHandled) {\n                            responseHandled = true;\n                            _self[_DYN__ON_ERROR ](payload, error.message);\n                        }\n                    });\n                }\n                catch (e) {\n                    if (!responseHandled) {\n                        _self[_DYN__ON_ERROR ](payload, dumpObj(e));\n                    }\n                }\n                if (ignoreResponse && !responseHandled) {\n                    responseHandled = true;\n                    _self._onSuccess(payload, payload[_DYN_LENGTH$1 ]);\n                }\n            }\n            function _parseResponse(response) {\n                try {\n                    if (response && response !== \"\") {\n                        var result = getJSON().parse(response);\n                        if (result && result.itemsReceived && result.itemsReceived >= result[_DYN_ITEMS_ACCEPTED ] &&\n                            result.itemsReceived - result.itemsAccepted === result.errors[_DYN_LENGTH$1 ]) {\n                            return result;\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 43 , \"Cannot parse the response. \" + getExceptionName(e), {\n                        response: response\n                    });\n                }\n                return null;\n            }\n            function _resendPayload(payload, linearFactor) {\n                if (linearFactor === void 0) { linearFactor = 1; }\n                if (!payload || payload[_DYN_LENGTH$1 ] === 0) {\n                    return;\n                }\n                var buffer = _self[_DYN__BUFFER ];\n                buffer[_DYN_CLEAR_SENT ](payload);\n                _consecutiveErrors++;\n                for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                    var item = payload_1[_i];\n                    buffer[_DYN_ENQUEUE ](item);\n                }\n                _setRetryTime(linearFactor);\n                _setupTimer();\n            }\n            function _setRetryTime(linearFactor) {\n                var SlotDelayInSeconds = 10;\n                var delayInSeconds;\n                if (_consecutiveErrors <= 1) {\n                    delayInSeconds = SlotDelayInSeconds;\n                }\n                else {\n                    var backOffSlot = (Math.pow(2, _consecutiveErrors) - 1) / 2;\n                    var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                    backOffDelay = linearFactor * backOffDelay;\n                    delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n                }\n                var retryAfterTimeSpan = dateNow() + (delayInSeconds * 1000);\n                _retryAt = retryAfterTimeSpan;\n            }\n            function _setupTimer() {\n                if (!_timeoutHandle && !_paused) {\n                    var retryInterval = _retryAt ? Math.max(0, _retryAt - dateNow()) : 0;\n                    var timerValue = Math.max(_self[_DYN__SENDER_CONFIG ][_DYN_MAX_BATCH_INTERVAL ](), retryInterval);\n                    _timeoutHandle = setTimeout(function () {\n                        _timeoutHandle = null;\n                        _self[_DYN_TRIGGER_SEND ](true, null, 1 );\n                    }, timerValue);\n                }\n            }\n            function _clearScheduledTimer() {\n                clearTimeout(_timeoutHandle);\n                _timeoutHandle = null;\n                _retryAt = null;\n            }\n            function _isRetriable(statusCode) {\n                return statusCode === 401\n                    || statusCode === 403\n                    || statusCode === 408\n                    || statusCode === 429\n                    || statusCode === 500\n                    || statusCode === 502\n                    || statusCode === 503\n                    || statusCode === 504;\n            }\n            function _formatErrorMessageXhr(xhr, message) {\n                if (xhr) {\n                    return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + _getResponseText(xhr) || xhr.response || \"\";\n                }\n                return message;\n            }\n            function _xdrSender(payload, isAsync) {\n                var buffer = _self[_DYN__BUFFER ];\n                var _window = getWindow();\n                var xdr = new XDomainRequest();\n                xdr.onload = function () { return _self._xdrOnLoad(xdr, payload); };\n                xdr.onerror = function (event) { return _self[_DYN__ON_ERROR ](payload, _formatErrorMessageXdr(xdr), event); };\n                var hostingProtocol = _window && _window.location && _window.location.protocol || \"\";\n                if (_self[_DYN__SENDER_CONFIG ][_DYN_ENDPOINT_URL ]().lastIndexOf(hostingProtocol, 0) !== 0) {\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" +\n                        \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                    buffer[_DYN_CLEAR ]();\n                    return;\n                }\n                var endpointUrl = _self[_DYN__SENDER_CONFIG ][_DYN_ENDPOINT_URL ]().replace(/^(https?:)/, \"\");\n                xdr.open(\"POST\", endpointUrl);\n                var batch = buffer[_DYN_BATCH_PAYLOADS ](payload);\n                xdr.send(batch);\n                buffer[_DYN_MARK_AS_SENT ](payload);\n            }\n            function _formatErrorMessageXdr(xdr, message) {\n                if (xdr) {\n                    return \"XDomainRequest,Response:\" + _getResponseText(xdr) || \"\";\n                }\n                return message;\n            }\n            function _getNotifyMgr() {\n                var func = \"getNotifyMgr\";\n                if (_self.core[func]) {\n                    return _self.core[func]();\n                }\n                return _self.core[\"_notificationManager\"];\n            }\n            function _notifySendRequest(sendRequest, isAsync) {\n                var manager = _getNotifyMgr();\n                if (manager && manager[_DYN_EVENTS_SEND_REQUEST ]) {\n                    try {\n                        manager[_DYN_EVENTS_SEND_REQUEST ](sendRequest, isAsync);\n                    }\n                    catch (e) {\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 74 , \"send request notification failed: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                }\n            }\n            function _validateInstrumentationKey(config) {\n                var disableIKeyValidationFlag = isNullOrUndefined(config[_DYN_DISABLE_INSTRUMENTAT7 ]) ? false : config[_DYN_DISABLE_INSTRUMENTAT7 ];\n                if (disableIKeyValidationFlag) {\n                    return true;\n                }\n                var UUID_Regex = \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n                var regexp = new RegExp(UUID_Regex);\n                return regexp.test(config[_DYN_INSTRUMENTATION_KEY ]);\n            }\n            function _initDefaults() {\n                _self[_DYN__SENDER ] = null;\n                _self[_DYN__BUFFER ] = null;\n                _self._appId = null;\n                _self._sample = null;\n                _headers = {};\n                _offlineListener = null;\n                _consecutiveErrors = 0;\n                _retryAt = null;\n                _paused = false;\n                _timeoutHandle = null;\n                _serializer = null;\n                _stamp_specific_redirects = 0;\n                _syncFetchPayload = 0;\n                _fallbackSender = null;\n                _syncUnloadSender = null;\n                _evtNamespace = null;\n            }\n        });\n        return _this;\n    }\n    Sender.constructEnvelope = function (orig, iKey, logger, convertUndefined) {\n        var envelope;\n        if (iKey !== orig.iKey && !isNullOrUndefined(iKey)) {\n            envelope = __assignFn(__assignFn({}, orig), { iKey: iKey });\n        }\n        else {\n            envelope = orig;\n        }\n        var creator = EnvelopeTypeCreator[envelope.baseType] || EventEnvelopeCreator;\n        return creator(logger, envelope, convertUndefined);\n    };\n    return Sender;\n}(BaseTelemetryPlugin));\n\nvar Application = /** @class */ (function () {\n    function Application() {\n    }\n    return Application;\n}());\n\nvar Device = /** @class */ (function () {\n    function Device() {\n        this.id = \"browser\";\n        this.deviceClass = \"Browser\";\n    }\n    return Device;\n}());\n\nvar _DYN_SESSION_MANAGER = \"sessionManager\";\nvar _DYN_UPDATE = \"update\";\nvar _DYN_IS_USER_COOKIE_SET = \"isUserCookieSet\";\nvar _DYN_IS_NEW_USER = \"isNewUser\";\nvar _DYN_GET_TRACE_CTX = \"getTraceCtx\";\nvar _DYN_TELEMETRY_TRACE = \"telemetryTrace\";\nvar _DYN_APPLY_SESSION_CONTEX0 = \"applySessionContext\";\nvar _DYN_APPLY_APPLICATION_CO1 = \"applyApplicationContext\";\nvar _DYN_APPLY_DEVICE_CONTEXT = \"applyDeviceContext\";\nvar _DYN_APPLY_OPERATION_CONT2 = \"applyOperationContext\";\nvar _DYN_APPLY_USER_CONTEXT = \"applyUserContext\";\nvar _DYN_APPLY_OPERATING_SYST3 = \"applyOperatingSystemContxt\";\nvar _DYN_APPLY_LOCATION_CONTE4 = \"applyLocationContext\";\nvar _DYN_APPLY_INTERNAL_CONTE5 = \"applyInternalContext\";\nvar _DYN_ACCOUNT_ID = \"accountId\";\nvar _DYN_SDK_EXTENSION = \"sdkExtension\";\nvar _DYN_GET_SESSION_ID = \"getSessionId\";\nvar _DYN_NAME_PREFIX = \"namePrefix\";\nvar _DYN_SESSION_COOKIE_POSTF6 = \"sessionCookiePostfix\";\nvar _DYN_USER_COOKIE_POSTFIX = \"userCookiePostfix\";\nvar _DYN_ID_LENGTH = \"idLength\";\nvar _DYN_GET_NEW_ID = \"getNewId\";\nvar _DYN_LENGTH = \"length\";\nvar _DYN_AUTOMATIC_SESSION = \"automaticSession\";\nvar _DYN_AUTHENTICATED_ID = \"authenticatedId\";\nvar _DYN_SESSION_EXPIRATION_M7 = \"sessionExpirationMs\";\nvar _DYN_SESSION_RENEWAL_MS = \"sessionRenewalMs\";\nvar _DYN_CONFIG = \"config\";\nvar _DYN_ACQUISITION_DATE = \"acquisitionDate\";\nvar _DYN_RENEWAL_DATE = \"renewalDate\";\nvar _DYN_COOKIE_DOMAIN = \"cookieDomain\";\nvar _DYN_JOIN = \"join\";\nvar _DYN_COOKIE_SEPARATOR = \"cookieSeparator\";\nvar _DYN_AUTH_USER_COOKIE_NAM8 = \"authUserCookieName\";\n\nvar Version = '2.8.14';\nvar Internal = /** @class */ (function () {\n    function Internal(config) {\n        this.sdkVersion = (config[_DYN_SDK_EXTENSION ] && config[_DYN_SDK_EXTENSION ]() ? config[_DYN_SDK_EXTENSION ]() + \"_\" : \"\") + \"javascript:\" + Version;\n    }\n    return Internal;\n}());\n\nvar Location = /** @class */ (function () {\n    function Location() {\n    }\n    return Location;\n}());\n\nvar cookieNameConst = \"ai_session\";\nvar Session = /** @class */ (function () {\n    function Session() {\n    }\n    return Session;\n}());\nvar _SessionManager = /** @class */ (function () {\n    function _SessionManager(config, core) {\n        var self = this;\n        var _storageNamePrefix;\n        var _cookieUpdatedTimestamp;\n        var _logger = safeGetLogger(core);\n        var _cookieManager = safeGetCookieMgr(core);\n        dynamicProto(_SessionManager, self, function (_self) {\n            if (!config) {\n                config = {};\n            }\n            if (!isFunction(config[_DYN_SESSION_EXPIRATION_M7 ])) {\n                config[_DYN_SESSION_EXPIRATION_M7 ] = function () { return _SessionManager.acquisitionSpan; };\n            }\n            if (!isFunction(config[_DYN_SESSION_RENEWAL_MS ])) {\n                config[_DYN_SESSION_RENEWAL_MS ] = function () { return _SessionManager.renewalSpan; };\n            }\n            _self[_DYN_CONFIG ] = config;\n            var sessionCookiePostfix = (_self.config[_DYN_SESSION_COOKIE_POSTF6 ] && _self[_DYN_CONFIG ][_DYN_SESSION_COOKIE_POSTF6 ]()) ?\n                _self.config[_DYN_SESSION_COOKIE_POSTF6 ]() :\n                ((_self.config[_DYN_NAME_PREFIX ] && _self[_DYN_CONFIG ][_DYN_NAME_PREFIX ]()) ? _self[_DYN_CONFIG ][_DYN_NAME_PREFIX ]() : \"\");\n            _storageNamePrefix = function () { return cookieNameConst + sessionCookiePostfix; };\n            _self[_DYN_AUTOMATIC_SESSION ] = new Session();\n            _self[_DYN_UPDATE ] = function () {\n                var nowMs = dateNow();\n                var isExpired = false;\n                var session = _self[_DYN_AUTOMATIC_SESSION ];\n                if (!session.id) {\n                    isExpired = !_initializeAutomaticSession(session);\n                }\n                var sessionExpirationMs = _self.config[_DYN_SESSION_EXPIRATION_M7 ]();\n                if (!isExpired && sessionExpirationMs > 0) {\n                    var sessionRenewalMs = _self.config[_DYN_SESSION_RENEWAL_MS ]();\n                    var timeSinceAcqMs = nowMs - session[_DYN_ACQUISITION_DATE ];\n                    var timeSinceRenewalMs = nowMs - session[_DYN_RENEWAL_DATE ];\n                    isExpired = timeSinceAcqMs < 0 || timeSinceRenewalMs < 0;\n                    isExpired = isExpired || timeSinceAcqMs > sessionExpirationMs;\n                    isExpired = isExpired || timeSinceRenewalMs > sessionRenewalMs;\n                }\n                if (isExpired) {\n                    _renew(nowMs);\n                }\n                else {\n                    if (!_cookieUpdatedTimestamp || nowMs - _cookieUpdatedTimestamp > _SessionManager.cookieUpdateInterval) {\n                        _setCookie(session, nowMs);\n                    }\n                }\n            };\n            _self.backup = function () {\n                var session = _self[_DYN_AUTOMATIC_SESSION ];\n                _setStorage(session.id, session[_DYN_ACQUISITION_DATE ], session[_DYN_RENEWAL_DATE ]);\n            };\n            function _initializeAutomaticSession(session, now) {\n                var isValid = false;\n                var cookieValue = _cookieManager.get(_storageNamePrefix());\n                if (cookieValue && isFunction(cookieValue.split)) {\n                    isValid = _initializeAutomaticSessionWithData(session, cookieValue);\n                }\n                else {\n                    var storageValue = utlGetLocalStorage(_logger, _storageNamePrefix());\n                    if (storageValue) {\n                        isValid = _initializeAutomaticSessionWithData(session, storageValue);\n                    }\n                }\n                return isValid || !!session.id;\n            }\n            function _initializeAutomaticSessionWithData(session, sessionData) {\n                var isValid = false;\n                var sessionReset = \", session will be reset\";\n                var tokens = sessionData.split(\"|\");\n                if (tokens[_DYN_LENGTH ] >= 2) {\n                    try {\n                        var acqMs = +tokens[1] || 0;\n                        var renewalMs = +tokens[2] || 0;\n                        if (isNaN(acqMs) || acqMs <= 0) {\n                            _throwInternal(_logger, 2 , 27 , \"AI session acquisition date is 0\" + sessionReset);\n                        }\n                        else if (isNaN(renewalMs) || renewalMs <= 0) {\n                            _throwInternal(_logger, 2 , 27 , \"AI session renewal date is 0\" + sessionReset);\n                        }\n                        else if (tokens[0]) {\n                            session.id = tokens[0];\n                            session[_DYN_ACQUISITION_DATE ] = acqMs;\n                            session[_DYN_RENEWAL_DATE ] = renewalMs;\n                            isValid = true;\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(_logger, 1 , 9 , \"Error parsing ai_session value [\" + (sessionData || \"\") + \"]\" + sessionReset + \" - \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                }\n                return isValid;\n            }\n            function _renew(nowMs) {\n                var theConfig = (_self[_DYN_CONFIG ] || {});\n                var getNewId = (theConfig[_DYN_GET_NEW_ID ] ? theConfig[_DYN_GET_NEW_ID ]() : null) || newId;\n                _self.automaticSession.id = getNewId(theConfig[_DYN_ID_LENGTH ] ? theConfig[_DYN_ID_LENGTH ]() : 22);\n                _self[_DYN_AUTOMATIC_SESSION ][_DYN_ACQUISITION_DATE ] = nowMs;\n                _setCookie(_self[_DYN_AUTOMATIC_SESSION ], nowMs);\n                if (!utlCanUseLocalStorage()) {\n                    _throwInternal(_logger, 2 , 0 , \"Browser does not support local storage. Session durations will be inaccurate.\");\n                }\n            }\n            function _setCookie(session, nowMs) {\n                var acq = session[_DYN_ACQUISITION_DATE ];\n                session[_DYN_RENEWAL_DATE ] = nowMs;\n                var config = _self[_DYN_CONFIG ];\n                var renewalPeriodMs = config[_DYN_SESSION_RENEWAL_MS ]();\n                var acqTimeLeftMs = (acq + config[_DYN_SESSION_EXPIRATION_M7 ]()) - nowMs;\n                var cookie = [session.id, acq, nowMs];\n                var maxAgeSec = 0;\n                if (acqTimeLeftMs < renewalPeriodMs) {\n                    maxAgeSec = acqTimeLeftMs / 1000;\n                }\n                else {\n                    maxAgeSec = renewalPeriodMs / 1000;\n                }\n                var cookieDomain = config[_DYN_COOKIE_DOMAIN ] ? config[_DYN_COOKIE_DOMAIN ]() : null;\n                _cookieManager.set(_storageNamePrefix(), cookie.join(\"|\"), config[_DYN_SESSION_EXPIRATION_M7 ]() > 0 ? maxAgeSec : null, cookieDomain);\n                _cookieUpdatedTimestamp = nowMs;\n            }\n            function _setStorage(guid, acq, renewal) {\n                utlSetLocalStorage(_logger, _storageNamePrefix(), [guid, acq, renewal][_DYN_JOIN ](\"|\"));\n            }\n        });\n    }\n    _SessionManager.acquisitionSpan = 86400000;\n    _SessionManager.renewalSpan = 1800000;\n    _SessionManager.cookieUpdateInterval = 60000;\n    return _SessionManager;\n}());\n\nvar TelemetryTrace = /** @class */ (function () {\n    function TelemetryTrace(id, parentId, name, logger) {\n        var _self = this;\n        _self.traceID = id || generateW3CId();\n        _self.parentID = parentId;\n        var location = getLocation();\n        if (!name && location && location.pathname) {\n            name = location.pathname;\n        }\n        _self.name = dataSanitizeString(logger, name);\n    }\n    return TelemetryTrace;\n}());\n\nfunction _validateUserInput(id) {\n    if (typeof id !== \"string\" ||\n        !id ||\n        id.match(/,|;|=| |\\|/)) {\n        return false;\n    }\n    return true;\n}\nvar User = /** @class */ (function () {\n    function User(config, core) {\n        this.isNewUser = false;\n        this.isUserCookieSet = false;\n        var _logger = safeGetLogger(core);\n        var _cookieManager = safeGetCookieMgr(core);\n        var _storageNamePrefix;\n        dynamicProto(User, this, function (_self) {\n            _self[_DYN_CONFIG ] = config;\n            var userCookiePostfix = (_self.config[_DYN_USER_COOKIE_POSTFIX ] && _self[_DYN_CONFIG ][_DYN_USER_COOKIE_POSTFIX ]()) ? _self[_DYN_CONFIG ][_DYN_USER_COOKIE_POSTFIX ]() : \"\";\n            _storageNamePrefix = function () { return User.userCookieName + userCookiePostfix; };\n            var cookie = _cookieManager.get(_storageNamePrefix());\n            if (cookie) {\n                _self[_DYN_IS_NEW_USER ] = false;\n                var params = cookie.split(User[_DYN_COOKIE_SEPARATOR ]);\n                if (params[_DYN_LENGTH ] > 0) {\n                    _self.id = params[0];\n                    _self[_DYN_IS_USER_COOKIE_SET ] = !!_self.id;\n                }\n            }\n            function _generateNewId() {\n                var theConfig = (config || {});\n                var getNewId = (theConfig[_DYN_GET_NEW_ID ] ? theConfig[_DYN_GET_NEW_ID ]() : null) || newId;\n                var id = getNewId(theConfig[_DYN_ID_LENGTH ] ? config[_DYN_ID_LENGTH ]() : 22);\n                return id;\n            }\n            function _generateNewCookie(userId) {\n                var acqStr = toISOString(new Date());\n                _self.accountAcquisitionDate = acqStr;\n                _self[_DYN_IS_NEW_USER ] = true;\n                var newCookie = [userId, acqStr];\n                return newCookie;\n            }\n            function _setUserCookie(cookie) {\n                var oneYear = 31536000;\n                _self[_DYN_IS_USER_COOKIE_SET ] = _cookieManager.set(_storageNamePrefix(), cookie, oneYear);\n            }\n            if (!_self.id) {\n                _self.id = _generateNewId();\n                var newCookie = _generateNewCookie(_self.id);\n                _setUserCookie(newCookie[_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]));\n                var name_1 = config[_DYN_NAME_PREFIX ] && config[_DYN_NAME_PREFIX ]() ? config[_DYN_NAME_PREFIX ]() + \"ai_session\" : \"ai_session\";\n                utlRemoveStorage(_logger, name_1);\n            }\n            _self[_DYN_ACCOUNT_ID ] = config[_DYN_ACCOUNT_ID ] ? config[_DYN_ACCOUNT_ID ]() : undefined;\n            var authCookie = _cookieManager.get(User[_DYN_AUTH_USER_COOKIE_NAM8 ]);\n            if (authCookie) {\n                authCookie = decodeURI(authCookie);\n                var authCookieString = authCookie.split(User[_DYN_COOKIE_SEPARATOR ]);\n                if (authCookieString[0]) {\n                    _self[_DYN_AUTHENTICATED_ID ] = authCookieString[0];\n                }\n                if (authCookieString[_DYN_LENGTH ] > 1 && authCookieString[1]) {\n                    _self[_DYN_ACCOUNT_ID ] = authCookieString[1];\n                }\n            }\n            _self.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n                if (storeInCookie === void 0) { storeInCookie = false; }\n                var isInvalidInput = !_validateUserInput(authenticatedUserId) || (accountId && !_validateUserInput(accountId));\n                if (isInvalidInput) {\n                    _throwInternal(_logger, 2 , 60 , \"Setting auth user context failed. \" +\n                        \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                    return;\n                }\n                _self[_DYN_AUTHENTICATED_ID ] = authenticatedUserId;\n                var authCookie = _self[_DYN_AUTHENTICATED_ID ];\n                if (accountId) {\n                    _self[_DYN_ACCOUNT_ID ] = accountId;\n                    authCookie = [_self[_DYN_AUTHENTICATED_ID ], _self.accountId][_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]);\n                }\n                if (storeInCookie) {\n                    _cookieManager.set(User[_DYN_AUTH_USER_COOKIE_NAM8 ], encodeURI(authCookie));\n                }\n            };\n            _self.clearAuthenticatedUserContext = function () {\n                _self[_DYN_AUTHENTICATED_ID ] = null;\n                _self[_DYN_ACCOUNT_ID ] = null;\n                _cookieManager.del(User[_DYN_AUTH_USER_COOKIE_NAM8 ]);\n            };\n            _self[_DYN_UPDATE ] = function (userId) {\n                if (_self.id !== userId || !_self[_DYN_IS_USER_COOKIE_SET ]) {\n                    var user_id = userId ? userId : _generateNewId();\n                    var user_cookie = _generateNewCookie(user_id);\n                    _setUserCookie(user_cookie[_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]));\n                }\n            };\n        });\n    }\n    User.cookieSeparator = \"|\";\n    User.userCookieName = \"ai_user\";\n    User.authUserCookieName = \"ai_authUser\";\n    return User;\n}());\n\nvar strExt = \"ext\";\nvar strTags = \"tags\";\nfunction _removeEmpty(target, name) {\n    if (target && target[name] && objKeys(target[name])[_DYN_LENGTH ] === 0) {\n        delete target[name];\n    }\n}\nvar TelemetryContext = /** @class */ (function () {\n    function TelemetryContext(core, defaultConfig, previousTraceCtx) {\n        var _this = this;\n        var logger = core.logger;\n        this.appId = function () { return null; };\n        this[_DYN_GET_SESSION_ID ] = function () { return null; };\n        dynamicProto(TelemetryContext, this, function (_self) {\n            _self.application = new Application();\n            _self.internal = new Internal(defaultConfig);\n            if (hasWindow()) {\n                _self[_DYN_SESSION_MANAGER ] = new _SessionManager(defaultConfig, core);\n                _self.device = new Device();\n                _self.location = new Location();\n                _self.user = new User(defaultConfig, core);\n                var traceId = void 0;\n                var parentId = void 0;\n                var name_1;\n                if (previousTraceCtx) {\n                    traceId = previousTraceCtx.getTraceId();\n                    parentId = previousTraceCtx.getSpanId();\n                    name_1 = previousTraceCtx.getName();\n                }\n                _self[_DYN_TELEMETRY_TRACE ] = new TelemetryTrace(traceId, parentId, name_1, logger);\n                _self.session = new Session();\n            }\n            _self[_DYN_GET_SESSION_ID ] = function () {\n                var session = _self.session;\n                var sesId = null;\n                if (session && isString(session.id)) {\n                    sesId = session.id;\n                }\n                else {\n                    var autoSession = (_self[_DYN_SESSION_MANAGER ] || {})[_DYN_AUTOMATIC_SESSION ];\n                    sesId = autoSession && isString(autoSession.id) ? autoSession.id : null;\n                }\n                return sesId;\n            };\n            _self[_DYN_APPLY_SESSION_CONTEX0 ] = function (evt, itemCtx) {\n                setValue(getSetValue(evt.ext, Extensions.AppExt), \"sesId\", _self[_DYN_GET_SESSION_ID ](), isString);\n            };\n            _self[_DYN_APPLY_OPERATING_SYST3 ] = function (evt, itemCtx) {\n                setValue(evt.ext, Extensions.OSExt, _self.os);\n            };\n            _self[_DYN_APPLY_APPLICATION_CO1 ] = function (evt, itemCtx) {\n                var application = _self.application;\n                if (application) {\n                    var tags = getSetValue(evt, strTags);\n                    setValue(tags, CtxTagKeys.applicationVersion, application.ver, isString);\n                    setValue(tags, CtxTagKeys.applicationBuild, application.build, isString);\n                }\n            };\n            _self[_DYN_APPLY_DEVICE_CONTEXT ] = function (evt, itemCtx) {\n                var device = _self.device;\n                if (device) {\n                    var extDevice = getSetValue(getSetValue(evt, strExt), Extensions.DeviceExt);\n                    setValue(extDevice, \"localId\", device.id, isString);\n                    setValue(extDevice, \"ip\", device.ip, isString);\n                    setValue(extDevice, \"model\", device.model, isString);\n                    setValue(extDevice, \"deviceClass\", device.deviceClass, isString);\n                }\n            };\n            _self[_DYN_APPLY_INTERNAL_CONTE5 ] = function (evt, itemCtx) {\n                var internal = _self.internal;\n                if (internal) {\n                    var tags = getSetValue(evt, strTags);\n                    setValue(tags, CtxTagKeys.internalAgentVersion, internal.agentVersion, isString);\n                    setValue(tags, CtxTagKeys.internalSdkVersion, dataSanitizeString(logger, internal.sdkVersion, 64), isString);\n                    if (evt.baseType === _InternalLogMessage.dataType || evt.baseType === PageView.dataType) {\n                        setValue(tags, CtxTagKeys.internalSnippet, internal.snippetVer, isString);\n                        setValue(tags, CtxTagKeys.internalSdkSrc, internal.sdkSrc, isString);\n                    }\n                }\n            };\n            _self[_DYN_APPLY_LOCATION_CONTE4 ] = function (evt, itemCtx) {\n                var location = _this.location;\n                if (location) {\n                    setValue(getSetValue(evt, strTags, []), CtxTagKeys.locationIp, location.ip, isString);\n                }\n            };\n            _self[_DYN_APPLY_OPERATION_CONT2 ] = function (evt, itemCtx) {\n                var telemetryTrace = _self[_DYN_TELEMETRY_TRACE ];\n                if (telemetryTrace) {\n                    var extTrace = getSetValue(getSetValue(evt, strExt), Extensions.TraceExt, { traceID: undefined, parentID: undefined });\n                    setValue(extTrace, \"traceID\", telemetryTrace.traceID, isString, isNullOrUndefined);\n                    setValue(extTrace, \"name\", telemetryTrace.name, isString, isNullOrUndefined);\n                    setValue(extTrace, \"parentID\", telemetryTrace.parentID, isString, isNullOrUndefined);\n                }\n            };\n            _self.applyWebContext = function (evt, itemCtx) {\n                var web = _this.web;\n                if (web) {\n                    setValue(getSetValue(evt, strExt), Extensions.WebExt, web);\n                }\n            };\n            _self[_DYN_APPLY_USER_CONTEXT ] = function (evt, itemCtx) {\n                var user = _self.user;\n                if (user) {\n                    var tags = getSetValue(evt, strTags, []);\n                    setValue(tags, CtxTagKeys.userAccountId, user[_DYN_ACCOUNT_ID ], isString);\n                    var extUser = getSetValue(getSetValue(evt, strExt), Extensions.UserExt);\n                    setValue(extUser, \"id\", user.id, isString);\n                    setValue(extUser, \"authId\", user[_DYN_AUTHENTICATED_ID ], isString);\n                }\n            };\n            _self.cleanUp = function (evt, itemCtx) {\n                var ext = evt.ext;\n                if (ext) {\n                    _removeEmpty(ext, Extensions.DeviceExt);\n                    _removeEmpty(ext, Extensions.UserExt);\n                    _removeEmpty(ext, Extensions.WebExt);\n                    _removeEmpty(ext, Extensions.OSExt);\n                    _removeEmpty(ext, Extensions.AppExt);\n                    _removeEmpty(ext, Extensions.TraceExt);\n                }\n            };\n        });\n    }\n    TelemetryContext.__ieDyn=1;\n    return TelemetryContext;\n}());\n\nvar PropertiesPlugin = /** @class */ (function (_super) {\n    __extendsFn(PropertiesPlugin, _super);\n    function PropertiesPlugin() {\n        var _this = _super.call(this) || this;\n        _this.priority = 110;\n        _this.identifier = PropertiesPluginIdentifier;\n        var _extensionConfig;\n        var _distributedTraceCtx;\n        var _previousTraceCtx;\n        dynamicProto(PropertiesPlugin, _this, function (_self, _base) {\n            _initDefaults();\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                _base.initialize(config, core, extensions, pluginChain);\n                _populateDefaults(config);\n            };\n            _self.processTelemetry = function (event, itemCtx) {\n                if (isNullOrUndefined(event)) ;\n                else {\n                    itemCtx = _self._getTelCtx(itemCtx);\n                    if (event.name === PageView.envelopeType) {\n                        itemCtx.diagLog().resetInternalMessageCount();\n                    }\n                    var theContext = (_self.context || {});\n                    if (theContext.session) {\n                        if (typeof _self.context.session.id !== \"string\" && theContext[_DYN_SESSION_MANAGER ]) {\n                            theContext[_DYN_SESSION_MANAGER ][_DYN_UPDATE ]();\n                        }\n                    }\n                    var userCtx = theContext.user;\n                    if (userCtx && !userCtx[_DYN_IS_USER_COOKIE_SET ]) {\n                        userCtx[_DYN_UPDATE ](theContext.user.id);\n                    }\n                    _processTelemetryInternal(event, itemCtx);\n                    if (userCtx && userCtx[_DYN_IS_NEW_USER ]) {\n                        userCtx[_DYN_IS_NEW_USER ] = false;\n                        var message = new _InternalLogMessage(72 , ((getNavigator() || {}).userAgent || \"\"));\n                        _logInternalMessage(itemCtx.diagLog(), 1 , message);\n                    }\n                    _self.processNext(event, itemCtx);\n                }\n            };\n            _self._doTeardown = function (unloadCtx, unloadState) {\n                var core = (unloadCtx || {}).core();\n                if (core && core[_DYN_GET_TRACE_CTX ]) {\n                    var traceCtx = core[_DYN_GET_TRACE_CTX ](false);\n                    if (traceCtx === _distributedTraceCtx) {\n                        core.setTraceCtx(_previousTraceCtx);\n                    }\n                }\n                _initDefaults();\n            };\n            function _initDefaults() {\n                _extensionConfig = null;\n                _distributedTraceCtx = null;\n                _previousTraceCtx = null;\n            }\n            function _populateDefaults(config) {\n                var identifier = _self.identifier;\n                var core = _self.core;\n                var ctx = createProcessTelemetryContext(null, config, core);\n                var defaultConfig = PropertiesPlugin.getDefaultConfig();\n                _extensionConfig = _extensionConfig || {};\n                objForEachKey(defaultConfig, function (field, value) {\n                    _extensionConfig[field] = function () { return ctx.getConfig(identifier, field, value()); };\n                });\n                if (config.storagePrefix) {\n                    utlSetStoragePrefix(config.storagePrefix);\n                }\n                _previousTraceCtx = core[_DYN_GET_TRACE_CTX ](false);\n                _self.context = new TelemetryContext(core, _extensionConfig, _previousTraceCtx);\n                _distributedTraceCtx = createDistributedTraceContextFromTrace(_self.context[_DYN_TELEMETRY_TRACE ], _previousTraceCtx);\n                core.setTraceCtx(_distributedTraceCtx);\n                _self.context.appId = function () {\n                    var breezeChannel = core.getPlugin(BreezeChannelIdentifier);\n                    return breezeChannel ? breezeChannel.plugin[\"_appId\"] : null;\n                };\n                _self[\"_extConfig\"] = _extensionConfig;\n            }\n            function _processTelemetryInternal(evt, itemCtx) {\n                getSetValue(evt, \"tags\", []);\n                getSetValue(evt, \"ext\", {});\n                var ctx = _self.context;\n                ctx[_DYN_APPLY_SESSION_CONTEX0 ](evt, itemCtx);\n                ctx[_DYN_APPLY_APPLICATION_CO1 ](evt, itemCtx);\n                ctx[_DYN_APPLY_DEVICE_CONTEXT ](evt, itemCtx);\n                ctx[_DYN_APPLY_OPERATION_CONT2 ](evt, itemCtx);\n                ctx[_DYN_APPLY_USER_CONTEXT ](evt, itemCtx);\n                ctx[_DYN_APPLY_OPERATING_SYST3 ](evt, itemCtx);\n                ctx.applyWebContext(evt, itemCtx);\n                ctx[_DYN_APPLY_LOCATION_CONTE4 ](evt, itemCtx);\n                ctx[_DYN_APPLY_INTERNAL_CONTE5 ](evt, itemCtx);\n                ctx.cleanUp(evt, itemCtx);\n            }\n        });\n        return _this;\n    }\n    PropertiesPlugin.getDefaultConfig = function () {\n        var _a;\n        var defaultValue;\n        var nullValue = null;\n        var defaultConfig = (_a = {\n                instrumentationKey: function () { return defaultValue; }\n            },\n            _a[_DYN_ACCOUNT_ID ] = function () { return nullValue; },\n            _a.sessionRenewalMs = function () { return 30 * 60 * 1000; },\n            _a.samplingPercentage = function () { return 100; },\n            _a.sessionExpirationMs = function () { return 24 * 60 * 60 * 1000; },\n            _a[_DYN_COOKIE_DOMAIN ] = function () { return nullValue; },\n            _a[_DYN_SDK_EXTENSION ] = function () { return nullValue; },\n            _a.isBrowserLinkTrackingEnabled = function () { return false; },\n            _a.appId = function () { return nullValue; },\n            _a[_DYN_GET_SESSION_ID ] = function () { return nullValue; },\n            _a[_DYN_NAME_PREFIX ] = function () { return defaultValue; },\n            _a[_DYN_SESSION_COOKIE_POSTF6 ] = function () { return defaultValue; },\n            _a[_DYN_USER_COOKIE_POSTFIX ] = function () { return defaultValue; },\n            _a[_DYN_ID_LENGTH ] = function () { return 22; },\n            _a[_DYN_GET_NEW_ID ] = function () { return nullValue; },\n            _a);\n        return defaultConfig;\n    };\n    return PropertiesPlugin;\n}(BaseTelemetryPlugin));\nvar PropertiesPlugin$1 = PropertiesPlugin;\n\nvar _internalSdkSrc;\nvar _ignoreUpdateSnippetProperties = [\n    STR_SNIPPET, \"dependencies\", \"properties\", \"_snippetVersion\", \"appInsightsNew\", \"getSKUDefaults\"\n];\nvar fieldType = {\n    Default: 0 ,\n    Required: 1 ,\n    Array: 2 ,\n    Hidden: 4\n};\nvar Telemetry = {\n    __proto__: null,\n    PropertiesPluginIdentifier: PropertiesPluginIdentifier,\n    BreezeChannelIdentifier: BreezeChannelIdentifier,\n    AnalyticsPluginIdentifier: AnalyticsPluginIdentifier,\n    Util: Util,\n    CorrelationIdHelper: CorrelationIdHelper,\n    UrlHelper: UrlHelper,\n    DateTimeUtils: DateTimeUtils,\n    ConnectionStringParser: ConnectionStringParser,\n    FieldType: fieldType,\n    RequestHeaders: RequestHeaders,\n    DisabledPropertyName: DisabledPropertyName,\n    ProcessLegacy: ProcessLegacy,\n    SampleRate: SampleRate,\n    HttpMethod: HttpMethod,\n    DEFAULT_BREEZE_ENDPOINT: DEFAULT_BREEZE_ENDPOINT,\n    Envelope: Envelope,\n    Event: Event$1,\n    Exception: Exception,\n    Metric: Metric,\n    PageView: PageView,\n    RemoteDependencyData: RemoteDependencyData,\n    Trace: Trace,\n    PageViewPerformance: PageViewPerformance,\n    Data: Data,\n    SeverityLevel: SeverityLevel,\n    ConfigurationManager: ConfigurationManager,\n    ContextTagKeys: ContextTagKeys,\n    DataSanitizer: DataSanitizer,\n    TelemetryItemCreator: TelemetryItemCreator,\n    CtxTagKeys: CtxTagKeys,\n    Extensions: Extensions,\n    DistributedTracingModes: DistributedTracingModes\n};\nvar Initialization = /** @class */ (function () {\n    function Initialization(snippet) {\n        var _this = this;\n        var dependencies;\n        var properties;\n        var _sender;\n        var _snippetVersion;\n        var _evtNamespace;\n        var _houseKeepingNamespace;\n        var _core;\n        dynamicProto(Initialization, this, function (_self) {\n            _initDefaults();\n            _snippetVersion = \"\" + (snippet.sv || snippet[_DYN_VERSION ] || \"\");\n            snippet[_DYN_QUEUE ] = snippet[_DYN_QUEUE ] || [];\n            snippet[_DYN_VERSION ] = snippet[_DYN_VERSION ] || 2.0;\n            var config = snippet[_DYN_CONFIG$1 ] || {};\n            if (config[_DYN_CONNECTION_STRING ]) {\n                var cs = parseConnectionString(config[_DYN_CONNECTION_STRING ]);\n                var ingest = cs.ingestionendpoint;\n                config[_DYN_ENDPOINT_URL$1 ] = ingest ? (ingest + DEFAULT_BREEZE_PATH) : config[_DYN_ENDPOINT_URL$1 ];\n                config[_DYN_INSTRUMENTATION_KEY$1 ] = cs.instrumentationkey || config[_DYN_INSTRUMENTATION_KEY$1 ];\n            }\n            _self[_DYN_APP_INSIGHTS ] = new AnalyticsPlugin();\n            properties = new PropertiesPlugin$1();\n            dependencies = new AjaxMonitor();\n            _sender = new Sender();\n            _core = new AppInsightsCore();\n            _self.core = _core;\n            var isErrMessageDisabled = isNullOrUndefined(config[_DYN_DISABLE_IKEY_DEPRECA18 ]) ? true : config[_DYN_DISABLE_IKEY_DEPRECA18 ];\n            if (!config[_DYN_CONNECTION_STRING ] && !isErrMessageDisabled) {\n                _throwInternal(_core.logger, 1 , 106 , \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\");\n            }\n            _self[STR_SNIPPET ] = snippet;\n            _self[_DYN_CONFIG$1 ] = config;\n            _getSKUDefaults();\n            _self[STR_FLUSH ] = function (async) {\n                if (async === void 0) { async = true; }\n                doPerf(_core, function () { return \"AISKU.flush\"; }, function () {\n                    arrForEach(_core[_DYN_GET_TRANSMISSION_CON19 ](), function (channels) {\n                        arrForEach(channels, function (channel) {\n                            channel[STR_FLUSH ](async);\n                        });\n                    });\n                }, null, async);\n            };\n            _self[_DYN_ONUNLOAD_FLUSH ] = function (async) {\n                if (async === void 0) { async = true; }\n                arrForEach(_core[_DYN_GET_TRANSMISSION_CON19 ](), function (channels) {\n                    arrForEach(channels, function (channel) {\n                        if (channel[_DYN_ONUNLOAD_FLUSH ]) {\n                            channel[_DYN_ONUNLOAD_FLUSH ]();\n                        }\n                        else {\n                            channel[STR_FLUSH ](async);\n                        }\n                    });\n                });\n            };\n            _self[_DYN_LOAD_APP_INSIGHTS ] = function (legacyMode, logger, notificationManager) {\n                if (legacyMode === void 0) { legacyMode = false; }\n                function _updateSnippetProperties(snippet) {\n                    if (snippet) {\n                        var snippetVer = \"\";\n                        if (!isNullOrUndefined(_snippetVersion)) {\n                            snippetVer += _snippetVersion;\n                        }\n                        if (legacyMode) {\n                            snippetVer += \".lg\";\n                        }\n                        if (_self[_DYN_CONTEXT ] && _self[_DYN_CONTEXT ].internal) {\n                            _self[_DYN_CONTEXT ].internal.snippetVer = snippetVer || \"-\";\n                        }\n                        objForEachKey(_self, function (field, value) {\n                            if (isString(field) &&\n                                !isFunction(value) &&\n                                field && field[0] !== \"_\" &&\n                                arrIndexOf(_ignoreUpdateSnippetProperties, field) === -1) {\n                                snippet[field] = value;\n                            }\n                        });\n                    }\n                }\n                if (legacyMode && _self[_DYN_CONFIG$1 ].extensions && _self[_DYN_CONFIG$1 ].extensions.length > 0) {\n                    throwError(\"Extensions not allowed in legacy mode\");\n                }\n                doPerf(_self.core, function () { return \"AISKU.loadAppInsights\"; }, function () {\n                    var extensions = [];\n                    extensions[_DYN_PUSH$1 ](_sender);\n                    extensions[_DYN_PUSH$1 ](properties);\n                    extensions[_DYN_PUSH$1 ](dependencies);\n                    extensions[_DYN_PUSH$1 ](_self[_DYN_APP_INSIGHTS ]);\n                    _core.initialize(_self[_DYN_CONFIG$1 ], extensions, logger, notificationManager);\n                    _self[_DYN_CONTEXT ] = properties[_DYN_CONTEXT ];\n                    if (_internalSdkSrc && _self[_DYN_CONTEXT ]) {\n                        _self[_DYN_CONTEXT ].internal.sdkSrc = _internalSdkSrc;\n                    }\n                    _updateSnippetProperties(_self[STR_SNIPPET ]);\n                    _self.emptyQueue();\n                    _self[STR_POLL_INTERNAL_LOGS ]();\n                    _self[_DYN_ADD_HOUSEKEEPING_BEF20 ](_self);\n                });\n                return _self;\n            };\n            _self[_DYN_UPDATE_SNIPPET_DEFIN0 ] = function (snippet) {\n                proxyAssign(snippet, _self, function (name) {\n                    return name && arrIndexOf(_ignoreUpdateSnippetProperties, name) === -1;\n                });\n            };\n            _self.emptyQueue = function () {\n                try {\n                    if (isArray(_self.snippet[_DYN_QUEUE ])) {\n                        var length_1 = _self.snippet[_DYN_QUEUE ].length;\n                        for (var i = 0; i < length_1; i++) {\n                            var call = _self.snippet[_DYN_QUEUE ][i];\n                            call();\n                        }\n                        _self.snippet[_DYN_QUEUE ] = undefined;\n                        delete _self.snippet[_DYN_QUEUE ];\n                    }\n                }\n                catch (exception) {\n                    var properties_1 = {};\n                    if (exception && isFunction(exception.toString)) {\n                        properties_1.exception = exception.toString();\n                    }\n                }\n            };\n            _self[_DYN_ADD_HOUSEKEEPING_BEF20 ] = function (appInsightsInstance) {\n                if (hasWindow() || hasDocument()) {\n                    var performHousekeeping = function () {\n                        appInsightsInstance[_DYN_ONUNLOAD_FLUSH ](false);\n                        if (isFunction(_this.core[STR_GET_PLUGIN ])) {\n                            var loadedPlugin = _this.core[STR_GET_PLUGIN ](PropertiesPluginIdentifier);\n                            if (loadedPlugin) {\n                                var propertiesPlugin = loadedPlugin.plugin;\n                                if (propertiesPlugin && propertiesPlugin[_DYN_CONTEXT ] && propertiesPlugin[_DYN_CONTEXT ]._sessionManager) {\n                                    propertiesPlugin[_DYN_CONTEXT ]._sessionManager.backup();\n                                }\n                            }\n                        }\n                    };\n                    var added = false;\n                    var excludePageUnloadEvents = appInsightsInstance.appInsights[_DYN_CONFIG$1 ].disablePageUnloadEvents;\n                    if (!_houseKeepingNamespace) {\n                        _houseKeepingNamespace = mergeEvtNamespace(_evtNamespace, _core[STR_EVT_NAMESPACE ] && _core[STR_EVT_NAMESPACE ]());\n                    }\n                    if (!appInsightsInstance.appInsights.config[_DYN_DISABLE_FLUSH_ON_BEF11 ]) {\n                        if (addPageUnloadEventListener(performHousekeeping, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                            added = true;\n                        }\n                        if (addPageHideEventListener(performHousekeeping, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                            added = true;\n                        }\n                        if (!added && !isReactNative()) {\n                            _throwInternal(appInsightsInstance[_DYN_APP_INSIGHTS ].core.logger, 1 , 19 , \"Could not add handler for beforeunload and pagehide\");\n                        }\n                    }\n                    if (!added && !appInsightsInstance.appInsights.config[_DYN_DISABLE_FLUSH_ON_UNL12 ]) {\n                        addPageHideEventListener(performHousekeeping, excludePageUnloadEvents, _houseKeepingNamespace);\n                    }\n                }\n            };\n            _self.getSender = function () {\n                return _sender;\n            };\n            _self.unload = function (isAsync, unloadComplete, cbTimeout) {\n                _self[_DYN_ONUNLOAD_FLUSH ](isAsync);\n                if (_houseKeepingNamespace) {\n                    removePageUnloadEventListener(null, _houseKeepingNamespace);\n                    removePageHideEventListener(null, _houseKeepingNamespace);\n                }\n                _core.unload && _core.unload(isAsync, unloadComplete, cbTimeout);\n            };\n            proxyFunctions(_self, _self[_DYN_APP_INSIGHTS ], [\n                STR_GET_COOKIE_MGR,\n                STR_TRACK_EVENT,\n                STR_TRACK_PAGE_VIEW,\n                \"trackPageViewPerformance\",\n                STR_TRACK_EXCEPTION,\n                \"_onerror\",\n                STR_TRACK_TRACE,\n                STR_TRACK_METRIC,\n                STR_START_TRACK_PAGE,\n                STR_STOP_TRACK_PAGE,\n                STR_START_TRACK_EVENT,\n                STR_STOP_TRACK_EVENT\n            ]);\n            proxyFunctions(_self, _getCurrentDependencies, [\n                STR_TRACK_DEPENDENCY_DATA,\n                \"addDependencyListener\",\n                \"addDependencyInitializer\"\n            ]);\n            proxyFunctions(_self, _core, [\n                STR_ADD_TELEMETRY_INITIALIZER,\n                STR_POLL_INTERNAL_LOGS,\n                \"stopPollingInternalLogs\",\n                STR_GET_PLUGIN,\n                \"addPlugin\",\n                STR_EVT_NAMESPACE,\n                \"addUnloadCb\",\n                \"getTraceCtx\"\n            ]);\n            proxyFunctions(_self, function () {\n                var context = properties[_DYN_CONTEXT ];\n                return context ? context.user : null;\n            }, [\n                STR_SET_AUTHENTICATED_USER_CONTEXT,\n                STR_CLEAR_AUTHENTICATED_USER_CONTEXT\n            ]);\n            function _getSKUDefaults() {\n                _self.config[_DYN_DIAGNOSTIC_LOG_INTER4 ] =\n                    _self.config[_DYN_DIAGNOSTIC_LOG_INTER4 ] && _self[_DYN_CONFIG$1 ][_DYN_DIAGNOSTIC_LOG_INTER4 ] > 0 ? _self[_DYN_CONFIG$1 ][_DYN_DIAGNOSTIC_LOG_INTER4 ] : 10000;\n            }\n            function _getCurrentDependencies() {\n                return dependencies;\n            }\n            function _initDefaults() {\n                _evtNamespace = createUniqueNamespace(\"AISKU\");\n                _houseKeepingNamespace = null;\n                dependencies = null;\n                properties = null;\n                _sender = null;\n                _snippetVersion = null;\n            }\n        });\n    }\n    Initialization.prototype.addDependencyInitializer = function (dependencyInitializer) {\n        return null;\n    };\n    return Initialization;\n}());\n(function () {\n    var sdkSrc = null;\n    var cdns = [\n        \"://js.monitor.azure.com/\",\n        \"://az416426.vo.msecnd.net/\"\n    ];\n    try {\n        var scrpt = (document || {}).currentScript;\n        if (scrpt) {\n            sdkSrc = scrpt.src;\n        }\n    }\n    catch (e) {\n    }\n    if (sdkSrc) {\n        try {\n            var url = sdkSrc.toLowerCase();\n            if (url) {\n                var src = \"\";\n                for (var idx = 0; idx < cdns.length; idx++) {\n                    if (url[_DYN_INDEX_OF ](cdns[idx]) !== -1) {\n                        src = \"cdn\" + (idx + 1);\n                        if (url[_DYN_INDEX_OF ](\"/scripts/\") === -1) {\n                            if (url[_DYN_INDEX_OF ](\"/next/\") !== -1) {\n                                src += \"-next\";\n                            }\n                            else if (url[_DYN_INDEX_OF ](\"/beta/\") !== -1) {\n                                src += \"-beta\";\n                            }\n                        }\n                        _internalSdkSrc = src + (\"\");\n                        break;\n                    }\n                }\n            }\n        }\n        catch (e) {\n        }\n    }\n})();\n\nvar ApplicationInsightsContainer = /** @class */ (function () {\n    function ApplicationInsightsContainer() {\n    }\n    ApplicationInsightsContainer.getAppInsights = function (snippet, version) {\n        var initialization = new Initialization(snippet);\n        var legacyMode = version >= 2 ? false : true;\n        _legacyCookieMgr();\n        if (!legacyMode) {\n            initialization[_DYN_UPDATE_SNIPPET_DEFIN0 ](snippet);\n            initialization[_DYN_LOAD_APP_INSIGHTS ](legacyMode);\n            return initialization;\n        }\n        else {\n            var legacy = new AppInsightsDeprecated(snippet, initialization);\n            legacy[_DYN_UPDATE_SNIPPET_DEFIN0 ](snippet);\n            initialization[_DYN_LOAD_APP_INSIGHTS ](legacyMode);\n            return legacy;\n        }\n    };\n    return ApplicationInsightsContainer;\n}());\n\nfunction _logWarn(aiName, message) {\n    var _console = typeof console !== strShimUndefined ? console : null;\n    if (_console && _console.warn) {\n        _console.warn(\"Failed to initialize AppInsights JS SDK for instance \" + (aiName || \"<unknown>\") + \" - \" + message);\n    }\n}\ntry {\n    var aiName;\n    if (typeof window !== strShimUndefined) {\n        var _window = window;\n        aiName = _window[\"appInsightsSDK\"] || \"appInsights\";\n        if (typeof JSON !== strShimUndefined) {\n            if (_window[aiName] !== undefined) {\n                var snippet = _window[aiName] || { version: 2.0 };\n                if ((snippet[_DYN_VERSION ] >= 2 && _window[aiName].initialize) || snippet[_DYN_VERSION ] === undefined) {\n                    ApplicationInsightsContainer.getAppInsights(snippet, snippet[_DYN_VERSION ]);\n                }\n            }\n        }\n        else {\n            _logWarn(aiName, \"Missing JSON - you must supply a JSON polyfill!\");\n        }\n    }\n    else {\n        _logWarn(aiName, \"Missing window\");\n    }\n}\ncatch (e) {\n    _logWarn(aiName, e.message);\n}\n\nexports.AnalyticsPluginIdentifier = AnalyticsPluginIdentifier;\nexports.ApplicationInsights = Initialization;\nexports.BreezeChannelIdentifier = BreezeChannelIdentifier;\nexports.CoreUtils = CoreUtils;\nexports.DEFAULT_BREEZE_ENDPOINT = DEFAULT_BREEZE_ENDPOINT;\nexports.DisabledPropertyName = DisabledPropertyName;\nexports.DistributedTracingModes = DistributedTracingModes;\nexports.LoggingSeverity = LoggingSeverity;\nexports.PerfEvent = PerfEvent;\nexports.PerfManager = PerfManager;\nexports.PropertiesPluginIdentifier = PropertiesPluginIdentifier;\nexports.RequestHeaders = RequestHeaders;\nexports.SeverityLevel = SeverityLevel;\nexports.Telemetry = Telemetry;\nexports.Util = Util;\nexports.addEventHandler = addEventHandler;\nexports.doPerf = doPerf;\nexports.eventOff = eventOff;\nexports.eventOn = eventOn;\nexports.findMetaTag = findMetaTag;\nexports.findW3cTraceParent = findW3cTraceParent;\nexports.generateW3CId = generateW3CId;\nexports.isBeaconsSupported = isBeaconsSupported;\nexports.mergeEvtNamespace = mergeEvtNamespace;\nexports.newGuid = newGuid;\nexports.newId = newId;\nexports.random32 = random32;\nexports.randomValue = randomValue;\nexports.removeEventHandler = removeEventHandler;\n\n}));\n//# sourceMappingURL=ai.2.8.14.js.map\n"
  },
  {
    "path": "AISKU/Tests/Manual/ai3.test.js",
    "content": "/*!\n * Application Insights JavaScript SDK - Web, 3.0.6\n * Copyright (c) Microsoft and contributors. All rights reserved.\n */\n(function (global, factory) {\n    var undef = \"undefined\";\n    typeof exports === \"object\" && typeof module !== undef ? factory(exports) :\n    typeof define === \"function\" && define.amd ? define([\"exports\"], factory) :\n    (function(global){\n        var nsKey, key, nm, theExports = {}, modName = \"es5_ai_3_0_6\", msMod=\"__ms$mod__\";\n        var mods={}, modDetail=mods[modName]={}, ver=\"3.0.6\";\n        var baseNs=global, nsKey=\"Microsoft\", baseNs=baseNs[nsKey]=(baseNs[nsKey]||{});\n        // Versioned namespace \"Microsoft.ApplicationInsights3\"\n        var exportNs=baseNs, nsKey=\"ApplicationInsights3\", exportNs=exportNs[nsKey]=(exportNs[nsKey]||{});\n        // Global namespace \"Microsoft.ApplicationInsights\"\n        var destNs=baseNs, nsKey=\"ApplicationInsights\", destNs=destNs[nsKey]=(destNs[nsKey]||{});\n        var expNsDetail=(exportNs[msMod]=(exportNs[msMod] || {})), expNameVer=(expNsDetail[\"v\"]=(expNsDetail[\"v\"] || []));\n        var destNsDetail=(destNs[msMod]=(destNs[msMod] || {})), destNameVer=(destNsDetail[\"v\"]=(destNsDetail[\"v\"] || []));\n        (destNsDetail[\"o\"]=(destNsDetail[\"o\"] || [])).push(mods);\n        factory(theExports);\n        for(var key in theExports) {\n            // Always set the imported value into the \"export\" versioned namespace (last-write wins)\n            nm=\"x\", exportNs[key]=theExports[key], expNameVer[key]=ver;\n            // Copy over any named element that is not already present (first-write wins)\n            typeof destNs[key]===undef ? (nm=\"n\", destNs[key]=theExports[key]) && (destNameVer[key]=ver) : !destNameVer[key] && (destNameVer[key]=\"---\");\n            (modDetail[nm] = (modDetail[nm] || [])).push(key);\n        }\n    })(typeof globalThis !== undef ? globalThis : global || self);\n})(this, (function (exports) {\n'use strict';\n\n\nvar UNDEF_VALUE = undefined;\nvar NULL_VALUE = null;\nvar EMPTY = \"\";\nvar BOOLEAN = \"boolean\";\nvar FUNCTION = \"function\";\nvar NUMBER = \"number\";\nvar OBJECT = \"object\";\nvar PROTOTYPE = \"prototype\";\nvar __PROTO__ = \"__proto__\";\nvar STRING = \"string\";\nvar UNDEFINED = \"undefined\";\nvar CONSTRUCTOR = \"constructor\";\nvar SYMBOL = \"Symbol\";\nvar POLYFILL_TAG = \"_polyfill\";\nvar INDEX_OF = \"indexOf\";\nvar LAST_INDEX_OF = \"lastIndexOf\";\nvar LENGTH = \"length\";\nvar DONE = \"done\";\nvar VALUE = \"value\";\nvar NAME = \"name\";\nvar SLICE = \"slice\";\nvar CALL = \"call\";\nvar ObjClass$1 = Object;\nvar ObjProto$1 = ObjClass$1[PROTOTYPE];\nvar StrCls = String;\nvar StrProto = StrCls[PROTOTYPE];\nvar MathCls = Math;\nvar ArrCls = Array;\nvar ArrProto = ArrCls[PROTOTYPE];\n\nfunction safeGet(cb, defValue) {\n    var result = defValue;\n    try {\n        result = cb();\n    }\n    catch (e) {\n    }\n    return result;\n}\n\nvar PRIMITIVE_TYPES = [STRING, NUMBER, BOOLEAN, UNDEFINED, \"symbol\", \"bigint\"];\nfunction _createIs(theType) {\n    return function (value) {\n        return typeof value === theType;\n    };\n}\nfunction _createObjIs(theName) {\n    var theType = \"[object \" + theName + \"]\";\n    return function (value) {\n        return !!(value && objToString(value) === theType);\n    };\n}\nfunction objToString(value) {\n    return ObjProto$1.toString[CALL](value);\n}\nfunction isUndefined(value) {\n    return typeof value === UNDEFINED || value === UNDEFINED;\n}\nfunction isNullOrUndefined(value) {\n    return value === NULL_VALUE || isUndefined(value);\n}\nfunction isStrictNullOrUndefined(value) {\n    return value === NULL_VALUE || !isDefined(value);\n}\nfunction isDefined(arg) {\n    return !!arg || arg !== UNDEF_VALUE;\n}\nfunction isPrimitiveType(theType) {\n    return theType !== OBJECT && PRIMITIVE_TYPES.indexOf(theType) !== -1;\n}\nvar isString = ( _createIs(STRING));\nvar isFunction = ( _createIs(FUNCTION));\nfunction isObject(value) {\n    if (!value && isNullOrUndefined(value)) {\n        return false;\n    }\n    return !!value && typeof value === OBJECT;\n}\nvar isArray = ArrCls.isArray;\nvar isDate = ( _createObjIs(\"Date\"));\nvar isNumber = ( _createIs(NUMBER));\nvar isBoolean = ( _createIs(BOOLEAN));\nvar isError = ( _createObjIs(\"Error\"));\nfunction isPromiseLike(value) {\n    return !!(value && value.then && isFunction(value.then));\n}\nfunction isTruthy(value) {\n    return !(!value || safeGet(function () { return !(value && (0 + value)); }, !value));\n}\n\nvar objGetOwnPropertyDescriptor = ObjClass$1.getOwnPropertyDescriptor;\n\nfunction objHasOwnProperty(obj, prop) {\n    return obj && ObjProto$1.hasOwnProperty[CALL](obj, prop);\n}\n\nvar objHasOwn = ObjClass$1[\"hasOwn\"] || polyObjHasOwn;\nfunction polyObjHasOwn(obj, prop) {\n    return objHasOwnProperty(obj, prop) || !!objGetOwnPropertyDescriptor(obj, prop);\n}\n\nfunction objForEachKey(theObject, callbackfn, thisArg) {\n    if (theObject && isObject(theObject)) {\n        for (var prop in theObject) {\n            if (objHasOwn(theObject, prop)) {\n                if (callbackfn[CALL](thisArg || theObject, prop, theObject[prop]) === -1) {\n                    break;\n                }\n            }\n        }\n    }\n}\n\nfunction _createKeyValueMap(values, keyType, valueType, completeFn) {\n    var theMap = {};\n    objForEachKey(values, function (key, value) {\n        theMap[key] = keyType ? value : key;\n        theMap[value] = valueType ? value : key;\n    });\n    return completeFn(theMap);\n}\n\nfunction throwError(message) {\n    throw new Error(message);\n}\nfunction throwTypeError(message) {\n    throw new TypeError(message);\n}\n\nvar _objFreeze = ObjClass$1[\"freeze\"];\nfunction _doNothing(value) {\n    return value;\n}\nfunction _getProto(value) {\n    return value[__PROTO__] || NULL_VALUE;\n}\nvar objAssign = ObjClass$1[\"assign\"];\nfunction objKeys(value) {\n    if (!isObject(value) || value === NULL_VALUE) {\n        throwTypeError(\"objKeys called on non-object\");\n    }\n    return ObjClass$1.keys(value);\n}\nfunction objDeepFreeze(value) {\n    if (_objFreeze) {\n        objForEachKey(value, function (key, value) {\n            if (isArray(value) || isObject(value)) {\n                _objFreeze(value);\n            }\n        });\n    }\n    return objFreeze(value);\n}\nvar objFreeze = _objFreeze || _doNothing;\nvar objGetPrototypeOf = ObjClass$1[\"getPrototypeOf\"] || _getProto;\n\nfunction createEnum(values) {\n    return _createKeyValueMap(values, 1 , 0 , objDeepFreeze);\n}\nfunction createEnumKeyMap(values) {\n    return _createKeyValueMap(values, 0 , 0 , objDeepFreeze);\n}\nfunction createSimpleMap(values) {\n    var mapClass = {};\n    objForEachKey(values, function (key, value) {\n        mapClass[key] = value[1];\n        mapClass[value[0]] = value[1];\n    });\n    return objDeepFreeze(mapClass);\n}\nfunction createTypeMap(values) {\n    return createSimpleMap(values);\n}\n\nvar _wellKnownSymbolMap =  createEnumKeyMap({\n    asyncIterator: 0 ,\n    hasInstance: 1 ,\n    isConcatSpreadable: 2 ,\n    iterator: 3 ,\n    match: 4 ,\n    matchAll: 5 ,\n    replace: 6 ,\n    search: 7 ,\n    species: 8 ,\n    split: 9 ,\n    toPrimitive: 10 ,\n    toStringTag: 11 ,\n    unscopables: 12\n});\n\nvar asString = StrCls;\n\nvar GLOBAL_CONFIG_KEY = \"__tsUtils$gblCfg\";\nvar _globalCfg;\nfunction _getGlobalValue() {\n    var result;\n    if (typeof globalThis !== UNDEFINED) {\n        result = globalThis;\n    }\n    if (!result && typeof self !== UNDEFINED) {\n        result = self;\n    }\n    if (!result && typeof window !== UNDEFINED) {\n        result = window;\n    }\n    if (!result && typeof global !== UNDEFINED) {\n        result = global;\n    }\n    return result;\n}\nfunction _getGlobalConfig() {\n    if (!_globalCfg) {\n        var gbl = _getGlobalValue() || {};\n        _globalCfg = gbl[GLOBAL_CONFIG_KEY] = gbl[GLOBAL_CONFIG_KEY] || {};\n    }\n    return _globalCfg;\n}\n\nfunction dumpObj(object, format) {\n    var propertyValueDump = EMPTY;\n    if (isError(object)) {\n        propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n    }\n    else {\n        try {\n            propertyValueDump = JSON.stringify(object, NULL_VALUE, format ? (isNumber(format) ? format : 4) : UNDEF_VALUE);\n        }\n        catch (e) {\n            propertyValueDump = \" - \" + dumpObj(e, format);\n        }\n    }\n    return objToString(object) + \": \" + propertyValueDump;\n}\n\nvar _slice;\nfunction _throwMissingFunction(funcName, thisArg) {\n    throwTypeError(\"'\" + asString(funcName) + \"' not defined for \" + dumpObj(thisArg));\n}\nfunction _unwrapInstFunction(funcName) {\n    _slice = _slice || ArrProto[SLICE];\n    return function (thisArg) {\n        return thisArg[funcName].apply(thisArg, _slice[CALL](arguments, 1));\n    };\n}\nfunction _unwrapFunction(funcName, clsProto) {\n    _slice = _slice || ArrProto[SLICE];\n    var clsFn = clsProto && clsProto[funcName];\n    return function (thisArg) {\n        var theFunc = (thisArg && thisArg[funcName]) || clsFn;\n        if (theFunc) {\n            return theFunc.apply(thisArg, _slice[CALL](arguments, 1));\n        }\n        _throwMissingFunction(funcName, thisArg);\n    };\n}\nfunction _unwrapFunctionWithPoly(funcName, clsProto, polyFunc) {\n    _slice = _slice || ArrProto[SLICE];\n    var clsFn = clsProto && clsProto[funcName];\n    return function (thisArg) {\n        var theFunc = (thisArg && thisArg[funcName]) || clsFn;\n        if (theFunc || polyFunc) {\n            var theArgs = arguments;\n            return (theFunc || polyFunc).apply(thisArg, theFunc ? _slice[CALL](theArgs, 1) : theArgs);\n        }\n        _throwMissingFunction(funcName, thisArg);\n    };\n}\nfunction _unwrapProp(propName) {\n    return function (thisArg) {\n        return thisArg[propName];\n    };\n}\n\nvar mathMax = MathCls.max;\n\nvar strSlice = ( _unwrapFunction(SLICE, StrProto));\n\nvar strSubstring = ( _unwrapFunction(\"substring\", StrProto));\nvar strSubstr = ( _unwrapFunctionWithPoly(\"substr\", StrProto, polyStrSubstr));\nfunction polyStrSubstr(value, start, length) {\n    if (isNullOrUndefined(value)) {\n        throwTypeError(\"'polyStrSubstr called with invalid \" + dumpObj(value));\n    }\n    if (length < 0) {\n        return EMPTY;\n    }\n    start = start || 0;\n    if (start < 0) {\n        start = mathMax(start + value[LENGTH], 0);\n    }\n    if (isUndefined(length)) {\n        return strSlice(value, start);\n    }\n    return strSlice(value, start, start + length);\n}\nfunction strLeft(value, count) {\n    return strSubstring(value, 0, count);\n}\n\nvar UNIQUE_REGISTRY_ID = \"_urid\";\nvar _polySymbols;\nfunction _globalSymbolRegistry() {\n    if (!_polySymbols) {\n        var gblCfg = _getGlobalConfig();\n        _polySymbols = gblCfg.gblSym = gblCfg.gblSym || { k: {}, s: {} };\n    }\n    return _polySymbols;\n}\nvar _wellKnownSymbolCache = {};\nfunction polyNewSymbol(description) {\n    var theSymbol = {\n        description: asString(description),\n        toString: function () { return SYMBOL + \"(\" + description + \")\"; }\n    };\n    theSymbol[POLYFILL_TAG] = true;\n    return theSymbol;\n}\nfunction polySymbolFor(key) {\n    var registry = _globalSymbolRegistry();\n    if (!objHasOwn(registry.k, key)) {\n        var newSymbol_1 = polyNewSymbol(key);\n        var regId_1 = objKeys(registry.s).length;\n        newSymbol_1[UNIQUE_REGISTRY_ID] = function () { return regId_1 + \"_\" + newSymbol_1.toString(); };\n        registry.k[key] = newSymbol_1;\n        registry.s[newSymbol_1[UNIQUE_REGISTRY_ID]()] = asString(key);\n    }\n    return registry.k[key];\n}\nfunction polyGetKnownSymbol(name) {\n    var result;\n    var knownName = _wellKnownSymbolMap[name];\n    if (knownName) {\n        result = _wellKnownSymbolCache[knownName] = _wellKnownSymbolCache[knownName] || polyNewSymbol(SYMBOL + \".\" + knownName);\n    }\n    return result;\n}\n\nvar propMap = {\n    e: \"enumerable\",\n    c: \"configurable\",\n    v: VALUE,\n    w: \"writable\",\n    g: \"get\",\n    s: \"set\"\n};\nfunction _createProp(value) {\n    var prop = {};\n    prop[propMap[\"c\"]] = true;\n    prop[propMap[\"e\"]] = true;\n    if (value.l) {\n        prop.get = function () { return value.l.v; };\n        var desc = objGetOwnPropertyDescriptor(value.l, \"v\");\n        if (desc && desc.set) {\n            prop.set = function (newValue) {\n                value.l.v = newValue;\n            };\n        }\n    }\n    objForEachKey(value, function (key, value) {\n        prop[propMap[key]] = isUndefined(value) ? prop[propMap[key]] : value;\n    });\n    return prop;\n}\nvar objDefineProp = ObjClass$1[\"defineProperty\"];\nfunction objDefine(target, key, propDesc) {\n    return objDefineProp(target, key, _createProp(propDesc));\n}\n\nvar _globalLazyTestHooks;\nvar _fetchLazyTestHooks = function () {\n    _globalLazyTestHooks = _getGlobalConfig();\n    _fetchLazyTestHooks = NULL_VALUE;\n};\nfunction getLazy(cb) {\n    var lazyValue = {};\n    _fetchLazyTestHooks && _fetchLazyTestHooks();\n    lazyValue.b = _globalLazyTestHooks.lzy;\n    objDefineProp(lazyValue, \"v\", {\n        configurable: true,\n        get: function () {\n            var result = cb();\n            if (!_globalLazyTestHooks.lzy) {\n                objDefineProp(lazyValue, \"v\", {\n                    value: result\n                });\n                if (lazyValue.b) {\n                    delete lazyValue.b;\n                }\n            }\n            if (_globalLazyTestHooks.lzy && lazyValue.b !== _globalLazyTestHooks.lzy) {\n                lazyValue.b = _globalLazyTestHooks.lzy;\n            }\n            return result;\n        }\n    });\n    return lazyValue;\n}\n\nfunction safeGetLazy(cb, defValue) {\n    return getLazy(function () { return safeGet(cb, defValue); });\n}\n\nvar WINDOW = \"window\";\nvar _cachedGlobal;\nvar _cachedWindow;\nvar _cachedDocument;\nvar _cachedNavigator;\nvar _cachedHistory;\nvar _isWebWorker;\nvar _isNode;\nfunction lazySafeGetInst(name) {\n    return safeGetLazy(function () { return getInst(name) || UNDEF_VALUE; }, UNDEF_VALUE);\n}\nfunction getGlobal(useCached) {\n    (!_cachedGlobal || useCached === false || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedGlobal.b)) && (_cachedGlobal = safeGetLazy(_getGlobalValue, NULL_VALUE));\n    return _cachedGlobal.v;\n}\nfunction getInst(name, useCached) {\n    var gbl = (!_cachedGlobal || useCached === false) ? getGlobal(useCached) : _cachedGlobal.v;\n    if (gbl && gbl[name]) {\n        return gbl[name];\n    }\n    if (name === WINDOW && _cachedWindow) {\n        return _cachedWindow.v;\n    }\n    return NULL_VALUE;\n}\nfunction hasDocument() {\n    return !!getDocument();\n}\nfunction getDocument() {\n    (!_cachedDocument || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedDocument.b)) && (_cachedDocument = lazySafeGetInst(\"document\"));\n    return _cachedDocument.v;\n}\nfunction hasWindow() {\n    return !!getWindow();\n}\nfunction getWindow() {\n    (!_cachedWindow || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedWindow.b)) && (_cachedWindow = lazySafeGetInst(WINDOW));\n    return _cachedWindow.v;\n}\nfunction hasNavigator() {\n    return !!getNavigator();\n}\nfunction getNavigator() {\n    (!_cachedNavigator || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedNavigator.b)) && (_cachedNavigator = lazySafeGetInst(\"navigator\"));\n    return _cachedNavigator.v;\n}\nfunction hasHistory() {\n    return !!getHistory();\n}\nfunction getHistory() {\n    (!_cachedHistory || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedHistory.b)) && (_cachedHistory = lazySafeGetInst(\"history\"));\n    return _cachedHistory.v;\n}\nfunction isNode() {\n    !_isNode && (_isNode = safeGetLazy(function () { return !!(process && (process.versions || {}).node); }, false));\n    return _isNode.v;\n}\nfunction isWebWorker() {\n    !_isWebWorker && (_isWebWorker = safeGetLazy(function () { return !!(self && self instanceof WorkerGlobalScope); }, false));\n    return _isWebWorker.v;\n}\n\nvar _symbol;\nvar _symbolFor;\nvar _symbolKeyFor;\nfunction _getSymbolValue(name) {\n    return safeGetLazy(function () {\n        return (_symbol.v ? _symbol.v[name] : UNDEF_VALUE);\n    }, UNDEF_VALUE);\n}\nfunction hasSymbol() {\n    return !!getSymbol();\n}\nfunction getSymbol() {\n    var resetCache = !_symbol || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_symbol.b);\n    resetCache && (_symbol = lazySafeGetInst(SYMBOL));\n    (!_symbolFor || resetCache) && (_symbolFor = _getSymbolValue(\"for\"));\n    (!_symbolKeyFor || resetCache) && (_symbolKeyFor = _getSymbolValue(\"keyFor\"));\n    return _symbol.v;\n}\nfunction getKnownSymbol(name, noPoly) {\n    var knownName = _wellKnownSymbolMap[name];\n    (!_symbol || (_globalLazyTestHooks.lzy && !_symbol.b)) && getSymbol();\n    return _symbol.v ? _symbol.v[knownName || name] : (!noPoly ? polyGetKnownSymbol(name) : UNDEF_VALUE);\n}\nfunction newSymbol(description, noPoly) {\n    (!_symbol || (_globalLazyTestHooks.lzy && !_symbol.b)) && getSymbol();\n    return _symbol.v ? _symbol.v(description) : (!noPoly ? polyNewSymbol(description) : NULL_VALUE);\n}\nfunction symbolFor(key) {\n    (!_symbolFor || (_globalLazyTestHooks.lzy && !_symbol.b)) && getSymbol();\n    return (_symbolFor.v || polySymbolFor)(key);\n}\n\nfunction isIterator(value) {\n    return !!value && isFunction(value.next);\n}\nfunction isIterable(value) {\n    return !isStrictNullOrUndefined(value) && isFunction(value[getKnownSymbol(3 )]);\n}\n\nvar _iterSymbol;\nfunction iterForOf(iter, callbackfn, thisArg) {\n    if (iter) {\n        if (!isIterator(iter)) {\n            !_iterSymbol && (_iterSymbol = getLazy(function () { return getKnownSymbol(3 ); }));\n            iter = iter[_iterSymbol.v] ? iter[_iterSymbol.v]() : null;\n        }\n        if (isIterator(iter)) {\n            var err = void 0;\n            var iterResult = void 0;\n            try {\n                var count = 0;\n                while (!(iterResult = iter.next())[DONE]) {\n                    if (callbackfn[CALL](thisArg || iter, iterResult[VALUE], count, iter) === -1) {\n                        break;\n                    }\n                    count++;\n                }\n            }\n            catch (failed) {\n                err = { e: failed };\n                if (iter.throw) {\n                    iterResult = null;\n                    iter.throw(err);\n                }\n            }\n            finally {\n                try {\n                    if (iterResult && !iterResult[DONE]) {\n                        iter.return && iter.return(iterResult);\n                    }\n                }\n                finally {\n                    if (err) {\n                        throw err.e;\n                    }\n                }\n            }\n        }\n    }\n}\n\nvar fnApply = ( _unwrapInstFunction(\"apply\"));\n\nfunction arrAppend(target, elms) {\n    if (!isUndefined(elms) && target) {\n        if (isArray(elms)) {\n            fnApply(target.push, target, elms);\n        }\n        else if (isIterator(elms) || isIterable(elms)) {\n            iterForOf(elms, function (elm) {\n                target.push(elm);\n            });\n        }\n        else {\n            target.push(elms);\n        }\n    }\n    return target;\n}\n\nfunction arrForEach(theArray, callbackfn, thisArg) {\n    if (theArray) {\n        var len = theArray[LENGTH] >>> 0;\n        for (var idx = 0; idx < len; idx++) {\n            if (idx in theArray) {\n                if (callbackfn[CALL](thisArg || theArray, theArray[idx], idx, theArray) === -1) {\n                    break;\n                }\n            }\n        }\n    }\n}\n\nvar arrIndexOf = ( _unwrapFunction(INDEX_OF, ArrProto));\n( _unwrapFunction(LAST_INDEX_OF, ArrProto));\n\nvar arrMap = ( _unwrapFunction(\"map\", ArrProto));\n\nvar arrSlice = ( _unwrapFunction(SLICE, ArrProto));\n\nvar arrReduce = ( _unwrapFunction(\"reduce\", ArrProto));\n\nvar objCreate = ObjClass$1[\"create\"] || polyObjCreate;\nfunction polyObjCreate(obj) {\n    if (!obj) {\n        return {};\n    }\n    var type = typeof obj;\n    if (type !== OBJECT && type !== FUNCTION) {\n        throw new TypeError(\"Prototype must be an Object or function: \" + dumpObj(obj));\n    }\n    function tempFunc() { }\n    tempFunc[PROTOTYPE] = obj;\n    return new tempFunc();\n}\n\nvar _isProtoArray;\nfunction objSetPrototypeOf(obj, proto) {\n    var fn = ObjClass$1[\"setPrototypeOf\"] ||\n        function (d, b) {\n            !_isProtoArray && (_isProtoArray = getLazy(function () {\n                var _a;\n                return ((_a = {}, _a[__PROTO__] = [], _a) instanceof Array);\n            }));\n            _isProtoArray.v ? d[__PROTO__] = b : objForEachKey(b, function (key, value) { return d[key] = value; });\n        };\n    return fn(obj, proto);\n}\n\nfunction _createCustomError(name, d, b) {\n    _safeDefineName(d, name);\n    d = objSetPrototypeOf(d, b);\n    function __() {\n        this.constructor = d;\n        _safeDefineName(this, name);\n    }\n    d[PROTOTYPE] = b === NULL_VALUE ? objCreate(b) : (__[PROTOTYPE] = b[PROTOTYPE], new __());\n    return d;\n}\nvar _safeSetName = function (baseClass, name) {\n    try {\n        name && (baseClass[NAME] = name);\n    }\n    catch (e) {\n    }\n};\nvar _safeDefineName = function (target, name) {\n    try {\n        objDefine(target, NAME, { v: name, c: true, e: false });\n    }\n    catch (e) {\n    }\n};\nfunction createCustomError(name, constructCb, errorBase) {\n    var theBaseClass = errorBase || Error;\n    var orgName = theBaseClass[PROTOTYPE][NAME];\n    var captureFn = Error.captureStackTrace;\n    return _createCustomError(name, function () {\n        var _this = this;\n        try {\n            _safeSetName(theBaseClass, name);\n            var _self = fnApply(theBaseClass, _this, arrSlice(arguments)) || _this;\n            if (_self !== _this) {\n                var orgProto = objGetPrototypeOf(_this);\n                if (orgProto !== objGetPrototypeOf(_self)) {\n                    objSetPrototypeOf(_self, orgProto);\n                }\n            }\n            captureFn && captureFn(_self, _this[CONSTRUCTOR]);\n            constructCb && constructCb(_self, arguments);\n            return _self;\n        }\n        finally {\n            _safeSetName(theBaseClass, orgName);\n        }\n    }, theBaseClass);\n}\nvar _unsupportedError;\nfunction throwUnsupported(message) {\n    if (!_unsupportedError) {\n        _unsupportedError = createCustomError(\"UnsupportedError\");\n    }\n    throw new _unsupportedError(message);\n}\n\nfunction utcNow() {\n    return (Date.now || polyUtcNow)();\n}\nfunction polyUtcNow() {\n    return new Date().getTime();\n}\n\nfunction _createTrimFn(exp) {\n    return function _doTrim(value) {\n        if (isNullOrUndefined(value)) {\n            throwTypeError(\"strTrim called [\" + dumpObj(value) + \"]\");\n        }\n        if (value && value.replace) {\n            value = value.replace(exp, EMPTY);\n        }\n        return value;\n    };\n}\nvar polyStrTrim = ( _createTrimFn(/^\\s+|(?=\\s)\\s+$/g));\nvar polyStrTrimStart = ( _createTrimFn(/^\\s+/g));\nvar polyStrTrimEnd = ( _createTrimFn(/(?=\\s)\\s+$/g));\n\nvar strTrim = ( _unwrapFunctionWithPoly(\"trim\", StrProto, polyStrTrim));\n( _unwrapFunctionWithPoly(\"trimStart\", StrProto, polyStrTrimStart));\n( _unwrapFunctionWithPoly(\"trimEnd\", StrProto, polyStrTrimEnd));\n\nvar _fnToString;\nvar _objCtrFnString;\nvar _gblWindow;\nfunction isPlainObject(value) {\n    if (!value || typeof value !== OBJECT) {\n        return false;\n    }\n    if (!_gblWindow) {\n        _gblWindow = hasWindow() ? getWindow() : true;\n    }\n    var result = false;\n    if (value !== _gblWindow) {\n        if (!_objCtrFnString) {\n            _fnToString = Function[PROTOTYPE].toString;\n            _objCtrFnString = _fnToString[CALL](ObjClass$1);\n        }\n        try {\n            var proto = objGetPrototypeOf(value);\n            result = !proto;\n            if (!result) {\n                if (objHasOwnProperty(proto, CONSTRUCTOR)) {\n                    proto = proto[CONSTRUCTOR];\n                }\n                result = proto && typeof proto === FUNCTION && _fnToString[CALL](proto) === _objCtrFnString;\n            }\n        }\n        catch (ex) {\n        }\n    }\n    return result;\n}\n\nvar _defaultDeepCopyHandler = function (details) {\n    details.value && plainObjDeepCopyHandler(details);\n    return true;\n};\nvar defaultDeepCopyHandlers = [\n    arrayDeepCopyHandler,\n    plainObjDeepCopyHandler,\n    functionDeepCopyHandler,\n    dateDeepCopyHandler\n];\nfunction _getSetVisited(visitMap, source, newPath, cb) {\n    var theEntry;\n    arrForEach(visitMap, function (entry) {\n        if (entry.k === source) {\n            theEntry = entry;\n            return -1;\n        }\n    });\n    if (!theEntry) {\n        theEntry = { k: source, v: source };\n        visitMap.push(theEntry);\n        cb(theEntry);\n    }\n    return theEntry.v;\n}\nfunction _deepCopy(visitMap, value, ctx, key) {\n    var userHandler = ctx.handler;\n    var newPath = ctx.path ? (key ? ctx.path.concat(key) : ctx.path) : [];\n    var newCtx = {\n        handler: ctx.handler,\n        src: ctx.src,\n        path: newPath\n    };\n    var theType = typeof value;\n    var isPlain = false;\n    var isPrim = false;\n    if (value && theType === OBJECT) {\n        isPlain = isPlainObject(value);\n    }\n    else {\n        isPrim = value === NULL_VALUE || isPrimitiveType(theType);\n    }\n    var details = {\n        type: theType,\n        isPrim: isPrim,\n        isPlain: isPlain,\n        value: value,\n        result: value,\n        path: newPath,\n        origin: ctx.src,\n        copy: function (source, newKey) {\n            return _deepCopy(visitMap, source, newKey ? newCtx : ctx, newKey);\n        },\n        copyTo: function (target, source) {\n            return _copyProps(visitMap, target, source, newCtx);\n        }\n    };\n    if (!details.isPrim) {\n        return _getSetVisited(visitMap, value, newPath, function (newEntry) {\n            objDefine(details, \"result\", {\n                g: function () {\n                    return newEntry.v;\n                },\n                s: function (newValue) {\n                    newEntry.v = newValue;\n                }\n            });\n            var idx = 0;\n            var handler = userHandler;\n            while (!(handler || (idx < defaultDeepCopyHandlers.length ? defaultDeepCopyHandlers[idx++] : _defaultDeepCopyHandler))[CALL](ctx, details)) {\n                handler = NULL_VALUE;\n            }\n        });\n    }\n    if (userHandler && userHandler[CALL](ctx, details)) {\n        return details.result;\n    }\n    return value;\n}\nfunction _copyProps(visitMap, target, source, ctx) {\n    if (!isNullOrUndefined(source)) {\n        for (var key in source) {\n            target[key] = _deepCopy(visitMap, source[key], ctx, key);\n        }\n    }\n    return target;\n}\nfunction objCopyProps(target, source, handler) {\n    var ctx = {\n        handler: handler,\n        src: source,\n        path: []\n    };\n    return _copyProps([], target, source, ctx);\n}\nfunction objDeepCopy(source, handler) {\n    var ctx = {\n        handler: handler,\n        src: source\n    };\n    return _deepCopy([], source, ctx);\n}\nfunction arrayDeepCopyHandler(details) {\n    var value = details.value;\n    if (isArray(value)) {\n        var target = details.result = [];\n        target.length = value.length;\n        details.copyTo(target, value);\n        return true;\n    }\n    return false;\n}\nfunction dateDeepCopyHandler(details) {\n    var value = details.value;\n    if (isDate(value)) {\n        details.result = new Date(value.getTime());\n        return true;\n    }\n    return false;\n}\nfunction functionDeepCopyHandler(details) {\n    if (details.type === FUNCTION) {\n        return true;\n    }\n    return false;\n}\nfunction plainObjDeepCopyHandler(details) {\n    var value = details.value;\n    if (value && details.isPlain) {\n        var target = details.result = {};\n        details.copyTo(target, value);\n        return true;\n    }\n    return false;\n}\n\nfunction _doExtend(target, theArgs) {\n    arrForEach(theArgs, function (theArg) {\n        objCopyProps(target, theArg);\n    });\n    return target;\n}\nfunction deepExtend(target, obj1, obj2, obj3, obj4, obj5, obj6) {\n    return _doExtend(objDeepCopy(target) || {}, arrSlice(arguments));\n}\nfunction objExtend$1(target, obj1, obj2, obj3, obj4, obj5, obj6) {\n    return _doExtend(target || {}, arrSlice(arguments));\n}\n\nvar getLength = ( _unwrapProp(LENGTH));\n\nvar _perf;\nfunction getPerformance() {\n    (!_perf || (!_perf.b && _globalLazyTestHooks && _globalLazyTestHooks.lzy)) && (_perf = lazySafeGetInst(\"performance\"));\n    return _perf.v;\n}\n\nfunction polyStrSymSplit(value, splitter, limit) {\n    var splitFn = splitter && splitter[getKnownSymbol(9 )];\n    return splitFn ? splitFn(value, limit) : [value];\n}\n\nvar strSplit = ( _unwrapFunction(\"split\", StrProto));\n( _unwrapFunctionWithPoly(\"split\", StrProto, !hasSymbol() ? polyStrSymSplit : null));\n\nfunction setValueByKey(target, path, value) {\n    if (target && path) {\n        var parts = strSplit(path, \".\");\n        var lastKey = parts.pop();\n        arrForEach(parts, function (key) {\n            if (isNullOrUndefined(target[key])) {\n                target[key] = {};\n            }\n            target = target[key];\n        });\n        target[lastKey] = value;\n    }\n}\n\nvar strEndsWith = ( _unwrapFunctionWithPoly(\"endsWith\", StrProto, polyStrEndsWith));\nfunction polyStrEndsWith(value, searchString, length) {\n    if (!isString(value)) {\n        throwTypeError(\"'\" + dumpObj(value) + \"' is not a string\");\n    }\n    var searchValue = isString(searchString) ? searchString : asString(searchString);\n    var chkLen = searchValue[LENGTH];\n    var len = value[LENGTH];\n    var end = !isUndefined(length) && length < len ? length : len;\n    return strSubstring(value, end - chkLen, end) === searchValue;\n}\n\nvar strIndexOf = ( _unwrapFunction(INDEX_OF, StrProto));\n( _unwrapFunction(LAST_INDEX_OF, StrProto));\n\nvar REF = \"ref\";\nvar UNREF = \"un\" + REF;\nvar HAS_REF = \"hasRef\";\nvar ENABLED = \"enabled\";\nfunction _createTimerHandler(startTimer, refreshFn, cancelFn) {\n    var _a;\n    var ref = true;\n    var timerId = startTimer ? refreshFn(NULL_VALUE) : NULL_VALUE;\n    var theTimerHandler;\n    var _unref = function () {\n        ref = false;\n        timerId && timerId[UNREF] && timerId[UNREF]();\n        return theTimerHandler;\n    };\n    var _ref = function () {\n        ref = true;\n        timerId && timerId[REF] && timerId[REF]();\n        return theTimerHandler;\n    };\n    var _hasRef = function () {\n        if (timerId && timerId[HAS_REF]) {\n            return timerId[HAS_REF]();\n        }\n        return ref;\n    };\n    var _refresh = function () {\n        timerId = refreshFn(timerId);\n        if (!ref) {\n            _unref();\n        }\n        return theTimerHandler;\n    };\n    var _cancel = function () {\n        timerId && cancelFn(timerId);\n        timerId = NULL_VALUE;\n    };\n    var _setEnabled = function (value) {\n        !value && timerId && _cancel();\n        value && !timerId && _refresh();\n    };\n    theTimerHandler = (_a = {\n            cancel: _cancel,\n            refresh: _refresh\n        },\n        _a[HAS_REF] = _hasRef,\n        _a[REF] = _ref,\n        _a[UNREF] = _unref,\n        _a[ENABLED] = false,\n        _a);\n    objDefineProp(theTimerHandler, ENABLED, {\n        get: function () { return !!timerId; },\n        set: _setEnabled\n    });\n    return {\n        h: theTimerHandler,\n        dn: function () {\n            timerId = NULL_VALUE;\n        }\n    };\n}\n\nfunction _createTimeoutWith(self, startTimer, overrideFn, theArgs) {\n    var isArr = isArray(overrideFn);\n    var len = isArr ? overrideFn.length : 0;\n    var setFn = (len > 0 ? overrideFn[0] : (!isArr ? overrideFn : UNDEF_VALUE)) || setTimeout;\n    var clearFn = (len > 1 ? overrideFn[1] : UNDEF_VALUE) || clearTimeout;\n    var timerFn = theArgs[0];\n    theArgs[0] = function () {\n        handler.dn();\n        fnApply(timerFn, self, arrSlice(arguments));\n    };\n    var handler = _createTimerHandler(startTimer, function (timerId) {\n        if (timerId) {\n            if (timerId.refresh) {\n                timerId.refresh();\n                return timerId;\n            }\n            fnApply(clearFn, self, [timerId]);\n        }\n        return fnApply(setFn, self, theArgs);\n    }, function (timerId) {\n        fnApply(clearFn, self, [timerId]);\n    });\n    return handler.h;\n}\nfunction scheduleTimeout(callback, timeout) {\n    return _createTimeoutWith(this, true, UNDEF_VALUE, arrSlice(arguments));\n}\nfunction createTimeout(callback, timeout) {\n    return _createTimeoutWith(this, false, UNDEF_VALUE, arrSlice(arguments));\n}\n\nvar createEnumStyle = createEnum;\nvar createValueMap = createTypeMap;\n\nvar _DYN_TO_LOWER_CASE$2 = \"toLowerCase\";\nvar _DYN_BLK_VAL = \"blkVal\";\nvar _DYN_LENGTH$5 = \"length\";\nvar _DYN_RD_ONLY = \"rdOnly\";\nvar _DYN_NOTIFY = \"notify\";\nvar _DYN_WARN_TO_CONSOLE = \"warnToConsole\";\nvar _DYN_THROW_INTERNAL = \"throwInternal\";\nvar _DYN_SET_DF = \"setDf\";\nvar _DYN_WATCH = \"watch\";\nvar _DYN_LOGGER = \"logger\";\nvar _DYN_APPLY = \"apply\";\nvar _DYN_PUSH$2 = \"push\";\nvar _DYN_SPLICE = \"splice\";\nvar _DYN_HDLR = \"hdlr\";\nvar _DYN_CANCEL = \"cancel\";\nvar _DYN_INITIALIZE = \"initialize\";\nvar _DYN_IDENTIFIER = \"identifier\";\nvar _DYN_IS_INITIALIZED = \"isInitialized\";\nvar _DYN_GET_PLUGIN = \"getPlugin\";\nvar _DYN_POLL_INTERNAL_LOGS = \"pollInternalLogs\";\nvar _DYN_NAME$3 = \"name\";\nvar _DYN_TIME = \"time\";\nvar _DYN_PROCESS_NEXT = \"processNext\";\nvar _DYN_GET_PROCESS_TEL_CONT0 = \"getProcessTelContext\";\nvar _DYN_GET_NOTIFY_MGR = \"getNotifyMgr\";\nvar _DYN_ADD_NOTIFICATION_LIS1 = \"addNotificationListener\";\nvar _DYN_REMOVE_NOTIFICATION_2 = \"removeNotificationListener\";\nvar _DYN_ENABLED = \"enabled\";\nvar _DYN_STOP_POLLING_INTERNA3 = \"stopPollingInternalLogs\";\nvar _DYN_UNLOAD = \"unload\";\nvar _DYN_ON_COMPLETE = \"onComplete\";\nvar _DYN_VERSION$1 = \"version\";\nvar _DYN_LOGGING_LEVEL_CONSOL4 = \"loggingLevelConsole\";\nvar _DYN_CREATE_NEW$1 = \"createNew\";\nvar _DYN_TEARDOWN = \"teardown\";\nvar _DYN_MESSAGE_ID = \"messageId\";\nvar _DYN_MESSAGE$2 = \"message\";\nvar _DYN_IS_ASYNC = \"isAsync\";\nvar _DYN_DIAG_LOG$2 = \"diagLog\";\nvar _DYN__DO_TEARDOWN = \"_doTeardown\";\nvar _DYN_UPDATE$1 = \"update\";\nvar _DYN_GET_NEXT = \"getNext\";\nvar _DYN_SET_NEXT_PLUGIN = \"setNextPlugin\";\nvar _DYN_USER_AGENT = \"userAgent\";\nvar _DYN_SPLIT$1 = \"split\";\nvar _DYN_NODE_TYPE = \"nodeType\";\nvar _DYN_REPLACE = \"replace\";\nvar _DYN_LOG_INTERNAL_MESSAGE = \"logInternalMessage\";\nvar _DYN_TYPE = \"type\";\nvar _DYN_HANDLER = \"handler\";\nvar _DYN_IS_CHILD_EVT = \"isChildEvt\";\nvar _DYN_GET_CTX = \"getCtx\";\nvar _DYN_SET_CTX = \"setCtx\";\nvar _DYN_COMPLETE = \"complete\";\nvar _DYN_TRACE_ID$2 = \"traceId\";\nvar _DYN_SPAN_ID$1 = \"spanId\";\nvar _DYN_TRACE_FLAGS$1 = \"traceFlags\";\n\nvar aggregationErrorType;\nfunction throwAggregationError(message, sourceErrors) {\n    if (!aggregationErrorType) {\n        aggregationErrorType = createCustomError(\"AggregationError\", function (self, args) {\n            if (args[_DYN_LENGTH$5 ] > 1) {\n                self.errors = args[1];\n            }\n        });\n    }\n    var theMessage = message || \"One or more errors occurred.\";\n    arrForEach(sourceErrors, function (srcError, idx) {\n        theMessage += \"\\n\".concat(idx, \" > \").concat(dumpObj(srcError));\n    });\n    throw new aggregationErrorType(theMessage, sourceErrors || []);\n}\n\nvar strShimFunction = \"function\";\nvar strShimObject = \"object\";\nvar strShimUndefined = \"undefined\";\nvar strShimPrototype = \"prototype\";\nvar ObjClass = Object;\nvar ObjProto = ObjClass[strShimPrototype];\n\n(getGlobal() || {})[\"Symbol\"];\n(getGlobal() || {})[\"Reflect\"];\nvar strHasOwnProperty = \"hasOwnProperty\";\nvar __objAssignFnImpl = function (t) {\n    for (var s, i = 1, n = arguments.length; i < n; i++) {\n        s = arguments[i];\n        for (var p in s) {\n            if (ObjProto[strHasOwnProperty].call(s, p)) {\n                t[p] = s[p];\n            }\n        }\n    }\n    return t;\n};\nvar __assignFn = objAssign || __objAssignFnImpl;\nvar extendStaticsFn = function (d, b) {\n    extendStaticsFn = ObjClass[\"setPrototypeOf\"] ||\n        ({ __proto__: [] } instanceof Array && function (d, b) {\n            d.__proto__ = b;\n        }) ||\n        function (d, b) {\n            for (var p in b) {\n                if (b[strHasOwnProperty](p)) {\n                    d[p] = b[p];\n                }\n            }\n        };\n    return extendStaticsFn(d, b);\n};\nfunction __extendsFn(d, b) {\n    if (typeof b !== strShimFunction && b !== null) {\n        throwTypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n    }\n    extendStaticsFn(d, b);\n    function __() {\n        this.constructor = d;\n    }\n    d[strShimPrototype] = b === null ? objCreate(b) : (__[strShimPrototype] = b[strShimPrototype], new __());\n}\nfunction __spreadArrayFn(to, from) {\n    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) {\n        to[j] = from[i];\n    }\n    return to;\n}\n\nvar _a$a;\nvar Constructor = 'constructor';\nvar Prototype = 'prototype';\nvar strFunction = 'function';\nvar DynInstFuncTable = '_dynInstFuncs';\nvar DynProxyTag = '_isDynProxy';\nvar DynClassName = '_dynClass';\nvar DynClassNamePrefix = '_dynCls$';\nvar DynInstChkTag = '_dynInstChk';\nvar DynAllowInstChkTag = DynInstChkTag;\nvar DynProtoDefaultOptions = '_dfOpts';\nvar UnknownValue = '_unknown_';\nvar str__Proto = \"__proto__\";\nvar DynProtoBaseProto = \"_dyn\" + str__Proto;\nvar DynProtoGlobalSettings = \"__dynProto$Gbl\";\nvar DynProtoCurrent = \"_dynInstProto\";\nvar strUseBaseInst = 'useBaseInst';\nvar strSetInstFuncs = 'setInstFuncs';\nvar Obj = Object;\nvar _objGetPrototypeOf = Obj[\"getPrototypeOf\"];\nvar _objGetOwnProps = Obj[\"getOwnPropertyNames\"];\nvar _gbl = getGlobal();\nvar _gblInst = _gbl[DynProtoGlobalSettings] || (_gbl[DynProtoGlobalSettings] = {\n    o: (_a$a = {},\n        _a$a[strSetInstFuncs] = true,\n        _a$a[strUseBaseInst] = true,\n        _a$a),\n    n: 1000\n});\nfunction _isObjectOrArrayPrototype(target) {\n    return target && (target === Obj[Prototype] || target === Array[Prototype]);\n}\nfunction _isObjectArrayOrFunctionPrototype(target) {\n    return _isObjectOrArrayPrototype(target) || target === Function[Prototype];\n}\nfunction _getObjProto$1(target) {\n    var newProto;\n    if (target) {\n        if (_objGetPrototypeOf) {\n            return _objGetPrototypeOf(target);\n        }\n        var curProto = target[str__Proto] || target[Prototype] || (target[Constructor] ? target[Constructor][Prototype] : null);\n        newProto = target[DynProtoBaseProto] || curProto;\n        if (!objHasOwnProperty(target, DynProtoBaseProto)) {\n            delete target[DynProtoCurrent];\n            newProto = target[DynProtoBaseProto] = target[DynProtoCurrent] || target[DynProtoBaseProto];\n            target[DynProtoCurrent] = curProto;\n        }\n    }\n    return newProto;\n}\nfunction _forEachProp(target, func) {\n    var props = [];\n    if (_objGetOwnProps) {\n        props = _objGetOwnProps(target);\n    }\n    else {\n        for (var name_1 in target) {\n            if (typeof name_1 === \"string\" && objHasOwnProperty(target, name_1)) {\n                props.push(name_1);\n            }\n        }\n    }\n    if (props && props.length > 0) {\n        for (var lp = 0; lp < props.length; lp++) {\n            func(props[lp]);\n        }\n    }\n}\nfunction _isDynamicCandidate(target, funcName, skipOwn) {\n    return (funcName !== Constructor && typeof target[funcName] === strFunction && (skipOwn || objHasOwnProperty(target, funcName)));\n}\nfunction _throwTypeError(message) {\n    throwTypeError(\"DynamicProto: \" + message);\n}\nfunction _getInstanceFuncs(thisTarget) {\n    var instFuncs = {};\n    _forEachProp(thisTarget, function (name) {\n        if (!instFuncs[name] && _isDynamicCandidate(thisTarget, name, false)) {\n            instFuncs[name] = thisTarget[name];\n        }\n    });\n    return instFuncs;\n}\nfunction _hasVisited(values, value) {\n    for (var lp = values.length - 1; lp >= 0; lp--) {\n        if (values[lp] === value) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction _getBaseFuncs(classProto, thisTarget, instFuncs, useBaseInst) {\n    function _instFuncProxy(target, funcHost, funcName) {\n        var theFunc = funcHost[funcName];\n        if (theFunc[DynProxyTag] && useBaseInst) {\n            var instFuncTable = target[DynInstFuncTable] || {};\n            if (instFuncTable[DynAllowInstChkTag] !== false) {\n                theFunc = (instFuncTable[funcHost[DynClassName]] || {})[funcName] || theFunc;\n            }\n        }\n        return function () {\n            return theFunc.apply(target, arguments);\n        };\n    }\n    var baseFuncs = {};\n    _forEachProp(instFuncs, function (name) {\n        baseFuncs[name] = _instFuncProxy(thisTarget, instFuncs, name);\n    });\n    var baseProto = _getObjProto$1(classProto);\n    var visited = [];\n    while (baseProto && !_isObjectArrayOrFunctionPrototype(baseProto) && !_hasVisited(visited, baseProto)) {\n        _forEachProp(baseProto, function (name) {\n            if (!baseFuncs[name] && _isDynamicCandidate(baseProto, name, !_objGetPrototypeOf)) {\n                baseFuncs[name] = _instFuncProxy(thisTarget, baseProto, name);\n            }\n        });\n        visited.push(baseProto);\n        baseProto = _getObjProto$1(baseProto);\n    }\n    return baseFuncs;\n}\nfunction _getInstFunc(target, funcName, proto, currentDynProtoProxy) {\n    var instFunc = null;\n    if (target && objHasOwnProperty(proto, DynClassName)) {\n        var instFuncTable = target[DynInstFuncTable] || {};\n        instFunc = (instFuncTable[proto[DynClassName]] || {})[funcName];\n        if (!instFunc) {\n            _throwTypeError(\"Missing [\" + funcName + \"] \" + strFunction);\n        }\n        if (!instFunc[DynInstChkTag] && instFuncTable[DynAllowInstChkTag] !== false) {\n            var canAddInst = !objHasOwnProperty(target, funcName);\n            var objProto = _getObjProto$1(target);\n            var visited = [];\n            while (canAddInst && objProto && !_isObjectArrayOrFunctionPrototype(objProto) && !_hasVisited(visited, objProto)) {\n                var protoFunc = objProto[funcName];\n                if (protoFunc) {\n                    canAddInst = (protoFunc === currentDynProtoProxy);\n                    break;\n                }\n                visited.push(objProto);\n                objProto = _getObjProto$1(objProto);\n            }\n            try {\n                if (canAddInst) {\n                    target[funcName] = instFunc;\n                }\n                instFunc[DynInstChkTag] = 1;\n            }\n            catch (e) {\n                instFuncTable[DynAllowInstChkTag] = false;\n            }\n        }\n    }\n    return instFunc;\n}\nfunction _getProtoFunc(funcName, proto, currentDynProtoProxy) {\n    var protoFunc = proto[funcName];\n    if (protoFunc === currentDynProtoProxy) {\n        protoFunc = _getObjProto$1(proto)[funcName];\n    }\n    if (typeof protoFunc !== strFunction) {\n        _throwTypeError(\"[\" + funcName + \"] is not a \" + strFunction);\n    }\n    return protoFunc;\n}\nfunction _populatePrototype(proto, className, target, baseInstFuncs, setInstanceFunc) {\n    function _createDynamicPrototype(proto, funcName) {\n        var dynProtoProxy = function () {\n            var instFunc = _getInstFunc(this, funcName, proto, dynProtoProxy) || _getProtoFunc(funcName, proto, dynProtoProxy);\n            return instFunc.apply(this, arguments);\n        };\n        dynProtoProxy[DynProxyTag] = 1;\n        return dynProtoProxy;\n    }\n    if (!_isObjectOrArrayPrototype(proto)) {\n        var instFuncTable = target[DynInstFuncTable] = target[DynInstFuncTable] || {};\n        var instFuncs_1 = instFuncTable[className] = (instFuncTable[className] || {});\n        if (instFuncTable[DynAllowInstChkTag] !== false) {\n            instFuncTable[DynAllowInstChkTag] = !!setInstanceFunc;\n        }\n        _forEachProp(target, function (name) {\n            if (_isDynamicCandidate(target, name, false) && target[name] !== baseInstFuncs[name]) {\n                instFuncs_1[name] = target[name];\n                delete target[name];\n                if (!objHasOwnProperty(proto, name) || (proto[name] && !proto[name][DynProxyTag])) {\n                    proto[name] = _createDynamicPrototype(proto, name);\n                }\n            }\n        });\n    }\n}\nfunction _checkPrototype(classProto, thisTarget) {\n    if (_objGetPrototypeOf) {\n        var visited = [];\n        var thisProto = _getObjProto$1(thisTarget);\n        while (thisProto && !_isObjectArrayOrFunctionPrototype(thisProto) && !_hasVisited(visited, thisProto)) {\n            if (thisProto === classProto) {\n                return true;\n            }\n            visited.push(thisProto);\n            thisProto = _getObjProto$1(thisProto);\n        }\n        return false;\n    }\n    return true;\n}\nfunction _getObjName(target, unknownValue) {\n    if (objHasOwnProperty(target, Prototype)) {\n        return target.name || unknownValue || UnknownValue;\n    }\n    return (((target || {})[Constructor]) || {}).name || unknownValue || UnknownValue;\n}\nfunction dynamicProto(theClass, target, delegateFunc, options) {\n    if (!objHasOwnProperty(theClass, Prototype)) {\n        _throwTypeError(\"theClass is an invalid class definition.\");\n    }\n    var classProto = theClass[Prototype];\n    if (!_checkPrototype(classProto, target)) {\n        _throwTypeError(\"[\" + _getObjName(theClass) + \"] not in hierarchy of [\" + _getObjName(target) + \"]\");\n    }\n    var className = null;\n    if (objHasOwnProperty(classProto, DynClassName)) {\n        className = classProto[DynClassName];\n    }\n    else {\n        className = DynClassNamePrefix + _getObjName(theClass, \"_\") + \"$\" + _gblInst.n;\n        _gblInst.n++;\n        classProto[DynClassName] = className;\n    }\n    var perfOptions = dynamicProto[DynProtoDefaultOptions];\n    var useBaseInst = !!perfOptions[strUseBaseInst];\n    if (useBaseInst && options && options[strUseBaseInst] !== undefined) {\n        useBaseInst = !!options[strUseBaseInst];\n    }\n    var instFuncs = _getInstanceFuncs(target);\n    var baseFuncs = _getBaseFuncs(classProto, target, instFuncs, useBaseInst);\n    delegateFunc(target, baseFuncs);\n    var setInstanceFunc = !!_objGetPrototypeOf && !!perfOptions[strSetInstFuncs];\n    if (setInstanceFunc && options) {\n        setInstanceFunc = !!options[strSetInstFuncs];\n    }\n    _populatePrototype(classProto, className, target, instFuncs, setInstanceFunc !== false);\n}\ndynamicProto[DynProtoDefaultOptions] = _gblInst.o;\n\nfunction doAwaitResponse(value, cb) {\n    return doAwait(value, function (value) {\n        return cb ? cb({\n            value: value,\n            rejected: false\n        }) : value;\n    }, function (reason) {\n        return cb ? cb({\n            rejected: true,\n            reason: reason\n        }) : reason;\n    });\n}\nfunction doAwait(value, resolveFn, rejectFn, finallyFn) {\n    var result = value;\n    if (isPromiseLike(value)) {\n        if (resolveFn || rejectFn) {\n            result = value.then(resolveFn, rejectFn);\n        }\n    }\n    else {\n        if (resolveFn) {\n            result = resolveFn(value);\n        }\n    }\n    if (finallyFn) {\n        doFinally(result, finallyFn);\n    }\n    return result;\n}\nfunction doFinally(value, finallyFn) {\n    var result = value;\n    if (finallyFn) {\n        if (isPromiseLike(value)) {\n            if (value.finally) {\n                result = value.finally(finallyFn);\n            }\n            else {\n                result = value.then(function (value) {\n                    finallyFn();\n                    return value;\n                }, function (reason) {\n                    finallyFn();\n                    throw reason;\n                });\n            }\n        }\n        else {\n            finallyFn();\n        }\n    }\n    return result;\n}\n\nvar STRING_STATES = [\n    \"pending\", \"resolving\", \"resolved\", \"rejected\"\n];\n\nvar DISPATCH_EVENT = \"dispatchEvent\";\nvar _hasInitEvent;\nfunction emitEvent(target, evtName, populateEvent, useNewEvent) {\n    var doc = getDocument();\n    !_hasInitEvent && (_hasInitEvent = safeGetLazy(function () {\n        var evt;\n        if (doc && doc.createEvent) {\n            evt = doc.createEvent(\"Event\");\n        }\n        return (!!evt && evt.initEvent);\n    }, null));\n    var theEvt = _hasInitEvent.v ? doc.createEvent(\"Event\") : (useNewEvent ? new Event(evtName) : {});\n    populateEvent && populateEvent(theEvt);\n    if (_hasInitEvent.v) {\n        theEvt.initEvent(evtName, false, true);\n    }\n    if (theEvt && target[DISPATCH_EVENT]) {\n        target[DISPATCH_EVENT](theEvt);\n    }\n    else {\n        var handler = target[\"on\" + evtName];\n        if (handler) {\n            handler(theEvt);\n        }\n        else {\n            var theConsole = getInst(\"console\");\n            theConsole && (theConsole[\"error\"] || theConsole[\"log\"])(evtName, dumpObj(theEvt));\n        }\n    }\n}\n\nvar STR_PROMISE = \"Promise\";\n\nvar NODE_UNHANDLED_REJECTION = \"unhandledRejection\";\nvar UNHANDLED_REJECTION = NODE_UNHANDLED_REJECTION.toLowerCase();\nvar _unhandledRejectionTimeout = 10;\nvar _hasPromiseRejectionEvent;\nfunction dumpFnObj(value) {\n    if (isFunction(value)) {\n        return value.toString();\n    }\n    return dumpObj(value);\n}\nfunction _createPromise(newPromise, processor, executor) {\n    var additionalArgs = arrSlice(arguments, 3);\n    var _state = 0 ;\n    var _hasResolved = false;\n    var _settledValue;\n    var _queue = [];\n    var _handled = false;\n    var _unHandledRejectionHandler = null;\n    var _thePromise;\n    !_hasPromiseRejectionEvent && (_hasPromiseRejectionEvent = lazySafeGetInst(STR_PROMISE + \"RejectionEvent\"));\n    var _then = function (onResolved, onRejected) {\n        try {\n            _handled = true;\n            _unHandledRejectionHandler && _unHandledRejectionHandler.cancel();\n            _unHandledRejectionHandler = null;\n            var thenPromise = newPromise(function (resolve, reject) {\n                _queue.push(function () {\n                    try {\n                        var handler = _state === 2  ? onResolved : onRejected;\n                        var value = isUndefined(handler) ? _settledValue : (isFunction(handler) ? handler(_settledValue) : handler);\n                        if (isPromiseLike(value)) {\n                            value.then(resolve, reject);\n                        }\n                        else if (handler) {\n                            resolve(value);\n                        }\n                        else if (_state === 3 ) {\n                            reject(value);\n                        }\n                        else {\n                            resolve(value);\n                        }\n                    }\n                    catch (e) {\n                        reject(e);\n                    }\n                });\n                if (_hasResolved) {\n                    _processQueue();\n                }\n            }, additionalArgs);\n            return thenPromise;\n        }\n        finally {\n        }\n    };\n    var _catch = function (onRejected) {\n        return _then(undefined, onRejected);\n    };\n    var _finally = function (onFinally) {\n        var thenFinally = onFinally;\n        var catchFinally = onFinally;\n        if (isFunction(onFinally)) {\n            thenFinally = function (value) {\n                onFinally && onFinally();\n                return value;\n            };\n            catchFinally = function (reason) {\n                onFinally && onFinally();\n                throw reason;\n            };\n        }\n        return _then(thenFinally, catchFinally);\n    };\n    var _strState = function () {\n        return STRING_STATES[_state];\n    };\n    var _processQueue = function () {\n        if (_queue.length > 0) {\n            var pending = _queue.slice();\n            _queue = [];\n            _handled = true;\n            processor(pending);\n            _unHandledRejectionHandler && _unHandledRejectionHandler.cancel();\n            _unHandledRejectionHandler = null;\n        }\n    };\n    var _createSettleIfFn = function (newState, allowState) {\n        return function (theValue) {\n            if (_state === allowState) {\n                if (newState === 2  && isPromiseLike(theValue)) {\n                    _state = 1 ;\n                    theValue.then(_createSettleIfFn(2 , 1 ), _createSettleIfFn(3 , 1 ));\n                    return;\n                }\n                _state = newState;\n                _hasResolved = true;\n                _settledValue = theValue;\n                _processQueue();\n                if (!_handled && newState === 3  && !_unHandledRejectionHandler) {\n                    _unHandledRejectionHandler = scheduleTimeout(_notifyUnhandledRejection, _unhandledRejectionTimeout);\n                }\n            }\n        };\n    };\n    var _notifyUnhandledRejection = function () {\n        if (!_handled) {\n            if (isNode()) {\n                process.emit(NODE_UNHANDLED_REJECTION, _settledValue, _thePromise);\n            }\n            else {\n                var gbl = getWindow() || getGlobal();\n                emitEvent(gbl, UNHANDLED_REJECTION, function (theEvt) {\n                    objDefine(theEvt, \"promise\", { g: function () { return _thePromise; } });\n                    theEvt.reason = _settledValue;\n                    return theEvt;\n                }, !!_hasPromiseRejectionEvent.v);\n            }\n        }\n    };\n    _thePromise = {\n        then: _then,\n        \"catch\": _catch,\n        finally: _finally\n    };\n    objDefineProp(_thePromise, \"state\", {\n        get: _strState\n    });\n    if (hasSymbol()) {\n        _thePromise[getKnownSymbol(11 )] = \"IPromise\";\n    }\n    var _toString = function () {\n        return \"IPromise\" + (\"\") + \" \" + _strState() + (_hasResolved ? (\" - \" + dumpFnObj(_settledValue)) : \"\");\n    };\n    _thePromise.toString = _toString;\n    (function _initialize() {\n        if (!isFunction(executor)) {\n            throwTypeError(STR_PROMISE + \": executor is not a function - \" + dumpFnObj(executor));\n        }\n        var _rejectFn = _createSettleIfFn(3 , 0 );\n        try {\n            executor.call(_thePromise, _createSettleIfFn(2 , 0 ), _rejectFn);\n        }\n        catch (e) {\n            _rejectFn(e);\n        }\n    })();\n    return _thePromise;\n}\nfunction _createAllPromise(newPromise) {\n    return function (input) {\n        var additionalArgs = arrSlice(arguments, 1);\n        return newPromise(function (resolve, reject) {\n            try {\n                var values_1 = [];\n                var pending_1 = 1;\n                arrForEach(input, function (item, idx) {\n                    if (item) {\n                        pending_1++;\n                        doAwait(item, function (value) {\n                            values_1[idx] = value;\n                            if (--pending_1 === 0) {\n                                resolve(values_1);\n                            }\n                        }, reject);\n                    }\n                });\n                pending_1--;\n                if (pending_1 === 0) {\n                    resolve(values_1);\n                }\n            }\n            catch (e) {\n                reject(e);\n            }\n        }, additionalArgs);\n    };\n}\n\nvar _processPendingItems = function (pending) {\n    arrForEach(pending, function (fn) {\n        try {\n            fn();\n        }\n        catch (e) {\n        }\n    });\n};\nfunction timeoutItemProcessor(timeout) {\n    var callbackTimeout = isNumber(timeout) ? timeout : 0;\n    return function (pending) {\n        scheduleTimeout(function () {\n            _processPendingItems(pending);\n        }, callbackTimeout);\n    };\n}\n\nfunction createAsyncPromise(executor, timeout) {\n    return _createPromise(createAsyncPromise, timeoutItemProcessor(timeout), executor, timeout);\n}\n\nvar _isPromiseSupported;\nfunction createNativePromise(executor, timeout) {\n    !_isPromiseSupported && (_isPromiseSupported = lazySafeGetInst(STR_PROMISE));\n    var PrmCls = _isPromiseSupported.v;\n    if (!PrmCls) {\n        return createAsyncPromise(executor);\n    }\n    if (!isFunction(executor)) {\n        throwTypeError(STR_PROMISE + \": executor is not a function - \" + dumpObj(executor));\n    }\n    var _state = 0 ;\n    function _strState() {\n        return STRING_STATES[_state];\n    }\n    var thePromise = new PrmCls(function (resolve, reject) {\n        function _resolve(value) {\n            _state = 2 ;\n            resolve(value);\n        }\n        function _reject(reason) {\n            _state = 3 ;\n            reject(reason);\n        }\n        executor(_resolve, _reject);\n    });\n    objDefineProp(thePromise, \"state\", {\n        get: _strState\n    });\n    return thePromise;\n}\n\nvar _promiseCreator;\nfunction createPromise(executor, timeout) {\n    !_promiseCreator && (_promiseCreator = getLazy(function () { return createNativePromise; }));\n    return _promiseCreator.v.call(this, executor, timeout);\n}\nvar createAllPromise = _createAllPromise(createPromise);\n\nvar UNDEFINED_VALUE$2 = undefined;\nvar STR_EMPTY = \"\";\nvar STR_CHANNELS = \"channels\";\nvar STR_CORE = \"core\";\nvar STR_CREATE_PERF_MGR = \"createPerfMgr\";\nvar STR_DISABLED = \"disabled\";\nvar STR_EXTENSION_CONFIG = \"extensionConfig\";\nvar STR_EXTENSIONS = \"extensions\";\nvar STR_PROCESS_TELEMETRY = \"processTelemetry\";\nvar STR_PRIORITY = \"priority\";\nvar STR_EVENTS_SENT = \"eventsSent\";\nvar STR_EVENTS_DISCARDED = \"eventsDiscarded\";\nvar STR_EVENTS_SEND_REQUEST = \"eventsSendRequest\";\nvar STR_PERF_EVENT = \"perfEvent\";\nvar STR_GET_PERF_MGR = \"getPerfMgr\";\nvar STR_DOMAIN = \"domain\";\nvar STR_PATH = \"path\";\nvar STR_NOT_DYNAMIC_ERROR = \"Not dynamic - \";\n\nvar strGetPrototypeOf = \"getPrototypeOf\";\nvar rCamelCase = /-([a-z])/g;\nvar rNormalizeInvalid = /([^\\w\\d_$])/g;\nvar rLeadingNumeric = /^(\\d+[\\w\\d_$])/;\nvar _getObjProto = Object[strGetPrototypeOf];\nfunction isNotNullOrUndefined(value) {\n    return !isNullOrUndefined(value);\n}\nfunction normalizeJsName(name) {\n    var value = name;\n    if (value && isString(value)) {\n        value = value[_DYN_REPLACE ](rCamelCase, function (_all, letter) {\n            return letter.toUpperCase();\n        });\n        value = value[_DYN_REPLACE ](rNormalizeInvalid, \"_\");\n        value = value[_DYN_REPLACE ](rLeadingNumeric, function (_all, match) {\n            return \"_\" + match;\n        });\n    }\n    return value;\n}\nfunction strContains(value, search) {\n    if (value && search) {\n        return strIndexOf(value, search) !== -1;\n    }\n    return false;\n}\nfunction toISOString(date) {\n    return date && date.toISOString() || \"\";\n}\nfunction getExceptionName(object) {\n    if (isError(object)) {\n        return object[_DYN_NAME$3 ];\n    }\n    return STR_EMPTY;\n}\nfunction setValue(target, field, value, valChk, srcChk) {\n    var theValue = value;\n    if (target) {\n        theValue = target[field];\n        if (theValue !== value && (!srcChk || srcChk(theValue)) && (!valChk || valChk(value))) {\n            theValue = value;\n            target[field] = theValue;\n        }\n    }\n    return theValue;\n}\nfunction getSetValue(target, field, defValue) {\n    var theValue;\n    if (target) {\n        theValue = target[field];\n        if (!theValue && isNullOrUndefined(theValue)) {\n            theValue = !isUndefined(defValue) ? defValue : {};\n            target[field] = theValue;\n        }\n    }\n    else {\n        theValue = !isUndefined(defValue) ? defValue : {};\n    }\n    return theValue;\n}\nfunction _createProxyFunction(source, funcName) {\n    var srcFunc = null;\n    var src = null;\n    if (isFunction(source)) {\n        srcFunc = source;\n    }\n    else {\n        src = source;\n    }\n    return function () {\n        var originalArguments = arguments;\n        if (srcFunc) {\n            src = srcFunc();\n        }\n        if (src) {\n            return src[funcName][_DYN_APPLY ](src, originalArguments);\n        }\n    };\n}\nfunction proxyAssign(target, source, chkSet) {\n    if (target && source && isObject(target) && isObject(source)) {\n        var _loop_1 = function (field) {\n            if (isString(field)) {\n                var value = source[field];\n                if (isFunction(value)) {\n                    if (!chkSet || chkSet(field, true, source, target)) {\n                        target[field] = _createProxyFunction(source, field);\n                    }\n                }\n                else if (!chkSet || chkSet(field, false, source, target)) {\n                    if (objHasOwn(target, field)) {\n                        delete target[field];\n                    }\n                    objDefine(target, field, {\n                        g: function () {\n                            return source[field];\n                        },\n                        s: function (theValue) {\n                            source[field] = theValue;\n                        }\n                    });\n                }\n            }\n        };\n        for (var field in source) {\n            _loop_1(field);\n        }\n    }\n    return target;\n}\nfunction proxyFunctionAs(target, name, source, theFunc, overwriteTarget) {\n    if (target && name && source) {\n        if (overwriteTarget !== false || isUndefined(target[name])) {\n            target[name] = _createProxyFunction(source, theFunc);\n        }\n    }\n}\nfunction proxyFunctions(target, source, functionsToProxy, overwriteTarget) {\n    if (target && source && isObject(target) && isArray(functionsToProxy)) {\n        arrForEach(functionsToProxy, function (theFuncName) {\n            if (isString(theFuncName)) {\n                proxyFunctionAs(target, theFuncName, source, theFuncName, overwriteTarget);\n            }\n        });\n    }\n    return target;\n}\nfunction createClassFromInterface(defaults) {\n    return /** @class */ (function () {\n        function class_1() {\n            var _this = this;\n            if (defaults) {\n                objForEachKey(defaults, function (field, value) {\n                    _this[field] = value;\n                });\n            }\n        }\n        return class_1;\n    }());\n}\nfunction optimizeObject(theObject) {\n    if (theObject && objAssign) {\n        theObject = ObjClass(objAssign({}, theObject));\n    }\n    return theObject;\n}\nfunction objExtend(obj1, obj2, obj3, obj4, obj5, obj6) {\n    var theArgs = arguments;\n    var extended = theArgs[0] || {};\n    var argLen = theArgs[_DYN_LENGTH$5 ];\n    var deep = false;\n    var idx = 1;\n    if (argLen > 0 && isBoolean(extended)) {\n        deep = extended;\n        extended = theArgs[idx] || {};\n        idx++;\n    }\n    if (!isObject(extended)) {\n        extended = {};\n    }\n    for (; idx < argLen; idx++) {\n        var arg = theArgs[idx];\n        var isArgArray = isArray(arg);\n        var isArgObj = isObject(arg);\n        for (var prop in arg) {\n            var propOk = (isArgArray && (prop in arg)) || (isArgObj && objHasOwn(arg, prop));\n            if (!propOk) {\n                continue;\n            }\n            var newValue = arg[prop];\n            var isNewArray = void 0;\n            if (deep && newValue && ((isNewArray = isArray(newValue)) || isPlainObject(newValue))) {\n                var clone = extended[prop];\n                if (isNewArray) {\n                    if (!isArray(clone)) {\n                        clone = [];\n                    }\n                }\n                else if (!isPlainObject(clone)) {\n                    clone = {};\n                }\n                newValue = objExtend(deep, clone, newValue);\n            }\n            if (newValue !== undefined) {\n                extended[prop] = newValue;\n            }\n        }\n    }\n    return extended;\n}\nfunction isFeatureEnabled(feature, cfg) {\n    var rlt = false;\n    var ft = cfg && cfg.featureOptIn && cfg.featureOptIn[feature];\n    if (feature && ft) {\n        var mode = ft.mode;\n        rlt = (mode == 3 ) || (mode == 1 );\n    }\n    return rlt;\n}\n\nvar strDocumentMode = \"documentMode\";\nvar strLocation = \"location\";\nvar strConsole = \"console\";\nvar strJSON = \"JSON\";\nvar strCrypto = \"crypto\";\nvar strMsCrypto = \"msCrypto\";\nvar strReactNative = \"ReactNative\";\nvar strMsie = \"msie\";\nvar strTrident = \"trident/\";\nvar strXMLHttpRequest = \"XMLHttpRequest\";\nvar _isTrident = null;\nvar _navUserAgentCheck = null;\nvar _enableMocks = false;\nvar _useXDomainRequest = null;\nvar _beaconsSupported = null;\nfunction _hasProperty(theClass, property) {\n    var supported = false;\n    if (theClass) {\n        try {\n            supported = property in theClass;\n            if (!supported) {\n                var proto = theClass[strShimPrototype];\n                if (proto) {\n                    supported = property in proto;\n                }\n            }\n        }\n        catch (e) {\n        }\n        if (!supported) {\n            try {\n                var tmp = new theClass();\n                supported = !isUndefined(tmp[property]);\n            }\n            catch (e) {\n            }\n        }\n    }\n    return supported;\n}\nfunction getLocation(checkForMock) {\n    if (checkForMock && _enableMocks) {\n        var mockLocation = getInst(\"__mockLocation\");\n        if (mockLocation) {\n            return mockLocation;\n        }\n    }\n    if (typeof location === strShimObject && location) {\n        return location;\n    }\n    return getInst(strLocation);\n}\nfunction getConsole() {\n    if (typeof console !== strShimUndefined) {\n        return console;\n    }\n    return getInst(strConsole);\n}\nfunction hasJSON() {\n    return Boolean((typeof JSON === strShimObject && JSON) || getInst(strJSON) !== null);\n}\nfunction getJSON() {\n    if (hasJSON()) {\n        return JSON || getInst(strJSON);\n    }\n    return null;\n}\nfunction getCrypto() {\n    return getInst(strCrypto);\n}\nfunction getMsCrypto() {\n    return getInst(strMsCrypto);\n}\nfunction isReactNative() {\n    var nav = getNavigator();\n    if (nav && nav.product) {\n        return nav.product === strReactNative;\n    }\n    return false;\n}\nfunction isIE() {\n    var nav = getNavigator();\n    if (nav && (nav[_DYN_USER_AGENT ] !== _navUserAgentCheck || _isTrident === null)) {\n        _navUserAgentCheck = nav[_DYN_USER_AGENT ];\n        var userAgent = (_navUserAgentCheck || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]();\n        _isTrident = (strContains(userAgent, strMsie) || strContains(userAgent, strTrident));\n    }\n    return _isTrident;\n}\nfunction getIEVersion(userAgentStr) {\n    if (userAgentStr === void 0) { userAgentStr = null; }\n    if (!userAgentStr) {\n        var navigator_1 = getNavigator() || {};\n        userAgentStr = navigator_1 ? (navigator_1.userAgent || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]() : STR_EMPTY;\n    }\n    var ua = (userAgentStr || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]();\n    if (strContains(ua, strMsie)) {\n        var doc = getDocument() || {};\n        return Math.max(parseInt(ua[_DYN_SPLIT$1 ](strMsie)[1]), (doc[strDocumentMode] || 0));\n    }\n    else if (strContains(ua, strTrident)) {\n        var tridentVer = parseInt(ua[_DYN_SPLIT$1 ](strTrident)[1]);\n        if (tridentVer) {\n            return tridentVer + 4;\n        }\n    }\n    return null;\n}\nfunction isBeaconsSupported(useCached) {\n    if (_beaconsSupported === null || useCached === false) {\n        _beaconsSupported = hasNavigator() && Boolean(getNavigator().sendBeacon);\n    }\n    return _beaconsSupported;\n}\nfunction isFetchSupported(withKeepAlive) {\n    var isSupported = false;\n    try {\n        isSupported = !!getInst(\"fetch\");\n        var request = getInst(\"Request\");\n        if (isSupported && withKeepAlive && request) {\n            isSupported = _hasProperty(request, \"keepalive\");\n        }\n    }\n    catch (e) {\n    }\n    return isSupported;\n}\nfunction useXDomainRequest() {\n    if (_useXDomainRequest === null) {\n        _useXDomainRequest = (typeof XDomainRequest !== strShimUndefined);\n        if (_useXDomainRequest && isXhrSupported()) {\n            _useXDomainRequest = _useXDomainRequest && !_hasProperty(getInst(strXMLHttpRequest), \"withCredentials\");\n        }\n    }\n    return _useXDomainRequest;\n}\nfunction isXhrSupported() {\n    var isSupported = false;\n    try {\n        var xmlHttpRequest = getInst(strXMLHttpRequest);\n        isSupported = !!xmlHttpRequest;\n    }\n    catch (e) {\n    }\n    return isSupported;\n}\nfunction _getNamedValue(values, name) {\n    if (values) {\n        for (var i = 0; i < values[_DYN_LENGTH$5 ]; i++) {\n            var value = values[i];\n            if (value[_DYN_NAME$3 ]) {\n                if (value[_DYN_NAME$3 ] === name) {\n                    return value;\n                }\n            }\n        }\n    }\n    return {};\n}\nfunction findMetaTag(name) {\n    var doc = getDocument();\n    if (doc && name) {\n        return _getNamedValue(doc.querySelectorAll(\"meta\"), name).content;\n    }\n    return null;\n}\nfunction findNamedServerTiming(name) {\n    var value;\n    var perf = getPerformance();\n    if (perf) {\n        var navPerf = perf.getEntriesByType(\"navigation\") || [];\n        value = _getNamedValue((navPerf[_DYN_LENGTH$5 ] > 0 ? navPerf[0] : {}).serverTiming, name).description;\n    }\n    return value;\n}\nfunction dispatchEvent(target, evnt) {\n    if (target && target.dispatchEvent && evnt) {\n        target.dispatchEvent(evnt);\n        return true;\n    }\n    return false;\n}\nfunction createCustomDomEvent(eventName, details) {\n    var event = null;\n    var detail = { detail: details || null };\n    if (isFunction(CustomEvent)) {\n        event = new CustomEvent(eventName, detail);\n    }\n    else {\n        var doc = getDocument();\n        if (doc && doc.createEvent) {\n            event = doc.createEvent(\"CustomEvent\");\n            event.initCustomEvent(eventName, true, true, detail);\n        }\n    }\n    return event;\n}\nfunction sendCustomEvent(evtName, cfg, customDetails) {\n    var global = getGlobal();\n    if (global && global.CustomEvent) {\n        try {\n            var details = { cfg: cfg || null, customDetails: customDetails || null };\n            return dispatchEvent(global, createCustomDomEvent(evtName, details));\n        }\n        catch (e) {\n        }\n    }\n    return false;\n}\n\nvar UInt32Mask = 0x100000000;\nvar MaxUInt32 = 0xffffffff;\nvar SEED1 = 123456789;\nvar SEED2 = 987654321;\nvar _mwcSeeded = false;\nvar _mwcW = SEED1;\nvar _mwcZ = SEED2;\nfunction _mwcSeed(seedValue) {\n    if (seedValue < 0) {\n        seedValue >>>= 0;\n    }\n    _mwcW = (SEED1 + seedValue) & MaxUInt32;\n    _mwcZ = (SEED2 - seedValue) & MaxUInt32;\n    _mwcSeeded = true;\n}\nfunction _autoSeedMwc() {\n    try {\n        var now = utcNow() & 0x7fffffff;\n        _mwcSeed(((Math.random() * UInt32Mask) ^ now) + now);\n    }\n    catch (e) {\n    }\n}\nfunction randomValue(maxValue) {\n    if (maxValue > 0) {\n        return Math.floor((random32() / MaxUInt32) * (maxValue + 1)) >>> 0;\n    }\n    return 0;\n}\nfunction random32(signed) {\n    var value = 0;\n    var c = getCrypto() || getMsCrypto();\n    if (c && c.getRandomValues) {\n        value = c.getRandomValues(new Uint32Array(1))[0] & MaxUInt32;\n    }\n    if (value === 0 && isIE()) {\n        if (!_mwcSeeded) {\n            _autoSeedMwc();\n        }\n        value = mwcRandom32() & MaxUInt32;\n    }\n    if (value === 0) {\n        value = Math.floor((UInt32Mask * Math.random()) | 0);\n    }\n    if (!signed) {\n        value >>>= 0;\n    }\n    return value;\n}\nfunction mwcRandom32(signed) {\n    _mwcZ = (36969 * (_mwcZ & 0xFFFF) + (_mwcZ >> 16)) & MaxUInt32;\n    _mwcW = (18000 * (_mwcW & 0xFFFF) + (_mwcW >> 16)) & MaxUInt32;\n    var value = (((_mwcZ << 16) + (_mwcW & 0xFFFF)) >>> 0) & MaxUInt32 | 0;\n    if (!signed) {\n        value >>>= 0;\n    }\n    return value;\n}\nfunction newId(maxLength) {\n    if (maxLength === void 0) { maxLength = 22; }\n    var base64chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var number = random32() >>> 0;\n    var chars = 0;\n    var result = STR_EMPTY;\n    while (result[_DYN_LENGTH$5 ] < maxLength) {\n        chars++;\n        result += base64chars.charAt(number & 0x3F);\n        number >>>= 6;\n        if (chars === 5) {\n            number = (((random32() << 2) & 0xFFFFFFFF) | (number & 0x03)) >>> 0;\n            chars = 0;\n        }\n    }\n    return result;\n}\n\nvar version = '3.0.6';\nvar instanceName = \".\" + newId(6);\nvar _dataUid = 0;\nfunction _canAcceptData(target) {\n    return target[_DYN_NODE_TYPE ] === 1 || target[_DYN_NODE_TYPE ] === 9 || !(+target[_DYN_NODE_TYPE ]);\n}\nfunction _getCache(data, target) {\n    var theCache = target[data.id];\n    if (!theCache) {\n        theCache = {};\n        try {\n            if (_canAcceptData(target)) {\n                objDefine(target, data.id, {\n                    e: false,\n                    v: theCache\n                });\n            }\n        }\n        catch (e) {\n        }\n    }\n    return theCache;\n}\nfunction createUniqueNamespace(name, includeVersion) {\n    if (includeVersion === void 0) { includeVersion = false; }\n    return normalizeJsName(name + (_dataUid++) + (includeVersion ? \".\" + version : STR_EMPTY) + instanceName);\n}\nfunction createElmNodeData(name) {\n    var data = {\n        id: createUniqueNamespace(\"_aiData-\" + (name || STR_EMPTY) + \".\" + version),\n        accept: function (target) {\n            return _canAcceptData(target);\n        },\n        get: function (target, name, defValue, addDefault) {\n            var theCache = target[data.id];\n            if (!theCache) {\n                if (addDefault) {\n                    theCache = _getCache(data, target);\n                    theCache[normalizeJsName(name)] = defValue;\n                }\n                return defValue;\n            }\n            return theCache[normalizeJsName(name)];\n        },\n        kill: function (target, name) {\n            if (target && target[name]) {\n                try {\n                    delete target[name];\n                }\n                catch (e) {\n                }\n            }\n        }\n    };\n    return data;\n}\n\nfunction _isConfigDefaults(value) {\n    return (value && isObject(value) && (value.isVal || value.fb || objHasOwn(value, \"v\") || objHasOwn(value, \"mrg\") || objHasOwn(value, \"ref\") || value.set));\n}\nfunction _getDefault(dynamicHandler, theConfig, cfgDefaults) {\n    var defValue;\n    var isDefaultValid = cfgDefaults.dfVal || isDefined;\n    if (theConfig && cfgDefaults.fb) {\n        var fallbacks = cfgDefaults.fb;\n        if (!isArray(fallbacks)) {\n            fallbacks = [fallbacks];\n        }\n        for (var lp = 0; lp < fallbacks[_DYN_LENGTH$5 ]; lp++) {\n            var fallback = fallbacks[lp];\n            var fbValue = theConfig[fallback];\n            if (isDefaultValid(fbValue)) {\n                defValue = fbValue;\n            }\n            else if (dynamicHandler) {\n                fbValue = dynamicHandler.cfg[fallback];\n                if (isDefaultValid(fbValue)) {\n                    defValue = fbValue;\n                }\n                dynamicHandler.set(dynamicHandler.cfg, asString(fallback), fbValue);\n            }\n            if (isDefaultValid(defValue)) {\n                break;\n            }\n        }\n    }\n    if (!isDefaultValid(defValue) && isDefaultValid(cfgDefaults.v)) {\n        defValue = cfgDefaults.v;\n    }\n    return defValue;\n}\nfunction _resolveDefaultValue(dynamicHandler, theConfig, cfgDefaults) {\n    var theValue = cfgDefaults;\n    if (cfgDefaults && _isConfigDefaults(cfgDefaults)) {\n        theValue = _getDefault(dynamicHandler, theConfig, cfgDefaults);\n    }\n    if (theValue) {\n        if (_isConfigDefaults(theValue)) {\n            theValue = _resolveDefaultValue(dynamicHandler, theConfig, theValue);\n        }\n        var newValue_1;\n        if (isArray(theValue)) {\n            newValue_1 = [];\n            newValue_1[_DYN_LENGTH$5 ] = theValue[_DYN_LENGTH$5 ];\n        }\n        else if (isPlainObject(theValue)) {\n            newValue_1 = {};\n        }\n        if (newValue_1) {\n            objForEachKey(theValue, function (key, value) {\n                if (value && _isConfigDefaults(value)) {\n                    value = _resolveDefaultValue(dynamicHandler, theConfig, value);\n                }\n                newValue_1[key] = value;\n            });\n            theValue = newValue_1;\n        }\n    }\n    return theValue;\n}\nfunction _applyDefaultValue(dynamicHandler, theConfig, name, defaultValue) {\n    var isValid;\n    var setFn;\n    var defValue;\n    var cfgDefaults = defaultValue;\n    var mergeDf;\n    var reference;\n    var readOnly;\n    var blkDynamicValue;\n    if (_isConfigDefaults(cfgDefaults)) {\n        isValid = cfgDefaults.isVal;\n        setFn = cfgDefaults.set;\n        readOnly = cfgDefaults[_DYN_RD_ONLY ];\n        blkDynamicValue = cfgDefaults[_DYN_BLK_VAL ];\n        mergeDf = cfgDefaults.mrg;\n        reference = cfgDefaults.ref;\n        if (!reference && isUndefined(reference)) {\n            reference = !!mergeDf;\n        }\n        defValue = _getDefault(dynamicHandler, theConfig, cfgDefaults);\n    }\n    else {\n        defValue = defaultValue;\n    }\n    if (blkDynamicValue) {\n        dynamicHandler[_DYN_BLK_VAL ](theConfig, name);\n    }\n    var theValue;\n    var usingDefault = true;\n    var cfgValue = theConfig[name];\n    if (cfgValue || !isNullOrUndefined(cfgValue)) {\n        theValue = cfgValue;\n        usingDefault = false;\n        if (isValid && theValue !== defValue && !isValid(theValue)) {\n            theValue = defValue;\n            usingDefault = true;\n        }\n        if (setFn) {\n            theValue = setFn(theValue, defValue, theConfig);\n            usingDefault = theValue === defValue;\n        }\n    }\n    if (!usingDefault) {\n        if (isPlainObject(theValue) || isArray(defValue)) {\n            if (mergeDf && defValue && (isPlainObject(defValue) || isArray(defValue))) {\n                objForEachKey(defValue, function (dfName, dfValue) {\n                    _applyDefaultValue(dynamicHandler, theValue, dfName, dfValue);\n                });\n            }\n        }\n    }\n    else if (defValue) {\n        theValue = _resolveDefaultValue(dynamicHandler, theConfig, defValue);\n    }\n    else {\n        theValue = defValue;\n    }\n    dynamicHandler.set(theConfig, name, theValue);\n    if (reference) {\n        dynamicHandler.ref(theConfig, name);\n    }\n    if (readOnly) {\n        dynamicHandler[_DYN_RD_ONLY ](theConfig, name);\n    }\n}\n\nvar CFG_HANDLER_LINK = symbolFor(\"[[ai_dynCfg_1]]\");\nvar BLOCK_DYNAMIC = symbolFor(\"[[ai_blkDynCfg_1]]\");\nvar FORCE_DYNAMIC = symbolFor(\"[[ai_frcDynCfg_1]]\");\nfunction _cfgDeepCopy(source) {\n    if (source) {\n        var target_1;\n        if (isArray(source)) {\n            target_1 = [];\n            target_1[_DYN_LENGTH$5 ] = source[_DYN_LENGTH$5 ];\n        }\n        else if (isPlainObject(source)) {\n            target_1 = {};\n        }\n        if (target_1) {\n            objForEachKey(source, function (key, value) {\n                target_1[key] = _cfgDeepCopy(value);\n            });\n            return target_1;\n        }\n    }\n    return source;\n}\nfunction getDynamicConfigHandler(value) {\n    if (value) {\n        var handler = value[CFG_HANDLER_LINK] || value;\n        if (handler.cfg && (handler.cfg === value || handler.cfg[CFG_HANDLER_LINK] === handler)) {\n            return handler;\n        }\n    }\n    return null;\n}\nfunction blockDynamicConversion(value) {\n    if (value && (isPlainObject(value) || isArray(value))) {\n        try {\n            value[BLOCK_DYNAMIC] = true;\n        }\n        catch (e) {\n        }\n    }\n    return value;\n}\nfunction _canMakeDynamic(getFunc, state, value) {\n    var result = false;\n    if (value && !getFunc[state.blkVal]) {\n        result = value[FORCE_DYNAMIC];\n        if (!result && !value[BLOCK_DYNAMIC]) {\n            result = isPlainObject(value) || isArray(value);\n        }\n    }\n    return result;\n}\nfunction throwInvalidAccess(message) {\n    throwTypeError(\"InvalidAccess:\" + message);\n}\n\nvar arrayMethodsToPatch = [\n    \"push\",\n    \"pop\",\n    \"shift\",\n    \"unshift\",\n    \"splice\"\n];\nvar _throwDynamicError = function (logger, name, desc, e) {\n    logger && logger[_DYN_THROW_INTERNAL ](3 , 108 , \"\".concat(desc, \" [\").concat(name, \"] failed - \") + dumpObj(e));\n};\nfunction _patchArray(state, target, name) {\n    if (isArray(target)) {\n        arrForEach(arrayMethodsToPatch, function (method) {\n            var orgMethod = target[method];\n            target[method] = function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                var result = orgMethod[_DYN_APPLY ](this, args);\n                _makeDynamicObject(state, target, name, \"Patching\");\n                return result;\n            };\n        });\n    }\n}\nfunction _getOwnPropGetter(target, name) {\n    var propDesc = objGetOwnPropertyDescriptor(target, name);\n    return propDesc && propDesc.get;\n}\nfunction _createDynamicProperty(state, theConfig, name, value) {\n    var detail = {\n        n: name,\n        h: [],\n        trk: function (handler) {\n            if (handler && handler.fn) {\n                if (arrIndexOf(detail.h, handler) === -1) {\n                    detail.h[_DYN_PUSH$2 ](handler);\n                }\n                state.trk(handler, detail);\n            }\n        },\n        clr: function (handler) {\n            var idx = arrIndexOf(detail.h, handler);\n            if (idx !== -1) {\n                detail.h[_DYN_SPLICE ](idx, 1);\n            }\n        }\n    };\n    var checkDynamic = true;\n    var isObjectOrArray = false;\n    function _getProperty() {\n        if (checkDynamic) {\n            isObjectOrArray = isObjectOrArray || _canMakeDynamic(_getProperty, state, value);\n            if (value && !value[CFG_HANDLER_LINK] && isObjectOrArray) {\n                value = _makeDynamicObject(state, value, name, \"Converting\");\n            }\n            checkDynamic = false;\n        }\n        var activeHandler = state.act;\n        if (activeHandler) {\n            detail.trk(activeHandler);\n        }\n        return value;\n    }\n    _getProperty[state.prop] = {\n        chng: function () {\n            state.add(detail);\n        }\n    };\n    function _setProperty(newValue) {\n        if (value !== newValue) {\n            if (!!_getProperty[state.ro] && !state.upd) {\n                throwInvalidAccess(\"[\" + name + \"] is read-only:\" + dumpObj(theConfig));\n            }\n            if (checkDynamic) {\n                isObjectOrArray = isObjectOrArray || _canMakeDynamic(_getProperty, state, value);\n                checkDynamic = false;\n            }\n            var isReferenced = isObjectOrArray && _getProperty[state.rf];\n            if (isObjectOrArray) {\n                if (isReferenced) {\n                    objForEachKey(value, function (key) {\n                        value[key] = newValue ? newValue[key] : UNDEFINED_VALUE$2;\n                    });\n                    try {\n                        objForEachKey(newValue, function (key, theValue) {\n                            _setDynamicProperty(state, value, key, theValue);\n                        });\n                        newValue = value;\n                    }\n                    catch (e) {\n                        _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, \"Assigning\", e);\n                        isObjectOrArray = false;\n                    }\n                }\n                else if (value && value[CFG_HANDLER_LINK]) {\n                    objForEachKey(value, function (key) {\n                        var getter = _getOwnPropGetter(value, key);\n                        if (getter) {\n                            var valueState = getter[state.prop];\n                            valueState && valueState.chng();\n                        }\n                    });\n                }\n            }\n            if (newValue !== value) {\n                var newIsObjectOrArray = newValue && _canMakeDynamic(_getProperty, state, newValue);\n                if (!isReferenced && newIsObjectOrArray) {\n                    newValue = _makeDynamicObject(state, newValue, name, \"Converting\");\n                }\n                value = newValue;\n                isObjectOrArray = newIsObjectOrArray;\n            }\n            state.add(detail);\n        }\n    }\n    objDefine(theConfig, detail.n, { g: _getProperty, s: _setProperty });\n}\nfunction _setDynamicProperty(state, target, name, value) {\n    if (target) {\n        var getter = _getOwnPropGetter(target, name);\n        var isDynamic = getter && !!getter[state.prop];\n        if (!isDynamic) {\n            _createDynamicProperty(state, target, name, value);\n        }\n        else {\n            target[name] = value;\n        }\n    }\n    return target;\n}\nfunction _setDynamicPropertyState(state, target, name, flags) {\n    if (target) {\n        var getter = _getOwnPropGetter(target, name);\n        var isDynamic = getter && !!getter[state.prop];\n        var inPlace = flags && flags[0 ];\n        var rdOnly = flags && flags[1 ];\n        var blkProp = flags && flags[2 ];\n        if (!isDynamic) {\n            if (blkProp) {\n                try {\n                    blockDynamicConversion(target);\n                }\n                catch (e) {\n                    _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, \"Blocking\", e);\n                }\n            }\n            try {\n                _setDynamicProperty(state, target, name, target[name]);\n                getter = _getOwnPropGetter(target, name);\n            }\n            catch (e) {\n                _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, \"State\", e);\n            }\n        }\n        if (inPlace) {\n            getter[state.rf] = inPlace;\n        }\n        if (rdOnly) {\n            getter[state.ro] = rdOnly;\n        }\n        if (blkProp) {\n            getter[state.blkVal] = true;\n        }\n    }\n    return target;\n}\nfunction _makeDynamicObject(state, target, name, desc) {\n    try {\n        objForEachKey(target, function (key, value) {\n            _setDynamicProperty(state, target, key, value);\n        });\n        if (!target[CFG_HANDLER_LINK]) {\n            objDefineProp(target, CFG_HANDLER_LINK, {\n                get: function () {\n                    return state[_DYN_HDLR ];\n                }\n            });\n            _patchArray(state, target, name);\n        }\n    }\n    catch (e) {\n        _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, desc, e);\n    }\n    return target;\n}\n\nvar symPrefix = \"[[ai_\";\nvar symPostfix = \"]]\";\nfunction _createState(cfgHandler) {\n    var _a;\n    var dynamicPropertySymbol = newSymbol(symPrefix + \"get\" + cfgHandler.uid + symPostfix);\n    var dynamicPropertyReadOnly = newSymbol(symPrefix + \"ro\" + cfgHandler.uid + symPostfix);\n    var dynamicPropertyReferenced = newSymbol(symPrefix + \"rf\" + cfgHandler.uid + symPostfix);\n    var dynamicPropertyBlockValue = newSymbol(symPrefix + \"blkVal\" + cfgHandler.uid + symPostfix);\n    var dynamicPropertyDetail = newSymbol(symPrefix + \"dtl\" + cfgHandler.uid + symPostfix);\n    var _waitingHandlers = null;\n    var _watcherTimer = null;\n    var theState;\n    function _useHandler(activeHandler, callback) {\n        var prevWatcher = theState.act;\n        try {\n            theState.act = activeHandler;\n            if (activeHandler && activeHandler[dynamicPropertyDetail]) {\n                arrForEach(activeHandler[dynamicPropertyDetail], function (detail) {\n                    detail.clr(activeHandler);\n                });\n                activeHandler[dynamicPropertyDetail] = [];\n            }\n            callback({\n                cfg: cfgHandler.cfg,\n                set: cfgHandler.set.bind(cfgHandler),\n                setDf: cfgHandler[_DYN_SET_DF ].bind(cfgHandler),\n                ref: cfgHandler.ref.bind(cfgHandler),\n                rdOnly: cfgHandler[_DYN_RD_ONLY ].bind(cfgHandler)\n            });\n        }\n        catch (e) {\n            var logger = cfgHandler[_DYN_LOGGER ];\n            if (logger) {\n                logger[_DYN_THROW_INTERNAL ](1 , 107 , dumpObj(e));\n            }\n            throw e;\n        }\n        finally {\n            theState.act = prevWatcher || null;\n        }\n    }\n    function _notifyWatchers() {\n        if (_waitingHandlers) {\n            var notifyHandlers = _waitingHandlers;\n            _waitingHandlers = null;\n            _watcherTimer && _watcherTimer[_DYN_CANCEL ]();\n            _watcherTimer = null;\n            var watcherFailures_1 = [];\n            arrForEach(notifyHandlers, function (handler) {\n                if (handler) {\n                    if (handler[dynamicPropertyDetail]) {\n                        arrForEach(handler[dynamicPropertyDetail], function (detail) {\n                            detail.clr(handler);\n                        });\n                        handler[dynamicPropertyDetail] = null;\n                    }\n                    if (handler.fn) {\n                        try {\n                            _useHandler(handler, handler.fn);\n                        }\n                        catch (e) {\n                            watcherFailures_1[_DYN_PUSH$2 ](e);\n                        }\n                    }\n                }\n            });\n            if (_waitingHandlers) {\n                try {\n                    _notifyWatchers();\n                }\n                catch (e) {\n                    watcherFailures_1[_DYN_PUSH$2 ](e);\n                }\n            }\n            if (watcherFailures_1[_DYN_LENGTH$5 ] > 0) {\n                throwAggregationError(\"Watcher error(s): \", watcherFailures_1);\n            }\n        }\n    }\n    function _addWatcher(detail) {\n        if (detail && detail.h[_DYN_LENGTH$5 ] > 0) {\n            if (!_waitingHandlers) {\n                _waitingHandlers = [];\n            }\n            if (!_watcherTimer) {\n                _watcherTimer = scheduleTimeout(function () {\n                    _watcherTimer = null;\n                    _notifyWatchers();\n                }, 0);\n            }\n            for (var idx = 0; idx < detail.h[_DYN_LENGTH$5 ]; idx++) {\n                var handler = detail.h[idx];\n                if (handler && arrIndexOf(_waitingHandlers, handler) === -1) {\n                    _waitingHandlers[_DYN_PUSH$2 ](handler);\n                }\n            }\n        }\n    }\n    function _trackHandler(handler, detail) {\n        if (handler) {\n            var details = handler[dynamicPropertyDetail] = handler[dynamicPropertyDetail] || [];\n            if (arrIndexOf(details, detail) === -1) {\n                details[_DYN_PUSH$2 ](detail);\n            }\n        }\n    }\n    theState = (_a = {\n            prop: dynamicPropertySymbol,\n            ro: dynamicPropertyReadOnly,\n            rf: dynamicPropertyReferenced\n        },\n        _a[_DYN_BLK_VAL ] = dynamicPropertyBlockValue,\n        _a[_DYN_HDLR ] = cfgHandler,\n        _a.add = _addWatcher,\n        _a[_DYN_NOTIFY ] = _notifyWatchers,\n        _a.use = _useHandler,\n        _a.trk = _trackHandler,\n        _a);\n    return theState;\n}\n\nfunction _createAndUseHandler(state, configHandler) {\n    var handler = {\n        fn: configHandler,\n        rm: function () {\n            handler.fn = null;\n            state = null;\n            configHandler = null;\n        }\n    };\n    state.use(handler, configHandler);\n    return handler;\n}\nfunction _createDynamicHandler(logger, target, inPlace) {\n    var _a;\n    var dynamicHandler = getDynamicConfigHandler(target);\n    if (dynamicHandler) {\n        return dynamicHandler;\n    }\n    var uid = createUniqueNamespace(\"dyncfg\", true);\n    var newTarget = (target && inPlace !== false) ? target : _cfgDeepCopy(target);\n    var theState;\n    function _notifyWatchers() {\n        theState[_DYN_NOTIFY ]();\n    }\n    function _setValue(target, name, value) {\n        try {\n            target = _setDynamicProperty(theState, target, name, value);\n        }\n        catch (e) {\n            _throwDynamicError(logger, name, \"Setting value\", e);\n        }\n        return target[name];\n    }\n    function _watch(configHandler) {\n        return _createAndUseHandler(theState, configHandler);\n    }\n    function _block(configHandler, allowUpdate) {\n        theState.use(null, function (details) {\n            var prevUpd = theState.upd;\n            try {\n                if (!isUndefined(allowUpdate)) {\n                    theState.upd = allowUpdate;\n                }\n                configHandler(details);\n            }\n            finally {\n                theState.upd = prevUpd;\n            }\n        });\n    }\n    function _ref(target, name) {\n        var _a;\n        return _setDynamicPropertyState(theState, target, name, (_a = {}, _a[0 ] = true, _a))[name];\n    }\n    function _rdOnly(target, name) {\n        var _a;\n        return _setDynamicPropertyState(theState, target, name, (_a = {}, _a[1 ] = true, _a))[name];\n    }\n    function _blkPropValue(target, name) {\n        var _a;\n        return _setDynamicPropertyState(theState, target, name, (_a = {}, _a[2 ] = true, _a))[name];\n    }\n    function _applyDefaults(theConfig, defaultValues) {\n        if (defaultValues) {\n            objForEachKey(defaultValues, function (name, value) {\n                _applyDefaultValue(cfgHandler, theConfig, name, value);\n            });\n        }\n        return theConfig;\n    }\n    var cfgHandler = (_a = {\n            uid: null,\n            cfg: newTarget\n        },\n        _a[_DYN_LOGGER ] = logger,\n        _a[_DYN_NOTIFY ] = _notifyWatchers,\n        _a.set = _setValue,\n        _a[_DYN_SET_DF ] = _applyDefaults,\n        _a[_DYN_WATCH ] = _watch,\n        _a.ref = _ref,\n        _a[_DYN_RD_ONLY ] = _rdOnly,\n        _a[_DYN_BLK_VAL ] = _blkPropValue,\n        _a._block = _block,\n        _a);\n    objDefine(cfgHandler, \"uid\", {\n        c: false,\n        e: false,\n        w: false,\n        v: uid\n    });\n    theState = _createState(cfgHandler);\n    _makeDynamicObject(theState, newTarget, \"config\", \"Creating\");\n    return cfgHandler;\n}\nfunction _logInvalidAccess(logger, message) {\n    if (logger) {\n        logger[_DYN_WARN_TO_CONSOLE ](message);\n        logger[_DYN_THROW_INTERNAL ](2 , 108 , message);\n    }\n    else {\n        throwInvalidAccess(message);\n    }\n}\nfunction createDynamicConfig(config, defaultConfig, logger, inPlace) {\n    var dynamicHandler = _createDynamicHandler(logger, config || {}, inPlace);\n    if (defaultConfig) {\n        dynamicHandler[_DYN_SET_DF ](dynamicHandler.cfg, defaultConfig);\n    }\n    return dynamicHandler;\n}\nfunction onConfigChange(config, configHandler, logger) {\n    var handler = config[CFG_HANDLER_LINK] || config;\n    if (handler.cfg && (handler.cfg === config || handler.cfg[CFG_HANDLER_LINK] === handler)) {\n        return handler[_DYN_WATCH ](configHandler);\n    }\n    _logInvalidAccess(logger, STR_NOT_DYNAMIC_ERROR + dumpObj(config));\n    return createDynamicConfig(config, null, logger)[_DYN_WATCH ](configHandler);\n}\n\nfunction runTargetUnload(target, isAsync) {\n    if (target && target[_DYN_UNLOAD ]) {\n        return target[_DYN_UNLOAD ](isAsync);\n    }\n}\nfunction doUnloadAll(targets, isAsync, done) {\n    var result;\n    if (!done) {\n        result = createPromise(function (resolved) {\n            done = resolved;\n        });\n    }\n    if (targets && getLength(targets) > 0) {\n        doAwaitResponse(runTargetUnload(targets[0], isAsync), function () {\n            doUnloadAll(arrSlice(targets, 1), isAsync, done);\n        });\n    }\n    else {\n        done();\n    }\n    return result;\n}\n\nvar ChannelControllerPriority = 500;\n\nfunction _stringToBoolOrDefault(theValue, defaultValue, theConfig) {\n    if (!theValue && isNullOrUndefined(theValue)) {\n        return defaultValue;\n    }\n    if (isBoolean(theValue)) {\n        return theValue;\n    }\n    return asString(theValue)[_DYN_TO_LOWER_CASE$2 ]() === \"true\";\n}\nfunction cfgDfMerge(defaultValue) {\n    return {\n        mrg: true,\n        v: defaultValue\n    };\n}\nfunction cfgDfSet(setter, defaultValue) {\n    return {\n        set: setter,\n        v: defaultValue\n    };\n}\nfunction cfgDfValidate(validator, defaultValue, fallBackName) {\n    return {\n        fb: fallBackName,\n        isVal: validator,\n        v: defaultValue\n    };\n}\nfunction cfgDfBoolean(defaultValue, fallBackName) {\n    return {\n        fb: fallBackName,\n        set: _stringToBoolOrDefault,\n        v: !!defaultValue\n    };\n}\nfunction cfgDfString(defaultValue) {\n    return {\n        isVal: isString,\n        v: asString(defaultValue || STR_EMPTY)\n    };\n}\n\nvar listenerFuncs = [STR_EVENTS_SENT, STR_EVENTS_DISCARDED, STR_EVENTS_SEND_REQUEST, STR_PERF_EVENT];\nvar _aiNamespace = null;\nvar _debugListener;\nfunction _listenerProxyFunc(name, config) {\n    return function () {\n        var args = arguments;\n        var dbgExt = getDebugExt(config);\n        if (dbgExt) {\n            var listener = dbgExt.listener;\n            if (listener && listener[name]) {\n                listener[name][_DYN_APPLY ](listener, args);\n            }\n        }\n    };\n}\nfunction _getExtensionNamespace() {\n    var target = getInst(\"Microsoft\");\n    if (target) {\n        _aiNamespace = target[\"ApplicationInsights\"];\n    }\n    return _aiNamespace;\n}\nfunction getDebugExt(config) {\n    var ns = _aiNamespace;\n    if (!ns && config.disableDbgExt !== true) {\n        ns = _aiNamespace || _getExtensionNamespace();\n    }\n    return ns ? ns[\"ChromeDbgExt\"] : null;\n}\nfunction getDebugListener(config) {\n    if (!_debugListener) {\n        _debugListener = {};\n        for (var lp = 0; lp < listenerFuncs[_DYN_LENGTH$5 ]; lp++) {\n            _debugListener[listenerFuncs[lp]] = _listenerProxyFunc(listenerFuncs[lp], config);\n        }\n    }\n    return _debugListener;\n}\n\nvar _a$9;\nvar STR_WARN_TO_CONSOLE = \"warnToConsole\";\nvar AiNonUserActionablePrefix = \"AI (Internal): \";\nvar AiUserActionablePrefix = \"AI: \";\nvar AIInternalMessagePrefix = \"AITR_\";\nvar defaultValues$3 = {\n    loggingLevelConsole: 0,\n    loggingLevelTelemetry: 1,\n    maxMessageLimit: 25,\n    enableDebug: false\n};\nvar _logFuncs = (_a$9 = {},\n    _a$9[0 ] = null,\n    _a$9[1 ] = \"errorToConsole\",\n    _a$9[2 ] = STR_WARN_TO_CONSOLE,\n    _a$9[3 ] = \"debugToConsole\",\n    _a$9);\nfunction _sanitizeDiagnosticText(text) {\n    if (text) {\n        return \"\\\"\" + text[_DYN_REPLACE ](/\\\"/g, STR_EMPTY) + \"\\\"\";\n    }\n    return STR_EMPTY;\n}\nfunction _logToConsole(func, message) {\n    var theConsole = getConsole();\n    if (!!theConsole) {\n        var logFunc = \"log\";\n        if (theConsole[func]) {\n            logFunc = func;\n        }\n        if (isFunction(theConsole[logFunc])) {\n            theConsole[logFunc](message);\n        }\n    }\n}\nvar _InternalLogMessage = /** @class */ (function () {\n    function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n        if (isUserAct === void 0) { isUserAct = false; }\n        var _self = this;\n        _self[_DYN_MESSAGE_ID ] = msgId;\n        _self[_DYN_MESSAGE$2 ] =\n            (isUserAct ? AiUserActionablePrefix : AiNonUserActionablePrefix) +\n                msgId;\n        var strProps = STR_EMPTY;\n        if (hasJSON()) {\n            strProps = getJSON().stringify(properties);\n        }\n        var diagnosticText = (msg ? \" message:\" + _sanitizeDiagnosticText(msg) : STR_EMPTY) +\n            (properties ? \" props:\" + _sanitizeDiagnosticText(strProps) : STR_EMPTY);\n        _self[_DYN_MESSAGE$2 ] += diagnosticText;\n    }\n    _InternalLogMessage.dataType = \"MessageData\";\n    return _InternalLogMessage;\n}());\nfunction safeGetLogger(core, config) {\n    return (core || {})[_DYN_LOGGER ] || new DiagnosticLogger(config);\n}\nvar DiagnosticLogger = /** @class */ (function () {\n    function DiagnosticLogger(config) {\n        this.identifier = \"DiagnosticLogger\";\n        this.queue = [];\n        var _messageCount = 0;\n        var _messageLogged = {};\n        var _loggingLevelConsole;\n        var _loggingLevelTelemetry;\n        var _maxInternalMessageLimit;\n        var _enableDebug;\n        var _unloadHandler;\n        dynamicProto(DiagnosticLogger, this, function (_self) {\n            _unloadHandler = _setDefaultsFromConfig(config || {});\n            _self.consoleLoggingLevel = function () { return _loggingLevelConsole; };\n            _self[_DYN_THROW_INTERNAL ] = function (severity, msgId, msg, properties, isUserAct) {\n                if (isUserAct === void 0) { isUserAct = false; }\n                var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n                if (_enableDebug) {\n                    throw dumpObj(message);\n                }\n                else {\n                    var logFunc = _logFuncs[severity] || STR_WARN_TO_CONSOLE;\n                    if (!isUndefined(message[_DYN_MESSAGE$2 ])) {\n                        if (isUserAct) {\n                            var messageKey = +message[_DYN_MESSAGE_ID ];\n                            if (!_messageLogged[messageKey] && _loggingLevelConsole >= severity) {\n                                _self[logFunc](message[_DYN_MESSAGE$2 ]);\n                                _messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            if (_loggingLevelConsole >= severity) {\n                                _self[logFunc](message[_DYN_MESSAGE$2 ]);\n                            }\n                        }\n                        _logInternalMessage(severity, message);\n                    }\n                    else {\n                        _debugExtMsg(\"throw\" + (severity === 1  ? \"Critical\" : \"Warning\"), message);\n                    }\n                }\n            };\n            _self.debugToConsole = function (message) {\n                _logToConsole(\"debug\", message);\n                _debugExtMsg(\"warning\", message);\n            };\n            _self[_DYN_WARN_TO_CONSOLE ] = function (message) {\n                _logToConsole(\"warn\", message);\n                _debugExtMsg(\"warning\", message);\n            };\n            _self.errorToConsole = function (message) {\n                _logToConsole(\"error\", message);\n                _debugExtMsg(\"error\", message);\n            };\n            _self.resetInternalMessageCount = function () {\n                _messageCount = 0;\n                _messageLogged = {};\n            };\n            _self[_DYN_LOG_INTERNAL_MESSAGE ] = _logInternalMessage;\n            _self[_DYN_UNLOAD ] = function (isAsync) {\n                _unloadHandler && _unloadHandler.rm();\n                _unloadHandler = null;\n            };\n            function _logInternalMessage(severity, message) {\n                if (_areInternalMessagesThrottled()) {\n                    return;\n                }\n                var logMessage = true;\n                var messageKey = AIInternalMessagePrefix + message[_DYN_MESSAGE_ID ];\n                if (_messageLogged[messageKey]) {\n                    logMessage = false;\n                }\n                else {\n                    _messageLogged[messageKey] = true;\n                }\n                if (logMessage) {\n                    if (severity <= _loggingLevelTelemetry) {\n                        _self.queue[_DYN_PUSH$2 ](message);\n                        _messageCount++;\n                        _debugExtMsg((severity === 1  ? \"error\" : \"warn\"), message);\n                    }\n                    if (_messageCount === _maxInternalMessageLimit) {\n                        var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                        var throttleMessage = new _InternalLogMessage(23 , throttleLimitMessage, false);\n                        _self.queue[_DYN_PUSH$2 ](throttleMessage);\n                        if (severity === 1 ) {\n                            _self.errorToConsole(throttleLimitMessage);\n                        }\n                        else {\n                            _self[_DYN_WARN_TO_CONSOLE ](throttleLimitMessage);\n                        }\n                    }\n                }\n            }\n            function _setDefaultsFromConfig(config) {\n                return onConfigChange(createDynamicConfig(config, defaultValues$3, _self).cfg, function (details) {\n                    var config = details.cfg;\n                    _loggingLevelConsole = config[_DYN_LOGGING_LEVEL_CONSOL4 ];\n                    _loggingLevelTelemetry = config.loggingLevelTelemetry;\n                    _maxInternalMessageLimit = config.maxMessageLimit;\n                    _enableDebug = config.enableDebug;\n                });\n            }\n            function _areInternalMessagesThrottled() {\n                return _messageCount >= _maxInternalMessageLimit;\n            }\n            function _debugExtMsg(name, data) {\n                var dbgExt = getDebugExt(config || {});\n                if (dbgExt && dbgExt[_DYN_DIAG_LOG$2 ]) {\n                    dbgExt[_DYN_DIAG_LOG$2 ](name, data);\n                }\n            }\n        });\n    }\n    DiagnosticLogger.__ieDyn=1;\n    return DiagnosticLogger;\n}());\nfunction _getLogger(logger) {\n    return (logger || new DiagnosticLogger());\n}\nfunction _throwInternal(logger, severity, msgId, msg, properties, isUserAct) {\n    if (isUserAct === void 0) { isUserAct = false; }\n    _getLogger(logger)[_DYN_THROW_INTERNAL ](severity, msgId, msg, properties, isUserAct);\n}\nfunction _warnToConsole(logger, message) {\n    _getLogger(logger)[_DYN_WARN_TO_CONSOLE ](message);\n}\nfunction _logInternalMessage(logger, severity, message) {\n    _getLogger(logger)[_DYN_LOG_INTERNAL_MESSAGE ](severity, message);\n}\n\nvar _a$8, _b$2;\nvar strToGMTString = \"toGMTString\";\nvar strToUTCString = \"toUTCString\";\nvar strCookie = \"cookie\";\nvar strExpires = \"expires\";\nvar strIsCookieUseDisabled = \"isCookieUseDisabled\";\nvar strDisableCookiesUsage = \"disableCookiesUsage\";\nvar strConfigCookieMgr = \"_ckMgr\";\nvar _supportsCookies = null;\nvar _allowUaSameSite = null;\nvar _parsedCookieValue = null;\nvar _doc;\nvar _cookieCache = {};\nvar _globalCookieConfig = {};\nvar rootDefaultConfig = (_a$8 = {\n        cookieCfg: cfgDfMerge((_b$2 = {},\n            _b$2[STR_DOMAIN] = { fb: \"cookieDomain\", dfVal: isNotNullOrUndefined },\n            _b$2.path = { fb: \"cookiePath\", dfVal: isNotNullOrUndefined },\n            _b$2.enabled = UNDEFINED_VALUE$2,\n            _b$2.ignoreCookies = UNDEFINED_VALUE$2,\n            _b$2.blockedCookies = UNDEFINED_VALUE$2,\n            _b$2)),\n        cookieDomain: UNDEFINED_VALUE$2,\n        cookiePath: UNDEFINED_VALUE$2\n    },\n    _a$8[strDisableCookiesUsage] = UNDEFINED_VALUE$2,\n    _a$8);\nfunction _getDoc() {\n    !_doc && (_doc = getLazy(function () { return getDocument(); }));\n}\nfunction _gblCookieMgr(config, logger) {\n    var inst = createCookieMgr[strConfigCookieMgr] || _globalCookieConfig[strConfigCookieMgr];\n    if (!inst) {\n        inst = createCookieMgr[strConfigCookieMgr] = createCookieMgr(config, logger);\n        _globalCookieConfig[strConfigCookieMgr] = inst;\n    }\n    return inst;\n}\nfunction _isMgrEnabled(cookieMgr) {\n    if (cookieMgr) {\n        return cookieMgr.isEnabled();\n    }\n    return true;\n}\nfunction _isIgnoredCookie(cookieMgrCfg, name) {\n    if (name && cookieMgrCfg && isArray(cookieMgrCfg.ignoreCookies)) {\n        return arrIndexOf(cookieMgrCfg.ignoreCookies, name) !== -1;\n    }\n    return false;\n}\nfunction _isBlockedCookie(cookieMgrCfg, name) {\n    if (name && cookieMgrCfg && isArray(cookieMgrCfg.blockedCookies)) {\n        if (arrIndexOf(cookieMgrCfg.blockedCookies, name) !== -1) {\n            return true;\n        }\n    }\n    return _isIgnoredCookie(cookieMgrCfg, name);\n}\nfunction _isCfgEnabled(rootConfig, cookieMgrConfig) {\n    var isCfgEnabled = cookieMgrConfig[_DYN_ENABLED ];\n    if (isNullOrUndefined(isCfgEnabled)) {\n        var cookieEnabled = void 0;\n        if (!isUndefined(rootConfig[strIsCookieUseDisabled])) {\n            cookieEnabled = !rootConfig[strIsCookieUseDisabled];\n        }\n        if (!isUndefined(rootConfig[strDisableCookiesUsage])) {\n            cookieEnabled = !rootConfig[strDisableCookiesUsage];\n        }\n        isCfgEnabled = cookieEnabled;\n    }\n    return isCfgEnabled;\n}\nfunction safeGetCookieMgr(core, config) {\n    var cookieMgr;\n    if (core) {\n        cookieMgr = core.getCookieMgr();\n    }\n    else if (config) {\n        var cookieCfg = config.cookieCfg;\n        if (cookieCfg && cookieCfg[strConfigCookieMgr]) {\n            cookieMgr = cookieCfg[strConfigCookieMgr];\n        }\n        else {\n            cookieMgr = createCookieMgr(config);\n        }\n    }\n    if (!cookieMgr) {\n        cookieMgr = _gblCookieMgr(config, (core || {})[_DYN_LOGGER ]);\n    }\n    return cookieMgr;\n}\nfunction createCookieMgr(rootConfig, logger) {\n    var _a;\n    var cookieMgrConfig;\n    var _path;\n    var _domain;\n    var unloadHandler;\n    var _enabled;\n    var _getCookieFn;\n    var _setCookieFn;\n    var _delCookieFn;\n    rootConfig = createDynamicConfig(rootConfig || _globalCookieConfig, null, logger).cfg;\n    unloadHandler = onConfigChange(rootConfig, function (details) {\n        details[_DYN_SET_DF ](details.cfg, rootDefaultConfig);\n        cookieMgrConfig = details.ref(details.cfg, \"cookieCfg\");\n        _path = cookieMgrConfig[STR_PATH ] || \"/\";\n        _domain = cookieMgrConfig[STR_DOMAIN ];\n        _enabled = _isCfgEnabled(rootConfig, cookieMgrConfig) !== false;\n        _getCookieFn = cookieMgrConfig.getCookie || _getCookieValue;\n        _setCookieFn = cookieMgrConfig.setCookie || _setCookieValue;\n        _delCookieFn = cookieMgrConfig.delCookie || _setCookieValue;\n    }, logger);\n    var cookieMgr = (_a = {\n            isEnabled: function () {\n                var enabled = _isCfgEnabled(rootConfig, cookieMgrConfig) !== false && _enabled && areCookiesSupported(logger);\n                var gblManager = _globalCookieConfig[strConfigCookieMgr];\n                if (enabled && gblManager && cookieMgr !== gblManager) {\n                    enabled = _isMgrEnabled(gblManager);\n                }\n                return enabled;\n            },\n            setEnabled: function (value) {\n                _enabled = value !== false;\n                cookieMgrConfig[_DYN_ENABLED ] = value;\n            },\n            set: function (name, value, maxAgeSec, domain, path) {\n                var result = false;\n                if (_isMgrEnabled(cookieMgr) && !_isBlockedCookie(cookieMgrConfig, name)) {\n                    var values = {};\n                    var theValue = strTrim(value || STR_EMPTY);\n                    var idx = strIndexOf(theValue, \";\");\n                    if (idx !== -1) {\n                        theValue = strTrim(strLeft(value, idx));\n                        values = _extractParts(strSubstring(value, idx + 1));\n                    }\n                    setValue(values, STR_DOMAIN, domain || _domain, isTruthy, isUndefined);\n                    if (!isNullOrUndefined(maxAgeSec)) {\n                        var _isIE = isIE();\n                        if (isUndefined(values[strExpires])) {\n                            var nowMs = utcNow();\n                            var expireMs = nowMs + (maxAgeSec * 1000);\n                            if (expireMs > 0) {\n                                var expiry = new Date();\n                                expiry.setTime(expireMs);\n                                setValue(values, strExpires, _formatDate(expiry, !_isIE ? strToUTCString : strToGMTString) || _formatDate(expiry, _isIE ? strToGMTString : strToUTCString) || STR_EMPTY, isTruthy);\n                            }\n                        }\n                        if (!_isIE) {\n                            setValue(values, \"max-age\", STR_EMPTY + maxAgeSec, null, isUndefined);\n                        }\n                    }\n                    var location_1 = getLocation();\n                    if (location_1 && location_1.protocol === \"https:\") {\n                        setValue(values, \"secure\", null, null, isUndefined);\n                        if (_allowUaSameSite === null) {\n                            _allowUaSameSite = !uaDisallowsSameSiteNone((getNavigator() || {})[_DYN_USER_AGENT ]);\n                        }\n                        if (_allowUaSameSite) {\n                            setValue(values, \"SameSite\", \"None\", null, isUndefined);\n                        }\n                    }\n                    setValue(values, STR_PATH, path || _path, null, isUndefined);\n                    _setCookieFn(name, _formatCookieValue(theValue, values));\n                    result = true;\n                }\n                return result;\n            },\n            get: function (name) {\n                var value = STR_EMPTY;\n                if (_isMgrEnabled(cookieMgr) && !_isIgnoredCookie(cookieMgrConfig, name)) {\n                    value = _getCookieFn(name);\n                }\n                return value;\n            },\n            del: function (name, path) {\n                var result = false;\n                if (_isMgrEnabled(cookieMgr)) {\n                    result = cookieMgr.purge(name, path);\n                }\n                return result;\n            },\n            purge: function (name, path) {\n                var _a;\n                var result = false;\n                if (areCookiesSupported(logger)) {\n                    var values = (_a = {},\n                        _a[STR_PATH] = path ? path : \"/\",\n                        _a[strExpires] = \"Thu, 01 Jan 1970 00:00:01 GMT\",\n                        _a);\n                    if (!isIE()) {\n                        values[\"max-age\"] = \"0\";\n                    }\n                    _delCookieFn(name, _formatCookieValue(STR_EMPTY, values));\n                    result = true;\n                }\n                return result;\n            }\n        },\n        _a[_DYN_UNLOAD ] = function (isAsync) {\n            unloadHandler && unloadHandler.rm();\n            unloadHandler = null;\n        },\n        _a);\n    cookieMgr[strConfigCookieMgr] = cookieMgr;\n    return cookieMgr;\n}\nfunction areCookiesSupported(logger) {\n    if (_supportsCookies === null) {\n        _supportsCookies = false;\n        !_doc && _getDoc();\n        try {\n            var doc = _doc.v || {};\n            _supportsCookies = doc[strCookie] !== undefined;\n        }\n        catch (e) {\n            _throwInternal(logger, 2 , 68 , \"Cannot access document.cookie - \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return _supportsCookies;\n}\nfunction _extractParts(theValue) {\n    var values = {};\n    if (theValue && theValue[_DYN_LENGTH$5 ]) {\n        var parts = strTrim(theValue)[_DYN_SPLIT$1 ](\";\");\n        arrForEach(parts, function (thePart) {\n            thePart = strTrim(thePart || STR_EMPTY);\n            if (thePart) {\n                var idx = strIndexOf(thePart, \"=\");\n                if (idx === -1) {\n                    values[thePart] = null;\n                }\n                else {\n                    values[strTrim(strLeft(thePart, idx))] = strTrim(strSubstring(thePart, idx + 1));\n                }\n            }\n        });\n    }\n    return values;\n}\nfunction _formatDate(theDate, func) {\n    if (isFunction(theDate[func])) {\n        return theDate[func]();\n    }\n    return null;\n}\nfunction _formatCookieValue(value, values) {\n    var cookieValue = value || STR_EMPTY;\n    objForEachKey(values, function (name, theValue) {\n        cookieValue += \"; \" + name + (!isNullOrUndefined(theValue) ? \"=\" + theValue : STR_EMPTY);\n    });\n    return cookieValue;\n}\nfunction _getCookieValue(name) {\n    var cookieValue = STR_EMPTY;\n    !_doc && _getDoc();\n    if (_doc.v) {\n        var theCookie = _doc.v[strCookie] || STR_EMPTY;\n        if (_parsedCookieValue !== theCookie) {\n            _cookieCache = _extractParts(theCookie);\n            _parsedCookieValue = theCookie;\n        }\n        cookieValue = strTrim(_cookieCache[name] || STR_EMPTY);\n    }\n    return cookieValue;\n}\nfunction _setCookieValue(name, cookieValue) {\n    !_doc && _getDoc();\n    if (_doc.v) {\n        _doc.v[strCookie] = name + \"=\" + cookieValue;\n    }\n}\nfunction uaDisallowsSameSiteNone(userAgent) {\n    if (!isString(userAgent)) {\n        return false;\n    }\n    if (strContains(userAgent, \"CPU iPhone OS 12\") || strContains(userAgent, \"iPad; CPU OS 12\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strContains(userAgent, \"Version/\") && strContains(userAgent, \"Safari\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strEndsWith(userAgent, \"AppleWebKit/605.1.15 (KHTML, like Gecko)\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"Chrome/5\") || strContains(userAgent, \"Chrome/6\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"UnrealEngine\") && !strContains(userAgent, \"Chrome\")) {\n        return true;\n    }\n    if (strContains(userAgent, \"UCBrowser/12\") || strContains(userAgent, \"UCBrowser/11\")) {\n        return true;\n    }\n    return false;\n}\n\nvar defaultValues$2 = {\n    perfEvtsSendAll: false\n};\nfunction _runListeners(listeners, name, isAsync, callback) {\n    arrForEach(listeners, function (listener) {\n        if (listener && listener[name]) {\n            if (isAsync) {\n                scheduleTimeout(function () { return callback(listener); }, 0);\n            }\n            else {\n                try {\n                    callback(listener);\n                }\n                catch (e) {\n                }\n            }\n        }\n    });\n}\nvar NotificationManager = /** @class */ (function () {\n    function NotificationManager(config) {\n        this.listeners = [];\n        var perfEvtsSendAll;\n        var unloadHandler;\n        var _listeners = [];\n        var cfgHandler = createDynamicConfig(config, defaultValues$2);\n        unloadHandler = cfgHandler[_DYN_WATCH ](function (details) {\n            perfEvtsSendAll = !!details.cfg.perfEvtsSendAll;\n        });\n        dynamicProto(NotificationManager, this, function (_self) {\n            objDefine(_self, \"listeners\", {\n                g: function () { return _listeners; }\n            });\n            _self[_DYN_ADD_NOTIFICATION_LIS1 ] = function (listener) {\n                _listeners[_DYN_PUSH$2 ](listener);\n            };\n            _self[_DYN_REMOVE_NOTIFICATION_2 ] = function (listener) {\n                var index = arrIndexOf(_listeners, listener);\n                while (index > -1) {\n                    _listeners[_DYN_SPLICE ](index, 1);\n                    index = arrIndexOf(_listeners, listener);\n                }\n            };\n            _self[STR_EVENTS_SENT ] = function (events) {\n                _runListeners(_listeners, STR_EVENTS_SENT, true, function (listener) {\n                    listener[STR_EVENTS_SENT ](events);\n                });\n            };\n            _self[STR_EVENTS_DISCARDED ] = function (events, reason) {\n                _runListeners(_listeners, STR_EVENTS_DISCARDED, true, function (listener) {\n                    listener[STR_EVENTS_DISCARDED ](events, reason);\n                });\n            };\n            _self[STR_EVENTS_SEND_REQUEST ] = function (sendReason, isAsync) {\n                _runListeners(_listeners, STR_EVENTS_SEND_REQUEST, isAsync, function (listener) {\n                    listener[STR_EVENTS_SEND_REQUEST ](sendReason, isAsync);\n                });\n            };\n            _self[STR_PERF_EVENT ] = function (perfEvent) {\n                if (perfEvent) {\n                    if (perfEvtsSendAll || !perfEvent[_DYN_IS_CHILD_EVT ]()) {\n                        _runListeners(_listeners, STR_PERF_EVENT, false, function (listener) {\n                            if (perfEvent[_DYN_IS_ASYNC ]) {\n                                scheduleTimeout(function () { return listener[STR_PERF_EVENT ](perfEvent); }, 0);\n                            }\n                            else {\n                                listener[STR_PERF_EVENT ](perfEvent);\n                            }\n                        });\n                    }\n                }\n            };\n            _self[_DYN_UNLOAD ] = function (isAsync) {\n                var _finishUnload = function () {\n                    unloadHandler && unloadHandler.rm();\n                    unloadHandler = null;\n                    _listeners = [];\n                };\n                var waiting;\n                _runListeners(_listeners, \"unload\", false, function (listener) {\n                    var asyncUnload = listener[_DYN_UNLOAD ](isAsync);\n                    if (asyncUnload) {\n                        if (!waiting) {\n                            waiting = [];\n                        }\n                        waiting[_DYN_PUSH$2 ](asyncUnload);\n                    }\n                });\n                if (waiting) {\n                    return createPromise(function (resolve) {\n                        return doAwaitResponse(createAllPromise(waiting), function () {\n                            _finishUnload();\n                            resolve();\n                        });\n                    });\n                }\n                else {\n                    _finishUnload();\n                }\n            };\n        });\n    }\n    NotificationManager.__ieDyn=1;\n    return NotificationManager;\n}());\n\nvar strExecutionContextKey = \"ctx\";\nvar strParentContextKey = \"ParentContextKey\";\nvar strChildrenContextKey = \"ChildrenContextKey\";\nvar _defaultPerfManager = null;\nvar PerfEvent = /** @class */ (function () {\n    function PerfEvent(name, payloadDetails, isAsync) {\n        var _self = this;\n        _self.start = utcNow();\n        _self[_DYN_NAME$3 ] = name;\n        _self[_DYN_IS_ASYNC ] = isAsync;\n        _self[_DYN_IS_CHILD_EVT ] = function () { return false; };\n        if (isFunction(payloadDetails)) {\n            var theDetails_1;\n            objDefine(_self, \"payload\", {\n                g: function () {\n                    if (!theDetails_1 && isFunction(payloadDetails)) {\n                        theDetails_1 = payloadDetails();\n                        payloadDetails = null;\n                    }\n                    return theDetails_1;\n                }\n            });\n        }\n        _self[_DYN_GET_CTX ] = function (key) {\n            if (key) {\n                if (key === PerfEvent[strParentContextKey] || key === PerfEvent[strChildrenContextKey]) {\n                    return _self[key];\n                }\n                return (_self[strExecutionContextKey] || {})[key];\n            }\n            return null;\n        };\n        _self[_DYN_SET_CTX ] = function (key, value) {\n            if (key) {\n                if (key === PerfEvent[strParentContextKey]) {\n                    if (!_self[key]) {\n                        _self[_DYN_IS_CHILD_EVT ] = function () { return true; };\n                    }\n                    _self[key] = value;\n                }\n                else if (key === PerfEvent[strChildrenContextKey]) {\n                    _self[key] = value;\n                }\n                else {\n                    var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                    ctx[key] = value;\n                }\n            }\n        };\n        _self[_DYN_COMPLETE ] = function () {\n            var childTime = 0;\n            var childEvts = _self[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);\n            if (isArray(childEvts)) {\n                for (var lp = 0; lp < childEvts[_DYN_LENGTH$5 ]; lp++) {\n                    var childEvt = childEvts[lp];\n                    if (childEvt) {\n                        childTime += childEvt[_DYN_TIME ];\n                    }\n                }\n            }\n            _self[_DYN_TIME ] = utcNow() - _self.start;\n            _self.exTime = _self[_DYN_TIME ] - childTime;\n            _self[_DYN_COMPLETE ] = function () { };\n        };\n    }\n    PerfEvent.ParentContextKey = \"parent\";\n    PerfEvent.ChildrenContextKey = \"childEvts\";\n    return PerfEvent;\n}());\nvar PerfManager = /** @class */ (function () {\n    function PerfManager(manager) {\n        this.ctx = {};\n        dynamicProto(PerfManager, this, function (_self) {\n            _self.create = function (src, payloadDetails, isAsync) {\n                return new PerfEvent(src, payloadDetails, isAsync);\n            };\n            _self.fire = function (perfEvent) {\n                if (perfEvent) {\n                    perfEvent[_DYN_COMPLETE ]();\n                    if (manager && isFunction(manager[STR_PERF_EVENT ])) {\n                        manager[STR_PERF_EVENT ](perfEvent);\n                    }\n                }\n            };\n            _self[_DYN_SET_CTX ] = function (key, value) {\n                if (key) {\n                    var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                    ctx[key] = value;\n                }\n            };\n            _self[_DYN_GET_CTX ] = function (key) {\n                return (_self[strExecutionContextKey] || {})[key];\n            };\n        });\n    }\n    PerfManager.__ieDyn=1;\n    return PerfManager;\n}());\nvar doPerfActiveKey = \"CoreUtils.doPerf\";\nfunction doPerf(mgrSource, getSource, func, details, isAsync) {\n    if (mgrSource) {\n        var perfMgr = mgrSource;\n        if (perfMgr[STR_GET_PERF_MGR]) {\n            perfMgr = perfMgr[STR_GET_PERF_MGR]();\n        }\n        if (perfMgr) {\n            var perfEvt = void 0;\n            var currentActive = perfMgr[_DYN_GET_CTX ](doPerfActiveKey);\n            try {\n                perfEvt = perfMgr.create(getSource(), details, isAsync);\n                if (perfEvt) {\n                    if (currentActive && perfEvt[_DYN_SET_CTX ]) {\n                        perfEvt[_DYN_SET_CTX ](PerfEvent[strParentContextKey], currentActive);\n                        if (currentActive[_DYN_GET_CTX ] && currentActive[_DYN_SET_CTX ]) {\n                            var children = currentActive[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);\n                            if (!children) {\n                                children = [];\n                                currentActive[_DYN_SET_CTX ](PerfEvent[strChildrenContextKey], children);\n                            }\n                            children[_DYN_PUSH$2 ](perfEvt);\n                        }\n                    }\n                    perfMgr[_DYN_SET_CTX ](doPerfActiveKey, perfEvt);\n                    return func(perfEvt);\n                }\n            }\n            catch (ex) {\n                if (perfEvt && perfEvt[_DYN_SET_CTX ]) {\n                    perfEvt[_DYN_SET_CTX ](\"exception\", ex);\n                }\n            }\n            finally {\n                if (perfEvt) {\n                    perfMgr.fire(perfEvt);\n                }\n                perfMgr[_DYN_SET_CTX ](doPerfActiveKey, currentActive);\n            }\n        }\n    }\n    return func();\n}\nfunction getGblPerfMgr() {\n    return _defaultPerfManager;\n}\n\nfunction newGuid() {\n    var uuid = generateW3CId();\n    return strSubstring(uuid, 0, 8) + \"-\" + strSubstring(uuid, 8, 12) + \"-\" + strSubstring(uuid, 12, 16) + \"-\" + strSubstring(uuid, 16, 20) + \"-\" + strSubstring(uuid, 20);\n}\nfunction generateW3CId() {\n    var hexValues = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\n    var oct = STR_EMPTY, tmp;\n    for (var a = 0; a < 4; a++) {\n        tmp = random32();\n        oct +=\n            hexValues[tmp & 0xF] +\n                hexValues[tmp >> 4 & 0xF] +\n                hexValues[tmp >> 8 & 0xF] +\n                hexValues[tmp >> 12 & 0xF] +\n                hexValues[tmp >> 16 & 0xF] +\n                hexValues[tmp >> 20 & 0xF] +\n                hexValues[tmp >> 24 & 0xF] +\n                hexValues[tmp >> 28 & 0xF];\n    }\n    var clockSequenceHi = hexValues[8 + (random32() & 0x03) | 0];\n    return strSubstr(oct, 0, 8) + strSubstr(oct, 9, 4) + \"4\" + strSubstr(oct, 13, 3) + clockSequenceHi + strSubstr(oct, 16, 3) + strSubstr(oct, 19, 12);\n}\n\nvar TRACE_PARENT_REGEX = /^([\\da-f]{2})-([\\da-f]{32})-([\\da-f]{16})-([\\da-f]{2})(-[^\\s]{1,64})?$/i;\nvar DEFAULT_VERSION = \"00\";\nvar INVALID_VERSION = \"ff\";\nvar INVALID_TRACE_ID = \"00000000000000000000000000000000\";\nvar INVALID_SPAN_ID = \"0000000000000000\";\nfunction _isValid(value, len, invalidValue) {\n    if (value && value[_DYN_LENGTH$5 ] === len && value !== invalidValue) {\n        return !!value.match(/^[\\da-f]*$/i);\n    }\n    return false;\n}\nfunction _formatValue(value, len, defValue) {\n    if (_isValid(value, len)) {\n        return value;\n    }\n    return defValue;\n}\nfunction _formatFlags(value) {\n    if (isNaN(value) || value < 0 || value > 255) {\n        value = 0x01;\n    }\n    var result = value.toString(16);\n    while (result[_DYN_LENGTH$5 ] < 2) {\n        result = \"0\" + result;\n    }\n    return result;\n}\nfunction createTraceParent(traceId, spanId, flags, version) {\n    var _a;\n    return _a = {},\n        _a[_DYN_VERSION$1 ] = _isValid(version, 2, INVALID_VERSION) ? version : DEFAULT_VERSION,\n        _a[_DYN_TRACE_ID$2 ] = isValidTraceId(traceId) ? traceId : generateW3CId(),\n        _a[_DYN_SPAN_ID$1 ] = isValidSpanId(spanId) ? spanId : strLeft(generateW3CId(), 16),\n        _a.traceFlags = flags >= 0 && flags <= 0xFF ? flags : 1,\n        _a;\n}\nfunction parseTraceParent(value, selectIdx) {\n    var _a;\n    if (!value) {\n        return null;\n    }\n    if (isArray(value)) {\n        value = value[0] || \"\";\n    }\n    if (!value || !isString(value) || value[_DYN_LENGTH$5 ] > 8192) {\n        return null;\n    }\n    if (value.indexOf(\",\") !== -1) {\n        var values = value[_DYN_SPLIT$1 ](\",\");\n        value = values[selectIdx > 0 && values[_DYN_LENGTH$5 ] > selectIdx ? selectIdx : 0];\n    }\n    var match = TRACE_PARENT_REGEX.exec(strTrim(value));\n    if (!match ||\n        match[1] === INVALID_VERSION ||\n        match[2] === INVALID_TRACE_ID ||\n        match[3] === INVALID_SPAN_ID) {\n        return null;\n    }\n    return _a = {\n            version: (match[1] || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ](),\n            traceId: (match[2] || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ](),\n            spanId: (match[3] || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]()\n        },\n        _a[_DYN_TRACE_FLAGS$1 ] = parseInt(match[4], 16),\n        _a;\n}\nfunction isValidTraceId(value) {\n    return _isValid(value, 32, INVALID_TRACE_ID);\n}\nfunction isValidSpanId(value) {\n    return _isValid(value, 16, INVALID_SPAN_ID);\n}\nfunction formatTraceParent(value) {\n    if (value) {\n        var flags = _formatFlags(value[_DYN_TRACE_FLAGS$1 ]);\n        if (!_isValid(flags, 2)) {\n            flags = \"01\";\n        }\n        var version = value[_DYN_VERSION$1 ] || DEFAULT_VERSION;\n        if (version !== \"00\" && version !== \"ff\") {\n            version = DEFAULT_VERSION;\n        }\n        return \"\".concat(version.toLowerCase(), \"-\").concat(_formatValue(value.traceId, 32, INVALID_TRACE_ID).toLowerCase(), \"-\").concat(_formatValue(value.spanId, 16, INVALID_SPAN_ID).toLowerCase(), \"-\").concat(flags.toLowerCase());\n    }\n    return \"\";\n}\nfunction findW3cTraceParent(selectIdx) {\n    var name = \"traceparent\";\n    var traceParent = parseTraceParent(findMetaTag(name), selectIdx);\n    if (!traceParent) {\n        traceParent = parseTraceParent(findNamedServerTiming(name), selectIdx);\n    }\n    return traceParent;\n}\n\nvar pluginStateData = createElmNodeData(\"plugin\");\nfunction _getPluginState(plugin) {\n    return pluginStateData.get(plugin, \"state\", {}, true);\n}\nfunction initializePlugins(processContext, extensions) {\n    var initPlugins = [];\n    var lastPlugin = null;\n    var proxy = processContext[_DYN_GET_NEXT ]();\n    var pluginState;\n    while (proxy) {\n        var thePlugin = proxy[_DYN_GET_PLUGIN ]();\n        if (thePlugin) {\n            if (lastPlugin && lastPlugin[_DYN_SET_NEXT_PLUGIN ] && thePlugin[STR_PROCESS_TELEMETRY ]) {\n                lastPlugin[_DYN_SET_NEXT_PLUGIN ](thePlugin);\n            }\n            pluginState = _getPluginState(thePlugin);\n            var isInitialized = !!pluginState[_DYN_IS_INITIALIZED ];\n            if (thePlugin[_DYN_IS_INITIALIZED ]) {\n                isInitialized = thePlugin[_DYN_IS_INITIALIZED ]();\n            }\n            if (!isInitialized) {\n                initPlugins[_DYN_PUSH$2 ](thePlugin);\n            }\n            lastPlugin = thePlugin;\n            proxy = proxy[_DYN_GET_NEXT ]();\n        }\n    }\n    arrForEach(initPlugins, function (thePlugin) {\n        var core = processContext[STR_CORE ]();\n        thePlugin[_DYN_INITIALIZE ](processContext.getCfg(), core, extensions, processContext[_DYN_GET_NEXT ]());\n        pluginState = _getPluginState(thePlugin);\n        if (!thePlugin[STR_CORE] && !pluginState[STR_CORE]) {\n            pluginState[STR_CORE] = core;\n        }\n        pluginState[_DYN_IS_INITIALIZED ] = true;\n        delete pluginState[_DYN_TEARDOWN ];\n    });\n}\nfunction sortPlugins(plugins) {\n    return plugins.sort(function (extA, extB) {\n        var result = 0;\n        if (extB) {\n            var bHasProcess = extB[STR_PROCESS_TELEMETRY];\n            if (extA[STR_PROCESS_TELEMETRY]) {\n                result = bHasProcess ? extA[STR_PRIORITY] - extB[STR_PRIORITY] : 1;\n            }\n            else if (bHasProcess) {\n                result = -1;\n            }\n        }\n        else {\n            result = extA ? 1 : -1;\n        }\n        return result;\n    });\n}\nfunction createDistributedTraceContext(parentCtx) {\n    var trace = {};\n    return {\n        getName: function () {\n            return trace[_DYN_NAME$3 ];\n        },\n        setName: function (newValue) {\n            parentCtx && parentCtx.setName(newValue);\n            trace[_DYN_NAME$3 ] = newValue;\n        },\n        getTraceId: function () {\n            return trace[_DYN_TRACE_ID$2 ];\n        },\n        setTraceId: function (newValue) {\n            parentCtx && parentCtx.setTraceId(newValue);\n            if (isValidTraceId(newValue)) {\n                trace[_DYN_TRACE_ID$2 ] = newValue;\n            }\n        },\n        getSpanId: function () {\n            return trace[_DYN_SPAN_ID$1 ];\n        },\n        setSpanId: function (newValue) {\n            parentCtx && parentCtx.setSpanId(newValue);\n            if (isValidSpanId(newValue)) {\n                trace[_DYN_SPAN_ID$1 ] = newValue;\n            }\n        },\n        getTraceFlags: function () {\n            return trace[_DYN_TRACE_FLAGS$1 ];\n        },\n        setTraceFlags: function (newTraceFlags) {\n            parentCtx && parentCtx.setTraceFlags(newTraceFlags);\n            trace[_DYN_TRACE_FLAGS$1 ] = newTraceFlags;\n        }\n    };\n}\n\nvar strTelemetryPluginChain = \"TelemetryPluginChain\";\nvar strHasRunFlags = \"_hasRun\";\nvar strGetTelCtx = \"_getTelCtx\";\nvar _chainId = 0;\nfunction _getNextProxyStart(proxy, core, startAt) {\n    while (proxy) {\n        if (proxy[_DYN_GET_PLUGIN ]() === startAt) {\n            return proxy;\n        }\n        proxy = proxy[_DYN_GET_NEXT ]();\n    }\n    return createTelemetryProxyChain([startAt], core.config || {}, core);\n}\nfunction _createInternalContext(telemetryChain, dynamicHandler, core, startAt) {\n    var _nextProxy = null;\n    var _onComplete = [];\n    if (!dynamicHandler) {\n        dynamicHandler = createDynamicConfig({}, null, core[_DYN_LOGGER ]);\n    }\n    if (startAt !== null) {\n        _nextProxy = startAt ? _getNextProxyStart(telemetryChain, core, startAt) : telemetryChain;\n    }\n    var context = {\n        _next: _moveNext,\n        ctx: {\n            core: function () {\n                return core;\n            },\n            diagLog: function () {\n                return safeGetLogger(core, dynamicHandler.cfg);\n            },\n            getCfg: function () {\n                return dynamicHandler.cfg;\n            },\n            getExtCfg: _resolveExtCfg,\n            getConfig: _getConfig,\n            hasNext: function () {\n                return !!_nextProxy;\n            },\n            getNext: function () {\n                return _nextProxy;\n            },\n            setNext: function (nextPlugin) {\n                _nextProxy = nextPlugin;\n            },\n            iterate: _iterateChain,\n            onComplete: _addOnComplete\n        }\n    };\n    function _addOnComplete(onComplete, that) {\n        var args = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            args[_i - 2] = arguments[_i];\n        }\n        if (onComplete) {\n            _onComplete[_DYN_PUSH$2 ]({\n                func: onComplete,\n                self: !isUndefined(that) ? that : context.ctx,\n                args: args\n            });\n        }\n    }\n    function _moveNext() {\n        var nextProxy = _nextProxy;\n        _nextProxy = nextProxy ? nextProxy[_DYN_GET_NEXT ]() : null;\n        if (!nextProxy) {\n            var onComplete = _onComplete;\n            if (onComplete && onComplete[_DYN_LENGTH$5 ] > 0) {\n                arrForEach(onComplete, function (completeDetails) {\n                    try {\n                        completeDetails.func.call(completeDetails.self, completeDetails.args);\n                    }\n                    catch (e) {\n                        _throwInternal(core[_DYN_LOGGER ], 2 , 73 , \"Unexpected Exception during onComplete - \" + dumpObj(e));\n                    }\n                });\n                _onComplete = [];\n            }\n        }\n        return nextProxy;\n    }\n    function _getExtCfg(identifier, createIfMissing) {\n        var idCfg = null;\n        var cfg = dynamicHandler.cfg;\n        if (cfg && identifier) {\n            var extCfg = cfg[STR_EXTENSION_CONFIG ];\n            if (!extCfg && createIfMissing) {\n                extCfg = {};\n            }\n            cfg[STR_EXTENSION_CONFIG] = extCfg;\n            extCfg = dynamicHandler.ref(cfg, STR_EXTENSION_CONFIG);\n            if (extCfg) {\n                idCfg = extCfg[identifier];\n                if (!idCfg && createIfMissing) {\n                    idCfg = {};\n                }\n                extCfg[identifier] = idCfg;\n                idCfg = dynamicHandler.ref(extCfg, identifier);\n            }\n        }\n        return idCfg;\n    }\n    function _resolveExtCfg(identifier, defaultValues) {\n        var newConfig = _getExtCfg(identifier, true);\n        if (defaultValues) {\n            objForEachKey(defaultValues, function (field, defaultValue) {\n                if (isNullOrUndefined(newConfig[field])) {\n                    var cfgValue = dynamicHandler.cfg[field];\n                    if (cfgValue || !isNullOrUndefined(cfgValue)) {\n                        newConfig[field] = cfgValue;\n                    }\n                }\n                _applyDefaultValue(dynamicHandler, newConfig, field, defaultValue);\n            });\n        }\n        return dynamicHandler[_DYN_SET_DF ](newConfig, defaultValues);\n    }\n    function _getConfig(identifier, field, defaultValue) {\n        if (defaultValue === void 0) { defaultValue = false; }\n        var theValue;\n        var extConfig = _getExtCfg(identifier, false);\n        var rootConfig = dynamicHandler.cfg;\n        if (extConfig && (extConfig[field] || !isNullOrUndefined(extConfig[field]))) {\n            theValue = extConfig[field];\n        }\n        else if (rootConfig[field] || !isNullOrUndefined(rootConfig[field])) {\n            theValue = rootConfig[field];\n        }\n        return (theValue || !isNullOrUndefined(theValue)) ? theValue : defaultValue;\n    }\n    function _iterateChain(cb) {\n        var nextPlugin;\n        while (!!(nextPlugin = context._next())) {\n            var plugin = nextPlugin[_DYN_GET_PLUGIN ]();\n            if (plugin) {\n                cb(plugin);\n            }\n        }\n    }\n    return context;\n}\nfunction createProcessTelemetryContext(telemetryChain, cfg, core, startAt) {\n    var config = createDynamicConfig(cfg);\n    var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n    var context = internalContext.ctx;\n    function _processNext(env) {\n        var nextPlugin = internalContext._next();\n        if (nextPlugin) {\n            nextPlugin[STR_PROCESS_TELEMETRY ](env, context);\n        }\n        return !nextPlugin;\n    }\n    function _createNew(plugins, startAt) {\n        if (plugins === void 0) { plugins = null; }\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n        }\n        return createProcessTelemetryContext(plugins || context[_DYN_GET_NEXT ](), config.cfg, core, startAt);\n    }\n    context[_DYN_PROCESS_NEXT ] = _processNext;\n    context[_DYN_CREATE_NEW$1 ] = _createNew;\n    return context;\n}\nfunction createProcessTelemetryUnloadContext(telemetryChain, core, startAt) {\n    var config = createDynamicConfig(core.config);\n    var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n    var context = internalContext.ctx;\n    function _processNext(unloadState) {\n        var nextPlugin = internalContext._next();\n        nextPlugin && nextPlugin[_DYN_UNLOAD ](context, unloadState);\n        return !nextPlugin;\n    }\n    function _createNew(plugins, startAt) {\n        if (plugins === void 0) { plugins = null; }\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n        }\n        return createProcessTelemetryUnloadContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);\n    }\n    context[_DYN_PROCESS_NEXT ] = _processNext;\n    context[_DYN_CREATE_NEW$1 ] = _createNew;\n    return context;\n}\nfunction createProcessTelemetryUpdateContext(telemetryChain, core, startAt) {\n    var config = createDynamicConfig(core.config);\n    var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n    var context = internalContext.ctx;\n    function _processNext(updateState) {\n        return context.iterate(function (plugin) {\n            if (isFunction(plugin[_DYN_UPDATE$1 ])) {\n                plugin[_DYN_UPDATE$1 ](context, updateState);\n            }\n        });\n    }\n    function _createNew(plugins, startAt) {\n        if (plugins === void 0) { plugins = null; }\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n        }\n        return createProcessTelemetryUpdateContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);\n    }\n    context[_DYN_PROCESS_NEXT ] = _processNext;\n    context[_DYN_CREATE_NEW$1 ] = _createNew;\n    return context;\n}\nfunction createTelemetryProxyChain(plugins, config, core, startAt) {\n    var firstProxy = null;\n    var add = startAt ? false : true;\n    if (isArray(plugins) && plugins[_DYN_LENGTH$5 ] > 0) {\n        var lastProxy_1 = null;\n        arrForEach(plugins, function (thePlugin) {\n            if (!add && startAt === thePlugin) {\n                add = true;\n            }\n            if (add && thePlugin && isFunction(thePlugin[STR_PROCESS_TELEMETRY ])) {\n                var newProxy = createTelemetryPluginProxy(thePlugin, config, core);\n                if (!firstProxy) {\n                    firstProxy = newProxy;\n                }\n                if (lastProxy_1) {\n                    lastProxy_1._setNext(newProxy);\n                }\n                lastProxy_1 = newProxy;\n            }\n        });\n    }\n    if (startAt && !firstProxy) {\n        return createTelemetryProxyChain([startAt], config, core);\n    }\n    return firstProxy;\n}\nfunction createTelemetryPluginProxy(plugin, config, core) {\n    var nextProxy = null;\n    var hasProcessTelemetry = isFunction(plugin[STR_PROCESS_TELEMETRY ]);\n    var hasSetNext = isFunction(plugin[_DYN_SET_NEXT_PLUGIN ]);\n    var chainId;\n    if (plugin) {\n        chainId = plugin[_DYN_IDENTIFIER ] + \"-\" + plugin[STR_PRIORITY ] + \"-\" + _chainId++;\n    }\n    else {\n        chainId = \"Unknown-0-\" + _chainId++;\n    }\n    var proxyChain = {\n        getPlugin: function () {\n            return plugin;\n        },\n        getNext: function () {\n            return nextProxy;\n        },\n        processTelemetry: _processTelemetry,\n        unload: _unloadPlugin,\n        update: _updatePlugin,\n        _id: chainId,\n        _setNext: function (nextPlugin) {\n            nextProxy = nextPlugin;\n        }\n    };\n    function _getTelCtx() {\n        var itemCtx;\n        if (plugin && isFunction(plugin[strGetTelCtx])) {\n            itemCtx = plugin[strGetTelCtx]();\n        }\n        if (!itemCtx) {\n            itemCtx = createProcessTelemetryContext(proxyChain, config, core);\n        }\n        return itemCtx;\n    }\n    function _processChain(itemCtx, processPluginFn, name, details, isAsync) {\n        var hasRun = false;\n        var identifier = plugin ? plugin[_DYN_IDENTIFIER ] : strTelemetryPluginChain;\n        var hasRunContext = itemCtx[strHasRunFlags];\n        if (!hasRunContext) {\n            hasRunContext = itemCtx[strHasRunFlags] = {};\n        }\n        itemCtx.setNext(nextProxy);\n        if (plugin) {\n            doPerf(itemCtx[STR_CORE ](), function () { return identifier + \":\" + name; }, function () {\n                hasRunContext[chainId] = true;\n                try {\n                    var nextId = nextProxy ? nextProxy._id : STR_EMPTY;\n                    if (nextId) {\n                        hasRunContext[nextId] = false;\n                    }\n                    hasRun = processPluginFn(itemCtx);\n                }\n                catch (error) {\n                    var hasNextRun = nextProxy ? hasRunContext[nextProxy._id] : true;\n                    if (hasNextRun) {\n                        hasRun = true;\n                    }\n                    if (!nextProxy || !hasNextRun) {\n                        _throwInternal(itemCtx[_DYN_DIAG_LOG$2 ](), 1 , 73 , \"Plugin [\" + identifier + \"] failed during \" + name + \" - \" + dumpObj(error) + \", run flags: \" + dumpObj(hasRunContext));\n                    }\n                }\n            }, details, isAsync);\n        }\n        return hasRun;\n    }\n    function _processTelemetry(env, itemCtx) {\n        itemCtx = itemCtx || _getTelCtx();\n        function _callProcessTelemetry(itemCtx) {\n            if (!plugin || !hasProcessTelemetry) {\n                return false;\n            }\n            var pluginState = _getPluginState(plugin);\n            if (pluginState[_DYN_TEARDOWN ] || pluginState[STR_DISABLED]) {\n                return false;\n            }\n            if (hasSetNext) {\n                plugin[_DYN_SET_NEXT_PLUGIN ](nextProxy);\n            }\n            plugin[STR_PROCESS_TELEMETRY ](env, itemCtx);\n            return true;\n        }\n        if (!_processChain(itemCtx, _callProcessTelemetry, \"processTelemetry\", function () { return ({ item: env }); }, !(env.sync))) {\n            itemCtx[_DYN_PROCESS_NEXT ](env);\n        }\n    }\n    function _unloadPlugin(unloadCtx, unloadState) {\n        function _callTeardown() {\n            var hasRun = false;\n            if (plugin) {\n                var pluginState = _getPluginState(plugin);\n                var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];\n                if (plugin && (!pluginCore || pluginCore === unloadCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {\n                    pluginState[STR_CORE ] = null;\n                    pluginState[_DYN_TEARDOWN ] = true;\n                    pluginState[_DYN_IS_INITIALIZED ] = false;\n                    if (plugin[_DYN_TEARDOWN ] && plugin[_DYN_TEARDOWN ](unloadCtx, unloadState) === true) {\n                        hasRun = true;\n                    }\n                }\n            }\n            return hasRun;\n        }\n        if (!_processChain(unloadCtx, _callTeardown, \"unload\", function () { }, unloadState[_DYN_IS_ASYNC ])) {\n            unloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n        }\n    }\n    function _updatePlugin(updateCtx, updateState) {\n        function _callUpdate() {\n            var hasRun = false;\n            if (plugin) {\n                var pluginState = _getPluginState(plugin);\n                var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];\n                if (plugin && (!pluginCore || pluginCore === updateCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {\n                    if (plugin[_DYN_UPDATE$1 ] && plugin[_DYN_UPDATE$1 ](updateCtx, updateState) === true) {\n                        hasRun = true;\n                    }\n                }\n            }\n            return hasRun;\n        }\n        if (!_processChain(updateCtx, _callUpdate, \"update\", function () { }, false)) {\n            updateCtx[_DYN_PROCESS_NEXT ](updateState);\n        }\n    }\n    return objFreeze(proxyChain);\n}\n\nfunction createUnloadHandlerContainer() {\n    var handlers = [];\n    function _addHandler(handler) {\n        if (handler) {\n            handlers[_DYN_PUSH$2 ](handler);\n        }\n    }\n    function _runHandlers(unloadCtx, unloadState) {\n        arrForEach(handlers, function (handler) {\n            try {\n                handler(unloadCtx, unloadState);\n            }\n            catch (e) {\n                _throwInternal(unloadCtx[_DYN_DIAG_LOG$2 ](), 2 , 73 , \"Unexpected error calling unload handler - \" + dumpObj(e));\n            }\n        });\n        handlers = [];\n    }\n    return {\n        add: _addHandler,\n        run: _runHandlers\n    };\n}\n\nfunction createUnloadHookContainer() {\n    var _hooks = [];\n    function _doUnload(logger) {\n        var oldHooks = _hooks;\n        _hooks = [];\n        arrForEach(oldHooks, function (fn) {\n            try {\n                (fn.rm || fn.remove).call(fn);\n            }\n            catch (e) {\n                _throwInternal(logger, 2 , 73 , \"Unloading:\" + dumpObj(e));\n            }\n        });\n    }\n    function _addHook(hooks) {\n        if (hooks) {\n            arrAppend(_hooks, hooks);\n        }\n    }\n    return {\n        run: _doUnload,\n        add: _addHook\n    };\n}\n\nvar _a$7;\nvar strGetPlugin = \"getPlugin\";\nvar defaultValues$1 = (_a$7 = {},\n    _a$7[STR_EXTENSION_CONFIG] = { isVal: isNotNullOrUndefined, v: {} },\n    _a$7);\nvar BaseTelemetryPlugin = /** @class */ (function () {\n    function BaseTelemetryPlugin() {\n        var _self = this;\n        var _isinitialized;\n        var _rootCtx;\n        var _nextPlugin;\n        var _unloadHandlerContainer;\n        var _hookContainer;\n        _initDefaults();\n        dynamicProto(BaseTelemetryPlugin, _self, function (_self) {\n            _self[_DYN_INITIALIZE ] = function (config, core, extensions, pluginChain) {\n                _setDefaults(config, core, pluginChain);\n                _isinitialized = true;\n            };\n            _self[_DYN_TEARDOWN ] = function (unloadCtx, unloadState) {\n                var _a;\n                var core = _self[STR_CORE ];\n                if (!core || (unloadCtx && core !== unloadCtx[STR_CORE ]())) {\n                    return;\n                }\n                var result;\n                var unloadDone = false;\n                var theUnloadCtx = unloadCtx || createProcessTelemetryUnloadContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                var theUnloadState = unloadState || (_a = {\n                        reason: 0\n                    },\n                    _a[_DYN_IS_ASYNC ] = false,\n                    _a);\n                function _unloadCallback() {\n                    if (!unloadDone) {\n                        unloadDone = true;\n                        _unloadHandlerContainer.run(theUnloadCtx, unloadState);\n                        _hookContainer.run(theUnloadCtx[_DYN_DIAG_LOG$2 ]());\n                        if (result === true) {\n                            theUnloadCtx[_DYN_PROCESS_NEXT ](theUnloadState);\n                        }\n                        _initDefaults();\n                    }\n                }\n                if (!_self[_DYN__DO_TEARDOWN ] || _self[_DYN__DO_TEARDOWN ](theUnloadCtx, theUnloadState, _unloadCallback) !== true) {\n                    _unloadCallback();\n                }\n                else {\n                    result = true;\n                }\n                return result;\n            };\n            _self[_DYN_UPDATE$1 ] = function (updateCtx, updateState) {\n                var core = _self[STR_CORE ];\n                if (!core || (updateCtx && core !== updateCtx[STR_CORE ]())) {\n                    return;\n                }\n                var result;\n                var updateDone = false;\n                var theUpdateCtx = updateCtx || createProcessTelemetryUpdateContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                var theUpdateState = updateState || {\n                    reason: 0\n                };\n                function _updateCallback() {\n                    if (!updateDone) {\n                        updateDone = true;\n                        _setDefaults(theUpdateCtx.getCfg(), theUpdateCtx.core(), theUpdateCtx[_DYN_GET_NEXT ]());\n                    }\n                }\n                if (!_self._doUpdate || _self._doUpdate(theUpdateCtx, theUpdateState, _updateCallback) !== true) {\n                    _updateCallback();\n                }\n                else {\n                    result = true;\n                }\n                return result;\n            };\n            proxyFunctionAs(_self, \"_addUnloadCb\", function () { return _unloadHandlerContainer; }, \"add\");\n            proxyFunctionAs(_self, \"_addHook\", function () { return _hookContainer; }, \"add\");\n            objDefine(_self, \"_unloadHooks\", { g: function () { return _hookContainer; } });\n        });\n        _self[_DYN_DIAG_LOG$2 ] = function (itemCtx) {\n            return _getTelCtx(itemCtx)[_DYN_DIAG_LOG$2 ]();\n        };\n        _self[_DYN_IS_INITIALIZED ] = function () {\n            return _isinitialized;\n        };\n        _self.setInitialized = function (isInitialized) {\n            _isinitialized = isInitialized;\n        };\n        _self[_DYN_SET_NEXT_PLUGIN ] = function (next) {\n            _nextPlugin = next;\n        };\n        _self[_DYN_PROCESS_NEXT ] = function (env, itemCtx) {\n            if (itemCtx) {\n                itemCtx[_DYN_PROCESS_NEXT ](env);\n            }\n            else if (_nextPlugin && isFunction(_nextPlugin[STR_PROCESS_TELEMETRY ])) {\n                _nextPlugin[STR_PROCESS_TELEMETRY ](env, null);\n            }\n        };\n        _self._getTelCtx = _getTelCtx;\n        function _getTelCtx(currentCtx) {\n            if (currentCtx === void 0) { currentCtx = null; }\n            var itemCtx = currentCtx;\n            if (!itemCtx) {\n                var rootCtx = _rootCtx || createProcessTelemetryContext(null, {}, _self[STR_CORE ]);\n                if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                    itemCtx = rootCtx[_DYN_CREATE_NEW$1 ](null, _nextPlugin[strGetPlugin]);\n                }\n                else {\n                    itemCtx = rootCtx[_DYN_CREATE_NEW$1 ](null, _nextPlugin);\n                }\n            }\n            return itemCtx;\n        }\n        function _setDefaults(config, core, pluginChain) {\n            createDynamicConfig(config, defaultValues$1, safeGetLogger(core));\n            if (!pluginChain && core) {\n                pluginChain = core[_DYN_GET_PROCESS_TEL_CONT0 ]()[_DYN_GET_NEXT ]();\n            }\n            var nextPlugin = _nextPlugin;\n            if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                nextPlugin = _nextPlugin[strGetPlugin]();\n            }\n            _self[STR_CORE ] = core;\n            _rootCtx = createProcessTelemetryContext(pluginChain, config, core, nextPlugin);\n        }\n        function _initDefaults() {\n            _isinitialized = false;\n            _self[STR_CORE ] = null;\n            _rootCtx = null;\n            _nextPlugin = null;\n            _hookContainer = createUnloadHookContainer();\n            _unloadHandlerContainer = createUnloadHandlerContainer();\n        }\n    }\n    BaseTelemetryPlugin.__ieDyn=1;\n    return BaseTelemetryPlugin;\n}());\n\nfunction _addInitializer(_initializers, id, telemetryInitializer) {\n    var theInitializer = {\n        id: id,\n        fn: telemetryInitializer\n    };\n    arrAppend(_initializers, theInitializer);\n    var handler = {\n        remove: function () {\n            arrForEach(_initializers, function (initializer, idx) {\n                if (initializer.id === theInitializer.id) {\n                    _initializers[_DYN_SPLICE ](idx, 1);\n                    return -1;\n                }\n            });\n        }\n    };\n    return handler;\n}\nfunction _runInitializers(_initializers, item, logger) {\n    var doNotSendItem = false;\n    var telemetryInitializersCount = _initializers[_DYN_LENGTH$5 ];\n    for (var i = 0; i < telemetryInitializersCount; ++i) {\n        var telemetryInitializer = _initializers[i];\n        if (telemetryInitializer) {\n            try {\n                if (telemetryInitializer.fn[_DYN_APPLY ](null, [item]) === false) {\n                    doNotSendItem = true;\n                    break;\n                }\n            }\n            catch (e) {\n                _throwInternal(logger, 2 , 64 , \"Telemetry initializer failed: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n            }\n        }\n    }\n    return !doNotSendItem;\n}\nvar TelemetryInitializerPlugin = /** @class */ (function (_super) {\n    __extendsFn(TelemetryInitializerPlugin, _super);\n    function TelemetryInitializerPlugin() {\n        var _this = _super.call(this) || this;\n        _this.identifier = \"TelemetryInitializerPlugin\";\n        _this.priority = 199;\n        var _id;\n        var _initializers;\n        _initDefaults();\n        dynamicProto(TelemetryInitializerPlugin, _this, function (_self, _base) {\n            _self.addTelemetryInitializer = function (telemetryInitializer) {\n                return _addInitializer(_initializers, _id++, telemetryInitializer);\n            };\n            _self[STR_PROCESS_TELEMETRY ] = function (item, itemCtx) {\n                if (_runInitializers(_initializers, item, itemCtx ? itemCtx[_DYN_DIAG_LOG$2 ]() : _self[_DYN_DIAG_LOG$2 ]())) {\n                    _self[_DYN_PROCESS_NEXT ](item, itemCtx);\n                }\n            };\n            _self[_DYN__DO_TEARDOWN ] = function () {\n                _initDefaults();\n            };\n        });\n        function _initDefaults() {\n            _id = 0;\n            _initializers = [];\n        }\n        return _this;\n    }\n    TelemetryInitializerPlugin.__ieDyn=1;\n    return TelemetryInitializerPlugin;\n}(BaseTelemetryPlugin));\n\nvar _a$6;\nvar strValidationError = \"Plugins must provide initialize method\";\nvar strNotificationManager = \"_notificationManager\";\nvar strSdkUnloadingError = \"SDK is still unloading...\";\nvar strSdkNotInitialized = \"SDK is not initialized\";\nvar defaultConfig = objDeepFreeze((_a$6 = {\n        cookieCfg: {}\n    },\n    _a$6[STR_EXTENSIONS] = { rdOnly: true, ref: true, v: [] },\n    _a$6[STR_CHANNELS] = { rdOnly: true, ref: true, v: [] },\n    _a$6[STR_EXTENSION_CONFIG] = { ref: true, v: {} },\n    _a$6[STR_CREATE_PERF_MGR] = UNDEFINED_VALUE$2,\n    _a$6.loggingLevelConsole = 0 ,\n    _a$6.diagnosticLogInterval = UNDEFINED_VALUE$2,\n    _a$6));\nfunction _createPerfManager(core, notificationMgr) {\n    return new PerfManager(notificationMgr);\n}\nfunction _validateExtensions(logger, channelPriority, allExtensions) {\n    var _a;\n    var coreExtensions = [];\n    var channels = [];\n    var extPriorities = {};\n    arrForEach(allExtensions, function (ext) {\n        if (isNullOrUndefined(ext) || isNullOrUndefined(ext[_DYN_INITIALIZE ])) {\n            throwError(strValidationError);\n        }\n        var extPriority = ext[STR_PRIORITY ];\n        var identifier = ext[_DYN_IDENTIFIER ];\n        if (ext && extPriority) {\n            if (!isNullOrUndefined(extPriorities[extPriority])) {\n                _warnToConsole(logger, \"Two extensions have same priority #\" + extPriority + \" - \" + extPriorities[extPriority] + \", \" + identifier);\n            }\n            else {\n                extPriorities[extPriority] = identifier;\n            }\n        }\n        if (!extPriority || extPriority < channelPriority) {\n            coreExtensions[_DYN_PUSH$2 ](ext);\n        }\n        else {\n            channels[_DYN_PUSH$2 ](ext);\n        }\n    });\n    return _a = {},\n        _a[STR_CORE ] = coreExtensions,\n        _a[STR_CHANNELS ] = channels,\n        _a;\n}\nfunction _isPluginPresent(thePlugin, plugins) {\n    var exists = false;\n    arrForEach(plugins, function (plugin) {\n        if (plugin === thePlugin) {\n            exists = true;\n            return -1;\n        }\n    });\n    return exists;\n}\nfunction _deepMergeConfig(details, target, newValues, merge) {\n    if (newValues) {\n        objForEachKey(newValues, function (key, value) {\n            if (merge) {\n                if (isPlainObject(value) && isPlainObject(target[key])) {\n                    _deepMergeConfig(details, target[key], value, merge);\n                }\n            }\n            if (merge && isPlainObject(value) && isPlainObject(target[key])) {\n                _deepMergeConfig(details, target[key], value, merge);\n            }\n            else {\n                details.set(target, key, value);\n            }\n        });\n    }\n}\nfunction _findWatcher(listeners, newWatcher) {\n    var theListener = null;\n    var idx = -1;\n    arrForEach(listeners, function (listener, lp) {\n        if (listener.w === newWatcher) {\n            theListener = listener;\n            idx = lp;\n            return -1;\n        }\n    });\n    return { i: idx, l: theListener };\n}\nfunction _addDelayedCfgListener(listeners, newWatcher) {\n    var theListener = _findWatcher(listeners, newWatcher).l;\n    if (!theListener) {\n        theListener = {\n            w: newWatcher,\n            rm: function () {\n                var fnd = _findWatcher(listeners, newWatcher);\n                if (fnd.i !== -1) {\n                    listeners[_DYN_SPLICE ](fnd.i, 1);\n                }\n            }\n        };\n        listeners[_DYN_PUSH$2 ](theListener);\n    }\n    return theListener;\n}\nfunction _registerDelayedCfgListener(config, listeners, logger) {\n    arrForEach(listeners, function (listener) {\n        var unloadHdl = onConfigChange(config, listener.w, logger);\n        delete listener.w;\n        listener.rm = function () {\n            unloadHdl.rm();\n        };\n    });\n}\nvar AppInsightsCore = /** @class */ (function () {\n    function AppInsightsCore() {\n        var _configHandler;\n        var _isInitialized;\n        var _logger;\n        var _eventQueue;\n        var _notificationManager;\n        var _perfManager;\n        var _cfgPerfManager;\n        var _cookieManager;\n        var _pluginChain;\n        var _configExtensions;\n        var _channelConfig;\n        var _channels;\n        var _isUnloading;\n        var _telemetryInitializerPlugin;\n        var _internalLogsEventName;\n        var _evtNamespace;\n        var _unloadHandlers;\n        var _hookContainer;\n        var _debugListener;\n        var _traceCtx;\n        var _instrumentationKey;\n        var _cfgListeners;\n        var _extensions;\n        var _pluginVersionStringArr;\n        var _pluginVersionString;\n        var _internalLogPoller;\n        var _internalLogPollerListening;\n        var _forceStopInternalLogPoller;\n        dynamicProto(AppInsightsCore, this, function (_self) {\n            _initDefaults();\n            _self[\"_getDbgPlgTargets\"] = function () {\n                return [_extensions];\n            };\n            _self[_DYN_IS_INITIALIZED ] = function () { return _isInitialized; };\n            _self[_DYN_INITIALIZE ] = function (config, extensions, logger, notificationManager) {\n                if (_isUnloading) {\n                    throwError(strSdkUnloadingError);\n                }\n                if (_self[_DYN_IS_INITIALIZED ]()) {\n                    throwError(\"Core cannot be initialized more than once\");\n                }\n                _configHandler = createDynamicConfig(config, defaultConfig, logger || _self[_DYN_LOGGER ], false);\n                config = _configHandler.cfg;\n                _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                    _instrumentationKey = details.cfg.instrumentationKey;\n                    var extCfg = details.ref(details.cfg, STR_EXTENSION_CONFIG);\n                    objForEachKey(extCfg, function (key) {\n                        details.ref(extCfg, key);\n                    });\n                    if (isNullOrUndefined(_instrumentationKey)) {\n                        throwError(\"Please provide instrumentation key\");\n                    }\n                }));\n                _notificationManager = notificationManager;\n                _initDebugListener();\n                _initPerfManager();\n                _self[_DYN_LOGGER ] = logger;\n                var cfgExtensions = config[STR_EXTENSIONS ];\n                _configExtensions = [];\n                _configExtensions[_DYN_PUSH$2 ].apply(_configExtensions, __spreadArrayFn(__spreadArrayFn([], extensions, false), cfgExtensions));\n                _channelConfig = config[STR_CHANNELS ];\n                _initPluginChain(null);\n                if (!_channels || _channels[_DYN_LENGTH$5 ] === 0) {\n                    throwError(\"No \" + STR_CHANNELS + \" available\");\n                }\n                if (_channelConfig && _channelConfig[_DYN_LENGTH$5 ] > 1) {\n                    var teeController = _self[_DYN_GET_PLUGIN ](\"TeeChannelController\");\n                    if (!teeController || !teeController.plugin) {\n                        _throwInternal(_logger, 1 , 28 , \"TeeChannel required\");\n                    }\n                }\n                _registerDelayedCfgListener(config, _cfgListeners, _logger);\n                _cfgListeners = null;\n                _isInitialized = true;\n                _self.releaseQueue();\n                _self[_DYN_POLL_INTERNAL_LOGS ]();\n            };\n            _self.getChannels = function () {\n                var controls = [];\n                if (_channels) {\n                    arrForEach(_channels, function (channel) {\n                        controls[_DYN_PUSH$2 ](channel);\n                    });\n                }\n                return objFreeze(controls);\n            };\n            _self.track = function (telemetryItem) {\n                doPerf(_self[STR_GET_PERF_MGR ](), function () { return \"AppInsightsCore:track\"; }, function () {\n                    if (telemetryItem === null) {\n                        _notifyInvalidEvent(telemetryItem);\n                        throwError(\"Invalid telemetry item\");\n                    }\n                    if (!telemetryItem[_DYN_NAME$3 ] && isNullOrUndefined(telemetryItem[_DYN_NAME$3 ])) {\n                        _notifyInvalidEvent(telemetryItem);\n                        throwError(\"telemetry name required\");\n                    }\n                    telemetryItem.iKey = telemetryItem.iKey || _instrumentationKey;\n                    telemetryItem[_DYN_TIME ] = telemetryItem[_DYN_TIME ] || toISOString(new Date());\n                    telemetryItem.ver = telemetryItem.ver || \"4.0\";\n                    if (!_isUnloading && _self[_DYN_IS_INITIALIZED ]()) {\n                        _createTelCtx()[_DYN_PROCESS_NEXT ](telemetryItem);\n                    }\n                    else {\n                        _eventQueue[_DYN_PUSH$2 ](telemetryItem);\n                    }\n                }, function () { return ({ item: telemetryItem }); }, !(telemetryItem.sync));\n            };\n            _self[_DYN_GET_PROCESS_TEL_CONT0 ] = _createTelCtx;\n            _self[_DYN_GET_NOTIFY_MGR ] = function () {\n                if (!_notificationManager) {\n                    _notificationManager = new NotificationManager(_configHandler.cfg);\n                    _self[strNotificationManager] = _notificationManager;\n                }\n                return _notificationManager;\n            };\n            _self[_DYN_ADD_NOTIFICATION_LIS1 ] = function (listener) {\n                _self[_DYN_GET_NOTIFY_MGR ]()[_DYN_ADD_NOTIFICATION_LIS1 ](listener);\n            };\n            _self[_DYN_REMOVE_NOTIFICATION_2 ] = function (listener) {\n                if (_notificationManager) {\n                    _notificationManager[_DYN_REMOVE_NOTIFICATION_2 ](listener);\n                }\n            };\n            _self.getCookieMgr = function () {\n                if (!_cookieManager) {\n                    _cookieManager = createCookieMgr(_configHandler.cfg, _self[_DYN_LOGGER ]);\n                }\n                return _cookieManager;\n            };\n            _self.setCookieMgr = function (cookieMgr) {\n                if (_cookieManager !== cookieMgr) {\n                    runTargetUnload(_cookieManager, false);\n                    _cookieManager = cookieMgr;\n                }\n            };\n            _self[STR_GET_PERF_MGR ] = function () {\n                if (!_perfManager && !_cfgPerfManager) {\n                    _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                        if (details.cfg.enablePerfMgr) {\n                            var createPerfMgr = details.cfg[STR_CREATE_PERF_MGR ];\n                            if (isFunction(createPerfMgr)) {\n                                _cfgPerfManager = createPerfMgr(_self, _self[_DYN_GET_NOTIFY_MGR ]());\n                            }\n                        }\n                    }));\n                }\n                return _perfManager || _cfgPerfManager || getGblPerfMgr();\n            };\n            _self.setPerfMgr = function (perfMgr) {\n                _perfManager = perfMgr;\n            };\n            _self.eventCnt = function () {\n                return _eventQueue[_DYN_LENGTH$5 ];\n            };\n            _self.releaseQueue = function () {\n                if (_isInitialized && _eventQueue[_DYN_LENGTH$5 ] > 0) {\n                    var eventQueue = _eventQueue;\n                    _eventQueue = [];\n                    arrForEach(eventQueue, function (event) {\n                        _createTelCtx()[_DYN_PROCESS_NEXT ](event);\n                    });\n                }\n            };\n            _self[_DYN_POLL_INTERNAL_LOGS ] = function (eventName) {\n                _internalLogsEventName = eventName || null;\n                _forceStopInternalLogPoller = false;\n                _internalLogPoller && _internalLogPoller[_DYN_CANCEL ]();\n                return _startLogPoller(true);\n            };\n            function _startLogPoller(alwaysStart) {\n                if ((!_internalLogPoller || !_internalLogPoller[_DYN_ENABLED ]) && !_forceStopInternalLogPoller) {\n                    var shouldStart = alwaysStart || (_logger && _logger.queue[_DYN_LENGTH$5 ] > 0);\n                    if (shouldStart) {\n                        if (!_internalLogPollerListening) {\n                            _internalLogPollerListening = true;\n                            _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                                var interval = details.cfg.diagnosticLogInterval;\n                                if (!interval || !(interval > 0)) {\n                                    interval = 10000;\n                                }\n                                var isRunning = false;\n                                if (_internalLogPoller) {\n                                    isRunning = _internalLogPoller[_DYN_ENABLED ];\n                                    _internalLogPoller[_DYN_CANCEL ]();\n                                }\n                                _internalLogPoller = createTimeout(_flushInternalLogs, interval);\n                                _internalLogPoller.unref();\n                                _internalLogPoller[_DYN_ENABLED ] = isRunning;\n                            }));\n                        }\n                        _internalLogPoller[_DYN_ENABLED ] = true;\n                    }\n                }\n                return _internalLogPoller;\n            }\n            _self[_DYN_STOP_POLLING_INTERNA3 ] = function () {\n                _forceStopInternalLogPoller = true;\n                _internalLogPoller && _internalLogPoller[_DYN_CANCEL ]();\n                _flushInternalLogs();\n            };\n            proxyFunctions(_self, function () { return _telemetryInitializerPlugin; }, [\"addTelemetryInitializer\"]);\n            _self[_DYN_UNLOAD ] = function (isAsync, unloadComplete, cbTimeout) {\n                var _a;\n                if (isAsync === void 0) { isAsync = true; }\n                if (!_isInitialized) {\n                    throwError(strSdkNotInitialized);\n                }\n                if (_isUnloading) {\n                    throwError(strSdkUnloadingError);\n                }\n                var unloadState = (_a = {\n                        reason: 50\n                    },\n                    _a[_DYN_IS_ASYNC ] = isAsync,\n                    _a.flushComplete = false,\n                    _a);\n                var result;\n                if (isAsync && !unloadComplete) {\n                    result = createPromise(function (resolve) {\n                        unloadComplete = resolve;\n                    });\n                }\n                var processUnloadCtx = createProcessTelemetryUnloadContext(_getPluginChain(), _self);\n                processUnloadCtx[_DYN_ON_COMPLETE ](function () {\n                    _hookContainer.run(_self[_DYN_LOGGER ]);\n                    doUnloadAll([_cookieManager, _notificationManager, _logger], isAsync, function () {\n                        _initDefaults();\n                        unloadComplete && unloadComplete(unloadState);\n                    });\n                }, _self);\n                function _doUnload(flushComplete) {\n                    unloadState.flushComplete = flushComplete;\n                    _isUnloading = true;\n                    _unloadHandlers.run(processUnloadCtx, unloadState);\n                    _self[_DYN_STOP_POLLING_INTERNA3 ]();\n                    processUnloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n                }\n                _flushInternalLogs();\n                if (!_flushChannels(isAsync, _doUnload, 6 , cbTimeout)) ;\n                return result;\n            };\n            _self[_DYN_GET_PLUGIN ] = _getPlugin;\n            _self.addPlugin = function (plugin, replaceExisting, isAsync, addCb) {\n                if (!plugin) {\n                    addCb && addCb(false);\n                    _logOrThrowError(strValidationError);\n                    return;\n                }\n                var existingPlugin = _getPlugin(plugin[_DYN_IDENTIFIER ]);\n                if (existingPlugin && !replaceExisting) {\n                    addCb && addCb(false);\n                    _logOrThrowError(\"Plugin [\" + plugin[_DYN_IDENTIFIER ] + \"] is already loaded!\");\n                    return;\n                }\n                var updateState = {\n                    reason: 16\n                };\n                function _addPlugin(removed) {\n                    _configExtensions[_DYN_PUSH$2 ](plugin);\n                    updateState.added = [plugin];\n                    _initPluginChain(updateState);\n                    addCb && addCb(true);\n                }\n                if (existingPlugin) {\n                    var removedPlugins_1 = [existingPlugin.plugin];\n                    var unloadState = {\n                        reason: 2 ,\n                        isAsync: !!isAsync\n                    };\n                    _removePlugins(removedPlugins_1, unloadState, function (removed) {\n                        if (!removed) {\n                            addCb && addCb(false);\n                        }\n                        else {\n                            updateState.removed = removedPlugins_1;\n                            updateState.reason |= 32 ;\n                            _addPlugin();\n                        }\n                    });\n                }\n                else {\n                    _addPlugin();\n                }\n            };\n            _self.updateCfg = function (newConfig, mergeExisting) {\n                if (mergeExisting === void 0) { mergeExisting = true; }\n                var updateState;\n                if (_self[_DYN_IS_INITIALIZED ]()) {\n                    updateState = {\n                        reason: 1 ,\n                        cfg: _configHandler.cfg,\n                        oldCfg: deepExtend({}, _configHandler.cfg),\n                        newConfig: deepExtend({}, newConfig),\n                        merge: mergeExisting\n                    };\n                    newConfig = updateState.newConfig;\n                    var cfg = _configHandler.cfg;\n                    newConfig[STR_EXTENSIONS ] = cfg[STR_EXTENSIONS ];\n                    newConfig[STR_CHANNELS ] = cfg[STR_CHANNELS ];\n                }\n                _configHandler._block(function (details) {\n                    var theConfig = details.cfg;\n                    _deepMergeConfig(details, theConfig, newConfig, mergeExisting);\n                    if (!mergeExisting) {\n                        objForEachKey(theConfig, function (key) {\n                            if (!objHasOwn(newConfig, key)) {\n                                details.set(theConfig, key, UNDEFINED_VALUE$2);\n                            }\n                        });\n                    }\n                    details[_DYN_SET_DF ](theConfig, defaultConfig);\n                }, true);\n                _configHandler[_DYN_NOTIFY ]();\n                if (updateState) {\n                    _doUpdate(updateState);\n                }\n            };\n            _self.evtNamespace = function () {\n                return _evtNamespace;\n            };\n            _self.flush = _flushChannels;\n            _self.getTraceCtx = function (createNew) {\n                if (!_traceCtx) {\n                    _traceCtx = createDistributedTraceContext();\n                }\n                return _traceCtx;\n            };\n            _self.setTraceCtx = function (traceCtx) {\n                _traceCtx = traceCtx || null;\n            };\n            _self.addUnloadHook = _addUnloadHook;\n            proxyFunctionAs(_self, \"addUnloadCb\", function () { return _unloadHandlers; }, \"add\");\n            _self.onCfgChange = function (handler) {\n                var unloadHook;\n                if (!_isInitialized) {\n                    unloadHook = _addDelayedCfgListener(_cfgListeners, handler);\n                }\n                else {\n                    unloadHook = onConfigChange(_configHandler.cfg, handler, _self[_DYN_LOGGER ]);\n                }\n                return {\n                    rm: function () {\n                        unloadHook.rm();\n                    }\n                };\n            };\n            _self.getWParam = function () {\n                return (hasDocument() || !!_configHandler.cfg.enableWParam) ? 0 : -1;\n            };\n            function _setPluginVersions() {\n                var thePlugins = {};\n                _pluginVersionStringArr = [];\n                var _addPluginVersions = function (plugins) {\n                    if (plugins) {\n                        arrForEach(plugins, function (plugin) {\n                            if (plugin[_DYN_IDENTIFIER ] && plugin[_DYN_VERSION$1 ] && !thePlugins[plugin.identifier]) {\n                                var ver = plugin[_DYN_IDENTIFIER ] + \"=\" + plugin[_DYN_VERSION$1 ];\n                                _pluginVersionStringArr[_DYN_PUSH$2 ](ver);\n                                thePlugins[plugin.identifier] = plugin;\n                            }\n                        });\n                    }\n                };\n                _addPluginVersions(_channels);\n                if (_channelConfig) {\n                    arrForEach(_channelConfig, function (channels) {\n                        _addPluginVersions(channels);\n                    });\n                }\n                _addPluginVersions(_configExtensions);\n            }\n            function _initDefaults() {\n                _isInitialized = false;\n                _configHandler = createDynamicConfig({}, defaultConfig, _self[_DYN_LOGGER ]);\n                _configHandler.cfg[_DYN_LOGGING_LEVEL_CONSOL4 ] = 1 ;\n                objDefine(_self, \"config\", {\n                    g: function () { return _configHandler.cfg; },\n                    s: function (newValue) {\n                        _self.updateCfg(newValue, false);\n                    }\n                });\n                objDefine(_self, \"pluginVersionStringArr\", {\n                    g: function () {\n                        if (!_pluginVersionStringArr) {\n                            _setPluginVersions();\n                        }\n                        return _pluginVersionStringArr;\n                    }\n                });\n                objDefine(_self, \"pluginVersionString\", {\n                    g: function () {\n                        if (!_pluginVersionString) {\n                            if (!_pluginVersionStringArr) {\n                                _setPluginVersions();\n                            }\n                            _pluginVersionString = _pluginVersionStringArr.join(\";\");\n                        }\n                        return _pluginVersionString || STR_EMPTY;\n                    }\n                });\n                objDefine(_self, \"logger\", {\n                    g: function () {\n                        if (!_logger) {\n                            _logger = new DiagnosticLogger(_configHandler.cfg);\n                            _configHandler[_DYN_LOGGER ] = _logger;\n                        }\n                        return _logger;\n                    },\n                    s: function (newLogger) {\n                        _configHandler[_DYN_LOGGER ] = newLogger;\n                        if (_logger !== newLogger) {\n                            runTargetUnload(_logger, false);\n                            _logger = newLogger;\n                        }\n                    }\n                });\n                _self[_DYN_LOGGER ] = new DiagnosticLogger(_configHandler.cfg);\n                _extensions = [];\n                var cfgExtensions = _self.config[STR_EXTENSIONS ] || [];\n                cfgExtensions.splice(0, cfgExtensions[_DYN_LENGTH$5 ]);\n                arrAppend(cfgExtensions, _extensions);\n                _telemetryInitializerPlugin = new TelemetryInitializerPlugin();\n                _eventQueue = [];\n                runTargetUnload(_notificationManager, false);\n                _notificationManager = null;\n                _perfManager = null;\n                _cfgPerfManager = null;\n                runTargetUnload(_cookieManager, false);\n                _cookieManager = null;\n                _pluginChain = null;\n                _configExtensions = [];\n                _channelConfig = null;\n                _channels = null;\n                _isUnloading = false;\n                _internalLogsEventName = null;\n                _evtNamespace = createUniqueNamespace(\"AIBaseCore\", true);\n                _unloadHandlers = createUnloadHandlerContainer();\n                _traceCtx = null;\n                _instrumentationKey = null;\n                _hookContainer = createUnloadHookContainer();\n                _cfgListeners = [];\n                _pluginVersionString = null;\n                _pluginVersionStringArr = null;\n                _forceStopInternalLogPoller = false;\n            }\n            function _createTelCtx() {\n                var theCtx = createProcessTelemetryContext(_getPluginChain(), _configHandler.cfg, _self);\n                theCtx[_DYN_ON_COMPLETE ](_startLogPoller);\n                return theCtx;\n            }\n            function _initPluginChain(updateState) {\n                var theExtensions = _validateExtensions(_self[_DYN_LOGGER ], ChannelControllerPriority, _configExtensions);\n                _pluginChain = null;\n                _pluginVersionString = null;\n                _pluginVersionStringArr = null;\n                _channels = (_channelConfig || [])[0] || [];\n                _channels = sortPlugins(arrAppend(_channels, theExtensions[STR_CHANNELS ]));\n                var allExtensions = arrAppend(sortPlugins(theExtensions[STR_CORE ]), _channels);\n                _extensions = objFreeze(allExtensions);\n                var cfgExtensions = _self.config[STR_EXTENSIONS ] || [];\n                cfgExtensions.splice(0, cfgExtensions[_DYN_LENGTH$5 ]);\n                arrAppend(cfgExtensions, _extensions);\n                var rootCtx = _createTelCtx();\n                if (_channels && _channels[_DYN_LENGTH$5 ] > 0) {\n                    initializePlugins(rootCtx[_DYN_CREATE_NEW$1 ](_channels), allExtensions);\n                }\n                initializePlugins(rootCtx, allExtensions);\n                if (updateState) {\n                    _doUpdate(updateState);\n                }\n            }\n            function _getPlugin(pluginIdentifier) {\n                var theExt = null;\n                var thePlugin = null;\n                var channelHosts = [];\n                arrForEach(_extensions, function (ext) {\n                    if (ext[_DYN_IDENTIFIER ] === pluginIdentifier && ext !== _telemetryInitializerPlugin) {\n                        thePlugin = ext;\n                        return -1;\n                    }\n                    if (ext.getChannel) {\n                        channelHosts[_DYN_PUSH$2 ](ext);\n                    }\n                });\n                if (!thePlugin && channelHosts[_DYN_LENGTH$5 ] > 0) {\n                    arrForEach(channelHosts, function (host) {\n                        thePlugin = host.getChannel(pluginIdentifier);\n                        if (!thePlugin) {\n                            return -1;\n                        }\n                    });\n                }\n                if (thePlugin) {\n                    theExt = {\n                        plugin: thePlugin,\n                        setEnabled: function (enabled) {\n                            _getPluginState(thePlugin)[STR_DISABLED] = !enabled;\n                        },\n                        isEnabled: function () {\n                            var pluginState = _getPluginState(thePlugin);\n                            return !pluginState[_DYN_TEARDOWN ] && !pluginState[STR_DISABLED];\n                        },\n                        remove: function (isAsync, removeCb) {\n                            var _a;\n                            if (isAsync === void 0) { isAsync = true; }\n                            var pluginsToRemove = [thePlugin];\n                            var unloadState = (_a = {\n                                    reason: 1\n                                },\n                                _a[_DYN_IS_ASYNC ] = isAsync,\n                                _a);\n                            _removePlugins(pluginsToRemove, unloadState, function (removed) {\n                                if (removed) {\n                                    _initPluginChain({\n                                        reason: 32 ,\n                                        removed: pluginsToRemove\n                                    });\n                                }\n                                removeCb && removeCb(removed);\n                            });\n                        }\n                    };\n                }\n                return theExt;\n            }\n            function _getPluginChain() {\n                if (!_pluginChain) {\n                    var extensions = (_extensions || []).slice();\n                    if (arrIndexOf(extensions, _telemetryInitializerPlugin) === -1) {\n                        extensions[_DYN_PUSH$2 ](_telemetryInitializerPlugin);\n                    }\n                    _pluginChain = createTelemetryProxyChain(sortPlugins(extensions), _configHandler.cfg, _self);\n                }\n                return _pluginChain;\n            }\n            function _removePlugins(thePlugins, unloadState, removeComplete) {\n                if (thePlugins && thePlugins[_DYN_LENGTH$5 ] > 0) {\n                    var unloadChain = createTelemetryProxyChain(thePlugins, _configHandler.cfg, _self);\n                    var unloadCtx = createProcessTelemetryUnloadContext(unloadChain, _self);\n                    unloadCtx[_DYN_ON_COMPLETE ](function () {\n                        var removed = false;\n                        var newConfigExtensions = [];\n                        arrForEach(_configExtensions, function (plugin, idx) {\n                            if (!_isPluginPresent(plugin, thePlugins)) {\n                                newConfigExtensions[_DYN_PUSH$2 ](plugin);\n                            }\n                            else {\n                                removed = true;\n                            }\n                        });\n                        _configExtensions = newConfigExtensions;\n                        _pluginVersionString = null;\n                        _pluginVersionStringArr = null;\n                        var newChannelConfig = [];\n                        if (_channelConfig) {\n                            arrForEach(_channelConfig, function (queue, idx) {\n                                var newQueue = [];\n                                arrForEach(queue, function (channel) {\n                                    if (!_isPluginPresent(channel, thePlugins)) {\n                                        newQueue[_DYN_PUSH$2 ](channel);\n                                    }\n                                    else {\n                                        removed = true;\n                                    }\n                                });\n                                newChannelConfig[_DYN_PUSH$2 ](newQueue);\n                            });\n                            _channelConfig = newChannelConfig;\n                        }\n                        removeComplete && removeComplete(removed);\n                        _startLogPoller();\n                    });\n                    unloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n                }\n                else {\n                    removeComplete(false);\n                }\n            }\n            function _flushInternalLogs() {\n                if (_logger && _logger.queue) {\n                    var queue = _logger.queue.slice(0);\n                    _logger.queue[_DYN_LENGTH$5 ] = 0;\n                    arrForEach(queue, function (logMessage) {\n                        var _a;\n                        var item = (_a = {},\n                            _a[_DYN_NAME$3 ] = _internalLogsEventName ? _internalLogsEventName : \"InternalMessageId: \" + logMessage[_DYN_MESSAGE_ID ],\n                            _a.iKey = _instrumentationKey,\n                            _a[_DYN_TIME ] = toISOString(new Date()),\n                            _a.baseType = _InternalLogMessage.dataType,\n                            _a.baseData = { message: logMessage[_DYN_MESSAGE$2 ] },\n                            _a);\n                        _self.track(item);\n                    });\n                }\n            }\n            function _flushChannels(isAsync, callBack, sendReason, cbTimeout) {\n                var waiting = 1;\n                var doneIterating = false;\n                var cbTimer = null;\n                cbTimeout = cbTimeout || 5000;\n                function doCallback() {\n                    waiting--;\n                    if (doneIterating && waiting === 0) {\n                        cbTimer && cbTimer[_DYN_CANCEL ]();\n                        cbTimer = null;\n                        callBack && callBack(doneIterating);\n                        callBack = null;\n                    }\n                }\n                if (_channels && _channels[_DYN_LENGTH$5 ] > 0) {\n                    var flushCtx = _createTelCtx()[_DYN_CREATE_NEW$1 ](_channels);\n                    flushCtx.iterate(function (plugin) {\n                        if (plugin.flush) {\n                            waiting++;\n                            var handled_1 = false;\n                            if (!plugin.flush(isAsync, function () {\n                                handled_1 = true;\n                                doCallback();\n                            }, sendReason)) {\n                                if (!handled_1) {\n                                    if (isAsync && cbTimer == null) {\n                                        cbTimer = scheduleTimeout(function () {\n                                            cbTimer = null;\n                                            doCallback();\n                                        }, cbTimeout);\n                                    }\n                                    else {\n                                        doCallback();\n                                    }\n                                }\n                            }\n                        }\n                    });\n                }\n                doneIterating = true;\n                doCallback();\n                return true;\n            }\n            function _initDebugListener() {\n                !_notificationManager && _self[_DYN_GET_NOTIFY_MGR ]();\n                _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                    var disableDbgExt = details.cfg.disableDbgExt;\n                    if (disableDbgExt === true && _debugListener) {\n                        _notificationManager[_DYN_REMOVE_NOTIFICATION_2 ](_debugListener);\n                        _debugListener = null;\n                    }\n                    if (_notificationManager && !_debugListener && disableDbgExt !== true) {\n                        _debugListener = getDebugListener(details.cfg);\n                        _notificationManager[_DYN_ADD_NOTIFICATION_LIS1 ](_debugListener);\n                    }\n                }));\n            }\n            function _initPerfManager() {\n                _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                    var enablePerfMgr = details.cfg.enablePerfMgr;\n                    if (!enablePerfMgr && _cfgPerfManager) {\n                        _cfgPerfManager = null;\n                    }\n                    if (enablePerfMgr) {\n                        getSetValue(details.cfg, STR_CREATE_PERF_MGR, _createPerfManager);\n                    }\n                }));\n            }\n            function _doUpdate(updateState) {\n                var updateCtx = createProcessTelemetryUpdateContext(_getPluginChain(), _self);\n                updateCtx[_DYN_ON_COMPLETE ](_startLogPoller);\n                if (!_self._updateHook || _self._updateHook(updateCtx, updateState) !== true) {\n                    updateCtx[_DYN_PROCESS_NEXT ](updateState);\n                }\n            }\n            function _logOrThrowError(message) {\n                var logger = _self[_DYN_LOGGER ];\n                if (logger) {\n                    _throwInternal(logger, 2 , 73 , message);\n                    _startLogPoller();\n                }\n                else {\n                    throwError(message);\n                }\n            }\n            function _notifyInvalidEvent(telemetryItem) {\n                var manager = _self[_DYN_GET_NOTIFY_MGR ]();\n                if (manager) {\n                    manager[STR_EVENTS_DISCARDED ]([telemetryItem], 2 );\n                }\n            }\n            function _addUnloadHook(hooks) {\n                _hookContainer.add(hooks);\n            }\n        });\n    }\n    AppInsightsCore.__ieDyn=1;\n    return AppInsightsCore;\n}());\n\nvar strOnPrefix = \"on\";\nvar strAttachEvent = \"attachEvent\";\nvar strAddEventHelper = \"addEventListener\";\nvar strDetachEvent = \"detachEvent\";\nvar strRemoveEventListener = \"removeEventListener\";\nvar strEvents = \"events\";\nvar strVisibilityChangeEvt = \"visibilitychange\";\nvar strPageHide = \"pagehide\";\nvar strUnload = \"unload\";\nvar strBeforeUnload = \"beforeunload\";\nvar strPageHideNamespace = createUniqueNamespace(\"aiEvtPageHide\");\ncreateUniqueNamespace(\"aiEvtPageShow\");\nvar rRemoveEmptyNs = /\\.[\\.]+/g;\nvar rRemoveTrailingEmptyNs = /[\\.]+$/;\nvar _guid = 1;\nvar elmNodeData = createElmNodeData(\"events\");\nvar eventNamespace = /^([^.]*)(?:\\.(.+)|)/;\nfunction _normalizeNamespace(name) {\n    if (name && name[_DYN_REPLACE ]) {\n        return name[_DYN_REPLACE ](/^[\\s\\.]+|(?=[\\s\\.])[\\.\\s]+$/g, STR_EMPTY);\n    }\n    return name;\n}\nfunction _getEvtNamespace(eventName, evtNamespace) {\n    var _a;\n    if (evtNamespace) {\n        var theNamespace_1 = STR_EMPTY;\n        if (isArray(evtNamespace)) {\n            theNamespace_1 = STR_EMPTY;\n            arrForEach(evtNamespace, function (name) {\n                name = _normalizeNamespace(name);\n                if (name) {\n                    if (name[0] !== \".\") {\n                        name = \".\" + name;\n                    }\n                    theNamespace_1 += name;\n                }\n            });\n        }\n        else {\n            theNamespace_1 = _normalizeNamespace(evtNamespace);\n        }\n        if (theNamespace_1) {\n            if (theNamespace_1[0] !== \".\") {\n                theNamespace_1 = \".\" + theNamespace_1;\n            }\n            eventName = (eventName || STR_EMPTY) + theNamespace_1;\n        }\n    }\n    var parsedEvent = (eventNamespace.exec(eventName || STR_EMPTY) || []);\n    return _a = {},\n        _a[_DYN_TYPE ] = parsedEvent[1],\n        _a.ns = ((parsedEvent[2] || STR_EMPTY).replace(rRemoveEmptyNs, \".\").replace(rRemoveTrailingEmptyNs, STR_EMPTY)[_DYN_SPLIT$1 ](\".\").sort()).join(\".\"),\n        _a;\n}\nfunction _getRegisteredEvents(target, evtName, addDefault) {\n    if (addDefault === void 0) { addDefault = true; }\n    var aiEvts = elmNodeData.get(target, strEvents, {}, addDefault);\n    var registeredEvents = aiEvts[evtName];\n    if (!registeredEvents) {\n        registeredEvents = aiEvts[evtName] = [];\n    }\n    return registeredEvents;\n}\nfunction _doDetach(obj, evtName, handlerRef, useCapture) {\n    if (obj && evtName && evtName[_DYN_TYPE ]) {\n        if (obj[strRemoveEventListener]) {\n            obj[strRemoveEventListener](evtName[_DYN_TYPE ], handlerRef, useCapture);\n        }\n        else if (obj[strDetachEvent]) {\n            obj[strDetachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);\n        }\n    }\n}\nfunction _doAttach(obj, evtName, handlerRef, useCapture) {\n    var result = false;\n    if (obj && evtName && evtName[_DYN_TYPE ] && handlerRef) {\n        if (obj[strAddEventHelper]) {\n            obj[strAddEventHelper](evtName[_DYN_TYPE ], handlerRef, useCapture);\n            result = true;\n        }\n        else if (obj[strAttachEvent]) {\n            obj[strAttachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);\n            result = true;\n        }\n    }\n    return result;\n}\nfunction _doUnregister(target, events, evtName, unRegFn) {\n    var idx = events[_DYN_LENGTH$5 ];\n    while (idx--) {\n        var theEvent = events[idx];\n        if (theEvent) {\n            if (!evtName.ns || evtName.ns === theEvent.evtName.ns) {\n                if (!unRegFn || unRegFn(theEvent)) {\n                    _doDetach(target, theEvent.evtName, theEvent[_DYN_HANDLER ], theEvent.capture);\n                    events[_DYN_SPLICE ](idx, 1);\n                }\n            }\n        }\n    }\n}\nfunction _unregisterEvents(target, evtName, unRegFn) {\n    if (evtName[_DYN_TYPE ]) {\n        _doUnregister(target, _getRegisteredEvents(target, evtName[_DYN_TYPE ]), evtName, unRegFn);\n    }\n    else {\n        var eventCache = elmNodeData.get(target, strEvents, {});\n        objForEachKey(eventCache, function (evtType, events) {\n            _doUnregister(target, events, evtName, unRegFn);\n        });\n        if (objKeys(eventCache)[_DYN_LENGTH$5 ] === 0) {\n            elmNodeData.kill(target, strEvents);\n        }\n    }\n}\nfunction mergeEvtNamespace(theNamespace, namespaces) {\n    var newNamespaces;\n    if (namespaces) {\n        if (isArray(namespaces)) {\n            newNamespaces = [theNamespace].concat(namespaces);\n        }\n        else {\n            newNamespaces = [theNamespace, namespaces];\n        }\n        newNamespaces = (_getEvtNamespace(\"xx\", newNamespaces).ns)[_DYN_SPLIT$1 ](\".\");\n    }\n    else {\n        newNamespaces = theNamespace;\n    }\n    return newNamespaces;\n}\nfunction eventOn(target, eventName, handlerRef, evtNamespace, useCapture) {\n    var _a;\n    if (useCapture === void 0) { useCapture = false; }\n    var result = false;\n    if (target) {\n        try {\n            var evtName = _getEvtNamespace(eventName, evtNamespace);\n            result = _doAttach(target, evtName, handlerRef, useCapture);\n            if (result && elmNodeData.accept(target)) {\n                var registeredEvent = (_a = {\n                        guid: _guid++,\n                        evtName: evtName\n                    },\n                    _a[_DYN_HANDLER ] = handlerRef,\n                    _a.capture = useCapture,\n                    _a);\n                _getRegisteredEvents(target, evtName.type)[_DYN_PUSH$2 ](registeredEvent);\n            }\n        }\n        catch (e) {\n        }\n    }\n    return result;\n}\nfunction eventOff(target, eventName, handlerRef, evtNamespace, useCapture) {\n    if (useCapture === void 0) { useCapture = false; }\n    if (target) {\n        try {\n            var evtName_1 = _getEvtNamespace(eventName, evtNamespace);\n            var found_1 = false;\n            _unregisterEvents(target, evtName_1, function (regEvent) {\n                if ((evtName_1.ns && !handlerRef) || regEvent[_DYN_HANDLER ] === handlerRef) {\n                    found_1 = true;\n                    return true;\n                }\n                return false;\n            });\n            if (!found_1) {\n                _doDetach(target, evtName_1, handlerRef, useCapture);\n            }\n        }\n        catch (e) {\n        }\n    }\n}\nfunction addEventHandler(eventName, callback, evtNamespace) {\n    var result = false;\n    var w = getWindow();\n    if (w) {\n        result = eventOn(w, eventName, callback, evtNamespace);\n        result = eventOn(w[\"body\"], eventName, callback, evtNamespace) || result;\n    }\n    var doc = getDocument();\n    if (doc) {\n        result = eventOn(doc, eventName, callback, evtNamespace) || result;\n    }\n    return result;\n}\nfunction removeEventHandler(eventName, callback, evtNamespace) {\n    var w = getWindow();\n    if (w) {\n        eventOff(w, eventName, callback, evtNamespace);\n        eventOff(w[\"body\"], eventName, callback, evtNamespace);\n    }\n    var doc = getDocument();\n    if (doc) {\n        eventOff(doc, eventName, callback, evtNamespace);\n    }\n}\nfunction _addEventListeners(events, listener, excludeEvents, evtNamespace) {\n    var added = false;\n    if (listener && events && events[_DYN_LENGTH$5 ] > 0) {\n        arrForEach(events, function (name) {\n            if (name) {\n                if (!excludeEvents || arrIndexOf(excludeEvents, name) === -1) {\n                    added = addEventHandler(name, listener, evtNamespace) || added;\n                }\n            }\n        });\n    }\n    return added;\n}\nfunction addEventListeners(events, listener, excludeEvents, evtNamespace) {\n    var added = false;\n    if (listener && events && isArray(events)) {\n        added = _addEventListeners(events, listener, excludeEvents, evtNamespace);\n        if (!added && excludeEvents && excludeEvents[_DYN_LENGTH$5 ] > 0) {\n            added = _addEventListeners(events, listener, null, evtNamespace);\n        }\n    }\n    return added;\n}\nfunction removeEventListeners(events, listener, evtNamespace) {\n    if (events && isArray(events)) {\n        arrForEach(events, function (name) {\n            if (name) {\n                removeEventHandler(name, listener, evtNamespace);\n            }\n        });\n    }\n}\nfunction addPageUnloadEventListener(listener, excludeEvents, evtNamespace) {\n    return addEventListeners([strBeforeUnload, strUnload, strPageHide], listener, excludeEvents, evtNamespace);\n}\nfunction removePageUnloadEventListener(listener, evtNamespace) {\n    removeEventListeners([strBeforeUnload, strUnload, strPageHide], listener, evtNamespace);\n}\nfunction addPageHideEventListener(listener, excludeEvents, evtNamespace) {\n    function _handlePageVisibility(evt) {\n        var doc = getDocument();\n        if (listener && doc && doc.visibilityState === \"hidden\") {\n            listener(evt);\n        }\n    }\n    var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);\n    var pageUnloadAdded = _addEventListeners([strPageHide], listener, excludeEvents, newNamespaces);\n    if (!excludeEvents || arrIndexOf(excludeEvents, strVisibilityChangeEvt) === -1) {\n        pageUnloadAdded = _addEventListeners([strVisibilityChangeEvt], _handlePageVisibility, excludeEvents, newNamespaces) || pageUnloadAdded;\n    }\n    if (!pageUnloadAdded && excludeEvents) {\n        pageUnloadAdded = addPageHideEventListener(listener, null, evtNamespace);\n    }\n    return pageUnloadAdded;\n}\nfunction removePageHideEventListener(listener, evtNamespace) {\n    var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);\n    removeEventListeners([strPageHide], listener, newNamespaces);\n    removeEventListeners([strVisibilityChangeEvt], null, newNamespaces);\n}\n\nvar LoggingSeverity = createEnumStyle({\n    DISABLED: 0 ,\n    CRITICAL: 1 ,\n    WARNING: 2 ,\n    DEBUG: 3\n});\n\nvar aiInstrumentHooks = \"_aiHooks\";\nvar cbNames = [\n    \"req\", \"rsp\", \"hkErr\", \"fnErr\"\n];\nfunction _arrLoop(arr, fn) {\n    if (arr) {\n        for (var lp = 0; lp < arr[_DYN_LENGTH$5 ]; lp++) {\n            if (fn(arr[lp], lp)) {\n                break;\n            }\n        }\n    }\n}\nfunction _doCallbacks(hooks, callDetails, cbArgs, hookCtx, type) {\n    if (type >= 0  && type <= 2 ) {\n        _arrLoop(hooks, function (hook, idx) {\n            var cbks = hook.cbks;\n            var cb = cbks[cbNames[type]];\n            if (cb) {\n                callDetails.ctx = function () {\n                    var ctx = hookCtx[idx] = (hookCtx[idx] || {});\n                    return ctx;\n                };\n                try {\n                    cb[_DYN_APPLY ](callDetails.inst, cbArgs);\n                }\n                catch (err) {\n                    var orgEx = callDetails.err;\n                    try {\n                        var hookErrorCb = cbks[cbNames[2 ]];\n                        if (hookErrorCb) {\n                            callDetails.err = err;\n                            hookErrorCb[_DYN_APPLY ](callDetails.inst, cbArgs);\n                        }\n                    }\n                    catch (e) {\n                    }\n                    finally {\n                        callDetails.err = orgEx;\n                    }\n                }\n            }\n        });\n    }\n}\nfunction _createFunctionHook(aiHook) {\n    return function () {\n        var _a;\n        var funcThis = this;\n        var orgArgs = arguments;\n        var hooks = aiHook.h;\n        var funcArgs = (_a = {},\n            _a[_DYN_NAME$3 ] = aiHook.n,\n            _a.inst = funcThis,\n            _a.ctx = null,\n            _a.set = _replaceArg,\n            _a);\n        var hookCtx = [];\n        var cbArgs = _createArgs([funcArgs], orgArgs);\n        funcArgs.evt = getInst(\"event\");\n        function _createArgs(target, theArgs) {\n            _arrLoop(theArgs, function (arg) {\n                target[_DYN_PUSH$2 ](arg);\n            });\n            return target;\n        }\n        function _replaceArg(idx, value) {\n            orgArgs = _createArgs([], orgArgs);\n            orgArgs[idx] = value;\n            cbArgs = _createArgs([funcArgs], orgArgs);\n        }\n        _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 0 );\n        var theFunc = aiHook.f;\n        if (theFunc) {\n            try {\n                funcArgs.rslt = theFunc[_DYN_APPLY ](funcThis, orgArgs);\n            }\n            catch (err) {\n                funcArgs.err = err;\n                _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 3 );\n                throw err;\n            }\n        }\n        _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 1 );\n        return funcArgs.rslt;\n    };\n}\nfunction _getOwner(target, name, checkPrototype, checkParentProto) {\n    var owner = null;\n    if (target) {\n        if (objHasOwnProperty(target, name)) {\n            owner = target;\n        }\n        else if (checkPrototype) {\n            owner = _getOwner(_getObjProto(target), name, checkParentProto, false);\n        }\n    }\n    return owner;\n}\nfunction InstrumentProto(target, funcName, callbacks) {\n    if (target) {\n        return InstrumentFunc(target[strShimPrototype], funcName, callbacks, false);\n    }\n    return null;\n}\nfunction _createInstrumentHook(owner, funcName, fn, callbacks) {\n    var aiHook = fn && fn[aiInstrumentHooks];\n    if (!aiHook) {\n        aiHook = {\n            i: 0,\n            n: funcName,\n            f: fn,\n            h: []\n        };\n        var newFunc = _createFunctionHook(aiHook);\n        newFunc[aiInstrumentHooks] = aiHook;\n        owner[funcName] = newFunc;\n    }\n    var theHook = {\n        id: aiHook.i,\n        cbks: callbacks,\n        rm: function () {\n            var id = this.id;\n            _arrLoop(aiHook.h, function (hook, idx) {\n                if (hook.id === id) {\n                    aiHook.h[_DYN_SPLICE ](idx, 1);\n                    return 1;\n                }\n            });\n        }\n    };\n    aiHook.i++;\n    aiHook.h[_DYN_PUSH$2 ](theHook);\n    return theHook;\n}\nfunction InstrumentFunc(target, funcName, callbacks, checkPrototype, checkParentProto) {\n    if (checkPrototype === void 0) { checkPrototype = true; }\n    if (target && funcName && callbacks) {\n        var owner = _getOwner(target, funcName, checkPrototype, checkParentProto);\n        if (owner) {\n            var fn = owner[funcName];\n            if (typeof fn === strShimFunction) {\n                return _createInstrumentHook(owner, funcName, fn, callbacks);\n            }\n        }\n    }\n    return null;\n}\nfunction InstrumentEvent(target, evtName, callbacks, checkPrototype, checkParentProto) {\n    if (target && evtName && callbacks) {\n        var owner = _getOwner(target, evtName, checkPrototype, checkParentProto) || target;\n        if (owner) {\n            return _createInstrumentHook(owner, evtName, owner[evtName], callbacks);\n        }\n    }\n    return null;\n}\n\nvar DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\nvar SampleRate = \"sampleRate\";\nvar ProcessLegacy = \"ProcessLegacy\";\nvar HttpMethod = \"http.method\";\nvar DEFAULT_BREEZE_ENDPOINT = \"https://dc.services.visualstudio.com\";\nvar DEFAULT_BREEZE_PATH = \"/v2/track\";\nvar strNotSpecified = \"not_specified\";\nvar strIkey = \"iKey\";\n\nvar RequestHeaders = createValueMap({\n    requestContextHeader: [0 , \"Request-Context\"],\n    requestContextTargetKey: [1 , \"appId\"],\n    requestContextAppIdFormat: [2 , \"appId=cid-v1:\"],\n    requestIdHeader: [3 , \"Request-Id\"],\n    traceParentHeader: [4 , \"traceparent\"],\n    traceStateHeader: [5 , \"tracestate\"],\n    sdkContextHeader: [6 , \"Sdk-Context\"],\n    sdkContextHeaderAppIdRequest: [7 , \"appId\"],\n    requestContextHeaderLowerCase: [8 , \"request-context\"]\n});\n\nvar _DYN_SPLIT = \"split\";\nvar _DYN_LENGTH$4 = \"length\";\nvar _DYN_TO_LOWER_CASE$1 = \"toLowerCase\";\nvar _DYN_INGESTIONENDPOINT = \"ingestionendpoint\";\nvar _DYN_TO_STRING$2 = \"toString\";\nvar _DYN_PUSH$1 = \"push\";\nvar _DYN_REMOVE_ITEM = \"removeItem\";\nvar _DYN_NAME$2 = \"name\";\nvar _DYN_MESSAGE$1 = \"message\";\nvar _DYN_COUNT$1 = \"count\";\nvar _DYN_PRE_TRIGGER_DATE = \"preTriggerDate\";\nvar _DYN_DISABLED = \"disabled\";\nvar _DYN_INTERVAL = \"interval\";\nvar _DYN_DAYS_OF_MONTH = \"daysOfMonth\";\nvar _DYN_DATE = \"date\";\nvar _DYN_GET_UTCDATE = \"getUTCDate\";\nvar _DYN_STRINGIFY$1 = \"stringify\";\nvar _DYN_PATHNAME = \"pathname\";\nvar _DYN_CORRELATION_HEADER_E0 = \"correlationHeaderExcludePatterns\";\nvar _DYN_EXCEPTIONS = \"exceptions\";\nvar _DYN_PARSED_STACK = \"parsedStack\";\nvar _DYN_PROPERTIES$1 = \"properties\";\nvar _DYN_MEASUREMENTS$1 = \"measurements\";\nvar _DYN_SIZE_IN_BYTES = \"sizeInBytes\";\nvar _DYN_TYPE_NAME = \"typeName\";\nvar _DYN_SEVERITY_LEVEL = \"severityLevel\";\nvar _DYN_PROBLEM_GROUP = \"problemGroup\";\nvar _DYN_IS_MANUAL = \"isManual\";\nvar _DYN__CREATE_FROM_INTERFA1 = \"CreateFromInterface\";\nvar _DYN_ASSEMBLY = \"assembly\";\nvar _DYN_FILE_NAME = \"fileName\";\nvar _DYN_HAS_FULL_STACK = \"hasFullStack\";\nvar _DYN_LEVEL = \"level\";\nvar _DYN_METHOD$1 = \"method\";\nvar _DYN_LINE = \"line\";\nvar _DYN_DURATION$1 = \"duration\";\nvar _DYN_RECEIVED_RESPONSE = \"receivedResponse\";\n\nfunction dataSanitizeKeyAndAddUniqueness(logger, key, map) {\n    var origLength = key[_DYN_LENGTH$4 ];\n    var field = dataSanitizeKey(logger, key);\n    if (field[_DYN_LENGTH$4 ] !== origLength) {\n        var i = 0;\n        var uniqueField = field;\n        while (map[uniqueField] !== undefined) {\n            i++;\n            uniqueField = strSubstring(field, 0, 150  - 3) + dsPadNumber(i);\n        }\n        field = uniqueField;\n    }\n    return field;\n}\nfunction dataSanitizeKey(logger, name) {\n    var nameTrunc;\n    if (name) {\n        name = strTrim(asString(name));\n        if (name[_DYN_LENGTH$4 ] > 150 ) {\n            nameTrunc = strSubstring(name, 0, 150 );\n            _throwInternal(logger, 2 , 57 , \"name is too long.  It has been truncated to \" + 150  + \" characters.\", { name: name }, true);\n        }\n    }\n    return nameTrunc || name;\n}\nfunction dataSanitizeString(logger, value, maxLength) {\n    if (maxLength === void 0) { maxLength = 1024 ; }\n    var valueTrunc;\n    if (value) {\n        maxLength = maxLength ? maxLength : 1024 ;\n        value = strTrim(asString(value));\n        if (value[_DYN_LENGTH$4 ] > maxLength) {\n            valueTrunc = strSubstring(value, 0, maxLength);\n            _throwInternal(logger, 2 , 61 , \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n        }\n    }\n    return valueTrunc || value;\n}\nfunction dataSanitizeUrl(logger, url) {\n    return dataSanitizeInput(logger, url, 2048 , 66 );\n}\nfunction dataSanitizeMessage(logger, message) {\n    var messageTrunc;\n    if (message) {\n        if (message[_DYN_LENGTH$4 ] > 32768 ) {\n            messageTrunc = strSubstring(message, 0, 32768 );\n            _throwInternal(logger, 2 , 56 , \"message is too long, it has been truncated to \" + 32768  + \" characters.\", { message: message }, true);\n        }\n    }\n    return messageTrunc || message;\n}\nfunction dataSanitizeException(logger, exception) {\n    var exceptionTrunc;\n    if (exception) {\n        var value = \"\" + exception;\n        if (value[_DYN_LENGTH$4 ] > 32768 ) {\n            exceptionTrunc = strSubstring(value, 0, 32768 );\n            _throwInternal(logger, 2 , 52 , \"exception is too long, it has been truncated to \" + 32768  + \" characters.\", { exception: exception }, true);\n        }\n    }\n    return exceptionTrunc || exception;\n}\nfunction dataSanitizeProperties(logger, properties) {\n    if (properties) {\n        var tempProps_1 = {};\n        objForEachKey(properties, function (prop, value) {\n            if (isObject(value) && hasJSON()) {\n                try {\n                    value = getJSON()[_DYN_STRINGIFY$1 ](value);\n                }\n                catch (e) {\n                    _throwInternal(logger, 2 , 49 , \"custom property is not valid\", { exception: e }, true);\n                }\n            }\n            value = dataSanitizeString(logger, value, 8192 );\n            prop = dataSanitizeKeyAndAddUniqueness(logger, prop, tempProps_1);\n            tempProps_1[prop] = value;\n        });\n        properties = tempProps_1;\n    }\n    return properties;\n}\nfunction dataSanitizeMeasurements(logger, measurements) {\n    if (measurements) {\n        var tempMeasurements_1 = {};\n        objForEachKey(measurements, function (measure, value) {\n            measure = dataSanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements_1);\n            tempMeasurements_1[measure] = value;\n        });\n        measurements = tempMeasurements_1;\n    }\n    return measurements;\n}\nfunction dataSanitizeId(logger, id) {\n    return id ? dataSanitizeInput(logger, id, 128 , 69 )[_DYN_TO_STRING$2 ]() : id;\n}\nfunction dataSanitizeInput(logger, input, maxLength, _msgId) {\n    var inputTrunc;\n    if (input) {\n        input = strTrim(asString(input));\n        if (input[_DYN_LENGTH$4 ] > maxLength) {\n            inputTrunc = strSubstring(input, 0, maxLength);\n            _throwInternal(logger, 2 , _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n        }\n    }\n    return inputTrunc || input;\n}\nfunction dsPadNumber(num) {\n    var s = \"00\" + num;\n    return strSubstr(s, s[_DYN_LENGTH$4 ] - 3);\n}\n\nvar _document = getDocument() || {};\nvar _htmlAnchorIdx = 0;\nvar _htmlAnchorElement = [null, null, null, null, null];\nfunction urlParseUrl(url) {\n    var anchorIdx = _htmlAnchorIdx;\n    var anchorCache = _htmlAnchorElement;\n    var tempAnchor = anchorCache[anchorIdx];\n    if (!_document.createElement) {\n        tempAnchor = { host: urlParseHost(url, true) };\n    }\n    else if (!anchorCache[anchorIdx]) {\n        tempAnchor = anchorCache[anchorIdx] = _document.createElement(\"a\");\n    }\n    tempAnchor.href = url;\n    anchorIdx++;\n    if (anchorIdx >= anchorCache[_DYN_LENGTH$4 ]) {\n        anchorIdx = 0;\n    }\n    _htmlAnchorIdx = anchorIdx;\n    return tempAnchor;\n}\nfunction urlGetAbsoluteUrl(url) {\n    var result;\n    var a = urlParseUrl(url);\n    if (a) {\n        result = a.href;\n    }\n    return result;\n}\nfunction urlGetCompleteUrl(method, absoluteUrl) {\n    if (method) {\n        return method.toUpperCase() + \" \" + absoluteUrl;\n    }\n    return absoluteUrl;\n}\nfunction urlParseHost(url, inclPort) {\n    var fullHost = urlParseFullHost(url, inclPort) || \"\";\n    if (fullHost) {\n        var match = fullHost.match(/(www\\d{0,5}\\.)?([^\\/:]{1,256})(:\\d{1,20})?/i);\n        if (match != null && match[_DYN_LENGTH$4 ] > 3 && isString(match[2]) && match[2][_DYN_LENGTH$4 ] > 0) {\n            return match[2] + (match[3] || \"\");\n        }\n    }\n    return fullHost;\n}\nfunction urlParseFullHost(url, inclPort) {\n    var result = null;\n    if (url) {\n        var match = url.match(/(\\w{1,150}):\\/\\/([^\\/:]{1,256})(:\\d{1,20})?/i);\n        if (match != null && match[_DYN_LENGTH$4 ] > 2 && isString(match[2]) && match[2][_DYN_LENGTH$4 ] > 0) {\n            result = match[2] || \"\";\n            if (inclPort && match[_DYN_LENGTH$4 ] > 2) {\n                var protocol = (match[1] || \"\")[_DYN_TO_LOWER_CASE$1 ]();\n                var port = match[3] || \"\";\n                if (protocol === \"http\" && port === \":80\") {\n                    port = \"\";\n                }\n                else if (protocol === \"https\" && port === \":443\") {\n                    port = \"\";\n                }\n                result += port;\n            }\n        }\n    }\n    return result;\n}\n\nvar _internalEndpoints = [\n    DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH,\n    \"https://breeze.aimon.applicationinsights.io\" + DEFAULT_BREEZE_PATH,\n    \"https://dc-int.services.visualstudio.com\" + DEFAULT_BREEZE_PATH\n];\nvar _correlationIdPrefix = \"cid-v1:\";\nfunction isInternalApplicationInsightsEndpoint(endpointUrl) {\n    return arrIndexOf(_internalEndpoints, endpointUrl[_DYN_TO_LOWER_CASE$1 ]()) !== -1;\n}\nfunction correlationIdCanIncludeCorrelationHeader(config, requestUrl, currentHost) {\n    if (!requestUrl || (config && config.disableCorrelationHeaders)) {\n        return false;\n    }\n    if (config && config[_DYN_CORRELATION_HEADER_E0 ]) {\n        for (var i = 0; i < config.correlationHeaderExcludePatterns[_DYN_LENGTH$4 ]; i++) {\n            if (config[_DYN_CORRELATION_HEADER_E0 ][i].test(requestUrl)) {\n                return false;\n            }\n        }\n    }\n    var requestHost = urlParseUrl(requestUrl).host[_DYN_TO_LOWER_CASE$1 ]();\n    if (requestHost && (strIndexOf(requestHost, \":443\") !== -1 || strIndexOf(requestHost, \":80\") !== -1)) {\n        requestHost = (urlParseFullHost(requestUrl, true) || \"\")[_DYN_TO_LOWER_CASE$1 ]();\n    }\n    if ((!config || !config.enableCorsCorrelation) && (requestHost && requestHost !== currentHost)) {\n        return false;\n    }\n    var includedDomains = config && config.correlationHeaderDomains;\n    if (includedDomains) {\n        var matchExists_1;\n        arrForEach(includedDomains, function (domain) {\n            var regex = new RegExp(domain.toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n            matchExists_1 = matchExists_1 || regex.test(requestHost);\n        });\n        if (!matchExists_1) {\n            return false;\n        }\n    }\n    var excludedDomains = config && config.correlationHeaderExcludedDomains;\n    if (!excludedDomains || excludedDomains[_DYN_LENGTH$4 ] === 0) {\n        return true;\n    }\n    for (var i = 0; i < excludedDomains[_DYN_LENGTH$4 ]; i++) {\n        var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n        if (regex.test(requestHost)) {\n            return false;\n        }\n    }\n    return requestHost && requestHost[_DYN_LENGTH$4 ] > 0;\n}\nfunction correlationIdGetCorrelationContext(responseHeader) {\n    if (responseHeader) {\n        var correlationId = correlationIdGetCorrelationContextValue(responseHeader, RequestHeaders[1 ]);\n        if (correlationId && correlationId !== _correlationIdPrefix) {\n            return correlationId;\n        }\n    }\n}\nfunction correlationIdGetCorrelationContextValue(responseHeader, key) {\n    if (responseHeader) {\n        var keyValues = responseHeader[_DYN_SPLIT ](\",\");\n        for (var i = 0; i < keyValues[_DYN_LENGTH$4 ]; ++i) {\n            var keyValue = keyValues[i][_DYN_SPLIT ](\"=\");\n            if (keyValue[_DYN_LENGTH$4 ] === 2 && keyValue[0] === key) {\n                return keyValue[1];\n            }\n        }\n    }\n}\nfunction AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName) {\n    var target, name = commandName, data = commandName;\n    if (absoluteUrl && absoluteUrl[_DYN_LENGTH$4 ] > 0) {\n        var parsedUrl = urlParseUrl(absoluteUrl);\n        target = parsedUrl.host;\n        if (!name) {\n            if (parsedUrl[_DYN_PATHNAME ] != null) {\n                var pathName = (parsedUrl.pathname[_DYN_LENGTH$4 ] === 0) ? \"/\" : parsedUrl[_DYN_PATHNAME ];\n                if (pathName.charAt(0) !== \"/\") {\n                    pathName = \"/\" + pathName;\n                }\n                data = parsedUrl[_DYN_PATHNAME ];\n                name = dataSanitizeString(logger, method ? method + \" \" + pathName : pathName);\n            }\n            else {\n                name = dataSanitizeString(logger, absoluteUrl);\n            }\n        }\n    }\n    else {\n        target = commandName;\n        name = commandName;\n    }\n    return {\n        target: target,\n        name: name,\n        data: data\n    };\n}\nfunction dateTimeUtilsNow() {\n    var perf = getPerformance();\n    if (perf && perf.now && perf.timing) {\n        var now = perf.now() + perf.timing.navigationStart;\n        if (now > 0) {\n            return now;\n        }\n    }\n    return utcNow();\n}\nfunction dateTimeUtilsDuration(start, end) {\n    var result = null;\n    if (start !== 0 && end !== 0 && !isNullOrUndefined(start) && !isNullOrUndefined(end)) {\n        result = end - start;\n    }\n    return result;\n}\nfunction createDistributedTraceContextFromTrace(telemetryTrace, parentCtx) {\n    var trace = telemetryTrace || {};\n    return {\n        getName: function () {\n            return trace[_DYN_NAME$2 ];\n        },\n        setName: function (newValue) {\n            parentCtx && parentCtx.setName(newValue);\n            trace[_DYN_NAME$2 ] = newValue;\n        },\n        getTraceId: function () {\n            return trace.traceID;\n        },\n        setTraceId: function (newValue) {\n            parentCtx && parentCtx.setTraceId(newValue);\n            if (isValidTraceId(newValue)) {\n                trace.traceID = newValue;\n            }\n        },\n        getSpanId: function () {\n            return trace.parentID;\n        },\n        setSpanId: function (newValue) {\n            parentCtx && parentCtx.setSpanId(newValue);\n            if (isValidSpanId(newValue)) {\n                trace.parentID = newValue;\n            }\n        },\n        getTraceFlags: function () {\n            return trace.traceFlags;\n        },\n        setTraceFlags: function (newTraceFlags) {\n            parentCtx && parentCtx.setTraceFlags(newTraceFlags);\n            trace.traceFlags = newTraceFlags;\n        }\n    };\n}\n\nvar StorageType = createEnumStyle({\n    LocalStorage: 0 ,\n    SessionStorage: 1\n});\nvar DistributedTracingModes = createEnumStyle({\n    AI: 0 ,\n    AI_AND_W3C: 1 ,\n    W3C: 2\n});\n\nvar _canUseLocalStorage = undefined;\nvar _canUseSessionStorage = undefined;\nvar _storagePrefix = \"\";\nfunction _getLocalStorageObject() {\n    if (utlCanUseLocalStorage()) {\n        return _getVerifiedStorageObject(StorageType.LocalStorage);\n    }\n    return null;\n}\nfunction _getVerifiedStorageObject(storageType) {\n    try {\n        if (isNullOrUndefined(getGlobal())) {\n            return null;\n        }\n        var uid = (new Date)[_DYN_TO_STRING$2 ]();\n        var storage = getInst(storageType === StorageType.LocalStorage ? \"localStorage\" : \"sessionStorage\");\n        var name_1 = _storagePrefix + uid;\n        storage.setItem(name_1, uid);\n        var fail = storage.getItem(name_1) !== uid;\n        storage[_DYN_REMOVE_ITEM ](name_1);\n        if (!fail) {\n            return storage;\n        }\n    }\n    catch (exception) {\n    }\n    return null;\n}\nfunction _getSessionStorageObject() {\n    if (utlCanUseSessionStorage()) {\n        return _getVerifiedStorageObject(StorageType.SessionStorage);\n    }\n    return null;\n}\nfunction utlDisableStorage() {\n    _canUseLocalStorage = false;\n    _canUseSessionStorage = false;\n}\nfunction utlSetStoragePrefix(storagePrefix) {\n    _storagePrefix = storagePrefix || \"\";\n}\nfunction utlEnableStorage() {\n    _canUseLocalStorage = utlCanUseLocalStorage(true);\n    _canUseSessionStorage = utlCanUseSessionStorage(true);\n}\nfunction utlCanUseLocalStorage(reset) {\n    if (reset || _canUseLocalStorage === undefined) {\n        _canUseLocalStorage = !!_getVerifiedStorageObject(StorageType.LocalStorage);\n    }\n    return _canUseLocalStorage;\n}\nfunction utlGetLocalStorage(logger, name) {\n    var storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            return storage.getItem(name);\n        }\n        catch (e) {\n            _canUseLocalStorage = false;\n            _throwInternal(logger, 2 , 1 , \"Browser failed read of local storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return null;\n}\nfunction utlSetLocalStorage(logger, name, data) {\n    var storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            storage.setItem(name, data);\n            return true;\n        }\n        catch (e) {\n            _canUseLocalStorage = false;\n            _throwInternal(logger, 2 , 3 , \"Browser failed write to local storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\nfunction utlRemoveStorage(logger, name) {\n    var storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            storage[_DYN_REMOVE_ITEM ](name);\n            return true;\n        }\n        catch (e) {\n            _canUseLocalStorage = false;\n            _throwInternal(logger, 2 , 5 , \"Browser failed removal of local storage item. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\nfunction utlCanUseSessionStorage(reset) {\n    if (reset || _canUseSessionStorage === undefined) {\n        _canUseSessionStorage = !!_getVerifiedStorageObject(StorageType.SessionStorage);\n    }\n    return _canUseSessionStorage;\n}\nfunction utlGetSessionStorage(logger, name) {\n    var storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            return storage.getItem(name);\n        }\n        catch (e) {\n            _canUseSessionStorage = false;\n            _throwInternal(logger, 2 , 2 , \"Browser failed read of session storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return null;\n}\nfunction utlSetSessionStorage(logger, name, data) {\n    var storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            storage.setItem(name, data);\n            return true;\n        }\n        catch (e) {\n            _canUseSessionStorage = false;\n            _throwInternal(logger, 2 , 4 , \"Browser failed write to session storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\nfunction utlRemoveSessionStorage(logger, name) {\n    var storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            storage[_DYN_REMOVE_ITEM ](name);\n            return true;\n        }\n        catch (e) {\n            _canUseSessionStorage = false;\n            _throwInternal(logger, 2 , 6 , \"Browser failed removal of session storage item. \" + getExceptionName(e), { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\n\nvar THROTTLE_STORAGE_PREFIX = \"appInsightsThrottle\";\nvar ThrottleMgr = /** @class */ (function () {\n    function ThrottleMgr(core, namePrefix) {\n        var _self = this;\n        var _canUseLocalStorage;\n        var _logger;\n        var _config;\n        var _localStorageObj;\n        var _isTriggered;\n        var _namePrefix;\n        var _queue;\n        var _isReady = false;\n        var _isSpecificDaysGiven = false;\n        _initConfig();\n        _self[\"_getDbgPlgTargets\"] = function () {\n            return [_queue];\n        };\n        _self.getConfig = function () {\n            return _config;\n        };\n        _self.canThrottle = function (msgId) {\n            var localObj = _getLocalStorageObjByKey(msgId);\n            var cfg = _getCfgByKey(msgId);\n            return _canThrottle(cfg, _canUseLocalStorage, localObj);\n        };\n        _self.isTriggered = function (msgId) {\n            return _isTrigger(msgId);\n        };\n        _self.isReady = function () {\n            return _isReady;\n        };\n        _self.flush = function (msgId) {\n            try {\n                var queue = _getQueueByKey(msgId);\n                if (queue && queue[_DYN_LENGTH$4 ] > 0) {\n                    var items = queue.slice(0);\n                    _queue[msgId] = [];\n                    arrForEach(items, function (item) {\n                        _flushMessage(item.msgID, item[_DYN_MESSAGE$1 ], item.severity, false);\n                    });\n                    return true;\n                }\n            }\n            catch (err) {\n            }\n            return false;\n        };\n        _self.flushAll = function () {\n            try {\n                if (_queue) {\n                    var result_1 = true;\n                    objForEachKey(_queue, function (key) {\n                        var isFlushed = _self.flush(parseInt(key));\n                        result_1 = result_1 && isFlushed;\n                    });\n                    return result_1;\n                }\n            }\n            catch (err) {\n            }\n            return false;\n        };\n        _self.onReadyState = function (isReady, flushAll) {\n            if (flushAll === void 0) { flushAll = true; }\n            _isReady = isNullOrUndefined(isReady) ? true : isReady;\n            if (_isReady && flushAll) {\n                return _self.flushAll();\n            }\n            return null;\n        };\n        _self.sendMessage = function (msgID, message, severity) {\n            return _flushMessage(msgID, message, severity, true);\n        };\n        function _flushMessage(msgID, message, severity, saveUnsentMsg) {\n            if (_isReady) {\n                var isSampledIn = _canSampledIn(msgID);\n                if (!isSampledIn) {\n                    return;\n                }\n                var cfg = _getCfgByKey(msgID);\n                var localStorageObj = _getLocalStorageObjByKey(msgID);\n                var canThrottle = _canThrottle(cfg, _canUseLocalStorage, localStorageObj);\n                var throttled = false;\n                var number = 0;\n                var isTriggered = _isTrigger(msgID);\n                try {\n                    if (canThrottle && !isTriggered) {\n                        number = Math.min(cfg.limit.maxSendNumber, localStorageObj[_DYN_COUNT$1 ] + 1);\n                        localStorageObj[_DYN_COUNT$1 ] = 0;\n                        throttled = true;\n                        _isTriggered[msgID] = true;\n                        localStorageObj[_DYN_PRE_TRIGGER_DATE ] = new Date();\n                    }\n                    else {\n                        _isTriggered[msgID] = canThrottle;\n                        localStorageObj[_DYN_COUNT$1 ] += 1;\n                    }\n                    var localStorageName = _getLocalStorageName(msgID);\n                    _resetLocalStorage(_logger, localStorageName, localStorageObj);\n                    for (var i = 0; i < number; i++) {\n                        _sendMessage(msgID, _logger, message, severity);\n                    }\n                }\n                catch (e) {\n                }\n                return {\n                    isThrottled: throttled,\n                    throttleNum: number\n                };\n            }\n            else {\n                if (!!saveUnsentMsg) {\n                    var queue = _getQueueByKey(msgID);\n                    queue[_DYN_PUSH$1 ]({\n                        msgID: msgID,\n                        message: message,\n                        severity: severity\n                    });\n                }\n            }\n            return null;\n        }\n        function _initConfig() {\n            _logger = safeGetLogger(core);\n            _isTriggered = {};\n            _localStorageObj = {};\n            _queue = {};\n            _config = {};\n            _setCfgByKey(109 );\n            _namePrefix = isNotNullOrUndefined(namePrefix) ? namePrefix : \"\";\n            core.addUnloadHook(onConfigChange(core.config, function (details) {\n                var coreConfig = details.cfg;\n                _canUseLocalStorage = utlCanUseLocalStorage();\n                var configMgr = coreConfig.throttleMgrCfg || {};\n                objForEachKey(configMgr, function (key, cfg) {\n                    _setCfgByKey(parseInt(key), cfg);\n                });\n            }));\n        }\n        function _getCfgByKey(msgID) {\n            return _config[msgID] || _config[109 ];\n        }\n        function _setCfgByKey(msgID, config) {\n            var _a, _b;\n            try {\n                var cfg = config || {};\n                var curCfg = {};\n                curCfg[_DYN_DISABLED ] = !!cfg[_DYN_DISABLED ];\n                var configInterval = cfg[_DYN_INTERVAL ] || {};\n                _isSpecificDaysGiven = (configInterval === null || configInterval === void 0 ? void 0 : configInterval.daysOfMonth) && (configInterval === null || configInterval === void 0 ? void 0 : configInterval.daysOfMonth[_DYN_LENGTH$4 ]) > 0;\n                curCfg[_DYN_INTERVAL ] = _getIntervalConfig(configInterval);\n                var limit = {\n                    samplingRate: ((_a = cfg.limit) === null || _a === void 0 ? void 0 : _a.samplingRate) || 100,\n                    maxSendNumber: ((_b = cfg.limit) === null || _b === void 0 ? void 0 : _b.maxSendNumber) || 1\n                };\n                curCfg.limit = limit;\n                _config[msgID] = curCfg;\n            }\n            catch (e) {\n            }\n        }\n        function _getIntervalConfig(interval) {\n            interval = interval || {};\n            var monthInterval = interval === null || interval === void 0 ? void 0 : interval.monthInterval;\n            var dayInterval = interval === null || interval === void 0 ? void 0 : interval.dayInterval;\n            if (isNullOrUndefined(monthInterval) && isNullOrUndefined(dayInterval)) {\n                interval.monthInterval = 3;\n                if (!_isSpecificDaysGiven) {\n                    interval[_DYN_DAYS_OF_MONTH ] = [28];\n                    _isSpecificDaysGiven = true;\n                }\n            }\n            interval = {\n                monthInterval: interval === null || interval === void 0 ? void 0 : interval.monthInterval,\n                dayInterval: interval === null || interval === void 0 ? void 0 : interval.dayInterval,\n                daysOfMonth: interval === null || interval === void 0 ? void 0 : interval.daysOfMonth\n            };\n            return interval;\n        }\n        function _canThrottle(config, canUseLocalStorage, localStorageObj) {\n            if (config && !config[_DYN_DISABLED ] && canUseLocalStorage && isNotNullOrUndefined(localStorageObj)) {\n                var curDate = _getThrottleDate();\n                var date = localStorageObj[_DYN_DATE ];\n                var interval = config[_DYN_INTERVAL ];\n                var monthCheck = 1;\n                if (interval === null || interval === void 0 ? void 0 : interval.monthInterval) {\n                    var monthExpand = (curDate.getUTCFullYear() - date.getUTCFullYear()) * 12 + curDate.getUTCMonth() - date.getUTCMonth();\n                    monthCheck = _checkInterval(interval.monthInterval, 0, monthExpand);\n                }\n                var dayCheck = 1;\n                if (_isSpecificDaysGiven) {\n                    dayCheck = arrIndexOf(interval[_DYN_DAYS_OF_MONTH ], curDate[_DYN_GET_UTCDATE ]());\n                }\n                else if (interval === null || interval === void 0 ? void 0 : interval.dayInterval) {\n                    var daySpan = Math.floor((curDate.getTime() - date.getTime()) / 86400000);\n                    dayCheck = _checkInterval(interval.dayInterval, 0, daySpan);\n                }\n                return monthCheck >= 0 && dayCheck >= 0;\n            }\n            return false;\n        }\n        function _getLocalStorageName(msgKey, prefix) {\n            var fix = isNotNullOrUndefined(prefix) ? prefix : \"\";\n            if (msgKey) {\n                return THROTTLE_STORAGE_PREFIX + fix + \"-\" + msgKey;\n            }\n            return null;\n        }\n        function _isTriggeredOnCurDate(preTriggerDate) {\n            try {\n                if (preTriggerDate) {\n                    var curDate = new Date();\n                    return preTriggerDate.getUTCFullYear() === curDate.getUTCFullYear() &&\n                        preTriggerDate.getUTCMonth() === curDate.getUTCMonth() &&\n                        preTriggerDate[_DYN_GET_UTCDATE ]() === curDate[_DYN_GET_UTCDATE ]();\n                }\n            }\n            catch (e) {\n            }\n            return false;\n        }\n        function _getLocalStorageObj(value, logger, storageName) {\n            try {\n                var storageObj = {\n                    date: _getThrottleDate(),\n                    count: 0\n                };\n                if (value) {\n                    var obj = JSON.parse(value);\n                    var curObj = {\n                        date: _getThrottleDate(obj[_DYN_DATE ]) || storageObj[_DYN_DATE ],\n                        count: obj[_DYN_COUNT$1 ] || storageObj[_DYN_COUNT$1 ],\n                        preTriggerDate: obj.preTriggerDate ? _getThrottleDate(obj[_DYN_PRE_TRIGGER_DATE ]) : undefined\n                    };\n                    return curObj;\n                }\n                else {\n                    _resetLocalStorage(logger, storageName, storageObj);\n                    return storageObj;\n                }\n            }\n            catch (e) {\n            }\n            return null;\n        }\n        function _getThrottleDate(dateStr) {\n            try {\n                if (dateStr) {\n                    var date = new Date(dateStr);\n                    if (!isNaN(date.getDate())) {\n                        return date;\n                    }\n                }\n                else {\n                    return new Date();\n                }\n            }\n            catch (e) {\n            }\n            return null;\n        }\n        function _resetLocalStorage(logger, storageName, obj) {\n            try {\n                return utlSetLocalStorage(logger, storageName, strTrim(JSON[_DYN_STRINGIFY$1 ](obj)));\n            }\n            catch (e) {\n            }\n            return false;\n        }\n        function _checkInterval(interval, start, current) {\n            if (interval <= 0) {\n                return 1;\n            }\n            return (current >= start) && (current - start) % interval == 0 ? Math.floor((current - start) / interval) + 1 : -1;\n        }\n        function _sendMessage(msgID, logger, message, severity) {\n            _throwInternal(logger, severity || 1 , msgID, message);\n        }\n        function _canSampledIn(msgID) {\n            try {\n                var cfg = _getCfgByKey(msgID);\n                return randomValue(1000000) <= cfg.limit.samplingRate;\n            }\n            catch (e) {\n            }\n            return false;\n        }\n        function _getLocalStorageObjByKey(key) {\n            try {\n                var curObj = _localStorageObj[key];\n                if (!curObj) {\n                    var localStorageName = _getLocalStorageName(key, _namePrefix);\n                    curObj = _getLocalStorageObj(utlGetLocalStorage(_logger, localStorageName), _logger, localStorageName);\n                    _localStorageObj[key] = curObj;\n                }\n                return _localStorageObj[key];\n            }\n            catch (e) {\n            }\n            return null;\n        }\n        function _isTrigger(key) {\n            var isTrigger = _isTriggered[key];\n            if (isNullOrUndefined(isTrigger)) {\n                isTrigger = false;\n                var localStorageObj = _getLocalStorageObjByKey(key);\n                if (localStorageObj) {\n                    isTrigger = _isTriggeredOnCurDate(localStorageObj[_DYN_PRE_TRIGGER_DATE ]);\n                }\n                _isTriggered[key] = isTrigger;\n            }\n            return _isTriggered[key];\n        }\n        function _getQueueByKey(key) {\n            _queue = _queue || {};\n            if (isNullOrUndefined(_queue[key])) {\n                _queue[key] = [];\n            }\n            return _queue[key];\n        }\n    }\n    return ThrottleMgr;\n}());\n\nvar _FIELDS_SEPARATOR = \";\";\nvar _FIELD_KEY_VALUE_SEPARATOR = \"=\";\nfunction parseConnectionString(connectionString) {\n    if (!connectionString) {\n        return {};\n    }\n    var kvPairs = connectionString[_DYN_SPLIT ](_FIELDS_SEPARATOR);\n    var result = arrReduce(kvPairs, function (fields, kv) {\n        var kvParts = kv[_DYN_SPLIT ](_FIELD_KEY_VALUE_SEPARATOR);\n        if (kvParts[_DYN_LENGTH$4 ] === 2) {\n            var key = kvParts[0][_DYN_TO_LOWER_CASE$1 ]();\n            var value = kvParts[1];\n            fields[key] = value;\n        }\n        return fields;\n    }, {});\n    if (objKeys(result)[_DYN_LENGTH$4 ] > 0) {\n        if (result.endpointsuffix) {\n            var locationPrefix = result.location ? result.location + \".\" : \"\";\n            result[_DYN_INGESTIONENDPOINT ] = result[_DYN_INGESTIONENDPOINT ] || (\"https://\" + locationPrefix + \"dc.\" + result.endpointsuffix);\n        }\n        result[_DYN_INGESTIONENDPOINT ] = result[_DYN_INGESTIONENDPOINT ] || DEFAULT_BREEZE_ENDPOINT;\n        if (strEndsWith(result[_DYN_INGESTIONENDPOINT ], \"/\")) {\n            result[_DYN_INGESTIONENDPOINT ] = result[_DYN_INGESTIONENDPOINT ].slice(0, -1);\n        }\n    }\n    return result;\n}\n\nvar Envelope = /** @class */ (function () {\n    function Envelope(logger, data, name) {\n        var _this = this;\n        var _self = this;\n        _self.ver = 1;\n        _self.sampleRate = 100.0;\n        _self.tags = {};\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        _self.data = data;\n        _self.time = toISOString(new Date());\n        _self.aiDataContract = {\n            time: 1 ,\n            iKey: 1 ,\n            name: 1 ,\n            sampleRate: function () {\n                return (_this.sampleRate === 100) ? 4  : 1 ;\n            },\n            tags: 1 ,\n            data: 1\n        };\n    }\n    return Envelope;\n}());\n\nvar Event$1 = /** @class */ (function () {\n    function Event(logger, name, properties, measurements) {\n        this.aiDataContract = {\n            ver: 1 ,\n            name: 1 ,\n            properties: 0 ,\n            measurements: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        _self[_DYN_PROPERTIES$1 ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n    Event.dataType = \"EventData\";\n    return Event;\n}());\n\nvar NoMethod = \"<no_method>\";\nvar strError = \"error\";\nvar strStack = \"stack\";\nvar strStackDetails = \"stackDetails\";\nvar strErrorSrc = \"errorSrc\";\nvar strMessage = \"message\";\nvar strDescription = \"description\";\nfunction _stringify(value, convertToString) {\n    var result = value;\n    if (result && !isString(result)) {\n        if (JSON && JSON[_DYN_STRINGIFY$1 ]) {\n            result = JSON[_DYN_STRINGIFY$1 ](value);\n            if (convertToString && (!result || result === \"{}\")) {\n                if (isFunction(value[_DYN_TO_STRING$2 ])) {\n                    result = value[_DYN_TO_STRING$2 ]();\n                }\n                else {\n                    result = \"\" + value;\n                }\n            }\n        }\n        else {\n            result = \"\" + value + \" - (Missing JSON.stringify)\";\n        }\n    }\n    return result || \"\";\n}\nfunction _formatMessage(theEvent, errorType) {\n    var evtMessage = theEvent;\n    if (theEvent) {\n        if (evtMessage && !isString(evtMessage)) {\n            evtMessage = theEvent[strMessage] || theEvent[strDescription] || evtMessage;\n        }\n        if (evtMessage && !isString(evtMessage)) {\n            evtMessage = _stringify(evtMessage, true);\n        }\n        if (theEvent[\"filename\"]) {\n            evtMessage = evtMessage + \" @\" + (theEvent[\"filename\"] || \"\") + \":\" + (theEvent[\"lineno\"] || \"?\") + \":\" + (theEvent[\"colno\"] || \"?\");\n        }\n    }\n    if (errorType && errorType !== \"String\" && errorType !== \"Object\" && errorType !== \"Error\" && strIndexOf(evtMessage || \"\", errorType) === -1) {\n        evtMessage = errorType + \": \" + evtMessage;\n    }\n    return evtMessage || \"\";\n}\nfunction _isExceptionDetailsInternal(value) {\n    try {\n        if (isObject(value)) {\n            return \"hasFullStack\" in value && \"typeName\" in value;\n        }\n    }\n    catch (e) {\n    }\n    return false;\n}\nfunction _isExceptionInternal(value) {\n    try {\n        if (isObject(value)) {\n            return (\"ver\" in value && \"exceptions\" in value && \"properties\" in value);\n        }\n    }\n    catch (e) {\n    }\n    return false;\n}\nfunction _isStackDetails(details) {\n    return details && details.src && isString(details.src) && details.obj && isArray(details.obj);\n}\nfunction _convertStackObj(errorStack) {\n    var src = errorStack || \"\";\n    if (!isString(src)) {\n        if (isString(src[strStack])) {\n            src = src[strStack];\n        }\n        else {\n            src = \"\" + src;\n        }\n    }\n    var items = src[_DYN_SPLIT ](\"\\n\");\n    return {\n        src: src,\n        obj: items\n    };\n}\nfunction _getOperaStack(errorMessage) {\n    var stack = [];\n    var lines = errorMessage[_DYN_SPLIT ](\"\\n\");\n    for (var lp = 0; lp < lines[_DYN_LENGTH$4 ]; lp++) {\n        var entry = lines[lp];\n        if (lines[lp + 1]) {\n            entry += \"@\" + lines[lp + 1];\n            lp++;\n        }\n        stack[_DYN_PUSH$1 ](entry);\n    }\n    return {\n        src: errorMessage,\n        obj: stack\n    };\n}\nfunction _getStackFromErrorObj(errorObj) {\n    var details = null;\n    if (errorObj) {\n        try {\n            if (errorObj[strStack]) {\n                details = _convertStackObj(errorObj[strStack]);\n            }\n            else if (errorObj[strError] && errorObj[strError][strStack]) {\n                details = _convertStackObj(errorObj[strError][strStack]);\n            }\n            else if (errorObj[\"exception\"] && errorObj.exception[strStack]) {\n                details = _convertStackObj(errorObj.exception[strStack]);\n            }\n            else if (_isStackDetails(errorObj)) {\n                details = errorObj;\n            }\n            else if (_isStackDetails(errorObj[strStackDetails])) {\n                details = errorObj[strStackDetails];\n            }\n            else if (getWindow() && getWindow()[\"opera\"] && errorObj[strMessage]) {\n                details = _getOperaStack(errorObj[_DYN_MESSAGE$1 ]);\n            }\n            else if (errorObj[\"reason\"] && errorObj.reason[strStack]) {\n                details = _convertStackObj(errorObj.reason[strStack]);\n            }\n            else if (isString(errorObj)) {\n                details = _convertStackObj(errorObj);\n            }\n            else {\n                var evtMessage = errorObj[strMessage] || errorObj[strDescription] || \"\";\n                if (isString(errorObj[strErrorSrc])) {\n                    if (evtMessage) {\n                        evtMessage += \"\\n\";\n                    }\n                    evtMessage += \" from \" + errorObj[strErrorSrc];\n                }\n                if (evtMessage) {\n                    details = _convertStackObj(evtMessage);\n                }\n            }\n        }\n        catch (e) {\n            details = _convertStackObj(e);\n        }\n    }\n    return details || {\n        src: \"\",\n        obj: null\n    };\n}\nfunction _formatStackTrace(stackDetails) {\n    var stack = \"\";\n    if (stackDetails) {\n        if (stackDetails.obj) {\n            arrForEach(stackDetails.obj, function (entry) {\n                stack += entry + \"\\n\";\n            });\n        }\n        else {\n            stack = stackDetails.src || \"\";\n        }\n    }\n    return stack;\n}\nfunction _parseStack(stack) {\n    var parsedStack;\n    var frames = stack.obj;\n    if (frames && frames[_DYN_LENGTH$4 ] > 0) {\n        parsedStack = [];\n        var level_1 = 0;\n        var totalSizeInBytes_1 = 0;\n        arrForEach(frames, function (frame) {\n            var theFrame = frame[_DYN_TO_STRING$2 ]();\n            if (_StackFrame.regex.test(theFrame)) {\n                var parsedFrame = new _StackFrame(theFrame, level_1++);\n                totalSizeInBytes_1 += parsedFrame[_DYN_SIZE_IN_BYTES ];\n                parsedStack[_DYN_PUSH$1 ](parsedFrame);\n            }\n        });\n        var exceptionParsedStackThreshold = 32 * 1024;\n        if (totalSizeInBytes_1 > exceptionParsedStackThreshold) {\n            var left = 0;\n            var right = parsedStack[_DYN_LENGTH$4 ] - 1;\n            var size = 0;\n            var acceptedLeft = left;\n            var acceptedRight = right;\n            while (left < right) {\n                var lSize = parsedStack[left][_DYN_SIZE_IN_BYTES ];\n                var rSize = parsedStack[right][_DYN_SIZE_IN_BYTES ];\n                size += lSize + rSize;\n                if (size > exceptionParsedStackThreshold) {\n                    var howMany = acceptedRight - acceptedLeft + 1;\n                    parsedStack.splice(acceptedLeft, howMany);\n                    break;\n                }\n                acceptedLeft = left;\n                acceptedRight = right;\n                left++;\n                right--;\n            }\n        }\n    }\n    return parsedStack;\n}\nfunction _getErrorType(errorType) {\n    var typeName = \"\";\n    if (errorType) {\n        typeName = errorType.typeName || errorType[_DYN_NAME$2 ] || \"\";\n        if (!typeName) {\n            try {\n                var funcNameRegex = /function (.{1,200})\\(/;\n                var results = (funcNameRegex).exec((errorType).constructor[_DYN_TO_STRING$2 ]());\n                typeName = (results && results[_DYN_LENGTH$4 ] > 1) ? results[1] : \"\";\n            }\n            catch (e) {\n            }\n        }\n    }\n    return typeName;\n}\nfunction _formatErrorCode(errorObj) {\n    if (errorObj) {\n        try {\n            if (!isString(errorObj)) {\n                var errorType = _getErrorType(errorObj);\n                var result = _stringify(errorObj, false);\n                if (!result || result === \"{}\") {\n                    if (errorObj[strError]) {\n                        errorObj = errorObj[strError];\n                        errorType = _getErrorType(errorObj);\n                    }\n                    result = _stringify(errorObj, true);\n                }\n                if (strIndexOf(result, errorType) !== 0 && errorType !== \"String\") {\n                    return errorType + \":\" + result;\n                }\n                return result;\n            }\n        }\n        catch (e) {\n        }\n    }\n    return \"\" + (errorObj || \"\");\n}\nvar Exception = /** @class */ (function () {\n    function Exception(logger, exception, properties, measurements, severityLevel, id) {\n        this.aiDataContract = {\n            ver: 1 ,\n            exceptions: 1 ,\n            severityLevel: 0 ,\n            properties: 0 ,\n            measurements: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        if (!_isExceptionInternal(exception)) {\n            if (!properties) {\n                properties = {};\n            }\n            _self[_DYN_EXCEPTIONS ] = [new _ExceptionDetails(logger, exception, properties)];\n            _self[_DYN_PROPERTIES$1 ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n            if (severityLevel) {\n                _self[_DYN_SEVERITY_LEVEL ] = severityLevel;\n            }\n            if (id) {\n                _self.id = id;\n            }\n        }\n        else {\n            _self[_DYN_EXCEPTIONS ] = exception[_DYN_EXCEPTIONS ] || [];\n            _self[_DYN_PROPERTIES$1 ] = exception[_DYN_PROPERTIES$1 ];\n            _self[_DYN_MEASUREMENTS$1 ] = exception[_DYN_MEASUREMENTS$1 ];\n            if (exception[_DYN_SEVERITY_LEVEL ]) {\n                _self[_DYN_SEVERITY_LEVEL ] = exception[_DYN_SEVERITY_LEVEL ];\n            }\n            if (exception.id) {\n                _self.id = exception.id;\n            }\n            if (exception[_DYN_PROBLEM_GROUP ]) {\n                _self[_DYN_PROBLEM_GROUP ] = exception[_DYN_PROBLEM_GROUP ];\n            }\n            if (!isNullOrUndefined(exception[_DYN_IS_MANUAL ])) {\n                _self[_DYN_IS_MANUAL ] = exception[_DYN_IS_MANUAL ];\n            }\n        }\n    }\n    Exception.CreateAutoException = function (message, url, lineNumber, columnNumber, error, evt, stack, errorSrc) {\n        var _a;\n        var errorType = _getErrorType(error || evt || message);\n        return _a = {},\n            _a[_DYN_MESSAGE$1 ] = _formatMessage(message, errorType),\n            _a.url = url,\n            _a.lineNumber = lineNumber,\n            _a.columnNumber = columnNumber,\n            _a.error = _formatErrorCode(error || evt || message),\n            _a.evt = _formatErrorCode(evt || message),\n            _a[_DYN_TYPE_NAME ] = errorType,\n            _a.stackDetails = _getStackFromErrorObj(stack || error || evt),\n            _a.errorSrc = errorSrc,\n            _a;\n    };\n    Exception.CreateFromInterface = function (logger, exception, properties, measurements) {\n        var exceptions = exception[_DYN_EXCEPTIONS ]\n            && arrMap(exception[_DYN_EXCEPTIONS ], function (ex) { return _ExceptionDetails[_DYN__CREATE_FROM_INTERFA1 ](logger, ex); });\n        var exceptionData = new Exception(logger, __assignFn(__assignFn({}, exception), { exceptions: exceptions }), properties, measurements);\n        return exceptionData;\n    };\n    Exception.prototype.toInterface = function () {\n        var _a;\n        var _b = this, exceptions = _b.exceptions, properties = _b.properties, measurements = _b.measurements, severityLevel = _b.severityLevel, problemGroup = _b.problemGroup, id = _b.id, isManual = _b.isManual;\n        var exceptionDetailsInterface = exceptions instanceof Array\n            && arrMap(exceptions, function (exception) { return exception.toInterface(); })\n            || undefined;\n        return _a = {\n                ver: \"4.0\"\n            },\n            _a[_DYN_EXCEPTIONS ] = exceptionDetailsInterface,\n            _a.severityLevel = severityLevel,\n            _a.properties = properties,\n            _a.measurements = measurements,\n            _a.problemGroup = problemGroup,\n            _a.id = id,\n            _a.isManual = isManual,\n            _a;\n    };\n    Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n        var _a;\n        return {\n            exceptions: [\n                (_a = {},\n                    _a[_DYN_HAS_FULL_STACK ] = true,\n                    _a.message = message,\n                    _a.stack = details,\n                    _a.typeName = typeName,\n                    _a)\n            ]\n        };\n    };\n    Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n    Exception.dataType = \"ExceptionData\";\n    Exception.formatError = _formatErrorCode;\n    return Exception;\n}());\nvar _ExceptionDetails = /** @class */ (function () {\n    function _ExceptionDetails(logger, exception, properties) {\n        this.aiDataContract = {\n            id: 0 ,\n            outerId: 0 ,\n            typeName: 1 ,\n            message: 1 ,\n            hasFullStack: 0 ,\n            stack: 0 ,\n            parsedStack: 2\n        };\n        var _self = this;\n        if (!_isExceptionDetailsInternal(exception)) {\n            var error = exception;\n            var evt = error && error.evt;\n            if (!isError(error)) {\n                error = error[strError] || evt || error;\n            }\n            _self[_DYN_TYPE_NAME ] = dataSanitizeString(logger, _getErrorType(error)) || strNotSpecified;\n            _self[_DYN_MESSAGE$1 ] = dataSanitizeMessage(logger, _formatMessage(exception || error, _self[_DYN_TYPE_NAME ])) || strNotSpecified;\n            var stack = exception[strStackDetails] || _getStackFromErrorObj(exception);\n            _self[_DYN_PARSED_STACK ] = _parseStack(stack);\n            if (isArray(_self[_DYN_PARSED_STACK ])) {\n                arrMap(_self[_DYN_PARSED_STACK ], function (frame) {\n                    frame[_DYN_ASSEMBLY ] = dataSanitizeString(logger, frame[_DYN_ASSEMBLY ]);\n                    frame[_DYN_FILE_NAME ] = dataSanitizeString(logger, frame[_DYN_FILE_NAME ]);\n                });\n            }\n            _self[strStack] = dataSanitizeException(logger, _formatStackTrace(stack));\n            _self.hasFullStack = isArray(_self.parsedStack) && _self.parsedStack[_DYN_LENGTH$4 ] > 0;\n            if (properties) {\n                properties[_DYN_TYPE_NAME ] = properties[_DYN_TYPE_NAME ] || _self[_DYN_TYPE_NAME ];\n            }\n        }\n        else {\n            _self[_DYN_TYPE_NAME ] = exception[_DYN_TYPE_NAME ];\n            _self[_DYN_MESSAGE$1 ] = exception[_DYN_MESSAGE$1 ];\n            _self[strStack] = exception[strStack];\n            _self[_DYN_PARSED_STACK ] = exception[_DYN_PARSED_STACK ] || [];\n            _self[_DYN_HAS_FULL_STACK ] = exception[_DYN_HAS_FULL_STACK ];\n        }\n    }\n    _ExceptionDetails.prototype.toInterface = function () {\n        var _a;\n        var _self = this;\n        var parsedStack = _self[_DYN_PARSED_STACK ] instanceof Array\n            && arrMap(_self[_DYN_PARSED_STACK ], function (frame) { return frame.toInterface(); });\n        var exceptionDetailsInterface = (_a = {\n                id: _self.id,\n                outerId: _self.outerId,\n                typeName: _self[_DYN_TYPE_NAME ],\n                message: _self[_DYN_MESSAGE$1 ],\n                hasFullStack: _self[_DYN_HAS_FULL_STACK ],\n                stack: _self[strStack]\n            },\n            _a[_DYN_PARSED_STACK ] = parsedStack || undefined,\n            _a);\n        return exceptionDetailsInterface;\n    };\n    _ExceptionDetails.CreateFromInterface = function (logger, exception) {\n        var parsedStack = (exception[_DYN_PARSED_STACK ] instanceof Array\n            && arrMap(exception[_DYN_PARSED_STACK ], function (frame) { return _StackFrame[_DYN__CREATE_FROM_INTERFA1 ](frame); }))\n            || exception[_DYN_PARSED_STACK ];\n        var exceptionDetails = new _ExceptionDetails(logger, __assignFn(__assignFn({}, exception), { parsedStack: parsedStack }));\n        return exceptionDetails;\n    };\n    return _ExceptionDetails;\n}());\nvar _StackFrame = /** @class */ (function () {\n    function _StackFrame(sourceFrame, level) {\n        this.aiDataContract = {\n            level: 1 ,\n            method: 1 ,\n            assembly: 0 ,\n            fileName: 0 ,\n            line: 0\n        };\n        var _self = this;\n        _self[_DYN_SIZE_IN_BYTES ] = 0;\n        if (typeof sourceFrame === \"string\") {\n            var frame = sourceFrame;\n            _self[_DYN_LEVEL ] = level;\n            _self[_DYN_METHOD$1 ] = NoMethod;\n            _self[_DYN_ASSEMBLY ] = strTrim(frame);\n            _self[_DYN_FILE_NAME ] = \"\";\n            _self[_DYN_LINE ] = 0;\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches[_DYN_LENGTH$4 ] >= 5) {\n                _self[_DYN_METHOD$1 ] = strTrim(matches[2]) || _self[_DYN_METHOD$1 ];\n                _self[_DYN_FILE_NAME ] = strTrim(matches[4]);\n                _self[_DYN_LINE ] = parseInt(matches[5]) || 0;\n            }\n        }\n        else {\n            _self[_DYN_LEVEL ] = sourceFrame[_DYN_LEVEL ];\n            _self[_DYN_METHOD$1 ] = sourceFrame[_DYN_METHOD$1 ];\n            _self[_DYN_ASSEMBLY ] = sourceFrame[_DYN_ASSEMBLY ];\n            _self[_DYN_FILE_NAME ] = sourceFrame[_DYN_FILE_NAME ];\n            _self[_DYN_LINE ] = sourceFrame[_DYN_LINE ];\n            _self[_DYN_SIZE_IN_BYTES ] = 0;\n        }\n        _self.sizeInBytes += _self.method[_DYN_LENGTH$4 ];\n        _self.sizeInBytes += _self.fileName[_DYN_LENGTH$4 ];\n        _self.sizeInBytes += _self.assembly[_DYN_LENGTH$4 ];\n        _self[_DYN_SIZE_IN_BYTES ] += _StackFrame.baseSize;\n        _self.sizeInBytes += _self.level.toString()[_DYN_LENGTH$4 ];\n        _self.sizeInBytes += _self.line.toString()[_DYN_LENGTH$4 ];\n    }\n    _StackFrame.CreateFromInterface = function (frame) {\n        return new _StackFrame(frame, null );\n    };\n    _StackFrame.prototype.toInterface = function () {\n        var _self = this;\n        return {\n            level: _self[_DYN_LEVEL ],\n            method: _self[_DYN_METHOD$1 ],\n            assembly: _self[_DYN_ASSEMBLY ],\n            fileName: _self[_DYN_FILE_NAME ],\n            line: _self[_DYN_LINE ]\n        };\n    };\n    _StackFrame.regex = /^([\\s]+at)?[\\s]{0,50}([^\\@\\()]+?)[\\s]{0,50}(\\@|\\()([^\\(\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n    _StackFrame.baseSize = 58;\n    return _StackFrame;\n}());\n\nvar DataPoint = /** @class */ (function () {\n    function DataPoint() {\n        this.aiDataContract = {\n            name: 1 ,\n            kind: 0 ,\n            value: 1 ,\n            count: 0 ,\n            min: 0 ,\n            max: 0 ,\n            stdDev: 0\n        };\n        this.kind = 0 ;\n    }\n    return DataPoint;\n}());\n\nvar Metric = /** @class */ (function () {\n    function Metric(logger, name, value, count, min, max, stdDev, properties, measurements) {\n        this.aiDataContract = {\n            ver: 1 ,\n            metrics: 1 ,\n            properties: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        var dataPoint = new DataPoint();\n        dataPoint[_DYN_COUNT$1 ] = count > 0 ? count : undefined;\n        dataPoint.max = isNaN(max) || max === null ? undefined : max;\n        dataPoint.min = isNaN(min) || min === null ? undefined : min;\n        dataPoint[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        dataPoint.value = value;\n        dataPoint.stdDev = isNaN(stdDev) || stdDev === null ? undefined : stdDev;\n        _self.metrics = [dataPoint];\n        _self[_DYN_PROPERTIES$1 ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n    Metric.dataType = \"MetricData\";\n    return Metric;\n}());\n\nvar strEmpty = \"\";\nfunction msToTimeSpan(totalms) {\n    if (isNaN(totalms) || totalms < 0) {\n        totalms = 0;\n    }\n    totalms = Math.round(totalms);\n    var ms = strEmpty + totalms % 1000;\n    var sec = strEmpty + Math.floor(totalms / 1000) % 60;\n    var min = strEmpty + Math.floor(totalms / (1000 * 60)) % 60;\n    var hour = strEmpty + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n    var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n    ms = ms[_DYN_LENGTH$4 ] === 1 ? \"00\" + ms : ms[_DYN_LENGTH$4 ] === 2 ? \"0\" + ms : ms;\n    sec = sec[_DYN_LENGTH$4 ] < 2 ? \"0\" + sec : sec;\n    min = min[_DYN_LENGTH$4 ] < 2 ? \"0\" + min : min;\n    hour = hour[_DYN_LENGTH$4 ] < 2 ? \"0\" + hour : hour;\n    return (days > 0 ? days + \".\" : strEmpty) + hour + \":\" + min + \":\" + sec + \".\" + ms;\n}\nfunction isCrossOriginError(message, url, lineNumber, columnNumber, error) {\n    return !error && isString(message) && (message === \"Script error.\" || message === \"Script error\");\n}\n\nvar PageView = /** @class */ (function () {\n    function PageView(logger, name, url, durationMs, properties, measurements, id) {\n        this.aiDataContract = {\n            ver: 1 ,\n            name: 0 ,\n            url: 0 ,\n            duration: 0 ,\n            properties: 0 ,\n            measurements: 0 ,\n            id: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self.id = dataSanitizeId(logger, id);\n        _self.url = dataSanitizeUrl(logger, url);\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        if (!isNaN(durationMs)) {\n            _self[_DYN_DURATION$1 ] = msToTimeSpan(durationMs);\n        }\n        _self[_DYN_PROPERTIES$1 ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n    PageView.dataType = \"PageviewData\";\n    return PageView;\n}());\n\nvar RemoteDependencyData = /** @class */ (function () {\n    function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, requestAPI, correlationContext, properties, measurements) {\n        if (requestAPI === void 0) { requestAPI = \"Ajax\"; }\n        this.aiDataContract = {\n            id: 1 ,\n            ver: 1 ,\n            name: 0 ,\n            resultCode: 0 ,\n            duration: 0 ,\n            success: 0 ,\n            data: 0 ,\n            target: 0 ,\n            type: 0 ,\n            properties: 0 ,\n            measurements: 0 ,\n            kind: 0 ,\n            value: 0 ,\n            count: 0 ,\n            min: 0 ,\n            max: 0 ,\n            stdDev: 0 ,\n            dependencyKind: 0 ,\n            dependencySource: 0 ,\n            commandName: 0 ,\n            dependencyTypeName: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self.id = id;\n        _self[_DYN_DURATION$1 ] = msToTimeSpan(value);\n        _self.success = success;\n        _self.resultCode = resultCode + \"\";\n        _self.type = dataSanitizeString(logger, requestAPI);\n        var dependencyFields = AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName);\n        _self.data = dataSanitizeUrl(logger, commandName) || dependencyFields.data;\n        _self.target = dataSanitizeString(logger, dependencyFields.target);\n        if (correlationContext) {\n            _self.target = \"\".concat(_self.target, \" | \").concat(correlationContext);\n        }\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, dependencyFields[_DYN_NAME$2 ]);\n        _self[_DYN_PROPERTIES$1 ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n    }\n    RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n    RemoteDependencyData.dataType = \"RemoteDependencyData\";\n    return RemoteDependencyData;\n}());\n\nvar Trace = /** @class */ (function () {\n    function Trace(logger, message, severityLevel, properties, measurements) {\n        this.aiDataContract = {\n            ver: 1 ,\n            message: 1 ,\n            severityLevel: 0 ,\n            properties: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        message = message || strNotSpecified;\n        _self[_DYN_MESSAGE$1 ] = dataSanitizeMessage(logger, message);\n        _self[_DYN_PROPERTIES$1 ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        if (severityLevel) {\n            _self[_DYN_SEVERITY_LEVEL ] = severityLevel;\n        }\n    }\n    Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n    Trace.dataType = \"MessageData\";\n    return Trace;\n}());\n\nvar PageViewPerformance = /** @class */ (function () {\n    function PageViewPerformance(logger, name, url, unused, properties, measurements, cs4BaseData) {\n        this.aiDataContract = {\n            ver: 1 ,\n            name: 0 ,\n            url: 0 ,\n            duration: 0 ,\n            perfTotal: 0 ,\n            networkConnect: 0 ,\n            sentRequest: 0 ,\n            receivedResponse: 0 ,\n            domProcessing: 0 ,\n            properties: 0 ,\n            measurements: 0\n        };\n        var _self = this;\n        _self.ver = 2;\n        _self.url = dataSanitizeUrl(logger, url);\n        _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n        _self[_DYN_PROPERTIES$1 ] = dataSanitizeProperties(logger, properties);\n        _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        if (cs4BaseData) {\n            _self.domProcessing = cs4BaseData.domProcessing;\n            _self[_DYN_DURATION$1 ] = cs4BaseData[_DYN_DURATION$1 ];\n            _self.networkConnect = cs4BaseData.networkConnect;\n            _self.perfTotal = cs4BaseData.perfTotal;\n            _self[_DYN_RECEIVED_RESPONSE ] = cs4BaseData[_DYN_RECEIVED_RESPONSE ];\n            _self.sentRequest = cs4BaseData.sentRequest;\n        }\n    }\n    PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n    PageViewPerformance.dataType = \"PageviewPerformanceData\";\n    return PageViewPerformance;\n}());\n\nvar Data = /** @class */ (function () {\n    function Data(baseType, data) {\n        this.aiDataContract = {\n            baseType: 1 ,\n            baseData: 1\n        };\n        this.baseType = baseType;\n        this.baseData = data;\n    }\n    return Data;\n}());\n\nvar SeverityLevel = createEnumStyle({\n    Verbose: 0 ,\n    Information: 1 ,\n    Warning: 2 ,\n    Error: 3 ,\n    Critical: 4\n});\n\nfunction _aiNameFunc(baseName) {\n    var aiName = \"ai.\" + baseName + \".\";\n    return function (name) {\n        return aiName + name;\n    };\n}\nvar _aiApplication = _aiNameFunc(\"application\");\nvar _aiDevice = _aiNameFunc(\"device\");\nvar _aiLocation = _aiNameFunc(\"location\");\nvar _aiOperation = _aiNameFunc(\"operation\");\nvar _aiSession = _aiNameFunc(\"session\");\nvar _aiUser = _aiNameFunc(\"user\");\nvar _aiCloud = _aiNameFunc(\"cloud\");\nvar _aiInternal = _aiNameFunc(\"internal\");\nvar ContextTagKeys = /** @class */ (function (_super) {\n    __extendsFn(ContextTagKeys, _super);\n    function ContextTagKeys() {\n        return _super.call(this) || this;\n    }\n    return ContextTagKeys;\n}(createClassFromInterface({\n    applicationVersion: _aiApplication(\"ver\"),\n    applicationBuild: _aiApplication(\"build\"),\n    applicationTypeId: _aiApplication(\"typeId\"),\n    applicationId: _aiApplication(\"applicationId\"),\n    applicationLayer: _aiApplication(\"layer\"),\n    deviceId: _aiDevice(\"id\"),\n    deviceIp: _aiDevice(\"ip\"),\n    deviceLanguage: _aiDevice(\"language\"),\n    deviceLocale: _aiDevice(\"locale\"),\n    deviceModel: _aiDevice(\"model\"),\n    deviceFriendlyName: _aiDevice(\"friendlyName\"),\n    deviceNetwork: _aiDevice(\"network\"),\n    deviceNetworkName: _aiDevice(\"networkName\"),\n    deviceOEMName: _aiDevice(\"oemName\"),\n    deviceOS: _aiDevice(\"os\"),\n    deviceOSVersion: _aiDevice(\"osVersion\"),\n    deviceRoleInstance: _aiDevice(\"roleInstance\"),\n    deviceRoleName: _aiDevice(\"roleName\"),\n    deviceScreenResolution: _aiDevice(\"screenResolution\"),\n    deviceType: _aiDevice(\"type\"),\n    deviceMachineName: _aiDevice(\"machineName\"),\n    deviceVMName: _aiDevice(\"vmName\"),\n    deviceBrowser: _aiDevice(\"browser\"),\n    deviceBrowserVersion: _aiDevice(\"browserVersion\"),\n    locationIp: _aiLocation(\"ip\"),\n    locationCountry: _aiLocation(\"country\"),\n    locationProvince: _aiLocation(\"province\"),\n    locationCity: _aiLocation(\"city\"),\n    operationId: _aiOperation(\"id\"),\n    operationName: _aiOperation(\"name\"),\n    operationParentId: _aiOperation(\"parentId\"),\n    operationRootId: _aiOperation(\"rootId\"),\n    operationSyntheticSource: _aiOperation(\"syntheticSource\"),\n    operationCorrelationVector: _aiOperation(\"correlationVector\"),\n    sessionId: _aiSession(\"id\"),\n    sessionIsFirst: _aiSession(\"isFirst\"),\n    sessionIsNew: _aiSession(\"isNew\"),\n    userAccountAcquisitionDate: _aiUser(\"accountAcquisitionDate\"),\n    userAccountId: _aiUser(\"accountId\"),\n    userAgent: _aiUser(\"userAgent\"),\n    userId: _aiUser(\"id\"),\n    userStoreRegion: _aiUser(\"storeRegion\"),\n    userAuthUserId: _aiUser(\"authUserId\"),\n    userAnonymousUserAcquisitionDate: _aiUser(\"anonUserAcquisitionDate\"),\n    userAuthenticatedUserAcquisitionDate: _aiUser(\"authUserAcquisitionDate\"),\n    cloudName: _aiCloud(\"name\"),\n    cloudRole: _aiCloud(\"role\"),\n    cloudRoleVer: _aiCloud(\"roleVer\"),\n    cloudRoleInstance: _aiCloud(\"roleInstance\"),\n    cloudEnvironment: _aiCloud(\"environment\"),\n    cloudLocation: _aiCloud(\"location\"),\n    cloudDeploymentUnit: _aiCloud(\"deploymentUnit\"),\n    internalNodeName: _aiInternal(\"nodeName\"),\n    internalSdkVersion: _aiInternal(\"sdkVersion\"),\n    internalAgentVersion: _aiInternal(\"agentVersion\"),\n    internalSnippet: _aiInternal(\"snippet\"),\n    internalSdkSrc: _aiInternal(\"sdkSrc\")\n})));\n\nfunction createTelemetryItem(item, baseType, envelopeName, logger, customProperties, systemProperties) {\n    var _a;\n    envelopeName = dataSanitizeString(logger, envelopeName) || strNotSpecified;\n    if (isNullOrUndefined(item) ||\n        isNullOrUndefined(baseType) ||\n        isNullOrUndefined(envelopeName)) {\n        throwError(\"Input doesn't contain all required fields\");\n    }\n    var iKey = \"\";\n    if (item[strIkey]) {\n        iKey = item[strIkey];\n        delete item[strIkey];\n    }\n    var telemetryItem = (_a = {},\n        _a[_DYN_NAME$2 ] = envelopeName,\n        _a.time = toISOString(new Date()),\n        _a.iKey = iKey,\n        _a.ext = systemProperties ? systemProperties : {},\n        _a.tags = [],\n        _a.data = {},\n        _a.baseType = baseType,\n        _a.baseData = item\n    ,\n        _a);\n    if (!isNullOrUndefined(customProperties)) {\n        objForEachKey(customProperties, function (prop, value) {\n            telemetryItem.data[prop] = value;\n        });\n    }\n    return telemetryItem;\n}\n\nvar Extensions = {\n    UserExt: \"user\",\n    DeviceExt: \"device\",\n    TraceExt: \"trace\",\n    WebExt: \"web\",\n    AppExt: \"app\",\n    OSExt: \"os\",\n    SessionExt: \"ses\",\n    SDKExt: \"sdk\"\n};\nvar CtxTagKeys = new ContextTagKeys();\n\nfunction createDomEvent(eventName) {\n    var event = null;\n    if (isFunction(Event)) {\n        event = new Event(eventName);\n    }\n    else {\n        var doc = getDocument();\n        if (doc && doc.createEvent) {\n            event = doc.createEvent(\"Event\");\n            event.initEvent(eventName, true, true);\n        }\n    }\n    return event;\n}\n\nfunction _disableEvents(target, evtNamespace) {\n    eventOff(target, null, null, evtNamespace);\n}\nfunction createOfflineListener(parentEvtNamespace) {\n    var _document = getDocument();\n    var _navigator = getNavigator();\n    var _isListening = false;\n    var listenerList = [];\n    var rState = 1 ;\n    if (_navigator && !isNullOrUndefined(_navigator.onLine) && !_navigator.onLine) {\n        rState = 2 ;\n    }\n    var uState = 0 ;\n    var _currentState = calCurrentState();\n    var _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"OfflineListener\"), parentEvtNamespace);\n    try {\n        if (_enableEvents(getWindow())) {\n            _isListening = true;\n        }\n        if (_document) {\n            var target = _document.body || _document;\n            if (target.ononline) {\n                if (_enableEvents(target)) {\n                    _isListening = true;\n                }\n            }\n        }\n    }\n    catch (e) {\n        _isListening = false;\n    }\n    function _enableEvents(target) {\n        var enabled = false;\n        if (target) {\n            enabled = eventOn(target, \"online\", _setOnline, _evtNamespace);\n            if (enabled) {\n                eventOn(target, \"offline\", _setOffline, _evtNamespace);\n            }\n        }\n        return enabled;\n    }\n    function _isOnline() {\n        return _currentState;\n    }\n    function calCurrentState() {\n        if (uState === 2  || rState === 2 ) {\n            return false;\n        }\n        return true;\n    }\n    function listnerNoticeCheck() {\n        var newState = calCurrentState();\n        if (_currentState !== newState) {\n            _currentState = newState;\n            arrForEach(listenerList, function (callback) {\n                var offlineState = {\n                    isOnline: _currentState,\n                    rState: rState,\n                    uState: uState\n                };\n                try {\n                    callback(offlineState);\n                }\n                catch (e) {\n                }\n            });\n        }\n    }\n    function setOnlineState(newState) {\n        uState = newState;\n        listnerNoticeCheck();\n    }\n    function _setOnline() {\n        rState = 1 ;\n        listnerNoticeCheck();\n    }\n    function _setOffline() {\n        rState = 2 ;\n        listnerNoticeCheck();\n    }\n    function _unload() {\n        var win = getWindow();\n        if (win && _isListening) {\n            _disableEvents(win, _evtNamespace);\n            if (_document) {\n                var target = _document.body || _document;\n                if (!isUndefined(target.ononline)) {\n                    _disableEvents(target, _evtNamespace);\n                }\n            }\n            _isListening = false;\n        }\n    }\n    function addListener(callback) {\n        listenerList[_DYN_PUSH$1 ](callback);\n        return {\n            rm: function () {\n                var index = listenerList.indexOf(callback);\n                if (index > -1) {\n                    return listenerList.splice(index, 1);\n                }\n                else {\n                    return;\n                }\n            }\n        };\n    }\n    return {\n        isOnline: _isOnline,\n        isListening: function () { return _isListening; },\n        unload: _unload,\n        addListener: addListener,\n        setOnlineState: setOnlineState\n    };\n}\n\nvar PropertiesPluginIdentifier = \"AppInsightsPropertiesPlugin\";\nvar BreezeChannelIdentifier = \"AppInsightsChannelPlugin\";\nvar AnalyticsPluginIdentifier = \"ApplicationInsightsAnalytics\";\n\nvar _DYN_TO_STRING$1 = \"toString\";\nvar _DYN_IS_STORAGE_USE_DISAB0 = \"isStorageUseDisabled\";\nvar _DYN__ADD_HOOK$1 = \"_addHook\";\nvar _DYN_CORE$1 = \"core\";\nvar _DYN_DATA_TYPE$1 = \"dataType\";\nvar _DYN_ENVELOPE_TYPE$1 = \"envelopeType\";\nvar _DYN_DIAG_LOG$1 = \"diagLog\";\nvar _DYN_TRACK = \"track\";\nvar _DYN_TRACK_PAGE_VIEW = \"trackPageView\";\nvar _DYN_TRACK_PREVIOUS_PAGE_1 = \"trackPreviousPageVisit\";\nvar _DYN_SEND_PAGE_VIEW_INTER2 = \"sendPageViewInternal\";\nvar _DYN_START_TIME$1 = \"startTime\";\nvar _DYN_PROPERTIES = \"properties\";\nvar _DYN_DURATION = \"duration\";\nvar _DYN_SEND_PAGE_VIEW_PERFO3 = \"sendPageViewPerformanceInternal\";\nvar _DYN_POPULATE_PAGE_VIEW_P4 = \"populatePageViewPerformanceEvent\";\nvar _DYN_HREF = \"href\";\nvar _DYN_SEND_EXCEPTION_INTER5 = \"sendExceptionInternal\";\nvar _DYN_EXCEPTION$1 = \"exception\";\nvar _DYN_ERROR = \"error\";\nvar _DYN__ONERROR = \"_onerror\";\nvar _DYN_ERROR_SRC = \"errorSrc\";\nvar _DYN_LINE_NUMBER = \"lineNumber\";\nvar _DYN_COLUMN_NUMBER = \"columnNumber\";\nvar _DYN_MESSAGE = \"message\";\nvar _DYN__CREATE_AUTO_EXCEPTI6 = \"CreateAutoException\";\nvar _DYN_ADD_TELEMETRY_INITIA7 = \"addTelemetryInitializer\";\nvar _DYN_OVERRIDE_PAGE_VIEW_D8 = \"overridePageViewDuration\";\nvar _DYN_AUTO_TRACK_PAGE_VISI9 = \"autoTrackPageVisitTime\";\nvar _DYN_IS_BROWSER_LINK_TRAC10 = \"isBrowserLinkTrackingEnabled\";\nvar _DYN_LENGTH$3 = \"length\";\nvar _DYN_ENABLE_AUTO_ROUTE_TR11 = \"enableAutoRouteTracking\";\nvar _DYN_ENABLE_UNHANDLED_PRO12 = \"enableUnhandledPromiseRejectionTracking\";\nvar _DYN_AUTO_UNHANDLED_PROMI13 = \"autoUnhandledPromiseInstrumented\";\nvar _DYN_GET_ENTRIES_BY_TYPE = \"getEntriesByType\";\nvar _DYN_IS_PERFORMANCE_TIMIN14 = \"isPerformanceTimingSupported\";\nvar _DYN_GET_PERFORMANCE_TIMI15 = \"getPerformanceTiming\";\nvar _DYN_NAVIGATION_START = \"navigationStart\";\nvar _DYN_SHOULD_COLLECT_DURAT16 = \"shouldCollectDuration\";\nvar _DYN_IS_PERFORMANCE_TIMIN17 = \"isPerformanceTimingDataReady\";\nvar _DYN_RESPONSE_START = \"responseStart\";\nvar _DYN_REQUEST_START = \"requestStart\";\nvar _DYN_LOAD_EVENT_END = \"loadEventEnd\";\nvar _DYN_RESPONSE_END = \"responseEnd\";\nvar _DYN_CONNECT_END = \"connectEnd\";\nvar _DYN_PAGE_VISIT_START_TIM18 = \"pageVisitStartTime\";\n\nvar PageViewManager = /** @class */ (function () {\n    function PageViewManager(appInsights, overridePageViewDuration, core, pageViewPerformanceManager) {\n        dynamicProto(PageViewManager, this, function (_self) {\n            var queueTimer = null;\n            var itemQueue = [];\n            var pageViewPerformanceSent = false;\n            var firstPageViewSent = false;\n            var _logger;\n            if (core) {\n                _logger = core.logger;\n            }\n            function _flushChannels(isAsync) {\n                if (core) {\n                    core.flush(isAsync, function () {\n                    });\n                }\n            }\n            function _startTimer() {\n                if (!queueTimer) {\n                    queueTimer = scheduleTimeout((function () {\n                        queueTimer = null;\n                        var allItems = itemQueue.slice(0);\n                        var doFlush = false;\n                        itemQueue = [];\n                        arrForEach(allItems, function (item) {\n                            if (!item()) {\n                                itemQueue.push(item);\n                            }\n                            else {\n                                doFlush = true;\n                            }\n                        });\n                        if (itemQueue[_DYN_LENGTH$3 ] > 0) {\n                            _startTimer();\n                        }\n                        if (doFlush) {\n                            _flushChannels(true);\n                        }\n                    }), 100);\n                }\n            }\n            function _addQueue(cb) {\n                itemQueue.push(cb);\n                _startTimer();\n            }\n            _self[_DYN_TRACK_PAGE_VIEW ] = function (pageView, customProperties) {\n                var name = pageView.name;\n                if (isNullOrUndefined(name) || typeof name !== \"string\") {\n                    var doc = getDocument();\n                    name = pageView.name = doc && doc.title || \"\";\n                }\n                var uri = pageView.uri;\n                if (isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                    var location_1 = getLocation();\n                    uri = pageView.uri = location_1 && location_1[_DYN_HREF ] || \"\";\n                }\n                if (!firstPageViewSent) {\n                    var perf = getPerformance();\n                    var navigationEntries = (perf && perf[_DYN_GET_ENTRIES_BY_TYPE ] && perf[_DYN_GET_ENTRIES_BY_TYPE ](\"navigation\"));\n                    if (navigationEntries && navigationEntries[0] && !isUndefined(perf.timeOrigin)) {\n                        var loadEventStart = navigationEntries[0].loadEventStart;\n                        pageView[_DYN_START_TIME$1 ] = new Date(perf.timeOrigin + loadEventStart);\n                    }\n                    else {\n                        var duration_1 = ((customProperties || pageView[_DYN_PROPERTIES ] || {})[_DYN_DURATION ] || 0);\n                        pageView[_DYN_START_TIME$1 ] = new Date(new Date().getTime() - duration_1);\n                    }\n                    firstPageViewSent = true;\n                }\n                if (!pageViewPerformanceManager[_DYN_IS_PERFORMANCE_TIMIN14 ]()) {\n                    appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                    _flushChannels(true);\n                    if (!isWebWorker()) {\n                        _throwInternal(_logger, 2 , 25 , \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                    }\n                    return;\n                }\n                var pageViewSent = false;\n                var customDuration;\n                var start = pageViewPerformanceManager[_DYN_GET_PERFORMANCE_TIMI15 ]()[_DYN_NAVIGATION_START ];\n                if (start > 0) {\n                    customDuration = dateTimeUtilsDuration(start, +new Date);\n                    if (!pageViewPerformanceManager[_DYN_SHOULD_COLLECT_DURAT16 ](customDuration)) {\n                        customDuration = undefined;\n                    }\n                }\n                var duration;\n                if (!isNullOrUndefined(customProperties) &&\n                    !isNullOrUndefined(customProperties[_DYN_DURATION ])) {\n                    duration = customProperties[_DYN_DURATION ];\n                }\n                if (overridePageViewDuration || !isNaN(duration)) {\n                    if (isNaN(duration)) {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[_DYN_DURATION ] = customDuration;\n                    }\n                    appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                    _flushChannels(true);\n                    pageViewSent = true;\n                }\n                var maxDurationLimit = 60000;\n                if (!customProperties) {\n                    customProperties = {};\n                }\n                _addQueue(function () {\n                    var processed = false;\n                    try {\n                        if (pageViewPerformanceManager[_DYN_IS_PERFORMANCE_TIMIN17 ]()) {\n                            processed = true;\n                            var pageViewPerformance = {\n                                name: name,\n                                uri: uri\n                            };\n                            pageViewPerformanceManager[_DYN_POPULATE_PAGE_VIEW_P4 ](pageViewPerformance);\n                            if (!pageViewPerformance.isValid && !pageViewSent) {\n                                customProperties[_DYN_DURATION ] = customDuration;\n                                appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                            }\n                            else {\n                                if (!pageViewSent) {\n                                    customProperties[_DYN_DURATION ] = pageViewPerformance.durationMs;\n                                    appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                                }\n                                if (!pageViewPerformanceSent) {\n                                    appInsights[_DYN_SEND_PAGE_VIEW_PERFO3 ](pageViewPerformance, customProperties);\n                                    pageViewPerformanceSent = true;\n                                }\n                            }\n                        }\n                        else if (start > 0 && dateTimeUtilsDuration(start, +new Date) > maxDurationLimit) {\n                            processed = true;\n                            if (!pageViewSent) {\n                                customProperties[_DYN_DURATION ] = maxDurationLimit;\n                                appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                            }\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(_logger, 1 , 38 , \"trackPageView failed on page load calculation: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                    return processed;\n                });\n            };\n            _self.teardown = function (unloadCtx, unloadState) {\n                if (queueTimer) {\n                    queueTimer.cancel();\n                    queueTimer = null;\n                    var allItems = itemQueue.slice(0);\n                    itemQueue = [];\n                    arrForEach(allItems, function (item) {\n                        if (item()) ;\n                    });\n                }\n            };\n        });\n    }\n    PageViewManager.__ieDyn=1;\n    return PageViewManager;\n}());\n\nvar MAX_DURATION_ALLOWED = 3600000;\nvar botAgentNames = [\"googlebot\", \"adsbot-google\", \"apis-google\", \"mediapartners-google\"];\nfunction _isPerformanceTimingSupported() {\n    var perf = getPerformance();\n    return perf && !!perf.timing;\n}\nfunction _isPerformanceNavigationTimingSupported() {\n    var perf = getPerformance();\n    return perf && perf.getEntriesByType && perf.getEntriesByType(\"navigation\")[_DYN_LENGTH$3 ] > 0;\n}\nfunction _isPerformanceTimingDataReady() {\n    var perf = getPerformance();\n    var timing = perf ? perf.timing : 0;\n    return timing\n        && timing.domainLookupStart > 0\n        && timing[_DYN_NAVIGATION_START ] > 0\n        && timing[_DYN_RESPONSE_START ] > 0\n        && timing[_DYN_REQUEST_START ] > 0\n        && timing[_DYN_LOAD_EVENT_END ] > 0\n        && timing[_DYN_RESPONSE_END ] > 0\n        && timing[_DYN_CONNECT_END ] > 0\n        && timing.domLoading > 0;\n}\nfunction _getPerformanceTiming() {\n    if (_isPerformanceTimingSupported()) {\n        return getPerformance().timing;\n    }\n    return null;\n}\nfunction _getPerformanceNavigationTiming() {\n    if (_isPerformanceNavigationTimingSupported()) {\n        return getPerformance()[_DYN_GET_ENTRIES_BY_TYPE ](\"navigation\")[0];\n    }\n    return null;\n}\nfunction _shouldCollectDuration() {\n    var durations = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        durations[_i] = arguments[_i];\n    }\n    var _navigator = getNavigator() || {};\n    var userAgent = _navigator.userAgent;\n    var isGoogleBot = false;\n    if (userAgent) {\n        for (var i = 0; i < botAgentNames[_DYN_LENGTH$3 ]; i++) {\n            isGoogleBot = isGoogleBot || strIndexOf(userAgent.toLowerCase(), botAgentNames[i]) !== -1;\n        }\n    }\n    if (isGoogleBot) {\n        return false;\n    }\n    else {\n        for (var i = 0; i < durations[_DYN_LENGTH$3 ]; i++) {\n            if (durations[i] < 0 || durations[i] >= MAX_DURATION_ALLOWED) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nvar PageViewPerformanceManager = /** @class */ (function () {\n    function PageViewPerformanceManager(core) {\n        var _logger = safeGetLogger(core);\n        dynamicProto(PageViewPerformanceManager, this, function (_self) {\n            _self[_DYN_POPULATE_PAGE_VIEW_P4 ] = function (pageViewPerformance) {\n                pageViewPerformance.isValid = false;\n                var navigationTiming = _getPerformanceNavigationTiming();\n                var timing = _getPerformanceTiming();\n                var total = 0;\n                var network = 0;\n                var request = 0;\n                var response = 0;\n                var dom = 0;\n                if (navigationTiming || timing) {\n                    if (navigationTiming) {\n                        total = navigationTiming[_DYN_DURATION ];\n                        network = navigationTiming[_DYN_START_TIME$1 ] === 0 ? navigationTiming[_DYN_CONNECT_END ] : dateTimeUtilsDuration(navigationTiming[_DYN_START_TIME$1 ], navigationTiming[_DYN_CONNECT_END ]);\n                        request = dateTimeUtilsDuration(navigationTiming.requestStart, navigationTiming[_DYN_RESPONSE_START ]);\n                        response = dateTimeUtilsDuration(navigationTiming[_DYN_RESPONSE_START ], navigationTiming[_DYN_RESPONSE_END ]);\n                        dom = dateTimeUtilsDuration(navigationTiming.responseEnd, navigationTiming[_DYN_LOAD_EVENT_END ]);\n                    }\n                    else {\n                        total = dateTimeUtilsDuration(timing[_DYN_NAVIGATION_START ], timing[_DYN_LOAD_EVENT_END ]);\n                        network = dateTimeUtilsDuration(timing[_DYN_NAVIGATION_START ], timing[_DYN_CONNECT_END ]);\n                        request = dateTimeUtilsDuration(timing.requestStart, timing[_DYN_RESPONSE_START ]);\n                        response = dateTimeUtilsDuration(timing[_DYN_RESPONSE_START ], timing[_DYN_RESPONSE_END ]);\n                        dom = dateTimeUtilsDuration(timing.responseEnd, timing[_DYN_LOAD_EVENT_END ]);\n                    }\n                    if (total === 0) {\n                        _throwInternal(_logger, 2 , 10 , \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                    }\n                    else if (!_self[_DYN_SHOULD_COLLECT_DURAT16 ](total, network, request, response, dom)) {\n                        _throwInternal(_logger, 2 , 45 , \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                    }\n                    else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                        _throwInternal(_logger, 2 , 8 , \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                    }\n                    else {\n                        pageViewPerformance.durationMs = total;\n                        pageViewPerformance.perfTotal = pageViewPerformance[_DYN_DURATION ] = msToTimeSpan(total);\n                        pageViewPerformance.networkConnect = msToTimeSpan(network);\n                        pageViewPerformance.sentRequest = msToTimeSpan(request);\n                        pageViewPerformance.receivedResponse = msToTimeSpan(response);\n                        pageViewPerformance.domProcessing = msToTimeSpan(dom);\n                        pageViewPerformance.isValid = true;\n                    }\n                }\n            };\n            _self[_DYN_GET_PERFORMANCE_TIMI15 ] = _getPerformanceTiming;\n            _self[_DYN_IS_PERFORMANCE_TIMIN14 ] = _isPerformanceTimingSupported;\n            _self[_DYN_IS_PERFORMANCE_TIMIN17 ] = _isPerformanceTimingDataReady;\n            _self[_DYN_SHOULD_COLLECT_DURAT16 ] = _shouldCollectDuration;\n        });\n    }\n    PageViewPerformanceManager.__ieDyn=1;\n    return PageViewPerformanceManager;\n}());\n\nvar PageVisitTimeManager = /** @class */ (function () {\n    function PageVisitTimeManager(logger, pageVisitTimeTrackingHandler) {\n        var prevPageVisitDataKeyName = \"prevPageVisitData\";\n        dynamicProto(PageVisitTimeManager, this, function (_self) {\n            _self[_DYN_TRACK_PREVIOUS_PAGE_1 ] = function (currentPageName, currentPageUrl) {\n                try {\n                    var prevPageVisitTimeData = restartPageVisitTimer(currentPageName, currentPageUrl);\n                    if (prevPageVisitTimeData) {\n                        pageVisitTimeTrackingHandler(prevPageVisitTimeData.pageName, prevPageVisitTimeData.pageUrl, prevPageVisitTimeData.pageVisitTime);\n                    }\n                }\n                catch (e) {\n                    _warnToConsole(logger, \"Auto track page visit time failed, metric will not be collected: \" + dumpObj(e));\n                }\n            };\n            function restartPageVisitTimer(pageName, pageUrl) {\n                var prevPageVisitData = null;\n                try {\n                    prevPageVisitData = stopPageVisitTimer();\n                    if (utlCanUseSessionStorage()) {\n                        if (utlGetSessionStorage(logger, prevPageVisitDataKeyName) != null) {\n                            throwError(\"Cannot call startPageVisit consecutively without first calling stopPageVisit\");\n                        }\n                        var currPageVisitDataStr = getJSON().stringify(new PageVisitData(pageName, pageUrl));\n                        utlSetSessionStorage(logger, prevPageVisitDataKeyName, currPageVisitDataStr);\n                    }\n                }\n                catch (e) {\n                    _warnToConsole(logger, \"Call to restart failed: \" + dumpObj(e));\n                    prevPageVisitData = null;\n                }\n                return prevPageVisitData;\n            }\n            function stopPageVisitTimer() {\n                var prevPageVisitData = null;\n                try {\n                    if (utlCanUseSessionStorage()) {\n                        var pageVisitEndTime = utcNow();\n                        var pageVisitDataJsonStr = utlGetSessionStorage(logger, prevPageVisitDataKeyName);\n                        if (pageVisitDataJsonStr && hasJSON()) {\n                            prevPageVisitData = getJSON().parse(pageVisitDataJsonStr);\n                            prevPageVisitData.pageVisitTime = pageVisitEndTime - prevPageVisitData[_DYN_PAGE_VISIT_START_TIM18 ];\n                            utlRemoveSessionStorage(logger, prevPageVisitDataKeyName);\n                        }\n                    }\n                }\n                catch (e) {\n                    _warnToConsole(logger, \"Stop page visit timer failed: \" + dumpObj(e));\n                    prevPageVisitData = null;\n                }\n                return prevPageVisitData;\n            }\n            objDefine(_self, \"_logger\", { g: function () { return logger; } });\n            objDefine(_self, \"pageVisitTimeTrackingHandler\", { g: function () { return pageVisitTimeTrackingHandler; } });\n        });\n    }\n    PageVisitTimeManager.__ieDyn=1;\n    return PageVisitTimeManager;\n}());\nvar PageVisitData = /** @class */ (function () {\n    function PageVisitData(pageName, pageUrl) {\n        this[_DYN_PAGE_VISIT_START_TIM18 ] = utcNow();\n        this.pageName = pageName;\n        this.pageUrl = pageUrl;\n    }\n    return PageVisitData;\n}());\n\nvar Timing = /** @class */ (function () {\n    function Timing(logger, name) {\n        var _self = this;\n        var _events = {};\n        _self.start = function (name) {\n            if (typeof _events[name] !== \"undefined\") {\n                _throwInternal(logger, 2 , 62 , \"start was called more than once for this event without calling stop.\", { name: name, key: name }, true);\n            }\n            _events[name] = +new Date;\n        };\n        _self.stop = function (name, url, properties, measurements) {\n            var start = _events[name];\n            if (isNaN(start)) {\n                _throwInternal(logger, 2 , 63 , \"stop was called without a corresponding start.\", { name: name, key: name }, true);\n            }\n            else {\n                var end = +new Date;\n                var duration = dateTimeUtilsDuration(start, end);\n                _self.action(name, url, duration, properties, measurements);\n            }\n            delete _events[name];\n            _events[name] = undefined;\n        };\n    }\n    return Timing;\n}());\n\nvar _a$5;\nvar strEvent = \"event\";\nfunction _dispatchEvent(target, evnt) {\n    if (target && target.dispatchEvent && evnt) {\n        target.dispatchEvent(evnt);\n    }\n}\nfunction _getReason(error) {\n    if (error && error.reason) {\n        var reason = error.reason;\n        if (!isString(reason) && isFunction(reason[_DYN_TO_STRING$1 ])) {\n            return reason[_DYN_TO_STRING$1 ]();\n        }\n        return dumpObj(reason);\n    }\n    return error || \"\";\n}\nvar MinMilliSeconds = 60000;\nvar defaultValues = objDeepFreeze((_a$5 = {\n        sessionRenewalMs: cfgDfSet(_chkConfigMilliseconds, 30 * 60 * 1000),\n        sessionExpirationMs: cfgDfSet(_chkConfigMilliseconds, 24 * 60 * 60 * 1000),\n        disableExceptionTracking: cfgDfBoolean()\n    },\n    _a$5[_DYN_AUTO_TRACK_PAGE_VISI9 ] = cfgDfBoolean(),\n    _a$5[_DYN_OVERRIDE_PAGE_VIEW_D8 ] = cfgDfBoolean(),\n    _a$5[_DYN_ENABLE_UNHANDLED_PRO12 ] = cfgDfBoolean(),\n    _a$5[_DYN_AUTO_UNHANDLED_PROMI13 ] = false,\n    _a$5.samplingPercentage = cfgDfValidate(_chkSampling$1, 100),\n    _a$5[_DYN_IS_STORAGE_USE_DISAB0 ] = cfgDfBoolean(),\n    _a$5[_DYN_IS_BROWSER_LINK_TRAC10 ] = cfgDfBoolean(),\n    _a$5[_DYN_ENABLE_AUTO_ROUTE_TR11 ] = cfgDfBoolean(),\n    _a$5.namePrefix = cfgDfString(),\n    _a$5.enableDebug = cfgDfBoolean(),\n    _a$5.disableFlushOnBeforeUnload = cfgDfBoolean(),\n    _a$5.disableFlushOnUnload = cfgDfBoolean(false, \"disableFlushOnBeforeUnload\"),\n    _a$5));\nfunction _chkConfigMilliseconds(value, defValue) {\n    value = value || defValue;\n    if (value < MinMilliSeconds) {\n        value = MinMilliSeconds;\n    }\n    return +value;\n}\nfunction _chkSampling$1(value) {\n    return !isNaN(value) && value > 0 && value <= 100;\n}\nfunction _updateStorageUsage(extConfig) {\n    if (!isUndefined(extConfig[_DYN_IS_STORAGE_USE_DISAB0 ])) {\n        if (extConfig[_DYN_IS_STORAGE_USE_DISAB0 ]) {\n            utlDisableStorage();\n        }\n        else {\n            utlEnableStorage();\n        }\n    }\n}\nvar AnalyticsPlugin = /** @class */ (function (_super) {\n    __extendsFn(AnalyticsPlugin, _super);\n    function AnalyticsPlugin() {\n        var _this = _super.call(this) || this;\n        _this.identifier = AnalyticsPluginIdentifier;\n        _this.priority = 180;\n        _this.autoRoutePVDelay = 500;\n        var _eventTracking;\n        var _pageTracking;\n        var _pageViewManager;\n        var _pageViewPerformanceManager;\n        var _pageVisitTimeManager;\n        var _preInitTelemetryInitializers;\n        var _isBrowserLinkTrackingEnabled;\n        var _browserLinkInitializerAdded;\n        var _enableAutoRouteTracking;\n        var _historyListenerAdded;\n        var _disableExceptionTracking;\n        var _autoExceptionInstrumented;\n        var _enableUnhandledPromiseRejectionTracking;\n        var _autoUnhandledPromiseInstrumented;\n        var _extConfig;\n        var _autoTrackPageVisitTime;\n        var _prevUri;\n        var _currUri;\n        var _evtNamespace;\n        dynamicProto(AnalyticsPlugin, _this, function (_self, _base) {\n            var _addHook = _base[_DYN__ADD_HOOK$1 ];\n            _initDefaults();\n            _self.getCookieMgr = function () {\n                return safeGetCookieMgr(_self[_DYN_CORE$1 ]);\n            };\n            _self.processTelemetry = function (env, itemCtx) {\n                _self.processNext(env, itemCtx);\n            };\n            _self.trackEvent = function (event, customProperties) {\n                try {\n                    var telemetryItem = createTelemetryItem(event, Event$1[_DYN_DATA_TYPE$1 ], Event$1[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                    _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                }\n                catch (e) {\n                    _throwInternal(2 , 39 , \"trackTrace failed, trace will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.startTrackEvent = function (name) {\n                try {\n                    _eventTracking.start(name);\n                }\n                catch (e) {\n                    _throwInternal(1 , 29 , \"startTrackEvent failed, event will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.stopTrackEvent = function (name, properties, measurements) {\n                try {\n                    _eventTracking.stop(name, undefined, properties, measurements);\n                }\n                catch (e) {\n                    _throwInternal(1 , 30 , \"stopTrackEvent failed, event will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.trackTrace = function (trace, customProperties) {\n                try {\n                    var telemetryItem = createTelemetryItem(trace, Trace[_DYN_DATA_TYPE$1 ], Trace[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                    _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                }\n                catch (e) {\n                    _throwInternal(2 , 39 , \"trackTrace failed, trace will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.trackMetric = function (metric, customProperties) {\n                try {\n                    var telemetryItem = createTelemetryItem(metric, Metric[_DYN_DATA_TYPE$1 ], Metric[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                    _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                }\n                catch (e) {\n                    _throwInternal(1 , 36 , \"trackMetric failed, metric will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN_TRACK_PAGE_VIEW ] = function (pageView, customProperties) {\n                try {\n                    var inPv = pageView || {};\n                    _pageViewManager[_DYN_TRACK_PAGE_VIEW ](inPv, __assignFn(__assignFn(__assignFn({}, inPv.properties), inPv.measurements), customProperties));\n                    if (_autoTrackPageVisitTime) {\n                        _pageVisitTimeManager[_DYN_TRACK_PREVIOUS_PAGE_1 ](inPv.name, inPv.uri);\n                    }\n                }\n                catch (e) {\n                    _throwInternal(1 , 37 , \"trackPageView failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN_SEND_PAGE_VIEW_INTER2 ] = function (pageView, properties, systemProperties) {\n                var doc = getDocument();\n                if (doc) {\n                    pageView.refUri = pageView.refUri === undefined ? doc.referrer : pageView.refUri;\n                }\n                if (isNullOrUndefined(pageView[_DYN_START_TIME$1 ])) {\n                    var duration = ((properties || pageView[_DYN_PROPERTIES ] || {})[_DYN_DURATION ] || 0);\n                    pageView[_DYN_START_TIME$1 ] = new Date(new Date().getTime() - duration);\n                }\n                var telemetryItem = createTelemetryItem(pageView, PageView[_DYN_DATA_TYPE$1 ], PageView[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties, systemProperties);\n                _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n            };\n            _self[_DYN_SEND_PAGE_VIEW_PERFO3 ] = function (pageViewPerformance, properties, systemProperties) {\n                var telemetryItem = createTelemetryItem(pageViewPerformance, PageViewPerformance[_DYN_DATA_TYPE$1 ], PageViewPerformance[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties, systemProperties);\n                _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n            };\n            _self.trackPageViewPerformance = function (pageViewPerformance, customProperties) {\n                var inPvp = pageViewPerformance || {};\n                try {\n                    _pageViewPerformanceManager[_DYN_POPULATE_PAGE_VIEW_P4 ](inPvp);\n                    _self[_DYN_SEND_PAGE_VIEW_PERFO3 ](inPvp, customProperties);\n                }\n                catch (e) {\n                    _throwInternal(1 , 37 , \"trackPageViewPerformance failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.startTrackPage = function (name) {\n                try {\n                    if (typeof name !== \"string\") {\n                        var doc = getDocument();\n                        name = doc && doc.title || \"\";\n                    }\n                    _pageTracking.start(name);\n                }\n                catch (e) {\n                    _throwInternal(1 , 31 , \"startTrackPage failed, page view may not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self.stopTrackPage = function (name, url, properties, measurement) {\n                try {\n                    if (typeof name !== \"string\") {\n                        var doc = getDocument();\n                        name = doc && doc.title || \"\";\n                    }\n                    if (typeof url !== \"string\") {\n                        var loc = getLocation();\n                        url = loc && loc[_DYN_HREF ] || \"\";\n                    }\n                    _pageTracking.stop(name, url, properties, measurement);\n                    if (_autoTrackPageVisitTime) {\n                        _pageVisitTimeManager[_DYN_TRACK_PREVIOUS_PAGE_1 ](name, url);\n                    }\n                }\n                catch (e) {\n                    _throwInternal(1 , 32 , \"stopTrackPage failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN_SEND_EXCEPTION_INTER5 ] = function (exception, customProperties, systemProperties) {\n                var theError = (exception && (exception[_DYN_EXCEPTION$1 ] || exception[_DYN_ERROR ])) ||\n                    isError(exception) && exception ||\n                    { name: (exception && typeof exception), message: exception || strNotSpecified };\n                exception = exception || {};\n                var exceptionPartB = new Exception(_self[_DYN_DIAG_LOG$1 ](), theError, exception[_DYN_PROPERTIES ] || customProperties, exception.measurements, exception.severityLevel, exception.id).toInterface();\n                var telemetryItem = createTelemetryItem(exceptionPartB, Exception[_DYN_DATA_TYPE$1 ], Exception[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties, systemProperties);\n                _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n            };\n            _self.trackException = function (exception, customProperties) {\n                if (exception && !exception[_DYN_EXCEPTION$1 ] && exception[_DYN_ERROR ]) {\n                    exception[_DYN_EXCEPTION$1 ] = exception[_DYN_ERROR ];\n                }\n                try {\n                    _self[_DYN_SEND_EXCEPTION_INTER5 ](exception, customProperties);\n                }\n                catch (e) {\n                    _throwInternal(1 , 35 , \"trackException failed, exception will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n            };\n            _self[_DYN__ONERROR ] = function (exception) {\n                var error = exception && exception[_DYN_ERROR ];\n                var evt = exception && exception.evt;\n                try {\n                    if (!evt) {\n                        var _window = getWindow();\n                        if (_window) {\n                            evt = _window[strEvent];\n                        }\n                    }\n                    var url = (exception && exception.url) || (getDocument() || {}).URL;\n                    var errorSrc = exception[_DYN_ERROR_SRC ] || \"window.onerror@\" + url + \":\" + (exception[_DYN_LINE_NUMBER ] || 0) + \":\" + (exception[_DYN_COLUMN_NUMBER ] || 0);\n                    var properties = {\n                        errorSrc: errorSrc,\n                        url: url,\n                        lineNumber: exception[_DYN_LINE_NUMBER ] || 0,\n                        columnNumber: exception[_DYN_COLUMN_NUMBER ] || 0,\n                        message: exception[_DYN_MESSAGE ]\n                    };\n                    if (isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception[_DYN_ERROR ])) {\n                        _sendCORSException(Exception[_DYN__CREATE_AUTO_EXCEPTI6 ](\"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\", url, exception[_DYN_LINE_NUMBER ] || 0, exception[_DYN_COLUMN_NUMBER ] || 0, error, evt, null, errorSrc), properties);\n                    }\n                    else {\n                        if (!exception[_DYN_ERROR_SRC ]) {\n                            exception[_DYN_ERROR_SRC ] = errorSrc;\n                        }\n                        _self.trackException({ exception: exception, severityLevel: 3  }, properties);\n                    }\n                }\n                catch (e) {\n                    var errorString = error ? (error.name + \", \" + error[_DYN_MESSAGE ]) : \"null\";\n                    _throwInternal(1 , 11 , \"_onError threw exception while logging error, error will not be collected: \"\n                        + getExceptionName(e), { exception: dumpObj(e), errorString: errorString });\n                }\n            };\n            _self[_DYN_ADD_TELEMETRY_INITIA7 ] = function (telemetryInitializer) {\n                if (_self[_DYN_CORE$1 ]) {\n                    return _self[_DYN_CORE$1 ][_DYN_ADD_TELEMETRY_INITIA7 ](telemetryInitializer);\n                }\n                if (!_preInitTelemetryInitializers) {\n                    _preInitTelemetryInitializers = [];\n                }\n                _preInitTelemetryInitializers.push(telemetryInitializer);\n            };\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                if (_self.isInitialized()) {\n                    return;\n                }\n                if (isNullOrUndefined(core)) {\n                    throwError(\"Error initializing\");\n                }\n                _base.initialize(config, core, extensions, pluginChain);\n                try {\n                    _evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());\n                    if (_preInitTelemetryInitializers) {\n                        arrForEach(_preInitTelemetryInitializers, function (initializer) {\n                            core[_DYN_ADD_TELEMETRY_INITIA7 ](initializer);\n                        });\n                        _preInitTelemetryInitializers = null;\n                    }\n                    _populateDefaults(config);\n                    _pageViewPerformanceManager = new PageViewPerformanceManager(_self[_DYN_CORE$1 ]);\n                    _pageViewManager = new PageViewManager(_self, _extConfig.overridePageViewDuration, _self[_DYN_CORE$1 ], _pageViewPerformanceManager);\n                    _pageVisitTimeManager = new PageVisitTimeManager(_self[_DYN_DIAG_LOG$1 ](), function (pageName, pageUrl, pageVisitTime) { return trackPageVisitTime(pageName, pageUrl, pageVisitTime); });\n                    _eventTracking = new Timing(_self[_DYN_DIAG_LOG$1 ](), \"trackEvent\");\n                    _eventTracking.action =\n                        function (name, url, duration, properties, measurements) {\n                            if (!properties) {\n                                properties = {};\n                            }\n                            if (!measurements) {\n                                measurements = {};\n                            }\n                            properties.duration = duration[_DYN_TO_STRING$1 ]();\n                            _self.trackEvent({ name: name, properties: properties, measurements: measurements });\n                        };\n                    _pageTracking = new Timing(_self[_DYN_DIAG_LOG$1 ](), \"trackPageView\");\n                    _pageTracking.action = function (name, url, duration, properties, measurements) {\n                        if (isNullOrUndefined(properties)) {\n                            properties = {};\n                        }\n                        properties.duration = duration[_DYN_TO_STRING$1 ]();\n                        var pageViewItem = {\n                            name: name,\n                            uri: url,\n                            properties: properties,\n                            measurements: measurements\n                        };\n                        _self[_DYN_SEND_PAGE_VIEW_INTER2 ](pageViewItem, properties);\n                    };\n                    if (hasWindow()) {\n                        _updateExceptionTracking();\n                        _updateLocationChange();\n                    }\n                }\n                catch (e) {\n                    _self.setInitialized(false);\n                    throw e;\n                }\n            };\n            _self._doTeardown = function (unloadCtx, unloadState) {\n                _pageViewManager && _pageViewManager.teardown(unloadCtx, unloadState);\n                eventOff(window, null, null, _evtNamespace);\n                _initDefaults();\n            };\n            function _populateDefaults(config) {\n                var identifier = _self.identifier;\n                var core = _self[_DYN_CORE$1 ];\n                _self[_DYN__ADD_HOOK$1 ](onConfigChange(config, function () {\n                    var ctx = createProcessTelemetryContext(null, config, core);\n                    _extConfig = ctx.getExtCfg(identifier, defaultValues);\n                    _autoTrackPageVisitTime = _extConfig[_DYN_AUTO_TRACK_PAGE_VISI9 ];\n                    if (config.storagePrefix) {\n                        utlSetStoragePrefix(config.storagePrefix);\n                    }\n                    _updateStorageUsage(_extConfig);\n                    _isBrowserLinkTrackingEnabled = _extConfig[_DYN_IS_BROWSER_LINK_TRAC10 ];\n                    _addDefaultTelemetryInitializers();\n                }));\n            }\n            function trackPageVisitTime(pageName, pageUrl, pageVisitTime) {\n                var properties = { PageName: pageName, PageUrl: pageUrl };\n                _self.trackMetric({\n                    name: \"PageVisitTime\",\n                    average: pageVisitTime,\n                    max: pageVisitTime,\n                    min: pageVisitTime,\n                    sampleCount: 1\n                }, properties);\n            }\n            function _addDefaultTelemetryInitializers() {\n                if (!_browserLinkInitializerAdded && _isBrowserLinkTrackingEnabled) {\n                    var browserLinkPaths_1 = [\"/browserLinkSignalR/\", \"/__browserLink/\"];\n                    var dropBrowserLinkRequests = function (envelope) {\n                        if (_isBrowserLinkTrackingEnabled && envelope.baseType === RemoteDependencyData[_DYN_DATA_TYPE$1 ]) {\n                            var remoteData = envelope.baseData;\n                            if (remoteData) {\n                                for (var i = 0; i < browserLinkPaths_1[_DYN_LENGTH$3 ]; i++) {\n                                    if (remoteData.target && strIndexOf(remoteData.target, browserLinkPaths_1[i]) >= 0) {\n                                        return false;\n                                    }\n                                }\n                            }\n                        }\n                        return true;\n                    };\n                    _self[_DYN__ADD_HOOK$1 ](_self[_DYN_ADD_TELEMETRY_INITIA7 ](dropBrowserLinkRequests));\n                    _browserLinkInitializerAdded = true;\n                }\n            }\n            function _sendCORSException(exception, properties) {\n                var telemetryItem = createTelemetryItem(exception, Exception[_DYN_DATA_TYPE$1 ], Exception[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties);\n                _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n            }\n            function _updateExceptionTracking() {\n                var _window = getWindow();\n                var locn = getLocation(true);\n                _self[_DYN__ADD_HOOK$1 ](onConfigChange(_extConfig, function () {\n                    _disableExceptionTracking = _extConfig.disableExceptionTracking;\n                    if (!_disableExceptionTracking && !_autoExceptionInstrumented && !_extConfig.autoExceptionInstrumented) {\n                        _addHook(InstrumentEvent(_window, \"onerror\", {\n                            ns: _evtNamespace,\n                            rsp: function (callDetails, message, url, lineNumber, columnNumber, error) {\n                                if (!_disableExceptionTracking && callDetails.rslt !== true) {\n                                    _self[_DYN__ONERROR ](Exception[_DYN__CREATE_AUTO_EXCEPTI6 ](message, url, lineNumber, columnNumber, error, callDetails.evt));\n                                }\n                            }\n                        }, false));\n                        _autoExceptionInstrumented = true;\n                    }\n                }));\n                _addUnhandledPromiseRejectionTracking(_window, locn);\n            }\n            function _updateLocationChange() {\n                var win = getWindow();\n                var locn = getLocation(true);\n                _self[_DYN__ADD_HOOK$1 ](onConfigChange(_extConfig, function () {\n                    _enableAutoRouteTracking = _extConfig[_DYN_ENABLE_AUTO_ROUTE_TR11 ] === true;\n                    if (win && _enableAutoRouteTracking && !_historyListenerAdded && hasHistory()) {\n                        var _history = getHistory();\n                        if (isFunction(_history.pushState) && isFunction(_history.replaceState) && typeof Event !== strShimUndefined) {\n                            _addHistoryListener(win, _history, locn);\n                        }\n                    }\n                }));\n            }\n            function _getDistributedTraceCtx() {\n                var distributedTraceCtx = null;\n                if (_self[_DYN_CORE$1 ] && _self[_DYN_CORE$1 ].getTraceCtx) {\n                    distributedTraceCtx = _self[_DYN_CORE$1 ].getTraceCtx(false);\n                }\n                if (!distributedTraceCtx) {\n                    var properties = _self[_DYN_CORE$1 ].getPlugin(PropertiesPluginIdentifier);\n                    if (properties) {\n                        var context = properties.plugin.context;\n                        if (context) {\n                            distributedTraceCtx = createDistributedTraceContextFromTrace(context.telemetryTrace);\n                        }\n                    }\n                }\n                return distributedTraceCtx;\n            }\n            function _addHistoryListener(win, history, locn) {\n                if (_historyListenerAdded) {\n                    return;\n                }\n                var namePrefix = _extConfig.namePrefix || \"\";\n                function _popstateHandler() {\n                    if (_enableAutoRouteTracking) {\n                        _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                    }\n                }\n                function _locationChangeHandler() {\n                    if (_currUri) {\n                        _prevUri = _currUri;\n                        _currUri = locn && locn[_DYN_HREF ] || \"\";\n                    }\n                    else {\n                        _currUri = locn && locn[_DYN_HREF ] || \"\";\n                    }\n                    if (_enableAutoRouteTracking) {\n                        var distributedTraceCtx = _getDistributedTraceCtx();\n                        if (distributedTraceCtx) {\n                            distributedTraceCtx.setTraceId(generateW3CId());\n                            var traceLocationName = \"_unknown_\";\n                            if (locn && locn.pathname) {\n                                traceLocationName = locn.pathname + (locn.hash || \"\");\n                            }\n                            distributedTraceCtx.setName(dataSanitizeString(_self[_DYN_DIAG_LOG$1 ](), traceLocationName));\n                        }\n                        scheduleTimeout((function (uri) {\n                            _self[_DYN_TRACK_PAGE_VIEW ]({ refUri: uri, properties: { duration: 0 } });\n                        }).bind(_self, _prevUri), _self.autoRoutePVDelay);\n                    }\n                }\n                _addHook(InstrumentEvent(history, \"pushState\", {\n                    ns: _evtNamespace,\n                    rsp: function () {\n                        if (_enableAutoRouteTracking) {\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"pushState\"));\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                        }\n                    }\n                }, true));\n                _addHook(InstrumentEvent(history, \"replaceState\", {\n                    ns: _evtNamespace,\n                    rsp: function () {\n                        if (_enableAutoRouteTracking) {\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"replaceState\"));\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                        }\n                    }\n                }, true));\n                eventOn(win, namePrefix + \"popstate\", _popstateHandler, _evtNamespace);\n                eventOn(win, namePrefix + \"locationchange\", _locationChangeHandler, _evtNamespace);\n                _historyListenerAdded = true;\n            }\n            function _addUnhandledPromiseRejectionTracking(_window, _location) {\n                _self[_DYN__ADD_HOOK$1 ](onConfigChange(_extConfig, function () {\n                    _enableUnhandledPromiseRejectionTracking = _extConfig[_DYN_ENABLE_UNHANDLED_PRO12 ] === true;\n                    _autoExceptionInstrumented = _autoExceptionInstrumented || _extConfig[_DYN_AUTO_UNHANDLED_PROMI13 ];\n                    if (_enableUnhandledPromiseRejectionTracking && !_autoUnhandledPromiseInstrumented) {\n                        _addHook(InstrumentEvent(_window, \"onunhandledrejection\", {\n                            ns: _evtNamespace,\n                            rsp: function (callDetails, error) {\n                                if (_enableUnhandledPromiseRejectionTracking && callDetails.rslt !== true) {\n                                    _self[_DYN__ONERROR ](Exception[_DYN__CREATE_AUTO_EXCEPTI6 ](_getReason(error), _location ? _location[_DYN_HREF ] : \"\", 0, 0, error, callDetails.evt));\n                                }\n                            }\n                        }, false));\n                        _extConfig[_DYN_AUTO_UNHANDLED_PROMI13 ] = _autoUnhandledPromiseInstrumented = true;\n                    }\n                }));\n            }\n            function _throwInternal(severity, msgId, msg, properties, isUserAct) {\n                _self[_DYN_DIAG_LOG$1 ]().throwInternal(severity, msgId, msg, properties, isUserAct);\n            }\n            function _initDefaults() {\n                _eventTracking = null;\n                _pageTracking = null;\n                _pageViewManager = null;\n                _pageViewPerformanceManager = null;\n                _pageVisitTimeManager = null;\n                _preInitTelemetryInitializers = null;\n                _isBrowserLinkTrackingEnabled = false;\n                _browserLinkInitializerAdded = false;\n                _enableAutoRouteTracking = false;\n                _historyListenerAdded = false;\n                _disableExceptionTracking = false;\n                _autoExceptionInstrumented = false;\n                _enableUnhandledPromiseRejectionTracking = false;\n                _autoUnhandledPromiseInstrumented = false;\n                _autoTrackPageVisitTime = false;\n                var location = getLocation(true);\n                _prevUri = location && location[_DYN_HREF ] || \"\";\n                _currUri = null;\n                _evtNamespace = null;\n                _extConfig = null;\n                objDefine(_self, \"config\", {\n                    g: function () { return _extConfig; }\n                });\n            }\n            objDefine(_self, \"_pageViewManager\", { g: function () { return _pageViewManager; } });\n            objDefine(_self, \"_pageViewPerformanceManager\", { g: function () { return _pageViewPerformanceManager; } });\n            objDefine(_self, \"_pageVisitTimeManager\", { g: function () { return _pageVisitTimeManager; } });\n            objDefine(_self, \"_evtNamespace\", { g: function () { return \".\" + _evtNamespace; } });\n        });\n        return _this;\n    }\n    AnalyticsPlugin.Version = '3.0.6';\n    return AnalyticsPlugin;\n}(BaseTelemetryPlugin));\n\nvar _DYN_FEATURE_OPT_IN = \"featureOptIn\";\nvar _DYN_ON_CFG_CHANGE_RECEIV0 = \"onCfgChangeReceive\";\nvar _DYN_NON_OVERRIDE_CONFIGS = \"nonOverrideConfigs\";\nvar _DYN_SCHEDULE_FETCH_TIMEO1 = \"scheduleFetchTimeout\";\n\nfunction replaceByNonOverrideCfg(cfg, nonOverrideConfigs, curLevel, maxLevel) {\n    try {\n        var exceedMaxLevel = curLevel > maxLevel;\n        if (exceedMaxLevel) {\n            cfg = null;\n        }\n        var curCfg_1 = curLevel == 0 ? objExtend$1({}, cfg) : cfg;\n        if (curCfg_1 && nonOverrideConfigs && !exceedMaxLevel) {\n            objForEachKey(curCfg_1, function (key) {\n                var nonOverrideVal = nonOverrideConfigs[key];\n                if (!!nonOverrideVal) {\n                    if (isObject(curCfg_1[key]) && isObject(nonOverrideVal)) {\n                        curCfg_1[key] = replaceByNonOverrideCfg(curCfg_1[key], nonOverrideVal, ++curLevel, maxLevel);\n                    }\n                    else {\n                        delete curCfg_1[key];\n                    }\n                }\n            });\n        }\n        return curCfg_1;\n    }\n    catch (e) {\n    }\n    return cfg;\n}\nvar F = \"featureOptIn.\";\nvar M = \".mode\";\nvar ON = \".onCfg\";\nvar OFF = \".offCfg\";\nfunction resolveCdnFeatureCfg(field, cdnCfg, userOptInDetails) {\n    var _a;\n    if (!cdnCfg || !cdnCfg.enabled) {\n        return null;\n    }\n    var cdnFt = (cdnCfg[_DYN_FEATURE_OPT_IN ] || {})[field] || { mode: 1  };\n    var cdnM = cdnFt.mode;\n    var cdnOnV = cdnFt.onCfg;\n    var cdnOffV = cdnFt.offCfg;\n    var userFt = (userOptInDetails || {})[field] || { mode: 2  };\n    var userM = userFt.mode;\n    var userOnV = userFt.onCfg;\n    var userOffV = userFt.offCfg;\n    var blockCdn = !!userFt.blockCdnCfg;\n    var mFld = F + field + M;\n    var onFld = F + field + ON;\n    var offFld = F + field + OFF;\n    var mode = userM;\n    var onV = userOnV;\n    var offV = userOffV;\n    if (!blockCdn) {\n        if (cdnM === 4  || cdnM === 5 ) {\n            mode = (cdnM == 4  ? 3  : 2 );\n            onV = cdnOnV || userOnV;\n            offV = cdnOffV || userOffV;\n        }\n        else if (cdnM === 2  || userM === 2 ) {\n            mode = 2 ;\n            onV = userOnV || cdnOnV;\n            offV = userOffV || cdnOffV;\n        }\n        else if (cdnM === 3 ) {\n            mode = 3 ;\n            onV = userOnV || cdnOnV;\n            offV = userOffV || cdnOffV;\n        }\n        else if (cdnM === 1  && userM === 1 ) {\n            mode = 1 ;\n        }\n    }\n    return _a = {},\n        _a[mFld] = mode,\n        _a[onFld] = onV,\n        _a[offFld] = offV,\n        _a;\n}\nfunction applyCdnfeatureCfg(cdnCfg, core) {\n    try {\n        if (!cdnCfg || !cdnCfg.enabled) {\n            return null;\n        }\n        if (!cdnCfg[_DYN_FEATURE_OPT_IN ]) {\n            return cdnCfg.config;\n        }\n        var optInMap = cdnCfg[_DYN_FEATURE_OPT_IN ];\n        var cdnConfig_1 = cdnCfg.config || {};\n        objForEachKey(optInMap, function (key) {\n            var featureVal = resolveCdnFeatureCfg(key, cdnCfg, core.config[_DYN_FEATURE_OPT_IN ]);\n            if (!isNullOrUndefined(featureVal)) {\n                objForEachKey(featureVal, function (config, val) {\n                    setValueByKey(cdnConfig_1, config, val);\n                });\n                _overrideCdnCfgByFeature(key, featureVal, cdnConfig_1);\n            }\n        });\n        return cdnConfig_1;\n    }\n    catch (e) {\n    }\n    return null;\n}\nfunction _overrideCdnCfgByFeature(field, ftVal, config) {\n    var mode = ftVal[F + field + M];\n    var val = ftVal[F + field + ON];\n    var dVal = ftVal[F + field + OFF];\n    var target = null;\n    if (mode === 3 ) {\n        target = val;\n    }\n    if (mode === 2 ) {\n        target = dVal;\n    }\n    if (target) {\n        objForEachKey(target, function (key, cfg) {\n            setValueByKey(config, key, cfg);\n        });\n    }\n}\n\nvar _a$4;\nvar EVENT_NAME = \"ai_cfgsync\";\nvar STR_GET_METHOD = \"GET\";\nvar FETCH_TIMEOUT = 1800000;\nvar udfVal = undefined;\nvar defaultNonOverrideCfg = { instrumentationKey: true, connectionString: true, endpointUrl: true };\nvar _defaultConfig$2 = objDeepFreeze((_a$4 = {\n        syncMode: 1 ,\n        blkCdnCfg: udfVal,\n        customEvtName: udfVal,\n        cfgUrl: udfVal,\n        overrideSyncFn: udfVal,\n        overrideFetchFn: udfVal\n    },\n    _a$4[_DYN_ON_CFG_CHANGE_RECEIV0 ] = udfVal,\n    _a$4[_DYN_SCHEDULE_FETCH_TIMEO1 ] = FETCH_TIMEOUT,\n    _a$4[_DYN_NON_OVERRIDE_CONFIGS ] = defaultNonOverrideCfg,\n    _a$4));\nvar CfgSyncPlugin = /** @class */ (function (_super) {\n    __extendsFn(CfgSyncPlugin, _super);\n    function CfgSyncPlugin() {\n        var _this = _super.call(this) || this;\n        _this.priority = 198;\n        _this.identifier = \"AppInsightsCfgSyncPlugin\";\n        var _extensionConfig;\n        var _mainConfig;\n        var _evtName;\n        var _evtNamespace;\n        var _cfgUrl;\n        var _timeoutHandle;\n        var _receiveChanges;\n        var _broadcastChanges;\n        var _blkCdnCfg;\n        var _fetchTimeout;\n        var _retryCnt;\n        var _onCfgChangeReceive;\n        var _nonOverrideConfigs;\n        var _fetchFn;\n        var _overrideFetchFn;\n        var _overrideSyncFn;\n        var _paused = false;\n        dynamicProto(CfgSyncPlugin, _this, function (_self, _base) {\n            _initDefaults();\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                _base.initialize(config, core, extensions, pluginChain);\n                _evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());\n                _populateDefaults(config);\n            };\n            _self.getCfg = function () {\n                return _mainConfig;\n            };\n            _self.pause = function () {\n                _paused = true;\n                _clearScheduledTimer();\n            };\n            _self.resume = function () {\n                _paused = false;\n                _setupTimer();\n            };\n            _self.setCfg = function (config) {\n                return _setCfg(config);\n            };\n            _self.sync = function (customDetails) {\n                return _sendCfgsyncEvents(customDetails);\n            };\n            _self.updateEventListenerName = function (eventName) {\n                return _updateEventListenerName(eventName);\n            };\n            _self._doTeardown = function (unloadCtx, unloadState) {\n                _eventOff();\n                _clearScheduledTimer();\n                _initDefaults();\n            };\n            _self[\"_getDbgPlgTargets\"] = function () {\n                return [_broadcastChanges, _receiveChanges, _evtName, _blkCdnCfg];\n            };\n            function _initDefaults() {\n                _mainConfig = null;\n                _evtName = null;\n                _evtNamespace = null;\n                _cfgUrl = null;\n                _receiveChanges = null;\n                _broadcastChanges = null;\n                _nonOverrideConfigs = null;\n                _timeoutHandle = null;\n                _fetchTimeout = null;\n                _retryCnt = null;\n                _blkCdnCfg = null;\n                _overrideFetchFn = null;\n                _overrideSyncFn = null;\n                _onCfgChangeReceive = null;\n            }\n            function _populateDefaults(config) {\n                var identifier = _self.identifier;\n                var core = _self.core;\n                _self._addHook(onConfigChange(config, function () {\n                    var ctx = createProcessTelemetryContext(null, config, core);\n                    _extensionConfig = ctx.getExtCfg(identifier, _defaultConfig$2);\n                    var preBlkCdn = _blkCdnCfg;\n                    _blkCdnCfg = !!_extensionConfig.blkCdnCfg;\n                    if (!isNullOrUndefined(preBlkCdn) && preBlkCdn !== _blkCdnCfg) {\n                        if (!_blkCdnCfg && _cfgUrl) {\n                            _fetchFn && _fetchFn(_cfgUrl, _onFetchComplete, _broadcastChanges);\n                        }\n                        else {\n                            _clearScheduledTimer();\n                        }\n                    }\n                    if (isNullOrUndefined(_receiveChanges)) {\n                        _receiveChanges = _extensionConfig.syncMode === 2 ;\n                    }\n                    if (isNullOrUndefined(_broadcastChanges)) {\n                        _broadcastChanges = _extensionConfig.syncMode === 1 ;\n                    }\n                    var newEvtName = _extensionConfig.customEvtName || EVENT_NAME;\n                    if (_evtName !== newEvtName) {\n                        if (_receiveChanges) {\n                            _updateEventListenerName(newEvtName);\n                        }\n                        else {\n                            _eventOff();\n                            _evtName = newEvtName;\n                        }\n                    }\n                    if (isNullOrUndefined(_cfgUrl)) {\n                        _cfgUrl = _extensionConfig.cfgUrl;\n                    }\n                    if (!_cfgUrl) {\n                        _mainConfig = config;\n                        if (_broadcastChanges) {\n                            _sendCfgsyncEvents();\n                        }\n                    }\n                }));\n                _overrideSyncFn = _extensionConfig.overrideSyncFn;\n                _overrideFetchFn = _extensionConfig.overrideFetchFn;\n                _onCfgChangeReceive = _extensionConfig[_DYN_ON_CFG_CHANGE_RECEIV0 ];\n                _nonOverrideConfigs = _extensionConfig[_DYN_NON_OVERRIDE_CONFIGS ];\n                _fetchTimeout = _extensionConfig[_DYN_SCHEDULE_FETCH_TIMEO1 ];\n                _fetchFn = _getFetchFnInterface();\n                _retryCnt = 0;\n                if (_cfgUrl && !_blkCdnCfg) {\n                    _fetchFn && _fetchFn(_cfgUrl, _onFetchComplete, _broadcastChanges);\n                }\n            }\n            function _setCfg(config, isAutoSync) {\n                if (config) {\n                    _mainConfig = config;\n                    if (!!isAutoSync && !_paused) {\n                        return _sendCfgsyncEvents();\n                    }\n                    if (_receiveChanges && !_paused) {\n                        _self.core.updateCfg(config);\n                        return true;\n                    }\n                }\n                return false;\n            }\n            function _eventOff() {\n                try {\n                    var global_1 = getGlobal();\n                    if (global_1) {\n                        eventOff(global_1, null, null, _evtNamespace);\n                    }\n                }\n                catch (e) {\n                }\n            }\n            function _sendCfgsyncEvents(customDetails) {\n                try {\n                    if (!!_overrideSyncFn && isFunction(_overrideSyncFn)) {\n                        return _overrideSyncFn(_mainConfig, customDetails);\n                    }\n                    return sendCustomEvent(_evtName, _mainConfig, customDetails);\n                }\n                catch (e) {\n                }\n                return false;\n            }\n            function _updateEventListenerName(name) {\n                try {\n                    _eventOff();\n                    if (name) {\n                        _evtName = name;\n                        _addEventListener();\n                    }\n                    return true;\n                }\n                catch (e) {\n                }\n                return false;\n            }\n            function _getFetchFnInterface() {\n                var _fetchFn = _overrideFetchFn;\n                if (isNullOrUndefined(_fetchFn)) {\n                    if (isFetchSupported()) {\n                        _fetchFn = _fetchSender;\n                    }\n                    else if (isXhrSupported()) {\n                        _fetchFn = _xhrSender;\n                    }\n                }\n                return _fetchFn;\n            }\n            function _fetchSender(url, oncomplete, isAutoSync) {\n                var global = getGlobal();\n                var fetchFn = (global && global.fetch) || null;\n                if (url && fetchFn && isFunction(fetchFn)) {\n                    try {\n                        var init = {\n                            method: STR_GET_METHOD\n                        };\n                        var request = new Request(url, init);\n                        doAwaitResponse(fetch(request), function (result) {\n                            var response = result.value;\n                            if (!result.rejected) {\n                                if (response.ok) {\n                                    doAwaitResponse(response.text(), function (res) {\n                                        _doOnComplete(oncomplete, response.status, res.value, isAutoSync);\n                                    });\n                                }\n                                else {\n                                    _doOnComplete(oncomplete, response.status, null, isAutoSync);\n                                }\n                            }\n                            else {\n                                _doOnComplete(oncomplete, 400);\n                            }\n                        });\n                    }\n                    catch (e) {\n                    }\n                }\n            }\n            function _xhrSender(url, oncomplete, isAutoSync) {\n                try {\n                    var xhr_1 = new XMLHttpRequest();\n                    xhr_1.open(STR_GET_METHOD, url);\n                    xhr_1.onreadystatechange = function () {\n                        if (xhr_1.readyState === XMLHttpRequest.DONE) {\n                            _doOnComplete(oncomplete, xhr_1.status, xhr_1.responseText, isAutoSync);\n                        }\n                    };\n                    xhr_1.onerror = function () {\n                        _doOnComplete(oncomplete, 400);\n                    };\n                    xhr_1.ontimeout = function () {\n                        _doOnComplete(oncomplete, 400);\n                    };\n                    xhr_1.send();\n                }\n                catch (e) {\n                }\n            }\n            function _onFetchComplete(status, response, isAutoSync) {\n                try {\n                    if (status >= 200 && status < 400 && response) {\n                        _retryCnt = 0;\n                        var JSON_1 = getJSON();\n                        if (JSON_1) {\n                            var cdnCfg = JSON_1.parse(response);\n                            var cfg = applyCdnfeatureCfg(cdnCfg, _self.core);\n                            cfg && _setCfg(cfg, isAutoSync);\n                        }\n                    }\n                    else {\n                        _retryCnt++;\n                    }\n                    if (_retryCnt < 3) {\n                        _setupTimer();\n                    }\n                }\n                catch (e) {\n                }\n            }\n            function _doOnComplete(oncomplete, status, response, isAutoSync) {\n                try {\n                    oncomplete(status, response, isAutoSync);\n                }\n                catch (e) {\n                }\n            }\n            function _addEventListener() {\n                if (_receiveChanges) {\n                    var global_2 = getGlobal();\n                    if (global_2) {\n                        try {\n                            eventOn(global_2, _evtName, function (event) {\n                                var cfgEvent = event && event.detail;\n                                if (_onCfgChangeReceive && cfgEvent) {\n                                    _onCfgChangeReceive(cfgEvent);\n                                }\n                                else {\n                                    var cfg = cfgEvent && cfgEvent.cfg;\n                                    var newCfg = cfg && isPlainObject(cfg) && _replaceTartgetByKeys(cfg);\n                                    newCfg && _setCfg(newCfg);\n                                }\n                            }, _evtNamespace, true);\n                        }\n                        catch (e) {\n                        }\n                    }\n                }\n            }\n            function _replaceTartgetByKeys(cfg, level) {\n                var _cfg = null;\n                try {\n                    if (cfg) {\n                        _cfg = replaceByNonOverrideCfg(cfg, _nonOverrideConfigs, 0, 5);\n                    }\n                }\n                catch (e) {\n                }\n                return _cfg;\n            }\n            function _setupTimer() {\n                if (!_timeoutHandle && _fetchTimeout) {\n                    _timeoutHandle = scheduleTimeout(function () {\n                        _timeoutHandle = null;\n                        _fetchFn(_cfgUrl, _onFetchComplete, _broadcastChanges);\n                    }, _fetchTimeout);\n                    _timeoutHandle.unref();\n                }\n            }\n            function _clearScheduledTimer() {\n                _timeoutHandle && _timeoutHandle.cancel();\n                _timeoutHandle = null;\n                _retryCnt = 0;\n            }\n            _self.processTelemetry = function (env, itemCtx) {\n                _self.processNext(env, itemCtx);\n            };\n        });\n        return _this;\n    }\n    CfgSyncPlugin.__ieDyn=1;\n    return CfgSyncPlugin;\n}(BaseTelemetryPlugin));\n\nvar STR_DURATION$1 = \"duration\";\n\nvar _DYN_TAGS = \"tags\";\nvar _DYN_DEVICE_TYPE = \"deviceType\";\nvar _DYN_DATA = \"data\";\nvar _DYN_NAME$1 = \"name\";\nvar _DYN_TRACE_ID$1 = \"traceID\";\nvar _DYN_LENGTH$2 = \"length\";\nvar _DYN_STRINGIFY = \"stringify\";\nvar _DYN_MEASUREMENTS = \"measurements\";\nvar _DYN_DATA_TYPE = \"dataType\";\nvar _DYN_ENVELOPE_TYPE = \"envelopeType\";\nvar _DYN_TO_STRING = \"toString\";\nvar _DYN__GET = \"_get\";\nvar _DYN_ENQUEUE = \"enqueue\";\nvar _DYN_COUNT = \"count\";\nvar _DYN_EVENTS_LIMIT_IN_MEM = \"eventsLimitInMem\";\nvar _DYN_PUSH = \"push\";\nvar _DYN_EMIT_LINE_DELIMITED_0 = \"emitLineDelimitedJson\";\nvar _DYN_CLEAR = \"clear\";\nvar _DYN_BATCH_PAYLOADS = \"batchPayloads\";\nvar _DYN_CREATE_NEW = \"createNew\";\nvar _DYN_MARK_AS_SENT = \"markAsSent\";\nvar _DYN_CLEAR_SENT = \"clearSent\";\nvar _DYN_BUFFER_OVERRIDE = \"bufferOverride\";\nvar _DYN__BUFFER__KEY = \"BUFFER_KEY\";\nvar _DYN__SENT__BUFFER__KEY = \"SENT_BUFFER_KEY\";\nvar _DYN_CONCAT = \"concat\";\nvar _DYN__MAX__BUFFER__SIZE = \"MAX_BUFFER_SIZE\";\nvar _DYN_SEND_POST = \"sendPOST\";\nvar _DYN_TRIGGER_SEND = \"triggerSend\";\nvar _DYN_DIAG_LOG = \"diagLog\";\nvar _DYN__SENDER = \"_sender\";\nvar _DYN_CUSTOM_HEADERS = \"customHeaders\";\nvar _DYN_MAX_BATCH_SIZE_IN_BY1 = \"maxBatchSizeInBytes\";\nvar _DYN_ONUNLOAD_DISABLE_BEA2 = \"onunloadDisableBeacon\";\nvar _DYN_IS_BEACON_API_DISABL3 = \"isBeaconApiDisabled\";\nvar _DYN_ALWAYS_USE_XHR_OVERR4 = \"alwaysUseXhrOverride\";\nvar _DYN_ENABLE_SESSION_STORA5 = \"enableSessionStorageBuffer\";\nvar _DYN__BUFFER = \"_buffer\";\nvar _DYN_ONUNLOAD_DISABLE_FET6 = \"onunloadDisableFetch\";\nvar _DYN_DISABLE_SEND_BEACON_7 = \"disableSendBeaconSplit\";\nvar _DYN_INSTRUMENTATION_KEY$1 = \"instrumentationKey\";\nvar _DYN_UNLOAD_TRANSPORTS = \"unloadTransports\";\nvar _DYN_CONVERT_UNDEFINED = \"convertUndefined\";\nvar _DYN_MAX_BATCH_INTERVAL = \"maxBatchInterval\";\nvar _DYN_BASE_TYPE = \"baseType\";\nvar _DYN_SAMPLE_RATE = \"sampleRate\";\nvar _DYN__XHR_READY_STATE_CHA8 = \"_xhrReadyStateChange\";\nvar _DYN__ON_ERROR = \"_onError\";\nvar _DYN__ON_PARTIAL_SUCCESS = \"_onPartialSuccess\";\nvar _DYN__ON_SUCCESS = \"_onSuccess\";\nvar _DYN_ITEMS_ACCEPTED = \"itemsAccepted\";\nvar _DYN_ITEMS_RECEIVED = \"itemsReceived\";\nvar _DYN_ORI_PAYLOAD = \"oriPayload\";\nvar _DYN_SET_REQUEST_HEADER$1 = \"setRequestHeader\";\nvar _DYN_EVENTS_SEND_REQUEST = \"eventsSendRequest\";\nvar _DYN_GET_SAMPLING_SCORE = \"getSamplingScore\";\nvar _DYN_GET_HASH_CODE_SCORE = \"getHashCodeScore\";\n\nvar strBaseType = \"baseType\";\nvar strBaseData = \"baseData\";\nvar strProperties = \"properties\";\nvar strTrue = \"true\";\nfunction _setValueIf(target, field, value) {\n    return setValue(target, field, value, isTruthy);\n}\nfunction _extractPartAExtensions(logger, item, env) {\n    var envTags = env[_DYN_TAGS ] = env[_DYN_TAGS ] || {};\n    var itmExt = item.ext = item.ext || {};\n    var itmTags = item[_DYN_TAGS ] = item[_DYN_TAGS ] || [];\n    var extUser = itmExt.user;\n    if (extUser) {\n        _setValueIf(envTags, CtxTagKeys.userAuthUserId, extUser.authId);\n        _setValueIf(envTags, CtxTagKeys.userId, extUser.id || extUser.localId);\n    }\n    var extApp = itmExt.app;\n    if (extApp) {\n        _setValueIf(envTags, CtxTagKeys.sessionId, extApp.sesId);\n    }\n    var extDevice = itmExt.device;\n    if (extDevice) {\n        _setValueIf(envTags, CtxTagKeys.deviceId, extDevice.id || extDevice.localId);\n        _setValueIf(envTags, CtxTagKeys[_DYN_DEVICE_TYPE ], extDevice.deviceClass);\n        _setValueIf(envTags, CtxTagKeys.deviceIp, extDevice.ip);\n        _setValueIf(envTags, CtxTagKeys.deviceModel, extDevice.model);\n        _setValueIf(envTags, CtxTagKeys[_DYN_DEVICE_TYPE ], extDevice[_DYN_DEVICE_TYPE ]);\n    }\n    var web = item.ext.web;\n    if (web) {\n        _setValueIf(envTags, CtxTagKeys.deviceLanguage, web.browserLang);\n        _setValueIf(envTags, CtxTagKeys.deviceBrowserVersion, web.browserVer);\n        _setValueIf(envTags, CtxTagKeys.deviceBrowser, web.browser);\n        var envData = env[_DYN_DATA ] = env[_DYN_DATA ] || {};\n        var envBaseData = envData[strBaseData] = envData[strBaseData] || {};\n        var envProps = envBaseData[strProperties] = envBaseData[strProperties] || {};\n        _setValueIf(envProps, \"domain\", web.domain);\n        _setValueIf(envProps, \"isManual\", web.isManual ? strTrue : null);\n        _setValueIf(envProps, \"screenRes\", web.screenRes);\n        _setValueIf(envProps, \"userConsent\", web.userConsent ? strTrue : null);\n    }\n    var extOs = itmExt.os;\n    if (extOs) {\n        _setValueIf(envTags, CtxTagKeys.deviceOS, extOs[_DYN_NAME$1 ]);\n    }\n    var extTrace = itmExt.trace;\n    if (extTrace) {\n        _setValueIf(envTags, CtxTagKeys.operationParentId, extTrace.parentID);\n        _setValueIf(envTags, CtxTagKeys.operationName, dataSanitizeString(logger, extTrace[_DYN_NAME$1 ]));\n        _setValueIf(envTags, CtxTagKeys.operationId, extTrace[_DYN_TRACE_ID$1 ]);\n    }\n    var tgs = {};\n    for (var i = itmTags[_DYN_LENGTH$2 ] - 1; i >= 0; i--) {\n        var tg = itmTags[i];\n        objForEachKey(tg, function (key, value) {\n            tgs[key] = value;\n        });\n        itmTags.splice(i, 1);\n    }\n    objForEachKey(itmTags, function (tg, value) {\n        tgs[tg] = value;\n    });\n    var theTags = __assignFn(__assignFn({}, envTags), tgs);\n    if (!theTags[CtxTagKeys.internalSdkVersion]) {\n        theTags[CtxTagKeys.internalSdkVersion] = dataSanitizeString(logger, \"javascript:\".concat(EnvelopeCreator.Version), 64);\n    }\n    env[_DYN_TAGS ] = optimizeObject(theTags);\n}\nfunction _extractPropsAndMeasurements(data, properties, measurements) {\n    if (!isNullOrUndefined(data)) {\n        objForEachKey(data, function (key, value) {\n            if (isNumber(value)) {\n                measurements[key] = value;\n            }\n            else if (isString(value)) {\n                properties[key] = value;\n            }\n            else if (hasJSON()) {\n                properties[key] = getJSON()[_DYN_STRINGIFY ](value);\n            }\n        });\n    }\n}\nfunction _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue) {\n    if (!isNullOrUndefined(properties)) {\n        objForEachKey(properties, function (key, value) {\n            properties[key] = value || customUndefinedValue;\n        });\n    }\n}\nfunction _createEnvelope(logger, envelopeType, telemetryItem, data) {\n    var envelope = new Envelope(logger, data, envelopeType);\n    _setValueIf(envelope, \"sampleRate\", telemetryItem[SampleRate]);\n    if ((telemetryItem[strBaseData] || {}).startTime) {\n        envelope.time = toISOString(telemetryItem[strBaseData].startTime);\n    }\n    envelope.iKey = telemetryItem.iKey;\n    var iKeyNoDashes = telemetryItem.iKey.replace(/-/g, \"\");\n    envelope[_DYN_NAME$1 ] = envelope[_DYN_NAME$1 ].replace(\"{0}\", iKeyNoDashes);\n    _extractPartAExtensions(logger, telemetryItem, envelope);\n    telemetryItem[_DYN_TAGS ] = telemetryItem[_DYN_TAGS ] || [];\n    return optimizeObject(envelope);\n}\nfunction EnvelopeCreatorInit(logger, telemetryItem) {\n    if (isNullOrUndefined(telemetryItem[strBaseData])) {\n        _throwInternal(logger, 1 , 46 , \"telemetryItem.baseData cannot be null.\");\n    }\n}\nvar EnvelopeCreator = {\n    Version: '3.0.6'\n};\nfunction DependencyEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    var customProperties = telemetryItem[strBaseData][strProperties] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    var bd = telemetryItem[strBaseData];\n    if (isNullOrUndefined(bd)) {\n        _warnToConsole(logger, \"Invalid input for dependency data\");\n        return null;\n    }\n    var method = bd[strProperties] && bd[strProperties][HttpMethod] ? bd[strProperties][HttpMethod] : \"GET\";\n    var remoteDepData = new RemoteDependencyData(logger, bd.id, bd.target, bd[_DYN_NAME$1 ], bd[STR_DURATION$1 ], bd.success, bd.responseCode, method, bd.type, bd.correlationContext, customProperties, customMeasurements);\n    var data = new Data(RemoteDependencyData[_DYN_DATA_TYPE ], remoteDepData);\n    return _createEnvelope(logger, RemoteDependencyData[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction EventEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var customProperties = {};\n    var customMeasurements = {};\n    if (telemetryItem[strBaseType] !== Event$1[_DYN_DATA_TYPE ]) {\n        customProperties[\"baseTypeSource\"] = telemetryItem[strBaseType];\n    }\n    if (telemetryItem[strBaseType] === Event$1[_DYN_DATA_TYPE ]) {\n        customProperties = telemetryItem[strBaseData][strProperties] || {};\n        customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    }\n    else {\n        if (telemetryItem[strBaseData]) {\n            _extractPropsAndMeasurements(telemetryItem[strBaseData], customProperties, customMeasurements);\n        }\n    }\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    var eventName = telemetryItem[strBaseData][_DYN_NAME$1 ];\n    var eventData = new Event$1(logger, eventName, customProperties, customMeasurements);\n    var data = new Data(Event$1[_DYN_DATA_TYPE ], eventData);\n    return _createEnvelope(logger, Event$1[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction ExceptionEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    var customProperties = telemetryItem[strBaseData][strProperties] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    var bd = telemetryItem[strBaseData];\n    var exData = Exception.CreateFromInterface(logger, bd, customProperties, customMeasurements);\n    var data = new Data(Exception[_DYN_DATA_TYPE ], exData);\n    return _createEnvelope(logger, Exception[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction MetricEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var baseData = telemetryItem[strBaseData];\n    var props = baseData[strProperties] || {};\n    var measurements = baseData[_DYN_MEASUREMENTS ] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], props, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n    }\n    var baseMetricData = new Metric(logger, baseData[_DYN_NAME$1 ], baseData.average, baseData.sampleCount, baseData.min, baseData.max, baseData.stdDev, props, measurements);\n    var data = new Data(Metric[_DYN_DATA_TYPE ], baseMetricData);\n    return _createEnvelope(logger, Metric[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction PageViewEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var duration;\n    var baseData = telemetryItem[strBaseData];\n    if (!isNullOrUndefined(baseData) &&\n        !isNullOrUndefined(baseData[strProperties]) &&\n        !isNullOrUndefined(baseData[strProperties][STR_DURATION$1])) {\n        duration = baseData[strProperties][STR_DURATION$1];\n        delete baseData[strProperties][STR_DURATION$1];\n    }\n    else if (!isNullOrUndefined(telemetryItem[_DYN_DATA ]) &&\n        !isNullOrUndefined(telemetryItem[_DYN_DATA ][STR_DURATION$1])) {\n        duration = telemetryItem[_DYN_DATA ][STR_DURATION$1];\n        delete telemetryItem[_DYN_DATA ][STR_DURATION$1];\n    }\n    var bd = telemetryItem[strBaseData];\n    var currentContextId;\n    if (((telemetryItem.ext || {}).trace || {})[_DYN_TRACE_ID$1 ]) {\n        currentContextId = telemetryItem.ext.trace[_DYN_TRACE_ID$1 ];\n    }\n    var id = bd.id || currentContextId;\n    var name = bd[_DYN_NAME$1 ];\n    var url = bd.uri;\n    var properties = bd[strProperties] || {};\n    var measurements = bd[_DYN_MEASUREMENTS ] || {};\n    if (!isNullOrUndefined(bd.refUri)) {\n        properties[\"refUri\"] = bd.refUri;\n    }\n    if (!isNullOrUndefined(bd.pageType)) {\n        properties[\"pageType\"] = bd.pageType;\n    }\n    if (!isNullOrUndefined(bd.isLoggedIn)) {\n        properties[\"isLoggedIn\"] = bd.isLoggedIn[_DYN_TO_STRING ]();\n    }\n    if (!isNullOrUndefined(bd[strProperties])) {\n        var pageTags = bd[strProperties];\n        objForEachKey(pageTags, function (key, value) {\n            properties[key] = value;\n        });\n    }\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], properties, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n    }\n    var pageViewData = new PageView(logger, name, url, duration, properties, measurements, id);\n    var data = new Data(PageView[_DYN_DATA_TYPE ], pageViewData);\n    return _createEnvelope(logger, PageView[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction PageViewPerformanceEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var bd = telemetryItem[strBaseData];\n    var name = bd[_DYN_NAME$1 ];\n    var url = bd.uri || bd.url;\n    var properties = bd[strProperties] || {};\n    var measurements = bd[_DYN_MEASUREMENTS ] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], properties, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n    }\n    var baseData = new PageViewPerformance(logger, name, url, undefined, properties, measurements, bd);\n    var data = new Data(PageViewPerformance[_DYN_DATA_TYPE ], baseData);\n    return _createEnvelope(logger, PageViewPerformance[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\nfunction TraceEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n    EnvelopeCreatorInit(logger, telemetryItem);\n    var message = telemetryItem[strBaseData].message;\n    var severityLevel = telemetryItem[strBaseData].severityLevel;\n    var props = telemetryItem[strBaseData][strProperties] || {};\n    var measurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n    _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], props, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n    }\n    var baseData = new Trace(logger, message, severityLevel, props, measurements);\n    var data = new Data(Trace[_DYN_DATA_TYPE ], baseData);\n    return _createEnvelope(logger, Trace[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n}\n\nvar BaseSendBuffer = /** @class */ (function () {\n    function BaseSendBuffer(logger, config) {\n        var _buffer = [];\n        var _bufferFullMessageSent = false;\n        this[_DYN__GET ] = function () {\n            return _buffer;\n        };\n        this._set = function (buffer) {\n            _buffer = buffer;\n            return _buffer;\n        };\n        dynamicProto(BaseSendBuffer, this, function (_self) {\n            _self[_DYN_ENQUEUE ] = function (payload) {\n                if (_self[_DYN_COUNT ]() >= config[_DYN_EVENTS_LIMIT_IN_MEM ]) {\n                    if (!_bufferFullMessageSent) {\n                        _throwInternal(logger, 2 , 105 , \"Maximum in-memory buffer size reached: \" + _self[_DYN_COUNT ](), true);\n                        _bufferFullMessageSent = true;\n                    }\n                    return;\n                }\n                _buffer[_DYN_PUSH ](payload);\n            };\n            _self[_DYN_COUNT ] = function () {\n                return _buffer[_DYN_LENGTH$2 ];\n            };\n            _self.size = function () {\n                var size = _buffer[_DYN_LENGTH$2 ];\n                for (var lp = 0; lp < _buffer[_DYN_LENGTH$2 ]; lp++) {\n                    size += _buffer[lp][_DYN_LENGTH$2 ];\n                }\n                if (!config[_DYN_EMIT_LINE_DELIMITED_0 ]) {\n                    size += 2;\n                }\n                return size;\n            };\n            _self[_DYN_CLEAR ] = function () {\n                _buffer = [];\n                _bufferFullMessageSent = false;\n            };\n            _self.getItems = function () {\n                return _buffer.slice(0);\n            };\n            _self[_DYN_BATCH_PAYLOADS ] = function (payload) {\n                if (payload && payload[_DYN_LENGTH$2 ] > 0) {\n                    var batch = config[_DYN_EMIT_LINE_DELIMITED_0 ] ?\n                        payload.join(\"\\n\") :\n                        \"[\" + payload.join(\",\") + \"]\";\n                    return batch;\n                }\n                return null;\n            };\n            _self[_DYN_CREATE_NEW ] = function (newLogger, newConfig, canUseSessionStorage) {\n                var items = _buffer.slice(0);\n                newLogger = newLogger || logger;\n                newConfig = newConfig || {};\n                var newBuffer = !!canUseSessionStorage ? new SessionStorageSendBuffer(newLogger, newConfig) : new ArraySendBuffer(newLogger, newConfig);\n                arrForEach(items, function (payload) {\n                    newBuffer[_DYN_ENQUEUE ](payload);\n                });\n                return newBuffer;\n            };\n        });\n    }\n    BaseSendBuffer.__ieDyn=1;\n    return BaseSendBuffer;\n}());\nvar ArraySendBuffer = /** @class */ (function (_super) {\n    __extendsFn(ArraySendBuffer, _super);\n    function ArraySendBuffer(logger, config) {\n        var _this = _super.call(this, logger, config) || this;\n        dynamicProto(ArraySendBuffer, _this, function (_self, _base) {\n            _self[_DYN_MARK_AS_SENT ] = function (payload) {\n                _base[_DYN_CLEAR ]();\n            };\n            _self[_DYN_CLEAR_SENT ] = function (payload) {\n            };\n        });\n        return _this;\n    }\n    ArraySendBuffer.__ieDyn=1;\n    return ArraySendBuffer;\n}(BaseSendBuffer));\nvar SessionStorageSendBuffer = /** @class */ (function (_super) {\n    __extendsFn(SessionStorageSendBuffer, _super);\n    function SessionStorageSendBuffer(logger, config) {\n        var _this = _super.call(this, logger, config) || this;\n        var _bufferFullMessageSent = false;\n        var _namePrefix = config === null || config === void 0 ? void 0 : config.namePrefix;\n        var _a = config[_DYN_BUFFER_OVERRIDE ] || { getItem: utlGetSessionStorage, setItem: utlSetSessionStorage }, getItem = _a.getItem, setItem = _a.setItem;\n        dynamicProto(SessionStorageSendBuffer, _this, function (_self, _base) {\n            var bufferItems = _getBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ]);\n            var notDeliveredItems = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n            var buffer = _self._set(bufferItems[_DYN_CONCAT ](notDeliveredItems));\n            if (buffer[_DYN_LENGTH$2 ] > SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                buffer[_DYN_LENGTH$2 ] = SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ];\n            }\n            _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], []);\n            _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], buffer);\n            _self[_DYN_ENQUEUE ] = function (payload) {\n                if (_self[_DYN_COUNT ]() >= SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                    if (!_bufferFullMessageSent) {\n                        _throwInternal(logger, 2 , 67 , \"Maximum buffer size reached: \" + _self[_DYN_COUNT ](), true);\n                        _bufferFullMessageSent = true;\n                    }\n                    return;\n                }\n                _base[_DYN_ENQUEUE ](payload);\n                _setBuffer(SessionStorageSendBuffer.BUFFER_KEY, _self[_DYN__GET ]());\n            };\n            _self[_DYN_CLEAR ] = function () {\n                _base[_DYN_CLEAR ]();\n                _setBuffer(SessionStorageSendBuffer.BUFFER_KEY, _self[_DYN__GET ]());\n                _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], []);\n                _bufferFullMessageSent = false;\n            };\n            _self[_DYN_MARK_AS_SENT ] = function (payload) {\n                _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], _self._set(_removePayloadsFromBuffer(payload, _self[_DYN__GET ]())));\n                var sentElements = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n                if (sentElements instanceof Array && payload instanceof Array) {\n                    sentElements = sentElements[_DYN_CONCAT ](payload);\n                    if (sentElements[_DYN_LENGTH$2 ] > SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                        _throwInternal(logger, 1 , 67 , \"Sent buffer reached its maximum size: \" + sentElements[_DYN_LENGTH$2 ], true);\n                        sentElements[_DYN_LENGTH$2 ] = SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ];\n                    }\n                    _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], sentElements);\n                }\n            };\n            _self[_DYN_CLEAR_SENT ] = function (payload) {\n                var sentElements = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n                sentElements = _removePayloadsFromBuffer(payload, sentElements);\n                _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], sentElements);\n            };\n            _self[_DYN_CREATE_NEW ] = function (newLogger, newConfig, canUseSessionStorage) {\n                canUseSessionStorage = !!canUseSessionStorage;\n                var unsentItems = _self[_DYN__GET ]().slice(0);\n                var sentItems = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]).slice(0);\n                newLogger = newLogger || logger;\n                newConfig = newConfig || {};\n                _self[_DYN_CLEAR ]();\n                var newBuffer = canUseSessionStorage ? new SessionStorageSendBuffer(newLogger, newConfig) : new ArraySendBuffer(newLogger, newConfig);\n                arrForEach(unsentItems, function (payload) {\n                    newBuffer[_DYN_ENQUEUE ](payload);\n                });\n                if (canUseSessionStorage) {\n                    newBuffer[_DYN_MARK_AS_SENT ](sentItems);\n                }\n                return newBuffer;\n            };\n            function _removePayloadsFromBuffer(payloads, buffer) {\n                var remaining = [];\n                arrForEach(buffer, function (value) {\n                    if (!isFunction(value) && arrIndexOf(payloads, value) === -1) {\n                        remaining[_DYN_PUSH ](value);\n                    }\n                });\n                return remaining;\n            }\n            function _getBuffer(key) {\n                var prefixedKey = key;\n                try {\n                    prefixedKey = _namePrefix ? _namePrefix + \"_\" + prefixedKey : prefixedKey;\n                    var bufferJson = getItem(logger, prefixedKey);\n                    if (bufferJson) {\n                        var buffer_1 = getJSON().parse(bufferJson);\n                        if (isString(buffer_1)) {\n                            buffer_1 = getJSON().parse(buffer_1);\n                        }\n                        if (buffer_1 && isArray(buffer_1)) {\n                            return buffer_1;\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternal(logger, 1 , 42 , \" storage key: \" + prefixedKey + \", \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n                return [];\n            }\n            function _setBuffer(key, buffer) {\n                var prefixedKey = key;\n                try {\n                    prefixedKey = _namePrefix ? _namePrefix + \"_\" + prefixedKey : prefixedKey;\n                    var bufferJson = JSON[_DYN_STRINGIFY ](buffer);\n                    setItem(logger, prefixedKey, bufferJson);\n                }\n                catch (e) {\n                    setItem(logger, prefixedKey, JSON[_DYN_STRINGIFY ]([]));\n                    _throwInternal(logger, 2 , 41 , \" storage key: \" + prefixedKey + \", \" + getExceptionName(e) + \". Buffer cleared\", { exception: dumpObj(e) });\n                }\n            }\n        });\n        return _this;\n    }\n    SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n    SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n    SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n    return SessionStorageSendBuffer;\n}(BaseSendBuffer));\n\nvar Serializer = /** @class */ (function () {\n    function Serializer(logger) {\n        dynamicProto(Serializer, this, function (_self) {\n            _self.serialize = function (input) {\n                var output = _serializeObject(input, \"root\");\n                try {\n                    return getJSON()[_DYN_STRINGIFY ](output);\n                }\n                catch (e) {\n                    _throwInternal(logger, 1 , 48 , (e && isFunction(e[_DYN_TO_STRING ])) ? e[_DYN_TO_STRING ]() : \"Error serializing object\", null, true);\n                }\n            };\n            function _serializeObject(source, name) {\n                var circularReferenceCheck = \"__aiCircularRefCheck\";\n                var output = {};\n                if (!source) {\n                    _throwInternal(logger, 1 , 48 , \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                    return output;\n                }\n                if (source[circularReferenceCheck]) {\n                    _throwInternal(logger, 2 , 50 , \"Circular reference detected while serializing object\", { name: name }, true);\n                    return output;\n                }\n                if (!source.aiDataContract) {\n                    if (name === \"measurements\") {\n                        console.log(\"measurements\");\n                        output = _serializeStringMap(source, \"number\", name);\n                    }\n                    else if (name === \"properties\") {\n                        console.log(\"properties\");\n                        output = _serializeStringMap(source, \"string\", name);\n                    }\n                    else if (name === \"tags\") {\n                        output = _serializeStringMap(source, \"string\", name);\n                    }\n                    else if (isArray(source)) {\n                        output = _serializeArray(source, name);\n                    }\n                    else {\n                        _throwInternal(logger, 2 , 49 , \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                        try {\n                            getJSON()[_DYN_STRINGIFY ](source);\n                            output = source;\n                        }\n                        catch (e) {\n                            _throwInternal(logger, 1 , 48 , (e && isFunction(e[_DYN_TO_STRING ])) ? e[_DYN_TO_STRING ]() : \"Error serializing object\", null, true);\n                        }\n                    }\n                    return output;\n                }\n                source[circularReferenceCheck] = true;\n                objForEachKey(source.aiDataContract, function (field, contract) {\n                    var isRequired = (isFunction(contract)) ? (contract() & 1 ) : (contract & 1 );\n                    var isHidden = (isFunction(contract)) ? (contract() & 4 ) : (contract & 4 );\n                    var isArray = contract & 2 ;\n                    var isPresent = source[field] !== undefined;\n                    var isObj = isObject(source[field]) && source[field] !== null;\n                    if (isRequired && !isPresent && !isArray) {\n                        _throwInternal(logger, 1 , 24 , \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    }\n                    else if (!isHidden) {\n                        var value = void 0;\n                        if (isObj) {\n                            if (isArray) {\n                                value = _serializeArray(source[field], field);\n                            }\n                            else {\n                                value = _serializeObject(source[field], field);\n                            }\n                        }\n                        else {\n                            value = source[field];\n                        }\n                        if (value !== undefined) {\n                            output[field] = value;\n                        }\n                    }\n                });\n                delete source[circularReferenceCheck];\n                return output;\n            }\n            function _serializeArray(sources, name) {\n                var output;\n                if (!!sources) {\n                    if (!isArray(sources)) {\n                        _throwInternal(logger, 1 , 54 , \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                    }\n                    else {\n                        output = [];\n                        for (var i = 0; i < sources[_DYN_LENGTH$2 ]; i++) {\n                            var source = sources[i];\n                            var item = _serializeObject(source, name + \"[\" + i + \"]\");\n                            output[_DYN_PUSH ](item);\n                        }\n                    }\n                }\n                return output;\n            }\n            function _serializeStringMap(map, expectedType, name) {\n                var output;\n                if (map) {\n                    output = {};\n                    objForEachKey(map, function (field, value) {\n                        if (expectedType === \"string\") {\n                            console.log(\"string\", value);\n                            if (value === undefined) {\n                                output[field] = \"undefined\";\n                            }\n                            else if (value === null) {\n                                output[field] = \"null\";\n                            }\n                            else if (!value[_DYN_TO_STRING ]) {\n                                output[field] = \"invalid field: toString() is not defined.\";\n                            }\n                            else {\n                                output[field] = value[_DYN_TO_STRING ]();\n                            }\n                        }\n                        else if (expectedType === \"number\") {\n                            console.log(\"number\", field, value);\n                            if (value === undefined) {\n                                console.log(\"number undefined\", value);\n                                output[field] = \"undefined\";\n                            }\n                            else if (value === null) {\n                                console.log(\"number null\", value);\n                                output[field] = \"null\";\n                            }\n                            else {\n                                var num = parseFloat(value);\n                                console.log(\"number covert\", num);\n                                console.log(\"isNaN(num)\", isNaN(num));\n                                if (isNaN(num)) {\n                                    output[field] = \"another\";\n                                }\n                                else {\n                                    output[field] = num;\n                                }\n                            }\n                        }\n                        else {\n                            output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                            _throwInternal(logger, 1 , output[field], null, true);\n                        }\n                    });\n                }\n                return output;\n            }\n        });\n    }\n    Serializer.__ieDyn=1;\n    return Serializer;\n}());\n\nvar MIN_INPUT_LENGTH = 8;\nvar HashCodeScoreGenerator = /** @class */ (function () {\n    function HashCodeScoreGenerator() {\n    }\n    HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n        var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n        return score * 100;\n    };\n    HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n        if (input === \"\") {\n            return 0;\n        }\n        while (input[_DYN_LENGTH$2 ] < MIN_INPUT_LENGTH) {\n            input = input[_DYN_CONCAT ](input);\n        }\n        var hash = 5381;\n        for (var i = 0; i < input[_DYN_LENGTH$2 ]; ++i) {\n            hash = ((hash << 5) + hash) + input.charCodeAt(i);\n            hash = hash & hash;\n        }\n        return Math.abs(hash);\n    };\n    HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n    return HashCodeScoreGenerator;\n}());\n\nvar SamplingScoreGenerator = /** @class */ (function () {\n    function SamplingScoreGenerator() {\n        var _self = this;\n        var hashCodeGenerator = new HashCodeScoreGenerator();\n        var keys = new ContextTagKeys();\n        _self[_DYN_GET_SAMPLING_SCORE ] = function (item) {\n            var score = 0;\n            if (item[_DYN_TAGS ] && item[_DYN_TAGS ][keys.userId]) {\n                score = hashCodeGenerator.getHashCodeScore(item[_DYN_TAGS ][keys.userId]);\n            }\n            else if (item.ext && item.ext.user && item.ext.user.id) {\n                score = hashCodeGenerator[_DYN_GET_HASH_CODE_SCORE ](item.ext.user.id);\n            }\n            else if (item[_DYN_TAGS ] && item[_DYN_TAGS ][keys.operationId]) {\n                score = hashCodeGenerator.getHashCodeScore(item[_DYN_TAGS ][keys.operationId]);\n            }\n            else if (item.ext && item.ext.telemetryTrace && item.ext.telemetryTrace[_DYN_TRACE_ID$1 ]) {\n                score = hashCodeGenerator.getHashCodeScore(item.ext.telemetryTrace[_DYN_TRACE_ID$1 ]);\n            }\n            else {\n                score = (Math.random() * 100);\n            }\n            return score;\n        };\n    }\n    return SamplingScoreGenerator;\n}());\n\nvar Sample = /** @class */ (function () {\n    function Sample(sampleRate, logger) {\n        this.INT_MAX_VALUE = 2147483647;\n        var _logger = logger || safeGetLogger(null);\n        if (sampleRate > 100 || sampleRate < 0) {\n            _logger.throwInternal(2 , 58 , \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n            sampleRate = 100;\n        }\n        this[_DYN_SAMPLE_RATE ] = sampleRate;\n        this.samplingScoreGenerator = new SamplingScoreGenerator();\n    }\n    Sample.prototype.isSampledIn = function (envelope) {\n        var samplingPercentage = this[_DYN_SAMPLE_RATE ];\n        var isSampledIn = false;\n        if (samplingPercentage === null || samplingPercentage === undefined || samplingPercentage >= 100) {\n            return true;\n        }\n        else if (envelope.baseType === Metric[_DYN_DATA_TYPE ]) {\n            return true;\n        }\n        isSampledIn = this.samplingScoreGenerator[_DYN_GET_SAMPLING_SCORE ](envelope) < samplingPercentage;\n        return isSampledIn;\n    };\n    return Sample;\n}());\n\nvar _a$3, _b$1;\nvar UNDEFINED_VALUE$1 = undefined;\nvar FetchSyncRequestSizeLimitBytes = 65000;\nfunction _getResponseText(xhr) {\n    try {\n        return xhr.responseText;\n    }\n    catch (e) {\n    }\n    return null;\n}\nfunction isOverrideFn(httpXHROverride) {\n    return httpXHROverride && httpXHROverride[_DYN_SEND_POST ];\n}\nfunction _prependTransports(theTransports, newTransports) {\n    if (newTransports) {\n        if (isNumber(newTransports)) {\n            theTransports = [newTransports][_DYN_CONCAT ](theTransports);\n        }\n        else if (isArray(newTransports)) {\n            theTransports = newTransports[_DYN_CONCAT ](theTransports);\n        }\n    }\n    return theTransports;\n}\nvar defaultAppInsightsChannelConfig = objDeepFreeze((_a$3 = {\n        endpointUrl: cfgDfValidate(isTruthy, DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH)\n    },\n    _a$3[_DYN_EMIT_LINE_DELIMITED_0 ] = cfgDfBoolean(),\n    _a$3[_DYN_MAX_BATCH_INTERVAL ] = 15000,\n    _a$3[_DYN_MAX_BATCH_SIZE_IN_BY1 ] = 102400,\n    _a$3.disableTelemetry = cfgDfBoolean(),\n    _a$3[_DYN_ENABLE_SESSION_STORA5 ] = cfgDfBoolean(true),\n    _a$3.isRetryDisabled = cfgDfBoolean(),\n    _a$3[_DYN_IS_BEACON_API_DISABL3 ] = cfgDfBoolean(true),\n    _a$3[_DYN_DISABLE_SEND_BEACON_7 ] = cfgDfBoolean(),\n    _a$3.disableXhr = cfgDfBoolean(),\n    _a$3[_DYN_ONUNLOAD_DISABLE_FET6 ] = cfgDfBoolean(),\n    _a$3[_DYN_ONUNLOAD_DISABLE_BEA2 ] = cfgDfBoolean(),\n    _a$3[_DYN_INSTRUMENTATION_KEY$1 ] = UNDEFINED_VALUE$1,\n    _a$3.namePrefix = UNDEFINED_VALUE$1,\n    _a$3.samplingPercentage = cfgDfValidate(_chkSampling, 100),\n    _a$3[_DYN_CUSTOM_HEADERS ] = UNDEFINED_VALUE$1,\n    _a$3[_DYN_CONVERT_UNDEFINED ] = UNDEFINED_VALUE$1,\n    _a$3[_DYN_EVENTS_LIMIT_IN_MEM ] = 10000,\n    _a$3[_DYN_BUFFER_OVERRIDE ] = false,\n    _a$3.httpXHROverride = { isVal: isOverrideFn, v: UNDEFINED_VALUE$1 },\n    _a$3[_DYN_ALWAYS_USE_XHR_OVERR4 ] = cfgDfBoolean(),\n    _a$3.transports = UNDEFINED_VALUE$1,\n    _a$3));\nfunction _chkSampling(value) {\n    return !isNaN(value) && value > 0 && value <= 100;\n}\nvar EnvelopeTypeCreator = (_b$1 = {},\n    _b$1[Event$1.dataType] = EventEnvelopeCreator,\n    _b$1[Trace.dataType] = TraceEnvelopeCreator,\n    _b$1[PageView.dataType] = PageViewEnvelopeCreator,\n    _b$1[PageViewPerformance.dataType] = PageViewPerformanceEnvelopeCreator,\n    _b$1[Exception.dataType] = ExceptionEnvelopeCreator,\n    _b$1[Metric.dataType] = MetricEnvelopeCreator,\n    _b$1[RemoteDependencyData.dataType] = DependencyEnvelopeCreator,\n    _b$1);\nvar Sender = /** @class */ (function (_super) {\n    __extendsFn(Sender, _super);\n    function Sender() {\n        var _this = _super.call(this) || this;\n        _this.priority = 1001;\n        _this.identifier = BreezeChannelIdentifier;\n        var _consecutiveErrors;\n        var _retryAt;\n        var _paused;\n        var _timeoutHandle;\n        var _serializer;\n        var _stamp_specific_redirects;\n        var _headers;\n        var _syncFetchPayload = 0;\n        var _syncUnloadSender;\n        var _offlineListener;\n        var _evtNamespace;\n        var _endpointUrl;\n        var _orgEndpointUrl;\n        var _maxBatchSizeInBytes;\n        var _beaconSupported;\n        var _beaconOnUnloadSupported;\n        var _beaconNormalSupported;\n        var _customHeaders;\n        var _disableTelemetry;\n        var _instrumentationKey;\n        var _convertUndefined;\n        var _isRetryDisabled;\n        var _maxBatchInterval;\n        var _sessionStorageUsed;\n        var _bufferOverrideUsed;\n        var _namePrefix;\n        var _enableSendPromise;\n        var _alwaysUseCustomSend;\n        var _disableXhr;\n        var _fetchKeepAlive;\n        var _xhrSend;\n        var _fallbackSend;\n        var _disableBeaconSplit;\n        dynamicProto(Sender, _this, function (_self, _base) {\n            _initDefaults();\n            _self.pause = function () {\n                _clearScheduledTimer();\n                _paused = true;\n            };\n            _self.resume = function () {\n                if (_paused) {\n                    _paused = false;\n                    _retryAt = null;\n                    _checkMaxSize();\n                    _setupTimer();\n                }\n            };\n            _self.flush = function (isAsync, callBack, sendReason) {\n                if (isAsync === void 0) { isAsync = true; }\n                if (!_paused) {\n                    _clearScheduledTimer();\n                    try {\n                        return _self[_DYN_TRIGGER_SEND ](isAsync, null, sendReason || 1 );\n                    }\n                    catch (e) {\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 22 , \"flush failed, telemetry will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                }\n            };\n            _self.onunloadFlush = function () {\n                if (!_paused) {\n                    if (_beaconSupported || _alwaysUseCustomSend) {\n                        try {\n                            return _self[_DYN_TRIGGER_SEND ](true, _doUnloadSend, 2 );\n                        }\n                        catch (e) {\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 20 , \"failed to flush with beacon sender on page unload, telemetry will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                    }\n                    else {\n                        _self.flush(false);\n                    }\n                }\n            };\n            _self.addHeader = function (name, value) {\n                _headers[name] = value;\n            };\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                if (_self.isInitialized()) {\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 28 , \"Sender is already initialized\");\n                }\n                _base.initialize(config, core, extensions, pluginChain);\n                var identifier = _self.identifier;\n                _serializer = new Serializer(core.logger);\n                _consecutiveErrors = 0;\n                _retryAt = null;\n                _self[_DYN__SENDER ] = null;\n                _stamp_specific_redirects = 0;\n                var diagLog = _self[_DYN_DIAG_LOG ]();\n                _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"Sender\"), core.evtNamespace && core.evtNamespace());\n                _offlineListener = createOfflineListener(_evtNamespace);\n                _self._addHook(onConfigChange(config, function (details) {\n                    var config = details.cfg;\n                    if (config.storagePrefix) {\n                        utlSetStoragePrefix(config.storagePrefix);\n                    }\n                    var ctx = createProcessTelemetryContext(null, config, core);\n                    var senderConfig = ctx.getExtCfg(identifier, defaultAppInsightsChannelConfig);\n                    objDefine(_self, \"_senderConfig\", {\n                        g: function () {\n                            return senderConfig;\n                        }\n                    });\n                    if (_orgEndpointUrl !== senderConfig.endpointUrl) {\n                        _endpointUrl = _orgEndpointUrl = senderConfig.endpointUrl;\n                    }\n                    if (_customHeaders && _customHeaders !== senderConfig[_DYN_CUSTOM_HEADERS ]) {\n                        arrForEach(_customHeaders, function (customHeader) {\n                            delete _headers[customHeader.header];\n                        });\n                    }\n                    _maxBatchSizeInBytes = senderConfig[_DYN_MAX_BATCH_SIZE_IN_BY1 ];\n                    _beaconSupported = (senderConfig[_DYN_ONUNLOAD_DISABLE_BEA2 ] === false || senderConfig[_DYN_IS_BEACON_API_DISABL3 ] === false) && isBeaconsSupported();\n                    _beaconOnUnloadSupported = senderConfig[_DYN_ONUNLOAD_DISABLE_BEA2 ] === false && isBeaconsSupported();\n                    _beaconNormalSupported = senderConfig[_DYN_IS_BEACON_API_DISABL3 ] === false && isBeaconsSupported();\n                    _alwaysUseCustomSend = senderConfig[_DYN_ALWAYS_USE_XHR_OVERR4 ];\n                    _disableXhr = !!senderConfig.disableXhr;\n                    var bufferOverride = senderConfig[_DYN_BUFFER_OVERRIDE ];\n                    var canUseSessionStorage = !!senderConfig[_DYN_ENABLE_SESSION_STORA5 ] &&\n                        (!!bufferOverride || utlCanUseSessionStorage());\n                    var namePrefix = senderConfig.namePrefix;\n                    var shouldUpdate = (canUseSessionStorage !== _sessionStorageUsed)\n                        || (canUseSessionStorage && (_namePrefix !== namePrefix))\n                        || (canUseSessionStorage && (_bufferOverrideUsed !== bufferOverride));\n                    if (_self[_DYN__BUFFER ]) {\n                        if (shouldUpdate) {\n                            try {\n                                _self._buffer = _self._buffer[_DYN_CREATE_NEW ](diagLog, senderConfig, canUseSessionStorage);\n                            }\n                            catch (e) {\n                                _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 12 , \"failed to transfer telemetry to different buffer storage, telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                            }\n                        }\n                        _checkMaxSize();\n                    }\n                    else {\n                        _self[_DYN__BUFFER ] = canUseSessionStorage\n                            ? new SessionStorageSendBuffer(diagLog, senderConfig) : new ArraySendBuffer(diagLog, senderConfig);\n                    }\n                    _namePrefix = namePrefix;\n                    _sessionStorageUsed = canUseSessionStorage;\n                    _bufferOverrideUsed = bufferOverride;\n                    _fetchKeepAlive = !senderConfig[_DYN_ONUNLOAD_DISABLE_FET6 ] && isFetchSupported(true);\n                    _disableBeaconSplit = !!senderConfig[_DYN_DISABLE_SEND_BEACON_7 ];\n                    _self._sample = new Sample(senderConfig.samplingPercentage, diagLog);\n                    _instrumentationKey = senderConfig[_DYN_INSTRUMENTATION_KEY$1 ];\n                    if (!_validateInstrumentationKey(_instrumentationKey, config)) {\n                        _throwInternal(diagLog, 1 , 100 , \"Invalid Instrumentation key \" + _instrumentationKey);\n                    }\n                    _customHeaders = senderConfig[_DYN_CUSTOM_HEADERS ];\n                    if (!isInternalApplicationInsightsEndpoint(_endpointUrl) && _customHeaders && _customHeaders[_DYN_LENGTH$2 ] > 0) {\n                        arrForEach(_customHeaders, function (customHeader) {\n                            _this.addHeader(customHeader.header, customHeader.value);\n                        });\n                    }\n                    else {\n                        _customHeaders = null;\n                    }\n                    _enableSendPromise = senderConfig.enableSendPromise;\n                    var customInterface = senderConfig.httpXHROverride;\n                    var httpInterface = null;\n                    var syncInterface = null;\n                    var theTransports = _prependTransports([3 , 1 , 2 ], senderConfig.transports);\n                    httpInterface = _getSenderInterface(theTransports, false);\n                    var xhrInterface = { sendPOST: _xhrSender };\n                    _xhrSend = function (payload, isAsync) {\n                        return _doSend(xhrInterface, payload, isAsync);\n                    };\n                    _fallbackSend = function (payload, isAsync) {\n                        return _doSend(xhrInterface, payload, isAsync, false);\n                    };\n                    httpInterface = _alwaysUseCustomSend ? customInterface : (httpInterface || customInterface || xhrInterface);\n                    _self[_DYN__SENDER ] = function (payload, isAsync) {\n                        return _doSend(httpInterface, payload, isAsync);\n                    };\n                    if (_fetchKeepAlive) {\n                        _syncUnloadSender = _fetchKeepAliveSender;\n                    }\n                    var syncTransports = _prependTransports([3 , 1 ], senderConfig[_DYN_UNLOAD_TRANSPORTS ]);\n                    if (!_fetchKeepAlive) {\n                        syncTransports = syncTransports.filter(function (transport) { return transport !== 2 ; });\n                    }\n                    syncInterface = _getSenderInterface(syncTransports, true);\n                    syncInterface = _alwaysUseCustomSend ? customInterface : (syncInterface || customInterface);\n                    if ((_alwaysUseCustomSend || senderConfig[_DYN_UNLOAD_TRANSPORTS ] || !_syncUnloadSender) && syncInterface) {\n                        _syncUnloadSender = function (payload, isAsync) {\n                            return _doSend(syncInterface, payload, isAsync);\n                        };\n                    }\n                    if (!_syncUnloadSender) {\n                        _syncUnloadSender = _xhrSend;\n                    }\n                    _disableTelemetry = senderConfig.disableTelemetry;\n                    _convertUndefined = senderConfig[_DYN_CONVERT_UNDEFINED ] || UNDEFINED_VALUE$1;\n                    _isRetryDisabled = senderConfig.isRetryDisabled;\n                    _maxBatchInterval = senderConfig[_DYN_MAX_BATCH_INTERVAL ];\n                }));\n            };\n            _self.processTelemetry = function (telemetryItem, itemCtx) {\n                itemCtx = _self._getTelCtx(itemCtx);\n                var diagLogger = itemCtx[_DYN_DIAG_LOG ]();\n                try {\n                    if (_disableTelemetry) {\n                        return;\n                    }\n                    if (!telemetryItem) {\n                        _throwInternal(diagLogger, 1 , 7 , \"Cannot send empty telemetry\");\n                        return;\n                    }\n                    if (telemetryItem.baseData && !telemetryItem[_DYN_BASE_TYPE ]) {\n                        _throwInternal(diagLogger, 1 , 70 , \"Cannot send telemetry without baseData and baseType\");\n                        return;\n                    }\n                    if (!telemetryItem[_DYN_BASE_TYPE ]) {\n                        telemetryItem[_DYN_BASE_TYPE ] = \"EventData\";\n                    }\n                    if (!_self[_DYN__SENDER ]) {\n                        _throwInternal(diagLogger, 1 , 28 , \"Sender was not initialized\");\n                        return;\n                    }\n                    if (!_isSampledIn(telemetryItem)) {\n                        _throwInternal(diagLogger, 2 , 33 , \"Telemetry item was sampled out and not sent\", { SampleRate: _self._sample[_DYN_SAMPLE_RATE ] });\n                        return;\n                    }\n                    else {\n                        telemetryItem[SampleRate] = _self._sample[_DYN_SAMPLE_RATE ];\n                    }\n                    var defaultEnvelopeIkey = telemetryItem.iKey || _instrumentationKey;\n                    var aiEnvelope_1 = Sender.constructEnvelope(telemetryItem, defaultEnvelopeIkey, diagLogger, _convertUndefined);\n                    if (!aiEnvelope_1) {\n                        _throwInternal(diagLogger, 1 , 47 , \"Unable to create an AppInsights envelope\");\n                        return;\n                    }\n                    var doNotSendItem_1 = false;\n                    if (telemetryItem[_DYN_TAGS ] && telemetryItem[_DYN_TAGS ][ProcessLegacy]) {\n                        arrForEach(telemetryItem[_DYN_TAGS ][ProcessLegacy], function (callBack) {\n                            try {\n                                if (callBack && callBack(aiEnvelope_1) === false) {\n                                    doNotSendItem_1 = true;\n                                    _warnToConsole(diagLogger, \"Telemetry processor check returns false\");\n                                }\n                            }\n                            catch (e) {\n                                _throwInternal(diagLogger, 1 , 64 , \"One of telemetry initializers failed, telemetry item will not be sent: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n                            }\n                        });\n                        delete telemetryItem[_DYN_TAGS ][ProcessLegacy];\n                    }\n                    if (doNotSendItem_1) {\n                        return;\n                    }\n                    var payload = _serializer.serialize(aiEnvelope_1);\n                    var buffer = _self[_DYN__BUFFER ];\n                    _checkMaxSize(payload);\n                    buffer[_DYN_ENQUEUE ](payload);\n                    _setupTimer();\n                }\n                catch (e) {\n                    _throwInternal(diagLogger, 2 , 12 , \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                }\n                _self.processNext(telemetryItem, itemCtx);\n            };\n            _self[_DYN__XHR_READY_STATE_CHA8 ] = function (xhr, payload, countOfItemsInPayload) {\n                if (xhr.readyState === 4) {\n                    _checkResponsStatus(xhr.status, payload, xhr.responseURL, countOfItemsInPayload, _formatErrorMessageXhr(xhr), _getResponseText(xhr) || xhr.response);\n                }\n            };\n            _self[_DYN_TRIGGER_SEND ] = function (async, forcedSender, sendReason) {\n                if (async === void 0) { async = true; }\n                var result;\n                if (!_paused) {\n                    try {\n                        var buffer = _self[_DYN__BUFFER ];\n                        if (!_disableTelemetry) {\n                            if (buffer[_DYN_COUNT ]() > 0) {\n                                var payload = buffer.getItems();\n                                _notifySendRequest(sendReason || 0 , async);\n                                if (forcedSender) {\n                                    result = forcedSender.call(_self, payload, async);\n                                }\n                                else {\n                                    result = _self[_DYN__SENDER ](payload, async);\n                                }\n                            }\n                        }\n                        else {\n                            buffer[_DYN_CLEAR ]();\n                        }\n                        _clearScheduledTimer();\n                    }\n                    catch (e) {\n                        var ieVer = getIEVersion();\n                        if (!ieVer || ieVer > 9) {\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 40 , \"Telemetry transmission failed, some telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                    }\n                }\n                return result;\n            };\n            _self._doTeardown = function (unloadCtx, unloadState) {\n                _self.onunloadFlush();\n                runTargetUnload(_offlineListener, false);\n                _initDefaults();\n            };\n            _self[_DYN__ON_ERROR ] = function (payload, message, event) {\n                _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 26 , \"Failed to send telemetry.\", { message: message });\n                _self._buffer && _self._buffer[_DYN_CLEAR_SENT ](payload);\n            };\n            _self[_DYN__ON_PARTIAL_SUCCESS ] = function (payload, results) {\n                var failed = [];\n                var retry = [];\n                var errors = results.errors.reverse();\n                for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                    var error = errors_1[_i];\n                    var extracted = payload.splice(error.index, 1)[0];\n                    if (_isRetriable(error.statusCode)) {\n                        retry[_DYN_PUSH ](extracted);\n                    }\n                    else {\n                        failed[_DYN_PUSH ](extracted);\n                    }\n                }\n                if (payload[_DYN_LENGTH$2 ] > 0) {\n                    _self[_DYN__ON_SUCCESS ](payload, results[_DYN_ITEMS_ACCEPTED ]);\n                }\n                if (failed[_DYN_LENGTH$2 ] > 0) {\n                    _self[_DYN__ON_ERROR ](failed, _formatErrorMessageXhr(null, [\"partial success\", results[_DYN_ITEMS_ACCEPTED ], \"of\", results.itemsReceived].join(\" \")));\n                }\n                if (retry[_DYN_LENGTH$2 ] > 0) {\n                    _resendPayload(retry);\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \"Partial success. \" +\n                        \"Delivered: \" + payload[_DYN_LENGTH$2 ] + \", Failed: \" + failed[_DYN_LENGTH$2 ] +\n                        \". Will retry to send \" + retry[_DYN_LENGTH$2 ] + \" our of \" + results[_DYN_ITEMS_RECEIVED ] + \" items\");\n                }\n            };\n            _self[_DYN__ON_SUCCESS ] = function (payload, countOfItemsInPayload) {\n                _self._buffer && _self._buffer[_DYN_CLEAR_SENT ](payload);\n            };\n            _self._xdrOnLoad = function (xdr, payload) {\n                var responseText = _getResponseText(xdr);\n                if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\n                    _consecutiveErrors = 0;\n                    _self[_DYN__ON_SUCCESS ](payload, 0);\n                }\n                else {\n                    var results = _parseResponse(responseText);\n                    if (results && results.itemsReceived && results.itemsReceived > results[_DYN_ITEMS_ACCEPTED ]\n                        && !_isRetryDisabled) {\n                        _self[_DYN__ON_PARTIAL_SUCCESS ](payload, results);\n                    }\n                    else {\n                        _self[_DYN__ON_ERROR ](payload, _formatErrorMessageXdr(xdr));\n                    }\n                }\n            };\n            function _isSampledIn(envelope) {\n                return _self._sample.isSampledIn(envelope);\n            }\n            function _getSenderInterface(transports, syncSupport) {\n                var _a;\n                var transportType = null;\n                var sendPostFunc = null;\n                var lp = 0;\n                while (sendPostFunc == null && lp < transports[_DYN_LENGTH$2 ]) {\n                    transportType = transports[lp];\n                    if (!_disableXhr && transportType === 1 ) {\n                        if (useXDomainRequest()) {\n                            sendPostFunc = _xdrSender;\n                        }\n                        else if (isXhrSupported()) {\n                            sendPostFunc = _xhrSender;\n                        }\n                    }\n                    else if (transportType === 2  && isFetchSupported(syncSupport)) {\n                        sendPostFunc = _fetchSender;\n                    }\n                    else if (transportType === 3  && (syncSupport ? _beaconOnUnloadSupported : _beaconNormalSupported)) {\n                        sendPostFunc = _beaconSender;\n                    }\n                    lp++;\n                }\n                if (sendPostFunc) {\n                    return _a = {},\n                        _a[_DYN_SEND_POST ] = sendPostFunc,\n                        _a;\n                }\n                return null;\n            }\n            function _getOnComplete(payload, status, headers, response) {\n                if (status === 200 && payload) {\n                    _self._onSuccess(payload, payload[_DYN_LENGTH$2 ]);\n                }\n                else {\n                    response && _self[_DYN__ON_ERROR ](payload, response);\n                }\n            }\n            function _doSend(sendInterface, payload, isAsync, markAsSent) {\n                if (markAsSent === void 0) { markAsSent = true; }\n                var onComplete = function (status, headers, response) {\n                    return _getOnComplete(payload, status, headers, response);\n                };\n                var payloadData = _getPayload(payload);\n                var sendPostFunc = sendInterface && sendInterface[_DYN_SEND_POST ];\n                if (sendPostFunc && payloadData) {\n                    if (markAsSent) {\n                        _self._buffer[_DYN_MARK_AS_SENT ](payload);\n                    }\n                    return sendPostFunc(payloadData, onComplete, !isAsync);\n                }\n                return null;\n            }\n            function _getPayload(payload) {\n                var _a;\n                if (isArray(payload) && payload[_DYN_LENGTH$2 ] > 0) {\n                    var batch = _self._buffer[_DYN_BATCH_PAYLOADS ](payload);\n                    var payloadData = (_a = {},\n                        _a[_DYN_DATA ] = batch,\n                        _a.urlString = _endpointUrl,\n                        _a.headers = _headers,\n                        _a.disableXhrSync = _disableXhr,\n                        _a.disableFetchKeepAlive = !_fetchKeepAlive,\n                        _a[_DYN_ORI_PAYLOAD ] = payload,\n                        _a);\n                    return payloadData;\n                }\n                return null;\n            }\n            function _fetchSender(payload, oncomplete, sync) {\n                return _doFetchSender(payload, oncomplete, false);\n            }\n            function _checkMaxSize(incomingPayload) {\n                var incomingSize = incomingPayload ? incomingPayload[_DYN_LENGTH$2 ] : 0;\n                if ((_self[_DYN__BUFFER ].size() + incomingSize) > _maxBatchSizeInBytes) {\n                    if (!_offlineListener || _offlineListener.isOnline()) {\n                        _self[_DYN_TRIGGER_SEND ](true, null, 10 );\n                    }\n                    return true;\n                }\n                return false;\n            }\n            function _checkResponsStatus(status, payload, responseUrl, countOfItemsInPayload, errorMessage, res) {\n                var response = null;\n                if (!_self._appId) {\n                    response = _parseResponse(res);\n                    if (response && response.appId) {\n                        _self._appId = response.appId;\n                    }\n                }\n                if ((status < 200 || status >= 300) && status !== 0) {\n                    if (status === 301 || status === 307 || status === 308) {\n                        if (!_checkAndUpdateEndPointUrl(responseUrl)) {\n                            _self[_DYN__ON_ERROR ](payload, errorMessage);\n                            return;\n                        }\n                    }\n                    if (!_isRetryDisabled && _isRetriable(status)) {\n                        _resendPayload(payload);\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" +\n                            \"Response code \" + status + \". Will retry to send \" + payload[_DYN_LENGTH$2 ] + \" items.\");\n                    }\n                    else {\n                        _self[_DYN__ON_ERROR ](payload, errorMessage);\n                    }\n                }\n                else if (_offlineListener && !_offlineListener.isOnline()) {\n                    if (!_isRetryDisabled) {\n                        var offlineBackOffMultiplier = 10;\n                        _resendPayload(payload, offlineBackOffMultiplier);\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". Offline - Response Code: \".concat(status, \". Offline status: \").concat(!_offlineListener.isOnline(), \". Will retry to send \").concat(payload.length, \" items.\"));\n                    }\n                }\n                else {\n                    _checkAndUpdateEndPointUrl(responseUrl);\n                    if (status === 206) {\n                        if (!response) {\n                            response = _parseResponse(res);\n                        }\n                        if (response && !_isRetryDisabled) {\n                            _self[_DYN__ON_PARTIAL_SUCCESS ](payload, response);\n                        }\n                        else {\n                            _self[_DYN__ON_ERROR ](payload, errorMessage);\n                        }\n                    }\n                    else {\n                        _consecutiveErrors = 0;\n                        _self[_DYN__ON_SUCCESS ](payload, countOfItemsInPayload);\n                    }\n                }\n            }\n            function _checkAndUpdateEndPointUrl(responseUrl) {\n                if (_stamp_specific_redirects >= 10) {\n                    return false;\n                }\n                if (!isNullOrUndefined(responseUrl) && responseUrl !== \"\") {\n                    if (responseUrl !== _endpointUrl) {\n                        _endpointUrl = responseUrl;\n                        ++_stamp_specific_redirects;\n                        return true;\n                    }\n                }\n                return false;\n            }\n            function _doOnComplete(oncomplete, status, headers, response) {\n                try {\n                    oncomplete(status, headers, response);\n                }\n                catch (e) {\n                }\n            }\n            function _doUnloadSend(payload, isAsync) {\n                if (_syncUnloadSender) {\n                    _syncUnloadSender(payload, false);\n                }\n                else {\n                    var payloadData = _getPayload(payload);\n                    _beaconSender(payloadData);\n                }\n            }\n            function _doBeaconSend(payload, oncomplete) {\n                var nav = getNavigator();\n                var url = _endpointUrl;\n                var buffer = _self[_DYN__BUFFER ];\n                var batch = buffer[_DYN_BATCH_PAYLOADS ](payload);\n                var plainTextBatch = new Blob([batch], { type: \"text/plain;charset=UTF-8\" });\n                var queued = nav.sendBeacon(url, plainTextBatch);\n                if (queued) {\n                    _self._onSuccess(payload, payload[_DYN_LENGTH$2 ]);\n                }\n                return queued;\n            }\n            function _beaconSender(payload, oncomplete, sync) {\n                var internalPayload = payload;\n                var data = internalPayload && internalPayload[_DYN_ORI_PAYLOAD ];\n                if (isArray(data) && data[_DYN_LENGTH$2 ] > 0) {\n                    if (!_doBeaconSend(data)) {\n                        if (!_disableBeaconSplit) {\n                            var droppedPayload = [];\n                            for (var lp = 0; lp < data[_DYN_LENGTH$2 ]; lp++) {\n                                var thePayload = data[lp];\n                                if (!_doBeaconSend([thePayload])) {\n                                    droppedPayload[_DYN_PUSH ](thePayload);\n                                }\n                            }\n                            if (droppedPayload[_DYN_LENGTH$2 ] > 0) {\n                                _fallbackSend && _fallbackSend(droppedPayload, true);\n                                _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" + \"Failed to send telemetry with Beacon API, retried with normal sender.\");\n                            }\n                        }\n                        else {\n                            _fallbackSend && _fallbackSend(data, true);\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" + \"Failed to send telemetry with Beacon API, retried with normal sender.\");\n                        }\n                    }\n                }\n            }\n            function _xhrSender(payload, oncomplete, sync) {\n                var internalPayload = payload;\n                var thePromise;\n                var resolveFunc;\n                var rejectFunc;\n                var xhr = new XMLHttpRequest();\n                var endPointUrl = _endpointUrl;\n                try {\n                    xhr[DisabledPropertyName] = true;\n                }\n                catch (e) {\n                }\n                xhr.open(\"POST\", endPointUrl, !sync);\n                xhr[_DYN_SET_REQUEST_HEADER$1 ](\"Content-type\", \"application/json\");\n                if (isInternalApplicationInsightsEndpoint(endPointUrl)) {\n                    xhr[_DYN_SET_REQUEST_HEADER$1 ](RequestHeaders[6 ], RequestHeaders[7 ]);\n                }\n                arrForEach(objKeys(_headers), function (headerName) {\n                    xhr[_DYN_SET_REQUEST_HEADER$1 ](headerName, _headers[headerName]);\n                });\n                xhr.onreadystatechange = function () {\n                    var oriPayload = internalPayload[_DYN_ORI_PAYLOAD ];\n                    _self._xhrReadyStateChange(xhr, oriPayload, oriPayload[_DYN_LENGTH$2 ]);\n                    if (xhr.readyState === 4) {\n                        resolveFunc && resolveFunc(true);\n                    }\n                };\n                xhr.onerror = function (event) {\n                    _doOnComplete(oncomplete, 400, {}, _formatErrorMessageXhr(xhr));\n                    rejectFunc && rejectFunc(event);\n                };\n                if (!sync && _enableSendPromise) {\n                    thePromise = createPromise(function (resolve, reject) {\n                        resolveFunc = resolve;\n                        rejectFunc = reject;\n                    });\n                }\n                xhr.send(payload[_DYN_DATA ]);\n                return thePromise;\n            }\n            function _fetchKeepAliveSender(payload, isAsync) {\n                var onComplete = function (status, headers, response) {\n                    return _getOnComplete(payload, status, headers, response);\n                };\n                if (isArray(payload)) {\n                    var payloadSize = payload[_DYN_LENGTH$2 ];\n                    for (var lp = 0; lp < payload[_DYN_LENGTH$2 ]; lp++) {\n                        payloadSize += payload[lp][_DYN_LENGTH$2 ];\n                    }\n                    var payloadData = _getPayload(payload);\n                    _self._buffer[_DYN_MARK_AS_SENT ](payload);\n                    if ((_syncFetchPayload + payloadSize) <= FetchSyncRequestSizeLimitBytes) {\n                        _doFetchSender(payloadData, onComplete, true);\n                    }\n                    else if (isBeaconsSupported()) {\n                        _beaconSender(payloadData);\n                    }\n                    else {\n                        _fallbackSend && _fallbackSend(payload, true);\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" + \"Failed to send telemetry with Beacon API, retried with xhrSender.\");\n                    }\n                }\n            }\n            function _doFetchSender(payload, oncomplete, sync) {\n                var _a;\n                var endPointUrl = _endpointUrl;\n                var internalPayload = payload;\n                var batch = internalPayload[_DYN_DATA ];\n                var plainTextBatch = new Blob([batch], { type: \"application/json\" });\n                var thePromise;\n                var resolveFunc;\n                var rejectFunc;\n                var requestHeaders = new Headers();\n                var batchLength = batch[_DYN_LENGTH$2 ];\n                var ignoreResponse = false;\n                var responseHandled = false;\n                if (isInternalApplicationInsightsEndpoint(endPointUrl)) {\n                    requestHeaders.append(RequestHeaders[6 ], RequestHeaders[7 ]);\n                }\n                arrForEach(objKeys(_headers), function (headerName) {\n                    requestHeaders.append(headerName, _headers[headerName]);\n                });\n                var init = (_a = {\n                        method: \"POST\",\n                        headers: requestHeaders,\n                        body: plainTextBatch\n                    },\n                    _a[DisabledPropertyName] = true\n                ,\n                    _a);\n                if (sync) {\n                    init.keepalive = true;\n                    ignoreResponse = true;\n                    _syncFetchPayload += batchLength;\n                }\n                var request = new Request(endPointUrl, init);\n                try {\n                    request[DisabledPropertyName] = true;\n                }\n                catch (e) {\n                }\n                if (!sync && _enableSendPromise) {\n                    thePromise = createPromise(function (resolve, reject) {\n                        resolveFunc = resolve;\n                        rejectFunc = reject;\n                    });\n                }\n                try {\n                    doAwaitResponse(fetch(request), function (result) {\n                        if (sync) {\n                            _syncFetchPayload -= batchLength;\n                            batchLength = 0;\n                        }\n                        if (!responseHandled) {\n                            responseHandled = true;\n                            if (!result.rejected) {\n                                var response_1 = result.value;\n                                if (!response_1.ok) {\n                                    _doOnComplete(oncomplete, 400, {}, response_1.statusText);\n                                    resolveFunc && resolveFunc(false);\n                                }\n                                else {\n                                    doAwaitResponse(response_1.text(), function (resp) {\n                                        var oriPayload = internalPayload[_DYN_ORI_PAYLOAD ];\n                                        _checkResponsStatus(response_1.status, oriPayload, response_1.url, oriPayload[_DYN_LENGTH$2 ], response_1.statusText, resp.value || \"\");\n                                        resolveFunc && resolveFunc(true);\n                                    });\n                                }\n                            }\n                            else {\n                                _doOnComplete(oncomplete, 400, {}, result.reason && result.reason.message);\n                                rejectFunc && rejectFunc(result.reason);\n                            }\n                        }\n                    });\n                }\n                catch (e) {\n                    if (!responseHandled) {\n                        _doOnComplete(oncomplete, 400, {}, dumpObj(e));\n                        rejectFunc && rejectFunc(e);\n                    }\n                }\n                if (ignoreResponse && !responseHandled) {\n                    responseHandled = true;\n                    _doOnComplete(oncomplete, 200, {});\n                    resolveFunc && resolveFunc(true);\n                }\n                return thePromise;\n            }\n            function _parseResponse(response) {\n                try {\n                    if (response && response !== \"\") {\n                        var result = getJSON().parse(response);\n                        if (result && result.itemsReceived && result.itemsReceived >= result[_DYN_ITEMS_ACCEPTED ] &&\n                            result.itemsReceived - result.itemsAccepted === result.errors[_DYN_LENGTH$2 ]) {\n                            return result;\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 43 , \"Cannot parse the response. \" + getExceptionName(e), {\n                        response: response\n                    });\n                }\n                return null;\n            }\n            function _resendPayload(payload, linearFactor) {\n                if (linearFactor === void 0) { linearFactor = 1; }\n                if (!payload || payload[_DYN_LENGTH$2 ] === 0) {\n                    return;\n                }\n                var buffer = _self[_DYN__BUFFER ];\n                buffer[_DYN_CLEAR_SENT ](payload);\n                _consecutiveErrors++;\n                for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                    var item = payload_1[_i];\n                    buffer[_DYN_ENQUEUE ](item);\n                }\n                _setRetryTime(linearFactor);\n                _setupTimer();\n            }\n            function _setRetryTime(linearFactor) {\n                var SlotDelayInSeconds = 10;\n                var delayInSeconds;\n                if (_consecutiveErrors <= 1) {\n                    delayInSeconds = SlotDelayInSeconds;\n                }\n                else {\n                    var backOffSlot = (Math.pow(2, _consecutiveErrors) - 1) / 2;\n                    var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                    backOffDelay = linearFactor * backOffDelay;\n                    delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n                }\n                var retryAfterTimeSpan = utcNow() + (delayInSeconds * 1000);\n                _retryAt = retryAfterTimeSpan;\n            }\n            function _setupTimer() {\n                if (!_timeoutHandle && !_paused) {\n                    var retryInterval = _retryAt ? Math.max(0, _retryAt - utcNow()) : 0;\n                    var timerValue = Math.max(_maxBatchInterval, retryInterval);\n                    _timeoutHandle = scheduleTimeout(function () {\n                        _timeoutHandle = null;\n                        _self[_DYN_TRIGGER_SEND ](true, null, 1 );\n                    }, timerValue);\n                }\n            }\n            function _clearScheduledTimer() {\n                _timeoutHandle && _timeoutHandle.cancel();\n                _timeoutHandle = null;\n                _retryAt = null;\n            }\n            function _isRetriable(statusCode) {\n                return statusCode === 401\n                    || statusCode === 403\n                    || statusCode === 408\n                    || statusCode === 429\n                    || statusCode === 500\n                    || statusCode === 502\n                    || statusCode === 503\n                    || statusCode === 504;\n            }\n            function _formatErrorMessageXhr(xhr, message) {\n                if (xhr) {\n                    return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + _getResponseText(xhr) || xhr.response || \"\";\n                }\n                return message;\n            }\n            function _xdrSender(payload, oncomplete, sync) {\n                var internalPayload = payload;\n                var _window = getWindow();\n                var xdr = new XDomainRequest();\n                var data = internalPayload[_DYN_DATA ];\n                xdr.onload = function () {\n                    var oriPayload = internalPayload[_DYN_ORI_PAYLOAD ];\n                    _self._xdrOnLoad(xdr, oriPayload);\n                };\n                xdr.onerror = function () {\n                    _doOnComplete(oncomplete, 400, {}, _formatErrorMessageXdr(xdr));\n                };\n                var hostingProtocol = _window && _window.location && _window.location.protocol || \"\";\n                if (_endpointUrl.lastIndexOf(hostingProtocol, 0) !== 0) {\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" +\n                        \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                    _self._buffer[_DYN_CLEAR ]();\n                    return;\n                }\n                var endpointUrl = _endpointUrl.replace(/^(https?:)/, \"\");\n                xdr.open(\"POST\", endpointUrl);\n                xdr.send(data);\n            }\n            function _formatErrorMessageXdr(xdr, message) {\n                if (xdr) {\n                    return \"XDomainRequest,Response:\" + _getResponseText(xdr) || \"\";\n                }\n                return message;\n            }\n            function _getNotifyMgr() {\n                var func = \"getNotifyMgr\";\n                if (_self.core[func]) {\n                    return _self.core[func]();\n                }\n                return _self.core[\"_notificationManager\"];\n            }\n            function _notifySendRequest(sendRequest, isAsync) {\n                var manager = _getNotifyMgr();\n                if (manager && manager[_DYN_EVENTS_SEND_REQUEST ]) {\n                    try {\n                        manager[_DYN_EVENTS_SEND_REQUEST ](sendRequest, isAsync);\n                    }\n                    catch (e) {\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 74 , \"send request notification failed: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                }\n            }\n            function _validateInstrumentationKey(instrumentationKey, config) {\n                var disableValidation = config.disableInstrumentationKeyValidation;\n                var disableIKeyValidationFlag = isNullOrUndefined(disableValidation) ? false : disableValidation;\n                if (disableIKeyValidationFlag) {\n                    return true;\n                }\n                var UUID_Regex = \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n                var regexp = new RegExp(UUID_Regex);\n                return regexp.test(instrumentationKey);\n            }\n            function _initDefaults() {\n                _self[_DYN__SENDER ] = null;\n                _self[_DYN__BUFFER ] = null;\n                _self._appId = null;\n                _self._sample = null;\n                _headers = {};\n                _offlineListener = null;\n                _consecutiveErrors = 0;\n                _retryAt = null;\n                _paused = false;\n                _timeoutHandle = null;\n                _serializer = null;\n                _stamp_specific_redirects = 0;\n                _syncFetchPayload = 0;\n                _syncUnloadSender = null;\n                _evtNamespace = null;\n                _endpointUrl = null;\n                _orgEndpointUrl = null;\n                _maxBatchSizeInBytes = 0;\n                _beaconSupported = false;\n                _customHeaders = null;\n                _disableTelemetry = false;\n                _instrumentationKey = null;\n                _convertUndefined = UNDEFINED_VALUE$1;\n                _isRetryDisabled = false;\n                _sessionStorageUsed = null;\n                _namePrefix = UNDEFINED_VALUE$1;\n                _disableXhr = false;\n                _fetchKeepAlive = false;\n                _disableBeaconSplit = false;\n                _xhrSend = null;\n                _fallbackSend = null;\n                objDefine(_self, \"_senderConfig\", {\n                    g: function () {\n                        return objExtend({}, defaultAppInsightsChannelConfig);\n                    }\n                });\n            }\n        });\n        return _this;\n    }\n    Sender.constructEnvelope = function (orig, iKey, logger, convertUndefined) {\n        var envelope;\n        if (iKey !== orig.iKey && !isNullOrUndefined(iKey)) {\n            envelope = __assignFn(__assignFn({}, orig), { iKey: iKey });\n        }\n        else {\n            envelope = orig;\n        }\n        var creator = EnvelopeTypeCreator[envelope.baseType] || EventEnvelopeCreator;\n        return creator(logger, envelope, convertUndefined);\n    };\n    return Sender;\n}(BaseTelemetryPlugin));\n\nvar STR_DURATION = \"duration\";\nvar STR_PROPERTIES = \"properties\";\n\nvar _DYN_REQUEST_URL = \"requestUrl\";\nvar _DYN_INST = \"inst\";\nvar _DYN_LENGTH$1 = \"length\";\nvar _DYN_TRACE_ID = \"traceID\";\nvar _DYN_SPAN_ID = \"spanID\";\nvar _DYN_TRACE_FLAGS = \"traceFlags\";\nvar _DYN_CONTEXT$1 = \"context\";\nvar _DYN_ABORTED = \"aborted\";\nvar _DYN_TRACE_ID0 = \"traceId\";\nvar _DYN_SPAN_ID1 = \"spanId\";\nvar _DYN__ADD_HOOK = \"_addHook\";\nvar _DYN_CORE = \"core\";\nvar _DYN_INCLUDE_CORRELATION_2 = \"includeCorrelationHeaders\";\nvar _DYN_GET_ABSOLUTE_URL = \"getAbsoluteUrl\";\nvar _DYN_HEADERS = \"headers\";\nvar _DYN_REQUEST_HEADERS = \"requestHeaders\";\nvar _DYN_SET_REQUEST_HEADER = \"setRequestHeader\";\nvar _DYN_TRACK_DEPENDENCY_DAT3 = \"trackDependencyDataInternal\";\nvar _DYN_START_TIME = \"startTime\";\nvar _DYN_TO_LOWER_CASE = \"toLowerCase\";\nvar _DYN_ENABLE_REQUEST_HEADE4 = \"enableRequestHeaderTracking\";\nvar _DYN_ENABLE_AJAX_ERROR_ST5 = \"enableAjaxErrorStatusText\";\nvar _DYN_ENABLE_AJAX_PERF_TRA6 = \"enableAjaxPerfTracking\";\nvar _DYN_MAX_AJAX_CALLS_PER_V7 = \"maxAjaxCallsPerView\";\nvar _DYN_EXCLUDE_REQUEST_FROM8 = \"excludeRequestFromAutoTrackingPatterns\";\nvar _DYN_ADD_REQUEST_CONTEXT = \"addRequestContext\";\nvar _DYN_DISABLE_AJAX_TRACKIN9 = \"disableAjaxTracking\";\nvar _DYN_AJAX_PERF_LOOKUP_DEL10 = \"ajaxPerfLookupDelay\";\nvar _DYN_DISABLE_FETCH_TRACKI11 = \"disableFetchTracking\";\nvar _DYN_ENABLE_RESPONSE_HEAD12 = \"enableResponseHeaderTracking\";\nvar _DYN_STATUS = \"status\";\nvar _DYN_STATUS_TEXT = \"statusText\";\nvar _DYN_HEADER_MAP = \"headerMap\";\nvar _DYN_OPEN_DONE = \"openDone\";\nvar _DYN_SEND_DONE = \"sendDone\";\nvar _DYN_REQUEST_SENT_TIME = \"requestSentTime\";\nvar _DYN_ABORT_DONE = \"abortDone\";\nvar _DYN_GET_TRACE_ID = \"getTraceId\";\nvar _DYN_GET_TRACE_FLAGS = \"getTraceFlags\";\nvar _DYN_METHOD = \"method\";\nvar _DYN_ERROR_STATUS_TEXT = \"errorStatusText\";\nvar _DYN_STATE_CHANGE_ATTACHE13 = \"stateChangeAttached\";\nvar _DYN_RESPONSE_TEXT = \"responseText\";\nvar _DYN_RESPONSE_FINISHED_TI14 = \"responseFinishedTime\";\nvar _DYN__CREATE_TRACK_ITEM = \"CreateTrackItem\";\nvar _DYN_RESPONSE = \"response\";\nvar _DYN_GET_ALL_RESPONSE_HEA15 = \"getAllResponseHeaders\";\nvar _DYN_GET_PART_APROPS = \"getPartAProps\";\nvar _DYN_PERF_MARK = \"perfMark\";\nvar _DYN_NAME = \"name\";\nvar _DYN_PERF_TIMING = \"perfTiming\";\nvar _DYN_EXCEPTION = \"exception\";\nvar _DYN_AJAX_DIAGNOSTICS_MES16 = \"ajaxDiagnosticsMessage\";\nvar _DYN_CORRELATION_CONTEXT = \"correlationContext\";\nvar _DYN_AJAX_TOTAL_DURATION = \"ajaxTotalDuration\";\nvar _DYN_EVENT_TRACE_CTX = \"eventTraceCtx\";\n\nfunction _calcPerfDuration(resourceEntry, start, end) {\n    var result = 0;\n    var from = resourceEntry[start];\n    var to = resourceEntry[end];\n    if (from && to) {\n        result = dateTimeUtilsDuration(from, to);\n    }\n    return result;\n}\nfunction _setPerfDuration(props, name, resourceEntry, start, end) {\n    var result = 0;\n    var value = _calcPerfDuration(resourceEntry, start, end);\n    if (value) {\n        result = _setPerfValue(props, name, msToTimeSpan(value));\n    }\n    return result;\n}\nfunction _setPerfValue(props, name, value) {\n    var strPerf = \"ajaxPerf\";\n    var result = 0;\n    if (props && name && value) {\n        var perfData = props[strPerf] = (props[strPerf] || {});\n        perfData[name] = value;\n        result = 1;\n    }\n    return result;\n}\nfunction _populatePerfData(ajaxData, dependency) {\n    var resourceEntry = ajaxData[_DYN_PERF_TIMING ];\n    var props = dependency[STR_PROPERTIES ] || {};\n    var propsSet = 0;\n    var strName = \"name\";\n    var strStart = \"Start\";\n    var strEnd = \"End\";\n    var strDomainLookup = \"domainLookup\";\n    var strConnect = \"connect\";\n    var strRedirect = \"redirect\";\n    var strRequest = \"request\";\n    var strResponse = \"response\";\n    var strStartTime = \"startTime\";\n    var strDomainLookupStart = strDomainLookup + strStart;\n    var strDomainLookupEnd = strDomainLookup + strEnd;\n    var strConnectStart = strConnect + strStart;\n    var strConnectEnd = strConnect + strEnd;\n    var strRequestStart = strRequest + strStart;\n    var strRequestEnd = strRequest + strEnd;\n    var strResponseStart = strResponse + strStart;\n    var strResponseEnd = strResponse + strEnd;\n    var strRedirectStart = strRedirect + strStart;\n    var strRedirectEnd = strRedirect = strEnd;\n    var strTransferSize = \"transferSize\";\n    var strEncodedBodySize = \"encodedBodySize\";\n    var strDecodedBodySize = \"decodedBodySize\";\n    var strServerTiming = \"serverTiming\";\n    if (resourceEntry) {\n        propsSet |= _setPerfDuration(props, strRedirect, resourceEntry, strRedirectStart, strRedirectEnd);\n        propsSet |= _setPerfDuration(props, strDomainLookup, resourceEntry, strDomainLookupStart, strDomainLookupEnd);\n        propsSet |= _setPerfDuration(props, strConnect, resourceEntry, strConnectStart, strConnectEnd);\n        propsSet |= _setPerfDuration(props, strRequest, resourceEntry, strRequestStart, strRequestEnd);\n        propsSet |= _setPerfDuration(props, strResponse, resourceEntry, strResponseStart, strResponseEnd);\n        propsSet |= _setPerfDuration(props, \"networkConnect\", resourceEntry, strStartTime, strConnectEnd);\n        propsSet |= _setPerfDuration(props, \"sentRequest\", resourceEntry, strRequestStart, strResponseEnd);\n        var duration = resourceEntry[STR_DURATION ];\n        if (!duration) {\n            duration = _calcPerfDuration(resourceEntry, strStartTime, strResponseEnd) || 0;\n        }\n        propsSet |= _setPerfValue(props, STR_DURATION, duration);\n        propsSet |= _setPerfValue(props, \"perfTotal\", duration);\n        var serverTiming = resourceEntry[strServerTiming];\n        if (serverTiming) {\n            var server_1 = {};\n            arrForEach(serverTiming, function (value, idx) {\n                var name = normalizeJsName(value[strName] || \"\" + idx);\n                var newValue = server_1[name] || {};\n                objForEachKey(value, function (key, val) {\n                    if (key !== strName && isString(val) || isNumber(val)) {\n                        if (newValue[key]) {\n                            val = newValue[key] + \";\" + val;\n                        }\n                        if (val || !isString(val)) {\n                            newValue[key] = val;\n                        }\n                    }\n                });\n                server_1[name] = newValue;\n            });\n            propsSet |= _setPerfValue(props, strServerTiming, server_1);\n        }\n        propsSet |= _setPerfValue(props, strTransferSize, resourceEntry[strTransferSize]);\n        propsSet |= _setPerfValue(props, strEncodedBodySize, resourceEntry[strEncodedBodySize]);\n        propsSet |= _setPerfValue(props, strDecodedBodySize, resourceEntry[strDecodedBodySize]);\n    }\n    else {\n        if (ajaxData[_DYN_PERF_MARK ]) {\n            propsSet |= _setPerfValue(props, \"missing\", ajaxData.perfAttempts);\n        }\n    }\n    if (propsSet) {\n        dependency[STR_PROPERTIES ] = props;\n    }\n}\nvar XHRMonitoringState = /** @class */ (function () {\n    function XHRMonitoringState() {\n        var self = this;\n        self[_DYN_OPEN_DONE ] = false;\n        self.setRequestHeaderDone = false;\n        self[_DYN_SEND_DONE ] = false;\n        self[_DYN_ABORT_DONE ] = false;\n        self[_DYN_STATE_CHANGE_ATTACHE13 ] = false;\n    }\n    return XHRMonitoringState;\n}());\nvar ajaxRecord = /** @class */ (function () {\n    function ajaxRecord(traceId, spanId, logger, traceCtx) {\n        var _a;\n        var self = this;\n        var _logger = logger;\n        var strResponseText = \"responseText\";\n        self[_DYN_PERF_MARK ] = null;\n        self.completed = false;\n        self.requestHeadersSize = null;\n        self[_DYN_REQUEST_HEADERS ] = null;\n        self.responseReceivingDuration = null;\n        self.callbackDuration = null;\n        self[_DYN_AJAX_TOTAL_DURATION ] = null;\n        self[_DYN_ABORTED ] = 0;\n        self.pageUrl = null;\n        self[_DYN_REQUEST_URL ] = null;\n        self.requestSize = 0;\n        self[_DYN_METHOD ] = null;\n        self[_DYN_STATUS ] = null;\n        self[_DYN_REQUEST_SENT_TIME ] = null;\n        self.responseStartedTime = null;\n        self[_DYN_RESPONSE_FINISHED_TI14 ] = null;\n        self.callbackFinishedTime = null;\n        self.endTime = null;\n        self.xhrMonitoringState = new XHRMonitoringState();\n        self.clientFailure = 0;\n        self[_DYN_TRACE_ID ] = traceId;\n        self[_DYN_SPAN_ID ] = spanId;\n        self[_DYN_TRACE_FLAGS ] = traceCtx === null || traceCtx === void 0 ? void 0 : traceCtx.getTraceFlags();\n        if (traceCtx) {\n            self[_DYN_EVENT_TRACE_CTX ] = (_a = {},\n                _a[_DYN_TRACE_ID0 ] = traceCtx[_DYN_GET_TRACE_ID ](),\n                _a[_DYN_SPAN_ID1 ] = traceCtx.getSpanId(),\n                _a[_DYN_TRACE_FLAGS ] = traceCtx[_DYN_GET_TRACE_FLAGS ](),\n                _a);\n        }\n        else {\n            self[_DYN_EVENT_TRACE_CTX ] = null;\n        }\n        dynamicProto(ajaxRecord, self, function (self) {\n            self.getAbsoluteUrl = function () {\n                return self[_DYN_REQUEST_URL ] ? urlGetAbsoluteUrl(self[_DYN_REQUEST_URL ]) : null;\n            };\n            self.getPathName = function () {\n                return self[_DYN_REQUEST_URL ] ? dataSanitizeUrl(_logger, urlGetCompleteUrl(self[_DYN_METHOD ], self[_DYN_REQUEST_URL ])) : null;\n            };\n            self[_DYN__CREATE_TRACK_ITEM ] = function (ajaxType, enableRequestHeaderTracking, getResponse) {\n                var _a;\n                self.ajaxTotalDuration = Math.round(dateTimeUtilsDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n                if (self[_DYN_AJAX_TOTAL_DURATION ] < 0) {\n                    return null;\n                }\n                var dependency = (_a = {\n                        id: \"|\" + self[_DYN_TRACE_ID ] + \".\" + self[_DYN_SPAN_ID ],\n                        target: self[_DYN_GET_ABSOLUTE_URL ]()\n                    },\n                    _a[_DYN_NAME ] = self.getPathName(),\n                    _a.type = ajaxType,\n                    _a[_DYN_START_TIME ] = null,\n                    _a.duration = self[_DYN_AJAX_TOTAL_DURATION ],\n                    _a.success = (+(self[_DYN_STATUS ])) >= 200 && (+(self[_DYN_STATUS ])) < 400,\n                    _a.responseCode = (+(self[_DYN_STATUS ])),\n                    _a[STR_PROPERTIES] = { HttpMethod: self[_DYN_METHOD ] },\n                    _a);\n                var props = dependency[STR_PROPERTIES];\n                if (self[_DYN_ABORTED ]) {\n                    props[_DYN_ABORTED ] = true;\n                }\n                if (self[_DYN_REQUEST_SENT_TIME ]) {\n                    dependency[_DYN_START_TIME ] = new Date();\n                    dependency[_DYN_START_TIME ].setTime(self[_DYN_REQUEST_SENT_TIME ]);\n                }\n                _populatePerfData(self, dependency);\n                if (enableRequestHeaderTracking) {\n                    if (objKeys(self.requestHeaders)[_DYN_LENGTH$1 ] > 0) {\n                        props[_DYN_REQUEST_HEADERS ] = self[_DYN_REQUEST_HEADERS ];\n                    }\n                }\n                if (getResponse) {\n                    var response = getResponse();\n                    if (response) {\n                        var correlationContext = response[_DYN_CORRELATION_CONTEXT ];\n                        if (correlationContext) {\n                            dependency.correlationContext =  correlationContext;\n                        }\n                        if (response[_DYN_HEADER_MAP ]) {\n                            if (objKeys(response.headerMap)[_DYN_LENGTH$1 ] > 0) {\n                                props.responseHeaders = response[_DYN_HEADER_MAP ];\n                            }\n                        }\n                        if (self[_DYN_ERROR_STATUS_TEXT ]) {\n                            if (self[_DYN_STATUS ] >= 400) {\n                                var responseType = response.type;\n                                if (responseType === \"\" || responseType === \"text\") {\n                                    props.responseText = response.responseText ? response[_DYN_STATUS_TEXT ] + \" - \" + response[strResponseText] : response[_DYN_STATUS_TEXT ];\n                                }\n                                if (responseType === \"json\") {\n                                    props.responseText = response.response ? response[_DYN_STATUS_TEXT ] + \" - \" + JSON.stringify(response[_DYN_RESPONSE ]) : response[_DYN_STATUS_TEXT ];\n                                }\n                            }\n                            else if (self[_DYN_STATUS ] === 0) {\n                                props.responseText = response[_DYN_STATUS_TEXT ] || \"\";\n                            }\n                        }\n                    }\n                }\n                return dependency;\n            };\n            self[_DYN_GET_PART_APROPS ] = function () {\n                var _a;\n                var partA = null;\n                var traceCtx = self[_DYN_EVENT_TRACE_CTX ];\n                if (traceCtx && (traceCtx[_DYN_TRACE_ID0 ] || traceCtx[_DYN_SPAN_ID1 ])) {\n                    partA = {};\n                    var traceExt = partA[Extensions.TraceExt] = (_a = {},\n                        _a[_DYN_TRACE_ID ] = traceCtx[_DYN_TRACE_ID0 ],\n                        _a.parentID = traceCtx[_DYN_SPAN_ID1 ],\n                        _a);\n                    if (!isNullOrUndefined(traceCtx[_DYN_TRACE_FLAGS ])) {\n                        traceExt[_DYN_TRACE_FLAGS ] = traceCtx[_DYN_TRACE_FLAGS ];\n                    }\n                }\n                return partA;\n            };\n        });\n    }\n    ajaxRecord.__ieDyn=1;\n    return ajaxRecord;\n}());\n\nvar _a$2;\nvar AJAX_MONITOR_PREFIX = \"ai.ajxmn.\";\nvar strDiagLog = \"diagLog\";\nvar AJAX_DATA_CONTAINER = \"_ajaxData\";\nvar STR_FETCH = \"fetch\";\nvar ERROR_HEADER = \"Failed to monitor XMLHttpRequest\";\nvar ERROR_PREFIX = \", monitoring data for this ajax call \";\nvar ERROR_POSTFIX = ERROR_PREFIX + \"may be incorrect.\";\nvar ERROR_NOT_SENT = ERROR_PREFIX + \"won't be sent.\";\nvar CORRELATION_HEADER_ERROR = \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\";\nvar CUSTOM_REQUEST_CONTEXT_ERROR = \"Failed to add custom defined request context as configured call back may missing a null check.\";\nvar FAILED_TO_CALCULATE_DURATION_ERROR = \"Failed to calculate the duration of the \";\nvar _markCount = 0;\nfunction _supportsFetch() {\n    var _global = getGlobal();\n    if (!_global ||\n        isNullOrUndefined(_global.Request) ||\n        isNullOrUndefined(_global.Request[strShimPrototype]) ||\n        isNullOrUndefined(_global[STR_FETCH])) {\n        return null;\n    }\n    return _global[STR_FETCH];\n}\nfunction _supportsAjaxMonitoring(ajaxMonitorInstance, ajaxDataId) {\n    var _a, _b;\n    var result = false;\n    if (isXhrSupported()) {\n        var proto = XMLHttpRequest[strShimPrototype];\n        result = !isNullOrUndefined(proto) &&\n            !isNullOrUndefined(proto.open) &&\n            !isNullOrUndefined(proto.send) &&\n            !isNullOrUndefined(proto.abort);\n    }\n    var ieVer = getIEVersion();\n    if (ieVer && ieVer < 9) {\n        result = false;\n    }\n    if (result) {\n        try {\n            var xhr = new XMLHttpRequest();\n            var xhrData = {\n                xh: [],\n                i: (_a = {},\n                    _a[ajaxDataId] = {},\n                    _a)\n            };\n            xhr[AJAX_DATA_CONTAINER] = xhrData;\n            var theOpen = XMLHttpRequest[strShimPrototype].open;\n            XMLHttpRequest[strShimPrototype].open = theOpen;\n        }\n        catch (e) {\n            result = false;\n            _throwInternalCritical(ajaxMonitorInstance, 15 , \"Failed to enable XMLHttpRequest monitoring, extension is not supported\", (_b = {},\n                _b[_DYN_EXCEPTION ] = dumpObj(e),\n                _b));\n        }\n    }\n    return result;\n}\nvar _getAjaxData = function (xhr, ajaxDataId) {\n    if (xhr && ajaxDataId && xhr[AJAX_DATA_CONTAINER]) {\n        return (xhr[AJAX_DATA_CONTAINER].i || {})[ajaxDataId];\n    }\n    return null;\n};\nvar _addSharedXhrHeaders = function (xhr, name, value) {\n    if (xhr) {\n        var headers = (xhr[AJAX_DATA_CONTAINER] || {}).xh;\n        if (headers) {\n            headers.push({\n                n: name,\n                v: value\n            });\n        }\n    }\n};\nvar _isHeaderSet = function (xhr, name) {\n    var isPresent = false;\n    if (xhr) {\n        var headers = (xhr[AJAX_DATA_CONTAINER] || {}).xh;\n        if (headers) {\n            arrForEach(headers, function (header) {\n                if (header.n === name) {\n                    isPresent = true;\n                    return -1;\n                }\n            });\n        }\n    }\n    return isPresent;\n};\nfunction _getFailedAjaxDiagnosticsMessage(xhr, ajaxDataId) {\n    var result = \"\";\n    try {\n        var ajaxData = _getAjaxData(xhr, ajaxDataId);\n        if (ajaxData && ajaxData[_DYN_REQUEST_URL ]) {\n            result += \"(url: '\" + ajaxData[_DYN_REQUEST_URL ] + \"')\";\n        }\n    }\n    catch (e) {\n    }\n    return result;\n}\nfunction _throwInternalCritical(ajaxMonitorInstance, msgId, message, properties, isUserAct) {\n    _throwInternal(ajaxMonitorInstance[strDiagLog](), 1 , msgId, message, properties, isUserAct);\n}\nfunction _throwInternalWarning(ajaxMonitorInstance, msgId, message, properties, isUserAct) {\n    _throwInternal(ajaxMonitorInstance[strDiagLog](), 2 , msgId, message, properties, isUserAct);\n}\nfunction _createErrorCallbackFunc(ajaxMonitorInstance, internalMessage, message) {\n    return function (callDetails) {\n        var _a;\n        _throwInternalCritical(ajaxMonitorInstance, internalMessage, message, (_a = {\n                ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(callDetails[_DYN_INST ], ajaxMonitorInstance._ajaxDataId)\n            },\n            _a[_DYN_EXCEPTION ] = dumpObj(callDetails.err),\n            _a));\n    };\n}\nfunction _indexOf(value, match) {\n    if (value && match) {\n        return strIndexOf(value, match);\n    }\n    return -1;\n}\nfunction _addHandler(container, id, theFunc) {\n    var theHandler = {\n        id: id,\n        fn: theFunc\n    };\n    container.push(theHandler);\n    return {\n        remove: function () {\n            arrForEach(container, function (initializer, idx) {\n                if (initializer.id === theHandler.id) {\n                    container.splice(idx, 1);\n                    return -1;\n                }\n            });\n        }\n    };\n}\nfunction _processDependencyContainer(core, container, details, message) {\n    var result = true;\n    arrForEach(container, function (theFunc, idx) {\n        try {\n            if (theFunc.fn.call(null, details) === false) {\n                result = false;\n            }\n        }\n        catch (e) {\n            _throwInternal(core && core.logger, 1 , 64 , \"Dependency \" + message + \" [#\" + idx + \"] failed: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n        }\n    });\n    return result;\n}\nfunction _processDependencyListeners(listeners, core, ajaxData, xhr, input, init) {\n    var _a;\n    var initializersCount = listeners[_DYN_LENGTH$1 ];\n    if (initializersCount > 0) {\n        var details = (_a = {},\n            _a[_DYN_CORE ] = core,\n            _a.xhr = xhr,\n            _a.input = input,\n            _a.init = init,\n            _a.traceId = ajaxData[_DYN_TRACE_ID ],\n            _a.spanId = ajaxData[_DYN_SPAN_ID ],\n            _a.traceFlags = ajaxData[_DYN_TRACE_FLAGS ],\n            _a.context = ajaxData[_DYN_CONTEXT$1 ] || {},\n            _a.aborted = !!ajaxData[_DYN_ABORTED ],\n            _a);\n        _processDependencyContainer(core, listeners, details, \"listener\");\n        ajaxData[_DYN_TRACE_ID ] = details[_DYN_TRACE_ID0 ];\n        ajaxData[_DYN_SPAN_ID ] = details[_DYN_SPAN_ID1 ];\n        ajaxData[_DYN_TRACE_FLAGS ] = details[_DYN_TRACE_FLAGS ];\n        ajaxData[_DYN_CONTEXT$1 ] = details[_DYN_CONTEXT$1 ];\n    }\n}\nvar BLOB_CORE = \"*.blob.core.\";\nvar DfltAjaxCorrelationHeaderExDomains = objFreeze([\n    BLOB_CORE + \"windows.net\",\n    BLOB_CORE + \"chinacloudapi.cn\",\n    BLOB_CORE + \"cloudapi.de\",\n    BLOB_CORE + \"usgovcloudapi.net\"\n]);\nvar _internalExcludeEndpoints = [\n    /https:\\/\\/[^\\/]*(\\.pipe\\.aria|aria\\.pipe|events\\.data|collector\\.azure)\\.[^\\/]+\\/(OneCollector\\/1|Collector\\/3)\\.0/i\n];\nvar _defaultConfig$1 = objFreeze((_a$2 = {},\n    _a$2[_DYN_MAX_AJAX_CALLS_PER_V7 ] = 500,\n    _a$2[_DYN_DISABLE_AJAX_TRACKIN9 ] = false,\n    _a$2[_DYN_DISABLE_FETCH_TRACKI11 ] = false,\n    _a$2[_DYN_EXCLUDE_REQUEST_FROM8 ] = undefined,\n    _a$2.disableCorrelationHeaders = false,\n    _a$2.distributedTracingMode = 1 ,\n    _a$2.correlationHeaderExcludedDomains = DfltAjaxCorrelationHeaderExDomains,\n    _a$2.correlationHeaderDomains = undefined,\n    _a$2.correlationHeaderExcludePatterns = undefined,\n    _a$2.appId = undefined,\n    _a$2.enableCorsCorrelation = false,\n    _a$2[_DYN_ENABLE_REQUEST_HEADE4 ] = false,\n    _a$2[_DYN_ENABLE_RESPONSE_HEAD12 ] = false,\n    _a$2[_DYN_ENABLE_AJAX_ERROR_ST5 ] = false,\n    _a$2[_DYN_ENABLE_AJAX_PERF_TRA6 ] = false,\n    _a$2.maxAjaxPerfLookupAttempts = 3,\n    _a$2[_DYN_AJAX_PERF_LOOKUP_DEL10 ] = 25,\n    _a$2.ignoreHeaders = [\n        \"Authorization\",\n        \"X-API-Key\",\n        \"WWW-Authenticate\"\n    ],\n    _a$2[_DYN_ADD_REQUEST_CONTEXT ] = undefined,\n    _a$2.addIntEndpoints = true,\n    _a$2));\nvar AjaxMonitor = /** @class */ (function (_super) {\n    __extendsFn(AjaxMonitor, _super);\n    function AjaxMonitor() {\n        var _this = _super.call(this) || this;\n        _this.identifier = AjaxMonitor.identifier;\n        _this.priority = 120;\n        var _fetchInitialized;\n        var _xhrInitialized;\n        var _currentWindowHost;\n        var _extensionConfig;\n        var _enableRequestHeaderTracking;\n        var _enableAjaxErrorStatusText;\n        var _trackAjaxAttempts;\n        var _context;\n        var _isUsingW3CHeaders;\n        var _isUsingAIHeaders;\n        var _markPrefix;\n        var _enableAjaxPerfTracking;\n        var _maxAjaxCallsPerView;\n        var _enableResponseHeaderTracking;\n        var _disabledUrls;\n        var _disableAjaxTracking;\n        var _disableFetchTracking;\n        var _excludeRequestFromAutoTrackingPatterns;\n        var _addRequestContext;\n        var _evtNamespace;\n        var _ajaxDataId;\n        var _dependencyHandlerId;\n        var _dependencyListeners;\n        var _dependencyInitializers;\n        var _ignoreHeaders;\n        var _maxAjaxPerfLookupAttempts;\n        var _ajaxPerfLookupDelay;\n        var _distributedTracingMode;\n        var _appId;\n        var _polyfillInitialized;\n        dynamicProto(AjaxMonitor, _this, function (_self, _base) {\n            var _addHook = _base[_DYN__ADD_HOOK ];\n            _initDefaults();\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                if (!_self.isInitialized()) {\n                    _base.initialize(config, core, extensions, pluginChain);\n                    _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"ajax\"), core && core.evtNamespace && core.evtNamespace());\n                    _populateDefaults(config);\n                    _instrumentXhr();\n                    _instrumentFetch();\n                    _populateContext();\n                }\n            };\n            _self._doTeardown = function () {\n                _initDefaults();\n            };\n            _self.trackDependencyData = function (dependency, properties) {\n                _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE ], null, dependency, properties);\n            };\n            _self[_DYN_INCLUDE_CORRELATION_2 ] = function (ajaxData, input, init, xhr) {\n                var currentWindowHost = _self[\"_currentWindowHost\"] || _currentWindowHost;\n                _processDependencyListeners(_dependencyListeners, _self[_DYN_CORE ], ajaxData, xhr, input, init);\n                if (input || input === \"\") {\n                    if (correlationIdCanIncludeCorrelationHeader(_extensionConfig, ajaxData[_DYN_GET_ABSOLUTE_URL ](), currentWindowHost)) {\n                        if (!init) {\n                            init = {};\n                        }\n                        var headers = new Headers(init[_DYN_HEADERS ] || (input instanceof Request ? (input[_DYN_HEADERS ] || {}) : {}));\n                        if (_isUsingAIHeaders) {\n                            var id = \"|\" + ajaxData[_DYN_TRACE_ID ] + \".\" + ajaxData[_DYN_SPAN_ID ];\n                            headers.set(RequestHeaders[3 ], id);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[3 ]] = id;\n                            }\n                        }\n                        var appId = _appId || (_context && _context.appId());\n                        if (appId) {\n                            headers.set(RequestHeaders[0 ], RequestHeaders[2 ] + appId);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[0 ]] = RequestHeaders[2 ] + appId;\n                            }\n                        }\n                        if (_isUsingW3CHeaders) {\n                            var traceFlags = ajaxData[_DYN_TRACE_FLAGS ];\n                            if (isNullOrUndefined(traceFlags)) {\n                                traceFlags = 0x01;\n                            }\n                            var traceParent = formatTraceParent(createTraceParent(ajaxData[_DYN_TRACE_ID ], ajaxData[_DYN_SPAN_ID ], traceFlags));\n                            headers.set(RequestHeaders[4 ], traceParent);\n                            if (_enableRequestHeaderTracking) {\n                                ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[4 ]] = traceParent;\n                            }\n                        }\n                        init[_DYN_HEADERS ] = headers;\n                    }\n                    return init;\n                }\n                else if (xhr) {\n                    if (correlationIdCanIncludeCorrelationHeader(_extensionConfig, ajaxData[_DYN_GET_ABSOLUTE_URL ](), currentWindowHost)) {\n                        if (_isUsingAIHeaders) {\n                            if (!_isHeaderSet(xhr, RequestHeaders[3 ])) {\n                                var id = \"|\" + ajaxData[_DYN_TRACE_ID ] + \".\" + ajaxData[_DYN_SPAN_ID ];\n                                xhr[_DYN_SET_REQUEST_HEADER ](RequestHeaders[3 ], id);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[3 ]] = id;\n                                }\n                            }\n                            else {\n                                _throwInternalWarning(_self, 71 , \"Unable to set [\" + RequestHeaders[3 ] + \"] as it has already been set by another instance\");\n                            }\n                        }\n                        var appId = _appId || (_context && _context.appId());\n                        if (appId) {\n                            if (!_isHeaderSet(xhr, RequestHeaders[0 ])) {\n                                xhr[_DYN_SET_REQUEST_HEADER ](RequestHeaders[0 ], RequestHeaders[2 ] + appId);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[0 ]] = RequestHeaders[2 ] + appId;\n                                }\n                            }\n                            else {\n                                _throwInternalWarning(_self, 71 , \"Unable to set [\" + RequestHeaders[0 ] + \"] as it has already been set by another instance\");\n                            }\n                        }\n                        if (_isUsingW3CHeaders) {\n                            var traceFlags = ajaxData[_DYN_TRACE_FLAGS ];\n                            if (isNullOrUndefined(traceFlags)) {\n                                traceFlags = 0x01;\n                            }\n                            if (!_isHeaderSet(xhr, RequestHeaders[4 ])) {\n                                var traceParent = formatTraceParent(createTraceParent(ajaxData[_DYN_TRACE_ID ], ajaxData[_DYN_SPAN_ID ], traceFlags));\n                                xhr[_DYN_SET_REQUEST_HEADER ](RequestHeaders[4 ], traceParent);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[4 ]] = traceParent;\n                                }\n                            }\n                            else {\n                                _throwInternalWarning(_self, 71 , \"Unable to set [\" + RequestHeaders[4 ] + \"] as it has already been set by another instance\");\n                            }\n                        }\n                    }\n                    return xhr;\n                }\n                return undefined;\n            };\n            _self[_DYN_TRACK_DEPENDENCY_DAT3 ] = function (dependency, properties, systemProperties) {\n                if (_maxAjaxCallsPerView === -1 || _trackAjaxAttempts < _maxAjaxCallsPerView) {\n                    if ((_distributedTracingMode === 2\n                        || _distributedTracingMode === 1 )\n                        && typeof dependency.id === \"string\" && dependency.id[dependency.id[_DYN_LENGTH$1 ] - 1] !== \".\") {\n                        dependency.id += \".\";\n                    }\n                    if (isNullOrUndefined(dependency[_DYN_START_TIME ])) {\n                        dependency[_DYN_START_TIME ] = new Date();\n                    }\n                    var item = createTelemetryItem(dependency, RemoteDependencyData.dataType, RemoteDependencyData.envelopeType, _self[strDiagLog](), properties, systemProperties);\n                    _self[_DYN_CORE ].track(item);\n                }\n                else if (_trackAjaxAttempts === _maxAjaxCallsPerView) {\n                    _throwInternalCritical(_self, 55 , \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n                }\n                ++_trackAjaxAttempts;\n            };\n            _self.addDependencyListener = function (dependencyListener) {\n                return _addHandler(_dependencyListeners, _dependencyHandlerId++, dependencyListener);\n            };\n            _self.addDependencyInitializer = function (dependencyInitializer) {\n                return _addHandler(_dependencyInitializers, _dependencyHandlerId++, dependencyInitializer);\n            };\n            function _initDefaults() {\n                var location = getLocation();\n                _fetchInitialized = false;\n                _xhrInitialized = false;\n                _polyfillInitialized = false;\n                _currentWindowHost = location && location.host && location.host[_DYN_TO_LOWER_CASE ]();\n                _extensionConfig = null;\n                _enableRequestHeaderTracking = false;\n                _enableAjaxErrorStatusText = false;\n                _trackAjaxAttempts = 0;\n                _context = null;\n                _isUsingW3CHeaders = false;\n                _isUsingAIHeaders = false;\n                _markPrefix = null;\n                _enableAjaxPerfTracking = false;\n                _maxAjaxCallsPerView = 0;\n                _enableResponseHeaderTracking = false;\n                _disabledUrls = {};\n                _disableAjaxTracking = false;\n                _disableFetchTracking = false;\n                _excludeRequestFromAutoTrackingPatterns = null;\n                _addRequestContext = null;\n                _evtNamespace = null;\n                _dependencyHandlerId = 0;\n                _dependencyListeners = [];\n                _dependencyInitializers = [];\n                _ajaxDataId = createUniqueNamespace(\"ajaxData\");\n                _self._ajaxDataId = _ajaxDataId;\n                _ignoreHeaders = null;\n                _maxAjaxPerfLookupAttempts = 1;\n                _ajaxPerfLookupDelay = 1;\n                _distributedTracingMode = 1 ;\n                _appId = null;\n            }\n            function _populateDefaults(config) {\n                _self[_DYN__ADD_HOOK ](onConfigChange(config, function (details) {\n                    var config = details.cfg;\n                    var ctx = createProcessTelemetryContext(null, config, _self[_DYN_CORE ]);\n                    _extensionConfig = ctx.getExtCfg(AjaxMonitor.identifier, _defaultConfig$1);\n                    _distributedTracingMode = _extensionConfig.distributedTracingMode;\n                    _enableRequestHeaderTracking = _extensionConfig[_DYN_ENABLE_REQUEST_HEADE4 ];\n                    _enableAjaxErrorStatusText = _extensionConfig[_DYN_ENABLE_AJAX_ERROR_ST5 ];\n                    _enableAjaxPerfTracking = _extensionConfig[_DYN_ENABLE_AJAX_PERF_TRA6 ];\n                    _maxAjaxCallsPerView = _extensionConfig[_DYN_MAX_AJAX_CALLS_PER_V7 ];\n                    _excludeRequestFromAutoTrackingPatterns = [].concat(_extensionConfig[_DYN_EXCLUDE_REQUEST_FROM8 ] || [], _extensionConfig.addIntEndpoints !== false ? _internalExcludeEndpoints : []);\n                    _addRequestContext = _extensionConfig[_DYN_ADD_REQUEST_CONTEXT ];\n                    _isUsingAIHeaders = _distributedTracingMode === 0  || _distributedTracingMode === 1 ;\n                    _isUsingW3CHeaders = _distributedTracingMode === 1  || _distributedTracingMode === 2 ;\n                    if (_enableAjaxPerfTracking) {\n                        var iKey = config.instrumentationKey || \"unkwn\";\n                        if (iKey[_DYN_LENGTH$1 ] > 5) {\n                            _markPrefix = AJAX_MONITOR_PREFIX + strSubstring(iKey, iKey[_DYN_LENGTH$1 ] - 5) + \".\";\n                        }\n                        else {\n                            _markPrefix = AJAX_MONITOR_PREFIX + iKey + \".\";\n                        }\n                    }\n                    _disableAjaxTracking = !!_extensionConfig[_DYN_DISABLE_AJAX_TRACKIN9 ];\n                    _maxAjaxPerfLookupAttempts = _extensionConfig.maxAjaxPerfLookupAttempts;\n                    _ajaxPerfLookupDelay = _extensionConfig[_DYN_AJAX_PERF_LOOKUP_DEL10 ];\n                    _ignoreHeaders = _extensionConfig.ignoreHeaders;\n                    _appId = _extensionConfig.appId;\n                }));\n            }\n            function _populateContext() {\n                var propExt = _self[_DYN_CORE ].getPlugin(PropertiesPluginIdentifier);\n                if (propExt) {\n                    _context = propExt.plugin[_DYN_CONTEXT$1 ];\n                }\n            }\n            function _canIncludeHeaders(header) {\n                var rlt = true;\n                if (header || _ignoreHeaders) {\n                    arrForEach(_ignoreHeaders, (function (key) {\n                        if (key[_DYN_TO_LOWER_CASE ]() === header[_DYN_TO_LOWER_CASE ]()) {\n                            rlt = false;\n                            return -1;\n                        }\n                    }));\n                }\n                return rlt;\n            }\n            function _instrumentFetch() {\n                var fetch = _supportsFetch();\n                if (!fetch) {\n                    return;\n                }\n                var global = getGlobal();\n                var isPolyfill = fetch.polyfill;\n                _self[_DYN__ADD_HOOK ](onConfigChange(_extensionConfig, function () {\n                    _disableFetchTracking = !!_extensionConfig[_DYN_DISABLE_FETCH_TRACKI11 ];\n                    _enableResponseHeaderTracking = _extensionConfig[_DYN_ENABLE_RESPONSE_HEAD12 ];\n                    if (!_disableFetchTracking && !_fetchInitialized) {\n                        _addHook(InstrumentFunc(global, STR_FETCH, {\n                            ns: _evtNamespace,\n                            req: function (callDetails, input, init) {\n                                var fetchData;\n                                if (!_disableFetchTracking && _fetchInitialized &&\n                                    !_isDisabledRequest(null, input, init) &&\n                                    !(isPolyfill && _xhrInitialized)) {\n                                    var ctx = callDetails.ctx();\n                                    fetchData = _createFetchRecord(input, init);\n                                    var newInit = _self[_DYN_INCLUDE_CORRELATION_2 ](fetchData, input, init);\n                                    if (newInit !== init) {\n                                        callDetails.set(1, newInit);\n                                    }\n                                    ctx.data = fetchData;\n                                }\n                            },\n                            rsp: function (callDetails, input) {\n                                if (!_disableFetchTracking) {\n                                    var fetchData_1 = callDetails.ctx().data;\n                                    if (fetchData_1) {\n                                        callDetails.rslt = callDetails.rslt.then(function (response) {\n                                            _reportFetchMetrics(callDetails, (response || {})[_DYN_STATUS ], input, response, fetchData_1, function () {\n                                                var _a;\n                                                var ajaxResponse = (_a = {\n                                                        statusText: (response || {})[_DYN_STATUS_TEXT ]\n                                                    },\n                                                    _a[_DYN_HEADER_MAP ] = null,\n                                                    _a[_DYN_CORRELATION_CONTEXT ] = _getFetchCorrelationContext(response),\n                                                    _a);\n                                                if (_enableResponseHeaderTracking && response) {\n                                                    var responseHeaderMap_1 = {};\n                                                    response.headers.forEach(function (value, name) {\n                                                        if (_canIncludeHeaders(name)) {\n                                                            responseHeaderMap_1[name] = value;\n                                                        }\n                                                    });\n                                                    ajaxResponse[_DYN_HEADER_MAP ] = responseHeaderMap_1;\n                                                }\n                                                return ajaxResponse;\n                                            });\n                                            return response;\n                                        })\n                                            .catch(function (reason) {\n                                            _reportFetchMetrics(callDetails, 0, input, null, fetchData_1, null, { error: reason.message || dumpObj(reason) });\n                                            throw reason;\n                                        });\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, 15 , \"Failed to monitor Window.fetch\" + ERROR_POSTFIX)\n                        }, true, isWebWorker()));\n                        _fetchInitialized = true;\n                    }\n                    else if (isPolyfill && !_polyfillInitialized) {\n                        _addHook(InstrumentFunc(global, STR_FETCH, {\n                            ns: _evtNamespace,\n                            req: function (callDetails, input, init) {\n                                _isDisabledRequest(null, input, init);\n                            }\n                        }));\n                        _polyfillInitialized = true;\n                    }\n                }));\n                if (isPolyfill) {\n                    global[STR_FETCH].polyfill = isPolyfill;\n                }\n            }\n            function _hookProto(target, funcName, callbacks) {\n                _addHook(InstrumentProto(target, funcName, callbacks));\n            }\n            function _instrumentXhr() {\n                if (!_supportsAjaxMonitoring(_self, _ajaxDataId)) {\n                    return;\n                }\n                _self[_DYN__ADD_HOOK ](onConfigChange(_extensionConfig, function () {\n                    _disableAjaxTracking = !!_extensionConfig[_DYN_DISABLE_AJAX_TRACKIN9 ];\n                    _enableRequestHeaderTracking = _extensionConfig[_DYN_ENABLE_REQUEST_HEADE4 ];\n                    if (!_disableAjaxTracking && !_xhrInitialized) {\n                        _hookProto(XMLHttpRequest, \"open\", {\n                            ns: _evtNamespace,\n                            req: function (callDetails, method, url, async) {\n                                if (!_disableAjaxTracking) {\n                                    var xhr = callDetails[_DYN_INST ];\n                                    var ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (!_isDisabledRequest(xhr, url) && _isMonitoredXhrInstance(xhr, ajaxData, true)) {\n                                        if (!ajaxData || !ajaxData.xhrMonitoringState[_DYN_OPEN_DONE ]) {\n                                            ajaxData = _openHandler(xhr, method, url, async);\n                                        }\n                                        _attachToOnReadyStateChange(xhr, ajaxData);\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, 15 , ERROR_HEADER + \".open\" + ERROR_POSTFIX)\n                        });\n                        _hookProto(XMLHttpRequest, \"send\", {\n                            ns: _evtNamespace,\n                            req: function (callDetails, context) {\n                                if (!_disableAjaxTracking) {\n                                    var xhr = callDetails[_DYN_INST ];\n                                    var ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (_isMonitoredXhrInstance(xhr, ajaxData) && !ajaxData.xhrMonitoringState[_DYN_SEND_DONE ]) {\n                                        _createMarkId(\"xhr\", ajaxData);\n                                        ajaxData[_DYN_REQUEST_SENT_TIME ] = dateTimeUtilsNow();\n                                        _self[_DYN_INCLUDE_CORRELATION_2 ](ajaxData, undefined, undefined, xhr);\n                                        ajaxData.xhrMonitoringState[_DYN_SEND_DONE ] = true;\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, 17 , ERROR_HEADER + ERROR_POSTFIX)\n                        });\n                        _hookProto(XMLHttpRequest, \"abort\", {\n                            ns: _evtNamespace,\n                            req: function (callDetails) {\n                                if (!_disableAjaxTracking) {\n                                    var xhr = callDetails[_DYN_INST ];\n                                    var ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (_isMonitoredXhrInstance(xhr, ajaxData) && !ajaxData.xhrMonitoringState[_DYN_ABORT_DONE ]) {\n                                        ajaxData[_DYN_ABORTED ] = 1;\n                                        ajaxData.xhrMonitoringState[_DYN_ABORT_DONE ] = true;\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, 13 , ERROR_HEADER + \".abort\" + ERROR_POSTFIX)\n                        });\n                        _hookProto(XMLHttpRequest, \"setRequestHeader\", {\n                            ns: _evtNamespace,\n                            req: function (callDetails, header, value) {\n                                if (!_disableAjaxTracking) {\n                                    var xhr = callDetails[_DYN_INST ];\n                                    var ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (ajaxData && _isMonitoredXhrInstance(xhr, ajaxData)) {\n                                        _addSharedXhrHeaders(xhr, header, value);\n                                        if (_enableRequestHeaderTracking && _canIncludeHeaders(header)) {\n                                            if (ajaxData) {\n                                                ajaxData[_DYN_REQUEST_HEADERS ][header] = value;\n                                            }\n                                        }\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, 71 , ERROR_HEADER + \".setRequestHeader\" + ERROR_POSTFIX)\n                        });\n                        _xhrInitialized = true;\n                    }\n                }));\n            }\n            function _isDisabledRequest(xhr, request, init) {\n                var isDisabled = false;\n                var theUrl = ((!isString(request) ? (request || {}).url || \"\" : request) || \"\")[_DYN_TO_LOWER_CASE ]();\n                arrForEach(_excludeRequestFromAutoTrackingPatterns, function (regex) {\n                    var theRegex = regex;\n                    if (isString(regex)) {\n                        theRegex = new RegExp(regex);\n                    }\n                    if (!isDisabled) {\n                        isDisabled = theRegex.test(theUrl);\n                    }\n                });\n                if (isDisabled) {\n                    return isDisabled;\n                }\n                var idx = _indexOf(theUrl, \"?\");\n                var idx2 = _indexOf(theUrl, \"#\");\n                if (idx === -1 || (idx2 !== -1 && idx2 < idx)) {\n                    idx = idx2;\n                }\n                if (idx !== -1) {\n                    theUrl = theUrl.substring(0, idx);\n                }\n                if (!isNullOrUndefined(xhr)) {\n                    isDisabled = xhr[DisabledPropertyName] === true || theUrl[DisabledPropertyName] === true;\n                }\n                else if (!isNullOrUndefined(request)) {\n                    isDisabled = (typeof request === \"object\" ? request[DisabledPropertyName] === true : false) ||\n                        (init ? init[DisabledPropertyName] === true : false);\n                }\n                if (!isDisabled && theUrl && isInternalApplicationInsightsEndpoint(theUrl)) {\n                    isDisabled = true;\n                }\n                if (isDisabled) {\n                    if (!_disabledUrls[theUrl]) {\n                        _disabledUrls[theUrl] = 1;\n                    }\n                }\n                else {\n                    if (_disabledUrls[theUrl]) {\n                        isDisabled = true;\n                    }\n                }\n                return isDisabled;\n            }\n            function _isMonitoredXhrInstance(xhr, ajaxData, excludeAjaxDataValidation) {\n                var ajaxValidation = true;\n                var initialized = _xhrInitialized;\n                if (!isNullOrUndefined(xhr)) {\n                    ajaxValidation = excludeAjaxDataValidation === true || !isNullOrUndefined(ajaxData);\n                }\n                return initialized\n                    && ajaxValidation;\n            }\n            function _getDistributedTraceCtx() {\n                var distributedTraceCtx = null;\n                if (_self[_DYN_CORE ] && _self[_DYN_CORE ].getTraceCtx) {\n                    distributedTraceCtx = _self[_DYN_CORE ].getTraceCtx(false);\n                }\n                if (!distributedTraceCtx && _context && _context.telemetryTrace) {\n                    distributedTraceCtx = createDistributedTraceContextFromTrace(_context.telemetryTrace);\n                }\n                return distributedTraceCtx;\n            }\n            function _openHandler(xhr, method, url, async) {\n                var _a;\n                var distributedTraceCtx = _getDistributedTraceCtx();\n                var traceID = (distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_ID ]()) || generateW3CId();\n                var spanID = strSubstr(generateW3CId(), 0, 16);\n                var xhrRequestData = xhr[AJAX_DATA_CONTAINER] = (xhr[AJAX_DATA_CONTAINER] || { xh: [], i: {} });\n                var ajaxDataCntr = xhrRequestData.i = (xhrRequestData.i || {});\n                var ajaxData = ajaxDataCntr[_ajaxDataId] = (ajaxDataCntr[_ajaxDataId] || new ajaxRecord(traceID, spanID, _self[strDiagLog](), (_a = _self.core) === null || _a === void 0 ? void 0 : _a.getTraceCtx()));\n                ajaxData[_DYN_TRACE_FLAGS ] = distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_FLAGS ]();\n                ajaxData[_DYN_METHOD ] = method;\n                ajaxData[_DYN_REQUEST_URL ] = url;\n                ajaxData.xhrMonitoringState[_DYN_OPEN_DONE ] = true;\n                ajaxData[_DYN_REQUEST_HEADERS ] = {};\n                ajaxData.async = async;\n                ajaxData[_DYN_ERROR_STATUS_TEXT ] = _enableAjaxErrorStatusText;\n                return ajaxData;\n            }\n            function _attachToOnReadyStateChange(xhr, ajaxData) {\n                ajaxData.xhrMonitoringState[_DYN_STATE_CHANGE_ATTACHE13 ] = eventOn(xhr, \"readystatechange\", function () {\n                    var _a;\n                    try {\n                        if (xhr && xhr.readyState === 4 && _isMonitoredXhrInstance(xhr, ajaxData)) {\n                            _onAjaxComplete(xhr);\n                        }\n                    }\n                    catch (e) {\n                        var exceptionText = dumpObj(e);\n                        if (!exceptionText || _indexOf(exceptionText[_DYN_TO_LOWER_CASE ](), \"c00c023f\") === -1) {\n                            _throwInternalCritical(_self, 16 , ERROR_HEADER + \" 'readystatechange' event handler\" + ERROR_POSTFIX, (_a = {},\n                                _a[_DYN_AJAX_DIAGNOSTICS_MES16 ] = _getFailedAjaxDiagnosticsMessage(xhr, _ajaxDataId),\n                                _a[_DYN_EXCEPTION ] = exceptionText,\n                                _a));\n                        }\n                    }\n                }, _evtNamespace);\n            }\n            function _getResponseText(xhr) {\n                try {\n                    var responseType = xhr.responseType;\n                    if (responseType === \"\" || responseType === \"text\") {\n                        return xhr[_DYN_RESPONSE_TEXT ];\n                    }\n                }\n                catch (e) {\n                }\n                return null;\n            }\n            function _onAjaxComplete(xhr) {\n                var ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                ajaxData[_DYN_RESPONSE_FINISHED_TI14 ] = dateTimeUtilsNow();\n                ajaxData[_DYN_STATUS ] = xhr[_DYN_STATUS ];\n                function _reportXhrError(e, failedProps) {\n                    var errorProps = failedProps || {};\n                    errorProps[\"ajaxDiagnosticsMessage\"] = _getFailedAjaxDiagnosticsMessage(xhr, _ajaxDataId);\n                    if (e) {\n                        errorProps[\"exception\"] = dumpObj(e);\n                    }\n                    _throwInternalWarning(_self, 14 , FAILED_TO_CALCULATE_DURATION_ERROR + \"ajax call\" + ERROR_NOT_SENT, errorProps);\n                }\n                _findPerfResourceEntry(\"xmlhttprequest\", ajaxData, function () {\n                    try {\n                        var dependency = ajaxData[_DYN__CREATE_TRACK_ITEM ](\"Ajax\", _enableRequestHeaderTracking, function () {\n                            var _a;\n                            var ajaxResponse = (_a = {\n                                    statusText: xhr[_DYN_STATUS_TEXT ]\n                                },\n                                _a[_DYN_HEADER_MAP ] = null,\n                                _a[_DYN_CORRELATION_CONTEXT ] = _getAjaxCorrelationContext(xhr),\n                                _a.type = xhr.responseType,\n                                _a[_DYN_RESPONSE_TEXT ] = _getResponseText(xhr),\n                                _a.response = xhr[_DYN_RESPONSE ],\n                                _a);\n                            if (_enableResponseHeaderTracking) {\n                                var headers = xhr[_DYN_GET_ALL_RESPONSE_HEA15 ]();\n                                if (headers) {\n                                    var arr = strTrim(headers).split(/[\\r\\n]+/);\n                                    var responseHeaderMap_2 = {};\n                                    arrForEach(arr, function (line) {\n                                        var parts = line.split(\": \");\n                                        var header = parts.shift();\n                                        var value = parts.join(\": \");\n                                        if (_canIncludeHeaders(header)) {\n                                            responseHeaderMap_2[header] = value;\n                                        }\n                                    });\n                                    ajaxResponse[_DYN_HEADER_MAP ] = responseHeaderMap_2;\n                                }\n                            }\n                            return ajaxResponse;\n                        });\n                        var properties = void 0;\n                        try {\n                            if (!!_addRequestContext) {\n                                properties = _addRequestContext({ status: xhr[_DYN_STATUS ], xhr: xhr });\n                            }\n                        }\n                        catch (e) {\n                            _throwInternalWarning(_self, 104 , CUSTOM_REQUEST_CONTEXT_ERROR);\n                        }\n                        if (dependency) {\n                            if (properties !== undefined) {\n                                dependency[STR_PROPERTIES ] = __assignFn(__assignFn({}, dependency.properties), properties);\n                            }\n                            var sysProperties = ajaxData[_DYN_GET_PART_APROPS ]();\n                            _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE ], ajaxData, dependency, null, sysProperties);\n                        }\n                        else {\n                            _reportXhrError(null, {\n                                requestSentTime: ajaxData[_DYN_REQUEST_SENT_TIME ],\n                                responseFinishedTime: ajaxData[_DYN_RESPONSE_FINISHED_TI14 ]\n                            });\n                        }\n                    }\n                    finally {\n                        try {\n                            var xhrRequestData = (xhr[AJAX_DATA_CONTAINER] || { i: {} });\n                            var ajaxDataCntr = (xhrRequestData.i || {});\n                            if (ajaxDataCntr[_ajaxDataId]) {\n                                ajaxDataCntr[_ajaxDataId] = null;\n                            }\n                        }\n                        catch (e) {\n                        }\n                    }\n                }, function (e) {\n                    _reportXhrError(e, null);\n                });\n            }\n            function _getAjaxCorrelationContext(xhr) {\n                var _a;\n                try {\n                    var responseHeadersString = xhr[_DYN_GET_ALL_RESPONSE_HEA15 ]();\n                    if (responseHeadersString !== null) {\n                        var index = _indexOf(responseHeadersString[_DYN_TO_LOWER_CASE ](), RequestHeaders[8 ]);\n                        if (index !== -1) {\n                            var responseHeader = xhr.getResponseHeader(RequestHeaders[0 ]);\n                            return correlationIdGetCorrelationContext(responseHeader);\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternalWarning(_self, 18 , CORRELATION_HEADER_ERROR, (_a = {},\n                        _a[_DYN_AJAX_DIAGNOSTICS_MES16 ] = _getFailedAjaxDiagnosticsMessage(xhr, _ajaxDataId),\n                        _a[_DYN_EXCEPTION ] = dumpObj(e),\n                        _a));\n                }\n            }\n            function _createMarkId(type, ajaxData) {\n                if (ajaxData[_DYN_REQUEST_URL ] && _markPrefix && _enableAjaxPerfTracking) {\n                    var performance_1 = getPerformance();\n                    if (performance_1 && isFunction(performance_1.mark)) {\n                        _markCount++;\n                        var markId = _markPrefix + type + \"#\" + _markCount;\n                        performance_1.mark(markId);\n                        var entries = performance_1.getEntriesByName(markId);\n                        if (entries && entries[_DYN_LENGTH$1 ] === 1) {\n                            ajaxData[_DYN_PERF_MARK ] = entries[0];\n                        }\n                    }\n                }\n            }\n            function _findPerfResourceEntry(initiatorType, ajaxData, trackCallback, reportError) {\n                var perfMark = ajaxData[_DYN_PERF_MARK ];\n                var performance = getPerformance();\n                var maxAttempts = _maxAjaxPerfLookupAttempts;\n                var retryDelay = _ajaxPerfLookupDelay;\n                var requestUrl = ajaxData[_DYN_REQUEST_URL ];\n                var attempt = 0;\n                (function locateResourceTiming() {\n                    try {\n                        if (performance && perfMark) {\n                            attempt++;\n                            var perfTiming = null;\n                            var entries = performance.getEntries();\n                            for (var lp = entries[_DYN_LENGTH$1 ] - 1; lp >= 0; lp--) {\n                                var entry = entries[lp];\n                                if (entry) {\n                                    if (entry.entryType === \"resource\") {\n                                        if (entry.initiatorType === initiatorType &&\n                                            (_indexOf(entry[_DYN_NAME ], requestUrl) !== -1 || _indexOf(requestUrl, entry[_DYN_NAME ]) !== -1)) {\n                                            perfTiming = entry;\n                                        }\n                                    }\n                                    else if (entry.entryType === \"mark\" && entry[_DYN_NAME ] === perfMark[_DYN_NAME ]) {\n                                        ajaxData[_DYN_PERF_TIMING ] = perfTiming;\n                                        break;\n                                    }\n                                    if (entry[_DYN_START_TIME ] < perfMark[_DYN_START_TIME ] - 1000) {\n                                        break;\n                                    }\n                                }\n                            }\n                        }\n                        if (!perfMark ||\n                            ajaxData[_DYN_PERF_TIMING ] ||\n                            attempt >= maxAttempts ||\n                            ajaxData.async === false) {\n                            if (perfMark && isFunction(performance.clearMarks)) {\n                                performance.clearMarks(perfMark[_DYN_NAME ]);\n                            }\n                            ajaxData.perfAttempts = attempt;\n                            trackCallback();\n                        }\n                        else {\n                            scheduleTimeout(locateResourceTiming, retryDelay);\n                        }\n                    }\n                    catch (e) {\n                        reportError(e);\n                    }\n                })();\n            }\n            function _createFetchRecord(input, init) {\n                var _a;\n                var distributedTraceCtx = _getDistributedTraceCtx();\n                var traceID = (distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_ID ]()) || generateW3CId();\n                var spanID = strSubstr(generateW3CId(), 0, 16);\n                var ajaxData = new ajaxRecord(traceID, spanID, _self[strDiagLog](), (_a = _self.core) === null || _a === void 0 ? void 0 : _a.getTraceCtx());\n                ajaxData[_DYN_TRACE_FLAGS ] = distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_FLAGS ]();\n                ajaxData[_DYN_REQUEST_SENT_TIME ] = dateTimeUtilsNow();\n                ajaxData[_DYN_ERROR_STATUS_TEXT ] = _enableAjaxErrorStatusText;\n                var requestUrl;\n                if (input instanceof Request) {\n                    requestUrl = (input || {}).url || \"\";\n                }\n                else {\n                    requestUrl = input;\n                }\n                if (requestUrl === \"\") {\n                    var location_1 = getLocation();\n                    if (location_1 && location_1.href) {\n                        requestUrl = strSplit(location_1.href, \"#\")[0];\n                    }\n                }\n                ajaxData[_DYN_REQUEST_URL ] = requestUrl;\n                var method = \"GET\";\n                if (init && init[_DYN_METHOD ]) {\n                    method = init[_DYN_METHOD ];\n                }\n                else if (input && input instanceof Request) {\n                    method = input[_DYN_METHOD ];\n                }\n                ajaxData[_DYN_METHOD ] = method;\n                var requestHeaders = {};\n                if (_enableRequestHeaderTracking) {\n                    var headers = new Headers((init ? init[_DYN_HEADERS ] : 0) || (input instanceof Request ? (input[_DYN_HEADERS ] || {}) : {}));\n                    headers.forEach(function (value, key) {\n                        if (_canIncludeHeaders(key)) {\n                            requestHeaders[key] = value;\n                        }\n                    });\n                }\n                ajaxData[_DYN_REQUEST_HEADERS ] = requestHeaders;\n                _createMarkId(STR_FETCH, ajaxData);\n                return ajaxData;\n            }\n            function _getFailedFetchDiagnosticsMessage(input) {\n                var result = \"\";\n                try {\n                    if (!isNullOrUndefined(input)) {\n                        if (typeof (input) === \"string\") {\n                            result += \"(url: '\".concat(input, \"')\");\n                        }\n                        else {\n                            result += \"(url: '\".concat(input.url, \"')\");\n                        }\n                    }\n                }\n                catch (e) {\n                    _throwInternalCritical(_self, 15 , \"Failed to grab failed fetch diagnostics message\", { exception: dumpObj(e) });\n                }\n                return result;\n            }\n            function _reportFetchMetrics(callDetails, status, input, response, ajaxData, getResponse, properties) {\n                if (!ajaxData) {\n                    return;\n                }\n                function _reportFetchError(msgId, e, failedProps) {\n                    var errorProps = failedProps || {};\n                    errorProps[\"fetchDiagnosticsMessage\"] = _getFailedFetchDiagnosticsMessage(input);\n                    if (e) {\n                        errorProps[\"exception\"] = dumpObj(e);\n                    }\n                    _throwInternalWarning(_self, msgId, FAILED_TO_CALCULATE_DURATION_ERROR + \"fetch call\" + ERROR_NOT_SENT, errorProps);\n                }\n                ajaxData[_DYN_RESPONSE_FINISHED_TI14 ] = dateTimeUtilsNow();\n                ajaxData[_DYN_STATUS ] = status;\n                _findPerfResourceEntry(STR_FETCH, ajaxData, function () {\n                    var dependency = ajaxData[_DYN__CREATE_TRACK_ITEM ](\"Fetch\", _enableRequestHeaderTracking, getResponse);\n                    var properties;\n                    try {\n                        if (!!_addRequestContext) {\n                            properties = _addRequestContext({ status: status, request: input, response: response });\n                        }\n                    }\n                    catch (e) {\n                        _throwInternalWarning(_self, 104 , CUSTOM_REQUEST_CONTEXT_ERROR);\n                    }\n                    if (dependency) {\n                        if (properties !== undefined) {\n                            dependency[STR_PROPERTIES ] = __assignFn(__assignFn({}, dependency.properties), properties);\n                        }\n                        var sysProperties = ajaxData[_DYN_GET_PART_APROPS ]();\n                        _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE ], ajaxData, dependency, null, sysProperties);\n                    }\n                    else {\n                        _reportFetchError(14 , null, {\n                            requestSentTime: ajaxData[_DYN_REQUEST_SENT_TIME ],\n                            responseFinishedTime: ajaxData[_DYN_RESPONSE_FINISHED_TI14 ]\n                        });\n                    }\n                }, function (e) {\n                    _reportFetchError(18 , e, null);\n                });\n            }\n            function _getFetchCorrelationContext(response) {\n                var _a;\n                if (response && response[_DYN_HEADERS ]) {\n                    try {\n                        var responseHeader = response[_DYN_HEADERS ].get(RequestHeaders[0 ]);\n                        return correlationIdGetCorrelationContext(responseHeader);\n                    }\n                    catch (e) {\n                        _throwInternalWarning(_self, 18 , CORRELATION_HEADER_ERROR, (_a = {\n                                fetchDiagnosticsMessage: _getFailedFetchDiagnosticsMessage(response)\n                            },\n                            _a[_DYN_EXCEPTION ] = dumpObj(e),\n                            _a));\n                    }\n                }\n            }\n            function _reportDependencyInternal(initializers, core, ajaxData, dependency, properties, systemProperties) {\n                var _a;\n                var result = true;\n                var initializersCount = initializers[_DYN_LENGTH$1 ];\n                if (initializersCount > 0) {\n                    var details = (_a = {\n                            item: dependency\n                        },\n                        _a[STR_PROPERTIES ] = properties,\n                        _a.sysProperties = systemProperties,\n                        _a.context = ajaxData ? ajaxData[_DYN_CONTEXT$1 ] : null,\n                        _a.aborted = ajaxData ? !!ajaxData[_DYN_ABORTED ] : false,\n                        _a);\n                    result = _processDependencyContainer(core, initializers, details, \"initializer\");\n                }\n                if (result) {\n                    _self[_DYN_TRACK_DEPENDENCY_DAT3 ](dependency, properties, systemProperties);\n                }\n            }\n        });\n        return _this;\n    }\n    AjaxMonitor.prototype.processTelemetry = function (item, itemCtx) {\n        this.processNext(item, itemCtx);\n    };\n    AjaxMonitor.prototype.addDependencyInitializer = function (dependencyInitializer) {\n        return null;\n    };\n    AjaxMonitor.identifier = \"AjaxDependencyPlugin\";\n    return AjaxMonitor;\n}(BaseTelemetryPlugin));\n\nvar Application = /** @class */ (function () {\n    function Application() {\n    }\n    return Application;\n}());\n\nvar Device = /** @class */ (function () {\n    function Device() {\n        this.id = \"browser\";\n        this.deviceClass = \"Browser\";\n    }\n    return Device;\n}());\n\nvar Version = '3.0.6';\nvar Internal = /** @class */ (function () {\n    function Internal(config, unloadHookContainer) {\n        var _this = this;\n        var unloadHook = onConfigChange((config), function () {\n            var prefix = config.sdkExtension;\n            _this.sdkVersion = (prefix ? prefix + \"_\" : \"\") + \"javascript:\" + Version;\n        });\n        unloadHookContainer && unloadHookContainer.add(unloadHook);\n    }\n    return Internal;\n}());\n\nvar Location = /** @class */ (function () {\n    function Location() {\n    }\n    return Location;\n}());\n\nvar _DYN_SESSION_MANAGER = \"sessionManager\";\nvar _DYN_UPDATE = \"update\";\nvar _DYN_IS_USER_COOKIE_SET = \"isUserCookieSet\";\nvar _DYN_IS_NEW_USER = \"isNewUser\";\nvar _DYN_GET_TRACE_CTX = \"getTraceCtx\";\nvar _DYN_TELEMETRY_TRACE = \"telemetryTrace\";\nvar _DYN_APPLY_SESSION_CONTEX0 = \"applySessionContext\";\nvar _DYN_APPLY_APPLICATION_CO1 = \"applyApplicationContext\";\nvar _DYN_APPLY_DEVICE_CONTEXT = \"applyDeviceContext\";\nvar _DYN_APPLY_OPERATION_CONT2 = \"applyOperationContext\";\nvar _DYN_APPLY_USER_CONTEXT = \"applyUserContext\";\nvar _DYN_APPLY_OPERATING_SYST3 = \"applyOperatingSystemContxt\";\nvar _DYN_APPLY_LOCATION_CONTE4 = \"applyLocationContext\";\nvar _DYN_APPLY_INTERNAL_CONTE5 = \"applyInternalContext\";\nvar _DYN_ACCOUNT_ID = \"accountId\";\nvar _DYN_GET_SESSION_ID = \"getSessionId\";\nvar _DYN_NAME_PREFIX = \"namePrefix\";\nvar _DYN_SESSION_COOKIE_POSTF6 = \"sessionCookiePostfix\";\nvar _DYN_USER_COOKIE_POSTFIX = \"userCookiePostfix\";\nvar _DYN_ID_LENGTH = \"idLength\";\nvar _DYN_GET_NEW_ID = \"getNewId\";\nvar _DYN_LENGTH = \"length\";\nvar _DYN_AUTOMATIC_SESSION = \"automaticSession\";\nvar _DYN_AUTHENTICATED_ID = \"authenticatedId\";\nvar _DYN_ACQUISITION_DATE = \"acquisitionDate\";\nvar _DYN_RENEWAL_DATE = \"renewalDate\";\nvar _DYN_JOIN = \"join\";\nvar _DYN_COOKIE_SEPARATOR = \"cookieSeparator\";\nvar _DYN_AUTH_USER_COOKIE_NAM7 = \"authUserCookieName\";\n\nvar SESSION_COOKIE_NAME = \"ai_session\";\nvar ACQUISITION_SPAN = 86400000;\nvar RENEWAL_SPAN = 1800000;\nvar COOKIE_UPDATE_INTERVAL = 60000;\nvar Session = /** @class */ (function () {\n    function Session() {\n    }\n    return Session;\n}());\nvar _SessionManager = /** @class */ (function () {\n    function _SessionManager(config, core, unloadHookContainer) {\n        var self = this;\n        var _storageNamePrefix;\n        var _cookieUpdatedTimestamp;\n        var _logger = safeGetLogger(core);\n        var _cookieManager = safeGetCookieMgr(core);\n        var _sessionExpirationMs;\n        var _sessionRenewalMs;\n        dynamicProto(_SessionManager, self, function (_self) {\n            if (!config) {\n                config = {};\n            }\n            var unloadHook = onConfigChange(config, function (details) {\n                _sessionExpirationMs = config.sessionExpirationMs || ACQUISITION_SPAN;\n                _sessionRenewalMs = config.sessionRenewalMs || RENEWAL_SPAN;\n                var sessionCookiePostfix = config.sessionCookiePostfix || config[_DYN_NAME_PREFIX ] || \"\";\n                _storageNamePrefix = SESSION_COOKIE_NAME + sessionCookiePostfix;\n            });\n            unloadHookContainer && unloadHookContainer.add(unloadHook);\n            _self[_DYN_AUTOMATIC_SESSION ] = new Session();\n            _self[_DYN_UPDATE ] = function () {\n                var nowMs = utcNow();\n                var isExpired = false;\n                var session = _self[_DYN_AUTOMATIC_SESSION ];\n                if (!session.id) {\n                    isExpired = !_initializeAutomaticSession(session);\n                }\n                if (!isExpired && _sessionExpirationMs > 0) {\n                    var timeSinceAcqMs = nowMs - session[_DYN_ACQUISITION_DATE ];\n                    var timeSinceRenewalMs = nowMs - session[_DYN_RENEWAL_DATE ];\n                    isExpired = timeSinceAcqMs < 0 || timeSinceRenewalMs < 0;\n                    isExpired = isExpired || timeSinceAcqMs > _sessionExpirationMs;\n                    isExpired = isExpired || timeSinceRenewalMs > _sessionRenewalMs;\n                }\n                if (isExpired) {\n                    _renew(nowMs);\n                }\n                else {\n                    if (!_cookieUpdatedTimestamp || nowMs - _cookieUpdatedTimestamp > COOKIE_UPDATE_INTERVAL) {\n                        _setCookie(session, nowMs);\n                    }\n                }\n            };\n            _self.backup = function () {\n                var session = _self[_DYN_AUTOMATIC_SESSION ];\n                _setStorage(session.id, session[_DYN_ACQUISITION_DATE ], session[_DYN_RENEWAL_DATE ]);\n            };\n            function _initializeAutomaticSession(session, now) {\n                var isValid = false;\n                var cookieValue = _cookieManager.get(_storageNamePrefix);\n                if (cookieValue && isFunction(cookieValue.split)) {\n                    isValid = _initializeAutomaticSessionWithData(session, cookieValue);\n                }\n                else {\n                    var storageValue = utlGetLocalStorage(_logger, _storageNamePrefix);\n                    if (storageValue) {\n                        isValid = _initializeAutomaticSessionWithData(session, storageValue);\n                    }\n                }\n                return isValid || !!session.id;\n            }\n            function _initializeAutomaticSessionWithData(session, sessionData) {\n                var isValid = false;\n                var sessionReset = \", session will be reset\";\n                var tokens = sessionData.split(\"|\");\n                if (tokens[_DYN_LENGTH ] >= 2) {\n                    try {\n                        var acqMs = +tokens[1] || 0;\n                        var renewalMs = +tokens[2] || 0;\n                        if (isNaN(acqMs) || acqMs <= 0) {\n                            _throwInternal(_logger, 2 , 27 , \"AI session acquisition date is 0\" + sessionReset);\n                        }\n                        else if (isNaN(renewalMs) || renewalMs <= 0) {\n                            _throwInternal(_logger, 2 , 27 , \"AI session renewal date is 0\" + sessionReset);\n                        }\n                        else if (tokens[0]) {\n                            session.id = tokens[0];\n                            session[_DYN_ACQUISITION_DATE ] = acqMs;\n                            session[_DYN_RENEWAL_DATE ] = renewalMs;\n                            isValid = true;\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(_logger, 1 , 9 , \"Error parsing ai_session value [\" + (sessionData || \"\") + \"]\" + sessionReset + \" - \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                }\n                return isValid;\n            }\n            function _renew(nowMs) {\n                var getNewId = config[_DYN_GET_NEW_ID ] || newId;\n                _self.automaticSession.id = getNewId(config[_DYN_ID_LENGTH ] || 22);\n                _self[_DYN_AUTOMATIC_SESSION ][_DYN_ACQUISITION_DATE ] = nowMs;\n                _setCookie(_self[_DYN_AUTOMATIC_SESSION ], nowMs);\n                if (!utlCanUseLocalStorage()) {\n                    _throwInternal(_logger, 2 , 0 , \"Browser does not support local storage. Session durations will be inaccurate.\");\n                }\n            }\n            function _setCookie(session, nowMs) {\n                var acq = session[_DYN_ACQUISITION_DATE ];\n                session[_DYN_RENEWAL_DATE ] = nowMs;\n                var renewalPeriodMs = _sessionRenewalMs;\n                var acqTimeLeftMs = (acq + _sessionExpirationMs) - nowMs;\n                var cookie = [session.id, acq, nowMs];\n                var maxAgeSec = 0;\n                if (acqTimeLeftMs < renewalPeriodMs) {\n                    maxAgeSec = acqTimeLeftMs / 1000;\n                }\n                else {\n                    maxAgeSec = renewalPeriodMs / 1000;\n                }\n                var cookieDomain = config.cookieDomain || null;\n                _cookieManager.set(_storageNamePrefix, cookie[_DYN_JOIN ](\"|\"), _sessionExpirationMs > 0 ? maxAgeSec : null, cookieDomain);\n                _cookieUpdatedTimestamp = nowMs;\n            }\n            function _setStorage(guid, acq, renewal) {\n                utlSetLocalStorage(_logger, _storageNamePrefix, [guid, acq, renewal][_DYN_JOIN ](\"|\"));\n            }\n        });\n    }\n    _SessionManager.__ieDyn=1;\n    return _SessionManager;\n}());\n\nvar TelemetryTrace = /** @class */ (function () {\n    function TelemetryTrace(id, parentId, name, logger) {\n        var _self = this;\n        _self.traceID = id || generateW3CId();\n        _self.parentID = parentId;\n        var location = getLocation();\n        if (!name && location && location.pathname) {\n            name = location.pathname;\n        }\n        _self.name = dataSanitizeString(logger, name);\n    }\n    return TelemetryTrace;\n}());\n\nfunction _validateUserInput(id) {\n    if (typeof id !== \"string\" ||\n        !id ||\n        id.match(/,|;|=| |\\|/)) {\n        return false;\n    }\n    return true;\n}\nvar User = /** @class */ (function () {\n    function User(config, core, unloadHookContainer) {\n        this.isNewUser = false;\n        this.isUserCookieSet = false;\n        var _logger = safeGetLogger(core);\n        var _cookieManager = safeGetCookieMgr(core);\n        var _storageNamePrefix;\n        dynamicProto(User, this, function (_self) {\n            objDefine(_self, \"config\", {\n                g: function () { return config; }\n            });\n            var unloadHook = onConfigChange(config, function () {\n                var userCookiePostfix = config[_DYN_USER_COOKIE_POSTFIX ] || \"\";\n                _storageNamePrefix = User.userCookieName + userCookiePostfix;\n                var cookie = _cookieManager.get(_storageNamePrefix);\n                if (cookie) {\n                    _self[_DYN_IS_NEW_USER ] = false;\n                    var params = cookie.split(User[_DYN_COOKIE_SEPARATOR ]);\n                    if (params[_DYN_LENGTH ] > 0) {\n                        _self.id = params[0];\n                        _self[_DYN_IS_USER_COOKIE_SET ] = !!_self.id;\n                    }\n                }\n                if (!_self.id) {\n                    _self.id = _generateNewId();\n                    var newCookie = _generateNewCookie(_self.id);\n                    _setUserCookie(newCookie[_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]));\n                    var name_1 = (config[_DYN_NAME_PREFIX ] || \"\") + \"ai_session\";\n                    utlRemoveStorage(_logger, name_1);\n                }\n                _self[_DYN_ACCOUNT_ID ] = config[_DYN_ACCOUNT_ID ] || undefined;\n                var authCookie = _cookieManager.get(User[_DYN_AUTH_USER_COOKIE_NAM7 ]);\n                if (authCookie) {\n                    authCookie = decodeURI(authCookie);\n                    var authCookieString = authCookie.split(User[_DYN_COOKIE_SEPARATOR ]);\n                    if (authCookieString[0]) {\n                        _self[_DYN_AUTHENTICATED_ID ] = authCookieString[0];\n                    }\n                    if (authCookieString[_DYN_LENGTH ] > 1 && authCookieString[1]) {\n                        _self[_DYN_ACCOUNT_ID ] = authCookieString[1];\n                    }\n                }\n            });\n            unloadHookContainer && unloadHookContainer.add(unloadHook);\n            function _generateNewId() {\n                var theConfig = (config || {});\n                var getNewId = theConfig[_DYN_GET_NEW_ID ] || newId;\n                var id = getNewId(theConfig[_DYN_ID_LENGTH ] ? config[_DYN_ID_LENGTH ] : 22);\n                return id;\n            }\n            function _generateNewCookie(userId) {\n                var acqStr = toISOString(new Date());\n                _self.accountAcquisitionDate = acqStr;\n                _self[_DYN_IS_NEW_USER ] = true;\n                var newCookie = [userId, acqStr];\n                return newCookie;\n            }\n            function _setUserCookie(cookie) {\n                var oneYear = 31536000;\n                _self[_DYN_IS_USER_COOKIE_SET ] = _cookieManager.set(_storageNamePrefix, cookie, oneYear);\n            }\n            _self.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n                if (storeInCookie === void 0) { storeInCookie = false; }\n                var isInvalidInput = !_validateUserInput(authenticatedUserId) || (accountId && !_validateUserInput(accountId));\n                if (isInvalidInput) {\n                    _throwInternal(_logger, 2 , 60 , \"Setting auth user context failed. \" +\n                        \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                    return;\n                }\n                _self[_DYN_AUTHENTICATED_ID ] = authenticatedUserId;\n                var authCookie = _self[_DYN_AUTHENTICATED_ID ];\n                if (accountId) {\n                    _self[_DYN_ACCOUNT_ID ] = accountId;\n                    authCookie = [_self[_DYN_AUTHENTICATED_ID ], _self.accountId][_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]);\n                }\n                if (storeInCookie) {\n                    _cookieManager.set(User[_DYN_AUTH_USER_COOKIE_NAM7 ], encodeURI(authCookie));\n                }\n            };\n            _self.clearAuthenticatedUserContext = function () {\n                _self[_DYN_AUTHENTICATED_ID ] = null;\n                _self[_DYN_ACCOUNT_ID ] = null;\n                _cookieManager.del(User[_DYN_AUTH_USER_COOKIE_NAM7 ]);\n            };\n            _self[_DYN_UPDATE ] = function (userId) {\n                if (_self.id !== userId || !_self[_DYN_IS_USER_COOKIE_SET ]) {\n                    var user_id = userId ? userId : _generateNewId();\n                    var user_cookie = _generateNewCookie(user_id);\n                    _setUserCookie(user_cookie[_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]));\n                }\n            };\n        });\n    }\n    User.cookieSeparator = \"|\";\n    User.userCookieName = \"ai_user\";\n    User.authUserCookieName = \"ai_authUser\";\n    return User;\n}());\n\nvar strExt = \"ext\";\nvar strTags = \"tags\";\nfunction _removeEmpty(target, name) {\n    if (target && target[name] && objKeys(target[name])[_DYN_LENGTH ] === 0) {\n        delete target[name];\n    }\n}\nfunction _nullResult() {\n    return null;\n}\nvar TelemetryContext = /** @class */ (function () {\n    function TelemetryContext(core, defaultConfig, previousTraceCtx, unloadHookContainer) {\n        var _this = this;\n        var logger = core.logger;\n        dynamicProto(TelemetryContext, this, function (_self) {\n            _self.appId = _nullResult;\n            _self[_DYN_GET_SESSION_ID ] = _nullResult;\n            _self.application = new Application();\n            _self.internal = new Internal(defaultConfig, unloadHookContainer);\n            if (hasWindow()) {\n                _self[_DYN_SESSION_MANAGER ] = new _SessionManager(defaultConfig, core, unloadHookContainer);\n                _self.device = new Device();\n                _self.location = new Location();\n                _self.user = new User(defaultConfig, core, unloadHookContainer);\n                var traceId = void 0;\n                var parentId = void 0;\n                var name_1;\n                if (previousTraceCtx) {\n                    traceId = previousTraceCtx.getTraceId();\n                    parentId = previousTraceCtx.getSpanId();\n                    name_1 = previousTraceCtx.getName();\n                }\n                _self[_DYN_TELEMETRY_TRACE ] = new TelemetryTrace(traceId, parentId, name_1, logger);\n                _self.session = new Session();\n            }\n            _self[_DYN_GET_SESSION_ID ] = function () {\n                var session = _self.session;\n                var sesId = null;\n                if (session && isString(session.id)) {\n                    sesId = session.id;\n                }\n                else {\n                    var autoSession = (_self[_DYN_SESSION_MANAGER ] || {})[_DYN_AUTOMATIC_SESSION ];\n                    sesId = autoSession && isString(autoSession.id) ? autoSession.id : null;\n                }\n                return sesId;\n            };\n            _self[_DYN_APPLY_SESSION_CONTEX0 ] = function (evt, itemCtx) {\n                setValue(getSetValue(evt.ext, Extensions.AppExt), \"sesId\", _self[_DYN_GET_SESSION_ID ](), isString);\n            };\n            _self[_DYN_APPLY_OPERATING_SYST3 ] = function (evt, itemCtx) {\n                setValue(evt.ext, Extensions.OSExt, _self.os);\n            };\n            _self[_DYN_APPLY_APPLICATION_CO1 ] = function (evt, itemCtx) {\n                var application = _self.application;\n                if (application) {\n                    var tags = getSetValue(evt, strTags);\n                    setValue(tags, CtxTagKeys.applicationVersion, application.ver, isString);\n                    setValue(tags, CtxTagKeys.applicationBuild, application.build, isString);\n                }\n            };\n            _self[_DYN_APPLY_DEVICE_CONTEXT ] = function (evt, itemCtx) {\n                var device = _self.device;\n                if (device) {\n                    var extDevice = getSetValue(getSetValue(evt, strExt), Extensions.DeviceExt);\n                    setValue(extDevice, \"localId\", device.id, isString);\n                    setValue(extDevice, \"ip\", device.ip, isString);\n                    setValue(extDevice, \"model\", device.model, isString);\n                    setValue(extDevice, \"deviceClass\", device.deviceClass, isString);\n                }\n            };\n            _self[_DYN_APPLY_INTERNAL_CONTE5 ] = function (evt, itemCtx) {\n                var internal = _self.internal;\n                if (internal) {\n                    var tags = getSetValue(evt, strTags);\n                    setValue(tags, CtxTagKeys.internalAgentVersion, internal.agentVersion, isString);\n                    setValue(tags, CtxTagKeys.internalSdkVersion, dataSanitizeString(logger, internal.sdkVersion, 64), isString);\n                    if (evt.baseType === _InternalLogMessage.dataType || evt.baseType === PageView.dataType) {\n                        setValue(tags, CtxTagKeys.internalSnippet, internal.snippetVer, isString);\n                        setValue(tags, CtxTagKeys.internalSdkSrc, internal.sdkSrc, isString);\n                    }\n                }\n            };\n            _self[_DYN_APPLY_LOCATION_CONTE4 ] = function (evt, itemCtx) {\n                var location = _this.location;\n                if (location) {\n                    setValue(getSetValue(evt, strTags, []), CtxTagKeys.locationIp, location.ip, isString);\n                }\n            };\n            _self[_DYN_APPLY_OPERATION_CONT2 ] = function (evt, itemCtx) {\n                var telemetryTrace = _self[_DYN_TELEMETRY_TRACE ];\n                if (telemetryTrace) {\n                    var extTrace = getSetValue(getSetValue(evt, strExt), Extensions.TraceExt, { traceID: undefined, parentID: undefined });\n                    setValue(extTrace, \"traceID\", telemetryTrace.traceID, isString, isNullOrUndefined);\n                    setValue(extTrace, \"name\", telemetryTrace.name, isString, isNullOrUndefined);\n                    setValue(extTrace, \"parentID\", telemetryTrace.parentID, isString, isNullOrUndefined);\n                }\n            };\n            _self.applyWebContext = function (evt, itemCtx) {\n                var web = _this.web;\n                if (web) {\n                    setValue(getSetValue(evt, strExt), Extensions.WebExt, web);\n                }\n            };\n            _self[_DYN_APPLY_USER_CONTEXT ] = function (evt, itemCtx) {\n                var user = _self.user;\n                if (user) {\n                    var tags = getSetValue(evt, strTags, []);\n                    setValue(tags, CtxTagKeys.userAccountId, user[_DYN_ACCOUNT_ID ], isString);\n                    var extUser = getSetValue(getSetValue(evt, strExt), Extensions.UserExt);\n                    setValue(extUser, \"id\", user.id, isString);\n                    setValue(extUser, \"authId\", user[_DYN_AUTHENTICATED_ID ], isString);\n                }\n            };\n            _self.cleanUp = function (evt, itemCtx) {\n                var ext = evt.ext;\n                if (ext) {\n                    _removeEmpty(ext, Extensions.DeviceExt);\n                    _removeEmpty(ext, Extensions.UserExt);\n                    _removeEmpty(ext, Extensions.WebExt);\n                    _removeEmpty(ext, Extensions.OSExt);\n                    _removeEmpty(ext, Extensions.AppExt);\n                    _removeEmpty(ext, Extensions.TraceExt);\n                }\n            };\n        });\n    }\n    TelemetryContext.__ieDyn=1;\n    return TelemetryContext;\n}());\n\nvar _a$1;\nvar undefString;\nvar nullValue = null;\nvar _defaultConfig = objDeepFreeze((_a$1 = {},\n    _a$1[_DYN_ACCOUNT_ID ] = nullValue,\n    _a$1.sessionRenewalMs = 30 * 60 * 1000,\n    _a$1.samplingPercentage = 100,\n    _a$1.sessionExpirationMs = 24 * 60 * 60 * 1000,\n    _a$1.cookieDomain = nullValue,\n    _a$1.sdkExtension = nullValue,\n    _a$1.isBrowserLinkTrackingEnabled = false,\n    _a$1.appId = nullValue,\n    _a$1[_DYN_GET_SESSION_ID ] = nullValue,\n    _a$1[_DYN_NAME_PREFIX ] = undefString,\n    _a$1[_DYN_SESSION_COOKIE_POSTF6 ] = undefString,\n    _a$1[_DYN_USER_COOKIE_POSTFIX ] = undefString,\n    _a$1[_DYN_ID_LENGTH ] = 22,\n    _a$1[_DYN_GET_NEW_ID ] = nullValue,\n    _a$1));\nvar PropertiesPlugin = /** @class */ (function (_super) {\n    __extendsFn(PropertiesPlugin, _super);\n    function PropertiesPlugin() {\n        var _this = _super.call(this) || this;\n        _this.priority = 110;\n        _this.identifier = PropertiesPluginIdentifier;\n        var _extensionConfig;\n        var _distributedTraceCtx;\n        var _previousTraceCtx;\n        var _context;\n        var _disableUserInitMessage;\n        dynamicProto(PropertiesPlugin, _this, function (_self, _base) {\n            _initDefaults();\n            objDefine(_self, \"context\", {\n                g: function () {\n                    return _context;\n                }\n            });\n            _self.initialize = function (config, core, extensions, pluginChain) {\n                _base.initialize(config, core, extensions, pluginChain);\n                _populateDefaults(config);\n            };\n            _self.processTelemetry = function (event, itemCtx) {\n                if (!isNullOrUndefined(event)) {\n                    itemCtx = _self._getTelCtx(itemCtx);\n                    if (event.name === PageView.envelopeType) {\n                        itemCtx.diagLog().resetInternalMessageCount();\n                    }\n                    var theContext = (_context || {});\n                    if (theContext.session) {\n                        if (typeof _context.session.id !== \"string\" && theContext[_DYN_SESSION_MANAGER ]) {\n                            theContext[_DYN_SESSION_MANAGER ][_DYN_UPDATE ]();\n                        }\n                    }\n                    var userCtx = theContext.user;\n                    if (userCtx && !userCtx[_DYN_IS_USER_COOKIE_SET ]) {\n                        userCtx[_DYN_UPDATE ](theContext.user.id);\n                    }\n                    _processTelemetryInternal(event, itemCtx);\n                    if (userCtx && userCtx[_DYN_IS_NEW_USER ]) {\n                        userCtx[_DYN_IS_NEW_USER ] = false;\n                        if (!_disableUserInitMessage) {\n                            var message = new _InternalLogMessage(72 , ((getNavigator() || {}).userAgent || \"\"));\n                            _logInternalMessage(itemCtx.diagLog(), 1 , message);\n                        }\n                    }\n                    _self.processNext(event, itemCtx);\n                }\n            };\n            _self._doTeardown = function (unloadCtx, unloadState) {\n                var core = (unloadCtx || {}).core();\n                if (core && core[_DYN_GET_TRACE_CTX ]) {\n                    var traceCtx = core[_DYN_GET_TRACE_CTX ](false);\n                    if (traceCtx === _distributedTraceCtx) {\n                        core.setTraceCtx(_previousTraceCtx);\n                    }\n                }\n                _initDefaults();\n            };\n            function _initDefaults() {\n                _extensionConfig = null;\n                _distributedTraceCtx = null;\n                _previousTraceCtx = null;\n                _context = null;\n                _disableUserInitMessage = false;\n            }\n            function _populateDefaults(config) {\n                var identifier = _self.identifier;\n                var core = _self.core;\n                _self._addHook(onConfigChange(config, function () {\n                    var ctx = createProcessTelemetryContext(null, config, core);\n                    if (config.storagePrefix) {\n                        utlSetStoragePrefix(config.storagePrefix);\n                    }\n                    _disableUserInitMessage = config.disableUserInitMessage || false;\n                    _extensionConfig = ctx.getExtCfg(identifier, _defaultConfig);\n                    _self[\"_extConfig\"] = _extensionConfig;\n                }));\n                _previousTraceCtx = core[_DYN_GET_TRACE_CTX ](false);\n                _context = new TelemetryContext(core, _extensionConfig, _previousTraceCtx, _self._unloadHooks);\n                _distributedTraceCtx = createDistributedTraceContextFromTrace(_self.context[_DYN_TELEMETRY_TRACE ], _previousTraceCtx);\n                core.setTraceCtx(_distributedTraceCtx);\n                _self.context.appId = function () {\n                    var breezeChannel = core.getPlugin(BreezeChannelIdentifier);\n                    return breezeChannel ? breezeChannel.plugin[\"_appId\"] : null;\n                };\n            }\n            function _processTelemetryInternal(evt, itemCtx) {\n                getSetValue(evt, \"tags\", []);\n                getSetValue(evt, \"ext\", {});\n                var ctx = _self.context;\n                ctx[_DYN_APPLY_SESSION_CONTEX0 ](evt, itemCtx);\n                ctx[_DYN_APPLY_APPLICATION_CO1 ](evt, itemCtx);\n                ctx[_DYN_APPLY_DEVICE_CONTEXT ](evt, itemCtx);\n                ctx[_DYN_APPLY_OPERATION_CONT2 ](evt, itemCtx);\n                ctx[_DYN_APPLY_USER_CONTEXT ](evt, itemCtx);\n                ctx[_DYN_APPLY_OPERATING_SYST3 ](evt, itemCtx);\n                ctx.applyWebContext(evt, itemCtx);\n                ctx[_DYN_APPLY_LOCATION_CONTE4 ](evt, itemCtx);\n                ctx[_DYN_APPLY_INTERNAL_CONTE5 ](evt, itemCtx);\n                ctx.cleanUp(evt, itemCtx);\n            }\n        });\n        return _this;\n    }\n    PropertiesPlugin.__ieDyn=1;\n    return PropertiesPlugin;\n}(BaseTelemetryPlugin));\nvar PropertiesPlugin$1 = PropertiesPlugin;\n\nvar _AUTHENTICATED_USER_CONTEXT = \"AuthenticatedUserContext\";\nvar _TRACK = \"track\";\nvar STR_SNIPPET = \"snippet\";\nvar STR_GET_COOKIE_MGR = \"getCookieMgr\";\nvar STR_START_TRACK_PAGE = \"startTrackPage\";\nvar STR_STOP_TRACK_PAGE = \"stopTrackPage\";\nvar STR_FLUSH = \"flush\";\nvar STR_START_TRACK_EVENT = \"startTrackEvent\";\nvar STR_STOP_TRACK_EVENT = \"stopTrackEvent\";\nvar STR_ADD_TELEMETRY_INITIALIZER = \"addTelemetryInitializer\";\nvar STR_POLL_INTERNAL_LOGS = \"pollInternalLogs\";\nvar STR_GET_PLUGIN = \"getPlugin\";\nvar STR_EVT_NAMESPACE = \"evtNamespace\";\nvar STR_TRACK_EVENT = _TRACK + \"Event\";\nvar STR_TRACK_TRACE = _TRACK + \"Trace\";\nvar STR_TRACK_METRIC = _TRACK + \"Metric\";\nvar STR_TRACK_PAGE_VIEW = _TRACK + \"PageView\";\nvar STR_TRACK_EXCEPTION = _TRACK + \"Exception\";\nvar STR_TRACK_DEPENDENCY_DATA = _TRACK + \"DependencyData\";\nvar STR_SET_AUTHENTICATED_USER_CONTEXT = \"set\" + _AUTHENTICATED_USER_CONTEXT;\nvar STR_CLEAR_AUTHENTICATED_USER_CONTEXT = \"clear\" + _AUTHENTICATED_USER_CONTEXT;\n\nvar _DYN_VERSION = \"version\";\nvar _DYN_QUEUE = \"queue\";\nvar _DYN_CONNECTION_STRING = \"connectionString\";\nvar _DYN_ENDPOINT_URL = \"endpointUrl\";\nvar _DYN_INSTRUMENTATION_KEY = \"instrumentationKey\";\nvar _DYN_ONUNLOAD_FLUSH = \"onunloadFlush\";\nvar _DYN_CONTEXT = \"context\";\nvar _DYN_ADD_HOUSEKEEPING_BEF0 = \"addHousekeepingBeforeUnload\";\nvar _DYN_SEND_MESSAGE = \"sendMessage\";\nvar _DYN_UPDATE_SNIPPET_DEFIN1 = \"updateSnippetDefinitions\";\n\nvar _a, _b, _c;\nvar _internalSdkSrc;\nvar _ignoreUpdateSnippetProperties = [\n    STR_SNIPPET, \"dependencies\", \"properties\", \"_snippetVersion\", \"appInsightsNew\", \"getSKUDefaults\"\n];\nvar IKEY_USAGE = \"iKeyUsage\";\nvar CDN_USAGE = \"CdnUsage\";\nvar SDK_LOADER_VER = \"SdkLoaderVer\";\nvar UNDEFINED_VALUE = undefined;\nvar default_limit = {\n    samplingRate: 100,\n    maxSendNumber: 1\n};\nvar default_interval = {\n    monthInterval: 3,\n    daysOfMonth: [28]\n};\nvar default_throttle_config = {\n    disabled: true,\n    limit: cfgDfMerge(default_limit),\n    interval: cfgDfMerge(default_interval)\n};\nvar defaultConfigValues = (_a = {},\n    _a[_DYN_CONNECTION_STRING ] = UNDEFINED_VALUE,\n    _a[_DYN_ENDPOINT_URL ] = UNDEFINED_VALUE,\n    _a[_DYN_INSTRUMENTATION_KEY ] = UNDEFINED_VALUE,\n    _a.diagnosticLogInterval = cfgDfValidate(_chkDiagLevel, 10000),\n    _a.featureOptIn = (_b = {},\n        _b[IKEY_USAGE] = { mode: 2  },\n        _b[CDN_USAGE] = { mode: 2  },\n        _b[SDK_LOADER_VER] = { mode: 2  },\n        _b),\n    _a.throttleMgrCfg = cfgDfMerge((_c = {},\n        _c[109 ] = cfgDfMerge(default_throttle_config),\n        _c[106 ] = cfgDfMerge(default_throttle_config),\n        _c[111 ] = cfgDfMerge(default_throttle_config),\n        _c[110 ] = cfgDfMerge(default_throttle_config),\n        _c)),\n    _a);\nfunction _chkDiagLevel(value) {\n    return value && value > 0;\n}\nvar AppInsightsSku = /** @class */ (function () {\n    function AppInsightsSku(snippet) {\n        var _this = this;\n        var dependencies;\n        var properties;\n        var _sender;\n        var _snippetVersion;\n        var _evtNamespace;\n        var _houseKeepingNamespace;\n        var _core;\n        var _config;\n        var _analyticsPlugin;\n        var _cfgSyncPlugin;\n        var _throttleMgr;\n        var _iKeySentMessage;\n        var _cdnSentMessage;\n        var _sdkVerSentMessage;\n        dynamicProto(AppInsightsSku, this, function (_self) {\n            _initDefaults();\n            objDefine(_self, \"config\", {\n                g: function () {\n                    return _config;\n                }\n            });\n            arrForEach([\"pluginVersionStringArr\", \"pluginVersionString\"], function (key) {\n                objDefine(_self, key, {\n                    g: function () {\n                        if (_core) {\n                            return _core[key];\n                        }\n                        return null;\n                    }\n                });\n            });\n            _snippetVersion = \"\" + (snippet.sv || snippet[_DYN_VERSION ] || \"\");\n            snippet[_DYN_QUEUE ] = snippet[_DYN_QUEUE ] || [];\n            snippet[_DYN_VERSION ] = snippet[_DYN_VERSION ] || 2.0;\n            var cfgHandler = createDynamicConfig(snippet.config || {}, defaultConfigValues);\n            _config = cfgHandler.cfg;\n            _analyticsPlugin = new AnalyticsPlugin();\n            objDefine(_self, \"appInsights\", {\n                g: function () {\n                    return _analyticsPlugin;\n                }\n            });\n            properties = new PropertiesPlugin$1();\n            dependencies = new AjaxMonitor();\n            _sender = new Sender();\n            _core = new AppInsightsCore();\n            objDefine(_self, \"core\", {\n                g: function () {\n                    return _core;\n                }\n            });\n            _addUnloadHook(onConfigChange(cfgHandler, function () {\n                if (_config[_DYN_CONNECTION_STRING ]) {\n                    var cs = parseConnectionString(_config[_DYN_CONNECTION_STRING ]);\n                    var ingest = cs.ingestionendpoint;\n                    _config[_DYN_ENDPOINT_URL ] = ingest ? (ingest + DEFAULT_BREEZE_PATH) : _config[_DYN_ENDPOINT_URL ];\n                    _config[_DYN_INSTRUMENTATION_KEY ] = cs.instrumentationkey || _config[_DYN_INSTRUMENTATION_KEY ];\n                }\n            }));\n            _self[STR_SNIPPET ] = snippet;\n            _self[STR_FLUSH ] = function (async, callBack) {\n                if (async === void 0) { async = true; }\n                var result;\n                doPerf(_core, function () { return \"AISKU.flush\"; }, function () {\n                    if (async && !callBack) {\n                        result = createPromise(function (resolve) {\n                            callBack = resolve;\n                        });\n                    }\n                    var waiting = 1;\n                    var flushDone = function () {\n                        waiting--;\n                        if (waiting === 0) {\n                            callBack();\n                        }\n                    };\n                    arrForEach(_core.getChannels(), function (channel) {\n                        if (channel) {\n                            waiting++;\n                            channel[STR_FLUSH ](async, flushDone);\n                        }\n                    });\n                    flushDone();\n                }, null, async);\n                return result;\n            };\n            _self[_DYN_ONUNLOAD_FLUSH ] = function (async) {\n                if (async === void 0) { async = true; }\n                arrForEach(_core.getChannels(), function (channel) {\n                    if (channel[_DYN_ONUNLOAD_FLUSH ]) {\n                        channel[_DYN_ONUNLOAD_FLUSH ]();\n                    }\n                    else {\n                        channel[STR_FLUSH ](async);\n                    }\n                });\n            };\n            _self.loadAppInsights = function (legacyMode, logger, notificationManager) {\n                if (legacyMode === void 0) { legacyMode = false; }\n                if (legacyMode) {\n                    throwUnsupported(\"Legacy Mode is no longer supported\");\n                }\n                function _updateSnippetProperties(snippet) {\n                    if (snippet) {\n                        var snippetVer = \"\";\n                        if (!isNullOrUndefined(_snippetVersion)) {\n                            snippetVer += _snippetVersion;\n                        }\n                        if (_self[_DYN_CONTEXT ] && _self[_DYN_CONTEXT ].internal) {\n                            _self[_DYN_CONTEXT ].internal.snippetVer = snippetVer || \"-\";\n                        }\n                        objForEachKey(_self, function (field, value) {\n                            if (isString(field) &&\n                                !isFunction(value) &&\n                                field && field[0] !== \"_\" &&\n                                arrIndexOf(_ignoreUpdateSnippetProperties, field) === -1) {\n                                if (snippet[field] !== value) {\n                                    snippet[field] = value;\n                                }\n                            }\n                        });\n                    }\n                }\n                doPerf(_self.core, function () { return \"AISKU.loadAppInsights\"; }, function () {\n                    _core.initialize(_config, [_sender, properties, dependencies, _analyticsPlugin, _cfgSyncPlugin], logger, notificationManager);\n                    objDefine(_self, \"context\", {\n                        g: function () { return properties[_DYN_CONTEXT ]; }\n                    });\n                    if (!_throttleMgr) {\n                        _throttleMgr = new ThrottleMgr(_core);\n                    }\n                    var sdkSrc = _findSdkSourceFile();\n                    if (sdkSrc && _self[_DYN_CONTEXT ]) {\n                        _self[_DYN_CONTEXT ].internal.sdkSrc = sdkSrc;\n                    }\n                    _updateSnippetProperties(_self[STR_SNIPPET ]);\n                    _self.emptyQueue();\n                    _self[STR_POLL_INTERNAL_LOGS ]();\n                    _self[_DYN_ADD_HOUSEKEEPING_BEF0 ](_self);\n                    _addUnloadHook(onConfigChange(cfgHandler, function () {\n                        var defaultEnable = false;\n                        if (_config.throttleMgrCfg[109 ]) {\n                            defaultEnable = !_config.throttleMgrCfg[109 ].disabled;\n                        }\n                        if (!_throttleMgr.isReady() && _config.extensionConfig && _config.extensionConfig[_cfgSyncPlugin.identifier] && defaultEnable) {\n                            _throttleMgr.onReadyState(true);\n                        }\n                        if (!_iKeySentMessage && !_config[_DYN_CONNECTION_STRING ] && isFeatureEnabled(IKEY_USAGE, _config)) {\n                            _throttleMgr[_DYN_SEND_MESSAGE ](106 , \"See Instrumentation key support at aka.ms/IkeyMigrate\");\n                            _iKeySentMessage = true;\n                        }\n                        if (!_cdnSentMessage && _self[_DYN_CONTEXT ].internal.sdkSrc && _self[_DYN_CONTEXT ].internal.sdkSrc.indexOf(\"az416426\") != -1 && isFeatureEnabled(CDN_USAGE, _config)) {\n                            _throttleMgr[_DYN_SEND_MESSAGE ](110 , \"See Cdn support notice at aka.ms/JsActiveCdn\");\n                            _cdnSentMessage = true;\n                        }\n                        if (!_sdkVerSentMessage && parseInt(_snippetVersion) < 6 && isFeatureEnabled(SDK_LOADER_VER, _config)) {\n                            _throttleMgr[_DYN_SEND_MESSAGE ](111 , \"An updated Sdk Loader is available, see aka.ms/SnippetVer\");\n                            _sdkVerSentMessage = true;\n                        }\n                    }));\n                });\n                return _self;\n            };\n            _self[_DYN_UPDATE_SNIPPET_DEFIN1 ] = function (snippet) {\n                proxyAssign(snippet, _self, function (name) {\n                    return name && arrIndexOf(_ignoreUpdateSnippetProperties, name) === -1;\n                });\n            };\n            _self.emptyQueue = function () {\n                try {\n                    if (isArray(_self.snippet[_DYN_QUEUE ])) {\n                        var length_1 = _self.snippet[_DYN_QUEUE ].length;\n                        for (var i = 0; i < length_1; i++) {\n                            var call = _self.snippet[_DYN_QUEUE ][i];\n                            call();\n                        }\n                        _self.snippet[_DYN_QUEUE ] = undefined;\n                        delete _self.snippet[_DYN_QUEUE ];\n                    }\n                }\n                catch (exception) {\n                    var properties_1 = {};\n                    if (exception && isFunction(exception.toString)) {\n                        properties_1.exception = exception.toString();\n                    }\n                }\n            };\n            _self[_DYN_ADD_HOUSEKEEPING_BEF0 ] = function (appInsightsInstance) {\n                if (hasWindow() || hasDocument()) {\n                    var performHousekeeping_1 = function () {\n                        appInsightsInstance[_DYN_ONUNLOAD_FLUSH ](false);\n                        if (isFunction(_self.core[STR_GET_PLUGIN ])) {\n                            var loadedPlugin = _this.core[STR_GET_PLUGIN ](PropertiesPluginIdentifier);\n                            if (loadedPlugin) {\n                                var propertiesPlugin = loadedPlugin.plugin;\n                                if (propertiesPlugin && propertiesPlugin[_DYN_CONTEXT ] && propertiesPlugin[_DYN_CONTEXT ]._sessionManager) {\n                                    propertiesPlugin[_DYN_CONTEXT ]._sessionManager.backup();\n                                }\n                            }\n                        }\n                    };\n                    var added_1 = false;\n                    if (!_houseKeepingNamespace) {\n                        _houseKeepingNamespace = mergeEvtNamespace(_evtNamespace, _core[STR_EVT_NAMESPACE ] && _core[STR_EVT_NAMESPACE ]());\n                    }\n                    _addUnloadHook(onConfigChange(_config, function (details) {\n                        var coreConfig = details.cfg;\n                        var analyticsPlugin = appInsightsInstance.appInsights;\n                        var ctx = createProcessTelemetryContext(null, coreConfig, analyticsPlugin.core);\n                        var extConfig = ctx.getExtCfg(analyticsPlugin.identifier || AnalyticsPluginIdentifier);\n                        _removePageEventHandlers();\n                        var excludePageUnloadEvents = coreConfig.disablePageUnloadEvents;\n                        if (!extConfig.disableFlushOnBeforeUnload) {\n                            if (addPageUnloadEventListener(performHousekeeping_1, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                                added_1 = true;\n                            }\n                            if (addPageHideEventListener(performHousekeeping_1, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                                added_1 = true;\n                            }\n                            if (!added_1 && !isReactNative()) {\n                                _throwInternal(_core.logger, 1 , 19 , \"Could not add handler for beforeunload and pagehide\");\n                            }\n                        }\n                        if (!added_1 && !extConfig.disableFlushOnUnload) {\n                            addPageHideEventListener(performHousekeeping_1, excludePageUnloadEvents, _houseKeepingNamespace);\n                        }\n                    }));\n                }\n            };\n            _self.getSender = function () {\n                return _sender;\n            };\n            _self.unload = function (isAsync, unloadComplete, cbTimeout) {\n                var unloadDone = false;\n                var result;\n                if (isAsync && !unloadComplete) {\n                    result = createPromise(function (resolve) {\n                        unloadComplete = resolve;\n                    });\n                }\n                function _unloadCallback(unloadState) {\n                    if (!unloadDone) {\n                        unloadDone = true;\n                        _initDefaults();\n                        unloadComplete && unloadComplete(unloadState);\n                    }\n                }\n                _self[_DYN_ONUNLOAD_FLUSH ](isAsync);\n                _removePageEventHandlers();\n                _core.unload && _core.unload(isAsync, _unloadCallback, cbTimeout);\n                return result;\n            };\n            proxyFunctions(_self, _analyticsPlugin, [\n                STR_GET_COOKIE_MGR,\n                STR_TRACK_EVENT,\n                STR_TRACK_PAGE_VIEW,\n                \"trackPageViewPerformance\",\n                STR_TRACK_EXCEPTION,\n                \"_onerror\",\n                STR_TRACK_TRACE,\n                STR_TRACK_METRIC,\n                STR_START_TRACK_PAGE,\n                STR_STOP_TRACK_PAGE,\n                STR_START_TRACK_EVENT,\n                STR_STOP_TRACK_EVENT\n            ]);\n            proxyFunctions(_self, _getCurrentDependencies, [\n                STR_TRACK_DEPENDENCY_DATA,\n                \"addDependencyListener\",\n                \"addDependencyInitializer\"\n            ]);\n            proxyFunctions(_self, _core, [\n                STR_ADD_TELEMETRY_INITIALIZER,\n                STR_POLL_INTERNAL_LOGS,\n                \"stopPollingInternalLogs\",\n                STR_GET_PLUGIN,\n                \"addPlugin\",\n                STR_EVT_NAMESPACE,\n                \"addUnloadCb\",\n                \"getTraceCtx\",\n                \"updateCfg\",\n                \"onCfgChange\"\n            ]);\n            proxyFunctions(_self, function () {\n                var context = properties[_DYN_CONTEXT ];\n                return context ? context.user : null;\n            }, [\n                STR_SET_AUTHENTICATED_USER_CONTEXT,\n                STR_CLEAR_AUTHENTICATED_USER_CONTEXT\n            ]);\n            function _getCurrentDependencies() {\n                return dependencies;\n            }\n            function _initDefaults() {\n                _evtNamespace = createUniqueNamespace(\"AISKU\");\n                _houseKeepingNamespace = null;\n                dependencies = null;\n                properties = null;\n                _sender = null;\n                _snippetVersion = null;\n                _throttleMgr = null;\n                _iKeySentMessage = false;\n                _cdnSentMessage = false;\n                _sdkVerSentMessage = false;\n                _cfgSyncPlugin = new CfgSyncPlugin();\n            }\n            function _removePageEventHandlers() {\n                if (_houseKeepingNamespace) {\n                    removePageUnloadEventListener(null, _houseKeepingNamespace);\n                    removePageHideEventListener(null, _houseKeepingNamespace);\n                }\n            }\n            function _addUnloadHook(hooks) {\n                _core.addUnloadHook(hooks);\n            }\n        });\n    }\n    AppInsightsSku.prototype.addDependencyInitializer = function (dependencyInitializer) {\n        return null;\n    };\n    return AppInsightsSku;\n}());\nfunction _findSdkSourceFile() {\n    if (_internalSdkSrc) {\n        return _internalSdkSrc;\n    }\n    var sdkSrc = null;\n    var cdns = [\n        \"://js.monitor.azure.com/\",\n        \"://az416426.vo.msecnd.net/\"\n    ];\n    try {\n        var scrpt = (document || {}).currentScript;\n        if (scrpt) {\n            sdkSrc = scrpt.src;\n        }\n    }\n    catch (e) {\n    }\n    if (sdkSrc) {\n        try {\n            var url_1 = sdkSrc.toLowerCase();\n            if (url_1) {\n                var src_1 = \"\";\n                arrForEach(cdns, function (value, idx) {\n                    if (strIndexOf(url_1, value) !== -1) {\n                        src_1 = \"cdn\" + (idx + 1);\n                        if (strIndexOf(url_1, \"/scripts/\") === -1) {\n                            if (strIndexOf(url_1, \"/next/\") !== -1) {\n                                src_1 += \"-next\";\n                            }\n                            else if (strIndexOf(url_1, \"/beta/\") !== -1) {\n                                src_1 += \"-beta\";\n                            }\n                        }\n                        _internalSdkSrc = src_1 + (\"\");\n                        return -1;\n                    }\n                });\n            }\n        }\n        catch (e) {\n        }\n        _internalSdkSrc = sdkSrc;\n    }\n    return _internalSdkSrc;\n}\n\nvar ApplicationInsightsContainer = /** @class */ (function () {\n    function ApplicationInsightsContainer() {\n    }\n    ApplicationInsightsContainer.getAppInsights = function (snippet, version) {\n        var theSku = new AppInsightsSku(snippet);\n        if (version >= 2.0) {\n            theSku[_DYN_UPDATE_SNIPPET_DEFIN1 ](snippet);\n            theSku.loadAppInsights(false);\n            return theSku;\n        }\n        throwUnsupported(\"V1 API compatibility is no longer supported\");\n    };\n    return ApplicationInsightsContainer;\n}());\n\nfunction _logWarn(aiName, message) {\n    var _console = getInst(\"console\");\n    if (_console && _console.warn) {\n        _console.warn(\"Failed to initialize AppInsights JS SDK for instance \" + (aiName || \"<unknown>\") + \" - \" + message);\n    }\n}\ntry {\n    var aiName;\n    if (typeof window !== strShimUndefined) {\n        var _window = window;\n        aiName = _window[\"appInsightsSDK\"] || \"appInsights\";\n        if (typeof JSON !== strShimUndefined) {\n            if (_window[aiName] !== undefined) {\n                var snippet = _window[aiName] || { version: 2.0 };\n                if ((snippet[_DYN_VERSION ] >= 2 && _window[aiName].initialize) || snippet[_DYN_VERSION ] === undefined) {\n                    ApplicationInsightsContainer.getAppInsights(snippet, snippet[_DYN_VERSION ]);\n                }\n            }\n        }\n        else {\n            _logWarn(aiName, \"Missing JSON - you must supply a JSON polyfill!\");\n        }\n    }\n    else {\n        _logWarn(aiName, \"Missing window\");\n    }\n}\ncatch (e) {\n    _logWarn(aiName, e.message);\n}\n\nexports.AnalyticsPluginIdentifier = AnalyticsPluginIdentifier;\nexports.ApplicationInsights = AppInsightsSku;\nexports.BreezeChannelIdentifier = BreezeChannelIdentifier;\nexports.DEFAULT_BREEZE_ENDPOINT = DEFAULT_BREEZE_ENDPOINT;\nexports.DisabledPropertyName = DisabledPropertyName;\nexports.DistributedTracingModes = DistributedTracingModes;\nexports.LoggingSeverity = LoggingSeverity;\nexports.PerfEvent = PerfEvent;\nexports.PerfManager = PerfManager;\nexports.PropertiesPluginIdentifier = PropertiesPluginIdentifier;\nexports.RequestHeaders = RequestHeaders;\nexports.SeverityLevel = SeverityLevel;\nexports.addEventHandler = addEventHandler;\nexports.doPerf = doPerf;\nexports.eventOff = eventOff;\nexports.eventOn = eventOn;\nexports.findMetaTag = findMetaTag;\nexports.findW3cTraceParent = findW3cTraceParent;\nexports.generateW3CId = generateW3CId;\nexports.isBeaconsSupported = isBeaconsSupported;\nexports.mergeEvtNamespace = mergeEvtNamespace;\nexports.newGuid = newGuid;\nexports.newId = newId;\nexports.random32 = random32;\nexports.randomValue = randomValue;\nexports.removeEventHandler = removeEventHandler;\n\n}));\n//# sourceMappingURL=ai.3.0.6.js.map\n"
  },
  {
    "path": "AISKU/Tests/Manual/aisku-example-index.gbl.js",
    "content": "/*!\n * Application Insights JavaScript SDK Example - AISKU, 3.0.2\n * Copyright (c) Microsoft and contributors. All rights reserved.\n */\n(function () {\n    'use strict';\n\n    var UNDEF_VALUE = undefined;\n    var NULL_VALUE = null;\n    var EMPTY = \"\";\n    var BOOLEAN = \"boolean\";\n    var FUNCTION = \"function\";\n    var NUMBER = \"number\";\n    var OBJECT = \"object\";\n    var PROTOTYPE = \"prototype\";\n    var __PROTO__ = \"__proto__\";\n    var STRING = \"string\";\n    var UNDEFINED = \"undefined\";\n    var CONSTRUCTOR = \"constructor\";\n    var SYMBOL = \"Symbol\";\n    var POLYFILL_TAG = \"_polyfill\";\n    var INDEX_OF = \"indexOf\";\n    var LENGTH = \"length\";\n    var DONE = \"done\";\n    var VALUE = \"value\";\n    var NAME = \"name\";\n    var SLICE = \"slice\";\n    var ObjClass$1 = Object;\n    var ObjProto$1 = ObjClass$1[PROTOTYPE];\n    var StrCls = String;\n    var StrProto = StrCls[PROTOTYPE];\n    var MathCls = Math;\n    var ArrCls = Array;\n    var ArrProto = ArrCls[PROTOTYPE];\n\n    function safeGet(cb, defValue) {\n        var result = defValue;\n        try {\n            result = cb();\n        }\n        catch (e) {\n        }\n        return result;\n    }\n\n    var PRIMITIVE_TYPES = [STRING, NUMBER, BOOLEAN, UNDEFINED, \"symbol\", \"bigint\"];\n    function _createIs(theType) {\n        return function (value) {\n            return typeof value === theType;\n        };\n    }\n    function _createObjIs(theName) {\n        var theType = \"[object \" + theName + \"]\";\n        return function (value) {\n            return !!(value && objToString(value) === theType);\n        };\n    }\n    function objToString(value) {\n        return ObjProto$1.toString.call(value);\n    }\n    function isUndefined(value) {\n        return typeof value === UNDEFINED || value === UNDEFINED;\n    }\n    function isNullOrUndefined(value) {\n        return value === NULL_VALUE || isUndefined(value);\n    }\n    function isStrictNullOrUndefined(value) {\n        return value === NULL_VALUE || !isDefined(value);\n    }\n    function isDefined(arg) {\n        return !!arg || arg !== UNDEF_VALUE;\n    }\n    var isPrimitiveType = function (theType) {\n        return theType !== OBJECT && PRIMITIVE_TYPES.indexOf(theType) !== -1;\n    };\n    var isString = _createIs(STRING);\n    var isFunction = _createIs(FUNCTION);\n    function isObject(value) {\n        if (!value && isNullOrUndefined(value)) {\n            return false;\n        }\n        return !!value && typeof value === OBJECT;\n    }\n    var isArray = ArrCls.isArray;\n    var isDate = _createObjIs(\"Date\");\n    var isNumber = _createIs(NUMBER);\n    var isBoolean = _createIs(BOOLEAN);\n    var isError = _createObjIs(\"Error\");\n    function isPromiseLike(value) {\n        return !!value && isFunction(value.then);\n    }\n    function isTruthy(value) {\n        return !(!value || safeGet(function () { return !(value && (0 + value)); }, !value));\n    }\n\n    var objGetOwnPropertyDescriptor = ObjClass$1.getOwnPropertyDescriptor;\n\n    function objHasOwnProperty(obj, prop) {\n        return obj && ObjProto$1.hasOwnProperty.call(obj, prop);\n    }\n\n    var objHasOwn = ObjClass$1[\"hasOwn\"] || polyObjHasOwn;\n    function polyObjHasOwn(obj, prop) {\n        return objHasOwnProperty(obj, prop) || !!objGetOwnPropertyDescriptor(obj, prop);\n    }\n\n    function objForEachKey(theObject, callbackfn, thisArg) {\n        if (theObject && isObject(theObject)) {\n            for (var prop in theObject) {\n                if (objHasOwn(theObject, prop)) {\n                    if (callbackfn.call(thisArg || theObject, prop, theObject[prop]) === -1) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    function _createKeyValueMap(values, keyType, valueType, completeFn) {\n        var theMap = {};\n        objForEachKey(values, function (key, value) {\n            theMap[key] = keyType ? value : key;\n            theMap[value] = valueType ? value : key;\n        });\n        return completeFn(theMap);\n    }\n\n    function throwError(message) {\n        throw new Error(message);\n    }\n    function throwTypeError(message) {\n        throw new TypeError(message);\n    }\n\n    var _objFreeze = ObjClass$1[\"freeze\"];\n    var _doNothing = function (value) { return value; };\n    var _getProto = function (value) { return value[__PROTO__] || NULL_VALUE; };\n    var objAssign = ObjClass$1[\"assign\"];\n    function objKeys(value) {\n        if (!isObject(value) || value === NULL_VALUE) {\n            throwTypeError(\"objKeys called on non-object\");\n        }\n        return ObjClass$1.keys(value);\n    }\n    function objDeepFreeze(value) {\n        if (_objFreeze) {\n            objForEachKey(value, function (key, value) {\n                if (isArray(value) || isObject(value)) {\n                    _objFreeze(value);\n                }\n            });\n        }\n        return objFreeze(value);\n    }\n    var objFreeze = _objFreeze || _doNothing;\n    var objGetPrototypeOf = ObjClass$1[\"getPrototypeOf\"] || _getProto;\n\n    function createEnum(values) {\n        return _createKeyValueMap(values, 1 , 0 , objDeepFreeze);\n    }\n    function createEnumKeyMap(values) {\n        return _createKeyValueMap(values, 0 , 0 , objDeepFreeze);\n    }\n    function createSimpleMap(values) {\n        var mapClass = {};\n        objForEachKey(values, function (key, value) {\n            mapClass[key] = value[1];\n            mapClass[value[0]] = value[1];\n        });\n        return objDeepFreeze(mapClass);\n    }\n    function createTypeMap(values) {\n        return createSimpleMap(values);\n    }\n\n    var _wellKnownSymbolMap = createEnumKeyMap({\n        asyncIterator: 0 ,\n        hasInstance: 1 ,\n        isConcatSpreadable: 2 ,\n        iterator: 3 ,\n        match: 4 ,\n        matchAll: 5 ,\n        replace: 6 ,\n        search: 7 ,\n        species: 8 ,\n        split: 9 ,\n        toPrimitive: 10 ,\n        toStringTag: 11 ,\n        unscopables: 12\n    });\n\n    var asString = StrCls;\n\n    var GLOBAL_CONFIG_KEY = \"__tsUtils$gblCfg\";\n    var _globalCfg;\n    function _getGlobalValue() {\n        var result;\n        if (typeof globalThis !== UNDEFINED) {\n            result = globalThis;\n        }\n        if (!result && typeof self !== UNDEFINED) {\n            result = self;\n        }\n        if (!result && typeof window !== UNDEFINED) {\n            result = window;\n        }\n        if (!result && typeof global !== UNDEFINED) {\n            result = global;\n        }\n        return result;\n    }\n    function _getGlobalConfig() {\n        if (!_globalCfg) {\n            var gbl = _getGlobalValue() || {};\n            _globalCfg = gbl[GLOBAL_CONFIG_KEY] = gbl[GLOBAL_CONFIG_KEY] || {};\n        }\n        return _globalCfg;\n    }\n\n    function dumpObj(object, format) {\n        var propertyValueDump = EMPTY;\n        if (isError(object)) {\n            propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n        }\n        else {\n            try {\n                propertyValueDump = JSON.stringify(object, NULL_VALUE, format ? (isNumber(format) ? format : 4) : UNDEF_VALUE);\n            }\n            catch (e) {\n                propertyValueDump = \" - \" + dumpObj(e, format);\n            }\n        }\n        return objToString(object) + \": \" + propertyValueDump;\n    }\n\n    var _arrSlice = ArrProto[SLICE];\n    var _throwMissingFunction = function (funcName, thisArg) {\n        throwTypeError(\"'\" + asString(funcName) + \"' not defined for \" + dumpObj(thisArg));\n    };\n    var _unwrapInstFunction = function (funcName) {\n        return function (thisArg) {\n            return thisArg[funcName].apply(thisArg, _arrSlice.call(arguments, 1));\n        };\n    };\n    var _unwrapFunction = function (funcName, clsProto) {\n        var clsFn = clsProto && clsProto[funcName];\n        return function (thisArg) {\n            var theFunc = (thisArg && thisArg[funcName]) || clsFn;\n            if (theFunc) {\n                return theFunc.apply(thisArg, _arrSlice.call(arguments, 1));\n            }\n            _throwMissingFunction(funcName, thisArg);\n        };\n    };\n    var _unwrapFunctionWithPoly = function (funcName, clsProto, polyFunc) {\n        var clsFn = clsProto && clsProto[funcName];\n        return function (thisArg) {\n            var theFunc = (thisArg && thisArg[funcName]) || clsFn;\n            if (theFunc || polyFunc) {\n                var theArgs = arguments;\n                return (theFunc || polyFunc).apply(thisArg, theFunc ? _arrSlice.call(theArgs, 1) : theArgs);\n            }\n            _throwMissingFunction(funcName, thisArg);\n        };\n    };\n    function _unwrapProp(propName) {\n        return function (thisArg) {\n            return thisArg[propName];\n        };\n    }\n\n    var mathMax = MathCls.max;\n\n    var strSlice = _unwrapFunction(SLICE, StrProto);\n\n    var strSubstring = _unwrapFunction(\"substring\", StrProto);\n    var strSubstr = _unwrapFunctionWithPoly(\"substr\", StrProto, polyStrSubstr);\n    function polyStrSubstr(value, start, length) {\n        if (isNullOrUndefined(value)) {\n            throwTypeError(\"'polyStrSubstr called with invalid \" + dumpObj(value));\n        }\n        if (length < 0) {\n            return EMPTY;\n        }\n        start = start || 0;\n        if (start < 0) {\n            start = mathMax(start + value[LENGTH], 0);\n        }\n        if (isUndefined(length)) {\n            return strSlice(value, start);\n        }\n        return strSlice(value, start, start + length);\n    }\n    function strLeft(value, count) {\n        return strSubstring(value, 0, count);\n    }\n\n    var _polySymbols;\n    function _globalSymbolRegistry() {\n        if (!_polySymbols) {\n            var gblCfg = _getGlobalConfig();\n            _polySymbols = gblCfg.gblSym = gblCfg.gblSym || { k: {}, s: {} };\n        }\n        return _polySymbols;\n    }\n    var _wellKnownSymbolCache = {};\n    function polyNewSymbol(description) {\n        var theSymbol = {\n            description: asString(description),\n            toString: function () { return SYMBOL + \"(\" + description + \")\"; }\n        };\n        theSymbol[POLYFILL_TAG] = true;\n        return theSymbol;\n    }\n    function polySymbolFor(key) {\n        var registry = _globalSymbolRegistry();\n        if (!objHasOwn(registry, key)) {\n            var newSymbol = polyNewSymbol(key);\n            registry.k[key] = newSymbol;\n            registry.s[newSymbol] = asString(key);\n        }\n        return registry.k[key];\n    }\n    function polyGetKnownSymbol(name) {\n        var result;\n        var knownName = _wellKnownSymbolMap[name];\n        if (knownName) {\n            result = _wellKnownSymbolCache[knownName] = _wellKnownSymbolCache[knownName] || polyNewSymbol(SYMBOL + \".\" + knownName);\n        }\n        return result;\n    }\n\n    var propMap = {\n        e: \"enumerable\",\n        c: \"configurable\",\n        v: VALUE,\n        w: \"writable\",\n        g: \"get\",\n        s: \"set\"\n    };\n    function _createProp(value) {\n        var prop = {};\n        prop[propMap[\"c\"]] = true;\n        prop[propMap[\"e\"]] = true;\n        if (value.l) {\n            prop.get = function () { return value.l.v; };\n            var desc = objGetOwnPropertyDescriptor(value.l, \"v\");\n            if (desc && desc.set) {\n                prop.set = function (newValue) {\n                    value.l.v = newValue;\n                };\n            }\n        }\n        objForEachKey(value, function (key, value) {\n            prop[propMap[key]] = isUndefined(value) ? prop[propMap[key]] : value;\n        });\n        return prop;\n    }\n    var objDefineProp = ObjClass$1[\"defineProperty\"];\n    function objDefine(target, key, propDesc) {\n        return objDefineProp(target, key, _createProp(propDesc));\n    }\n\n    var _globalLazyTestHooks;\n    var _fetchLazyTestHooks = function () {\n        _globalLazyTestHooks = _getGlobalConfig();\n        _fetchLazyTestHooks = NULL_VALUE;\n    };\n    function getLazy(cb) {\n        var lazyValue = {};\n        _fetchLazyTestHooks && _fetchLazyTestHooks();\n        lazyValue.b = _globalLazyTestHooks.lzy;\n        objDefineProp(lazyValue, \"v\", {\n            configurable: true,\n            get: function () {\n                var result = cb();\n                if (!_globalLazyTestHooks.lzy) {\n                    objDefineProp(lazyValue, \"v\", {\n                        value: result\n                    });\n                    if (lazyValue.b) {\n                        delete lazyValue.b;\n                    }\n                }\n                if (_globalLazyTestHooks.lzy && lazyValue.b !== _globalLazyTestHooks.lzy) {\n                    lazyValue.b = _globalLazyTestHooks.lzy;\n                }\n                return result;\n            }\n        });\n        return lazyValue;\n    }\n\n    function safeGetLazy(cb, defValue) {\n        return getLazy(function () { return safeGet(cb, defValue); });\n    }\n\n    var WINDOW = \"window\";\n    var _cachedGlobal;\n    var _cachedWindow;\n    var _cachedDocument;\n    var _cachedNavigator;\n    var _cachedHistory;\n    var _isWebWorker;\n    var _isNode;\n    var lazySafeGetInst = function (name) { return safeGetLazy(function () { return getInst(name) || UNDEF_VALUE; }, UNDEF_VALUE); };\n    var getGlobal = function (useCached) {\n        (!_cachedGlobal || useCached === false || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedGlobal.b)) && (_cachedGlobal = safeGetLazy(_getGlobalValue, NULL_VALUE));\n        return _cachedGlobal.v;\n    };\n    var getInst = function (name, useCached) {\n        var gbl = (!_cachedGlobal || useCached === false) ? getGlobal(useCached) : _cachedGlobal.v;\n        if (gbl && gbl[name]) {\n            return gbl[name];\n        }\n        if (name === WINDOW && _cachedWindow) {\n            return _cachedWindow.v;\n        }\n        return NULL_VALUE;\n    };\n    var hasDocument = function () { return !!getDocument(); };\n    var getDocument = function () {\n        (!_cachedDocument || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedDocument.b)) && (_cachedDocument = lazySafeGetInst(\"document\"));\n        return _cachedDocument.v;\n    };\n    var hasWindow = function () { return !!getWindow(); };\n    var getWindow = function () {\n        (!_cachedWindow || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedWindow.b)) && (_cachedWindow = lazySafeGetInst(WINDOW));\n        return _cachedWindow.v;\n    };\n    var hasNavigator = function () { return !!getNavigator(); };\n    var getNavigator = function () {\n        (!_cachedNavigator || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedNavigator.b)) && (_cachedNavigator = lazySafeGetInst(\"navigator\"));\n        return _cachedNavigator.v;\n    };\n    var hasHistory = function () { return !!getHistory(); };\n    var getHistory = function () {\n        (!_cachedHistory || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_cachedHistory.b)) && (_cachedHistory = lazySafeGetInst(\"history\"));\n        return _cachedHistory.v;\n    };\n    var isNode = function () {\n        !_isNode && (_isNode = safeGetLazy(function () { return !!(process && (process.versions || {}).node); }, false));\n        return _isNode.v;\n    };\n    var isWebWorker = function () {\n        !_isWebWorker && (_isWebWorker = safeGetLazy(function () { return !!(self && self instanceof WorkerGlobalScope); }, false));\n        return _isWebWorker.v;\n    };\n\n    var _symbol;\n    var _symbolFor;\n    var _symbolKeyFor;\n    function _getSymbolValue(name) {\n        return safeGetLazy(function () {\n            return (_symbol.v ? _symbol[name] : UNDEF_VALUE);\n        }, UNDEF_VALUE);\n    }\n    function hasSymbol() {\n        return !!getSymbol();\n    }\n    function getSymbol() {\n        var resetCache = !_symbol || (_globalLazyTestHooks && _globalLazyTestHooks.lzy && !_symbol.b);\n        resetCache && (_symbol = lazySafeGetInst(SYMBOL));\n        (!_symbolFor || resetCache) && (_symbolFor = _getSymbolValue(\"for\"));\n        (!_symbolKeyFor || resetCache) && (_symbolKeyFor = _getSymbolValue(\"keyFor\"));\n        return _symbol.v;\n    }\n    function getKnownSymbol(name, noPoly) {\n        var knownName = _wellKnownSymbolMap[name];\n        (!_symbol || (_globalLazyTestHooks.lzy && !_symbol.b)) && getSymbol();\n        return _symbol.v ? _symbol.v[knownName || name] : (!noPoly ? polyGetKnownSymbol(name) : UNDEF_VALUE);\n    }\n    function newSymbol(description, noPoly) {\n        (!_symbol || (_globalLazyTestHooks.lzy && !_symbol.b)) && getSymbol();\n        return _symbol.v ? _symbol.v(description) : (!noPoly ? polyNewSymbol(description) : NULL_VALUE);\n    }\n    function symbolFor(key) {\n        (!_symbolFor || (_globalLazyTestHooks.lzy && !_symbol.b)) && getSymbol();\n        return (_symbolFor.v || polySymbolFor)(key);\n    }\n\n    function isIterator(value) {\n        return !!value && isFunction(value.next);\n    }\n    function isIterable(value) {\n        return !isStrictNullOrUndefined(value) && isFunction(value[getKnownSymbol(3 )]);\n    }\n\n    var _iterSymbol;\n    function iterForOf(iter, callbackfn, thisArg) {\n        if (iter) {\n            if (!isIterator(iter)) {\n                !_iterSymbol && (_iterSymbol = getLazy(function () { return getKnownSymbol(3 ); }));\n                iter = iter[_iterSymbol.v] ? iter[_iterSymbol.v]() : null;\n            }\n            if (isIterator(iter)) {\n                var err = void 0;\n                var iterResult = void 0;\n                try {\n                    var count = 0;\n                    while (!(iterResult = iter.next())[DONE]) {\n                        if (callbackfn.call(thisArg || iter, iterResult[VALUE], count, iter) === -1) {\n                            break;\n                        }\n                        count++;\n                    }\n                }\n                catch (failed) {\n                    err = { e: failed };\n                    if (iter.throw) {\n                        iterResult = null;\n                        iter.throw(err);\n                    }\n                }\n                finally {\n                    try {\n                        if (iterResult && !iterResult[DONE]) {\n                            iter.return && iter.return(iterResult);\n                        }\n                    }\n                    finally {\n                        if (err) {\n                            throw err.e;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    var fnApply = _unwrapInstFunction(\"apply\");\n\n    function arrAppend(target, elms) {\n        if (!isUndefined(elms) && target) {\n            if (isArray(elms)) {\n                fnApply(target.push, target, elms);\n            }\n            else if (isIterator(elms) || isIterable(elms)) {\n                iterForOf(elms, function (elm) {\n                    target.push(elm);\n                });\n            }\n            else {\n                target.push(elms);\n            }\n        }\n        return target;\n    }\n\n    function arrForEach(theArray, callbackfn, thisArg) {\n        if (theArray) {\n            var len = theArray[LENGTH] >>> 0;\n            for (var idx = 0; idx < len; idx++) {\n                if (idx in theArray) {\n                    if (callbackfn.call(thisArg || theArray, theArray[idx], idx, theArray) === -1) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    var arrIndexOf = _unwrapFunction(INDEX_OF, ArrProto);\n\n    var arrMap = _unwrapFunction(\"map\", ArrProto);\n\n    var arrSlice = _unwrapFunction(SLICE, ArrProto);\n\n    var fnCall = _unwrapInstFunction(\"call\");\n\n    function polyArrIncludes(theArray, searchElement, fromIndex) {\n        return arrIndexOf(theArray, searchElement, fromIndex) !== -1;\n    }\n\n    var arrIncludes = _unwrapFunctionWithPoly(\"includes\", ArrProto, polyArrIncludes);\n\n    var arrReduce = _unwrapFunction(\"reduce\", ArrProto);\n\n    var _objCreate = ObjClass$1[\"create\"];\n    var objCreate = _objCreate || polyObjCreate;\n    function polyObjCreate(obj) {\n        if (!obj) {\n            return {};\n        }\n        var type = typeof obj;\n        if (type !== OBJECT && type !== FUNCTION) {\n            throw new TypeError(\"Prototype must be an Object or function: \" + dumpObj(obj));\n        }\n        function tempFunc() { }\n        tempFunc[PROTOTYPE] = obj;\n        return new tempFunc();\n    }\n\n    var _isProtoArray;\n    function objSetPrototypeOf(obj, proto) {\n        var fn = ObjClass$1[\"setPrototypeOf\"] ||\n            function (d, b) {\n                !_isProtoArray && (_isProtoArray = getLazy(function () {\n                    var _a;\n                    return ((_a = {}, _a[__PROTO__] = [], _a) instanceof Array);\n                }));\n                _isProtoArray.v ? d[__PROTO__] = b : objForEachKey(b, function (key, value) { return d[key] = value; });\n            };\n        return fn(obj, proto);\n    }\n\n    var _createCustomError = function (name, d, b) {\n        _safeDefineName(d, name);\n        d = objSetPrototypeOf(d, b);\n        function __() {\n            this.constructor = d;\n            _safeDefineName(this, name);\n        }\n        d[PROTOTYPE] = b === NULL_VALUE ? objCreate(b) : (__[PROTOTYPE] = b[PROTOTYPE], new __());\n        return d;\n    };\n    var _safeSetName = function (baseClass, name) {\n        try {\n            name && (baseClass[NAME] = name);\n        }\n        catch (e) {\n        }\n    };\n    var _safeDefineName = function (target, name) {\n        try {\n            objDefine(target, NAME, { v: name, c: true, e: false });\n        }\n        catch (e) {\n        }\n    };\n    function createCustomError(name, constructCb, errorBase) {\n        var theBaseClass = errorBase || Error;\n        var orgName = theBaseClass[PROTOTYPE][NAME];\n        var captureFn = Error.captureStackTrace;\n        return _createCustomError(name, function () {\n            var _this = this;\n            try {\n                _safeSetName(theBaseClass, name);\n                var _self = fnApply(theBaseClass, _this, arrSlice(arguments)) || _this;\n                if (_self !== _this) {\n                    var orgProto = objGetPrototypeOf(_this);\n                    if (orgProto !== objGetPrototypeOf(_self)) {\n                        objSetPrototypeOf(_self, orgProto);\n                    }\n                }\n                captureFn && captureFn(_self, _this[CONSTRUCTOR]);\n                constructCb && constructCb(_self, arguments);\n                return _self;\n            }\n            finally {\n                _safeSetName(theBaseClass, orgName);\n            }\n        }, theBaseClass);\n    }\n    var _unsupportedError;\n    function throwUnsupported(message) {\n        if (!_unsupportedError) {\n            _unsupportedError = createCustomError(\"UnsupportedError\");\n        }\n        throw new _unsupportedError(message);\n    }\n\n    function utcNow() {\n        return (Date.now || polyUtcNow)();\n    }\n    function polyUtcNow() {\n        return new Date().getTime();\n    }\n\n    function _createTrimFn(exp) {\n        return function _doTrim(value) {\n            if (isNullOrUndefined(value)) {\n                throwTypeError(\"strTrim called [\" + dumpObj(value) + \"]\");\n            }\n            if (value && value.replace) {\n                value = value.replace(exp, EMPTY);\n            }\n            return value;\n        };\n    }\n    var polyStrTrim = _createTrimFn(/^\\s+|(?=\\s)\\s+$/g);\n\n    var strTrim = _unwrapFunctionWithPoly(\"trim\", StrProto, polyStrTrim);\n\n    var _fnToString;\n    var _objCtrFnString;\n    var _gblWindow;\n    function isPlainObject(value) {\n        if (!value || typeof value !== OBJECT) {\n            return false;\n        }\n        if (!_gblWindow) {\n            _gblWindow = hasWindow() ? getWindow() : true;\n        }\n        var result = false;\n        if (value !== _gblWindow) {\n            if (!_objCtrFnString) {\n                _fnToString = Function[PROTOTYPE].toString;\n                _objCtrFnString = fnCall(_fnToString, ObjClass$1);\n            }\n            try {\n                var proto = objGetPrototypeOf(value);\n                result = !proto;\n                if (!result) {\n                    if (objHasOwnProperty(proto, CONSTRUCTOR)) {\n                        proto = proto[CONSTRUCTOR];\n                    }\n                    result = proto && typeof proto === FUNCTION && _fnToString.call(proto) === _objCtrFnString;\n                }\n            }\n            catch (ex) {\n            }\n        }\n        return result;\n    }\n\n    var _defaultDeepCopyHandler = function (details) {\n        details.value && plainObjDeepCopyHandler(details);\n        return true;\n    };\n    var defaultDeepCopyHandlers = [\n        arrayDeepCopyHandler,\n        plainObjDeepCopyHandler,\n        functionDeepCopyHandler,\n        dateDeepCopyHandler\n    ];\n    function _getSetVisited(visitMap, source, newPath, cb) {\n        var theEntry;\n        arrForEach(visitMap, function (entry) {\n            if (entry.k === source) {\n                theEntry = entry;\n                return -1;\n            }\n        });\n        if (!theEntry) {\n            theEntry = { k: source, v: source };\n            visitMap.push(theEntry);\n            cb(theEntry);\n        }\n        return theEntry.v;\n    }\n    function _deepCopy(visitMap, value, ctx, key) {\n        var userHandler = ctx.handler;\n        var newPath = ctx.path ? (key ? ctx.path.concat(key) : ctx.path) : [];\n        var newCtx = {\n            handler: ctx.handler,\n            src: ctx.src,\n            path: newPath\n        };\n        var theType = typeof value;\n        var isPlain = false;\n        var isPrim = false;\n        if (value && theType === OBJECT) {\n            isPlain = isPlainObject(value);\n        }\n        else {\n            isPrim = value === NULL_VALUE || isPrimitiveType(theType);\n        }\n        var details = {\n            type: theType,\n            isPrim: isPrim,\n            isPlain: isPlain,\n            value: value,\n            result: value,\n            path: newPath,\n            origin: ctx.src,\n            copy: function (source, newKey) {\n                return _deepCopy(visitMap, source, newKey ? newCtx : ctx, newKey);\n            },\n            copyTo: function (target, source) {\n                return _copyProps(visitMap, target, source, newCtx);\n            }\n        };\n        if (!details.isPrim) {\n            return _getSetVisited(visitMap, value, newPath, function (newEntry) {\n                objDefine(details, \"result\", {\n                    g: function () {\n                        return newEntry.v;\n                    },\n                    s: function (newValue) {\n                        newEntry.v = newValue;\n                    }\n                });\n                var idx = 0;\n                var handler = userHandler;\n                while (!fnCall(handler || (idx < defaultDeepCopyHandlers.length ? defaultDeepCopyHandlers[idx++] : _defaultDeepCopyHandler), ctx, details)) {\n                    handler = NULL_VALUE;\n                }\n            });\n        }\n        if (userHandler && fnCall(userHandler, ctx, details)) {\n            return details.result;\n        }\n        return value;\n    }\n    function _copyProps(visitMap, target, source, ctx) {\n        if (!isNullOrUndefined(source)) {\n            for (var key in source) {\n                target[key] = _deepCopy(visitMap, source[key], ctx, key);\n            }\n        }\n        return target;\n    }\n    function objCopyProps(target, source, handler) {\n        var ctx = {\n            handler: handler,\n            src: source,\n            path: []\n        };\n        return _copyProps([], target, source, ctx);\n    }\n    function objDeepCopy(source, handler) {\n        var ctx = {\n            handler: handler,\n            src: source\n        };\n        return _deepCopy([], source, ctx);\n    }\n    function arrayDeepCopyHandler(details) {\n        var value = details.value;\n        if (isArray(value)) {\n            var target = details.result = [];\n            target.length = value.length;\n            details.copyTo(target, value);\n            return true;\n        }\n        return false;\n    }\n    function dateDeepCopyHandler(details) {\n        var value = details.value;\n        if (isDate(value)) {\n            details.result = new Date(value.getTime());\n            return true;\n        }\n        return false;\n    }\n    function functionDeepCopyHandler(details) {\n        if (details.type === FUNCTION) {\n            return true;\n        }\n        return false;\n    }\n    function plainObjDeepCopyHandler(details) {\n        var value = details.value;\n        if (value && details.isPlain) {\n            var target = details.result = {};\n            details.copyTo(target, value);\n            return true;\n        }\n        return false;\n    }\n\n    function _doExtend(target, theArgs) {\n        arrForEach(theArgs, function (theArg) {\n            objCopyProps(target, theArg);\n        });\n        return target;\n    }\n    function deepExtend(target, obj1, obj2, obj3, obj4, obj5, obj6) {\n        return _doExtend(objDeepCopy(target) || {}, arrSlice(arguments));\n    }\n\n    var getLength = _unwrapProp(LENGTH);\n\n    var _perf;\n    function getPerformance() {\n        (!_perf || (!_perf.b && _globalLazyTestHooks && _globalLazyTestHooks.lzy)) && (_perf = lazySafeGetInst(\"performance\"));\n        return _perf.v;\n    }\n\n    var strEndsWith = _unwrapFunctionWithPoly(\"endsWith\", StrProto, polyStrEndsWith);\n    function polyStrEndsWith(value, searchString, length) {\n        if (!isString(value)) {\n            throwTypeError(\"'\" + dumpObj(value) + \"' is not a string\");\n        }\n        var searchValue = isString(searchString) ? searchString : asString(searchString);\n        var chkLen = searchValue[LENGTH];\n        var len = value[LENGTH];\n        var end = !isUndefined(length) && length < len ? length : len;\n        return strSubstring(value, end - chkLen, end) === searchValue;\n    }\n\n    var strIndexOf = _unwrapFunction(INDEX_OF, StrProto);\n\n    var REF = \"ref\";\n    var UNREF = \"un\" + REF;\n    var HAS_REF = \"hasRef\";\n    var ENABLED = \"enabled\";\n    function _createTimerHandler(startTimer, refreshFn, cancelFn) {\n        var _a;\n        var ref = true;\n        var timerId = startTimer ? refreshFn(NULL_VALUE) : NULL_VALUE;\n        var theTimerHandler;\n        var _unref = function () {\n            ref = false;\n            timerId && timerId[UNREF] && timerId[UNREF]();\n            return theTimerHandler;\n        };\n        var _ref = function () {\n            ref = true;\n            timerId && timerId[REF] && timerId[REF]();\n            return theTimerHandler;\n        };\n        var _hasRef = function () {\n            if (timerId && timerId[HAS_REF]) {\n                return timerId[HAS_REF]();\n            }\n            return ref;\n        };\n        var _refresh = function () {\n            timerId = refreshFn(timerId);\n            if (!ref) {\n                _unref();\n            }\n            return theTimerHandler;\n        };\n        var _cancel = function () {\n            timerId && cancelFn(timerId);\n            timerId = NULL_VALUE;\n        };\n        var _setEnabled = function (value) {\n            !value && timerId && _cancel();\n            value && !timerId && _refresh();\n        };\n        theTimerHandler = (_a = {\n                cancel: _cancel,\n                refresh: _refresh\n            },\n            _a[HAS_REF] = _hasRef,\n            _a[REF] = _ref,\n            _a[UNREF] = _unref,\n            _a[ENABLED] = false,\n            _a);\n        objDefineProp(theTimerHandler, ENABLED, {\n            get: function () { return !!timerId; },\n            set: _setEnabled\n        });\n        return {\n            h: theTimerHandler,\n            dn: function () {\n                timerId = NULL_VALUE;\n            }\n        };\n    }\n\n    function _createTimeoutWith(self, startTimer, overrideFn, theArgs) {\n        var isArr = isArray(overrideFn);\n        var len = isArr ? overrideFn.length : 0;\n        var setFn = (len > 0 ? overrideFn[0] : (!isArr ? overrideFn : UNDEF_VALUE)) || setTimeout;\n        var clearFn = (len > 1 ? overrideFn[1] : UNDEF_VALUE) || clearTimeout;\n        var timerFn = theArgs[0];\n        theArgs[0] = function () {\n            handler.dn();\n            fnApply(timerFn, self, arrSlice(arguments));\n        };\n        var handler = _createTimerHandler(startTimer, function (timerId) {\n            if (timerId) {\n                if (timerId.refresh) {\n                    timerId.refresh();\n                    return timerId;\n                }\n                fnApply(clearFn, self, [timerId]);\n            }\n            return fnApply(setFn, self, theArgs);\n        }, function (timerId) {\n            fnApply(clearFn, self, [timerId]);\n        });\n        return handler.h;\n    }\n    function scheduleTimeout(callback, timeout) {\n        return _createTimeoutWith(this, true, UNDEF_VALUE, arrSlice(arguments));\n    }\n    function createTimeout(callback, timeout) {\n        return _createTimeoutWith(this, false, UNDEF_VALUE, arrSlice(arguments));\n    }\n\n    var _a$9;\n    var Constructor = 'constructor';\n    var Prototype = 'prototype';\n    var strFunction = 'function';\n    var DynInstFuncTable = '_dynInstFuncs';\n    var DynProxyTag = '_isDynProxy';\n    var DynClassName = '_dynClass';\n    var DynClassNamePrefix = '_dynCls$';\n    var DynInstChkTag = '_dynInstChk';\n    var DynAllowInstChkTag = DynInstChkTag;\n    var DynProtoDefaultOptions = '_dfOpts';\n    var UnknownValue = '_unknown_';\n    var str__Proto = \"__proto__\";\n    var DynProtoBaseProto = \"_dyn\" + str__Proto;\n    var DynProtoGlobalSettings = \"__dynProto$Gbl\";\n    var DynProtoCurrent = \"_dynInstProto\";\n    var strUseBaseInst = 'useBaseInst';\n    var strSetInstFuncs = 'setInstFuncs';\n    var Obj = Object;\n    var _objGetPrototypeOf = Obj[\"getPrototypeOf\"];\n    var _objGetOwnProps = Obj[\"getOwnPropertyNames\"];\n    var _gbl = getGlobal();\n    var _gblInst = _gbl[DynProtoGlobalSettings] || (_gbl[DynProtoGlobalSettings] = {\n        o: (_a$9 = {},\n            _a$9[strSetInstFuncs] = true,\n            _a$9[strUseBaseInst] = true,\n            _a$9),\n        n: 1000\n    });\n    function _isObjectOrArrayPrototype(target) {\n        return target && (target === Obj[Prototype] || target === Array[Prototype]);\n    }\n    function _isObjectArrayOrFunctionPrototype(target) {\n        return _isObjectOrArrayPrototype(target) || target === Function[Prototype];\n    }\n    function _getObjProto$1(target) {\n        var newProto;\n        if (target) {\n            if (_objGetPrototypeOf) {\n                return _objGetPrototypeOf(target);\n            }\n            var curProto = target[str__Proto] || target[Prototype] || (target[Constructor] ? target[Constructor][Prototype] : null);\n            newProto = target[DynProtoBaseProto] || curProto;\n            if (!objHasOwnProperty(target, DynProtoBaseProto)) {\n                delete target[DynProtoCurrent];\n                newProto = target[DynProtoBaseProto] = target[DynProtoCurrent] || target[DynProtoBaseProto];\n                target[DynProtoCurrent] = curProto;\n            }\n        }\n        return newProto;\n    }\n    function _forEachProp(target, func) {\n        var props = [];\n        if (_objGetOwnProps) {\n            props = _objGetOwnProps(target);\n        }\n        else {\n            for (var name_1 in target) {\n                if (typeof name_1 === \"string\" && objHasOwnProperty(target, name_1)) {\n                    props.push(name_1);\n                }\n            }\n        }\n        if (props && props.length > 0) {\n            for (var lp = 0; lp < props.length; lp++) {\n                func(props[lp]);\n            }\n        }\n    }\n    function _isDynamicCandidate(target, funcName, skipOwn) {\n        return (funcName !== Constructor && typeof target[funcName] === strFunction && (skipOwn || objHasOwnProperty(target, funcName)));\n    }\n    function _throwTypeError(message) {\n        throwTypeError(\"DynamicProto: \" + message);\n    }\n    function _getInstanceFuncs(thisTarget) {\n        var instFuncs = {};\n        _forEachProp(thisTarget, function (name) {\n            if (!instFuncs[name] && _isDynamicCandidate(thisTarget, name, false)) {\n                instFuncs[name] = thisTarget[name];\n            }\n        });\n        return instFuncs;\n    }\n    function _hasVisited(values, value) {\n        for (var lp = values.length - 1; lp >= 0; lp--) {\n            if (values[lp] === value) {\n                return true;\n            }\n        }\n        return false;\n    }\n    function _getBaseFuncs(classProto, thisTarget, instFuncs, useBaseInst) {\n        function _instFuncProxy(target, funcHost, funcName) {\n            var theFunc = funcHost[funcName];\n            if (theFunc[DynProxyTag] && useBaseInst) {\n                var instFuncTable = target[DynInstFuncTable] || {};\n                if (instFuncTable[DynAllowInstChkTag] !== false) {\n                    theFunc = (instFuncTable[funcHost[DynClassName]] || {})[funcName] || theFunc;\n                }\n            }\n            return function () {\n                return theFunc.apply(target, arguments);\n            };\n        }\n        var baseFuncs = {};\n        _forEachProp(instFuncs, function (name) {\n            baseFuncs[name] = _instFuncProxy(thisTarget, instFuncs, name);\n        });\n        var baseProto = _getObjProto$1(classProto);\n        var visited = [];\n        while (baseProto && !_isObjectArrayOrFunctionPrototype(baseProto) && !_hasVisited(visited, baseProto)) {\n            _forEachProp(baseProto, function (name) {\n                if (!baseFuncs[name] && _isDynamicCandidate(baseProto, name, !_objGetPrototypeOf)) {\n                    baseFuncs[name] = _instFuncProxy(thisTarget, baseProto, name);\n                }\n            });\n            visited.push(baseProto);\n            baseProto = _getObjProto$1(baseProto);\n        }\n        return baseFuncs;\n    }\n    function _getInstFunc(target, funcName, proto, currentDynProtoProxy) {\n        var instFunc = null;\n        if (target && objHasOwnProperty(proto, DynClassName)) {\n            var instFuncTable = target[DynInstFuncTable] || {};\n            instFunc = (instFuncTable[proto[DynClassName]] || {})[funcName];\n            if (!instFunc) {\n                _throwTypeError(\"Missing [\" + funcName + \"] \" + strFunction);\n            }\n            if (!instFunc[DynInstChkTag] && instFuncTable[DynAllowInstChkTag] !== false) {\n                var canAddInst = !objHasOwnProperty(target, funcName);\n                var objProto = _getObjProto$1(target);\n                var visited = [];\n                while (canAddInst && objProto && !_isObjectArrayOrFunctionPrototype(objProto) && !_hasVisited(visited, objProto)) {\n                    var protoFunc = objProto[funcName];\n                    if (protoFunc) {\n                        canAddInst = (protoFunc === currentDynProtoProxy);\n                        break;\n                    }\n                    visited.push(objProto);\n                    objProto = _getObjProto$1(objProto);\n                }\n                try {\n                    if (canAddInst) {\n                        target[funcName] = instFunc;\n                    }\n                    instFunc[DynInstChkTag] = 1;\n                }\n                catch (e) {\n                    instFuncTable[DynAllowInstChkTag] = false;\n                }\n            }\n        }\n        return instFunc;\n    }\n    function _getProtoFunc(funcName, proto, currentDynProtoProxy) {\n        var protoFunc = proto[funcName];\n        if (protoFunc === currentDynProtoProxy) {\n            protoFunc = _getObjProto$1(proto)[funcName];\n        }\n        if (typeof protoFunc !== strFunction) {\n            _throwTypeError(\"[\" + funcName + \"] is not a \" + strFunction);\n        }\n        return protoFunc;\n    }\n    function _populatePrototype(proto, className, target, baseInstFuncs, setInstanceFunc) {\n        function _createDynamicPrototype(proto, funcName) {\n            var dynProtoProxy = function () {\n                var instFunc = _getInstFunc(this, funcName, proto, dynProtoProxy) || _getProtoFunc(funcName, proto, dynProtoProxy);\n                return instFunc.apply(this, arguments);\n            };\n            dynProtoProxy[DynProxyTag] = 1;\n            return dynProtoProxy;\n        }\n        if (!_isObjectOrArrayPrototype(proto)) {\n            var instFuncTable = target[DynInstFuncTable] = target[DynInstFuncTable] || {};\n            var instFuncs_1 = instFuncTable[className] = (instFuncTable[className] || {});\n            if (instFuncTable[DynAllowInstChkTag] !== false) {\n                instFuncTable[DynAllowInstChkTag] = !!setInstanceFunc;\n            }\n            _forEachProp(target, function (name) {\n                if (_isDynamicCandidate(target, name, false) && target[name] !== baseInstFuncs[name]) {\n                    instFuncs_1[name] = target[name];\n                    delete target[name];\n                    if (!objHasOwnProperty(proto, name) || (proto[name] && !proto[name][DynProxyTag])) {\n                        proto[name] = _createDynamicPrototype(proto, name);\n                    }\n                }\n            });\n        }\n    }\n    function _checkPrototype(classProto, thisTarget) {\n        if (_objGetPrototypeOf) {\n            var visited = [];\n            var thisProto = _getObjProto$1(thisTarget);\n            while (thisProto && !_isObjectArrayOrFunctionPrototype(thisProto) && !_hasVisited(visited, thisProto)) {\n                if (thisProto === classProto) {\n                    return true;\n                }\n                visited.push(thisProto);\n                thisProto = _getObjProto$1(thisProto);\n            }\n            return false;\n        }\n        return true;\n    }\n    function _getObjName(target, unknownValue) {\n        if (objHasOwnProperty(target, Prototype)) {\n            return target.name || unknownValue || UnknownValue;\n        }\n        return (((target || {})[Constructor]) || {}).name || unknownValue || UnknownValue;\n    }\n    function dynamicProto(theClass, target, delegateFunc, options) {\n        if (!objHasOwnProperty(theClass, Prototype)) {\n            _throwTypeError(\"theClass is an invalid class definition.\");\n        }\n        var classProto = theClass[Prototype];\n        if (!_checkPrototype(classProto, target)) {\n            _throwTypeError(\"[\" + _getObjName(theClass) + \"] not in hierarchy of [\" + _getObjName(target) + \"]\");\n        }\n        var className = null;\n        if (objHasOwnProperty(classProto, DynClassName)) {\n            className = classProto[DynClassName];\n        }\n        else {\n            className = DynClassNamePrefix + _getObjName(theClass, \"_\") + \"$\" + _gblInst.n;\n            _gblInst.n++;\n            classProto[DynClassName] = className;\n        }\n        var perfOptions = dynamicProto[DynProtoDefaultOptions];\n        var useBaseInst = !!perfOptions[strUseBaseInst];\n        if (useBaseInst && options && options[strUseBaseInst] !== undefined) {\n            useBaseInst = !!options[strUseBaseInst];\n        }\n        var instFuncs = _getInstanceFuncs(target);\n        var baseFuncs = _getBaseFuncs(classProto, target, instFuncs, useBaseInst);\n        delegateFunc(target, baseFuncs);\n        var setInstanceFunc = !!_objGetPrototypeOf && !!perfOptions[strSetInstFuncs];\n        if (setInstanceFunc && options) {\n            setInstanceFunc = !!options[strSetInstFuncs];\n        }\n        _populatePrototype(classProto, className, target, instFuncs, setInstanceFunc !== false);\n    }\n    dynamicProto[DynProtoDefaultOptions] = _gblInst.o;\n\n    var strShimFunction = \"function\";\n    var strShimObject = \"object\";\n    var strShimUndefined = \"undefined\";\n    var strShimPrototype = \"prototype\";\n    var ObjClass = Object;\n    var ObjProto = ObjClass[strShimPrototype];\n\n    (getGlobal() || {})[\"Symbol\"];\n    (getGlobal() || {})[\"Reflect\"];\n    var strHasOwnProperty = \"hasOwnProperty\";\n    var __objAssignFnImpl = function (t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) {\n                if (ObjProto[strHasOwnProperty].call(s, p)) {\n                    t[p] = s[p];\n                }\n            }\n        }\n        return t;\n    };\n    var __assignFn = objAssign || __objAssignFnImpl;\n    var extendStaticsFn = function (d, b) {\n        extendStaticsFn = ObjClass[\"setPrototypeOf\"] ||\n            ({ __proto__: [] } instanceof Array && function (d, b) {\n                d.__proto__ = b;\n            }) ||\n            function (d, b) {\n                for (var p in b) {\n                    if (b[strHasOwnProperty](p)) {\n                        d[p] = b[p];\n                    }\n                }\n            };\n        return extendStaticsFn(d, b);\n    };\n    function __extendsFn(d, b) {\n        if (typeof b !== strShimFunction && b !== null) {\n            throwTypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        }\n        extendStaticsFn(d, b);\n        function __() {\n            this.constructor = d;\n        }\n        d[strShimPrototype] = b === null ? objCreate(b) : (__[strShimPrototype] = b[strShimPrototype], new __());\n    }\n    function __spreadArrayFn(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) {\n            to[j] = from[i];\n        }\n        return to;\n    }\n\n    var createEnumStyle = createEnum;\n    var createValueMap = createTypeMap;\n\n    var _DYN_TO_LOWER_CASE$2 = \"toLowerCase\";\n    var _DYN_BLK_VAL = \"blkVal\";\n    var _DYN_LENGTH$5 = \"length\";\n    var _DYN_RD_ONLY = \"rdOnly\";\n    var _DYN_NOTIFY = \"notify\";\n    var _DYN_WARN_TO_CONSOLE = \"warnToConsole\";\n    var _DYN_THROW_INTERNAL = \"throwInternal\";\n    var _DYN_SET_DF = \"setDf\";\n    var _DYN_WATCH = \"watch\";\n    var _DYN_LOGGER = \"logger\";\n    var _DYN_APPLY = \"apply\";\n    var _DYN_PUSH$1 = \"push\";\n    var _DYN_SPLICE = \"splice\";\n    var _DYN_HDLR = \"hdlr\";\n    var _DYN_CANCEL = \"cancel\";\n    var _DYN_INITIALIZE = \"initialize\";\n    var _DYN_IDENTIFIER = \"identifier\";\n    var _DYN_IS_INITIALIZED = \"isInitialized\";\n    var _DYN_GET_PLUGIN = \"getPlugin\";\n    var _DYN_POLL_INTERNAL_LOGS = \"pollInternalLogs\";\n    var _DYN_NAME$3 = \"name\";\n    var _DYN_TIME = \"time\";\n    var _DYN_PROCESS_NEXT = \"processNext\";\n    var _DYN_GET_PROCESS_TEL_CONT0 = \"getProcessTelContext\";\n    var _DYN_GET_NOTIFY_MGR = \"getNotifyMgr\";\n    var _DYN_ADD_NOTIFICATION_LIS1 = \"addNotificationListener\";\n    var _DYN_REMOVE_NOTIFICATION_2 = \"removeNotificationListener\";\n    var _DYN_ENABLED = \"enabled\";\n    var _DYN_STOP_POLLING_INTERNA3 = \"stopPollingInternalLogs\";\n    var _DYN_UNLOAD = \"unload\";\n    var _DYN_ON_COMPLETE = \"onComplete\";\n    var _DYN_VERSION$1 = \"version\";\n    var _DYN_LOGGING_LEVEL_CONSOL4 = \"loggingLevelConsole\";\n    var _DYN_CREATE_NEW$1 = \"createNew\";\n    var _DYN_TEARDOWN = \"teardown\";\n    var _DYN_MESSAGE_ID = \"messageId\";\n    var _DYN_MESSAGE$2 = \"message\";\n    var _DYN_IS_ASYNC = \"isAsync\";\n    var _DYN_DIAG_LOG$2 = \"diagLog\";\n    var _DYN__DO_TEARDOWN = \"_doTeardown\";\n    var _DYN_UPDATE$1 = \"update\";\n    var _DYN_GET_NEXT = \"getNext\";\n    var _DYN_SET_NEXT_PLUGIN = \"setNextPlugin\";\n    var _DYN_USER_AGENT = \"userAgent\";\n    var _DYN_SPLIT$1 = \"split\";\n    var _DYN_NODE_TYPE = \"nodeType\";\n    var _DYN_REPLACE = \"replace\";\n    var _DYN_LOG_INTERNAL_MESSAGE = \"logInternalMessage\";\n    var _DYN_TYPE = \"type\";\n    var _DYN_HANDLER = \"handler\";\n    var _DYN_IS_CHILD_EVT = \"isChildEvt\";\n    var _DYN_GET_CTX = \"getCtx\";\n    var _DYN_SET_CTX = \"setCtx\";\n    var _DYN_COMPLETE = \"complete\";\n    var _DYN_TRACE_ID$2 = \"traceId\";\n    var _DYN_SPAN_ID$1 = \"spanId\";\n    var _DYN_TRACE_FLAGS$1 = \"traceFlags\";\n\n    var aggregationErrorType;\n    function throwAggregationError(message, sourceErrors) {\n        if (!aggregationErrorType) {\n            aggregationErrorType = createCustomError(\"AggregationError\", function (self, args) {\n                if (args[_DYN_LENGTH$5 ] > 1) {\n                    self.errors = args[1];\n                }\n            });\n        }\n        var theMessage = message || \"One or more errors occurred.\";\n        arrForEach(sourceErrors, function (srcError, idx) {\n            theMessage += \"\\n\".concat(idx, \" > \").concat(dumpObj(srcError));\n        });\n        throw new aggregationErrorType(theMessage, sourceErrors || []);\n    }\n\n    function doAwaitResponse(value, cb) {\n        return doAwait(value, function (value) {\n            cb && cb({\n                value: value,\n                rejected: false\n            });\n        }, function (reason) {\n            cb && cb({\n                rejected: true,\n                reason: reason\n            });\n        });\n    }\n    function doAwait(value, resolveFn, rejectFn, finallyFn) {\n        var result = value;\n        if (isPromiseLike(value)) {\n            if (resolveFn || rejectFn) {\n                result = value.then(resolveFn, rejectFn);\n            }\n        }\n        else {\n            resolveFn && resolveFn(value);\n        }\n        if (finallyFn) {\n            result = doFinally(result, finallyFn);\n        }\n        return result;\n    }\n    function doFinally(value, finallyFn) {\n        var result = value;\n        if (finallyFn) {\n            if (isPromiseLike(value)) {\n                if (value.finally) {\n                    result = value.finally(finallyFn);\n                }\n                else {\n                    result = value.then(function (value) {\n                        finallyFn();\n                        return value;\n                    }, function (reason) {\n                        finallyFn();\n                        throw reason;\n                    });\n                }\n            }\n            else {\n                finallyFn();\n            }\n        }\n        return result;\n    }\n\n    var STRING_STATES = [\n        \"pending\", \"resolving\", \"resolved\", \"rejected\"\n    ];\n\n    var DISPATCH_EVENT = \"dispatchEvent\";\n    var _hasInitEvent;\n    function emitEvent(target, evtName, populateEvent, useNewEvent) {\n        var doc = getDocument();\n        !_hasInitEvent && (_hasInitEvent = safeGetLazy(function () {\n            var evt;\n            if (doc && doc.createEvent) {\n                evt = doc.createEvent(\"Event\");\n            }\n            return (!!evt && evt.initEvent);\n        }, null));\n        var theEvt = _hasInitEvent.v ? doc.createEvent(\"Event\") : (useNewEvent ? new Event(evtName) : {});\n        populateEvent && populateEvent(theEvt);\n        if (_hasInitEvent.v) {\n            theEvt.initEvent(evtName, false, true);\n        }\n        if (theEvt && target[DISPATCH_EVENT]) {\n            target[DISPATCH_EVENT](theEvt);\n        }\n        else {\n            var handler = target[\"on\" + evtName];\n            if (handler) {\n                handler(theEvt);\n            }\n            else {\n                var theConsole = getInst(\"console\");\n                theConsole && (theConsole[\"error\"] || theConsole[\"log\"])(evtName, dumpObj(theEvt));\n            }\n        }\n    }\n\n    var STR_PROMISE = \"Promise\";\n\n    var NODE_UNHANDLED_REJECTION = \"unhandledRejection\";\n    var UNHANDLED_REJECTION = NODE_UNHANDLED_REJECTION.toLowerCase();\n    var _unhandledRejectionTimeout = 10;\n    var _hasPromiseRejectionEvent;\n    function dumpFnObj(value) {\n        if (isFunction(value)) {\n            return value.toString();\n        }\n        return dumpObj(value);\n    }\n    function _createPromise(newPromise, processor, executor) {\n        var additionalArgs = arrSlice(arguments, 3);\n        var _state = 0 ;\n        var _hasResolved = false;\n        var _settledValue;\n        var _queue = [];\n        var _handled = false;\n        var _unHandledRejectionHandler = null;\n        var _thePromise;\n        !_hasPromiseRejectionEvent && (_hasPromiseRejectionEvent = lazySafeGetInst(STR_PROMISE + \"RejectionEvent\"));\n        var _then = function (onResolved, onRejected) {\n            try {\n                _handled = true;\n                _unHandledRejectionHandler && _unHandledRejectionHandler.cancel();\n                _unHandledRejectionHandler = null;\n                var thenPromise = newPromise(function (resolve, reject) {\n                    _queue.push(function () {\n                        try {\n                            var handler = _state === 2  ? onResolved : onRejected;\n                            var value = isUndefined(handler) ? _settledValue : (isFunction(handler) ? handler(_settledValue) : handler);\n                            if (isPromiseLike(value)) {\n                                value.then(resolve, reject);\n                            }\n                            else if (handler) {\n                                resolve(value);\n                            }\n                            else if (_state === 3 ) {\n                                reject(value);\n                            }\n                            else {\n                                resolve(value);\n                            }\n                        }\n                        catch (e) {\n                            reject(e);\n                        }\n                    });\n                    if (_hasResolved) {\n                        _processQueue();\n                    }\n                }, additionalArgs);\n                return thenPromise;\n            }\n            finally {\n            }\n        };\n        var _catch = function (onRejected) {\n            return _then(undefined, onRejected);\n        };\n        var _finally = function (onFinally) {\n            var thenFinally = onFinally;\n            var catchFinally = onFinally;\n            if (isFunction(onFinally)) {\n                thenFinally = function (value) {\n                    onFinally && onFinally();\n                    return value;\n                };\n                catchFinally = function (reason) {\n                    onFinally && onFinally();\n                    throw reason;\n                };\n            }\n            return _then(thenFinally, catchFinally);\n        };\n        var _strState = function () {\n            return STRING_STATES[_state];\n        };\n        var _processQueue = function () {\n            if (_queue.length > 0) {\n                var pending = _queue.slice();\n                _queue = [];\n                _handled = true;\n                processor(pending);\n                _unHandledRejectionHandler && _unHandledRejectionHandler.cancel();\n                _unHandledRejectionHandler = null;\n            }\n        };\n        var _createSettleIfFn = function (newState, allowState) {\n            return function (theValue) {\n                if (_state === allowState) {\n                    if (newState === 2  && isPromiseLike(theValue)) {\n                        _state = 1 ;\n                        theValue.then(_createSettleIfFn(2 , 1 ), _createSettleIfFn(3 , 1 ));\n                        return;\n                    }\n                    _state = newState;\n                    _hasResolved = true;\n                    _settledValue = theValue;\n                    _processQueue();\n                    if (!_handled && newState === 3  && !_unHandledRejectionHandler) {\n                        _unHandledRejectionHandler = scheduleTimeout(_notifyUnhandledRejection, _unhandledRejectionTimeout);\n                    }\n                }\n            };\n        };\n        var _notifyUnhandledRejection = function () {\n            if (!_handled) {\n                if (isNode()) {\n                    process.emit(NODE_UNHANDLED_REJECTION, _settledValue, _thePromise);\n                }\n                else {\n                    var gbl = getWindow() || getGlobal();\n                    emitEvent(gbl, UNHANDLED_REJECTION, function (theEvt) {\n                        objDefine(theEvt, \"promise\", { g: function () { return _thePromise; } });\n                        theEvt.reason = _settledValue;\n                        return theEvt;\n                    }, !!_hasPromiseRejectionEvent.v);\n                }\n            }\n        };\n        _thePromise = {\n            then: _then,\n            \"catch\": _catch,\n            finally: _finally\n        };\n        objDefineProp(_thePromise, \"state\", {\n            get: _strState\n        });\n        if (hasSymbol()) {\n            _thePromise[getKnownSymbol(11 )] = \"IPromise\";\n        }\n        var _toString = function () {\n            return \"IPromise\" + (\"\") + \" \" + _strState() + (_hasResolved ? (\" - \" + dumpFnObj(_settledValue)) : \"\");\n        };\n        _thePromise.toString = _toString;\n        (function _initialize() {\n            if (!isFunction(executor)) {\n                throwTypeError(STR_PROMISE + \": executor is not a function - \" + dumpFnObj(executor));\n            }\n            var _rejectFn = _createSettleIfFn(3 , 0 );\n            try {\n                executor.call(_thePromise, _createSettleIfFn(2 , 0 ), _rejectFn);\n            }\n            catch (e) {\n                _rejectFn(e);\n            }\n        })();\n        return _thePromise;\n    }\n    function _createAllPromise(newPromise) {\n        return function (input) {\n            var additionalArgs = arrSlice(arguments, 1);\n            return newPromise(function (resolve, reject) {\n                try {\n                    var values_1 = [];\n                    var pending_1 = 1;\n                    arrForEach(input, function (item, idx) {\n                        if (item) {\n                            pending_1++;\n                            doAwait(item, function (value) {\n                                values_1[idx] = value;\n                                if (--pending_1 === 0) {\n                                    resolve(values_1);\n                                }\n                            }, reject);\n                        }\n                    });\n                    pending_1--;\n                    if (pending_1 === 0) {\n                        resolve(values_1);\n                    }\n                }\n                catch (e) {\n                    reject(e);\n                }\n            }, additionalArgs);\n        };\n    }\n\n    var _processPendingItems = function (pending) {\n        arrForEach(pending, function (fn) {\n            try {\n                fn();\n            }\n            catch (e) {\n            }\n        });\n    };\n    function timeoutItemProcessor(timeout) {\n        var callbackTimeout = isNumber(timeout) ? timeout : 0;\n        return function (pending) {\n            scheduleTimeout(function () {\n                _processPendingItems(pending);\n            }, callbackTimeout);\n        };\n    }\n\n    function createAsyncPromise(executor, timeout) {\n        return _createPromise(createAsyncPromise, timeoutItemProcessor(timeout), executor, timeout);\n    }\n\n    var _isPromiseSupported;\n    function createNativePromise(executor, timeout) {\n        !_isPromiseSupported && (_isPromiseSupported = lazySafeGetInst(STR_PROMISE));\n        var PrmCls = _isPromiseSupported.v;\n        if (!PrmCls) {\n            return createAsyncPromise(executor);\n        }\n        if (!isFunction(executor)) {\n            throwTypeError(STR_PROMISE + \": executor is not a function - \" + dumpObj(executor));\n        }\n        var _state = 0 ;\n        function _strState() {\n            return STRING_STATES[_state];\n        }\n        var thePromise = new PrmCls(function (resolve, reject) {\n            function _resolve(value) {\n                _state = 2 ;\n                resolve(value);\n            }\n            function _reject(reason) {\n                _state = 3 ;\n                reject(reason);\n            }\n            executor(_resolve, _reject);\n        });\n        objDefineProp(thePromise, \"state\", {\n            get: _strState\n        });\n        return thePromise;\n    }\n\n    var _promiseCreator;\n    function createPromise(executor, timeout) {\n        !_promiseCreator && (_promiseCreator = getLazy(function () { return createNativePromise; }));\n        return _promiseCreator.v.call(this, executor, timeout);\n    }\n    var createAllPromise = _createAllPromise(createPromise);\n\n    var UNDEFINED_VALUE$2 = undefined;\n    var STR_EMPTY = \"\";\n    var STR_CHANNELS = \"channels\";\n    var STR_CORE = \"core\";\n    var STR_CREATE_PERF_MGR = \"createPerfMgr\";\n    var STR_DISABLED = \"disabled\";\n    var STR_EXTENSION_CONFIG = \"extensionConfig\";\n    var STR_EXTENSIONS = \"extensions\";\n    var STR_PROCESS_TELEMETRY = \"processTelemetry\";\n    var STR_PRIORITY = \"priority\";\n    var STR_EVENTS_SENT = \"eventsSent\";\n    var STR_EVENTS_DISCARDED = \"eventsDiscarded\";\n    var STR_EVENTS_SEND_REQUEST = \"eventsSendRequest\";\n    var STR_PERF_EVENT = \"perfEvent\";\n    var STR_GET_PERF_MGR = \"getPerfMgr\";\n    var STR_DOMAIN = \"domain\";\n    var STR_PATH = \"path\";\n    var STR_NOT_DYNAMIC_ERROR = \"Not dynamic - \";\n\n    var strGetPrototypeOf = \"getPrototypeOf\";\n    var rCamelCase = /-([a-z])/g;\n    var rNormalizeInvalid = /([^\\w\\d_$])/g;\n    var rLeadingNumeric = /^(\\d+[\\w\\d_$])/;\n    var _getObjProto = Object[strGetPrototypeOf];\n    function isNotNullOrUndefined(value) {\n        return !isNullOrUndefined(value);\n    }\n    function normalizeJsName(name) {\n        var value = name;\n        if (value && isString(value)) {\n            value = value[_DYN_REPLACE ](rCamelCase, function (_all, letter) {\n                return letter.toUpperCase();\n            });\n            value = value[_DYN_REPLACE ](rNormalizeInvalid, \"_\");\n            value = value[_DYN_REPLACE ](rLeadingNumeric, function (_all, match) {\n                return \"_\" + match;\n            });\n        }\n        return value;\n    }\n    function strContains(value, search) {\n        if (value && search) {\n            return strIndexOf(value, search) !== -1;\n        }\n        return false;\n    }\n    function toISOString(date) {\n        return date && date.toISOString() || \"\";\n    }\n    function getExceptionName(object) {\n        if (isError(object)) {\n            return object[_DYN_NAME$3 ];\n        }\n        return STR_EMPTY;\n    }\n    function setValue(target, field, value, valChk, srcChk) {\n        var theValue = value;\n        if (target) {\n            theValue = target[field];\n            if (theValue !== value && (!srcChk || srcChk(theValue)) && (!valChk || valChk(value))) {\n                theValue = value;\n                target[field] = theValue;\n            }\n        }\n        return theValue;\n    }\n    function getSetValue(target, field, defValue) {\n        var theValue;\n        if (target) {\n            theValue = target[field];\n            if (!theValue && isNullOrUndefined(theValue)) {\n                theValue = !isUndefined(defValue) ? defValue : {};\n                target[field] = theValue;\n            }\n        }\n        else {\n            theValue = !isUndefined(defValue) ? defValue : {};\n        }\n        return theValue;\n    }\n    function _createProxyFunction(source, funcName) {\n        var srcFunc = null;\n        var src = null;\n        if (isFunction(source)) {\n            srcFunc = source;\n        }\n        else {\n            src = source;\n        }\n        return function () {\n            var originalArguments = arguments;\n            if (srcFunc) {\n                src = srcFunc();\n            }\n            if (src) {\n                return src[funcName][_DYN_APPLY ](src, originalArguments);\n            }\n        };\n    }\n    function proxyAssign(target, source, chkSet) {\n        if (target && source && isObject(target) && isObject(source)) {\n            var _loop_1 = function (field) {\n                if (isString(field)) {\n                    var value = source[field];\n                    if (isFunction(value)) {\n                        if (!chkSet || chkSet(field, true, source, target)) {\n                            target[field] = _createProxyFunction(source, field);\n                        }\n                    }\n                    else if (!chkSet || chkSet(field, false, source, target)) {\n                        if (objHasOwn(target, field)) {\n                            delete target[field];\n                        }\n                        objDefine(target, field, {\n                            g: function () {\n                                return source[field];\n                            },\n                            s: function (theValue) {\n                                source[field] = theValue;\n                            }\n                        });\n                    }\n                }\n            };\n            for (var field in source) {\n                _loop_1(field);\n            }\n        }\n        return target;\n    }\n    function proxyFunctionAs(target, name, source, theFunc, overwriteTarget) {\n        if (target && name && source) {\n            if (overwriteTarget !== false || isUndefined(target[name])) {\n                target[name] = _createProxyFunction(source, theFunc);\n            }\n        }\n    }\n    function proxyFunctions(target, source, functionsToProxy, overwriteTarget) {\n        if (target && source && isObject(target) && isArray(functionsToProxy)) {\n            arrForEach(functionsToProxy, function (theFuncName) {\n                if (isString(theFuncName)) {\n                    proxyFunctionAs(target, theFuncName, source, theFuncName, overwriteTarget);\n                }\n            });\n        }\n        return target;\n    }\n    function createClassFromInterface(defaults) {\n        return /** @class */ (function () {\n            function class_1() {\n                var _this = this;\n                if (defaults) {\n                    objForEachKey(defaults, function (field, value) {\n                        _this[field] = value;\n                    });\n                }\n            }\n            return class_1;\n        }());\n    }\n    function optimizeObject(theObject) {\n        if (theObject && objAssign) {\n            theObject = ObjClass(objAssign({}, theObject));\n        }\n        return theObject;\n    }\n    function objExtend(obj1, obj2, obj3, obj4, obj5, obj6) {\n        var theArgs = arguments;\n        var extended = theArgs[0] || {};\n        var argLen = theArgs[_DYN_LENGTH$5 ];\n        var deep = false;\n        var idx = 1;\n        if (argLen > 0 && isBoolean(extended)) {\n            deep = extended;\n            extended = theArgs[idx] || {};\n            idx++;\n        }\n        if (!isObject(extended)) {\n            extended = {};\n        }\n        for (; idx < argLen; idx++) {\n            var arg = theArgs[idx];\n            var isArgArray = isArray(arg);\n            var isArgObj = isObject(arg);\n            for (var prop in arg) {\n                var propOk = (isArgArray && (prop in arg)) || (isArgObj && objHasOwn(arg, prop));\n                if (!propOk) {\n                    continue;\n                }\n                var newValue = arg[prop];\n                var isNewArray = void 0;\n                if (deep && newValue && ((isNewArray = isArray(newValue)) || isPlainObject(newValue))) {\n                    var clone = extended[prop];\n                    if (isNewArray) {\n                        if (!isArray(clone)) {\n                            clone = [];\n                        }\n                    }\n                    else if (!isPlainObject(clone)) {\n                        clone = {};\n                    }\n                    newValue = objExtend(deep, clone, newValue);\n                }\n                if (newValue !== undefined) {\n                    extended[prop] = newValue;\n                }\n            }\n        }\n        return extended;\n    }\n\n    var strDocumentMode = \"documentMode\";\n    var strLocation = \"location\";\n    var strConsole = \"console\";\n    var strJSON = \"JSON\";\n    var strCrypto = \"crypto\";\n    var strMsCrypto = \"msCrypto\";\n    var strReactNative = \"ReactNative\";\n    var strMsie = \"msie\";\n    var strTrident = \"trident/\";\n    var strXMLHttpRequest = \"XMLHttpRequest\";\n    var _isTrident = null;\n    var _navUserAgentCheck = null;\n    var _enableMocks = false;\n    var _useXDomainRequest = null;\n    var _beaconsSupported = null;\n    function _hasProperty(theClass, property) {\n        var supported = false;\n        if (theClass) {\n            try {\n                supported = property in theClass;\n                if (!supported) {\n                    var proto = theClass[strShimPrototype];\n                    if (proto) {\n                        supported = property in proto;\n                    }\n                }\n            }\n            catch (e) {\n            }\n            if (!supported) {\n                try {\n                    var tmp = new theClass();\n                    supported = !isUndefined(tmp[property]);\n                }\n                catch (e) {\n                }\n            }\n        }\n        return supported;\n    }\n    function getLocation(checkForMock) {\n        if (checkForMock && _enableMocks) {\n            var mockLocation = getInst(\"__mockLocation\");\n            if (mockLocation) {\n                return mockLocation;\n            }\n        }\n        if (typeof location === strShimObject && location) {\n            return location;\n        }\n        return getInst(strLocation);\n    }\n    function getConsole() {\n        if (typeof console !== strShimUndefined) {\n            return console;\n        }\n        return getInst(strConsole);\n    }\n    function hasJSON() {\n        return Boolean((typeof JSON === strShimObject && JSON) || getInst(strJSON) !== null);\n    }\n    function getJSON() {\n        if (hasJSON()) {\n            return JSON || getInst(strJSON);\n        }\n        return null;\n    }\n    function getCrypto() {\n        return getInst(strCrypto);\n    }\n    function getMsCrypto() {\n        return getInst(strMsCrypto);\n    }\n    function isReactNative() {\n        var nav = getNavigator();\n        if (nav && nav.product) {\n            return nav.product === strReactNative;\n        }\n        return false;\n    }\n    function isIE() {\n        var nav = getNavigator();\n        if (nav && (nav[_DYN_USER_AGENT ] !== _navUserAgentCheck || _isTrident === null)) {\n            _navUserAgentCheck = nav[_DYN_USER_AGENT ];\n            var userAgent = (_navUserAgentCheck || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]();\n            _isTrident = (strContains(userAgent, strMsie) || strContains(userAgent, strTrident));\n        }\n        return _isTrident;\n    }\n    function getIEVersion(userAgentStr) {\n        if (userAgentStr === void 0) { userAgentStr = null; }\n        if (!userAgentStr) {\n            var navigator_1 = getNavigator() || {};\n            userAgentStr = navigator_1 ? (navigator_1.userAgent || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]() : STR_EMPTY;\n        }\n        var ua = (userAgentStr || STR_EMPTY)[_DYN_TO_LOWER_CASE$2 ]();\n        if (strContains(ua, strMsie)) {\n            var doc = getDocument() || {};\n            return Math.max(parseInt(ua[_DYN_SPLIT$1 ](strMsie)[1]), (doc[strDocumentMode] || 0));\n        }\n        else if (strContains(ua, strTrident)) {\n            var tridentVer = parseInt(ua[_DYN_SPLIT$1 ](strTrident)[1]);\n            if (tridentVer) {\n                return tridentVer + 4;\n            }\n        }\n        return null;\n    }\n    function isBeaconsSupported(useCached) {\n        if (_beaconsSupported === null || useCached === false) {\n            _beaconsSupported = hasNavigator() && Boolean(getNavigator().sendBeacon);\n        }\n        return _beaconsSupported;\n    }\n    function isFetchSupported(withKeepAlive) {\n        var isSupported = false;\n        try {\n            isSupported = !!getInst(\"fetch\");\n            var request = getInst(\"Request\");\n            if (isSupported && withKeepAlive && request) {\n                isSupported = _hasProperty(request, \"keepalive\");\n            }\n        }\n        catch (e) {\n        }\n        return isSupported;\n    }\n    function useXDomainRequest() {\n        if (_useXDomainRequest === null) {\n            _useXDomainRequest = (typeof XDomainRequest !== strShimUndefined);\n            if (_useXDomainRequest && isXhrSupported()) {\n                _useXDomainRequest = _useXDomainRequest && !_hasProperty(getInst(strXMLHttpRequest), \"withCredentials\");\n            }\n        }\n        return _useXDomainRequest;\n    }\n    function isXhrSupported() {\n        var isSupported = false;\n        try {\n            var xmlHttpRequest = getInst(strXMLHttpRequest);\n            isSupported = !!xmlHttpRequest;\n        }\n        catch (e) {\n        }\n        return isSupported;\n    }\n\n    var UInt32Mask = 0x100000000;\n    var MaxUInt32 = 0xffffffff;\n    var SEED1 = 123456789;\n    var SEED2 = 987654321;\n    var _mwcSeeded = false;\n    var _mwcW = SEED1;\n    var _mwcZ = SEED2;\n    function _mwcSeed(seedValue) {\n        if (seedValue < 0) {\n            seedValue >>>= 0;\n        }\n        _mwcW = (SEED1 + seedValue) & MaxUInt32;\n        _mwcZ = (SEED2 - seedValue) & MaxUInt32;\n        _mwcSeeded = true;\n    }\n    function _autoSeedMwc() {\n        try {\n            var now = utcNow() & 0x7fffffff;\n            _mwcSeed(((Math.random() * UInt32Mask) ^ now) + now);\n        }\n        catch (e) {\n        }\n    }\n    function random32(signed) {\n        var value = 0;\n        var c = getCrypto() || getMsCrypto();\n        if (c && c.getRandomValues) {\n            value = c.getRandomValues(new Uint32Array(1))[0] & MaxUInt32;\n        }\n        if (value === 0 && isIE()) {\n            if (!_mwcSeeded) {\n                _autoSeedMwc();\n            }\n            value = mwcRandom32() & MaxUInt32;\n        }\n        if (value === 0) {\n            value = Math.floor((UInt32Mask * Math.random()) | 0);\n        }\n        if (!signed) {\n            value >>>= 0;\n        }\n        return value;\n    }\n    function mwcRandom32(signed) {\n        _mwcZ = (36969 * (_mwcZ & 0xFFFF) + (_mwcZ >> 16)) & MaxUInt32;\n        _mwcW = (18000 * (_mwcW & 0xFFFF) + (_mwcW >> 16)) & MaxUInt32;\n        var value = (((_mwcZ << 16) + (_mwcW & 0xFFFF)) >>> 0) & MaxUInt32 | 0;\n        if (!signed) {\n            value >>>= 0;\n        }\n        return value;\n    }\n    function newId(maxLength) {\n        if (maxLength === void 0) { maxLength = 22; }\n        var base64chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        var number = random32() >>> 0;\n        var chars = 0;\n        var result = STR_EMPTY;\n        while (result[_DYN_LENGTH$5 ] < maxLength) {\n            chars++;\n            result += base64chars.charAt(number & 0x3F);\n            number >>>= 6;\n            if (chars === 5) {\n                number = (((random32() << 2) & 0xFFFFFFFF) | (number & 0x03)) >>> 0;\n                chars = 0;\n            }\n        }\n        return result;\n    }\n\n    var version = '3.0.2';\n    var instanceName = \".\" + newId(6);\n    var _dataUid = 0;\n    function _canAcceptData(target) {\n        return target[_DYN_NODE_TYPE ] === 1 || target[_DYN_NODE_TYPE ] === 9 || !(+target[_DYN_NODE_TYPE ]);\n    }\n    function _getCache(data, target) {\n        var theCache = target[data.id];\n        if (!theCache) {\n            theCache = {};\n            try {\n                if (_canAcceptData(target)) {\n                    objDefine(target, data.id, {\n                        e: false,\n                        v: theCache\n                    });\n                }\n            }\n            catch (e) {\n            }\n        }\n        return theCache;\n    }\n    function createUniqueNamespace(name, includeVersion) {\n        if (includeVersion === void 0) { includeVersion = false; }\n        return normalizeJsName(name + (_dataUid++) + (includeVersion ? \".\" + version : STR_EMPTY) + instanceName);\n    }\n    function createElmNodeData(name) {\n        var data = {\n            id: createUniqueNamespace(\"_aiData-\" + (name || STR_EMPTY) + \".\" + version),\n            accept: function (target) {\n                return _canAcceptData(target);\n            },\n            get: function (target, name, defValue, addDefault) {\n                var theCache = target[data.id];\n                if (!theCache) {\n                    if (addDefault) {\n                        theCache = _getCache(data, target);\n                        theCache[normalizeJsName(name)] = defValue;\n                    }\n                    return defValue;\n                }\n                return theCache[normalizeJsName(name)];\n            },\n            kill: function (target, name) {\n                if (target && target[name]) {\n                    try {\n                        delete target[name];\n                    }\n                    catch (e) {\n                    }\n                }\n            }\n        };\n        return data;\n    }\n\n    function _isConfigDefaults(value) {\n        return (value && isObject(value) && (value.isVal || value.fb || objHasOwn(value, \"v\") || objHasOwn(value, \"mrg\") || objHasOwn(value, \"ref\") || value.set));\n    }\n    function _getDefault(dynamicHandler, theConfig, cfgDefaults) {\n        var defValue;\n        var isDefaultValid = cfgDefaults.dfVal || isDefined;\n        if (theConfig && cfgDefaults.fb) {\n            var fallbacks = cfgDefaults.fb;\n            if (!isArray(fallbacks)) {\n                fallbacks = [fallbacks];\n            }\n            for (var lp = 0; lp < fallbacks[_DYN_LENGTH$5 ]; lp++) {\n                var fallback = fallbacks[lp];\n                var fbValue = theConfig[fallback];\n                if (isDefaultValid(fbValue)) {\n                    defValue = fbValue;\n                }\n                else if (dynamicHandler) {\n                    fbValue = dynamicHandler.cfg[fallback];\n                    if (isDefaultValid(fbValue)) {\n                        defValue = fbValue;\n                    }\n                    dynamicHandler.set(dynamicHandler.cfg, asString(fallback), fbValue);\n                }\n                if (isDefaultValid(defValue)) {\n                    break;\n                }\n            }\n        }\n        if (!isDefaultValid(defValue) && isDefaultValid(cfgDefaults.v)) {\n            defValue = cfgDefaults.v;\n        }\n        return defValue;\n    }\n    function _resolveDefaultValue(dynamicHandler, theConfig, cfgDefaults) {\n        var theValue = cfgDefaults;\n        if (cfgDefaults && _isConfigDefaults(cfgDefaults)) {\n            theValue = _getDefault(dynamicHandler, theConfig, cfgDefaults);\n        }\n        if (theValue) {\n            if (_isConfigDefaults(theValue)) {\n                theValue = _resolveDefaultValue(dynamicHandler, theConfig, theValue);\n            }\n            var newValue_1;\n            if (isArray(theValue)) {\n                newValue_1 = [];\n                newValue_1[_DYN_LENGTH$5 ] = theValue[_DYN_LENGTH$5 ];\n            }\n            else if (isPlainObject(theValue)) {\n                newValue_1 = {};\n            }\n            if (newValue_1) {\n                objForEachKey(theValue, function (key, value) {\n                    if (value && _isConfigDefaults(value)) {\n                        value = _resolveDefaultValue(dynamicHandler, theConfig, value);\n                    }\n                    newValue_1[key] = value;\n                });\n                theValue = newValue_1;\n            }\n        }\n        return theValue;\n    }\n    function _applyDefaultValue(dynamicHandler, theConfig, name, defaultValue) {\n        var isValid;\n        var setFn;\n        var defValue;\n        var cfgDefaults = defaultValue;\n        var mergeDf;\n        var reference;\n        var readOnly;\n        var blkDynamicValue;\n        if (_isConfigDefaults(cfgDefaults)) {\n            isValid = cfgDefaults.isVal;\n            setFn = cfgDefaults.set;\n            readOnly = cfgDefaults[_DYN_RD_ONLY ];\n            blkDynamicValue = cfgDefaults[_DYN_BLK_VAL ];\n            mergeDf = cfgDefaults.mrg;\n            reference = cfgDefaults.ref;\n            if (!reference && isUndefined(reference)) {\n                reference = !!mergeDf;\n            }\n            defValue = _getDefault(dynamicHandler, theConfig, cfgDefaults);\n        }\n        else {\n            defValue = defaultValue;\n        }\n        if (blkDynamicValue) {\n            dynamicHandler[_DYN_BLK_VAL ](theConfig, name);\n        }\n        var theValue;\n        var usingDefault = true;\n        var cfgValue = theConfig[name];\n        if (cfgValue || !isNullOrUndefined(cfgValue)) {\n            theValue = cfgValue;\n            usingDefault = false;\n            if (isValid && theValue !== defValue && !isValid(theValue)) {\n                theValue = defValue;\n                usingDefault = true;\n            }\n            if (setFn) {\n                theValue = setFn(theValue, defValue, theConfig);\n                usingDefault = theValue === defValue;\n            }\n        }\n        if (!usingDefault) {\n            if (isPlainObject(theValue) || isArray(defValue)) {\n                if (mergeDf && defValue && (isPlainObject(defValue) || isArray(defValue))) {\n                    objForEachKey(defValue, function (dfName, dfValue) {\n                        _applyDefaultValue(dynamicHandler, theValue, dfName, dfValue);\n                    });\n                }\n            }\n        }\n        else if (defValue) {\n            theValue = _resolveDefaultValue(dynamicHandler, theConfig, defValue);\n        }\n        else {\n            theValue = defValue;\n        }\n        dynamicHandler.set(theConfig, name, theValue);\n        if (reference) {\n            dynamicHandler.ref(theConfig, name);\n        }\n        if (readOnly) {\n            dynamicHandler[_DYN_RD_ONLY ](theConfig, name);\n        }\n    }\n\n    var CFG_HANDLER_LINK = symbolFor(\"[[ai_dynCfg_1]]\");\n    var BLOCK_DYNAMIC = symbolFor(\"[[ai_blkDynCfg_1]]\");\n    var FORCE_DYNAMIC = symbolFor(\"[[ai_frcDynCfg_1]]\");\n    function _cfgDeepCopy(source) {\n        if (source) {\n            var target_1;\n            if (isArray(source)) {\n                target_1 = [];\n                target_1[_DYN_LENGTH$5 ] = source[_DYN_LENGTH$5 ];\n            }\n            else if (isPlainObject(source)) {\n                target_1 = {};\n            }\n            if (target_1) {\n                objForEachKey(source, function (key, value) {\n                    target_1[key] = _cfgDeepCopy(value);\n                });\n                return target_1;\n            }\n        }\n        return source;\n    }\n    function getDynamicConfigHandler(value) {\n        if (value) {\n            var handler = value[CFG_HANDLER_LINK] || value;\n            if (handler.cfg && (handler.cfg === value || handler.cfg[CFG_HANDLER_LINK] === handler)) {\n                return handler;\n            }\n        }\n        return null;\n    }\n    function blockDynamicConversion(value) {\n        if (value && (isPlainObject(value) || isArray(value))) {\n            try {\n                value[BLOCK_DYNAMIC] = true;\n            }\n            catch (e) {\n            }\n        }\n        return value;\n    }\n    function _canMakeDynamic(getFunc, state, value) {\n        var result = false;\n        if (value && !getFunc[state.blkVal]) {\n            result = value[FORCE_DYNAMIC];\n            if (!result && !value[BLOCK_DYNAMIC]) {\n                result = isPlainObject(value) || isArray(value);\n            }\n        }\n        return result;\n    }\n    function throwInvalidAccess(message) {\n        throwTypeError(\"InvalidAccess:\" + message);\n    }\n\n    var arrayMethodsToPatch = [\n        \"push\",\n        \"pop\",\n        \"shift\",\n        \"unshift\",\n        \"splice\"\n    ];\n    var _throwDynamicError = function (logger, name, desc, e) {\n        logger && logger[_DYN_THROW_INTERNAL ](3 , 108 , \"\".concat(desc, \" [\").concat(name, \"] failed - \") + dumpObj(e));\n    };\n    function _patchArray(state, target, name) {\n        if (isArray(target)) {\n            arrForEach(arrayMethodsToPatch, function (method) {\n                var orgMethod = target[method];\n                target[method] = function () {\n                    var args = [];\n                    for (var _i = 0; _i < arguments.length; _i++) {\n                        args[_i] = arguments[_i];\n                    }\n                    var result = orgMethod[_DYN_APPLY ](this, args);\n                    _makeDynamicObject(state, target, name, \"Patching\");\n                    return result;\n                };\n            });\n        }\n    }\n    function _getOwnPropGetter(target, name) {\n        var propDesc = objGetOwnPropertyDescriptor(target, name);\n        return propDesc && propDesc.get;\n    }\n    function _createDynamicProperty(state, theConfig, name, value) {\n        var detail = {\n            n: name,\n            h: [],\n            trk: function (handler) {\n                if (handler && handler.fn) {\n                    if (arrIndexOf(detail.h, handler) === -1) {\n                        detail.h[_DYN_PUSH$1 ](handler);\n                    }\n                    state.trk(handler, detail);\n                }\n            },\n            clr: function (handler) {\n                var idx = arrIndexOf(detail.h, handler);\n                if (idx !== -1) {\n                    detail.h[_DYN_SPLICE ](idx, 1);\n                }\n            }\n        };\n        var checkDynamic = true;\n        var isObjectOrArray = false;\n        function _getProperty() {\n            if (checkDynamic) {\n                isObjectOrArray = isObjectOrArray || _canMakeDynamic(_getProperty, state, value);\n                if (value && !value[CFG_HANDLER_LINK] && isObjectOrArray) {\n                    value = _makeDynamicObject(state, value, name, \"Converting\");\n                }\n                checkDynamic = false;\n            }\n            var activeHandler = state.act;\n            if (activeHandler) {\n                detail.trk(activeHandler);\n            }\n            return value;\n        }\n        _getProperty[state.prop] = {\n            chng: function () {\n                state.add(detail);\n            }\n        };\n        function _setProperty(newValue) {\n            if (value !== newValue) {\n                if (!!_getProperty[state.ro] && !state.upd) {\n                    throwInvalidAccess(\"[\" + name + \"] is read-only:\" + dumpObj(theConfig));\n                }\n                if (checkDynamic) {\n                    isObjectOrArray = isObjectOrArray || _canMakeDynamic(_getProperty, state, value);\n                    checkDynamic = false;\n                }\n                var isReferenced = isObjectOrArray && _getProperty[state.rf];\n                if (isObjectOrArray) {\n                    if (isReferenced) {\n                        objForEachKey(value, function (key) {\n                            value[key] = newValue ? newValue[key] : UNDEFINED_VALUE$2;\n                        });\n                        try {\n                            objForEachKey(newValue, function (key, theValue) {\n                                _setDynamicProperty(state, value, key, theValue);\n                            });\n                            newValue = value;\n                        }\n                        catch (e) {\n                            _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, \"Assigning\", e);\n                            isObjectOrArray = false;\n                        }\n                    }\n                    else if (value && value[CFG_HANDLER_LINK]) {\n                        objForEachKey(value, function (key) {\n                            var getter = _getOwnPropGetter(value, key);\n                            if (getter) {\n                                var valueState = getter[state.prop];\n                                valueState && valueState.chng();\n                            }\n                        });\n                    }\n                }\n                if (newValue !== value) {\n                    var newIsObjectOrArray = newValue && _canMakeDynamic(_getProperty, state, newValue);\n                    if (!isReferenced && newIsObjectOrArray) {\n                        newValue = _makeDynamicObject(state, newValue, name, \"Converting\");\n                    }\n                    value = newValue;\n                    isObjectOrArray = newIsObjectOrArray;\n                }\n                state.add(detail);\n            }\n        }\n        objDefine(theConfig, detail.n, { g: _getProperty, s: _setProperty });\n    }\n    function _setDynamicProperty(state, target, name, value) {\n        if (target) {\n            var getter = _getOwnPropGetter(target, name);\n            var isDynamic = getter && !!getter[state.prop];\n            if (!isDynamic) {\n                _createDynamicProperty(state, target, name, value);\n            }\n            else {\n                target[name] = value;\n            }\n        }\n        return target;\n    }\n    function _setDynamicPropertyState(state, target, name, flags) {\n        if (target) {\n            var getter = _getOwnPropGetter(target, name);\n            var isDynamic = getter && !!getter[state.prop];\n            var inPlace = flags && flags[0 ];\n            var rdOnly = flags && flags[1 ];\n            var blkProp = flags && flags[2 ];\n            if (!isDynamic) {\n                if (blkProp) {\n                    try {\n                        blockDynamicConversion(target);\n                    }\n                    catch (e) {\n                        _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, \"Blocking\", e);\n                    }\n                }\n                try {\n                    _setDynamicProperty(state, target, name, target[name]);\n                    getter = _getOwnPropGetter(target, name);\n                }\n                catch (e) {\n                    _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, \"State\", e);\n                }\n            }\n            if (inPlace) {\n                getter[state.rf] = inPlace;\n            }\n            if (rdOnly) {\n                getter[state.ro] = rdOnly;\n            }\n            if (blkProp) {\n                getter[state.blkVal] = true;\n            }\n        }\n        return target;\n    }\n    function _makeDynamicObject(state, target, name, desc) {\n        try {\n            objForEachKey(target, function (key, value) {\n                _setDynamicProperty(state, target, key, value);\n            });\n            if (!target[CFG_HANDLER_LINK]) {\n                objDefineProp(target, CFG_HANDLER_LINK, {\n                    get: function () {\n                        return state[_DYN_HDLR ];\n                    }\n                });\n                _patchArray(state, target, name);\n            }\n        }\n        catch (e) {\n            _throwDynamicError((state.hdlr || {})[_DYN_LOGGER ], name, desc, e);\n        }\n        return target;\n    }\n\n    var symPrefix = \"[[ai_\";\n    var symPostfix = \"]]\";\n    function _createState(cfgHandler) {\n        var _a;\n        var dynamicPropertySymbol = newSymbol(symPrefix + \"get\" + cfgHandler.uid + symPostfix);\n        var dynamicPropertyReadOnly = newSymbol(symPrefix + \"ro\" + cfgHandler.uid + symPostfix);\n        var dynamicPropertyReferenced = newSymbol(symPrefix + \"rf\" + cfgHandler.uid + symPostfix);\n        var dynamicPropertyBlockValue = newSymbol(symPrefix + \"blkVal\" + cfgHandler.uid + symPostfix);\n        var dynamicPropertyDetail = newSymbol(symPrefix + \"dtl\" + cfgHandler.uid + symPostfix);\n        var _waitingHandlers = null;\n        var _watcherTimer = null;\n        var theState;\n        function _useHandler(activeHandler, callback) {\n            var prevWatcher = theState.act;\n            try {\n                theState.act = activeHandler;\n                if (activeHandler && activeHandler[dynamicPropertyDetail]) {\n                    arrForEach(activeHandler[dynamicPropertyDetail], function (detail) {\n                        detail.clr(activeHandler);\n                    });\n                    activeHandler[dynamicPropertyDetail] = [];\n                }\n                callback({\n                    cfg: cfgHandler.cfg,\n                    set: cfgHandler.set.bind(cfgHandler),\n                    setDf: cfgHandler[_DYN_SET_DF ].bind(cfgHandler),\n                    ref: cfgHandler.ref.bind(cfgHandler),\n                    rdOnly: cfgHandler[_DYN_RD_ONLY ].bind(cfgHandler)\n                });\n            }\n            catch (e) {\n                var logger = cfgHandler[_DYN_LOGGER ];\n                if (logger) {\n                    logger[_DYN_THROW_INTERNAL ](1 , 107 , dumpObj(e));\n                }\n                throw e;\n            }\n            finally {\n                theState.act = prevWatcher || null;\n            }\n        }\n        function _notifyWatchers() {\n            if (_waitingHandlers) {\n                var notifyHandlers = _waitingHandlers;\n                _waitingHandlers = null;\n                _watcherTimer && _watcherTimer[_DYN_CANCEL ]();\n                _watcherTimer = null;\n                var watcherFailures_1 = [];\n                arrForEach(notifyHandlers, function (handler) {\n                    if (handler) {\n                        if (handler[dynamicPropertyDetail]) {\n                            arrForEach(handler[dynamicPropertyDetail], function (detail) {\n                                detail.clr(handler);\n                            });\n                            handler[dynamicPropertyDetail] = null;\n                        }\n                        if (handler.fn) {\n                            try {\n                                _useHandler(handler, handler.fn);\n                            }\n                            catch (e) {\n                                watcherFailures_1[_DYN_PUSH$1 ](e);\n                            }\n                        }\n                    }\n                });\n                if (_waitingHandlers) {\n                    try {\n                        _notifyWatchers();\n                    }\n                    catch (e) {\n                        watcherFailures_1[_DYN_PUSH$1 ](e);\n                    }\n                }\n                if (watcherFailures_1[_DYN_LENGTH$5 ] > 0) {\n                    throwAggregationError(\"Watcher error(s): \", watcherFailures_1);\n                }\n            }\n        }\n        function _addWatcher(detail) {\n            if (detail && detail.h[_DYN_LENGTH$5 ] > 0) {\n                if (!_waitingHandlers) {\n                    _waitingHandlers = [];\n                }\n                if (!_watcherTimer) {\n                    _watcherTimer = scheduleTimeout(function () {\n                        _watcherTimer = null;\n                        _notifyWatchers();\n                    }, 0);\n                }\n                for (var idx = 0; idx < detail.h[_DYN_LENGTH$5 ]; idx++) {\n                    var handler = detail.h[idx];\n                    if (handler && arrIndexOf(_waitingHandlers, handler) === -1) {\n                        _waitingHandlers[_DYN_PUSH$1 ](handler);\n                    }\n                }\n            }\n        }\n        function _trackHandler(handler, detail) {\n            if (handler) {\n                var details = handler[dynamicPropertyDetail] = handler[dynamicPropertyDetail] || [];\n                if (arrIndexOf(details, detail) === -1) {\n                    details[_DYN_PUSH$1 ](detail);\n                }\n            }\n        }\n        theState = (_a = {\n                prop: dynamicPropertySymbol,\n                ro: dynamicPropertyReadOnly,\n                rf: dynamicPropertyReferenced\n            },\n            _a[_DYN_BLK_VAL ] = dynamicPropertyBlockValue,\n            _a[_DYN_HDLR ] = cfgHandler,\n            _a.add = _addWatcher,\n            _a[_DYN_NOTIFY ] = _notifyWatchers,\n            _a.use = _useHandler,\n            _a.trk = _trackHandler,\n            _a);\n        return theState;\n    }\n\n    function _createAndUseHandler(state, configHandler) {\n        var handler = {\n            fn: configHandler,\n            rm: function () {\n                handler.fn = null;\n                state = null;\n                configHandler = null;\n            }\n        };\n        state.use(handler, configHandler);\n        return handler;\n    }\n    function _createDynamicHandler(logger, target, inPlace) {\n        var _a;\n        var dynamicHandler = getDynamicConfigHandler(target);\n        if (dynamicHandler) {\n            return dynamicHandler;\n        }\n        var uid = createUniqueNamespace(\"dyncfg\", true);\n        var newTarget = (target && inPlace !== false) ? target : _cfgDeepCopy(target);\n        var theState;\n        function _notifyWatchers() {\n            theState[_DYN_NOTIFY ]();\n        }\n        function _setValue(target, name, value) {\n            try {\n                target = _setDynamicProperty(theState, target, name, value);\n            }\n            catch (e) {\n                _throwDynamicError(logger, name, \"Setting value\", e);\n            }\n            return target[name];\n        }\n        function _watch(configHandler) {\n            return _createAndUseHandler(theState, configHandler);\n        }\n        function _block(configHandler, allowUpdate) {\n            theState.use(null, function (details) {\n                var prevUpd = theState.upd;\n                try {\n                    if (!isUndefined(allowUpdate)) {\n                        theState.upd = allowUpdate;\n                    }\n                    configHandler(details);\n                }\n                finally {\n                    theState.upd = prevUpd;\n                }\n            });\n        }\n        function _ref(target, name) {\n            var _a;\n            return _setDynamicPropertyState(theState, target, name, (_a = {}, _a[0 ] = true, _a))[name];\n        }\n        function _rdOnly(target, name) {\n            var _a;\n            return _setDynamicPropertyState(theState, target, name, (_a = {}, _a[1 ] = true, _a))[name];\n        }\n        function _blkPropValue(target, name) {\n            var _a;\n            return _setDynamicPropertyState(theState, target, name, (_a = {}, _a[2 ] = true, _a))[name];\n        }\n        function _applyDefaults(theConfig, defaultValues) {\n            if (defaultValues) {\n                objForEachKey(defaultValues, function (name, value) {\n                    _applyDefaultValue(cfgHandler, theConfig, name, value);\n                });\n            }\n            return theConfig;\n        }\n        var cfgHandler = (_a = {\n                uid: null,\n                cfg: newTarget\n            },\n            _a[_DYN_LOGGER ] = logger,\n            _a[_DYN_NOTIFY ] = _notifyWatchers,\n            _a.set = _setValue,\n            _a[_DYN_SET_DF ] = _applyDefaults,\n            _a[_DYN_WATCH ] = _watch,\n            _a.ref = _ref,\n            _a[_DYN_RD_ONLY ] = _rdOnly,\n            _a[_DYN_BLK_VAL ] = _blkPropValue,\n            _a._block = _block,\n            _a);\n        objDefine(cfgHandler, \"uid\", {\n            c: false,\n            e: false,\n            w: false,\n            v: uid\n        });\n        theState = _createState(cfgHandler);\n        _makeDynamicObject(theState, newTarget, \"config\", \"Creating\");\n        return cfgHandler;\n    }\n    function _logInvalidAccess(logger, message) {\n        if (logger) {\n            logger[_DYN_WARN_TO_CONSOLE ](message);\n            logger[_DYN_THROW_INTERNAL ](2 , 108 , message);\n        }\n        else {\n            throwInvalidAccess(message);\n        }\n    }\n    function createDynamicConfig(config, defaultConfig, logger, inPlace) {\n        var dynamicHandler = _createDynamicHandler(logger, config || {}, inPlace);\n        if (defaultConfig) {\n            dynamicHandler[_DYN_SET_DF ](dynamicHandler.cfg, defaultConfig);\n        }\n        return dynamicHandler;\n    }\n    function onConfigChange(config, configHandler, logger) {\n        var handler = config[CFG_HANDLER_LINK] || config;\n        if (handler.cfg && (handler.cfg === config || handler.cfg[CFG_HANDLER_LINK] === handler)) {\n            return handler[_DYN_WATCH ](configHandler);\n        }\n        _logInvalidAccess(logger, STR_NOT_DYNAMIC_ERROR + dumpObj(config));\n        return createDynamicConfig(config, null, logger)[_DYN_WATCH ](configHandler);\n    }\n\n    function runTargetUnload(target, isAsync) {\n        if (target && target[_DYN_UNLOAD ]) {\n            return target[_DYN_UNLOAD ](isAsync);\n        }\n    }\n    function doUnloadAll(targets, isAsync, done) {\n        var result;\n        if (!done) {\n            result = createPromise(function (resolved) {\n                done = resolved;\n            });\n        }\n        if (targets && getLength(targets) > 0) {\n            doAwaitResponse(runTargetUnload(targets[0], isAsync), function () {\n                doUnloadAll(arrSlice(targets, 1), isAsync, done);\n            });\n        }\n        else {\n            done();\n        }\n        return result;\n    }\n\n    var ChannelControllerPriority = 500;\n\n    function _stringToBoolOrDefault(theValue, defaultValue, theConfig) {\n        if (!theValue && isNullOrUndefined(theValue)) {\n            return defaultValue;\n        }\n        if (isBoolean(theValue)) {\n            return theValue;\n        }\n        return asString(theValue)[_DYN_TO_LOWER_CASE$2 ]() === \"true\";\n    }\n    function cfgDfMerge(defaultValue) {\n        return {\n            mrg: true,\n            v: defaultValue\n        };\n    }\n    function cfgDfSet(setter, defaultValue) {\n        return {\n            set: setter,\n            v: defaultValue\n        };\n    }\n    function cfgDfValidate(validator, defaultValue, fallBackName) {\n        return {\n            fb: fallBackName,\n            isVal: validator,\n            v: defaultValue\n        };\n    }\n    function cfgDfBoolean(defaultValue, fallBackName) {\n        return {\n            fb: fallBackName,\n            set: _stringToBoolOrDefault,\n            v: !!defaultValue\n        };\n    }\n    function cfgDfString(defaultValue) {\n        return {\n            isVal: isString,\n            v: asString(defaultValue || STR_EMPTY)\n        };\n    }\n\n    var listenerFuncs = [STR_EVENTS_SENT, STR_EVENTS_DISCARDED, STR_EVENTS_SEND_REQUEST, STR_PERF_EVENT];\n    var _aiNamespace = null;\n    var _debugListener;\n    function _listenerProxyFunc(name, config) {\n        return function () {\n            var args = arguments;\n            var dbgExt = getDebugExt(config);\n            if (dbgExt) {\n                var listener = dbgExt.listener;\n                if (listener && listener[name]) {\n                    listener[name][_DYN_APPLY ](listener, args);\n                }\n            }\n        };\n    }\n    function _getExtensionNamespace() {\n        var target = getInst(\"Microsoft\");\n        if (target) {\n            _aiNamespace = target[\"ApplicationInsights\"];\n        }\n        return _aiNamespace;\n    }\n    function getDebugExt(config) {\n        var ns = _aiNamespace;\n        if (!ns && config.disableDbgExt !== true) {\n            ns = _aiNamespace || _getExtensionNamespace();\n        }\n        return ns ? ns[\"ChromeDbgExt\"] : null;\n    }\n    function getDebugListener(config) {\n        if (!_debugListener) {\n            _debugListener = {};\n            for (var lp = 0; lp < listenerFuncs[_DYN_LENGTH$5 ]; lp++) {\n                _debugListener[listenerFuncs[lp]] = _listenerProxyFunc(listenerFuncs[lp], config);\n            }\n        }\n        return _debugListener;\n    }\n\n    var _a$8;\n    var STR_WARN_TO_CONSOLE = \"warnToConsole\";\n    var AiNonUserActionablePrefix = \"AI (Internal): \";\n    var AiUserActionablePrefix = \"AI: \";\n    var AIInternalMessagePrefix = \"AITR_\";\n    var defaultValues$3 = {\n        loggingLevelConsole: 0,\n        loggingLevelTelemetry: 1,\n        maxMessageLimit: 25,\n        enableDebug: false\n    };\n    var _logFuncs = (_a$8 = {},\n        _a$8[0 ] = null,\n        _a$8[1 ] = \"errorToConsole\",\n        _a$8[2 ] = STR_WARN_TO_CONSOLE,\n        _a$8[3 ] = \"debugToConsole\",\n        _a$8);\n    function _sanitizeDiagnosticText(text) {\n        if (text) {\n            return \"\\\"\" + text[_DYN_REPLACE ](/\\\"/g, STR_EMPTY) + \"\\\"\";\n        }\n        return STR_EMPTY;\n    }\n    function _logToConsole(func, message) {\n        var theConsole = getConsole();\n        if (!!theConsole) {\n            var logFunc = \"log\";\n            if (theConsole[func]) {\n                logFunc = func;\n            }\n            if (isFunction(theConsole[logFunc])) {\n                theConsole[logFunc](message);\n            }\n        }\n    }\n    var _InternalLogMessage = /** @class */ (function () {\n        function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            var _self = this;\n            _self[_DYN_MESSAGE_ID ] = msgId;\n            _self[_DYN_MESSAGE$2 ] =\n                (isUserAct ? AiUserActionablePrefix : AiNonUserActionablePrefix) +\n                    msgId;\n            var strProps = STR_EMPTY;\n            if (hasJSON()) {\n                strProps = getJSON().stringify(properties);\n            }\n            var diagnosticText = (msg ? \" message:\" + _sanitizeDiagnosticText(msg) : STR_EMPTY) +\n                (properties ? \" props:\" + _sanitizeDiagnosticText(strProps) : STR_EMPTY);\n            _self[_DYN_MESSAGE$2 ] += diagnosticText;\n        }\n        _InternalLogMessage.dataType = \"MessageData\";\n        return _InternalLogMessage;\n    }());\n    function safeGetLogger(core, config) {\n        return (core || {})[_DYN_LOGGER ] || new DiagnosticLogger(config);\n    }\n    var DiagnosticLogger = /** @class */ (function () {\n        function DiagnosticLogger(config) {\n            this.identifier = \"DiagnosticLogger\";\n            this.queue = [];\n            var _messageCount = 0;\n            var _messageLogged = {};\n            var _loggingLevelConsole;\n            var _loggingLevelTelemetry;\n            var _maxInternalMessageLimit;\n            var _enableDebug;\n            var _unloadHandler;\n            dynamicProto(DiagnosticLogger, this, function (_self) {\n                _unloadHandler = _setDefaultsFromConfig(config || {});\n                _self.consoleLoggingLevel = function () { return _loggingLevelConsole; };\n                _self[_DYN_THROW_INTERNAL ] = function (severity, msgId, msg, properties, isUserAct) {\n                    if (isUserAct === void 0) { isUserAct = false; }\n                    var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n                    if (_enableDebug) {\n                        throw dumpObj(message);\n                    }\n                    else {\n                        var logFunc = _logFuncs[severity] || STR_WARN_TO_CONSOLE;\n                        if (!isUndefined(message[_DYN_MESSAGE$2 ])) {\n                            if (isUserAct) {\n                                var messageKey = +message[_DYN_MESSAGE_ID ];\n                                if (!_messageLogged[messageKey] && _loggingLevelConsole >= severity) {\n                                    _self[logFunc](message[_DYN_MESSAGE$2 ]);\n                                    _messageLogged[messageKey] = true;\n                                }\n                            }\n                            else {\n                                if (_loggingLevelConsole >= severity) {\n                                    _self[logFunc](message[_DYN_MESSAGE$2 ]);\n                                }\n                            }\n                            _logInternalMessage(severity, message);\n                        }\n                        else {\n                            _debugExtMsg(\"throw\" + (severity === 1  ? \"Critical\" : \"Warning\"), message);\n                        }\n                    }\n                };\n                _self.debugToConsole = function (message) {\n                    _logToConsole(\"debug\", message);\n                    _debugExtMsg(\"warning\", message);\n                };\n                _self[_DYN_WARN_TO_CONSOLE ] = function (message) {\n                    _logToConsole(\"warn\", message);\n                    _debugExtMsg(\"warning\", message);\n                };\n                _self.errorToConsole = function (message) {\n                    _logToConsole(\"error\", message);\n                    _debugExtMsg(\"error\", message);\n                };\n                _self.resetInternalMessageCount = function () {\n                    _messageCount = 0;\n                    _messageLogged = {};\n                };\n                _self[_DYN_LOG_INTERNAL_MESSAGE ] = _logInternalMessage;\n                _self[_DYN_UNLOAD ] = function (isAsync) {\n                    _unloadHandler && _unloadHandler.rm();\n                    _unloadHandler = null;\n                };\n                function _logInternalMessage(severity, message) {\n                    if (_areInternalMessagesThrottled()) {\n                        return;\n                    }\n                    var logMessage = true;\n                    var messageKey = AIInternalMessagePrefix + message[_DYN_MESSAGE_ID ];\n                    if (_messageLogged[messageKey]) {\n                        logMessage = false;\n                    }\n                    else {\n                        _messageLogged[messageKey] = true;\n                    }\n                    if (logMessage) {\n                        if (severity <= _loggingLevelTelemetry) {\n                            _self.queue[_DYN_PUSH$1 ](message);\n                            _messageCount++;\n                            _debugExtMsg((severity === 1  ? \"error\" : \"warn\"), message);\n                        }\n                        if (_messageCount === _maxInternalMessageLimit) {\n                            var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                            var throttleMessage = new _InternalLogMessage(23 , throttleLimitMessage, false);\n                            _self.queue[_DYN_PUSH$1 ](throttleMessage);\n                            if (severity === 1 ) {\n                                _self.errorToConsole(throttleLimitMessage);\n                            }\n                            else {\n                                _self[_DYN_WARN_TO_CONSOLE ](throttleLimitMessage);\n                            }\n                        }\n                    }\n                }\n                function _setDefaultsFromConfig(config) {\n                    return onConfigChange(createDynamicConfig(config, defaultValues$3, _self).cfg, function (details) {\n                        var config = details.cfg;\n                        _loggingLevelConsole = config[_DYN_LOGGING_LEVEL_CONSOL4 ];\n                        _loggingLevelTelemetry = config.loggingLevelTelemetry;\n                        _maxInternalMessageLimit = config.maxMessageLimit;\n                        _enableDebug = config.enableDebug;\n                    });\n                }\n                function _areInternalMessagesThrottled() {\n                    return _messageCount >= _maxInternalMessageLimit;\n                }\n                function _debugExtMsg(name, data) {\n                    var dbgExt = getDebugExt(config || {});\n                    if (dbgExt && dbgExt[_DYN_DIAG_LOG$2 ]) {\n                        dbgExt[_DYN_DIAG_LOG$2 ](name, data);\n                    }\n                }\n            });\n        }\n        DiagnosticLogger.__ieDyn=1;\n        return DiagnosticLogger;\n    }());\n    function _getLogger(logger) {\n        return (logger || new DiagnosticLogger());\n    }\n    function _throwInternal(logger, severity, msgId, msg, properties, isUserAct) {\n        if (isUserAct === void 0) { isUserAct = false; }\n        _getLogger(logger)[_DYN_THROW_INTERNAL ](severity, msgId, msg, properties, isUserAct);\n    }\n    function _warnToConsole(logger, message) {\n        _getLogger(logger)[_DYN_WARN_TO_CONSOLE ](message);\n    }\n    function _logInternalMessage(logger, severity, message) {\n        _getLogger(logger)[_DYN_LOG_INTERNAL_MESSAGE ](severity, message);\n    }\n\n    var _a$7, _b$1;\n    var strToGMTString = \"toGMTString\";\n    var strToUTCString = \"toUTCString\";\n    var strCookie = \"cookie\";\n    var strExpires = \"expires\";\n    var strIsCookieUseDisabled = \"isCookieUseDisabled\";\n    var strDisableCookiesUsage = \"disableCookiesUsage\";\n    var strConfigCookieMgr = \"_ckMgr\";\n    var _supportsCookies = null;\n    var _allowUaSameSite = null;\n    var _parsedCookieValue = null;\n    var _doc;\n    var _cookieCache = {};\n    var _globalCookieConfig = {};\n    var rootDefaultConfig = (_a$7 = {\n            cookieCfg: cfgDfMerge((_b$1 = {},\n                _b$1[STR_DOMAIN] = { fb: \"cookieDomain\", dfVal: isNotNullOrUndefined },\n                _b$1.path = { fb: \"cookiePath\", dfVal: isNotNullOrUndefined },\n                _b$1.enabled = UNDEFINED_VALUE$2,\n                _b$1.ignoreCookies = UNDEFINED_VALUE$2,\n                _b$1.blockedCookies = UNDEFINED_VALUE$2,\n                _b$1)),\n            cookieDomain: UNDEFINED_VALUE$2,\n            cookiePath: UNDEFINED_VALUE$2\n        },\n        _a$7[strDisableCookiesUsage] = UNDEFINED_VALUE$2,\n        _a$7);\n    function _getDoc() {\n        !_doc && (_doc = getLazy(function () { return getDocument(); }));\n    }\n    function _gblCookieMgr(config, logger) {\n        var inst = createCookieMgr[strConfigCookieMgr] || _globalCookieConfig[strConfigCookieMgr];\n        if (!inst) {\n            inst = createCookieMgr[strConfigCookieMgr] = createCookieMgr(config, logger);\n            _globalCookieConfig[strConfigCookieMgr] = inst;\n        }\n        return inst;\n    }\n    function _isMgrEnabled(cookieMgr) {\n        if (cookieMgr) {\n            return cookieMgr.isEnabled();\n        }\n        return true;\n    }\n    function _isIgnoredCookie(cookieMgrCfg, name) {\n        if (name && cookieMgrCfg && isArray(cookieMgrCfg.ignoreCookies)) {\n            return arrIndexOf(cookieMgrCfg.ignoreCookies, name) !== -1;\n        }\n        return false;\n    }\n    function _isBlockedCookie(cookieMgrCfg, name) {\n        if (name && cookieMgrCfg && isArray(cookieMgrCfg.blockedCookies)) {\n            if (arrIndexOf(cookieMgrCfg.blockedCookies, name) !== -1) {\n                return true;\n            }\n        }\n        return _isIgnoredCookie(cookieMgrCfg, name);\n    }\n    function _isCfgEnabled(rootConfig, cookieMgrConfig) {\n        var isCfgEnabled = cookieMgrConfig[_DYN_ENABLED ];\n        if (isNullOrUndefined(isCfgEnabled)) {\n            var cookieEnabled = void 0;\n            if (!isUndefined(rootConfig[strIsCookieUseDisabled])) {\n                cookieEnabled = !rootConfig[strIsCookieUseDisabled];\n            }\n            if (!isUndefined(rootConfig[strDisableCookiesUsage])) {\n                cookieEnabled = !rootConfig[strDisableCookiesUsage];\n            }\n            isCfgEnabled = cookieEnabled;\n        }\n        return isCfgEnabled;\n    }\n    function safeGetCookieMgr(core, config) {\n        var cookieMgr;\n        if (core) {\n            cookieMgr = core.getCookieMgr();\n        }\n        else if (config) {\n            var cookieCfg = config.cookieCfg;\n            if (cookieCfg && cookieCfg[strConfigCookieMgr]) {\n                cookieMgr = cookieCfg[strConfigCookieMgr];\n            }\n            else {\n                cookieMgr = createCookieMgr(config);\n            }\n        }\n        if (!cookieMgr) {\n            cookieMgr = _gblCookieMgr(config, (core || {})[_DYN_LOGGER ]);\n        }\n        return cookieMgr;\n    }\n    function createCookieMgr(rootConfig, logger) {\n        var _a;\n        var cookieMgrConfig;\n        var _path;\n        var _domain;\n        var unloadHandler;\n        var _enabled;\n        var _getCookieFn;\n        var _setCookieFn;\n        var _delCookieFn;\n        rootConfig = createDynamicConfig(rootConfig || _globalCookieConfig, null, logger).cfg;\n        unloadHandler = onConfigChange(rootConfig, function (details) {\n            details[_DYN_SET_DF ](details.cfg, rootDefaultConfig);\n            cookieMgrConfig = details.ref(details.cfg, \"cookieCfg\");\n            _path = cookieMgrConfig[STR_PATH ] || \"/\";\n            _domain = cookieMgrConfig[STR_DOMAIN ];\n            _enabled = _isCfgEnabled(rootConfig, cookieMgrConfig) !== false;\n            _getCookieFn = cookieMgrConfig.getCookie || _getCookieValue;\n            _setCookieFn = cookieMgrConfig.setCookie || _setCookieValue;\n            _delCookieFn = cookieMgrConfig.delCookie || _setCookieValue;\n        }, logger);\n        var cookieMgr = (_a = {\n                isEnabled: function () {\n                    var enabled = _isCfgEnabled(rootConfig, cookieMgrConfig) !== false && _enabled && areCookiesSupported(logger);\n                    var gblManager = _globalCookieConfig[strConfigCookieMgr];\n                    if (enabled && gblManager && cookieMgr !== gblManager) {\n                        enabled = _isMgrEnabled(gblManager);\n                    }\n                    return enabled;\n                },\n                setEnabled: function (value) {\n                    _enabled = value !== false;\n                    cookieMgrConfig[_DYN_ENABLED ] = value;\n                },\n                set: function (name, value, maxAgeSec, domain, path) {\n                    var result = false;\n                    if (_isMgrEnabled(cookieMgr) && !_isBlockedCookie(cookieMgrConfig, name)) {\n                        var values = {};\n                        var theValue = strTrim(value || STR_EMPTY);\n                        var idx = strIndexOf(theValue, \";\");\n                        if (idx !== -1) {\n                            theValue = strTrim(strLeft(value, idx));\n                            values = _extractParts(strSubstring(value, idx + 1));\n                        }\n                        setValue(values, STR_DOMAIN, domain || _domain, isTruthy, isUndefined);\n                        if (!isNullOrUndefined(maxAgeSec)) {\n                            var _isIE = isIE();\n                            if (isUndefined(values[strExpires])) {\n                                var nowMs = utcNow();\n                                var expireMs = nowMs + (maxAgeSec * 1000);\n                                if (expireMs > 0) {\n                                    var expiry = new Date();\n                                    expiry.setTime(expireMs);\n                                    setValue(values, strExpires, _formatDate(expiry, !_isIE ? strToUTCString : strToGMTString) || _formatDate(expiry, _isIE ? strToGMTString : strToUTCString) || STR_EMPTY, isTruthy);\n                                }\n                            }\n                            if (!_isIE) {\n                                setValue(values, \"max-age\", STR_EMPTY + maxAgeSec, null, isUndefined);\n                            }\n                        }\n                        var location_1 = getLocation();\n                        if (location_1 && location_1.protocol === \"https:\") {\n                            setValue(values, \"secure\", null, null, isUndefined);\n                            if (_allowUaSameSite === null) {\n                                _allowUaSameSite = !uaDisallowsSameSiteNone((getNavigator() || {})[_DYN_USER_AGENT ]);\n                            }\n                            if (_allowUaSameSite) {\n                                setValue(values, \"SameSite\", \"None\", null, isUndefined);\n                            }\n                        }\n                        setValue(values, STR_PATH, path || _path, null, isUndefined);\n                        _setCookieFn(name, _formatCookieValue(theValue, values));\n                        result = true;\n                    }\n                    return result;\n                },\n                get: function (name) {\n                    var value = STR_EMPTY;\n                    if (_isMgrEnabled(cookieMgr) && !_isIgnoredCookie(cookieMgrConfig, name)) {\n                        value = _getCookieFn(name);\n                    }\n                    return value;\n                },\n                del: function (name, path) {\n                    var result = false;\n                    if (_isMgrEnabled(cookieMgr)) {\n                        result = cookieMgr.purge(name, path);\n                    }\n                    return result;\n                },\n                purge: function (name, path) {\n                    var _a;\n                    var result = false;\n                    if (areCookiesSupported(logger)) {\n                        var values = (_a = {},\n                            _a[STR_PATH] = path ? path : \"/\",\n                            _a[strExpires] = \"Thu, 01 Jan 1970 00:00:01 GMT\",\n                            _a);\n                        if (!isIE()) {\n                            values[\"max-age\"] = \"0\";\n                        }\n                        _delCookieFn(name, _formatCookieValue(STR_EMPTY, values));\n                        result = true;\n                    }\n                    return result;\n                }\n            },\n            _a[_DYN_UNLOAD ] = function (isAsync) {\n                unloadHandler && unloadHandler.rm();\n                unloadHandler = null;\n            },\n            _a);\n        cookieMgr[strConfigCookieMgr] = cookieMgr;\n        return cookieMgr;\n    }\n    function areCookiesSupported(logger) {\n        if (_supportsCookies === null) {\n            _supportsCookies = false;\n            !_doc && _getDoc();\n            try {\n                var doc = _doc.v || {};\n                _supportsCookies = doc[strCookie] !== undefined;\n            }\n            catch (e) {\n                _throwInternal(logger, 2 , 68 , \"Cannot access document.cookie - \" + getExceptionName(e), { exception: dumpObj(e) });\n            }\n        }\n        return _supportsCookies;\n    }\n    function _extractParts(theValue) {\n        var values = {};\n        if (theValue && theValue[_DYN_LENGTH$5 ]) {\n            var parts = strTrim(theValue)[_DYN_SPLIT$1 ](\";\");\n            arrForEach(parts, function (thePart) {\n                thePart = strTrim(thePart || STR_EMPTY);\n                if (thePart) {\n                    var idx = strIndexOf(thePart, \"=\");\n                    if (idx === -1) {\n                        values[thePart] = null;\n                    }\n                    else {\n                        values[strTrim(strLeft(thePart, idx))] = strTrim(strSubstring(thePart, idx + 1));\n                    }\n                }\n            });\n        }\n        return values;\n    }\n    function _formatDate(theDate, func) {\n        if (isFunction(theDate[func])) {\n            return theDate[func]();\n        }\n        return null;\n    }\n    function _formatCookieValue(value, values) {\n        var cookieValue = value || STR_EMPTY;\n        objForEachKey(values, function (name, theValue) {\n            cookieValue += \"; \" + name + (!isNullOrUndefined(theValue) ? \"=\" + theValue : STR_EMPTY);\n        });\n        return cookieValue;\n    }\n    function _getCookieValue(name) {\n        var cookieValue = STR_EMPTY;\n        !_doc && _getDoc();\n        if (_doc.v) {\n            var theCookie = _doc.v[strCookie] || STR_EMPTY;\n            if (_parsedCookieValue !== theCookie) {\n                _cookieCache = _extractParts(theCookie);\n                _parsedCookieValue = theCookie;\n            }\n            cookieValue = strTrim(_cookieCache[name] || STR_EMPTY);\n        }\n        return cookieValue;\n    }\n    function _setCookieValue(name, cookieValue) {\n        !_doc && _getDoc();\n        if (_doc.v) {\n            _doc.v[strCookie] = name + \"=\" + cookieValue;\n        }\n    }\n    function uaDisallowsSameSiteNone(userAgent) {\n        if (!isString(userAgent)) {\n            return false;\n        }\n        if (strContains(userAgent, \"CPU iPhone OS 12\") || strContains(userAgent, \"iPad; CPU OS 12\")) {\n            return true;\n        }\n        if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strContains(userAgent, \"Version/\") && strContains(userAgent, \"Safari\")) {\n            return true;\n        }\n        if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strEndsWith(userAgent, \"AppleWebKit/605.1.15 (KHTML, like Gecko)\")) {\n            return true;\n        }\n        if (strContains(userAgent, \"Chrome/5\") || strContains(userAgent, \"Chrome/6\")) {\n            return true;\n        }\n        if (strContains(userAgent, \"UnrealEngine\") && !strContains(userAgent, \"Chrome\")) {\n            return true;\n        }\n        if (strContains(userAgent, \"UCBrowser/12\") || strContains(userAgent, \"UCBrowser/11\")) {\n            return true;\n        }\n        return false;\n    }\n\n    var defaultValues$2 = {\n        perfEvtsSendAll: false\n    };\n    function _runListeners(listeners, name, isAsync, callback) {\n        arrForEach(listeners, function (listener) {\n            if (listener && listener[name]) {\n                if (isAsync) {\n                    scheduleTimeout(function () { return callback(listener); }, 0);\n                }\n                else {\n                    try {\n                        callback(listener);\n                    }\n                    catch (e) {\n                    }\n                }\n            }\n        });\n    }\n    var NotificationManager = /** @class */ (function () {\n        function NotificationManager(config) {\n            this.listeners = [];\n            var perfEvtsSendAll;\n            var unloadHandler;\n            var _listeners = [];\n            var cfgHandler = createDynamicConfig(config, defaultValues$2);\n            unloadHandler = cfgHandler[_DYN_WATCH ](function (details) {\n                perfEvtsSendAll = !!details.cfg.perfEvtsSendAll;\n            });\n            dynamicProto(NotificationManager, this, function (_self) {\n                objDefine(_self, \"listeners\", {\n                    g: function () { return _listeners; }\n                });\n                _self[_DYN_ADD_NOTIFICATION_LIS1 ] = function (listener) {\n                    _listeners[_DYN_PUSH$1 ](listener);\n                };\n                _self[_DYN_REMOVE_NOTIFICATION_2 ] = function (listener) {\n                    var index = arrIndexOf(_listeners, listener);\n                    while (index > -1) {\n                        _listeners[_DYN_SPLICE ](index, 1);\n                        index = arrIndexOf(_listeners, listener);\n                    }\n                };\n                _self[STR_EVENTS_SENT ] = function (events) {\n                    _runListeners(_listeners, STR_EVENTS_SENT, true, function (listener) {\n                        listener[STR_EVENTS_SENT ](events);\n                    });\n                };\n                _self[STR_EVENTS_DISCARDED ] = function (events, reason) {\n                    _runListeners(_listeners, STR_EVENTS_DISCARDED, true, function (listener) {\n                        listener[STR_EVENTS_DISCARDED ](events, reason);\n                    });\n                };\n                _self[STR_EVENTS_SEND_REQUEST ] = function (sendReason, isAsync) {\n                    _runListeners(_listeners, STR_EVENTS_SEND_REQUEST, isAsync, function (listener) {\n                        listener[STR_EVENTS_SEND_REQUEST ](sendReason, isAsync);\n                    });\n                };\n                _self[STR_PERF_EVENT ] = function (perfEvent) {\n                    if (perfEvent) {\n                        if (perfEvtsSendAll || !perfEvent[_DYN_IS_CHILD_EVT ]()) {\n                            _runListeners(_listeners, STR_PERF_EVENT, false, function (listener) {\n                                if (perfEvent[_DYN_IS_ASYNC ]) {\n                                    scheduleTimeout(function () { return listener[STR_PERF_EVENT ](perfEvent); }, 0);\n                                }\n                                else {\n                                    listener[STR_PERF_EVENT ](perfEvent);\n                                }\n                            });\n                        }\n                    }\n                };\n                _self[_DYN_UNLOAD ] = function (isAsync) {\n                    var _finishUnload = function () {\n                        unloadHandler && unloadHandler.rm();\n                        unloadHandler = null;\n                        _listeners = [];\n                    };\n                    var waiting;\n                    _runListeners(_listeners, \"unload\", false, function (listener) {\n                        var asyncUnload = listener[_DYN_UNLOAD ](isAsync);\n                        if (asyncUnload) {\n                            if (!waiting) {\n                                waiting = [];\n                            }\n                            waiting[_DYN_PUSH$1 ](asyncUnload);\n                        }\n                    });\n                    if (waiting) {\n                        return createPromise(function (resolve) {\n                            return doAwaitResponse(createAllPromise(waiting), function () {\n                                _finishUnload();\n                                resolve();\n                            });\n                        });\n                    }\n                    else {\n                        _finishUnload();\n                    }\n                };\n            });\n        }\n        NotificationManager.__ieDyn=1;\n        return NotificationManager;\n    }());\n\n    var strExecutionContextKey = \"ctx\";\n    var strParentContextKey = \"ParentContextKey\";\n    var strChildrenContextKey = \"ChildrenContextKey\";\n    var _defaultPerfManager = null;\n    var PerfEvent = /** @class */ (function () {\n        function PerfEvent(name, payloadDetails, isAsync) {\n            var _self = this;\n            _self.start = utcNow();\n            _self[_DYN_NAME$3 ] = name;\n            _self[_DYN_IS_ASYNC ] = isAsync;\n            _self[_DYN_IS_CHILD_EVT ] = function () { return false; };\n            if (isFunction(payloadDetails)) {\n                var theDetails_1;\n                objDefine(_self, \"payload\", {\n                    g: function () {\n                        if (!theDetails_1 && isFunction(payloadDetails)) {\n                            theDetails_1 = payloadDetails();\n                            payloadDetails = null;\n                        }\n                        return theDetails_1;\n                    }\n                });\n            }\n            _self[_DYN_GET_CTX ] = function (key) {\n                if (key) {\n                    if (key === PerfEvent[strParentContextKey] || key === PerfEvent[strChildrenContextKey]) {\n                        return _self[key];\n                    }\n                    return (_self[strExecutionContextKey] || {})[key];\n                }\n                return null;\n            };\n            _self[_DYN_SET_CTX ] = function (key, value) {\n                if (key) {\n                    if (key === PerfEvent[strParentContextKey]) {\n                        if (!_self[key]) {\n                            _self[_DYN_IS_CHILD_EVT ] = function () { return true; };\n                        }\n                        _self[key] = value;\n                    }\n                    else if (key === PerfEvent[strChildrenContextKey]) {\n                        _self[key] = value;\n                    }\n                    else {\n                        var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                        ctx[key] = value;\n                    }\n                }\n            };\n            _self[_DYN_COMPLETE ] = function () {\n                var childTime = 0;\n                var childEvts = _self[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);\n                if (isArray(childEvts)) {\n                    for (var lp = 0; lp < childEvts[_DYN_LENGTH$5 ]; lp++) {\n                        var childEvt = childEvts[lp];\n                        if (childEvt) {\n                            childTime += childEvt[_DYN_TIME ];\n                        }\n                    }\n                }\n                _self[_DYN_TIME ] = utcNow() - _self.start;\n                _self.exTime = _self[_DYN_TIME ] - childTime;\n                _self[_DYN_COMPLETE ] = function () { };\n            };\n        }\n        PerfEvent.ParentContextKey = \"parent\";\n        PerfEvent.ChildrenContextKey = \"childEvts\";\n        return PerfEvent;\n    }());\n    var PerfManager = /** @class */ (function () {\n        function PerfManager(manager) {\n            this.ctx = {};\n            dynamicProto(PerfManager, this, function (_self) {\n                _self.create = function (src, payloadDetails, isAsync) {\n                    return new PerfEvent(src, payloadDetails, isAsync);\n                };\n                _self.fire = function (perfEvent) {\n                    if (perfEvent) {\n                        perfEvent[_DYN_COMPLETE ]();\n                        if (manager && isFunction(manager[STR_PERF_EVENT ])) {\n                            manager[STR_PERF_EVENT ](perfEvent);\n                        }\n                    }\n                };\n                _self[_DYN_SET_CTX ] = function (key, value) {\n                    if (key) {\n                        var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                        ctx[key] = value;\n                    }\n                };\n                _self[_DYN_GET_CTX ] = function (key) {\n                    return (_self[strExecutionContextKey] || {})[key];\n                };\n            });\n        }\n        PerfManager.__ieDyn=1;\n        return PerfManager;\n    }());\n    var doPerfActiveKey = \"CoreUtils.doPerf\";\n    function doPerf(mgrSource, getSource, func, details, isAsync) {\n        if (mgrSource) {\n            var perfMgr = mgrSource;\n            if (perfMgr[STR_GET_PERF_MGR]) {\n                perfMgr = perfMgr[STR_GET_PERF_MGR]();\n            }\n            if (perfMgr) {\n                var perfEvt = void 0;\n                var currentActive = perfMgr[_DYN_GET_CTX ](doPerfActiveKey);\n                try {\n                    perfEvt = perfMgr.create(getSource(), details, isAsync);\n                    if (perfEvt) {\n                        if (currentActive && perfEvt[_DYN_SET_CTX ]) {\n                            perfEvt[_DYN_SET_CTX ](PerfEvent[strParentContextKey], currentActive);\n                            if (currentActive[_DYN_GET_CTX ] && currentActive[_DYN_SET_CTX ]) {\n                                var children = currentActive[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);\n                                if (!children) {\n                                    children = [];\n                                    currentActive[_DYN_SET_CTX ](PerfEvent[strChildrenContextKey], children);\n                                }\n                                children[_DYN_PUSH$1 ](perfEvt);\n                            }\n                        }\n                        perfMgr[_DYN_SET_CTX ](doPerfActiveKey, perfEvt);\n                        return func(perfEvt);\n                    }\n                }\n                catch (ex) {\n                    if (perfEvt && perfEvt[_DYN_SET_CTX ]) {\n                        perfEvt[_DYN_SET_CTX ](\"exception\", ex);\n                    }\n                }\n                finally {\n                    if (perfEvt) {\n                        perfMgr.fire(perfEvt);\n                    }\n                    perfMgr[_DYN_SET_CTX ](doPerfActiveKey, currentActive);\n                }\n            }\n        }\n        return func();\n    }\n    function getGblPerfMgr() {\n        return _defaultPerfManager;\n    }\n\n    function generateW3CId() {\n        var hexValues = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\n        var oct = STR_EMPTY, tmp;\n        for (var a = 0; a < 4; a++) {\n            tmp = random32();\n            oct +=\n                hexValues[tmp & 0xF] +\n                    hexValues[tmp >> 4 & 0xF] +\n                    hexValues[tmp >> 8 & 0xF] +\n                    hexValues[tmp >> 12 & 0xF] +\n                    hexValues[tmp >> 16 & 0xF] +\n                    hexValues[tmp >> 20 & 0xF] +\n                    hexValues[tmp >> 24 & 0xF] +\n                    hexValues[tmp >> 28 & 0xF];\n        }\n        var clockSequenceHi = hexValues[8 + (random32() & 0x03) | 0];\n        return strSubstr(oct, 0, 8) + strSubstr(oct, 9, 4) + \"4\" + strSubstr(oct, 13, 3) + clockSequenceHi + strSubstr(oct, 16, 3) + strSubstr(oct, 19, 12);\n    }\n\n    var DEFAULT_VERSION = \"00\";\n    var INVALID_VERSION = \"ff\";\n    var INVALID_TRACE_ID = \"00000000000000000000000000000000\";\n    var INVALID_SPAN_ID = \"0000000000000000\";\n    function _isValid(value, len, invalidValue) {\n        if (value && value[_DYN_LENGTH$5 ] === len && value !== invalidValue) {\n            return !!value.match(/^[\\da-f]*$/i);\n        }\n        return false;\n    }\n    function _formatValue(value, len, defValue) {\n        if (_isValid(value, len)) {\n            return value;\n        }\n        return defValue;\n    }\n    function _formatFlags(value) {\n        if (isNaN(value) || value < 0 || value > 255) {\n            value = 0x01;\n        }\n        var result = value.toString(16);\n        while (result[_DYN_LENGTH$5 ] < 2) {\n            result = \"0\" + result;\n        }\n        return result;\n    }\n    function createTraceParent(traceId, spanId, flags, version) {\n        var _a;\n        return _a = {},\n            _a[_DYN_VERSION$1 ] = _isValid(version, 2, INVALID_VERSION) ? version : DEFAULT_VERSION,\n            _a[_DYN_TRACE_ID$2 ] = isValidTraceId(traceId) ? traceId : generateW3CId(),\n            _a[_DYN_SPAN_ID$1 ] = isValidSpanId(spanId) ? spanId : strLeft(generateW3CId(), 16),\n            _a.traceFlags = flags >= 0 && flags <= 0xFF ? flags : 1,\n            _a;\n    }\n    function isValidTraceId(value) {\n        return _isValid(value, 32, INVALID_TRACE_ID);\n    }\n    function isValidSpanId(value) {\n        return _isValid(value, 16, INVALID_SPAN_ID);\n    }\n    function formatTraceParent(value) {\n        if (value) {\n            var flags = _formatFlags(value[_DYN_TRACE_FLAGS$1 ]);\n            if (!_isValid(flags, 2)) {\n                flags = \"01\";\n            }\n            var version = value[_DYN_VERSION$1 ] || DEFAULT_VERSION;\n            if (version !== \"00\" && version !== \"ff\") {\n                version = DEFAULT_VERSION;\n            }\n            return \"\".concat(version.toLowerCase(), \"-\").concat(_formatValue(value.traceId, 32, INVALID_TRACE_ID).toLowerCase(), \"-\").concat(_formatValue(value.spanId, 16, INVALID_SPAN_ID).toLowerCase(), \"-\").concat(flags.toLowerCase());\n        }\n        return \"\";\n    }\n\n    var pluginStateData = createElmNodeData(\"plugin\");\n    function _getPluginState(plugin) {\n        return pluginStateData.get(plugin, \"state\", {}, true);\n    }\n    function initializePlugins(processContext, extensions) {\n        var initPlugins = [];\n        var lastPlugin = null;\n        var proxy = processContext[_DYN_GET_NEXT ]();\n        var pluginState;\n        while (proxy) {\n            var thePlugin = proxy[_DYN_GET_PLUGIN ]();\n            if (thePlugin) {\n                if (lastPlugin && lastPlugin[_DYN_SET_NEXT_PLUGIN ] && thePlugin[STR_PROCESS_TELEMETRY ]) {\n                    lastPlugin[_DYN_SET_NEXT_PLUGIN ](thePlugin);\n                }\n                pluginState = _getPluginState(thePlugin);\n                var isInitialized = !!pluginState[_DYN_IS_INITIALIZED ];\n                if (thePlugin[_DYN_IS_INITIALIZED ]) {\n                    isInitialized = thePlugin[_DYN_IS_INITIALIZED ]();\n                }\n                if (!isInitialized) {\n                    initPlugins[_DYN_PUSH$1 ](thePlugin);\n                }\n                lastPlugin = thePlugin;\n                proxy = proxy[_DYN_GET_NEXT ]();\n            }\n        }\n        arrForEach(initPlugins, function (thePlugin) {\n            var core = processContext[STR_CORE ]();\n            thePlugin[_DYN_INITIALIZE ](processContext.getCfg(), core, extensions, processContext[_DYN_GET_NEXT ]());\n            pluginState = _getPluginState(thePlugin);\n            if (!thePlugin[STR_CORE] && !pluginState[STR_CORE]) {\n                pluginState[STR_CORE] = core;\n            }\n            pluginState[_DYN_IS_INITIALIZED ] = true;\n            delete pluginState[_DYN_TEARDOWN ];\n        });\n    }\n    function sortPlugins(plugins) {\n        return plugins.sort(function (extA, extB) {\n            var result = 0;\n            if (extB) {\n                var bHasProcess = extB[STR_PROCESS_TELEMETRY];\n                if (extA[STR_PROCESS_TELEMETRY]) {\n                    result = bHasProcess ? extA[STR_PRIORITY] - extB[STR_PRIORITY] : 1;\n                }\n                else if (bHasProcess) {\n                    result = -1;\n                }\n            }\n            else {\n                result = extA ? 1 : -1;\n            }\n            return result;\n        });\n    }\n    function createDistributedTraceContext(parentCtx) {\n        var trace = {};\n        return {\n            getName: function () {\n                return trace[_DYN_NAME$3 ];\n            },\n            setName: function (newValue) {\n                parentCtx && parentCtx.setName(newValue);\n                trace[_DYN_NAME$3 ] = newValue;\n            },\n            getTraceId: function () {\n                return trace[_DYN_TRACE_ID$2 ];\n            },\n            setTraceId: function (newValue) {\n                parentCtx && parentCtx.setTraceId(newValue);\n                if (isValidTraceId(newValue)) {\n                    trace[_DYN_TRACE_ID$2 ] = newValue;\n                }\n            },\n            getSpanId: function () {\n                return trace[_DYN_SPAN_ID$1 ];\n            },\n            setSpanId: function (newValue) {\n                parentCtx && parentCtx.setSpanId(newValue);\n                if (isValidSpanId(newValue)) {\n                    trace[_DYN_SPAN_ID$1 ] = newValue;\n                }\n            },\n            getTraceFlags: function () {\n                return trace[_DYN_TRACE_FLAGS$1 ];\n            },\n            setTraceFlags: function (newTraceFlags) {\n                parentCtx && parentCtx.setTraceFlags(newTraceFlags);\n                trace[_DYN_TRACE_FLAGS$1 ] = newTraceFlags;\n            }\n        };\n    }\n\n    var strTelemetryPluginChain = \"TelemetryPluginChain\";\n    var strHasRunFlags = \"_hasRun\";\n    var strGetTelCtx = \"_getTelCtx\";\n    var _chainId = 0;\n    function _getNextProxyStart(proxy, core, startAt) {\n        while (proxy) {\n            if (proxy[_DYN_GET_PLUGIN ]() === startAt) {\n                return proxy;\n            }\n            proxy = proxy[_DYN_GET_NEXT ]();\n        }\n        return createTelemetryProxyChain([startAt], core.config || {}, core);\n    }\n    function _createInternalContext(telemetryChain, dynamicHandler, core, startAt) {\n        var _nextProxy = null;\n        var _onComplete = [];\n        if (!dynamicHandler) {\n            dynamicHandler = createDynamicConfig({}, null, core[_DYN_LOGGER ]);\n        }\n        if (startAt !== null) {\n            _nextProxy = startAt ? _getNextProxyStart(telemetryChain, core, startAt) : telemetryChain;\n        }\n        var context = {\n            _next: _moveNext,\n            ctx: {\n                core: function () {\n                    return core;\n                },\n                diagLog: function () {\n                    return safeGetLogger(core, dynamicHandler.cfg);\n                },\n                getCfg: function () {\n                    return dynamicHandler.cfg;\n                },\n                getExtCfg: _resolveExtCfg,\n                getConfig: _getConfig,\n                hasNext: function () {\n                    return !!_nextProxy;\n                },\n                getNext: function () {\n                    return _nextProxy;\n                },\n                setNext: function (nextPlugin) {\n                    _nextProxy = nextPlugin;\n                },\n                iterate: _iterateChain,\n                onComplete: _addOnComplete\n            }\n        };\n        function _addOnComplete(onComplete, that) {\n            var args = [];\n            for (var _i = 2; _i < arguments.length; _i++) {\n                args[_i - 2] = arguments[_i];\n            }\n            if (onComplete) {\n                _onComplete[_DYN_PUSH$1 ]({\n                    func: onComplete,\n                    self: !isUndefined(that) ? that : context.ctx,\n                    args: args\n                });\n            }\n        }\n        function _moveNext() {\n            var nextProxy = _nextProxy;\n            _nextProxy = nextProxy ? nextProxy[_DYN_GET_NEXT ]() : null;\n            if (!nextProxy) {\n                var onComplete = _onComplete;\n                if (onComplete && onComplete[_DYN_LENGTH$5 ] > 0) {\n                    arrForEach(onComplete, function (completeDetails) {\n                        try {\n                            completeDetails.func.call(completeDetails.self, completeDetails.args);\n                        }\n                        catch (e) {\n                            _throwInternal(core[_DYN_LOGGER ], 2 , 73 , \"Unexpected Exception during onComplete - \" + dumpObj(e));\n                        }\n                    });\n                    _onComplete = [];\n                }\n            }\n            return nextProxy;\n        }\n        function _getExtCfg(identifier, createIfMissing) {\n            var idCfg = null;\n            var cfg = dynamicHandler.cfg;\n            if (cfg && identifier) {\n                var extCfg = cfg[STR_EXTENSION_CONFIG ];\n                if (!extCfg && createIfMissing) {\n                    extCfg = {};\n                }\n                cfg[STR_EXTENSION_CONFIG] = extCfg;\n                extCfg = dynamicHandler.ref(cfg, STR_EXTENSION_CONFIG);\n                if (extCfg) {\n                    idCfg = extCfg[identifier];\n                    if (!idCfg && createIfMissing) {\n                        idCfg = {};\n                    }\n                    extCfg[identifier] = idCfg;\n                    idCfg = dynamicHandler.ref(extCfg, identifier);\n                }\n            }\n            return idCfg;\n        }\n        function _resolveExtCfg(identifier, defaultValues) {\n            var newConfig = _getExtCfg(identifier, true);\n            if (defaultValues) {\n                objForEachKey(defaultValues, function (field, defaultValue) {\n                    if (isNullOrUndefined(newConfig[field])) {\n                        var cfgValue = dynamicHandler.cfg[field];\n                        if (cfgValue || !isNullOrUndefined(cfgValue)) {\n                            newConfig[field] = cfgValue;\n                        }\n                    }\n                    _applyDefaultValue(dynamicHandler, newConfig, field, defaultValue);\n                });\n            }\n            return dynamicHandler[_DYN_SET_DF ](newConfig, defaultValues);\n        }\n        function _getConfig(identifier, field, defaultValue) {\n            if (defaultValue === void 0) { defaultValue = false; }\n            var theValue;\n            var extConfig = _getExtCfg(identifier, false);\n            var rootConfig = dynamicHandler.cfg;\n            if (extConfig && (extConfig[field] || !isNullOrUndefined(extConfig[field]))) {\n                theValue = extConfig[field];\n            }\n            else if (rootConfig[field] || !isNullOrUndefined(rootConfig[field])) {\n                theValue = rootConfig[field];\n            }\n            return (theValue || !isNullOrUndefined(theValue)) ? theValue : defaultValue;\n        }\n        function _iterateChain(cb) {\n            var nextPlugin;\n            while (!!(nextPlugin = context._next())) {\n                var plugin = nextPlugin[_DYN_GET_PLUGIN ]();\n                if (plugin) {\n                    cb(plugin);\n                }\n            }\n        }\n        return context;\n    }\n    function createProcessTelemetryContext(telemetryChain, cfg, core, startAt) {\n        var config = createDynamicConfig(cfg);\n        var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n        var context = internalContext.ctx;\n        function _processNext(env) {\n            var nextPlugin = internalContext._next();\n            if (nextPlugin) {\n                nextPlugin[STR_PROCESS_TELEMETRY ](env, context);\n            }\n            return !nextPlugin;\n        }\n        function _createNew(plugins, startAt) {\n            if (plugins === void 0) { plugins = null; }\n            if (isArray(plugins)) {\n                plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n            }\n            return createProcessTelemetryContext(plugins || context[_DYN_GET_NEXT ](), config.cfg, core, startAt);\n        }\n        context[_DYN_PROCESS_NEXT ] = _processNext;\n        context[_DYN_CREATE_NEW$1 ] = _createNew;\n        return context;\n    }\n    function createProcessTelemetryUnloadContext(telemetryChain, core, startAt) {\n        var config = createDynamicConfig(core.config);\n        var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n        var context = internalContext.ctx;\n        function _processNext(unloadState) {\n            var nextPlugin = internalContext._next();\n            nextPlugin && nextPlugin[_DYN_UNLOAD ](context, unloadState);\n            return !nextPlugin;\n        }\n        function _createNew(plugins, startAt) {\n            if (plugins === void 0) { plugins = null; }\n            if (isArray(plugins)) {\n                plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n            }\n            return createProcessTelemetryUnloadContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);\n        }\n        context[_DYN_PROCESS_NEXT ] = _processNext;\n        context[_DYN_CREATE_NEW$1 ] = _createNew;\n        return context;\n    }\n    function createProcessTelemetryUpdateContext(telemetryChain, core, startAt) {\n        var config = createDynamicConfig(core.config);\n        var internalContext = _createInternalContext(telemetryChain, config, core, startAt);\n        var context = internalContext.ctx;\n        function _processNext(updateState) {\n            return context.iterate(function (plugin) {\n                if (isFunction(plugin[_DYN_UPDATE$1 ])) {\n                    plugin[_DYN_UPDATE$1 ](context, updateState);\n                }\n            });\n        }\n        function _createNew(plugins, startAt) {\n            if (plugins === void 0) { plugins = null; }\n            if (isArray(plugins)) {\n                plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n            }\n            return createProcessTelemetryUpdateContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);\n        }\n        context[_DYN_PROCESS_NEXT ] = _processNext;\n        context[_DYN_CREATE_NEW$1 ] = _createNew;\n        return context;\n    }\n    function createTelemetryProxyChain(plugins, config, core, startAt) {\n        var firstProxy = null;\n        var add = startAt ? false : true;\n        if (isArray(plugins) && plugins[_DYN_LENGTH$5 ] > 0) {\n            var lastProxy_1 = null;\n            arrForEach(plugins, function (thePlugin) {\n                if (!add && startAt === thePlugin) {\n                    add = true;\n                }\n                if (add && thePlugin && isFunction(thePlugin[STR_PROCESS_TELEMETRY ])) {\n                    var newProxy = createTelemetryPluginProxy(thePlugin, config, core);\n                    if (!firstProxy) {\n                        firstProxy = newProxy;\n                    }\n                    if (lastProxy_1) {\n                        lastProxy_1._setNext(newProxy);\n                    }\n                    lastProxy_1 = newProxy;\n                }\n            });\n        }\n        if (startAt && !firstProxy) {\n            return createTelemetryProxyChain([startAt], config, core);\n        }\n        return firstProxy;\n    }\n    function createTelemetryPluginProxy(plugin, config, core) {\n        var nextProxy = null;\n        var hasProcessTelemetry = isFunction(plugin[STR_PROCESS_TELEMETRY ]);\n        var hasSetNext = isFunction(plugin[_DYN_SET_NEXT_PLUGIN ]);\n        var chainId;\n        if (plugin) {\n            chainId = plugin[_DYN_IDENTIFIER ] + \"-\" + plugin[STR_PRIORITY ] + \"-\" + _chainId++;\n        }\n        else {\n            chainId = \"Unknown-0-\" + _chainId++;\n        }\n        var proxyChain = {\n            getPlugin: function () {\n                return plugin;\n            },\n            getNext: function () {\n                return nextProxy;\n            },\n            processTelemetry: _processTelemetry,\n            unload: _unloadPlugin,\n            update: _updatePlugin,\n            _id: chainId,\n            _setNext: function (nextPlugin) {\n                nextProxy = nextPlugin;\n            }\n        };\n        function _getTelCtx() {\n            var itemCtx;\n            if (plugin && isFunction(plugin[strGetTelCtx])) {\n                itemCtx = plugin[strGetTelCtx]();\n            }\n            if (!itemCtx) {\n                itemCtx = createProcessTelemetryContext(proxyChain, config, core);\n            }\n            return itemCtx;\n        }\n        function _processChain(itemCtx, processPluginFn, name, details, isAsync) {\n            var hasRun = false;\n            var identifier = plugin ? plugin[_DYN_IDENTIFIER ] : strTelemetryPluginChain;\n            var hasRunContext = itemCtx[strHasRunFlags];\n            if (!hasRunContext) {\n                hasRunContext = itemCtx[strHasRunFlags] = {};\n            }\n            itemCtx.setNext(nextProxy);\n            if (plugin) {\n                doPerf(itemCtx[STR_CORE ](), function () { return identifier + \":\" + name; }, function () {\n                    hasRunContext[chainId] = true;\n                    try {\n                        var nextId = nextProxy ? nextProxy._id : STR_EMPTY;\n                        if (nextId) {\n                            hasRunContext[nextId] = false;\n                        }\n                        hasRun = processPluginFn(itemCtx);\n                    }\n                    catch (error) {\n                        var hasNextRun = nextProxy ? hasRunContext[nextProxy._id] : true;\n                        if (hasNextRun) {\n                            hasRun = true;\n                        }\n                        if (!nextProxy || !hasNextRun) {\n                            _throwInternal(itemCtx[_DYN_DIAG_LOG$2 ](), 1 , 73 , \"Plugin [\" + identifier + \"] failed during \" + name + \" - \" + dumpObj(error) + \", run flags: \" + dumpObj(hasRunContext));\n                        }\n                    }\n                }, details, isAsync);\n            }\n            return hasRun;\n        }\n        function _processTelemetry(env, itemCtx) {\n            itemCtx = itemCtx || _getTelCtx();\n            function _callProcessTelemetry(itemCtx) {\n                if (!plugin || !hasProcessTelemetry) {\n                    return false;\n                }\n                var pluginState = _getPluginState(plugin);\n                if (pluginState[_DYN_TEARDOWN ] || pluginState[STR_DISABLED]) {\n                    return false;\n                }\n                if (hasSetNext) {\n                    plugin[_DYN_SET_NEXT_PLUGIN ](nextProxy);\n                }\n                plugin[STR_PROCESS_TELEMETRY ](env, itemCtx);\n                return true;\n            }\n            if (!_processChain(itemCtx, _callProcessTelemetry, \"processTelemetry\", function () { return ({ item: env }); }, !(env.sync))) {\n                itemCtx[_DYN_PROCESS_NEXT ](env);\n            }\n        }\n        function _unloadPlugin(unloadCtx, unloadState) {\n            function _callTeardown() {\n                var hasRun = false;\n                if (plugin) {\n                    var pluginState = _getPluginState(plugin);\n                    var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];\n                    if (plugin && (!pluginCore || pluginCore === unloadCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {\n                        pluginState[STR_CORE ] = null;\n                        pluginState[_DYN_TEARDOWN ] = true;\n                        pluginState[_DYN_IS_INITIALIZED ] = false;\n                        if (plugin[_DYN_TEARDOWN ] && plugin[_DYN_TEARDOWN ](unloadCtx, unloadState) === true) {\n                            hasRun = true;\n                        }\n                    }\n                }\n                return hasRun;\n            }\n            if (!_processChain(unloadCtx, _callTeardown, \"unload\", function () { }, unloadState[_DYN_IS_ASYNC ])) {\n                unloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n            }\n        }\n        function _updatePlugin(updateCtx, updateState) {\n            function _callUpdate() {\n                var hasRun = false;\n                if (plugin) {\n                    var pluginState = _getPluginState(plugin);\n                    var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];\n                    if (plugin && (!pluginCore || pluginCore === updateCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {\n                        if (plugin[_DYN_UPDATE$1 ] && plugin[_DYN_UPDATE$1 ](updateCtx, updateState) === true) {\n                            hasRun = true;\n                        }\n                    }\n                }\n                return hasRun;\n            }\n            if (!_processChain(updateCtx, _callUpdate, \"update\", function () { }, false)) {\n                updateCtx[_DYN_PROCESS_NEXT ](updateState);\n            }\n        }\n        return objFreeze(proxyChain);\n    }\n\n    function createUnloadHandlerContainer() {\n        var handlers = [];\n        function _addHandler(handler) {\n            if (handler) {\n                handlers[_DYN_PUSH$1 ](handler);\n            }\n        }\n        function _runHandlers(unloadCtx, unloadState) {\n            arrForEach(handlers, function (handler) {\n                try {\n                    handler(unloadCtx, unloadState);\n                }\n                catch (e) {\n                    _throwInternal(unloadCtx[_DYN_DIAG_LOG$2 ](), 2 , 73 , \"Unexpected error calling unload handler - \" + dumpObj(e));\n                }\n            });\n            handlers = [];\n        }\n        return {\n            add: _addHandler,\n            run: _runHandlers\n        };\n    }\n\n    function createUnloadHookContainer() {\n        var _hooks = [];\n        function _doUnload(logger) {\n            var oldHooks = _hooks;\n            _hooks = [];\n            arrForEach(oldHooks, function (fn) {\n                try {\n                    (fn.rm || fn.remove).call(fn);\n                }\n                catch (e) {\n                    _throwInternal(logger, 2 , 73 , \"Unloading:\" + dumpObj(e));\n                }\n            });\n        }\n        function _addHook(hooks) {\n            if (hooks) {\n                arrAppend(_hooks, hooks);\n            }\n        }\n        return {\n            run: _doUnload,\n            add: _addHook\n        };\n    }\n\n    var _a$6;\n    var strGetPlugin = \"getPlugin\";\n    var defaultValues$1 = (_a$6 = {},\n        _a$6[STR_EXTENSION_CONFIG] = { isVal: isNotNullOrUndefined, v: {} },\n        _a$6);\n    var BaseTelemetryPlugin = /** @class */ (function () {\n        function BaseTelemetryPlugin() {\n            var _self = this;\n            var _isinitialized;\n            var _rootCtx;\n            var _nextPlugin;\n            var _unloadHandlerContainer;\n            var _hookContainer;\n            _initDefaults();\n            dynamicProto(BaseTelemetryPlugin, _self, function (_self) {\n                _self[_DYN_INITIALIZE ] = function (config, core, extensions, pluginChain) {\n                    _setDefaults(config, core, pluginChain);\n                    _isinitialized = true;\n                };\n                _self[_DYN_TEARDOWN ] = function (unloadCtx, unloadState) {\n                    var _a;\n                    var core = _self[STR_CORE ];\n                    if (!core || (unloadCtx && core !== unloadCtx[STR_CORE ]())) {\n                        return;\n                    }\n                    var result;\n                    var unloadDone = false;\n                    var theUnloadCtx = unloadCtx || createProcessTelemetryUnloadContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                    var theUnloadState = unloadState || (_a = {\n                            reason: 0\n                        },\n                        _a[_DYN_IS_ASYNC ] = false,\n                        _a);\n                    function _unloadCallback() {\n                        if (!unloadDone) {\n                            unloadDone = true;\n                            _unloadHandlerContainer.run(theUnloadCtx, unloadState);\n                            _hookContainer.run(theUnloadCtx[_DYN_DIAG_LOG$2 ]());\n                            if (result === true) {\n                                theUnloadCtx[_DYN_PROCESS_NEXT ](theUnloadState);\n                            }\n                            _initDefaults();\n                        }\n                    }\n                    if (!_self[_DYN__DO_TEARDOWN ] || _self[_DYN__DO_TEARDOWN ](theUnloadCtx, theUnloadState, _unloadCallback) !== true) {\n                        _unloadCallback();\n                    }\n                    else {\n                        result = true;\n                    }\n                    return result;\n                };\n                _self[_DYN_UPDATE$1 ] = function (updateCtx, updateState) {\n                    var core = _self[STR_CORE ];\n                    if (!core || (updateCtx && core !== updateCtx[STR_CORE ]())) {\n                        return;\n                    }\n                    var result;\n                    var updateDone = false;\n                    var theUpdateCtx = updateCtx || createProcessTelemetryUpdateContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                    var theUpdateState = updateState || {\n                        reason: 0\n                    };\n                    function _updateCallback() {\n                        if (!updateDone) {\n                            updateDone = true;\n                            _setDefaults(theUpdateCtx.getCfg(), theUpdateCtx.core(), theUpdateCtx[_DYN_GET_NEXT ]());\n                        }\n                    }\n                    if (!_self._doUpdate || _self._doUpdate(theUpdateCtx, theUpdateState, _updateCallback) !== true) {\n                        _updateCallback();\n                    }\n                    else {\n                        result = true;\n                    }\n                    return result;\n                };\n                proxyFunctionAs(_self, \"_addUnloadCb\", function () { return _unloadHandlerContainer; }, \"add\");\n                proxyFunctionAs(_self, \"_addHook\", function () { return _hookContainer; }, \"add\");\n                objDefine(_self, \"_unloadHooks\", { g: function () { return _hookContainer; } });\n            });\n            _self[_DYN_DIAG_LOG$2 ] = function (itemCtx) {\n                return _getTelCtx(itemCtx)[_DYN_DIAG_LOG$2 ]();\n            };\n            _self[_DYN_IS_INITIALIZED ] = function () {\n                return _isinitialized;\n            };\n            _self.setInitialized = function (isInitialized) {\n                _isinitialized = isInitialized;\n            };\n            _self[_DYN_SET_NEXT_PLUGIN ] = function (next) {\n                _nextPlugin = next;\n            };\n            _self[_DYN_PROCESS_NEXT ] = function (env, itemCtx) {\n                if (itemCtx) {\n                    itemCtx[_DYN_PROCESS_NEXT ](env);\n                }\n                else if (_nextPlugin && isFunction(_nextPlugin[STR_PROCESS_TELEMETRY ])) {\n                    _nextPlugin[STR_PROCESS_TELEMETRY ](env, null);\n                }\n            };\n            _self._getTelCtx = _getTelCtx;\n            function _getTelCtx(currentCtx) {\n                if (currentCtx === void 0) { currentCtx = null; }\n                var itemCtx = currentCtx;\n                if (!itemCtx) {\n                    var rootCtx = _rootCtx || createProcessTelemetryContext(null, {}, _self[STR_CORE ]);\n                    if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                        itemCtx = rootCtx[_DYN_CREATE_NEW$1 ](null, _nextPlugin[strGetPlugin]);\n                    }\n                    else {\n                        itemCtx = rootCtx[_DYN_CREATE_NEW$1 ](null, _nextPlugin);\n                    }\n                }\n                return itemCtx;\n            }\n            function _setDefaults(config, core, pluginChain) {\n                createDynamicConfig(config, defaultValues$1, safeGetLogger(core));\n                if (!pluginChain && core) {\n                    pluginChain = core[_DYN_GET_PROCESS_TEL_CONT0 ]()[_DYN_GET_NEXT ]();\n                }\n                var nextPlugin = _nextPlugin;\n                if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                    nextPlugin = _nextPlugin[strGetPlugin]();\n                }\n                _self[STR_CORE ] = core;\n                _rootCtx = createProcessTelemetryContext(pluginChain, config, core, nextPlugin);\n            }\n            function _initDefaults() {\n                _isinitialized = false;\n                _self[STR_CORE ] = null;\n                _rootCtx = null;\n                _nextPlugin = null;\n                _hookContainer = createUnloadHookContainer();\n                _unloadHandlerContainer = createUnloadHandlerContainer();\n            }\n        }\n        BaseTelemetryPlugin.__ieDyn=1;\n        return BaseTelemetryPlugin;\n    }());\n\n    function _addInitializer(_initializers, id, telemetryInitializer) {\n        var theInitializer = {\n            id: id,\n            fn: telemetryInitializer\n        };\n        arrAppend(_initializers, theInitializer);\n        var handler = {\n            remove: function () {\n                arrForEach(_initializers, function (initializer, idx) {\n                    if (initializer.id === theInitializer.id) {\n                        _initializers[_DYN_SPLICE ](idx, 1);\n                        return -1;\n                    }\n                });\n            }\n        };\n        return handler;\n    }\n    function _runInitializers(_initializers, item, logger) {\n        var doNotSendItem = false;\n        var telemetryInitializersCount = _initializers[_DYN_LENGTH$5 ];\n        for (var i = 0; i < telemetryInitializersCount; ++i) {\n            var telemetryInitializer = _initializers[i];\n            if (telemetryInitializer) {\n                try {\n                    if (telemetryInitializer.fn[_DYN_APPLY ](null, [item]) === false) {\n                        doNotSendItem = true;\n                        break;\n                    }\n                }\n                catch (e) {\n                    _throwInternal(logger, 2 , 64 , \"Telemetry initializer failed: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n                }\n            }\n        }\n        return !doNotSendItem;\n    }\n    var TelemetryInitializerPlugin = /** @class */ (function (_super) {\n        __extendsFn(TelemetryInitializerPlugin, _super);\n        function TelemetryInitializerPlugin() {\n            var _this = _super.call(this) || this;\n            _this.identifier = \"TelemetryInitializerPlugin\";\n            _this.priority = 199;\n            var _id;\n            var _initializers;\n            _initDefaults();\n            dynamicProto(TelemetryInitializerPlugin, _this, function (_self, _base) {\n                _self.addTelemetryInitializer = function (telemetryInitializer) {\n                    return _addInitializer(_initializers, _id++, telemetryInitializer);\n                };\n                _self[STR_PROCESS_TELEMETRY ] = function (item, itemCtx) {\n                    if (_runInitializers(_initializers, item, itemCtx ? itemCtx[_DYN_DIAG_LOG$2 ]() : _self[_DYN_DIAG_LOG$2 ]())) {\n                        _self[_DYN_PROCESS_NEXT ](item, itemCtx);\n                    }\n                };\n                _self[_DYN__DO_TEARDOWN ] = function () {\n                    _initDefaults();\n                };\n            });\n            function _initDefaults() {\n                _id = 0;\n                _initializers = [];\n            }\n            return _this;\n        }\n        TelemetryInitializerPlugin.__ieDyn=1;\n        return TelemetryInitializerPlugin;\n    }(BaseTelemetryPlugin));\n\n    var _a$5;\n    var strValidationError = \"Plugins must provide initialize method\";\n    var strNotificationManager = \"_notificationManager\";\n    var strSdkUnloadingError = \"SDK is still unloading...\";\n    var strSdkNotInitialized = \"SDK is not initialized\";\n    var defaultConfig = objDeepFreeze((_a$5 = {\n            cookieCfg: {}\n        },\n        _a$5[STR_EXTENSIONS] = { rdOnly: true, ref: true, v: [] },\n        _a$5[STR_CHANNELS] = { rdOnly: true, ref: true, v: [] },\n        _a$5[STR_EXTENSION_CONFIG] = { ref: true, v: {} },\n        _a$5[STR_CREATE_PERF_MGR] = UNDEFINED_VALUE$2,\n        _a$5.loggingLevelConsole = 0 ,\n        _a$5.diagnosticLogInterval = UNDEFINED_VALUE$2,\n        _a$5));\n    function _createPerfManager(core, notificationMgr) {\n        return new PerfManager(notificationMgr);\n    }\n    function _validateExtensions(logger, channelPriority, allExtensions) {\n        var _a;\n        var coreExtensions = [];\n        var channels = [];\n        var extPriorities = {};\n        arrForEach(allExtensions, function (ext) {\n            if (isNullOrUndefined(ext) || isNullOrUndefined(ext[_DYN_INITIALIZE ])) {\n                throwError(strValidationError);\n            }\n            var extPriority = ext[STR_PRIORITY ];\n            var identifier = ext[_DYN_IDENTIFIER ];\n            if (ext && extPriority) {\n                if (!isNullOrUndefined(extPriorities[extPriority])) {\n                    _warnToConsole(logger, \"Two extensions have same priority #\" + extPriority + \" - \" + extPriorities[extPriority] + \", \" + identifier);\n                }\n                else {\n                    extPriorities[extPriority] = identifier;\n                }\n            }\n            if (!extPriority || extPriority < channelPriority) {\n                coreExtensions[_DYN_PUSH$1 ](ext);\n            }\n            else {\n                channels[_DYN_PUSH$1 ](ext);\n            }\n        });\n        return _a = {},\n            _a[STR_CORE ] = coreExtensions,\n            _a[STR_CHANNELS ] = channels,\n            _a;\n    }\n    function _isPluginPresent(thePlugin, plugins) {\n        var exists = false;\n        arrForEach(plugins, function (plugin) {\n            if (plugin === thePlugin) {\n                exists = true;\n                return -1;\n            }\n        });\n        return exists;\n    }\n    function _deepMergeConfig(details, target, newValues, merge) {\n        if (newValues) {\n            objForEachKey(newValues, function (key, value) {\n                if (merge) {\n                    if (isPlainObject(value) && isPlainObject(target[key])) {\n                        _deepMergeConfig(details, target[key], value, merge);\n                    }\n                }\n                if (merge && isPlainObject(value) && isPlainObject(target[key])) {\n                    _deepMergeConfig(details, target[key], value, merge);\n                }\n                else {\n                    details.set(target, key, value);\n                }\n            });\n        }\n    }\n    function _findWatcher(listeners, newWatcher) {\n        var theListener = null;\n        var idx = -1;\n        arrForEach(listeners, function (listener, lp) {\n            if (listener.w === newWatcher) {\n                theListener = listener;\n                idx = lp;\n                return -1;\n            }\n        });\n        return { i: idx, l: theListener };\n    }\n    function _addDelayedCfgListener(listeners, newWatcher) {\n        var theListener = _findWatcher(listeners, newWatcher).l;\n        if (!theListener) {\n            theListener = {\n                w: newWatcher,\n                rm: function () {\n                    var fnd = _findWatcher(listeners, newWatcher);\n                    if (fnd.i !== -1) {\n                        listeners[_DYN_SPLICE ](fnd.i, 1);\n                    }\n                }\n            };\n            listeners[_DYN_PUSH$1 ](theListener);\n        }\n        return theListener;\n    }\n    function _registerDelayedCfgListener(config, listeners, logger) {\n        arrForEach(listeners, function (listener) {\n            var unloadHdl = onConfigChange(config, listener.w, logger);\n            delete listener.w;\n            listener.rm = function () {\n                unloadHdl.rm();\n            };\n        });\n    }\n    var AppInsightsCore = /** @class */ (function () {\n        function AppInsightsCore() {\n            var _configHandler;\n            var _isInitialized;\n            var _logger;\n            var _eventQueue;\n            var _notificationManager;\n            var _perfManager;\n            var _cfgPerfManager;\n            var _cookieManager;\n            var _pluginChain;\n            var _configExtensions;\n            var _channelConfig;\n            var _channels;\n            var _isUnloading;\n            var _telemetryInitializerPlugin;\n            var _internalLogsEventName;\n            var _evtNamespace;\n            var _unloadHandlers;\n            var _hookContainer;\n            var _debugListener;\n            var _traceCtx;\n            var _instrumentationKey;\n            var _cfgListeners;\n            var _extensions;\n            var _pluginVersionStringArr;\n            var _pluginVersionString;\n            var _internalLogPoller;\n            var _internalLogPollerListening;\n            var _forceStopInternalLogPoller;\n            dynamicProto(AppInsightsCore, this, function (_self) {\n                _initDefaults();\n                _self[\"_getDbgPlgTargets\"] = function () {\n                    return [_extensions];\n                };\n                _self[_DYN_IS_INITIALIZED ] = function () { return _isInitialized; };\n                _self[_DYN_INITIALIZE ] = function (config, extensions, logger, notificationManager) {\n                    if (_isUnloading) {\n                        throwError(strSdkUnloadingError);\n                    }\n                    if (_self[_DYN_IS_INITIALIZED ]()) {\n                        throwError(\"Core cannot be initialized more than once\");\n                    }\n                    _configHandler = createDynamicConfig(config, defaultConfig, logger || _self[_DYN_LOGGER ], false);\n                    config = _configHandler.cfg;\n                    _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                        _instrumentationKey = details.cfg.instrumentationKey;\n                        var extCfg = details.ref(details.cfg, STR_EXTENSION_CONFIG);\n                        objForEachKey(extCfg, function (key) {\n                            details.ref(extCfg, key);\n                        });\n                        if (isNullOrUndefined(_instrumentationKey)) {\n                            throwError(\"Please provide instrumentation key\");\n                        }\n                    }));\n                    _notificationManager = notificationManager;\n                    _initDebugListener();\n                    _initPerfManager();\n                    _self[_DYN_LOGGER ] = logger;\n                    var cfgExtensions = config[STR_EXTENSIONS ];\n                    _configExtensions = [];\n                    _configExtensions[_DYN_PUSH$1 ].apply(_configExtensions, __spreadArrayFn(__spreadArrayFn([], extensions, false), cfgExtensions));\n                    _channelConfig = config[STR_CHANNELS ];\n                    _initPluginChain(null);\n                    if (!_channels || _channels[_DYN_LENGTH$5 ] === 0) {\n                        throwError(\"No \" + STR_CHANNELS + \" available\");\n                    }\n                    if (_channelConfig && _channelConfig[_DYN_LENGTH$5 ] > 1) {\n                        var teeController = _self[_DYN_GET_PLUGIN ](\"TeeChannelController\");\n                        if (!teeController || !teeController.plugin) {\n                            _throwInternal(_logger, 1 , 28 , \"TeeChannel required\");\n                        }\n                    }\n                    _registerDelayedCfgListener(config, _cfgListeners, _logger);\n                    _cfgListeners = null;\n                    _isInitialized = true;\n                    _self.releaseQueue();\n                    _self[_DYN_POLL_INTERNAL_LOGS ]();\n                };\n                _self.getChannels = function () {\n                    var controls = [];\n                    if (_channels) {\n                        arrForEach(_channels, function (channel) {\n                            controls[_DYN_PUSH$1 ](channel);\n                        });\n                    }\n                    return objFreeze(controls);\n                };\n                _self.track = function (telemetryItem) {\n                    doPerf(_self[STR_GET_PERF_MGR ](), function () { return \"AppInsightsCore:track\"; }, function () {\n                        if (telemetryItem === null) {\n                            _notifyInvalidEvent(telemetryItem);\n                            throwError(\"Invalid telemetry item\");\n                        }\n                        if (!telemetryItem[_DYN_NAME$3 ] && isNullOrUndefined(telemetryItem[_DYN_NAME$3 ])) {\n                            _notifyInvalidEvent(telemetryItem);\n                            throwError(\"telemetry name required\");\n                        }\n                        telemetryItem.iKey = telemetryItem.iKey || _instrumentationKey;\n                        telemetryItem[_DYN_TIME ] = telemetryItem[_DYN_TIME ] || toISOString(new Date());\n                        telemetryItem.ver = telemetryItem.ver || \"4.0\";\n                        if (!_isUnloading && _self[_DYN_IS_INITIALIZED ]()) {\n                            _createTelCtx()[_DYN_PROCESS_NEXT ](telemetryItem);\n                        }\n                        else {\n                            _eventQueue[_DYN_PUSH$1 ](telemetryItem);\n                        }\n                    }, function () { return ({ item: telemetryItem }); }, !(telemetryItem.sync));\n                };\n                _self[_DYN_GET_PROCESS_TEL_CONT0 ] = _createTelCtx;\n                _self[_DYN_GET_NOTIFY_MGR ] = function () {\n                    if (!_notificationManager) {\n                        _notificationManager = new NotificationManager(_configHandler.cfg);\n                        _self[strNotificationManager] = _notificationManager;\n                    }\n                    return _notificationManager;\n                };\n                _self[_DYN_ADD_NOTIFICATION_LIS1 ] = function (listener) {\n                    _self[_DYN_GET_NOTIFY_MGR ]()[_DYN_ADD_NOTIFICATION_LIS1 ](listener);\n                };\n                _self[_DYN_REMOVE_NOTIFICATION_2 ] = function (listener) {\n                    if (_notificationManager) {\n                        _notificationManager[_DYN_REMOVE_NOTIFICATION_2 ](listener);\n                    }\n                };\n                _self.getCookieMgr = function () {\n                    if (!_cookieManager) {\n                        _cookieManager = createCookieMgr(_configHandler.cfg, _self[_DYN_LOGGER ]);\n                    }\n                    return _cookieManager;\n                };\n                _self.setCookieMgr = function (cookieMgr) {\n                    if (_cookieManager !== cookieMgr) {\n                        runTargetUnload(_cookieManager, false);\n                        _cookieManager = cookieMgr;\n                    }\n                };\n                _self[STR_GET_PERF_MGR ] = function () {\n                    if (!_perfManager && !_cfgPerfManager) {\n                        _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                            if (details.cfg.enablePerfMgr) {\n                                var createPerfMgr = details.cfg[STR_CREATE_PERF_MGR ];\n                                if (isFunction(createPerfMgr)) {\n                                    _cfgPerfManager = createPerfMgr(_self, _self[_DYN_GET_NOTIFY_MGR ]());\n                                }\n                            }\n                        }));\n                    }\n                    return _perfManager || _cfgPerfManager || getGblPerfMgr();\n                };\n                _self.setPerfMgr = function (perfMgr) {\n                    _perfManager = perfMgr;\n                };\n                _self.eventCnt = function () {\n                    return _eventQueue[_DYN_LENGTH$5 ];\n                };\n                _self.releaseQueue = function () {\n                    if (_isInitialized && _eventQueue[_DYN_LENGTH$5 ] > 0) {\n                        var eventQueue = _eventQueue;\n                        _eventQueue = [];\n                        arrForEach(eventQueue, function (event) {\n                            _createTelCtx()[_DYN_PROCESS_NEXT ](event);\n                        });\n                    }\n                };\n                _self[_DYN_POLL_INTERNAL_LOGS ] = function (eventName) {\n                    _internalLogsEventName = eventName || null;\n                    _forceStopInternalLogPoller = false;\n                    _internalLogPoller && _internalLogPoller[_DYN_CANCEL ]();\n                    return _startLogPoller(true);\n                };\n                function _startLogPoller(alwaysStart) {\n                    if ((!_internalLogPoller || !_internalLogPoller[_DYN_ENABLED ]) && !_forceStopInternalLogPoller) {\n                        var shouldStart = alwaysStart || (_logger && _logger.queue[_DYN_LENGTH$5 ] > 0);\n                        if (shouldStart) {\n                            if (!_internalLogPollerListening) {\n                                _internalLogPollerListening = true;\n                                _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                                    var interval = details.cfg.diagnosticLogInterval;\n                                    if (!interval || !(interval > 0)) {\n                                        interval = 10000;\n                                    }\n                                    var isRunning = false;\n                                    if (_internalLogPoller) {\n                                        isRunning = _internalLogPoller[_DYN_ENABLED ];\n                                        _internalLogPoller[_DYN_CANCEL ]();\n                                    }\n                                    _internalLogPoller = createTimeout(_flushInternalLogs, interval);\n                                    _internalLogPoller.unref();\n                                    _internalLogPoller[_DYN_ENABLED ] = isRunning;\n                                }));\n                            }\n                            _internalLogPoller[_DYN_ENABLED ] = true;\n                        }\n                    }\n                    return _internalLogPoller;\n                }\n                _self[_DYN_STOP_POLLING_INTERNA3 ] = function () {\n                    _forceStopInternalLogPoller = true;\n                    _internalLogPoller && _internalLogPoller[_DYN_CANCEL ]();\n                    _flushInternalLogs();\n                };\n                proxyFunctions(_self, function () { return _telemetryInitializerPlugin; }, [\"addTelemetryInitializer\"]);\n                _self[_DYN_UNLOAD ] = function (isAsync, unloadComplete, cbTimeout) {\n                    var _a;\n                    if (isAsync === void 0) { isAsync = true; }\n                    if (!_isInitialized) {\n                        throwError(strSdkNotInitialized);\n                    }\n                    if (_isUnloading) {\n                        throwError(strSdkUnloadingError);\n                    }\n                    var unloadState = (_a = {\n                            reason: 50\n                        },\n                        _a[_DYN_IS_ASYNC ] = isAsync,\n                        _a.flushComplete = false,\n                        _a);\n                    var result;\n                    if (isAsync && !unloadComplete) {\n                        result = createPromise(function (resolve) {\n                            unloadComplete = resolve;\n                        });\n                    }\n                    var processUnloadCtx = createProcessTelemetryUnloadContext(_getPluginChain(), _self);\n                    processUnloadCtx[_DYN_ON_COMPLETE ](function () {\n                        _hookContainer.run(_self[_DYN_LOGGER ]);\n                        doUnloadAll([_cookieManager, _notificationManager, _logger], isAsync, function () {\n                            _initDefaults();\n                            unloadComplete && unloadComplete(unloadState);\n                        });\n                    }, _self);\n                    function _doUnload(flushComplete) {\n                        unloadState.flushComplete = flushComplete;\n                        _isUnloading = true;\n                        _unloadHandlers.run(processUnloadCtx, unloadState);\n                        _self[_DYN_STOP_POLLING_INTERNA3 ]();\n                        processUnloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n                    }\n                    _flushInternalLogs();\n                    if (!_flushChannels(isAsync, _doUnload, 6 , cbTimeout)) ;\n                    return result;\n                };\n                _self[_DYN_GET_PLUGIN ] = _getPlugin;\n                _self.addPlugin = function (plugin, replaceExisting, isAsync, addCb) {\n                    if (!plugin) {\n                        addCb && addCb(false);\n                        _logOrThrowError(strValidationError);\n                        return;\n                    }\n                    var existingPlugin = _getPlugin(plugin[_DYN_IDENTIFIER ]);\n                    if (existingPlugin && !replaceExisting) {\n                        addCb && addCb(false);\n                        _logOrThrowError(\"Plugin [\" + plugin[_DYN_IDENTIFIER ] + \"] is already loaded!\");\n                        return;\n                    }\n                    var updateState = {\n                        reason: 16\n                    };\n                    function _addPlugin(removed) {\n                        _configExtensions[_DYN_PUSH$1 ](plugin);\n                        updateState.added = [plugin];\n                        _initPluginChain(updateState);\n                        addCb && addCb(true);\n                    }\n                    if (existingPlugin) {\n                        var removedPlugins_1 = [existingPlugin.plugin];\n                        var unloadState = {\n                            reason: 2 ,\n                            isAsync: !!isAsync\n                        };\n                        _removePlugins(removedPlugins_1, unloadState, function (removed) {\n                            if (!removed) {\n                                addCb && addCb(false);\n                            }\n                            else {\n                                updateState.removed = removedPlugins_1;\n                                updateState.reason |= 32 ;\n                                _addPlugin();\n                            }\n                        });\n                    }\n                    else {\n                        _addPlugin();\n                    }\n                };\n                _self.updateCfg = function (newConfig, mergeExisting) {\n                    if (mergeExisting === void 0) { mergeExisting = true; }\n                    var updateState;\n                    if (_self[_DYN_IS_INITIALIZED ]()) {\n                        updateState = {\n                            reason: 1 ,\n                            cfg: _configHandler.cfg,\n                            oldCfg: deepExtend({}, _configHandler.cfg),\n                            newConfig: deepExtend({}, newConfig),\n                            merge: mergeExisting\n                        };\n                        newConfig = updateState.newConfig;\n                        var cfg = _configHandler.cfg;\n                        newConfig[STR_EXTENSIONS ] = cfg[STR_EXTENSIONS ];\n                        newConfig[STR_CHANNELS ] = cfg[STR_CHANNELS ];\n                    }\n                    _configHandler._block(function (details) {\n                        var theConfig = details.cfg;\n                        _deepMergeConfig(details, theConfig, newConfig, mergeExisting);\n                        if (!mergeExisting) {\n                            objForEachKey(theConfig, function (key) {\n                                if (!objHasOwn(newConfig, key)) {\n                                    details.set(theConfig, key, UNDEFINED_VALUE$2);\n                                }\n                            });\n                        }\n                        details[_DYN_SET_DF ](theConfig, defaultConfig);\n                    }, true);\n                    _configHandler[_DYN_NOTIFY ]();\n                    if (updateState) {\n                        _doUpdate(updateState);\n                    }\n                };\n                _self.evtNamespace = function () {\n                    return _evtNamespace;\n                };\n                _self.flush = _flushChannels;\n                _self.getTraceCtx = function (createNew) {\n                    if (!_traceCtx) {\n                        _traceCtx = createDistributedTraceContext();\n                    }\n                    return _traceCtx;\n                };\n                _self.setTraceCtx = function (traceCtx) {\n                    _traceCtx = traceCtx || null;\n                };\n                _self.addUnloadHook = _addUnloadHook;\n                proxyFunctionAs(_self, \"addUnloadCb\", function () { return _unloadHandlers; }, \"add\");\n                _self.onCfgChange = function (handler) {\n                    var unloadHook;\n                    if (!_isInitialized) {\n                        unloadHook = _addDelayedCfgListener(_cfgListeners, handler);\n                    }\n                    else {\n                        unloadHook = onConfigChange(_configHandler.cfg, handler, _self[_DYN_LOGGER ]);\n                    }\n                    return {\n                        rm: function () {\n                            unloadHook.rm();\n                        }\n                    };\n                };\n                _self.getWParam = function () {\n                    return (hasDocument() || !!_configHandler.cfg.enableWParam) ? 0 : -1;\n                };\n                function _setPluginVersions() {\n                    var thePlugins = {};\n                    _pluginVersionStringArr = [];\n                    var _addPluginVersions = function (plugins) {\n                        if (plugins) {\n                            arrForEach(plugins, function (plugin) {\n                                if (plugin[_DYN_IDENTIFIER ] && plugin[_DYN_VERSION$1 ] && !thePlugins[plugin.identifier]) {\n                                    var ver = plugin[_DYN_IDENTIFIER ] + \"=\" + plugin[_DYN_VERSION$1 ];\n                                    _pluginVersionStringArr[_DYN_PUSH$1 ](ver);\n                                    thePlugins[plugin.identifier] = plugin;\n                                }\n                            });\n                        }\n                    };\n                    _addPluginVersions(_channels);\n                    if (_channelConfig) {\n                        arrForEach(_channelConfig, function (channels) {\n                            _addPluginVersions(channels);\n                        });\n                    }\n                    _addPluginVersions(_configExtensions);\n                }\n                function _initDefaults() {\n                    _isInitialized = false;\n                    _configHandler = createDynamicConfig({}, defaultConfig, _self[_DYN_LOGGER ]);\n                    _configHandler.cfg[_DYN_LOGGING_LEVEL_CONSOL4 ] = 1 ;\n                    objDefine(_self, \"config\", {\n                        g: function () { return _configHandler.cfg; },\n                        s: function (newValue) {\n                            _self.updateCfg(newValue, false);\n                        }\n                    });\n                    objDefine(_self, \"pluginVersionStringArr\", {\n                        g: function () {\n                            if (!_pluginVersionStringArr) {\n                                _setPluginVersions();\n                            }\n                            return _pluginVersionStringArr;\n                        }\n                    });\n                    objDefine(_self, \"pluginVersionString\", {\n                        g: function () {\n                            if (!_pluginVersionString) {\n                                if (!_pluginVersionStringArr) {\n                                    _setPluginVersions();\n                                }\n                                _pluginVersionString = _pluginVersionStringArr.join(\";\");\n                            }\n                            return _pluginVersionString || STR_EMPTY;\n                        }\n                    });\n                    objDefine(_self, \"logger\", {\n                        g: function () {\n                            if (!_logger) {\n                                _logger = new DiagnosticLogger(_configHandler.cfg);\n                                _configHandler[_DYN_LOGGER ] = _logger;\n                            }\n                            return _logger;\n                        },\n                        s: function (newLogger) {\n                            _configHandler[_DYN_LOGGER ] = newLogger;\n                            if (_logger !== newLogger) {\n                                runTargetUnload(_logger, false);\n                                _logger = newLogger;\n                            }\n                        }\n                    });\n                    _self[_DYN_LOGGER ] = new DiagnosticLogger(_configHandler.cfg);\n                    _extensions = [];\n                    var cfgExtensions = _self.config[STR_EXTENSIONS ] || [];\n                    cfgExtensions.splice(0, cfgExtensions[_DYN_LENGTH$5 ]);\n                    arrAppend(cfgExtensions, _extensions);\n                    _telemetryInitializerPlugin = new TelemetryInitializerPlugin();\n                    _eventQueue = [];\n                    runTargetUnload(_notificationManager, false);\n                    _notificationManager = null;\n                    _perfManager = null;\n                    _cfgPerfManager = null;\n                    runTargetUnload(_cookieManager, false);\n                    _cookieManager = null;\n                    _pluginChain = null;\n                    _configExtensions = [];\n                    _channelConfig = null;\n                    _channels = null;\n                    _isUnloading = false;\n                    _internalLogsEventName = null;\n                    _evtNamespace = createUniqueNamespace(\"AIBaseCore\", true);\n                    _unloadHandlers = createUnloadHandlerContainer();\n                    _traceCtx = null;\n                    _instrumentationKey = null;\n                    _hookContainer = createUnloadHookContainer();\n                    _cfgListeners = [];\n                    _pluginVersionString = null;\n                    _pluginVersionStringArr = null;\n                    _forceStopInternalLogPoller = false;\n                }\n                function _createTelCtx() {\n                    var theCtx = createProcessTelemetryContext(_getPluginChain(), _configHandler.cfg, _self);\n                    theCtx[_DYN_ON_COMPLETE ](_startLogPoller);\n                    return theCtx;\n                }\n                function _initPluginChain(updateState) {\n                    var theExtensions = _validateExtensions(_self[_DYN_LOGGER ], ChannelControllerPriority, _configExtensions);\n                    _pluginChain = null;\n                    _pluginVersionString = null;\n                    _pluginVersionStringArr = null;\n                    _channels = (_channelConfig || [])[0] || [];\n                    _channels = sortPlugins(arrAppend(_channels, theExtensions[STR_CHANNELS ]));\n                    var allExtensions = arrAppend(sortPlugins(theExtensions[STR_CORE ]), _channels);\n                    _extensions = objFreeze(allExtensions);\n                    var cfgExtensions = _self.config[STR_EXTENSIONS ] || [];\n                    cfgExtensions.splice(0, cfgExtensions[_DYN_LENGTH$5 ]);\n                    arrAppend(cfgExtensions, _extensions);\n                    var rootCtx = _createTelCtx();\n                    if (_channels && _channels[_DYN_LENGTH$5 ] > 0) {\n                        initializePlugins(rootCtx[_DYN_CREATE_NEW$1 ](_channels), allExtensions);\n                    }\n                    initializePlugins(rootCtx, allExtensions);\n                    if (updateState) {\n                        _doUpdate(updateState);\n                    }\n                }\n                function _getPlugin(pluginIdentifier) {\n                    var theExt = null;\n                    var thePlugin = null;\n                    var channelHosts = [];\n                    arrForEach(_extensions, function (ext) {\n                        if (ext[_DYN_IDENTIFIER ] === pluginIdentifier && ext !== _telemetryInitializerPlugin) {\n                            thePlugin = ext;\n                            return -1;\n                        }\n                        if (ext.getChannel) {\n                            channelHosts[_DYN_PUSH$1 ](ext);\n                        }\n                    });\n                    if (!thePlugin && channelHosts[_DYN_LENGTH$5 ] > 0) {\n                        arrForEach(channelHosts, function (host) {\n                            thePlugin = host.getChannel(pluginIdentifier);\n                            if (!thePlugin) {\n                                return -1;\n                            }\n                        });\n                    }\n                    if (thePlugin) {\n                        theExt = {\n                            plugin: thePlugin,\n                            setEnabled: function (enabled) {\n                                _getPluginState(thePlugin)[STR_DISABLED] = !enabled;\n                            },\n                            isEnabled: function () {\n                                var pluginState = _getPluginState(thePlugin);\n                                return !pluginState[_DYN_TEARDOWN ] && !pluginState[STR_DISABLED];\n                            },\n                            remove: function (isAsync, removeCb) {\n                                var _a;\n                                if (isAsync === void 0) { isAsync = true; }\n                                var pluginsToRemove = [thePlugin];\n                                var unloadState = (_a = {\n                                        reason: 1\n                                    },\n                                    _a[_DYN_IS_ASYNC ] = isAsync,\n                                    _a);\n                                _removePlugins(pluginsToRemove, unloadState, function (removed) {\n                                    if (removed) {\n                                        _initPluginChain({\n                                            reason: 32 ,\n                                            removed: pluginsToRemove\n                                        });\n                                    }\n                                    removeCb && removeCb(removed);\n                                });\n                            }\n                        };\n                    }\n                    return theExt;\n                }\n                function _getPluginChain() {\n                    if (!_pluginChain) {\n                        var extensions = (_extensions || []).slice();\n                        if (arrIndexOf(extensions, _telemetryInitializerPlugin) === -1) {\n                            extensions[_DYN_PUSH$1 ](_telemetryInitializerPlugin);\n                        }\n                        _pluginChain = createTelemetryProxyChain(sortPlugins(extensions), _configHandler.cfg, _self);\n                    }\n                    return _pluginChain;\n                }\n                function _removePlugins(thePlugins, unloadState, removeComplete) {\n                    if (thePlugins && thePlugins[_DYN_LENGTH$5 ] > 0) {\n                        var unloadChain = createTelemetryProxyChain(thePlugins, _configHandler.cfg, _self);\n                        var unloadCtx = createProcessTelemetryUnloadContext(unloadChain, _self);\n                        unloadCtx[_DYN_ON_COMPLETE ](function () {\n                            var removed = false;\n                            var newConfigExtensions = [];\n                            arrForEach(_configExtensions, function (plugin, idx) {\n                                if (!_isPluginPresent(plugin, thePlugins)) {\n                                    newConfigExtensions[_DYN_PUSH$1 ](plugin);\n                                }\n                                else {\n                                    removed = true;\n                                }\n                            });\n                            _configExtensions = newConfigExtensions;\n                            _pluginVersionString = null;\n                            _pluginVersionStringArr = null;\n                            var newChannelConfig = [];\n                            if (_channelConfig) {\n                                arrForEach(_channelConfig, function (queue, idx) {\n                                    var newQueue = [];\n                                    arrForEach(queue, function (channel) {\n                                        if (!_isPluginPresent(channel, thePlugins)) {\n                                            newQueue[_DYN_PUSH$1 ](channel);\n                                        }\n                                        else {\n                                            removed = true;\n                                        }\n                                    });\n                                    newChannelConfig[_DYN_PUSH$1 ](newQueue);\n                                });\n                                _channelConfig = newChannelConfig;\n                            }\n                            removeComplete && removeComplete(removed);\n                            _startLogPoller();\n                        });\n                        unloadCtx[_DYN_PROCESS_NEXT ](unloadState);\n                    }\n                    else {\n                        removeComplete(false);\n                    }\n                }\n                function _flushInternalLogs() {\n                    if (_logger && _logger.queue) {\n                        var queue = _logger.queue.slice(0);\n                        _logger.queue[_DYN_LENGTH$5 ] = 0;\n                        arrForEach(queue, function (logMessage) {\n                            var _a;\n                            var item = (_a = {},\n                                _a[_DYN_NAME$3 ] = _internalLogsEventName ? _internalLogsEventName : \"InternalMessageId: \" + logMessage[_DYN_MESSAGE_ID ],\n                                _a.iKey = _instrumentationKey,\n                                _a[_DYN_TIME ] = toISOString(new Date()),\n                                _a.baseType = _InternalLogMessage.dataType,\n                                _a.baseData = { message: logMessage[_DYN_MESSAGE$2 ] },\n                                _a);\n                            _self.track(item);\n                        });\n                    }\n                }\n                function _flushChannels(isAsync, callBack, sendReason, cbTimeout) {\n                    var waiting = 1;\n                    var doneIterating = false;\n                    var cbTimer = null;\n                    cbTimeout = cbTimeout || 5000;\n                    function doCallback() {\n                        waiting--;\n                        if (doneIterating && waiting === 0) {\n                            cbTimer && cbTimer[_DYN_CANCEL ]();\n                            cbTimer = null;\n                            callBack && callBack(doneIterating);\n                            callBack = null;\n                        }\n                    }\n                    if (_channels && _channels[_DYN_LENGTH$5 ] > 0) {\n                        var flushCtx = _createTelCtx()[_DYN_CREATE_NEW$1 ](_channels);\n                        flushCtx.iterate(function (plugin) {\n                            if (plugin.flush) {\n                                waiting++;\n                                var handled_1 = false;\n                                if (!plugin.flush(isAsync, function () {\n                                    handled_1 = true;\n                                    doCallback();\n                                }, sendReason)) {\n                                    if (!handled_1) {\n                                        if (isAsync && cbTimer == null) {\n                                            cbTimer = scheduleTimeout(function () {\n                                                cbTimer = null;\n                                                doCallback();\n                                            }, cbTimeout);\n                                        }\n                                        else {\n                                            doCallback();\n                                        }\n                                    }\n                                }\n                            }\n                        });\n                    }\n                    doneIterating = true;\n                    doCallback();\n                    return true;\n                }\n                function _initDebugListener() {\n                    !_notificationManager && _self[_DYN_GET_NOTIFY_MGR ]();\n                    _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                        var disableDbgExt = details.cfg.disableDbgExt;\n                        if (disableDbgExt === true && _debugListener) {\n                            _notificationManager[_DYN_REMOVE_NOTIFICATION_2 ](_debugListener);\n                            _debugListener = null;\n                        }\n                        if (_notificationManager && !_debugListener && disableDbgExt !== true) {\n                            _debugListener = getDebugListener(details.cfg);\n                            _notificationManager[_DYN_ADD_NOTIFICATION_LIS1 ](_debugListener);\n                        }\n                    }));\n                }\n                function _initPerfManager() {\n                    _addUnloadHook(_configHandler[_DYN_WATCH ](function (details) {\n                        var enablePerfMgr = details.cfg.enablePerfMgr;\n                        if (!enablePerfMgr && _cfgPerfManager) {\n                            _cfgPerfManager = null;\n                        }\n                        if (enablePerfMgr) {\n                            getSetValue(details.cfg, STR_CREATE_PERF_MGR, _createPerfManager);\n                        }\n                    }));\n                }\n                function _doUpdate(updateState) {\n                    var updateCtx = createProcessTelemetryUpdateContext(_getPluginChain(), _self);\n                    updateCtx[_DYN_ON_COMPLETE ](_startLogPoller);\n                    if (!_self._updateHook || _self._updateHook(updateCtx, updateState) !== true) {\n                        updateCtx[_DYN_PROCESS_NEXT ](updateState);\n                    }\n                }\n                function _logOrThrowError(message) {\n                    var logger = _self[_DYN_LOGGER ];\n                    if (logger) {\n                        _throwInternal(logger, 2 , 73 , message);\n                        _startLogPoller();\n                    }\n                    else {\n                        throwError(message);\n                    }\n                }\n                function _notifyInvalidEvent(telemetryItem) {\n                    var manager = _self[_DYN_GET_NOTIFY_MGR ]();\n                    if (manager) {\n                        manager[STR_EVENTS_DISCARDED ]([telemetryItem], 2 );\n                    }\n                }\n                function _addUnloadHook(hooks) {\n                    _hookContainer.add(hooks);\n                }\n            });\n        }\n        AppInsightsCore.__ieDyn=1;\n        return AppInsightsCore;\n    }());\n\n    var strOnPrefix = \"on\";\n    var strAttachEvent = \"attachEvent\";\n    var strAddEventHelper = \"addEventListener\";\n    var strDetachEvent = \"detachEvent\";\n    var strRemoveEventListener = \"removeEventListener\";\n    var strEvents = \"events\";\n    var strVisibilityChangeEvt = \"visibilitychange\";\n    var strPageHide = \"pagehide\";\n    var strUnload = \"unload\";\n    var strBeforeUnload = \"beforeunload\";\n    var strPageHideNamespace = createUniqueNamespace(\"aiEvtPageHide\");\n    createUniqueNamespace(\"aiEvtPageShow\");\n    var rRemoveEmptyNs = /\\.[\\.]+/g;\n    var rRemoveTrailingEmptyNs = /[\\.]+$/;\n    var _guid = 1;\n    var elmNodeData = createElmNodeData(\"events\");\n    var eventNamespace = /^([^.]*)(?:\\.(.+)|)/;\n    function _normalizeNamespace(name) {\n        if (name && name[_DYN_REPLACE ]) {\n            return name[_DYN_REPLACE ](/^[\\s\\.]+|(?=[\\s\\.])[\\.\\s]+$/g, STR_EMPTY);\n        }\n        return name;\n    }\n    function _getEvtNamespace(eventName, evtNamespace) {\n        var _a;\n        if (evtNamespace) {\n            var theNamespace_1 = STR_EMPTY;\n            if (isArray(evtNamespace)) {\n                theNamespace_1 = STR_EMPTY;\n                arrForEach(evtNamespace, function (name) {\n                    name = _normalizeNamespace(name);\n                    if (name) {\n                        if (name[0] !== \".\") {\n                            name = \".\" + name;\n                        }\n                        theNamespace_1 += name;\n                    }\n                });\n            }\n            else {\n                theNamespace_1 = _normalizeNamespace(evtNamespace);\n            }\n            if (theNamespace_1) {\n                if (theNamespace_1[0] !== \".\") {\n                    theNamespace_1 = \".\" + theNamespace_1;\n                }\n                eventName = (eventName || STR_EMPTY) + theNamespace_1;\n            }\n        }\n        var parsedEvent = (eventNamespace.exec(eventName || STR_EMPTY) || []);\n        return _a = {},\n            _a[_DYN_TYPE ] = parsedEvent[1],\n            _a.ns = ((parsedEvent[2] || STR_EMPTY).replace(rRemoveEmptyNs, \".\").replace(rRemoveTrailingEmptyNs, STR_EMPTY)[_DYN_SPLIT$1 ](\".\").sort()).join(\".\"),\n            _a;\n    }\n    function _getRegisteredEvents(target, evtName, addDefault) {\n        if (addDefault === void 0) { addDefault = true; }\n        var aiEvts = elmNodeData.get(target, strEvents, {}, addDefault);\n        var registeredEvents = aiEvts[evtName];\n        if (!registeredEvents) {\n            registeredEvents = aiEvts[evtName] = [];\n        }\n        return registeredEvents;\n    }\n    function _doDetach(obj, evtName, handlerRef, useCapture) {\n        if (obj && evtName && evtName[_DYN_TYPE ]) {\n            if (obj[strRemoveEventListener]) {\n                obj[strRemoveEventListener](evtName[_DYN_TYPE ], handlerRef, useCapture);\n            }\n            else if (obj[strDetachEvent]) {\n                obj[strDetachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);\n            }\n        }\n    }\n    function _doAttach(obj, evtName, handlerRef, useCapture) {\n        var result = false;\n        if (obj && evtName && evtName[_DYN_TYPE ] && handlerRef) {\n            if (obj[strAddEventHelper]) {\n                obj[strAddEventHelper](evtName[_DYN_TYPE ], handlerRef, useCapture);\n                result = true;\n            }\n            else if (obj[strAttachEvent]) {\n                obj[strAttachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);\n                result = true;\n            }\n        }\n        return result;\n    }\n    function _doUnregister(target, events, evtName, unRegFn) {\n        var idx = events[_DYN_LENGTH$5 ];\n        while (idx--) {\n            var theEvent = events[idx];\n            if (theEvent) {\n                if (!evtName.ns || evtName.ns === theEvent.evtName.ns) {\n                    if (!unRegFn || unRegFn(theEvent)) {\n                        _doDetach(target, theEvent.evtName, theEvent[_DYN_HANDLER ], theEvent.capture);\n                        events[_DYN_SPLICE ](idx, 1);\n                    }\n                }\n            }\n        }\n    }\n    function _unregisterEvents(target, evtName, unRegFn) {\n        if (evtName[_DYN_TYPE ]) {\n            _doUnregister(target, _getRegisteredEvents(target, evtName[_DYN_TYPE ]), evtName, unRegFn);\n        }\n        else {\n            var eventCache = elmNodeData.get(target, strEvents, {});\n            objForEachKey(eventCache, function (evtType, events) {\n                _doUnregister(target, events, evtName, unRegFn);\n            });\n            if (objKeys(eventCache)[_DYN_LENGTH$5 ] === 0) {\n                elmNodeData.kill(target, strEvents);\n            }\n        }\n    }\n    function mergeEvtNamespace(theNamespace, namespaces) {\n        var newNamespaces;\n        if (namespaces) {\n            if (isArray(namespaces)) {\n                newNamespaces = [theNamespace].concat(namespaces);\n            }\n            else {\n                newNamespaces = [theNamespace, namespaces];\n            }\n            newNamespaces = (_getEvtNamespace(\"xx\", newNamespaces).ns)[_DYN_SPLIT$1 ](\".\");\n        }\n        else {\n            newNamespaces = theNamespace;\n        }\n        return newNamespaces;\n    }\n    function eventOn(target, eventName, handlerRef, evtNamespace, useCapture) {\n        var _a;\n        if (useCapture === void 0) { useCapture = false; }\n        var result = false;\n        if (target) {\n            try {\n                var evtName = _getEvtNamespace(eventName, evtNamespace);\n                result = _doAttach(target, evtName, handlerRef, useCapture);\n                if (result && elmNodeData.accept(target)) {\n                    var registeredEvent = (_a = {\n                            guid: _guid++,\n                            evtName: evtName\n                        },\n                        _a[_DYN_HANDLER ] = handlerRef,\n                        _a.capture = useCapture,\n                        _a);\n                    _getRegisteredEvents(target, evtName.type)[_DYN_PUSH$1 ](registeredEvent);\n                }\n            }\n            catch (e) {\n            }\n        }\n        return result;\n    }\n    function eventOff(target, eventName, handlerRef, evtNamespace, useCapture) {\n        if (useCapture === void 0) { useCapture = false; }\n        if (target) {\n            try {\n                var evtName_1 = _getEvtNamespace(eventName, evtNamespace);\n                var found_1 = false;\n                _unregisterEvents(target, evtName_1, function (regEvent) {\n                    if ((evtName_1.ns && !handlerRef) || regEvent[_DYN_HANDLER ] === handlerRef) {\n                        found_1 = true;\n                        return true;\n                    }\n                    return false;\n                });\n                if (!found_1) {\n                    _doDetach(target, evtName_1, handlerRef, useCapture);\n                }\n            }\n            catch (e) {\n            }\n        }\n    }\n    function addEventHandler(eventName, callback, evtNamespace) {\n        var result = false;\n        var w = getWindow();\n        if (w) {\n            result = eventOn(w, eventName, callback, evtNamespace);\n            result = eventOn(w[\"body\"], eventName, callback, evtNamespace) || result;\n        }\n        var doc = getDocument();\n        if (doc) {\n            result = eventOn(doc, eventName, callback, evtNamespace) || result;\n        }\n        return result;\n    }\n    function removeEventHandler(eventName, callback, evtNamespace) {\n        var w = getWindow();\n        if (w) {\n            eventOff(w, eventName, callback, evtNamespace);\n            eventOff(w[\"body\"], eventName, callback, evtNamespace);\n        }\n        var doc = getDocument();\n        if (doc) {\n            eventOff(doc, eventName, callback, evtNamespace);\n        }\n    }\n    function _addEventListeners(events, listener, excludeEvents, evtNamespace) {\n        var added = false;\n        if (listener && events && events[_DYN_LENGTH$5 ] > 0) {\n            arrForEach(events, function (name) {\n                if (name) {\n                    if (!excludeEvents || arrIndexOf(excludeEvents, name) === -1) {\n                        added = addEventHandler(name, listener, evtNamespace) || added;\n                    }\n                }\n            });\n        }\n        return added;\n    }\n    function addEventListeners(events, listener, excludeEvents, evtNamespace) {\n        var added = false;\n        if (listener && events && isArray(events)) {\n            added = _addEventListeners(events, listener, excludeEvents, evtNamespace);\n            if (!added && excludeEvents && excludeEvents[_DYN_LENGTH$5 ] > 0) {\n                added = _addEventListeners(events, listener, null, evtNamespace);\n            }\n        }\n        return added;\n    }\n    function removeEventListeners(events, listener, evtNamespace) {\n        if (events && isArray(events)) {\n            arrForEach(events, function (name) {\n                if (name) {\n                    removeEventHandler(name, listener, evtNamespace);\n                }\n            });\n        }\n    }\n    function addPageUnloadEventListener(listener, excludeEvents, evtNamespace) {\n        return addEventListeners([strBeforeUnload, strUnload, strPageHide], listener, excludeEvents, evtNamespace);\n    }\n    function removePageUnloadEventListener(listener, evtNamespace) {\n        removeEventListeners([strBeforeUnload, strUnload, strPageHide], listener, evtNamespace);\n    }\n    function addPageHideEventListener(listener, excludeEvents, evtNamespace) {\n        function _handlePageVisibility(evt) {\n            var doc = getDocument();\n            if (listener && doc && doc.visibilityState === \"hidden\") {\n                listener(evt);\n            }\n        }\n        var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);\n        var pageUnloadAdded = _addEventListeners([strPageHide], listener, excludeEvents, newNamespaces);\n        if (!excludeEvents || arrIndexOf(excludeEvents, strVisibilityChangeEvt) === -1) {\n            pageUnloadAdded = _addEventListeners([strVisibilityChangeEvt], _handlePageVisibility, excludeEvents, newNamespaces) || pageUnloadAdded;\n        }\n        if (!pageUnloadAdded && excludeEvents) {\n            pageUnloadAdded = addPageHideEventListener(listener, null, evtNamespace);\n        }\n        return pageUnloadAdded;\n    }\n    function removePageHideEventListener(listener, evtNamespace) {\n        var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);\n        removeEventListeners([strPageHide], listener, newNamespaces);\n        removeEventListeners([strVisibilityChangeEvt], null, newNamespaces);\n    }\n\n    var aiInstrumentHooks = \"_aiHooks\";\n    var cbNames = [\n        \"req\", \"rsp\", \"hkErr\", \"fnErr\"\n    ];\n    function _arrLoop(arr, fn) {\n        if (arr) {\n            for (var lp = 0; lp < arr[_DYN_LENGTH$5 ]; lp++) {\n                if (fn(arr[lp], lp)) {\n                    break;\n                }\n            }\n        }\n    }\n    function _doCallbacks(hooks, callDetails, cbArgs, hookCtx, type) {\n        if (type >= 0  && type <= 2 ) {\n            _arrLoop(hooks, function (hook, idx) {\n                var cbks = hook.cbks;\n                var cb = cbks[cbNames[type]];\n                if (cb) {\n                    callDetails.ctx = function () {\n                        var ctx = hookCtx[idx] = (hookCtx[idx] || {});\n                        return ctx;\n                    };\n                    try {\n                        cb[_DYN_APPLY ](callDetails.inst, cbArgs);\n                    }\n                    catch (err) {\n                        var orgEx = callDetails.err;\n                        try {\n                            var hookErrorCb = cbks[cbNames[2 ]];\n                            if (hookErrorCb) {\n                                callDetails.err = err;\n                                hookErrorCb[_DYN_APPLY ](callDetails.inst, cbArgs);\n                            }\n                        }\n                        catch (e) {\n                        }\n                        finally {\n                            callDetails.err = orgEx;\n                        }\n                    }\n                }\n            });\n        }\n    }\n    function _createFunctionHook(aiHook) {\n        return function () {\n            var _a;\n            var funcThis = this;\n            var orgArgs = arguments;\n            var hooks = aiHook.h;\n            var funcArgs = (_a = {},\n                _a[_DYN_NAME$3 ] = aiHook.n,\n                _a.inst = funcThis,\n                _a.ctx = null,\n                _a.set = _replaceArg,\n                _a);\n            var hookCtx = [];\n            var cbArgs = _createArgs([funcArgs], orgArgs);\n            funcArgs.evt = getInst(\"event\");\n            function _createArgs(target, theArgs) {\n                _arrLoop(theArgs, function (arg) {\n                    target[_DYN_PUSH$1 ](arg);\n                });\n                return target;\n            }\n            function _replaceArg(idx, value) {\n                orgArgs = _createArgs([], orgArgs);\n                orgArgs[idx] = value;\n                cbArgs = _createArgs([funcArgs], orgArgs);\n            }\n            _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 0 );\n            var theFunc = aiHook.f;\n            if (theFunc) {\n                try {\n                    funcArgs.rslt = theFunc[_DYN_APPLY ](funcThis, orgArgs);\n                }\n                catch (err) {\n                    funcArgs.err = err;\n                    _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 3 );\n                    throw err;\n                }\n            }\n            _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, 1 );\n            return funcArgs.rslt;\n        };\n    }\n    function _getOwner(target, name, checkPrototype, checkParentProto) {\n        var owner = null;\n        if (target) {\n            if (objHasOwnProperty(target, name)) {\n                owner = target;\n            }\n            else if (checkPrototype) {\n                owner = _getOwner(_getObjProto(target), name, checkParentProto, false);\n            }\n        }\n        return owner;\n    }\n    function InstrumentProto(target, funcName, callbacks) {\n        if (target) {\n            return InstrumentFunc(target[strShimPrototype], funcName, callbacks, false);\n        }\n        return null;\n    }\n    function _createInstrumentHook(owner, funcName, fn, callbacks) {\n        var aiHook = fn && fn[aiInstrumentHooks];\n        if (!aiHook) {\n            aiHook = {\n                i: 0,\n                n: funcName,\n                f: fn,\n                h: []\n            };\n            var newFunc = _createFunctionHook(aiHook);\n            newFunc[aiInstrumentHooks] = aiHook;\n            owner[funcName] = newFunc;\n        }\n        var theHook = {\n            id: aiHook.i,\n            cbks: callbacks,\n            rm: function () {\n                var id = this.id;\n                _arrLoop(aiHook.h, function (hook, idx) {\n                    if (hook.id === id) {\n                        aiHook.h[_DYN_SPLICE ](idx, 1);\n                        return 1;\n                    }\n                });\n            }\n        };\n        aiHook.i++;\n        aiHook.h[_DYN_PUSH$1 ](theHook);\n        return theHook;\n    }\n    function InstrumentFunc(target, funcName, callbacks, checkPrototype, checkParentProto) {\n        if (checkPrototype === void 0) { checkPrototype = true; }\n        if (target && funcName && callbacks) {\n            var owner = _getOwner(target, funcName, checkPrototype, checkParentProto);\n            if (owner) {\n                var fn = owner[funcName];\n                if (typeof fn === strShimFunction) {\n                    return _createInstrumentHook(owner, funcName, fn, callbacks);\n                }\n            }\n        }\n        return null;\n    }\n    function InstrumentEvent(target, evtName, callbacks, checkPrototype, checkParentProto) {\n        if (target && evtName && callbacks) {\n            var owner = _getOwner(target, evtName, checkPrototype, checkParentProto) || target;\n            if (owner) {\n                return _createInstrumentHook(owner, evtName, owner[evtName], callbacks);\n            }\n        }\n        return null;\n    }\n\n    var DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n    var SampleRate = \"sampleRate\";\n    var ProcessLegacy = \"ProcessLegacy\";\n    var HttpMethod = \"http.method\";\n    var DEFAULT_BREEZE_ENDPOINT = \"https://dc.services.visualstudio.com\";\n    var DEFAULT_BREEZE_PATH = \"/v2/track\";\n    var strNotSpecified = \"not_specified\";\n    var strIkey = \"iKey\";\n\n    var RequestHeaders = createValueMap({\n        requestContextHeader: [0 , \"Request-Context\"],\n        requestContextTargetKey: [1 , \"appId\"],\n        requestContextAppIdFormat: [2 , \"appId=cid-v1:\"],\n        requestIdHeader: [3 , \"Request-Id\"],\n        traceParentHeader: [4 , \"traceparent\"],\n        traceStateHeader: [5 , \"tracestate\"],\n        sdkContextHeader: [6 , \"Sdk-Context\"],\n        sdkContextHeaderAppIdRequest: [7 , \"appId\"],\n        requestContextHeaderLowerCase: [8 , \"request-context\"]\n    });\n\n    var _DYN_SPLIT = \"split\";\n    var _DYN_LENGTH$4 = \"length\";\n    var _DYN_TO_LOWER_CASE$1 = \"toLowerCase\";\n    var _DYN_INGESTIONENDPOINT = \"ingestionendpoint\";\n    var _DYN_TO_STRING$2 = \"toString\";\n    var _DYN_REMOVE_ITEM = \"removeItem\";\n    var _DYN_NAME$2 = \"name\";\n    var _DYN_MESSAGE$1 = \"message\";\n    var _DYN_COUNT$1 = \"count\";\n    var _DYN_STRINGIFY$1 = \"stringify\";\n    var _DYN_PATHNAME = \"pathname\";\n    var _DYN_CORRELATION_HEADER_E0 = \"correlationHeaderExcludePatterns\";\n    var _DYN_EXCEPTIONS = \"exceptions\";\n    var _DYN_PARSED_STACK = \"parsedStack\";\n    var _DYN_PROPERTIES = \"properties\";\n    var _DYN_MEASUREMENTS$1 = \"measurements\";\n    var _DYN_SIZE_IN_BYTES = \"sizeInBytes\";\n    var _DYN_TYPE_NAME = \"typeName\";\n    var _DYN_SEVERITY_LEVEL = \"severityLevel\";\n    var _DYN_PROBLEM_GROUP = \"problemGroup\";\n    var _DYN_IS_MANUAL = \"isManual\";\n    var _DYN__CREATE_FROM_INTERFA1 = \"CreateFromInterface\";\n    var _DYN_ASSEMBLY = \"assembly\";\n    var _DYN_FILE_NAME = \"fileName\";\n    var _DYN_HAS_FULL_STACK = \"hasFullStack\";\n    var _DYN_LEVEL = \"level\";\n    var _DYN_METHOD$1 = \"method\";\n    var _DYN_LINE = \"line\";\n    var _DYN_DURATION$1 = \"duration\";\n    var _DYN_RECEIVED_RESPONSE = \"receivedResponse\";\n\n    function dataSanitizeKeyAndAddUniqueness(logger, key, map) {\n        var origLength = key[_DYN_LENGTH$4 ];\n        var field = dataSanitizeKey(logger, key);\n        if (field[_DYN_LENGTH$4 ] !== origLength) {\n            var i = 0;\n            var uniqueField = field;\n            while (map[uniqueField] !== undefined) {\n                i++;\n                uniqueField = strSubstring(field, 0, 150  - 3) + dsPadNumber(i);\n            }\n            field = uniqueField;\n        }\n        return field;\n    }\n    function dataSanitizeKey(logger, name) {\n        var nameTrunc;\n        if (name) {\n            name = strTrim(asString(name));\n            if (name[_DYN_LENGTH$4 ] > 150 ) {\n                nameTrunc = strSubstring(name, 0, 150 );\n                _throwInternal(logger, 2 , 57 , \"name is too long.  It has been truncated to \" + 150  + \" characters.\", { name: name }, true);\n            }\n        }\n        return nameTrunc || name;\n    }\n    function dataSanitizeString(logger, value, maxLength) {\n        if (maxLength === void 0) { maxLength = 1024 ; }\n        var valueTrunc;\n        if (value) {\n            maxLength = maxLength ? maxLength : 1024 ;\n            value = strTrim(asString(value));\n            if (value[_DYN_LENGTH$4 ] > maxLength) {\n                valueTrunc = strSubstring(value, 0, maxLength);\n                _throwInternal(logger, 2 , 61 , \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n            }\n        }\n        return valueTrunc || value;\n    }\n    function dataSanitizeUrl(logger, url) {\n        return dataSanitizeInput(logger, url, 2048 , 66 );\n    }\n    function dataSanitizeMessage(logger, message) {\n        var messageTrunc;\n        if (message) {\n            if (message[_DYN_LENGTH$4 ] > 32768 ) {\n                messageTrunc = strSubstring(message, 0, 32768 );\n                _throwInternal(logger, 2 , 56 , \"message is too long, it has been truncated to \" + 32768  + \" characters.\", { message: message }, true);\n            }\n        }\n        return messageTrunc || message;\n    }\n    function dataSanitizeException(logger, exception) {\n        var exceptionTrunc;\n        if (exception) {\n            var value = \"\" + exception;\n            if (value[_DYN_LENGTH$4 ] > 32768 ) {\n                exceptionTrunc = strSubstring(value, 0, 32768 );\n                _throwInternal(logger, 2 , 52 , \"exception is too long, it has been truncated to \" + 32768  + \" characters.\", { exception: exception }, true);\n            }\n        }\n        return exceptionTrunc || exception;\n    }\n    function dataSanitizeProperties(logger, properties) {\n        if (properties) {\n            var tempProps_1 = {};\n            objForEachKey(properties, function (prop, value) {\n                if (isObject(value) && hasJSON()) {\n                    try {\n                        value = getJSON()[_DYN_STRINGIFY$1 ](value);\n                    }\n                    catch (e) {\n                        _throwInternal(logger, 2 , 49 , \"custom property is not valid\", { exception: e }, true);\n                    }\n                }\n                value = dataSanitizeString(logger, value, 8192 );\n                prop = dataSanitizeKeyAndAddUniqueness(logger, prop, tempProps_1);\n                tempProps_1[prop] = value;\n            });\n            properties = tempProps_1;\n        }\n        return properties;\n    }\n    function dataSanitizeMeasurements(logger, measurements) {\n        if (measurements) {\n            var tempMeasurements_1 = {};\n            objForEachKey(measurements, function (measure, value) {\n                measure = dataSanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements_1);\n                tempMeasurements_1[measure] = value;\n            });\n            measurements = tempMeasurements_1;\n        }\n        return measurements;\n    }\n    function dataSanitizeId(logger, id) {\n        return id ? dataSanitizeInput(logger, id, 128 , 69 )[_DYN_TO_STRING$2 ]() : id;\n    }\n    function dataSanitizeInput(logger, input, maxLength, _msgId) {\n        var inputTrunc;\n        if (input) {\n            input = strTrim(asString(input));\n            if (input[_DYN_LENGTH$4 ] > maxLength) {\n                inputTrunc = strSubstring(input, 0, maxLength);\n                _throwInternal(logger, 2 , _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n            }\n        }\n        return inputTrunc || input;\n    }\n    function dsPadNumber(num) {\n        var s = \"00\" + num;\n        return strSubstr(s, s[_DYN_LENGTH$4 ] - 3);\n    }\n\n    var _document = getDocument() || {};\n    var _htmlAnchorIdx = 0;\n    var _htmlAnchorElement = [null, null, null, null, null];\n    function urlParseUrl(url) {\n        var anchorIdx = _htmlAnchorIdx;\n        var anchorCache = _htmlAnchorElement;\n        var tempAnchor = anchorCache[anchorIdx];\n        if (!_document.createElement) {\n            tempAnchor = { host: urlParseHost(url, true) };\n        }\n        else if (!anchorCache[anchorIdx]) {\n            tempAnchor = anchorCache[anchorIdx] = _document.createElement(\"a\");\n        }\n        tempAnchor.href = url;\n        anchorIdx++;\n        if (anchorIdx >= anchorCache[_DYN_LENGTH$4 ]) {\n            anchorIdx = 0;\n        }\n        _htmlAnchorIdx = anchorIdx;\n        return tempAnchor;\n    }\n    function urlGetAbsoluteUrl(url) {\n        var result;\n        var a = urlParseUrl(url);\n        if (a) {\n            result = a.href;\n        }\n        return result;\n    }\n    function urlGetCompleteUrl(method, absoluteUrl) {\n        if (method) {\n            return method.toUpperCase() + \" \" + absoluteUrl;\n        }\n        return absoluteUrl;\n    }\n    function urlParseHost(url, inclPort) {\n        var fullHost = urlParseFullHost(url, inclPort) || \"\";\n        if (fullHost) {\n            var match = fullHost.match(/(www\\d{0,5}\\.)?([^\\/:]{1,256})(:\\d{1,20})?/i);\n            if (match != null && match[_DYN_LENGTH$4 ] > 3 && isString(match[2]) && match[2][_DYN_LENGTH$4 ] > 0) {\n                return match[2] + (match[3] || \"\");\n            }\n        }\n        return fullHost;\n    }\n    function urlParseFullHost(url, inclPort) {\n        var result = null;\n        if (url) {\n            var match = url.match(/(\\w{1,150}):\\/\\/([^\\/:]{1,256})(:\\d{1,20})?/i);\n            if (match != null && match[_DYN_LENGTH$4 ] > 2 && isString(match[2]) && match[2][_DYN_LENGTH$4 ] > 0) {\n                result = match[2] || \"\";\n                if (inclPort && match[_DYN_LENGTH$4 ] > 2) {\n                    var protocol = (match[1] || \"\")[_DYN_TO_LOWER_CASE$1 ]();\n                    var port = match[3] || \"\";\n                    if (protocol === \"http\" && port === \":80\") {\n                        port = \"\";\n                    }\n                    else if (protocol === \"https\" && port === \":443\") {\n                        port = \"\";\n                    }\n                    result += port;\n                }\n            }\n        }\n        return result;\n    }\n\n    var _internalEndpoints = [\n        DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH,\n        \"https://breeze.aimon.applicationinsights.io\" + DEFAULT_BREEZE_PATH,\n        \"https://dc-int.services.visualstudio.com\" + DEFAULT_BREEZE_PATH\n    ];\n    var _correlationIdPrefix = \"cid-v1:\";\n    function isInternalApplicationInsightsEndpoint(endpointUrl) {\n        return arrIndexOf(_internalEndpoints, endpointUrl[_DYN_TO_LOWER_CASE$1 ]()) !== -1;\n    }\n    function correlationIdCanIncludeCorrelationHeader(config, requestUrl, currentHost) {\n        if (!requestUrl || (config && config.disableCorrelationHeaders)) {\n            return false;\n        }\n        if (config && config[_DYN_CORRELATION_HEADER_E0 ]) {\n            for (var i = 0; i < config.correlationHeaderExcludePatterns[_DYN_LENGTH$4 ]; i++) {\n                if (config[_DYN_CORRELATION_HEADER_E0 ][i].test(requestUrl)) {\n                    return false;\n                }\n            }\n        }\n        var requestHost = urlParseUrl(requestUrl).host[_DYN_TO_LOWER_CASE$1 ]();\n        if (requestHost && (strIndexOf(requestHost, \":443\") !== -1 || strIndexOf(requestHost, \":80\") !== -1)) {\n            requestHost = (urlParseFullHost(requestUrl, true) || \"\")[_DYN_TO_LOWER_CASE$1 ]();\n        }\n        if ((!config || !config.enableCorsCorrelation) && (requestHost && requestHost !== currentHost)) {\n            return false;\n        }\n        var includedDomains = config && config.correlationHeaderDomains;\n        if (includedDomains) {\n            var matchExists_1;\n            arrForEach(includedDomains, function (domain) {\n                var regex = new RegExp(domain.toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n                matchExists_1 = matchExists_1 || regex.test(requestHost);\n            });\n            if (!matchExists_1) {\n                return false;\n            }\n        }\n        var excludedDomains = config && config.correlationHeaderExcludedDomains;\n        if (!excludedDomains || excludedDomains[_DYN_LENGTH$4 ] === 0) {\n            return true;\n        }\n        for (var i = 0; i < excludedDomains[_DYN_LENGTH$4 ]; i++) {\n            var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n            if (regex.test(requestHost)) {\n                return false;\n            }\n        }\n        return requestHost && requestHost[_DYN_LENGTH$4 ] > 0;\n    }\n    function correlationIdGetCorrelationContext(responseHeader) {\n        if (responseHeader) {\n            var correlationId = correlationIdGetCorrelationContextValue(responseHeader, RequestHeaders[1 ]);\n            if (correlationId && correlationId !== _correlationIdPrefix) {\n                return correlationId;\n            }\n        }\n    }\n    function correlationIdGetCorrelationContextValue(responseHeader, key) {\n        if (responseHeader) {\n            var keyValues = responseHeader[_DYN_SPLIT ](\",\");\n            for (var i = 0; i < keyValues[_DYN_LENGTH$4 ]; ++i) {\n                var keyValue = keyValues[i][_DYN_SPLIT ](\"=\");\n                if (keyValue[_DYN_LENGTH$4 ] === 2 && keyValue[0] === key) {\n                    return keyValue[1];\n                }\n            }\n        }\n    }\n    function AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName) {\n        var target, name = commandName, data = commandName;\n        if (absoluteUrl && absoluteUrl[_DYN_LENGTH$4 ] > 0) {\n            var parsedUrl = urlParseUrl(absoluteUrl);\n            target = parsedUrl.host;\n            if (!name) {\n                if (parsedUrl[_DYN_PATHNAME ] != null) {\n                    var pathName = (parsedUrl.pathname[_DYN_LENGTH$4 ] === 0) ? \"/\" : parsedUrl[_DYN_PATHNAME ];\n                    if (pathName.charAt(0) !== \"/\") {\n                        pathName = \"/\" + pathName;\n                    }\n                    data = parsedUrl[_DYN_PATHNAME ];\n                    name = dataSanitizeString(logger, method ? method + \" \" + pathName : pathName);\n                }\n                else {\n                    name = dataSanitizeString(logger, absoluteUrl);\n                }\n            }\n        }\n        else {\n            target = commandName;\n            name = commandName;\n        }\n        return {\n            target: target,\n            name: name,\n            data: data\n        };\n    }\n    function dateTimeUtilsNow() {\n        var perf = getPerformance();\n        if (perf && perf.now && perf.timing) {\n            var now = perf.now() + perf.timing.navigationStart;\n            if (now > 0) {\n                return now;\n            }\n        }\n        return utcNow();\n    }\n    function dateTimeUtilsDuration(start, end) {\n        var result = null;\n        if (start !== 0 && end !== 0 && !isNullOrUndefined(start) && !isNullOrUndefined(end)) {\n            result = end - start;\n        }\n        return result;\n    }\n    function createDistributedTraceContextFromTrace(telemetryTrace, parentCtx) {\n        var trace = telemetryTrace || {};\n        return {\n            getName: function () {\n                return trace[_DYN_NAME$2 ];\n            },\n            setName: function (newValue) {\n                parentCtx && parentCtx.setName(newValue);\n                trace[_DYN_NAME$2 ] = newValue;\n            },\n            getTraceId: function () {\n                return trace.traceID;\n            },\n            setTraceId: function (newValue) {\n                parentCtx && parentCtx.setTraceId(newValue);\n                if (isValidTraceId(newValue)) {\n                    trace.traceID = newValue;\n                }\n            },\n            getSpanId: function () {\n                return trace.parentID;\n            },\n            setSpanId: function (newValue) {\n                parentCtx && parentCtx.setSpanId(newValue);\n                if (isValidSpanId(newValue)) {\n                    trace.parentID = newValue;\n                }\n            },\n            getTraceFlags: function () {\n                return trace.traceFlags;\n            },\n            setTraceFlags: function (newTraceFlags) {\n                parentCtx && parentCtx.setTraceFlags(newTraceFlags);\n                trace.traceFlags = newTraceFlags;\n            }\n        };\n    }\n\n    var StorageType = createEnumStyle({\n        LocalStorage: 0 ,\n        SessionStorage: 1\n    });\n    createEnumStyle({\n        AI: 0 ,\n        AI_AND_W3C: 1 ,\n        W3C: 2\n    });\n\n    var _canUseLocalStorage = undefined;\n    var _canUseSessionStorage = undefined;\n    var _storagePrefix = \"\";\n    function _getLocalStorageObject() {\n        if (utlCanUseLocalStorage()) {\n            return _getVerifiedStorageObject(StorageType.LocalStorage);\n        }\n        return null;\n    }\n    function _getVerifiedStorageObject(storageType) {\n        try {\n            if (isNullOrUndefined(getGlobal())) {\n                return null;\n            }\n            var uid = (new Date)[_DYN_TO_STRING$2 ]();\n            var storage = getInst(storageType === StorageType.LocalStorage ? \"localStorage\" : \"sessionStorage\");\n            var name_1 = _storagePrefix + uid;\n            storage.setItem(name_1, uid);\n            var fail = storage.getItem(name_1) !== uid;\n            storage[_DYN_REMOVE_ITEM ](name_1);\n            if (!fail) {\n                return storage;\n            }\n        }\n        catch (exception) {\n        }\n        return null;\n    }\n    function _getSessionStorageObject() {\n        if (utlCanUseSessionStorage()) {\n            return _getVerifiedStorageObject(StorageType.SessionStorage);\n        }\n        return null;\n    }\n    function utlDisableStorage() {\n        _canUseLocalStorage = false;\n        _canUseSessionStorage = false;\n    }\n    function utlSetStoragePrefix(storagePrefix) {\n        _storagePrefix = storagePrefix || \"\";\n    }\n    function utlEnableStorage() {\n        _canUseLocalStorage = utlCanUseLocalStorage(true);\n        _canUseSessionStorage = utlCanUseSessionStorage(true);\n    }\n    function utlCanUseLocalStorage(reset) {\n        if (reset || _canUseLocalStorage === undefined) {\n            _canUseLocalStorage = !!_getVerifiedStorageObject(StorageType.LocalStorage);\n        }\n        return _canUseLocalStorage;\n    }\n    function utlGetLocalStorage(logger, name) {\n        var storage = _getLocalStorageObject();\n        if (storage !== null) {\n            try {\n                return storage.getItem(name);\n            }\n            catch (e) {\n                _canUseLocalStorage = false;\n                _throwInternal(logger, 2 , 1 , \"Browser failed read of local storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n            }\n        }\n        return null;\n    }\n    function utlSetLocalStorage(logger, name, data) {\n        var storage = _getLocalStorageObject();\n        if (storage !== null) {\n            try {\n                storage.setItem(name, data);\n                return true;\n            }\n            catch (e) {\n                _canUseLocalStorage = false;\n                _throwInternal(logger, 2 , 3 , \"Browser failed write to local storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n            }\n        }\n        return false;\n    }\n    function utlRemoveStorage(logger, name) {\n        var storage = _getLocalStorageObject();\n        if (storage !== null) {\n            try {\n                storage[_DYN_REMOVE_ITEM ](name);\n                return true;\n            }\n            catch (e) {\n                _canUseLocalStorage = false;\n                _throwInternal(logger, 2 , 5 , \"Browser failed removal of local storage item. \" + getExceptionName(e), { exception: dumpObj(e) });\n            }\n        }\n        return false;\n    }\n    function utlCanUseSessionStorage(reset) {\n        if (reset || _canUseSessionStorage === undefined) {\n            _canUseSessionStorage = !!_getVerifiedStorageObject(StorageType.SessionStorage);\n        }\n        return _canUseSessionStorage;\n    }\n    function utlGetSessionStorage(logger, name) {\n        var storage = _getSessionStorageObject();\n        if (storage !== null) {\n            try {\n                return storage.getItem(name);\n            }\n            catch (e) {\n                _canUseSessionStorage = false;\n                _throwInternal(logger, 2 , 2 , \"Browser failed read of session storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n            }\n        }\n        return null;\n    }\n    function utlSetSessionStorage(logger, name, data) {\n        var storage = _getSessionStorageObject();\n        if (storage !== null) {\n            try {\n                storage.setItem(name, data);\n                return true;\n            }\n            catch (e) {\n                _canUseSessionStorage = false;\n                _throwInternal(logger, 2 , 4 , \"Browser failed write to session storage. \" + getExceptionName(e), { exception: dumpObj(e) });\n            }\n        }\n        return false;\n    }\n    function utlRemoveSessionStorage(logger, name) {\n        var storage = _getSessionStorageObject();\n        if (storage !== null) {\n            try {\n                storage[_DYN_REMOVE_ITEM ](name);\n                return true;\n            }\n            catch (e) {\n                _canUseSessionStorage = false;\n                _throwInternal(logger, 2 , 6 , \"Browser failed removal of session storage item. \" + getExceptionName(e), { exception: dumpObj(e) });\n            }\n        }\n        return false;\n    }\n\n    var _FIELDS_SEPARATOR = \";\";\n    var _FIELD_KEY_VALUE_SEPARATOR = \"=\";\n    function parseConnectionString(connectionString) {\n        if (!connectionString) {\n            return {};\n        }\n        var kvPairs = connectionString[_DYN_SPLIT ](_FIELDS_SEPARATOR);\n        var result = arrReduce(kvPairs, function (fields, kv) {\n            var kvParts = kv[_DYN_SPLIT ](_FIELD_KEY_VALUE_SEPARATOR);\n            if (kvParts[_DYN_LENGTH$4 ] === 2) {\n                var key = kvParts[0][_DYN_TO_LOWER_CASE$1 ]();\n                var value = kvParts[1];\n                fields[key] = value;\n            }\n            return fields;\n        }, {});\n        if (objKeys(result)[_DYN_LENGTH$4 ] > 0) {\n            if (result.endpointsuffix) {\n                var locationPrefix = result.location ? result.location + \".\" : \"\";\n                result[_DYN_INGESTIONENDPOINT ] = result[_DYN_INGESTIONENDPOINT ] || (\"https://\" + locationPrefix + \"dc.\" + result.endpointsuffix);\n            }\n            result[_DYN_INGESTIONENDPOINT ] = result[_DYN_INGESTIONENDPOINT ] || DEFAULT_BREEZE_ENDPOINT;\n        }\n        return result;\n    }\n\n    var Envelope = /** @class */ (function () {\n        function Envelope(logger, data, name) {\n            var _this = this;\n            var _self = this;\n            _self.ver = 1;\n            _self.sampleRate = 100.0;\n            _self.tags = {};\n            _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n            _self.data = data;\n            _self.time = toISOString(new Date());\n            _self.aiDataContract = {\n                time: 1 ,\n                iKey: 1 ,\n                name: 1 ,\n                sampleRate: function () {\n                    return (_this.sampleRate === 100) ? 4  : 1 ;\n                },\n                tags: 1 ,\n                data: 1\n            };\n        }\n        return Envelope;\n    }());\n\n    var Event$1 = /** @class */ (function () {\n        function Event(logger, name, properties, measurements) {\n            this.aiDataContract = {\n                ver: 1 ,\n                name: 1 ,\n                properties: 0 ,\n                measurements: 0\n            };\n            var _self = this;\n            _self.ver = 2;\n            _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n            _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        }\n        Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n        Event.dataType = \"EventData\";\n        return Event;\n    }());\n\n    var NoMethod = \"<no_method>\";\n    var strError = \"error\";\n    var strStack = \"stack\";\n    var strStackDetails = \"stackDetails\";\n    var strErrorSrc = \"errorSrc\";\n    var strMessage = \"message\";\n    var strDescription = \"description\";\n    function _stringify(value, convertToString) {\n        var result = value;\n        if (result && !isString(result)) {\n            if (JSON && JSON[_DYN_STRINGIFY$1 ]) {\n                result = JSON[_DYN_STRINGIFY$1 ](value);\n                if (convertToString && (!result || result === \"{}\")) {\n                    if (isFunction(value[_DYN_TO_STRING$2 ])) {\n                        result = value[_DYN_TO_STRING$2 ]();\n                    }\n                    else {\n                        result = \"\" + value;\n                    }\n                }\n            }\n            else {\n                result = \"\" + value + \" - (Missing JSON.stringify)\";\n            }\n        }\n        return result || \"\";\n    }\n    function _formatMessage(theEvent, errorType) {\n        var evtMessage = theEvent;\n        if (theEvent) {\n            if (evtMessage && !isString(evtMessage)) {\n                evtMessage = theEvent[strMessage] || theEvent[strDescription] || evtMessage;\n            }\n            if (evtMessage && !isString(evtMessage)) {\n                evtMessage = _stringify(evtMessage, true);\n            }\n            if (theEvent[\"filename\"]) {\n                evtMessage = evtMessage + \" @\" + (theEvent[\"filename\"] || \"\") + \":\" + (theEvent[\"lineno\"] || \"?\") + \":\" + (theEvent[\"colno\"] || \"?\");\n            }\n        }\n        if (errorType && errorType !== \"String\" && errorType !== \"Object\" && errorType !== \"Error\" && strIndexOf(evtMessage || \"\", errorType) === -1) {\n            evtMessage = errorType + \": \" + evtMessage;\n        }\n        return evtMessage || \"\";\n    }\n    function _isExceptionDetailsInternal(value) {\n        try {\n            if (isObject(value)) {\n                return \"hasFullStack\" in value && \"typeName\" in value;\n            }\n        }\n        catch (e) {\n        }\n        return false;\n    }\n    function _isExceptionInternal(value) {\n        try {\n            if (isObject(value)) {\n                return (\"ver\" in value && \"exceptions\" in value && \"properties\" in value);\n            }\n        }\n        catch (e) {\n        }\n        return false;\n    }\n    function _isStackDetails(details) {\n        return details && details.src && isString(details.src) && details.obj && isArray(details.obj);\n    }\n    function _convertStackObj(errorStack) {\n        var src = errorStack || \"\";\n        if (!isString(src)) {\n            if (isString(src[strStack])) {\n                src = src[strStack];\n            }\n            else {\n                src = \"\" + src;\n            }\n        }\n        var items = src[_DYN_SPLIT ](\"\\n\");\n        return {\n            src: src,\n            obj: items\n        };\n    }\n    function _getOperaStack(errorMessage) {\n        var stack = [];\n        var lines = errorMessage[_DYN_SPLIT ](\"\\n\");\n        for (var lp = 0; lp < lines[_DYN_LENGTH$4 ]; lp++) {\n            var entry = lines[lp];\n            if (lines[lp + 1]) {\n                entry += \"@\" + lines[lp + 1];\n                lp++;\n            }\n            stack.push(entry);\n        }\n        return {\n            src: errorMessage,\n            obj: stack\n        };\n    }\n    function _getStackFromErrorObj(errorObj) {\n        var details = null;\n        if (errorObj) {\n            try {\n                if (errorObj[strStack]) {\n                    details = _convertStackObj(errorObj[strStack]);\n                }\n                else if (errorObj[strError] && errorObj[strError][strStack]) {\n                    details = _convertStackObj(errorObj[strError][strStack]);\n                }\n                else if (errorObj[\"exception\"] && errorObj.exception[strStack]) {\n                    details = _convertStackObj(errorObj.exception[strStack]);\n                }\n                else if (_isStackDetails(errorObj)) {\n                    details = errorObj;\n                }\n                else if (_isStackDetails(errorObj[strStackDetails])) {\n                    details = errorObj[strStackDetails];\n                }\n                else if (window && window[\"opera\"] && errorObj[strMessage]) {\n                    details = _getOperaStack(errorObj[_DYN_MESSAGE$1 ]);\n                }\n                else if (errorObj[\"reason\"] && errorObj.reason[strStack]) {\n                    details = _convertStackObj(errorObj.reason[strStack]);\n                }\n                else if (isString(errorObj)) {\n                    details = _convertStackObj(errorObj);\n                }\n                else {\n                    var evtMessage = errorObj[strMessage] || errorObj[strDescription] || \"\";\n                    if (isString(errorObj[strErrorSrc])) {\n                        if (evtMessage) {\n                            evtMessage += \"\\n\";\n                        }\n                        evtMessage += \" from \" + errorObj[strErrorSrc];\n                    }\n                    if (evtMessage) {\n                        details = _convertStackObj(evtMessage);\n                    }\n                }\n            }\n            catch (e) {\n                details = _convertStackObj(e);\n            }\n        }\n        return details || {\n            src: \"\",\n            obj: null\n        };\n    }\n    function _formatStackTrace(stackDetails) {\n        var stack = \"\";\n        if (stackDetails) {\n            if (stackDetails.obj) {\n                arrForEach(stackDetails.obj, function (entry) {\n                    stack += entry + \"\\n\";\n                });\n            }\n            else {\n                stack = stackDetails.src || \"\";\n            }\n        }\n        return stack;\n    }\n    function _parseStack(stack) {\n        var parsedStack;\n        var frames = stack.obj;\n        if (frames && frames[_DYN_LENGTH$4 ] > 0) {\n            parsedStack = [];\n            var level_1 = 0;\n            var totalSizeInBytes_1 = 0;\n            arrForEach(frames, function (frame) {\n                var theFrame = frame[_DYN_TO_STRING$2 ]();\n                if (_StackFrame.regex.test(theFrame)) {\n                    var parsedFrame = new _StackFrame(theFrame, level_1++);\n                    totalSizeInBytes_1 += parsedFrame[_DYN_SIZE_IN_BYTES ];\n                    parsedStack.push(parsedFrame);\n                }\n            });\n            var exceptionParsedStackThreshold = 32 * 1024;\n            if (totalSizeInBytes_1 > exceptionParsedStackThreshold) {\n                var left = 0;\n                var right = parsedStack[_DYN_LENGTH$4 ] - 1;\n                var size = 0;\n                var acceptedLeft = left;\n                var acceptedRight = right;\n                while (left < right) {\n                    var lSize = parsedStack[left][_DYN_SIZE_IN_BYTES ];\n                    var rSize = parsedStack[right][_DYN_SIZE_IN_BYTES ];\n                    size += lSize + rSize;\n                    if (size > exceptionParsedStackThreshold) {\n                        var howMany = acceptedRight - acceptedLeft + 1;\n                        parsedStack.splice(acceptedLeft, howMany);\n                        break;\n                    }\n                    acceptedLeft = left;\n                    acceptedRight = right;\n                    left++;\n                    right--;\n                }\n            }\n        }\n        return parsedStack;\n    }\n    function _getErrorType(errorType) {\n        var typeName = \"\";\n        if (errorType) {\n            typeName = errorType.typeName || errorType[_DYN_NAME$2 ] || \"\";\n            if (!typeName) {\n                try {\n                    var funcNameRegex = /function (.{1,200})\\(/;\n                    var results = (funcNameRegex).exec((errorType).constructor[_DYN_TO_STRING$2 ]());\n                    typeName = (results && results[_DYN_LENGTH$4 ] > 1) ? results[1] : \"\";\n                }\n                catch (e) {\n                }\n            }\n        }\n        return typeName;\n    }\n    function _formatErrorCode(errorObj) {\n        if (errorObj) {\n            try {\n                if (!isString(errorObj)) {\n                    var errorType = _getErrorType(errorObj);\n                    var result = _stringify(errorObj, false);\n                    if (!result || result === \"{}\") {\n                        if (errorObj[strError]) {\n                            errorObj = errorObj[strError];\n                            errorType = _getErrorType(errorObj);\n                        }\n                        result = _stringify(errorObj, true);\n                    }\n                    if (strIndexOf(result, errorType) !== 0 && errorType !== \"String\") {\n                        return errorType + \":\" + result;\n                    }\n                    return result;\n                }\n            }\n            catch (e) {\n            }\n        }\n        return \"\" + (errorObj || \"\");\n    }\n    var Exception = /** @class */ (function () {\n        function Exception(logger, exception, properties, measurements, severityLevel, id) {\n            this.aiDataContract = {\n                ver: 1 ,\n                exceptions: 1 ,\n                severityLevel: 0 ,\n                properties: 0 ,\n                measurements: 0\n            };\n            var _self = this;\n            _self.ver = 2;\n            if (!_isExceptionInternal(exception)) {\n                if (!properties) {\n                    properties = {};\n                }\n                _self[_DYN_EXCEPTIONS ] = [new _ExceptionDetails(logger, exception, properties)];\n                _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n                _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n                if (severityLevel) {\n                    _self[_DYN_SEVERITY_LEVEL ] = severityLevel;\n                }\n                if (id) {\n                    _self.id = id;\n                }\n            }\n            else {\n                _self[_DYN_EXCEPTIONS ] = exception[_DYN_EXCEPTIONS ] || [];\n                _self[_DYN_PROPERTIES ] = exception[_DYN_PROPERTIES ];\n                _self[_DYN_MEASUREMENTS$1 ] = exception[_DYN_MEASUREMENTS$1 ];\n                if (exception[_DYN_SEVERITY_LEVEL ]) {\n                    _self[_DYN_SEVERITY_LEVEL ] = exception[_DYN_SEVERITY_LEVEL ];\n                }\n                if (exception.id) {\n                    _self.id = exception.id;\n                }\n                if (exception[_DYN_PROBLEM_GROUP ]) {\n                    _self[_DYN_PROBLEM_GROUP ] = exception[_DYN_PROBLEM_GROUP ];\n                }\n                if (!isNullOrUndefined(exception[_DYN_IS_MANUAL ])) {\n                    _self[_DYN_IS_MANUAL ] = exception[_DYN_IS_MANUAL ];\n                }\n            }\n        }\n        Exception.CreateAutoException = function (message, url, lineNumber, columnNumber, error, evt, stack, errorSrc) {\n            var _a;\n            var errorType = _getErrorType(error || evt || message);\n            return _a = {},\n                _a[_DYN_MESSAGE$1 ] = _formatMessage(message, errorType),\n                _a.url = url,\n                _a.lineNumber = lineNumber,\n                _a.columnNumber = columnNumber,\n                _a.error = _formatErrorCode(error || evt || message),\n                _a.evt = _formatErrorCode(evt || message),\n                _a[_DYN_TYPE_NAME ] = errorType,\n                _a.stackDetails = _getStackFromErrorObj(stack || error || evt),\n                _a.errorSrc = errorSrc,\n                _a;\n        };\n        Exception.CreateFromInterface = function (logger, exception, properties, measurements) {\n            var exceptions = exception[_DYN_EXCEPTIONS ]\n                && arrMap(exception[_DYN_EXCEPTIONS ], function (ex) { return _ExceptionDetails[_DYN__CREATE_FROM_INTERFA1 ](logger, ex); });\n            var exceptionData = new Exception(logger, __assignFn(__assignFn({}, exception), { exceptions: exceptions }), properties, measurements);\n            return exceptionData;\n        };\n        Exception.prototype.toInterface = function () {\n            var _a;\n            var _b = this, exceptions = _b.exceptions, properties = _b.properties, measurements = _b.measurements, severityLevel = _b.severityLevel, problemGroup = _b.problemGroup, id = _b.id, isManual = _b.isManual;\n            var exceptionDetailsInterface = exceptions instanceof Array\n                && arrMap(exceptions, function (exception) { return exception.toInterface(); })\n                || undefined;\n            return _a = {\n                    ver: \"4.0\"\n                },\n                _a[_DYN_EXCEPTIONS ] = exceptionDetailsInterface,\n                _a.severityLevel = severityLevel,\n                _a.properties = properties,\n                _a.measurements = measurements,\n                _a.problemGroup = problemGroup,\n                _a.id = id,\n                _a.isManual = isManual,\n                _a;\n        };\n        Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n            var _a;\n            return {\n                exceptions: [\n                    (_a = {},\n                        _a[_DYN_HAS_FULL_STACK ] = true,\n                        _a.message = message,\n                        _a.stack = details,\n                        _a.typeName = typeName,\n                        _a)\n                ]\n            };\n        };\n        Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n        Exception.dataType = \"ExceptionData\";\n        Exception.formatError = _formatErrorCode;\n        return Exception;\n    }());\n    var _ExceptionDetails = /** @class */ (function () {\n        function _ExceptionDetails(logger, exception, properties) {\n            this.aiDataContract = {\n                id: 0 ,\n                outerId: 0 ,\n                typeName: 1 ,\n                message: 1 ,\n                hasFullStack: 0 ,\n                stack: 0 ,\n                parsedStack: 2\n            };\n            var _self = this;\n            if (!_isExceptionDetailsInternal(exception)) {\n                var error = exception;\n                var evt = error && error.evt;\n                if (!isError(error)) {\n                    error = error[strError] || evt || error;\n                }\n                _self[_DYN_TYPE_NAME ] = dataSanitizeString(logger, _getErrorType(error)) || strNotSpecified;\n                _self[_DYN_MESSAGE$1 ] = dataSanitizeMessage(logger, _formatMessage(exception || error, _self[_DYN_TYPE_NAME ])) || strNotSpecified;\n                var stack = exception[strStackDetails] || _getStackFromErrorObj(exception);\n                _self[_DYN_PARSED_STACK ] = _parseStack(stack);\n                if (isArray(_self[_DYN_PARSED_STACK ])) {\n                    arrMap(_self[_DYN_PARSED_STACK ], function (frame) {\n                        frame[_DYN_ASSEMBLY ] = dataSanitizeString(logger, frame[_DYN_ASSEMBLY ]);\n                        frame[_DYN_FILE_NAME ] = dataSanitizeString(logger, frame[_DYN_FILE_NAME ]);\n                    });\n                }\n                _self[strStack] = dataSanitizeException(logger, _formatStackTrace(stack));\n                _self.hasFullStack = isArray(_self.parsedStack) && _self.parsedStack[_DYN_LENGTH$4 ] > 0;\n                if (properties) {\n                    properties[_DYN_TYPE_NAME ] = properties[_DYN_TYPE_NAME ] || _self[_DYN_TYPE_NAME ];\n                }\n            }\n            else {\n                _self[_DYN_TYPE_NAME ] = exception[_DYN_TYPE_NAME ];\n                _self[_DYN_MESSAGE$1 ] = exception[_DYN_MESSAGE$1 ];\n                _self[strStack] = exception[strStack];\n                _self[_DYN_PARSED_STACK ] = exception[_DYN_PARSED_STACK ] || [];\n                _self[_DYN_HAS_FULL_STACK ] = exception[_DYN_HAS_FULL_STACK ];\n            }\n        }\n        _ExceptionDetails.prototype.toInterface = function () {\n            var _a;\n            var _self = this;\n            var parsedStack = _self[_DYN_PARSED_STACK ] instanceof Array\n                && arrMap(_self[_DYN_PARSED_STACK ], function (frame) { return frame.toInterface(); });\n            var exceptionDetailsInterface = (_a = {\n                    id: _self.id,\n                    outerId: _self.outerId,\n                    typeName: _self[_DYN_TYPE_NAME ],\n                    message: _self[_DYN_MESSAGE$1 ],\n                    hasFullStack: _self[_DYN_HAS_FULL_STACK ],\n                    stack: _self[strStack]\n                },\n                _a[_DYN_PARSED_STACK ] = parsedStack || undefined,\n                _a);\n            return exceptionDetailsInterface;\n        };\n        _ExceptionDetails.CreateFromInterface = function (logger, exception) {\n            var parsedStack = (exception[_DYN_PARSED_STACK ] instanceof Array\n                && arrMap(exception[_DYN_PARSED_STACK ], function (frame) { return _StackFrame[_DYN__CREATE_FROM_INTERFA1 ](frame); }))\n                || exception[_DYN_PARSED_STACK ];\n            var exceptionDetails = new _ExceptionDetails(logger, __assignFn(__assignFn({}, exception), { parsedStack: parsedStack }));\n            return exceptionDetails;\n        };\n        return _ExceptionDetails;\n    }());\n    var _StackFrame = /** @class */ (function () {\n        function _StackFrame(sourceFrame, level) {\n            this.aiDataContract = {\n                level: 1 ,\n                method: 1 ,\n                assembly: 0 ,\n                fileName: 0 ,\n                line: 0\n            };\n            var _self = this;\n            _self[_DYN_SIZE_IN_BYTES ] = 0;\n            if (typeof sourceFrame === \"string\") {\n                var frame = sourceFrame;\n                _self[_DYN_LEVEL ] = level;\n                _self[_DYN_METHOD$1 ] = NoMethod;\n                _self[_DYN_ASSEMBLY ] = strTrim(frame);\n                _self[_DYN_FILE_NAME ] = \"\";\n                _self[_DYN_LINE ] = 0;\n                var matches = frame.match(_StackFrame.regex);\n                if (matches && matches[_DYN_LENGTH$4 ] >= 5) {\n                    _self[_DYN_METHOD$1 ] = strTrim(matches[2]) || _self[_DYN_METHOD$1 ];\n                    _self[_DYN_FILE_NAME ] = strTrim(matches[4]);\n                    _self[_DYN_LINE ] = parseInt(matches[5]) || 0;\n                }\n            }\n            else {\n                _self[_DYN_LEVEL ] = sourceFrame[_DYN_LEVEL ];\n                _self[_DYN_METHOD$1 ] = sourceFrame[_DYN_METHOD$1 ];\n                _self[_DYN_ASSEMBLY ] = sourceFrame[_DYN_ASSEMBLY ];\n                _self[_DYN_FILE_NAME ] = sourceFrame[_DYN_FILE_NAME ];\n                _self[_DYN_LINE ] = sourceFrame[_DYN_LINE ];\n                _self[_DYN_SIZE_IN_BYTES ] = 0;\n            }\n            _self.sizeInBytes += _self.method[_DYN_LENGTH$4 ];\n            _self.sizeInBytes += _self.fileName[_DYN_LENGTH$4 ];\n            _self.sizeInBytes += _self.assembly[_DYN_LENGTH$4 ];\n            _self[_DYN_SIZE_IN_BYTES ] += _StackFrame.baseSize;\n            _self.sizeInBytes += _self.level.toString()[_DYN_LENGTH$4 ];\n            _self.sizeInBytes += _self.line.toString()[_DYN_LENGTH$4 ];\n        }\n        _StackFrame.CreateFromInterface = function (frame) {\n            return new _StackFrame(frame, null );\n        };\n        _StackFrame.prototype.toInterface = function () {\n            var _self = this;\n            return {\n                level: _self[_DYN_LEVEL ],\n                method: _self[_DYN_METHOD$1 ],\n                assembly: _self[_DYN_ASSEMBLY ],\n                fileName: _self[_DYN_FILE_NAME ],\n                line: _self[_DYN_LINE ]\n            };\n        };\n        _StackFrame.regex = /^([\\s]+at)?[\\s]{0,50}([^\\@\\()]+?)[\\s]{0,50}(\\@|\\()([^\\(\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n        _StackFrame.baseSize = 58;\n        return _StackFrame;\n    }());\n\n    var DataPoint = /** @class */ (function () {\n        function DataPoint() {\n            this.aiDataContract = {\n                name: 1 ,\n                kind: 0 ,\n                value: 1 ,\n                count: 0 ,\n                min: 0 ,\n                max: 0 ,\n                stdDev: 0\n            };\n            this.kind = 0 ;\n        }\n        return DataPoint;\n    }());\n\n    var Metric = /** @class */ (function () {\n        function Metric(logger, name, value, count, min, max, stdDev, properties, measurements) {\n            this.aiDataContract = {\n                ver: 1 ,\n                metrics: 1 ,\n                properties: 0\n            };\n            var _self = this;\n            _self.ver = 2;\n            var dataPoint = new DataPoint();\n            dataPoint[_DYN_COUNT$1 ] = count > 0 ? count : undefined;\n            dataPoint.max = isNaN(max) || max === null ? undefined : max;\n            dataPoint.min = isNaN(min) || min === null ? undefined : min;\n            dataPoint[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n            dataPoint.value = value;\n            dataPoint.stdDev = isNaN(stdDev) || stdDev === null ? undefined : stdDev;\n            _self.metrics = [dataPoint];\n            _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        }\n        Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n        Metric.dataType = \"MetricData\";\n        return Metric;\n    }());\n\n    var strEmpty = \"\";\n    function msToTimeSpan(totalms) {\n        if (isNaN(totalms) || totalms < 0) {\n            totalms = 0;\n        }\n        totalms = Math.round(totalms);\n        var ms = strEmpty + totalms % 1000;\n        var sec = strEmpty + Math.floor(totalms / 1000) % 60;\n        var min = strEmpty + Math.floor(totalms / (1000 * 60)) % 60;\n        var hour = strEmpty + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n        var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n        ms = ms[_DYN_LENGTH$4 ] === 1 ? \"00\" + ms : ms[_DYN_LENGTH$4 ] === 2 ? \"0\" + ms : ms;\n        sec = sec[_DYN_LENGTH$4 ] < 2 ? \"0\" + sec : sec;\n        min = min[_DYN_LENGTH$4 ] < 2 ? \"0\" + min : min;\n        hour = hour[_DYN_LENGTH$4 ] < 2 ? \"0\" + hour : hour;\n        return (days > 0 ? days + \".\" : strEmpty) + hour + \":\" + min + \":\" + sec + \".\" + ms;\n    }\n    function isCrossOriginError(message, url, lineNumber, columnNumber, error) {\n        return !error && isString(message) && (message === \"Script error.\" || message === \"Script error\");\n    }\n\n    var PageView = /** @class */ (function () {\n        function PageView(logger, name, url, durationMs, properties, measurements, id) {\n            this.aiDataContract = {\n                ver: 1 ,\n                name: 0 ,\n                url: 0 ,\n                duration: 0 ,\n                properties: 0 ,\n                measurements: 0 ,\n                id: 0\n            };\n            var _self = this;\n            _self.ver = 2;\n            _self.id = dataSanitizeId(logger, id);\n            _self.url = dataSanitizeUrl(logger, url);\n            _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n            if (!isNaN(durationMs)) {\n                _self[_DYN_DURATION$1 ] = msToTimeSpan(durationMs);\n            }\n            _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        }\n        PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n        PageView.dataType = \"PageviewData\";\n        return PageView;\n    }());\n\n    var RemoteDependencyData = /** @class */ (function () {\n        function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, requestAPI, correlationContext, properties, measurements) {\n            if (requestAPI === void 0) { requestAPI = \"Ajax\"; }\n            this.aiDataContract = {\n                id: 1 ,\n                ver: 1 ,\n                name: 0 ,\n                resultCode: 0 ,\n                duration: 0 ,\n                success: 0 ,\n                data: 0 ,\n                target: 0 ,\n                type: 0 ,\n                properties: 0 ,\n                measurements: 0 ,\n                kind: 0 ,\n                value: 0 ,\n                count: 0 ,\n                min: 0 ,\n                max: 0 ,\n                stdDev: 0 ,\n                dependencyKind: 0 ,\n                dependencySource: 0 ,\n                commandName: 0 ,\n                dependencyTypeName: 0\n            };\n            var _self = this;\n            _self.ver = 2;\n            _self.id = id;\n            _self[_DYN_DURATION$1 ] = msToTimeSpan(value);\n            _self.success = success;\n            _self.resultCode = resultCode + \"\";\n            _self.type = dataSanitizeString(logger, requestAPI);\n            var dependencyFields = AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName);\n            _self.data = dataSanitizeUrl(logger, commandName) || dependencyFields.data;\n            _self.target = dataSanitizeString(logger, dependencyFields.target);\n            if (correlationContext) {\n                _self.target = \"\".concat(_self.target, \" | \").concat(correlationContext);\n            }\n            _self[_DYN_NAME$2 ] = dataSanitizeString(logger, dependencyFields[_DYN_NAME$2 ]);\n            _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n        }\n        RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n        RemoteDependencyData.dataType = \"RemoteDependencyData\";\n        return RemoteDependencyData;\n    }());\n\n    var Trace = /** @class */ (function () {\n        function Trace(logger, message, severityLevel, properties, measurements) {\n            this.aiDataContract = {\n                ver: 1 ,\n                message: 1 ,\n                severityLevel: 0 ,\n                properties: 0\n            };\n            var _self = this;\n            _self.ver = 2;\n            message = message || strNotSpecified;\n            _self[_DYN_MESSAGE$1 ] = dataSanitizeMessage(logger, message);\n            _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n            if (severityLevel) {\n                _self[_DYN_SEVERITY_LEVEL ] = severityLevel;\n            }\n        }\n        Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n        Trace.dataType = \"MessageData\";\n        return Trace;\n    }());\n\n    var PageViewPerformance = /** @class */ (function () {\n        function PageViewPerformance(logger, name, url, unused, properties, measurements, cs4BaseData) {\n            this.aiDataContract = {\n                ver: 1 ,\n                name: 0 ,\n                url: 0 ,\n                duration: 0 ,\n                perfTotal: 0 ,\n                networkConnect: 0 ,\n                sentRequest: 0 ,\n                receivedResponse: 0 ,\n                domProcessing: 0 ,\n                properties: 0 ,\n                measurements: 0\n            };\n            var _self = this;\n            _self.ver = 2;\n            _self.url = dataSanitizeUrl(logger, url);\n            _self[_DYN_NAME$2 ] = dataSanitizeString(logger, name) || strNotSpecified;\n            _self[_DYN_PROPERTIES ] = dataSanitizeProperties(logger, properties);\n            _self[_DYN_MEASUREMENTS$1 ] = dataSanitizeMeasurements(logger, measurements);\n            if (cs4BaseData) {\n                _self.domProcessing = cs4BaseData.domProcessing;\n                _self[_DYN_DURATION$1 ] = cs4BaseData[_DYN_DURATION$1 ];\n                _self.networkConnect = cs4BaseData.networkConnect;\n                _self.perfTotal = cs4BaseData.perfTotal;\n                _self[_DYN_RECEIVED_RESPONSE ] = cs4BaseData[_DYN_RECEIVED_RESPONSE ];\n                _self.sentRequest = cs4BaseData.sentRequest;\n            }\n        }\n        PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n        PageViewPerformance.dataType = \"PageviewPerformanceData\";\n        return PageViewPerformance;\n    }());\n\n    var Data = /** @class */ (function () {\n        function Data(baseType, data) {\n            this.aiDataContract = {\n                baseType: 1 ,\n                baseData: 1\n            };\n            this.baseType = baseType;\n            this.baseData = data;\n        }\n        return Data;\n    }());\n\n    function _aiNameFunc(baseName) {\n        var aiName = \"ai.\" + baseName + \".\";\n        return function (name) {\n            return aiName + name;\n        };\n    }\n    var _aiApplication = _aiNameFunc(\"application\");\n    var _aiDevice = _aiNameFunc(\"device\");\n    var _aiLocation = _aiNameFunc(\"location\");\n    var _aiOperation = _aiNameFunc(\"operation\");\n    var _aiSession = _aiNameFunc(\"session\");\n    var _aiUser = _aiNameFunc(\"user\");\n    var _aiCloud = _aiNameFunc(\"cloud\");\n    var _aiInternal = _aiNameFunc(\"internal\");\n    var ContextTagKeys = /** @class */ (function (_super) {\n        __extendsFn(ContextTagKeys, _super);\n        function ContextTagKeys() {\n            return _super.call(this) || this;\n        }\n        return ContextTagKeys;\n    }(createClassFromInterface({\n        applicationVersion: _aiApplication(\"ver\"),\n        applicationBuild: _aiApplication(\"build\"),\n        applicationTypeId: _aiApplication(\"typeId\"),\n        applicationId: _aiApplication(\"applicationId\"),\n        applicationLayer: _aiApplication(\"layer\"),\n        deviceId: _aiDevice(\"id\"),\n        deviceIp: _aiDevice(\"ip\"),\n        deviceLanguage: _aiDevice(\"language\"),\n        deviceLocale: _aiDevice(\"locale\"),\n        deviceModel: _aiDevice(\"model\"),\n        deviceFriendlyName: _aiDevice(\"friendlyName\"),\n        deviceNetwork: _aiDevice(\"network\"),\n        deviceNetworkName: _aiDevice(\"networkName\"),\n        deviceOEMName: _aiDevice(\"oemName\"),\n        deviceOS: _aiDevice(\"os\"),\n        deviceOSVersion: _aiDevice(\"osVersion\"),\n        deviceRoleInstance: _aiDevice(\"roleInstance\"),\n        deviceRoleName: _aiDevice(\"roleName\"),\n        deviceScreenResolution: _aiDevice(\"screenResolution\"),\n        deviceType: _aiDevice(\"type\"),\n        deviceMachineName: _aiDevice(\"machineName\"),\n        deviceVMName: _aiDevice(\"vmName\"),\n        deviceBrowser: _aiDevice(\"browser\"),\n        deviceBrowserVersion: _aiDevice(\"browserVersion\"),\n        locationIp: _aiLocation(\"ip\"),\n        locationCountry: _aiLocation(\"country\"),\n        locationProvince: _aiLocation(\"province\"),\n        locationCity: _aiLocation(\"city\"),\n        operationId: _aiOperation(\"id\"),\n        operationName: _aiOperation(\"name\"),\n        operationParentId: _aiOperation(\"parentId\"),\n        operationRootId: _aiOperation(\"rootId\"),\n        operationSyntheticSource: _aiOperation(\"syntheticSource\"),\n        operationCorrelationVector: _aiOperation(\"correlationVector\"),\n        sessionId: _aiSession(\"id\"),\n        sessionIsFirst: _aiSession(\"isFirst\"),\n        sessionIsNew: _aiSession(\"isNew\"),\n        userAccountAcquisitionDate: _aiUser(\"accountAcquisitionDate\"),\n        userAccountId: _aiUser(\"accountId\"),\n        userAgent: _aiUser(\"userAgent\"),\n        userId: _aiUser(\"id\"),\n        userStoreRegion: _aiUser(\"storeRegion\"),\n        userAuthUserId: _aiUser(\"authUserId\"),\n        userAnonymousUserAcquisitionDate: _aiUser(\"anonUserAcquisitionDate\"),\n        userAuthenticatedUserAcquisitionDate: _aiUser(\"authUserAcquisitionDate\"),\n        cloudName: _aiCloud(\"name\"),\n        cloudRole: _aiCloud(\"role\"),\n        cloudRoleVer: _aiCloud(\"roleVer\"),\n        cloudRoleInstance: _aiCloud(\"roleInstance\"),\n        cloudEnvironment: _aiCloud(\"environment\"),\n        cloudLocation: _aiCloud(\"location\"),\n        cloudDeploymentUnit: _aiCloud(\"deploymentUnit\"),\n        internalNodeName: _aiInternal(\"nodeName\"),\n        internalSdkVersion: _aiInternal(\"sdkVersion\"),\n        internalAgentVersion: _aiInternal(\"agentVersion\"),\n        internalSnippet: _aiInternal(\"snippet\"),\n        internalSdkSrc: _aiInternal(\"sdkSrc\")\n    })));\n\n    function createTelemetryItem(item, baseType, envelopeName, logger, customProperties, systemProperties) {\n        var _a;\n        envelopeName = dataSanitizeString(logger, envelopeName) || strNotSpecified;\n        if (isNullOrUndefined(item) ||\n            isNullOrUndefined(baseType) ||\n            isNullOrUndefined(envelopeName)) {\n            throwError(\"Input doesn't contain all required fields\");\n        }\n        var iKey = \"\";\n        if (item[strIkey]) {\n            iKey = item[strIkey];\n            delete item[strIkey];\n        }\n        var telemetryItem = (_a = {},\n            _a[_DYN_NAME$2 ] = envelopeName,\n            _a.time = toISOString(new Date()),\n            _a.iKey = iKey,\n            _a.ext = systemProperties ? systemProperties : {},\n            _a.tags = [],\n            _a.data = {},\n            _a.baseType = baseType,\n            _a.baseData = item\n        ,\n            _a);\n        if (!isNullOrUndefined(customProperties)) {\n            objForEachKey(customProperties, function (prop, value) {\n                telemetryItem.data[prop] = value;\n            });\n        }\n        return telemetryItem;\n    }\n\n    var Extensions = {\n        UserExt: \"user\",\n        DeviceExt: \"device\",\n        TraceExt: \"trace\",\n        WebExt: \"web\",\n        AppExt: \"app\",\n        OSExt: \"os\",\n        SessionExt: \"ses\",\n        SDKExt: \"sdk\"\n    };\n    var CtxTagKeys = new ContextTagKeys();\n\n    function createDomEvent(eventName) {\n        var event = null;\n        if (isFunction(Event)) {\n            event = new Event(eventName);\n        }\n        else {\n            var doc = getDocument();\n            if (doc && doc.createEvent) {\n                event = doc.createEvent(\"Event\");\n                event.initEvent(eventName, true, true);\n            }\n        }\n        return event;\n    }\n\n    var PropertiesPluginIdentifier = \"AppInsightsPropertiesPlugin\";\n    var BreezeChannelIdentifier = \"AppInsightsChannelPlugin\";\n    var AnalyticsPluginIdentifier = \"ApplicationInsightsAnalytics\";\n\n    var _DYN_TO_STRING$1 = \"toString\";\n    var _DYN_IS_STORAGE_USE_DISAB0 = \"isStorageUseDisabled\";\n    var _DYN__ADD_HOOK$1 = \"_addHook\";\n    var _DYN_CORE$1 = \"core\";\n    var _DYN_DATA_TYPE$1 = \"dataType\";\n    var _DYN_ENVELOPE_TYPE$1 = \"envelopeType\";\n    var _DYN_DIAG_LOG$1 = \"diagLog\";\n    var _DYN_TRACK = \"track\";\n    var _DYN_TRACK_PAGE_VIEW = \"trackPageView\";\n    var _DYN_TRACK_PREVIOUS_PAGE_1 = \"trackPreviousPageVisit\";\n    var _DYN_SEND_PAGE_VIEW_INTER2 = \"sendPageViewInternal\";\n    var _DYN_GET_ENTRIES_BY_TYPE = \"getEntriesByType\";\n    var _DYN_START_TIME$1 = \"startTime\";\n    var _DYN_DURATION = \"duration\";\n    var _DYN_SEND_PAGE_VIEW_PERFO3 = \"sendPageViewPerformanceInternal\";\n    var _DYN_POPULATE_PAGE_VIEW_P4 = \"populatePageViewPerformanceEvent\";\n    var _DYN_HREF = \"href\";\n    var _DYN_SEND_EXCEPTION_INTER5 = \"sendExceptionInternal\";\n    var _DYN_EXCEPTION$1 = \"exception\";\n    var _DYN_ERROR = \"error\";\n    var _DYN__ONERROR = \"_onerror\";\n    var _DYN_ERROR_SRC = \"errorSrc\";\n    var _DYN_LINE_NUMBER = \"lineNumber\";\n    var _DYN_COLUMN_NUMBER = \"columnNumber\";\n    var _DYN_MESSAGE = \"message\";\n    var _DYN__CREATE_AUTO_EXCEPTI6 = \"CreateAutoException\";\n    var _DYN_ADD_TELEMETRY_INITIA7 = \"addTelemetryInitializer\";\n    var _DYN_OVERRIDE_PAGE_VIEW_D8 = \"overridePageViewDuration\";\n    var _DYN_AUTO_TRACK_PAGE_VISI9 = \"autoTrackPageVisitTime\";\n    var _DYN_IS_BROWSER_LINK_TRAC10 = \"isBrowserLinkTrackingEnabled\";\n    var _DYN_LENGTH$3 = \"length\";\n    var _DYN_ENABLE_AUTO_ROUTE_TR11 = \"enableAutoRouteTracking\";\n    var _DYN_ENABLE_UNHANDLED_PRO12 = \"enableUnhandledPromiseRejectionTracking\";\n    var _DYN_AUTO_UNHANDLED_PROMI13 = \"autoUnhandledPromiseInstrumented\";\n    var _DYN_IS_PERFORMANCE_TIMIN14 = \"isPerformanceTimingSupported\";\n    var _DYN_GET_PERFORMANCE_TIMI15 = \"getPerformanceTiming\";\n    var _DYN_NAVIGATION_START = \"navigationStart\";\n    var _DYN_SHOULD_COLLECT_DURAT16 = \"shouldCollectDuration\";\n    var _DYN_IS_PERFORMANCE_TIMIN17 = \"isPerformanceTimingDataReady\";\n    var _DYN_RESPONSE_START = \"responseStart\";\n    var _DYN_REQUEST_START = \"requestStart\";\n    var _DYN_LOAD_EVENT_END = \"loadEventEnd\";\n    var _DYN_RESPONSE_END = \"responseEnd\";\n    var _DYN_CONNECT_END = \"connectEnd\";\n    var _DYN_PAGE_VISIT_START_TIM18 = \"pageVisitStartTime\";\n\n    var PageViewManager = /** @class */ (function () {\n        function PageViewManager(appInsights, overridePageViewDuration, core, pageViewPerformanceManager) {\n            dynamicProto(PageViewManager, this, function (_self) {\n                var queueTimer = null;\n                var itemQueue = [];\n                var pageViewPerformanceSent = false;\n                var _logger;\n                if (core) {\n                    _logger = core.logger;\n                }\n                function _flushChannels(isAsync) {\n                    if (core) {\n                        core.flush(isAsync, function () {\n                        });\n                    }\n                }\n                function _startTimer() {\n                    if (!queueTimer) {\n                        queueTimer = scheduleTimeout((function () {\n                            queueTimer = null;\n                            var allItems = itemQueue.slice(0);\n                            var doFlush = false;\n                            itemQueue = [];\n                            arrForEach(allItems, function (item) {\n                                if (!item()) {\n                                    itemQueue.push(item);\n                                }\n                                else {\n                                    doFlush = true;\n                                }\n                            });\n                            if (itemQueue[_DYN_LENGTH$3 ] > 0) {\n                                _startTimer();\n                            }\n                            if (doFlush) {\n                                _flushChannels(true);\n                            }\n                        }), 100);\n                    }\n                }\n                function _addQueue(cb) {\n                    itemQueue.push(cb);\n                    _startTimer();\n                }\n                _self[_DYN_TRACK_PAGE_VIEW ] = function (pageView, customProperties) {\n                    var name = pageView.name;\n                    if (isNullOrUndefined(name) || typeof name !== \"string\") {\n                        var doc = getDocument();\n                        name = pageView.name = doc && doc.title || \"\";\n                    }\n                    var uri = pageView.uri;\n                    if (isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                        var location_1 = getLocation();\n                        uri = pageView.uri = location_1 && location_1[_DYN_HREF ] || \"\";\n                    }\n                    if (!pageViewPerformanceManager[_DYN_IS_PERFORMANCE_TIMIN14 ]()) {\n                        appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                        _flushChannels(true);\n                        if (!isWebWorker()) {\n                            _throwInternal(_logger, 2 , 25 , \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                        }\n                        return;\n                    }\n                    var pageViewSent = false;\n                    var customDuration;\n                    var start = pageViewPerformanceManager[_DYN_GET_PERFORMANCE_TIMI15 ]()[_DYN_NAVIGATION_START ];\n                    if (start > 0) {\n                        customDuration = dateTimeUtilsDuration(start, +new Date);\n                        if (!pageViewPerformanceManager[_DYN_SHOULD_COLLECT_DURAT16 ](customDuration)) {\n                            customDuration = undefined;\n                        }\n                    }\n                    var duration;\n                    if (!isNullOrUndefined(customProperties) &&\n                        !isNullOrUndefined(customProperties[_DYN_DURATION ])) {\n                        duration = customProperties[_DYN_DURATION ];\n                    }\n                    if (overridePageViewDuration || !isNaN(duration)) {\n                        if (isNaN(duration)) {\n                            if (!customProperties) {\n                                customProperties = {};\n                            }\n                            customProperties[_DYN_DURATION ] = customDuration;\n                        }\n                        appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                        _flushChannels(true);\n                        pageViewSent = true;\n                    }\n                    var maxDurationLimit = 60000;\n                    if (!customProperties) {\n                        customProperties = {};\n                    }\n                    _addQueue(function () {\n                        var processed = false;\n                        try {\n                            if (pageViewPerformanceManager[_DYN_IS_PERFORMANCE_TIMIN17 ]()) {\n                                processed = true;\n                                var pageViewPerformance = {\n                                    name: name,\n                                    uri: uri\n                                };\n                                pageViewPerformanceManager[_DYN_POPULATE_PAGE_VIEW_P4 ](pageViewPerformance);\n                                if (!pageViewPerformance.isValid && !pageViewSent) {\n                                    customProperties[_DYN_DURATION ] = customDuration;\n                                    appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                                }\n                                else {\n                                    if (!pageViewSent) {\n                                        customProperties[_DYN_DURATION ] = pageViewPerformance.durationMs;\n                                        appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                                    }\n                                    if (!pageViewPerformanceSent) {\n                                        appInsights[_DYN_SEND_PAGE_VIEW_PERFO3 ](pageViewPerformance, customProperties);\n                                        pageViewPerformanceSent = true;\n                                    }\n                                }\n                            }\n                            else if (start > 0 && dateTimeUtilsDuration(start, +new Date) > maxDurationLimit) {\n                                processed = true;\n                                if (!pageViewSent) {\n                                    customProperties[_DYN_DURATION ] = maxDurationLimit;\n                                    appInsights[_DYN_SEND_PAGE_VIEW_INTER2 ](pageView, customProperties);\n                                }\n                            }\n                        }\n                        catch (e) {\n                            _throwInternal(_logger, 1 , 38 , \"trackPageView failed on page load calculation: \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                        return processed;\n                    });\n                };\n                _self.teardown = function (unloadCtx, unloadState) {\n                    if (queueTimer) {\n                        queueTimer.cancel();\n                        queueTimer = null;\n                        var allItems = itemQueue.slice(0);\n                        itemQueue = [];\n                        arrForEach(allItems, function (item) {\n                            if (item()) ;\n                        });\n                    }\n                };\n            });\n        }\n        PageViewManager.__ieDyn=1;\n        return PageViewManager;\n    }());\n\n    var MAX_DURATION_ALLOWED = 3600000;\n    var botAgentNames = [\"googlebot\", \"adsbot-google\", \"apis-google\", \"mediapartners-google\"];\n    function _isPerformanceTimingSupported() {\n        var perf = getPerformance();\n        return perf && !!perf.timing;\n    }\n    function _isPerformanceNavigationTimingSupported() {\n        var perf = getPerformance();\n        return perf && perf[_DYN_GET_ENTRIES_BY_TYPE ] && perf[_DYN_GET_ENTRIES_BY_TYPE ](\"navigation\")[_DYN_LENGTH$3 ] > 0;\n    }\n    function _isPerformanceTimingDataReady() {\n        var perf = getPerformance();\n        var timing = perf ? perf.timing : 0;\n        return timing\n            && timing.domainLookupStart > 0\n            && timing[_DYN_NAVIGATION_START ] > 0\n            && timing[_DYN_RESPONSE_START ] > 0\n            && timing[_DYN_REQUEST_START ] > 0\n            && timing[_DYN_LOAD_EVENT_END ] > 0\n            && timing[_DYN_RESPONSE_END ] > 0\n            && timing[_DYN_CONNECT_END ] > 0\n            && timing.domLoading > 0;\n    }\n    function _getPerformanceTiming() {\n        if (_isPerformanceTimingSupported()) {\n            return getPerformance().timing;\n        }\n        return null;\n    }\n    function _getPerformanceNavigationTiming() {\n        if (_isPerformanceNavigationTimingSupported()) {\n            return getPerformance()[_DYN_GET_ENTRIES_BY_TYPE ](\"navigation\")[0];\n        }\n        return null;\n    }\n    function _shouldCollectDuration() {\n        var durations = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            durations[_i] = arguments[_i];\n        }\n        var _navigator = getNavigator() || {};\n        var userAgent = _navigator.userAgent;\n        var isGoogleBot = false;\n        if (userAgent) {\n            for (var i = 0; i < botAgentNames[_DYN_LENGTH$3 ]; i++) {\n                isGoogleBot = isGoogleBot || strIndexOf(userAgent.toLowerCase(), botAgentNames[i]) !== -1;\n            }\n        }\n        if (isGoogleBot) {\n            return false;\n        }\n        else {\n            for (var i = 0; i < durations[_DYN_LENGTH$3 ]; i++) {\n                if (durations[i] < 0 || durations[i] >= MAX_DURATION_ALLOWED) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n    var PageViewPerformanceManager = /** @class */ (function () {\n        function PageViewPerformanceManager(core) {\n            var _logger = safeGetLogger(core);\n            dynamicProto(PageViewPerformanceManager, this, function (_self) {\n                _self[_DYN_POPULATE_PAGE_VIEW_P4 ] = function (pageViewPerformance) {\n                    pageViewPerformance.isValid = false;\n                    var navigationTiming = _getPerformanceNavigationTiming();\n                    var timing = _getPerformanceTiming();\n                    var total = 0;\n                    var network = 0;\n                    var request = 0;\n                    var response = 0;\n                    var dom = 0;\n                    if (navigationTiming || timing) {\n                        if (navigationTiming) {\n                            total = navigationTiming[_DYN_DURATION ];\n                            network = navigationTiming[_DYN_START_TIME$1 ] === 0 ? navigationTiming[_DYN_CONNECT_END ] : dateTimeUtilsDuration(navigationTiming[_DYN_START_TIME$1 ], navigationTiming[_DYN_CONNECT_END ]);\n                            request = dateTimeUtilsDuration(navigationTiming.requestStart, navigationTiming[_DYN_RESPONSE_START ]);\n                            response = dateTimeUtilsDuration(navigationTiming[_DYN_RESPONSE_START ], navigationTiming[_DYN_RESPONSE_END ]);\n                            dom = dateTimeUtilsDuration(navigationTiming.responseEnd, navigationTiming[_DYN_LOAD_EVENT_END ]);\n                        }\n                        else {\n                            total = dateTimeUtilsDuration(timing[_DYN_NAVIGATION_START ], timing[_DYN_LOAD_EVENT_END ]);\n                            network = dateTimeUtilsDuration(timing[_DYN_NAVIGATION_START ], timing[_DYN_CONNECT_END ]);\n                            request = dateTimeUtilsDuration(timing.requestStart, timing[_DYN_RESPONSE_START ]);\n                            response = dateTimeUtilsDuration(timing[_DYN_RESPONSE_START ], timing[_DYN_RESPONSE_END ]);\n                            dom = dateTimeUtilsDuration(timing.responseEnd, timing[_DYN_LOAD_EVENT_END ]);\n                        }\n                        if (total === 0) {\n                            _throwInternal(_logger, 2 , 10 , \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                        }\n                        else if (!_self[_DYN_SHOULD_COLLECT_DURAT16 ](total, network, request, response, dom)) {\n                            _throwInternal(_logger, 2 , 45 , \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                        }\n                        else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                            _throwInternal(_logger, 2 , 8 , \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                        }\n                        else {\n                            pageViewPerformance.durationMs = total;\n                            pageViewPerformance.perfTotal = pageViewPerformance[_DYN_DURATION ] = msToTimeSpan(total);\n                            pageViewPerformance.networkConnect = msToTimeSpan(network);\n                            pageViewPerformance.sentRequest = msToTimeSpan(request);\n                            pageViewPerformance.receivedResponse = msToTimeSpan(response);\n                            pageViewPerformance.domProcessing = msToTimeSpan(dom);\n                            pageViewPerformance.isValid = true;\n                        }\n                    }\n                };\n                _self[_DYN_GET_PERFORMANCE_TIMI15 ] = _getPerformanceTiming;\n                _self[_DYN_IS_PERFORMANCE_TIMIN14 ] = _isPerformanceTimingSupported;\n                _self[_DYN_IS_PERFORMANCE_TIMIN17 ] = _isPerformanceTimingDataReady;\n                _self[_DYN_SHOULD_COLLECT_DURAT16 ] = _shouldCollectDuration;\n            });\n        }\n        PageViewPerformanceManager.__ieDyn=1;\n        return PageViewPerformanceManager;\n    }());\n\n    var PageVisitTimeManager = /** @class */ (function () {\n        function PageVisitTimeManager(logger, pageVisitTimeTrackingHandler) {\n            var prevPageVisitDataKeyName = \"prevPageVisitData\";\n            dynamicProto(PageVisitTimeManager, this, function (_self) {\n                _self[_DYN_TRACK_PREVIOUS_PAGE_1 ] = function (currentPageName, currentPageUrl) {\n                    try {\n                        var prevPageVisitTimeData = restartPageVisitTimer(currentPageName, currentPageUrl);\n                        if (prevPageVisitTimeData) {\n                            pageVisitTimeTrackingHandler(prevPageVisitTimeData.pageName, prevPageVisitTimeData.pageUrl, prevPageVisitTimeData.pageVisitTime);\n                        }\n                    }\n                    catch (e) {\n                        _warnToConsole(logger, \"Auto track page visit time failed, metric will not be collected: \" + dumpObj(e));\n                    }\n                };\n                function restartPageVisitTimer(pageName, pageUrl) {\n                    var prevPageVisitData = null;\n                    try {\n                        prevPageVisitData = stopPageVisitTimer();\n                        if (utlCanUseSessionStorage()) {\n                            if (utlGetSessionStorage(logger, prevPageVisitDataKeyName) != null) {\n                                throwError(\"Cannot call startPageVisit consecutively without first calling stopPageVisit\");\n                            }\n                            var currPageVisitDataStr = getJSON().stringify(new PageVisitData(pageName, pageUrl));\n                            utlSetSessionStorage(logger, prevPageVisitDataKeyName, currPageVisitDataStr);\n                        }\n                    }\n                    catch (e) {\n                        _warnToConsole(logger, \"Call to restart failed: \" + dumpObj(e));\n                        prevPageVisitData = null;\n                    }\n                    return prevPageVisitData;\n                }\n                function stopPageVisitTimer() {\n                    var prevPageVisitData = null;\n                    try {\n                        if (utlCanUseSessionStorage()) {\n                            var pageVisitEndTime = utcNow();\n                            var pageVisitDataJsonStr = utlGetSessionStorage(logger, prevPageVisitDataKeyName);\n                            if (pageVisitDataJsonStr && hasJSON()) {\n                                prevPageVisitData = getJSON().parse(pageVisitDataJsonStr);\n                                prevPageVisitData.pageVisitTime = pageVisitEndTime - prevPageVisitData[_DYN_PAGE_VISIT_START_TIM18 ];\n                                utlRemoveSessionStorage(logger, prevPageVisitDataKeyName);\n                            }\n                        }\n                    }\n                    catch (e) {\n                        _warnToConsole(logger, \"Stop page visit timer failed: \" + dumpObj(e));\n                        prevPageVisitData = null;\n                    }\n                    return prevPageVisitData;\n                }\n                objDefine(_self, \"_logger\", { g: function () { return logger; } });\n                objDefine(_self, \"pageVisitTimeTrackingHandler\", { g: function () { return pageVisitTimeTrackingHandler; } });\n            });\n        }\n        PageVisitTimeManager.__ieDyn=1;\n        return PageVisitTimeManager;\n    }());\n    var PageVisitData = /** @class */ (function () {\n        function PageVisitData(pageName, pageUrl) {\n            this[_DYN_PAGE_VISIT_START_TIM18 ] = utcNow();\n            this.pageName = pageName;\n            this.pageUrl = pageUrl;\n        }\n        return PageVisitData;\n    }());\n\n    var Timing = /** @class */ (function () {\n        function Timing(logger, name) {\n            var _self = this;\n            var _events = {};\n            _self.start = function (name) {\n                if (typeof _events[name] !== \"undefined\") {\n                    _throwInternal(logger, 2 , 62 , \"start was called more than once for this event without calling stop.\", { name: name, key: name }, true);\n                }\n                _events[name] = +new Date;\n            };\n            _self.stop = function (name, url, properties, measurements) {\n                var start = _events[name];\n                if (isNaN(start)) {\n                    _throwInternal(logger, 2 , 63 , \"stop was called without a corresponding start.\", { name: name, key: name }, true);\n                }\n                else {\n                    var end = +new Date;\n                    var duration = dateTimeUtilsDuration(start, end);\n                    _self.action(name, url, duration, properties, measurements);\n                }\n                delete _events[name];\n                _events[name] = undefined;\n            };\n        }\n        return Timing;\n    }());\n\n    var _a$4;\n    var strEvent = \"event\";\n    function _dispatchEvent(target, evnt) {\n        if (target && target.dispatchEvent && evnt) {\n            target.dispatchEvent(evnt);\n        }\n    }\n    function _getReason(error) {\n        if (error && error.reason) {\n            var reason = error.reason;\n            if (!isString(reason) && isFunction(reason[_DYN_TO_STRING$1 ])) {\n                return reason[_DYN_TO_STRING$1 ]();\n            }\n            return dumpObj(reason);\n        }\n        return error || \"\";\n    }\n    var MinMilliSeconds = 60000;\n    var defaultValues = objDeepFreeze((_a$4 = {\n            sessionRenewalMs: cfgDfSet(_chkConfigMilliseconds, 30 * 60 * 1000),\n            sessionExpirationMs: cfgDfSet(_chkConfigMilliseconds, 24 * 60 * 60 * 1000),\n            disableExceptionTracking: cfgDfBoolean()\n        },\n        _a$4[_DYN_AUTO_TRACK_PAGE_VISI9 ] = cfgDfBoolean(),\n        _a$4[_DYN_OVERRIDE_PAGE_VIEW_D8 ] = cfgDfBoolean(),\n        _a$4[_DYN_ENABLE_UNHANDLED_PRO12 ] = cfgDfBoolean(),\n        _a$4[_DYN_AUTO_UNHANDLED_PROMI13 ] = false,\n        _a$4.samplingPercentage = cfgDfValidate(_chkSampling$1, 100),\n        _a$4[_DYN_IS_STORAGE_USE_DISAB0 ] = cfgDfBoolean(),\n        _a$4[_DYN_IS_BROWSER_LINK_TRAC10 ] = cfgDfBoolean(),\n        _a$4[_DYN_ENABLE_AUTO_ROUTE_TR11 ] = cfgDfBoolean(),\n        _a$4.namePrefix = cfgDfString(),\n        _a$4.enableDebug = cfgDfBoolean(),\n        _a$4.disableFlushOnBeforeUnload = cfgDfBoolean(),\n        _a$4.disableFlushOnUnload = cfgDfBoolean(false, \"disableFlushOnBeforeUnload\"),\n        _a$4));\n    function _chkConfigMilliseconds(value, defValue) {\n        value = value || defValue;\n        if (value < MinMilliSeconds) {\n            value = MinMilliSeconds;\n        }\n        return +value;\n    }\n    function _chkSampling$1(value) {\n        return !isNaN(value) && value > 0 && value <= 100;\n    }\n    function _updateStorageUsage(extConfig) {\n        if (!isUndefined(extConfig[_DYN_IS_STORAGE_USE_DISAB0 ])) {\n            if (extConfig[_DYN_IS_STORAGE_USE_DISAB0 ]) {\n                utlDisableStorage();\n            }\n            else {\n                utlEnableStorage();\n            }\n        }\n    }\n    var AnalyticsPlugin = /** @class */ (function (_super) {\n        __extendsFn(AnalyticsPlugin, _super);\n        function AnalyticsPlugin() {\n            var _this = _super.call(this) || this;\n            _this.identifier = AnalyticsPluginIdentifier;\n            _this.priority = 180;\n            _this.autoRoutePVDelay = 500;\n            var _eventTracking;\n            var _pageTracking;\n            var _pageViewManager;\n            var _pageViewPerformanceManager;\n            var _pageVisitTimeManager;\n            var _preInitTelemetryInitializers;\n            var _isBrowserLinkTrackingEnabled;\n            var _browserLinkInitializerAdded;\n            var _enableAutoRouteTracking;\n            var _historyListenerAdded;\n            var _disableExceptionTracking;\n            var _autoExceptionInstrumented;\n            var _enableUnhandledPromiseRejectionTracking;\n            var _autoUnhandledPromiseInstrumented;\n            var _extConfig;\n            var _autoTrackPageVisitTime;\n            var _prevUri;\n            var _currUri;\n            var _evtNamespace;\n            dynamicProto(AnalyticsPlugin, _this, function (_self, _base) {\n                var _addHook = _base[_DYN__ADD_HOOK$1 ];\n                _initDefaults();\n                _self.getCookieMgr = function () {\n                    return safeGetCookieMgr(_self[_DYN_CORE$1 ]);\n                };\n                _self.processTelemetry = function (env, itemCtx) {\n                    _self.processNext(env, itemCtx);\n                };\n                _self.trackEvent = function (event, customProperties) {\n                    try {\n                        var telemetryItem = createTelemetryItem(event, Event$1[_DYN_DATA_TYPE$1 ], Event$1[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                        _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                    }\n                    catch (e) {\n                        _throwInternal(2 , 39 , \"trackTrace failed, trace will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self.startTrackEvent = function (name) {\n                    try {\n                        _eventTracking.start(name);\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 29 , \"startTrackEvent failed, event will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self.stopTrackEvent = function (name, properties, measurements) {\n                    try {\n                        _eventTracking.stop(name, undefined, properties, measurements);\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 30 , \"stopTrackEvent failed, event will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self.trackTrace = function (trace, customProperties) {\n                    try {\n                        var telemetryItem = createTelemetryItem(trace, Trace[_DYN_DATA_TYPE$1 ], Trace[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                        _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                    }\n                    catch (e) {\n                        _throwInternal(2 , 39 , \"trackTrace failed, trace will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self.trackMetric = function (metric, customProperties) {\n                    try {\n                        var telemetryItem = createTelemetryItem(metric, Metric[_DYN_DATA_TYPE$1 ], Metric[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties);\n                        _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 36 , \"trackMetric failed, metric will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self[_DYN_TRACK_PAGE_VIEW ] = function (pageView, customProperties) {\n                    try {\n                        var inPv = pageView || {};\n                        _pageViewManager[_DYN_TRACK_PAGE_VIEW ](inPv, __assignFn(__assignFn(__assignFn({}, inPv.properties), inPv.measurements), customProperties));\n                        if (_autoTrackPageVisitTime) {\n                            _pageVisitTimeManager[_DYN_TRACK_PREVIOUS_PAGE_1 ](inPv.name, inPv.uri);\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 37 , \"trackPageView failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self[_DYN_SEND_PAGE_VIEW_INTER2 ] = function (pageView, properties, systemProperties) {\n                    var doc = getDocument();\n                    if (doc) {\n                        pageView.refUri = pageView.refUri === undefined ? doc.referrer : pageView.refUri;\n                    }\n                    var perf = getPerformance();\n                    var navigationEntries = (perf && perf[_DYN_GET_ENTRIES_BY_TYPE ] && perf[_DYN_GET_ENTRIES_BY_TYPE ](\"navigation\"));\n                    if (navigationEntries) {\n                        var navigationEntry = navigationEntries[0];\n                        var loadEventStart = navigationEntry.loadEventStart;\n                        pageView[_DYN_START_TIME$1 ] = new Date(perf.timeOrigin + loadEventStart);\n                    }\n                    else {\n                        var duration = ((properties || pageView.properties || {})[_DYN_DURATION ] || 0);\n                        pageView[_DYN_START_TIME$1 ] = new Date(new Date().getTime() - duration);\n                    }\n                    var telemetryItem = createTelemetryItem(pageView, PageView[_DYN_DATA_TYPE$1 ], PageView[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties, systemProperties);\n                    _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                };\n                _self[_DYN_SEND_PAGE_VIEW_PERFO3 ] = function (pageViewPerformance, properties, systemProperties) {\n                    var telemetryItem = createTelemetryItem(pageViewPerformance, PageViewPerformance[_DYN_DATA_TYPE$1 ], PageViewPerformance[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties, systemProperties);\n                    _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                };\n                _self.trackPageViewPerformance = function (pageViewPerformance, customProperties) {\n                    var inPvp = pageViewPerformance || {};\n                    try {\n                        _pageViewPerformanceManager[_DYN_POPULATE_PAGE_VIEW_P4 ](inPvp);\n                        _self[_DYN_SEND_PAGE_VIEW_PERFO3 ](inPvp, customProperties);\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 37 , \"trackPageViewPerformance failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self.startTrackPage = function (name) {\n                    try {\n                        if (typeof name !== \"string\") {\n                            var doc = getDocument();\n                            name = doc && doc.title || \"\";\n                        }\n                        _pageTracking.start(name);\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 31 , \"startTrackPage failed, page view may not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self.stopTrackPage = function (name, url, properties, measurement) {\n                    try {\n                        if (typeof name !== \"string\") {\n                            var doc = getDocument();\n                            name = doc && doc.title || \"\";\n                        }\n                        if (typeof url !== \"string\") {\n                            var loc = getLocation();\n                            url = loc && loc[_DYN_HREF ] || \"\";\n                        }\n                        _pageTracking.stop(name, url, properties, measurement);\n                        if (_autoTrackPageVisitTime) {\n                            _pageVisitTimeManager[_DYN_TRACK_PREVIOUS_PAGE_1 ](name, url);\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 32 , \"stopTrackPage failed, page view will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self[_DYN_SEND_EXCEPTION_INTER5 ] = function (exception, customProperties, systemProperties) {\n                    var theError = (exception && (exception[_DYN_EXCEPTION$1 ] || exception[_DYN_ERROR ])) ||\n                        isError(exception) && exception ||\n                        { name: (exception && typeof exception), message: exception || strNotSpecified };\n                    exception = exception || {};\n                    var exceptionPartB = new Exception(_self[_DYN_DIAG_LOG$1 ](), theError, exception.properties || customProperties, exception.measurements, exception.severityLevel, exception.id).toInterface();\n                    var telemetryItem = createTelemetryItem(exceptionPartB, Exception[_DYN_DATA_TYPE$1 ], Exception[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), customProperties, systemProperties);\n                    _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                };\n                _self.trackException = function (exception, customProperties) {\n                    if (exception && !exception[_DYN_EXCEPTION$1 ] && exception[_DYN_ERROR ]) {\n                        exception[_DYN_EXCEPTION$1 ] = exception[_DYN_ERROR ];\n                    }\n                    try {\n                        _self[_DYN_SEND_EXCEPTION_INTER5 ](exception, customProperties);\n                    }\n                    catch (e) {\n                        _throwInternal(1 , 35 , \"trackException failed, exception will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                };\n                _self[_DYN__ONERROR ] = function (exception) {\n                    var error = exception && exception[_DYN_ERROR ];\n                    var evt = exception && exception.evt;\n                    try {\n                        if (!evt) {\n                            var _window = getWindow();\n                            if (_window) {\n                                evt = _window[strEvent];\n                            }\n                        }\n                        var url = (exception && exception.url) || (getDocument() || {}).URL;\n                        var errorSrc = exception[_DYN_ERROR_SRC ] || \"window.onerror@\" + url + \":\" + (exception[_DYN_LINE_NUMBER ] || 0) + \":\" + (exception[_DYN_COLUMN_NUMBER ] || 0);\n                        var properties = {\n                            errorSrc: errorSrc,\n                            url: url,\n                            lineNumber: exception[_DYN_LINE_NUMBER ] || 0,\n                            columnNumber: exception[_DYN_COLUMN_NUMBER ] || 0,\n                            message: exception[_DYN_MESSAGE ]\n                        };\n                        if (isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception[_DYN_ERROR ])) {\n                            _sendCORSException(Exception[_DYN__CREATE_AUTO_EXCEPTI6 ](\"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\", url, exception[_DYN_LINE_NUMBER ] || 0, exception[_DYN_COLUMN_NUMBER ] || 0, error, evt, null, errorSrc), properties);\n                        }\n                        else {\n                            if (!exception[_DYN_ERROR_SRC ]) {\n                                exception[_DYN_ERROR_SRC ] = errorSrc;\n                            }\n                            _self.trackException({ exception: exception, severityLevel: 3  }, properties);\n                        }\n                    }\n                    catch (e) {\n                        var errorString = error ? (error.name + \", \" + error[_DYN_MESSAGE ]) : \"null\";\n                        _throwInternal(1 , 11 , \"_onError threw exception while logging error, error will not be collected: \"\n                            + getExceptionName(e), { exception: dumpObj(e), errorString: errorString });\n                    }\n                };\n                _self[_DYN_ADD_TELEMETRY_INITIA7 ] = function (telemetryInitializer) {\n                    if (_self[_DYN_CORE$1 ]) {\n                        return _self[_DYN_CORE$1 ][_DYN_ADD_TELEMETRY_INITIA7 ](telemetryInitializer);\n                    }\n                    if (!_preInitTelemetryInitializers) {\n                        _preInitTelemetryInitializers = [];\n                    }\n                    _preInitTelemetryInitializers.push(telemetryInitializer);\n                };\n                _self.initialize = function (config, core, extensions, pluginChain) {\n                    if (_self.isInitialized()) {\n                        return;\n                    }\n                    if (isNullOrUndefined(core)) {\n                        throwError(\"Error initializing\");\n                    }\n                    _base.initialize(config, core, extensions, pluginChain);\n                    try {\n                        _evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());\n                        if (_preInitTelemetryInitializers) {\n                            arrForEach(_preInitTelemetryInitializers, function (initializer) {\n                                core[_DYN_ADD_TELEMETRY_INITIA7 ](initializer);\n                            });\n                            _preInitTelemetryInitializers = null;\n                        }\n                        _populateDefaults(config);\n                        _pageViewPerformanceManager = new PageViewPerformanceManager(_self[_DYN_CORE$1 ]);\n                        _pageViewManager = new PageViewManager(_self, _extConfig.overridePageViewDuration, _self[_DYN_CORE$1 ], _pageViewPerformanceManager);\n                        _pageVisitTimeManager = new PageVisitTimeManager(_self[_DYN_DIAG_LOG$1 ](), function (pageName, pageUrl, pageVisitTime) { return trackPageVisitTime(pageName, pageUrl, pageVisitTime); });\n                        _eventTracking = new Timing(_self[_DYN_DIAG_LOG$1 ](), \"trackEvent\");\n                        _eventTracking.action =\n                            function (name, url, duration, properties, measurements) {\n                                if (!properties) {\n                                    properties = {};\n                                }\n                                if (!measurements) {\n                                    measurements = {};\n                                }\n                                properties.duration = duration[_DYN_TO_STRING$1 ]();\n                                _self.trackEvent({ name: name, properties: properties, measurements: measurements });\n                            };\n                        _pageTracking = new Timing(_self[_DYN_DIAG_LOG$1 ](), \"trackPageView\");\n                        _pageTracking.action = function (name, url, duration, properties, measurements) {\n                            if (isNullOrUndefined(properties)) {\n                                properties = {};\n                            }\n                            properties.duration = duration[_DYN_TO_STRING$1 ]();\n                            var pageViewItem = {\n                                name: name,\n                                uri: url,\n                                properties: properties,\n                                measurements: measurements\n                            };\n                            _self[_DYN_SEND_PAGE_VIEW_INTER2 ](pageViewItem, properties);\n                        };\n                        if (hasWindow()) {\n                            _updateExceptionTracking();\n                            _updateLocationChange();\n                        }\n                    }\n                    catch (e) {\n                        _self.setInitialized(false);\n                        throw e;\n                    }\n                };\n                _self._doTeardown = function (unloadCtx, unloadState) {\n                    _pageViewManager && _pageViewManager.teardown(unloadCtx, unloadState);\n                    eventOff(window, null, null, _evtNamespace);\n                    _initDefaults();\n                };\n                function _populateDefaults(config) {\n                    var identifier = _self.identifier;\n                    var core = _self[_DYN_CORE$1 ];\n                    _self[_DYN__ADD_HOOK$1 ](onConfigChange(config, function () {\n                        var ctx = createProcessTelemetryContext(null, config, core);\n                        _extConfig = ctx.getExtCfg(identifier, defaultValues);\n                        _autoTrackPageVisitTime = _extConfig[_DYN_AUTO_TRACK_PAGE_VISI9 ];\n                        if (config.storagePrefix) {\n                            utlSetStoragePrefix(config.storagePrefix);\n                        }\n                        _updateStorageUsage(_extConfig);\n                        _isBrowserLinkTrackingEnabled = _extConfig[_DYN_IS_BROWSER_LINK_TRAC10 ];\n                        _addDefaultTelemetryInitializers();\n                    }));\n                }\n                function trackPageVisitTime(pageName, pageUrl, pageVisitTime) {\n                    var properties = { PageName: pageName, PageUrl: pageUrl };\n                    _self.trackMetric({\n                        name: \"PageVisitTime\",\n                        average: pageVisitTime,\n                        max: pageVisitTime,\n                        min: pageVisitTime,\n                        sampleCount: 1\n                    }, properties);\n                }\n                function _addDefaultTelemetryInitializers() {\n                    if (!_browserLinkInitializerAdded && _isBrowserLinkTrackingEnabled) {\n                        var browserLinkPaths_1 = [\"/browserLinkSignalR/\", \"/__browserLink/\"];\n                        var dropBrowserLinkRequests = function (envelope) {\n                            if (_isBrowserLinkTrackingEnabled && envelope.baseType === RemoteDependencyData[_DYN_DATA_TYPE$1 ]) {\n                                var remoteData = envelope.baseData;\n                                if (remoteData) {\n                                    for (var i = 0; i < browserLinkPaths_1[_DYN_LENGTH$3 ]; i++) {\n                                        if (remoteData.target && strIndexOf(remoteData.target, browserLinkPaths_1[i]) >= 0) {\n                                            return false;\n                                        }\n                                    }\n                                }\n                            }\n                            return true;\n                        };\n                        _self[_DYN__ADD_HOOK$1 ](_self[_DYN_ADD_TELEMETRY_INITIA7 ](dropBrowserLinkRequests));\n                        _browserLinkInitializerAdded = true;\n                    }\n                }\n                function _sendCORSException(exception, properties) {\n                    var telemetryItem = createTelemetryItem(exception, Exception[_DYN_DATA_TYPE$1 ], Exception[_DYN_ENVELOPE_TYPE$1 ], _self[_DYN_DIAG_LOG$1 ](), properties);\n                    _self[_DYN_CORE$1 ][_DYN_TRACK ](telemetryItem);\n                }\n                function _updateExceptionTracking() {\n                    var _window = getWindow();\n                    var locn = getLocation(true);\n                    _self[_DYN__ADD_HOOK$1 ](onConfigChange(_extConfig, function () {\n                        _disableExceptionTracking = _extConfig.disableExceptionTracking;\n                        if (!_disableExceptionTracking && !_autoExceptionInstrumented && !_extConfig.autoExceptionInstrumented) {\n                            _addHook(InstrumentEvent(_window, \"onerror\", {\n                                ns: _evtNamespace,\n                                rsp: function (callDetails, message, url, lineNumber, columnNumber, error) {\n                                    if (!_disableExceptionTracking && callDetails.rslt !== true) {\n                                        _self[_DYN__ONERROR ](Exception[_DYN__CREATE_AUTO_EXCEPTI6 ](message, url, lineNumber, columnNumber, error, callDetails.evt));\n                                    }\n                                }\n                            }, false));\n                            _autoExceptionInstrumented = true;\n                        }\n                    }));\n                    _addUnhandledPromiseRejectionTracking(_window, locn);\n                }\n                function _updateLocationChange() {\n                    var win = getWindow();\n                    var locn = getLocation(true);\n                    _self[_DYN__ADD_HOOK$1 ](onConfigChange(_extConfig, function () {\n                        _enableAutoRouteTracking = _extConfig[_DYN_ENABLE_AUTO_ROUTE_TR11 ] === true;\n                        if (win && _enableAutoRouteTracking && !_historyListenerAdded && hasHistory()) {\n                            var _history = getHistory();\n                            if (isFunction(_history.pushState) && isFunction(_history.replaceState) && typeof Event !== strShimUndefined) {\n                                _addHistoryListener(win, _history, locn);\n                            }\n                        }\n                    }));\n                }\n                function _getDistributedTraceCtx() {\n                    var distributedTraceCtx = null;\n                    if (_self[_DYN_CORE$1 ] && _self[_DYN_CORE$1 ].getTraceCtx) {\n                        distributedTraceCtx = _self[_DYN_CORE$1 ].getTraceCtx(false);\n                    }\n                    if (!distributedTraceCtx) {\n                        var properties = _self[_DYN_CORE$1 ].getPlugin(PropertiesPluginIdentifier);\n                        if (properties) {\n                            var context = properties.plugin.context;\n                            if (context) {\n                                distributedTraceCtx = createDistributedTraceContextFromTrace(context.telemetryTrace);\n                            }\n                        }\n                    }\n                    return distributedTraceCtx;\n                }\n                function _addHistoryListener(win, history, locn) {\n                    if (_historyListenerAdded) {\n                        return;\n                    }\n                    var namePrefix = _extConfig.namePrefix || \"\";\n                    function _popstateHandler() {\n                        if (_enableAutoRouteTracking) {\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                        }\n                    }\n                    function _locationChangeHandler() {\n                        if (_currUri) {\n                            _prevUri = _currUri;\n                            _currUri = locn && locn[_DYN_HREF ] || \"\";\n                        }\n                        else {\n                            _currUri = locn && locn[_DYN_HREF ] || \"\";\n                        }\n                        if (_enableAutoRouteTracking) {\n                            var distributedTraceCtx = _getDistributedTraceCtx();\n                            if (distributedTraceCtx) {\n                                distributedTraceCtx.setTraceId(generateW3CId());\n                                var traceLocationName = \"_unknown_\";\n                                if (locn && locn.pathname) {\n                                    traceLocationName = locn.pathname + (locn.hash || \"\");\n                                }\n                                distributedTraceCtx.setName(dataSanitizeString(_self[_DYN_DIAG_LOG$1 ](), traceLocationName));\n                            }\n                            scheduleTimeout((function (uri) {\n                                _self[_DYN_TRACK_PAGE_VIEW ]({ refUri: uri, properties: { duration: 0 } });\n                            }).bind(_self, _prevUri), _self.autoRoutePVDelay);\n                        }\n                    }\n                    _addHook(InstrumentEvent(history, \"pushState\", {\n                        ns: _evtNamespace,\n                        rsp: function () {\n                            if (_enableAutoRouteTracking) {\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"pushState\"));\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                            }\n                        }\n                    }, true));\n                    _addHook(InstrumentEvent(history, \"replaceState\", {\n                        ns: _evtNamespace,\n                        rsp: function () {\n                            if (_enableAutoRouteTracking) {\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"replaceState\"));\n                                _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                            }\n                        }\n                    }, true));\n                    eventOn(win, namePrefix + \"popstate\", _popstateHandler, _evtNamespace);\n                    eventOn(win, namePrefix + \"locationchange\", _locationChangeHandler, _evtNamespace);\n                    _historyListenerAdded = true;\n                }\n                function _addUnhandledPromiseRejectionTracking(_window, _location) {\n                    _self[_DYN__ADD_HOOK$1 ](onConfigChange(_extConfig, function () {\n                        _enableUnhandledPromiseRejectionTracking = _extConfig[_DYN_ENABLE_UNHANDLED_PRO12 ] === true;\n                        _autoExceptionInstrumented = _autoExceptionInstrumented || _extConfig[_DYN_AUTO_UNHANDLED_PROMI13 ];\n                        if (_enableUnhandledPromiseRejectionTracking && !_autoUnhandledPromiseInstrumented) {\n                            _addHook(InstrumentEvent(_window, \"onunhandledrejection\", {\n                                ns: _evtNamespace,\n                                rsp: function (callDetails, error) {\n                                    if (_enableUnhandledPromiseRejectionTracking && callDetails.rslt !== true) {\n                                        _self[_DYN__ONERROR ](Exception[_DYN__CREATE_AUTO_EXCEPTI6 ](_getReason(error), _location ? _location[_DYN_HREF ] : \"\", 0, 0, error, callDetails.evt));\n                                    }\n                                }\n                            }, false));\n                            _extConfig[_DYN_AUTO_UNHANDLED_PROMI13 ] = _autoUnhandledPromiseInstrumented = true;\n                        }\n                    }));\n                }\n                function _throwInternal(severity, msgId, msg, properties, isUserAct) {\n                    _self[_DYN_DIAG_LOG$1 ]().throwInternal(severity, msgId, msg, properties, isUserAct);\n                }\n                function _initDefaults() {\n                    _eventTracking = null;\n                    _pageTracking = null;\n                    _pageViewManager = null;\n                    _pageViewPerformanceManager = null;\n                    _pageVisitTimeManager = null;\n                    _preInitTelemetryInitializers = null;\n                    _isBrowserLinkTrackingEnabled = false;\n                    _browserLinkInitializerAdded = false;\n                    _enableAutoRouteTracking = false;\n                    _historyListenerAdded = false;\n                    _disableExceptionTracking = false;\n                    _autoExceptionInstrumented = false;\n                    _enableUnhandledPromiseRejectionTracking = false;\n                    _autoUnhandledPromiseInstrumented = false;\n                    _autoTrackPageVisitTime = false;\n                    var location = getLocation(true);\n                    _prevUri = location && location[_DYN_HREF ] || \"\";\n                    _currUri = null;\n                    _evtNamespace = null;\n                    _extConfig = null;\n                    objDefine(_self, \"config\", {\n                        g: function () { return _extConfig; }\n                    });\n                }\n                objDefine(_self, \"_pageViewManager\", { g: function () { return _pageViewManager; } });\n                objDefine(_self, \"_pageViewPerformanceManager\", { g: function () { return _pageViewPerformanceManager; } });\n                objDefine(_self, \"_pageVisitTimeManager\", { g: function () { return _pageVisitTimeManager; } });\n                objDefine(_self, \"_evtNamespace\", { g: function () { return \".\" + _evtNamespace; } });\n            });\n            return _this;\n        }\n        AnalyticsPlugin.Version = '3.0.2';\n        return AnalyticsPlugin;\n    }(BaseTelemetryPlugin));\n\n    var STR_DURATION$1 = \"duration\";\n\n    var _DYN_TAGS = \"tags\";\n    var _DYN_DEVICE_TYPE = \"deviceType\";\n    var _DYN_DATA = \"data\";\n    var _DYN_NAME$1 = \"name\";\n    var _DYN_TRACE_ID$1 = \"traceID\";\n    var _DYN_LENGTH$2 = \"length\";\n    var _DYN_STRINGIFY = \"stringify\";\n    var _DYN_MEASUREMENTS = \"measurements\";\n    var _DYN_DATA_TYPE = \"dataType\";\n    var _DYN_ENVELOPE_TYPE = \"envelopeType\";\n    var _DYN_TO_STRING = \"toString\";\n    var _DYN_ON_LINE = \"onLine\";\n    var _DYN_IS_ONLINE = \"isOnline\";\n    var _DYN__GET = \"_get\";\n    var _DYN_ENQUEUE = \"enqueue\";\n    var _DYN_COUNT = \"count\";\n    var _DYN_EVENTS_LIMIT_IN_MEM = \"eventsLimitInMem\";\n    var _DYN_PUSH = \"push\";\n    var _DYN_EMIT_LINE_DELIMITED_0 = \"emitLineDelimitedJson\";\n    var _DYN_CLEAR = \"clear\";\n    var _DYN_BATCH_PAYLOADS = \"batchPayloads\";\n    var _DYN_CREATE_NEW = \"createNew\";\n    var _DYN_MARK_AS_SENT = \"markAsSent\";\n    var _DYN_CLEAR_SENT = \"clearSent\";\n    var _DYN_BUFFER_OVERRIDE = \"bufferOverride\";\n    var _DYN__BUFFER__KEY = \"BUFFER_KEY\";\n    var _DYN__SENT__BUFFER__KEY = \"SENT_BUFFER_KEY\";\n    var _DYN__MAX__BUFFER__SIZE = \"MAX_BUFFER_SIZE\";\n    var _DYN_TRIGGER_SEND = \"triggerSend\";\n    var _DYN_DIAG_LOG = \"diagLog\";\n    var _DYN__SENDER = \"_sender\";\n    var _DYN_CUSTOM_HEADERS = \"customHeaders\";\n    var _DYN_MAX_BATCH_SIZE_IN_BY1 = \"maxBatchSizeInBytes\";\n    var _DYN_ONUNLOAD_DISABLE_BEA2 = \"onunloadDisableBeacon\";\n    var _DYN_IS_BEACON_API_DISABL3 = \"isBeaconApiDisabled\";\n    var _DYN_ENABLE_SESSION_STORA4 = \"enableSessionStorageBuffer\";\n    var _DYN__BUFFER = \"_buffer\";\n    var _DYN_INSTRUMENTATION_KEY$1 = \"instrumentationKey\";\n    var _DYN_DISABLE_XHR = \"disableXhr\";\n    var _DYN_ONUNLOAD_DISABLE_FET5 = \"onunloadDisableFetch\";\n    var _DYN_CONVERT_UNDEFINED = \"convertUndefined\";\n    var _DYN_MAX_BATCH_INTERVAL = \"maxBatchInterval\";\n    var _DYN_BASE_TYPE = \"baseType\";\n    var _DYN_SAMPLE_RATE = \"sampleRate\";\n    var _DYN__XHR_READY_STATE_CHA6 = \"_xhrReadyStateChange\";\n    var _DYN__ON_ERROR = \"_onError\";\n    var _DYN__ON_PARTIAL_SUCCESS = \"_onPartialSuccess\";\n    var _DYN__ON_SUCCESS = \"_onSuccess\";\n    var _DYN_ITEMS_ACCEPTED = \"itemsAccepted\";\n    var _DYN_ITEMS_RECEIVED = \"itemsReceived\";\n    var _DYN_SET_REQUEST_HEADER$1 = \"setRequestHeader\";\n    var _DYN_EVENTS_SEND_REQUEST = \"eventsSendRequest\";\n    var _DYN_GET_SAMPLING_SCORE = \"getSamplingScore\";\n    var _DYN_GET_HASH_CODE_SCORE = \"getHashCodeScore\";\n\n    var strBaseType = \"baseType\";\n    var strBaseData = \"baseData\";\n    var strProperties = \"properties\";\n    var strTrue = \"true\";\n    function _setValueIf(target, field, value) {\n        return setValue(target, field, value, isTruthy);\n    }\n    function _extractPartAExtensions(logger, item, env) {\n        var envTags = env[_DYN_TAGS ] = env[_DYN_TAGS ] || {};\n        var itmExt = item.ext = item.ext || {};\n        var itmTags = item[_DYN_TAGS ] = item[_DYN_TAGS ] || [];\n        var extUser = itmExt.user;\n        if (extUser) {\n            _setValueIf(envTags, CtxTagKeys.userAuthUserId, extUser.authId);\n            _setValueIf(envTags, CtxTagKeys.userId, extUser.id || extUser.localId);\n        }\n        var extApp = itmExt.app;\n        if (extApp) {\n            _setValueIf(envTags, CtxTagKeys.sessionId, extApp.sesId);\n        }\n        var extDevice = itmExt.device;\n        if (extDevice) {\n            _setValueIf(envTags, CtxTagKeys.deviceId, extDevice.id || extDevice.localId);\n            _setValueIf(envTags, CtxTagKeys[_DYN_DEVICE_TYPE ], extDevice.deviceClass);\n            _setValueIf(envTags, CtxTagKeys.deviceIp, extDevice.ip);\n            _setValueIf(envTags, CtxTagKeys.deviceModel, extDevice.model);\n            _setValueIf(envTags, CtxTagKeys[_DYN_DEVICE_TYPE ], extDevice[_DYN_DEVICE_TYPE ]);\n        }\n        var web = item.ext.web;\n        if (web) {\n            _setValueIf(envTags, CtxTagKeys.deviceLanguage, web.browserLang);\n            _setValueIf(envTags, CtxTagKeys.deviceBrowserVersion, web.browserVer);\n            _setValueIf(envTags, CtxTagKeys.deviceBrowser, web.browser);\n            var envData = env[_DYN_DATA ] = env[_DYN_DATA ] || {};\n            var envBaseData = envData[strBaseData] = envData[strBaseData] || {};\n            var envProps = envBaseData[strProperties] = envBaseData[strProperties] || {};\n            _setValueIf(envProps, \"domain\", web.domain);\n            _setValueIf(envProps, \"isManual\", web.isManual ? strTrue : null);\n            _setValueIf(envProps, \"screenRes\", web.screenRes);\n            _setValueIf(envProps, \"userConsent\", web.userConsent ? strTrue : null);\n        }\n        var extOs = itmExt.os;\n        if (extOs) {\n            _setValueIf(envTags, CtxTagKeys.deviceOS, extOs[_DYN_NAME$1 ]);\n        }\n        var extTrace = itmExt.trace;\n        if (extTrace) {\n            _setValueIf(envTags, CtxTagKeys.operationParentId, extTrace.parentID);\n            _setValueIf(envTags, CtxTagKeys.operationName, dataSanitizeString(logger, extTrace[_DYN_NAME$1 ]));\n            _setValueIf(envTags, CtxTagKeys.operationId, extTrace[_DYN_TRACE_ID$1 ]);\n        }\n        var tgs = {};\n        for (var i = itmTags[_DYN_LENGTH$2 ] - 1; i >= 0; i--) {\n            var tg = itmTags[i];\n            objForEachKey(tg, function (key, value) {\n                tgs[key] = value;\n            });\n            itmTags.splice(i, 1);\n        }\n        objForEachKey(itmTags, function (tg, value) {\n            tgs[tg] = value;\n        });\n        var theTags = __assignFn(__assignFn({}, envTags), tgs);\n        if (!theTags[CtxTagKeys.internalSdkVersion]) {\n            theTags[CtxTagKeys.internalSdkVersion] = dataSanitizeString(logger, \"javascript:\".concat(EnvelopeCreator.Version), 64);\n        }\n        env[_DYN_TAGS ] = optimizeObject(theTags);\n    }\n    function _extractPropsAndMeasurements(data, properties, measurements) {\n        if (!isNullOrUndefined(data)) {\n            objForEachKey(data, function (key, value) {\n                if (isNumber(value)) {\n                    measurements[key] = value;\n                }\n                else if (isString(value)) {\n                    properties[key] = value;\n                }\n                else if (hasJSON()) {\n                    properties[key] = getJSON()[_DYN_STRINGIFY ](value);\n                }\n            });\n        }\n    }\n    function _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue) {\n        if (!isNullOrUndefined(properties)) {\n            objForEachKey(properties, function (key, value) {\n                properties[key] = value || customUndefinedValue;\n            });\n        }\n    }\n    function _createEnvelope(logger, envelopeType, telemetryItem, data) {\n        var envelope = new Envelope(logger, data, envelopeType);\n        _setValueIf(envelope, \"sampleRate\", telemetryItem[SampleRate]);\n        if ((telemetryItem[strBaseData] || {}).startTime) {\n            envelope.time = toISOString(telemetryItem[strBaseData].startTime);\n        }\n        envelope.iKey = telemetryItem.iKey;\n        var iKeyNoDashes = telemetryItem.iKey.replace(/-/g, \"\");\n        envelope[_DYN_NAME$1 ] = envelope[_DYN_NAME$1 ].replace(\"{0}\", iKeyNoDashes);\n        _extractPartAExtensions(logger, telemetryItem, envelope);\n        telemetryItem[_DYN_TAGS ] = telemetryItem[_DYN_TAGS ] || [];\n        return optimizeObject(envelope);\n    }\n    function EnvelopeCreatorInit(logger, telemetryItem) {\n        if (isNullOrUndefined(telemetryItem[strBaseData])) {\n            _throwInternal(logger, 1 , 46 , \"telemetryItem.baseData cannot be null.\");\n        }\n    }\n    var EnvelopeCreator = {\n        Version: '3.0.2'\n    };\n    function DependencyEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n        EnvelopeCreatorInit(logger, telemetryItem);\n        var customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n        var customProperties = telemetryItem[strBaseData][strProperties] || {};\n        _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n        if (!isNullOrUndefined(customUndefinedValue)) {\n            _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n        }\n        var bd = telemetryItem[strBaseData];\n        if (isNullOrUndefined(bd)) {\n            _warnToConsole(logger, \"Invalid input for dependency data\");\n            return null;\n        }\n        var method = bd[strProperties] && bd[strProperties][HttpMethod] ? bd[strProperties][HttpMethod] : \"GET\";\n        var remoteDepData = new RemoteDependencyData(logger, bd.id, bd.target, bd[_DYN_NAME$1 ], bd[STR_DURATION$1 ], bd.success, bd.responseCode, method, bd.type, bd.correlationContext, customProperties, customMeasurements);\n        var data = new Data(RemoteDependencyData[_DYN_DATA_TYPE ], remoteDepData);\n        return _createEnvelope(logger, RemoteDependencyData[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n    }\n    function EventEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n        EnvelopeCreatorInit(logger, telemetryItem);\n        var customProperties = {};\n        var customMeasurements = {};\n        if (telemetryItem[strBaseType] !== Event$1[_DYN_DATA_TYPE ]) {\n            customProperties[\"baseTypeSource\"] = telemetryItem[strBaseType];\n        }\n        if (telemetryItem[strBaseType] === Event$1[_DYN_DATA_TYPE ]) {\n            customProperties = telemetryItem[strBaseData][strProperties] || {};\n            customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n        }\n        else {\n            if (telemetryItem[strBaseData]) {\n                _extractPropsAndMeasurements(telemetryItem[strBaseData], customProperties, customMeasurements);\n            }\n        }\n        _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n        if (!isNullOrUndefined(customUndefinedValue)) {\n            _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n        }\n        var eventName = telemetryItem[strBaseData][_DYN_NAME$1 ];\n        var eventData = new Event$1(logger, eventName, customProperties, customMeasurements);\n        var data = new Data(Event$1[_DYN_DATA_TYPE ], eventData);\n        return _createEnvelope(logger, Event$1[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n    }\n    function ExceptionEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n        EnvelopeCreatorInit(logger, telemetryItem);\n        var customMeasurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n        var customProperties = telemetryItem[strBaseData][strProperties] || {};\n        _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], customProperties, customMeasurements);\n        if (!isNullOrUndefined(customUndefinedValue)) {\n            _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n        }\n        var bd = telemetryItem[strBaseData];\n        var exData = Exception.CreateFromInterface(logger, bd, customProperties, customMeasurements);\n        var data = new Data(Exception[_DYN_DATA_TYPE ], exData);\n        return _createEnvelope(logger, Exception[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n    }\n    function MetricEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n        EnvelopeCreatorInit(logger, telemetryItem);\n        var baseData = telemetryItem[strBaseData];\n        var props = baseData[strProperties] || {};\n        var measurements = baseData[_DYN_MEASUREMENTS ] || {};\n        _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], props, measurements);\n        if (!isNullOrUndefined(customUndefinedValue)) {\n            _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n        }\n        var baseMetricData = new Metric(logger, baseData[_DYN_NAME$1 ], baseData.average, baseData.sampleCount, baseData.min, baseData.max, baseData.stdDev, props, measurements);\n        var data = new Data(Metric[_DYN_DATA_TYPE ], baseMetricData);\n        return _createEnvelope(logger, Metric[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n    }\n    function PageViewEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n        EnvelopeCreatorInit(logger, telemetryItem);\n        var duration;\n        var baseData = telemetryItem[strBaseData];\n        if (!isNullOrUndefined(baseData) &&\n            !isNullOrUndefined(baseData[strProperties]) &&\n            !isNullOrUndefined(baseData[strProperties][STR_DURATION$1])) {\n            duration = baseData[strProperties][STR_DURATION$1];\n            delete baseData[strProperties][STR_DURATION$1];\n        }\n        else if (!isNullOrUndefined(telemetryItem[_DYN_DATA ]) &&\n            !isNullOrUndefined(telemetryItem[_DYN_DATA ][STR_DURATION$1])) {\n            duration = telemetryItem[_DYN_DATA ][STR_DURATION$1];\n            delete telemetryItem[_DYN_DATA ][STR_DURATION$1];\n        }\n        var bd = telemetryItem[strBaseData];\n        var currentContextId;\n        if (((telemetryItem.ext || {}).trace || {})[_DYN_TRACE_ID$1 ]) {\n            currentContextId = telemetryItem.ext.trace[_DYN_TRACE_ID$1 ];\n        }\n        var id = bd.id || currentContextId;\n        var name = bd[_DYN_NAME$1 ];\n        var url = bd.uri;\n        var properties = bd[strProperties] || {};\n        var measurements = bd[_DYN_MEASUREMENTS ] || {};\n        if (!isNullOrUndefined(bd.refUri)) {\n            properties[\"refUri\"] = bd.refUri;\n        }\n        if (!isNullOrUndefined(bd.pageType)) {\n            properties[\"pageType\"] = bd.pageType;\n        }\n        if (!isNullOrUndefined(bd.isLoggedIn)) {\n            properties[\"isLoggedIn\"] = bd.isLoggedIn[_DYN_TO_STRING ]();\n        }\n        if (!isNullOrUndefined(bd[strProperties])) {\n            var pageTags = bd[strProperties];\n            objForEachKey(pageTags, function (key, value) {\n                properties[key] = value;\n            });\n        }\n        _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], properties, measurements);\n        if (!isNullOrUndefined(customUndefinedValue)) {\n            _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n        }\n        var pageViewData = new PageView(logger, name, url, duration, properties, measurements, id);\n        var data = new Data(PageView[_DYN_DATA_TYPE ], pageViewData);\n        return _createEnvelope(logger, PageView[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n    }\n    function PageViewPerformanceEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n        EnvelopeCreatorInit(logger, telemetryItem);\n        var bd = telemetryItem[strBaseData];\n        var name = bd[_DYN_NAME$1 ];\n        var url = bd.uri || bd.url;\n        var properties = bd[strProperties] || {};\n        var measurements = bd[_DYN_MEASUREMENTS ] || {};\n        _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], properties, measurements);\n        if (!isNullOrUndefined(customUndefinedValue)) {\n            _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n        }\n        var baseData = new PageViewPerformance(logger, name, url, undefined, properties, measurements, bd);\n        var data = new Data(PageViewPerformance[_DYN_DATA_TYPE ], baseData);\n        return _createEnvelope(logger, PageViewPerformance[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n    }\n    function TraceEnvelopeCreator(logger, telemetryItem, customUndefinedValue) {\n        EnvelopeCreatorInit(logger, telemetryItem);\n        var message = telemetryItem[strBaseData].message;\n        var severityLevel = telemetryItem[strBaseData].severityLevel;\n        var props = telemetryItem[strBaseData][strProperties] || {};\n        var measurements = telemetryItem[strBaseData][_DYN_MEASUREMENTS ] || {};\n        _extractPropsAndMeasurements(telemetryItem[_DYN_DATA ], props, measurements);\n        if (!isNullOrUndefined(customUndefinedValue)) {\n            _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n        }\n        var baseData = new Trace(logger, message, severityLevel, props, measurements);\n        var data = new Data(Trace[_DYN_DATA_TYPE ], baseData);\n        return _createEnvelope(logger, Trace[_DYN_ENVELOPE_TYPE ], telemetryItem, data);\n    }\n\n    function _disableEvents(target, evtNamespace) {\n        eventOff(target, null, null, evtNamespace);\n    }\n    function createOfflineListener(parentEvtNamespace) {\n        var _a;\n        var _document = getDocument();\n        var _navigator = getNavigator();\n        var _isListening = false;\n        var _onlineStatus = true;\n        var _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"OfflineListener\"), parentEvtNamespace);\n        try {\n            if (_enableEvents(getWindow())) {\n                _isListening = true;\n            }\n            if (_document) {\n                var target = _document.body || _document;\n                if (target.ononline) {\n                    if (_enableEvents(target)) {\n                        _isListening = true;\n                    }\n                }\n            }\n            if (_isListening) {\n                if (_navigator && !isNullOrUndefined(_navigator[_DYN_ON_LINE ])) {\n                    _onlineStatus = _navigator[_DYN_ON_LINE ];\n                }\n            }\n        }\n        catch (e) {\n            _isListening = false;\n        }\n        function _enableEvents(target) {\n            var enabled = false;\n            if (target) {\n                enabled = eventOn(target, \"online\", _setOnline, _evtNamespace);\n                if (enabled) {\n                    eventOn(target, \"offline\", _setOffline, _evtNamespace);\n                }\n            }\n            return enabled;\n        }\n        function _setOnline() {\n            _onlineStatus = true;\n        }\n        function _setOffline() {\n            _onlineStatus = false;\n        }\n        function _isOnline() {\n            var result = true;\n            if (_isListening) {\n                result = _onlineStatus;\n            }\n            else if (_navigator && !isNullOrUndefined(_navigator[_DYN_ON_LINE ])) {\n                result = _navigator[_DYN_ON_LINE ];\n            }\n            return result;\n        }\n        function _unload() {\n            var win = getWindow();\n            if (win && _isListening) {\n                _disableEvents(win, _evtNamespace);\n                if (_document) {\n                    var target = _document.body || _document;\n                    if (!isUndefined(target.ononline)) {\n                        _disableEvents(target, _evtNamespace);\n                    }\n                }\n                _isListening = false;\n            }\n        }\n        return _a = {},\n            _a[_DYN_IS_ONLINE ] = _isOnline,\n            _a.isListening = function () { return _isListening; },\n            _a.unload = _unload,\n            _a;\n    }\n\n    var BaseSendBuffer = /** @class */ (function () {\n        function BaseSendBuffer(logger, config) {\n            var _buffer = [];\n            var _bufferFullMessageSent = false;\n            this[_DYN__GET ] = function () {\n                return _buffer;\n            };\n            this._set = function (buffer) {\n                _buffer = buffer;\n                return _buffer;\n            };\n            dynamicProto(BaseSendBuffer, this, function (_self) {\n                _self[_DYN_ENQUEUE ] = function (payload) {\n                    if (_self[_DYN_COUNT ]() >= config[_DYN_EVENTS_LIMIT_IN_MEM ]) {\n                        if (!_bufferFullMessageSent) {\n                            _throwInternal(logger, 2 , 105 , \"Maximum in-memory buffer size reached: \" + _self[_DYN_COUNT ](), true);\n                            _bufferFullMessageSent = true;\n                        }\n                        return;\n                    }\n                    _buffer[_DYN_PUSH ](payload);\n                };\n                _self[_DYN_COUNT ] = function () {\n                    return _buffer[_DYN_LENGTH$2 ];\n                };\n                _self.size = function () {\n                    var size = _buffer[_DYN_LENGTH$2 ];\n                    for (var lp = 0; lp < _buffer[_DYN_LENGTH$2 ]; lp++) {\n                        size += _buffer[lp][_DYN_LENGTH$2 ];\n                    }\n                    if (!config[_DYN_EMIT_LINE_DELIMITED_0 ]) {\n                        size += 2;\n                    }\n                    return size;\n                };\n                _self[_DYN_CLEAR ] = function () {\n                    _buffer = [];\n                    _bufferFullMessageSent = false;\n                };\n                _self.getItems = function () {\n                    return _buffer.slice(0);\n                };\n                _self[_DYN_BATCH_PAYLOADS ] = function (payload) {\n                    if (payload && payload[_DYN_LENGTH$2 ] > 0) {\n                        var batch = config[_DYN_EMIT_LINE_DELIMITED_0 ] ?\n                            payload.join(\"\\n\") :\n                            \"[\" + payload.join(\",\") + \"]\";\n                        return batch;\n                    }\n                    return null;\n                };\n                _self[_DYN_CREATE_NEW ] = function (newLogger, newConfig, canUseSessionStorage) {\n                    var items = _buffer.slice(0);\n                    newLogger = newLogger || logger;\n                    newConfig = newConfig || {};\n                    var newBuffer = !!canUseSessionStorage ? new SessionStorageSendBuffer(newLogger, newConfig) : new ArraySendBuffer(newLogger, newConfig);\n                    arrForEach(items, function (payload) {\n                        newBuffer[_DYN_ENQUEUE ](payload);\n                    });\n                    return newBuffer;\n                };\n            });\n        }\n        BaseSendBuffer.__ieDyn=1;\n        return BaseSendBuffer;\n    }());\n    var ArraySendBuffer = /** @class */ (function (_super) {\n        __extendsFn(ArraySendBuffer, _super);\n        function ArraySendBuffer(logger, config) {\n            var _this = _super.call(this, logger, config) || this;\n            dynamicProto(ArraySendBuffer, _this, function (_self, _base) {\n                _self[_DYN_MARK_AS_SENT ] = function (payload) {\n                    _base[_DYN_CLEAR ]();\n                };\n                _self[_DYN_CLEAR_SENT ] = function (payload) {\n                };\n            });\n            return _this;\n        }\n        ArraySendBuffer.__ieDyn=1;\n        return ArraySendBuffer;\n    }(BaseSendBuffer));\n    var SessionStorageSendBuffer = /** @class */ (function (_super) {\n        __extendsFn(SessionStorageSendBuffer, _super);\n        function SessionStorageSendBuffer(logger, config) {\n            var _this = _super.call(this, logger, config) || this;\n            var _bufferFullMessageSent = false;\n            var _namePrefix = config === null || config === void 0 ? void 0 : config.namePrefix;\n            var _a = config[_DYN_BUFFER_OVERRIDE ] || { getItem: utlGetSessionStorage, setItem: utlSetSessionStorage }, getItem = _a.getItem, setItem = _a.setItem;\n            dynamicProto(SessionStorageSendBuffer, _this, function (_self, _base) {\n                var bufferItems = _getBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ]);\n                var notDeliveredItems = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n                var buffer = _self._set(bufferItems.concat(notDeliveredItems));\n                if (buffer[_DYN_LENGTH$2 ] > SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                    buffer[_DYN_LENGTH$2 ] = SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ];\n                }\n                _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], []);\n                _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], buffer);\n                _self[_DYN_ENQUEUE ] = function (payload) {\n                    if (_self[_DYN_COUNT ]() >= SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                        if (!_bufferFullMessageSent) {\n                            _throwInternal(logger, 2 , 67 , \"Maximum buffer size reached: \" + _self[_DYN_COUNT ](), true);\n                            _bufferFullMessageSent = true;\n                        }\n                        return;\n                    }\n                    _base[_DYN_ENQUEUE ](payload);\n                    _setBuffer(SessionStorageSendBuffer.BUFFER_KEY, _self[_DYN__GET ]());\n                };\n                _self[_DYN_CLEAR ] = function () {\n                    _base[_DYN_CLEAR ]();\n                    _setBuffer(SessionStorageSendBuffer.BUFFER_KEY, _self[_DYN__GET ]());\n                    _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], []);\n                    _bufferFullMessageSent = false;\n                };\n                _self[_DYN_MARK_AS_SENT ] = function (payload) {\n                    _setBuffer(SessionStorageSendBuffer[_DYN__BUFFER__KEY ], _self._set(_removePayloadsFromBuffer(payload, _self[_DYN__GET ]())));\n                    var sentElements = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n                    if (sentElements instanceof Array && payload instanceof Array) {\n                        sentElements = sentElements.concat(payload);\n                        if (sentElements[_DYN_LENGTH$2 ] > SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ]) {\n                            _throwInternal(logger, 1 , 67 , \"Sent buffer reached its maximum size: \" + sentElements[_DYN_LENGTH$2 ], true);\n                            sentElements[_DYN_LENGTH$2 ] = SessionStorageSendBuffer[_DYN__MAX__BUFFER__SIZE ];\n                        }\n                        _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], sentElements);\n                    }\n                };\n                _self[_DYN_CLEAR_SENT ] = function (payload) {\n                    var sentElements = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]);\n                    sentElements = _removePayloadsFromBuffer(payload, sentElements);\n                    _setBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ], sentElements);\n                };\n                _self[_DYN_CREATE_NEW ] = function (newLogger, newConfig, canUseSessionStorage) {\n                    canUseSessionStorage = !!canUseSessionStorage;\n                    var unsentItems = _self[_DYN__GET ]().slice(0);\n                    var sentItems = _getBuffer(SessionStorageSendBuffer[_DYN__SENT__BUFFER__KEY ]).slice(0);\n                    newLogger = newLogger || logger;\n                    newConfig = newConfig || {};\n                    _self[_DYN_CLEAR ]();\n                    var newBuffer = canUseSessionStorage ? new SessionStorageSendBuffer(newLogger, newConfig) : new ArraySendBuffer(newLogger, newConfig);\n                    arrForEach(unsentItems, function (payload) {\n                        newBuffer[_DYN_ENQUEUE ](payload);\n                    });\n                    if (canUseSessionStorage) {\n                        newBuffer[_DYN_MARK_AS_SENT ](sentItems);\n                    }\n                    return newBuffer;\n                };\n                function _removePayloadsFromBuffer(payloads, buffer) {\n                    var remaining = [];\n                    arrForEach(buffer, function (value) {\n                        if (!isFunction(value) && arrIndexOf(payloads, value) === -1) {\n                            remaining[_DYN_PUSH ](value);\n                        }\n                    });\n                    return remaining;\n                }\n                function _getBuffer(key) {\n                    var prefixedKey = key;\n                    try {\n                        prefixedKey = _namePrefix ? _namePrefix + \"_\" + prefixedKey : prefixedKey;\n                        var bufferJson = getItem(logger, prefixedKey);\n                        if (bufferJson) {\n                            var buffer_1 = getJSON().parse(bufferJson);\n                            if (isString(buffer_1)) {\n                                buffer_1 = getJSON().parse(buffer_1);\n                            }\n                            if (buffer_1 && isArray(buffer_1)) {\n                                return buffer_1;\n                            }\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(logger, 1 , 42 , \" storage key: \" + prefixedKey + \", \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                    return [];\n                }\n                function _setBuffer(key, buffer) {\n                    var prefixedKey = key;\n                    try {\n                        prefixedKey = _namePrefix ? _namePrefix + \"_\" + prefixedKey : prefixedKey;\n                        var bufferJson = JSON[_DYN_STRINGIFY ](buffer);\n                        setItem(logger, prefixedKey, bufferJson);\n                    }\n                    catch (e) {\n                        setItem(logger, prefixedKey, JSON[_DYN_STRINGIFY ]([]));\n                        _throwInternal(logger, 2 , 41 , \" storage key: \" + prefixedKey + \", \" + getExceptionName(e) + \". Buffer cleared\", { exception: dumpObj(e) });\n                    }\n                }\n            });\n            return _this;\n        }\n        SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n        SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n        SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n        return SessionStorageSendBuffer;\n    }(BaseSendBuffer));\n\n    var Serializer = /** @class */ (function () {\n        function Serializer(logger) {\n            dynamicProto(Serializer, this, function (_self) {\n                _self.serialize = function (input) {\n                    var output = _serializeObject(input, \"root\");\n                    try {\n                        return getJSON()[_DYN_STRINGIFY ](output);\n                    }\n                    catch (e) {\n                        _throwInternal(logger, 1 , 48 , (e && isFunction(e[_DYN_TO_STRING ])) ? e[_DYN_TO_STRING ]() : \"Error serializing object\", null, true);\n                    }\n                };\n                function _serializeObject(source, name) {\n                    var circularReferenceCheck = \"__aiCircularRefCheck\";\n                    var output = {};\n                    if (!source) {\n                        _throwInternal(logger, 1 , 48 , \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                        return output;\n                    }\n                    if (source[circularReferenceCheck]) {\n                        _throwInternal(logger, 2 , 50 , \"Circular reference detected while serializing object\", { name: name }, true);\n                        return output;\n                    }\n                    if (!source.aiDataContract) {\n                        if (name === \"measurements\") {\n                            output = _serializeStringMap(source, \"number\", name);\n                        }\n                        else if (name === \"properties\") {\n                            output = _serializeStringMap(source, \"string\", name);\n                        }\n                        else if (name === \"tags\") {\n                            output = _serializeStringMap(source, \"string\", name);\n                        }\n                        else if (isArray(source)) {\n                            output = _serializeArray(source, name);\n                        }\n                        else {\n                            _throwInternal(logger, 2 , 49 , \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                            try {\n                                getJSON()[_DYN_STRINGIFY ](source);\n                                output = source;\n                            }\n                            catch (e) {\n                                _throwInternal(logger, 1 , 48 , (e && isFunction(e[_DYN_TO_STRING ])) ? e[_DYN_TO_STRING ]() : \"Error serializing object\", null, true);\n                            }\n                        }\n                        return output;\n                    }\n                    source[circularReferenceCheck] = true;\n                    objForEachKey(source.aiDataContract, function (field, contract) {\n                        var isRequired = (isFunction(contract)) ? (contract() & 1 ) : (contract & 1 );\n                        var isHidden = (isFunction(contract)) ? (contract() & 4 ) : (contract & 4 );\n                        var isArray = contract & 2 ;\n                        var isPresent = source[field] !== undefined;\n                        var isObj = isObject(source[field]) && source[field] !== null;\n                        if (isRequired && !isPresent && !isArray) {\n                            _throwInternal(logger, 1 , 24 , \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                        }\n                        else if (!isHidden) {\n                            var value = void 0;\n                            if (isObj) {\n                                if (isArray) {\n                                    value = _serializeArray(source[field], field);\n                                }\n                                else {\n                                    value = _serializeObject(source[field], field);\n                                }\n                            }\n                            else {\n                                value = source[field];\n                            }\n                            if (value !== undefined) {\n                                output[field] = value;\n                            }\n                        }\n                    });\n                    delete source[circularReferenceCheck];\n                    return output;\n                }\n                function _serializeArray(sources, name) {\n                    var output;\n                    if (!!sources) {\n                        if (!isArray(sources)) {\n                            _throwInternal(logger, 1 , 54 , \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                        }\n                        else {\n                            output = [];\n                            for (var i = 0; i < sources[_DYN_LENGTH$2 ]; i++) {\n                                var source = sources[i];\n                                var item = _serializeObject(source, name + \"[\" + i + \"]\");\n                                output[_DYN_PUSH ](item);\n                            }\n                        }\n                    }\n                    return output;\n                }\n                function _serializeStringMap(map, expectedType, name) {\n                    var output;\n                    if (map) {\n                        output = {};\n                        objForEachKey(map, function (field, value) {\n                            if (expectedType === \"string\") {\n                                if (value === undefined) {\n                                    output[field] = \"undefined\";\n                                }\n                                else if (value === null) {\n                                    output[field] = \"null\";\n                                }\n                                else if (!value[_DYN_TO_STRING ]) {\n                                    output[field] = \"invalid field: toString() is not defined.\";\n                                }\n                                else {\n                                    output[field] = value[_DYN_TO_STRING ]();\n                                }\n                            }\n                            else if (expectedType === \"number\") {\n                                if (value === undefined) {\n                                    output[field] = \"undefined\";\n                                }\n                                else if (value === null) {\n                                    output[field] = \"null\";\n                                }\n                                else {\n                                    var num = parseFloat(value);\n                                    if (isNaN(num)) {\n                                        output[field] = \"NaN\";\n                                    }\n                                    else {\n                                        output[field] = num;\n                                    }\n                                }\n                            }\n                            else {\n                                output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                                _throwInternal(logger, 1 , output[field], null, true);\n                            }\n                        });\n                    }\n                    return output;\n                }\n            });\n        }\n        Serializer.__ieDyn=1;\n        return Serializer;\n    }());\n\n    var MIN_INPUT_LENGTH = 8;\n    var HashCodeScoreGenerator = /** @class */ (function () {\n        function HashCodeScoreGenerator() {\n        }\n        HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n            var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n            return score * 100;\n        };\n        HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n            if (input === \"\") {\n                return 0;\n            }\n            while (input[_DYN_LENGTH$2 ] < MIN_INPUT_LENGTH) {\n                input = input.concat(input);\n            }\n            var hash = 5381;\n            for (var i = 0; i < input[_DYN_LENGTH$2 ]; ++i) {\n                hash = ((hash << 5) + hash) + input.charCodeAt(i);\n                hash = hash & hash;\n            }\n            return Math.abs(hash);\n        };\n        HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n        return HashCodeScoreGenerator;\n    }());\n\n    var SamplingScoreGenerator = /** @class */ (function () {\n        function SamplingScoreGenerator() {\n            var _self = this;\n            var hashCodeGenerator = new HashCodeScoreGenerator();\n            var keys = new ContextTagKeys();\n            _self[_DYN_GET_SAMPLING_SCORE ] = function (item) {\n                var score = 0;\n                if (item[_DYN_TAGS ] && item[_DYN_TAGS ][keys.userId]) {\n                    score = hashCodeGenerator.getHashCodeScore(item[_DYN_TAGS ][keys.userId]);\n                }\n                else if (item.ext && item.ext.user && item.ext.user.id) {\n                    score = hashCodeGenerator[_DYN_GET_HASH_CODE_SCORE ](item.ext.user.id);\n                }\n                else if (item[_DYN_TAGS ] && item[_DYN_TAGS ][keys.operationId]) {\n                    score = hashCodeGenerator.getHashCodeScore(item[_DYN_TAGS ][keys.operationId]);\n                }\n                else if (item.ext && item.ext.telemetryTrace && item.ext.telemetryTrace[_DYN_TRACE_ID$1 ]) {\n                    score = hashCodeGenerator.getHashCodeScore(item.ext.telemetryTrace[_DYN_TRACE_ID$1 ]);\n                }\n                else {\n                    score = (Math.random() * 100);\n                }\n                return score;\n            };\n        }\n        return SamplingScoreGenerator;\n    }());\n\n    var Sample = /** @class */ (function () {\n        function Sample(sampleRate, logger) {\n            this.INT_MAX_VALUE = 2147483647;\n            var _logger = logger || safeGetLogger(null);\n            if (sampleRate > 100 || sampleRate < 0) {\n                _logger.throwInternal(2 , 58 , \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n                sampleRate = 100;\n            }\n            this[_DYN_SAMPLE_RATE ] = sampleRate;\n            this.samplingScoreGenerator = new SamplingScoreGenerator();\n        }\n        Sample.prototype.isSampledIn = function (envelope) {\n            var samplingPercentage = this[_DYN_SAMPLE_RATE ];\n            var isSampledIn = false;\n            if (samplingPercentage === null || samplingPercentage === undefined || samplingPercentage >= 100) {\n                return true;\n            }\n            else if (envelope.baseType === Metric[_DYN_DATA_TYPE ]) {\n                return true;\n            }\n            isSampledIn = this.samplingScoreGenerator[_DYN_GET_SAMPLING_SCORE ](envelope) < samplingPercentage;\n            return isSampledIn;\n        };\n        return Sample;\n    }());\n\n    var _a$3, _b;\n    var UNDEFINED_VALUE$1 = undefined;\n    var FetchSyncRequestSizeLimitBytes = 65000;\n    function _getResponseText(xhr) {\n        try {\n            return xhr.responseText;\n        }\n        catch (e) {\n        }\n        return null;\n    }\n    var defaultAppInsightsChannelConfig = objDeepFreeze((_a$3 = {\n            endpointUrl: cfgDfValidate(isTruthy, DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH)\n        },\n        _a$3[_DYN_EMIT_LINE_DELIMITED_0 ] = cfgDfBoolean(),\n        _a$3[_DYN_MAX_BATCH_INTERVAL ] = 15000,\n        _a$3[_DYN_MAX_BATCH_SIZE_IN_BY1 ] = 102400,\n        _a$3.disableTelemetry = cfgDfBoolean(),\n        _a$3[_DYN_ENABLE_SESSION_STORA4 ] = cfgDfBoolean(true),\n        _a$3.isRetryDisabled = cfgDfBoolean(),\n        _a$3[_DYN_IS_BEACON_API_DISABL3 ] = cfgDfBoolean(true),\n        _a$3[_DYN_DISABLE_XHR ] = cfgDfBoolean(),\n        _a$3[_DYN_ONUNLOAD_DISABLE_FET5 ] = cfgDfBoolean(),\n        _a$3[_DYN_ONUNLOAD_DISABLE_BEA2 ] = cfgDfBoolean(),\n        _a$3[_DYN_INSTRUMENTATION_KEY$1 ] = UNDEFINED_VALUE$1,\n        _a$3.namePrefix = UNDEFINED_VALUE$1,\n        _a$3.samplingPercentage = cfgDfValidate(_chkSampling, 100),\n        _a$3[_DYN_CUSTOM_HEADERS ] = UNDEFINED_VALUE$1,\n        _a$3[_DYN_CONVERT_UNDEFINED ] = UNDEFINED_VALUE$1,\n        _a$3[_DYN_EVENTS_LIMIT_IN_MEM ] = 10000,\n        _a$3[_DYN_BUFFER_OVERRIDE ] = false,\n        _a$3));\n    function _chkSampling(value) {\n        return !isNaN(value) && value > 0 && value <= 100;\n    }\n    var EnvelopeTypeCreator = (_b = {},\n        _b[Event$1.dataType] = EventEnvelopeCreator,\n        _b[Trace.dataType] = TraceEnvelopeCreator,\n        _b[PageView.dataType] = PageViewEnvelopeCreator,\n        _b[PageViewPerformance.dataType] = PageViewPerformanceEnvelopeCreator,\n        _b[Exception.dataType] = ExceptionEnvelopeCreator,\n        _b[Metric.dataType] = MetricEnvelopeCreator,\n        _b[RemoteDependencyData.dataType] = DependencyEnvelopeCreator,\n        _b);\n    var Sender = /** @class */ (function (_super) {\n        __extendsFn(Sender, _super);\n        function Sender() {\n            var _this = _super.call(this) || this;\n            _this.priority = 1001;\n            _this.identifier = BreezeChannelIdentifier;\n            var _consecutiveErrors;\n            var _retryAt;\n            var _paused;\n            var _timeoutHandle;\n            var _serializer;\n            var _stamp_specific_redirects;\n            var _headers;\n            var _syncFetchPayload = 0;\n            var _fallbackSender;\n            var _syncUnloadSender;\n            var _offlineListener;\n            var _evtNamespace;\n            var _endpointUrl;\n            var _orgEndpointUrl;\n            var _maxBatchSizeInBytes;\n            var _beaconSupported;\n            var _customHeaders;\n            var _disableTelemetry;\n            var _instrumentationKey;\n            var _convertUndefined;\n            var _isRetryDisabled;\n            var _maxBatchInterval;\n            var _sessionStorageUsed;\n            var _bufferOverrideUsed;\n            var _namePrefix;\n            var _enableSendPromise;\n            dynamicProto(Sender, _this, function (_self, _base) {\n                _initDefaults();\n                _self.pause = function () {\n                    _clearScheduledTimer();\n                    _paused = true;\n                };\n                _self.resume = function () {\n                    if (_paused) {\n                        _paused = false;\n                        _retryAt = null;\n                        _checkMaxSize();\n                        _setupTimer();\n                    }\n                };\n                _self.flush = function (isAsync, callBack, sendReason) {\n                    if (isAsync === void 0) { isAsync = true; }\n                    if (!_paused) {\n                        _clearScheduledTimer();\n                        try {\n                            return _self[_DYN_TRIGGER_SEND ](isAsync, null, sendReason || 1 );\n                        }\n                        catch (e) {\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 22 , \"flush failed, telemetry will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                    }\n                };\n                _self.onunloadFlush = function () {\n                    if (!_paused) {\n                        if (_beaconSupported) {\n                            try {\n                                return _self[_DYN_TRIGGER_SEND ](true, _doUnloadSend, 2 );\n                            }\n                            catch (e) {\n                                _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 20 , \"failed to flush with beacon sender on page unload, telemetry will not be collected: \" + getExceptionName(e), { exception: dumpObj(e) });\n                            }\n                        }\n                        else {\n                            _self.flush(false);\n                        }\n                    }\n                };\n                _self.addHeader = function (name, value) {\n                    _headers[name] = value;\n                };\n                _self.initialize = function (config, core, extensions, pluginChain) {\n                    if (_self.isInitialized()) {\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 28 , \"Sender is already initialized\");\n                    }\n                    _base.initialize(config, core, extensions, pluginChain);\n                    var identifier = _self.identifier;\n                    _serializer = new Serializer(core.logger);\n                    _consecutiveErrors = 0;\n                    _retryAt = null;\n                    _self[_DYN__SENDER ] = null;\n                    _stamp_specific_redirects = 0;\n                    var diagLog = _self[_DYN_DIAG_LOG ]();\n                    _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"Sender\"), core.evtNamespace && core.evtNamespace());\n                    _offlineListener = createOfflineListener(_evtNamespace);\n                    _self._addHook(onConfigChange(config, function (details) {\n                        var config = details.cfg;\n                        if (config.storagePrefix) {\n                            utlSetStoragePrefix(config.storagePrefix);\n                        }\n                        var ctx = createProcessTelemetryContext(null, config, core);\n                        var senderConfig = ctx.getExtCfg(identifier, defaultAppInsightsChannelConfig);\n                        objDefine(_self, \"_senderConfig\", {\n                            g: function () {\n                                return senderConfig;\n                            }\n                        });\n                        if (_orgEndpointUrl !== senderConfig.endpointUrl) {\n                            _endpointUrl = _orgEndpointUrl = senderConfig.endpointUrl;\n                        }\n                        if (_customHeaders && _customHeaders !== senderConfig[_DYN_CUSTOM_HEADERS ]) {\n                            arrForEach(_customHeaders, function (customHeader) {\n                                delete _headers[customHeader.header];\n                            });\n                        }\n                        _maxBatchSizeInBytes = senderConfig[_DYN_MAX_BATCH_SIZE_IN_BY1 ];\n                        _beaconSupported = (senderConfig[_DYN_ONUNLOAD_DISABLE_BEA2 ] === false || senderConfig[_DYN_IS_BEACON_API_DISABL3 ] === false) && isBeaconsSupported();\n                        var bufferOverride = senderConfig[_DYN_BUFFER_OVERRIDE ];\n                        var canUseSessionStorage = !!senderConfig[_DYN_ENABLE_SESSION_STORA4 ] &&\n                            (!!bufferOverride || utlCanUseSessionStorage());\n                        var namePrefix = senderConfig.namePrefix;\n                        var shouldUpdate = (canUseSessionStorage !== _sessionStorageUsed)\n                            || (canUseSessionStorage && (_namePrefix !== namePrefix))\n                            || (canUseSessionStorage && (_bufferOverrideUsed !== bufferOverride));\n                        if (_self[_DYN__BUFFER ]) {\n                            if (shouldUpdate) {\n                                try {\n                                    _self._buffer = _self._buffer[_DYN_CREATE_NEW ](diagLog, senderConfig, canUseSessionStorage);\n                                }\n                                catch (e) {\n                                    _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 12 , \"failed to transfer telemetry to different buffer storage, telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                                }\n                            }\n                            _checkMaxSize();\n                        }\n                        else {\n                            _self[_DYN__BUFFER ] = canUseSessionStorage\n                                ? new SessionStorageSendBuffer(diagLog, senderConfig) : new ArraySendBuffer(diagLog, senderConfig);\n                        }\n                        _namePrefix = namePrefix;\n                        _sessionStorageUsed = canUseSessionStorage;\n                        _bufferOverrideUsed = bufferOverride;\n                        _self._sample = new Sample(senderConfig.samplingPercentage, diagLog);\n                        _instrumentationKey = senderConfig[_DYN_INSTRUMENTATION_KEY$1 ];\n                        if (!_validateInstrumentationKey(_instrumentationKey, config)) {\n                            _throwInternal(diagLog, 1 , 100 , \"Invalid Instrumentation key \" + _instrumentationKey);\n                        }\n                        _customHeaders = senderConfig[_DYN_CUSTOM_HEADERS ];\n                        if (!isInternalApplicationInsightsEndpoint(_endpointUrl) && _customHeaders && _customHeaders[_DYN_LENGTH$2 ] > 0) {\n                            arrForEach(_customHeaders, function (customHeader) {\n                                _this.addHeader(customHeader.header, customHeader.value);\n                            });\n                        }\n                        else {\n                            _customHeaders = null;\n                        }\n                        _enableSendPromise = senderConfig.enableSendPromise;\n                        var sendPostFunc = null;\n                        if (!senderConfig[_DYN_DISABLE_XHR ] && useXDomainRequest()) {\n                            sendPostFunc = _xdrSender;\n                        }\n                        else if (!senderConfig[_DYN_DISABLE_XHR ] && isXhrSupported()) {\n                            sendPostFunc = _xhrSender;\n                        }\n                        if (!sendPostFunc && isFetchSupported()) {\n                            sendPostFunc = _fetchSender;\n                        }\n                        _fallbackSender = sendPostFunc || _xhrSender;\n                        if (!senderConfig[_DYN_IS_BEACON_API_DISABL3 ] && isBeaconsSupported()) {\n                            sendPostFunc = _beaconSender;\n                        }\n                        _self[_DYN__SENDER ] = sendPostFunc || _xhrSender;\n                        if (!senderConfig[_DYN_ONUNLOAD_DISABLE_FET5 ] && isFetchSupported(true)) {\n                            _syncUnloadSender = _fetchKeepAliveSender;\n                        }\n                        else if (isBeaconsSupported()) {\n                            _syncUnloadSender = _beaconSender;\n                        }\n                        else if (!senderConfig[_DYN_DISABLE_XHR ] && useXDomainRequest()) {\n                            _syncUnloadSender = _xdrSender;\n                        }\n                        else if (!senderConfig[_DYN_DISABLE_XHR ] && isXhrSupported()) {\n                            _syncUnloadSender = _xhrSender;\n                        }\n                        else {\n                            _syncUnloadSender = _fallbackSender;\n                        }\n                        _disableTelemetry = senderConfig.disableTelemetry;\n                        _convertUndefined = senderConfig[_DYN_CONVERT_UNDEFINED ] || UNDEFINED_VALUE$1;\n                        _isRetryDisabled = senderConfig.isRetryDisabled;\n                        _maxBatchInterval = senderConfig[_DYN_MAX_BATCH_INTERVAL ];\n                    }));\n                };\n                _self.processTelemetry = function (telemetryItem, itemCtx) {\n                    itemCtx = _self._getTelCtx(itemCtx);\n                    var diagLogger = itemCtx[_DYN_DIAG_LOG ]();\n                    try {\n                        if (_disableTelemetry) {\n                            return;\n                        }\n                        if (!telemetryItem) {\n                            _throwInternal(diagLogger, 1 , 7 , \"Cannot send empty telemetry\");\n                            return;\n                        }\n                        if (telemetryItem.baseData && !telemetryItem[_DYN_BASE_TYPE ]) {\n                            _throwInternal(diagLogger, 1 , 70 , \"Cannot send telemetry without baseData and baseType\");\n                            return;\n                        }\n                        if (!telemetryItem[_DYN_BASE_TYPE ]) {\n                            telemetryItem[_DYN_BASE_TYPE ] = \"EventData\";\n                        }\n                        if (!_self[_DYN__SENDER ]) {\n                            _throwInternal(diagLogger, 1 , 28 , \"Sender was not initialized\");\n                            return;\n                        }\n                        if (!_isSampledIn(telemetryItem)) {\n                            _throwInternal(diagLogger, 2 , 33 , \"Telemetry item was sampled out and not sent\", { SampleRate: _self._sample[_DYN_SAMPLE_RATE ] });\n                            return;\n                        }\n                        else {\n                            telemetryItem[SampleRate] = _self._sample[_DYN_SAMPLE_RATE ];\n                        }\n                        var defaultEnvelopeIkey = telemetryItem.iKey || _instrumentationKey;\n                        var aiEnvelope_1 = Sender.constructEnvelope(telemetryItem, defaultEnvelopeIkey, diagLogger, _convertUndefined);\n                        if (!aiEnvelope_1) {\n                            _throwInternal(diagLogger, 1 , 47 , \"Unable to create an AppInsights envelope\");\n                            return;\n                        }\n                        var doNotSendItem_1 = false;\n                        if (telemetryItem[_DYN_TAGS ] && telemetryItem[_DYN_TAGS ][ProcessLegacy]) {\n                            arrForEach(telemetryItem[_DYN_TAGS ][ProcessLegacy], function (callBack) {\n                                try {\n                                    if (callBack && callBack(aiEnvelope_1) === false) {\n                                        doNotSendItem_1 = true;\n                                        _warnToConsole(diagLogger, \"Telemetry processor check returns false\");\n                                    }\n                                }\n                                catch (e) {\n                                    _throwInternal(diagLogger, 1 , 64 , \"One of telemetry initializers failed, telemetry item will not be sent: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n                                }\n                            });\n                            delete telemetryItem[_DYN_TAGS ][ProcessLegacy];\n                        }\n                        if (doNotSendItem_1) {\n                            return;\n                        }\n                        var payload = _serializer.serialize(aiEnvelope_1);\n                        var buffer = _self[_DYN__BUFFER ];\n                        _checkMaxSize(payload);\n                        buffer[_DYN_ENQUEUE ](payload);\n                        _setupTimer();\n                    }\n                    catch (e) {\n                        _throwInternal(diagLogger, 2 , 12 , \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                    }\n                    _self.processNext(telemetryItem, itemCtx);\n                };\n                _self[_DYN__XHR_READY_STATE_CHA6 ] = function (xhr, payload, countOfItemsInPayload) {\n                    if (xhr.readyState === 4) {\n                        _checkResponsStatus(xhr.status, payload, xhr.responseURL, countOfItemsInPayload, _formatErrorMessageXhr(xhr), _getResponseText(xhr) || xhr.response);\n                    }\n                };\n                _self[_DYN_TRIGGER_SEND ] = function (async, forcedSender, sendReason) {\n                    if (async === void 0) { async = true; }\n                    var result;\n                    if (!_paused) {\n                        try {\n                            var buffer = _self[_DYN__BUFFER ];\n                            if (!_disableTelemetry) {\n                                if (buffer[_DYN_COUNT ]() > 0) {\n                                    var payload = buffer.getItems();\n                                    _notifySendRequest(sendReason || 0 , async);\n                                    if (forcedSender) {\n                                        result = forcedSender.call(_self, payload, async);\n                                    }\n                                    else {\n                                        result = _self[_DYN__SENDER ](payload, async);\n                                    }\n                                }\n                            }\n                            else {\n                                buffer[_DYN_CLEAR ]();\n                            }\n                            _clearScheduledTimer();\n                        }\n                        catch (e) {\n                            var ieVer = getIEVersion();\n                            if (!ieVer || ieVer > 9) {\n                                _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 40 , \"Telemetry transmission failed, some telemetry will be lost: \" + getExceptionName(e), { exception: dumpObj(e) });\n                            }\n                        }\n                    }\n                    return result;\n                };\n                _self._doTeardown = function (unloadCtx, unloadState) {\n                    _self.onunloadFlush();\n                    runTargetUnload(_offlineListener, false);\n                    _initDefaults();\n                };\n                _self[_DYN__ON_ERROR ] = function (payload, message, event) {\n                    _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 26 , \"Failed to send telemetry.\", { message: message });\n                    _self._buffer && _self._buffer[_DYN_CLEAR_SENT ](payload);\n                };\n                _self[_DYN__ON_PARTIAL_SUCCESS ] = function (payload, results) {\n                    var failed = [];\n                    var retry = [];\n                    var errors = results.errors.reverse();\n                    for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                        var error = errors_1[_i];\n                        var extracted = payload.splice(error.index, 1)[0];\n                        if (_isRetriable(error.statusCode)) {\n                            retry[_DYN_PUSH ](extracted);\n                        }\n                        else {\n                            failed[_DYN_PUSH ](extracted);\n                        }\n                    }\n                    if (payload[_DYN_LENGTH$2 ] > 0) {\n                        _self[_DYN__ON_SUCCESS ](payload, results[_DYN_ITEMS_ACCEPTED ]);\n                    }\n                    if (failed[_DYN_LENGTH$2 ] > 0) {\n                        _self[_DYN__ON_ERROR ](failed, _formatErrorMessageXhr(null, [\"partial success\", results[_DYN_ITEMS_ACCEPTED ], \"of\", results.itemsReceived].join(\" \")));\n                    }\n                    if (retry[_DYN_LENGTH$2 ] > 0) {\n                        _resendPayload(retry);\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \"Partial success. \" +\n                            \"Delivered: \" + payload[_DYN_LENGTH$2 ] + \", Failed: \" + failed[_DYN_LENGTH$2 ] +\n                            \". Will retry to send \" + retry[_DYN_LENGTH$2 ] + \" our of \" + results[_DYN_ITEMS_RECEIVED ] + \" items\");\n                    }\n                };\n                _self[_DYN__ON_SUCCESS ] = function (payload, countOfItemsInPayload) {\n                    _self._buffer && _self._buffer[_DYN_CLEAR_SENT ](payload);\n                };\n                _self._xdrOnLoad = function (xdr, payload) {\n                    var responseText = _getResponseText(xdr);\n                    if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\n                        _consecutiveErrors = 0;\n                        _self[_DYN__ON_SUCCESS ](payload, 0);\n                    }\n                    else {\n                        var results = _parseResponse(responseText);\n                        if (results && results.itemsReceived && results.itemsReceived > results[_DYN_ITEMS_ACCEPTED ]\n                            && !_isRetryDisabled) {\n                            _self[_DYN__ON_PARTIAL_SUCCESS ](payload, results);\n                        }\n                        else {\n                            _self[_DYN__ON_ERROR ](payload, _formatErrorMessageXdr(xdr));\n                        }\n                    }\n                };\n                function _isSampledIn(envelope) {\n                    return _self._sample.isSampledIn(envelope);\n                }\n                function _checkMaxSize(incomingPayload) {\n                    var incomingSize = incomingPayload ? incomingPayload[_DYN_LENGTH$2 ] : 0;\n                    if ((_self[_DYN__BUFFER ].size() + incomingSize) > _maxBatchSizeInBytes) {\n                        if (!_offlineListener || _offlineListener[_DYN_IS_ONLINE ]()) {\n                            _self[_DYN_TRIGGER_SEND ](true, null, 10 );\n                        }\n                        return true;\n                    }\n                    return false;\n                }\n                function _checkResponsStatus(status, payload, responseUrl, countOfItemsInPayload, errorMessage, res) {\n                    var response = null;\n                    if (!_self._appId) {\n                        response = _parseResponse(res);\n                        if (response && response.appId) {\n                            _self._appId = response.appId;\n                        }\n                    }\n                    if ((status < 200 || status >= 300) && status !== 0) {\n                        if (status === 301 || status === 307 || status === 308) {\n                            if (!_checkAndUpdateEndPointUrl(responseUrl)) {\n                                _self[_DYN__ON_ERROR ](payload, errorMessage);\n                                return;\n                            }\n                        }\n                        if (!_isRetryDisabled && _isRetriable(status)) {\n                            _resendPayload(payload);\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" +\n                                \"Response code \" + status + \". Will retry to send \" + payload[_DYN_LENGTH$2 ] + \" items.\");\n                        }\n                        else {\n                            _self[_DYN__ON_ERROR ](payload, errorMessage);\n                        }\n                    }\n                    else if (_offlineListener && !_offlineListener[_DYN_IS_ONLINE ]()) {\n                        if (!_isRetryDisabled) {\n                            var offlineBackOffMultiplier = 10;\n                            _resendPayload(payload, offlineBackOffMultiplier);\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". Offline - Response Code: \".concat(status, \". Offline status: \").concat(!_offlineListener.isOnline(), \". Will retry to send \").concat(payload.length, \" items.\"));\n                        }\n                    }\n                    else {\n                        _checkAndUpdateEndPointUrl(responseUrl);\n                        if (status === 206) {\n                            if (!response) {\n                                response = _parseResponse(res);\n                            }\n                            if (response && !_isRetryDisabled) {\n                                _self[_DYN__ON_PARTIAL_SUCCESS ](payload, response);\n                            }\n                            else {\n                                _self[_DYN__ON_ERROR ](payload, errorMessage);\n                            }\n                        }\n                        else {\n                            _consecutiveErrors = 0;\n                            _self[_DYN__ON_SUCCESS ](payload, countOfItemsInPayload);\n                        }\n                    }\n                }\n                function _checkAndUpdateEndPointUrl(responseUrl) {\n                    if (_stamp_specific_redirects >= 10) {\n                        return false;\n                    }\n                    if (!isNullOrUndefined(responseUrl) && responseUrl !== \"\") {\n                        if (responseUrl !== _endpointUrl) {\n                            _endpointUrl = responseUrl;\n                            ++_stamp_specific_redirects;\n                            return true;\n                        }\n                    }\n                    return false;\n                }\n                function _doUnloadSend(payload, isAsync) {\n                    if (_syncUnloadSender) {\n                        _syncUnloadSender(payload, false);\n                    }\n                    else {\n                        _beaconSender(payload);\n                    }\n                }\n                function _doBeaconSend(payload) {\n                    var nav = getNavigator();\n                    var buffer = _self[_DYN__BUFFER ];\n                    var url = _endpointUrl;\n                    var batch = _self._buffer[_DYN_BATCH_PAYLOADS ](payload);\n                    var plainTextBatch = new Blob([batch], { type: \"text/plain;charset=UTF-8\" });\n                    var queued = nav.sendBeacon(url, plainTextBatch);\n                    if (queued) {\n                        buffer[_DYN_MARK_AS_SENT ](payload);\n                        _self._onSuccess(payload, payload[_DYN_LENGTH$2 ]);\n                    }\n                    return queued;\n                }\n                function _beaconSender(payload, isAsync) {\n                    if (isArray(payload) && payload[_DYN_LENGTH$2 ] > 0) {\n                        if (!_doBeaconSend(payload)) {\n                            var droppedPayload = [];\n                            for (var lp = 0; lp < payload[_DYN_LENGTH$2 ]; lp++) {\n                                var thePayload = payload[lp];\n                                if (!_doBeaconSend([thePayload])) {\n                                    droppedPayload[_DYN_PUSH ](thePayload);\n                                }\n                            }\n                            if (droppedPayload[_DYN_LENGTH$2 ] > 0) {\n                                _fallbackSender && _fallbackSender(droppedPayload, true);\n                                _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" + \"Failed to send telemetry with Beacon API, retried with normal sender.\");\n                            }\n                        }\n                    }\n                }\n                function _xhrSender(payload, isAsync) {\n                    var thePromise;\n                    var resolveFunc;\n                    var rejectFunc;\n                    var xhr = new XMLHttpRequest();\n                    var endPointUrl = _endpointUrl;\n                    try {\n                        xhr[DisabledPropertyName] = true;\n                    }\n                    catch (e) {\n                    }\n                    xhr.open(\"POST\", endPointUrl, isAsync);\n                    xhr[_DYN_SET_REQUEST_HEADER$1 ](\"Content-type\", \"application/json\");\n                    if (isInternalApplicationInsightsEndpoint(endPointUrl)) {\n                        xhr[_DYN_SET_REQUEST_HEADER$1 ](RequestHeaders[6 ], RequestHeaders[7 ]);\n                    }\n                    arrForEach(objKeys(_headers), function (headerName) {\n                        xhr[_DYN_SET_REQUEST_HEADER$1 ](headerName, _headers[headerName]);\n                    });\n                    xhr.onreadystatechange = function () {\n                        _self._xhrReadyStateChange(xhr, payload, payload[_DYN_LENGTH$2 ]);\n                        if (xhr.readyState === 4) {\n                            resolveFunc && resolveFunc(true);\n                        }\n                    };\n                    xhr.onerror = function (event) {\n                        _self[_DYN__ON_ERROR ](payload, _formatErrorMessageXhr(xhr), event);\n                        rejectFunc && rejectFunc(event);\n                    };\n                    if (isAsync && _enableSendPromise) {\n                        thePromise = createPromise(function (resolve, reject) {\n                            resolveFunc = resolve;\n                            rejectFunc = reject;\n                        });\n                    }\n                    var batch = _self._buffer[_DYN_BATCH_PAYLOADS ](payload);\n                    xhr.send(batch);\n                    _self._buffer[_DYN_MARK_AS_SENT ](payload);\n                    return thePromise;\n                }\n                function _fetchKeepAliveSender(payload, isAsync) {\n                    if (isArray(payload)) {\n                        var payloadSize = payload[_DYN_LENGTH$2 ];\n                        for (var lp = 0; lp < payload[_DYN_LENGTH$2 ]; lp++) {\n                            payloadSize += payload[lp][_DYN_LENGTH$2 ];\n                        }\n                        if ((_syncFetchPayload + payloadSize) <= FetchSyncRequestSizeLimitBytes) {\n                            _doFetchSender(payload, false);\n                        }\n                        else if (isBeaconsSupported()) {\n                            _beaconSender(payload);\n                        }\n                        else {\n                            _fallbackSender && _fallbackSender(payload, true);\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" + \"Failed to send telemetry with Beacon API, retried with xhrSender.\");\n                        }\n                    }\n                }\n                function _fetchSender(payload, isAsync) {\n                    return _doFetchSender(payload, true);\n                }\n                function _doFetchSender(payload, isAsync) {\n                    var _a;\n                    var endPointUrl = _endpointUrl;\n                    var batch = _self._buffer[_DYN_BATCH_PAYLOADS ](payload);\n                    var plainTextBatch = new Blob([batch], { type: \"application/json\" });\n                    var thePromise;\n                    var resolveFunc;\n                    var rejectFunc;\n                    var requestHeaders = new Headers();\n                    var batchLength = batch[_DYN_LENGTH$2 ];\n                    var ignoreResponse = false;\n                    var responseHandled = false;\n                    if (isInternalApplicationInsightsEndpoint(endPointUrl)) {\n                        requestHeaders.append(RequestHeaders[6 ], RequestHeaders[7 ]);\n                    }\n                    arrForEach(objKeys(_headers), function (headerName) {\n                        requestHeaders.append(headerName, _headers[headerName]);\n                    });\n                    var init = (_a = {\n                            method: \"POST\",\n                            headers: requestHeaders,\n                            body: plainTextBatch\n                        },\n                        _a[DisabledPropertyName] = true\n                    ,\n                        _a);\n                    if (!isAsync) {\n                        init.keepalive = true;\n                        ignoreResponse = true;\n                        _syncFetchPayload += batchLength;\n                    }\n                    var request = new Request(endPointUrl, init);\n                    try {\n                        request[DisabledPropertyName] = true;\n                    }\n                    catch (e) {\n                    }\n                    _self._buffer[_DYN_MARK_AS_SENT ](payload);\n                    if (isAsync && _enableSendPromise) {\n                        thePromise = createPromise(function (resolve, reject) {\n                            resolveFunc = resolve;\n                            rejectFunc = reject;\n                        });\n                    }\n                    try {\n                        doAwaitResponse(fetch(request), function (result) {\n                            if (!isAsync) {\n                                _syncFetchPayload -= batchLength;\n                                batchLength = 0;\n                            }\n                            if (!responseHandled) {\n                                responseHandled = true;\n                                if (!result.rejected) {\n                                    var response_1 = result.value;\n                                    if (!response_1.ok) {\n                                        _self[_DYN__ON_ERROR ](payload, response_1.statusText);\n                                        resolveFunc && resolveFunc(false);\n                                    }\n                                    else {\n                                        doAwaitResponse(response_1.text(), function (resp) {\n                                            _checkResponsStatus(response_1.status, payload, response_1.url, payload[_DYN_LENGTH$2 ], response_1.statusText, resp.value || \"\");\n                                            resolveFunc && resolveFunc(true);\n                                        });\n                                    }\n                                }\n                                else {\n                                    _self[_DYN__ON_ERROR ](payload, result.reason && result.reason.message);\n                                    rejectFunc && rejectFunc(result.reason);\n                                }\n                            }\n                        });\n                    }\n                    catch (e) {\n                        if (!responseHandled) {\n                            _self[_DYN__ON_ERROR ](payload, dumpObj(e));\n                            rejectFunc && rejectFunc(e);\n                        }\n                    }\n                    if (ignoreResponse && !responseHandled) {\n                        responseHandled = true;\n                        _self._onSuccess(payload, payload[_DYN_LENGTH$2 ]);\n                        resolveFunc && resolveFunc(true);\n                    }\n                    return thePromise;\n                }\n                function _parseResponse(response) {\n                    try {\n                        if (response && response !== \"\") {\n                            var result = getJSON().parse(response);\n                            if (result && result.itemsReceived && result.itemsReceived >= result[_DYN_ITEMS_ACCEPTED ] &&\n                                result.itemsReceived - result.itemsAccepted === result.errors[_DYN_LENGTH$2 ]) {\n                                return result;\n                            }\n                        }\n                    }\n                    catch (e) {\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 43 , \"Cannot parse the response. \" + getExceptionName(e), {\n                            response: response\n                        });\n                    }\n                    return null;\n                }\n                function _resendPayload(payload, linearFactor) {\n                    if (linearFactor === void 0) { linearFactor = 1; }\n                    if (!payload || payload[_DYN_LENGTH$2 ] === 0) {\n                        return;\n                    }\n                    var buffer = _self[_DYN__BUFFER ];\n                    buffer[_DYN_CLEAR_SENT ](payload);\n                    _consecutiveErrors++;\n                    for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                        var item = payload_1[_i];\n                        buffer[_DYN_ENQUEUE ](item);\n                    }\n                    _setRetryTime(linearFactor);\n                    _setupTimer();\n                }\n                function _setRetryTime(linearFactor) {\n                    var SlotDelayInSeconds = 10;\n                    var delayInSeconds;\n                    if (_consecutiveErrors <= 1) {\n                        delayInSeconds = SlotDelayInSeconds;\n                    }\n                    else {\n                        var backOffSlot = (Math.pow(2, _consecutiveErrors) - 1) / 2;\n                        var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                        backOffDelay = linearFactor * backOffDelay;\n                        delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n                    }\n                    var retryAfterTimeSpan = utcNow() + (delayInSeconds * 1000);\n                    _retryAt = retryAfterTimeSpan;\n                }\n                function _setupTimer() {\n                    if (!_timeoutHandle && !_paused) {\n                        var retryInterval = _retryAt ? Math.max(0, _retryAt - utcNow()) : 0;\n                        var timerValue = Math.max(_maxBatchInterval, retryInterval);\n                        _timeoutHandle = scheduleTimeout(function () {\n                            _timeoutHandle = null;\n                            _self[_DYN_TRIGGER_SEND ](true, null, 1 );\n                        }, timerValue);\n                    }\n                }\n                function _clearScheduledTimer() {\n                    _timeoutHandle && _timeoutHandle.cancel();\n                    _timeoutHandle = null;\n                    _retryAt = null;\n                }\n                function _isRetriable(statusCode) {\n                    return statusCode === 401\n                        || statusCode === 403\n                        || statusCode === 408\n                        || statusCode === 429\n                        || statusCode === 500\n                        || statusCode === 502\n                        || statusCode === 503\n                        || statusCode === 504;\n                }\n                function _formatErrorMessageXhr(xhr, message) {\n                    if (xhr) {\n                        return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + _getResponseText(xhr) || xhr.response || \"\";\n                    }\n                    return message;\n                }\n                function _xdrSender(payload, isAsync) {\n                    var buffer = _self[_DYN__BUFFER ];\n                    var _window = getWindow();\n                    var xdr = new XDomainRequest();\n                    xdr.onload = function () { return _self._xdrOnLoad(xdr, payload); };\n                    xdr.onerror = function (event) { return _self[_DYN__ON_ERROR ](payload, _formatErrorMessageXdr(xdr), event); };\n                    var hostingProtocol = _window && _window.location && _window.location.protocol || \"\";\n                    if (_endpointUrl.lastIndexOf(hostingProtocol, 0) !== 0) {\n                        _throwInternal(_self[_DYN_DIAG_LOG ](), 2 , 40 , \". \" +\n                            \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                        buffer[_DYN_CLEAR ]();\n                        return;\n                    }\n                    var endpointUrl = _endpointUrl.replace(/^(https?:)/, \"\");\n                    xdr.open(\"POST\", endpointUrl);\n                    var batch = buffer[_DYN_BATCH_PAYLOADS ](payload);\n                    xdr.send(batch);\n                    buffer[_DYN_MARK_AS_SENT ](payload);\n                }\n                function _formatErrorMessageXdr(xdr, message) {\n                    if (xdr) {\n                        return \"XDomainRequest,Response:\" + _getResponseText(xdr) || \"\";\n                    }\n                    return message;\n                }\n                function _getNotifyMgr() {\n                    var func = \"getNotifyMgr\";\n                    if (_self.core[func]) {\n                        return _self.core[func]();\n                    }\n                    return _self.core[\"_notificationManager\"];\n                }\n                function _notifySendRequest(sendRequest, isAsync) {\n                    var manager = _getNotifyMgr();\n                    if (manager && manager[_DYN_EVENTS_SEND_REQUEST ]) {\n                        try {\n                            manager[_DYN_EVENTS_SEND_REQUEST ](sendRequest, isAsync);\n                        }\n                        catch (e) {\n                            _throwInternal(_self[_DYN_DIAG_LOG ](), 1 , 74 , \"send request notification failed: \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                    }\n                }\n                function _validateInstrumentationKey(instrumentationKey, config) {\n                    var disableValidation = config.disableInstrumentationKeyValidation;\n                    var disableIKeyValidationFlag = isNullOrUndefined(disableValidation) ? false : disableValidation;\n                    if (disableIKeyValidationFlag) {\n                        return true;\n                    }\n                    var UUID_Regex = \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n                    var regexp = new RegExp(UUID_Regex);\n                    return regexp.test(instrumentationKey);\n                }\n                function _initDefaults() {\n                    _self[_DYN__SENDER ] = null;\n                    _self[_DYN__BUFFER ] = null;\n                    _self._appId = null;\n                    _self._sample = null;\n                    _headers = {};\n                    _offlineListener = null;\n                    _consecutiveErrors = 0;\n                    _retryAt = null;\n                    _paused = false;\n                    _timeoutHandle = null;\n                    _serializer = null;\n                    _stamp_specific_redirects = 0;\n                    _syncFetchPayload = 0;\n                    _fallbackSender = null;\n                    _syncUnloadSender = null;\n                    _evtNamespace = null;\n                    _endpointUrl = null;\n                    _orgEndpointUrl = null;\n                    _maxBatchSizeInBytes = 0;\n                    _beaconSupported = false;\n                    _customHeaders = null;\n                    _disableTelemetry = false;\n                    _instrumentationKey = null;\n                    _convertUndefined = UNDEFINED_VALUE$1;\n                    _isRetryDisabled = false;\n                    _sessionStorageUsed = null;\n                    _namePrefix = UNDEFINED_VALUE$1;\n                    objDefine(_self, \"_senderConfig\", {\n                        g: function () {\n                            return objExtend({}, defaultAppInsightsChannelConfig);\n                        }\n                    });\n                }\n            });\n            return _this;\n        }\n        Sender.constructEnvelope = function (orig, iKey, logger, convertUndefined) {\n            var envelope;\n            if (iKey !== orig.iKey && !isNullOrUndefined(iKey)) {\n                envelope = __assignFn(__assignFn({}, orig), { iKey: iKey });\n            }\n            else {\n                envelope = orig;\n            }\n            var creator = EnvelopeTypeCreator[envelope.baseType] || EventEnvelopeCreator;\n            return creator(logger, envelope, convertUndefined);\n        };\n        return Sender;\n    }(BaseTelemetryPlugin));\n\n    var STR_DURATION = \"duration\";\n    var STR_PROPERTIES = \"properties\";\n\n    var _DYN_REQUEST_URL = \"requestUrl\";\n    var _DYN_INST = \"inst\";\n    var _DYN_LENGTH$1 = \"length\";\n    var _DYN_TRACE_ID = \"traceID\";\n    var _DYN_SPAN_ID = \"spanID\";\n    var _DYN_TRACE_FLAGS = \"traceFlags\";\n    var _DYN_CONTEXT$1 = \"context\";\n    var _DYN_ABORTED = \"aborted\";\n    var _DYN_TRACE_ID0 = \"traceId\";\n    var _DYN_SPAN_ID1 = \"spanId\";\n    var _DYN__ADD_HOOK = \"_addHook\";\n    var _DYN_CORE = \"core\";\n    var _DYN_INCLUDE_CORRELATION_2 = \"includeCorrelationHeaders\";\n    var _DYN_GET_ABSOLUTE_URL = \"getAbsoluteUrl\";\n    var _DYN_HEADERS = \"headers\";\n    var _DYN_REQUEST_HEADERS = \"requestHeaders\";\n    var _DYN_SET_REQUEST_HEADER = \"setRequestHeader\";\n    var _DYN_TRACK_DEPENDENCY_DAT3 = \"trackDependencyDataInternal\";\n    var _DYN_START_TIME = \"startTime\";\n    var _DYN_TO_LOWER_CASE = \"toLowerCase\";\n    var _DYN_ENABLE_REQUEST_HEADE4 = \"enableRequestHeaderTracking\";\n    var _DYN_ENABLE_AJAX_ERROR_ST5 = \"enableAjaxErrorStatusText\";\n    var _DYN_ENABLE_AJAX_PERF_TRA6 = \"enableAjaxPerfTracking\";\n    var _DYN_MAX_AJAX_CALLS_PER_V7 = \"maxAjaxCallsPerView\";\n    var _DYN_EXCLUDE_REQUEST_FROM8 = \"excludeRequestFromAutoTrackingPatterns\";\n    var _DYN_ADD_REQUEST_CONTEXT = \"addRequestContext\";\n    var _DYN_DISABLE_AJAX_TRACKIN9 = \"disableAjaxTracking\";\n    var _DYN_AJAX_PERF_LOOKUP_DEL10 = \"ajaxPerfLookupDelay\";\n    var _DYN_DISABLE_FETCH_TRACKI11 = \"disableFetchTracking\";\n    var _DYN_ENABLE_RESPONSE_HEAD12 = \"enableResponseHeaderTracking\";\n    var _DYN_STATUS = \"status\";\n    var _DYN_STATUS_TEXT = \"statusText\";\n    var _DYN_HEADER_MAP = \"headerMap\";\n    var _DYN_OPEN_DONE = \"openDone\";\n    var _DYN_SEND_DONE = \"sendDone\";\n    var _DYN_REQUEST_SENT_TIME = \"requestSentTime\";\n    var _DYN_ABORT_DONE = \"abortDone\";\n    var _DYN_GET_TRACE_ID = \"getTraceId\";\n    var _DYN_GET_TRACE_FLAGS = \"getTraceFlags\";\n    var _DYN_METHOD = \"method\";\n    var _DYN_ERROR_STATUS_TEXT = \"errorStatusText\";\n    var _DYN_STATE_CHANGE_ATTACHE13 = \"stateChangeAttached\";\n    var _DYN_RESPONSE_TEXT = \"responseText\";\n    var _DYN_RESPONSE_FINISHED_TI14 = \"responseFinishedTime\";\n    var _DYN__CREATE_TRACK_ITEM = \"CreateTrackItem\";\n    var _DYN_RESPONSE = \"response\";\n    var _DYN_GET_ALL_RESPONSE_HEA15 = \"getAllResponseHeaders\";\n    var _DYN_GET_PART_APROPS = \"getPartAProps\";\n    var _DYN_PERF_MARK = \"perfMark\";\n    var _DYN_NAME = \"name\";\n    var _DYN_PERF_TIMING = \"perfTiming\";\n    var _DYN_EXCEPTION = \"exception\";\n    var _DYN_AJAX_DIAGNOSTICS_MES16 = \"ajaxDiagnosticsMessage\";\n    var _DYN_CORRELATION_CONTEXT = \"correlationContext\";\n    var _DYN_AJAX_TOTAL_DURATION = \"ajaxTotalDuration\";\n    var _DYN_EVENT_TRACE_CTX = \"eventTraceCtx\";\n\n    function _calcPerfDuration(resourceEntry, start, end) {\n        var result = 0;\n        var from = resourceEntry[start];\n        var to = resourceEntry[end];\n        if (from && to) {\n            result = dateTimeUtilsDuration(from, to);\n        }\n        return result;\n    }\n    function _setPerfDuration(props, name, resourceEntry, start, end) {\n        var result = 0;\n        var value = _calcPerfDuration(resourceEntry, start, end);\n        if (value) {\n            result = _setPerfValue(props, name, msToTimeSpan(value));\n        }\n        return result;\n    }\n    function _setPerfValue(props, name, value) {\n        var strPerf = \"ajaxPerf\";\n        var result = 0;\n        if (props && name && value) {\n            var perfData = props[strPerf] = (props[strPerf] || {});\n            perfData[name] = value;\n            result = 1;\n        }\n        return result;\n    }\n    function _populatePerfData(ajaxData, dependency) {\n        var resourceEntry = ajaxData[_DYN_PERF_TIMING ];\n        var props = dependency[STR_PROPERTIES ] || {};\n        var propsSet = 0;\n        var strName = \"name\";\n        var strStart = \"Start\";\n        var strEnd = \"End\";\n        var strDomainLookup = \"domainLookup\";\n        var strConnect = \"connect\";\n        var strRedirect = \"redirect\";\n        var strRequest = \"request\";\n        var strResponse = \"response\";\n        var strStartTime = \"startTime\";\n        var strDomainLookupStart = strDomainLookup + strStart;\n        var strDomainLookupEnd = strDomainLookup + strEnd;\n        var strConnectStart = strConnect + strStart;\n        var strConnectEnd = strConnect + strEnd;\n        var strRequestStart = strRequest + strStart;\n        var strRequestEnd = strRequest + strEnd;\n        var strResponseStart = strResponse + strStart;\n        var strResponseEnd = strResponse + strEnd;\n        var strRedirectStart = strRedirect + strStart;\n        var strRedirectEnd = strRedirect = strEnd;\n        var strTransferSize = \"transferSize\";\n        var strEncodedBodySize = \"encodedBodySize\";\n        var strDecodedBodySize = \"decodedBodySize\";\n        var strServerTiming = \"serverTiming\";\n        if (resourceEntry) {\n            propsSet |= _setPerfDuration(props, strRedirect, resourceEntry, strRedirectStart, strRedirectEnd);\n            propsSet |= _setPerfDuration(props, strDomainLookup, resourceEntry, strDomainLookupStart, strDomainLookupEnd);\n            propsSet |= _setPerfDuration(props, strConnect, resourceEntry, strConnectStart, strConnectEnd);\n            propsSet |= _setPerfDuration(props, strRequest, resourceEntry, strRequestStart, strRequestEnd);\n            propsSet |= _setPerfDuration(props, strResponse, resourceEntry, strResponseStart, strResponseEnd);\n            propsSet |= _setPerfDuration(props, \"networkConnect\", resourceEntry, strStartTime, strConnectEnd);\n            propsSet |= _setPerfDuration(props, \"sentRequest\", resourceEntry, strRequestStart, strResponseEnd);\n            var duration = resourceEntry[STR_DURATION ];\n            if (!duration) {\n                duration = _calcPerfDuration(resourceEntry, strStartTime, strResponseEnd) || 0;\n            }\n            propsSet |= _setPerfValue(props, STR_DURATION, duration);\n            propsSet |= _setPerfValue(props, \"perfTotal\", duration);\n            var serverTiming = resourceEntry[strServerTiming];\n            if (serverTiming) {\n                var server_1 = {};\n                arrForEach(serverTiming, function (value, idx) {\n                    var name = normalizeJsName(value[strName] || \"\" + idx);\n                    var newValue = server_1[name] || {};\n                    objForEachKey(value, function (key, val) {\n                        if (key !== strName && isString(val) || isNumber(val)) {\n                            if (newValue[key]) {\n                                val = newValue[key] + \";\" + val;\n                            }\n                            if (val || !isString(val)) {\n                                newValue[key] = val;\n                            }\n                        }\n                    });\n                    server_1[name] = newValue;\n                });\n                propsSet |= _setPerfValue(props, strServerTiming, server_1);\n            }\n            propsSet |= _setPerfValue(props, strTransferSize, resourceEntry[strTransferSize]);\n            propsSet |= _setPerfValue(props, strEncodedBodySize, resourceEntry[strEncodedBodySize]);\n            propsSet |= _setPerfValue(props, strDecodedBodySize, resourceEntry[strDecodedBodySize]);\n        }\n        else {\n            if (ajaxData[_DYN_PERF_MARK ]) {\n                propsSet |= _setPerfValue(props, \"missing\", ajaxData.perfAttempts);\n            }\n        }\n        if (propsSet) {\n            dependency[STR_PROPERTIES ] = props;\n        }\n    }\n    var XHRMonitoringState = /** @class */ (function () {\n        function XHRMonitoringState() {\n            var self = this;\n            self[_DYN_OPEN_DONE ] = false;\n            self.setRequestHeaderDone = false;\n            self[_DYN_SEND_DONE ] = false;\n            self[_DYN_ABORT_DONE ] = false;\n            self[_DYN_STATE_CHANGE_ATTACHE13 ] = false;\n        }\n        return XHRMonitoringState;\n    }());\n    var ajaxRecord = /** @class */ (function () {\n        function ajaxRecord(traceId, spanId, logger, traceCtx) {\n            var _a;\n            var self = this;\n            var _logger = logger;\n            var strResponseText = \"responseText\";\n            self[_DYN_PERF_MARK ] = null;\n            self.completed = false;\n            self.requestHeadersSize = null;\n            self[_DYN_REQUEST_HEADERS ] = null;\n            self.responseReceivingDuration = null;\n            self.callbackDuration = null;\n            self[_DYN_AJAX_TOTAL_DURATION ] = null;\n            self[_DYN_ABORTED ] = 0;\n            self.pageUrl = null;\n            self[_DYN_REQUEST_URL ] = null;\n            self.requestSize = 0;\n            self[_DYN_METHOD ] = null;\n            self[_DYN_STATUS ] = null;\n            self[_DYN_REQUEST_SENT_TIME ] = null;\n            self.responseStartedTime = null;\n            self[_DYN_RESPONSE_FINISHED_TI14 ] = null;\n            self.callbackFinishedTime = null;\n            self.endTime = null;\n            self.xhrMonitoringState = new XHRMonitoringState();\n            self.clientFailure = 0;\n            self[_DYN_TRACE_ID ] = traceId;\n            self[_DYN_SPAN_ID ] = spanId;\n            self[_DYN_TRACE_FLAGS ] = traceCtx === null || traceCtx === void 0 ? void 0 : traceCtx.getTraceFlags();\n            if (traceCtx) {\n                self[_DYN_EVENT_TRACE_CTX ] = (_a = {},\n                    _a[_DYN_TRACE_ID0 ] = traceCtx[_DYN_GET_TRACE_ID ](),\n                    _a[_DYN_SPAN_ID1 ] = traceCtx.getSpanId(),\n                    _a[_DYN_TRACE_FLAGS ] = traceCtx[_DYN_GET_TRACE_FLAGS ](),\n                    _a);\n            }\n            else {\n                self[_DYN_EVENT_TRACE_CTX ] = null;\n            }\n            dynamicProto(ajaxRecord, self, function (self) {\n                self.getAbsoluteUrl = function () {\n                    return self[_DYN_REQUEST_URL ] ? urlGetAbsoluteUrl(self[_DYN_REQUEST_URL ]) : null;\n                };\n                self.getPathName = function () {\n                    return self[_DYN_REQUEST_URL ] ? dataSanitizeUrl(_logger, urlGetCompleteUrl(self[_DYN_METHOD ], self[_DYN_REQUEST_URL ])) : null;\n                };\n                self[_DYN__CREATE_TRACK_ITEM ] = function (ajaxType, enableRequestHeaderTracking, getResponse) {\n                    var _a;\n                    self.ajaxTotalDuration = Math.round(dateTimeUtilsDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n                    if (self[_DYN_AJAX_TOTAL_DURATION ] < 0) {\n                        return null;\n                    }\n                    var dependency = (_a = {\n                            id: \"|\" + self[_DYN_TRACE_ID ] + \".\" + self[_DYN_SPAN_ID ],\n                            target: self[_DYN_GET_ABSOLUTE_URL ]()\n                        },\n                        _a[_DYN_NAME ] = self.getPathName(),\n                        _a.type = ajaxType,\n                        _a[_DYN_START_TIME ] = null,\n                        _a.duration = self[_DYN_AJAX_TOTAL_DURATION ],\n                        _a.success = (+(self[_DYN_STATUS ])) >= 200 && (+(self[_DYN_STATUS ])) < 400,\n                        _a.responseCode = (+(self[_DYN_STATUS ])),\n                        _a[STR_PROPERTIES] = { HttpMethod: self[_DYN_METHOD ] },\n                        _a);\n                    var props = dependency[STR_PROPERTIES];\n                    if (self[_DYN_ABORTED ]) {\n                        props[_DYN_ABORTED ] = true;\n                    }\n                    if (self[_DYN_REQUEST_SENT_TIME ]) {\n                        dependency[_DYN_START_TIME ] = new Date();\n                        dependency[_DYN_START_TIME ].setTime(self[_DYN_REQUEST_SENT_TIME ]);\n                    }\n                    _populatePerfData(self, dependency);\n                    if (enableRequestHeaderTracking) {\n                        if (objKeys(self.requestHeaders)[_DYN_LENGTH$1 ] > 0) {\n                            props[_DYN_REQUEST_HEADERS ] = self[_DYN_REQUEST_HEADERS ];\n                        }\n                    }\n                    if (getResponse) {\n                        var response = getResponse();\n                        if (response) {\n                            var correlationContext = response[_DYN_CORRELATION_CONTEXT ];\n                            if (correlationContext) {\n                                dependency.correlationContext =  correlationContext;\n                            }\n                            if (response[_DYN_HEADER_MAP ]) {\n                                if (objKeys(response.headerMap)[_DYN_LENGTH$1 ] > 0) {\n                                    props.responseHeaders = response[_DYN_HEADER_MAP ];\n                                }\n                            }\n                            if (self[_DYN_ERROR_STATUS_TEXT ]) {\n                                if (self[_DYN_STATUS ] >= 400) {\n                                    var responseType = response.type;\n                                    if (responseType === \"\" || responseType === \"text\") {\n                                        props.responseText = response.responseText ? response[_DYN_STATUS_TEXT ] + \" - \" + response[strResponseText] : response[_DYN_STATUS_TEXT ];\n                                    }\n                                    if (responseType === \"json\") {\n                                        props.responseText = response.response ? response[_DYN_STATUS_TEXT ] + \" - \" + JSON.stringify(response[_DYN_RESPONSE ]) : response[_DYN_STATUS_TEXT ];\n                                    }\n                                }\n                                else if (self[_DYN_STATUS ] === 0) {\n                                    props.responseText = response[_DYN_STATUS_TEXT ] || \"\";\n                                }\n                            }\n                        }\n                    }\n                    return dependency;\n                };\n                self[_DYN_GET_PART_APROPS ] = function () {\n                    var _a;\n                    var partA = null;\n                    var traceCtx = self[_DYN_EVENT_TRACE_CTX ];\n                    if (traceCtx && (traceCtx[_DYN_TRACE_ID0 ] || traceCtx[_DYN_SPAN_ID1 ])) {\n                        partA = {};\n                        var traceExt = partA[Extensions.TraceExt] = (_a = {},\n                            _a[_DYN_TRACE_ID ] = traceCtx[_DYN_TRACE_ID0 ],\n                            _a.parentID = traceCtx[_DYN_SPAN_ID1 ],\n                            _a);\n                        if (!isNullOrUndefined(traceCtx[_DYN_TRACE_FLAGS ])) {\n                            traceExt[_DYN_TRACE_FLAGS ] = traceCtx[_DYN_TRACE_FLAGS ];\n                        }\n                    }\n                    return partA;\n                };\n            });\n        }\n        ajaxRecord.__ieDyn=1;\n        return ajaxRecord;\n    }());\n\n    var _a$2;\n    var AJAX_MONITOR_PREFIX = \"ai.ajxmn.\";\n    var strDiagLog = \"diagLog\";\n    var strAjaxData = \"ajaxData\";\n    var STR_FETCH = \"fetch\";\n    var ERROR_HEADER = \"Failed to monitor XMLHttpRequest\";\n    var ERROR_PREFIX = \", monitoring data for this ajax call \";\n    var ERROR_POSTFIX = ERROR_PREFIX + \"may be incorrect.\";\n    var ERROR_NOT_SENT = ERROR_PREFIX + \"won't be sent.\";\n    var CORRELATION_HEADER_ERROR = \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\";\n    var CUSTOM_REQUEST_CONTEXT_ERROR = \"Failed to add custom defined request context as configured call back may missing a null check.\";\n    var FAILED_TO_CALCULATE_DURATION_ERROR = \"Failed to calculate the duration of the \";\n    var _markCount = 0;\n    function _supportsFetch() {\n        var _global = getGlobal();\n        if (!_global ||\n            isNullOrUndefined(_global.Request) ||\n            isNullOrUndefined(_global.Request[strShimPrototype]) ||\n            isNullOrUndefined(_global[STR_FETCH])) {\n            return null;\n        }\n        return _global[STR_FETCH];\n    }\n    function _supportsAjaxMonitoring(ajaxMonitorInstance) {\n        var _a;\n        var result = false;\n        if (isXhrSupported()) {\n            var proto = XMLHttpRequest[strShimPrototype];\n            result = !isNullOrUndefined(proto) &&\n                !isNullOrUndefined(proto.open) &&\n                !isNullOrUndefined(proto.send) &&\n                !isNullOrUndefined(proto.abort);\n        }\n        var ieVer = getIEVersion();\n        if (ieVer && ieVer < 9) {\n            result = false;\n        }\n        if (result) {\n            try {\n                var xhr = new XMLHttpRequest();\n                xhr[strAjaxData] = {};\n                var theOpen = XMLHttpRequest[strShimPrototype].open;\n                XMLHttpRequest[strShimPrototype].open = theOpen;\n            }\n            catch (e) {\n                result = false;\n                _throwInternalCritical(ajaxMonitorInstance, 15 , \"Failed to enable XMLHttpRequest monitoring, extension is not supported\", (_a = {},\n                    _a[_DYN_EXCEPTION ] = dumpObj(e),\n                    _a));\n            }\n        }\n        return result;\n    }\n    function _getFailedAjaxDiagnosticsMessage(xhr) {\n        var result = \"\";\n        try {\n            if (xhr && xhr[strAjaxData] && xhr[strAjaxData][_DYN_REQUEST_URL ]) {\n                result += \"(url: '\" + xhr[strAjaxData][_DYN_REQUEST_URL ] + \"')\";\n            }\n        }\n        catch (e) {\n        }\n        return result;\n    }\n    function _throwInternalCritical(ajaxMonitorInstance, msgId, message, properties, isUserAct) {\n        _throwInternal(ajaxMonitorInstance[strDiagLog](), 1 , msgId, message, properties, isUserAct);\n    }\n    function _throwInternalWarning(ajaxMonitorInstance, msgId, message, properties, isUserAct) {\n        _throwInternal(ajaxMonitorInstance[strDiagLog](), 2 , msgId, message, properties, isUserAct);\n    }\n    function _createErrorCallbackFunc(ajaxMonitorInstance, internalMessage, message) {\n        return function (args) {\n            var _a;\n            _throwInternalCritical(ajaxMonitorInstance, internalMessage, message, (_a = {\n                    ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(args[_DYN_INST ])\n                },\n                _a[_DYN_EXCEPTION ] = dumpObj(args.err),\n                _a));\n        };\n    }\n    function _indexOf(value, match) {\n        if (value && match) {\n            return strIndexOf(value, match);\n        }\n        return -1;\n    }\n    function _addHandler(container, id, theFunc) {\n        var theHandler = {\n            id: id,\n            fn: theFunc\n        };\n        container.push(theHandler);\n        return {\n            remove: function () {\n                arrForEach(container, function (initializer, idx) {\n                    if (initializer.id === theHandler.id) {\n                        container.splice(idx, 1);\n                        return -1;\n                    }\n                });\n            }\n        };\n    }\n    function _processDependencyContainer(core, container, details, message) {\n        var result = true;\n        arrForEach(container, function (theFunc, idx) {\n            try {\n                if (theFunc.fn.call(null, details) === false) {\n                    result = false;\n                }\n            }\n            catch (e) {\n                _throwInternal(core && core.logger, 1 , 64 , \"Dependency \" + message + \" [#\" + idx + \"] failed: \" + getExceptionName(e), { exception: dumpObj(e) }, true);\n            }\n        });\n        return result;\n    }\n    function _processDependencyListeners(listeners, core, ajaxData, xhr, input, init) {\n        var _a;\n        var initializersCount = listeners[_DYN_LENGTH$1 ];\n        if (initializersCount > 0) {\n            var details = (_a = {},\n                _a[_DYN_CORE ] = core,\n                _a.xhr = xhr,\n                _a.input = input,\n                _a.init = init,\n                _a.traceId = ajaxData[_DYN_TRACE_ID ],\n                _a.spanId = ajaxData[_DYN_SPAN_ID ],\n                _a.traceFlags = ajaxData[_DYN_TRACE_FLAGS ],\n                _a.context = ajaxData[_DYN_CONTEXT$1 ] || {},\n                _a.aborted = !!ajaxData[_DYN_ABORTED ],\n                _a);\n            _processDependencyContainer(core, listeners, details, \"listener\");\n            ajaxData[_DYN_TRACE_ID ] = details[_DYN_TRACE_ID0 ];\n            ajaxData[_DYN_SPAN_ID ] = details[_DYN_SPAN_ID1 ];\n            ajaxData[_DYN_TRACE_FLAGS ] = details[_DYN_TRACE_FLAGS ];\n            ajaxData[_DYN_CONTEXT$1 ] = details[_DYN_CONTEXT$1 ];\n        }\n    }\n    var BLOB_CORE = \"*.blob.core.\";\n    var DfltAjaxCorrelationHeaderExDomains = objFreeze([\n        BLOB_CORE + \"windows.net\",\n        BLOB_CORE + \"chinacloudapi.cn\",\n        BLOB_CORE + \"cloudapi.de\",\n        BLOB_CORE + \"usgovcloudapi.net\"\n    ]);\n    var _internalExcludeEndpoints = [\n        /https:\\/\\/[^\\/]*(\\.pipe\\.aria|aria\\.pipe|events\\.data|collector\\.azure)\\.[^\\/]+\\/(OneCollector\\/1|Collector\\/3)\\.0/i\n    ];\n    var _defaultConfig$1 = objFreeze((_a$2 = {},\n        _a$2[_DYN_MAX_AJAX_CALLS_PER_V7 ] = 500,\n        _a$2[_DYN_DISABLE_AJAX_TRACKIN9 ] = false,\n        _a$2[_DYN_DISABLE_FETCH_TRACKI11 ] = false,\n        _a$2[_DYN_EXCLUDE_REQUEST_FROM8 ] = undefined,\n        _a$2.disableCorrelationHeaders = false,\n        _a$2.distributedTracingMode = 1 ,\n        _a$2.correlationHeaderExcludedDomains = DfltAjaxCorrelationHeaderExDomains,\n        _a$2.correlationHeaderDomains = undefined,\n        _a$2.correlationHeaderExcludePatterns = undefined,\n        _a$2.appId = undefined,\n        _a$2.enableCorsCorrelation = false,\n        _a$2[_DYN_ENABLE_REQUEST_HEADE4 ] = false,\n        _a$2[_DYN_ENABLE_RESPONSE_HEAD12 ] = false,\n        _a$2[_DYN_ENABLE_AJAX_ERROR_ST5 ] = false,\n        _a$2[_DYN_ENABLE_AJAX_PERF_TRA6 ] = false,\n        _a$2.maxAjaxPerfLookupAttempts = 3,\n        _a$2[_DYN_AJAX_PERF_LOOKUP_DEL10 ] = 25,\n        _a$2.ignoreHeaders = [\n            \"Authorization\",\n            \"X-API-Key\",\n            \"WWW-Authenticate\"\n        ],\n        _a$2[_DYN_ADD_REQUEST_CONTEXT ] = undefined,\n        _a$2.addIntEndpoints = true,\n        _a$2));\n    var AjaxMonitor = /** @class */ (function (_super) {\n        __extendsFn(AjaxMonitor, _super);\n        function AjaxMonitor() {\n            var _this = _super.call(this) || this;\n            _this.identifier = AjaxMonitor.identifier;\n            _this.priority = 120;\n            var _fetchInitialized;\n            var _xhrInitialized;\n            var _currentWindowHost;\n            var _extensionConfig;\n            var _enableRequestHeaderTracking;\n            var _enableAjaxErrorStatusText;\n            var _trackAjaxAttempts;\n            var _context;\n            var _isUsingW3CHeaders;\n            var _isUsingAIHeaders;\n            var _markPrefix;\n            var _enableAjaxPerfTracking;\n            var _maxAjaxCallsPerView;\n            var _enableResponseHeaderTracking;\n            var _disabledUrls;\n            var _disableAjaxTracking;\n            var _disableFetchTracking;\n            var _excludeRequestFromAutoTrackingPatterns;\n            var _addRequestContext;\n            var _evtNamespace;\n            var _dependencyHandlerId;\n            var _dependencyListeners;\n            var _dependencyInitializers;\n            var _ignoreHeaders;\n            var _maxAjaxPerfLookupAttempts;\n            var _ajaxPerfLookupDelay;\n            var _distributedTracingMode;\n            var _appId;\n            var _polyfillInitialized;\n            dynamicProto(AjaxMonitor, _this, function (_self, _base) {\n                var _addHook = _base[_DYN__ADD_HOOK ];\n                _initDefaults();\n                _self.initialize = function (config, core, extensions, pluginChain) {\n                    if (!_self.isInitialized()) {\n                        _base.initialize(config, core, extensions, pluginChain);\n                        _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"ajax\"), core && core.evtNamespace && core.evtNamespace());\n                        _populateDefaults(config);\n                        _instrumentXhr();\n                        _instrumentFetch();\n                        _populateContext();\n                    }\n                };\n                _self._doTeardown = function () {\n                    _initDefaults();\n                };\n                _self.trackDependencyData = function (dependency, properties) {\n                    _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE ], null, dependency, properties);\n                };\n                _self[_DYN_INCLUDE_CORRELATION_2 ] = function (ajaxData, input, init, xhr) {\n                    var currentWindowHost = _self[\"_currentWindowHost\"] || _currentWindowHost;\n                    _processDependencyListeners(_dependencyListeners, _self[_DYN_CORE ], ajaxData, xhr, input, init);\n                    if (input) {\n                        if (correlationIdCanIncludeCorrelationHeader(_extensionConfig, ajaxData[_DYN_GET_ABSOLUTE_URL ](), currentWindowHost)) {\n                            if (!init) {\n                                init = {};\n                            }\n                            var headers = new Headers(init[_DYN_HEADERS ] || (input instanceof Request ? (input[_DYN_HEADERS ] || {}) : {}));\n                            if (_isUsingAIHeaders) {\n                                var id = \"|\" + ajaxData[_DYN_TRACE_ID ] + \".\" + ajaxData[_DYN_SPAN_ID ];\n                                headers.set(RequestHeaders[3 ], id);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[3 ]] = id;\n                                }\n                            }\n                            var appId = _appId || (_context && _context.appId());\n                            if (appId) {\n                                headers.set(RequestHeaders[0 ], RequestHeaders[2 ] + appId);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[0 ]] = RequestHeaders[2 ] + appId;\n                                }\n                            }\n                            if (_isUsingW3CHeaders) {\n                                var traceFlags = ajaxData[_DYN_TRACE_FLAGS ];\n                                if (isNullOrUndefined(traceFlags)) {\n                                    traceFlags = 0x01;\n                                }\n                                var traceParent = formatTraceParent(createTraceParent(ajaxData[_DYN_TRACE_ID ], ajaxData[_DYN_SPAN_ID ], traceFlags));\n                                headers.set(RequestHeaders[4 ], traceParent);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[4 ]] = traceParent;\n                                }\n                            }\n                            init[_DYN_HEADERS ] = headers;\n                        }\n                        return init;\n                    }\n                    else if (xhr) {\n                        if (correlationIdCanIncludeCorrelationHeader(_extensionConfig, ajaxData[_DYN_GET_ABSOLUTE_URL ](), currentWindowHost)) {\n                            if (_isUsingAIHeaders) {\n                                var id = \"|\" + ajaxData[_DYN_TRACE_ID ] + \".\" + ajaxData[_DYN_SPAN_ID ];\n                                xhr[_DYN_SET_REQUEST_HEADER ](RequestHeaders[3 ], id);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[3 ]] = id;\n                                }\n                            }\n                            var appId = _appId || (_context && _context.appId());\n                            if (appId) {\n                                xhr[_DYN_SET_REQUEST_HEADER ](RequestHeaders[0 ], RequestHeaders[2 ] + appId);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[0 ]] = RequestHeaders[2 ] + appId;\n                                }\n                            }\n                            if (_isUsingW3CHeaders) {\n                                var traceFlags = ajaxData[_DYN_TRACE_FLAGS ];\n                                if (isNullOrUndefined(traceFlags)) {\n                                    traceFlags = 0x01;\n                                }\n                                var traceParent = formatTraceParent(createTraceParent(ajaxData[_DYN_TRACE_ID ], ajaxData[_DYN_SPAN_ID ], traceFlags));\n                                xhr[_DYN_SET_REQUEST_HEADER ](RequestHeaders[4 ], traceParent);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData[_DYN_REQUEST_HEADERS ][RequestHeaders[4 ]] = traceParent;\n                                }\n                            }\n                        }\n                        return xhr;\n                    }\n                    return undefined;\n                };\n                _self[_DYN_TRACK_DEPENDENCY_DAT3 ] = function (dependency, properties, systemProperties) {\n                    if (_maxAjaxCallsPerView === -1 || _trackAjaxAttempts < _maxAjaxCallsPerView) {\n                        if ((_distributedTracingMode === 2\n                            || _distributedTracingMode === 1 )\n                            && typeof dependency.id === \"string\" && dependency.id[dependency.id[_DYN_LENGTH$1 ] - 1] !== \".\") {\n                            dependency.id += \".\";\n                        }\n                        if (isNullOrUndefined(dependency[_DYN_START_TIME ])) {\n                            dependency[_DYN_START_TIME ] = new Date();\n                        }\n                        var item = createTelemetryItem(dependency, RemoteDependencyData.dataType, RemoteDependencyData.envelopeType, _self[strDiagLog](), properties, systemProperties);\n                        _self[_DYN_CORE ].track(item);\n                    }\n                    else if (_trackAjaxAttempts === _maxAjaxCallsPerView) {\n                        _throwInternalCritical(_self, 55 , \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n                    }\n                    ++_trackAjaxAttempts;\n                };\n                _self.addDependencyListener = function (dependencyListener) {\n                    return _addHandler(_dependencyListeners, _dependencyHandlerId++, dependencyListener);\n                };\n                _self.addDependencyInitializer = function (dependencyInitializer) {\n                    return _addHandler(_dependencyInitializers, _dependencyHandlerId++, dependencyInitializer);\n                };\n                function _initDefaults() {\n                    var location = getLocation();\n                    _fetchInitialized = false;\n                    _xhrInitialized = false;\n                    _polyfillInitialized = false;\n                    _currentWindowHost = location && location.host && location.host[_DYN_TO_LOWER_CASE ]();\n                    _extensionConfig = null;\n                    _enableRequestHeaderTracking = false;\n                    _enableAjaxErrorStatusText = false;\n                    _trackAjaxAttempts = 0;\n                    _context = null;\n                    _isUsingW3CHeaders = false;\n                    _isUsingAIHeaders = false;\n                    _markPrefix = null;\n                    _enableAjaxPerfTracking = false;\n                    _maxAjaxCallsPerView = 0;\n                    _enableResponseHeaderTracking = false;\n                    _disabledUrls = {};\n                    _disableAjaxTracking = false;\n                    _disableFetchTracking = false;\n                    _excludeRequestFromAutoTrackingPatterns = null;\n                    _addRequestContext = null;\n                    _evtNamespace = null;\n                    _dependencyHandlerId = 0;\n                    _dependencyListeners = [];\n                    _dependencyInitializers = [];\n                    _ignoreHeaders = null;\n                    _maxAjaxPerfLookupAttempts = 1;\n                    _ajaxPerfLookupDelay = 1;\n                    _distributedTracingMode = 1 ;\n                    _appId = null;\n                }\n                function _populateDefaults(config) {\n                    _self[_DYN__ADD_HOOK ](onConfigChange(config, function (details) {\n                        var config = details.cfg;\n                        var ctx = createProcessTelemetryContext(null, config, _self[_DYN_CORE ]);\n                        _extensionConfig = ctx.getExtCfg(AjaxMonitor.identifier, _defaultConfig$1);\n                        _distributedTracingMode = _extensionConfig.distributedTracingMode;\n                        _enableRequestHeaderTracking = _extensionConfig[_DYN_ENABLE_REQUEST_HEADE4 ];\n                        _enableAjaxErrorStatusText = _extensionConfig[_DYN_ENABLE_AJAX_ERROR_ST5 ];\n                        _enableAjaxPerfTracking = _extensionConfig[_DYN_ENABLE_AJAX_PERF_TRA6 ];\n                        _maxAjaxCallsPerView = _extensionConfig[_DYN_MAX_AJAX_CALLS_PER_V7 ];\n                        _excludeRequestFromAutoTrackingPatterns = [].concat(_extensionConfig[_DYN_EXCLUDE_REQUEST_FROM8 ] || [], _extensionConfig.addIntEndpoints !== false ? _internalExcludeEndpoints : []);\n                        _addRequestContext = _extensionConfig[_DYN_ADD_REQUEST_CONTEXT ];\n                        _isUsingAIHeaders = _distributedTracingMode === 0  || _distributedTracingMode === 1 ;\n                        _isUsingW3CHeaders = _distributedTracingMode === 1  || _distributedTracingMode === 2 ;\n                        if (_enableAjaxPerfTracking) {\n                            var iKey = config.instrumentationKey || \"unkwn\";\n                            if (iKey[_DYN_LENGTH$1 ] > 5) {\n                                _markPrefix = AJAX_MONITOR_PREFIX + strSubstring(iKey, iKey[_DYN_LENGTH$1 ] - 5) + \".\";\n                            }\n                            else {\n                                _markPrefix = AJAX_MONITOR_PREFIX + iKey + \".\";\n                            }\n                        }\n                        _disableAjaxTracking = !!_extensionConfig[_DYN_DISABLE_AJAX_TRACKIN9 ];\n                        _maxAjaxPerfLookupAttempts = _extensionConfig.maxAjaxPerfLookupAttempts;\n                        _ajaxPerfLookupDelay = _extensionConfig[_DYN_AJAX_PERF_LOOKUP_DEL10 ];\n                        _ignoreHeaders = _extensionConfig.ignoreHeaders;\n                        _appId = _extensionConfig.appId;\n                    }));\n                }\n                function _populateContext() {\n                    var propExt = _self[_DYN_CORE ].getPlugin(PropertiesPluginIdentifier);\n                    if (propExt) {\n                        _context = propExt.plugin[_DYN_CONTEXT$1 ];\n                    }\n                }\n                function _canIncludeHeaders(header) {\n                    var rlt = true;\n                    if (header || _ignoreHeaders) {\n                        arrForEach(_ignoreHeaders, (function (key) {\n                            if (key[_DYN_TO_LOWER_CASE ]() === header[_DYN_TO_LOWER_CASE ]()) {\n                                rlt = false;\n                                return -1;\n                            }\n                        }));\n                    }\n                    return rlt;\n                }\n                function _instrumentFetch() {\n                    var fetch = _supportsFetch();\n                    if (!fetch) {\n                        return;\n                    }\n                    var global = getGlobal();\n                    var isPolyfill = fetch.polyfill;\n                    _self[_DYN__ADD_HOOK ](onConfigChange(_extensionConfig, function () {\n                        _disableFetchTracking = !!_extensionConfig[_DYN_DISABLE_FETCH_TRACKI11 ];\n                        _enableResponseHeaderTracking = _extensionConfig[_DYN_ENABLE_RESPONSE_HEAD12 ];\n                        if (!_disableFetchTracking && !_fetchInitialized) {\n                            _addHook(InstrumentFunc(global, STR_FETCH, {\n                                ns: _evtNamespace,\n                                req: function (callDetails, input, init) {\n                                    var fetchData;\n                                    if (!_disableFetchTracking && _fetchInitialized &&\n                                        !_isDisabledRequest(null, input, init) &&\n                                        !(isPolyfill && _xhrInitialized)) {\n                                        var ctx = callDetails.ctx();\n                                        fetchData = _createFetchRecord(input, init);\n                                        var newInit = _self[_DYN_INCLUDE_CORRELATION_2 ](fetchData, input, init);\n                                        if (newInit !== init) {\n                                            callDetails.set(1, newInit);\n                                        }\n                                        ctx.data = fetchData;\n                                    }\n                                },\n                                rsp: function (callDetails, input) {\n                                    if (!_disableFetchTracking) {\n                                        var fetchData_1 = callDetails.ctx().data;\n                                        if (fetchData_1) {\n                                            callDetails.rslt = callDetails.rslt.then(function (response) {\n                                                _reportFetchMetrics(callDetails, (response || {})[_DYN_STATUS ], input, response, fetchData_1, function () {\n                                                    var _a;\n                                                    var ajaxResponse = (_a = {\n                                                            statusText: (response || {})[_DYN_STATUS_TEXT ]\n                                                        },\n                                                        _a[_DYN_HEADER_MAP ] = null,\n                                                        _a[_DYN_CORRELATION_CONTEXT ] = _getFetchCorrelationContext(response),\n                                                        _a);\n                                                    if (_enableResponseHeaderTracking && response) {\n                                                        var responseHeaderMap_1 = {};\n                                                        response.headers.forEach(function (value, name) {\n                                                            if (_canIncludeHeaders(name)) {\n                                                                responseHeaderMap_1[name] = value;\n                                                            }\n                                                        });\n                                                        ajaxResponse[_DYN_HEADER_MAP ] = responseHeaderMap_1;\n                                                    }\n                                                    return ajaxResponse;\n                                                });\n                                                return response;\n                                            })\n                                                .catch(function (reason) {\n                                                _reportFetchMetrics(callDetails, 0, input, null, fetchData_1, null, { error: reason.message || dumpObj(reason) });\n                                                throw reason;\n                                            });\n                                        }\n                                    }\n                                },\n                                hkErr: _createErrorCallbackFunc(_self, 15 , \"Failed to monitor Window.fetch\" + ERROR_POSTFIX)\n                            }, true, isWebWorker()));\n                            _fetchInitialized = true;\n                        }\n                        else if (isPolyfill && !_polyfillInitialized) {\n                            _addHook(InstrumentFunc(global, STR_FETCH, {\n                                ns: _evtNamespace,\n                                req: function (callDetails, input, init) {\n                                    _isDisabledRequest(null, input, init);\n                                }\n                            }));\n                            _polyfillInitialized = true;\n                        }\n                    }));\n                    if (isPolyfill) {\n                        global[STR_FETCH].polyfill = isPolyfill;\n                    }\n                }\n                function _hookProto(target, funcName, callbacks) {\n                    _addHook(InstrumentProto(target, funcName, callbacks));\n                }\n                function _instrumentXhr() {\n                    if (!_supportsAjaxMonitoring(_self)) {\n                        return;\n                    }\n                    _self[_DYN__ADD_HOOK ](onConfigChange(_extensionConfig, function () {\n                        _disableAjaxTracking = !!_extensionConfig[_DYN_DISABLE_AJAX_TRACKIN9 ];\n                        _enableRequestHeaderTracking = _extensionConfig[_DYN_ENABLE_REQUEST_HEADE4 ];\n                        if (!_disableAjaxTracking && !_xhrInitialized) {\n                            _hookProto(XMLHttpRequest, \"open\", {\n                                ns: _evtNamespace,\n                                req: function (args, method, url, async) {\n                                    if (!_disableAjaxTracking) {\n                                        var xhr = args[_DYN_INST ];\n                                        var ajaxData = xhr[strAjaxData];\n                                        if (!_isDisabledRequest(xhr, url) && _isMonitoredXhrInstance(xhr, true)) {\n                                            if (!ajaxData || !ajaxData.xhrMonitoringState[_DYN_OPEN_DONE ]) {\n                                                _openHandler(xhr, method, url, async);\n                                            }\n                                            _attachToOnReadyStateChange(xhr);\n                                        }\n                                    }\n                                },\n                                hkErr: _createErrorCallbackFunc(_self, 15 , ERROR_HEADER + \".open\" + ERROR_POSTFIX)\n                            });\n                            _hookProto(XMLHttpRequest, \"send\", {\n                                ns: _evtNamespace,\n                                req: function (args, context) {\n                                    if (!_disableAjaxTracking) {\n                                        var xhr = args[_DYN_INST ];\n                                        var ajaxData = xhr[strAjaxData];\n                                        if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState[_DYN_SEND_DONE ]) {\n                                            _createMarkId(\"xhr\", ajaxData);\n                                            ajaxData[_DYN_REQUEST_SENT_TIME ] = dateTimeUtilsNow();\n                                            _self[_DYN_INCLUDE_CORRELATION_2 ](ajaxData, undefined, undefined, xhr);\n                                            ajaxData.xhrMonitoringState[_DYN_SEND_DONE ] = true;\n                                        }\n                                    }\n                                },\n                                hkErr: _createErrorCallbackFunc(_self, 17 , ERROR_HEADER + ERROR_POSTFIX)\n                            });\n                            _hookProto(XMLHttpRequest, \"abort\", {\n                                ns: _evtNamespace,\n                                req: function (args) {\n                                    if (!_disableAjaxTracking) {\n                                        var xhr = args[_DYN_INST ];\n                                        var ajaxData = xhr[strAjaxData];\n                                        if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState[_DYN_ABORT_DONE ]) {\n                                            ajaxData[_DYN_ABORTED ] = 1;\n                                            ajaxData.xhrMonitoringState[_DYN_ABORT_DONE ] = true;\n                                        }\n                                    }\n                                },\n                                hkErr: _createErrorCallbackFunc(_self, 13 , ERROR_HEADER + \".abort\" + ERROR_POSTFIX)\n                            });\n                            _hookProto(XMLHttpRequest, \"setRequestHeader\", {\n                                ns: _evtNamespace,\n                                req: function (args, header, value) {\n                                    if (!_disableAjaxTracking && _enableRequestHeaderTracking) {\n                                        var xhr = args[_DYN_INST ];\n                                        if (_isMonitoredXhrInstance(xhr) && _canIncludeHeaders(header)) {\n                                            xhr[strAjaxData][_DYN_REQUEST_HEADERS ][header] = value;\n                                        }\n                                    }\n                                },\n                                hkErr: _createErrorCallbackFunc(_self, 71 , ERROR_HEADER + \".setRequestHeader\" + ERROR_POSTFIX)\n                            });\n                            _xhrInitialized = true;\n                        }\n                    }));\n                }\n                function _isDisabledRequest(xhr, request, init) {\n                    var isDisabled = false;\n                    var theUrl = ((!isString(request) ? (request || {}).url || \"\" : request) || \"\")[_DYN_TO_LOWER_CASE ]();\n                    arrForEach(_excludeRequestFromAutoTrackingPatterns, function (regex) {\n                        var theRegex = regex;\n                        if (isString(regex)) {\n                            theRegex = new RegExp(regex);\n                        }\n                        if (!isDisabled) {\n                            isDisabled = theRegex.test(theUrl);\n                        }\n                    });\n                    if (isDisabled) {\n                        return isDisabled;\n                    }\n                    var idx = _indexOf(theUrl, \"?\");\n                    var idx2 = _indexOf(theUrl, \"#\");\n                    if (idx === -1 || (idx2 !== -1 && idx2 < idx)) {\n                        idx = idx2;\n                    }\n                    if (idx !== -1) {\n                        theUrl = theUrl.substring(0, idx);\n                    }\n                    if (!isNullOrUndefined(xhr)) {\n                        isDisabled = xhr[DisabledPropertyName] === true || theUrl[DisabledPropertyName] === true;\n                    }\n                    else if (!isNullOrUndefined(request)) {\n                        isDisabled = (typeof request === \"object\" ? request[DisabledPropertyName] === true : false) ||\n                            (init ? init[DisabledPropertyName] === true : false);\n                    }\n                    if (!isDisabled && theUrl && isInternalApplicationInsightsEndpoint(theUrl)) {\n                        isDisabled = true;\n                    }\n                    if (isDisabled) {\n                        if (!_disabledUrls[theUrl]) {\n                            _disabledUrls[theUrl] = 1;\n                        }\n                    }\n                    else {\n                        if (_disabledUrls[theUrl]) {\n                            isDisabled = true;\n                        }\n                    }\n                    return isDisabled;\n                }\n                function _isMonitoredXhrInstance(xhr, excludeAjaxDataValidation) {\n                    var ajaxValidation = true;\n                    var initialized = _xhrInitialized;\n                    if (!isNullOrUndefined(xhr)) {\n                        ajaxValidation = excludeAjaxDataValidation === true || !isNullOrUndefined(xhr[strAjaxData]);\n                    }\n                    return initialized\n                        && ajaxValidation;\n                }\n                function _getDistributedTraceCtx() {\n                    var distributedTraceCtx = null;\n                    if (_self[_DYN_CORE ] && _self[_DYN_CORE ].getTraceCtx) {\n                        distributedTraceCtx = _self[_DYN_CORE ].getTraceCtx(false);\n                    }\n                    if (!distributedTraceCtx && _context && _context.telemetryTrace) {\n                        distributedTraceCtx = createDistributedTraceContextFromTrace(_context.telemetryTrace);\n                    }\n                    return distributedTraceCtx;\n                }\n                function _openHandler(xhr, method, url, async) {\n                    var _a;\n                    var distributedTraceCtx = _getDistributedTraceCtx();\n                    var traceID = (distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_ID ]()) || generateW3CId();\n                    var spanID = strSubstr(generateW3CId(), 0, 16);\n                    var ajaxData = new ajaxRecord(traceID, spanID, _self[strDiagLog](), (_a = _self.core) === null || _a === void 0 ? void 0 : _a.getTraceCtx());\n                    ajaxData[_DYN_TRACE_FLAGS ] = distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_FLAGS ]();\n                    ajaxData[_DYN_METHOD ] = method;\n                    ajaxData[_DYN_REQUEST_URL ] = url;\n                    ajaxData.xhrMonitoringState[_DYN_OPEN_DONE ] = true;\n                    ajaxData[_DYN_REQUEST_HEADERS ] = {};\n                    ajaxData.async = async;\n                    ajaxData[_DYN_ERROR_STATUS_TEXT ] = _enableAjaxErrorStatusText;\n                    xhr[strAjaxData] = ajaxData;\n                }\n                function _attachToOnReadyStateChange(xhr) {\n                    xhr[strAjaxData].xhrMonitoringState[_DYN_STATE_CHANGE_ATTACHE13 ] = eventOn(xhr, \"readystatechange\", function () {\n                        var _a;\n                        try {\n                            if (xhr && xhr.readyState === 4 && _isMonitoredXhrInstance(xhr)) {\n                                _onAjaxComplete(xhr);\n                            }\n                        }\n                        catch (e) {\n                            var exceptionText = dumpObj(e);\n                            if (!exceptionText || _indexOf(exceptionText[_DYN_TO_LOWER_CASE ](), \"c00c023f\") === -1) {\n                                _throwInternalCritical(_self, 16 , ERROR_HEADER + \" 'readystatechange' event handler\" + ERROR_POSTFIX, (_a = {},\n                                    _a[_DYN_AJAX_DIAGNOSTICS_MES16 ] = _getFailedAjaxDiagnosticsMessage(xhr),\n                                    _a[_DYN_EXCEPTION ] = exceptionText,\n                                    _a));\n                            }\n                        }\n                    }, _evtNamespace);\n                }\n                function _getResponseText(xhr) {\n                    try {\n                        var responseType = xhr.responseType;\n                        if (responseType === \"\" || responseType === \"text\") {\n                            return xhr[_DYN_RESPONSE_TEXT ];\n                        }\n                    }\n                    catch (e) {\n                    }\n                    return null;\n                }\n                function _onAjaxComplete(xhr) {\n                    var ajaxData = xhr[strAjaxData];\n                    ajaxData[_DYN_RESPONSE_FINISHED_TI14 ] = dateTimeUtilsNow();\n                    ajaxData[_DYN_STATUS ] = xhr[_DYN_STATUS ];\n                    function _reportXhrError(e, failedProps) {\n                        var errorProps = failedProps || {};\n                        errorProps[\"ajaxDiagnosticsMessage\"] = _getFailedAjaxDiagnosticsMessage(xhr);\n                        if (e) {\n                            errorProps[\"exception\"] = dumpObj(e);\n                        }\n                        _throwInternalWarning(_self, 14 , FAILED_TO_CALCULATE_DURATION_ERROR + \"ajax call\" + ERROR_NOT_SENT, errorProps);\n                    }\n                    _findPerfResourceEntry(\"xmlhttprequest\", ajaxData, function () {\n                        try {\n                            var dependency = ajaxData[_DYN__CREATE_TRACK_ITEM ](\"Ajax\", _enableRequestHeaderTracking, function () {\n                                var _a;\n                                var ajaxResponse = (_a = {\n                                        statusText: xhr[_DYN_STATUS_TEXT ]\n                                    },\n                                    _a[_DYN_HEADER_MAP ] = null,\n                                    _a[_DYN_CORRELATION_CONTEXT ] = _getAjaxCorrelationContext(xhr),\n                                    _a.type = xhr.responseType,\n                                    _a[_DYN_RESPONSE_TEXT ] = _getResponseText(xhr),\n                                    _a.response = xhr[_DYN_RESPONSE ],\n                                    _a);\n                                if (_enableResponseHeaderTracking) {\n                                    var headers = xhr[_DYN_GET_ALL_RESPONSE_HEA15 ]();\n                                    if (headers) {\n                                        var arr = strTrim(headers).split(/[\\r\\n]+/);\n                                        var responseHeaderMap_2 = {};\n                                        arrForEach(arr, function (line) {\n                                            var parts = line.split(\": \");\n                                            var header = parts.shift();\n                                            var value = parts.join(\": \");\n                                            if (_canIncludeHeaders(header)) {\n                                                responseHeaderMap_2[header] = value;\n                                            }\n                                        });\n                                        ajaxResponse[_DYN_HEADER_MAP ] = responseHeaderMap_2;\n                                    }\n                                }\n                                return ajaxResponse;\n                            });\n                            var properties = void 0;\n                            try {\n                                if (!!_addRequestContext) {\n                                    properties = _addRequestContext({ status: xhr[_DYN_STATUS ], xhr: xhr });\n                                }\n                            }\n                            catch (e) {\n                                _throwInternalWarning(_self, 104 , CUSTOM_REQUEST_CONTEXT_ERROR);\n                            }\n                            if (dependency) {\n                                if (properties !== undefined) {\n                                    dependency[STR_PROPERTIES ] = __assignFn(__assignFn({}, dependency.properties), properties);\n                                }\n                                var sysProperties = ajaxData[_DYN_GET_PART_APROPS ]();\n                                _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE ], ajaxData, dependency, null, sysProperties);\n                            }\n                            else {\n                                _reportXhrError(null, {\n                                    requestSentTime: ajaxData[_DYN_REQUEST_SENT_TIME ],\n                                    responseFinishedTime: ajaxData[_DYN_RESPONSE_FINISHED_TI14 ]\n                                });\n                            }\n                        }\n                        finally {\n                            try {\n                                xhr[strAjaxData] = null;\n                            }\n                            catch (e) {\n                            }\n                        }\n                    }, function (e) {\n                        _reportXhrError(e, null);\n                    });\n                }\n                function _getAjaxCorrelationContext(xhr) {\n                    var _a;\n                    try {\n                        var responseHeadersString = xhr[_DYN_GET_ALL_RESPONSE_HEA15 ]();\n                        if (responseHeadersString !== null) {\n                            var index = _indexOf(responseHeadersString[_DYN_TO_LOWER_CASE ](), RequestHeaders[8 ]);\n                            if (index !== -1) {\n                                var responseHeader = xhr.getResponseHeader(RequestHeaders[0 ]);\n                                return correlationIdGetCorrelationContext(responseHeader);\n                            }\n                        }\n                    }\n                    catch (e) {\n                        _throwInternalWarning(_self, 18 , CORRELATION_HEADER_ERROR, (_a = {},\n                            _a[_DYN_AJAX_DIAGNOSTICS_MES16 ] = _getFailedAjaxDiagnosticsMessage(xhr),\n                            _a[_DYN_EXCEPTION ] = dumpObj(e),\n                            _a));\n                    }\n                }\n                function _createMarkId(type, ajaxData) {\n                    if (ajaxData[_DYN_REQUEST_URL ] && _markPrefix && _enableAjaxPerfTracking) {\n                        var performance_1 = getPerformance();\n                        if (performance_1 && isFunction(performance_1.mark)) {\n                            _markCount++;\n                            var markId = _markPrefix + type + \"#\" + _markCount;\n                            performance_1.mark(markId);\n                            var entries = performance_1.getEntriesByName(markId);\n                            if (entries && entries[_DYN_LENGTH$1 ] === 1) {\n                                ajaxData[_DYN_PERF_MARK ] = entries[0];\n                            }\n                        }\n                    }\n                }\n                function _findPerfResourceEntry(initiatorType, ajaxData, trackCallback, reportError) {\n                    var perfMark = ajaxData[_DYN_PERF_MARK ];\n                    var performance = getPerformance();\n                    var maxAttempts = _maxAjaxPerfLookupAttempts;\n                    var retryDelay = _ajaxPerfLookupDelay;\n                    var requestUrl = ajaxData[_DYN_REQUEST_URL ];\n                    var attempt = 0;\n                    (function locateResourceTiming() {\n                        try {\n                            if (performance && perfMark) {\n                                attempt++;\n                                var perfTiming = null;\n                                var entries = performance.getEntries();\n                                for (var lp = entries[_DYN_LENGTH$1 ] - 1; lp >= 0; lp--) {\n                                    var entry = entries[lp];\n                                    if (entry) {\n                                        if (entry.entryType === \"resource\") {\n                                            if (entry.initiatorType === initiatorType &&\n                                                (_indexOf(entry[_DYN_NAME ], requestUrl) !== -1 || _indexOf(requestUrl, entry[_DYN_NAME ]) !== -1)) {\n                                                perfTiming = entry;\n                                            }\n                                        }\n                                        else if (entry.entryType === \"mark\" && entry[_DYN_NAME ] === perfMark[_DYN_NAME ]) {\n                                            ajaxData[_DYN_PERF_TIMING ] = perfTiming;\n                                            break;\n                                        }\n                                        if (entry[_DYN_START_TIME ] < perfMark[_DYN_START_TIME ] - 1000) {\n                                            break;\n                                        }\n                                    }\n                                }\n                            }\n                            if (!perfMark ||\n                                ajaxData[_DYN_PERF_TIMING ] ||\n                                attempt >= maxAttempts ||\n                                ajaxData.async === false) {\n                                if (perfMark && isFunction(performance.clearMarks)) {\n                                    performance.clearMarks(perfMark[_DYN_NAME ]);\n                                }\n                                ajaxData.perfAttempts = attempt;\n                                trackCallback();\n                            }\n                            else {\n                                scheduleTimeout(locateResourceTiming, retryDelay);\n                            }\n                        }\n                        catch (e) {\n                            reportError(e);\n                        }\n                    })();\n                }\n                function _createFetchRecord(input, init) {\n                    var _a;\n                    var distributedTraceCtx = _getDistributedTraceCtx();\n                    var traceID = (distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_ID ]()) || generateW3CId();\n                    var spanID = strSubstr(generateW3CId(), 0, 16);\n                    var ajaxData = new ajaxRecord(traceID, spanID, _self[strDiagLog](), (_a = _self.core) === null || _a === void 0 ? void 0 : _a.getTraceCtx());\n                    ajaxData[_DYN_TRACE_FLAGS ] = distributedTraceCtx && distributedTraceCtx[_DYN_GET_TRACE_FLAGS ]();\n                    ajaxData[_DYN_REQUEST_SENT_TIME ] = dateTimeUtilsNow();\n                    ajaxData[_DYN_ERROR_STATUS_TEXT ] = _enableAjaxErrorStatusText;\n                    if (input instanceof Request) {\n                        ajaxData[_DYN_REQUEST_URL ] = input ? input.url : \"\";\n                    }\n                    else {\n                        ajaxData[_DYN_REQUEST_URL ] = input;\n                    }\n                    var method = \"GET\";\n                    if (init && init[_DYN_METHOD ]) {\n                        method = init[_DYN_METHOD ];\n                    }\n                    else if (input && input instanceof Request) {\n                        method = input[_DYN_METHOD ];\n                    }\n                    ajaxData[_DYN_METHOD ] = method;\n                    var requestHeaders = {};\n                    if (_enableRequestHeaderTracking) {\n                        var headers = new Headers((init ? init[_DYN_HEADERS ] : 0) || (input instanceof Request ? (input[_DYN_HEADERS ] || {}) : {}));\n                        headers.forEach(function (value, key) {\n                            if (_canIncludeHeaders(key)) {\n                                requestHeaders[key] = value;\n                            }\n                        });\n                    }\n                    ajaxData[_DYN_REQUEST_HEADERS ] = requestHeaders;\n                    _createMarkId(STR_FETCH, ajaxData);\n                    return ajaxData;\n                }\n                function _getFailedFetchDiagnosticsMessage(input) {\n                    var result = \"\";\n                    try {\n                        if (!isNullOrUndefined(input)) {\n                            if (typeof (input) === \"string\") {\n                                result += \"(url: '\".concat(input, \"')\");\n                            }\n                            else {\n                                result += \"(url: '\".concat(input.url, \"')\");\n                            }\n                        }\n                    }\n                    catch (e) {\n                        _throwInternalCritical(_self, 15 , \"Failed to grab failed fetch diagnostics message\", { exception: dumpObj(e) });\n                    }\n                    return result;\n                }\n                function _reportFetchMetrics(callDetails, status, input, response, ajaxData, getResponse, properties) {\n                    if (!ajaxData) {\n                        return;\n                    }\n                    function _reportFetchError(msgId, e, failedProps) {\n                        var errorProps = failedProps || {};\n                        errorProps[\"fetchDiagnosticsMessage\"] = _getFailedFetchDiagnosticsMessage(input);\n                        if (e) {\n                            errorProps[\"exception\"] = dumpObj(e);\n                        }\n                        _throwInternalWarning(_self, msgId, FAILED_TO_CALCULATE_DURATION_ERROR + \"fetch call\" + ERROR_NOT_SENT, errorProps);\n                    }\n                    ajaxData[_DYN_RESPONSE_FINISHED_TI14 ] = dateTimeUtilsNow();\n                    ajaxData[_DYN_STATUS ] = status;\n                    _findPerfResourceEntry(STR_FETCH, ajaxData, function () {\n                        var dependency = ajaxData[_DYN__CREATE_TRACK_ITEM ](\"Fetch\", _enableRequestHeaderTracking, getResponse);\n                        var properties;\n                        try {\n                            if (!!_addRequestContext) {\n                                properties = _addRequestContext({ status: status, request: input, response: response });\n                            }\n                        }\n                        catch (e) {\n                            _throwInternalWarning(_self, 104 , CUSTOM_REQUEST_CONTEXT_ERROR);\n                        }\n                        if (dependency) {\n                            if (properties !== undefined) {\n                                dependency[STR_PROPERTIES ] = __assignFn(__assignFn({}, dependency.properties), properties);\n                            }\n                            var sysProperties = ajaxData[_DYN_GET_PART_APROPS ]();\n                            _reportDependencyInternal(_dependencyInitializers, _self[_DYN_CORE ], ajaxData, dependency, null, sysProperties);\n                        }\n                        else {\n                            _reportFetchError(14 , null, {\n                                requestSentTime: ajaxData[_DYN_REQUEST_SENT_TIME ],\n                                responseFinishedTime: ajaxData[_DYN_RESPONSE_FINISHED_TI14 ]\n                            });\n                        }\n                    }, function (e) {\n                        _reportFetchError(18 , e, null);\n                    });\n                }\n                function _getFetchCorrelationContext(response) {\n                    var _a;\n                    if (response && response[_DYN_HEADERS ]) {\n                        try {\n                            var responseHeader = response[_DYN_HEADERS ].get(RequestHeaders[0 ]);\n                            return correlationIdGetCorrelationContext(responseHeader);\n                        }\n                        catch (e) {\n                            _throwInternalWarning(_self, 18 , CORRELATION_HEADER_ERROR, (_a = {\n                                    fetchDiagnosticsMessage: _getFailedFetchDiagnosticsMessage(response)\n                                },\n                                _a[_DYN_EXCEPTION ] = dumpObj(e),\n                                _a));\n                        }\n                    }\n                }\n                function _reportDependencyInternal(initializers, core, ajaxData, dependency, properties, systemProperties) {\n                    var _a;\n                    var result = true;\n                    var initializersCount = initializers[_DYN_LENGTH$1 ];\n                    if (initializersCount > 0) {\n                        var details = (_a = {\n                                item: dependency\n                            },\n                            _a[STR_PROPERTIES ] = properties,\n                            _a.sysProperties = systemProperties,\n                            _a.context = ajaxData ? ajaxData[_DYN_CONTEXT$1 ] : null,\n                            _a.aborted = ajaxData ? !!ajaxData[_DYN_ABORTED ] : false,\n                            _a);\n                        result = _processDependencyContainer(core, initializers, details, \"initializer\");\n                    }\n                    if (result) {\n                        _self[_DYN_TRACK_DEPENDENCY_DAT3 ](dependency, properties, systemProperties);\n                    }\n                }\n            });\n            return _this;\n        }\n        AjaxMonitor.prototype.processTelemetry = function (item, itemCtx) {\n            this.processNext(item, itemCtx);\n        };\n        AjaxMonitor.prototype.addDependencyInitializer = function (dependencyInitializer) {\n            return null;\n        };\n        AjaxMonitor.identifier = \"AjaxDependencyPlugin\";\n        return AjaxMonitor;\n    }(BaseTelemetryPlugin));\n\n    var Application = /** @class */ (function () {\n        function Application() {\n        }\n        return Application;\n    }());\n\n    var Device = /** @class */ (function () {\n        function Device() {\n            this.id = \"browser\";\n            this.deviceClass = \"Browser\";\n        }\n        return Device;\n    }());\n\n    var Version = '3.0.2';\n    var Internal = /** @class */ (function () {\n        function Internal(config, unloadHookContainer) {\n            var _this = this;\n            var unloadHook = onConfigChange((config), function () {\n                var prefix = config.sdkExtension;\n                _this.sdkVersion = (prefix ? prefix + \"_\" : \"\") + \"javascript:\" + Version;\n            });\n            unloadHookContainer && unloadHookContainer.add(unloadHook);\n        }\n        return Internal;\n    }());\n\n    var Location = /** @class */ (function () {\n        function Location() {\n        }\n        return Location;\n    }());\n\n    var _DYN_SESSION_MANAGER = \"sessionManager\";\n    var _DYN_UPDATE = \"update\";\n    var _DYN_IS_USER_COOKIE_SET = \"isUserCookieSet\";\n    var _DYN_IS_NEW_USER = \"isNewUser\";\n    var _DYN_GET_TRACE_CTX = \"getTraceCtx\";\n    var _DYN_TELEMETRY_TRACE = \"telemetryTrace\";\n    var _DYN_APPLY_SESSION_CONTEX0 = \"applySessionContext\";\n    var _DYN_APPLY_APPLICATION_CO1 = \"applyApplicationContext\";\n    var _DYN_APPLY_DEVICE_CONTEXT = \"applyDeviceContext\";\n    var _DYN_APPLY_OPERATION_CONT2 = \"applyOperationContext\";\n    var _DYN_APPLY_USER_CONTEXT = \"applyUserContext\";\n    var _DYN_APPLY_OPERATING_SYST3 = \"applyOperatingSystemContxt\";\n    var _DYN_APPLY_LOCATION_CONTE4 = \"applyLocationContext\";\n    var _DYN_APPLY_INTERNAL_CONTE5 = \"applyInternalContext\";\n    var _DYN_ACCOUNT_ID = \"accountId\";\n    var _DYN_GET_SESSION_ID = \"getSessionId\";\n    var _DYN_NAME_PREFIX = \"namePrefix\";\n    var _DYN_SESSION_COOKIE_POSTF6 = \"sessionCookiePostfix\";\n    var _DYN_USER_COOKIE_POSTFIX = \"userCookiePostfix\";\n    var _DYN_ID_LENGTH = \"idLength\";\n    var _DYN_GET_NEW_ID = \"getNewId\";\n    var _DYN_LENGTH = \"length\";\n    var _DYN_AUTOMATIC_SESSION = \"automaticSession\";\n    var _DYN_AUTHENTICATED_ID = \"authenticatedId\";\n    var _DYN_ACQUISITION_DATE = \"acquisitionDate\";\n    var _DYN_RENEWAL_DATE = \"renewalDate\";\n    var _DYN_JOIN = \"join\";\n    var _DYN_COOKIE_SEPARATOR = \"cookieSeparator\";\n    var _DYN_AUTH_USER_COOKIE_NAM7 = \"authUserCookieName\";\n\n    var SESSION_COOKIE_NAME = \"ai_session\";\n    var ACQUISITION_SPAN = 86400000;\n    var RENEWAL_SPAN = 1800000;\n    var COOKIE_UPDATE_INTERVAL = 60000;\n    var Session = /** @class */ (function () {\n        function Session() {\n        }\n        return Session;\n    }());\n    var _SessionManager = /** @class */ (function () {\n        function _SessionManager(config, core, unloadHookContainer) {\n            var self = this;\n            var _storageNamePrefix;\n            var _cookieUpdatedTimestamp;\n            var _logger = safeGetLogger(core);\n            var _cookieManager = safeGetCookieMgr(core);\n            var _sessionExpirationMs;\n            var _sessionRenewalMs;\n            dynamicProto(_SessionManager, self, function (_self) {\n                if (!config) {\n                    config = {};\n                }\n                var unloadHook = onConfigChange(config, function (details) {\n                    _sessionExpirationMs = config.sessionExpirationMs || ACQUISITION_SPAN;\n                    _sessionRenewalMs = config.sessionRenewalMs || RENEWAL_SPAN;\n                    var sessionCookiePostfix = config.sessionCookiePostfix || config[_DYN_NAME_PREFIX ] || \"\";\n                    _storageNamePrefix = SESSION_COOKIE_NAME + sessionCookiePostfix;\n                });\n                unloadHookContainer && unloadHookContainer.add(unloadHook);\n                _self[_DYN_AUTOMATIC_SESSION ] = new Session();\n                _self[_DYN_UPDATE ] = function () {\n                    var nowMs = utcNow();\n                    var isExpired = false;\n                    var session = _self[_DYN_AUTOMATIC_SESSION ];\n                    if (!session.id) {\n                        isExpired = !_initializeAutomaticSession(session);\n                    }\n                    if (!isExpired && _sessionExpirationMs > 0) {\n                        var timeSinceAcqMs = nowMs - session[_DYN_ACQUISITION_DATE ];\n                        var timeSinceRenewalMs = nowMs - session[_DYN_RENEWAL_DATE ];\n                        isExpired = timeSinceAcqMs < 0 || timeSinceRenewalMs < 0;\n                        isExpired = isExpired || timeSinceAcqMs > _sessionExpirationMs;\n                        isExpired = isExpired || timeSinceRenewalMs > _sessionRenewalMs;\n                    }\n                    if (isExpired) {\n                        _renew(nowMs);\n                    }\n                    else {\n                        if (!_cookieUpdatedTimestamp || nowMs - _cookieUpdatedTimestamp > COOKIE_UPDATE_INTERVAL) {\n                            _setCookie(session, nowMs);\n                        }\n                    }\n                };\n                _self.backup = function () {\n                    var session = _self[_DYN_AUTOMATIC_SESSION ];\n                    _setStorage(session.id, session[_DYN_ACQUISITION_DATE ], session[_DYN_RENEWAL_DATE ]);\n                };\n                function _initializeAutomaticSession(session, now) {\n                    var isValid = false;\n                    var cookieValue = _cookieManager.get(_storageNamePrefix);\n                    if (cookieValue && isFunction(cookieValue.split)) {\n                        isValid = _initializeAutomaticSessionWithData(session, cookieValue);\n                    }\n                    else {\n                        var storageValue = utlGetLocalStorage(_logger, _storageNamePrefix);\n                        if (storageValue) {\n                            isValid = _initializeAutomaticSessionWithData(session, storageValue);\n                        }\n                    }\n                    return isValid || !!session.id;\n                }\n                function _initializeAutomaticSessionWithData(session, sessionData) {\n                    var isValid = false;\n                    var sessionReset = \", session will be reset\";\n                    var tokens = sessionData.split(\"|\");\n                    if (tokens[_DYN_LENGTH ] >= 2) {\n                        try {\n                            var acqMs = +tokens[1] || 0;\n                            var renewalMs = +tokens[2] || 0;\n                            if (isNaN(acqMs) || acqMs <= 0) {\n                                _throwInternal(_logger, 2 , 27 , \"AI session acquisition date is 0\" + sessionReset);\n                            }\n                            else if (isNaN(renewalMs) || renewalMs <= 0) {\n                                _throwInternal(_logger, 2 , 27 , \"AI session renewal date is 0\" + sessionReset);\n                            }\n                            else if (tokens[0]) {\n                                session.id = tokens[0];\n                                session[_DYN_ACQUISITION_DATE ] = acqMs;\n                                session[_DYN_RENEWAL_DATE ] = renewalMs;\n                                isValid = true;\n                            }\n                        }\n                        catch (e) {\n                            _throwInternal(_logger, 1 , 9 , \"Error parsing ai_session value [\" + (sessionData || \"\") + \"]\" + sessionReset + \" - \" + getExceptionName(e), { exception: dumpObj(e) });\n                        }\n                    }\n                    return isValid;\n                }\n                function _renew(nowMs) {\n                    var getNewId = config[_DYN_GET_NEW_ID ] || newId;\n                    _self.automaticSession.id = getNewId(config[_DYN_ID_LENGTH ] || 22);\n                    _self[_DYN_AUTOMATIC_SESSION ][_DYN_ACQUISITION_DATE ] = nowMs;\n                    _setCookie(_self[_DYN_AUTOMATIC_SESSION ], nowMs);\n                    if (!utlCanUseLocalStorage()) {\n                        _throwInternal(_logger, 2 , 0 , \"Browser does not support local storage. Session durations will be inaccurate.\");\n                    }\n                }\n                function _setCookie(session, nowMs) {\n                    var acq = session[_DYN_ACQUISITION_DATE ];\n                    session[_DYN_RENEWAL_DATE ] = nowMs;\n                    var renewalPeriodMs = _sessionRenewalMs;\n                    var acqTimeLeftMs = (acq + _sessionExpirationMs) - nowMs;\n                    var cookie = [session.id, acq, nowMs];\n                    var maxAgeSec = 0;\n                    if (acqTimeLeftMs < renewalPeriodMs) {\n                        maxAgeSec = acqTimeLeftMs / 1000;\n                    }\n                    else {\n                        maxAgeSec = renewalPeriodMs / 1000;\n                    }\n                    var cookieDomain = config.cookieDomain || null;\n                    _cookieManager.set(_storageNamePrefix, cookie[_DYN_JOIN ](\"|\"), _sessionExpirationMs > 0 ? maxAgeSec : null, cookieDomain);\n                    _cookieUpdatedTimestamp = nowMs;\n                }\n                function _setStorage(guid, acq, renewal) {\n                    utlSetLocalStorage(_logger, _storageNamePrefix, [guid, acq, renewal][_DYN_JOIN ](\"|\"));\n                }\n            });\n        }\n        _SessionManager.__ieDyn=1;\n        return _SessionManager;\n    }());\n\n    var TelemetryTrace = /** @class */ (function () {\n        function TelemetryTrace(id, parentId, name, logger) {\n            var _self = this;\n            _self.traceID = id || generateW3CId();\n            _self.parentID = parentId;\n            var location = getLocation();\n            if (!name && location && location.pathname) {\n                name = location.pathname;\n            }\n            _self.name = dataSanitizeString(logger, name);\n        }\n        return TelemetryTrace;\n    }());\n\n    function _validateUserInput(id) {\n        if (typeof id !== \"string\" ||\n            !id ||\n            id.match(/,|;|=| |\\|/)) {\n            return false;\n        }\n        return true;\n    }\n    var User = /** @class */ (function () {\n        function User(config, core, unloadHookContainer) {\n            this.isNewUser = false;\n            this.isUserCookieSet = false;\n            var _logger = safeGetLogger(core);\n            var _cookieManager = safeGetCookieMgr(core);\n            var _storageNamePrefix;\n            dynamicProto(User, this, function (_self) {\n                objDefine(_self, \"config\", {\n                    g: function () { return config; }\n                });\n                var unloadHook = onConfigChange(config, function () {\n                    var userCookiePostfix = config[_DYN_USER_COOKIE_POSTFIX ] || \"\";\n                    _storageNamePrefix = User.userCookieName + userCookiePostfix;\n                    var cookie = _cookieManager.get(_storageNamePrefix);\n                    if (cookie) {\n                        _self[_DYN_IS_NEW_USER ] = false;\n                        var params = cookie.split(User[_DYN_COOKIE_SEPARATOR ]);\n                        if (params[_DYN_LENGTH ] > 0) {\n                            _self.id = params[0];\n                            _self[_DYN_IS_USER_COOKIE_SET ] = !!_self.id;\n                        }\n                    }\n                    if (!_self.id) {\n                        _self.id = _generateNewId();\n                        var newCookie = _generateNewCookie(_self.id);\n                        _setUserCookie(newCookie[_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]));\n                        var name_1 = (config[_DYN_NAME_PREFIX ] || \"\") + \"ai_session\";\n                        utlRemoveStorage(_logger, name_1);\n                    }\n                    _self[_DYN_ACCOUNT_ID ] = config[_DYN_ACCOUNT_ID ] || undefined;\n                    var authCookie = _cookieManager.get(User[_DYN_AUTH_USER_COOKIE_NAM7 ]);\n                    if (authCookie) {\n                        authCookie = decodeURI(authCookie);\n                        var authCookieString = authCookie.split(User[_DYN_COOKIE_SEPARATOR ]);\n                        if (authCookieString[0]) {\n                            _self[_DYN_AUTHENTICATED_ID ] = authCookieString[0];\n                        }\n                        if (authCookieString[_DYN_LENGTH ] > 1 && authCookieString[1]) {\n                            _self[_DYN_ACCOUNT_ID ] = authCookieString[1];\n                        }\n                    }\n                });\n                unloadHookContainer && unloadHookContainer.add(unloadHook);\n                function _generateNewId() {\n                    var theConfig = (config || {});\n                    var getNewId = theConfig[_DYN_GET_NEW_ID ] || newId;\n                    var id = getNewId(theConfig[_DYN_ID_LENGTH ] ? config[_DYN_ID_LENGTH ] : 22);\n                    return id;\n                }\n                function _generateNewCookie(userId) {\n                    var acqStr = toISOString(new Date());\n                    _self.accountAcquisitionDate = acqStr;\n                    _self[_DYN_IS_NEW_USER ] = true;\n                    var newCookie = [userId, acqStr];\n                    return newCookie;\n                }\n                function _setUserCookie(cookie) {\n                    var oneYear = 31536000;\n                    _self[_DYN_IS_USER_COOKIE_SET ] = _cookieManager.set(_storageNamePrefix, cookie, oneYear);\n                }\n                _self.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n                    if (storeInCookie === void 0) { storeInCookie = false; }\n                    var isInvalidInput = !_validateUserInput(authenticatedUserId) || (accountId && !_validateUserInput(accountId));\n                    if (isInvalidInput) {\n                        _throwInternal(_logger, 2 , 60 , \"Setting auth user context failed. \" +\n                            \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                        return;\n                    }\n                    _self[_DYN_AUTHENTICATED_ID ] = authenticatedUserId;\n                    var authCookie = _self[_DYN_AUTHENTICATED_ID ];\n                    if (accountId) {\n                        _self[_DYN_ACCOUNT_ID ] = accountId;\n                        authCookie = [_self[_DYN_AUTHENTICATED_ID ], _self.accountId][_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]);\n                    }\n                    if (storeInCookie) {\n                        _cookieManager.set(User[_DYN_AUTH_USER_COOKIE_NAM7 ], encodeURI(authCookie));\n                    }\n                };\n                _self.clearAuthenticatedUserContext = function () {\n                    _self[_DYN_AUTHENTICATED_ID ] = null;\n                    _self[_DYN_ACCOUNT_ID ] = null;\n                    _cookieManager.del(User[_DYN_AUTH_USER_COOKIE_NAM7 ]);\n                };\n                _self[_DYN_UPDATE ] = function (userId) {\n                    if (_self.id !== userId || !_self[_DYN_IS_USER_COOKIE_SET ]) {\n                        var user_id = userId ? userId : _generateNewId();\n                        var user_cookie = _generateNewCookie(user_id);\n                        _setUserCookie(user_cookie[_DYN_JOIN ](User[_DYN_COOKIE_SEPARATOR ]));\n                    }\n                };\n            });\n        }\n        User.cookieSeparator = \"|\";\n        User.userCookieName = \"ai_user\";\n        User.authUserCookieName = \"ai_authUser\";\n        return User;\n    }());\n\n    var strExt = \"ext\";\n    var strTags = \"tags\";\n    function _removeEmpty(target, name) {\n        if (target && target[name] && objKeys(target[name])[_DYN_LENGTH ] === 0) {\n            delete target[name];\n        }\n    }\n    function _nullResult() {\n        return null;\n    }\n    var TelemetryContext = /** @class */ (function () {\n        function TelemetryContext(core, defaultConfig, previousTraceCtx, unloadHookContainer) {\n            var _this = this;\n            var logger = core.logger;\n            dynamicProto(TelemetryContext, this, function (_self) {\n                _self.appId = _nullResult;\n                _self[_DYN_GET_SESSION_ID ] = _nullResult;\n                _self.application = new Application();\n                _self.internal = new Internal(defaultConfig, unloadHookContainer);\n                if (hasWindow()) {\n                    _self[_DYN_SESSION_MANAGER ] = new _SessionManager(defaultConfig, core, unloadHookContainer);\n                    _self.device = new Device();\n                    _self.location = new Location();\n                    _self.user = new User(defaultConfig, core, unloadHookContainer);\n                    var traceId = void 0;\n                    var parentId = void 0;\n                    var name_1;\n                    if (previousTraceCtx) {\n                        traceId = previousTraceCtx.getTraceId();\n                        parentId = previousTraceCtx.getSpanId();\n                        name_1 = previousTraceCtx.getName();\n                    }\n                    _self[_DYN_TELEMETRY_TRACE ] = new TelemetryTrace(traceId, parentId, name_1, logger);\n                    _self.session = new Session();\n                }\n                _self[_DYN_GET_SESSION_ID ] = function () {\n                    var session = _self.session;\n                    var sesId = null;\n                    if (session && isString(session.id)) {\n                        sesId = session.id;\n                    }\n                    else {\n                        var autoSession = (_self[_DYN_SESSION_MANAGER ] || {})[_DYN_AUTOMATIC_SESSION ];\n                        sesId = autoSession && isString(autoSession.id) ? autoSession.id : null;\n                    }\n                    return sesId;\n                };\n                _self[_DYN_APPLY_SESSION_CONTEX0 ] = function (evt, itemCtx) {\n                    setValue(getSetValue(evt.ext, Extensions.AppExt), \"sesId\", _self[_DYN_GET_SESSION_ID ](), isString);\n                };\n                _self[_DYN_APPLY_OPERATING_SYST3 ] = function (evt, itemCtx) {\n                    setValue(evt.ext, Extensions.OSExt, _self.os);\n                };\n                _self[_DYN_APPLY_APPLICATION_CO1 ] = function (evt, itemCtx) {\n                    var application = _self.application;\n                    if (application) {\n                        var tags = getSetValue(evt, strTags);\n                        setValue(tags, CtxTagKeys.applicationVersion, application.ver, isString);\n                        setValue(tags, CtxTagKeys.applicationBuild, application.build, isString);\n                    }\n                };\n                _self[_DYN_APPLY_DEVICE_CONTEXT ] = function (evt, itemCtx) {\n                    var device = _self.device;\n                    if (device) {\n                        var extDevice = getSetValue(getSetValue(evt, strExt), Extensions.DeviceExt);\n                        setValue(extDevice, \"localId\", device.id, isString);\n                        setValue(extDevice, \"ip\", device.ip, isString);\n                        setValue(extDevice, \"model\", device.model, isString);\n                        setValue(extDevice, \"deviceClass\", device.deviceClass, isString);\n                    }\n                };\n                _self[_DYN_APPLY_INTERNAL_CONTE5 ] = function (evt, itemCtx) {\n                    var internal = _self.internal;\n                    if (internal) {\n                        var tags = getSetValue(evt, strTags);\n                        setValue(tags, CtxTagKeys.internalAgentVersion, internal.agentVersion, isString);\n                        setValue(tags, CtxTagKeys.internalSdkVersion, dataSanitizeString(logger, internal.sdkVersion, 64), isString);\n                        if (evt.baseType === _InternalLogMessage.dataType || evt.baseType === PageView.dataType) {\n                            setValue(tags, CtxTagKeys.internalSnippet, internal.snippetVer, isString);\n                            setValue(tags, CtxTagKeys.internalSdkSrc, internal.sdkSrc, isString);\n                        }\n                    }\n                };\n                _self[_DYN_APPLY_LOCATION_CONTE4 ] = function (evt, itemCtx) {\n                    var location = _this.location;\n                    if (location) {\n                        setValue(getSetValue(evt, strTags, []), CtxTagKeys.locationIp, location.ip, isString);\n                    }\n                };\n                _self[_DYN_APPLY_OPERATION_CONT2 ] = function (evt, itemCtx) {\n                    var telemetryTrace = _self[_DYN_TELEMETRY_TRACE ];\n                    if (telemetryTrace) {\n                        var extTrace = getSetValue(getSetValue(evt, strExt), Extensions.TraceExt, { traceID: undefined, parentID: undefined });\n                        setValue(extTrace, \"traceID\", telemetryTrace.traceID, isString, isNullOrUndefined);\n                        setValue(extTrace, \"name\", telemetryTrace.name, isString, isNullOrUndefined);\n                        setValue(extTrace, \"parentID\", telemetryTrace.parentID, isString, isNullOrUndefined);\n                    }\n                };\n                _self.applyWebContext = function (evt, itemCtx) {\n                    var web = _this.web;\n                    if (web) {\n                        setValue(getSetValue(evt, strExt), Extensions.WebExt, web);\n                    }\n                };\n                _self[_DYN_APPLY_USER_CONTEXT ] = function (evt, itemCtx) {\n                    var user = _self.user;\n                    if (user) {\n                        var tags = getSetValue(evt, strTags, []);\n                        setValue(tags, CtxTagKeys.userAccountId, user[_DYN_ACCOUNT_ID ], isString);\n                        var extUser = getSetValue(getSetValue(evt, strExt), Extensions.UserExt);\n                        setValue(extUser, \"id\", user.id, isString);\n                        setValue(extUser, \"authId\", user[_DYN_AUTHENTICATED_ID ], isString);\n                    }\n                };\n                _self.cleanUp = function (evt, itemCtx) {\n                    var ext = evt.ext;\n                    if (ext) {\n                        _removeEmpty(ext, Extensions.DeviceExt);\n                        _removeEmpty(ext, Extensions.UserExt);\n                        _removeEmpty(ext, Extensions.WebExt);\n                        _removeEmpty(ext, Extensions.OSExt);\n                        _removeEmpty(ext, Extensions.AppExt);\n                        _removeEmpty(ext, Extensions.TraceExt);\n                    }\n                };\n            });\n        }\n        TelemetryContext.__ieDyn=1;\n        return TelemetryContext;\n    }());\n\n    var _a$1;\n    var undefString;\n    var nullValue = null;\n    var _defaultConfig = objDeepFreeze((_a$1 = {},\n        _a$1[_DYN_ACCOUNT_ID ] = nullValue,\n        _a$1.sessionRenewalMs = 30 * 60 * 1000,\n        _a$1.samplingPercentage = 100,\n        _a$1.sessionExpirationMs = 24 * 60 * 60 * 1000,\n        _a$1.cookieDomain = nullValue,\n        _a$1.sdkExtension = nullValue,\n        _a$1.isBrowserLinkTrackingEnabled = false,\n        _a$1.appId = nullValue,\n        _a$1[_DYN_GET_SESSION_ID ] = nullValue,\n        _a$1[_DYN_NAME_PREFIX ] = undefString,\n        _a$1[_DYN_SESSION_COOKIE_POSTF6 ] = undefString,\n        _a$1[_DYN_USER_COOKIE_POSTFIX ] = undefString,\n        _a$1[_DYN_ID_LENGTH ] = 22,\n        _a$1[_DYN_GET_NEW_ID ] = nullValue,\n        _a$1));\n    var PropertiesPlugin = /** @class */ (function (_super) {\n        __extendsFn(PropertiesPlugin, _super);\n        function PropertiesPlugin() {\n            var _this = _super.call(this) || this;\n            _this.priority = 110;\n            _this.identifier = PropertiesPluginIdentifier;\n            var _extensionConfig;\n            var _distributedTraceCtx;\n            var _previousTraceCtx;\n            var _context;\n            dynamicProto(PropertiesPlugin, _this, function (_self, _base) {\n                _initDefaults();\n                objDefine(_self, \"context\", {\n                    g: function () {\n                        return _context;\n                    }\n                });\n                _self.initialize = function (config, core, extensions, pluginChain) {\n                    _base.initialize(config, core, extensions, pluginChain);\n                    _populateDefaults(config);\n                };\n                _self.processTelemetry = function (event, itemCtx) {\n                    if (!isNullOrUndefined(event)) {\n                        itemCtx = _self._getTelCtx(itemCtx);\n                        if (event.name === PageView.envelopeType) {\n                            itemCtx.diagLog().resetInternalMessageCount();\n                        }\n                        var theContext = (_context || {});\n                        if (theContext.session) {\n                            if (typeof _context.session.id !== \"string\" && theContext[_DYN_SESSION_MANAGER ]) {\n                                theContext[_DYN_SESSION_MANAGER ][_DYN_UPDATE ]();\n                            }\n                        }\n                        var userCtx = theContext.user;\n                        if (userCtx && !userCtx[_DYN_IS_USER_COOKIE_SET ]) {\n                            userCtx[_DYN_UPDATE ](theContext.user.id);\n                        }\n                        _processTelemetryInternal(event, itemCtx);\n                        if (userCtx && userCtx[_DYN_IS_NEW_USER ]) {\n                            userCtx[_DYN_IS_NEW_USER ] = false;\n                            var message = new _InternalLogMessage(72 , ((getNavigator() || {}).userAgent || \"\"));\n                            _logInternalMessage(itemCtx.diagLog(), 1 , message);\n                        }\n                        _self.processNext(event, itemCtx);\n                    }\n                };\n                _self._doTeardown = function (unloadCtx, unloadState) {\n                    var core = (unloadCtx || {}).core();\n                    if (core && core[_DYN_GET_TRACE_CTX ]) {\n                        var traceCtx = core[_DYN_GET_TRACE_CTX ](false);\n                        if (traceCtx === _distributedTraceCtx) {\n                            core.setTraceCtx(_previousTraceCtx);\n                        }\n                    }\n                    _initDefaults();\n                };\n                function _initDefaults() {\n                    _extensionConfig = null;\n                    _distributedTraceCtx = null;\n                    _previousTraceCtx = null;\n                    _context = null;\n                }\n                function _populateDefaults(config) {\n                    var identifier = _self.identifier;\n                    var core = _self.core;\n                    _self._addHook(onConfigChange(config, function () {\n                        var ctx = createProcessTelemetryContext(null, config, core);\n                        if (config.storagePrefix) {\n                            utlSetStoragePrefix(config.storagePrefix);\n                        }\n                        _extensionConfig = ctx.getExtCfg(identifier, _defaultConfig);\n                        _self[\"_extConfig\"] = _extensionConfig;\n                    }));\n                    _previousTraceCtx = core[_DYN_GET_TRACE_CTX ](false);\n                    _context = new TelemetryContext(core, _extensionConfig, _previousTraceCtx, _self._unloadHooks);\n                    _distributedTraceCtx = createDistributedTraceContextFromTrace(_self.context[_DYN_TELEMETRY_TRACE ], _previousTraceCtx);\n                    core.setTraceCtx(_distributedTraceCtx);\n                    _self.context.appId = function () {\n                        var breezeChannel = core.getPlugin(BreezeChannelIdentifier);\n                        return breezeChannel ? breezeChannel.plugin[\"_appId\"] : null;\n                    };\n                }\n                function _processTelemetryInternal(evt, itemCtx) {\n                    getSetValue(evt, \"tags\", []);\n                    getSetValue(evt, \"ext\", {});\n                    var ctx = _self.context;\n                    ctx[_DYN_APPLY_SESSION_CONTEX0 ](evt, itemCtx);\n                    ctx[_DYN_APPLY_APPLICATION_CO1 ](evt, itemCtx);\n                    ctx[_DYN_APPLY_DEVICE_CONTEXT ](evt, itemCtx);\n                    ctx[_DYN_APPLY_OPERATION_CONT2 ](evt, itemCtx);\n                    ctx[_DYN_APPLY_USER_CONTEXT ](evt, itemCtx);\n                    ctx[_DYN_APPLY_OPERATING_SYST3 ](evt, itemCtx);\n                    ctx.applyWebContext(evt, itemCtx);\n                    ctx[_DYN_APPLY_LOCATION_CONTE4 ](evt, itemCtx);\n                    ctx[_DYN_APPLY_INTERNAL_CONTE5 ](evt, itemCtx);\n                    ctx.cleanUp(evt, itemCtx);\n                }\n            });\n            return _this;\n        }\n        PropertiesPlugin.__ieDyn=1;\n        return PropertiesPlugin;\n    }(BaseTelemetryPlugin));\n    var PropertiesPlugin$1 = PropertiesPlugin;\n\n    var _AUTHENTICATED_USER_CONTEXT = \"AuthenticatedUserContext\";\n    var _TRACK = \"track\";\n    var STR_SNIPPET = \"snippet\";\n    var STR_GET_COOKIE_MGR = \"getCookieMgr\";\n    var STR_START_TRACK_PAGE = \"startTrackPage\";\n    var STR_STOP_TRACK_PAGE = \"stopTrackPage\";\n    var STR_FLUSH = \"flush\";\n    var STR_START_TRACK_EVENT = \"startTrackEvent\";\n    var STR_STOP_TRACK_EVENT = \"stopTrackEvent\";\n    var STR_ADD_TELEMETRY_INITIALIZER = \"addTelemetryInitializer\";\n    var STR_POLL_INTERNAL_LOGS = \"pollInternalLogs\";\n    var STR_GET_PLUGIN = \"getPlugin\";\n    var STR_EVT_NAMESPACE = \"evtNamespace\";\n    var STR_TRACK_EVENT = _TRACK + \"Event\";\n    var STR_TRACK_TRACE = _TRACK + \"Trace\";\n    var STR_TRACK_METRIC = _TRACK + \"Metric\";\n    var STR_TRACK_PAGE_VIEW = _TRACK + \"PageView\";\n    var STR_TRACK_EXCEPTION = _TRACK + \"Exception\";\n    var STR_TRACK_DEPENDENCY_DATA = _TRACK + \"DependencyData\";\n    var STR_SET_AUTHENTICATED_USER_CONTEXT = \"set\" + _AUTHENTICATED_USER_CONTEXT;\n    var STR_CLEAR_AUTHENTICATED_USER_CONTEXT = \"clear\" + _AUTHENTICATED_USER_CONTEXT;\n\n    var _DYN_VERSION = \"version\";\n    var _DYN_QUEUE = \"queue\";\n    var _DYN_CONNECTION_STRING = \"connectionString\";\n    var _DYN_ENDPOINT_URL = \"endpointUrl\";\n    var _DYN_INSTRUMENTATION_KEY = \"instrumentationKey\";\n    var _DYN_DISABLE_IKEY_DEPRECA0 = \"disableIkeyDeprecationMessage\";\n    var _DYN_ONUNLOAD_FLUSH = \"onunloadFlush\";\n    var _DYN_CONTEXT = \"context\";\n    var _DYN_ADD_HOUSEKEEPING_BEF1 = \"addHousekeepingBeforeUnload\";\n    var _DYN_UPDATE_SNIPPET_DEFIN2 = \"updateSnippetDefinitions\";\n\n    var _a;\n    var _internalSdkSrc;\n    var _ignoreUpdateSnippetProperties = [\n        STR_SNIPPET, \"dependencies\", \"properties\", \"_snippetVersion\", \"appInsightsNew\", \"getSKUDefaults\"\n    ];\n    var UNDEFINED_VALUE = undefined;\n    var defaultConfigValues = (_a = {},\n        _a[_DYN_CONNECTION_STRING ] = UNDEFINED_VALUE,\n        _a[_DYN_ENDPOINT_URL ] = UNDEFINED_VALUE,\n        _a[_DYN_INSTRUMENTATION_KEY ] = UNDEFINED_VALUE,\n        _a.diagnosticLogInterval = cfgDfValidate(_chkDiagLevel, 10000),\n        _a);\n    function _chkDiagLevel(value) {\n        return value && value > 0;\n    }\n    var AppInsightsSku = /** @class */ (function () {\n        function AppInsightsSku(snippet) {\n            var _this = this;\n            var dependencies;\n            var properties;\n            var _sender;\n            var _snippetVersion;\n            var _evtNamespace;\n            var _houseKeepingNamespace;\n            var _core;\n            var _config;\n            var _analyticsPlugin;\n            dynamicProto(AppInsightsSku, this, function (_self) {\n                _initDefaults();\n                objDefine(_self, \"config\", {\n                    g: function () {\n                        return _config;\n                    }\n                });\n                arrForEach([\"pluginVersionStringArr\", \"pluginVersionString\"], function (key) {\n                    objDefine(_self, key, {\n                        g: function () {\n                            if (_core) {\n                                return _core[key];\n                            }\n                            return null;\n                        }\n                    });\n                });\n                _snippetVersion = \"\" + (snippet.sv || snippet[_DYN_VERSION ] || \"\");\n                snippet[_DYN_QUEUE ] = snippet[_DYN_QUEUE ] || [];\n                snippet[_DYN_VERSION ] = snippet[_DYN_VERSION ] || 2.0;\n                var cfgHandler = createDynamicConfig(snippet.config || {}, defaultConfigValues);\n                _config = cfgHandler.cfg;\n                _analyticsPlugin = new AnalyticsPlugin();\n                objDefine(_self, \"appInsights\", {\n                    g: function () {\n                        return _analyticsPlugin;\n                    }\n                });\n                properties = new PropertiesPlugin$1();\n                dependencies = new AjaxMonitor();\n                _sender = new Sender();\n                _core = new AppInsightsCore();\n                objDefine(_self, \"core\", {\n                    g: function () {\n                        return _core;\n                    }\n                });\n                _addUnloadHook(onConfigChange(cfgHandler, function () {\n                    if (_config[_DYN_CONNECTION_STRING ]) {\n                        var cs = parseConnectionString(_config[_DYN_CONNECTION_STRING ]);\n                        var ingest = cs.ingestionendpoint;\n                        _config[_DYN_ENDPOINT_URL ] = ingest ? (ingest + DEFAULT_BREEZE_PATH) : _config[_DYN_ENDPOINT_URL ];\n                        _config[_DYN_INSTRUMENTATION_KEY ] = cs.instrumentationkey || _config[_DYN_INSTRUMENTATION_KEY ];\n                    }\n                }));\n                var isErrMessageDisabled = isNullOrUndefined(_config[_DYN_DISABLE_IKEY_DEPRECA0 ]) ? true : _config[_DYN_DISABLE_IKEY_DEPRECA0 ];\n                if (!_config[_DYN_CONNECTION_STRING ] && !isErrMessageDisabled) {\n                    _throwInternal(_core.logger, 1 , 106 , \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\");\n                }\n                _self[STR_SNIPPET ] = snippet;\n                _self[STR_FLUSH ] = function (async, callBack) {\n                    if (async === void 0) { async = true; }\n                    var result;\n                    doPerf(_core, function () { return \"AISKU.flush\"; }, function () {\n                        if (async && !callBack) {\n                            result = createPromise(function (resolve) {\n                                callBack = resolve;\n                            });\n                        }\n                        var waiting = 1;\n                        var flushDone = function () {\n                            waiting--;\n                            if (waiting === 0) {\n                                callBack();\n                            }\n                        };\n                        arrForEach(_core.getChannels(), function (channel) {\n                            if (channel) {\n                                waiting++;\n                                channel[STR_FLUSH ](async, flushDone);\n                            }\n                        });\n                        flushDone();\n                    }, null, async);\n                    return result;\n                };\n                _self[_DYN_ONUNLOAD_FLUSH ] = function (async) {\n                    if (async === void 0) { async = true; }\n                    arrForEach(_core.getChannels(), function (channel) {\n                        if (channel[_DYN_ONUNLOAD_FLUSH ]) {\n                            channel[_DYN_ONUNLOAD_FLUSH ]();\n                        }\n                        else {\n                            channel[STR_FLUSH ](async);\n                        }\n                    });\n                };\n                _self.loadAppInsights = function (legacyMode, logger, notificationManager) {\n                    if (legacyMode === void 0) { legacyMode = false; }\n                    if (legacyMode) {\n                        throwUnsupported(\"Legacy Mode is no longer supported\");\n                    }\n                    function _updateSnippetProperties(snippet) {\n                        if (snippet) {\n                            var snippetVer = \"\";\n                            if (!isNullOrUndefined(_snippetVersion)) {\n                                snippetVer += _snippetVersion;\n                            }\n                            if (_self[_DYN_CONTEXT ] && _self[_DYN_CONTEXT ].internal) {\n                                _self[_DYN_CONTEXT ].internal.snippetVer = snippetVer || \"-\";\n                            }\n                            objForEachKey(_self, function (field, value) {\n                                if (isString(field) &&\n                                    !isFunction(value) &&\n                                    field && field[0] !== \"_\" &&\n                                    arrIndexOf(_ignoreUpdateSnippetProperties, field) === -1) {\n                                    if (snippet[field] !== value) {\n                                        snippet[field] = value;\n                                    }\n                                }\n                            });\n                        }\n                    }\n                    doPerf(_self.core, function () { return \"AISKU.loadAppInsights\"; }, function () {\n                        _core.initialize(_config, [_sender, properties, dependencies, _analyticsPlugin], logger, notificationManager);\n                        objDefine(_self, \"context\", {\n                            g: function () { return properties[_DYN_CONTEXT ]; }\n                        });\n                        var sdkSrc = _findSdkSourceFile();\n                        if (sdkSrc && _self[_DYN_CONTEXT ]) {\n                            _self[_DYN_CONTEXT ].internal.sdkSrc = sdkSrc;\n                        }\n                        _updateSnippetProperties(_self[STR_SNIPPET ]);\n                        _self.emptyQueue();\n                        _self[STR_POLL_INTERNAL_LOGS ]();\n                        _self[_DYN_ADD_HOUSEKEEPING_BEF1 ](_self);\n                    });\n                    return _self;\n                };\n                _self[_DYN_UPDATE_SNIPPET_DEFIN2 ] = function (snippet) {\n                    proxyAssign(snippet, _self, function (name) {\n                        return name && arrIndexOf(_ignoreUpdateSnippetProperties, name) === -1;\n                    });\n                };\n                _self.emptyQueue = function () {\n                    try {\n                        if (isArray(_self.snippet[_DYN_QUEUE ])) {\n                            var length_1 = _self.snippet[_DYN_QUEUE ].length;\n                            for (var i = 0; i < length_1; i++) {\n                                var call = _self.snippet[_DYN_QUEUE ][i];\n                                call();\n                            }\n                            _self.snippet[_DYN_QUEUE ] = undefined;\n                            delete _self.snippet[_DYN_QUEUE ];\n                        }\n                    }\n                    catch (exception) {\n                        var properties_1 = {};\n                        if (exception && isFunction(exception.toString)) {\n                            properties_1.exception = exception.toString();\n                        }\n                    }\n                };\n                _self[_DYN_ADD_HOUSEKEEPING_BEF1 ] = function (appInsightsInstance) {\n                    if (hasWindow() || hasDocument()) {\n                        var performHousekeeping_1 = function () {\n                            appInsightsInstance[_DYN_ONUNLOAD_FLUSH ](false);\n                            if (isFunction(_self.core[STR_GET_PLUGIN ])) {\n                                var loadedPlugin = _this.core[STR_GET_PLUGIN ](PropertiesPluginIdentifier);\n                                if (loadedPlugin) {\n                                    var propertiesPlugin = loadedPlugin.plugin;\n                                    if (propertiesPlugin && propertiesPlugin[_DYN_CONTEXT ] && propertiesPlugin[_DYN_CONTEXT ]._sessionManager) {\n                                        propertiesPlugin[_DYN_CONTEXT ]._sessionManager.backup();\n                                    }\n                                }\n                            }\n                        };\n                        var added_1 = false;\n                        if (!_houseKeepingNamespace) {\n                            _houseKeepingNamespace = mergeEvtNamespace(_evtNamespace, _core[STR_EVT_NAMESPACE ] && _core[STR_EVT_NAMESPACE ]());\n                        }\n                        _addUnloadHook(onConfigChange(_config, function (details) {\n                            var coreConfig = details.cfg;\n                            var analyticsPlugin = appInsightsInstance.appInsights;\n                            var ctx = createProcessTelemetryContext(null, coreConfig, analyticsPlugin.core);\n                            var extConfig = ctx.getExtCfg(analyticsPlugin.identifier || AnalyticsPluginIdentifier);\n                            _removePageEventHandlers();\n                            var excludePageUnloadEvents = coreConfig.disablePageUnloadEvents;\n                            if (!extConfig.disableFlushOnBeforeUnload) {\n                                if (addPageUnloadEventListener(performHousekeeping_1, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                                    added_1 = true;\n                                }\n                                if (addPageHideEventListener(performHousekeeping_1, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                                    added_1 = true;\n                                }\n                                if (!added_1 && !isReactNative()) {\n                                    _throwInternal(_core.logger, 1 , 19 , \"Could not add handler for beforeunload and pagehide\");\n                                }\n                            }\n                            if (!added_1 && !extConfig.disableFlushOnUnload) {\n                                addPageHideEventListener(performHousekeeping_1, excludePageUnloadEvents, _houseKeepingNamespace);\n                            }\n                        }));\n                    }\n                };\n                _self.getSender = function () {\n                    return _sender;\n                };\n                _self.unload = function (isAsync, unloadComplete, cbTimeout) {\n                    var unloadDone = false;\n                    var result;\n                    if (isAsync && !unloadComplete) {\n                        result = createPromise(function (resolve) {\n                            unloadComplete = resolve;\n                        });\n                    }\n                    function _unloadCallback(unloadState) {\n                        if (!unloadDone) {\n                            unloadDone = true;\n                            _initDefaults();\n                            unloadComplete && unloadComplete(unloadState);\n                        }\n                    }\n                    _self[_DYN_ONUNLOAD_FLUSH ](isAsync);\n                    _removePageEventHandlers();\n                    _core.unload && _core.unload(isAsync, _unloadCallback, cbTimeout);\n                    return result;\n                };\n                proxyFunctions(_self, _analyticsPlugin, [\n                    STR_GET_COOKIE_MGR,\n                    STR_TRACK_EVENT,\n                    STR_TRACK_PAGE_VIEW,\n                    \"trackPageViewPerformance\",\n                    STR_TRACK_EXCEPTION,\n                    \"_onerror\",\n                    STR_TRACK_TRACE,\n                    STR_TRACK_METRIC,\n                    STR_START_TRACK_PAGE,\n                    STR_STOP_TRACK_PAGE,\n                    STR_START_TRACK_EVENT,\n                    STR_STOP_TRACK_EVENT\n                ]);\n                proxyFunctions(_self, _getCurrentDependencies, [\n                    STR_TRACK_DEPENDENCY_DATA,\n                    \"addDependencyListener\",\n                    \"addDependencyInitializer\"\n                ]);\n                proxyFunctions(_self, _core, [\n                    STR_ADD_TELEMETRY_INITIALIZER,\n                    STR_POLL_INTERNAL_LOGS,\n                    \"stopPollingInternalLogs\",\n                    STR_GET_PLUGIN,\n                    \"addPlugin\",\n                    STR_EVT_NAMESPACE,\n                    \"addUnloadCb\",\n                    \"getTraceCtx\",\n                    \"updateCfg\",\n                    \"onCfgChange\"\n                ]);\n                proxyFunctions(_self, function () {\n                    var context = properties[_DYN_CONTEXT ];\n                    return context ? context.user : null;\n                }, [\n                    STR_SET_AUTHENTICATED_USER_CONTEXT,\n                    STR_CLEAR_AUTHENTICATED_USER_CONTEXT\n                ]);\n                function _getCurrentDependencies() {\n                    return dependencies;\n                }\n                function _initDefaults() {\n                    _evtNamespace = createUniqueNamespace(\"AISKU\");\n                    _houseKeepingNamespace = null;\n                    dependencies = null;\n                    properties = null;\n                    _sender = null;\n                    _snippetVersion = null;\n                }\n                function _removePageEventHandlers() {\n                    if (_houseKeepingNamespace) {\n                        removePageUnloadEventListener(null, _houseKeepingNamespace);\n                        removePageHideEventListener(null, _houseKeepingNamespace);\n                    }\n                }\n                function _addUnloadHook(hooks) {\n                    _core.addUnloadHook(hooks);\n                }\n            });\n        }\n        AppInsightsSku.prototype.addDependencyInitializer = function (dependencyInitializer) {\n            return null;\n        };\n        return AppInsightsSku;\n    }());\n    function _findSdkSourceFile() {\n        if (_internalSdkSrc) {\n            return _internalSdkSrc;\n        }\n        var sdkSrc = null;\n        var cdns = [\n            \"://js.monitor.azure.com/\",\n            \"://az416426.vo.msecnd.net/\"\n        ];\n        try {\n            var scrpt = (document || {}).currentScript;\n            if (scrpt) {\n                sdkSrc = scrpt.src;\n            }\n        }\n        catch (e) {\n        }\n        if (sdkSrc) {\n            try {\n                var url_1 = sdkSrc.toLowerCase();\n                if (url_1) {\n                    var src_1 = \"\";\n                    arrForEach(cdns, function (value, idx) {\n                        if (strIndexOf(url_1, value) !== -1) {\n                            src_1 = \"cdn\" + (idx + 1);\n                            if (strIndexOf(url_1, \"/scripts/\") === -1) {\n                                if (strIndexOf(url_1, \"/next/\") !== -1) {\n                                    src_1 += \"-next\";\n                                }\n                                else if (strIndexOf(url_1, \"/beta/\") !== -1) {\n                                    src_1 += \"-beta\";\n                                }\n                            }\n                            _internalSdkSrc = src_1 + (\"\");\n                            return -1;\n                        }\n                    });\n                }\n            }\n            catch (e) {\n            }\n            _internalSdkSrc = sdkSrc;\n        }\n        return _internalSdkSrc;\n    }\n\n    var detailsContainerId = \"details-container\";\n    var detailsWatchList = [\"baseType\", \"name\", \"time\", \"properties\"];\n    var ajaxDetails = [\"disabbleFetchTracking\", \"disableExceptionTracking\", \"enableAutoRouteTracking\"];\n    var analyticsDetails = [\"autoTrackPageVisitTime\", \"appId\", \"enableAjaxPerfTracking\", \"enableCorsCorrelation\"];\n    var configDetails = __spreadArrayFn(__spreadArrayFn([\"connectionString\"], ajaxDetails, true), analyticsDetails);\n    var buttonSectionId = \"button-section\";\n    var configContainerId = \"config-details\";\n    var containerId = \"aisku-container\";\n    var ai_session = \"ai_session\";\n    var ai_user = \"ai_user\";\n    var manual_event = \"manual_record_event\";\n    var cookieWatchList = [\"isEnabled\", ai_session, ai_user];\n    function randomBoolean() {\n        if (Math.random() > 0.5) {\n            return true;\n        }\n        return false;\n    }\n    function clearEle(id) {\n        var ele = document.getElementById(id);\n        if (ele) {\n            ele.innerHTML = \"\";\n        }\n    }\n    function clearDetailsList() {\n        clearEle(detailsContainerId);\n    }\n    function createSubContainer(id, className) {\n        var ele = document.createElement(\"div\");\n        ele.className = className || \"container-main\";\n        ele.id = id;\n        return ele;\n    }\n    function createButton(buttontextContent, buttobuttononclickFn, id) {\n        var btn = document.createElement(\"button\");\n        if (id) {\n            btn.id = id;\n        }\n        btn.innerHTML = buttontextContent;\n        btn.onclick = buttobuttononclickFn;\n        return btn;\n    }\n    function generateNewConfig() {\n        var prefix = Math.random().toString(36).slice(6);\n        var newConfig = {\n            connectionString: \"InstrumentationKey=newKey\".concat(prefix),\n            extensionConfig: {\n                ApplicationInsightsAnalytics: {\n                    autoTrackPageVisitTime: randomBoolean(),\n                    appId: Math.random().toString(36).slice(8),\n                    enableAjaxPerfTracking: randomBoolean(),\n                    enableCorsCorrelation: randomBoolean()\n                },\n                AjaxDependencyPlugin: {\n                    disabbleFetchTracking: randomBoolean(),\n                    disableExceptionTracking: randomBoolean(),\n                    enableAutoRouteTracking: randomBoolean()\n                }\n            }\n        };\n        return newConfig;\n    }\n    function createDetailList(propsToWatch, details, id, title) {\n        var container = document.getElementById(id);\n        var ele = document.createElement(\"div\");\n        ele.className = \"list\";\n        var list = \"\";\n        if (details) {\n            list += \"\\n            <h6>\".concat(title, \" Details</h6>\\n            <p>Not all auto-captured events and details are displayed here.</p>\\n            <p>Check console and network trace for complete details</p>\\n        \");\n            arrForEach(propsToWatch, function (prop) {\n                var obj;\n                if (details[\"baseData\"]) {\n                    obj = details[\"baseData\"][prop] || details[prop] || details[\"baseData\"];\n                }\n                else {\n                    obj = details[prop] || details[\"baseData\"];\n                }\n                if (arrIncludes(analyticsDetails, prop)) {\n                    obj = details[\"extensionConfig\"][\"ApplicationInsightsAnalytics\"][prop];\n                }\n                if (arrIncludes(ajaxDetails, prop)) {\n                    obj = details[\"extensionConfig\"][\"AjaxDependencyPlugin\"][prop];\n                }\n                if (prop === \"item\") {\n                    obj = { name: obj.name, target: obj.target };\n                }\n                obj = (obj === undefined) ? \"undefined\" : obj;\n                if (typeof obj === \"object\") {\n                    obj = JSON.stringify(obj);\n                }\n                list += \"<li>\".concat(prop, \": \").concat(obj, \"</li>\");\n            });\n            list += \"<div>-------------------------</div>\";\n            ele.innerHTML = list;\n            container === null || container === void 0 ? void 0 : container.appendChild(ele);\n        }\n    }\n    function createContainers() {\n        var container = document.createElement(\"div\");\n        container.className = \"container\";\n        container.id = containerId;\n        var buttonSection = createSubContainer(buttonSectionId, \"container\");\n        container.appendChild(buttonSection);\n        var configSection = createSubContainer(configContainerId);\n        container.appendChild(configSection);\n        var detailsSection = createSubContainer(detailsContainerId);\n        container.appendChild(detailsSection);\n        document.body.append(container);\n    }\n    function triggerException() {\n        throw new Error(\"error is triggered\");\n    }\n\n    var _appInsights;\n    function initApplicationInsights(config) {\n        if (config === void 0) { config = {}; }\n        if (!_appInsights) {\n            _appInsights = window.appInsights;\n            return _appInsights;\n        }\n        _appInsights = new AppInsightsSku({\n            config: config\n        });\n        _appInsights.loadAppInsights();\n        _appInsights.trackPageView();\n        return _appInsights;\n    }\n    function trackPageView(pageView) {\n        if (_appInsights) {\n            _appInsights.trackPageView(pageView);\n            return true;\n        }\n        return false;\n    }\n    function trackEvent(event, customProperties) {\n        if (_appInsights) {\n            _appInsights.trackEvent(event, customProperties);\n            return true;\n        }\n        return false;\n    }\n    function startTrackEvent(name) {\n        if (_appInsights) {\n            _appInsights.startTrackEvent(name);\n            return true;\n        }\n        return false;\n    }\n    function stopTrackEvent(name, properties, measurements) {\n        if (_appInsights) {\n            _appInsights.stopTrackEvent(name, properties, measurements);\n            return true;\n        }\n        return false;\n    }\n    function trackTrace(trace) {\n        if (_appInsights) {\n            _appInsights.trackTrace(trace);\n            return true;\n        }\n        return false;\n    }\n    function trackMetric(metric, customProperties) {\n        if (_appInsights) {\n            _appInsights.trackMetric(metric, customProperties);\n            return true;\n        }\n        return false;\n    }\n    function addTelemetryInitializer(telemetryInitializer) {\n        if (_appInsights) {\n            _appInsights.addTelemetryInitializer(telemetryInitializer);\n            return true;\n        }\n        return false;\n    }\n    function getCookieMgr() {\n        if (_appInsights) {\n            return _appInsights.getCookieMgr();\n        }\n        return null;\n    }\n    function getConfig() {\n        if (_appInsights) {\n            var config = _appInsights[\"config\"];\n            console.log(\"current config\");\n            console.log(config);\n            return config;\n        }\n        return null;\n    }\n    function changeConfig() {\n        if (_appInsights) {\n            var newConfig = generateNewConfig();\n            _appInsights[\"config\"] = newConfig;\n            return true;\n        }\n        return false;\n    }\n    var pageviewItem = {\n        name: \"pageviewWithproperities\",\n        uri: \"https://pageview\",\n        refUri: \"https://sample\",\n        pageType: \"type\",\n        isLoggedIn: false,\n        properties: {\n            duration: 100,\n            prop: \"prop\",\n            prop1: { prop1: \"prop1\" }\n        },\n        measurements: {\n            metric: 1\n        }\n    };\n    var eventItem = {\n        name: \"eventWithproperities\",\n        properties: {\n            prop: { prop1: \"prop1\" }\n        },\n        measurements: {\n            metirc: 1\n        }\n    };\n    var traceItem = {\n        message: \"trace\",\n        severityLevel: 1,\n        properties: {\n            prop: { prop1: \"prop1\" }\n        },\n        measurements: {\n            metirc: 1\n        }\n    };\n    var metricItem = {\n        name: \"metric\",\n        average: 1.2,\n        sampleCount: 2,\n        min: 1,\n        max: 2,\n        stdDev: 1.23,\n        properties: {\n            prop: { prop1: \"prop1\" }\n        },\n        measurements: {\n            metirc: 1\n        }\n    };\n\n    function createPageviewTracks() {\n        trackPageView(pageviewItem);\n    }\n    function createEventTracks() {\n        trackEvent(eventItem, { prop2: \"prop2\" });\n    }\n    function startEvent() {\n        startTrackEvent(manual_event);\n    }\n    function stopEvent() {\n        stopTrackEvent(manual_event, { prop: \"prop\" }, { metric: 1 });\n    }\n    function createTraceTracks() {\n        trackTrace(traceItem);\n    }\n    function createMetricTracks() {\n        trackMetric(metricItem, { prop2: \"prop2\" });\n    }\n    function getCookieMgrdetails() {\n        var cookieMgr = getCookieMgr();\n        if (cookieMgr) {\n            var details = {\n                isEnabled: cookieMgr.isEnabled(),\n                ai_session: cookieMgr.get(ai_session),\n                ai_user: cookieMgr.get(ai_user)\n            };\n            createDetailList(cookieWatchList, details, detailsContainerId, \"Cookie\");\n        }\n    }\n    function addTelemetryListener() {\n        addTelemetryInitializer(function (env) {\n            console.log(\"The following Event is triggered.\");\n            console.log(env);\n            createDetailList(detailsWatchList, env, detailsContainerId, \"Telemetry\");\n        });\n    }\n    function createConfigDetails() {\n        var config = getConfig();\n        clearEle(configContainerId);\n        createDetailList(configDetails, config, configContainerId, \"Config\");\n    }\n    function changeConfigOnClick() {\n        changeConfig();\n        createConfigDetails();\n    }\n    function createButtonSection() {\n        var container = document.getElementById(buttonSectionId);\n        var changeConfigBtn = createButton(\"Change Config\", changeConfigOnClick);\n        var pageviewButton = createButton(\"Create Pageview\", createPageviewTracks);\n        var eventButton = createButton(\"Create Event\", createEventTracks);\n        var startButton = createButton(\"Start Tracking Event\", startEvent);\n        var stopButton = createButton(\"Stop Tracking Event\", stopEvent);\n        var traceButton = createButton(\"Create Trace\", createTraceTracks);\n        var metricButton = createButton(\"Create Metric\", createMetricTracks);\n        var exceptionButton = createButton(\"Create Exception\", triggerException);\n        var cookieButton = createButton(\"Get Cookie\", getCookieMgrdetails);\n        var clearButton = createButton(\"Clear Details\", clearDetailsList);\n        var buttons = [changeConfigBtn, pageviewButton, eventButton, traceButton, metricButton, startButton, stopButton, exceptionButton, cookieButton, clearButton];\n        buttons.forEach(function (ele) {\n            container === null || container === void 0 ? void 0 : container.appendChild(ele);\n        });\n    }\n    function analyticsSample() {\n        initApplicationInsights();\n        createContainers();\n        addTelemetryListener();\n        createButtonSection();\n        createConfigDetails();\n    }\n    analyticsSample();\n\n})();\n//# sourceMappingURL=aisku-example-index.gbl.js.map\n"
  },
  {
    "path": "AISKU/Tests/Manual/latestSnippet.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Home Page - HelloWorld</title>\n</head>\n<body>\n    <header>\n        <nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\">\n            <div class=\"container\">\n                <h1 class=\"display-4\">Welcome</h1>\n            </div>\n        </nav>\n    </header>\n    <div class=\"container\">\n        <main role=\"main\" class=\"pb-3\">\n            \n<div class=\"text-center\">\n    From your repository<br/>\n    Perform a full build <code>rush rebuild</code><br/>\n    Enable the test http server <code>npm run serve</code><br />\n    <a href=\"http://localhost:9001/AISKU/Tests/Manual/latestSnippet.html\">Load this page from the local service</a>\n    <ul>\n        <li>Load in different browsers and ensure that the events are attempted to be sent</li>\n        <li>Use different browsers, Firefox, Chrome and Edge</li>\n        <li>Using Edge enable IE Mode</li>\n        <div>\n            Use IEChooser to debug and change the Emulation mode\n            <ul>\n                <li>Default IE 11</li>\n                <li>Default IE 10</li>\n                <li>Default IE 9</li>\n                <li>Default IE 8</li>\n                <li>Default IE 7 - This will fail due to no JSON implementation, the console should show a warning</li>\n            </ul>\n\n        </div>\n    </ul>\n</div>\n\n<script>\n    // Latest Snippet\n    !(function (cfg){var k,x,D,E,L,C,b,U,O,A,e,t=\"track\",n=\"TrackPage\",i=\"TrackEvent\",I=[t+\"Event\",t+\"Exception\",t+\"PageView\",t+\"PageViewPerformance\",\"addTelemetryInitializer\",t+\"Trace\",t+\"DependencyData\",t+\"Metric\",\"start\"+n,\"stop\"+n,\"start\"+i,\"stop\"+i,\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"];function a(){cfg.onInit&&cfg.onInit(e)}k=window,x=document,D=k.location,E=\"script\",L=\"ingestionendpoint\",C=\"disableExceptionTracking\",b=\"crossOrigin\",U=\"POST\",O=cfg.pn||\"aiPolicy\",t=\"appInsightsSDK\",A=cfg.name||\"appInsights\",(cfg.name||k[t])&&(k[t]=A),e=k[A]||function(u){var n=u.url||cfg.src,s=!1,p=!1,l={initialize:!0,queue:[],sv:\"9\",config:u,version:2,extensions:void 0};function d(e){var t,n,i,a,r,o,c,s;!0!==cfg.dle&&(o=(t=function(){var e,t={},n=u.connectionString;if(\"string\"==typeof n&&n)for(var i=n.split(\";\"),a=0;a<i.length;a++){var r=i[a].split(\"=\");2===r.length&&(t[r[0].toLowerCase()]=r[1])}return t[L]||(e=(n=t.endpointsuffix)?t.location:null,t[L]=\"https://\"+(e?e+\".\":\"\")+\"dc.\"+(n||\"services.visualstudio.com\")),t}()).instrumentationkey||u.instrumentationKey||\"\",t=(t=(t=t[L])&&\"/\"===t.slice(-1)?t.slice(0,-1):t)?t+\"/v2/track\":u.endpointUrl,t=u.userOverrideEndpointUrl||t,(n=[]).push((i=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=e,c=t,(s=(r=f(o,\"Exception\")).data).baseType=\"ExceptionData\",s.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:i.replace(/\\./g,\"-\"),hasFullStack:!1,stack:i+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(D&&D.pathname||\"_unknown_\")+\"\\nEndpoint: \"+c,parsedStack:[]}],r)),n.push((s=e,i=t,(c=(a=f(o,\"Message\")).data).baseType=\"MessageData\",(r=c.baseData).message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+s+\")\").replace(/\\\"/g,\"\")+'\"',r.properties={endpoint:i},a)),e=n,o=t,JSON&&((c=k.fetch)&&!cfg.useXhr?c(o,{method:U,body:JSON.stringify(e),mode:\"cors\"}):XMLHttpRequest&&((s=new XMLHttpRequest).open(U,o),s.setRequestHeader(\"Content-type\",\"application/json\"),s.send(JSON.stringify(e)))))}function f(e,t){return e=e,t=t,i=l.sv,a=l.version,r=D,(o={})[\"ai.device.\"+\"id\"]=\"browser\",o[\"ai.device.type\"]=\"Browser\",o[\"ai.operation.name\"]=r&&r.pathname||\"_unknown_\",o[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(i||a),{time:(r=new Date).getUTCFullYear()+\"-\"+n(1+r.getUTCMonth())+\"-\"+n(r.getUTCDate())+\"T\"+n(r.getUTCHours())+\":\"+n(r.getUTCMinutes())+\":\"+n(r.getUTCSeconds())+\".\"+(r.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+\"Z\",iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:o,data:{baseData:{ver:2}},ver:undefined,seq:\"1\",aiDataContract:undefined};function n(e){e=\"\"+e;return 1===e.length?\"0\"+e:e}var i,a,r,o}var i,a,t,r,g=-1,h=0,m=[\"js.monitor.azure.com\",\"js.cdn.applicationinsights.io\",\"js.cdn.monitor.azure.com\",\"js0.cdn.applicationinsights.io\",\"js0.cdn.monitor.azure.com\",\"js2.cdn.applicationinsights.io\",\"js2.cdn.monitor.azure.com\",\"az416426.vo.msecnd.net\"],o=function(){return c(n,null)};function c(t,r){if((n=navigator)&&(~(n=(n.userAgent||\"\").toLowerCase()).indexOf(\"msie\")||~n.indexOf(\"trident/\"))&&~t.indexOf(\"ai.3\")&&(t=t.replace(/(\\/)(ai\\.3\\.)([^\\d]*)$/,function(e,t,n){return t+\"ai.2\"+n})),!1!==cfg.cr)for(var e=0;e<m.length;e++)if(0<t.indexOf(m[e])){g=e;break}var n,o=function(e){var a;l.queue=[],p||(0<=g&&h+1<m.length?(a=(g+h+1)%m.length,i(t.replace(/^(.*\\/\\/)([\\w\\.]*)(\\/.*)$/,function(e,t,n,i){return t+m[a]+i})),h+=1):(s=p=!0,d(t)))},c=function(e,t){p||setTimeout(function(){t&&!l.core&&o()},500),s=!1},i=function(e){var n,i=x.createElement(E),e=(cfg.pl?cfg.ttp&&cfg.ttp.createScript?i.src=cfg.ttp.createScriptURL(e):i.src=(null==(n=window.trustedTypes)?void 0:n.createPolicy(O,{createScriptURL:function(e){try{var t=new URL(e);if(t.host&&\"js.monitor.azure.com\"===t.host)return e;a(e)}catch(n){a(e)}}})).createScriptURL(e):i.src=e,cfg.nt&&i.setAttribute(\"nonce\",cfg.nt),r&&(i.integrity=r),i.setAttribute(\"data-ai-name\",A),cfg[b]);function a(e){d(\"AI policy blocked URL: \"+e)}return!e&&\"\"!==e||\"undefined\"==i[b]||(i[b]=e),i.onload=c,i.onerror=o,i.onreadystatechange=function(e,t){\"loaded\"!==i.readyState&&\"complete\"!==i.readyState||c(0,t)},cfg.ld&&cfg.ld<0?x.getElementsByTagName(\"head\")[0].appendChild(i):setTimeout(function(){x.getElementsByTagName(E)[0].parentNode.appendChild(i)},cfg.ld||0),i};i(t)}cfg.sri&&(i=n.match(/^((http[s]?:\\/\\/.*\\/)\\w+(\\.\\d+){1,5})\\.(([\\w]+\\.){0,2}js)$/))&&6===i.length?(T=\"\".concat(i[1],\".integrity.json\"),a=\"@\".concat(i[4]),S=window.fetch,t=function(e){if(!e.ext||!e.ext[a]||!e.ext[a].file)throw Error(\"Error Loading JSON response\");var t=e.ext[a].integrity||null;c(n=i[2]+e.ext[a].file,t)},S&&!cfg.useXhr?S(T,{method:\"GET\",mode:\"cors\"}).then(function(e){return e.json()[\"catch\"](function(){return{}})}).then(t)[\"catch\"](o):XMLHttpRequest&&((r=new XMLHttpRequest).open(\"GET\",T),r.onreadystatechange=function(){if(r.readyState===XMLHttpRequest.DONE)if(200===r.status)try{t(JSON.parse(r.responseText))}catch(e){o()}else o()},r.send())):n&&o();try{l.cookie=x.cookie}catch(w){}function e(e){for(;e.length;)!function(t){l[t]=function(){var e=arguments;s||l.queue.push(function(){l[t].apply(l,e)})}}(e.pop())}e(I);var v,y,S=!(l.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4}),T=(u.extensionConfig||{}).ApplicationInsightsAnalytics||{};return(S=!0!==u[C]&&!0!==T[C]||S)&&(e([\"_\"+(v=\"onerror\")]),y=k[v],k[v]=function(e,t,n,i,a){var r=y&&y(e,t,n,i,a);return!0!==r&&l[\"_\"+v]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:k.event}),r},u.autoExceptionInstrumented=!0),l}(cfg.cfg),(k[A]=e).queue&&0===e.queue.length?(e.queue.push(a),e.trackPageView({})):a();\n    })(\n    {\n        \"src\":\"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n        \"crossOrigin\":\"anonymous\",\n        \"cfg\":\n            {\n                \"connectionString\":\"InstrumentationKey=2bd72339-a683-4cce-8ed7-b1b0e8700000;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\"\n            },\n        \"name\":\"appInsights\"\n    }\n    );\n    //# sourceMappingURL=snippet.min.js.map\n</script>\n\n        </main>\n    </div>\n\n    <footer class=\"border-top footer text-muted\">\n        <div class=\"container\">\n            &copy; 2019 - HelloWorld\n        </div>\n    </footer>\n    \n</body>\n</html>"
  },
  {
    "path": "AISKU/Tests/Manual/span-e2e-manual-test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Application Insights - Span API Manual E2E Test</title>\n    <style>\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n            max-width: 1200px;\n            margin: 0 auto;\n            padding: 20px;\n            background-color: #f5f5f5;\n        }\n        .header {\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            padding: 30px;\n            border-radius: 8px;\n            margin-bottom: 30px;\n        }\n        .config-section {\n            background: white;\n            padding: 20px;\n            border-radius: 8px;\n            margin-bottom: 20px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        .test-section {\n            background: white;\n            padding: 20px;\n            border-radius: 8px;\n            margin-bottom: 20px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        .test-button {\n            background: #667eea;\n            color: white;\n            border: none;\n            padding: 12px 24px;\n            border-radius: 6px;\n            cursor: pointer;\n            font-size: 14px;\n            margin: 5px;\n            transition: background 0.3s;\n        }\n        .test-button:hover {\n            background: #5568d3;\n        }\n        .test-button:disabled {\n            background: #ccc;\n            cursor: not-allowed;\n        }\n        .output {\n            background: #1e1e1e;\n            color: #d4d4d4;\n            padding: 15px;\n            border-radius: 6px;\n            font-family: 'Courier New', monospace;\n            font-size: 13px;\n            max-height: 400px;\n            overflow-y: auto;\n            margin-top: 15px;\n        }\n        .output .success { color: #4ec9b0; }\n        .output .error { color: #f48771; }\n        .output .warning { color: #dcdcaa; }\n        .output .info { color: #569cd6; }\n        input[type=\"text\"] {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 14px;\n            box-sizing: border-box;\n        }\n        label {\n            display: block;\n            margin-bottom: 5px;\n            font-weight: 500;\n            color: #333;\n        }\n        .help-text {\n            font-size: 12px;\n            color: #666;\n            margin-top: 5px;\n        }\n        .portal-link {\n            display: inline-block;\n            margin-top: 15px;\n            padding: 10px 20px;\n            background: #0078d4;\n            color: white;\n            text-decoration: none;\n            border-radius: 4px;\n            font-size: 14px;\n        }\n        .portal-link:hover {\n            background: #106ebe;\n        }\n        .status-indicator {\n            display: inline-block;\n            width: 10px;\n            height: 10px;\n            border-radius: 50%;\n            margin-right: 8px;\n        }\n        .status-ready { background: #10b981; }\n        .status-waiting { background: #f59e0b; }\n        .stats {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 15px;\n            margin-top: 15px;\n        }\n        .stat-card {\n            background: #f8f9fa;\n            padding: 15px;\n            border-radius: 6px;\n            border-left: 4px solid #667eea;\n        }\n        .stat-value {\n            font-size: 24px;\n            font-weight: bold;\n            color: #667eea;\n        }\n        .stat-label {\n            font-size: 12px;\n            color: #666;\n            margin-top: 5px;\n        }\n        .batch-actions-section {\n            padding: 15px;\n            border-radius: 6px;\n            margin: 10px 0;\n            transition: background-color 0.3s ease;\n        }\n        .batch-actions-section[data-status=\"not-run\"] {\n            background-color: #f3f4f6;\n            border: 2px solid #d1d5db;\n        }\n        .batch-actions-section[data-status=\"running\"] {\n            background-color: #fef3c7;\n            border: 2px solid #fbbf24;\n        }\n        .batch-actions-section[data-status=\"all-pass\"] {\n            background-color: #d1fae5;\n            border: 2px solid #10b981;\n        }\n        .batch-actions-section[data-status=\"has-failure\"] {\n            background-color: #fee2e2;\n            border: 2px solid #ef4444;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"header\">\n        <h1>🔍 Application Insights - Span API Manual E2E Test</h1>\n        <p>Send real telemetry to Azure Application Insights and verify in the portal</p>\n    </div>\n\n    <div class=\"config-section\">\n        <h2>⚙️ Configuration</h2>\n        <div style=\"margin-bottom: 15px;\">\n            <label for=\"instrumentationKey\">Instrumentation Key or Connection String:</label>\n            <input type=\"text\" id=\"instrumentationKey\" placeholder=\"Enter your instrumentation key or connection string\">\n            <p class=\"help-text\">\n                Get this from: Azure Portal → Your Application Insights resource → Overview → Instrumentation Key\n            </p>\n        </div>\n        <button class=\"test-button\" onclick=\"initializeSDK()\">Initialize SDK</button>\n        <div id=\"sdkStatus\" style=\"margin-top: 10px;\"></div>\n    </div>\n\n    <div class=\"test-section\">\n        <h2>🧪 Test Scenarios</h2>\n        \n        <h3>Basic Tests</h3>\n        <button class=\"test-button\" onclick=\"testBasicClientSpan()\" disabled id=\"btn-basic-client\">Basic CLIENT Span</button>\n        <button class=\"test-button\" onclick=\"testBasicServerSpan()\" disabled id=\"btn-basic-server\">Basic SERVER Span</button>\n        <button class=\"test-button\" onclick=\"testFailedSpan()\" disabled id=\"btn-failed\">Failed Span</button>\n\n        <h3>Distributed Trace Tests</h3>\n        <button class=\"test-button\" onclick=\"testParentChild()\" disabled id=\"btn-parent-child\">Parent-Child Trace</button>\n        <button class=\"test-button\" onclick=\"testNestedHierarchy()\" disabled id=\"btn-nested\">3-Level Nested Trace</button>\n\n        <h3>Dependency Tests</h3>\n        <button class=\"test-button\" onclick=\"testHttpDependency()\" disabled id=\"btn-http\">HTTP Dependencies</button>\n        <button class=\"test-button\" onclick=\"testDatabaseDependencies()\" disabled id=\"btn-db\">Database Dependencies</button>\n\n        <h3>Complex Scenarios</h3>\n        <button class=\"test-button\" onclick=\"testEcommerceCheckout()\" disabled id=\"btn-ecommerce\">E-commerce Checkout</button>\n        <button class=\"test-button\" onclick=\"testMixedResults()\" disabled id=\"btn-mixed\">Mixed Success/Failure</button>\n        <button class=\"test-button\" onclick=\"testRichProperties()\" disabled id=\"btn-rich\">Rich Custom Properties</button>\n\n        <h3>Batch Actions</h3>\n        <div id=\"batch-actions-container\" class=\"batch-actions-section\" data-status=\"not-run\">\n            <button class=\"test-button\" onclick=\"runAllTests()\" disabled id=\"btn-all\">Run All Tests</button>\n            <button class=\"test-button\" onclick=\"resetTestStatus()\">Reset Test Status</button>\n        </div>\n        \n        <h3>Utilities</h3>\n        <button class=\"test-button\" onclick=\"clearOutput()\">Clear Output</button>\n        <button class=\"test-button\" onclick=\"exportLogs()\">Export Logs</button>\n    </div>\n\n    <div class=\"test-section\">\n        <h2>📊 Statistics</h2>\n        <div class=\"stats\">\n            <div class=\"stat-card\">\n                <div class=\"stat-value\" id=\"stat-spans\">0</div>\n                <div class=\"stat-label\">Spans Created</div>\n            </div>\n            <div class=\"stat-card\">\n                <div class=\"stat-value\" id=\"stat-dependencies\">0</div>\n                <div class=\"stat-label\">Dependencies</div>\n            </div>\n            <div class=\"stat-card\">\n                <div class=\"stat-value\" id=\"stat-requests\">0</div>\n                <div class=\"stat-label\">Requests</div>\n            </div>\n            <div class=\"stat-card\">\n                <div class=\"stat-value\" id=\"stat-traces\">0</div>\n                <div class=\"stat-label\">Trace IDs</div>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"test-section\">\n        <h2>📝 Output Log</h2>\n        <div id=\"output\" class=\"output\">\n            <span class=\"info\">Ready to start testing. Initialize the SDK first.</span>\n        </div>\n    </div>\n\n    <div class=\"test-section\">\n        <h2>🔗 View Results</h2>\n        <p>After running tests, wait 1-2 minutes for telemetry to appear in the portal.</p>\n        <a href=\"https://portal.azure.com/#view/Microsoft_Azure_Monitoring/AzureMonitoringBrowseBlade/~/overview\" \n           target=\"_blank\" class=\"portal-link\">Open Azure Portal</a>\n        \n        <div style=\"margin-top: 20px; padding: 15px; background: #fff3cd; border-radius: 6px; border-left: 4px solid #ffc107;\">\n            <strong>💡 Tips for viewing in portal:</strong>\n            <ul style=\"margin: 10px 0; padding-left: 20px;\">\n                <li>Go to Application Insights → Performance to see requests and dependencies</li>\n                <li>Use the Search feature to find specific operations by custom properties</li>\n                <li>Click \"View in End-to-End Transaction\" to see distributed traces</li>\n                <li>Use the Timeline view to see span relationships</li>\n                <li>Filter by operation name like \"E2E-CheckoutRequest\"</li>\n                <li>Check custom dimensions for test.scenario and test.timestamp</li>\n            </ul>\n        </div>\n    </div>\n\n    <!-- Load Application Insights SDK -->\n    <script src=\"../../browser/es5/ai.3.js\"></script>\n    \n    <script>\n        let appInsights = null;\n        let stats = {\n            spans: 0,\n            dependencies: 0,\n            requests: 0,\n            traceIds: new Set()\n        };\n        let flushTimer = null;\n        let testResults = {\n            total: 0,\n            passed: 0,\n            failed: 0\n        };         \n\n        if (sessionStorage) {\n            let value = sessionStorage.getItem('AISKU_Test_InstrumentationKey');\n            if (value) {\n                document.getElementById('instrumentationKey').value = value;\n            }\n        }\n\n        function log(message, type = 'info') {\n            const output = document.getElementById('output');\n            const timestamp = new Date().toLocaleTimeString();\n            const className = type;\n            output.innerHTML += `<div class=\"${className}\">[${timestamp}] ${message}</div>`;\n            output.scrollTop = output.scrollHeight;\n        }\n\n        function updateBatchStatus() {\n            const container = document.getElementById('batch-actions-container');\n            if (!container) return;\n            \n            if (testResults.total === 0) {\n                container.setAttribute('data-status', 'not-run');\n            } else if (testResults.failed > 0) {\n                container.setAttribute('data-status', 'has-failure');\n            } else if (testResults.passed === testResults.total) {\n                container.setAttribute('data-status', 'all-pass');\n            } else {\n                container.setAttribute('data-status', 'running');\n            }\n        }\n\n        function recordTestResult(success) {\n            testResults.total++;\n            if (success) {\n                testResults.passed++;\n            } else {\n                testResults.failed++;\n            }\n            updateBatchStatus();\n        }\n\n        function resetTestStatus() {\n            testResults.total = 0;\n            testResults.passed = 0;\n            testResults.failed = 0;\n            updateBatchStatus();\n            log('🔄 Test status reset', 'info');\n        }\n        \n        function updateStats() {\n            document.getElementById('stat-spans').textContent = stats.spans;\n            document.getElementById('stat-dependencies').textContent = stats.dependencies;\n            document.getElementById('stat-requests').textContent = stats.requests;\n            document.getElementById('stat-traces').textContent = stats.traceIds.size;\n        }\n\n        function enableButtons() {\n            const buttons = document.querySelectorAll('.test-button');\n            buttons.forEach(btn => {\n                if (btn.id && btn.id.startsWith('btn-')) {\n                    btn.disabled = false;\n                }\n            });\n        }\n\n        function randomWait(cb, min = 100, max = 500) {\n            setTimeout(cb, Math.floor(Math.random() * (max - min + 1)) + min);\n        }\n\n        function scheduleFlush() {\n            if (flushTimer) {\n                clearTimeout(flushTimer);\n            }\n\n            flushTimer = setTimeout(() => {\n                flushTimer = null;\n                if (appInsights) {\n                    appInsights.flush();\n                }\n            }, 2500);\n        }\n\n        function initializeSDK() {\n            const keyOrConnectionString = document.getElementById('instrumentationKey').value.trim();\n            \n            if (!keyOrConnectionString) {\n                log('❌ Please enter an instrumentation key or connection string', 'error');\n                return;\n            }\n\n            if (sessionStorage) {\n                sessionStorage.setItem('AISKU_Test_InstrumentationKey', keyOrConnectionString);\n            }\n\n            try {\n                const config = keyOrConnectionString.includes('InstrumentationKey=') \n                    ? { connectionString: keyOrConnectionString }\n                    : { instrumentationKey: keyOrConnectionString };\n\n                appInsights = new Microsoft.ApplicationInsights.ApplicationInsights({\n                    config: {\n                        ...config,\n                        disableAjaxTracking: false,\n                        disableFetchTracking: false,\n                        enableAutoRouteTracking: false,\n                        maxBatchInterval: 2000,\n                        enableDebug: true,\n                        loggingLevelConsole: 2\n                    }\n                });\n\n                appInsights.loadAppInsights();\n                appInsights.trackPageView();\n                recordTestResult(true);\n\n                log('✅ SDK initialized successfully', 'success');\n                log(`📍 Instrumentation Key: ${keyOrConnectionString.substring(0, 20)}...`, 'info');\n                \n                const statusDiv = document.getElementById('sdkStatus');\n                statusDiv.innerHTML = '<span class=\"status-indicator status-ready\"></span>SDK Ready';\n                \n                enableButtons();\n            } catch (error) {\n                log(`❌ Failed to initialize SDK: ${error.message}`, 'error');\n            }\n        }\n\n        function testBasicClientSpan() {\n            if (!appInsights) return;\n            \n            const span = appInsights.startSpan('E2E-Manual-BasicClient', {\n                kind: 1, // CLIENT\n                attributes: {\n                    'test.scenario': 'basic-client',\n                    'test.timestamp': new Date().toISOString(),\n                    'test.source': 'manual-html'\n                }\n            });\n\n            randomWait(() => {\n                if (span) {\n                    span.setStatus({ code: 1 }); // OK\n                    span.end();\n                    stats.spans++;\n                    stats.dependencies++;\n                    updateStats();\n                    log('✅ Basic CLIENT span sent → Check Dependencies in portal', 'success');\n                }\n\n                scheduleFlush();\n            });\n        }\n\n        function testBasicServerSpan() {\n            if (!appInsights) return;\n            \n            const span = appInsights.startSpan('E2E-Manual-BasicServer', {\n                kind: 2, // SERVER\n                attributes: {\n                    'http.method': 'GET',\n                    'http.url': 'https://example.com/api/manual-test',\n                    'http.status_code': 200,\n                    'test.scenario': 'basic-server',\n                    'test.timestamp': new Date().toISOString()\n                }\n            });\n\n            randomWait(() => {\n                if (span) {\n                    span.setStatus({ code: 1 });\n                    span.end();\n                    stats.spans++;\n                    stats.requests++;\n                    const ctx = span.spanContext();\n                    if (ctx) stats.traceIds.add(ctx.traceId);\n                    recordTestResult(true);\n                    updateStats();\n                    log('✅ Basic SERVER span sent → Check Requests in portal', 'success');\n                }\n                \n                scheduleFlush();\n            });\n        }\n\n        function testFailedSpan() {\n            if (!appInsights) return;\n            \n            const span = appInsights.startSpan('E2E-Manual-Failed', {\n                kind: 1,\n                attributes: {\n                    'test.scenario': 'failure',\n                    'test.timestamp': new Date().toISOString()\n                }\n            });\n\n            randomWait(() => {\n                if (span) {\n                    span.setAttribute('error.type', 'TimeoutError');\n                    span.setStatus({ code: 2, message: 'Operation timed out' }); // ERROR\n                    span.end();\n                    stats.spans++;\n                    recordTestResult(true);\n                    stats.dependencies++;\n                    updateStats();\n                    log('✅ Failed span sent → Should show success=false', 'success');\n                }\n                \n                scheduleFlush();\n            });\n        }\n\n        function testParentChild() {\n            if (!appInsights) return;\n            \n            const parent = appInsights.startSpan('E2E-Manual-Parent', {\n                kind: 2,\n                attributes: { 'test.scenario': 'distributed-trace' }\n            });\n\n            const parentCtx = parent?.spanContext();\n            if (parentCtx) stats.traceIds.add(parentCtx.traceId);\n\n            randomWait(() => {\n                const child1 = appInsights.startSpan('E2E-Manual-Child1', {\n                    kind: 1,\n                    attributes: { 'child.index': 1 }\n                }, parentCtx);\n\n                randomWait(() => {\n                    const child2 = appInsights.startSpan('E2E-Manual-Child2', {\n                        kind: 1,\n                        attributes: { 'child.index': 2 }\n                    }, parentCtx);\n\n                    if (child1) { child1.setStatus({ code: 1 }); child1.end(); stats.spans++; stats.dependencies++; }\n\n                    randomWait(() => {\n                        if (child2) { child2.setStatus({ code: 1 }); child2.end(); stats.spans++; stats.dependencies++; }\n\n                        randomWait(() => {\n                            if (parent) { parent.setStatus({ code: 1 }); parent.end(); stats.spans++; stats.requests++; }\nrecordTestResult(true);\n                            \n                            updateStats();\n                            log(`✅ Parent-child trace sent (${parentCtx?.traceId?.substring(0, 16)}...) → Check End-to-End Transaction`, 'success');\n                \n                            scheduleFlush();\n                        });\n                    });\n                });\n            });\n        }\n\n        function testNestedHierarchy() {\n            if (!appInsights) return;\n            \n            const root = appInsights.startSpan('E2E-Manual-Root', {\n                kind: 2,        // CLIENT\n                attributes: { 'span.level': 1 }\n            });\n            const rootCtx = root?.spanContext();\n            if (rootCtx) stats.traceIds.add(rootCtx.traceId);\n\n            randomWait(() => {\n                const level2 = appInsights.startSpan('E2E-Manual-Level2', {\n                    kind: 0,        // INTERNAL\n                    attributes: { 'span.level': 2 }\n                }, rootCtx);\n                const level2Ctx = level2?.spanContext();\n\n                randomWait(() => {\n                    const level3 = appInsights.startSpan('E2E-Manual-Level3', {\n                        attributes: { 'span.level': 3 }\n                    }, level2Ctx);\n\n                    randomWait(() => {\n                        if (level3) { level3.setStatus({ code: 1 }); level3.end(); stats.spans++; stats.dependencies++; }\n\n                        randomWait(() => {\n                            if (level2) { level2.setStatus({ code: 1 }); level2.end(); stats.spans++; stats.dependencies++; }\n\n                            randomWait(() => {\n                                if (root) { root.setStatus({ code: 1 }); root.end(); stats.spans++; stats.requests++; }\nrecordTestResult(true);\n                                \n                                updateStats();\n                                log('✅ 3-level nested trace sent → Check transaction timeline', 'success');\n                \n                                scheduleFlush();\n                            });\n                        });\n                    });\n                });\n            });\n        }\n\n        function testHttpDependency() {\n            if (!appInsights) return;\n            \n            const methods = ['GET', 'POST', 'PUT', 'DELETE'];\n            const statusCodes = [200, 201, 400, 500];\n\n            methods.forEach((method, i) => {\n                const span = appInsights.startSpan(`E2E-Manual-HTTP-${method}`, {\n                    kind: 1,\n                    attributes: {\n                        'http.method': method,\n                        'http.url': `https://api.example.com/test/${method.toLowerCase()}`,\n                        'http.status_code': statusCodes[i]\n                    }\n                });\n\n                if (span) {\n                    span.setStatus({ code: statusCodes[i] < 400 ? 1 : 2 });\n                    span.end();\n                    stats.spans++;\n                    stats.dependencies++;\n                }\n            recordTestResult(true);\n            });\n\n            updateStats();\n            log(`✅ ${methods.length} HTTP dependencies sent → Check Dependencies with different methods`, 'success');\n                \n            scheduleFlush();\n        }\n\n        function testDatabaseDependencies() {\n            if (!appInsights) return;\n            \n            const databases = [\n                { system: 'mysql', statement: 'SELECT * FROM users' },\n                { system: 'postgresql', statement: 'INSERT INTO logs VALUES ($1)' },\n                { system: 'mongodb', statement: 'db.products.find({})' },\n                { system: 'redis', statement: 'GET user:123' }\n            ];\n\n            databases.forEach(db => {\n                const span = appInsights.startSpan(`E2E-Manual-DB-${db.system}`, {\n                    kind: 1,\n                    attributes: {\n                        'db.system': db.system,\n                        'db.statement': db.statement\n                    }\n                });\n\n                if (span) {\n                    span.setStatus({ code: 1 });\n                    span.end();\n                    stats.spans++;\n                    stats.dependencies++;\n                }\n            recordTestResult(true);\n            });\n\n            updateStats();\n            log(`✅ ${databases.length} database dependencies sent → Check Dependencies with SQL/NoSQL types`, 'success');\n                \n            scheduleFlush();\n        }\n\n        function testEcommerceCheckout() {\n            if (!appInsights) return;\n            \n            const checkout = appInsights.startSpan('E2E-Manual-Checkout', {\n                kind: 2,\n                attributes: {\n                    'test.scenario': 'ecommerce',\n                    'cart.items': 3,\n                    'cart.total': 299.97\n                }\n            });\n\n            const checkoutCtx = checkout?.spanContext();\n            if (checkoutCtx) stats.traceIds.add(checkoutCtx.traceId);\n\n            // Inventory check\n            const inventory = appInsights.startSpan('E2E-Manual-Inventory', {\n                kind: 1,\n                attributes: { 'http.url': 'https://inventory.example.com/check' }\n            }, checkoutCtx);\n\n            randomWait(() => {\n                if (inventory) { inventory.setStatus({ code: 1 }); inventory.end(); stats.spans++; stats.dependencies++; }\n\n                // Payment\n                const payment = appInsights.startSpan('E2E-Manual-Payment', {\n                    kind: 1,\n                    attributes: { \n                        'http.url': 'https://payments.example.com/charge',\n                        'payment.amount': 299.97\n                    }\n                }, checkoutCtx);\n\n                randomWait(() => {\n                    if (payment) { payment.setStatus({ code: 1 }); payment.end(); stats.spans++; stats.dependencies++; }\n\n                    // Database\n                    const db = appInsights.startSpan('E2E-Manual-CreateOrder', {\n                        kind: 1,\n                        attributes: { \n                            'db.system': 'postgresql',\n                            'db.statement': 'INSERT INTO orders...'\n                        }\n                    }, checkoutCtx);\n\n                    randomWait(() => {\n                        if (db) { db.setStatus({ code: 1 }); db.end(); stats.spans++; stats.dependencies++; }\n\n                        randomWait(() => {\n                            recordTestResult(true);\n                            if (checkout) { checkout.setStatus({ code: 1 }); checkout.end(); stats.spans++; stats.requests++; }\n\n                            updateStats();\n                            log(`✅ E-commerce checkout scenario sent (${checkoutCtx?.traceId?.substring(0, 16)}...) → Check complete flow`, 'success');\n                \n                            scheduleFlush();\n                        });\n                    });\n                });\n            });\n        }\n\n        function testMixedResults() {\n            if (!appInsights) return;\n            \n            const operation = appInsights.startSpan('E2E-Manual-MixedResults', {\n                kind: 2,\n                attributes: { 'test.scenario': 'mixed-results' }\n            });\n\n            const opCtx = operation?.spanContext();\n            if (opCtx) stats.traceIds.add(opCtx.traceId);\n\n            const success1 = appInsights.startSpan('E2E-Manual-Success1', {\n                kind: 1,\n                attributes: { 'http.status_code': 200 }\n            }, opCtx);\n            if (success1) { success1.setStatus({ code: 1 }); success1.end(); stats.spans++; stats.dependencies++; }\n\n            const failed = appInsights.startSpan('E2E-Manual-Failed', {\n                kind: 1,\n                attributes: { 'http.status_code': 500 }\n            }, opCtx);\n            if (failed) { failed.setStatus({ code: 2 }); failed.end(); stats.spans++; stats.dependencies++; }\n\n            const success2 = appInsights.startSpan('E2E-Manual-Success2', {\n                kind: 1,\n                attributes: { 'http.status_code': 200 }\n            }, opCtx);\n            if (success2) { success2.setStatus({ code: 1 }); success2.end(); stats.spans++; stats.dependencies++; }\nrecordTestResult(true);\n            \n            if (operation) { operation.setStatus({ code: 1 }); operation.end(); stats.spans++; stats.requests++; }\n\n            updateStats();\n            log('✅ Mixed success/failure sent → Check for 2 successful + 1 failed', 'success');\n            scheduleFlush();\n        }\n\n        function testRichProperties() {\n            if (!appInsights) return;\n            \n            const span = appInsights.startSpan('E2E-Manual-RichProperties', {\n                kind: 2,\n                attributes: {\n                    'test.scenario': 'rich-properties',\n                    'business.tenant': 'manual-test-corp',\n                    'business.region': 'us-west-2',\n                    'user.id': 'manual_user_123',\n                    'user.subscription': 'premium',\n                    'feature.new.ui': true,\n                    'performance.queries': 5,\n                    'metrics.items.processed': 42\n                }\n            });\n\n            if (span) {\n                span.setStatus({ code: 1 });\n                recordTestResult(true);\n                span.end();\n                stats.spans++;\n                stats.requests++;\n                updateStats();\n                log('✅ Span with rich properties sent → Use Search to filter by custom properties', 'success');\n            }\n                \n            scheduleFlush();\n        }\n\n        async function runAllTests() {\n            resetTestStatus();\n            const container = document.getElementById('batch-actions-container');\n            container.setAttribute('data-status', 'running');\n            if (!appInsights) {\n                log('❌ Please initialize the SDK first', 'error');\n                return;\n            }\n\n            log('🚀 Running all tests...', 'info');\n            \n            testBasicClientSpan();\n            await sleep(100);\n            testBasicServerSpan();\n            await sleep(100);\n            testFailedSpan();\n            await sleep(100);\n            testParentChild();\n            await sleep(100);\n            testNestedHierarchy();\n            await sleep(100);\n            testHttpDependency();\n            await sleep(100);\n            testDatabaseDependencies();\n            await sleep(100);\n            testEcommerceCheckout();\n            await sleep(100);\n            testMixedResults();\n            await sleep(100);\n            testRichProperties();\n\n            log('✨ All tests completed! Wait 1-2 minutes and check the portal.', 'success');\n        }\n\n        function sleep(ms) {\n            return new Promise(resolve => setTimeout(resolve, ms));\n        }\n\n        function clearOutput() {\n            document.getElementById('output').innerHTML = '<span class=\"info\">Output cleared.</span>';\n        }\n\n        function exportLogs() {\n            const output = document.getElementById('output');\n            const text = output.innerText;\n            const blob = new Blob([text], { type: 'text/plain' });\n            const url = URL.createObjectURL(blob);\n            const a = document.createElement('a');\n            a.href = url;\n            a.download = `span-e2e-logs-${new Date().toISOString().slice(0,19).replace(/:/g,'-')}.txt`;\n            a.click();\n            URL.revokeObjectURL(url);\n            log('📥 Logs exported', 'info');\n        }\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "AISKU/Tests/Manual/style/style.css",
    "content": "body {\n    margin: 0;\n}\n\nh1 {\n    font-size: 1.875rem;\n    margin: 0.67rem 0;\n}\n\nh2 {\n    font-size: 1.5rem;\n    margin: 0.83rem 0;\n}\n\nh3 {\n    font-size: 1.25rem;\n    margin: 1rem 0;\n}\n\nh4 {\n    font-size: 1.05rem;\n    margin: 1.33rem 0;\n}\n\nh5 {\n    font-size: 1rem;\n    margin: 1.5rem 0;\n}\n\nh6 {\n    font-size: 0.875rem;\n    margin: 0.3rem 0;\n}\n\n.uppercase {\n    text-transform: uppercase;\n}\n\npre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n}\n\nol,\nul {\n    margin: 1em 0;\n}\n\n.container {\n    max-width: 1600px;\n    padding: 0 2rem;\n}\n\n.container-main {\n    justify-content: space-between;\n    font-size: 0.9rem;\n    position: relative;\n    margin: 1rem auto;\n    padding-left: 1rem;\n    background-color: azure;\n    overflow: auto;\n    max-height: 350px;\n}\n\n\nbody {\n    font-family: \"Segoe UI\", sans-serif;\n    font-size: 16px;\n    padding-left: 1rem;\n}\n\ncode,\npre {\n    font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n    padding: 0.2em;\n    margin: 0;\n    font-size: 0.875rem;\n    border-radius: 0.8em;\n}\nbutton {\n    font-family: \"Segoe UI\", sans-serif;\n    margin: 0.5rem;\n    padding: 0.2em;\n}\n\np{\n    font-size: 12px;\n    margin: 0;\n}"
  },
  {
    "path": "AISKU/Tests/Manual/testVersionConflict.html",
    "content": "<!DOCTYPE html>\n\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>AISKU Sample</title>\n    <link rel=\"stylesheet\" href=\"style/style.css\"/>\n\n    <!-- <script src=\"https://requirejs.org/docs/release/2.3.6/minified/require.js\" type=\"text/javascript\"></script> -->\n<script type=\"text/javascript\">\n!(function (cfg){function e(){cfg.onInit&&cfg.onInit(n)}var x,w,D,t,E,n,C=window,O=document,b=C.location,q=\"script\",I=\"ingestionendpoint\",L=\"disableExceptionTracking\",j=\"ai.device.\";\"instrumentationKey\"[x=\"toLowerCase\"](),w=\"crossOrigin\",D=\"POST\",t=\"appInsightsSDK\",E=cfg.name||\"appInsights\",(cfg.name||C[t])&&(C[t]=E),n=C[E]||function(g){var f=!1,m=!1,h={initialize:!0,queue:[],sv:\"8\",version:2,config:g};function v(e,t){var n={},i=\"Browser\";function a(e){e=\"\"+e;return 1===e.length?\"0\"+e:e}return n[j+\"id\"]=i[x](),n[j+\"type\"]=i,n[\"ai.operation.name\"]=b&&b.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(h.sv||h.version),{time:(i=new Date).getUTCFullYear()+\"-\"+a(1+i.getUTCMonth())+\"-\"+a(i.getUTCDate())+\"T\"+a(i.getUTCHours())+\":\"+a(i.getUTCMinutes())+\":\"+a(i.getUTCSeconds())+\".\"+(i.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+\"Z\",iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}},ver:undefined,seq:\"1\",aiDataContract:undefined}}var n,i,t,a,y=-1,T=0,S=[\"js.monitor.azure.com\",\"js.cdn.applicationinsights.io\",\"js.cdn.monitor.azure.com\",\"js0.cdn.applicationinsights.io\",\"js0.cdn.monitor.azure.com\",\"js2.cdn.applicationinsights.io\",\"js2.cdn.monitor.azure.com\",\"az416426.vo.msecnd.net\"],o=g.url||cfg.src,r=function(){return s(o,null)};function s(d,t){if((n=navigator)&&(~(n=(n.userAgent||\"\").toLowerCase()).indexOf(\"msie\")||~n.indexOf(\"trident/\"))&&~d.indexOf(\"ai.3\")&&(d=d.replace(/(\\/)(ai\\.3\\.)([^\\d]*)$/,function(e,t,n){return t+\"ai.2\"+n})),!1!==cfg.cr)for(var e=0;e<S.length;e++)if(0<d.indexOf(S[e])){y=e;break}var n,i=function(e){var a,t,n,i,o,r,s,c,u,l;h.queue=[],m||(0<=y&&T+1<S.length?(a=(y+T+1)%S.length,p(d.replace(/^(.*\\/\\/)([\\w\\.]*)(\\/.*)$/,function(e,t,n,i){return t+S[a]+i})),T+=1):(f=m=!0,s=d,!0!==cfg.dle&&(c=(t=function(){var e,t={},n=g.connectionString;if(n)for(var i=n.split(\";\"),a=0;a<i.length;a++){var o=i[a].split(\"=\");2===o.length&&(t[o[0][x]()]=o[1])}return t[I]||(e=(n=t.endpointsuffix)?t.location:null,t[I]=\"https://\"+(e?e+\".\":\"\")+\"dc.\"+(n||\"services.visualstudio.com\")),t}()).instrumentationkey||g.instrumentationKey||\"\",t=(t=(t=t[I])&&\"/\"===t.slice(-1)?t.slice(0,-1):t)?t+\"/v2/track\":g.endpointUrl,t=g.userOverrideEndpointUrl||t,(n=[]).push((i=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",o=s,u=t,(l=(r=v(c,\"Exception\")).data).baseType=\"ExceptionData\",l.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:i.replace(/\\./g,\"-\"),hasFullStack:!1,stack:i+\"\\nSnippet failed to load [\"+o+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(b&&b.pathname||\"_unknown_\")+\"\\nEndpoint: \"+u,parsedStack:[]}],r)),n.push((l=s,i=t,(u=(o=v(c,\"Message\")).data).baseType=\"MessageData\",(r=u.baseData).message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+l+\")\").replace(/\\\"/g,\"\")+'\"',r.properties={endpoint:i},o)),s=n,c=t,JSON&&((u=C.fetch)&&!cfg.useXhr?u(c,{method:D,body:JSON.stringify(s),mode:\"cors\"}):XMLHttpRequest&&((l=new XMLHttpRequest).open(D,c),l.setRequestHeader(\"Content-type\",\"application/json\"),l.send(JSON.stringify(s)))))))},a=function(e,t){m||setTimeout(function(){!t&&h.core||i()},500),f=!1},p=function(e){var n=O.createElement(q),e=(n.src=e,t&&(n.integrity=t),n.setAttribute(\"data-ai-name\",E),cfg[w]);return!e&&\"\"!==e||\"undefined\"==n[w]||(n[w]=e),n.onload=a,n.onerror=i,n.onreadystatechange=function(e,t){\"loaded\"!==n.readyState&&\"complete\"!==n.readyState||a(0,t)},cfg.ld&&cfg.ld<0?O.getElementsByTagName(\"head\")[0].appendChild(n):setTimeout(function(){O.getElementsByTagName(q)[0].parentNode.appendChild(n)},cfg.ld||0),n};p(d)}cfg.sri&&(n=o.match(/^((http[s]?:\\/\\/.*\\/)\\w+(\\.\\d+){1,5})\\.(([\\w]+\\.){0,2}js)$/))&&6===n.length?(d=\"\".concat(n[1],\".integrity.json\"),i=\"@\".concat(n[4]),l=window.fetch,t=function(e){if(!e.ext||!e.ext[i]||!e.ext[i].file)throw Error(\"Error Loading JSON response\");var t=e.ext[i].integrity||null;s(o=n[2]+e.ext[i].file,t)},l&&!cfg.useXhr?l(d,{method:\"GET\",mode:\"cors\"}).then(function(e){return e.json()[\"catch\"](function(){return{}})}).then(t)[\"catch\"](r):XMLHttpRequest&&((a=new XMLHttpRequest).open(\"GET\",d),a.onreadystatechange=function(){if(a.readyState===XMLHttpRequest.DONE)if(200===a.status)try{t(JSON.parse(a.responseText))}catch(e){r()}else r()},a.send())):o&&r();try{h.cookie=O.cookie}catch(k){}function e(e){for(;e.length;)!function(t){h[t]=function(){var e=arguments;f||h.queue.push(function(){h[t].apply(h,e)})}}(e.pop())}var c,u,l=\"track\",d=\"TrackPage\",p=\"TrackEvent\",l=(e([l+\"Event\",l+\"PageView\",l+\"Exception\",l+\"Trace\",l+\"DependencyData\",l+\"Metric\",l+\"PageViewPerformance\",\"start\"+d,\"stop\"+d,\"start\"+p,\"stop\"+p,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),h.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(g.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==g[L]&&!0!==l[L]&&(e([\"_\"+(c=\"onerror\")]),u=C[c],C[c]=function(e,t,n,i,a){var o=u&&u(e,t,n,i,a);return!0!==o&&h[\"_\"+c]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:C.event}),o},g.autoExceptionInstrumented=!0),h}(cfg.cfg),(C[E]=n).queue&&0===n.queue.length?(n.queue.push(e),n.trackPageView({})):e();})({\n    // src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n    src: \"../../browser/es5/ai.3.3.6.js\",\n    // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n    // dle: true, // Prevent the SDK from reporting load failure log\n    crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n    sri: true, // Custom optional value to specify whether fetching the snippet from integrity file and do integrity check \n    cfg: { // Application Insights Configuration\n        disableStatsBeat: false,\n        connectionString: \"YOUR_INSTRUMENTATION_KEY\",\n    }\n});\n  </script>\n  </head>\n  <body>\n    <h1>Microsoft Application Insights JavaScript SDK - AISKU</h1>\n    <!-- <script>\n      let appInsights = new ApplicationInsights.ApplicationInsights({ config: {connectionString: \"InstrumentationKey=88888888\", disableInstrumentationKeyValidation: true}});\n      appInsights.loadAppInsights();\n      window.appInsights = appInsights;\n    </script> -->\n    <!-- <script src=\"aisku-example-index.gbl.js\"></script> -->\n  </body>\n</html>"
  },
  {
    "path": "AISKU/Tests/Perf/src/AISKUPerf.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsInitPerfTestClass } from \"./AISKUPerf\";\nimport { utlRemoveSessionStorage } from \"@microsoft/applicationinsights-core-js\";\nimport { createTimeoutPromise, doAwait } from \"@nevware21/ts-async\";\n\nfunction isNullOrUndefined(value: any): boolean {\n    return value === undefined || value === null;\n}\n\nfunction createTrackEvent(eventName: string, type: string = \"EventData\", fieldNum?: number) {\n    let number = fieldNum? fieldNum: Math.random() * 10 + 10;\n    let fields = {};\n    for (let i=1; i <= number; i++) {\n        let field = \"field\" + i;\n        fields[field] = \"value\" + i;\n    }\n    return {name: eventName, properties: fields, baseType: type };\n}\n\nfunction sendEventWithCollectorUrl(event: any) {\n    let oneDS = window[\"oneDS\"];\n    const generatedUrl = oneDS.getCollectorUrlGenerator(event);\n    let collectorUrlScript = document.createElement(\"script\");\n    collectorUrlScript.setAttribute(\"id\", \"collectorUrl\");\n    collectorUrlScript.src=generatedUrl;\n    document.head.appendChild(collectorUrlScript);\n    collectorUrlScript.onload=collectorUrlScript[\"onreadystatechange\"] = function() {\n        Assert.ok(true,\"telemetry sent\");\n    }\n}\n\nfunction pushPerfEvents(event: any, AISKUPerfTest: any): void {\n    if (!AISKUPerfTest.doFlush) {\n        AISKUPerfTest.perfEventsBuffer.push(event);\n    }\n    else {\n        AISKUPerfTest.perfEventWaitBuffer.push(event);\n    }\n}\n\nfunction flush(AISKUPerfTest: any): void {\n    AISKUPerfTest.doFlush = true;\n    console.log(\"flush \" +  AISKUPerfTest.perfEventsBuffer.length +\" events\");\n    AISKUPerfTest.perfEventsBuffer.forEach((event) => {\n        if (event.baseData) {sendEventWithCollectorUrl(event);}\n    })\n    AISKUPerfTest.perfEventsBuffer = AISKUPerfTest.perfEventWaitBuffer.slice(0);\n    AISKUPerfTest.doFlush = false;\n    AISKUPerfTest.perfEventWaitBuffer = [];\n    Assert.ok(true, \"flush triggered\");\n}\n\nconst TENANT_KEY = \"2252db2e5e344635a36c5f1c04b3902c-eaced1c8-a046-4e8d-8fa8-c1ecf2077a5d-7256\"\nfunction createPerfEvent(AISKUInitPerf: any, name: string, value: number, isProcessTime: boolean, msg?: string): void {\n    if (isNullOrUndefined(value) || value < 0 || isNullOrUndefined(AISKUInitPerf)) return;\n    let metricVal = isProcessTime? \"ProcessTime\":\"UsedJSHeapSize\";\n    let unit = isProcessTime?  \"ms\":\"KB\";\n    let event =  {\n        name: \"SDKPerfTest\",\n        iKey: TENANT_KEY,\n        ver: \"4.0\",\n        ext: {},\n        baseData: {\n          testName: name,\n          sku:AISKUInitPerf.skuName,\n          version: AISKUInitPerf.version,\n          unitOfMeasure: unit,\n          metric: metricVal,\n          value: value\n        }\n    };\n\n    pushPerfEvents(event, AISKUInitPerf);\n    let message = msg? msg :`perfEvent: ${event.baseData.testName} ${event.baseData.value}${event.baseData.unitOfMeasure} added`;\n    console.log(message);\n    Assert.ok(true, message);\n}\n\nfunction parseBatchSendEvent(perfEvent: any, AISKUInitPerf: any, memoryUsageMarks: any): void {\n    let curMemory = performance[\"memory\"]?.usedJSHeapSize;\n    let memoryMarks = Object.keys(memoryUsageMarks);\n    var index = \"\";\n    \n    if (memoryMarks && memoryMarks.length && curMemory !== undefined) {\n        index = memoryMarks[memoryMarks.length-1];\n        createPerfEvent(AISKUInitPerf, perfEvent.name+index, perfEvent?.exTime, true);\n    }\n}\n\nfunction parseTrackEvent(perfEvent: any, AISKUInitPerf: any): void {\n    let payloadItem = perfEvent[\"payload\"]?.item;\n    let baseType = null;\n    if (perfEvent[\"time\"] && payloadItem) {\n         baseType = payloadItem[\"baseType\"];\n    }\n    // skip PageviewPerformanceData && MessageData\n    if (isNullOrUndefined(baseType) || baseType == \"PageviewPerformanceData\" || baseType == \"MessageData\") return;\n\n    createPerfEvent(AISKUInitPerf, `Track${baseType}`, perfEvent?.time, true);\n    var childEvts = perfEvent?.childEvts;\n    while (childEvts?.length) {\n        let curEvt = childEvts[0];\n        let name = `${baseType}-${curEvt.name}`;\n        let value = curEvt?.exTime !== undefined ? curEvt.exTime:curEvt.time;\n        createPerfEvent(AISKUInitPerf, name, value, true);\n        childEvts = curEvt?.childEvts;\n    }\n}\n\nfunction parseAppInsightsPerfEvent(perfEvent: any, AISKUInitPerf: any, memoryUsageMarks: any): void {\n    let perfEventName = perfEvent?.name;\n    switch (perfEventName) {\n        case \"AISKU.flush\":\n            parseBatchSendEvent(perfEvent, AISKUInitPerf, memoryUsageMarks);\n            break;\n        case \"AppInsightsCore:track\":\n            parseTrackEvent(perfEvent, AISKUInitPerf);\n            break;\n    }\n}\n\nfunction addSnippetLoadingTimeEvent(AISKUPerfTest: any, endtime: number): void {\n    let rawTime = endtime - AISKUPerfTest.snippetStartTime;\n    var duration = Math.round(rawTime*1000)/1000;\n    createPerfEvent(AISKUPerfTest, \"SDKInit\", duration, true, `AppInsightsInit-Init: Script LoadingTime: ${duration} ms added`);\n}\n\nexport class AISKUPerf extends AITestClass {\n    public AISKUPerfTest: AppInsightsInitPerfTestClass;\n    public perfMgr: any;\n    public doPerf: any;\n    public appInsights: any;\n    public initialMemoryUsage: number = 0;\n    public batchStartTimeMarks: any;\n    public memoryUsageMarks: any;\n    public perfMgrSrc: any = null;\n\n    public testInitialize() {\n        try {\n           this.AISKUPerfTest = new AppInsightsInitPerfTestClass();\n           Assert.ok(window[\"oneDS\"], \"oneDS exists\");\n           Assert.ok(window[\"Microsoft\"]?.ApplicationInsights?.PerfMarkMeasureManager, \"perfMgr exists\");\n           Assert.ok(window[\"Microsoft\"]?.ApplicationInsights?.doPerf, \"doPerf exists\");\n           this.perfMgr = window[\"Microsoft\"].ApplicationInsights.PerfMarkMeasureManager;\n           this.doPerf = window[\"Microsoft\"].ApplicationInsights.doPerf;\n           window[\"appInsightsInitPerftest\"] = this.AISKUPerfTest;\n           this.memoryUsageMarks = {};\n           this.batchStartTimeMarks = {};\n\n        } catch (e) {\n            console.error(\"Failed to initialize AISKUPerf Tests\", e);\n        }\n    }\n\n    public testCleanup() {\n        utlRemoveSessionStorage(null as any, \"AI_sentBuffer\");\n        utlRemoveSessionStorage(null as any, \"AI_buffer\");\n    }\n\n    public registerTests() {\n        this.addPerfTest();\n    }\n\n    constructor() {\n        super(\"AISKUPerfTest\");\n    }\n    \n    public addPerfTest(): void {\n        this.testCase({\n            name: \"AppInsights AISKU perf Test\",\n            assertNoHooks: false,\n            test: () => {\n                Assert.ok(window[\"appInsightsInitPerftest\"], \"global appInsightsInitPerftest exists\");\n                Assert.ok(window[\"oneDS\"], \"oneDS exists\");\n                Assert.ok(this.perfMgr, \"perfMgr exists\");\n                Assert.ok(this.doPerf, \"doPerf exists\");\n                console.log(this.AISKUPerfTest.version);\n\n                try {\n                    if (!this.AISKUPerfTest.hasPerfMgr) {\n                        this.perfMgrSrc = new this.perfMgr({\n                         useMarks: true,\n                         useEndMarks: true,\n                         uniqueNames: true\n                     },\n                     {\n                         perfEvent: (perfEvent) => {\n                             parseAppInsightsPerfEvent(perfEvent,this.AISKUPerfTest, this.memoryUsageMarks);\n                         }\n                     });\n                    }\n                    this.initialMemoryUsage = performance[\"memory\"]?.usedJSHeapSize;\n                    this._loadSnippet();\n                } catch (e) {\n                    Assert.ok(false, \"load snippet error: \" + e);\n                }\n\n                // Wait for 10 seconds to allow the script to load and then check if the appInsights object is available\n                return this._delay(10000, () => {\n                   Assert.ok(true, \"test version: \" + this.AISKUPerfTest.version);\n                });\n            }\n        });\n    }\n\n    protected _loadScriptOnInit(theModule: any): void {\n        var snippetLoadingEndTime = performance.now();\n        this._addMemoryPerfEvent(this.initialMemoryUsage);\n        Assert.ok(true,\"AppInsights script loaded\");\n\n        addSnippetLoadingTimeEvent(this.AISKUPerfTest, snippetLoadingEndTime);\n    \n        let appInsights = window[\"appInsights\"];\n        this.appInsights = appInsights;\n\n        this.onDone(() => {\n            if (appInsights && appInsights.unload && appInsights.core && appInsights.core.isInitialized()) {\n                Assert.ok(true, \"Unloading...\");\n                appInsights.unload(false);\n            } else {\n                Assert.ok(true, \"Unload not supported...\");\n            }\n            \n            appInsights = null;\n            this.appInsights = null;\n        });\n        try {\n            let notificationManager = this.appInsights.core[\"_notificationManager\"] ||this.appInsights.core?.getNotifyMgr();\n            if (notificationManager) {\n                notificationManager.addNotificationListener({\n                    perfEvent: (perfEvent: any) => {\n                        parseAppInsightsPerfEvent(perfEvent,this.AISKUPerfTest, this.memoryUsageMarks);\n                }});\n            }\n            \n        } catch (e) {\n            console.error(e);\n        }\n\n        this.addPerfEvents();\n\n        setTimeout(() => {\n            flush(this.AISKUPerfTest);\n        }, 9000);\n    }\n\n    protected _loadSnippet():void {\n        let self = this;\n        self.initialMemoryUsage = performance[\"memory\"]?.usedJSHeapSize;\n        window[\"loadSdkUsingRequire\"]({\n            src: self.getScriptSrc(),\n            onInit: function (theInstance) {\n                console.log(\"snippet loaded\");\n                self._loadScriptOnInit(theInstance);\n\n                self.onDone(() => {\n                    if (theInstance && theInstance.unload && theInstance.core && theInstance.core.isInitialized()) {\n                        Assert.ok(true, \"Unloading from onInit...\");\n                        theInstance.unload(false);\n                    } else {\n                        Assert.ok(true, \"Unload not supported in onInit...\");\n                    }\n                });\n            },\n            cfg: { \n                instrumentationKey: \"key\",\n                enablePerfMgr: true,\n                maxBatchSizeInBytes: 1000000,\n                maxBatchInterval: 30000000,\n                extensionConfig: {}\n            }            \n        });\n    }\n\n    public addPerfEvents() {\n        this._addMemoryPerfEvent(this.initialMemoryUsage,\"Configuration\");\n        this._trackSingleEvent();\n\n        setTimeout(() =>{\n            this._trackBatchEvents(10);\n            setTimeout(() =>{\n                this._trackBatchEvents(30);\n                setTimeout(() =>{\n                    this._trackBatchEvents(50);\n                    setTimeout(() =>{\n                        this._trackBatchEvents(80);\n                        setTimeout(() =>{\n                            this._trackBatchEvents(100);\n                        },1000);\n                    },1000);\n                },1000);\n            },1000);\n        },1000);\n    }\n\n    public getScriptSrc(): string {\n        let baseUrl = \"https://js.monitor.azure.com/scripts/b/ai.\";\n\n        if (this.AISKUPerfTest.version.indexOf(\"nightly\") !== -1) {\n            baseUrl = \"https://js.monitor.azure.com/nightly/ai.\";\n        }\n\n        return baseUrl + `${this.AISKUPerfTest.version}.min.js?${this.AISKUPerfTest.testPostfix}`;\n    }    \n\n    private _addMemoryPerfEvent(initialMemoryUsage: number, metric?: string): void {\n        let curMemory = performance[\"memory\"]?.usedJSHeapSize;\n        if (isNullOrUndefined(initialMemoryUsage) || initialMemoryUsage < 0) return;\n        \n       \n        if (!isNullOrUndefined(curMemory)) {\n            let metricName = metric? metric:\"SDKInit\";\n            var memoryUsed =  Math.round((curMemory - initialMemoryUsage) / 1000);\n            createPerfEvent(this.AISKUPerfTest, metricName, memoryUsed, false, `AppInsightsInit-Init: ${metricName} UsedJSHeapSize ${memoryUsed} KB added`);\n        }\n    }\n\n    protected _trackSingleEvent() {\n        if (isNullOrUndefined(this.appInsights)) return;\n\n        var event =  createTrackEvent(\"Track\",\"EventData\",20);\n        var curMemeory = performance[\"memory\"]?.usedJSHeapSize;\n        if (! isNullOrUndefined(curMemeory)) {\n            this.memoryUsageMarks[\"Track\"] = curMemeory;\n        }\n\n        try {\n            if (this.AISKUPerfTest.hasPerfMgr) {\n                this.appInsights.trackEvent(event);\n            } else {\n                this.doPerf(this.perfMgrSrc, () => \"AppInsightsCore:track\", (perfEvent) => {\n                    this.appInsights.trackEvent(event);\n                    // A mark has been added to window.performance called 'tst.mark.AppInsightsCore:track'\n                },()=> ({item: event}));\n            }\n            this.appInsights.flush(false);\n        } catch (e) {\n            console.error(e);\n        }\n    }\n\n    protected _trackBatchEvents(number?: number) {\n        var curTime = performance.now();\n        if (isNullOrUndefined(this.appInsights)) return;\n       \n        var eventNumber = number && number > 0? number:100;\n        var eventName = \"BatchSend\" + number;\n        this.batchStartTimeMarks[eventName] = curTime;\n        var event = createTrackEvent(\"batch\",\"Message\",20);\n        \n        var curMemory = performance[\"memory\"]?.usedJSHeapSize;\n        if (!isNullOrUndefined(curMemory)) {\n            this.memoryUsageMarks[eventName] = curMemory;\n        }\n\n        let beforeCreateBatch = performance.now();\n        try {\n            for (let i = 0; i < eventNumber; i++) {\n                this.appInsights.trackTrace(event);\n            }\n            let afterCreateBatch = performance.now();\n            let afterMemoUage = performance[\"memory\"]?.usedJSHeapSize;\n            let val = Math.round((afterMemoUage-curMemory)/1000);\n            val = val < 0? 0:val;\n            let msg = `${eventName} Memory Usage: ${val}KB`;\n            createPerfEvent(this.AISKUPerfTest,eventName,val,false,msg);\n            let duration = Math.round((afterCreateBatch-beforeCreateBatch)*1000)/1000;\n            let createBatchName = `CreateBatch${eventNumber}`\n            let createBatchMsg = `${createBatchName} time: ${duration}ms`;\n            createPerfEvent(this.AISKUPerfTest,createBatchName,duration,true,createBatchMsg);\n            if (this.AISKUPerfTest.hasPerfMgr) {\n                this.appInsights.flush(false);\n            } else {\n                this.doPerf(this.perfMgrSrc, () => \"AISKU.flush\", (perfEvent) => {\n                    this.appInsights.flush(false);\n                    // A mark has been added to window.performance called 'tst.mark.AISKU.flush'\n                },()=> ({item: event}));\n            }\n        } catch (e) {\n            console.error(e);\n        }\n     \n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Perf/src/AISKUPerf.ts",
    "content": "export class AppInsightsInitPerfTestClass {\n\n    public version: string;\n    public perfEventsBuffer: any[];\n    public perfEventWaitBuffer: any[];\n    public testPostfix: string;\n    public INTERNAL_TENANT_KEY: string = \"INTERNAL_TENANT_KEY\";\n    public doFlush: boolean;\n    public snippetStartTime: number;\n    public skuName: string = \"AppInsights\";\n    public loadScriptOnInit: () => void;\n    public flush: () => void;\n    public sku: any = null;\n    public hasPerfMgr: boolean;\n\n    constructor(ver?: string) {\n        /**\n         * Default current version is 2.7.1\n         * should update version after new release\n         * version with doperf(): after 2.5.6\n         * */\n        var defaultVer = \"3.4.1\";\n        this.version = ver? ver:this._getQueryParameterVersion(defaultVer); \n        this.perfEventsBuffer = [];\n        this.perfEventWaitBuffer = [];\n        this.testPostfix = Math.random().toString(36).slice(6);\n        this.doFlush = false;\n        this.snippetStartTime = 0;\n        this.hasPerfMgr = this.version <= \"2.5.6\"? false:true;\n    }\n\n    protected _getQueryParameterVersion(defaultVer: string): string {\n        var version = defaultVer;\n        var location = window.location.search;\n        var queryParameter = new URLSearchParams(location);\n        let queryVer = queryParameter.get(\"version\");\n        if (queryVer && queryVer.length > 0) { version = queryVer;}\n        return version;\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Perf/src/aiskuperftests.ts",
    "content": "import { AISKUPerf } from \"./AISKUPerf.Tests\";\n\nexport function runTests() {\n    new AISKUPerf().registerTests();\n}"
  },
  {
    "path": "AISKU/Tests/PerfTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript AISKU</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script>\n        !function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t(e.oneDS={})}(this,function(e){\"use strict\";function u(e){return t(e,\"number\")}function o(e){return t(e,\"boolean\")}function s(e,t,n){var r,i=-1;return l(e)?i:(t&&0<t&&(32===t?i=8192:t<=13&&(i=t<<5)),v(n)&&u(r=n)&&0<=r&&r<=9?(-1===i&&(i=0),i|n):(f(e)&&(e=e[0]),-1!==i?i|(l(e)?-1:u(e)?6:a(e)?1:o(e)?7:-1):u(e)?6:i))}function p(e,t,n){if(void 0===n&&(n=!1),y(t)){var r=n?\"qsp=true&\":\"&\";return u(t)||o(t)?r+=e+\"=\"+t:r+=\"object\"==typeof t?e+\"=\"+JSON.stringify(t):e+'=\"'+encodeURIComponent(t)+'\"',r}return\"\"}function y(e){return!i(e)&&\"\"!==e}function i(e){return l(e)||null===e}function l(e){return e===undefined||void 0===e}function t(e,t){return typeof e===t}function a(e){return t(e,\"string\")}function f(e){return e instanceof Array}function v(e){return!l(e)}function m(e,t,n){if(!a(e)||i(t)||\"\"===t)return null;if(a(t)||u(t)||o(t)||f(t))t={value:t};else if(\"object\"!=typeof t||t.hasOwnProperty(\"value\")){if(i(t.value)||\"\"===t.value||!a(t.value)&&!u(t.value)&&!o(t.value)&&!f(t.value))return null}else t={value:n?JSON.stringify(t):t};if(f(t.value)&&!(0<t.value.length))return null;if(v(t.kind)){if(f(t.value)||!((r=t.kind)&&u(r)&&(0<=r&&r<=13||32===r)))return null;t.value=t.value.toString()}var r;return t}e.getCollectorUrlGenerator=function(e,t){var n=\"https://browser.events.data.microsoft.com/OneCollector/1.0/\";t&&t.endpointUrl&&(n=t.endpointUrl);var r=function(e){if(\"[object Date]\"===Object.prototype.toString.call(e)){var t=function(e){var t=e+\"\";return 1===t.length&&(t=\"0\"+t),t};return e.getUTCFullYear()+\"-\"+t(1+e.getUTCMonth())+\"-\"+t(e.getUTCDate())+\"T\"+t(e.getUTCHours())+\":\"+t(e.getUTCMinutes())+\":\"+t(e.getUTCSeconds())+\".\"+((e.getUTCMilliseconds()/1e3).toFixed(3)+\"\").slice(2,5)+\"Z\"}}(new Date),i=0;if(null==e)return\"input is null or undefined\";if(null===e.name||\"undefined\"==typeof e.name)return\"telemetry item expects valid name\";if(null===e.iKey||\"undefined\"==typeof e.iKey)return\"telemetry item expects valid ikey\";null!==e.time&&\"undefined\"!=typeof e.time||(e.time=r);var u=e.baseData,o=e.data,l=p(\"name\",e.name,!0);if(l+=p(\"time\",e.time),l+=p(\"ver\",e.ver),l+=p(\"iKey\",\"o:\"+function(e){if(e){var t=e.indexOf(\"-\");if(-1<t)return e.substring(0,t)}return\"\"}(e.iKey)),l+=\"&apikey=\"+e.iKey,e.ext)for(var a in e.ext)if(e.ext.hasOwnProperty(a))for(var f in e.ext[a])e.ext[a].hasOwnProperty(f)&&y(e.ext[a][f])&&y(d=m(f,e.ext[a][f],!0))&&(l+=p(\"ext.\"+a+\".\"+f,d.value));for(var v in u){var c=\"-\"+v;(d=m(v,u[v],!0))&&(0<(i=s(d.value,d.kind,d.propertyType))&&(c=c+\"*\"+i.toString()),l+=p(c,d.value))}for(var v in o){var d,c=\"*\"+v;(d=m(v,o[v],!0))&&(0<(i=s(d.value,d.kind,d.propertyType))&&(c=c+\"*\"+i.toString()),l+=p(c,d.value))}return n+\"t.js?\"+l},Object.defineProperty(e,\"__esModule\",{value:!0})});\n    </script>\n    <script src=\"https://js.monitor.azure.com/next/ext/ai.prfmm-mgr.2.js\"></script>\n\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>    \n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\",\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"aiskuperftests\", \"./Perf/dist/es5/aiskuperftests.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n\n    </script>\n\n    <script>\n        function loadSdkUsingRequire(snippetCfg) {\n            // We need to duplicate what the snippet initialization does\n            var appInsights = {\n                initialize: true,   // initialize sdk on download\n                queue: [],\n                sv: \"rq\",           // Track the actual snippet version for reporting.\n                version: 2.0,       // initialization version, if this is not 2.0 the previous scripts fail to initialize\n                config: snippetCfg.cfg\n            };\n\n            if (snippetCfg.onInit) {\n                appInsights.queue.push(function() {\n                    snippetCfg.onInit(appInsights);\n                });\n            }\n\n            window[\"appInsights\"] = appInsights;\n            // End of basic snippet configuration\n\n            // Cause Require to load the script\n            require([snippetCfg.src], function (theModule) {\n                try {\n                    define(\"appInsights\", function() {\n                        return theModule \n                    });\n\n                    console && console.log(\"Loaded Sdk - from \" + snippetCfg.src);\n                } catch(err) {\n                    console && console.error(\"Failed to load and initialize Sdk from [\" + snippetCfg.src + \"]\\n - Require ERROR: \" + err.toString());\n                }\n            });\n        }\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "AISKU/Tests/Unit/src/AISKUSize.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from '@nevware21/ts-utils';\nimport { createPromise, doAwait, IPromise } from '@nevware21/ts-async';\nimport { strUndefined } from \"@microsoft/applicationinsights-core-js\";\nimport { utlRemoveSessionStorage } from \"@microsoft/applicationinsights-core-js\";\nimport * as pako from \"pako\";\nimport { Snippet } from \"../../../src/Snippet\";\n\nconst PACKAGE_JSON = \"../package.json\";\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction _loadPackageJson(cb:(isNightly: boolean, packageJson: any) => IPromise<void>): IPromise<void> {\n    return createPromise<void>((testCompleted, testFailed) => {\n        function _handleCallback(packageJson: any) {\n            let version = packageJson.version || \"unknown\";\n            let isNightly = version.includes(\"nightly\") || version.includes(\"dev\");\n            doAwait(cb(isNightly, packageJson), () => {\n                testCompleted();\n            }, (error) => {\n                Assert.ok(false, `checkIsNightlyBuild error: ${error}`);\n                testFailed(error);\n            });\n        }\n\n        fetch(PACKAGE_JSON).then((response) => {\n            if (!response.ok) {\n                Assert.ok(false, `fetch package.json error: ${dumpObj(response)}`);\n                _handleCallback(false);\n            } else {\n                return response.text().then((content) => {\n                    let json = JSON.parse(removeTrailingComma(content));\n                    _handleCallback(json);\n                }, (error) => {\n                    Assert.ok(false, `fetch package.json error: ${error}`);\n                    _handleCallback({});\n                });\n            }\n        }, (error) => {\n            Assert.ok(false, `fetch package.json error: ${error}`);\n            _handleCallback({});\n        });\n    });\n}\n\nfunction _checkSize(checkType: string, maxSize: number, size: number, isNightly: boolean): void {\n    if (isNightly) {\n        maxSize += .5;\n    }\n\n    Assert.ok(size <= maxSize, `exceed ${maxSize} KB, current ${checkType} size is: ${size} KB`);\n}\n\nexport class AISKUSizeCheck extends AITestClass {\n    private readonly MAX_RAW_SIZE = 174;\n    private readonly MAX_BUNDLE_SIZE = 174;\n    private readonly MAX_RAW_DEFLATE_SIZE = 70;\n    private readonly MAX_BUNDLE_DEFLATE_SIZE = 70;\n    private readonly rawFilePath = \"../dist/es5/applicationinsights-web.min.js\";\n    // Automatically updated by version scripts\n    private readonly currentVer = \"3.4.1\";\n    private readonly prodFilePath = `../browser/es5/ai.${this.currentVer[0]}.min.js`;\n\n    public testInitialize() {\n\n    }\n\n    public testFinishedCleanup(): void {\n        if (typeof window !== strUndefined) {\n            var _window = window;\n            let aiName = _window[\"appInsightsSDK\"] || \"appInsights\";\n            if (_window[aiName] !== undefined) {\n                const snippet: Snippet = _window[aiName] as any;\n                if (snippet[\"unload\"]) {\n                    snippet[\"unload\"](false);\n                } else {\n                    if (snippet[\"appInsightsNew\"]) {\n                        snippet[\"appInsightsNew\"].unload();\n                    }\n                }\n            }\n        }\n    }\n\n    public testCleanup() {\n        utlRemoveSessionStorage(null as any, \"AI_sentBuffer\");\n        utlRemoveSessionStorage(null as any, \"AI_buffer\");\n    }\n\n    public registerTests() {\n        this.addRawFileSizeCheck();\n        this.addProdFileSizeCheck();\n    }\n\n    constructor() {\n        super(\"AISKUSizeCheck\");\n    }\n\n    private addRawFileSizeCheck(): void {\n        this._checkFileSize(false);\n    }\n\n    private addProdFileSizeCheck(): void {\n        this._checkFileSize(true);\n    }\n    \n    private _checkFileSize(isProd: boolean): void {\n        let _filePath = isProd? this.prodFilePath : this.rawFilePath;\n        let _maxFullSize = isProd ? this.MAX_BUNDLE_SIZE : this.MAX_RAW_SIZE;\n        let _maxDeflateSize = isProd ? this.MAX_BUNDLE_DEFLATE_SIZE : this.MAX_RAW_DEFLATE_SIZE;\n        let postfix  = isProd? \" (prod)\" : \" (dist)\";\n        let fileName = _filePath.split(\"..\")[2];\n        this.testCase({\n            name: `Test AISKU${postfix} deflate size`,\n            test: () => {\n                Assert.ok(true, `test file: ${fileName}`);\n                return _loadPackageJson((isNightly, packageJson) => {\n                    Assert.ok(true, `  checking : ${packageJson.name || \"??\"} v${packageJson.version || \"unknown\"}`);\n                    let request = new Request(_filePath, {method:\"GET\"});\n                    return fetch(request).then((response) => {\n                        if (!response.ok) {\n                            Assert.ok(false, `fetch AISKU${postfix} error: ${response.statusText}`);\n                            return;\n                        } else {\n                            return response.text().then(text => {\n                                let size = Math.ceil((text.length/1024) * 100) / 100.0;\n                                _checkSize(\"bundle\", _maxFullSize, size, isNightly);\n                                \n                                let deflateSize = Math.ceil((pako.deflate(text).length/1024) * 100) / 100.0;\n                                _checkSize(\"deflate\", _maxDeflateSize, deflateSize, isNightly);\n                            }).catch((error: Error) => {\n                                Assert.ok(false, `AISKU${postfix} response error: ${error}`);\n                            });\n                        }\n                    }).catch((error: Error) => {\n                        Assert.ok(false, `AISKU${postfix} deflate size error: ${error}`);\n                    });\n                });\n            }\n        });\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/CdnPackaging.tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { \n    AnalyticsPluginIdentifier, BreezeChannelIdentifier, DEFAULT_BREEZE_ENDPOINT, DisabledPropertyName,\n    DistributedTracingModes, PropertiesPluginIdentifier, RequestHeaders, SeverityLevel\n} from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj, LoggingSeverity, objForEachKey, objKeys, strUndefined } from \"@microsoft/applicationinsights-core-js\";\nimport { Snippet } from \"../../../src/Snippet\";\n\ndeclare var define;\n\nconst enum CdnFormat {\n    Umd = 0,\n    Gbl = 1,\n    CommonJs = 2\n}\n\nexport class CdnPackagingChecks extends AITestClass {\n    // Automatically updated by version scripts\n    private readonly currentVer = \"3.4.1\";\n\n    public testInitialize() {\n    }\n\n    public testFinishedCleanup(): void {\n        if (typeof window !== strUndefined) {\n            var _window = window;\n            let aiName = _window[\"appInsightsSDK\"] || \"appInsights\";\n            if (_window[aiName] !== undefined) {\n                const snippet: Snippet = _window[aiName] as any;\n                if (snippet[\"unload\"]) {\n                    snippet[\"unload\"](false);\n                } else {\n                    if (snippet[\"appInsightsNew\"]) {\n                        snippet[\"appInsightsNew\"].unload();\n                    }\n                }\n            }\n        }\n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        this.checkFullPackaging();\n        this.addMinifiedPackaging();\n    }\n\n    constructor() {\n        super(\"CdnPackagingChecks\");\n    }\n\n    private checkFullPackaging(): void {\n        this._checkPackaging(`../browser/es5/ai.${this.currentVer[0]}.js`, CdnFormat.Umd);\n        this._checkPackaging(`../browser/es5/ai.${this.currentVer[0]}.gbl.js`, CdnFormat.Gbl);\n        this._checkPackaging(`../browser/es5/ai.${this.currentVer[0]}.cjs.js`, CdnFormat.CommonJs);\n    }\n\n    private addMinifiedPackaging(): void {\n        this._checkPackaging(`../browser/es5/ai.${this.currentVer[0]}.min.js`, CdnFormat.Umd);\n        this._checkPackaging(`../browser/es5/ai.${this.currentVer[0]}.gbl.min.js`, CdnFormat.Gbl);\n        this._checkPackaging(`../browser/es5/ai.${this.currentVer[0]}.cjs.min.js`, CdnFormat.CommonJs);\n    }\n    \n    private _validateExpectedExports(theExports: any) {\n        Assert.ok(theExports.ApplicationInsights, \"ApplicationInsights exists\");\n        Assert.ok(!theExports.Telemetry, \"Telemetry no longer exists\");\n        // Assert.ok(theExports.Telemetry.DistributedTracingModes, \"Telemetry.DistributedTracingModes exists\");\n        // Assert.ok(theExports.Telemetry.Util, \"Telemetry exists\");\n\n        Assert.ok(theExports.LoggingSeverity, \"LoggingSeverity exists\");\n        objForEachKey(LoggingSeverity, (name, value) => {\n            Assert.equal(name, theExports.LoggingSeverity[value], `Checking LoggingSeverity.${name} === ${value}`);\n            Assert.equal(value, theExports.LoggingSeverity[name], `Checking LoggingSeverity.${value} === ${name}`);\n        });\n\n        Assert.ok(theExports.PerfEvent, \"PerfEvent exists\");\n        Assert.ok(theExports.PerfManager, \"PerfManager exists\");\n        Assert.ok(theExports.doPerf, \"doPerf exists\");\n        Assert.ok(!theExports.CoreUtils, \"CoreUtils no longer exists\");\n        Assert.ok(theExports.newId, \"newId exists\");\n        Assert.ok(theExports.newGuid, \"newGuid exists\");\n        Assert.ok(theExports.random32, \"random32 exists\");\n        Assert.ok(theExports.randomValue, \"randomValue exists\");\n        Assert.ok(theExports.generateW3CId, \"generateW3CId exists\");\n        Assert.ok(theExports.findW3cTraceParent, \"findW3cTraceParent exists\");\n        Assert.ok(theExports.findMetaTag, \"findMetaTag exists\");\n        Assert.ok(theExports.mergeEvtNamespace, \"mergeEvtNamespace exists\");\n        Assert.ok(theExports.eventOn, \"eventOn exists\");\n        Assert.ok(theExports.eventOff, \"eventOff exists\");\n        Assert.ok(theExports.addEventHandler, \"addEventHandler exists\");\n        Assert.ok(theExports.removeEventHandler, \"removeEventHandler exists\");\n    \n        Assert.ok(theExports.isBeaconsSupported, \"isBeaconsSupported exists\");\n\n        Assert.ok(!theExports.Util, \"Util no longer exists\");\n        // Assert.equal(theExports.Util, theExports.Telemetry.Util, \"Telemetry.Util matches Util\");\n        Assert.ok(theExports.RequestHeaders, \"RequestHeaders exists\");\n        objForEachKey(RequestHeaders, (name, value) => {\n            Assert.equal(value, theExports.RequestHeaders[name], `Checking RequestHeaders.${value} === ${name}`);\n            Assert.notEqual(undefined, theExports.RequestHeaders[name], `Checking RequestHeaders.${name} exists`);\n        });\n\n        Assert.equal(theExports.DisabledPropertyName, DisabledPropertyName, \"DisabledPropertyName value\");\n        Assert.equal(theExports.DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_ENDPOINT, \"DEFAULT_BREEZE_ENDPOINT value\");\n\n        Assert.ok(theExports.SeverityLevel, \"SeverityLevel exists\");\n        objForEachKey(SeverityLevel, (name, value) => {\n            Assert.equal(name, theExports.SeverityLevel[value], `Checking SeverityLevel.${name} === ${value}`);\n            Assert.equal(value, theExports.SeverityLevel[name], `Checking SeverityLevel.${value} === ${name}`);\n        });\n\n        Assert.ok(theExports.DistributedTracingModes, \"DistributedTracingModes exists\");\n        objForEachKey(DistributedTracingModes, (name, value) => {\n            Assert.equal(name, theExports.DistributedTracingModes[value], `Checking DistributedTracingMode.${name} === ${value}`);\n            Assert.equal(value, theExports.DistributedTracingModes[name], `Checking DistributedTracingMode.${value} === ${name}`);\n        });\n\n        Assert.equal(theExports.PropertiesPluginIdentifier, PropertiesPluginIdentifier, \"PropertiesPluginIdentifier value\");\n        Assert.equal(theExports.BreezeChannelIdentifier, BreezeChannelIdentifier, \"BreezeChannelIdentifier value\");\n        Assert.equal(theExports.AnalyticsPluginIdentifier, AnalyticsPluginIdentifier, \"AnalyticsPluginIdentifier value\");\n    }\n\n    private _validateExportsAsModule(text: string, format: CdnFormat) {\n        let orgExports = exports;\n        let orgDefine = define;\n        \n        try {\n\n            // remove any previously registered bundle\n            delete window[\"Microsoft\"];\n\n            // Hide define()\n            define = undefined;\n\n            // Remove any \"exports\"\n            exports = {};\n\n            // Used to simulate globals without overriding them\n            let theExports = {};\n            let hostValues = this[\"_hostValues\"] = {\n                global: {},\n                globalThis: undefined,\n                exports: theExports,\n                module: {\n                    exports: theExports\n                },\n                define: undefined\n            };\n\n            // \"process\" the script\n            eval(text);\n\n            // This test should not be overriding the real globals\n            Assert.equal(0, objKeys(exports || {}), \"The exports should not have been changed\");\n            Assert.equal(undefined, define, \"define should not have been exposed\");\n            Assert.equal(undefined, window[\"Microsoft\"], \"The global window[\\\"Microsoft\\\"] should not have been defined\");\n            Assert.equal(undefined, exports[\"Microsoft\"], \"global not added to exports\");\n            Assert.equal(undefined, this[\"Microsoft\"], \"The this should not have been changed Microsoft namespace does not exists\");\n\n            if (format == CdnFormat.Umd) {\n                // Because \"exports\" exists as a module then no namespace is expected\n                Assert.equal(undefined, hostValues.global[\"Microsoft\"], \"global Microsoft namespace does not exists\");\n                Assert.equal(undefined, hostValues.exports[\"Microsoft\"], \"global not added to cjs exports\");\n\n                this._validateExpectedExports(hostValues.exports);\n            } else if (format === CdnFormat.Gbl) {\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.equal(0, objKeys(hostValues.exports || {}), \"The exports should not have been changed\");\n                Assert.ok(microsoft, \"Microsoft namespace exists on this\");\n                Assert.ok(microsoft.ApplicationInsights, \"Microsoft namespace exists\");\n\n                this._validateExpectedExports(microsoft.ApplicationInsights);\n            } else if (format === CdnFormat.CommonJs) {\n                // There is no namespace for common js\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"global Microsoft namespace does not exists\");\n                Assert.equal(undefined, hostValues.exports[\"Microsoft\"], \"global Microsoft namespace does not exist on exports\");\n\n                this._validateExpectedExports(hostValues.exports);\n            }\n        } catch (e) {\n            Assert.ok(false, dumpObj(e));\n        } finally {\n            if (orgExports) {\n                exports = orgExports;\n            } else {\n                exports = undefined;\n            }\n\n            if (orgDefine) {\n                define = orgDefine;\n            } else {\n                define = undefined;\n            }\n        }\n    }\n\n    private _validateGlobalExports(text: string, format: CdnFormat) {\n        let orgExports = window.exports;\n        let orgDefine = define;\n        try {\n            // remove any previously registered bundle\n            delete window[\"Microsoft\"];\n\n            // Hide define()\n            define = undefined;\n\n            // Remove any \"exports\"\n            exports = undefined;\n\n            // Used to simulate globals without overriding them\n            let hostValues = this[\"_hostValues\"] = {\n                global: {},\n                globalThis: undefined,\n                exports: undefined as any,             // Don't provide an \"exports\"\n                module: undefined,\n                define: undefined\n            };\n\n            if (format === CdnFormat.CommonJs) {\n                // CommonJs always needs the \"exports\" defined\n                hostValues.exports = {};\n            }\n            \n            // \"process\" the script\n            eval(text);\n\n            // This test should not be overriding the real globals\n            Assert.equal(0, objKeys(exports || {}), \"The exports should not have been changed\");\n            Assert.equal(undefined, define, \"define should not have been exposed\");\n            Assert.equal(undefined, window[\"Microsoft\"], \"The global window[\\\"Microsoft\\\"] should not have been defined\");\n            Assert.equal(undefined, exports, \"global not added to exports\");\n            Assert.equal(undefined, this[\"Microsoft\"], \"The this should not have been changed Microsoft namespace does not exists\");\n\n            if (format == CdnFormat.Umd) {\n                // Because we are simulating no \"exports\" then there should be a global namespace defined\n                Assert.equal(undefined, hostValues.exports, \"No global exports should have been defined\");\n\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.ok(microsoft, \"Microsoft namespace exists\");\n                Assert.ok(microsoft.ApplicationInsights, \"Microsoft namespace exists\");\n    \n                this._validateExpectedExports(microsoft.ApplicationInsights);\n            } else if (format === CdnFormat.Gbl) {\n                let microsoft: any = window[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"global Microsoft namespace does not exists\");\n                Assert.equal(undefined, hostValues.exports, \"global not added to exports\");\n                \n                microsoft = hostValues.global[\"Microsoft\"];\n                Assert.ok(microsoft, \"Microsoft namespace exists on this\");\n                Assert.ok(microsoft.ApplicationInsights, \"Microsoft namespace exists\");\n\n                this._validateExpectedExports(microsoft.ApplicationInsights);\n            } else if (format === CdnFormat.CommonJs) {\n                // There is no namespace for common js\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"global Microsoft namespace does not exists\");\n\n                this._validateExpectedExports(hostValues.exports);\n            }\n        } catch (e) {\n            Assert.ok(false, dumpObj(e));\n        } finally {\n            if (orgExports) {\n                exports = orgExports;\n            } else {\n                exports = undefined;\n            }\n\n            if (orgDefine) {\n                define = orgDefine;\n            } else {\n                define = undefined;\n            }\n        }\n    }\n\n    private _validateExportsAsDefine(text: string, format: CdnFormat) {\n        let orgExports = window.exports;\n        let orgDefine = define;\n        try {\n            // remove any previously registered bundle\n            delete window[\"Microsoft\"];\n\n            // Hide define()\n            define = undefined;\n\n            // Remove any \"exports\"\n            exports = undefined;\n\n            let simulatedDefine = (names: string[], factory) => {\n                QUnit.assert.ok(false, \"Not tagged as 'amd' so should not be called\");\n            }\n\n            // Used to simulate globals without overriding them\n            let hostValues = this[\"_hostValues\"] = {\n                global: {},\n                globalThis: undefined,\n                exports: undefined as any,             // Don't provide an \"exports\"\n                module: undefined,\n                define: simulatedDefine\n            };\n\n            if (format === CdnFormat.CommonJs) {\n                // CommonJs always needs the \"exports\" defined\n                hostValues.exports = {};\n            }\n            \n            // \"process\" the script\n            eval(text);\n\n            // This test should not be overriding the real globals\n            Assert.equal(0, objKeys(exports || {}), \"The exports should not have been changed\");\n            Assert.equal(undefined, define, \"define should not have been exposed\");\n            Assert.equal(undefined, window[\"Microsoft\"], \"The global window[\\\"Microsoft\\\"] should not have been defined\");\n            Assert.equal(undefined, exports, \"global not added to exports\");\n            Assert.equal(undefined, this[\"Microsoft\"], \"The this should not have been changed Microsoft namespace does not exists\");\n\n            if (format == CdnFormat.Umd) {\n                // Because we are simulating no \"exports\" then there should be a global namespace defined\n                Assert.equal(undefined, hostValues.exports, \"No global exports should have been defined\");\n\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.ok(microsoft, \"Microsoft namespace exists\");\n                Assert.ok(microsoft.ApplicationInsights, \"Microsoft namespace exists\");\n    \n                this._validateExpectedExports(microsoft.ApplicationInsights);\n            } else if (format === CdnFormat.Gbl) {\n                let microsoft: any = window[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"global Microsoft namespace does not exists\");\n                Assert.equal(undefined, hostValues.exports, \"global not added to exports\");\n                \n                microsoft = hostValues.global[\"Microsoft\"];\n                Assert.ok(microsoft, \"Microsoft namespace exists on this\");\n                Assert.ok(microsoft.ApplicationInsights, \"Microsoft namespace exists\");\n\n                this._validateExpectedExports(microsoft.ApplicationInsights);\n            } else if (format === CdnFormat.CommonJs) {\n                // There is no namespace for common js\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"global Microsoft namespace does not exists\");\n\n                this._validateExpectedExports(hostValues.exports);\n            }\n        } catch (e) {\n            Assert.ok(false, dumpObj(e));\n        } finally {\n            if (orgExports) {\n                exports = orgExports;\n            } else {\n                exports = undefined;\n            }\n\n            if (orgDefine) {\n                define = orgDefine;\n            } else {\n                define = undefined;\n            }\n        }\n    }\n\n    private _validateExportsAsAmdDefine(text: string, format: CdnFormat) {\n        let orgExports = window.exports;\n        let orgDefine = define;\n        try {\n            // remove any previously registered bundle\n            delete window[\"Microsoft\"];\n\n            // Hide define()\n            define = undefined;\n\n            // Remove any \"exports\"\n            exports = undefined;\n\n            let defineCalled = false;\n            let theNames: string[];\n            let theFactory = null;\n            let simulatedDefine = (names: string[], factory) => {\n                defineCalled = true;\n                theNames = names;\n                theFactory = factory;\n            }\n            // Tag the function\n            simulatedDefine[\"amd\"] = true;\n\n            // Used to simulate globals without overriding them\n            let hostValues = this[\"_hostValues\"] = {\n                global: {},\n                globalThis: undefined,\n                exports: undefined as any,             // Don't provide an \"exports\"\n                module: undefined,\n                define: simulatedDefine\n            };\n\n            if (format === CdnFormat.CommonJs) {\n                // CommonJs always needs the \"exports\" defined\n                hostValues.exports = {};\n            }\n            \n            // \"process\" the script\n            eval(text);\n\n            // This test should not be overriding the real globals\n            Assert.equal(0, objKeys(exports || {}), \"The exports should not have been changed\");\n            Assert.equal(undefined, define, \"define should not have been exposed\");\n            Assert.equal(undefined, window[\"Microsoft\"], \"The global window[\\\"Microsoft\\\"] should not have been defined\");\n            Assert.equal(undefined, exports, \"global not added to exports\");\n            Assert.equal(undefined, this[\"Microsoft\"], \"The this should not have been changed Microsoft namespace does not exists\");\n\n            if (format == CdnFormat.Umd) {\n                // Because we are simulating no \"exports\" then there should be a global namespace defined\n                Assert.equal(undefined, hostValues.exports, \"No global exports should have been defined\");\n                Assert.equal(undefined, hostValues.global[\"Microsoft\"], \"Microsoft namespace should not have been defined\");\n\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"Microsoft namespace does not exist on the global\");\n\n                Assert.equal(true, defineCalled, \"Validate that define was called\");\n                Assert.ok(theNames, \"Make sure names was populated\");\n                Assert.equal(1, theNames.length, \"Check the provided names\")\n                Assert.equal(\"exports\", theNames[0], \"Check the provided name\")\n    \n                let theExports = {};\n                Assert.ok(theFactory, \"Make sure the factory was provided\");\n                theFactory(theExports);\n\n                microsoft = theExports[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"Microsoft namespace does not exist on the exports\");\n\n                this._validateExpectedExports(theExports);\n            } else if (format === CdnFormat.Gbl) {\n                let microsoft: any = window[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"global Microsoft namespace does not exists\");\n                Assert.equal(undefined, hostValues.exports, \"global not added to exports\");\n                \n                microsoft = hostValues.global[\"Microsoft\"];\n                Assert.ok(microsoft, \"Microsoft namespace exists on this\");\n                Assert.ok(microsoft.ApplicationInsights, \"Microsoft namespace exists\");\n                Assert.equal(false, defineCalled, \"Validate that define was not called\");\n\n                this._validateExpectedExports(microsoft.ApplicationInsights);\n            } else if (format === CdnFormat.CommonJs) {\n                // There is no namespace for common js\n                let microsoft: any = hostValues.global[\"Microsoft\"];\n                Assert.equal(undefined, microsoft, \"global Microsoft namespace does not exists\");\n                Assert.equal(false, defineCalled, \"Validate that define was not called\");\n\n                this._validateExpectedExports(hostValues.exports);\n            }\n        } catch (e) {\n            Assert.ok(false, dumpObj(e));\n        } finally {\n            if (orgExports) {\n                exports = orgExports;\n            } else {\n                exports = undefined;\n            }\n\n            if (orgDefine) {\n                define = orgDefine;\n            } else {\n                define = undefined;\n            }\n        }\n    }\n\n    private _checkPackaging(cdnPackage: string, format: CdnFormat): void {\n        let fileName = cdnPackage.split(\"..\")[1];\n        this.testCase({\n            name: `Test AISKU Cdn packaging - ${fileName}`,\n            test: () => {\n                Assert.ok(true, `test file: ${fileName}`);\n                let request = new Request(cdnPackage, {method:\"GET\"});\n                return fetch(request).then((response) => {\n                    if (!response.ok) {\n                        Assert.ok(false, `fetch bundle AISKU ${fileName} error: ${response.statusText}`);\n                        return;\n                    } else {\n                        return response.text().then(text => {\n                            // Wrap in a closure so the global space is not polluted\n                            text = \"(function(values) {\\n\" +\n                                \"function init(hostValues) {\\n\" +\n                                    \"console.log(\\\"initializing\\\");\" + \n                                    \"console.log(JSON.stringify(this));\\n\" +\n                                    \"let globalThis = hostValues.globalThis;\\n\" +\n                                    \"let exports = hostValues.exports;\\n\" +\n                                    \"let module = hostValues.module;\\n\" +\n                                    \"let define = hostValues.define;\\n\" +\n                                    \"let self = hostValues.global;\\n\" +\n                                    \"console.log(\\\"Now running CDN script\\\");\" + \n                                    text + \"\\n\" +\n                                    \"}\\n\" +\n                                    \"init.apply(values.global, [values]);\\n\" +\n                                \"})(this._hostValues)\";\n\n                            this._validateExportsAsModule(text, format);\n                            this._validateGlobalExports(text, format);\n                            this._validateExportsAsDefine(text, format);\n                            this._validateExportsAsAmdDefine(text, format);\n                        }).catch((error: Error) => {\n                            Assert.ok(false, `AISKU bundle ${fileName} response error: ${error}`);\n                        });\n                    }\n                }).catch((error: Error) => {\n                    Assert.ok(false, `AISKU bundle ${fileName} deflate size error: ${error}`);\n                });\n            }\n        });\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/CdnThrottle.tests.ts",
    "content": "import { ApplicationInsights, ApplicationInsightsContainer, IApplicationInsights, IConfig, IConfiguration, LoggingSeverity, Snippet, _eInternalMessageId } from '../../../src/applicationinsights-web'\nimport { AITestClass, Assert, IFetchArgs, PollingAssert} from '@microsoft/ai-test-framework';\nimport { IThrottleInterval, IThrottleLimit, IThrottleMgrConfig } from '@microsoft/applicationinsights-core-js';\nimport { SinonSpy } from 'sinon';\nimport { AppInsightsSku } from '../../../src/AISku';\nimport { createSnippetV5 } from './testSnippetV5';\nimport { CdnFeatureMode, FeatureOptInMode, getGlobal, getGlobalInst, isFunction, newId } from '@microsoft/applicationinsights-core-js';\nimport { createSnippetV6 } from './testSnippetV6';\nimport { CfgSyncPlugin, ICfgSyncConfig, ICfgSyncMode } from '@microsoft/applicationinsights-cfgsync-js';\nimport { createSyncPromise, doAwait } from '@nevware21/ts-async';\nimport { ICfgSyncCdnConfig } from '@microsoft/applicationinsights-cfgsync-js/src/Interfaces/ICfgSyncCdnConfig';\n\n\nconst TestInstrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n\nconst default_throttle_config = {\n    disabled: true,\n    limit: {\n        samplingRate: 100,\n        maxSendNumber: 1\n    },\n    interval: {\n        monthInterval: 3,\n        daysOfMonth: [28]\n    }\n} as IThrottleMgrConfig;\n\nconst throttleCfg = {\n    109: { \n        disabled: false,\n        limit: { \n            samplingRate: 1000000,\n            maxSendNumber: 2\n        },\n        interval: {\n            monthInterval: 2,\n            daysOfMonth:[1]\n        }\n    },\n    106: { \n        disabled: false,\n        limit: { \n            samplingRate: 1000000,\n            maxSendNumber: 2\n        },\n        interval: {\n            monthInterval: 2,\n            daysOfMonth:[1]\n        }\n    }\n}\n\nconst throttleCfgDisable = {\n    109: { \n        disabled: true,\n        limit: { \n            samplingRate: 1000000,\n            maxSendNumber: 4\n        },\n        interval: {\n            monthInterval: 4,\n            daysOfMonth:[1]\n        }\n    },\n    106: { \n        disabled: true,\n        limit: { \n            samplingRate: 1000000,\n            maxSendNumber: 4\n        },\n        interval: {\n            monthInterval: 4,\n            daysOfMonth:[1]\n        }\n    }\n}\n\nconst sampleConfig = {\n    instrumentationKey:\"testIkey\",\n    enableAjaxPerfTracking: true,\n    throttleMgrCfg: throttleCfg\n} as IConfiguration & IConfig;\n\n\nexport class CdnThrottle extends AITestClass {\n    private _ai: AppInsightsSku;\n    private getAi: ApplicationInsights;\n    private _config: IConfiguration | IConfig;\n    private identifier: string;\n    private fetchStub: any;\n    init: ApplicationInsights;\n    private res: any;\n    private _fetch: any;\n    loggingSpy: any;\n\n    constructor() {\n        super(\"CdnThrottle\");\n    }\n\n    public _getTestConfig() {\n        let config: IConfiguration | IConfig = {\n            instrumentationKey: TestInstrumentationKey,\n            featureOptIn : {[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}},\n            extensionConfig : {[\"AppInsightsCfgSyncPlugin\"] :  {\n                syncMode: ICfgSyncMode.Receive,\n                cfgUrl: \"testurl\"\n            }}\n        };\n        return config;\n    }\n\n    public testInitialize() {\n        try {\n            if (window.localStorage){\n                window.localStorage.clear();\n            }\n            this.identifier = \"AppInsightsCfgSyncPlugin\";\n            this._config = this._getTestConfig();\n            this._fetch = getGlobalInst(\"fetch\");\n            let doc = getGlobal();\n            let cdnCfg = {\n                enabled: true,\n                config: sampleConfig\n            } as ICfgSyncConfig;\n            let cdnFeatureOptInCfg = {\n                enabled: true,\n                featureOptIn:{\n                    [\"enableWParamFeature\"]: {mode: CdnFeatureMode.enable, onCfg: {[\"maxMessageLimit\"]: 11}, offCfg: {[\"maxMessageLimit\"]: 12}},\n                    [\"iKeyUsage\"]: {\n                    mode: CdnFeatureMode.enable,\n                    onCfg: {\n                        \"throttleMgrCfg.106.disabled\":false,\n                        \"throttleMgrCfg.109.disabled\":false,\n                    },\n                    offCfg: {\n                        \"throttleMgrCfg.106.disabled\":true,\n                        \"throttleMgrCfg.109.disabled\":true,\n                    }},\n                    [\"zipPayload\"]: {\n                        mode: CdnFeatureMode.enable},\n                },\n                config: {\n                    maxMessageLimit: 10,\n                    throttleMgrCfg: throttleCfgDisable,\n                    \n                }\n            } as ICfgSyncConfig;\n            doc[\"res\"] = new (doc as any).Response(JSON.stringify(cdnCfg), {\n                status: 200,\n                headers: { \"Content-type\": \"application/json\" }\n            });\n            doc[\"res2\"] = new (doc as any).Response(JSON.stringify(cdnFeatureOptInCfg), {\n                status: 200,\n                headers: { \"Content-type\": \"application/json\" }\n            });\n        } catch (e) {\n            console.error('Failed to initialize', e.message);\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ai) {\n            this._ai.unload(false);\n        }   \n        this.fetchStub = null;\n        getGlobal().fetch = this._fetch;\n        if (window.localStorage){\n            window.localStorage.clear();\n        }\n    }\n\n    public registerTests() {\n        \n        this.testCase({\n            name: \"CfgSyncPlugin: customer enable ikey messsage change, new config fetch from config url overwrite throttle setting and send message\",\n            useFakeTimers: true,\n            test: () => {\n                let doc = getGlobal();\n                hookFetch((resolve) => { // global instance cannot access test private instance\n                    AITestClass.orgSetTimeout(function() {\n                        resolve( doc[\"res\"]);\n                    }, 0);\n                });\n                this.fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this.init = new ApplicationInsights({\n                    config:   {\n                        instrumentationKey: TestInstrumentationKey,\n                        featureOptIn : {[\"iKeyUsage\"]: {mode: FeatureOptInMode.disable}},\n                        extensionConfig : {[\"AppInsightsCfgSyncPlugin\"] :  {\n                            syncMode: ICfgSyncMode.Receive,\n                            cfgUrl: \"testurl\"\n                        }}\n                    }\n                });\n                this.init.loadAppInsights();\n                this._ai = this.init;\n                let core = this._ai['core'];\n                let _logger = core.logger;\n                this.loggingSpy = this.sandbox.stub(_logger, 'throwInternal');\n                \n                return this._asyncQueue().add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.fetchStub.called){\n                      \n                        Assert.equal(this.loggingSpy.called, 0);\n\n                        // now enable feature\n                        this.init.config.featureOptIn = {[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}}\n                        \n                        this.clock.tick(1);\n                        return true;\n                    }\n                    return false;\n                    \n                }, \"response received\", 60, 1000)).add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.loggingSpy.called){\n                        Assert.equal(this.loggingSpy.called, 1);\n                        Assert.equal(_eInternalMessageId.InstrumentationKeyDeprecation, this.loggingSpy.args[0][1]);\n                        let message= this.loggingSpy.args[0][2];\n                        Assert.ok(message.includes(\"Instrumentation key\"));\n                        return true;\n                    }\n                    return false;\n                    \n                }, \"response received\", 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: customer didn't set throttle config, successfully fetch from config url\",\n            useFakeTimers: true,\n            test: () => {\n                let doc = getGlobal();\n                hookFetch((resolve) => { // global instance cannot access test private instance\n                    AITestClass.orgSetTimeout(function() {\n                        resolve( doc[\"res\"]);\n                    }, 0);\n                });\n\n                this.fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this.init = new ApplicationInsights({\n                    config: this._config,\n                });\n                this.init.loadAppInsights();\n                this._ai = this.init;\n                \n                return this._asyncQueue().add(PollingAssert.asyncTaskPollingAssert(() => {\n       \n                    if (this.fetchStub.called){\n                        let plugin = this._ai.appInsights['core'].getPlugin<CfgSyncPlugin>(this.identifier).plugin;\n                        let newCfg = plugin.getCfg();\n                        Assert.equal(JSON.stringify(newCfg.throttleMgrCfg), JSON.stringify(sampleConfig.throttleMgrCfg));\n                        // cdn should not be changed\n                        let cdnCfg = this.init.config.throttleMgrCfg[_eInternalMessageId.CdnDeprecation];\n                        Assert.equal(JSON.stringify(cdnCfg), JSON.stringify(default_throttle_config));\n                        return true;\n                    }\n                    return false;\n                    \n                }, \"response received\", 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: customer didn't set feature opt in, successfully get aisku default and fetch from config url, get disable zip config to be true\",\n            useFakeTimers: true,\n            test: () => {\n                let doc = getGlobal();\n                hookFetch((resolve) => { // global instance cannot access test private instance\n                    AITestClass.orgSetTimeout(function() {\n                        resolve( doc[\"res2\"]);\n                    }, 0);\n                });\n\n                let noSetconfig = {\n                    instrumentationKey: TestInstrumentationKey,\n                    extensionConfig : {[\"AppInsightsCfgSyncPlugin\"] :  {\n                        syncMode: ICfgSyncMode.Receive,\n                        cfgUrl: \"testurl\"\n                    }}\n                };\n\n                this.fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this.init = new ApplicationInsights({\n                    config: noSetconfig,\n                });\n                this.init.loadAppInsights();\n                this._ai = this.init;\n                \n                return this._asyncQueue().add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.fetchStub.called){\n                        this.clock.tick(1)\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000)).add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.fetchStub.called){\n                        let newCfg = this._ai.config;\n                        this.clock.tick(1)\n                        Assert.equal(newCfg.featureOptIn[\"zipPayload\"][\"mode\"], FeatureOptInMode.enable); // aisku default is none, overwrite to true by cdn config\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: customer set throttle config, new config fetch from config url could overwrite original one\",\n            useFakeTimers: true,\n            test: () => {\n                let doc = getGlobal();\n                hookFetch((resolve) => { // global instance cannot access test private instance\n                    AITestClass.orgSetTimeout(function() {\n                        resolve( doc[\"res\"]);\n                    }, 0);\n                });\n\n                this.fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                let config =  {\n                    instrumentationKey: TestInstrumentationKey,\n                    featureOptIn : {[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}},\n                    throttleMgrCfg: {\n                        109: { \n                            disabled: false,\n                            limit: { \n                                samplingRate: 50,\n                                maxSendNumber: 1\n                            },\n                            interval: {\n                                daysOfMonth:[1],\n                                monthInterval: 1\n                            }\n                        }\n                    },\n                    extensionConfig : {[\"AppInsightsCfgSyncPlugin\"] :  {\n                        syncMode: ICfgSyncMode.Receive,\n                        cfgUrl: \"testurl\"\n                    }}\n                };\n                \n                this.init = new ApplicationInsights({\n                    config: config,\n                });\n                this.init.loadAppInsights();\n                this._ai = this.init;\n                \n                return this._asyncQueue().add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.fetchStub.called){\n                        this.clock.tick(1)\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000)).add(PollingAssert.asyncTaskPollingAssert(() => {\n       \n                    if (this.fetchStub.called){\n                        let plugin = this._ai.appInsights['core'].getPlugin<CfgSyncPlugin>(this.identifier).plugin;\n                        let newCfg = plugin.getCfg();\n                        Assert.equal(JSON.stringify(newCfg.throttleMgrCfg), JSON.stringify(sampleConfig.throttleMgrCfg));\n                        // cdn should not be overwritten\n                        let cdnCfg = this.init.config.throttleMgrCfg[_eInternalMessageId.CdnDeprecation];\n                        Assert.equal(JSON.stringify(cdnCfg), JSON.stringify(default_throttle_config));\n                        let ikeyCfg = this.init.config.throttleMgrCfg[_eInternalMessageId.InstrumentationKeyDeprecation];\n                        Assert.equal(JSON.stringify(ikeyCfg), JSON.stringify(sampleConfig.throttleMgrCfg[_eInternalMessageId.InstrumentationKeyDeprecation]));\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: customer enable feature opt in, then the config in cdn feature opt in is applied\",\n            useFakeTimers: true,\n            test: () => {\n                let doc = getGlobal();\n                hookFetch((resolve) => { // global instance cannot access test private instance\n                    AITestClass.orgSetTimeout(function() {\n                        resolve( doc[\"res2\"]);\n                    }, 0);\n                });\n                this.fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this.init = new ApplicationInsights({\n                    config:   {\n                        instrumentationKey: TestInstrumentationKey,\n                        extensionConfig : {[\"AppInsightsCfgSyncPlugin\"] :  {\n                            syncMode: ICfgSyncMode.Receive,\n                            cfgUrl: \"testurl\"\n                        }},\n                        featureOptIn : {[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}, \n                            [\"enableWParamFeature\"]: {mode: FeatureOptInMode.enable}}\n                    }\n                });\n                this.init.loadAppInsights();\n                this._ai = this.init;\n                \n                return this._asyncQueue().add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.fetchStub.called){\n                        this.clock.tick(1)\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000)).add(PollingAssert.asyncTaskPollingAssert(() => {\n       \n                    if (this.fetchStub.called){\n                        Assert.equal(this.init.config.throttleMgrCfg[_eInternalMessageId.InstrumentationKeyDeprecation].disabled, false);\n                        Assert.equal(this.init.config.throttleMgrCfg[_eInternalMessageId.CdnDeprecation].disabled, true);\n                        Assert.equal(this.init.config.throttleMgrCfg[_eInternalMessageId.InstrumentationKeyDeprecation].limit?.maxSendNumber, throttleCfgDisable[_eInternalMessageId.InstrumentationKeyDeprecation].limit?.maxSendNumber);\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: customer disable feature opt in, the origin config on cdn will apply\",\n            useFakeTimers: true,\n            test: () => {\n                let doc = getGlobal();\n                hookFetch((resolve) => { // global instance cannot access test private instance\n                    AITestClass.orgSetTimeout(function() {\n                        resolve( doc[\"res2\"]);\n                    }, 0);\n                });\n                this.fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this.init = new ApplicationInsights({\n                    config:   {\n                        instrumentationKey: TestInstrumentationKey,\n                        extensionConfig : {[\"AppInsightsCfgSyncPlugin\"] :  {\n                            syncMode: ICfgSyncMode.Receive,\n                            cfgUrl: \"testurl\"\n                        }},\n                        featureOptIn : {\n                            [\"enableWParamFeature\"]: {mode: FeatureOptInMode.enable}}\n                    }\n                });\n                this.init.loadAppInsights();\n                this._ai = this.init;\n                \n                return this._asyncQueue().add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.fetchStub.called){\n                        this.clock.tick(1)\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000)).add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.fetchStub.called){\n                        Assert.equal(this.init.config.throttleMgrCfg[_eInternalMessageId.InstrumentationKeyDeprecation].disabled, true);\n                        Assert.equal(this.init.config.throttleMgrCfg[_eInternalMessageId.CdnDeprecation].disabled, true);\n                        Assert.equal(this.init.config.throttleMgrCfg[_eInternalMessageId.InstrumentationKeyDeprecation].limit?.maxSendNumber, throttleCfgDisable[_eInternalMessageId.InstrumentationKeyDeprecation].limit?.maxSendNumber);\n                        return true;\n                    }\n                    return false;\n                }, \"response received\", 60, 1000) as any);\n            }\n        });\n       \n       \n    }\n}\n\nfunction hookFetch<T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): IFetchArgs[] {\n    let calls:IFetchArgs[] = [];\n    let global = getGlobal() as any;\n    global.fetch = function(input: RequestInfo, init?: RequestInit) {\n        calls.push({\n            input,\n            init\n        });\n        return createSyncPromise(executor);\n    }\n\n    return calls;\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/IAnalyticsConfig.Tests.ts",
    "content": "import { ApplicationInsights, IAnalyticsConfig, IAppInsights, IConfig, ApplicationAnalytics } from \"../../../src/applicationinsights-web\";\nimport { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { AnalyticsPluginIdentifier, utlRemoveSessionStorage } from \"@microsoft/applicationinsights-core-js\";\nimport { AppInsightsCore, IConfiguration, isFunction, onConfigChange } from \"@microsoft/applicationinsights-core-js\";\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\";\n\nconst TestInstrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n\nexport class IAnalyticsConfigTests extends AITestClass {\n\n    public testInitialize() {\n        this._disableDynProtoBaseFuncs();\n    }\n\n    public testCleanup() {\n        // Clean up session storage\n        utlRemoveSessionStorage(null as any, \"AI_sentBuffer\");\n        utlRemoveSessionStorage(null as any, \"AI_buffer\");\n    }\n\n    public registerTests() {\n        \n        this.testCase({\n            name: \"IAnalyticsConfig: Interface compatibility with existing functionality\",\n            test: () => {\n                // Test that the interface doesn't break existing functionality\n                // Use root configuration (IConfiguration) for ApplicationInsights initialization\n                const init = new ApplicationInsights({\n                    config: {\n                        instrumentationKey: TestInstrumentationKey\n                    }\n                });\n                this.onDone(() => {\n                    if (init && init.unload) {\n                        init.unload(false);\n                    }\n                });\n                init.loadAppInsights();\n                \n                // These should work as before\n                Assert.ok(isFunction(init.trackEvent), \"trackEvent should be available\");\n                Assert.ok(isFunction(init.trackPageView), \"trackPageView should be available\");\n                Assert.ok(isFunction(init.trackException), \"trackException should be available\");\n                Assert.ok(isFunction(init.trackTrace), \"trackTrace should be available\");\n                Assert.ok(isFunction(init.trackMetric), \"trackMetric should be available\");\n                Assert.ok(isFunction(init.trackDependencyData), \"trackDependencyData should be available\");\n            }\n        });\n\n        this.testCase({\n            name: \"IAnalyticsConfig: onConfigChange integration test\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: IConfiguration & IConfig = {\n                    instrumentationKey: TestInstrumentationKey,\n                    samplingPercentage: 50\n                };\n\n                const core = new AppInsightsCore();\n                const init = new ApplicationInsights({\n                    config: theConfig\n                });\n                this.onDone(() => {\n                    if (init && init.unload) {\n                        init.unload(false);\n                    }\n                });\n                \n                init.loadAppInsights();\n                let onChangeCalled = 0;\n                let expectedSamplingPercentage = 50;\n                \n                let handler = onConfigChange(theConfig, (details) => {\n                    onChangeCalled++;\n                    Assert.equal(TestInstrumentationKey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    if (details.cfg.samplingPercentage !== undefined) {\n                        Assert.equal(expectedSamplingPercentage, details.cfg.samplingPercentage, \"Expect the sampling percentage to be set\");\n                    }\n                });\n\n                // Initial call should happen\n                Assert.equal(1, onChangeCalled, \"OnCfgChange was called exactly once initially\");\n                let initialCallCount = onChangeCalled;\n\n                // Change a config value\n                expectedSamplingPercentage = 75;\n                (theConfig as any).samplingPercentage = expectedSamplingPercentage;\n\n                // Wait for the change to propagate\n                this.clock.tick(1);\n                Assert.ok(onChangeCalled > initialCallCount, \"Expected the onChanged was called when config changed\");\n\n                // Remove the handler\n                handler.rm();\n                let callCountBeforeRemoval = onChangeCalled;\n                \n                expectedSamplingPercentage = 25;\n                (theConfig as any).samplingPercentage = expectedSamplingPercentage;\n\n                this.clock.tick(1);\n                Assert.equal(callCountBeforeRemoval, onChangeCalled, \"Expected the onChanged was not called after handler removal\");\n            }\n        });\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/NonRecordingSpan.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/applicationinsights-web\";\nimport { eOTelSpanKind, eOTelSpanStatusCode, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Comprehensive tests for non-recording span behavior\n * \n * Non-recording spans are used for:\n * - Context propagation without telemetry overhead\n * - Testing and debugging scenarios\n * - Wrapping external span contexts\n * - Performance-sensitive scenarios\n */\nexport class NonRecordingSpanTests extends AITestClass {\n    private static readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private static readonly _connectionString = `InstrumentationKey=${NonRecordingSpanTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"NonRecordingSpanTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: NonRecordingSpanTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n        } catch (e) {\n            console.error(\"Failed to initialize tests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addBasicNonRecordingTests();\n        this.addAttributeOperationTests();\n        this.addStatusAndNameTests();\n        this.addSpanKindTests();\n        this.addHierarchyTests();\n        this.addTelemetryGenerationTests();\n        this.addPerformanceTests();\n        this.addEdgeCaseTests();\n    }\n\n    private addBasicNonRecordingTests(): void {\n        this.testCase({\n            name: \"NonRecording: span created with recording:false is not recording\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"non-recording-basic\", { recording: false });\n\n                // Assert\n                Assert.ok(span, \"Span should be created\");\n                Assert.ok(!span.isRecording(), \"Span should not be recording\");\n                Assert.equal(span.name, \"non-recording-basic\", \"Span name should be set\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: default recording:true creates recording span\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"recording-default\");\n\n                // Assert\n                Assert.ok(span, \"Span should be created\");\n                Assert.ok(span.isRecording(), \"Span should be recording by default\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: explicit recording:true creates recording span\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"recording-explicit\", { recording: true });\n\n                // Assert\n                Assert.ok(span, \"Span should be created\");\n                Assert.ok(span.isRecording(), \"Span should be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: isRecording() returns false throughout lifecycle\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-lifecycle\", { recording: false });\n\n                // Act & Assert - Before operations\n                Assert.ok(!span.isRecording(), \"Should not be recording initially\");\n\n                // Perform operations\n                span!.setAttribute(\"key\", \"value\");\n                Assert.ok(!span.isRecording(), \"Should not be recording after setAttribute\");\n\n                span!.setStatus({ code: eOTelSpanStatusCode.OK });\n                Assert.ok(!span.isRecording(), \"Should not be recording after setStatus\");\n\n                span!.updateName(\"new-name\");\n                Assert.ok(!span.isRecording(), \"Should not be recording after updateName\");\n\n                span!.end();\n                Assert.ok(!span.isRecording(), \"Should not be recording after end\");\n            }\n        });\n    }\n\n    private addAttributeOperationTests(): void {\n        this.testCase({\n            name: \"NonRecording: setAttribute does not store attributes\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-attrs\", { recording: false });\n\n                // Act\n                span!.setAttribute(\"key1\", \"value1\");\n                span!.setAttribute(\"key2\", 123);\n                span!.setAttribute(\"key3\", true);\n\n                // Assert\n                const attrs = span!.attributes;\n                Assert.ok(attrs, \"Attributes object should exist\");\n                // Non-recording spans don't store attributes\n                Assert.equal(Object.keys(attrs).length, 0, \"No attributes should be stored\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: setAttributes does not store attributes\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-set-attrs\", { recording: false });\n\n                // Act\n                span!.setAttributes({\n                    \"attr1\": \"value1\",\n                    \"attr2\": 456,\n                    \"attr3\": false,\n                    \"attr4\": [1, 2, 3]\n                });\n\n                // Assert\n                const attrs = span!.attributes;\n                Assert.equal(Object.keys(attrs).length, 0, \"No attributes should be stored\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: setAttribute returns span for chaining\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-chain\", { recording: false });\n\n                // Act\n                const result = span!.setAttribute(\"key\", \"value\");\n\n                // Assert\n                Assert.equal(result, span, \"setAttribute should return the span for chaining\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: setAttributes returns span for chaining\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-chain-multi\", { recording: false });\n\n                // Act\n                const result = span!.setAttributes({ \"key1\": \"value1\", \"key2\": \"value2\" });\n\n                // Assert\n                Assert.equal(result, span, \"setAttributes should return the span for chaining\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: multiple setAttribute calls increment dropped count\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-dropped\", { recording: false });\n\n                // Act\n                span!.setAttribute(\"key1\", \"value1\");\n                span!.setAttribute(\"key2\", \"value2\");\n                span!.setAttribute(\"key3\", \"value3\");\n                span!.setAttributes({ \"key4\": \"value4\", \"key5\": \"value5\" });\n\n                // Assert\n                const droppedCount = span!.droppedAttributesCount;\n                Assert.ok(droppedCount >= 5, `At least 5 attributes should be dropped, got ${droppedCount}`);\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: setAttribute after end() increments dropped count\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-after-end\", { recording: false });\n                span!.end();\n\n                // Act\n                span!.setAttribute(\"late-key\", \"late-value\");\n\n                // Assert - Should not throw, just increment dropped count\n                Assert.ok(span.ended, \"Span should be ended\");\n                Assert.ok(span.droppedAttributesCount > 0, \"Dropped attribute count should be incremented\");\n            }\n        });\n    }\n\n    private addStatusAndNameTests(): void {\n        this.testCase({\n            name: \"NonRecording: setStatus changes status even when not recording\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-status\", { recording: false });\n\n                // Act\n                span!.setStatus({ code: eOTelSpanStatusCode.ERROR, message: \"Test error\" });\n\n                // Assert\n                Assert.equal(span.status.code, eOTelSpanStatusCode.ERROR, \"Status code should be set\");\n                Assert.equal(span.status.message, \"Test error\", \"Status message should be set\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: setStatus returns span for chaining\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-status-chain\", { recording: false });\n\n                // Act\n                const result = span!.setStatus({ code: eOTelSpanStatusCode.OK });\n\n                // Assert\n                Assert.equal(result, span, \"setStatus should return the span for chaining\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: updateName changes name even when not recording\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"original-name\", { recording: false });\n\n                // Act\n                span!.updateName(\"updated-name\");\n\n                // Assert\n                Assert.equal(span.name, \"updated-name\", \"Name should be updated\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: updateName returns span for chaining\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"chain-name\", { recording: false });\n\n                // Act\n                const result = span!.updateName(\"new-chain-name\");\n\n                // Assert\n                Assert.equal(result, span, \"updateName should return the span for chaining\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: chained operations work correctly\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"chaining-test\", { recording: false });\n\n                // Act\n                const result = span\n                    .setAttribute(\"key1\", \"value1\")\n                    .setAttributes({ \"key2\": \"value2\" })\n                    .setStatus({ code: eOTelSpanStatusCode.OK })\n                    .updateName(\"chained-name\");\n\n                // Assert\n                Assert.equal(result, span, \"All operations should return the span\");\n                Assert.equal(span.name, \"chained-name\", \"Name should be updated\");\n                Assert.equal(span.status.code, eOTelSpanStatusCode.OK, \"Status should be set\");\n            }\n        });\n    }\n\n    private addSpanKindTests(): void {\n        this.testCase({\n            name: \"NonRecording: CLIENT kind non-recording span\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"client-non-recording\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    recording: false\n                });\n\n                // Assert\n                Assert.ok(span, \"Span should be created\");\n                Assert.equal(span.kind, eOTelSpanKind.CLIENT, \"Kind should be CLIENT\");\n                Assert.ok(!span.isRecording(), \"Should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: SERVER kind non-recording span\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"server-non-recording\", {\n                    kind: eOTelSpanKind.SERVER,\n                    recording: false\n                });\n\n                // Assert\n                Assert.equal(span.kind, eOTelSpanKind.SERVER, \"Kind should be SERVER\");\n                Assert.ok(!span.isRecording(), \"Should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: INTERNAL kind non-recording span\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"internal-non-recording\", {\n                    kind: eOTelSpanKind.INTERNAL,\n                    recording: false\n                });\n\n                // Assert\n                Assert.equal(span.kind, eOTelSpanKind.INTERNAL, \"Kind should be INTERNAL\");\n                Assert.ok(!span.isRecording(), \"Should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: PRODUCER kind non-recording span\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"producer-non-recording\", {\n                    kind: eOTelSpanKind.PRODUCER,\n                    recording: false\n                });\n\n                // Assert\n                Assert.equal(span.kind, eOTelSpanKind.PRODUCER, \"Kind should be PRODUCER\");\n                Assert.ok(!span.isRecording(), \"Should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: CONSUMER kind non-recording span\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"consumer-non-recording\", {\n                    kind: eOTelSpanKind.CONSUMER,\n                    recording: false\n                });\n\n                // Assert\n                Assert.equal(span.kind, eOTelSpanKind.CONSUMER, \"Kind should be CONSUMER\");\n                Assert.ok(!span.isRecording(), \"Should not be recording\");\n            }\n        });\n    }\n\n    private addHierarchyTests(): void {\n        this.testCase({\n            name: \"NonRecording: parent recording, child non-recording\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"recording-parent\", { \n                    kind: eOTelSpanKind.SERVER,\n                    recording: true \n                });\n                const parentContext = parentSpan!.spanContext();\n\n                // Act\n                const childSpan = this._ai.startSpan(\"non-recording-child\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    recording: false\n                }, parentContext);\n\n                // Assert\n                Assert.ok(parentSpan!.isRecording(), \"Parent should be recording\");\n                Assert.ok(!childSpan.isRecording(), \"Child should not be recording\");\n                Assert.equal(childSpan!.spanContext().traceId, parentContext.traceId, \n                    \"Child should share parent's trace ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: parent non-recording, child recording\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"non-recording-parent\", { \n                    kind: eOTelSpanKind.SERVER,\n                    recording: false \n                });\n                const parentContext = parentSpan!.spanContext();\n\n                // Act\n                const childSpan = this._ai.startSpan(\"recording-child\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    recording: true\n                }, parentContext);\n\n                // Assert\n                Assert.ok(!parentSpan.isRecording(), \"Parent should not be recording\");\n                Assert.ok(childSpan!.isRecording(), \"Child should be recording\");\n                Assert.equal(childSpan!.spanContext().traceId, parentContext.traceId, \n                    \"Child should share parent's trace ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: both parent and child non-recording\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"non-recording-parent-2\", { \n                    recording: false \n                });\n                const parentContext = parentSpan!.spanContext();\n\n                // Act\n                const childSpan = this._ai.startSpan(\"non-recording-child-2\", {\n                    recording: false\n                }, parentContext);\n\n                // Assert\n                Assert.ok(!parentSpan.isRecording(), \"Parent should not be recording\");\n                Assert.ok(!childSpan.isRecording(), \"Child should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: multi-level hierarchy with mixed recording\",\n            test: () => {\n                // Arrange\n                const level1 = this._ai.startSpan(\"level1-recording\", { recording: true });\n                const level1Context = level1!.spanContext();\n\n                const level2 = this._ai.startSpan(\"level2-non-recording\", {\n                    recording: false\n                }, level1Context);\n                const level2Context = level2!.spanContext();\n\n                const level3 = this._ai.startSpan(\"level3-recording\", {\n                    recording: true\n                }, level2Context);\n\n                // Assert\n                Assert.ok(level1!.isRecording(), \"Level 1 should be recording\");\n                Assert.ok(!level2.isRecording(), \"Level 2 should not be recording\");\n                Assert.ok(level3!.isRecording(), \"Level 3 should be recording\");\n\n                // All should share the same trace ID\n                Assert.equal(level2!.spanContext().traceId, level1Context.traceId, \n                    \"Level 2 should share trace ID\");\n                Assert.equal(level3!.spanContext().traceId, level1Context.traceId, \n                    \"Level 3 should share trace ID\");\n            }\n        });\n    }\n\n    private addTelemetryGenerationTests(): void {\n        this.testCase({\n            name: \"NonRecording: no telemetry generated on end()\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n\n                // Act\n                const span = this._ai.startSpan(\"non-recording-no-telemetry\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    recording: false\n                });\n                span!.setAttribute(\"should-not-appear\", \"in-telemetry\");\n                span!.setStatus({ code: eOTelSpanStatusCode.OK });\n                span!.end();\n\n                // Assert\n                const telemetryItem = this._trackCalls.find(\n                    item => item.baseData?.name === \"non-recording-no-telemetry\"\n                );\n                Assert.ok(!telemetryItem, \"Non-recording span should not generate telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: recording span generates telemetry, non-recording does not\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n\n                // Act\n                const recordingSpan = this._ai.startSpan(\"recording-generates\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    recording: true\n                });\n                recordingSpan.end();\n\n                const nonRecordingSpan = this._ai.startSpan(\"non-recording-silent\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    recording: false\n                });\n                nonRecordingSpan.end();\n\n                // Assert\n                const recordingTelemetry = this._trackCalls.find(\n                    item => item.baseData?.name === \"recording-generates\"\n                );\n                const nonRecordingTelemetry = this._trackCalls.find(\n                    item => item.baseData?.name === \"non-recording-silent\"\n                );\n\n                Assert.ok(recordingTelemetry, \"Recording span should generate telemetry\");\n                Assert.ok(!nonRecordingTelemetry, \"Non-recording span should not generate telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: parent recording generates telemetry, child non-recording does not\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n\n                // Act\n                const parent = this._ai.startSpan(\"parent-with-telemetry\", {\n                    kind: eOTelSpanKind.SERVER,\n                    recording: true\n                });\n                const parentContext = parent.spanContext();\n\n                const child = this._ai.startSpan(\"child-without-telemetry\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    recording: false\n                }, parentContext);\n\n                child.end();\n                parent.end();\n\n                // Assert\n                const parentTelemetry = this._trackCalls.find(\n                    item => item.baseData?.name === \"parent-with-telemetry\"\n                );\n                const childTelemetry = this._trackCalls.find(\n                    item => item.baseData?.name === \"child-without-telemetry\"\n                );\n\n                Assert.ok(parentTelemetry, \"Parent recording span should generate telemetry\");\n                Assert.ok(!childTelemetry, \"Child non-recording span should not generate telemetry\");\n            }\n        });\n    }\n\n    private addPerformanceTests(): void {\n        this.testCase({\n            name: \"NonRecording: multiple non-recording spans minimal overhead\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const spanCount = 100;\n\n                // Act\n                const startTime = Date.now();\n                for (let i = 0; i < spanCount; i++) {\n                    const span = this._ai.startSpan(`non-recording-perf-${i}`, {\n                        recording: false\n                    });\n                    span!.setAttribute(\"iteration\", i);\n                    span!.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span!.end();\n                }\n                const elapsed = Date.now() - startTime;\n\n                // Assert\n                Assert.ok(elapsed < 1000, `Creating ${spanCount} non-recording spans should be fast, took ${elapsed}ms`);\n                Assert.equal(this._trackCalls.length, 0, \"No telemetry should be generated for non-recording spans\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: attribute operations are fast on non-recording spans\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"perf-attrs\", { recording: false });\n                const attrCount = 1000;\n\n                // Act\n                const startTime = Date.now();\n                for (let i = 0; i < attrCount; i++) {\n                    span!.setAttribute(`key${i}`, `value${i}`);\n                }\n                const elapsed = Date.now() - startTime;\n\n                // Assert\n                Assert.ok(elapsed < 500, `Setting ${attrCount} attributes should be fast, took ${elapsed}ms`);\n                Assert.equal(Object.keys(span.attributes).length, 0, \"Attributes should not be stored\");\n            }\n        });\n    }\n\n    private addEdgeCaseTests(): void {\n        this.testCase({\n            name: \"NonRecording: end() can be called multiple times safely\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"multi-end\", { recording: false });\n\n                // Act & Assert - Should not throw\n                span!.end();\n                Assert.ok(span.ended, \"Span should be ended\");\n\n                span!.end();\n                Assert.ok(span.ended, \"Span should still be ended\");\n\n                span!.end();\n                Assert.ok(span.ended, \"Span should still be ended\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: operations after end() do not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ops-after-end\", { recording: false });\n                span!.end();\n\n                // Act & Assert - Should not throw\n                span!.setAttribute(\"late-attr\", \"value\");\n                span!.setAttributes({ \"late-attrs\": \"values\" });\n                span!.setStatus({ code: eOTelSpanStatusCode.ERROR });\n                span!.updateName(\"late-name\");\n                \n                Assert.ok(span.ended, \"Span should remain ended\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: null and undefined attribute values handled\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"null-attrs\", { recording: false });\n\n                // Act & Assert - Should not throw\n                span!.setAttribute(\"null-value\", null as any);\n                span!.setAttribute(\"undefined-value\", undefined as any);\n                span!.setAttributes({\n                    \"null-in-set\": null as any,\n                    \"undefined-in-set\": undefined as any\n                });\n\n                Assert.ok(!span.isRecording(), \"Span should still be non-recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: empty string name allowed\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"\", { recording: false });\n\n                // Assert\n                Assert.ok(span, \"Span with empty name should be created\");\n                Assert.equal(span.name, \"\", \"Name should be empty string\");\n                Assert.ok(!span.isRecording(), \"Should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: special characters in span name\",\n            test: () => {\n                // Arrange\n                const specialNames = [\n                    \"span/with/slashes\",\n                    \"span:with:colons\",\n                    \"span-with-dashes\",\n                    \"span.with.dots\",\n                    \"span with spaces\",\n                    \"span\\twith\\ttabs\",\n                    \"span(with)parens\",\n                    \"span[with]brackets\",\n                    \"span{with}braces\"\n                ];\n\n                // Act & Assert\n                specialNames.forEach(name => {\n                    const span = this._ai.startSpan(name, { recording: false });\n                    Assert.ok(span, `Span with name '${name}' should be created`);\n                    Assert.equal(span.name, name, \"Name should be preserved\");\n                    Assert.ok(!span.isRecording(), \"Should not be recording\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: very long span name handled\",\n            test: () => {\n                // Arrange\n                const longName = \"a\".repeat(10000);\n\n                // Act\n                const span = this._ai.startSpan(longName, { recording: false });\n\n                // Assert\n                Assert.ok(span, \"Span with very long name should be created\");\n                Assert.ok(!span.isRecording(), \"Should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: spanContext() returns valid context\",\n            test: () => {\n                // Act\n                const span = this._ai.startSpan(\"context-check\", { recording: false });\n                const context = span!.spanContext();\n\n                // Assert\n                Assert.ok(context, \"Context should exist\");\n                Assert.ok(context.traceId, \"Trace ID should exist\");\n                Assert.ok(context.spanId, \"Span ID should exist\");\n                Assert.ok(context.traceId.length === 32, \"Trace ID should be 32 characters\");\n                Assert.ok(context.spanId.length === 16, \"Span ID should be 16 characters\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecording: status object immutability\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"status-immutable\", { recording: false });\n                span!.setStatus({ code: eOTelSpanStatusCode.OK, message: \"Initial\" });\n\n                // Act\n                const status1 = span!.status;\n                span!.setStatus({ code: eOTelSpanStatusCode.ERROR, message: \"Changed\" });\n                const status2 = span!.status;\n\n                // Assert\n                Assert.equal(status1.code, eOTelSpanStatusCode.OK, \"First status should be OK\");\n                Assert.equal(status2.code, eOTelSpanStatusCode.ERROR, \"Second status should be ERROR\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/OTelInit.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/applicationinsights-web\";\nimport { eOTelSpanKind, eOTelSpanStatusCode, isTracingSuppressed, ITelemetryItem, unsuppressTracing } from \"@microsoft/applicationinsights-core-js\";\nimport { objIs, setBypassLazyCache } from \"@nevware21/ts-utils\";\nimport { AnalyticsPluginIdentifier, PropertiesPluginIdentifier } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Integration Tests for Span APIs with Properties Plugin and Analytics Plugin\n *\n * Tests verify that span telemetry correctly integrates with:\n * - PropertiesPlugin: session, user, device, application context\n * - AnalyticsPlugin: telemetry creation, dependency tracking, page views\n * - Telemetry Initializers: custom property injection\n * - SDK configuration: sampling, disabled tracking, etc.\n */\nexport class OTelInitTests extends AITestClass {\n    private _ai!: ApplicationInsights;\n\n    constructor(testName?: string) {\n        super(testName || \"OTelInitTests\");\n    }\n\n    public testInitialize() {\n        try {\n            setBypassLazyCache(true);\n            this.useFakeServer = true;\n            \n            this._ai = new ApplicationInsights({\n                config: {\n                    instrumentationKey: \"test-ikey-123\",\n                    disableInstrumentationKeyValidation: true,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    disableFetchTracking: false,\n                    enableAutoRouteTracking: false,\n                    disableExceptionTracking: false,\n                    maxBatchInterval: 100,\n                    enableDebug: false,\n                    extensionConfig: {\n                        [\"AppInsightsPropertiesPlugin\"]: {\n                            accountId: \"test-account-id\"\n                        }\n                    },\n                    traceCfg: {\n                        coreTrace: 1\n                    } as any\n                }\n            });\n\n            this._ai.loadAppInsights();\n        } catch (e) {\n            Assert.ok(false, \"Failed to initialize tests: \" + e);\n            console.error(\"Failed to initialize tests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n        setBypassLazyCache(false);\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"OTelInitTests\",\n            test: () => {\n                Assert.ok(this._ai, \"ApplicationInsights instance should be initialized\");\n                Assert.ok(this._ai.getPlugin(PropertiesPluginIdentifier), \"PropertiesPlugin should be loaded\");\n                Assert.ok(this._ai.getPlugin(AnalyticsPluginIdentifier), \"AnalyticsPlugin should be loaded\");\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Tracing should not be suppressed by default\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate OTelApi\",\n            test: () => {\n                const otelApi = this._ai.otelApi;\n                Assert.ok(otelApi, \"OTel API should be available\");\n                Assert.ok(otelApi.cfg, \"OTel configuration should be available\");\n                Assert.ok(objIs(this._ai, otelApi.host), \"OTel API host should be the same as the SKU instance\");\n                Assert.ok(objIs(otelApi.cfg.traceCfg, this._ai.core.config.traceCfg), \"OTel trace configuration should be the same as the SDK config\");\n                Assert.ok(objIs(otelApi.host.config, this._ai.config), \"OTel API config should be the same as the SDK config\");\n                Assert.ok(objIs(otelApi.host.config, this._ai.core.config), \"OTel API config should be the same as the SDK core config\");\n                Assert.ok(objIs(this._ai.config, this._ai.core.config), \"SDK config should be the same as the SDK core config\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate Trace suppression\",\n            test: () => {\n                const otelApi = this._ai.otelApi;\n                Assert.ok(otelApi, \"OTel API should be available\");\n                Assert.equal(false, isTracingSuppressed(this._ai.core), \"Tracing should not be suppressed by default\"); \n                Assert.equal(false, otelApi.cfg.traceCfg?.suppressTracing, \"supressTracing should be false by default\");\n                Assert.equal(false, this._ai.core.config.traceCfg.suppressTracing, \"suppressTracing should be false by default\");\n\n                this._ai.core.config.traceCfg.suppressTracing = true;\n                Assert.equal(true, isTracingSuppressed(this._ai.core), \"Tracing should be suppressed when suppressTracing is set to true\");\n                Assert.equal(true, otelApi.cfg.traceCfg?.suppressTracing, \"supressTracing should be true when suppressTracing is set to true\");\n                Assert.equal(true, this._ai.core.config.traceCfg.suppressTracing, \"suppressTracing should be true when suppressTracing is set to true\");\n\n                unsuppressTracing(this._ai.core);\n                Assert.equal(false, isTracingSuppressed(this._ai.core), \"Tracing should not be suppressed after unsuppressTracing\");\n                Assert.equal(false, this._ai.core.config.traceCfg.suppressTracing, \"suppressTracing should be false by default\");\n                Assert.equal(false, otelApi.cfg.traceCfg?.suppressTracing, \"supressTracing should be false after unsuppressTracing\");\n            }\n        });\n\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SnippetInitialization.Tests.ts",
    "content": "import { ApplicationInsightsContainer } from \"../../../src/ApplicationInsightsContainer\";\nimport { IApplicationInsights } from \"../../../src/IApplicationInsights\";\nimport { Snippet } from \"../../../src/Snippet\";\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\";\nimport { SinonSpy } from \"sinon\";\nimport { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { createSnippetV5 } from \"./testSnippetV5\";\nimport { createSnippetV6 } from \"./testSnippetV6\";\nimport { BaseTelemetryPlugin, IProcessTelemetryContext, isNotNullOrUndefined, ITelemetryItem, newId, objForEachKey } from \"@microsoft/applicationinsights-core-js\";\nimport {\n    BreezeChannelIdentifier, ContextTagKeys, DistributedTracingModes, IConfig, IDependencyTelemetry, RequestHeaders,\n    utlRemoveSessionStorage, utlSetSessionStorage\n} from \"@microsoft/applicationinsights-core-js\";\nimport { getGlobal } from \"@microsoft/applicationinsights-shims\";\nimport { IPropTelemetryContext } from \"@microsoft/applicationinsights-properties-js\";\nimport { dumpObj, isPromiseLike, objHasOwnProperty, strSubstring } from \"@nevware21/ts-utils\";\nimport { AppInsightsSku } from \"../../../src/AISku\";\n\nconst TestInstrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\nconst TestConnectionString = 'InstrumentationKey=b7170927-2d1c-44f1-acec-59f4e1751c11';\n\nconst _expectedBeforeProperties = [\n    \"config\",\n    \"cookie\"\n];\n\nconst _expectedAfterProperties = [\n    \"appInsights\",\n    \"core\",\n    \"context\",\n    \"pluginVersionString\",\n    \"pluginVersionStringArr\"\n];\n\nconst _expectedTrackMethods = [\n    \"startTrackPage\",\n    \"stopTrackPage\",\n    \"trackException\",\n    \"trackEvent\",\n    \"trackMetric\",\n    \"trackPageView\",\n    \"trackTrace\",\n    \"trackDependencyData\",\n    \"setAuthenticatedUserContext\",\n    \"clearAuthenticatedUserContext\",\n    \"trackPageViewPerformance\",\n    \"addTelemetryInitializer\",\n    \"flush\"\n];\n\nconst _expectedMethodsAfterInitialization = [\n    \"getCookieMgr\"\n];\n\nfunction getSnippetConfig(sessionPrefix: string, addSampling: boolean = false) {\n    return {\n        src: \"\",\n        cfg: {\n            connectionString: `InstrumentationKey=${TestInstrumentationKey}`,\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            maxBatchInterval: 500,\n            disableExceptionTracking: false,\n            namePrefix: `sessionPrefix`,\n            enableCorsCorrelation: true,\n            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n            samplingPercentage: addSampling ? 50 : undefined,\n            extensionConfig: {\n                [\"AppInsightsCfgSyncPlugin\"]: {\n                    cfgUrl: \"\"\n                }\n            }\n        } as IConfig\n    };\n};\n\nfunction getSnippetConfigConnectionString(sessionPrefix: string) {\n    return {\n        src: \"\",\n        cfg: {\n            connectionString: TestConnectionString,\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            maxBatchInterval: 500,\n            disableExceptionTracking: false,\n            namePrefix: `sessionPrefix`,\n            enableCorsCorrelation: true,\n            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n            extensionConfig: {\n                [\"AppInsightsCfgSyncPlugin\"]: {\n                    cfgUrl: \"\"\n                }\n            }\n        } as IConfig\n    };\n};\n\nfunction getSnippetConfigWrongConnectionString(sessionPrefix: string) {\n    return {\n        src: \"\",\n        cfg: {\n            connectionString: 'wrong connection string'+TestConnectionString,\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            maxBatchInterval: 500,\n            disableExceptionTracking: false,\n            namePrefix: `sessionPrefix`,\n            enableCorsCorrelation: true,\n            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n            extensionConfig: {\n                [\"AppInsightsCfgSyncPlugin\"]: {\n                    cfgUrl: \"\"\n                }\n            }\n        } as IConfig\n    };\n};\n\nfunction getSnippetConfigNotSetConnectionString(sessionPrefix: string) {\n    return {\n        src: \"\",\n        cfg: {\n            connectionString: '',\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            maxBatchInterval: 500,\n            disableExceptionTracking: false,\n            namePrefix: `sessionPrefix`,\n            enableCorsCorrelation: true,\n            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n            extensionConfig: {\n                [\"AppInsightsCfgSyncPlugin\"]: {\n                    cfgUrl: \"\"\n                }\n            }\n        } as IConfig\n    };\n};\n\nexport class SnippetInitializationTests extends AITestClass {\n\n    // Context \n    private tagKeys = new ContextTagKeys();\n\n    // Sinon\n    private errorSpy: SinonSpy;\n    private successSpy: SinonSpy;\n    private loggingSpy: SinonSpy;\n    private isFetchPolyfill:boolean = false;\n    private sessionPrefix: string = newId();\n    private trackSpy: SinonSpy;\n    private envelopeConstructorSpy: SinonSpy;\n\n    constructor(emulateIe: boolean) {\n        super(\"SnippetInitializationTests\", emulateIe);\n    }\n\n    // Add any new snippet configurations to this map\n    private _theSnippets = {\n        \"v5\": createSnippetV5,\n        \"v6\": createSnippetV6\n    };\n    \n    public testInitialize() {\n        this._disableDynProtoBaseFuncs(); // We need to disable the useBaseInst performance setting as the sinon spy fools the internal logic and the spy is bypassed\n\n        try {\n            this.useFakeServer = true;\n            this.useFakeFetch = true;\n            this.fakeServerAutoRespond = true;\n            this.fakeFetchAutoRespond = true;\n            this.isFetchPolyfill = fetch && fetch[\"polyfill\"];\n\n            console.log(\"* testInitialize()\");\n        } catch (e) {\n            console.error('Failed to initialize', e);\n        }\n    }\n\n    public testCleanup() {\n        utlRemoveSessionStorage(null as any, \"AI_sentBuffer\", );\n        utlRemoveSessionStorage(null as any, \"AI_buffer\", );\n        utlRemoveSessionStorage(null as any, \"sessionPrefix_AI_sentBuffer\", );\n        utlRemoveSessionStorage(null as any, \"sessionPrefix_AI_buffer\", );\n    }\n\n    public registerTests() {\n\n        objForEachKey(this._theSnippets, (snippetName, snippetCreator) => {\n            this.testCase({\n                name: \"[\" + snippetName + \"] check NO support for 1.0 apis\",\n                test: () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix))) as any;\n                    Assert.ok(theSnippet, 'ApplicationInsights SDK exists');\n                    Assert.ok(!(theSnippet as any).downloadAndSetup, \"The [\" + snippetName + \"] snippet should NOT have the downloadAndSetup\"); // has legacy method\n                }\n            });\n\n            this.testCaseAsync({\n                name: \"checkConnectionString\",\n                stepDelay: 100,\n                steps: [\n                    () => {\n                        let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfigConnectionString(this.sessionPrefix)));\n                        theSnippet.trackEvent({ name: 'event', properties: { \"prop1\": \"value1\" }, measurements: { \"measurement1\": 200 } });\n                    }\n                ]\n                .concat(this.asserts(1)).concat(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                       const payload = JSON.parse(payloadStr[0]);\n                       const data = payload.data;\n                       Assert.ok(data && data.baseData && data.baseData.properties[\"prop1\"]);\n                       Assert.ok(data && data.baseData && data.baseData.measurements[\"measurement1\"]);\n                    }\n                })\n            });\n\n            this.testCase({\n                name: \"checkIncorrectConnectionString\",\n                test: () => {\n                    let theSnippet:any = null;\n                    let exception: Error = null;\n                    //this.useFakeServer = false;\n                    try {\n                        let snippet:Snippet = snippetCreator(getSnippetConfigWrongConnectionString(this.sessionPrefix));\n                        // Call the initialization\n                        let ai = ((ApplicationInsightsContainer.getAppInsights(snippet, snippet.version)) as IApplicationInsights);\n                        Assert.equal(true, ai.appInsights.isInitialized(), \"isInitialized\");\n                    } catch (e) {\n                        Assert.equal(e.message, \"Please provide instrumentation key\", \"Server would not start when get incorrect connection string\");\n                    }\n                }\n            });\n\n            this.testCase({\n                name: \"checkConnectionStringNotSet\",\n                test: () => {\n                    let theSnippet:any = null;\n                    let exception: Error = null;\n                    //this.useFakeServer = false;\n                    try {\n                        let snippet:Snippet = snippetCreator(getSnippetConfigNotSetConnectionString(this.sessionPrefix));\n                        // Call the initialization\n                        ((ApplicationInsightsContainer.getAppInsights(snippet, snippet.version)) as IApplicationInsights);\n                    } catch (e) {\n                        Assert.equal(e.message, \"Please provide instrumentation key\", \"Server would not start without connection string\");\n                    }\n                }\n            });\n\n\n            this.testCaseAsync({\n                name: \"[\" + snippetName + \"] : Public Members exist\",\n                stepDelay: 100,\n                steps: [() => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix))) as any;\n                    _expectedTrackMethods.forEach(method => {\n                        Assert.ok(theSnippet[method], `${method} exists`);\n                        Assert.equal('function', typeof theSnippet[method], `${method} is a function`);\n\n                        let funcSpy;\n                        if (method === \"trackDependencyData\" || method === \"flush\") {\n                            // we don't have any available reference to the underlying call, so while we want to check\n                            // that this functions exists we can't validate that it is called\n                        } else if (method === \"setAuthenticatedUserContext\" || method === \"clearAuthenticatedUserContext\") {\n                            funcSpy = this.sandbox.spy(theSnippet.context.user, method);\n                        } else if (method === \"addTelemetryInitializer\") {\n                            funcSpy = this.sandbox.spy(theSnippet.core, method);\n                        } else {\n                            funcSpy = this.sandbox.spy(theSnippet.appInsights, method);\n                        }\n\n                        try {\n                            theSnippet[method]();\n                        } catch(e) {\n                            // Do nothing\n                        }\n    \n                        if (funcSpy) {\n                            Assert.ok(funcSpy.called, \"Function [\" + method + \"] of the appInsights should have been called\")\n                        }\n                    });\n\n                    _expectedMethodsAfterInitialization.forEach(method => {\n                        Assert.ok(theSnippet[method], `${method} exists`);\n                        Assert.equal('function', typeof theSnippet[method], `${method} is a function`);\n\n                        let funcSpy = this.sandbox.spy(theSnippet.appInsights, method);\n\n                        try {\n                            theSnippet[method]();\n                        } catch(e) {\n                            // Do nothing\n                        }\n    \n                        if (funcSpy) {\n                            Assert.ok(funcSpy.called, \"Function [\" + method + \"] of the appInsights should have been called\")\n                        }\n                    });\n                }, PollingAssert.createPollingAssert(() => {\n                    try {\n                        Assert.ok(true, \"* waiting for scheduled actions to send events \" + new Date().toISOString());\n            \n                        if(this.successSpy.called) {\n                            let currentCount: number = 0;\n                            this.successSpy.args.forEach(call => {\n                                call[0].forEach(item => {\n                                    let message = item;\n                                    if (typeof item !== \"string\") {\n                                        message = item.item;\n                                    }\n                                    // Ignore the internal SendBrowserInfoOnUserInit message (Only occurs when running tests in a browser)\n                                    if (!message || message.indexOf(\"AI (Internal): 72 \") == -1) {\n                                        currentCount ++;\n                                    }\n                                });\n                            });\n                            return currentCount > 0;\n                        }\n            \n                        return false;\n                    } catch (e) {\n                        Assert.ok(false, \"Exception:\" + e);\n                    }\n                }, \"waiting for sender success\", 30, 1000) as any]\n            });\n\n            this.testCase({\n                name: \"Check properties exist\",\n                test: () => {\n                    let preSnippet = snippetCreator(getSnippetConfig(this.sessionPrefix));\n                    _expectedBeforeProperties.forEach(property => {\n                        Assert.ok(objHasOwnProperty(preSnippet, property), `${property} has property`);\n                        Assert.ok(isNotNullOrUndefined(preSnippet[property]), `${property} exists`);\n                    });\n                    _expectedAfterProperties.forEach(property => {\n                        Assert.ok(!objHasOwnProperty(preSnippet, property), `${property} does not exist`);\n                    });\n\n                    let theSnippet = this._initializeSnippet(preSnippet) as any;\n                    _expectedAfterProperties.forEach(property => {\n                        Assert.ok(objHasOwnProperty(theSnippet, property) , `${property} exists`);\n                        Assert.notEqual('function', typeof theSnippet[property], `${property} is not a function`);\n                    });\n\n                    Assert.ok(isNotNullOrUndefined(theSnippet.core), \"Make sure the core is set\");\n                    Assert.ok(isNotNullOrUndefined(theSnippet.appInsights.core), \"Make sure the appInsights core is set\");\n                    Assert.equal(theSnippet.core, theSnippet.appInsights.core, \"Make sure the core instances are actually the same\");\n                }\n            });\n\n            this.testCase({\n                name: \"Check cookie manager access\",\n                test: () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix))) as any;\n\n                    let coreCookieMgr = theSnippet.core.getCookieMgr();\n                    Assert.ok(isNotNullOrUndefined(coreCookieMgr), \"Make sure the cookie manager is returned\");\n                    Assert.equal(true, coreCookieMgr.isEnabled(), \"Cookies should be enabled\")\n                    Assert.equal(coreCookieMgr, theSnippet.getCookieMgr(), \"Make sure the cookie manager is returned\");    \n\n                    let appInsightsCookieMgr = theSnippet.appInsights.core.getCookieMgr();\n                    Assert.ok(isNotNullOrUndefined(appInsightsCookieMgr), \"Make sure the cookie manager is returned\");\n                    Assert.equal(true, appInsightsCookieMgr.isEnabled(), \"Cookies should be enabled\")\n                    Assert.equal(appInsightsCookieMgr, theSnippet.getCookieMgr(), \"Make sure the cookie manager is returned\");\n                    Assert.equal(coreCookieMgr, appInsightsCookieMgr, \"Make sure the cookie managers are the same\");\n\n                    Assert.equal(true, theSnippet.getCookieMgr().isEnabled(), \"Cookies should be enabled\")\n                }\n            });\n\n            this.testCase({\n                name: \"Check cookie manager access as disabled\",\n                test: () => {\n                    let theConfig = getSnippetConfig(this.sessionPrefix);\n                    theConfig.cfg.disableCookiesUsage = true;\n                    let theSnippet = this._initializeSnippet(snippetCreator(theConfig)) as any;\n\n                    let coreCookieMgr = theSnippet.core.getCookieMgr();\n                    Assert.ok(isNotNullOrUndefined(coreCookieMgr), \"Make sure the cookie manager is returned\");\n                    Assert.equal(false, coreCookieMgr.isEnabled(), \"Cookies should be disabled\")\n                    Assert.equal(coreCookieMgr, theSnippet.getCookieMgr(), \"Make sure the cookie manager is returned\");              \n\n                    let appInsightsCookieMgr = theSnippet.appInsights.core.getCookieMgr();\n                    Assert.ok(isNotNullOrUndefined(appInsightsCookieMgr), \"Make sure the cookie manager is returned\");\n                    Assert.equal(false, appInsightsCookieMgr.isEnabled(), \"Cookies should be disabled\")\n                    Assert.equal(appInsightsCookieMgr, theSnippet.getCookieMgr(), \"Make sure the cookie manager is returned\");\n                    Assert.equal(coreCookieMgr, appInsightsCookieMgr, \"Make sure the cookie managers are the same\");\n\n                    Assert.equal(false, theSnippet.getCookieMgr().isEnabled(), \"Cookies should be disabled\")\n                }\n            });\n\n            this.testCase({\n                name: \"Check plugin version string\",\n                test: () => {\n                    let theConfig = getSnippetConfig(this.sessionPrefix);\n                    let theSnippet = this._initializeSnippet(snippetCreator(theConfig)) as any;\n    \n                    QUnit.assert.equal(0, theSnippet.pluginVersionStringArr.length, \"Checking the array length\");\n                    QUnit.assert.equal(\"\", theSnippet.pluginVersionString);\n\n                    // Add a versioned plugin\n                    theSnippet.addPlugin(new TestPlugin());\n                    QUnit.assert.equal(1, theSnippet.pluginVersionStringArr.length, \"Checking the array length\");\n                    QUnit.assert.equal(\"TestPlugin=0.99.1\", theSnippet.pluginVersionString);\n                }\n            });\n\n            this.addAnalyticsApiTests(snippetName, snippetCreator);\n            this.addAsyncTests(snippetName, snippetCreator);\n            this.addDependencyPluginTests(snippetName, snippetCreator);\n            this.addPropertiesPluginTests(snippetName, snippetCreator);\n        });\n    }\n\n    public addAnalyticsApiTests(snippetName: string, snippetCreator: (config:any) => Snippet): void {\n        this.testCase({\n            name: 'E2E.AnalyticsApiTests: Public Members exist',\n            test: () => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix))) as any;\n                _expectedTrackMethods.forEach(method => {\n                    Assert.ok(theSnippet[method], `${method} exists`);\n                    Assert.equal('function', typeof theSnippet[method], `${method} is a function`);\n                });\n                _expectedMethodsAfterInitialization.forEach(method => {\n                    Assert.ok(theSnippet[method], `${method} does exists`);\n                    Assert.equal('function', typeof theSnippet[method], `${method} is a function`);\n                });\n            }\n        });\n    }\n\n    public addAsyncTests(snippetName: string, snippetCreator: (config:any) => Snippet): void {\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackEvent sends to backend',\n            stepDelay: 100,\n            steps: [() => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                theSnippet.trackEvent({ name: 'event', properties: { \"prop1\": \"value1\" }, measurements: { \"measurement1\": 200 } });\n            }].concat(this.asserts(1)).concat(() => {\n\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(data && data.baseData && data.baseData.properties[\"prop1\"]);\n                    Assert.ok(data && data.baseData && data.baseData.measurements[\"measurement1\"]);\n                }\n            })\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackTrace sends to backend',\n            stepDelay: 100,\n            steps: [() => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                theSnippet.trackTrace({ message: 'trace', properties: { \"foo\": \"bar\", \"prop2\": \"value2\" } });\n            }].concat(this.asserts(1)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                const payload = JSON.parse(payloadStr[0]);\n                const data = payload.data;\n                Assert.ok(data && data.baseData &&\n                    data.baseData.properties[\"foo\"] && data.baseData.properties[\"prop2\"]);\n                Assert.equal(\"bar\", data.baseData.properties[\"foo\"]);\n                Assert.equal(\"value2\", data.baseData.properties[\"prop2\"]);\n            })\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException sends to backend',\n            stepDelay: 100,\n            steps: [() => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    exception = e;\n                    theSnippet.trackException({ exception });\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: legacy trackException sends to backend',\n            stepDelay: 100,\n            steps: [() => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    exception = e;\n                    theSnippet.trackException({ error: exception } as any);\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track metric\",\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    console.log(\"* calling trackMetric \" + new Date().toISOString());\n                    for (let i = 0; i < 100; i++) {\n                        theSnippet.trackMetric({ name: \"test\" + i, average: Math.round(100 * Math.random()) });\n                    }\n                    console.log(\"* done calling trackMetric \" + new Date().toISOString());\n                }\n            ].concat(this.asserts(100))\n        });\n\n        this.testCaseAsync({\n            name: `TelemetryContext: track page view ${window.location.pathname}`,\n            stepDelay: 500,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    theSnippet.trackPageView({}); // sends 2\n                }\n            ]\n            .concat(this.asserts(2))\n            .concat(() => {\n\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(data.baseData.id, \"pageView id is defined\");\n                    Assert.ok(data.baseData.id.length > 0);\n                    Assert.ok(payload.tags[\"ai.operation.id\"]);\n                    Assert.equal(data.baseData.id, payload.tags[\"ai.operation.id\"], \"pageView id matches current operation id\");\n                } else {\n                    Assert.ok(false, \"successSpy not called\");\n                }\n            })\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track page view performance\",\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    theSnippet.trackPageViewPerformance({ name: 'name', uri: 'url' });\n                }\n            ].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track all types in batch\",\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    let exception = null;\n                    try {\n                        window[\"a\"][\"b\"]();\n                    } catch (e) {\n                        exception = e;\n                    }\n\n                    Assert.ok(exception);\n\n                    theSnippet.trackException({ exception });\n                    theSnippet.trackMetric({ name: \"test\", average: Math.round(100 * Math.random()) });\n                    theSnippet.trackTrace({ message: \"test\" });\n                    theSnippet.trackPageView({}); // sends 2\n                    theSnippet.trackPageViewPerformance({ name: 'name', uri: 'http://someurl' });\n                    theSnippet.flush();\n                }\n            ].concat(this.asserts(6))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track all types in a large batch\",\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    let exception = null;\n                    try {\n                        window[\"a\"][\"b\"]();\n                    } catch (e) {\n                        exception = e;\n                    }\n                    Assert.ok(exception);\n\n                    for (let i = 0; i < 100; i++) {\n                        theSnippet.trackException({ exception });\n                        theSnippet.trackMetric({ name: \"test\", average: Math.round(100 * Math.random()) });\n                        theSnippet.trackTrace({ message: \"test\" });\n                        theSnippet.trackPageView({ name: `${i}` }); // sends 2 1st time\n                    }\n                }\n            ].concat(this.asserts(401, false))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryInitializer: E2E override envelope data\",\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    // Setup\n                    const telemetryInitializer = {\n                        init: (envelope) => {\n                            envelope.baseData.name = 'other name'\n                            return true;\n                        }\n                    }\n\n\n                    // Act\n                    theSnippet.addTelemetryInitializer(telemetryInitializer.init);\n                    theSnippet.trackMetric({ name: \"test\", average: Math.round(100 * Math.random()) });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        let payloadItems = payloadStr.length;\n                        Assert.equal(1, payloadItems, 'Only 1 track item is sent');\n                        const payload = JSON.parse(payloadStr[0]);\n                        Assert.ok(payload);\n\n                        if (payload && payload.baseData) {\n                            const nameResult: string = payload.data.baseData.metrics[0].name;\n                            const nameExpect: string = 'other name';\n                            Assert.equal(nameExpect, nameResult, 'telemetryinitializer override successful');\n                        }\n                    }\n                })\n        });\n    }\n\n    public addDependencyPluginTests(snippetName: string, snippetCreator: (config:any) => Snippet): void {\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: trackDependencyData\",\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    const data: IDependencyTelemetry = {\n                        target: 'http://abc',\n                        responseCode: 200,\n                        type: 'GET',\n                        id: 'abc'\n                    }\n                    theSnippet.trackDependencyData(data);\n                }\n            ].concat(this.asserts(1))\n        });\n\n        if (!this.isEmulatingIe) {\n            // If we are emulating IE then XHR is not hooked\n            this.testCaseAsync({\n                name: \"TelemetryContext: auto collection of ajax requests\",\n                stepDelay: 100,\n                steps: [\n                    () => {\n                        let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                        const xhr = new XMLHttpRequest();\n                        xhr.open('GET', 'http://localhost:9001/README.md');\n                        xhr.send();\n                        Assert.ok(true);\n                    }\n                ].concat(this.asserts(1))\n            });\n        }\n        \n        let global = getGlobal();\n        if (global && global.fetch && !this.isEmulatingIe) {\n            this.testCaseAsync({\n                name: \"DependenciesPlugin: auto collection of outgoing fetch requests \" + (this.isFetchPolyfill ? \" using polyfill \" : \"\"),\n                stepDelay: 2000,\n                steps: [\n                    () => {\n                        let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                        fetch('http://localhost:9001/README.md', { method: 'GET', headers: { 'header': 'value'} });\n                        Assert.ok(true, \"fetch monitoring is instrumented\");\n                    },\n                    () => {\n                        fetch('http://localhost:9001/README.md', { method: 'GET' });\n                        Assert.ok(true, \"fetch monitoring is instrumented\");\n                    },\n                    () => {\n                        fetch('http://localhost:9001/README.md');\n                        Assert.ok(true, \"fetch monitoring is instrumented\");\n                    }\n                ]\n                    .concat(this.asserts(3, false, false))\n                    .concat(() => {\n                        let args = [];\n                        this.trackSpy.args.forEach(call => {\n                            let message = call[0].baseData.message||\"\";\n                            // Ignore the internal SendBrowserInfoOnUserInit message (Only occurs when running tests in a browser)\n                            if (message.indexOf(\"AI (Internal): 72 \") == -1) {\n                                args.push(call[0]);\n                            }\n                        });\n\n                        let type = \"Fetch\";\n                        if (this.isFetchPolyfill) {\n                            type = \"Ajax\";\n                            Assert.ok(true, \"Using fetch polyfill\");\n                        }\n                        Assert.equal(3, args.length, \"track is called 3 times\");\n                        let baseData = args[0].baseData;\n                        Assert.equal(type, baseData.type, \"request is \" + type + \" type\");\n                        Assert.equal('value', baseData.properties.requestHeaders['header'], \"fetch request's user defined request header is stored\");\n                        Assert.ok(baseData.properties.responseHeaders, \"fetch request's reponse header is stored\");\n\n                        baseData = args[1].baseData;\n                        Assert.equal(3, Object.keys(baseData.properties.requestHeaders).length, \"two request headers set up when there's no user defined request header\");\n                        Assert.ok(baseData.properties.requestHeaders[RequestHeaders.requestIdHeader], \"Request-Id header\");\n                        Assert.ok(baseData.properties.requestHeaders[RequestHeaders.requestContextHeader], \"Request-Context header\");\n                        Assert.ok(baseData.properties.requestHeaders[RequestHeaders.traceParentHeader], \"traceparent\");\n                        Assert.ok(!baseData.properties.requestHeaders[RequestHeaders.traceStateHeader], \"traceState should not be present in outbound event\");\n                        const id: string = baseData.id;\n                        const regex = id.match(/\\|.{32}\\..{16}\\./g);\n                        Assert.ok(id.length > 0);\n                        Assert.equal(1, regex.length)\n                        Assert.equal(id, regex[0]);\n                    })\n            });\n        } else {\n            this.testCase({\n                name: \"DependenciesPlugin: No crash when fetch not supported\",\n                test: () => {\n                    Assert.ok(true, \"fetch monitoring is correctly not instrumented\")\n                }\n            });\n        }\n    }\n\n    public addPropertiesPluginTests(snippetName: string, snippetCreator: (config:any) => Snippet): void {\n        this.testCaseAsync({\n            name: 'Custom Tags: allowed to send custom properties via addTelemetryInitializer',\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    theSnippet.addTelemetryInitializer((item: ITelemetryItem) => {\n                        item.tags[this.tagKeys.cloudName] = \"my.custom.cloud.name\";\n                    });\n                    theSnippet.trackEvent({ name: \"Custom event via addTelemetryInitializer\" });\n                }\n            ]\n            .concat(this.asserts(1, false, false))\n            .concat(PollingAssert.createPollingAssert(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length) {\n                    const payload = JSON.parse(payloadStr[0]);\n                        Assert.equal(1, payloadStr.length, 'Only 1 track item is sent - ' + payload.name);\n                        Assert.ok(payload);\n\n                    if (payload && payload.tags) {\n                        const tagResult: string = payload.tags && payload.tags[this.tagKeys.cloudName];\n                        const tagExpect: string = 'my.custom.cloud.name';\n                        Assert.equal(tagResult, tagExpect, 'telemetryinitializer tag override successful');\n                        return true;\n                    }\n                    return false;\n                }\n            }, 'Set custom tags') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'Custom Tags: allowed to send custom properties via addTelemetryInitializer & shimmed addTelemetryInitializer',\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    theSnippet.addTelemetryInitializer((item: ITelemetryItem) => {\n                        item.tags.push({[this.tagKeys.cloudName]: \"my.shim.cloud.name\"});\n                    });\n                    theSnippet.trackEvent({ name: \"Custom event\" });\n                }\n            ]\n            .concat(this.asserts(1))\n            .concat(PollingAssert.createPollingAssert(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    Assert.equal(1, payloadStr.length, 'Only 1 track item is sent');\n                    const payload = JSON.parse(payloadStr[0]);\n                    Assert.ok(payload);\n\n                    if (payload && payload.tags) {\n                        const tagResult: string = payload.tags && payload.tags[this.tagKeys.cloudName];\n                        const tagExpect: string = 'my.shim.cloud.name';\n                        Assert.equal(tagResult, tagExpect, 'telemetryinitializer tag override successful');\n                        return true;\n                    }\n                    return false;\n                }\n            }, 'Set custom tags') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'Custom Tags: allowed to send custom properties via shimmed addTelemetryInitializer',\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    theSnippet.addTelemetryInitializer((item: ITelemetryItem) => {\n                        item.tags[this.tagKeys.cloudName] = \"my.custom.cloud.name\";\n                        item.tags[this.tagKeys.locationCity] = \"my.custom.location.city\";\n                        item.tags.push({[this.tagKeys.locationCountry]: \"my.custom.location.country\"});\n                        item.tags.push({[this.tagKeys.operationId]: \"my.custom.operation.id\"});\n                    });\n                    theSnippet.trackEvent({ name: \"Custom event via shimmed addTelemetryInitializer\" });\n                }\n            ]\n            .concat(this.asserts(1))\n            .concat(PollingAssert.createPollingAssert(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    Assert.equal(1, payloadStr.length, 'Only 1 track item is sent - ' + payload.name);\n                    if (payloadStr.length > 1) {\n                        this.dumpPayloadMessages(this.successSpy);\n                    }\n                    Assert.ok(payload);\n\n                    if (payload && payload.tags) {\n                        const tagResult1: string = payload.tags && payload.tags[this.tagKeys.cloudName];\n                        const tagExpect1: string = 'my.custom.cloud.name';\n                        Assert.equal(tagResult1, tagExpect1, 'telemetryinitializer tag override successful');\n                        const tagResult2: string = payload.tags && payload.tags[this.tagKeys.locationCity];\n                        const tagExpect2: string = 'my.custom.location.city';\n                        Assert.equal(tagResult2, tagExpect2, 'telemetryinitializer tag override successful');\n                        const tagResult3: string = payload.tags && payload.tags[this.tagKeys.locationCountry];\n                        const tagExpect3: string = 'my.custom.location.country';\n                        Assert.equal(tagResult3, tagExpect3, 'telemetryinitializer tag override successful');\n                        const tagResult4: string = payload.tags && payload.tags[this.tagKeys.operationId];\n                        const tagExpect4: string = 'my.custom.operation.id';\n                        Assert.equal(tagResult4, tagExpect4, 'telemetryinitializer tag override successful');\n                        return true;\n                    }\n                    return false;\n                }\n            }, 'Set custom tags') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext authId',\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    const context = (theSnippet.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext('10001');\n                    theSnippet.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    let payloadStr = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        let payloadEvents = payloadStr.length;\n                        let thePayload:string = payloadStr[0];\n\n                        if (payloadEvents !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(thePayload);\n                        if (payload && payload.tags) {\n                            const tagName: string = this.tagKeys.userAuthUserId;\n                            return '10001' === payload.tags[tagName];\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext authId and accountId',\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    const context = (theSnippet.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext('10001', 'account123');\n                    theSnippet.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        if (payloadStr.length !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(payloadStr[0]);\n                        if (payload && payload.tags) {\n                            const authTag: string = this.tagKeys.userAuthUserId;\n                            const accountTag: string = this.tagKeys.userAccountId;\n                            return '10001' === payload.tags[authTag] /*&&\n                            'account123' === payload.tags[accountTag] */; // bug https://msazure.visualstudio.com/One/_workitems/edit/3508825\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext non-ascii authId and accountId',\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    const context = (theSnippet.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext(\"\\u0428\", \"\\u0429\");\n                    theSnippet.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        if (payloadStr.length !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(payloadStr[0]);\n                        if (payload && payload.tags) {\n                            const authTag: string = this.tagKeys.userAuthUserId;\n                            const accountTag: string = this.tagKeys.userAccountId;\n                            return '\\u0428' === payload.tags[authTag] /* &&\n                            '\\u0429' === payload.tags[accountTag] */; // bug https://msazure.visualstudio.com/One/_workitems/edit/3508825\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: clearAuthenticatedUserContext',\n            stepDelay: 100,\n            steps: [\n                () => {\n                    let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                    const context = (theSnippet.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext('10002', 'account567');\n                    context.user.clearAuthenticatedUserContext();\n                    theSnippet.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        if (payloadStr.length !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(payloadStr[0]);\n                        if (payload && payload.tags) {\n                            const authTag: string = this.tagKeys.userAuthUserId;\n                            const accountTag: string = this.tagKeys.userAccountId;\n                            return undefined === payload.tags[authTag] &&\n                                undefined === payload.tags[accountTag];\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        // This doesn't need to be e2e\n        this.testCase({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext does not set the cookie by default',\n            test: () => {\n                // Setup\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                const context = (theSnippet.context) as IPropTelemetryContext;\n                const authSpy: SinonSpy = this.sandbox.spy(context.user, 'setAuthenticatedUserContext');\n                let cookieMgr = theSnippet.getCookieMgr();\n                const cookieSpy: SinonSpy = this.sandbox.spy(cookieMgr, 'set');\n\n                // Act\n                context.user.setAuthenticatedUserContext('10002', 'account567');\n\n                // Test\n                Assert.ok(authSpy.calledOnce, 'setAuthenticatedUserContext called');\n                Assert.equal(false, authSpy.calledWithExactly('10001', 'account567', false), 'Correct default args to setAuthenticatedUserContext');\n                Assert.ok(cookieSpy.notCalled, 'cookie never set');\n            }\n        });\n\n        this.testCase({\n            name: 'Sampling: sampleRate is generated as a field in the envelope when it is less than 100',\n            test:() => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix, true)));\n                theSnippet.trackEvent({ name: 'event' });\n                Assert.ok(this.envelopeConstructorSpy.called);\n                const envelope = this.envelopeConstructorSpy.returnValues[0];\n                Assert.equal(envelope.sampleRate, 50, \"sampleRate is generated\");\n            }\n        })\n\n        this.testCase({\n            name: 'Unload: unload() without parameters should return a promise',\n            test: () => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                const result = theSnippet.unload();\n                Assert.ok(result, \"unload() should return a promise when called without parameters\");\n                Assert.ok(isPromiseLike(result), \"returned value should be promise-like\");\n            }\n        });\n\n        this.testCase({\n            name: 'Unload: unload(true) should return a promise',\n            test: () => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                const result = theSnippet.unload(true);\n                Assert.ok(result, \"unload(true) should return a promise\");\n                Assert.ok(isPromiseLike(result), \"returned value should be promise-like\");\n            }\n        });\n\n        this.testCase({\n            name: 'Unload: unload(false) should not return a promise',\n            test: () => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                const result = theSnippet.unload(false);\n                Assert.equal(result, undefined, \"unload(false) should return undefined\");\n            }\n        });\n\n        this.testCase({\n            name: 'Unload: unload with callback should not return a promise',\n            test: () => {\n                let theSnippet = this._initializeSnippet(snippetCreator(getSnippetConfig(this.sessionPrefix)));\n                let callbackCalled = false;\n                const result = theSnippet.unload(true, () => {\n                    callbackCalled = true;\n                });\n                Assert.equal(result, undefined, \"unload with callback should return undefined\");\n            }\n        });\n    }\n\n    private _initializeSnippet(snippet: Snippet): IApplicationInsights {\n        try {\n            //this.useFakeServer = false;\n\n            // Call the initialization\n            ((ApplicationInsightsContainer.getAppInsights(snippet, snippet.version)) as IApplicationInsights);\n\n            // Setup Sinon stuff\n            const appInsights: AppInsightsSku = (snippet as any).appInsights;\n            this.onDone(() => {\n                if (snippet) {\n                    if (snippet[\"unload\"]) {\n                        snippet[\"unload\"](false);\n                    } else if (snippet[\"appInsightsNew\"]) {\n                        snippet[\"appInsightsNew\"].unload(false);\n                    }\n                }\n            });\n\n            Assert.ok(appInsights, \"The App insights instance should be populated\");\n            Assert.ok(appInsights.core, \"The Core exists\");\n            Assert.equal(appInsights.core, (snippet as any).core, \"The core instances should match\");\n\n            Assert.equal(true, (appInsights as any).isInitialized(), 'App Analytics is initialized');\n            Assert.equal(true, appInsights.core.isInitialized(), 'Core is initialized');\n\n            const sender: Sender = appInsights.core.getPlugin<Sender>(BreezeChannelIdentifier).plugin;\n            this.errorSpy = this.sandbox.spy(sender, '_onError');\n            this.successSpy = this.sandbox.spy(sender, '_onSuccess');\n            this.loggingSpy = this.sandbox.stub(appInsights.core.logger, 'throwInternal');\n            this.trackSpy = this.sandbox.spy(appInsights.core, 'track')\n            this.sandbox.stub((sender as any)._sample, 'isSampledIn').returns(true);\n            this.envelopeConstructorSpy = this.sandbox.spy(Sender, 'constructEnvelope');\n\n        } catch (e) {\n            console.error('Failed to initialize');\n            Assert.ok(false, e);\n        }\n\n        // Note: Explicitly returning the original snippet as this should have been updated!\n        return snippet as any;\n    }\n\n    private boilerPlateAsserts = () => {\n        Assert.ok(this.successSpy.called, \"success\");\n        Assert.ok(!this.errorSpy.called, \"no error sending\");\n        const isValidCallCount = this.loggingSpy.callCount === 0;\n        Assert.ok(isValidCallCount, \"logging spy was called 0 time(s)\");\n        if (!isValidCallCount) {\n            while (this.loggingSpy.args.length) {\n                Assert.ok(false, \"[warning thrown]: \" + dumpObj(this.loggingSpy.args.pop()));\n            }\n        }\n    }\n    private asserts: any = (expectedCount: number) => [() => {\n        const message = \"polling: \" + new Date().toISOString();\n        Assert.ok(true, message);\n        console.log(message);\n\n        if (this.successSpy.called) {\n            this.boilerPlateAsserts();\n            this.testCleanup();\n        } else if (this.errorSpy.called || this.loggingSpy.called) {\n            this.boilerPlateAsserts();\n        }\n    },\n    (PollingAssert.createPollingAssert(() => {\n        Assert.ok(true, \"* checking success spy \" + new Date().toISOString());\n\n        if(this.successSpy.called) {\n            let currentCount: number = 0;\n            this.successSpy.args.forEach(call => {\n                call[0].forEach(item => {\n                    let message = item.item;\n                    if (typeof item === \"string\") {\n                        message = item;\n                    }\n                    // Ignore the internal SendBrowserInfoOnUserInit message (Only occurs when running tests in a browser)\n                    if (!message || message.indexOf(\"AI (Internal): 72 \") == -1) {\n                        currentCount ++;\n                        //console.log(\" - \" + strSubstring(JSON.stringify(call), 400));\n                    }\n                });\n            });\n            console.log('curr: ' + currentCount + ' exp: ' + expectedCount);\n            return currentCount === expectedCount;\n        } else {\n            return false;\n        }\n    }, \"sender succeeded\", 30, 500))];\n}\n\nclass TestPlugin extends BaseTelemetryPlugin {\n    public identifier: string = \"TestPlugin\";\n    public version: string = \"0.99.1\";\n\n    constructor() {\n        super();\n    }\n\n    public processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext | undefined): void {\n        itemCtx?.processNext(env);\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SpanContextPropagation.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { IReadableSpan, IDistributedTraceContext, ITelemetryItem, asString } from \"@microsoft/applicationinsights-core-js\";\nimport { createPromise, IPromise } from '@nevware21/ts-async';\n\nexport class SpanContextPropagationTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${SpanContextPropagationTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"SpanContextPropagationTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: SpanContextPropagationTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize tests: ' + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addParentChildRelationshipTests();\n        this.addMultiLevelHierarchyTests();\n        this.addSiblingSpanTests();\n        this.addAsyncBoundaryTests();\n        this.addContextPropagationTests();\n    }\n\n    private addParentChildRelationshipTests(): void {\n        this.testCase({\n            name: \"ParentChild: child span should inherit parent's traceId\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-span\");\n                Assert.ok(parentSpan, \"Parent span should be created\");\n\n                // Act\n                const parentContext = parentSpan!.spanContext();\n                const childSpan = this._ai.startSpan(\"child-span\", undefined, parentContext);\n                const childContext = childSpan!.spanContext();\n\n                // Assert\n                Assert.equal(childContext.traceId, parentContext.traceId, \"Child span should inherit parent's traceId\");\n                Assert.notEqual(childContext.spanId, parentContext.spanId, \"Child span should have different spanId from parent\");\n\n                // Cleanup\n                childSpan?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ParentChild: child span should have unique spanId\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-unique-id\");\n                const parentContext = parentSpan!.spanContext();\n\n                // Act\n                const child1 = this._ai.startSpan(\"child-1\", undefined, parentContext);\n                const child2 = this._ai.startSpan(\"child-2\", undefined, parentContext);\n\n                const child1Context = child1!.spanContext();\n                const child2Context = child2!.spanContext();\n\n                // Assert\n                Assert.notEqual(child1Context.spanId, child2Context.spanId,\n                    \"Sibling children should have unique spanIds\");\n                Assert.notEqual(child1Context.spanId, parentContext.spanId,\n                    \"Child 1 spanId should differ from parent\");\n                Assert.notEqual(child2Context.spanId, parentContext.spanId,\n                    \"Child 2 spanId should differ from parent\");\n\n                // Cleanup\n                child1?.end();\n                child2?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ParentChild: child spans created via getTraceCtx\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-via-getTraceCtx\");\n                \n                this._ai.setActiveSpan(parentSpan!);\n\n                // Act - Use getTraceCtx to get current context\n                const currentContext = this._ai.getTraceCtx();\n                const childSpan = this._ai.startSpan(\"child-via-getTraceCtx\", undefined, currentContext || undefined);\n\n                // Assert\n                const parentContext = parentSpan!.spanContext();\n                const childContext = childSpan!.spanContext();\n\n                Assert.equal(childContext.traceId, parentContext.traceId,\n                    \"Child should inherit traceId via getTraceCtx\");\n                Assert.notEqual(childContext.spanId, parentContext.spanId,\n                    \"Child should have unique spanId\");\n\n                // Cleanup\n                childSpan?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ParentChild: parent context should preserve traceFlags\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-traceflags\");\n                const parentContext = parentSpan!.spanContext();\n\n                // Act\n                const childSpan = this._ai.startSpan(\"child-traceflags\", undefined, parentContext);\n                const childContext = childSpan!.spanContext();\n\n                // Assert\n                Assert.equal(childContext.traceFlags, parentContext.traceFlags,\n                    \"Child should preserve parent's traceFlags\");\n\n                // Cleanup\n                childSpan?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ParentChild: parent context should preserve traceState if present\",\n            test: () => {\n                // Arrange - Create parent span\n                const parentSpan = this._ai.startSpan(\"parent-tracestate\");\n                const parentContext = parentSpan!.spanContext();\n                \n                // Manually set traceState (if the implementation supports it)\n                if (parentContext.traceState !== undefined) {\n                    // Act\n                    const childSpan = this._ai.startSpan(\"child-tracestate\", undefined, parentContext);\n                    const childContext = childSpan!.spanContext();\n\n                    // Assert\n                    Assert.equal(asString(childContext.traceState), asString(parentContext.traceState),\n                        \"Child should preserve parent's traceState\");\n\n                    // Cleanup\n                    childSpan?.end();\n                }\n                \n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ParentChild: multiple children from same parent share traceId\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-multiple-children\");\n                const parentContext = parentSpan!.spanContext();\n\n                // Act - Create multiple children\n                const children: IReadableSpan[] = [];\n                for (let i = 0; i < 5; i++) {\n                    const child = this._ai.startSpan(`child-${i}`, undefined, parentContext);\n                    if (child) {\n                        children.push(child);\n                    }\n                }\n\n                // Assert\n                children.forEach((child, index) => {\n                    const childContext = child.spanContext();\n                    Assert.equal(childContext.traceId, parentContext.traceId,\n                        `Child ${index} should have parent's traceId`);\n                });\n\n                // All children should have unique spanIds\n                for (let i = 0; i < children.length; i++) {\n                    for (let j = i + 1; j < children.length; j++) {\n                        const ctx1 = children[i].spanContext();\n                        const ctx2 = children[j].spanContext();\n                        Assert.notEqual(ctx1.spanId, ctx2.spanId,\n                            `Child ${i} and child ${j} should have different spanIds`);\n                    }\n                }\n\n                // Cleanup\n                children.forEach(child => child.end());\n                parentSpan?.end();\n            }\n        });\n    }\n\n    private addMultiLevelHierarchyTests(): void {\n        this.testCase({\n            name: \"MultiLevel: grandchild inherits root traceId\",\n            test: () => {\n                // Arrange & Act - Create 3-level hierarchy\n                const rootSpan = this._ai.startSpan(\"root-span\");\n                const rootContext = rootSpan!.spanContext();\n\n                const childSpan = this._ai.startSpan(\"child-span\", undefined, rootContext);\n                const childContext = childSpan!.spanContext();\n\n                const grandchildSpan = this._ai.startSpan(\"grandchild-span\", undefined, childContext);\n                const grandchildContext = grandchildSpan!.spanContext();\n\n                // Assert\n                Assert.equal(childContext.traceId, rootContext.traceId,\n                    \"Child should have root's traceId\");\n                Assert.equal(grandchildContext.traceId, rootContext.traceId,\n                    \"Grandchild should have root's traceId\");\n\n                Assert.notEqual(childContext.spanId, rootContext.spanId,\n                    \"Child should have unique spanId\");\n                Assert.notEqual(grandchildContext.spanId, childContext.spanId,\n                    \"Grandchild should have unique spanId\");\n                Assert.notEqual(grandchildContext.spanId, rootContext.spanId,\n                    \"Grandchild spanId should differ from root\");\n\n                // Cleanup\n                grandchildSpan?.end();\n                childSpan?.end();\n                rootSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"MultiLevel: deep hierarchy maintains trace consistency\",\n            test: () => {\n                // Arrange - Create deep hierarchy (5 levels)\n                const spans: IReadableSpan[] = [];\n                \n                // Act - Create root\n                const rootSpan = this._ai.startSpan(\"level-0-root\");\n                spans.push(rootSpan!);\n                \n                // Create nested spans\n                for (let i = 1; i <= 4; i++) {\n                    const parentContext = spans[i - 1].spanContext();\n                    const childSpan = this._ai.startSpan(`level-${i}`, undefined, parentContext);\n                    spans.push(childSpan!);\n                }\n\n                // Assert - All spans share same traceId\n                const rootTraceId = spans[0].spanContext().traceId;\n                spans.forEach((span, index) => {\n                    const context = span.spanContext();\n                    Assert.equal(context.traceId, rootTraceId,\n                        `Level ${index} should have root traceId`);\n                });\n\n                // All spans should have unique spanIds\n                const spanIds = spans.map(span => span.spanContext().spanId);\n                const uniqueSpanIds = new Set(spanIds);\n                Assert.equal(uniqueSpanIds.size, spans.length,\n                    \"All spans should have unique spanIds\");\n\n                // Cleanup\n                for (let i = spans.length - 1; i >= 0; i--) {\n                    spans[i].end();\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"MultiLevel: intermediate span can be parent to multiple children\",\n            test: () => {\n                // Arrange - Create hierarchy with branching\n                const rootSpan = this._ai.startSpan(\"root\");\n                const rootContext = rootSpan!.spanContext();\n\n                const intermediateSpan = this._ai.startSpan(\"intermediate\", undefined, rootContext);\n                const intermediateContext = intermediateSpan!.spanContext();\n\n                // Act - Create multiple children from intermediate\n                const leaf1 = this._ai.startSpan(\"leaf-1\", undefined, intermediateContext);\n                const leaf2 = this._ai.startSpan(\"leaf-2\", undefined, intermediateContext);\n                const leaf3 = this._ai.startSpan(\"leaf-3\", undefined, intermediateContext);\n\n                // Assert\n                const leaf1Context = leaf1!.spanContext();\n                const leaf2Context = leaf2!.spanContext();\n                const leaf3Context = leaf3!.spanContext();\n\n                // All share same traceId\n                Assert.equal(leaf1Context.traceId, rootContext.traceId,\n                    \"Leaf 1 should have root traceId\");\n                Assert.equal(leaf2Context.traceId, rootContext.traceId,\n                    \"Leaf 2 should have root traceId\");\n                Assert.equal(leaf3Context.traceId, rootContext.traceId,\n                    \"Leaf 3 should have root traceId\");\n\n                // All have unique spanIds\n                Assert.notEqual(leaf1Context.spanId, leaf2Context.spanId,\n                    \"Leaf 1 and 2 should have different spanIds\");\n                Assert.notEqual(leaf2Context.spanId, leaf3Context.spanId,\n                    \"Leaf 2 and 3 should have different spanIds\");\n                Assert.notEqual(leaf1Context.spanId, leaf3Context.spanId,\n                    \"Leaf 1 and 3 should have different spanIds\");\n\n                // Cleanup\n                leaf3?.end();\n                leaf2?.end();\n                leaf1?.end();\n                intermediateSpan?.end();\n                rootSpan?.end();\n            }\n        });\n    }\n\n    private addSiblingSpanTests(): void {\n        this.testCase({\n            name: \"Siblings: spans with same parent have same traceId\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-for-siblings\");\n                const parentContext = parentSpan!.spanContext();\n\n                // Act - Create sibling spans\n                const sibling1 = this._ai.startSpan(\"sibling-1\", undefined, parentContext);\n                const sibling2 = this._ai.startSpan(\"sibling-2\", undefined, parentContext);\n                const sibling3 = this._ai.startSpan(\"sibling-3\", undefined, parentContext);\n\n                // Assert\n                const ctx1 = sibling1!.spanContext();\n                const ctx2 = sibling2!.spanContext();\n                const ctx3 = sibling3!.spanContext();\n\n                Assert.equal(ctx1.traceId, parentContext.traceId,\n                    \"Sibling 1 should have parent's traceId\");\n                Assert.equal(ctx2.traceId, parentContext.traceId,\n                    \"Sibling 2 should have parent's traceId\");\n                Assert.equal(ctx3.traceId, parentContext.traceId,\n                    \"Sibling 3 should have parent's traceId\");\n\n                // Cleanup\n                sibling3?.end();\n                sibling2?.end();\n                sibling1?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Siblings: independent root spans have different traceIds\",\n            test: () => {\n                // Act - Create independent root spans\n                const root1 = this._ai.startSpan(\"independent-root-1\", { root: true });\n                const root2 = this._ai.startSpan(\"independent-root-2\", { root: true });\n                const root3 = this._ai.startSpan(\"independent-root-3\", { root: true });\n\n                // Assert\n                const ctx1 = root1!.spanContext();\n                const ctx2 = root2!.spanContext();\n                const ctx3 = root3!.spanContext();\n\n                Assert.notEqual(ctx1.traceId, ctx2.traceId,\n                    \"Independent root 1 and 2 should have different traceIds\");\n                Assert.notEqual(ctx2.traceId, ctx3.traceId,\n                    \"Independent root 2 and 3 should have different traceIds\");\n                Assert.notEqual(ctx1.traceId, ctx3.traceId,\n                    \"Independent root 1 and 3 should have different traceIds\");\n\n                // Cleanup\n                root3?.end();\n                root2?.end();\n                root1?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Siblings: sibling spans have unique spanIds\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-unique-siblings\");\n                const parentContext = parentSpan!.spanContext();\n\n                // Act - Create many sibling spans\n                const siblings: IReadableSpan[] = [];\n                for (let i = 0; i < 10; i++) {\n                    const sibling = this._ai.startSpan(`sibling-${i}`, undefined, parentContext);\n                    if (sibling) {\n                        siblings.push(sibling);\n                    }\n                }\n\n                // Assert - All spanIds should be unique\n                const spanIds = siblings.map(s => s.spanContext().spanId);\n                const uniqueSpanIds = new Set(spanIds);\n                Assert.equal(uniqueSpanIds.size, siblings.length,\n                    \"All sibling spans should have unique spanIds\");\n\n                // Cleanup\n                siblings.forEach(s => s.end());\n                parentSpan?.end();\n            }\n        });\n    }\n\n    private addAsyncBoundaryTests(): void {\n        this.testCase({\n            name: \"AsyncBoundary: context can be captured and used across async operations\",\n            test: () => {\n                // Arrange\n                const rootSpan = this._ai.startSpan(\"async-root\");\n                const capturedContext = rootSpan!.spanContext();\n\n                // Act - Simulate async boundary by creating child later\n                return createPromise<void>((resolve) => {\n                    setTimeout(() => {\n                        // Create child span using captured context\n                        const childSpan = this._ai.startSpan(\"async-child\", undefined, capturedContext);\n                        const childContext = childSpan!.spanContext();\n\n                        // Assert\n                        Assert.equal(childContext.traceId, capturedContext.traceId,\n                            \"Child created after async boundary should have parent's traceId\");\n\n                        // Cleanup\n                        childSpan?.end();\n                        rootSpan?.end();\n                        resolve();\n                    }, 10);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"AsyncBoundary: getTraceCtx can capture context for async operations\",\n            test: () => {\n                // Arrange\n                const rootSpan = this._ai.startSpan(\"async-getTraceCtx-root\");\n                this._ai.setActiveSpan(rootSpan!);\n\n                // Capture context using getTraceCtx\n                const capturedContext = this._ai.getTraceCtx();\n\n                // Act - Simulate async operation\n                return createPromise<void>((resolve) => {\n                    setTimeout(() => {\n                        // Use captured context in async boundary\n                        const asyncSpan = this._ai.startSpan(\"async-operation\", undefined, capturedContext || undefined);\n                        const asyncContext = asyncSpan!.spanContext();\n\n                        // Assert\n                        Assert.equal(asyncContext.traceId, capturedContext.traceId, \"Async span should inherit captured traceId\");\n\n                        // Cleanup\n                        asyncSpan?.end();\n                        rootSpan?.end();\n                        resolve();\n                    }, 10);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"AsyncBoundary: nested async operations maintain trace\",\n            test: () => {\n                // Arrange\n                const rootSpan = this._ai.startSpan(\"nested-async-root\");\n                const rootContext = rootSpan!.spanContext();\n\n                // Act - Chain async operations\n                return createPromise<void>((resolve) => {\n                    setTimeout(() => {\n                        const child1 = this._ai.startSpan(\"async-child-1\", undefined, rootContext);\n                        const child1Context = child1!.spanContext();\n\n                        setTimeout(() => {\n                            const child2 = this._ai.startSpan(\"async-child-2\", undefined, child1Context);\n                            const child2Context = child2!.spanContext();\n\n                            // Assert\n                            Assert.equal(child1Context.traceId, rootContext.traceId,\n                                \"First async child should have root traceId\");\n                            Assert.equal(child2Context.traceId, rootContext.traceId,\n                                \"Second async child should have root traceId\");\n\n                            // Cleanup\n                            child2?.end();\n                            child1?.end();\n                            rootSpan?.end();\n                            resolve();\n                        }, 10);\n                    }, 10);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"AsyncBoundary: parallel async operations share traceId\",\n            test: () => {\n                // Arrange\n                const rootSpan = this._ai.startSpan(\"parallel-async-root\");\n                const rootContext = rootSpan!.spanContext();\n\n                // Act - Create parallel async operations\n                const promises: IPromise<void>[] = [];\n                const childContexts: IDistributedTraceContext[] = [];\n\n                for (let i = 0; i < 3; i++) {\n                    const promise = createPromise<void>((resolve) => {\n                        setTimeout(() => {\n                            const childSpan = this._ai.startSpan(`parallel-child-${i}`, undefined, rootContext);\n                            childContexts.push(childSpan!.spanContext());\n                            childSpan?.end();\n                            resolve();\n                        }, 10 + i * 5);\n                    });\n                    promises.push(promise);\n                }\n\n                return Promise.all(promises).then(() => {\n                    // Assert - All parallel children should share root traceId\n                    childContexts.forEach((ctx, index) => {\n                        Assert.equal(ctx.traceId, rootContext.traceId,\n                            `Parallel child ${index} should have root traceId`);\n                    });\n\n                    // All should have unique spanIds\n                    const spanIds = childContexts.map(ctx => ctx.spanId);\n                    const uniqueSpanIds = new Set(spanIds);\n                    Assert.equal(uniqueSpanIds.size, childContexts.length,\n                        \"Parallel children should have unique spanIds\");\n\n                    // Cleanup\n                    rootSpan?.end();\n                });\n            }\n        });\n    }\n\n    private addContextPropagationTests(): void {\n        this.testCase({\n            name: \"ContextPropagation: explicit parent context overrides active context\",\n            test: () => {\n                // Arrange - Create two independent traces\n                const trace1Root = this._ai.startSpan(\"trace-1-root\", { root: true });\n                const trace2Root = this._ai.startSpan(\"trace-2-root\", { root: true });\n\n                this._ai.setActiveSpan(trace1Root!);\n\n                // Act - Create child with explicit trace2 parent\n                const trace2Context = trace2Root!.spanContext();\n                const childSpan = this._ai.startSpan(\"explicit-parent-child\", undefined, trace2Context);\n                const childContext = childSpan!.spanContext();\n\n                // Assert - Child should belong to trace2, not active trace1\n                Assert.equal(childContext.traceId, trace2Context.traceId,\n                    \"Explicit parent context should override active context\");\n                Assert.notEqual(childContext.traceId, trace1Root!.spanContext().traceId,\n                    \"Child should not belong to active trace\");\n\n                // Cleanup\n                childSpan?.end();\n                trace2Root?.end();\n                trace1Root?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ContextPropagation: spans without parent create new trace\",\n            test: () => {\n                // Act - Create spans without explicit parent\n                const span1 = this._ai.startSpan(\"no-parent-1\");\n                const span2 = this._ai.startSpan(\"no-parent-2\");\n\n                const ctx1 = span1!.spanContext();\n                const ctx2 = span2!.spanContext();\n\n                // Assert - Should create independent traces or share active context\n                // (depends on implementation - both are valid)\n                Assert.ok(ctx1.traceId, \"Span 1 should have traceId\");\n                Assert.ok(ctx2.traceId, \"Span 2 should have traceId\");\n                Assert.ok(ctx1.spanId !== ctx2.spanId,\n                    \"Spans should have unique spanIds\");\n\n                // Cleanup\n                span2?.end();\n                span1?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ContextPropagation: root option creates new trace\",\n            test: () => {\n                // Arrange - Create parent span\n                const parentSpan = this._ai.startSpan(\"existing-parent\");\n                this._ai.setActiveSpan(parentSpan!);\n\n                // Act - Create root span (should ignore active parent)\n                const rootSpan = this._ai.startSpan(\"new-root\", { root: true });\n\n                const parentContext = parentSpan!.spanContext();\n                const rootContext = rootSpan!.spanContext();\n\n                // Assert - Root span should have different traceId\n                Assert.notEqual(rootContext.traceId, parentContext.traceId,\n                    \"Root option should create new independent trace\");\n\n                // Cleanup\n                rootSpan?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ContextPropagation: context with all required fields propagates correctly\",\n            test: () => {\n                // Arrange - Create context with all fields\n                const parentSpan = this._ai.startSpan(\"full-context-parent\");\n                const parentContext = parentSpan!.spanContext();\n\n                // Act - Create child\n                const childSpan = this._ai.startSpan(\"full-context-child\", undefined, parentContext);\n                const childContext = childSpan!.spanContext();\n\n                // Assert - All fields should be present\n                Assert.ok(childContext.traceId, \"Child should have traceId\");\n                Assert.ok(childContext.spanId, \"Child should have spanId\");\n                Assert.equal(childContext.traceFlags, parentContext.traceFlags,\n                    \"Child should have traceFlags\");\n\n                Assert.equal(childContext.traceId, parentContext.traceId,\n                    \"TraceId should propagate\");\n                Assert.equal(childContext.traceFlags, parentContext.traceFlags,\n                    \"TraceFlags should propagate\");\n\n                // Cleanup\n                childSpan?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ContextPropagation: recording attribute propagates independently\",\n            test: () => {\n                // Arrange - Create recording parent\n                const recordingParent = this._ai.startSpan(\"recording-parent\", { recording: true });\n                const recordingContext = recordingParent!.spanContext();\n\n                // Act - Create non-recording child from recording parent\n                const nonRecordingChild = this._ai.startSpan(\"non-recording-child\", \n                    { recording: false }, recordingContext);\n\n                // Assert - Recording is per-span, not propagated\n                Assert.ok(recordingParent!.isRecording(),\n                    \"Parent should be recording\");\n                Assert.ok(!nonRecordingChild!.isRecording(),\n                    \"Child should not be recording despite recording parent\");\n\n                // But traceId should still propagate\n                Assert.equal(nonRecordingChild!.spanContext().traceId, recordingContext.traceId,\n                    \"TraceId should propagate regardless of recording state\");\n\n                // Cleanup\n                nonRecordingChild?.end();\n                recordingParent?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"ContextPropagation: span attributes do not propagate to children\",\n            test: () => {\n                // Arrange - Create parent with attributes\n                const parentAttrs = {\n                    \"parent.attr1\": \"value1\",\n                    \"parent.attr2\": \"value2\"\n                };\n                const parentSpan = this._ai.startSpan(\"parent-with-attrs\", \n                    { attributes: parentAttrs });\n                const parentContext = parentSpan!.spanContext();\n\n                // Act - Create child with different attributes\n                const childAttrs = {\n                    \"child.attr1\": \"childValue1\"\n                };\n                const childSpan = this._ai.startSpan(\"child-with-attrs\", \n                    { attributes: childAttrs }, parentContext);\n\n                // Assert - Attributes are per-span, not inherited\n                Assert.ok(parentSpan!.attributes[\"parent.attr1\"] === \"value1\",\n                    \"Parent should have its attributes\");\n                Assert.ok(childSpan!.attributes[\"child.attr1\"] === \"childValue1\",\n                    \"Child should have its attributes\");\n                Assert.ok(!childSpan!.attributes[\"parent.attr1\"],\n                    \"Child should not inherit parent's attributes\");\n\n                // But context should propagate\n                Assert.equal(childSpan!.spanContext().traceId, parentContext.traceId,\n                    \"TraceId should propagate\");\n\n                // Cleanup\n                childSpan?.end();\n                parentSpan?.end();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SpanE2E.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/applicationinsights-web\";\nimport { eOTelSpanKind, eOTelSpanStatusCode } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * E2E Tests for Span APIs that send real telemetry to Breeze endpoint\n *\n * These tests can be run manually to verify telemetry appears correctly in the Azure Portal:\n * 1. Set MANUAL_E2E_TEST to true\n * 2. Replace the instrumentationKey with a valid test iKey\n * 3. Run the tests\n * 4. Check the Azure Portal for the telemetry within 1-2 minutes\n *\n * Look for:\n * - Dependencies in the \"Performance\" blade\n * - Requests in the \"Performance\" blade\n * - Custom properties and measurements\n * - Distributed trace correlation\n * - End-to-end transaction view\n */\nexport class SpanE2ETests extends AITestClass {\n    // Set to true to actually send telemetry to Breeze for manual validation\n    private static readonly MANUAL_E2E_TEST = false;\n\n    // Replace with your test instrumentation key for manual E2E testing\n    private static readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private static readonly _connectionString = `InstrumentationKey=${SpanE2ETests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n\n    constructor(testName?: string) {\n        super(testName || \"SpanE2ETests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = !SpanE2ETests.MANUAL_E2E_TEST;\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: SpanE2ETests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    disableFetchTracking: false,\n                    enableAutoRouteTracking: true,\n                    disableExceptionTracking: false,\n                    maxBatchInterval: 1000, // Send quickly for manual testing\n                    enableDebug: true,\n                    loggingLevelConsole: 2 // Show warnings and errors\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            if (SpanE2ETests.MANUAL_E2E_TEST) {\n                console.log(\"=== MANUAL E2E TEST MODE ===\");\n                console.log(\"Telemetry will be sent to Breeze endpoint\");\n                console.log(\"Check Azure Portal in 1-2 minutes\");\n                console.log(\"Instrumentation Key:\", SpanE2ETests._instrumentationKey);\n                console.log(\"============================\");\n            }\n        } catch (e) {\n            console.error(\"Failed to initialize tests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            // Flush any pending telemetry before cleanup\n            this._ai.flush();\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addE2EBasicSpanTests();\n        this.addE2EDistributedTraceTests();\n        this.addE2EHttpDependencyTests();\n        this.addE2EDatabaseDependencyTests();\n        this.addE2EComplexScenarioTests();\n    }\n\n    private addE2EBasicSpanTests(): void {\n        this.testCase({\n            name: \"E2E: Basic CLIENT span creates RemoteDependency in portal\",\n            test: () => {\n                // This will appear in the Azure Portal under Performance -> Dependencies\n                const span = this._ai.startSpan(\"E2E-BasicClientSpan\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"test.scenario\": \"basic-client\",\n                        \"test.timestamp\": new Date().toISOString(),\n                        \"test.type\": \"manual-validation\",\n                        \"custom.property\": \"This should appear in custom properties\"\n                    }\n                });\n\n                // Simulate some work\n                if (span) {\n                    span.setAttribute(\"work.completed\", true);\n                    span.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span.end();\n                }\n\n                // Flush to ensure it's sent\n                this._ai.flush();\n\n                Assert.ok(span, \"Span should be created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Basic CLIENT span sent - Check Azure Portal Dependencies\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E: Basic SERVER span creates Request in portal\",\n            test: () => {\n                // This will appear in the Azure Portal under Performance -> Requests\n                const span = this._ai.startSpan(\"E2E-BasicServerSpan\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://example.com/api/test\",\n                        \"http.status_code\": 200,\n                        \"test.scenario\": \"basic-server\",\n                        \"test.timestamp\": new Date().toISOString()\n                    }\n                });\n\n                if (span) {\n                    span.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(span, \"Span should be created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Basic SERVER span sent - Check Azure Portal Requests\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E: Failed span shows as error in portal\",\n            test: () => {\n                const span = this._ai.startSpan(\"E2E-FailedOperation\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"test.scenario\": \"failure-case\",\n                        \"test.timestamp\": new Date().toISOString()\n                    }\n                });\n\n                if (span) {\n                    // Simulate a failure\n                    span.setAttribute(\"error.type\", \"TimeoutError\");\n                    span.setAttribute(\"error.message\", \"Operation timed out after 5000ms\");\n                    span.setStatus({\n                        code: eOTelSpanStatusCode.ERROR,\n                        message: \"Operation failed due to timeout\"\n                    });\n                    span.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(span, \"Span should be created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Failed span sent - Should show success=false in portal\");\n                }\n            }\n        });\n    }\n\n    private addE2EDistributedTraceTests(): void {\n        this.testCase({\n            name: \"E2E: Parent-child span relationship visible in portal\",\n            test: () => {\n                // Create parent span\n                const parentSpan = this._ai.startSpan(\"E2E-ParentOperation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"test.scenario\": \"distributed-trace\",\n                        \"test.timestamp\": new Date().toISOString(),\n                        \"operation.level\": \"parent\"\n                    }\n                });\n\n                const parentContext = parentSpan?.spanContext();\n\n                // Create child span with explicit parent\n                const childSpan1 = this._ai.startSpan(\"E2E-ChildOperation1\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"operation.level\": \"child\",\n                        \"child.index\": 1\n                    }\n                }, parentContext);\n\n                if (childSpan1) {\n                    childSpan1.setAttribute(\"http.url\", \"https://api.example.com/users\");\n                    childSpan1.setAttribute(\"http.method\", \"GET\");\n                    childSpan1.setStatus({ code: eOTelSpanStatusCode.OK });\n                    childSpan1.end();\n                }\n\n                // Create another child\n                const childSpan2 = this._ai.startSpan(\"E2E-ChildOperation2\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"operation.level\": \"child\",\n                        \"child.index\": 2\n                    }\n                }, parentContext);\n\n                if (childSpan2) {\n                    childSpan2.setAttribute(\"http.url\", \"https://api.example.com/orders\");\n                    childSpan2.setAttribute(\"http.method\", \"POST\");\n                    childSpan2.setStatus({ code: eOTelSpanStatusCode.OK });\n                    childSpan2.end();\n                }\n\n                // End parent\n                if (parentSpan) {\n                    parentSpan.setAttribute(\"children.count\", 2);\n                    parentSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    parentSpan.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(parentSpan && childSpan1 && childSpan2, \"All spans should be created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Distributed trace sent - Check End-to-End Transaction view\");\n                    console.log(\"  Parent operation.id:\", parentContext?.traceId);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E: Nested span hierarchy (3 levels) visible in portal\",\n            test: () => {\n                // Level 1: Root\n                const rootSpan = this._ai.startSpan(\"E2E-RootOperation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"test.scenario\": \"nested-hierarchy\",\n                        \"test.timestamp\": new Date().toISOString(),\n                        \"span.level\": 1\n                    }\n                });\n\n                const rootContext = rootSpan?.spanContext();\n\n                // Level 2: Child\n                const level2Span = this._ai.startSpan(\"E2E-Level2Operation\", {\n                    kind: eOTelSpanKind.INTERNAL,\n                    attributes: {\n                        \"span.level\": 2\n                    }\n                }, rootContext);\n\n                const level2Context = level2Span?.spanContext();\n\n                // Level 3: Grandchild\n                const level3Span = this._ai.startSpan(\"E2E-Level3Operation\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"span.level\": 3,\n                        \"http.url\": \"https://api.example.com/deep-call\"\n                    }\n                }, level2Context);\n\n                // End in reverse order (child first, parent last)\n                if (level3Span) {\n                    level3Span.setStatus({ code: eOTelSpanStatusCode.OK });\n                    level3Span.end();\n                }\n\n                if (level2Span) {\n                    level2Span.setStatus({ code: eOTelSpanStatusCode.OK });\n                    level2Span.end();\n                }\n\n                if (rootSpan) {\n                    rootSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    rootSpan.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(rootSpan && level2Span && level3Span, \"All spans should be created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ 3-level nested trace sent - Check transaction timeline\");\n                }\n            }\n        });\n    }\n\n    private addE2EHttpDependencyTests(): void {\n        this.testCase({\n            name: \"E2E: HTTP dependency with full details in portal\",\n            test: () => {\n                const span = this._ai.startSpan(\"E2E-HTTPDependency\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://api.example.com/v1/users/create\",\n                        \"http.status_code\": 201,\n                        \"http.request.header.content-type\": \"application/json\",\n                        \"http.response.header.content-length\": \"1234\",\n                        \"test.scenario\": \"http-dependency\",\n                        \"test.timestamp\": new Date().toISOString(),\n                        \"request.body.size\": 512,\n                        \"response.time.ms\": 145\n                    }\n                });\n\n                if (span) {\n                    span.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(span, \"Span should be created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ HTTP dependency sent - Check Dependencies with full HTTP details\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E: HTTP dependency with various status codes in portal\",\n            test: () => {\n                const statusCodes = [200, 201, 204, 400, 401, 403, 404, 500, 502, 503];\n\n                for (const statusCode of statusCodes) {\n                    const isSuccess = statusCode >= 200 && statusCode < 400;\n                    const span = this._ai.startSpan(`E2E-HTTP-${statusCode}`, {\n                        kind: eOTelSpanKind.CLIENT,\n                        attributes: {\n                            \"http.method\": \"GET\",\n                            \"http.url\": `https://api.example.com/status/${statusCode}`,\n                            \"http.status_code\": statusCode,\n                            \"test.scenario\": \"http-status-codes\",\n                            \"test.timestamp\": new Date().toISOString()\n                        }\n                    });\n\n                    if (span) {\n                        span.setStatus({\n                            code: isSuccess ? eOTelSpanStatusCode.OK : eOTelSpanStatusCode.ERROR\n                        });\n                        span.end();\n                    }\n                }\n\n                this._ai.flush();\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Multiple HTTP status codes sent - Check success/failure in portal\");\n                }\n\n                Assert.ok(true, \"Multiple status codes tested\");\n            }\n        });\n    }\n\n    private addE2EDatabaseDependencyTests(): void {\n        this.testCase({\n            name: \"E2E: Database dependencies appear in portal\",\n            test: () => {\n                const databases = [\n                    { system: \"mysql\", statement: \"SELECT * FROM users WHERE id = ?\", name: \"production_db\" },\n                    { system: \"postgresql\", statement: \"INSERT INTO logs (message, level) VALUES ($1, $2)\", name: \"logs_db\" },\n                    { system: \"mongodb\", statement: \"db.products.find({category: 'electronics'})\", name: \"catalog_db\" },\n                    { system: \"redis\", statement: \"GET user:session:abc123\", name: \"cache_db\" },\n                    { system: \"mssql\", statement: \"EXEC sp_GetUserOrders @UserId=123\", name: \"orders_db\" }\n                ];\n\n                for (const db of databases) {\n                    const span = this._ai.startSpan(`E2E-DB-${db.system}`, {\n                        kind: eOTelSpanKind.CLIENT,\n                        attributes: {\n                            \"db.system\": db.system,\n                            \"db.statement\": db.statement,\n                            \"db.name\": db.name,\n                            \"db.user\": \"app_user\",\n                            \"net.peer.name\": `${db.system}.example.com`,\n                            \"net.peer.port\": 5432,\n                            \"test.scenario\": \"database-dependencies\",\n                            \"test.timestamp\": new Date().toISOString()\n                        }\n                    });\n\n                    if (span) {\n                        span.setAttribute(\"db.rows.affected\", 42);\n                        span.setAttribute(\"db.duration.ms\", 23);\n                        span.setStatus({ code: eOTelSpanStatusCode.OK });\n                        span.end();\n                    }\n                }\n\n                this._ai.flush();\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Database dependencies sent - Check Dependencies for SQL/NoSQL types\");\n                }\n\n                Assert.ok(true, \"Database dependencies tested\");\n            }\n        });\n\n        this.testCase({\n            name: \"E2E: Database slow query marked appropriately\",\n            test: () => {\n                const span = this._ai.startSpan(\"E2E-SlowDatabaseQuery\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"db.system\": \"postgresql\",\n                        \"db.statement\": \"SELECT * FROM orders JOIN users ON orders.user_id = users.id WHERE created_at > NOW() - INTERVAL '30 days'\",\n                        \"db.name\": \"analytics_db\",\n                        \"test.scenario\": \"slow-query\",\n                        \"test.timestamp\": new Date().toISOString(),\n                        \"db.query.execution.plan\": \"SeqScan on orders (cost=0.00..1000.00 rows=10000)\",\n                        \"db.slow.query\": true,\n                        \"db.duration.ms\": 5432\n                    }\n                });\n\n                if (span) {\n                    // Mark as warning (not error, but slow)\n                    span.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span.setAttribute(\"performance.warning\", \"Query exceeded 1000ms threshold\");\n                    span.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(span, \"Slow query span created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Slow database query sent - Check duration in portal\");\n                }\n            }\n        });\n    }\n\n    private addE2EComplexScenarioTests(): void {\n        this.testCase({\n            name: \"E2E: Complex e-commerce checkout scenario in portal\",\n            test: () => {\n                // Simulate a complete e-commerce checkout flow with multiple dependencies\n                const timestamp = new Date().toISOString();\n\n                // 1. Initial checkout request\n                const checkoutSpan = this._ai.startSpan(\"E2E-CheckoutRequest\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"test.scenario\": \"complex-ecommerce\",\n                        \"test.timestamp\": timestamp,\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://shop.example.com/api/checkout\",\n                        \"http.status_code\": 200,\n                        \"user.id\": \"user_12345\",\n                        \"cart.items.count\": 3,\n                        \"cart.total.amount\": 299.97\n                    }\n                });\n\n                const checkoutContext = checkoutSpan?.spanContext();\n\n                // 2. Validate inventory\n                const inventorySpan = this._ai.startSpan(\"E2E-ValidateInventory\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://inventory-api.example.com/validate\",\n                        \"http.status_code\": 200,\n                        \"items.validated\": 3\n                    }\n                }, checkoutContext);\n\n                if (inventorySpan) {\n                    inventorySpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    inventorySpan.end();\n                }\n\n                // 3. Calculate shipping\n                const shippingSpan = this._ai.startSpan(\"E2E-CalculateShipping\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://shipping-api.example.com/calculate\",\n                        \"http.status_code\": 200,\n                        \"shipping.method\": \"express\",\n                        \"shipping.cost\": 15.99\n                    }\n                }, checkoutContext);\n\n                if (shippingSpan) {\n                    shippingSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    shippingSpan.end();\n                }\n\n                // 4. Process payment\n                const paymentSpan = this._ai.startSpan(\"E2E-ProcessPayment\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://payments.example.com/charge\",\n                        \"http.status_code\": 200,\n                        \"payment.method\": \"credit_card\",\n                        \"payment.amount\": 315.96,\n                        \"payment.currency\": \"USD\"\n                    }\n                }, checkoutContext);\n\n                if (paymentSpan) {\n                    paymentSpan.setAttribute(\"payment.processor\", \"stripe\");\n                    paymentSpan.setAttribute(\"payment.transaction.id\", \"txn_abc123xyz\");\n                    paymentSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    paymentSpan.end();\n                }\n\n                // 5. Create order in database\n                const createOrderSpan = this._ai.startSpan(\"E2E-CreateOrder\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"db.system\": \"postgresql\",\n                        \"db.statement\": \"INSERT INTO orders (user_id, total, status) VALUES ($1, $2, $3) RETURNING id\",\n                        \"db.name\": \"orders_db\",\n                        \"db.operation\": \"INSERT\"\n                    }\n                }, checkoutContext);\n\n                if (createOrderSpan) {\n                    createOrderSpan.setAttribute(\"order.id\", \"ord_98765\");\n                    createOrderSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    createOrderSpan.end();\n                }\n\n                // 6. Send confirmation email\n                const emailSpan = this._ai.startSpan(\"E2E-SendConfirmationEmail\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://email-service.example.com/send\",\n                        \"http.status_code\": 202,\n                        \"email.recipient\": \"user@example.com\",\n                        \"email.template\": \"order-confirmation\"\n                    }\n                }, checkoutContext);\n\n                if (emailSpan) {\n                    emailSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    emailSpan.end();\n                }\n\n                // 7. Update cache\n                const cacheSpan = this._ai.startSpan(\"E2E-UpdateCache\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"db.system\": \"redis\",\n                        \"db.statement\": \"SET user:12345:last_order ord_98765 EX 86400\",\n                        \"cache.operation\": \"set\",\n                        \"cache.key\": \"user:12345:last_order\"\n                    }\n                }, checkoutContext);\n\n                if (cacheSpan) {\n                    cacheSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    cacheSpan.end();\n                }\n\n                // Complete checkout\n                if (checkoutSpan) {\n                    checkoutSpan.setAttribute(\"checkout.status\", \"completed\");\n                    checkoutSpan.setAttribute(\"order.id\", \"ord_98765\");\n                    checkoutSpan.setAttribute(\"dependencies.count\", 7);\n                    checkoutSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    checkoutSpan.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(checkoutSpan, \"Checkout span created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Complex e-commerce scenario sent\");\n                    console.log(\"  Trace ID:\", checkoutContext?.traceId);\n                    console.log(\"  Check End-to-End Transaction view for complete flow\");\n                    console.log(\"  Expected: 1 Request + 7 Dependencies\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E: Mixed success and failure scenario in portal\",\n            test: () => {\n                const timestamp = new Date().toISOString();\n\n                // Parent operation\n                const operationSpan = this._ai.startSpan(\"E2E-MixedResultsOperation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"test.scenario\": \"mixed-success-failure\",\n                        \"test.timestamp\": timestamp\n                    }\n                });\n\n                const operationContext = operationSpan?.spanContext();\n\n                // Successful child 1\n                const successSpan1 = this._ai.startSpan(\"E2E-SuccessfulCall1\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.url\": \"https://api.example.com/service1\",\n                        \"http.status_code\": 200\n                    }\n                }, operationContext);\n\n                if (successSpan1) {\n                    successSpan1.setStatus({ code: eOTelSpanStatusCode.OK });\n                    successSpan1.end();\n                }\n\n                // Failed child\n                const failedSpan = this._ai.startSpan(\"E2E-FailedCall\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.url\": \"https://api.example.com/service2\",\n                        \"http.status_code\": 503\n                    }\n                }, operationContext);\n\n                if (failedSpan) {\n                    failedSpan.setAttribute(\"error.type\", \"ServiceUnavailable\");\n                    failedSpan.setAttribute(\"retry.count\", 3);\n                    failedSpan.setStatus({\n                        code: eOTelSpanStatusCode.ERROR,\n                        message: \"Service temporarily unavailable\"\n                    });\n                    failedSpan.end();\n                }\n\n                // Successful child 2 (after retry)\n                const successSpan2 = this._ai.startSpan(\"E2E-SuccessfulCall2\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.url\": \"https://api.example.com/service3\",\n                        \"http.status_code\": 200\n                    }\n                }, operationContext);\n\n                if (successSpan2) {\n                    successSpan2.setStatus({ code: eOTelSpanStatusCode.OK });\n                    successSpan2.end();\n                }\n\n                // Parent partially successful\n                if (operationSpan) {\n                    operationSpan.setAttribute(\"successful.calls\", 2);\n                    operationSpan.setAttribute(\"failed.calls\", 1);\n                    operationSpan.setAttribute(\"total.calls\", 3);\n                    operationSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    operationSpan.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(operationSpan, \"Operation span created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Mixed success/failure scenario sent\");\n                    console.log(\"  Check for 2 successful + 1 failed dependency in transaction\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E: Span with rich custom properties for portal search\",\n            test: () => {\n                const span = this._ai.startSpan(\"E2E-RichProperties\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"test.scenario\": \"rich-properties\",\n                        \"test.timestamp\": new Date().toISOString(),\n\n                        // Business context\n                        \"business.tenant\": \"acme-corp\",\n                        \"business.region\": \"us-west-2\",\n                        \"business.environment\": \"production\",\n\n                        // User context\n                        \"user.id\": \"user_12345\",\n                        \"user.email\": \"test@example.com\",\n                        \"user.subscription\": \"premium\",\n                        \"user.account.age.days\": 456,\n\n                        // Request context\n                        \"request.id\": \"req_abc123\",\n                        \"request.source\": \"web-app\",\n                        \"request.version\": \"v2.3.1\",\n\n                        // Performance metrics\n                        \"performance.db.queries\": 5,\n                        \"performance.cache.hits\": 3,\n                        \"performance.cache.misses\": 2,\n                        \"performance.total.ms\": 234,\n\n                        // Feature flags\n                        \"feature.new.checkout\": true,\n                        \"feature.ab.test.group\": \"variant-b\",\n\n                        // Custom measurements\n                        \"metrics.items.processed\": 42,\n                        \"metrics.data.size.kb\": 128\n                    }\n                });\n\n                if (span) {\n                    span.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span.end();\n                }\n\n                this._ai.flush();\n\n                Assert.ok(span, \"Span with rich properties created\");\n\n                if (SpanE2ETests.MANUAL_E2E_TEST) {\n                    console.log(\"✓ Span with rich properties sent\");\n                    console.log(\"  Use Application Insights search to filter by custom properties\");\n                    console.log(\"  Example queries:\");\n                    console.log(\"    - customDimensions.business.tenant == 'acme-corp'\");\n                    console.log(\"    - customDimensions.user.subscription == 'premium'\");\n                    console.log(\"    - customDimensions.feature.new.checkout == true\");\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SpanErrorHandling.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { IReadableSpan, eOTelSpanStatusCode, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\nexport class SpanErrorHandlingTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${SpanErrorHandlingTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"SpanErrorHandlingTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: SpanErrorHandlingTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize tests: ' + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addInvalidSpanNameTests();\n        this.addInvalidAttributeTests();\n        this.addNullUndefinedInputTests();\n        this.addInvalidParentContextTests();\n        this.addInvalidOptionsTests();\n        this.addEdgeCaseTests();\n    }\n\n    private addInvalidSpanNameTests(): void {\n        this.testCase({\n            name: \"SpanName: empty string name should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"\");\n                    span?.end();\n                }, \"Empty string name should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanName: null name should handle gracefully\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(null as any);\n                    span?.end();\n                }, \"Null name should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanName: undefined name should handle gracefully\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(undefined as any);\n                    span?.end();\n                }, \"Undefined name should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanName: very long name should be accepted\",\n            test: () => {\n                // Arrange\n                const longName = \"a\".repeat(10000);\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(longName);\n                    Assert.ok(span, \"Should create span with long name\");\n                    span?.end();\n                }, \"Very long name should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanName: special characters in name should be accepted\",\n            test: () => {\n                // Arrange\n                const specialNames = [\n                    \"span-with-dashes\",\n                    \"span_with_underscores\",\n                    \"span.with.dots\",\n                    \"span/with/slashes\",\n                    \"span:with:colons\",\n                    \"span@with@at\",\n                    \"span#with#hash\",\n                    \"span$with$dollar\"\n                ];\n\n                // Act & Assert\n                specialNames.forEach(name => {\n                    Assert.doesNotThrow(() => {\n                        const span = this._ai.startSpan(name);\n                        span?.end();\n                    }, `Special character name '${name}' should not throw`);\n                });\n            }\n        });\n    }\n\n    private addInvalidAttributeTests(): void {\n        this.testCase({\n            name: \"Attributes: null attribute value should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"null-attribute-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"nullable.attr\", null);\n                }, \"Setting null attribute should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: undefined attribute value should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"undefined-attribute-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"undefined.attr\", undefined);\n                }, \"Setting undefined attribute should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: empty string attribute key should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"empty-key-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"\", \"value\");\n                }, \"Empty string key should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: null attribute key should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"null-key-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(null as any, \"value\");\n                }, \"Null key should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: undefined attribute key should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"undefined-key-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(undefined as any, \"value\");\n                }, \"Undefined key should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: invalid attribute value types should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"invalid-type-test\");\n\n                // Act & Assert - Test various invalid types\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"object.attr\", { nested: \"object\" } as any);\n                    span?.setAttribute(\"array.attr\", [1, 2, 3] as any);\n                    span?.setAttribute(\"function.attr\", (() => {}) as any);\n                    span?.setAttribute(\"symbol.attr\", Symbol(\"test\") as any);\n                }, \"Invalid attribute types should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: setAttributes with null should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"setAttributes-null-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttributes(null as any);\n                }, \"setAttributes with null should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: setAttributes with undefined should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"setAttributes-undefined-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttributes(undefined as any);\n                }, \"setAttributes with undefined should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: setAttributes with invalid object should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"setAttributes-invalid-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttributes({\n                        \"valid\": \"value\",\n                        \"null.value\": null,\n                        \"undefined.value\": undefined,\n                        \"object.value\": { nested: \"obj\" } as any\n                    });\n                }, \"setAttributes with mixed valid/invalid should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n    }\n\n    private addNullUndefinedInputTests(): void {\n        this.testCase({\n            name: \"NullUndefined: startSpan with null options should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"null-options-test\", null as any);\n                    span?.end();\n                }, \"Null options should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: startSpan with undefined options should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"undefined-options-test\", undefined);\n                    span?.end();\n                }, \"Undefined options should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: setStatus with null should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"null-status-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setStatus(null as any);\n                }, \"setStatus with null should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: setStatus with undefined should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"undefined-status-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setStatus(undefined as any);\n                }, \"setStatus with undefined should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: updateName with null should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"null-name-update-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.updateName(null as any);\n                }, \"updateName with null should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: updateName with undefined should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"undefined-name-update-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.updateName(undefined as any);\n                }, \"updateName with undefined should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: end with null time should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"null-end-time-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.end(null as any);\n                }, \"end with null time should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: end with undefined time should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"undefined-end-time-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.end(undefined);\n                }, \"end with undefined time should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: recordException with null should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"null-exception-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.recordException(null as any);\n                }, \"recordException with null should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"NullUndefined: recordException with undefined should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"undefined-exception-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.recordException(undefined as any);\n                }, \"recordException with undefined should not throw\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n    }\n\n    private addInvalidParentContextTests(): void {\n        this.testCase({\n            name: \"ParentContext: null parent context should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"null-parent-test\", undefined, null as any);\n                    span?.end();\n                }, \"Null parent context should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"ParentContext: undefined parent context should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"undefined-parent-test\", undefined, undefined);\n                    span?.end();\n                }, \"Undefined parent context should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"ParentContext: invalid parent context object should not throw\",\n            test: () => {\n                // Arrange - Create invalid context objects\n                const invalidContexts = [\n                    {},\n                    { traceId: \"invalid\" },\n                    { spanId: \"invalid\" },\n                    { traceId: \"\", spanId: \"\" },\n                    { traceId: \"123\", spanId: \"456\" } // Too short\n                ];\n\n                // Act & Assert\n                invalidContexts.forEach((ctx, index) => {\n                    Assert.doesNotThrow(() => {\n                        const span = this._ai.startSpan(`invalid-context-${index}`, undefined, ctx as any);\n                        span?.end();\n                    }, `Invalid context ${index} should not throw`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"ParentContext: parent context with missing fields should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"missing-fields-test\", undefined, {\n                        traceId: \"12345678901234567890123456789012\"\n                        // Missing spanId and traceFlags\n                    } as any);\n                    span?.end();\n                }, \"Parent context with missing fields should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"ParentContext: parent context with wrong types should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"wrong-types-test\", undefined, {\n                        traceId: 123456789, // Should be string\n                        spanId: 987654321, // Should be string\n                        traceFlags: \"invalid\" // Should be number\n                    } as any);\n                    span?.end();\n                }, \"Parent context with wrong types should not throw\");\n            }\n        });\n    }\n\n    private addInvalidOptionsTests(): void {\n        this.testCase({\n            name: \"Options: invalid kind value should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"invalid-kind-test\", {\n                        kind: 999 as any // Invalid kind value\n                    });\n                    span?.end();\n                }, \"Invalid kind value should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Options: negative kind value should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"negative-kind-test\", {\n                        kind: -1 as any\n                    });\n                    span?.end();\n                }, \"Negative kind value should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Options: null attributes in options should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"null-attrs-options-test\", {\n                        attributes: null as any\n                    });\n                    span?.end();\n                }, \"Null attributes in options should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Options: undefined attributes in options should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"undefined-attrs-options-test\", {\n                        attributes: undefined\n                    });\n                    span?.end();\n                }, \"Undefined attributes in options should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Options: invalid startTime should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"invalid-starttime-test\", {\n                        startTime: \"invalid\" as any\n                    });\n                    span?.end();\n                }, \"Invalid startTime should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Options: negative startTime should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"negative-starttime-test\", {\n                        startTime: -1000\n                    });\n                    span?.end();\n                }, \"Negative startTime should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Options: future startTime should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"future-starttime-test\", {\n                        startTime: Date.now() + 1000000\n                    });\n                    span?.end();\n                }, \"Future startTime should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Options: multiple invalid options should not throw\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = this._ai.startSpan(\"multi-invalid-options-test\", {\n                        kind: -999 as any,\n                        attributes: null as any,\n                        startTime: \"invalid\" as any,\n                        recording: \"maybe\" as any,\n                        root: \"yes\" as any\n                    } as any);\n                    span?.end();\n                }, \"Multiple invalid options should not throw\");\n            }\n        });\n    }\n\n    private addEdgeCaseTests(): void {\n        this.testCase({\n            name: \"EdgeCase: operations on null span should not throw\",\n            test: () => {\n                // Arrange - Force null span (though SDK shouldn't return null)\n                const span: IReadableSpan | null = null;\n\n                // Act & Assert - All operations should be safe\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"key\", \"value\");\n                    span?.setAttributes({ \"key\": \"value\" });\n                    span?.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span?.updateName(\"new-name\");\n                    span?.end();\n                    span?.recordException(new Error(\"test\"));\n                }, \"Operations on null span should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"EdgeCase: extremely large attribute count should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"large-attr-count-test\");\n                const largeAttrs: any = {};\n                for (let i = 0; i < 1000; i++) {\n                    largeAttrs[`attr_${i}`] = `value_${i}`;\n                }\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttributes(largeAttrs);\n                    span?.end();\n                }, \"Large attribute count should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"EdgeCase: very long attribute values should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"long-attr-value-test\");\n                const longValue = \"x\".repeat(100000);\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"long.attr\", longValue);\n                    span?.end();\n                }, \"Very long attribute values should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"EdgeCase: rapid successive operations should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"rapid-ops-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    for (let i = 0; i < 100; i++) {\n                        span?.setAttribute(`rapid_${i}`, i);\n                        span?.setStatus({ code: eOTelSpanStatusCode.OK });\n                        span?.updateName(`name_${i}`);\n                    }\n                    span?.end();\n                }, \"Rapid successive operations should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"EdgeCase: mixed valid and invalid operations should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"mixed-ops-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"valid\", \"value\");\n                    span?.setAttribute(null as any, \"invalid-key\");\n                    span?.setAttribute(\"another.valid\", 123);\n                    span?.setAttribute(\"\", \"empty-key\");\n                    span?.setAttributes({ \"good\": \"attr\", \"bad\": null });\n                    span?.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span?.updateName(null as any);\n                    span?.updateName(\"valid-name\");\n                    span?.end();\n                }, \"Mixed valid and invalid operations should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"EdgeCase: special Unicode characters should not throw\",\n            test: () => {\n                // Arrange\n                const unicodeStrings = [\n                    \"Hello 世界\",\n                    \"Emoji 😀🎉\",\n                    \"RTL العربية\",\n                    \"Combined ñ é ü\",\n                    \"Zero-width\\u200B\\u200Ccharacters\"\n                ];\n\n                // Act & Assert\n                unicodeStrings.forEach((str, index) => {\n                    Assert.doesNotThrow(() => {\n                        const span = this._ai.startSpan(str);\n                        span?.setAttribute(\"unicode.attr\", str);\n                        span?.updateName(`unicode_${index}_${str}`);\n                        span?.end();\n                    }, `Unicode string ${index} should not throw`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"EdgeCase: circular reference in error should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"circular-error-test\");\n                const circularError: any = new Error(\"Circular test\");\n                circularError.self = circularError; // Create circular reference\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.recordException(circularError);\n                    span?.end();\n                }, \"Circular reference in error should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"EdgeCase: NaN and Infinity values should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"special-numbers-test\");\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"nan.value\", NaN as any);\n                    span?.setAttribute(\"infinity.value\", Infinity as any);\n                    span?.setAttribute(\"neg.infinity.value\", -Infinity as any);\n                    span?.end();\n                }, \"NaN and Infinity values should not throw\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SpanHelperUtils.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/applicationinsights-web\";\nimport {\n    createDistributedTraceContext,\n    eOTelSpanKind,\n    eOTelSpanStatusCode,\n    IDistributedTraceInit,\n    isReadableSpan,\n    isSpanContextValid,\n    ITelemetryItem,\n    wrapSpanContext\n} from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Comprehensive tests for span helper utility functions\n * \n * Tests verify:\n * - isSpanContextValid: validates span context\n * - wrapSpanContext: wraps external span contexts\n * - isReadableSpan: type guard for spans\n * - createNonRecordingSpan: creates non-recording spans (tested via wrapSpanContext)\n */\nexport class SpanHelperUtilsTests extends AITestClass {\n    private static readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private static readonly _connectionString = `InstrumentationKey=${SpanHelperUtilsTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"SpanHelperUtilsTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: SpanHelperUtilsTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n        } catch (e) {\n            console.error(\"Failed to initialize tests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addIsSpanContextValidTests();\n        this.addWrapSpanContextTests();\n        this.addIsReadableSpanTests();\n        this.addHelperIntegrationTests();\n    }\n\n    private addIsSpanContextValidTests(): void {\n        this.testCase({\n            name: \"isSpanContextValid: valid span context returns true\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"test-span\");\n                const spanContext = span?.spanContext();\n\n                // Act\n                const isValid = isSpanContextValid(spanContext!);\n\n                // Assert\n                Assert.ok(isValid, \"Valid span context should return true\");\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: valid traceId and spanId returns true\",\n            test: () => {\n                // Arrange - create valid context\n                const validContext = createDistributedTraceContext({\n                    traceId: \"0123456789abcdef0123456789abcdef\", // 32 hex chars\n                    spanId: \"0123456789abcdef\", // 16 hex chars\n                    traceFlags: 1\n                });\n\n                // Act\n                const isValid = isSpanContextValid(validContext);\n\n                // Assert\n                Assert.ok(isValid, \"Context with valid IDs should return true\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: invalid traceId returns false\",\n            test: () => {\n                // Arrange - traceId too short (use IDistributedTraceInit directly, not createDistributedTraceContext which validates)\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"0123456789abcdef\", // Only 16 chars (should be 32)\n                    spanId: \"0123456789abcdef\",\n                    traceFlags: 1\n                };\n\n                // Act\n                const isValid = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!isValid, \"Context with invalid traceId should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: invalid spanId returns false\",\n            test: () => {\n                // Arrange - spanId too short (use IDistributedTraceInit directly, not createDistributedTraceContext which validates)\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"0123456789abcdef0123456789abcdef\",\n                    spanId: \"01234567\", // Only 8 chars (should be 16)\n                    traceFlags: 1\n                };\n\n                // Act\n                const isValid = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!isValid, \"Context with invalid spanId should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: all zeros traceId returns false\",\n            test: () => {\n                // Arrange - all zeros is invalid per spec (use IDistributedTraceInit directly, not createDistributedTraceContext which validates)\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"00000000000000000000000000000000\",\n                    spanId: \"0123456789abcdef\",\n                    traceFlags: 1\n                };\n\n                // Act\n                const isValid = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!isValid, \"Context with all-zero traceId should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: all zeros spanId returns false\",\n            test: () => {\n                // Arrange - all zeros is invalid per spec (use IDistributedTraceInit directly, not createDistributedTraceContext which validates)\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"0123456789abcdef0123456789abcdef\",\n                    spanId: \"0000000000000000\",\n                    traceFlags: 1\n                };\n\n                // Act\n                const isValid = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!isValid, \"Context with all-zero spanId should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: null context returns false\",\n            test: () => {\n                // Act\n                const isValid = isSpanContextValid(null as any);\n\n                // Assert\n                Assert.ok(!isValid, \"Null context should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: undefined context returns false\",\n            test: () => {\n                // Act\n                const isValid = isSpanContextValid(undefined as any);\n\n                // Assert\n                Assert.ok(!isValid, \"Undefined context should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: empty traceId returns false\",\n            test: () => {\n                // Arrange - use IDistributedTraceInit directly, not createDistributedTraceContext which validates\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"\",\n                    spanId: \"0123456789abcdef\",\n                    traceFlags: 1\n                };\n\n                // Act\n                const isValid = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!isValid, \"Empty traceId should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: empty spanId returns false\",\n            test: () => {\n                // Arrange - use IDistributedTraceInit directly, not createDistributedTraceContext which validates\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"0123456789abcdef0123456789abcdef\",\n                    spanId: \"\",\n                    traceFlags: 1\n                };\n\n                // Act\n                const isValid = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!isValid, \"Empty spanId should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: non-hex characters in traceId returns false\",\n            test: () => {\n                // Arrange - use IDistributedTraceInit directly, not createDistributedTraceContext which validates\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"0123456789abcdefghij456789abcdef\", // Contains g-j\n                    spanId: \"0123456789abcdef\",\n                    traceFlags: 1\n                };\n\n                // Act\n                const isValid = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!isValid, \"TraceId with non-hex chars should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: uppercase hex characters are valid\",\n            test: () => {\n                // Arrange\n                const validContext = createDistributedTraceContext({\n                    traceId: \"0123456789ABCDEF0123456789ABCDEF\",\n                    spanId: \"0123456789ABCDEF\",\n                    traceFlags: 1\n                });\n\n                // Act\n                const isValid = isSpanContextValid(validContext);\n\n                // Assert\n                Assert.ok(isValid, \"Uppercase hex characters should be valid\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: mixed case hex characters are valid\",\n            test: () => {\n                // Arrange\n                const validContext = createDistributedTraceContext({\n                    traceId: \"0123456789AbCdEf0123456789AbCdEf\",\n                    spanId: \"0123456789AbCdEf\",\n                    traceFlags: 1\n                });\n\n                // Act\n                const isValid = isSpanContextValid(validContext);\n\n                // Assert\n                Assert.ok(isValid, \"Mixed case hex characters should be valid\");\n            }\n        });\n    }\n\n    private addWrapSpanContextTests(): void {\n        this.testCase({\n            name: \"wrapSpanContext: creates non-recording span from context\",\n            test: () => {\n                // Arrange\n                const originalSpan = this._ai.startSpan(\"original-span\");\n                const spanContext = originalSpan?.spanContext();\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, spanContext!);\n\n                // Assert\n                Assert.ok(wrappedSpan, \"Wrapped span should be created\");\n                Assert.ok(!wrappedSpan.isRecording(), \"Wrapped span should not be recording\");\n                Assert.equal(wrappedSpan.spanContext().traceId, spanContext?.traceId, \"TraceId should match\");\n                Assert.equal(wrappedSpan.spanContext().spanId, spanContext?.spanId, \"SpanId should match\");\n\n                // Cleanup\n                originalSpan?.end();\n                wrappedSpan.end();\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: wrapped span name includes spanId\",\n            test: () => {\n                // Arrange\n                const spanContext = createDistributedTraceContext({\n                    traceId: \"0123456789abcdef0123456789abcdef\",\n                    spanId: \"0123456789abcdef\",\n                    traceFlags: 1\n                });\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, spanContext);\n\n                // Assert\n                Assert.ok(wrappedSpan.name.includes(spanContext.spanId), \n                    \"Wrapped span name should include spanId\");\n                Assert.ok(wrappedSpan.name.includes(\"wrapped\"), \n                    \"Wrapped span name should indicate it's wrapped\");\n\n                wrappedSpan.end();\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: wrapped span does not generate telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const spanContext = createDistributedTraceContext({\n                    traceId: \"abcdef0123456789abcdef0123456789\",\n                    spanId: \"abcdef0123456789\",\n                    traceFlags: 1\n                });\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, spanContext);\n                wrappedSpan.setAttribute(\"test\", \"value\");\n                wrappedSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                wrappedSpan.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 0, \n                    \"Wrapped span should not generate telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: wrapped span kind is INTERNAL\",\n            test: () => {\n                // Arrange\n                const spanContext = createDistributedTraceContext({\n                    traceId: \"fedcba9876543210fedcba9876543210\",\n                    spanId: \"fedcba9876543210\",\n                    traceFlags: 1\n                });\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, spanContext);\n\n                // Assert\n                Assert.equal(wrappedSpan.kind, eOTelSpanKind.INTERNAL, \n                    \"Wrapped span should have INTERNAL kind\");\n\n                wrappedSpan.end();\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: can use wrapped span as parent\",\n            test: () => {\n                // Arrange\n                const parentContext = createDistributedTraceContext({\n                    traceId: \"1234567890abcdef1234567890abcdef\",\n                    spanId: \"1234567890abcdef\",\n                    traceFlags: 1\n                });\n                const wrappedParent = wrapSpanContext(this._ai.otelApi, parentContext);\n\n                // Act - create child with wrapped parent\n                const childSpan = this._ai.startSpan(\"child-span\", {\n                    kind: eOTelSpanKind.CLIENT\n                }, wrappedParent.spanContext());\n\n                // Assert\n                Assert.ok(childSpan, \"Child span should be created\");\n                Assert.equal(childSpan.spanContext().traceId, parentContext.traceId, \n                    \"Child should have same traceId as wrapped parent\");\n\n                // Cleanup\n                childSpan?.end();\n                wrappedParent.end();\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: wrapped span supports all span operations\",\n            test: () => {\n                // Arrange\n                const spanContext = createDistributedTraceContext({\n                    traceId: \"aabbccddeeff00112233445566778899\",\n                    spanId: \"aabbccddeeff0011\",\n                    traceFlags: 1\n                });\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, spanContext);\n\n                // Act - perform various operations\n                wrappedSpan.setAttribute(\"key1\", \"value1\");\n                wrappedSpan.setAttributes({\n                    \"key2\": 123,\n                    \"key3\": true\n                });\n                wrappedSpan.updateName(\"new-name\");\n                wrappedSpan.setStatus({ code: eOTelSpanStatusCode.OK, message: \"Success\" });\n                wrappedSpan.recordException(new Error(\"Test error\"));\n\n                // Assert - operations should not throw\n                Assert.ok(true, \"All operations should complete without error\");\n                Assert.equal(wrappedSpan.name, \"new-name\", \"Name should be updated\");\n\n                wrappedSpan.end();\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: preserves traceFlags if present\",\n            test: () => {\n                // Arrange\n                const spanContext = createDistributedTraceContext({\n                    traceId: \"11112222333344445555666677778888\",\n                    spanId: \"1111222233334444\",\n                    traceFlags: 1 // Sampled\n                });\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, spanContext);\n\n                // Assert\n                Assert.equal(wrappedSpan.spanContext().traceFlags, 1, \n                    \"TraceFlags should be preserved\");\n\n                wrappedSpan.end();\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: multiple wrapped spans from same context are independent\",\n            test: () => {\n                // Arrange\n                const spanContext = createDistributedTraceContext({\n                    traceId: \"99887766554433221100ffeeddccbbaa\",\n                    spanId: \"9988776655443322\",\n                    traceFlags: 1\n                });\n\n                // Act\n                const wrapped1 = wrapSpanContext(this._ai.otelApi, spanContext);\n                const wrapped2 = wrapSpanContext(this._ai.otelApi, spanContext);\n\n                // Assert - both wrap same context but are different span objects\n                Assert.notEqual(wrapped1, wrapped2, \"Should create different span objects\");\n                Assert.equal(wrapped1.spanContext().traceId, wrapped2.spanContext().traceId, \n                    \"Both should have same traceId\");\n                Assert.equal(wrapped1.spanContext().spanId, wrapped2.spanContext().spanId, \n                    \"Both should have same spanId\");\n\n                // Operations on one should not affect the other\n                wrapped1.updateName(\"wrapped-1\");\n                wrapped2.updateName(\"wrapped-2\");\n                Assert.equal(wrapped1.name, \"wrapped-1\", \"First span name\");\n                Assert.equal(wrapped2.name, \"wrapped-2\", \"Second span name\");\n\n                wrapped1.end();\n                wrapped2.end();\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: can wrap context from external system\",\n            test: () => {\n                // Arrange - simulate receiving context from external system (e.g., HTTP header)\n                const externalContext = createDistributedTraceContext({\n                    traceId: \"00112233445566778899aabbccddeeff\",\n                    spanId: \"0011223344556677\",\n                    traceFlags: 1\n                });\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, externalContext);\n                \n                // Create child span to continue the trace\n                const childSpan = this._ai.startSpan(\"continue-external-trace\", {\n                    kind: eOTelSpanKind.SERVER\n                }, wrappedSpan.spanContext());\n\n                // Assert\n                Assert.equal(childSpan?.spanContext().traceId, externalContext.traceId, \n                    \"Should continue external trace\");\n                Assert.notEqual(childSpan?.spanContext().spanId, externalContext.spanId, \n                    \"Should have new spanId\");\n\n                // Cleanup\n                childSpan?.end();\n                wrappedSpan.end();\n            }\n        });\n    }\n\n    private addIsReadableSpanTests(): void {\n        this.testCase({\n            name: \"isReadableSpan: valid span returns true\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"test-span\");\n\n                // Act\n                const isValid = isReadableSpan(span);\n\n                // Assert\n                Assert.ok(isValid, \"Valid span should return true\");\n\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: null returns false\",\n            test: () => {\n                // Act\n                const isValid = isReadableSpan(null);\n\n                // Assert\n                Assert.ok(!isValid, \"Null should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: undefined returns false\",\n            test: () => {\n                // Act\n                const isValid = isReadableSpan(undefined);\n\n                // Assert\n                Assert.ok(!isValid, \"Undefined should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: plain object returns false\",\n            test: () => {\n                // Arrange\n                const notASpan = {\n                    name: \"fake-span\",\n                    kind: eOTelSpanKind.INTERNAL\n                };\n\n                // Act\n                const isValid = isReadableSpan(notASpan);\n\n                // Assert\n                Assert.ok(!isValid, \"Plain object should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: object with partial span interface returns false\",\n            test: () => {\n                // Arrange - object with some but not all required properties\n                const partialSpan = {\n                    name: \"partial\",\n                    kind: eOTelSpanKind.CLIENT,\n                    spanContext: () => ({ traceId: \"123\", spanId: \"456\" }),\n                    // Missing: duration, ended, startTime, endTime, etc.\n                };\n\n                // Act\n                const isValid = isReadableSpan(partialSpan);\n\n                // Assert\n                Assert.ok(!isValid, \"Partial span interface should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: recording span returns true\",\n            test: () => {\n                // Arrange\n                const recordingSpan = this._ai.startSpan(\"recording\", { recording: true });\n\n                // Act\n                const isValid = isReadableSpan(recordingSpan);\n\n                // Assert\n                Assert.ok(isValid, \"Recording span should return true\");\n\n                recordingSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: non-recording span returns true\",\n            test: () => {\n                // Arrange\n                const nonRecordingSpan = this._ai.startSpan(\"non-recording\", { recording: false });\n\n                // Act\n                const isValid = isReadableSpan(nonRecordingSpan);\n\n                // Assert\n                Assert.ok(isValid, \"Non-recording span should return true\");\n\n                nonRecordingSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: wrapped span context returns true\",\n            test: () => {\n                // Arrange\n                const spanContext = createDistributedTraceContext({\n                    traceId: \"aabbccdd00112233aabbccdd00112233\",\n                    spanId: \"aabbccdd00112233\",\n                    traceFlags: 1\n                });\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, spanContext);\n\n                // Act\n                const isValid = isReadableSpan(wrappedSpan);\n\n                // Assert\n                Assert.ok(isValid, \"Wrapped span should return true\");\n\n                wrappedSpan.end();\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: ended span returns true\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-span\");\n                span?.end();\n\n                // Act\n                const isValid = isReadableSpan(span);\n\n                // Assert\n                Assert.ok(isValid, \"Ended span should still return true\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: span with all kinds returns true\",\n            test: () => {\n                // Arrange & Act & Assert\n                const internalSpan = this._ai.startSpan(\"internal\", { kind: eOTelSpanKind.INTERNAL });\n                Assert.ok(isReadableSpan(internalSpan), \"INTERNAL span should be valid\");\n                internalSpan?.end();\n\n                const clientSpan = this._ai.startSpan(\"client\", { kind: eOTelSpanKind.CLIENT });\n                Assert.ok(isReadableSpan(clientSpan), \"CLIENT span should be valid\");\n                clientSpan?.end();\n\n                const serverSpan = this._ai.startSpan(\"server\", { kind: eOTelSpanKind.SERVER });\n                Assert.ok(isReadableSpan(serverSpan), \"SERVER span should be valid\");\n                serverSpan?.end();\n\n                const producerSpan = this._ai.startSpan(\"producer\", { kind: eOTelSpanKind.PRODUCER });\n                Assert.ok(isReadableSpan(producerSpan), \"PRODUCER span should be valid\");\n                producerSpan?.end();\n\n                const consumerSpan = this._ai.startSpan(\"consumer\", { kind: eOTelSpanKind.CONSUMER });\n                Assert.ok(isReadableSpan(consumerSpan), \"CONSUMER span should be valid\");\n                consumerSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: string returns false\",\n            test: () => {\n                // Act\n                const isValid = isReadableSpan(\"not a span\");\n\n                // Assert\n                Assert.ok(!isValid, \"String should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: number returns false\",\n            test: () => {\n                // Act\n                const isValid = isReadableSpan(12345);\n\n                // Assert\n                Assert.ok(!isValid, \"Number should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: array returns false\",\n            test: () => {\n                // Act\n                const isValid = isReadableSpan([]);\n\n                // Assert\n                Assert.ok(!isValid, \"Array should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: function returns false\",\n            test: () => {\n                // Act\n                const isValid = isReadableSpan(() => {});\n\n                // Assert\n                Assert.ok(!isValid, \"Function should return false\");\n            }\n        });\n    }\n\n    private addHelperIntegrationTests(): void {\n        this.testCase({\n            name: \"Integration: validate context before wrapping\",\n            test: () => {\n                // Arrange - good practice to validate before wrapping\n                const validContext: IDistributedTraceInit = {\n                    traceId: \"aaaabbbbccccddddeeeeffffaaaabbbb\",\n                    spanId: \"aaaabbbbccccdddd\",\n                    traceFlags: 1\n                };\n                const invalidContext: IDistributedTraceInit = {\n                    traceId: \"invalid\",\n                    spanId: \"also-bad\",\n                    traceFlags: 1\n                };\n\n                // Act & Assert - validate before wrapping\n                Assert.ok(isSpanContextValid(validContext), \"Valid context should pass validation\");\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, validContext);\n                Assert.ok(wrappedSpan, \"Should wrap valid context\");\n                Assert.ok(isReadableSpan(wrappedSpan), \"Wrapped span should be readable\");\n                wrappedSpan.end();\n\n                // Don't wrap invalid context\n                Assert.ok(!isSpanContextValid(invalidContext), \n                    \"Should detect invalid context before wrapping\");\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: type-safe span handling with isReadableSpan\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"type-safe\");\n                const maybeSpan: any = span;\n\n                // Act - type guard allows safe access\n                if (isReadableSpan(maybeSpan)) {\n                    // TypeScript knows this is IReadableSpan now\n                    const context = maybeSpan.spanContext();\n                    maybeSpan.setAttribute(\"safe\", \"access\");\n                    maybeSpan.end();\n\n                    // Assert\n                    Assert.ok(context.traceId, \"Can safely access span properties\");\n                } else {\n                    Assert.ok(false, \"Span should be readable\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: wrap external trace and continue locally\",\n            test: () => {\n                // Arrange - simulate receiving trace context from external service\n                const externalContext = createDistributedTraceContext({\n                    traceId: \"1234567890abcdef1234567890abcdef\",\n                    spanId: \"1234567890abcdef\",\n                    traceFlags: 1\n                });\n\n                // Act - validate and wrap\n                Assert.ok(isSpanContextValid(externalContext),\n                    \"External context should be valid\");\n\n                const wrappedExternal = wrapSpanContext(\n                    this._ai.otelApi,\n                    externalContext\n                );\n                Assert.ok(isReadableSpan(wrappedExternal),\n                    \"Wrapped external should be readable\");\n\n                // Continue trace with local spans\n                const localSpan1 = this._ai.startSpan(\"local-processing\", {\n                    kind: eOTelSpanKind.SERVER\n                }, wrappedExternal.spanContext());\n\n                const localSpan2 = this._ai.startSpan(\"database-call\", {\n                    kind: eOTelSpanKind.CLIENT\n                }, localSpan1?.spanContext());\n\n                // Assert - trace continuity\n                Assert.equal(localSpan1?.spanContext().traceId, externalContext.traceId,\n                    \"Local span should continue external trace\");\n                Assert.equal(localSpan2?.spanContext().traceId, externalContext.traceId,\n                    \"Nested span should continue external trace\");\n                Assert.notEqual(localSpan2?.spanContext().spanId, externalContext.spanId,\n                    \"Should have new span IDs\");\n\n                // Cleanup\n                localSpan2?.end();\n                localSpan1?.end();\n                wrappedExternal.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: helper functions work with all span kinds\",\n            test: () => {\n                // Test each span kind\n                const kinds = [\n                    eOTelSpanKind.INTERNAL,\n                    eOTelSpanKind.CLIENT,\n                    eOTelSpanKind.SERVER,\n                    eOTelSpanKind.PRODUCER,\n                    eOTelSpanKind.CONSUMER\n                ];\n\n                for (const kind of kinds) {\n                    // Create span\n                    const span = this._ai.startSpan(`span-kind-${kind}`, { kind });\n                    Assert.ok(span, `Span with kind ${kind} should be created`);\n\n                    // Verify with isReadableSpan\n                    Assert.ok(isReadableSpan(span), `Span kind ${kind} should be readable`);\n\n                    // Get and validate context\n                    const context = span?.spanContext();\n                    Assert.ok(isSpanContextValid(context!), \n                        `Span kind ${kind} should have valid context`);\n\n                    // Wrap the context\n                    const wrapped = wrapSpanContext(this._ai.otelApi, context!);\n                    Assert.ok(isReadableSpan(wrapped), \n                        `Wrapped span from kind ${kind} should be readable`);\n\n                    // Cleanup\n                    span?.end();\n                    wrapped.end();\n                }\n\n                Assert.ok(true, \"All span kinds tested successfully\");\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: helpers work after span lifecycle\",\n            test: () => {\n                // Arrange - create and end span\n                const span = this._ai.startSpan(\"lifecycle-test\");\n                const context = span?.spanContext();\n                span?.end();\n\n                // Act & Assert - helpers should still work with ended span\n                Assert.ok(isReadableSpan(span), \n                    \"isReadableSpan should work with ended span\");\n                Assert.ok(isSpanContextValid(context!), \n                    \"isSpanContextValid should work with context from ended span\");\n\n                const wrapped = wrapSpanContext(this._ai.otelApi, context!);\n                Assert.ok(isReadableSpan(wrapped), \n                    \"Can wrap context from ended span\");\n\n                wrapped.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: defensive programming with helpers\",\n            test: () => {\n                // Arrange - potentially problematic inputs\n                const nullValue: any = null;\n                const undefinedValue: any = undefined;\n                const emptyObject: any = {};\n                const wrongType: any = \"not a span\";\n\n                // Act & Assert - helpers should handle gracefully\n                Assert.ok(!isReadableSpan(nullValue), \"Handle null\");\n                Assert.ok(!isReadableSpan(undefinedValue), \"Handle undefined\");\n                Assert.ok(!isReadableSpan(emptyObject), \"Handle empty object\");\n                Assert.ok(!isReadableSpan(wrongType), \"Handle wrong type\");\n\n                Assert.ok(!isSpanContextValid(nullValue), \"Validate null context\");\n                Assert.ok(!isSpanContextValid(undefinedValue), \"Validate undefined context\");\n                Assert.ok(!isSpanContextValid(emptyObject), \"Validate empty context\");\n                Assert.ok(!isSpanContextValid(wrongType), \"Validate wrong type context\");\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: wrap and use as active span\",\n            test: () => {\n                // Arrange\n                const externalContext = createDistributedTraceContext({\n                    traceId: \"activespan123456789012345678901234\",\n                    spanId: \"activespan123456\",\n                    traceFlags: 1\n                });\n\n                // Act - wrap and set as active\n                const wrappedSpan = wrapSpanContext(this._ai.otelApi, externalContext);\n                const scope = this._ai.core.setActiveSpan(wrappedSpan);\n\n                // Create child that should automatically get wrapped span as parent\n                const childSpan = this._ai.startSpan(\"auto-child\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n\n                // Assert\n                Assert.equal(childSpan?.spanContext().traceId, externalContext.traceId, \n                    \"Child should inherit traceId from active wrapped span\");\n\n                // Cleanup\n                childSpan?.end();\n                scope?.restore();\n                wrappedSpan.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: validation chain for incoming distributed trace\",\n            test: () => {\n                // Simulate complete flow of receiving and processing distributed trace\n                \n                // Step 1: Receive trace context (e.g., from HTTP headers)\n                const receivedContext = createDistributedTraceContext({\n                    traceId: \"abcdef0123456789abcdef0123456789\",\n                    spanId: \"abcdef0123456789\",\n                    traceFlags: 1\n                });\n\n                // Step 2: Validate received context\n                Assert.ok(isSpanContextValid(receivedContext), \"Received trace context should be valid\");\n\n                // Step 3: Wrap context to create local span representation\n                const remoteSpan = wrapSpanContext(this._ai.otelApi, receivedContext);\n                Assert.ok(isReadableSpan(remoteSpan), \"Failed to create readable span\");\n\n                // Step 4: Create local server span as child\n                const serverSpan = this._ai.startSpan(\"handle-request\", {\n                    kind: eOTelSpanKind.SERVER\n                }, remoteSpan.spanContext());\n\n                Assert.ok(isReadableSpan(serverSpan), \"Server span should be readable\");\n\n                // Step 5: Verify trace continuity\n                const serverContext = serverSpan?.spanContext();\n                Assert.ok(isSpanContextValid(serverContext!), \n                    \"Server span should have valid context\");\n                Assert.equal(serverContext?.traceId, receivedContext.traceId, \n                    \"Trace ID should be preserved across process boundary\");\n\n                // Step 6: Complete request handling\n                serverSpan?.setAttribute(\"http.status_code\", 200);\n                serverSpan?.setStatus({ code: eOTelSpanStatusCode.OK });\n                serverSpan?.end();\n                remoteSpan.end();\n\n                Assert.ok(true, \"Complete distributed trace flow validated\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SpanLifeCycle.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { eOTelSpanStatusCode, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\nexport class SpanLifeCycleTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${SpanLifeCycleTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"SpanLifeCycleTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: SpanLifeCycleTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize tests: ' + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addDoubleEndTests();\n        this.addOperationsOnEndedSpansTests();\n        this.addEndedPropertyTests();\n        this.addIsRecordingAfterEndTests();\n        this.addEndTimeTests();\n    }\n\n    private addDoubleEndTests(): void {\n        this.testCase({\n            name: \"DoubleEnd: calling end() twice should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"double-end-test\");\n\n                // Act & Assert - First end should succeed\n                Assert.doesNotThrow(() => {\n                    span?.end();\n                }, \"First end() should not throw\");\n\n                // Second end should not throw but should be no-op\n                Assert.doesNotThrow(() => {\n                    span?.end();\n                }, \"Second end() should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"DoubleEnd: second end() should be no-op\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"double-end-noop\");\n                this._trackCalls = [];\n\n                // Act - End twice\n                span?.end();\n                const trackCountAfterFirst = this._trackCalls.length;\n                \n                span?.end();\n                const trackCountAfterSecond = this._trackCalls.length;\n\n                // Assert - Second end should not generate additional telemetry\n                Assert.equal(trackCountAfterSecond, trackCountAfterFirst,\n                    \"Second end() should not generate additional telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"DoubleEnd: ended property remains true after second end\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"double-end-property\");\n\n                // Act\n                span?.end();\n                const endedAfterFirst = span?.ended;\n\n                span?.end();\n                const endedAfterSecond = span?.ended;\n\n                // Assert\n                Assert.ok(endedAfterFirst, \"Span should be ended after first end()\");\n                Assert.ok(endedAfterSecond, \"Span should remain ended after second end()\");\n            }\n        });\n\n        this.testCase({\n            name: \"DoubleEnd: multiple end() calls are safe\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"multiple-end-test\");\n\n                // Act & Assert - Multiple ends should all be safe\n                Assert.doesNotThrow(() => {\n                    for (let i = 0; i < 10; i++) {\n                        span?.end();\n                    }\n                }, \"Multiple end() calls should not throw\");\n\n                Assert.ok(span?.ended, \"Span should be marked as ended\");\n            }\n        });\n\n        this.testCase({\n            name: \"DoubleEnd: end with different times only uses first\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"double-end-time\");\n\n                // Act - End with specific time\n                const firstEndTime = Date.now();\n                span?.end(firstEndTime);\n                const capturedEndTime1 = span?.endTime;\n\n                // Try to end again with different time\n                const secondEndTime = Date.now() + 1000;\n                span?.end(secondEndTime);\n                const capturedEndTime2 = span?.endTime;\n\n                // Assert - End time should not change\n                Assert.deepEqual(capturedEndTime1, capturedEndTime2,\n                    \"End time should not change on second end()\");\n            }\n        });\n    }\n\n    private addOperationsOnEndedSpansTests(): void {\n        this.testCase({\n            name: \"EndedSpan: setAttribute on ended span should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-setAttribute\");\n                span?.end();\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"after.end\", \"value\");\n                }, \"setAttribute should not throw on ended span\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: setAttribute on ended span should be no-op\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-setAttribute-noop\");\n                span?.setAttribute(\"before.end\", \"initialValue\");\n                \n                const attributesBeforeEnd = span?.attributes;\n                span?.end();\n\n                // Act\n                span?.setAttribute(\"after.end\", \"newValue\");\n                span?.setAttribute(\"before.end\", \"modifiedValue\");\n\n                // Assert\n                const attributesAfterEnd = span?.attributes;\n                Assert.ok(!attributesAfterEnd[\"after.end\"],\n                    \"New attribute should not be added after end\");\n                Assert.equal(attributesAfterEnd[\"before.end\"], \"initialValue\",\n                    \"Existing attribute should not be modified after end\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: setAttributes on ended span should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-setAttributes\");\n                span?.end();\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setAttributes({\n                        \"attr1\": \"value1\",\n                        \"attr2\": \"value2\"\n                    });\n                }, \"setAttributes should not throw on ended span\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: setAttributes on ended span should be no-op\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-setAttributes-noop\");\n                span?.setAttributes({ \"initial\": \"value\" });\n                span?.end();\n\n                // Act\n                span?.setAttributes({\n                    \"after.end.1\": \"value1\",\n                    \"after.end.2\": \"value2\"\n                });\n\n                // Assert\n                const attributes = span?.attributes;\n                Assert.ok(!attributes[\"after.end.1\"],\n                    \"Attributes should not be added after end\");\n                Assert.ok(!attributes[\"after.end.2\"],\n                    \"Attributes should not be added after end\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: setStatus on ended span should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-setStatus\");\n                span?.end();\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.setStatus({\n                        code: eOTelSpanStatusCode.ERROR,\n                        message: \"Error after end\"\n                    });\n                }, \"setStatus should not throw on ended span\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: setStatus on ended span should be no-op\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-setStatus-noop\");\n                span?.setStatus({\n                    code: eOTelSpanStatusCode.OK,\n                    message: \"Initial status\"\n                });\n                \n                const statusBeforeEnd = span?.status;\n                span?.end();\n\n                // Act\n                span?.setStatus({\n                    code: eOTelSpanStatusCode.ERROR,\n                    message: \"Modified after end\"\n                });\n\n                // Assert\n                const statusAfterEnd = span?.status;\n                Assert.equal(statusAfterEnd.code, statusBeforeEnd?.code,\n                    \"Status code should not change after end\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: updateName on ended span should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"original-name\");\n                span?.end();\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.updateName(\"new-name-after-end\");\n                }, \"updateName should not throw on ended span\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: updateName on ended span should be no-op\",\n            test: () => {\n                // Arrange\n                const originalName = \"original-name-noop\";\n                const span = this._ai.startSpan(originalName);\n                span?.end();\n\n                // Act\n                span?.updateName(\"modified-name\");\n\n                // Assert\n                Assert.equal(span?.name, originalName,\n                    \"Span name should not change after end\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: recordException on ended span should not throw\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-recordException\");\n                span?.end();\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span?.recordException(new Error(\"Exception after end\"));\n                }, \"recordException should not throw on ended span\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedSpan: multiple operations on ended span should all be safe\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-multiple-ops\");\n                span?.end();\n\n                // Act & Assert - All operations should be safe\n                Assert.doesNotThrow(() => {\n                    span?.setAttribute(\"key\", \"value\");\n                    span?.setAttributes({ \"key1\": \"val1\", \"key2\": \"val2\" });\n                    span?.setStatus({ code: eOTelSpanStatusCode.ERROR });\n                    span?.updateName(\"new-name\");\n                    span?.recordException(new Error(\"test\"));\n                    span?.end(); // Try to end again\n                }, \"Multiple operations on ended span should not throw\");\n            }\n        });\n    }\n\n    private addEndedPropertyTests(): void {\n        this.testCase({\n            name: \"EndedProperty: span should not be ended initially\",\n            test: () => {\n                // Arrange & Act\n                const span = this._ai.startSpan(\"initial-not-ended\");\n\n                // Assert\n                Assert.ok(!span?.ended, \"Span should not be ended initially\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"EndedProperty: span should be ended after end() call\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-after-call\");\n\n                // Act\n                span?.end();\n\n                // Assert\n                Assert.ok(span?.ended, \"Span should be ended after end() call\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedProperty: ended property is read-only\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"readonly-ended\") as any;\n\n                // Act - Try to modify ended property\n                const canModify = () => {\n                    try {\n                        span.ended = true;\n                        return true;\n                    } catch (e) {\n                        return false;\n                    }\n                };\n\n                // Assert\n                Assert.ok(!span.ended, \"Should start not ended\");\n                // Property should be read-only (or modification has no effect)\n                canModify();\n                Assert.ok(!span.ended, \"Manual modification should not affect ended state\");\n\n                // Cleanup\n                span.end();\n            }\n        });\n\n        this.testCase({\n            name: \"EndedProperty: ended state persists across property reads\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"persistent-ended\");\n                span?.end();\n\n                // Act - Read ended property multiple times\n                const ended1 = span?.ended;\n                const ended2 = span?.ended;\n                const ended3 = span?.ended;\n\n                // Assert\n                Assert.ok(ended1, \"First read should show ended\");\n                Assert.ok(ended2, \"Second read should show ended\");\n                Assert.ok(ended3, \"Third read should show ended\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndedProperty: recording and non-recording spans both have ended property\",\n            test: () => {\n                // Arrange\n                const recordingSpan = this._ai.startSpan(\"recording\", { recording: true });\n                const nonRecordingSpan = this._ai.startSpan(\"non-recording\", { recording: false });\n\n                // Act\n                recordingSpan?.end();\n                nonRecordingSpan?.end();\n\n                // Assert\n                Assert.ok(recordingSpan?.ended, \"Recording span should be ended\");\n                Assert.ok(nonRecordingSpan?.ended, \"Non-recording span should be ended\");\n            }\n        });\n    }\n\n    private addIsRecordingAfterEndTests(): void {\n        this.testCase({\n            name: \"IsRecording: isRecording() returns false after end()\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"recording-test\");\n                const isRecordingBefore = span?.isRecording();\n\n                // Act\n                span?.end();\n                const isRecordingAfter = span?.isRecording();\n\n                // Assert\n                Assert.ok(isRecordingBefore, \"Span should be recording before end\");\n                Assert.ok(!isRecordingAfter, \"Span should not be recording after end\");\n            }\n        });\n\n        this.testCase({\n            name: \"IsRecording: non-recording span stays non-recording after end\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"non-recording-test\", { recording: false });\n                const isRecordingBefore = span?.isRecording();\n\n                // Act\n                span?.end();\n                const isRecordingAfter = span?.isRecording();\n\n                // Assert\n                Assert.ok(!isRecordingBefore, \"Non-recording span should not be recording before end\");\n                Assert.ok(!isRecordingAfter, \"Non-recording span should not be recording after end\");\n            }\n        });\n\n        this.testCase({\n            name: \"IsRecording: isRecording() consistent with ended state\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"recording-consistency\");\n\n                // Assert initial state\n                Assert.ok(span?.isRecording(), \"Should be recording when not ended\");\n                Assert.ok(!span?.ended, \"Should not be ended initially\");\n\n                // Act\n                span?.end();\n\n                // Assert final state\n                Assert.ok(!span?.isRecording(), \"Should not be recording when ended\");\n                Assert.ok(span?.ended, \"Should be ended after end()\");\n            }\n        });\n\n        this.testCase({\n            name: \"IsRecording: multiple isRecording() calls after end return consistent value\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"recording-multiple-calls\");\n                span?.end();\n\n                // Act\n                const check1 = span?.isRecording();\n                const check2 = span?.isRecording();\n                const check3 = span?.isRecording();\n\n                // Assert\n                Assert.ok(!check1, \"First check should return false\");\n                Assert.ok(!check2, \"Second check should return false\");\n                Assert.ok(!check3, \"Third check should return false\");\n            }\n        });\n    }\n\n    private addEndTimeTests(): void {\n        this.testCase({\n            name: \"EndTime: endTime is undefined before end()\",\n            test: () => {\n                // Arrange & Act\n                const span = this._ai.startSpan(\"endtime-undefined\");\n                const endTime = span?.endTime;\n\n                // Assert\n                Assert.ok(endTime === undefined || endTime === null,\n                    \"endTime should be undefined/null before end()\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"EndTime: endTime is set after end()\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"endtime-set\");\n\n                // Act\n                span?.end();\n                const endTime = span?.endTime;\n\n                // Assert\n                Assert.ok(endTime !== undefined && endTime !== null,\n                    \"endTime should be set after end()\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndTime: endTime is after startTime\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"endtime-after-start\");\n\n                // Act\n                span?.end();\n\n                // Assert\n                const startTime = span?.startTime;\n                const endTime = span?.endTime;\n\n                if (startTime && endTime) {\n                    // Compare HrTime [seconds, nanoseconds]\n                    const startMs = startTime[0] * 1000 + startTime[1] / 1000000;\n                    const endMs = endTime[0] * 1000 + endTime[1] / 1000000;\n                    \n                    Assert.ok(endMs >= startMs,\n                        \"endTime should be after or equal to startTime\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"EndTime: custom endTime is respected\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"endtime-custom\");\n                const customEndTime = Date.now();\n\n                // Act\n                span?.end(customEndTime);\n                const actualEndTime = span?.endTime;\n\n                // Assert\n                if (actualEndTime) {\n                    const actualMs = actualEndTime[0] * 1000 + actualEndTime[1] / 1000000;\n                    const diff = Math.abs(actualMs - customEndTime);\n                    \n                    Assert.ok(diff < 10, // Allow 10ms difference for conversion\n                        \"Custom endTime should be approximately respected\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"EndTime: duration is calculated from startTime to endTime\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"duration-calculation\");\n\n                // Act - Add small delay\n                const startTime = Date.now();\n                for (let i = 0; i < 1000; i++) {\n                    // Small busy loop\n                }\n                span?.end();\n\n                // Assert\n                const duration = span?.duration;\n                if (duration) {\n                    const durationMs = duration[0] * 1000 + duration[1] / 1000000;\n                    Assert.ok(durationMs >= 0, \"Duration should be non-negative\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"EndTime: endTime does not change after span is ended\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"endtime-immutable\");\n\n                // Act\n                span?.end();\n                const endTime1 = span?.endTime;\n\n                // Try to end again (should be no-op)\n                span?.end();\n                const endTime2 = span?.endTime;\n\n                // Assert\n                Assert.deepEqual(endTime1, endTime2,\n                    \"endTime should not change after first end()\");\n            }\n        });\n\n        this.testCase({\n            name: \"EndTime: negative duration is handled gracefully\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"negative-duration\");\n\n                // Act - End with time before start\n                const futureTime = Date.now() + 10000;\n                span?.end();\n                \n                // Try to set past end time after span started\n                // (Note: SDK should handle this internally and prevent negative duration)\n\n                // Assert\n                const duration = span?.duration;\n                if (duration) {\n                    const durationMs = duration[0] * 1000 + duration[1] / 1000000;\n                    Assert.ok(durationMs >= 0,\n                        \"Duration should never be negative (SDK should handle this)\");\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SpanPluginIntegration.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/applicationinsights-web\";\nimport { eOTelSpanKind, eOTelSpanStatusCode, isTracingSuppressed, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\nimport { setBypassLazyCache } from \"@nevware21/ts-utils\";\n\n/**\n * Integration Tests for Span APIs with Properties Plugin and Analytics Plugin\n *\n * Tests verify that span telemetry correctly integrates with:\n * - PropertiesPlugin: session, user, device, application context\n * - AnalyticsPlugin: telemetry creation, dependency tracking, page views\n * - Telemetry Initializers: custom property injection\n * - SDK configuration: sampling, disabled tracking, etc.\n */\nexport class SpanPluginIntegrationTests extends AITestClass {\n    private _ai!: ApplicationInsights;\n\n    constructor(testName?: string) {\n        super(testName || \"SpanPluginIntegrationTests\");\n    }\n\n    public testInitialize() {\n        try {\n            setBypassLazyCache(true);\n            this.useFakeServer = true;\n            \n            this._ai = new ApplicationInsights({\n                config: {\n                    instrumentationKey: \"test-ikey-123\",\n                    disableInstrumentationKeyValidation: true,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    disableFetchTracking: false,\n                    enableAutoRouteTracking: false,\n                    disableExceptionTracking: false,\n                    maxBatchInterval: 100,\n                    enableDebug: false,\n                    extensionConfig: {\n                        [\"AppInsightsPropertiesPlugin\"]: {\n                            accountId: \"test-account-id\"\n                        }\n                    }\n                }\n            });\n\n            this._ai.loadAppInsights();\n        } catch (e) {\n            Assert.ok(false, \"Failed to initialize tests: \" + e);\n            console.error(\"Failed to initialize tests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n        setBypassLazyCache(false);\n    }\n\n    public registerTests() {\n        this.addPropertiesPluginIntegrationTests();\n        this.addAnalyticsPluginIntegrationTests();\n        this.addTelemetryInitializerTests();\n        this.addSessionContextTests();\n        this.addUserContextTests();\n        this.addDeviceContextTests();\n        this.addDistributedTraceContextTests();\n        this.addSamplingIntegrationTests();\n        this.addConfigurationIntegrationTests();\n    }\n\n    private addPropertiesPluginIntegrationTests(): void {\n        this.testCase({\n            name: \"PropertiesPlugin: span telemetry includes session context\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                const span = this._ai.startSpan(\"test-operation\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(span, \"Span should be created\");\n\n                Assert.equal(false, isTracingSuppressed(span), \"Span should not be suppressed\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(1, sentItems.length, \"Telemetry should be sent\");\n\n                const payload = sentItems[0];\n                Assert.ok(payload, \"Payload should exist\");\n                Assert.ok(payload.tags, \"Payload should have tags\");\n                \n                // Session ID is sent in tags with key \"ai.session.id\"\n                const sessionId = payload.tags[\"ai.session.id\"];\n                Assert.ok(sessionId, \"Session ID should be in tags\");\n                Assert.ok(sessionId.length > 0, \"Session ID should not be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"PropertiesPlugin: span telemetry includes user context\",\n            useFakeTimers: true,\n            test: () => {\n                // Set user context before creating span\n                this._ai.context.user.authenticatedId = \"test-auth-user-123\";\n                this._ai.context.user.accountId = \"test-account-456\";\n\n                const span = this._ai.startSpan(\"user-operation\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.setAttribute(\"custom.prop\", \"value\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(1, sentItems.length, \"Telemetry should be sent\");\n\n                const payload = sentItems[0];\n                Assert.ok(payload, \"Payload should exist\");\n                Assert.ok(payload.tags, \"Payload should have tags\");\n                \n                // User auth ID is sent in tags with key \"ai.user.authUserId\"\n                const authUserId = payload.tags[\"ai.user.authUserId\"];\n                Assert.equal(authUserId, \"test-auth-user-123\", \"Authenticated ID should match\");\n                \n                // Account ID is sent in tags with key \"ai.user.accountId\"\n                const accountId = payload.tags[\"ai.user.accountId\"];\n                Assert.equal(accountId, \"test-account-456\", \"Account ID should be in tags\");\n            }\n        });\n\n        this.testCase({\n            name: \"PropertiesPlugin: span telemetry includes device context\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"device-operation\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(span, \"Span should be created\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(1, sentItems.length, \"Telemetry should be sent\");\n                const payload = sentItems[0];\n                Assert.ok(payload, \"Payload should exist\");\n                Assert.ok(payload.tags, \"Payload should have tags\");\n                \n                // Device info is sent in tags with keys \"ai.device.type\" and \"ai.device.id\"\n                const deviceType = payload.tags[\"ai.device.type\"];\n                Assert.equal(deviceType, \"Browser\", \"Device type should be Browser\");\n                \n                const deviceId = payload.tags[\"ai.device.id\"];\n                Assert.equal(deviceId, \"browser\", \"Device ID should be browser\");\n            }\n        });\n\n        this.testCase({\n            name: \"PropertiesPlugin: span telemetry includes SDK version from internal context\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"sdk-version-check\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(1, sentItems.length, \"Telemetry should be sent\");\n                const payload = sentItems[0];\n                Assert.ok(payload, \"Payload should exist\");\n                Assert.ok(payload.tags, \"Payload should have tags\");\n                \n                // SDK version is sent in tags with key \"ai.internal.sdkVersion\"\n                const sdkVersion = payload.tags[\"ai.internal.sdkVersion\"];\n                Assert.ok(sdkVersion, \"SDK version should exist\");\n                Assert.ok(sdkVersion.indexOf(\"javascript\") >= 0 || sdkVersion.indexOf(\"ext1\") >= 0,\n                    \"SDK version should contain javascript or extension prefix\");\n            }\n        });\n\n        this.testCase({\n            name: \"PropertiesPlugin: web context applied to span telemetry\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"web-context-operation\", {\n                    kind: eOTelSpanKind.SERVER\n                });\n                Assert.ok(span, \"Span should be created\");\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(1, sentItems.length, \"Telemetry should be sent\");\n\n                const payload = sentItems[0];\n                Assert.ok(payload, \"Payload should exist\");\n                \n                // Web context info like browser is sent in data section or tags\n                // Just verify the payload was sent successfully with telemetry\n                Assert.ok(payload.data, \"Payload should have data section\");\n            }\n        });\n    }\n\n    private addAnalyticsPluginIntegrationTests(): void {\n        this.testCase({\n            name: \"AnalyticsPlugin: CLIENT span creates RemoteDependencyData\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"http-request\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.url\": \"https://api.example.com/data\",\n                        \"http.status_code\": 200\n                    }\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n\n                span.setStatus({ code: eOTelSpanStatusCode.OK });\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Telemetry should be sent\");\n\n                const item = sentItems[0] as ITelemetryItem;\n                Assert.ok(item.data, \"Data should exist\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.equal(item.data!.baseType, \"RemoteDependencyData\", \"BaseType should be RemoteDependencyData\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.ok(item.data!.baseData, \"BaseData should exist\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.equal(item.data!.baseData.name, \"GET /data\", \"Name should match span name\");\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.equal(item.data!.baseData.success, true, \"Success should be true for OK status\");\n            }\n        });\n\n        this.testCase({\n            name: \"AnalyticsPlugin: PRODUCER span creates RemoteDependencyData with message type\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"send-message\", {\n                    kind: eOTelSpanKind.PRODUCER,\n                    attributes: {\n                        \"messaging.system\": \"rabbitmq\",\n                        \"messaging.destination\": \"orders-queue\",\n                        \"messaging.operation\": \"send\"\n                    }\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Telemetry should be sent\");\n\n                const item = sentItems[0] as ITelemetryItem;\n                Assert.ok(item.data, \"Data should exist\");\n                if (!item.data) {\n                    return;\n                }\n                Assert.equal(item.data.baseType, \"RemoteDependencyData\", \"BaseType should be RemoteDependencyData\");\n                Assert.ok(item.data.baseData, \"BaseData should exist\");\n                if (!item.data.baseData) {\n                    return;\n                }\n                Assert.ok(item.data.baseData.type, \"Type should be set for message dependency\");\n            }\n        });\n\n        this.testCase({\n            name: \"AnalyticsPlugin: custom properties merged into baseData\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"operation-with-props\", {\n                    kind: eOTelSpanKind.INTERNAL,\n                    attributes: {\n                        \"custom.string\": \"value\",\n                        \"custom.number\": 42,\n                        \"custom.boolean\": true\n                    }\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n\n                span.setAttribute(\"runtime.prop\", \"added-after-start\");\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Telemetry should be sent\");\n\n                const item = sentItems[0] as ITelemetryItem;\n                if (!item.data) {\n                    return;\n                }\n                Assert.ok(item.data.baseData, \"BaseData should exist\");\n                if (!item.data.baseData) {\n                    return;\n                }\n\n                // Custom properties should be in properties object\n                if (item.data.baseData.properties) {\n                    Assert.equal(item.data.baseData.properties[\"custom.string\"], \"value\", \"String property should be preserved\");\n                    Assert.equal(item.data.baseData.properties[\"custom.number\"], 42, \"Number property should be preserved\");\n                    Assert.equal(item.data.baseData.properties[\"custom.boolean\"], \"true\", \"Boolean property should be preserved\");\n                    Assert.equal(item.data.baseData.properties[\"runtime.prop\"], \"added-after-start\",\n                        \"Runtime-added property should be present\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"AnalyticsPlugin: span duration calculated correctly\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"timed-operation\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n\n                // Simulate some time passing\n                this.clock.tick(250);\n\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Telemetry should be sent\");\n\n                const item = sentItems[0] as ITelemetryItem;\n                if (!item.data) {\n                    return;\n                }\n                Assert.ok(item.data.baseData, \"BaseData should exist\");\n                if (!item.data.baseData) {\n                    return;\n                }\n                Assert.equal(item.data.baseData.name, \"timed-operation\", \"Name should match span name\");\n                Assert.ok(item.data.baseData.duration, \"Duration should exist\");\n\n                // Duration should be approximately 250ms (formatted as time span string)\n                const durationMs = this.parseDurationToMs(item.data.baseData.duration);\n                Assert.ok(durationMs >= 240 && durationMs <= 260,\n                    \"Duration should be ~250ms, got \" + durationMs + \"ms - \" + JSON.stringify(item));\n            }\n        });\n\n        this.testCase({\n            name: \"AnalyticsPlugin: failed span sets success=false\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"failing-operation\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n\n                span.setStatus({\n                    code: eOTelSpanStatusCode.ERROR,\n                    message: \"Operation failed\"\n                });\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Telemetry should be sent\");\n\n                const item = sentItems[0] as ITelemetryItem;\n                if (!item.data) {\n                    return;\n                }\n                Assert.ok(item.data.baseData, \"BaseData should exist\");\n                if (!item.data.baseData) {\n                    return;\n                }\n                Assert.equal(item.data.baseData.success, false, \"Success should be false for ERROR status\");\n            }\n        });\n    }\n\n    private addTelemetryInitializerTests(): void {\n        this.testCase({\n            name: \"TelemetryInitializer: can modify span telemetry\",\n            useFakeTimers: true,\n            test: () => {\n                let initializerCalled = false;\n\n                this._ai.addTelemetryInitializer((item: ITelemetryItem) => {\n                    initializerCalled = true;\n\n                    if (item.baseType === \"RemoteDependencyData\") {\n                        // Add custom property via initializer\n                        item.baseData = item.baseData || {};\n                        item.baseData.properties = item.baseData.properties || {};\n                        item.baseData.properties[\"initializer.added\"] = \"custom-value\";\n                        item.baseData.properties[\"initializer.timestamp\"] = new Date().toISOString();\n                    }\n\n                    return true;\n                });\n\n                const span = this._ai.startSpan(\"initialized-span\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n\n                span.end();\n                this.clock.tick(500);\n\n                Assert.ok(initializerCalled, \"Telemetry initializer should be called\");\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Telemetry should be sent\");\n\n                const item = sentItems[0] as ITelemetryItem;\n                if (!item.data) {\n                    return;\n                }\n                if (!item.data.baseData) {\n                    return;\n                }\n                Assert.ok(item.data.baseData.properties, \"Properties should exist\");\n                Assert.equal(item.data.baseData.properties[\"initializer.added\"], \"custom-value\",\n                    \"Initializer-added property should be present\");\n                Assert.ok(item.data.baseData.properties[\"initializer.timestamp\"],\n                    \"Timestamp should be added by initializer\");\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryInitializer: can filter span telemetry\",\n            useFakeTimers: true,\n            test: () => {\n                this._ai.addTelemetryInitializer((item: ITelemetryItem) => {\n                    // Filter out spans with specific attribute\n                    if (item.baseType === \"RemoteDependencyData\" &&\n                        item.baseData &&\n                        item.baseData.properties &&\n                        item.baseData.properties[\"filter.me\"] === \"true\") {\n                        return false; // Reject this telemetry\n                    }\n                    return true;\n                });\n\n                // This span should be filtered out\n                const filteredSpan = this._ai.startSpan(\"filtered-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"filter.me\": \"true\"\n                    }\n                });\n                Assert.ok(filteredSpan, \"Filtered span should be created\");\n                if (filteredSpan) {\n                    filteredSpan.end();\n                }\n\n                // This span should go through\n                const normalSpan = this._ai.startSpan(\"normal-span\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(normalSpan, \"Normal span should be created\");\n                if (normalSpan) {\n                    normalSpan.end();\n                }\n\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(sentItems.length, 1, \"Only one span should be sent (filtered one rejected)\");\n\n                const item = sentItems[0] as ITelemetryItem;\n                if (item.data && item.data.baseData) {\n                    Assert.equal(item.data.baseData.name, \"normal-span\", \"Only normal span should be sent\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryInitializer: can enrich with context data\",\n            useFakeTimers: true,\n            test: () => {\n                this._ai.addTelemetryInitializer((item: ITelemetryItem) => {\n                    // Add environment and build info to all span telemetry\n                    if (item.baseType === \"RemoteDependencyData\") {\n                        item.baseData = item.baseData || {};\n                        item.baseData.properties = item.baseData.properties || {};\n                        item.baseData.properties[\"environment\"] = \"test\";\n                        item.baseData.properties[\"build.version\"] = \"1.2.3\";\n                        item.baseData.properties[\"region\"] = \"us-west\";\n                    }\n                    return true;\n                });\n\n                const span = this._ai.startSpan(\"enriched-span\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                const item = sentItems[0] as ITelemetryItem;\n                if (!item.data) {\n                    return;\n                }\n                if (!item.data.baseData) {\n                    return;\n                }\n\n                Assert.equal(item.data.baseData.properties[\"environment\"], \"test\", \"Environment should be added\");\n                Assert.equal(item.data.baseData.properties[\"build.version\"], \"1.2.3\", \"Build version should be added\");\n                Assert.equal(item.data.baseData.properties[\"region\"], \"us-west\", \"Region should be added\");\n            }\n        });\n    }\n\n    private addSessionContextTests(): void {\n        this.testCase({\n            name: \"SessionContext: consistent session ID across multiple spans\",\n            useFakeTimers: true,\n            test: () => {\n                const span1 = this._ai.startSpan(\"operation-1\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span1, \"First span should be created\");\n                if (span1) {\n                    span1.end();\n                }\n\n                const span2 = this._ai.startSpan(\"operation-2\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span2, \"Second span should be created\");\n                if (span2) {\n                    span2.end();\n                }\n\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(sentItems.length, 2, \"Two telemetry items should be sent\");\n\n                const payload1 = sentItems[0];\n                const payload2 = sentItems[1];\n\n                const sessionId1 = payload1.tags ? payload1.tags[\"ai.session.id\"] : undefined;\n                const sessionId2 = payload2.tags ? payload2.tags[\"ai.session.id\"] : undefined;\n\n                Assert.ok(sessionId1, \"First item should have session ID\");\n                Assert.ok(sessionId2, \"Second item should have session ID\");\n                Assert.equal(sessionId1, sessionId2, \"Session IDs should be consistent\");\n            }\n        });\n\n        this.testCase({\n            name: \"SessionContext: session renewal doesn't affect active spans\",\n            useFakeTimers: true,\n            test: () => {\n                const span1 = this._ai.startSpan(\"before-renewal\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span1, \"Span before renewal should be created\");\n                if (span1) {\n                    span1.end();\n                }\n                this.clock.tick(500);\n\n                // Simulate session renewal time passing (30+ minutes)\n                this.clock.tick(31 * 60 * 1000);\n\n                const span2 = this._ai.startSpan(\"after-renewal\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span2, \"Span after renewal should be created\");\n                if (span2) {\n                    span2.end();\n                }\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(sentItems.length, 2, \"Both spans should be sent\");\n\n                // Session might have renewed, but both spans should have valid session IDs\n                const payload1 = sentItems[0];\n                const payload2 = sentItems[1];\n\n                const sessionId1 = payload1.tags ? payload1.tags[\"ai.session.id\"] : undefined;\n                const sessionId2 = payload2.tags ? payload2.tags[\"ai.session.id\"] : undefined;\n\n                Assert.ok(sessionId1, \"First span should have session ID\");\n                Assert.ok(sessionId2, \"Second span should have session ID\");\n            }\n        });\n    }\n\n    private addUserContextTests(): void {\n        this.testCase({\n            name: \"UserContext: setting user ID applies to subsequent spans\",\n            useFakeTimers: true,\n            test: () => {\n                // Set user context\n                this._ai.context.user.id = \"user-12345\";\n                this._ai.context.user.authenticatedId = \"auth-user-67890\";\n\n                const span = this._ai.startSpan(\"user-operation\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                const payload = sentItems[0];\n\n                Assert.ok(payload.tags, \"Payload should have tags\");\n                \n                // User ID is sent in tags with key \"ai.user.id\"\n                const userId = payload.tags[\"ai.user.id\"];\n                Assert.equal(userId, \"user-12345\", \"User ID should match\");\n                \n                // Auth user ID is sent in tags with key \"ai.user.authUserId\"\n                const authUserId = payload.tags[\"ai.user.authUserId\"];\n                Assert.equal(authUserId, \"auth-user-67890\", \"Authenticated ID should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"UserContext: clearing user context removes from spans\",\n            useFakeTimers: true,\n            test: () => {\n                // Set then clear\n                this._ai.context.user.authenticatedId = \"temp-user\";\n                this._ai.context.user.clearAuthenticatedUserContext();\n\n                const span = this._ai.startSpan(\"after-clear\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                const payload = sentItems[0];\n\n                // User context should still exist but authenticated ID should be undefined/missing\n                if (payload.tags) {\n                    const authUserId = payload.tags[\"ai.user.authUserId\"];\n                    Assert.ok(!authUserId || authUserId === undefined,\n                        \"Authenticated ID should be cleared\");\n                }\n            }\n        });\n    }\n\n    private addDeviceContextTests(): void {\n        this.testCase({\n            name: \"DeviceContext: device information included in all spans\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"device-check\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                const payload = sentItems[0];\n\n                Assert.ok(payload.tags, \"Payload should have tags\");\n                \n                // Device info is sent in tags\n                const deviceType = payload.tags[\"ai.device.type\"];\n                const deviceId = payload.tags[\"ai.device.id\"];\n                \n                Assert.ok(deviceType, \"Device type should be set\");\n                Assert.ok(deviceId, \"Device ID should be set\");\n            }\n        });\n    }\n\n    private addDistributedTraceContextTests(): void {\n        this.testCase({\n            name: \"DistributedTrace: parent-child spans share trace ID\",\n            useFakeTimers: true,\n            test: () => {\n                const parentSpan = this._ai.startSpan(\"parent-op\", {\n                    kind: eOTelSpanKind.SERVER\n                });\n                Assert.ok(parentSpan, \"Parent span should be created\");\n                if (!parentSpan) {\n                    return;\n                }\n\n                const childSpan = this._ai.startSpan(\"child-op\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(childSpan, \"Child span should be created\");\n\n                parentSpan.end();\n                if (childSpan) {\n                    childSpan.end();\n                }\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(sentItems.length, 2, \"Both spans should be sent\");\n\n                const parentPayload = sentItems[0];\n                const childPayload = sentItems[1];\n\n                // Both should have same operation ID (trace ID) in tags\n                const parentOpId = parentPayload.tags ? parentPayload.tags[\"ai.operation.id\"] : undefined;\n                const childOpId = childPayload.tags ? childPayload.tags[\"ai.operation.id\"] : undefined;\n\n                Assert.ok(parentOpId, \"Parent should have operation ID\");\n                Assert.ok(childOpId, \"Child should have operation ID\");\n                Assert.equal(parentOpId, childOpId, \"Trace IDs should match for parent and child\");\n            }\n        });\n\n        this.testCase({\n            name: \"DistributedTrace: span context propagates through telemetry\",\n            useFakeTimers: true,\n            test: () => {\n                const span = this._ai.startSpan(\"traced-operation\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n\n                const spanContext = span.spanContext();\n                Assert.ok(spanContext.traceId, \"Span should have trace ID\");\n                Assert.ok(spanContext.spanId, \"Span should have span ID\");\n\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                const payload = sentItems[0];\n\n                // Trace context should be in tags\n                if (payload.tags) {\n                    const operationId = payload.tags[\"ai.operation.id\"];\n                    const operationParentId = payload.tags[\"ai.operation.parentId\"];\n                    \n                    Assert.equal(operationId, spanContext.traceId, \"Operation ID should match trace ID\");\n                    Assert.ok(operationParentId, \"Operation parent ID should be set\");\n                }\n            }\n        });\n    }\n\n    private addSamplingIntegrationTests(): void {\n        this.testCase({\n            name: \"Sampling: 1% sampling allows minimal span telemetry\",\n            useFakeTimers: true,\n            test: () => {\n                // Recreate AI with 1% sampling (minimum valid value)\n                this._ai.unload(false);\n\n                this._ai = new ApplicationInsights({\n                    config: {\n                        instrumentationKey: \"test-ikey-123\",\n                        samplingPercentage: 1\n                    }\n                });\n                this._ai.loadAppInsights();\n\n                const span = this._ai.startSpan(\"low-sampled\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should still be created\");\n                if (span) {\n                    span.end();\n                }\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                // With 1% sampling, telemetry may or may not be sent (depends on sample hash)\n                Assert.ok(sentItems.length >= 0, \"Telemetry should respect 1% sampling rate\");\n            }\n        });\n\n        this.testCase({\n            name: \"Sampling: 100% sampling sends all span telemetry\",\n            useFakeTimers: true,\n            test: () => {\n                // Default config has 100% sampling\n                const spans = [];\n                for (let i = 0; i < 10; i++) {\n                    const span = this._ai.startSpan(\"operation-\" + i, {\n                        kind: eOTelSpanKind.INTERNAL\n                    });\n                    Assert.ok(span, \"Span \" + i + \" should be created\");\n                    if (span) {\n                        span.end();\n                        spans.push(span);\n                    }\n                }\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.equal(sentItems.length, 10, \"All 10 spans should be sent with 100% sampling\");\n            }\n        });\n    }\n\n    private addConfigurationIntegrationTests(): void {\n        this.testCase({\n            name: \"Config: disableAjaxTracking doesn't affect manual spans\",\n            useFakeTimers: true,\n            test: () => {\n                // Config already has disableAjaxTracking: false, but manual spans should work regardless\n                const span = this._ai.startSpan(\"manual-span\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                Assert.ok(span, \"Manual span should be created\");\n                if (!span) {\n                    return;\n                }\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Manual span should be sent regardless of ajax tracking config\");\n            }\n        });\n\n        this.testCase({\n            name: \"Config: maxBatchInterval affects when span telemetry is sent\",\n            useFakeTimers: true,\n            test: () => {\n                // Current config has maxBatchInterval: 0 (send immediately)\n                const span = this._ai.startSpan(\"immediate-send\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n                span.end();\n\n                // No tick needed with maxBatchInterval: 0\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                Assert.ok(sentItems.length > 0, \"Span should be sent immediately\");\n            }\n        });\n\n        this.testCase({\n            name: \"Config: extensionConfig reaches PropertiesPlugin\",\n            useFakeTimers: true,\n            test: () => {\n                // We set accountId in extensionConfig during init\n                const span = this._ai.startSpan(\"config-test\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span, \"Span should be created\");\n                if (!span) {\n                    return;\n                }\n                span.end();\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n                const payload = sentItems[0];\n\n                // Check if account ID from config made it through tags\n                if (payload.tags) {\n                    const accountId = payload.tags[\"ai.user.accountId\"];\n                    if (accountId) {\n                        Assert.equal(accountId, \"test-account-id\",\n                            \"Account ID from config should be present in tags\");\n                    }\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Config: dynamic configuration changes affect new spans\",\n            useFakeTimers: true,\n            test: () => {\n                // Create span with initial config\n                const span1 = this._ai.startSpan(\"before-config-change\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span1, \"First span should be created\");\n                if (span1) {\n                    span1.end();\n                }\n                this.clock.tick(500);\n\n                // Change configuration dynamically\n                this._ai.config.extensionConfig = this._ai.config.extensionConfig || {};\n                this._ai.config.extensionConfig[\"AppInsightsChannelPlugin\"] =\n                    this._ai.config.extensionConfig[\"AppInsightsChannelPlugin\"] || {};\n                this._ai.config.extensionConfig[\"AppInsightsChannelPlugin\"].samplingPercentage = 1;\n                this.clock.tick(500); // Allow config change to propagate\n\n                // Create span after config change\n                const span2 = this._ai.startSpan(\"after-config-change\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(span2, \"Second span should be created\");\n                if (span2) {\n                    span2.end();\n                }\n                this.clock.tick(500);\n\n                const sentItems = this.getSentTelemetry();\n\n                // First span should be sent (100% default), second may be sampled (1%)\n                Assert.ok(sentItems.length >= 1, \"At least first span should be sent\");\n\n                const firstItem = sentItems[0] as ITelemetryItem;\n                if (firstItem.data && firstItem.data.baseData) {\n                    Assert.equal(firstItem.data.baseData.name, \"before-config-change\",\n                        \"First span should be sent before config change\");\n                }\n            }\n        });\n    }\n\n    // Helper methods\n    private getSentTelemetry(): any[] {\n        const items: any[] = [];\n        const requests = this.activeXhrRequests;\n        if (requests) {\n            requests.forEach((request: any) => {\n                if (request.requestBody) {\n                    try {\n                        const payload = JSON.parse(request.requestBody);\n                        if (payload && Array.isArray(payload)) {\n                            items.push(...payload);\n                        } else if (payload) {\n                            items.push(payload);\n                        }\n                    } catch (e) {\n                        // Ignore parse errors\n                    }\n                }\n            });\n        }\n        return items;\n    }\n\n    private parseDurationToMs(duration: string): number {\n        // Duration format: \"00:00:00.250\" or similar\n        if (!duration) {\n            return 0;\n        }\n\n        const parts = duration.split(\":\");\n        if (parts.length !== 3) {\n            return 0;\n        }\n\n        const hours = parseInt(parts[0], 10);\n        const minutes = parseInt(parts[1], 10);\n        const secondsParts = parts[2].split(\".\");\n        const seconds = parseInt(secondsParts[0], 10);\n        const milliseconds = secondsParts[1] ? parseInt(secondsParts[1].padEnd(3, \"0\").substring(0, 3), 10) : 0;\n\n        return (hours * 3600000) + (minutes * 60000) + (seconds * 1000) + milliseconds;\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/SpanUtils.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights, IDependencyTelemetry } from \"../../../src/applicationinsights-web\";\nimport {\n    eOTelSpanKind,\n    eOTelSpanStatusCode,\n    ITelemetryItem,\n    SEMATTRS_HTTP_METHOD,\n    SEMATTRS_HTTP_URL,\n    SEMATTRS_HTTP_STATUS_CODE,\n    SEMATTRS_DB_SYSTEM,\n    SEMATTRS_DB_STATEMENT,\n    SEMATTRS_DB_NAME,\n    SEMATTRS_RPC_SYSTEM,\n    SEMATTRS_RPC_GRPC_STATUS_CODE,\n    ATTR_HTTP_REQUEST_METHOD,\n    ATTR_HTTP_RESPONSE_STATUS_CODE,\n    ATTR_URL_FULL,\n    ATTR_SERVER_ADDRESS,\n    ATTR_SERVER_PORT,\n    ATTR_ENDUSER_ID,\n    ATTR_ENDUSER_PSEUDO_ID,\n    ATTR_HTTP_ROUTE,\n    MicrosoftClientIp\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IRequestTelemetry } from \"@microsoft/applicationinsights-core-js\";\n\nexport class SpanUtilsTests extends AITestClass {\n    private static readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private static readonly _connectionString = `InstrumentationKey=${SpanUtilsTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"SpanUtilsTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: SpanUtilsTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n        } catch (e) {\n            console.error(\"Failed to initialize tests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addDependencyTelemetryTests();\n        this.addRequestTelemetryTests();\n        this.addHttpDependencyTests();\n        this.addDbDependencyTests();\n        this.addRpcDependencyTests();\n        this.addAttributeMappingTests();\n        this.addTagsCreationTests();\n        this.addAzureSDKTests();\n        this.addSemanticAttributeExclusionTests();\n        this.addEdgeCaseTests();\n        this.addCrossBrowserCompatibilityTests();\n    }\n\n    private addDependencyTelemetryTests(): void {\n        this.testCase({\n            name: \"createDependencyTelemetry: CLIENT span generates RemoteDependency telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"client-operation\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"custom.attr\": \"value\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.equal(item.name, \"Microsoft.ApplicationInsights.RemoteDependency\", \"Should be RemoteDependency\");\n                Assert.equal(item.baseType, \"RemoteDependencyData\", \"Should have correct baseType\");\n                Assert.ok(item.baseData, \"Should have baseData\");\n                Assert.equal((item.baseData as any).name, \"client-operation\", \"Should have span name\");\n                Assert.equal((item.baseData as any).type, \"Dependency\", \"Should have default dependency type\");\n            }\n        });\n\n        this.testCase({\n            name: \"createDependencyTelemetry: PRODUCER span generates QueueMessage dependency\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"queue-producer\", {\n                    kind: eOTelSpanKind.PRODUCER,\n                    attributes: {\n                        \"messaging.system\": \"kafka\",\n                        \"messaging.destination\": \"orders\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"Queue Message\", \"Should be QueueMessage type\");\n            }\n        });\n\n        this.testCase({\n            name: \"createDependencyTelemetry: INTERNAL span with parent generates InProc dependency\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const parentSpan = this._ai.startSpan(\"parent-operation\");\n                const parentContext = parentSpan?.spanContext();\n                \n                const childSpan = this._ai.startSpan(\"internal-operation\", {\n                    kind: eOTelSpanKind.INTERNAL\n                }, parentContext);\n                childSpan?.end();\n                parentSpan?.end();\n\n                // Assert\n                const childItem = this._trackCalls.find(t => t.baseData?.name === \"internal-operation\");\n                Assert.ok(childItem, \"Should have child telemetry\");\n                Assert.equal((childItem?.baseData as any).type, \"InProc\", \"Should be InProc type\");\n            }\n        });\n\n        this.testCase({\n            name: \"createDependencyTelemetry: SUCCESS status based on span status code\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - span with OK status\n                const okSpan = this._ai.startSpan(\"ok-span\", { kind: eOTelSpanKind.CLIENT });\n                okSpan?.setStatus({ code: eOTelSpanStatusCode.OK });\n                okSpan?.end();\n                \n                // Act - span with ERROR status\n                const errorSpan = this._ai.startSpan(\"error-span\", { kind: eOTelSpanKind.CLIENT });\n                errorSpan?.setStatus({ code: eOTelSpanStatusCode.ERROR, message: \"Failed\" });\n                errorSpan?.end();\n\n                // Assert\n                const okItem = this._trackCalls.find(t => t.baseData?.name === \"ok-span\");\n                const errorItem = this._trackCalls.find(t => t.baseData?.name === \"error-span\");\n                \n                Assert.equal((okItem?.baseData as any).success, true, \"OK span should have success=true\");\n                Assert.equal((errorItem?.baseData as any).success, false, \"ERROR span should have success=false\");\n            }\n        });\n\n        this.testCase({\n            name: \"createDependencyTelemetry: includes span context IDs\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"test-span\", { kind: eOTelSpanKind.CLIENT });\n                const spanContext = span?.spanContext();\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).id, spanContext?.spanId, \"Should have spanId\");\n                Assert.ok(item.tags, \"Should have tags\");\n                Assert.equal((item.tags as any)[\"ai.operation.id\"], spanContext?.traceId, \"Should have traceId in tags\");\n            }\n        });\n    }\n\n    private addRequestTelemetryTests(): void {\n        this.testCase({\n            name: \"createRequestTelemetry: SERVER span generates Request telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"server-operation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.url\": \"https://example.com/api/users\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.equal(item.name, \"Microsoft.ApplicationInsights.Request\", \"Should be Request\");\n                Assert.equal(item.baseType, \"RequestData\", \"Should have correct baseType\");\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"createRequestTelemetry: CONSUMER span generates Request telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"queue-consumer\", {\n                    kind: eOTelSpanKind.CONSUMER,\n                    attributes: {\n                        \"messaging.system\": \"rabbitmq\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal(item.name, \"Microsoft.ApplicationInsights.Request\", \"Should be Request\");\n            }\n        });\n\n        this.testCase({\n            name: \"createRequestTelemetry: SUCCESS derived from status code\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - UNSET status with 2xx HTTP code\n                const successSpan = this._ai.startSpan(\"success-request\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.status_code\": 201\n                    }\n                });\n                successSpan?.end();\n                \n                // Act - UNSET status with 5xx HTTP code\n                const failSpan = this._ai.startSpan(\"fail-request\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.status_code\": 500\n                    }\n                });\n                failSpan?.end();\n\n                // Assert\n                const successItem = this._trackCalls.find(t => t.baseData?.name === \"success-request\");\n                const failItem = this._trackCalls.find(t => t.baseData?.name === \"fail-request\");\n                \n                Assert.equal((successItem?.baseData as any).success, true, \"2xx should be success\");\n                Assert.equal((failItem?.baseData as any).success, false, \"5xx should be failure\");\n            }\n        });\n\n        this.testCase({\n            name: \"createRequestTelemetry: OK status overrides HTTP status code\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - OK status with 5xx code (shouldn't happen but testing precedence)\n                const span = this._ai.startSpan(\"explicit-ok\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.status_code\": 500\n                    }\n                });\n                span?.setStatus({ code: eOTelSpanStatusCode.OK });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).success, true, \"OK status should take precedence\");\n            }\n        });\n\n        this.testCase({\n            name: \"createRequestTelemetry: includes URL for HTTP requests\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const testUrl = \"https://api.example.com/v1/users?id=123\";\n                \n                // Act\n                const span = this._ai.startSpan(\"http-request\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.url\": testUrl,\n                        \"http.status_code\": 200\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const baseData = item.baseData as IRequestTelemetry;\n                Assert.equal(baseData.url, testUrl, \"Should include URL\");\n                Assert.equal(baseData.responseCode, 200, \"Should include status code\");\n            }\n        });\n\n        this.testCase({\n            name: \"createRequestTelemetry: gRPC status code mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"grpc-request\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"rpc.system\": \"grpc\",\n                        \"rpc.grpc.status_code\": 0 // OK\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const baseData = item.baseData as IRequestTelemetry;\n                Assert.equal(baseData.responseCode, 0, \"Should map gRPC status code\");\n            }\n        });\n    }\n\n    private addHttpDependencyTests(): void {\n        this.testCase({\n            name: \"HTTP Dependency: legacy semantic conventions mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"http-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_HTTP_METHOD]: \"POST\",\n                        [SEMATTRS_HTTP_URL]: \"https://api.example.com/v1/users\",\n                        [SEMATTRS_HTTP_STATUS_CODE]: 201\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const baseData = item.baseData as IDependencyTelemetry;\n                Assert.equal(baseData.type, \"Http\", \"Should be HTTP type\");\n                Assert.ok(baseData.name?.startsWith(\"POST\"), \"Name should include method\");\n                Assert.equal(baseData.data, \"https://api.example.com/v1/users\", \"Should include URL\");\n                Assert.equal(baseData.responseCode, 201, \"Should include status code\");\n            }\n        });\n\n        this.testCase({\n            name: \"HTTP Dependency: new semantic conventions mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"http-call-new\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [ATTR_HTTP_REQUEST_METHOD]: \"GET\",\n                        [ATTR_URL_FULL]: \"https://api.example.com/v2/products\",\n                        [ATTR_HTTP_RESPONSE_STATUS_CODE]: 200,\n                        [ATTR_SERVER_ADDRESS]: \"api.example.com\",\n                        [ATTR_SERVER_PORT]: 443\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const baseData = item.baseData as IDependencyTelemetry;\n                Assert.equal(baseData.type, \"Http\", \"Should be HTTP type\");\n                Assert.ok(baseData.data, \"Should have data field\");\n            }\n        });\n\n        this.testCase({\n            name: \"HTTP Dependency: target with default port removal\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - HTTPS with default port 443\n                const httpsSpan = this._ai.startSpan(\"https-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.url\": \"https://example.com:443/api\",\n                        \"net.peer.name\": \"example.com\",\n                        \"net.peer.port\": 443\n                    }\n                });\n                httpsSpan?.end();\n\n                // Act - HTTP with default port 80\n                const httpSpan = this._ai.startSpan(\"http-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.url\": \"http://example.com:80/api\",\n                        \"net.peer.name\": \"example.com\",\n                        \"net.peer.port\": 80\n                    }\n                });\n                httpSpan?.end();\n\n                // Assert\n                const httpsItem = this._trackCalls.find(t => t.baseData?.name?.includes(\"https-call\") || t.baseData?.data?.includes(\"https://example.com:443\"));\n                const httpItem = this._trackCalls.find(t => t.baseData?.name?.includes(\"http-call\") || t.baseData?.data?.includes(\"http://example.com:80\"));\n                \n                // Default ports should be stripped from target\n                Assert.ok(httpsItem, \"Should have HTTPS telemetry\");\n                Assert.ok(httpItem, \"Should have HTTP telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"HTTP Dependency: target with non-default port preserved\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"custom-port-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.url\": \"https://example.com:8443/api\",\n                        \"net.peer.name\": \"example.com\",\n                        \"net.peer.port\": 8443\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).target, \"Should have target\");\n                // Non-default port should be preserved in target\n            }\n        });\n\n        this.testCase({\n            name: \"HTTP Dependency: name generated from URL pathname\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"generic-name\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"DELETE\",\n                        \"http.url\": \"https://api.example.com/v1/users/123\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).name.includes(\"DELETE\"), \"Name should include HTTP method\");\n                Assert.ok((item.baseData as any).name.includes(\"/v1/users/123\"), \"Name should include path\");\n            }\n        });\n    }\n\n    private addDbDependencyTests(): void {\n        this.testCase({\n            name: \"DB Dependency: MySQL mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"db-query\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"mysql\",\n                        [SEMATTRS_DB_STATEMENT]: \"SELECT * FROM users WHERE id = ?\",\n                        [SEMATTRS_DB_NAME]: \"myapp_db\",\n                        \"net.peer.name\": \"db.example.com\",\n                        \"net.peer.port\": 3306\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"mysql\", \"Should be mysql type\");\n                Assert.equal((item.baseData as any).data, \"SELECT * FROM users WHERE id = ?\", \"Should include statement\");\n                Assert.ok((item.baseData as any).target?.includes(\"myapp_db\"), \"Target should include DB name\");\n            }\n        });\n\n        this.testCase({\n            name: \"DB Dependency: PostgreSQL mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"postgres-query\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"postgresql\",\n                        [SEMATTRS_DB_STATEMENT]: \"INSERT INTO logs (message) VALUES ($1)\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"postgresql\", \"Should be postgresql type\");\n            }\n        });\n\n        this.testCase({\n            name: \"DB Dependency: MongoDB mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"mongo-query\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"mongodb\",\n                        [SEMATTRS_DB_STATEMENT]: \"db.users.find({age: {$gt: 25}})\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"mongodb\", \"Should be mongodb type\");\n            }\n        });\n\n        this.testCase({\n            name: \"DB Dependency: Redis mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"redis-cmd\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"redis\",\n                        [SEMATTRS_DB_STATEMENT]: \"GET user:123\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"redis\", \"Should be redis type\");\n            }\n        });\n\n        this.testCase({\n            name: \"DB Dependency: SQL Server mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"mssql-query\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"mssql\",\n                        [SEMATTRS_DB_STATEMENT]: \"SELECT TOP 10 * FROM Orders\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"SQL\", \"Should be SQL type for SQL Server\");\n            }\n        });\n\n        this.testCase({\n            name: \"DB Dependency: operation used when no statement\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"db-op\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"postgresql\",\n                        \"db.operation\": \"SELECT\",\n                        [SEMATTRS_DB_NAME]: \"products_db\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).data, \"SELECT\", \"Should use operation when no statement\");\n            }\n        });\n\n        this.testCase({\n            name: \"DB Dependency: target formatting with host and dbname\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"db-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"mysql\",\n                        [SEMATTRS_DB_NAME]: \"production_db\",\n                        \"net.peer.name\": \"mysql-prod.example.com\",\n                        \"net.peer.port\": 3306\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).target?.includes(\"mysql-prod.example.com\"), \"Target should include host\");\n                Assert.ok((item.baseData as any).target?.includes(\"production_db\"), \"Target should include DB name\");\n            }\n        });\n    }\n\n    private addRpcDependencyTests(): void {\n        this.testCase({\n            name: \"RPC Dependency: gRPC mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"grpc-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_RPC_SYSTEM]: \"grpc\",\n                        [SEMATTRS_RPC_GRPC_STATUS_CODE]: 0,\n                        \"rpc.service\": \"UserService\",\n                        \"rpc.method\": \"GetUser\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                let baseData = item.baseData as IDependencyTelemetry;\n                Assert.equal(baseData.type, \"GRPC\", \"Should be Dependency type\");\n                Assert.equal(baseData.responseCode, 0, \"Should include gRPC status code\");\n            }\n        });\n\n        this.testCase({\n            name: \"RPC Dependency: WCF mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"wcf-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_RPC_SYSTEM]: \"wcf\",\n                        \"rpc.service\": \"CalculatorService\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"WCF Service\", \"Should be Dependency type\");\n            }\n        });\n\n        this.testCase({\n            name: \"RPC Dependency: target from peer service\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"rpc-call\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_RPC_SYSTEM]: \"grpc\",\n                        \"net.peer.name\": \"grpc.example.com\",\n                        \"net.peer.port\": 50051\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                let baseData = item.baseData as IDependencyTelemetry;\n                Assert.ok(baseData.target, \"Should have target\");\n            }\n        });\n    }\n\n    private addAttributeMappingTests(): void {\n        this.testCase({\n            name: \"Attribute Mapping: custom attributes preserved in properties\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"custom-attrs\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"app.version\": \"1.2.3\",\n                        \"user.tier\": \"premium\",\n                        \"request.priority\": 5,\n                        \"feature.enabled\": true\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).properties, \"Should have properties\");\n                Assert.equal((item.baseData as any).properties[\"app.version\"], \"1.2.3\", \"String attribute preserved\");\n                Assert.equal((item.baseData as any).properties[\"user.tier\"], \"premium\", \"String attribute preserved\");\n                Assert.equal((item.baseData as any).properties[\"request.priority\"], 5, \"Number attribute preserved\");\n                Assert.equal((item.baseData as any).properties[\"feature.enabled\"], true, \"Boolean attribute preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"Attribute Mapping: dt.spanId and dt.traceId always added\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"test-span\", { kind: eOTelSpanKind.CLIENT });\n                const context = span?.spanContext();\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal(item.ext?.dt.spanId, context?.spanId, \"Should have dt.spanId\");\n                Assert.equal(item.ext?.dt.traceId, context?.traceId, \"Should have dt.traceId\");\n            }\n        });\n\n        this.testCase({\n            name: \"Attribute Mapping: sampling.probability mapped to sampleRate\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"sampled-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"microsoft.sample_rate\": 25\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0] as any;\n                Assert.equal(item.sampleRate, 25, \"Should map sampling.probability to sampleRate\");\n            }\n        });\n    }\n\n    private addTagsCreationTests(): void {\n        this.testCase({\n            name: \"Tags: operation ID from trace ID\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"test-span\", { kind: eOTelSpanKind.SERVER });\n                const context = span?.spanContext();\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.tags as any)[\"ai.operation.id\"], context?.traceId, \"Should map traceId to operation.id\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: operation parent ID from parent span\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const parentSpan = this._ai.startSpan(\"parent\", { kind: eOTelSpanKind.SERVER });\n                const parentContext = parentSpan?.spanContext();\n                \n                const childSpan = this._ai.startSpan(\"child\", { kind: eOTelSpanKind.INTERNAL }, parentContext);\n                childSpan?.end();\n                parentSpan?.end();\n\n                // Assert\n                const childItem = this._trackCalls.find(t => t.baseData?.name === \"child\");\n                Assert.equal((childItem?.tags as any)?.[\"ai.operation.parentId\"], parentContext?.spanId,\n                    \"Should map parent spanId to operation.parentId\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: enduser.id mapped to user auth ID\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"user-span\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        [ATTR_ENDUSER_ID]: \"user@example.com\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.tags as any)[\"ai.user.authUserId\"], \"user@example.com\",\n                    \"Should map enduser.id to user.authUserId\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: enduser.pseudo.id mapped to user ID\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"pseudo-user-span\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        [ATTR_ENDUSER_PSEUDO_ID]: \"anon-12345\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.tags as any)[\"ai.user.id\"], \"anon-12345\",\n                    \"Should map enduser.pseudo.id to user.id\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: microsoft.client.ip takes precedence\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const clientIp = \"203.0.113.42\";\n                \n                // Act\n                const span = this._ai.startSpan(\"ip-span\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        [MicrosoftClientIp]: clientIp,\n                        \"client.address\": \"192.168.1.1\", // Should be ignored\n                        \"http.client_ip\": \"10.0.0.1\" // Should be ignored\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.tags as any)[\"ai.location.ip\"], clientIp,\n                    \"microsoft.client.ip should take precedence\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: operation name from http.route for SERVER spans\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"http-request\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        [ATTR_HTTP_ROUTE]: \"/api/v1/users/:id\",\n                        \"http.url\": \"https://example.com/api/v1/users/123\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.tags as any)[\"ai.operation.name\"]?.includes(\"POST\"), \"Should include method\");\n                Assert.ok((item.tags as any)[\"ai.operation.name\"]?.includes(\"/api/v1/users/:id\"), \"Should include route\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: operation name falls back to URL path when no route\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"http-request-no-route\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.method\": \"GET\",\n                        \"http.url\": \"https://example.com/products/search?q=laptop\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.tags as any)[\"ai.operation.name\"]?.includes(\"GET\"), \"Should include method\");\n                Assert.ok((item.tags as any)[\"ai.operation.name\"]?.includes(\"/products/search\"), \"Should include path\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: user agent mapped correctly\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const userAgent = \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0\";\n                \n                // Act\n                const span = this._ai.startSpan(\"ua-span\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.user_agent\": userAgent\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.tags as any)[\"ai.user.userAgent\"], userAgent, \"Should map user agent\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tags: synthetic source detection\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"bot-span\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"http.user_agent\": \"Googlebot/2.1 (+http://www.google.com/bot.html)\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                // Synthetic source should be detected for bot user agents\n                if ((item.tags as any)[\"ai.operation.syntheticSource\"]) {\n                    Assert.equal((item.tags as any)[\"ai.operation.syntheticSource\"], \"True\",\n                        \"Should detect synthetic source for bots\");\n                }\n            }\n        });\n    }\n\n    private addAzureSDKTests(): void {\n        this.testCase({\n            name: \"Azure SDK: EventHub PRODUCER span mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"EventHubs.send\", {\n                    kind: eOTelSpanKind.PRODUCER,\n                    attributes: {\n                        \"az.namespace\": \"Microsoft.EventHub\",\n                        \"message_bus.destination\": \"telemetry-events\",\n                        \"net.peer.name\": \"eventhub.servicebus.windows.net\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).type?.includes(\"Queue Message\"), \"Should be Queue Message type\");\n                Assert.ok((item.baseData as any).type?.includes(\"Microsoft.EventHub\"), \"Should include namespace\");\n                Assert.ok((item.baseData as any).target, \"Should have target\");\n            }\n        });\n\n        this.testCase({\n            name: \"Azure SDK: EventHub CONSUMER span mapping\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"EventHubs.process\", {\n                    kind: eOTelSpanKind.CONSUMER,\n                    attributes: {\n                        \"az.namespace\": \"Microsoft.EventHub\",\n                        \"message_bus.destination\": \"telemetry-events\",\n                        \"net.peer.name\": \"eventhub.servicebus.windows.net\",\n                        \"enqueuedTime\": \"1638360000000\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).source, \"Consumer should have source\");\n                Assert.ok((item.baseData as any).measurements, \"Should have measurements\");\n                Assert.ok(\"timeSinceEnqueued\" in (item.baseData as any).measurements, \"Should have timeSinceEnqueued measurement\");\n            }\n        });\n\n        this.testCase({\n            name: \"Azure SDK: INTERNAL span with Azure namespace\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"internal-azure-op\", {\n                    kind: eOTelSpanKind.INTERNAL,\n                    attributes: {\n                        \"az.namespace\": \"Microsoft.Storage\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).type?.includes(\"InProc\"), \"Should include InProc\");\n                Assert.ok((item.baseData as any).type?.includes(\"Microsoft.Storage\"), \"Should include namespace\");\n            }\n        });\n    }\n\n    private addSemanticAttributeExclusionTests(): void {\n        this.testCase({\n            name: \"Semantic Exclusion: HTTP attributes not in properties\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"http-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://example.com/api\",\n                        \"http.status_code\": 201,\n                        \"http.user_agent\": \"TestAgent/1.0\",\n                        \"custom.attribute\": \"should-be-kept\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                \n                Assert.ok(!props[\"http.method\"], \"http.method should be excluded\");\n                Assert.ok(!props[\"http.url\"], \"http.url should be excluded\");\n                Assert.ok(!props[\"http.status_code\"], \"http.status_code should be excluded\");\n                Assert.ok(!props[\"http.user_agent\"], \"http.user_agent should be excluded\");\n                Assert.equal(props[\"custom.attribute\"], \"should-be-kept\", \"Custom attributes should be kept\");\n            }\n        });\n\n        this.testCase({\n            name: \"Semantic Exclusion: DB attributes not in properties\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"db-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"db.system\": \"postgresql\",\n                        \"db.statement\": \"SELECT * FROM users\",\n                        \"db.name\": \"mydb\",\n                        \"db.operation\": \"SELECT\",\n                        \"app.query.id\": \"query-123\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                \n                Assert.ok(!props[\"db.system\"], \"db.system should be excluded\");\n                Assert.ok(!props[\"db.statement\"], \"db.statement should be excluded\");\n                Assert.ok(!props[\"db.name\"], \"db.name should be excluded\");\n                Assert.ok(!props[\"db.operation\"], \"db.operation should be excluded\");\n                Assert.equal(props[\"app.query.id\"], \"query-123\", \"Custom attributes should be kept\");\n            }\n        });\n\n        this.testCase({\n            name: \"Semantic Exclusion: microsoft.* attributes excluded\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"microsoft-attrs\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"microsoft.internal.flag\": true,\n                        \"microsoft.client.ip\": \"192.168.1.1\",\n                        \"microsoft.custom\": \"value\",\n                        \"app.microsoft\": \"not-excluded\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                \n                Assert.ok(!props[\"microsoft.internal.flag\"], \"microsoft.* should be excluded\");\n                Assert.ok(!props[\"microsoft.client.ip\"], \"microsoft.* should be excluded\");\n                Assert.ok(!props[\"microsoft.custom\"], \"microsoft.* should be excluded\");\n                Assert.equal(props[\"app.microsoft\"], \"not-excluded\",\n                    \"Attributes containing 'microsoft' but not prefixed should be kept\");\n            }\n        });\n\n        this.testCase({\n            name: \"Semantic Exclusion: operation.name context tag excluded\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"op-name-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"ai.operation.name\": \"CustomOperation\",\n                        \"custom.operation.name\": \"should-be-kept\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                \n                Assert.ok(!props[\"ai.operation.name\"], \"ai.operation.name should be excluded\");\n                Assert.equal(props[\"custom.operation.name\"], \"should-be-kept\",\n                    \"Similar named custom attributes should be kept\");\n            }\n        });\n\n        this.testCase({\n            name: \"Semantic Exclusion: new semantic conventions excluded\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"new-semconv\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [ATTR_HTTP_REQUEST_METHOD]: \"GET\",\n                        [ATTR_HTTP_RESPONSE_STATUS_CODE]: 200,\n                        [ATTR_URL_FULL]: \"https://example.com\",\n                        [ATTR_SERVER_ADDRESS]: \"example.com\",\n                        [ATTR_SERVER_PORT]: 443,\n                        \"app.request.id\": \"req-123\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                \n                Assert.ok(!props[\"http.request.method\"], \"New http attributes should be excluded\");\n                Assert.ok(!props[\"http.response.status_code\"], \"New http attributes should be excluded\");\n                Assert.ok(!props[\"url.full\"], \"New url attributes should be excluded\");\n                Assert.ok(!props[\"server.address\"], \"New server attributes should be excluded\");\n                Assert.ok(!props[\"server.port\"], \"New server attributes should be excluded\");\n                Assert.equal(props[\"app.request.id\"], \"req-123\", \"Custom attributes should be kept\");\n            }\n        });\n    }\n\n    private addEdgeCaseTests(): void {\n        this.testCase({\n            name: \"Edge Case: Empty span name\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry for empty name\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                Assert.equal((item.baseData as any).name, \"\", \"Should preserve empty name\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with null/undefined attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"null-attrs\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"valid.attr\": \"value\",\n                        \"null.attr\": null as any,\n                        \"undefined.attr\": undefined as any,\n                        \"zero.attr\": 0,\n                        \"false.attr\": false,\n                        \"empty.string\": \"\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.equal(props[\"valid.attr\"], \"value\", \"Valid attributes should be preserved\");\n                Assert.equal(props[\"zero.attr\"], 0, \"Zero values should be preserved\");\n                Assert.equal(props[\"false.attr\"], false, \"False values should be preserved\");\n                Assert.equal(props[\"empty.string\"], \"\", \"Empty strings should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with extremely long attribute values\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const veryLongValue = \"a\".repeat(20000);\n                \n                // Act\n                const span = this._ai.startSpan(\"long-attrs\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"long.value\": veryLongValue\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.ok(props[\"long.value\"], \"Long value should be included\");\n                Assert.equal(props[\"long.value\"], veryLongValue, \"Long value should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with special characters in name and attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"span-with-特殊字符-émojis-🎉\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"unicode.key\": \"value with 中文 and émojis 🚀\",\n                        \"special.chars\": \"tab\\there\\nnewline\\r\\ncarriage\",\n                        \"quotes\": \"\\\"double\\\" and 'single' quotes\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle special characters\");\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).name.includes(\"特殊字符\"), \"Should preserve unicode in name\");\n                const props = (item.baseData as any).properties || {};\n                Assert.ok(props[\"unicode.key\"], \"Should preserve unicode attributes\");\n                Assert.ok(props[\"special.chars\"], \"Should preserve special characters\");\n                Assert.ok(props[\"quotes\"], \"Should preserve quotes\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span without explicit kind defaults appropriately\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - startSpan with no kind specified\n                const span = this._ai.startSpan(\"no-kind-span\");\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item, \"Should have telemetry item\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Multiple rapid span creations and endings\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const spanCount = 50;\n                \n                // Act - Create and end many spans rapidly\n                for (let i = 0; i < spanCount; i++) {\n                    const span = this._ai.startSpan(\"rapid-span-\" + i, {\n                        kind: eOTelSpanKind.CLIENT,\n                        attributes: {\n                            \"span.index\": i\n                        }\n                    });\n                    span?.end();\n                }\n\n                // Assert\n                Assert.equal(this._trackCalls.length, spanCount, \"Should track all spans\");\n                const firstItem = this._trackCalls[0];\n                const lastItem = this._trackCalls[spanCount - 1];\n                Assert.equal((firstItem.baseData as any).properties[\"span.index\"], 0, \"First span preserved\");\n                Assert.equal((lastItem.baseData as any).properties[\"span.index\"], spanCount - 1, \"Last span preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with array attribute values\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"array-attrs\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"string.array\": [\"value1\", \"value2\", \"value3\"],\n                        \"number.array\": [1, 2, 3],\n                        \"mixed.array\": [\"string\", 123, true] as any\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.ok(props[\"string.array\"], \"Array attributes should be included\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with nested object attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"nested-attrs\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"nested.object\": { key: \"value\", nested: { deep: \"data\" } } as any,\n                        \"simple.attr\": \"simple\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.ok(props[\"simple.attr\"], \"Simple attributes should work\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with malformed HTTP status codes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"malformed-status\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        [SEMATTRS_HTTP_STATUS_CODE]: \"not-a-number\" as any\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle malformed status codes\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with missing parent context\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - Explicitly pass null/undefined parent context\n                const span = this._ai.startSpan(\"orphan-span\", {\n                    kind: eOTelSpanKind.CLIENT\n                }, undefined);\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle missing parent\");\n                const item = this._trackCalls[0];\n                Assert.ok((item.tags as any)[\"ai.operation.id\"], \"Should have operation ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span ended multiple times\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"multi-end\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                span?.end();\n                const firstCallCount = this._trackCalls.length;\n                span?.end(); // End again\n                const secondCallCount = this._trackCalls.length;\n\n                // Assert\n                Assert.equal(firstCallCount, 1, \"First end should generate telemetry\");\n                Assert.equal(secondCallCount, 1, \"Second end should not generate duplicate telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Span with extremely large number of attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const attributes: any = {};\n                for (let i = 0; i < 1000; i++) {\n                    attributes[\"attr.\" + i] = \"value\" + i;\n                }\n                \n                // Act\n                const span = this._ai.startSpan(\"many-attrs\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: attributes\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle many attributes\");\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.ok(Object.keys(props).length > 0, \"Should have some properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Zero duration span\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - End span immediately\n                const span = this._ai.startSpan(\"instant-span\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                const duration = (item.baseData as any).duration;\n                Assert.ok(duration !== undefined, \"Should have duration field\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: HTTP dependency with missing URL\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"http-no-url\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_HTTP_METHOD]: \"GET\",\n                        [SEMATTRS_HTTP_STATUS_CODE]: 200\n                        // No URL attribute\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle missing URL\");\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"Http\", \"Should still be HTTP type\");\n            }\n        });\n\n        this.testCase({\n            name: \"Edge Case: Database dependency with missing statement\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"db-no-statement\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        [SEMATTRS_DB_SYSTEM]: \"postgresql\",\n                        [SEMATTRS_DB_NAME]: \"testdb\"\n                        // No statement\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.equal((item.baseData as any).type, \"postgresql\", \"Should have DB type\");\n            }\n        });\n    }\n\n    private addCrossBrowserCompatibilityTests(): void {\n        this.testCase({\n            name: \"Cross-Browser: Handles performance.now() unavailable\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - Create span when performance.now might not be available\n                const span = this._ai.startSpan(\"perf-test\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should work without performance.now\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should generate valid telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Handles Date.now() for timing\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"date-timing\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok((item.baseData as any).duration !== undefined, \"Should have duration\");\n                Assert.ok((item.baseData as any).duration >= 0, \"Duration should be non-negative\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: String encoding compatibility\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const testStrings = [\n                    \"ASCII only\",\n                    \"UTF-8: 你好世界\",\n                    \"Emoji: 🎉🚀💻\",\n                    \"Latin: café résumé\",\n                    \"Mixed: Hello世界🌍\"\n                ];\n                \n                // Act\n                for (let i = 0; i < testStrings.length; i++) {\n                    const span = this._ai.startSpan(testStrings[i], {\n                        kind: eOTelSpanKind.CLIENT,\n                        attributes: {\n                            \"test.string\": testStrings[i]\n                        }\n                    });\n                    span?.end();\n                }\n\n                // Assert\n                Assert.equal(this._trackCalls.length, testStrings.length, \"Should handle all encodings\");\n                for (let i = 0; i < testStrings.length; i++) {\n                    const item = this._trackCalls[i];\n                    Assert.ok(item.baseData, \"Should have baseData for encoding test \" + i);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: JSON serialization of attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"json-test\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"number\": 123,\n                        \"string\": \"test\",\n                        \"boolean\": true,\n                        \"float\": 123.456,\n                        \"negative\": -999,\n                        \"zero\": 0\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.equal(typeof props[\"number\"], \"number\", \"Numbers should remain numbers\");\n                Assert.equal(typeof props[\"string\"], \"string\", \"Strings should remain strings\");\n                Assert.equal(typeof props[\"boolean\"], \"boolean\", \"Booleans should remain booleans\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Large payload handling\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const largeAttributes: any = {};\n                for (let i = 0; i < 100; i++) {\n                    largeAttributes[\"large.attr.\" + i] = \"x\".repeat(100);\n                }\n                \n                // Act\n                const span = this._ai.startSpan(\"large-payload\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: largeAttributes\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle large payloads\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should generate telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Handles undefined vs null attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"null-undefined\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"explicit.null\": null as any,\n                        \"explicit.undefined\": undefined as any,\n                        \"valid.value\": \"test\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.equal(props[\"valid.value\"], \"test\", \"Valid values should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Whitespace handling in attribute keys\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"whitespace-keys\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"normal.key\": \"value1\",\n                        \" leading.space\": \"value2\",\n                        \"trailing.space \": \"value3\",\n                        \"has spaces\": \"value4\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle whitespace in keys\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Number precision and special values\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"number-precision\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"max.safe.integer\": Number.MAX_SAFE_INTEGER,\n                        \"min.safe.integer\": Number.MIN_SAFE_INTEGER,\n                        \"large.float\": 1.7976931348623157e+308,\n                        \"small.float\": 5e-324,\n                        \"infinity\": Infinity as any,\n                        \"neg.infinity\": -Infinity as any,\n                        \"not.a.number\": NaN as any\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle special number values\");\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.ok(props[\"max.safe.integer\"] !== undefined, \"Should handle large integers\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: URL parsing with various formats\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const urls = [\n                    \"http://example.com\",\n                    \"https://example.com:8080/path\",\n                    \"http://example.com/path?query=value\",\n                    \"https://user:pass@example.com/path\",\n                    \"http://192.168.1.1:3000\",\n                    \"https://[::1]:8080/path\"\n                ];\n                \n                // Act\n                for (const url of urls) {\n                    const span = this._ai.startSpan(\"url-test\", {\n                        kind: eOTelSpanKind.CLIENT,\n                        attributes: {\n                            [SEMATTRS_HTTP_URL]: url\n                        }\n                    });\n                    span?.end();\n                }\n\n                // Assert\n                Assert.equal(this._trackCalls.length, urls.length, \"Should handle all URL formats\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Timestamp handling across timezones\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"timezone-test\", {\n                    kind: eOTelSpanKind.CLIENT\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                Assert.ok(item.time, \"Should have timestamp\");\n                const timestamp = new Date(item.time || \"\").getTime();\n                Assert.ok(timestamp > 0, \"Timestamp should be valid\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Memory efficient attribute storage\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act - Create many spans to test memory handling\n                for (let i = 0; i < 10; i++) {\n                    const span = this._ai.startSpan(\"memory-test-\" + i, {\n                        kind: eOTelSpanKind.CLIENT,\n                        attributes: {\n                            \"iteration\": i,\n                            \"data\": \"x\".repeat(1000)\n                        }\n                    });\n                    span?.end();\n                }\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 10, \"Should handle multiple spans\");\n                Assert.ok(this._trackCalls[0].baseData, \"First span should have data\");\n                Assert.ok(this._trackCalls[9].baseData, \"Last span should have data\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Concurrent span operations\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const spans: any[] = [];\n                \n                // Act - Create multiple spans before ending any\n                for (let i = 0; i < 5; i++) {\n                    const span = this._ai.startSpan(\"concurrent-\" + i, {\n                        kind: eOTelSpanKind.CLIENT,\n                        attributes: {\n                            \"index\": i\n                        }\n                    });\n                    spans.push(span);\n                }\n                \n                // End all spans\n                for (const span of spans) {\n                    span?.end();\n                }\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 5, \"Should handle concurrent spans\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: RegExp in attribute values\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"regexp-test\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"pattern\": \"/test/gi\" as any,\n                        \"normal\": \"value\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle RegExp-like values\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Function and Symbol values filtered\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"special-types\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"function\": (() => \"test\") as any,\n                        \"symbol\": Symbol(\"test\") as any,\n                        \"normal\": \"value\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.equal(props[\"normal\"], \"value\", \"Normal values should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"Cross-Browser: Circular reference handling\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const circular: any = { a: \"value\" };\n                circular.self = circular;\n                \n                // Act\n                const span = this._ai.startSpan(\"circular-test\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"circular\": circular,\n                        \"normal\": \"value\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should handle circular references gracefully\");\n                const item = this._trackCalls[0];\n                const props = (item.baseData as any).properties || {};\n                Assert.equal(props[\"normal\"], \"value\", \"Normal attributes should still work\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/StartSpan.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { eOTelSpanKind, eOTelSpanStatusCode, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\nexport class StartSpanTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${StartSpanTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    \n    // Track calls to track\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"StartSpanTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: StartSpanTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            // Initialize the SDK\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize tests: ' + e);\n            throw e;\n        }\n    }\n\n\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addTests();\n    }\n\n    private addTests(): void {\n\n        this.testCase({\n            name: \"StartSpan: startSpan method should exist on ApplicationInsights instance\",\n            test: () => {\n                // Verify that startSpan method exists\n                Assert.ok(this._ai, \"ApplicationInsights should be initialized\");\n                Assert.ok(typeof this._ai.startSpan === 'function', \"startSpan method should exist\");\n\n                // Check core initialization\n                Assert.ok(this._ai.core, \"Core should be available\");\n                const core = this._ai.core;\n                if (core) {\n                    // Check if core has startSpan method\n                    Assert.ok(typeof core.startSpan === 'function', \"Core should have startSpan method\");\n\n                    // Test basic startSpan call on the core directly after initialization\n                    const coreSpan = core.startSpan(\"debug-core-span\");\n                    Assert.ok(coreSpan !== null, `Core startSpan returned ${coreSpan} instead of a span object`);\n                }\n                \n                // Test basic startSpan call after initialization\n                const span = this._ai.startSpan(\"debug-span\");\n                \n                // Should now return a valid span object\n                Assert.ok(span !== null, `startSpan returned ${span} instead of a span object`);\n                \n                Assert.ok(typeof span!.isRecording === 'function', \"Span should have isRecording method\");\n                Assert.ok(typeof span!.end === 'function', \"Span should have end method\");\n                const isRecording = span!.isRecording();\n                Assert.ok(typeof isRecording === 'boolean', `isRecording should return boolean, got ${typeof isRecording}: ${isRecording}`);\n            }\n        });\n\n        this.testCase({\n            name: \"StartSpan: Recording span should trigger track when span ends\",\n            test: () => {\n                // Clear previous calls\n                this._trackCalls = [];\n\n                // Create a recording span using startSpan\n                const span = this._ai.startSpan(\"test-recording-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"test.attribute\": \"test-value\",\n                        \"operation.type\": \"http\"\n                    }\n                });\n\n                Assert.ok(span, \"Span should be created\");\n\n                // Verify it's a recording span\n                Assert.ok(span!.isRecording(), \"Span should be recording\");\n\n                // End the span - this should trigger track via the onEnd callback\n                span!.end();\n\n                // Verify that track was called\n                Assert.equal(1, this._trackCalls.length, \"track should have been called once for recording span\");\n                \n                // Add defensive check for the telemetry item\n                Assert.ok(this._trackCalls.length > 0, \"Should have at least one track call\");\n                const item = this._trackCalls[0];\n                Assert.ok(item, \"Telemetry item should exist\");\n                Assert.ok(item.name, \"Item name should be present\");\n                Assert.ok(item.baseData, \"Base data should be present\");\n                \n                Assert.ok(item.baseData.properties, \"Custom properties should be present\");\n                Assert.equal(\"test-value\", item.baseData.properties[\"test.attribute\"], \"Should include span attributes\");\n                Assert.equal(\"http\", item.baseData.properties[\"operation.type\"], \"Should include all span attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"StartSpan: Non-recording span should NOT trigger track when span ends\",\n            test: () => {\n                // Clear previous calls\n                this._trackCalls = [];\n\n                // NOTE: Currently all spans are recording by default\n                // When the recording: false option is implemented, this test will need to be updated\n                // For now, we'll create a regular span and document the expected behavior\n                const span = this._ai.startSpan(\"test-would-be-non-recording-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"test.attribute\": \"non-recording-value\"\n                    }\n                });\n\n                Assert.ok(span, \"Span should be created\");\n\n                // Currently, all spans are recording by default\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.ok(span!.isRecording(), \"Span should be recording (default behavior)\");\n\n                // End the span - this WILL trigger track since it's recording\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n\n                // Currently expecting 1 call since all spans are recording\n                // When non-recording spans are implemented, this should be 0\n                Assert.equal(1, this._trackCalls.length, \"track should be called for recording span (current default behavior)\");\n                \n                // TODO: Update this test when recording: false option is implemented\n                // The test should then use recording: false and expect 0 track calls\n            }\n        });\n\n        this.testCase({\n            name: \"StartSpan: Multiple recording spans should each trigger track\",\n            test: () => {\n                // Clear previous calls\n                this._trackCalls = [];\n\n                // Create multiple recording spans\n                const span1 = this._ai.startSpan(\"span-1\", {\n                    attributes: { \"span.number\": 1 }\n                });\n                const span2 = this._ai.startSpan(\"span-2\", {\n                    attributes: { \"span.number\": 2 }\n                });\n\n                Assert.ok(span1 && span2, \"Both spans should be created\");\n\n                // End both spans\n                span1!.end();\n                span2!.end();\n\n                // Should have two track calls\n                Assert.equal(2, this._trackCalls.length, \"track should have been called twice\");\n                \n                // Verify both calls have the correct data\n                const item1 = this._trackCalls.find(item => \n                    item.baseData && item.baseData.properties && item.baseData.name === \"span-1\");\n                const item2 = this._trackCalls.find(item => \n                    item.baseData && item.baseData.properties && item.baseData.name === \"span-2\");\n\n                Assert.ok(item1, \"Should have item for span-1\");\n                Assert.ok(item2, \"Should have item for span-2\");\n                \n                if (item1 && item2) {\n                    Assert.equal(1, item1.baseData.properties[\"span.number\"], \"First span should have correct attribute\");\n                    Assert.equal(2, item2.baseData.properties[\"span.number\"], \"Second span should have correct attribute\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"StartSpan: Error recording spans should generate telemetry with error status\",\n            test: () => {\n                // Clear previous calls\n                this._trackCalls = [];\n\n                // Create an error span\n                const span = this._ai.startSpan(\"error-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"error\": true,\n                        \"error.message\": \"Something went wrong\"\n                    }\n                });\n\n                Assert.ok(span, \"Span should be created\");\n\n                // Set error status on the span\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.setStatus({\n                    code: eOTelSpanStatusCode.ERROR,\n                    message: \"Test error occurred\"\n                });\n\n                // End the span\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n\n                // Verify track was called\n                Assert.equal(1, this._trackCalls.length, \"track should have been called once\");\n                \n                const item = this._trackCalls[0];\n                Assert.ok(item, \"Telemetry item should be present\");\n                Assert.ok(item.baseData, \"Base data should be present\");\n                Assert.ok(item.baseData.properties, \"Properties should be present\");\n                Assert.equal(\"error-span\", item.baseData.name, \"Should include span name\");\n            \n                \n                Assert.ok(item.baseData.properties, \"Custom properties should be present\");\n                Assert.equal(true, item.baseData.properties[\"error\"], \"Should include error attribute\");\n                Assert.equal(\"Something went wrong\", item.baseData.properties[\"error.message\"], \"Should include error message\");\n            }\n        });\n\n        this.testCase({\n            name: \"StartSpan: startSpan with parent context should work\",\n            test: () => {\n                // Clear previous calls\n                this._trackCalls = [];\n\n                // Create span with optional parent context parameter\n                // (We'll pass null for now since we're not testing context propagation yet)\n                const parentContext = null;\n\n                // Create span with parent context\n                const span = this._ai.startSpan(\"child-span\", {\n                    attributes: { \"has.parent\": false }\n                });\n\n                Assert.ok(span, \"Span should be created with parent context\");\n\n                // End the span\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                span!.end();\n\n                // Verify track was called\n                Assert.equal(1, this._trackCalls.length, \"track should have been called once\");\n                \n                const item = this._trackCalls[0];\n                Assert.ok(item, \"Telemetry item should be present\");\n                Assert.ok(item.baseData && item.baseData.properties, \"Properties should be present\");\n                Assert.equal(\"child-span\", item.baseData.name, \"Should include span name\");\n                Assert.equal(false, item.baseData.properties[\"has.parent\"], \"Should include span attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"StartSpan: startSpan should return valid span when trace provider is available\",\n            test: () => {\n                // After initialization, the trace provider should be available\n                // and startSpan should return a valid span object\n                const span = this._ai.startSpan(\"test-span\");\n                \n                // Now that initialization is complete, we should get a valid span\n                Assert.ok(span !== null, \"startSpan should return a valid span after initialization\");\n                Assert.ok(typeof span === 'object', \"Span should be an object\");\n                \n                Assert.ok(typeof span!.end === 'function', \"Span should have end method\");\n                Assert.ok(typeof span!.isRecording === 'function', \"Span should have isRecording method\");\n                span!.end();\n            }\n        });\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/TelemetryItemGeneration.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { eOTelSpanKind, eOTelSpanStatusCode, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\nexport class TelemetryItemGenerationTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${TelemetryItemGenerationTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"TelemetryItemGenerationTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: TelemetryItemGenerationTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize tests: ' + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addSpanKindTests();\n        this.addStatusCodeTests();\n        this.addAttributeTests();\n        this.addTelemetryItemStructureTests();\n        this.addComplexScenarioTests();\n    }\n\n    private addSpanKindTests(): void {\n        this.testCase({\n            name: \"SpanKind: INTERNAL span generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"internal-operation\", {\n                    kind: eOTelSpanKind.INTERNAL,\n                    attributes: { \"operation.name\": \"internal-task\" }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate one telemetry item\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                Assert.ok(item.baseData.properties, \"Should have properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanKind: CLIENT span generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"client-request\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: { \n                        \"http.method\": \"GET\",\n                        \"http.url\": \"https://example.com/api\",\n                        \"custom.attribute\": \"custom-value\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate one telemetry item\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                // Semantic attributes like http.method are excluded from properties\n                Assert.ok(!item.baseData.properties || !item.baseData.properties[\"http.method\"],\n                    \"http.method should not be in properties (mapped to baseData)\");\n                // Custom attributes should be in properties\n                Assert.equal(item.baseData.properties?.[\"custom.attribute\"], \"custom-value\",\n                    \"Custom attributes should be in properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanKind: SERVER span generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"server-handler\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: { \n                        \"http.method\": \"POST\",\n                        \"http.status_code\": 200,\n                        \"custom.server.id\": \"server-123\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate one telemetry item\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                // Semantic attributes are excluded from properties\n                Assert.ok(!item.baseData.properties || !item.baseData.properties[\"http.method\"],\n                    \"http.method should not be in properties (mapped to baseData)\");\n                // Custom attributes should be in properties\n                Assert.equal(item.baseData.properties?.[\"custom.server.id\"], \"server-123\",\n                    \"Custom attributes should be in properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanKind: PRODUCER span generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"message-producer\", {\n                    kind: eOTelSpanKind.PRODUCER,\n                    attributes: { \n                        \"messaging.system\": \"kafka\",\n                        \"messaging.destination\": \"orders-topic\",\n                        \"producer.id\": \"producer-456\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate one telemetry item\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                // messaging.* attributes may or may not be excluded depending on semantic conventions\n                // Custom attributes should be in properties\n                Assert.equal(item.baseData.properties?.[\"producer.id\"], \"producer-456\",\n                    \"Custom attributes should be in properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanKind: CONSUMER span generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"message-consumer\", {\n                    kind: eOTelSpanKind.CONSUMER,\n                    attributes: { \n                        \"messaging.system\": \"rabbitmq\",\n                        \"messaging.operation\": \"receive\",\n                        \"consumer.group\": \"group-789\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate one telemetry item\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                // messaging.* attributes may or may not be excluded depending on semantic conventions\n                // Custom attributes should be in properties\n                Assert.equal(item.baseData.properties?.[\"consumer.group\"], \"group-789\",\n                    \"Custom attributes should be in properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"SpanKind: all span kinds generate independent telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const spanKinds = [\n                    eOTelSpanKind.INTERNAL,\n                    eOTelSpanKind.CLIENT,\n                    eOTelSpanKind.SERVER,\n                    eOTelSpanKind.PRODUCER,\n                    eOTelSpanKind.CONSUMER\n                ];\n\n                // Act\n                spanKinds.forEach((kind, index) => {\n                    const span = this._ai.startSpan(`span-kind-${index}`, { kind });\n                    span?.end();\n                });\n\n                // Assert\n                Assert.equal(this._trackCalls.length, spanKinds.length,\n                    \"Each span kind should generate telemetry\");\n            }\n        });\n    }\n\n    private addStatusCodeTests(): void {\n        this.testCase({\n            name: \"StatusCode: UNSET status generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"unset-status-span\");\n                // Don't set status - defaults to UNSET\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"StatusCode: OK status generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"ok-status-span\");\n                span?.setStatus({\n                    code: eOTelSpanStatusCode.OK,\n                    message: \"Operation successful\"\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"StatusCode: ERROR status generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"error-status-span\");\n                span?.setStatus({\n                    code: eOTelSpanStatusCode.ERROR,\n                    message: \"Operation failed\"\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"StatusCode: status with message includes message in telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const errorMessage = \"Database connection timeout\";\n                \n                // Act\n                const span = this._ai.startSpan(\"status-with-message\");\n                span?.setStatus({\n                    code: eOTelSpanStatusCode.ERROR,\n                    message: errorMessage\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                // Note: Implementation may include status message in properties or elsewhere\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData with status information\");\n            }\n        });\n\n        this.testCase({\n            name: \"StatusCode: changing status before end affects telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"changing-status-span\");\n                span?.setStatus({ code: eOTelSpanStatusCode.OK });\n                span?.setStatus({ code: eOTelSpanStatusCode.ERROR, message: \"Changed to error\" });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                // The final status (ERROR) should be reflected in telemetry\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData with final status\");\n            }\n        });\n\n        this.testCase({\n            name: \"StatusCode: multiple spans with different statuses\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span1 = this._ai.startSpan(\"span-ok\");\n                span1?.setStatus({ code: eOTelSpanStatusCode.OK });\n                span1?.end();\n\n                const span2 = this._ai.startSpan(\"span-error\");\n                span2?.setStatus({ code: eOTelSpanStatusCode.ERROR });\n                span2?.end();\n\n                const span3 = this._ai.startSpan(\"span-unset\");\n                // No status set\n                span3?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 3, \"Should generate telemetry for all spans\");\n            }\n        });\n    }\n\n    private addAttributeTests(): void {\n        this.testCase({\n            name: \"Attributes: span with no attributes generates telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"no-attributes-span\");\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: span with string attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"string-attrs-span\", {\n                    attributes: {\n                        \"user.id\": \"user123\",\n                        \"session.id\": \"session456\",\n                        \"operation.name\": \"checkout\"\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                // These custom attributes should be in properties\n                Assert.equal(item.baseData.properties[\"user.id\"], \"user123\",\n                    \"Should include custom string attributes\");\n                Assert.equal(item.baseData.properties[\"session.id\"], \"session456\",\n                    \"Should include custom string attributes\");\n                // operation.name is a context tag key and gets excluded from properties\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: span with number attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"number-attrs-span\", {\n                    attributes: {\n                        \"request.size\": 1024,\n                        \"response.time\": 156.78,\n                        \"retry.count\": 3\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                // Custom number attributes should be in properties\n                Assert.equal(item.baseData.properties[\"request.size\"], 1024,\n                    \"Should include custom number attributes\");\n                Assert.equal(item.baseData.properties[\"response.time\"], 156.78,\n                    \"Should include custom number attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: span with boolean attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"boolean-attrs-span\", {\n                    attributes: {\n                        \"cache.hit\": true,\n                        \"auth.required\": false,\n                        \"retry.enabled\": true\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                Assert.equal(item.baseData.properties[\"cache.hit\"], true,\n                    \"Should include boolean attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: span with mixed type attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"mixed-attrs-span\", {\n                    attributes: {\n                        \"string.attr\": \"value\",\n                        \"number.attr\": 42,\n                        \"boolean.attr\": true,\n                        \"float.attr\": 3.14\n                    }\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                Assert.equal(item.baseData.properties[\"string.attr\"], \"value\");\n                Assert.equal(item.baseData.properties[\"number.attr\"], 42);\n                Assert.equal(item.baseData.properties[\"boolean.attr\"], true);\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: setAttribute after creation adds to telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"dynamic-attrs-span\");\n                span?.setAttribute(\"initial.attr\", \"initial\");\n                span?.setAttribute(\"added.later\", \"later-value\");\n                span?.setAttribute(\"number.added\", 999);\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                Assert.equal(item.baseData.properties[\"initial.attr\"], \"initial\");\n                Assert.equal(item.baseData.properties[\"added.later\"], \"later-value\");\n                Assert.equal(item.baseData.properties[\"number.added\"], 999);\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: setAttributes adds multiple attributes to telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"batch-attrs-span\");\n                span?.setAttributes({\n                    \"batch.attr1\": \"value1\",\n                    \"batch.attr2\": \"value2\",\n                    \"batch.attr3\": 123\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                Assert.equal(item.baseData.properties[\"batch.attr1\"], \"value1\");\n                Assert.equal(item.baseData.properties[\"batch.attr2\"], \"value2\");\n                Assert.equal(item.baseData.properties[\"batch.attr3\"], 123);\n            }\n        });\n\n        this.testCase({\n            name: \"Attributes: updating attribute value reflects in telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"update-attr-span\");\n                span?.setAttribute(\"status\", \"pending\");\n                span?.setAttribute(\"status\", \"in-progress\");\n                span?.setAttribute(\"status\", \"completed\");\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                Assert.equal(item.baseData.properties[\"status\"], \"completed\",\n                    \"Should reflect final attribute value\");\n            }\n        });\n    }\n\n    private addTelemetryItemStructureTests(): void {\n        this.testCase({\n            name: \"Structure: telemetry item has required fields\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"structure-test-span\");\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                \n                Assert.ok(item.name, \"Should have name\");\n                Assert.ok(item.baseData, \"Should have baseData\");\n                Assert.ok(item.baseData.properties, \"Should have properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"Structure: span name is in telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const spanName = \"my-custom-operation\";\n                \n                // Act\n                const span = this._ai.startSpan(spanName);\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                \n                // Span name is in baseData.name, not properties.name\n                Assert.ok(item.baseData, \"Should have baseData\");\n                Assert.equal(item.baseData.name, spanName,\n                    \"Span name should be in baseData.name\");\n            }\n        });\n\n        this.testCase({\n            name: \"Structure: updated span name reflects in telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const originalName = \"original-name\";\n                const updatedName = \"updated-name\";\n                \n                // Act\n                const span = this._ai.startSpan(originalName);\n                span?.updateName(updatedName);\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                \n                // Updated span name should be in baseData.name\n                Assert.ok(item.baseData, \"Should have baseData\");\n                Assert.equal(item.baseData.name, updatedName,\n                    \"Updated span name should be in baseData.name\");\n            }\n        });\n\n        this.testCase({\n            name: \"Structure: trace context is in telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"trace-context-span\");\n                const spanContext = span?.spanContext();\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                \n                // Telemetry should include trace context information\n                Assert.ok(spanContext, \"Span should have context\");\n                Assert.ok(spanContext?.traceId, \"Should have traceId\");\n                Assert.ok(spanContext?.spanId, \"Should have spanId\");\n            }\n        });\n\n        this.testCase({\n            name: \"Structure: multiple spans generate separate telemetry items\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span1 = this._ai.startSpan(\"span-1\");\n                span1?.end();\n                \n                const span2 = this._ai.startSpan(\"span-2\");\n                span2?.end();\n                \n                const span3 = this._ai.startSpan(\"span-3\");\n                span3?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 3, \"Should generate 3 telemetry items\");\n                \n                // Span names are in baseData.name, not properties.name\n                const names = this._trackCalls.map(item => item.baseData?.name);\n                Assert.ok(names.includes(\"span-1\"), \"Should include span-1\");\n                Assert.ok(names.includes(\"span-2\"), \"Should include span-2\");\n                Assert.ok(names.includes(\"span-3\"), \"Should include span-3\");\n            }\n        });\n    }\n\n    private addComplexScenarioTests(): void {\n        this.testCase({\n            name: \"Complex: span with kind, status, and attributes\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"complex-span\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"http.method\": \"POST\",\n                        \"http.url\": \"https://api.example.com/users\",\n                        \"http.status_code\": 201,\n                        \"request.id\": \"req-12345\",\n                        \"user.action\": \"create\"\n                    }\n                });\n                span?.setStatus({\n                    code: eOTelSpanStatusCode.OK,\n                    message: \"User created successfully\"\n                });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData, \"Should have baseData\");\n                // Semantic attributes are excluded from properties\n                Assert.ok(!item.baseData.properties || !item.baseData.properties[\"http.method\"],\n                    \"http.method should not be in properties\");\n                // Custom attributes should be in properties\n                Assert.equal(item.baseData.properties?.[\"request.id\"], \"req-12345\",\n                    \"Custom attributes should be in properties\");\n                Assert.equal(item.baseData.properties?.[\"user.action\"], \"create\",\n                    \"Custom attributes should be in properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"Complex: parent-child spans generate separate telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const parentSpan = this._ai.startSpan(\"parent-operation\");\n                const parentContext = parentSpan?.spanContext();\n                \n                const childSpan = this._ai.startSpan(\"child-operation\", undefined, parentContext);\n                childSpan?.end();\n                \n                parentSpan?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 2, \"Should generate telemetry for both spans\");\n                \n                // Span names are in baseData.name, not properties.name\n                const names = this._trackCalls.map(item => item.baseData?.name);\n                Assert.ok(names.includes(\"child-operation\"), \"Should include child telemetry\");\n                Assert.ok(names.includes(\"parent-operation\"), \"Should include parent telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"Complex: span with dynamic attributes during execution\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const span = this._ai.startSpan(\"dynamic-execution-span\", {\n                    attributes: { \"phase\": \"start\" }\n                });\n                \n                span?.setAttribute(\"phase\", \"processing\");\n                span?.setAttribute(\"items.processed\", 50);\n                \n                span?.setAttribute(\"phase\", \"finalizing\");\n                span?.setAttribute(\"items.processed\", 100);\n                \n                span?.setStatus({ code: eOTelSpanStatusCode.OK });\n                span?.end();\n\n                // Assert\n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                const item = this._trackCalls[0];\n                Assert.ok(item.baseData?.properties, \"Should have properties\");\n                Assert.equal(item.baseData.properties[\"phase\"], \"finalizing\",\n                    \"Should have final phase value\");\n                Assert.equal(item.baseData.properties[\"items.processed\"], 100,\n                    \"Should have final processed count\");\n            }\n        });\n\n        this.testCase({\n            name: \"Complex: all span kinds with attributes and status\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const testData = [\n                    { kind: eOTelSpanKind.INTERNAL, name: \"internal-op\", attr: \"internal-value\" },\n                    { kind: eOTelSpanKind.CLIENT, name: \"client-op\", attr: \"client-value\" },\n                    { kind: eOTelSpanKind.SERVER, name: \"server-op\", attr: \"server-value\" },\n                    { kind: eOTelSpanKind.PRODUCER, name: \"producer-op\", attr: \"producer-value\" },\n                    { kind: eOTelSpanKind.CONSUMER, name: \"consumer-op\", attr: \"consumer-value\" }\n                ];\n\n                // Act\n                testData.forEach(data => {\n                    const span = this._ai.startSpan(data.name, {\n                        kind: data.kind,\n                        attributes: { \"operation.type\": data.attr }\n                    });\n                    span?.setStatus({ code: eOTelSpanStatusCode.OK });\n                    span?.end();\n                });\n\n                // Assert\n                Assert.equal(this._trackCalls.length, testData.length,\n                    \"Should generate telemetry for all span types\");\n                \n                testData.forEach(data => {\n                    // Span names are in baseData.name, not properties.name\n                    const telemetry = this._trackCalls.find(\n                        item => item.baseData?.name === data.name\n                    );\n                    Assert.ok(telemetry, `Should have telemetry for ${data.name}`);\n                    // Custom attributes should be in properties\n                    Assert.equal(telemetry?.baseData?.properties?.[\"operation.type\"], data.attr,\n                        `Should have correct attributes for ${data.name}`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Complex: non-recording spans do not generate telemetry\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Act\n                const recordingSpan = this._ai.startSpan(\"recording-span\", { recording: true });\n                recordingSpan?.end();\n                \n                const nonRecordingSpan = this._ai.startSpan(\"non-recording-span\", { recording: false });\n                nonRecordingSpan?.end();\n\n                // Assert\n                // Recording span should generate telemetry, non-recording should not\n                // Span names are in baseData.name, not properties.name\n                const recordingTelemetry = this._trackCalls.find(\n                    item => item.baseData?.name === \"recording-span\"\n                );\n                const nonRecordingTelemetry = this._trackCalls.find(\n                    item => item.baseData?.name === \"non-recording-span\"\n                );\n                \n                Assert.ok(recordingTelemetry, \"Recording span should generate telemetry\");\n                Assert.ok(!nonRecordingTelemetry, \"Non-recording span should not generate telemetry\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/ThrottleSentMessage.tests.ts",
    "content": "import { ApplicationInsights, ApplicationInsightsContainer, IApplicationInsights, IConfig, IConfiguration, LoggingSeverity, Snippet, _eInternalMessageId } from '../../../src/applicationinsights-web'\nimport { AITestClass, Assert} from '@microsoft/ai-test-framework';\nimport { IThrottleInterval, IThrottleLimit, IThrottleMgrConfig } from '@microsoft/applicationinsights-core-js';\nimport { SinonSpy } from 'sinon';\nimport { AppInsightsSku } from '../../../src/AISku';\nimport { createSnippetV5 } from './testSnippetV5';\nimport { FeatureOptInMode, newId } from '@microsoft/applicationinsights-core-js';\nimport { createSnippetV6 } from './testSnippetV6';\n\nconst TestInstrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n\nconst tconfig = {\n    disabled: false,\n    limit: {\n        samplingRate: 1000000,\n        maxSendNumber:100\n    } as IThrottleLimit,\n    interval: {\n        monthInterval: 1,\n        daysOfMonth: [1], // must add here\n        dayInterval: undefined\n    } as IThrottleInterval\n} as IThrottleMgrConfig;\n\nexport class ThrottleSentMessage extends AITestClass {\n    private _ai: IApplicationInsights;\n    private getAi: ApplicationInsights;\n    private _config: IConfiguration | IConfig;\n    private _logger;\n\n    constructor() {\n        super(\"ThrottleSentMessage\");\n    }\n\n    public _getTestConfig() {\n        let config: IConfiguration & IConfig = {\n            instrumentationKey: TestInstrumentationKey,\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            maxBatchInterval: 2500,\n            disableExceptionTracking: false,\n            enableCorsCorrelation: true,\n            samplingPercentage: 50,\n            convertUndefined: \"test-value\",\n            disablePageUnloadEvents: [ \"beforeunload\" ],\n            extensionConfig: {\n                [\"AppInsightsCfgSyncPlugin\"]: {\n                    cfgUrl: \"\"\n                }\n            }\n        };\n        return config;\n    }\n\n    public testInitialize() {\n        try {\n            if (window.localStorage){\n                window.localStorage.clear();\n            }\n            this.useFakeServer = false;\n            this._config = this._getTestConfig();\n\n            const init = new ApplicationInsights({\n                config: this._config\n            });\n          \n            this._ai = init.loadAppInsights();\n            this.getAi = init;\n\n            let core = this._ai['core'];\n            this._logger = core.logger;\n        } catch (e) {\n            console.error('Failed to initialize');\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ai && this._ai.unload) {\n            // force unload\n            this._ai.unload(false);\n        }\n        if (window.localStorage){\n            window.localStorage.clear();\n        }\n    }\n\n    public registerTests() {\n        this.cdnDeprecatedMessageTests();\n        this.ikeyMessageTests();\n        this.snippetVerMessageTests();\n    }\n\n    public cdnDeprecatedMessageTests(): void {\n        this.testCase({\n            name: \"ThrottleSentMessage: Message is sent when az416426 is used\",\n            useFakeTimers: true,\n            test: () => {\n                Assert.ok(this._ai, 'ApplicationInsights SDK exists');\n                Assert.ok(this._ai.appInsights, 'App Analytics exists');\n                Assert.equal(true, this._ai.appInsights.isInitialized(), 'App Analytics is initialized');\n\n                Assert.ok(this._ai.appInsights.core, 'Core exists');\n                Assert.equal(true, this._ai.appInsights.core.isInitialized(),\n                    'Core is initialized');\n                let loggingSpy = this.sandbox.stub(this._logger, 'throwInternal');\n\n                let config = this.getAi.config;\n\n                config.throttleMgrCfg= {[_eInternalMessageId.CdnDeprecation]:tconfig};\n                config.featureOptIn = {[\"CdnUsage\"]: {mode: FeatureOptInMode.enable}};\n                this.clock.tick(12); // wait enough time for negative test\n                Assert.equal(loggingSpy.callCount, 0);\n                // first enable featureOptin, then enable throttleMsg\n                config.featureOptIn = {[\"CdnUsage\"]: {mode: FeatureOptInMode.enable},[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}};\n                config.throttleMgrCfg= {[_eInternalMessageId.CdnDeprecation]:tconfig, [_eInternalMessageId.DefaultThrottleMsgKey]:tconfig};\n                this._ai.context.internal.sdkSrc = \"az416426\";\n                this.clock.tick(1);\n                Assert.equal(loggingSpy.called, 1);\n                Assert.equal(_eInternalMessageId.CdnDeprecation, loggingSpy.args[0][1]);\n                let message= loggingSpy.args[0][2];\n                Assert.ok(message.includes(\"Cdn\"));\n            }\n        });\n        this.testCase({\n        name: \"ThrottleSentMessage: Message will not be sent again when other config change\",\n        useFakeTimers: true,\n            test: () => {\n                Assert.ok(this._ai, 'ApplicationInsights SDK exists');\n                Assert.ok(this._ai.appInsights, 'App Analytics exists');\n                Assert.equal(true, this._ai.appInsights.isInitialized(), 'App Analytics is initialized');\n\n                Assert.ok(this._ai.appInsights.core, 'Core exists');\n                Assert.equal(true, this._ai.appInsights.core.isInitialized(),\n                    'Core is initialized');\n                let loggingSpy = this.sandbox.stub(this._logger, 'throwInternal');\n\n                let config = this.getAi.config;\n\n                config.throttleMgrCfg= {[_eInternalMessageId.CdnDeprecation]:tconfig, [_eInternalMessageId.DefaultThrottleMsgKey]:tconfig};\n                config.featureOptIn = {[\"CdnUsage\"]: {mode: FeatureOptInMode.enable},[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}};\n                this._ai.context.internal.sdkSrc = \"az416426\";\n                this.clock.tick(1);\n                Assert.equal(loggingSpy.called, 1);\n                console.log(\"is called\", loggingSpy.callCount);\n                Assert.equal(_eInternalMessageId.CdnDeprecation, loggingSpy.args[0][1]);\n                let message= loggingSpy.args[0][2];\n                Assert.ok(message.includes(\"Cdn\"));\n                \n                config.instrumentationKey = \"newinstrumentkey\";\n                this.clock.tick(1);\n                Assert.equal(loggingSpy.called, 1);\n\n            }\n        });\n    }\n\n    public ikeyMessageTests(): void {\n        this.testCase({\n            name: \"ThrottleSentMessage: Message is sent when user use connection string\",\n            useFakeTimers: true,\n            test: () => {\n                Assert.ok(this._ai, 'ApplicationInsights SDK exists');\n                Assert.ok(this._ai.appInsights, 'App Analytics exists');\n                Assert.equal(true, this._ai.appInsights.isInitialized(), 'App Analytics is initialized');\n\n                Assert.ok(this._ai.appInsights.core, 'Core exists');\n                Assert.equal(true, this._ai.appInsights.core.isInitialized(),\n                    'Core is initialized');\n                let loggingSpy = this.sandbox.stub(this._logger, 'throwInternal');\n\n                let config = this.getAi.config;\n\n                // test throttleCfg has controll on message sending\n\n                config.throttleMgrCfg= {[_eInternalMessageId.InstrumentationKeyDeprecation]:tconfig, [_eInternalMessageId.DefaultThrottleMsgKey]:tconfig};\n                this.clock.tick(1);\n                // TODO: the sequence of these two changes cannot be reversed \n                config.featureOptIn = {[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}};\n                this.clock.tick(1);\n\n                Assert.equal(loggingSpy.called, 1);\n                Assert.equal(_eInternalMessageId.InstrumentationKeyDeprecation, loggingSpy.args[0][1]);\n                let message= loggingSpy.args[0][2];\n                Assert.ok(message.includes(\"Instrumentation key\"));\n            }\n        });\n        this.testCase({\n            name: \"ThrottleSentMessage: Message will not be sent when user turn off message\",\n            useFakeTimers: true,\n            test: () => {\n                let loggingSpy = this.sandbox.stub(this._logger, 'throwInternal');\n                let config = this._getTestConfig();\n                config.throttleMgrCfg= {[_eInternalMessageId.InstrumentationKeyDeprecation]:tconfig, [_eInternalMessageId.DefaultThrottleMsgKey]:tconfig};\n                config.featureOptIn = {[\"iKeyUsage\"]: {mode: FeatureOptInMode.disable}}\n                let init = new ApplicationInsights({\n                    config: config\n                });\n              \n                let ai = init.loadAppInsights();\n                Assert.equal(true, ai.appInsights.core.isInitialized(),'Core is initialized');\n                this.clock.tick(12); // wait enough time for negative test\n                Assert.equal(loggingSpy.callCount, 0);\n\n                ai.unload(false);\n            }\n        });\n    }\n    public snippetVerMessageTests(){\n        this.testCase({\n            name: \"ThrottleSentMessage: Message will be sent for ver 5 snippet\",\n            useFakeTimers: true,\n            test: () => {\n                    let pieceConfig = this._getTestConfig()\n                    let myconfig = {src:\"\", cfg:pieceConfig};\n                    let snippet = this._initializeSnippet(createSnippetV5(myconfig));\n\n                    let getcore = snippet['core'];\n                    let getcoreLogger = getcore.logger;\n\n                    let loggingSpy = this.sandbox.stub(getcoreLogger, 'throwInternal');\n\n// notice: if featureOptIn does not exist before, the onconfigchange would not be called\n                    Assert.equal(true, snippet.appInsights.isInitialized(), \"isInitialized\");\n                    snippet.config.throttleMgrCfg= {[_eInternalMessageId.SdkLdrUpdate]:tconfig, [_eInternalMessageId.DefaultThrottleMsgKey]:tconfig};\n                    snippet.config.featureOptIn = {[\"SdkLoaderVer\"]: {mode: FeatureOptInMode.enable}}\n                    this.clock.tick(1);\n                    Assert.equal(loggingSpy.called, 1);\n                    Assert.equal(_eInternalMessageId.SdkLdrUpdate, loggingSpy.args[0][1]);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleSentMessage: Message will not be sent for ver 6 snippet\",\n            useFakeTimers: true,\n            test: () => {\n                    let pieceConfig = this._getTestConfig()\n                    let myconfig = {src:\"\", cfg:pieceConfig};\n                    let snippet = this._initializeSnippet(createSnippetV6(myconfig));\n\n                    let getcore = snippet['core'];\n                    let getcoreLogger = getcore.logger;\n                    let loggingSpy = this.sandbox.stub(getcoreLogger, 'throwInternal');\n\n                    Assert.equal(true, snippet.appInsights.isInitialized(), \"isInitialized\");\n                    snippet.config.throttleMgrCfg= {[_eInternalMessageId.SdkLdrUpdate]:tconfig, [_eInternalMessageId.DefaultThrottleMsgKey]:tconfig};\n                    snippet.config.featureOptIn = {[\"SdkLoaderVer\"]: {mode: FeatureOptInMode.enable}}\n                    this.clock.tick(12); // wait enough time for negative test\n                    Assert.equal(loggingSpy.callCount, 0);\n            }\n        });\n\n    }\n\n    \n    private _initializeSnippet(snippet: Snippet): ApplicationInsights {\n        try {\n            //this.useFakeServer = false;\n\n            // Call the initialization\n            ((ApplicationInsightsContainer.getAppInsights(snippet, snippet.version)) as IApplicationInsights);\n\n            // Setup Sinon stuff\n            const appInsights: AppInsightsSku = (snippet as any).appInsights;\n            this.onDone(() => {\n                if (snippet) {\n                    if (snippet[\"unload\"]) {\n                        snippet[\"unload\"](false);\n                    } else if (snippet[\"appInsightsNew\"]) {\n                        snippet[\"appInsightsNew\"].unload(false);\n                    }\n                }\n            });\n\n            Assert.ok(appInsights, \"The App insights instance should be populated\");\n            Assert.ok(appInsights.core, \"The Core exists\");\n            Assert.equal(appInsights.core, (snippet as any).core, \"The core instances should match\");\n\n            Assert.equal(true, (appInsights as any).isInitialized(), 'App Analytics is initialized');\n            Assert.equal(true, appInsights.core.isInitialized(), 'Core is initialized');\n\n       \n\n        } catch (e) {\n            console.error('Failed to initialize');\n            Assert.ok(false, e);\n        }\n\n        // Note: Explicitly returning the original snippet as this should have been updated!\n        return snippet as any;\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/TraceContext.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { IOTelSpanOptions, eOTelSpanKind, ITelemetryItem, isUndefined, useSpan, isNumber } from \"@microsoft/applicationinsights-core-js\";\nimport { isFunction, objIs } from '@nevware21/ts-utils';\n\nexport class TraceContextTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${TraceContextTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"TraceContextTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: TraceContextTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize tests: ' + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addGetTraceCtxTests();\n        this.addActiveSpanTests();\n        this.addsetActiveSpanTests();\n        this.addIntegrationTests();\n    }\n\n    private addGetTraceCtxTests(): void {\n        this.testCase({\n            name: \"getTraceCtx: should return valid trace context after starting a span\",\n            test: () => {\n                // Arrange\n                const spanName = \"test-span-with-context\";\n                \n                // Act\n                const span = this._ai.startSpan(spanName);\n                const traceCtx = this._ai.getTraceCtx();\n\n                // Assert\n                Assert.ok(span !== null, \"Span should be created\");\n                Assert.ok(traceCtx !== null && traceCtx !== undefined, \"Should return trace context after starting span\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.ok(traceCtx!.traceId, \"Trace context should have traceId\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.equal(\"\", traceCtx!.spanId, \"Trace context should not have a spanId (the default SDK initialization)\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                Assert.ok(isUndefined(traceCtx!.traceFlags), \"Trace context should NOT have have traceFlags\");\n\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                useSpan(this._ai.core, span!, () => {\n                    const nestedTraceCtx = this._ai.getTraceCtx();\n                    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                    Assert.equal(traceCtx!.traceId, nestedTraceCtx!.traceId, \"TraceId should be the same within the span context\");\n                    Assert.equal(span?.spanContext().traceId, nestedTraceCtx?.traceId, \"TraceId should match the active span's traceId\");\n                    Assert.equal(span?.spanContext().spanId, nestedTraceCtx?.spanId, \"SpanId should match the active span's spanId\");\n                    Assert.equal(span?.spanContext().traceFlags, nestedTraceCtx?.traceFlags, \"TraceFlags should match the active span's traceFlags\");\n                });\n                \n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"getTraceCtx: should return trace context matching active span\",\n            test: () => {\n                // Arrange\n                const spanName = \"context-matching-span\";\n                \n                // Act\n                const span = this._ai.startSpan(spanName);\n                const traceCtx = this._ai.getTraceCtx();\n                const spanContext = span?.spanContext();\n\n                // Assert\n                Assert.ok(span !== null, \"Span should be created\");\n                Assert.ok(traceCtx !== null && traceCtx !== undefined, \"Trace context should exist\");\n                Assert.ok(spanContext !== null && spanContext !== undefined, \"Span context should exist\");\n                \n                Assert.equal(traceCtx.traceId, spanContext.traceId, \"Trace context traceId should match span context\");\n                Assert.notEqual(traceCtx.spanId, spanContext.spanId, \"Trace context spanId should match span context\");\n\n                useSpan(this._ai.core, span!, () => {\n                    const activeTraceCtx = this._ai.getTraceCtx();\n                    Assert.equal(activeTraceCtx?.traceId, spanContext.traceId, \"The active traceId should match span context\");\n                    Assert.equal(activeTraceCtx?.spanId, spanContext.spanId, \"The active spanId should match span context\");\n                });\n\n                Assert.equal(traceCtx.traceId, spanContext.traceId, \"Trace context traceId should match span context\");\n                Assert.notEqual(traceCtx.spanId, spanContext.spanId, \"Trace context spanId should match span context\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"getTraceCtx: should have valid traceId format (32 hex chars)\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"format-test-span\");\n                \n                // Act\n                const traceCtx = this._ai.getTraceCtx();\n\n                // Assert\n                Assert.ok(traceCtx !== null && traceCtx !== undefined, \"Trace context should exist\");\n                \n                if (traceCtx && traceCtx.traceId) {\n                    Assert.equal(traceCtx.traceId.length, 32, \"TraceId should be 32 characters\");\n                    Assert.ok(/^[0-9a-f]{32}$/i.test(traceCtx.traceId), \n                        \"TraceId should be 32 hex characters\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"getTraceCtx: should have valid spanId format (16 hex chars)\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"spanid-test-span\");\n                \n                // Act\n                const traceCtx = this._ai.getTraceCtx();\n\n                // Assert\n                Assert.ok(traceCtx !== null && traceCtx !== undefined, \"Trace context should exist\");\n                \n                if (traceCtx && traceCtx.spanId) {\n                    Assert.equal(traceCtx.spanId.length, 16, \"SpanId should be 16 characters\");\n                    Assert.ok(/^[0-9a-f]{16}$/i.test(traceCtx.spanId), \n                        \"SpanId should be 16 hex characters\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"getTraceCtx: should persist context across multiple calls\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"persistence-span\");\n                \n                // Act\n                const traceCtx1 = this._ai.getTraceCtx();\n                const traceCtx2 = this._ai.getTraceCtx();\n                const traceCtx3 = this._ai.getTraceCtx();\n\n                // Assert\n                Assert.ok(traceCtx1 !== null && traceCtx1 !== undefined, \"First call should return context\");\n                Assert.ok(traceCtx2 !== null && traceCtx2 !== undefined, \"Second call should return context\");\n                Assert.ok(traceCtx3 !== null && traceCtx3 !== undefined, \"Third call should return context\");\n                \n                if (traceCtx1 && traceCtx2 && traceCtx3) {\n                    Assert.equal(traceCtx1.traceId, traceCtx2.traceId, \"TraceId should be consistent\");\n                    Assert.equal(traceCtx2.traceId, traceCtx3.traceId, \"TraceId should be consistent\");\n                    Assert.equal(traceCtx1.spanId, traceCtx2.spanId, \"SpanId should be consistent\");\n                    Assert.equal(traceCtx2.spanId, traceCtx3.spanId, \"SpanId should be consistent\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"getTraceCtx: should return context for child spans with same traceId\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-span\");\n                const parentCtx = this._ai.getTraceCtx();\n                \n                // Act - create child span\n                const childSpan = this._ai.startSpan(\"child-span\", undefined, parentCtx || undefined);\n\n                let childCtx;\n                useSpan(this._ai.core, childSpan!, () => {\n                    childCtx = this._ai.getTraceCtx();\n                });\n\n                // Assert\n                Assert.ok(parentCtx !== null && parentCtx !== undefined, \"Parent context should exist\");\n                Assert.ok(childCtx !== null && childCtx !== undefined, \"Child context should exist\");\n                \n                Assert.equal(childCtx.traceId, parentCtx.traceId, \"Child span should have same traceId as parent\");\n                Assert.notEqual(childCtx.spanId, parentCtx.spanId, \"Child span should have different spanId from parent\");\n\n                Assert.equal(childSpan?.spanContext().traceId, parentCtx.traceId, \"Child span should have same traceId as parent\");\n                Assert.notEqual(childSpan?.spanContext().spanId, parentCtx.spanId, \"Child span should have different spanId from parent\");\n                Assert.equal(childSpan?.spanContext().spanId, childCtx.spanId, \"Child spanId should match its context\");\n                Assert.equal(childSpan?.spanContext().traceId, childCtx.traceId, \"Child traceId should match its context\");\n\n                // Cleanup\n                childSpan?.end();\n                parentSpan?.end();\n            }\n        });\n    }\n\n    private addActiveSpanTests(): void {\n        this.testCase({\n            name: \"activeSpan: should return null when no span is active (via trace provider)\",\n            test: () => {\n                // Assert\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                const activeSpan = this._ai.getActiveSpan();\n                Assert.ok(activeSpan, \"Should Always return a non-null span when no span is active\");\n                Assert.equal(false, activeSpan.isRecording(), \"Returned span should be a non-recording span\");\n            }\n        });\n\n        this.testCase({\n            name: \"activeSpan: should return null when createNew is false and no span is active\",\n            test: () => {\n                // Act\n                const activeSpan = this._ai.getActiveSpan(false);\n\n                // Assert\n                Assert.equal(activeSpan, null, \"Should return null when createNew is false and no active span exists\");\n            }\n        });\n\n        this.testCase({\n            name: \"activeSpan: should return existing span when createNew is false and span is active\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"test-span\");\n                this._ai.setActiveSpan(span);\n\n                // Act\n                const activeSpan = this._ai.getActiveSpan(false);\n\n                // Assert\n                Assert.ok(activeSpan, \"Should return the active span\");\n                Assert.equal(activeSpan, span, \"Should return the same span object\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"activeSpan: should return active span after setActiveSpan (via trace provider)\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"active-span-test\");\n                \n                // Act\n                this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n\n                // Assert\n                Assert.ok(activeSpan !== null, \"Should return the active span\");\n                Assert.equal(activeSpan.name, span.name, \"Active span should match the set span\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"activeSpan: should return the most recently set active span\",\n            test: () => {\n                // Arrange\n                const span1 = this._ai.startSpan(\"span-1\");\n                const span2 = this._ai.startSpan(\"span-2\");\n                const span3 = this._ai.startSpan(\"span-3\");\n                \n                // Act & Assert\n                this._ai.setActiveSpan(span1);\n                let activeSpan = this._ai.getActiveSpan();\n                Assert.equal(activeSpan.name, span1.name, \"Should return span1 as active\");\n\n                this._ai.setActiveSpan(span2);\n                activeSpan = this._ai.getActiveSpan();\n                Assert.equal(activeSpan.name, span2.name, \"Should return span2 as active\");\n\n                this._ai.setActiveSpan(span3);\n                activeSpan = this._ai.getActiveSpan();\n                Assert.equal(activeSpan.name, span3.name, \"Should return span3 as active\");\n\n                // Cleanup\n                span1?.end();\n                span2?.end();\n                span3?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"activeSpan: active span should have valid span context\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"context-check-span\");\n                \n                // Act\n                this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n                const spanContext = activeSpan.spanContext();\n\n                // Assert\n                Assert.ok(activeSpan !== null, \"Active span should exist\");\n                Assert.ok(objIs(activeSpan, span), \"Active span should match the set span\");\n                Assert.ok(spanContext !== null && spanContext !== undefined, \"Active span should have valid context\");\n                \n                Assert.ok(spanContext.traceId, \"Should have traceId\");\n                Assert.ok(spanContext.spanId, \"Should have spanId\");\n                Assert.ok(isUndefined(spanContext.traceFlags), \"Should have default traceFlags (undefined)\");\n                Assert.equal(undefined, spanContext?.traceFlags, \"TraceFlags should not have sampled flag set by default\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"activeSpan: should work with recording spans\",\n            test: () => {\n                // Arrange\n                const options: IOTelSpanOptions = {\n                    recording: true,\n                    kind: eOTelSpanKind.CLIENT\n                };\n                const span = this._ai.startSpan(\"recording-span\", options);\n                \n                // Act\n                this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n\n                // Assert\n                Assert.ok(activeSpan !== null, \"Active span should exist\");\n                Assert.ok(activeSpan.isRecording(), \"Active span should be recording\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"activeSpan: should work with non-recording spans\",\n            test: () => {\n                // Arrange\n                const options: IOTelSpanOptions = {\n                    recording: false\n                };\n                const span = this._ai.startSpan(\"non-recording-span\", options);\n                \n                // Act\n                this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n\n                // Assert\n                Assert.ok(activeSpan !== null, \"Active span should exist\");\n                Assert.ok(!activeSpan.isRecording(), \"Active span should not be recording\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n    }\n\n    private addsetActiveSpanTests(): void {\n        this.testCase({\n            name: \"setActiveSpan: should set a span as active\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"set-active-test\");\n                \n                // Act\n                const scope = this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n\n                // Assert\n                Assert.ok(scope !== null, \"Scope should be returned\");\n                Assert.equal(scope.span, span, \"Scope.span should equal the passed span\");\n                Assert.ok(activeSpan !== null, \"Active span should be set\");\n                Assert.equal(activeSpan, span, \"ActiveSpan() should return the same span object\");\n                Assert.equal(activeSpan.name, span.name, \"Set span should be the active span\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"setActiveSpan: should update getTraceCtx to reflect active span\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"trace-ctx-update-test\");\n                \n                // Act\n                const scope = this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n                const traceCtx = this._ai.getTraceCtx();\n                const spanContext = span.spanContext();\n\n                // Assert\n                Assert.ok(scope !== null, \"Scope should be returned\");\n                Assert.equal(scope.span, span, \"Scope.span should equal the passed span\");\n                Assert.equal(activeSpan, span, \"ActiveSpan() should return the same span object\");\n                Assert.ok(traceCtx !== null && traceCtx !== undefined, \n                    \"Trace context should be updated\");\n                \n                if (traceCtx && spanContext) {\n                    Assert.equal(traceCtx.traceId, spanContext.traceId, \n                        \"Trace context should match active span\");\n                    Assert.equal(traceCtx.spanId, spanContext.spanId, \n                        \"Trace context spanId should match active span\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"setActiveSpan: should allow switching between multiple spans\",\n            test: () => {\n                // Arrange\n                const span1 = this._ai.startSpan(\"switch-span-1\");\n                const span2 = this._ai.startSpan(\"switch-span-2\");\n                \n                // Act & Assert\n                // Set first span as active\n                let scope = this._ai.setActiveSpan(span1);\n                let activeSpan = this._ai.getActiveSpan();\n                Assert.equal(scope.span, span1, \"Scope.span should equal span1\");\n                Assert.equal(activeSpan, span1, \"ActiveSpan() should return span1\");\n                Assert.equal(activeSpan.name, span1.name, \"First span should be active\");\n\n                // Switch to second span\n                scope = this._ai.setActiveSpan(span2);\n                activeSpan = this._ai.getActiveSpan();\n                Assert.equal(scope.span, span2, \"Scope.span should equal span2\");\n                Assert.equal(activeSpan, span2, \"ActiveSpan() should return span2\");\n                Assert.equal(activeSpan.name, span2.name, \"Second span should be active\");\n\n                // Switch back to first span\n                scope = this._ai.setActiveSpan(span1);\n                activeSpan = this._ai.getActiveSpan();\n                Assert.equal(scope.span, span1, \"Scope.span should equal span1 again\");\n                Assert.equal(activeSpan, span1, \"ActiveSpan() should return span1 again\");\n                Assert.equal(activeSpan.name, span1.name, \"First span should be active again\");\n\n                // Cleanup\n                span1?.end();\n                span2?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"setActiveSpan: should work with spans of different kinds\",\n            test: () => {\n                // Arrange\n                const clientSpan = this._ai.startSpan(\"client-span\", { kind: eOTelSpanKind.CLIENT });\n                const serverSpan = this._ai.startSpan(\"server-span\", { kind: eOTelSpanKind.SERVER });\n                \n                // Act & Assert\n                let scope = this._ai.setActiveSpan(clientSpan);\n                let activeSpan = this._ai.getActiveSpan();\n                Assert.equal(scope.span, clientSpan, \"Scope.span should equal clientSpan\");\n                Assert.equal(activeSpan, clientSpan, \"ActiveSpan() should return clientSpan\");\n                Assert.equal(activeSpan.kind, eOTelSpanKind.CLIENT, \n                    \"Client span should be active with correct kind\");\n\n                scope = this._ai.setActiveSpan(serverSpan);\n                activeSpan = this._ai.getActiveSpan();\n                Assert.equal(scope.span, serverSpan, \"Scope.span should equal serverSpan\");\n                Assert.equal(activeSpan, serverSpan, \"ActiveSpan() should return serverSpan\");\n                Assert.equal(activeSpan.kind, eOTelSpanKind.SERVER, \n                    \"Server span should be active with correct kind\");\n\n                // Cleanup\n                clientSpan?.end();\n                serverSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"setActiveSpan: should work with spans that have attributes\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"http.method\": \"GET\",\n                    \"http.url\": \"https://example.com\",\n                    \"custom.attribute\": \"test-value\"\n                };\n                const span = this._ai.startSpan(\"attributed-span\", { attributes });\n                \n                // Act\n                const scope = this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n\n                // Assert\n                Assert.ok(scope !== null, \"Scope should be returned\");\n                Assert.equal(scope.span, span, \"Scope.span should equal the passed span\");\n                Assert.ok(activeSpan !== null, \"Active span should exist\");\n                Assert.equal(activeSpan, span, \"ActiveSpan() should return the same span object\");\n                Assert.equal(activeSpan.name, span.name, \"Span name should match\");\n                \n                const spanAttributes = activeSpan.attributes;\n                Assert.equal(spanAttributes[\"http.method\"], \"GET\", \n                    \"Attributes should be preserved\");\n                Assert.equal(spanAttributes[\"http.url\"], \"https://example.com\", \n                    \"Attributes should be preserved\");\n                Assert.equal(spanAttributes[\"custom.attribute\"], \"test-value\", \n                    \"Custom attributes should be preserved\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"setActiveSpan: should handle ended spans\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"ended-span\");\n                \n                // Act\n                span.end();\n                \n                const scope = this._ai.setActiveSpan(span);\n                const activeSpan = this._ai.getActiveSpan();\n\n                // Assert\n                Assert.ok(scope !== null, \"Scope should be returned\");\n                Assert.equal(scope.span, span, \"Scope.span should equal the passed ended span\");\n                Assert.ok(activeSpan !== null, \"Should be able to set ended span as active\");\n                Assert.equal(activeSpan, span, \"ActiveSpan() should return the same ended span object\");\n                Assert.ok(activeSpan.ended, \"Active span should be marked as ended\");\n\n                // Cleanup is already done (span.end() called)\n            }\n        });\n    }\n\n    private addIntegrationTests(): void {\n        this.testCase({\n            name: \"Integration: getTraceCtx, activeSpan, and setActiveSpan should work together\",\n            test: () => {\n                // Arrange\n                const span1 = this._ai.startSpan(\"integration-span-1\");\n                const span2 = this._ai.startSpan(\"integration-span-2\");\n                \n                // Act & Assert - Set first span active\n                this._ai.setActiveSpan(span1);\n                \n                let activeSpan = this._ai.getActiveSpan();\n                let traceCtx = this._ai.getTraceCtx();\n                let span1Context = span1.spanContext();\n                \n                Assert.equal(activeSpan.name, span1.name, \"Active span should be span1\");\n                Assert.equal(traceCtx?.spanId, span1Context.spanId, \n                    \"Trace context should match span1\");\n\n                // Switch to second span\n                this._ai.setActiveSpan(span2);\n                \n                activeSpan = this._ai.getActiveSpan();\n                traceCtx = this._ai.getTraceCtx();\n                let span2Context = span2.spanContext();\n                \n                Assert.equal(activeSpan.name, span2.name, \"Active span should be span2\");\n                Assert.equal(traceCtx?.spanId, span2Context.spanId, \n                    \"Trace context should match span2\");\n\n                // Cleanup\n                span1?.end();\n                span2?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: parent-child span relationship via getTraceCtx\",\n            test: () => {\n                // Arrange & Act\n                const parentSpan = this._ai.startSpan(\"integration-parent\");\n                \n                this._ai.setActiveSpan(parentSpan);\n                const parentCtx = this._ai.getTraceCtx();\n                \n                // Create child span using parent context\n                const childSpan = this._ai.startSpan(\"integration-child\", undefined, parentCtx || undefined);\n                this._ai.setActiveSpan(childSpan);\n                \n                const childCtx = this._ai.getTraceCtx();\n                const activeSpan = this._ai.getActiveSpan();\n\n                // Assert\n                Assert.ok(parentCtx !== null && parentCtx !== undefined, \"Parent context should exist\");\n                Assert.ok(childCtx !== null && childCtx !== undefined, \"Child context should exist\");\n                \n                Assert.equal(childCtx.traceId, parentCtx.traceId, \"Child should inherit parent's traceId\");\n                Assert.notEqual(childCtx.spanId, parentCtx.spanId, \"Child should have different spanId\");\n                \n                Assert.equal(activeSpan.name, \"integration-child\", \"Active span should be the child span\");\n\n                // Cleanup\n                childSpan?.end();\n                \n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: multiple spans with trace context propagation\",\n            test: () => {\n                // Arrange\n                const rootSpan = this._ai.startSpan(\"root-span\");\n                \n                this._ai.setActiveSpan(rootSpan);\n                const rootCtx = this._ai.getTraceCtx();\n                \n                // Create first child\n                const child1Span = this._ai.startSpan(\"child-1\", undefined, rootCtx || undefined);\n                this._ai.setActiveSpan(child1Span);\n                const child1Ctx = this._ai.getTraceCtx();\n                \n                // Create second child (sibling to first child)\n                const child2Span = this._ai.startSpan(\"child-2\", undefined, rootCtx || undefined);\n                this._ai.setActiveSpan(child2Span);\n                const child2Ctx = this._ai.getTraceCtx();\n\n                // Assert - all should share the same traceId\n                Assert.equal(child1Ctx.traceId, rootCtx.traceId, \n                    \"Child 1 should share root traceId\");\n                Assert.equal(child2Ctx.traceId, rootCtx.traceId, \n                    \"Child 2 should share root traceId\");\n                \n                // But have different spanIds\n                Assert.notEqual(child1Ctx.spanId, rootCtx.spanId, \n                    \"Child 1 should have different spanId\");\n                Assert.notEqual(child2Ctx.spanId, rootCtx.spanId, \n                    \"Child 2 should have different spanId\");\n                Assert.notEqual(child1Ctx.spanId, child2Ctx.spanId, \n                    \"Siblings should have different spanIds\");\n\n                // Cleanup\n                child2Span?.end();\n                child1Span?.end();\n                \n                rootSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: trace provider availability check\",\n            test: () => {\n                // Act\n                const provider = this._ai.core.getTraceProvider();\n                Assert.equal(this._ai.getTraceProvider(), provider, \"Core and AI instance should return same trace provider\");\n\n                // Assert\n                Assert.ok(provider !== null && provider !== undefined, \"Trace provider should be available\");\n                \n                Assert.ok(isFunction(provider.createSpan), \"Provider should have createSpan method\");\n                Assert.ok(isFunction(this._ai.getActiveSpan), \"Provider should have activeSpan method\");\n                Assert.ok(isFunction(this._ai.setActiveSpan), \"Provider should have setActiveSpan method\");\n                Assert.ok(isFunction(provider.getProviderId), \"Provider should have getProviderId method\");\n                Assert.ok(isFunction(provider.isAvailable), \"Provider should have isAvailable method\");\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: trace provider isAvailable should reflect initialization state\",\n            test: () => {\n                // Act\n                const provider = this._ai.core.getTraceProvider();\n\n                // Assert\n                const isAvailable = provider.isAvailable();\n                Assert.ok(typeof isAvailable === 'boolean', \"isAvailable should return boolean\");\n                Assert.ok(isAvailable, \"Provider should be available after SDK initialization\");\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: trace provider should have identifiable providerId\",\n            test: () => {\n                // Act\n                const provider = this._ai.core.getTraceProvider();\n\n                // Assert\n                if (provider) {\n                    const providerId = provider.getProviderId();\n                    Assert.ok(providerId, \"Provider should have an ID\");\n                    Assert.ok(typeof providerId === 'string', \n                        \"Provider ID should be a string\");\n                    Assert.ok(providerId.length > 0, \n                        \"Provider ID should not be empty\");\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/TraceProvider.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { \n    IReadableSpan, IOTelSpanOptions, eOTelSpanKind, ITraceProvider, ITelemetryItem,\n    isFunction\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport class TraceProviderTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${TraceProviderTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"TraceProviderTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: TraceProviderTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize tests: ' + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addProviderAvailabilityTests();\n        this.addGetProviderIdTests();\n        this.addIsAvailableTests();\n        this.addCreateSpanTests();\n        this.addProviderIntegrationTests();\n    }\n\n    private addProviderAvailabilityTests(): void {\n        this.testCase({\n            name: \"TraceProvider: getTraceProvider should return provider instance\",\n            test: () => {\n                // Act\n                const provider = this._ai.core.getTraceProvider();\n\n                // Assert\n                Assert.ok(provider !== null && provider !== undefined, \n                    \"Should return a trace provider instance\");\n                Assert.ok(typeof provider === 'object', \n                    \"Provider should be an object\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceProvider: provider should have all required methods\",\n            test: () => {\n                // Act\n                const provider = this._ai.core.getTraceProvider();\n                Assert.equal(this._ai.getTraceProvider(), provider, \"Core and AI instance should return same trace provider\");\n\n                // Assert\n                Assert.ok(provider, \"Provider should exist\");\n                if (provider) {\n                    Assert.ok(isFunction(provider.createSpan), \"Should have createSpan method\");\n                    Assert.ok(isFunction(this._ai.getActiveSpan), \"Should have activeSpan method\");\n                    Assert.ok(isFunction(this._ai.setActiveSpan), \"Should have setActiveSpan method\");\n                    Assert.ok(isFunction(provider.getProviderId), \"Should have getProviderId method\");\n                    Assert.ok(isFunction(provider.isAvailable), \"Should have isAvailable method\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"TraceProvider: provider should be available after SDK initialization\",\n            test: () => {\n                // Act\n                const provider = this._ai.core.getTraceProvider();\n\n                // Assert\n                Assert.ok(provider !== null, \"Provider should not be null\");\n                Assert.ok(provider !== undefined, \"Provider should not be undefined\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceProvider: multiple calls to getTraceProvider should return same provider\",\n            test: () => {\n                // Act\n                const provider1 = this._ai.core.getTraceProvider();\n                const provider2 = this._ai.core.getTraceProvider();\n                const provider3 = this._ai.core.getTraceProvider();\n\n                // Assert\n                Assert.ok(provider1 === provider2, \n                    \"First and second calls should return same provider\");\n                Assert.ok(provider2 === provider3, \n                    \"Second and third calls should return same provider\");\n            }\n        });\n    }\n\n    private addGetProviderIdTests(): void {\n        this.testCase({\n            name: \"getProviderId: should return a string identifier\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const providerId = provider?.getProviderId();\n\n                // Assert\n                Assert.ok(providerId !== null && providerId !== undefined, \n                    \"Provider ID should not be null or undefined\");\n                Assert.ok(typeof providerId === 'string', \n                    \"Provider ID should be a string\");\n            }\n        });\n\n        this.testCase({\n            name: \"getProviderId: should return non-empty string\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const providerId = provider?.getProviderId();\n\n                // Assert\n                if (providerId) {\n                    Assert.ok(providerId.length > 0, \n                        \"Provider ID should not be empty\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"getProviderId: should return consistent ID across multiple calls\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const providerId1 = provider?.getProviderId();\n                const providerId2 = provider?.getProviderId();\n                const providerId3 = provider?.getProviderId();\n\n                // Assert\n                Assert.equal(providerId1, providerId2, \n                    \"Provider ID should be consistent across calls\");\n                Assert.equal(providerId2, providerId3, \n                    \"Provider ID should be consistent across calls\");\n            }\n        });\n\n        this.testCase({\n            name: \"getProviderId: should return identifiable name\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const providerId = provider?.getProviderId();\n\n                // Assert\n                Assert.ok(providerId, \"Provider ID should exist\");\n                if (providerId) {\n                    // Provider ID should be a meaningful identifier, not just random characters\n                    Assert.ok(providerId.length > 2, \n                        \"Provider ID should be more than 2 characters\");\n                }\n            }\n        });\n    }\n\n    private addIsAvailableTests(): void {\n        this.testCase({\n            name: \"isAvailable: should return boolean value\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const isAvailable = provider?.isAvailable();\n\n                // Assert\n                Assert.ok(typeof isAvailable === 'boolean', \n                    \"isAvailable should return a boolean\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAvailable: should return true after SDK initialization\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const isAvailable = provider?.isAvailable();\n\n                // Assert\n                Assert.ok(isAvailable === true, \n                    \"Provider should be available after SDK initialization\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAvailable: should be consistent across multiple calls\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const isAvailable1 = provider?.isAvailable();\n                const isAvailable2 = provider?.isAvailable();\n                const isAvailable3 = provider?.isAvailable();\n\n                // Assert\n                Assert.equal(isAvailable1, isAvailable2, \n                    \"Availability should be consistent\");\n                Assert.equal(isAvailable2, isAvailable3, \n                    \"Availability should be consistent\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAvailable: available provider should allow span creation\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n                const isAvailable = provider?.isAvailable();\n\n                // Act\n                let canCreateSpan = false;\n                if (provider && isAvailable) {\n                    const span = provider.createSpan(\"availability-test-span\");\n                    canCreateSpan = span !== null && span !== undefined;\n                    span?.end();\n                }\n\n                // Assert\n                Assert.ok(isAvailable, \"Provider should be available\");\n                Assert.ok(canCreateSpan, \n                    \"Available provider should allow span creation\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAvailable: should reflect provider initialization state\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // After full SDK initialization, provider should be available\n                Assert.ok(provider !== null, \"Provider should not be null\");\n\n                // Act\n                const isAvailable = provider?.isAvailable();\n\n                Assert.ok(isAvailable !== undefined, \"isAvailable should not be undefined\");\n\n                // Assert\n                    \n                Assert.ok(isFunction(provider.createSpan), \"Available provider should have createSpan\");\n                Assert.ok(isFunction(provider.getProviderId), \"Available provider should have getProviderId\");\n                Assert.ok(isFunction(provider.isAvailable), \"Available provider should have isAvailable\");\n                Assert.ok(isFunction(this._ai.getActiveSpan), \"Available provider should have activeSpan\");\n                Assert.ok(isFunction(this._ai.setActiveSpan), \"Available provider should have setActiveSpan\");\n                Assert.ok(isFunction(this._ai.core.getActiveSpan), \"Available core should have activeSpan\");\n                Assert.ok(isFunction(this._ai.core.setActiveSpan), \"Available core should have setActiveSpan\");\n            }\n        });\n    }\n\n    private addCreateSpanTests(): void {\n        this.testCase({\n            name: \"Provider createSpan: should create valid span\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n                const spanName = \"provider-create-span-test\";\n\n                // Act\n                let span: IReadableSpan | null = null;\n                if (provider) {\n                    span = provider.createSpan(spanName);\n                }\n\n                // Assert\n                Assert.ok(span !== null && span !== undefined, \n                    \"Provider should create a span\");\n                if (span) {\n                    Assert.equal(span.name, spanName, \"Span name should match\");\n                    Assert.ok(typeof span.isRecording === 'function', \n                        \"Span should have isRecording method\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Provider createSpan: should create span with options\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n                const spanName = \"provider-span-with-options\";\n                const options: IOTelSpanOptions = {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: {\n                        \"test.attribute\": \"value\"\n                    }\n                };\n\n                // Act\n                let span: IReadableSpan | null = null;\n                if (provider) {\n                    span = provider.createSpan(spanName, options);\n                }\n\n                // Assert\n                Assert.ok(span !== null, \"Provider should create span with options\");\n                if (span) {\n                    Assert.equal(span.kind, eOTelSpanKind.CLIENT, \n                        \"Span kind should match options\");\n                    Assert.ok(span.attributes[\"test.attribute\"] === \"value\", \n                        \"Span attributes should be set\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Provider createSpan: should create span with parent context\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n                let parentSpan: IReadableSpan | null = null;\n                let childSpan: IReadableSpan | null = null;\n\n                if (provider) {\n                    parentSpan = provider.createSpan(\"parent-span\");\n                    const parentCtx = parentSpan.spanContext();\n\n                    // Act\n                    childSpan = provider.createSpan(\"child-span\", undefined, parentCtx);\n\n                    // Assert\n                    Assert.ok(childSpan !== null, \"Child span should be created\");\n                    if (childSpan && parentSpan) {\n                        const childCtx = childSpan.spanContext();\n                        Assert.equal(childCtx.traceId, parentCtx.traceId, \n                            \"Child should inherit parent traceId\");\n                        Assert.notEqual(childCtx.spanId, parentCtx.spanId, \n                            \"Child should have different spanId\");\n                    }\n                }\n\n                // Cleanup\n                childSpan?.end();\n                parentSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Provider createSpan: should create multiple independent spans\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                let span1: IReadableSpan | null = null;\n                let span2: IReadableSpan | null = null;\n                let span3: IReadableSpan | null = null;\n\n                if (provider) {\n                    span1 = provider.createSpan(\"span-1\");\n                    span2 = provider.createSpan(\"span-2\");\n                    span3 = provider.createSpan(\"span-3\");\n                }\n\n                // Assert\n                Assert.ok(span1 !== null, \"First span should be created\");\n                Assert.ok(span2 !== null, \"Second span should be created\");\n                Assert.ok(span3 !== null, \"Third span should be created\");\n\n                if (span1 && span2 && span3) {\n                    const ctx1 = span1.spanContext();\n                    const ctx2 = span2.spanContext();\n                    const ctx3 = span3.spanContext();\n\n                    Assert.notEqual(ctx1.spanId, ctx2.spanId, \n                        \"Spans should have different spanIds\");\n                    Assert.notEqual(ctx2.spanId, ctx3.spanId, \n                        \"Spans should have different spanIds\");\n                    Assert.notEqual(ctx1.spanId, ctx3.spanId, \n                        \"Spans should have different spanIds\");\n                }\n\n                // Cleanup\n                span1?.end();\n                span2?.end();\n                span3?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Provider createSpan: should create recording spans by default\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                let span: IReadableSpan | null = null;\n                if (provider) {\n                    span = provider.createSpan(\"recording-test\");\n                }\n\n                // Assert\n                Assert.ok(span !== null, \"Span should be created\");\n                if (span) {\n                    Assert.ok(span.isRecording(), \n                        \"Span should be recording by default\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Provider createSpan: should respect recording option when false\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n                const options: IOTelSpanOptions = {\n                    recording: false\n                };\n\n                // Act\n                let span: IReadableSpan | null = null;\n                if (provider) {\n                    span = provider.createSpan(\"non-recording-test\", options);\n                }\n\n                // Assert\n                Assert.ok(span !== null, \"Span should be created\");\n                if (span) {\n                    Assert.ok(!span.isRecording(), \n                        \"Span should not be recording when options.recording is false\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n    }\n\n    private addProviderIntegrationTests(): void {\n        this.testCase({\n            name: \"Integration: provider operations should work with SDK instance\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act - Create span via provider\n                let providerSpan: IReadableSpan | null = null;\n                if (provider) {\n                    providerSpan = provider.createSpan(\"provider-integration-span\");\n                }\n\n                // Create span via SDK\n                const sdkSpan = this._ai.startSpan(\"sdk-integration-span\");\n\n                // Assert\n                Assert.ok(providerSpan !== null, \n                    \"Provider should create span successfully\");\n                Assert.ok(sdkSpan !== null, \n                    \"SDK should create span successfully\");\n\n                if (providerSpan && sdkSpan) {\n                    // Both spans should have valid contexts\n                    const providerCtx = providerSpan.spanContext();\n                    const sdkCtx = sdkSpan.spanContext();\n\n                    Assert.ok(providerCtx.traceId, \"Provider span should have traceId\");\n                    Assert.ok(providerCtx.spanId, \"Provider span should have spanId\");\n                    Assert.ok(sdkCtx.traceId, \"SDK span should have traceId\");\n                    Assert.ok(sdkCtx.spanId, \"SDK span should have spanId\");\n                }\n\n                // Cleanup\n                providerSpan?.end();\n                sdkSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: provider activeSpan and setActiveSpan work together\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                let span: IReadableSpan | null = null;\n                if (provider) {\n                    span = provider.createSpan(\"active-integration-span\");\n                    this._ai.setActiveSpan(span);\n                    const activeSpan = this._ai.getActiveSpan();\n\n                    // Assert\n                    Assert.ok(activeSpan !== null, \"Active span should be retrievable\");\n                    Assert.equal(activeSpan.name, span.name, \n                        \"Active span should match the set span\");\n                    Assert.equal(activeSpan, this._ai.core.getActiveSpan(), \"Active span from core should match active span from SDK\");\n                }\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: provider availability affects span creation\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const isAvailable = provider?.isAvailable();\n                let canCreateSpan = false;\n\n                if (provider) {\n                    try {\n                        const span = provider.createSpan(\"availability-integration-test\");\n                        canCreateSpan = span !== null;\n                        span?.end();\n                    } catch (e) {\n                        canCreateSpan = false;\n                    }\n                }\n\n                // Assert\n                if (isAvailable) {\n                    Assert.ok(canCreateSpan, \n                        \"Available provider should successfully create spans\");\n                } else {\n                    // If provider is not available, we should handle it gracefully\n                    Assert.ok(!canCreateSpan || canCreateSpan, \n                        \"Provider availability state should be consistent with span creation\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: provider ID is consistent with trace operations\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                const providerId = provider?.getProviderId();\n                let span: IReadableSpan | null = null;\n                \n                if (provider) {\n                    span = provider.createSpan(\"provider-id-integration\");\n                }\n\n                // Assert\n                Assert.ok(providerId, \"Provider should have an ID\");\n                Assert.ok(span !== null, \n                    \"Provider with ID should be able to create spans\");\n\n                // Cleanup\n                span?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: provider methods are callable without errors\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act & Assert - All methods should be callable\n                Assert.ok(provider !== null, \"Provider should exist\");\n\n                if (provider) {\n                    // Test getProviderId\n                    Assert.doesNotThrow(() => {\n                        const id = provider.getProviderId();\n                        Assert.ok(typeof id === 'string', \"getProviderId should return string\");\n                    }, \"getProviderId should not throw\");\n\n                    // Test isAvailable\n                    Assert.doesNotThrow(() => {\n                        const available = provider.isAvailable();\n                        Assert.ok(typeof available === 'boolean', \n                            \"isAvailable should return boolean\");\n                    }, \"isAvailable should not throw\");\n\n                    // Test createSpan\n                    Assert.doesNotThrow(() => {\n                        const span = provider.createSpan(\"error-test-span\");\n                        Assert.ok(span !== null, \"createSpan should return span\");\n                        span?.end();\n                    }, \"createSpan should not throw\");\n\n                    // Test activeSpan\n                    Assert.doesNotThrow(() => {\n                        const active = this._ai.getActiveSpan();\n                        // Can be null, that's ok\n                        Assert.ok(active === null || typeof active === 'object', \n                            \"activeSpan should return null or span object\");\n                    }, \"activeSpan should not throw\");\n\n                    const span = provider.createSpan(\"set-active-error-test\");\n\n                    // Test setActiveSpan\n                    Assert.doesNotThrow(() => {\n                        this._ai.setActiveSpan(span);\n                        span?.end();\n                    }, \"setActiveSpan should not throw\");\n\n                    // Test setActiveSpan\n                    Assert.doesNotThrow(() => {\n                        this._ai.setActiveSpan(span);\n                    }, \"setActiveSpan should not throw when the span has already ended\");\n\n                    // Test setActiveSpan\n                    Assert.doesNotThrow(() => {\n                        span?.end();\n                    }, \"ending an already ended span should not throw\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: provider supports root span creation\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n\n                // Act\n                let rootSpan: IReadableSpan | null = null;\n                if (provider) {\n                    rootSpan = provider.createSpan(\"root-span\", { root: true });\n                }\n\n                // Assert\n                Assert.ok(rootSpan !== null, \"Root span should be created\");\n                if (rootSpan) {\n                    const ctx = rootSpan.spanContext();\n                    Assert.ok(ctx.traceId, \"Root span should have traceId\");\n                    Assert.ok(ctx.spanId, \"Root span should have spanId\");\n                }\n\n                // Cleanup\n                rootSpan?.end();\n            }\n        });\n\n        this.testCase({\n            name: \"Integration: provider supports different span kinds\",\n            test: () => {\n                // Arrange\n                const provider = this._ai.core.getTraceProvider();\n                const spanKinds = [\n                    eOTelSpanKind.INTERNAL,\n                    eOTelSpanKind.SERVER,\n                    eOTelSpanKind.CLIENT,\n                    eOTelSpanKind.PRODUCER,\n                    eOTelSpanKind.CONSUMER\n                ];\n\n                // Act & Assert\n                if (provider) {\n                    spanKinds.forEach(kind => {\n                        const span = provider.createSpan(`span-kind-${kind}`, { kind });\n                        Assert.ok(span !== null, `Span with kind ${kind} should be created`);\n                        Assert.equal(span?.kind, kind, \n                            `Span should have kind ${kind}`);\n                        span?.end();\n                    });\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/TraceSuppression.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/applicationinsights-web\";\nimport { eOTelSpanKind, ITelemetryItem, suppressTracing, unsuppressTracing, isTracingSuppressed } from \"@microsoft/applicationinsights-core-js\";\n\n\nfunction _createAndInitializeSDK(connectionString: string): ApplicationInsights {\n    let newInst = new ApplicationInsights({\n        config: {\n            connectionString: connectionString,\n            disableAjaxTracking: false,\n            disableXhr: false,\n            maxBatchInterval: 0,\n            disableExceptionTracking: false\n        }\n    });\n\n    // Initialize the SDK\n    newInst.loadAppInsights();\n\n    return newInst\n}\n\nexport class TraceSuppressionTests extends AITestClass {\n    private static readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private static readonly _connectionString = `InstrumentationKey=${TraceSuppressionTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    \n    // Track calls to track for validation\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"TraceSuppressionTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n            this._ai = _createAndInitializeSDK(TraceSuppressionTests._connectionString);\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n\n        } catch (e) {\n            console.error(\"Failed to initialize TraceSuppressionTests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addTests();\n    }\n\n    private addTests(): void {\n\n        this.testCase({\n            name: \"TraceSuppression: new SDK instance should have tracing enabled by default and state should not leak between instances\",\n            test: () => {\n                // Step 1: Verify first instance has tracing enabled by default\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Instance 1: Tracing should NOT be suppressed in new instance\");\n                Assert.ok(!isTracingSuppressed(this._ai.core.config), \"Instance 1: Tracing should NOT be suppressed on config\");\n                Assert.ok(!isTracingSuppressed(this._ai.otelApi), \"Instance 1: Tracing should NOT be suppressed on otelApi\");\n                \n                // Verify that spans can record by default\n                const span1 = this._ai.startSpan(\"default-span\");\n                Assert.ok(span1, \"Instance 1: Span should be created\");\n                Assert.ok(span1!.isRecording(), \"Instance 1: Span should be recording by default\");\n                span1!.end();\n                Assert.equal(this._trackCalls.length, 1, \"Instance 1: Telemetry should be tracked by default\");\n\n                // Step 2: Suppress tracing on this instance\n                suppressTracing(this._ai.core);\n                Assert.ok(isTracingSuppressed(this._ai.core), \"Instance 1: Tracing should be suppressed after suppressTracing()\");\n                \n                // Verify suppression works - span still reports isRecording()=true but doesn't send telemetry\n                const span2 = this._ai.startSpan(\"suppressed-span\");\n                Assert.ok(!span2!.isRecording(), \"Instance 2: Span reports isRecording()=false when suppressed\");\n                span2!.end();\n                Assert.equal(this._trackCalls.length, 1, \"Instance 1: No additional telemetry when suppressed\");\n\n                // Step 3: Clean up first instance and create a new instance\n                this._ai.unload(false);\n                \n                this._ai = _createAndInitializeSDK(TraceSuppressionTests._connectionString);\n                // Hook core.track to capture calls\n                const originalTrack = this._ai.core.track;\n                this._ai.core.track = (item: ITelemetryItem) => {\n                    this._trackCalls.push(item);\n                    return originalTrack.call(this._ai.core, item);\n                };\n\n                // Step 4: Verify new instance has tracing enabled by default (not inheriting suppressed state)\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Instance 2: Tracing should NOT be suppressed in new instance\");\n                Assert.ok(!isTracingSuppressed(this._ai.core.config), \"Instance 2: Tracing should NOT be suppressed on config\");\n                Assert.ok(!isTracingSuppressed(this._ai.otelApi), \"Instance 2: Tracing should NOT be suppressed on otelApi\");\n                \n                // Verify that spans can record in the new instance\n                const span3 = this._ai.startSpan(\"new-instance-span\");\n                Assert.ok(span3, \"Instance 2: Span should be created\");\n                Assert.ok(span3!.isRecording(), \"Instance 2: Span should be recording by default (state should not leak)\");\n                span3!.end();\n                Assert.equal(this._trackCalls.length, 2, \"Instance 2: Telemetry should be tracked in new instance\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppressTracing should be available as exported function\",\n            test: () => {\n                // Verify that suppressTracing functions are available as imports\n                Assert.ok(typeof suppressTracing === \"function\", \"suppressTracing should be available as exported function\");\n                Assert.ok(typeof unsuppressTracing === \"function\", \"unsuppressTracing should be available as exported function\");\n                Assert.ok(typeof isTracingSuppressed === \"function\", \"isTracingSuppressed should be available as exported function\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppressTracing on core should prevent span recording\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Tracing should not be suppressed initially\");\n\n                // Act - suppress tracing\n                suppressTracing(this._ai.core);\n                Assert.ok(isTracingSuppressed(this._ai.core), \"Tracing should be suppressed after calling suppressTracing\");\n\n                // Create span while tracing is suppressed\n                const span = this._ai.startSpan(\"suppressed-span\", {\n                    kind: eOTelSpanKind.INTERNAL,\n                    attributes: {\n                        \"test.suppressed\": true\n                    }\n                });\n\n                // Assert\n                Assert.ok(span, \"Span should still be created\");\n                Assert.ok(!span!.isRecording(), \"Span reports isRecording()=false\");\n                \n                // End the span - should not generate telemetry\n                span!.end();\n                \n                Assert.equal(this._trackCalls.length, 0, \"No telemetry should be tracked when tracing is suppressed\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: unsuppressTracing should restore span recording\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                suppressTracing(this._ai.core);\n                Assert.ok(isTracingSuppressed(this._ai.core), \"Tracing should be suppressed\");\n\n                // Create span while suppressed - still reports isRecording()=true but won't send telemetry\n                const suppressedSpan = this._ai.startSpan(\"suppressed-span\");\n                Assert.ok(!suppressedSpan!.isRecording(), \"Span reports isRecording()=false even when suppressed\");\n                suppressedSpan!.end();\n\n                // Act - unsuppress tracing\n                unsuppressTracing(this._ai.core);\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Tracing should not be suppressed after unsuppressTracing\");\n\n                // Create new span after unsuppressing\n                const recordingSpan = this._ai.startSpan(\"recording-span\", {\n                    attributes: {\n                        \"test.recording\": true\n                    }\n                });\n\n                // Assert\n                Assert.ok(recordingSpan, \"Span should be created\");\n                Assert.ok(recordingSpan!.isRecording(), \"Span should be recording after unsuppressing\");\n                \n                // End the span - should generate telemetry\n                recordingSpan!.end();\n                \n                Assert.equal(this._trackCalls.length, 1, \"Telemetry should be tracked after unsuppressing\");\n                Assert.equal(this._trackCalls[0].baseData?.name, \"recording-span\", \"Tracked span should have correct name\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppressTracing on config should prevent span recording\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Suppress via config object\n                suppressTracing(this._ai.core.config);\n                Assert.ok(isTracingSuppressed(this._ai.core.config), \"Tracing should be suppressed on config\");\n                Assert.ok(isTracingSuppressed(this._ai.core), \"Tracing should be suppressed on core\");\n\n                // Act - create span\n                const span = this._ai.startSpan(\"config-suppressed-span\");\n\n                // Assert\n                Assert.ok(span, \"Span should be created\");\n                Assert.ok(!span!.isRecording(), \"Span reports isRecording()=false\");\n                span!.end();\n                \n                Assert.equal(this._trackCalls.length, 0, \"No telemetry when suppressed via config\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: multiple startSpan calls while suppressed should all create non-recording spans\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                suppressTracing(this._ai.core);\n\n                // Act - create multiple spans\n                const span1 = this._ai.startSpan(\"span-1\");\n                const span2 = this._ai.startSpan(\"span-2\", { kind: eOTelSpanKind.CLIENT });\n                const span3 = this._ai.startSpan(\"span-3\", { kind: eOTelSpanKind.SERVER });\n\n                // Assert - spans still report isRecording()=true, suppression only affects telemetry output\n                Assert.ok(!span1!.isRecording(), \"Span 1 reports isRecording()=false\");\n                Assert.ok(!span2!.isRecording(), \"Span 2 reports isRecording()=false\");\n                Assert.ok(!span3!.isRecording(), \"Span 3 reports isRecording()=false\");\n\n                // All spans should still be valid and support operations\n                span1!.setAttribute(\"test\", \"value1\");\n                span2!.setStatus({ code: 0 });\n                span3!.updateName(\"updated-span-3\");\n\n                span1!.end();\n                span2!.end();\n                span3!.end();\n\n                Assert.equal(this._trackCalls.length, 0, \"No telemetry should be generated for any suppressed span\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: parent-child span hierarchy with suppression\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                suppressTracing(this._ai.core);\n\n                // Act - create parent and child spans while suppressed\n                const parentSpan = this._ai.startSpan(\"parent-span\", {\n                    kind: eOTelSpanKind.SERVER\n                });\n                Assert.ok(!parentSpan!.isRecording(), \"Parent span reports isRecording()=false\");\n\n                const childSpan = this._ai.startSpan(\"child-span\", {\n                    kind: eOTelSpanKind.INTERNAL\n                });\n                Assert.ok(!childSpan!.isRecording(), \"Child span reports isRecording()=false\");\n\n                // Verify parent-child relationship still established\n                const childContext = childSpan!.spanContext();\n                const parentContext = parentSpan!.spanContext();\n                Assert.equal(childContext.traceId, parentContext.traceId, \"Child should share traceId with parent\");\n                Assert.notEqual(childContext.spanId, parentContext.spanId, \"Child should have different spanId\");\n\n                childSpan!.end();\n                parentSpan!.end();\n\n                Assert.equal(this._trackCalls.length, 0, \"No telemetry for suppressed hierarchy\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: toggle suppression during span lifecycle\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n\n                // Create recording span\n                const span1 = this._ai.startSpan(\"recording-span\");\n                Assert.ok(span1!.isRecording(), \"Span should be recording initially\");\n\n                // Suppress tracing mid-lifecycle\n                suppressTracing(this._ai.core);\n\n                // Create new span while suppressed\n                const span2 = this._ai.startSpan(\"suppressed-span\");\n                Assert.ok(!span2!.isRecording(), \"Span reports isRecording()=false when suppressed\");\n\n                // End both spans\n                span1!.end(); // Was recording but tracing has been suppressed before it ends\n                span2!.end(); // Was not recording\n\n                // Verify telemetry\n                Assert.equal(this._trackCalls.length, 0, \"Only the recording span should generate telemetry\");\n\n                // Unsuppress and create another span\n                unsuppressTracing(this._ai.core);\n                const span3 = this._ai.startSpan(\"restored-span\");\n                Assert.ok(span3!.isRecording(), \"New span should be recording after unsuppressing\");\n                span3!.end();\n\n                Assert.equal(this._trackCalls.length, 1, \"Restored span should generate telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: toggle suppression during span lifecycle\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n\n                // Create recording span\n                const span1 = this._ai.startSpan(\"recording-span\");\n                Assert.ok(span1!.isRecording(), \"Span should be recording initially\");\n\n                // Suppress tracing mid-lifecycle\n                suppressTracing(this._ai.core);\n\n                // Create new span while suppressed\n                const span2 = this._ai.startSpan(\"suppressed-span\");\n                Assert.ok(!span2!.isRecording(), \"Span reports isRecording()=false when suppressed\");\n\n                // Unsuppress and create another span\n                unsuppressTracing(this._ai.core);\n\n                // End both spans\n                span1!.end(); // Was recording\n                span2!.end(); // Was not recording as tracing was suppressed when created\n\n                // Verify telemetry\n                Assert.equal(this._trackCalls.length, 1, \"Only the recording span should generate telemetry\");\n                Assert.equal(this._trackCalls[0].baseData?.name, \"recording-span\", \"Recording span telemetry\");\n\n                const span3 = this._ai.startSpan(\"restored-span\");\n                Assert.ok(span3!.isRecording(), \"New span should be recording after unsuppressing\");\n                span3!.end();\n\n                Assert.equal(this._trackCalls.length, 2, \"Restored span should generate telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppressTracing should affect all span kinds\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                suppressTracing(this._ai.core);\n\n                // Act - create spans of all kinds\n                const internalSpan = this._ai.startSpan(\"internal\", { kind: eOTelSpanKind.INTERNAL });\n                const clientSpan = this._ai.startSpan(\"client\", { kind: eOTelSpanKind.CLIENT });\n                const serverSpan = this._ai.startSpan(\"server\", { kind: eOTelSpanKind.SERVER });\n                const producerSpan = this._ai.startSpan(\"producer\", { kind: eOTelSpanKind.PRODUCER });\n                const consumerSpan = this._ai.startSpan(\"consumer\", { kind: eOTelSpanKind.CONSUMER });\n\n                // Assert - all spans still report isRecording()=true, suppression only prevents telemetry output\n                Assert.ok(!internalSpan!.isRecording(), \"INTERNAL span reports isRecording()=false\");\n                Assert.ok(!clientSpan!.isRecording(), \"CLIENT span reports isRecording()=false\");\n                Assert.ok(!serverSpan!.isRecording(), \"SERVER span reports isRecording()=false\");\n                Assert.ok(!producerSpan!.isRecording(), \"PRODUCER span reports isRecording()=false\");\n                Assert.ok(!consumerSpan!.isRecording(), \"CONSUMER span reports isRecording()=false\");\n\n                // End all spans\n                internalSpan!.end();\n                clientSpan!.end();\n                serverSpan!.end();\n                producerSpan!.end();\n                consumerSpan!.end();\n\n                Assert.equal(this._trackCalls.length, 0, \"No telemetry for any span kind when suppressed\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: span operations should still work when tracing is suppressed\",\n            test: () => {\n                // Arrange\n                suppressTracing(this._ai.core);\n                const span = this._ai.startSpan(\"suppressed-span\");\n                Assert.ok(!span!.isRecording(), \"Span reports isRecording()=false\");\n\n                // Act - perform various span operations\n                span!.setAttribute(\"string-attr\", \"value\");\n                span!.setAttribute(\"number-attr\", 42);\n                span!.setAttribute(\"boolean-attr\", true);\n                \n                span!.setAttributes({\n                    \"batch-1\": \"test1\",\n                    \"batch-2\": 123\n                });\n\n                span!.setStatus({\n                    code: 0,\n                    message: \"Test status\"\n                });\n\n                span!.updateName(\"updated-name\");\n\n                span!.recordException(new Error(\"Test exception\"));\n\n                // Assert - operations should not throw\n                Assert.ok(true, \"All operations completed without throwing\");\n                \n                // Verify span properties\n                Assert.equal(span!.name, \"updated-name\", \"Name should be updated\");\n                Assert.ok(!span!.ended, \"Span should not be ended yet\");\n                \n                span!.end();\n                Assert.ok(span!.ended, \"Span should be ended\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: isTracingSuppressed should return false when not suppressed\",\n            test: () => {\n                // Ensure no suppression\n                unsuppressTracing(this._ai.core);\n\n                // Assert\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Should return false when not suppressed\");\n                Assert.ok(!isTracingSuppressed(this._ai.core.config), \"Config should also not be suppressed\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppressTracing should return the same context\",\n            test: () => {\n                // Act\n                const returnedCore = suppressTracing(this._ai.core);\n                const returnedConfig = suppressTracing(this._ai.core.config);\n\n                // Assert\n                Assert.equal(returnedCore, this._ai.core, \"suppressTracing should return the same core instance\");\n                Assert.equal(returnedConfig, this._ai.core.config, \"suppressTracing should return the same config instance\");\n                Assert.ok(isTracingSuppressed(returnedCore), \"Returned core should have suppression enabled\");\n                Assert.ok(isTracingSuppressed(returnedConfig), \"Returned config should have suppression enabled\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: unsuppressTracing should return the same context\",\n            test: () => {\n                // Arrange\n                suppressTracing(this._ai.core);\n\n                // Act\n                const returnedCore = unsuppressTracing(this._ai.core);\n                const returnedConfig = unsuppressTracing(this._ai.core.config);\n\n                // Assert\n                Assert.equal(returnedCore, this._ai.core, \"unsuppressTracing should return the same core instance\");\n                Assert.equal(returnedConfig, this._ai.core.config, \"unsuppressTracing should return the same config instance\");\n                Assert.ok(!isTracingSuppressed(returnedCore), \"Returned core should have suppression disabled\");\n                Assert.ok(!isTracingSuppressed(returnedConfig), \"Returned config should have suppression disabled\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppression state should persist across multiple checks\",\n            test: () => {\n                // Initial state\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Initially not suppressed\");\n\n                // Suppress\n                suppressTracing(this._ai.core);\n                Assert.ok(isTracingSuppressed(this._ai.core), \"Should be suppressed - check 1\");\n                Assert.ok(isTracingSuppressed(this._ai.core), \"Should be suppressed - check 2\");\n                Assert.ok(isTracingSuppressed(this._ai.core), \"Should be suppressed - check 3\");\n\n                // Unsuppress\n                unsuppressTracing(this._ai.core);\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Should not be suppressed - check 1\");\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Should not be suppressed - check 2\");\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Should not be suppressed - check 3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: span attributes should be preserved when tracing is suppressed\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                suppressTracing(this._ai.core);\n\n                // Act - create span with attributes\n                const span = this._ai.startSpan(\"suppressed-with-attrs\", {\n                    attributes: {\n                        \"initial.attr1\": \"value1\",\n                        \"initial.attr2\": 100\n                    }\n                });\n\n                Assert.ok(!span!.isRecording(), \"Span reports isRecording()=false\");\n\n                // Add more attributes\n                span!.setAttribute(\"runtime.attr\", \"added-later\");\n\n                // Assert - attributes should still be accessible\n                const attributes = (span as any).attributes || {};\n                Assert.ok(attributes[\"initial.attr1\"] === undefined || attributes[\"runtime.attr\"] === undefined,\n                    \"Attributes should not be stored as span was not recording\");\n\n                span!.end();\n                Assert.equal(this._trackCalls.length, 0, \"No telemetry should be generated\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: span context should be valid when tracing is suppressed\",\n            test: () => {\n                // Arrange\n                suppressTracing(this._ai.core);\n\n                // Act\n                const span = this._ai.startSpan(\"suppressed-context-test\");\n                Assert.ok(!span!.isRecording(), \"Span reports isRecording()=false\");\n\n                // Assert - span context should be valid\n                const spanContext = span!.spanContext();\n                Assert.ok(spanContext, \"Span context should exist\");\n                Assert.ok(spanContext.traceId, \"Trace ID should exist\");\n                Assert.ok(spanContext.spanId, \"Span ID should exist\");\n                Assert.equal(spanContext.traceId.length, 32, \"Trace ID should be 32 hex characters\");\n                Assert.equal(spanContext.spanId.length, 16, \"Span ID should be 16 hex characters\");\n\n                span!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: rapid suppression toggling should work correctly\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n\n                // Act - rapidly toggle suppression\n                for (let i = 0; i < 5; i++) {\n                    suppressTracing(this._ai.core);\n                    Assert.ok(isTracingSuppressed(this._ai.core), `Should be suppressed on iteration ${i}`);\n                    \n                    unsuppressTracing(this._ai.core);\n                    Assert.ok(!isTracingSuppressed(this._ai.core), `Should not be suppressed on iteration ${i}`);\n                }\n\n                // Final state check\n                Assert.ok(!isTracingSuppressed(this._ai.core), \"Should end in unsuppressed state\");\n\n                // Create a recording span\n                const span = this._ai.startSpan(\"final-span\");\n                Assert.ok(span!.isRecording(), \"Span should be recording after toggles\");\n                span!.end();\n\n                Assert.equal(this._trackCalls.length, 1, \"Telemetry should be tracked\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppression should work with explicit parent context\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Create a recording parent span first\n                const parentSpan = this._ai.startSpan(\"parent-recording\");\n                Assert.ok(parentSpan!.isRecording(), \"Parent should be recording\");\n                const parentContext = this._ai.getTraceCtx();\n\n                // Suppress tracing\n                suppressTracing(this._ai.core);\n\n                // Act - create child with explicit parent while suppressed\n                const childSpan = this._ai.startSpan(\"child-suppressed\", {\n                    kind: eOTelSpanKind.INTERNAL\n                }, parentContext);\n\n                // Assert\n                Assert.ok(!childSpan!.isRecording(), \"Child span reports isRecording()=false when suppressed\");\n                \n                const childContext = childSpan!.spanContext();\n                Assert.equal(childContext.traceId, parentContext!.traceId, \"Child should have same traceId as parent\");\n\n                unsuppressTracing(this._ai.core);\n\n                childSpan!.end();\n                parentSpan!.end();\n\n                // Only parent should generate telemetry\n                Assert.equal(this._trackCalls.length, 1, \"Only parent span should generate telemetry\");\n                Assert.equal(this._trackCalls[0].baseData?.name, \"parent-recording\", \"Parent span telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppression should work even with  parent context\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                \n                // Create a recording parent span first\n                const parentSpan = this._ai.startSpan(\"parent-recording\");\n                Assert.ok(parentSpan!.isRecording(), \"Parent should be recording\");\n                const parentContext = this._ai.getTraceCtx();\n\n                // Suppress tracing\n                suppressTracing(this._ai.core);\n\n                // Act - create child with explicit parent while suppressed\n                const childSpan = this._ai.startSpan(\"child-suppressed\", {\n                    kind: eOTelSpanKind.INTERNAL\n                }, parentContext);\n\n                // Assert\n                Assert.ok(!childSpan!.isRecording(), \"Child span reports isRecording()=false when suppressed\");\n                \n                const childContext = childSpan!.spanContext();\n                Assert.equal(childContext.traceId, parentContext!.traceId, \"Child should have same traceId as parent\");\n\n                childSpan!.end();\n                parentSpan!.end();\n\n                // Only parent should generate telemetry\n                Assert.equal(this._trackCalls.length, 0, \"Parent span should not generate telemetry either as suppression is active\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: isTracingSuppressed should handle null/undefined gracefully\",\n            test: () => {\n                // Act & Assert - should not throw\n                let result1: boolean;\n                let result2: boolean;\n                \n                try {\n                    result1 = isTracingSuppressed(null as any);\n                    result2 = isTracingSuppressed(undefined as any);\n                    Assert.ok(true, \"isTracingSuppressed should handle null/undefined without throwing\");\n                    Assert.ok(!result1, \"Should return false for null\");\n                    Assert.ok(!result2, \"Should return false for undefined\");\n                } catch (e) {\n                    Assert.ok(false, \"isTracingSuppressed should not throw for null/undefined\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppressTracing with startSpan integration test\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n\n                // Test 1: Normal recording\n                const span1 = this._ai.startSpan(\"normal-1\");\n                Assert.ok(span1!.isRecording(), \"Span 1 should be recording\");\n                span1!.end();\n                Assert.equal(this._trackCalls.length, 1, \"Should have 1 telemetry item\");\n\n                // Test 2: Suppress and verify spans still report isRecording()=true but don't send telemetry\n                suppressTracing(this._ai.core);\n                const span2 = this._ai.startSpan(\"suppressed-1\");\n                const span3 = this._ai.startSpan(\"suppressed-2\");\n                Assert.ok(!span2!.isRecording(), \"Span 2 reports isRecording()=false when suppressed\");\n                Assert.ok(!span3!.isRecording(), \"Span 3 reports isRecording()=false when suppressed\");\n                span2!.end();\n                span3!.end();\n                Assert.equal(this._trackCalls.length, 1, \"Should still have only 1 telemetry item\");\n\n                // Test 3: Unsuppress and verify startSpan creates recording spans again\n                unsuppressTracing(this._ai.core);\n                const span4 = this._ai.startSpan(\"normal-2\");\n                Assert.ok(span4!.isRecording(), \"Span 4 should be recording\");\n                span4!.end();\n                Assert.equal(this._trackCalls.length, 2, \"Should have 2 telemetry items\");\n\n                // Verify telemetry content\n                Assert.equal(this._trackCalls[0].baseData?.name, \"normal-1\", \"First telemetry is from span1\");\n                Assert.equal(this._trackCalls[1].baseData?.name, \"normal-2\", \"Second telemetry is from span4\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceSuppression: suppression with nested spans\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                suppressTracing(this._ai.core);\n\n                // Create and set active span manually\n                const span1 = this._ai.startSpan(\"outer-span\");\n                Assert.ok(!span1!.isRecording(), \"Outer span reports isRecording()=false\");\n                \n                // Simulate nested operation\n                const span2 = this._ai.startSpan(\"inner-span\");\n                Assert.ok(!span2!.isRecording(), \"Inner span reports isRecording()=false\");\n                span2!.end();\n                span1!.end();\n\n                Assert.equal(this._trackCalls.length, 0, \"No telemetry for suppressed nested spans\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/UseSpan.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/applicationinsights-web\";\nimport {\n    IAppInsightsCore, IReadableSpan, eOTelSpanKind, eOTelSpanStatusCode, useSpan, ITelemetryItem, ISpanScope, ITraceHost\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport class UseSpanTests extends AITestClass {\n    private static readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private static readonly _connectionString = `InstrumentationKey=${UseSpanTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    \n    // Track calls to track for validation\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"UseSpanTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: UseSpanTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            // Initialize the SDK\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error(\"Failed to initialize UseSpan tests: \" + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addTests();\n    }\n\n    private addTests(): void {\n\n        this.testCase({\n            name: \"UseSpan: useSpan should be available as exported function\",\n            test: () => {\n                // Verify that useSpan is available as an import\n                Assert.ok(typeof useSpan === \"function\", \"useSpan should be available as exported function\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should execute function within span context\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-context-test\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"test.type\": \"context-execution\"\n                    }\n                });\n                \n                Assert.ok(testSpan, \"Test span should be created\");\n                Assert.ok(this._ai.core, \"Core should be available\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                let capturedHost: ITraceHost | null = null;\n                const testFunction = function(this: ISpanScope) {\n                    capturedActiveSpan = this.host.getActiveSpan();\n                    capturedHost = this.host;\n                    return \"context-success\";\n                };\n\n                // Act\n                const result = useSpan(this._ai.core!, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"context-success\", \"Function should execute and return result\");\n                Assert.ok(capturedActiveSpan, \"Function should have access to active span\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Active span should be the provided test span\");\n                Assert.equal(capturedHost, this._ai.core, \"Active host should be the core instance (passed to useSpan)\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should work with telemetry tracking inside span context\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const testSpan = this._ai.startSpan(\"useSpan-telemetry-test\", {\n                    attributes: {\n                        \"operation.name\": \"telemetry-tracking\"\n                    }\n                });\n                \n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const telemetryFunction = () => {\n                    // Track some telemetry within the span context\n                    this._ai.trackEvent({\n                        name: \"operation-event\",\n                        properties: {\n                            \"event.source\": \"useSpan-context\"\n                        }\n                    });\n                    \n                    this._ai.trackMetric({\n                        name: \"operation.duration\",\n                        average: 123.45\n                    });\n                    \n                    return \"telemetry-tracked\";\n                };\n\n                // Act\n                const result = useSpan(this._ai.core!, testSpan!, telemetryFunction);\n\n                // Assert\n                Assert.equal(result, \"telemetry-tracked\", \"Function should complete successfully\");\n                \n                // End the span to trigger trace generation\n                testSpan!.end();\n                \n                // Verify track was called for the span\n                Assert.equal(this._trackCalls.length, 3, \"Should have one track call from span ending\");\n                const item = this._trackCalls[2];\n                Assert.ok(item.baseData && item.baseData.properties, \"Item should have properties\");\n                Assert.equal(\"useSpan-telemetry-test\", item.baseData.name, \"Should include span name in properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should handle complex function arguments and return values\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-arguments-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const complexFunction = (\n                    _scope: ISpanScope,\n                    stringArg: string,\n                    numberArg: number,\n                    objectArg: { key: string; value: number },\n                    arrayArg: string[]\n                ) => {\n                    return {\n                        processedString: stringArg!.toUpperCase(),\n                        doubledNumber: numberArg! * 2,\n                        extractedValue: objectArg!.value,\n                        joinedArray: arrayArg!.join(\"-\"),\n                        timestamp: Date.now()\n                    };\n                };\n\n                const inputObject = { key: \"test-key\", value: 42 };\n                const inputArray = [\"item1\", \"item2\", \"item3\"];\n\n                // Act\n                const result = useSpan(\n                    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                    this._ai.core!,\n                    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n                    testSpan!,\n                    complexFunction,\n                    undefined,\n                    \"hello world\",\n                    10,\n                    inputObject,\n                    inputArray\n                );\n\n                // Assert\n                Assert.equal(result.processedString, \"HELLO WORLD\", \"String should be processed correctly\");\n                Assert.equal(result.doubledNumber, 20, \"Number should be doubled correctly\");\n                Assert.equal(result.extractedValue, 42, \"Object value should be extracted correctly\");\n                Assert.equal(result.joinedArray, \"item1-item2-item3\", \"Array should be joined correctly\");\n                Assert.ok(result.timestamp > 0, \"Timestamp should be generated\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should handle function with this context binding\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-this-binding-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                class TestService {\n                    private _serviceId: string;\n                    private _multiplier: number;\n                    \n                    constructor(id: string, multiplier: number) {\n                        this._serviceId = id;\n                        this._multiplier = multiplier;\n                    }\n                    \n                    public processValue(_scope: ISpanScope, input: number): { serviceId: string; result: number; multiplied: number } {\n                        return {\n                            serviceId: this._serviceId,\n                            result: input + 100,\n                            multiplied: input * this._multiplier\n                        };\n                    }\n                }\n                \n                const service = new TestService(\"test-service-123\", 3);\n\n                // Act\n                const result = useSpan(\n                    this._ai.core!,\n                    testSpan!,\n                    service.processValue,\n                    service,\n                    25\n                );\n\n                // Assert\n                Assert.equal(result.serviceId, \"test-service-123\", \"Service ID should be preserved via this binding\");\n                Assert.equal(result.result, 125, \"Input should be processed correctly\");\n                Assert.equal(result.multiplied, 75, \"Multiplication should use instance property\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should maintain span context across async-like operations\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-async-like-test\", {\n                    attributes: {\n                        \"operation.type\": \"async-simulation\"\n                    }\n                });\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let spanDuringCallback: IReadableSpan | null = null;\n                let callbackExecuted = false;\n                \n                const asyncLikeFunction = (scope: ISpanScope, callback: (data: string) => void) => {\n                    // Simulate async work that completes synchronously in test\n                    let currentSpan = scope.span;\n                    \n                    // Simulate callback execution (would normally be async)\n                    setTimeout(() => {\n                        spanDuringCallback = this._ai.core!.getActiveSpan();\n                        callback(\"async-data\");\n                        callbackExecuted = true;\n                    }, 0);\n                    \n                    return currentSpan ? (currentSpan as IReadableSpan).name : \"no-span\";\n                };\n\n                // Act\n                let callbackData = \"\";\n                const callback = (data: string) => {\n                    callbackData = data;\n                };\n                \n                const result = useSpan(this._ai.core!, testSpan!, asyncLikeFunction, undefined, callback);\n\n                // Assert\n                Assert.equal(result, \"useSpan-async-like-test\", \"Function should have access to span name\");\n                \n                // Note: In a real async scenario, the span context wouldn't automatically\n                // propagate to the setTimeout callback without additional context management\n                // This test validates the synchronous behavior of useSpan\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should handle exceptions and preserve span operations\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-exception-test\", {\n                    attributes: {\n                        \"test.expects\": \"exception\"\n                    }\n                });\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const exceptionFunction = () => {\n                    // Perform some span operations before throwing\n                    const activeSpan = this._ai.core!.getActiveSpan();\n                    Assert.ok(activeSpan, \"Should have active span before exception\");\n                    \n                    activeSpan!.setAttribute(\"operation.status\", \"error\");\n                    activeSpan!.setStatus({\n                        code: eOTelSpanStatusCode.ERROR,\n                        message: \"Operation failed with test exception\"\n                    });\n                    \n                    throw new Error(\"Test exception for useSpan handling\");\n                };\n\n                // Act & Assert\n                let caughtException: Error | null = null;\n                try {\n                    useSpan(this._ai.core!, testSpan!, exceptionFunction);\n                } catch (error) {\n                    caughtException = error as Error;\n                }\n\n                Assert.ok(caughtException, \"Exception should be thrown and caught\");\n                Assert.equal(caughtException!.message, \"Test exception for useSpan handling\", \"Exception message should be preserved\");\n                \n                // Verify span is still valid and operations were applied\n                Assert.ok(testSpan!.isRecording(), \"Span should still be recording after exception\");\n                const readableSpan = testSpan! as IReadableSpan;\n                Assert.ok(!readableSpan.ended, \"Span should not be ended by useSpan after exception\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should work with nested span operations and child spans\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const parentSpan = this._ai.startSpan(\"parent-operation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"operation.name\": \"parent-process\"\n                    }\n                });\n                Assert.ok(parentSpan, \"Parent span should be created\");\n                \n                const nestedOperations = () => {\n                    // Verify we have the parent span as active\n                    const currentActive = this._ai.core!.getActiveSpan();\n                    Assert.equal(currentActive, parentSpan, \"Parent span should be active\");\n                    \n                    // Create child operations within the parent span context\n                    const childSpan1 = this._ai.startSpan(\"child-operation-1\", {\n                        attributes: { \"child.order\": 1 }\n                    });\n                    childSpan1!.setAttribute(\"child.status\", \"completed\");\n                    childSpan1!.end();\n                    \n                    const childSpan2 = this._ai.startSpan(\"child-operation-2\", {\n                        attributes: { \"child.order\": 2 }\n                    });\n                    childSpan2!.setAttribute(\"child.status\", \"completed\");\n                    childSpan2!.end();\n                    \n                    return \"nested-operations-completed\";\n                };\n\n                // Act\n                const result = useSpan(this._ai.core!, parentSpan!, nestedOperations);\n\n                // Assert\n                Assert.equal(result, \"nested-operations-completed\", \"Nested operations should complete successfully\");\n                \n                // End parent span to generate telemetry\n                parentSpan!.end();\n                \n                // Should have 3 telemetry items: parent + 2 children\n                Assert.equal(this._trackCalls.length, 3, \"Should have telemetry for parent and child spans\");\n                \n                // Verify span names in properties\n                const spanNames = this._trackCalls.map(item => item.baseData?.name).filter(n => n);\n                Assert.ok(spanNames.some(name => name === \"parent-operation\"), \"Should have parent span telemetry\");\n                Assert.ok(spanNames.some(name => name === \"child-operation-1\"), \"Should have child-1 span telemetry\");\n                Assert.ok(spanNames.some(name => name === \"child-operation-2\"), \"Should have child-2 span telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should support different return value types\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-return-types-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n\n                // Test various return types\n                const stringResult = useSpan(this._ai.core!, testSpan!, () => \"string-result\");\n                const numberResult = useSpan(this._ai.core!, testSpan!, () => 42.5);\n                const booleanResult = useSpan(this._ai.core!, testSpan!, () => true);\n                const arrayResult = useSpan(this._ai.core!, testSpan!, () => [1, 2, 3]);\n                const objectResult = useSpan(this._ai.core!, testSpan!, () => ({ key: \"value\", nested: { prop: 123 } }));\n                const nullResult = useSpan(this._ai.core!, testSpan!, () => null);\n                const undefinedResult = useSpan(this._ai.core!, testSpan!, () => undefined);\n\n                // Assert\n                Assert.equal(stringResult, \"string-result\", \"String return should work\");\n                Assert.equal(numberResult, 42.5, \"Number return should work\");\n                Assert.equal(booleanResult, true, \"Boolean return should work\");\n                Assert.equal(arrayResult.length, 3, \"Array return should work\");\n                Assert.equal(arrayResult[1], 2, \"Array elements should be preserved\");\n                Assert.equal(objectResult.key, \"value\", \"Object properties should be preserved\");\n                Assert.equal(objectResult.nested.prop, 123, \"Nested object properties should be preserved\");\n                Assert.equal(nullResult, null, \"Null return should work\");\n                Assert.equal(undefinedResult, undefined, \"Undefined return should work\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should handle rapid successive calls efficiently\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-performance-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const iterations = 100;\n                let totalResult = 0;\n                \n                // Simple computation function\n                const computeFunction = (_scope: ISpanScope, input: number) => {\n                    return input * 2 + 1;\n                };\n\n                const startTime = Date.now();\n\n                // Act - Multiple rapid useSpan calls\n                for (let i = 0; i < iterations; i++) {\n                    const result = useSpan(this._ai.core!, testSpan!, computeFunction, undefined, i);\n                    totalResult += result;\n                }\n\n                const endTime = Date.now();\n                const duration = endTime - startTime;\n\n                // Assert\n                const expectedTotal = Array.from({length: iterations}, (_, i) => i * 2 + 1).reduce((sum, val) => sum + val, 0);\n                Assert.equal(totalResult, expectedTotal, \"All computations should be correct\");\n                \n                // Performance assertion - should complete reasonably quickly\n                Assert.ok(duration < 1000, `Performance test should complete quickly: ${duration}ms for ${iterations} iterations`);\n                \n                // Verify span is still valid after many operations\n                Assert.ok(testSpan!.isRecording(), \"Span should still be recording after multiple useSpan calls\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should integrate with AI telemetry correlation\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const operationSpan = this._ai.startSpan(\"user-operation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"user.id\": \"user-123\",\n                        \"operation.type\": \"data-processing\"\n                    }\n                });\n                Assert.ok(operationSpan, \"Operation span should be created\");\n                \n                const businessLogicFunction = (_scope: ISpanScope, userId: string, dataType: string) => {\n                    // Track multiple telemetry items within span context\n                    this._ai.trackEvent({\n                        name: \"data-processing-started\",\n                        properties: {\n                            \"user.id\": userId,\n                            \"data.type\": dataType,\n                            \"processing.stage\": \"initialization\"\n                        }\n                    });\n                    \n                    // Simulate some processing steps\n                    for (let step = 1; step <= 3; step++) {\n                        this._ai.trackMetric({\n                            name: \"processing.step.duration\",\n                            average: step * 10.5,\n                            properties: {\n                                \"step.number\": step.toString()\n                            }\n                        });\n                    }\n                    \n                    this._ai.trackEvent({\n                        name: \"data-processing-completed\",\n                        properties: {\n                            \"user.id\": userId,\n                            \"data.type\": dataType,\n                            \"processing.stage\": \"completion\",\n                            \"steps.completed\": \"3\"\n                        }\n                    });\n                    \n                    return {\n                        userId: userId,\n                        dataType: dataType,\n                        stepsCompleted: 3,\n                        status: \"success\"\n                    };\n                };\n\n                // Act\n                const result = useSpan(\n                    this._ai.core!,\n                    operationSpan!,\n                    businessLogicFunction,\n                    undefined,\n                    \"user-123\",\n                    \"customer-data\"\n                );\n\n                // End the span to generate trace\n                operationSpan!.end();\n\n                // Assert\n                Assert.equal(result.userId, \"user-123\", \"User ID should be processed correctly\");\n                Assert.equal(result.dataType, \"customer-data\", \"Data type should be processed correctly\");\n                Assert.equal(result.stepsCompleted, 3, \"All processing steps should be completed\");\n                Assert.equal(result.status, \"success\", \"Operation should complete successfully\");\n                \n                // Verify span telemetry was generated\n                Assert.equal(this._trackCalls.length, 6, \"Should have one track call from span ending\");\n                const spanItem = this._trackCalls[5];\n                Assert.ok(spanItem.baseData && spanItem.baseData.properties, \"Item should have properties\");\n                Assert.equal(\"user-operation\", spanItem.baseData.name, \"Should include span name\");\n                \n                // Verify span attributes are included in properties\n                Assert.equal(spanItem.baseData.properties[\"user.id\"], \"user-123\", \"Span attributes should be included in telemetry\");\n                Assert.equal(spanItem.baseData.properties[\"operation.type\"], \"data-processing\", \"All span attributes should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should handle empty or no-op functions gracefully\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"useSpan-noop-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                // Test empty function\n                const emptyFunction = () => {};\n                \n                // Test function that just returns without doing anything\n                const noOpFunction = () => {\n                    return;\n                };\n                \n                // Test function that returns undefined explicitly\n                const undefinedFunction = () => {\n                    return undefined;\n                };\n\n                // Act\n                const emptyResult = useSpan(this._ai.core!, testSpan!, emptyFunction);\n                const noOpResult = useSpan(this._ai.core!, testSpan!, noOpFunction);\n                const undefinedResult = useSpan(this._ai.core!, testSpan!, undefinedFunction);\n\n                // Assert\n                Assert.equal(emptyResult, undefined, \"Empty function should return undefined\");\n                Assert.equal(noOpResult, undefined, \"No-op function should return undefined\");\n                Assert.equal(undefinedResult, undefined, \"Undefined function should return undefined\");\n                \n                // Verify span is still valid\n                Assert.ok(testSpan!.isRecording(), \"Span should still be recording after no-op functions\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should use ISpanScope as 'this' when no thisArg provided\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"usespan-test\", {\n                    attributes: { \"test.id\": \"useSpan-this-test\" }\n                });\n                \n                let capturedThis: any = null;\n                let capturedScopeParam: any = null;\n\n                // Act - call useSpan without thisArg (function receives scope as parameter)\n                const result = useSpan(this._ai.core, span!, function(this: ISpanScope, scope: ISpanScope, arg1: string) {\n                    capturedThis = this;\n                    capturedScopeParam = scope;\n                    \n                    // Verify 'this' is ISpanScope\n                    Assert.ok(this.host, \"'this.core' should exist\");\n                    Assert.ok(this.span, \"'this.span' should exist\");\n                    \n                    // Verify scope parameter is also ISpanScope\n                    Assert.ok(scope.host, \"scope.host should exist\");\n                    Assert.ok(scope.span, \"scope.span should exist\");\n                    \n                    return `${arg1}-${scope.span.name}`;\n                }, undefined, \"result\");\n\n                // Assert\n                Assert.equal(result, \"result-usespan-test\", \"Function should execute and return result\");\n                Assert.ok(capturedThis, \"'this' should be defined\");\n                Assert.ok(capturedThis.host, \"'this.host' should exist\");\n                Assert.ok(capturedThis.span, \"'this.span' should exist\");\n                Assert.equal(capturedThis.host, this._ai.core, \"'this.host' should be the AI core\");\n                Assert.equal(capturedThis.span, span, \"'this.span' should be the passed span\");\n                \n                Assert.ok(capturedScopeParam, \"scope parameter should be defined\");\n                Assert.equal(capturedScopeParam.host, this._ai.core, \"scope.host should be the AI core\");\n                Assert.equal(capturedScopeParam.span, span, \"scope.span should be the passed span\");\n                \n                // Both 'this' and scope param should be the same ISpanScope instance\n                Assert.equal(capturedThis, capturedScopeParam, \"'this' and scope param should be the same ISpanScope instance\");\n\n                span!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: should use provided thisArg when specified\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"usespan-thisarg-test\");\n                \n                class ServiceClass {\n                    public serviceId: string = \"service-456\";\n                    public getData(prefix: string): string {\n                        return `${prefix}-${this.serviceId}`;\n                    }\n                }\n                \n                const service = new ServiceClass();\n                let capturedThis: any = null;\n                let capturedScopeParam: any = null;\n\n                // Act - call useSpan with explicit thisArg\n                const result = useSpan(this._ai.core, span!, function(this: ServiceClass, scope: ISpanScope) {\n                    capturedThis = this;\n                    capturedScopeParam = scope;\n                    \n                    // 'this' should be the service instance\n                    Assert.equal(this.serviceId, \"service-456\", \"'this.serviceId' should match\");\n                    Assert.ok(typeof this.getData === \"function\", \"'this.getData' should be a function\");\n                    \n                    // scope parameter should still be ISpanScope\n                    Assert.ok(scope.host, \"scope.host should exist\");\n                    Assert.ok(scope.span, \"scope.span should exist\");\n                    \n                    return this.getData(\"custom\");\n                }, service);\n\n                // Assert\n                Assert.equal(result, \"custom-service-456\", \"Function should execute with custom this context\");\n                Assert.ok(capturedThis, \"'this' should be defined\");\n                Assert.equal(capturedThis, service, \"'this' should be the service instance\");\n                Assert.equal(capturedThis.serviceId, \"service-456\", \"'this.serviceId' should match\");\n                Assert.ok(!capturedThis.host, \"Custom this should not have host property\");\n                Assert.ok(!capturedThis.span, \"Custom this should not have span property\");\n                \n                Assert.ok(capturedScopeParam, \"scope parameter should be defined\");\n                Assert.ok(capturedScopeParam.host, \"scope.host should exist even with custom this\");\n                Assert.ok(capturedScopeParam.span, \"scope.span should exist even with custom this\");\n\n                span!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: scope parameter should provide access to core and span operations\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const span = this._ai.startSpan(\"scope-operations-test\");\n                \n                // Act - use scope parameter to perform operations\n                useSpan(this._ai.core, span!, (scope: ISpanScope) => {\n                    // Use scope.span to set attributes\n                    scope.span.setAttribute(\"operation.name\", \"data-processing\");\n                    scope.span.setAttribute(\"operation.step\", 1);\n                    \n                    // Use scope.span to set status\n                    scope.span.setStatus({\n                        code: 0,\n                        message: \"Operation successful\"\n                    });\n                    \n                    // Use scope.span to get context\n                    const spanContext = scope.span.spanContext();\n                    Assert.ok(spanContext.traceId, \"Should access span context via scope\");\n                    Assert.ok(spanContext.spanId, \"Should access span ID via scope\");\n                    \n                    // Verify span name\n                    Assert.equal(scope.span.name, \"scope-operations-test\", \"Span name should be accessible\");\n                });\n\n                // Assert\n                Assert.ok(span, \"Span should exist\");\n                Assert.equal(span!.name, \"scope-operations-test\", \"Span name should match\");\n                \n                span!.end();\n                \n                Assert.equal(this._trackCalls.length, 1, \"Should generate telemetry\");\n                Assert.ok(this._trackCalls[0].baseData?.properties, \"Should have properties\");\n                Assert.equal(this._trackCalls[0].baseData.properties[\"operation.name\"], \"data-processing\", \"Attributes should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: 'this' binding with nested useSpan calls\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"nested-calls-test\");\n                \n                const outerContext = {\n                    contextName: \"outer\",\n                    value: 100\n                };\n\n                let outerThisCapture: any = null;\n                let innerThisCapture: any = null;\n                let ai = this._ai;\n\n                // Act - nested useSpan calls with different thisArg\n                useSpan(this._ai.core, span!, function(this: typeof outerContext, outerScope: ISpanScope) {\n                    outerThisCapture = this;\n                    Assert.equal(this.contextName, \"outer\", \"Outer 'this' should be outer context\");\n                    Assert.equal(this.value, 100, \"Outer 'this.value' should match\");\n                    \n                    const innerSpan = ai.startSpan(\"inner-nested-span\");\n                    \n                    useSpan(ai.core, innerSpan!, function(this: ISpanScope, innerScope: ISpanScope) {\n                        innerThisCapture = this;\n                        // Inner call without explicit thisArg - should be ISpanScope\n                        Assert.ok(this.host, \"Inner 'this' should be ISpanScope\");\n                        Assert.ok(this.span, \"Inner 'this.span' should exist\");\n                        Assert.equal(this.span.name, \"inner-nested-span\", \"Inner span name should match\");\n                    });\n                    \n                    innerSpan!.end();\n                }, outerContext);\n\n                // Assert\n                Assert.ok(outerThisCapture, \"Outer 'this' should be captured\");\n                Assert.equal(outerThisCapture.contextName, \"outer\", \"Outer context should be preserved\");\n                \n                Assert.ok(innerThisCapture, \"Inner 'this' should be captured\");\n                Assert.ok(innerThisCapture.host, \"Inner 'this' should have host\");\n                Assert.ok(innerThisCapture.span, \"Inner 'this' should have span\");\n\n                span!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: verify scope.restore() is called to restore previous active span\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-span\");\n                const innerSpan = this._ai.startSpan(\"inner-span\");\n                \n                let activeSpanBeforeUseSpan: any = null;\n                let activeSpanInsideUseSpan: any = null;\n                let activeSpanAfterUseSpan: any = null;\n\n                // Act\n                activeSpanBeforeUseSpan = this._ai.core.getActiveSpan ? this._ai.core.getActiveSpan() : null;\n                \n                useSpan(this._ai.core, innerSpan!, (scope: ISpanScope) => {\n                    activeSpanInsideUseSpan = this._ai.core.getActiveSpan ? this._ai.core.getActiveSpan() : null;\n                    Assert.equal(activeSpanInsideUseSpan, innerSpan, \"Active span inside useSpan should be inner span\");\n                });\n                \n                activeSpanAfterUseSpan = this._ai.core.getActiveSpan ? this._ai.core.getActiveSpan() : null;\n\n                // Assert\n                // Active span should be restored after useSpan completes\n                Assert.equal(activeSpanAfterUseSpan, activeSpanBeforeUseSpan, \n                    \"Active span should be restored after useSpan completes\");\n\n                innerSpan!.end();\n                outerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: trace context should match active span context inside useSpan\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"trace-context-match-test\", {\n                    attributes: {\n                        \"test.type\": \"trace-context-validation\"\n                    }\n                });\n                Assert.ok(testSpan, \"Test span should be created\");\n\n                let traceCtxInsideUseSpan: any = null;\n                let spanContextInsideUseSpan: any = null;\n                let activeSpanInsideUseSpan: any = null;\n\n                // Act\n                useSpan(this._ai.core, testSpan!, (scope: ISpanScope) => {\n                    // Get trace context from core\n                    traceCtxInsideUseSpan = this._ai.core.getTraceCtx(false);\n                    \n                    // Get span context from the span\n                    spanContextInsideUseSpan = scope.span.spanContext();\n                    \n                    // Get active span\n                    activeSpanInsideUseSpan = this._ai.core.getActiveSpan ? this._ai.core.getActiveSpan() : null;\n                });\n\n                // Assert\n                Assert.ok(traceCtxInsideUseSpan, \"Trace context should exist inside useSpan\");\n                Assert.ok(spanContextInsideUseSpan, \"Span context should exist\");\n                Assert.ok(activeSpanInsideUseSpan, \"Active span should be set\");\n                \n                // Verify active span matches the useSpan span\n                Assert.equal(activeSpanInsideUseSpan, testSpan, \"Active span should be the useSpan span\");\n                \n                // Verify trace context matches span context\n                Assert.equal(traceCtxInsideUseSpan.traceId, spanContextInsideUseSpan.traceId,\n                    \"Trace context traceId should match span context traceId\");\n                Assert.equal(traceCtxInsideUseSpan.spanId, spanContextInsideUseSpan.spanId,\n                    \"Trace context spanId should match span context spanId\");\n                Assert.equal(traceCtxInsideUseSpan.traceFlags, spanContextInsideUseSpan.traceFlags,\n                    \"Trace context traceFlags should match span context traceFlags\");\n\n                testSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: trace context updates when switching between nested useSpan calls\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-trace-span\");\n                const innerSpan = this._ai.startSpan(\"inner-trace-span\");\n                \n                let outerTraceCtx: any = null;\n                let outerSpanCtx: any = null;\n                let innerTraceCtx: any = null;\n                let innerSpanCtx: any = null;\n\n                // Act\n                useSpan(this._ai.core, outerSpan!, (outerScope: ISpanScope) => {\n                    outerTraceCtx = this._ai.core.getTraceCtx(false);\n                    outerSpanCtx = outerScope.span.spanContext();\n                    \n                    // Verify outer trace context matches outer span\n                    Assert.equal(outerTraceCtx.spanId, outerSpanCtx.spanId,\n                        \"Outer trace context should match outer span\");\n                    \n                    // Nested useSpan with different span\n                    useSpan(this._ai.core, innerSpan!, (innerScope: ISpanScope) => {\n                        innerTraceCtx = this._ai.core.getTraceCtx(false);\n                        innerSpanCtx = innerScope.span.spanContext();\n                        \n                        // Verify inner trace context matches inner span\n                        Assert.equal(innerTraceCtx.spanId, innerSpanCtx.spanId,\n                            \"Inner trace context should match inner span\");\n                        \n                        // Verify inner context is different from outer\n                        Assert.notEqual(innerTraceCtx.spanId, outerTraceCtx.spanId,\n                            \"Inner and outer trace contexts should have different spanIds\");\n                    });\n                    \n                    // After inner useSpan, verify we're back to outer context\n                    const restoredTraceCtx = this._ai.core.getTraceCtx(false);\n                    Assert.equal(restoredTraceCtx.spanId, outerSpanCtx.spanId,\n                        \"Trace context should be restored to outer span after inner useSpan completes\");\n                });\n\n                outerSpan!.end();\n                innerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: child spans created inside useSpan inherit correct parent context\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-for-child-test\");\n                \n                let childSpanContext: any = null;\n                let parentSpanContext: any = null;\n\n                // Act\n                useSpan(this._ai.core, parentSpan!, (scope: ISpanScope) => {\n                    parentSpanContext = scope.span.spanContext();\n                    \n                    // Create a child span while parent is active\n                    const childSpan = this._ai.startSpan(\"child-span-in-useSpan\");\n                    childSpanContext = childSpan!.spanContext();\n                    \n                    // Verify trace context matches parent\n                    const traceCtx = this._ai.core.getTraceCtx(false);\n                    Assert.equal(traceCtx.spanId, parentSpanContext.spanId,\n                        \"Trace context should match parent span inside useSpan\");\n                    \n                    childSpan!.end();\n                });\n\n                // Assert\n                Assert.ok(childSpanContext, \"Child span context should exist\");\n                Assert.ok(parentSpanContext, \"Parent span context should exist\");\n                \n                // Child should have same traceId as parent but different spanId\n                Assert.equal(childSpanContext.traceId, parentSpanContext.traceId,\n                    \"Child span should have same traceId as parent\");\n                Assert.notEqual(childSpanContext.spanId, parentSpanContext.spanId,\n                    \"Child span should have different spanId from parent\");\n\n                parentSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: trace context is restored after useSpan completes\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"temporary-trace-span\");\n                \n                let traceCtxBefore: any = null;\n                let traceCtxInside: any = null;\n                let traceCtxAfter: any = null;\n\n                // Act\n                traceCtxBefore = this._ai.core.getTraceCtx(false);\n                \n                useSpan(this._ai.core, testSpan!, () => {\n                    traceCtxInside = this._ai.core.getTraceCtx(false);\n                });\n                \n                traceCtxAfter = this._ai.core.getTraceCtx(false);\n\n                // Assert\n                Assert.ok(traceCtxBefore, \"Trace context should exist before useSpan (created by startSpan)\");\n                Assert.ok(traceCtxInside, \"Trace context should exist inside useSpan\");\n                Assert.equal(traceCtxInside.spanId, testSpan!.spanContext().spanId,\n                    \"Trace context inside useSpan should match the test span\");\n                Assert.ok(traceCtxAfter, \"Trace context should exist after useSpan\");\n                Assert.equal(traceCtxAfter.spanId, traceCtxBefore.spanId,\n                    \"Trace context should be restored to previous state after useSpan\");\n\n                testSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: trace context reflects parent span when useSpan is nested in another active span\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-active-span\");\n                const provider = this._ai.core.getTraceProvider();\n                \n                this._ai.setActiveSpan(outerSpan!);\n                \n                const innerSpan = this._ai.startSpan(\"inner-usespan-span\");\n                \n                let outerSpanCtx: any = null;\n                let traceCtxBeforeUseSpan: any = null;\n                let traceCtxInsideUseSpan: any = null;\n                let traceCtxAfterUseSpan: any = null;\n\n                // Act\n                outerSpanCtx = outerSpan!.spanContext();\n                traceCtxBeforeUseSpan = this._ai.core.getTraceCtx(false);\n                \n                // Verify initial trace context matches outer span\n                Assert.equal(traceCtxBeforeUseSpan.spanId, outerSpanCtx.spanId,\n                    \"Trace context should initially match outer span\");\n                \n                useSpan(this._ai.core, innerSpan!, (scope: ISpanScope) => {\n                    traceCtxInsideUseSpan = this._ai.core.getTraceCtx(false);\n                    const innerSpanCtx = scope.span.spanContext();\n                    \n                    // Inside useSpan, trace context should match inner span\n                    Assert.equal(traceCtxInsideUseSpan.spanId, innerSpanCtx.spanId,\n                        \"Trace context inside useSpan should match inner span\");\n                });\n                \n                traceCtxAfterUseSpan = this._ai.core.getTraceCtx(false);\n                \n                // After useSpan, trace context should be restored to outer span\n                Assert.equal(traceCtxAfterUseSpan.spanId, outerSpanCtx.spanId,\n                    \"Trace context should be restored to outer span after useSpan\");\n\n                innerSpan!.end();\n                outerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: trace context traceState is accessible inside useSpan\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"tracestate-test-span\");\n                \n                let traceStateInside: any = null;\n\n                // Act\n                useSpan(this._ai.core, testSpan!, () => {\n                    const traceCtx = this._ai.core.getTraceCtx(false);\n                    traceStateInside = traceCtx ? traceCtx.traceState : null;\n                });\n\n                // Assert\n                Assert.ok(traceStateInside !== undefined,\n                    \"Trace state should be accessible inside useSpan\");\n\n                testSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: span created inside useSpan has parent context matching outer trace context\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-parent-span\");\n                \n                this._ai.setActiveSpan(outerSpan!);\n                \n                let outerTraceCtx: any = null;\n                let innerSpanParentCtx: any = null;\n                let innerSpanCreated: any = null;\n\n                // Act\n                outerTraceCtx = this._ai.core.getTraceCtx(false);\n                \n                useSpan(this._ai.core, outerSpan!, (scope: ISpanScope) => {\n                    // Create a new span inside useSpan\n                    innerSpanCreated = this._ai.startSpan(\"inner-child-span\");\n                    \n                    // Get the parent context of the newly created span\n                    if (innerSpanCreated) {\n                        innerSpanParentCtx = innerSpanCreated.parentSpanContext;\n                    }\n                    \n                    innerSpanCreated!.end();\n                });\n\n                // Assert\n                Assert.ok(outerTraceCtx, \"Outer trace context should exist\");\n                Assert.ok(innerSpanParentCtx, \"Inner span should have parent context\");\n                \n                // Verify parent context matches outer trace context\n                Assert.equal(innerSpanParentCtx.traceId, outerTraceCtx.traceId,\n                    \"Inner span parent traceId should match outer trace context traceId\");\n                Assert.equal(innerSpanParentCtx.spanId, outerTraceCtx.spanId,\n                    \"Inner span parent spanId should match outer trace context spanId\");\n\n                outerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: span parent context matches trace context when useSpan wraps different span\",\n            test: () => {\n                // Arrange - Create initial trace context\n                const contextSpan = this._ai.startSpan(\"context-span\");\n                \n                this._ai.setActiveSpan(contextSpan!);\n                \n                const contextTraceCtx = this._ai.core.getTraceCtx(false);\n                \n                // Create a different span to use in useSpan\n                const wrapperSpan = this._ai.startSpan(\"wrapper-span\");\n                \n                let spanCreatedInCallback: any = null;\n                let spanParentCtx: any = null;\n\n                // Act - useSpan with a different span than what's in trace context\n                useSpan(this._ai.core, wrapperSpan!, (scope: ISpanScope) => {\n                    // The active span is now wrapperSpan\n                    // Create a child span - it should have wrapperSpan as parent\n                    spanCreatedInCallback = this._ai.startSpan(\"child-of-wrapper\");\n                    \n                    if (spanCreatedInCallback) {\n                        spanParentCtx = spanCreatedInCallback.parentSpanContext;\n                    }\n                    \n                    spanCreatedInCallback!.end();\n                });\n\n                // Assert\n                Assert.ok(spanParentCtx, \"Child span should have parent context\");\n                \n                // Parent should be wrapperSpan (the useSpan span), not contextSpan\n                const wrapperSpanCtx = wrapperSpan!.spanContext();\n                Assert.equal(spanParentCtx.spanId, wrapperSpanCtx.spanId,\n                    \"Child span parent should be the wrapper span from useSpan\");\n                Assert.notEqual(spanParentCtx.spanId, contextTraceCtx.spanId,\n                    \"Child span parent should NOT be the original context span\");\n\n                wrapperSpan!.end();\n                contextSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"UseSpan: multiple nested spans maintain correct parent-child relationships with trace context\",\n            test: () => {\n                // Arrange\n                const rootSpan = this._ai.startSpan(\"root-span\");\n                \n                this._ai.setActiveSpan(rootSpan!);\n                \n                const rootTraceCtx = this._ai.core.getTraceCtx(false);\n                const level1Span = this._ai.startSpan(\"level1-span\");\n                \n                let level2SpanParent: any = null;\n                let level2SpanCtx: any = null;\n                let level3SpanParent: any = null;\n\n                // Act - Nested useSpan calls\n                useSpan(this._ai.core, level1Span!, (scope1: ISpanScope) => {\n                    const level1TraceCtx = this._ai.core.getTraceCtx(false);\n                    \n                    // Create level2 span - should have level1 as parent\n                    const level2Span = this._ai.startSpan(\"level2-span\");\n                    if (level2Span) {\n                        level2SpanParent = level2Span.parentSpanContext;\n                        level2SpanCtx = level2Span.spanContext();\n                    }\n                    \n                    useSpan(this._ai.core, level2Span!, (scope2: ISpanScope) => {\n                        const level2TraceCtx = this._ai.core.getTraceCtx(false);\n                        \n                        // Create level3 span - should have level2 as parent\n                        const level3Span = this._ai.startSpan(\"level3-span\");\n                        if (level3Span) {\n                            level3SpanParent = level3Span.parentSpanContext;\n                        }\n                        \n                        // Verify level3 parent matches level2 trace context\n                        Assert.equal(level3SpanParent.spanId, level2TraceCtx.spanId,\n                            \"Level3 span parent should match level2 trace context\");\n                        \n                        level3Span!.end();\n                    });\n                    \n                    // Verify level2 parent matches level1 trace context\n                    Assert.equal(level2SpanParent.spanId, level1TraceCtx.spanId,\n                        \"Level2 span parent should match level1 trace context\");\n                    \n                    level2Span!.end();\n                });\n\n                // Assert\n                Assert.ok(level2SpanParent, \"Level2 span should have parent context\");\n                Assert.ok(level2SpanCtx, \"Level2 span context should exist\");\n                Assert.ok(level3SpanParent, \"Level3 span should have parent context\");\n                \n                // Verify the chain: root -> level1 -> level2 -> level3\n                Assert.equal(level2SpanParent.spanId, level1Span!.spanContext().spanId,\n                    \"Level2 parent should be level1\");\n                Assert.equal(level3SpanParent.spanId, level2SpanCtx.spanId,\n                    \"Level3 parent should be level2\");\n\n                level1Span!.end();\n                rootSpan!.end();\n            }\n        });\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/WithSpan.Tests.ts",
    "content": "import { AITestClass, Assert } from '@microsoft/ai-test-framework';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web';\nimport { \n    IReadableSpan, eOTelSpanKind, eOTelSpanStatusCode, withSpan, ITelemetryItem, ISpanScope, ITraceHost\n} from \"@microsoft/applicationinsights-core-js\";\nexport class WithSpanTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${WithSpanTests._instrumentationKey}`;\n\n    private _ai!: ApplicationInsights;\n    \n    // Track calls to track for validation\n    private _trackCalls: ITelemetryItem[] = [];\n\n    constructor(testName?: string) {\n        super(testName || \"WithSpanTests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            this._trackCalls = [];\n\n            this._ai = new ApplicationInsights({\n                config: {\n                    connectionString: WithSpanTests._connectionString,\n                    disableAjaxTracking: false,\n                    disableXhr: false,\n                    maxBatchInterval: 0,\n                    disableExceptionTracking: false\n                }\n            });\n\n            // Initialize the SDK\n            this._ai.loadAppInsights();\n\n            // Hook core.track to capture calls\n            const originalTrack = this._ai.core.track;\n            this._ai.core.track = (item: ITelemetryItem) => {\n                this._trackCalls.push(item);\n                return originalTrack.call(this._ai.core, item);\n            };\n            \n        } catch (e) {\n            console.error('Failed to initialize WithSpan tests: ' + e);\n            throw e;\n        }\n    }\n\n    public testFinishedCleanup() {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addTests();\n    }\n\n    private addTests(): void {\n\n        this.testCase({\n            name: \"WithSpan: withSpan should be available as exported function\",\n            test: () => {\n                // Verify that withSpan is available as an import\n                Assert.ok(typeof withSpan === 'function', \"withSpan should be available as exported function\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should execute function within span context\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-context-test\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"test.type\": \"context-execution\"\n                    }\n                });\n                \n                Assert.ok(testSpan, \"Test span should be created\");\n                Assert.ok(this._ai.core, \"Core should be available\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                const testFunction = () => {\n                    capturedActiveSpan = this._ai.core!.getActiveSpan();\n                    return \"context-success\";\n                };\n\n                // Act\n                const result = withSpan(this._ai.core!, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"context-success\", \"Function should execute and return result\");\n                Assert.ok(capturedActiveSpan, \"Function should have access to active span\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Active span should be the provided test span\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should work with telemetry tracking inside span context\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const testSpan = this._ai.startSpan(\"withSpan-telemetry-test\", {\n                    attributes: {\n                        \"operation.name\": \"telemetry-tracking\"\n                    }\n                });\n                \n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const telemetryFunction = () => {\n                    // Track some telemetry within the span context\n                    this._ai.trackEvent({\n                        name: \"operation-event\",\n                        properties: {\n                            \"event.source\": \"withSpan-context\"\n                        }\n                    });\n                    \n                    this._ai.trackMetric({\n                        name: \"operation.duration\",\n                        average: 123.45\n                    });\n                    \n                    return \"telemetry-tracked\";\n                };\n\n                // Act\n                const result = withSpan(this._ai.core!, testSpan!, telemetryFunction);\n\n                // Assert\n                Assert.equal(result, \"telemetry-tracked\", \"Function should complete successfully\");\n                \n                // End the span to trigger trace generation\n                testSpan!.end();\n                \n                // Verify track was called for the span\n                Assert.equal(this._trackCalls.length, 3, \"Should have one track call from span ending\");\n                const item = this._trackCalls[2];\n                Assert.ok(item.baseData && item.baseData.properties, \"Item should have properties\");\n                Assert.equal(\"withSpan-telemetry-test\", item.baseData.name, \"Should include span name in properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should handle complex function arguments and return values\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-arguments-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const complexFunction = (\n                    stringArg: string, \n                    numberArg: number, \n                    objectArg: { key: string; value: number },\n                    arrayArg: string[]\n                ) => {\n                    return {\n                        processedString: stringArg.toUpperCase(),\n                        doubledNumber: numberArg * 2,\n                        extractedValue: objectArg.value,\n                        joinedArray: arrayArg.join('-'),\n                        timestamp: Date.now()\n                    };\n                };\n\n                const inputObject = { key: \"test-key\", value: 42 };\n                const inputArray = [\"item1\", \"item2\", \"item3\"];\n\n                // Act\n                const result = withSpan(\n                    this._ai.core!, \n                    testSpan!, \n                    complexFunction, \n                    undefined,\n                    \"hello world\", \n                    10, \n                    inputObject, \n                    inputArray\n                );\n\n                // Assert\n                Assert.equal(result.processedString, \"HELLO WORLD\", \"String should be processed correctly\");\n                Assert.equal(result.doubledNumber, 20, \"Number should be doubled correctly\");\n                Assert.equal(result.extractedValue, 42, \"Object value should be extracted correctly\");\n                Assert.equal(result.joinedArray, \"item1-item2-item3\", \"Array should be joined correctly\");\n                Assert.ok(result.timestamp > 0, \"Timestamp should be generated\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should handle function with this context binding\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-this-binding-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                class TestService {\n                    private _serviceId: string;\n                    private _multiplier: number;\n                    \n                    constructor(id: string, multiplier: number) {\n                        this._serviceId = id;\n                        this._multiplier = multiplier;\n                    }\n                    \n                    public processValue(input: number): { serviceId: string; result: number; multiplied: number } {\n                        return {\n                            serviceId: this._serviceId,\n                            result: input + 100,\n                            multiplied: input * this._multiplier\n                        };\n                    }\n                }\n                \n                const service = new TestService(\"test-service-123\", 3);\n\n                // Act\n                const result = withSpan(\n                    this._ai.core!, \n                    testSpan!, \n                    service.processValue, \n                    service,\n                    25\n                );\n\n                // Assert\n                Assert.equal(result.serviceId, \"test-service-123\", \"Service ID should be preserved via this binding\");\n                Assert.equal(result.result, 125, \"Input should be processed correctly\");\n                Assert.equal(result.multiplied, 75, \"Multiplication should use instance property\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should maintain span context across async-like operations\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-async-like-test\", {\n                    attributes: {\n                        \"operation.type\": \"async-simulation\"\n                    }\n                });\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let spanDuringCallback: IReadableSpan | null = null;\n                let callbackExecuted = false;\n                \n                const asyncLikeFunction = (callback: (data: string) => void) => {\n                    // Simulate async work that completes synchronously in test\n                    const currentSpan = this._ai.core!.getActiveSpan();\n                    \n                    // Simulate callback execution (would normally be async)\n                    setTimeout(() => {\n                        spanDuringCallback = this._ai.core!.getActiveSpan();\n                        callback(\"async-data\");\n                        callbackExecuted = true;\n                    }, 0);\n                    \n                    return currentSpan ? (currentSpan as IReadableSpan).name : \"no-span\";\n                };\n\n                // Act\n                let callbackData = \"\";\n                const callback = (data: string) => {\n                    callbackData = data;\n                };\n                \n                const result = withSpan(this._ai.core!, testSpan!, asyncLikeFunction, undefined, callback);\n\n                // Assert\n                Assert.equal(result, \"withSpan-async-like-test\", \"Function should have access to span name\");\n                \n                // Note: In a real async scenario, the span context wouldn't automatically \n                // propagate to the setTimeout callback without additional context management\n                // This test validates the synchronous behavior of withSpan\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should handle exceptions and preserve span operations\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-exception-test\", {\n                    attributes: {\n                        \"test.expects\": \"exception\"\n                    }\n                });\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const exceptionFunction = () => {\n                    // Perform some span operations before throwing\n                    const activeSpan = this._ai.core!.getActiveSpan();\n                    Assert.ok(activeSpan, \"Should have active span before exception\");\n                    \n                    activeSpan!.setAttribute(\"operation.status\", \"error\");\n                    activeSpan!.setStatus({\n                        code: eOTelSpanStatusCode.ERROR,\n                        message: \"Operation failed with test exception\"\n                    });\n                    \n                    throw new Error(\"Test exception for withSpan handling\");\n                };\n\n                // Act & Assert\n                let caughtException: Error | null = null;\n                try {\n                    withSpan(this._ai.core!, testSpan!, exceptionFunction);\n                } catch (error) {\n                    caughtException = error as Error;\n                }\n\n                Assert.ok(caughtException, \"Exception should be thrown and caught\");\n                Assert.equal(caughtException!.message, \"Test exception for withSpan handling\", \"Exception message should be preserved\");\n                \n                // Verify span is still valid and operations were applied\n                Assert.ok(testSpan!.isRecording(), \"Span should still be recording after exception\");\n                const readableSpan = testSpan! as IReadableSpan;\n                Assert.ok(!readableSpan.ended, \"Span should not be ended by withSpan after exception\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should work with nested span operations and child spans\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const parentSpan = this._ai.startSpan(\"parent-operation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"operation.name\": \"parent-process\"\n                    }\n                });\n                Assert.ok(parentSpan, \"Parent span should be created\");\n                \n                const nestedOperations = () => {\n                    // Verify we have the parent span as active\n                    const currentActive = this._ai.core!.getActiveSpan();\n                    Assert.equal(currentActive, parentSpan, \"Parent span should be active\");\n                    \n                    // Create child operations within the parent span context\n                    const childSpan1 = this._ai.startSpan(\"child-operation-1\", {\n                        attributes: { \"child.order\": 1 }\n                    });\n                    childSpan1!.setAttribute(\"child.status\", \"completed\");\n                    childSpan1!.end();\n                    \n                    const childSpan2 = this._ai.startSpan(\"child-operation-2\", {\n                        attributes: { \"child.order\": 2 }\n                    });\n                    childSpan2!.setAttribute(\"child.status\", \"completed\");\n                    childSpan2!.end();\n                    \n                    return \"nested-operations-completed\";\n                };\n\n                // Act\n                const result = withSpan(this._ai.core!, parentSpan!, nestedOperations);\n\n                // Assert\n                Assert.equal(result, \"nested-operations-completed\", \"Nested operations should complete successfully\");\n                \n                // End parent span to generate telemetry\n                parentSpan!.end();\n                \n                // Should have 3 telemetry items: parent + 2 children\n                Assert.equal(this._trackCalls.length, 3, \"Should have telemetry for parent and child spans\");\n                \n                // Verify span names in properties\n                const spanNames = this._trackCalls.map(item => item.baseData?.name).filter(n => n);\n                Assert.ok(spanNames.some(name => name === \"parent-operation\"), \"Should have parent span telemetry\");\n                Assert.ok(spanNames.some(name => name === \"child-operation-1\"), \"Should have child-1 span telemetry\");\n                Assert.ok(spanNames.some(name => name === \"child-operation-2\"), \"Should have child-2 span telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should support different return value types\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-return-types-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n\n                // Test various return types\n                const stringResult = withSpan(this._ai.core!, testSpan!, () => \"string-result\");\n                const numberResult = withSpan(this._ai.core!, testSpan!, () => 42.5);\n                const booleanResult = withSpan(this._ai.core!, testSpan!, () => true);\n                const arrayResult = withSpan(this._ai.core!, testSpan!, () => [1, 2, 3]);\n                const objectResult = withSpan(this._ai.core!, testSpan!, () => ({ key: \"value\", nested: { prop: 123 } }));\n                const nullResult = withSpan(this._ai.core!, testSpan!, () => null);\n                const undefinedResult = withSpan(this._ai.core!, testSpan!, () => undefined);\n\n                // Assert\n                Assert.equal(stringResult, \"string-result\", \"String return should work\");\n                Assert.equal(numberResult, 42.5, \"Number return should work\");\n                Assert.equal(booleanResult, true, \"Boolean return should work\");\n                Assert.equal(arrayResult.length, 3, \"Array return should work\");\n                Assert.equal(arrayResult[1], 2, \"Array elements should be preserved\");\n                Assert.equal(objectResult.key, \"value\", \"Object properties should be preserved\");\n                Assert.equal(objectResult.nested.prop, 123, \"Nested object properties should be preserved\");\n                Assert.equal(nullResult, null, \"Null return should work\");\n                Assert.equal(undefinedResult, undefined, \"Undefined return should work\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should handle rapid successive calls efficiently\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-performance-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const iterations = 100;\n                let totalResult = 0;\n                \n                // Simple computation function\n                const computeFunction = (input: number) => {\n                    return input * 2 + 1;\n                };\n\n                const startTime = Date.now();\n\n                // Act - Multiple rapid withSpan calls\n                for (let i = 0; i < iterations; i++) {\n                    const result = withSpan(this._ai.core!, testSpan!, computeFunction, undefined, i);\n                    totalResult += result;\n                }\n\n                const endTime = Date.now();\n                const duration = endTime - startTime;\n\n                // Assert\n                const expectedTotal = Array.from({length: iterations}, (_, i) => i * 2 + 1).reduce((sum, val) => sum + val, 0);\n                Assert.equal(totalResult, expectedTotal, \"All computations should be correct\");\n                \n                // Performance assertion - should complete reasonably quickly\n                Assert.ok(duration < 1000, `Performance test should complete quickly: ${duration}ms for ${iterations} iterations`);\n                \n                // Verify span is still valid after many operations\n                Assert.ok(testSpan!.isRecording(), \"Span should still be recording after multiple withSpan calls\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should integrate with AI telemetry correlation\",\n            test: () => {\n                // Arrange\n                this._trackCalls = [];\n                const operationSpan = this._ai.startSpan(\"user-operation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"user.id\": \"user-123\",\n                        \"operation.type\": \"data-processing\"\n                    }\n                });\n                Assert.ok(operationSpan, \"Operation span should be created\");\n                \n                const businessLogicFunction = (userId: string, dataType: string) => {\n                    // Track multiple telemetry items within span context\n                    this._ai.trackEvent({\n                        name: \"data-processing-started\",\n                        properties: {\n                            \"user.id\": userId,\n                            \"data.type\": dataType,\n                            \"processing.stage\": \"initialization\"\n                        }\n                    });\n                    \n                    // Simulate some processing steps\n                    for (let step = 1; step <= 3; step++) {\n                        this._ai.trackMetric({\n                            name: \"processing.step.duration\",\n                            average: step * 10.5,\n                            properties: {\n                                \"step.number\": step.toString()\n                            }\n                        });\n                    }\n                    \n                    this._ai.trackEvent({\n                        name: \"data-processing-completed\",\n                        properties: {\n                            \"user.id\": userId,\n                            \"data.type\": dataType,\n                            \"processing.stage\": \"completion\",\n                            \"steps.completed\": \"3\"\n                        }\n                    });\n                    \n                    return {\n                        userId: userId,\n                        dataType: dataType,\n                        stepsCompleted: 3,\n                        status: \"success\"\n                    };\n                };\n\n                // Act\n                const result = withSpan(\n                    this._ai.core!, \n                    operationSpan!, \n                    businessLogicFunction, \n                    undefined,\n                    \"user-123\", \n                    \"customer-data\"\n                );\n\n                // End the span to generate trace\n                operationSpan!.end();\n\n                // Assert\n                Assert.equal(result.userId, \"user-123\", \"User ID should be processed correctly\");\n                Assert.equal(result.dataType, \"customer-data\", \"Data type should be processed correctly\");\n                Assert.equal(result.stepsCompleted, 3, \"All processing steps should be completed\");\n                Assert.equal(result.status, \"success\", \"Operation should complete successfully\");\n                \n                // Verify span telemetry was generated\n                Assert.equal(this._trackCalls.length, 6, \"Should have one track call from span ending\");\n                const spanItem = this._trackCalls[5];\n                Assert.ok(spanItem.baseData && spanItem.baseData.properties, \"Item should have properties\");\n                Assert.equal(\"user-operation\", spanItem.baseData.name, \"Should include span name\");\n                \n                // Verify span attributes are included in properties\n                Assert.equal(spanItem.baseData.properties[\"user.id\"], \"user-123\", \"Span attributes should be included in telemetry\");\n                Assert.equal(spanItem.baseData.properties[\"operation.type\"], \"data-processing\", \"All span attributes should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should handle empty or no-op functions gracefully\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"withSpan-noop-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                // Test empty function\n                const emptyFunction = () => {};\n                \n                // Test function that just returns without doing anything\n                const noOpFunction = () => {\n                    return;\n                };\n                \n                // Test function that returns undefined explicitly\n                const undefinedFunction = () => {\n                    return undefined;\n                };\n\n                // Act\n                const emptyResult = withSpan(this._ai.core!, testSpan!, emptyFunction);\n                const noOpResult = withSpan(this._ai.core!, testSpan!, noOpFunction);\n                const undefinedResult = withSpan(this._ai.core!, testSpan!, undefinedFunction);\n\n                // Assert\n                Assert.equal(emptyResult, undefined, \"Empty function should return undefined\");\n                Assert.equal(noOpResult, undefined, \"No-op function should return undefined\");\n                Assert.equal(undefinedResult, undefined, \"Undefined function should return undefined\");\n                \n                // Verify span is still valid\n                Assert.ok(testSpan!.isRecording(), \"Span should still be recording after no-op functions\");\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should use ISpanScope as 'this' when no thisArg provided\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"test-span\", {\n                    attributes: { \"test.id\": \"withSpan-this-test\" }\n                });\n                \n                let capturedThis: any = null;\n                let capturedHost: ITraceHost | null = null;\n                let capturedSpan: any = null;\n\n                // Act - call withSpan without thisArg\n                const result = withSpan(this._ai.core, span!, function(this: ISpanScope, arg1: string, arg2: number) {\n                    capturedThis = this;\n                    capturedHost = this.host;\n                    capturedSpan = this.span;\n                    return `${arg1}-${arg2}`;\n                }, undefined, \"test\", 42);\n\n                // Assert\n                Assert.equal(result, \"test-42\", \"Function should execute and return result\");\n                Assert.ok(capturedThis, \"'this' should be defined\");\n                Assert.ok(capturedThis.host, \"'this.host' should exist\");\n                Assert.ok(capturedThis.span, \"'this.span' should exist\");\n                Assert.equal(capturedHost, this._ai.core, \"'this.host' should be the AI core\");\n                Assert.equal(capturedSpan, span, \"'this.span' should be the passed span\");\n                Assert.equal(capturedThis.span.name, \"test-span\", \"'this.span.name' should match\");\n\n                span!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: should use provided thisArg when specified\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"test-span-thisarg\");\n                \n                const customContext = {\n                    contextId: \"custom-123\",\n                    multiplier: 10\n                };\n                \n                let capturedThis: any = null;\n\n                // Act - call withSpan with explicit thisArg\n                const result = withSpan(this._ai.core, span!, function(this: typeof customContext, arg1: number) {\n                    capturedThis = this;\n                    return arg1 * this.multiplier;\n                }, customContext, 5);\n\n                // Assert\n                Assert.equal(result, 50, \"Function should execute with custom this context\");\n                Assert.ok(capturedThis, \"'this' should be defined\");\n                Assert.equal(capturedThis, customContext, \"'this' should be the custom context\");\n                Assert.equal(capturedThis.contextId, \"custom-123\", \"'this.contextId' should match\");\n                Assert.equal(capturedThis.multiplier, 10, \"'this.multiplier' should match\");\n                Assert.ok(!capturedThis.core, \"Custom this should not have core property\");\n                Assert.ok(!capturedThis.span, \"Custom this should not have span property\");\n\n                span!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: arrow functions should not override 'this' binding\",\n            test: () => {\n                // Arrange\n                const span = this._ai.startSpan(\"arrow-function-test\");\n                \n                // Act - arrow functions capture their lexical 'this'\n                const result = withSpan(this._ai.core, span!, (arg: string) => {\n                    // Arrow function - 'this' is lexically bound to the test class instance\n                    Assert.ok(this._ai, \"Arrow function should have access to test class 'this'\");\n                    return `arrow-${arg}`;\n                }, undefined, \"result\");\n\n                // Assert\n                Assert.equal(result, \"arrow-result\", \"Arrow function should execute correctly\");\n                Assert.ok(this._ai, \"Test class instance should still be accessible\");\n\n                span!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: verify ISpanScope.restore() is called to restore previous active span\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-span\");\n                const innerSpan = this._ai.startSpan(\"inner-span\");\n                \n                let activeSpanBeforeWithSpan: any = null;\n                let activeSpanInsideWithSpan: any = null;\n                let activeSpanAfterWithSpan: any = null;\n\n                // Act\n                activeSpanBeforeWithSpan = this._ai.core.getActiveSpan ? this._ai.core.getActiveSpan() : null;\n                \n                withSpan(this._ai.core, innerSpan!, () => {\n                    activeSpanInsideWithSpan = this._ai.core.getActiveSpan ? this._ai.core.getActiveSpan() : null;\n                    Assert.equal(activeSpanInsideWithSpan, innerSpan, \"Active span inside withSpan should be inner span\");\n                });\n                \n                activeSpanAfterWithSpan = this._ai.core.getActiveSpan ? this._ai.core.getActiveSpan() : null;\n\n                // Assert\n                // Active span should be restored after withSpan completes\n                Assert.equal(activeSpanAfterWithSpan, activeSpanBeforeWithSpan, \n                    \"Active span should be restored after withSpan completes\");\n\n                innerSpan!.end();\n                outerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: 'this' binding with nested withSpan calls\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-withspan\");\n                const innerSpan = this._ai.startSpan(\"inner-withspan\");\n                \n                const outerContext = {\n                    contextName: \"outer\",\n                    value: 100\n                };\n\n                let outerThisCapture: any = null;\n                let innerThisCapture: any = null;\n                let ai = this._ai;\n\n                // Act - nested withSpan calls with different thisArg\n                withSpan(ai.core, outerSpan!, function(this: typeof outerContext, arg: number) {\n                    outerThisCapture = this;\n                    Assert.equal(this.contextName, \"outer\", \"Outer 'this' should be outer context\");\n                    Assert.equal(this.value, 100, \"Outer 'this.value' should match\");\n                    \n                    withSpan(ai.core, innerSpan!, function(this: ISpanScope) {\n                        innerThisCapture = this;\n                        // Inner call without explicit thisArg - should be ISpanScope\n                        Assert.ok(this.host, \"Inner 'this' should be ISpanScope\");\n                        Assert.ok(this.span, \"Inner 'this.span' should exist\");\n                        Assert.equal(this.span.name, \"inner-withspan\", \"Inner span name should match\");\n                    });\n                    \n                    return arg * this.value;\n                }, outerContext, 2);\n\n                // Assert\n                Assert.ok(outerThisCapture, \"Outer 'this' should be captured\");\n                Assert.equal(outerThisCapture.contextName, \"outer\", \"Outer context should be preserved\");\n                \n                Assert.ok(innerThisCapture, \"Inner 'this' should be captured\");\n                Assert.ok(innerThisCapture.host, \"Inner 'this' should have host\");\n                Assert.ok(innerThisCapture.span, \"Inner 'this' should have span\");\n\n                innerSpan!.end();\n                outerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: trace context should match active span context inside withSpan\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"trace-context-match-test\", {\n                    attributes: {\n                        \"test.type\": \"trace-context-validation\"\n                    }\n                });\n                Assert.ok(testSpan, \"Test span should be created\");\n\n                let traceCtxInsideWithSpan: any = null;\n                let spanContextInsideWithSpan: any = null;\n                let activeSpanInsideWithSpan: any = null;\n\n                // Act\n                withSpan(this._ai.core, testSpan!, function(this: ISpanScope) {\n                    // Get trace context from core\n                    traceCtxInsideWithSpan = this.host.getTraceCtx(false);\n                    \n                    // Get span context from the span\n                    spanContextInsideWithSpan = this.span.spanContext();\n                    \n                    // Get active span\n                    activeSpanInsideWithSpan = this.host.getActiveSpan ? this.host.getActiveSpan() : null;\n                });\n\n                // Assert\n                Assert.ok(traceCtxInsideWithSpan, \"Trace context should exist inside withSpan\");\n                Assert.ok(spanContextInsideWithSpan, \"Span context should exist\");\n                Assert.ok(activeSpanInsideWithSpan, \"Active span should be set\");\n                \n                // Verify active span matches the withSpan span\n                Assert.equal(activeSpanInsideWithSpan, testSpan, \"Active span should be the withSpan span\");\n                \n                // Verify trace context matches span context\n                Assert.equal(traceCtxInsideWithSpan.traceId, spanContextInsideWithSpan.traceId,\n                    \"Trace context traceId should match span context traceId\");\n                Assert.equal(traceCtxInsideWithSpan.spanId, spanContextInsideWithSpan.spanId,\n                    \"Trace context spanId should match span context spanId\");\n                Assert.equal(traceCtxInsideWithSpan.traceFlags, spanContextInsideWithSpan.traceFlags,\n                    \"Trace context traceFlags should match span context traceFlags\");\n\n                testSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: trace context updates when switching between nested withSpan calls\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-trace-span\");\n                const innerSpan = this._ai.startSpan(\"inner-trace-span\");\n                \n                let outerTraceCtx: any = null;\n                let outerSpanCtx: any = null;\n                let innerTraceCtx: any = null;\n                let innerSpanCtx: any = null;\n                let ai = this._ai;\n\n                // Act\n                withSpan(ai.core, outerSpan!, function(this: ISpanScope) {\n                    outerTraceCtx = this.host.getTraceCtx(false);\n                    outerSpanCtx = this.span.spanContext();\n                    \n                    // Verify outer trace context matches outer span\n                    Assert.equal(outerTraceCtx.spanId, outerSpanCtx.spanId,\n                        \"Outer trace context should match outer span\");\n                    \n                    // Nested withSpan with different span\n                    withSpan(ai.core, innerSpan!, function(this: ISpanScope) {\n                        innerTraceCtx = this.host.getTraceCtx(false);\n                        innerSpanCtx = this.span.spanContext();\n                        \n                        // Verify inner trace context matches inner span\n                        Assert.equal(innerTraceCtx.spanId, innerSpanCtx.spanId,\n                            \"Inner trace context should match inner span\");\n                        \n                        // Verify inner context is different from outer\n                        Assert.notEqual(innerTraceCtx.spanId, outerTraceCtx.spanId,\n                            \"Inner and outer trace contexts should have different spanIds\");\n                    });\n                    \n                    // After inner withSpan, verify we're back to outer context\n                    const restoredTraceCtx = this.host.getTraceCtx(false);\n                    Assert.equal(restoredTraceCtx.spanId, outerSpanCtx.spanId,\n                        \"Trace context should be restored to outer span after inner withSpan completes\");\n                });\n\n                outerSpan!.end();\n                innerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: child spans created inside withSpan inherit correct parent context\",\n            test: () => {\n                // Arrange\n                const parentSpan = this._ai.startSpan(\"parent-for-child-test\");\n                let ai = this._ai;\n                \n                let childSpanContext: any = null;\n                let parentSpanContext: any = null;\n\n                // Act\n                withSpan(ai.core, parentSpan!, function(this: ISpanScope) {\n                    parentSpanContext = this.span.spanContext();\n                    \n                    // Create a child span while parent is active\n                    const childSpan = ai.startSpan(\"child-span-in-withSpan\");\n                    childSpanContext = childSpan!.spanContext();\n                    \n                    // Verify trace context matches parent\n                    const traceCtx = this.host.getTraceCtx(false);\n                    Assert.equal(traceCtx.spanId, parentSpanContext.spanId,\n                        \"Trace context should match parent span inside withSpan\");\n                    \n                    childSpan!.end();\n                });\n\n                // Assert\n                Assert.ok(childSpanContext, \"Child span context should exist\");\n                Assert.ok(parentSpanContext, \"Parent span context should exist\");\n                \n                // Child should have same traceId as parent but different spanId\n                Assert.equal(childSpanContext.traceId, parentSpanContext.traceId,\n                    \"Child span should have same traceId as parent\");\n                Assert.notEqual(childSpanContext.spanId, parentSpanContext.spanId,\n                    \"Child span should have different spanId from parent\");\n\n                parentSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: trace context is restored after withSpan completes\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"temporary-trace-span\");\n                \n                let traceCtxBefore: any = null;\n                let traceCtxInside: any = null;\n                let traceCtxAfter: any = null;\n                let ai = this._ai;\n\n                // Act\n                traceCtxBefore = this._ai.core.getTraceCtx(false);\n                \n                withSpan(ai.core, testSpan!, function(this: ISpanScope) {\n                    traceCtxInside = this.host.getTraceCtx(false);\n                });\n                \n                traceCtxAfter = this._ai.core.getTraceCtx(false);\n\n                // Assert\n                Assert.ok(traceCtxBefore, \"Trace context should exist before withSpan (created by startSpan)\");\n                Assert.ok(traceCtxInside, \"Trace context should exist inside withSpan\");\n                Assert.equal(traceCtxInside.spanId, testSpan!.spanContext().spanId,\n                    \"Trace context inside withSpan should match the test span\");\n                Assert.ok(traceCtxAfter, \"Trace context should exist after withSpan\");\n                Assert.equal(traceCtxAfter.spanId, traceCtxBefore.spanId,\n                    \"Trace context should be restored to previous state after withSpan\");\n\n                testSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: trace context reflects parent span when withSpan is nested in another active span\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-active-span\");\n                \n                this._ai.setActiveSpan(outerSpan!);\n                \n                const innerSpan = this._ai.startSpan(\"inner-withspan-span\");\n                let ai = this._ai;\n                \n                let outerSpanCtx: any = null;\n                let traceCtxBeforeWithSpan: any = null;\n                let traceCtxInsideWithSpan: any = null;\n                let traceCtxAfterWithSpan: any = null;\n\n                // Act\n                outerSpanCtx = outerSpan!.spanContext();\n                traceCtxBeforeWithSpan = this._ai.core.getTraceCtx(false);\n                \n                // Verify initial trace context matches outer span\n                Assert.equal(traceCtxBeforeWithSpan.spanId, outerSpanCtx.spanId,\n                    \"Trace context should initially match outer span\");\n                \n                withSpan(ai.core, innerSpan!, function(this: ISpanScope) {\n                    traceCtxInsideWithSpan = this.host.getTraceCtx(false);\n                    const innerSpanCtx = this.span.spanContext();\n                    \n                    // Inside withSpan, trace context should match inner span\n                    Assert.equal(traceCtxInsideWithSpan.spanId, innerSpanCtx.spanId,\n                        \"Trace context inside withSpan should match inner span\");\n                });\n                \n                traceCtxAfterWithSpan = this._ai.core.getTraceCtx(false);\n                \n                // After withSpan, trace context should be restored to outer span\n                Assert.equal(traceCtxAfterWithSpan.spanId, outerSpanCtx.spanId,\n                    \"Trace context should be restored to outer span after withSpan\");\n\n                innerSpan!.end();\n                outerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: trace context traceState is accessible inside withSpan\",\n            test: () => {\n                // Arrange\n                const testSpan = this._ai.startSpan(\"tracestate-test-span\");\n                let ai = this._ai;\n                \n                let traceStateInside: any = null;\n\n                // Act\n                withSpan(ai.core, testSpan!, function(this: ISpanScope) {\n                    const traceCtx = this.host.getTraceCtx(false);\n                    traceStateInside = traceCtx ? traceCtx.traceState : null;\n                });\n\n                // Assert\n                Assert.ok(traceStateInside !== undefined,\n                    \"Trace state should be accessible inside withSpan\");\n\n                testSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: span created inside withSpan has parent context matching outer trace context\",\n            test: () => {\n                // Arrange\n                const outerSpan = this._ai.startSpan(\"outer-parent-span\");\n                \n                this._ai.setActiveSpan(outerSpan!);\n                \n                let outerTraceCtx: any = null;\n                let innerSpanParentCtx: any = null;\n                let innerSpanCreated: any = null;\n                let ai = this._ai;\n\n                // Act\n                outerTraceCtx = this._ai.core.getTraceCtx(false);\n                \n                withSpan(ai.core, outerSpan!, function(this: ISpanScope) {\n                    // Create a new span inside withSpan\n                    innerSpanCreated = ai.startSpan(\"inner-child-span\");\n                    \n                    // Get the parent context of the newly created span\n                    if (innerSpanCreated) {\n                        innerSpanParentCtx = innerSpanCreated.parentSpanContext;\n                    }\n                    \n                    innerSpanCreated!.end();\n                });\n\n                // Assert\n                Assert.ok(outerTraceCtx, \"Outer trace context should exist\");\n                Assert.ok(innerSpanParentCtx, \"Inner span should have parent context\");\n                \n                // Verify parent context matches outer trace context\n                Assert.equal(innerSpanParentCtx.traceId, outerTraceCtx.traceId,\n                    \"Inner span parent traceId should match outer trace context traceId\");\n                Assert.equal(innerSpanParentCtx.spanId, outerTraceCtx.spanId,\n                    \"Inner span parent spanId should match outer trace context spanId\");\n\n                outerSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: span parent context matches trace context when withSpan wraps different span\",\n            test: () => {\n                // Arrange - Create initial trace context\n                const contextSpan = this._ai.startSpan(\"context-span\");\n                \n                this._ai.setActiveSpan(contextSpan!);\n                \n                const contextTraceCtx = this._ai.core.getTraceCtx(false);\n                \n                // Create a different span to use in withSpan\n                const wrapperSpan = this._ai.startSpan(\"wrapper-span\");\n                \n                let spanCreatedInCallback: any = null;\n                let spanParentCtx: any = null;\n                let ai = this._ai;\n\n                // Act - withSpan with a different span than what's in trace context\n                withSpan(ai.core, wrapperSpan!, function(this: ISpanScope) {\n                    // The active span is now wrapperSpan\n                    // Create a child span - it should have wrapperSpan as parent\n                    spanCreatedInCallback = ai.startSpan(\"child-of-wrapper\");\n                    \n                    if (spanCreatedInCallback) {\n                        spanParentCtx = spanCreatedInCallback.parentSpanContext;\n                    }\n                    \n                    spanCreatedInCallback!.end();\n                });\n\n                // Assert\n                Assert.ok(spanParentCtx, \"Child span should have parent context\");\n                \n                // Parent should be wrapperSpan (the withSpan span), not contextSpan\n                const wrapperSpanCtx = wrapperSpan!.spanContext();\n                Assert.equal(spanParentCtx.spanId, wrapperSpanCtx.spanId,\n                    \"Child span parent should be the wrapper span from withSpan\");\n                Assert.notEqual(spanParentCtx.spanId, contextTraceCtx.spanId,\n                    \"Child span parent should NOT be the original context span\");\n\n                wrapperSpan!.end();\n                contextSpan!.end();\n            }\n        });\n\n        this.testCase({\n            name: \"WithSpan: multiple nested spans maintain correct parent-child relationships with trace context\",\n            test: () => {\n                // Arrange\n                const rootSpan = this._ai.startSpan(\"root-span\");\n                \n                this._ai.setActiveSpan(rootSpan!);\n                \n                const level1Span = this._ai.startSpan(\"level1-span\");\n                \n                let level2SpanParent: any = null;\n                let level2SpanCtx: any = null;\n                let level3SpanParent: any = null;\n                let ai = this._ai;\n\n                // Act - Nested withSpan calls\n                withSpan(ai.core, level1Span!, function(this: ISpanScope) {\n                    const level1TraceCtx = this.host.getTraceCtx(false);\n                    \n                    // Create level2 span - should have level1 as parent\n                    const level2Span = ai.startSpan(\"level2-span\");\n                    if (level2Span) {\n                        level2SpanParent = level2Span.parentSpanContext;\n                        level2SpanCtx = level2Span.spanContext();\n                    }\n                    \n                    withSpan(ai.core, level2Span!, function(this: ISpanScope) {\n                        const level2TraceCtx = this.host.getTraceCtx(false);\n                        \n                        // Create level3 span - should have level2 as parent\n                        const level3Span = ai.startSpan(\"level3-span\");\n                        if (level3Span) {\n                            level3SpanParent = level3Span.parentSpanContext;\n                        }\n                        \n                        // Verify level3 parent matches level2 trace context\n                        Assert.equal(level3SpanParent.spanId, level2TraceCtx.spanId,\n                            \"Level3 span parent should match level2 trace context\");\n                        \n                        level3Span!.end();\n                    });\n                    \n                    // Verify level2 parent matches level1 trace context\n                    Assert.equal(level2SpanParent.spanId, level1TraceCtx.spanId,\n                        \"Level2 span parent should match level1 trace context\");\n                    \n                    level2Span!.end();\n                });\n\n                // Assert\n                Assert.ok(level2SpanParent, \"Level2 span should have parent context\");\n                Assert.ok(level2SpanCtx, \"Level2 span context should exist\");\n                Assert.ok(level3SpanParent, \"Level3 span should have parent context\");\n                \n                // Verify the chain: root -> level1 -> level2 -> level3\n                Assert.equal(level2SpanParent.spanId, level1Span!.spanContext().spanId,\n                    \"Level2 parent should be level1\");\n                Assert.equal(level3SpanParent.spanId, level2SpanCtx.spanId,\n                    \"Level3 parent should be level2\");\n\n                level1Span!.end();\n                rootSpan!.end();\n            }\n        });\n    }\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/aiskuunittests.ts",
    "content": "import { AISKUSizeCheck } from \"./AISKUSize.Tests\";\nimport { ApplicationInsightsTests } from \"./applicationinsights.e2e.tests\";\nimport { ApplicationInsightsFetchTests } from \"./applicationinsights.e2e.fetch.tests\";\nimport { CdnPackagingChecks } from \"./CdnPackaging.tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\nimport { SanitizerE2ETests } from \"./sanitizer.e2e.tests\";\nimport { ValidateE2ETests } from \"./validate.e2e.tests\";\nimport { SenderE2ETests } from \"./sender.e2e.tests\";\nimport { SnippetInitializationTests } from \"./SnippetInitialization.Tests\";\nimport { CdnThrottle} from \"./CdnThrottle.tests\";\nimport { ThrottleSentMessage } from \"./ThrottleSentMessage.tests\";\nimport { IAnalyticsConfigTests } from \"./IAnalyticsConfig.Tests\";\nimport { StartSpanTests } from \"./StartSpan.Tests\";\nimport { UseSpanTests } from \"./UseSpan.Tests\";\nimport { WithSpanTests } from \"./WithSpan.Tests\";\nimport { SpanContextPropagationTests } from \"./SpanContextPropagation.Tests\";\nimport { SpanLifeCycleTests } from \"./SpanLifeCycle.Tests\"\nimport { TelemetryItemGenerationTests } from \"./TelemetryItemGeneration.Tests\";\nimport { SpanErrorHandlingTests } from \"./SpanErrorHandling.Tests\";\nimport { SpanUtilsTests } from \"./SpanUtils.Tests\";\nimport { SpanE2ETests } from \"./SpanE2E.Tests\";\nimport { NonRecordingSpanTests } from \"./NonRecordingSpan.Tests\";\nimport { SpanPluginIntegrationTests } from \"./SpanPluginIntegration.Tests\";\nimport { SpanHelperUtilsTests } from \"./SpanHelperUtils.Tests\";\nimport { TraceSuppressionTests } from \"./TraceSuppression.Tests\";\nimport { TraceProviderTests } from \"./TraceProvider.Tests\";\nimport { TraceContextTests } from \"./TraceContext.Tests\";\nimport { OTelInitTests } from \"./OTelInit.Tests\";\n\nexport function runTests() {\n    new OTelInitTests().registerTests();\n    new TraceSuppressionTests().registerTests();\n    new SpanErrorHandlingTests().registerTests();\n    new SpanUtilsTests().registerTests();\n    new SpanE2ETests().registerTests();\n    new NonRecordingSpanTests().registerTests();\n    new SpanPluginIntegrationTests().registerTests();\n    new SpanHelperUtilsTests().registerTests();\n    new TraceProviderTests().registerTests();\n    new TraceContextTests().registerTests();\n\n    new GlobalTestHooks().registerTests();\n    new AISKUSizeCheck().registerTests();\n    new ApplicationInsightsTests().registerTests();\n    new ApplicationInsightsFetchTests().registerTests();\n    new CdnPackagingChecks().registerTests();\n    new SanitizerE2ETests().registerTests();\n    new ValidateE2ETests().registerTests();\n    new SenderE2ETests().registerTests();\n    new SnippetInitializationTests(false).registerTests();\n    new SnippetInitializationTests(true).registerTests();\n    new ThrottleSentMessage().registerTests();\n    new CdnThrottle().registerTests();\n    new IAnalyticsConfigTests().registerTests();\n    new StartSpanTests().registerTests();\n    new WithSpanTests().registerTests();\n    new UseSpanTests().registerTests();\n    new SpanContextPropagationTests().registerTests();\n    new SpanLifeCycleTests().registerTests();\n    new TelemetryItemGenerationTests().registerTests();\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/applicationinsights.e2e.fetch.tests.ts",
    "content": "import { DistributedTracingModes, IConfig } from '@microsoft/applicationinsights-core-js';\nimport { ApplicationInsightsTests } from './applicationinsights.e2e.tests';\nimport { IConfiguration } from '@microsoft/applicationinsights-core-js';\n\nconst _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\nconst _connectionString = `InstrumentationKey=${_instrumentationKey}`;\n\nexport class ApplicationInsightsFetchTests extends ApplicationInsightsTests {\n\n    constructor() {\n        super(\"ApplicationInsightsFetchTests-XHR Disabled\");\n    }\n    \n    protected _getTestConfig(sessionPrefix: string) {\n        let config: IConfiguration & IConfig = {\n            connectionString: _connectionString,\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            disableXhr: true,               // Disable XHR support\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            maxBatchInterval: 500,\n            disableExceptionTracking: false,\n            namePrefix: sessionPrefix,\n            enableCorsCorrelation: true,\n            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n            samplingPercentage: 50,\n            convertUndefined: \"test-value\",\n            disablePageUnloadEvents: [ \"beforeunload\" ],\n            extensionConfig: {\n                [\"AppInsightsCfgSyncPlugin\"]: {\n                    cfgUrl: \"\"\n                }\n            }\n        };\n\n        return config;\n    }\n\n    public testInitialize() {\n        super.testInitialize();\n\n        // Use the fake server for fetch tests as multiple test runs are causing timeout issues\n        // this.useFakeServer = true;\n        // this.fakeServerAutoRespond = true;\n        this.useFakeFetch = true;\n        this.fakeFetchAutoRespond = true;\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/applicationinsights.e2e.tests.ts",
    "content": "import { AITestClass, Assert, PollingAssert, EventValidator, TraceValidator, ExceptionValidator, MetricValidator, PageViewValidator, PageViewPerformanceValidator, RemoteDepdencyValidator } from '@microsoft/ai-test-framework';\nimport { SinonSpy } from 'sinon';\nimport { ApplicationInsights } from '../../../src/applicationinsights-web'\nimport { Sender } from '@microsoft/applicationinsights-channel-js';\nimport { IDependencyTelemetry, ContextTagKeys, Exception, DistributedTracingModes, RequestHeaders, IAutoExceptionTelemetry, BreezeChannelIdentifier, IConfig, EventPersistence, EventDataType, PageViewDataType, TraceDataType, ExceptionDataType, MetricDataType, PageViewPerformanceDataType, RemoteDependencyDataType } from '@microsoft/applicationinsights-core-js';\nimport { ITelemetryItem, getGlobal, newId, dumpObj, BaseTelemetryPlugin, IProcessTelemetryContext, __getRegisteredEvents, arrForEach, IConfiguration, ActiveStatus, FeatureOptInMode } from \"@microsoft/applicationinsights-core-js\";\nimport { IPropTelemetryContext } from '@microsoft/applicationinsights-properties-js';\nimport { createAsyncResolvedPromise } from '@nevware21/ts-async';\nimport { CONFIG_ENDPOINT_URL } from '../../../src/InternalConstants';\nimport { OfflineChannel } from '@microsoft/applicationinsights-offlinechannel-js';\nimport { IStackFrame } from '@microsoft/applicationinsights-core-js';\nimport { utcNow } from '@nevware21/ts-utils';\n\nfunction _checkExpectedFrame(expectedFrame: IStackFrame, actualFrame: IStackFrame, index: number) {\n    Assert.equal(expectedFrame.assembly, actualFrame.assembly, index + \") Assembly is not as expected\");\n    Assert.equal(expectedFrame.fileName, actualFrame.fileName, index + \") FileName is not as expected\");\n    Assert.equal(expectedFrame.line, actualFrame.line, index + \") Line is not as expected\");\n    Assert.equal(expectedFrame.method, actualFrame.method, index + \") Method is not as expected\");\n    Assert.equal(expectedFrame.level, actualFrame.level, index + \") Level is not as expected\");\n}\n\nexport class ApplicationInsightsTests extends AITestClass {\n    private static readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private static readonly _connectionString = `InstrumentationKey=${ApplicationInsightsTests._instrumentationKey}`;\n    private static readonly _expectedTrackMethods = [\n        \"startTrackPage\",\n        \"stopTrackPage\",\n        \"trackException\",\n        \"trackEvent\",\n        \"trackMetric\",\n        \"trackPageView\",\n        \"trackTrace\",\n        \"trackDependencyData\",\n        \"setAuthenticatedUserContext\",\n        \"clearAuthenticatedUserContext\",\n        \"trackPageViewPerformance\",\n        \"addTelemetryInitializer\",\n        \"flush\"\n    ];\n\n    private _ai: ApplicationInsights;\n    private _aiName: string = 'AppInsightsSDK';\n    private isFetchPolyfill: boolean = false;\n\n    // Sinon\n    private errorSpy: SinonSpy;\n    private successSpy: SinonSpy;\n    private loggingSpy: SinonSpy;\n    private userSpy: SinonSpy;\n    private _sessionPrefix: string = newId();\n    private trackSpy: SinonSpy;\n    private envelopeConstructorSpy: SinonSpy;\n\n    // Context\n    private tagKeys = new ContextTagKeys();\n    private _config;\n    private _appId: string;\n    private _ctx: any;\n\n\n    constructor(testName?: string) {\n        super(testName || \"ApplicationInsightsTests\");\n    }\n\n    protected _getTestConfig(sessionPrefix: string) {\n        let config: IConfiguration | IConfig = {\n            connectionString: ApplicationInsightsTests._connectionString,\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true,\n            maxBatchInterval: 2500,\n            disableExceptionTracking: false,\n            namePrefix: sessionPrefix,\n            enableCorsCorrelation: true,\n            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n            samplingPercentage: 50,\n            convertUndefined: \"test-value\",\n            disablePageUnloadEvents: [\"beforeunload\"],\n            extensionConfig: {\n                [\"AppInsightsCfgSyncPlugin\"]: {\n                    //cfgUrl: \"\"\n                }\n            }\n        };\n\n        return config;\n    }\n\n    public testInitialize() {\n        try {\n            this.isFetchPolyfill = fetch[\"polyfill\"];\n            this.useFakeServer = false;\n            this._config = this._getTestConfig(this._sessionPrefix);\n            this._ctx = {};\n\n            const init = new ApplicationInsights({\n                config: this._config\n            });\n            init.loadAppInsights();\n            this._ai = init;\n            this._ai.addTelemetryInitializer((item: ITelemetryItem) => {\n                Assert.equal(\"4.0\", item.ver, \"Telemetry items inside telemetry initializers should be in CS4.0 format\");\n            });\n\n            // Validate that the before unload event was not added\n            let unloadPresent = false;\n            let visibilityChangePresent = false;\n            let beforeUnloadPresent = false;\n            let theEvents = __getRegisteredEvents(window);\n            arrForEach(theEvents, (theEvent) => {\n                if (theEvent.name.startsWith(\"beforeunload\")) {\n                    beforeUnloadPresent = true;\n                }\n\n                if (theEvent.name.startsWith(\"unload\")) {\n                    unloadPresent = true;\n                }\n\n                if (theEvent.name.startsWith(\"visibilitychange\")) {\n                    visibilityChangePresent = true;\n                }\n            });\n\n            Assert.ok(!beforeUnloadPresent, \"The beforeunload event should not be present\");\n            Assert.ok(unloadPresent, \"The unload event should be present\");\n            Assert.ok(visibilityChangePresent, \"The visibilitychange event should be present\");\n\n            // Setup Sinon stuff\n            const sender: Sender = this._ai.getPlugin<Sender>(BreezeChannelIdentifier).plugin;\n            this.errorSpy = this.sandbox.spy(sender, '_onError');\n            this.successSpy = this.sandbox.spy(sender, '_onSuccess');\n            this.loggingSpy = this.sandbox.stub(this._ai['core'].logger, 'throwInternal');\n            this.trackSpy = this.sandbox.spy(this._ai.appInsights.core, 'track')\n            this.sandbox.stub((sender as any)._sample, 'isSampledIn').returns(true);\n            this.envelopeConstructorSpy = this.sandbox.spy(Sender, 'constructEnvelope');\n            console.log(\"* testInitialize()\");\n        } catch (e) {\n            console.error('Failed to initialize', e);\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ai && this._ai.unload) {\n            // force unload\n            this._ai.unload(false);\n        }\n\n        if (this._ai && this._ai[\"dependencies\"]) {\n            this._ai[\"dependencies\"].teardown();\n        }\n\n        console.log(\"* testCleanup(\" + (AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<null>\") + \")\");\n    }\n\n    public registerTests() {\n        this.addDynamicConfigTests();\n        this.addGenericE2ETests();\n        this.addAnalyticsApiTests();\n        this.addAsyncTests();\n        this.addDependencyPluginTests();\n        this.addPropertiesPluginTests();\n        this.addCDNOverrideTests();\n        this.addCdnMonitorTests();\n    }\n\n    public addGenericE2ETests(): void {\n        this.testCase({\n            name: 'E2E.GenericTests: ApplicationInsightsAnalytics is loaded correctly',\n            test: () => {\n                Assert.ok(this._ai, 'ApplicationInsights SDK exists');\n                // TODO: reenable this test when module is available from window w/o snippet\n                // Assert.deepEqual(this._ai, window[this._aiName], `AI is available from window.${this._aiName}`);\n\n                Assert.ok(this._ai.appInsights, 'App Analytics exists');\n                Assert.equal(true, this._ai.appInsights.isInitialized(), 'App Analytics is initialized');\n\n\n                Assert.ok(this._ai.appInsights.core, 'Core exists');\n                Assert.equal(true, this._ai.appInsights.core.isInitialized(),\n                    'Core is initialized');\n            }\n        });\n\n        this.testCase({\n            name: \"Check plugin version string\",\n            test: () => {\n                QUnit.assert.equal(0, this._ai.pluginVersionStringArr.length, \"Checking the array length\");\n                QUnit.assert.equal(\"\", this._ai.pluginVersionString);\n\n                // Add a versioned plugin\n                let testPlugin1 = new TestPlugin();\n                this._ai.addPlugin(testPlugin1);\n                QUnit.assert.equal(1, this._ai.pluginVersionStringArr.length, \"Checking the array length\");\n                QUnit.assert.equal(\"TestPlugin=0.99.1\", this._ai.pluginVersionString);\n\n                // Add a versioned plugin\n                let testPlugin2 = new TestPlugin();\n                testPlugin2.identifier = \"TestPlugin2\";\n                testPlugin2.version = \"1.2.3.4\";\n                this._ai.addPlugin(testPlugin2);\n                QUnit.assert.equal(2, this._ai.pluginVersionStringArr.length, \"Checking the array length\");\n                QUnit.assert.equal(\"TestPlugin=0.99.1;TestPlugin2=1.2.3.4\", this._ai.pluginVersionString);\n\n                // Add a versioned plugin\n                this._ai.getPlugin(\"TestPlugin\").remove();\n                QUnit.assert.equal(1, this._ai.pluginVersionStringArr.length, \"Checking the array length\");\n                QUnit.assert.equal(\"TestPlugin2=1.2.3.4\", this._ai.pluginVersionString);\n            }\n        });\n    }\n\n    public addDynamicConfigTests(): void {\n        this.testCase({\n            name: 'DynamicConfigTests: ApplicationInsights dynamic config works correctly',\n            useFakeTimers: true,\n            test: () => {\n                let config = this._ai.config;\n                let expectedIkey = ApplicationInsightsTests._instrumentationKey;\n                let expectedConnectionString = ApplicationInsightsTests._connectionString;\n                let expectedEndpointUrl = \"https://dc.services.visualstudio.com/v2/track\";\n                let expectedLoggingLevel = 10000;\n                Assert.ok(config, \"ApplicationInsights config exists\");\n                Assert.equal(expectedConnectionString, config.connectionString, \"connection string is set\");\n                Assert.equal(expectedIkey, config.instrumentationKey, \"ikey is set\");\n                Assert.equal(expectedLoggingLevel, config.diagnosticLogInterval, \"diagnosticLogInterval is set to 1000 by default\");\n                Assert.equal(expectedEndpointUrl, config.endpointUrl, \"endpoint url is set from connection string\");\n                Assert.equal(false, config.disableAjaxTracking, \"disableAjaxTracking is set to false\");\n\n                let onChangeCalled = 0;\n                let handler = this._ai.onCfgChange((details) => {\n                    onChangeCalled++;\n                    Assert.equal(expectedIkey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                    Assert.equal(expectedLoggingLevel, details.cfg.diagnosticLogInterval, \"Expect the diagnosticLogInterval to be set\");\n                });\n\n                Assert.equal(1, onChangeCalled, \"OnCfgChange was not called\");\n\n                expectedIkey = \"newIKey\";\n                config.instrumentationKey = expectedIkey;\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called again\");\n\n                expectedLoggingLevel = 2000;\n                config.diagnosticLogInterval = expectedLoggingLevel;\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);\n                Assert.equal(3, onChangeCalled, \"Expected the onChanged was called again\");\n\n                expectedConnectionString = \"InstrumentationKey=testKey\";\n                expectedIkey = \"testKey\";\n                config.connectionString = expectedConnectionString;\n                Assert.equal(3, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);\n                Assert.equal(4, onChangeCalled, \"Expected the onChanged was called again\");\n\n                // Remove the handler\n                handler.rm();\n            }\n        });\n\n        this.testCaseAsync({\n            name: \"Init: init with cs promise, when it is resolved and then change with cs string\",\n            stepDelay: 100,\n            useFakeTimers: true,\n            steps: [() => {\n\n                // unload previous one first\n                let oriInst = this._ai;\n                if (oriInst && oriInst.unload) {\n                    // force unload\n                    oriInst.unload(false);\n                }\n\n                if (oriInst && oriInst[\"dependencies\"]) {\n                    oriInst[\"dependencies\"].teardown();\n                }\n\n                this._config = this._getTestConfig(this._sessionPrefix);\n                let csPromise = createAsyncResolvedPromise(\"InstrumentationKey=testIkey;ingestionendpoint=testUrl\");\n                this._config.connectionString = csPromise;\n                this._config.initTimeOut = 80000;\n                this._ctx.csPromise = csPromise;\n\n\n                let init = new ApplicationInsights({\n                    config: this._config\n                });\n                init.loadAppInsights();\n                this._ai = init;\n                let config = this._ai.config;\n                let core = this._ai.core;\n                let status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending\");\n\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let core = this._ai.core\n                let activeStatus = core.activeStatus && core.activeStatus();\n                let csPromise = this._ctx.csPromise;\n                let config = this._ai.config;\n\n                if (csPromise.state === \"resolved\" && activeStatus === ActiveStatus.ACTIVE) {\n                    Assert.equal(\"testIkey\", core.config.instrumentationKey, \"ikey should be set\");\n                    Assert.equal(\"testUrl/v2/track\", core.config.endpointUrl, \"endpoint shoule be set\");\n\n                    config.connectionString = \"InstrumentationKey=testIkey1;ingestionendpoint=testUrl1\";\n                    this.clock.tick(1);\n                    let status = core.activeStatus && core.activeStatus();\n                    // promise is not resolved, no new changes applied\n                    Assert.equal(status, ActiveStatus.ACTIVE, \"status should be set to active test1\");\n                    return true;\n                }\n                return false;\n            }, \"Wait for promise response\" + new Date().toISOString(), 60) as any).concat(PollingAssert.createPollingAssert(() => {\n                let core = this._ai.core\n                let activeStatus = core.activeStatus && core.activeStatus();\n\n                if (activeStatus === ActiveStatus.ACTIVE) {\n                    Assert.equal(\"testIkey1\", core.config.instrumentationKey, \"ikey should be set test1\");\n                    Assert.equal(\"testUrl1/v2/track\", core.config.endpointUrl, \"endpoint shoule be set test1\");\n                    return true;\n                }\n                return false;\n            }, \"Wait for new string response\" + new Date().toISOString(), 60) as any)\n        });\n\n        this.testCaseAsync({\n            name: \"Init: init with cs promise and change with cs string at the same time\",\n            stepDelay: 100,\n            useFakeTimers: true,\n            steps: [() => {\n\n                // unload previous one first\n                let oriInst = this._ai;\n                if (oriInst && oriInst.unload) {\n                    // force unload\n                    oriInst.unload(false);\n                }\n\n                if (oriInst && oriInst[\"dependencies\"]) {\n                    oriInst[\"dependencies\"].teardown();\n                }\n\n                this._config = this._getTestConfig(this._sessionPrefix);\n                let csPromise = createAsyncResolvedPromise(\"InstrumentationKey=testIkey;ingestionendpoint=testUrl\");\n                this._config.connectionString = csPromise;\n                this._config.initTimeOut = 80000;\n                this._ctx.csPromise = csPromise;\n\n\n                let init = new ApplicationInsights({\n                    config: this._config\n                });\n                init.loadAppInsights();\n                this._ai = init;\n                let config = this._ai.config;\n                let core = this._ai.core;\n                let status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending\");\n\n                config.connectionString = \"InstrumentationKey=testIkey1;ingestionendpoint=testUrl1\";\n                this.clock.tick(1);\n                status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.ACTIVE, \"active status should be set to active in next executing cycle\");\n                // Assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending test1\");\n\n\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let core = this._ai.core\n                let activeStatus = core.activeStatus && core.activeStatus();\n\n                if (activeStatus === ActiveStatus.ACTIVE) {\n                    Assert.equal(\"testIkey\", core.config.instrumentationKey, \"ikey should be set\");\n                    Assert.equal(\"testUrl/v2/track\", core.config.endpointUrl, \"endpoint shoule be set\");\n                    return true;\n                }\n                return false;\n            }, \"Wait for promise response\" + new Date().toISOString(), 60) as any)\n        });\n\n\n        this.testCaseAsync({\n            name: \"Init: init with cs promise and offline channel\",\n            stepDelay: 100,\n            useFakeTimers: true,\n            steps: [() => {\n\n                // unload previous one first\n                let oriInst = this._ai;\n                if (oriInst && oriInst.unload) {\n                    // force unload\n                    oriInst.unload(false);\n                }\n\n                if (oriInst && oriInst[\"dependencies\"]) {\n                    oriInst[\"dependencies\"].teardown();\n                }\n\n                this._config = this._getTestConfig(this._sessionPrefix);\n                let csPromise = createAsyncResolvedPromise(\"InstrumentationKey=testIkey;ingestionendpoint=testUrl\");\n                this._config.connectionString = csPromise;\n                let offlineChannel = new OfflineChannel();\n                this._config.channels = [[offlineChannel]];\n                this._config.initTimeOut = 80000;\n\n\n                let init = new ApplicationInsights({\n                    config: this._config\n                });\n                init.loadAppInsights();\n                this._ai = init;\n                let config = this._ai.config;\n                let core = this._ai.core;\n                let status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending\");\n\n\n                config.connectionString = \"InstrumentationKey=testIkey1;ingestionendpoint=testUrl1\"\n                this.clock.tick(1);\n                status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.ACTIVE, \"active status should be set to active in next executing cycle\");\n                // Assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending test1\");\n\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let core = this._ai.core\n                let activeStatus = core.activeStatus && core.activeStatus();\n\n                if (activeStatus === ActiveStatus.ACTIVE) {\n                    Assert.equal(\"testIkey\", core.config.instrumentationKey, \"ikey should be set\");\n                    Assert.equal(\"testUrl/v2/track\", core.config.endpointUrl, \"endpoint shoule be set\");\n                    let sendChannel = this._ai.getPlugin(BreezeChannelIdentifier);\n                    let offlineChannelPlugin = this._ai.getPlugin(\"OfflineChannel\").plugin;\n                    Assert.equal(sendChannel.plugin.isInitialized(), true, \"sender is initialized\");\n                    Assert.equal(offlineChannelPlugin.isInitialized(), true, \"offline channel is initialized\");\n                    let urlConfig = offlineChannelPlugin[\"_getDbgPlgTargets\"]()[0];\n                    Assert.ok(urlConfig, \"offline url config is initialized\");\n                    return true;\n                }\n                return false;\n            }, \"Wait for promise response\" + new Date().toISOString(), 60) as any)\n        });\n\n\n\n        this.testCaseAsync({\n            name: \"Init: init with cs string, change with cs promise\",\n            stepDelay: 100,\n            useFakeTimers: true,\n            steps: [() => {\n                let config = this._ai.config;\n                let expectedIkey = ApplicationInsightsTests._instrumentationKey;\n                let expectedConnectionString = ApplicationInsightsTests._connectionString;\n                let expectedEndpointUrl = \"https://dc.services.visualstudio.com/v2/track\";\n                Assert.ok(config, \"ApplicationInsights config exists\");\n                Assert.equal(expectedConnectionString, config.connectionString, \"connection string is set\");\n                Assert.equal(expectedIkey, config.instrumentationKey, \"ikey is set\");\n                Assert.equal(expectedEndpointUrl, config.endpointUrl, \"endpoint url is set from connection string\");\n                let core = this._ai.core;\n                let status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.ACTIVE, \"status should be set to active\");\n\n                let csPromise = createAsyncResolvedPromise(\"InstrumentationKey=testIkey;ingestionendpoint=testUrl\");\n                config.connectionString = csPromise;\n                config.initTimeOut = 80000;\n                this.clock.tick(1);\n                status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.ACTIVE, \"active status should be set to active in next executing cycle\");\n                //Assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending\");\n\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let core = this._ai.core\n                let activeStatus = core.activeStatus && core.activeStatus();\n\n                if (activeStatus === ActiveStatus.ACTIVE) {\n                    Assert.equal(\"testIkey\", core.config.instrumentationKey, \"ikey should be set\");\n                    Assert.equal(\"testUrl/v2/track\", core.config.endpointUrl, \"endpoint shoule be set\");\n                    return true;\n                }\n                return false;\n            }, \"Wait for promise response\" + new Date().toISOString(), 60) as any)\n        });\n\n        this.testCaseAsync({\n            name: \"Init: init with cs null, ikey promise, endpoint promise\",\n            stepDelay: 100,\n            useFakeTimers: true,\n            steps: [() => {\n\n                // unload previous one first\n                let oriInst = this._ai;\n                if (oriInst && oriInst.unload) {\n                    // force unload\n                    oriInst.unload(false);\n                }\n\n                if (oriInst && oriInst[\"dependencies\"]) {\n                    oriInst[\"dependencies\"].teardown();\n                }\n\n                this._config = this._getTestConfig(this._sessionPrefix);\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey\");\n                let endpointPromise = createAsyncResolvedPromise(\"testUrl\");\n                //let csPromise = createAsyncResolvedPromise(\"InstrumentationKey=testIkey;ingestionendpoint=testUrl\");\n                //this._config.connectionString = csPromise;\n                this._config.connectionString = null;\n                this._config.instrumentationKey = ikeyPromise;\n                this._config.endpointUrl = endpointPromise;\n                this._config.initTimeOut = 80000;\n\n\n\n                let init = new ApplicationInsights({\n                    config: this._config\n                });\n                init.loadAppInsights();\n                this._ai = init;\n                let config = this._ai.config;\n                let core = this._ai.core;\n                let status = core.activeStatus && core.activeStatus();\n                Assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending\");\n                Assert.equal(config.connectionString, null, \"connection string shoule be null\");\n\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let core = this._ai.core\n                let activeStatus = core.activeStatus && core.activeStatus();\n\n                if (activeStatus === ActiveStatus.ACTIVE) {\n                    Assert.equal(\"testIkey\", core.config.instrumentationKey, \"ikey should be set\");\n                    Assert.equal(\"testUrl\", core.config.endpointUrl, \"endpoint shoule be set\");\n                    return true;\n                }\n                return false;\n            }, \"Wait for promise response\" + new Date().toISOString(), 60) as any)\n        });\n\n\n        this.testCase({\n            name: \"CfgSync DynamicConfigTests: Prod CDN is Fetched and feature is turned on/off as expected\",\n            useFakeTimers: true,\n            test: () => {\n                let fetchcalled = 0;\n                let overrideFetchFn = (url: string, oncomplete: any, isAutoSync?: boolean) => {\n                    fetchcalled++;\n                    Assert.equal(url, CONFIG_ENDPOINT_URL, \"fetch should be called with prod cdn\");\n                };\n                let config = {\n                    instrumentationKey: \"testIKey\",\n                    extensionConfig: {\n                        [\"AppInsightsCfgSyncPlugin\"]: {\n                            overrideFetchFn: overrideFetchFn\n                        }\n\n                    }\n                } as IConfiguration & IConfig;\n                let ai = new ApplicationInsights({ config: config });\n                ai.loadAppInsights();\n\n                ai.config.extensionConfig = ai.config.extensionConfig || {};\n                let extConfig = ai.config.extensionConfig[\"AppInsightsCfgSyncPlugin\"];\n                Assert.equal(extConfig.cfgUrl, CONFIG_ENDPOINT_URL, \"default cdn endpoint should be set\");\n                Assert.equal(extConfig.syncMode, 2, \"default mode should be set to receive\");\n\n                let featureOptIn = config.featureOptIn || {};\n                Assert.equal(featureOptIn[\"iKeyUsage\"].mode, FeatureOptInMode.enable, \"ikey message should be turned on\");\n\n                Assert.equal(fetchcalled, 1, \"fetch should be called once\");\n                config.extensionConfig = config.extensionConfig || {};\n                let expectedTimeout = 2000000000;\n                config.extensionConfig[\"AppInsightsCfgSyncPlugin\"].scheduleFetchTimeout = expectedTimeout;\n                this.clock.tick(1);\n\n                extConfig = ai.config.extensionConfig[\"AppInsightsCfgSyncPlugin\"];\n                Assert.equal(extConfig.scheduleFetchTimeout, expectedTimeout, \"timeout should be changes dynamically\");\n                ai.unload(false);\n                if (ai && ai[\"dependencies\"]) {\n                    ai[\"dependencies\"].teardown();\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Init Promise: Offline Support can be added and initialized with endpoint url\",\n            useFakeTimers: true,\n            test: () => {\n                this.clock.tick(1);\n                // if fake timer is turned on, session data will return 0 and will throw sesson not renew error\n                let offlineChannel = new OfflineChannel();\n                let config = {\n                    instrumentationKey: \"testIKey\",\n                    endpointUrl: \"testUrl\",\n                    extensionConfig: {\n                        [\"AppInsightsCfgSyncPlugin\"]: {\n                            cfgUrl: \"\"\n                        }\n\n                    },\n                    extensions: [offlineChannel]\n                } as IConfiguration & IConfig;\n                let ai = new ApplicationInsights({ config: config });\n                ai.loadAppInsights();\n                this.clock.tick(1);\n\n                let sendChannel = ai.getPlugin(BreezeChannelIdentifier);\n                let offlineChannelPlugin = ai.getPlugin(\"OfflineChannel\").plugin;\n                Assert.equal(sendChannel.plugin.isInitialized(), true, \"sender is initialized\");\n                Assert.equal(offlineChannelPlugin.isInitialized(), true, \"offline channel is initialized\");\n                let urlConfig = offlineChannelPlugin[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(urlConfig, \"offline url config is initialized\");\n\n                ai.unload(false);\n                if (ai && ai[\"dependencies\"]) {\n                    ai[\"dependencies\"].teardown();\n                }\n                //offlineChannel.teardown();\n\n            }\n        });\n\n        this.testCase({\n            name: \"Init Promise: Offline Support can be added and initialized with channels\",\n            useFakeTimers: true,\n            test: () => {\n                this.clock.tick(1);\n                let offlineChannel = new OfflineChannel();\n                let config = {\n                    instrumentationKey: \"testIKey\",\n                    endpointUrl: \"testUrl\",\n                    extensionConfig: {\n                        [\"AppInsightsCfgSyncPlugin\"]: {\n                            cfgUrl: \"\"\n                        }\n\n                    },\n                    channels: [[offlineChannel]]\n                } as IConfiguration & IConfig;\n                let ai = new ApplicationInsights({ config: config });\n                ai.loadAppInsights();\n                this.clock.tick(1);\n\n                let sendChannel = ai.getPlugin(BreezeChannelIdentifier);\n                let offlineChannelPlugin = ai.getPlugin(\"OfflineChannel\").plugin;\n                Assert.equal(sendChannel.plugin.isInitialized(), true, \"sender is initialized\");\n                Assert.equal(offlineChannelPlugin.isInitialized(), true, \"offline channel is initialized\");\n                let urlConfig = offlineChannelPlugin[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(urlConfig, \"offline url config is initialized\");\n\n\n                ai.unload(false);\n                if (ai && ai[\"dependencies\"]) {\n                    ai[\"dependencies\"].teardown();\n                }\n\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSync DynamicConfigTests: Offline Support can be added and initialized without endpoint url\",\n            useFakeTimers: true,\n            test: () => {\n                this.clock.tick(1);\n                let offlineChannel = new OfflineChannel();\n                let config = {\n                    connectionString: \"InstrumentationKey=testIKey\",\n                    extensionConfig: {\n                        [\"AppInsightsCfgSyncPlugin\"]: {\n                            cfgUrl: \"\"\n                        }\n\n                    },\n                    channels: [[offlineChannel]]\n                } as IConfiguration & IConfig;\n                let ai = new ApplicationInsights({ config: config });\n                ai.loadAppInsights();\n                this.clock.tick(1);\n\n                let sendChannel = ai.getPlugin(BreezeChannelIdentifier);\n                let offlineChannelPlugin = ai.getPlugin(\"OfflineChannel\").plugin;\n                Assert.equal(sendChannel.plugin.isInitialized(), true, \"sender is initialized\");\n                Assert.equal(offlineChannelPlugin.isInitialized(), true, \"offline channel is initialized\");\n                let urlConfig = offlineChannelPlugin[\"_getDbgPlgTargets\"]()[0];\n\n                this.clock.tick(1);\n                Assert.ok(urlConfig, \"offline url config is initialized\");\n\n                ai.unload(false);\n                if (ai && ai[\"dependencies\"]) {\n                    ai[\"dependencies\"].teardown();\n                }\n            }\n        });\n\n    }\n\n    public addCDNOverrideTests(): void {\n        this.testCase({\n            name: 'CDNOverrideTests: customer could overwrite the url endpoint',\n            useFakeTimers: true,\n            test: () => {\n                let ingestionendpoint = \"https://dc.services.visualstudio.com\";\n                this._ai.config.connectionString = \"InstrumentationKey=xxx;IngestionEndpoint=\" + ingestionendpoint + \";LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\"\n                this.clock.tick(100);\n                Assert.deepEqual(this._ai.config.endpointUrl, ingestionendpoint + \"/v2/track\", \"endpoint url is set from connection string\");\n                this._ai.config.userOverrideEndpointUrl = \"https://custom.endpoint\";\n                this.clock.tick(100);\n                Assert.deepEqual(this._ai.config.endpointUrl, this._ai.config.userOverrideEndpointUrl, \"endpoint url is override by userOverrideEndpointUrl\");\n            }\n        });\n    }\n\n    public addAnalyticsApiTests(): void {\n        this.testCase({\n            name: 'E2E.AnalyticsApiTests: Public Members exist',\n            test: () => {\n                ApplicationInsightsTests._expectedTrackMethods.forEach(method => {\n                    Assert.ok(this._ai[method], `${method} exists`);\n                    Assert.equal('function', typeof this._ai[method], `${method} is a function`);\n                });\n            }\n        });\n    }\n\n    public addCdnMonitorTests(): void {\n        this.testCaseAsync({\n            name: \"E2E.GenericTests: Fetch Current CDN V3\",\n            stepDelay: 1,\n            useFakeServer: false,\n            useFakeFetch: false,\n            fakeFetchAutoRespond: false,\n            steps: [() => {\n                // Use beta endpoint to pre-test any changes before public V3 cdn\n                let random = utcNow();\n                // Under Cors Mode, Options request will be auto-triggered\n                try {\n                    fetch(`https://js.monitor.azure.com/beta/ai.3.gbl.min.js?${random}`, {\n                        method: \"GET\"\n                    }).then((res) => {\n                        this._ctx.res = res;\n                        res.text().then((val) => {\n                            this._ctx.val = val;\n                        });\n                    });\n                } catch (e) {\n                    Assert.ok(false, \"Fetch Error: \" + e);\n                }\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n\n                if (this._ctx && this._ctx.res && this._ctx.val) {\n                    let res = this._ctx.res;\n                    let status = res.status;\n                    if (status === 200) {\n                        // for Response headers:\n                        // content-type: text/javascript; charset=utf-8\n                        // x-ms-meta-aijssdksrc: should present\n                        // x-ms-meta-aijssdkver should present\n                        let headers = res.headers;\n                        let headerCnt = 0;\n                        headers.forEach((val, key) => {\n                            if (key === \"content-type\") {\n                                Assert.deepEqual(val, \"text/javascript; charset=utf-8\", \"should have correct content-type response header\");\n                                headerCnt++;\n                            }\n                            if (key === \"x-ms-meta-aijssdksrc\") {\n                                Assert.ok(val, \"should have sdk src response header\");\n                                headerCnt++;\n                            }\n                            if (key === \"x-ms-meta-aijssdkver\") {\n                                Assert.ok(val, \"should have version number for response header\");\n                                headerCnt++;\n                            }\n                        });\n                        Assert.equal(headerCnt, 3, \"all expected headers should be present\");\n                        return true;\n                    }\n                    return false;\n                }\n                return false;\n            }, \"Wait for response\" + new Date().toISOString(), 60) as any)\n        });\n\n        this.testCaseAsync({\n            name: \"E2E.GenericTests: Fetch Current CDN V2\",\n            stepDelay: 1,\n            useFakeServer: false,\n            useFakeFetch: false,\n            fakeFetchAutoRespond: false,\n            steps: [() => {\n                // Use public endpoint for V2\n                let random = utcNow();\n                // Under Cors Mode, Options request will be triggered\n                fetch(`https://js.monitor.azure.com/scripts/b/ai.2.gbl.min.js?${random}`, {\n                    method: \"GET\"\n                }).then((res) => {\n                    this._ctx.res = res;\n                    res.text().then((val) => {\n                        this._ctx.val = val;\n                    });\n                });\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n                if (this._ctx && this._ctx.res && this._ctx.val) {\n                    let res = this._ctx.res;\n                    let status = res.status;\n                    if (status === 200) {\n                        // for Response headers:\n                        // content-type: text/javascript; charset=utf-8\n                        // x-ms-meta-aijssdksrc: should present\n                        // x-ms-meta-aijssdkver should present\n                        let headers = res.headers;\n                        let headerCnt = 0;\n                        headers.forEach((val, key) => {\n                            if (key === \"content-type\") {\n                                Assert.deepEqual(val, \"text/javascript; charset=utf-8\", \"should have correct content-type response header\");\n                                headerCnt++;\n                            }\n                            if (key === \"x-ms-meta-aijssdksrc\") {\n                                Assert.ok(val, \"should have sdk src response header\");\n                                headerCnt++;\n                            }\n                            if (key === \"x-ms-meta-aijssdkver\") {\n                                Assert.ok(val, \"should have version number for response header\");\n                                headerCnt++;\n                            }\n                        });\n                        Assert.equal(headerCnt, 3, \"all expected headers should be present\");\n                        return true;\n                    }\n                    return false;\n                }\n                return false;\n            }, \"Wait for response\" + new Date().toISOString(), 60) as any)\n        });\n\n        this.testCase({\n            name: \"E2E.GenericTests: Fetch Static Web js0 - CDN V3\",\n            useFakeServer: false,\n            useFakeFetch: false,\n            fakeFetchAutoRespond: false,\n            test: async () => {\n                // Use beta endpoint to pre-test any changes before public V3 cdn\n                let random = utcNow();\n                // Under Cors Mode, Options request will be auto-triggered\n                try {\n                    let res = await fetch(`https://js0.tst.applicationinsights.io/scripts/b/ai.3.gbl.min.js?${random}`, {\n                        method: \"GET\"\n                    });\n\n                    if (res.ok) {\n                        let val = await res.text();\n                        Assert.ok(val, \"Response text should be returned\");\n                    } else {\n                        Assert.fail(\"Fetch failed with status: \" + dumpObj(res));\n                    }\n                } catch (e) {\n                    Assert.fail(\"Fetch Error: \" + dumpObj(e));\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E.GenericTests: Fetch Static Web js1 - CDN V3\",\n            useFakeServer: false,\n            useFakeFetch: false,\n            fakeFetchAutoRespond: false,\n            test: async () => {\n                // Use beta endpoint to pre-test any changes before public V3 cdn\n                let random = utcNow();\n                // Under Cors Mode, Options request will be auto-triggered\n                try {\n                    let res = await fetch(`https://js1.tst.applicationinsights.io/scripts/b/ai.3.gbl.min.js?${random}`, {\n                        method: \"GET\"\n                    });\n\n                    if (res.ok) {\n                        let val = await res.text();\n                        Assert.ok(val, \"Response text should be returned\");\n                    } else {\n                        Assert.fail(\"Fetch failed with status: \" + dumpObj(res));\n                    }\n                } catch (e) {\n                    this._ctx.err = e;\n                    Assert.fail(\"Fetch Error: \" + dumpObj(e));\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"E2E.GenericTests: Fetch Static Web js2 - CDN V3\",\n            useFakeServer: false,\n            useFakeFetch: false,\n            fakeFetchAutoRespond: false,\n            test: async () => {\n                // Use beta endpoint to pre-test any changes before public V3 cdn\n                let random = utcNow();\n                // Under Cors Mode, Options request will be auto-triggered\n                try {\n                    let res = await fetch(`https://js2.tst.applicationinsights.io/scripts/b/ai.3.gbl.min.js?${random}`, {\n                        method: \"GET\"\n                    });\n\n                    if (res.ok) {\n                        let val = await res.text();\n                        Assert.ok(val, \"Response text should be returned\");\n                    } else {\n                        Assert.fail(\"Fetch failed with status: \" + dumpObj(res));\n                    }\n                } catch (e) {\n                    Assert.fail(\"Fetch Error: \" + dumpObj(e));\n                }\n            }\n        });\n    }\n\n    public addAsyncTests(): void {\n        this.testCaseAsync({\n            name: \"E2E.GenericTests: Send events with offline support\",\n            stepDelay: 1,\n            steps: [() => {\n                let offlineChannel = new OfflineChannel();\n                this._ai.addPlugin(offlineChannel);\n                this._ctx.offlineChannel = offlineChannel;\n\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let offlineChannel = this._ctx.offlineChannel;\n                if (offlineChannel && offlineChannel.isInitialized()) {\n                    let urlConfig = offlineChannel[\"_getDbgPlgTargets\"]()[0];\n                    Assert.ok(urlConfig, \"offline url config is initialized\");\n\n                    let offlineListener = offlineChannel.getOfflineListener() as any;\n                    Assert.ok(offlineListener, \"offlineListener should be initialized\");\n\n                    // online\n                    offlineListener.setOnlineState(1);\n                    let inMemoTimer = offlineChannel[\"_getDbgPlgTargets\"]()[3];\n                    Assert.ok(!inMemoTimer, \"offline in memo timer should be null\");\n                    this._ai.trackEvent({ name: \"online event\", properties: { \"prop1\": \"value1\" }, measurements: { \"measurement1\": 200 } });\n\n                    // set to offline status right way\n                    offlineListener.setOnlineState(2);\n                    this._ai.trackEvent({ name: \"offline event\", properties: { \"prop2\": \"value2\" }, measurements: { \"measurement2\": 200 } });\n                    inMemoTimer = offlineChannel[\"_getDbgPlgTargets\"]()[3];\n                    Assert.ok(inMemoTimer, \"in memo timer should not be null\");\n                    let inMemoBatch = offlineChannel[\"_getDbgPlgTargets\"]()[1][EventPersistence.Normal];\n                    Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one event\");\n\n                    return true\n                }\n                return false\n            }, \"Wait for init\" + new Date().toISOString(), 60) as any).concat(this.asserts(1)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(payload && payload.iKey);\n                    Assert.equal(ApplicationInsightsTests._instrumentationKey, payload.iKey, \"payload ikey is not set correctly\");\n                    Assert.ok(data && data.baseData && data.baseData.properties[\"prop1\"]);\n                    Assert.ok(data && data.baseData && data.baseData.measurements[\"measurement1\"]);\n                }\n            })\n        });\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackEvent sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                this._ai.trackEvent({ name: 'event', properties: { \"prop1\": \"value1\" }, measurements: { \"measurement1\": 200 } });\n            }].concat(this.asserts(1)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(payload && payload.iKey);\n                    Assert.equal(ApplicationInsightsTests._instrumentationKey, payload.iKey, \"payload ikey is not set correctly\");\n                    Assert.ok(data && data.baseData && data.baseData.properties[\"prop1\"]);\n                    Assert.ok(data && data.baseData && data.baseData.measurements[\"measurement1\"]);\n                }\n            })\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackTrace sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                this._ai.trackTrace({ message: 'trace', properties: { \"foo\": \"bar\", \"prop2\": \"value2\" } });\n            }].concat(this.asserts(1)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                const payload = JSON.parse(payloadStr[0]);\n                const data = payload.data;\n                Assert.ok(data && data.baseData &&\n                    data.baseData.properties[\"foo\"] && data.baseData.properties[\"prop2\"]);\n                Assert.equal(\"bar\", data.baseData.properties[\"foo\"]);\n                Assert.equal(\"value2\", data.baseData.properties[\"prop2\"]);\n            })\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: legacy trackException sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    exception = e;\n                    this._ai.trackException({ error: exception } as any);\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with auto telemetry sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    // Simulating window.onerror option\n                    let autoTelemetry = {\n                        message: e.message,\n                        url: \"https://dummy.auto.example.com\",\n                        lineNumber: 42,\n                        columnNumber: 53,\n                        error: e,\n                        evt: null\n                    } as IAutoExceptionTelemetry;\n\n                    exception = e;\n                    this._ai.trackException({ exception: autoTelemetry });\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with auto telemetry sends to backend with custom properties',\n            stepDelay: 1,\n            steps: [() => {\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    // Simulating window.onerror option\n                    let autoTelemetry = {\n                        message: e.message,\n                        url: \"https://dummy.auto.example.com\",\n                        lineNumber: 42,\n                        columnNumber: 53,\n                        error: e,\n                        evt: null\n                    } as IAutoExceptionTelemetry;\n\n                    exception = e;\n                    this._ai.trackException({ exception: autoTelemetry }, { custom: \"custom value\" });\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with message only sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    // Simulating window.onerror option\n                    let autoTelemetry = {\n                        message: e.toString(),\n                        url: \"https://dummy.message.example.com\",\n                        lineNumber: 42,\n                        columnNumber: 53,\n                        error: e.toString(),\n                        evt: null\n                    } as IAutoExceptionTelemetry;\n\n                    exception = e;\n                    this._ai.trackException({ exception: autoTelemetry });\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with message holding error sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    // Simulating window.onerror option\n                    let autoTelemetry = {\n                        message: e,\n                        url: \"https://dummy.error.example.com\",\n                        lineNumber: 42,\n                        columnNumber: 53,\n                        error: undefined,\n                        evt: null\n                    } as IAutoExceptionTelemetry;\n\n                    try {\n                        exception = e;\n                        this._ai.trackException({ exception: autoTelemetry });\n                    } catch (e) {\n                        console.log(e);\n                        console.log(e.stack);\n                        Assert.ok(false, e.stack);\n                    }\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with message holding error sends to backend with custom properties',\n            stepDelay: 1,\n            steps: [() => {\n                let exception: Error = null;\n                try {\n                    window['a']['b']();\n                    Assert.ok(false, 'trackException test not run');\n                } catch (e) {\n                    // Simulating window.onerror option\n                    let autoTelemetry = {\n                        message: e,\n                        url: \"https://dummy.error.example.com\",\n                        lineNumber: 42,\n                        columnNumber: 53,\n                        error: undefined,\n                        evt: null\n                    } as IAutoExceptionTelemetry;\n\n                    try {\n                        exception = e;\n                        this._ai.trackException({ exception: autoTelemetry }, { custom: \"custom value\" });\n                    } catch (e) {\n                        console.log(e);\n                        console.log(e.stack);\n                        Assert.ok(false, e.stack);\n                    }\n                }\n                Assert.ok(exception);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with no Error sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                let autoTelemetry = {\n                    message: \"Test Message\",\n                    url: \"https://dummy.no.error.example.com\",\n                    lineNumber: 42,\n                    columnNumber: 53,\n                    error: this,\n                    evt: null\n                } as IAutoExceptionTelemetry;\n                this._ai.trackException({ exception: autoTelemetry });\n                Assert.ok(autoTelemetry);\n            }].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with CustomError sends to backend',\n            stepDelay: 1,\n            steps: [() => {\n                this._ai.trackException({ id: \"testID\", exception: new CustomTestError(\"Test Custom Error!\") });\n            }].concat(this.asserts(1)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(data, \"Has Data\");\n                    if (data) {\n                        Assert.ok(data.baseData, \"Has BaseData\");\n                        let baseData = data.baseData;\n                        if (baseData) {\n                            const ex = baseData.exceptions[0];\n                            Assert.ok(ex.message.indexOf(\"Test Custom Error!\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                            Assert.ok(ex.message.indexOf(\"CustomTestError\") !== -1, \"Make sure the error type is present [\" + ex.message + \"]\");\n                            Assert.equal(\"CustomTestError\", ex.typeName, \"Got the correct typename\");\n                            Assert.ok(ex.stack.length > 0, \"Has stack\");\n                            Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                            Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n                            Assert.equal(baseData.properties.id, \"testID\", \"Make sure the error message id is present [\" + baseData.properties + \"]\");\n                        }\n                    }\n                }\n            })\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException will keep id from the original exception',\n            stepDelay: 1,\n            steps: [() => {\n                this._ai.trackException({ id: \"testId\", error: new Error(\"test local exception\"), severityLevel: 3 });\n            }].concat(this.asserts(1)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(data, \"Has Data\");\n                    if (data) {\n                        Assert.ok(data.baseData, \"Has BaseData\");\n                        let baseData = data.baseData;\n                        if (baseData) {\n                            const ex = baseData.exceptions[0];\n                            console.log(JSON.stringify(baseData.properties));\n                            Assert.equal(baseData.properties.id, \"testId\", \"Make sure the error message id is present [\" + ex.properties + \"]\");\n                        }\n                    }\n                }\n            })\n        });\n\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: trackException with CustomError sends to backend with custom properties',\n            stepDelay: 1,\n            steps: [() => {\n                this._ai.trackException({ exception: new CustomTestError(\"Test Custom Error!\") }, { custom: \"custom value\" });\n            }].concat(this.asserts(1)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(data, \"Has Data\");\n                    if (data) {\n                        Assert.ok(data.baseData, \"Has BaseData\");\n                        let baseData = data.baseData;\n                        if (baseData) {\n                            const ex = baseData.exceptions[0];\n                            Assert.ok(ex.message.indexOf(\"Test Custom Error!\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                            Assert.ok(ex.message.indexOf(\"CustomTestError\") !== -1, \"Make sure the error type is present [\" + ex.message + \"]\");\n                            Assert.equal(\"CustomTestError\", ex.typeName, \"Got the correct typename\");\n                            Assert.ok(ex.stack.length > 0, \"Has stack\");\n                            Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                            Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n\n                            Assert.ok(baseData.properties, \"Has BaseData properties\");\n                            Assert.equal(baseData.properties.custom, \"custom value\");\n                        }\n                    }\n                }\n            })\n        });\n\n        this.testCaseAsync({\n            name: \"E2E.GenericTests: trackException with multiple stack frame formats\",\n            stepDelay: 1,\n            steps: [() => {\n                let errObj = {\n                    name: \"E2E.GenericTests\",\n                    reason: {\n                        message: \"Test_Error_Throwing_Inside_UseCallback\",\n                        stack: \"Error: Test_Error_Throwing_Inside_UseCallback\\n\" +\n                            \"at http://localhost:3000/static/js/main.206f4846.js:2:296748\\n\" +                      // Anonymous function with no function name attribution (firefox/ios)\n                            \"at Object.Re (http://localhost:3000/static/js/main.206f4846.js:2:16814)\\n\" +           // With class.function attribution\n                            \"at je (http://localhost:3000/static/js/main.206f4846.js:2:16968)\\n\" +                  // With function name attribution\n                            \"at Object.<anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:42819)\\n\" +  // With Object.<anonymous> attribution\n                            \"at Object.<anonymous> (../localfile.js:2:1234)\\n\" +                                    // With Object.<anonymous> attribution and local file                  \n                            \"at (anonymous) @ VM60:1\\n\" +                                                           // With (anonymous) attribution            \n                            \"at [native code]\\n\" +                                                                  // With [native code] attribution\n                            \"at (at eval at <anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:296748), <anonymous>:1:1)\\n\" + // With eval attribution\n                            \"at Object.eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\\n\" +        // With eval attribution\n                            \"at eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\\n\" +               // With eval attribution\n                            \"at eval (webpack-internal:///./src/App.tsx:1:1)\\n\" +                                   // With eval attribution\n                            \"at [arguments not available])@file://localhost/stacktrace.js:21\\n\" +                   // With arguments not available attribution\n                            \"at file://C:/Temp/stacktrace.js:27:1\\n\" +                                              // With file://localhost attribution\n                            \" Line 21 of linked script file://localhost/C:/Temp/stacktrace.js\\n\" +                  // With Line 21 of linked script attribution\n                            \" Line 11 of inline#1 script in http://localhost:3000/static/js/main.206f4846.js:2:296748\\n\" + // With Line 11 of inline#1 script attribution\n                            \" Line 68 of inline#2 script in file://localhost/teststack.html\\n\" +                    // With Line 68 of inline#2 script attribution\n                            \"at Function.Module._load (module.js:407:3)\\n\" +\n                            \" at Function.Module.runMain (module.js:575:10)\\n\" +\n                            \" at startup (node.js:159:18)\\n\" +\n                            \"at Global code (http://example.com/stacktrace.js:11:1)\\n\" +\n                            \"at Object.Module._extensions..js (module.js:550:10)\\n\" +\n                            \"   at c@http://example.com/stacktrace.js:9:3\\n\" +\n                            \"   at b@http://example.com/stacktrace.js:6:3\\n\" +\n                            \"   at a@http://example.com/stacktrace.js:3:3\\n\" +\n                            \"http://localhost:3000/static/js/main.206f4846.js:2:296748\\n\" +                      // Anonymous function with no function name attribution (firefox/ios)\n                            \"   c@http://example.com/stacktrace.js:9:3\\n\" +\n                            \"   b@http://example.com/stacktrace.js:6:3\\n\" +\n                            \"   a@http://example.com/stacktrace.js:3:3\\n\" +\n                            \"  at Object.testMethod (http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:53058:48)\"\n                    }\n                };\n\n                let exception = Exception.CreateAutoException(\"Test_Error_Throwing_Inside_UseCallback\",\n                    \"url\",\n                    9,\n                    0,\n                    errObj\n                );\n                this._ai.trackException({ exception: exception }, { custom: \"custom value\" });\n            }].concat(this.asserts(1)).concat(() => {\n\n                const expectedParsedStack: IStackFrame[] = [\n                    { level: 0, method: \"<no_method>\", assembly: \"at http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 1, method: \"Object.Re\", assembly: \"at Object.Re (http://localhost:3000/static/js/main.206f4846.js:2:16814)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 2, method: \"je\", assembly: \"at je (http://localhost:3000/static/js/main.206f4846.js:2:16968)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 3, method: \"Object.<anonymous>\", assembly: \"at Object.<anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:42819)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 4, method: \"Object.<anonymous>\", assembly: \"at Object.<anonymous> (../localfile.js:2:1234)\", fileName: \"../localfile.js\", line: 2 },\n                    { level: 5, method: \"<anonymous>\", assembly: \"at (anonymous) @ VM60:1\", fileName: \"VM60\", line: 1 },\n                    { level: 6, method: \"<no_method>\", assembly: \"at [native code]\", fileName: \"\", line: 0 },\n                    { level: 7, method: \"<no_method>\", assembly: \"at (at eval at <anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:296748), <anonymous>:1:1)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 8, method: \"Object.eval\", assembly: \"at Object.eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 9, method: \"eval\", assembly: \"at eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 10, method: \"eval\", assembly: \"at eval (webpack-internal:///./src/App.tsx:1:1)\", fileName: \"webpack-internal:///./src/App.tsx\", line: 1 },\n                    { level: 11, method: \"<no_method>\", assembly: \"at [arguments not available])@file://localhost/stacktrace.js:21\", fileName: \"file://localhost/stacktrace.js\", line: 21 },\n                    { level: 12, method: \"<no_method>\", assembly: \"at file://C:/Temp/stacktrace.js:27:1\", fileName: \"file://C:/Temp/stacktrace.js\", line: 27 },\n                    { level: 13, method: \"<no_method>\", assembly: \"Line 21 of linked script file://localhost/C:/Temp/stacktrace.js\", fileName: \"file://localhost/C:/Temp/stacktrace.js\", line: 0 },\n                    { level: 14, method: \"<no_method>\", assembly: \"Line 11 of inline#1 script in http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 15, method: \"<no_method>\", assembly: \"Line 68 of inline#2 script in file://localhost/teststack.html\", fileName: \"file://localhost/teststack.html\", line: 0 },\n                    { level: 16, method: \"Function.Module._load\", assembly: \"at Function.Module._load (module.js:407:3)\", fileName: \"module.js\", line: 407 },\n                    { level: 17, method: \"Function.Module.runMain\", assembly: \"at Function.Module.runMain (module.js:575:10)\", fileName: \"module.js\", line: 575 },\n                    { level: 18, method: \"startup\", assembly: \"at startup (node.js:159:18)\", fileName: \"node.js\", line: 159 },\n                    { level: 19, method: \"<no_method>\", assembly: \"at Global code (http://example.com/stacktrace.js:11:1)\", fileName: \"http://example.com/stacktrace.js\", line: 11 },\n                    { level: 20, method: \"Object.Module._extensions..js\", assembly: \"at Object.Module._extensions..js (module.js:550:10)\", fileName: \"module.js\", line: 550 },\n                    { level: 21, method: \"c\", assembly: \"at c@http://example.com/stacktrace.js:9:3\", fileName: \"http://example.com/stacktrace.js\", line: 9 },\n                    { level: 22, method: \"b\", assembly: \"at b@http://example.com/stacktrace.js:6:3\", fileName: \"http://example.com/stacktrace.js\", line: 6 },\n                    { level: 23, method: \"a\", assembly: \"at a@http://example.com/stacktrace.js:3:3\", fileName: \"http://example.com/stacktrace.js\", line: 3 },\n                    { level: 24, method: \"<no_method>\", assembly: \"http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 25, method: \"c\", assembly: \"c@http://example.com/stacktrace.js:9:3\", fileName: \"http://example.com/stacktrace.js\", line: 9 },\n                    { level: 26, method: \"b\", assembly: \"b@http://example.com/stacktrace.js:6:3\", fileName: \"http://example.com/stacktrace.js\", line: 6 },\n                    { level: 27, method: \"a\", assembly: \"a@http://example.com/stacktrace.js:3:3\", fileName: \"http://example.com/stacktrace.js\", line: 3 },\n                    { level: 28, method: \"Object.testMethod\", assembly: \"at Object.testMethod (http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:53058:48)\", fileName: \"http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js\", line: 53058 }\n                ];\n\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(data, \"Has Data\");\n                    if (data) {\n                        Assert.ok(data.baseData, \"Has BaseData\");\n                        let baseData = data.baseData;\n                        if (baseData) {\n                            const ex = baseData.exceptions[0];\n                            Assert.ok(ex.message.indexOf(\"Test_Error_Throwing_Inside_UseCallback\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                            Assert.ok(ex.stack.length > 0, \"Has stack\");\n                            Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                            Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n                            Assert.equal(ex.parsedStack.length, 29);\n                            for (let lp = 0; lp < ex.parsedStack.length; lp++) {\n                                _checkExpectedFrame(expectedParsedStack[lp], ex.parsedStack[lp], lp);\n                            }\n\n                            Assert.ok(baseData.properties, \"Has BaseData properties\");\n                            Assert.equal(baseData.properties.custom, \"custom value\");\n\n                        }\n                    }\n                }\n            })\n        })\n\n        this.testCaseAsync({\n            name: \"E2E.GenericTests: trackException with multiple line message\",\n            stepDelay: 1,\n            steps: [() => {\n                let message = \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n\" +\n                    \"1. You might have mismatching versions of React and the renderer (such as React DOM)\\n\" +\n                    \"2. You might be breaking the Rules of Hooks\\n\" +\n                    \"3. You might have more than one copy of React in the same app\\n\" +\n                    \"See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.\";\n                let errObj = {\n                    typeName: \"Error\",\n                    reason: {\n                        message: \"Error: \" + message,\n                        stack: \"Error: \" + message + \"\\n\" +\n                            \"    at Object.throwInvalidHookError (https://localhost:44365/static/js/bundle.js:201419:13)\\n\" +\n                            \"    at useContext (https://localhost:44365/static/js/bundle.js:222943:25)\\n\" +\n                            \"    at useTenantContext (https://localhost:44365/static/js/bundle.js:5430:68)\\n\" +\n                            \"    at https://localhost:44365/static/js/bundle.js:4337:72\\n\" +\n                            \"    at _ZoneDelegate.invoke (https://localhost:44365/static/js/bundle.js:227675:158)\\n\" +\n                            \"    at ZoneImpl.run (https://localhost:44365/static/js/bundle.js:227446:35)\\n\" +\n                            \"    at https://localhost:44365/static/js/bundle.js:229764:30\\n\" +\n                            \"    at _ZoneDelegate.invokeTask (https://localhost:44365/static/js/bundle.js:227700:171)\\n\" +\n                            \"    at ZoneImpl.runTask (https://localhost:44365/static/js/bundle.js:227499:37)\\n\" +\n                            \"    at ZoneImpl.patchRunTask (https://localhost:44365/static/js/bundle.js:144112:27)\"\n                    }\n                };\n\n                let exception = Exception.CreateAutoException(message,\n                    \"url\",\n                    9,\n                    0,\n                    errObj\n                );\n                this._ai.trackException({ exception: exception }, { custom: \"custom value\" });\n            }].concat(this.asserts(1)).concat(() => {\n\n                const expectedParsedStack: IStackFrame[] = [\n                    { level: 0, method: \"Object.throwInvalidHookError\", assembly: \"at Object.throwInvalidHookError (https://localhost:44365/static/js/bundle.js:201419:13)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 201419 },\n                    { level: 1, method: \"useContext\", assembly: \"at useContext (https://localhost:44365/static/js/bundle.js:222943:25)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 222943 },\n                    { level: 2, method: \"useTenantContext\", assembly: \"at useTenantContext (https://localhost:44365/static/js/bundle.js:5430:68)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 5430 },\n                    { level: 3, method: \"<no_method>\", assembly: \"at https://localhost:44365/static/js/bundle.js:4337:72\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 4337 },\n                    { level: 4, method: \"_ZoneDelegate.invoke\", assembly: \"at _ZoneDelegate.invoke (https://localhost:44365/static/js/bundle.js:227675:158)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227675 },\n                    { level: 5, method: \"ZoneImpl.run\", assembly: \"at ZoneImpl.run (https://localhost:44365/static/js/bundle.js:227446:35)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227446 },\n                    { level: 6, method: \"<no_method>\", assembly: \"at https://localhost:44365/static/js/bundle.js:229764:30\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 229764 },\n                    { level: 7, method: \"_ZoneDelegate.invokeTask\", assembly: \"at _ZoneDelegate.invokeTask (https://localhost:44365/static/js/bundle.js:227700:171)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227700 },\n                    { level: 8, method: \"ZoneImpl.runTask\", assembly: \"at ZoneImpl.runTask (https://localhost:44365/static/js/bundle.js:227499:37)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227499 },\n                    { level: 9, method: \"ZoneImpl.patchRunTask\", assembly: \"at ZoneImpl.patchRunTask (https://localhost:44365/static/js/bundle.js:144112:27)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 144112 }\n                ];\n\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                if (payloadStr.length > 0) {\n                    const payload = JSON.parse(payloadStr[0]);\n                    const data = payload.data;\n                    Assert.ok(data, \"Has Data\");\n                    if (data) {\n                        Assert.ok(data.baseData, \"Has BaseData\");\n                        let baseData = data.baseData;\n                        if (baseData) {\n                            const ex = baseData.exceptions[0];\n                            Assert.ok(ex.message.indexOf(\"Invalid hook call\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                            Assert.ok(ex.stack.length > 0, \"Has stack\");\n                            Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                            Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n                            Assert.equal(ex.parsedStack.length, 10);\n                            for (let lp = 0; lp < ex.parsedStack.length; lp++) {\n                                _checkExpectedFrame(expectedParsedStack[lp], ex.parsedStack[lp], lp);\n                            }\n\n                            Assert.ok(baseData.properties, \"Has BaseData properties\");\n                            Assert.equal(baseData.properties.custom, \"custom value\");\n\n                        }\n                    }\n                }\n            })\n        })\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track metric\",\n            stepDelay: 1,\n            steps: [\n                () => {\n                    console.log(\"* calling trackMetric \" + new Date().toISOString());\n                    for (let i = 0; i < 100; i++) {\n                        this._ai.trackMetric({ name: \"test\" + i, average: Math.round(100 * Math.random()), min: 1, max: i + 1, stdDev: 10.0 * Math.random() });\n                    }\n                    console.log(\"* done calling trackMetric \" + new Date().toISOString());\n                }\n            ].concat(this.asserts(100))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track custom metric\",\n            stepDelay: 1,\n            steps: [\n                () => {\n                    console.log(\"* calling trackMetric \" + new Date().toISOString());\n                    this._ai.trackMetric({ name: \"my_custom_metric_0\", average: 2 });\n                    this._ai.trackMetric({ name: \"my_custom_metric_1\", average: 1.1, sampleCount: 1, min: 1, max: 1, stdDev: 1.12 });\n                    this._ai.trackMetric({ name: \"my_custom_metric_2\", average: 1.2, sampleCount: 2, min: 1, max: 2, stdDev: 1.23 });\n                    this._ai.trackMetric({ name: \"my_custom_metric_3\", average: 1.3, sampleCount: 3, min: 1, max: 2.5, stdDev: 1.35 });\n                    console.log(\"* done calling trackMetric \" + new Date().toISOString());\n                }\n            ].concat(this.asserts(4))\n        });\n\n        this.testCaseAsync({\n            name: `TelemetryContext: track page view ${window.location.pathname}`,\n            stepDelay: 500,\n            steps: [\n                () => {\n                    this._ai.trackPageView(); // sends 2\n                }\n            ]\n                .concat(this.asserts(2))\n                .concat(() => {\n\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        const payload = JSON.parse(payloadStr[0]);\n                        const data = payload.data;\n                        Assert.ok(data.baseData.id, \"pageView id is defined\");\n                        Assert.ok(data.baseData.id.length > 0);\n                        Assert.ok(payload.tags[\"ai.operation.id\"]);\n                        Assert.equal(data.baseData.id, payload.tags[\"ai.operation.id\"], \"pageView id matches current operation id\");\n                    } else {\n                        Assert.ok(false, \"successSpy not called\");\n                    }\n                })\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track page view performance\",\n            stepDelay: 1,\n            steps: [\n                () => {\n                    this._ai.trackPageViewPerformance({ name: 'name', uri: 'url' });\n                }\n            ].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track all types in batch\",\n            stepDelay: 1,\n            steps: [\n                () => {\n                    let exception = null;\n                    try {\n                        window[\"a\"][\"b\"]();\n                    } catch (e) {\n                        exception = e;\n                    }\n\n                    Assert.ok(exception);\n\n                    this._ai.trackException({ exception });\n                    this._ai.trackMetric({ name: \"test\", average: Math.round(100 * Math.random()) });\n                    this._ai.trackTrace({ message: \"test\" });\n                    this._ai.trackPageView({}); // sends 2\n                    this._ai.trackPageViewPerformance({ name: 'name', uri: 'http://someurl' });\n                    this._ai.flush();\n                }\n            ].concat(this.asserts(6))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: track all types in a large batch\",\n            stepDelay: 1,\n            steps: [\n                () => {\n                    let exception = null;\n                    try {\n                        window[\"a\"][\"b\"]();\n                    } catch (e) {\n                        exception = e;\n                    }\n                    Assert.ok(exception);\n\n                    for (let i = 0; i < 100; i++) {\n                        this._ai.trackException({ exception });\n                        this._ai.trackMetric({ name: \"test\", average: Math.round(100 * Math.random()) });\n                        this._ai.trackTrace({ message: \"test\" });\n                        this._ai.trackPageView({ name: `${i}` }); // sends 2 1st time\n                    }\n                }\n            ].concat(this.asserts(401, false))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryInitializer: E2E override envelope data\",\n            stepDelay: 1,\n            steps: [\n                () => {\n                    // Setup\n                    const telemetryInitializer = {\n                        init: (envelope) => {\n                            envelope.baseData.name = 'other name'\n                            return true;\n                        }\n                    }\n\n                    // Act\n                    this._ai.addTelemetryInitializer(telemetryInitializer.init);\n                    this._ai.trackMetric({ name: \"test\", average: Math.round(100 * Math.random()) });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        let payloadItems = payloadStr.length;\n                        Assert.equal(1, payloadItems, 'Only 1 track item is sent');\n                        const payload = JSON.parse(payloadStr[0]);\n                        Assert.ok(payload);\n\n                        if (payload && payload.baseData) {\n                            const nameResult: string = payload.data.baseData.metrics[0].name;\n                            const nameExpect: string = 'other name';\n                            Assert.equal(nameExpect, nameResult, 'telemetryinitializer override successful');\n                        }\n                    }\n                })\n        });\n\n        this.testCaseAsync({\n            name: 'E2E.GenericTests: undefined properties are replaced by customer defined value with config convertUndefined.',\n            stepDelay: 1,\n            steps: [() => {\n                this._ai.trackPageView({ name: 'pageview', properties: { 'prop1': 'val1' } });\n                this._ai.trackEvent({ name: 'event', properties: { 'prop2': undefined } });\n            }].concat(this.asserts(3)).concat(() => {\n                const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                for (let i = 0; i < payloadStr.length; i++) {\n                    const payload = JSON.parse(payloadStr[i]); const baseType = payload.data.baseType;\n                    // Make the appropriate assersion depending on the baseType\n                    switch (baseType) {\n                        case EventDataType:\n                            const eventData = payload.data;\n                            Assert.ok(eventData && eventData.baseData && eventData.baseData.properties['prop2']);\n                            Assert.equal(eventData.baseData.properties['prop2'], 'test-value');\n                            break;\n                        case PageViewDataType:\n                            const pageViewData = payload.data;\n                            Assert.ok(pageViewData && pageViewData.baseData && pageViewData.baseData.properties['prop1']);\n                            Assert.equal(pageViewData.baseData.properties['prop1'], 'val1');\n                            break;\n                        default:\n                            break;\n                    }\n                }\n            })\n        });\n    }\n\n    public addDependencyPluginTests(): void {\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: trackDependencyData\",\n            stepDelay: 1,\n            steps: [\n                () => {\n                    const data: IDependencyTelemetry = {\n                        target: 'http://abc',\n                        responseCode: 200,\n                        type: 'GET',\n                        id: 'abc'\n                    }\n                    this._ai.trackDependencyData(data);\n                }\n            ].concat(this.asserts(1))\n        });\n\n        this.testCaseAsync({\n            name: \"TelemetryContext: auto collection of ajax requests\",\n            stepDelay: 1,\n            useFakeServer: true,\n            fakeServerAutoRespond: true,\n            steps: [\n                () => {\n                    const xhr = new XMLHttpRequest();\n                    xhr.open('GET', 'https://localhost:9001/AISKU');\n                    xhr.send();\n                    Assert.ok(true);\n                }\n            ].concat(this.asserts(1))\n        });\n        let global = getGlobal();\n        if (global && global.fetch) {\n            this.testCaseAsync({\n                name: \"DependenciesPlugin: auto collection of outgoing fetch requests \" + (this.isFetchPolyfill ? \" using polyfill \" : \"\"),\n                stepDelay: 5000,\n                useFakeFetch: true,\n                fakeFetchAutoRespond: true,\n                steps: [\n                    () => {\n                        fetch('http://localhost:9001/README.md', { method: 'GET', headers: { 'header': 'value' } });\n                        Assert.ok(true, \"fetch monitoring is instrumented\");\n                    },\n                    () => {\n                        fetch('http://localhost:9001/README.md', { method: 'GET' });\n                        Assert.ok(true, \"fetch monitoring is instrumented\");\n                    },\n                    () => {\n                        fetch('http://localhost:9001/README.md');\n                        Assert.ok(true, \"fetch monitoring is instrumented\");\n                    }\n                ].concat(this.asserts(3, false, false))\n                    .concat(() => {\n                        let args = [];\n                        this.trackSpy.args.forEach(call => {\n                            let message = call[0].baseData.message || \"\";\n                            // Ignore the internal SendBrowserInfoOnUserInit message (Only occurs when running tests in a browser)\n                            if (message.indexOf(\"AI (Internal): 72 \") == -1) {\n                                args.push(call[0]);\n                            }\n                        });\n\n                        let type = \"Fetch\";\n                        if (this.isFetchPolyfill) {\n                            type = \"Ajax\";\n                            Assert.ok(true, \"Using fetch polyfill\");\n                        }\n\n                        Assert.equal(3, args.length, \"track is called 3 times\");\n                        let baseData = args[0].baseData;\n                        Assert.equal(type, baseData.type, \"request is \" + type + \" type\");\n                        Assert.equal('value', baseData.properties.requestHeaders['header'], \"fetch request's user defined request header is stored\");\n                        Assert.ok(baseData.properties.responseHeaders, \"fetch request's reponse header is stored\");\n\n                        baseData = args[1].baseData;\n                        Assert.equal(3, Object.keys(baseData.properties.requestHeaders).length, \"two request headers set up when there's no user defined request header\");\n                        Assert.ok(baseData.properties.requestHeaders[RequestHeaders.requestIdHeader], \"Request-Id header\");\n                        Assert.ok(baseData.properties.requestHeaders[RequestHeaders.requestContextHeader], \"Request-Context header\");\n                        Assert.ok(baseData.properties.requestHeaders[RequestHeaders.traceParentHeader], \"traceparent\");\n                        Assert.ok(!baseData.properties.requestHeaders[RequestHeaders.traceStateHeader], \"traceState should not be present in outbound event\");\n                        const id: string = baseData.id;\n                        const regex = id.match(/\\|.{32}\\..{16}\\./g);\n                        Assert.ok(id.length > 0);\n                        Assert.equal(1, regex.length)\n                        Assert.equal(id, regex[0]);\n                    })\n            });\n        } else {\n            this.testCase({\n                name: \"DependenciesPlugin: No crash when fetch not supported\",\n                test: () => {\n                    Assert.ok(true, \"fetch monitoring is correctly not instrumented\")\n                }\n            });\n        }\n    }\n\n    public addPropertiesPluginTests(): void {\n        this.testCaseAsync({\n            name: 'Custom Tags: allowed to send custom properties via addTelemetryInitializer',\n            stepDelay: 1,\n            steps: [\n                () => {\n                    this._ai.addTelemetryInitializer((item: ITelemetryItem) => {\n                        item.tags[this.tagKeys.cloudName] = \"my.custom.cloud.name\";\n                    });\n                    this._ai.trackEvent({ name: \"Custom event via addTelemetryInitializer\" });\n                }\n            ]\n                .concat(this.asserts(1, false, false))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length) {\n                        const payload = JSON.parse(payloadStr[0]);\n                        Assert.equal(1, payloadStr.length, 'Only 1 track item is sent - ' + payload.name);\n                        Assert.ok(payload);\n\n                        if (payload && payload.tags) {\n                            const tagResult: string = payload.tags && payload.tags[this.tagKeys.cloudName];\n                            const tagExpect: string = 'my.custom.cloud.name';\n                            Assert.equal(tagResult, tagExpect, 'telemetryinitializer tag override successful');\n                            return true;\n                        }\n                        return false;\n                    }\n                }, 'Set custom tags') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'Custom Tags: allowed to send custom properties via addTelemetryInitializer & shimmed addTelemetryInitializer',\n            stepDelay: 1,\n            steps: [\n                () => {\n                    this._ai.addTelemetryInitializer((item: ITelemetryItem) => {\n                        item.tags.push({ [this.tagKeys.cloudName]: \"my.shim.cloud.name\" });\n                    });\n                    this._ai.trackEvent({ name: \"Custom event\" });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        Assert.equal(1, payloadStr.length, 'Only 1 track item is sent');\n                        const payload = JSON.parse(payloadStr[0]);\n                        Assert.ok(payload);\n\n                        if (payload && payload.tags) {\n                            const tagResult: string = payload.tags && payload.tags[this.tagKeys.cloudName];\n                            const tagExpect: string = 'my.shim.cloud.name';\n                            Assert.equal(tagResult, tagExpect, 'telemetryinitializer tag override successful');\n                            return true;\n                        }\n                        return false;\n                    }\n                }, 'Set custom tags') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'Custom Tags: allowed to send custom properties via shimmed addTelemetryInitializer',\n            stepDelay: 1,\n            steps: [\n                () => {\n                    this._ai.addTelemetryInitializer((item: ITelemetryItem) => {\n                        item.tags[this.tagKeys.cloudName] = \"my.custom.cloud.name\";\n                        item.tags[this.tagKeys.locationCity] = \"my.custom.location.city\";\n                        item.tags.push({ [this.tagKeys.locationCountry]: \"my.custom.location.country\" });\n                        item.tags.push({ [this.tagKeys.operationId]: \"my.custom.operation.id\" });\n                    });\n                    this._ai.trackEvent({ name: \"Custom event via shimmed addTelemetryInitializer\" });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        const payload = JSON.parse(payloadStr[0]);\n                        Assert.equal(1, payloadStr.length, 'Only 1 track item is sent - ' + payload.name);\n                        if (payloadStr.length > 1) {\n                            this.dumpPayloadMessages(this.successSpy);\n                        }\n                        Assert.ok(payload);\n\n                        if (payload && payload.tags) {\n                            const tagResult1: string = payload.tags && payload.tags[this.tagKeys.cloudName];\n                            const tagExpect1: string = 'my.custom.cloud.name';\n                            Assert.equal(tagResult1, tagExpect1, 'telemetryinitializer tag override successful');\n                            const tagResult2: string = payload.tags && payload.tags[this.tagKeys.locationCity];\n                            const tagExpect2: string = 'my.custom.location.city';\n                            Assert.equal(tagResult2, tagExpect2, 'telemetryinitializer tag override successful');\n                            const tagResult3: string = payload.tags && payload.tags[this.tagKeys.locationCountry];\n                            const tagExpect3: string = 'my.custom.location.country';\n                            Assert.equal(tagResult3, tagExpect3, 'telemetryinitializer tag override successful');\n                            const tagResult4: string = payload.tags && payload.tags[this.tagKeys.operationId];\n                            const tagExpect4: string = 'my.custom.operation.id';\n                            Assert.equal(tagResult4, tagExpect4, 'telemetryinitializer tag override successful');\n                            return true;\n                        }\n                        return false;\n                    }\n                }, 'Set custom tags') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext authId',\n            stepDelay: 1,\n            steps: [\n                () => {\n                    const context = (this._ai.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext('10001');\n                    this._ai.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    let payloadStr = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        let payloadEvents = payloadStr.length;\n                        let thePayload: string = payloadStr[0];\n\n                        if (payloadEvents !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(thePayload);\n                        if (payload && payload.tags) {\n                            const tagName: string = this.tagKeys.userAuthUserId;\n                            return '10001' === payload.tags[tagName];\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext authId and accountId',\n            stepDelay: 1,\n            steps: [\n                () => {\n                    const context = (this._ai.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext('10001', 'account123');\n                    this._ai.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        if (payloadStr.length !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(payloadStr[0]);\n                        if (payload && payload.tags) {\n                            const authTag: string = this.tagKeys.userAuthUserId;\n                            const accountTag: string = this.tagKeys.userAccountId;\n                            return '10001' === payload.tags[authTag] /*&&\n                            'account123' === payload.tags[accountTag] */; // bug https://msazure.visualstudio.com/One/_workitems/edit/3508825\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext non-ascii authId and accountId',\n            stepDelay: 1,\n            steps: [\n                () => {\n                    const context = (this._ai.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext(\"\\u0428\", \"\\u0429\");\n                    this._ai.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        if (payloadStr.length !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(payloadStr[0]);\n                        if (payload && payload.tags) {\n                            const authTag: string = this.tagKeys.userAuthUserId;\n                            const accountTag: string = this.tagKeys.userAccountId;\n                            return '\\u0428' === payload.tags[authTag] /* &&\n                            '\\u0429' === payload.tags[accountTag] */; // bug https://msazure.visualstudio.com/One/_workitems/edit/3508825\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        this.testCaseAsync({\n            name: 'AuthenticatedUserContext: clearAuthenticatedUserContext',\n            stepDelay: 1,\n            steps: [\n                () => {\n                    const context = (this._ai.context) as IPropTelemetryContext;\n                    context.user.setAuthenticatedUserContext('10002', 'account567');\n                    context.user.clearAuthenticatedUserContext();\n                    this._ai.trackTrace({ message: 'authUserContext test' });\n                }\n            ]\n                .concat(this.asserts(1))\n                .concat(PollingAssert.createPollingAssert(() => {\n                    const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                    if (payloadStr.length > 0) {\n                        if (payloadStr.length !== 1) {\n                            // Only 1 track should be sent\n                            return false;\n                        }\n                        const payload = JSON.parse(payloadStr[0]);\n                        if (payload && payload.tags) {\n                            const authTag: string = this.tagKeys.userAuthUserId;\n                            const accountTag: string = this.tagKeys.userAccountId;\n                            return undefined === payload.tags[authTag] &&\n                                undefined === payload.tags[accountTag];\n                        }\n                    }\n                    return false;\n                }, 'user.authenticatedId') as any)\n        });\n\n        // This doesn't need to be e2e\n        this.testCase({\n            name: 'AuthenticatedUserContext: setAuthenticatedUserContext does not set the cookie by default',\n            test: () => {\n                // Setup\n                const context = (this._ai.context) as IPropTelemetryContext;\n                const authSpy: SinonSpy = this.sandbox.spy(context.user, 'setAuthenticatedUserContext');\n                let cookieMgr = this._ai.getCookieMgr();\n                const cookieSpy: SinonSpy = this.sandbox.spy(cookieMgr, 'set');\n\n                // Act\n                context.user.setAuthenticatedUserContext('10002', 'account567');\n\n                // Test\n                Assert.ok(authSpy.calledOnce, 'setAuthenticatedUserContext called');\n                Assert.equal(false, authSpy.calledWithExactly('10001', 'account567', false), 'Correct default args to setAuthenticatedUserContext');\n                Assert.ok(cookieSpy.notCalled, 'cookie never set');\n            }\n        });\n\n        this.testCase({\n            name: 'Sampling: sampleRate is generated as a field in the envelope when it is less than 100',\n            test: () => {\n                this._ai.trackEvent({ name: 'event' });\n                Assert.ok(this.envelopeConstructorSpy.called);\n                const envelope = this.envelopeConstructorSpy.returnValues[0];\n                Assert.equal(envelope.sampleRate, 50, \"sampleRate is generated\");\n                Assert.equal(envelope.iKey, ApplicationInsightsTests._instrumentationKey, \"default config iKey is used\");\n            }\n        });\n\n        this.testCase({\n            name: 'iKey replacement: envelope will use the non-empty iKey defined in track method',\n            test: () => {\n                this._ai.trackEvent({ name: 'event1', properties: { \"prop1\": \"value1\" }, measurements: { \"measurement1\": 200 }, iKey: \"1a6933ad-aaaa-aaaa-aaaa-000000000000\" });\n                Assert.ok(this.envelopeConstructorSpy.called);\n                const envelope = this.envelopeConstructorSpy.returnValues[0];\n                Assert.equal(envelope.iKey, \"1a6933ad-aaaa-aaaa-aaaa-000000000000\", \"trackEvent iKey is replaced\");\n            }\n        });\n\n        this.testCase({\n            name: 'iKey replacement: envelope will use the config iKey if defined ikey in track method is empty',\n            test: () => {\n                this._ai.trackEvent({ name: 'event1', properties: { \"prop1\": \"value1\" }, measurements: { \"measurement1\": 200 }, iKey: \"\" });\n                Assert.ok(this.envelopeConstructorSpy.called);\n                const envelope = this.envelopeConstructorSpy.returnValues[0];\n                Assert.equal(envelope.iKey, ApplicationInsightsTests._instrumentationKey, \"trackEvent iKey should not be replaced\");\n            }\n        });\n    }\n\n    private boilerPlateAsserts = () => {\n        Assert.ok(this.successSpy.called, \"success\");\n        Assert.ok(!this.errorSpy.called, \"no error sending\");\n        const isValidCallCount = this.loggingSpy.callCount === 0;\n        Assert.ok(isValidCallCount, \"logging spy was called 0 time(s)\");\n        if (!isValidCallCount) {\n            while (this.loggingSpy.args.length) {\n                Assert.ok(false, \"[warning thrown]: \" + dumpObj(this.loggingSpy.args.pop()));\n            }\n        }\n    }\n    private asserts: any = (expectedCount: number, includeInit: boolean = false, doBoilerPlate: boolean = true) => [\n        () => {\n            const message = \"polling: \" + new Date().toISOString();\n            Assert.ok(true, message);\n            console.log(message);\n\n            if (doBoilerPlate) {\n                if (this.successSpy.called || this.errorSpy.called || this.loggingSpy.called) {\n                    this.boilerPlateAsserts();\n                }\n            }\n        },\n        (PollingAssert.createPollingAssert(() => {\n            let argCount = 0;\n            if (this.successSpy.called && this.successSpy.args && this.successSpy.args.length > 0) {\n                this.successSpy.args.forEach(call => {\n                    argCount += call[0].length;\n                });\n            }\n\n            Assert.ok(true, \"* [\" + argCount + \" of \" + expectedCount + \"] checking success spy \" + new Date().toISOString());\n\n            if (argCount >= expectedCount) {\n                let payloadStr = this.getPayloadMessages(this.successSpy, includeInit);\n                if (payloadStr.length > 0) {\n                    let currentCount: number = payloadStr.length;\n                    console.log('curr: ' + currentCount + ' exp: ' + expectedCount, ' appId: ' + this._ai.context.appId());\n                    if (currentCount === expectedCount && !!this._ai.context.appId()) {\n                        const payload = JSON.parse(payloadStr[0]);\n                        const baseType = payload.data.baseType;\n\n                        // call the appropriate Validate depending on the baseType\n                        switch (baseType) {\n                            case EventDataType:\n                                return EventValidator.EventValidator.Validate(payload, baseType);\n                            case TraceDataType:\n                                return TraceValidator.TraceValidator.Validate(payload, baseType);\n                            case ExceptionDataType:\n                                return ExceptionValidator.ExceptionValidator.Validate(payload, baseType);\n                            case MetricDataType:\n                                return MetricValidator.MetricValidator.Validate(payload, baseType);\n                            case PageViewDataType:\n                                return PageViewValidator.PageViewValidator.Validate(payload, baseType);\n                            case PageViewPerformanceDataType:\n                                return PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(payload, baseType);\n                            case RemoteDependencyDataType:\n                                return RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(payload, baseType);\n\n                            default:\n                                return EventValidator.EventValidator.Validate(payload, baseType);\n                        }\n                    }\n                }\n            }\n\n            return false;\n        }, \"sender succeeded\", 60))\n    ];\n}\n\nclass CustomTestError extends Error {\n    constructor(message = \"\") {\n        super(message);\n        this.name = \"CustomTestError\";\n        this.message = message + \" -- test error.\";\n    }\n}\n\nclass TestPlugin extends BaseTelemetryPlugin {\n    public identifier: string = \"TestPlugin\";\n    public version: string = \"0.99.1\";\n\n    constructor() {\n        super();\n    }\n\n    public processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext | undefined): void {\n        itemCtx?.processNext(env);\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/sanitizer.e2e.tests.ts",
    "content": "import { ApplicationInsights, IApplicationInsights, LoggingSeverity, _eInternalMessageId } from '../../../src/applicationinsights-web'\nimport { Sender } from '@microsoft/applicationinsights-channel-js';\nimport { AITestClass, Assert, PollingAssert } from '@microsoft/ai-test-framework';\nimport { SinonSpy } from 'sinon';\nimport { newId } from '@microsoft/applicationinsights-core-js';\nimport { BreezeChannelIdentifier } from '@microsoft/applicationinsights-core-js';\n\nexport class SanitizerE2ETests extends AITestClass {\n    private readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n\n    private _ai: IApplicationInsights;\n\n    // Sinon\n    private errorSpy: SinonSpy;\n    private successSpy: SinonSpy;\n    private loggingSpy: SinonSpy;\n\n    private delay = 100;\n\n    constructor() {\n        super(\"SanitizerE2ETests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            const init = new ApplicationInsights({\n                config: {\n                    instrumentationKey: this._instrumentationKey,\n                    extensionConfig: {\n                        'AppInsightsChannelPlugin': {\n                            maxBatchInterval: 500\n                        }\n                    }\n                },\n                queue: [],\n                version: 2.0\n            });\n            this._ai = init.loadAppInsights();\n\n            // Setup Sinon stuff\n            const sender: Sender = this._ai.getPlugin<Sender>(BreezeChannelIdentifier).plugin;\n            this.errorSpy = this.sandbox.spy(sender, '_onError');\n            this.successSpy = this.sandbox.spy(sender, '_onSuccess');\n            this.loggingSpy = this.sandbox.stub(this._ai.appInsights.core.logger, 'throwInternal');\n        } catch (e) {\n            console.error('Failed to initialize');\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ai && this._ai.unload) {\n            // force unload\n            this._ai.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.addAsyncTests();\n    }\n\n    private addAsyncTests(): void {\n        const boilerPlateAsserts = () => {\n            Assert.ok(this.successSpy.called, \"success\");\n            Assert.ok(!this.errorSpy.called, \"no error sending\");\n        }\n\n        this.testCase({\n            name: \"SanitizerE2ETests: RDD Telemetry sanitizes long names\",\n            test: () => {\n                return this._asyncQueue().add(() => {\n                    this._ai.trackDependencyData({\n                        id: newId(),\n                        name: new Array(1234).join(\"a\"), // exceeds max of 1024\n                        responseCode: 200\n                    });\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    Assert.ok(true, \"waiting for response \" + new Date().toISOString());\n                    return (this.successSpy.called || this.errorSpy.called);\n                }, \"Wait for response\") as any)\n                .add(() => {\n                    boilerPlateAsserts();\n                })\n                .add(() => {\n                    Assert.ok(this.loggingSpy.called);\n                    Assert.equal(LoggingSeverity.WARNING, this.loggingSpy.args[0][0]);\n                    Assert.equal(_eInternalMessageId.StringValueTooLong, this.loggingSpy.args[0][1]);\n                });\n            }\n        })\n\n        this.testCase({\n            name: \"Sanitizer2ETests: Data platform accepts sanitized names\",\n            test: () => {\n                return this._asyncQueue().add(() => {\n\n                    const properties = {\n                        \"property1%^~`\": \"hello\",\n                        \"property2*&#+\": \"world\"\n                    };\n\n                    const measurements = {\n                        \"measurement@|\": 300\n                    };\n\n                    this._ai.trackMetric({name: \"test\", average: 5});\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    Assert.ok(true, \"waiting for response \" + new Date().toISOString());\n                    return (this.successSpy.called || this.errorSpy.called || this.loggingSpy.called);\n                }, \"Wait for response\") as any)\n                .add(() => {\n                    boilerPlateAsserts();\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Sanitizer2ETests: Data platform accepts legal charater set names\",\n            test: () => {\n                return this._asyncQueue().add(() => {\n                    const properties = {\n                        \"abcdefghijklmnopqrstuvwxyz\": \"hello\",\n                        \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\": \"world\"\n                    };\n\n                    const measurements = {\n                        \"(1234567890/ \\_-.)\": 300\n                    };\n\n                    this._ai.trackMetric({name: \"test\", average: 5});\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    Assert.ok(true, \"waiting for response \" + new Date().toISOString());\n                    return (this.successSpy.called || this.errorSpy.called || this.loggingSpy.called);\n                }, \"Wait for response\") as any)\n                .add(() => {\n                    boilerPlateAsserts();\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Sanitizer2ETests: Data platform accepts up to 150 charaters for names\",\n            test: () => {\n                return this._asyncQueue().add(() => {\n                    const len = 150;\n                    const name = new Array(len + 1).join('a');\n\n                    this._ai.trackMetric({name, average: 5});\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    Assert.ok(true, \"waiting for response \" + new Date().toISOString());\n                    return (this.successSpy.called || this.errorSpy.called || this.loggingSpy.called);\n                }, \"Wait for response\") as any)\n                .add(() => {\n                    boilerPlateAsserts();\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Sanitizer2ETests: Data platform accepts up to 1024 charaters for values\",\n            test: () => {\n                return this._asyncQueue().add(() => {\n                    const len = 1024;\n                    const value = new Array(len + 1).join('a');\n\n                    const properties = {\n                        \"testProp\": value\n                    };\n\n                    this._ai.trackMetric({name: \"test\", average: 5});\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    Assert.ok(true, \"waiting for response \" + new Date().toISOString());\n                    return (this.successSpy.called || this.errorSpy.called || this.loggingSpy.called);\n                }, \"Wait for response\") as any)\n                .add(() => {\n                    boilerPlateAsserts();\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Sanitizer2ETests: Data platform accepts up to 2048 characters for url\",\n            test: () => {\n                return this._asyncQueue().add(() => {\n                    const len = 2048;\n                    let url = \"http://hello.com/\";\n                    url = url + new Array(len - url.length + 1).join('a');\n\n                    this._ai.trackPageView({name: \"test\", uri: url});\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    Assert.ok(true, \"waiting for response \" + new Date().toISOString());\n                    return (this.successSpy.called || this.errorSpy.called || this.loggingSpy.called);\n                }, \"Wait for response\") as any)\n                .add(() => {\n                    boilerPlateAsserts();\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Sanitizer2ETests: Data platform accepts up to 32768 characters for messages\",\n            test: () => {\n                return this._asyncQueue().add(() => {\n                    const len = 32768;\n                    const message = new Array(len + 1).join('a');\n\n                    this._ai.trackTrace({message, severityLevel: 0});\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    Assert.ok(true, \"waiting for response \" + new Date().toISOString());\n                    return (this.successSpy.called || this.errorSpy.called || this.loggingSpy.called);\n                }, \"Wait for response\") as any)\n                .add(() => {\n                    boilerPlateAsserts();\n                });\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/sender.e2e.tests.ts",
    "content": "import { ApplicationInsights, IApplicationInsights } from '../../../src/applicationinsights-web'\nimport { Sender } from '@microsoft/applicationinsights-channel-js';\nimport { BreezeChannelIdentifier, utlGetSessionStorage, utlRemoveSessionStorage } from '@microsoft/applicationinsights-core-js';\nimport { ActiveStatus, dumpObj, getJSON, isArray } from '@microsoft/applicationinsights-core-js';\nimport { SinonSpy } from 'sinon';\nimport { Assert, AITestClass, PollingAssert} from \"@microsoft/ai-test-framework\"\nimport { createAsyncResolvedPromise } from '@nevware21/ts-async';\n\nexport class SenderE2ETests extends AITestClass {\n    private readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n    private readonly _bufferName = 'AI_buffer_1';\n    private readonly _sentBufferName = 'AI_sentBuffer_1';\n\n    private _ai: IApplicationInsights;\n    private _sender: Sender;\n\n    // Sinon\n    private errorSpy: SinonSpy;\n    private successSpy: SinonSpy;\n    private loggingSpy: SinonSpy;\n    private clearSpy: SinonSpy;\n\n    private delay = 100;\n\n    constructor() {\n        super(\"SenderE2ETests\");\n    }\n\n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            const init = new ApplicationInsights({\n                config: {\n                    instrumentationKey: this._instrumentationKey,\n                    loggingLevelConsole: 999,\n                    extensionConfig: {\n                        'AppInsightsChannelPlugin': {\n                            maxBatchInterval: 2000,\n                            maxBatchSizeInBytes: 10*1024*1024 // 10 MB\n                        },\n                        [\"AppInsightsCfgSyncPlugin\"]: {\n                            cfgUrl: \"\"\n                        }\n                        \n                    }\n                },\n                queue: [],\n                version: 2.0\n            });\n            this._ai = init.loadAppInsights();\n\n            // Setup Sinon stuff\n            this._sender = this._ai.getPlugin<Sender>(BreezeChannelIdentifier).plugin;\n            this._sender._buffer.clear();\n            this.errorSpy = this.sandbox.spy(this._sender, '_onError');\n            this.successSpy = this.sandbox.spy(this._sender, '_onSuccess');\n            this.loggingSpy = this.sandbox.stub(this._ai.appInsights.core.logger, 'throwInternal');\n            this.clearSpy = this.sandbox.spy(this._sender._buffer, 'clearSent');\n        } catch (e) {\n            console.error('Failed to initialize');\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ai && this._ai.unload) {\n            this._ai.unload(false);\n        }\n    }\n    \n    public testCleanup() {\n        utlRemoveSessionStorage(null as any, \"AI_sentBuffer\", );\n        utlRemoveSessionStorage(null as any, \"AI_buffer\", );\n\n        this.successSpy.restore();\n    }\n\n    public registerTests() {\n        this.addAsyncTests();\n        this.addTrackEndpointTests();\n        this.addRetryTests();\n    }\n\n    private addRetryTests() {\n        let handle;\n        this.testCase({\n            name: 'Offline: offline telemetry is retried',\n            pollDelay: this.delay,\n            test: () => {\n                handle = setInterval(() => {this._ai.trackTrace({message: 'intermittent message'})}, 500);\n                Assert.ok(true, 'sent event');\n\n                return this._asyncQueue()\n                    .concat(this.waitForResponse())\n                    .concat(this.boilerPlateAsserts)\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => {\n                        let currentCount: number = 0;\n\n                        if (this.successSpy.called) {\n                            this.successSpy.args.forEach(call => {\n                                const acceptedItems = call[1];\n                                currentCount += acceptedItems; // number of accepted items\n                            });\n                            console.log('currentCount', currentCount);\n                            return currentCount >= 20;\n                        }\n\n                        return false;\n                    }, 'All items are sent', 600, 1000) as any)\n                    .concat(() => {\n                        clearInterval(handle);\n                        Assert.ok(true, 'handle cleared');\n                    });\n            }\n        });\n    }\n\n    private addAsyncTests(): void {\n        this.testCase({\n            name: 'SendBuffer: Session storage is cleared after a send',\n            pollDelay: this.delay,\n            timeout: 30000,\n            test: () => {\n                this._ai.trackTrace({message: 'test trace'});\n\n                return this._asyncQueue()\n                    .concat(this.waitForResponse())\n                    .concat(this.boilerPlateAsserts)\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => this.successSpy.called && this.isSessionSentEmpty(), \"SentBuffer Session storage is empty\", 15, 1000))\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => this.successSpy.called && this.isSessionEmpty(), \"Buffer Session storage is empty\", 15, 1000));\n            }\n        });\n\n        this.testCase({\n            name: 'SendBuffer: Session storage is cleared after a send with cs promise',\n            pollDelay: this.delay,\n            test: () => {\n                if (this._ai && this._ai.unload) {\n                    this._ai.unload(false);\n                }\n\n                let csPromise = createAsyncResolvedPromise(`InstrumentationKey=${this._instrumentationKey}`);\n                let  init = new ApplicationInsights({\n                    config: {\n                        connectionString: csPromise,\n                        loggingLevelConsole: 999,\n                        extensionConfig: {\n                            'AppInsightsChannelPlugin': {\n                                maxBatchInterval: 2000,\n                                maxBatchSizeInBytes: 10*1024*1024 // 10 MB\n                            },\n                            [\"AppInsightsCfgSyncPlugin\"]: {\n                                cfgUrl: \"\"\n                            }\n                            \n                        }\n                    },\n                    queue: [],\n                    version: 2.0\n                });\n                this._ai = init.loadAppInsights();\n    \n                // Setup Sinon stuff\n                this._sender = this._ai.getPlugin<Sender>(BreezeChannelIdentifier).plugin;\n                this._sender._buffer.clear();\n                this.errorSpy = this.sandbox.spy(this._sender, '_onError');\n                this.successSpy = this.sandbox.spy(this._sender, '_onSuccess');\n                this.loggingSpy = this.sandbox.stub(this._ai.appInsights.core.logger, 'throwInternal');\n                this.clearSpy = this.sandbox.spy(this._sender._buffer, 'clearSent');\n                this._ai.trackTrace({message: 'test trace'});\n\n                return this._asyncQueue()\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => {\n                        let core = this._ai.appInsights.core\n                        let activeStatus = core.activeStatus && core.activeStatus();\n                    \n                        if (activeStatus === ActiveStatus.ACTIVE ) {\n                            Assert.equal(this._instrumentationKey, core.config.instrumentationKey, \"ikey should be set\");\n                            return true;\n                        }\n                        return false;\n                    }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000))\n                    .concat(this.waitForResponse())\n                    .concat(this.boilerPlateAsserts)\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => this.successSpy.called && this.isSessionSentEmpty(), \"SentBuffer Session storage is empty\", 15, 1000))\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => this.successSpy.called && this.isSessionEmpty(), \"Buffer Session storage is empty\", 15, 1000));\n            }\n        });\n    }\n\n    private addTrackEndpointTests(): void {\n        const SENT_ITEMS: number = 100;\n        const SENT_TYPES: number = 4;\n\n        this.testCase({\n            name: 'EndpointTests: telemetry sent to endpoint fills to maxBatchSize',\n            pollDelay: this.delay,\n            test: () => {\n                for (let i = 0; i < SENT_ITEMS; i++) {\n                    this._ai.trackException({error: new Error()});\n                    this._ai.trackMetric({name: \"test\", average: Math.round(100 * Math.random())});\n                    this._ai.trackTrace({message: \"test\"});\n                    this._ai.trackTrace({message: \"test2\"});\n                }\n\n                // Wait for the response\n                return this._asyncQueue()\n                    .concat(this.waitForResponse())\n                    .concat(this.boilerPlateAsserts)\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => {\n                        let currentCount: number = 0;\n\n                        if (this.successSpy.called) {\n                            this.successSpy.args.forEach(call => {\n                                const acceptedItems = call[1];\n                                currentCount += acceptedItems; // number of accepted items\n                            });\n                            return currentCount === SENT_ITEMS * SENT_TYPES;\n                        }\n\n                        return false;\n                    }, `Backend accepts ${SENT_ITEMS} items`, 15, 1000))\n                    .concat(PollingAssert.asyncTaskPollingAssert(() => {\n                        return this.successSpy.calledOnce;\n                    }, \"Tracks are sent in ONE batch\", 15, 1000));\n                }\n        });\n    }\n\n    private waitForResponse() {\n        // Wait for the successSpy or errorSpy to be called\n        return PollingAssert.asyncTaskPollingAssert(() => {\n            return (this.successSpy.called || this.errorSpy.called);\n        }, \"Wait for response\" + new Date().toISOString(), 15, 1000);\n    }\n\n    private boilerPlateAsserts() {\n        Assert.ok(this.successSpy.called, \"success\");\n        Assert.ok(!this.errorSpy.called, \"no error sending\");\n        Assert.ok(this.clearSpy.called, \"clearSent called\");\n        const isValidCallCount = this.loggingSpy.callCount === 0;\n        Assert.ok(isValidCallCount, \"logging spy was called 0 time(s)\");\n        if (!isValidCallCount) {\n            while (this.loggingSpy.args.length) {\n                Assert.ok(false, \"[warning thrown]: \" + dumpObj(this.loggingSpy.args.pop()));\n            }\n        }\n    }\n\n    private isSessionEmpty(): boolean {\n        const buffer = this._getBuffer(this._bufferName);\n        return buffer.length === 0;\n    }\n\n    private isSessionSentEmpty(): boolean {\n        const buffer = this._getBuffer(this._sentBufferName);\n        return buffer.length === 0;\n    }\n\n    private _getBuffer(key: string): string[] {\n        let prefixedKey = key;\n        try {\n            const bufferJson = utlGetSessionStorage(null, key);\n            if (bufferJson) {\n                let buffer: string[] = getJSON().parse(bufferJson);\n                if (buffer && isArray(buffer)) {\n                    return buffer;\n                }\n            }\n        } catch (e) {\n            console.error(\"_getBuffer\" + e);\n        }\n\n        return [];\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/Unit/src/testLegacySnippet.ts",
    "content": "\n/**\n * DO NOT FIX BUGS WITH THE OBJECT RETURNED BY THIS HELPER\n * -------------------------------------------------------\n * This is a helper that returns an object that is the same as the legacy snippet, if there is\n * an issue with the tests because of the object this returns there is probably a bug during \n * initialization.\n */\nexport function createLegacySnippet(aiConfig) {\n    var appInsights: any = {\n        config: aiConfig\n    };\n\n    // Assigning these to local variables allows them to be minified to save space:\n    var localDocument = document;\n    var localWindow = window;\n    // var scriptText = \"script\";\n    var userContext = \"AuthenticatedUserContext\";\n    var start = \"start\";\n    var stop = \"stop\";\n    var track = \"Track\";\n    var trackEvent = track + \"Event\";\n    var trackPage = track + \"Page\";\n\n    // Commented out as we don't want to load from the CDN\n    // setTimeout(function () {\n    //     var scriptElement = localDocument.createElement(scriptText);\n    //     scriptElement.src = aiConfig.url || \"CDN_PATH\";\n    //     localDocument.getElementsByTagName(scriptText)[0].parentNode.appendChild(scriptElement);\n    // });\n\n    // capture initial cookie\n    try {\n        appInsights.cookie = localDocument.cookie;\n    } catch (e) { }\n\n    appInsights.queue = [];\n\n    function createLazyMethod(name) {\n        // Define a temporary method that queues-up a the real method call\n        appInsights[name] = function () {\n            // Capture the original arguments passed to the method\n            var originalArguments = arguments;\n            // Queue-up a call to the real method\n            appInsights.queue.push(function () {\n                // Invoke the real method with the captured original arguments\n                appInsights[name].apply(appInsights, originalArguments);\n            });\n        }\n    };\n\n    var methods = [\"Event\", \"Exception\", \"Metric\", \"PageView\", \"Trace\", \"Dependency\"];\n    while (methods.length) {\n        createLazyMethod(\"track\" + methods.pop());\n    }\n\n    createLazyMethod(\"set\" + userContext);\n    createLazyMethod(\"clear\" + userContext);\n\n    createLazyMethod(start + trackEvent);\n    createLazyMethod(stop + trackEvent);\n\n    createLazyMethod(start + trackPage);\n    createLazyMethod(stop + trackPage);\n\n    createLazyMethod(\"flush\");\n\n    // collect global errors\n    if (!aiConfig.disableExceptionTracking) {\n        var method = \"onerror\";\n        createLazyMethod(\"_\" + method);\n        var originalOnError = localWindow[method];\n        localWindow[method] = function (message, url, lineNumber, columnNumber, error) {\n            var handled = originalOnError && originalOnError(message, url, lineNumber, columnNumber, error);\n            if (handled !== true) {\n                appInsights[\"_\" + method](message, url, lineNumber, columnNumber, error);\n            }\n\n            return handled;\n        };\n    }\n\n    // if somebody calls the snippet twice, don't report page view again\n    if (appInsights.queue && appInsights.queue.length === 0) {\n        // appInsights.trackPageView();\n    }\n\n    return appInsights;\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/testSnippetV5.ts",
    "content": "\n\n/**\n * DO NOT FIX BUGS WITH THE OBJECT RETURNED BY THIS HELPER\n * -------------------------------------------------------\n * YOU *SHOULD* CREATE A NEW VERSION FOR EACH SNIPPET VERSION UNLESS CHANGES ARE MINIMAL\n * -------------------------------------------------------\n * This is a helper that returns an object that is the same as the v5 snippet, if there is\n * an issue with the tests because of the object this returns there is probably a bug during \n * initialization.\n */\nexport function createSnippetV5(snipConfig) {\n    let win = window;\n    let doc = document;\n\n    var locn = win.location;\n    var helpLink = \"https://go.microsoft.com/fwlink/?linkid=2128109\";\n    var scriptText = \"script\";\n    var strInstrumentationKey = \"instrumentationKey\";\n    var strIngestionendpoint = \"ingestionendpoint\";\n    var userOverrideEndpointUrl = \"userOverrideEndpointUrl\";\n    var strDisableExceptionTracking = \"disableExceptionTracking\";\n    var strAiDevice = \"ai.device.\";\n    var strAiOperationName = \"ai.operation.name\";\n    var strAiSdkVersion = \"ai.internal.sdkVersion\";\n    var strToLowerCase = \"toLowerCase\";\n    var strEmpty = \"\";\n    var strUndefined = \"undefined\";\n    var strCrossOrigin = \"crossOrigin\";\n\n    var strPostMethod = \"POST\";\n    var sdkInstanceName = \"appInsightsSDK\";         // required for Initialization to find the current instance\n    var aiName = snipConfig.name || \"appInsights\";  // provide non default instance name through snipConfig name value\n    if (snipConfig.name || win[sdkInstanceName]) {\n        // Only set if supplied or another name is defined to avoid polluting the global namespace\n        win[sdkInstanceName] = aiName;\n    }\n    var aiSdk = win[aiName] || (function (aiConfig) {\n        var loadFailed = false;\n        var handled = false;\n        var appInsights: any = {\n            initialize: true,   // initialize sdk on download\n            queue: [],\n            sv: \"5\",            // Track the actual snippet version for reporting.\n            version: 2.0,       // initialization version, if this is not 2.0 the previous scripts fail to initialize\n            config: aiConfig\n        };\n        function _parseConnectionString() {\n            var fields: any = {};\n            var connectionString = aiConfig.connectionString;\n            if (connectionString) {\n                var kvPairs = connectionString.split(\";\");\n                for (var lp = 0; lp < kvPairs.length; lp++) {\n                    var kvParts = kvPairs[lp].split(\"=\");\n    \n                    if (kvParts.length === 2) { // only save fields with valid formats\n                        fields[kvParts[0][strToLowerCase]()] = kvParts[1];\n                    }\n                }\n            }\n\n            // apply the default endpoints\n            if (!fields[strIngestionendpoint]) {\n                // use endpoint suffix where overrides are not provided\n                var endpointSuffix = fields.endpointsuffix;\n                // Only fetch the location if a suffix was supplied\n                var fLocation = endpointSuffix ? fields.location : null;\n                fields[strIngestionendpoint] = \"https://\" + (fLocation ? fLocation + \".\" : strEmpty) + \"dc.\" + (endpointSuffix || \"services.visualstudio.com\");\n            }\n\n            return fields;\n        }\n\n        function _sendEvents(evts, endpointUrl) {\n            if (JSON) {\n                var sender = win.fetch;\n                if (sender && !snipConfig.useXhr) {\n                    sender(endpointUrl, { method:strPostMethod, body: JSON.stringify(evts), mode:\"cors\"});\n                } else if (XMLHttpRequest) {\n                    // IE doesn't support fetch and private clouds may only be using IE\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(strPostMethod, endpointUrl);\n                    xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                    xhr.send(JSON.stringify(evts));\n                }\n            }\n        }\n\n        function _reportFailure(targetSrc) {\n            var conString = _parseConnectionString();\n            var iKey = conString[strInstrumentationKey] || aiConfig[strInstrumentationKey] || strEmpty;\n            var ingest = conString[strIngestionendpoint];\n            var endpointUrl = aiConfig[userOverrideEndpointUrl] ? aiConfig[userOverrideEndpointUrl] : (ingest + \"/v2/track\");\n            var message = \"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\";\n            var evts = [];\n            evts.push(_createException(iKey, message, targetSrc, endpointUrl));\n            evts.push(_createInternal(iKey, message, targetSrc, endpointUrl));\n\n            _sendEvents(evts, endpointUrl);\n        }\n\n        // Gets the time as an ISO date format, using a function as IE7/8 doesn't support toISOString\n        function _getTime() {\n            var date = new Date();\n            function pad(num) {\n                var r = strEmpty + num;\n                if (r.length === 1) {\n                    r = \"0\" + r;\n                }\n\n                return r;\n            }\n\n            return date.getUTCFullYear()\n                + \"-\" + pad(date.getUTCMonth() + 1)\n                + \"-\" + pad(date.getUTCDate())\n                + \"T\" + pad(date.getUTCHours())\n                + \":\" + pad(date.getUTCMinutes())\n                + \":\" + pad(date.getUTCSeconds())\n                + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                + \"Z\";            \n        }\n\n        function _createEnvelope(iKey, theType): any {\n            var tags = {};\n            var type = \"Browser\";\n            tags[strAiDevice + \"id\"] = type[strToLowerCase]();\n            tags[strAiDevice + \"type\"] = type;\n            tags[strAiOperationName] = locn && locn.pathname || \"_unknown_\";\n            tags[strAiSdkVersion] = \"javascript:snippet_\" + (appInsights.sv || appInsights.version);\n\n            return {\n                time: _getTime(),\n                iKey: iKey,\n                name: \"Microsoft.ApplicationInsights.\" + iKey.replace(/-/g, strEmpty) + \".\" + theType,\n                sampleRate: 100,\n                tags: tags,\n                data: {\n                    baseData: {\n                        ver: 2\n                    }\n                }\n            };\n        }\n\n        function _createInternal(iKey, message, targetSrc, endpointUrl) {\n            var envelope = _createEnvelope(iKey, \"Message\");\n            var data = envelope.data;\n            data.baseType = \"MessageData\";\n            var baseData = data.baseData;\n            baseData.message = \"AI (Internal): 99 message:\\\"\" + (message + \" (\" + targetSrc + \")\").replace(/\\\"/g, strEmpty) + \"\\\"\";\n            baseData.properties = {\n                endpoint: endpointUrl\n            };\n\n            return envelope;\n        }\n\n        function _createException(iKey, message, targetSrc, endpointUrl) {\n            var envelope = _createEnvelope(iKey, \"Exception\");\n            var data = envelope.data;\n            data.baseType = \"ExceptionData\";\n            data.baseData.exceptions = [{\n                typeName: \"SDKLoadFailed\",\n                message: message.replace(/\\./g, \"-\"),  // Replacing '.' characters as it causes the portal to hide the start of the message in the summary\n                hasFullStack: false,\n                stack: message + \"\\nSnippet failed to load [\" + targetSrc + \"] -- Telemetry is disabled\\nHelp Link: \" + helpLink + \"\\nHost: \" + (locn && locn.pathname || \"_unknown_\") + \"\\nEndpoint: \" + endpointUrl,\n                parsedStack: []\n            }];\n\n            return envelope;\n        }\n    \n        //     Commented out as we don't want to load from the CDN\n        // -------------------------------------------------------------\n        // Assigning these to local variables allows them to be minified to save space:\n        // var targetSrc = aiConfig.url || snipConfig.src;\n        // if (targetSrc) {\n        //     function _handleError(evt) {\n        //         loadFailed = true;\n        //         appInsights.queue = []; // Clear the queue\n        //         if (!handled) {\n        //             handled = true;\n        //             _reportFailure(targetSrc);\n        //         }\n        //     }\n\n        //     function _handleLoad(evt, isAbort) {\n        //         if (!handled) {\n        //             // IE10, Opera calls loaded before the script is processed.\n        //             // so delaying to give the script a chance to be processed\n        //             setTimeout(function() {\n        //                 if (isAbort || !appInsights.core) {\n        //                     _handleError();\n        //                 }\n        //             }, 500);\n        //         }\n        //     }\n\n        //     function _createScript() {\n        //         var scriptElement = doc.createElement(scriptText);\n        //         scriptElement.src = targetSrc;\n\n        //         // Allocate Cross origin only if defined and available\n        //         var crossOrigin = snipConfig[strCrossOrigin];\n        //         if ((crossOrigin || crossOrigin === \"\") && scriptElement[strCrossOrigin] != strUndefined) {\n        //             scriptElement[strCrossOrigin] = crossOrigin;\n        //         }\n            \n        //         scriptElement.onload = _handleLoad;\n        //         scriptElement.onerror = _handleError;\n\n        //         // Some browsers support onload while others onreadystatechange and others both\n        //         scriptElement.onreadystatechange = function (evt, isAbort) {\n        //             if (scriptElement.readyState === \"loaded\" || scriptElement.readyState === \"complete\") {\n        //                 _handleLoad(evt, isAbort);\n        //             }\n        //         };                \n\n        //         return scriptElement;\n        //     }\n\n        //     var theScript = _createScript();\n        //     if (snipConfig.ld < 0) {\n        //         // if user wants to append tag to document head, blocking page load\n        //         var headNode = doc.getElementsByTagName(\"head\")[0];\n        //         headNode.appendChild(theScript);\n        //     } else {\n        //         setTimeout(function () {\n        //             // Attempts to place the script tag in the same location as the first script on the page\n        //             doc.getElementsByTagName(scriptText)[0].parentNode.appendChild(theScript);\n        //         }, snipConfig.ld || 0);\n        //     }\n        // }\n    \n        // capture initial cookie\n        try {\n            appInsights.cookie = doc.cookie;\n        } catch (e) { }\n    \n        function _createMethods(methods) {\n            while (methods.length) {\n                (function (name) {\n                    // Define a temporary method that queues-up a the real method call\n                    appInsights[name] = function () {\n                        // Capture the original arguments passed to the method\n                        var originalArguments = arguments;\n                        if (!loadFailed) { // If we have detected that the main script failed to load then stop queuing events that will never be processed\n                            // Queue-up a call to the real method\n                            appInsights.queue.push(function () {\n                                // Invoke the real method with the captured original arguments\n                                appInsights[name].apply(appInsights, originalArguments);\n                            });\n                        }\n                    };\n                })(methods.pop());\n            }\n        }\n\n        var track = \"track\";\n        var trackPage = \"TrackPage\";\n        var trackEvent = \"TrackEvent\";\n        _createMethods([track + \"Event\", \n            track + \"PageView\", \n            track + \"Exception\", \n            track + \"Trace\", \n            track + \"DependencyData\", \n            track + \"Metric\", \n            track + \"PageViewPerformance\",\n            \"start\" + trackPage, \n            \"stop\" + trackPage,\n            \"start\" + trackEvent, \n            \"stop\" + trackEvent,\n            \"addTelemetryInitializer\", \n            \"setAuthenticatedUserContext\", \n            \"clearAuthenticatedUserContext\", \n            \"flush\"]);\n    \n        // expose SeverityLevel enum\n        appInsights['SeverityLevel'] = {\n            Verbose : 0,\n            Information : 1,\n            Warning : 2,\n            Error : 3,\n            Critical : 4\n        };\n    \n        // Collect global errors\n        // Note: ApplicationInsightsAnalytics is the extension string identifier for\n        //  AppAnalytics. It is defined in ApplicationInsights.ts:ApplicationInsights.identifer\n        var analyticsCfg = ((aiConfig.extensionConfig || {}).ApplicationInsightsAnalytics ||{});\n        if (!(aiConfig[strDisableExceptionTracking] === true || analyticsCfg[strDisableExceptionTracking] === true)) {\n            var method = \"onerror\";\n            _createMethods([\"_\" + method]);\n            var originalOnError = win[method];\n            win[method] = function(message, url, lineNumber, columnNumber, error) {\n                var handled = originalOnError && originalOnError(message, url, lineNumber, columnNumber, error);\n                if (handled !== true) {\n                    appInsights[\"_\" + method]({\n                        message: message,\n                        url: url,\n                        lineNumber: lineNumber,\n                        columnNumber: columnNumber,\n                        error: error\n                    });\n                }\n    \n                return handled;\n            };\n            aiConfig.autoExceptionInstrumented = true;\n        }\n    \n        return appInsights;\n    })(snipConfig.cfg);\n\n    function _onInit() {\n        if (snipConfig.onInit) {\n            snipConfig.onInit(aiSdk);\n        }\n    }\n\n    // if somebody calls the snippet twice, don't report page view again\n    if (aiSdk.queue && aiSdk.queue.length === 0) {\n        aiSdk.queue.push(_onInit);\n        // aiSdk.trackPageView({});\n    } else {\n        // Already loaded so just call the onInit\n        _onInit();\n    }\n\n    return aiSdk;\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/testSnippetV6.ts",
    "content": "\n\n/**\n * DO NOT FIX BUGS WITH THE OBJECT RETURNED BY THIS HELPER\n * -------------------------------------------------------\n * YOU *SHOULD* CREATE A NEW VERSION FOR EACH SNIPPET VERSION UNLESS CHANGES ARE MINIMAL\n * -------------------------------------------------------\n * This is a helper that returns an object that is the same as the v6 snippet, if there is\n * an issue with the tests because of the object this returns there is probably a bug during \n * initialization.\n */\nexport function createSnippetV6(snipConfig) {\n    let win = window;\n    let doc = document;\n\n    var locn = win.location;\n    var helpLink = \"https://go.microsoft.com/fwlink/?linkid=2128109\";\n    var scriptText = \"script\";\n    var strInstrumentationKey = \"instrumentationKey\";\n    var strIngestionendpoint = \"ingestionendpoint\";\n    var userOverrideEndpointUrl = \"userOverrideEndpointUrl\";\n    var strDisableExceptionTracking = \"disableExceptionTracking\";\n    var strAiDevice = \"ai.device.\";\n    var strAiOperationName = \"ai.operation.name\";\n    var strAiSdkVersion = \"ai.internal.sdkVersion\";\n    var strToLowerCase = \"toLowerCase\";\n    var strConStringIKey = strInstrumentationKey[strToLowerCase]();\n    var strEmpty = \"\";\n    var strUndefined = \"undefined\";\n    var strCrossOrigin = \"crossOrigin\";\n\n    var strPostMethod = \"POST\";\n    var sdkInstanceName = \"appInsightsSDK\";         // required for Initialization to find the current instance\n    var aiName = snipConfig.name || \"appInsights\";  // provide non default instance name through snipConfig name value\n    if (snipConfig.name || win[sdkInstanceName]) {\n        // Only set if supplied or another name is defined to avoid polluting the global namespace\n        win[sdkInstanceName] = aiName;\n    }\n    var aiSdk = win[aiName] || (function (aiConfig) {\n        var loadFailed = false;\n        var handled = false;\n        var appInsights: any = {\n            initialize: true,   // initialize sdk on download\n            queue: [],\n            sv: \"6\",            // Track the actual snippet version for reporting.\n            version: 2.0,       // initialization version, if this is not 2.0 the previous scripts fail to initialize\n            config: aiConfig\n        };\n        function _parseConnectionString() {\n            var fields: any = {};\n            var connectionString = aiConfig.connectionString;\n            if (connectionString) {\n                var kvPairs = connectionString.split(\";\");\n                for (var lp = 0; lp < kvPairs.length; lp++) {\n                    var kvParts = kvPairs[lp].split(\"=\");\n    \n                    if (kvParts.length === 2) { // only save fields with valid formats\n                        fields[kvParts[0][strToLowerCase]()] = kvParts[1];\n                    }\n                }\n            }\n\n            // apply the default endpoints\n            if (!fields[strIngestionendpoint]) {\n                // use endpoint suffix where overrides are not provided\n                var endpointSuffix = fields.endpointsuffix;\n                // Only fetch the location if a suffix was supplied\n                var fLocation = endpointSuffix ? fields.location : null;\n                fields[strIngestionendpoint] = \"https://\" + (fLocation ? fLocation + \".\" : strEmpty) + \"dc.\" + (endpointSuffix || \"services.visualstudio.com\");\n            }\n\n            return fields;\n        }\n\n        function _sendEvents(evts, endpointUrl) {\n            if (JSON) {\n                var sender = win.fetch;\n                if (sender && !snipConfig.useXhr) {\n                    sender(endpointUrl, { method:strPostMethod, body: JSON.stringify(evts), mode:\"cors\"});\n                } else if (XMLHttpRequest) {\n                    // IE doesn't support fetch and private clouds may only be using IE\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(strPostMethod, endpointUrl);\n                    xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                    xhr.send(JSON.stringify(evts));\n                }\n            }\n        }\n\n        function _reportFailure(targetSrc) {\n            var conString = _parseConnectionString();\n            var iKey = conString[strConStringIKey] || aiConfig[strInstrumentationKey] || strEmpty;\n            var ingest = conString[strIngestionendpoint];\n            var endpointUrl = aiConfig[userOverrideEndpointUrl] ? aiConfig[userOverrideEndpointUrl] : (ingest + \"/v2/track\");\n\n            var message = \"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\";\n            var evts = [];\n            evts.push(_createException(iKey, message, targetSrc, endpointUrl));\n            evts.push(_createInternal(iKey, message, targetSrc, endpointUrl));\n\n            _sendEvents(evts, endpointUrl);\n        }\n\n        // Gets the time as an ISO date format, using a function as IE7/8 doesn't support toISOString\n        function _getTime() {\n            var date = new Date();\n            function pad(num) {\n                var r = strEmpty + num;\n                if (r.length === 1) {\n                    r = \"0\" + r;\n                }\n\n                return r;\n            }\n\n            return date.getUTCFullYear()\n                + \"-\" + pad(date.getUTCMonth() + 1)\n                + \"-\" + pad(date.getUTCDate())\n                + \"T\" + pad(date.getUTCHours())\n                + \":\" + pad(date.getUTCMinutes())\n                + \":\" + pad(date.getUTCSeconds())\n                + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                + \"Z\";            \n        }\n\n        function _createEnvelope(iKey, theType): any {\n            var tags = {};\n            var type = \"Browser\";\n            tags[strAiDevice + \"id\"] = type[strToLowerCase]();\n            tags[strAiDevice + \"type\"] = type;\n            tags[strAiOperationName] = locn && locn.pathname || \"_unknown_\";\n            tags[strAiSdkVersion] = \"javascript:snippet_\" + (appInsights.sv || appInsights.version);\n\n            return {\n                time: _getTime(),\n                iKey: iKey,\n                name: \"Microsoft.ApplicationInsights.\" + iKey.replace(/-/g, strEmpty) + \".\" + theType,\n                sampleRate: 100,\n                tags: tags,\n                data: {\n                    baseData: {\n                        ver: 2\n                    }\n                }\n            };\n        }\n\n        function _createInternal(iKey, message, targetSrc, endpointUrl) {\n            var envelope = _createEnvelope(iKey, \"Message\");\n            var data = envelope.data;\n            data.baseType = \"MessageData\";\n            var baseData = data.baseData;\n            baseData.message = \"AI (Internal): 99 message:\\\"\" + (message + \" (\" + targetSrc + \")\").replace(/\\\"/g, strEmpty) + \"\\\"\";\n            baseData.properties = {\n                endpoint: endpointUrl\n            };\n\n            return envelope;\n        }\n\n        function _createException(iKey, message, targetSrc, endpointUrl) {\n            var envelope = _createEnvelope(iKey, \"Exception\");\n            var data = envelope.data;\n            data.baseType = \"ExceptionData\";\n            data.baseData.exceptions = [{\n                typeName: \"SDKLoadFailed\",\n                message: message.replace(/\\./g, \"-\"),  // Replacing '.' characters as it causes the portal to hide the start of the message in the summary\n                hasFullStack: false,\n                stack: message + \"\\nSnippet failed to load [\" + targetSrc + \"] -- Telemetry is disabled\\nHelp Link: \" + helpLink + \"\\nHost: \" + (locn && locn.pathname || \"_unknown_\") + \"\\nEndpoint: \" + endpointUrl,\n                parsedStack: []\n            }];\n\n            return envelope;\n        }\n    \n        //     Commented out as we don't want to load from the CDN\n        // -------------------------------------------------------------\n        // Assigning these to local variables allows them to be minified to save space:\n        // var targetSrc = aiConfig.url || snipConfig.src;\n        // if (targetSrc) {\n        //     function _handleError(evt) {\n        //         loadFailed = true;\n        //         appInsights.queue = []; // Clear the queue\n        //         if (!handled) {\n        //             handled = true;\n        //             _reportFailure(targetSrc);\n        //         }\n        //     }\n\n        //     function _handleLoad(evt, isAbort) {\n        //         if (!handled) {\n        //             // IE10, Opera calls loaded before the script is processed.\n        //             // so delaying to give the script a chance to be processed\n        //             setTimeout(function() {\n        //                 if (isAbort || !appInsights.core) {\n        //                     _handleError();\n        //                 }\n        //             }, 500);\n        //         }\n        //     }\n\n        //     function _createScript() {\n        //         var scriptElement = doc.createElement(scriptText);\n        //         scriptElement.src = targetSrc;\n\n        //         // Allocate Cross origin only if defined and available\n        //         var crossOrigin = snipConfig[strCrossOrigin];\n        //         if ((crossOrigin || crossOrigin === \"\") && scriptElement[strCrossOrigin] != strUndefined) {\n        //             scriptElement[strCrossOrigin] = crossOrigin;\n        //         }\n            \n        //         scriptElement.onload = _handleLoad;\n        //         scriptElement.onerror = _handleError;\n\n        //         // Some browsers support onload while others onreadystatechange and others both\n        //         scriptElement.onreadystatechange = function (evt, isAbort) {\n        //             if (scriptElement.readyState === \"loaded\" || scriptElement.readyState === \"complete\") {\n        //                 _handleLoad(evt, isAbort);\n        //             }\n        //         };                \n\n        //         return scriptElement;\n        //     }\n\n        //     var theScript = _createScript();\n        //     if (snipConfig.ld < 0) {\n        //         // if user wants to append tag to document head, blocking page load\n        //         var headNode = doc.getElementsByTagName(\"head\")[0];\n        //         headNode.appendChild(theScript);\n        //     } else {\n        //         setTimeout(function () {\n        //             // Attempts to place the script tag in the same location as the first script on the page\n        //             doc.getElementsByTagName(scriptText)[0].parentNode.appendChild(theScript);\n        //         }, snipConfig.ld || 0);\n        //     }\n        // }\n    \n        // capture initial cookie\n        try {\n            appInsights.cookie = doc.cookie;\n        } catch (e) { }\n    \n        function _createMethods(methods) {\n            while (methods.length) {\n                (function (name) {\n                    // Define a temporary method that queues-up a the real method call\n                    appInsights[name] = function () {\n                        // Capture the original arguments passed to the method\n                        var originalArguments = arguments;\n                        if (!loadFailed) { // If we have detected that the main script failed to load then stop queuing events that will never be processed\n                            // Queue-up a call to the real method\n                            appInsights.queue.push(function () {\n                                // Invoke the real method with the captured original arguments\n                                appInsights[name].apply(appInsights, originalArguments);\n                            });\n                        }\n                    };\n                })(methods.pop());\n            }\n        }\n\n        var track = \"track\";\n        var trackPage = \"TrackPage\";\n        var trackEvent = \"TrackEvent\";\n        _createMethods([track + \"Event\", \n            track + \"PageView\", \n            track + \"Exception\", \n            track + \"Trace\", \n            track + \"DependencyData\", \n            track + \"Metric\", \n            track + \"PageViewPerformance\",\n            \"start\" + trackPage, \n            \"stop\" + trackPage,\n            \"start\" + trackEvent, \n            \"stop\" + trackEvent,\n            \"addTelemetryInitializer\", \n            \"setAuthenticatedUserContext\", \n            \"clearAuthenticatedUserContext\", \n            \"flush\"]);\n    \n        // expose SeverityLevel enum\n        appInsights['SeverityLevel'] = {\n            Verbose : 0,\n            Information : 1,\n            Warning : 2,\n            Error : 3,\n            Critical : 4\n        };\n    \n        // Collect global errors\n        // Note: ApplicationInsightsAnalytics is the extension string identifier for\n        //  AppAnalytics. It is defined in ApplicationInsights.ts:ApplicationInsights.identifer\n        var analyticsCfg = ((aiConfig.extensionConfig || {}).ApplicationInsightsAnalytics ||{});\n        if (!(aiConfig[strDisableExceptionTracking] === true || analyticsCfg[strDisableExceptionTracking] === true)) {\n            var method = \"onerror\";\n            _createMethods([\"_\" + method]);\n            var originalOnError = win[method];\n            win[method] = function(message, url, lineNumber, columnNumber, error) {\n                var handled = originalOnError && originalOnError(message, url, lineNumber, columnNumber, error);\n                if (handled !== true) {\n                    appInsights[\"_\" + method]({\n                        message: message,\n                        url: url,\n                        lineNumber: lineNumber,\n                        columnNumber: columnNumber,\n                        error: error,\n                        evt: win.event\n                    });\n                }\n    \n                return handled;\n            };\n            aiConfig.autoExceptionInstrumented = true;\n        }\n    \n        return appInsights;\n    })(snipConfig.cfg);\n\n    // global instance must be set in this order to mitigate issues in ie8 and lower\n    // win[aiName] = aiSdk;\n    \n    function _onInit() {\n        if (snipConfig.onInit) {\n            snipConfig.onInit(aiSdk);\n        }\n    }\n\n    // if somebody calls the snippet twice, don't report page view again\n    if (aiSdk.queue && aiSdk.queue.length === 0) {\n        aiSdk.queue.push(_onInit);\n        // aiSdk.trackPageView({});\n    } else {\n        // Already loaded so just call the onInit\n        _onInit();\n    }\n\n    return aiSdk;\n}"
  },
  {
    "path": "AISKU/Tests/Unit/src/validate.e2e.tests.ts",
    "content": "import { ApplicationInsights, IApplicationInsights } from '../../../src/applicationinsights-web'\nimport { Sender } from '@microsoft/applicationinsights-channel-js';\nimport { SinonSpy } from 'sinon';\nimport { AITestClass, Assert, PollingAssert } from '@microsoft/ai-test-framework';\nimport { dumpObj } from '@microsoft/applicationinsights-core-js';\nimport { BreezeChannelIdentifier } from '@microsoft/applicationinsights-core-js';\n\nexport class ValidateE2ETests extends AITestClass {\n    private readonly _instrumentationKey = 'b7170927-2d1c-44f1-acec-59f4e1751c11';\n\n    private _ai: IApplicationInsights;\n\n    // Sinon\n    private errorSpy: SinonSpy;\n    private successSpy: SinonSpy;\n    private loggingSpy: SinonSpy;\n\n    private delay = 100;\n\n    constructor() {\n        super(\"ValidateE2ETests\");\n    }\n    \n    public testInitialize() {\n        try {\n            this.useFakeServer = false;\n            const init = new ApplicationInsights({\n                config: {\n                    instrumentationKey: this._instrumentationKey,\n                    extensionConfig: {\n                        'AppInsightsChannelPlugin': {\n                            maxBatchInterval: 500\n                        },\n                        [\"AppInsightsCfgSyncPlugin\"]: {\n                            cfgUrl: \"\"\n                        }\n                        \n                    }\n                },\n                queue: [],\n                version: 2.0\n            });\n            this._ai = init.loadAppInsights();\n\n            // Setup Sinon stuff\n            const sender: Sender = this._ai.appInsights.core.getPlugin<Sender>(BreezeChannelIdentifier).plugin;\n            this.errorSpy = this.sandbox.spy(sender, '_onError');\n            this.successSpy = this.sandbox.spy(sender, '_onSuccess');\n            this.loggingSpy = this.sandbox.stub(this._ai.appInsights.core.logger, 'throwInternal');\n        } catch (e) {\n            console.error('Failed to initialize');\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ai) {\n            this._ai.unload(false);\n            this._ai = null;\n        }        \n    }\n\n    public registerTests() {\n        this.addAsyncTests();\n    }\n\n    private addAsyncTests(): void {\n    \n        this.testCase({\n            name: \"Validate track event\",\n            test: () => {\n                this._ai.trackTrace({message: \"test\"});\n                this._ai.trackTrace({message: \"test event\"}, { p1: \"value 1\", p2: \"value 2\", m1: 123, m2: 456.7 });\n                \n                return this._asyncQueue()\n                    .add(this.waitForResponse())\n                    .add(() => {\n                        this.boilerPlateAsserts();\n                        const acceptedItems = this.getPayloadMessages(this.successSpy).length;\n                        Assert.equal(2, acceptedItems, \"backend should accept two events\");\n                        if (acceptedItems != 2) {\n                            this.dumpPayloadMessages(this.successSpy);\n                        }\n                    });\n            }\n        });\n\n        this.testCase({\n            name: 'E2E.GenericTests: trackEvent sends to backend with NaN value could be handled correctly',\n            test: () => {\n                const customeProperties = {\n                    nanValue: NaN,\n                }\n                this._ai.trackEvent({ name: 'event', properties: { \"prop1\": NaN, \"prop2\": NaN }}, customeProperties);\n                \n                return this._asyncQueue()\n                    .add(this.waitForResponse())\n                    .add(() => {\n                        this.boilerPlateAsserts();\n                        const acceptedItems = this.getPayloadMessages(this.successSpy).length;\n                        Assert.equal(1, acceptedItems, \"backend should accept two events\");\n                        if (acceptedItems != 1) {\n                            this.dumpPayloadMessages(this.successSpy);\n                        }\n                        const payloadStr: string[] = this.getPayloadMessages(this.successSpy);\n                        if (payloadStr.length > 0) {\n                            const payload = JSON.parse(payloadStr[0]);\n                            const data = payload.data;\n                            Assert.ok(data && data.baseData);\n                            Assert.equal(null, data.baseData.measurements[\"nanValue\"]);\n                            Assert.equal(\"NaN\", data.baseData.properties[\"prop1\"]);\n                        }\n                    });\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that track event takes all type of characters\",\n            test: () => {\n                const s1 = \"شلاؤيثبلاهتنمةىخحضقسفعشلاؤيصثبل\";\n                const s2 = \"Ինչու՞ նրանք չեն խոսում Հայերեն\";\n                const s3 = \"ওরা কন বাংলা বলেত পাের না\";\n                const s4 = \"妣 啊 僜刓嘰塡奬〉媆孿 偁偄偙 偁A偄E偆I偊O偍U\";\n                const s5 = \"ßüµ€ÄäÖö€ ερτυθιοπαδφγηξκλζχψωβνΔΦΓΗΞΚΛΨΩΘ რატომ\";\n                const s6 = \"йцуукенгшщзхъфываполджэс\";\n                const s7 = \"\\x0000\\x0001\\x0002\\x0003\\x0004\\x0005\\x0006\\x0007\\x0008\\x009F\";\n\n                // white spaces\n                this._ai.trackTrace({message: \" abcd efg   \"}, { \" abc \" : \"value 1\", \" \" : \"value 2\" });\n\n                // international characters\n                this._ai.trackTrace({message: s1}, { p: s2 });\n                this._ai.trackTrace({message: s3}, { p: s4 });\n                this._ai.trackTrace({message: s5}, { p: s6, p2: s7 });\n                \n                return this._asyncQueue()\n                    .add(this.waitForResponse())\n                    .add(() => {\n                        this.boilerPlateAsserts();\n                        let acceptedItems = 0;\n                        this.successSpy.args.forEach(call => {\n                            call[0].forEach(item => {\n                                let message = item;\n                                if (typeof item !== \"string\") {\n                                    message = item.item;\n                                }\n                                // Ignore the internal SendBrowserInfoOnUserInit message (Only occurs when running tests in a browser)\n                                if (message.indexOf(\"AI (Internal): 72 \") == -1) {\n                                    acceptedItems ++;\n                                }\n                            });\n                        });\n\n                        Assert.equal(4, acceptedItems, \"backend should accept all four events\");\n                        if (acceptedItems != 4) {\n                            this.dumpPayloadMessages(this.successSpy);\n                        }\n                    });\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that special characters are handled correctly\",\n            test: () => {\n                const s1 = \"[]{};,.)(*&^%$#@/\\\\\";\n\n                this._ai.trackTrace({message: s1}, { p: s1 });\n                this._ai.trackTrace({message: \"a\"}, { \"[]{};,.)(*&^%$#@/\\\\\": \"b\" });\n                \n                return this._asyncQueue()\n                    .add(this.waitForResponse())\n                    .add(() => {\n                        this.boilerPlateAsserts();\n                        const acceptedItems = this.getPayloadMessages(this.successSpy).length;\n                        Assert.equal(2, acceptedItems, \"backend should accept the event\");\n                        if (acceptedItems != 2) {\n                            this.dumpPayloadMessages(this.successSpy);\n                        }\n                    });\n            }\n        });\n    }\n    \n\n    private waitForResponse() {\n        return PollingAssert.asyncTaskPollingAssert(() => {\n            return (this.successSpy.called || this.errorSpy.called);\n        }, \"Wait for response\" + new Date().toISOString(), 15, 1000) as any\n    }\n\n    private boilerPlateAsserts() {\n        Assert.ok(this.successSpy.called, \"success\");\n        Assert.ok(!this.errorSpy.called, \"no error sending\");\n        const isValidCallCount = this.loggingSpy.callCount === 0;\n        Assert.ok(isValidCallCount, \"logging spy was called 0 time(s)\");\n        if (!isValidCallCount) {\n            while (this.loggingSpy.args.length) {\n                Assert.ok(false, \"[warning thrown]: \" + dumpObj(this.loggingSpy.args.pop()));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript AISKU</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>    \n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n    \n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                sinon: \"../../common/Tests/External/sinon-7.3.1\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\",\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"sinon\");\n        modules.add(\"pako\",\"./node_modules/pako/dist/pako\");\n        modules.add(\"@microsoft/applicationinsights-offlinechannel-js\");        // Load offline plugin\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function () {\n\n            var testModule = modules.add(\"Tests/Unit/src/aiskuunittests\", \"./Unit/dist/aiskuunittests.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "AISKU/Tests/es6-module-type-check/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-test-module-type-check\",\n    \"author\": \"Microsoft Application Insights Team and Contributors\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights ES6 Module and Type check Example\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"keywords\": [\n        \"example\"\n    ],\n    \"module\": \"dist-es5/applicationinsights-test-module-type-check.js\",\n    \"types\": \"types/applicationinsights-test-module-type-check.d.ts\",\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"tsc --project tsconfig.json --noEmit\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"mintest\": \"\",\n        \"perftest\": \"\",\n        \"ai-min\": \"\",\n        \"ai-restore\": \"\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/AISKU/Tests/es6-module-type-check\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"typescript\": \"^4.9.3\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-web\": \"3.4.1\"\n    }\n}\n"
  },
  {
    "path": "AISKU/Tests/es6-module-type-check/src/main.ts",
    "content": "import { ContextTagKeys } from \"@microsoft/applicationinsights-core-js\";\nimport { ITelemetryItem } from \"@microsoft/applicationinsights-web\";"
  },
  {
    "path": "AISKU/Tests/es6-module-type-check/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      \"module\": \"commonjs\",\n      \"target\": \"es6\",\n      \"lib\": [\"es2015\", \"dom\"],\n      \"outDir\": \"./dist\",\n      \"strictNullChecks\": true,\n      \"experimentalDecorators\": true,\n      \"paths\": {\n        \"tslib\": [\"./node_modules/tslib/tslib.es6.js\"],\n        \"tsyringe\": [\"./node_modules/tsyringe/dist/esm2015\"]\n      }\n    },\n    \"include\": [\"./src/**/*.ts\"]\n  }\n  "
  },
  {
    "path": "AISKU/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}\n"
  },
  {
    "path": "AISKU/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-web.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n  ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "AISKU/dist-history/aisdk.0.0.13.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./amd/bundle/Init.js\":\n/*!****************************!*\\\n  !*** ./amd/bundle/Init.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! ./Initialization */ \"./amd/bundle/Initialization.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_analytics_js_1, Initialization_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    //should be global function that should load as soon as SDK loads\n    try {\n        // E2E sku on load initializes core and pipeline using snippet as input for configuration\n        var aiName;\n        if (typeof window !== \"undefined\" && typeof JSON !== \"undefined\") {\n            // get snippet or initialize to an empty object\n            // get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation\n            aiName = window[\"appInsightsSDK\"];\n            if (window[aiName] === undefined) {\n                // if no snippet is present, initialize default values\n                applicationinsights_analytics_js_1.ApplicationInsights.appInsightsDefaultConfig = Initialization_1.Initialization.getDefaultConfig();\n            }\n            else {\n                if (window[aiName].initialize) {\n                    // this is the typical case for browser+snippet\n                    var snippet = window[aiName] || {};\n                    // overwrite snippet with full appInsights\n                    var initialization = new Initialization_1.Initialization(snippet);\n                    var appInsightsLocal = initialization.loadAppInsights();\n                    // apply full appInsights to the global instance that was initialized in the snippet\n                    for (var field in appInsightsLocal) {\n                        snippet[field] = appInsightsLocal[field];\n                    }\n                    // Empty queue of all api calls logged prior to sdk download\n                    initialization.emptyQueue();\n                    initialization.addHousekeepingBeforeUnload(appInsightsLocal);\n                }\n            }\n        }\n    }\n    catch (e) {\n        // TODO: Find better place to warn to console when SDK initialization fails\n        if (console) {\n            console.warn('Failed to initialize AppInsights JS SDK for instance ' + aiName + e.message);\n        }\n    }\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./amd/bundle/Initialization.js\":\n/*!**************************************!*\\\n  !*** ./amd/bundle/Initialization.js ***!\n  \\**************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-channel-js */ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\"), __webpack_require__(/*! applicationinsights-properties-js */ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\"), __webpack_require__(/*! applicationinsights-dependencies-js */ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_analytics_js_1, applicationinsights_common_1, applicationinsights_channel_js_1, applicationinsights_properties_js_1, applicationinsights_dependencies_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    ;\n    var Initialization = /** @class */ (function () {\n        function Initialization(snippet) {\n            // initialize the queue and config in case they are undefined\n            snippet.queue = snippet.queue || [];\n            var config = snippet.config || {};\n            // ensure instrumentationKey is specified\n            if (config && !config.instrumentationKey) {\n                config = snippet;\n                applicationinsights_analytics_js_1.ApplicationInsights.Version = \"2.0.0\";\n            }\n            this.appInsights = new applicationinsights_analytics_js_1.ApplicationInsights();\n            // set default values using config passed through snippet\n            config = Initialization.getDefaultConfig(config, this.appInsights.identifier);\n            this.properties = new applicationinsights_properties_js_1.PropertiesPlugin();\n            this.dependencies = new applicationinsights_dependencies_js_1.AjaxPlugin();\n            this.snippet = snippet;\n            this.config = config;\n        }\n        // Analytics Plugin\n        Initialization.prototype.trackPageView = function (pageView, customProperties) {\n            this.appInsights.trackPageView(pageView, customProperties);\n        };\n        Initialization.prototype.trackException = function (exception, customProperties) {\n            this.appInsights.trackException(exception, customProperties);\n        };\n        Initialization.prototype._onerror = function (exception) {\n            this.appInsights._onerror(exception);\n        };\n        Initialization.prototype.trackTrace = function (trace, customProperties) {\n            this.appInsights.trackTrace(trace, customProperties);\n        };\n        Initialization.prototype.trackMetric = function (metric, customProperties) {\n            this.appInsights.trackMetric(metric, customProperties);\n        };\n        Initialization.prototype.startTrackPage = function (name) {\n            this.appInsights.startTrackPage(name);\n        };\n        Initialization.prototype.stopTrackPage = function (name, url, customProperties) {\n            this.appInsights.stopTrackPage(name, url, customProperties);\n        };\n        Initialization.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            return this.appInsights.addTelemetryInitializer(telemetryInitializer);\n        };\n        // Properties Plugin\n        Initialization.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            this.properties.user.setAuthenticatedUserContext(authenticatedUserId, accountId, storeInCookie);\n        };\n        Initialization.prototype.clearAuthenticatedUserContext = function () {\n            this.properties.user.clearAuthenticatedUserContext();\n        };\n        // Dependencies Plugin\n        Initialization.prototype.trackDependencyData = function (dependency, customProperties, systemProperties) {\n            this.dependencies.trackDependencyData(dependency, customProperties, systemProperties);\n        };\n        Initialization.prototype.loadAppInsights = function () {\n            this.core = new applicationinsights_core_js_1.AppInsightsCore();\n            var extensions = [];\n            var appInsightsChannel = new applicationinsights_channel_js_1.Sender();\n            extensions.push(appInsightsChannel);\n            extensions.push(this.properties);\n            extensions.push(this.dependencies);\n            extensions.push(this.appInsights);\n            // initialize core\n            this.core.initialize(this.config, extensions);\n            // initialize extensions\n            this.appInsights.initialize(this.config, this.core, extensions);\n            appInsightsChannel.initialize(this.config, this.core, extensions);\n            return this;\n        };\n        Initialization.prototype.emptyQueue = function () {\n            // call functions that were queued before the main script was loaded\n            try {\n                if (applicationinsights_common_1.Util.isArray(this.snippet.queue)) {\n                    // note: do not check length in the for-loop conditional in case something goes wrong and the stub methods are not overridden.\n                    var length = this.snippet.queue.length;\n                    for (var i = 0; i < length; i++) {\n                        var call = this.snippet.queue[i];\n                        call();\n                    }\n                    this.snippet.queue = undefined;\n                    delete this.snippet.queue;\n                }\n            }\n            catch (exception) {\n                var properties = {};\n                if (exception && typeof exception.toString === \"function\") {\n                    properties.exception = exception.toString();\n                }\n                // need from core\n                // Microsoft.ApplicationInsights._InternalLogging.throwInternal(\n                //     LoggingSeverity.WARNING,\n                //     _InternalMessageId.FailedToSendQueuedTelemetry,\n                //     \"Failed to send queued telemetry\",\n                //     properties);\n            }\n        };\n        Initialization.prototype.pollInteralLogs = function (appInsightsInstance) {\n            // return setInterval(() => {\n            //     var queue: Array<_InternalLogMessage> = ApplicationInsights._InternalLogging.queue;\n            //     var length = queue.length;\n            //     for (var i = 0; i < length; i++) {\n            //         appInsightsInstance.trackTrace(queue[i].message);\n            //     }\n            //     queue.length = 0;\n            // }, this.config.diagnosticLogInterval);\n        };\n        Initialization.prototype.addHousekeepingBeforeUnload = function (appInsightsInstance) {\n            // Add callback to push events when the user navigates away\n            if (!appInsightsInstance.appInsights.config.disableFlushOnBeforeUnload && ('onbeforeunload' in window)) {\n                var performHousekeeping = function () {\n                    // Adds the ability to flush all data before the page unloads.\n                    // Note: This approach tries to push an async request with all the pending events onbeforeunload.\n                    // Firefox does not respect this.Other browsers DO push out the call with < 100% hit rate.\n                    // Telemetry here will help us analyze how effective this approach is.\n                    // Another approach would be to make this call sync with a acceptable timeout to reduce the \n                    // impact on user experience.\n                    //appInsightsInstance.context._sender.triggerSend();\n                    appInsightsInstance.appInsights.core.getTransmissionControls().forEach(function (queues) {\n                        queues.forEach(function (channel) { return channel.flush(true); });\n                    });\n                    // Back up the current session to local storage\n                    // This lets us close expired sessions after the cookies themselves expire\n                    // Todo: move this against interface behavior\n                    if (this.core.extensions[\"AppInsightsPropertiesPlugin\"] &&\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager) {\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager.backup();\n                    }\n                };\n                if (!applicationinsights_common_1.Util.addEventHandler('beforeunload', performHousekeeping)) {\n                    this.core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToAddHandlerForOnBeforeUnload, 'Could not add handler for beforeunload');\n                }\n            }\n        };\n        Initialization.getDefaultConfig = function (configuration, identifier) {\n            if (!configuration) {\n                configuration = {};\n            }\n            if (configuration) {\n                identifier = identifier ? identifier : \"ApplicationInsightsAnalytics\";\n            }\n            var config = configuration.extensions ? configuration.extensions[identifier] : {};\n            // set default values\n            configuration.endpointUrl = configuration.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\";\n            config.sessionRenewalMs = 30 * 60 * 1000;\n            config.sessionExpirationMs = 24 * 60 * 60 * 1000;\n            config.enableDebug = applicationinsights_common_1.Util.stringToBoolOrDefault(config.enableDebug);\n            config.disableExceptionTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(config.disableExceptionTracking);\n            config.consoleLoggingLevel = config.consoleLoggingLevel || 1; // Show only CRITICAL level\n            config.telemetryLoggingLevel = config.telemetryLoggingLevel || 0; // Send nothing\n            config.diagnosticLogInterval = config.diagnosticLogInterval || 10000;\n            config.autoTrackPageVisitTime = applicationinsights_common_1.Util.stringToBoolOrDefault(config.autoTrackPageVisitTime);\n            if (isNaN(config.samplingPercentage) || config.samplingPercentage <= 0 || config.samplingPercentage >= 100) {\n                config.samplingPercentage = 100;\n            }\n            config.disableAjaxTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(config.disableAjaxTracking);\n            config.maxAjaxCallsPerView = !isNaN(config.maxAjaxCallsPerView) ? config.maxAjaxCallsPerView : 500;\n            config.disableCorrelationHeaders = applicationinsights_common_1.Util.stringToBoolOrDefault(config.disableCorrelationHeaders);\n            config.correlationHeaderExcludedDomains = config.correlationHeaderExcludedDomains || [\n                \"*.blob.core.windows.net\",\n                \"*.blob.core.chinacloudapi.cn\",\n                \"*.blob.core.cloudapi.de\",\n                \"*.blob.core.usgovcloudapi.net\"\n            ];\n            config.disableFlushOnBeforeUnload = applicationinsights_common_1.Util.stringToBoolOrDefault(config.disableFlushOnBeforeUnload);\n            config.isCookieUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(config.isCookieUseDisabled);\n            config.isStorageUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(config.isStorageUseDisabled);\n            config.isBrowserLinkTrackingEnabled = applicationinsights_common_1.Util.stringToBoolOrDefault(config.isBrowserLinkTrackingEnabled);\n            config.enableCorsCorrelation = applicationinsights_common_1.Util.stringToBoolOrDefault(config.enableCorsCorrelation);\n            return configuration;\n        };\n        return Initialization;\n    }());\n    exports.Initialization = Initialization;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * ApplicationInsights.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Telemetry/PageViewManager */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, PageViewManager_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var durationProperty = \"duration\";\n    var ApplicationInsights = /** @class */ (function () {\n        function ApplicationInsights() {\n            this.identifier = \"ApplicationInsightsAnalytics\";\n            this.priority = 160; // take from reserved priority range 100- 200\n            this._isInitialized = false;\n            // Counts number of trackAjax invokations.\n            // By default we only monitor X ajax call per view to avoid too much load.\n            // Default value is set in config.\n            // This counter keeps increasing even after the limit is reached.\n            this._trackAjaxAttempts = 0;\n            this.initialize = this._initialize.bind(this);\n        }\n        ApplicationInsights.prototype.processTelemetry = function (env) {\n            var doNotSendItem = false;\n            try {\n                var telemetryInitializersCount = this._telemetryInitializers.length;\n                for (var i = 0; i < telemetryInitializersCount; ++i) {\n                    var telemetryInitializer = this._telemetryInitializers[i];\n                    if (telemetryInitializer) {\n                        if (telemetryInitializer.apply(null, [env]) === false) {\n                            doNotSendItem = true;\n                            break;\n                        }\n                    }\n                }\n            }\n            catch (e) {\n                doNotSendItem = true;\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryInitializerFailed, \"One of telemetry initializers failed, telemetry item will not be sent: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) }, true);\n            }\n            if (!doNotSendItem && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(env);\n            }\n        };\n        ApplicationInsights.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * @description Log a diagnostic message\n         * @param {ITraceTelemetry} trace\n         * @param {{[key: string]: any}} [customProperties]\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackTrace = function (trace, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(trace, applicationinsights_common_1.Trace.dataType, applicationinsights_common_1.Trace.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TrackTraceFailed, \"trackTrace failed, trace will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Log a numeric value that is not associated with a specific event. Typically\n         * used to send regular reports of performance indicators. To send single measurement, just\n         * use the name and average fields of {@link IMetricTelemetry}. If you take measurements\n         * frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements\n         * and sending the resulting average at intervals\n         * @param {IMetricTelemetry} metric input object argument. Only name and average are mandatory.\n         * @param {{[key: string]: any}} customProperties additional data used to filter metrics in the\n         * portal. Defaults to empty.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackMetric = function (metric, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(metric, applicationinsights_common_1.Metric.dataType, applicationinsights_common_1.Metric.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackMetricFailed, \"trackMetric failed, metric will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs that a page or other item was viewed.\n         * @param IPageViewTelemetry The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param customProperties Additional data used to filter events and metrics. Defaults to empty. If a user wants\n         *                         to provide a custom duration, it'll have to be in customProperties\n         */\n        ApplicationInsights.prototype.trackPageView = function (pageView, customProperties) {\n            try {\n                this._pageViewManager.trackPageView(pageView, customProperties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(pageView.name, pageView.uri);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailed, \"trackPageView failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Create a page view telemetry item and send it to the SDK pipeline through the core.track API\n         * @param pageView Page view item to be sent\n         * @param properties Custom properties (Part C) that a user can add to the telemetry item\n         * @param systemProperties System level properties (Part A) that a user can add to the telemetry item\n         */\n        ApplicationInsights.prototype.sendPageViewInternal = function (pageView, properties, systemProperties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageView, applicationinsights_common_1.PageView.dataType, applicationinsights_common_1.PageView.envelopeType, this._logger, properties, systemProperties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n            // reset ajaxes counter\n            this._trackAjaxAttempts = 0;\n        };\n        ApplicationInsights.prototype.sendPageViewPerformanceInternal = function (pageViewPerformance, properties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageViewPerformance, applicationinsights_common_1.PageViewPerformance.dataType, applicationinsights_common_1.PageViewPerformance.envelopeType, this._logger, properties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n        };\n        /**\n         * Starts timing how long the user views a page or other item. Call this when the page opens.\n         * This method doesn't send any telemetry. Call {@link stopTrackTelemetry} to log the page when it closes.\n         * @param name A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n         */\n        ApplicationInsights.prototype.startTrackPage = function (name) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                this._pageTracking.start(name);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StartTrackFailed, \"startTrackPage failed, page view may not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs how long a page or other item was visible, after {@link startTrackPage}. Call this when the page closes.\n         * @param name The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param url A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n         * @param properties Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *                   Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric\n         */\n        ApplicationInsights.prototype.stopTrackPage = function (name, url, properties) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                if (typeof url !== \"string\") {\n                    url = window.location && window.location.href || \"\";\n                }\n                this._pageTracking.stop(name, url, properties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(name, url);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StopTrackFailed, \"stopTrackPage failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Log an exception you have caught.\n         *\n         * @param {IExceptionTelemetry} exception   Object which contains exception to be sent\n         * @param {{[key: string]: any}} customProperties   Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *\n         * Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackException = function (exception, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackExceptionFailed, \"trackException failed, exception will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Custom error handler for Application Insights Analytics\n         * @param {IAutoExceptionTelemetry} exception\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype._onerror = function (exception) {\n            try {\n                var properties = {\n                    url: (exception && exception.url) || document.URL,\n                    lineNumber: exception.lineNumber,\n                    columnNumber: exception.columnNumber,\n                    message: exception.message\n                };\n                if (applicationinsights_common_1.Util.isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception.error)) {\n                    this._sendCORSException(properties.url);\n                }\n                else {\n                    if (!applicationinsights_common_1.Util.isError(exception.error)) {\n                        var stack = \"window.onerror@\" + properties.url + \":\" + exception.lineNumber + \":\" + (exception.columnNumber || 0);\n                        exception.error = new Error(exception.message);\n                        exception.error.stack = stack;\n                    }\n                    this.trackException({ error: exception.error, severityLevel: applicationinsights_common_1.SeverityLevel.Error }, properties);\n                }\n            }\n            catch (e) {\n                var errorString = exception.error ?\n                    (exception.error.name + \", \" + exception.error.message)\n                    : \"null\";\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ExceptionWhileLoggingError, \"_onError threw exception while logging error, error will not be collected: \"\n                    + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e), errorString: errorString });\n            }\n        };\n        ApplicationInsights.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._initialize = function (config, core, extensions) {\n            var _this = this;\n            if (this._isInitialized) {\n                return;\n            }\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(core)) {\n                throw Error(\"Error initializing\");\n            }\n            this.core = core;\n            this._logger = core.logger;\n            this._globalconfig = {\n                instrumentationKey: config.instrumentationKey,\n                endpointUrl: config.endpointUrl\n            };\n            this.config = config.extensionConfig && config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n            // load default values if specified\n            var defaults = ApplicationInsights.appInsightsDefaultConfig;\n            if (defaults !== undefined) {\n                if (defaults.extensions && defaults.extensions[this.identifier]) {\n                    for (var field in defaults.extensions[this.identifier]) {\n                        // for each unspecified field, set the default value\n                        if (this.config[field] === undefined) {\n                            this.config[field] = defaults[field];\n                        }\n                    }\n                }\n                if (this._globalconfig) {\n                    for (var field in defaults) {\n                        if (this._globalconfig[field] === undefined) {\n                            this._globalconfig[field] = defaults[field];\n                        }\n                    }\n                }\n            }\n            // Todo: move this out of static state\n            if (this.config.isCookieUseDisabled) {\n                applicationinsights_common_1.Util.disableCookies();\n            }\n            // Todo: move this out of static state\n            if (this.config.isStorageUseDisabled) {\n                applicationinsights_common_1.Util.disableStorage();\n            }\n            var configGetters = {\n                instrumentationKey: function () { return config.instrumentationKey; },\n                accountId: function () { return _this.config.accountId; },\n                sessionRenewalMs: function () { return _this.config.sessionRenewalMs; },\n                sessionExpirationMs: function () { return _this.config.sessionExpirationMs; },\n                sampleRate: function () { return _this.config.samplingPercentage; },\n                cookieDomain: function () { return _this.config.cookieDomain; },\n                sdkExtension: function () { return _this.config.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return _this.config.isBrowserLinkTrackingEnabled; },\n                appId: function () { return _this.config.appId; }\n            };\n            this._pageViewManager = new PageViewManager_1.PageViewManager(this, this.config.overridePageViewDuration, this.core);\n            this._telemetryInitializers = [];\n            this._addDefaultTelemetryInitializers(configGetters);\n            // initialize page view timing\n            this._pageTracking = new Timing(this._logger, \"trackPageView\");\n            this._pageTracking.action = function (name, url, duration, properties) {\n                var pageViewItem = {\n                    name: name,\n                    uri: url\n                };\n                // duration must be a custom property in order for the collector to extract it\n                if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(properties)) {\n                    properties = {};\n                }\n                properties[durationProperty] = duration;\n                _this.sendPageViewInternal(pageViewItem, properties);\n            };\n            if (this.config.disableExceptionTracking === false &&\n                !this.config.autoExceptionsInstrumented) {\n                // We want to enable exception auto collection and it has not been done so yet\n                var onerror_1 = \"onerror\";\n                var originalOnError_1 = window[onerror_1];\n                window.onerror = function (message, url, lineNumber, columnNumber, error) {\n                    var handled = originalOnError_1 && originalOnError_1(message, url, lineNumber, columnNumber, error);\n                    if (handled !== true) {\n                        this._onerror({\n                            message: message,\n                            url: url,\n                            lineNumber: lineNumber,\n                            columnNumber: columnNumber,\n                            error: error\n                        });\n                    }\n                    return handled;\n                };\n                this.config.autoExceptionsInstrumented = true;\n            }\n            this._isInitialized = true;\n        };\n        ApplicationInsights.prototype._addDefaultTelemetryInitializers = function (configGetters) {\n            if (!configGetters.isBrowserLinkTrackingEnabled()) {\n                var browserLinkPaths_1 = ['/browserLinkSignalR/', '/__browserLink/'];\n                var dropBrowserLinkRequests = function (envelope) {\n                    if (envelope.baseType === applicationinsights_common_1.RemoteDependencyData.dataType) {\n                        var remoteData = envelope.baseData;\n                        if (remoteData) {\n                            for (var i = 0; i < browserLinkPaths_1.length; i++) {\n                                if (remoteData.absoluteUrl && remoteData.absoluteUrl.indexOf(browserLinkPaths_1[i]) >= 0) {\n                                    return false;\n                                }\n                            }\n                        }\n                    }\n                    return true;\n                };\n                this._addTelemetryInitializer(dropBrowserLinkRequests);\n            }\n        };\n        ApplicationInsights.prototype._addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._sendCORSException = function (url) {\n            var exception = {\n                message: \"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\",\n                url: url,\n                lineNumber: 0,\n                columnNumber: 0,\n                error: undefined\n            };\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, { url: url });\n            this.core.track(telemetryItem);\n        };\n        // Mutate telemetryItem inplace to add boilerplate iKey & name info\n        ApplicationInsights.prototype._setTelemetryNameAndIKey = function (telemetryItem) {\n            telemetryItem.instrumentationKey = this._globalconfig.instrumentationKey;\n            var iKeyNoDashes = this._globalconfig.instrumentationKey.replace(/-/g, \"\");\n            telemetryItem.name = telemetryItem.name.replace(\"{0}\", iKeyNoDashes);\n        };\n        ApplicationInsights.Version = \"2.0.1-beta\";\n        return ApplicationInsights;\n    }());\n    exports.ApplicationInsights = ApplicationInsights;\n    /**\n     * Used to record timed events and page views.\n     */\n    var Timing = /** @class */ (function () {\n        function Timing(logger, name) {\n            this._name = name;\n            this._events = {};\n            this._logger = logger;\n        }\n        Timing.prototype.start = function (name) {\n            if (typeof this._events[name] !== \"undefined\") {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StartCalledMoreThanOnce, \"start was called more than once for this event without calling stop.\", { name: this._name, key: name }, true);\n            }\n            this._events[name] = +new Date;\n        };\n        Timing.prototype.stop = function (name, url, properties) {\n            var start = this._events[name];\n            if (isNaN(start)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StopCalledWithoutStart, \"stop was called without a corresponding start.\", { name: this._name, key: name }, true);\n            }\n            else {\n                var end = +new Date;\n                var duration = applicationinsights_common_1.PageViewPerformance.getDuration(start, end);\n                this.action(name, url, duration, properties);\n            }\n            delete this._events[name];\n            this._events[name] = undefined;\n        };\n        return Timing;\n    }());\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ApplicationInsights.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Class encapsulates sending page views and page view performance telemetry.\n    */\n    var PageViewManager = /** @class */ (function () {\n        function PageViewManager(appInsights, overridePageViewDuration, core) {\n            this.pageViewPerformanceSent = false;\n            this.overridePageViewDuration = false;\n            this.overridePageViewDuration = overridePageViewDuration;\n            this.appInsights = appInsights;\n            if (core) {\n                this._channel = function () { return (core.getTransmissionControls()); };\n                this._logger = core.logger;\n            }\n        }\n        /**\n        * Currently supported cases:\n        * 1) (default case) track page view called with default parameters, overridePageViewDuration = false. Page view is sent with page view performance when navigation timing data is available.\n        *    a. If navigation timing is not supported then page view is sent right away with undefined duration. Page view performance is not sent.\n        * 2) overridePageViewDuration = true, custom duration provided. Custom duration is used, page view sends right away.\n        * 3) overridePageViewDuration = true, custom duration NOT provided. Page view is sent right away, duration is time spent from page load till now (or undefined if navigation timing is not supported).\n        * 4) overridePageViewDuration = false, custom duration is provided. Page view is sent right away with custom duration.\n        *\n        * In all cases page view performance is sent once (only for the 1st call of trackPageView), or not sent if navigation timing is not supported.\n        */\n        PageViewManager.prototype.trackPageView = function (pageView, customProperties) {\n            var _this = this;\n            var name = pageView.name;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(name) || typeof name !== \"string\") {\n                pageView.name = window.document && window.document.title || \"\";\n            }\n            var uri = pageView.uri;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                pageView.uri = window.location && window.location.href || \"\";\n            }\n            // case 1a. if performance timing is not supported by the browser, send the page view telemetry with the duration provided by the user. If the user\n            // do not provide the duration, set duration to undefined\n            // Also this is case 4\n            if (!applicationinsights_common_1.PageViewPerformance.isPerformanceTimingSupported()) {\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                // no navigation timing (IE 8, iOS Safari 8.4, Opera Mini 8 - see http://caniuse.com/#feat=nav-timing)\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NavigationTimingNotSupported, \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                return;\n            }\n            var pageViewSent = false;\n            var customDuration = undefined;\n            // if the performance timing is supported by the browser, calculate the custom duration\n            var start = applicationinsights_common_1.PageViewPerformance.getPerformanceTiming().navigationStart;\n            customDuration = applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date);\n            if (!applicationinsights_common_1.PageViewPerformance.shouldCollectDuration(customDuration)) {\n                customDuration = undefined;\n            }\n            // if the user has provided duration, send a page view telemetry with the provided duration. Otherwise, if\n            // overridePageViewDuration is set to true, send a page view telemetry with the custom duration calculated earlier\n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties.duration)) {\n                duration = customProperties.duration;\n            }\n            if (this.overridePageViewDuration || !isNaN(duration)) {\n                if (isNaN(duration)) {\n                    // case 3\n                    if (!customProperties) {\n                        customProperties = {};\n                    }\n                    customProperties[\"duration\"] = customDuration;\n                }\n                // case 2\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                pageViewSent = true;\n            }\n            // now try to send the page view performance telemetry\n            var maxDurationLimit = 60000;\n            if (!customProperties) {\n                customProperties = {};\n            }\n            var handle = setInterval((function () {\n                try {\n                    if (applicationinsights_common_1.PageViewPerformance.isPerformanceTimingDataReady()) {\n                        clearInterval(handle);\n                        var pageViewPerformance = new applicationinsights_common_1.PageViewPerformance(_this._logger, name, uri, null);\n                        if (!pageViewPerformance.getIsValid() && !pageViewSent) {\n                            // If navigation timing gives invalid numbers, then go back to \"override page view duration\" mode.\n                            // That's the best value we can get that makes sense.\n                            customProperties[\"duration\"] = customDuration;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                        else {\n                            if (!pageViewSent) {\n                                customProperties[\"duration\"] = pageViewPerformance.getDurationMs();\n                                _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            }\n                            if (!_this.pageViewPerformanceSent) {\n                                _this.appInsights.sendPageViewPerformanceInternal(pageViewPerformance, customProperties);\n                                _this.pageViewPerformanceSent = true;\n                            }\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                    else if (applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date) > maxDurationLimit) {\n                        // if performance timings are not ready but we exceeded the maximum duration limit, just log a page view telemetry\n                        // with the maximum duration limit. Otherwise, keep waiting until performance timings are ready\n                        clearInterval(handle);\n                        if (!pageViewSent) {\n                            customProperties[\"duration\"] = maxDurationLimit;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                }\n                catch (e) {\n                    _this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailedCalc, \"trackPageView failed on page load calculation: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }), 100);\n        };\n        return PageViewManager;\n    }());\n    exports.PageViewManager = PageViewManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK/ApplicationInsights */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ApplicationInsights_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ApplicationInsights = ApplicationInsights_1.ApplicationInsights;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-analytics-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ContextTagKeys = [\n        \"ai.application.ver\",\n        \"ai.application.build\",\n        \"ai.application.typeId\",\n        \"ai.application.applicationId\",\n        \"ai.application.layer\",\n        \"ai.device.id\",\n        \"ai.device.ip\",\n        \"ai.device.language\",\n        \"ai.device.locale\",\n        \"ai.device.model\",\n        \"ai.device.friendlyName\",\n        \"ai.device.network\",\n        \"ai.device.networkName\",\n        \"ai.device.oemName\",\n        \"ai.device.os\",\n        \"ai.device.osVersion\",\n        \"ai.device.roleInstance\",\n        \"ai.device.roleName\",\n        \"ai.device.screenResolution\",\n        \"ai.device.type\",\n        \"ai.device.machineName\",\n        \"ai.device.vmName\",\n        \"ai.device.browser\",\n        \"ai.device.browserVersion\",\n        \"ai.location.ip\",\n        \"ai.location.country\",\n        \"ai.location.province\",\n        \"ai.location.city\",\n        \"ai.operation.id\",\n        \"ai.operation.name\",\n        \"ai.operation.parentId\",\n        \"ai.operation.rootId\",\n        \"ai.operation.syntheticSource\",\n        \"ai.operation.correlationVector\",\n        \"ai.session.id\",\n        \"ai.session.isFirst\",\n        \"ai.session.isNew\",\n        \"ai.user.accountAcquisitionDate\",\n        \"ai.user.accountId\",\n        \"ai.user.userAgent\",\n        \"ai.user.id\",\n        \"ai.user.storeRegion\",\n        \"ai.user.authUserId\",\n        \"ai.user.anonUserAcquisitionDate\",\n        \"ai.user.authUserAcquisitionDate\",\n        \"ai.cloud.name\",\n        \"ai.cloud.role\",\n        \"ai.cloud.roleVer\",\n        \"ai.cloud.roleInstance\",\n        \"ai.cloud.environment\",\n        \"ai.cloud.location\",\n        \"ai.cloud.deploymentUnit\",\n        \"ai.internal.sdkVersion\",\n        \"ai.internal.agentVersion\",\n        \"ai.internal.nodeName\",\n    ];\n    // these two constants are used to filter out properties not needed when trying to extract custom properties and measurements from the incoming payload\n    var baseType = \"baseType\";\n    var baseData = \"baseData\";\n    var EnvelopeCreator = /** @class */ (function () {\n        function EnvelopeCreator() {\n        }\n        EnvelopeCreator.extractProperties = function (data) {\n            var customProperties = null;\n            for (var key in data) {\n                if (data.hasOwnProperty(key)) {\n                    var value = data[key];\n                    if (typeof value !== \"number\") {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[key] = value;\n                    }\n                }\n            }\n            return customProperties;\n        };\n        EnvelopeCreator.extractPropsAndMeasurements = function (data, properties, measurements) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(data)) {\n                for (var key in data) {\n                    if (data.hasOwnProperty(key)) {\n                        var value = data[key];\n                        if (typeof value === \"number\") {\n                            measurements[key] = value;\n                        }\n                        else {\n                            properties[key] = value;\n                        }\n                    }\n                }\n            }\n        };\n        // TODO: Do we want this to take logger as arg or use this._logger as nonstatic?\n        EnvelopeCreator.createEnvelope = function (logger, envelopeType, telemetryItem, data) {\n            var envelope = new applicationinsights_common_1.Envelope(logger, data, envelopeType);\n            envelope.iKey = telemetryItem.instrumentationKey;\n            var iKeyNoDashes = telemetryItem.instrumentationKey.replace(/-/g, \"\");\n            envelope.name = envelope.name.replace(\"{0}\", iKeyNoDashes);\n            // loop through the envelope ctx (Part A) and pick out the ones that should go in outgoing envelope tags\n            for (var key in telemetryItem.ctx) {\n                if (telemetryItem.ctx.hasOwnProperty(key)) {\n                    if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                        envelope.tags[key] = telemetryItem.ctx[key];\n                    }\n                }\n            }\n            // loop through the envelope tags (extension of Part A) and pick out the ones that should go in outgoing envelope tags\n            telemetryItem.tags.forEach(function (tag) {\n                for (var key in tag) {\n                    if (tag.hasOwnProperty(key)) {\n                        if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                            envelope.tags[key] = tag[key];\n                        }\n                    }\n                }\n            });\n            return envelope;\n        };\n        return EnvelopeCreator;\n    }());\n    exports.EnvelopeCreator = EnvelopeCreator;\n    var DependencyEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(DependencyEnvelopeCreator, _super);\n        function DependencyEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        DependencyEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customMeasurements = {};\n            var customProperties = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var bd = telemetryItem.baseData;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(bd)) {\n                logger.warnToConsole(\"Invalid input for dependency data\");\n                return null;\n            }\n            var id = bd.id;\n            var absoluteUrl = bd.absoluteUrl;\n            var command = bd.commandName;\n            var duration = bd.duration;\n            var success = bd.success;\n            var resultCode = bd.resultCode;\n            var method = bd.method;\n            var baseData = new applicationinsights_common_1.RemoteDependencyData(logger, id, absoluteUrl, command, duration, success, resultCode, method, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.RemoteDependencyData.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.RemoteDependencyData.envelopeType, telemetryItem, data);\n        };\n        DependencyEnvelopeCreator.DependencyEnvelopeCreator = new DependencyEnvelopeCreator();\n        return DependencyEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.DependencyEnvelopeCreator = DependencyEnvelopeCreator;\n    var EventEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(EventEnvelopeCreator, _super);\n        function EventEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            if (telemetryItem.baseType !== applicationinsights_common_1.Event.dataType) {\n                EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.baseData, customProperties, customMeasurements);\n            }\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var eventName = telemetryItem.baseData.name;\n            var baseData = new applicationinsights_common_1.Event(logger, eventName, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Event.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Event.envelopeType, telemetryItem, data);\n        };\n        EventEnvelopeCreator.EventEnvelopeCreator = new EventEnvelopeCreator();\n        return EventEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.EventEnvelopeCreator = EventEnvelopeCreator;\n    var ExceptionEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(ExceptionEnvelopeCreator, _super);\n        function ExceptionEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ExceptionEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var exception = telemetryItem.baseData.error;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var baseData = new applicationinsights_common_1.Exception(logger, exception, customProperties, customMeasurements, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Exception.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Exception.envelopeType, telemetryItem, data);\n        };\n        ExceptionEnvelopeCreator.ExceptionEnvelopeCreator = new ExceptionEnvelopeCreator();\n        return ExceptionEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.ExceptionEnvelopeCreator = ExceptionEnvelopeCreator;\n    var MetricEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(MetricEnvelopeCreator, _super);\n        function MetricEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        MetricEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var name = telemetryItem.baseData.name;\n            var average = telemetryItem.baseData.average;\n            var sampleCount = telemetryItem.baseData.sampleCount;\n            var min = telemetryItem.baseData.min;\n            var max = telemetryItem.baseData.max;\n            var baseData = new applicationinsights_common_1.Metric(logger, name, average, sampleCount, min, max, customProperties);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Metric.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Metric.envelopeType, telemetryItem, data);\n        };\n        MetricEnvelopeCreator.MetricEnvelopeCreator = new MetricEnvelopeCreator();\n        return MetricEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.MetricEnvelopeCreator = MetricEnvelopeCreator;\n    var PageViewEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewEnvelopeCreator, _super);\n        function PageViewEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            // Since duration is not part of the domain properties in Common Schema, extract it from part C \n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data.duration)) {\n                duration = telemetryItem.data.duration;\n                delete telemetryItem.data.duration;\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            // Todo: move IPageViewTelemetry to common as we are missing type checks on baseData here\n            // refUri is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.refUri)) {\n                customProperties[\"refUri\"] = telemetryItem.baseData.refUri;\n            }\n            // pageType is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageType)) {\n                customProperties[\"pageType\"] = telemetryItem.baseData.pageType;\n            }\n            // isLoggedIn is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.isLoggedIn)) {\n                customProperties[\"isLoggedIn\"] = telemetryItem.baseData.isLoggedIn;\n            }\n            // pageTags is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageTags)) {\n                var pageTags = telemetryItem.baseData.pageTags;\n                for (var key in pageTags) {\n                    if (pageTags.hasOwnProperty(key)) {\n                        customProperties[key] = pageTags[key];\n                    }\n                }\n            }\n            var baseData = new applicationinsights_common_1.PageView(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageView.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageView.envelopeType, telemetryItem, data);\n        };\n        PageViewEnvelopeCreator.PageViewEnvelopeCreator = new PageViewEnvelopeCreator();\n        return PageViewEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewEnvelopeCreator = PageViewEnvelopeCreator;\n    var PageViewPerformanceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewPerformanceEnvelopeCreator, _super);\n        function PageViewPerformanceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewPerformanceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            var duration = telemetryItem.baseData.duration;\n            var baseData = new applicationinsights_common_1.PageViewPerformance(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageViewPerformance.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageViewPerformance.envelopeType, telemetryItem, data);\n        };\n        PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator = new PageViewPerformanceEnvelopeCreator();\n        return PageViewPerformanceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewPerformanceEnvelopeCreator = PageViewPerformanceEnvelopeCreator;\n    var TraceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(TraceEnvelopeCreator, _super);\n        function TraceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        TraceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var message = telemetryItem.baseData.message;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var baseData = new applicationinsights_common_1.Trace(logger, message, customProperties, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Trace.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Trace.envelopeType, telemetryItem, data);\n        };\n        TraceEnvelopeCreator.TraceEnvelopeCreator = new TraceEnvelopeCreator();\n        return TraceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.TraceEnvelopeCreator = TraceEnvelopeCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EnvelopeCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /*\n     * An array based send buffer.\n     */\n    var ArraySendBuffer = /** @class */ (function () {\n        function ArraySendBuffer(config) {\n            this._config = config;\n            this._buffer = [];\n        }\n        ArraySendBuffer.prototype.enqueue = function (payload) {\n            this._buffer.push(payload);\n        };\n        ArraySendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        ArraySendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n        };\n        ArraySendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        ArraySendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        ArraySendBuffer.prototype.markAsSent = function (payload) {\n            this.clear();\n        };\n        ArraySendBuffer.prototype.clearSent = function (payload) {\n            // not supported\n        };\n        return ArraySendBuffer;\n    }());\n    exports.ArraySendBuffer = ArraySendBuffer;\n    /*\n     * Session storege buffer holds a copy of all unsent items in the browser session storage.\n     */\n    var SessionStorageSendBuffer = /** @class */ (function () {\n        function SessionStorageSendBuffer(logger, config) {\n            this._bufferFullMessageSent = false;\n            this._logger = logger;\n            this._config = config;\n            var bufferItems = this.getBuffer(SessionStorageSendBuffer.BUFFER_KEY);\n            var notDeliveredItems = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            this._buffer = bufferItems.concat(notDeliveredItems);\n            // If the buffer has too many items, drop items from the end.\n            if (this._buffer.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                this._buffer.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n            }\n            // update DataLossAnalyzer with the number of recovered items\n            // Uncomment if you want to use DataLossanalyzer\n            // DataLossAnalyzer.itemsRestoredFromSessionBuffer = this._buffer.length;\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        }\n        SessionStorageSendBuffer.prototype.enqueue = function (payload) {\n            if (this._buffer.length >= SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                // sent internal log only once per page view\n                if (!this._bufferFullMessageSent) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Maximum buffer size reached: \" + this._buffer.length, true);\n                    this._bufferFullMessageSent = true;\n                }\n                return;\n            }\n            this._buffer.push(payload);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        };\n        SessionStorageSendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        SessionStorageSendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this._bufferFullMessageSent = false;\n        };\n        SessionStorageSendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        SessionStorageSendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        SessionStorageSendBuffer.prototype.markAsSent = function (payload) {\n            this._buffer = this.removePayloadsFromBuffer(payload, this._buffer);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            if (sentElements instanceof Array && payload instanceof Array) {\n                sentElements = sentElements.concat(payload);\n                if (sentElements.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                    // We send telemetry normally. If the SENT_BUFFER is too big we don't add new elements\n                    // until we receive a response from the backend and the buffer has free space again (see clearSent method)\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Sent buffer reached its maximum size: \" + sentElements.length, true);\n                    sentElements.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n                }\n                this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n            }\n        };\n        SessionStorageSendBuffer.prototype.clearSent = function (payload) {\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            sentElements = this.removePayloadsFromBuffer(payload, sentElements);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n        };\n        SessionStorageSendBuffer.prototype.removePayloadsFromBuffer = function (payloads, buffer) {\n            var remaining = [];\n            for (var i in buffer) {\n                var contains = false;\n                for (var j in payloads) {\n                    if (payloads[j] === buffer[i]) {\n                        contains = true;\n                        break;\n                    }\n                }\n                if (!contains) {\n                    remaining.push(buffer[i]);\n                }\n            }\n            ;\n            return remaining;\n        };\n        SessionStorageSendBuffer.prototype.getBuffer = function (key) {\n            try {\n                var bufferJson = applicationinsights_common_1.Util.getSessionStorage(this._logger, key);\n                if (bufferJson) {\n                    var buffer = JSON.parse(bufferJson);\n                    if (buffer) {\n                        return buffer;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToRestoreStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            return [];\n        };\n        SessionStorageSendBuffer.prototype.setBuffer = function (key, buffer) {\n            try {\n                var bufferJson = JSON.stringify(buffer);\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, bufferJson);\n            }\n            catch (e) {\n                // if there was an error, clear the buffer\n                // telemetry is stored in the _buffer array so we won't loose any items\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, JSON.stringify([]));\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedToSetStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e) + \". Buffer cleared\", { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n        SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n        // Maximum number of payloads stored in the buffer. If the buffer is full, new elements will be dropped. \n        SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n        return SessionStorageSendBuffer;\n    }());\n    exports.SessionStorageSendBuffer = SessionStorageSendBuffer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SendBuffer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Sender.js ***!\n  \\**********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./SendBuffer */ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\"), __webpack_require__(/*! ./EnvelopeCreator */ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\"), __webpack_require__(/*! ./TelemetryValidation/EventValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/TraceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/ExceptionValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/MetricValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewPerformanceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/RemoteDepdencyValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\"), __webpack_require__(/*! ./Serializer */ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SendBuffer_1, EnvelopeCreator_1, EventValidator_1, TraceValidator_1, ExceptionValidator_1, MetricValidator_1, PageViewPerformanceValidator_1, PageViewValidator_1, RemoteDepdencyValidator_1, Serializer_1, applicationinsights_common_1, applicationinsights_core_js_1, applicationinsights_core_js_2) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sender = /** @class */ (function () {\n        function Sender() {\n            this.priority = 201;\n            /**\n             * Whether XMLHttpRequest object is supported. Older version of IE (8,9) do not support it.\n             */\n            this._XMLHttpRequestSupported = false;\n        }\n        Sender.prototype.pause = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.resume = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.flush = function () {\n            try {\n                this.triggerSend();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FlushFailed, \"flush failed, telemetry will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        Sender.prototype.teardown = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.initialize = function (config, core, extensions) {\n            this.identifier = \"AppInsightsChannelPlugin\";\n            this._logger = core.logger;\n            this._serializer = new Serializer_1.Serializer(core.logger);\n            this._consecutiveErrors = 0;\n            this._retryAt = null;\n            this._lastSend = 0;\n            this._config = Sender._getDefaultAppInsightsChannelConfig(config, this.identifier);\n            this._sender = null;\n            this._buffer = (applicationinsights_common_1.Util.canUseSessionStorage() && this._config.enableSessionStorageBuffer)\n                ? new SendBuffer_1.SessionStorageSendBuffer(this._logger, this._config) : new SendBuffer_1.ArraySendBuffer(this._config);\n            if (!this._config.isBeaconApiDisabled() && applicationinsights_common_1.Util.IsBeaconApiSupported()) {\n                this._sender = this._beaconSender;\n            }\n            else {\n                if (typeof XMLHttpRequest != \"undefined\") {\n                    var testXhr = new XMLHttpRequest();\n                    if (\"withCredentials\" in testXhr) {\n                        this._sender = this._xhrSender;\n                        this._XMLHttpRequestSupported = true;\n                    }\n                    else if (typeof XDomainRequest !== \"undefined\") {\n                        this._sender = this._xdrSender; //IE 8 and 9\n                    }\n                }\n            }\n        };\n        Sender.prototype.processTelemetry = function (telemetryItem) {\n            try {\n                // if master off switch is set, don't send any data\n                if (this._config.disableTelemetry()) {\n                    // Do not send/save data\n                    return;\n                }\n                // validate input\n                if (!telemetryItem) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSendEmptyTelemetry, \"Cannot send empty telemetry\");\n                    return;\n                }\n                // ensure a sender was constructed\n                if (!this._sender) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SenderNotInitialized, \"Sender was not initialized\");\n                    return;\n                }\n                // first we need to validate that the envelope passed down is valid\n                var isValid = Sender._validate(telemetryItem);\n                if (!isValid) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"Invalid telemetry envelope\");\n                    return;\n                }\n                // construct an envelope that Application Insights endpoint can understand\n                var aiEnvelope = this._constructEnvelope(telemetryItem);\n                if (!aiEnvelope) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CreateEnvelopeError, \"Unable to create an AppInsights envelope\");\n                    return;\n                }\n                // check if the incoming payload is too large, truncate if necessary\n                var payload = this._serializer.serialize(aiEnvelope);\n                // flush if we would exceed the max-size limit by adding this item\n                var bufferPayload = this._buffer.getItems();\n                var batch = this._buffer.batchPayloads(bufferPayload);\n                if (batch && (batch.length + payload.length > this._config.maxBatchSizeInBytes())) {\n                    this.triggerSend();\n                }\n                // enqueue the payload\n                this._buffer.enqueue(payload);\n                // ensure an invocation timeout is set\n                this._setupTimer();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedAddingTelemetryToBuffer, \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            // hand off the telemetry item to the next plugin\n            if (!applicationinsights_core_js_2.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(telemetryItem);\n            }\n        };\n        Sender.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * xhr state changes\n         */\n        Sender.prototype._xhrReadyStateChange = function (xhr, payload, countOfItemsInPayload) {\n            if (xhr.readyState === 4) {\n                var response = null;\n                if (!this._appId) {\n                    response = this._parseResponse(xhr.responseText || xhr.response);\n                    if (response && response.appId) {\n                        this._appId = response.appId;\n                    }\n                }\n                if ((xhr.status < 200 || xhr.status >= 300) && xhr.status !== 0) {\n                    if (!this._config.isRetryDisabled() && this._isRetriable(xhr.status)) {\n                        this._resendPayload(payload);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                            \"Response code \" + xhr.status + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                    else {\n                        this._onError(payload, this._formatErrorMessageXhr(xhr));\n                    }\n                }\n                else {\n                    if (xhr.status === 206) {\n                        if (!response) {\n                            response = this._parseResponse(xhr.responseText || xhr.response);\n                        }\n                        if (response && !this._config.isRetryDisabled()) {\n                            this._onPartialSuccess(payload, response);\n                        }\n                        else {\n                            this._onError(payload, this._formatErrorMessageXhr(xhr));\n                        }\n                    }\n                    else {\n                        this._consecutiveErrors = 0;\n                        this._onSuccess(payload, countOfItemsInPayload);\n                    }\n                }\n            }\n        };\n        /**\n         * Immediately send buffered data\n         * @param async {boolean} - Indicates if the events should be sent asynchronously\n         */\n        Sender.prototype.triggerSend = function (async) {\n            if (async === void 0) { async = true; }\n            try {\n                // Send data only if disableTelemetry is false\n                if (!this._config.disableTelemetry()) {\n                    if (this._buffer.count() > 0) {\n                        var payload = this._buffer.getItems();\n                        // invoke send\n                        this._sender(payload, async);\n                    }\n                    // update lastSend time to enable throttling\n                    this._lastSend = +new Date;\n                }\n                else {\n                    this._buffer.clear();\n                }\n                clearTimeout(this._timeoutHandle);\n                this._timeoutHandle = null;\n                this._retryAt = null;\n            }\n            catch (e) {\n                /* Ignore this error for IE under v10 */\n                if (!applicationinsights_common_1.Util.getIEVersion() || applicationinsights_common_1.Util.getIEVersion() > 9) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Telemetry transmission failed, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }\n        };\n        /**\n         * error handler\n         */\n        Sender.prototype._onError = function (payload, message, event) {\n            this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.OnError, \"Failed to send telemetry.\", { message: message });\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * partial success handler\n         */\n        Sender.prototype._onPartialSuccess = function (payload, results) {\n            var failed = [];\n            var retry = [];\n            // Iterate through the reversed array of errors so that splicing doesn't have invalid indexes after the first item.\n            var errors = results.errors.reverse();\n            for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                var error = errors_1[_i];\n                var extracted = payload.splice(error.index, 1)[0];\n                if (this._isRetriable(error.statusCode)) {\n                    retry.push(extracted);\n                }\n                else {\n                    // All other errors, including: 402 (Monthly quota exceeded) and 439 (Too many requests and refresh cache).\n                    failed.push(extracted);\n                }\n            }\n            if (payload.length > 0) {\n                this._onSuccess(payload, results.itemsAccepted);\n            }\n            if (failed.length > 0) {\n                this._onError(failed, this._formatErrorMessageXhr(null, ['partial success', results.itemsAccepted, 'of', results.itemsReceived].join(' ')));\n            }\n            if (retry.length > 0) {\n                this._resendPayload(retry);\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Partial success. \" +\n                    \"Delivered: \" + payload.length + \", Failed: \" + failed.length +\n                    \". Will retry to send \" + retry.length + \" our of \" + results.itemsReceived + \" items\");\n            }\n        };\n        /**\n         * success handler\n         */\n        Sender.prototype._onSuccess = function (payload, countOfItemsInPayload) {\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * xdr state changes\n         */\n        Sender.prototype._xdrOnLoad = function (xdr, payload) {\n            if (xdr && (xdr.responseText + \"\" === \"200\" || xdr.responseText === \"\")) {\n                this._consecutiveErrors = 0;\n                this._onSuccess(payload, 0);\n            }\n            else {\n                var results = this._parseResponse(xdr.responseText);\n                if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                    && !this._config.isRetryDisabled()) {\n                    this._onPartialSuccess(payload, results);\n                }\n                else {\n                    this._onError(payload, this._formatErrorMessageXdr(xdr));\n                }\n            }\n        };\n        Sender.prototype._constructEnvelope = function (envelope) {\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return EnvelopeCreator_1.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return EnvelopeCreator_1.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return EnvelopeCreator_1.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return EnvelopeCreator_1.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return EnvelopeCreator_1.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return EnvelopeCreator_1.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(this._logger, envelope);\n                default:\n                    // default create custom event type\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n            }\n        };\n        Sender._getDefaultAppInsightsChannelConfig = function (config, identifier) {\n            var resultConfig = {};\n            var pluginConfig = config.extensionConfig && config.extensionConfig[identifier] ? config.extensionConfig[identifier] : {};\n            // set default values\n            resultConfig.endpointUrl = function () { return config.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\"; };\n            resultConfig.emitLineDelimitedJson = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.emitLineDelimitedJson); };\n            resultConfig.maxBatchInterval = function () { return !isNaN(pluginConfig.maxBatchInterval) ? pluginConfig.maxBatchInterval : 15000; };\n            resultConfig.maxBatchSizeInBytes = function () { return pluginConfig.maxBatchSizeInBytes > 0 ? pluginConfig.maxBatchSizeInBytes : 102400; }; // 100kb\n            resultConfig.disableTelemetry = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.disableTelemetry); };\n            resultConfig.enableSessionStorageBuffer = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.enableSessionStorageBuffer, true); };\n            resultConfig.isRetryDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isRetryDisabled); };\n            resultConfig.isBeaconApiDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isBeaconApiDisabled, true); };\n            return resultConfig;\n        };\n        Sender._validate = function (envelope) {\n            // call the appropriate Validate depending on the baseType\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return TraceValidator_1.TraceValidator.TraceValidator.Validate(envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return ExceptionValidator_1.ExceptionValidator.ExceptionValidator.Validate(envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return MetricValidator_1.MetricValidator.MetricValidator.Validate(envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return PageViewValidator_1.PageViewValidator.PageViewValidator.Validate(envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return PageViewPerformanceValidator_1.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return RemoteDepdencyValidator_1.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(envelope);\n                default:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n            }\n        };\n        /**\n         * Send Beacon API request\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - not used\n         * Note: Beacon API does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._beaconSender = function (payload, isAsync) {\n            var url = this._config.endpointUrl();\n            var batch = this._buffer.batchPayloads(payload);\n            // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n            // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n            var plainTextBatch = new Blob([batch], { type: 'text/plain;charset=UTF-8' });\n            // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n            var queued = navigator.sendBeacon(url, plainTextBatch);\n            if (queued) {\n                this._buffer.markAsSent(payload);\n            }\n            else {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API.\");\n            }\n        };\n        /**\n         * Send XMLHttpRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         */\n        Sender.prototype._xhrSender = function (payload, isAsync) {\n            var _this = this;\n            var xhr = new XMLHttpRequest();\n            xhr[applicationinsights_common_1.DisabledPropertyName] = true;\n            xhr.open(\"POST\", this._config.endpointUrl(), isAsync);\n            xhr.setRequestHeader(\"Content-type\", \"application/json\");\n            // append Sdk-Context request header only in case of breeze endpoint \n            if (applicationinsights_common_1.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.sdkContextHeader, applicationinsights_common_1.RequestHeaders.sdkContextHeaderAppIdRequest);\n            }\n            xhr.onreadystatechange = function () { return _this._xhrReadyStateChange(xhr, payload, payload.length); };\n            xhr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXhr(xhr), event); };\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xhr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        /**\n         * Parses the response from the backend.\n         * @param response - XMLHttpRequest or XDomainRequest response\n         */\n        Sender.prototype._parseResponse = function (response) {\n            try {\n                if (response && response !== \"\") {\n                    var result = JSON.parse(response);\n                    if (result && result.itemsReceived && result.itemsReceived >= result.itemsAccepted &&\n                        result.itemsReceived - result.itemsAccepted == result.errors.length) {\n                        return result;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.InvalidBackendResponse, \"Cannot parse the response. \" + applicationinsights_common_1.Util.getExceptionName(e), {\n                    response: response\n                });\n            }\n            return null;\n        };\n        /**\n         * Resend payload. Adds payload back to the send buffer and setup a send timer (with exponential backoff).\n         * @param payload\n         */\n        Sender.prototype._resendPayload = function (payload) {\n            if (!payload || payload.length === 0) {\n                return;\n            }\n            this._buffer.clearSent(payload);\n            this._consecutiveErrors++;\n            for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                var item = payload_1[_i];\n                this._buffer.enqueue(item);\n            }\n            // setup timer\n            this._setRetryTime();\n            this._setupTimer();\n        };\n        /** Calculates the time to wait before retrying in case of an error based on\n         * http://en.wikipedia.org/wiki/Exponential_backoff\n         */\n        Sender.prototype._setRetryTime = function () {\n            var SlotDelayInSeconds = 10;\n            var delayInSeconds;\n            if (this._consecutiveErrors <= 1) {\n                delayInSeconds = SlotDelayInSeconds;\n            }\n            else {\n                var backOffSlot = (Math.pow(2, this._consecutiveErrors) - 1) / 2;\n                var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n            }\n            // TODO: Log the backoff time like the C# version does.\n            var retryAfterTimeSpan = Date.now() + (delayInSeconds * 1000);\n            // TODO: Log the retry at time like the C# version does.\n            this._retryAt = retryAfterTimeSpan;\n        };\n        /**\n         * Sets up the timer which triggers actually sending the data.\n         */\n        Sender.prototype._setupTimer = function () {\n            var _this = this;\n            if (!this._timeoutHandle) {\n                var retryInterval = this._retryAt ? Math.max(0, this._retryAt - Date.now()) : 0;\n                var timerValue = Math.max(this._config.maxBatchInterval(), retryInterval);\n                this._timeoutHandle = setTimeout(function () {\n                    _this.triggerSend();\n                }, timerValue);\n            }\n        };\n        /**\n         * Checks if the SDK should resend the payload after receiving this status code from the backend.\n         * @param statusCode\n         */\n        Sender.prototype._isRetriable = function (statusCode) {\n            return statusCode == 408 // Timeout\n                || statusCode == 429 // Too many requests.\n                || statusCode == 500 // Internal server error.\n                || statusCode == 503; // Service unavailable.\n        };\n        Sender.prototype._formatErrorMessageXhr = function (xhr, message) {\n            if (xhr) {\n                return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + xhr.responseText || xhr.response || \"\";\n            }\n            return message;\n        };\n        /**\n         * Send XDomainRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         *\n         * Note: XDomainRequest does not support sync requests. This 'isAsync' parameter is added\n         * to maintain consistency with the xhrSender's contract\n         * Note: XDomainRequest does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._xdrSender = function (payload, isAsync) {\n            var _this = this;\n            var xdr = new XDomainRequest();\n            xdr.onload = function () { return _this._xdrOnLoad(xdr, payload); };\n            xdr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXdr(xdr), event); };\n            // XDomainRequest requires the same protocol as the hosting page. \n            // If the protocol doesn't match, we can't send the telemetry :(. \n            var hostingProtocol = window.location.protocol;\n            if (this._config.endpointUrl().lastIndexOf(hostingProtocol, 0) !== 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                    \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                this._buffer.clear();\n                return;\n            }\n            var endpointUrl = this._config.endpointUrl().replace(/^(https?:)/, \"\");\n            xdr.open('POST', endpointUrl);\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xdr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        Sender.prototype._formatErrorMessageXdr = function (xdr, message) {\n            if (xdr) {\n                return \"XDomainRequest,Response:\" + xdr.responseText || \"\";\n            }\n            return message;\n        };\n        return Sender;\n    }());\n    exports.Sender = Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sender.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Serializer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Serializer = /** @class */ (function () {\n        function Serializer(logger) {\n            this._logger = logger;\n        }\n        /**\n         * Serializes the current object to a JSON string.\n         */\n        Serializer.prototype.serialize = function (input) {\n            var output = this._serializeObject(input, \"root\");\n            return JSON.stringify(output);\n        };\n        Serializer.prototype._serializeObject = function (source, name) {\n            var circularReferenceCheck = \"__aiCircularRefCheck\";\n            var output = {};\n            if (!source) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                return output;\n            }\n            if (source[circularReferenceCheck]) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CircularReferenceDetected, \"Circular reference detected while serializing object\", { name: name }, true);\n                return output;\n            }\n            if (!source.aiDataContract) {\n                // special case for measurements/properties/tags\n                if (name === \"measurements\") {\n                    output = this._serializeStringMap(source, \"number\", name);\n                }\n                else if (name === \"properties\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (name === \"tags\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (applicationinsights_common_1.Util.isArray(source)) {\n                    output = this._serializeArray(source, name);\n                }\n                else {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObjectNonSerializable, \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                    try {\n                        // verify that the object can be stringified\n                        JSON.stringify(source);\n                        output = source;\n                    }\n                    catch (e) {\n                        // if serialization fails return an empty string\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, (e && typeof e.toString === 'function') ? e.toString() : \"Error serializing object\", null, true);\n                    }\n                }\n                return output;\n            }\n            source[circularReferenceCheck] = true;\n            for (var field in source.aiDataContract) {\n                var contract = source.aiDataContract[field];\n                var isRequired = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Required) : (contract & applicationinsights_common_1.FieldType.Required);\n                var isHidden = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Hidden) : (contract & applicationinsights_common_1.FieldType.Hidden);\n                var isArray = contract & applicationinsights_common_1.FieldType.Array;\n                var isPresent = source[field] !== undefined;\n                var isObject = typeof source[field] === \"object\" && source[field] !== null;\n                if (isRequired && !isPresent && !isArray) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MissingRequiredFieldSpecification, \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    // If not in debug mode, continue and hope the error is permissible\n                    continue;\n                }\n                if (isHidden) {\n                    // Don't serialize hidden fields\n                    continue;\n                }\n                var value;\n                if (isObject) {\n                    if (isArray) {\n                        // special case; resurse on each object in the source array\n                        value = this._serializeArray(source[field], field);\n                    }\n                    else {\n                        // recurse on the source object in this field\n                        value = this._serializeObject(source[field], field);\n                    }\n                }\n                else {\n                    // assign the source field to the output even if undefined or required\n                    value = source[field];\n                }\n                // only emit this field if the value is defined\n                if (value !== undefined) {\n                    output[field] = value;\n                }\n            }\n            delete source[circularReferenceCheck];\n            return output;\n        };\n        Serializer.prototype._serializeArray = function (sources, name) {\n            var output = undefined;\n            if (!!sources) {\n                if (!applicationinsights_common_1.Util.isArray(sources)) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ItemNotInArray, \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                }\n                else {\n                    output = [];\n                    for (var i = 0; i < sources.length; i++) {\n                        var source = sources[i];\n                        var item = this._serializeObject(source, name + \"[\" + i + \"]\");\n                        output.push(item);\n                    }\n                }\n            }\n            return output;\n        };\n        Serializer.prototype._serializeStringMap = function (map, expectedType, name) {\n            var output = undefined;\n            if (map) {\n                output = {};\n                for (var field in map) {\n                    var value = map[field];\n                    if (expectedType === \"string\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else if (!value.toString) {\n                            output[field] = \"invalid field: toString() is not defined.\";\n                        }\n                        else {\n                            output[field] = value.toString();\n                        }\n                    }\n                    else if (expectedType === \"number\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else {\n                            var num = parseFloat(value);\n                            if (isNaN(num)) {\n                                output[field] = \"NaN\";\n                            }\n                            else {\n                                output[field] = num;\n                            }\n                        }\n                    }\n                    else {\n                        output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, output[field], null, true);\n                    }\n                }\n            }\n            return output;\n        };\n        return Serializer;\n    }());\n    exports.Serializer = Serializer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Serializer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var EventValidator = /** @class */ (function () {\n        function EventValidator() {\n        }\n        EventValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n            https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties || !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties || !item.domainProperties[\"name\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        EventValidator.EventValidator = new EventValidator();\n        return EventValidator;\n    }());\n    exports.EventValidator = EventValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var ExceptionValidator = /** @class */ (function () {\n        function ExceptionValidator() {\n        }\n        ExceptionValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"exceptions\"] ||\n                !ExceptionValidator._validateExceptions(item.domainProperties[\"exceptions\"])) {\n                return false;\n            }\n            */\n            return true;\n        };\n        // TODO implement validation of exceptions\n        ExceptionValidator._validateExceptions = function (exceptions) {\n            // typeName\n            // message\n            // parsedStack\n            // stack\n            // hasFullStack\n            return true;\n        };\n        ExceptionValidator.ExceptionValidator = new ExceptionValidator();\n        return ExceptionValidator;\n    }());\n    exports.ExceptionValidator = ExceptionValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var MetricValidator = /** @class */ (function () {\n        function MetricValidator() {\n        }\n        MetricValidator.prototype.Validate = function (event) {\n            return true;\n        };\n        MetricValidator.MetricValidator = new MetricValidator();\n        return MetricValidator;\n    }());\n    exports.MetricValidator = MetricValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\":\n/*!****************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js ***!\n  \\****************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformanceValidator = /** @class */ (function () {\n        function PageViewPerformanceValidator() {\n        }\n        PageViewPerformanceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n            \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"domProcessing\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"networkConnect\"] ||\n                !item.domainProperties[\"perfTotal\"] ||\n                !item.domainProperties[\"receivedResponse\"] ||\n                !item.domainProperties[\"sentRequest\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewPerformanceValidator.PageViewPerformanceValidator = new PageViewPerformanceValidator();\n        return PageViewPerformanceValidator;\n    }());\n    exports.PageViewPerformanceValidator = PageViewPerformanceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformanceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewValidator = /** @class */ (function () {\n        function PageViewValidator() {\n        }\n        PageViewValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewValidator.PageViewValidator = new PageViewValidator();\n        return PageViewValidator;\n    }());\n    exports.PageViewValidator = PageViewValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDepdencyValidator = /** @class */ (function () {\n        function RemoteDepdencyValidator() {\n        }\n        RemoteDepdencyValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"resultCode\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"success\"] ||\n                !item.domainProperties[\"data\"] ||\n                !item.domainProperties[\"target\"] ||\n                !item.domainProperties[\"type\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        RemoteDepdencyValidator.RemoteDepdencyValidator = new RemoteDepdencyValidator();\n        return RemoteDepdencyValidator;\n    }());\n    exports.RemoteDepdencyValidator = RemoteDepdencyValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDepdencyValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TraceValidator = /** @class */ (function () {\n        function TraceValidator() {\n        }\n        TraceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties ||\n                !item.domainProperties[\"message\"] ||\n                !item.domainProperties[\"severityLevel\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        TraceValidator.TraceValidator = new TraceValidator();\n        return TraceValidator;\n    }());\n    exports.TraceValidator = TraceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TraceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Sender */ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Sender_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Sender = Sender_1.Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-channel-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Constants.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Constants.js ***!\n  \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Constants.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Enums.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Enums.js ***!\n  \\*****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Type of storage to differentiate between local storage and session storage\n    */\n    var StorageType;\n    (function (StorageType) {\n        StorageType[StorageType[\"LocalStorage\"] = 0] = \"LocalStorage\";\n        StorageType[StorageType[\"SessionStorage\"] = 1] = \"SessionStorage\";\n    })(StorageType = exports.StorageType || (exports.StorageType = {}));\n    /**\n     * Enum is used in aiDataContract to describe how fields are serialized.\n     * For instance: (Fieldtype.Required | FieldType.Array) will mark the field as required and indicate it's an array\n     */\n    var FieldType;\n    (function (FieldType) {\n        FieldType[FieldType[\"Default\"] = 0] = \"Default\";\n        FieldType[FieldType[\"Required\"] = 1] = \"Required\";\n        FieldType[FieldType[\"Array\"] = 2] = \"Array\";\n        FieldType[FieldType[\"Hidden\"] = 4] = \"Hidden\";\n    })(FieldType = exports.FieldType || (exports.FieldType = {}));\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Enums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n         * Data struct to contain only C section with custom fields.\n         */\n    var Base = /** @class */ (function () {\n        function Base() {\n        }\n        return Base;\n    }());\n    exports.Base = Base;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Base.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    var ContextTagKeys = /** @class */ (function () {\n        function ContextTagKeys() {\n            this.applicationVersion = \"ai.application.ver\";\n            this.applicationBuild = \"ai.application.build\";\n            this.applicationTypeId = \"ai.application.typeId\";\n            this.applicationId = \"ai.application.applicationId\";\n            this.applicationLayer = \"ai.application.layer\";\n            this.deviceId = \"ai.device.id\";\n            this.deviceIp = \"ai.device.ip\";\n            this.deviceLanguage = \"ai.device.language\";\n            this.deviceLocale = \"ai.device.locale\";\n            this.deviceModel = \"ai.device.model\";\n            this.deviceFriendlyName = \"ai.device.friendlyName\";\n            this.deviceNetwork = \"ai.device.network\";\n            this.deviceNetworkName = \"ai.device.networkName\";\n            this.deviceOEMName = \"ai.device.oemName\";\n            this.deviceOS = \"ai.device.os\";\n            this.deviceOSVersion = \"ai.device.osVersion\";\n            this.deviceRoleInstance = \"ai.device.roleInstance\";\n            this.deviceRoleName = \"ai.device.roleName\";\n            this.deviceScreenResolution = \"ai.device.screenResolution\";\n            this.deviceType = \"ai.device.type\";\n            this.deviceMachineName = \"ai.device.machineName\";\n            this.deviceVMName = \"ai.device.vmName\";\n            this.deviceBrowser = \"ai.device.browser\";\n            this.deviceBrowserVersion = \"ai.device.browserVersion\";\n            this.locationIp = \"ai.location.ip\";\n            this.locationCountry = \"ai.location.country\";\n            this.locationProvince = \"ai.location.province\";\n            this.locationCity = \"ai.location.city\";\n            this.operationId = \"ai.operation.id\";\n            this.operationName = \"ai.operation.name\";\n            this.operationParentId = \"ai.operation.parentId\";\n            this.operationRootId = \"ai.operation.rootId\";\n            this.operationSyntheticSource = \"ai.operation.syntheticSource\";\n            this.operationCorrelationVector = \"ai.operation.correlationVector\";\n            this.sessionId = \"ai.session.id\";\n            this.sessionIsFirst = \"ai.session.isFirst\";\n            this.sessionIsNew = \"ai.session.isNew\";\n            this.userAccountAcquisitionDate = \"ai.user.accountAcquisitionDate\";\n            this.userAccountId = \"ai.user.accountId\";\n            this.userAgent = \"ai.user.userAgent\";\n            this.userId = \"ai.user.id\";\n            this.userStoreRegion = \"ai.user.storeRegion\";\n            this.userAuthUserId = \"ai.user.authUserId\";\n            this.userAnonymousUserAcquisitionDate = \"ai.user.anonUserAcquisitionDate\";\n            this.userAuthenticatedUserAcquisitionDate = \"ai.user.authUserAcquisitionDate\";\n            this.cloudName = \"ai.cloud.name\";\n            this.cloudRole = \"ai.cloud.role\";\n            this.cloudRoleVer = \"ai.cloud.roleVer\";\n            this.cloudRoleInstance = \"ai.cloud.roleInstance\";\n            this.cloudEnvironment = \"ai.cloud.environment\";\n            this.cloudLocation = \"ai.cloud.location\";\n            this.cloudDeploymentUnit = \"ai.cloud.deploymentUnit\";\n            this.internalSdkVersion = \"ai.internal.sdkVersion\";\n            this.internalAgentVersion = \"ai.internal.agentVersion\";\n            this.internalNodeName = \"ai.internal.nodeName\";\n        }\n        return ContextTagKeys;\n    }());\n    exports.ContextTagKeys = ContextTagKeys;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ContextTagKeys.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Base_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Data struct to contain both B and C sections.\n     */\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        function Data() {\n            return _super.call(this) || this;\n        }\n        return Data;\n    }(Base_1.Base));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./DataPointType */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPointType_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Metric data single measurement.\n     */\n    var DataPoint = /** @class */ (function () {\n        function DataPoint() {\n            this.kind = DataPointType_1.DataPointType.Measurement;\n        }\n        return DataPoint;\n    }());\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Type of the metric data measurement.\n     */\n    var DataPointType;\n    (function (DataPointType) {\n        DataPointType[DataPointType[\"Measurement\"] = 0] = \"Measurement\";\n        DataPointType[DataPointType[\"Aggregation\"] = 1] = \"Aggregation\";\n    })(DataPointType = exports.DataPointType || (exports.DataPointType = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPointType.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\":\n/*!*************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js ***!\n  \\*************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The abstract common base of all domains.\n     */\n    var Domain = /** @class */ (function () {\n        function Domain() {\n        }\n        return Domain;\n    }());\n    exports.Domain = Domain;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Domain.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * System variables for a telemetry item.\n     */\n    var Envelope = /** @class */ (function () {\n        function Envelope() {\n            this.ver = 1;\n            this.sampleRate = 100.0;\n            this.tags = {};\n        }\n        return Envelope;\n    }());\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Event represent structured event records that can be grouped and searched by their properties. Event data item also creates a metric of event count by name.\n     */\n    var EventData = /** @class */ (function (_super) {\n        __extends(EventData, _super);\n        function EventData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return EventData;\n    }(Domain_1.Domain));\n    exports.EventData = EventData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Exception represents a handled or unhandled exception that occurred during execution of the monitored application.\n     */\n    var ExceptionData = /** @class */ (function (_super) {\n        __extends(ExceptionData, _super);\n        function ExceptionData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.exceptions = [];\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return ExceptionData;\n    }(Domain_1.Domain));\n    exports.ExceptionData = ExceptionData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Exception details of the exception in a chain.\n     */\n    var ExceptionDetails = /** @class */ (function () {\n        function ExceptionDetails() {\n            this.hasFullStack = true;\n            this.parsedStack = [];\n        }\n        return ExceptionDetails;\n    }());\n    exports.ExceptionDetails = ExceptionDetails;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionDetails.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Message represent printf-like trace statements that are text-searched. Log4Net, NLog and other text-based log file entries are translated into intances of this type. The message does not have measurements.\n     */\n    var MessageData = /** @class */ (function (_super) {\n        __extends(MessageData, _super);\n        function MessageData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            return _this;\n        }\n        return MessageData;\n    }(Domain_1.Domain));\n    exports.MessageData = MessageData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MessageData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of the Metric item is a list of measurements (single data points) and/or aggregations.\n     */\n    var MetricData = /** @class */ (function (_super) {\n        __extends(MetricData, _super);\n        function MetricData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.metrics = [];\n            _this.properties = {};\n            return _this;\n        }\n        return MetricData;\n    }(Domain_1.Domain));\n    exports.MetricData = MetricData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\":\n/*!*******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js ***!\n  \\*******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageView represents a generic action on a page like a button click. It is also the base type for PageView.\n     */\n    var PageViewData = /** @class */ (function (_super) {\n        __extends(PageViewData, _super);\n        function PageViewData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewData;\n    }(EventData_1.EventData));\n    exports.PageViewData = PageViewData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageViewPerf represents: a page view with no performance data, a page view with performance data, or just the performance data of an earlier page request.\n     */\n    var PageViewPerfData = /** @class */ (function (_super) {\n        __extends(PageViewPerfData, _super);\n        function PageViewPerfData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewPerfData;\n    }(PageViewData_1.PageViewData));\n    exports.PageViewPerfData = PageViewPerfData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerfData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\":\n/*!***************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js ***!\n  \\***************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Remote Dependency represents an interaction of the monitored component with a remote component/service like SQL or an HTTP endpoint.\n     */\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        function RemoteDependencyData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.success = true;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return RemoteDependencyData;\n    }(Domain_1.Domain));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Defines the level of severity for the event.\n    */\n    var SeverityLevel;\n    (function (SeverityLevel) {\n        SeverityLevel[SeverityLevel[\"Verbose\"] = 0] = \"Verbose\";\n        SeverityLevel[SeverityLevel[\"Information\"] = 1] = \"Information\";\n        SeverityLevel[SeverityLevel[\"Warning\"] = 2] = \"Warning\";\n        SeverityLevel[SeverityLevel[\"Error\"] = 3] = \"Error\";\n        SeverityLevel[SeverityLevel[\"Critical\"] = 4] = \"Critical\";\n    })(SeverityLevel = exports.SeverityLevel || (exports.SeverityLevel = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SeverityLevel.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Stack frame information.\n     */\n    var StackFrame = /** @class */ (function () {\n        function StackFrame() {\n        }\n        return StackFrame;\n    }());\n    exports.StackFrame = StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=StackFrame.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RequestHeaders = /** @class */ (function () {\n        function RequestHeaders() {\n        }\n        /**\n         * Request-Context header\n         */\n        RequestHeaders.requestContextHeader = \"Request-Context\";\n        /**\n         * Target instrumentation header that is added to the response and retrieved by the\n         * calling application when processing incoming responses.\n         */\n        RequestHeaders.requestContextTargetKey = \"appId\";\n        /**\n         * Request-Context appId format\n         */\n        RequestHeaders.requestContextAppIdFormat = \"appId=cid-v1:\";\n        /**\n         * Request-Id header\n         */\n        RequestHeaders.requestIdHeader = \"Request-Id\";\n        /**\n         * Sdk-Context header\n         * If this header passed with appId in content then appId will be returned back by the backend.\n         */\n        RequestHeaders.sdkContextHeader = \"Sdk-Context\";\n        /**\n         * String to pass in header for requesting appId back from the backend.\n         */\n        RequestHeaders.sdkContextHeaderAppIdRequest = \"appId\";\n        RequestHeaders.requestContextHeaderLowerCase = \"request-context\";\n        return RequestHeaders;\n    }());\n    exports.RequestHeaders = RequestHeaders;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RequestResponseHeaders.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Data_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Data(type, data) {\n            var _this = _super.call(this) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                baseType: Enums_1.FieldType.Required,\n                baseData: Enums_1.FieldType.Required\n            };\n            _this.baseType = type;\n            _this.baseData = data;\n            return _this;\n        }\n        return Data;\n    }(Data_1.Data));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPoint_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataPoint = /** @class */ (function (_super) {\n        __extends(DataPoint, _super);\n        function DataPoint() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                name: Enums_1.FieldType.Required,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Required,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default\n            };\n            return _this;\n        }\n        return DataPoint;\n    }(DataPoint_1.DataPoint));\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataSanitizer = /** @class */ (function () {\n        function DataSanitizer() {\n        }\n        DataSanitizer.sanitizeKeyAndAddUniqueness = function (logger, key, map) {\n            var origLength = key.length;\n            var field = DataSanitizer.sanitizeKey(logger, key);\n            // validation truncated the length.  We need to add uniqueness\n            if (field.length !== origLength) {\n                var i = 0;\n                var uniqueField = field;\n                while (map[uniqueField] !== undefined) {\n                    i++;\n                    uniqueField = field.substring(0, DataSanitizer.MAX_NAME_LENGTH - 3) + DataSanitizer.padNumber(i);\n                }\n                field = uniqueField;\n            }\n            return field;\n        };\n        DataSanitizer.sanitizeKey = function (logger, name) {\n            if (name) {\n                // Remove any leading or trailing whitepace\n                name = Util_1.Util.trim(name.toString());\n                // truncate the string to 150 chars\n                if (name.length > DataSanitizer.MAX_NAME_LENGTH) {\n                    name = name.substring(0, DataSanitizer.MAX_NAME_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NameTooLong, \"name is too long.  It has been truncated to \" + DataSanitizer.MAX_NAME_LENGTH + \" characters.\", { name: name }, true);\n                }\n            }\n            return name;\n        };\n        DataSanitizer.sanitizeString = function (logger, value, maxLength) {\n            if (maxLength === void 0) { maxLength = DataSanitizer.MAX_STRING_LENGTH; }\n            if (value) {\n                maxLength = maxLength ? maxLength : DataSanitizer.MAX_STRING_LENGTH; // in case default parameters dont work\n                value = Util_1.Util.trim(value);\n                if (value.toString().length > maxLength) {\n                    value = value.toString().substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StringValueTooLong, \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n                }\n            }\n            return value;\n        };\n        DataSanitizer.sanitizeUrl = function (logger, url) {\n            return DataSanitizer.sanitizeInput(logger, url, DataSanitizer.MAX_URL_LENGTH, applicationinsights_core_js_1._InternalMessageId.UrlTooLong);\n        };\n        DataSanitizer.sanitizeMessage = function (logger, message) {\n            if (message) {\n                if (message.length > DataSanitizer.MAX_MESSAGE_LENGTH) {\n                    message = message.substring(0, DataSanitizer.MAX_MESSAGE_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.MessageTruncated, \"message is too long, it has been truncated to \" + DataSanitizer.MAX_MESSAGE_LENGTH + \" characters.\", { message: message }, true);\n                }\n            }\n            return message;\n        };\n        DataSanitizer.sanitizeException = function (logger, exception) {\n            if (exception) {\n                if (exception.length > DataSanitizer.MAX_EXCEPTION_LENGTH) {\n                    exception = exception.substring(0, DataSanitizer.MAX_EXCEPTION_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ExceptionTruncated, \"exception is too long, it has been truncated to \" + DataSanitizer.MAX_EXCEPTION_LENGTH + \" characters.\", { exception: exception }, true);\n                }\n            }\n            return exception;\n        };\n        DataSanitizer.sanitizeProperties = function (logger, properties) {\n            if (properties) {\n                var tempProps = {};\n                for (var prop in properties) {\n                    var value = DataSanitizer.sanitizeString(logger, properties[prop], DataSanitizer.MAX_PROPERTY_LENGTH);\n                    prop = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, prop, tempProps);\n                    tempProps[prop] = value;\n                }\n                properties = tempProps;\n            }\n            return properties;\n        };\n        DataSanitizer.sanitizeMeasurements = function (logger, measurements) {\n            if (measurements) {\n                var tempMeasurements = {};\n                for (var measure in measurements) {\n                    var value = measurements[measure];\n                    measure = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements);\n                    tempMeasurements[measure] = value;\n                }\n                measurements = tempMeasurements;\n            }\n            return measurements;\n        };\n        DataSanitizer.sanitizeId = function (logger, id) {\n            return id ? DataSanitizer.sanitizeInput(logger, id, DataSanitizer.MAX_ID_LENGTH, applicationinsights_core_js_1._InternalMessageId.IdTooLong).toString() : id;\n        };\n        DataSanitizer.sanitizeInput = function (logger, input, maxLength, _msgId) {\n            if (input) {\n                input = Util_1.Util.trim(input);\n                if (input.length > maxLength) {\n                    input = input.substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n                }\n            }\n            return input;\n        };\n        DataSanitizer.padNumber = function (num) {\n            var s = \"00\" + num;\n            return s.substr(s.length - 3);\n        };\n        /**\n        * Max length allowed for custom names.\n        */\n        DataSanitizer.MAX_NAME_LENGTH = 150;\n        /**\n         * Max length allowed for Id field in page views.\n         */\n        DataSanitizer.MAX_ID_LENGTH = 128;\n        /**\n         * Max length allowed for custom values.\n         */\n        DataSanitizer.MAX_PROPERTY_LENGTH = 8192;\n        /**\n         * Max length allowed for names\n         */\n        DataSanitizer.MAX_STRING_LENGTH = 1024;\n        /**\n         * Max length allowed for url.\n         */\n        DataSanitizer.MAX_URL_LENGTH = 2048;\n        /**\n         * Max length allowed for messages.\n         */\n        DataSanitizer.MAX_MESSAGE_LENGTH = 32768;\n        /**\n         * Max length allowed for exceptions.\n         */\n        DataSanitizer.MAX_EXCEPTION_LENGTH = 32768;\n        return DataSanitizer;\n    }());\n    exports.DataSanitizer = DataSanitizer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataSanitizer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\":\n/*!*************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js ***!\n  \\*************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Envelope */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\"), __webpack_require__(/*! ./DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Envelope_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Envelope = /** @class */ (function (_super) {\n        __extends(Envelope, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Envelope(logger, data, name) {\n            var _this = _super.call(this) || this;\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.data = data;\n            _this.time = Util_1.Util.toISOStringForIE8(new Date());\n            _this.aiDataContract = {\n                time: Enums_1.FieldType.Required,\n                iKey: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                sampleRate: function () {\n                    return (_this.sampleRate == 100) ? Enums_1.FieldType.Hidden : Enums_1.FieldType.Required;\n                },\n                tags: Enums_1.FieldType.Required,\n                data: Enums_1.FieldType.Required\n            };\n            return _this;\n        }\n        return Envelope;\n    }(Envelope_1.Envelope));\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Event.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Event = /** @class */ (function (_super) {\n        __extends(Event, _super);\n        /**\n         * Constructs a new instance of the EventTelemetry object\n         */\n        function Event(logger, name, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n        Event.dataType = \"EventData\";\n        return Event;\n    }(EventData_1.EventData));\n    exports.Event = Event;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Event.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/StackFrame */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionDetails */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, StackFrame_1, ExceptionData_1, ExceptionDetails_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Exception = /** @class */ (function (_super) {\n        __extends(Exception, _super);\n        /**\n        * Constructs a new isntance of the ExceptionTelemetry object\n        */\n        function Exception(logger, exception, properties, measurements, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                exceptions: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            _this.exceptions = [new _ExceptionDetails(logger, exception)];\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        /**\n        * Creates a simple exception with 1 stack frame. Useful for manual constracting of exception.\n        */\n        Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n            return {\n                exceptions: [\n                    {\n                        hasFullStack: true,\n                        message: message,\n                        stack: details,\n                        typeName: typeName\n                    }\n                ]\n            };\n        };\n        Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n        Exception.dataType = \"ExceptionData\";\n        return Exception;\n    }(ExceptionData_1.ExceptionData));\n    exports.Exception = Exception;\n    var _ExceptionDetails = /** @class */ (function (_super) {\n        __extends(_ExceptionDetails, _super);\n        function _ExceptionDetails(logger, exception) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Default,\n                outerId: Enums_1.FieldType.Default,\n                typeName: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                hasFullStack: Enums_1.FieldType.Default,\n                stack: Enums_1.FieldType.Default,\n                parsedStack: Enums_1.FieldType.Array\n            };\n            _this.typeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, exception.name) || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, exception.message) || Util_1.Util.NotSpecified;\n            var stack = exception[\"stack\"];\n            _this.parsedStack = _this.parseStack(stack);\n            _this.stack = DataSanitizer_1.DataSanitizer.sanitizeException(logger, stack);\n            _this.hasFullStack = Util_1.Util.isArray(_this.parsedStack) && _this.parsedStack.length > 0;\n            return _this;\n        }\n        _ExceptionDetails.prototype.parseStack = function (stack) {\n            var parsedStack = undefined;\n            if (typeof stack === \"string\") {\n                var frames = stack.split('\\n');\n                parsedStack = [];\n                var level = 0;\n                var totalSizeInBytes = 0;\n                for (var i = 0; i <= frames.length; i++) {\n                    var frame = frames[i];\n                    if (_StackFrame.regex.test(frame)) {\n                        var parsedFrame = new _StackFrame(frames[i], level++);\n                        totalSizeInBytes += parsedFrame.sizeInBytes;\n                        parsedStack.push(parsedFrame);\n                    }\n                }\n                // DP Constraint - exception parsed stack must be < 32KB\n                // remove frames from the middle to meet the threshold\n                var exceptionParsedStackThreshold = 32 * 1024;\n                if (totalSizeInBytes > exceptionParsedStackThreshold) {\n                    var left = 0;\n                    var right = parsedStack.length - 1;\n                    var size = 0;\n                    var acceptedLeft = left;\n                    var acceptedRight = right;\n                    while (left < right) {\n                        // check size\n                        var lSize = parsedStack[left].sizeInBytes;\n                        var rSize = parsedStack[right].sizeInBytes;\n                        size += lSize + rSize;\n                        if (size > exceptionParsedStackThreshold) {\n                            // remove extra frames from the middle\n                            var howMany = acceptedRight - acceptedLeft + 1;\n                            parsedStack.splice(acceptedLeft, howMany);\n                            break;\n                        }\n                        // update pointers\n                        acceptedLeft = left;\n                        acceptedRight = right;\n                        left++;\n                        right--;\n                    }\n                }\n            }\n            return parsedStack;\n        };\n        return _ExceptionDetails;\n    }(ExceptionDetails_1.ExceptionDetails));\n    var _StackFrame = /** @class */ (function (_super) {\n        __extends(_StackFrame, _super);\n        function _StackFrame(frame, level) {\n            var _this = _super.call(this) || this;\n            _this.sizeInBytes = 0;\n            _this.aiDataContract = {\n                level: Enums_1.FieldType.Required,\n                method: Enums_1.FieldType.Required,\n                assembly: Enums_1.FieldType.Default,\n                fileName: Enums_1.FieldType.Default,\n                line: Enums_1.FieldType.Default\n            };\n            _this.level = level;\n            _this.method = \"<no_method>\";\n            _this.assembly = Util_1.Util.trim(frame);\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches.length >= 5) {\n                _this.method = Util_1.Util.trim(matches[2]) || _this.method;\n                _this.fileName = Util_1.Util.trim(matches[4]);\n                _this.line = parseInt(matches[5]) || 0;\n            }\n            _this.sizeInBytes += _this.method.length;\n            _this.sizeInBytes += _this.fileName.length;\n            _this.sizeInBytes += _this.assembly.length;\n            // todo: these might need to be removed depending on how the back-end settles on their size calculation\n            _this.sizeInBytes += _StackFrame.baseSize;\n            _this.sizeInBytes += _this.level.toString().length;\n            _this.sizeInBytes += _this.line.toString().length;\n            return _this;\n        }\n        // regex to match stack frames from ie/chrome/ff\n        // methodName=$2, fileName=$4, lineNo=$5, column=$6\n        _StackFrame.regex = /^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n        _StackFrame.baseSize = 58; //'{\"method\":\"\",\"level\":,\"assembly\":\"\",\"fileName\":\"\",\"line\":}'.length\n        return _StackFrame;\n    }(StackFrame_1.StackFrame));\n    exports._StackFrame = _StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Exception.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js ***!\n  \\****************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MetricData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MetricData_1, DataSanitizer_1, Enums_1, DataPoint_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Metric = /** @class */ (function (_super) {\n        __extends(Metric, _super);\n        /**\n         * Constructs a new instance of the MetricTelemetry object\n         */\n        function Metric(logger, name, value, count, min, max, properties) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                metrics: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default\n            };\n            var dataPoint = new DataPoint_1.DataPoint();\n            dataPoint.count = count > 0 ? count : undefined;\n            dataPoint.max = isNaN(max) || max === null ? undefined : max;\n            dataPoint.min = isNaN(min) || min === null ? undefined : min;\n            dataPoint.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            dataPoint.value = value;\n            _this.metrics = [dataPoint];\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            return _this;\n        }\n        Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n        Metric.dataType = \"MetricData\";\n        return Metric;\n    }(MetricData_1.MetricData));\n    exports.Metric = Metric;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Metric.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageView = /** @class */ (function (_super) {\n        __extends(PageView, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageView(logger, name, url, durationMs, properties, measurements, id) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                id: Enums_1.FieldType.Default,\n            };\n            _this.id = DataSanitizer_1.DataSanitizer.sanitizeId(logger, id);\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            if (!isNaN(durationMs)) {\n                _this.duration = Util_1.Util.msToTimeSpan(durationMs);\n            }\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n        PageView.dataType = \"PageviewData\";\n        return PageView;\n    }(PageViewData_1.PageViewData));\n    exports.PageView = PageView;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageView.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewPerfData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewPerfData_1, Enums_1, DataSanitizer_1, Util_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformance = /** @class */ (function (_super) {\n        __extends(PageViewPerformance, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageViewPerformance(logger, name, url, unused, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                perfTotal: Enums_1.FieldType.Default,\n                networkConnect: Enums_1.FieldType.Default,\n                sentRequest: Enums_1.FieldType.Default,\n                receivedResponse: Enums_1.FieldType.Default,\n                domProcessing: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.isValid = false;\n            /*\n             * http://www.w3.org/TR/navigation-timing/#processing-model\n             *  |-navigationStart\n             *  |             |-connectEnd\n             *  |             ||-requestStart\n             *  |             ||             |-responseStart\n             *  |             ||             |              |-responseEnd\n             *  |             ||             |              |\n             *  |             ||             |              |         |-loadEventEnd\n             *  |---network---||---request---|---response---|---dom---|\n             *  |--------------------------total----------------------|\n             */\n            var timing = PageViewPerformance.getPerformanceTiming();\n            if (timing) {\n                var total = PageViewPerformance.getDuration(timing.navigationStart, timing.loadEventEnd);\n                var network = PageViewPerformance.getDuration(timing.navigationStart, timing.connectEnd);\n                var request = PageViewPerformance.getDuration(timing.requestStart, timing.responseStart);\n                var response = PageViewPerformance.getDuration(timing.responseStart, timing.responseEnd);\n                var dom = PageViewPerformance.getDuration(timing.responseEnd, timing.loadEventEnd);\n                if (total == 0) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ErrorPVCalc, \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (!PageViewPerformance.shouldCollectDuration(total, network, request, response, dom)) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.InvalidDurationValue, \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                    // some browsers may report individual components incorrectly so that the sum of the parts will be bigger than total PLT\n                    // in this case, don't report client performance from this page\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ClientPerformanceMathError, \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else {\n                    _this.durationMs = total;\n                    // convert to timespans\n                    _this.perfTotal = _this.duration = Util_1.Util.msToTimeSpan(total);\n                    _this.networkConnect = Util_1.Util.msToTimeSpan(network);\n                    _this.sentRequest = Util_1.Util.msToTimeSpan(request);\n                    _this.receivedResponse = Util_1.Util.msToTimeSpan(response);\n                    _this.domProcessing = Util_1.Util.msToTimeSpan(dom);\n                    _this.isValid = true;\n                }\n            }\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        /**\n         * Indicates whether this instance of PageViewPerformance is valid and should be sent\n         */\n        PageViewPerformance.prototype.getIsValid = function () {\n            return this.isValid;\n        };\n        /**\n        * Gets the total duration (PLT) in milliseconds. Check getIsValid() before using this method.\n        */\n        PageViewPerformance.prototype.getDurationMs = function () {\n            return this.durationMs;\n        };\n        PageViewPerformance.getPerformanceTiming = function () {\n            if (PageViewPerformance.isPerformanceTimingSupported()) {\n                return window.performance.timing;\n            }\n            return null;\n        };\n        /**\n        * Returns true is window performance timing API is supported, false otherwise.\n        */\n        PageViewPerformance.isPerformanceTimingSupported = function () {\n            return typeof window != \"undefined\" && window.performance && window.performance.timing;\n        };\n        /**\n         * As page loads different parts of performance timing numbers get set. When all of them are set we can report it.\n         * Returns true if ready, false otherwise.\n         */\n        PageViewPerformance.isPerformanceTimingDataReady = function () {\n            var timing = window.performance.timing;\n            return timing.domainLookupStart > 0\n                && timing.navigationStart > 0\n                && timing.responseStart > 0\n                && timing.requestStart > 0\n                && timing.loadEventEnd > 0\n                && timing.responseEnd > 0\n                && timing.connectEnd > 0\n                && timing.domLoading > 0;\n        };\n        PageViewPerformance.getDuration = function (start, end) {\n            var duration = undefined;\n            if (!(isNaN(start) || isNaN(end))) {\n                duration = Math.max(end - start, 0);\n            }\n            return duration;\n        };\n        /**\n         * This method tells if given durations should be excluded from collection.\n         */\n        PageViewPerformance.shouldCollectDuration = function () {\n            var durations = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                durations[_i] = arguments[_i];\n            }\n            // a full list of Google crawlers user agent strings - https://support.google.com/webmasters/answer/1061943?hl=en\n            var botAgentNames = ['googlebot', 'adsbot-google', 'apis-google', 'mediapartners-google'];\n            var userAgent = navigator.userAgent;\n            var isGoogleBot = false;\n            if (userAgent) {\n                for (var i_1 = 0; i_1 < botAgentNames.length; i_1++) {\n                    isGoogleBot = isGoogleBot || userAgent.toLowerCase().indexOf(botAgentNames[i_1]) !== -1;\n                }\n            }\n            if (isGoogleBot) {\n                // Don't report durations for GoogleBot, it is returning invalid values in performance.timing API. \n                return false;\n            }\n            else {\n                // for other page views, don't report if it's outside of a reasonable range\n                for (var i = 0; i < durations.length; i++) {\n                    if (durations[i] >= PageViewPerformance.MAX_DURATION_ALLOWED) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        };\n        PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n        PageViewPerformance.dataType = \"PageviewPerformanceData\";\n        PageViewPerformance.MAX_DURATION_ALLOWED = 3600000; // 1h\n        return PageViewPerformance;\n    }(PageViewPerfData_1.PageViewPerfData));\n    exports.PageViewPerformance = PageViewPerformance;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformance.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataSanitizer_1, Enums_1, Util_1, Util_2, RemoteDependencyData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        /**\n         * Constructs a new instance of the RemoteDependencyData object\n         */\n        function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Required,\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                resultCode: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                success: Enums_1.FieldType.Default,\n                data: Enums_1.FieldType.Default,\n                target: Enums_1.FieldType.Default,\n                type: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Default,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default,\n                dependencyKind: Enums_1.FieldType.Default,\n                dependencySource: Enums_1.FieldType.Default,\n                commandName: Enums_1.FieldType.Default,\n                dependencyTypeName: Enums_1.FieldType.Default,\n            };\n            _this.id = id;\n            _this.duration = Util_1.Util.msToTimeSpan(value);\n            _this.success = success;\n            _this.resultCode = resultCode + \"\";\n            _this.type = \"Ajax\";\n            _this.data = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, commandName);\n            var dependencyFields = Util_2.AjaxHelper.ParseDependencyPath(logger, absoluteUrl, method, commandName);\n            _this.target = dependencyFields.target;\n            _this.name = dependencyFields.name;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n        RemoteDependencyData.dataType = \"RemoteDependencyData\";\n        return RemoteDependencyData;\n    }(RemoteDependencyData_1.RemoteDependencyData));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MessageData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MessageData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Trace = /** @class */ (function (_super) {\n        __extends(Trace, _super);\n        /**\n         * Constructs a new instance of the TraceTelemetry object\n         */\n        function Trace(logger, message, properties, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default\n            };\n            message = message || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, message);\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n        Trace.dataType = \"MessageData\";\n        return Trace;\n    }(MessageData_1.MessageData));\n    exports.Trace = Trace;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Trace.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\":\n/*!********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js ***!\n  \\********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, DataSanitizer_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TelemetryItemCreator = /** @class */ (function () {\n        function TelemetryItemCreator() {\n        }\n        /**\n         * Create a telemetry item that the 1DS channel understands\n         * @param item domain specific properties; part B\n         * @param baseType telemetry item type. ie PageViewData\n         * @param envelopeName name of the envelope. ie Microsoft.ApplicationInsights.<instrumentation key>.PageView\n         * @param customProperties user defined custom properties; part C\n         * @param systemProperties system properties that are added to the context; part A\n         * @returns ITelemetryItem that is sent to channel\n         */\n        TelemetryItemCreator.create = function (item, baseType, envelopeName, logger, customProperties, systemProperties) {\n            envelopeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, envelopeName) || Util_1.Util.NotSpecified;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(item) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(baseType) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(envelopeName)) {\n                throw Error(\"Input doesn't contain all required fields\");\n            }\n            var telemetryItem = {\n                name: envelopeName,\n                timestamp: new Date(),\n                instrumentationKey: \"\",\n                ctx: systemProperties ? systemProperties : {},\n                tags: [],\n                data: {},\n                baseType: baseType,\n                baseData: item\n            };\n            // Part C\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties)) {\n                for (var prop in customProperties) {\n                    if (customProperties.hasOwnProperty(prop)) {\n                        telemetryItem.data[prop] = customProperties[prop];\n                    }\n                }\n            }\n            return telemetryItem;\n        };\n        return TelemetryItemCreator;\n    }());\n    exports.TelemetryItemCreator = TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TelemetryItemCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Util.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Util.js ***!\n  \\****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Enums_1, applicationinsights_core_js_1, RequestResponseHeaders_1, DataSanitizer_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Util = /** @class */ (function () {\n        function Util() {\n        }\n        /*\n         * Force the SDK not to use local and session storage\n        */\n        Util.disableStorage = function () {\n            Util._canUseLocalStorage = false;\n            Util._canUseSessionStorage = false;\n        };\n        /**\n         * Gets the localStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getLocalStorageObject = function () {\n            if (Util.canUseLocalStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return null;\n        };\n        /**\n         * Tests storage object (localStorage or sessionStorage) to verify that it is usable\n         * More details here: https://mathiasbynens.be/notes/localstorage-pattern\n         * @param storageType Type of storage\n         * @return {Storage} Returns storage object verified that it is usable\n         */\n        Util._getVerifiedStorageObject = function (storageType) {\n            var storage = null;\n            var fail;\n            var uid;\n            try {\n                uid = new Date;\n                storage = storageType === Enums_1.StorageType.LocalStorage ? window.localStorage : window.sessionStorage;\n                storage.setItem(uid, uid);\n                fail = storage.getItem(uid) != uid;\n                storage.removeItem(uid);\n                if (fail) {\n                    storage = null;\n                }\n            }\n            catch (exception) {\n                storage = null;\n            }\n            return storage;\n        };\n        /**\n         *  Checks if endpoint URL is application insights internal injestion service URL.\n         *\n         *  @param endpointUrl Endpoint URL to check.\n         *  @returns {boolean} True if if endpoint URL is application insights internal injestion service URL.\n         */\n        Util.isInternalApplicationInsightsEndpoint = function (endpointUrl) {\n            return Util._internalEndpoints.indexOf(endpointUrl.toLowerCase()) !== -1;\n        };\n        /**\n         *  Check if the browser supports local storage.\n         *\n         *  @returns {boolean} True if local storage is supported.\n         */\n        Util.canUseLocalStorage = function () {\n            if (Util._canUseLocalStorage === undefined) {\n                Util._canUseLocalStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return Util._canUseLocalStorage;\n        };\n        /**\n         *  Get an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadLocalStorage, \"Browser failed read of local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's local storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setStorage = function (logger, name, data) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteLocalStorage, \"Browser failed write to local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromLocalStorage, \"Browser failed removal of local storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         * Gets the sessionStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getSessionStorageObject = function () {\n            if (Util.canUseSessionStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return null;\n        };\n        /**\n         *  Check if the browser supports session storage.\n         *\n         *  @returns {boolean} True if session storage is supported.\n         */\n        Util.canUseSessionStorage = function () {\n            if (Util._canUseSessionStorage === undefined) {\n                Util._canUseSessionStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return Util._canUseSessionStorage;\n        };\n        /**\n         *  Gets the list of session storage keys\n         *\n         *  @returns {string[]} List of session storage keys\n         */\n        Util.getSessionStorageKeys = function () {\n            var keys = [];\n            if (Util.canUseSessionStorage()) {\n                for (var key in window.sessionStorage) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n        /**\n         *  Get an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadSessionStorage, \"Browser failed read of session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's session storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setSessionStorage = function (logger, name, data) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteSessionStorage, \"Browser failed write to session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromSessionStorage, \"Browser failed removal of session storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /*\n         * Force the SDK not to store and read any data from cookies\n         */\n        Util.disableCookies = function () {\n            Util._canUseCookies = false;\n        };\n        /*\n         * helper method to tell if document.cookie object is available\n         */\n        Util.canUseCookies = function (logger) {\n            if (Util._canUseCookies === undefined) {\n                Util._canUseCookies = false;\n                try {\n                    Util._canUseCookies = Util.document.cookie !== undefined;\n                }\n                catch (e) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotAccessCookie, \"Cannot access document.cookie - \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n                ;\n            }\n            return Util._canUseCookies;\n        };\n        /**\n         * helper method to set userId and sessionId cookie\n         */\n        Util.setCookie = function (logger, name, value, domain) {\n            var domainAttrib = \"\";\n            var secureAttrib = \"\";\n            if (domain) {\n                domainAttrib = \";domain=\" + domain;\n            }\n            if (Util.document.location && Util.document.location.protocol === \"https:\") {\n                secureAttrib = \";secure\";\n            }\n            if (Util.canUseCookies(logger)) {\n                Util.document.cookie = name + \"=\" + value + domainAttrib + \";path=/\" + secureAttrib;\n            }\n        };\n        Util.stringToBoolOrDefault = function (str, defaultValue) {\n            if (defaultValue === void 0) { defaultValue = false; }\n            if (str === undefined || str === null) {\n                return defaultValue;\n            }\n            return str.toString().toLowerCase() === \"true\";\n        };\n        /**\n         * helper method to access userId and sessionId cookie\n         */\n        Util.getCookie = function (logger, name) {\n            if (!Util.canUseCookies(logger)) {\n                return;\n            }\n            var value = \"\";\n            if (name && name.length) {\n                var cookieName = name + \"=\";\n                var cookies = Util.document.cookie.split(\";\");\n                for (var i = 0; i < cookies.length; i++) {\n                    var cookie = cookies[i];\n                    cookie = Util.trim(cookie);\n                    if (cookie && cookie.indexOf(cookieName) === 0) {\n                        value = cookie.substring(cookieName.length, cookies[i].length);\n                        break;\n                    }\n                }\n            }\n            return value;\n        };\n        /**\n         * Deletes a cookie by setting it's expiration time in the past.\n         * @param name - The name of the cookie to delete.\n         */\n        Util.deleteCookie = function (logger, name) {\n            if (Util.canUseCookies(logger)) {\n                // Setting the expiration date in the past immediately removes the cookie\n                Util.document.cookie = name + \"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n            }\n        };\n        /**\n         * helper method to trim strings (IE8 does not implement String.prototype.trim)\n         */\n        Util.trim = function (str) {\n            if (typeof str !== \"string\")\n                return str;\n            return str.replace(/^\\s+|\\s+$/g, \"\");\n        };\n        /**\n         * generate random id string\n         */\n        Util.newId = function () {\n            var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            var result = \"\";\n            var random = Math.random() * 1073741824; //5 symbols in base64, almost maxint\n            while (random > 0) {\n                var char = base64chars.charAt(random % 64);\n                result += char;\n                random = Math.floor(random / 64);\n            }\n            return result;\n        };\n        /**\n         * Check if an object is of type Array\n         */\n        Util.isArray = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n        /**\n         * Check if an object is of type Error\n         */\n        Util.isError = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Error]\";\n        };\n        /**\n         * Check if an object is of type Date\n         */\n        Util.isDate = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Date]\";\n        };\n        /**\n         * Convert a date to I.S.O. format in IE8\n         */\n        Util.toISOStringForIE8 = function (date) {\n            if (Util.isDate(date)) {\n                if (Date.prototype.toISOString) {\n                    return date.toISOString();\n                }\n                else {\n                    var pad = function (number) {\n                        var r = String(number);\n                        if (r.length === 1) {\n                            r = \"0\" + r;\n                        }\n                        return r;\n                    };\n                    return date.getUTCFullYear()\n                        + \"-\" + pad(date.getUTCMonth() + 1)\n                        + \"-\" + pad(date.getUTCDate())\n                        + \"T\" + pad(date.getUTCHours())\n                        + \":\" + pad(date.getUTCMinutes())\n                        + \":\" + pad(date.getUTCSeconds())\n                        + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                        + \"Z\";\n                }\n            }\n        };\n        /**\n         * Gets IE version if we are running on IE, or null otherwise\n         */\n        Util.getIEVersion = function (userAgentStr) {\n            if (userAgentStr === void 0) { userAgentStr = null; }\n            var myNav = userAgentStr ? userAgentStr.toLowerCase() : navigator.userAgent.toLowerCase();\n            return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : null;\n        };\n        /**\n         * Convert ms to c# time span format\n         */\n        Util.msToTimeSpan = function (totalms) {\n            if (isNaN(totalms) || totalms < 0) {\n                totalms = 0;\n            }\n            totalms = Math.round(totalms);\n            var ms = \"\" + totalms % 1000;\n            var sec = \"\" + Math.floor(totalms / 1000) % 60;\n            var min = \"\" + Math.floor(totalms / (1000 * 60)) % 60;\n            var hour = \"\" + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n            var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n            ms = ms.length === 1 ? \"00\" + ms : ms.length === 2 ? \"0\" + ms : ms;\n            sec = sec.length < 2 ? \"0\" + sec : sec;\n            min = min.length < 2 ? \"0\" + min : min;\n            hour = hour.length < 2 ? \"0\" + hour : hour;\n            return (days > 0 ? days + \".\" : \"\") + hour + \":\" + min + \":\" + sec + \".\" + ms;\n        };\n        /**\n        * Checks if error has no meaningful data inside. Ususally such errors are received by window.onerror when error\n        * happens in a script from other domain (cross origin, CORS).\n        */\n        Util.isCrossOriginError = function (message, url, lineNumber, columnNumber, error) {\n            return (message === \"Script error.\" || message === \"Script error\") && !error;\n        };\n        /**\n        * Returns string representation of an object suitable for diagnostics logging.\n        */\n        Util.dump = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            var propertyValueDump = JSON.stringify(object);\n            if (objectTypeDump === \"[object Error]\") {\n                propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n            }\n            return objectTypeDump + propertyValueDump;\n        };\n        /**\n        * Returns the name of object if it's an Error. Otherwise, returns empty string.\n        */\n        Util.getExceptionName = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            if (objectTypeDump === \"[object Error]\") {\n                return object.name;\n            }\n            return \"\";\n        };\n        /**\n         * Adds an event handler for the specified event\n         * @param eventName {string} - The name of the event\n         * @param callback {any} - The callback function that needs to be executed for the given event\n         * @return {boolean} - true if the handler was successfully added\n         */\n        Util.addEventHandler = function (eventName, callback) {\n            if (!window || typeof eventName !== 'string' || typeof callback !== 'function') {\n                return false;\n            }\n            // Create verb for the event\n            var verbEventName = 'on' + eventName;\n            // check if addEventListener is available\n            if (window.addEventListener) {\n                window.addEventListener(eventName, callback, false);\n            }\n            else if (window[\"attachEvent\"]) {\n                window[\"attachEvent\"](verbEventName, callback);\n            }\n            else {\n                return false;\n            }\n            return true;\n        };\n        /**\n         * Tells if a browser supports a Beacon API\n         */\n        Util.IsBeaconApiSupported = function () {\n            return ('sendBeacon' in navigator && navigator.sendBeacon);\n        };\n        Util.document = typeof document !== \"undefined\" ? document : {};\n        Util._canUseCookies = undefined;\n        Util._canUseLocalStorage = undefined;\n        Util._canUseSessionStorage = undefined;\n        // listing only non-geo specific locations \n        Util._internalEndpoints = [\n            \"https://dc.services.visualstudio.com/v2/track\",\n            \"https://breeze.aimon.applicationinsights.io/v2/track\",\n            \"https://dc-int.services.visualstudio.com/v2/track\"\n        ];\n        Util.NotSpecified = \"not_specified\";\n        return Util;\n    }());\n    exports.Util = Util;\n    var UrlHelper = /** @class */ (function () {\n        function UrlHelper() {\n        }\n        UrlHelper.parseUrl = function (url) {\n            if (!UrlHelper.htmlAnchorElement) {\n                UrlHelper.htmlAnchorElement = !!UrlHelper.document.createElement ? UrlHelper.document.createElement('a') : {};\n            }\n            UrlHelper.htmlAnchorElement.href = url;\n            return UrlHelper.htmlAnchorElement;\n        };\n        UrlHelper.getAbsoluteUrl = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.href;\n            }\n            return result;\n        };\n        UrlHelper.getPathName = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.pathname;\n            }\n            return result;\n        };\n        UrlHelper.getCompleteUrl = function (method, absoluteUrl) {\n            if (method) {\n                return method.toUpperCase() + \" \" + absoluteUrl;\n            }\n            else {\n                return absoluteUrl;\n            }\n        };\n        UrlHelper.document = typeof document !== \"undefined\" ? document : {};\n        return UrlHelper;\n    }());\n    exports.UrlHelper = UrlHelper;\n    var CorrelationIdHelper = /** @class */ (function () {\n        function CorrelationIdHelper() {\n        }\n        /**\n        * Checks if a request url is not on a excluded domain list and if it is safe to add correlation headers\n        */\n        CorrelationIdHelper.canIncludeCorrelationHeader = function (config, requestUrl, currentHost) {\n            if (config && config.disableCorrelationHeaders) {\n                return false;\n            }\n            if (!requestUrl) {\n                return false;\n            }\n            var requestHost = UrlHelper.parseUrl(requestUrl).host.toLowerCase();\n            if ((!config || !config.enableCorsCorrelation) && requestHost !== currentHost) {\n                return false;\n            }\n            var excludedDomains = config && config.correlationHeaderExcludedDomains;\n            if (!excludedDomains || excludedDomains.length == 0) {\n                return true;\n            }\n            for (var i = 0; i < excludedDomains.length; i++) {\n                var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\./g, \"\\.\").replace(/\\*/g, \".*\"));\n                if (regex.test(requestHost)) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n        * Combines target appId and target role name from response header.\n        */\n        CorrelationIdHelper.getCorrelationContext = function (responseHeader) {\n            if (responseHeader) {\n                var correlationId = CorrelationIdHelper.getCorrelationContextValue(responseHeader, RequestResponseHeaders_1.RequestHeaders.requestContextTargetKey);\n                if (correlationId && correlationId !== CorrelationIdHelper.correlationIdPrefix) {\n                    return correlationId;\n                }\n            }\n        };\n        /**\n        * Gets key from correlation response header\n        */\n        CorrelationIdHelper.getCorrelationContextValue = function (responseHeader, key) {\n            if (responseHeader) {\n                var keyValues = responseHeader.split(\",\");\n                for (var i = 0; i < keyValues.length; ++i) {\n                    var keyValue = keyValues[i].split(\"=\");\n                    if (keyValue.length == 2 && keyValue[0] == key) {\n                        return keyValue[1];\n                    }\n                }\n            }\n        };\n        CorrelationIdHelper.correlationIdPrefix = \"cid-v1:\";\n        return CorrelationIdHelper;\n    }());\n    exports.CorrelationIdHelper = CorrelationIdHelper;\n    var AjaxHelper = /** @class */ (function () {\n        function AjaxHelper() {\n        }\n        AjaxHelper.ParseDependencyPath = function (logger, absoluteUrl, method, pathName) {\n            var target, name;\n            if (absoluteUrl && absoluteUrl.length > 0) {\n                var parsedUrl = UrlHelper.parseUrl(absoluteUrl);\n                target = parsedUrl.host;\n                if (parsedUrl.pathname != null) {\n                    var pathName = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                    if (pathName.charAt(0) !== '/') {\n                        pathName = \"/\" + pathName;\n                    }\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, method ? method + \" \" + pathName : pathName);\n                }\n                else {\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, absoluteUrl);\n                }\n            }\n            else {\n                target = pathName;\n                name = pathName;\n            }\n            return {\n                target: target,\n                name: name\n            };\n        };\n        return AjaxHelper;\n    }());\n    exports.AjaxHelper = AjaxHelper;\n    /**\n     * A utility class that helps getting time related parameters\n     */\n    var DateTimeUtils = /** @class */ (function () {\n        function DateTimeUtils() {\n        }\n        /**\n         * Get the number of milliseconds since 1970/01/01 in local timezone\n         */\n        DateTimeUtils.Now = (window.performance && window.performance.now && window.performance.timing) ?\n            function () {\n                return window.performance.now() + window.performance.timing.navigationStart;\n            }\n            :\n                function () {\n                    return new Date().getTime();\n                };\n        /**\n         * Gets duration between two timestamps\n         */\n        DateTimeUtils.GetDuration = function (start, end) {\n            var result = null;\n            if (start !== 0 && end !== 0 && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(start) && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(end)) {\n                result = end - start;\n            }\n            return result;\n        };\n        return DateTimeUtils;\n    }());\n    exports.DateTimeUtils = DateTimeUtils;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Util.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/applicationinsights-common.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Constants */ \"./node_modules/applicationinsights-common/bundle/Constants.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\"), __webpack_require__(/*! ./Telemetry/Common/Envelope */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\"), __webpack_require__(/*! ./Telemetry/Event */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\"), __webpack_require__(/*! ./Telemetry/Exception */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\"), __webpack_require__(/*! ./Telemetry/Metric */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\"), __webpack_require__(/*! ./Telemetry/PageView */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Telemetry/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\"), __webpack_require__(/*! ./Telemetry/Trace */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\"), __webpack_require__(/*! ./Telemetry/PageViewPerformance */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\"), __webpack_require__(/*! ./Telemetry/Common/Data */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/SeverityLevel */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/ContextTagKeys */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ./TelemetryItemCreator */ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, Enums_1, RequestResponseHeaders_1, Constants_1, Data_1, Base_1, Envelope_1, Event_1, Exception_1, Metric_1, PageView_1, PageViewData_1, RemoteDependencyData_1, Trace_1, PageViewPerformance_1, Data_2, SeverityLevel_1, ContextTagKeys_1, DataSanitizer_1, TelemetryItemCreator_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Util = Util_1.Util;\n    exports.CorrelationIdHelper = Util_1.CorrelationIdHelper;\n    exports.UrlHelper = Util_1.UrlHelper;\n    exports.DateTimeUtils = Util_1.DateTimeUtils;\n    exports.FieldType = Enums_1.FieldType;\n    exports.RequestHeaders = RequestResponseHeaders_1.RequestHeaders;\n    exports.DisabledPropertyName = Constants_1.DisabledPropertyName;\n    exports.AIData = Data_1.Data;\n    exports.AIBase = Base_1.Base;\n    exports.Envelope = Envelope_1.Envelope;\n    exports.Event = Event_1.Event;\n    exports.Exception = Exception_1.Exception;\n    exports.Metric = Metric_1.Metric;\n    exports.PageView = PageView_1.PageView;\n    exports.PageViewData = PageViewData_1.PageViewData;\n    exports.RemoteDependencyData = RemoteDependencyData_1.RemoteDependencyData;\n    exports.Trace = Trace_1.Trace;\n    exports.PageViewPerformance = PageViewPerformance_1.PageViewPerformance;\n    exports.Data = Data_2.Data;\n    exports.SeverityLevel = SeverityLevel_1.SeverityLevel;\n    exports.ContextTagKeys = ContextTagKeys_1.ContextTagKeys;\n    exports.DataSanitizer = DataSanitizer_1.DataSanitizer;\n    exports.TelemetryItemCreator = TelemetryItemCreator_1.TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-common.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n     */\n    exports.EventsDiscardedReason = {\n        /**\n         * Unknown.\n         */\n        Unknown: 0,\n        /**\n         * Status set to non-retryable.\n         */\n        NonRetryableStatus: 1,\n        /**\n         * The event is invalid.\n         */\n        InvalidEvent: 2,\n        /**\n         * The size of the event is too large.\n         */\n        SizeLimitExceeded: 3,\n        /**\n         * The server is not accepting events from this instrumentation key.\n         */\n        KillSwitch: 4,\n        /**\n         * The event queue is full.\n         */\n        QueueFull: 5,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventsDiscardedReason.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\":\n/*!*********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js ***!\n  \\*********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var LoggingSeverity;\n    (function (LoggingSeverity) {\n        /**\n         * Error will be sent as internal telemetry\n         */\n        LoggingSeverity[LoggingSeverity[\"CRITICAL\"] = 1] = \"CRITICAL\";\n        /**\n         * Error will NOT be sent as internal telemetry, and will only be shown in browser console\n         */\n        LoggingSeverity[LoggingSeverity[\"WARNING\"] = 2] = \"WARNING\";\n    })(LoggingSeverity = exports.LoggingSeverity || (exports.LoggingSeverity = {}));\n    /**\n     * Internal message ID. Please create a new one for every conceptually different message. Please keep alphabetically ordered\n     */ ;\n    exports._InternalMessageId = {\n        // Non user actionable\n        BrowserDoesNotSupportLocalStorage: 0,\n        BrowserCannotReadLocalStorage: 1,\n        BrowserCannotReadSessionStorage: 2,\n        BrowserCannotWriteLocalStorage: 3,\n        BrowserCannotWriteSessionStorage: 4,\n        BrowserFailedRemovalFromLocalStorage: 5,\n        BrowserFailedRemovalFromSessionStorage: 6,\n        CannotSendEmptyTelemetry: 7,\n        ClientPerformanceMathError: 8,\n        ErrorParsingAISessionCookie: 9,\n        ErrorPVCalc: 10,\n        ExceptionWhileLoggingError: 11,\n        FailedAddingTelemetryToBuffer: 12,\n        FailedMonitorAjaxAbort: 13,\n        FailedMonitorAjaxDur: 14,\n        FailedMonitorAjaxOpen: 15,\n        FailedMonitorAjaxRSC: 16,\n        FailedMonitorAjaxSend: 17,\n        FailedMonitorAjaxGetCorrelationHeader: 18,\n        FailedToAddHandlerForOnBeforeUnload: 19,\n        FailedToSendQueuedTelemetry: 20,\n        FailedToReportDataLoss: 21,\n        FlushFailed: 22,\n        MessageLimitPerPVExceeded: 23,\n        MissingRequiredFieldSpecification: 24,\n        NavigationTimingNotSupported: 25,\n        OnError: 26,\n        SessionRenewalDateIsZero: 27,\n        SenderNotInitialized: 28,\n        StartTrackEventFailed: 29,\n        StopTrackEventFailed: 30,\n        StartTrackFailed: 31,\n        StopTrackFailed: 32,\n        TelemetrySampledAndNotSent: 33,\n        TrackEventFailed: 34,\n        TrackExceptionFailed: 35,\n        TrackMetricFailed: 36,\n        TrackPVFailed: 37,\n        TrackPVFailedCalc: 38,\n        TrackTraceFailed: 39,\n        TransmissionFailed: 40,\n        FailedToSetStorageBuffer: 41,\n        FailedToRestoreStorageBuffer: 42,\n        InvalidBackendResponse: 43,\n        FailedToFixDepricatedValues: 44,\n        InvalidDurationValue: 45,\n        TelemetryEnvelopeInvalid: 46,\n        CreateEnvelopeError: 47,\n        // User actionable\n        CannotSerializeObject: 48,\n        CannotSerializeObjectNonSerializable: 49,\n        CircularReferenceDetected: 50,\n        ClearAuthContextFailed: 51,\n        ExceptionTruncated: 52,\n        IllegalCharsInName: 53,\n        ItemNotInArray: 54,\n        MaxAjaxPerPVExceeded: 55,\n        MessageTruncated: 56,\n        NameTooLong: 57,\n        SampleRateOutOfRange: 58,\n        SetAuthContextFailed: 59,\n        SetAuthContextFailedAccountName: 60,\n        StringValueTooLong: 61,\n        StartCalledMoreThanOnce: 62,\n        StopCalledWithoutStart: 63,\n        TelemetryInitializerFailed: 64,\n        TrackArgumentsNotSpecified: 65,\n        UrlTooLong: 66,\n        SessionStorageBufferFull: 67,\n        CannotAccessCookie: 68,\n        IdTooLong: 69,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=LoggingEnums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = 100;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=IChannelControls.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventsDiscardedReason_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var AppInsightsCore = /** @class */ (function () {\n        function AppInsightsCore() {\n            this._isInitialized = false;\n            this._extensions = new Array();\n            this._channelController = new ChannelController();\n        }\n        AppInsightsCore.prototype.initialize = function (config, extensions) {\n            var _this = this;\n            // Make sure core is only initialized once\n            if (this._isInitialized) {\n                throw Error(\"Core should not be initialized more than once\");\n            }\n            if (!config || CoreUtils_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                throw Error(\"Please provide instrumentation key\");\n            }\n            this.config = config;\n            this._notificationManager = new NotificationManager_1.NotificationManager();\n            this.config.extensions = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensions) ? [] : this.config.extensions;\n            // add notification to the extensions in the config so other plugins can access it\n            this.config.extensionConfig = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensionConfig) ? {} : this.config.extensionConfig;\n            this.config.extensionConfig.NotificationManager = this._notificationManager;\n            this.logger = new DiagnosticLogger_1.DiagnosticLogger(config);\n            // Initial validation\n            extensions.forEach(function (extension) {\n                if (CoreUtils_1.CoreUtils.isNullOrUndefined(extension.initialize)) {\n                    throw Error(validationError);\n                }\n            });\n            if (this.config.extensions.length > 0) {\n                var isValid_1 = true;\n                this.config.extensions.forEach(function (item) {\n                    if (CoreUtils_1.CoreUtils.isNullOrUndefined(item)) {\n                        isValid_1 = false;\n                    }\n                });\n                if (!isValid_1) {\n                    throw Error(validationError);\n                }\n            }\n            // Initial validation complete\n            // Concat all available extensions before sorting by priority\n            (_a = this._extensions).push.apply(_a, [this._channelController].concat(extensions, this.config.extensions));\n            this._extensions = this._extensions.sort(function (a, b) {\n                var extA = a;\n                var extB = b;\n                var typeExtA = typeof extA.processTelemetry;\n                var typeExtB = typeof extB.processTelemetry;\n                if (typeExtA === 'function' && typeExtB === 'function') {\n                    return extA.priority - extB.priority;\n                }\n                if (typeExtA === 'function' && typeExtB !== 'function') {\n                    // keep non telemetryplugin specific extensions at start\n                    return 1;\n                }\n                if (typeExtA !== 'function' && typeExtB === 'function') {\n                    return -1;\n                }\n            });\n            // sort complete\n            // Check if any two extensions have the same priority, then warn to console\n            var priority = {};\n            this._extensions.forEach(function (ext) {\n                var t = ext;\n                if (t && t.priority) {\n                    if (!CoreUtils_1.CoreUtils.isNullOrUndefined(priority[t.priority])) {\n                        _this.logger.warnToConsole(\"Two extensions have same priority\" + priority[t.priority] + \", \" + t.identifier);\n                    }\n                    else {\n                        priority[t.priority] = t.identifier; // set a value\n                    }\n                }\n            });\n            // initialize plugins including channel controller\n            this._extensions.forEach(function (ext) {\n                var e = ext;\n                if (e && e.priority <= ChannelControllerPriority) {\n                    ext.initialize(_this.config, _this, _this._extensions); // initialize\n                }\n            });\n            var c = -1;\n            // Set next plugin for all until channel controller\n            for (var idx = 0; idx < this._extensions.length - 1; idx++) {\n                var curr = (this._extensions[idx]);\n                if (curr && typeof curr.processTelemetry !== 'function') {\n                    // these are initialized only, allowing an entry point for extensions to be initialized when SDK initializes\n                    continue;\n                }\n                if (curr.priority === ChannelControllerPriority) {\n                    c = idx + 1;\n                    break; // channel controller will set remaining pipeline\n                }\n                this._extensions[idx].setNextPlugin(this._extensions[idx + 1]); // set next plugin\n            }\n            // Remove sender channels from main list\n            if (c < this._extensions.length) {\n                this._extensions.splice(c);\n            }\n            if (this.getTransmissionControls().length === 0) {\n                throw new Error(\"No channels available\");\n            }\n            this._isInitialized = true;\n            var _a;\n        };\n        AppInsightsCore.prototype.getTransmissionControls = function () {\n            return this._channelController.ChannelControls;\n        };\n        AppInsightsCore.prototype.track = function (telemetryItem) {\n            if (telemetryItem === null) {\n                this._notifiyInvalidEvent(telemetryItem);\n                // throw error\n                throw Error(\"Invalid telemetry item\");\n            }\n            if (telemetryItem.baseData && !telemetryItem.baseType) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"Provide data.baseType for data.baseData\");\n            }\n            if (!telemetryItem.baseType) {\n                // Hard coded from Common::Event.ts::Event.dataType\n                telemetryItem.baseType = \"EventData\";\n            }\n            if (!telemetryItem.instrumentationKey) {\n                // setup default ikey if not passed in\n                telemetryItem.instrumentationKey = this.config.instrumentationKey;\n            }\n            if (!telemetryItem.timestamp) {\n                // add default timestamp if not passed in\n                telemetryItem.timestamp = new Date();\n            }\n            // do basic validation before sending it through the pipeline\n            this._validateTelmetryItem(telemetryItem);\n            // invoke any common telemetry processors before sending through pipeline\n            var i = 0;\n            while (i < this._extensions.length) {\n                if (this._extensions[i].processTelemetry) {\n                    this._extensions[i].processTelemetry(telemetryItem); // pass on to first extension that can support processing\n                    break;\n                }\n                i++;\n            }\n        };\n        /**\n         * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n         * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n         * called.\n         * @param {INotificationListener} listener - An INotificationListener object.\n         */\n        AppInsightsCore.prototype.addNotificationListener = function (listener) {\n            this._notificationManager.addNotificationListener(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - INotificationListener to remove.\n         */\n        AppInsightsCore.prototype.removeNotificationListener = function (listener) {\n            this._notificationManager.removeNotificationListener(listener);\n        };\n        /**\n         * Periodically check logger.queue for\n         */\n        AppInsightsCore.prototype.pollInternalLogs = function () {\n            var _this = this;\n            if (!(this.config.diagnosticLoggingInterval > 0)) {\n                throw Error(\"config.diagnosticLoggingInterval must be a positive integer\");\n            }\n            return setInterval(function () {\n                var queue = _this.logger.queue;\n                queue.forEach(function (logMessage) {\n                    var item = {\n                        name: \"InternalMessageId: \" + logMessage.messageId,\n                        instrumentationKey: _this.config.instrumentationKey,\n                        timestamp: new Date(),\n                        baseType: DiagnosticLogger_1._InternalLogMessage.dataType,\n                        baseData: { message: logMessage.message }\n                    };\n                    _this.track(item);\n                });\n                queue.length = 0;\n            }, this.config.diagnosticLoggingInterval);\n        };\n        AppInsightsCore.prototype._validateTelmetryItem = function (telemetryItem) {\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.name)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry name required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.timestamp)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry timestamp required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.instrumentationKey)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry instrumentationKey required\");\n            }\n        };\n        AppInsightsCore.prototype._notifiyInvalidEvent = function (telemetryItem) {\n            this._notificationManager.eventsDiscarded([telemetryItem], EventsDiscardedReason_1.EventsDiscardedReason.InvalidEvent);\n        };\n        return AppInsightsCore;\n    }());\n    exports.AppInsightsCore = AppInsightsCore;\n    var ChannelController = /** @class */ (function () {\n        function ChannelController() {\n            this.identifier = \"ChannelControllerPlugin\";\n            this.priority = ChannelControllerPriority; // in reserved range 100 to 200\n        }\n        ChannelController.prototype.processTelemetry = function (item) {\n            this.channelQueue.forEach(function (queues) {\n                // pass on to first item in queue\n                if (queues.length > 0) {\n                    queues[0].processTelemetry(item);\n                }\n            });\n        };\n        Object.defineProperty(ChannelController.prototype, \"ChannelControls\", {\n            get: function () {\n                return this.channelQueue;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        ChannelController.prototype.initialize = function (config, core, extensions) {\n            var _this = this;\n            this.channelQueue = new Array();\n            if (config.channels) {\n                config.channels.forEach(function (queue) {\n                    if (queue && queue.length > 0) {\n                        queue = queue.sort(function (a, b) {\n                            return a.priority - b.priority;\n                        });\n                        // Initialize each plugin\n                        queue.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                        for (var i = 1; i < queue.length; i++) {\n                            queue[i - 1].setNextPlugin(queue[i]); // setup processing chain\n                        }\n                        _this.channelQueue.push(queue);\n                    }\n                });\n            }\n            else {\n                var arr = new Array();\n                for (var i = 0; i < extensions.length; i++) {\n                    var plugin = extensions[i];\n                    if (plugin.priority > ChannelControllerPriority) {\n                        arr.push(plugin);\n                    }\n                }\n                if (arr.length > 0) {\n                    // sort if not sorted\n                    arr = arr.sort(function (a, b) {\n                        return a.priority - b.priority;\n                    });\n                    // Initialize each plugin\n                    arr.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                    // setup next plugin\n                    for (var i = 1; i < arr.length; i++) {\n                        arr[i - 1].setNextPlugin(arr[i]);\n                    }\n                    this.channelQueue.push(arr);\n                }\n            }\n        };\n        return ChannelController;\n    }());\n    var validationError = \"Extensions must provide callback to initialize\";\n    var ChannelControllerPriority = 200;\n    var duplicatePriority = \"One or more extensions are set at same priority\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=AppInsightsCore.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var CoreUtils = /** @class */ (function () {\n        function CoreUtils() {\n        }\n        CoreUtils.isNullOrUndefined = function (input) {\n            return input === null || input === undefined;\n        };\n        /**\n    * Creates a new GUID.\n    * @return {string} A GUID.\n    */\n        CoreUtils.newGuid = function () {\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(GuidRegex, function (c) {\n                var r = (Math.random() * 16 | 0), v = (c === 'x' ? r : r & 0x3 | 0x8);\n                return v.toString(16);\n            });\n        };\n        return CoreUtils;\n    }());\n    exports.CoreUtils = CoreUtils;\n    var GuidRegex = /[xy]/g;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=CoreUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\":\n/*!*******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js ***!\n  \\*******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, LoggingEnums_1, CoreUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var _InternalLogMessage = /** @class */ (function () {\n        function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            this.messageId = msgId;\n            this.message =\n                (isUserAct ? _InternalLogMessage.AiUserActionablePrefix : _InternalLogMessage.AiNonUserActionablePrefix) +\n                    msgId;\n            var diagnosticText = (msg ? \" message:\" + _InternalLogMessage.sanitizeDiagnosticText(msg) : \"\") +\n                (properties ? \" props:\" + _InternalLogMessage.sanitizeDiagnosticText(JSON.stringify(properties)) : \"\");\n            this.message += diagnosticText;\n        }\n        _InternalLogMessage.sanitizeDiagnosticText = function (text) {\n            return \"\\\"\" + text.replace(/\\\"/g, \"\") + \"\\\"\";\n        };\n        _InternalLogMessage.dataType = \"MessageData\";\n        /**\n         * For user non actionable traces use AI Internal prefix.\n         */\n        _InternalLogMessage.AiNonUserActionablePrefix = \"AI (Internal): \";\n        /**\n         * Prefix of the traces in portal.\n         */\n        _InternalLogMessage.AiUserActionablePrefix = \"AI: \";\n        return _InternalLogMessage;\n    }());\n    exports._InternalLogMessage = _InternalLogMessage;\n    var DiagnosticLogger = /** @class */ (function () {\n        function DiagnosticLogger(config) {\n            /**\n            *  Session storage key for the prefix for the key indicating message type already logged\n            */\n            this.AIInternalMessagePrefix = \"AITR_\";\n            /**\n             * When this is true the SDK will throw exceptions to aid in debugging.\n             */\n            this.enableDebugExceptions = function () { return false; };\n            /**\n             * 0: OFF\n             * 1: CRITICAL (default)\n             * 2: >= WARNING\n             */\n            this.consoleLoggingLevel = function () { return 1; };\n            /**\n             * 0: OFF (default)\n             * 1: CRITICAL\n             * 2: >= WARNING\n             */\n            this.telemetryLoggingLevel = function () { return 0; };\n            /**\n             * The maximum number of internal messages allowed to be sent per page view\n             */\n            this.maxInternalMessageLimit = function () { return 25; };\n            /**\n             * The internal logging queue\n             */\n            this.queue = [];\n            /**\n             * Count of internal messages sent\n             */\n            this._messageCount = 0;\n            /**\n             * Holds information about what message types were already logged to console or sent to server.\n             */\n            this._messageLogged = {};\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(config)) {\n                // TODO: Use default config\n                // config = AppInsightsCore.defaultConfig;\n                // For now, use defaults specified in DiagnosticLogger members;\n                return;\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelConsole)) {\n                this.consoleLoggingLevel = function () { return config.loggingLevelConsole; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelTelemetry)) {\n                this.telemetryLoggingLevel = function () { return config.loggingLevelTelemetry; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.maxMessageLimit)) {\n                this.maxInternalMessageLimit = function () { return config.maxMessageLimit; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.enableDebugExceptions)) {\n                this.enableDebugExceptions = function () { return config.enableDebugExceptions; };\n            }\n        }\n        /**\n         * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The log message.\n         */\n        DiagnosticLogger.prototype.throwInternal = function (severity, msgId, msg, properties, isUserAct) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n            if (this.enableDebugExceptions()) {\n                throw message;\n            }\n            else {\n                if (typeof (message) !== \"undefined\" && !!message) {\n                    if (typeof (message.message) !== \"undefined\") {\n                        if (isUserAct) {\n                            // check if this message type was already logged to console for this page view and if so, don't log it again\n                            var messageKey = +message.messageId;\n                            if (!this._messageLogged[messageKey] || this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                                this._messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            // don't log internal AI traces in the console, unless the verbose logging is enabled\n                            if (this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                            }\n                        }\n                        this.logInternalMessage(severity, message);\n                    }\n                }\n            }\n        };\n        /**\n         * This will write a warning to the console if possible\n         * @param message {string} - The warning message\n         */\n        DiagnosticLogger.prototype.warnToConsole = function (message) {\n            if (typeof console !== \"undefined\" && !!console) {\n                if (typeof console.warn === \"function\") {\n                    console.warn(message);\n                }\n                else if (typeof console.log === \"function\") {\n                    console.log(message);\n                }\n            }\n        };\n        /**\n         * Resets the internal message count\n         */\n        DiagnosticLogger.prototype.resetInternalMessageCount = function () {\n            this._messageCount = 0;\n            this._messageLogged = {};\n        };\n        /**\n         * Logs a message to the internal queue.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The message to log.\n         */\n        DiagnosticLogger.prototype.logInternalMessage = function (severity, message) {\n            if (this._areInternalMessagesThrottled()) {\n                return;\n            }\n            // check if this message type was already logged for this session and if so, don't log it again\n            var logMessage = true;\n            var messageKey = this.AIInternalMessagePrefix + message.messageId;\n            // if the session storage is not available, limit to only one message type per page view\n            if (this._messageLogged[messageKey]) {\n                logMessage = false;\n            }\n            else {\n                this._messageLogged[messageKey] = true;\n            }\n            if (logMessage) {\n                // Push the event in the internal queue\n                if (severity <= this.telemetryLoggingLevel()) {\n                    this.queue.push(message);\n                    this._messageCount++;\n                }\n                // When throttle limit reached, send a special event\n                if (this._messageCount == this.maxInternalMessageLimit()) {\n                    var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                    var throttleMessage = new _InternalLogMessage(LoggingEnums_1._InternalMessageId.MessageLimitPerPVExceeded, throttleLimitMessage, false);\n                    this.queue.push(throttleMessage);\n                    this.warnToConsole(throttleLimitMessage);\n                }\n            }\n        };\n        /**\n         * Indicates whether the internal events are throttled\n         */\n        DiagnosticLogger.prototype._areInternalMessagesThrottled = function () {\n            return this._messageCount >= this.maxInternalMessageLimit();\n        };\n        return DiagnosticLogger;\n    }());\n    exports.DiagnosticLogger = DiagnosticLogger;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DiagnosticLogger.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Class to manage sending notifications to all the listeners.\n     */\n    var NotificationManager = /** @class */ (function () {\n        function NotificationManager() {\n            this.listeners = [];\n        }\n        /**\n         * Adds a notification listener.\n         * @param {INotificationListener} listener - The notification listener to be added.\n         */\n        NotificationManager.prototype.addNotificationListener = function (listener) {\n            this.listeners.push(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - AWTNotificationListener to remove.\n         */\n        NotificationManager.prototype.removeNotificationListener = function (listener) {\n            var index = this.listeners.indexOf(listener);\n            while (index > -1) {\n                this.listeners.splice(index, 1);\n                index = this.listeners.indexOf(listener);\n            }\n        };\n        /**\n         * Notification for events sent.\n         * @param {ITelemetryItem[]} events - The array of events that have been sent.\n         */\n        NotificationManager.prototype.eventsSent = function (events) {\n            var _this = this;\n            var _loop_1 = function (i) {\n                if (this_1.listeners[i].eventsSent) {\n                    setTimeout(function () { return _this.listeners[i].eventsSent(events); }, 0);\n                }\n            };\n            var this_1 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_1(i);\n            }\n        };\n        /**\n         * Notification for events being discarded.\n         * @param {ITelemetryItem[]} events - The array of events that have been discarded by the SDK.\n         * @param {number} reason           - The reason for which the SDK discarded the events. The EventsDiscardedReason\n         * constant should be used to check the different values.\n         */\n        NotificationManager.prototype.eventsDiscarded = function (events, reason) {\n            var _this = this;\n            var _loop_2 = function (i) {\n                if (this_2.listeners[i].eventsDiscarded) {\n                    setTimeout(function () { return _this.listeners[i].eventsDiscarded(events, reason); }, 0);\n                }\n            };\n            var this_2 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_2(i);\n            }\n        };\n        return NotificationManager;\n    }());\n    exports.NotificationManager = NotificationManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=NotificationManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\":\n/*!****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js ***!\n  \\****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK.Interfaces/IChannelControls */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./JavaScriptSDK/AppInsightsCore */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\"), __webpack_require__(/*! ./JavaScriptSDK/CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./JavaScriptSDK/NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./JavaScriptSDK/DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, IChannelControls_1, EventsDiscardedReason_1, AppInsightsCore_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1, LoggingEnums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = IChannelControls_1.MinChannelPriorty;\n    exports.EventsDiscardedReason = EventsDiscardedReason_1.EventsDiscardedReason;\n    exports.AppInsightsCore = AppInsightsCore_1.AppInsightsCore;\n    exports.CoreUtils = CoreUtils_1.CoreUtils;\n    exports.NotificationManager = NotificationManager_1.NotificationManager;\n    exports.DiagnosticLogger = DiagnosticLogger_1.DiagnosticLogger;\n    exports._InternalLogMessage = DiagnosticLogger_1._InternalLogMessage;\n    exports._InternalMessageId = LoggingEnums_1._InternalMessageId;\n    exports.LoggingSeverity = LoggingEnums_1.LoggingSeverity;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-core-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\":\n/*!*************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajax.js ***!\n  \\*************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./ajaxRecord */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\"), __webpack_require__(/*! ./ajaxUtils */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, ajaxRecord_1, ajaxUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var AjaxMonitor = /** @class */ (function () {\n        function AjaxMonitor() {\n            this._trackAjaxAttempts = 0;\n            this.identifier = \"AjaxDependencyPlugin\";\n            this.priority = 161;\n            this.currentWindowHost = window && window.location.host && window.location.host.toLowerCase();\n            this.initialized = false;\n        }\n        ///<summary>Verifies that particalar instance of XMLHttpRequest needs to be monitored</summary>\n        ///<param name=\"excludeAjaxDataValidation\">Optional parameter. True if ajaxData must be excluded from verification</param>\n        ///<returns type=\"bool\">True if instance needs to be monitored, otherwise false</returns>\n        AjaxMonitor.prototype.isMonitoredInstance = function (xhr, excludeAjaxDataValidation) {\n            // checking to see that all interested functions on xhr were instrumented\n            return this.initialized\n                // checking on ajaxData to see that it was not removed in user code\n                && (excludeAjaxDataValidation === true || !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData))\n                // check that this instance is not not used by ajax call performed inside client side monitoring to send data to collector\n                && xhr[applicationinsights_common_1.DisabledPropertyName] !== true;\n        };\n        ///<summary>Determines whether ajax monitoring can be enabled on this document</summary>\n        ///<returns>True if Ajax monitoring is supported on this page, otherwise false</returns>\n        AjaxMonitor.prototype.supportsMonitoring = function () {\n            var result = true;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.open) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.send) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.abort)) {\n                result = false;\n            }\n            // disable in IE8 or older (https://www.w3schools.com/jsref/jsref_trim_string.asp)\n            try {\n                \" a \".trim();\n            }\n            catch (ex) {\n                result = false;\n            }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentOpen = function () {\n            var originalOpen = XMLHttpRequest.prototype.open;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.open = function (method, url, async) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this, true) &&\n                        (!this.ajaxData ||\n                            !this.ajaxData.xhrMonitoringState.openDone)) {\n                        ajaxMonitorInstance.openHandler(this, method, url, async);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxOpen, \"Failed to monitor XMLHttpRequest.open, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalOpen.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.openHandler = function (xhr, method, url, async) {\n            /* todo:\n            Disabling the following block of code as CV is not yet supported in 1DS for 3rd Part.\n            // this format corresponds with activity logic on server-side and is required for the correct correlation\n            var id = \"|\" + this.appInsights.context.operation.id + \".\" + Util.newId();\n            */\n            var id = applicationinsights_common_1.Util.newId();\n            var ajaxData = new ajaxRecord_1.ajaxRecord(id, this._core._logger);\n            ajaxData.method = method;\n            ajaxData.requestUrl = url;\n            ajaxData.xhrMonitoringState.openDone = true;\n            xhr.ajaxData = ajaxData;\n            this.attachToOnReadyStateChange(xhr);\n        };\n        AjaxMonitor.getFailedAjaxDiagnosticsMessage = function (xhr) {\n            var result = \"\";\n            try {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData.requestUrl)) {\n                    result += \"(url: '\" + xhr.ajaxData.requestUrl + \"')\";\n                }\n            }\n            catch (e) { }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentSend = function () {\n            var originalSend = XMLHttpRequest.prototype.send;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.send = function (content) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.sendDone) {\n                        ajaxMonitorInstance.sendHandler(this, content);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxSend, \"Failed to monitor XMLHttpRequest, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalSend.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.sendHandler = function (xhr, content) {\n            xhr.ajaxData.requestSentTime = applicationinsights_common_1.DateTimeUtils.Now();\n            if (this.currentWindowHost && applicationinsights_common_1.CorrelationIdHelper.canIncludeCorrelationHeader(this._config, xhr.ajaxData.getAbsoluteUrl(), this.currentWindowHost)) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestIdHeader, xhr.ajaxData.id);\n                var appId = this._config.appId; // Todo: also, get appId from channel as breeze returns it\n                if (appId) {\n                    xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader, applicationinsights_common_1.RequestHeaders.requestContextAppIdFormat + appId);\n                }\n            }\n            xhr.ajaxData.xhrMonitoringState.sendDone = true;\n        };\n        AjaxMonitor.prototype.instrumentAbort = function () {\n            var originalAbort = XMLHttpRequest.prototype.abort;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.abort = function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.abortDone) {\n                        this.ajaxData.aborted = 1;\n                        this.ajaxData.xhrMonitoringState.abortDone = true;\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxAbort, \"Failed to monitor XMLHttpRequest.abort, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalAbort.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.attachToOnReadyStateChange = function (xhr) {\n            var _this = this;\n            var ajaxMonitorInstance = this;\n            xhr.ajaxData.xhrMonitoringState.onreadystatechangeCallbackAttached = ajaxUtils_1.EventHelper.AttachEvent(xhr, \"readystatechange\", function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(xhr)) {\n                        if (xhr.readyState === 4) {\n                            ajaxMonitorInstance.onAjaxComplete(xhr);\n                        }\n                    }\n                }\n                catch (e) {\n                    var exceptionText = applicationinsights_common_1.Util.dump(e);\n                    // ignore messages with c00c023f, as this a known IE9 XHR abort issue\n                    if (!exceptionText || exceptionText.toLowerCase().indexOf(\"c00c023f\") == -1) {\n                        _this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxRSC, \"Failed to monitor XMLHttpRequest 'readystatechange' event handler, monitoring data for this ajax call may be incorrect.\", {\n                            ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                            exception: applicationinsights_common_1.Util.dump(e)\n                        });\n                    }\n                }\n            });\n        };\n        AjaxMonitor.prototype.onAjaxComplete = function (xhr) {\n            xhr.ajaxData.responseFinishedTime = applicationinsights_common_1.DateTimeUtils.Now();\n            xhr.ajaxData.status = xhr.status;\n            xhr.ajaxData.CalculateMetrics();\n            if (xhr.ajaxData.ajaxTotalDuration < 0) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxDur, \"Failed to calculate the duration of the ajax call, monitoring data for this ajax call won't be sent.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    requestSentTime: xhr.ajaxData.requestSentTime,\n                    responseFinishedTime: xhr.ajaxData.responseFinishedTime\n                });\n            }\n            else {\n                var dependency = {\n                    id: xhr.ajaxData.id,\n                    absoluteUrl: xhr.ajaxData.getAbsoluteUrl(),\n                    commandName: xhr.ajaxData.getPathName(),\n                    duration: xhr.ajaxData.ajaxTotalDuration,\n                    success: (+(xhr.ajaxData.status)) >= 200 && (+(xhr.ajaxData.status)) < 400,\n                    resultCode: +xhr.ajaxData.status,\n                    method: xhr.ajaxData.method\n                };\n                // enrich dependency target with correlation context from the server\n                var correlationContext = this.getCorrelationContext(xhr);\n                if (correlationContext) {\n                    dependency.correlationContext = /* dependency.target + \" | \" + */ correlationContext;\n                }\n                this.trackDependencyData(dependency);\n                xhr.ajaxData = null;\n            }\n        };\n        AjaxMonitor.prototype.getCorrelationContext = function (xhr) {\n            try {\n                var responseHeadersString = xhr.getAllResponseHeaders();\n                if (responseHeadersString !== null) {\n                    var index = responseHeadersString.toLowerCase().indexOf(applicationinsights_common_1.RequestHeaders.requestContextHeaderLowerCase);\n                    if (index !== -1) {\n                        var responseHeader = xhr.getResponseHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader);\n                        return applicationinsights_common_1.CorrelationIdHelper.getCorrelationContext(responseHeader);\n                    }\n                }\n            }\n            catch (e) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxGetCorrelationHeader, \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    exception: applicationinsights_common_1.Util.dump(e)\n                });\n            }\n        };\n        /**\n            * Logs dependency call\n            * @param dependencyData dependency data object\n            */\n        AjaxMonitor.prototype.trackDependencyData = function (dependency, properties, systemProperties) {\n            if (this._config.maxAjaxCallsPerView === -1 || this._trackAjaxAttempts < this._config.maxAjaxCallsPerView) {\n                var item = applicationinsights_common_1.TelemetryItemCreator.create(dependency, applicationinsights_common_1.RemoteDependencyData.dataType, applicationinsights_common_1.RemoteDependencyData.envelopeType, this._core._logger, properties, systemProperties);\n                this._core.track(item);\n            }\n            else if (this._trackAjaxAttempts === this._config.maxAjaxCallsPerView) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MaxAjaxPerPVExceeded, \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n            }\n            ++this._trackAjaxAttempts;\n        };\n        AjaxMonitor.prototype.processTelemetry = function (item) {\n            if (this._nextPlugin && this._nextPlugin.processTelemetry) {\n                this._nextPlugin.processTelemetry(item);\n            }\n        };\n        AjaxMonitor.prototype.setNextPlugin = function (next) {\n            if (next) {\n                this._nextPlugin = next;\n            }\n        };\n        AjaxMonitor.prototype.initialize = function (config, core, extensions) {\n            if (!this.initialized) {\n                this._core = core;\n                config.extensionConfig = config.extensionConfig ? config.extensionConfig : {};\n                var c = config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n                this._config = {\n                    maxAjaxCallsPerView: !isNaN(c.maxAjaxCallsPerView) ? c.maxAjaxCallsPerView : 500,\n                    disableAjaxTracking: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableAjaxTracking),\n                    disableCorrelationHeaders: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableCorrelationHeaders),\n                    correlationHeaderExcludedDomains: c.correlationHeaderExcludedDomains || [\n                        \"*.blob.core.windows.net\",\n                        \"*.blob.core.chinacloudapi.cn\",\n                        \"*.blob.core.cloudapi.de\",\n                        \"*.blob.core.usgovcloudapi.net\"\n                    ],\n                    appId: c.appId,\n                    enableCorsCorrelation: applicationinsights_common_1.Util.stringToBoolOrDefault(c.enableCorsCorrelation)\n                };\n                if (this.supportsMonitoring() && !this._config.disableAjaxTracking) {\n                    this.instrumentOpen();\n                    this.instrumentSend();\n                    this.instrumentAbort();\n                    this.initialized = true;\n                }\n            }\n        };\n        return AjaxMonitor;\n    }());\n    exports.AjaxMonitor = AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajax.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var XHRMonitoringState = /** @class */ (function () {\n        function XHRMonitoringState() {\n            this.openDone = false;\n            this.setRequestHeaderDone = false;\n            this.sendDone = false;\n            this.abortDone = false;\n            //<summary>True, if onreadyStateChangeCallback function attached to xhr, otherwise false</summary>\n            this.onreadystatechangeCallbackAttached = false;\n        }\n        return XHRMonitoringState;\n    }());\n    exports.XHRMonitoringState = XHRMonitoringState;\n    var ajaxRecord = /** @class */ (function () {\n        function ajaxRecord(id, logger) {\n            this.completed = false;\n            this.requestHeadersSize = null;\n            this.ttfb = null;\n            this.responseReceivingDuration = null;\n            this.callbackDuration = null;\n            this.ajaxTotalDuration = null;\n            this.aborted = null;\n            this.pageUrl = null;\n            this.requestUrl = null;\n            this.requestSize = 0;\n            this.method = null;\n            ///<summary>Returns the HTTP status code.</summary>\n            this.status = null;\n            //<summary>The timestamp when open method was invoked</summary>\n            this.requestSentTime = null;\n            //<summary>The timestamps when first byte was received</summary>\n            this.responseStartedTime = null;\n            //<summary>The timestamp when last byte was received</summary>\n            this.responseFinishedTime = null;\n            //<summary>The timestamp when onreadystatechange callback in readyState 4 finished</summary>\n            this.callbackFinishedTime = null;\n            //<summary>The timestamp at which ajax was ended</summary>\n            this.endTime = null;\n            //<summary>The original xhr onreadystatechange event</summary>\n            this.originalOnreadystatechage = null;\n            this.xhrMonitoringState = new XHRMonitoringState();\n            //<summary>Determines whether or not JavaScript exception occured in xhr.onreadystatechange code. 1 if occured, otherwise 0.</summary>\n            this.clientFailure = 0;\n            this.CalculateMetrics = function () {\n                var self = this;\n                // round to 3 decimal points\n                self.ajaxTotalDuration = Math.round(applicationinsights_common_1.DateTimeUtils.GetDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n            };\n            this.id = id;\n            this._logger = logger;\n        }\n        ajaxRecord.prototype.getAbsoluteUrl = function () {\n            return this.requestUrl ? applicationinsights_common_1.UrlHelper.getAbsoluteUrl(this.requestUrl) : null;\n        };\n        ajaxRecord.prototype.getPathName = function () {\n            return this.requestUrl ? applicationinsights_common_1.DataSanitizer.sanitizeUrl(this._logger, applicationinsights_common_1.UrlHelper.getCompleteUrl(this.method, this.requestUrl)) : null;\n        };\n        return ajaxRecord;\n    }());\n    exports.ajaxRecord = ajaxRecord;\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxRecord.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var stringUtils = /** @class */ (function () {\n        function stringUtils() {\n        }\n        stringUtils.GetLength = function (strObject) {\n            var res = 0;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(strObject)) {\n                var stringified = \"\";\n                try {\n                    stringified = strObject.toString();\n                }\n                catch (ex) {\n                    // some troubles with complex object\n                }\n                res = stringified.length;\n                res = isNaN(res) ? 0 : res;\n            }\n            return res;\n        };\n        return stringUtils;\n    }());\n    exports.stringUtils = stringUtils;\n    var EventHelper = /** @class */ (function () {\n        function EventHelper() {\n        }\n        ///<summary>Binds the specified function to an event, so that the function gets called whenever the event fires on the object</summary>\n        ///<param name=\"obj\">Object to which </param>\n        ///<param name=\"eventNameWithoutOn\">String that specifies any of the standard DHTML Events without \"on\" prefix</param>\n        ///<param name=\"handlerRef\">Pointer that specifies the function to call when event fires</param>\n        ///<returns>True if the function was bound successfully to the event, otherwise false</returns>\n        EventHelper.AttachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            var result = false;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.attachEvent)) {\n                    // IE before version 9                    \n                    obj.attachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                    result = true;\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.addEventListener)) {\n                        // all browsers except IE before version 9\n                        obj.addEventListener(eventNameWithoutOn, handlerRef, false);\n                        result = true;\n                    }\n                }\n            }\n            return result;\n        };\n        EventHelper.DetachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.detachEvent)) {\n                    obj.detachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.removeEventListener)) {\n                        obj.removeEventListener(eventNameWithoutOn, handlerRef, false);\n                    }\n                }\n            }\n        };\n        return EventHelper;\n    }());\n    exports.EventHelper = EventHelper;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./ajax */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ajax_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.AjaxPlugin = ajax_1.AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-dependencies-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Application.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Application = /** @class */ (function () {\n        function Application() {\n        }\n        return Application;\n    }());\n    exports.Application = Application;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Application.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Device.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Device = /** @class */ (function () {\n        /**\n         * Constructs a new instance of the Device class\n         */\n        function Device() {\n            // don't attempt to fingerprint browsers\n            this.id = \"browser\";\n            // Device type is a dimension in our data platform\n            // Setting it to 'Browser' allows to separate client and server dependencies/exceptions\n            this.type = \"Browser\";\n        }\n        return Device;\n    }());\n    exports.Device = Device;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Device.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Version = \"2.0.1-beta\";\n    var Internal = /** @class */ (function () {\n        /**\n        * Constructs a new instance of the internal telemetry data class.\n        */\n        function Internal(config) {\n            this.sdkVersion = (config.sdkExtension && config.sdkExtension() ? config.sdkExtension() + \"_\" : \"\") + \"javascript:\" + Version;\n        }\n        return Internal;\n    }());\n    exports.Internal = Internal;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Internal.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Location.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Location = /** @class */ (function () {\n        function Location() {\n        }\n        return Location;\n    }());\n    exports.Location = Location;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Location.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Operation = /** @class */ (function () {\n        function Operation() {\n            this.id = applicationinsights_common_1.Util.newId();\n            if (window && window.location && window.location.pathname) {\n                this.name = window.location.pathname;\n            }\n        }\n        return Operation;\n    }());\n    exports.Operation = Operation;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Operation.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../SamplingScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SamplingScoreGenerator_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sample = /** @class */ (function () {\n        function Sample(sampleRate, logger) {\n            // We're using 32 bit math, hence max value is (2^31 - 1)\n            this.INT_MAX_VALUE = 2147483647;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (sampleRate > 100 || sampleRate < 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SampleRateOutOfRange, \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n                this.sampleRate = 100;\n            }\n            this.sampleRate = sampleRate;\n            this.samplingScoreGenerator = new SamplingScoreGenerator_1.SamplingScoreGenerator();\n        }\n        /**\n        * Determines if an envelope is sampled in (i.e. will be sent) or not (i.e. will be dropped).\n        */\n        Sample.prototype.isSampledIn = function (envelope) {\n            // return true as sampling will move to different extension\n            return true;\n        };\n        return Sample;\n    }());\n    exports.Sample = Sample;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sample.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Session.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Session = /** @class */ (function () {\n        function Session() {\n        }\n        return Session;\n    }());\n    exports.Session = Session;\n    var _SessionManager = /** @class */ (function () {\n        function _SessionManager(config, logger) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (!config) {\n                config = {};\n            }\n            if (!(typeof config.sessionExpirationMs === \"function\")) {\n                config.sessionExpirationMs = function () { return _SessionManager.acquisitionSpan; };\n            }\n            if (!(typeof config.sessionRenewalMs === \"function\")) {\n                config.sessionRenewalMs = function () { return _SessionManager.renewalSpan; };\n            }\n            this.config = config;\n            this.automaticSession = new Session();\n        }\n        _SessionManager.prototype.update = function () {\n            if (!this.automaticSession.id) {\n                this.initializeAutomaticSession();\n            }\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            var acquisitionExpired = now - this.automaticSession.acquisitionDate > this.config.sessionExpirationMs();\n            var renewalExpired = now - this.automaticSession.renewalDate > this.config.sessionRenewalMs();\n            // renew if acquisitionSpan or renewalSpan has ellapsed\n            if (acquisitionExpired || renewalExpired) {\n                // update automaticSession so session state has correct id                \n                this.automaticSession.isFirst = undefined;\n                this.renew();\n            }\n            else {\n                // do not update the cookie more often than cookieUpdateInterval\n                if (!this.cookieUpdatedTimestamp || now - this.cookieUpdatedTimestamp > _SessionManager.cookieUpdateInterval) {\n                    this.automaticSession.renewalDate = now;\n                    this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n                }\n            }\n        };\n        /**\n         *  Record the current state of the automatic session and store it in our cookie string format\n         *  into the browser's local storage. This is used to restore the session data when the cookie\n         *  expires.\n         */\n        _SessionManager.prototype.backup = function () {\n            this.setStorage(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n        };\n        /**\n         *  Use ai_session cookie data or local storage data (when the cookie is unavailable) to\n         *  initialize the automatic session.\n         */\n        _SessionManager.prototype.initializeAutomaticSession = function () {\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, 'ai_session');\n            if (cookie && typeof cookie.split === \"function\") {\n                this.initializeAutomaticSessionWithData(cookie);\n            }\n            else {\n                // There's no cookie, but we might have session data in local storage\n                // This can happen if the session expired or the user actively deleted the cookie\n                // We only want to recover data if the cookie is missing from expiry. We should respect the user's wishes if the cookie was deleted actively.\n                // The User class handles this for us and deletes our local storage object if the persistent user cookie was removed.\n                var storage = applicationinsights_common_1.Util.getStorage(this._logger, 'ai_session');\n                if (storage) {\n                    this.initializeAutomaticSessionWithData(storage);\n                }\n            }\n            if (!this.automaticSession.id) {\n                this.automaticSession.isFirst = true;\n                this.renew();\n            }\n        };\n        /**\n         *  Extract id, aquisitionDate, and renewalDate from an ai_session payload string and\n         *  use this data to initialize automaticSession.\n         *\n         *  @param {string} sessionData - The string stored in an ai_session cookie or local storage backup\n         */\n        _SessionManager.prototype.initializeAutomaticSessionWithData = function (sessionData) {\n            var params = sessionData.split(\"|\");\n            if (params.length > 0) {\n                this.automaticSession.id = params[0];\n            }\n            try {\n                if (params.length > 1) {\n                    var acq = +params[1];\n                    this.automaticSession.acquisitionDate = +new Date(acq);\n                    this.automaticSession.acquisitionDate = this.automaticSession.acquisitionDate > 0 ? this.automaticSession.acquisitionDate : 0;\n                }\n                if (params.length > 2) {\n                    var renewal = +params[2];\n                    this.automaticSession.renewalDate = +new Date(renewal);\n                    this.automaticSession.renewalDate = this.automaticSession.renewalDate > 0 ? this.automaticSession.renewalDate : 0;\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ErrorParsingAISessionCookie, \"Error parsing ai_session cookie, session will be reset: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            if (this.automaticSession.renewalDate == 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionRenewalDateIsZero, \"AI session renewal date is 0, session will be reset.\");\n            }\n        };\n        _SessionManager.prototype.renew = function () {\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            this.automaticSession.id = applicationinsights_common_1.Util.newId();\n            this.automaticSession.acquisitionDate = now;\n            this.automaticSession.renewalDate = now;\n            this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n            // If this browser does not support local storage, fire an internal log to keep track of it at this point\n            if (!applicationinsights_common_1.Util.canUseLocalStorage()) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserDoesNotSupportLocalStorage, \"Browser does not support local storage. Session durations will be inaccurate.\");\n            }\n        };\n        _SessionManager.prototype.setCookie = function (guid, acq, renewal) {\n            // Set cookie to expire after the session expiry time passes or the session renewal deadline, whichever is sooner\n            // Expiring the cookie will cause the session to expire even if the user isn't on the page\n            var acquisitionExpiry = acq + this.config.sessionExpirationMs();\n            var renewalExpiry = renewal + this.config.sessionRenewalMs();\n            var cookieExpiry = new Date();\n            var cookie = [guid, acq, renewal];\n            if (acquisitionExpiry < renewalExpiry) {\n                cookieExpiry.setTime(acquisitionExpiry);\n            }\n            else {\n                cookieExpiry.setTime(renewalExpiry);\n            }\n            var cookieDomnain = this.config.cookieDomain ? this.config.cookieDomain() : null;\n            applicationinsights_common_1.Util.setCookie(this._logger, 'ai_session', cookie.join('|') + ';expires=' + cookieExpiry.toUTCString(), cookieDomnain);\n            this.cookieUpdatedTimestamp = applicationinsights_common_1.DateTimeUtils.Now();\n        };\n        _SessionManager.prototype.setStorage = function (guid, acq, renewal) {\n            // Keep data in local storage to retain the last session id, allowing us to cleanly end the session when it expires\n            // Browsers that don't support local storage won't be able to end sessions cleanly from the client\n            // The server will notice this and end the sessions itself, with loss of accurate session duration\n            applicationinsights_common_1.Util.setStorage(this._logger, 'ai_session', [guid, acq, renewal].join('|'));\n        };\n        _SessionManager.acquisitionSpan = 86400000; // 24 hours in ms\n        _SessionManager.renewalSpan = 1800000; // 30 minutes in ms\n        _SessionManager.cookieUpdateInterval = 60000; // 1 minute in ms\n        return _SessionManager;\n    }());\n    exports._SessionManager = _SessionManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Session.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/User.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var User = /** @class */ (function () {\n        function User(config, logger) {\n            this._logger = logger;\n            //get userId or create new one if none exists\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, User.userCookieName);\n            if (cookie) {\n                var params = cookie.split(User.cookieSeparator);\n                if (params.length > 0) {\n                    this.id = params[0];\n                }\n            }\n            this.config = config;\n            if (!this.id) {\n                this.id = applicationinsights_common_1.Util.newId();\n                var date = new Date();\n                var acqStr = applicationinsights_common_1.Util.toISOStringForIE8(date);\n                this.accountAcquisitionDate = acqStr;\n                // without expiration, cookies expire at the end of the session\n                // set it to 365 days from now\n                // 365 * 24 * 60 * 60 * 1000 = 31536000000 \n                date.setTime(date.getTime() + 31536000000);\n                var newCookie = [this.id, acqStr];\n                var cookieDomain = this.config.cookieDomain ? this.config.cookieDomain() : undefined;\n                applicationinsights_common_1.Util.setCookie(this._logger, User.userCookieName, newCookie.join(User.cookieSeparator) + ';expires=' + date.toUTCString(), cookieDomain);\n                // If we have an ai_session in local storage this means the user actively removed our cookies.\n                // We should respect their wishes and clear ourselves from local storage\n                applicationinsights_common_1.Util.removeStorage(this._logger, 'ai_session');\n            }\n            // We still take the account id from the ctor param for backward compatibility. \n            // But if the the customer set the accountId through the newer setAuthenticatedUserContext API, we will override it.\n            this.accountId = config.accountId ? config.accountId() : undefined;\n            // Get the auth user id and account id from the cookie if exists\n            // Cookie is in the pattern: <authenticatedId>|<accountId>\n            var authCookie = applicationinsights_common_1.Util.getCookie(this._logger, User.authUserCookieName);\n            if (authCookie) {\n                authCookie = decodeURI(authCookie);\n                var authCookieString = authCookie.split(User.cookieSeparator);\n                if (authCookieString[0]) {\n                    this.authenticatedId = authCookieString[0];\n                }\n                if (authCookieString.length > 1 && authCookieString[1]) {\n                    this.accountId = authCookieString[1];\n                }\n            }\n        }\n        /**\n        * Sets the authenticated user id and the account id in this session.\n        *\n        * @param authenticatedUserId {string} - The authenticated user id. A unique and persistent string that represents each authenticated user in the service.\n        * @param accountId {string} - An optional string to represent the account associated with the authenticated user.\n        */\n        User.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            // Validate inputs to ensure no cookie control characters.\n            var isInvalidInput = !this.validateUserInput(authenticatedUserId) || (accountId && !this.validateUserInput(accountId));\n            if (isInvalidInput) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SetAuthContextFailedAccountName, \"Setting auth user context failed. \" +\n                    \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                return;\n            }\n            // Create cookie string.\n            this.authenticatedId = authenticatedUserId;\n            var authCookie = this.authenticatedId;\n            if (accountId) {\n                this.accountId = accountId;\n                authCookie = [this.authenticatedId, this.accountId].join(User.cookieSeparator);\n            }\n            if (storeInCookie) {\n                // Set the cookie. No expiration date because this is a session cookie (expires when browser closed).\n                // Encoding the cookie to handle unexpected unicode characters.\n                applicationinsights_common_1.Util.setCookie(this._logger, User.authUserCookieName, encodeURI(authCookie), this.config.cookieDomain());\n            }\n        };\n        /**\n         * Clears the authenticated user id and the account id from the user context.\n         * @returns {}\n         */\n        User.prototype.clearAuthenticatedUserContext = function () {\n            this.authenticatedId = null;\n            this.accountId = null;\n            applicationinsights_common_1.Util.deleteCookie(this._logger, User.authUserCookieName);\n        };\n        User.prototype.validateUserInput = function (id) {\n            // Validate:\n            // 1. Id is a non-empty string.\n            // 2. It does not contain special characters for cookies.\n            if (typeof id !== 'string' ||\n                !id ||\n                id.match(/,|;|=| |\\|/)) {\n                return false;\n            }\n            return true;\n        };\n        User.cookieSeparator = '|';\n        User.userCookieName = 'ai_user';\n        User.authUserCookieName = 'ai_authUser';\n        return User;\n    }());\n    exports.User = User;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=User.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var HashCodeScoreGenerator = /** @class */ (function () {\n        function HashCodeScoreGenerator() {\n        }\n        HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n            var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n            return score * 100;\n        };\n        HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n            if (input == \"\") {\n                return 0;\n            }\n            while (input.length < HashCodeScoreGenerator.MIN_INPUT_LENGTH) {\n                input = input.concat(input);\n            }\n            // 5381 is a magic number: http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function\n            var hash = 5381;\n            for (var i = 0; i < input.length; ++i) {\n                hash = ((hash << 5) + hash) + input.charCodeAt(i);\n                // 'hash' is of number type which means 53 bit integer (http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-number-type)\n                // 'hash & hash' will keep it 32 bit integer - just to make it clearer what the result is.\n                hash = hash & hash;\n            }\n            return Math.abs(hash);\n        };\n        // We're using 32 bit math, hence max value is (2^31 - 1)\n        HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n        // (Magic number) DJB algorithm can't work on shorter strings (results in poor distribution\n        HashCodeScoreGenerator.MIN_INPUT_LENGTH = 8;\n        return HashCodeScoreGenerator;\n    }());\n    exports.HashCodeScoreGenerator = HashCodeScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=HashCodeScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * PropertiesPlugin.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! ./Context/Session */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\"), __webpack_require__(/*! ./Context/Application */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\"), __webpack_require__(/*! ./Context/Device */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\"), __webpack_require__(/*! ./Context/Internal */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\"), __webpack_require__(/*! ./Context/Location */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\"), __webpack_require__(/*! ./Context/Operation */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\"), __webpack_require__(/*! ./Context/User */ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\"), __webpack_require__(/*! ./Context/Sample */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_common_1, Session_1, Application_1, Device_1, Internal_1, Location_1, Operation_1, User_1, Sample_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PropertiesPlugin = /** @class */ (function () {\n        function PropertiesPlugin() {\n            this.priority = 170;\n            this.identifier = \"AppInsightsPropertiesPlugin\";\n        }\n        PropertiesPlugin.prototype.initialize = function (config, core, extensions) {\n            var extensionConfig = config.extensions &&\n                config.extensions[this.identifier] ?\n                config.extensions[this.identifier] : {};\n            this._extensionConfig = {\n                instrumentationKey: function () { return extensionConfig.instrumentationKey; },\n                accountId: function () { return extensionConfig.accountId; },\n                sessionRenewalMs: function () { return extensionConfig.sessionRenewalMs; },\n                sampleRate: function () { return extensionConfig.sampleRate; },\n                sessionExpirationMs: function () { return extensionConfig.sessionExpirationMs; },\n                cookieDomain: function () { return extensionConfig.cookieDomain; },\n                sdkExtension: function () { return extensionConfig.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return extensionConfig.isBrowserLinkTrackingEnabled; },\n                appId: function () { return extensionConfig.appId; }\n            };\n            if (typeof window !== 'undefined') {\n                this._sessionManager = new Session_1._SessionManager(this._extensionConfig, core.logger);\n                this.application = new Application_1.Application();\n                this.device = new Device_1.Device();\n                this.internal = new Internal_1.Internal(this._extensionConfig);\n                this.location = new Location_1.Location();\n                this.user = new User_1.User(this._extensionConfig, core.logger);\n                this.operation = new Operation_1.Operation();\n                this.session = new Session_1.Session();\n                this.sample = new Sample_1.Sample(this._extensionConfig.sampleRate(), core.logger);\n            }\n        };\n        /**\n         * Add Part A fields to the event\n         * @param event The event that needs to be processed\n         */\n        PropertiesPlugin.prototype.processTelemetry = function (event) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(event)) {\n                // TODO(barustum): throw an internal event once we have support for internal logging\n            }\n            else {\n                // if the event is not sampled in, do not bother going through the pipeline\n                if (this.sample.isSampledIn(event)) {\n                    // If the envelope is PageView, reset the internal message count so that we can send internal telemetry for the new page.\n                    if (event.name === applicationinsights_common_1.PageView.envelopeType) {\n                        // TODO(barustum): resetInternalMessageCount once we have support for internal logging\n                        //_InternalLogging.resetInternalMessageCount();\n                    }\n                    if (this.session) {\n                        // If customer did not provide custom session id update the session manager\n                        if (typeof this.session.id !== \"string\") {\n                            this._sessionManager.update();\n                        }\n                    }\n                    this._processTelemetryInternal(event);\n                }\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                    this._nextPlugin.processTelemetry(event);\n                }\n            }\n        };\n        /**\n         * Sets the next plugin that comes after this plugin\n         * @param nextPlugin The next plugin\n         */\n        PropertiesPlugin.prototype.setNextPlugin = function (nextPlugin) {\n            this._nextPlugin = nextPlugin;\n        };\n        PropertiesPlugin.prototype._processTelemetryInternal = function (event) {\n            var tagsItem = {};\n            if (this.session) {\n                // If customer set id, apply his context; otherwise apply context generated from cookies \n                if (typeof this.session.id === \"string\") {\n                    PropertiesPlugin._applySessionContext(tagsItem, this.session);\n                }\n                else {\n                    PropertiesPlugin._applySessionContext(tagsItem, this._sessionManager.automaticSession);\n                }\n            }\n            // set part A  fields\n            PropertiesPlugin._applyApplicationContext(tagsItem, this.application);\n            PropertiesPlugin._applyDeviceContext(tagsItem, this.device);\n            PropertiesPlugin._applyInternalContext(tagsItem, this.internal);\n            PropertiesPlugin._applyLocationContext(tagsItem, this.location);\n            PropertiesPlugin._applySampleContext(tagsItem, this.sample);\n            PropertiesPlugin._applyUserContext(tagsItem, this.user);\n            PropertiesPlugin._applyOperationContext(tagsItem, this.operation);\n            event.tags.push(tagsItem);\n        };\n        PropertiesPlugin._applySessionContext = function (tags, sessionContext) {\n            if (sessionContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof sessionContext.id === \"string\") {\n                    tags[tagKeys.sessionId] = sessionContext.id;\n                }\n                if (typeof sessionContext.isFirst !== \"undefined\") {\n                    tags[tagKeys.sessionIsFirst] = sessionContext.isFirst;\n                }\n            }\n        };\n        PropertiesPlugin._applyApplicationContext = function (tagsItem, appContext) {\n            if (appContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof appContext.ver === \"string\") {\n                    tagsItem[tagKeys.applicationVersion] = appContext.ver;\n                }\n                if (typeof appContext.build === \"string\") {\n                    tagsItem[tagKeys.applicationBuild] = appContext.build;\n                }\n            }\n        };\n        PropertiesPlugin._applyDeviceContext = function (tagsItem, deviceContext) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            if (deviceContext) {\n                if (typeof deviceContext.id === \"string\") {\n                    tagsItem[tagKeys.deviceId] = deviceContext.id;\n                }\n                if (typeof deviceContext.ip === \"string\") {\n                    tagsItem[tagKeys.deviceIp] = deviceContext.ip;\n                }\n                if (typeof deviceContext.language === \"string\") {\n                    tagsItem[tagKeys.deviceLanguage] = deviceContext.language;\n                }\n                if (typeof deviceContext.locale === \"string\") {\n                    tagsItem[tagKeys.deviceLocale] = deviceContext.locale;\n                }\n                if (typeof deviceContext.model === \"string\") {\n                    tagsItem[tagKeys.deviceModel] = deviceContext.model;\n                }\n                if (typeof deviceContext.network !== \"undefined\") {\n                    tagsItem[tagKeys.deviceNetwork] = deviceContext.network;\n                }\n                if (typeof deviceContext.oemName === \"string\") {\n                    tagsItem[tagKeys.deviceOEMName] = deviceContext.oemName;\n                }\n                if (typeof deviceContext.os === \"string\") {\n                    tagsItem[tagKeys.deviceOS] = deviceContext.os;\n                }\n                if (typeof deviceContext.osversion === \"string\") {\n                    tagsItem[tagKeys.deviceOSVersion] = deviceContext.osversion;\n                }\n                if (typeof deviceContext.resolution === \"string\") {\n                    tagsItem[tagKeys.deviceScreenResolution] = deviceContext.resolution;\n                }\n                if (typeof deviceContext.type === \"string\") {\n                    tagsItem[tagKeys.deviceType] = deviceContext.type;\n                }\n            }\n        };\n        PropertiesPlugin._applyInternalContext = function (tagsItem, internalContext) {\n            if (internalContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof internalContext.agentVersion === \"string\") {\n                    tagsItem[tagKeys.internalAgentVersion] = internalContext.agentVersion;\n                }\n                if (typeof internalContext.sdkVersion === \"string\") {\n                    tagsItem[tagKeys.internalSdkVersion] = internalContext.sdkVersion;\n                }\n            }\n        };\n        PropertiesPlugin._applyLocationContext = function (tagsItem, locationContext) {\n            if (locationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof locationContext.ip === \"string\") {\n                    tagsItem[tagKeys.locationIp] = locationContext.ip;\n                }\n            }\n        };\n        PropertiesPlugin._applySampleContext = function (tagsItem, sampleContext) {\n            if (sampleContext) {\n                tagsItem.sampleRate = sampleContext.sampleRate;\n            }\n        };\n        PropertiesPlugin._applyOperationContext = function (tagsItem, operationContext) {\n            if (operationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof operationContext.id === \"string\") {\n                    tagsItem[tagKeys.operationId] = operationContext.id;\n                }\n                if (typeof operationContext.name === \"string\") {\n                    tagsItem[tagKeys.operationName] = operationContext.name;\n                }\n                if (typeof operationContext.parentId === \"string\") {\n                    tagsItem[tagKeys.operationParentId] = operationContext.parentId;\n                }\n                if (typeof operationContext.rootId === \"string\") {\n                    tagsItem[tagKeys.operationRootId] = operationContext.rootId;\n                }\n                if (typeof operationContext.syntheticSource === \"string\") {\n                    tagsItem[tagKeys.operationSyntheticSource] = operationContext.syntheticSource;\n                }\n            }\n        };\n        PropertiesPlugin._applyUserContext = function (tagsItem, userContext) {\n            if (userContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof userContext.accountId === \"string\") {\n                    tagsItem[tagKeys.userAccountId] = userContext.accountId;\n                }\n                if (typeof userContext.agent === \"string\") {\n                    tagsItem[tagKeys.userAgent] = userContext.agent;\n                }\n                if (typeof userContext.id === \"string\") {\n                    tagsItem[tagKeys.userId] = userContext.id;\n                }\n                if (typeof userContext.authenticatedId === \"string\") {\n                    tagsItem[tagKeys.userAuthUserId] = userContext.authenticatedId;\n                }\n                if (typeof userContext.storeRegion === \"string\") {\n                    tagsItem[tagKeys.userStoreRegion] = userContext.storeRegion;\n                }\n            }\n        };\n        return PropertiesPlugin;\n    }());\n    exports.default = PropertiesPlugin;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PropertiesPlugin.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./HashCodeScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, HashCodeScoreGenerator_1, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var SamplingScoreGenerator = /** @class */ (function () {\n        function SamplingScoreGenerator() {\n            this.hashCodeGeneragor = new HashCodeScoreGenerator_1.HashCodeScoreGenerator();\n        }\n        SamplingScoreGenerator.prototype.getSamplingScore = function (envelope) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            var score = 0;\n            if (envelope.tags[tagKeys.userId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.userId]);\n            }\n            else if (envelope.tags[tagKeys.operationId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.operationId]);\n            }\n            else {\n                score = Math.random();\n            }\n            return score;\n        };\n        return SamplingScoreGenerator;\n    }());\n    exports.SamplingScoreGenerator = SamplingScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SamplingScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PropertiesPlugin */ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PropertiesPlugin_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.PropertiesPlugin = PropertiesPlugin_1.default;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-properties-js.js.map\n\n/***/ }),\n\n/***/ 0:\n/*!**********************************!*\\\n  !*** multi ./amd/bundle/Init.js ***!\n  \\**********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./amd/bundle/Init.js */\"./amd/bundle/Init.js\");\n\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=aisdk.0.0.13.js.map"
  },
  {
    "path": "AISKU/dist-history/aisdk.0.0.15.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./amd/bundle/Init.js\":\n/*!****************************!*\\\n  !*** ./amd/bundle/Init.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! ./Initialization */ \"./amd/bundle/Initialization.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_analytics_js_1, Initialization_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    //should be global function that should load as soon as SDK loads\n    try {\n        // E2E sku on load initializes core and pipeline using snippet as input for configuration\n        var aiName;\n        if (typeof window !== \"undefined\" && typeof JSON !== \"undefined\") {\n            // get snippet or initialize to an empty object\n            // get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation\n            aiName = window[\"appInsightsSDK\"];\n            if (window[aiName] === undefined) {\n                // if no snippet is present, initialize default values\n                applicationinsights_analytics_js_1.ApplicationInsights.appInsightsDefaultConfig = Initialization_1.Initialization.getDefaultConfig();\n            }\n            else {\n                if (window[aiName].initialize) {\n                    // this is the typical case for browser+snippet\n                    var snippet = window[aiName] || {};\n                    // overwrite snippet with full appInsights\n                    var initialization = new Initialization_1.Initialization(snippet);\n                    var appInsightsLocal = initialization.loadAppInsights();\n                    // apply full appInsights to the global instance that was initialized in the snippet\n                    for (var field in appInsightsLocal) {\n                        snippet[field] = appInsightsLocal[field];\n                    }\n                    // Empty queue of all api calls logged prior to sdk download\n                    initialization.emptyQueue();\n                    initialization.addHousekeepingBeforeUnload(appInsightsLocal);\n                }\n            }\n        }\n    }\n    catch (e) {\n        // TODO: Find better place to warn to console when SDK initialization fails\n        if (console) {\n            console.warn('Failed to initialize AppInsights JS SDK for instance ' + aiName + e.message);\n        }\n    }\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./amd/bundle/Initialization.js\":\n/*!**************************************!*\\\n  !*** ./amd/bundle/Initialization.js ***!\n  \\**************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-channel-js */ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\"), __webpack_require__(/*! applicationinsights-properties-js */ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\"), __webpack_require__(/*! applicationinsights-dependencies-js */ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_analytics_js_1, applicationinsights_common_1, applicationinsights_channel_js_1, applicationinsights_properties_js_1, applicationinsights_dependencies_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    ;\n    var Initialization = /** @class */ (function () {\n        function Initialization(snippet) {\n            // initialize the queue and config in case they are undefined\n            snippet.queue = snippet.queue || [];\n            var config = snippet.config || {};\n            // ensure instrumentationKey is specified\n            if (config && !config.instrumentationKey) {\n                config = snippet;\n                applicationinsights_analytics_js_1.ApplicationInsights.Version = \"2.0.0\";\n            }\n            this.appInsights = new applicationinsights_analytics_js_1.ApplicationInsights();\n            // set default values using config passed through snippet\n            config = Initialization.getDefaultConfig(config, this.appInsights.identifier);\n            this.properties = new applicationinsights_properties_js_1.PropertiesPlugin();\n            this.dependencies = new applicationinsights_dependencies_js_1.AjaxPlugin();\n            this.snippet = snippet;\n            this.config = config;\n        }\n        // Analytics Plugin\n        Initialization.prototype.trackPageView = function (pageView, customProperties) {\n            this.appInsights.trackPageView(pageView, customProperties);\n        };\n        Initialization.prototype.trackException = function (exception, customProperties) {\n            this.appInsights.trackException(exception, customProperties);\n        };\n        Initialization.prototype._onerror = function (exception) {\n            this.appInsights._onerror(exception);\n        };\n        Initialization.prototype.trackTrace = function (trace, customProperties) {\n            this.appInsights.trackTrace(trace, customProperties);\n        };\n        Initialization.prototype.trackMetric = function (metric, customProperties) {\n            this.appInsights.trackMetric(metric, customProperties);\n        };\n        Initialization.prototype.startTrackPage = function (name) {\n            this.appInsights.startTrackPage(name);\n        };\n        Initialization.prototype.stopTrackPage = function (name, url, customProperties) {\n            this.appInsights.stopTrackPage(name, url, customProperties);\n        };\n        Initialization.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            return this.appInsights.addTelemetryInitializer(telemetryInitializer);\n        };\n        // Properties Plugin\n        Initialization.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            this.properties.user.setAuthenticatedUserContext(authenticatedUserId, accountId, storeInCookie);\n        };\n        Initialization.prototype.clearAuthenticatedUserContext = function () {\n            this.properties.user.clearAuthenticatedUserContext();\n        };\n        // Dependencies Plugin\n        Initialization.prototype.trackDependencyData = function (dependency, customProperties, systemProperties) {\n            this.dependencies.trackDependencyData(dependency, customProperties, systemProperties);\n        };\n        Initialization.prototype.loadAppInsights = function () {\n            this.core = new applicationinsights_core_js_1.AppInsightsCore();\n            var extensions = [];\n            var appInsightsChannel = new applicationinsights_channel_js_1.Sender();\n            extensions.push(appInsightsChannel);\n            extensions.push(this.properties);\n            extensions.push(this.dependencies);\n            extensions.push(this.appInsights);\n            // initialize core\n            this.core.initialize(this.config, extensions);\n            return this;\n        };\n        Initialization.prototype.emptyQueue = function () {\n            // call functions that were queued before the main script was loaded\n            try {\n                if (applicationinsights_common_1.Util.isArray(this.snippet.queue)) {\n                    // note: do not check length in the for-loop conditional in case something goes wrong and the stub methods are not overridden.\n                    var length = this.snippet.queue.length;\n                    for (var i = 0; i < length; i++) {\n                        var call = this.snippet.queue[i];\n                        call();\n                    }\n                    this.snippet.queue = undefined;\n                    delete this.snippet.queue;\n                }\n            }\n            catch (exception) {\n                var properties = {};\n                if (exception && typeof exception.toString === \"function\") {\n                    properties.exception = exception.toString();\n                }\n                // need from core\n                // Microsoft.ApplicationInsights._InternalLogging.throwInternal(\n                //     LoggingSeverity.WARNING,\n                //     _InternalMessageId.FailedToSendQueuedTelemetry,\n                //     \"Failed to send queued telemetry\",\n                //     properties);\n            }\n        };\n        Initialization.prototype.pollInteralLogs = function (appInsightsInstance) {\n            // return setInterval(() => {\n            //     var queue: Array<_InternalLogMessage> = ApplicationInsights._InternalLogging.queue;\n            //     var length = queue.length;\n            //     for (var i = 0; i < length; i++) {\n            //         appInsightsInstance.trackTrace(queue[i].message);\n            //     }\n            //     queue.length = 0;\n            // }, this.config.diagnosticLogInterval);\n        };\n        Initialization.prototype.addHousekeepingBeforeUnload = function (appInsightsInstance) {\n            // Add callback to push events when the user navigates away\n            if (!appInsightsInstance.appInsights.config.disableFlushOnBeforeUnload && ('onbeforeunload' in window)) {\n                var performHousekeeping = function () {\n                    // Adds the ability to flush all data before the page unloads.\n                    // Note: This approach tries to push an async request with all the pending events onbeforeunload.\n                    // Firefox does not respect this.Other browsers DO push out the call with < 100% hit rate.\n                    // Telemetry here will help us analyze how effective this approach is.\n                    // Another approach would be to make this call sync with a acceptable timeout to reduce the \n                    // impact on user experience.\n                    //appInsightsInstance.context._sender.triggerSend();\n                    appInsightsInstance.appInsights.core.getTransmissionControls().forEach(function (queues) {\n                        queues.forEach(function (channel) { return channel.flush(true); });\n                    });\n                    // Back up the current session to local storage\n                    // This lets us close expired sessions after the cookies themselves expire\n                    // Todo: move this against interface behavior\n                    if (this.core.extensions[\"AppInsightsPropertiesPlugin\"] &&\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager) {\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager.backup();\n                    }\n                };\n                if (!applicationinsights_common_1.Util.addEventHandler('beforeunload', performHousekeeping)) {\n                    this.core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToAddHandlerForOnBeforeUnload, 'Could not add handler for beforeunload');\n                }\n            }\n        };\n        Initialization.getDefaultConfig = function (configuration, identifier) {\n            if (!configuration) {\n                configuration = {};\n            }\n            if (configuration) {\n                identifier = identifier ? identifier : \"ApplicationInsightsAnalytics\";\n            }\n            // Undefined checks\n            if (!configuration.extensionConfig) {\n                configuration.extensionConfig = {};\n            }\n            if (!configuration.extensionConfig[identifier]) {\n                configuration.extensionConfig[identifier] = {};\n            }\n            var extensionConfig = configuration.extensionConfig[identifier]; // ref to main config\n            // set default values\n            configuration.endpointUrl = configuration.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\";\n            extensionConfig.sessionRenewalMs = 30 * 60 * 1000;\n            extensionConfig.sessionExpirationMs = 24 * 60 * 60 * 1000;\n            extensionConfig.enableDebug = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableDebug);\n            extensionConfig.disableExceptionTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableExceptionTracking);\n            extensionConfig.consoleLoggingLevel = extensionConfig.consoleLoggingLevel || 1; // Show only CRITICAL level\n            extensionConfig.telemetryLoggingLevel = extensionConfig.telemetryLoggingLevel || 0; // Send nothing\n            extensionConfig.diagnosticLogInterval = extensionConfig.diagnosticLogInterval || 10000;\n            extensionConfig.autoTrackPageVisitTime = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.autoTrackPageVisitTime);\n            if (isNaN(extensionConfig.samplingPercentage) || extensionConfig.samplingPercentage <= 0 || extensionConfig.samplingPercentage >= 100) {\n                extensionConfig.samplingPercentage = 100;\n            }\n            extensionConfig.disableAjaxTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableAjaxTracking);\n            extensionConfig.maxAjaxCallsPerView = !isNaN(extensionConfig.maxAjaxCallsPerView) ? extensionConfig.maxAjaxCallsPerView : 500;\n            extensionConfig.disableCorrelationHeaders = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableCorrelationHeaders);\n            extensionConfig.correlationHeaderExcludedDomains = extensionConfig.correlationHeaderExcludedDomains || [\n                \"*.blob.core.windows.net\",\n                \"*.blob.core.chinacloudapi.cn\",\n                \"*.blob.core.cloudapi.de\",\n                \"*.blob.core.usgovcloudapi.net\"\n            ];\n            extensionConfig.disableFlushOnBeforeUnload = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableFlushOnBeforeUnload);\n            extensionConfig.isCookieUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isCookieUseDisabled);\n            extensionConfig.isStorageUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isStorageUseDisabled);\n            extensionConfig.isBrowserLinkTrackingEnabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isBrowserLinkTrackingEnabled);\n            extensionConfig.enableCorsCorrelation = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableCorsCorrelation);\n            return configuration;\n        };\n        return Initialization;\n    }());\n    exports.Initialization = Initialization;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * ApplicationInsights.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Telemetry/PageViewManager */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, PageViewManager_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var durationProperty = \"duration\";\n    var ApplicationInsights = /** @class */ (function () {\n        function ApplicationInsights() {\n            this.identifier = \"ApplicationInsightsAnalytics\";\n            this.priority = 160; // take from reserved priority range 100- 200\n            this._isInitialized = false;\n            // Counts number of trackAjax invokations.\n            // By default we only monitor X ajax call per view to avoid too much load.\n            // Default value is set in config.\n            // This counter keeps increasing even after the limit is reached.\n            this._trackAjaxAttempts = 0;\n            this.initialize = this._initialize.bind(this);\n        }\n        ApplicationInsights.prototype.processTelemetry = function (env) {\n            var doNotSendItem = false;\n            try {\n                var telemetryInitializersCount = this._telemetryInitializers.length;\n                for (var i = 0; i < telemetryInitializersCount; ++i) {\n                    var telemetryInitializer = this._telemetryInitializers[i];\n                    if (telemetryInitializer) {\n                        if (telemetryInitializer.apply(null, [env]) === false) {\n                            doNotSendItem = true;\n                            break;\n                        }\n                    }\n                }\n            }\n            catch (e) {\n                doNotSendItem = true;\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryInitializerFailed, \"One of telemetry initializers failed, telemetry item will not be sent: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) }, true);\n            }\n            if (!doNotSendItem && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(env);\n            }\n        };\n        ApplicationInsights.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * @description Log a diagnostic message\n         * @param {ITraceTelemetry} trace\n         * @param {{[key: string]: any}} [customProperties]\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackTrace = function (trace, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(trace, applicationinsights_common_1.Trace.dataType, applicationinsights_common_1.Trace.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TrackTraceFailed, \"trackTrace failed, trace will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Log a numeric value that is not associated with a specific event. Typically\n         * used to send regular reports of performance indicators. To send single measurement, just\n         * use the name and average fields of {@link IMetricTelemetry}. If you take measurements\n         * frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements\n         * and sending the resulting average at intervals\n         * @param {IMetricTelemetry} metric input object argument. Only name and average are mandatory.\n         * @param {{[key: string]: any}} customProperties additional data used to filter metrics in the\n         * portal. Defaults to empty.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackMetric = function (metric, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(metric, applicationinsights_common_1.Metric.dataType, applicationinsights_common_1.Metric.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackMetricFailed, \"trackMetric failed, metric will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs that a page or other item was viewed.\n         * @param IPageViewTelemetry The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param customProperties Additional data used to filter events and metrics. Defaults to empty. If a user wants\n         *                         to provide a custom duration, it'll have to be in customProperties\n         */\n        ApplicationInsights.prototype.trackPageView = function (pageView, customProperties) {\n            try {\n                this._pageViewManager.trackPageView(pageView, customProperties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(pageView.name, pageView.uri);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailed, \"trackPageView failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Create a page view telemetry item and send it to the SDK pipeline through the core.track API\n         * @param pageView Page view item to be sent\n         * @param properties Custom properties (Part C) that a user can add to the telemetry item\n         * @param systemProperties System level properties (Part A) that a user can add to the telemetry item\n         */\n        ApplicationInsights.prototype.sendPageViewInternal = function (pageView, properties, systemProperties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageView, applicationinsights_common_1.PageView.dataType, applicationinsights_common_1.PageView.envelopeType, this._logger, properties, systemProperties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n            // reset ajaxes counter\n            this._trackAjaxAttempts = 0;\n        };\n        ApplicationInsights.prototype.sendPageViewPerformanceInternal = function (pageViewPerformance, properties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageViewPerformance, applicationinsights_common_1.PageViewPerformance.dataType, applicationinsights_common_1.PageViewPerformance.envelopeType, this._logger, properties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n        };\n        /**\n         * Starts timing how long the user views a page or other item. Call this when the page opens.\n         * This method doesn't send any telemetry. Call {@link stopTrackTelemetry} to log the page when it closes.\n         * @param name A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n         */\n        ApplicationInsights.prototype.startTrackPage = function (name) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                this._pageTracking.start(name);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StartTrackFailed, \"startTrackPage failed, page view may not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs how long a page or other item was visible, after {@link startTrackPage}. Call this when the page closes.\n         * @param name The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param url A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n         * @param properties Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *                   Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric\n         */\n        ApplicationInsights.prototype.stopTrackPage = function (name, url, properties) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                if (typeof url !== \"string\") {\n                    url = window.location && window.location.href || \"\";\n                }\n                this._pageTracking.stop(name, url, properties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(name, url);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StopTrackFailed, \"stopTrackPage failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Log an exception you have caught.\n         *\n         * @param {IExceptionTelemetry} exception   Object which contains exception to be sent\n         * @param {{[key: string]: any}} customProperties   Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *\n         * Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackException = function (exception, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackExceptionFailed, \"trackException failed, exception will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Custom error handler for Application Insights Analytics\n         * @param {IAutoExceptionTelemetry} exception\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype._onerror = function (exception) {\n            try {\n                var properties = {\n                    url: (exception && exception.url) || document.URL,\n                    lineNumber: exception.lineNumber,\n                    columnNumber: exception.columnNumber,\n                    message: exception.message\n                };\n                if (applicationinsights_common_1.Util.isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception.error)) {\n                    this._sendCORSException(properties.url);\n                }\n                else {\n                    if (!applicationinsights_common_1.Util.isError(exception.error)) {\n                        var stack = \"window.onerror@\" + properties.url + \":\" + exception.lineNumber + \":\" + (exception.columnNumber || 0);\n                        exception.error = new Error(exception.message);\n                        exception.error.stack = stack;\n                    }\n                    this.trackException({ error: exception.error, severityLevel: applicationinsights_common_1.SeverityLevel.Error }, properties);\n                }\n            }\n            catch (e) {\n                var errorString = exception.error ?\n                    (exception.error.name + \", \" + exception.error.message)\n                    : \"null\";\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ExceptionWhileLoggingError, \"_onError threw exception while logging error, error will not be collected: \"\n                    + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e), errorString: errorString });\n            }\n        };\n        ApplicationInsights.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._initialize = function (config, core, extensions) {\n            var _this = this;\n            if (this._isInitialized) {\n                return;\n            }\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(core)) {\n                throw Error(\"Error initializing\");\n            }\n            this.core = core;\n            this._logger = core.logger;\n            this._globalconfig = {\n                instrumentationKey: config.instrumentationKey,\n                endpointUrl: config.endpointUrl\n            };\n            this.config = config.extensionConfig && config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n            // load default values if specified\n            var defaults = ApplicationInsights.appInsightsDefaultConfig;\n            if (defaults !== undefined) {\n                if (defaults.extensions && defaults.extensions[this.identifier]) {\n                    for (var field in defaults.extensions[this.identifier]) {\n                        // for each unspecified field, set the default value\n                        if (this.config[field] === undefined) {\n                            this.config[field] = defaults[field];\n                        }\n                    }\n                }\n                if (this._globalconfig) {\n                    for (var field in defaults) {\n                        if (this._globalconfig[field] === undefined) {\n                            this._globalconfig[field] = defaults[field];\n                        }\n                    }\n                }\n            }\n            // Todo: move this out of static state\n            if (this.config.isCookieUseDisabled) {\n                applicationinsights_common_1.Util.disableCookies();\n            }\n            // Todo: move this out of static state\n            if (this.config.isStorageUseDisabled) {\n                applicationinsights_common_1.Util.disableStorage();\n            }\n            var configGetters = {\n                instrumentationKey: function () { return config.instrumentationKey; },\n                accountId: function () { return _this.config.accountId; },\n                sessionRenewalMs: function () { return _this.config.sessionRenewalMs; },\n                sessionExpirationMs: function () { return _this.config.sessionExpirationMs; },\n                sampleRate: function () { return _this.config.samplingPercentage; },\n                cookieDomain: function () { return _this.config.cookieDomain; },\n                sdkExtension: function () { return _this.config.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return _this.config.isBrowserLinkTrackingEnabled; },\n                appId: function () { return _this.config.appId; }\n            };\n            this._pageViewManager = new PageViewManager_1.PageViewManager(this, this.config.overridePageViewDuration, this.core);\n            this._telemetryInitializers = [];\n            this._addDefaultTelemetryInitializers(configGetters);\n            // initialize page view timing\n            this._pageTracking = new Timing(this._logger, \"trackPageView\");\n            this._pageTracking.action = function (name, url, duration, properties) {\n                var pageViewItem = {\n                    name: name,\n                    uri: url\n                };\n                // duration must be a custom property in order for the collector to extract it\n                if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(properties)) {\n                    properties = {};\n                }\n                properties[durationProperty] = duration;\n                _this.sendPageViewInternal(pageViewItem, properties);\n            };\n            if (this.config.disableExceptionTracking === false &&\n                !this.config.autoExceptionInstrumented) {\n                // We want to enable exception auto collection and it has not been done so yet\n                var onerror_1 = \"onerror\";\n                var originalOnError_1 = window[onerror_1];\n                var instance_1 = this;\n                window.onerror = function (message, url, lineNumber, columnNumber, error) {\n                    var handled = originalOnError_1 && originalOnError_1(message, url, lineNumber, columnNumber, error);\n                    if (handled !== true) {\n                        instance_1._onerror({\n                            message: message,\n                            url: url,\n                            lineNumber: lineNumber,\n                            columnNumber: columnNumber,\n                            error: error\n                        });\n                    }\n                    return handled;\n                };\n                this.config.autoExceptionInstrumented = true;\n            }\n            this._isInitialized = true;\n        };\n        ApplicationInsights.prototype._addDefaultTelemetryInitializers = function (configGetters) {\n            if (!configGetters.isBrowserLinkTrackingEnabled()) {\n                var browserLinkPaths_1 = ['/browserLinkSignalR/', '/__browserLink/'];\n                var dropBrowserLinkRequests = function (envelope) {\n                    if (envelope.baseType === applicationinsights_common_1.RemoteDependencyData.dataType) {\n                        var remoteData = envelope.baseData;\n                        if (remoteData) {\n                            for (var i = 0; i < browserLinkPaths_1.length; i++) {\n                                if (remoteData.absoluteUrl && remoteData.absoluteUrl.indexOf(browserLinkPaths_1[i]) >= 0) {\n                                    return false;\n                                }\n                            }\n                        }\n                    }\n                    return true;\n                };\n                this._addTelemetryInitializer(dropBrowserLinkRequests);\n            }\n        };\n        ApplicationInsights.prototype._addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._sendCORSException = function (url) {\n            var exception = {\n                message: \"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\",\n                url: url,\n                lineNumber: 0,\n                columnNumber: 0,\n                error: undefined\n            };\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, { url: url });\n            this.core.track(telemetryItem);\n        };\n        // Mutate telemetryItem inplace to add boilerplate iKey & name info\n        ApplicationInsights.prototype._setTelemetryNameAndIKey = function (telemetryItem) {\n            telemetryItem.instrumentationKey = this._globalconfig.instrumentationKey;\n            var iKeyNoDashes = this._globalconfig.instrumentationKey.replace(/-/g, \"\");\n            telemetryItem.name = telemetryItem.name.replace(\"{0}\", iKeyNoDashes);\n        };\n        ApplicationInsights.Version = \"2.0.1-beta\";\n        return ApplicationInsights;\n    }());\n    exports.ApplicationInsights = ApplicationInsights;\n    /**\n     * Used to record timed events and page views.\n     */\n    var Timing = /** @class */ (function () {\n        function Timing(logger, name) {\n            this._name = name;\n            this._events = {};\n            this._logger = logger;\n        }\n        Timing.prototype.start = function (name) {\n            if (typeof this._events[name] !== \"undefined\") {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StartCalledMoreThanOnce, \"start was called more than once for this event without calling stop.\", { name: this._name, key: name }, true);\n            }\n            this._events[name] = +new Date;\n        };\n        Timing.prototype.stop = function (name, url, properties) {\n            var start = this._events[name];\n            if (isNaN(start)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StopCalledWithoutStart, \"stop was called without a corresponding start.\", { name: this._name, key: name }, true);\n            }\n            else {\n                var end = +new Date;\n                var duration = applicationinsights_common_1.PageViewPerformance.getDuration(start, end);\n                this.action(name, url, duration, properties);\n            }\n            delete this._events[name];\n            this._events[name] = undefined;\n        };\n        return Timing;\n    }());\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ApplicationInsights.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Class encapsulates sending page views and page view performance telemetry.\n    */\n    var PageViewManager = /** @class */ (function () {\n        function PageViewManager(appInsights, overridePageViewDuration, core) {\n            this.pageViewPerformanceSent = false;\n            this.overridePageViewDuration = false;\n            this.overridePageViewDuration = overridePageViewDuration;\n            this.appInsights = appInsights;\n            if (core) {\n                this._channel = function () { return (core.getTransmissionControls()); };\n                this._logger = core.logger;\n            }\n        }\n        /**\n        * Currently supported cases:\n        * 1) (default case) track page view called with default parameters, overridePageViewDuration = false. Page view is sent with page view performance when navigation timing data is available.\n        *    a. If navigation timing is not supported then page view is sent right away with undefined duration. Page view performance is not sent.\n        * 2) overridePageViewDuration = true, custom duration provided. Custom duration is used, page view sends right away.\n        * 3) overridePageViewDuration = true, custom duration NOT provided. Page view is sent right away, duration is time spent from page load till now (or undefined if navigation timing is not supported).\n        * 4) overridePageViewDuration = false, custom duration is provided. Page view is sent right away with custom duration.\n        *\n        * In all cases page view performance is sent once (only for the 1st call of trackPageView), or not sent if navigation timing is not supported.\n        */\n        PageViewManager.prototype.trackPageView = function (pageView, customProperties) {\n            var _this = this;\n            var name = pageView.name;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(name) || typeof name !== \"string\") {\n                pageView.name = window.document && window.document.title || \"\";\n            }\n            var uri = pageView.uri;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                pageView.uri = window.location && window.location.href || \"\";\n            }\n            // case 1a. if performance timing is not supported by the browser, send the page view telemetry with the duration provided by the user. If the user\n            // do not provide the duration, set duration to undefined\n            // Also this is case 4\n            if (!applicationinsights_common_1.PageViewPerformance.isPerformanceTimingSupported()) {\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                // no navigation timing (IE 8, iOS Safari 8.4, Opera Mini 8 - see http://caniuse.com/#feat=nav-timing)\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NavigationTimingNotSupported, \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                return;\n            }\n            var pageViewSent = false;\n            var customDuration = undefined;\n            // if the performance timing is supported by the browser, calculate the custom duration\n            var start = applicationinsights_common_1.PageViewPerformance.getPerformanceTiming().navigationStart;\n            customDuration = applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date);\n            if (!applicationinsights_common_1.PageViewPerformance.shouldCollectDuration(customDuration)) {\n                customDuration = undefined;\n            }\n            // if the user has provided duration, send a page view telemetry with the provided duration. Otherwise, if\n            // overridePageViewDuration is set to true, send a page view telemetry with the custom duration calculated earlier\n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties.duration)) {\n                duration = customProperties.duration;\n            }\n            if (this.overridePageViewDuration || !isNaN(duration)) {\n                if (isNaN(duration)) {\n                    // case 3\n                    if (!customProperties) {\n                        customProperties = {};\n                    }\n                    customProperties[\"duration\"] = customDuration;\n                }\n                // case 2\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                pageViewSent = true;\n            }\n            // now try to send the page view performance telemetry\n            var maxDurationLimit = 60000;\n            if (!customProperties) {\n                customProperties = {};\n            }\n            var handle = setInterval((function () {\n                try {\n                    if (applicationinsights_common_1.PageViewPerformance.isPerformanceTimingDataReady()) {\n                        clearInterval(handle);\n                        var pageViewPerformance = new applicationinsights_common_1.PageViewPerformance(_this._logger, name, uri, null);\n                        if (!pageViewPerformance.getIsValid() && !pageViewSent) {\n                            // If navigation timing gives invalid numbers, then go back to \"override page view duration\" mode.\n                            // That's the best value we can get that makes sense.\n                            customProperties[\"duration\"] = customDuration;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                        else {\n                            if (!pageViewSent) {\n                                customProperties[\"duration\"] = pageViewPerformance.getDurationMs();\n                                _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            }\n                            if (!_this.pageViewPerformanceSent) {\n                                _this.appInsights.sendPageViewPerformanceInternal(pageViewPerformance, customProperties);\n                                _this.pageViewPerformanceSent = true;\n                            }\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                    else if (applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date) > maxDurationLimit) {\n                        // if performance timings are not ready but we exceeded the maximum duration limit, just log a page view telemetry\n                        // with the maximum duration limit. Otherwise, keep waiting until performance timings are ready\n                        clearInterval(handle);\n                        if (!pageViewSent) {\n                            customProperties[\"duration\"] = maxDurationLimit;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                }\n                catch (e) {\n                    _this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailedCalc, \"trackPageView failed on page load calculation: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }), 100);\n        };\n        return PageViewManager;\n    }());\n    exports.PageViewManager = PageViewManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK/ApplicationInsights */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ApplicationInsights_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ApplicationInsights = ApplicationInsights_1.ApplicationInsights;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-analytics-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ContextTagKeys = [\n        \"ai.application.ver\",\n        \"ai.application.build\",\n        \"ai.application.typeId\",\n        \"ai.application.applicationId\",\n        \"ai.application.layer\",\n        \"ai.device.id\",\n        \"ai.device.ip\",\n        \"ai.device.language\",\n        \"ai.device.locale\",\n        \"ai.device.model\",\n        \"ai.device.friendlyName\",\n        \"ai.device.network\",\n        \"ai.device.networkName\",\n        \"ai.device.oemName\",\n        \"ai.device.os\",\n        \"ai.device.osVersion\",\n        \"ai.device.roleInstance\",\n        \"ai.device.roleName\",\n        \"ai.device.screenResolution\",\n        \"ai.device.type\",\n        \"ai.device.machineName\",\n        \"ai.device.vmName\",\n        \"ai.device.browser\",\n        \"ai.device.browserVersion\",\n        \"ai.location.ip\",\n        \"ai.location.country\",\n        \"ai.location.province\",\n        \"ai.location.city\",\n        \"ai.operation.id\",\n        \"ai.operation.name\",\n        \"ai.operation.parentId\",\n        \"ai.operation.rootId\",\n        \"ai.operation.syntheticSource\",\n        \"ai.operation.correlationVector\",\n        \"ai.session.id\",\n        \"ai.session.isFirst\",\n        \"ai.session.isNew\",\n        \"ai.user.accountAcquisitionDate\",\n        \"ai.user.accountId\",\n        \"ai.user.userAgent\",\n        \"ai.user.id\",\n        \"ai.user.storeRegion\",\n        \"ai.user.authUserId\",\n        \"ai.user.anonUserAcquisitionDate\",\n        \"ai.user.authUserAcquisitionDate\",\n        \"ai.cloud.name\",\n        \"ai.cloud.role\",\n        \"ai.cloud.roleVer\",\n        \"ai.cloud.roleInstance\",\n        \"ai.cloud.environment\",\n        \"ai.cloud.location\",\n        \"ai.cloud.deploymentUnit\",\n        \"ai.internal.sdkVersion\",\n        \"ai.internal.agentVersion\",\n        \"ai.internal.nodeName\",\n    ];\n    // these two constants are used to filter out properties not needed when trying to extract custom properties and measurements from the incoming payload\n    var baseType = \"baseType\";\n    var baseData = \"baseData\";\n    var EnvelopeCreator = /** @class */ (function () {\n        function EnvelopeCreator() {\n        }\n        EnvelopeCreator.extractProperties = function (data) {\n            var customProperties = null;\n            for (var key in data) {\n                if (data.hasOwnProperty(key)) {\n                    var value = data[key];\n                    if (typeof value !== \"number\") {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[key] = value;\n                    }\n                }\n            }\n            return customProperties;\n        };\n        EnvelopeCreator.extractPropsAndMeasurements = function (data, properties, measurements) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(data)) {\n                for (var key in data) {\n                    if (data.hasOwnProperty(key)) {\n                        var value = data[key];\n                        if (typeof value === \"number\") {\n                            measurements[key] = value;\n                        }\n                        else {\n                            properties[key] = value;\n                        }\n                    }\n                }\n            }\n        };\n        // TODO: Do we want this to take logger as arg or use this._logger as nonstatic?\n        EnvelopeCreator.createEnvelope = function (logger, envelopeType, telemetryItem, data) {\n            var envelope = new applicationinsights_common_1.Envelope(logger, data, envelopeType);\n            envelope.iKey = telemetryItem.instrumentationKey;\n            var iKeyNoDashes = telemetryItem.instrumentationKey.replace(/-/g, \"\");\n            envelope.name = envelope.name.replace(\"{0}\", iKeyNoDashes);\n            // loop through the envelope ctx (Part A) and pick out the ones that should go in outgoing envelope tags\n            for (var key in telemetryItem.ctx) {\n                if (telemetryItem.ctx.hasOwnProperty(key)) {\n                    if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                        envelope.tags[key] = telemetryItem.ctx[key];\n                    }\n                }\n            }\n            // loop through the envelope tags (extension of Part A) and pick out the ones that should go in outgoing envelope tags\n            telemetryItem.tags.forEach(function (tag) {\n                for (var key in tag) {\n                    if (tag.hasOwnProperty(key)) {\n                        if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                            envelope.tags[key] = tag[key];\n                        }\n                    }\n                }\n            });\n            return envelope;\n        };\n        return EnvelopeCreator;\n    }());\n    exports.EnvelopeCreator = EnvelopeCreator;\n    var DependencyEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(DependencyEnvelopeCreator, _super);\n        function DependencyEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        DependencyEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customMeasurements = {};\n            var customProperties = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var bd = telemetryItem.baseData;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(bd)) {\n                logger.warnToConsole(\"Invalid input for dependency data\");\n                return null;\n            }\n            var id = bd.id;\n            var absoluteUrl = bd.absoluteUrl;\n            var command = bd.commandName;\n            var duration = bd.duration;\n            var success = bd.success;\n            var resultCode = bd.resultCode;\n            var method = bd.method;\n            var baseData = new applicationinsights_common_1.RemoteDependencyData(logger, id, absoluteUrl, command, duration, success, resultCode, method, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.RemoteDependencyData.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.RemoteDependencyData.envelopeType, telemetryItem, data);\n        };\n        DependencyEnvelopeCreator.DependencyEnvelopeCreator = new DependencyEnvelopeCreator();\n        return DependencyEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.DependencyEnvelopeCreator = DependencyEnvelopeCreator;\n    var EventEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(EventEnvelopeCreator, _super);\n        function EventEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            if (telemetryItem.baseType !== applicationinsights_common_1.Event.dataType) {\n                EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.baseData, customProperties, customMeasurements);\n            }\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var eventName = telemetryItem.baseData.name;\n            var baseData = new applicationinsights_common_1.Event(logger, eventName, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Event.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Event.envelopeType, telemetryItem, data);\n        };\n        EventEnvelopeCreator.EventEnvelopeCreator = new EventEnvelopeCreator();\n        return EventEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.EventEnvelopeCreator = EventEnvelopeCreator;\n    var ExceptionEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(ExceptionEnvelopeCreator, _super);\n        function ExceptionEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ExceptionEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var exception = telemetryItem.baseData.error;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var baseData = new applicationinsights_common_1.Exception(logger, exception, customProperties, customMeasurements, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Exception.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Exception.envelopeType, telemetryItem, data);\n        };\n        ExceptionEnvelopeCreator.ExceptionEnvelopeCreator = new ExceptionEnvelopeCreator();\n        return ExceptionEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.ExceptionEnvelopeCreator = ExceptionEnvelopeCreator;\n    var MetricEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(MetricEnvelopeCreator, _super);\n        function MetricEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        MetricEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var name = telemetryItem.baseData.name;\n            var average = telemetryItem.baseData.average;\n            var sampleCount = telemetryItem.baseData.sampleCount;\n            var min = telemetryItem.baseData.min;\n            var max = telemetryItem.baseData.max;\n            var baseData = new applicationinsights_common_1.Metric(logger, name, average, sampleCount, min, max, customProperties);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Metric.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Metric.envelopeType, telemetryItem, data);\n        };\n        MetricEnvelopeCreator.MetricEnvelopeCreator = new MetricEnvelopeCreator();\n        return MetricEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.MetricEnvelopeCreator = MetricEnvelopeCreator;\n    var PageViewEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewEnvelopeCreator, _super);\n        function PageViewEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            // Since duration is not part of the domain properties in Common Schema, extract it from part C \n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data.duration)) {\n                duration = telemetryItem.data.duration;\n                delete telemetryItem.data.duration;\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            // Todo: move IPageViewTelemetry to common as we are missing type checks on baseData here\n            // refUri is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.refUri)) {\n                customProperties[\"refUri\"] = telemetryItem.baseData.refUri;\n            }\n            // pageType is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageType)) {\n                customProperties[\"pageType\"] = telemetryItem.baseData.pageType;\n            }\n            // isLoggedIn is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.isLoggedIn)) {\n                customProperties[\"isLoggedIn\"] = telemetryItem.baseData.isLoggedIn;\n            }\n            // pageTags is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageTags)) {\n                var pageTags = telemetryItem.baseData.pageTags;\n                for (var key in pageTags) {\n                    if (pageTags.hasOwnProperty(key)) {\n                        customProperties[key] = pageTags[key];\n                    }\n                }\n            }\n            var baseData = new applicationinsights_common_1.PageView(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageView.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageView.envelopeType, telemetryItem, data);\n        };\n        PageViewEnvelopeCreator.PageViewEnvelopeCreator = new PageViewEnvelopeCreator();\n        return PageViewEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewEnvelopeCreator = PageViewEnvelopeCreator;\n    var PageViewPerformanceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewPerformanceEnvelopeCreator, _super);\n        function PageViewPerformanceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewPerformanceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            var duration = telemetryItem.baseData.duration;\n            var baseData = new applicationinsights_common_1.PageViewPerformance(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageViewPerformance.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageViewPerformance.envelopeType, telemetryItem, data);\n        };\n        PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator = new PageViewPerformanceEnvelopeCreator();\n        return PageViewPerformanceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewPerformanceEnvelopeCreator = PageViewPerformanceEnvelopeCreator;\n    var TraceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(TraceEnvelopeCreator, _super);\n        function TraceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        TraceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var message = telemetryItem.baseData.message;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var baseData = new applicationinsights_common_1.Trace(logger, message, customProperties, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Trace.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Trace.envelopeType, telemetryItem, data);\n        };\n        TraceEnvelopeCreator.TraceEnvelopeCreator = new TraceEnvelopeCreator();\n        return TraceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.TraceEnvelopeCreator = TraceEnvelopeCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EnvelopeCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /*\n     * An array based send buffer.\n     */\n    var ArraySendBuffer = /** @class */ (function () {\n        function ArraySendBuffer(config) {\n            this._config = config;\n            this._buffer = [];\n        }\n        ArraySendBuffer.prototype.enqueue = function (payload) {\n            this._buffer.push(payload);\n        };\n        ArraySendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        ArraySendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n        };\n        ArraySendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        ArraySendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        ArraySendBuffer.prototype.markAsSent = function (payload) {\n            this.clear();\n        };\n        ArraySendBuffer.prototype.clearSent = function (payload) {\n            // not supported\n        };\n        return ArraySendBuffer;\n    }());\n    exports.ArraySendBuffer = ArraySendBuffer;\n    /*\n     * Session storege buffer holds a copy of all unsent items in the browser session storage.\n     */\n    var SessionStorageSendBuffer = /** @class */ (function () {\n        function SessionStorageSendBuffer(logger, config) {\n            this._bufferFullMessageSent = false;\n            this._logger = logger;\n            this._config = config;\n            var bufferItems = this.getBuffer(SessionStorageSendBuffer.BUFFER_KEY);\n            var notDeliveredItems = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            this._buffer = bufferItems.concat(notDeliveredItems);\n            // If the buffer has too many items, drop items from the end.\n            if (this._buffer.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                this._buffer.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n            }\n            // update DataLossAnalyzer with the number of recovered items\n            // Uncomment if you want to use DataLossanalyzer\n            // DataLossAnalyzer.itemsRestoredFromSessionBuffer = this._buffer.length;\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        }\n        SessionStorageSendBuffer.prototype.enqueue = function (payload) {\n            if (this._buffer.length >= SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                // sent internal log only once per page view\n                if (!this._bufferFullMessageSent) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Maximum buffer size reached: \" + this._buffer.length, true);\n                    this._bufferFullMessageSent = true;\n                }\n                return;\n            }\n            this._buffer.push(payload);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        };\n        SessionStorageSendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        SessionStorageSendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this._bufferFullMessageSent = false;\n        };\n        SessionStorageSendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        SessionStorageSendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        SessionStorageSendBuffer.prototype.markAsSent = function (payload) {\n            this._buffer = this.removePayloadsFromBuffer(payload, this._buffer);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            if (sentElements instanceof Array && payload instanceof Array) {\n                sentElements = sentElements.concat(payload);\n                if (sentElements.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                    // We send telemetry normally. If the SENT_BUFFER is too big we don't add new elements\n                    // until we receive a response from the backend and the buffer has free space again (see clearSent method)\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Sent buffer reached its maximum size: \" + sentElements.length, true);\n                    sentElements.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n                }\n                this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n            }\n        };\n        SessionStorageSendBuffer.prototype.clearSent = function (payload) {\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            sentElements = this.removePayloadsFromBuffer(payload, sentElements);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n        };\n        SessionStorageSendBuffer.prototype.removePayloadsFromBuffer = function (payloads, buffer) {\n            var remaining = [];\n            for (var i in buffer) {\n                var contains = false;\n                for (var j in payloads) {\n                    if (payloads[j] === buffer[i]) {\n                        contains = true;\n                        break;\n                    }\n                }\n                if (!contains) {\n                    remaining.push(buffer[i]);\n                }\n            }\n            ;\n            return remaining;\n        };\n        SessionStorageSendBuffer.prototype.getBuffer = function (key) {\n            try {\n                var bufferJson = applicationinsights_common_1.Util.getSessionStorage(this._logger, key);\n                if (bufferJson) {\n                    var buffer = JSON.parse(bufferJson);\n                    if (buffer) {\n                        return buffer;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToRestoreStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            return [];\n        };\n        SessionStorageSendBuffer.prototype.setBuffer = function (key, buffer) {\n            try {\n                var bufferJson = JSON.stringify(buffer);\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, bufferJson);\n            }\n            catch (e) {\n                // if there was an error, clear the buffer\n                // telemetry is stored in the _buffer array so we won't loose any items\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, JSON.stringify([]));\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedToSetStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e) + \". Buffer cleared\", { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n        SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n        // Maximum number of payloads stored in the buffer. If the buffer is full, new elements will be dropped. \n        SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n        return SessionStorageSendBuffer;\n    }());\n    exports.SessionStorageSendBuffer = SessionStorageSendBuffer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SendBuffer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Sender.js ***!\n  \\**********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./SendBuffer */ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\"), __webpack_require__(/*! ./EnvelopeCreator */ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\"), __webpack_require__(/*! ./TelemetryValidation/EventValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/TraceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/ExceptionValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/MetricValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewPerformanceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/RemoteDepdencyValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\"), __webpack_require__(/*! ./Serializer */ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SendBuffer_1, EnvelopeCreator_1, EventValidator_1, TraceValidator_1, ExceptionValidator_1, MetricValidator_1, PageViewPerformanceValidator_1, PageViewValidator_1, RemoteDepdencyValidator_1, Serializer_1, applicationinsights_common_1, applicationinsights_core_js_1, applicationinsights_core_js_2) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sender = /** @class */ (function () {\n        function Sender() {\n            this.priority = 201;\n            /**\n             * Whether XMLHttpRequest object is supported. Older version of IE (8,9) do not support it.\n             */\n            this._XMLHttpRequestSupported = false;\n        }\n        Sender.prototype.pause = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.resume = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.flush = function () {\n            try {\n                this.triggerSend();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FlushFailed, \"flush failed, telemetry will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        Sender.prototype.teardown = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.initialize = function (config, core, extensions) {\n            this.identifier = \"AppInsightsChannelPlugin\";\n            this._logger = core.logger;\n            this._serializer = new Serializer_1.Serializer(core.logger);\n            this._consecutiveErrors = 0;\n            this._retryAt = null;\n            this._lastSend = 0;\n            this._config = Sender._getDefaultAppInsightsChannelConfig(config, this.identifier);\n            this._sender = null;\n            this._buffer = (applicationinsights_common_1.Util.canUseSessionStorage() && this._config.enableSessionStorageBuffer)\n                ? new SendBuffer_1.SessionStorageSendBuffer(this._logger, this._config) : new SendBuffer_1.ArraySendBuffer(this._config);\n            if (!this._config.isBeaconApiDisabled() && applicationinsights_common_1.Util.IsBeaconApiSupported()) {\n                this._sender = this._beaconSender;\n            }\n            else {\n                if (typeof XMLHttpRequest != \"undefined\") {\n                    var testXhr = new XMLHttpRequest();\n                    if (\"withCredentials\" in testXhr) {\n                        this._sender = this._xhrSender;\n                        this._XMLHttpRequestSupported = true;\n                    }\n                    else if (typeof XDomainRequest !== \"undefined\") {\n                        this._sender = this._xdrSender; //IE 8 and 9\n                    }\n                }\n            }\n        };\n        Sender.prototype.processTelemetry = function (telemetryItem) {\n            try {\n                // if master off switch is set, don't send any data\n                if (this._config.disableTelemetry()) {\n                    // Do not send/save data\n                    return;\n                }\n                // validate input\n                if (!telemetryItem) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSendEmptyTelemetry, \"Cannot send empty telemetry\");\n                    return;\n                }\n                // ensure a sender was constructed\n                if (!this._sender) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SenderNotInitialized, \"Sender was not initialized\");\n                    return;\n                }\n                // first we need to validate that the envelope passed down is valid\n                var isValid = Sender._validate(telemetryItem);\n                if (!isValid) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"Invalid telemetry envelope\");\n                    return;\n                }\n                // construct an envelope that Application Insights endpoint can understand\n                var aiEnvelope = this._constructEnvelope(telemetryItem);\n                if (!aiEnvelope) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CreateEnvelopeError, \"Unable to create an AppInsights envelope\");\n                    return;\n                }\n                // check if the incoming payload is too large, truncate if necessary\n                var payload = this._serializer.serialize(aiEnvelope);\n                // flush if we would exceed the max-size limit by adding this item\n                var bufferPayload = this._buffer.getItems();\n                var batch = this._buffer.batchPayloads(bufferPayload);\n                if (batch && (batch.length + payload.length > this._config.maxBatchSizeInBytes())) {\n                    this.triggerSend();\n                }\n                // enqueue the payload\n                this._buffer.enqueue(payload);\n                // ensure an invocation timeout is set\n                this._setupTimer();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedAddingTelemetryToBuffer, \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            // hand off the telemetry item to the next plugin\n            if (!applicationinsights_core_js_2.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(telemetryItem);\n            }\n        };\n        Sender.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * xhr state changes\n         */\n        Sender.prototype._xhrReadyStateChange = function (xhr, payload, countOfItemsInPayload) {\n            if (xhr.readyState === 4) {\n                var response = null;\n                if (!this._appId) {\n                    response = this._parseResponse(xhr.responseText || xhr.response);\n                    if (response && response.appId) {\n                        this._appId = response.appId;\n                    }\n                }\n                if ((xhr.status < 200 || xhr.status >= 300) && xhr.status !== 0) {\n                    if (!this._config.isRetryDisabled() && this._isRetriable(xhr.status)) {\n                        this._resendPayload(payload);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                            \"Response code \" + xhr.status + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                    else {\n                        this._onError(payload, this._formatErrorMessageXhr(xhr));\n                    }\n                }\n                else {\n                    if (xhr.status === 206) {\n                        if (!response) {\n                            response = this._parseResponse(xhr.responseText || xhr.response);\n                        }\n                        if (response && !this._config.isRetryDisabled()) {\n                            this._onPartialSuccess(payload, response);\n                        }\n                        else {\n                            this._onError(payload, this._formatErrorMessageXhr(xhr));\n                        }\n                    }\n                    else {\n                        this._consecutiveErrors = 0;\n                        this._onSuccess(payload, countOfItemsInPayload);\n                    }\n                }\n            }\n        };\n        /**\n         * Immediately send buffered data\n         * @param async {boolean} - Indicates if the events should be sent asynchronously\n         */\n        Sender.prototype.triggerSend = function (async) {\n            if (async === void 0) { async = true; }\n            try {\n                // Send data only if disableTelemetry is false\n                if (!this._config.disableTelemetry()) {\n                    if (this._buffer.count() > 0) {\n                        var payload = this._buffer.getItems();\n                        // invoke send\n                        this._sender(payload, async);\n                    }\n                    // update lastSend time to enable throttling\n                    this._lastSend = +new Date;\n                }\n                else {\n                    this._buffer.clear();\n                }\n                clearTimeout(this._timeoutHandle);\n                this._timeoutHandle = null;\n                this._retryAt = null;\n            }\n            catch (e) {\n                /* Ignore this error for IE under v10 */\n                if (!applicationinsights_common_1.Util.getIEVersion() || applicationinsights_common_1.Util.getIEVersion() > 9) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Telemetry transmission failed, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }\n        };\n        /**\n         * error handler\n         */\n        Sender.prototype._onError = function (payload, message, event) {\n            this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.OnError, \"Failed to send telemetry.\", { message: message });\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * partial success handler\n         */\n        Sender.prototype._onPartialSuccess = function (payload, results) {\n            var failed = [];\n            var retry = [];\n            // Iterate through the reversed array of errors so that splicing doesn't have invalid indexes after the first item.\n            var errors = results.errors.reverse();\n            for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                var error = errors_1[_i];\n                var extracted = payload.splice(error.index, 1)[0];\n                if (this._isRetriable(error.statusCode)) {\n                    retry.push(extracted);\n                }\n                else {\n                    // All other errors, including: 402 (Monthly quota exceeded) and 439 (Too many requests and refresh cache).\n                    failed.push(extracted);\n                }\n            }\n            if (payload.length > 0) {\n                this._onSuccess(payload, results.itemsAccepted);\n            }\n            if (failed.length > 0) {\n                this._onError(failed, this._formatErrorMessageXhr(null, ['partial success', results.itemsAccepted, 'of', results.itemsReceived].join(' ')));\n            }\n            if (retry.length > 0) {\n                this._resendPayload(retry);\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Partial success. \" +\n                    \"Delivered: \" + payload.length + \", Failed: \" + failed.length +\n                    \". Will retry to send \" + retry.length + \" our of \" + results.itemsReceived + \" items\");\n            }\n        };\n        /**\n         * success handler\n         */\n        Sender.prototype._onSuccess = function (payload, countOfItemsInPayload) {\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * xdr state changes\n         */\n        Sender.prototype._xdrOnLoad = function (xdr, payload) {\n            if (xdr && (xdr.responseText + \"\" === \"200\" || xdr.responseText === \"\")) {\n                this._consecutiveErrors = 0;\n                this._onSuccess(payload, 0);\n            }\n            else {\n                var results = this._parseResponse(xdr.responseText);\n                if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                    && !this._config.isRetryDisabled()) {\n                    this._onPartialSuccess(payload, results);\n                }\n                else {\n                    this._onError(payload, this._formatErrorMessageXdr(xdr));\n                }\n            }\n        };\n        Sender.prototype._constructEnvelope = function (envelope) {\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return EnvelopeCreator_1.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return EnvelopeCreator_1.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return EnvelopeCreator_1.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return EnvelopeCreator_1.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return EnvelopeCreator_1.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return EnvelopeCreator_1.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(this._logger, envelope);\n                default:\n                    // default create custom event type\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n            }\n        };\n        Sender._getDefaultAppInsightsChannelConfig = function (config, identifier) {\n            var resultConfig = {};\n            var pluginConfig = config.extensionConfig && config.extensionConfig[identifier] ? config.extensionConfig[identifier] : {};\n            // set default values\n            resultConfig.endpointUrl = function () { return config.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\"; };\n            resultConfig.emitLineDelimitedJson = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.emitLineDelimitedJson); };\n            resultConfig.maxBatchInterval = function () { return !isNaN(pluginConfig.maxBatchInterval) ? pluginConfig.maxBatchInterval : 15000; };\n            resultConfig.maxBatchSizeInBytes = function () { return pluginConfig.maxBatchSizeInBytes > 0 ? pluginConfig.maxBatchSizeInBytes : 102400; }; // 100kb\n            resultConfig.disableTelemetry = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.disableTelemetry); };\n            resultConfig.enableSessionStorageBuffer = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.enableSessionStorageBuffer, true); };\n            resultConfig.isRetryDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isRetryDisabled); };\n            resultConfig.isBeaconApiDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isBeaconApiDisabled, true); };\n            return resultConfig;\n        };\n        Sender._validate = function (envelope) {\n            // call the appropriate Validate depending on the baseType\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return TraceValidator_1.TraceValidator.TraceValidator.Validate(envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return ExceptionValidator_1.ExceptionValidator.ExceptionValidator.Validate(envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return MetricValidator_1.MetricValidator.MetricValidator.Validate(envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return PageViewValidator_1.PageViewValidator.PageViewValidator.Validate(envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return PageViewPerformanceValidator_1.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return RemoteDepdencyValidator_1.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(envelope);\n                default:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n            }\n        };\n        /**\n         * Send Beacon API request\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - not used\n         * Note: Beacon API does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._beaconSender = function (payload, isAsync) {\n            var url = this._config.endpointUrl();\n            var batch = this._buffer.batchPayloads(payload);\n            // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n            // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n            var plainTextBatch = new Blob([batch], { type: 'text/plain;charset=UTF-8' });\n            // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n            var queued = navigator.sendBeacon(url, plainTextBatch);\n            if (queued) {\n                this._buffer.markAsSent(payload);\n            }\n            else {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API.\");\n            }\n        };\n        /**\n         * Send XMLHttpRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         */\n        Sender.prototype._xhrSender = function (payload, isAsync) {\n            var _this = this;\n            var xhr = new XMLHttpRequest();\n            xhr[applicationinsights_common_1.DisabledPropertyName] = true;\n            xhr.open(\"POST\", this._config.endpointUrl(), isAsync);\n            xhr.setRequestHeader(\"Content-type\", \"application/json\");\n            // append Sdk-Context request header only in case of breeze endpoint \n            if (applicationinsights_common_1.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.sdkContextHeader, applicationinsights_common_1.RequestHeaders.sdkContextHeaderAppIdRequest);\n            }\n            xhr.onreadystatechange = function () { return _this._xhrReadyStateChange(xhr, payload, payload.length); };\n            xhr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXhr(xhr), event); };\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xhr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        /**\n         * Parses the response from the backend.\n         * @param response - XMLHttpRequest or XDomainRequest response\n         */\n        Sender.prototype._parseResponse = function (response) {\n            try {\n                if (response && response !== \"\") {\n                    var result = JSON.parse(response);\n                    if (result && result.itemsReceived && result.itemsReceived >= result.itemsAccepted &&\n                        result.itemsReceived - result.itemsAccepted == result.errors.length) {\n                        return result;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.InvalidBackendResponse, \"Cannot parse the response. \" + applicationinsights_common_1.Util.getExceptionName(e), {\n                    response: response\n                });\n            }\n            return null;\n        };\n        /**\n         * Resend payload. Adds payload back to the send buffer and setup a send timer (with exponential backoff).\n         * @param payload\n         */\n        Sender.prototype._resendPayload = function (payload) {\n            if (!payload || payload.length === 0) {\n                return;\n            }\n            this._buffer.clearSent(payload);\n            this._consecutiveErrors++;\n            for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                var item = payload_1[_i];\n                this._buffer.enqueue(item);\n            }\n            // setup timer\n            this._setRetryTime();\n            this._setupTimer();\n        };\n        /** Calculates the time to wait before retrying in case of an error based on\n         * http://en.wikipedia.org/wiki/Exponential_backoff\n         */\n        Sender.prototype._setRetryTime = function () {\n            var SlotDelayInSeconds = 10;\n            var delayInSeconds;\n            if (this._consecutiveErrors <= 1) {\n                delayInSeconds = SlotDelayInSeconds;\n            }\n            else {\n                var backOffSlot = (Math.pow(2, this._consecutiveErrors) - 1) / 2;\n                // tslint:disable-next-line:insecure-random\n                var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n            }\n            // TODO: Log the backoff time like the C# version does.\n            var retryAfterTimeSpan = Date.now() + (delayInSeconds * 1000);\n            // TODO: Log the retry at time like the C# version does.\n            this._retryAt = retryAfterTimeSpan;\n        };\n        /**\n         * Sets up the timer which triggers actually sending the data.\n         */\n        Sender.prototype._setupTimer = function () {\n            var _this = this;\n            if (!this._timeoutHandle) {\n                var retryInterval = this._retryAt ? Math.max(0, this._retryAt - Date.now()) : 0;\n                var timerValue = Math.max(this._config.maxBatchInterval(), retryInterval);\n                this._timeoutHandle = setTimeout(function () {\n                    _this.triggerSend();\n                }, timerValue);\n            }\n        };\n        /**\n         * Checks if the SDK should resend the payload after receiving this status code from the backend.\n         * @param statusCode\n         */\n        Sender.prototype._isRetriable = function (statusCode) {\n            return statusCode == 408 // Timeout\n                || statusCode == 429 // Too many requests.\n                || statusCode == 500 // Internal server error.\n                || statusCode == 503; // Service unavailable.\n        };\n        Sender.prototype._formatErrorMessageXhr = function (xhr, message) {\n            if (xhr) {\n                return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + xhr.responseText || xhr.response || \"\";\n            }\n            return message;\n        };\n        /**\n         * Send XDomainRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         *\n         * Note: XDomainRequest does not support sync requests. This 'isAsync' parameter is added\n         * to maintain consistency with the xhrSender's contract\n         * Note: XDomainRequest does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._xdrSender = function (payload, isAsync) {\n            var _this = this;\n            var xdr = new XDomainRequest();\n            xdr.onload = function () { return _this._xdrOnLoad(xdr, payload); };\n            xdr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXdr(xdr), event); };\n            // XDomainRequest requires the same protocol as the hosting page. \n            // If the protocol doesn't match, we can't send the telemetry :(. \n            var hostingProtocol = window.location.protocol;\n            if (this._config.endpointUrl().lastIndexOf(hostingProtocol, 0) !== 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                    \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                this._buffer.clear();\n                return;\n            }\n            var endpointUrl = this._config.endpointUrl().replace(/^(https?:)/, \"\");\n            xdr.open('POST', endpointUrl);\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xdr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        Sender.prototype._formatErrorMessageXdr = function (xdr, message) {\n            if (xdr) {\n                return \"XDomainRequest,Response:\" + xdr.responseText || \"\";\n            }\n            return message;\n        };\n        return Sender;\n    }());\n    exports.Sender = Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sender.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Serializer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Serializer = /** @class */ (function () {\n        function Serializer(logger) {\n            this._logger = logger;\n        }\n        /**\n         * Serializes the current object to a JSON string.\n         */\n        Serializer.prototype.serialize = function (input) {\n            var output = this._serializeObject(input, \"root\");\n            return JSON.stringify(output);\n        };\n        Serializer.prototype._serializeObject = function (source, name) {\n            var circularReferenceCheck = \"__aiCircularRefCheck\";\n            var output = {};\n            if (!source) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                return output;\n            }\n            if (source[circularReferenceCheck]) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CircularReferenceDetected, \"Circular reference detected while serializing object\", { name: name }, true);\n                return output;\n            }\n            if (!source.aiDataContract) {\n                // special case for measurements/properties/tags\n                if (name === \"measurements\") {\n                    output = this._serializeStringMap(source, \"number\", name);\n                }\n                else if (name === \"properties\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (name === \"tags\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (applicationinsights_common_1.Util.isArray(source)) {\n                    output = this._serializeArray(source, name);\n                }\n                else {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObjectNonSerializable, \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                    try {\n                        // verify that the object can be stringified\n                        JSON.stringify(source);\n                        output = source;\n                    }\n                    catch (e) {\n                        // if serialization fails return an empty string\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, (e && typeof e.toString === 'function') ? e.toString() : \"Error serializing object\", null, true);\n                    }\n                }\n                return output;\n            }\n            source[circularReferenceCheck] = true;\n            for (var field in source.aiDataContract) {\n                var contract = source.aiDataContract[field];\n                var isRequired = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Required) : (contract & applicationinsights_common_1.FieldType.Required);\n                var isHidden = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Hidden) : (contract & applicationinsights_common_1.FieldType.Hidden);\n                var isArray = contract & applicationinsights_common_1.FieldType.Array;\n                var isPresent = source[field] !== undefined;\n                var isObject = typeof source[field] === \"object\" && source[field] !== null;\n                if (isRequired && !isPresent && !isArray) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MissingRequiredFieldSpecification, \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    // If not in debug mode, continue and hope the error is permissible\n                    continue;\n                }\n                if (isHidden) {\n                    // Don't serialize hidden fields\n                    continue;\n                }\n                var value;\n                if (isObject) {\n                    if (isArray) {\n                        // special case; resurse on each object in the source array\n                        value = this._serializeArray(source[field], field);\n                    }\n                    else {\n                        // recurse on the source object in this field\n                        value = this._serializeObject(source[field], field);\n                    }\n                }\n                else {\n                    // assign the source field to the output even if undefined or required\n                    value = source[field];\n                }\n                // only emit this field if the value is defined\n                if (value !== undefined) {\n                    output[field] = value;\n                }\n            }\n            delete source[circularReferenceCheck];\n            return output;\n        };\n        Serializer.prototype._serializeArray = function (sources, name) {\n            var output = undefined;\n            if (!!sources) {\n                if (!applicationinsights_common_1.Util.isArray(sources)) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ItemNotInArray, \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                }\n                else {\n                    output = [];\n                    for (var i = 0; i < sources.length; i++) {\n                        var source = sources[i];\n                        var item = this._serializeObject(source, name + \"[\" + i + \"]\");\n                        output.push(item);\n                    }\n                }\n            }\n            return output;\n        };\n        Serializer.prototype._serializeStringMap = function (map, expectedType, name) {\n            var output = undefined;\n            if (map) {\n                output = {};\n                for (var field in map) {\n                    var value = map[field];\n                    if (expectedType === \"string\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else if (!value.toString) {\n                            output[field] = \"invalid field: toString() is not defined.\";\n                        }\n                        else {\n                            output[field] = value.toString();\n                        }\n                    }\n                    else if (expectedType === \"number\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else {\n                            var num = parseFloat(value);\n                            if (isNaN(num)) {\n                                output[field] = \"NaN\";\n                            }\n                            else {\n                                output[field] = num;\n                            }\n                        }\n                    }\n                    else {\n                        output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, output[field], null, true);\n                    }\n                }\n            }\n            return output;\n        };\n        return Serializer;\n    }());\n    exports.Serializer = Serializer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Serializer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var EventValidator = /** @class */ (function () {\n        function EventValidator() {\n        }\n        EventValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n            https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties || !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties || !item.domainProperties[\"name\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        EventValidator.EventValidator = new EventValidator();\n        return EventValidator;\n    }());\n    exports.EventValidator = EventValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var ExceptionValidator = /** @class */ (function () {\n        function ExceptionValidator() {\n        }\n        ExceptionValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"exceptions\"] ||\n                !ExceptionValidator._validateExceptions(item.domainProperties[\"exceptions\"])) {\n                return false;\n            }\n            */\n            return true;\n        };\n        // TODO implement validation of exceptions\n        ExceptionValidator._validateExceptions = function (exceptions) {\n            // typeName\n            // message\n            // parsedStack\n            // stack\n            // hasFullStack\n            return true;\n        };\n        ExceptionValidator.ExceptionValidator = new ExceptionValidator();\n        return ExceptionValidator;\n    }());\n    exports.ExceptionValidator = ExceptionValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var MetricValidator = /** @class */ (function () {\n        function MetricValidator() {\n        }\n        MetricValidator.prototype.Validate = function (event) {\n            return true;\n        };\n        MetricValidator.MetricValidator = new MetricValidator();\n        return MetricValidator;\n    }());\n    exports.MetricValidator = MetricValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\":\n/*!****************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js ***!\n  \\****************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformanceValidator = /** @class */ (function () {\n        function PageViewPerformanceValidator() {\n        }\n        PageViewPerformanceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n            \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"domProcessing\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"networkConnect\"] ||\n                !item.domainProperties[\"perfTotal\"] ||\n                !item.domainProperties[\"receivedResponse\"] ||\n                !item.domainProperties[\"sentRequest\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewPerformanceValidator.PageViewPerformanceValidator = new PageViewPerformanceValidator();\n        return PageViewPerformanceValidator;\n    }());\n    exports.PageViewPerformanceValidator = PageViewPerformanceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformanceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewValidator = /** @class */ (function () {\n        function PageViewValidator() {\n        }\n        PageViewValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewValidator.PageViewValidator = new PageViewValidator();\n        return PageViewValidator;\n    }());\n    exports.PageViewValidator = PageViewValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDepdencyValidator = /** @class */ (function () {\n        function RemoteDepdencyValidator() {\n        }\n        RemoteDepdencyValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"resultCode\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"success\"] ||\n                !item.domainProperties[\"data\"] ||\n                !item.domainProperties[\"target\"] ||\n                !item.domainProperties[\"type\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        RemoteDepdencyValidator.RemoteDepdencyValidator = new RemoteDepdencyValidator();\n        return RemoteDepdencyValidator;\n    }());\n    exports.RemoteDepdencyValidator = RemoteDepdencyValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDepdencyValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TraceValidator = /** @class */ (function () {\n        function TraceValidator() {\n        }\n        TraceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties ||\n                !item.domainProperties[\"message\"] ||\n                !item.domainProperties[\"severityLevel\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        TraceValidator.TraceValidator = new TraceValidator();\n        return TraceValidator;\n    }());\n    exports.TraceValidator = TraceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TraceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Sender */ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Sender_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Sender = Sender_1.Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-channel-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Constants.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Constants.js ***!\n  \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Constants.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Enums.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Enums.js ***!\n  \\*****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Type of storage to differentiate between local storage and session storage\n    */\n    var StorageType;\n    (function (StorageType) {\n        StorageType[StorageType[\"LocalStorage\"] = 0] = \"LocalStorage\";\n        StorageType[StorageType[\"SessionStorage\"] = 1] = \"SessionStorage\";\n    })(StorageType = exports.StorageType || (exports.StorageType = {}));\n    /**\n     * Enum is used in aiDataContract to describe how fields are serialized.\n     * For instance: (Fieldtype.Required | FieldType.Array) will mark the field as required and indicate it's an array\n     */\n    var FieldType;\n    (function (FieldType) {\n        FieldType[FieldType[\"Default\"] = 0] = \"Default\";\n        FieldType[FieldType[\"Required\"] = 1] = \"Required\";\n        FieldType[FieldType[\"Array\"] = 2] = \"Array\";\n        FieldType[FieldType[\"Hidden\"] = 4] = \"Hidden\";\n    })(FieldType = exports.FieldType || (exports.FieldType = {}));\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Enums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n         * Data struct to contain only C section with custom fields.\n         */\n    var Base = /** @class */ (function () {\n        function Base() {\n        }\n        return Base;\n    }());\n    exports.Base = Base;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Base.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    var ContextTagKeys = /** @class */ (function () {\n        function ContextTagKeys() {\n            this.applicationVersion = \"ai.application.ver\";\n            this.applicationBuild = \"ai.application.build\";\n            this.applicationTypeId = \"ai.application.typeId\";\n            this.applicationId = \"ai.application.applicationId\";\n            this.applicationLayer = \"ai.application.layer\";\n            this.deviceId = \"ai.device.id\";\n            this.deviceIp = \"ai.device.ip\";\n            this.deviceLanguage = \"ai.device.language\";\n            this.deviceLocale = \"ai.device.locale\";\n            this.deviceModel = \"ai.device.model\";\n            this.deviceFriendlyName = \"ai.device.friendlyName\";\n            this.deviceNetwork = \"ai.device.network\";\n            this.deviceNetworkName = \"ai.device.networkName\";\n            this.deviceOEMName = \"ai.device.oemName\";\n            this.deviceOS = \"ai.device.os\";\n            this.deviceOSVersion = \"ai.device.osVersion\";\n            this.deviceRoleInstance = \"ai.device.roleInstance\";\n            this.deviceRoleName = \"ai.device.roleName\";\n            this.deviceScreenResolution = \"ai.device.screenResolution\";\n            this.deviceType = \"ai.device.type\";\n            this.deviceMachineName = \"ai.device.machineName\";\n            this.deviceVMName = \"ai.device.vmName\";\n            this.deviceBrowser = \"ai.device.browser\";\n            this.deviceBrowserVersion = \"ai.device.browserVersion\";\n            this.locationIp = \"ai.location.ip\";\n            this.locationCountry = \"ai.location.country\";\n            this.locationProvince = \"ai.location.province\";\n            this.locationCity = \"ai.location.city\";\n            this.operationId = \"ai.operation.id\";\n            this.operationName = \"ai.operation.name\";\n            this.operationParentId = \"ai.operation.parentId\";\n            this.operationRootId = \"ai.operation.rootId\";\n            this.operationSyntheticSource = \"ai.operation.syntheticSource\";\n            this.operationCorrelationVector = \"ai.operation.correlationVector\";\n            this.sessionId = \"ai.session.id\";\n            this.sessionIsFirst = \"ai.session.isFirst\";\n            this.sessionIsNew = \"ai.session.isNew\";\n            this.userAccountAcquisitionDate = \"ai.user.accountAcquisitionDate\";\n            this.userAccountId = \"ai.user.accountId\";\n            this.userAgent = \"ai.user.userAgent\";\n            this.userId = \"ai.user.id\";\n            this.userStoreRegion = \"ai.user.storeRegion\";\n            this.userAuthUserId = \"ai.user.authUserId\";\n            this.userAnonymousUserAcquisitionDate = \"ai.user.anonUserAcquisitionDate\";\n            this.userAuthenticatedUserAcquisitionDate = \"ai.user.authUserAcquisitionDate\";\n            this.cloudName = \"ai.cloud.name\";\n            this.cloudRole = \"ai.cloud.role\";\n            this.cloudRoleVer = \"ai.cloud.roleVer\";\n            this.cloudRoleInstance = \"ai.cloud.roleInstance\";\n            this.cloudEnvironment = \"ai.cloud.environment\";\n            this.cloudLocation = \"ai.cloud.location\";\n            this.cloudDeploymentUnit = \"ai.cloud.deploymentUnit\";\n            this.internalSdkVersion = \"ai.internal.sdkVersion\";\n            this.internalAgentVersion = \"ai.internal.agentVersion\";\n            this.internalNodeName = \"ai.internal.nodeName\";\n        }\n        return ContextTagKeys;\n    }());\n    exports.ContextTagKeys = ContextTagKeys;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ContextTagKeys.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Base_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Data struct to contain both B and C sections.\n     */\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        function Data() {\n            return _super.call(this) || this;\n        }\n        return Data;\n    }(Base_1.Base));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./DataPointType */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPointType_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Metric data single measurement.\n     */\n    var DataPoint = /** @class */ (function () {\n        function DataPoint() {\n            this.kind = DataPointType_1.DataPointType.Measurement;\n        }\n        return DataPoint;\n    }());\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Type of the metric data measurement.\n     */\n    var DataPointType;\n    (function (DataPointType) {\n        DataPointType[DataPointType[\"Measurement\"] = 0] = \"Measurement\";\n        DataPointType[DataPointType[\"Aggregation\"] = 1] = \"Aggregation\";\n    })(DataPointType = exports.DataPointType || (exports.DataPointType = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPointType.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\":\n/*!*************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js ***!\n  \\*************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The abstract common base of all domains.\n     */\n    var Domain = /** @class */ (function () {\n        function Domain() {\n        }\n        return Domain;\n    }());\n    exports.Domain = Domain;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Domain.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * System variables for a telemetry item.\n     */\n    var Envelope = /** @class */ (function () {\n        function Envelope() {\n            this.ver = 1;\n            this.sampleRate = 100.0;\n            this.tags = {};\n        }\n        return Envelope;\n    }());\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Event represent structured event records that can be grouped and searched by their properties. Event data item also creates a metric of event count by name.\n     */\n    var EventData = /** @class */ (function (_super) {\n        __extends(EventData, _super);\n        function EventData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return EventData;\n    }(Domain_1.Domain));\n    exports.EventData = EventData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Exception represents a handled or unhandled exception that occurred during execution of the monitored application.\n     */\n    var ExceptionData = /** @class */ (function (_super) {\n        __extends(ExceptionData, _super);\n        function ExceptionData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.exceptions = [];\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return ExceptionData;\n    }(Domain_1.Domain));\n    exports.ExceptionData = ExceptionData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Exception details of the exception in a chain.\n     */\n    var ExceptionDetails = /** @class */ (function () {\n        function ExceptionDetails() {\n            this.hasFullStack = true;\n            this.parsedStack = [];\n        }\n        return ExceptionDetails;\n    }());\n    exports.ExceptionDetails = ExceptionDetails;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionDetails.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Message represent printf-like trace statements that are text-searched. Log4Net, NLog and other text-based log file entries are translated into intances of this type. The message does not have measurements.\n     */\n    var MessageData = /** @class */ (function (_super) {\n        __extends(MessageData, _super);\n        function MessageData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            return _this;\n        }\n        return MessageData;\n    }(Domain_1.Domain));\n    exports.MessageData = MessageData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MessageData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of the Metric item is a list of measurements (single data points) and/or aggregations.\n     */\n    var MetricData = /** @class */ (function (_super) {\n        __extends(MetricData, _super);\n        function MetricData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.metrics = [];\n            _this.properties = {};\n            return _this;\n        }\n        return MetricData;\n    }(Domain_1.Domain));\n    exports.MetricData = MetricData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\":\n/*!*******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js ***!\n  \\*******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageView represents a generic action on a page like a button click. It is also the base type for PageView.\n     */\n    var PageViewData = /** @class */ (function (_super) {\n        __extends(PageViewData, _super);\n        function PageViewData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewData;\n    }(EventData_1.EventData));\n    exports.PageViewData = PageViewData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageViewPerf represents: a page view with no performance data, a page view with performance data, or just the performance data of an earlier page request.\n     */\n    var PageViewPerfData = /** @class */ (function (_super) {\n        __extends(PageViewPerfData, _super);\n        function PageViewPerfData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewPerfData;\n    }(PageViewData_1.PageViewData));\n    exports.PageViewPerfData = PageViewPerfData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerfData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\":\n/*!***************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js ***!\n  \\***************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Remote Dependency represents an interaction of the monitored component with a remote component/service like SQL or an HTTP endpoint.\n     */\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        function RemoteDependencyData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.success = true;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return RemoteDependencyData;\n    }(Domain_1.Domain));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Defines the level of severity for the event.\n    */\n    var SeverityLevel;\n    (function (SeverityLevel) {\n        SeverityLevel[SeverityLevel[\"Verbose\"] = 0] = \"Verbose\";\n        SeverityLevel[SeverityLevel[\"Information\"] = 1] = \"Information\";\n        SeverityLevel[SeverityLevel[\"Warning\"] = 2] = \"Warning\";\n        SeverityLevel[SeverityLevel[\"Error\"] = 3] = \"Error\";\n        SeverityLevel[SeverityLevel[\"Critical\"] = 4] = \"Critical\";\n    })(SeverityLevel = exports.SeverityLevel || (exports.SeverityLevel = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SeverityLevel.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Stack frame information.\n     */\n    var StackFrame = /** @class */ (function () {\n        function StackFrame() {\n        }\n        return StackFrame;\n    }());\n    exports.StackFrame = StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=StackFrame.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RequestHeaders = /** @class */ (function () {\n        function RequestHeaders() {\n        }\n        /**\n         * Request-Context header\n         */\n        RequestHeaders.requestContextHeader = \"Request-Context\";\n        /**\n         * Target instrumentation header that is added to the response and retrieved by the\n         * calling application when processing incoming responses.\n         */\n        RequestHeaders.requestContextTargetKey = \"appId\";\n        /**\n         * Request-Context appId format\n         */\n        RequestHeaders.requestContextAppIdFormat = \"appId=cid-v1:\";\n        /**\n         * Request-Id header\n         */\n        RequestHeaders.requestIdHeader = \"Request-Id\";\n        /**\n         * Sdk-Context header\n         * If this header passed with appId in content then appId will be returned back by the backend.\n         */\n        RequestHeaders.sdkContextHeader = \"Sdk-Context\";\n        /**\n         * String to pass in header for requesting appId back from the backend.\n         */\n        RequestHeaders.sdkContextHeaderAppIdRequest = \"appId\";\n        RequestHeaders.requestContextHeaderLowerCase = \"request-context\";\n        return RequestHeaders;\n    }());\n    exports.RequestHeaders = RequestHeaders;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RequestResponseHeaders.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Data_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Data(baseType, data) {\n            var _this = _super.call(this) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                baseType: Enums_1.FieldType.Required,\n                baseData: Enums_1.FieldType.Required\n            };\n            _this.baseType = baseType;\n            _this.baseData = data;\n            return _this;\n        }\n        return Data;\n    }(Data_1.Data));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPoint_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataPoint = /** @class */ (function (_super) {\n        __extends(DataPoint, _super);\n        function DataPoint() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                name: Enums_1.FieldType.Required,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Required,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default\n            };\n            return _this;\n        }\n        return DataPoint;\n    }(DataPoint_1.DataPoint));\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataSanitizer = /** @class */ (function () {\n        function DataSanitizer() {\n        }\n        DataSanitizer.sanitizeKeyAndAddUniqueness = function (logger, key, map) {\n            var origLength = key.length;\n            var field = DataSanitizer.sanitizeKey(logger, key);\n            // validation truncated the length.  We need to add uniqueness\n            if (field.length !== origLength) {\n                var i = 0;\n                var uniqueField = field;\n                while (map[uniqueField] !== undefined) {\n                    i++;\n                    uniqueField = field.substring(0, DataSanitizer.MAX_NAME_LENGTH - 3) + DataSanitizer.padNumber(i);\n                }\n                field = uniqueField;\n            }\n            return field;\n        };\n        DataSanitizer.sanitizeKey = function (logger, name) {\n            if (name) {\n                // Remove any leading or trailing whitepace\n                name = Util_1.Util.trim(name.toString());\n                // truncate the string to 150 chars\n                if (name.length > DataSanitizer.MAX_NAME_LENGTH) {\n                    name = name.substring(0, DataSanitizer.MAX_NAME_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NameTooLong, \"name is too long.  It has been truncated to \" + DataSanitizer.MAX_NAME_LENGTH + \" characters.\", { name: name }, true);\n                }\n            }\n            return name;\n        };\n        DataSanitizer.sanitizeString = function (logger, value, maxLength) {\n            if (maxLength === void 0) { maxLength = DataSanitizer.MAX_STRING_LENGTH; }\n            if (value) {\n                maxLength = maxLength ? maxLength : DataSanitizer.MAX_STRING_LENGTH; // in case default parameters dont work\n                value = Util_1.Util.trim(value);\n                if (value.toString().length > maxLength) {\n                    value = value.toString().substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StringValueTooLong, \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n                }\n            }\n            return value;\n        };\n        DataSanitizer.sanitizeUrl = function (logger, url) {\n            return DataSanitizer.sanitizeInput(logger, url, DataSanitizer.MAX_URL_LENGTH, applicationinsights_core_js_1._InternalMessageId.UrlTooLong);\n        };\n        DataSanitizer.sanitizeMessage = function (logger, message) {\n            if (message) {\n                if (message.length > DataSanitizer.MAX_MESSAGE_LENGTH) {\n                    message = message.substring(0, DataSanitizer.MAX_MESSAGE_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.MessageTruncated, \"message is too long, it has been truncated to \" + DataSanitizer.MAX_MESSAGE_LENGTH + \" characters.\", { message: message }, true);\n                }\n            }\n            return message;\n        };\n        DataSanitizer.sanitizeException = function (logger, exception) {\n            if (exception) {\n                if (exception.length > DataSanitizer.MAX_EXCEPTION_LENGTH) {\n                    exception = exception.substring(0, DataSanitizer.MAX_EXCEPTION_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ExceptionTruncated, \"exception is too long, it has been truncated to \" + DataSanitizer.MAX_EXCEPTION_LENGTH + \" characters.\", { exception: exception }, true);\n                }\n            }\n            return exception;\n        };\n        DataSanitizer.sanitizeProperties = function (logger, properties) {\n            if (properties) {\n                var tempProps = {};\n                for (var prop in properties) {\n                    var value = DataSanitizer.sanitizeString(logger, properties[prop], DataSanitizer.MAX_PROPERTY_LENGTH);\n                    prop = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, prop, tempProps);\n                    tempProps[prop] = value;\n                }\n                properties = tempProps;\n            }\n            return properties;\n        };\n        DataSanitizer.sanitizeMeasurements = function (logger, measurements) {\n            if (measurements) {\n                var tempMeasurements = {};\n                for (var measure in measurements) {\n                    var value = measurements[measure];\n                    measure = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements);\n                    tempMeasurements[measure] = value;\n                }\n                measurements = tempMeasurements;\n            }\n            return measurements;\n        };\n        DataSanitizer.sanitizeId = function (logger, id) {\n            return id ? DataSanitizer.sanitizeInput(logger, id, DataSanitizer.MAX_ID_LENGTH, applicationinsights_core_js_1._InternalMessageId.IdTooLong).toString() : id;\n        };\n        DataSanitizer.sanitizeInput = function (logger, input, maxLength, _msgId) {\n            if (input) {\n                input = Util_1.Util.trim(input);\n                if (input.length > maxLength) {\n                    input = input.substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n                }\n            }\n            return input;\n        };\n        DataSanitizer.padNumber = function (num) {\n            var s = \"00\" + num;\n            return s.substr(s.length - 3);\n        };\n        /**\n        * Max length allowed for custom names.\n        */\n        DataSanitizer.MAX_NAME_LENGTH = 150;\n        /**\n         * Max length allowed for Id field in page views.\n         */\n        DataSanitizer.MAX_ID_LENGTH = 128;\n        /**\n         * Max length allowed for custom values.\n         */\n        DataSanitizer.MAX_PROPERTY_LENGTH = 8192;\n        /**\n         * Max length allowed for names\n         */\n        DataSanitizer.MAX_STRING_LENGTH = 1024;\n        /**\n         * Max length allowed for url.\n         */\n        DataSanitizer.MAX_URL_LENGTH = 2048;\n        /**\n         * Max length allowed for messages.\n         */\n        DataSanitizer.MAX_MESSAGE_LENGTH = 32768;\n        /**\n         * Max length allowed for exceptions.\n         */\n        DataSanitizer.MAX_EXCEPTION_LENGTH = 32768;\n        return DataSanitizer;\n    }());\n    exports.DataSanitizer = DataSanitizer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataSanitizer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\":\n/*!*************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js ***!\n  \\*************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Envelope */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\"), __webpack_require__(/*! ./DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Envelope_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Envelope = /** @class */ (function (_super) {\n        __extends(Envelope, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Envelope(logger, data, name) {\n            var _this = _super.call(this) || this;\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.data = data;\n            _this.time = Util_1.Util.toISOStringForIE8(new Date());\n            _this.aiDataContract = {\n                time: Enums_1.FieldType.Required,\n                iKey: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                sampleRate: function () {\n                    return (_this.sampleRate == 100) ? Enums_1.FieldType.Hidden : Enums_1.FieldType.Required;\n                },\n                tags: Enums_1.FieldType.Required,\n                data: Enums_1.FieldType.Required\n            };\n            return _this;\n        }\n        return Envelope;\n    }(Envelope_1.Envelope));\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Event.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Event = /** @class */ (function (_super) {\n        __extends(Event, _super);\n        /**\n         * Constructs a new instance of the EventTelemetry object\n         */\n        function Event(logger, name, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n        Event.dataType = \"EventData\";\n        return Event;\n    }(EventData_1.EventData));\n    exports.Event = Event;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Event.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/StackFrame */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionDetails */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, StackFrame_1, ExceptionData_1, ExceptionDetails_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Exception = /** @class */ (function (_super) {\n        __extends(Exception, _super);\n        /**\n        * Constructs a new isntance of the ExceptionTelemetry object\n        */\n        function Exception(logger, exception, properties, measurements, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                exceptions: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            _this.exceptions = [new _ExceptionDetails(logger, exception)];\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        /**\n        * Creates a simple exception with 1 stack frame. Useful for manual constracting of exception.\n        */\n        Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n            return {\n                exceptions: [\n                    {\n                        hasFullStack: true,\n                        message: message,\n                        stack: details,\n                        typeName: typeName\n                    }\n                ]\n            };\n        };\n        Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n        Exception.dataType = \"ExceptionData\";\n        return Exception;\n    }(ExceptionData_1.ExceptionData));\n    exports.Exception = Exception;\n    var _ExceptionDetails = /** @class */ (function (_super) {\n        __extends(_ExceptionDetails, _super);\n        function _ExceptionDetails(logger, exception) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Default,\n                outerId: Enums_1.FieldType.Default,\n                typeName: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                hasFullStack: Enums_1.FieldType.Default,\n                stack: Enums_1.FieldType.Default,\n                parsedStack: Enums_1.FieldType.Array\n            };\n            _this.typeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, exception.name) || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, exception.message) || Util_1.Util.NotSpecified;\n            var stack = exception[\"stack\"];\n            _this.parsedStack = _this.parseStack(stack);\n            _this.stack = DataSanitizer_1.DataSanitizer.sanitizeException(logger, stack);\n            _this.hasFullStack = Util_1.Util.isArray(_this.parsedStack) && _this.parsedStack.length > 0;\n            return _this;\n        }\n        _ExceptionDetails.prototype.parseStack = function (stack) {\n            var parsedStack = undefined;\n            if (typeof stack === \"string\") {\n                var frames = stack.split('\\n');\n                parsedStack = [];\n                var level = 0;\n                var totalSizeInBytes = 0;\n                for (var i = 0; i <= frames.length; i++) {\n                    var frame = frames[i];\n                    if (_StackFrame.regex.test(frame)) {\n                        var parsedFrame = new _StackFrame(frames[i], level++);\n                        totalSizeInBytes += parsedFrame.sizeInBytes;\n                        parsedStack.push(parsedFrame);\n                    }\n                }\n                // DP Constraint - exception parsed stack must be < 32KB\n                // remove frames from the middle to meet the threshold\n                var exceptionParsedStackThreshold = 32 * 1024;\n                if (totalSizeInBytes > exceptionParsedStackThreshold) {\n                    var left = 0;\n                    var right = parsedStack.length - 1;\n                    var size = 0;\n                    var acceptedLeft = left;\n                    var acceptedRight = right;\n                    while (left < right) {\n                        // check size\n                        var lSize = parsedStack[left].sizeInBytes;\n                        var rSize = parsedStack[right].sizeInBytes;\n                        size += lSize + rSize;\n                        if (size > exceptionParsedStackThreshold) {\n                            // remove extra frames from the middle\n                            var howMany = acceptedRight - acceptedLeft + 1;\n                            parsedStack.splice(acceptedLeft, howMany);\n                            break;\n                        }\n                        // update pointers\n                        acceptedLeft = left;\n                        acceptedRight = right;\n                        left++;\n                        right--;\n                    }\n                }\n            }\n            return parsedStack;\n        };\n        return _ExceptionDetails;\n    }(ExceptionDetails_1.ExceptionDetails));\n    var _StackFrame = /** @class */ (function (_super) {\n        __extends(_StackFrame, _super);\n        function _StackFrame(frame, level) {\n            var _this = _super.call(this) || this;\n            _this.sizeInBytes = 0;\n            _this.aiDataContract = {\n                level: Enums_1.FieldType.Required,\n                method: Enums_1.FieldType.Required,\n                assembly: Enums_1.FieldType.Default,\n                fileName: Enums_1.FieldType.Default,\n                line: Enums_1.FieldType.Default\n            };\n            _this.level = level;\n            _this.method = \"<no_method>\";\n            _this.assembly = Util_1.Util.trim(frame);\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches.length >= 5) {\n                _this.method = Util_1.Util.trim(matches[2]) || _this.method;\n                _this.fileName = Util_1.Util.trim(matches[4]);\n                _this.line = parseInt(matches[5]) || 0;\n            }\n            _this.sizeInBytes += _this.method.length;\n            _this.sizeInBytes += _this.fileName.length;\n            _this.sizeInBytes += _this.assembly.length;\n            // todo: these might need to be removed depending on how the back-end settles on their size calculation\n            _this.sizeInBytes += _StackFrame.baseSize;\n            _this.sizeInBytes += _this.level.toString().length;\n            _this.sizeInBytes += _this.line.toString().length;\n            return _this;\n        }\n        // regex to match stack frames from ie/chrome/ff\n        // methodName=$2, fileName=$4, lineNo=$5, column=$6\n        _StackFrame.regex = /^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n        _StackFrame.baseSize = 58; //'{\"method\":\"\",\"level\":,\"assembly\":\"\",\"fileName\":\"\",\"line\":}'.length\n        return _StackFrame;\n    }(StackFrame_1.StackFrame));\n    exports._StackFrame = _StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Exception.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js ***!\n  \\****************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MetricData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MetricData_1, DataSanitizer_1, Enums_1, DataPoint_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Metric = /** @class */ (function (_super) {\n        __extends(Metric, _super);\n        /**\n         * Constructs a new instance of the MetricTelemetry object\n         */\n        function Metric(logger, name, value, count, min, max, properties) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                metrics: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default\n            };\n            var dataPoint = new DataPoint_1.DataPoint();\n            dataPoint.count = count > 0 ? count : undefined;\n            dataPoint.max = isNaN(max) || max === null ? undefined : max;\n            dataPoint.min = isNaN(min) || min === null ? undefined : min;\n            dataPoint.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            dataPoint.value = value;\n            _this.metrics = [dataPoint];\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            return _this;\n        }\n        Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n        Metric.dataType = \"MetricData\";\n        return Metric;\n    }(MetricData_1.MetricData));\n    exports.Metric = Metric;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Metric.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageView = /** @class */ (function (_super) {\n        __extends(PageView, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageView(logger, name, url, durationMs, properties, measurements, id) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                id: Enums_1.FieldType.Default,\n            };\n            _this.id = DataSanitizer_1.DataSanitizer.sanitizeId(logger, id);\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            if (!isNaN(durationMs)) {\n                _this.duration = Util_1.Util.msToTimeSpan(durationMs);\n            }\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n        PageView.dataType = \"PageviewData\";\n        return PageView;\n    }(PageViewData_1.PageViewData));\n    exports.PageView = PageView;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageView.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewPerfData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewPerfData_1, Enums_1, DataSanitizer_1, Util_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformance = /** @class */ (function (_super) {\n        __extends(PageViewPerformance, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageViewPerformance(logger, name, url, unused, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                perfTotal: Enums_1.FieldType.Default,\n                networkConnect: Enums_1.FieldType.Default,\n                sentRequest: Enums_1.FieldType.Default,\n                receivedResponse: Enums_1.FieldType.Default,\n                domProcessing: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.isValid = false;\n            /*\n             * http://www.w3.org/TR/navigation-timing/#processing-model\n             *  |-navigationStart\n             *  |             |-connectEnd\n             *  |             ||-requestStart\n             *  |             ||             |-responseStart\n             *  |             ||             |              |-responseEnd\n             *  |             ||             |              |\n             *  |             ||             |              |         |-loadEventEnd\n             *  |---network---||---request---|---response---|---dom---|\n             *  |--------------------------total----------------------|\n             */\n            var timing = PageViewPerformance.getPerformanceTiming();\n            if (timing) {\n                var total = PageViewPerformance.getDuration(timing.navigationStart, timing.loadEventEnd);\n                var network = PageViewPerformance.getDuration(timing.navigationStart, timing.connectEnd);\n                var request = PageViewPerformance.getDuration(timing.requestStart, timing.responseStart);\n                var response = PageViewPerformance.getDuration(timing.responseStart, timing.responseEnd);\n                var dom = PageViewPerformance.getDuration(timing.responseEnd, timing.loadEventEnd);\n                if (total == 0) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ErrorPVCalc, \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (!PageViewPerformance.shouldCollectDuration(total, network, request, response, dom)) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.InvalidDurationValue, \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                    // some browsers may report individual components incorrectly so that the sum of the parts will be bigger than total PLT\n                    // in this case, don't report client performance from this page\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ClientPerformanceMathError, \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else {\n                    _this.durationMs = total;\n                    // convert to timespans\n                    _this.perfTotal = _this.duration = Util_1.Util.msToTimeSpan(total);\n                    _this.networkConnect = Util_1.Util.msToTimeSpan(network);\n                    _this.sentRequest = Util_1.Util.msToTimeSpan(request);\n                    _this.receivedResponse = Util_1.Util.msToTimeSpan(response);\n                    _this.domProcessing = Util_1.Util.msToTimeSpan(dom);\n                    _this.isValid = true;\n                }\n            }\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        /**\n         * Indicates whether this instance of PageViewPerformance is valid and should be sent\n         */\n        PageViewPerformance.prototype.getIsValid = function () {\n            return this.isValid;\n        };\n        /**\n        * Gets the total duration (PLT) in milliseconds. Check getIsValid() before using this method.\n        */\n        PageViewPerformance.prototype.getDurationMs = function () {\n            return this.durationMs;\n        };\n        PageViewPerformance.getPerformanceTiming = function () {\n            if (PageViewPerformance.isPerformanceTimingSupported()) {\n                return window.performance.timing;\n            }\n            return null;\n        };\n        /**\n        * Returns true is window performance timing API is supported, false otherwise.\n        */\n        PageViewPerformance.isPerformanceTimingSupported = function () {\n            return typeof window != \"undefined\" && window.performance && window.performance.timing;\n        };\n        /**\n         * As page loads different parts of performance timing numbers get set. When all of them are set we can report it.\n         * Returns true if ready, false otherwise.\n         */\n        PageViewPerformance.isPerformanceTimingDataReady = function () {\n            var timing = window.performance.timing;\n            return timing.domainLookupStart > 0\n                && timing.navigationStart > 0\n                && timing.responseStart > 0\n                && timing.requestStart > 0\n                && timing.loadEventEnd > 0\n                && timing.responseEnd > 0\n                && timing.connectEnd > 0\n                && timing.domLoading > 0;\n        };\n        PageViewPerformance.getDuration = function (start, end) {\n            var duration = undefined;\n            if (!(isNaN(start) || isNaN(end))) {\n                duration = Math.max(end - start, 0);\n            }\n            return duration;\n        };\n        /**\n         * This method tells if given durations should be excluded from collection.\n         */\n        PageViewPerformance.shouldCollectDuration = function () {\n            var durations = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                durations[_i] = arguments[_i];\n            }\n            // a full list of Google crawlers user agent strings - https://support.google.com/webmasters/answer/1061943?hl=en\n            var botAgentNames = ['googlebot', 'adsbot-google', 'apis-google', 'mediapartners-google'];\n            var userAgent = navigator.userAgent;\n            var isGoogleBot = false;\n            if (userAgent) {\n                for (var i_1 = 0; i_1 < botAgentNames.length; i_1++) {\n                    isGoogleBot = isGoogleBot || userAgent.toLowerCase().indexOf(botAgentNames[i_1]) !== -1;\n                }\n            }\n            if (isGoogleBot) {\n                // Don't report durations for GoogleBot, it is returning invalid values in performance.timing API. \n                return false;\n            }\n            else {\n                // for other page views, don't report if it's outside of a reasonable range\n                for (var i = 0; i < durations.length; i++) {\n                    if (durations[i] >= PageViewPerformance.MAX_DURATION_ALLOWED) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        };\n        PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n        PageViewPerformance.dataType = \"PageviewPerformanceData\";\n        PageViewPerformance.MAX_DURATION_ALLOWED = 3600000; // 1h\n        return PageViewPerformance;\n    }(PageViewPerfData_1.PageViewPerfData));\n    exports.PageViewPerformance = PageViewPerformance;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformance.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataSanitizer_1, Enums_1, Util_1, Util_2, RemoteDependencyData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        /**\n         * Constructs a new instance of the RemoteDependencyData object\n         */\n        function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Required,\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                resultCode: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                success: Enums_1.FieldType.Default,\n                data: Enums_1.FieldType.Default,\n                target: Enums_1.FieldType.Default,\n                type: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Default,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default,\n                dependencyKind: Enums_1.FieldType.Default,\n                dependencySource: Enums_1.FieldType.Default,\n                commandName: Enums_1.FieldType.Default,\n                dependencyTypeName: Enums_1.FieldType.Default,\n            };\n            _this.id = id;\n            _this.duration = Util_1.Util.msToTimeSpan(value);\n            _this.success = success;\n            _this.resultCode = resultCode + \"\";\n            _this.type = \"Ajax\";\n            _this.data = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, commandName);\n            var dependencyFields = Util_2.AjaxHelper.ParseDependencyPath(logger, absoluteUrl, method, commandName);\n            _this.target = dependencyFields.target;\n            _this.name = dependencyFields.name;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n        RemoteDependencyData.dataType = \"RemoteDependencyData\";\n        return RemoteDependencyData;\n    }(RemoteDependencyData_1.RemoteDependencyData));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MessageData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MessageData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Trace = /** @class */ (function (_super) {\n        __extends(Trace, _super);\n        /**\n         * Constructs a new instance of the TraceTelemetry object\n         */\n        function Trace(logger, message, properties, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default\n            };\n            message = message || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, message);\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n        Trace.dataType = \"MessageData\";\n        return Trace;\n    }(MessageData_1.MessageData));\n    exports.Trace = Trace;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Trace.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\":\n/*!********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js ***!\n  \\********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, DataSanitizer_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TelemetryItemCreator = /** @class */ (function () {\n        function TelemetryItemCreator() {\n        }\n        /**\n         * Create a telemetry item that the 1DS channel understands\n         * @param item domain specific properties; part B\n         * @param baseType telemetry item type. ie PageViewData\n         * @param envelopeName name of the envelope. ie Microsoft.ApplicationInsights.<instrumentation key>.PageView\n         * @param customProperties user defined custom properties; part C\n         * @param systemProperties system properties that are added to the context; part A\n         * @returns ITelemetryItem that is sent to channel\n         */\n        TelemetryItemCreator.create = function (item, baseType, envelopeName, logger, customProperties, systemProperties) {\n            envelopeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, envelopeName) || Util_1.Util.NotSpecified;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(item) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(baseType) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(envelopeName)) {\n                throw Error(\"Input doesn't contain all required fields\");\n            }\n            var telemetryItem = {\n                name: envelopeName,\n                timestamp: new Date(),\n                instrumentationKey: \"\",\n                ctx: systemProperties ? systemProperties : {},\n                tags: [],\n                data: {},\n                baseType: baseType,\n                baseData: item\n            };\n            // Part C\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties)) {\n                for (var prop in customProperties) {\n                    if (customProperties.hasOwnProperty(prop)) {\n                        telemetryItem.data[prop] = customProperties[prop];\n                    }\n                }\n            }\n            return telemetryItem;\n        };\n        return TelemetryItemCreator;\n    }());\n    exports.TelemetryItemCreator = TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TelemetryItemCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Util.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Util.js ***!\n  \\****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Enums_1, applicationinsights_core_js_1, RequestResponseHeaders_1, DataSanitizer_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Util = /** @class */ (function () {\n        function Util() {\n        }\n        /*\n         * Force the SDK not to use local and session storage\n        */\n        Util.disableStorage = function () {\n            Util._canUseLocalStorage = false;\n            Util._canUseSessionStorage = false;\n        };\n        /**\n         * Gets the localStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getLocalStorageObject = function () {\n            if (Util.canUseLocalStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return null;\n        };\n        /**\n         * Tests storage object (localStorage or sessionStorage) to verify that it is usable\n         * More details here: https://mathiasbynens.be/notes/localstorage-pattern\n         * @param storageType Type of storage\n         * @return {Storage} Returns storage object verified that it is usable\n         */\n        Util._getVerifiedStorageObject = function (storageType) {\n            var storage = null;\n            var fail;\n            var uid;\n            try {\n                uid = new Date;\n                storage = storageType === Enums_1.StorageType.LocalStorage ? window.localStorage : window.sessionStorage;\n                storage.setItem(uid, uid);\n                fail = storage.getItem(uid) != uid;\n                storage.removeItem(uid);\n                if (fail) {\n                    storage = null;\n                }\n            }\n            catch (exception) {\n                storage = null;\n            }\n            return storage;\n        };\n        /**\n         *  Checks if endpoint URL is application insights internal injestion service URL.\n         *\n         *  @param endpointUrl Endpoint URL to check.\n         *  @returns {boolean} True if if endpoint URL is application insights internal injestion service URL.\n         */\n        Util.isInternalApplicationInsightsEndpoint = function (endpointUrl) {\n            return Util._internalEndpoints.indexOf(endpointUrl.toLowerCase()) !== -1;\n        };\n        /**\n         *  Check if the browser supports local storage.\n         *\n         *  @returns {boolean} True if local storage is supported.\n         */\n        Util.canUseLocalStorage = function () {\n            if (Util._canUseLocalStorage === undefined) {\n                Util._canUseLocalStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return Util._canUseLocalStorage;\n        };\n        /**\n         *  Get an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadLocalStorage, \"Browser failed read of local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's local storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setStorage = function (logger, name, data) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteLocalStorage, \"Browser failed write to local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromLocalStorage, \"Browser failed removal of local storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         * Gets the sessionStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getSessionStorageObject = function () {\n            if (Util.canUseSessionStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return null;\n        };\n        /**\n         *  Check if the browser supports session storage.\n         *\n         *  @returns {boolean} True if session storage is supported.\n         */\n        Util.canUseSessionStorage = function () {\n            if (Util._canUseSessionStorage === undefined) {\n                Util._canUseSessionStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return Util._canUseSessionStorage;\n        };\n        /**\n         *  Gets the list of session storage keys\n         *\n         *  @returns {string[]} List of session storage keys\n         */\n        Util.getSessionStorageKeys = function () {\n            var keys = [];\n            if (Util.canUseSessionStorage()) {\n                for (var key in window.sessionStorage) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n        /**\n         *  Get an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadSessionStorage, \"Browser failed read of session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's session storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setSessionStorage = function (logger, name, data) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteSessionStorage, \"Browser failed write to session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromSessionStorage, \"Browser failed removal of session storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /*\n         * Force the SDK not to store and read any data from cookies\n         */\n        Util.disableCookies = function () {\n            Util._canUseCookies = false;\n        };\n        /*\n         * helper method to tell if document.cookie object is available\n         */\n        Util.canUseCookies = function (logger) {\n            if (Util._canUseCookies === undefined) {\n                Util._canUseCookies = false;\n                try {\n                    Util._canUseCookies = Util.document.cookie !== undefined;\n                }\n                catch (e) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotAccessCookie, \"Cannot access document.cookie - \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n                ;\n            }\n            return Util._canUseCookies;\n        };\n        /**\n         * helper method to set userId and sessionId cookie\n         */\n        Util.setCookie = function (logger, name, value, domain) {\n            var domainAttrib = \"\";\n            var secureAttrib = \"\";\n            if (domain) {\n                domainAttrib = \";domain=\" + domain;\n            }\n            if (Util.document.location && Util.document.location.protocol === \"https:\") {\n                secureAttrib = \";secure\";\n            }\n            if (Util.canUseCookies(logger)) {\n                Util.document.cookie = name + \"=\" + value + domainAttrib + \";path=/\" + secureAttrib;\n            }\n        };\n        Util.stringToBoolOrDefault = function (str, defaultValue) {\n            if (defaultValue === void 0) { defaultValue = false; }\n            if (str === undefined || str === null) {\n                return defaultValue;\n            }\n            return str.toString().toLowerCase() === \"true\";\n        };\n        /**\n         * helper method to access userId and sessionId cookie\n         */\n        Util.getCookie = function (logger, name) {\n            if (!Util.canUseCookies(logger)) {\n                return;\n            }\n            var value = \"\";\n            if (name && name.length) {\n                var cookieName = name + \"=\";\n                var cookies = Util.document.cookie.split(\";\");\n                for (var i = 0; i < cookies.length; i++) {\n                    var cookie = cookies[i];\n                    cookie = Util.trim(cookie);\n                    if (cookie && cookie.indexOf(cookieName) === 0) {\n                        value = cookie.substring(cookieName.length, cookies[i].length);\n                        break;\n                    }\n                }\n            }\n            return value;\n        };\n        /**\n         * Deletes a cookie by setting it's expiration time in the past.\n         * @param name - The name of the cookie to delete.\n         */\n        Util.deleteCookie = function (logger, name) {\n            if (Util.canUseCookies(logger)) {\n                // Setting the expiration date in the past immediately removes the cookie\n                Util.document.cookie = name + \"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n            }\n        };\n        /**\n         * helper method to trim strings (IE8 does not implement String.prototype.trim)\n         */\n        Util.trim = function (str) {\n            if (typeof str !== \"string\")\n                return str;\n            return str.replace(/^\\s+|\\s+$/g, \"\");\n        };\n        /**\n         * generate random id string\n         */\n        Util.newId = function () {\n            var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            var result = \"\";\n            // tslint:disable-next-line:insecure-random\n            var random = Math.random() * 1073741824; //5 symbols in base64, almost maxint\n            while (random > 0) {\n                var char = base64chars.charAt(random % 64);\n                result += char;\n                random = Math.floor(random / 64);\n            }\n            return result;\n        };\n        /**\n         * Check if an object is of type Array\n         */\n        Util.isArray = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n        /**\n         * Check if an object is of type Error\n         */\n        Util.isError = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Error]\";\n        };\n        /**\n         * Check if an object is of type Date\n         */\n        Util.isDate = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Date]\";\n        };\n        /**\n         * Convert a date to I.S.O. format in IE8\n         */\n        Util.toISOStringForIE8 = function (date) {\n            if (Util.isDate(date)) {\n                if (Date.prototype.toISOString) {\n                    return date.toISOString();\n                }\n                else {\n                    var pad = function (num) {\n                        var r = String(num);\n                        if (r.length === 1) {\n                            r = \"0\" + r;\n                        }\n                        return r;\n                    };\n                    return date.getUTCFullYear()\n                        + \"-\" + pad(date.getUTCMonth() + 1)\n                        + \"-\" + pad(date.getUTCDate())\n                        + \"T\" + pad(date.getUTCHours())\n                        + \":\" + pad(date.getUTCMinutes())\n                        + \":\" + pad(date.getUTCSeconds())\n                        + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                        + \"Z\";\n                }\n            }\n        };\n        /**\n         * Gets IE version if we are running on IE, or null otherwise\n         */\n        Util.getIEVersion = function (userAgentStr) {\n            if (userAgentStr === void 0) { userAgentStr = null; }\n            var myNav = userAgentStr ? userAgentStr.toLowerCase() : navigator.userAgent.toLowerCase();\n            return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : null;\n        };\n        /**\n         * Convert ms to c# time span format\n         */\n        Util.msToTimeSpan = function (totalms) {\n            if (isNaN(totalms) || totalms < 0) {\n                totalms = 0;\n            }\n            totalms = Math.round(totalms);\n            var ms = \"\" + totalms % 1000;\n            var sec = \"\" + Math.floor(totalms / 1000) % 60;\n            var min = \"\" + Math.floor(totalms / (1000 * 60)) % 60;\n            var hour = \"\" + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n            var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n            ms = ms.length === 1 ? \"00\" + ms : ms.length === 2 ? \"0\" + ms : ms;\n            sec = sec.length < 2 ? \"0\" + sec : sec;\n            min = min.length < 2 ? \"0\" + min : min;\n            hour = hour.length < 2 ? \"0\" + hour : hour;\n            return (days > 0 ? days + \".\" : \"\") + hour + \":\" + min + \":\" + sec + \".\" + ms;\n        };\n        /**\n        * Checks if error has no meaningful data inside. Ususally such errors are received by window.onerror when error\n        * happens in a script from other domain (cross origin, CORS).\n        */\n        Util.isCrossOriginError = function (message, url, lineNumber, columnNumber, error) {\n            return (message === \"Script error.\" || message === \"Script error\") && !error;\n        };\n        /**\n        * Returns string representation of an object suitable for diagnostics logging.\n        */\n        Util.dump = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            var propertyValueDump = JSON.stringify(object);\n            if (objectTypeDump === \"[object Error]\") {\n                propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n            }\n            return objectTypeDump + propertyValueDump;\n        };\n        /**\n        * Returns the name of object if it's an Error. Otherwise, returns empty string.\n        */\n        Util.getExceptionName = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            if (objectTypeDump === \"[object Error]\") {\n                return object.name;\n            }\n            return \"\";\n        };\n        /**\n         * Adds an event handler for the specified event\n         * @param eventName {string} - The name of the event\n         * @param callback {any} - The callback function that needs to be executed for the given event\n         * @return {boolean} - true if the handler was successfully added\n         */\n        Util.addEventHandler = function (eventName, callback) {\n            if (!window || typeof eventName !== 'string' || typeof callback !== 'function') {\n                return false;\n            }\n            // Create verb for the event\n            var verbEventName = 'on' + eventName;\n            // check if addEventListener is available\n            if (window.addEventListener) {\n                window.addEventListener(eventName, callback, false);\n            }\n            else if (window[\"attachEvent\"]) {\n                window[\"attachEvent\"](verbEventName, callback);\n            }\n            else {\n                return false;\n            }\n            return true;\n        };\n        /**\n         * Tells if a browser supports a Beacon API\n         */\n        Util.IsBeaconApiSupported = function () {\n            return ('sendBeacon' in navigator && navigator.sendBeacon);\n        };\n        Util.document = typeof document !== \"undefined\" ? document : {};\n        Util._canUseCookies = undefined;\n        Util._canUseLocalStorage = undefined;\n        Util._canUseSessionStorage = undefined;\n        // listing only non-geo specific locations \n        Util._internalEndpoints = [\n            \"https://dc.services.visualstudio.com/v2/track\",\n            \"https://breeze.aimon.applicationinsights.io/v2/track\",\n            \"https://dc-int.services.visualstudio.com/v2/track\"\n        ];\n        Util.NotSpecified = \"not_specified\";\n        return Util;\n    }());\n    exports.Util = Util;\n    var UrlHelper = /** @class */ (function () {\n        function UrlHelper() {\n        }\n        UrlHelper.parseUrl = function (url) {\n            if (!UrlHelper.htmlAnchorElement) {\n                UrlHelper.htmlAnchorElement = !!UrlHelper.document.createElement ? UrlHelper.document.createElement('a') : {};\n            }\n            UrlHelper.htmlAnchorElement.href = url;\n            return UrlHelper.htmlAnchorElement;\n        };\n        UrlHelper.getAbsoluteUrl = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.href;\n            }\n            return result;\n        };\n        UrlHelper.getPathName = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.pathname;\n            }\n            return result;\n        };\n        UrlHelper.getCompleteUrl = function (method, absoluteUrl) {\n            if (method) {\n                return method.toUpperCase() + \" \" + absoluteUrl;\n            }\n            else {\n                return absoluteUrl;\n            }\n        };\n        UrlHelper.document = typeof document !== \"undefined\" ? document : {};\n        return UrlHelper;\n    }());\n    exports.UrlHelper = UrlHelper;\n    var CorrelationIdHelper = /** @class */ (function () {\n        function CorrelationIdHelper() {\n        }\n        /**\n        * Checks if a request url is not on a excluded domain list and if it is safe to add correlation headers\n        */\n        CorrelationIdHelper.canIncludeCorrelationHeader = function (config, requestUrl, currentHost) {\n            if (config && config.disableCorrelationHeaders) {\n                return false;\n            }\n            if (!requestUrl) {\n                return false;\n            }\n            var requestHost = UrlHelper.parseUrl(requestUrl).host.toLowerCase();\n            if ((!config || !config.enableCorsCorrelation) && requestHost !== currentHost) {\n                return false;\n            }\n            var excludedDomains = config && config.correlationHeaderExcludedDomains;\n            if (!excludedDomains || excludedDomains.length == 0) {\n                return true;\n            }\n            for (var i = 0; i < excludedDomains.length; i++) {\n                var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\./g, \"\\.\").replace(/\\*/g, \".*\"));\n                if (regex.test(requestHost)) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n        * Combines target appId and target role name from response header.\n        */\n        CorrelationIdHelper.getCorrelationContext = function (responseHeader) {\n            if (responseHeader) {\n                var correlationId = CorrelationIdHelper.getCorrelationContextValue(responseHeader, RequestResponseHeaders_1.RequestHeaders.requestContextTargetKey);\n                if (correlationId && correlationId !== CorrelationIdHelper.correlationIdPrefix) {\n                    return correlationId;\n                }\n            }\n        };\n        /**\n        * Gets key from correlation response header\n        */\n        CorrelationIdHelper.getCorrelationContextValue = function (responseHeader, key) {\n            if (responseHeader) {\n                var keyValues = responseHeader.split(\",\");\n                for (var i = 0; i < keyValues.length; ++i) {\n                    var keyValue = keyValues[i].split(\"=\");\n                    if (keyValue.length == 2 && keyValue[0] == key) {\n                        return keyValue[1];\n                    }\n                }\n            }\n        };\n        CorrelationIdHelper.correlationIdPrefix = \"cid-v1:\";\n        return CorrelationIdHelper;\n    }());\n    exports.CorrelationIdHelper = CorrelationIdHelper;\n    var AjaxHelper = /** @class */ (function () {\n        function AjaxHelper() {\n        }\n        AjaxHelper.ParseDependencyPath = function (logger, absoluteUrl, method, pathName) {\n            var target, name;\n            if (absoluteUrl && absoluteUrl.length > 0) {\n                var parsedUrl = UrlHelper.parseUrl(absoluteUrl);\n                target = parsedUrl.host;\n                if (parsedUrl.pathname != null) {\n                    var pathName = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                    if (pathName.charAt(0) !== '/') {\n                        pathName = \"/\" + pathName;\n                    }\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, method ? method + \" \" + pathName : pathName);\n                }\n                else {\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, absoluteUrl);\n                }\n            }\n            else {\n                target = pathName;\n                name = pathName;\n            }\n            return {\n                target: target,\n                name: name\n            };\n        };\n        return AjaxHelper;\n    }());\n    exports.AjaxHelper = AjaxHelper;\n    /**\n     * A utility class that helps getting time related parameters\n     */\n    var DateTimeUtils = /** @class */ (function () {\n        function DateTimeUtils() {\n        }\n        /**\n         * Get the number of milliseconds since 1970/01/01 in local timezone\n         */\n        DateTimeUtils.Now = (window.performance && window.performance.now && window.performance.timing) ?\n            function () {\n                return window.performance.now() + window.performance.timing.navigationStart;\n            }\n            :\n                function () {\n                    return new Date().getTime();\n                };\n        /**\n         * Gets duration between two timestamps\n         */\n        DateTimeUtils.GetDuration = function (start, end) {\n            var result = null;\n            if (start !== 0 && end !== 0 && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(start) && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(end)) {\n                result = end - start;\n            }\n            return result;\n        };\n        return DateTimeUtils;\n    }());\n    exports.DateTimeUtils = DateTimeUtils;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Util.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/applicationinsights-common.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Constants */ \"./node_modules/applicationinsights-common/bundle/Constants.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\"), __webpack_require__(/*! ./Telemetry/Common/Envelope */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\"), __webpack_require__(/*! ./Telemetry/Event */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\"), __webpack_require__(/*! ./Telemetry/Exception */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\"), __webpack_require__(/*! ./Telemetry/Metric */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\"), __webpack_require__(/*! ./Telemetry/PageView */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Telemetry/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\"), __webpack_require__(/*! ./Telemetry/Trace */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\"), __webpack_require__(/*! ./Telemetry/PageViewPerformance */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\"), __webpack_require__(/*! ./Telemetry/Common/Data */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/SeverityLevel */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/ContextTagKeys */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ./TelemetryItemCreator */ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, Enums_1, RequestResponseHeaders_1, Constants_1, Data_1, Base_1, Envelope_1, Event_1, Exception_1, Metric_1, PageView_1, PageViewData_1, RemoteDependencyData_1, Trace_1, PageViewPerformance_1, Data_2, SeverityLevel_1, ContextTagKeys_1, DataSanitizer_1, TelemetryItemCreator_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Util = Util_1.Util;\n    exports.CorrelationIdHelper = Util_1.CorrelationIdHelper;\n    exports.UrlHelper = Util_1.UrlHelper;\n    exports.DateTimeUtils = Util_1.DateTimeUtils;\n    exports.FieldType = Enums_1.FieldType;\n    exports.RequestHeaders = RequestResponseHeaders_1.RequestHeaders;\n    exports.DisabledPropertyName = Constants_1.DisabledPropertyName;\n    exports.AIData = Data_1.Data;\n    exports.AIBase = Base_1.Base;\n    exports.Envelope = Envelope_1.Envelope;\n    exports.Event = Event_1.Event;\n    exports.Exception = Exception_1.Exception;\n    exports.Metric = Metric_1.Metric;\n    exports.PageView = PageView_1.PageView;\n    exports.PageViewData = PageViewData_1.PageViewData;\n    exports.RemoteDependencyData = RemoteDependencyData_1.RemoteDependencyData;\n    exports.Trace = Trace_1.Trace;\n    exports.PageViewPerformance = PageViewPerformance_1.PageViewPerformance;\n    exports.Data = Data_2.Data;\n    exports.SeverityLevel = SeverityLevel_1.SeverityLevel;\n    exports.ContextTagKeys = ContextTagKeys_1.ContextTagKeys;\n    exports.DataSanitizer = DataSanitizer_1.DataSanitizer;\n    exports.TelemetryItemCreator = TelemetryItemCreator_1.TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-common.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n     */\n    exports.EventsDiscardedReason = {\n        /**\n         * Unknown.\n         */\n        Unknown: 0,\n        /**\n         * Status set to non-retryable.\n         */\n        NonRetryableStatus: 1,\n        /**\n         * The event is invalid.\n         */\n        InvalidEvent: 2,\n        /**\n         * The size of the event is too large.\n         */\n        SizeLimitExceeded: 3,\n        /**\n         * The server is not accepting events from this instrumentation key.\n         */\n        KillSwitch: 4,\n        /**\n         * The event queue is full.\n         */\n        QueueFull: 5,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventsDiscardedReason.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\":\n/*!*********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js ***!\n  \\*********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var LoggingSeverity;\n    (function (LoggingSeverity) {\n        /**\n         * Error will be sent as internal telemetry\n         */\n        LoggingSeverity[LoggingSeverity[\"CRITICAL\"] = 1] = \"CRITICAL\";\n        /**\n         * Error will NOT be sent as internal telemetry, and will only be shown in browser console\n         */\n        LoggingSeverity[LoggingSeverity[\"WARNING\"] = 2] = \"WARNING\";\n    })(LoggingSeverity = exports.LoggingSeverity || (exports.LoggingSeverity = {}));\n    /**\n     * Internal message ID. Please create a new one for every conceptually different message. Please keep alphabetically ordered\n     */ ;\n    exports._InternalMessageId = {\n        // Non user actionable\n        BrowserDoesNotSupportLocalStorage: 0,\n        BrowserCannotReadLocalStorage: 1,\n        BrowserCannotReadSessionStorage: 2,\n        BrowserCannotWriteLocalStorage: 3,\n        BrowserCannotWriteSessionStorage: 4,\n        BrowserFailedRemovalFromLocalStorage: 5,\n        BrowserFailedRemovalFromSessionStorage: 6,\n        CannotSendEmptyTelemetry: 7,\n        ClientPerformanceMathError: 8,\n        ErrorParsingAISessionCookie: 9,\n        ErrorPVCalc: 10,\n        ExceptionWhileLoggingError: 11,\n        FailedAddingTelemetryToBuffer: 12,\n        FailedMonitorAjaxAbort: 13,\n        FailedMonitorAjaxDur: 14,\n        FailedMonitorAjaxOpen: 15,\n        FailedMonitorAjaxRSC: 16,\n        FailedMonitorAjaxSend: 17,\n        FailedMonitorAjaxGetCorrelationHeader: 18,\n        FailedToAddHandlerForOnBeforeUnload: 19,\n        FailedToSendQueuedTelemetry: 20,\n        FailedToReportDataLoss: 21,\n        FlushFailed: 22,\n        MessageLimitPerPVExceeded: 23,\n        MissingRequiredFieldSpecification: 24,\n        NavigationTimingNotSupported: 25,\n        OnError: 26,\n        SessionRenewalDateIsZero: 27,\n        SenderNotInitialized: 28,\n        StartTrackEventFailed: 29,\n        StopTrackEventFailed: 30,\n        StartTrackFailed: 31,\n        StopTrackFailed: 32,\n        TelemetrySampledAndNotSent: 33,\n        TrackEventFailed: 34,\n        TrackExceptionFailed: 35,\n        TrackMetricFailed: 36,\n        TrackPVFailed: 37,\n        TrackPVFailedCalc: 38,\n        TrackTraceFailed: 39,\n        TransmissionFailed: 40,\n        FailedToSetStorageBuffer: 41,\n        FailedToRestoreStorageBuffer: 42,\n        InvalidBackendResponse: 43,\n        FailedToFixDepricatedValues: 44,\n        InvalidDurationValue: 45,\n        TelemetryEnvelopeInvalid: 46,\n        CreateEnvelopeError: 47,\n        // User actionable\n        CannotSerializeObject: 48,\n        CannotSerializeObjectNonSerializable: 49,\n        CircularReferenceDetected: 50,\n        ClearAuthContextFailed: 51,\n        ExceptionTruncated: 52,\n        IllegalCharsInName: 53,\n        ItemNotInArray: 54,\n        MaxAjaxPerPVExceeded: 55,\n        MessageTruncated: 56,\n        NameTooLong: 57,\n        SampleRateOutOfRange: 58,\n        SetAuthContextFailed: 59,\n        SetAuthContextFailedAccountName: 60,\n        StringValueTooLong: 61,\n        StartCalledMoreThanOnce: 62,\n        StopCalledWithoutStart: 63,\n        TelemetryInitializerFailed: 64,\n        TrackArgumentsNotSpecified: 65,\n        UrlTooLong: 66,\n        SessionStorageBufferFull: 67,\n        CannotAccessCookie: 68,\n        IdTooLong: 69,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=LoggingEnums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = 100;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=IChannelControls.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventsDiscardedReason_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var AppInsightsCore = /** @class */ (function () {\n        function AppInsightsCore() {\n            this._isInitialized = false;\n            this._extensions = new Array();\n            this._channelController = new ChannelController();\n        }\n        AppInsightsCore.prototype.initialize = function (config, extensions) {\n            var _this = this;\n            // Make sure core is only initialized once\n            if (this._isInitialized) {\n                throw Error(\"Core should not be initialized more than once\");\n            }\n            if (!config || CoreUtils_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                throw Error(\"Please provide instrumentation key\");\n            }\n            this.config = config;\n            this._notificationManager = new NotificationManager_1.NotificationManager();\n            this.config.extensions = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensions) ? [] : this.config.extensions;\n            // add notification to the extensions in the config so other plugins can access it\n            this.config.extensionConfig = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensionConfig) ? {} : this.config.extensionConfig;\n            this.config.extensionConfig.NotificationManager = this._notificationManager;\n            this.logger = new DiagnosticLogger_1.DiagnosticLogger(config);\n            // Initial validation\n            extensions.forEach(function (extension) {\n                if (CoreUtils_1.CoreUtils.isNullOrUndefined(extension.initialize)) {\n                    throw Error(validationError);\n                }\n            });\n            if (this.config.extensions.length > 0) {\n                var isValid_1 = true;\n                this.config.extensions.forEach(function (item) {\n                    if (CoreUtils_1.CoreUtils.isNullOrUndefined(item)) {\n                        isValid_1 = false;\n                    }\n                });\n                if (!isValid_1) {\n                    throw Error(validationError);\n                }\n            }\n            // Initial validation complete\n            // Concat all available extensions before sorting by priority\n            (_a = this._extensions).push.apply(_a, [this._channelController].concat(extensions, this.config.extensions));\n            this._extensions = this._extensions.sort(function (a, b) {\n                var extA = a;\n                var extB = b;\n                var typeExtA = typeof extA.processTelemetry;\n                var typeExtB = typeof extB.processTelemetry;\n                if (typeExtA === 'function' && typeExtB === 'function') {\n                    return extA.priority - extB.priority;\n                }\n                if (typeExtA === 'function' && typeExtB !== 'function') {\n                    // keep non telemetryplugin specific extensions at start\n                    return 1;\n                }\n                if (typeExtA !== 'function' && typeExtB === 'function') {\n                    return -1;\n                }\n            });\n            // sort complete\n            // Check if any two extensions have the same priority, then warn to console\n            var priority = {};\n            this._extensions.forEach(function (ext) {\n                var t = ext;\n                if (t && t.priority) {\n                    if (!CoreUtils_1.CoreUtils.isNullOrUndefined(priority[t.priority])) {\n                        _this.logger.warnToConsole(\"Two extensions have same priority\" + priority[t.priority] + \", \" + t.identifier);\n                    }\n                    else {\n                        priority[t.priority] = t.identifier; // set a value\n                    }\n                }\n            });\n            // initialize plugins including channel controller\n            this._extensions.forEach(function (ext) {\n                var e = ext;\n                if (e && e.priority <= ChannelControllerPriority) {\n                    ext.initialize(_this.config, _this, _this._extensions); // initialize\n                }\n            });\n            var c = -1;\n            // Set next plugin for all until channel controller\n            for (var idx = 0; idx < this._extensions.length - 1; idx++) {\n                var curr = (this._extensions[idx]);\n                if (curr && typeof curr.processTelemetry !== 'function') {\n                    // these are initialized only, allowing an entry point for extensions to be initialized when SDK initializes\n                    continue;\n                }\n                if (curr.priority === ChannelControllerPriority) {\n                    c = idx + 1;\n                    break; // channel controller will set remaining pipeline\n                }\n                this._extensions[idx].setNextPlugin(this._extensions[idx + 1]); // set next plugin\n            }\n            // Remove sender channels from main list\n            if (c < this._extensions.length) {\n                this._extensions.splice(c);\n            }\n            if (this.getTransmissionControls().length === 0) {\n                throw new Error(\"No channels available\");\n            }\n            this._isInitialized = true;\n            var _a;\n        };\n        AppInsightsCore.prototype.getTransmissionControls = function () {\n            return this._channelController.ChannelControls;\n        };\n        AppInsightsCore.prototype.track = function (telemetryItem) {\n            if (telemetryItem === null) {\n                this._notifiyInvalidEvent(telemetryItem);\n                // throw error\n                throw Error(\"Invalid telemetry item\");\n            }\n            if (telemetryItem.baseData && !telemetryItem.baseType) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"Provide data.baseType for data.baseData\");\n            }\n            if (!telemetryItem.baseType) {\n                // Hard coded from Common::Event.ts::Event.dataType\n                telemetryItem.baseType = \"EventData\";\n            }\n            if (!telemetryItem.instrumentationKey) {\n                // setup default ikey if not passed in\n                telemetryItem.instrumentationKey = this.config.instrumentationKey;\n            }\n            if (!telemetryItem.timestamp) {\n                // add default timestamp if not passed in\n                telemetryItem.timestamp = new Date();\n            }\n            // do basic validation before sending it through the pipeline\n            this._validateTelmetryItem(telemetryItem);\n            // invoke any common telemetry processors before sending through pipeline\n            var i = 0;\n            while (i < this._extensions.length) {\n                if (this._extensions[i].processTelemetry) {\n                    this._extensions[i].processTelemetry(telemetryItem); // pass on to first extension that can support processing\n                    break;\n                }\n                i++;\n            }\n        };\n        /**\n         * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n         * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n         * called.\n         * @param {INotificationListener} listener - An INotificationListener object.\n         */\n        AppInsightsCore.prototype.addNotificationListener = function (listener) {\n            this._notificationManager.addNotificationListener(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - INotificationListener to remove.\n         */\n        AppInsightsCore.prototype.removeNotificationListener = function (listener) {\n            this._notificationManager.removeNotificationListener(listener);\n        };\n        /**\n         * Periodically check logger.queue for\n         */\n        AppInsightsCore.prototype.pollInternalLogs = function () {\n            var _this = this;\n            if (!(this.config.diagnosticLoggingInterval > 0)) {\n                throw Error(\"config.diagnosticLoggingInterval must be a positive integer\");\n            }\n            return setInterval(function () {\n                var queue = _this.logger.queue;\n                queue.forEach(function (logMessage) {\n                    var item = {\n                        name: \"InternalMessageId: \" + logMessage.messageId,\n                        instrumentationKey: _this.config.instrumentationKey,\n                        timestamp: new Date(),\n                        baseType: DiagnosticLogger_1._InternalLogMessage.dataType,\n                        baseData: { message: logMessage.message }\n                    };\n                    _this.track(item);\n                });\n                queue.length = 0;\n            }, this.config.diagnosticLoggingInterval);\n        };\n        AppInsightsCore.prototype._validateTelmetryItem = function (telemetryItem) {\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.name)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry name required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.timestamp)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry timestamp required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.instrumentationKey)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry instrumentationKey required\");\n            }\n        };\n        AppInsightsCore.prototype._notifiyInvalidEvent = function (telemetryItem) {\n            this._notificationManager.eventsDiscarded([telemetryItem], EventsDiscardedReason_1.EventsDiscardedReason.InvalidEvent);\n        };\n        return AppInsightsCore;\n    }());\n    exports.AppInsightsCore = AppInsightsCore;\n    var ChannelController = /** @class */ (function () {\n        function ChannelController() {\n            this.identifier = \"ChannelControllerPlugin\";\n            this.priority = ChannelControllerPriority; // in reserved range 100 to 200\n        }\n        ChannelController.prototype.processTelemetry = function (item) {\n            this.channelQueue.forEach(function (queues) {\n                // pass on to first item in queue\n                if (queues.length > 0) {\n                    queues[0].processTelemetry(item);\n                }\n            });\n        };\n        Object.defineProperty(ChannelController.prototype, \"ChannelControls\", {\n            get: function () {\n                return this.channelQueue;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        ChannelController.prototype.initialize = function (config, core, extensions) {\n            var _this = this;\n            this.channelQueue = new Array();\n            if (config.channels) {\n                config.channels.forEach(function (queue) {\n                    if (queue && queue.length > 0) {\n                        queue = queue.sort(function (a, b) {\n                            return a.priority - b.priority;\n                        });\n                        // Initialize each plugin\n                        queue.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                        for (var i = 1; i < queue.length; i++) {\n                            queue[i - 1].setNextPlugin(queue[i]); // setup processing chain\n                        }\n                        _this.channelQueue.push(queue);\n                    }\n                });\n            }\n            else {\n                var arr = new Array();\n                for (var i = 0; i < extensions.length; i++) {\n                    var plugin = extensions[i];\n                    if (plugin.priority > ChannelControllerPriority) {\n                        arr.push(plugin);\n                    }\n                }\n                if (arr.length > 0) {\n                    // sort if not sorted\n                    arr = arr.sort(function (a, b) {\n                        return a.priority - b.priority;\n                    });\n                    // Initialize each plugin\n                    arr.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                    // setup next plugin\n                    for (var i = 1; i < arr.length; i++) {\n                        arr[i - 1].setNextPlugin(arr[i]);\n                    }\n                    this.channelQueue.push(arr);\n                }\n            }\n        };\n        return ChannelController;\n    }());\n    var validationError = \"Extensions must provide callback to initialize\";\n    var ChannelControllerPriority = 200;\n    var duplicatePriority = \"One or more extensions are set at same priority\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=AppInsightsCore.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var CoreUtils = /** @class */ (function () {\n        function CoreUtils() {\n        }\n        CoreUtils.isNullOrUndefined = function (input) {\n            return input === null || input === undefined;\n        };\n        /**\n    * Creates a new GUID.\n    * @return {string} A GUID.\n    */\n        CoreUtils.newGuid = function () {\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(GuidRegex, function (c) {\n                var r = (Math.random() * 16 | 0), v = (c === 'x' ? r : r & 0x3 | 0x8);\n                return v.toString(16);\n            });\n        };\n        return CoreUtils;\n    }());\n    exports.CoreUtils = CoreUtils;\n    var GuidRegex = /[xy]/g;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=CoreUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\":\n/*!*******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js ***!\n  \\*******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, LoggingEnums_1, CoreUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var _InternalLogMessage = /** @class */ (function () {\n        function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            this.messageId = msgId;\n            this.message =\n                (isUserAct ? _InternalLogMessage.AiUserActionablePrefix : _InternalLogMessage.AiNonUserActionablePrefix) +\n                    msgId;\n            var diagnosticText = (msg ? \" message:\" + _InternalLogMessage.sanitizeDiagnosticText(msg) : \"\") +\n                (properties ? \" props:\" + _InternalLogMessage.sanitizeDiagnosticText(JSON.stringify(properties)) : \"\");\n            this.message += diagnosticText;\n        }\n        _InternalLogMessage.sanitizeDiagnosticText = function (text) {\n            return \"\\\"\" + text.replace(/\\\"/g, \"\") + \"\\\"\";\n        };\n        _InternalLogMessage.dataType = \"MessageData\";\n        /**\n         * For user non actionable traces use AI Internal prefix.\n         */\n        _InternalLogMessage.AiNonUserActionablePrefix = \"AI (Internal): \";\n        /**\n         * Prefix of the traces in portal.\n         */\n        _InternalLogMessage.AiUserActionablePrefix = \"AI: \";\n        return _InternalLogMessage;\n    }());\n    exports._InternalLogMessage = _InternalLogMessage;\n    var DiagnosticLogger = /** @class */ (function () {\n        function DiagnosticLogger(config) {\n            /**\n            *  Session storage key for the prefix for the key indicating message type already logged\n            */\n            this.AIInternalMessagePrefix = \"AITR_\";\n            /**\n             * When this is true the SDK will throw exceptions to aid in debugging.\n             */\n            this.enableDebugExceptions = function () { return false; };\n            /**\n             * 0: OFF\n             * 1: CRITICAL (default)\n             * 2: >= WARNING\n             */\n            this.consoleLoggingLevel = function () { return 1; };\n            /**\n             * 0: OFF (default)\n             * 1: CRITICAL\n             * 2: >= WARNING\n             */\n            this.telemetryLoggingLevel = function () { return 0; };\n            /**\n             * The maximum number of internal messages allowed to be sent per page view\n             */\n            this.maxInternalMessageLimit = function () { return 25; };\n            /**\n             * The internal logging queue\n             */\n            this.queue = [];\n            /**\n             * Count of internal messages sent\n             */\n            this._messageCount = 0;\n            /**\n             * Holds information about what message types were already logged to console or sent to server.\n             */\n            this._messageLogged = {};\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(config)) {\n                // TODO: Use default config\n                // config = AppInsightsCore.defaultConfig;\n                // For now, use defaults specified in DiagnosticLogger members;\n                return;\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelConsole)) {\n                this.consoleLoggingLevel = function () { return config.loggingLevelConsole; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelTelemetry)) {\n                this.telemetryLoggingLevel = function () { return config.loggingLevelTelemetry; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.maxMessageLimit)) {\n                this.maxInternalMessageLimit = function () { return config.maxMessageLimit; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.enableDebugExceptions)) {\n                this.enableDebugExceptions = function () { return config.enableDebugExceptions; };\n            }\n        }\n        /**\n         * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The log message.\n         */\n        DiagnosticLogger.prototype.throwInternal = function (severity, msgId, msg, properties, isUserAct) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n            if (this.enableDebugExceptions()) {\n                throw message;\n            }\n            else {\n                if (typeof (message) !== \"undefined\" && !!message) {\n                    if (typeof (message.message) !== \"undefined\") {\n                        if (isUserAct) {\n                            // check if this message type was already logged to console for this page view and if so, don't log it again\n                            var messageKey = +message.messageId;\n                            if (!this._messageLogged[messageKey] || this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                                this._messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            // don't log internal AI traces in the console, unless the verbose logging is enabled\n                            if (this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                            }\n                        }\n                        this.logInternalMessage(severity, message);\n                    }\n                }\n            }\n        };\n        /**\n         * This will write a warning to the console if possible\n         * @param message {string} - The warning message\n         */\n        DiagnosticLogger.prototype.warnToConsole = function (message) {\n            if (typeof console !== \"undefined\" && !!console) {\n                if (typeof console.warn === \"function\") {\n                    console.warn(message);\n                }\n                else if (typeof console.log === \"function\") {\n                    console.log(message);\n                }\n            }\n        };\n        /**\n         * Resets the internal message count\n         */\n        DiagnosticLogger.prototype.resetInternalMessageCount = function () {\n            this._messageCount = 0;\n            this._messageLogged = {};\n        };\n        /**\n         * Logs a message to the internal queue.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The message to log.\n         */\n        DiagnosticLogger.prototype.logInternalMessage = function (severity, message) {\n            if (this._areInternalMessagesThrottled()) {\n                return;\n            }\n            // check if this message type was already logged for this session and if so, don't log it again\n            var logMessage = true;\n            var messageKey = this.AIInternalMessagePrefix + message.messageId;\n            // if the session storage is not available, limit to only one message type per page view\n            if (this._messageLogged[messageKey]) {\n                logMessage = false;\n            }\n            else {\n                this._messageLogged[messageKey] = true;\n            }\n            if (logMessage) {\n                // Push the event in the internal queue\n                if (severity <= this.telemetryLoggingLevel()) {\n                    this.queue.push(message);\n                    this._messageCount++;\n                }\n                // When throttle limit reached, send a special event\n                if (this._messageCount == this.maxInternalMessageLimit()) {\n                    var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                    var throttleMessage = new _InternalLogMessage(LoggingEnums_1._InternalMessageId.MessageLimitPerPVExceeded, throttleLimitMessage, false);\n                    this.queue.push(throttleMessage);\n                    this.warnToConsole(throttleLimitMessage);\n                }\n            }\n        };\n        /**\n         * Indicates whether the internal events are throttled\n         */\n        DiagnosticLogger.prototype._areInternalMessagesThrottled = function () {\n            return this._messageCount >= this.maxInternalMessageLimit();\n        };\n        return DiagnosticLogger;\n    }());\n    exports.DiagnosticLogger = DiagnosticLogger;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DiagnosticLogger.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Class to manage sending notifications to all the listeners.\n     */\n    var NotificationManager = /** @class */ (function () {\n        function NotificationManager() {\n            this.listeners = [];\n        }\n        /**\n         * Adds a notification listener.\n         * @param {INotificationListener} listener - The notification listener to be added.\n         */\n        NotificationManager.prototype.addNotificationListener = function (listener) {\n            this.listeners.push(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - AWTNotificationListener to remove.\n         */\n        NotificationManager.prototype.removeNotificationListener = function (listener) {\n            var index = this.listeners.indexOf(listener);\n            while (index > -1) {\n                this.listeners.splice(index, 1);\n                index = this.listeners.indexOf(listener);\n            }\n        };\n        /**\n         * Notification for events sent.\n         * @param {ITelemetryItem[]} events - The array of events that have been sent.\n         */\n        NotificationManager.prototype.eventsSent = function (events) {\n            var _this = this;\n            var _loop_1 = function (i) {\n                if (this_1.listeners[i].eventsSent) {\n                    setTimeout(function () { return _this.listeners[i].eventsSent(events); }, 0);\n                }\n            };\n            var this_1 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_1(i);\n            }\n        };\n        /**\n         * Notification for events being discarded.\n         * @param {ITelemetryItem[]} events - The array of events that have been discarded by the SDK.\n         * @param {number} reason           - The reason for which the SDK discarded the events. The EventsDiscardedReason\n         * constant should be used to check the different values.\n         */\n        NotificationManager.prototype.eventsDiscarded = function (events, reason) {\n            var _this = this;\n            var _loop_2 = function (i) {\n                if (this_2.listeners[i].eventsDiscarded) {\n                    setTimeout(function () { return _this.listeners[i].eventsDiscarded(events, reason); }, 0);\n                }\n            };\n            var this_2 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_2(i);\n            }\n        };\n        return NotificationManager;\n    }());\n    exports.NotificationManager = NotificationManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=NotificationManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\":\n/*!****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js ***!\n  \\****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK.Interfaces/IChannelControls */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./JavaScriptSDK/AppInsightsCore */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\"), __webpack_require__(/*! ./JavaScriptSDK/CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./JavaScriptSDK/NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./JavaScriptSDK/DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, IChannelControls_1, EventsDiscardedReason_1, AppInsightsCore_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1, LoggingEnums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = IChannelControls_1.MinChannelPriorty;\n    exports.EventsDiscardedReason = EventsDiscardedReason_1.EventsDiscardedReason;\n    exports.AppInsightsCore = AppInsightsCore_1.AppInsightsCore;\n    exports.CoreUtils = CoreUtils_1.CoreUtils;\n    exports.NotificationManager = NotificationManager_1.NotificationManager;\n    exports.DiagnosticLogger = DiagnosticLogger_1.DiagnosticLogger;\n    exports._InternalLogMessage = DiagnosticLogger_1._InternalLogMessage;\n    exports._InternalMessageId = LoggingEnums_1._InternalMessageId;\n    exports.LoggingSeverity = LoggingEnums_1.LoggingSeverity;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-core-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\":\n/*!*************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajax.js ***!\n  \\*************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./ajaxRecord */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\"), __webpack_require__(/*! ./ajaxUtils */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, ajaxRecord_1, ajaxUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var AjaxMonitor = /** @class */ (function () {\n        function AjaxMonitor() {\n            this._trackAjaxAttempts = 0;\n            this.identifier = \"AjaxDependencyPlugin\";\n            this.priority = 161;\n            this.currentWindowHost = window && window.location.host && window.location.host.toLowerCase();\n            this.initialized = false;\n        }\n        ///<summary>Verifies that particalar instance of XMLHttpRequest needs to be monitored</summary>\n        ///<param name=\"excludeAjaxDataValidation\">Optional parameter. True if ajaxData must be excluded from verification</param>\n        ///<returns type=\"bool\">True if instance needs to be monitored, otherwise false</returns>\n        AjaxMonitor.prototype.isMonitoredInstance = function (xhr, excludeAjaxDataValidation) {\n            // checking to see that all interested functions on xhr were instrumented\n            return this.initialized\n                // checking on ajaxData to see that it was not removed in user code\n                && (excludeAjaxDataValidation === true || !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData))\n                // check that this instance is not not used by ajax call performed inside client side monitoring to send data to collector\n                && xhr[applicationinsights_common_1.DisabledPropertyName] !== true;\n        };\n        ///<summary>Determines whether ajax monitoring can be enabled on this document</summary>\n        ///<returns>True if Ajax monitoring is supported on this page, otherwise false</returns>\n        AjaxMonitor.prototype.supportsMonitoring = function () {\n            var result = true;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.open) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.send) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.abort)) {\n                result = false;\n            }\n            // disable in IE8 or older (https://www.w3schools.com/jsref/jsref_trim_string.asp)\n            try {\n                \" a \".trim();\n            }\n            catch (ex) {\n                result = false;\n            }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentOpen = function () {\n            var originalOpen = XMLHttpRequest.prototype.open;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.open = function (method, url, async) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this, true) &&\n                        (!this.ajaxData ||\n                            !this.ajaxData.xhrMonitoringState.openDone)) {\n                        ajaxMonitorInstance.openHandler(this, method, url, async);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxOpen, \"Failed to monitor XMLHttpRequest.open, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalOpen.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.openHandler = function (xhr, method, url, async) {\n            /* todo:\n            Disabling the following block of code as CV is not yet supported in 1DS for 3rd Part.\n            // this format corresponds with activity logic on server-side and is required for the correct correlation\n            var id = \"|\" + this.appInsights.context.operation.id + \".\" + Util.newId();\n            */\n            var id = applicationinsights_common_1.Util.newId();\n            var ajaxData = new ajaxRecord_1.ajaxRecord(id, this._core._logger);\n            ajaxData.method = method;\n            ajaxData.requestUrl = url;\n            ajaxData.xhrMonitoringState.openDone = true;\n            xhr.ajaxData = ajaxData;\n            this.attachToOnReadyStateChange(xhr);\n        };\n        AjaxMonitor.getFailedAjaxDiagnosticsMessage = function (xhr) {\n            var result = \"\";\n            try {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData.requestUrl)) {\n                    result += \"(url: '\" + xhr.ajaxData.requestUrl + \"')\";\n                }\n            }\n            catch (e) { }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentSend = function () {\n            var originalSend = XMLHttpRequest.prototype.send;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.send = function (content) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.sendDone) {\n                        ajaxMonitorInstance.sendHandler(this, content);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxSend, \"Failed to monitor XMLHttpRequest, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalSend.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.sendHandler = function (xhr, content) {\n            xhr.ajaxData.requestSentTime = applicationinsights_common_1.DateTimeUtils.Now();\n            if (this.currentWindowHost && applicationinsights_common_1.CorrelationIdHelper.canIncludeCorrelationHeader(this._config, xhr.ajaxData.getAbsoluteUrl(), this.currentWindowHost)) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestIdHeader, xhr.ajaxData.id);\n                var appId = this._config.appId; // Todo: also, get appId from channel as breeze returns it\n                if (appId) {\n                    xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader, applicationinsights_common_1.RequestHeaders.requestContextAppIdFormat + appId);\n                }\n            }\n            xhr.ajaxData.xhrMonitoringState.sendDone = true;\n        };\n        AjaxMonitor.prototype.instrumentAbort = function () {\n            var originalAbort = XMLHttpRequest.prototype.abort;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.abort = function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.abortDone) {\n                        this.ajaxData.aborted = 1;\n                        this.ajaxData.xhrMonitoringState.abortDone = true;\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxAbort, \"Failed to monitor XMLHttpRequest.abort, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalAbort.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.attachToOnReadyStateChange = function (xhr) {\n            var _this = this;\n            var ajaxMonitorInstance = this;\n            xhr.ajaxData.xhrMonitoringState.onreadystatechangeCallbackAttached = ajaxUtils_1.EventHelper.AttachEvent(xhr, \"readystatechange\", function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(xhr)) {\n                        if (xhr.readyState === 4) {\n                            ajaxMonitorInstance.onAjaxComplete(xhr);\n                        }\n                    }\n                }\n                catch (e) {\n                    var exceptionText = applicationinsights_common_1.Util.dump(e);\n                    // ignore messages with c00c023f, as this a known IE9 XHR abort issue\n                    if (!exceptionText || exceptionText.toLowerCase().indexOf(\"c00c023f\") == -1) {\n                        _this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxRSC, \"Failed to monitor XMLHttpRequest 'readystatechange' event handler, monitoring data for this ajax call may be incorrect.\", {\n                            ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                            exception: applicationinsights_common_1.Util.dump(e)\n                        });\n                    }\n                }\n            });\n        };\n        AjaxMonitor.prototype.onAjaxComplete = function (xhr) {\n            xhr.ajaxData.responseFinishedTime = applicationinsights_common_1.DateTimeUtils.Now();\n            xhr.ajaxData.status = xhr.status;\n            xhr.ajaxData.CalculateMetrics();\n            if (xhr.ajaxData.ajaxTotalDuration < 0) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxDur, \"Failed to calculate the duration of the ajax call, monitoring data for this ajax call won't be sent.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    requestSentTime: xhr.ajaxData.requestSentTime,\n                    responseFinishedTime: xhr.ajaxData.responseFinishedTime\n                });\n            }\n            else {\n                var dependency = {\n                    id: xhr.ajaxData.id,\n                    absoluteUrl: xhr.ajaxData.getAbsoluteUrl(),\n                    commandName: xhr.ajaxData.getPathName(),\n                    duration: xhr.ajaxData.ajaxTotalDuration,\n                    success: (+(xhr.ajaxData.status)) >= 200 && (+(xhr.ajaxData.status)) < 400,\n                    resultCode: +xhr.ajaxData.status,\n                    method: xhr.ajaxData.method\n                };\n                // enrich dependency target with correlation context from the server\n                var correlationContext = this.getCorrelationContext(xhr);\n                if (correlationContext) {\n                    dependency.correlationContext = /* dependency.target + \" | \" + */ correlationContext;\n                }\n                this.trackDependencyData(dependency);\n                xhr.ajaxData = null;\n            }\n        };\n        AjaxMonitor.prototype.getCorrelationContext = function (xhr) {\n            try {\n                var responseHeadersString = xhr.getAllResponseHeaders();\n                if (responseHeadersString !== null) {\n                    var index = responseHeadersString.toLowerCase().indexOf(applicationinsights_common_1.RequestHeaders.requestContextHeaderLowerCase);\n                    if (index !== -1) {\n                        var responseHeader = xhr.getResponseHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader);\n                        return applicationinsights_common_1.CorrelationIdHelper.getCorrelationContext(responseHeader);\n                    }\n                }\n            }\n            catch (e) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxGetCorrelationHeader, \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    exception: applicationinsights_common_1.Util.dump(e)\n                });\n            }\n        };\n        /**\n            * Logs dependency call\n            * @param dependencyData dependency data object\n            */\n        AjaxMonitor.prototype.trackDependencyData = function (dependency, properties, systemProperties) {\n            if (this._config.maxAjaxCallsPerView === -1 || this._trackAjaxAttempts < this._config.maxAjaxCallsPerView) {\n                var item = applicationinsights_common_1.TelemetryItemCreator.create(dependency, applicationinsights_common_1.RemoteDependencyData.dataType, applicationinsights_common_1.RemoteDependencyData.envelopeType, this._core._logger, properties, systemProperties);\n                this._core.track(item);\n            }\n            else if (this._trackAjaxAttempts === this._config.maxAjaxCallsPerView) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MaxAjaxPerPVExceeded, \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n            }\n            ++this._trackAjaxAttempts;\n        };\n        AjaxMonitor.prototype.processTelemetry = function (item) {\n            if (this._nextPlugin && this._nextPlugin.processTelemetry) {\n                this._nextPlugin.processTelemetry(item);\n            }\n        };\n        AjaxMonitor.prototype.setNextPlugin = function (next) {\n            if (next) {\n                this._nextPlugin = next;\n            }\n        };\n        AjaxMonitor.prototype.initialize = function (config, core, extensions) {\n            if (!this.initialized) {\n                this._core = core;\n                config.extensionConfig = config.extensionConfig ? config.extensionConfig : {};\n                var c = config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n                this._config = {\n                    maxAjaxCallsPerView: !isNaN(c.maxAjaxCallsPerView) ? c.maxAjaxCallsPerView : 500,\n                    disableAjaxTracking: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableAjaxTracking),\n                    disableCorrelationHeaders: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableCorrelationHeaders),\n                    correlationHeaderExcludedDomains: c.correlationHeaderExcludedDomains || [\n                        \"*.blob.core.windows.net\",\n                        \"*.blob.core.chinacloudapi.cn\",\n                        \"*.blob.core.cloudapi.de\",\n                        \"*.blob.core.usgovcloudapi.net\"\n                    ],\n                    appId: c.appId,\n                    enableCorsCorrelation: applicationinsights_common_1.Util.stringToBoolOrDefault(c.enableCorsCorrelation)\n                };\n                if (this.supportsMonitoring() && !this._config.disableAjaxTracking) {\n                    this.instrumentOpen();\n                    this.instrumentSend();\n                    this.instrumentAbort();\n                    this.initialized = true;\n                }\n            }\n        };\n        return AjaxMonitor;\n    }());\n    exports.AjaxMonitor = AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajax.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var XHRMonitoringState = /** @class */ (function () {\n        function XHRMonitoringState() {\n            this.openDone = false;\n            this.setRequestHeaderDone = false;\n            this.sendDone = false;\n            this.abortDone = false;\n            //<summary>True, if onreadyStateChangeCallback function attached to xhr, otherwise false</summary>\n            this.onreadystatechangeCallbackAttached = false;\n        }\n        return XHRMonitoringState;\n    }());\n    exports.XHRMonitoringState = XHRMonitoringState;\n    var ajaxRecord = /** @class */ (function () {\n        function ajaxRecord(id, logger) {\n            this.completed = false;\n            this.requestHeadersSize = null;\n            this.ttfb = null;\n            this.responseReceivingDuration = null;\n            this.callbackDuration = null;\n            this.ajaxTotalDuration = null;\n            this.aborted = null;\n            this.pageUrl = null;\n            this.requestUrl = null;\n            this.requestSize = 0;\n            this.method = null;\n            ///<summary>Returns the HTTP status code.</summary>\n            this.status = null;\n            //<summary>The timestamp when open method was invoked</summary>\n            this.requestSentTime = null;\n            //<summary>The timestamps when first byte was received</summary>\n            this.responseStartedTime = null;\n            //<summary>The timestamp when last byte was received</summary>\n            this.responseFinishedTime = null;\n            //<summary>The timestamp when onreadystatechange callback in readyState 4 finished</summary>\n            this.callbackFinishedTime = null;\n            //<summary>The timestamp at which ajax was ended</summary>\n            this.endTime = null;\n            //<summary>The original xhr onreadystatechange event</summary>\n            this.originalOnreadystatechage = null;\n            this.xhrMonitoringState = new XHRMonitoringState();\n            //<summary>Determines whether or not JavaScript exception occured in xhr.onreadystatechange code. 1 if occured, otherwise 0.</summary>\n            this.clientFailure = 0;\n            this.CalculateMetrics = function () {\n                var self = this;\n                // round to 3 decimal points\n                self.ajaxTotalDuration = Math.round(applicationinsights_common_1.DateTimeUtils.GetDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n            };\n            this.id = id;\n            this._logger = logger;\n        }\n        ajaxRecord.prototype.getAbsoluteUrl = function () {\n            return this.requestUrl ? applicationinsights_common_1.UrlHelper.getAbsoluteUrl(this.requestUrl) : null;\n        };\n        ajaxRecord.prototype.getPathName = function () {\n            return this.requestUrl ? applicationinsights_common_1.DataSanitizer.sanitizeUrl(this._logger, applicationinsights_common_1.UrlHelper.getCompleteUrl(this.method, this.requestUrl)) : null;\n        };\n        return ajaxRecord;\n    }());\n    exports.ajaxRecord = ajaxRecord;\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxRecord.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var stringUtils = /** @class */ (function () {\n        function stringUtils() {\n        }\n        stringUtils.GetLength = function (strObject) {\n            var res = 0;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(strObject)) {\n                var stringified = \"\";\n                try {\n                    stringified = strObject.toString();\n                }\n                catch (ex) {\n                    // some troubles with complex object\n                }\n                res = stringified.length;\n                res = isNaN(res) ? 0 : res;\n            }\n            return res;\n        };\n        return stringUtils;\n    }());\n    exports.stringUtils = stringUtils;\n    var EventHelper = /** @class */ (function () {\n        function EventHelper() {\n        }\n        ///<summary>Binds the specified function to an event, so that the function gets called whenever the event fires on the object</summary>\n        ///<param name=\"obj\">Object to which </param>\n        ///<param name=\"eventNameWithoutOn\">String that specifies any of the standard DHTML Events without \"on\" prefix</param>\n        ///<param name=\"handlerRef\">Pointer that specifies the function to call when event fires</param>\n        ///<returns>True if the function was bound successfully to the event, otherwise false</returns>\n        EventHelper.AttachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            var result = false;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.attachEvent)) {\n                    // IE before version 9                    \n                    obj.attachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                    result = true;\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.addEventListener)) {\n                        // all browsers except IE before version 9\n                        obj.addEventListener(eventNameWithoutOn, handlerRef, false);\n                        result = true;\n                    }\n                }\n            }\n            return result;\n        };\n        EventHelper.DetachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.detachEvent)) {\n                    obj.detachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.removeEventListener)) {\n                        obj.removeEventListener(eventNameWithoutOn, handlerRef, false);\n                    }\n                }\n            }\n        };\n        return EventHelper;\n    }());\n    exports.EventHelper = EventHelper;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./ajax */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ajax_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.AjaxPlugin = ajax_1.AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-dependencies-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Application.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Application = /** @class */ (function () {\n        function Application() {\n        }\n        return Application;\n    }());\n    exports.Application = Application;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Application.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Device.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Device = /** @class */ (function () {\n        /**\n         * Constructs a new instance of the Device class\n         */\n        function Device() {\n            // don't attempt to fingerprint browsers\n            this.id = \"browser\";\n            // Device type is a dimension in our data platform\n            // Setting it to 'Browser' allows to separate client and server dependencies/exceptions\n            this.type = \"Browser\";\n        }\n        return Device;\n    }());\n    exports.Device = Device;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Device.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Version = \"2.0.1-beta\";\n    var Internal = /** @class */ (function () {\n        /**\n        * Constructs a new instance of the internal telemetry data class.\n        */\n        function Internal(config) {\n            this.sdkVersion = (config.sdkExtension && config.sdkExtension() ? config.sdkExtension() + \"_\" : \"\") + \"javascript:\" + Version;\n        }\n        return Internal;\n    }());\n    exports.Internal = Internal;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Internal.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Location.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Location = /** @class */ (function () {\n        function Location() {\n        }\n        return Location;\n    }());\n    exports.Location = Location;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Location.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Operation = /** @class */ (function () {\n        function Operation() {\n            this.id = applicationinsights_common_1.Util.newId();\n            if (window && window.location && window.location.pathname) {\n                this.name = window.location.pathname;\n            }\n        }\n        return Operation;\n    }());\n    exports.Operation = Operation;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Operation.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../SamplingScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SamplingScoreGenerator_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sample = /** @class */ (function () {\n        function Sample(sampleRate, logger) {\n            // We're using 32 bit math, hence max value is (2^31 - 1)\n            this.INT_MAX_VALUE = 2147483647;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (sampleRate > 100 || sampleRate < 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SampleRateOutOfRange, \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n                this.sampleRate = 100;\n            }\n            this.sampleRate = sampleRate;\n            this.samplingScoreGenerator = new SamplingScoreGenerator_1.SamplingScoreGenerator();\n        }\n        /**\n        * Determines if an envelope is sampled in (i.e. will be sent) or not (i.e. will be dropped).\n        */\n        Sample.prototype.isSampledIn = function (envelope) {\n            // return true as sampling will move to different extension\n            return true;\n        };\n        return Sample;\n    }());\n    exports.Sample = Sample;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sample.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Session.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Session = /** @class */ (function () {\n        function Session() {\n        }\n        return Session;\n    }());\n    exports.Session = Session;\n    var _SessionManager = /** @class */ (function () {\n        function _SessionManager(config, logger) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (!config) {\n                config = {};\n            }\n            if (!(typeof config.sessionExpirationMs === \"function\")) {\n                config.sessionExpirationMs = function () { return _SessionManager.acquisitionSpan; };\n            }\n            if (!(typeof config.sessionRenewalMs === \"function\")) {\n                config.sessionRenewalMs = function () { return _SessionManager.renewalSpan; };\n            }\n            this.config = config;\n            this.automaticSession = new Session();\n        }\n        _SessionManager.prototype.update = function () {\n            if (!this.automaticSession.id) {\n                this.initializeAutomaticSession();\n            }\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            var acquisitionExpired = now - this.automaticSession.acquisitionDate > this.config.sessionExpirationMs();\n            var renewalExpired = now - this.automaticSession.renewalDate > this.config.sessionRenewalMs();\n            // renew if acquisitionSpan or renewalSpan has ellapsed\n            if (acquisitionExpired || renewalExpired) {\n                // update automaticSession so session state has correct id                \n                this.automaticSession.isFirst = undefined;\n                this.renew();\n            }\n            else {\n                // do not update the cookie more often than cookieUpdateInterval\n                if (!this.cookieUpdatedTimestamp || now - this.cookieUpdatedTimestamp > _SessionManager.cookieUpdateInterval) {\n                    this.automaticSession.renewalDate = now;\n                    this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n                }\n            }\n        };\n        /**\n         *  Record the current state of the automatic session and store it in our cookie string format\n         *  into the browser's local storage. This is used to restore the session data when the cookie\n         *  expires.\n         */\n        _SessionManager.prototype.backup = function () {\n            this.setStorage(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n        };\n        /**\n         *  Use ai_session cookie data or local storage data (when the cookie is unavailable) to\n         *  initialize the automatic session.\n         */\n        _SessionManager.prototype.initializeAutomaticSession = function () {\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, 'ai_session');\n            if (cookie && typeof cookie.split === \"function\") {\n                this.initializeAutomaticSessionWithData(cookie);\n            }\n            else {\n                // There's no cookie, but we might have session data in local storage\n                // This can happen if the session expired or the user actively deleted the cookie\n                // We only want to recover data if the cookie is missing from expiry. We should respect the user's wishes if the cookie was deleted actively.\n                // The User class handles this for us and deletes our local storage object if the persistent user cookie was removed.\n                var storage = applicationinsights_common_1.Util.getStorage(this._logger, 'ai_session');\n                if (storage) {\n                    this.initializeAutomaticSessionWithData(storage);\n                }\n            }\n            if (!this.automaticSession.id) {\n                this.automaticSession.isFirst = true;\n                this.renew();\n            }\n        };\n        /**\n         *  Extract id, aquisitionDate, and renewalDate from an ai_session payload string and\n         *  use this data to initialize automaticSession.\n         *\n         *  @param {string} sessionData - The string stored in an ai_session cookie or local storage backup\n         */\n        _SessionManager.prototype.initializeAutomaticSessionWithData = function (sessionData) {\n            var params = sessionData.split(\"|\");\n            if (params.length > 0) {\n                this.automaticSession.id = params[0];\n            }\n            try {\n                if (params.length > 1) {\n                    var acq = +params[1];\n                    this.automaticSession.acquisitionDate = +new Date(acq);\n                    this.automaticSession.acquisitionDate = this.automaticSession.acquisitionDate > 0 ? this.automaticSession.acquisitionDate : 0;\n                }\n                if (params.length > 2) {\n                    var renewal = +params[2];\n                    this.automaticSession.renewalDate = +new Date(renewal);\n                    this.automaticSession.renewalDate = this.automaticSession.renewalDate > 0 ? this.automaticSession.renewalDate : 0;\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ErrorParsingAISessionCookie, \"Error parsing ai_session cookie, session will be reset: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            if (this.automaticSession.renewalDate == 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionRenewalDateIsZero, \"AI session renewal date is 0, session will be reset.\");\n            }\n        };\n        _SessionManager.prototype.renew = function () {\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            this.automaticSession.id = applicationinsights_common_1.Util.newId();\n            this.automaticSession.acquisitionDate = now;\n            this.automaticSession.renewalDate = now;\n            this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n            // If this browser does not support local storage, fire an internal log to keep track of it at this point\n            if (!applicationinsights_common_1.Util.canUseLocalStorage()) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserDoesNotSupportLocalStorage, \"Browser does not support local storage. Session durations will be inaccurate.\");\n            }\n        };\n        _SessionManager.prototype.setCookie = function (guid, acq, renewal) {\n            // Set cookie to expire after the session expiry time passes or the session renewal deadline, whichever is sooner\n            // Expiring the cookie will cause the session to expire even if the user isn't on the page\n            var acquisitionExpiry = acq + this.config.sessionExpirationMs();\n            var renewalExpiry = renewal + this.config.sessionRenewalMs();\n            var cookieExpiry = new Date();\n            var cookie = [guid, acq, renewal];\n            if (acquisitionExpiry < renewalExpiry) {\n                cookieExpiry.setTime(acquisitionExpiry);\n            }\n            else {\n                cookieExpiry.setTime(renewalExpiry);\n            }\n            var cookieDomnain = this.config.cookieDomain ? this.config.cookieDomain() : null;\n            applicationinsights_common_1.Util.setCookie(this._logger, 'ai_session', cookie.join('|') + ';expires=' + cookieExpiry.toUTCString(), cookieDomnain);\n            this.cookieUpdatedTimestamp = applicationinsights_common_1.DateTimeUtils.Now();\n        };\n        _SessionManager.prototype.setStorage = function (guid, acq, renewal) {\n            // Keep data in local storage to retain the last session id, allowing us to cleanly end the session when it expires\n            // Browsers that don't support local storage won't be able to end sessions cleanly from the client\n            // The server will notice this and end the sessions itself, with loss of accurate session duration\n            applicationinsights_common_1.Util.setStorage(this._logger, 'ai_session', [guid, acq, renewal].join('|'));\n        };\n        _SessionManager.acquisitionSpan = 86400000; // 24 hours in ms\n        _SessionManager.renewalSpan = 1800000; // 30 minutes in ms\n        _SessionManager.cookieUpdateInterval = 60000; // 1 minute in ms\n        return _SessionManager;\n    }());\n    exports._SessionManager = _SessionManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Session.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/User.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var User = /** @class */ (function () {\n        function User(config, logger) {\n            this._logger = logger;\n            //get userId or create new one if none exists\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, User.userCookieName);\n            if (cookie) {\n                var params = cookie.split(User.cookieSeparator);\n                if (params.length > 0) {\n                    this.id = params[0];\n                }\n            }\n            this.config = config;\n            if (!this.id) {\n                this.id = applicationinsights_common_1.Util.newId();\n                var date = new Date();\n                var acqStr = applicationinsights_common_1.Util.toISOStringForIE8(date);\n                this.accountAcquisitionDate = acqStr;\n                // without expiration, cookies expire at the end of the session\n                // set it to 365 days from now\n                // 365 * 24 * 60 * 60 * 1000 = 31536000000 \n                date.setTime(date.getTime() + 31536000000);\n                var newCookie = [this.id, acqStr];\n                var cookieDomain = this.config.cookieDomain ? this.config.cookieDomain() : undefined;\n                applicationinsights_common_1.Util.setCookie(this._logger, User.userCookieName, newCookie.join(User.cookieSeparator) + ';expires=' + date.toUTCString(), cookieDomain);\n                // If we have an ai_session in local storage this means the user actively removed our cookies.\n                // We should respect their wishes and clear ourselves from local storage\n                applicationinsights_common_1.Util.removeStorage(this._logger, 'ai_session');\n            }\n            // We still take the account id from the ctor param for backward compatibility. \n            // But if the the customer set the accountId through the newer setAuthenticatedUserContext API, we will override it.\n            this.accountId = config.accountId ? config.accountId() : undefined;\n            // Get the auth user id and account id from the cookie if exists\n            // Cookie is in the pattern: <authenticatedId>|<accountId>\n            var authCookie = applicationinsights_common_1.Util.getCookie(this._logger, User.authUserCookieName);\n            if (authCookie) {\n                authCookie = decodeURI(authCookie);\n                var authCookieString = authCookie.split(User.cookieSeparator);\n                if (authCookieString[0]) {\n                    this.authenticatedId = authCookieString[0];\n                }\n                if (authCookieString.length > 1 && authCookieString[1]) {\n                    this.accountId = authCookieString[1];\n                }\n            }\n        }\n        /**\n        * Sets the authenticated user id and the account id in this session.\n        *\n        * @param authenticatedUserId {string} - The authenticated user id. A unique and persistent string that represents each authenticated user in the service.\n        * @param accountId {string} - An optional string to represent the account associated with the authenticated user.\n        */\n        User.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            // Validate inputs to ensure no cookie control characters.\n            var isInvalidInput = !this.validateUserInput(authenticatedUserId) || (accountId && !this.validateUserInput(accountId));\n            if (isInvalidInput) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SetAuthContextFailedAccountName, \"Setting auth user context failed. \" +\n                    \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                return;\n            }\n            // Create cookie string.\n            this.authenticatedId = authenticatedUserId;\n            var authCookie = this.authenticatedId;\n            if (accountId) {\n                this.accountId = accountId;\n                authCookie = [this.authenticatedId, this.accountId].join(User.cookieSeparator);\n            }\n            if (storeInCookie) {\n                // Set the cookie. No expiration date because this is a session cookie (expires when browser closed).\n                // Encoding the cookie to handle unexpected unicode characters.\n                applicationinsights_common_1.Util.setCookie(this._logger, User.authUserCookieName, encodeURI(authCookie), this.config.cookieDomain());\n            }\n        };\n        /**\n         * Clears the authenticated user id and the account id from the user context.\n         * @returns {}\n         */\n        User.prototype.clearAuthenticatedUserContext = function () {\n            this.authenticatedId = null;\n            this.accountId = null;\n            applicationinsights_common_1.Util.deleteCookie(this._logger, User.authUserCookieName);\n        };\n        User.prototype.validateUserInput = function (id) {\n            // Validate:\n            // 1. Id is a non-empty string.\n            // 2. It does not contain special characters for cookies.\n            if (typeof id !== 'string' ||\n                !id ||\n                id.match(/,|;|=| |\\|/)) {\n                return false;\n            }\n            return true;\n        };\n        User.cookieSeparator = '|';\n        User.userCookieName = 'ai_user';\n        User.authUserCookieName = 'ai_authUser';\n        return User;\n    }());\n    exports.User = User;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=User.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var HashCodeScoreGenerator = /** @class */ (function () {\n        function HashCodeScoreGenerator() {\n        }\n        HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n            var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n            return score * 100;\n        };\n        HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n            if (input == \"\") {\n                return 0;\n            }\n            while (input.length < HashCodeScoreGenerator.MIN_INPUT_LENGTH) {\n                input = input.concat(input);\n            }\n            // 5381 is a magic number: http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function\n            var hash = 5381;\n            for (var i = 0; i < input.length; ++i) {\n                hash = ((hash << 5) + hash) + input.charCodeAt(i);\n                // 'hash' is of number type which means 53 bit integer (http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-number-type)\n                // 'hash & hash' will keep it 32 bit integer - just to make it clearer what the result is.\n                hash = hash & hash;\n            }\n            return Math.abs(hash);\n        };\n        // We're using 32 bit math, hence max value is (2^31 - 1)\n        HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n        // (Magic number) DJB algorithm can't work on shorter strings (results in poor distribution\n        HashCodeScoreGenerator.MIN_INPUT_LENGTH = 8;\n        return HashCodeScoreGenerator;\n    }());\n    exports.HashCodeScoreGenerator = HashCodeScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=HashCodeScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * PropertiesPlugin.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! ./Context/Session */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\"), __webpack_require__(/*! ./Context/Application */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\"), __webpack_require__(/*! ./Context/Device */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\"), __webpack_require__(/*! ./Context/Internal */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\"), __webpack_require__(/*! ./Context/Location */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\"), __webpack_require__(/*! ./Context/Operation */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\"), __webpack_require__(/*! ./Context/User */ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\"), __webpack_require__(/*! ./Context/Sample */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_common_1, Session_1, Application_1, Device_1, Internal_1, Location_1, Operation_1, User_1, Sample_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PropertiesPlugin = /** @class */ (function () {\n        function PropertiesPlugin() {\n            this.priority = 170;\n            this.identifier = \"AppInsightsPropertiesPlugin\";\n        }\n        PropertiesPlugin.prototype.initialize = function (config, core, extensions) {\n            var extensionConfig = config.extensions &&\n                config.extensions[this.identifier] ?\n                config.extensions[this.identifier] : {};\n            this._extensionConfig = {\n                instrumentationKey: function () { return extensionConfig.instrumentationKey; },\n                accountId: function () { return extensionConfig.accountId; },\n                sessionRenewalMs: function () { return extensionConfig.sessionRenewalMs; },\n                sampleRate: function () { return extensionConfig.sampleRate; },\n                sessionExpirationMs: function () { return extensionConfig.sessionExpirationMs; },\n                cookieDomain: function () { return extensionConfig.cookieDomain; },\n                sdkExtension: function () { return extensionConfig.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return extensionConfig.isBrowserLinkTrackingEnabled; },\n                appId: function () { return extensionConfig.appId; }\n            };\n            if (typeof window !== 'undefined') {\n                this._sessionManager = new Session_1._SessionManager(this._extensionConfig, core.logger);\n                this.application = new Application_1.Application();\n                this.device = new Device_1.Device();\n                this.internal = new Internal_1.Internal(this._extensionConfig);\n                this.location = new Location_1.Location();\n                this.user = new User_1.User(this._extensionConfig, core.logger);\n                this.operation = new Operation_1.Operation();\n                this.session = new Session_1.Session();\n                this.sample = new Sample_1.Sample(this._extensionConfig.sampleRate(), core.logger);\n            }\n        };\n        /**\n         * Add Part A fields to the event\n         * @param event The event that needs to be processed\n         */\n        PropertiesPlugin.prototype.processTelemetry = function (event) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(event)) {\n                // TODO(barustum): throw an internal event once we have support for internal logging\n            }\n            else {\n                // if the event is not sampled in, do not bother going through the pipeline\n                if (this.sample.isSampledIn(event)) {\n                    // If the envelope is PageView, reset the internal message count so that we can send internal telemetry for the new page.\n                    if (event.name === applicationinsights_common_1.PageView.envelopeType) {\n                        // TODO(barustum): resetInternalMessageCount once we have support for internal logging\n                        //_InternalLogging.resetInternalMessageCount();\n                    }\n                    if (this.session) {\n                        // If customer did not provide custom session id update the session manager\n                        if (typeof this.session.id !== \"string\") {\n                            this._sessionManager.update();\n                        }\n                    }\n                    this._processTelemetryInternal(event);\n                }\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                    this._nextPlugin.processTelemetry(event);\n                }\n            }\n        };\n        /**\n         * Sets the next plugin that comes after this plugin\n         * @param nextPlugin The next plugin\n         */\n        PropertiesPlugin.prototype.setNextPlugin = function (nextPlugin) {\n            this._nextPlugin = nextPlugin;\n        };\n        PropertiesPlugin.prototype._processTelemetryInternal = function (event) {\n            var tagsItem = {};\n            if (this.session) {\n                // If customer set id, apply his context; otherwise apply context generated from cookies \n                if (typeof this.session.id === \"string\") {\n                    PropertiesPlugin._applySessionContext(tagsItem, this.session);\n                }\n                else {\n                    PropertiesPlugin._applySessionContext(tagsItem, this._sessionManager.automaticSession);\n                }\n            }\n            // set part A  fields\n            PropertiesPlugin._applyApplicationContext(tagsItem, this.application);\n            PropertiesPlugin._applyDeviceContext(tagsItem, this.device);\n            PropertiesPlugin._applyInternalContext(tagsItem, this.internal);\n            PropertiesPlugin._applyLocationContext(tagsItem, this.location);\n            PropertiesPlugin._applySampleContext(tagsItem, this.sample);\n            PropertiesPlugin._applyUserContext(tagsItem, this.user);\n            PropertiesPlugin._applyOperationContext(tagsItem, this.operation);\n            event.tags.push(tagsItem);\n        };\n        PropertiesPlugin._applySessionContext = function (tags, sessionContext) {\n            if (sessionContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof sessionContext.id === \"string\") {\n                    tags[tagKeys.sessionId] = sessionContext.id;\n                }\n                if (typeof sessionContext.isFirst !== \"undefined\") {\n                    tags[tagKeys.sessionIsFirst] = sessionContext.isFirst;\n                }\n            }\n        };\n        PropertiesPlugin._applyApplicationContext = function (tagsItem, appContext) {\n            if (appContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof appContext.ver === \"string\") {\n                    tagsItem[tagKeys.applicationVersion] = appContext.ver;\n                }\n                if (typeof appContext.build === \"string\") {\n                    tagsItem[tagKeys.applicationBuild] = appContext.build;\n                }\n            }\n        };\n        PropertiesPlugin._applyDeviceContext = function (tagsItem, deviceContext) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            if (deviceContext) {\n                if (typeof deviceContext.id === \"string\") {\n                    tagsItem[tagKeys.deviceId] = deviceContext.id;\n                }\n                if (typeof deviceContext.ip === \"string\") {\n                    tagsItem[tagKeys.deviceIp] = deviceContext.ip;\n                }\n                if (typeof deviceContext.language === \"string\") {\n                    tagsItem[tagKeys.deviceLanguage] = deviceContext.language;\n                }\n                if (typeof deviceContext.locale === \"string\") {\n                    tagsItem[tagKeys.deviceLocale] = deviceContext.locale;\n                }\n                if (typeof deviceContext.model === \"string\") {\n                    tagsItem[tagKeys.deviceModel] = deviceContext.model;\n                }\n                if (typeof deviceContext.network !== \"undefined\") {\n                    tagsItem[tagKeys.deviceNetwork] = deviceContext.network;\n                }\n                if (typeof deviceContext.oemName === \"string\") {\n                    tagsItem[tagKeys.deviceOEMName] = deviceContext.oemName;\n                }\n                if (typeof deviceContext.os === \"string\") {\n                    tagsItem[tagKeys.deviceOS] = deviceContext.os;\n                }\n                if (typeof deviceContext.osversion === \"string\") {\n                    tagsItem[tagKeys.deviceOSVersion] = deviceContext.osversion;\n                }\n                if (typeof deviceContext.resolution === \"string\") {\n                    tagsItem[tagKeys.deviceScreenResolution] = deviceContext.resolution;\n                }\n                if (typeof deviceContext.type === \"string\") {\n                    tagsItem[tagKeys.deviceType] = deviceContext.type;\n                }\n            }\n        };\n        PropertiesPlugin._applyInternalContext = function (tagsItem, internalContext) {\n            if (internalContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof internalContext.agentVersion === \"string\") {\n                    tagsItem[tagKeys.internalAgentVersion] = internalContext.agentVersion;\n                }\n                if (typeof internalContext.sdkVersion === \"string\") {\n                    tagsItem[tagKeys.internalSdkVersion] = internalContext.sdkVersion;\n                }\n            }\n        };\n        PropertiesPlugin._applyLocationContext = function (tagsItem, locationContext) {\n            if (locationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof locationContext.ip === \"string\") {\n                    tagsItem[tagKeys.locationIp] = locationContext.ip;\n                }\n            }\n        };\n        PropertiesPlugin._applySampleContext = function (tagsItem, sampleContext) {\n            if (sampleContext) {\n                tagsItem.sampleRate = sampleContext.sampleRate;\n            }\n        };\n        PropertiesPlugin._applyOperationContext = function (tagsItem, operationContext) {\n            if (operationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof operationContext.id === \"string\") {\n                    tagsItem[tagKeys.operationId] = operationContext.id;\n                }\n                if (typeof operationContext.name === \"string\") {\n                    tagsItem[tagKeys.operationName] = operationContext.name;\n                }\n                if (typeof operationContext.parentId === \"string\") {\n                    tagsItem[tagKeys.operationParentId] = operationContext.parentId;\n                }\n                if (typeof operationContext.rootId === \"string\") {\n                    tagsItem[tagKeys.operationRootId] = operationContext.rootId;\n                }\n                if (typeof operationContext.syntheticSource === \"string\") {\n                    tagsItem[tagKeys.operationSyntheticSource] = operationContext.syntheticSource;\n                }\n            }\n        };\n        PropertiesPlugin._applyUserContext = function (tagsItem, userContext) {\n            if (userContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof userContext.accountId === \"string\") {\n                    tagsItem[tagKeys.userAccountId] = userContext.accountId;\n                }\n                if (typeof userContext.agent === \"string\") {\n                    tagsItem[tagKeys.userAgent] = userContext.agent;\n                }\n                if (typeof userContext.id === \"string\") {\n                    tagsItem[tagKeys.userId] = userContext.id;\n                }\n                if (typeof userContext.authenticatedId === \"string\") {\n                    tagsItem[tagKeys.userAuthUserId] = userContext.authenticatedId;\n                }\n                if (typeof userContext.storeRegion === \"string\") {\n                    tagsItem[tagKeys.userStoreRegion] = userContext.storeRegion;\n                }\n            }\n        };\n        return PropertiesPlugin;\n    }());\n    exports.default = PropertiesPlugin;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PropertiesPlugin.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./HashCodeScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, HashCodeScoreGenerator_1, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var SamplingScoreGenerator = /** @class */ (function () {\n        function SamplingScoreGenerator() {\n            this.hashCodeGeneragor = new HashCodeScoreGenerator_1.HashCodeScoreGenerator();\n        }\n        SamplingScoreGenerator.prototype.getSamplingScore = function (envelope) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            var score = 0;\n            if (envelope.tags[tagKeys.userId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.userId]);\n            }\n            else if (envelope.tags[tagKeys.operationId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.operationId]);\n            }\n            else {\n                // tslint:disable-next-line:insecure-random\n                score = Math.random();\n            }\n            return score;\n        };\n        return SamplingScoreGenerator;\n    }());\n    exports.SamplingScoreGenerator = SamplingScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SamplingScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PropertiesPlugin */ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PropertiesPlugin_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.PropertiesPlugin = PropertiesPlugin_1.default;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-properties-js.js.map\n\n/***/ }),\n\n/***/ 0:\n/*!**********************************!*\\\n  !*** multi ./amd/bundle/Init.js ***!\n  \\**********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./amd/bundle/Init.js */\"./amd/bundle/Init.js\");\n\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=aisdk.0.0.15.js.map"
  },
  {
    "path": "AISKU/dist-history/aisdk.0.0.17.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./amd/bundle/Init.js\":\n/*!****************************!*\\\n  !*** ./amd/bundle/Init.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! ./Initialization */ \"./amd/bundle/Initialization.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_analytics_js_1, Initialization_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    //should be global function that should load as soon as SDK loads\n    try {\n        // E2E sku on load initializes core and pipeline using snippet as input for configuration\n        var aiName;\n        if (typeof window !== \"undefined\" && typeof JSON !== \"undefined\") {\n            // get snippet or initialize to an empty object\n            // get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation\n            aiName = window[\"appInsightsSDK\"];\n            if (window[aiName] === undefined) {\n                // if no snippet is present, initialize default values\n                applicationinsights_analytics_js_1.ApplicationInsights.appInsightsDefaultConfig = Initialization_1.Initialization.getDefaultConfig();\n            }\n            else {\n                if (window[aiName].initialize) {\n                    // this is the typical case for browser+snippet\n                    var snippet = window[aiName] || {};\n                    // overwrite snippet with full appInsights\n                    var initialization = new Initialization_1.Initialization(snippet);\n                    var appInsightsLocal = initialization.loadAppInsights();\n                    // apply full appInsights to the global instance that was initialized in the snippet\n                    for (var field in appInsightsLocal) {\n                        snippet[field] = appInsightsLocal[field];\n                    }\n                    // Empty queue of all api calls logged prior to sdk download\n                    initialization.emptyQueue();\n                    initialization.addHousekeepingBeforeUnload(appInsightsLocal);\n                }\n            }\n        }\n    }\n    catch (e) {\n        // TODO: Find better place to warn to console when SDK initialization fails\n        if (console) {\n            console.warn('Failed to initialize AppInsights JS SDK for instance ' + aiName + e.message);\n        }\n    }\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./amd/bundle/Initialization.js\":\n/*!**************************************!*\\\n  !*** ./amd/bundle/Initialization.js ***!\n  \\**************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-channel-js */ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\"), __webpack_require__(/*! applicationinsights-properties-js */ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\"), __webpack_require__(/*! applicationinsights-dependencies-js */ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_analytics_js_1, applicationinsights_common_1, applicationinsights_channel_js_1, applicationinsights_properties_js_1, applicationinsights_dependencies_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    ;\n    var Initialization = /** @class */ (function () {\n        function Initialization(snippet) {\n            // initialize the queue and config in case they are undefined\n            snippet.queue = snippet.queue || [];\n            var config = snippet.config || {};\n            // ensure instrumentationKey is specified\n            if (config && !config.instrumentationKey) {\n                config = snippet;\n                applicationinsights_analytics_js_1.ApplicationInsights.Version = \"2.0.0\";\n            }\n            this.appInsights = new applicationinsights_analytics_js_1.ApplicationInsights();\n            // set default values using config passed through snippet\n            config = Initialization.getDefaultConfig(config, this.appInsights.identifier);\n            this.properties = new applicationinsights_properties_js_1.PropertiesPlugin();\n            this.dependencies = new applicationinsights_dependencies_js_1.AjaxPlugin();\n            this.snippet = snippet;\n            this.config = config;\n        }\n        // Analytics Plugin\n        Initialization.prototype.trackPageView = function (pageView, customProperties) {\n            this.appInsights.trackPageView(pageView, customProperties);\n        };\n        Initialization.prototype.trackException = function (exception, customProperties) {\n            this.appInsights.trackException(exception, customProperties);\n        };\n        Initialization.prototype._onerror = function (exception) {\n            this.appInsights._onerror(exception);\n        };\n        Initialization.prototype.trackTrace = function (trace, customProperties) {\n            this.appInsights.trackTrace(trace, customProperties);\n        };\n        Initialization.prototype.trackMetric = function (metric, customProperties) {\n            this.appInsights.trackMetric(metric, customProperties);\n        };\n        Initialization.prototype.startTrackPage = function (name) {\n            this.appInsights.startTrackPage(name);\n        };\n        Initialization.prototype.stopTrackPage = function (name, url, customProperties) {\n            this.appInsights.stopTrackPage(name, url, customProperties);\n        };\n        Initialization.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            return this.appInsights.addTelemetryInitializer(telemetryInitializer);\n        };\n        // Properties Plugin\n        Initialization.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            this.properties.user.setAuthenticatedUserContext(authenticatedUserId, accountId, storeInCookie);\n        };\n        Initialization.prototype.clearAuthenticatedUserContext = function () {\n            this.properties.user.clearAuthenticatedUserContext();\n        };\n        // Dependencies Plugin\n        Initialization.prototype.trackDependencyData = function (dependency, customProperties, systemProperties) {\n            this.dependencies.trackDependencyData(dependency, customProperties, systemProperties);\n        };\n        Initialization.prototype.loadAppInsights = function () {\n            this.core = new applicationinsights_core_js_1.AppInsightsCore();\n            var extensions = [];\n            var appInsightsChannel = new applicationinsights_channel_js_1.Sender();\n            extensions.push(appInsightsChannel);\n            extensions.push(this.properties);\n            extensions.push(this.dependencies);\n            extensions.push(this.appInsights);\n            // initialize core\n            this.core.initialize(this.config, extensions);\n            return this;\n        };\n        Initialization.prototype.emptyQueue = function () {\n            // call functions that were queued before the main script was loaded\n            try {\n                if (applicationinsights_common_1.Util.isArray(this.snippet.queue)) {\n                    // note: do not check length in the for-loop conditional in case something goes wrong and the stub methods are not overridden.\n                    var length = this.snippet.queue.length;\n                    for (var i = 0; i < length; i++) {\n                        var call = this.snippet.queue[i];\n                        call();\n                    }\n                    this.snippet.queue = undefined;\n                    delete this.snippet.queue;\n                }\n            }\n            catch (exception) {\n                var properties = {};\n                if (exception && typeof exception.toString === \"function\") {\n                    properties.exception = exception.toString();\n                }\n                // need from core\n                // Microsoft.ApplicationInsights._InternalLogging.throwInternal(\n                //     LoggingSeverity.WARNING,\n                //     _InternalMessageId.FailedToSendQueuedTelemetry,\n                //     \"Failed to send queued telemetry\",\n                //     properties);\n            }\n        };\n        Initialization.prototype.pollInteralLogs = function (appInsightsInstance) {\n            // return setInterval(() => {\n            //     var queue: Array<_InternalLogMessage> = ApplicationInsights._InternalLogging.queue;\n            //     var length = queue.length;\n            //     for (var i = 0; i < length; i++) {\n            //         appInsightsInstance.trackTrace(queue[i].message);\n            //     }\n            //     queue.length = 0;\n            // }, this.config.diagnosticLogInterval);\n        };\n        Initialization.prototype.addHousekeepingBeforeUnload = function (appInsightsInstance) {\n            // Add callback to push events when the user navigates away\n            if (!appInsightsInstance.appInsights.config.disableFlushOnBeforeUnload && ('onbeforeunload' in window)) {\n                var performHousekeeping = function () {\n                    // Adds the ability to flush all data before the page unloads.\n                    // Note: This approach tries to push an async request with all the pending events onbeforeunload.\n                    // Firefox does not respect this.Other browsers DO push out the call with < 100% hit rate.\n                    // Telemetry here will help us analyze how effective this approach is.\n                    // Another approach would be to make this call sync with a acceptable timeout to reduce the \n                    // impact on user experience.\n                    //appInsightsInstance.context._sender.triggerSend();\n                    appInsightsInstance.appInsights.core.getTransmissionControls().forEach(function (queues) {\n                        queues.forEach(function (channel) { return channel.flush(true); });\n                    });\n                    // Back up the current session to local storage\n                    // This lets us close expired sessions after the cookies themselves expire\n                    // Todo: move this against interface behavior\n                    if (this.core.extensions[\"AppInsightsPropertiesPlugin\"] &&\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager) {\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager.backup();\n                    }\n                };\n                if (!applicationinsights_common_1.Util.addEventHandler('beforeunload', performHousekeeping)) {\n                    this.core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToAddHandlerForOnBeforeUnload, 'Could not add handler for beforeunload');\n                }\n            }\n        };\n        Initialization.getDefaultConfig = function (configuration, identifier) {\n            if (!configuration) {\n                configuration = {};\n            }\n            if (configuration) {\n                identifier = identifier ? identifier : \"ApplicationInsightsAnalytics\";\n            }\n            // Undefined checks\n            if (!configuration.extensionConfig) {\n                configuration.extensionConfig = {};\n            }\n            if (!configuration.extensionConfig[identifier]) {\n                configuration.extensionConfig[identifier] = {};\n            }\n            var extensionConfig = configuration.extensionConfig[identifier]; // ref to main config\n            // set default values\n            configuration.endpointUrl = configuration.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\";\n            extensionConfig.sessionRenewalMs = 30 * 60 * 1000;\n            extensionConfig.sessionExpirationMs = 24 * 60 * 60 * 1000;\n            extensionConfig.enableDebug = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableDebug);\n            extensionConfig.disableExceptionTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableExceptionTracking);\n            extensionConfig.consoleLoggingLevel = extensionConfig.consoleLoggingLevel || 1; // Show only CRITICAL level\n            extensionConfig.telemetryLoggingLevel = extensionConfig.telemetryLoggingLevel || 0; // Send nothing\n            extensionConfig.diagnosticLogInterval = extensionConfig.diagnosticLogInterval || 10000;\n            extensionConfig.autoTrackPageVisitTime = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.autoTrackPageVisitTime);\n            if (isNaN(extensionConfig.samplingPercentage) || extensionConfig.samplingPercentage <= 0 || extensionConfig.samplingPercentage >= 100) {\n                extensionConfig.samplingPercentage = 100;\n            }\n            extensionConfig.disableAjaxTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableAjaxTracking);\n            extensionConfig.maxAjaxCallsPerView = !isNaN(extensionConfig.maxAjaxCallsPerView) ? extensionConfig.maxAjaxCallsPerView : 500;\n            extensionConfig.disableCorrelationHeaders = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableCorrelationHeaders);\n            extensionConfig.correlationHeaderExcludedDomains = extensionConfig.correlationHeaderExcludedDomains || [\n                \"*.blob.core.windows.net\",\n                \"*.blob.core.chinacloudapi.cn\",\n                \"*.blob.core.cloudapi.de\",\n                \"*.blob.core.usgovcloudapi.net\"\n            ];\n            extensionConfig.disableFlushOnBeforeUnload = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableFlushOnBeforeUnload);\n            extensionConfig.isCookieUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isCookieUseDisabled);\n            extensionConfig.isStorageUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isStorageUseDisabled);\n            extensionConfig.isBrowserLinkTrackingEnabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isBrowserLinkTrackingEnabled);\n            extensionConfig.enableCorsCorrelation = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableCorsCorrelation);\n            return configuration;\n        };\n        return Initialization;\n    }());\n    exports.Initialization = Initialization;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * ApplicationInsights.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Telemetry/PageViewManager */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, PageViewManager_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var durationProperty = \"duration\";\n    var ApplicationInsights = /** @class */ (function () {\n        function ApplicationInsights() {\n            this.identifier = \"ApplicationInsightsAnalytics\";\n            this.priority = 160; // take from reserved priority range 100- 200\n            this._isInitialized = false;\n            // Counts number of trackAjax invokations.\n            // By default we only monitor X ajax call per view to avoid too much load.\n            // Default value is set in config.\n            // This counter keeps increasing even after the limit is reached.\n            this._trackAjaxAttempts = 0;\n            this.initialize = this._initialize.bind(this);\n        }\n        ApplicationInsights.prototype.processTelemetry = function (env) {\n            var doNotSendItem = false;\n            try {\n                var telemetryInitializersCount = this._telemetryInitializers.length;\n                for (var i = 0; i < telemetryInitializersCount; ++i) {\n                    var telemetryInitializer = this._telemetryInitializers[i];\n                    if (telemetryInitializer) {\n                        if (telemetryInitializer.apply(null, [env]) === false) {\n                            doNotSendItem = true;\n                            break;\n                        }\n                    }\n                }\n            }\n            catch (e) {\n                doNotSendItem = true;\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryInitializerFailed, \"One of telemetry initializers failed, telemetry item will not be sent: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) }, true);\n            }\n            if (!doNotSendItem && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(env);\n            }\n        };\n        ApplicationInsights.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * @description Log a diagnostic message\n         * @param {ITraceTelemetry} trace\n         * @param {{[key: string]: any}} [customProperties]\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackTrace = function (trace, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(trace, applicationinsights_common_1.Trace.dataType, applicationinsights_common_1.Trace.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TrackTraceFailed, \"trackTrace failed, trace will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Log a numeric value that is not associated with a specific event. Typically\n         * used to send regular reports of performance indicators. To send single measurement, just\n         * use the name and average fields of {@link IMetricTelemetry}. If you take measurements\n         * frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements\n         * and sending the resulting average at intervals\n         * @param {IMetricTelemetry} metric input object argument. Only name and average are mandatory.\n         * @param {{[key: string]: any}} customProperties additional data used to filter metrics in the\n         * portal. Defaults to empty.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackMetric = function (metric, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(metric, applicationinsights_common_1.Metric.dataType, applicationinsights_common_1.Metric.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackMetricFailed, \"trackMetric failed, metric will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs that a page or other item was viewed.\n         * @param IPageViewTelemetry The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param customProperties Additional data used to filter events and metrics. Defaults to empty. If a user wants\n         *                         to provide a custom duration, it'll have to be in customProperties\n         */\n        ApplicationInsights.prototype.trackPageView = function (pageView, customProperties) {\n            try {\n                this._pageViewManager.trackPageView(pageView, customProperties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(pageView.name, pageView.uri);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailed, \"trackPageView failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Create a page view telemetry item and send it to the SDK pipeline through the core.track API\n         * @param pageView Page view item to be sent\n         * @param properties Custom properties (Part C) that a user can add to the telemetry item\n         * @param systemProperties System level properties (Part A) that a user can add to the telemetry item\n         */\n        ApplicationInsights.prototype.sendPageViewInternal = function (pageView, properties, systemProperties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageView, applicationinsights_common_1.PageView.dataType, applicationinsights_common_1.PageView.envelopeType, this._logger, properties, systemProperties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n            // reset ajaxes counter\n            this._trackAjaxAttempts = 0;\n        };\n        ApplicationInsights.prototype.sendPageViewPerformanceInternal = function (pageViewPerformance, properties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageViewPerformance, applicationinsights_common_1.PageViewPerformance.dataType, applicationinsights_common_1.PageViewPerformance.envelopeType, this._logger, properties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n        };\n        /**\n         * Starts timing how long the user views a page or other item. Call this when the page opens.\n         * This method doesn't send any telemetry. Call {@link stopTrackTelemetry} to log the page when it closes.\n         * @param name A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n         */\n        ApplicationInsights.prototype.startTrackPage = function (name) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                this._pageTracking.start(name);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StartTrackFailed, \"startTrackPage failed, page view may not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs how long a page or other item was visible, after {@link startTrackPage}. Call this when the page closes.\n         * @param name The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param url A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n         * @param properties Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *                   Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric\n         */\n        ApplicationInsights.prototype.stopTrackPage = function (name, url, properties) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                if (typeof url !== \"string\") {\n                    url = window.location && window.location.href || \"\";\n                }\n                this._pageTracking.stop(name, url, properties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(name, url);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StopTrackFailed, \"stopTrackPage failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Log an exception you have caught.\n         *\n         * @param {IExceptionTelemetry} exception   Object which contains exception to be sent\n         * @param {{[key: string]: any}} customProperties   Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *\n         * Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackException = function (exception, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackExceptionFailed, \"trackException failed, exception will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Custom error handler for Application Insights Analytics\n         * @param {IAutoExceptionTelemetry} exception\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype._onerror = function (exception) {\n            try {\n                var properties = {\n                    url: (exception && exception.url) || document.URL,\n                    lineNumber: exception.lineNumber,\n                    columnNumber: exception.columnNumber,\n                    message: exception.message\n                };\n                if (applicationinsights_common_1.Util.isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception.error)) {\n                    this._sendCORSException(properties.url);\n                }\n                else {\n                    if (!applicationinsights_common_1.Util.isError(exception.error)) {\n                        var stack = \"window.onerror@\" + properties.url + \":\" + exception.lineNumber + \":\" + (exception.columnNumber || 0);\n                        exception.error = new Error(exception.message);\n                        exception.error.stack = stack;\n                    }\n                    this.trackException({ error: exception.error, severityLevel: applicationinsights_common_1.SeverityLevel.Error }, properties);\n                }\n            }\n            catch (e) {\n                var errorString = exception.error ?\n                    (exception.error.name + \", \" + exception.error.message)\n                    : \"null\";\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ExceptionWhileLoggingError, \"_onError threw exception while logging error, error will not be collected: \"\n                    + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e), errorString: errorString });\n            }\n        };\n        ApplicationInsights.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._initialize = function (config, core, extensions) {\n            var _this = this;\n            if (this._isInitialized) {\n                return;\n            }\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(core)) {\n                throw Error(\"Error initializing\");\n            }\n            this.core = core;\n            this._logger = core.logger;\n            this._globalconfig = {\n                instrumentationKey: config.instrumentationKey,\n                endpointUrl: config.endpointUrl\n            };\n            this.config = config.extensionConfig && config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n            // load default values if specified\n            var defaults = ApplicationInsights.appInsightsDefaultConfig;\n            if (defaults !== undefined) {\n                if (defaults.extensions && defaults.extensions[this.identifier]) {\n                    for (var field in defaults.extensions[this.identifier]) {\n                        // for each unspecified field, set the default value\n                        if (this.config[field] === undefined) {\n                            this.config[field] = defaults[field];\n                        }\n                    }\n                }\n                if (this._globalconfig) {\n                    for (var field in defaults) {\n                        if (this._globalconfig[field] === undefined) {\n                            this._globalconfig[field] = defaults[field];\n                        }\n                    }\n                }\n            }\n            // Todo: move this out of static state\n            if (this.config.isCookieUseDisabled) {\n                applicationinsights_common_1.Util.disableCookies();\n            }\n            // Todo: move this out of static state\n            if (this.config.isStorageUseDisabled) {\n                applicationinsights_common_1.Util.disableStorage();\n            }\n            var configGetters = {\n                instrumentationKey: function () { return config.instrumentationKey; },\n                accountId: function () { return _this.config.accountId; },\n                sessionRenewalMs: function () { return _this.config.sessionRenewalMs; },\n                sessionExpirationMs: function () { return _this.config.sessionExpirationMs; },\n                sampleRate: function () { return _this.config.samplingPercentage; },\n                cookieDomain: function () { return _this.config.cookieDomain; },\n                sdkExtension: function () { return _this.config.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return _this.config.isBrowserLinkTrackingEnabled; },\n                appId: function () { return _this.config.appId; }\n            };\n            this._pageViewManager = new PageViewManager_1.PageViewManager(this, this.config.overridePageViewDuration, this.core);\n            this._telemetryInitializers = [];\n            this._addDefaultTelemetryInitializers(configGetters);\n            // initialize page view timing\n            this._pageTracking = new Timing(this._logger, \"trackPageView\");\n            this._pageTracking.action = function (name, url, duration, properties) {\n                var pageViewItem = {\n                    name: name,\n                    uri: url\n                };\n                // duration must be a custom property in order for the collector to extract it\n                if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(properties)) {\n                    properties = {};\n                }\n                properties[durationProperty] = duration;\n                _this.sendPageViewInternal(pageViewItem, properties);\n            };\n            if (this.config.disableExceptionTracking === false &&\n                !this.config.autoExceptionInstrumented) {\n                // We want to enable exception auto collection and it has not been done so yet\n                var onerror_1 = \"onerror\";\n                var originalOnError_1 = window[onerror_1];\n                var instance_1 = this;\n                window.onerror = function (message, url, lineNumber, columnNumber, error) {\n                    var handled = originalOnError_1 && originalOnError_1(message, url, lineNumber, columnNumber, error);\n                    if (handled !== true) {\n                        instance_1._onerror({\n                            message: message,\n                            url: url,\n                            lineNumber: lineNumber,\n                            columnNumber: columnNumber,\n                            error: error\n                        });\n                    }\n                    return handled;\n                };\n                this.config.autoExceptionInstrumented = true;\n            }\n            this._isInitialized = true;\n        };\n        ApplicationInsights.prototype._addDefaultTelemetryInitializers = function (configGetters) {\n            if (!configGetters.isBrowserLinkTrackingEnabled()) {\n                var browserLinkPaths_1 = ['/browserLinkSignalR/', '/__browserLink/'];\n                var dropBrowserLinkRequests = function (envelope) {\n                    if (envelope.baseType === applicationinsights_common_1.RemoteDependencyData.dataType) {\n                        var remoteData = envelope.baseData;\n                        if (remoteData) {\n                            for (var i = 0; i < browserLinkPaths_1.length; i++) {\n                                if (remoteData.absoluteUrl && remoteData.absoluteUrl.indexOf(browserLinkPaths_1[i]) >= 0) {\n                                    return false;\n                                }\n                            }\n                        }\n                    }\n                    return true;\n                };\n                this._addTelemetryInitializer(dropBrowserLinkRequests);\n            }\n        };\n        ApplicationInsights.prototype._addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._sendCORSException = function (url) {\n            var exception = {\n                message: \"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\",\n                url: url,\n                lineNumber: 0,\n                columnNumber: 0,\n                error: undefined\n            };\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, { url: url });\n            this.core.track(telemetryItem);\n        };\n        // Mutate telemetryItem inplace to add boilerplate iKey & name info\n        ApplicationInsights.prototype._setTelemetryNameAndIKey = function (telemetryItem) {\n            telemetryItem.instrumentationKey = this._globalconfig.instrumentationKey;\n            var iKeyNoDashes = this._globalconfig.instrumentationKey.replace(/-/g, \"\");\n            telemetryItem.name = telemetryItem.name.replace(\"{0}\", iKeyNoDashes);\n        };\n        ApplicationInsights.Version = \"2.0.1-beta\";\n        return ApplicationInsights;\n    }());\n    exports.ApplicationInsights = ApplicationInsights;\n    /**\n     * Used to record timed events and page views.\n     */\n    var Timing = /** @class */ (function () {\n        function Timing(logger, name) {\n            this._name = name;\n            this._events = {};\n            this._logger = logger;\n        }\n        Timing.prototype.start = function (name) {\n            if (typeof this._events[name] !== \"undefined\") {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StartCalledMoreThanOnce, \"start was called more than once for this event without calling stop.\", { name: this._name, key: name }, true);\n            }\n            this._events[name] = +new Date;\n        };\n        Timing.prototype.stop = function (name, url, properties) {\n            var start = this._events[name];\n            if (isNaN(start)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StopCalledWithoutStart, \"stop was called without a corresponding start.\", { name: this._name, key: name }, true);\n            }\n            else {\n                var end = +new Date;\n                var duration = applicationinsights_common_1.PageViewPerformance.getDuration(start, end);\n                this.action(name, url, duration, properties);\n            }\n            delete this._events[name];\n            this._events[name] = undefined;\n        };\n        return Timing;\n    }());\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ApplicationInsights.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Class encapsulates sending page views and page view performance telemetry.\n    */\n    var PageViewManager = /** @class */ (function () {\n        function PageViewManager(appInsights, overridePageViewDuration, core) {\n            this.pageViewPerformanceSent = false;\n            this.overridePageViewDuration = false;\n            this.overridePageViewDuration = overridePageViewDuration;\n            this.appInsights = appInsights;\n            if (core) {\n                this._channel = function () { return (core.getTransmissionControls()); };\n                this._logger = core.logger;\n            }\n        }\n        /**\n        * Currently supported cases:\n        * 1) (default case) track page view called with default parameters, overridePageViewDuration = false. Page view is sent with page view performance when navigation timing data is available.\n        *    a. If navigation timing is not supported then page view is sent right away with undefined duration. Page view performance is not sent.\n        * 2) overridePageViewDuration = true, custom duration provided. Custom duration is used, page view sends right away.\n        * 3) overridePageViewDuration = true, custom duration NOT provided. Page view is sent right away, duration is time spent from page load till now (or undefined if navigation timing is not supported).\n        * 4) overridePageViewDuration = false, custom duration is provided. Page view is sent right away with custom duration.\n        *\n        * In all cases page view performance is sent once (only for the 1st call of trackPageView), or not sent if navigation timing is not supported.\n        */\n        PageViewManager.prototype.trackPageView = function (pageView, customProperties) {\n            var _this = this;\n            var name = pageView.name;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(name) || typeof name !== \"string\") {\n                pageView.name = window.document && window.document.title || \"\";\n            }\n            var uri = pageView.uri;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                pageView.uri = window.location && window.location.href || \"\";\n            }\n            // case 1a. if performance timing is not supported by the browser, send the page view telemetry with the duration provided by the user. If the user\n            // do not provide the duration, set duration to undefined\n            // Also this is case 4\n            if (!applicationinsights_common_1.PageViewPerformance.isPerformanceTimingSupported()) {\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                // no navigation timing (IE 8, iOS Safari 8.4, Opera Mini 8 - see http://caniuse.com/#feat=nav-timing)\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NavigationTimingNotSupported, \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                return;\n            }\n            var pageViewSent = false;\n            var customDuration = undefined;\n            // if the performance timing is supported by the browser, calculate the custom duration\n            var start = applicationinsights_common_1.PageViewPerformance.getPerformanceTiming().navigationStart;\n            customDuration = applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date);\n            if (!applicationinsights_common_1.PageViewPerformance.shouldCollectDuration(customDuration)) {\n                customDuration = undefined;\n            }\n            // if the user has provided duration, send a page view telemetry with the provided duration. Otherwise, if\n            // overridePageViewDuration is set to true, send a page view telemetry with the custom duration calculated earlier\n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties.duration)) {\n                duration = customProperties.duration;\n            }\n            if (this.overridePageViewDuration || !isNaN(duration)) {\n                if (isNaN(duration)) {\n                    // case 3\n                    if (!customProperties) {\n                        customProperties = {};\n                    }\n                    customProperties[\"duration\"] = customDuration;\n                }\n                // case 2\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                pageViewSent = true;\n            }\n            // now try to send the page view performance telemetry\n            var maxDurationLimit = 60000;\n            if (!customProperties) {\n                customProperties = {};\n            }\n            var handle = setInterval((function () {\n                try {\n                    if (applicationinsights_common_1.PageViewPerformance.isPerformanceTimingDataReady()) {\n                        clearInterval(handle);\n                        var pageViewPerformance = new applicationinsights_common_1.PageViewPerformance(_this._logger, name, uri, null);\n                        if (!pageViewPerformance.getIsValid() && !pageViewSent) {\n                            // If navigation timing gives invalid numbers, then go back to \"override page view duration\" mode.\n                            // That's the best value we can get that makes sense.\n                            customProperties[\"duration\"] = customDuration;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                        else {\n                            if (!pageViewSent) {\n                                customProperties[\"duration\"] = pageViewPerformance.getDurationMs();\n                                _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            }\n                            if (!_this.pageViewPerformanceSent) {\n                                _this.appInsights.sendPageViewPerformanceInternal(pageViewPerformance, customProperties);\n                                _this.pageViewPerformanceSent = true;\n                            }\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                    else if (applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date) > maxDurationLimit) {\n                        // if performance timings are not ready but we exceeded the maximum duration limit, just log a page view telemetry\n                        // with the maximum duration limit. Otherwise, keep waiting until performance timings are ready\n                        clearInterval(handle);\n                        if (!pageViewSent) {\n                            customProperties[\"duration\"] = maxDurationLimit;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                }\n                catch (e) {\n                    _this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailedCalc, \"trackPageView failed on page load calculation: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }), 100);\n        };\n        return PageViewManager;\n    }());\n    exports.PageViewManager = PageViewManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK/ApplicationInsights */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ApplicationInsights_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ApplicationInsights = ApplicationInsights_1.ApplicationInsights;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-analytics-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ContextTagKeys = [\n        \"ai.application.ver\",\n        \"ai.application.build\",\n        \"ai.application.typeId\",\n        \"ai.application.applicationId\",\n        \"ai.application.layer\",\n        \"ai.device.id\",\n        \"ai.device.ip\",\n        \"ai.device.language\",\n        \"ai.device.locale\",\n        \"ai.device.model\",\n        \"ai.device.friendlyName\",\n        \"ai.device.network\",\n        \"ai.device.networkName\",\n        \"ai.device.oemName\",\n        \"ai.device.os\",\n        \"ai.device.osVersion\",\n        \"ai.device.roleInstance\",\n        \"ai.device.roleName\",\n        \"ai.device.screenResolution\",\n        \"ai.device.type\",\n        \"ai.device.machineName\",\n        \"ai.device.vmName\",\n        \"ai.device.browser\",\n        \"ai.device.browserVersion\",\n        \"ai.location.ip\",\n        \"ai.location.country\",\n        \"ai.location.province\",\n        \"ai.location.city\",\n        \"ai.operation.id\",\n        \"ai.operation.name\",\n        \"ai.operation.parentId\",\n        \"ai.operation.rootId\",\n        \"ai.operation.syntheticSource\",\n        \"ai.operation.correlationVector\",\n        \"ai.session.id\",\n        \"ai.session.isFirst\",\n        \"ai.session.isNew\",\n        \"ai.user.accountAcquisitionDate\",\n        \"ai.user.accountId\",\n        \"ai.user.userAgent\",\n        \"ai.user.id\",\n        \"ai.user.storeRegion\",\n        \"ai.user.authUserId\",\n        \"ai.user.anonUserAcquisitionDate\",\n        \"ai.user.authUserAcquisitionDate\",\n        \"ai.cloud.name\",\n        \"ai.cloud.role\",\n        \"ai.cloud.roleVer\",\n        \"ai.cloud.roleInstance\",\n        \"ai.cloud.environment\",\n        \"ai.cloud.location\",\n        \"ai.cloud.deploymentUnit\",\n        \"ai.internal.sdkVersion\",\n        \"ai.internal.agentVersion\",\n        \"ai.internal.nodeName\",\n    ];\n    // these two constants are used to filter out properties not needed when trying to extract custom properties and measurements from the incoming payload\n    var baseType = \"baseType\";\n    var baseData = \"baseData\";\n    var EnvelopeCreator = /** @class */ (function () {\n        function EnvelopeCreator() {\n        }\n        EnvelopeCreator.extractProperties = function (data) {\n            var customProperties = null;\n            for (var key in data) {\n                if (data.hasOwnProperty(key)) {\n                    var value = data[key];\n                    if (typeof value !== \"number\") {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[key] = value;\n                    }\n                }\n            }\n            return customProperties;\n        };\n        EnvelopeCreator.extractPropsAndMeasurements = function (data, properties, measurements) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(data)) {\n                for (var key in data) {\n                    if (data.hasOwnProperty(key)) {\n                        var value = data[key];\n                        if (typeof value === \"number\") {\n                            measurements[key] = value;\n                        }\n                        else {\n                            properties[key] = value;\n                        }\n                    }\n                }\n            }\n        };\n        // TODO: Do we want this to take logger as arg or use this._logger as nonstatic?\n        EnvelopeCreator.createEnvelope = function (logger, envelopeType, telemetryItem, data) {\n            var envelope = new applicationinsights_common_1.Envelope(logger, data, envelopeType);\n            envelope.iKey = telemetryItem.instrumentationKey;\n            var iKeyNoDashes = telemetryItem.instrumentationKey.replace(/-/g, \"\");\n            envelope.name = envelope.name.replace(\"{0}\", iKeyNoDashes);\n            // loop through the envelope ctx (Part A) and pick out the ones that should go in outgoing envelope tags\n            for (var key in telemetryItem.ctx) {\n                if (telemetryItem.ctx.hasOwnProperty(key)) {\n                    if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                        envelope.tags[key] = telemetryItem.ctx[key];\n                    }\n                }\n            }\n            // loop through the envelope tags (extension of Part A) and pick out the ones that should go in outgoing envelope tags\n            telemetryItem.tags.forEach(function (tag) {\n                for (var key in tag) {\n                    if (tag.hasOwnProperty(key)) {\n                        if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                            envelope.tags[key] = tag[key];\n                        }\n                    }\n                }\n            });\n            return envelope;\n        };\n        return EnvelopeCreator;\n    }());\n    exports.EnvelopeCreator = EnvelopeCreator;\n    var DependencyEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(DependencyEnvelopeCreator, _super);\n        function DependencyEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        DependencyEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customMeasurements = {};\n            var customProperties = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var bd = telemetryItem.baseData;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(bd)) {\n                logger.warnToConsole(\"Invalid input for dependency data\");\n                return null;\n            }\n            var id = bd.id;\n            var absoluteUrl = bd.absoluteUrl;\n            var command = bd.commandName;\n            var duration = bd.duration;\n            var success = bd.success;\n            var resultCode = bd.resultCode;\n            var method = bd.method;\n            var baseData = new applicationinsights_common_1.RemoteDependencyData(logger, id, absoluteUrl, command, duration, success, resultCode, method, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.RemoteDependencyData.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.RemoteDependencyData.envelopeType, telemetryItem, data);\n        };\n        DependencyEnvelopeCreator.DependencyEnvelopeCreator = new DependencyEnvelopeCreator();\n        return DependencyEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.DependencyEnvelopeCreator = DependencyEnvelopeCreator;\n    var EventEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(EventEnvelopeCreator, _super);\n        function EventEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            if (telemetryItem.baseType !== applicationinsights_common_1.Event.dataType) {\n                EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.baseData, customProperties, customMeasurements);\n            }\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var eventName = telemetryItem.baseData.name;\n            var baseData = new applicationinsights_common_1.Event(logger, eventName, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Event.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Event.envelopeType, telemetryItem, data);\n        };\n        EventEnvelopeCreator.EventEnvelopeCreator = new EventEnvelopeCreator();\n        return EventEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.EventEnvelopeCreator = EventEnvelopeCreator;\n    var ExceptionEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(ExceptionEnvelopeCreator, _super);\n        function ExceptionEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ExceptionEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var exception = telemetryItem.baseData.error;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var baseData = new applicationinsights_common_1.Exception(logger, exception, customProperties, customMeasurements, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Exception.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Exception.envelopeType, telemetryItem, data);\n        };\n        ExceptionEnvelopeCreator.ExceptionEnvelopeCreator = new ExceptionEnvelopeCreator();\n        return ExceptionEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.ExceptionEnvelopeCreator = ExceptionEnvelopeCreator;\n    var MetricEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(MetricEnvelopeCreator, _super);\n        function MetricEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        MetricEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var name = telemetryItem.baseData.name;\n            var average = telemetryItem.baseData.average;\n            var sampleCount = telemetryItem.baseData.sampleCount;\n            var min = telemetryItem.baseData.min;\n            var max = telemetryItem.baseData.max;\n            var baseData = new applicationinsights_common_1.Metric(logger, name, average, sampleCount, min, max, customProperties);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Metric.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Metric.envelopeType, telemetryItem, data);\n        };\n        MetricEnvelopeCreator.MetricEnvelopeCreator = new MetricEnvelopeCreator();\n        return MetricEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.MetricEnvelopeCreator = MetricEnvelopeCreator;\n    var PageViewEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewEnvelopeCreator, _super);\n        function PageViewEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            // Since duration is not part of the domain properties in Common Schema, extract it from part C \n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data.duration)) {\n                duration = telemetryItem.data.duration;\n                delete telemetryItem.data.duration;\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            // Todo: move IPageViewTelemetry to common as we are missing type checks on baseData here\n            // refUri is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.refUri)) {\n                customProperties[\"refUri\"] = telemetryItem.baseData.refUri;\n            }\n            // pageType is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageType)) {\n                customProperties[\"pageType\"] = telemetryItem.baseData.pageType;\n            }\n            // isLoggedIn is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.isLoggedIn)) {\n                customProperties[\"isLoggedIn\"] = telemetryItem.baseData.isLoggedIn;\n            }\n            // pageTags is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageTags)) {\n                var pageTags = telemetryItem.baseData.pageTags;\n                for (var key in pageTags) {\n                    if (pageTags.hasOwnProperty(key)) {\n                        customProperties[key] = pageTags[key];\n                    }\n                }\n            }\n            var baseData = new applicationinsights_common_1.PageView(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageView.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageView.envelopeType, telemetryItem, data);\n        };\n        PageViewEnvelopeCreator.PageViewEnvelopeCreator = new PageViewEnvelopeCreator();\n        return PageViewEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewEnvelopeCreator = PageViewEnvelopeCreator;\n    var PageViewPerformanceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewPerformanceEnvelopeCreator, _super);\n        function PageViewPerformanceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewPerformanceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            var duration = telemetryItem.baseData.duration;\n            var baseData = new applicationinsights_common_1.PageViewPerformance(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageViewPerformance.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageViewPerformance.envelopeType, telemetryItem, data);\n        };\n        PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator = new PageViewPerformanceEnvelopeCreator();\n        return PageViewPerformanceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewPerformanceEnvelopeCreator = PageViewPerformanceEnvelopeCreator;\n    var TraceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(TraceEnvelopeCreator, _super);\n        function TraceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        TraceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var message = telemetryItem.baseData.message;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var baseData = new applicationinsights_common_1.Trace(logger, message, customProperties, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Trace.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Trace.envelopeType, telemetryItem, data);\n        };\n        TraceEnvelopeCreator.TraceEnvelopeCreator = new TraceEnvelopeCreator();\n        return TraceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.TraceEnvelopeCreator = TraceEnvelopeCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EnvelopeCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Offline.js ***!\n  \\***********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * @description Monitors browser for offline events\n     * @export default - Offline: Static instance of OfflineListener\n     * @class OfflineListener\n     */\n    var OfflineListener = /** @class */ (function () {\n        function OfflineListener() {\n            this._onlineStatus = true;\n            if (window && window.addEventListener) {\n                window.addEventListener('online', this._setOnline.bind(this), false);\n                window.addEventListener('offline', this._setOffline.bind(this), false);\n                this.isListening = true;\n            }\n            else if (document && document.body) {\n                document.body.ononline = this._setOnline.bind(this);\n                document.body.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else if (document) {\n                document.ononline = this._setOnline.bind(this);\n                document.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else {\n                // Could not find a place to add event listener\n                this.isListening = false;\n            }\n        }\n        OfflineListener.prototype._setOnline = function () {\n            this._onlineStatus = true;\n        };\n        OfflineListener.prototype._setOffline = function () {\n            this._onlineStatus = false;\n        };\n        OfflineListener.prototype.isOnline = function () {\n            if (this.isListening) {\n                return this._onlineStatus;\n            }\n            else if (navigator) {\n                return navigator.onLine;\n            }\n            else {\n                // Cannot determine online status - report as online\n                return true;\n            }\n        };\n        OfflineListener.prototype.isOffline = function () {\n            return !this.isOnline();\n        };\n        OfflineListener.Offline = new OfflineListener;\n        return OfflineListener;\n    }());\n    exports.OfflineListener = OfflineListener;\n    exports.Offline = OfflineListener.Offline;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Offline.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /*\n     * An array based send buffer.\n     */\n    var ArraySendBuffer = /** @class */ (function () {\n        function ArraySendBuffer(config) {\n            this._config = config;\n            this._buffer = [];\n        }\n        ArraySendBuffer.prototype.enqueue = function (payload) {\n            this._buffer.push(payload);\n        };\n        ArraySendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        ArraySendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n        };\n        ArraySendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        ArraySendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        ArraySendBuffer.prototype.markAsSent = function (payload) {\n            this.clear();\n        };\n        ArraySendBuffer.prototype.clearSent = function (payload) {\n            // not supported\n        };\n        return ArraySendBuffer;\n    }());\n    exports.ArraySendBuffer = ArraySendBuffer;\n    /*\n     * Session storege buffer holds a copy of all unsent items in the browser session storage.\n     */\n    var SessionStorageSendBuffer = /** @class */ (function () {\n        function SessionStorageSendBuffer(logger, config) {\n            this._bufferFullMessageSent = false;\n            this._logger = logger;\n            this._config = config;\n            var bufferItems = this.getBuffer(SessionStorageSendBuffer.BUFFER_KEY);\n            var notDeliveredItems = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            this._buffer = bufferItems.concat(notDeliveredItems);\n            // If the buffer has too many items, drop items from the end.\n            if (this._buffer.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                this._buffer.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n            }\n            // update DataLossAnalyzer with the number of recovered items\n            // Uncomment if you want to use DataLossanalyzer\n            // DataLossAnalyzer.itemsRestoredFromSessionBuffer = this._buffer.length;\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        }\n        SessionStorageSendBuffer.prototype.enqueue = function (payload) {\n            if (this._buffer.length >= SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                // sent internal log only once per page view\n                if (!this._bufferFullMessageSent) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Maximum buffer size reached: \" + this._buffer.length, true);\n                    this._bufferFullMessageSent = true;\n                }\n                return;\n            }\n            this._buffer.push(payload);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        };\n        SessionStorageSendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        SessionStorageSendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this._bufferFullMessageSent = false;\n        };\n        SessionStorageSendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        SessionStorageSendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        SessionStorageSendBuffer.prototype.markAsSent = function (payload) {\n            this._buffer = this.removePayloadsFromBuffer(payload, this._buffer);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            if (sentElements instanceof Array && payload instanceof Array) {\n                sentElements = sentElements.concat(payload);\n                if (sentElements.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                    // We send telemetry normally. If the SENT_BUFFER is too big we don't add new elements\n                    // until we receive a response from the backend and the buffer has free space again (see clearSent method)\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Sent buffer reached its maximum size: \" + sentElements.length, true);\n                    sentElements.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n                }\n                this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n            }\n        };\n        SessionStorageSendBuffer.prototype.clearSent = function (payload) {\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            sentElements = this.removePayloadsFromBuffer(payload, sentElements);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n        };\n        SessionStorageSendBuffer.prototype.removePayloadsFromBuffer = function (payloads, buffer) {\n            var remaining = [];\n            for (var i in buffer) {\n                var contains = false;\n                for (var j in payloads) {\n                    if (payloads[j] === buffer[i]) {\n                        contains = true;\n                        break;\n                    }\n                }\n                if (!contains) {\n                    remaining.push(buffer[i]);\n                }\n            }\n            ;\n            return remaining;\n        };\n        SessionStorageSendBuffer.prototype.getBuffer = function (key) {\n            try {\n                var bufferJson = applicationinsights_common_1.Util.getSessionStorage(this._logger, key);\n                if (bufferJson) {\n                    var buffer = JSON.parse(bufferJson);\n                    if (buffer) {\n                        return buffer;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToRestoreStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            return [];\n        };\n        SessionStorageSendBuffer.prototype.setBuffer = function (key, buffer) {\n            try {\n                var bufferJson = JSON.stringify(buffer);\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, bufferJson);\n            }\n            catch (e) {\n                // if there was an error, clear the buffer\n                // telemetry is stored in the _buffer array so we won't loose any items\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, JSON.stringify([]));\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedToSetStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e) + \". Buffer cleared\", { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n        SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n        // Maximum number of payloads stored in the buffer. If the buffer is full, new elements will be dropped. \n        SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n        return SessionStorageSendBuffer;\n    }());\n    exports.SessionStorageSendBuffer = SessionStorageSendBuffer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SendBuffer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Sender.js ***!\n  \\**********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./SendBuffer */ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\"), __webpack_require__(/*! ./EnvelopeCreator */ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\"), __webpack_require__(/*! ./TelemetryValidation/EventValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/TraceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/ExceptionValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/MetricValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewPerformanceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/RemoteDepdencyValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\"), __webpack_require__(/*! ./Serializer */ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Offline */ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SendBuffer_1, EnvelopeCreator_1, EventValidator_1, TraceValidator_1, ExceptionValidator_1, MetricValidator_1, PageViewPerformanceValidator_1, PageViewValidator_1, RemoteDepdencyValidator_1, Serializer_1, applicationinsights_common_1, applicationinsights_core_js_1, applicationinsights_core_js_2, Offline_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sender = /** @class */ (function () {\n        function Sender() {\n            this.priority = 201;\n            /**\n             * Whether XMLHttpRequest object is supported. Older version of IE (8,9) do not support it.\n             */\n            this._XMLHttpRequestSupported = false;\n        }\n        Sender.prototype.pause = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.resume = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.flush = function () {\n            try {\n                this.triggerSend();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FlushFailed, \"flush failed, telemetry will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        Sender.prototype.teardown = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.initialize = function (config, core, extensions) {\n            this.identifier = \"AppInsightsChannelPlugin\";\n            this._logger = core.logger;\n            this._serializer = new Serializer_1.Serializer(core.logger);\n            this._consecutiveErrors = 0;\n            this._retryAt = null;\n            this._lastSend = 0;\n            this._config = Sender._getDefaultAppInsightsChannelConfig(config, this.identifier);\n            this._sender = null;\n            this._buffer = (applicationinsights_common_1.Util.canUseSessionStorage() && this._config.enableSessionStorageBuffer)\n                ? new SendBuffer_1.SessionStorageSendBuffer(this._logger, this._config) : new SendBuffer_1.ArraySendBuffer(this._config);\n            if (!this._config.isBeaconApiDisabled() && applicationinsights_common_1.Util.IsBeaconApiSupported()) {\n                this._sender = this._beaconSender;\n            }\n            else {\n                if (typeof XMLHttpRequest != \"undefined\") {\n                    var testXhr = new XMLHttpRequest();\n                    if (\"withCredentials\" in testXhr) {\n                        this._sender = this._xhrSender;\n                        this._XMLHttpRequestSupported = true;\n                    }\n                    else if (typeof XDomainRequest !== \"undefined\") {\n                        this._sender = this._xdrSender; //IE 8 and 9\n                    }\n                }\n            }\n        };\n        Sender.prototype.processTelemetry = function (telemetryItem) {\n            try {\n                // if master off switch is set, don't send any data\n                if (this._config.disableTelemetry()) {\n                    // Do not send/save data\n                    return;\n                }\n                // validate input\n                if (!telemetryItem) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSendEmptyTelemetry, \"Cannot send empty telemetry\");\n                    return;\n                }\n                // ensure a sender was constructed\n                if (!this._sender) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SenderNotInitialized, \"Sender was not initialized\");\n                    return;\n                }\n                // first we need to validate that the envelope passed down is valid\n                var isValid = Sender._validate(telemetryItem);\n                if (!isValid) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"Invalid telemetry envelope\");\n                    return;\n                }\n                // construct an envelope that Application Insights endpoint can understand\n                var aiEnvelope = this._constructEnvelope(telemetryItem);\n                if (!aiEnvelope) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CreateEnvelopeError, \"Unable to create an AppInsights envelope\");\n                    return;\n                }\n                // check if the incoming payload is too large, truncate if necessary\n                var payload = this._serializer.serialize(aiEnvelope);\n                // flush if we would exceed the max-size limit by adding this item\n                var bufferPayload = this._buffer.getItems();\n                var batch = this._buffer.batchPayloads(bufferPayload);\n                if (batch && (batch.length + payload.length > this._config.maxBatchSizeInBytes())) {\n                    this.triggerSend();\n                }\n                // enqueue the payload\n                this._buffer.enqueue(payload);\n                // ensure an invocation timeout is set\n                this._setupTimer();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedAddingTelemetryToBuffer, \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            // hand off the telemetry item to the next plugin\n            if (!applicationinsights_core_js_2.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(telemetryItem);\n            }\n        };\n        Sender.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * xhr state changes\n         */\n        Sender.prototype._xhrReadyStateChange = function (xhr, payload, countOfItemsInPayload) {\n            if (xhr.readyState === 4) {\n                var response = null;\n                if (!this._appId) {\n                    response = this._parseResponse(xhr.responseText || xhr.response);\n                    if (response && response.appId) {\n                        this._appId = response.appId;\n                    }\n                }\n                if ((xhr.status < 200 || xhr.status >= 300) && xhr.status !== 0) {\n                    if (!this._config.isRetryDisabled() && this._isRetriable(xhr.status)) {\n                        this._resendPayload(payload);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                            \"Response code \" + xhr.status + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                    else {\n                        this._onError(payload, this._formatErrorMessageXhr(xhr));\n                    }\n                }\n                else if (xhr.status === 0 || Offline_1.Offline.isOffline()) {\n                    if (!this._config.isRetryDisabled()) {\n                        var offlineBackOffMultiplier = 10; // arbritrary number\n                        this._resendPayload(payload, offlineBackOffMultiplier);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". Offline - Response Code: \" + xhr.status + \". Offline status: \" + Offline_1.Offline.isOffline() + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                }\n                else {\n                    if (xhr.status === 206) {\n                        if (!response) {\n                            response = this._parseResponse(xhr.responseText || xhr.response);\n                        }\n                        if (response && !this._config.isRetryDisabled()) {\n                            this._onPartialSuccess(payload, response);\n                        }\n                        else {\n                            this._onError(payload, this._formatErrorMessageXhr(xhr));\n                        }\n                    }\n                    else {\n                        this._consecutiveErrors = 0;\n                        this._onSuccess(payload, countOfItemsInPayload);\n                    }\n                }\n            }\n        };\n        /**\n         * Immediately send buffered data\n         * @param async {boolean} - Indicates if the events should be sent asynchronously\n         */\n        Sender.prototype.triggerSend = function (async) {\n            if (async === void 0) { async = true; }\n            try {\n                // Send data only if disableTelemetry is false\n                if (!this._config.disableTelemetry()) {\n                    if (this._buffer.count() > 0) {\n                        var payload = this._buffer.getItems();\n                        // invoke send\n                        this._sender(payload, async);\n                    }\n                    // update lastSend time to enable throttling\n                    this._lastSend = +new Date;\n                }\n                else {\n                    this._buffer.clear();\n                }\n                clearTimeout(this._timeoutHandle);\n                this._timeoutHandle = null;\n                this._retryAt = null;\n            }\n            catch (e) {\n                /* Ignore this error for IE under v10 */\n                if (!applicationinsights_common_1.Util.getIEVersion() || applicationinsights_common_1.Util.getIEVersion() > 9) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Telemetry transmission failed, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }\n        };\n        /**\n         * error handler\n         */\n        Sender.prototype._onError = function (payload, message, event) {\n            this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.OnError, \"Failed to send telemetry.\", { message: message });\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * partial success handler\n         */\n        Sender.prototype._onPartialSuccess = function (payload, results) {\n            var failed = [];\n            var retry = [];\n            // Iterate through the reversed array of errors so that splicing doesn't have invalid indexes after the first item.\n            var errors = results.errors.reverse();\n            for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                var error = errors_1[_i];\n                var extracted = payload.splice(error.index, 1)[0];\n                if (this._isRetriable(error.statusCode)) {\n                    retry.push(extracted);\n                }\n                else {\n                    // All other errors, including: 402 (Monthly quota exceeded) and 439 (Too many requests and refresh cache).\n                    failed.push(extracted);\n                }\n            }\n            if (payload.length > 0) {\n                this._onSuccess(payload, results.itemsAccepted);\n            }\n            if (failed.length > 0) {\n                this._onError(failed, this._formatErrorMessageXhr(null, ['partial success', results.itemsAccepted, 'of', results.itemsReceived].join(' ')));\n            }\n            if (retry.length > 0) {\n                this._resendPayload(retry);\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Partial success. \" +\n                    \"Delivered: \" + payload.length + \", Failed: \" + failed.length +\n                    \". Will retry to send \" + retry.length + \" our of \" + results.itemsReceived + \" items\");\n            }\n        };\n        /**\n         * success handler\n         */\n        Sender.prototype._onSuccess = function (payload, countOfItemsInPayload) {\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * xdr state changes\n         */\n        Sender.prototype._xdrOnLoad = function (xdr, payload) {\n            if (xdr && (xdr.responseText + \"\" === \"200\" || xdr.responseText === \"\")) {\n                this._consecutiveErrors = 0;\n                this._onSuccess(payload, 0);\n            }\n            else {\n                var results = this._parseResponse(xdr.responseText);\n                if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                    && !this._config.isRetryDisabled()) {\n                    this._onPartialSuccess(payload, results);\n                }\n                else {\n                    this._onError(payload, this._formatErrorMessageXdr(xdr));\n                }\n            }\n        };\n        Sender.prototype._constructEnvelope = function (envelope) {\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return EnvelopeCreator_1.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return EnvelopeCreator_1.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return EnvelopeCreator_1.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return EnvelopeCreator_1.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return EnvelopeCreator_1.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return EnvelopeCreator_1.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(this._logger, envelope);\n                default:\n                    // default create custom event type\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n            }\n        };\n        Sender._getDefaultAppInsightsChannelConfig = function (config, identifier) {\n            var resultConfig = {};\n            var pluginConfig = config.extensionConfig && config.extensionConfig[identifier] ? config.extensionConfig[identifier] : {};\n            // set default values\n            resultConfig.endpointUrl = function () { return config.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\"; };\n            resultConfig.emitLineDelimitedJson = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.emitLineDelimitedJson); };\n            resultConfig.maxBatchInterval = function () { return !isNaN(pluginConfig.maxBatchInterval) ? pluginConfig.maxBatchInterval : 15000; };\n            resultConfig.maxBatchSizeInBytes = function () { return pluginConfig.maxBatchSizeInBytes > 0 ? pluginConfig.maxBatchSizeInBytes : 102400; }; // 100kb\n            resultConfig.disableTelemetry = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.disableTelemetry); };\n            resultConfig.enableSessionStorageBuffer = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.enableSessionStorageBuffer, true); };\n            resultConfig.isRetryDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isRetryDisabled); };\n            resultConfig.isBeaconApiDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isBeaconApiDisabled, true); };\n            return resultConfig;\n        };\n        Sender._validate = function (envelope) {\n            // call the appropriate Validate depending on the baseType\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return TraceValidator_1.TraceValidator.TraceValidator.Validate(envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return ExceptionValidator_1.ExceptionValidator.ExceptionValidator.Validate(envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return MetricValidator_1.MetricValidator.MetricValidator.Validate(envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return PageViewValidator_1.PageViewValidator.PageViewValidator.Validate(envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return PageViewPerformanceValidator_1.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return RemoteDepdencyValidator_1.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(envelope);\n                default:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n            }\n        };\n        /**\n         * Send Beacon API request\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - not used\n         * Note: Beacon API does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._beaconSender = function (payload, isAsync) {\n            var url = this._config.endpointUrl();\n            var batch = this._buffer.batchPayloads(payload);\n            // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n            // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n            var plainTextBatch = new Blob([batch], { type: 'text/plain;charset=UTF-8' });\n            // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n            var queued = navigator.sendBeacon(url, plainTextBatch);\n            if (queued) {\n                this._buffer.markAsSent(payload);\n            }\n            else {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API.\");\n            }\n        };\n        /**\n         * Send XMLHttpRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         */\n        Sender.prototype._xhrSender = function (payload, isAsync) {\n            var _this = this;\n            var xhr = new XMLHttpRequest();\n            xhr[applicationinsights_common_1.DisabledPropertyName] = true;\n            xhr.open(\"POST\", this._config.endpointUrl(), isAsync);\n            xhr.setRequestHeader(\"Content-type\", \"application/json\");\n            // append Sdk-Context request header only in case of breeze endpoint \n            if (applicationinsights_common_1.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.sdkContextHeader, applicationinsights_common_1.RequestHeaders.sdkContextHeaderAppIdRequest);\n            }\n            xhr.onreadystatechange = function () { return _this._xhrReadyStateChange(xhr, payload, payload.length); };\n            xhr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXhr(xhr), event); };\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xhr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        /**\n         * Parses the response from the backend.\n         * @param response - XMLHttpRequest or XDomainRequest response\n         */\n        Sender.prototype._parseResponse = function (response) {\n            try {\n                if (response && response !== \"\") {\n                    var result = JSON.parse(response);\n                    if (result && result.itemsReceived && result.itemsReceived >= result.itemsAccepted &&\n                        result.itemsReceived - result.itemsAccepted == result.errors.length) {\n                        return result;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.InvalidBackendResponse, \"Cannot parse the response. \" + applicationinsights_common_1.Util.getExceptionName(e), {\n                    response: response\n                });\n            }\n            return null;\n        };\n        /**\n         * Resend payload. Adds payload back to the send buffer and setup a send timer (with exponential backoff).\n         * @param payload\n         */\n        Sender.prototype._resendPayload = function (payload, linearFactor) {\n            if (linearFactor === void 0) { linearFactor = 1; }\n            if (!payload || payload.length === 0) {\n                return;\n            }\n            this._buffer.clearSent(payload);\n            this._consecutiveErrors++;\n            for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                var item = payload_1[_i];\n                this._buffer.enqueue(item);\n            }\n            // setup timer\n            this._setRetryTime(linearFactor);\n            this._setupTimer();\n        };\n        /** Calculates the time to wait before retrying in case of an error based on\n         * http://en.wikipedia.org/wiki/Exponential_backoff\n         */\n        Sender.prototype._setRetryTime = function (linearFactor) {\n            var SlotDelayInSeconds = 10;\n            var delayInSeconds;\n            if (this._consecutiveErrors <= 1) {\n                delayInSeconds = SlotDelayInSeconds;\n            }\n            else {\n                var backOffSlot = (Math.pow(2, this._consecutiveErrors) - 1) / 2;\n                // tslint:disable-next-line:insecure-random\n                var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                backOffDelay = linearFactor * backOffDelay;\n                delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n            }\n            // TODO: Log the backoff time like the C# version does.\n            var retryAfterTimeSpan = Date.now() + (delayInSeconds * 1000);\n            // TODO: Log the retry at time like the C# version does.\n            this._retryAt = retryAfterTimeSpan;\n        };\n        /**\n         * Sets up the timer which triggers actually sending the data.\n         */\n        Sender.prototype._setupTimer = function () {\n            var _this = this;\n            if (!this._timeoutHandle) {\n                var retryInterval = this._retryAt ? Math.max(0, this._retryAt - Date.now()) : 0;\n                var timerValue = Math.max(this._config.maxBatchInterval(), retryInterval);\n                this._timeoutHandle = setTimeout(function () {\n                    _this.triggerSend();\n                }, timerValue);\n            }\n        };\n        /**\n         * Checks if the SDK should resend the payload after receiving this status code from the backend.\n         * @param statusCode\n         */\n        Sender.prototype._isRetriable = function (statusCode) {\n            return statusCode == 408 // Timeout\n                || statusCode == 429 // Too many requests.\n                || statusCode == 500 // Internal server error.\n                || statusCode == 503; // Service unavailable.\n        };\n        Sender.prototype._formatErrorMessageXhr = function (xhr, message) {\n            if (xhr) {\n                return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + xhr.responseText || xhr.response || \"\";\n            }\n            return message;\n        };\n        /**\n         * Send XDomainRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         *\n         * Note: XDomainRequest does not support sync requests. This 'isAsync' parameter is added\n         * to maintain consistency with the xhrSender's contract\n         * Note: XDomainRequest does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._xdrSender = function (payload, isAsync) {\n            var _this = this;\n            var xdr = new XDomainRequest();\n            xdr.onload = function () { return _this._xdrOnLoad(xdr, payload); };\n            xdr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXdr(xdr), event); };\n            // XDomainRequest requires the same protocol as the hosting page. \n            // If the protocol doesn't match, we can't send the telemetry :(. \n            var hostingProtocol = window.location.protocol;\n            if (this._config.endpointUrl().lastIndexOf(hostingProtocol, 0) !== 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                    \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                this._buffer.clear();\n                return;\n            }\n            var endpointUrl = this._config.endpointUrl().replace(/^(https?:)/, \"\");\n            xdr.open('POST', endpointUrl);\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xdr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        Sender.prototype._formatErrorMessageXdr = function (xdr, message) {\n            if (xdr) {\n                return \"XDomainRequest,Response:\" + xdr.responseText || \"\";\n            }\n            return message;\n        };\n        return Sender;\n    }());\n    exports.Sender = Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sender.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Serializer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Serializer = /** @class */ (function () {\n        function Serializer(logger) {\n            this._logger = logger;\n        }\n        /**\n         * Serializes the current object to a JSON string.\n         */\n        Serializer.prototype.serialize = function (input) {\n            var output = this._serializeObject(input, \"root\");\n            return JSON.stringify(output);\n        };\n        Serializer.prototype._serializeObject = function (source, name) {\n            var circularReferenceCheck = \"__aiCircularRefCheck\";\n            var output = {};\n            if (!source) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                return output;\n            }\n            if (source[circularReferenceCheck]) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CircularReferenceDetected, \"Circular reference detected while serializing object\", { name: name }, true);\n                return output;\n            }\n            if (!source.aiDataContract) {\n                // special case for measurements/properties/tags\n                if (name === \"measurements\") {\n                    output = this._serializeStringMap(source, \"number\", name);\n                }\n                else if (name === \"properties\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (name === \"tags\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (applicationinsights_common_1.Util.isArray(source)) {\n                    output = this._serializeArray(source, name);\n                }\n                else {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObjectNonSerializable, \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                    try {\n                        // verify that the object can be stringified\n                        JSON.stringify(source);\n                        output = source;\n                    }\n                    catch (e) {\n                        // if serialization fails return an empty string\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, (e && typeof e.toString === 'function') ? e.toString() : \"Error serializing object\", null, true);\n                    }\n                }\n                return output;\n            }\n            source[circularReferenceCheck] = true;\n            for (var field in source.aiDataContract) {\n                var contract = source.aiDataContract[field];\n                var isRequired = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Required) : (contract & applicationinsights_common_1.FieldType.Required);\n                var isHidden = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Hidden) : (contract & applicationinsights_common_1.FieldType.Hidden);\n                var isArray = contract & applicationinsights_common_1.FieldType.Array;\n                var isPresent = source[field] !== undefined;\n                var isObject = typeof source[field] === \"object\" && source[field] !== null;\n                if (isRequired && !isPresent && !isArray) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MissingRequiredFieldSpecification, \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    // If not in debug mode, continue and hope the error is permissible\n                    continue;\n                }\n                if (isHidden) {\n                    // Don't serialize hidden fields\n                    continue;\n                }\n                var value;\n                if (isObject) {\n                    if (isArray) {\n                        // special case; resurse on each object in the source array\n                        value = this._serializeArray(source[field], field);\n                    }\n                    else {\n                        // recurse on the source object in this field\n                        value = this._serializeObject(source[field], field);\n                    }\n                }\n                else {\n                    // assign the source field to the output even if undefined or required\n                    value = source[field];\n                }\n                // only emit this field if the value is defined\n                if (value !== undefined) {\n                    output[field] = value;\n                }\n            }\n            delete source[circularReferenceCheck];\n            return output;\n        };\n        Serializer.prototype._serializeArray = function (sources, name) {\n            var output = undefined;\n            if (!!sources) {\n                if (!applicationinsights_common_1.Util.isArray(sources)) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ItemNotInArray, \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                }\n                else {\n                    output = [];\n                    for (var i = 0; i < sources.length; i++) {\n                        var source = sources[i];\n                        var item = this._serializeObject(source, name + \"[\" + i + \"]\");\n                        output.push(item);\n                    }\n                }\n            }\n            return output;\n        };\n        Serializer.prototype._serializeStringMap = function (map, expectedType, name) {\n            var output = undefined;\n            if (map) {\n                output = {};\n                for (var field in map) {\n                    var value = map[field];\n                    if (expectedType === \"string\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else if (!value.toString) {\n                            output[field] = \"invalid field: toString() is not defined.\";\n                        }\n                        else {\n                            output[field] = value.toString();\n                        }\n                    }\n                    else if (expectedType === \"number\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else {\n                            var num = parseFloat(value);\n                            if (isNaN(num)) {\n                                output[field] = \"NaN\";\n                            }\n                            else {\n                                output[field] = num;\n                            }\n                        }\n                    }\n                    else {\n                        output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, output[field], null, true);\n                    }\n                }\n            }\n            return output;\n        };\n        return Serializer;\n    }());\n    exports.Serializer = Serializer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Serializer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var EventValidator = /** @class */ (function () {\n        function EventValidator() {\n        }\n        EventValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n            https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties || !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties || !item.domainProperties[\"name\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        EventValidator.EventValidator = new EventValidator();\n        return EventValidator;\n    }());\n    exports.EventValidator = EventValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var ExceptionValidator = /** @class */ (function () {\n        function ExceptionValidator() {\n        }\n        ExceptionValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"exceptions\"] ||\n                !ExceptionValidator._validateExceptions(item.domainProperties[\"exceptions\"])) {\n                return false;\n            }\n            */\n            return true;\n        };\n        // TODO implement validation of exceptions\n        ExceptionValidator._validateExceptions = function (exceptions) {\n            // typeName\n            // message\n            // parsedStack\n            // stack\n            // hasFullStack\n            return true;\n        };\n        ExceptionValidator.ExceptionValidator = new ExceptionValidator();\n        return ExceptionValidator;\n    }());\n    exports.ExceptionValidator = ExceptionValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var MetricValidator = /** @class */ (function () {\n        function MetricValidator() {\n        }\n        MetricValidator.prototype.Validate = function (event) {\n            return true;\n        };\n        MetricValidator.MetricValidator = new MetricValidator();\n        return MetricValidator;\n    }());\n    exports.MetricValidator = MetricValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\":\n/*!****************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js ***!\n  \\****************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformanceValidator = /** @class */ (function () {\n        function PageViewPerformanceValidator() {\n        }\n        PageViewPerformanceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n            \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"domProcessing\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"networkConnect\"] ||\n                !item.domainProperties[\"perfTotal\"] ||\n                !item.domainProperties[\"receivedResponse\"] ||\n                !item.domainProperties[\"sentRequest\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewPerformanceValidator.PageViewPerformanceValidator = new PageViewPerformanceValidator();\n        return PageViewPerformanceValidator;\n    }());\n    exports.PageViewPerformanceValidator = PageViewPerformanceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformanceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewValidator = /** @class */ (function () {\n        function PageViewValidator() {\n        }\n        PageViewValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewValidator.PageViewValidator = new PageViewValidator();\n        return PageViewValidator;\n    }());\n    exports.PageViewValidator = PageViewValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDepdencyValidator = /** @class */ (function () {\n        function RemoteDepdencyValidator() {\n        }\n        RemoteDepdencyValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"resultCode\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"success\"] ||\n                !item.domainProperties[\"data\"] ||\n                !item.domainProperties[\"target\"] ||\n                !item.domainProperties[\"type\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        RemoteDepdencyValidator.RemoteDepdencyValidator = new RemoteDepdencyValidator();\n        return RemoteDepdencyValidator;\n    }());\n    exports.RemoteDepdencyValidator = RemoteDepdencyValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDepdencyValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TraceValidator = /** @class */ (function () {\n        function TraceValidator() {\n        }\n        TraceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties ||\n                !item.domainProperties[\"message\"] ||\n                !item.domainProperties[\"severityLevel\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        TraceValidator.TraceValidator = new TraceValidator();\n        return TraceValidator;\n    }());\n    exports.TraceValidator = TraceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TraceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Sender */ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Sender_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Sender = Sender_1.Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-channel-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Constants.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Constants.js ***!\n  \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Constants.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Enums.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Enums.js ***!\n  \\*****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Type of storage to differentiate between local storage and session storage\n    */\n    var StorageType;\n    (function (StorageType) {\n        StorageType[StorageType[\"LocalStorage\"] = 0] = \"LocalStorage\";\n        StorageType[StorageType[\"SessionStorage\"] = 1] = \"SessionStorage\";\n    })(StorageType = exports.StorageType || (exports.StorageType = {}));\n    /**\n     * Enum is used in aiDataContract to describe how fields are serialized.\n     * For instance: (Fieldtype.Required | FieldType.Array) will mark the field as required and indicate it's an array\n     */\n    var FieldType;\n    (function (FieldType) {\n        FieldType[FieldType[\"Default\"] = 0] = \"Default\";\n        FieldType[FieldType[\"Required\"] = 1] = \"Required\";\n        FieldType[FieldType[\"Array\"] = 2] = \"Array\";\n        FieldType[FieldType[\"Hidden\"] = 4] = \"Hidden\";\n    })(FieldType = exports.FieldType || (exports.FieldType = {}));\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Enums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n         * Data struct to contain only C section with custom fields.\n         */\n    var Base = /** @class */ (function () {\n        function Base() {\n        }\n        return Base;\n    }());\n    exports.Base = Base;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Base.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    var ContextTagKeys = /** @class */ (function () {\n        function ContextTagKeys() {\n            this.applicationVersion = \"ai.application.ver\";\n            this.applicationBuild = \"ai.application.build\";\n            this.applicationTypeId = \"ai.application.typeId\";\n            this.applicationId = \"ai.application.applicationId\";\n            this.applicationLayer = \"ai.application.layer\";\n            this.deviceId = \"ai.device.id\";\n            this.deviceIp = \"ai.device.ip\";\n            this.deviceLanguage = \"ai.device.language\";\n            this.deviceLocale = \"ai.device.locale\";\n            this.deviceModel = \"ai.device.model\";\n            this.deviceFriendlyName = \"ai.device.friendlyName\";\n            this.deviceNetwork = \"ai.device.network\";\n            this.deviceNetworkName = \"ai.device.networkName\";\n            this.deviceOEMName = \"ai.device.oemName\";\n            this.deviceOS = \"ai.device.os\";\n            this.deviceOSVersion = \"ai.device.osVersion\";\n            this.deviceRoleInstance = \"ai.device.roleInstance\";\n            this.deviceRoleName = \"ai.device.roleName\";\n            this.deviceScreenResolution = \"ai.device.screenResolution\";\n            this.deviceType = \"ai.device.type\";\n            this.deviceMachineName = \"ai.device.machineName\";\n            this.deviceVMName = \"ai.device.vmName\";\n            this.deviceBrowser = \"ai.device.browser\";\n            this.deviceBrowserVersion = \"ai.device.browserVersion\";\n            this.locationIp = \"ai.location.ip\";\n            this.locationCountry = \"ai.location.country\";\n            this.locationProvince = \"ai.location.province\";\n            this.locationCity = \"ai.location.city\";\n            this.operationId = \"ai.operation.id\";\n            this.operationName = \"ai.operation.name\";\n            this.operationParentId = \"ai.operation.parentId\";\n            this.operationRootId = \"ai.operation.rootId\";\n            this.operationSyntheticSource = \"ai.operation.syntheticSource\";\n            this.operationCorrelationVector = \"ai.operation.correlationVector\";\n            this.sessionId = \"ai.session.id\";\n            this.sessionIsFirst = \"ai.session.isFirst\";\n            this.sessionIsNew = \"ai.session.isNew\";\n            this.userAccountAcquisitionDate = \"ai.user.accountAcquisitionDate\";\n            this.userAccountId = \"ai.user.accountId\";\n            this.userAgent = \"ai.user.userAgent\";\n            this.userId = \"ai.user.id\";\n            this.userStoreRegion = \"ai.user.storeRegion\";\n            this.userAuthUserId = \"ai.user.authUserId\";\n            this.userAnonymousUserAcquisitionDate = \"ai.user.anonUserAcquisitionDate\";\n            this.userAuthenticatedUserAcquisitionDate = \"ai.user.authUserAcquisitionDate\";\n            this.cloudName = \"ai.cloud.name\";\n            this.cloudRole = \"ai.cloud.role\";\n            this.cloudRoleVer = \"ai.cloud.roleVer\";\n            this.cloudRoleInstance = \"ai.cloud.roleInstance\";\n            this.cloudEnvironment = \"ai.cloud.environment\";\n            this.cloudLocation = \"ai.cloud.location\";\n            this.cloudDeploymentUnit = \"ai.cloud.deploymentUnit\";\n            this.internalSdkVersion = \"ai.internal.sdkVersion\";\n            this.internalAgentVersion = \"ai.internal.agentVersion\";\n            this.internalNodeName = \"ai.internal.nodeName\";\n        }\n        return ContextTagKeys;\n    }());\n    exports.ContextTagKeys = ContextTagKeys;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ContextTagKeys.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Base_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Data struct to contain both B and C sections.\n     */\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        function Data() {\n            return _super.call(this) || this;\n        }\n        return Data;\n    }(Base_1.Base));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./DataPointType */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPointType_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Metric data single measurement.\n     */\n    var DataPoint = /** @class */ (function () {\n        function DataPoint() {\n            this.kind = DataPointType_1.DataPointType.Measurement;\n        }\n        return DataPoint;\n    }());\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Type of the metric data measurement.\n     */\n    var DataPointType;\n    (function (DataPointType) {\n        DataPointType[DataPointType[\"Measurement\"] = 0] = \"Measurement\";\n        DataPointType[DataPointType[\"Aggregation\"] = 1] = \"Aggregation\";\n    })(DataPointType = exports.DataPointType || (exports.DataPointType = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPointType.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\":\n/*!*************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js ***!\n  \\*************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The abstract common base of all domains.\n     */\n    var Domain = /** @class */ (function () {\n        function Domain() {\n        }\n        return Domain;\n    }());\n    exports.Domain = Domain;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Domain.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * System variables for a telemetry item.\n     */\n    var Envelope = /** @class */ (function () {\n        function Envelope() {\n            this.ver = 1;\n            this.sampleRate = 100.0;\n            this.tags = {};\n        }\n        return Envelope;\n    }());\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Event represent structured event records that can be grouped and searched by their properties. Event data item also creates a metric of event count by name.\n     */\n    var EventData = /** @class */ (function (_super) {\n        __extends(EventData, _super);\n        function EventData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return EventData;\n    }(Domain_1.Domain));\n    exports.EventData = EventData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Exception represents a handled or unhandled exception that occurred during execution of the monitored application.\n     */\n    var ExceptionData = /** @class */ (function (_super) {\n        __extends(ExceptionData, _super);\n        function ExceptionData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.exceptions = [];\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return ExceptionData;\n    }(Domain_1.Domain));\n    exports.ExceptionData = ExceptionData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Exception details of the exception in a chain.\n     */\n    var ExceptionDetails = /** @class */ (function () {\n        function ExceptionDetails() {\n            this.hasFullStack = true;\n            this.parsedStack = [];\n        }\n        return ExceptionDetails;\n    }());\n    exports.ExceptionDetails = ExceptionDetails;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionDetails.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Message represent printf-like trace statements that are text-searched. Log4Net, NLog and other text-based log file entries are translated into intances of this type. The message does not have measurements.\n     */\n    var MessageData = /** @class */ (function (_super) {\n        __extends(MessageData, _super);\n        function MessageData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            return _this;\n        }\n        return MessageData;\n    }(Domain_1.Domain));\n    exports.MessageData = MessageData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MessageData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of the Metric item is a list of measurements (single data points) and/or aggregations.\n     */\n    var MetricData = /** @class */ (function (_super) {\n        __extends(MetricData, _super);\n        function MetricData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.metrics = [];\n            _this.properties = {};\n            return _this;\n        }\n        return MetricData;\n    }(Domain_1.Domain));\n    exports.MetricData = MetricData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\":\n/*!*******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js ***!\n  \\*******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageView represents a generic action on a page like a button click. It is also the base type for PageView.\n     */\n    var PageViewData = /** @class */ (function (_super) {\n        __extends(PageViewData, _super);\n        function PageViewData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewData;\n    }(EventData_1.EventData));\n    exports.PageViewData = PageViewData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageViewPerf represents: a page view with no performance data, a page view with performance data, or just the performance data of an earlier page request.\n     */\n    var PageViewPerfData = /** @class */ (function (_super) {\n        __extends(PageViewPerfData, _super);\n        function PageViewPerfData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewPerfData;\n    }(PageViewData_1.PageViewData));\n    exports.PageViewPerfData = PageViewPerfData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerfData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\":\n/*!***************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js ***!\n  \\***************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Remote Dependency represents an interaction of the monitored component with a remote component/service like SQL or an HTTP endpoint.\n     */\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        function RemoteDependencyData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.success = true;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return RemoteDependencyData;\n    }(Domain_1.Domain));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Defines the level of severity for the event.\n    */\n    var SeverityLevel;\n    (function (SeverityLevel) {\n        SeverityLevel[SeverityLevel[\"Verbose\"] = 0] = \"Verbose\";\n        SeverityLevel[SeverityLevel[\"Information\"] = 1] = \"Information\";\n        SeverityLevel[SeverityLevel[\"Warning\"] = 2] = \"Warning\";\n        SeverityLevel[SeverityLevel[\"Error\"] = 3] = \"Error\";\n        SeverityLevel[SeverityLevel[\"Critical\"] = 4] = \"Critical\";\n    })(SeverityLevel = exports.SeverityLevel || (exports.SeverityLevel = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SeverityLevel.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Stack frame information.\n     */\n    var StackFrame = /** @class */ (function () {\n        function StackFrame() {\n        }\n        return StackFrame;\n    }());\n    exports.StackFrame = StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=StackFrame.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RequestHeaders = /** @class */ (function () {\n        function RequestHeaders() {\n        }\n        /**\n         * Request-Context header\n         */\n        RequestHeaders.requestContextHeader = \"Request-Context\";\n        /**\n         * Target instrumentation header that is added to the response and retrieved by the\n         * calling application when processing incoming responses.\n         */\n        RequestHeaders.requestContextTargetKey = \"appId\";\n        /**\n         * Request-Context appId format\n         */\n        RequestHeaders.requestContextAppIdFormat = \"appId=cid-v1:\";\n        /**\n         * Request-Id header\n         */\n        RequestHeaders.requestIdHeader = \"Request-Id\";\n        /**\n         * Sdk-Context header\n         * If this header passed with appId in content then appId will be returned back by the backend.\n         */\n        RequestHeaders.sdkContextHeader = \"Sdk-Context\";\n        /**\n         * String to pass in header for requesting appId back from the backend.\n         */\n        RequestHeaders.sdkContextHeaderAppIdRequest = \"appId\";\n        RequestHeaders.requestContextHeaderLowerCase = \"request-context\";\n        return RequestHeaders;\n    }());\n    exports.RequestHeaders = RequestHeaders;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RequestResponseHeaders.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Data_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Data(baseType, data) {\n            var _this = _super.call(this) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                baseType: Enums_1.FieldType.Required,\n                baseData: Enums_1.FieldType.Required\n            };\n            _this.baseType = baseType;\n            _this.baseData = data;\n            return _this;\n        }\n        return Data;\n    }(Data_1.Data));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPoint_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataPoint = /** @class */ (function (_super) {\n        __extends(DataPoint, _super);\n        function DataPoint() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                name: Enums_1.FieldType.Required,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Required,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default\n            };\n            return _this;\n        }\n        return DataPoint;\n    }(DataPoint_1.DataPoint));\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataSanitizer = /** @class */ (function () {\n        function DataSanitizer() {\n        }\n        DataSanitizer.sanitizeKeyAndAddUniqueness = function (logger, key, map) {\n            var origLength = key.length;\n            var field = DataSanitizer.sanitizeKey(logger, key);\n            // validation truncated the length.  We need to add uniqueness\n            if (field.length !== origLength) {\n                var i = 0;\n                var uniqueField = field;\n                while (map[uniqueField] !== undefined) {\n                    i++;\n                    uniqueField = field.substring(0, DataSanitizer.MAX_NAME_LENGTH - 3) + DataSanitizer.padNumber(i);\n                }\n                field = uniqueField;\n            }\n            return field;\n        };\n        DataSanitizer.sanitizeKey = function (logger, name) {\n            if (name) {\n                // Remove any leading or trailing whitepace\n                name = Util_1.Util.trim(name.toString());\n                // truncate the string to 150 chars\n                if (name.length > DataSanitizer.MAX_NAME_LENGTH) {\n                    name = name.substring(0, DataSanitizer.MAX_NAME_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NameTooLong, \"name is too long.  It has been truncated to \" + DataSanitizer.MAX_NAME_LENGTH + \" characters.\", { name: name }, true);\n                }\n            }\n            return name;\n        };\n        DataSanitizer.sanitizeString = function (logger, value, maxLength) {\n            if (maxLength === void 0) { maxLength = DataSanitizer.MAX_STRING_LENGTH; }\n            if (value) {\n                maxLength = maxLength ? maxLength : DataSanitizer.MAX_STRING_LENGTH; // in case default parameters dont work\n                value = Util_1.Util.trim(value);\n                if (value.toString().length > maxLength) {\n                    value = value.toString().substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StringValueTooLong, \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n                }\n            }\n            return value;\n        };\n        DataSanitizer.sanitizeUrl = function (logger, url) {\n            return DataSanitizer.sanitizeInput(logger, url, DataSanitizer.MAX_URL_LENGTH, applicationinsights_core_js_1._InternalMessageId.UrlTooLong);\n        };\n        DataSanitizer.sanitizeMessage = function (logger, message) {\n            if (message) {\n                if (message.length > DataSanitizer.MAX_MESSAGE_LENGTH) {\n                    message = message.substring(0, DataSanitizer.MAX_MESSAGE_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.MessageTruncated, \"message is too long, it has been truncated to \" + DataSanitizer.MAX_MESSAGE_LENGTH + \" characters.\", { message: message }, true);\n                }\n            }\n            return message;\n        };\n        DataSanitizer.sanitizeException = function (logger, exception) {\n            if (exception) {\n                if (exception.length > DataSanitizer.MAX_EXCEPTION_LENGTH) {\n                    exception = exception.substring(0, DataSanitizer.MAX_EXCEPTION_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ExceptionTruncated, \"exception is too long, it has been truncated to \" + DataSanitizer.MAX_EXCEPTION_LENGTH + \" characters.\", { exception: exception }, true);\n                }\n            }\n            return exception;\n        };\n        DataSanitizer.sanitizeProperties = function (logger, properties) {\n            if (properties) {\n                var tempProps = {};\n                for (var prop in properties) {\n                    var value = DataSanitizer.sanitizeString(logger, properties[prop], DataSanitizer.MAX_PROPERTY_LENGTH);\n                    prop = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, prop, tempProps);\n                    tempProps[prop] = value;\n                }\n                properties = tempProps;\n            }\n            return properties;\n        };\n        DataSanitizer.sanitizeMeasurements = function (logger, measurements) {\n            if (measurements) {\n                var tempMeasurements = {};\n                for (var measure in measurements) {\n                    var value = measurements[measure];\n                    measure = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements);\n                    tempMeasurements[measure] = value;\n                }\n                measurements = tempMeasurements;\n            }\n            return measurements;\n        };\n        DataSanitizer.sanitizeId = function (logger, id) {\n            return id ? DataSanitizer.sanitizeInput(logger, id, DataSanitizer.MAX_ID_LENGTH, applicationinsights_core_js_1._InternalMessageId.IdTooLong).toString() : id;\n        };\n        DataSanitizer.sanitizeInput = function (logger, input, maxLength, _msgId) {\n            if (input) {\n                input = Util_1.Util.trim(input);\n                if (input.length > maxLength) {\n                    input = input.substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n                }\n            }\n            return input;\n        };\n        DataSanitizer.padNumber = function (num) {\n            var s = \"00\" + num;\n            return s.substr(s.length - 3);\n        };\n        /**\n        * Max length allowed for custom names.\n        */\n        DataSanitizer.MAX_NAME_LENGTH = 150;\n        /**\n         * Max length allowed for Id field in page views.\n         */\n        DataSanitizer.MAX_ID_LENGTH = 128;\n        /**\n         * Max length allowed for custom values.\n         */\n        DataSanitizer.MAX_PROPERTY_LENGTH = 8192;\n        /**\n         * Max length allowed for names\n         */\n        DataSanitizer.MAX_STRING_LENGTH = 1024;\n        /**\n         * Max length allowed for url.\n         */\n        DataSanitizer.MAX_URL_LENGTH = 2048;\n        /**\n         * Max length allowed for messages.\n         */\n        DataSanitizer.MAX_MESSAGE_LENGTH = 32768;\n        /**\n         * Max length allowed for exceptions.\n         */\n        DataSanitizer.MAX_EXCEPTION_LENGTH = 32768;\n        return DataSanitizer;\n    }());\n    exports.DataSanitizer = DataSanitizer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataSanitizer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\":\n/*!*************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js ***!\n  \\*************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Envelope */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\"), __webpack_require__(/*! ./DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Envelope_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Envelope = /** @class */ (function (_super) {\n        __extends(Envelope, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Envelope(logger, data, name) {\n            var _this = _super.call(this) || this;\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.data = data;\n            _this.time = Util_1.Util.toISOStringForIE8(new Date());\n            _this.aiDataContract = {\n                time: Enums_1.FieldType.Required,\n                iKey: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                sampleRate: function () {\n                    return (_this.sampleRate == 100) ? Enums_1.FieldType.Hidden : Enums_1.FieldType.Required;\n                },\n                tags: Enums_1.FieldType.Required,\n                data: Enums_1.FieldType.Required\n            };\n            return _this;\n        }\n        return Envelope;\n    }(Envelope_1.Envelope));\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Event.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Event = /** @class */ (function (_super) {\n        __extends(Event, _super);\n        /**\n         * Constructs a new instance of the EventTelemetry object\n         */\n        function Event(logger, name, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n        Event.dataType = \"EventData\";\n        return Event;\n    }(EventData_1.EventData));\n    exports.Event = Event;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Event.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/StackFrame */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionDetails */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, StackFrame_1, ExceptionData_1, ExceptionDetails_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Exception = /** @class */ (function (_super) {\n        __extends(Exception, _super);\n        /**\n        * Constructs a new isntance of the ExceptionTelemetry object\n        */\n        function Exception(logger, exception, properties, measurements, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                exceptions: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            _this.exceptions = [new _ExceptionDetails(logger, exception)];\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        /**\n        * Creates a simple exception with 1 stack frame. Useful for manual constracting of exception.\n        */\n        Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n            return {\n                exceptions: [\n                    {\n                        hasFullStack: true,\n                        message: message,\n                        stack: details,\n                        typeName: typeName\n                    }\n                ]\n            };\n        };\n        Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n        Exception.dataType = \"ExceptionData\";\n        return Exception;\n    }(ExceptionData_1.ExceptionData));\n    exports.Exception = Exception;\n    var _ExceptionDetails = /** @class */ (function (_super) {\n        __extends(_ExceptionDetails, _super);\n        function _ExceptionDetails(logger, exception) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Default,\n                outerId: Enums_1.FieldType.Default,\n                typeName: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                hasFullStack: Enums_1.FieldType.Default,\n                stack: Enums_1.FieldType.Default,\n                parsedStack: Enums_1.FieldType.Array\n            };\n            _this.typeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, exception.name) || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, exception.message) || Util_1.Util.NotSpecified;\n            var stack = exception[\"stack\"];\n            _this.parsedStack = _this.parseStack(stack);\n            _this.stack = DataSanitizer_1.DataSanitizer.sanitizeException(logger, stack);\n            _this.hasFullStack = Util_1.Util.isArray(_this.parsedStack) && _this.parsedStack.length > 0;\n            return _this;\n        }\n        _ExceptionDetails.prototype.parseStack = function (stack) {\n            var parsedStack = undefined;\n            if (typeof stack === \"string\") {\n                var frames = stack.split('\\n');\n                parsedStack = [];\n                var level = 0;\n                var totalSizeInBytes = 0;\n                for (var i = 0; i <= frames.length; i++) {\n                    var frame = frames[i];\n                    if (_StackFrame.regex.test(frame)) {\n                        var parsedFrame = new _StackFrame(frames[i], level++);\n                        totalSizeInBytes += parsedFrame.sizeInBytes;\n                        parsedStack.push(parsedFrame);\n                    }\n                }\n                // DP Constraint - exception parsed stack must be < 32KB\n                // remove frames from the middle to meet the threshold\n                var exceptionParsedStackThreshold = 32 * 1024;\n                if (totalSizeInBytes > exceptionParsedStackThreshold) {\n                    var left = 0;\n                    var right = parsedStack.length - 1;\n                    var size = 0;\n                    var acceptedLeft = left;\n                    var acceptedRight = right;\n                    while (left < right) {\n                        // check size\n                        var lSize = parsedStack[left].sizeInBytes;\n                        var rSize = parsedStack[right].sizeInBytes;\n                        size += lSize + rSize;\n                        if (size > exceptionParsedStackThreshold) {\n                            // remove extra frames from the middle\n                            var howMany = acceptedRight - acceptedLeft + 1;\n                            parsedStack.splice(acceptedLeft, howMany);\n                            break;\n                        }\n                        // update pointers\n                        acceptedLeft = left;\n                        acceptedRight = right;\n                        left++;\n                        right--;\n                    }\n                }\n            }\n            return parsedStack;\n        };\n        return _ExceptionDetails;\n    }(ExceptionDetails_1.ExceptionDetails));\n    var _StackFrame = /** @class */ (function (_super) {\n        __extends(_StackFrame, _super);\n        function _StackFrame(frame, level) {\n            var _this = _super.call(this) || this;\n            _this.sizeInBytes = 0;\n            _this.aiDataContract = {\n                level: Enums_1.FieldType.Required,\n                method: Enums_1.FieldType.Required,\n                assembly: Enums_1.FieldType.Default,\n                fileName: Enums_1.FieldType.Default,\n                line: Enums_1.FieldType.Default\n            };\n            _this.level = level;\n            _this.method = \"<no_method>\";\n            _this.assembly = Util_1.Util.trim(frame);\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches.length >= 5) {\n                _this.method = Util_1.Util.trim(matches[2]) || _this.method;\n                _this.fileName = Util_1.Util.trim(matches[4]);\n                _this.line = parseInt(matches[5]) || 0;\n            }\n            _this.sizeInBytes += _this.method.length;\n            _this.sizeInBytes += _this.fileName.length;\n            _this.sizeInBytes += _this.assembly.length;\n            // todo: these might need to be removed depending on how the back-end settles on their size calculation\n            _this.sizeInBytes += _StackFrame.baseSize;\n            _this.sizeInBytes += _this.level.toString().length;\n            _this.sizeInBytes += _this.line.toString().length;\n            return _this;\n        }\n        // regex to match stack frames from ie/chrome/ff\n        // methodName=$2, fileName=$4, lineNo=$5, column=$6\n        _StackFrame.regex = /^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n        _StackFrame.baseSize = 58; //'{\"method\":\"\",\"level\":,\"assembly\":\"\",\"fileName\":\"\",\"line\":}'.length\n        return _StackFrame;\n    }(StackFrame_1.StackFrame));\n    exports._StackFrame = _StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Exception.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js ***!\n  \\****************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MetricData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MetricData_1, DataSanitizer_1, Enums_1, DataPoint_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Metric = /** @class */ (function (_super) {\n        __extends(Metric, _super);\n        /**\n         * Constructs a new instance of the MetricTelemetry object\n         */\n        function Metric(logger, name, value, count, min, max, properties) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                metrics: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default\n            };\n            var dataPoint = new DataPoint_1.DataPoint();\n            dataPoint.count = count > 0 ? count : undefined;\n            dataPoint.max = isNaN(max) || max === null ? undefined : max;\n            dataPoint.min = isNaN(min) || min === null ? undefined : min;\n            dataPoint.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            dataPoint.value = value;\n            _this.metrics = [dataPoint];\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            return _this;\n        }\n        Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n        Metric.dataType = \"MetricData\";\n        return Metric;\n    }(MetricData_1.MetricData));\n    exports.Metric = Metric;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Metric.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageView = /** @class */ (function (_super) {\n        __extends(PageView, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageView(logger, name, url, durationMs, properties, measurements, id) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                id: Enums_1.FieldType.Default,\n            };\n            _this.id = DataSanitizer_1.DataSanitizer.sanitizeId(logger, id);\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            if (!isNaN(durationMs)) {\n                _this.duration = Util_1.Util.msToTimeSpan(durationMs);\n            }\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n        PageView.dataType = \"PageviewData\";\n        return PageView;\n    }(PageViewData_1.PageViewData));\n    exports.PageView = PageView;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageView.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewPerfData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewPerfData_1, Enums_1, DataSanitizer_1, Util_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformance = /** @class */ (function (_super) {\n        __extends(PageViewPerformance, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageViewPerformance(logger, name, url, unused, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                perfTotal: Enums_1.FieldType.Default,\n                networkConnect: Enums_1.FieldType.Default,\n                sentRequest: Enums_1.FieldType.Default,\n                receivedResponse: Enums_1.FieldType.Default,\n                domProcessing: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.isValid = false;\n            /*\n             * http://www.w3.org/TR/navigation-timing/#processing-model\n             *  |-navigationStart\n             *  |             |-connectEnd\n             *  |             ||-requestStart\n             *  |             ||             |-responseStart\n             *  |             ||             |              |-responseEnd\n             *  |             ||             |              |\n             *  |             ||             |              |         |-loadEventEnd\n             *  |---network---||---request---|---response---|---dom---|\n             *  |--------------------------total----------------------|\n             */\n            var timing = PageViewPerformance.getPerformanceTiming();\n            if (timing) {\n                var total = PageViewPerformance.getDuration(timing.navigationStart, timing.loadEventEnd);\n                var network = PageViewPerformance.getDuration(timing.navigationStart, timing.connectEnd);\n                var request = PageViewPerformance.getDuration(timing.requestStart, timing.responseStart);\n                var response = PageViewPerformance.getDuration(timing.responseStart, timing.responseEnd);\n                var dom = PageViewPerformance.getDuration(timing.responseEnd, timing.loadEventEnd);\n                if (total == 0) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ErrorPVCalc, \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (!PageViewPerformance.shouldCollectDuration(total, network, request, response, dom)) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.InvalidDurationValue, \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                    // some browsers may report individual components incorrectly so that the sum of the parts will be bigger than total PLT\n                    // in this case, don't report client performance from this page\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ClientPerformanceMathError, \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else {\n                    _this.durationMs = total;\n                    // convert to timespans\n                    _this.perfTotal = _this.duration = Util_1.Util.msToTimeSpan(total);\n                    _this.networkConnect = Util_1.Util.msToTimeSpan(network);\n                    _this.sentRequest = Util_1.Util.msToTimeSpan(request);\n                    _this.receivedResponse = Util_1.Util.msToTimeSpan(response);\n                    _this.domProcessing = Util_1.Util.msToTimeSpan(dom);\n                    _this.isValid = true;\n                }\n            }\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        /**\n         * Indicates whether this instance of PageViewPerformance is valid and should be sent\n         */\n        PageViewPerformance.prototype.getIsValid = function () {\n            return this.isValid;\n        };\n        /**\n        * Gets the total duration (PLT) in milliseconds. Check getIsValid() before using this method.\n        */\n        PageViewPerformance.prototype.getDurationMs = function () {\n            return this.durationMs;\n        };\n        PageViewPerformance.getPerformanceTiming = function () {\n            if (PageViewPerformance.isPerformanceTimingSupported()) {\n                return window.performance.timing;\n            }\n            return null;\n        };\n        /**\n        * Returns true is window performance timing API is supported, false otherwise.\n        */\n        PageViewPerformance.isPerformanceTimingSupported = function () {\n            return typeof window != \"undefined\" && window.performance && window.performance.timing;\n        };\n        /**\n         * As page loads different parts of performance timing numbers get set. When all of them are set we can report it.\n         * Returns true if ready, false otherwise.\n         */\n        PageViewPerformance.isPerformanceTimingDataReady = function () {\n            var timing = window.performance.timing;\n            return timing.domainLookupStart > 0\n                && timing.navigationStart > 0\n                && timing.responseStart > 0\n                && timing.requestStart > 0\n                && timing.loadEventEnd > 0\n                && timing.responseEnd > 0\n                && timing.connectEnd > 0\n                && timing.domLoading > 0;\n        };\n        PageViewPerformance.getDuration = function (start, end) {\n            var duration = undefined;\n            if (!(isNaN(start) || isNaN(end))) {\n                duration = Math.max(end - start, 0);\n            }\n            return duration;\n        };\n        /**\n         * This method tells if given durations should be excluded from collection.\n         */\n        PageViewPerformance.shouldCollectDuration = function () {\n            var durations = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                durations[_i] = arguments[_i];\n            }\n            // a full list of Google crawlers user agent strings - https://support.google.com/webmasters/answer/1061943?hl=en\n            var botAgentNames = ['googlebot', 'adsbot-google', 'apis-google', 'mediapartners-google'];\n            var userAgent = navigator.userAgent;\n            var isGoogleBot = false;\n            if (userAgent) {\n                for (var i_1 = 0; i_1 < botAgentNames.length; i_1++) {\n                    isGoogleBot = isGoogleBot || userAgent.toLowerCase().indexOf(botAgentNames[i_1]) !== -1;\n                }\n            }\n            if (isGoogleBot) {\n                // Don't report durations for GoogleBot, it is returning invalid values in performance.timing API. \n                return false;\n            }\n            else {\n                // for other page views, don't report if it's outside of a reasonable range\n                for (var i = 0; i < durations.length; i++) {\n                    if (durations[i] >= PageViewPerformance.MAX_DURATION_ALLOWED) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        };\n        PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n        PageViewPerformance.dataType = \"PageviewPerformanceData\";\n        PageViewPerformance.MAX_DURATION_ALLOWED = 3600000; // 1h\n        return PageViewPerformance;\n    }(PageViewPerfData_1.PageViewPerfData));\n    exports.PageViewPerformance = PageViewPerformance;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformance.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataSanitizer_1, Enums_1, Util_1, Util_2, RemoteDependencyData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        /**\n         * Constructs a new instance of the RemoteDependencyData object\n         */\n        function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Required,\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                resultCode: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                success: Enums_1.FieldType.Default,\n                data: Enums_1.FieldType.Default,\n                target: Enums_1.FieldType.Default,\n                type: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Default,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default,\n                dependencyKind: Enums_1.FieldType.Default,\n                dependencySource: Enums_1.FieldType.Default,\n                commandName: Enums_1.FieldType.Default,\n                dependencyTypeName: Enums_1.FieldType.Default,\n            };\n            _this.id = id;\n            _this.duration = Util_1.Util.msToTimeSpan(value);\n            _this.success = success;\n            _this.resultCode = resultCode + \"\";\n            _this.type = \"Ajax\";\n            _this.data = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, commandName);\n            var dependencyFields = Util_2.AjaxHelper.ParseDependencyPath(logger, absoluteUrl, method, commandName);\n            _this.target = dependencyFields.target;\n            _this.name = dependencyFields.name;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n        RemoteDependencyData.dataType = \"RemoteDependencyData\";\n        return RemoteDependencyData;\n    }(RemoteDependencyData_1.RemoteDependencyData));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MessageData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MessageData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Trace = /** @class */ (function (_super) {\n        __extends(Trace, _super);\n        /**\n         * Constructs a new instance of the TraceTelemetry object\n         */\n        function Trace(logger, message, properties, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default\n            };\n            message = message || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, message);\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n        Trace.dataType = \"MessageData\";\n        return Trace;\n    }(MessageData_1.MessageData));\n    exports.Trace = Trace;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Trace.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\":\n/*!********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js ***!\n  \\********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, DataSanitizer_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TelemetryItemCreator = /** @class */ (function () {\n        function TelemetryItemCreator() {\n        }\n        /**\n         * Create a telemetry item that the 1DS channel understands\n         * @param item domain specific properties; part B\n         * @param baseType telemetry item type. ie PageViewData\n         * @param envelopeName name of the envelope. ie Microsoft.ApplicationInsights.<instrumentation key>.PageView\n         * @param customProperties user defined custom properties; part C\n         * @param systemProperties system properties that are added to the context; part A\n         * @returns ITelemetryItem that is sent to channel\n         */\n        TelemetryItemCreator.create = function (item, baseType, envelopeName, logger, customProperties, systemProperties) {\n            envelopeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, envelopeName) || Util_1.Util.NotSpecified;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(item) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(baseType) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(envelopeName)) {\n                throw Error(\"Input doesn't contain all required fields\");\n            }\n            var telemetryItem = {\n                name: envelopeName,\n                timestamp: new Date(),\n                instrumentationKey: \"\",\n                ctx: systemProperties ? systemProperties : {},\n                tags: [],\n                data: {},\n                baseType: baseType,\n                baseData: item\n            };\n            // Part C\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties)) {\n                for (var prop in customProperties) {\n                    if (customProperties.hasOwnProperty(prop)) {\n                        telemetryItem.data[prop] = customProperties[prop];\n                    }\n                }\n            }\n            return telemetryItem;\n        };\n        return TelemetryItemCreator;\n    }());\n    exports.TelemetryItemCreator = TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TelemetryItemCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Util.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Util.js ***!\n  \\****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Enums_1, applicationinsights_core_js_1, RequestResponseHeaders_1, DataSanitizer_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Util = /** @class */ (function () {\n        function Util() {\n        }\n        /*\n         * Force the SDK not to use local and session storage\n        */\n        Util.disableStorage = function () {\n            Util._canUseLocalStorage = false;\n            Util._canUseSessionStorage = false;\n        };\n        /**\n         * Gets the localStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getLocalStorageObject = function () {\n            if (Util.canUseLocalStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return null;\n        };\n        /**\n         * Tests storage object (localStorage or sessionStorage) to verify that it is usable\n         * More details here: https://mathiasbynens.be/notes/localstorage-pattern\n         * @param storageType Type of storage\n         * @return {Storage} Returns storage object verified that it is usable\n         */\n        Util._getVerifiedStorageObject = function (storageType) {\n            var storage = null;\n            var fail;\n            var uid;\n            try {\n                uid = new Date;\n                storage = storageType === Enums_1.StorageType.LocalStorage ? window.localStorage : window.sessionStorage;\n                storage.setItem(uid, uid);\n                fail = storage.getItem(uid) != uid;\n                storage.removeItem(uid);\n                if (fail) {\n                    storage = null;\n                }\n            }\n            catch (exception) {\n                storage = null;\n            }\n            return storage;\n        };\n        /**\n         *  Checks if endpoint URL is application insights internal injestion service URL.\n         *\n         *  @param endpointUrl Endpoint URL to check.\n         *  @returns {boolean} True if if endpoint URL is application insights internal injestion service URL.\n         */\n        Util.isInternalApplicationInsightsEndpoint = function (endpointUrl) {\n            return Util._internalEndpoints.indexOf(endpointUrl.toLowerCase()) !== -1;\n        };\n        /**\n         *  Check if the browser supports local storage.\n         *\n         *  @returns {boolean} True if local storage is supported.\n         */\n        Util.canUseLocalStorage = function () {\n            if (Util._canUseLocalStorage === undefined) {\n                Util._canUseLocalStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return Util._canUseLocalStorage;\n        };\n        /**\n         *  Get an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadLocalStorage, \"Browser failed read of local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's local storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setStorage = function (logger, name, data) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteLocalStorage, \"Browser failed write to local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromLocalStorage, \"Browser failed removal of local storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         * Gets the sessionStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getSessionStorageObject = function () {\n            if (Util.canUseSessionStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return null;\n        };\n        /**\n         *  Check if the browser supports session storage.\n         *\n         *  @returns {boolean} True if session storage is supported.\n         */\n        Util.canUseSessionStorage = function () {\n            if (Util._canUseSessionStorage === undefined) {\n                Util._canUseSessionStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return Util._canUseSessionStorage;\n        };\n        /**\n         *  Gets the list of session storage keys\n         *\n         *  @returns {string[]} List of session storage keys\n         */\n        Util.getSessionStorageKeys = function () {\n            var keys = [];\n            if (Util.canUseSessionStorage()) {\n                for (var key in window.sessionStorage) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n        /**\n         *  Get an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadSessionStorage, \"Browser failed read of session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's session storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setSessionStorage = function (logger, name, data) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteSessionStorage, \"Browser failed write to session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromSessionStorage, \"Browser failed removal of session storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /*\n         * Force the SDK not to store and read any data from cookies\n         */\n        Util.disableCookies = function () {\n            Util._canUseCookies = false;\n        };\n        /*\n         * helper method to tell if document.cookie object is available\n         */\n        Util.canUseCookies = function (logger) {\n            if (Util._canUseCookies === undefined) {\n                Util._canUseCookies = false;\n                try {\n                    Util._canUseCookies = Util.document.cookie !== undefined;\n                }\n                catch (e) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotAccessCookie, \"Cannot access document.cookie - \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n                ;\n            }\n            return Util._canUseCookies;\n        };\n        /**\n         * helper method to set userId and sessionId cookie\n         */\n        Util.setCookie = function (logger, name, value, domain) {\n            var domainAttrib = \"\";\n            var secureAttrib = \"\";\n            if (domain) {\n                domainAttrib = \";domain=\" + domain;\n            }\n            if (Util.document.location && Util.document.location.protocol === \"https:\") {\n                secureAttrib = \";secure\";\n            }\n            if (Util.canUseCookies(logger)) {\n                Util.document.cookie = name + \"=\" + value + domainAttrib + \";path=/\" + secureAttrib;\n            }\n        };\n        Util.stringToBoolOrDefault = function (str, defaultValue) {\n            if (defaultValue === void 0) { defaultValue = false; }\n            if (str === undefined || str === null) {\n                return defaultValue;\n            }\n            return str.toString().toLowerCase() === \"true\";\n        };\n        /**\n         * helper method to access userId and sessionId cookie\n         */\n        Util.getCookie = function (logger, name) {\n            if (!Util.canUseCookies(logger)) {\n                return;\n            }\n            var value = \"\";\n            if (name && name.length) {\n                var cookieName = name + \"=\";\n                var cookies = Util.document.cookie.split(\";\");\n                for (var i = 0; i < cookies.length; i++) {\n                    var cookie = cookies[i];\n                    cookie = Util.trim(cookie);\n                    if (cookie && cookie.indexOf(cookieName) === 0) {\n                        value = cookie.substring(cookieName.length, cookies[i].length);\n                        break;\n                    }\n                }\n            }\n            return value;\n        };\n        /**\n         * Deletes a cookie by setting it's expiration time in the past.\n         * @param name - The name of the cookie to delete.\n         */\n        Util.deleteCookie = function (logger, name) {\n            if (Util.canUseCookies(logger)) {\n                // Setting the expiration date in the past immediately removes the cookie\n                Util.document.cookie = name + \"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n            }\n        };\n        /**\n         * helper method to trim strings (IE8 does not implement String.prototype.trim)\n         */\n        Util.trim = function (str) {\n            if (typeof str !== \"string\")\n                return str;\n            return str.replace(/^\\s+|\\s+$/g, \"\");\n        };\n        /**\n         * generate random id string\n         */\n        Util.newId = function () {\n            var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            var result = \"\";\n            // tslint:disable-next-line:insecure-random\n            var random = Math.random() * 1073741824; //5 symbols in base64, almost maxint\n            while (random > 0) {\n                var char = base64chars.charAt(random % 64);\n                result += char;\n                random = Math.floor(random / 64);\n            }\n            return result;\n        };\n        /**\n         * Check if an object is of type Array\n         */\n        Util.isArray = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n        /**\n         * Check if an object is of type Error\n         */\n        Util.isError = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Error]\";\n        };\n        /**\n         * Check if an object is of type Date\n         */\n        Util.isDate = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Date]\";\n        };\n        /**\n         * Convert a date to I.S.O. format in IE8\n         */\n        Util.toISOStringForIE8 = function (date) {\n            if (Util.isDate(date)) {\n                if (Date.prototype.toISOString) {\n                    return date.toISOString();\n                }\n                else {\n                    var pad = function (num) {\n                        var r = String(num);\n                        if (r.length === 1) {\n                            r = \"0\" + r;\n                        }\n                        return r;\n                    };\n                    return date.getUTCFullYear()\n                        + \"-\" + pad(date.getUTCMonth() + 1)\n                        + \"-\" + pad(date.getUTCDate())\n                        + \"T\" + pad(date.getUTCHours())\n                        + \":\" + pad(date.getUTCMinutes())\n                        + \":\" + pad(date.getUTCSeconds())\n                        + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                        + \"Z\";\n                }\n            }\n        };\n        /**\n         * Gets IE version if we are running on IE, or null otherwise\n         */\n        Util.getIEVersion = function (userAgentStr) {\n            if (userAgentStr === void 0) { userAgentStr = null; }\n            var myNav = userAgentStr ? userAgentStr.toLowerCase() : navigator.userAgent.toLowerCase();\n            return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : null;\n        };\n        /**\n         * Convert ms to c# time span format\n         */\n        Util.msToTimeSpan = function (totalms) {\n            if (isNaN(totalms) || totalms < 0) {\n                totalms = 0;\n            }\n            totalms = Math.round(totalms);\n            var ms = \"\" + totalms % 1000;\n            var sec = \"\" + Math.floor(totalms / 1000) % 60;\n            var min = \"\" + Math.floor(totalms / (1000 * 60)) % 60;\n            var hour = \"\" + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n            var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n            ms = ms.length === 1 ? \"00\" + ms : ms.length === 2 ? \"0\" + ms : ms;\n            sec = sec.length < 2 ? \"0\" + sec : sec;\n            min = min.length < 2 ? \"0\" + min : min;\n            hour = hour.length < 2 ? \"0\" + hour : hour;\n            return (days > 0 ? days + \".\" : \"\") + hour + \":\" + min + \":\" + sec + \".\" + ms;\n        };\n        /**\n        * Checks if error has no meaningful data inside. Ususally such errors are received by window.onerror when error\n        * happens in a script from other domain (cross origin, CORS).\n        */\n        Util.isCrossOriginError = function (message, url, lineNumber, columnNumber, error) {\n            return (message === \"Script error.\" || message === \"Script error\") && !error;\n        };\n        /**\n        * Returns string representation of an object suitable for diagnostics logging.\n        */\n        Util.dump = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            var propertyValueDump = JSON.stringify(object);\n            if (objectTypeDump === \"[object Error]\") {\n                propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n            }\n            return objectTypeDump + propertyValueDump;\n        };\n        /**\n        * Returns the name of object if it's an Error. Otherwise, returns empty string.\n        */\n        Util.getExceptionName = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            if (objectTypeDump === \"[object Error]\") {\n                return object.name;\n            }\n            return \"\";\n        };\n        /**\n         * Adds an event handler for the specified event\n         * @param eventName {string} - The name of the event\n         * @param callback {any} - The callback function that needs to be executed for the given event\n         * @return {boolean} - true if the handler was successfully added\n         */\n        Util.addEventHandler = function (eventName, callback) {\n            if (!window || typeof eventName !== 'string' || typeof callback !== 'function') {\n                return false;\n            }\n            // Create verb for the event\n            var verbEventName = 'on' + eventName;\n            // check if addEventListener is available\n            if (window.addEventListener) {\n                window.addEventListener(eventName, callback, false);\n            }\n            else if (window[\"attachEvent\"]) {\n                window[\"attachEvent\"](verbEventName, callback);\n            }\n            else {\n                return false;\n            }\n            return true;\n        };\n        /**\n         * Tells if a browser supports a Beacon API\n         */\n        Util.IsBeaconApiSupported = function () {\n            return ('sendBeacon' in navigator && navigator.sendBeacon);\n        };\n        Util.document = typeof document !== \"undefined\" ? document : {};\n        Util._canUseCookies = undefined;\n        Util._canUseLocalStorage = undefined;\n        Util._canUseSessionStorage = undefined;\n        // listing only non-geo specific locations \n        Util._internalEndpoints = [\n            \"https://dc.services.visualstudio.com/v2/track\",\n            \"https://breeze.aimon.applicationinsights.io/v2/track\",\n            \"https://dc-int.services.visualstudio.com/v2/track\"\n        ];\n        Util.NotSpecified = \"not_specified\";\n        return Util;\n    }());\n    exports.Util = Util;\n    var UrlHelper = /** @class */ (function () {\n        function UrlHelper() {\n        }\n        UrlHelper.parseUrl = function (url) {\n            if (!UrlHelper.htmlAnchorElement) {\n                UrlHelper.htmlAnchorElement = !!UrlHelper.document.createElement ? UrlHelper.document.createElement('a') : {};\n            }\n            UrlHelper.htmlAnchorElement.href = url;\n            return UrlHelper.htmlAnchorElement;\n        };\n        UrlHelper.getAbsoluteUrl = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.href;\n            }\n            return result;\n        };\n        UrlHelper.getPathName = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.pathname;\n            }\n            return result;\n        };\n        UrlHelper.getCompleteUrl = function (method, absoluteUrl) {\n            if (method) {\n                return method.toUpperCase() + \" \" + absoluteUrl;\n            }\n            else {\n                return absoluteUrl;\n            }\n        };\n        UrlHelper.document = typeof document !== \"undefined\" ? document : {};\n        return UrlHelper;\n    }());\n    exports.UrlHelper = UrlHelper;\n    var CorrelationIdHelper = /** @class */ (function () {\n        function CorrelationIdHelper() {\n        }\n        /**\n        * Checks if a request url is not on a excluded domain list and if it is safe to add correlation headers\n        */\n        CorrelationIdHelper.canIncludeCorrelationHeader = function (config, requestUrl, currentHost) {\n            if (config && config.disableCorrelationHeaders) {\n                return false;\n            }\n            if (!requestUrl) {\n                return false;\n            }\n            var requestHost = UrlHelper.parseUrl(requestUrl).host.toLowerCase();\n            if ((!config || !config.enableCorsCorrelation) && requestHost !== currentHost) {\n                return false;\n            }\n            var excludedDomains = config && config.correlationHeaderExcludedDomains;\n            if (!excludedDomains || excludedDomains.length == 0) {\n                return true;\n            }\n            for (var i = 0; i < excludedDomains.length; i++) {\n                var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\./g, \"\\.\").replace(/\\*/g, \".*\"));\n                if (regex.test(requestHost)) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n        * Combines target appId and target role name from response header.\n        */\n        CorrelationIdHelper.getCorrelationContext = function (responseHeader) {\n            if (responseHeader) {\n                var correlationId = CorrelationIdHelper.getCorrelationContextValue(responseHeader, RequestResponseHeaders_1.RequestHeaders.requestContextTargetKey);\n                if (correlationId && correlationId !== CorrelationIdHelper.correlationIdPrefix) {\n                    return correlationId;\n                }\n            }\n        };\n        /**\n        * Gets key from correlation response header\n        */\n        CorrelationIdHelper.getCorrelationContextValue = function (responseHeader, key) {\n            if (responseHeader) {\n                var keyValues = responseHeader.split(\",\");\n                for (var i = 0; i < keyValues.length; ++i) {\n                    var keyValue = keyValues[i].split(\"=\");\n                    if (keyValue.length == 2 && keyValue[0] == key) {\n                        return keyValue[1];\n                    }\n                }\n            }\n        };\n        CorrelationIdHelper.correlationIdPrefix = \"cid-v1:\";\n        return CorrelationIdHelper;\n    }());\n    exports.CorrelationIdHelper = CorrelationIdHelper;\n    var AjaxHelper = /** @class */ (function () {\n        function AjaxHelper() {\n        }\n        AjaxHelper.ParseDependencyPath = function (logger, absoluteUrl, method, pathName) {\n            var target, name;\n            if (absoluteUrl && absoluteUrl.length > 0) {\n                var parsedUrl = UrlHelper.parseUrl(absoluteUrl);\n                target = parsedUrl.host;\n                if (parsedUrl.pathname != null) {\n                    var pathName = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                    if (pathName.charAt(0) !== '/') {\n                        pathName = \"/\" + pathName;\n                    }\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, method ? method + \" \" + pathName : pathName);\n                }\n                else {\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, absoluteUrl);\n                }\n            }\n            else {\n                target = pathName;\n                name = pathName;\n            }\n            return {\n                target: target,\n                name: name\n            };\n        };\n        return AjaxHelper;\n    }());\n    exports.AjaxHelper = AjaxHelper;\n    /**\n     * A utility class that helps getting time related parameters\n     */\n    var DateTimeUtils = /** @class */ (function () {\n        function DateTimeUtils() {\n        }\n        /**\n         * Get the number of milliseconds since 1970/01/01 in local timezone\n         */\n        DateTimeUtils.Now = (window.performance && window.performance.now && window.performance.timing) ?\n            function () {\n                return window.performance.now() + window.performance.timing.navigationStart;\n            }\n            :\n                function () {\n                    return new Date().getTime();\n                };\n        /**\n         * Gets duration between two timestamps\n         */\n        DateTimeUtils.GetDuration = function (start, end) {\n            var result = null;\n            if (start !== 0 && end !== 0 && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(start) && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(end)) {\n                result = end - start;\n            }\n            return result;\n        };\n        return DateTimeUtils;\n    }());\n    exports.DateTimeUtils = DateTimeUtils;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Util.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/applicationinsights-common.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Constants */ \"./node_modules/applicationinsights-common/bundle/Constants.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\"), __webpack_require__(/*! ./Telemetry/Common/Envelope */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\"), __webpack_require__(/*! ./Telemetry/Event */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\"), __webpack_require__(/*! ./Telemetry/Exception */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\"), __webpack_require__(/*! ./Telemetry/Metric */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\"), __webpack_require__(/*! ./Telemetry/PageView */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Telemetry/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\"), __webpack_require__(/*! ./Telemetry/Trace */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\"), __webpack_require__(/*! ./Telemetry/PageViewPerformance */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\"), __webpack_require__(/*! ./Telemetry/Common/Data */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/SeverityLevel */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/ContextTagKeys */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ./TelemetryItemCreator */ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, Enums_1, RequestResponseHeaders_1, Constants_1, Data_1, Base_1, Envelope_1, Event_1, Exception_1, Metric_1, PageView_1, PageViewData_1, RemoteDependencyData_1, Trace_1, PageViewPerformance_1, Data_2, SeverityLevel_1, ContextTagKeys_1, DataSanitizer_1, TelemetryItemCreator_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Util = Util_1.Util;\n    exports.CorrelationIdHelper = Util_1.CorrelationIdHelper;\n    exports.UrlHelper = Util_1.UrlHelper;\n    exports.DateTimeUtils = Util_1.DateTimeUtils;\n    exports.FieldType = Enums_1.FieldType;\n    exports.RequestHeaders = RequestResponseHeaders_1.RequestHeaders;\n    exports.DisabledPropertyName = Constants_1.DisabledPropertyName;\n    exports.AIData = Data_1.Data;\n    exports.AIBase = Base_1.Base;\n    exports.Envelope = Envelope_1.Envelope;\n    exports.Event = Event_1.Event;\n    exports.Exception = Exception_1.Exception;\n    exports.Metric = Metric_1.Metric;\n    exports.PageView = PageView_1.PageView;\n    exports.PageViewData = PageViewData_1.PageViewData;\n    exports.RemoteDependencyData = RemoteDependencyData_1.RemoteDependencyData;\n    exports.Trace = Trace_1.Trace;\n    exports.PageViewPerformance = PageViewPerformance_1.PageViewPerformance;\n    exports.Data = Data_2.Data;\n    exports.SeverityLevel = SeverityLevel_1.SeverityLevel;\n    exports.ContextTagKeys = ContextTagKeys_1.ContextTagKeys;\n    exports.DataSanitizer = DataSanitizer_1.DataSanitizer;\n    exports.TelemetryItemCreator = TelemetryItemCreator_1.TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-common.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n     */\n    exports.EventsDiscardedReason = {\n        /**\n         * Unknown.\n         */\n        Unknown: 0,\n        /**\n         * Status set to non-retryable.\n         */\n        NonRetryableStatus: 1,\n        /**\n         * The event is invalid.\n         */\n        InvalidEvent: 2,\n        /**\n         * The size of the event is too large.\n         */\n        SizeLimitExceeded: 3,\n        /**\n         * The server is not accepting events from this instrumentation key.\n         */\n        KillSwitch: 4,\n        /**\n         * The event queue is full.\n         */\n        QueueFull: 5,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventsDiscardedReason.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\":\n/*!*********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js ***!\n  \\*********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var LoggingSeverity;\n    (function (LoggingSeverity) {\n        /**\n         * Error will be sent as internal telemetry\n         */\n        LoggingSeverity[LoggingSeverity[\"CRITICAL\"] = 1] = \"CRITICAL\";\n        /**\n         * Error will NOT be sent as internal telemetry, and will only be shown in browser console\n         */\n        LoggingSeverity[LoggingSeverity[\"WARNING\"] = 2] = \"WARNING\";\n    })(LoggingSeverity = exports.LoggingSeverity || (exports.LoggingSeverity = {}));\n    /**\n     * Internal message ID. Please create a new one for every conceptually different message. Please keep alphabetically ordered\n     */ ;\n    exports._InternalMessageId = {\n        // Non user actionable\n        BrowserDoesNotSupportLocalStorage: 0,\n        BrowserCannotReadLocalStorage: 1,\n        BrowserCannotReadSessionStorage: 2,\n        BrowserCannotWriteLocalStorage: 3,\n        BrowserCannotWriteSessionStorage: 4,\n        BrowserFailedRemovalFromLocalStorage: 5,\n        BrowserFailedRemovalFromSessionStorage: 6,\n        CannotSendEmptyTelemetry: 7,\n        ClientPerformanceMathError: 8,\n        ErrorParsingAISessionCookie: 9,\n        ErrorPVCalc: 10,\n        ExceptionWhileLoggingError: 11,\n        FailedAddingTelemetryToBuffer: 12,\n        FailedMonitorAjaxAbort: 13,\n        FailedMonitorAjaxDur: 14,\n        FailedMonitorAjaxOpen: 15,\n        FailedMonitorAjaxRSC: 16,\n        FailedMonitorAjaxSend: 17,\n        FailedMonitorAjaxGetCorrelationHeader: 18,\n        FailedToAddHandlerForOnBeforeUnload: 19,\n        FailedToSendQueuedTelemetry: 20,\n        FailedToReportDataLoss: 21,\n        FlushFailed: 22,\n        MessageLimitPerPVExceeded: 23,\n        MissingRequiredFieldSpecification: 24,\n        NavigationTimingNotSupported: 25,\n        OnError: 26,\n        SessionRenewalDateIsZero: 27,\n        SenderNotInitialized: 28,\n        StartTrackEventFailed: 29,\n        StopTrackEventFailed: 30,\n        StartTrackFailed: 31,\n        StopTrackFailed: 32,\n        TelemetrySampledAndNotSent: 33,\n        TrackEventFailed: 34,\n        TrackExceptionFailed: 35,\n        TrackMetricFailed: 36,\n        TrackPVFailed: 37,\n        TrackPVFailedCalc: 38,\n        TrackTraceFailed: 39,\n        TransmissionFailed: 40,\n        FailedToSetStorageBuffer: 41,\n        FailedToRestoreStorageBuffer: 42,\n        InvalidBackendResponse: 43,\n        FailedToFixDepricatedValues: 44,\n        InvalidDurationValue: 45,\n        TelemetryEnvelopeInvalid: 46,\n        CreateEnvelopeError: 47,\n        // User actionable\n        CannotSerializeObject: 48,\n        CannotSerializeObjectNonSerializable: 49,\n        CircularReferenceDetected: 50,\n        ClearAuthContextFailed: 51,\n        ExceptionTruncated: 52,\n        IllegalCharsInName: 53,\n        ItemNotInArray: 54,\n        MaxAjaxPerPVExceeded: 55,\n        MessageTruncated: 56,\n        NameTooLong: 57,\n        SampleRateOutOfRange: 58,\n        SetAuthContextFailed: 59,\n        SetAuthContextFailedAccountName: 60,\n        StringValueTooLong: 61,\n        StartCalledMoreThanOnce: 62,\n        StopCalledWithoutStart: 63,\n        TelemetryInitializerFailed: 64,\n        TrackArgumentsNotSpecified: 65,\n        UrlTooLong: 66,\n        SessionStorageBufferFull: 67,\n        CannotAccessCookie: 68,\n        IdTooLong: 69,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=LoggingEnums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = 100;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=IChannelControls.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventsDiscardedReason_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var AppInsightsCore = /** @class */ (function () {\n        function AppInsightsCore() {\n            this._isInitialized = false;\n            this._extensions = new Array();\n            this._channelController = new ChannelController();\n        }\n        AppInsightsCore.prototype.initialize = function (config, extensions) {\n            var _this = this;\n            // Make sure core is only initialized once\n            if (this._isInitialized) {\n                throw Error(\"Core should not be initialized more than once\");\n            }\n            if (!config || CoreUtils_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                throw Error(\"Please provide instrumentation key\");\n            }\n            this.config = config;\n            this._notificationManager = new NotificationManager_1.NotificationManager();\n            this.config.extensions = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensions) ? [] : this.config.extensions;\n            // add notification to the extensions in the config so other plugins can access it\n            this.config.extensionConfig = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensionConfig) ? {} : this.config.extensionConfig;\n            this.config.extensionConfig.NotificationManager = this._notificationManager;\n            this.logger = new DiagnosticLogger_1.DiagnosticLogger(config);\n            // Initial validation\n            extensions.forEach(function (extension) {\n                if (CoreUtils_1.CoreUtils.isNullOrUndefined(extension.initialize)) {\n                    throw Error(validationError);\n                }\n            });\n            if (this.config.extensions.length > 0) {\n                var isValid_1 = true;\n                this.config.extensions.forEach(function (item) {\n                    if (CoreUtils_1.CoreUtils.isNullOrUndefined(item)) {\n                        isValid_1 = false;\n                    }\n                });\n                if (!isValid_1) {\n                    throw Error(validationError);\n                }\n            }\n            // Initial validation complete\n            // Concat all available extensions before sorting by priority\n            (_a = this._extensions).push.apply(_a, [this._channelController].concat(extensions, this.config.extensions));\n            this._extensions = this._extensions.sort(function (a, b) {\n                var extA = a;\n                var extB = b;\n                var typeExtA = typeof extA.processTelemetry;\n                var typeExtB = typeof extB.processTelemetry;\n                if (typeExtA === 'function' && typeExtB === 'function') {\n                    return extA.priority - extB.priority;\n                }\n                if (typeExtA === 'function' && typeExtB !== 'function') {\n                    // keep non telemetryplugin specific extensions at start\n                    return 1;\n                }\n                if (typeExtA !== 'function' && typeExtB === 'function') {\n                    return -1;\n                }\n            });\n            // sort complete\n            // Check if any two extensions have the same priority, then warn to console\n            var priority = {};\n            this._extensions.forEach(function (ext) {\n                var t = ext;\n                if (t && t.priority) {\n                    if (!CoreUtils_1.CoreUtils.isNullOrUndefined(priority[t.priority])) {\n                        _this.logger.warnToConsole(\"Two extensions have same priority\" + priority[t.priority] + \", \" + t.identifier);\n                    }\n                    else {\n                        priority[t.priority] = t.identifier; // set a value\n                    }\n                }\n            });\n            // initialize plugins including channel controller\n            this._extensions.forEach(function (ext) {\n                var e = ext;\n                if (e && e.priority <= ChannelControllerPriority) {\n                    ext.initialize(_this.config, _this, _this._extensions); // initialize\n                }\n            });\n            var c = -1;\n            // Set next plugin for all until channel controller\n            for (var idx = 0; idx < this._extensions.length - 1; idx++) {\n                var curr = (this._extensions[idx]);\n                if (curr && typeof curr.processTelemetry !== 'function') {\n                    // these are initialized only, allowing an entry point for extensions to be initialized when SDK initializes\n                    continue;\n                }\n                if (curr.priority === ChannelControllerPriority) {\n                    c = idx + 1;\n                    break; // channel controller will set remaining pipeline\n                }\n                this._extensions[idx].setNextPlugin(this._extensions[idx + 1]); // set next plugin\n            }\n            // Remove sender channels from main list\n            if (c < this._extensions.length) {\n                this._extensions.splice(c);\n            }\n            if (this.getTransmissionControls().length === 0) {\n                throw new Error(\"No channels available\");\n            }\n            this._isInitialized = true;\n            var _a;\n        };\n        AppInsightsCore.prototype.getTransmissionControls = function () {\n            return this._channelController.ChannelControls;\n        };\n        AppInsightsCore.prototype.track = function (telemetryItem) {\n            if (telemetryItem === null) {\n                this._notifiyInvalidEvent(telemetryItem);\n                // throw error\n                throw Error(\"Invalid telemetry item\");\n            }\n            if (telemetryItem.baseData && !telemetryItem.baseType) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"Provide data.baseType for data.baseData\");\n            }\n            if (!telemetryItem.baseType) {\n                // Hard coded from Common::Event.ts::Event.dataType\n                telemetryItem.baseType = \"EventData\";\n            }\n            if (!telemetryItem.instrumentationKey) {\n                // setup default ikey if not passed in\n                telemetryItem.instrumentationKey = this.config.instrumentationKey;\n            }\n            if (!telemetryItem.timestamp) {\n                // add default timestamp if not passed in\n                telemetryItem.timestamp = new Date();\n            }\n            // do basic validation before sending it through the pipeline\n            this._validateTelmetryItem(telemetryItem);\n            // invoke any common telemetry processors before sending through pipeline\n            var i = 0;\n            while (i < this._extensions.length) {\n                if (this._extensions[i].processTelemetry) {\n                    this._extensions[i].processTelemetry(telemetryItem); // pass on to first extension that can support processing\n                    break;\n                }\n                i++;\n            }\n        };\n        /**\n         * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n         * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n         * called.\n         * @param {INotificationListener} listener - An INotificationListener object.\n         */\n        AppInsightsCore.prototype.addNotificationListener = function (listener) {\n            this._notificationManager.addNotificationListener(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - INotificationListener to remove.\n         */\n        AppInsightsCore.prototype.removeNotificationListener = function (listener) {\n            this._notificationManager.removeNotificationListener(listener);\n        };\n        /**\n         * Periodically check logger.queue for\n         */\n        AppInsightsCore.prototype.pollInternalLogs = function () {\n            var _this = this;\n            if (!(this.config.diagnosticLoggingInterval > 0)) {\n                throw Error(\"config.diagnosticLoggingInterval must be a positive integer\");\n            }\n            return setInterval(function () {\n                var queue = _this.logger.queue;\n                queue.forEach(function (logMessage) {\n                    var item = {\n                        name: \"InternalMessageId: \" + logMessage.messageId,\n                        instrumentationKey: _this.config.instrumentationKey,\n                        timestamp: new Date(),\n                        baseType: DiagnosticLogger_1._InternalLogMessage.dataType,\n                        baseData: { message: logMessage.message }\n                    };\n                    _this.track(item);\n                });\n                queue.length = 0;\n            }, this.config.diagnosticLoggingInterval);\n        };\n        AppInsightsCore.prototype._validateTelmetryItem = function (telemetryItem) {\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.name)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry name required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.timestamp)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry timestamp required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.instrumentationKey)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry instrumentationKey required\");\n            }\n        };\n        AppInsightsCore.prototype._notifiyInvalidEvent = function (telemetryItem) {\n            this._notificationManager.eventsDiscarded([telemetryItem], EventsDiscardedReason_1.EventsDiscardedReason.InvalidEvent);\n        };\n        return AppInsightsCore;\n    }());\n    exports.AppInsightsCore = AppInsightsCore;\n    var ChannelController = /** @class */ (function () {\n        function ChannelController() {\n            this.identifier = \"ChannelControllerPlugin\";\n            this.priority = ChannelControllerPriority; // in reserved range 100 to 200\n        }\n        ChannelController.prototype.processTelemetry = function (item) {\n            this.channelQueue.forEach(function (queues) {\n                // pass on to first item in queue\n                if (queues.length > 0) {\n                    queues[0].processTelemetry(item);\n                }\n            });\n        };\n        Object.defineProperty(ChannelController.prototype, \"ChannelControls\", {\n            get: function () {\n                return this.channelQueue;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        ChannelController.prototype.initialize = function (config, core, extensions) {\n            var _this = this;\n            this.channelQueue = new Array();\n            if (config.channels) {\n                config.channels.forEach(function (queue) {\n                    if (queue && queue.length > 0) {\n                        queue = queue.sort(function (a, b) {\n                            return a.priority - b.priority;\n                        });\n                        // Initialize each plugin\n                        queue.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                        for (var i = 1; i < queue.length; i++) {\n                            queue[i - 1].setNextPlugin(queue[i]); // setup processing chain\n                        }\n                        _this.channelQueue.push(queue);\n                    }\n                });\n            }\n            else {\n                var arr = new Array();\n                for (var i = 0; i < extensions.length; i++) {\n                    var plugin = extensions[i];\n                    if (plugin.priority > ChannelControllerPriority) {\n                        arr.push(plugin);\n                    }\n                }\n                if (arr.length > 0) {\n                    // sort if not sorted\n                    arr = arr.sort(function (a, b) {\n                        return a.priority - b.priority;\n                    });\n                    // Initialize each plugin\n                    arr.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                    // setup next plugin\n                    for (var i = 1; i < arr.length; i++) {\n                        arr[i - 1].setNextPlugin(arr[i]);\n                    }\n                    this.channelQueue.push(arr);\n                }\n            }\n        };\n        return ChannelController;\n    }());\n    var validationError = \"Extensions must provide callback to initialize\";\n    var ChannelControllerPriority = 200;\n    var duplicatePriority = \"One or more extensions are set at same priority\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=AppInsightsCore.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var CoreUtils = /** @class */ (function () {\n        function CoreUtils() {\n        }\n        CoreUtils.isNullOrUndefined = function (input) {\n            return input === null || input === undefined;\n        };\n        /**\n    * Creates a new GUID.\n    * @return {string} A GUID.\n    */\n        CoreUtils.newGuid = function () {\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(GuidRegex, function (c) {\n                var r = (Math.random() * 16 | 0), v = (c === 'x' ? r : r & 0x3 | 0x8);\n                return v.toString(16);\n            });\n        };\n        return CoreUtils;\n    }());\n    exports.CoreUtils = CoreUtils;\n    var GuidRegex = /[xy]/g;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=CoreUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\":\n/*!*******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js ***!\n  \\*******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, LoggingEnums_1, CoreUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var _InternalLogMessage = /** @class */ (function () {\n        function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            this.messageId = msgId;\n            this.message =\n                (isUserAct ? _InternalLogMessage.AiUserActionablePrefix : _InternalLogMessage.AiNonUserActionablePrefix) +\n                    msgId;\n            var diagnosticText = (msg ? \" message:\" + _InternalLogMessage.sanitizeDiagnosticText(msg) : \"\") +\n                (properties ? \" props:\" + _InternalLogMessage.sanitizeDiagnosticText(JSON.stringify(properties)) : \"\");\n            this.message += diagnosticText;\n        }\n        _InternalLogMessage.sanitizeDiagnosticText = function (text) {\n            return \"\\\"\" + text.replace(/\\\"/g, \"\") + \"\\\"\";\n        };\n        _InternalLogMessage.dataType = \"MessageData\";\n        /**\n         * For user non actionable traces use AI Internal prefix.\n         */\n        _InternalLogMessage.AiNonUserActionablePrefix = \"AI (Internal): \";\n        /**\n         * Prefix of the traces in portal.\n         */\n        _InternalLogMessage.AiUserActionablePrefix = \"AI: \";\n        return _InternalLogMessage;\n    }());\n    exports._InternalLogMessage = _InternalLogMessage;\n    var DiagnosticLogger = /** @class */ (function () {\n        function DiagnosticLogger(config) {\n            /**\n            *  Session storage key for the prefix for the key indicating message type already logged\n            */\n            this.AIInternalMessagePrefix = \"AITR_\";\n            /**\n             * When this is true the SDK will throw exceptions to aid in debugging.\n             */\n            this.enableDebugExceptions = function () { return false; };\n            /**\n             * 0: OFF\n             * 1: CRITICAL (default)\n             * 2: >= WARNING\n             */\n            this.consoleLoggingLevel = function () { return 1; };\n            /**\n             * 0: OFF (default)\n             * 1: CRITICAL\n             * 2: >= WARNING\n             */\n            this.telemetryLoggingLevel = function () { return 0; };\n            /**\n             * The maximum number of internal messages allowed to be sent per page view\n             */\n            this.maxInternalMessageLimit = function () { return 25; };\n            /**\n             * The internal logging queue\n             */\n            this.queue = [];\n            /**\n             * Count of internal messages sent\n             */\n            this._messageCount = 0;\n            /**\n             * Holds information about what message types were already logged to console or sent to server.\n             */\n            this._messageLogged = {};\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(config)) {\n                // TODO: Use default config\n                // config = AppInsightsCore.defaultConfig;\n                // For now, use defaults specified in DiagnosticLogger members;\n                return;\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelConsole)) {\n                this.consoleLoggingLevel = function () { return config.loggingLevelConsole; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelTelemetry)) {\n                this.telemetryLoggingLevel = function () { return config.loggingLevelTelemetry; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.maxMessageLimit)) {\n                this.maxInternalMessageLimit = function () { return config.maxMessageLimit; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.enableDebugExceptions)) {\n                this.enableDebugExceptions = function () { return config.enableDebugExceptions; };\n            }\n        }\n        /**\n         * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The log message.\n         */\n        DiagnosticLogger.prototype.throwInternal = function (severity, msgId, msg, properties, isUserAct) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n            if (this.enableDebugExceptions()) {\n                throw message;\n            }\n            else {\n                if (typeof (message) !== \"undefined\" && !!message) {\n                    if (typeof (message.message) !== \"undefined\") {\n                        if (isUserAct) {\n                            // check if this message type was already logged to console for this page view and if so, don't log it again\n                            var messageKey = +message.messageId;\n                            if (!this._messageLogged[messageKey] || this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                                this._messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            // don't log internal AI traces in the console, unless the verbose logging is enabled\n                            if (this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                            }\n                        }\n                        this.logInternalMessage(severity, message);\n                    }\n                }\n            }\n        };\n        /**\n         * This will write a warning to the console if possible\n         * @param message {string} - The warning message\n         */\n        DiagnosticLogger.prototype.warnToConsole = function (message) {\n            if (typeof console !== \"undefined\" && !!console) {\n                if (typeof console.warn === \"function\") {\n                    console.warn(message);\n                }\n                else if (typeof console.log === \"function\") {\n                    console.log(message);\n                }\n            }\n        };\n        /**\n         * Resets the internal message count\n         */\n        DiagnosticLogger.prototype.resetInternalMessageCount = function () {\n            this._messageCount = 0;\n            this._messageLogged = {};\n        };\n        /**\n         * Logs a message to the internal queue.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The message to log.\n         */\n        DiagnosticLogger.prototype.logInternalMessage = function (severity, message) {\n            if (this._areInternalMessagesThrottled()) {\n                return;\n            }\n            // check if this message type was already logged for this session and if so, don't log it again\n            var logMessage = true;\n            var messageKey = this.AIInternalMessagePrefix + message.messageId;\n            // if the session storage is not available, limit to only one message type per page view\n            if (this._messageLogged[messageKey]) {\n                logMessage = false;\n            }\n            else {\n                this._messageLogged[messageKey] = true;\n            }\n            if (logMessage) {\n                // Push the event in the internal queue\n                if (severity <= this.telemetryLoggingLevel()) {\n                    this.queue.push(message);\n                    this._messageCount++;\n                }\n                // When throttle limit reached, send a special event\n                if (this._messageCount == this.maxInternalMessageLimit()) {\n                    var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                    var throttleMessage = new _InternalLogMessage(LoggingEnums_1._InternalMessageId.MessageLimitPerPVExceeded, throttleLimitMessage, false);\n                    this.queue.push(throttleMessage);\n                    this.warnToConsole(throttleLimitMessage);\n                }\n            }\n        };\n        /**\n         * Indicates whether the internal events are throttled\n         */\n        DiagnosticLogger.prototype._areInternalMessagesThrottled = function () {\n            return this._messageCount >= this.maxInternalMessageLimit();\n        };\n        return DiagnosticLogger;\n    }());\n    exports.DiagnosticLogger = DiagnosticLogger;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DiagnosticLogger.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Class to manage sending notifications to all the listeners.\n     */\n    var NotificationManager = /** @class */ (function () {\n        function NotificationManager() {\n            this.listeners = [];\n        }\n        /**\n         * Adds a notification listener.\n         * @param {INotificationListener} listener - The notification listener to be added.\n         */\n        NotificationManager.prototype.addNotificationListener = function (listener) {\n            this.listeners.push(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - AWTNotificationListener to remove.\n         */\n        NotificationManager.prototype.removeNotificationListener = function (listener) {\n            var index = this.listeners.indexOf(listener);\n            while (index > -1) {\n                this.listeners.splice(index, 1);\n                index = this.listeners.indexOf(listener);\n            }\n        };\n        /**\n         * Notification for events sent.\n         * @param {ITelemetryItem[]} events - The array of events that have been sent.\n         */\n        NotificationManager.prototype.eventsSent = function (events) {\n            var _this = this;\n            var _loop_1 = function (i) {\n                if (this_1.listeners[i].eventsSent) {\n                    setTimeout(function () { return _this.listeners[i].eventsSent(events); }, 0);\n                }\n            };\n            var this_1 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_1(i);\n            }\n        };\n        /**\n         * Notification for events being discarded.\n         * @param {ITelemetryItem[]} events - The array of events that have been discarded by the SDK.\n         * @param {number} reason           - The reason for which the SDK discarded the events. The EventsDiscardedReason\n         * constant should be used to check the different values.\n         */\n        NotificationManager.prototype.eventsDiscarded = function (events, reason) {\n            var _this = this;\n            var _loop_2 = function (i) {\n                if (this_2.listeners[i].eventsDiscarded) {\n                    setTimeout(function () { return _this.listeners[i].eventsDiscarded(events, reason); }, 0);\n                }\n            };\n            var this_2 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_2(i);\n            }\n        };\n        return NotificationManager;\n    }());\n    exports.NotificationManager = NotificationManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=NotificationManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\":\n/*!****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js ***!\n  \\****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK.Interfaces/IChannelControls */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./JavaScriptSDK/AppInsightsCore */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\"), __webpack_require__(/*! ./JavaScriptSDK/CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./JavaScriptSDK/NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./JavaScriptSDK/DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, IChannelControls_1, EventsDiscardedReason_1, AppInsightsCore_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1, LoggingEnums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = IChannelControls_1.MinChannelPriorty;\n    exports.EventsDiscardedReason = EventsDiscardedReason_1.EventsDiscardedReason;\n    exports.AppInsightsCore = AppInsightsCore_1.AppInsightsCore;\n    exports.CoreUtils = CoreUtils_1.CoreUtils;\n    exports.NotificationManager = NotificationManager_1.NotificationManager;\n    exports.DiagnosticLogger = DiagnosticLogger_1.DiagnosticLogger;\n    exports._InternalLogMessage = DiagnosticLogger_1._InternalLogMessage;\n    exports._InternalMessageId = LoggingEnums_1._InternalMessageId;\n    exports.LoggingSeverity = LoggingEnums_1.LoggingSeverity;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-core-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\":\n/*!*************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajax.js ***!\n  \\*************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./ajaxRecord */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\"), __webpack_require__(/*! ./ajaxUtils */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, ajaxRecord_1, ajaxUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var AjaxMonitor = /** @class */ (function () {\n        function AjaxMonitor() {\n            this._trackAjaxAttempts = 0;\n            this.identifier = \"AjaxDependencyPlugin\";\n            this.priority = 161;\n            this.currentWindowHost = window && window.location.host && window.location.host.toLowerCase();\n            this.initialized = false;\n        }\n        ///<summary>Verifies that particalar instance of XMLHttpRequest needs to be monitored</summary>\n        ///<param name=\"excludeAjaxDataValidation\">Optional parameter. True if ajaxData must be excluded from verification</param>\n        ///<returns type=\"bool\">True if instance needs to be monitored, otherwise false</returns>\n        AjaxMonitor.prototype.isMonitoredInstance = function (xhr, excludeAjaxDataValidation) {\n            // checking to see that all interested functions on xhr were instrumented\n            return this.initialized\n                // checking on ajaxData to see that it was not removed in user code\n                && (excludeAjaxDataValidation === true || !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData))\n                // check that this instance is not not used by ajax call performed inside client side monitoring to send data to collector\n                && xhr[applicationinsights_common_1.DisabledPropertyName] !== true;\n        };\n        ///<summary>Determines whether ajax monitoring can be enabled on this document</summary>\n        ///<returns>True if Ajax monitoring is supported on this page, otherwise false</returns>\n        AjaxMonitor.prototype.supportsMonitoring = function () {\n            var result = true;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.open) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.send) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.abort)) {\n                result = false;\n            }\n            // disable in IE8 or older (https://www.w3schools.com/jsref/jsref_trim_string.asp)\n            try {\n                \" a \".trim();\n            }\n            catch (ex) {\n                result = false;\n            }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentOpen = function () {\n            var originalOpen = XMLHttpRequest.prototype.open;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.open = function (method, url, async) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this, true) &&\n                        (!this.ajaxData ||\n                            !this.ajaxData.xhrMonitoringState.openDone)) {\n                        ajaxMonitorInstance.openHandler(this, method, url, async);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxOpen, \"Failed to monitor XMLHttpRequest.open, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalOpen.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.openHandler = function (xhr, method, url, async) {\n            /* todo:\n            Disabling the following block of code as CV is not yet supported in 1DS for 3rd Part.\n            // this format corresponds with activity logic on server-side and is required for the correct correlation\n            var id = \"|\" + this.appInsights.context.operation.id + \".\" + Util.newId();\n            */\n            var id = applicationinsights_common_1.Util.newId();\n            var ajaxData = new ajaxRecord_1.ajaxRecord(id, this._core._logger);\n            ajaxData.method = method;\n            ajaxData.requestUrl = url;\n            ajaxData.xhrMonitoringState.openDone = true;\n            xhr.ajaxData = ajaxData;\n            this.attachToOnReadyStateChange(xhr);\n        };\n        AjaxMonitor.getFailedAjaxDiagnosticsMessage = function (xhr) {\n            var result = \"\";\n            try {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData.requestUrl)) {\n                    result += \"(url: '\" + xhr.ajaxData.requestUrl + \"')\";\n                }\n            }\n            catch (e) { }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentSend = function () {\n            var originalSend = XMLHttpRequest.prototype.send;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.send = function (content) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.sendDone) {\n                        ajaxMonitorInstance.sendHandler(this, content);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxSend, \"Failed to monitor XMLHttpRequest, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalSend.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.sendHandler = function (xhr, content) {\n            xhr.ajaxData.requestSentTime = applicationinsights_common_1.DateTimeUtils.Now();\n            if (this.currentWindowHost && applicationinsights_common_1.CorrelationIdHelper.canIncludeCorrelationHeader(this._config, xhr.ajaxData.getAbsoluteUrl(), this.currentWindowHost)) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestIdHeader, xhr.ajaxData.id);\n                var appId = this._config.appId; // Todo: also, get appId from channel as breeze returns it\n                if (appId) {\n                    xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader, applicationinsights_common_1.RequestHeaders.requestContextAppIdFormat + appId);\n                }\n            }\n            xhr.ajaxData.xhrMonitoringState.sendDone = true;\n        };\n        AjaxMonitor.prototype.instrumentAbort = function () {\n            var originalAbort = XMLHttpRequest.prototype.abort;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.abort = function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.abortDone) {\n                        this.ajaxData.aborted = 1;\n                        this.ajaxData.xhrMonitoringState.abortDone = true;\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxAbort, \"Failed to monitor XMLHttpRequest.abort, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalAbort.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.attachToOnReadyStateChange = function (xhr) {\n            var _this = this;\n            var ajaxMonitorInstance = this;\n            xhr.ajaxData.xhrMonitoringState.onreadystatechangeCallbackAttached = ajaxUtils_1.EventHelper.AttachEvent(xhr, \"readystatechange\", function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(xhr)) {\n                        if (xhr.readyState === 4) {\n                            ajaxMonitorInstance.onAjaxComplete(xhr);\n                        }\n                    }\n                }\n                catch (e) {\n                    var exceptionText = applicationinsights_common_1.Util.dump(e);\n                    // ignore messages with c00c023f, as this a known IE9 XHR abort issue\n                    if (!exceptionText || exceptionText.toLowerCase().indexOf(\"c00c023f\") == -1) {\n                        _this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxRSC, \"Failed to monitor XMLHttpRequest 'readystatechange' event handler, monitoring data for this ajax call may be incorrect.\", {\n                            ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                            exception: applicationinsights_common_1.Util.dump(e)\n                        });\n                    }\n                }\n            });\n        };\n        AjaxMonitor.prototype.onAjaxComplete = function (xhr) {\n            xhr.ajaxData.responseFinishedTime = applicationinsights_common_1.DateTimeUtils.Now();\n            xhr.ajaxData.status = xhr.status;\n            xhr.ajaxData.CalculateMetrics();\n            if (xhr.ajaxData.ajaxTotalDuration < 0) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxDur, \"Failed to calculate the duration of the ajax call, monitoring data for this ajax call won't be sent.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    requestSentTime: xhr.ajaxData.requestSentTime,\n                    responseFinishedTime: xhr.ajaxData.responseFinishedTime\n                });\n            }\n            else {\n                var dependency = {\n                    id: xhr.ajaxData.id,\n                    absoluteUrl: xhr.ajaxData.getAbsoluteUrl(),\n                    commandName: xhr.ajaxData.getPathName(),\n                    duration: xhr.ajaxData.ajaxTotalDuration,\n                    success: (+(xhr.ajaxData.status)) >= 200 && (+(xhr.ajaxData.status)) < 400,\n                    resultCode: +xhr.ajaxData.status,\n                    method: xhr.ajaxData.method\n                };\n                // enrich dependency target with correlation context from the server\n                var correlationContext = this.getCorrelationContext(xhr);\n                if (correlationContext) {\n                    dependency.correlationContext = /* dependency.target + \" | \" + */ correlationContext;\n                }\n                this.trackDependencyData(dependency);\n                xhr.ajaxData = null;\n            }\n        };\n        AjaxMonitor.prototype.getCorrelationContext = function (xhr) {\n            try {\n                var responseHeadersString = xhr.getAllResponseHeaders();\n                if (responseHeadersString !== null) {\n                    var index = responseHeadersString.toLowerCase().indexOf(applicationinsights_common_1.RequestHeaders.requestContextHeaderLowerCase);\n                    if (index !== -1) {\n                        var responseHeader = xhr.getResponseHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader);\n                        return applicationinsights_common_1.CorrelationIdHelper.getCorrelationContext(responseHeader);\n                    }\n                }\n            }\n            catch (e) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxGetCorrelationHeader, \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    exception: applicationinsights_common_1.Util.dump(e)\n                });\n            }\n        };\n        /**\n            * Logs dependency call\n            * @param dependencyData dependency data object\n            */\n        AjaxMonitor.prototype.trackDependencyData = function (dependency, properties, systemProperties) {\n            if (this._config.maxAjaxCallsPerView === -1 || this._trackAjaxAttempts < this._config.maxAjaxCallsPerView) {\n                var item = applicationinsights_common_1.TelemetryItemCreator.create(dependency, applicationinsights_common_1.RemoteDependencyData.dataType, applicationinsights_common_1.RemoteDependencyData.envelopeType, this._core._logger, properties, systemProperties);\n                this._core.track(item);\n            }\n            else if (this._trackAjaxAttempts === this._config.maxAjaxCallsPerView) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MaxAjaxPerPVExceeded, \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n            }\n            ++this._trackAjaxAttempts;\n        };\n        AjaxMonitor.prototype.processTelemetry = function (item) {\n            if (this._nextPlugin && this._nextPlugin.processTelemetry) {\n                this._nextPlugin.processTelemetry(item);\n            }\n        };\n        AjaxMonitor.prototype.setNextPlugin = function (next) {\n            if (next) {\n                this._nextPlugin = next;\n            }\n        };\n        AjaxMonitor.prototype.initialize = function (config, core, extensions) {\n            if (!this.initialized) {\n                this._core = core;\n                config.extensionConfig = config.extensionConfig ? config.extensionConfig : {};\n                var c = config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n                this._config = {\n                    maxAjaxCallsPerView: !isNaN(c.maxAjaxCallsPerView) ? c.maxAjaxCallsPerView : 500,\n                    disableAjaxTracking: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableAjaxTracking),\n                    disableCorrelationHeaders: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableCorrelationHeaders),\n                    correlationHeaderExcludedDomains: c.correlationHeaderExcludedDomains || [\n                        \"*.blob.core.windows.net\",\n                        \"*.blob.core.chinacloudapi.cn\",\n                        \"*.blob.core.cloudapi.de\",\n                        \"*.blob.core.usgovcloudapi.net\"\n                    ],\n                    appId: c.appId,\n                    enableCorsCorrelation: applicationinsights_common_1.Util.stringToBoolOrDefault(c.enableCorsCorrelation)\n                };\n                if (this.supportsMonitoring() && !this._config.disableAjaxTracking) {\n                    this.instrumentOpen();\n                    this.instrumentSend();\n                    this.instrumentAbort();\n                    this.initialized = true;\n                }\n            }\n        };\n        return AjaxMonitor;\n    }());\n    exports.AjaxMonitor = AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajax.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var XHRMonitoringState = /** @class */ (function () {\n        function XHRMonitoringState() {\n            this.openDone = false;\n            this.setRequestHeaderDone = false;\n            this.sendDone = false;\n            this.abortDone = false;\n            //<summary>True, if onreadyStateChangeCallback function attached to xhr, otherwise false</summary>\n            this.onreadystatechangeCallbackAttached = false;\n        }\n        return XHRMonitoringState;\n    }());\n    exports.XHRMonitoringState = XHRMonitoringState;\n    var ajaxRecord = /** @class */ (function () {\n        function ajaxRecord(id, logger) {\n            this.completed = false;\n            this.requestHeadersSize = null;\n            this.ttfb = null;\n            this.responseReceivingDuration = null;\n            this.callbackDuration = null;\n            this.ajaxTotalDuration = null;\n            this.aborted = null;\n            this.pageUrl = null;\n            this.requestUrl = null;\n            this.requestSize = 0;\n            this.method = null;\n            ///<summary>Returns the HTTP status code.</summary>\n            this.status = null;\n            //<summary>The timestamp when open method was invoked</summary>\n            this.requestSentTime = null;\n            //<summary>The timestamps when first byte was received</summary>\n            this.responseStartedTime = null;\n            //<summary>The timestamp when last byte was received</summary>\n            this.responseFinishedTime = null;\n            //<summary>The timestamp when onreadystatechange callback in readyState 4 finished</summary>\n            this.callbackFinishedTime = null;\n            //<summary>The timestamp at which ajax was ended</summary>\n            this.endTime = null;\n            //<summary>The original xhr onreadystatechange event</summary>\n            this.originalOnreadystatechage = null;\n            this.xhrMonitoringState = new XHRMonitoringState();\n            //<summary>Determines whether or not JavaScript exception occured in xhr.onreadystatechange code. 1 if occured, otherwise 0.</summary>\n            this.clientFailure = 0;\n            this.CalculateMetrics = function () {\n                var self = this;\n                // round to 3 decimal points\n                self.ajaxTotalDuration = Math.round(applicationinsights_common_1.DateTimeUtils.GetDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n            };\n            this.id = id;\n            this._logger = logger;\n        }\n        ajaxRecord.prototype.getAbsoluteUrl = function () {\n            return this.requestUrl ? applicationinsights_common_1.UrlHelper.getAbsoluteUrl(this.requestUrl) : null;\n        };\n        ajaxRecord.prototype.getPathName = function () {\n            return this.requestUrl ? applicationinsights_common_1.DataSanitizer.sanitizeUrl(this._logger, applicationinsights_common_1.UrlHelper.getCompleteUrl(this.method, this.requestUrl)) : null;\n        };\n        return ajaxRecord;\n    }());\n    exports.ajaxRecord = ajaxRecord;\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxRecord.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var stringUtils = /** @class */ (function () {\n        function stringUtils() {\n        }\n        stringUtils.GetLength = function (strObject) {\n            var res = 0;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(strObject)) {\n                var stringified = \"\";\n                try {\n                    stringified = strObject.toString();\n                }\n                catch (ex) {\n                    // some troubles with complex object\n                }\n                res = stringified.length;\n                res = isNaN(res) ? 0 : res;\n            }\n            return res;\n        };\n        return stringUtils;\n    }());\n    exports.stringUtils = stringUtils;\n    var EventHelper = /** @class */ (function () {\n        function EventHelper() {\n        }\n        ///<summary>Binds the specified function to an event, so that the function gets called whenever the event fires on the object</summary>\n        ///<param name=\"obj\">Object to which </param>\n        ///<param name=\"eventNameWithoutOn\">String that specifies any of the standard DHTML Events without \"on\" prefix</param>\n        ///<param name=\"handlerRef\">Pointer that specifies the function to call when event fires</param>\n        ///<returns>True if the function was bound successfully to the event, otherwise false</returns>\n        EventHelper.AttachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            var result = false;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.attachEvent)) {\n                    // IE before version 9                    \n                    obj.attachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                    result = true;\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.addEventListener)) {\n                        // all browsers except IE before version 9\n                        obj.addEventListener(eventNameWithoutOn, handlerRef, false);\n                        result = true;\n                    }\n                }\n            }\n            return result;\n        };\n        EventHelper.DetachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.detachEvent)) {\n                    obj.detachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.removeEventListener)) {\n                        obj.removeEventListener(eventNameWithoutOn, handlerRef, false);\n                    }\n                }\n            }\n        };\n        return EventHelper;\n    }());\n    exports.EventHelper = EventHelper;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./ajax */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ajax_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.AjaxPlugin = ajax_1.AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-dependencies-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Application.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Application = /** @class */ (function () {\n        function Application() {\n        }\n        return Application;\n    }());\n    exports.Application = Application;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Application.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Device.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Device = /** @class */ (function () {\n        /**\n         * Constructs a new instance of the Device class\n         */\n        function Device() {\n            // don't attempt to fingerprint browsers\n            this.id = \"browser\";\n            // Device type is a dimension in our data platform\n            // Setting it to 'Browser' allows to separate client and server dependencies/exceptions\n            this.type = \"Browser\";\n        }\n        return Device;\n    }());\n    exports.Device = Device;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Device.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Version = \"2.0.1-beta\";\n    var Internal = /** @class */ (function () {\n        /**\n        * Constructs a new instance of the internal telemetry data class.\n        */\n        function Internal(config) {\n            this.sdkVersion = (config.sdkExtension && config.sdkExtension() ? config.sdkExtension() + \"_\" : \"\") + \"javascript:\" + Version;\n        }\n        return Internal;\n    }());\n    exports.Internal = Internal;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Internal.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Location.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Location = /** @class */ (function () {\n        function Location() {\n        }\n        return Location;\n    }());\n    exports.Location = Location;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Location.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Operation = /** @class */ (function () {\n        function Operation() {\n            this.id = applicationinsights_common_1.Util.newId();\n            if (window && window.location && window.location.pathname) {\n                this.name = window.location.pathname;\n            }\n        }\n        return Operation;\n    }());\n    exports.Operation = Operation;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Operation.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../SamplingScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SamplingScoreGenerator_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sample = /** @class */ (function () {\n        function Sample(sampleRate, logger) {\n            // We're using 32 bit math, hence max value is (2^31 - 1)\n            this.INT_MAX_VALUE = 2147483647;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (sampleRate > 100 || sampleRate < 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SampleRateOutOfRange, \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n                this.sampleRate = 100;\n            }\n            this.sampleRate = sampleRate;\n            this.samplingScoreGenerator = new SamplingScoreGenerator_1.SamplingScoreGenerator();\n        }\n        /**\n        * Determines if an envelope is sampled in (i.e. will be sent) or not (i.e. will be dropped).\n        */\n        Sample.prototype.isSampledIn = function (envelope) {\n            // return true as sampling will move to different extension\n            return true;\n        };\n        return Sample;\n    }());\n    exports.Sample = Sample;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sample.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Session.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Session = /** @class */ (function () {\n        function Session() {\n        }\n        return Session;\n    }());\n    exports.Session = Session;\n    var _SessionManager = /** @class */ (function () {\n        function _SessionManager(config, logger) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (!config) {\n                config = {};\n            }\n            if (!(typeof config.sessionExpirationMs === \"function\")) {\n                config.sessionExpirationMs = function () { return _SessionManager.acquisitionSpan; };\n            }\n            if (!(typeof config.sessionRenewalMs === \"function\")) {\n                config.sessionRenewalMs = function () { return _SessionManager.renewalSpan; };\n            }\n            this.config = config;\n            this.automaticSession = new Session();\n        }\n        _SessionManager.prototype.update = function () {\n            if (!this.automaticSession.id) {\n                this.initializeAutomaticSession();\n            }\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            var acquisitionExpired = now - this.automaticSession.acquisitionDate > this.config.sessionExpirationMs();\n            var renewalExpired = now - this.automaticSession.renewalDate > this.config.sessionRenewalMs();\n            // renew if acquisitionSpan or renewalSpan has ellapsed\n            if (acquisitionExpired || renewalExpired) {\n                // update automaticSession so session state has correct id                \n                this.automaticSession.isFirst = undefined;\n                this.renew();\n            }\n            else {\n                // do not update the cookie more often than cookieUpdateInterval\n                if (!this.cookieUpdatedTimestamp || now - this.cookieUpdatedTimestamp > _SessionManager.cookieUpdateInterval) {\n                    this.automaticSession.renewalDate = now;\n                    this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n                }\n            }\n        };\n        /**\n         *  Record the current state of the automatic session and store it in our cookie string format\n         *  into the browser's local storage. This is used to restore the session data when the cookie\n         *  expires.\n         */\n        _SessionManager.prototype.backup = function () {\n            this.setStorage(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n        };\n        /**\n         *  Use ai_session cookie data or local storage data (when the cookie is unavailable) to\n         *  initialize the automatic session.\n         */\n        _SessionManager.prototype.initializeAutomaticSession = function () {\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, 'ai_session');\n            if (cookie && typeof cookie.split === \"function\") {\n                this.initializeAutomaticSessionWithData(cookie);\n            }\n            else {\n                // There's no cookie, but we might have session data in local storage\n                // This can happen if the session expired or the user actively deleted the cookie\n                // We only want to recover data if the cookie is missing from expiry. We should respect the user's wishes if the cookie was deleted actively.\n                // The User class handles this for us and deletes our local storage object if the persistent user cookie was removed.\n                var storage = applicationinsights_common_1.Util.getStorage(this._logger, 'ai_session');\n                if (storage) {\n                    this.initializeAutomaticSessionWithData(storage);\n                }\n            }\n            if (!this.automaticSession.id) {\n                this.automaticSession.isFirst = true;\n                this.renew();\n            }\n        };\n        /**\n         *  Extract id, aquisitionDate, and renewalDate from an ai_session payload string and\n         *  use this data to initialize automaticSession.\n         *\n         *  @param {string} sessionData - The string stored in an ai_session cookie or local storage backup\n         */\n        _SessionManager.prototype.initializeAutomaticSessionWithData = function (sessionData) {\n            var params = sessionData.split(\"|\");\n            if (params.length > 0) {\n                this.automaticSession.id = params[0];\n            }\n            try {\n                if (params.length > 1) {\n                    var acq = +params[1];\n                    this.automaticSession.acquisitionDate = +new Date(acq);\n                    this.automaticSession.acquisitionDate = this.automaticSession.acquisitionDate > 0 ? this.automaticSession.acquisitionDate : 0;\n                }\n                if (params.length > 2) {\n                    var renewal = +params[2];\n                    this.automaticSession.renewalDate = +new Date(renewal);\n                    this.automaticSession.renewalDate = this.automaticSession.renewalDate > 0 ? this.automaticSession.renewalDate : 0;\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ErrorParsingAISessionCookie, \"Error parsing ai_session cookie, session will be reset: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            if (this.automaticSession.renewalDate == 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionRenewalDateIsZero, \"AI session renewal date is 0, session will be reset.\");\n            }\n        };\n        _SessionManager.prototype.renew = function () {\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            this.automaticSession.id = applicationinsights_common_1.Util.newId();\n            this.automaticSession.acquisitionDate = now;\n            this.automaticSession.renewalDate = now;\n            this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n            // If this browser does not support local storage, fire an internal log to keep track of it at this point\n            if (!applicationinsights_common_1.Util.canUseLocalStorage()) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserDoesNotSupportLocalStorage, \"Browser does not support local storage. Session durations will be inaccurate.\");\n            }\n        };\n        _SessionManager.prototype.setCookie = function (guid, acq, renewal) {\n            // Set cookie to expire after the session expiry time passes or the session renewal deadline, whichever is sooner\n            // Expiring the cookie will cause the session to expire even if the user isn't on the page\n            var acquisitionExpiry = acq + this.config.sessionExpirationMs();\n            var renewalExpiry = renewal + this.config.sessionRenewalMs();\n            var cookieExpiry = new Date();\n            var cookie = [guid, acq, renewal];\n            if (acquisitionExpiry < renewalExpiry) {\n                cookieExpiry.setTime(acquisitionExpiry);\n            }\n            else {\n                cookieExpiry.setTime(renewalExpiry);\n            }\n            var cookieDomnain = this.config.cookieDomain ? this.config.cookieDomain() : null;\n            applicationinsights_common_1.Util.setCookie(this._logger, 'ai_session', cookie.join('|') + ';expires=' + cookieExpiry.toUTCString(), cookieDomnain);\n            this.cookieUpdatedTimestamp = applicationinsights_common_1.DateTimeUtils.Now();\n        };\n        _SessionManager.prototype.setStorage = function (guid, acq, renewal) {\n            // Keep data in local storage to retain the last session id, allowing us to cleanly end the session when it expires\n            // Browsers that don't support local storage won't be able to end sessions cleanly from the client\n            // The server will notice this and end the sessions itself, with loss of accurate session duration\n            applicationinsights_common_1.Util.setStorage(this._logger, 'ai_session', [guid, acq, renewal].join('|'));\n        };\n        _SessionManager.acquisitionSpan = 86400000; // 24 hours in ms\n        _SessionManager.renewalSpan = 1800000; // 30 minutes in ms\n        _SessionManager.cookieUpdateInterval = 60000; // 1 minute in ms\n        return _SessionManager;\n    }());\n    exports._SessionManager = _SessionManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Session.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/User.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var User = /** @class */ (function () {\n        function User(config, logger) {\n            this._logger = logger;\n            //get userId or create new one if none exists\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, User.userCookieName);\n            if (cookie) {\n                var params = cookie.split(User.cookieSeparator);\n                if (params.length > 0) {\n                    this.id = params[0];\n                }\n            }\n            this.config = config;\n            if (!this.id) {\n                this.id = applicationinsights_common_1.Util.newId();\n                var date = new Date();\n                var acqStr = applicationinsights_common_1.Util.toISOStringForIE8(date);\n                this.accountAcquisitionDate = acqStr;\n                // without expiration, cookies expire at the end of the session\n                // set it to 365 days from now\n                // 365 * 24 * 60 * 60 * 1000 = 31536000000 \n                date.setTime(date.getTime() + 31536000000);\n                var newCookie = [this.id, acqStr];\n                var cookieDomain = this.config.cookieDomain ? this.config.cookieDomain() : undefined;\n                applicationinsights_common_1.Util.setCookie(this._logger, User.userCookieName, newCookie.join(User.cookieSeparator) + ';expires=' + date.toUTCString(), cookieDomain);\n                // If we have an ai_session in local storage this means the user actively removed our cookies.\n                // We should respect their wishes and clear ourselves from local storage\n                applicationinsights_common_1.Util.removeStorage(this._logger, 'ai_session');\n            }\n            // We still take the account id from the ctor param for backward compatibility. \n            // But if the the customer set the accountId through the newer setAuthenticatedUserContext API, we will override it.\n            this.accountId = config.accountId ? config.accountId() : undefined;\n            // Get the auth user id and account id from the cookie if exists\n            // Cookie is in the pattern: <authenticatedId>|<accountId>\n            var authCookie = applicationinsights_common_1.Util.getCookie(this._logger, User.authUserCookieName);\n            if (authCookie) {\n                authCookie = decodeURI(authCookie);\n                var authCookieString = authCookie.split(User.cookieSeparator);\n                if (authCookieString[0]) {\n                    this.authenticatedId = authCookieString[0];\n                }\n                if (authCookieString.length > 1 && authCookieString[1]) {\n                    this.accountId = authCookieString[1];\n                }\n            }\n        }\n        /**\n        * Sets the authenticated user id and the account id in this session.\n        *\n        * @param authenticatedUserId {string} - The authenticated user id. A unique and persistent string that represents each authenticated user in the service.\n        * @param accountId {string} - An optional string to represent the account associated with the authenticated user.\n        */\n        User.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            // Validate inputs to ensure no cookie control characters.\n            var isInvalidInput = !this.validateUserInput(authenticatedUserId) || (accountId && !this.validateUserInput(accountId));\n            if (isInvalidInput) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SetAuthContextFailedAccountName, \"Setting auth user context failed. \" +\n                    \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                return;\n            }\n            // Create cookie string.\n            this.authenticatedId = authenticatedUserId;\n            var authCookie = this.authenticatedId;\n            if (accountId) {\n                this.accountId = accountId;\n                authCookie = [this.authenticatedId, this.accountId].join(User.cookieSeparator);\n            }\n            if (storeInCookie) {\n                // Set the cookie. No expiration date because this is a session cookie (expires when browser closed).\n                // Encoding the cookie to handle unexpected unicode characters.\n                applicationinsights_common_1.Util.setCookie(this._logger, User.authUserCookieName, encodeURI(authCookie), this.config.cookieDomain());\n            }\n        };\n        /**\n         * Clears the authenticated user id and the account id from the user context.\n         * @returns {}\n         */\n        User.prototype.clearAuthenticatedUserContext = function () {\n            this.authenticatedId = null;\n            this.accountId = null;\n            applicationinsights_common_1.Util.deleteCookie(this._logger, User.authUserCookieName);\n        };\n        User.prototype.validateUserInput = function (id) {\n            // Validate:\n            // 1. Id is a non-empty string.\n            // 2. It does not contain special characters for cookies.\n            if (typeof id !== 'string' ||\n                !id ||\n                id.match(/,|;|=| |\\|/)) {\n                return false;\n            }\n            return true;\n        };\n        User.cookieSeparator = '|';\n        User.userCookieName = 'ai_user';\n        User.authUserCookieName = 'ai_authUser';\n        return User;\n    }());\n    exports.User = User;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=User.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var HashCodeScoreGenerator = /** @class */ (function () {\n        function HashCodeScoreGenerator() {\n        }\n        HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n            var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n            return score * 100;\n        };\n        HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n            if (input == \"\") {\n                return 0;\n            }\n            while (input.length < HashCodeScoreGenerator.MIN_INPUT_LENGTH) {\n                input = input.concat(input);\n            }\n            // 5381 is a magic number: http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function\n            var hash = 5381;\n            for (var i = 0; i < input.length; ++i) {\n                hash = ((hash << 5) + hash) + input.charCodeAt(i);\n                // 'hash' is of number type which means 53 bit integer (http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-number-type)\n                // 'hash & hash' will keep it 32 bit integer - just to make it clearer what the result is.\n                hash = hash & hash;\n            }\n            return Math.abs(hash);\n        };\n        // We're using 32 bit math, hence max value is (2^31 - 1)\n        HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n        // (Magic number) DJB algorithm can't work on shorter strings (results in poor distribution\n        HashCodeScoreGenerator.MIN_INPUT_LENGTH = 8;\n        return HashCodeScoreGenerator;\n    }());\n    exports.HashCodeScoreGenerator = HashCodeScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=HashCodeScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * PropertiesPlugin.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! ./Context/Session */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\"), __webpack_require__(/*! ./Context/Application */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\"), __webpack_require__(/*! ./Context/Device */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\"), __webpack_require__(/*! ./Context/Internal */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\"), __webpack_require__(/*! ./Context/Location */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\"), __webpack_require__(/*! ./Context/Operation */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\"), __webpack_require__(/*! ./Context/User */ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\"), __webpack_require__(/*! ./Context/Sample */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_common_1, Session_1, Application_1, Device_1, Internal_1, Location_1, Operation_1, User_1, Sample_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PropertiesPlugin = /** @class */ (function () {\n        function PropertiesPlugin() {\n            this.priority = 170;\n            this.identifier = \"AppInsightsPropertiesPlugin\";\n        }\n        PropertiesPlugin.prototype.initialize = function (config, core, extensions) {\n            var extensionConfig = config.extensions &&\n                config.extensions[this.identifier] ?\n                config.extensions[this.identifier] : {};\n            this._extensionConfig = {\n                instrumentationKey: function () { return extensionConfig.instrumentationKey; },\n                accountId: function () { return extensionConfig.accountId; },\n                sessionRenewalMs: function () { return extensionConfig.sessionRenewalMs; },\n                sampleRate: function () { return extensionConfig.sampleRate; },\n                sessionExpirationMs: function () { return extensionConfig.sessionExpirationMs; },\n                cookieDomain: function () { return extensionConfig.cookieDomain; },\n                sdkExtension: function () { return extensionConfig.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return extensionConfig.isBrowserLinkTrackingEnabled; },\n                appId: function () { return extensionConfig.appId; }\n            };\n            if (typeof window !== 'undefined') {\n                this._sessionManager = new Session_1._SessionManager(this._extensionConfig, core.logger);\n                this.application = new Application_1.Application();\n                this.device = new Device_1.Device();\n                this.internal = new Internal_1.Internal(this._extensionConfig);\n                this.location = new Location_1.Location();\n                this.user = new User_1.User(this._extensionConfig, core.logger);\n                this.operation = new Operation_1.Operation();\n                this.session = new Session_1.Session();\n                this.sample = new Sample_1.Sample(this._extensionConfig.sampleRate(), core.logger);\n            }\n        };\n        /**\n         * Add Part A fields to the event\n         * @param event The event that needs to be processed\n         */\n        PropertiesPlugin.prototype.processTelemetry = function (event) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(event)) {\n                // TODO(barustum): throw an internal event once we have support for internal logging\n            }\n            else {\n                // if the event is not sampled in, do not bother going through the pipeline\n                if (this.sample.isSampledIn(event)) {\n                    // If the envelope is PageView, reset the internal message count so that we can send internal telemetry for the new page.\n                    if (event.name === applicationinsights_common_1.PageView.envelopeType) {\n                        // TODO(barustum): resetInternalMessageCount once we have support for internal logging\n                        //_InternalLogging.resetInternalMessageCount();\n                    }\n                    if (this.session) {\n                        // If customer did not provide custom session id update the session manager\n                        if (typeof this.session.id !== \"string\") {\n                            this._sessionManager.update();\n                        }\n                    }\n                    this._processTelemetryInternal(event);\n                }\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                    this._nextPlugin.processTelemetry(event);\n                }\n            }\n        };\n        /**\n         * Sets the next plugin that comes after this plugin\n         * @param nextPlugin The next plugin\n         */\n        PropertiesPlugin.prototype.setNextPlugin = function (nextPlugin) {\n            this._nextPlugin = nextPlugin;\n        };\n        PropertiesPlugin.prototype._processTelemetryInternal = function (event) {\n            var tagsItem = {};\n            if (this.session) {\n                // If customer set id, apply his context; otherwise apply context generated from cookies \n                if (typeof this.session.id === \"string\") {\n                    PropertiesPlugin._applySessionContext(tagsItem, this.session);\n                }\n                else {\n                    PropertiesPlugin._applySessionContext(tagsItem, this._sessionManager.automaticSession);\n                }\n            }\n            // set part A  fields\n            PropertiesPlugin._applyApplicationContext(tagsItem, this.application);\n            PropertiesPlugin._applyDeviceContext(tagsItem, this.device);\n            PropertiesPlugin._applyInternalContext(tagsItem, this.internal);\n            PropertiesPlugin._applyLocationContext(tagsItem, this.location);\n            PropertiesPlugin._applySampleContext(tagsItem, this.sample);\n            PropertiesPlugin._applyUserContext(tagsItem, this.user);\n            PropertiesPlugin._applyOperationContext(tagsItem, this.operation);\n            event.tags.push(tagsItem);\n        };\n        PropertiesPlugin._applySessionContext = function (tags, sessionContext) {\n            if (sessionContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof sessionContext.id === \"string\") {\n                    tags[tagKeys.sessionId] = sessionContext.id;\n                }\n                if (typeof sessionContext.isFirst !== \"undefined\") {\n                    tags[tagKeys.sessionIsFirst] = sessionContext.isFirst;\n                }\n            }\n        };\n        PropertiesPlugin._applyApplicationContext = function (tagsItem, appContext) {\n            if (appContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof appContext.ver === \"string\") {\n                    tagsItem[tagKeys.applicationVersion] = appContext.ver;\n                }\n                if (typeof appContext.build === \"string\") {\n                    tagsItem[tagKeys.applicationBuild] = appContext.build;\n                }\n            }\n        };\n        PropertiesPlugin._applyDeviceContext = function (tagsItem, deviceContext) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            if (deviceContext) {\n                if (typeof deviceContext.id === \"string\") {\n                    tagsItem[tagKeys.deviceId] = deviceContext.id;\n                }\n                if (typeof deviceContext.ip === \"string\") {\n                    tagsItem[tagKeys.deviceIp] = deviceContext.ip;\n                }\n                if (typeof deviceContext.language === \"string\") {\n                    tagsItem[tagKeys.deviceLanguage] = deviceContext.language;\n                }\n                if (typeof deviceContext.locale === \"string\") {\n                    tagsItem[tagKeys.deviceLocale] = deviceContext.locale;\n                }\n                if (typeof deviceContext.model === \"string\") {\n                    tagsItem[tagKeys.deviceModel] = deviceContext.model;\n                }\n                if (typeof deviceContext.network !== \"undefined\") {\n                    tagsItem[tagKeys.deviceNetwork] = deviceContext.network;\n                }\n                if (typeof deviceContext.oemName === \"string\") {\n                    tagsItem[tagKeys.deviceOEMName] = deviceContext.oemName;\n                }\n                if (typeof deviceContext.os === \"string\") {\n                    tagsItem[tagKeys.deviceOS] = deviceContext.os;\n                }\n                if (typeof deviceContext.osversion === \"string\") {\n                    tagsItem[tagKeys.deviceOSVersion] = deviceContext.osversion;\n                }\n                if (typeof deviceContext.resolution === \"string\") {\n                    tagsItem[tagKeys.deviceScreenResolution] = deviceContext.resolution;\n                }\n                if (typeof deviceContext.type === \"string\") {\n                    tagsItem[tagKeys.deviceType] = deviceContext.type;\n                }\n            }\n        };\n        PropertiesPlugin._applyInternalContext = function (tagsItem, internalContext) {\n            if (internalContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof internalContext.agentVersion === \"string\") {\n                    tagsItem[tagKeys.internalAgentVersion] = internalContext.agentVersion;\n                }\n                if (typeof internalContext.sdkVersion === \"string\") {\n                    tagsItem[tagKeys.internalSdkVersion] = internalContext.sdkVersion;\n                }\n            }\n        };\n        PropertiesPlugin._applyLocationContext = function (tagsItem, locationContext) {\n            if (locationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof locationContext.ip === \"string\") {\n                    tagsItem[tagKeys.locationIp] = locationContext.ip;\n                }\n            }\n        };\n        PropertiesPlugin._applySampleContext = function (tagsItem, sampleContext) {\n            if (sampleContext) {\n                tagsItem.sampleRate = sampleContext.sampleRate;\n            }\n        };\n        PropertiesPlugin._applyOperationContext = function (tagsItem, operationContext) {\n            if (operationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof operationContext.id === \"string\") {\n                    tagsItem[tagKeys.operationId] = operationContext.id;\n                }\n                if (typeof operationContext.name === \"string\") {\n                    tagsItem[tagKeys.operationName] = operationContext.name;\n                }\n                if (typeof operationContext.parentId === \"string\") {\n                    tagsItem[tagKeys.operationParentId] = operationContext.parentId;\n                }\n                if (typeof operationContext.rootId === \"string\") {\n                    tagsItem[tagKeys.operationRootId] = operationContext.rootId;\n                }\n                if (typeof operationContext.syntheticSource === \"string\") {\n                    tagsItem[tagKeys.operationSyntheticSource] = operationContext.syntheticSource;\n                }\n            }\n        };\n        PropertiesPlugin._applyUserContext = function (tagsItem, userContext) {\n            if (userContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof userContext.accountId === \"string\") {\n                    tagsItem[tagKeys.userAccountId] = userContext.accountId;\n                }\n                if (typeof userContext.agent === \"string\") {\n                    tagsItem[tagKeys.userAgent] = userContext.agent;\n                }\n                if (typeof userContext.id === \"string\") {\n                    tagsItem[tagKeys.userId] = userContext.id;\n                }\n                if (typeof userContext.authenticatedId === \"string\") {\n                    tagsItem[tagKeys.userAuthUserId] = userContext.authenticatedId;\n                }\n                if (typeof userContext.storeRegion === \"string\") {\n                    tagsItem[tagKeys.userStoreRegion] = userContext.storeRegion;\n                }\n            }\n        };\n        return PropertiesPlugin;\n    }());\n    exports.default = PropertiesPlugin;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PropertiesPlugin.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./HashCodeScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, HashCodeScoreGenerator_1, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var SamplingScoreGenerator = /** @class */ (function () {\n        function SamplingScoreGenerator() {\n            this.hashCodeGeneragor = new HashCodeScoreGenerator_1.HashCodeScoreGenerator();\n        }\n        SamplingScoreGenerator.prototype.getSamplingScore = function (envelope) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            var score = 0;\n            if (envelope.tags[tagKeys.userId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.userId]);\n            }\n            else if (envelope.tags[tagKeys.operationId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.operationId]);\n            }\n            else {\n                // tslint:disable-next-line:insecure-random\n                score = Math.random();\n            }\n            return score;\n        };\n        return SamplingScoreGenerator;\n    }());\n    exports.SamplingScoreGenerator = SamplingScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SamplingScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PropertiesPlugin */ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PropertiesPlugin_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.PropertiesPlugin = PropertiesPlugin_1.default;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-properties-js.js.map\n\n/***/ }),\n\n/***/ 0:\n/*!**********************************!*\\\n  !*** multi ./amd/bundle/Init.js ***!\n  \\**********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./amd/bundle/Init.js */\"./amd/bundle/Init.js\");\n\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=aisdk.0.0.17.js.map"
  },
  {
    "path": "AISKU/dist-history/aisdk.0.0.18.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./amd/bundle/Init.js\":\n/*!****************************!*\\\n  !*** ./amd/bundle/Init.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! ./Initialization */ \"./amd/bundle/Initialization.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_analytics_js_1, Initialization_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    //should be global function that should load as soon as SDK loads\n    try {\n        // E2E sku on load initializes core and pipeline using snippet as input for configuration\n        var aiName;\n        if (typeof window !== \"undefined\" && typeof JSON !== \"undefined\") {\n            // get snippet or initialize to an empty object\n            // get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation\n            aiName = window[\"appInsightsSDK\"];\n            if (window[aiName] === undefined) {\n                // if no snippet is present, initialize default values\n                applicationinsights_analytics_js_1.ApplicationInsights.appInsightsDefaultConfig = Initialization_1.Initialization.getDefaultConfig();\n            }\n            else {\n                if (window[aiName].initialize) {\n                    // this is the typical case for browser+snippet\n                    var snippet = window[aiName] || {};\n                    // overwrite snippet with full appInsights\n                    var initialization = new Initialization_1.Initialization(snippet);\n                    var appInsightsLocal = initialization.loadAppInsights();\n                    // apply full appInsights to the global instance that was initialized in the snippet\n                    for (var field in appInsightsLocal) {\n                        snippet[field] = appInsightsLocal[field];\n                    }\n                    // Empty queue of all api calls logged prior to sdk download\n                    initialization.emptyQueue();\n                    initialization.addHousekeepingBeforeUnload(appInsightsLocal);\n                }\n            }\n        }\n    }\n    catch (e) {\n        // TODO: Find better place to warn to console when SDK initialization fails\n        if (console) {\n            console.warn('Failed to initialize AppInsights JS SDK for instance ' + aiName + e.message);\n        }\n    }\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./amd/bundle/Initialization.js\":\n/*!**************************************!*\\\n  !*** ./amd/bundle/Initialization.js ***!\n  \\**************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-channel-js */ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\"), __webpack_require__(/*! applicationinsights-properties-js */ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\"), __webpack_require__(/*! applicationinsights-dependencies-js */ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_analytics_js_1, applicationinsights_common_1, applicationinsights_channel_js_1, applicationinsights_properties_js_1, applicationinsights_dependencies_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    ;\n    var Initialization = /** @class */ (function () {\n        function Initialization(snippet) {\n            // initialize the queue and config in case they are undefined\n            snippet.queue = snippet.queue || [];\n            var config = snippet.config || {};\n            // ensure instrumentationKey is specified\n            if (config && !config.instrumentationKey) {\n                config = snippet;\n                applicationinsights_analytics_js_1.ApplicationInsights.Version = \"2.0.0\";\n            }\n            this.appInsights = new applicationinsights_analytics_js_1.ApplicationInsights();\n            // set default values using config passed through snippet\n            config = Initialization.getDefaultConfig(config, this.appInsights.identifier);\n            this.properties = new applicationinsights_properties_js_1.PropertiesPlugin();\n            this.dependencies = new applicationinsights_dependencies_js_1.AjaxPlugin();\n            this.snippet = snippet;\n            this.config = config;\n        }\n        // Analytics Plugin\n        Initialization.prototype.trackPageView = function (pageView, customProperties) {\n            this.appInsights.trackPageView(pageView, customProperties);\n        };\n        Initialization.prototype.trackPageViewPerformance = function (pageViewPerformance, customProperties) {\n            var item = new applicationinsights_common_1.PageViewPerformance(this.core.logger, pageViewPerformance.name, pageViewPerformance.url, undefined, customProperties);\n            this.appInsights.sendPageViewPerformanceInternal(item, customProperties);\n        };\n        Initialization.prototype.trackException = function (exception, customProperties) {\n            this.appInsights.trackException(exception, customProperties);\n        };\n        Initialization.prototype._onerror = function (exception) {\n            this.appInsights._onerror(exception);\n        };\n        Initialization.prototype.trackTrace = function (trace, customProperties) {\n            this.appInsights.trackTrace(trace, customProperties);\n        };\n        Initialization.prototype.trackMetric = function (metric, customProperties) {\n            this.appInsights.trackMetric(metric, customProperties);\n        };\n        Initialization.prototype.startTrackPage = function (name) {\n            this.appInsights.startTrackPage(name);\n        };\n        Initialization.prototype.stopTrackPage = function (name, url, customProperties) {\n            this.appInsights.stopTrackPage(name, url, customProperties);\n        };\n        Initialization.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            return this.appInsights.addTelemetryInitializer(telemetryInitializer);\n        };\n        // Properties Plugin\n        Initialization.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            this.properties.user.setAuthenticatedUserContext(authenticatedUserId, accountId, storeInCookie);\n        };\n        Initialization.prototype.clearAuthenticatedUserContext = function () {\n            this.properties.user.clearAuthenticatedUserContext();\n        };\n        // Dependencies Plugin\n        Initialization.prototype.trackDependencyData = function (dependency, customProperties, systemProperties) {\n            this.dependencies.trackDependencyData(dependency, customProperties, systemProperties);\n        };\n        Initialization.prototype.loadAppInsights = function () {\n            this.core = new applicationinsights_core_js_1.AppInsightsCore();\n            var extensions = [];\n            var appInsightsChannel = new applicationinsights_channel_js_1.Sender();\n            extensions.push(appInsightsChannel);\n            extensions.push(this.properties);\n            extensions.push(this.dependencies);\n            extensions.push(this.appInsights);\n            // initialize core\n            this.core.initialize(this.config, extensions);\n            return this;\n        };\n        Initialization.prototype.emptyQueue = function () {\n            // call functions that were queued before the main script was loaded\n            try {\n                if (applicationinsights_common_1.Util.isArray(this.snippet.queue)) {\n                    // note: do not check length in the for-loop conditional in case something goes wrong and the stub methods are not overridden.\n                    var length = this.snippet.queue.length;\n                    for (var i = 0; i < length; i++) {\n                        var call = this.snippet.queue[i];\n                        call();\n                    }\n                    this.snippet.queue = undefined;\n                    delete this.snippet.queue;\n                }\n            }\n            catch (exception) {\n                var properties = {};\n                if (exception && typeof exception.toString === \"function\") {\n                    properties.exception = exception.toString();\n                }\n                // need from core\n                // Microsoft.ApplicationInsights._InternalLogging.throwInternal(\n                //     LoggingSeverity.WARNING,\n                //     _InternalMessageId.FailedToSendQueuedTelemetry,\n                //     \"Failed to send queued telemetry\",\n                //     properties);\n            }\n        };\n        Initialization.prototype.pollInteralLogs = function (appInsightsInstance) {\n            // return setInterval(() => {\n            //     var queue: Array<_InternalLogMessage> = ApplicationInsights._InternalLogging.queue;\n            //     var length = queue.length;\n            //     for (var i = 0; i < length; i++) {\n            //         appInsightsInstance.trackTrace(queue[i].message);\n            //     }\n            //     queue.length = 0;\n            // }, this.config.diagnosticLogInterval);\n        };\n        Initialization.prototype.addHousekeepingBeforeUnload = function (appInsightsInstance) {\n            // Add callback to push events when the user navigates away\n            if (!appInsightsInstance.appInsights.config.disableFlushOnBeforeUnload && ('onbeforeunload' in window)) {\n                var performHousekeeping = function () {\n                    // Adds the ability to flush all data before the page unloads.\n                    // Note: This approach tries to push an async request with all the pending events onbeforeunload.\n                    // Firefox does not respect this.Other browsers DO push out the call with < 100% hit rate.\n                    // Telemetry here will help us analyze how effective this approach is.\n                    // Another approach would be to make this call sync with a acceptable timeout to reduce the \n                    // impact on user experience.\n                    //appInsightsInstance.context._sender.triggerSend();\n                    appInsightsInstance.appInsights.core.getTransmissionControls().forEach(function (queues) {\n                        queues.forEach(function (channel) { return channel.flush(true); });\n                    });\n                    // Back up the current session to local storage\n                    // This lets us close expired sessions after the cookies themselves expire\n                    // Todo: move this against interface behavior\n                    if (this.core.extensions[\"AppInsightsPropertiesPlugin\"] &&\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager) {\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager.backup();\n                    }\n                };\n                if (!applicationinsights_common_1.Util.addEventHandler('beforeunload', performHousekeeping)) {\n                    this.core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToAddHandlerForOnBeforeUnload, 'Could not add handler for beforeunload');\n                }\n            }\n        };\n        Initialization.getDefaultConfig = function (configuration, identifier) {\n            if (!configuration) {\n                configuration = {};\n            }\n            if (configuration) {\n                identifier = identifier ? identifier : \"ApplicationInsightsAnalytics\";\n            }\n            // Undefined checks\n            if (!configuration.extensionConfig) {\n                configuration.extensionConfig = {};\n            }\n            if (!configuration.extensionConfig[identifier]) {\n                configuration.extensionConfig[identifier] = {};\n            }\n            var extensionConfig = configuration.extensionConfig[identifier]; // ref to main config\n            // set default values\n            configuration.endpointUrl = configuration.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\";\n            extensionConfig.sessionRenewalMs = 30 * 60 * 1000;\n            extensionConfig.sessionExpirationMs = 24 * 60 * 60 * 1000;\n            extensionConfig.enableDebug = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableDebug);\n            extensionConfig.disableExceptionTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableExceptionTracking);\n            extensionConfig.consoleLoggingLevel = extensionConfig.consoleLoggingLevel || 1; // Show only CRITICAL level\n            extensionConfig.telemetryLoggingLevel = extensionConfig.telemetryLoggingLevel || 0; // Send nothing\n            extensionConfig.diagnosticLogInterval = extensionConfig.diagnosticLogInterval || 10000;\n            extensionConfig.autoTrackPageVisitTime = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.autoTrackPageVisitTime);\n            if (isNaN(extensionConfig.samplingPercentage) || extensionConfig.samplingPercentage <= 0 || extensionConfig.samplingPercentage >= 100) {\n                extensionConfig.samplingPercentage = 100;\n            }\n            extensionConfig.disableAjaxTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableAjaxTracking);\n            extensionConfig.maxAjaxCallsPerView = !isNaN(extensionConfig.maxAjaxCallsPerView) ? extensionConfig.maxAjaxCallsPerView : 500;\n            extensionConfig.disableCorrelationHeaders = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableCorrelationHeaders);\n            extensionConfig.correlationHeaderExcludedDomains = extensionConfig.correlationHeaderExcludedDomains || [\n                \"*.blob.core.windows.net\",\n                \"*.blob.core.chinacloudapi.cn\",\n                \"*.blob.core.cloudapi.de\",\n                \"*.blob.core.usgovcloudapi.net\"\n            ];\n            extensionConfig.disableFlushOnBeforeUnload = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableFlushOnBeforeUnload);\n            extensionConfig.isCookieUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isCookieUseDisabled);\n            extensionConfig.isStorageUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isStorageUseDisabled);\n            extensionConfig.isBrowserLinkTrackingEnabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isBrowserLinkTrackingEnabled);\n            extensionConfig.enableCorsCorrelation = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableCorsCorrelation);\n            return configuration;\n        };\n        return Initialization;\n    }());\n    exports.Initialization = Initialization;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * ApplicationInsights.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Telemetry/PageViewManager */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, PageViewManager_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var durationProperty = \"duration\";\n    var ApplicationInsights = /** @class */ (function () {\n        function ApplicationInsights() {\n            this.identifier = \"ApplicationInsightsAnalytics\";\n            this.priority = 160; // take from reserved priority range 100- 200\n            this._isInitialized = false;\n            // Counts number of trackAjax invokations.\n            // By default we only monitor X ajax call per view to avoid too much load.\n            // Default value is set in config.\n            // This counter keeps increasing even after the limit is reached.\n            this._trackAjaxAttempts = 0;\n            this.initialize = this._initialize.bind(this);\n        }\n        ApplicationInsights.prototype.processTelemetry = function (env) {\n            var doNotSendItem = false;\n            try {\n                var telemetryInitializersCount = this._telemetryInitializers.length;\n                for (var i = 0; i < telemetryInitializersCount; ++i) {\n                    var telemetryInitializer = this._telemetryInitializers[i];\n                    if (telemetryInitializer) {\n                        if (telemetryInitializer.apply(null, [env]) === false) {\n                            doNotSendItem = true;\n                            break;\n                        }\n                    }\n                }\n            }\n            catch (e) {\n                doNotSendItem = true;\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryInitializerFailed, \"One of telemetry initializers failed, telemetry item will not be sent: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) }, true);\n            }\n            if (!doNotSendItem && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(env);\n            }\n        };\n        ApplicationInsights.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * @description Log a diagnostic message\n         * @param {ITraceTelemetry} trace\n         * @param {{[key: string]: any}} [customProperties]\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackTrace = function (trace, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(trace, applicationinsights_common_1.Trace.dataType, applicationinsights_common_1.Trace.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TrackTraceFailed, \"trackTrace failed, trace will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Log a numeric value that is not associated with a specific event. Typically\n         * used to send regular reports of performance indicators. To send single measurement, just\n         * use the name and average fields of {@link IMetricTelemetry}. If you take measurements\n         * frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements\n         * and sending the resulting average at intervals\n         * @param {IMetricTelemetry} metric input object argument. Only name and average are mandatory.\n         * @param {{[key: string]: any}} customProperties additional data used to filter metrics in the\n         * portal. Defaults to empty.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackMetric = function (metric, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(metric, applicationinsights_common_1.Metric.dataType, applicationinsights_common_1.Metric.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackMetricFailed, \"trackMetric failed, metric will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs that a page or other item was viewed.\n         * @param IPageViewTelemetry The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param customProperties Additional data used to filter events and metrics. Defaults to empty. If a user wants\n         *                         to provide a custom duration, it'll have to be in customProperties\n         */\n        ApplicationInsights.prototype.trackPageView = function (pageView, customProperties) {\n            try {\n                this._pageViewManager.trackPageView(pageView, customProperties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(pageView.name, pageView.uri);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailed, \"trackPageView failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Create a page view telemetry item and send it to the SDK pipeline through the core.track API\n         * @param pageView Page view item to be sent\n         * @param properties Custom properties (Part C) that a user can add to the telemetry item\n         * @param systemProperties System level properties (Part A) that a user can add to the telemetry item\n         */\n        ApplicationInsights.prototype.sendPageViewInternal = function (pageView, properties, systemProperties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageView, applicationinsights_common_1.PageView.dataType, applicationinsights_common_1.PageView.envelopeType, this._logger, properties, systemProperties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n            // reset ajaxes counter\n            this._trackAjaxAttempts = 0;\n        };\n        ApplicationInsights.prototype.sendPageViewPerformanceInternal = function (pageViewPerformance, properties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageViewPerformance, applicationinsights_common_1.PageViewPerformance.dataType, applicationinsights_common_1.PageViewPerformance.envelopeType, this._logger, properties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n        };\n        /**\n         * Starts timing how long the user views a page or other item. Call this when the page opens.\n         * This method doesn't send any telemetry. Call {@link stopTrackTelemetry} to log the page when it closes.\n         * @param name A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n         */\n        ApplicationInsights.prototype.startTrackPage = function (name) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                this._pageTracking.start(name);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StartTrackFailed, \"startTrackPage failed, page view may not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs how long a page or other item was visible, after {@link startTrackPage}. Call this when the page closes.\n         * @param name The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param url A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n         * @param properties Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *                   Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric\n         */\n        ApplicationInsights.prototype.stopTrackPage = function (name, url, properties) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                if (typeof url !== \"string\") {\n                    url = window.location && window.location.href || \"\";\n                }\n                this._pageTracking.stop(name, url, properties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(name, url);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StopTrackFailed, \"stopTrackPage failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Log an exception you have caught.\n         *\n         * @param {IExceptionTelemetry} exception   Object which contains exception to be sent\n         * @param {{[key: string]: any}} customProperties   Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *\n         * Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackException = function (exception, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackExceptionFailed, \"trackException failed, exception will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Custom error handler for Application Insights Analytics\n         * @param {IAutoExceptionTelemetry} exception\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype._onerror = function (exception) {\n            try {\n                var properties = {\n                    url: (exception && exception.url) || document.URL,\n                    lineNumber: exception.lineNumber,\n                    columnNumber: exception.columnNumber,\n                    message: exception.message\n                };\n                if (applicationinsights_common_1.Util.isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception.error)) {\n                    this._sendCORSException(properties.url);\n                }\n                else {\n                    if (!applicationinsights_common_1.Util.isError(exception.error)) {\n                        var stack = \"window.onerror@\" + properties.url + \":\" + exception.lineNumber + \":\" + (exception.columnNumber || 0);\n                        exception.error = new Error(exception.message);\n                        exception.error.stack = stack;\n                    }\n                    this.trackException({ error: exception.error, severityLevel: applicationinsights_common_1.SeverityLevel.Error }, properties);\n                }\n            }\n            catch (e) {\n                var errorString = exception.error ?\n                    (exception.error.name + \", \" + exception.error.message)\n                    : \"null\";\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ExceptionWhileLoggingError, \"_onError threw exception while logging error, error will not be collected: \"\n                    + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e), errorString: errorString });\n            }\n        };\n        ApplicationInsights.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._initialize = function (config, core, extensions) {\n            var _this = this;\n            if (this._isInitialized) {\n                return;\n            }\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(core)) {\n                throw Error(\"Error initializing\");\n            }\n            this.core = core;\n            this._logger = core.logger;\n            this._globalconfig = {\n                instrumentationKey: config.instrumentationKey,\n                endpointUrl: config.endpointUrl\n            };\n            this.config = config.extensionConfig && config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n            // load default values if specified\n            var defaults = ApplicationInsights.appInsightsDefaultConfig;\n            if (defaults !== undefined) {\n                if (defaults.extensions && defaults.extensions[this.identifier]) {\n                    for (var field in defaults.extensions[this.identifier]) {\n                        // for each unspecified field, set the default value\n                        if (this.config[field] === undefined) {\n                            this.config[field] = defaults[field];\n                        }\n                    }\n                }\n                if (this._globalconfig) {\n                    for (var field in defaults) {\n                        if (this._globalconfig[field] === undefined) {\n                            this._globalconfig[field] = defaults[field];\n                        }\n                    }\n                }\n            }\n            // Todo: move this out of static state\n            if (this.config.isCookieUseDisabled) {\n                applicationinsights_common_1.Util.disableCookies();\n            }\n            // Todo: move this out of static state\n            if (this.config.isStorageUseDisabled) {\n                applicationinsights_common_1.Util.disableStorage();\n            }\n            var configGetters = {\n                instrumentationKey: function () { return config.instrumentationKey; },\n                accountId: function () { return _this.config.accountId; },\n                sessionRenewalMs: function () { return _this.config.sessionRenewalMs; },\n                sessionExpirationMs: function () { return _this.config.sessionExpirationMs; },\n                sampleRate: function () { return _this.config.samplingPercentage; },\n                cookieDomain: function () { return _this.config.cookieDomain; },\n                sdkExtension: function () { return _this.config.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return _this.config.isBrowserLinkTrackingEnabled; },\n                appId: function () { return _this.config.appId; }\n            };\n            this._pageViewManager = new PageViewManager_1.PageViewManager(this, this.config.overridePageViewDuration, this.core);\n            this._telemetryInitializers = [];\n            this._addDefaultTelemetryInitializers(configGetters);\n            // initialize page view timing\n            this._pageTracking = new Timing(this._logger, \"trackPageView\");\n            this._pageTracking.action = function (name, url, duration, properties) {\n                var pageViewItem = {\n                    name: name,\n                    uri: url\n                };\n                // duration must be a custom property in order for the collector to extract it\n                if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(properties)) {\n                    properties = {};\n                }\n                properties[durationProperty] = duration;\n                _this.sendPageViewInternal(pageViewItem, properties);\n            };\n            if (this.config.disableExceptionTracking === false &&\n                !this.config.autoExceptionInstrumented) {\n                // We want to enable exception auto collection and it has not been done so yet\n                var onerror_1 = \"onerror\";\n                var originalOnError_1 = window[onerror_1];\n                var instance_1 = this;\n                window.onerror = function (message, url, lineNumber, columnNumber, error) {\n                    var handled = originalOnError_1 && originalOnError_1(message, url, lineNumber, columnNumber, error);\n                    if (handled !== true) {\n                        instance_1._onerror({\n                            message: message,\n                            url: url,\n                            lineNumber: lineNumber,\n                            columnNumber: columnNumber,\n                            error: error\n                        });\n                    }\n                    return handled;\n                };\n                this.config.autoExceptionInstrumented = true;\n            }\n            this._isInitialized = true;\n        };\n        ApplicationInsights.prototype._addDefaultTelemetryInitializers = function (configGetters) {\n            if (!configGetters.isBrowserLinkTrackingEnabled()) {\n                var browserLinkPaths_1 = ['/browserLinkSignalR/', '/__browserLink/'];\n                var dropBrowserLinkRequests = function (envelope) {\n                    if (envelope.baseType === applicationinsights_common_1.RemoteDependencyData.dataType) {\n                        var remoteData = envelope.baseData;\n                        if (remoteData) {\n                            for (var i = 0; i < browserLinkPaths_1.length; i++) {\n                                if (remoteData.absoluteUrl && remoteData.absoluteUrl.indexOf(browserLinkPaths_1[i]) >= 0) {\n                                    return false;\n                                }\n                            }\n                        }\n                    }\n                    return true;\n                };\n                this._addTelemetryInitializer(dropBrowserLinkRequests);\n            }\n        };\n        ApplicationInsights.prototype._addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._sendCORSException = function (url) {\n            var exception = {\n                message: \"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\",\n                url: url,\n                lineNumber: 0,\n                columnNumber: 0,\n                error: undefined\n            };\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, { url: url });\n            this.core.track(telemetryItem);\n        };\n        // Mutate telemetryItem inplace to add boilerplate iKey & name info\n        ApplicationInsights.prototype._setTelemetryNameAndIKey = function (telemetryItem) {\n            telemetryItem.instrumentationKey = this._globalconfig.instrumentationKey;\n            var iKeyNoDashes = this._globalconfig.instrumentationKey.replace(/-/g, \"\");\n            telemetryItem.name = telemetryItem.name.replace(\"{0}\", iKeyNoDashes);\n        };\n        ApplicationInsights.Version = \"2.0.1-beta\";\n        return ApplicationInsights;\n    }());\n    exports.ApplicationInsights = ApplicationInsights;\n    /**\n     * Used to record timed events and page views.\n     */\n    var Timing = /** @class */ (function () {\n        function Timing(logger, name) {\n            this._name = name;\n            this._events = {};\n            this._logger = logger;\n        }\n        Timing.prototype.start = function (name) {\n            if (typeof this._events[name] !== \"undefined\") {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StartCalledMoreThanOnce, \"start was called more than once for this event without calling stop.\", { name: this._name, key: name }, true);\n            }\n            this._events[name] = +new Date;\n        };\n        Timing.prototype.stop = function (name, url, properties) {\n            var start = this._events[name];\n            if (isNaN(start)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StopCalledWithoutStart, \"stop was called without a corresponding start.\", { name: this._name, key: name }, true);\n            }\n            else {\n                var end = +new Date;\n                var duration = applicationinsights_common_1.PageViewPerformance.getDuration(start, end);\n                this.action(name, url, duration, properties);\n            }\n            delete this._events[name];\n            this._events[name] = undefined;\n        };\n        return Timing;\n    }());\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ApplicationInsights.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Class encapsulates sending page views and page view performance telemetry.\n    */\n    var PageViewManager = /** @class */ (function () {\n        function PageViewManager(appInsights, overridePageViewDuration, core) {\n            this.pageViewPerformanceSent = false;\n            this.overridePageViewDuration = false;\n            this.overridePageViewDuration = overridePageViewDuration;\n            this.appInsights = appInsights;\n            if (core) {\n                this._channel = function () { return (core.getTransmissionControls()); };\n                this._logger = core.logger;\n            }\n        }\n        /**\n        * Currently supported cases:\n        * 1) (default case) track page view called with default parameters, overridePageViewDuration = false. Page view is sent with page view performance when navigation timing data is available.\n        *    a. If navigation timing is not supported then page view is sent right away with undefined duration. Page view performance is not sent.\n        * 2) overridePageViewDuration = true, custom duration provided. Custom duration is used, page view sends right away.\n        * 3) overridePageViewDuration = true, custom duration NOT provided. Page view is sent right away, duration is time spent from page load till now (or undefined if navigation timing is not supported).\n        * 4) overridePageViewDuration = false, custom duration is provided. Page view is sent right away with custom duration.\n        *\n        * In all cases page view performance is sent once (only for the 1st call of trackPageView), or not sent if navigation timing is not supported.\n        */\n        PageViewManager.prototype.trackPageView = function (pageView, customProperties) {\n            var _this = this;\n            var name = pageView.name;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(name) || typeof name !== \"string\") {\n                pageView.name = window.document && window.document.title || \"\";\n            }\n            var uri = pageView.uri;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                pageView.uri = window.location && window.location.href || \"\";\n            }\n            // case 1a. if performance timing is not supported by the browser, send the page view telemetry with the duration provided by the user. If the user\n            // do not provide the duration, set duration to undefined\n            // Also this is case 4\n            if (!applicationinsights_common_1.PageViewPerformance.isPerformanceTimingSupported()) {\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                // no navigation timing (IE 8, iOS Safari 8.4, Opera Mini 8 - see http://caniuse.com/#feat=nav-timing)\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NavigationTimingNotSupported, \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                return;\n            }\n            var pageViewSent = false;\n            var customDuration = undefined;\n            // if the performance timing is supported by the browser, calculate the custom duration\n            var start = applicationinsights_common_1.PageViewPerformance.getPerformanceTiming().navigationStart;\n            customDuration = applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date);\n            if (!applicationinsights_common_1.PageViewPerformance.shouldCollectDuration(customDuration)) {\n                customDuration = undefined;\n            }\n            // if the user has provided duration, send a page view telemetry with the provided duration. Otherwise, if\n            // overridePageViewDuration is set to true, send a page view telemetry with the custom duration calculated earlier\n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties.duration)) {\n                duration = customProperties.duration;\n            }\n            if (this.overridePageViewDuration || !isNaN(duration)) {\n                if (isNaN(duration)) {\n                    // case 3\n                    if (!customProperties) {\n                        customProperties = {};\n                    }\n                    customProperties[\"duration\"] = customDuration;\n                }\n                // case 2\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                pageViewSent = true;\n            }\n            // now try to send the page view performance telemetry\n            var maxDurationLimit = 60000;\n            if (!customProperties) {\n                customProperties = {};\n            }\n            var handle = setInterval((function () {\n                try {\n                    if (applicationinsights_common_1.PageViewPerformance.isPerformanceTimingDataReady()) {\n                        clearInterval(handle);\n                        var pageViewPerformance = new applicationinsights_common_1.PageViewPerformance(_this._logger, name, uri, null);\n                        if (!pageViewPerformance.getIsValid() && !pageViewSent) {\n                            // If navigation timing gives invalid numbers, then go back to \"override page view duration\" mode.\n                            // That's the best value we can get that makes sense.\n                            customProperties[\"duration\"] = customDuration;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                        else {\n                            if (!pageViewSent) {\n                                customProperties[\"duration\"] = pageViewPerformance.getDurationMs();\n                                _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            }\n                            if (!_this.pageViewPerformanceSent) {\n                                _this.appInsights.sendPageViewPerformanceInternal(pageViewPerformance, customProperties);\n                                _this.pageViewPerformanceSent = true;\n                            }\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                    else if (applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date) > maxDurationLimit) {\n                        // if performance timings are not ready but we exceeded the maximum duration limit, just log a page view telemetry\n                        // with the maximum duration limit. Otherwise, keep waiting until performance timings are ready\n                        clearInterval(handle);\n                        if (!pageViewSent) {\n                            customProperties[\"duration\"] = maxDurationLimit;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                }\n                catch (e) {\n                    _this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailedCalc, \"trackPageView failed on page load calculation: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }), 100);\n        };\n        return PageViewManager;\n    }());\n    exports.PageViewManager = PageViewManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK/ApplicationInsights */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ApplicationInsights_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ApplicationInsights = ApplicationInsights_1.ApplicationInsights;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-analytics-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ContextTagKeys = [\n        \"ai.application.ver\",\n        \"ai.application.build\",\n        \"ai.application.typeId\",\n        \"ai.application.applicationId\",\n        \"ai.application.layer\",\n        \"ai.device.id\",\n        \"ai.device.ip\",\n        \"ai.device.language\",\n        \"ai.device.locale\",\n        \"ai.device.model\",\n        \"ai.device.friendlyName\",\n        \"ai.device.network\",\n        \"ai.device.networkName\",\n        \"ai.device.oemName\",\n        \"ai.device.os\",\n        \"ai.device.osVersion\",\n        \"ai.device.roleInstance\",\n        \"ai.device.roleName\",\n        \"ai.device.screenResolution\",\n        \"ai.device.type\",\n        \"ai.device.machineName\",\n        \"ai.device.vmName\",\n        \"ai.device.browser\",\n        \"ai.device.browserVersion\",\n        \"ai.location.ip\",\n        \"ai.location.country\",\n        \"ai.location.province\",\n        \"ai.location.city\",\n        \"ai.operation.id\",\n        \"ai.operation.name\",\n        \"ai.operation.parentId\",\n        \"ai.operation.rootId\",\n        \"ai.operation.syntheticSource\",\n        \"ai.operation.correlationVector\",\n        \"ai.session.id\",\n        \"ai.session.isFirst\",\n        \"ai.session.isNew\",\n        \"ai.user.accountAcquisitionDate\",\n        \"ai.user.accountId\",\n        \"ai.user.userAgent\",\n        \"ai.user.id\",\n        \"ai.user.storeRegion\",\n        \"ai.user.authUserId\",\n        \"ai.user.anonUserAcquisitionDate\",\n        \"ai.user.authUserAcquisitionDate\",\n        \"ai.cloud.name\",\n        \"ai.cloud.role\",\n        \"ai.cloud.roleVer\",\n        \"ai.cloud.roleInstance\",\n        \"ai.cloud.environment\",\n        \"ai.cloud.location\",\n        \"ai.cloud.deploymentUnit\",\n        \"ai.internal.sdkVersion\",\n        \"ai.internal.agentVersion\",\n        \"ai.internal.nodeName\",\n    ];\n    // these two constants are used to filter out properties not needed when trying to extract custom properties and measurements from the incoming payload\n    var baseType = \"baseType\";\n    var baseData = \"baseData\";\n    var EnvelopeCreator = /** @class */ (function () {\n        function EnvelopeCreator() {\n        }\n        EnvelopeCreator.extractProperties = function (data) {\n            var customProperties = null;\n            for (var key in data) {\n                if (data.hasOwnProperty(key)) {\n                    var value = data[key];\n                    if (typeof value !== \"number\") {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[key] = value;\n                    }\n                }\n            }\n            return customProperties;\n        };\n        EnvelopeCreator.extractPropsAndMeasurements = function (data, properties, measurements) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(data)) {\n                for (var key in data) {\n                    if (data.hasOwnProperty(key)) {\n                        var value = data[key];\n                        if (typeof value === \"number\") {\n                            measurements[key] = value;\n                        }\n                        else {\n                            properties[key] = value;\n                        }\n                    }\n                }\n            }\n        };\n        // TODO: Do we want this to take logger as arg or use this._logger as nonstatic?\n        EnvelopeCreator.createEnvelope = function (logger, envelopeType, telemetryItem, data) {\n            var envelope = new applicationinsights_common_1.Envelope(logger, data, envelopeType);\n            envelope.iKey = telemetryItem.instrumentationKey;\n            var iKeyNoDashes = telemetryItem.instrumentationKey.replace(/-/g, \"\");\n            envelope.name = envelope.name.replace(\"{0}\", iKeyNoDashes);\n            // loop through the envelope ctx (Part A) and pick out the ones that should go in outgoing envelope tags\n            for (var key in telemetryItem.ctx) {\n                if (telemetryItem.ctx.hasOwnProperty(key)) {\n                    if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                        envelope.tags[key] = telemetryItem.ctx[key];\n                    }\n                }\n            }\n            // loop through the envelope tags (extension of Part A) and pick out the ones that should go in outgoing envelope tags\n            telemetryItem.tags.forEach(function (tag) {\n                for (var key in tag) {\n                    if (tag.hasOwnProperty(key)) {\n                        if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                            envelope.tags[key] = tag[key];\n                        }\n                    }\n                }\n            });\n            return envelope;\n        };\n        return EnvelopeCreator;\n    }());\n    exports.EnvelopeCreator = EnvelopeCreator;\n    var DependencyEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(DependencyEnvelopeCreator, _super);\n        function DependencyEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        DependencyEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customMeasurements = {};\n            var customProperties = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var bd = telemetryItem.baseData;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(bd)) {\n                logger.warnToConsole(\"Invalid input for dependency data\");\n                return null;\n            }\n            var id = bd.id;\n            var absoluteUrl = bd.absoluteUrl;\n            var command = bd.commandName;\n            var duration = bd.duration;\n            var success = bd.success;\n            var resultCode = bd.resultCode;\n            var method = bd.method;\n            var baseData = new applicationinsights_common_1.RemoteDependencyData(logger, id, absoluteUrl, command, duration, success, resultCode, method, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.RemoteDependencyData.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.RemoteDependencyData.envelopeType, telemetryItem, data);\n        };\n        DependencyEnvelopeCreator.DependencyEnvelopeCreator = new DependencyEnvelopeCreator();\n        return DependencyEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.DependencyEnvelopeCreator = DependencyEnvelopeCreator;\n    var EventEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(EventEnvelopeCreator, _super);\n        function EventEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            if (telemetryItem.baseType !== applicationinsights_common_1.Event.dataType) {\n                EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.baseData, customProperties, customMeasurements);\n            }\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var eventName = telemetryItem.baseData.name;\n            var baseData = new applicationinsights_common_1.Event(logger, eventName, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Event.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Event.envelopeType, telemetryItem, data);\n        };\n        EventEnvelopeCreator.EventEnvelopeCreator = new EventEnvelopeCreator();\n        return EventEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.EventEnvelopeCreator = EventEnvelopeCreator;\n    var ExceptionEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(ExceptionEnvelopeCreator, _super);\n        function ExceptionEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ExceptionEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var exception = telemetryItem.baseData.error;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var baseData = new applicationinsights_common_1.Exception(logger, exception, customProperties, customMeasurements, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Exception.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Exception.envelopeType, telemetryItem, data);\n        };\n        ExceptionEnvelopeCreator.ExceptionEnvelopeCreator = new ExceptionEnvelopeCreator();\n        return ExceptionEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.ExceptionEnvelopeCreator = ExceptionEnvelopeCreator;\n    var MetricEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(MetricEnvelopeCreator, _super);\n        function MetricEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        MetricEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var name = telemetryItem.baseData.name;\n            var average = telemetryItem.baseData.average;\n            var sampleCount = telemetryItem.baseData.sampleCount;\n            var min = telemetryItem.baseData.min;\n            var max = telemetryItem.baseData.max;\n            var baseData = new applicationinsights_common_1.Metric(logger, name, average, sampleCount, min, max, customProperties);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Metric.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Metric.envelopeType, telemetryItem, data);\n        };\n        MetricEnvelopeCreator.MetricEnvelopeCreator = new MetricEnvelopeCreator();\n        return MetricEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.MetricEnvelopeCreator = MetricEnvelopeCreator;\n    var PageViewEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewEnvelopeCreator, _super);\n        function PageViewEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            // Since duration is not part of the domain properties in Common Schema, extract it from part C \n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data.duration)) {\n                duration = telemetryItem.data.duration;\n                delete telemetryItem.data.duration;\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            // Todo: move IPageViewTelemetry to common as we are missing type checks on baseData here\n            // refUri is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.refUri)) {\n                customProperties[\"refUri\"] = telemetryItem.baseData.refUri;\n            }\n            // pageType is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageType)) {\n                customProperties[\"pageType\"] = telemetryItem.baseData.pageType;\n            }\n            // isLoggedIn is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.isLoggedIn)) {\n                customProperties[\"isLoggedIn\"] = telemetryItem.baseData.isLoggedIn;\n            }\n            // pageTags is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageTags)) {\n                var pageTags = telemetryItem.baseData.pageTags;\n                for (var key in pageTags) {\n                    if (pageTags.hasOwnProperty(key)) {\n                        customProperties[key] = pageTags[key];\n                    }\n                }\n            }\n            var baseData = new applicationinsights_common_1.PageView(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageView.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageView.envelopeType, telemetryItem, data);\n        };\n        PageViewEnvelopeCreator.PageViewEnvelopeCreator = new PageViewEnvelopeCreator();\n        return PageViewEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewEnvelopeCreator = PageViewEnvelopeCreator;\n    var PageViewPerformanceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewPerformanceEnvelopeCreator, _super);\n        function PageViewPerformanceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewPerformanceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            var duration = telemetryItem.baseData.duration;\n            var baseData = new applicationinsights_common_1.PageViewPerformance(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageViewPerformance.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageViewPerformance.envelopeType, telemetryItem, data);\n        };\n        PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator = new PageViewPerformanceEnvelopeCreator();\n        return PageViewPerformanceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewPerformanceEnvelopeCreator = PageViewPerformanceEnvelopeCreator;\n    var TraceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(TraceEnvelopeCreator, _super);\n        function TraceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        TraceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var message = telemetryItem.baseData.message;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var baseData = new applicationinsights_common_1.Trace(logger, message, customProperties, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Trace.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Trace.envelopeType, telemetryItem, data);\n        };\n        TraceEnvelopeCreator.TraceEnvelopeCreator = new TraceEnvelopeCreator();\n        return TraceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.TraceEnvelopeCreator = TraceEnvelopeCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EnvelopeCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Offline.js ***!\n  \\***********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * @description Monitors browser for offline events\n     * @export default - Offline: Static instance of OfflineListener\n     * @class OfflineListener\n     */\n    var OfflineListener = /** @class */ (function () {\n        function OfflineListener() {\n            this._onlineStatus = true;\n            if (window && window.addEventListener) {\n                window.addEventListener('online', this._setOnline.bind(this), false);\n                window.addEventListener('offline', this._setOffline.bind(this), false);\n                this.isListening = true;\n            }\n            else if (document && document.body) {\n                document.body.ononline = this._setOnline.bind(this);\n                document.body.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else if (document) {\n                document.ononline = this._setOnline.bind(this);\n                document.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else {\n                // Could not find a place to add event listener\n                this.isListening = false;\n            }\n        }\n        OfflineListener.prototype._setOnline = function () {\n            this._onlineStatus = true;\n        };\n        OfflineListener.prototype._setOffline = function () {\n            this._onlineStatus = false;\n        };\n        OfflineListener.prototype.isOnline = function () {\n            if (this.isListening) {\n                return this._onlineStatus;\n            }\n            else if (navigator) {\n                return navigator.onLine;\n            }\n            else {\n                // Cannot determine online status - report as online\n                return true;\n            }\n        };\n        OfflineListener.prototype.isOffline = function () {\n            return !this.isOnline();\n        };\n        OfflineListener.Offline = new OfflineListener;\n        return OfflineListener;\n    }());\n    exports.OfflineListener = OfflineListener;\n    exports.Offline = OfflineListener.Offline;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Offline.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /*\n     * An array based send buffer.\n     */\n    var ArraySendBuffer = /** @class */ (function () {\n        function ArraySendBuffer(config) {\n            this._config = config;\n            this._buffer = [];\n        }\n        ArraySendBuffer.prototype.enqueue = function (payload) {\n            this._buffer.push(payload);\n        };\n        ArraySendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        ArraySendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n        };\n        ArraySendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        ArraySendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        ArraySendBuffer.prototype.markAsSent = function (payload) {\n            this.clear();\n        };\n        ArraySendBuffer.prototype.clearSent = function (payload) {\n            // not supported\n        };\n        return ArraySendBuffer;\n    }());\n    exports.ArraySendBuffer = ArraySendBuffer;\n    /*\n     * Session storege buffer holds a copy of all unsent items in the browser session storage.\n     */\n    var SessionStorageSendBuffer = /** @class */ (function () {\n        function SessionStorageSendBuffer(logger, config) {\n            this._bufferFullMessageSent = false;\n            this._logger = logger;\n            this._config = config;\n            var bufferItems = this.getBuffer(SessionStorageSendBuffer.BUFFER_KEY);\n            var notDeliveredItems = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            this._buffer = bufferItems.concat(notDeliveredItems);\n            // If the buffer has too many items, drop items from the end.\n            if (this._buffer.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                this._buffer.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n            }\n            // update DataLossAnalyzer with the number of recovered items\n            // Uncomment if you want to use DataLossanalyzer\n            // DataLossAnalyzer.itemsRestoredFromSessionBuffer = this._buffer.length;\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        }\n        SessionStorageSendBuffer.prototype.enqueue = function (payload) {\n            if (this._buffer.length >= SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                // sent internal log only once per page view\n                if (!this._bufferFullMessageSent) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Maximum buffer size reached: \" + this._buffer.length, true);\n                    this._bufferFullMessageSent = true;\n                }\n                return;\n            }\n            this._buffer.push(payload);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        };\n        SessionStorageSendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        SessionStorageSendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this._bufferFullMessageSent = false;\n        };\n        SessionStorageSendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        SessionStorageSendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        SessionStorageSendBuffer.prototype.markAsSent = function (payload) {\n            this._buffer = this.removePayloadsFromBuffer(payload, this._buffer);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            if (sentElements instanceof Array && payload instanceof Array) {\n                sentElements = sentElements.concat(payload);\n                if (sentElements.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                    // We send telemetry normally. If the SENT_BUFFER is too big we don't add new elements\n                    // until we receive a response from the backend and the buffer has free space again (see clearSent method)\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Sent buffer reached its maximum size: \" + sentElements.length, true);\n                    sentElements.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n                }\n                this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n            }\n        };\n        SessionStorageSendBuffer.prototype.clearSent = function (payload) {\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            sentElements = this.removePayloadsFromBuffer(payload, sentElements);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n        };\n        SessionStorageSendBuffer.prototype.removePayloadsFromBuffer = function (payloads, buffer) {\n            var remaining = [];\n            for (var i in buffer) {\n                var contains = false;\n                for (var j in payloads) {\n                    if (payloads[j] === buffer[i]) {\n                        contains = true;\n                        break;\n                    }\n                }\n                if (!contains) {\n                    remaining.push(buffer[i]);\n                }\n            }\n            ;\n            return remaining;\n        };\n        SessionStorageSendBuffer.prototype.getBuffer = function (key) {\n            try {\n                var bufferJson = applicationinsights_common_1.Util.getSessionStorage(this._logger, key);\n                if (bufferJson) {\n                    var buffer = JSON.parse(bufferJson);\n                    if (buffer) {\n                        return buffer;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToRestoreStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            return [];\n        };\n        SessionStorageSendBuffer.prototype.setBuffer = function (key, buffer) {\n            try {\n                var bufferJson = JSON.stringify(buffer);\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, bufferJson);\n            }\n            catch (e) {\n                // if there was an error, clear the buffer\n                // telemetry is stored in the _buffer array so we won't loose any items\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, JSON.stringify([]));\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedToSetStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e) + \". Buffer cleared\", { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n        SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n        // Maximum number of payloads stored in the buffer. If the buffer is full, new elements will be dropped. \n        SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n        return SessionStorageSendBuffer;\n    }());\n    exports.SessionStorageSendBuffer = SessionStorageSendBuffer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SendBuffer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Sender.js ***!\n  \\**********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./SendBuffer */ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\"), __webpack_require__(/*! ./EnvelopeCreator */ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\"), __webpack_require__(/*! ./TelemetryValidation/EventValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/TraceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/ExceptionValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/MetricValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewPerformanceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/RemoteDepdencyValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\"), __webpack_require__(/*! ./Serializer */ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Offline */ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SendBuffer_1, EnvelopeCreator_1, EventValidator_1, TraceValidator_1, ExceptionValidator_1, MetricValidator_1, PageViewPerformanceValidator_1, PageViewValidator_1, RemoteDepdencyValidator_1, Serializer_1, applicationinsights_common_1, applicationinsights_core_js_1, applicationinsights_core_js_2, Offline_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sender = /** @class */ (function () {\n        function Sender() {\n            this.priority = 201;\n            /**\n             * Whether XMLHttpRequest object is supported. Older version of IE (8,9) do not support it.\n             */\n            this._XMLHttpRequestSupported = false;\n        }\n        Sender.prototype.pause = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.resume = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.flush = function () {\n            try {\n                this.triggerSend();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FlushFailed, \"flush failed, telemetry will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        Sender.prototype.teardown = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.initialize = function (config, core, extensions) {\n            this.identifier = \"AppInsightsChannelPlugin\";\n            this._logger = core.logger;\n            this._serializer = new Serializer_1.Serializer(core.logger);\n            this._consecutiveErrors = 0;\n            this._retryAt = null;\n            this._lastSend = 0;\n            this._config = Sender._getDefaultAppInsightsChannelConfig(config, this.identifier);\n            this._sender = null;\n            this._buffer = (applicationinsights_common_1.Util.canUseSessionStorage() && this._config.enableSessionStorageBuffer)\n                ? new SendBuffer_1.SessionStorageSendBuffer(this._logger, this._config) : new SendBuffer_1.ArraySendBuffer(this._config);\n            if (!this._config.isBeaconApiDisabled() && applicationinsights_common_1.Util.IsBeaconApiSupported()) {\n                this._sender = this._beaconSender;\n            }\n            else {\n                if (typeof XMLHttpRequest != \"undefined\") {\n                    var testXhr = new XMLHttpRequest();\n                    if (\"withCredentials\" in testXhr) {\n                        this._sender = this._xhrSender;\n                        this._XMLHttpRequestSupported = true;\n                    }\n                    else if (typeof XDomainRequest !== \"undefined\") {\n                        this._sender = this._xdrSender; //IE 8 and 9\n                    }\n                }\n            }\n        };\n        Sender.prototype.processTelemetry = function (telemetryItem) {\n            try {\n                // if master off switch is set, don't send any data\n                if (this._config.disableTelemetry()) {\n                    // Do not send/save data\n                    return;\n                }\n                // validate input\n                if (!telemetryItem) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSendEmptyTelemetry, \"Cannot send empty telemetry\");\n                    return;\n                }\n                // ensure a sender was constructed\n                if (!this._sender) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SenderNotInitialized, \"Sender was not initialized\");\n                    return;\n                }\n                // first we need to validate that the envelope passed down is valid\n                var isValid = Sender._validate(telemetryItem);\n                if (!isValid) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"Invalid telemetry envelope\");\n                    return;\n                }\n                // construct an envelope that Application Insights endpoint can understand\n                var aiEnvelope = this._constructEnvelope(telemetryItem);\n                if (!aiEnvelope) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CreateEnvelopeError, \"Unable to create an AppInsights envelope\");\n                    return;\n                }\n                // check if the incoming payload is too large, truncate if necessary\n                var payload = this._serializer.serialize(aiEnvelope);\n                // flush if we would exceed the max-size limit by adding this item\n                var bufferPayload = this._buffer.getItems();\n                var batch = this._buffer.batchPayloads(bufferPayload);\n                if (batch && (batch.length + payload.length > this._config.maxBatchSizeInBytes())) {\n                    this.triggerSend();\n                }\n                // enqueue the payload\n                this._buffer.enqueue(payload);\n                // ensure an invocation timeout is set\n                this._setupTimer();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedAddingTelemetryToBuffer, \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            // hand off the telemetry item to the next plugin\n            if (!applicationinsights_core_js_2.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(telemetryItem);\n            }\n        };\n        Sender.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * xhr state changes\n         */\n        Sender.prototype._xhrReadyStateChange = function (xhr, payload, countOfItemsInPayload) {\n            if (xhr.readyState === 4) {\n                var response = null;\n                if (!this._appId) {\n                    response = this._parseResponse(xhr.responseText || xhr.response);\n                    if (response && response.appId) {\n                        this._appId = response.appId;\n                    }\n                }\n                if ((xhr.status < 200 || xhr.status >= 300) && xhr.status !== 0) {\n                    if (!this._config.isRetryDisabled() && this._isRetriable(xhr.status)) {\n                        this._resendPayload(payload);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                            \"Response code \" + xhr.status + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                    else {\n                        this._onError(payload, this._formatErrorMessageXhr(xhr));\n                    }\n                }\n                else if (xhr.status === 0 || Offline_1.Offline.isOffline()) {\n                    if (!this._config.isRetryDisabled()) {\n                        var offlineBackOffMultiplier = 10; // arbritrary number\n                        this._resendPayload(payload, offlineBackOffMultiplier);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". Offline - Response Code: \" + xhr.status + \". Offline status: \" + Offline_1.Offline.isOffline() + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                }\n                else {\n                    if (xhr.status === 206) {\n                        if (!response) {\n                            response = this._parseResponse(xhr.responseText || xhr.response);\n                        }\n                        if (response && !this._config.isRetryDisabled()) {\n                            this._onPartialSuccess(payload, response);\n                        }\n                        else {\n                            this._onError(payload, this._formatErrorMessageXhr(xhr));\n                        }\n                    }\n                    else {\n                        this._consecutiveErrors = 0;\n                        this._onSuccess(payload, countOfItemsInPayload);\n                    }\n                }\n            }\n        };\n        /**\n         * Immediately send buffered data\n         * @param async {boolean} - Indicates if the events should be sent asynchronously\n         */\n        Sender.prototype.triggerSend = function (async) {\n            if (async === void 0) { async = true; }\n            try {\n                // Send data only if disableTelemetry is false\n                if (!this._config.disableTelemetry()) {\n                    if (this._buffer.count() > 0) {\n                        var payload = this._buffer.getItems();\n                        // invoke send\n                        this._sender(payload, async);\n                    }\n                    // update lastSend time to enable throttling\n                    this._lastSend = +new Date;\n                }\n                else {\n                    this._buffer.clear();\n                }\n                clearTimeout(this._timeoutHandle);\n                this._timeoutHandle = null;\n                this._retryAt = null;\n            }\n            catch (e) {\n                /* Ignore this error for IE under v10 */\n                if (!applicationinsights_common_1.Util.getIEVersion() || applicationinsights_common_1.Util.getIEVersion() > 9) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Telemetry transmission failed, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }\n        };\n        /**\n         * error handler\n         */\n        Sender.prototype._onError = function (payload, message, event) {\n            this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.OnError, \"Failed to send telemetry.\", { message: message });\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * partial success handler\n         */\n        Sender.prototype._onPartialSuccess = function (payload, results) {\n            var failed = [];\n            var retry = [];\n            // Iterate through the reversed array of errors so that splicing doesn't have invalid indexes after the first item.\n            var errors = results.errors.reverse();\n            for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                var error = errors_1[_i];\n                var extracted = payload.splice(error.index, 1)[0];\n                if (this._isRetriable(error.statusCode)) {\n                    retry.push(extracted);\n                }\n                else {\n                    // All other errors, including: 402 (Monthly quota exceeded) and 439 (Too many requests and refresh cache).\n                    failed.push(extracted);\n                }\n            }\n            if (payload.length > 0) {\n                this._onSuccess(payload, results.itemsAccepted);\n            }\n            if (failed.length > 0) {\n                this._onError(failed, this._formatErrorMessageXhr(null, ['partial success', results.itemsAccepted, 'of', results.itemsReceived].join(' ')));\n            }\n            if (retry.length > 0) {\n                this._resendPayload(retry);\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Partial success. \" +\n                    \"Delivered: \" + payload.length + \", Failed: \" + failed.length +\n                    \". Will retry to send \" + retry.length + \" our of \" + results.itemsReceived + \" items\");\n            }\n        };\n        /**\n         * success handler\n         */\n        Sender.prototype._onSuccess = function (payload, countOfItemsInPayload) {\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * xdr state changes\n         */\n        Sender.prototype._xdrOnLoad = function (xdr, payload) {\n            if (xdr && (xdr.responseText + \"\" === \"200\" || xdr.responseText === \"\")) {\n                this._consecutiveErrors = 0;\n                this._onSuccess(payload, 0);\n            }\n            else {\n                var results = this._parseResponse(xdr.responseText);\n                if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                    && !this._config.isRetryDisabled()) {\n                    this._onPartialSuccess(payload, results);\n                }\n                else {\n                    this._onError(payload, this._formatErrorMessageXdr(xdr));\n                }\n            }\n        };\n        Sender.prototype._constructEnvelope = function (envelope) {\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return EnvelopeCreator_1.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return EnvelopeCreator_1.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return EnvelopeCreator_1.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return EnvelopeCreator_1.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return EnvelopeCreator_1.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return EnvelopeCreator_1.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(this._logger, envelope);\n                default:\n                    // default create custom event type\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n            }\n        };\n        Sender._getDefaultAppInsightsChannelConfig = function (config, identifier) {\n            var resultConfig = {};\n            var pluginConfig = config.extensionConfig && config.extensionConfig[identifier] ? config.extensionConfig[identifier] : {};\n            // set default values\n            resultConfig.endpointUrl = function () { return config.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\"; };\n            resultConfig.emitLineDelimitedJson = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.emitLineDelimitedJson); };\n            resultConfig.maxBatchInterval = function () { return !isNaN(pluginConfig.maxBatchInterval) ? pluginConfig.maxBatchInterval : 15000; };\n            resultConfig.maxBatchSizeInBytes = function () { return pluginConfig.maxBatchSizeInBytes > 0 ? pluginConfig.maxBatchSizeInBytes : 102400; }; // 100kb\n            resultConfig.disableTelemetry = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.disableTelemetry); };\n            resultConfig.enableSessionStorageBuffer = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.enableSessionStorageBuffer, true); };\n            resultConfig.isRetryDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isRetryDisabled); };\n            resultConfig.isBeaconApiDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isBeaconApiDisabled, true); };\n            return resultConfig;\n        };\n        Sender._validate = function (envelope) {\n            // call the appropriate Validate depending on the baseType\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return TraceValidator_1.TraceValidator.TraceValidator.Validate(envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return ExceptionValidator_1.ExceptionValidator.ExceptionValidator.Validate(envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return MetricValidator_1.MetricValidator.MetricValidator.Validate(envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return PageViewValidator_1.PageViewValidator.PageViewValidator.Validate(envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return PageViewPerformanceValidator_1.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return RemoteDepdencyValidator_1.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(envelope);\n                default:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n            }\n        };\n        /**\n         * Send Beacon API request\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - not used\n         * Note: Beacon API does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._beaconSender = function (payload, isAsync) {\n            var url = this._config.endpointUrl();\n            var batch = this._buffer.batchPayloads(payload);\n            // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n            // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n            var plainTextBatch = new Blob([batch], { type: 'text/plain;charset=UTF-8' });\n            // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n            var queued = navigator.sendBeacon(url, plainTextBatch);\n            if (queued) {\n                this._buffer.markAsSent(payload);\n            }\n            else {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API.\");\n            }\n        };\n        /**\n         * Send XMLHttpRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         */\n        Sender.prototype._xhrSender = function (payload, isAsync) {\n            var _this = this;\n            var xhr = new XMLHttpRequest();\n            xhr[applicationinsights_common_1.DisabledPropertyName] = true;\n            xhr.open(\"POST\", this._config.endpointUrl(), isAsync);\n            xhr.setRequestHeader(\"Content-type\", \"application/json\");\n            // append Sdk-Context request header only in case of breeze endpoint \n            if (applicationinsights_common_1.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.sdkContextHeader, applicationinsights_common_1.RequestHeaders.sdkContextHeaderAppIdRequest);\n            }\n            xhr.onreadystatechange = function () { return _this._xhrReadyStateChange(xhr, payload, payload.length); };\n            xhr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXhr(xhr), event); };\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xhr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        /**\n         * Parses the response from the backend.\n         * @param response - XMLHttpRequest or XDomainRequest response\n         */\n        Sender.prototype._parseResponse = function (response) {\n            try {\n                if (response && response !== \"\") {\n                    var result = JSON.parse(response);\n                    if (result && result.itemsReceived && result.itemsReceived >= result.itemsAccepted &&\n                        result.itemsReceived - result.itemsAccepted == result.errors.length) {\n                        return result;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.InvalidBackendResponse, \"Cannot parse the response. \" + applicationinsights_common_1.Util.getExceptionName(e), {\n                    response: response\n                });\n            }\n            return null;\n        };\n        /**\n         * Resend payload. Adds payload back to the send buffer and setup a send timer (with exponential backoff).\n         * @param payload\n         */\n        Sender.prototype._resendPayload = function (payload, linearFactor) {\n            if (linearFactor === void 0) { linearFactor = 1; }\n            if (!payload || payload.length === 0) {\n                return;\n            }\n            this._buffer.clearSent(payload);\n            this._consecutiveErrors++;\n            for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                var item = payload_1[_i];\n                this._buffer.enqueue(item);\n            }\n            // setup timer\n            this._setRetryTime(linearFactor);\n            this._setupTimer();\n        };\n        /** Calculates the time to wait before retrying in case of an error based on\n         * http://en.wikipedia.org/wiki/Exponential_backoff\n         */\n        Sender.prototype._setRetryTime = function (linearFactor) {\n            var SlotDelayInSeconds = 10;\n            var delayInSeconds;\n            if (this._consecutiveErrors <= 1) {\n                delayInSeconds = SlotDelayInSeconds;\n            }\n            else {\n                var backOffSlot = (Math.pow(2, this._consecutiveErrors) - 1) / 2;\n                // tslint:disable-next-line:insecure-random\n                var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                backOffDelay = linearFactor * backOffDelay;\n                delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n            }\n            // TODO: Log the backoff time like the C# version does.\n            var retryAfterTimeSpan = Date.now() + (delayInSeconds * 1000);\n            // TODO: Log the retry at time like the C# version does.\n            this._retryAt = retryAfterTimeSpan;\n        };\n        /**\n         * Sets up the timer which triggers actually sending the data.\n         */\n        Sender.prototype._setupTimer = function () {\n            var _this = this;\n            if (!this._timeoutHandle) {\n                var retryInterval = this._retryAt ? Math.max(0, this._retryAt - Date.now()) : 0;\n                var timerValue = Math.max(this._config.maxBatchInterval(), retryInterval);\n                this._timeoutHandle = setTimeout(function () {\n                    _this.triggerSend();\n                }, timerValue);\n            }\n        };\n        /**\n         * Checks if the SDK should resend the payload after receiving this status code from the backend.\n         * @param statusCode\n         */\n        Sender.prototype._isRetriable = function (statusCode) {\n            return statusCode == 408 // Timeout\n                || statusCode == 429 // Too many requests.\n                || statusCode == 500 // Internal server error.\n                || statusCode == 503; // Service unavailable.\n        };\n        Sender.prototype._formatErrorMessageXhr = function (xhr, message) {\n            if (xhr) {\n                return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + xhr.responseText || xhr.response || \"\";\n            }\n            return message;\n        };\n        /**\n         * Send XDomainRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         *\n         * Note: XDomainRequest does not support sync requests. This 'isAsync' parameter is added\n         * to maintain consistency with the xhrSender's contract\n         * Note: XDomainRequest does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._xdrSender = function (payload, isAsync) {\n            var _this = this;\n            var xdr = new XDomainRequest();\n            xdr.onload = function () { return _this._xdrOnLoad(xdr, payload); };\n            xdr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXdr(xdr), event); };\n            // XDomainRequest requires the same protocol as the hosting page. \n            // If the protocol doesn't match, we can't send the telemetry :(. \n            var hostingProtocol = window.location.protocol;\n            if (this._config.endpointUrl().lastIndexOf(hostingProtocol, 0) !== 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                    \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                this._buffer.clear();\n                return;\n            }\n            var endpointUrl = this._config.endpointUrl().replace(/^(https?:)/, \"\");\n            xdr.open('POST', endpointUrl);\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xdr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        Sender.prototype._formatErrorMessageXdr = function (xdr, message) {\n            if (xdr) {\n                return \"XDomainRequest,Response:\" + xdr.responseText || \"\";\n            }\n            return message;\n        };\n        return Sender;\n    }());\n    exports.Sender = Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sender.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Serializer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Serializer = /** @class */ (function () {\n        function Serializer(logger) {\n            this._logger = logger;\n        }\n        /**\n         * Serializes the current object to a JSON string.\n         */\n        Serializer.prototype.serialize = function (input) {\n            var output = this._serializeObject(input, \"root\");\n            return JSON.stringify(output);\n        };\n        Serializer.prototype._serializeObject = function (source, name) {\n            var circularReferenceCheck = \"__aiCircularRefCheck\";\n            var output = {};\n            if (!source) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                return output;\n            }\n            if (source[circularReferenceCheck]) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CircularReferenceDetected, \"Circular reference detected while serializing object\", { name: name }, true);\n                return output;\n            }\n            if (!source.aiDataContract) {\n                // special case for measurements/properties/tags\n                if (name === \"measurements\") {\n                    output = this._serializeStringMap(source, \"number\", name);\n                }\n                else if (name === \"properties\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (name === \"tags\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (applicationinsights_common_1.Util.isArray(source)) {\n                    output = this._serializeArray(source, name);\n                }\n                else {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObjectNonSerializable, \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                    try {\n                        // verify that the object can be stringified\n                        JSON.stringify(source);\n                        output = source;\n                    }\n                    catch (e) {\n                        // if serialization fails return an empty string\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, (e && typeof e.toString === 'function') ? e.toString() : \"Error serializing object\", null, true);\n                    }\n                }\n                return output;\n            }\n            source[circularReferenceCheck] = true;\n            for (var field in source.aiDataContract) {\n                var contract = source.aiDataContract[field];\n                var isRequired = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Required) : (contract & applicationinsights_common_1.FieldType.Required);\n                var isHidden = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Hidden) : (contract & applicationinsights_common_1.FieldType.Hidden);\n                var isArray = contract & applicationinsights_common_1.FieldType.Array;\n                var isPresent = source[field] !== undefined;\n                var isObject = typeof source[field] === \"object\" && source[field] !== null;\n                if (isRequired && !isPresent && !isArray) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MissingRequiredFieldSpecification, \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    // If not in debug mode, continue and hope the error is permissible\n                    continue;\n                }\n                if (isHidden) {\n                    // Don't serialize hidden fields\n                    continue;\n                }\n                var value;\n                if (isObject) {\n                    if (isArray) {\n                        // special case; resurse on each object in the source array\n                        value = this._serializeArray(source[field], field);\n                    }\n                    else {\n                        // recurse on the source object in this field\n                        value = this._serializeObject(source[field], field);\n                    }\n                }\n                else {\n                    // assign the source field to the output even if undefined or required\n                    value = source[field];\n                }\n                // only emit this field if the value is defined\n                if (value !== undefined) {\n                    output[field] = value;\n                }\n            }\n            delete source[circularReferenceCheck];\n            return output;\n        };\n        Serializer.prototype._serializeArray = function (sources, name) {\n            var output = undefined;\n            if (!!sources) {\n                if (!applicationinsights_common_1.Util.isArray(sources)) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ItemNotInArray, \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                }\n                else {\n                    output = [];\n                    for (var i = 0; i < sources.length; i++) {\n                        var source = sources[i];\n                        var item = this._serializeObject(source, name + \"[\" + i + \"]\");\n                        output.push(item);\n                    }\n                }\n            }\n            return output;\n        };\n        Serializer.prototype._serializeStringMap = function (map, expectedType, name) {\n            var output = undefined;\n            if (map) {\n                output = {};\n                for (var field in map) {\n                    var value = map[field];\n                    if (expectedType === \"string\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else if (!value.toString) {\n                            output[field] = \"invalid field: toString() is not defined.\";\n                        }\n                        else {\n                            output[field] = value.toString();\n                        }\n                    }\n                    else if (expectedType === \"number\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else {\n                            var num = parseFloat(value);\n                            if (isNaN(num)) {\n                                output[field] = \"NaN\";\n                            }\n                            else {\n                                output[field] = num;\n                            }\n                        }\n                    }\n                    else {\n                        output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, output[field], null, true);\n                    }\n                }\n            }\n            return output;\n        };\n        return Serializer;\n    }());\n    exports.Serializer = Serializer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Serializer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var EventValidator = /** @class */ (function () {\n        function EventValidator() {\n        }\n        EventValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n            https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties || !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties || !item.domainProperties[\"name\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        EventValidator.EventValidator = new EventValidator();\n        return EventValidator;\n    }());\n    exports.EventValidator = EventValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var ExceptionValidator = /** @class */ (function () {\n        function ExceptionValidator() {\n        }\n        ExceptionValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"exceptions\"] ||\n                !ExceptionValidator._validateExceptions(item.domainProperties[\"exceptions\"])) {\n                return false;\n            }\n            */\n            return true;\n        };\n        // TODO implement validation of exceptions\n        ExceptionValidator._validateExceptions = function (exceptions) {\n            // typeName\n            // message\n            // parsedStack\n            // stack\n            // hasFullStack\n            return true;\n        };\n        ExceptionValidator.ExceptionValidator = new ExceptionValidator();\n        return ExceptionValidator;\n    }());\n    exports.ExceptionValidator = ExceptionValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var MetricValidator = /** @class */ (function () {\n        function MetricValidator() {\n        }\n        MetricValidator.prototype.Validate = function (event) {\n            return true;\n        };\n        MetricValidator.MetricValidator = new MetricValidator();\n        return MetricValidator;\n    }());\n    exports.MetricValidator = MetricValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\":\n/*!****************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js ***!\n  \\****************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformanceValidator = /** @class */ (function () {\n        function PageViewPerformanceValidator() {\n        }\n        PageViewPerformanceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n            \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"domProcessing\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"networkConnect\"] ||\n                !item.domainProperties[\"perfTotal\"] ||\n                !item.domainProperties[\"receivedResponse\"] ||\n                !item.domainProperties[\"sentRequest\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewPerformanceValidator.PageViewPerformanceValidator = new PageViewPerformanceValidator();\n        return PageViewPerformanceValidator;\n    }());\n    exports.PageViewPerformanceValidator = PageViewPerformanceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformanceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewValidator = /** @class */ (function () {\n        function PageViewValidator() {\n        }\n        PageViewValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewValidator.PageViewValidator = new PageViewValidator();\n        return PageViewValidator;\n    }());\n    exports.PageViewValidator = PageViewValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDepdencyValidator = /** @class */ (function () {\n        function RemoteDepdencyValidator() {\n        }\n        RemoteDepdencyValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"resultCode\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"success\"] ||\n                !item.domainProperties[\"data\"] ||\n                !item.domainProperties[\"target\"] ||\n                !item.domainProperties[\"type\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        RemoteDepdencyValidator.RemoteDepdencyValidator = new RemoteDepdencyValidator();\n        return RemoteDepdencyValidator;\n    }());\n    exports.RemoteDepdencyValidator = RemoteDepdencyValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDepdencyValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TraceValidator = /** @class */ (function () {\n        function TraceValidator() {\n        }\n        TraceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties ||\n                !item.domainProperties[\"message\"] ||\n                !item.domainProperties[\"severityLevel\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        TraceValidator.TraceValidator = new TraceValidator();\n        return TraceValidator;\n    }());\n    exports.TraceValidator = TraceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TraceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Sender */ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Sender_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Sender = Sender_1.Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-channel-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Constants.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Constants.js ***!\n  \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Constants.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Enums.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Enums.js ***!\n  \\*****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Type of storage to differentiate between local storage and session storage\n    */\n    var StorageType;\n    (function (StorageType) {\n        StorageType[StorageType[\"LocalStorage\"] = 0] = \"LocalStorage\";\n        StorageType[StorageType[\"SessionStorage\"] = 1] = \"SessionStorage\";\n    })(StorageType = exports.StorageType || (exports.StorageType = {}));\n    /**\n     * Enum is used in aiDataContract to describe how fields are serialized.\n     * For instance: (Fieldtype.Required | FieldType.Array) will mark the field as required and indicate it's an array\n     */\n    var FieldType;\n    (function (FieldType) {\n        FieldType[FieldType[\"Default\"] = 0] = \"Default\";\n        FieldType[FieldType[\"Required\"] = 1] = \"Required\";\n        FieldType[FieldType[\"Array\"] = 2] = \"Array\";\n        FieldType[FieldType[\"Hidden\"] = 4] = \"Hidden\";\n    })(FieldType = exports.FieldType || (exports.FieldType = {}));\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Enums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n         * Data struct to contain only C section with custom fields.\n         */\n    var Base = /** @class */ (function () {\n        function Base() {\n        }\n        return Base;\n    }());\n    exports.Base = Base;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Base.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    var ContextTagKeys = /** @class */ (function () {\n        function ContextTagKeys() {\n            this.applicationVersion = \"ai.application.ver\";\n            this.applicationBuild = \"ai.application.build\";\n            this.applicationTypeId = \"ai.application.typeId\";\n            this.applicationId = \"ai.application.applicationId\";\n            this.applicationLayer = \"ai.application.layer\";\n            this.deviceId = \"ai.device.id\";\n            this.deviceIp = \"ai.device.ip\";\n            this.deviceLanguage = \"ai.device.language\";\n            this.deviceLocale = \"ai.device.locale\";\n            this.deviceModel = \"ai.device.model\";\n            this.deviceFriendlyName = \"ai.device.friendlyName\";\n            this.deviceNetwork = \"ai.device.network\";\n            this.deviceNetworkName = \"ai.device.networkName\";\n            this.deviceOEMName = \"ai.device.oemName\";\n            this.deviceOS = \"ai.device.os\";\n            this.deviceOSVersion = \"ai.device.osVersion\";\n            this.deviceRoleInstance = \"ai.device.roleInstance\";\n            this.deviceRoleName = \"ai.device.roleName\";\n            this.deviceScreenResolution = \"ai.device.screenResolution\";\n            this.deviceType = \"ai.device.type\";\n            this.deviceMachineName = \"ai.device.machineName\";\n            this.deviceVMName = \"ai.device.vmName\";\n            this.deviceBrowser = \"ai.device.browser\";\n            this.deviceBrowserVersion = \"ai.device.browserVersion\";\n            this.locationIp = \"ai.location.ip\";\n            this.locationCountry = \"ai.location.country\";\n            this.locationProvince = \"ai.location.province\";\n            this.locationCity = \"ai.location.city\";\n            this.operationId = \"ai.operation.id\";\n            this.operationName = \"ai.operation.name\";\n            this.operationParentId = \"ai.operation.parentId\";\n            this.operationRootId = \"ai.operation.rootId\";\n            this.operationSyntheticSource = \"ai.operation.syntheticSource\";\n            this.operationCorrelationVector = \"ai.operation.correlationVector\";\n            this.sessionId = \"ai.session.id\";\n            this.sessionIsFirst = \"ai.session.isFirst\";\n            this.sessionIsNew = \"ai.session.isNew\";\n            this.userAccountAcquisitionDate = \"ai.user.accountAcquisitionDate\";\n            this.userAccountId = \"ai.user.accountId\";\n            this.userAgent = \"ai.user.userAgent\";\n            this.userId = \"ai.user.id\";\n            this.userStoreRegion = \"ai.user.storeRegion\";\n            this.userAuthUserId = \"ai.user.authUserId\";\n            this.userAnonymousUserAcquisitionDate = \"ai.user.anonUserAcquisitionDate\";\n            this.userAuthenticatedUserAcquisitionDate = \"ai.user.authUserAcquisitionDate\";\n            this.cloudName = \"ai.cloud.name\";\n            this.cloudRole = \"ai.cloud.role\";\n            this.cloudRoleVer = \"ai.cloud.roleVer\";\n            this.cloudRoleInstance = \"ai.cloud.roleInstance\";\n            this.cloudEnvironment = \"ai.cloud.environment\";\n            this.cloudLocation = \"ai.cloud.location\";\n            this.cloudDeploymentUnit = \"ai.cloud.deploymentUnit\";\n            this.internalSdkVersion = \"ai.internal.sdkVersion\";\n            this.internalAgentVersion = \"ai.internal.agentVersion\";\n            this.internalNodeName = \"ai.internal.nodeName\";\n        }\n        return ContextTagKeys;\n    }());\n    exports.ContextTagKeys = ContextTagKeys;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ContextTagKeys.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Base_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Data struct to contain both B and C sections.\n     */\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        function Data() {\n            return _super.call(this) || this;\n        }\n        return Data;\n    }(Base_1.Base));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./DataPointType */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPointType_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Metric data single measurement.\n     */\n    var DataPoint = /** @class */ (function () {\n        function DataPoint() {\n            this.kind = DataPointType_1.DataPointType.Measurement;\n        }\n        return DataPoint;\n    }());\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Type of the metric data measurement.\n     */\n    var DataPointType;\n    (function (DataPointType) {\n        DataPointType[DataPointType[\"Measurement\"] = 0] = \"Measurement\";\n        DataPointType[DataPointType[\"Aggregation\"] = 1] = \"Aggregation\";\n    })(DataPointType = exports.DataPointType || (exports.DataPointType = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPointType.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\":\n/*!*************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js ***!\n  \\*************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The abstract common base of all domains.\n     */\n    var Domain = /** @class */ (function () {\n        function Domain() {\n        }\n        return Domain;\n    }());\n    exports.Domain = Domain;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Domain.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * System variables for a telemetry item.\n     */\n    var Envelope = /** @class */ (function () {\n        function Envelope() {\n            this.ver = 1;\n            this.sampleRate = 100.0;\n            this.tags = {};\n        }\n        return Envelope;\n    }());\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Event represent structured event records that can be grouped and searched by their properties. Event data item also creates a metric of event count by name.\n     */\n    var EventData = /** @class */ (function (_super) {\n        __extends(EventData, _super);\n        function EventData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return EventData;\n    }(Domain_1.Domain));\n    exports.EventData = EventData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Exception represents a handled or unhandled exception that occurred during execution of the monitored application.\n     */\n    var ExceptionData = /** @class */ (function (_super) {\n        __extends(ExceptionData, _super);\n        function ExceptionData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.exceptions = [];\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return ExceptionData;\n    }(Domain_1.Domain));\n    exports.ExceptionData = ExceptionData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Exception details of the exception in a chain.\n     */\n    var ExceptionDetails = /** @class */ (function () {\n        function ExceptionDetails() {\n            this.hasFullStack = true;\n            this.parsedStack = [];\n        }\n        return ExceptionDetails;\n    }());\n    exports.ExceptionDetails = ExceptionDetails;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionDetails.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Message represent printf-like trace statements that are text-searched. Log4Net, NLog and other text-based log file entries are translated into intances of this type. The message does not have measurements.\n     */\n    var MessageData = /** @class */ (function (_super) {\n        __extends(MessageData, _super);\n        function MessageData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            return _this;\n        }\n        return MessageData;\n    }(Domain_1.Domain));\n    exports.MessageData = MessageData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MessageData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of the Metric item is a list of measurements (single data points) and/or aggregations.\n     */\n    var MetricData = /** @class */ (function (_super) {\n        __extends(MetricData, _super);\n        function MetricData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.metrics = [];\n            _this.properties = {};\n            return _this;\n        }\n        return MetricData;\n    }(Domain_1.Domain));\n    exports.MetricData = MetricData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\":\n/*!*******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js ***!\n  \\*******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageView represents a generic action on a page like a button click. It is also the base type for PageView.\n     */\n    var PageViewData = /** @class */ (function (_super) {\n        __extends(PageViewData, _super);\n        function PageViewData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewData;\n    }(EventData_1.EventData));\n    exports.PageViewData = PageViewData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageViewPerf represents: a page view with no performance data, a page view with performance data, or just the performance data of an earlier page request.\n     */\n    var PageViewPerfData = /** @class */ (function (_super) {\n        __extends(PageViewPerfData, _super);\n        function PageViewPerfData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewPerfData;\n    }(PageViewData_1.PageViewData));\n    exports.PageViewPerfData = PageViewPerfData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerfData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\":\n/*!***************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js ***!\n  \\***************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Remote Dependency represents an interaction of the monitored component with a remote component/service like SQL or an HTTP endpoint.\n     */\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        function RemoteDependencyData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.success = true;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return RemoteDependencyData;\n    }(Domain_1.Domain));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Defines the level of severity for the event.\n    */\n    var SeverityLevel;\n    (function (SeverityLevel) {\n        SeverityLevel[SeverityLevel[\"Verbose\"] = 0] = \"Verbose\";\n        SeverityLevel[SeverityLevel[\"Information\"] = 1] = \"Information\";\n        SeverityLevel[SeverityLevel[\"Warning\"] = 2] = \"Warning\";\n        SeverityLevel[SeverityLevel[\"Error\"] = 3] = \"Error\";\n        SeverityLevel[SeverityLevel[\"Critical\"] = 4] = \"Critical\";\n    })(SeverityLevel = exports.SeverityLevel || (exports.SeverityLevel = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SeverityLevel.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Stack frame information.\n     */\n    var StackFrame = /** @class */ (function () {\n        function StackFrame() {\n        }\n        return StackFrame;\n    }());\n    exports.StackFrame = StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=StackFrame.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RequestHeaders = /** @class */ (function () {\n        function RequestHeaders() {\n        }\n        /**\n         * Request-Context header\n         */\n        RequestHeaders.requestContextHeader = \"Request-Context\";\n        /**\n         * Target instrumentation header that is added to the response and retrieved by the\n         * calling application when processing incoming responses.\n         */\n        RequestHeaders.requestContextTargetKey = \"appId\";\n        /**\n         * Request-Context appId format\n         */\n        RequestHeaders.requestContextAppIdFormat = \"appId=cid-v1:\";\n        /**\n         * Request-Id header\n         */\n        RequestHeaders.requestIdHeader = \"Request-Id\";\n        /**\n         * Sdk-Context header\n         * If this header passed with appId in content then appId will be returned back by the backend.\n         */\n        RequestHeaders.sdkContextHeader = \"Sdk-Context\";\n        /**\n         * String to pass in header for requesting appId back from the backend.\n         */\n        RequestHeaders.sdkContextHeaderAppIdRequest = \"appId\";\n        RequestHeaders.requestContextHeaderLowerCase = \"request-context\";\n        return RequestHeaders;\n    }());\n    exports.RequestHeaders = RequestHeaders;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RequestResponseHeaders.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Data_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Data(baseType, data) {\n            var _this = _super.call(this) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                baseType: Enums_1.FieldType.Required,\n                baseData: Enums_1.FieldType.Required\n            };\n            _this.baseType = baseType;\n            _this.baseData = data;\n            return _this;\n        }\n        return Data;\n    }(Data_1.Data));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPoint_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataPoint = /** @class */ (function (_super) {\n        __extends(DataPoint, _super);\n        function DataPoint() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                name: Enums_1.FieldType.Required,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Required,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default\n            };\n            return _this;\n        }\n        return DataPoint;\n    }(DataPoint_1.DataPoint));\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataSanitizer = /** @class */ (function () {\n        function DataSanitizer() {\n        }\n        DataSanitizer.sanitizeKeyAndAddUniqueness = function (logger, key, map) {\n            var origLength = key.length;\n            var field = DataSanitizer.sanitizeKey(logger, key);\n            // validation truncated the length.  We need to add uniqueness\n            if (field.length !== origLength) {\n                var i = 0;\n                var uniqueField = field;\n                while (map[uniqueField] !== undefined) {\n                    i++;\n                    uniqueField = field.substring(0, DataSanitizer.MAX_NAME_LENGTH - 3) + DataSanitizer.padNumber(i);\n                }\n                field = uniqueField;\n            }\n            return field;\n        };\n        DataSanitizer.sanitizeKey = function (logger, name) {\n            if (name) {\n                // Remove any leading or trailing whitepace\n                name = Util_1.Util.trim(name.toString());\n                // truncate the string to 150 chars\n                if (name.length > DataSanitizer.MAX_NAME_LENGTH) {\n                    name = name.substring(0, DataSanitizer.MAX_NAME_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NameTooLong, \"name is too long.  It has been truncated to \" + DataSanitizer.MAX_NAME_LENGTH + \" characters.\", { name: name }, true);\n                }\n            }\n            return name;\n        };\n        DataSanitizer.sanitizeString = function (logger, value, maxLength) {\n            if (maxLength === void 0) { maxLength = DataSanitizer.MAX_STRING_LENGTH; }\n            if (value) {\n                maxLength = maxLength ? maxLength : DataSanitizer.MAX_STRING_LENGTH; // in case default parameters dont work\n                value = Util_1.Util.trim(value);\n                if (value.toString().length > maxLength) {\n                    value = value.toString().substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StringValueTooLong, \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n                }\n            }\n            return value;\n        };\n        DataSanitizer.sanitizeUrl = function (logger, url) {\n            return DataSanitizer.sanitizeInput(logger, url, DataSanitizer.MAX_URL_LENGTH, applicationinsights_core_js_1._InternalMessageId.UrlTooLong);\n        };\n        DataSanitizer.sanitizeMessage = function (logger, message) {\n            if (message) {\n                if (message.length > DataSanitizer.MAX_MESSAGE_LENGTH) {\n                    message = message.substring(0, DataSanitizer.MAX_MESSAGE_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.MessageTruncated, \"message is too long, it has been truncated to \" + DataSanitizer.MAX_MESSAGE_LENGTH + \" characters.\", { message: message }, true);\n                }\n            }\n            return message;\n        };\n        DataSanitizer.sanitizeException = function (logger, exception) {\n            if (exception) {\n                if (exception.length > DataSanitizer.MAX_EXCEPTION_LENGTH) {\n                    exception = exception.substring(0, DataSanitizer.MAX_EXCEPTION_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ExceptionTruncated, \"exception is too long, it has been truncated to \" + DataSanitizer.MAX_EXCEPTION_LENGTH + \" characters.\", { exception: exception }, true);\n                }\n            }\n            return exception;\n        };\n        DataSanitizer.sanitizeProperties = function (logger, properties) {\n            if (properties) {\n                var tempProps = {};\n                for (var prop in properties) {\n                    var value = DataSanitizer.sanitizeString(logger, properties[prop], DataSanitizer.MAX_PROPERTY_LENGTH);\n                    prop = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, prop, tempProps);\n                    tempProps[prop] = value;\n                }\n                properties = tempProps;\n            }\n            return properties;\n        };\n        DataSanitizer.sanitizeMeasurements = function (logger, measurements) {\n            if (measurements) {\n                var tempMeasurements = {};\n                for (var measure in measurements) {\n                    var value = measurements[measure];\n                    measure = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements);\n                    tempMeasurements[measure] = value;\n                }\n                measurements = tempMeasurements;\n            }\n            return measurements;\n        };\n        DataSanitizer.sanitizeId = function (logger, id) {\n            return id ? DataSanitizer.sanitizeInput(logger, id, DataSanitizer.MAX_ID_LENGTH, applicationinsights_core_js_1._InternalMessageId.IdTooLong).toString() : id;\n        };\n        DataSanitizer.sanitizeInput = function (logger, input, maxLength, _msgId) {\n            if (input) {\n                input = Util_1.Util.trim(input);\n                if (input.length > maxLength) {\n                    input = input.substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n                }\n            }\n            return input;\n        };\n        DataSanitizer.padNumber = function (num) {\n            var s = \"00\" + num;\n            return s.substr(s.length - 3);\n        };\n        /**\n        * Max length allowed for custom names.\n        */\n        DataSanitizer.MAX_NAME_LENGTH = 150;\n        /**\n         * Max length allowed for Id field in page views.\n         */\n        DataSanitizer.MAX_ID_LENGTH = 128;\n        /**\n         * Max length allowed for custom values.\n         */\n        DataSanitizer.MAX_PROPERTY_LENGTH = 8192;\n        /**\n         * Max length allowed for names\n         */\n        DataSanitizer.MAX_STRING_LENGTH = 1024;\n        /**\n         * Max length allowed for url.\n         */\n        DataSanitizer.MAX_URL_LENGTH = 2048;\n        /**\n         * Max length allowed for messages.\n         */\n        DataSanitizer.MAX_MESSAGE_LENGTH = 32768;\n        /**\n         * Max length allowed for exceptions.\n         */\n        DataSanitizer.MAX_EXCEPTION_LENGTH = 32768;\n        return DataSanitizer;\n    }());\n    exports.DataSanitizer = DataSanitizer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataSanitizer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\":\n/*!*************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js ***!\n  \\*************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Envelope */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\"), __webpack_require__(/*! ./DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Envelope_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Envelope = /** @class */ (function (_super) {\n        __extends(Envelope, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Envelope(logger, data, name) {\n            var _this = _super.call(this) || this;\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.data = data;\n            _this.time = Util_1.Util.toISOStringForIE8(new Date());\n            _this.aiDataContract = {\n                time: Enums_1.FieldType.Required,\n                iKey: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                sampleRate: function () {\n                    return (_this.sampleRate == 100) ? Enums_1.FieldType.Hidden : Enums_1.FieldType.Required;\n                },\n                tags: Enums_1.FieldType.Required,\n                data: Enums_1.FieldType.Required\n            };\n            return _this;\n        }\n        return Envelope;\n    }(Envelope_1.Envelope));\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Event.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Event = /** @class */ (function (_super) {\n        __extends(Event, _super);\n        /**\n         * Constructs a new instance of the EventTelemetry object\n         */\n        function Event(logger, name, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n        Event.dataType = \"EventData\";\n        return Event;\n    }(EventData_1.EventData));\n    exports.Event = Event;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Event.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/StackFrame */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionDetails */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, StackFrame_1, ExceptionData_1, ExceptionDetails_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Exception = /** @class */ (function (_super) {\n        __extends(Exception, _super);\n        /**\n        * Constructs a new isntance of the ExceptionTelemetry object\n        */\n        function Exception(logger, exception, properties, measurements, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                exceptions: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            _this.exceptions = [new _ExceptionDetails(logger, exception)];\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        /**\n        * Creates a simple exception with 1 stack frame. Useful for manual constracting of exception.\n        */\n        Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n            return {\n                exceptions: [\n                    {\n                        hasFullStack: true,\n                        message: message,\n                        stack: details,\n                        typeName: typeName\n                    }\n                ]\n            };\n        };\n        Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n        Exception.dataType = \"ExceptionData\";\n        return Exception;\n    }(ExceptionData_1.ExceptionData));\n    exports.Exception = Exception;\n    var _ExceptionDetails = /** @class */ (function (_super) {\n        __extends(_ExceptionDetails, _super);\n        function _ExceptionDetails(logger, exception) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Default,\n                outerId: Enums_1.FieldType.Default,\n                typeName: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                hasFullStack: Enums_1.FieldType.Default,\n                stack: Enums_1.FieldType.Default,\n                parsedStack: Enums_1.FieldType.Array\n            };\n            _this.typeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, exception.name) || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, exception.message) || Util_1.Util.NotSpecified;\n            var stack = exception[\"stack\"];\n            _this.parsedStack = _this.parseStack(stack);\n            _this.stack = DataSanitizer_1.DataSanitizer.sanitizeException(logger, stack);\n            _this.hasFullStack = Util_1.Util.isArray(_this.parsedStack) && _this.parsedStack.length > 0;\n            return _this;\n        }\n        _ExceptionDetails.prototype.parseStack = function (stack) {\n            var parsedStack = undefined;\n            if (typeof stack === \"string\") {\n                var frames = stack.split('\\n');\n                parsedStack = [];\n                var level = 0;\n                var totalSizeInBytes = 0;\n                for (var i = 0; i <= frames.length; i++) {\n                    var frame = frames[i];\n                    if (_StackFrame.regex.test(frame)) {\n                        var parsedFrame = new _StackFrame(frames[i], level++);\n                        totalSizeInBytes += parsedFrame.sizeInBytes;\n                        parsedStack.push(parsedFrame);\n                    }\n                }\n                // DP Constraint - exception parsed stack must be < 32KB\n                // remove frames from the middle to meet the threshold\n                var exceptionParsedStackThreshold = 32 * 1024;\n                if (totalSizeInBytes > exceptionParsedStackThreshold) {\n                    var left = 0;\n                    var right = parsedStack.length - 1;\n                    var size = 0;\n                    var acceptedLeft = left;\n                    var acceptedRight = right;\n                    while (left < right) {\n                        // check size\n                        var lSize = parsedStack[left].sizeInBytes;\n                        var rSize = parsedStack[right].sizeInBytes;\n                        size += lSize + rSize;\n                        if (size > exceptionParsedStackThreshold) {\n                            // remove extra frames from the middle\n                            var howMany = acceptedRight - acceptedLeft + 1;\n                            parsedStack.splice(acceptedLeft, howMany);\n                            break;\n                        }\n                        // update pointers\n                        acceptedLeft = left;\n                        acceptedRight = right;\n                        left++;\n                        right--;\n                    }\n                }\n            }\n            return parsedStack;\n        };\n        return _ExceptionDetails;\n    }(ExceptionDetails_1.ExceptionDetails));\n    var _StackFrame = /** @class */ (function (_super) {\n        __extends(_StackFrame, _super);\n        function _StackFrame(frame, level) {\n            var _this = _super.call(this) || this;\n            _this.sizeInBytes = 0;\n            _this.aiDataContract = {\n                level: Enums_1.FieldType.Required,\n                method: Enums_1.FieldType.Required,\n                assembly: Enums_1.FieldType.Default,\n                fileName: Enums_1.FieldType.Default,\n                line: Enums_1.FieldType.Default\n            };\n            _this.level = level;\n            _this.method = \"<no_method>\";\n            _this.assembly = Util_1.Util.trim(frame);\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches.length >= 5) {\n                _this.method = Util_1.Util.trim(matches[2]) || _this.method;\n                _this.fileName = Util_1.Util.trim(matches[4]);\n                _this.line = parseInt(matches[5]) || 0;\n            }\n            _this.sizeInBytes += _this.method.length;\n            _this.sizeInBytes += _this.fileName.length;\n            _this.sizeInBytes += _this.assembly.length;\n            // todo: these might need to be removed depending on how the back-end settles on their size calculation\n            _this.sizeInBytes += _StackFrame.baseSize;\n            _this.sizeInBytes += _this.level.toString().length;\n            _this.sizeInBytes += _this.line.toString().length;\n            return _this;\n        }\n        // regex to match stack frames from ie/chrome/ff\n        // methodName=$2, fileName=$4, lineNo=$5, column=$6\n        _StackFrame.regex = /^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n        _StackFrame.baseSize = 58; //'{\"method\":\"\",\"level\":,\"assembly\":\"\",\"fileName\":\"\",\"line\":}'.length\n        return _StackFrame;\n    }(StackFrame_1.StackFrame));\n    exports._StackFrame = _StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Exception.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js ***!\n  \\****************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MetricData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MetricData_1, DataSanitizer_1, Enums_1, DataPoint_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Metric = /** @class */ (function (_super) {\n        __extends(Metric, _super);\n        /**\n         * Constructs a new instance of the MetricTelemetry object\n         */\n        function Metric(logger, name, value, count, min, max, properties) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                metrics: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default\n            };\n            var dataPoint = new DataPoint_1.DataPoint();\n            dataPoint.count = count > 0 ? count : undefined;\n            dataPoint.max = isNaN(max) || max === null ? undefined : max;\n            dataPoint.min = isNaN(min) || min === null ? undefined : min;\n            dataPoint.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            dataPoint.value = value;\n            _this.metrics = [dataPoint];\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            return _this;\n        }\n        Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n        Metric.dataType = \"MetricData\";\n        return Metric;\n    }(MetricData_1.MetricData));\n    exports.Metric = Metric;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Metric.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageView = /** @class */ (function (_super) {\n        __extends(PageView, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageView(logger, name, url, durationMs, properties, measurements, id) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                id: Enums_1.FieldType.Default,\n            };\n            _this.id = DataSanitizer_1.DataSanitizer.sanitizeId(logger, id);\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            if (!isNaN(durationMs)) {\n                _this.duration = Util_1.Util.msToTimeSpan(durationMs);\n            }\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n        PageView.dataType = \"PageviewData\";\n        return PageView;\n    }(PageViewData_1.PageViewData));\n    exports.PageView = PageView;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageView.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewPerfData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewPerfData_1, Enums_1, DataSanitizer_1, Util_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformance = /** @class */ (function (_super) {\n        __extends(PageViewPerformance, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageViewPerformance(logger, name, url, unused, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                perfTotal: Enums_1.FieldType.Default,\n                networkConnect: Enums_1.FieldType.Default,\n                sentRequest: Enums_1.FieldType.Default,\n                receivedResponse: Enums_1.FieldType.Default,\n                domProcessing: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.isValid = false;\n            /*\n             * http://www.w3.org/TR/navigation-timing/#processing-model\n             *  |-navigationStart\n             *  |             |-connectEnd\n             *  |             ||-requestStart\n             *  |             ||             |-responseStart\n             *  |             ||             |              |-responseEnd\n             *  |             ||             |              |\n             *  |             ||             |              |         |-loadEventEnd\n             *  |---network---||---request---|---response---|---dom---|\n             *  |--------------------------total----------------------|\n             */\n            var timing = PageViewPerformance.getPerformanceTiming();\n            if (timing) {\n                var total = PageViewPerformance.getDuration(timing.navigationStart, timing.loadEventEnd);\n                var network = PageViewPerformance.getDuration(timing.navigationStart, timing.connectEnd);\n                var request = PageViewPerformance.getDuration(timing.requestStart, timing.responseStart);\n                var response = PageViewPerformance.getDuration(timing.responseStart, timing.responseEnd);\n                var dom = PageViewPerformance.getDuration(timing.responseEnd, timing.loadEventEnd);\n                if (total == 0) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ErrorPVCalc, \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (!PageViewPerformance.shouldCollectDuration(total, network, request, response, dom)) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.InvalidDurationValue, \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                    // some browsers may report individual components incorrectly so that the sum of the parts will be bigger than total PLT\n                    // in this case, don't report client performance from this page\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ClientPerformanceMathError, \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else {\n                    _this.durationMs = total;\n                    // convert to timespans\n                    _this.perfTotal = _this.duration = Util_1.Util.msToTimeSpan(total);\n                    _this.networkConnect = Util_1.Util.msToTimeSpan(network);\n                    _this.sentRequest = Util_1.Util.msToTimeSpan(request);\n                    _this.receivedResponse = Util_1.Util.msToTimeSpan(response);\n                    _this.domProcessing = Util_1.Util.msToTimeSpan(dom);\n                    _this.isValid = true;\n                }\n            }\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        /**\n         * Indicates whether this instance of PageViewPerformance is valid and should be sent\n         */\n        PageViewPerformance.prototype.getIsValid = function () {\n            return this.isValid;\n        };\n        /**\n        * Gets the total duration (PLT) in milliseconds. Check getIsValid() before using this method.\n        */\n        PageViewPerformance.prototype.getDurationMs = function () {\n            return this.durationMs;\n        };\n        PageViewPerformance.getPerformanceTiming = function () {\n            if (PageViewPerformance.isPerformanceTimingSupported()) {\n                return window.performance.timing;\n            }\n            return null;\n        };\n        /**\n        * Returns true is window performance timing API is supported, false otherwise.\n        */\n        PageViewPerformance.isPerformanceTimingSupported = function () {\n            return typeof window != \"undefined\" && window.performance && window.performance.timing;\n        };\n        /**\n         * As page loads different parts of performance timing numbers get set. When all of them are set we can report it.\n         * Returns true if ready, false otherwise.\n         */\n        PageViewPerformance.isPerformanceTimingDataReady = function () {\n            var timing = window.performance.timing;\n            return timing.domainLookupStart > 0\n                && timing.navigationStart > 0\n                && timing.responseStart > 0\n                && timing.requestStart > 0\n                && timing.loadEventEnd > 0\n                && timing.responseEnd > 0\n                && timing.connectEnd > 0\n                && timing.domLoading > 0;\n        };\n        PageViewPerformance.getDuration = function (start, end) {\n            var duration = undefined;\n            if (!(isNaN(start) || isNaN(end))) {\n                duration = Math.max(end - start, 0);\n            }\n            return duration;\n        };\n        /**\n         * This method tells if given durations should be excluded from collection.\n         */\n        PageViewPerformance.shouldCollectDuration = function () {\n            var durations = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                durations[_i] = arguments[_i];\n            }\n            // a full list of Google crawlers user agent strings - https://support.google.com/webmasters/answer/1061943?hl=en\n            var botAgentNames = ['googlebot', 'adsbot-google', 'apis-google', 'mediapartners-google'];\n            var userAgent = navigator.userAgent;\n            var isGoogleBot = false;\n            if (userAgent) {\n                for (var i_1 = 0; i_1 < botAgentNames.length; i_1++) {\n                    isGoogleBot = isGoogleBot || userAgent.toLowerCase().indexOf(botAgentNames[i_1]) !== -1;\n                }\n            }\n            if (isGoogleBot) {\n                // Don't report durations for GoogleBot, it is returning invalid values in performance.timing API. \n                return false;\n            }\n            else {\n                // for other page views, don't report if it's outside of a reasonable range\n                for (var i = 0; i < durations.length; i++) {\n                    if (durations[i] >= PageViewPerformance.MAX_DURATION_ALLOWED) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        };\n        PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n        PageViewPerformance.dataType = \"PageviewPerformanceData\";\n        PageViewPerformance.MAX_DURATION_ALLOWED = 3600000; // 1h\n        return PageViewPerformance;\n    }(PageViewPerfData_1.PageViewPerfData));\n    exports.PageViewPerformance = PageViewPerformance;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformance.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataSanitizer_1, Enums_1, Util_1, Util_2, RemoteDependencyData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        /**\n         * Constructs a new instance of the RemoteDependencyData object\n         */\n        function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Required,\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                resultCode: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                success: Enums_1.FieldType.Default,\n                data: Enums_1.FieldType.Default,\n                target: Enums_1.FieldType.Default,\n                type: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Default,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default,\n                dependencyKind: Enums_1.FieldType.Default,\n                dependencySource: Enums_1.FieldType.Default,\n                commandName: Enums_1.FieldType.Default,\n                dependencyTypeName: Enums_1.FieldType.Default,\n            };\n            _this.id = id;\n            _this.duration = Util_1.Util.msToTimeSpan(value);\n            _this.success = success;\n            _this.resultCode = resultCode + \"\";\n            _this.type = \"Ajax\";\n            _this.data = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, commandName);\n            var dependencyFields = Util_2.AjaxHelper.ParseDependencyPath(logger, absoluteUrl, method, commandName);\n            _this.target = dependencyFields.target;\n            _this.name = dependencyFields.name;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n        RemoteDependencyData.dataType = \"RemoteDependencyData\";\n        return RemoteDependencyData;\n    }(RemoteDependencyData_1.RemoteDependencyData));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MessageData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MessageData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Trace = /** @class */ (function (_super) {\n        __extends(Trace, _super);\n        /**\n         * Constructs a new instance of the TraceTelemetry object\n         */\n        function Trace(logger, message, properties, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default\n            };\n            message = message || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, message);\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n        Trace.dataType = \"MessageData\";\n        return Trace;\n    }(MessageData_1.MessageData));\n    exports.Trace = Trace;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Trace.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\":\n/*!********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js ***!\n  \\********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, DataSanitizer_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TelemetryItemCreator = /** @class */ (function () {\n        function TelemetryItemCreator() {\n        }\n        /**\n         * Create a telemetry item that the 1DS channel understands\n         * @param item domain specific properties; part B\n         * @param baseType telemetry item type. ie PageViewData\n         * @param envelopeName name of the envelope. ie Microsoft.ApplicationInsights.<instrumentation key>.PageView\n         * @param customProperties user defined custom properties; part C\n         * @param systemProperties system properties that are added to the context; part A\n         * @returns ITelemetryItem that is sent to channel\n         */\n        TelemetryItemCreator.create = function (item, baseType, envelopeName, logger, customProperties, systemProperties) {\n            envelopeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, envelopeName) || Util_1.Util.NotSpecified;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(item) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(baseType) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(envelopeName)) {\n                throw Error(\"Input doesn't contain all required fields\");\n            }\n            var telemetryItem = {\n                name: envelopeName,\n                timestamp: new Date(),\n                instrumentationKey: \"\",\n                ctx: systemProperties ? systemProperties : {},\n                tags: [],\n                data: {},\n                baseType: baseType,\n                baseData: item\n            };\n            // Part C\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties)) {\n                for (var prop in customProperties) {\n                    if (customProperties.hasOwnProperty(prop)) {\n                        telemetryItem.data[prop] = customProperties[prop];\n                    }\n                }\n            }\n            return telemetryItem;\n        };\n        return TelemetryItemCreator;\n    }());\n    exports.TelemetryItemCreator = TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TelemetryItemCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Util.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Util.js ***!\n  \\****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Enums_1, applicationinsights_core_js_1, RequestResponseHeaders_1, DataSanitizer_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Util = /** @class */ (function () {\n        function Util() {\n        }\n        /*\n         * Force the SDK not to use local and session storage\n        */\n        Util.disableStorage = function () {\n            Util._canUseLocalStorage = false;\n            Util._canUseSessionStorage = false;\n        };\n        /**\n         * Gets the localStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getLocalStorageObject = function () {\n            if (Util.canUseLocalStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return null;\n        };\n        /**\n         * Tests storage object (localStorage or sessionStorage) to verify that it is usable\n         * More details here: https://mathiasbynens.be/notes/localstorage-pattern\n         * @param storageType Type of storage\n         * @return {Storage} Returns storage object verified that it is usable\n         */\n        Util._getVerifiedStorageObject = function (storageType) {\n            var storage = null;\n            var fail;\n            var uid;\n            try {\n                uid = new Date;\n                storage = storageType === Enums_1.StorageType.LocalStorage ? window.localStorage : window.sessionStorage;\n                storage.setItem(uid, uid);\n                fail = storage.getItem(uid) != uid;\n                storage.removeItem(uid);\n                if (fail) {\n                    storage = null;\n                }\n            }\n            catch (exception) {\n                storage = null;\n            }\n            return storage;\n        };\n        /**\n         *  Checks if endpoint URL is application insights internal injestion service URL.\n         *\n         *  @param endpointUrl Endpoint URL to check.\n         *  @returns {boolean} True if if endpoint URL is application insights internal injestion service URL.\n         */\n        Util.isInternalApplicationInsightsEndpoint = function (endpointUrl) {\n            return Util._internalEndpoints.indexOf(endpointUrl.toLowerCase()) !== -1;\n        };\n        /**\n         *  Check if the browser supports local storage.\n         *\n         *  @returns {boolean} True if local storage is supported.\n         */\n        Util.canUseLocalStorage = function () {\n            if (Util._canUseLocalStorage === undefined) {\n                Util._canUseLocalStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return Util._canUseLocalStorage;\n        };\n        /**\n         *  Get an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadLocalStorage, \"Browser failed read of local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's local storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setStorage = function (logger, name, data) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteLocalStorage, \"Browser failed write to local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromLocalStorage, \"Browser failed removal of local storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         * Gets the sessionStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getSessionStorageObject = function () {\n            if (Util.canUseSessionStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return null;\n        };\n        /**\n         *  Check if the browser supports session storage.\n         *\n         *  @returns {boolean} True if session storage is supported.\n         */\n        Util.canUseSessionStorage = function () {\n            if (Util._canUseSessionStorage === undefined) {\n                Util._canUseSessionStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return Util._canUseSessionStorage;\n        };\n        /**\n         *  Gets the list of session storage keys\n         *\n         *  @returns {string[]} List of session storage keys\n         */\n        Util.getSessionStorageKeys = function () {\n            var keys = [];\n            if (Util.canUseSessionStorage()) {\n                for (var key in window.sessionStorage) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n        /**\n         *  Get an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadSessionStorage, \"Browser failed read of session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's session storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setSessionStorage = function (logger, name, data) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteSessionStorage, \"Browser failed write to session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromSessionStorage, \"Browser failed removal of session storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /*\n         * Force the SDK not to store and read any data from cookies\n         */\n        Util.disableCookies = function () {\n            Util._canUseCookies = false;\n        };\n        /*\n         * helper method to tell if document.cookie object is available\n         */\n        Util.canUseCookies = function (logger) {\n            if (Util._canUseCookies === undefined) {\n                Util._canUseCookies = false;\n                try {\n                    Util._canUseCookies = Util.document.cookie !== undefined;\n                }\n                catch (e) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotAccessCookie, \"Cannot access document.cookie - \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n                ;\n            }\n            return Util._canUseCookies;\n        };\n        /**\n         * helper method to set userId and sessionId cookie\n         */\n        Util.setCookie = function (logger, name, value, domain) {\n            var domainAttrib = \"\";\n            var secureAttrib = \"\";\n            if (domain) {\n                domainAttrib = \";domain=\" + domain;\n            }\n            if (Util.document.location && Util.document.location.protocol === \"https:\") {\n                secureAttrib = \";secure\";\n            }\n            if (Util.canUseCookies(logger)) {\n                Util.document.cookie = name + \"=\" + value + domainAttrib + \";path=/\" + secureAttrib;\n            }\n        };\n        Util.stringToBoolOrDefault = function (str, defaultValue) {\n            if (defaultValue === void 0) { defaultValue = false; }\n            if (str === undefined || str === null) {\n                return defaultValue;\n            }\n            return str.toString().toLowerCase() === \"true\";\n        };\n        /**\n         * helper method to access userId and sessionId cookie\n         */\n        Util.getCookie = function (logger, name) {\n            if (!Util.canUseCookies(logger)) {\n                return;\n            }\n            var value = \"\";\n            if (name && name.length) {\n                var cookieName = name + \"=\";\n                var cookies = Util.document.cookie.split(\";\");\n                for (var i = 0; i < cookies.length; i++) {\n                    var cookie = cookies[i];\n                    cookie = Util.trim(cookie);\n                    if (cookie && cookie.indexOf(cookieName) === 0) {\n                        value = cookie.substring(cookieName.length, cookies[i].length);\n                        break;\n                    }\n                }\n            }\n            return value;\n        };\n        /**\n         * Deletes a cookie by setting it's expiration time in the past.\n         * @param name - The name of the cookie to delete.\n         */\n        Util.deleteCookie = function (logger, name) {\n            if (Util.canUseCookies(logger)) {\n                // Setting the expiration date in the past immediately removes the cookie\n                Util.document.cookie = name + \"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n            }\n        };\n        /**\n         * helper method to trim strings (IE8 does not implement String.prototype.trim)\n         */\n        Util.trim = function (str) {\n            if (typeof str !== \"string\")\n                return str;\n            return str.replace(/^\\s+|\\s+$/g, \"\");\n        };\n        /**\n         * generate random id string\n         */\n        Util.newId = function () {\n            var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            var result = \"\";\n            // tslint:disable-next-line:insecure-random\n            var random = Math.random() * 1073741824; //5 symbols in base64, almost maxint\n            while (random > 0) {\n                var char = base64chars.charAt(random % 64);\n                result += char;\n                random = Math.floor(random / 64);\n            }\n            return result;\n        };\n        /**\n         * Check if an object is of type Array\n         */\n        Util.isArray = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n        /**\n         * Check if an object is of type Error\n         */\n        Util.isError = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Error]\";\n        };\n        /**\n         * Check if an object is of type Date\n         */\n        Util.isDate = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Date]\";\n        };\n        /**\n         * Convert a date to I.S.O. format in IE8\n         */\n        Util.toISOStringForIE8 = function (date) {\n            if (Util.isDate(date)) {\n                if (Date.prototype.toISOString) {\n                    return date.toISOString();\n                }\n                else {\n                    var pad = function (num) {\n                        var r = String(num);\n                        if (r.length === 1) {\n                            r = \"0\" + r;\n                        }\n                        return r;\n                    };\n                    return date.getUTCFullYear()\n                        + \"-\" + pad(date.getUTCMonth() + 1)\n                        + \"-\" + pad(date.getUTCDate())\n                        + \"T\" + pad(date.getUTCHours())\n                        + \":\" + pad(date.getUTCMinutes())\n                        + \":\" + pad(date.getUTCSeconds())\n                        + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                        + \"Z\";\n                }\n            }\n        };\n        /**\n         * Gets IE version if we are running on IE, or null otherwise\n         */\n        Util.getIEVersion = function (userAgentStr) {\n            if (userAgentStr === void 0) { userAgentStr = null; }\n            var myNav = userAgentStr ? userAgentStr.toLowerCase() : navigator.userAgent.toLowerCase();\n            return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : null;\n        };\n        /**\n         * Convert ms to c# time span format\n         */\n        Util.msToTimeSpan = function (totalms) {\n            if (isNaN(totalms) || totalms < 0) {\n                totalms = 0;\n            }\n            totalms = Math.round(totalms);\n            var ms = \"\" + totalms % 1000;\n            var sec = \"\" + Math.floor(totalms / 1000) % 60;\n            var min = \"\" + Math.floor(totalms / (1000 * 60)) % 60;\n            var hour = \"\" + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n            var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n            ms = ms.length === 1 ? \"00\" + ms : ms.length === 2 ? \"0\" + ms : ms;\n            sec = sec.length < 2 ? \"0\" + sec : sec;\n            min = min.length < 2 ? \"0\" + min : min;\n            hour = hour.length < 2 ? \"0\" + hour : hour;\n            return (days > 0 ? days + \".\" : \"\") + hour + \":\" + min + \":\" + sec + \".\" + ms;\n        };\n        /**\n        * Checks if error has no meaningful data inside. Ususally such errors are received by window.onerror when error\n        * happens in a script from other domain (cross origin, CORS).\n        */\n        Util.isCrossOriginError = function (message, url, lineNumber, columnNumber, error) {\n            return (message === \"Script error.\" || message === \"Script error\") && !error;\n        };\n        /**\n        * Returns string representation of an object suitable for diagnostics logging.\n        */\n        Util.dump = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            var propertyValueDump = JSON.stringify(object);\n            if (objectTypeDump === \"[object Error]\") {\n                propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n            }\n            return objectTypeDump + propertyValueDump;\n        };\n        /**\n        * Returns the name of object if it's an Error. Otherwise, returns empty string.\n        */\n        Util.getExceptionName = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            if (objectTypeDump === \"[object Error]\") {\n                return object.name;\n            }\n            return \"\";\n        };\n        /**\n         * Adds an event handler for the specified event\n         * @param eventName {string} - The name of the event\n         * @param callback {any} - The callback function that needs to be executed for the given event\n         * @return {boolean} - true if the handler was successfully added\n         */\n        Util.addEventHandler = function (eventName, callback) {\n            if (!window || typeof eventName !== 'string' || typeof callback !== 'function') {\n                return false;\n            }\n            // Create verb for the event\n            var verbEventName = 'on' + eventName;\n            // check if addEventListener is available\n            if (window.addEventListener) {\n                window.addEventListener(eventName, callback, false);\n            }\n            else if (window[\"attachEvent\"]) {\n                window[\"attachEvent\"](verbEventName, callback);\n            }\n            else {\n                return false;\n            }\n            return true;\n        };\n        /**\n         * Tells if a browser supports a Beacon API\n         */\n        Util.IsBeaconApiSupported = function () {\n            return ('sendBeacon' in navigator && navigator.sendBeacon);\n        };\n        Util.document = typeof document !== \"undefined\" ? document : {};\n        Util._canUseCookies = undefined;\n        Util._canUseLocalStorage = undefined;\n        Util._canUseSessionStorage = undefined;\n        // listing only non-geo specific locations \n        Util._internalEndpoints = [\n            \"https://dc.services.visualstudio.com/v2/track\",\n            \"https://breeze.aimon.applicationinsights.io/v2/track\",\n            \"https://dc-int.services.visualstudio.com/v2/track\"\n        ];\n        Util.NotSpecified = \"not_specified\";\n        return Util;\n    }());\n    exports.Util = Util;\n    var UrlHelper = /** @class */ (function () {\n        function UrlHelper() {\n        }\n        UrlHelper.parseUrl = function (url) {\n            if (!UrlHelper.htmlAnchorElement) {\n                UrlHelper.htmlAnchorElement = !!UrlHelper.document.createElement ? UrlHelper.document.createElement('a') : {};\n            }\n            UrlHelper.htmlAnchorElement.href = url;\n            return UrlHelper.htmlAnchorElement;\n        };\n        UrlHelper.getAbsoluteUrl = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.href;\n            }\n            return result;\n        };\n        UrlHelper.getPathName = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.pathname;\n            }\n            return result;\n        };\n        UrlHelper.getCompleteUrl = function (method, absoluteUrl) {\n            if (method) {\n                return method.toUpperCase() + \" \" + absoluteUrl;\n            }\n            else {\n                return absoluteUrl;\n            }\n        };\n        UrlHelper.document = typeof document !== \"undefined\" ? document : {};\n        return UrlHelper;\n    }());\n    exports.UrlHelper = UrlHelper;\n    var CorrelationIdHelper = /** @class */ (function () {\n        function CorrelationIdHelper() {\n        }\n        /**\n        * Checks if a request url is not on a excluded domain list and if it is safe to add correlation headers\n        */\n        CorrelationIdHelper.canIncludeCorrelationHeader = function (config, requestUrl, currentHost) {\n            if (config && config.disableCorrelationHeaders) {\n                return false;\n            }\n            if (!requestUrl) {\n                return false;\n            }\n            var requestHost = UrlHelper.parseUrl(requestUrl).host.toLowerCase();\n            if ((!config || !config.enableCorsCorrelation) && requestHost !== currentHost) {\n                return false;\n            }\n            var excludedDomains = config && config.correlationHeaderExcludedDomains;\n            if (!excludedDomains || excludedDomains.length == 0) {\n                return true;\n            }\n            for (var i = 0; i < excludedDomains.length; i++) {\n                var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\./g, \"\\.\").replace(/\\*/g, \".*\"));\n                if (regex.test(requestHost)) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n        * Combines target appId and target role name from response header.\n        */\n        CorrelationIdHelper.getCorrelationContext = function (responseHeader) {\n            if (responseHeader) {\n                var correlationId = CorrelationIdHelper.getCorrelationContextValue(responseHeader, RequestResponseHeaders_1.RequestHeaders.requestContextTargetKey);\n                if (correlationId && correlationId !== CorrelationIdHelper.correlationIdPrefix) {\n                    return correlationId;\n                }\n            }\n        };\n        /**\n        * Gets key from correlation response header\n        */\n        CorrelationIdHelper.getCorrelationContextValue = function (responseHeader, key) {\n            if (responseHeader) {\n                var keyValues = responseHeader.split(\",\");\n                for (var i = 0; i < keyValues.length; ++i) {\n                    var keyValue = keyValues[i].split(\"=\");\n                    if (keyValue.length == 2 && keyValue[0] == key) {\n                        return keyValue[1];\n                    }\n                }\n            }\n        };\n        CorrelationIdHelper.correlationIdPrefix = \"cid-v1:\";\n        return CorrelationIdHelper;\n    }());\n    exports.CorrelationIdHelper = CorrelationIdHelper;\n    var AjaxHelper = /** @class */ (function () {\n        function AjaxHelper() {\n        }\n        AjaxHelper.ParseDependencyPath = function (logger, absoluteUrl, method, pathName) {\n            var target, name;\n            if (absoluteUrl && absoluteUrl.length > 0) {\n                var parsedUrl = UrlHelper.parseUrl(absoluteUrl);\n                target = parsedUrl.host;\n                if (parsedUrl.pathname != null) {\n                    var pathName = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                    if (pathName.charAt(0) !== '/') {\n                        pathName = \"/\" + pathName;\n                    }\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, method ? method + \" \" + pathName : pathName);\n                }\n                else {\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, absoluteUrl);\n                }\n            }\n            else {\n                target = pathName;\n                name = pathName;\n            }\n            return {\n                target: target,\n                name: name\n            };\n        };\n        return AjaxHelper;\n    }());\n    exports.AjaxHelper = AjaxHelper;\n    /**\n     * A utility class that helps getting time related parameters\n     */\n    var DateTimeUtils = /** @class */ (function () {\n        function DateTimeUtils() {\n        }\n        /**\n         * Get the number of milliseconds since 1970/01/01 in local timezone\n         */\n        DateTimeUtils.Now = (window.performance && window.performance.now && window.performance.timing) ?\n            function () {\n                return window.performance.now() + window.performance.timing.navigationStart;\n            }\n            :\n                function () {\n                    return new Date().getTime();\n                };\n        /**\n         * Gets duration between two timestamps\n         */\n        DateTimeUtils.GetDuration = function (start, end) {\n            var result = null;\n            if (start !== 0 && end !== 0 && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(start) && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(end)) {\n                result = end - start;\n            }\n            return result;\n        };\n        return DateTimeUtils;\n    }());\n    exports.DateTimeUtils = DateTimeUtils;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Util.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/applicationinsights-common.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Constants */ \"./node_modules/applicationinsights-common/bundle/Constants.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\"), __webpack_require__(/*! ./Telemetry/Common/Envelope */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\"), __webpack_require__(/*! ./Telemetry/Event */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\"), __webpack_require__(/*! ./Telemetry/Exception */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\"), __webpack_require__(/*! ./Telemetry/Metric */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\"), __webpack_require__(/*! ./Telemetry/PageView */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Telemetry/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\"), __webpack_require__(/*! ./Telemetry/Trace */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\"), __webpack_require__(/*! ./Telemetry/PageViewPerformance */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\"), __webpack_require__(/*! ./Telemetry/Common/Data */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/SeverityLevel */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/ContextTagKeys */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ./TelemetryItemCreator */ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, Enums_1, RequestResponseHeaders_1, Constants_1, Data_1, Base_1, Envelope_1, Event_1, Exception_1, Metric_1, PageView_1, PageViewData_1, RemoteDependencyData_1, Trace_1, PageViewPerformance_1, Data_2, SeverityLevel_1, ContextTagKeys_1, DataSanitizer_1, TelemetryItemCreator_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Util = Util_1.Util;\n    exports.CorrelationIdHelper = Util_1.CorrelationIdHelper;\n    exports.UrlHelper = Util_1.UrlHelper;\n    exports.DateTimeUtils = Util_1.DateTimeUtils;\n    exports.FieldType = Enums_1.FieldType;\n    exports.RequestHeaders = RequestResponseHeaders_1.RequestHeaders;\n    exports.DisabledPropertyName = Constants_1.DisabledPropertyName;\n    exports.AIData = Data_1.Data;\n    exports.AIBase = Base_1.Base;\n    exports.Envelope = Envelope_1.Envelope;\n    exports.Event = Event_1.Event;\n    exports.Exception = Exception_1.Exception;\n    exports.Metric = Metric_1.Metric;\n    exports.PageView = PageView_1.PageView;\n    exports.PageViewData = PageViewData_1.PageViewData;\n    exports.RemoteDependencyData = RemoteDependencyData_1.RemoteDependencyData;\n    exports.Trace = Trace_1.Trace;\n    exports.PageViewPerformance = PageViewPerformance_1.PageViewPerformance;\n    exports.Data = Data_2.Data;\n    exports.SeverityLevel = SeverityLevel_1.SeverityLevel;\n    exports.ContextTagKeys = ContextTagKeys_1.ContextTagKeys;\n    exports.DataSanitizer = DataSanitizer_1.DataSanitizer;\n    exports.TelemetryItemCreator = TelemetryItemCreator_1.TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-common.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n     */\n    exports.EventsDiscardedReason = {\n        /**\n         * Unknown.\n         */\n        Unknown: 0,\n        /**\n         * Status set to non-retryable.\n         */\n        NonRetryableStatus: 1,\n        /**\n         * The event is invalid.\n         */\n        InvalidEvent: 2,\n        /**\n         * The size of the event is too large.\n         */\n        SizeLimitExceeded: 3,\n        /**\n         * The server is not accepting events from this instrumentation key.\n         */\n        KillSwitch: 4,\n        /**\n         * The event queue is full.\n         */\n        QueueFull: 5,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventsDiscardedReason.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\":\n/*!*********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js ***!\n  \\*********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var LoggingSeverity;\n    (function (LoggingSeverity) {\n        /**\n         * Error will be sent as internal telemetry\n         */\n        LoggingSeverity[LoggingSeverity[\"CRITICAL\"] = 1] = \"CRITICAL\";\n        /**\n         * Error will NOT be sent as internal telemetry, and will only be shown in browser console\n         */\n        LoggingSeverity[LoggingSeverity[\"WARNING\"] = 2] = \"WARNING\";\n    })(LoggingSeverity = exports.LoggingSeverity || (exports.LoggingSeverity = {}));\n    /**\n     * Internal message ID. Please create a new one for every conceptually different message. Please keep alphabetically ordered\n     */ ;\n    exports._InternalMessageId = {\n        // Non user actionable\n        BrowserDoesNotSupportLocalStorage: 0,\n        BrowserCannotReadLocalStorage: 1,\n        BrowserCannotReadSessionStorage: 2,\n        BrowserCannotWriteLocalStorage: 3,\n        BrowserCannotWriteSessionStorage: 4,\n        BrowserFailedRemovalFromLocalStorage: 5,\n        BrowserFailedRemovalFromSessionStorage: 6,\n        CannotSendEmptyTelemetry: 7,\n        ClientPerformanceMathError: 8,\n        ErrorParsingAISessionCookie: 9,\n        ErrorPVCalc: 10,\n        ExceptionWhileLoggingError: 11,\n        FailedAddingTelemetryToBuffer: 12,\n        FailedMonitorAjaxAbort: 13,\n        FailedMonitorAjaxDur: 14,\n        FailedMonitorAjaxOpen: 15,\n        FailedMonitorAjaxRSC: 16,\n        FailedMonitorAjaxSend: 17,\n        FailedMonitorAjaxGetCorrelationHeader: 18,\n        FailedToAddHandlerForOnBeforeUnload: 19,\n        FailedToSendQueuedTelemetry: 20,\n        FailedToReportDataLoss: 21,\n        FlushFailed: 22,\n        MessageLimitPerPVExceeded: 23,\n        MissingRequiredFieldSpecification: 24,\n        NavigationTimingNotSupported: 25,\n        OnError: 26,\n        SessionRenewalDateIsZero: 27,\n        SenderNotInitialized: 28,\n        StartTrackEventFailed: 29,\n        StopTrackEventFailed: 30,\n        StartTrackFailed: 31,\n        StopTrackFailed: 32,\n        TelemetrySampledAndNotSent: 33,\n        TrackEventFailed: 34,\n        TrackExceptionFailed: 35,\n        TrackMetricFailed: 36,\n        TrackPVFailed: 37,\n        TrackPVFailedCalc: 38,\n        TrackTraceFailed: 39,\n        TransmissionFailed: 40,\n        FailedToSetStorageBuffer: 41,\n        FailedToRestoreStorageBuffer: 42,\n        InvalidBackendResponse: 43,\n        FailedToFixDepricatedValues: 44,\n        InvalidDurationValue: 45,\n        TelemetryEnvelopeInvalid: 46,\n        CreateEnvelopeError: 47,\n        // User actionable\n        CannotSerializeObject: 48,\n        CannotSerializeObjectNonSerializable: 49,\n        CircularReferenceDetected: 50,\n        ClearAuthContextFailed: 51,\n        ExceptionTruncated: 52,\n        IllegalCharsInName: 53,\n        ItemNotInArray: 54,\n        MaxAjaxPerPVExceeded: 55,\n        MessageTruncated: 56,\n        NameTooLong: 57,\n        SampleRateOutOfRange: 58,\n        SetAuthContextFailed: 59,\n        SetAuthContextFailedAccountName: 60,\n        StringValueTooLong: 61,\n        StartCalledMoreThanOnce: 62,\n        StopCalledWithoutStart: 63,\n        TelemetryInitializerFailed: 64,\n        TrackArgumentsNotSpecified: 65,\n        UrlTooLong: 66,\n        SessionStorageBufferFull: 67,\n        CannotAccessCookie: 68,\n        IdTooLong: 69,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=LoggingEnums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = 100;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=IChannelControls.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventsDiscardedReason_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var AppInsightsCore = /** @class */ (function () {\n        function AppInsightsCore() {\n            this._isInitialized = false;\n            this._extensions = new Array();\n            this._channelController = new ChannelController();\n        }\n        AppInsightsCore.prototype.initialize = function (config, extensions) {\n            var _this = this;\n            // Make sure core is only initialized once\n            if (this._isInitialized) {\n                throw Error(\"Core should not be initialized more than once\");\n            }\n            if (!config || CoreUtils_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                throw Error(\"Please provide instrumentation key\");\n            }\n            this.config = config;\n            this._notificationManager = new NotificationManager_1.NotificationManager();\n            this.config.extensions = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensions) ? [] : this.config.extensions;\n            // add notification to the extensions in the config so other plugins can access it\n            this.config.extensionConfig = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensionConfig) ? {} : this.config.extensionConfig;\n            this.config.extensionConfig.NotificationManager = this._notificationManager;\n            this.logger = new DiagnosticLogger_1.DiagnosticLogger(config);\n            // Initial validation\n            extensions.forEach(function (extension) {\n                if (CoreUtils_1.CoreUtils.isNullOrUndefined(extension.initialize)) {\n                    throw Error(validationError);\n                }\n            });\n            if (this.config.extensions.length > 0) {\n                var isValid_1 = true;\n                this.config.extensions.forEach(function (item) {\n                    if (CoreUtils_1.CoreUtils.isNullOrUndefined(item)) {\n                        isValid_1 = false;\n                    }\n                });\n                if (!isValid_1) {\n                    throw Error(validationError);\n                }\n            }\n            // Initial validation complete\n            // Concat all available extensions before sorting by priority\n            (_a = this._extensions).push.apply(_a, [this._channelController].concat(extensions, this.config.extensions));\n            this._extensions = this._extensions.sort(function (a, b) {\n                var extA = a;\n                var extB = b;\n                var typeExtA = typeof extA.processTelemetry;\n                var typeExtB = typeof extB.processTelemetry;\n                if (typeExtA === 'function' && typeExtB === 'function') {\n                    return extA.priority - extB.priority;\n                }\n                if (typeExtA === 'function' && typeExtB !== 'function') {\n                    // keep non telemetryplugin specific extensions at start\n                    return 1;\n                }\n                if (typeExtA !== 'function' && typeExtB === 'function') {\n                    return -1;\n                }\n            });\n            // sort complete\n            // Check if any two extensions have the same priority, then warn to console\n            var priority = {};\n            this._extensions.forEach(function (ext) {\n                var t = ext;\n                if (t && t.priority) {\n                    if (!CoreUtils_1.CoreUtils.isNullOrUndefined(priority[t.priority])) {\n                        _this.logger.warnToConsole(\"Two extensions have same priority\" + priority[t.priority] + \", \" + t.identifier);\n                    }\n                    else {\n                        priority[t.priority] = t.identifier; // set a value\n                    }\n                }\n            });\n            var c = -1;\n            // Set next plugin for all until channel controller\n            for (var idx = 0; idx < this._extensions.length - 1; idx++) {\n                var curr = (this._extensions[idx]);\n                if (curr && typeof curr.processTelemetry !== 'function') {\n                    // these are initialized only, allowing an entry point for extensions to be initialized when SDK initializes\n                    continue;\n                }\n                if (curr.priority === ChannelControllerPriority) {\n                    c = idx + 1;\n                    break; // channel controller will set remaining pipeline\n                }\n                this._extensions[idx].setNextPlugin(this._extensions[idx + 1]); // set next plugin\n            }\n            // initialize channel controller first, this will initialize all channel plugins\n            this._channelController.initialize(this.config, this, this._extensions);\n            // initialize remaining regular plugins\n            this._extensions.forEach(function (ext) {\n                var e = ext;\n                if (e && e.priority < ChannelControllerPriority) {\n                    ext.initialize(_this.config, _this, _this._extensions); // initialize\n                }\n            });\n            // Remove sender channels from main list\n            if (c < this._extensions.length) {\n                this._extensions.splice(c);\n            }\n            if (this.getTransmissionControls().length === 0) {\n                throw new Error(\"No channels available\");\n            }\n            this._isInitialized = true;\n            var _a;\n        };\n        AppInsightsCore.prototype.getTransmissionControls = function () {\n            return this._channelController.ChannelControls;\n        };\n        AppInsightsCore.prototype.track = function (telemetryItem) {\n            if (telemetryItem === null) {\n                this._notifiyInvalidEvent(telemetryItem);\n                // throw error\n                throw Error(\"Invalid telemetry item\");\n            }\n            if (telemetryItem.baseData && !telemetryItem.baseType) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"Provide data.baseType for data.baseData\");\n            }\n            if (!telemetryItem.baseType) {\n                // Hard coded from Common::Event.ts::Event.dataType\n                telemetryItem.baseType = \"EventData\";\n            }\n            if (!telemetryItem.instrumentationKey) {\n                // setup default ikey if not passed in\n                telemetryItem.instrumentationKey = this.config.instrumentationKey;\n            }\n            if (!telemetryItem.timestamp) {\n                // add default timestamp if not passed in\n                telemetryItem.timestamp = new Date();\n            }\n            // do basic validation before sending it through the pipeline\n            this._validateTelmetryItem(telemetryItem);\n            // invoke any common telemetry processors before sending through pipeline\n            var i = 0;\n            while (i < this._extensions.length) {\n                if (this._extensions[i].processTelemetry) {\n                    this._extensions[i].processTelemetry(telemetryItem); // pass on to first extension that can support processing\n                    break;\n                }\n                i++;\n            }\n        };\n        /**\n         * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n         * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n         * called.\n         * @param {INotificationListener} listener - An INotificationListener object.\n         */\n        AppInsightsCore.prototype.addNotificationListener = function (listener) {\n            this._notificationManager.addNotificationListener(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - INotificationListener to remove.\n         */\n        AppInsightsCore.prototype.removeNotificationListener = function (listener) {\n            this._notificationManager.removeNotificationListener(listener);\n        };\n        /**\n         * Periodically check logger.queue for\n         */\n        AppInsightsCore.prototype.pollInternalLogs = function () {\n            var _this = this;\n            if (!(this.config.diagnosticLoggingInterval > 0)) {\n                throw Error(\"config.diagnosticLoggingInterval must be a positive integer\");\n            }\n            return setInterval(function () {\n                var queue = _this.logger.queue;\n                queue.forEach(function (logMessage) {\n                    var item = {\n                        name: \"InternalMessageId: \" + logMessage.messageId,\n                        instrumentationKey: _this.config.instrumentationKey,\n                        timestamp: new Date(),\n                        baseType: DiagnosticLogger_1._InternalLogMessage.dataType,\n                        baseData: { message: logMessage.message }\n                    };\n                    _this.track(item);\n                });\n                queue.length = 0;\n            }, this.config.diagnosticLoggingInterval);\n        };\n        AppInsightsCore.prototype._validateTelmetryItem = function (telemetryItem) {\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.name)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry name required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.timestamp)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry timestamp required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.instrumentationKey)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry instrumentationKey required\");\n            }\n        };\n        AppInsightsCore.prototype._notifiyInvalidEvent = function (telemetryItem) {\n            this._notificationManager.eventsDiscarded([telemetryItem], EventsDiscardedReason_1.EventsDiscardedReason.InvalidEvent);\n        };\n        return AppInsightsCore;\n    }());\n    exports.AppInsightsCore = AppInsightsCore;\n    var ChannelController = /** @class */ (function () {\n        function ChannelController() {\n            this.identifier = \"ChannelControllerPlugin\";\n            this.priority = ChannelControllerPriority; // in reserved range 100 to 200\n        }\n        ChannelController.prototype.processTelemetry = function (item) {\n            this.channelQueue.forEach(function (queues) {\n                // pass on to first item in queue\n                if (queues.length > 0) {\n                    queues[0].processTelemetry(item);\n                }\n            });\n        };\n        Object.defineProperty(ChannelController.prototype, \"ChannelControls\", {\n            get: function () {\n                return this.channelQueue;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        ChannelController.prototype.initialize = function (config, core, extensions) {\n            var _this = this;\n            this.channelQueue = new Array();\n            if (config.channels) {\n                config.channels.forEach(function (queue) {\n                    if (queue && queue.length > 0) {\n                        queue = queue.sort(function (a, b) {\n                            return a.priority - b.priority;\n                        });\n                        // Initialize each plugin\n                        queue.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                        for (var i = 1; i < queue.length; i++) {\n                            queue[i - 1].setNextPlugin(queue[i]); // setup processing chain\n                        }\n                        _this.channelQueue.push(queue);\n                    }\n                });\n            }\n            else {\n                var arr = new Array();\n                for (var i = 0; i < extensions.length; i++) {\n                    var plugin = extensions[i];\n                    if (plugin.priority > ChannelControllerPriority) {\n                        arr.push(plugin);\n                    }\n                }\n                if (arr.length > 0) {\n                    // sort if not sorted\n                    arr = arr.sort(function (a, b) {\n                        return a.priority - b.priority;\n                    });\n                    // Initialize each plugin\n                    arr.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                    // setup next plugin\n                    for (var i = 1; i < arr.length; i++) {\n                        arr[i - 1].setNextPlugin(arr[i]);\n                    }\n                    this.channelQueue.push(arr);\n                }\n            }\n        };\n        return ChannelController;\n    }());\n    var validationError = \"Extensions must provide callback to initialize\";\n    var ChannelControllerPriority = 200;\n    var duplicatePriority = \"One or more extensions are set at same priority\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=AppInsightsCore.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var CoreUtils = /** @class */ (function () {\n        function CoreUtils() {\n        }\n        CoreUtils.isNullOrUndefined = function (input) {\n            return input === null || input === undefined;\n        };\n        /**\n    * Creates a new GUID.\n    * @return {string} A GUID.\n    */\n        CoreUtils.newGuid = function () {\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(GuidRegex, function (c) {\n                // tslint:disable-next-line:insecure-random\n                var r = (Math.random() * 16 | 0), v = (c === 'x' ? r : r & 0x3 | 0x8);\n                return v.toString(16);\n            });\n        };\n        return CoreUtils;\n    }());\n    exports.CoreUtils = CoreUtils;\n    var GuidRegex = /[xy]/g;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=CoreUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\":\n/*!*******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js ***!\n  \\*******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, LoggingEnums_1, CoreUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var _InternalLogMessage = /** @class */ (function () {\n        function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            this.messageId = msgId;\n            this.message =\n                (isUserAct ? _InternalLogMessage.AiUserActionablePrefix : _InternalLogMessage.AiNonUserActionablePrefix) +\n                    msgId;\n            var diagnosticText = (msg ? \" message:\" + _InternalLogMessage.sanitizeDiagnosticText(msg) : \"\") +\n                (properties ? \" props:\" + _InternalLogMessage.sanitizeDiagnosticText(JSON.stringify(properties)) : \"\");\n            this.message += diagnosticText;\n        }\n        _InternalLogMessage.sanitizeDiagnosticText = function (text) {\n            return \"\\\"\" + text.replace(/\\\"/g, \"\") + \"\\\"\";\n        };\n        _InternalLogMessage.dataType = \"MessageData\";\n        /**\n         * For user non actionable traces use AI Internal prefix.\n         */\n        _InternalLogMessage.AiNonUserActionablePrefix = \"AI (Internal): \";\n        /**\n         * Prefix of the traces in portal.\n         */\n        _InternalLogMessage.AiUserActionablePrefix = \"AI: \";\n        return _InternalLogMessage;\n    }());\n    exports._InternalLogMessage = _InternalLogMessage;\n    var DiagnosticLogger = /** @class */ (function () {\n        function DiagnosticLogger(config) {\n            /**\n            *  Session storage key for the prefix for the key indicating message type already logged\n            */\n            this.AIInternalMessagePrefix = \"AITR_\";\n            /**\n             * When this is true the SDK will throw exceptions to aid in debugging.\n             */\n            this.enableDebugExceptions = function () { return false; };\n            /**\n             * 0: OFF\n             * 1: CRITICAL (default)\n             * 2: >= WARNING\n             */\n            this.consoleLoggingLevel = function () { return 1; };\n            /**\n             * 0: OFF (default)\n             * 1: CRITICAL\n             * 2: >= WARNING\n             */\n            this.telemetryLoggingLevel = function () { return 0; };\n            /**\n             * The maximum number of internal messages allowed to be sent per page view\n             */\n            this.maxInternalMessageLimit = function () { return 25; };\n            /**\n             * The internal logging queue\n             */\n            this.queue = [];\n            /**\n             * Count of internal messages sent\n             */\n            this._messageCount = 0;\n            /**\n             * Holds information about what message types were already logged to console or sent to server.\n             */\n            this._messageLogged = {};\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(config)) {\n                // TODO: Use default config\n                // config = AppInsightsCore.defaultConfig;\n                // For now, use defaults specified in DiagnosticLogger members;\n                return;\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelConsole)) {\n                this.consoleLoggingLevel = function () { return config.loggingLevelConsole; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelTelemetry)) {\n                this.telemetryLoggingLevel = function () { return config.loggingLevelTelemetry; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.maxMessageLimit)) {\n                this.maxInternalMessageLimit = function () { return config.maxMessageLimit; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.enableDebugExceptions)) {\n                this.enableDebugExceptions = function () { return config.enableDebugExceptions; };\n            }\n        }\n        /**\n         * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The log message.\n         */\n        DiagnosticLogger.prototype.throwInternal = function (severity, msgId, msg, properties, isUserAct) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n            if (this.enableDebugExceptions()) {\n                throw message;\n            }\n            else {\n                if (typeof (message) !== \"undefined\" && !!message) {\n                    if (typeof (message.message) !== \"undefined\") {\n                        if (isUserAct) {\n                            // check if this message type was already logged to console for this page view and if so, don't log it again\n                            var messageKey = +message.messageId;\n                            if (!this._messageLogged[messageKey] || this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                                this._messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            // don't log internal AI traces in the console, unless the verbose logging is enabled\n                            if (this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                            }\n                        }\n                        this.logInternalMessage(severity, message);\n                    }\n                }\n            }\n        };\n        /**\n         * This will write a warning to the console if possible\n         * @param message {string} - The warning message\n         */\n        DiagnosticLogger.prototype.warnToConsole = function (message) {\n            if (typeof console !== \"undefined\" && !!console) {\n                if (typeof console.warn === \"function\") {\n                    console.warn(message);\n                }\n                else if (typeof console.log === \"function\") {\n                    console.log(message);\n                }\n            }\n        };\n        /**\n         * Resets the internal message count\n         */\n        DiagnosticLogger.prototype.resetInternalMessageCount = function () {\n            this._messageCount = 0;\n            this._messageLogged = {};\n        };\n        /**\n         * Logs a message to the internal queue.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The message to log.\n         */\n        DiagnosticLogger.prototype.logInternalMessage = function (severity, message) {\n            if (this._areInternalMessagesThrottled()) {\n                return;\n            }\n            // check if this message type was already logged for this session and if so, don't log it again\n            var logMessage = true;\n            var messageKey = this.AIInternalMessagePrefix + message.messageId;\n            // if the session storage is not available, limit to only one message type per page view\n            if (this._messageLogged[messageKey]) {\n                logMessage = false;\n            }\n            else {\n                this._messageLogged[messageKey] = true;\n            }\n            if (logMessage) {\n                // Push the event in the internal queue\n                if (severity <= this.telemetryLoggingLevel()) {\n                    this.queue.push(message);\n                    this._messageCount++;\n                }\n                // When throttle limit reached, send a special event\n                if (this._messageCount == this.maxInternalMessageLimit()) {\n                    var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                    var throttleMessage = new _InternalLogMessage(LoggingEnums_1._InternalMessageId.MessageLimitPerPVExceeded, throttleLimitMessage, false);\n                    this.queue.push(throttleMessage);\n                    this.warnToConsole(throttleLimitMessage);\n                }\n            }\n        };\n        /**\n         * Indicates whether the internal events are throttled\n         */\n        DiagnosticLogger.prototype._areInternalMessagesThrottled = function () {\n            return this._messageCount >= this.maxInternalMessageLimit();\n        };\n        return DiagnosticLogger;\n    }());\n    exports.DiagnosticLogger = DiagnosticLogger;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DiagnosticLogger.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Class to manage sending notifications to all the listeners.\n     */\n    var NotificationManager = /** @class */ (function () {\n        function NotificationManager() {\n            this.listeners = [];\n        }\n        /**\n         * Adds a notification listener.\n         * @param {INotificationListener} listener - The notification listener to be added.\n         */\n        NotificationManager.prototype.addNotificationListener = function (listener) {\n            this.listeners.push(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - AWTNotificationListener to remove.\n         */\n        NotificationManager.prototype.removeNotificationListener = function (listener) {\n            var index = this.listeners.indexOf(listener);\n            while (index > -1) {\n                this.listeners.splice(index, 1);\n                index = this.listeners.indexOf(listener);\n            }\n        };\n        /**\n         * Notification for events sent.\n         * @param {ITelemetryItem[]} events - The array of events that have been sent.\n         */\n        NotificationManager.prototype.eventsSent = function (events) {\n            var _this = this;\n            var _loop_1 = function (i) {\n                if (this_1.listeners[i].eventsSent) {\n                    setTimeout(function () { return _this.listeners[i].eventsSent(events); }, 0);\n                }\n            };\n            var this_1 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_1(i);\n            }\n        };\n        /**\n         * Notification for events being discarded.\n         * @param {ITelemetryItem[]} events - The array of events that have been discarded by the SDK.\n         * @param {number} reason           - The reason for which the SDK discarded the events. The EventsDiscardedReason\n         * constant should be used to check the different values.\n         */\n        NotificationManager.prototype.eventsDiscarded = function (events, reason) {\n            var _this = this;\n            var _loop_2 = function (i) {\n                if (this_2.listeners[i].eventsDiscarded) {\n                    setTimeout(function () { return _this.listeners[i].eventsDiscarded(events, reason); }, 0);\n                }\n            };\n            var this_2 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_2(i);\n            }\n        };\n        return NotificationManager;\n    }());\n    exports.NotificationManager = NotificationManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=NotificationManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\":\n/*!****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js ***!\n  \\****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK.Interfaces/IChannelControls */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./JavaScriptSDK/AppInsightsCore */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\"), __webpack_require__(/*! ./JavaScriptSDK/CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./JavaScriptSDK/NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./JavaScriptSDK/DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, IChannelControls_1, EventsDiscardedReason_1, AppInsightsCore_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1, LoggingEnums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = IChannelControls_1.MinChannelPriorty;\n    exports.EventsDiscardedReason = EventsDiscardedReason_1.EventsDiscardedReason;\n    exports.AppInsightsCore = AppInsightsCore_1.AppInsightsCore;\n    exports.CoreUtils = CoreUtils_1.CoreUtils;\n    exports.NotificationManager = NotificationManager_1.NotificationManager;\n    exports.DiagnosticLogger = DiagnosticLogger_1.DiagnosticLogger;\n    exports._InternalLogMessage = DiagnosticLogger_1._InternalLogMessage;\n    exports._InternalMessageId = LoggingEnums_1._InternalMessageId;\n    exports.LoggingSeverity = LoggingEnums_1.LoggingSeverity;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-core-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\":\n/*!*************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajax.js ***!\n  \\*************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./ajaxRecord */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\"), __webpack_require__(/*! ./ajaxUtils */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, ajaxRecord_1, ajaxUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var AjaxMonitor = /** @class */ (function () {\n        function AjaxMonitor() {\n            this._trackAjaxAttempts = 0;\n            this.identifier = \"AjaxDependencyPlugin\";\n            this.priority = 161;\n            this.currentWindowHost = window && window.location.host && window.location.host.toLowerCase();\n            this.initialized = false;\n        }\n        ///<summary>Verifies that particalar instance of XMLHttpRequest needs to be monitored</summary>\n        ///<param name=\"excludeAjaxDataValidation\">Optional parameter. True if ajaxData must be excluded from verification</param>\n        ///<returns type=\"bool\">True if instance needs to be monitored, otherwise false</returns>\n        AjaxMonitor.prototype.isMonitoredInstance = function (xhr, excludeAjaxDataValidation) {\n            // checking to see that all interested functions on xhr were instrumented\n            return this.initialized\n                // checking on ajaxData to see that it was not removed in user code\n                && (excludeAjaxDataValidation === true || !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData))\n                // check that this instance is not not used by ajax call performed inside client side monitoring to send data to collector\n                && xhr[applicationinsights_common_1.DisabledPropertyName] !== true;\n        };\n        ///<summary>Determines whether ajax monitoring can be enabled on this document</summary>\n        ///<returns>True if Ajax monitoring is supported on this page, otherwise false</returns>\n        AjaxMonitor.prototype.supportsMonitoring = function () {\n            var result = true;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.open) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.send) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.abort)) {\n                result = false;\n            }\n            // disable in IE8 or older (https://www.w3schools.com/jsref/jsref_trim_string.asp)\n            try {\n                \" a \".trim();\n            }\n            catch (ex) {\n                result = false;\n            }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentOpen = function () {\n            var originalOpen = XMLHttpRequest.prototype.open;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.open = function (method, url, async) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this, true) &&\n                        (!this.ajaxData ||\n                            !this.ajaxData.xhrMonitoringState.openDone)) {\n                        ajaxMonitorInstance.openHandler(this, method, url, async);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxOpen, \"Failed to monitor XMLHttpRequest.open, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalOpen.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.openHandler = function (xhr, method, url, async) {\n            /* todo:\n            Disabling the following block of code as CV is not yet supported in 1DS for 3rd Part.\n            // this format corresponds with activity logic on server-side and is required for the correct correlation\n            var id = \"|\" + this.appInsights.context.operation.id + \".\" + Util.newId();\n            */\n            var id = applicationinsights_common_1.Util.newId();\n            var ajaxData = new ajaxRecord_1.ajaxRecord(id, this._core._logger);\n            ajaxData.method = method;\n            ajaxData.requestUrl = url;\n            ajaxData.xhrMonitoringState.openDone = true;\n            xhr.ajaxData = ajaxData;\n            this.attachToOnReadyStateChange(xhr);\n        };\n        AjaxMonitor.getFailedAjaxDiagnosticsMessage = function (xhr) {\n            var result = \"\";\n            try {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData.requestUrl)) {\n                    result += \"(url: '\" + xhr.ajaxData.requestUrl + \"')\";\n                }\n            }\n            catch (e) { }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentSend = function () {\n            var originalSend = XMLHttpRequest.prototype.send;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.send = function (content) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.sendDone) {\n                        ajaxMonitorInstance.sendHandler(this, content);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxSend, \"Failed to monitor XMLHttpRequest, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalSend.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.sendHandler = function (xhr, content) {\n            xhr.ajaxData.requestSentTime = applicationinsights_common_1.DateTimeUtils.Now();\n            if (this.currentWindowHost && applicationinsights_common_1.CorrelationIdHelper.canIncludeCorrelationHeader(this._config, xhr.ajaxData.getAbsoluteUrl(), this.currentWindowHost)) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestIdHeader, xhr.ajaxData.id);\n                var appId = this._config.appId; // Todo: also, get appId from channel as breeze returns it\n                if (appId) {\n                    xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader, applicationinsights_common_1.RequestHeaders.requestContextAppIdFormat + appId);\n                }\n            }\n            xhr.ajaxData.xhrMonitoringState.sendDone = true;\n        };\n        AjaxMonitor.prototype.instrumentAbort = function () {\n            var originalAbort = XMLHttpRequest.prototype.abort;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.abort = function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.abortDone) {\n                        this.ajaxData.aborted = 1;\n                        this.ajaxData.xhrMonitoringState.abortDone = true;\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxAbort, \"Failed to monitor XMLHttpRequest.abort, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalAbort.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.attachToOnReadyStateChange = function (xhr) {\n            var _this = this;\n            var ajaxMonitorInstance = this;\n            xhr.ajaxData.xhrMonitoringState.onreadystatechangeCallbackAttached = ajaxUtils_1.EventHelper.AttachEvent(xhr, \"readystatechange\", function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(xhr)) {\n                        if (xhr.readyState === 4) {\n                            ajaxMonitorInstance.onAjaxComplete(xhr);\n                        }\n                    }\n                }\n                catch (e) {\n                    var exceptionText = applicationinsights_common_1.Util.dump(e);\n                    // ignore messages with c00c023f, as this a known IE9 XHR abort issue\n                    if (!exceptionText || exceptionText.toLowerCase().indexOf(\"c00c023f\") == -1) {\n                        _this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxRSC, \"Failed to monitor XMLHttpRequest 'readystatechange' event handler, monitoring data for this ajax call may be incorrect.\", {\n                            ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                            exception: applicationinsights_common_1.Util.dump(e)\n                        });\n                    }\n                }\n            });\n        };\n        AjaxMonitor.prototype.onAjaxComplete = function (xhr) {\n            xhr.ajaxData.responseFinishedTime = applicationinsights_common_1.DateTimeUtils.Now();\n            xhr.ajaxData.status = xhr.status;\n            xhr.ajaxData.CalculateMetrics();\n            if (xhr.ajaxData.ajaxTotalDuration < 0) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxDur, \"Failed to calculate the duration of the ajax call, monitoring data for this ajax call won't be sent.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    requestSentTime: xhr.ajaxData.requestSentTime,\n                    responseFinishedTime: xhr.ajaxData.responseFinishedTime\n                });\n            }\n            else {\n                var dependency = {\n                    id: xhr.ajaxData.id,\n                    absoluteUrl: xhr.ajaxData.getAbsoluteUrl(),\n                    commandName: xhr.ajaxData.getPathName(),\n                    duration: xhr.ajaxData.ajaxTotalDuration,\n                    success: (+(xhr.ajaxData.status)) >= 200 && (+(xhr.ajaxData.status)) < 400,\n                    resultCode: +xhr.ajaxData.status,\n                    method: xhr.ajaxData.method\n                };\n                // enrich dependency target with correlation context from the server\n                var correlationContext = this.getCorrelationContext(xhr);\n                if (correlationContext) {\n                    dependency.correlationContext = /* dependency.target + \" | \" + */ correlationContext;\n                }\n                this.trackDependencyData(dependency);\n                xhr.ajaxData = null;\n            }\n        };\n        AjaxMonitor.prototype.getCorrelationContext = function (xhr) {\n            try {\n                var responseHeadersString = xhr.getAllResponseHeaders();\n                if (responseHeadersString !== null) {\n                    var index = responseHeadersString.toLowerCase().indexOf(applicationinsights_common_1.RequestHeaders.requestContextHeaderLowerCase);\n                    if (index !== -1) {\n                        var responseHeader = xhr.getResponseHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader);\n                        return applicationinsights_common_1.CorrelationIdHelper.getCorrelationContext(responseHeader);\n                    }\n                }\n            }\n            catch (e) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxGetCorrelationHeader, \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    exception: applicationinsights_common_1.Util.dump(e)\n                });\n            }\n        };\n        /**\n            * Logs dependency call\n            * @param dependencyData dependency data object\n            */\n        AjaxMonitor.prototype.trackDependencyData = function (dependency, properties, systemProperties) {\n            if (this._config.maxAjaxCallsPerView === -1 || this._trackAjaxAttempts < this._config.maxAjaxCallsPerView) {\n                var item = applicationinsights_common_1.TelemetryItemCreator.create(dependency, applicationinsights_common_1.RemoteDependencyData.dataType, applicationinsights_common_1.RemoteDependencyData.envelopeType, this._core._logger, properties, systemProperties);\n                this._core.track(item);\n            }\n            else if (this._trackAjaxAttempts === this._config.maxAjaxCallsPerView) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MaxAjaxPerPVExceeded, \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n            }\n            ++this._trackAjaxAttempts;\n        };\n        AjaxMonitor.prototype.processTelemetry = function (item) {\n            if (this._nextPlugin && this._nextPlugin.processTelemetry) {\n                this._nextPlugin.processTelemetry(item);\n            }\n        };\n        AjaxMonitor.prototype.setNextPlugin = function (next) {\n            if (next) {\n                this._nextPlugin = next;\n            }\n        };\n        AjaxMonitor.prototype.initialize = function (config, core, extensions) {\n            if (!this.initialized) {\n                this._core = core;\n                config.extensionConfig = config.extensionConfig ? config.extensionConfig : {};\n                var c = config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n                this._config = {\n                    maxAjaxCallsPerView: !isNaN(c.maxAjaxCallsPerView) ? c.maxAjaxCallsPerView : 500,\n                    disableAjaxTracking: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableAjaxTracking),\n                    disableCorrelationHeaders: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableCorrelationHeaders),\n                    correlationHeaderExcludedDomains: c.correlationHeaderExcludedDomains || [\n                        \"*.blob.core.windows.net\",\n                        \"*.blob.core.chinacloudapi.cn\",\n                        \"*.blob.core.cloudapi.de\",\n                        \"*.blob.core.usgovcloudapi.net\"\n                    ],\n                    appId: c.appId,\n                    enableCorsCorrelation: applicationinsights_common_1.Util.stringToBoolOrDefault(c.enableCorsCorrelation)\n                };\n                if (this.supportsMonitoring() && !this._config.disableAjaxTracking) {\n                    this.instrumentOpen();\n                    this.instrumentSend();\n                    this.instrumentAbort();\n                    this.initialized = true;\n                }\n            }\n        };\n        return AjaxMonitor;\n    }());\n    exports.AjaxMonitor = AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajax.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var XHRMonitoringState = /** @class */ (function () {\n        function XHRMonitoringState() {\n            this.openDone = false;\n            this.setRequestHeaderDone = false;\n            this.sendDone = false;\n            this.abortDone = false;\n            //<summary>True, if onreadyStateChangeCallback function attached to xhr, otherwise false</summary>\n            this.onreadystatechangeCallbackAttached = false;\n        }\n        return XHRMonitoringState;\n    }());\n    exports.XHRMonitoringState = XHRMonitoringState;\n    var ajaxRecord = /** @class */ (function () {\n        function ajaxRecord(id, logger) {\n            this.completed = false;\n            this.requestHeadersSize = null;\n            this.ttfb = null;\n            this.responseReceivingDuration = null;\n            this.callbackDuration = null;\n            this.ajaxTotalDuration = null;\n            this.aborted = null;\n            this.pageUrl = null;\n            this.requestUrl = null;\n            this.requestSize = 0;\n            this.method = null;\n            ///<summary>Returns the HTTP status code.</summary>\n            this.status = null;\n            //<summary>The timestamp when open method was invoked</summary>\n            this.requestSentTime = null;\n            //<summary>The timestamps when first byte was received</summary>\n            this.responseStartedTime = null;\n            //<summary>The timestamp when last byte was received</summary>\n            this.responseFinishedTime = null;\n            //<summary>The timestamp when onreadystatechange callback in readyState 4 finished</summary>\n            this.callbackFinishedTime = null;\n            //<summary>The timestamp at which ajax was ended</summary>\n            this.endTime = null;\n            //<summary>The original xhr onreadystatechange event</summary>\n            this.originalOnreadystatechage = null;\n            this.xhrMonitoringState = new XHRMonitoringState();\n            //<summary>Determines whether or not JavaScript exception occured in xhr.onreadystatechange code. 1 if occured, otherwise 0.</summary>\n            this.clientFailure = 0;\n            this.CalculateMetrics = function () {\n                var self = this;\n                // round to 3 decimal points\n                self.ajaxTotalDuration = Math.round(applicationinsights_common_1.DateTimeUtils.GetDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n            };\n            this.id = id;\n            this._logger = logger;\n        }\n        ajaxRecord.prototype.getAbsoluteUrl = function () {\n            return this.requestUrl ? applicationinsights_common_1.UrlHelper.getAbsoluteUrl(this.requestUrl) : null;\n        };\n        ajaxRecord.prototype.getPathName = function () {\n            return this.requestUrl ? applicationinsights_common_1.DataSanitizer.sanitizeUrl(this._logger, applicationinsights_common_1.UrlHelper.getCompleteUrl(this.method, this.requestUrl)) : null;\n        };\n        return ajaxRecord;\n    }());\n    exports.ajaxRecord = ajaxRecord;\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxRecord.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var stringUtils = /** @class */ (function () {\n        function stringUtils() {\n        }\n        stringUtils.GetLength = function (strObject) {\n            var res = 0;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(strObject)) {\n                var stringified = \"\";\n                try {\n                    stringified = strObject.toString();\n                }\n                catch (ex) {\n                    // some troubles with complex object\n                }\n                res = stringified.length;\n                res = isNaN(res) ? 0 : res;\n            }\n            return res;\n        };\n        return stringUtils;\n    }());\n    exports.stringUtils = stringUtils;\n    var EventHelper = /** @class */ (function () {\n        function EventHelper() {\n        }\n        ///<summary>Binds the specified function to an event, so that the function gets called whenever the event fires on the object</summary>\n        ///<param name=\"obj\">Object to which </param>\n        ///<param name=\"eventNameWithoutOn\">String that specifies any of the standard DHTML Events without \"on\" prefix</param>\n        ///<param name=\"handlerRef\">Pointer that specifies the function to call when event fires</param>\n        ///<returns>True if the function was bound successfully to the event, otherwise false</returns>\n        EventHelper.AttachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            var result = false;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.attachEvent)) {\n                    // IE before version 9                    \n                    obj.attachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                    result = true;\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.addEventListener)) {\n                        // all browsers except IE before version 9\n                        obj.addEventListener(eventNameWithoutOn, handlerRef, false);\n                        result = true;\n                    }\n                }\n            }\n            return result;\n        };\n        EventHelper.DetachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.detachEvent)) {\n                    obj.detachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.removeEventListener)) {\n                        obj.removeEventListener(eventNameWithoutOn, handlerRef, false);\n                    }\n                }\n            }\n        };\n        return EventHelper;\n    }());\n    exports.EventHelper = EventHelper;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./ajax */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ajax_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.AjaxPlugin = ajax_1.AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-dependencies-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Application.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Application = /** @class */ (function () {\n        function Application() {\n        }\n        return Application;\n    }());\n    exports.Application = Application;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Application.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Device.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Device = /** @class */ (function () {\n        /**\n         * Constructs a new instance of the Device class\n         */\n        function Device() {\n            // don't attempt to fingerprint browsers\n            this.id = \"browser\";\n            // Device type is a dimension in our data platform\n            // Setting it to 'Browser' allows to separate client and server dependencies/exceptions\n            this.type = \"Browser\";\n        }\n        return Device;\n    }());\n    exports.Device = Device;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Device.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Version = \"2.0.1-beta\";\n    var Internal = /** @class */ (function () {\n        /**\n        * Constructs a new instance of the internal telemetry data class.\n        */\n        function Internal(config) {\n            this.sdkVersion = (config.sdkExtension && config.sdkExtension() ? config.sdkExtension() + \"_\" : \"\") + \"javascript:\" + Version;\n        }\n        return Internal;\n    }());\n    exports.Internal = Internal;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Internal.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Location.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Location = /** @class */ (function () {\n        function Location() {\n        }\n        return Location;\n    }());\n    exports.Location = Location;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Location.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Operation = /** @class */ (function () {\n        function Operation() {\n            this.id = applicationinsights_common_1.Util.newId();\n            if (window && window.location && window.location.pathname) {\n                this.name = window.location.pathname;\n            }\n        }\n        return Operation;\n    }());\n    exports.Operation = Operation;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Operation.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../SamplingScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SamplingScoreGenerator_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sample = /** @class */ (function () {\n        function Sample(sampleRate, logger) {\n            // We're using 32 bit math, hence max value is (2^31 - 1)\n            this.INT_MAX_VALUE = 2147483647;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (sampleRate > 100 || sampleRate < 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SampleRateOutOfRange, \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n                this.sampleRate = 100;\n            }\n            this.sampleRate = sampleRate;\n            this.samplingScoreGenerator = new SamplingScoreGenerator_1.SamplingScoreGenerator();\n        }\n        /**\n        * Determines if an envelope is sampled in (i.e. will be sent) or not (i.e. will be dropped).\n        */\n        Sample.prototype.isSampledIn = function (envelope) {\n            // return true as sampling will move to different extension\n            return true;\n        };\n        return Sample;\n    }());\n    exports.Sample = Sample;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sample.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Session.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Session = /** @class */ (function () {\n        function Session() {\n        }\n        return Session;\n    }());\n    exports.Session = Session;\n    var _SessionManager = /** @class */ (function () {\n        function _SessionManager(config, logger) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (!config) {\n                config = {};\n            }\n            if (!(typeof config.sessionExpirationMs === \"function\")) {\n                config.sessionExpirationMs = function () { return _SessionManager.acquisitionSpan; };\n            }\n            if (!(typeof config.sessionRenewalMs === \"function\")) {\n                config.sessionRenewalMs = function () { return _SessionManager.renewalSpan; };\n            }\n            this.config = config;\n            this.automaticSession = new Session();\n        }\n        _SessionManager.prototype.update = function () {\n            if (!this.automaticSession.id) {\n                this.initializeAutomaticSession();\n            }\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            var acquisitionExpired = now - this.automaticSession.acquisitionDate > this.config.sessionExpirationMs();\n            var renewalExpired = now - this.automaticSession.renewalDate > this.config.sessionRenewalMs();\n            // renew if acquisitionSpan or renewalSpan has ellapsed\n            if (acquisitionExpired || renewalExpired) {\n                // update automaticSession so session state has correct id                \n                this.automaticSession.isFirst = undefined;\n                this.renew();\n            }\n            else {\n                // do not update the cookie more often than cookieUpdateInterval\n                if (!this.cookieUpdatedTimestamp || now - this.cookieUpdatedTimestamp > _SessionManager.cookieUpdateInterval) {\n                    this.automaticSession.renewalDate = now;\n                    this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n                }\n            }\n        };\n        /**\n         *  Record the current state of the automatic session and store it in our cookie string format\n         *  into the browser's local storage. This is used to restore the session data when the cookie\n         *  expires.\n         */\n        _SessionManager.prototype.backup = function () {\n            this.setStorage(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n        };\n        /**\n         *  Use ai_session cookie data or local storage data (when the cookie is unavailable) to\n         *  initialize the automatic session.\n         */\n        _SessionManager.prototype.initializeAutomaticSession = function () {\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, 'ai_session');\n            if (cookie && typeof cookie.split === \"function\") {\n                this.initializeAutomaticSessionWithData(cookie);\n            }\n            else {\n                // There's no cookie, but we might have session data in local storage\n                // This can happen if the session expired or the user actively deleted the cookie\n                // We only want to recover data if the cookie is missing from expiry. We should respect the user's wishes if the cookie was deleted actively.\n                // The User class handles this for us and deletes our local storage object if the persistent user cookie was removed.\n                var storage = applicationinsights_common_1.Util.getStorage(this._logger, 'ai_session');\n                if (storage) {\n                    this.initializeAutomaticSessionWithData(storage);\n                }\n            }\n            if (!this.automaticSession.id) {\n                this.automaticSession.isFirst = true;\n                this.renew();\n            }\n        };\n        /**\n         *  Extract id, aquisitionDate, and renewalDate from an ai_session payload string and\n         *  use this data to initialize automaticSession.\n         *\n         *  @param {string} sessionData - The string stored in an ai_session cookie or local storage backup\n         */\n        _SessionManager.prototype.initializeAutomaticSessionWithData = function (sessionData) {\n            var params = sessionData.split(\"|\");\n            if (params.length > 0) {\n                this.automaticSession.id = params[0];\n            }\n            try {\n                if (params.length > 1) {\n                    var acq = +params[1];\n                    this.automaticSession.acquisitionDate = +new Date(acq);\n                    this.automaticSession.acquisitionDate = this.automaticSession.acquisitionDate > 0 ? this.automaticSession.acquisitionDate : 0;\n                }\n                if (params.length > 2) {\n                    var renewal = +params[2];\n                    this.automaticSession.renewalDate = +new Date(renewal);\n                    this.automaticSession.renewalDate = this.automaticSession.renewalDate > 0 ? this.automaticSession.renewalDate : 0;\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ErrorParsingAISessionCookie, \"Error parsing ai_session cookie, session will be reset: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            if (this.automaticSession.renewalDate == 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionRenewalDateIsZero, \"AI session renewal date is 0, session will be reset.\");\n            }\n        };\n        _SessionManager.prototype.renew = function () {\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            this.automaticSession.id = applicationinsights_common_1.Util.newId();\n            this.automaticSession.acquisitionDate = now;\n            this.automaticSession.renewalDate = now;\n            this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n            // If this browser does not support local storage, fire an internal log to keep track of it at this point\n            if (!applicationinsights_common_1.Util.canUseLocalStorage()) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserDoesNotSupportLocalStorage, \"Browser does not support local storage. Session durations will be inaccurate.\");\n            }\n        };\n        _SessionManager.prototype.setCookie = function (guid, acq, renewal) {\n            // Set cookie to expire after the session expiry time passes or the session renewal deadline, whichever is sooner\n            // Expiring the cookie will cause the session to expire even if the user isn't on the page\n            var acquisitionExpiry = acq + this.config.sessionExpirationMs();\n            var renewalExpiry = renewal + this.config.sessionRenewalMs();\n            var cookieExpiry = new Date();\n            var cookie = [guid, acq, renewal];\n            if (acquisitionExpiry < renewalExpiry) {\n                cookieExpiry.setTime(acquisitionExpiry);\n            }\n            else {\n                cookieExpiry.setTime(renewalExpiry);\n            }\n            var cookieDomnain = this.config.cookieDomain ? this.config.cookieDomain() : null;\n            applicationinsights_common_1.Util.setCookie(this._logger, 'ai_session', cookie.join('|') + ';expires=' + cookieExpiry.toUTCString(), cookieDomnain);\n            this.cookieUpdatedTimestamp = applicationinsights_common_1.DateTimeUtils.Now();\n        };\n        _SessionManager.prototype.setStorage = function (guid, acq, renewal) {\n            // Keep data in local storage to retain the last session id, allowing us to cleanly end the session when it expires\n            // Browsers that don't support local storage won't be able to end sessions cleanly from the client\n            // The server will notice this and end the sessions itself, with loss of accurate session duration\n            applicationinsights_common_1.Util.setStorage(this._logger, 'ai_session', [guid, acq, renewal].join('|'));\n        };\n        _SessionManager.acquisitionSpan = 86400000; // 24 hours in ms\n        _SessionManager.renewalSpan = 1800000; // 30 minutes in ms\n        _SessionManager.cookieUpdateInterval = 60000; // 1 minute in ms\n        return _SessionManager;\n    }());\n    exports._SessionManager = _SessionManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Session.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/User.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var User = /** @class */ (function () {\n        function User(config, logger) {\n            this._logger = logger;\n            //get userId or create new one if none exists\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, User.userCookieName);\n            if (cookie) {\n                var params = cookie.split(User.cookieSeparator);\n                if (params.length > 0) {\n                    this.id = params[0];\n                }\n            }\n            this.config = config;\n            if (!this.id) {\n                this.id = applicationinsights_common_1.Util.newId();\n                var date = new Date();\n                var acqStr = applicationinsights_common_1.Util.toISOStringForIE8(date);\n                this.accountAcquisitionDate = acqStr;\n                // without expiration, cookies expire at the end of the session\n                // set it to 365 days from now\n                // 365 * 24 * 60 * 60 * 1000 = 31536000000 \n                date.setTime(date.getTime() + 31536000000);\n                var newCookie = [this.id, acqStr];\n                var cookieDomain = this.config.cookieDomain ? this.config.cookieDomain() : undefined;\n                applicationinsights_common_1.Util.setCookie(this._logger, User.userCookieName, newCookie.join(User.cookieSeparator) + ';expires=' + date.toUTCString(), cookieDomain);\n                // If we have an ai_session in local storage this means the user actively removed our cookies.\n                // We should respect their wishes and clear ourselves from local storage\n                applicationinsights_common_1.Util.removeStorage(this._logger, 'ai_session');\n            }\n            // We still take the account id from the ctor param for backward compatibility. \n            // But if the the customer set the accountId through the newer setAuthenticatedUserContext API, we will override it.\n            this.accountId = config.accountId ? config.accountId() : undefined;\n            // Get the auth user id and account id from the cookie if exists\n            // Cookie is in the pattern: <authenticatedId>|<accountId>\n            var authCookie = applicationinsights_common_1.Util.getCookie(this._logger, User.authUserCookieName);\n            if (authCookie) {\n                authCookie = decodeURI(authCookie);\n                var authCookieString = authCookie.split(User.cookieSeparator);\n                if (authCookieString[0]) {\n                    this.authenticatedId = authCookieString[0];\n                }\n                if (authCookieString.length > 1 && authCookieString[1]) {\n                    this.accountId = authCookieString[1];\n                }\n            }\n        }\n        /**\n        * Sets the authenticated user id and the account id in this session.\n        *\n        * @param authenticatedUserId {string} - The authenticated user id. A unique and persistent string that represents each authenticated user in the service.\n        * @param accountId {string} - An optional string to represent the account associated with the authenticated user.\n        */\n        User.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            // Validate inputs to ensure no cookie control characters.\n            var isInvalidInput = !this.validateUserInput(authenticatedUserId) || (accountId && !this.validateUserInput(accountId));\n            if (isInvalidInput) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SetAuthContextFailedAccountName, \"Setting auth user context failed. \" +\n                    \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                return;\n            }\n            // Create cookie string.\n            this.authenticatedId = authenticatedUserId;\n            var authCookie = this.authenticatedId;\n            if (accountId) {\n                this.accountId = accountId;\n                authCookie = [this.authenticatedId, this.accountId].join(User.cookieSeparator);\n            }\n            if (storeInCookie) {\n                // Set the cookie. No expiration date because this is a session cookie (expires when browser closed).\n                // Encoding the cookie to handle unexpected unicode characters.\n                applicationinsights_common_1.Util.setCookie(this._logger, User.authUserCookieName, encodeURI(authCookie), this.config.cookieDomain());\n            }\n        };\n        /**\n         * Clears the authenticated user id and the account id from the user context.\n         * @returns {}\n         */\n        User.prototype.clearAuthenticatedUserContext = function () {\n            this.authenticatedId = null;\n            this.accountId = null;\n            applicationinsights_common_1.Util.deleteCookie(this._logger, User.authUserCookieName);\n        };\n        User.prototype.validateUserInput = function (id) {\n            // Validate:\n            // 1. Id is a non-empty string.\n            // 2. It does not contain special characters for cookies.\n            if (typeof id !== 'string' ||\n                !id ||\n                id.match(/,|;|=| |\\|/)) {\n                return false;\n            }\n            return true;\n        };\n        User.cookieSeparator = '|';\n        User.userCookieName = 'ai_user';\n        User.authUserCookieName = 'ai_authUser';\n        return User;\n    }());\n    exports.User = User;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=User.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var HashCodeScoreGenerator = /** @class */ (function () {\n        function HashCodeScoreGenerator() {\n        }\n        HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n            var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n            return score * 100;\n        };\n        HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n            if (input == \"\") {\n                return 0;\n            }\n            while (input.length < HashCodeScoreGenerator.MIN_INPUT_LENGTH) {\n                input = input.concat(input);\n            }\n            // 5381 is a magic number: http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function\n            var hash = 5381;\n            for (var i = 0; i < input.length; ++i) {\n                hash = ((hash << 5) + hash) + input.charCodeAt(i);\n                // 'hash' is of number type which means 53 bit integer (http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-number-type)\n                // 'hash & hash' will keep it 32 bit integer - just to make it clearer what the result is.\n                hash = hash & hash;\n            }\n            return Math.abs(hash);\n        };\n        // We're using 32 bit math, hence max value is (2^31 - 1)\n        HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n        // (Magic number) DJB algorithm can't work on shorter strings (results in poor distribution\n        HashCodeScoreGenerator.MIN_INPUT_LENGTH = 8;\n        return HashCodeScoreGenerator;\n    }());\n    exports.HashCodeScoreGenerator = HashCodeScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=HashCodeScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * PropertiesPlugin.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! ./Context/Session */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\"), __webpack_require__(/*! ./Context/Application */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\"), __webpack_require__(/*! ./Context/Device */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\"), __webpack_require__(/*! ./Context/Internal */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\"), __webpack_require__(/*! ./Context/Location */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\"), __webpack_require__(/*! ./Context/Operation */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\"), __webpack_require__(/*! ./Context/User */ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\"), __webpack_require__(/*! ./Context/Sample */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_common_1, Session_1, Application_1, Device_1, Internal_1, Location_1, Operation_1, User_1, Sample_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PropertiesPlugin = /** @class */ (function () {\n        function PropertiesPlugin() {\n            this.priority = 170;\n            this.identifier = \"AppInsightsPropertiesPlugin\";\n        }\n        PropertiesPlugin.prototype.initialize = function (config, core, extensions) {\n            var extensionConfig = config.extensionConfig &&\n                config.extensionConfig[this.identifier] ?\n                config.extensionConfig[this.identifier] : {};\n            this._extensionConfig = {\n                instrumentationKey: function () { return extensionConfig.instrumentationKey; },\n                accountId: function () { return extensionConfig.accountId; },\n                sessionRenewalMs: function () { return extensionConfig.sessionRenewalMs; },\n                sampleRate: function () { return extensionConfig.sampleRate; },\n                sessionExpirationMs: function () { return extensionConfig.sessionExpirationMs; },\n                cookieDomain: function () { return extensionConfig.cookieDomain; },\n                sdkExtension: function () { return extensionConfig.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return extensionConfig.isBrowserLinkTrackingEnabled; },\n                appId: function () { return extensionConfig.appId; }\n            };\n            if (typeof window !== 'undefined') {\n                this._sessionManager = new Session_1._SessionManager(this._extensionConfig, core.logger);\n                this.application = new Application_1.Application();\n                this.device = new Device_1.Device();\n                this.internal = new Internal_1.Internal(this._extensionConfig);\n                this.location = new Location_1.Location();\n                this.user = new User_1.User(this._extensionConfig, core.logger);\n                this.operation = new Operation_1.Operation();\n                this.session = new Session_1.Session();\n                this.sample = new Sample_1.Sample(this._extensionConfig.sampleRate(), core.logger);\n            }\n        };\n        /**\n         * Add Part A fields to the event\n         * @param event The event that needs to be processed\n         */\n        PropertiesPlugin.prototype.processTelemetry = function (event) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(event)) {\n                // TODO(barustum): throw an internal event once we have support for internal logging\n            }\n            else {\n                // if the event is not sampled in, do not bother going through the pipeline\n                if (this.sample.isSampledIn(event)) {\n                    // If the envelope is PageView, reset the internal message count so that we can send internal telemetry for the new page.\n                    if (event.name === applicationinsights_common_1.PageView.envelopeType) {\n                        // TODO(barustum): resetInternalMessageCount once we have support for internal logging\n                        //_InternalLogging.resetInternalMessageCount();\n                    }\n                    if (this.session) {\n                        // If customer did not provide custom session id update the session manager\n                        if (typeof this.session.id !== \"string\") {\n                            this._sessionManager.update();\n                        }\n                    }\n                    this._processTelemetryInternal(event);\n                }\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                    this._nextPlugin.processTelemetry(event);\n                }\n            }\n        };\n        /**\n         * Sets the next plugin that comes after this plugin\n         * @param nextPlugin The next plugin\n         */\n        PropertiesPlugin.prototype.setNextPlugin = function (nextPlugin) {\n            this._nextPlugin = nextPlugin;\n        };\n        PropertiesPlugin.prototype._processTelemetryInternal = function (event) {\n            var tagsItem = {};\n            if (this.session) {\n                // If customer set id, apply his context; otherwise apply context generated from cookies \n                if (typeof this.session.id === \"string\") {\n                    PropertiesPlugin._applySessionContext(tagsItem, this.session);\n                }\n                else {\n                    PropertiesPlugin._applySessionContext(tagsItem, this._sessionManager.automaticSession);\n                }\n            }\n            // set part A  fields\n            PropertiesPlugin._applyApplicationContext(tagsItem, this.application);\n            PropertiesPlugin._applyDeviceContext(tagsItem, this.device);\n            PropertiesPlugin._applyInternalContext(tagsItem, this.internal);\n            PropertiesPlugin._applyLocationContext(tagsItem, this.location);\n            PropertiesPlugin._applySampleContext(tagsItem, this.sample);\n            PropertiesPlugin._applyUserContext(tagsItem, this.user);\n            PropertiesPlugin._applyOperationContext(tagsItem, this.operation);\n            event.tags.push(tagsItem);\n        };\n        PropertiesPlugin._applySessionContext = function (tags, sessionContext) {\n            if (sessionContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof sessionContext.id === \"string\") {\n                    tags[tagKeys.sessionId] = sessionContext.id;\n                }\n                if (typeof sessionContext.isFirst !== \"undefined\") {\n                    tags[tagKeys.sessionIsFirst] = sessionContext.isFirst;\n                }\n            }\n        };\n        PropertiesPlugin._applyApplicationContext = function (tagsItem, appContext) {\n            if (appContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof appContext.ver === \"string\") {\n                    tagsItem[tagKeys.applicationVersion] = appContext.ver;\n                }\n                if (typeof appContext.build === \"string\") {\n                    tagsItem[tagKeys.applicationBuild] = appContext.build;\n                }\n            }\n        };\n        PropertiesPlugin._applyDeviceContext = function (tagsItem, deviceContext) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            if (deviceContext) {\n                if (typeof deviceContext.id === \"string\") {\n                    tagsItem[tagKeys.deviceId] = deviceContext.id;\n                }\n                if (typeof deviceContext.ip === \"string\") {\n                    tagsItem[tagKeys.deviceIp] = deviceContext.ip;\n                }\n                if (typeof deviceContext.language === \"string\") {\n                    tagsItem[tagKeys.deviceLanguage] = deviceContext.language;\n                }\n                if (typeof deviceContext.locale === \"string\") {\n                    tagsItem[tagKeys.deviceLocale] = deviceContext.locale;\n                }\n                if (typeof deviceContext.model === \"string\") {\n                    tagsItem[tagKeys.deviceModel] = deviceContext.model;\n                }\n                if (typeof deviceContext.network !== \"undefined\") {\n                    tagsItem[tagKeys.deviceNetwork] = deviceContext.network;\n                }\n                if (typeof deviceContext.oemName === \"string\") {\n                    tagsItem[tagKeys.deviceOEMName] = deviceContext.oemName;\n                }\n                if (typeof deviceContext.os === \"string\") {\n                    tagsItem[tagKeys.deviceOS] = deviceContext.os;\n                }\n                if (typeof deviceContext.osversion === \"string\") {\n                    tagsItem[tagKeys.deviceOSVersion] = deviceContext.osversion;\n                }\n                if (typeof deviceContext.resolution === \"string\") {\n                    tagsItem[tagKeys.deviceScreenResolution] = deviceContext.resolution;\n                }\n                if (typeof deviceContext.type === \"string\") {\n                    tagsItem[tagKeys.deviceType] = deviceContext.type;\n                }\n            }\n        };\n        PropertiesPlugin._applyInternalContext = function (tagsItem, internalContext) {\n            if (internalContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof internalContext.agentVersion === \"string\") {\n                    tagsItem[tagKeys.internalAgentVersion] = internalContext.agentVersion;\n                }\n                if (typeof internalContext.sdkVersion === \"string\") {\n                    tagsItem[tagKeys.internalSdkVersion] = internalContext.sdkVersion;\n                }\n            }\n        };\n        PropertiesPlugin._applyLocationContext = function (tagsItem, locationContext) {\n            if (locationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof locationContext.ip === \"string\") {\n                    tagsItem[tagKeys.locationIp] = locationContext.ip;\n                }\n            }\n        };\n        PropertiesPlugin._applySampleContext = function (tagsItem, sampleContext) {\n            if (sampleContext) {\n                tagsItem.sampleRate = sampleContext.sampleRate;\n            }\n        };\n        PropertiesPlugin._applyOperationContext = function (tagsItem, operationContext) {\n            if (operationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof operationContext.id === \"string\") {\n                    tagsItem[tagKeys.operationId] = operationContext.id;\n                }\n                if (typeof operationContext.name === \"string\") {\n                    tagsItem[tagKeys.operationName] = operationContext.name;\n                }\n                if (typeof operationContext.parentId === \"string\") {\n                    tagsItem[tagKeys.operationParentId] = operationContext.parentId;\n                }\n                if (typeof operationContext.rootId === \"string\") {\n                    tagsItem[tagKeys.operationRootId] = operationContext.rootId;\n                }\n                if (typeof operationContext.syntheticSource === \"string\") {\n                    tagsItem[tagKeys.operationSyntheticSource] = operationContext.syntheticSource;\n                }\n            }\n        };\n        PropertiesPlugin._applyUserContext = function (tagsItem, userContext) {\n            if (userContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof userContext.accountId === \"string\") {\n                    tagsItem[tagKeys.userAccountId] = userContext.accountId;\n                }\n                if (typeof userContext.agent === \"string\") {\n                    tagsItem[tagKeys.userAgent] = userContext.agent;\n                }\n                if (typeof userContext.id === \"string\") {\n                    tagsItem[tagKeys.userId] = userContext.id;\n                }\n                if (typeof userContext.authenticatedId === \"string\") {\n                    tagsItem[tagKeys.userAuthUserId] = userContext.authenticatedId;\n                }\n                if (typeof userContext.storeRegion === \"string\") {\n                    tagsItem[tagKeys.userStoreRegion] = userContext.storeRegion;\n                }\n            }\n        };\n        return PropertiesPlugin;\n    }());\n    exports.default = PropertiesPlugin;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PropertiesPlugin.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./HashCodeScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, HashCodeScoreGenerator_1, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var SamplingScoreGenerator = /** @class */ (function () {\n        function SamplingScoreGenerator() {\n            this.hashCodeGeneragor = new HashCodeScoreGenerator_1.HashCodeScoreGenerator();\n        }\n        SamplingScoreGenerator.prototype.getSamplingScore = function (envelope) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            var score = 0;\n            if (envelope.tags[tagKeys.userId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.userId]);\n            }\n            else if (envelope.tags[tagKeys.operationId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.operationId]);\n            }\n            else {\n                // tslint:disable-next-line:insecure-random\n                score = Math.random();\n            }\n            return score;\n        };\n        return SamplingScoreGenerator;\n    }());\n    exports.SamplingScoreGenerator = SamplingScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SamplingScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PropertiesPlugin */ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PropertiesPlugin_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.PropertiesPlugin = PropertiesPlugin_1.default;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-properties-js.js.map\n\n/***/ }),\n\n/***/ 0:\n/*!**********************************!*\\\n  !*** multi ./amd/bundle/Init.js ***!\n  \\**********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./amd/bundle/Init.js */\"./amd/bundle/Init.js\");\n\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=aisdk.0.0.18.js.map"
  },
  {
    "path": "AISKU/dist-history/aisdk.0.0.19.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./amd/bundle/Init.js\":\n/*!****************************!*\\\n  !*** ./amd/bundle/Init.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! ./Initialization */ \"./amd/bundle/Initialization.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_analytics_js_1, Initialization_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    //should be global function that should load as soon as SDK loads\n    try {\n        // E2E sku on load initializes core and pipeline using snippet as input for configuration\n        var aiName;\n        if (typeof window !== \"undefined\" && typeof JSON !== \"undefined\") {\n            // get snippet or initialize to an empty object\n            // get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation\n            aiName = window[\"appInsightsSDK\"];\n            if (window[aiName] === undefined) {\n                // if no snippet is present, initialize default values\n                applicationinsights_analytics_js_1.ApplicationInsights.appInsightsDefaultConfig = Initialization_1.Initialization.getDefaultConfig();\n            }\n            else {\n                if (window[aiName].initialize) {\n                    // this is the typical case for browser+snippet\n                    var snippet = window[aiName] || {};\n                    // overwrite snippet with full appInsights\n                    var initialization = new Initialization_1.Initialization(snippet);\n                    var appInsightsLocal = initialization.loadAppInsights();\n                    // apply full appInsights to the global instance that was initialized in the snippet\n                    for (var field in appInsightsLocal) {\n                        snippet[field] = appInsightsLocal[field];\n                    }\n                    // Empty queue of all api calls logged prior to sdk download\n                    initialization.emptyQueue();\n                    initialization.addHousekeepingBeforeUnload(appInsightsLocal);\n                }\n            }\n        }\n    }\n    catch (e) {\n        // TODO: Find better place to warn to console when SDK initialization fails\n        if (console) {\n            console.warn('Failed to initialize AppInsights JS SDK for instance ' + aiName + e.message);\n        }\n    }\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./amd/bundle/Initialization.js\":\n/*!**************************************!*\\\n  !*** ./amd/bundle/Initialization.js ***!\n  \\**************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-analytics-js */ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-channel-js */ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\"), __webpack_require__(/*! applicationinsights-properties-js */ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\"), __webpack_require__(/*! applicationinsights-dependencies-js */ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_analytics_js_1, applicationinsights_common_1, applicationinsights_channel_js_1, applicationinsights_properties_js_1, applicationinsights_dependencies_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    ;\n    var Initialization = /** @class */ (function () {\n        function Initialization(snippet) {\n            // initialize the queue and config in case they are undefined\n            snippet.queue = snippet.queue || [];\n            var config = snippet.config || {};\n            // ensure instrumentationKey is specified\n            if (config && !config.instrumentationKey) {\n                config = snippet;\n                applicationinsights_analytics_js_1.ApplicationInsights.Version = \"2.0.0\";\n            }\n            this.appInsights = new applicationinsights_analytics_js_1.ApplicationInsights();\n            // set default values using config passed through snippet\n            config = Initialization.getDefaultConfig(config, this.appInsights.identifier);\n            this.properties = new applicationinsights_properties_js_1.PropertiesPlugin();\n            this.dependencies = new applicationinsights_dependencies_js_1.AjaxPlugin();\n            this.snippet = snippet;\n            this.config = config;\n        }\n        // Analytics Plugin\n        Initialization.prototype.trackPageView = function (pageView, customProperties) {\n            this.appInsights.trackPageView(pageView, customProperties);\n        };\n        Initialization.prototype.trackPageViewPerformance = function (pageViewPerformance, customProperties) {\n            this.appInsights.trackPageViewPerformance(pageViewPerformance, customProperties);\n        };\n        Initialization.prototype.trackException = function (exception, customProperties) {\n            this.appInsights.trackException(exception, customProperties);\n        };\n        Initialization.prototype._onerror = function (exception) {\n            this.appInsights._onerror(exception);\n        };\n        Initialization.prototype.trackTrace = function (trace, customProperties) {\n            this.appInsights.trackTrace(trace, customProperties);\n        };\n        Initialization.prototype.trackMetric = function (metric, customProperties) {\n            this.appInsights.trackMetric(metric, customProperties);\n        };\n        Initialization.prototype.startTrackPage = function (name) {\n            this.appInsights.startTrackPage(name);\n        };\n        Initialization.prototype.stopTrackPage = function (name, url, customProperties) {\n            this.appInsights.stopTrackPage(name, url, customProperties);\n        };\n        Initialization.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            return this.appInsights.addTelemetryInitializer(telemetryInitializer);\n        };\n        // Properties Plugin\n        Initialization.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            this.properties.user.setAuthenticatedUserContext(authenticatedUserId, accountId, storeInCookie);\n        };\n        Initialization.prototype.clearAuthenticatedUserContext = function () {\n            this.properties.user.clearAuthenticatedUserContext();\n        };\n        // Dependencies Plugin\n        Initialization.prototype.trackDependencyData = function (dependency, customProperties, systemProperties) {\n            this.dependencies.trackDependencyData(dependency, customProperties, systemProperties);\n        };\n        Initialization.prototype.loadAppInsights = function () {\n            this.core = new applicationinsights_core_js_1.AppInsightsCore();\n            var extensions = [];\n            var appInsightsChannel = new applicationinsights_channel_js_1.Sender();\n            extensions.push(appInsightsChannel);\n            extensions.push(this.properties);\n            extensions.push(this.dependencies);\n            extensions.push(this.appInsights);\n            // initialize core\n            this.core.initialize(this.config, extensions);\n            return this;\n        };\n        Initialization.prototype.emptyQueue = function () {\n            // call functions that were queued before the main script was loaded\n            try {\n                if (applicationinsights_common_1.Util.isArray(this.snippet.queue)) {\n                    // note: do not check length in the for-loop conditional in case something goes wrong and the stub methods are not overridden.\n                    var length = this.snippet.queue.length;\n                    for (var i = 0; i < length; i++) {\n                        var call = this.snippet.queue[i];\n                        call();\n                    }\n                    this.snippet.queue = undefined;\n                    delete this.snippet.queue;\n                }\n            }\n            catch (exception) {\n                var properties = {};\n                if (exception && typeof exception.toString === \"function\") {\n                    properties.exception = exception.toString();\n                }\n                // need from core\n                // Microsoft.ApplicationInsights._InternalLogging.throwInternal(\n                //     LoggingSeverity.WARNING,\n                //     _InternalMessageId.FailedToSendQueuedTelemetry,\n                //     \"Failed to send queued telemetry\",\n                //     properties);\n            }\n        };\n        Initialization.prototype.pollInteralLogs = function (appInsightsInstance) {\n            // return setInterval(() => {\n            //     var queue: Array<_InternalLogMessage> = ApplicationInsights._InternalLogging.queue;\n            //     var length = queue.length;\n            //     for (var i = 0; i < length; i++) {\n            //         appInsightsInstance.trackTrace(queue[i].message);\n            //     }\n            //     queue.length = 0;\n            // }, this.config.diagnosticLogInterval);\n        };\n        Initialization.prototype.addHousekeepingBeforeUnload = function (appInsightsInstance) {\n            // Add callback to push events when the user navigates away\n            if (!appInsightsInstance.appInsights.config.disableFlushOnBeforeUnload && ('onbeforeunload' in window)) {\n                var performHousekeeping = function () {\n                    // Adds the ability to flush all data before the page unloads.\n                    // Note: This approach tries to push an async request with all the pending events onbeforeunload.\n                    // Firefox does not respect this.Other browsers DO push out the call with < 100% hit rate.\n                    // Telemetry here will help us analyze how effective this approach is.\n                    // Another approach would be to make this call sync with a acceptable timeout to reduce the \n                    // impact on user experience.\n                    //appInsightsInstance.context._sender.triggerSend();\n                    appInsightsInstance.appInsights.core.getTransmissionControls().forEach(function (queues) {\n                        queues.forEach(function (channel) { return channel.flush(true); });\n                    });\n                    // Back up the current session to local storage\n                    // This lets us close expired sessions after the cookies themselves expire\n                    // Todo: move this against interface behavior\n                    if (this.core.extensions[\"AppInsightsPropertiesPlugin\"] &&\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager) {\n                        this.core.extensions[\"AppInsightsPropertiesPlugin\"]._sessionManager.backup();\n                    }\n                };\n                if (!applicationinsights_common_1.Util.addEventHandler('beforeunload', performHousekeeping)) {\n                    this.core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToAddHandlerForOnBeforeUnload, 'Could not add handler for beforeunload');\n                }\n            }\n        };\n        Initialization.getDefaultConfig = function (configuration, identifier) {\n            if (!configuration) {\n                configuration = {};\n            }\n            if (configuration) {\n                identifier = identifier ? identifier : \"ApplicationInsightsAnalytics\";\n            }\n            // Undefined checks\n            if (!configuration.extensionConfig) {\n                configuration.extensionConfig = {};\n            }\n            if (!configuration.extensionConfig[identifier]) {\n                configuration.extensionConfig[identifier] = {};\n            }\n            var extensionConfig = configuration.extensionConfig[identifier]; // ref to main config\n            // set default values\n            configuration.endpointUrl = configuration.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\";\n            extensionConfig.sessionRenewalMs = 30 * 60 * 1000;\n            extensionConfig.sessionExpirationMs = 24 * 60 * 60 * 1000;\n            extensionConfig.enableDebug = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableDebug);\n            extensionConfig.disableExceptionTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableExceptionTracking);\n            extensionConfig.consoleLoggingLevel = extensionConfig.consoleLoggingLevel || 1; // Show only CRITICAL level\n            extensionConfig.telemetryLoggingLevel = extensionConfig.telemetryLoggingLevel || 0; // Send nothing\n            extensionConfig.diagnosticLogInterval = extensionConfig.diagnosticLogInterval || 10000;\n            extensionConfig.autoTrackPageVisitTime = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.autoTrackPageVisitTime);\n            if (isNaN(extensionConfig.samplingPercentage) || extensionConfig.samplingPercentage <= 0 || extensionConfig.samplingPercentage >= 100) {\n                extensionConfig.samplingPercentage = 100;\n            }\n            extensionConfig.disableAjaxTracking = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableAjaxTracking);\n            extensionConfig.maxAjaxCallsPerView = !isNaN(extensionConfig.maxAjaxCallsPerView) ? extensionConfig.maxAjaxCallsPerView : 500;\n            extensionConfig.disableCorrelationHeaders = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableCorrelationHeaders);\n            extensionConfig.correlationHeaderExcludedDomains = extensionConfig.correlationHeaderExcludedDomains || [\n                \"*.blob.core.windows.net\",\n                \"*.blob.core.chinacloudapi.cn\",\n                \"*.blob.core.cloudapi.de\",\n                \"*.blob.core.usgovcloudapi.net\"\n            ];\n            extensionConfig.disableFlushOnBeforeUnload = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.disableFlushOnBeforeUnload);\n            extensionConfig.isCookieUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isCookieUseDisabled);\n            extensionConfig.isStorageUseDisabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isStorageUseDisabled);\n            extensionConfig.isBrowserLinkTrackingEnabled = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.isBrowserLinkTrackingEnabled);\n            extensionConfig.enableCorsCorrelation = applicationinsights_common_1.Util.stringToBoolOrDefault(extensionConfig.enableCorsCorrelation);\n            return configuration;\n        };\n        return Initialization;\n    }());\n    exports.Initialization = Initialization;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * ApplicationInsights.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Telemetry/PageViewManager */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, PageViewManager_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var durationProperty = \"duration\";\n    var ApplicationInsights = /** @class */ (function () {\n        function ApplicationInsights() {\n            this.identifier = \"ApplicationInsightsAnalytics\";\n            this.priority = 160; // take from reserved priority range 100- 200\n            this._isInitialized = false;\n            // Counts number of trackAjax invokations.\n            // By default we only monitor X ajax call per view to avoid too much load.\n            // Default value is set in config.\n            // This counter keeps increasing even after the limit is reached.\n            this._trackAjaxAttempts = 0;\n            this.initialize = this._initialize.bind(this);\n        }\n        ApplicationInsights.prototype.processTelemetry = function (env) {\n            var doNotSendItem = false;\n            try {\n                var telemetryInitializersCount = this._telemetryInitializers.length;\n                for (var i = 0; i < telemetryInitializersCount; ++i) {\n                    var telemetryInitializer = this._telemetryInitializers[i];\n                    if (telemetryInitializer) {\n                        if (telemetryInitializer.apply(null, [env]) === false) {\n                            doNotSendItem = true;\n                            break;\n                        }\n                    }\n                }\n            }\n            catch (e) {\n                doNotSendItem = true;\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryInitializerFailed, \"One of telemetry initializers failed, telemetry item will not be sent: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) }, true);\n            }\n            if (!doNotSendItem && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(env);\n            }\n        };\n        ApplicationInsights.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * @description Log a diagnostic message\n         * @param {ITraceTelemetry} trace\n         * @param {{[key: string]: any}} [customProperties]\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackTrace = function (trace, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(trace, applicationinsights_common_1.Trace.dataType, applicationinsights_common_1.Trace.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TrackTraceFailed, \"trackTrace failed, trace will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Log a numeric value that is not associated with a specific event. Typically\n         * used to send regular reports of performance indicators. To send single measurement, just\n         * use the name and average fields of {@link IMetricTelemetry}. If you take measurements\n         * frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements\n         * and sending the resulting average at intervals\n         * @param {IMetricTelemetry} metric input object argument. Only name and average are mandatory.\n         * @param {{[key: string]: any}} customProperties additional data used to filter metrics in the\n         * portal. Defaults to empty.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackMetric = function (metric, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(metric, applicationinsights_common_1.Metric.dataType, applicationinsights_common_1.Metric.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackMetricFailed, \"trackMetric failed, metric will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs that a page or other item was viewed.\n         * @param IPageViewTelemetry The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param customProperties Additional data used to filter events and metrics. Defaults to empty. If a user wants\n         *                         to provide a custom duration, it'll have to be in customProperties\n         */\n        ApplicationInsights.prototype.trackPageView = function (pageView, customProperties) {\n            try {\n                this._pageViewManager.trackPageView(pageView, customProperties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(pageView.name, pageView.uri);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailed, \"trackPageView failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Create a page view telemetry item and send it to the SDK pipeline through the core.track API\n         * @param pageView Page view item to be sent\n         * @param properties Custom properties (Part C) that a user can add to the telemetry item\n         * @param systemProperties System level properties (Part A) that a user can add to the telemetry item\n         */\n        ApplicationInsights.prototype.sendPageViewInternal = function (pageView, properties, systemProperties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageView, applicationinsights_common_1.PageView.dataType, applicationinsights_common_1.PageView.envelopeType, this._logger, properties, systemProperties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n            // reset ajaxes counter\n            this._trackAjaxAttempts = 0;\n        };\n        ApplicationInsights.prototype.sendPageViewPerformanceInternal = function (pageViewPerformance, properties) {\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(pageViewPerformance, applicationinsights_common_1.PageViewPerformance.dataType, applicationinsights_common_1.PageViewPerformance.envelopeType, this._logger, properties);\n            // set instrumentation key\n            this._setTelemetryNameAndIKey(telemetryItem);\n            this.core.track(telemetryItem);\n        };\n        ApplicationInsights.prototype.trackPageViewPerformance = function (pageViewPerformance, customProperties) {\n            var item = new applicationinsights_common_1.PageViewPerformance(this.core.logger, pageViewPerformance.name, pageViewPerformance.url, undefined, customProperties);\n            this.sendPageViewPerformanceInternal(item, customProperties);\n        };\n        /**\n         * Starts timing how long the user views a page or other item. Call this when the page opens.\n         * This method doesn't send any telemetry. Call {@link stopTrackTelemetry} to log the page when it closes.\n         * @param name A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n         */\n        ApplicationInsights.prototype.startTrackPage = function (name) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                this._pageTracking.start(name);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StartTrackFailed, \"startTrackPage failed, page view may not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Logs how long a page or other item was visible, after {@link startTrackPage}. Call this when the page closes.\n         * @param name The string you used as the name in startTrackPage. Defaults to the document title.\n         * @param url A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n         * @param properties Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *                   Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric\n         */\n        ApplicationInsights.prototype.stopTrackPage = function (name, url, properties) {\n            try {\n                if (typeof name !== \"string\") {\n                    name = window.document && window.document.title || \"\";\n                }\n                if (typeof url !== \"string\") {\n                    url = window.location && window.location.href || \"\";\n                }\n                this._pageTracking.stop(name, url, properties);\n                if (this.config.autoTrackPageVisitTime) {\n                    this._pageVisitTimeManager.trackPreviousPageVisit(name, url);\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.StopTrackFailed, \"stopTrackPage failed, page view will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * Log an exception you have caught.\n         *\n         * @param {IExceptionTelemetry} exception   Object which contains exception to be sent\n         * @param {{[key: string]: any}} customProperties   Additional data used to filter pages and metrics in the portal. Defaults to empty.\n         *\n         * Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric.\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype.trackException = function (exception, customProperties) {\n            try {\n                var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, customProperties);\n                this._setTelemetryNameAndIKey(telemetryItem);\n                this.core.track(telemetryItem);\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackExceptionFailed, \"trackException failed, exception will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        /**\n         * @description Custom error handler for Application Insights Analytics\n         * @param {IAutoExceptionTelemetry} exception\n         * @memberof ApplicationInsights\n         */\n        ApplicationInsights.prototype._onerror = function (exception) {\n            try {\n                var properties = {\n                    url: (exception && exception.url) || document.URL,\n                    lineNumber: exception.lineNumber,\n                    columnNumber: exception.columnNumber,\n                    message: exception.message\n                };\n                if (applicationinsights_common_1.Util.isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception.error)) {\n                    this._sendCORSException(properties.url);\n                }\n                else {\n                    if (!applicationinsights_common_1.Util.isError(exception.error)) {\n                        var stack = \"window.onerror@\" + properties.url + \":\" + exception.lineNumber + \":\" + (exception.columnNumber || 0);\n                        exception.error = new Error(exception.message);\n                        exception.error.stack = stack;\n                    }\n                    this.trackException({ error: exception.error, severityLevel: applicationinsights_common_1.SeverityLevel.Error }, properties);\n                }\n            }\n            catch (e) {\n                var errorString = exception.error ?\n                    (exception.error.name + \", \" + exception.error.message)\n                    : \"null\";\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ExceptionWhileLoggingError, \"_onError threw exception while logging error, error will not be collected: \"\n                    + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e), errorString: errorString });\n            }\n        };\n        ApplicationInsights.prototype.addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._initialize = function (config, core, extensions) {\n            var _this = this;\n            if (this._isInitialized) {\n                return;\n            }\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(core)) {\n                throw Error(\"Error initializing\");\n            }\n            this.core = core;\n            this._logger = core.logger;\n            this._globalconfig = {\n                instrumentationKey: config.instrumentationKey,\n                endpointUrl: config.endpointUrl\n            };\n            this.config = config.extensionConfig && config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n            // load default values if specified\n            var defaults = ApplicationInsights.appInsightsDefaultConfig;\n            if (defaults !== undefined) {\n                if (defaults.extensions && defaults.extensions[this.identifier]) {\n                    for (var field in defaults.extensions[this.identifier]) {\n                        // for each unspecified field, set the default value\n                        if (this.config[field] === undefined) {\n                            this.config[field] = defaults[field];\n                        }\n                    }\n                }\n                if (this._globalconfig) {\n                    for (var field in defaults) {\n                        if (this._globalconfig[field] === undefined) {\n                            this._globalconfig[field] = defaults[field];\n                        }\n                    }\n                }\n            }\n            // Todo: move this out of static state\n            if (this.config.isCookieUseDisabled) {\n                applicationinsights_common_1.Util.disableCookies();\n            }\n            // Todo: move this out of static state\n            if (this.config.isStorageUseDisabled) {\n                applicationinsights_common_1.Util.disableStorage();\n            }\n            var configGetters = {\n                instrumentationKey: function () { return config.instrumentationKey; },\n                accountId: function () { return _this.config.accountId; },\n                sessionRenewalMs: function () { return _this.config.sessionRenewalMs; },\n                sessionExpirationMs: function () { return _this.config.sessionExpirationMs; },\n                sampleRate: function () { return _this.config.samplingPercentage; },\n                cookieDomain: function () { return _this.config.cookieDomain; },\n                sdkExtension: function () { return _this.config.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return _this.config.isBrowserLinkTrackingEnabled; },\n                appId: function () { return _this.config.appId; }\n            };\n            this._pageViewManager = new PageViewManager_1.PageViewManager(this, this.config.overridePageViewDuration, this.core);\n            this._telemetryInitializers = [];\n            this._addDefaultTelemetryInitializers(configGetters);\n            // initialize page view timing\n            this._pageTracking = new Timing(this._logger, \"trackPageView\");\n            this._pageTracking.action = function (name, url, duration, properties) {\n                var pageViewItem = {\n                    name: name,\n                    uri: url\n                };\n                // duration must be a custom property in order for the collector to extract it\n                if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(properties)) {\n                    properties = {};\n                }\n                properties[durationProperty] = duration;\n                _this.sendPageViewInternal(pageViewItem, properties);\n            };\n            if (this.config.disableExceptionTracking === false &&\n                !this.config.autoExceptionInstrumented) {\n                // We want to enable exception auto collection and it has not been done so yet\n                var onerror_1 = \"onerror\";\n                var originalOnError_1 = window[onerror_1];\n                var instance_1 = this;\n                window.onerror = function (message, url, lineNumber, columnNumber, error) {\n                    var handled = originalOnError_1 && originalOnError_1(message, url, lineNumber, columnNumber, error);\n                    if (handled !== true) {\n                        instance_1._onerror({\n                            message: message,\n                            url: url,\n                            lineNumber: lineNumber,\n                            columnNumber: columnNumber,\n                            error: error\n                        });\n                    }\n                    return handled;\n                };\n                this.config.autoExceptionInstrumented = true;\n            }\n            this._isInitialized = true;\n        };\n        ApplicationInsights.prototype._addDefaultTelemetryInitializers = function (configGetters) {\n            if (!configGetters.isBrowserLinkTrackingEnabled()) {\n                var browserLinkPaths_1 = ['/browserLinkSignalR/', '/__browserLink/'];\n                var dropBrowserLinkRequests = function (envelope) {\n                    if (envelope.baseType === applicationinsights_common_1.RemoteDependencyData.dataType) {\n                        var remoteData = envelope.baseData;\n                        if (remoteData) {\n                            for (var i = 0; i < browserLinkPaths_1.length; i++) {\n                                if (remoteData.absoluteUrl && remoteData.absoluteUrl.indexOf(browserLinkPaths_1[i]) >= 0) {\n                                    return false;\n                                }\n                            }\n                        }\n                    }\n                    return true;\n                };\n                this._addTelemetryInitializer(dropBrowserLinkRequests);\n            }\n        };\n        ApplicationInsights.prototype._addTelemetryInitializer = function (telemetryInitializer) {\n            this._telemetryInitializers.push(telemetryInitializer);\n        };\n        ApplicationInsights.prototype._sendCORSException = function (url) {\n            var exception = {\n                message: \"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\",\n                url: url,\n                lineNumber: 0,\n                columnNumber: 0,\n                error: undefined\n            };\n            var telemetryItem = applicationinsights_common_1.TelemetryItemCreator.create(exception, applicationinsights_common_1.Exception.dataType, applicationinsights_common_1.Exception.envelopeType, this._logger, { url: url });\n            this.core.track(telemetryItem);\n        };\n        // Mutate telemetryItem inplace to add boilerplate iKey & name info\n        ApplicationInsights.prototype._setTelemetryNameAndIKey = function (telemetryItem) {\n            telemetryItem.instrumentationKey = this._globalconfig.instrumentationKey;\n            var iKeyNoDashes = this._globalconfig.instrumentationKey.replace(/-/g, \"\");\n            telemetryItem.name = telemetryItem.name.replace(\"{0}\", iKeyNoDashes);\n        };\n        ApplicationInsights.Version = \"2.0.1-beta\";\n        return ApplicationInsights;\n    }());\n    exports.ApplicationInsights = ApplicationInsights;\n    /**\n     * Used to record timed events and page views.\n     */\n    var Timing = /** @class */ (function () {\n        function Timing(logger, name) {\n            this._name = name;\n            this._events = {};\n            this._logger = logger;\n        }\n        Timing.prototype.start = function (name) {\n            if (typeof this._events[name] !== \"undefined\") {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StartCalledMoreThanOnce, \"start was called more than once for this event without calling stop.\", { name: this._name, key: name }, true);\n            }\n            this._events[name] = +new Date;\n        };\n        Timing.prototype.stop = function (name, url, properties) {\n            var start = this._events[name];\n            if (isNaN(start)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StopCalledWithoutStart, \"stop was called without a corresponding start.\", { name: this._name, key: name }, true);\n            }\n            else {\n                var end = +new Date;\n                var duration = applicationinsights_common_1.PageViewPerformance.getDuration(start, end);\n                this.action(name, url, duration, properties);\n            }\n            delete this._events[name];\n            this._events[name] = undefined;\n        };\n        return Timing;\n    }());\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ApplicationInsights.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/Telemetry/PageViewManager.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Class encapsulates sending page views and page view performance telemetry.\n    */\n    var PageViewManager = /** @class */ (function () {\n        function PageViewManager(appInsights, overridePageViewDuration, core) {\n            this.pageViewPerformanceSent = false;\n            this.overridePageViewDuration = false;\n            this.overridePageViewDuration = overridePageViewDuration;\n            this.appInsights = appInsights;\n            if (core) {\n                this._channel = function () { return (core.getTransmissionControls()); };\n                this._logger = core.logger;\n            }\n        }\n        /**\n        * Currently supported cases:\n        * 1) (default case) track page view called with default parameters, overridePageViewDuration = false. Page view is sent with page view performance when navigation timing data is available.\n        *    a. If navigation timing is not supported then page view is sent right away with undefined duration. Page view performance is not sent.\n        * 2) overridePageViewDuration = true, custom duration provided. Custom duration is used, page view sends right away.\n        * 3) overridePageViewDuration = true, custom duration NOT provided. Page view is sent right away, duration is time spent from page load till now (or undefined if navigation timing is not supported).\n        * 4) overridePageViewDuration = false, custom duration is provided. Page view is sent right away with custom duration.\n        *\n        * In all cases page view performance is sent once (only for the 1st call of trackPageView), or not sent if navigation timing is not supported.\n        */\n        PageViewManager.prototype.trackPageView = function (pageView, customProperties) {\n            var _this = this;\n            var name = pageView.name;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(name) || typeof name !== \"string\") {\n                pageView.name = window.document && window.document.title || \"\";\n            }\n            var uri = pageView.uri;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                pageView.uri = window.location && window.location.href || \"\";\n            }\n            // case 1a. if performance timing is not supported by the browser, send the page view telemetry with the duration provided by the user. If the user\n            // do not provide the duration, set duration to undefined\n            // Also this is case 4\n            if (!applicationinsights_common_1.PageViewPerformance.isPerformanceTimingSupported()) {\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                // no navigation timing (IE 8, iOS Safari 8.4, Opera Mini 8 - see http://caniuse.com/#feat=nav-timing)\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NavigationTimingNotSupported, \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                return;\n            }\n            var pageViewSent = false;\n            var customDuration = undefined;\n            // if the performance timing is supported by the browser, calculate the custom duration\n            var start = applicationinsights_common_1.PageViewPerformance.getPerformanceTiming().navigationStart;\n            customDuration = applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date);\n            if (!applicationinsights_common_1.PageViewPerformance.shouldCollectDuration(customDuration)) {\n                customDuration = undefined;\n            }\n            // if the user has provided duration, send a page view telemetry with the provided duration. Otherwise, if\n            // overridePageViewDuration is set to true, send a page view telemetry with the custom duration calculated earlier\n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties.duration)) {\n                duration = customProperties.duration;\n            }\n            if (this.overridePageViewDuration || !isNaN(duration)) {\n                if (isNaN(duration)) {\n                    // case 3\n                    if (!customProperties) {\n                        customProperties = {};\n                    }\n                    customProperties[\"duration\"] = customDuration;\n                }\n                // case 2\n                this.appInsights.sendPageViewInternal(pageView, customProperties);\n                this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                pageViewSent = true;\n            }\n            // now try to send the page view performance telemetry\n            var maxDurationLimit = 60000;\n            if (!customProperties) {\n                customProperties = {};\n            }\n            var handle = setInterval((function () {\n                try {\n                    if (applicationinsights_common_1.PageViewPerformance.isPerformanceTimingDataReady()) {\n                        clearInterval(handle);\n                        var pageViewPerformance = new applicationinsights_common_1.PageViewPerformance(_this._logger, name, uri, null);\n                        if (!pageViewPerformance.getIsValid() && !pageViewSent) {\n                            // If navigation timing gives invalid numbers, then go back to \"override page view duration\" mode.\n                            // That's the best value we can get that makes sense.\n                            customProperties[\"duration\"] = customDuration;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                        else {\n                            if (!pageViewSent) {\n                                customProperties[\"duration\"] = pageViewPerformance.getDurationMs();\n                                _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            }\n                            if (!_this.pageViewPerformanceSent) {\n                                _this.appInsights.sendPageViewPerformanceInternal(pageViewPerformance, customProperties);\n                                _this.pageViewPerformanceSent = true;\n                            }\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                    else if (applicationinsights_common_1.PageViewPerformance.getDuration(start, +new Date) > maxDurationLimit) {\n                        // if performance timings are not ready but we exceeded the maximum duration limit, just log a page view telemetry\n                        // with the maximum duration limit. Otherwise, keep waiting until performance timings are ready\n                        clearInterval(handle);\n                        if (!pageViewSent) {\n                            customProperties[\"duration\"] = maxDurationLimit;\n                            _this.appInsights.sendPageViewInternal(pageView, customProperties);\n                            _this._channel().forEach(function (queues) { queues.forEach(function (q) { return q.flush(true); }); });\n                        }\n                    }\n                }\n                catch (e) {\n                    _this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TrackPVFailedCalc, \"trackPageView failed on page load calculation: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }), 100);\n        };\n        return PageViewManager;\n    }());\n    exports.PageViewManager = PageViewManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-analytics-js/bundle/applicationinsights-analytics-js.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK/ApplicationInsights */ \"./node_modules/applicationinsights-analytics-js/bundle/JavaScriptSDK/ApplicationInsights.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ApplicationInsights_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ApplicationInsights = ApplicationInsights_1.ApplicationInsights;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-analytics-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ContextTagKeys = [\n        \"ai.application.ver\",\n        \"ai.application.build\",\n        \"ai.application.typeId\",\n        \"ai.application.applicationId\",\n        \"ai.application.layer\",\n        \"ai.device.id\",\n        \"ai.device.ip\",\n        \"ai.device.language\",\n        \"ai.device.locale\",\n        \"ai.device.model\",\n        \"ai.device.friendlyName\",\n        \"ai.device.network\",\n        \"ai.device.networkName\",\n        \"ai.device.oemName\",\n        \"ai.device.os\",\n        \"ai.device.osVersion\",\n        \"ai.device.roleInstance\",\n        \"ai.device.roleName\",\n        \"ai.device.screenResolution\",\n        \"ai.device.type\",\n        \"ai.device.machineName\",\n        \"ai.device.vmName\",\n        \"ai.device.browser\",\n        \"ai.device.browserVersion\",\n        \"ai.location.ip\",\n        \"ai.location.country\",\n        \"ai.location.province\",\n        \"ai.location.city\",\n        \"ai.operation.id\",\n        \"ai.operation.name\",\n        \"ai.operation.parentId\",\n        \"ai.operation.rootId\",\n        \"ai.operation.syntheticSource\",\n        \"ai.operation.correlationVector\",\n        \"ai.session.id\",\n        \"ai.session.isFirst\",\n        \"ai.session.isNew\",\n        \"ai.user.accountAcquisitionDate\",\n        \"ai.user.accountId\",\n        \"ai.user.userAgent\",\n        \"ai.user.id\",\n        \"ai.user.storeRegion\",\n        \"ai.user.authUserId\",\n        \"ai.user.anonUserAcquisitionDate\",\n        \"ai.user.authUserAcquisitionDate\",\n        \"ai.cloud.name\",\n        \"ai.cloud.role\",\n        \"ai.cloud.roleVer\",\n        \"ai.cloud.roleInstance\",\n        \"ai.cloud.environment\",\n        \"ai.cloud.location\",\n        \"ai.cloud.deploymentUnit\",\n        \"ai.internal.sdkVersion\",\n        \"ai.internal.agentVersion\",\n        \"ai.internal.nodeName\",\n    ];\n    // these two constants are used to filter out properties not needed when trying to extract custom properties and measurements from the incoming payload\n    var baseType = \"baseType\";\n    var baseData = \"baseData\";\n    var EnvelopeCreator = /** @class */ (function () {\n        function EnvelopeCreator() {\n        }\n        EnvelopeCreator.extractProperties = function (data) {\n            var customProperties = null;\n            for (var key in data) {\n                if (data.hasOwnProperty(key)) {\n                    var value = data[key];\n                    if (typeof value !== \"number\") {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[key] = value;\n                    }\n                }\n            }\n            return customProperties;\n        };\n        EnvelopeCreator.extractPropsAndMeasurements = function (data, properties, measurements) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(data)) {\n                for (var key in data) {\n                    if (data.hasOwnProperty(key)) {\n                        var value = data[key];\n                        if (typeof value === \"number\") {\n                            measurements[key] = value;\n                        }\n                        else {\n                            properties[key] = value;\n                        }\n                    }\n                }\n            }\n        };\n        // TODO: Do we want this to take logger as arg or use this._logger as nonstatic?\n        EnvelopeCreator.createEnvelope = function (logger, envelopeType, telemetryItem, data) {\n            var envelope = new applicationinsights_common_1.Envelope(logger, data, envelopeType);\n            envelope.iKey = telemetryItem.instrumentationKey;\n            var iKeyNoDashes = telemetryItem.instrumentationKey.replace(/-/g, \"\");\n            envelope.name = envelope.name.replace(\"{0}\", iKeyNoDashes);\n            // loop through the envelope ctx (Part A) and pick out the ones that should go in outgoing envelope tags\n            for (var key in telemetryItem.ctx) {\n                if (telemetryItem.ctx.hasOwnProperty(key)) {\n                    if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                        envelope.tags[key] = telemetryItem.ctx[key];\n                    }\n                }\n            }\n            // loop through the envelope tags (extension of Part A) and pick out the ones that should go in outgoing envelope tags\n            telemetryItem.tags.forEach(function (tag) {\n                for (var key in tag) {\n                    if (tag.hasOwnProperty(key)) {\n                        if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                            envelope.tags[key] = tag[key];\n                        }\n                    }\n                }\n            });\n            return envelope;\n        };\n        return EnvelopeCreator;\n    }());\n    exports.EnvelopeCreator = EnvelopeCreator;\n    var DependencyEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(DependencyEnvelopeCreator, _super);\n        function DependencyEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        DependencyEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customMeasurements = {};\n            var customProperties = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var bd = telemetryItem.baseData;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(bd)) {\n                logger.warnToConsole(\"Invalid input for dependency data\");\n                return null;\n            }\n            var id = bd.id;\n            var absoluteUrl = bd.absoluteUrl;\n            var command = bd.commandName;\n            var duration = bd.duration;\n            var success = bd.success;\n            var resultCode = bd.resultCode;\n            var method = bd.method;\n            var baseData = new applicationinsights_common_1.RemoteDependencyData(logger, id, absoluteUrl, command, duration, success, resultCode, method, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.RemoteDependencyData.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.RemoteDependencyData.envelopeType, telemetryItem, data);\n        };\n        DependencyEnvelopeCreator.DependencyEnvelopeCreator = new DependencyEnvelopeCreator();\n        return DependencyEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.DependencyEnvelopeCreator = DependencyEnvelopeCreator;\n    var EventEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(EventEnvelopeCreator, _super);\n        function EventEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            if (telemetryItem.baseType !== applicationinsights_common_1.Event.dataType) {\n                EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.baseData, customProperties, customMeasurements);\n            }\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var eventName = telemetryItem.baseData.name;\n            var baseData = new applicationinsights_common_1.Event(logger, eventName, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Event.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Event.envelopeType, telemetryItem, data);\n        };\n        EventEnvelopeCreator.EventEnvelopeCreator = new EventEnvelopeCreator();\n        return EventEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.EventEnvelopeCreator = EventEnvelopeCreator;\n    var ExceptionEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(ExceptionEnvelopeCreator, _super);\n        function ExceptionEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ExceptionEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var exception = telemetryItem.baseData.error;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var baseData = new applicationinsights_common_1.Exception(logger, exception, customProperties, customMeasurements, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Exception.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Exception.envelopeType, telemetryItem, data);\n        };\n        ExceptionEnvelopeCreator.ExceptionEnvelopeCreator = new ExceptionEnvelopeCreator();\n        return ExceptionEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.ExceptionEnvelopeCreator = ExceptionEnvelopeCreator;\n    var MetricEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(MetricEnvelopeCreator, _super);\n        function MetricEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        MetricEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var name = telemetryItem.baseData.name;\n            var average = telemetryItem.baseData.average;\n            var sampleCount = telemetryItem.baseData.sampleCount;\n            var min = telemetryItem.baseData.min;\n            var max = telemetryItem.baseData.max;\n            var baseData = new applicationinsights_common_1.Metric(logger, name, average, sampleCount, min, max, customProperties);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Metric.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Metric.envelopeType, telemetryItem, data);\n        };\n        MetricEnvelopeCreator.MetricEnvelopeCreator = new MetricEnvelopeCreator();\n        return MetricEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.MetricEnvelopeCreator = MetricEnvelopeCreator;\n    var PageViewEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewEnvelopeCreator, _super);\n        function PageViewEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            // Since duration is not part of the domain properties in Common Schema, extract it from part C \n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data.duration)) {\n                duration = telemetryItem.data.duration;\n                delete telemetryItem.data.duration;\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            // Todo: move IPageViewTelemetry to common as we are missing type checks on baseData here\n            // refUri is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.refUri)) {\n                customProperties[\"refUri\"] = telemetryItem.baseData.refUri;\n            }\n            // pageType is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageType)) {\n                customProperties[\"pageType\"] = telemetryItem.baseData.pageType;\n            }\n            // isLoggedIn is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.isLoggedIn)) {\n                customProperties[\"isLoggedIn\"] = telemetryItem.baseData.isLoggedIn;\n            }\n            // pageTags is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageTags)) {\n                var pageTags = telemetryItem.baseData.pageTags;\n                for (var key in pageTags) {\n                    if (pageTags.hasOwnProperty(key)) {\n                        customProperties[key] = pageTags[key];\n                    }\n                }\n            }\n            var baseData = new applicationinsights_common_1.PageView(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageView.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageView.envelopeType, telemetryItem, data);\n        };\n        PageViewEnvelopeCreator.PageViewEnvelopeCreator = new PageViewEnvelopeCreator();\n        return PageViewEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewEnvelopeCreator = PageViewEnvelopeCreator;\n    var PageViewPerformanceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewPerformanceEnvelopeCreator, _super);\n        function PageViewPerformanceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewPerformanceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            var duration = telemetryItem.baseData.duration;\n            var baseData = new applicationinsights_common_1.PageViewPerformance(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageViewPerformance.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageViewPerformance.envelopeType, telemetryItem, data);\n        };\n        PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator = new PageViewPerformanceEnvelopeCreator();\n        return PageViewPerformanceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewPerformanceEnvelopeCreator = PageViewPerformanceEnvelopeCreator;\n    var TraceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(TraceEnvelopeCreator, _super);\n        function TraceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        TraceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var message = telemetryItem.baseData.message;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var baseData = new applicationinsights_common_1.Trace(logger, message, customProperties, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Trace.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Trace.envelopeType, telemetryItem, data);\n        };\n        TraceEnvelopeCreator.TraceEnvelopeCreator = new TraceEnvelopeCreator();\n        return TraceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.TraceEnvelopeCreator = TraceEnvelopeCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EnvelopeCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Offline.js ***!\n  \\***********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * @description Monitors browser for offline events\n     * @export default - Offline: Static instance of OfflineListener\n     * @class OfflineListener\n     */\n    var OfflineListener = /** @class */ (function () {\n        function OfflineListener() {\n            this._onlineStatus = true;\n            if (window && window.addEventListener) {\n                window.addEventListener('online', this._setOnline.bind(this), false);\n                window.addEventListener('offline', this._setOffline.bind(this), false);\n                this.isListening = true;\n            }\n            else if (document && document.body) {\n                document.body.ononline = this._setOnline.bind(this);\n                document.body.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else if (document) {\n                document.ononline = this._setOnline.bind(this);\n                document.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else {\n                // Could not find a place to add event listener\n                this.isListening = false;\n            }\n        }\n        OfflineListener.prototype._setOnline = function () {\n            this._onlineStatus = true;\n        };\n        OfflineListener.prototype._setOffline = function () {\n            this._onlineStatus = false;\n        };\n        OfflineListener.prototype.isOnline = function () {\n            if (this.isListening) {\n                return this._onlineStatus;\n            }\n            else if (navigator) {\n                return navigator.onLine;\n            }\n            else {\n                // Cannot determine online status - report as online\n                return true;\n            }\n        };\n        OfflineListener.prototype.isOffline = function () {\n            return !this.isOnline();\n        };\n        OfflineListener.Offline = new OfflineListener;\n        return OfflineListener;\n    }());\n    exports.OfflineListener = OfflineListener;\n    exports.Offline = OfflineListener.Offline;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Offline.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /*\n     * An array based send buffer.\n     */\n    var ArraySendBuffer = /** @class */ (function () {\n        function ArraySendBuffer(config) {\n            this._config = config;\n            this._buffer = [];\n        }\n        ArraySendBuffer.prototype.enqueue = function (payload) {\n            this._buffer.push(payload);\n        };\n        ArraySendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        ArraySendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n        };\n        ArraySendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        ArraySendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        ArraySendBuffer.prototype.markAsSent = function (payload) {\n            this.clear();\n        };\n        ArraySendBuffer.prototype.clearSent = function (payload) {\n            // not supported\n        };\n        return ArraySendBuffer;\n    }());\n    exports.ArraySendBuffer = ArraySendBuffer;\n    /*\n     * Session storege buffer holds a copy of all unsent items in the browser session storage.\n     */\n    var SessionStorageSendBuffer = /** @class */ (function () {\n        function SessionStorageSendBuffer(logger, config) {\n            this._bufferFullMessageSent = false;\n            this._logger = logger;\n            this._config = config;\n            var bufferItems = this.getBuffer(SessionStorageSendBuffer.BUFFER_KEY);\n            var notDeliveredItems = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            this._buffer = bufferItems.concat(notDeliveredItems);\n            // If the buffer has too many items, drop items from the end.\n            if (this._buffer.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                this._buffer.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n            }\n            // update DataLossAnalyzer with the number of recovered items\n            // Uncomment if you want to use DataLossanalyzer\n            // DataLossAnalyzer.itemsRestoredFromSessionBuffer = this._buffer.length;\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        }\n        SessionStorageSendBuffer.prototype.enqueue = function (payload) {\n            if (this._buffer.length >= SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                // sent internal log only once per page view\n                if (!this._bufferFullMessageSent) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Maximum buffer size reached: \" + this._buffer.length, true);\n                    this._bufferFullMessageSent = true;\n                }\n                return;\n            }\n            this._buffer.push(payload);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        };\n        SessionStorageSendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        SessionStorageSendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this._bufferFullMessageSent = false;\n        };\n        SessionStorageSendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        SessionStorageSendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        SessionStorageSendBuffer.prototype.markAsSent = function (payload) {\n            this._buffer = this.removePayloadsFromBuffer(payload, this._buffer);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            if (sentElements instanceof Array && payload instanceof Array) {\n                sentElements = sentElements.concat(payload);\n                if (sentElements.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                    // We send telemetry normally. If the SENT_BUFFER is too big we don't add new elements\n                    // until we receive a response from the backend and the buffer has free space again (see clearSent method)\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Sent buffer reached its maximum size: \" + sentElements.length, true);\n                    sentElements.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n                }\n                this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n            }\n        };\n        SessionStorageSendBuffer.prototype.clearSent = function (payload) {\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            sentElements = this.removePayloadsFromBuffer(payload, sentElements);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n        };\n        SessionStorageSendBuffer.prototype.removePayloadsFromBuffer = function (payloads, buffer) {\n            var remaining = [];\n            for (var i in buffer) {\n                var contains = false;\n                for (var j in payloads) {\n                    if (payloads[j] === buffer[i]) {\n                        contains = true;\n                        break;\n                    }\n                }\n                if (!contains) {\n                    remaining.push(buffer[i]);\n                }\n            }\n            ;\n            return remaining;\n        };\n        SessionStorageSendBuffer.prototype.getBuffer = function (key) {\n            try {\n                var bufferJson = applicationinsights_common_1.Util.getSessionStorage(this._logger, key);\n                if (bufferJson) {\n                    var buffer = JSON.parse(bufferJson);\n                    if (buffer) {\n                        return buffer;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToRestoreStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            return [];\n        };\n        SessionStorageSendBuffer.prototype.setBuffer = function (key, buffer) {\n            try {\n                var bufferJson = JSON.stringify(buffer);\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, bufferJson);\n            }\n            catch (e) {\n                // if there was an error, clear the buffer\n                // telemetry is stored in the _buffer array so we won't loose any items\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, JSON.stringify([]));\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedToSetStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e) + \". Buffer cleared\", { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n        SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n        // Maximum number of payloads stored in the buffer. If the buffer is full, new elements will be dropped. \n        SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n        return SessionStorageSendBuffer;\n    }());\n    exports.SessionStorageSendBuffer = SessionStorageSendBuffer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SendBuffer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Sender.js ***!\n  \\**********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./SendBuffer */ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\"), __webpack_require__(/*! ./EnvelopeCreator */ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\"), __webpack_require__(/*! ./TelemetryValidation/EventValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/TraceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/ExceptionValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/MetricValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewPerformanceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/RemoteDepdencyValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\"), __webpack_require__(/*! ./Serializer */ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Offline */ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SendBuffer_1, EnvelopeCreator_1, EventValidator_1, TraceValidator_1, ExceptionValidator_1, MetricValidator_1, PageViewPerformanceValidator_1, PageViewValidator_1, RemoteDepdencyValidator_1, Serializer_1, applicationinsights_common_1, applicationinsights_core_js_1, applicationinsights_core_js_2, Offline_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sender = /** @class */ (function () {\n        function Sender() {\n            this.priority = 201;\n            /**\n             * Whether XMLHttpRequest object is supported. Older version of IE (8,9) do not support it.\n             */\n            this._XMLHttpRequestSupported = false;\n        }\n        Sender.prototype.pause = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.resume = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.flush = function () {\n            try {\n                this.triggerSend();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FlushFailed, \"flush failed, telemetry will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        Sender.prototype.teardown = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.initialize = function (config, core, extensions) {\n            this.identifier = \"AppInsightsChannelPlugin\";\n            this._logger = core.logger;\n            this._serializer = new Serializer_1.Serializer(core.logger);\n            this._consecutiveErrors = 0;\n            this._retryAt = null;\n            this._lastSend = 0;\n            this._config = Sender._getDefaultAppInsightsChannelConfig(config, this.identifier);\n            this._sender = null;\n            this._buffer = (applicationinsights_common_1.Util.canUseSessionStorage() && this._config.enableSessionStorageBuffer)\n                ? new SendBuffer_1.SessionStorageSendBuffer(this._logger, this._config) : new SendBuffer_1.ArraySendBuffer(this._config);\n            if (!this._config.isBeaconApiDisabled() && applicationinsights_common_1.Util.IsBeaconApiSupported()) {\n                this._sender = this._beaconSender;\n            }\n            else {\n                if (typeof XMLHttpRequest != \"undefined\") {\n                    var testXhr = new XMLHttpRequest();\n                    if (\"withCredentials\" in testXhr) {\n                        this._sender = this._xhrSender;\n                        this._XMLHttpRequestSupported = true;\n                    }\n                    else if (typeof XDomainRequest !== \"undefined\") {\n                        this._sender = this._xdrSender; //IE 8 and 9\n                    }\n                }\n            }\n        };\n        Sender.prototype.processTelemetry = function (telemetryItem) {\n            try {\n                // if master off switch is set, don't send any data\n                if (this._config.disableTelemetry()) {\n                    // Do not send/save data\n                    return;\n                }\n                // validate input\n                if (!telemetryItem) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSendEmptyTelemetry, \"Cannot send empty telemetry\");\n                    return;\n                }\n                // ensure a sender was constructed\n                if (!this._sender) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SenderNotInitialized, \"Sender was not initialized\");\n                    return;\n                }\n                // first we need to validate that the envelope passed down is valid\n                var isValid = Sender._validate(telemetryItem);\n                if (!isValid) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"Invalid telemetry envelope\");\n                    return;\n                }\n                // construct an envelope that Application Insights endpoint can understand\n                var aiEnvelope = this._constructEnvelope(telemetryItem);\n                if (!aiEnvelope) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CreateEnvelopeError, \"Unable to create an AppInsights envelope\");\n                    return;\n                }\n                // check if the incoming payload is too large, truncate if necessary\n                var payload = this._serializer.serialize(aiEnvelope);\n                // flush if we would exceed the max-size limit by adding this item\n                var bufferPayload = this._buffer.getItems();\n                var batch = this._buffer.batchPayloads(bufferPayload);\n                if (batch && (batch.length + payload.length > this._config.maxBatchSizeInBytes())) {\n                    this.triggerSend();\n                }\n                // enqueue the payload\n                this._buffer.enqueue(payload);\n                // ensure an invocation timeout is set\n                this._setupTimer();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedAddingTelemetryToBuffer, \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            // hand off the telemetry item to the next plugin\n            if (!applicationinsights_core_js_2.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(telemetryItem);\n            }\n        };\n        Sender.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * xhr state changes\n         */\n        Sender.prototype._xhrReadyStateChange = function (xhr, payload, countOfItemsInPayload) {\n            if (xhr.readyState === 4) {\n                var response = null;\n                if (!this._appId) {\n                    response = this._parseResponse(xhr.responseText || xhr.response);\n                    if (response && response.appId) {\n                        this._appId = response.appId;\n                    }\n                }\n                if ((xhr.status < 200 || xhr.status >= 300) && xhr.status !== 0) {\n                    if (!this._config.isRetryDisabled() && this._isRetriable(xhr.status)) {\n                        this._resendPayload(payload);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                            \"Response code \" + xhr.status + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                    else {\n                        this._onError(payload, this._formatErrorMessageXhr(xhr));\n                    }\n                }\n                else if (xhr.status === 0 || Offline_1.Offline.isOffline()) {\n                    if (!this._config.isRetryDisabled()) {\n                        var offlineBackOffMultiplier = 10; // arbritrary number\n                        this._resendPayload(payload, offlineBackOffMultiplier);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". Offline - Response Code: \" + xhr.status + \". Offline status: \" + Offline_1.Offline.isOffline() + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                }\n                else {\n                    if (xhr.status === 206) {\n                        if (!response) {\n                            response = this._parseResponse(xhr.responseText || xhr.response);\n                        }\n                        if (response && !this._config.isRetryDisabled()) {\n                            this._onPartialSuccess(payload, response);\n                        }\n                        else {\n                            this._onError(payload, this._formatErrorMessageXhr(xhr));\n                        }\n                    }\n                    else {\n                        this._consecutiveErrors = 0;\n                        this._onSuccess(payload, countOfItemsInPayload);\n                    }\n                }\n            }\n        };\n        /**\n         * Immediately send buffered data\n         * @param async {boolean} - Indicates if the events should be sent asynchronously\n         */\n        Sender.prototype.triggerSend = function (async) {\n            if (async === void 0) { async = true; }\n            try {\n                // Send data only if disableTelemetry is false\n                if (!this._config.disableTelemetry()) {\n                    if (this._buffer.count() > 0) {\n                        var payload = this._buffer.getItems();\n                        // invoke send\n                        this._sender(payload, async);\n                    }\n                    // update lastSend time to enable throttling\n                    this._lastSend = +new Date;\n                }\n                else {\n                    this._buffer.clear();\n                }\n                clearTimeout(this._timeoutHandle);\n                this._timeoutHandle = null;\n                this._retryAt = null;\n            }\n            catch (e) {\n                /* Ignore this error for IE under v10 */\n                if (!applicationinsights_common_1.Util.getIEVersion() || applicationinsights_common_1.Util.getIEVersion() > 9) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Telemetry transmission failed, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }\n        };\n        /**\n         * error handler\n         */\n        Sender.prototype._onError = function (payload, message, event) {\n            this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.OnError, \"Failed to send telemetry.\", { message: message });\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * partial success handler\n         */\n        Sender.prototype._onPartialSuccess = function (payload, results) {\n            var failed = [];\n            var retry = [];\n            // Iterate through the reversed array of errors so that splicing doesn't have invalid indexes after the first item.\n            var errors = results.errors.reverse();\n            for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                var error = errors_1[_i];\n                var extracted = payload.splice(error.index, 1)[0];\n                if (this._isRetriable(error.statusCode)) {\n                    retry.push(extracted);\n                }\n                else {\n                    // All other errors, including: 402 (Monthly quota exceeded) and 439 (Too many requests and refresh cache).\n                    failed.push(extracted);\n                }\n            }\n            if (payload.length > 0) {\n                this._onSuccess(payload, results.itemsAccepted);\n            }\n            if (failed.length > 0) {\n                this._onError(failed, this._formatErrorMessageXhr(null, ['partial success', results.itemsAccepted, 'of', results.itemsReceived].join(' ')));\n            }\n            if (retry.length > 0) {\n                this._resendPayload(retry);\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Partial success. \" +\n                    \"Delivered: \" + payload.length + \", Failed: \" + failed.length +\n                    \". Will retry to send \" + retry.length + \" our of \" + results.itemsReceived + \" items\");\n            }\n        };\n        /**\n         * success handler\n         */\n        Sender.prototype._onSuccess = function (payload, countOfItemsInPayload) {\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * xdr state changes\n         */\n        Sender.prototype._xdrOnLoad = function (xdr, payload) {\n            if (xdr && (xdr.responseText + \"\" === \"200\" || xdr.responseText === \"\")) {\n                this._consecutiveErrors = 0;\n                this._onSuccess(payload, 0);\n            }\n            else {\n                var results = this._parseResponse(xdr.responseText);\n                if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                    && !this._config.isRetryDisabled()) {\n                    this._onPartialSuccess(payload, results);\n                }\n                else {\n                    this._onError(payload, this._formatErrorMessageXdr(xdr));\n                }\n            }\n        };\n        Sender.prototype._constructEnvelope = function (envelope) {\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return EnvelopeCreator_1.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return EnvelopeCreator_1.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return EnvelopeCreator_1.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return EnvelopeCreator_1.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return EnvelopeCreator_1.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return EnvelopeCreator_1.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(this._logger, envelope);\n                default:\n                    // default create custom event type\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n            }\n        };\n        Sender._getDefaultAppInsightsChannelConfig = function (config, identifier) {\n            var resultConfig = {};\n            var pluginConfig = config.extensionConfig && config.extensionConfig[identifier] ? config.extensionConfig[identifier] : {};\n            // set default values\n            resultConfig.endpointUrl = function () { return config.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\"; };\n            resultConfig.emitLineDelimitedJson = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.emitLineDelimitedJson); };\n            resultConfig.maxBatchInterval = function () { return !isNaN(pluginConfig.maxBatchInterval) ? pluginConfig.maxBatchInterval : 15000; };\n            resultConfig.maxBatchSizeInBytes = function () { return pluginConfig.maxBatchSizeInBytes > 0 ? pluginConfig.maxBatchSizeInBytes : 102400; }; // 100kb\n            resultConfig.disableTelemetry = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.disableTelemetry); };\n            resultConfig.enableSessionStorageBuffer = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.enableSessionStorageBuffer, true); };\n            resultConfig.isRetryDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isRetryDisabled); };\n            resultConfig.isBeaconApiDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isBeaconApiDisabled, true); };\n            return resultConfig;\n        };\n        Sender._validate = function (envelope) {\n            // call the appropriate Validate depending on the baseType\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return TraceValidator_1.TraceValidator.TraceValidator.Validate(envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return ExceptionValidator_1.ExceptionValidator.ExceptionValidator.Validate(envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return MetricValidator_1.MetricValidator.MetricValidator.Validate(envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return PageViewValidator_1.PageViewValidator.PageViewValidator.Validate(envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return PageViewPerformanceValidator_1.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return RemoteDepdencyValidator_1.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(envelope);\n                default:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n            }\n        };\n        /**\n         * Send Beacon API request\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - not used\n         * Note: Beacon API does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._beaconSender = function (payload, isAsync) {\n            var url = this._config.endpointUrl();\n            var batch = this._buffer.batchPayloads(payload);\n            // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n            // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n            var plainTextBatch = new Blob([batch], { type: 'text/plain;charset=UTF-8' });\n            // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n            var queued = navigator.sendBeacon(url, plainTextBatch);\n            if (queued) {\n                this._buffer.markAsSent(payload);\n            }\n            else {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API.\");\n            }\n        };\n        /**\n         * Send XMLHttpRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         */\n        Sender.prototype._xhrSender = function (payload, isAsync) {\n            var _this = this;\n            var xhr = new XMLHttpRequest();\n            xhr[applicationinsights_common_1.DisabledPropertyName] = true;\n            xhr.open(\"POST\", this._config.endpointUrl(), isAsync);\n            xhr.setRequestHeader(\"Content-type\", \"application/json\");\n            // append Sdk-Context request header only in case of breeze endpoint \n            if (applicationinsights_common_1.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.sdkContextHeader, applicationinsights_common_1.RequestHeaders.sdkContextHeaderAppIdRequest);\n            }\n            xhr.onreadystatechange = function () { return _this._xhrReadyStateChange(xhr, payload, payload.length); };\n            xhr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXhr(xhr), event); };\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xhr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        /**\n         * Parses the response from the backend.\n         * @param response - XMLHttpRequest or XDomainRequest response\n         */\n        Sender.prototype._parseResponse = function (response) {\n            try {\n                if (response && response !== \"\") {\n                    var result = JSON.parse(response);\n                    if (result && result.itemsReceived && result.itemsReceived >= result.itemsAccepted &&\n                        result.itemsReceived - result.itemsAccepted == result.errors.length) {\n                        return result;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.InvalidBackendResponse, \"Cannot parse the response. \" + applicationinsights_common_1.Util.getExceptionName(e), {\n                    response: response\n                });\n            }\n            return null;\n        };\n        /**\n         * Resend payload. Adds payload back to the send buffer and setup a send timer (with exponential backoff).\n         * @param payload\n         */\n        Sender.prototype._resendPayload = function (payload, linearFactor) {\n            if (linearFactor === void 0) { linearFactor = 1; }\n            if (!payload || payload.length === 0) {\n                return;\n            }\n            this._buffer.clearSent(payload);\n            this._consecutiveErrors++;\n            for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                var item = payload_1[_i];\n                this._buffer.enqueue(item);\n            }\n            // setup timer\n            this._setRetryTime(linearFactor);\n            this._setupTimer();\n        };\n        /** Calculates the time to wait before retrying in case of an error based on\n         * http://en.wikipedia.org/wiki/Exponential_backoff\n         */\n        Sender.prototype._setRetryTime = function (linearFactor) {\n            var SlotDelayInSeconds = 10;\n            var delayInSeconds;\n            if (this._consecutiveErrors <= 1) {\n                delayInSeconds = SlotDelayInSeconds;\n            }\n            else {\n                var backOffSlot = (Math.pow(2, this._consecutiveErrors) - 1) / 2;\n                // tslint:disable-next-line:insecure-random\n                var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                backOffDelay = linearFactor * backOffDelay;\n                delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n            }\n            // TODO: Log the backoff time like the C# version does.\n            var retryAfterTimeSpan = Date.now() + (delayInSeconds * 1000);\n            // TODO: Log the retry at time like the C# version does.\n            this._retryAt = retryAfterTimeSpan;\n        };\n        /**\n         * Sets up the timer which triggers actually sending the data.\n         */\n        Sender.prototype._setupTimer = function () {\n            var _this = this;\n            if (!this._timeoutHandle) {\n                var retryInterval = this._retryAt ? Math.max(0, this._retryAt - Date.now()) : 0;\n                var timerValue = Math.max(this._config.maxBatchInterval(), retryInterval);\n                this._timeoutHandle = setTimeout(function () {\n                    _this.triggerSend();\n                }, timerValue);\n            }\n        };\n        /**\n         * Checks if the SDK should resend the payload after receiving this status code from the backend.\n         * @param statusCode\n         */\n        Sender.prototype._isRetriable = function (statusCode) {\n            return statusCode == 408 // Timeout\n                || statusCode == 429 // Too many requests.\n                || statusCode == 500 // Internal server error.\n                || statusCode == 503; // Service unavailable.\n        };\n        Sender.prototype._formatErrorMessageXhr = function (xhr, message) {\n            if (xhr) {\n                return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + xhr.responseText || xhr.response || \"\";\n            }\n            return message;\n        };\n        /**\n         * Send XDomainRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         *\n         * Note: XDomainRequest does not support sync requests. This 'isAsync' parameter is added\n         * to maintain consistency with the xhrSender's contract\n         * Note: XDomainRequest does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._xdrSender = function (payload, isAsync) {\n            var _this = this;\n            var xdr = new XDomainRequest();\n            xdr.onload = function () { return _this._xdrOnLoad(xdr, payload); };\n            xdr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXdr(xdr), event); };\n            // XDomainRequest requires the same protocol as the hosting page. \n            // If the protocol doesn't match, we can't send the telemetry :(. \n            var hostingProtocol = window.location.protocol;\n            if (this._config.endpointUrl().lastIndexOf(hostingProtocol, 0) !== 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                    \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                this._buffer.clear();\n                return;\n            }\n            var endpointUrl = this._config.endpointUrl().replace(/^(https?:)/, \"\");\n            xdr.open('POST', endpointUrl);\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xdr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        Sender.prototype._formatErrorMessageXdr = function (xdr, message) {\n            if (xdr) {\n                return \"XDomainRequest,Response:\" + xdr.responseText || \"\";\n            }\n            return message;\n        };\n        return Sender;\n    }());\n    exports.Sender = Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sender.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Serializer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Serializer = /** @class */ (function () {\n        function Serializer(logger) {\n            this._logger = logger;\n        }\n        /**\n         * Serializes the current object to a JSON string.\n         */\n        Serializer.prototype.serialize = function (input) {\n            var output = this._serializeObject(input, \"root\");\n            return JSON.stringify(output);\n        };\n        Serializer.prototype._serializeObject = function (source, name) {\n            var circularReferenceCheck = \"__aiCircularRefCheck\";\n            var output = {};\n            if (!source) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                return output;\n            }\n            if (source[circularReferenceCheck]) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CircularReferenceDetected, \"Circular reference detected while serializing object\", { name: name }, true);\n                return output;\n            }\n            if (!source.aiDataContract) {\n                // special case for measurements/properties/tags\n                if (name === \"measurements\") {\n                    output = this._serializeStringMap(source, \"number\", name);\n                }\n                else if (name === \"properties\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (name === \"tags\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (applicationinsights_common_1.Util.isArray(source)) {\n                    output = this._serializeArray(source, name);\n                }\n                else {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObjectNonSerializable, \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                    try {\n                        // verify that the object can be stringified\n                        JSON.stringify(source);\n                        output = source;\n                    }\n                    catch (e) {\n                        // if serialization fails return an empty string\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, (e && typeof e.toString === 'function') ? e.toString() : \"Error serializing object\", null, true);\n                    }\n                }\n                return output;\n            }\n            source[circularReferenceCheck] = true;\n            for (var field in source.aiDataContract) {\n                var contract = source.aiDataContract[field];\n                var isRequired = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Required) : (contract & applicationinsights_common_1.FieldType.Required);\n                var isHidden = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Hidden) : (contract & applicationinsights_common_1.FieldType.Hidden);\n                var isArray = contract & applicationinsights_common_1.FieldType.Array;\n                var isPresent = source[field] !== undefined;\n                var isObject = typeof source[field] === \"object\" && source[field] !== null;\n                if (isRequired && !isPresent && !isArray) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MissingRequiredFieldSpecification, \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    // If not in debug mode, continue and hope the error is permissible\n                    continue;\n                }\n                if (isHidden) {\n                    // Don't serialize hidden fields\n                    continue;\n                }\n                var value;\n                if (isObject) {\n                    if (isArray) {\n                        // special case; resurse on each object in the source array\n                        value = this._serializeArray(source[field], field);\n                    }\n                    else {\n                        // recurse on the source object in this field\n                        value = this._serializeObject(source[field], field);\n                    }\n                }\n                else {\n                    // assign the source field to the output even if undefined or required\n                    value = source[field];\n                }\n                // only emit this field if the value is defined\n                if (value !== undefined) {\n                    output[field] = value;\n                }\n            }\n            delete source[circularReferenceCheck];\n            return output;\n        };\n        Serializer.prototype._serializeArray = function (sources, name) {\n            var output = undefined;\n            if (!!sources) {\n                if (!applicationinsights_common_1.Util.isArray(sources)) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ItemNotInArray, \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                }\n                else {\n                    output = [];\n                    for (var i = 0; i < sources.length; i++) {\n                        var source = sources[i];\n                        var item = this._serializeObject(source, name + \"[\" + i + \"]\");\n                        output.push(item);\n                    }\n                }\n            }\n            return output;\n        };\n        Serializer.prototype._serializeStringMap = function (map, expectedType, name) {\n            var output = undefined;\n            if (map) {\n                output = {};\n                for (var field in map) {\n                    var value = map[field];\n                    if (expectedType === \"string\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else if (!value.toString) {\n                            output[field] = \"invalid field: toString() is not defined.\";\n                        }\n                        else {\n                            output[field] = value.toString();\n                        }\n                    }\n                    else if (expectedType === \"number\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else {\n                            var num = parseFloat(value);\n                            if (isNaN(num)) {\n                                output[field] = \"NaN\";\n                            }\n                            else {\n                                output[field] = num;\n                            }\n                        }\n                    }\n                    else {\n                        output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, output[field], null, true);\n                    }\n                }\n            }\n            return output;\n        };\n        return Serializer;\n    }());\n    exports.Serializer = Serializer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Serializer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var EventValidator = /** @class */ (function () {\n        function EventValidator() {\n        }\n        EventValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n            https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties || !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties || !item.domainProperties[\"name\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        EventValidator.EventValidator = new EventValidator();\n        return EventValidator;\n    }());\n    exports.EventValidator = EventValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var ExceptionValidator = /** @class */ (function () {\n        function ExceptionValidator() {\n        }\n        ExceptionValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"exceptions\"] ||\n                !ExceptionValidator._validateExceptions(item.domainProperties[\"exceptions\"])) {\n                return false;\n            }\n            */\n            return true;\n        };\n        // TODO implement validation of exceptions\n        ExceptionValidator._validateExceptions = function (exceptions) {\n            // typeName\n            // message\n            // parsedStack\n            // stack\n            // hasFullStack\n            return true;\n        };\n        ExceptionValidator.ExceptionValidator = new ExceptionValidator();\n        return ExceptionValidator;\n    }());\n    exports.ExceptionValidator = ExceptionValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var MetricValidator = /** @class */ (function () {\n        function MetricValidator() {\n        }\n        MetricValidator.prototype.Validate = function (event) {\n            return true;\n        };\n        MetricValidator.MetricValidator = new MetricValidator();\n        return MetricValidator;\n    }());\n    exports.MetricValidator = MetricValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\":\n/*!****************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js ***!\n  \\****************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformanceValidator = /** @class */ (function () {\n        function PageViewPerformanceValidator() {\n        }\n        PageViewPerformanceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n            \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"domProcessing\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"networkConnect\"] ||\n                !item.domainProperties[\"perfTotal\"] ||\n                !item.domainProperties[\"receivedResponse\"] ||\n                !item.domainProperties[\"sentRequest\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewPerformanceValidator.PageViewPerformanceValidator = new PageViewPerformanceValidator();\n        return PageViewPerformanceValidator;\n    }());\n    exports.PageViewPerformanceValidator = PageViewPerformanceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformanceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewValidator = /** @class */ (function () {\n        function PageViewValidator() {\n        }\n        PageViewValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewValidator.PageViewValidator = new PageViewValidator();\n        return PageViewValidator;\n    }());\n    exports.PageViewValidator = PageViewValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDepdencyValidator = /** @class */ (function () {\n        function RemoteDepdencyValidator() {\n        }\n        RemoteDepdencyValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"resultCode\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"success\"] ||\n                !item.domainProperties[\"data\"] ||\n                !item.domainProperties[\"target\"] ||\n                !item.domainProperties[\"type\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        RemoteDepdencyValidator.RemoteDepdencyValidator = new RemoteDepdencyValidator();\n        return RemoteDepdencyValidator;\n    }());\n    exports.RemoteDepdencyValidator = RemoteDepdencyValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDepdencyValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TraceValidator = /** @class */ (function () {\n        function TraceValidator() {\n        }\n        TraceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties ||\n                !item.domainProperties[\"message\"] ||\n                !item.domainProperties[\"severityLevel\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        TraceValidator.TraceValidator = new TraceValidator();\n        return TraceValidator;\n    }());\n    exports.TraceValidator = TraceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TraceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Sender */ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Sender_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Sender = Sender_1.Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-channel-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Constants.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Constants.js ***!\n  \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Constants.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Enums.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Enums.js ***!\n  \\*****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Type of storage to differentiate between local storage and session storage\n    */\n    var StorageType;\n    (function (StorageType) {\n        StorageType[StorageType[\"LocalStorage\"] = 0] = \"LocalStorage\";\n        StorageType[StorageType[\"SessionStorage\"] = 1] = \"SessionStorage\";\n    })(StorageType = exports.StorageType || (exports.StorageType = {}));\n    /**\n     * Enum is used in aiDataContract to describe how fields are serialized.\n     * For instance: (Fieldtype.Required | FieldType.Array) will mark the field as required and indicate it's an array\n     */\n    var FieldType;\n    (function (FieldType) {\n        FieldType[FieldType[\"Default\"] = 0] = \"Default\";\n        FieldType[FieldType[\"Required\"] = 1] = \"Required\";\n        FieldType[FieldType[\"Array\"] = 2] = \"Array\";\n        FieldType[FieldType[\"Hidden\"] = 4] = \"Hidden\";\n    })(FieldType = exports.FieldType || (exports.FieldType = {}));\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Enums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n         * Data struct to contain only C section with custom fields.\n         */\n    var Base = /** @class */ (function () {\n        function Base() {\n        }\n        return Base;\n    }());\n    exports.Base = Base;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Base.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    var ContextTagKeys = /** @class */ (function () {\n        function ContextTagKeys() {\n            this.applicationVersion = \"ai.application.ver\";\n            this.applicationBuild = \"ai.application.build\";\n            this.applicationTypeId = \"ai.application.typeId\";\n            this.applicationId = \"ai.application.applicationId\";\n            this.applicationLayer = \"ai.application.layer\";\n            this.deviceId = \"ai.device.id\";\n            this.deviceIp = \"ai.device.ip\";\n            this.deviceLanguage = \"ai.device.language\";\n            this.deviceLocale = \"ai.device.locale\";\n            this.deviceModel = \"ai.device.model\";\n            this.deviceFriendlyName = \"ai.device.friendlyName\";\n            this.deviceNetwork = \"ai.device.network\";\n            this.deviceNetworkName = \"ai.device.networkName\";\n            this.deviceOEMName = \"ai.device.oemName\";\n            this.deviceOS = \"ai.device.os\";\n            this.deviceOSVersion = \"ai.device.osVersion\";\n            this.deviceRoleInstance = \"ai.device.roleInstance\";\n            this.deviceRoleName = \"ai.device.roleName\";\n            this.deviceScreenResolution = \"ai.device.screenResolution\";\n            this.deviceType = \"ai.device.type\";\n            this.deviceMachineName = \"ai.device.machineName\";\n            this.deviceVMName = \"ai.device.vmName\";\n            this.deviceBrowser = \"ai.device.browser\";\n            this.deviceBrowserVersion = \"ai.device.browserVersion\";\n            this.locationIp = \"ai.location.ip\";\n            this.locationCountry = \"ai.location.country\";\n            this.locationProvince = \"ai.location.province\";\n            this.locationCity = \"ai.location.city\";\n            this.operationId = \"ai.operation.id\";\n            this.operationName = \"ai.operation.name\";\n            this.operationParentId = \"ai.operation.parentId\";\n            this.operationRootId = \"ai.operation.rootId\";\n            this.operationSyntheticSource = \"ai.operation.syntheticSource\";\n            this.operationCorrelationVector = \"ai.operation.correlationVector\";\n            this.sessionId = \"ai.session.id\";\n            this.sessionIsFirst = \"ai.session.isFirst\";\n            this.sessionIsNew = \"ai.session.isNew\";\n            this.userAccountAcquisitionDate = \"ai.user.accountAcquisitionDate\";\n            this.userAccountId = \"ai.user.accountId\";\n            this.userAgent = \"ai.user.userAgent\";\n            this.userId = \"ai.user.id\";\n            this.userStoreRegion = \"ai.user.storeRegion\";\n            this.userAuthUserId = \"ai.user.authUserId\";\n            this.userAnonymousUserAcquisitionDate = \"ai.user.anonUserAcquisitionDate\";\n            this.userAuthenticatedUserAcquisitionDate = \"ai.user.authUserAcquisitionDate\";\n            this.cloudName = \"ai.cloud.name\";\n            this.cloudRole = \"ai.cloud.role\";\n            this.cloudRoleVer = \"ai.cloud.roleVer\";\n            this.cloudRoleInstance = \"ai.cloud.roleInstance\";\n            this.cloudEnvironment = \"ai.cloud.environment\";\n            this.cloudLocation = \"ai.cloud.location\";\n            this.cloudDeploymentUnit = \"ai.cloud.deploymentUnit\";\n            this.internalSdkVersion = \"ai.internal.sdkVersion\";\n            this.internalAgentVersion = \"ai.internal.agentVersion\";\n            this.internalNodeName = \"ai.internal.nodeName\";\n        }\n        return ContextTagKeys;\n    }());\n    exports.ContextTagKeys = ContextTagKeys;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ContextTagKeys.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Base_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Data struct to contain both B and C sections.\n     */\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        function Data() {\n            return _super.call(this) || this;\n        }\n        return Data;\n    }(Base_1.Base));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./DataPointType */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPointType_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Metric data single measurement.\n     */\n    var DataPoint = /** @class */ (function () {\n        function DataPoint() {\n            this.kind = DataPointType_1.DataPointType.Measurement;\n        }\n        return DataPoint;\n    }());\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Type of the metric data measurement.\n     */\n    var DataPointType;\n    (function (DataPointType) {\n        DataPointType[DataPointType[\"Measurement\"] = 0] = \"Measurement\";\n        DataPointType[DataPointType[\"Aggregation\"] = 1] = \"Aggregation\";\n    })(DataPointType = exports.DataPointType || (exports.DataPointType = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPointType.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\":\n/*!*************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js ***!\n  \\*************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The abstract common base of all domains.\n     */\n    var Domain = /** @class */ (function () {\n        function Domain() {\n        }\n        return Domain;\n    }());\n    exports.Domain = Domain;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Domain.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * System variables for a telemetry item.\n     */\n    var Envelope = /** @class */ (function () {\n        function Envelope() {\n            this.ver = 1;\n            this.sampleRate = 100.0;\n            this.tags = {};\n        }\n        return Envelope;\n    }());\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Event represent structured event records that can be grouped and searched by their properties. Event data item also creates a metric of event count by name.\n     */\n    var EventData = /** @class */ (function (_super) {\n        __extends(EventData, _super);\n        function EventData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return EventData;\n    }(Domain_1.Domain));\n    exports.EventData = EventData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Exception represents a handled or unhandled exception that occurred during execution of the monitored application.\n     */\n    var ExceptionData = /** @class */ (function (_super) {\n        __extends(ExceptionData, _super);\n        function ExceptionData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.exceptions = [];\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return ExceptionData;\n    }(Domain_1.Domain));\n    exports.ExceptionData = ExceptionData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Exception details of the exception in a chain.\n     */\n    var ExceptionDetails = /** @class */ (function () {\n        function ExceptionDetails() {\n            this.hasFullStack = true;\n            this.parsedStack = [];\n        }\n        return ExceptionDetails;\n    }());\n    exports.ExceptionDetails = ExceptionDetails;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionDetails.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Message represent printf-like trace statements that are text-searched. Log4Net, NLog and other text-based log file entries are translated into intances of this type. The message does not have measurements.\n     */\n    var MessageData = /** @class */ (function (_super) {\n        __extends(MessageData, _super);\n        function MessageData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            return _this;\n        }\n        return MessageData;\n    }(Domain_1.Domain));\n    exports.MessageData = MessageData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MessageData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of the Metric item is a list of measurements (single data points) and/or aggregations.\n     */\n    var MetricData = /** @class */ (function (_super) {\n        __extends(MetricData, _super);\n        function MetricData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.metrics = [];\n            _this.properties = {};\n            return _this;\n        }\n        return MetricData;\n    }(Domain_1.Domain));\n    exports.MetricData = MetricData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\":\n/*!*******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js ***!\n  \\*******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageView represents a generic action on a page like a button click. It is also the base type for PageView.\n     */\n    var PageViewData = /** @class */ (function (_super) {\n        __extends(PageViewData, _super);\n        function PageViewData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewData;\n    }(EventData_1.EventData));\n    exports.PageViewData = PageViewData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageViewPerf represents: a page view with no performance data, a page view with performance data, or just the performance data of an earlier page request.\n     */\n    var PageViewPerfData = /** @class */ (function (_super) {\n        __extends(PageViewPerfData, _super);\n        function PageViewPerfData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewPerfData;\n    }(PageViewData_1.PageViewData));\n    exports.PageViewPerfData = PageViewPerfData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerfData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\":\n/*!***************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js ***!\n  \\***************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Remote Dependency represents an interaction of the monitored component with a remote component/service like SQL or an HTTP endpoint.\n     */\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        function RemoteDependencyData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.success = true;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return RemoteDependencyData;\n    }(Domain_1.Domain));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Defines the level of severity for the event.\n    */\n    var SeverityLevel;\n    (function (SeverityLevel) {\n        SeverityLevel[SeverityLevel[\"Verbose\"] = 0] = \"Verbose\";\n        SeverityLevel[SeverityLevel[\"Information\"] = 1] = \"Information\";\n        SeverityLevel[SeverityLevel[\"Warning\"] = 2] = \"Warning\";\n        SeverityLevel[SeverityLevel[\"Error\"] = 3] = \"Error\";\n        SeverityLevel[SeverityLevel[\"Critical\"] = 4] = \"Critical\";\n    })(SeverityLevel = exports.SeverityLevel || (exports.SeverityLevel = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SeverityLevel.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Stack frame information.\n     */\n    var StackFrame = /** @class */ (function () {\n        function StackFrame() {\n        }\n        return StackFrame;\n    }());\n    exports.StackFrame = StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=StackFrame.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RequestHeaders = /** @class */ (function () {\n        function RequestHeaders() {\n        }\n        /**\n         * Request-Context header\n         */\n        RequestHeaders.requestContextHeader = \"Request-Context\";\n        /**\n         * Target instrumentation header that is added to the response and retrieved by the\n         * calling application when processing incoming responses.\n         */\n        RequestHeaders.requestContextTargetKey = \"appId\";\n        /**\n         * Request-Context appId format\n         */\n        RequestHeaders.requestContextAppIdFormat = \"appId=cid-v1:\";\n        /**\n         * Request-Id header\n         */\n        RequestHeaders.requestIdHeader = \"Request-Id\";\n        /**\n         * Sdk-Context header\n         * If this header passed with appId in content then appId will be returned back by the backend.\n         */\n        RequestHeaders.sdkContextHeader = \"Sdk-Context\";\n        /**\n         * String to pass in header for requesting appId back from the backend.\n         */\n        RequestHeaders.sdkContextHeaderAppIdRequest = \"appId\";\n        RequestHeaders.requestContextHeaderLowerCase = \"request-context\";\n        return RequestHeaders;\n    }());\n    exports.RequestHeaders = RequestHeaders;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RequestResponseHeaders.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Data_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Data(baseType, data) {\n            var _this = _super.call(this) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                baseType: Enums_1.FieldType.Required,\n                baseData: Enums_1.FieldType.Required\n            };\n            _this.baseType = baseType;\n            _this.baseData = data;\n            return _this;\n        }\n        return Data;\n    }(Data_1.Data));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPoint_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataPoint = /** @class */ (function (_super) {\n        __extends(DataPoint, _super);\n        function DataPoint() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                name: Enums_1.FieldType.Required,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Required,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default\n            };\n            return _this;\n        }\n        return DataPoint;\n    }(DataPoint_1.DataPoint));\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataSanitizer = /** @class */ (function () {\n        function DataSanitizer() {\n        }\n        DataSanitizer.sanitizeKeyAndAddUniqueness = function (logger, key, map) {\n            var origLength = key.length;\n            var field = DataSanitizer.sanitizeKey(logger, key);\n            // validation truncated the length.  We need to add uniqueness\n            if (field.length !== origLength) {\n                var i = 0;\n                var uniqueField = field;\n                while (map[uniqueField] !== undefined) {\n                    i++;\n                    uniqueField = field.substring(0, DataSanitizer.MAX_NAME_LENGTH - 3) + DataSanitizer.padNumber(i);\n                }\n                field = uniqueField;\n            }\n            return field;\n        };\n        DataSanitizer.sanitizeKey = function (logger, name) {\n            if (name) {\n                // Remove any leading or trailing whitepace\n                name = Util_1.Util.trim(name.toString());\n                // truncate the string to 150 chars\n                if (name.length > DataSanitizer.MAX_NAME_LENGTH) {\n                    name = name.substring(0, DataSanitizer.MAX_NAME_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NameTooLong, \"name is too long.  It has been truncated to \" + DataSanitizer.MAX_NAME_LENGTH + \" characters.\", { name: name }, true);\n                }\n            }\n            return name;\n        };\n        DataSanitizer.sanitizeString = function (logger, value, maxLength) {\n            if (maxLength === void 0) { maxLength = DataSanitizer.MAX_STRING_LENGTH; }\n            if (value) {\n                maxLength = maxLength ? maxLength : DataSanitizer.MAX_STRING_LENGTH; // in case default parameters dont work\n                value = Util_1.Util.trim(value);\n                if (value.toString().length > maxLength) {\n                    value = value.toString().substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StringValueTooLong, \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n                }\n            }\n            return value;\n        };\n        DataSanitizer.sanitizeUrl = function (logger, url) {\n            return DataSanitizer.sanitizeInput(logger, url, DataSanitizer.MAX_URL_LENGTH, applicationinsights_core_js_1._InternalMessageId.UrlTooLong);\n        };\n        DataSanitizer.sanitizeMessage = function (logger, message) {\n            if (message) {\n                if (message.length > DataSanitizer.MAX_MESSAGE_LENGTH) {\n                    message = message.substring(0, DataSanitizer.MAX_MESSAGE_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.MessageTruncated, \"message is too long, it has been truncated to \" + DataSanitizer.MAX_MESSAGE_LENGTH + \" characters.\", { message: message }, true);\n                }\n            }\n            return message;\n        };\n        DataSanitizer.sanitizeException = function (logger, exception) {\n            if (exception) {\n                if (exception.length > DataSanitizer.MAX_EXCEPTION_LENGTH) {\n                    exception = exception.substring(0, DataSanitizer.MAX_EXCEPTION_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ExceptionTruncated, \"exception is too long, it has been truncated to \" + DataSanitizer.MAX_EXCEPTION_LENGTH + \" characters.\", { exception: exception }, true);\n                }\n            }\n            return exception;\n        };\n        DataSanitizer.sanitizeProperties = function (logger, properties) {\n            if (properties) {\n                var tempProps = {};\n                for (var prop in properties) {\n                    var value = DataSanitizer.sanitizeString(logger, properties[prop], DataSanitizer.MAX_PROPERTY_LENGTH);\n                    prop = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, prop, tempProps);\n                    tempProps[prop] = value;\n                }\n                properties = tempProps;\n            }\n            return properties;\n        };\n        DataSanitizer.sanitizeMeasurements = function (logger, measurements) {\n            if (measurements) {\n                var tempMeasurements = {};\n                for (var measure in measurements) {\n                    var value = measurements[measure];\n                    measure = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements);\n                    tempMeasurements[measure] = value;\n                }\n                measurements = tempMeasurements;\n            }\n            return measurements;\n        };\n        DataSanitizer.sanitizeId = function (logger, id) {\n            return id ? DataSanitizer.sanitizeInput(logger, id, DataSanitizer.MAX_ID_LENGTH, applicationinsights_core_js_1._InternalMessageId.IdTooLong).toString() : id;\n        };\n        DataSanitizer.sanitizeInput = function (logger, input, maxLength, _msgId) {\n            if (input) {\n                input = Util_1.Util.trim(input);\n                if (input.length > maxLength) {\n                    input = input.substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n                }\n            }\n            return input;\n        };\n        DataSanitizer.padNumber = function (num) {\n            var s = \"00\" + num;\n            return s.substr(s.length - 3);\n        };\n        /**\n        * Max length allowed for custom names.\n        */\n        DataSanitizer.MAX_NAME_LENGTH = 150;\n        /**\n         * Max length allowed for Id field in page views.\n         */\n        DataSanitizer.MAX_ID_LENGTH = 128;\n        /**\n         * Max length allowed for custom values.\n         */\n        DataSanitizer.MAX_PROPERTY_LENGTH = 8192;\n        /**\n         * Max length allowed for names\n         */\n        DataSanitizer.MAX_STRING_LENGTH = 1024;\n        /**\n         * Max length allowed for url.\n         */\n        DataSanitizer.MAX_URL_LENGTH = 2048;\n        /**\n         * Max length allowed for messages.\n         */\n        DataSanitizer.MAX_MESSAGE_LENGTH = 32768;\n        /**\n         * Max length allowed for exceptions.\n         */\n        DataSanitizer.MAX_EXCEPTION_LENGTH = 32768;\n        return DataSanitizer;\n    }());\n    exports.DataSanitizer = DataSanitizer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataSanitizer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\":\n/*!*************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js ***!\n  \\*************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Envelope */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\"), __webpack_require__(/*! ./DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Envelope_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Envelope = /** @class */ (function (_super) {\n        __extends(Envelope, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Envelope(logger, data, name) {\n            var _this = _super.call(this) || this;\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.data = data;\n            _this.time = Util_1.Util.toISOStringForIE8(new Date());\n            _this.aiDataContract = {\n                time: Enums_1.FieldType.Required,\n                iKey: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                sampleRate: function () {\n                    return (_this.sampleRate == 100) ? Enums_1.FieldType.Hidden : Enums_1.FieldType.Required;\n                },\n                tags: Enums_1.FieldType.Required,\n                data: Enums_1.FieldType.Required\n            };\n            return _this;\n        }\n        return Envelope;\n    }(Envelope_1.Envelope));\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Event.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Event = /** @class */ (function (_super) {\n        __extends(Event, _super);\n        /**\n         * Constructs a new instance of the EventTelemetry object\n         */\n        function Event(logger, name, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n        Event.dataType = \"EventData\";\n        return Event;\n    }(EventData_1.EventData));\n    exports.Event = Event;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Event.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/StackFrame */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionDetails */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, StackFrame_1, ExceptionData_1, ExceptionDetails_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Exception = /** @class */ (function (_super) {\n        __extends(Exception, _super);\n        /**\n        * Constructs a new isntance of the ExceptionTelemetry object\n        */\n        function Exception(logger, exception, properties, measurements, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                exceptions: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            _this.exceptions = [new _ExceptionDetails(logger, exception)];\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        /**\n        * Creates a simple exception with 1 stack frame. Useful for manual constracting of exception.\n        */\n        Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n            return {\n                exceptions: [\n                    {\n                        hasFullStack: true,\n                        message: message,\n                        stack: details,\n                        typeName: typeName\n                    }\n                ]\n            };\n        };\n        Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n        Exception.dataType = \"ExceptionData\";\n        return Exception;\n    }(ExceptionData_1.ExceptionData));\n    exports.Exception = Exception;\n    var _ExceptionDetails = /** @class */ (function (_super) {\n        __extends(_ExceptionDetails, _super);\n        function _ExceptionDetails(logger, exception) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Default,\n                outerId: Enums_1.FieldType.Default,\n                typeName: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                hasFullStack: Enums_1.FieldType.Default,\n                stack: Enums_1.FieldType.Default,\n                parsedStack: Enums_1.FieldType.Array\n            };\n            _this.typeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, exception.name) || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, exception.message) || Util_1.Util.NotSpecified;\n            var stack = exception[\"stack\"];\n            _this.parsedStack = _this.parseStack(stack);\n            _this.stack = DataSanitizer_1.DataSanitizer.sanitizeException(logger, stack);\n            _this.hasFullStack = Util_1.Util.isArray(_this.parsedStack) && _this.parsedStack.length > 0;\n            return _this;\n        }\n        _ExceptionDetails.prototype.parseStack = function (stack) {\n            var parsedStack = undefined;\n            if (typeof stack === \"string\") {\n                var frames = stack.split('\\n');\n                parsedStack = [];\n                var level = 0;\n                var totalSizeInBytes = 0;\n                for (var i = 0; i <= frames.length; i++) {\n                    var frame = frames[i];\n                    if (_StackFrame.regex.test(frame)) {\n                        var parsedFrame = new _StackFrame(frames[i], level++);\n                        totalSizeInBytes += parsedFrame.sizeInBytes;\n                        parsedStack.push(parsedFrame);\n                    }\n                }\n                // DP Constraint - exception parsed stack must be < 32KB\n                // remove frames from the middle to meet the threshold\n                var exceptionParsedStackThreshold = 32 * 1024;\n                if (totalSizeInBytes > exceptionParsedStackThreshold) {\n                    var left = 0;\n                    var right = parsedStack.length - 1;\n                    var size = 0;\n                    var acceptedLeft = left;\n                    var acceptedRight = right;\n                    while (left < right) {\n                        // check size\n                        var lSize = parsedStack[left].sizeInBytes;\n                        var rSize = parsedStack[right].sizeInBytes;\n                        size += lSize + rSize;\n                        if (size > exceptionParsedStackThreshold) {\n                            // remove extra frames from the middle\n                            var howMany = acceptedRight - acceptedLeft + 1;\n                            parsedStack.splice(acceptedLeft, howMany);\n                            break;\n                        }\n                        // update pointers\n                        acceptedLeft = left;\n                        acceptedRight = right;\n                        left++;\n                        right--;\n                    }\n                }\n            }\n            return parsedStack;\n        };\n        return _ExceptionDetails;\n    }(ExceptionDetails_1.ExceptionDetails));\n    var _StackFrame = /** @class */ (function (_super) {\n        __extends(_StackFrame, _super);\n        function _StackFrame(frame, level) {\n            var _this = _super.call(this) || this;\n            _this.sizeInBytes = 0;\n            _this.aiDataContract = {\n                level: Enums_1.FieldType.Required,\n                method: Enums_1.FieldType.Required,\n                assembly: Enums_1.FieldType.Default,\n                fileName: Enums_1.FieldType.Default,\n                line: Enums_1.FieldType.Default\n            };\n            _this.level = level;\n            _this.method = \"<no_method>\";\n            _this.assembly = Util_1.Util.trim(frame);\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches.length >= 5) {\n                _this.method = Util_1.Util.trim(matches[2]) || _this.method;\n                _this.fileName = Util_1.Util.trim(matches[4]);\n                _this.line = parseInt(matches[5]) || 0;\n            }\n            _this.sizeInBytes += _this.method.length;\n            _this.sizeInBytes += _this.fileName.length;\n            _this.sizeInBytes += _this.assembly.length;\n            // todo: these might need to be removed depending on how the back-end settles on their size calculation\n            _this.sizeInBytes += _StackFrame.baseSize;\n            _this.sizeInBytes += _this.level.toString().length;\n            _this.sizeInBytes += _this.line.toString().length;\n            return _this;\n        }\n        // regex to match stack frames from ie/chrome/ff\n        // methodName=$2, fileName=$4, lineNo=$5, column=$6\n        _StackFrame.regex = /^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n        _StackFrame.baseSize = 58; //'{\"method\":\"\",\"level\":,\"assembly\":\"\",\"fileName\":\"\",\"line\":}'.length\n        return _StackFrame;\n    }(StackFrame_1.StackFrame));\n    exports._StackFrame = _StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Exception.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js ***!\n  \\****************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MetricData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MetricData_1, DataSanitizer_1, Enums_1, DataPoint_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Metric = /** @class */ (function (_super) {\n        __extends(Metric, _super);\n        /**\n         * Constructs a new instance of the MetricTelemetry object\n         */\n        function Metric(logger, name, value, count, min, max, properties) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                metrics: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default\n            };\n            var dataPoint = new DataPoint_1.DataPoint();\n            dataPoint.count = count > 0 ? count : undefined;\n            dataPoint.max = isNaN(max) || max === null ? undefined : max;\n            dataPoint.min = isNaN(min) || min === null ? undefined : min;\n            dataPoint.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            dataPoint.value = value;\n            _this.metrics = [dataPoint];\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            return _this;\n        }\n        Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n        Metric.dataType = \"MetricData\";\n        return Metric;\n    }(MetricData_1.MetricData));\n    exports.Metric = Metric;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Metric.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageView = /** @class */ (function (_super) {\n        __extends(PageView, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageView(logger, name, url, durationMs, properties, measurements, id) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                id: Enums_1.FieldType.Default,\n            };\n            _this.id = DataSanitizer_1.DataSanitizer.sanitizeId(logger, id);\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            if (!isNaN(durationMs)) {\n                _this.duration = Util_1.Util.msToTimeSpan(durationMs);\n            }\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n        PageView.dataType = \"PageviewData\";\n        return PageView;\n    }(PageViewData_1.PageViewData));\n    exports.PageView = PageView;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageView.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewPerfData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewPerfData_1, Enums_1, DataSanitizer_1, Util_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformance = /** @class */ (function (_super) {\n        __extends(PageViewPerformance, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageViewPerformance(logger, name, url, unused, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                perfTotal: Enums_1.FieldType.Default,\n                networkConnect: Enums_1.FieldType.Default,\n                sentRequest: Enums_1.FieldType.Default,\n                receivedResponse: Enums_1.FieldType.Default,\n                domProcessing: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.isValid = false;\n            /*\n             * http://www.w3.org/TR/navigation-timing/#processing-model\n             *  |-navigationStart\n             *  |             |-connectEnd\n             *  |             ||-requestStart\n             *  |             ||             |-responseStart\n             *  |             ||             |              |-responseEnd\n             *  |             ||             |              |\n             *  |             ||             |              |         |-loadEventEnd\n             *  |---network---||---request---|---response---|---dom---|\n             *  |--------------------------total----------------------|\n             */\n            var timing = PageViewPerformance.getPerformanceTiming();\n            if (timing) {\n                var total = PageViewPerformance.getDuration(timing.navigationStart, timing.loadEventEnd);\n                var network = PageViewPerformance.getDuration(timing.navigationStart, timing.connectEnd);\n                var request = PageViewPerformance.getDuration(timing.requestStart, timing.responseStart);\n                var response = PageViewPerformance.getDuration(timing.responseStart, timing.responseEnd);\n                var dom = PageViewPerformance.getDuration(timing.responseEnd, timing.loadEventEnd);\n                if (total == 0) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ErrorPVCalc, \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (!PageViewPerformance.shouldCollectDuration(total, network, request, response, dom)) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.InvalidDurationValue, \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                    // some browsers may report individual components incorrectly so that the sum of the parts will be bigger than total PLT\n                    // in this case, don't report client performance from this page\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ClientPerformanceMathError, \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else {\n                    _this.durationMs = total;\n                    // convert to timespans\n                    _this.perfTotal = _this.duration = Util_1.Util.msToTimeSpan(total);\n                    _this.networkConnect = Util_1.Util.msToTimeSpan(network);\n                    _this.sentRequest = Util_1.Util.msToTimeSpan(request);\n                    _this.receivedResponse = Util_1.Util.msToTimeSpan(response);\n                    _this.domProcessing = Util_1.Util.msToTimeSpan(dom);\n                    _this.isValid = true;\n                }\n            }\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        /**\n         * Indicates whether this instance of PageViewPerformance is valid and should be sent\n         */\n        PageViewPerformance.prototype.getIsValid = function () {\n            return this.isValid;\n        };\n        /**\n        * Gets the total duration (PLT) in milliseconds. Check getIsValid() before using this method.\n        */\n        PageViewPerformance.prototype.getDurationMs = function () {\n            return this.durationMs;\n        };\n        PageViewPerformance.getPerformanceTiming = function () {\n            if (PageViewPerformance.isPerformanceTimingSupported()) {\n                return window.performance.timing;\n            }\n            return null;\n        };\n        /**\n        * Returns true is window performance timing API is supported, false otherwise.\n        */\n        PageViewPerformance.isPerformanceTimingSupported = function () {\n            return typeof window != \"undefined\" && window.performance && window.performance.timing;\n        };\n        /**\n         * As page loads different parts of performance timing numbers get set. When all of them are set we can report it.\n         * Returns true if ready, false otherwise.\n         */\n        PageViewPerformance.isPerformanceTimingDataReady = function () {\n            var timing = window.performance.timing;\n            return timing.domainLookupStart > 0\n                && timing.navigationStart > 0\n                && timing.responseStart > 0\n                && timing.requestStart > 0\n                && timing.loadEventEnd > 0\n                && timing.responseEnd > 0\n                && timing.connectEnd > 0\n                && timing.domLoading > 0;\n        };\n        PageViewPerformance.getDuration = function (start, end) {\n            var duration = undefined;\n            if (!(isNaN(start) || isNaN(end))) {\n                duration = Math.max(end - start, 0);\n            }\n            return duration;\n        };\n        /**\n         * This method tells if given durations should be excluded from collection.\n         */\n        PageViewPerformance.shouldCollectDuration = function () {\n            var durations = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                durations[_i] = arguments[_i];\n            }\n            // a full list of Google crawlers user agent strings - https://support.google.com/webmasters/answer/1061943?hl=en\n            var botAgentNames = ['googlebot', 'adsbot-google', 'apis-google', 'mediapartners-google'];\n            var userAgent = navigator.userAgent;\n            var isGoogleBot = false;\n            if (userAgent) {\n                for (var i_1 = 0; i_1 < botAgentNames.length; i_1++) {\n                    isGoogleBot = isGoogleBot || userAgent.toLowerCase().indexOf(botAgentNames[i_1]) !== -1;\n                }\n            }\n            if (isGoogleBot) {\n                // Don't report durations for GoogleBot, it is returning invalid values in performance.timing API. \n                return false;\n            }\n            else {\n                // for other page views, don't report if it's outside of a reasonable range\n                for (var i = 0; i < durations.length; i++) {\n                    if (durations[i] >= PageViewPerformance.MAX_DURATION_ALLOWED) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        };\n        PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n        PageViewPerformance.dataType = \"PageviewPerformanceData\";\n        PageViewPerformance.MAX_DURATION_ALLOWED = 3600000; // 1h\n        return PageViewPerformance;\n    }(PageViewPerfData_1.PageViewPerfData));\n    exports.PageViewPerformance = PageViewPerformance;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformance.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataSanitizer_1, Enums_1, Util_1, Util_2, RemoteDependencyData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        /**\n         * Constructs a new instance of the RemoteDependencyData object\n         */\n        function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Required,\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                resultCode: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                success: Enums_1.FieldType.Default,\n                data: Enums_1.FieldType.Default,\n                target: Enums_1.FieldType.Default,\n                type: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Default,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default,\n                dependencyKind: Enums_1.FieldType.Default,\n                dependencySource: Enums_1.FieldType.Default,\n                commandName: Enums_1.FieldType.Default,\n                dependencyTypeName: Enums_1.FieldType.Default,\n            };\n            _this.id = id;\n            _this.duration = Util_1.Util.msToTimeSpan(value);\n            _this.success = success;\n            _this.resultCode = resultCode + \"\";\n            _this.type = \"Ajax\";\n            _this.data = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, commandName);\n            var dependencyFields = Util_2.AjaxHelper.ParseDependencyPath(logger, absoluteUrl, method, commandName);\n            _this.target = dependencyFields.target;\n            _this.name = dependencyFields.name;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n        RemoteDependencyData.dataType = \"RemoteDependencyData\";\n        return RemoteDependencyData;\n    }(RemoteDependencyData_1.RemoteDependencyData));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MessageData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MessageData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Trace = /** @class */ (function (_super) {\n        __extends(Trace, _super);\n        /**\n         * Constructs a new instance of the TraceTelemetry object\n         */\n        function Trace(logger, message, properties, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default\n            };\n            message = message || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, message);\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n        Trace.dataType = \"MessageData\";\n        return Trace;\n    }(MessageData_1.MessageData));\n    exports.Trace = Trace;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Trace.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\":\n/*!********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js ***!\n  \\********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, DataSanitizer_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TelemetryItemCreator = /** @class */ (function () {\n        function TelemetryItemCreator() {\n        }\n        /**\n         * Create a telemetry item that the 1DS channel understands\n         * @param item domain specific properties; part B\n         * @param baseType telemetry item type. ie PageViewData\n         * @param envelopeName name of the envelope. ie Microsoft.ApplicationInsights.<instrumentation key>.PageView\n         * @param customProperties user defined custom properties; part C\n         * @param systemProperties system properties that are added to the context; part A\n         * @returns ITelemetryItem that is sent to channel\n         */\n        TelemetryItemCreator.create = function (item, baseType, envelopeName, logger, customProperties, systemProperties) {\n            envelopeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, envelopeName) || Util_1.Util.NotSpecified;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(item) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(baseType) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(envelopeName)) {\n                throw Error(\"Input doesn't contain all required fields\");\n            }\n            var telemetryItem = {\n                name: envelopeName,\n                timestamp: new Date(),\n                instrumentationKey: \"\",\n                ctx: systemProperties ? systemProperties : {},\n                tags: [],\n                data: {},\n                baseType: baseType,\n                baseData: item\n            };\n            // Part C\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties)) {\n                for (var prop in customProperties) {\n                    if (customProperties.hasOwnProperty(prop)) {\n                        telemetryItem.data[prop] = customProperties[prop];\n                    }\n                }\n            }\n            return telemetryItem;\n        };\n        return TelemetryItemCreator;\n    }());\n    exports.TelemetryItemCreator = TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TelemetryItemCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Util.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Util.js ***!\n  \\****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Enums_1, applicationinsights_core_js_1, RequestResponseHeaders_1, DataSanitizer_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Util = /** @class */ (function () {\n        function Util() {\n        }\n        /*\n         * Force the SDK not to use local and session storage\n        */\n        Util.disableStorage = function () {\n            Util._canUseLocalStorage = false;\n            Util._canUseSessionStorage = false;\n        };\n        /**\n         * Gets the localStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getLocalStorageObject = function () {\n            if (Util.canUseLocalStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return null;\n        };\n        /**\n         * Tests storage object (localStorage or sessionStorage) to verify that it is usable\n         * More details here: https://mathiasbynens.be/notes/localstorage-pattern\n         * @param storageType Type of storage\n         * @return {Storage} Returns storage object verified that it is usable\n         */\n        Util._getVerifiedStorageObject = function (storageType) {\n            var storage = null;\n            var fail;\n            var uid;\n            try {\n                uid = new Date;\n                storage = storageType === Enums_1.StorageType.LocalStorage ? window.localStorage : window.sessionStorage;\n                storage.setItem(uid, uid);\n                fail = storage.getItem(uid) != uid;\n                storage.removeItem(uid);\n                if (fail) {\n                    storage = null;\n                }\n            }\n            catch (exception) {\n                storage = null;\n            }\n            return storage;\n        };\n        /**\n         *  Checks if endpoint URL is application insights internal injestion service URL.\n         *\n         *  @param endpointUrl Endpoint URL to check.\n         *  @returns {boolean} True if if endpoint URL is application insights internal injestion service URL.\n         */\n        Util.isInternalApplicationInsightsEndpoint = function (endpointUrl) {\n            return Util._internalEndpoints.indexOf(endpointUrl.toLowerCase()) !== -1;\n        };\n        /**\n         *  Check if the browser supports local storage.\n         *\n         *  @returns {boolean} True if local storage is supported.\n         */\n        Util.canUseLocalStorage = function () {\n            if (Util._canUseLocalStorage === undefined) {\n                Util._canUseLocalStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return Util._canUseLocalStorage;\n        };\n        /**\n         *  Get an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadLocalStorage, \"Browser failed read of local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's local storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setStorage = function (logger, name, data) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteLocalStorage, \"Browser failed write to local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromLocalStorage, \"Browser failed removal of local storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         * Gets the sessionStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getSessionStorageObject = function () {\n            if (Util.canUseSessionStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return null;\n        };\n        /**\n         *  Check if the browser supports session storage.\n         *\n         *  @returns {boolean} True if session storage is supported.\n         */\n        Util.canUseSessionStorage = function () {\n            if (Util._canUseSessionStorage === undefined) {\n                Util._canUseSessionStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return Util._canUseSessionStorage;\n        };\n        /**\n         *  Gets the list of session storage keys\n         *\n         *  @returns {string[]} List of session storage keys\n         */\n        Util.getSessionStorageKeys = function () {\n            var keys = [];\n            if (Util.canUseSessionStorage()) {\n                for (var key in window.sessionStorage) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n        /**\n         *  Get an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadSessionStorage, \"Browser failed read of session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's session storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setSessionStorage = function (logger, name, data) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteSessionStorage, \"Browser failed write to session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromSessionStorage, \"Browser failed removal of session storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /*\n         * Force the SDK not to store and read any data from cookies\n         */\n        Util.disableCookies = function () {\n            Util._canUseCookies = false;\n        };\n        /*\n         * helper method to tell if document.cookie object is available\n         */\n        Util.canUseCookies = function (logger) {\n            if (Util._canUseCookies === undefined) {\n                Util._canUseCookies = false;\n                try {\n                    Util._canUseCookies = Util.document.cookie !== undefined;\n                }\n                catch (e) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotAccessCookie, \"Cannot access document.cookie - \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n                ;\n            }\n            return Util._canUseCookies;\n        };\n        /**\n         * helper method to set userId and sessionId cookie\n         */\n        Util.setCookie = function (logger, name, value, domain) {\n            var domainAttrib = \"\";\n            var secureAttrib = \"\";\n            if (domain) {\n                domainAttrib = \";domain=\" + domain;\n            }\n            if (Util.document.location && Util.document.location.protocol === \"https:\") {\n                secureAttrib = \";secure\";\n            }\n            if (Util.canUseCookies(logger)) {\n                Util.document.cookie = name + \"=\" + value + domainAttrib + \";path=/\" + secureAttrib;\n            }\n        };\n        Util.stringToBoolOrDefault = function (str, defaultValue) {\n            if (defaultValue === void 0) { defaultValue = false; }\n            if (str === undefined || str === null) {\n                return defaultValue;\n            }\n            return str.toString().toLowerCase() === \"true\";\n        };\n        /**\n         * helper method to access userId and sessionId cookie\n         */\n        Util.getCookie = function (logger, name) {\n            if (!Util.canUseCookies(logger)) {\n                return;\n            }\n            var value = \"\";\n            if (name && name.length) {\n                var cookieName = name + \"=\";\n                var cookies = Util.document.cookie.split(\";\");\n                for (var i = 0; i < cookies.length; i++) {\n                    var cookie = cookies[i];\n                    cookie = Util.trim(cookie);\n                    if (cookie && cookie.indexOf(cookieName) === 0) {\n                        value = cookie.substring(cookieName.length, cookies[i].length);\n                        break;\n                    }\n                }\n            }\n            return value;\n        };\n        /**\n         * Deletes a cookie by setting it's expiration time in the past.\n         * @param name - The name of the cookie to delete.\n         */\n        Util.deleteCookie = function (logger, name) {\n            if (Util.canUseCookies(logger)) {\n                // Setting the expiration date in the past immediately removes the cookie\n                Util.document.cookie = name + \"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n            }\n        };\n        /**\n         * helper method to trim strings (IE8 does not implement String.prototype.trim)\n         */\n        Util.trim = function (str) {\n            if (typeof str !== \"string\")\n                return str;\n            return str.replace(/^\\s+|\\s+$/g, \"\");\n        };\n        /**\n         * generate random id string\n         */\n        Util.newId = function () {\n            var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            var result = \"\";\n            // tslint:disable-next-line:insecure-random\n            var random = Math.random() * 1073741824; //5 symbols in base64, almost maxint\n            while (random > 0) {\n                var char = base64chars.charAt(random % 64);\n                result += char;\n                random = Math.floor(random / 64);\n            }\n            return result;\n        };\n        /**\n         * Check if an object is of type Array\n         */\n        Util.isArray = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n        /**\n         * Check if an object is of type Error\n         */\n        Util.isError = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Error]\";\n        };\n        /**\n         * Check if an object is of type Date\n         */\n        Util.isDate = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Date]\";\n        };\n        /**\n         * Convert a date to I.S.O. format in IE8\n         */\n        Util.toISOStringForIE8 = function (date) {\n            if (Util.isDate(date)) {\n                if (Date.prototype.toISOString) {\n                    return date.toISOString();\n                }\n                else {\n                    var pad = function (num) {\n                        var r = String(num);\n                        if (r.length === 1) {\n                            r = \"0\" + r;\n                        }\n                        return r;\n                    };\n                    return date.getUTCFullYear()\n                        + \"-\" + pad(date.getUTCMonth() + 1)\n                        + \"-\" + pad(date.getUTCDate())\n                        + \"T\" + pad(date.getUTCHours())\n                        + \":\" + pad(date.getUTCMinutes())\n                        + \":\" + pad(date.getUTCSeconds())\n                        + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                        + \"Z\";\n                }\n            }\n        };\n        /**\n         * Gets IE version if we are running on IE, or null otherwise\n         */\n        Util.getIEVersion = function (userAgentStr) {\n            if (userAgentStr === void 0) { userAgentStr = null; }\n            var myNav = userAgentStr ? userAgentStr.toLowerCase() : navigator.userAgent.toLowerCase();\n            return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : null;\n        };\n        /**\n         * Convert ms to c# time span format\n         */\n        Util.msToTimeSpan = function (totalms) {\n            if (isNaN(totalms) || totalms < 0) {\n                totalms = 0;\n            }\n            totalms = Math.round(totalms);\n            var ms = \"\" + totalms % 1000;\n            var sec = \"\" + Math.floor(totalms / 1000) % 60;\n            var min = \"\" + Math.floor(totalms / (1000 * 60)) % 60;\n            var hour = \"\" + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n            var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n            ms = ms.length === 1 ? \"00\" + ms : ms.length === 2 ? \"0\" + ms : ms;\n            sec = sec.length < 2 ? \"0\" + sec : sec;\n            min = min.length < 2 ? \"0\" + min : min;\n            hour = hour.length < 2 ? \"0\" + hour : hour;\n            return (days > 0 ? days + \".\" : \"\") + hour + \":\" + min + \":\" + sec + \".\" + ms;\n        };\n        /**\n        * Checks if error has no meaningful data inside. Ususally such errors are received by window.onerror when error\n        * happens in a script from other domain (cross origin, CORS).\n        */\n        Util.isCrossOriginError = function (message, url, lineNumber, columnNumber, error) {\n            return (message === \"Script error.\" || message === \"Script error\") && !error;\n        };\n        /**\n        * Returns string representation of an object suitable for diagnostics logging.\n        */\n        Util.dump = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            var propertyValueDump = JSON.stringify(object);\n            if (objectTypeDump === \"[object Error]\") {\n                propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n            }\n            return objectTypeDump + propertyValueDump;\n        };\n        /**\n        * Returns the name of object if it's an Error. Otherwise, returns empty string.\n        */\n        Util.getExceptionName = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            if (objectTypeDump === \"[object Error]\") {\n                return object.name;\n            }\n            return \"\";\n        };\n        /**\n         * Adds an event handler for the specified event\n         * @param eventName {string} - The name of the event\n         * @param callback {any} - The callback function that needs to be executed for the given event\n         * @return {boolean} - true if the handler was successfully added\n         */\n        Util.addEventHandler = function (eventName, callback) {\n            if (!window || typeof eventName !== 'string' || typeof callback !== 'function') {\n                return false;\n            }\n            // Create verb for the event\n            var verbEventName = 'on' + eventName;\n            // check if addEventListener is available\n            if (window.addEventListener) {\n                window.addEventListener(eventName, callback, false);\n            }\n            else if (window[\"attachEvent\"]) {\n                window[\"attachEvent\"](verbEventName, callback);\n            }\n            else {\n                return false;\n            }\n            return true;\n        };\n        /**\n         * Tells if a browser supports a Beacon API\n         */\n        Util.IsBeaconApiSupported = function () {\n            return ('sendBeacon' in navigator && navigator.sendBeacon);\n        };\n        Util.document = typeof document !== \"undefined\" ? document : {};\n        Util._canUseCookies = undefined;\n        Util._canUseLocalStorage = undefined;\n        Util._canUseSessionStorage = undefined;\n        // listing only non-geo specific locations \n        Util._internalEndpoints = [\n            \"https://dc.services.visualstudio.com/v2/track\",\n            \"https://breeze.aimon.applicationinsights.io/v2/track\",\n            \"https://dc-int.services.visualstudio.com/v2/track\"\n        ];\n        Util.NotSpecified = \"not_specified\";\n        return Util;\n    }());\n    exports.Util = Util;\n    var UrlHelper = /** @class */ (function () {\n        function UrlHelper() {\n        }\n        UrlHelper.parseUrl = function (url) {\n            if (!UrlHelper.htmlAnchorElement) {\n                UrlHelper.htmlAnchorElement = !!UrlHelper.document.createElement ? UrlHelper.document.createElement('a') : {};\n            }\n            UrlHelper.htmlAnchorElement.href = url;\n            return UrlHelper.htmlAnchorElement;\n        };\n        UrlHelper.getAbsoluteUrl = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.href;\n            }\n            return result;\n        };\n        UrlHelper.getPathName = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.pathname;\n            }\n            return result;\n        };\n        UrlHelper.getCompleteUrl = function (method, absoluteUrl) {\n            if (method) {\n                return method.toUpperCase() + \" \" + absoluteUrl;\n            }\n            else {\n                return absoluteUrl;\n            }\n        };\n        UrlHelper.document = typeof document !== \"undefined\" ? document : {};\n        return UrlHelper;\n    }());\n    exports.UrlHelper = UrlHelper;\n    var CorrelationIdHelper = /** @class */ (function () {\n        function CorrelationIdHelper() {\n        }\n        /**\n        * Checks if a request url is not on a excluded domain list and if it is safe to add correlation headers\n        */\n        CorrelationIdHelper.canIncludeCorrelationHeader = function (config, requestUrl, currentHost) {\n            if (config && config.disableCorrelationHeaders) {\n                return false;\n            }\n            if (!requestUrl) {\n                return false;\n            }\n            var requestHost = UrlHelper.parseUrl(requestUrl).host.toLowerCase();\n            if ((!config || !config.enableCorsCorrelation) && requestHost !== currentHost) {\n                return false;\n            }\n            var excludedDomains = config && config.correlationHeaderExcludedDomains;\n            if (!excludedDomains || excludedDomains.length == 0) {\n                return true;\n            }\n            for (var i = 0; i < excludedDomains.length; i++) {\n                var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\./g, \"\\.\").replace(/\\*/g, \".*\"));\n                if (regex.test(requestHost)) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n        * Combines target appId and target role name from response header.\n        */\n        CorrelationIdHelper.getCorrelationContext = function (responseHeader) {\n            if (responseHeader) {\n                var correlationId = CorrelationIdHelper.getCorrelationContextValue(responseHeader, RequestResponseHeaders_1.RequestHeaders.requestContextTargetKey);\n                if (correlationId && correlationId !== CorrelationIdHelper.correlationIdPrefix) {\n                    return correlationId;\n                }\n            }\n        };\n        /**\n        * Gets key from correlation response header\n        */\n        CorrelationIdHelper.getCorrelationContextValue = function (responseHeader, key) {\n            if (responseHeader) {\n                var keyValues = responseHeader.split(\",\");\n                for (var i = 0; i < keyValues.length; ++i) {\n                    var keyValue = keyValues[i].split(\"=\");\n                    if (keyValue.length == 2 && keyValue[0] == key) {\n                        return keyValue[1];\n                    }\n                }\n            }\n        };\n        CorrelationIdHelper.correlationIdPrefix = \"cid-v1:\";\n        return CorrelationIdHelper;\n    }());\n    exports.CorrelationIdHelper = CorrelationIdHelper;\n    var AjaxHelper = /** @class */ (function () {\n        function AjaxHelper() {\n        }\n        AjaxHelper.ParseDependencyPath = function (logger, absoluteUrl, method, pathName) {\n            var target, name;\n            if (absoluteUrl && absoluteUrl.length > 0) {\n                var parsedUrl = UrlHelper.parseUrl(absoluteUrl);\n                target = parsedUrl.host;\n                if (parsedUrl.pathname != null) {\n                    var pathName = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                    if (pathName.charAt(0) !== '/') {\n                        pathName = \"/\" + pathName;\n                    }\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, method ? method + \" \" + pathName : pathName);\n                }\n                else {\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, absoluteUrl);\n                }\n            }\n            else {\n                target = pathName;\n                name = pathName;\n            }\n            return {\n                target: target,\n                name: name\n            };\n        };\n        return AjaxHelper;\n    }());\n    exports.AjaxHelper = AjaxHelper;\n    /**\n     * A utility class that helps getting time related parameters\n     */\n    var DateTimeUtils = /** @class */ (function () {\n        function DateTimeUtils() {\n        }\n        /**\n         * Get the number of milliseconds since 1970/01/01 in local timezone\n         */\n        DateTimeUtils.Now = (window.performance && window.performance.now && window.performance.timing) ?\n            function () {\n                return window.performance.now() + window.performance.timing.navigationStart;\n            }\n            :\n                function () {\n                    return new Date().getTime();\n                };\n        /**\n         * Gets duration between two timestamps\n         */\n        DateTimeUtils.GetDuration = function (start, end) {\n            var result = null;\n            if (start !== 0 && end !== 0 && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(start) && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(end)) {\n                result = end - start;\n            }\n            return result;\n        };\n        return DateTimeUtils;\n    }());\n    exports.DateTimeUtils = DateTimeUtils;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Util.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/applicationinsights-common.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Constants */ \"./node_modules/applicationinsights-common/bundle/Constants.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\"), __webpack_require__(/*! ./Telemetry/Common/Envelope */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\"), __webpack_require__(/*! ./Telemetry/Event */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\"), __webpack_require__(/*! ./Telemetry/Exception */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\"), __webpack_require__(/*! ./Telemetry/Metric */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\"), __webpack_require__(/*! ./Telemetry/PageView */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Telemetry/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\"), __webpack_require__(/*! ./Telemetry/Trace */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\"), __webpack_require__(/*! ./Telemetry/PageViewPerformance */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\"), __webpack_require__(/*! ./Telemetry/Common/Data */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/SeverityLevel */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/ContextTagKeys */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ./TelemetryItemCreator */ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, Enums_1, RequestResponseHeaders_1, Constants_1, Data_1, Base_1, Envelope_1, Event_1, Exception_1, Metric_1, PageView_1, PageViewData_1, RemoteDependencyData_1, Trace_1, PageViewPerformance_1, Data_2, SeverityLevel_1, ContextTagKeys_1, DataSanitizer_1, TelemetryItemCreator_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Util = Util_1.Util;\n    exports.CorrelationIdHelper = Util_1.CorrelationIdHelper;\n    exports.UrlHelper = Util_1.UrlHelper;\n    exports.DateTimeUtils = Util_1.DateTimeUtils;\n    exports.FieldType = Enums_1.FieldType;\n    exports.RequestHeaders = RequestResponseHeaders_1.RequestHeaders;\n    exports.DisabledPropertyName = Constants_1.DisabledPropertyName;\n    exports.AIData = Data_1.Data;\n    exports.AIBase = Base_1.Base;\n    exports.Envelope = Envelope_1.Envelope;\n    exports.Event = Event_1.Event;\n    exports.Exception = Exception_1.Exception;\n    exports.Metric = Metric_1.Metric;\n    exports.PageView = PageView_1.PageView;\n    exports.PageViewData = PageViewData_1.PageViewData;\n    exports.RemoteDependencyData = RemoteDependencyData_1.RemoteDependencyData;\n    exports.Trace = Trace_1.Trace;\n    exports.PageViewPerformance = PageViewPerformance_1.PageViewPerformance;\n    exports.Data = Data_2.Data;\n    exports.SeverityLevel = SeverityLevel_1.SeverityLevel;\n    exports.ContextTagKeys = ContextTagKeys_1.ContextTagKeys;\n    exports.DataSanitizer = DataSanitizer_1.DataSanitizer;\n    exports.TelemetryItemCreator = TelemetryItemCreator_1.TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-common.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n     */\n    exports.EventsDiscardedReason = {\n        /**\n         * Unknown.\n         */\n        Unknown: 0,\n        /**\n         * Status set to non-retryable.\n         */\n        NonRetryableStatus: 1,\n        /**\n         * The event is invalid.\n         */\n        InvalidEvent: 2,\n        /**\n         * The size of the event is too large.\n         */\n        SizeLimitExceeded: 3,\n        /**\n         * The server is not accepting events from this instrumentation key.\n         */\n        KillSwitch: 4,\n        /**\n         * The event queue is full.\n         */\n        QueueFull: 5,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventsDiscardedReason.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\":\n/*!*********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js ***!\n  \\*********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var LoggingSeverity;\n    (function (LoggingSeverity) {\n        /**\n         * Error will be sent as internal telemetry\n         */\n        LoggingSeverity[LoggingSeverity[\"CRITICAL\"] = 1] = \"CRITICAL\";\n        /**\n         * Error will NOT be sent as internal telemetry, and will only be shown in browser console\n         */\n        LoggingSeverity[LoggingSeverity[\"WARNING\"] = 2] = \"WARNING\";\n    })(LoggingSeverity = exports.LoggingSeverity || (exports.LoggingSeverity = {}));\n    /**\n     * Internal message ID. Please create a new one for every conceptually different message. Please keep alphabetically ordered\n     */ ;\n    exports._InternalMessageId = {\n        // Non user actionable\n        BrowserDoesNotSupportLocalStorage: 0,\n        BrowserCannotReadLocalStorage: 1,\n        BrowserCannotReadSessionStorage: 2,\n        BrowserCannotWriteLocalStorage: 3,\n        BrowserCannotWriteSessionStorage: 4,\n        BrowserFailedRemovalFromLocalStorage: 5,\n        BrowserFailedRemovalFromSessionStorage: 6,\n        CannotSendEmptyTelemetry: 7,\n        ClientPerformanceMathError: 8,\n        ErrorParsingAISessionCookie: 9,\n        ErrorPVCalc: 10,\n        ExceptionWhileLoggingError: 11,\n        FailedAddingTelemetryToBuffer: 12,\n        FailedMonitorAjaxAbort: 13,\n        FailedMonitorAjaxDur: 14,\n        FailedMonitorAjaxOpen: 15,\n        FailedMonitorAjaxRSC: 16,\n        FailedMonitorAjaxSend: 17,\n        FailedMonitorAjaxGetCorrelationHeader: 18,\n        FailedToAddHandlerForOnBeforeUnload: 19,\n        FailedToSendQueuedTelemetry: 20,\n        FailedToReportDataLoss: 21,\n        FlushFailed: 22,\n        MessageLimitPerPVExceeded: 23,\n        MissingRequiredFieldSpecification: 24,\n        NavigationTimingNotSupported: 25,\n        OnError: 26,\n        SessionRenewalDateIsZero: 27,\n        SenderNotInitialized: 28,\n        StartTrackEventFailed: 29,\n        StopTrackEventFailed: 30,\n        StartTrackFailed: 31,\n        StopTrackFailed: 32,\n        TelemetrySampledAndNotSent: 33,\n        TrackEventFailed: 34,\n        TrackExceptionFailed: 35,\n        TrackMetricFailed: 36,\n        TrackPVFailed: 37,\n        TrackPVFailedCalc: 38,\n        TrackTraceFailed: 39,\n        TransmissionFailed: 40,\n        FailedToSetStorageBuffer: 41,\n        FailedToRestoreStorageBuffer: 42,\n        InvalidBackendResponse: 43,\n        FailedToFixDepricatedValues: 44,\n        InvalidDurationValue: 45,\n        TelemetryEnvelopeInvalid: 46,\n        CreateEnvelopeError: 47,\n        // User actionable\n        CannotSerializeObject: 48,\n        CannotSerializeObjectNonSerializable: 49,\n        CircularReferenceDetected: 50,\n        ClearAuthContextFailed: 51,\n        ExceptionTruncated: 52,\n        IllegalCharsInName: 53,\n        ItemNotInArray: 54,\n        MaxAjaxPerPVExceeded: 55,\n        MessageTruncated: 56,\n        NameTooLong: 57,\n        SampleRateOutOfRange: 58,\n        SetAuthContextFailed: 59,\n        SetAuthContextFailedAccountName: 60,\n        StringValueTooLong: 61,\n        StartCalledMoreThanOnce: 62,\n        StopCalledWithoutStart: 63,\n        TelemetryInitializerFailed: 64,\n        TrackArgumentsNotSpecified: 65,\n        UrlTooLong: 66,\n        SessionStorageBufferFull: 67,\n        CannotAccessCookie: 68,\n        IdTooLong: 69,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=LoggingEnums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = 100;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=IChannelControls.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventsDiscardedReason_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var AppInsightsCore = /** @class */ (function () {\n        function AppInsightsCore() {\n            this._isInitialized = false;\n            this._extensions = new Array();\n            this._channelController = new ChannelController();\n        }\n        AppInsightsCore.prototype.initialize = function (config, extensions) {\n            var _this = this;\n            // Make sure core is only initialized once\n            if (this._isInitialized) {\n                throw Error(\"Core should not be initialized more than once\");\n            }\n            if (!config || CoreUtils_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                throw Error(\"Please provide instrumentation key\");\n            }\n            this.config = config;\n            this._notificationManager = new NotificationManager_1.NotificationManager();\n            this.config.extensions = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensions) ? [] : this.config.extensions;\n            // add notification to the extensions in the config so other plugins can access it\n            this.config.extensionConfig = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensionConfig) ? {} : this.config.extensionConfig;\n            this.config.extensionConfig.NotificationManager = this._notificationManager;\n            this.logger = new DiagnosticLogger_1.DiagnosticLogger(config);\n            // Initial validation\n            extensions.forEach(function (extension) {\n                if (CoreUtils_1.CoreUtils.isNullOrUndefined(extension.initialize)) {\n                    throw Error(validationError);\n                }\n            });\n            if (this.config.extensions.length > 0) {\n                var isValid_1 = true;\n                this.config.extensions.forEach(function (item) {\n                    if (CoreUtils_1.CoreUtils.isNullOrUndefined(item)) {\n                        isValid_1 = false;\n                    }\n                });\n                if (!isValid_1) {\n                    throw Error(validationError);\n                }\n            }\n            // Initial validation complete\n            // Concat all available extensions before sorting by priority\n            (_a = this._extensions).push.apply(_a, [this._channelController].concat(extensions, this.config.extensions));\n            this._extensions = this._extensions.sort(function (a, b) {\n                var extA = a;\n                var extB = b;\n                var typeExtA = typeof extA.processTelemetry;\n                var typeExtB = typeof extB.processTelemetry;\n                if (typeExtA === 'function' && typeExtB === 'function') {\n                    return extA.priority - extB.priority;\n                }\n                if (typeExtA === 'function' && typeExtB !== 'function') {\n                    // keep non telemetryplugin specific extensions at start\n                    return 1;\n                }\n                if (typeExtA !== 'function' && typeExtB === 'function') {\n                    return -1;\n                }\n            });\n            // sort complete\n            // Check if any two extensions have the same priority, then warn to console\n            var priority = {};\n            this._extensions.forEach(function (ext) {\n                var t = ext;\n                if (t && t.priority) {\n                    if (!CoreUtils_1.CoreUtils.isNullOrUndefined(priority[t.priority])) {\n                        _this.logger.warnToConsole(\"Two extensions have same priority\" + priority[t.priority] + \", \" + t.identifier);\n                    }\n                    else {\n                        priority[t.priority] = t.identifier; // set a value\n                    }\n                }\n            });\n            var c = -1;\n            // Set next plugin for all until channel controller\n            for (var idx = 0; idx < this._extensions.length - 1; idx++) {\n                var curr = (this._extensions[idx]);\n                if (curr && typeof curr.processTelemetry !== 'function') {\n                    // these are initialized only, allowing an entry point for extensions to be initialized when SDK initializes\n                    continue;\n                }\n                if (curr.priority === ChannelControllerPriority) {\n                    c = idx + 1;\n                    break; // channel controller will set remaining pipeline\n                }\n                this._extensions[idx].setNextPlugin(this._extensions[idx + 1]); // set next plugin\n            }\n            // initialize channel controller first, this will initialize all channel plugins\n            this._channelController.initialize(this.config, this, this._extensions);\n            // initialize remaining regular plugins\n            this._extensions.forEach(function (ext) {\n                var e = ext;\n                if (e && e.priority < ChannelControllerPriority) {\n                    ext.initialize(_this.config, _this, _this._extensions); // initialize\n                }\n            });\n            // Remove sender channels from main list\n            if (c < this._extensions.length) {\n                this._extensions.splice(c);\n            }\n            if (this.getTransmissionControls().length === 0) {\n                throw new Error(\"No channels available\");\n            }\n            this._isInitialized = true;\n            var _a;\n        };\n        AppInsightsCore.prototype.getTransmissionControls = function () {\n            return this._channelController.ChannelControls;\n        };\n        AppInsightsCore.prototype.track = function (telemetryItem) {\n            if (telemetryItem === null) {\n                this._notifiyInvalidEvent(telemetryItem);\n                // throw error\n                throw Error(\"Invalid telemetry item\");\n            }\n            if (telemetryItem.baseData && !telemetryItem.baseType) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"Provide data.baseType for data.baseData\");\n            }\n            if (!telemetryItem.baseType) {\n                // Hard coded from Common::Event.ts::Event.dataType\n                telemetryItem.baseType = \"EventData\";\n            }\n            if (!telemetryItem.instrumentationKey) {\n                // setup default ikey if not passed in\n                telemetryItem.instrumentationKey = this.config.instrumentationKey;\n            }\n            if (!telemetryItem.timestamp) {\n                // add default timestamp if not passed in\n                telemetryItem.timestamp = new Date();\n            }\n            // do basic validation before sending it through the pipeline\n            this._validateTelmetryItem(telemetryItem);\n            // invoke any common telemetry processors before sending through pipeline\n            var i = 0;\n            while (i < this._extensions.length) {\n                if (this._extensions[i].processTelemetry) {\n                    this._extensions[i].processTelemetry(telemetryItem); // pass on to first extension that can support processing\n                    break;\n                }\n                i++;\n            }\n        };\n        /**\n         * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n         * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n         * called.\n         * @param {INotificationListener} listener - An INotificationListener object.\n         */\n        AppInsightsCore.prototype.addNotificationListener = function (listener) {\n            this._notificationManager.addNotificationListener(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - INotificationListener to remove.\n         */\n        AppInsightsCore.prototype.removeNotificationListener = function (listener) {\n            this._notificationManager.removeNotificationListener(listener);\n        };\n        /**\n         * Periodically check logger.queue for\n         */\n        AppInsightsCore.prototype.pollInternalLogs = function () {\n            var _this = this;\n            if (!(this.config.diagnosticLoggingInterval > 0)) {\n                throw Error(\"config.diagnosticLoggingInterval must be a positive integer\");\n            }\n            return setInterval(function () {\n                var queue = _this.logger.queue;\n                queue.forEach(function (logMessage) {\n                    var item = {\n                        name: \"InternalMessageId: \" + logMessage.messageId,\n                        instrumentationKey: _this.config.instrumentationKey,\n                        timestamp: new Date(),\n                        baseType: DiagnosticLogger_1._InternalLogMessage.dataType,\n                        baseData: { message: logMessage.message }\n                    };\n                    _this.track(item);\n                });\n                queue.length = 0;\n            }, this.config.diagnosticLoggingInterval);\n        };\n        AppInsightsCore.prototype._validateTelmetryItem = function (telemetryItem) {\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.name)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry name required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.timestamp)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry timestamp required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.instrumentationKey)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry instrumentationKey required\");\n            }\n        };\n        AppInsightsCore.prototype._notifiyInvalidEvent = function (telemetryItem) {\n            this._notificationManager.eventsDiscarded([telemetryItem], EventsDiscardedReason_1.EventsDiscardedReason.InvalidEvent);\n        };\n        return AppInsightsCore;\n    }());\n    exports.AppInsightsCore = AppInsightsCore;\n    var ChannelController = /** @class */ (function () {\n        function ChannelController() {\n            this.identifier = \"ChannelControllerPlugin\";\n            this.priority = ChannelControllerPriority; // in reserved range 100 to 200\n        }\n        ChannelController.prototype.processTelemetry = function (item) {\n            this.channelQueue.forEach(function (queues) {\n                // pass on to first item in queue\n                if (queues.length > 0) {\n                    queues[0].processTelemetry(item);\n                }\n            });\n        };\n        Object.defineProperty(ChannelController.prototype, \"ChannelControls\", {\n            get: function () {\n                return this.channelQueue;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        ChannelController.prototype.initialize = function (config, core, extensions) {\n            var _this = this;\n            this.channelQueue = new Array();\n            if (config.channels) {\n                config.channels.forEach(function (queue) {\n                    if (queue && queue.length > 0) {\n                        queue = queue.sort(function (a, b) {\n                            return a.priority - b.priority;\n                        });\n                        // Initialize each plugin\n                        queue.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                        for (var i = 1; i < queue.length; i++) {\n                            queue[i - 1].setNextPlugin(queue[i]); // setup processing chain\n                        }\n                        _this.channelQueue.push(queue);\n                    }\n                });\n            }\n            else {\n                var arr = new Array();\n                for (var i = 0; i < extensions.length; i++) {\n                    var plugin = extensions[i];\n                    if (plugin.priority > ChannelControllerPriority) {\n                        arr.push(plugin);\n                    }\n                }\n                if (arr.length > 0) {\n                    // sort if not sorted\n                    arr = arr.sort(function (a, b) {\n                        return a.priority - b.priority;\n                    });\n                    // Initialize each plugin\n                    arr.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                    // setup next plugin\n                    for (var i = 1; i < arr.length; i++) {\n                        arr[i - 1].setNextPlugin(arr[i]);\n                    }\n                    this.channelQueue.push(arr);\n                }\n            }\n        };\n        return ChannelController;\n    }());\n    var validationError = \"Extensions must provide callback to initialize\";\n    var ChannelControllerPriority = 200;\n    var duplicatePriority = \"One or more extensions are set at same priority\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=AppInsightsCore.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var CoreUtils = /** @class */ (function () {\n        function CoreUtils() {\n        }\n        CoreUtils.isNullOrUndefined = function (input) {\n            return input === null || input === undefined;\n        };\n        /**\n    * Creates a new GUID.\n    * @return {string} A GUID.\n    */\n        CoreUtils.newGuid = function () {\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(GuidRegex, function (c) {\n                // tslint:disable-next-line:insecure-random\n                var r = (Math.random() * 16 | 0), v = (c === 'x' ? r : r & 0x3 | 0x8);\n                return v.toString(16);\n            });\n        };\n        return CoreUtils;\n    }());\n    exports.CoreUtils = CoreUtils;\n    var GuidRegex = /[xy]/g;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=CoreUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\":\n/*!*******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js ***!\n  \\*******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, LoggingEnums_1, CoreUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var _InternalLogMessage = /** @class */ (function () {\n        function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            this.messageId = msgId;\n            this.message =\n                (isUserAct ? _InternalLogMessage.AiUserActionablePrefix : _InternalLogMessage.AiNonUserActionablePrefix) +\n                    msgId;\n            var diagnosticText = (msg ? \" message:\" + _InternalLogMessage.sanitizeDiagnosticText(msg) : \"\") +\n                (properties ? \" props:\" + _InternalLogMessage.sanitizeDiagnosticText(JSON.stringify(properties)) : \"\");\n            this.message += diagnosticText;\n        }\n        _InternalLogMessage.sanitizeDiagnosticText = function (text) {\n            return \"\\\"\" + text.replace(/\\\"/g, \"\") + \"\\\"\";\n        };\n        _InternalLogMessage.dataType = \"MessageData\";\n        /**\n         * For user non actionable traces use AI Internal prefix.\n         */\n        _InternalLogMessage.AiNonUserActionablePrefix = \"AI (Internal): \";\n        /**\n         * Prefix of the traces in portal.\n         */\n        _InternalLogMessage.AiUserActionablePrefix = \"AI: \";\n        return _InternalLogMessage;\n    }());\n    exports._InternalLogMessage = _InternalLogMessage;\n    var DiagnosticLogger = /** @class */ (function () {\n        function DiagnosticLogger(config) {\n            /**\n            *  Session storage key for the prefix for the key indicating message type already logged\n            */\n            this.AIInternalMessagePrefix = \"AITR_\";\n            /**\n             * When this is true the SDK will throw exceptions to aid in debugging.\n             */\n            this.enableDebugExceptions = function () { return false; };\n            /**\n             * 0: OFF\n             * 1: CRITICAL (default)\n             * 2: >= WARNING\n             */\n            this.consoleLoggingLevel = function () { return 1; };\n            /**\n             * 0: OFF (default)\n             * 1: CRITICAL\n             * 2: >= WARNING\n             */\n            this.telemetryLoggingLevel = function () { return 0; };\n            /**\n             * The maximum number of internal messages allowed to be sent per page view\n             */\n            this.maxInternalMessageLimit = function () { return 25; };\n            /**\n             * The internal logging queue\n             */\n            this.queue = [];\n            /**\n             * Count of internal messages sent\n             */\n            this._messageCount = 0;\n            /**\n             * Holds information about what message types were already logged to console or sent to server.\n             */\n            this._messageLogged = {};\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(config)) {\n                // TODO: Use default config\n                // config = AppInsightsCore.defaultConfig;\n                // For now, use defaults specified in DiagnosticLogger members;\n                return;\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelConsole)) {\n                this.consoleLoggingLevel = function () { return config.loggingLevelConsole; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelTelemetry)) {\n                this.telemetryLoggingLevel = function () { return config.loggingLevelTelemetry; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.maxMessageLimit)) {\n                this.maxInternalMessageLimit = function () { return config.maxMessageLimit; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.enableDebugExceptions)) {\n                this.enableDebugExceptions = function () { return config.enableDebugExceptions; };\n            }\n        }\n        /**\n         * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The log message.\n         */\n        DiagnosticLogger.prototype.throwInternal = function (severity, msgId, msg, properties, isUserAct) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n            if (this.enableDebugExceptions()) {\n                throw message;\n            }\n            else {\n                if (typeof (message) !== \"undefined\" && !!message) {\n                    if (typeof (message.message) !== \"undefined\") {\n                        if (isUserAct) {\n                            // check if this message type was already logged to console for this page view and if so, don't log it again\n                            var messageKey = +message.messageId;\n                            if (!this._messageLogged[messageKey] || this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                                this._messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            // don't log internal AI traces in the console, unless the verbose logging is enabled\n                            if (this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                            }\n                        }\n                        this.logInternalMessage(severity, message);\n                    }\n                }\n            }\n        };\n        /**\n         * This will write a warning to the console if possible\n         * @param message {string} - The warning message\n         */\n        DiagnosticLogger.prototype.warnToConsole = function (message) {\n            if (typeof console !== \"undefined\" && !!console) {\n                if (typeof console.warn === \"function\") {\n                    console.warn(message);\n                }\n                else if (typeof console.log === \"function\") {\n                    console.log(message);\n                }\n            }\n        };\n        /**\n         * Resets the internal message count\n         */\n        DiagnosticLogger.prototype.resetInternalMessageCount = function () {\n            this._messageCount = 0;\n            this._messageLogged = {};\n        };\n        /**\n         * Logs a message to the internal queue.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The message to log.\n         */\n        DiagnosticLogger.prototype.logInternalMessage = function (severity, message) {\n            if (this._areInternalMessagesThrottled()) {\n                return;\n            }\n            // check if this message type was already logged for this session and if so, don't log it again\n            var logMessage = true;\n            var messageKey = this.AIInternalMessagePrefix + message.messageId;\n            // if the session storage is not available, limit to only one message type per page view\n            if (this._messageLogged[messageKey]) {\n                logMessage = false;\n            }\n            else {\n                this._messageLogged[messageKey] = true;\n            }\n            if (logMessage) {\n                // Push the event in the internal queue\n                if (severity <= this.telemetryLoggingLevel()) {\n                    this.queue.push(message);\n                    this._messageCount++;\n                }\n                // When throttle limit reached, send a special event\n                if (this._messageCount == this.maxInternalMessageLimit()) {\n                    var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                    var throttleMessage = new _InternalLogMessage(LoggingEnums_1._InternalMessageId.MessageLimitPerPVExceeded, throttleLimitMessage, false);\n                    this.queue.push(throttleMessage);\n                    this.warnToConsole(throttleLimitMessage);\n                }\n            }\n        };\n        /**\n         * Indicates whether the internal events are throttled\n         */\n        DiagnosticLogger.prototype._areInternalMessagesThrottled = function () {\n            return this._messageCount >= this.maxInternalMessageLimit();\n        };\n        return DiagnosticLogger;\n    }());\n    exports.DiagnosticLogger = DiagnosticLogger;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DiagnosticLogger.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Class to manage sending notifications to all the listeners.\n     */\n    var NotificationManager = /** @class */ (function () {\n        function NotificationManager() {\n            this.listeners = [];\n        }\n        /**\n         * Adds a notification listener.\n         * @param {INotificationListener} listener - The notification listener to be added.\n         */\n        NotificationManager.prototype.addNotificationListener = function (listener) {\n            this.listeners.push(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - AWTNotificationListener to remove.\n         */\n        NotificationManager.prototype.removeNotificationListener = function (listener) {\n            var index = this.listeners.indexOf(listener);\n            while (index > -1) {\n                this.listeners.splice(index, 1);\n                index = this.listeners.indexOf(listener);\n            }\n        };\n        /**\n         * Notification for events sent.\n         * @param {ITelemetryItem[]} events - The array of events that have been sent.\n         */\n        NotificationManager.prototype.eventsSent = function (events) {\n            var _this = this;\n            var _loop_1 = function (i) {\n                if (this_1.listeners[i].eventsSent) {\n                    setTimeout(function () { return _this.listeners[i].eventsSent(events); }, 0);\n                }\n            };\n            var this_1 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_1(i);\n            }\n        };\n        /**\n         * Notification for events being discarded.\n         * @param {ITelemetryItem[]} events - The array of events that have been discarded by the SDK.\n         * @param {number} reason           - The reason for which the SDK discarded the events. The EventsDiscardedReason\n         * constant should be used to check the different values.\n         */\n        NotificationManager.prototype.eventsDiscarded = function (events, reason) {\n            var _this = this;\n            var _loop_2 = function (i) {\n                if (this_2.listeners[i].eventsDiscarded) {\n                    setTimeout(function () { return _this.listeners[i].eventsDiscarded(events, reason); }, 0);\n                }\n            };\n            var this_2 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_2(i);\n            }\n        };\n        return NotificationManager;\n    }());\n    exports.NotificationManager = NotificationManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=NotificationManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\":\n/*!****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js ***!\n  \\****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK.Interfaces/IChannelControls */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./JavaScriptSDK/AppInsightsCore */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\"), __webpack_require__(/*! ./JavaScriptSDK/CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./JavaScriptSDK/NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./JavaScriptSDK/DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, IChannelControls_1, EventsDiscardedReason_1, AppInsightsCore_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1, LoggingEnums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = IChannelControls_1.MinChannelPriorty;\n    exports.EventsDiscardedReason = EventsDiscardedReason_1.EventsDiscardedReason;\n    exports.AppInsightsCore = AppInsightsCore_1.AppInsightsCore;\n    exports.CoreUtils = CoreUtils_1.CoreUtils;\n    exports.NotificationManager = NotificationManager_1.NotificationManager;\n    exports.DiagnosticLogger = DiagnosticLogger_1.DiagnosticLogger;\n    exports._InternalLogMessage = DiagnosticLogger_1._InternalLogMessage;\n    exports._InternalMessageId = LoggingEnums_1._InternalMessageId;\n    exports.LoggingSeverity = LoggingEnums_1.LoggingSeverity;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-core-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\":\n/*!*************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajax.js ***!\n  \\*************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./ajaxRecord */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\"), __webpack_require__(/*! ./ajaxUtils */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1, ajaxRecord_1, ajaxUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var AjaxMonitor = /** @class */ (function () {\n        function AjaxMonitor() {\n            this._trackAjaxAttempts = 0;\n            this.identifier = \"AjaxDependencyPlugin\";\n            this.priority = 161;\n            this.currentWindowHost = window && window.location.host && window.location.host.toLowerCase();\n            this.initialized = false;\n        }\n        ///<summary>Verifies that particalar instance of XMLHttpRequest needs to be monitored</summary>\n        ///<param name=\"excludeAjaxDataValidation\">Optional parameter. True if ajaxData must be excluded from verification</param>\n        ///<returns type=\"bool\">True if instance needs to be monitored, otherwise false</returns>\n        AjaxMonitor.prototype.isMonitoredInstance = function (xhr, excludeAjaxDataValidation) {\n            // checking to see that all interested functions on xhr were instrumented\n            return this.initialized\n                // checking on ajaxData to see that it was not removed in user code\n                && (excludeAjaxDataValidation === true || !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData))\n                // check that this instance is not not used by ajax call performed inside client side monitoring to send data to collector\n                && xhr[applicationinsights_common_1.DisabledPropertyName] !== true;\n        };\n        ///<summary>Determines whether ajax monitoring can be enabled on this document</summary>\n        ///<returns>True if Ajax monitoring is supported on this page, otherwise false</returns>\n        AjaxMonitor.prototype.supportsMonitoring = function () {\n            var result = true;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.open) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.send) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(XMLHttpRequest.prototype.abort)) {\n                result = false;\n            }\n            // disable in IE8 or older (https://www.w3schools.com/jsref/jsref_trim_string.asp)\n            try {\n                \" a \".trim();\n            }\n            catch (ex) {\n                result = false;\n            }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentOpen = function () {\n            var originalOpen = XMLHttpRequest.prototype.open;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.open = function (method, url, async) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this, true) &&\n                        (!this.ajaxData ||\n                            !this.ajaxData.xhrMonitoringState.openDone)) {\n                        ajaxMonitorInstance.openHandler(this, method, url, async);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxOpen, \"Failed to monitor XMLHttpRequest.open, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalOpen.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.openHandler = function (xhr, method, url, async) {\n            /* todo:\n            Disabling the following block of code as CV is not yet supported in 1DS for 3rd Part.\n            // this format corresponds with activity logic on server-side and is required for the correct correlation\n            var id = \"|\" + this.appInsights.context.operation.id + \".\" + Util.newId();\n            */\n            var id = applicationinsights_common_1.Util.newId();\n            var ajaxData = new ajaxRecord_1.ajaxRecord(id, this._core._logger);\n            ajaxData.method = method;\n            ajaxData.requestUrl = url;\n            ajaxData.xhrMonitoringState.openDone = true;\n            xhr.ajaxData = ajaxData;\n            this.attachToOnReadyStateChange(xhr);\n        };\n        AjaxMonitor.getFailedAjaxDiagnosticsMessage = function (xhr) {\n            var result = \"\";\n            try {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData) &&\n                    !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(xhr.ajaxData.requestUrl)) {\n                    result += \"(url: '\" + xhr.ajaxData.requestUrl + \"')\";\n                }\n            }\n            catch (e) { }\n            return result;\n        };\n        AjaxMonitor.prototype.instrumentSend = function () {\n            var originalSend = XMLHttpRequest.prototype.send;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.send = function (content) {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.sendDone) {\n                        ajaxMonitorInstance.sendHandler(this, content);\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxSend, \"Failed to monitor XMLHttpRequest, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalSend.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.sendHandler = function (xhr, content) {\n            xhr.ajaxData.requestSentTime = applicationinsights_common_1.DateTimeUtils.Now();\n            if (this.currentWindowHost && applicationinsights_common_1.CorrelationIdHelper.canIncludeCorrelationHeader(this._config, xhr.ajaxData.getAbsoluteUrl(), this.currentWindowHost)) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestIdHeader, xhr.ajaxData.id);\n                var appId = this._config.appId; // Todo: also, get appId from channel as breeze returns it\n                if (appId) {\n                    xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader, applicationinsights_common_1.RequestHeaders.requestContextAppIdFormat + appId);\n                }\n            }\n            xhr.ajaxData.xhrMonitoringState.sendDone = true;\n        };\n        AjaxMonitor.prototype.instrumentAbort = function () {\n            var originalAbort = XMLHttpRequest.prototype.abort;\n            var ajaxMonitorInstance = this;\n            XMLHttpRequest.prototype.abort = function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(this) && !this.ajaxData.xhrMonitoringState.abortDone) {\n                        this.ajaxData.aborted = 1;\n                        this.ajaxData.xhrMonitoringState.abortDone = true;\n                    }\n                }\n                catch (e) {\n                    this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxAbort, \"Failed to monitor XMLHttpRequest.abort, monitoring data for this ajax call may be incorrect.\", {\n                        ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(this),\n                        exception: applicationinsights_common_1.Util.dump(e)\n                    });\n                }\n                return originalAbort.apply(this, arguments);\n            };\n        };\n        AjaxMonitor.prototype.attachToOnReadyStateChange = function (xhr) {\n            var _this = this;\n            var ajaxMonitorInstance = this;\n            xhr.ajaxData.xhrMonitoringState.onreadystatechangeCallbackAttached = ajaxUtils_1.EventHelper.AttachEvent(xhr, \"readystatechange\", function () {\n                try {\n                    if (ajaxMonitorInstance.isMonitoredInstance(xhr)) {\n                        if (xhr.readyState === 4) {\n                            ajaxMonitorInstance.onAjaxComplete(xhr);\n                        }\n                    }\n                }\n                catch (e) {\n                    var exceptionText = applicationinsights_common_1.Util.dump(e);\n                    // ignore messages with c00c023f, as this a known IE9 XHR abort issue\n                    if (!exceptionText || exceptionText.toLowerCase().indexOf(\"c00c023f\") == -1) {\n                        _this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxRSC, \"Failed to monitor XMLHttpRequest 'readystatechange' event handler, monitoring data for this ajax call may be incorrect.\", {\n                            ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                            exception: applicationinsights_common_1.Util.dump(e)\n                        });\n                    }\n                }\n            });\n        };\n        AjaxMonitor.prototype.onAjaxComplete = function (xhr) {\n            xhr.ajaxData.responseFinishedTime = applicationinsights_common_1.DateTimeUtils.Now();\n            xhr.ajaxData.status = xhr.status;\n            xhr.ajaxData.CalculateMetrics();\n            if (xhr.ajaxData.ajaxTotalDuration < 0) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxDur, \"Failed to calculate the duration of the ajax call, monitoring data for this ajax call won't be sent.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    requestSentTime: xhr.ajaxData.requestSentTime,\n                    responseFinishedTime: xhr.ajaxData.responseFinishedTime\n                });\n            }\n            else {\n                var dependency = {\n                    id: xhr.ajaxData.id,\n                    absoluteUrl: xhr.ajaxData.getAbsoluteUrl(),\n                    commandName: xhr.ajaxData.getPathName(),\n                    duration: xhr.ajaxData.ajaxTotalDuration,\n                    success: (+(xhr.ajaxData.status)) >= 200 && (+(xhr.ajaxData.status)) < 400,\n                    resultCode: +xhr.ajaxData.status,\n                    method: xhr.ajaxData.method\n                };\n                // enrich dependency target with correlation context from the server\n                var correlationContext = this.getCorrelationContext(xhr);\n                if (correlationContext) {\n                    dependency.correlationContext = /* dependency.target + \" | \" + */ correlationContext;\n                }\n                this.trackDependencyData(dependency);\n                xhr.ajaxData = null;\n            }\n        };\n        AjaxMonitor.prototype.getCorrelationContext = function (xhr) {\n            try {\n                var responseHeadersString = xhr.getAllResponseHeaders();\n                if (responseHeadersString !== null) {\n                    var index = responseHeadersString.toLowerCase().indexOf(applicationinsights_common_1.RequestHeaders.requestContextHeaderLowerCase);\n                    if (index !== -1) {\n                        var responseHeader = xhr.getResponseHeader(applicationinsights_common_1.RequestHeaders.requestContextHeader);\n                        return applicationinsights_common_1.CorrelationIdHelper.getCorrelationContext(responseHeader);\n                    }\n                }\n            }\n            catch (e) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedMonitorAjaxGetCorrelationHeader, \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\", {\n                    ajaxDiagnosticsMessage: AjaxMonitor.getFailedAjaxDiagnosticsMessage(xhr),\n                    exception: applicationinsights_common_1.Util.dump(e)\n                });\n            }\n        };\n        /**\n            * Logs dependency call\n            * @param dependencyData dependency data object\n            */\n        AjaxMonitor.prototype.trackDependencyData = function (dependency, properties, systemProperties) {\n            if (this._config.maxAjaxCallsPerView === -1 || this._trackAjaxAttempts < this._config.maxAjaxCallsPerView) {\n                var item = applicationinsights_common_1.TelemetryItemCreator.create(dependency, applicationinsights_common_1.RemoteDependencyData.dataType, applicationinsights_common_1.RemoteDependencyData.envelopeType, this._core._logger, properties, systemProperties);\n                this._core.track(item);\n            }\n            else if (this._trackAjaxAttempts === this._config.maxAjaxCallsPerView) {\n                this._core.logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MaxAjaxPerPVExceeded, \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\", true);\n            }\n            ++this._trackAjaxAttempts;\n        };\n        AjaxMonitor.prototype.processTelemetry = function (item) {\n            if (this._nextPlugin && this._nextPlugin.processTelemetry) {\n                this._nextPlugin.processTelemetry(item);\n            }\n        };\n        AjaxMonitor.prototype.setNextPlugin = function (next) {\n            if (next) {\n                this._nextPlugin = next;\n            }\n        };\n        AjaxMonitor.prototype.initialize = function (config, core, extensions) {\n            if (!this.initialized) {\n                this._core = core;\n                config.extensionConfig = config.extensionConfig ? config.extensionConfig : {};\n                var c = config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : {};\n                this._config = {\n                    maxAjaxCallsPerView: !isNaN(c.maxAjaxCallsPerView) ? c.maxAjaxCallsPerView : 500,\n                    disableAjaxTracking: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableAjaxTracking),\n                    disableCorrelationHeaders: applicationinsights_common_1.Util.stringToBoolOrDefault(c.disableCorrelationHeaders),\n                    correlationHeaderExcludedDomains: c.correlationHeaderExcludedDomains || [\n                        \"*.blob.core.windows.net\",\n                        \"*.blob.core.chinacloudapi.cn\",\n                        \"*.blob.core.cloudapi.de\",\n                        \"*.blob.core.usgovcloudapi.net\"\n                    ],\n                    appId: c.appId,\n                    enableCorsCorrelation: applicationinsights_common_1.Util.stringToBoolOrDefault(c.enableCorsCorrelation)\n                };\n                if (this.supportsMonitoring() && !this._config.disableAjaxTracking) {\n                    this.instrumentOpen();\n                    this.instrumentSend();\n                    this.instrumentAbort();\n                    this.initialized = true;\n                }\n            }\n        };\n        return AjaxMonitor;\n    }());\n    exports.AjaxMonitor = AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajax.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxRecord.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var XHRMonitoringState = /** @class */ (function () {\n        function XHRMonitoringState() {\n            this.openDone = false;\n            this.setRequestHeaderDone = false;\n            this.sendDone = false;\n            this.abortDone = false;\n            //<summary>True, if onreadyStateChangeCallback function attached to xhr, otherwise false</summary>\n            this.onreadystatechangeCallbackAttached = false;\n        }\n        return XHRMonitoringState;\n    }());\n    exports.XHRMonitoringState = XHRMonitoringState;\n    var ajaxRecord = /** @class */ (function () {\n        function ajaxRecord(id, logger) {\n            this.completed = false;\n            this.requestHeadersSize = null;\n            this.ttfb = null;\n            this.responseReceivingDuration = null;\n            this.callbackDuration = null;\n            this.ajaxTotalDuration = null;\n            this.aborted = null;\n            this.pageUrl = null;\n            this.requestUrl = null;\n            this.requestSize = 0;\n            this.method = null;\n            ///<summary>Returns the HTTP status code.</summary>\n            this.status = null;\n            //<summary>The timestamp when open method was invoked</summary>\n            this.requestSentTime = null;\n            //<summary>The timestamps when first byte was received</summary>\n            this.responseStartedTime = null;\n            //<summary>The timestamp when last byte was received</summary>\n            this.responseFinishedTime = null;\n            //<summary>The timestamp when onreadystatechange callback in readyState 4 finished</summary>\n            this.callbackFinishedTime = null;\n            //<summary>The timestamp at which ajax was ended</summary>\n            this.endTime = null;\n            //<summary>The original xhr onreadystatechange event</summary>\n            this.originalOnreadystatechage = null;\n            this.xhrMonitoringState = new XHRMonitoringState();\n            //<summary>Determines whether or not JavaScript exception occured in xhr.onreadystatechange code. 1 if occured, otherwise 0.</summary>\n            this.clientFailure = 0;\n            this.CalculateMetrics = function () {\n                var self = this;\n                // round to 3 decimal points\n                self.ajaxTotalDuration = Math.round(applicationinsights_common_1.DateTimeUtils.GetDuration(self.requestSentTime, self.responseFinishedTime) * 1000) / 1000;\n            };\n            this.id = id;\n            this._logger = logger;\n        }\n        ajaxRecord.prototype.getAbsoluteUrl = function () {\n            return this.requestUrl ? applicationinsights_common_1.UrlHelper.getAbsoluteUrl(this.requestUrl) : null;\n        };\n        ajaxRecord.prototype.getPathName = function () {\n            return this.requestUrl ? applicationinsights_common_1.DataSanitizer.sanitizeUrl(this._logger, applicationinsights_common_1.UrlHelper.getCompleteUrl(this.method, this.requestUrl)) : null;\n        };\n        return ajaxRecord;\n    }());\n    exports.ajaxRecord = ajaxRecord;\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxRecord.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/ajaxUtils.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var stringUtils = /** @class */ (function () {\n        function stringUtils() {\n        }\n        stringUtils.GetLength = function (strObject) {\n            var res = 0;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(strObject)) {\n                var stringified = \"\";\n                try {\n                    stringified = strObject.toString();\n                }\n                catch (ex) {\n                    // some troubles with complex object\n                }\n                res = stringified.length;\n                res = isNaN(res) ? 0 : res;\n            }\n            return res;\n        };\n        return stringUtils;\n    }());\n    exports.stringUtils = stringUtils;\n    var EventHelper = /** @class */ (function () {\n        function EventHelper() {\n        }\n        ///<summary>Binds the specified function to an event, so that the function gets called whenever the event fires on the object</summary>\n        ///<param name=\"obj\">Object to which </param>\n        ///<param name=\"eventNameWithoutOn\">String that specifies any of the standard DHTML Events without \"on\" prefix</param>\n        ///<param name=\"handlerRef\">Pointer that specifies the function to call when event fires</param>\n        ///<returns>True if the function was bound successfully to the event, otherwise false</returns>\n        EventHelper.AttachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            var result = false;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.attachEvent)) {\n                    // IE before version 9                    \n                    obj.attachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                    result = true;\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.addEventListener)) {\n                        // all browsers except IE before version 9\n                        obj.addEventListener(eventNameWithoutOn, handlerRef, false);\n                        result = true;\n                    }\n                }\n            }\n            return result;\n        };\n        EventHelper.DetachEvent = function (obj, eventNameWithoutOn, handlerRef) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj)) {\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.detachEvent)) {\n                    obj.detachEvent(\"on\" + eventNameWithoutOn, handlerRef);\n                }\n                else {\n                    if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(obj.removeEventListener)) {\n                        obj.removeEventListener(eventNameWithoutOn, handlerRef, false);\n                    }\n                }\n            }\n        };\n        return EventHelper;\n    }());\n    exports.EventHelper = EventHelper;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ajaxUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-dependencies-js/bundle/applicationinsights-dependencies-js.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./ajax */ \"./node_modules/applicationinsights-dependencies-js/bundle/ajax.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, ajax_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.AjaxPlugin = ajax_1.AjaxMonitor;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-dependencies-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Application.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Application = /** @class */ (function () {\n        function Application() {\n        }\n        return Application;\n    }());\n    exports.Application = Application;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Application.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Device.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Device = /** @class */ (function () {\n        /**\n         * Constructs a new instance of the Device class\n         */\n        function Device() {\n            // don't attempt to fingerprint browsers\n            this.id = \"browser\";\n            // Device type is a dimension in our data platform\n            // Setting it to 'Browser' allows to separate client and server dependencies/exceptions\n            this.type = \"Browser\";\n        }\n        return Device;\n    }());\n    exports.Device = Device;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Device.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Version = \"2.0.1-beta\";\n    var Internal = /** @class */ (function () {\n        /**\n        * Constructs a new instance of the internal telemetry data class.\n        */\n        function Internal(config) {\n            this.sdkVersion = (config.sdkExtension && config.sdkExtension() ? config.sdkExtension() + \"_\" : \"\") + \"javascript:\" + Version;\n        }\n        return Internal;\n    }());\n    exports.Internal = Internal;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Internal.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Location.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Location = /** @class */ (function () {\n        function Location() {\n        }\n        return Location;\n    }());\n    exports.Location = Location;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Location.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Operation = /** @class */ (function () {\n        function Operation() {\n            this.id = applicationinsights_common_1.Util.newId();\n            if (window && window.location && window.location.pathname) {\n                this.name = window.location.pathname;\n            }\n        }\n        return Operation;\n    }());\n    exports.Operation = Operation;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Operation.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../SamplingScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SamplingScoreGenerator_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sample = /** @class */ (function () {\n        function Sample(sampleRate, logger) {\n            // We're using 32 bit math, hence max value is (2^31 - 1)\n            this.INT_MAX_VALUE = 2147483647;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (sampleRate > 100 || sampleRate < 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SampleRateOutOfRange, \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\", { samplingRate: sampleRate }, true);\n                this.sampleRate = 100;\n            }\n            this.sampleRate = sampleRate;\n            this.samplingScoreGenerator = new SamplingScoreGenerator_1.SamplingScoreGenerator();\n        }\n        /**\n        * Determines if an envelope is sampled in (i.e. will be sent) or not (i.e. will be dropped).\n        */\n        Sample.prototype.isSampledIn = function (envelope) {\n            // return true as sampling will move to different extension\n            return true;\n        };\n        return Sample;\n    }());\n    exports.Sample = Sample;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sample.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/Session.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Session = /** @class */ (function () {\n        function Session() {\n        }\n        return Session;\n    }());\n    exports.Session = Session;\n    var _SessionManager = /** @class */ (function () {\n        function _SessionManager(config, logger) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(logger)) {\n                this._logger = new applicationinsights_core_js_1.DiagnosticLogger();\n            }\n            else {\n                this._logger = logger;\n            }\n            if (!config) {\n                config = {};\n            }\n            if (!(typeof config.sessionExpirationMs === \"function\")) {\n                config.sessionExpirationMs = function () { return _SessionManager.acquisitionSpan; };\n            }\n            if (!(typeof config.sessionRenewalMs === \"function\")) {\n                config.sessionRenewalMs = function () { return _SessionManager.renewalSpan; };\n            }\n            this.config = config;\n            this.automaticSession = new Session();\n        }\n        _SessionManager.prototype.update = function () {\n            if (!this.automaticSession.id) {\n                this.initializeAutomaticSession();\n            }\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            var acquisitionExpired = now - this.automaticSession.acquisitionDate > this.config.sessionExpirationMs();\n            var renewalExpired = now - this.automaticSession.renewalDate > this.config.sessionRenewalMs();\n            // renew if acquisitionSpan or renewalSpan has ellapsed\n            if (acquisitionExpired || renewalExpired) {\n                // update automaticSession so session state has correct id                \n                this.automaticSession.isFirst = undefined;\n                this.renew();\n            }\n            else {\n                // do not update the cookie more often than cookieUpdateInterval\n                if (!this.cookieUpdatedTimestamp || now - this.cookieUpdatedTimestamp > _SessionManager.cookieUpdateInterval) {\n                    this.automaticSession.renewalDate = now;\n                    this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n                }\n            }\n        };\n        /**\n         *  Record the current state of the automatic session and store it in our cookie string format\n         *  into the browser's local storage. This is used to restore the session data when the cookie\n         *  expires.\n         */\n        _SessionManager.prototype.backup = function () {\n            this.setStorage(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n        };\n        /**\n         *  Use ai_session cookie data or local storage data (when the cookie is unavailable) to\n         *  initialize the automatic session.\n         */\n        _SessionManager.prototype.initializeAutomaticSession = function () {\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, 'ai_session');\n            if (cookie && typeof cookie.split === \"function\") {\n                this.initializeAutomaticSessionWithData(cookie);\n            }\n            else {\n                // There's no cookie, but we might have session data in local storage\n                // This can happen if the session expired or the user actively deleted the cookie\n                // We only want to recover data if the cookie is missing from expiry. We should respect the user's wishes if the cookie was deleted actively.\n                // The User class handles this for us and deletes our local storage object if the persistent user cookie was removed.\n                var storage = applicationinsights_common_1.Util.getStorage(this._logger, 'ai_session');\n                if (storage) {\n                    this.initializeAutomaticSessionWithData(storage);\n                }\n            }\n            if (!this.automaticSession.id) {\n                this.automaticSession.isFirst = true;\n                this.renew();\n            }\n        };\n        /**\n         *  Extract id, aquisitionDate, and renewalDate from an ai_session payload string and\n         *  use this data to initialize automaticSession.\n         *\n         *  @param {string} sessionData - The string stored in an ai_session cookie or local storage backup\n         */\n        _SessionManager.prototype.initializeAutomaticSessionWithData = function (sessionData) {\n            var params = sessionData.split(\"|\");\n            if (params.length > 0) {\n                this.automaticSession.id = params[0];\n            }\n            try {\n                if (params.length > 1) {\n                    var acq = +params[1];\n                    this.automaticSession.acquisitionDate = +new Date(acq);\n                    this.automaticSession.acquisitionDate = this.automaticSession.acquisitionDate > 0 ? this.automaticSession.acquisitionDate : 0;\n                }\n                if (params.length > 2) {\n                    var renewal = +params[2];\n                    this.automaticSession.renewalDate = +new Date(renewal);\n                    this.automaticSession.renewalDate = this.automaticSession.renewalDate > 0 ? this.automaticSession.renewalDate : 0;\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ErrorParsingAISessionCookie, \"Error parsing ai_session cookie, session will be reset: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            if (this.automaticSession.renewalDate == 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionRenewalDateIsZero, \"AI session renewal date is 0, session will be reset.\");\n            }\n        };\n        _SessionManager.prototype.renew = function () {\n            var now = applicationinsights_common_1.DateTimeUtils.Now();\n            this.automaticSession.id = applicationinsights_common_1.Util.newId();\n            this.automaticSession.acquisitionDate = now;\n            this.automaticSession.renewalDate = now;\n            this.setCookie(this.automaticSession.id, this.automaticSession.acquisitionDate, this.automaticSession.renewalDate);\n            // If this browser does not support local storage, fire an internal log to keep track of it at this point\n            if (!applicationinsights_common_1.Util.canUseLocalStorage()) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserDoesNotSupportLocalStorage, \"Browser does not support local storage. Session durations will be inaccurate.\");\n            }\n        };\n        _SessionManager.prototype.setCookie = function (guid, acq, renewal) {\n            // Set cookie to expire after the session expiry time passes or the session renewal deadline, whichever is sooner\n            // Expiring the cookie will cause the session to expire even if the user isn't on the page\n            var acquisitionExpiry = acq + this.config.sessionExpirationMs();\n            var renewalExpiry = renewal + this.config.sessionRenewalMs();\n            var cookieExpiry = new Date();\n            var cookie = [guid, acq, renewal];\n            if (acquisitionExpiry < renewalExpiry) {\n                cookieExpiry.setTime(acquisitionExpiry);\n            }\n            else {\n                cookieExpiry.setTime(renewalExpiry);\n            }\n            var cookieDomnain = this.config.cookieDomain ? this.config.cookieDomain() : null;\n            applicationinsights_common_1.Util.setCookie(this._logger, 'ai_session', cookie.join('|') + ';expires=' + cookieExpiry.toUTCString(), cookieDomnain);\n            this.cookieUpdatedTimestamp = applicationinsights_common_1.DateTimeUtils.Now();\n        };\n        _SessionManager.prototype.setStorage = function (guid, acq, renewal) {\n            // Keep data in local storage to retain the last session id, allowing us to cleanly end the session when it expires\n            // Browsers that don't support local storage won't be able to end sessions cleanly from the client\n            // The server will notice this and end the sessions itself, with loss of accurate session duration\n            applicationinsights_common_1.Util.setStorage(this._logger, 'ai_session', [guid, acq, renewal].join('|'));\n        };\n        _SessionManager.acquisitionSpan = 86400000; // 24 hours in ms\n        _SessionManager.renewalSpan = 1800000; // 30 minutes in ms\n        _SessionManager.cookieUpdateInterval = 60000; // 1 minute in ms\n        return _SessionManager;\n    }());\n    exports._SessionManager = _SessionManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Session.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/Context/User.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var User = /** @class */ (function () {\n        function User(config, logger) {\n            this._logger = logger;\n            //get userId or create new one if none exists\n            var cookie = applicationinsights_common_1.Util.getCookie(this._logger, User.userCookieName);\n            if (cookie) {\n                var params = cookie.split(User.cookieSeparator);\n                if (params.length > 0) {\n                    this.id = params[0];\n                }\n            }\n            this.config = config;\n            if (!this.id) {\n                this.id = applicationinsights_common_1.Util.newId();\n                var date = new Date();\n                var acqStr = applicationinsights_common_1.Util.toISOStringForIE8(date);\n                this.accountAcquisitionDate = acqStr;\n                // without expiration, cookies expire at the end of the session\n                // set it to 365 days from now\n                // 365 * 24 * 60 * 60 * 1000 = 31536000000 \n                date.setTime(date.getTime() + 31536000000);\n                var newCookie = [this.id, acqStr];\n                var cookieDomain = this.config.cookieDomain ? this.config.cookieDomain() : undefined;\n                applicationinsights_common_1.Util.setCookie(this._logger, User.userCookieName, newCookie.join(User.cookieSeparator) + ';expires=' + date.toUTCString(), cookieDomain);\n                // If we have an ai_session in local storage this means the user actively removed our cookies.\n                // We should respect their wishes and clear ourselves from local storage\n                applicationinsights_common_1.Util.removeStorage(this._logger, 'ai_session');\n            }\n            // We still take the account id from the ctor param for backward compatibility. \n            // But if the the customer set the accountId through the newer setAuthenticatedUserContext API, we will override it.\n            this.accountId = config.accountId ? config.accountId() : undefined;\n            // Get the auth user id and account id from the cookie if exists\n            // Cookie is in the pattern: <authenticatedId>|<accountId>\n            var authCookie = applicationinsights_common_1.Util.getCookie(this._logger, User.authUserCookieName);\n            if (authCookie) {\n                authCookie = decodeURI(authCookie);\n                var authCookieString = authCookie.split(User.cookieSeparator);\n                if (authCookieString[0]) {\n                    this.authenticatedId = authCookieString[0];\n                }\n                if (authCookieString.length > 1 && authCookieString[1]) {\n                    this.accountId = authCookieString[1];\n                }\n            }\n        }\n        /**\n        * Sets the authenticated user id and the account id in this session.\n        *\n        * @param authenticatedUserId {string} - The authenticated user id. A unique and persistent string that represents each authenticated user in the service.\n        * @param accountId {string} - An optional string to represent the account associated with the authenticated user.\n        */\n        User.prototype.setAuthenticatedUserContext = function (authenticatedUserId, accountId, storeInCookie) {\n            if (storeInCookie === void 0) { storeInCookie = false; }\n            // Validate inputs to ensure no cookie control characters.\n            var isInvalidInput = !this.validateUserInput(authenticatedUserId) || (accountId && !this.validateUserInput(accountId));\n            if (isInvalidInput) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SetAuthContextFailedAccountName, \"Setting auth user context failed. \" +\n                    \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\", true);\n                return;\n            }\n            // Create cookie string.\n            this.authenticatedId = authenticatedUserId;\n            var authCookie = this.authenticatedId;\n            if (accountId) {\n                this.accountId = accountId;\n                authCookie = [this.authenticatedId, this.accountId].join(User.cookieSeparator);\n            }\n            if (storeInCookie) {\n                // Set the cookie. No expiration date because this is a session cookie (expires when browser closed).\n                // Encoding the cookie to handle unexpected unicode characters.\n                applicationinsights_common_1.Util.setCookie(this._logger, User.authUserCookieName, encodeURI(authCookie), this.config.cookieDomain());\n            }\n        };\n        /**\n         * Clears the authenticated user id and the account id from the user context.\n         * @returns {}\n         */\n        User.prototype.clearAuthenticatedUserContext = function () {\n            this.authenticatedId = null;\n            this.accountId = null;\n            applicationinsights_common_1.Util.deleteCookie(this._logger, User.authUserCookieName);\n        };\n        User.prototype.validateUserInput = function (id) {\n            // Validate:\n            // 1. Id is a non-empty string.\n            // 2. It does not contain special characters for cookies.\n            if (typeof id !== 'string' ||\n                !id ||\n                id.match(/,|;|=| |\\|/)) {\n                return false;\n            }\n            return true;\n        };\n        User.cookieSeparator = '|';\n        User.userCookieName = 'ai_user';\n        User.authUserCookieName = 'ai_authUser';\n        return User;\n    }());\n    exports.User = User;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=User.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var HashCodeScoreGenerator = /** @class */ (function () {\n        function HashCodeScoreGenerator() {\n        }\n        HashCodeScoreGenerator.prototype.getHashCodeScore = function (key) {\n            var score = this.getHashCode(key) / HashCodeScoreGenerator.INT_MAX_VALUE;\n            return score * 100;\n        };\n        HashCodeScoreGenerator.prototype.getHashCode = function (input) {\n            if (input == \"\") {\n                return 0;\n            }\n            while (input.length < HashCodeScoreGenerator.MIN_INPUT_LENGTH) {\n                input = input.concat(input);\n            }\n            // 5381 is a magic number: http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function\n            var hash = 5381;\n            for (var i = 0; i < input.length; ++i) {\n                hash = ((hash << 5) + hash) + input.charCodeAt(i);\n                // 'hash' is of number type which means 53 bit integer (http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-number-type)\n                // 'hash & hash' will keep it 32 bit integer - just to make it clearer what the result is.\n                hash = hash & hash;\n            }\n            return Math.abs(hash);\n        };\n        // We're using 32 bit math, hence max value is (2^31 - 1)\n        HashCodeScoreGenerator.INT_MAX_VALUE = 2147483647;\n        // (Magic number) DJB algorithm can't work on shorter strings (results in poor distribution\n        HashCodeScoreGenerator.MIN_INPUT_LENGTH = 8;\n        return HashCodeScoreGenerator;\n    }());\n    exports.HashCodeScoreGenerator = HashCodeScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=HashCodeScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\":\n/*!***********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js ***!\n  \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * PropertiesPlugin.ts\n * @copyright Microsoft 2018\n */\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! ./Context/Session */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Session.js\"), __webpack_require__(/*! ./Context/Application */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Application.js\"), __webpack_require__(/*! ./Context/Device */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Device.js\"), __webpack_require__(/*! ./Context/Internal */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Internal.js\"), __webpack_require__(/*! ./Context/Location */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Location.js\"), __webpack_require__(/*! ./Context/Operation */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Operation.js\"), __webpack_require__(/*! ./Context/User */ \"./node_modules/applicationinsights-properties-js/bundle/Context/User.js\"), __webpack_require__(/*! ./Context/Sample */ \"./node_modules/applicationinsights-properties-js/bundle/Context/Sample.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, applicationinsights_common_1, Session_1, Application_1, Device_1, Internal_1, Location_1, Operation_1, User_1, Sample_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PropertiesPlugin = /** @class */ (function () {\n        function PropertiesPlugin() {\n            this.priority = 170;\n            this.identifier = \"AppInsightsPropertiesPlugin\";\n        }\n        PropertiesPlugin.prototype.initialize = function (config, core, extensions) {\n            var extensionConfig = config.extensionConfig &&\n                config.extensionConfig[this.identifier] ?\n                config.extensionConfig[this.identifier] : {};\n            this._extensionConfig = {\n                instrumentationKey: function () { return extensionConfig.instrumentationKey; },\n                accountId: function () { return extensionConfig.accountId; },\n                sessionRenewalMs: function () { return extensionConfig.sessionRenewalMs; },\n                sampleRate: function () { return extensionConfig.sampleRate; },\n                sessionExpirationMs: function () { return extensionConfig.sessionExpirationMs; },\n                cookieDomain: function () { return extensionConfig.cookieDomain; },\n                sdkExtension: function () { return extensionConfig.sdkExtension; },\n                isBrowserLinkTrackingEnabled: function () { return extensionConfig.isBrowserLinkTrackingEnabled; },\n                appId: function () { return extensionConfig.appId; }\n            };\n            if (typeof window !== 'undefined') {\n                this._sessionManager = new Session_1._SessionManager(this._extensionConfig, core.logger);\n                this.application = new Application_1.Application();\n                this.device = new Device_1.Device();\n                this.internal = new Internal_1.Internal(this._extensionConfig);\n                this.location = new Location_1.Location();\n                this.user = new User_1.User(this._extensionConfig, core.logger);\n                this.operation = new Operation_1.Operation();\n                this.session = new Session_1.Session();\n                this.sample = new Sample_1.Sample(this._extensionConfig.sampleRate(), core.logger);\n            }\n        };\n        /**\n         * Add Part A fields to the event\n         * @param event The event that needs to be processed\n         */\n        PropertiesPlugin.prototype.processTelemetry = function (event) {\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(event)) {\n                // TODO(barustum): throw an internal event once we have support for internal logging\n            }\n            else {\n                // if the event is not sampled in, do not bother going through the pipeline\n                if (this.sample.isSampledIn(event)) {\n                    // If the envelope is PageView, reset the internal message count so that we can send internal telemetry for the new page.\n                    if (event.name === applicationinsights_common_1.PageView.envelopeType) {\n                        // TODO(barustum): resetInternalMessageCount once we have support for internal logging\n                        //_InternalLogging.resetInternalMessageCount();\n                    }\n                    if (this.session) {\n                        // If customer did not provide custom session id update the session manager\n                        if (typeof this.session.id !== \"string\") {\n                            this._sessionManager.update();\n                        }\n                    }\n                    this._processTelemetryInternal(event);\n                }\n                if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                    this._nextPlugin.processTelemetry(event);\n                }\n            }\n        };\n        /**\n         * Sets the next plugin that comes after this plugin\n         * @param nextPlugin The next plugin\n         */\n        PropertiesPlugin.prototype.setNextPlugin = function (nextPlugin) {\n            this._nextPlugin = nextPlugin;\n        };\n        PropertiesPlugin.prototype._processTelemetryInternal = function (event) {\n            var tagsItem = {};\n            if (this.session) {\n                // If customer set id, apply his context; otherwise apply context generated from cookies \n                if (typeof this.session.id === \"string\") {\n                    PropertiesPlugin._applySessionContext(tagsItem, this.session);\n                }\n                else {\n                    PropertiesPlugin._applySessionContext(tagsItem, this._sessionManager.automaticSession);\n                }\n            }\n            // set part A  fields\n            PropertiesPlugin._applyApplicationContext(tagsItem, this.application);\n            PropertiesPlugin._applyDeviceContext(tagsItem, this.device);\n            PropertiesPlugin._applyInternalContext(tagsItem, this.internal);\n            PropertiesPlugin._applyLocationContext(tagsItem, this.location);\n            PropertiesPlugin._applySampleContext(tagsItem, this.sample);\n            PropertiesPlugin._applyUserContext(tagsItem, this.user);\n            PropertiesPlugin._applyOperationContext(tagsItem, this.operation);\n            event.tags.push(tagsItem);\n        };\n        PropertiesPlugin._applySessionContext = function (tags, sessionContext) {\n            if (sessionContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof sessionContext.id === \"string\") {\n                    tags[tagKeys.sessionId] = sessionContext.id;\n                }\n                if (typeof sessionContext.isFirst !== \"undefined\") {\n                    tags[tagKeys.sessionIsFirst] = sessionContext.isFirst;\n                }\n            }\n        };\n        PropertiesPlugin._applyApplicationContext = function (tagsItem, appContext) {\n            if (appContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof appContext.ver === \"string\") {\n                    tagsItem[tagKeys.applicationVersion] = appContext.ver;\n                }\n                if (typeof appContext.build === \"string\") {\n                    tagsItem[tagKeys.applicationBuild] = appContext.build;\n                }\n            }\n        };\n        PropertiesPlugin._applyDeviceContext = function (tagsItem, deviceContext) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            if (deviceContext) {\n                if (typeof deviceContext.id === \"string\") {\n                    tagsItem[tagKeys.deviceId] = deviceContext.id;\n                }\n                if (typeof deviceContext.ip === \"string\") {\n                    tagsItem[tagKeys.deviceIp] = deviceContext.ip;\n                }\n                if (typeof deviceContext.language === \"string\") {\n                    tagsItem[tagKeys.deviceLanguage] = deviceContext.language;\n                }\n                if (typeof deviceContext.locale === \"string\") {\n                    tagsItem[tagKeys.deviceLocale] = deviceContext.locale;\n                }\n                if (typeof deviceContext.model === \"string\") {\n                    tagsItem[tagKeys.deviceModel] = deviceContext.model;\n                }\n                if (typeof deviceContext.network !== \"undefined\") {\n                    tagsItem[tagKeys.deviceNetwork] = deviceContext.network;\n                }\n                if (typeof deviceContext.oemName === \"string\") {\n                    tagsItem[tagKeys.deviceOEMName] = deviceContext.oemName;\n                }\n                if (typeof deviceContext.os === \"string\") {\n                    tagsItem[tagKeys.deviceOS] = deviceContext.os;\n                }\n                if (typeof deviceContext.osversion === \"string\") {\n                    tagsItem[tagKeys.deviceOSVersion] = deviceContext.osversion;\n                }\n                if (typeof deviceContext.resolution === \"string\") {\n                    tagsItem[tagKeys.deviceScreenResolution] = deviceContext.resolution;\n                }\n                if (typeof deviceContext.type === \"string\") {\n                    tagsItem[tagKeys.deviceType] = deviceContext.type;\n                }\n            }\n        };\n        PropertiesPlugin._applyInternalContext = function (tagsItem, internalContext) {\n            if (internalContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof internalContext.agentVersion === \"string\") {\n                    tagsItem[tagKeys.internalAgentVersion] = internalContext.agentVersion;\n                }\n                if (typeof internalContext.sdkVersion === \"string\") {\n                    tagsItem[tagKeys.internalSdkVersion] = internalContext.sdkVersion;\n                }\n            }\n        };\n        PropertiesPlugin._applyLocationContext = function (tagsItem, locationContext) {\n            if (locationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof locationContext.ip === \"string\") {\n                    tagsItem[tagKeys.locationIp] = locationContext.ip;\n                }\n            }\n        };\n        PropertiesPlugin._applySampleContext = function (tagsItem, sampleContext) {\n            if (sampleContext) {\n                tagsItem.sampleRate = sampleContext.sampleRate;\n            }\n        };\n        PropertiesPlugin._applyOperationContext = function (tagsItem, operationContext) {\n            if (operationContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof operationContext.id === \"string\") {\n                    tagsItem[tagKeys.operationId] = operationContext.id;\n                }\n                if (typeof operationContext.name === \"string\") {\n                    tagsItem[tagKeys.operationName] = operationContext.name;\n                }\n                if (typeof operationContext.parentId === \"string\") {\n                    tagsItem[tagKeys.operationParentId] = operationContext.parentId;\n                }\n                if (typeof operationContext.rootId === \"string\") {\n                    tagsItem[tagKeys.operationRootId] = operationContext.rootId;\n                }\n                if (typeof operationContext.syntheticSource === \"string\") {\n                    tagsItem[tagKeys.operationSyntheticSource] = operationContext.syntheticSource;\n                }\n            }\n        };\n        PropertiesPlugin._applyUserContext = function (tagsItem, userContext) {\n            if (userContext) {\n                var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n                if (typeof userContext.accountId === \"string\") {\n                    tagsItem[tagKeys.userAccountId] = userContext.accountId;\n                }\n                if (typeof userContext.agent === \"string\") {\n                    tagsItem[tagKeys.userAgent] = userContext.agent;\n                }\n                if (typeof userContext.id === \"string\") {\n                    tagsItem[tagKeys.userId] = userContext.id;\n                }\n                if (typeof userContext.authenticatedId === \"string\") {\n                    tagsItem[tagKeys.userAuthUserId] = userContext.authenticatedId;\n                }\n                if (typeof userContext.storeRegion === \"string\") {\n                    tagsItem[tagKeys.userStoreRegion] = userContext.storeRegion;\n                }\n            }\n        };\n        return PropertiesPlugin;\n    }());\n    exports.default = PropertiesPlugin;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PropertiesPlugin.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/SamplingScoreGenerator.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./HashCodeScoreGenerator */ \"./node_modules/applicationinsights-properties-js/bundle/HashCodeScoreGenerator.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, HashCodeScoreGenerator_1, applicationinsights_common_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var SamplingScoreGenerator = /** @class */ (function () {\n        function SamplingScoreGenerator() {\n            this.hashCodeGeneragor = new HashCodeScoreGenerator_1.HashCodeScoreGenerator();\n        }\n        SamplingScoreGenerator.prototype.getSamplingScore = function (envelope) {\n            var tagKeys = new applicationinsights_common_1.ContextTagKeys();\n            var score = 0;\n            if (envelope.tags[tagKeys.userId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.userId]);\n            }\n            else if (envelope.tags[tagKeys.operationId]) {\n                score = this.hashCodeGeneragor.getHashCodeScore(envelope.tags[tagKeys.operationId]);\n            }\n            else {\n                // tslint:disable-next-line:insecure-random\n                score = Math.random();\n            }\n            return score;\n        };\n        return SamplingScoreGenerator;\n    }());\n    exports.SamplingScoreGenerator = SamplingScoreGenerator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SamplingScoreGenerator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-properties-js/bundle/applicationinsights-properties-js.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PropertiesPlugin */ \"./node_modules/applicationinsights-properties-js/bundle/PropertiesPlugin.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PropertiesPlugin_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.PropertiesPlugin = PropertiesPlugin_1.default;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-properties-js.js.map\n\n/***/ }),\n\n/***/ 0:\n/*!**********************************!*\\\n  !*** multi ./amd/bundle/Init.js ***!\n  \\**********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./amd/bundle/Init.js */\"./amd/bundle/Init.js\");\n\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=aisdk.0.0.19.js.map"
  },
  {
    "path": "AISKU/dist-history/aisdk.0.0.8.js",
    "content": "!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var n=t();for(var i in n)(\"object\"==typeof exports?exports:e)[i]=n[i]}}(window,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=19)}([function(e,t,n){var i,r;i=[n,t,n(2),n(1),n(6),n(8),n(25),n(9),n(10),n(26),n(28),n(21),n(29),n(34),n(7),n(35),n(37),n(39),n(41),n(42),n(43),n(3)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p,d,f,g,h,v,y,_,m,I,S){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Util=n.Util,t.CorrelationIdHelper=n.CorrelationIdHelper,t.UrlHelper=n.UrlHelper,t._InternalMessageId=i._InternalMessageId,t.LoggingSeverity=i.LoggingSeverity,t.FieldType=i.FieldType,t._InternalLogging=r._InternalLogging,t._InternalLogMessage=r._InternalLogMessage,t.RequestHeaders=o.RequestHeaders,t.DisabledPropertyName=a.DisabledPropertyName,t.AIData=s.Data,t.AIBase=l.Base,t.Envelope=c.Envelope,t.Event=u.Event,t.Exception=p.Exception,t.Metric=d.Metric,t.PageView=f.PageView,t.PageViewData=g.PageViewData,t.RemoteDependencyData=h.RemoteDependencyData,t.Trace=v.Trace,t.PageViewPerformance=y.PageViewPerformance,t.Data=_.Data,t.SeverityLevel=m.SeverityLevel,t.ContextTagKeys=I.ContextTagKeys,t.DataSanitizer=S.DataSanitizer}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.CRITICAL=0]=\"CRITICAL\",e[e.WARNING=1]=\"WARNING\"}(t.LoggingSeverity||(t.LoggingSeverity={})),function(e){e[e.BrowserDoesNotSupportLocalStorage=0]=\"BrowserDoesNotSupportLocalStorage\",e[e.BrowserCannotReadLocalStorage=1]=\"BrowserCannotReadLocalStorage\",e[e.BrowserCannotReadSessionStorage=2]=\"BrowserCannotReadSessionStorage\",e[e.BrowserCannotWriteLocalStorage=3]=\"BrowserCannotWriteLocalStorage\",e[e.BrowserCannotWriteSessionStorage=4]=\"BrowserCannotWriteSessionStorage\",e[e.BrowserFailedRemovalFromLocalStorage=5]=\"BrowserFailedRemovalFromLocalStorage\",e[e.BrowserFailedRemovalFromSessionStorage=6]=\"BrowserFailedRemovalFromSessionStorage\",e[e.CannotSendEmptyTelemetry=7]=\"CannotSendEmptyTelemetry\",e[e.ClientPerformanceMathError=8]=\"ClientPerformanceMathError\",e[e.ErrorParsingAISessionCookie=9]=\"ErrorParsingAISessionCookie\",e[e.ErrorPVCalc=10]=\"ErrorPVCalc\",e[e.ExceptionWhileLoggingError=11]=\"ExceptionWhileLoggingError\",e[e.FailedAddingTelemetryToBuffer=12]=\"FailedAddingTelemetryToBuffer\",e[e.FailedMonitorAjaxAbort=13]=\"FailedMonitorAjaxAbort\",e[e.FailedMonitorAjaxDur=14]=\"FailedMonitorAjaxDur\",e[e.FailedMonitorAjaxOpen=15]=\"FailedMonitorAjaxOpen\",e[e.FailedMonitorAjaxRSC=16]=\"FailedMonitorAjaxRSC\",e[e.FailedMonitorAjaxSend=17]=\"FailedMonitorAjaxSend\",e[e.FailedMonitorAjaxGetCorrelationHeader=18]=\"FailedMonitorAjaxGetCorrelationHeader\",e[e.FailedToAddHandlerForOnBeforeUnload=19]=\"FailedToAddHandlerForOnBeforeUnload\",e[e.FailedToSendQueuedTelemetry=20]=\"FailedToSendQueuedTelemetry\",e[e.FailedToReportDataLoss=21]=\"FailedToReportDataLoss\",e[e.FlushFailed=22]=\"FlushFailed\",e[e.MessageLimitPerPVExceeded=23]=\"MessageLimitPerPVExceeded\",e[e.MissingRequiredFieldSpecification=24]=\"MissingRequiredFieldSpecification\",e[e.NavigationTimingNotSupported=25]=\"NavigationTimingNotSupported\",e[e.OnError=26]=\"OnError\",e[e.SessionRenewalDateIsZero=27]=\"SessionRenewalDateIsZero\",e[e.SenderNotInitialized=28]=\"SenderNotInitialized\",e[e.StartTrackEventFailed=29]=\"StartTrackEventFailed\",e[e.StopTrackEventFailed=30]=\"StopTrackEventFailed\",e[e.StartTrackFailed=31]=\"StartTrackFailed\",e[e.StopTrackFailed=32]=\"StopTrackFailed\",e[e.TelemetrySampledAndNotSent=33]=\"TelemetrySampledAndNotSent\",e[e.TrackEventFailed=34]=\"TrackEventFailed\",e[e.TrackExceptionFailed=35]=\"TrackExceptionFailed\",e[e.TrackMetricFailed=36]=\"TrackMetricFailed\",e[e.TrackPVFailed=37]=\"TrackPVFailed\",e[e.TrackPVFailedCalc=38]=\"TrackPVFailedCalc\",e[e.TrackTraceFailed=39]=\"TrackTraceFailed\",e[e.TransmissionFailed=40]=\"TransmissionFailed\",e[e.FailedToSetStorageBuffer=41]=\"FailedToSetStorageBuffer\",e[e.FailedToRestoreStorageBuffer=42]=\"FailedToRestoreStorageBuffer\",e[e.InvalidBackendResponse=43]=\"InvalidBackendResponse\",e[e.FailedToFixDepricatedValues=44]=\"FailedToFixDepricatedValues\",e[e.InvalidDurationValue=45]=\"InvalidDurationValue\",e[e.TelemetryEnvelopeInvalid=46]=\"TelemetryEnvelopeInvalid\",e[e.CreateEnvelopeError=47]=\"CreateEnvelopeError\",e[e.CannotSerializeObject=48]=\"CannotSerializeObject\",e[e.CannotSerializeObjectNonSerializable=49]=\"CannotSerializeObjectNonSerializable\",e[e.CircularReferenceDetected=50]=\"CircularReferenceDetected\",e[e.ClearAuthContextFailed=51]=\"ClearAuthContextFailed\",e[e.ExceptionTruncated=52]=\"ExceptionTruncated\",e[e.IllegalCharsInName=53]=\"IllegalCharsInName\",e[e.ItemNotInArray=54]=\"ItemNotInArray\",e[e.MaxAjaxPerPVExceeded=55]=\"MaxAjaxPerPVExceeded\",e[e.MessageTruncated=56]=\"MessageTruncated\",e[e.NameTooLong=57]=\"NameTooLong\",e[e.SampleRateOutOfRange=58]=\"SampleRateOutOfRange\",e[e.SetAuthContextFailed=59]=\"SetAuthContextFailed\",e[e.SetAuthContextFailedAccountName=60]=\"SetAuthContextFailedAccountName\",e[e.StringValueTooLong=61]=\"StringValueTooLong\",e[e.StartCalledMoreThanOnce=62]=\"StartCalledMoreThanOnce\",e[e.StopCalledWithoutStart=63]=\"StopCalledWithoutStart\",e[e.TelemetryInitializerFailed=64]=\"TelemetryInitializerFailed\",e[e.TrackArgumentsNotSpecified=65]=\"TrackArgumentsNotSpecified\",e[e.UrlTooLong=66]=\"UrlTooLong\",e[e.SessionStorageBufferFull=67]=\"SessionStorageBufferFull\",e[e.CannotAccessCookie=68]=\"CannotAccessCookie\",e[e.IdTooLong=69]=\"IdTooLong\"}(t._InternalMessageId||(t._InternalMessageId={})),function(e){e[e.LocalStorage=0]=\"LocalStorage\",e[e.SessionStorage=1]=\"SessionStorage\"}(t.StorageType||(t.StorageType={})),function(e){e[e.Default=0]=\"Default\",e[e.Required=1]=\"Required\",e[e.Array=2]=\"Array\",e[e.Hidden=4]=\"Hidden\"}(t.FieldType||(t.FieldType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(1),n(6),n(8),n(3)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(){}return e.disableStorage=function(){e._canUseLocalStorage=!1,e._canUseSessionStorage=!1},e._getLocalStorageObject=function(){return e.canUseLocalStorage()?e._getVerifiedStorageObject(n.StorageType.LocalStorage):null},e._getVerifiedStorageObject=function(e){var t,i,r=null;try{i=new Date,(r=e===n.StorageType.LocalStorage?window.localStorage:window.sessionStorage).setItem(i,i),t=r.getItem(i)!=i,r.removeItem(i),t&&(r=null)}catch(e){r=null}return r},e.isInternalApplicationInsightsEndpoint=function(t){return-1!==e._internalEndpoints.indexOf(t.toLowerCase())},e.canUseLocalStorage=function(){return void 0===e._canUseLocalStorage&&(e._canUseLocalStorage=!!e._getVerifiedStorageObject(n.StorageType.LocalStorage)),e._canUseLocalStorage},e.getStorage=function(t){var r=e._getLocalStorageObject();if(null!==r)try{return r.getItem(t)}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotReadLocalStorage,\"Browser failed read of local storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return null},e.setStorage=function(t,r){var o=e._getLocalStorageObject();if(null!==o)try{return o.setItem(t,r),!0}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotWriteLocalStorage,\"Browser failed write to local storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.removeStorage=function(t){var r=e._getLocalStorageObject();if(null!==r)try{return r.removeItem(t),!0}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserFailedRemovalFromLocalStorage,\"Browser failed removal of local storage item. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e._getSessionStorageObject=function(){return e.canUseSessionStorage()?e._getVerifiedStorageObject(n.StorageType.SessionStorage):null},e.canUseSessionStorage=function(){return void 0===e._canUseSessionStorage&&(e._canUseSessionStorage=!!e._getVerifiedStorageObject(n.StorageType.SessionStorage)),e._canUseSessionStorage},e.getSessionStorageKeys=function(){var t=[];if(e.canUseSessionStorage())for(var n in window.sessionStorage)t.push(n);return t},e.getSessionStorage=function(t){var r=e._getSessionStorageObject();if(null!==r)try{return r.getItem(t)}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotReadSessionStorage,\"Browser failed read of session storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return null},e.setSessionStorage=function(t,r){var o=e._getSessionStorageObject();if(null!==o)try{return o.setItem(t,r),!0}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotWriteSessionStorage,\"Browser failed write to session storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.removeSessionStorage=function(t){var r=e._getSessionStorageObject();if(null!==r)try{return r.removeItem(t),!0}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserFailedRemovalFromSessionStorage,\"Browser failed removal of session storage item. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.disableCookies=function(){e._canUseCookies=!1},e.canUseCookies=function(){if(void 0===e._canUseCookies){e._canUseCookies=!1;try{e._canUseCookies=void 0!==e.document.cookie}catch(t){i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CannotAccessCookie,\"Cannot access document.cookie - \"+e.getExceptionName(t),{exception:e.dump(t)})}}return e._canUseCookies},e.setCookie=function(t,n,i){var r=\"\",o=\"\";i&&(r=\";domain=\"+i),e.document.location&&\"https:\"===e.document.location.protocol&&(o=\";secure\"),e.canUseCookies()&&(e.document.cookie=t+\"=\"+n+r+\";path=/\"+o)},e.stringToBoolOrDefault=function(e,t){return void 0===t&&(t=!1),void 0===e||null===e?t:\"true\"===e.toString().toLowerCase()},e.getCookie=function(t){if(e.canUseCookies()){var n=\"\";if(t&&t.length)for(var i=t+\"=\",r=e.document.cookie.split(\";\"),o=0;o<r.length;o++){var a=r[o];if((a=e.trim(a))&&0===a.indexOf(i)){n=a.substring(i.length,r[o].length);break}}return n}},e.deleteCookie=function(t){e.canUseCookies()&&(e.document.cookie=t+\"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\")},e.trim=function(e){return\"string\"!=typeof e?e:e.replace(/^\\s+|\\s+$/g,\"\")},e.newId=function(){for(var e=\"\",t=1073741824*Math.random();t>0;){e+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(t%64),t=Math.floor(t/64)}return e},e.isArray=function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},e.isError=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)},e.isDate=function(e){return\"[object Date]\"===Object.prototype.toString.call(e)},e.toISOStringForIE8=function(t){if(e.isDate(t)){if(Date.prototype.toISOString)return t.toISOString();var n=function(e){var t=String(e);return 1===t.length&&(t=\"0\"+t),t};return t.getUTCFullYear()+\"-\"+n(t.getUTCMonth()+1)+\"-\"+n(t.getUTCDate())+\"T\"+n(t.getUTCHours())+\":\"+n(t.getUTCMinutes())+\":\"+n(t.getUTCSeconds())+\".\"+String((t.getUTCMilliseconds()/1e3).toFixed(3)).slice(2,5)+\"Z\"}},e.getIEVersion=function(e){void 0===e&&(e=null);var t=e?e.toLowerCase():navigator.userAgent.toLowerCase();return-1!=t.indexOf(\"msie\")?parseInt(t.split(\"msie\")[1]):null},e.msToTimeSpan=function(e){(isNaN(e)||e<0)&&(e=0);var t=\"\"+(e=Math.round(e))%1e3,n=\"\"+Math.floor(e/1e3)%60,i=\"\"+Math.floor(e/6e4)%60,r=\"\"+Math.floor(e/36e5)%24,o=Math.floor(e/864e5);return t=1===t.length?\"00\"+t:2===t.length?\"0\"+t:t,n=n.length<2?\"0\"+n:n,i=i.length<2?\"0\"+i:i,r=r.length<2?\"0\"+r:r,(o>0?o+\".\":\"\")+r+\":\"+i+\":\"+n+\".\"+t},e.isCrossOriginError=function(e,t,n,i,r){return(\"Script error.\"===e||\"Script error\"===e)&&!r},e.dump=function(e){var t=Object.prototype.toString.call(e),n=JSON.stringify(e);return\"[object Error]\"===t&&(n=\"{ stack: '\"+e.stack+\"', message: '\"+e.message+\"', name: '\"+e.name+\"'\"),t+n},e.getExceptionName=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)?e.name:\"\"},e.addEventHandler=function(e,t){if(!window||\"string\"!=typeof e||\"function\"!=typeof t)return!1;var n=\"on\"+e;if(window.addEventListener)window.addEventListener(e,t,!1);else{if(!window.attachEvent)return!1;window.attachEvent(n,t)}return!0},e.IsBeaconApiSupported=function(){return\"sendBeacon\"in navigator&&navigator.sendBeacon},e.document=\"undefined\"!=typeof document?document:{},e._canUseCookies=void 0,e._canUseLocalStorage=void 0,e._canUseSessionStorage=void 0,e._internalEndpoints=[\"https://dc.services.visualstudio.com/v2/track\",\"https://breeze.aimon.applicationinsights.io/v2/track\",\"https://dc-int.services.visualstudio.com/v2/track\"],e.NotSpecified=\"not_specified\",e}();t.Util=a;var s=function(){function e(){}return e.parseUrl=function(t){return e.htmlAnchorElement||(e.htmlAnchorElement=e.document.createElement?e.document.createElement(\"a\"):{}),e.htmlAnchorElement.href=t,e.htmlAnchorElement},e.getAbsoluteUrl=function(t){var n,i=e.parseUrl(t);return i&&(n=i.href),n},e.getPathName=function(t){var n,i=e.parseUrl(t);return i&&(n=i.pathname),n},e.getCompleteUrl=function(e,t){return e?e.toUpperCase()+\" \"+t:t},e.document=\"undefined\"!=typeof document?document:{},e}();t.UrlHelper=s;var l=function(){function e(){}return e.canIncludeCorrelationHeader=function(e,t,n){if(e&&e.disableCorrelationHeaders)return!1;if(!t)return!1;var i=s.parseUrl(t).host.toLowerCase();if(!(e&&e.enableCorsCorrelation||i===n))return!1;var r=e&&e.correlationHeaderExcludedDomains;if(!r||0==r.length)return!0;for(var o=0;o<r.length;o++){if(new RegExp(r[o].toLowerCase().replace(/\\./g,\".\").replace(/\\*/g,\".*\")).test(i))return!1}return!0},e.getCorrelationContext=function(t){if(t){var n=e.getCorrelationContextValue(t,r.RequestHeaders.requestContextTargetKey);if(n&&n!==e.correlationIdPrefix)return n}},e.getCorrelationContextValue=function(e,t){if(e)for(var n=e.split(\",\"),i=0;i<n.length;++i){var r=n[i].split(\"=\");if(2==r.length&&r[0]==t)return r[1]}},e.correlationIdPrefix=\"cid-v1:\",e}();t.CorrelationIdHelper=l;var c=function(){function e(){}return e.ParseDependencyPath=function(e,t,n){var i,r;if(e&&e.length>0){var a=s.parseUrl(e);if(i=a.host,null!=a.pathname)\"/\"!==(n=0===a.pathname.length?\"/\":a.pathname).charAt(0)&&(n=\"/\"+n),r=o.DataSanitizer.sanitizeString(t?t+\" \"+n:n);else r=o.DataSanitizer.sanitizeString(e)}else i=n,r=n;return{target:i,name:r}},e}();t.AjaxHelper=c}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(6),n(2),n(1)],void 0===(r=function(e,t,n,i,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(){}return e.sanitizeKeyAndAddUniqueness=function(t,n){var i=t.length,r=e.sanitizeKey(t);if(r.length!==i){for(var o=0,a=r;void 0!==n[a];)o++,a=r.substring(0,e.MAX_NAME_LENGTH-3)+e.padNumber(o);r=a}return r},e.sanitizeKey=function(t){return t&&(t=i.Util.trim(t.toString())).length>e.MAX_NAME_LENGTH&&(t=t.substring(0,e.MAX_NAME_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.NameTooLong,\"name is too long.  It has been truncated to \"+e.MAX_NAME_LENGTH+\" characters.\",{name:t},!0)),t},e.sanitizeString=function(t,o){return void 0===o&&(o=e.MAX_STRING_LENGTH),t&&(o=o||e.MAX_STRING_LENGTH,(t=i.Util.trim(t)).toString().length>o&&(t=t.toString().substring(0,o),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.StringValueTooLong,\"string value is too long. It has been truncated to \"+o+\" characters.\",{value:t},!0))),t},e.sanitizeUrl=function(t){return e.sanitizeInput(t,e.MAX_URL_LENGTH,r._InternalMessageId.UrlTooLong)},e.sanitizeMessage=function(t){return t&&t.length>e.MAX_MESSAGE_LENGTH&&(t=t.substring(0,e.MAX_MESSAGE_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.MessageTruncated,\"message is too long, it has been truncated to \"+e.MAX_MESSAGE_LENGTH+\" characters.\",{message:t},!0)),t},e.sanitizeException=function(t){return t&&t.length>e.MAX_EXCEPTION_LENGTH&&(t=t.substring(0,e.MAX_EXCEPTION_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.ExceptionTruncated,\"exception is too long, it has been truncated to \"+e.MAX_EXCEPTION_LENGTH+\" characters.\",{exception:t},!0)),t},e.sanitizeProperties=function(t){if(t){var n={};for(var i in t){var r=e.sanitizeString(t[i],e.MAX_PROPERTY_LENGTH);n[i=e.sanitizeKeyAndAddUniqueness(i,n)]=r}t=n}return t},e.sanitizeMeasurements=function(t){if(t){var n={};for(var i in t){var r=t[i];n[i=e.sanitizeKeyAndAddUniqueness(i,n)]=r}t=n}return t},e.sanitizeId=function(t){return t?e.sanitizeInput(t,e.MAX_ID_LENGTH,r._InternalMessageId.IdTooLong).toString():t},e.sanitizeInput=function(e,t,o){return e&&(e=i.Util.trim(e)).length>t&&(e=e.substring(0,t),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,o,\"input is too long, it has been truncated to \"+t+\" characters.\",{data:e},!0)),e},e.padNumber=function(e){var t=\"00\"+e;return t.substr(t.length-3)},e.MAX_NAME_LENGTH=150,e.MAX_ID_LENGTH=128,e.MAX_PROPERTY_LENGTH=8192,e.MAX_STRING_LENGTH=1024,e.MAX_URL_LENGTH=2048,e.MAX_MESSAGE_LENGTH=32768,e.MAX_EXCEPTION_LENGTH=32768,e}();t.DataSanitizer=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(12),n(13),n(44),n(14),n(15)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MinChannelPriorty=n.MinChannelPriorty,t.EventsDiscardedReason=i.EventsDiscardedReason,t.AppInsightsCore=r.AppInsightsCore,t.CoreUtils=o.CoreUtils,t.NotificationManager=a.NotificationManager}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Domain=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(1),n(2)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(t,i,r,o){void 0===r&&(r=!1),this.messageId=t,this.message=(r?e.AiUserActionablePrefix:e.AiNonUserActionablePrefix)+n._InternalMessageId[t].toString();var a=(i?\" message:\"+e.sanitizeDiagnosticText(i):\"\")+(o?\" props:\"+e.sanitizeDiagnosticText(JSON.stringify(o)):\"\");this.message+=a}return e.sanitizeDiagnosticText=function(e){return'\"'+e.replace(/\\\"/g,\"\")+'\"'},e.AiNonUserActionablePrefix=\"AI (Internal): \",e.AiUserActionablePrefix=\"AI: \",e}();t._InternalLogMessage=r;var o=function(){function e(){}return e.throwInternal=function(e,t,i,o,a){void 0===a&&(a=!1);var s=new r(t,i,a,o);if(this.enableDebugExceptions())throw s;if(void 0!==s&&s&&void 0!==s.message){if(a){var l=n._InternalMessageId[s.messageId];this._messageLogged[l]&&!this.verboseLogging()||(this.warnToConsole(s.message),this._messageLogged[l]=!0)}else this.verboseLogging()&&this.warnToConsole(s.message);this.logInternalMessage(e,s)}},e.warnToConsole=function(e){\"undefined\"!=typeof console&&console&&(\"function\"==typeof console.warn?console.warn(e):\"function\"==typeof console.log&&console.log(e))},e.resetInternalMessageCount=function(){this._messageCount=0,this._messageLogged={}},e.clearInternalMessageLoggedTypes=function(){if(i.Util.canUseSessionStorage())for(var t=i.Util.getSessionStorageKeys(),n=0;n<t.length;n++)0===t[n].indexOf(e.AIInternalMessagePrefix)&&i.Util.removeSessionStorage(t[n])},e.setMaxInternalMessageLimit=function(e){if(!e)throw new Error(\"limit cannot be undefined.\");this.MAX_INTERNAL_MESSAGE_LIMIT=e},e.logInternalMessage=function(t,o){if(!this._areInternalMessagesThrottled()){var a=!0,s=e.AIInternalMessagePrefix+n._InternalMessageId[o.messageId];if(i.Util.canUseSessionStorage())i.Util.getSessionStorage(s)?a=!1:i.Util.setSessionStorage(s,\"1\");else this._messageLogged[s]?a=!1:this._messageLogged[s]=!0;if(a&&((this.verboseLogging()||t===n.LoggingSeverity.CRITICAL)&&(this.queue.push(o),this._messageCount++),this._messageCount==this.MAX_INTERNAL_MESSAGE_LIMIT)){var l=\"Internal events throttle limit per PageView reached for this app.\",c=new r(n._InternalMessageId.MessageLimitPerPVExceeded,l,!1);this.queue.push(c),this.warnToConsole(l)}}},e._areInternalMessagesThrottled=function(){return this._messageCount>=this.MAX_INTERNAL_MESSAGE_LIMIT},e.AIInternalMessagePrefix=\"AITR_\",e.enableDebugExceptions=function(){return!1},e.verboseLogging=function(){return!1},e.queue=[],e.MAX_INTERNAL_MESSAGE_LIMIT=25,e._messageCount=0,e._messageLogged={},e}();t._InternalLogging=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(11)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.EventData);t.PageViewData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.requestContextHeader=\"Request-Context\",e.requestContextTargetKey=\"appId\",e.requestContextAppIdFormat=\"appId=cid-v1:\",e.requestIdHeader=\"Request-Id\",e.sdkContextHeader=\"Sdk-Context\",e.sdkContextHeaderAppIdRequest=\"appId\",e.requestContextHeaderLowerCase=\"request-context\",e}();t.RequestHeaders=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(10)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){return e.call(this)||this}return o(t,e),t}(n.Base);t.Data=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Base=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.EventData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MinChannelPriorty=100}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventsDiscardedReason={Unknown:0,NonRetryableStatus:1,InvalidEvent:2,SizeLimitExceeded:3,KillSwitch:4,QueueFull:5}}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.isNullOrUndefined=function(e){return null===e||void 0===e},e}();t.CoreUtils=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){this.listeners=[]}return e.prototype.addNotificationListener=function(e){this.listeners.push(e)},e.prototype.removeNotificationListener=function(e){for(var t=this.listeners.indexOf(e);t>-1;)this.listeners.splice(t,1),t=this.listeners.indexOf(e)},e.prototype.eventsSent=function(e){for(var t=this,n=function(n){i.listeners[n].eventsSent&&setTimeout(function(){return t.listeners[n].eventsSent(e)},0)},i=this,r=0;r<this.listeners.length;++r)n(r)},e.prototype.eventsDiscarded=function(e,t){for(var n=this,i=function(i){r.listeners[i].eventsDiscarded&&setTimeout(function(){return n.listeners[i].eventsDiscarded(e,t)},0)},r=this,o=0;o<this.listeners.length;++o)i(o)},e}();t.NotificationManager=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(45)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Sender=n.Sender}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(18)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ApplicationInsights=n.ApplicationInsights}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(56),n(4),n(57),n(69)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(){function e(){this._trackAjaxAttempts=0,this.identifier=e.defaultIdentifier,this.initialize=this._initialize.bind(this)}return e.prototype.trackPageView=function(e,t){try{this._pageViewManager.trackPageView(e,t),this.config.autoTrackPageVisitTime&&this._pageVisitTimeManager.trackPreviousPageVisit(e.name,e.uri)}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackPVFailed,\"trackPageView failed, page view will not be collected: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}},e.prototype.sendPageViewInternal=function(e,t){var i=a.TelemetryItemCreator.createItem(e,n.PageView.dataType,n.PageView.envelopeType,t);this.context.track(i),this._trackAjaxAttempts=0},e.prototype.sendPageViewPerformanceInternal=function(e){},e.prototype._initialize=function(t,a,s){var l=this;if(r.CoreUtils.isNullOrUndefined(a))throw Error(\"Error initializing\");this._core=a,this._globalconfig={instrumentationKey:t.instrumentationKey,endpointUrl:t.endpointUrl},this.config=t.extensions&&t.extensions[this.identifier]?t.extensions[this.identifier]:{};var c=e.appInsightsDefaultConfig;if(void 0!==c){if(c.extensions&&c.extensions[this.identifier])for(var u in c.extensions[this.identifier])void 0===this.config[u]&&(this.config[u]=c[u]);if(this._globalconfig)for(var u in c)void 0===this._globalconfig[u]&&(this._globalconfig[u]=c[u])}n._InternalLogging.verboseLogging=function(){return l.config.verboseLogging},n._InternalLogging.enableDebugExceptions=function(){return l.config.enableDebug},this.config.isCookieUseDisabled&&n.Util.disableCookies(),this.config.isStorageUseDisabled&&n.Util.disableStorage();var p={instrumentationKey:function(){return t.instrumentationKey},accountId:function(){return l.config.accountId},sessionRenewalMs:function(){return l.config.sessionRenewalMs},sessionExpirationMs:function(){return l.config.sessionExpirationMs},sampleRate:function(){return l.config.samplingPercentage},cookieDomain:function(){return l.config.cookieDomain},sdkExtension:function(){return l.config.sdkExtension},isBrowserLinkTrackingEnabled:function(){return l.config.isBrowserLinkTrackingEnabled},appId:function(){return l.config.appId}};this.context=new o.TelemetryContext(p,this._core),this._pageViewManager=new i.PageViewManager(this,this.config.overridePageViewDuration,this._core)},e.defaultIdentifier=\"ApplicationInsightsAnalytics\",e.Version=\"0.0.1\",e}();t.ApplicationInsights=s;!function(){function e(e){this._name=e,this._events={}}e.prototype.start=function(e){void 0!==this._events[e]&&n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.StartCalledMoreThanOnce,\"start was called more than once for this event without calling stop.\",{name:this._name,key:e},!0),this._events[e]=+new Date},e.prototype.stop=function(e,t,i,r){var o=this._events[e];if(isNaN(o))n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.StopCalledWithoutStart,\"stop was called without a corresponding start.\",{name:this._name,key:e},!0);else{var a=+new Date,s=n.PageViewPerformance.getDuration(o,a);this.action(e,t,s,i,r)}delete this._events[e],this._events[e]=void 0}}()}.apply(t,i))||(e.exports=r)},function(e,t,n){e.exports=n(20)},function(e,t,n){var i,r;i=[n,t,n(0),n(4),n(16),n(17),n(70)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});try{if(\"undefined\"!=typeof window&&\"undefined\"!=typeof JSON){if(void 0===window.appinsightsvnext)o.ApplicationInsights.appInsightsDefaultConfig=a.Initialization.getDefaultConfig();else{var s=window.appinsightsvnext||{},l=new a.Initialization(s),c=l.loadAppInsights();for(var u in c)s[u]=c[u];l.emptyQueue(),l.addHousekeepingBeforeUnload(c)}}if(\"undefined\"!=typeof window&&\"undefined\"!=typeof JSON){var p=new i.AppInsightsCore,d=[],f=new r.Sender,g=new o.ApplicationInsights;d.push(f),d.push(g),p.initialize({instrumentationKey:\"8e68dc94-34d1-4894-8697-be2ba6282b5b\"},d);var h={name:document.title?document.title:\"test page\",uri:document.URL?document.URL:\"\"};g.trackPageView(h)}}catch(e){n._InternalLogging.warnToConsole(\"Failed to initialize AppInsights JS SDK: \"+e.message)}}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(22),n(23),n(24),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a,s,l){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var c=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.aiDataContract={ver:s.FieldType.Required,exceptions:s.FieldType.Required,severityLevel:s.FieldType.Default,properties:s.FieldType.Default,measurements:s.FieldType.Default},o.properties=a.DataSanitizer.sanitizeProperties(n),o.measurements=a.DataSanitizer.sanitizeMeasurements(i),o.exceptions=[new u(t)],r&&(o.severityLevel=r),o}return o(t,e),t.CreateSimpleException=function(e,t,n,i,r,o){return{exceptions:[{hasFullStack:!0,message:e,stack:r,typeName:t}]}},t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Exception\",t.dataType=\"ExceptionData\",t}(i.ExceptionData);t.Exception=c;var u=function(e){function t(t){var n=e.call(this)||this;n.aiDataContract={id:s.FieldType.Default,outerId:s.FieldType.Default,typeName:s.FieldType.Required,message:s.FieldType.Required,hasFullStack:s.FieldType.Default,stack:s.FieldType.Default,parsedStack:s.FieldType.Array},n.typeName=a.DataSanitizer.sanitizeString(t.name)||l.Util.NotSpecified,n.message=a.DataSanitizer.sanitizeMessage(t.message)||l.Util.NotSpecified;var i=t.stack;return n.parsedStack=n.parseStack(i),n.stack=a.DataSanitizer.sanitizeException(i),n.hasFullStack=l.Util.isArray(n.parsedStack)&&n.parsedStack.length>0,n}return o(t,e),t.prototype.parseStack=function(e){var t=void 0;if(\"string\"==typeof e){var n=e.split(\"\\n\");t=[];for(var i=0,r=0,o=0;o<=n.length;o++){var a=n[o];if(p.regex.test(a)){var s=new p(n[o],i++);r+=s.sizeInBytes,t.push(s)}}if(r>32768)for(var l=0,c=t.length-1,u=0,d=l,f=c;l<c;){if((u+=t[l].sizeInBytes+t[c].sizeInBytes)>32768){var g=f-d+1;t.splice(d,g);break}d=l,f=c,l++,c--}}return t},t}(r.ExceptionDetails),p=function(e){function t(n,i){var r=e.call(this)||this;r.sizeInBytes=0,r.aiDataContract={level:s.FieldType.Required,method:s.FieldType.Required,assembly:s.FieldType.Default,fileName:s.FieldType.Default,line:s.FieldType.Default},r.level=i,r.method=\"<no_method>\",r.assembly=l.Util.trim(n);var o=n.match(t.regex);return o&&o.length>=5&&(r.method=l.Util.trim(o[2])||r.method,r.fileName=l.Util.trim(o[4]),r.line=parseInt(o[5])||0),r.sizeInBytes+=r.method.length,r.sizeInBytes+=r.fileName.length,r.sizeInBytes+=r.assembly.length,r.sizeInBytes+=t.baseSize,r.sizeInBytes+=r.level.toString().length,r.sizeInBytes+=r.line.toString().length,r}return o(t,e),t.regex=/^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/,t.baseSize=58,t}(n.StackFrame);t._StackFrame=p}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.StackFrame=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.exceptions=[],t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.ExceptionData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.hasFullStack=!0,this.parsedStack=[]}}();t.ExceptionDetails=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.DisabledPropertyName=\"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\"}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(27),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n){var o=e.call(this)||this;return o.name=i.DataSanitizer.sanitizeString(n)||a.Util.NotSpecified,o.data=t,o.time=a.Util.toISOStringForIE8(new Date),o.aiDataContract={time:r.FieldType.Required,iKey:r.FieldType.Required,name:r.FieldType.Required,sampleRate:function(){return 100==o.sampleRate?r.FieldType.Hidden:r.FieldType.Required},tags:r.FieldType.Required,data:r.FieldType.Required},o}return o(t,e),t}(n.Envelope);t.Envelope=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.ver=1,this.sampleRate=100,this.tags={}}}();t.Envelope=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(11),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o){var s=e.call(this)||this;return s.aiDataContract={ver:r.FieldType.Required,name:r.FieldType.Required,properties:r.FieldType.Default,measurements:r.FieldType.Default},s.name=i.DataSanitizer.sanitizeString(t)||a.Util.NotSpecified,s.properties=i.DataSanitizer.sanitizeProperties(n),s.measurements=i.DataSanitizer.sanitizeMeasurements(o),s}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Event\",t.dataType=\"EventData\",t}(n.EventData);t.Event=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(30),n(3),n(1),n(31),n(2)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(t,n,o,l,c,u){var p=e.call(this)||this;p.aiDataContract={ver:r.FieldType.Required,metrics:r.FieldType.Required,properties:r.FieldType.Default};var d=new a.DataPoint;return d.count=o>0?o:void 0,d.max=isNaN(c)||null===c?void 0:c,d.min=isNaN(l)||null===l?void 0:l,d.name=i.DataSanitizer.sanitizeString(t)||s.Util.NotSpecified,d.value=n,p.metrics=[d],p.properties=i.DataSanitizer.sanitizeProperties(u),p}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Metric\",t.dataType=\"MetricData\",t}(n.MetricData);t.Metric=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.metrics=[],t.properties={},t}return o(t,e),t}(n.Domain);t.MetricData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(32),n(1)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.aiDataContract={name:i.FieldType.Required,kind:i.FieldType.Default,value:i.FieldType.Required,count:i.FieldType.Default,min:i.FieldType.Default,max:i.FieldType.Default,stdDev:i.FieldType.Default},t}return o(t,e),t}(n.DataPoint);t.DataPoint=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(33)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(){this.kind=n.DataPointType.Measurement}}();t.DataPoint=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.Measurement=0]=\"Measurement\",e[e.Aggregation=1]=\"Aggregation\"}(t.DataPointType||(t.DataPointType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(7),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o,s,l,c){var u=e.call(this)||this;return u.aiDataContract={ver:r.FieldType.Required,name:r.FieldType.Default,url:r.FieldType.Default,duration:r.FieldType.Default,properties:r.FieldType.Default,measurements:r.FieldType.Default,id:r.FieldType.Default},u.id=i.DataSanitizer.sanitizeId(c),u.url=i.DataSanitizer.sanitizeUrl(n),u.name=i.DataSanitizer.sanitizeString(t)||a.Util.NotSpecified,isNaN(o)||(u.duration=a.Util.msToTimeSpan(o)),u.properties=i.DataSanitizer.sanitizeProperties(s),u.measurements=i.DataSanitizer.sanitizeMeasurements(l),u}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Pageview\",t.dataType=\"PageviewData\",t}(n.PageViewData);t.PageView=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(3),n(1),n(2),n(2),n(36)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(t,o,s,l,c,u,p,d,f){var g=e.call(this)||this;g.aiDataContract={id:i.FieldType.Required,ver:i.FieldType.Required,name:i.FieldType.Default,resultCode:i.FieldType.Default,duration:i.FieldType.Default,success:i.FieldType.Default,data:i.FieldType.Default,target:i.FieldType.Default,type:i.FieldType.Default,properties:i.FieldType.Default,measurements:i.FieldType.Default,kind:i.FieldType.Default,value:i.FieldType.Default,count:i.FieldType.Default,min:i.FieldType.Default,max:i.FieldType.Default,stdDev:i.FieldType.Default,dependencyKind:i.FieldType.Default,dependencySource:i.FieldType.Default,commandName:i.FieldType.Default,dependencyTypeName:i.FieldType.Default},g.id=t,g.duration=r.Util.msToTimeSpan(l),g.success=c,g.resultCode=u+\"\",g.type=\"Ajax\",g.data=n.DataSanitizer.sanitizeUrl(s);var h=a.AjaxHelper.ParseDependencyPath(o,p,s);return g.target=h.target,g.name=h.name,g.properties=n.DataSanitizer.sanitizeProperties(d),g.measurements=n.DataSanitizer.sanitizeMeasurements(f),g}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.RemoteDependency\",t.dataType=\"RemoteDependencyData\",t}(s.RemoteDependencyData);t.RemoteDependencyData=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.success=!0,t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.RemoteDependencyData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(38),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o){var s=e.call(this)||this;return s.aiDataContract={ver:r.FieldType.Required,message:r.FieldType.Required,severityLevel:r.FieldType.Default,properties:r.FieldType.Default},t=t||a.Util.NotSpecified,s.message=i.DataSanitizer.sanitizeMessage(t),s.properties=i.DataSanitizer.sanitizeProperties(n),o&&(s.severityLevel=o),s}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Message\",t.dataType=\"MessageData\",t}(n.MessageData);t.Trace=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t}return o(t,e),t}(n.Domain);t.MessageData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(40),n(1),n(3),n(2),n(6)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(n,o,l,c,u){var p=e.call(this)||this;p.aiDataContract={ver:i.FieldType.Required,name:i.FieldType.Default,url:i.FieldType.Default,duration:i.FieldType.Default,perfTotal:i.FieldType.Default,networkConnect:i.FieldType.Default,sentRequest:i.FieldType.Default,receivedResponse:i.FieldType.Default,domProcessing:i.FieldType.Default,properties:i.FieldType.Default,measurements:i.FieldType.Default},p.isValid=!1;var d=t.getPerformanceTiming();if(d){var f=t.getDuration(d.navigationStart,d.loadEventEnd),g=t.getDuration(d.navigationStart,d.connectEnd),h=t.getDuration(d.requestStart,d.responseStart),v=t.getDuration(d.responseStart,d.responseEnd),y=t.getDuration(d.responseEnd,d.loadEventEnd);0==f?s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.ErrorPVCalc,\"error calculating page view performance.\",{total:f,network:g,request:h,response:v,dom:y}):t.shouldCollectDuration(f,g,h,v,y)?f<Math.floor(g)+Math.floor(h)+Math.floor(v)+Math.floor(y)?s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.ClientPerformanceMathError,\"client performance math error.\",{total:f,network:g,request:h,response:v,dom:y}):(p.durationMs=f,p.perfTotal=p.duration=a.Util.msToTimeSpan(f),p.networkConnect=a.Util.msToTimeSpan(g),p.sentRequest=a.Util.msToTimeSpan(h),p.receivedResponse=a.Util.msToTimeSpan(v),p.domProcessing=a.Util.msToTimeSpan(y),p.isValid=!0):s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.InvalidDurationValue,\"Invalid page load duration value. Browser perf data won't be sent.\",{total:f,network:g,request:h,response:v,dom:y})}return p.url=r.DataSanitizer.sanitizeUrl(o),p.name=r.DataSanitizer.sanitizeString(n)||a.Util.NotSpecified,p.properties=r.DataSanitizer.sanitizeProperties(c),p.measurements=r.DataSanitizer.sanitizeMeasurements(u),p}return o(t,e),t.prototype.getIsValid=function(){return this.isValid},t.prototype.getDurationMs=function(){return this.durationMs},t.getPerformanceTiming=function(){return t.isPerformanceTimingSupported()?window.performance.timing:null},t.isPerformanceTimingSupported=function(){return!1},t.isPerformanceTimingDataReady=function(){var e=window.performance.timing;return e.domainLookupStart>0&&e.navigationStart>0&&e.responseStart>0&&e.requestStart>0&&e.loadEventEnd>0&&e.responseEnd>0&&e.connectEnd>0&&e.domLoading>0},t.getDuration=function(e,t){var n=void 0;return isNaN(e)||isNaN(t)||(n=Math.max(t-e,0)),n},t.shouldCollectDuration=function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var i=[\"googlebot\",\"adsbot-google\",\"apis-google\",\"mediapartners-google\"],r=navigator.userAgent,o=!1;if(r)for(var a=0;a<i.length;a++)o=o||-1!==r.toLowerCase().indexOf(i[a]);if(o)return!1;for(var s=0;s<e.length;s++)if(e[s]>=t.MAX_DURATION_ALLOWED)return!1;return!0},t.envelopeType=\"Microsoft.ApplicationInsights.{0}.PageviewPerformance\",t.dataType=\"PageviewPerformanceData\",t.MAX_DURATION_ALLOWED=36e5,t}(n.PageViewPerfData);t.PageViewPerformance=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(7)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.PageViewData);t.PageViewPerfData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(9),n(1)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(e){function t(t,n){var r=e.call(this)||this;return r.aiDataContract={baseType:i.FieldType.Required,baseData:i.FieldType.Required},r.baseType=t,r.baseData=n,r}return o(t,e),t}(n.Data);t.Data=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.Verbose=0]=\"Verbose\",e[e.Information=1]=\"Information\",e[e.Warning=2]=\"Warning\",e[e.Error=3]=\"Error\",e[e.Critical=4]=\"Critical\"}(t.SeverityLevel||(t.SeverityLevel={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.applicationVersion=\"ai.application.ver\",this.applicationBuild=\"ai.application.build\",this.applicationTypeId=\"ai.application.typeId\",this.applicationId=\"ai.application.applicationId\",this.applicationLayer=\"ai.application.layer\",this.deviceId=\"ai.device.id\",this.deviceIp=\"ai.device.ip\",this.deviceLanguage=\"ai.device.language\",this.deviceLocale=\"ai.device.locale\",this.deviceModel=\"ai.device.model\",this.deviceFriendlyName=\"ai.device.friendlyName\",this.deviceNetwork=\"ai.device.network\",this.deviceNetworkName=\"ai.device.networkName\",this.deviceOEMName=\"ai.device.oemName\",this.deviceOS=\"ai.device.os\",this.deviceOSVersion=\"ai.device.osVersion\",this.deviceRoleInstance=\"ai.device.roleInstance\",this.deviceRoleName=\"ai.device.roleName\",this.deviceScreenResolution=\"ai.device.screenResolution\",this.deviceType=\"ai.device.type\",this.deviceMachineName=\"ai.device.machineName\",this.deviceVMName=\"ai.device.vmName\",this.deviceBrowser=\"ai.device.browser\",this.deviceBrowserVersion=\"ai.device.browserVersion\",this.locationIp=\"ai.location.ip\",this.locationCountry=\"ai.location.country\",this.locationProvince=\"ai.location.province\",this.locationCity=\"ai.location.city\",this.operationId=\"ai.operation.id\",this.operationName=\"ai.operation.name\",this.operationParentId=\"ai.operation.parentId\",this.operationRootId=\"ai.operation.rootId\",this.operationSyntheticSource=\"ai.operation.syntheticSource\",this.operationCorrelationVector=\"ai.operation.correlationVector\",this.sessionId=\"ai.session.id\",this.sessionIsFirst=\"ai.session.isFirst\",this.sessionIsNew=\"ai.session.isNew\",this.userAccountAcquisitionDate=\"ai.user.accountAcquisitionDate\",this.userAccountId=\"ai.user.accountId\",this.userAgent=\"ai.user.userAgent\",this.userId=\"ai.user.id\",this.userStoreRegion=\"ai.user.storeRegion\",this.userAuthUserId=\"ai.user.authUserId\",this.userAnonymousUserAcquisitionDate=\"ai.user.anonUserAcquisitionDate\",this.userAuthenticatedUserAcquisitionDate=\"ai.user.authUserAcquisitionDate\",this.cloudName=\"ai.cloud.name\",this.cloudRole=\"ai.cloud.role\",this.cloudRoleVer=\"ai.cloud.roleVer\",this.cloudRoleInstance=\"ai.cloud.roleInstance\",this.cloudEnvironment=\"ai.cloud.environment\",this.cloudLocation=\"ai.cloud.location\",this.cloudDeploymentUnit=\"ai.cloud.deploymentUnit\",this.internalSdkVersion=\"ai.internal.sdkVersion\",this.internalAgentVersion=\"ai.internal.agentVersion\",this.internalNodeName=\"ai.internal.nodeName\"}}();t.ContextTagKeys=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(12),n(13),n(14),n(15)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(){this._extensions=new Array}return e.prototype.initialize=function(e,t){var n=this;if(!t||0===t.length)throw Error(\"At least one extension channel is required\");if(!e||r.CoreUtils.isNullOrUndefined(e.instrumentationKey))throw Error(\"Please provide instrumentation key\");this.config=e,this._notificationManager=new o.NotificationManager,this.config.extensions=this.config.extensions?this.config.extensions:{},this.config.extensions.NotificationManager=this._notificationManager,t.forEach(function(e){if(r.CoreUtils.isNullOrUndefined(e.initialize))throw Error(\"Extensions must provide callback to initialize\")}),this._extensions=t.sort(function(e,t){var n=e,i=t,r=typeof n.processTelemetry,o=typeof i.processTelemetry;return\"function\"===r&&\"function\"===o?n.priority>i.priority?1:-1:\"function\"===r&&\"function\"!==o?1:\"function\"!==r&&\"function\"===o?-1:void 0});for(var i=0;i<this._extensions.length-1;i++)this._extensions[i]&&\"function\"!=typeof this._extensions[i].processTelemetry||this._extensions[i].setNextPlugin(this._extensions[i+1]);this._extensions.forEach(function(e){return e.initialize(n.config,n,n._extensions)})},e.prototype.getTransmissionControl=function(){for(var e=0;e<this._extensions.length;e++){var t=this._extensions[e].priority;if(!r.CoreUtils.isNullOrUndefined(t)&&t>=n.MinChannelPriorty)return this._extensions[e]}throw new Error(\"No channel extension found\")},e.prototype.track=function(e){if(null===e)throw this._notifiyInvalidEvent(e),Error(\"Invalid telemetry item\");if(e.baseData&&!e.baseType)throw this._notifiyInvalidEvent(e),Error(\"Provide data.baseType for data.baseData\");this._validateTelmetryItem(e),e.instrumentationKey||(e.instrumentationKey=this.config.instrumentationKey);for(var t=0;t<this._extensions.length;){if(this._extensions[t].processTelemetry){this._extensions[t].processTelemetry(e);break}t++}},e.prototype.addNotificationListener=function(e){this._notificationManager.addNotificationListener(e)},e.prototype.removeNotificationListener=function(e){this._notificationManager.removeNotificationListener(e)},e.prototype._validateTelmetryItem=function(e){if(r.CoreUtils.isNullOrUndefined(e.name))throw this._notifiyInvalidEvent(e),Error(\"telemetry name required\");if(r.CoreUtils.isNullOrUndefined(e.timestamp))throw this._notifiyInvalidEvent(e),Error(\"telemetry timestamp required\");if(r.CoreUtils.isNullOrUndefined(e.instrumentationKey))throw this._notifiyInvalidEvent(e),Error(\"telemetry instrumentationKey required\")},e.prototype._notifiyInvalidEvent=function(e){this._notificationManager.eventsDiscarded([e],i.EventsDiscardedReason.InvalidEvent)},e}();t.AppInsightsCore=a}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(47),n(48),n(49),n(50),n(51),n(46),n(52),n(53),n(54),n(55),n(0),n(4)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p,d,f){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var g=function(){function e(){this.priority=200,this._XMLHttpRequestSupported=!1}return e.prototype.pause=function(){throw new Error(\"Method not implemented.\")},e.prototype.resume=function(){throw new Error(\"Method not implemented.\")},e.prototype.flush=function(){try{this.triggerSend()}catch(e){d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.FlushFailed,\"flush failed, telemetry will not be collected: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}},e.prototype.teardown=function(){throw new Error(\"Method not implemented.\")},e.prototype.initialize=function(t){(this.identifier=\"AppInsightsChannelPlugin\",this._consecutiveErrors=0,this._retryAt=null,this._lastSend=0,this._config=e._getDefaultAppInsightsChannelConfig(t,this.identifier),this._sender=null,this._buffer=d.Util.canUseSessionStorage()&&this._config.enableSessionStorageBuffer?new n.SessionStorageSendBuffer(this._config):new n.ArraySendBuffer(this._config),!this._config.isBeaconApiDisabled()&&d.Util.IsBeaconApiSupported())?this._sender=this._beaconSender:\"undefined\"!=typeof XMLHttpRequest&&(\"withCredentials\"in new XMLHttpRequest?(this._sender=this._xhrSender,this._XMLHttpRequestSupported=!0):\"undefined\"!=typeof XDomainRequest&&(this._sender=this._xdrSender))},e.prototype.processTelemetry=function(t){try{if(this._config.disableTelemetry())return;if(!t)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.CannotSendEmptyTelemetry,\"Cannot send empty telemetry\");if(!this._sender)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.SenderNotInitialized,\"Sender was not initialized\");if(!e._validate(t))return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TelemetryEnvelopeInvalid,\"Invalid telemetry envelope\");var n=e._constructEnvelope(t);if(!n)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.CreateEnvelopeError,\"Unable to create an AppInsights envelope\");var i=p.Serializer.serialize(n),r=this._buffer.getItems(),o=this._buffer.batchPayloads(r);o&&o.length+i.length>this._config.maxBatchSizeInBytes()&&this.triggerSend(),this._buffer.enqueue(i),this._setupTimer()}catch(e){d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.FailedAddingTelemetryToBuffer,\"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}f.CoreUtils.isNullOrUndefined(this._nextPlugin)||this._nextPlugin.processTelemetry(t)},e.prototype.setNextPlugin=function(e){this._nextPlugin=e},e.prototype._xhrReadyStateChange=function(e,t,n){if(4===e.readyState){var i=null;this._appId||(i=this._parseResponse(e.responseText||e.response))&&i.appId&&(this._appId=i.appId),(e.status<200||e.status>=300)&&0!==e.status?!this._config.isRetryDisabled()&&this._isRetriable(e.status)?(this._resendPayload(t),d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\". Response code \"+e.status+\". Will retry to send \"+t.length+\" items.\")):this._onError(t,this._formatErrorMessageXhr(e)):206===e.status?(i||(i=this._parseResponse(e.responseText||e.response)),i&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,i):this._onError(t,this._formatErrorMessageXhr(e))):(this._consecutiveErrors=0,this._onSuccess(t,n))}},e.prototype.triggerSend=function(e){void 0===e&&(e=!0);try{if(this._config.disableTelemetry())this._buffer.clear();else{if(this._buffer.count()>0){var t=this._buffer.getItems();this._sender(t,e)}this._lastSend=+new Date}clearTimeout(this._timeoutHandle),this._timeoutHandle=null,this._retryAt=null}catch(e){(!d.Util.getIEVersion()||d.Util.getIEVersion()>9)&&d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TransmissionFailed,\"Telemetry transmission failed, some telemetry will be lost: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}},e.prototype._onError=function(e,t,n){d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.OnError,\"Failed to send telemetry.\",{message:t}),this._buffer.clearSent(e)},e.prototype._onPartialSuccess=function(e,t){for(var n=[],i=[],r=0,o=t.errors.reverse();r<o.length;r++){var a=o[r],s=e.splice(a.index,1)[0];this._isRetriable(a.statusCode)?i.push(s):n.push(s)}e.length>0&&this._onSuccess(e,t.itemsAccepted),n.length>0&&this._onError(n,this._formatErrorMessageXhr(null,[\"partial success\",t.itemsAccepted,\"of\",t.itemsReceived].join(\" \"))),i.length>0&&(this._resendPayload(i),d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\"Partial success. Delivered: \"+e.length+\", Failed: \"+n.length+\". Will retry to send \"+i.length+\" our of \"+t.itemsReceived+\" items\"))},e.prototype._onSuccess=function(e,t){this._buffer.clearSent(e)},e.prototype._xdrOnLoad=function(e,t){if(!e||e.responseText+\"\"!=\"200\"&&\"\"!==e.responseText){var n=this._parseResponse(e.responseText);n&&n.itemsReceived&&n.itemsReceived>n.itemsAccepted&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,n):this._onError(t,this._formatErrorMessageXdr(e))}else this._consecutiveErrors=0,this._onSuccess(t,0)},e._constructEnvelope=function(e){switch(e.baseType){case d.Event.dataType:return i.EventEnvelopeCreator.EventEnvelopeCreator.Create(e);case d.Trace.dataType:return i.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(e);case d.PageView.dataType:return i.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(e);case d.PageViewPerformance.dataType:return i.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(e);case d.Exception.dataType:return i.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(e);case d.Metric.dataType:return i.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(e);case d.RemoteDependencyData.dataType:return i.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(e);default:return null}},e._getDefaultAppInsightsChannelConfig=function(e,t){var n={},i=e.extensions&&e.extensions[t]?e.extensions[t]:{};return n.endpointUrl=function(){return e.endpointUrl||\"https://dc.services.visualstudio.com/v2/track\"},n.emitLineDelimitedJson=function(){return d.Util.stringToBoolOrDefault(i.emitLineDelimitedJson)},n.maxBatchInterval=function(){return isNaN(i.maxBatchInterval)?15e3:i.maxBatchInterval},n.maxBatchSizeInBytes=function(){return i.maxBatchSizeInBytes>0?i.maxBatchSizeInBytes:102400},n.disableTelemetry=function(){return d.Util.stringToBoolOrDefault(i.disableTelemetry)},n.enableSessionStorageBuffer=function(){return d.Util.stringToBoolOrDefault(i.enableSessionStorageBuffer,!0)},n.isRetryDisabled=function(){return d.Util.stringToBoolOrDefault(i.isRetryDisabled)},n.isBeaconApiDisabled=function(){return d.Util.stringToBoolOrDefault(i.isBeaconApiDisabled,!0)},n},e._validate=function(e){switch(e.baseType){case d.Event.dataType:return r.EventValidator.EventValidator.Validate(e);case d.Trace.dataType:return o.TraceValidator.TraceValidator.Validate(e);case d.Exception.dataType:return a.ExceptionValidator.ExceptionValidator.Validate(e);case d.Metric.dataType:return s.MetricValidator.MetricValidator.Validate(e);case d.PageView.dataType:return c.PageViewValidator.PageViewValidator.Validate(e);case d.PageViewPerformance.dataType:return l.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(e);case d.RemoteDependencyData.dataType:return u.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(e)}return!1},e.prototype._beaconSender=function(e,t){var n=this._config.endpointUrl(),i=this._buffer.batchPayloads(e),r=new Blob([i],{type:\"text/plain;charset=UTF-8\"});navigator.sendBeacon(n,r)?this._buffer.markAsSent(e):d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TransmissionFailed,\". Failed to send telemetry with Beacon API.\")},e.prototype._xhrSender=function(e,t){var n=this,i=new XMLHttpRequest;i[d.DisabledPropertyName]=!0,i.open(\"POST\",this._config.endpointUrl(),t),i.setRequestHeader(\"Content-type\",\"application/json\"),d.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())&&i.setRequestHeader(d.RequestHeaders.sdkContextHeader,d.RequestHeaders.sdkContextHeaderAppIdRequest),i.onreadystatechange=function(){return n._xhrReadyStateChange(i,e,e.length)},i.onerror=function(t){return n._onError(e,n._formatErrorMessageXhr(i),t)};var r=this._buffer.batchPayloads(e);i.send(r),this._buffer.markAsSent(e)},e.prototype._parseResponse=function(e){try{if(e&&\"\"!==e){var t=JSON.parse(e);if(t&&t.itemsReceived&&t.itemsReceived>=t.itemsAccepted&&t.itemsReceived-t.itemsAccepted==t.errors.length)return t}}catch(t){d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.InvalidBackendResponse,\"Cannot parse the response. \"+d.Util.getExceptionName(t),{response:e})}return null},e.prototype._resendPayload=function(e){if(e&&0!==e.length){this._buffer.clearSent(e),this._consecutiveErrors++;for(var t=0,n=e;t<n.length;t++){var i=n[t];this._buffer.enqueue(i)}this._setRetryTime(),this._setupTimer()}},e.prototype._setRetryTime=function(){var e;if(this._consecutiveErrors<=1)e=10;else{var t=(Math.pow(2,this._consecutiveErrors)-1)/2,n=Math.floor(Math.random()*t*10)+1;e=Math.max(Math.min(n,3600),10)}var i=Date.now()+1e3*e;this._retryAt=i},e.prototype._setupTimer=function(){var e=this;if(!this._timeoutHandle){var t=this._retryAt?Math.max(0,this._retryAt-Date.now()):0,n=Math.max(this._config.maxBatchInterval(),t);this._timeoutHandle=setTimeout(function(){e.triggerSend()},n)}},e.prototype._isRetriable=function(e){return 408==e||429==e||500==e||503==e},e.prototype._formatErrorMessageXhr=function(e,t){return e?\"XMLHttpRequest,Status:\"+e.status+\",Response:\"+e.responseText||e.response||\"\":t},e.prototype._xdrSender=function(e,t){var n=this,i=new XDomainRequest;i.onload=function(){return n._xdrOnLoad(i,e)},i.onerror=function(t){return n._onError(e,n._formatErrorMessageXdr(i),t)};var r=window.location.protocol;if(0!==this._config.endpointUrl().lastIndexOf(r,0))return d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\". Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\"),void this._buffer.clear();var o=this._config.endpointUrl().replace(/^(https?:)/,\"\");i.open(\"POST\",o);var a=this._buffer.batchPayloads(e);i.send(a),this._buffer.markAsSent(e)},e.prototype._formatErrorMessageXdr=function(e,t){return e?\"XDomainRequest,Response:\"+e.responseText||\"\":t},e}();t.Sender=g}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!1},e.MetricValidator=new e,e}();t.MetricValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(e){this._config=e,this._buffer=[]}return e.prototype.enqueue=function(e){this._buffer.push(e)},e.prototype.count=function(){return this._buffer.length},e.prototype.clear=function(){this._buffer.length=0},e.prototype.getItems=function(){return this._buffer.slice(0)},e.prototype.batchPayloads=function(e){return e&&e.length>0?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},e.prototype.markAsSent=function(e){this.clear()},e.prototype.clearSent=function(e){},e}();t.ArraySendBuffer=i;var r=function(){function e(t){this._bufferFullMessageSent=!1,this._config=t;var n=this.getBuffer(e.BUFFER_KEY),i=this.getBuffer(e.SENT_BUFFER_KEY);this._buffer=n.concat(i),this._buffer.length>e.MAX_BUFFER_SIZE&&(this._buffer.length=e.MAX_BUFFER_SIZE),this.setBuffer(e.SENT_BUFFER_KEY,[]),this.setBuffer(e.BUFFER_KEY,this._buffer)}return e.prototype.enqueue=function(t){this._buffer.length>=e.MAX_BUFFER_SIZE?this._bufferFullMessageSent||(n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SessionStorageBufferFull,\"Maximum buffer size reached: \"+this._buffer.length,!0),this._bufferFullMessageSent=!0):(this._buffer.push(t),this.setBuffer(e.BUFFER_KEY,this._buffer))},e.prototype.count=function(){return this._buffer.length},e.prototype.clear=function(){this._buffer.length=0,this.setBuffer(e.BUFFER_KEY,[]),this.setBuffer(e.SENT_BUFFER_KEY,[]),this._bufferFullMessageSent=!1},e.prototype.getItems=function(){return this._buffer.slice(0)},e.prototype.batchPayloads=function(e){return e&&e.length>0?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},e.prototype.markAsSent=function(t){this._buffer=this.removePayloadsFromBuffer(t,this._buffer),this.setBuffer(e.BUFFER_KEY,this._buffer);var i=this.getBuffer(e.SENT_BUFFER_KEY);i instanceof Array&&t instanceof Array&&((i=i.concat(t)).length>e.MAX_BUFFER_SIZE&&(n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.SessionStorageBufferFull,\"Sent buffer reached its maximum size: \"+i.length,!0),i.length=e.MAX_BUFFER_SIZE),this.setBuffer(e.SENT_BUFFER_KEY,i))},e.prototype.clearSent=function(t){var n=this.getBuffer(e.SENT_BUFFER_KEY);n=this.removePayloadsFromBuffer(t,n),this.setBuffer(e.SENT_BUFFER_KEY,n)},e.prototype.removePayloadsFromBuffer=function(e,t){var n=[];for(var i in t){var r=!1;for(var o in e)if(e[o]===t[i]){r=!0;break}r||n.push(t[i])}return n},e.prototype.getBuffer=function(e){try{var t=n.Util.getSessionStorage(e);if(t){var i=JSON.parse(t);if(i)return i}}catch(t){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.FailedToRestoreStorageBuffer,\" storage key: \"+e+\", \"+n.Util.getExceptionName(t),{exception:n.Util.dump(t)})}return[]},e.prototype.setBuffer=function(e,t){try{var i=JSON.stringify(t);n.Util.setSessionStorage(e,i)}catch(t){n.Util.setSessionStorage(e,JSON.stringify([])),n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.FailedToSetStorageBuffer,\" storage key: \"+e+\", \"+n.Util.getExceptionName(t)+\". Buffer cleared\",{exception:n.Util.dump(t)})}},e.BUFFER_KEY=\"AI_buffer\",e.SENT_BUFFER_KEY=\"AI_sentBuffer\",e.MAX_BUFFER_SIZE=2e3,e}();t.SessionStorageSendBuffer=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextTagKeys=[\"ai.application.ver\",\"ai.application.build\",\"ai.application.typeId\",\"ai.application.applicationId\",\"ai.application.layer\",\"ai.device.id\",\"ai.device.ip\",\"ai.device.language\",\"ai.device.locale\",\"ai.device.model\",\"ai.device.friendlyName\",\"ai.device.network\",\"ai.device.networkName\",\"ai.device.oemName\",\"ai.device.os\",\"ai.device.osVersion\",\"ai.device.roleInstance\",\"ai.device.roleName\",\"ai.device.screenResolution\",\"ai.device.type\",\"ai.device.machineName\",\"ai.device.vmName\",\"ai.device.browser\",\"ai.device.browserVersion\",\"ai.location.ip\",\"ai.location.country\",\"ai.location.province\",\"ai.location.city\",\"ai.operation.id\",\"ai.operation.name\",\"ai.operation.parentId\",\"ai.operation.rootId\",\"ai.operation.syntheticSource\",\"ai.operation.correlationVector\",\"ai.session.id\",\"ai.session.isFirst\",\"ai.session.isNew\",\"ai.user.accountAcquisitionDate\",\"ai.user.accountId\",\"ai.user.userAgent\",\"ai.user.id\",\"ai.user.storeRegion\",\"ai.user.authUserId\",\"ai.user.anonUserAcquisitionDate\",\"ai.user.authUserAcquisitionDate\",\"ai.cloud.name\",\"ai.cloud.role\",\"ai.cloud.roleVer\",\"ai.cloud.roleInstance\",\"ai.cloud.environment\",\"ai.cloud.location\",\"ai.cloud.deploymentUnit\",\"ai.internal.sdkVersion\",\"ai.internal.agentVersion\",\"ai.internal.nodeName\"];var r=function(){function e(){}return e.extractProperties=function(e){var t=null;for(var n in e)if(e.hasOwnProperty(n)){var i=e[n];\"number\"!=typeof i&&(t||(t={}),t[n]=i)}return t},e.extractPropsAndMeasurements=function(e,t,n){if(!i.CoreUtils.isNullOrUndefined(e))for(var r in e)if(e.hasOwnProperty(r)){var o=e[r];\"number\"==typeof o?n[r]=o:t[r]=o}},e.createEnvelope=function(e,i,r){var o=new n.Envelope(r,e);o.iKey=i.instrumentationKey;var a=i.instrumentationKey.replace(/-/g,\"\");for(var s in o.name=o.name.replace(\"{0}\",a),i.ctx)i.ctx.hasOwnProperty(s)&&t.ContextTagKeys.indexOf(s)>=0&&(o.tags[s]=i.ctx[s]);return i.tags.forEach(function(e){for(var n in e)e.hasOwnProperty(n)&&t.ContextTagKeys.indexOf(n)>=0&&(o.tags[n]=e[n])}),o},e}();t.EnvelopeCreator=r;var a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,o,t);var a=e.baseData.id,s=e.baseData.absoluteUrl,l=e.baseData.command,c=e.baseData.totalTime,u=e.baseData.success,p=e.baseData.resultCode,d=e.baseData.method,f=new n.RemoteDependencyData(a,s,l,c,u,p,d,o,t),g=new n.Data(n.RemoteDependencyData.dataType,f);return r.createEnvelope(n.RemoteDependencyData.envelopeType,e,g)},t.DependencyEnvelopeCreator=new t,t}(r);t.DependencyEnvelopeCreator=a;var s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=new n.Event(a,t,o),l=new n.Data(n.Event.dataType,s);return r.createEnvelope(n.Event.envelopeType,e,l)},t.EventEnvelopeCreator=new t,t}(r);t.EventEnvelopeCreator=s;var l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.exception,s=e.baseData.severityLevel,l=new n.Exception(a,t,o,s),c=new n.Data(n.Exception.dataType,l);return r.createEnvelope(n.Exception.envelopeType,e,c)},t.ExceptionEnvelopeCreator=new t,t}(r);t.ExceptionEnvelopeCreator=l;var c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t=r.extractProperties(e.data),o=e.baseData.name,a=e.baseData.average,s=e.baseData.sampleCount,l=e.baseData.min,c=e.baseData.max,u=new n.Metric(o,a,s,l,c,t),p=new n.Data(n.Metric.dataType,u);return r.createEnvelope(n.Metric.envelopeType,e,p)},t.MetricEnvelopeCreator=new t,t}(r);t.MetricEnvelopeCreator=c;var u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=e.baseData.uri,l=e.baseData.duration;if(i.CoreUtils.isNullOrUndefined(e.baseData.refUri)||(t.refUri=e.baseData.refUri),i.CoreUtils.isNullOrUndefined(e.baseData.pageType)||(t.pageType=e.baseData.pageType),i.CoreUtils.isNullOrUndefined(e.baseData.isLoggedIn)||(t.isLoggedIn=e.baseData.isLoggedIn),!i.CoreUtils.isNullOrUndefined(e.baseData.pageTags)){var c=e.baseData.pageTags;for(var u in c)c.hasOwnProperty(u)&&(t[u]=c[u])}var p=new n.PageView(a,s,l,t,o),d=new n.Data(n.PageView.dataType,p);return r.createEnvelope(n.PageView.envelopeType,e,d)},t.PageViewEnvelopeCreator=new t,t}(r);t.PageViewEnvelopeCreator=u;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=e.baseData.uri,l=e.baseData.duration,c=new n.PageViewPerformance(a,s,l,t,o),u=new n.Data(n.PageViewPerformance.dataType,c);return r.createEnvelope(n.PageViewPerformance.envelopeType,e,u)},t.PageViewPerformanceEnvelopeCreator=new t,t}(r);t.PageViewPerformanceEnvelopeCreator=p;var d=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t=e.baseData.message,o=e.baseData.severityLevel,a=r.extractProperties(e.data),s=new n.Trace(t,a,o),l=new n.Data(n.Trace.dataType,s);return r.createEnvelope(n.Trace.envelopeType,e,l)},t.TraceEnvelopeCreator=new t,t}(r);t.TraceEnvelopeCreator=d}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.EventValidator=new e,e}();t.EventValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.TraceValidator=new e,e}();t.TraceValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e._validateExceptions=function(e){return!0},e.ExceptionValidator=new e,e}();t.ExceptionValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.PageViewPerformanceValidator=new e,e}();t.PageViewPerformanceValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.PageViewValidator=new e,e}();t.PageViewValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.RemoteDepdencyValidator=new e,e}();t.RemoteDepdencyValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(){}return e.serialize=function(t){var n=e._serializeObject(t,\"root\");return JSON.stringify(n)},e._serializeObject=function(t,i){var r={};if(!t)return n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.CannotSerializeObject,\"cannot serialize object because it is null or undefined\",{name:i},!0),r;if(t.__aiCircularRefCheck)return n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CircularReferenceDetected,\"Circular reference detected while serializing object\",{name:i},!0),r;if(!t.aiDataContract){if(\"measurements\"===i)r=e._serializeStringMap(t,\"number\",i);else if(\"properties\"===i)r=e._serializeStringMap(t,\"string\",i);else if(\"tags\"===i)r=e._serializeStringMap(t,\"string\",i);else if(n.Util.isArray(t))r=e._serializeArray(t,i);else{n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CannotSerializeObjectNonSerializable,\"Attempting to serialize an object which does not implement ISerializable\",{name:i},!0);try{JSON.stringify(t),r=t}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.CannotSerializeObject,e&&\"function\"==typeof e.toString?e.toString():\"Error serializing object\",null,!0)}}return r}for(var o in t.__aiCircularRefCheck=!0,t.aiDataContract){var a,s=t.aiDataContract[o],l=\"function\"==typeof s?s()&n.FieldType.Required:s&n.FieldType.Required,c=\"function\"==typeof s?s()&n.FieldType.Hidden:s&n.FieldType.Hidden,u=s&n.FieldType.Array,p=void 0!==t[o],d=\"object\"==typeof t[o]&&null!==t[o];if(!l||p||u){if(!c)void 0!==(a=d?u?e._serializeArray(t[o],o):e._serializeObject(t[o],o):t[o])&&(r[o]=a)}else n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.MissingRequiredFieldSpecification,\"Missing required field specification. The field is required but not present on source\",{field:o,name:i})}return delete t.__aiCircularRefCheck,r},e._serializeArray=function(t,i){var r=void 0;if(t)if(n.Util.isArray(t)){r=[];for(var o=0;o<t.length;o++){var a=t[o],s=e._serializeObject(a,i+\"[\"+o+\"]\");r.push(s)}}else n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.ItemNotInArray,\"This field was specified as an array in the contract but the item is not an array.\\r\\n\",{name:i},!0);return r},e._serializeStringMap=function(e,t,i){var r=void 0;if(e)for(var o in r={},e){var a=e[o];if(\"string\"===t)void 0===a?r[o]=\"undefined\":null===a?r[o]=\"null\":a.toString?r[o]=a.toString():r[o]=\"invalid field: toString() is not defined.\";else if(\"number\"===t)if(void 0===a)r[o]=\"undefined\";else if(null===a)r[o]=\"null\";else{var s=parseFloat(a);isNaN(s)?r[o]=\"NaN\":r[o]=s}else r[o]=\"invalid field: \"+i+\" is of unknown type.\",n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,r[o],null,!0)}return r},e}();t.Serializer=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t,n){this.pageViewPerformanceSent=!1,this.overridePageViewDuration=!1,this.overridePageViewDuration=t,this.appInsights=e,n&&(this._channel=n.getTransmissionControl())}return e.prototype.trackPageView=function(e,t){var r=this,o=e.name;(i.CoreUtils.isNullOrUndefined(o)||\"string\"!=typeof o)&&(e.name=window.document&&window.document.title||\"\");var a=e.uri;if((i.CoreUtils.isNullOrUndefined(a)||\"string\"!=typeof a)&&(e.uri=window.location&&window.location.href||\"\"),!n.PageViewPerformance.isPerformanceTimingSupported())return this.appInsights.sendPageViewInternal(e,t),this._channel.flush(),void n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.NavigationTimingNotSupported,\"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");var s=!1,l=void 0,c=n.PageViewPerformance.getPerformanceTiming().navigationStart;l=n.PageViewPerformance.getDuration(c,+new Date),n.PageViewPerformance.shouldCollectDuration(l)||(l=void 0);var u=e.duration;!this.overridePageViewDuration&&isNaN(u)||(isNaN(u)&&(e.duration=l),this.appInsights.sendPageViewInternal(e,t),this._channel.flush(),s=!0);var p=setInterval(function(){try{if(n.PageViewPerformance.isPerformanceTimingDataReady()){clearInterval(p);var i=new n.PageViewPerformance(o,a,null,t,void 0);i.getIsValid()||s?(s||(e.duration=i.getDurationMs(),r.appInsights.sendPageViewInternal(e,t)),r.pageViewPerformanceSent||(r.appInsights.sendPageViewPerformanceInternal(i),r.pageViewPerformanceSent=!0),r._channel.flush()):(e.duration=l,r.appInsights.sendPageViewInternal(e,t),r._channel.flush())}else n.PageViewPerformance.getDuration(c,+new Date)>6e4&&(clearInterval(p),s||(e.duration=6e4,r.appInsights.sendPageViewInternal(e,t),r._channel.flush()))}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackPVFailedCalc,\"trackPageView failed on page load calculation: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}},100)},e}();t.PageViewManager=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(59),n(60),n(61),n(58),n(62),n(63),n(66),n(67),n(4)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var d=function(){function e(e,t){this._config=e,this._core=t,this._telemetryInitializers=[],\"undefined\"!=typeof window&&(this._sessionManager=new u._SessionManager(e),this.application=new i.Application,this.device=new r.Device,this.internal=new o.Internal(e),this.location=new a.Location,this.user=new c.User(e),this.operation=new s.Operation,this.session=new u.Session,this.sample=new l.Sample(e.sampleRate())),this._addDefaultTelemetryInitializers()}return e.prototype.addTelemetryInitializer=function(e){this._telemetryInitializers.push(e)},e.prototype.track=function(e){return p.CoreUtils.isNullOrUndefined(e)?n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackArgumentsNotSpecified,\"cannot call .track() with a null or undefined argument\",null,!0):(e.name===n.PageView.envelopeType&&n._InternalLogging.resetInternalMessageCount(),this.session&&\"string\"!=typeof this.session.id&&this._sessionManager.update(),this._track(e)),e},e.prototype._addDefaultTelemetryInitializers=function(){if(!this._config.isBrowserLinkTrackingEnabled()){var e=[\"/browserLinkSignalR/\",\"/__browserLink/\"];this.addTelemetryInitializer(function(t){if(t.name===n.RemoteDependencyData.envelopeType){var i=t.data;if(i&&i.baseData)for(var r=0;r<e.length;r++)if(i.baseData.name.indexOf(e[r])>=0)return!1}return!0})}},e.prototype._track=function(e){var t={};this.session&&(\"string\"==typeof this.session.id?this._applySessionContext(t,this.session):this._applySessionContext(t,this._sessionManager.automaticSession)),this._applyApplicationContext(t,this.application),this._applyDeviceContext(t,this.device),this._applyInternalContext(t,this.internal),this._applyLocationContext(t,this.location),this._applySampleContext(t,this.sample),this._applyUserContext(t,this.user),this._applyOperationContext(t,this.operation),e.tags.push(t),e.instrumentationKey=this._config.instrumentationKey();var i=!1;try{for(var r=this._telemetryInitializers.length,o=0;o<r;++o){var a=this._telemetryInitializers[o];if(a&&!1===a.apply(null,[e])){i=!0;break}}}catch(e){i=!0,n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryInitializerFailed,\"One of telemetry initializers failed, telemetry item will not be sent: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)},!0)}if(!i)if(e.name===n.Metric.envelopeType||this.sample.isSampledIn(e)){var s=this._config.instrumentationKey().replace(/-/g,\"\");e.name=e.name.replace(\"{0}\",s),this._core.track(e)}else n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.TelemetrySampledAndNotSent,\"Telemetry is sampled and not sent to the AI service.\",{SampleRate:this.sample.sampleRate},!0);return e},e.prototype._applyApplicationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.ver&&(e[i.applicationVersion]=t.ver),\"string\"==typeof t.build&&(e[i.applicationBuild]=t.build)}},e.prototype._applyDeviceContext=function(e,t){var i=new n.ContextTagKeys;t&&(\"string\"==typeof t.id&&(e[i.deviceId]=t.id),\"string\"==typeof t.ip&&(e[i.deviceIp]=t.ip),\"string\"==typeof t.language&&(e[i.deviceLanguage]=t.language),\"string\"==typeof t.locale&&(e[i.deviceLocale]=t.locale),\"string\"==typeof t.model&&(e[i.deviceModel]=t.model),void 0!==t.network&&(e[i.deviceNetwork]=t.network),\"string\"==typeof t.oemName&&(e[i.deviceOEMName]=t.oemName),\"string\"==typeof t.os&&(e[i.deviceOS]=t.os),\"string\"==typeof t.osversion&&(e[i.deviceOSVersion]=t.osversion),\"string\"==typeof t.resolution&&(e[i.deviceScreenResolution]=t.resolution),\"string\"==typeof t.type&&(e[i.deviceType]=t.type))},e.prototype._applyInternalContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.agentVersion&&(e[i.internalAgentVersion]=t.agentVersion),\"string\"==typeof t.sdkVersion&&(e[i.internalSdkVersion]=t.sdkVersion)}},e.prototype._applyLocationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.ip&&(e[i.locationIp]=t.ip)}},e.prototype._applyOperationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.id&&(e[i.operationId]=t.id),\"string\"==typeof t.name&&(e[i.operationName]=t.name),\"string\"==typeof t.parentId&&(e[i.operationParentId]=t.parentId),\"string\"==typeof t.rootId&&(e[i.operationRootId]=t.rootId),\"string\"==typeof t.syntheticSource&&(e[i.operationSyntheticSource]=t.syntheticSource)}},e.prototype._applySampleContext=function(e,t){t&&(e.sampleRate=t.sampleRate)},e.prototype._applySessionContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.id&&(e[i.sessionId]=t.id),void 0!==t.isFirst&&(e[i.sessionIsFirst]=t.isFirst)}},e.prototype._applyUserContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.accountId&&(e[i.userAccountId]=t.accountId),\"string\"==typeof t.agent&&(e[i.userAgent]=t.agent),\"string\"==typeof t.id&&(e[i.userId]=t.id),\"string\"==typeof t.authenticatedId&&(e[i.userAuthUserId]=t.authenticatedId),\"string\"==typeof t.storeRegion&&(e[i.userStoreRegion]=t.storeRegion)}},e}();t.TelemetryContext=d}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Location=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Application=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.id=\"browser\",this.type=\"Browser\"}}();t.Device=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(18)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(e){this.sdkVersion=(e.sdkExtension()?e.sdkExtension()+\"_\":\"\")+\"javascript:\"+n.ApplicationInsights.Version}}();t.Internal=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(){this.id=n.Util.newId(),window&&window.location&&window.location.pathname&&(this.name=window.location.pathname)}}();t.Operation=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(64),n(0)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e){this.INT_MAX_VALUE=2147483647,(e>100||e<0)&&(i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.SampleRateOutOfRange,\"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\",{samplingRate:e},!0),this.sampleRate=100),this.sampleRate=e,this.samplingScoreGenerator=new n.SamplingScoreGenerator}return e.prototype.isSampledIn=function(e){return!0},e}();t.Sample=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(65),n(0)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(){this.hashCodeGeneragor=new n.HashCodeScoreGenerator}return e.prototype.getSamplingScore=function(e){var t=new i.ContextTagKeys;return e.tags[t.userId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.userId]):e.tags[t.operationId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.operationId]):Math.random()},e}();t.SamplingScoreGenerator=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.getHashCodeScore=function(t){return 100*(this.getHashCode(t)/e.INT_MAX_VALUE)},e.prototype.getHashCode=function(t){if(\"\"==t)return 0;for(;t.length<e.MIN_INPUT_LENGTH;)t=t.concat(t);for(var n=5381,i=0;i<t.length;++i)n=(n<<5)+n+t.charCodeAt(i),n&=n;return Math.abs(n)},e.INT_MAX_VALUE=2147483647,e.MIN_INPUT_LENGTH=8,e}();t.HashCodeScoreGenerator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(t){var i=n.Util.getCookie(e.userCookieName);if(i){var r=i.split(e.cookieSeparator);r.length>0&&(this.id=r[0])}if(this.config=t,!this.id){this.id=n.Util.newId();var o=new Date,a=n.Util.toISOStringForIE8(o);this.accountAcquisitionDate=a,o.setTime(o.getTime()+31536e6);var s=[this.id,a],l=this.config.cookieDomain?this.config.cookieDomain():void 0;n.Util.setCookie(e.userCookieName,s.join(e.cookieSeparator)+\";expires=\"+o.toUTCString(),l),n.Util.removeStorage(\"ai_session\")}this.accountId=t.accountId?t.accountId():void 0;var c=n.Util.getCookie(e.authUserCookieName);if(c){var u=(c=decodeURI(c)).split(e.cookieSeparator);u[0]&&(this.authenticatedId=u[0]),u.length>1&&u[1]&&(this.accountId=u[1])}}return e.prototype.setAuthenticatedUserContext=function(t,i,r){if(void 0===r&&(r=!1),!this.validateUserInput(t)||i&&!this.validateUserInput(i))n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SetAuthContextFailedAccountName,\"Setting auth user context failed. User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\",!0);else{this.authenticatedId=t;var o=this.authenticatedId;i&&(this.accountId=i,o=[this.authenticatedId,this.accountId].join(e.cookieSeparator)),r&&n.Util.setCookie(e.authUserCookieName,encodeURI(o),this.config.cookieDomain())}},e.prototype.clearAuthenticatedUserContext=function(){this.authenticatedId=null,this.accountId=null,n.Util.deleteCookie(e.authUserCookieName)},e.prototype.validateUserInput=function(e){return!(\"string\"!=typeof e||!e||e.match(/,|;|=| |\\|/))},e.cookieSeparator=\"|\",e.userCookieName=\"ai_user\",e.authUserCookieName=\"ai_authUser\",e}();t.User=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(68)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){return function(){}}();t.Session=r;var o=function(){function e(t){t||(t={}),\"function\"!=typeof t.sessionExpirationMs&&(t.sessionExpirationMs=function(){return e.acquisitionSpan}),\"function\"!=typeof t.sessionRenewalMs&&(t.sessionRenewalMs=function(){return e.renewalSpan}),this.config=t,this.automaticSession=new r}return e.prototype.update=function(){this.automaticSession.id||this.initializeAutomaticSession();var t=i.dateTime.Now(),n=t-this.automaticSession.acquisitionDate>this.config.sessionExpirationMs(),r=t-this.automaticSession.renewalDate>this.config.sessionRenewalMs();n||r?(this.automaticSession.isFirst=void 0,this.renew()):(!this.cookieUpdatedTimestamp||t-this.cookieUpdatedTimestamp>e.cookieUpdateInterval)&&(this.automaticSession.renewalDate=t,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate))},e.prototype.backup=function(){this.setStorage(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate)},e.prototype.initializeAutomaticSession=function(){var e=n.Util.getCookie(\"ai_session\");if(e&&\"function\"==typeof e.split)this.initializeAutomaticSessionWithData(e);else{var t=n.Util.getStorage(\"ai_session\");t&&this.initializeAutomaticSessionWithData(t)}this.automaticSession.id||(this.automaticSession.isFirst=!0,this.renew())},e.prototype.initializeAutomaticSessionWithData=function(e){var t=e.split(\"|\");t.length>0&&(this.automaticSession.id=t[0]);try{if(t.length>1){var i=+t[1];this.automaticSession.acquisitionDate=+new Date(i),this.automaticSession.acquisitionDate=this.automaticSession.acquisitionDate>0?this.automaticSession.acquisitionDate:0}if(t.length>2){var r=+t[2];this.automaticSession.renewalDate=+new Date(r),this.automaticSession.renewalDate=this.automaticSession.renewalDate>0?this.automaticSession.renewalDate:0}}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.ErrorParsingAISessionCookie,\"Error parsing ai_session cookie, session will be reset: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}0==this.automaticSession.renewalDate&&n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SessionRenewalDateIsZero,\"AI session renewal date is 0, session will be reset.\")},e.prototype.renew=function(){var e=i.dateTime.Now();this.automaticSession.id=n.Util.newId(),this.automaticSession.acquisitionDate=e,this.automaticSession.renewalDate=e,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate),n.Util.canUseLocalStorage()||n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserDoesNotSupportLocalStorage,\"Browser does not support local storage. Session durations will be inaccurate.\")},e.prototype.setCookie=function(e,t,r){var o=t+this.config.sessionExpirationMs(),a=r+this.config.sessionRenewalMs(),s=new Date,l=[e,t,r];o<a?s.setTime(o):s.setTime(a);var c=this.config.cookieDomain?this.config.cookieDomain():null;n.Util.setCookie(\"ai_session\",l.join(\"|\")+\";expires=\"+s.toUTCString(),c),this.cookieUpdatedTimestamp=i.dateTime.Now()},e.prototype.setStorage=function(e,t,i){n.Util.setStorage(\"ai_session\",[e,t,i].join(\"|\"))},e.acquisitionSpan=864e5,e.renewalSpan=18e5,e.cookieUpdateInterval=6e4,e}();t._SessionManager=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.IsNullOrUndefined=function(e){return void 0===e||null===e},e}();t.extensions=n;var i=function(){function e(){}return e.GetLength=function(e){var t=0;if(!n.IsNullOrUndefined(e)){var i=\"\";try{i=e.toString()}catch(e){}t=i.length,t=isNaN(t)?0:t}return t},e}();t.stringUtils=i;var r=function(){function e(){}return e.Now=window.performance&&window.performance.now&&window.performance.timing?function(){return window.performance.now()+window.performance.timing.navigationStart}:function(){return(new Date).getTime()},e.GetDuration=function(e,t){var i=null;return 0===e||0===t||n.IsNullOrUndefined(e)||n.IsNullOrUndefined(t)||(i=t-e),i},e}();t.dateTime=r;var o=function(){function e(){}return e.AttachEvent=function(e,t,i){var r=!1;return n.IsNullOrUndefined(e)||(n.IsNullOrUndefined(e.attachEvent)?n.IsNullOrUndefined(e.addEventListener)||(e.addEventListener(t,i,!1),r=!0):(e.attachEvent(\"on\"+t,i),r=!0)),r},e.DetachEvent=function(e,t,i){n.IsNullOrUndefined(e)||(n.IsNullOrUndefined(e.detachEvent)?n.IsNullOrUndefined(e.removeEventListener)||e.removeEventListener(t,i,!1):e.detachEvent(\"on\"+t,i))},e}();t.EventHelper=o}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(){}return e.createItem=function(t,n,r,o){if(i.CoreUtils.isNullOrUndefined(t)||i.CoreUtils.isNullOrUndefined(n)||i.CoreUtils.isNullOrUndefined(r))throw Error(\"pageView doesn't contain all required fields\");return e.creator.create(t,n,r,o)},e.prototype.create=function(e,t,r,o){if(r=n.DataSanitizer.sanitizeString(r)||n.Util.NotSpecified,t===n.PageView.dataType){var a={name:r,timestamp:new Date,instrumentationKey:\"\",ctx:{},tags:[],data:{},baseType:t,baseData:e};if(!i.CoreUtils.isNullOrUndefined(o))for(var s in o)o.hasOwnProperty(s)&&(a.data[s]=o[s]);return a}throw Error(\"Not implemented\")},e.creator=new e,e}();t.TelemetryItemCreator=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(4),n(17),n(0),n(16)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(t){t.queue=t.queue||[];var n=t.config||{};n&&!n.instrumentationKey&&(n=t,i.ApplicationInsights.Version=\"2.0.0\"),this.appInsights=new i.ApplicationInsights,n=e.getDefaultConfig(n,this.appInsights.identifier),this.snippet=t,this.config=n}return e.prototype.loadAppInsights=function(){this.core=new n.AppInsightsCore;var e=[],t=new o.Sender;return e.push(t),e.push(this.appInsights),this.core.initialize(this.config,e),this.appInsights.initialize(this.config,this.core,e),t.initialize(this.config),this.appInsights},e.prototype.emptyQueue=function(){try{if(r.Util.isArray(this.snippet.queue)){for(var e=this.snippet.queue.length,t=0;t<e;t++){(0,this.snippet.queue[t])()}this.snippet.queue=void 0,delete this.snippet.queue}}catch(e){e&&\"function\"==typeof e.toString&&e.toString()}},e.prototype.pollInteralLogs=function(e){},e.prototype.addHousekeepingBeforeUnload=function(e){if(!e.config.disableFlushOnBeforeUnload&&\"onbeforeunload\"in window){r.Util.addEventHandler(\"beforeunload\",function(){this.core.getTransmissionControl().flush(!0),e.context._sessionManager.backup()})||r._InternalLogging.throwInternal(r.LoggingSeverity.CRITICAL,r._InternalMessageId.FailedToAddHandlerForOnBeforeUnload,\"Could not add handler for beforeunload\")}},e.getDefaultConfig=function(e,t){e||(e={}),e&&(t=t||\"AppAnalytics\");var n=e.extensions?e.extensions[t]:{};return e.endpointUrl=e.endpointUrl||\"https://dc.services.visualstudio.com/v2/track\",n.sessionRenewalMs=18e5,n.sessionExpirationMs=864e5,n.enableDebug=r.Util.stringToBoolOrDefault(n.enableDebug),n.disableExceptionTracking=r.Util.stringToBoolOrDefault(n.disableExceptionTracking),n.verboseLogging=r.Util.stringToBoolOrDefault(n.verboseLogging),n.diagnosticLogInterval=n.diagnosticLogInterval||1e4,n.autoTrackPageVisitTime=r.Util.stringToBoolOrDefault(n.autoTrackPageVisitTime),(isNaN(n.samplingPercentage)||n.samplingPercentage<=0||n.samplingPercentage>=100)&&(n.samplingPercentage=100),n.disableAjaxTracking=r.Util.stringToBoolOrDefault(n.disableAjaxTracking),n.maxAjaxCallsPerView=isNaN(n.maxAjaxCallsPerView)?500:n.maxAjaxCallsPerView,n.disableCorrelationHeaders=r.Util.stringToBoolOrDefault(n.disableCorrelationHeaders),n.correlationHeaderExcludedDomains=n.correlationHeaderExcludedDomains||[\"*.blob.core.windows.net\",\"*.blob.core.chinacloudapi.cn\",\"*.blob.core.cloudapi.de\",\"*.blob.core.usgovcloudapi.net\"],n.disableFlushOnBeforeUnload=r.Util.stringToBoolOrDefault(n.disableFlushOnBeforeUnload),n.isCookieUseDisabled=r.Util.stringToBoolOrDefault(n.isCookieUseDisabled),n.isStorageUseDisabled=r.Util.stringToBoolOrDefault(n.isStorageUseDisabled),n.isBrowserLinkTrackingEnabled=r.Util.stringToBoolOrDefault(n.isBrowserLinkTrackingEnabled),n.enableCorsCorrelation=r.Util.stringToBoolOrDefault(n.enableCorsCorrelation),e},e}();t.Initialization=a}.apply(t,i))||(e.exports=r)}])});\n//# sourceMappingURL=aisdk.0.0.8.js.map"
  },
  {
    "path": "AISKU/dist-history/aisdk.min.0.0.8.js",
    "content": "!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var n=t();for(var i in n)(\"object\"==typeof exports?exports:e)[i]=n[i]}}(window,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=19)}([function(e,t,n){var i,r;i=[n,t,n(2),n(1),n(6),n(8),n(25),n(9),n(10),n(26),n(28),n(21),n(29),n(34),n(7),n(35),n(37),n(39),n(41),n(42),n(43),n(3)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p,d,f,g,h,v,y,_,m,I,S){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Util=n.Util,t.CorrelationIdHelper=n.CorrelationIdHelper,t.UrlHelper=n.UrlHelper,t._InternalMessageId=i._InternalMessageId,t.LoggingSeverity=i.LoggingSeverity,t.FieldType=i.FieldType,t._InternalLogging=r._InternalLogging,t._InternalLogMessage=r._InternalLogMessage,t.RequestHeaders=o.RequestHeaders,t.DisabledPropertyName=a.DisabledPropertyName,t.AIData=s.Data,t.AIBase=l.Base,t.Envelope=c.Envelope,t.Event=u.Event,t.Exception=p.Exception,t.Metric=d.Metric,t.PageView=f.PageView,t.PageViewData=g.PageViewData,t.RemoteDependencyData=h.RemoteDependencyData,t.Trace=v.Trace,t.PageViewPerformance=y.PageViewPerformance,t.Data=_.Data,t.SeverityLevel=m.SeverityLevel,t.ContextTagKeys=I.ContextTagKeys,t.DataSanitizer=S.DataSanitizer}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.CRITICAL=0]=\"CRITICAL\",e[e.WARNING=1]=\"WARNING\"}(t.LoggingSeverity||(t.LoggingSeverity={})),function(e){e[e.BrowserDoesNotSupportLocalStorage=0]=\"BrowserDoesNotSupportLocalStorage\",e[e.BrowserCannotReadLocalStorage=1]=\"BrowserCannotReadLocalStorage\",e[e.BrowserCannotReadSessionStorage=2]=\"BrowserCannotReadSessionStorage\",e[e.BrowserCannotWriteLocalStorage=3]=\"BrowserCannotWriteLocalStorage\",e[e.BrowserCannotWriteSessionStorage=4]=\"BrowserCannotWriteSessionStorage\",e[e.BrowserFailedRemovalFromLocalStorage=5]=\"BrowserFailedRemovalFromLocalStorage\",e[e.BrowserFailedRemovalFromSessionStorage=6]=\"BrowserFailedRemovalFromSessionStorage\",e[e.CannotSendEmptyTelemetry=7]=\"CannotSendEmptyTelemetry\",e[e.ClientPerformanceMathError=8]=\"ClientPerformanceMathError\",e[e.ErrorParsingAISessionCookie=9]=\"ErrorParsingAISessionCookie\",e[e.ErrorPVCalc=10]=\"ErrorPVCalc\",e[e.ExceptionWhileLoggingError=11]=\"ExceptionWhileLoggingError\",e[e.FailedAddingTelemetryToBuffer=12]=\"FailedAddingTelemetryToBuffer\",e[e.FailedMonitorAjaxAbort=13]=\"FailedMonitorAjaxAbort\",e[e.FailedMonitorAjaxDur=14]=\"FailedMonitorAjaxDur\",e[e.FailedMonitorAjaxOpen=15]=\"FailedMonitorAjaxOpen\",e[e.FailedMonitorAjaxRSC=16]=\"FailedMonitorAjaxRSC\",e[e.FailedMonitorAjaxSend=17]=\"FailedMonitorAjaxSend\",e[e.FailedMonitorAjaxGetCorrelationHeader=18]=\"FailedMonitorAjaxGetCorrelationHeader\",e[e.FailedToAddHandlerForOnBeforeUnload=19]=\"FailedToAddHandlerForOnBeforeUnload\",e[e.FailedToSendQueuedTelemetry=20]=\"FailedToSendQueuedTelemetry\",e[e.FailedToReportDataLoss=21]=\"FailedToReportDataLoss\",e[e.FlushFailed=22]=\"FlushFailed\",e[e.MessageLimitPerPVExceeded=23]=\"MessageLimitPerPVExceeded\",e[e.MissingRequiredFieldSpecification=24]=\"MissingRequiredFieldSpecification\",e[e.NavigationTimingNotSupported=25]=\"NavigationTimingNotSupported\",e[e.OnError=26]=\"OnError\",e[e.SessionRenewalDateIsZero=27]=\"SessionRenewalDateIsZero\",e[e.SenderNotInitialized=28]=\"SenderNotInitialized\",e[e.StartTrackEventFailed=29]=\"StartTrackEventFailed\",e[e.StopTrackEventFailed=30]=\"StopTrackEventFailed\",e[e.StartTrackFailed=31]=\"StartTrackFailed\",e[e.StopTrackFailed=32]=\"StopTrackFailed\",e[e.TelemetrySampledAndNotSent=33]=\"TelemetrySampledAndNotSent\",e[e.TrackEventFailed=34]=\"TrackEventFailed\",e[e.TrackExceptionFailed=35]=\"TrackExceptionFailed\",e[e.TrackMetricFailed=36]=\"TrackMetricFailed\",e[e.TrackPVFailed=37]=\"TrackPVFailed\",e[e.TrackPVFailedCalc=38]=\"TrackPVFailedCalc\",e[e.TrackTraceFailed=39]=\"TrackTraceFailed\",e[e.TransmissionFailed=40]=\"TransmissionFailed\",e[e.FailedToSetStorageBuffer=41]=\"FailedToSetStorageBuffer\",e[e.FailedToRestoreStorageBuffer=42]=\"FailedToRestoreStorageBuffer\",e[e.InvalidBackendResponse=43]=\"InvalidBackendResponse\",e[e.FailedToFixDepricatedValues=44]=\"FailedToFixDepricatedValues\",e[e.InvalidDurationValue=45]=\"InvalidDurationValue\",e[e.TelemetryEnvelopeInvalid=46]=\"TelemetryEnvelopeInvalid\",e[e.CreateEnvelopeError=47]=\"CreateEnvelopeError\",e[e.CannotSerializeObject=48]=\"CannotSerializeObject\",e[e.CannotSerializeObjectNonSerializable=49]=\"CannotSerializeObjectNonSerializable\",e[e.CircularReferenceDetected=50]=\"CircularReferenceDetected\",e[e.ClearAuthContextFailed=51]=\"ClearAuthContextFailed\",e[e.ExceptionTruncated=52]=\"ExceptionTruncated\",e[e.IllegalCharsInName=53]=\"IllegalCharsInName\",e[e.ItemNotInArray=54]=\"ItemNotInArray\",e[e.MaxAjaxPerPVExceeded=55]=\"MaxAjaxPerPVExceeded\",e[e.MessageTruncated=56]=\"MessageTruncated\",e[e.NameTooLong=57]=\"NameTooLong\",e[e.SampleRateOutOfRange=58]=\"SampleRateOutOfRange\",e[e.SetAuthContextFailed=59]=\"SetAuthContextFailed\",e[e.SetAuthContextFailedAccountName=60]=\"SetAuthContextFailedAccountName\",e[e.StringValueTooLong=61]=\"StringValueTooLong\",e[e.StartCalledMoreThanOnce=62]=\"StartCalledMoreThanOnce\",e[e.StopCalledWithoutStart=63]=\"StopCalledWithoutStart\",e[e.TelemetryInitializerFailed=64]=\"TelemetryInitializerFailed\",e[e.TrackArgumentsNotSpecified=65]=\"TrackArgumentsNotSpecified\",e[e.UrlTooLong=66]=\"UrlTooLong\",e[e.SessionStorageBufferFull=67]=\"SessionStorageBufferFull\",e[e.CannotAccessCookie=68]=\"CannotAccessCookie\",e[e.IdTooLong=69]=\"IdTooLong\"}(t._InternalMessageId||(t._InternalMessageId={})),function(e){e[e.LocalStorage=0]=\"LocalStorage\",e[e.SessionStorage=1]=\"SessionStorage\"}(t.StorageType||(t.StorageType={})),function(e){e[e.Default=0]=\"Default\",e[e.Required=1]=\"Required\",e[e.Array=2]=\"Array\",e[e.Hidden=4]=\"Hidden\"}(t.FieldType||(t.FieldType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(1),n(6),n(8),n(3)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(){}return e.disableStorage=function(){e._canUseLocalStorage=!1,e._canUseSessionStorage=!1},e._getLocalStorageObject=function(){return e.canUseLocalStorage()?e._getVerifiedStorageObject(n.StorageType.LocalStorage):null},e._getVerifiedStorageObject=function(e){var t,i,r=null;try{i=new Date,(r=e===n.StorageType.LocalStorage?window.localStorage:window.sessionStorage).setItem(i,i),t=r.getItem(i)!=i,r.removeItem(i),t&&(r=null)}catch(e){r=null}return r},e.isInternalApplicationInsightsEndpoint=function(t){return-1!==e._internalEndpoints.indexOf(t.toLowerCase())},e.canUseLocalStorage=function(){return void 0===e._canUseLocalStorage&&(e._canUseLocalStorage=!!e._getVerifiedStorageObject(n.StorageType.LocalStorage)),e._canUseLocalStorage},e.getStorage=function(t){var r=e._getLocalStorageObject();if(null!==r)try{return r.getItem(t)}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotReadLocalStorage,\"Browser failed read of local storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return null},e.setStorage=function(t,r){var o=e._getLocalStorageObject();if(null!==o)try{return o.setItem(t,r),!0}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotWriteLocalStorage,\"Browser failed write to local storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.removeStorage=function(t){var r=e._getLocalStorageObject();if(null!==r)try{return r.removeItem(t),!0}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserFailedRemovalFromLocalStorage,\"Browser failed removal of local storage item. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e._getSessionStorageObject=function(){return e.canUseSessionStorage()?e._getVerifiedStorageObject(n.StorageType.SessionStorage):null},e.canUseSessionStorage=function(){return void 0===e._canUseSessionStorage&&(e._canUseSessionStorage=!!e._getVerifiedStorageObject(n.StorageType.SessionStorage)),e._canUseSessionStorage},e.getSessionStorageKeys=function(){var t=[];if(e.canUseSessionStorage())for(var n in window.sessionStorage)t.push(n);return t},e.getSessionStorage=function(t){var r=e._getSessionStorageObject();if(null!==r)try{return r.getItem(t)}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotReadSessionStorage,\"Browser failed read of session storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return null},e.setSessionStorage=function(t,r){var o=e._getSessionStorageObject();if(null!==o)try{return o.setItem(t,r),!0}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotWriteSessionStorage,\"Browser failed write to session storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.removeSessionStorage=function(t){var r=e._getSessionStorageObject();if(null!==r)try{return r.removeItem(t),!0}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserFailedRemovalFromSessionStorage,\"Browser failed removal of session storage item. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.disableCookies=function(){e._canUseCookies=!1},e.canUseCookies=function(){if(void 0===e._canUseCookies){e._canUseCookies=!1;try{e._canUseCookies=void 0!==e.document.cookie}catch(t){i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CannotAccessCookie,\"Cannot access document.cookie - \"+e.getExceptionName(t),{exception:e.dump(t)})}}return e._canUseCookies},e.setCookie=function(t,n,i){var r=\"\",o=\"\";i&&(r=\";domain=\"+i),e.document.location&&\"https:\"===e.document.location.protocol&&(o=\";secure\"),e.canUseCookies()&&(e.document.cookie=t+\"=\"+n+r+\";path=/\"+o)},e.stringToBoolOrDefault=function(e,t){return void 0===t&&(t=!1),void 0===e||null===e?t:\"true\"===e.toString().toLowerCase()},e.getCookie=function(t){if(e.canUseCookies()){var n=\"\";if(t&&t.length)for(var i=t+\"=\",r=e.document.cookie.split(\";\"),o=0;o<r.length;o++){var a=r[o];if((a=e.trim(a))&&0===a.indexOf(i)){n=a.substring(i.length,r[o].length);break}}return n}},e.deleteCookie=function(t){e.canUseCookies()&&(e.document.cookie=t+\"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\")},e.trim=function(e){return\"string\"!=typeof e?e:e.replace(/^\\s+|\\s+$/g,\"\")},e.newId=function(){for(var e=\"\",t=1073741824*Math.random();t>0;){e+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(t%64),t=Math.floor(t/64)}return e},e.isArray=function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},e.isError=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)},e.isDate=function(e){return\"[object Date]\"===Object.prototype.toString.call(e)},e.toISOStringForIE8=function(t){if(e.isDate(t)){if(Date.prototype.toISOString)return t.toISOString();var n=function(e){var t=String(e);return 1===t.length&&(t=\"0\"+t),t};return t.getUTCFullYear()+\"-\"+n(t.getUTCMonth()+1)+\"-\"+n(t.getUTCDate())+\"T\"+n(t.getUTCHours())+\":\"+n(t.getUTCMinutes())+\":\"+n(t.getUTCSeconds())+\".\"+String((t.getUTCMilliseconds()/1e3).toFixed(3)).slice(2,5)+\"Z\"}},e.getIEVersion=function(e){void 0===e&&(e=null);var t=e?e.toLowerCase():navigator.userAgent.toLowerCase();return-1!=t.indexOf(\"msie\")?parseInt(t.split(\"msie\")[1]):null},e.msToTimeSpan=function(e){(isNaN(e)||e<0)&&(e=0);var t=\"\"+(e=Math.round(e))%1e3,n=\"\"+Math.floor(e/1e3)%60,i=\"\"+Math.floor(e/6e4)%60,r=\"\"+Math.floor(e/36e5)%24,o=Math.floor(e/864e5);return t=1===t.length?\"00\"+t:2===t.length?\"0\"+t:t,n=n.length<2?\"0\"+n:n,i=i.length<2?\"0\"+i:i,r=r.length<2?\"0\"+r:r,(o>0?o+\".\":\"\")+r+\":\"+i+\":\"+n+\".\"+t},e.isCrossOriginError=function(e,t,n,i,r){return(\"Script error.\"===e||\"Script error\"===e)&&!r},e.dump=function(e){var t=Object.prototype.toString.call(e),n=JSON.stringify(e);return\"[object Error]\"===t&&(n=\"{ stack: '\"+e.stack+\"', message: '\"+e.message+\"', name: '\"+e.name+\"'\"),t+n},e.getExceptionName=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)?e.name:\"\"},e.addEventHandler=function(e,t){if(!window||\"string\"!=typeof e||\"function\"!=typeof t)return!1;var n=\"on\"+e;if(window.addEventListener)window.addEventListener(e,t,!1);else{if(!window.attachEvent)return!1;window.attachEvent(n,t)}return!0},e.IsBeaconApiSupported=function(){return\"sendBeacon\"in navigator&&navigator.sendBeacon},e.document=\"undefined\"!=typeof document?document:{},e._canUseCookies=void 0,e._canUseLocalStorage=void 0,e._canUseSessionStorage=void 0,e._internalEndpoints=[\"https://dc.services.visualstudio.com/v2/track\",\"https://breeze.aimon.applicationinsights.io/v2/track\",\"https://dc-int.services.visualstudio.com/v2/track\"],e.NotSpecified=\"not_specified\",e}();t.Util=a;var s=function(){function e(){}return e.parseUrl=function(t){return e.htmlAnchorElement||(e.htmlAnchorElement=e.document.createElement?e.document.createElement(\"a\"):{}),e.htmlAnchorElement.href=t,e.htmlAnchorElement},e.getAbsoluteUrl=function(t){var n,i=e.parseUrl(t);return i&&(n=i.href),n},e.getPathName=function(t){var n,i=e.parseUrl(t);return i&&(n=i.pathname),n},e.getCompleteUrl=function(e,t){return e?e.toUpperCase()+\" \"+t:t},e.document=\"undefined\"!=typeof document?document:{},e}();t.UrlHelper=s;var l=function(){function e(){}return e.canIncludeCorrelationHeader=function(e,t,n){if(e&&e.disableCorrelationHeaders)return!1;if(!t)return!1;var i=s.parseUrl(t).host.toLowerCase();if(!(e&&e.enableCorsCorrelation||i===n))return!1;var r=e&&e.correlationHeaderExcludedDomains;if(!r||0==r.length)return!0;for(var o=0;o<r.length;o++){if(new RegExp(r[o].toLowerCase().replace(/\\./g,\".\").replace(/\\*/g,\".*\")).test(i))return!1}return!0},e.getCorrelationContext=function(t){if(t){var n=e.getCorrelationContextValue(t,r.RequestHeaders.requestContextTargetKey);if(n&&n!==e.correlationIdPrefix)return n}},e.getCorrelationContextValue=function(e,t){if(e)for(var n=e.split(\",\"),i=0;i<n.length;++i){var r=n[i].split(\"=\");if(2==r.length&&r[0]==t)return r[1]}},e.correlationIdPrefix=\"cid-v1:\",e}();t.CorrelationIdHelper=l;var c=function(){function e(){}return e.ParseDependencyPath=function(e,t,n){var i,r;if(e&&e.length>0){var a=s.parseUrl(e);if(i=a.host,null!=a.pathname)\"/\"!==(n=0===a.pathname.length?\"/\":a.pathname).charAt(0)&&(n=\"/\"+n),r=o.DataSanitizer.sanitizeString(t?t+\" \"+n:n);else r=o.DataSanitizer.sanitizeString(e)}else i=n,r=n;return{target:i,name:r}},e}();t.AjaxHelper=c}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(6),n(2),n(1)],void 0===(r=function(e,t,n,i,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(){}return e.sanitizeKeyAndAddUniqueness=function(t,n){var i=t.length,r=e.sanitizeKey(t);if(r.length!==i){for(var o=0,a=r;void 0!==n[a];)o++,a=r.substring(0,e.MAX_NAME_LENGTH-3)+e.padNumber(o);r=a}return r},e.sanitizeKey=function(t){return t&&(t=i.Util.trim(t.toString())).length>e.MAX_NAME_LENGTH&&(t=t.substring(0,e.MAX_NAME_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.NameTooLong,\"name is too long.  It has been truncated to \"+e.MAX_NAME_LENGTH+\" characters.\",{name:t},!0)),t},e.sanitizeString=function(t,o){return void 0===o&&(o=e.MAX_STRING_LENGTH),t&&(o=o||e.MAX_STRING_LENGTH,(t=i.Util.trim(t)).toString().length>o&&(t=t.toString().substring(0,o),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.StringValueTooLong,\"string value is too long. It has been truncated to \"+o+\" characters.\",{value:t},!0))),t},e.sanitizeUrl=function(t){return e.sanitizeInput(t,e.MAX_URL_LENGTH,r._InternalMessageId.UrlTooLong)},e.sanitizeMessage=function(t){return t&&t.length>e.MAX_MESSAGE_LENGTH&&(t=t.substring(0,e.MAX_MESSAGE_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.MessageTruncated,\"message is too long, it has been truncated to \"+e.MAX_MESSAGE_LENGTH+\" characters.\",{message:t},!0)),t},e.sanitizeException=function(t){return t&&t.length>e.MAX_EXCEPTION_LENGTH&&(t=t.substring(0,e.MAX_EXCEPTION_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.ExceptionTruncated,\"exception is too long, it has been truncated to \"+e.MAX_EXCEPTION_LENGTH+\" characters.\",{exception:t},!0)),t},e.sanitizeProperties=function(t){if(t){var n={};for(var i in t){var r=e.sanitizeString(t[i],e.MAX_PROPERTY_LENGTH);n[i=e.sanitizeKeyAndAddUniqueness(i,n)]=r}t=n}return t},e.sanitizeMeasurements=function(t){if(t){var n={};for(var i in t){var r=t[i];n[i=e.sanitizeKeyAndAddUniqueness(i,n)]=r}t=n}return t},e.sanitizeId=function(t){return t?e.sanitizeInput(t,e.MAX_ID_LENGTH,r._InternalMessageId.IdTooLong).toString():t},e.sanitizeInput=function(e,t,o){return e&&(e=i.Util.trim(e)).length>t&&(e=e.substring(0,t),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,o,\"input is too long, it has been truncated to \"+t+\" characters.\",{data:e},!0)),e},e.padNumber=function(e){var t=\"00\"+e;return t.substr(t.length-3)},e.MAX_NAME_LENGTH=150,e.MAX_ID_LENGTH=128,e.MAX_PROPERTY_LENGTH=8192,e.MAX_STRING_LENGTH=1024,e.MAX_URL_LENGTH=2048,e.MAX_MESSAGE_LENGTH=32768,e.MAX_EXCEPTION_LENGTH=32768,e}();t.DataSanitizer=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(12),n(13),n(44),n(14),n(15)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MinChannelPriorty=n.MinChannelPriorty,t.EventsDiscardedReason=i.EventsDiscardedReason,t.AppInsightsCore=r.AppInsightsCore,t.CoreUtils=o.CoreUtils,t.NotificationManager=a.NotificationManager}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Domain=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(1),n(2)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(t,i,r,o){void 0===r&&(r=!1),this.messageId=t,this.message=(r?e.AiUserActionablePrefix:e.AiNonUserActionablePrefix)+n._InternalMessageId[t].toString();var a=(i?\" message:\"+e.sanitizeDiagnosticText(i):\"\")+(o?\" props:\"+e.sanitizeDiagnosticText(JSON.stringify(o)):\"\");this.message+=a}return e.sanitizeDiagnosticText=function(e){return'\"'+e.replace(/\\\"/g,\"\")+'\"'},e.AiNonUserActionablePrefix=\"AI (Internal): \",e.AiUserActionablePrefix=\"AI: \",e}();t._InternalLogMessage=r;var o=function(){function e(){}return e.throwInternal=function(e,t,i,o,a){void 0===a&&(a=!1);var s=new r(t,i,a,o);if(this.enableDebugExceptions())throw s;if(void 0!==s&&s&&void 0!==s.message){if(a){var l=n._InternalMessageId[s.messageId];this._messageLogged[l]&&!this.verboseLogging()||(this.warnToConsole(s.message),this._messageLogged[l]=!0)}else this.verboseLogging()&&this.warnToConsole(s.message);this.logInternalMessage(e,s)}},e.warnToConsole=function(e){\"undefined\"!=typeof console&&console&&(\"function\"==typeof console.warn?console.warn(e):\"function\"==typeof console.log&&console.log(e))},e.resetInternalMessageCount=function(){this._messageCount=0,this._messageLogged={}},e.clearInternalMessageLoggedTypes=function(){if(i.Util.canUseSessionStorage())for(var t=i.Util.getSessionStorageKeys(),n=0;n<t.length;n++)0===t[n].indexOf(e.AIInternalMessagePrefix)&&i.Util.removeSessionStorage(t[n])},e.setMaxInternalMessageLimit=function(e){if(!e)throw new Error(\"limit cannot be undefined.\");this.MAX_INTERNAL_MESSAGE_LIMIT=e},e.logInternalMessage=function(t,o){if(!this._areInternalMessagesThrottled()){var a=!0,s=e.AIInternalMessagePrefix+n._InternalMessageId[o.messageId];if(i.Util.canUseSessionStorage())i.Util.getSessionStorage(s)?a=!1:i.Util.setSessionStorage(s,\"1\");else this._messageLogged[s]?a=!1:this._messageLogged[s]=!0;if(a&&((this.verboseLogging()||t===n.LoggingSeverity.CRITICAL)&&(this.queue.push(o),this._messageCount++),this._messageCount==this.MAX_INTERNAL_MESSAGE_LIMIT)){var l=\"Internal events throttle limit per PageView reached for this app.\",c=new r(n._InternalMessageId.MessageLimitPerPVExceeded,l,!1);this.queue.push(c),this.warnToConsole(l)}}},e._areInternalMessagesThrottled=function(){return this._messageCount>=this.MAX_INTERNAL_MESSAGE_LIMIT},e.AIInternalMessagePrefix=\"AITR_\",e.enableDebugExceptions=function(){return!1},e.verboseLogging=function(){return!1},e.queue=[],e.MAX_INTERNAL_MESSAGE_LIMIT=25,e._messageCount=0,e._messageLogged={},e}();t._InternalLogging=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(11)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.EventData);t.PageViewData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.requestContextHeader=\"Request-Context\",e.requestContextTargetKey=\"appId\",e.requestContextAppIdFormat=\"appId=cid-v1:\",e.requestIdHeader=\"Request-Id\",e.sdkContextHeader=\"Sdk-Context\",e.sdkContextHeaderAppIdRequest=\"appId\",e.requestContextHeaderLowerCase=\"request-context\",e}();t.RequestHeaders=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(10)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){return e.call(this)||this}return o(t,e),t}(n.Base);t.Data=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Base=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.EventData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MinChannelPriorty=100}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventsDiscardedReason={Unknown:0,NonRetryableStatus:1,InvalidEvent:2,SizeLimitExceeded:3,KillSwitch:4,QueueFull:5}}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.isNullOrUndefined=function(e){return null===e||void 0===e},e}();t.CoreUtils=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){this.listeners=[]}return e.prototype.addNotificationListener=function(e){this.listeners.push(e)},e.prototype.removeNotificationListener=function(e){for(var t=this.listeners.indexOf(e);t>-1;)this.listeners.splice(t,1),t=this.listeners.indexOf(e)},e.prototype.eventsSent=function(e){for(var t=this,n=function(n){i.listeners[n].eventsSent&&setTimeout(function(){return t.listeners[n].eventsSent(e)},0)},i=this,r=0;r<this.listeners.length;++r)n(r)},e.prototype.eventsDiscarded=function(e,t){for(var n=this,i=function(i){r.listeners[i].eventsDiscarded&&setTimeout(function(){return n.listeners[i].eventsDiscarded(e,t)},0)},r=this,o=0;o<this.listeners.length;++o)i(o)},e}();t.NotificationManager=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(45)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Sender=n.Sender}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(18)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ApplicationInsights=n.ApplicationInsights}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(56),n(4),n(57),n(69)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(){function e(){this._trackAjaxAttempts=0,this.identifier=e.defaultIdentifier,this.initialize=this._initialize.bind(this)}return e.prototype.trackPageView=function(e,t){try{this._pageViewManager.trackPageView(e,t),this.config.autoTrackPageVisitTime&&this._pageVisitTimeManager.trackPreviousPageVisit(e.name,e.uri)}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackPVFailed,\"trackPageView failed, page view will not be collected: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}},e.prototype.sendPageViewInternal=function(e,t){var i=a.TelemetryItemCreator.createItem(e,n.PageView.dataType,n.PageView.envelopeType,t);this.context.track(i),this._trackAjaxAttempts=0},e.prototype.sendPageViewPerformanceInternal=function(e){},e.prototype._initialize=function(t,a,s){var l=this;if(r.CoreUtils.isNullOrUndefined(a))throw Error(\"Error initializing\");this._core=a,this._globalconfig={instrumentationKey:t.instrumentationKey,endpointUrl:t.endpointUrl},this.config=t.extensions&&t.extensions[this.identifier]?t.extensions[this.identifier]:{};var c=e.appInsightsDefaultConfig;if(void 0!==c){if(c.extensions&&c.extensions[this.identifier])for(var u in c.extensions[this.identifier])void 0===this.config[u]&&(this.config[u]=c[u]);if(this._globalconfig)for(var u in c)void 0===this._globalconfig[u]&&(this._globalconfig[u]=c[u])}n._InternalLogging.verboseLogging=function(){return l.config.verboseLogging},n._InternalLogging.enableDebugExceptions=function(){return l.config.enableDebug},this.config.isCookieUseDisabled&&n.Util.disableCookies(),this.config.isStorageUseDisabled&&n.Util.disableStorage();var p={instrumentationKey:function(){return t.instrumentationKey},accountId:function(){return l.config.accountId},sessionRenewalMs:function(){return l.config.sessionRenewalMs},sessionExpirationMs:function(){return l.config.sessionExpirationMs},sampleRate:function(){return l.config.samplingPercentage},cookieDomain:function(){return l.config.cookieDomain},sdkExtension:function(){return l.config.sdkExtension},isBrowserLinkTrackingEnabled:function(){return l.config.isBrowserLinkTrackingEnabled},appId:function(){return l.config.appId}};this.context=new o.TelemetryContext(p,this._core),this._pageViewManager=new i.PageViewManager(this,this.config.overridePageViewDuration,this._core)},e.defaultIdentifier=\"ApplicationInsightsAnalytics\",e.Version=\"0.0.1\",e}();t.ApplicationInsights=s;!function(){function e(e){this._name=e,this._events={}}e.prototype.start=function(e){void 0!==this._events[e]&&n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.StartCalledMoreThanOnce,\"start was called more than once for this event without calling stop.\",{name:this._name,key:e},!0),this._events[e]=+new Date},e.prototype.stop=function(e,t,i,r){var o=this._events[e];if(isNaN(o))n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.StopCalledWithoutStart,\"stop was called without a corresponding start.\",{name:this._name,key:e},!0);else{var a=+new Date,s=n.PageViewPerformance.getDuration(o,a);this.action(e,t,s,i,r)}delete this._events[e],this._events[e]=void 0}}()}.apply(t,i))||(e.exports=r)},function(e,t,n){e.exports=n(20)},function(e,t,n){var i,r;i=[n,t,n(0),n(4),n(16),n(17),n(70)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});try{if(\"undefined\"!=typeof window&&\"undefined\"!=typeof JSON){if(void 0===window.appinsightsvnext)o.ApplicationInsights.appInsightsDefaultConfig=a.Initialization.getDefaultConfig();else{var s=window.appinsightsvnext||{},l=new a.Initialization(s),c=l.loadAppInsights();for(var u in c)s[u]=c[u];l.emptyQueue(),l.addHousekeepingBeforeUnload(c)}}if(\"undefined\"!=typeof window&&\"undefined\"!=typeof JSON){var p=new i.AppInsightsCore,d=[],f=new r.Sender,g=new o.ApplicationInsights;d.push(f),d.push(g),p.initialize({instrumentationKey:\"8e68dc94-34d1-4894-8697-be2ba6282b5b\"},d);var h={name:document.title?document.title:\"test page\",uri:document.URL?document.URL:\"\"};g.trackPageView(h)}}catch(e){n._InternalLogging.warnToConsole(\"Failed to initialize AppInsights JS SDK: \"+e.message)}}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(22),n(23),n(24),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a,s,l){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var c=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.aiDataContract={ver:s.FieldType.Required,exceptions:s.FieldType.Required,severityLevel:s.FieldType.Default,properties:s.FieldType.Default,measurements:s.FieldType.Default},o.properties=a.DataSanitizer.sanitizeProperties(n),o.measurements=a.DataSanitizer.sanitizeMeasurements(i),o.exceptions=[new u(t)],r&&(o.severityLevel=r),o}return o(t,e),t.CreateSimpleException=function(e,t,n,i,r,o){return{exceptions:[{hasFullStack:!0,message:e,stack:r,typeName:t}]}},t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Exception\",t.dataType=\"ExceptionData\",t}(i.ExceptionData);t.Exception=c;var u=function(e){function t(t){var n=e.call(this)||this;n.aiDataContract={id:s.FieldType.Default,outerId:s.FieldType.Default,typeName:s.FieldType.Required,message:s.FieldType.Required,hasFullStack:s.FieldType.Default,stack:s.FieldType.Default,parsedStack:s.FieldType.Array},n.typeName=a.DataSanitizer.sanitizeString(t.name)||l.Util.NotSpecified,n.message=a.DataSanitizer.sanitizeMessage(t.message)||l.Util.NotSpecified;var i=t.stack;return n.parsedStack=n.parseStack(i),n.stack=a.DataSanitizer.sanitizeException(i),n.hasFullStack=l.Util.isArray(n.parsedStack)&&n.parsedStack.length>0,n}return o(t,e),t.prototype.parseStack=function(e){var t=void 0;if(\"string\"==typeof e){var n=e.split(\"\\n\");t=[];for(var i=0,r=0,o=0;o<=n.length;o++){var a=n[o];if(p.regex.test(a)){var s=new p(n[o],i++);r+=s.sizeInBytes,t.push(s)}}if(r>32768)for(var l=0,c=t.length-1,u=0,d=l,f=c;l<c;){if((u+=t[l].sizeInBytes+t[c].sizeInBytes)>32768){var g=f-d+1;t.splice(d,g);break}d=l,f=c,l++,c--}}return t},t}(r.ExceptionDetails),p=function(e){function t(n,i){var r=e.call(this)||this;r.sizeInBytes=0,r.aiDataContract={level:s.FieldType.Required,method:s.FieldType.Required,assembly:s.FieldType.Default,fileName:s.FieldType.Default,line:s.FieldType.Default},r.level=i,r.method=\"<no_method>\",r.assembly=l.Util.trim(n);var o=n.match(t.regex);return o&&o.length>=5&&(r.method=l.Util.trim(o[2])||r.method,r.fileName=l.Util.trim(o[4]),r.line=parseInt(o[5])||0),r.sizeInBytes+=r.method.length,r.sizeInBytes+=r.fileName.length,r.sizeInBytes+=r.assembly.length,r.sizeInBytes+=t.baseSize,r.sizeInBytes+=r.level.toString().length,r.sizeInBytes+=r.line.toString().length,r}return o(t,e),t.regex=/^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/,t.baseSize=58,t}(n.StackFrame);t._StackFrame=p}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.StackFrame=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.exceptions=[],t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.ExceptionData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.hasFullStack=!0,this.parsedStack=[]}}();t.ExceptionDetails=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.DisabledPropertyName=\"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\"}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(27),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n){var o=e.call(this)||this;return o.name=i.DataSanitizer.sanitizeString(n)||a.Util.NotSpecified,o.data=t,o.time=a.Util.toISOStringForIE8(new Date),o.aiDataContract={time:r.FieldType.Required,iKey:r.FieldType.Required,name:r.FieldType.Required,sampleRate:function(){return 100==o.sampleRate?r.FieldType.Hidden:r.FieldType.Required},tags:r.FieldType.Required,data:r.FieldType.Required},o}return o(t,e),t}(n.Envelope);t.Envelope=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.ver=1,this.sampleRate=100,this.tags={}}}();t.Envelope=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(11),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o){var s=e.call(this)||this;return s.aiDataContract={ver:r.FieldType.Required,name:r.FieldType.Required,properties:r.FieldType.Default,measurements:r.FieldType.Default},s.name=i.DataSanitizer.sanitizeString(t)||a.Util.NotSpecified,s.properties=i.DataSanitizer.sanitizeProperties(n),s.measurements=i.DataSanitizer.sanitizeMeasurements(o),s}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Event\",t.dataType=\"EventData\",t}(n.EventData);t.Event=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(30),n(3),n(1),n(31),n(2)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(t,n,o,l,c,u){var p=e.call(this)||this;p.aiDataContract={ver:r.FieldType.Required,metrics:r.FieldType.Required,properties:r.FieldType.Default};var d=new a.DataPoint;return d.count=o>0?o:void 0,d.max=isNaN(c)||null===c?void 0:c,d.min=isNaN(l)||null===l?void 0:l,d.name=i.DataSanitizer.sanitizeString(t)||s.Util.NotSpecified,d.value=n,p.metrics=[d],p.properties=i.DataSanitizer.sanitizeProperties(u),p}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Metric\",t.dataType=\"MetricData\",t}(n.MetricData);t.Metric=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.metrics=[],t.properties={},t}return o(t,e),t}(n.Domain);t.MetricData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(32),n(1)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.aiDataContract={name:i.FieldType.Required,kind:i.FieldType.Default,value:i.FieldType.Required,count:i.FieldType.Default,min:i.FieldType.Default,max:i.FieldType.Default,stdDev:i.FieldType.Default},t}return o(t,e),t}(n.DataPoint);t.DataPoint=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(33)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(){this.kind=n.DataPointType.Measurement}}();t.DataPoint=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.Measurement=0]=\"Measurement\",e[e.Aggregation=1]=\"Aggregation\"}(t.DataPointType||(t.DataPointType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(7),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o,s,l,c){var u=e.call(this)||this;return u.aiDataContract={ver:r.FieldType.Required,name:r.FieldType.Default,url:r.FieldType.Default,duration:r.FieldType.Default,properties:r.FieldType.Default,measurements:r.FieldType.Default,id:r.FieldType.Default},u.id=i.DataSanitizer.sanitizeId(c),u.url=i.DataSanitizer.sanitizeUrl(n),u.name=i.DataSanitizer.sanitizeString(t)||a.Util.NotSpecified,isNaN(o)||(u.duration=a.Util.msToTimeSpan(o)),u.properties=i.DataSanitizer.sanitizeProperties(s),u.measurements=i.DataSanitizer.sanitizeMeasurements(l),u}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Pageview\",t.dataType=\"PageviewData\",t}(n.PageViewData);t.PageView=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(3),n(1),n(2),n(2),n(36)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(t,o,s,l,c,u,p,d,f){var g=e.call(this)||this;g.aiDataContract={id:i.FieldType.Required,ver:i.FieldType.Required,name:i.FieldType.Default,resultCode:i.FieldType.Default,duration:i.FieldType.Default,success:i.FieldType.Default,data:i.FieldType.Default,target:i.FieldType.Default,type:i.FieldType.Default,properties:i.FieldType.Default,measurements:i.FieldType.Default,kind:i.FieldType.Default,value:i.FieldType.Default,count:i.FieldType.Default,min:i.FieldType.Default,max:i.FieldType.Default,stdDev:i.FieldType.Default,dependencyKind:i.FieldType.Default,dependencySource:i.FieldType.Default,commandName:i.FieldType.Default,dependencyTypeName:i.FieldType.Default},g.id=t,g.duration=r.Util.msToTimeSpan(l),g.success=c,g.resultCode=u+\"\",g.type=\"Ajax\",g.data=n.DataSanitizer.sanitizeUrl(s);var h=a.AjaxHelper.ParseDependencyPath(o,p,s);return g.target=h.target,g.name=h.name,g.properties=n.DataSanitizer.sanitizeProperties(d),g.measurements=n.DataSanitizer.sanitizeMeasurements(f),g}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.RemoteDependency\",t.dataType=\"RemoteDependencyData\",t}(s.RemoteDependencyData);t.RemoteDependencyData=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.success=!0,t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.RemoteDependencyData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(38),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o){var s=e.call(this)||this;return s.aiDataContract={ver:r.FieldType.Required,message:r.FieldType.Required,severityLevel:r.FieldType.Default,properties:r.FieldType.Default},t=t||a.Util.NotSpecified,s.message=i.DataSanitizer.sanitizeMessage(t),s.properties=i.DataSanitizer.sanitizeProperties(n),o&&(s.severityLevel=o),s}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Message\",t.dataType=\"MessageData\",t}(n.MessageData);t.Trace=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t}return o(t,e),t}(n.Domain);t.MessageData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(40),n(1),n(3),n(2),n(6)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(n,o,l,c,u){var p=e.call(this)||this;p.aiDataContract={ver:i.FieldType.Required,name:i.FieldType.Default,url:i.FieldType.Default,duration:i.FieldType.Default,perfTotal:i.FieldType.Default,networkConnect:i.FieldType.Default,sentRequest:i.FieldType.Default,receivedResponse:i.FieldType.Default,domProcessing:i.FieldType.Default,properties:i.FieldType.Default,measurements:i.FieldType.Default},p.isValid=!1;var d=t.getPerformanceTiming();if(d){var f=t.getDuration(d.navigationStart,d.loadEventEnd),g=t.getDuration(d.navigationStart,d.connectEnd),h=t.getDuration(d.requestStart,d.responseStart),v=t.getDuration(d.responseStart,d.responseEnd),y=t.getDuration(d.responseEnd,d.loadEventEnd);0==f?s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.ErrorPVCalc,\"error calculating page view performance.\",{total:f,network:g,request:h,response:v,dom:y}):t.shouldCollectDuration(f,g,h,v,y)?f<Math.floor(g)+Math.floor(h)+Math.floor(v)+Math.floor(y)?s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.ClientPerformanceMathError,\"client performance math error.\",{total:f,network:g,request:h,response:v,dom:y}):(p.durationMs=f,p.perfTotal=p.duration=a.Util.msToTimeSpan(f),p.networkConnect=a.Util.msToTimeSpan(g),p.sentRequest=a.Util.msToTimeSpan(h),p.receivedResponse=a.Util.msToTimeSpan(v),p.domProcessing=a.Util.msToTimeSpan(y),p.isValid=!0):s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.InvalidDurationValue,\"Invalid page load duration value. Browser perf data won't be sent.\",{total:f,network:g,request:h,response:v,dom:y})}return p.url=r.DataSanitizer.sanitizeUrl(o),p.name=r.DataSanitizer.sanitizeString(n)||a.Util.NotSpecified,p.properties=r.DataSanitizer.sanitizeProperties(c),p.measurements=r.DataSanitizer.sanitizeMeasurements(u),p}return o(t,e),t.prototype.getIsValid=function(){return this.isValid},t.prototype.getDurationMs=function(){return this.durationMs},t.getPerformanceTiming=function(){return t.isPerformanceTimingSupported()?window.performance.timing:null},t.isPerformanceTimingSupported=function(){return!1},t.isPerformanceTimingDataReady=function(){var e=window.performance.timing;return e.domainLookupStart>0&&e.navigationStart>0&&e.responseStart>0&&e.requestStart>0&&e.loadEventEnd>0&&e.responseEnd>0&&e.connectEnd>0&&e.domLoading>0},t.getDuration=function(e,t){var n=void 0;return isNaN(e)||isNaN(t)||(n=Math.max(t-e,0)),n},t.shouldCollectDuration=function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var i=[\"googlebot\",\"adsbot-google\",\"apis-google\",\"mediapartners-google\"],r=navigator.userAgent,o=!1;if(r)for(var a=0;a<i.length;a++)o=o||-1!==r.toLowerCase().indexOf(i[a]);if(o)return!1;for(var s=0;s<e.length;s++)if(e[s]>=t.MAX_DURATION_ALLOWED)return!1;return!0},t.envelopeType=\"Microsoft.ApplicationInsights.{0}.PageviewPerformance\",t.dataType=\"PageviewPerformanceData\",t.MAX_DURATION_ALLOWED=36e5,t}(n.PageViewPerfData);t.PageViewPerformance=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(7)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.PageViewData);t.PageViewPerfData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(9),n(1)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(e){function t(t,n){var r=e.call(this)||this;return r.aiDataContract={baseType:i.FieldType.Required,baseData:i.FieldType.Required},r.baseType=t,r.baseData=n,r}return o(t,e),t}(n.Data);t.Data=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.Verbose=0]=\"Verbose\",e[e.Information=1]=\"Information\",e[e.Warning=2]=\"Warning\",e[e.Error=3]=\"Error\",e[e.Critical=4]=\"Critical\"}(t.SeverityLevel||(t.SeverityLevel={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.applicationVersion=\"ai.application.ver\",this.applicationBuild=\"ai.application.build\",this.applicationTypeId=\"ai.application.typeId\",this.applicationId=\"ai.application.applicationId\",this.applicationLayer=\"ai.application.layer\",this.deviceId=\"ai.device.id\",this.deviceIp=\"ai.device.ip\",this.deviceLanguage=\"ai.device.language\",this.deviceLocale=\"ai.device.locale\",this.deviceModel=\"ai.device.model\",this.deviceFriendlyName=\"ai.device.friendlyName\",this.deviceNetwork=\"ai.device.network\",this.deviceNetworkName=\"ai.device.networkName\",this.deviceOEMName=\"ai.device.oemName\",this.deviceOS=\"ai.device.os\",this.deviceOSVersion=\"ai.device.osVersion\",this.deviceRoleInstance=\"ai.device.roleInstance\",this.deviceRoleName=\"ai.device.roleName\",this.deviceScreenResolution=\"ai.device.screenResolution\",this.deviceType=\"ai.device.type\",this.deviceMachineName=\"ai.device.machineName\",this.deviceVMName=\"ai.device.vmName\",this.deviceBrowser=\"ai.device.browser\",this.deviceBrowserVersion=\"ai.device.browserVersion\",this.locationIp=\"ai.location.ip\",this.locationCountry=\"ai.location.country\",this.locationProvince=\"ai.location.province\",this.locationCity=\"ai.location.city\",this.operationId=\"ai.operation.id\",this.operationName=\"ai.operation.name\",this.operationParentId=\"ai.operation.parentId\",this.operationRootId=\"ai.operation.rootId\",this.operationSyntheticSource=\"ai.operation.syntheticSource\",this.operationCorrelationVector=\"ai.operation.correlationVector\",this.sessionId=\"ai.session.id\",this.sessionIsFirst=\"ai.session.isFirst\",this.sessionIsNew=\"ai.session.isNew\",this.userAccountAcquisitionDate=\"ai.user.accountAcquisitionDate\",this.userAccountId=\"ai.user.accountId\",this.userAgent=\"ai.user.userAgent\",this.userId=\"ai.user.id\",this.userStoreRegion=\"ai.user.storeRegion\",this.userAuthUserId=\"ai.user.authUserId\",this.userAnonymousUserAcquisitionDate=\"ai.user.anonUserAcquisitionDate\",this.userAuthenticatedUserAcquisitionDate=\"ai.user.authUserAcquisitionDate\",this.cloudName=\"ai.cloud.name\",this.cloudRole=\"ai.cloud.role\",this.cloudRoleVer=\"ai.cloud.roleVer\",this.cloudRoleInstance=\"ai.cloud.roleInstance\",this.cloudEnvironment=\"ai.cloud.environment\",this.cloudLocation=\"ai.cloud.location\",this.cloudDeploymentUnit=\"ai.cloud.deploymentUnit\",this.internalSdkVersion=\"ai.internal.sdkVersion\",this.internalAgentVersion=\"ai.internal.agentVersion\",this.internalNodeName=\"ai.internal.nodeName\"}}();t.ContextTagKeys=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(12),n(13),n(14),n(15)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(){this._extensions=new Array}return e.prototype.initialize=function(e,t){var n=this;if(!t||0===t.length)throw Error(\"At least one extension channel is required\");if(!e||r.CoreUtils.isNullOrUndefined(e.instrumentationKey))throw Error(\"Please provide instrumentation key\");this.config=e,this._notificationManager=new o.NotificationManager,this.config.extensions=this.config.extensions?this.config.extensions:{},this.config.extensions.NotificationManager=this._notificationManager,t.forEach(function(e){if(r.CoreUtils.isNullOrUndefined(e.initialize))throw Error(\"Extensions must provide callback to initialize\")}),this._extensions=t.sort(function(e,t){var n=e,i=t,r=typeof n.processTelemetry,o=typeof i.processTelemetry;return\"function\"===r&&\"function\"===o?n.priority>i.priority?1:-1:\"function\"===r&&\"function\"!==o?1:\"function\"!==r&&\"function\"===o?-1:void 0});for(var i=0;i<this._extensions.length-1;i++)this._extensions[i]&&\"function\"!=typeof this._extensions[i].processTelemetry||this._extensions[i].setNextPlugin(this._extensions[i+1]);this._extensions.forEach(function(e){return e.initialize(n.config,n,n._extensions)})},e.prototype.getTransmissionControl=function(){for(var e=0;e<this._extensions.length;e++){var t=this._extensions[e].priority;if(!r.CoreUtils.isNullOrUndefined(t)&&t>=n.MinChannelPriorty)return this._extensions[e]}throw new Error(\"No channel extension found\")},e.prototype.track=function(e){if(null===e)throw this._notifiyInvalidEvent(e),Error(\"Invalid telemetry item\");if(e.baseData&&!e.baseType)throw this._notifiyInvalidEvent(e),Error(\"Provide data.baseType for data.baseData\");this._validateTelmetryItem(e),e.instrumentationKey||(e.instrumentationKey=this.config.instrumentationKey);for(var t=0;t<this._extensions.length;){if(this._extensions[t].processTelemetry){this._extensions[t].processTelemetry(e);break}t++}},e.prototype.addNotificationListener=function(e){this._notificationManager.addNotificationListener(e)},e.prototype.removeNotificationListener=function(e){this._notificationManager.removeNotificationListener(e)},e.prototype._validateTelmetryItem=function(e){if(r.CoreUtils.isNullOrUndefined(e.name))throw this._notifiyInvalidEvent(e),Error(\"telemetry name required\");if(r.CoreUtils.isNullOrUndefined(e.timestamp))throw this._notifiyInvalidEvent(e),Error(\"telemetry timestamp required\");if(r.CoreUtils.isNullOrUndefined(e.instrumentationKey))throw this._notifiyInvalidEvent(e),Error(\"telemetry instrumentationKey required\")},e.prototype._notifiyInvalidEvent=function(e){this._notificationManager.eventsDiscarded([e],i.EventsDiscardedReason.InvalidEvent)},e}();t.AppInsightsCore=a}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(47),n(48),n(49),n(50),n(51),n(46),n(52),n(53),n(54),n(55),n(0),n(4)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p,d,f){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var g=function(){function e(){this.priority=200,this._XMLHttpRequestSupported=!1}return e.prototype.pause=function(){throw new Error(\"Method not implemented.\")},e.prototype.resume=function(){throw new Error(\"Method not implemented.\")},e.prototype.flush=function(){try{this.triggerSend()}catch(e){d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.FlushFailed,\"flush failed, telemetry will not be collected: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}},e.prototype.teardown=function(){throw new Error(\"Method not implemented.\")},e.prototype.initialize=function(t){(this.identifier=\"AppInsightsChannelPlugin\",this._consecutiveErrors=0,this._retryAt=null,this._lastSend=0,this._config=e._getDefaultAppInsightsChannelConfig(t,this.identifier),this._sender=null,this._buffer=d.Util.canUseSessionStorage()&&this._config.enableSessionStorageBuffer?new n.SessionStorageSendBuffer(this._config):new n.ArraySendBuffer(this._config),!this._config.isBeaconApiDisabled()&&d.Util.IsBeaconApiSupported())?this._sender=this._beaconSender:\"undefined\"!=typeof XMLHttpRequest&&(\"withCredentials\"in new XMLHttpRequest?(this._sender=this._xhrSender,this._XMLHttpRequestSupported=!0):\"undefined\"!=typeof XDomainRequest&&(this._sender=this._xdrSender))},e.prototype.processTelemetry=function(t){try{if(this._config.disableTelemetry())return;if(!t)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.CannotSendEmptyTelemetry,\"Cannot send empty telemetry\");if(!this._sender)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.SenderNotInitialized,\"Sender was not initialized\");if(!e._validate(t))return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TelemetryEnvelopeInvalid,\"Invalid telemetry envelope\");var n=e._constructEnvelope(t);if(!n)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.CreateEnvelopeError,\"Unable to create an AppInsights envelope\");var i=p.Serializer.serialize(n),r=this._buffer.getItems(),o=this._buffer.batchPayloads(r);o&&o.length+i.length>this._config.maxBatchSizeInBytes()&&this.triggerSend(),this._buffer.enqueue(i),this._setupTimer()}catch(e){d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.FailedAddingTelemetryToBuffer,\"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}f.CoreUtils.isNullOrUndefined(this._nextPlugin)||this._nextPlugin.processTelemetry(t)},e.prototype.setNextPlugin=function(e){this._nextPlugin=e},e.prototype._xhrReadyStateChange=function(e,t,n){if(4===e.readyState){var i=null;this._appId||(i=this._parseResponse(e.responseText||e.response))&&i.appId&&(this._appId=i.appId),(e.status<200||e.status>=300)&&0!==e.status?!this._config.isRetryDisabled()&&this._isRetriable(e.status)?(this._resendPayload(t),d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\". Response code \"+e.status+\". Will retry to send \"+t.length+\" items.\")):this._onError(t,this._formatErrorMessageXhr(e)):206===e.status?(i||(i=this._parseResponse(e.responseText||e.response)),i&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,i):this._onError(t,this._formatErrorMessageXhr(e))):(this._consecutiveErrors=0,this._onSuccess(t,n))}},e.prototype.triggerSend=function(e){void 0===e&&(e=!0);try{if(this._config.disableTelemetry())this._buffer.clear();else{if(this._buffer.count()>0){var t=this._buffer.getItems();this._sender(t,e)}this._lastSend=+new Date}clearTimeout(this._timeoutHandle),this._timeoutHandle=null,this._retryAt=null}catch(e){(!d.Util.getIEVersion()||d.Util.getIEVersion()>9)&&d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TransmissionFailed,\"Telemetry transmission failed, some telemetry will be lost: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}},e.prototype._onError=function(e,t,n){d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.OnError,\"Failed to send telemetry.\",{message:t}),this._buffer.clearSent(e)},e.prototype._onPartialSuccess=function(e,t){for(var n=[],i=[],r=0,o=t.errors.reverse();r<o.length;r++){var a=o[r],s=e.splice(a.index,1)[0];this._isRetriable(a.statusCode)?i.push(s):n.push(s)}e.length>0&&this._onSuccess(e,t.itemsAccepted),n.length>0&&this._onError(n,this._formatErrorMessageXhr(null,[\"partial success\",t.itemsAccepted,\"of\",t.itemsReceived].join(\" \"))),i.length>0&&(this._resendPayload(i),d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\"Partial success. Delivered: \"+e.length+\", Failed: \"+n.length+\". Will retry to send \"+i.length+\" our of \"+t.itemsReceived+\" items\"))},e.prototype._onSuccess=function(e,t){this._buffer.clearSent(e)},e.prototype._xdrOnLoad=function(e,t){if(!e||e.responseText+\"\"!=\"200\"&&\"\"!==e.responseText){var n=this._parseResponse(e.responseText);n&&n.itemsReceived&&n.itemsReceived>n.itemsAccepted&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,n):this._onError(t,this._formatErrorMessageXdr(e))}else this._consecutiveErrors=0,this._onSuccess(t,0)},e._constructEnvelope=function(e){switch(e.baseType){case d.Event.dataType:return i.EventEnvelopeCreator.EventEnvelopeCreator.Create(e);case d.Trace.dataType:return i.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(e);case d.PageView.dataType:return i.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(e);case d.PageViewPerformance.dataType:return i.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(e);case d.Exception.dataType:return i.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(e);case d.Metric.dataType:return i.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(e);case d.RemoteDependencyData.dataType:return i.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(e);default:return null}},e._getDefaultAppInsightsChannelConfig=function(e,t){var n={},i=e.extensions&&e.extensions[t]?e.extensions[t]:{};return n.endpointUrl=function(){return e.endpointUrl||\"https://dc.services.visualstudio.com/v2/track\"},n.emitLineDelimitedJson=function(){return d.Util.stringToBoolOrDefault(i.emitLineDelimitedJson)},n.maxBatchInterval=function(){return isNaN(i.maxBatchInterval)?15e3:i.maxBatchInterval},n.maxBatchSizeInBytes=function(){return i.maxBatchSizeInBytes>0?i.maxBatchSizeInBytes:102400},n.disableTelemetry=function(){return d.Util.stringToBoolOrDefault(i.disableTelemetry)},n.enableSessionStorageBuffer=function(){return d.Util.stringToBoolOrDefault(i.enableSessionStorageBuffer,!0)},n.isRetryDisabled=function(){return d.Util.stringToBoolOrDefault(i.isRetryDisabled)},n.isBeaconApiDisabled=function(){return d.Util.stringToBoolOrDefault(i.isBeaconApiDisabled,!0)},n},e._validate=function(e){switch(e.baseType){case d.Event.dataType:return r.EventValidator.EventValidator.Validate(e);case d.Trace.dataType:return o.TraceValidator.TraceValidator.Validate(e);case d.Exception.dataType:return a.ExceptionValidator.ExceptionValidator.Validate(e);case d.Metric.dataType:return s.MetricValidator.MetricValidator.Validate(e);case d.PageView.dataType:return c.PageViewValidator.PageViewValidator.Validate(e);case d.PageViewPerformance.dataType:return l.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(e);case d.RemoteDependencyData.dataType:return u.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(e)}return!1},e.prototype._beaconSender=function(e,t){var n=this._config.endpointUrl(),i=this._buffer.batchPayloads(e),r=new Blob([i],{type:\"text/plain;charset=UTF-8\"});navigator.sendBeacon(n,r)?this._buffer.markAsSent(e):d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TransmissionFailed,\". Failed to send telemetry with Beacon API.\")},e.prototype._xhrSender=function(e,t){var n=this,i=new XMLHttpRequest;i[d.DisabledPropertyName]=!0,i.open(\"POST\",this._config.endpointUrl(),t),i.setRequestHeader(\"Content-type\",\"application/json\"),d.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())&&i.setRequestHeader(d.RequestHeaders.sdkContextHeader,d.RequestHeaders.sdkContextHeaderAppIdRequest),i.onreadystatechange=function(){return n._xhrReadyStateChange(i,e,e.length)},i.onerror=function(t){return n._onError(e,n._formatErrorMessageXhr(i),t)};var r=this._buffer.batchPayloads(e);i.send(r),this._buffer.markAsSent(e)},e.prototype._parseResponse=function(e){try{if(e&&\"\"!==e){var t=JSON.parse(e);if(t&&t.itemsReceived&&t.itemsReceived>=t.itemsAccepted&&t.itemsReceived-t.itemsAccepted==t.errors.length)return t}}catch(t){d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.InvalidBackendResponse,\"Cannot parse the response. \"+d.Util.getExceptionName(t),{response:e})}return null},e.prototype._resendPayload=function(e){if(e&&0!==e.length){this._buffer.clearSent(e),this._consecutiveErrors++;for(var t=0,n=e;t<n.length;t++){var i=n[t];this._buffer.enqueue(i)}this._setRetryTime(),this._setupTimer()}},e.prototype._setRetryTime=function(){var e;if(this._consecutiveErrors<=1)e=10;else{var t=(Math.pow(2,this._consecutiveErrors)-1)/2,n=Math.floor(Math.random()*t*10)+1;e=Math.max(Math.min(n,3600),10)}var i=Date.now()+1e3*e;this._retryAt=i},e.prototype._setupTimer=function(){var e=this;if(!this._timeoutHandle){var t=this._retryAt?Math.max(0,this._retryAt-Date.now()):0,n=Math.max(this._config.maxBatchInterval(),t);this._timeoutHandle=setTimeout(function(){e.triggerSend()},n)}},e.prototype._isRetriable=function(e){return 408==e||429==e||500==e||503==e},e.prototype._formatErrorMessageXhr=function(e,t){return e?\"XMLHttpRequest,Status:\"+e.status+\",Response:\"+e.responseText||e.response||\"\":t},e.prototype._xdrSender=function(e,t){var n=this,i=new XDomainRequest;i.onload=function(){return n._xdrOnLoad(i,e)},i.onerror=function(t){return n._onError(e,n._formatErrorMessageXdr(i),t)};var r=window.location.protocol;if(0!==this._config.endpointUrl().lastIndexOf(r,0))return d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\". Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\"),void this._buffer.clear();var o=this._config.endpointUrl().replace(/^(https?:)/,\"\");i.open(\"POST\",o);var a=this._buffer.batchPayloads(e);i.send(a),this._buffer.markAsSent(e)},e.prototype._formatErrorMessageXdr=function(e,t){return e?\"XDomainRequest,Response:\"+e.responseText||\"\":t},e}();t.Sender=g}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!1},e.MetricValidator=new e,e}();t.MetricValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(e){this._config=e,this._buffer=[]}return e.prototype.enqueue=function(e){this._buffer.push(e)},e.prototype.count=function(){return this._buffer.length},e.prototype.clear=function(){this._buffer.length=0},e.prototype.getItems=function(){return this._buffer.slice(0)},e.prototype.batchPayloads=function(e){return e&&e.length>0?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},e.prototype.markAsSent=function(e){this.clear()},e.prototype.clearSent=function(e){},e}();t.ArraySendBuffer=i;var r=function(){function e(t){this._bufferFullMessageSent=!1,this._config=t;var n=this.getBuffer(e.BUFFER_KEY),i=this.getBuffer(e.SENT_BUFFER_KEY);this._buffer=n.concat(i),this._buffer.length>e.MAX_BUFFER_SIZE&&(this._buffer.length=e.MAX_BUFFER_SIZE),this.setBuffer(e.SENT_BUFFER_KEY,[]),this.setBuffer(e.BUFFER_KEY,this._buffer)}return e.prototype.enqueue=function(t){this._buffer.length>=e.MAX_BUFFER_SIZE?this._bufferFullMessageSent||(n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SessionStorageBufferFull,\"Maximum buffer size reached: \"+this._buffer.length,!0),this._bufferFullMessageSent=!0):(this._buffer.push(t),this.setBuffer(e.BUFFER_KEY,this._buffer))},e.prototype.count=function(){return this._buffer.length},e.prototype.clear=function(){this._buffer.length=0,this.setBuffer(e.BUFFER_KEY,[]),this.setBuffer(e.SENT_BUFFER_KEY,[]),this._bufferFullMessageSent=!1},e.prototype.getItems=function(){return this._buffer.slice(0)},e.prototype.batchPayloads=function(e){return e&&e.length>0?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},e.prototype.markAsSent=function(t){this._buffer=this.removePayloadsFromBuffer(t,this._buffer),this.setBuffer(e.BUFFER_KEY,this._buffer);var i=this.getBuffer(e.SENT_BUFFER_KEY);i instanceof Array&&t instanceof Array&&((i=i.concat(t)).length>e.MAX_BUFFER_SIZE&&(n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.SessionStorageBufferFull,\"Sent buffer reached its maximum size: \"+i.length,!0),i.length=e.MAX_BUFFER_SIZE),this.setBuffer(e.SENT_BUFFER_KEY,i))},e.prototype.clearSent=function(t){var n=this.getBuffer(e.SENT_BUFFER_KEY);n=this.removePayloadsFromBuffer(t,n),this.setBuffer(e.SENT_BUFFER_KEY,n)},e.prototype.removePayloadsFromBuffer=function(e,t){var n=[];for(var i in t){var r=!1;for(var o in e)if(e[o]===t[i]){r=!0;break}r||n.push(t[i])}return n},e.prototype.getBuffer=function(e){try{var t=n.Util.getSessionStorage(e);if(t){var i=JSON.parse(t);if(i)return i}}catch(t){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.FailedToRestoreStorageBuffer,\" storage key: \"+e+\", \"+n.Util.getExceptionName(t),{exception:n.Util.dump(t)})}return[]},e.prototype.setBuffer=function(e,t){try{var i=JSON.stringify(t);n.Util.setSessionStorage(e,i)}catch(t){n.Util.setSessionStorage(e,JSON.stringify([])),n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.FailedToSetStorageBuffer,\" storage key: \"+e+\", \"+n.Util.getExceptionName(t)+\". Buffer cleared\",{exception:n.Util.dump(t)})}},e.BUFFER_KEY=\"AI_buffer\",e.SENT_BUFFER_KEY=\"AI_sentBuffer\",e.MAX_BUFFER_SIZE=2e3,e}();t.SessionStorageSendBuffer=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextTagKeys=[\"ai.application.ver\",\"ai.application.build\",\"ai.application.typeId\",\"ai.application.applicationId\",\"ai.application.layer\",\"ai.device.id\",\"ai.device.ip\",\"ai.device.language\",\"ai.device.locale\",\"ai.device.model\",\"ai.device.friendlyName\",\"ai.device.network\",\"ai.device.networkName\",\"ai.device.oemName\",\"ai.device.os\",\"ai.device.osVersion\",\"ai.device.roleInstance\",\"ai.device.roleName\",\"ai.device.screenResolution\",\"ai.device.type\",\"ai.device.machineName\",\"ai.device.vmName\",\"ai.device.browser\",\"ai.device.browserVersion\",\"ai.location.ip\",\"ai.location.country\",\"ai.location.province\",\"ai.location.city\",\"ai.operation.id\",\"ai.operation.name\",\"ai.operation.parentId\",\"ai.operation.rootId\",\"ai.operation.syntheticSource\",\"ai.operation.correlationVector\",\"ai.session.id\",\"ai.session.isFirst\",\"ai.session.isNew\",\"ai.user.accountAcquisitionDate\",\"ai.user.accountId\",\"ai.user.userAgent\",\"ai.user.id\",\"ai.user.storeRegion\",\"ai.user.authUserId\",\"ai.user.anonUserAcquisitionDate\",\"ai.user.authUserAcquisitionDate\",\"ai.cloud.name\",\"ai.cloud.role\",\"ai.cloud.roleVer\",\"ai.cloud.roleInstance\",\"ai.cloud.environment\",\"ai.cloud.location\",\"ai.cloud.deploymentUnit\",\"ai.internal.sdkVersion\",\"ai.internal.agentVersion\",\"ai.internal.nodeName\"];var r=function(){function e(){}return e.extractProperties=function(e){var t=null;for(var n in e)if(e.hasOwnProperty(n)){var i=e[n];\"number\"!=typeof i&&(t||(t={}),t[n]=i)}return t},e.extractPropsAndMeasurements=function(e,t,n){if(!i.CoreUtils.isNullOrUndefined(e))for(var r in e)if(e.hasOwnProperty(r)){var o=e[r];\"number\"==typeof o?n[r]=o:t[r]=o}},e.createEnvelope=function(e,i,r){var o=new n.Envelope(r,e);o.iKey=i.instrumentationKey;var a=i.instrumentationKey.replace(/-/g,\"\");for(var s in o.name=o.name.replace(\"{0}\",a),i.ctx)i.ctx.hasOwnProperty(s)&&t.ContextTagKeys.indexOf(s)>=0&&(o.tags[s]=i.ctx[s]);return i.tags.forEach(function(e){for(var n in e)e.hasOwnProperty(n)&&t.ContextTagKeys.indexOf(n)>=0&&(o.tags[n]=e[n])}),o},e}();t.EnvelopeCreator=r;var a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,o,t);var a=e.baseData.id,s=e.baseData.absoluteUrl,l=e.baseData.command,c=e.baseData.totalTime,u=e.baseData.success,p=e.baseData.resultCode,d=e.baseData.method,f=new n.RemoteDependencyData(a,s,l,c,u,p,d,o,t),g=new n.Data(n.RemoteDependencyData.dataType,f);return r.createEnvelope(n.RemoteDependencyData.envelopeType,e,g)},t.DependencyEnvelopeCreator=new t,t}(r);t.DependencyEnvelopeCreator=a;var s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=new n.Event(a,t,o),l=new n.Data(n.Event.dataType,s);return r.createEnvelope(n.Event.envelopeType,e,l)},t.EventEnvelopeCreator=new t,t}(r);t.EventEnvelopeCreator=s;var l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.exception,s=e.baseData.severityLevel,l=new n.Exception(a,t,o,s),c=new n.Data(n.Exception.dataType,l);return r.createEnvelope(n.Exception.envelopeType,e,c)},t.ExceptionEnvelopeCreator=new t,t}(r);t.ExceptionEnvelopeCreator=l;var c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t=r.extractProperties(e.data),o=e.baseData.name,a=e.baseData.average,s=e.baseData.sampleCount,l=e.baseData.min,c=e.baseData.max,u=new n.Metric(o,a,s,l,c,t),p=new n.Data(n.Metric.dataType,u);return r.createEnvelope(n.Metric.envelopeType,e,p)},t.MetricEnvelopeCreator=new t,t}(r);t.MetricEnvelopeCreator=c;var u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=e.baseData.uri,l=e.baseData.duration;if(i.CoreUtils.isNullOrUndefined(e.baseData.refUri)||(t.refUri=e.baseData.refUri),i.CoreUtils.isNullOrUndefined(e.baseData.pageType)||(t.pageType=e.baseData.pageType),i.CoreUtils.isNullOrUndefined(e.baseData.isLoggedIn)||(t.isLoggedIn=e.baseData.isLoggedIn),!i.CoreUtils.isNullOrUndefined(e.baseData.pageTags)){var c=e.baseData.pageTags;for(var u in c)c.hasOwnProperty(u)&&(t[u]=c[u])}var p=new n.PageView(a,s,l,t,o),d=new n.Data(n.PageView.dataType,p);return r.createEnvelope(n.PageView.envelopeType,e,d)},t.PageViewEnvelopeCreator=new t,t}(r);t.PageViewEnvelopeCreator=u;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=e.baseData.uri,l=e.baseData.duration,c=new n.PageViewPerformance(a,s,l,t,o),u=new n.Data(n.PageViewPerformance.dataType,c);return r.createEnvelope(n.PageViewPerformance.envelopeType,e,u)},t.PageViewPerformanceEnvelopeCreator=new t,t}(r);t.PageViewPerformanceEnvelopeCreator=p;var d=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t=e.baseData.message,o=e.baseData.severityLevel,a=r.extractProperties(e.data),s=new n.Trace(t,a,o),l=new n.Data(n.Trace.dataType,s);return r.createEnvelope(n.Trace.envelopeType,e,l)},t.TraceEnvelopeCreator=new t,t}(r);t.TraceEnvelopeCreator=d}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.EventValidator=new e,e}();t.EventValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.TraceValidator=new e,e}();t.TraceValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e._validateExceptions=function(e){return!0},e.ExceptionValidator=new e,e}();t.ExceptionValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.PageViewPerformanceValidator=new e,e}();t.PageViewPerformanceValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.PageViewValidator=new e,e}();t.PageViewValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.RemoteDepdencyValidator=new e,e}();t.RemoteDepdencyValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(){}return e.serialize=function(t){var n=e._serializeObject(t,\"root\");return JSON.stringify(n)},e._serializeObject=function(t,i){var r={};if(!t)return n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.CannotSerializeObject,\"cannot serialize object because it is null or undefined\",{name:i},!0),r;if(t.__aiCircularRefCheck)return n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CircularReferenceDetected,\"Circular reference detected while serializing object\",{name:i},!0),r;if(!t.aiDataContract){if(\"measurements\"===i)r=e._serializeStringMap(t,\"number\",i);else if(\"properties\"===i)r=e._serializeStringMap(t,\"string\",i);else if(\"tags\"===i)r=e._serializeStringMap(t,\"string\",i);else if(n.Util.isArray(t))r=e._serializeArray(t,i);else{n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CannotSerializeObjectNonSerializable,\"Attempting to serialize an object which does not implement ISerializable\",{name:i},!0);try{JSON.stringify(t),r=t}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.CannotSerializeObject,e&&\"function\"==typeof e.toString?e.toString():\"Error serializing object\",null,!0)}}return r}for(var o in t.__aiCircularRefCheck=!0,t.aiDataContract){var a,s=t.aiDataContract[o],l=\"function\"==typeof s?s()&n.FieldType.Required:s&n.FieldType.Required,c=\"function\"==typeof s?s()&n.FieldType.Hidden:s&n.FieldType.Hidden,u=s&n.FieldType.Array,p=void 0!==t[o],d=\"object\"==typeof t[o]&&null!==t[o];if(!l||p||u){if(!c)void 0!==(a=d?u?e._serializeArray(t[o],o):e._serializeObject(t[o],o):t[o])&&(r[o]=a)}else n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.MissingRequiredFieldSpecification,\"Missing required field specification. The field is required but not present on source\",{field:o,name:i})}return delete t.__aiCircularRefCheck,r},e._serializeArray=function(t,i){var r=void 0;if(t)if(n.Util.isArray(t)){r=[];for(var o=0;o<t.length;o++){var a=t[o],s=e._serializeObject(a,i+\"[\"+o+\"]\");r.push(s)}}else n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.ItemNotInArray,\"This field was specified as an array in the contract but the item is not an array.\\r\\n\",{name:i},!0);return r},e._serializeStringMap=function(e,t,i){var r=void 0;if(e)for(var o in r={},e){var a=e[o];if(\"string\"===t)void 0===a?r[o]=\"undefined\":null===a?r[o]=\"null\":a.toString?r[o]=a.toString():r[o]=\"invalid field: toString() is not defined.\";else if(\"number\"===t)if(void 0===a)r[o]=\"undefined\";else if(null===a)r[o]=\"null\";else{var s=parseFloat(a);isNaN(s)?r[o]=\"NaN\":r[o]=s}else r[o]=\"invalid field: \"+i+\" is of unknown type.\",n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,r[o],null,!0)}return r},e}();t.Serializer=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t,n){this.pageViewPerformanceSent=!1,this.overridePageViewDuration=!1,this.overridePageViewDuration=t,this.appInsights=e,n&&(this._channel=n.getTransmissionControl())}return e.prototype.trackPageView=function(e,t){var r=this,o=e.name;(i.CoreUtils.isNullOrUndefined(o)||\"string\"!=typeof o)&&(e.name=window.document&&window.document.title||\"\");var a=e.uri;if((i.CoreUtils.isNullOrUndefined(a)||\"string\"!=typeof a)&&(e.uri=window.location&&window.location.href||\"\"),!n.PageViewPerformance.isPerformanceTimingSupported())return this.appInsights.sendPageViewInternal(e,t),this._channel.flush(),void n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.NavigationTimingNotSupported,\"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");var s=!1,l=void 0,c=n.PageViewPerformance.getPerformanceTiming().navigationStart;l=n.PageViewPerformance.getDuration(c,+new Date),n.PageViewPerformance.shouldCollectDuration(l)||(l=void 0);var u=e.duration;!this.overridePageViewDuration&&isNaN(u)||(isNaN(u)&&(e.duration=l),this.appInsights.sendPageViewInternal(e,t),this._channel.flush(),s=!0);var p=setInterval(function(){try{if(n.PageViewPerformance.isPerformanceTimingDataReady()){clearInterval(p);var i=new n.PageViewPerformance(o,a,null,t,void 0);i.getIsValid()||s?(s||(e.duration=i.getDurationMs(),r.appInsights.sendPageViewInternal(e,t)),r.pageViewPerformanceSent||(r.appInsights.sendPageViewPerformanceInternal(i),r.pageViewPerformanceSent=!0),r._channel.flush()):(e.duration=l,r.appInsights.sendPageViewInternal(e,t),r._channel.flush())}else n.PageViewPerformance.getDuration(c,+new Date)>6e4&&(clearInterval(p),s||(e.duration=6e4,r.appInsights.sendPageViewInternal(e,t),r._channel.flush()))}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackPVFailedCalc,\"trackPageView failed on page load calculation: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}},100)},e}();t.PageViewManager=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(59),n(60),n(61),n(58),n(62),n(63),n(66),n(67),n(4)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var d=function(){function e(e,t){this._config=e,this._core=t,this._telemetryInitializers=[],\"undefined\"!=typeof window&&(this._sessionManager=new u._SessionManager(e),this.application=new i.Application,this.device=new r.Device,this.internal=new o.Internal(e),this.location=new a.Location,this.user=new c.User(e),this.operation=new s.Operation,this.session=new u.Session,this.sample=new l.Sample(e.sampleRate())),this._addDefaultTelemetryInitializers()}return e.prototype.addTelemetryInitializer=function(e){this._telemetryInitializers.push(e)},e.prototype.track=function(e){return p.CoreUtils.isNullOrUndefined(e)?n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackArgumentsNotSpecified,\"cannot call .track() with a null or undefined argument\",null,!0):(e.name===n.PageView.envelopeType&&n._InternalLogging.resetInternalMessageCount(),this.session&&\"string\"!=typeof this.session.id&&this._sessionManager.update(),this._track(e)),e},e.prototype._addDefaultTelemetryInitializers=function(){if(!this._config.isBrowserLinkTrackingEnabled()){var e=[\"/browserLinkSignalR/\",\"/__browserLink/\"];this.addTelemetryInitializer(function(t){if(t.name===n.RemoteDependencyData.envelopeType){var i=t.data;if(i&&i.baseData)for(var r=0;r<e.length;r++)if(i.baseData.name.indexOf(e[r])>=0)return!1}return!0})}},e.prototype._track=function(e){var t={};this.session&&(\"string\"==typeof this.session.id?this._applySessionContext(t,this.session):this._applySessionContext(t,this._sessionManager.automaticSession)),this._applyApplicationContext(t,this.application),this._applyDeviceContext(t,this.device),this._applyInternalContext(t,this.internal),this._applyLocationContext(t,this.location),this._applySampleContext(t,this.sample),this._applyUserContext(t,this.user),this._applyOperationContext(t,this.operation),e.tags.push(t),e.instrumentationKey=this._config.instrumentationKey();var i=!1;try{for(var r=this._telemetryInitializers.length,o=0;o<r;++o){var a=this._telemetryInitializers[o];if(a&&!1===a.apply(null,[e])){i=!0;break}}}catch(e){i=!0,n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryInitializerFailed,\"One of telemetry initializers failed, telemetry item will not be sent: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)},!0)}if(!i)if(e.name===n.Metric.envelopeType||this.sample.isSampledIn(e)){var s=this._config.instrumentationKey().replace(/-/g,\"\");e.name=e.name.replace(\"{0}\",s),this._core.track(e)}else n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.TelemetrySampledAndNotSent,\"Telemetry is sampled and not sent to the AI service.\",{SampleRate:this.sample.sampleRate},!0);return e},e.prototype._applyApplicationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.ver&&(e[i.applicationVersion]=t.ver),\"string\"==typeof t.build&&(e[i.applicationBuild]=t.build)}},e.prototype._applyDeviceContext=function(e,t){var i=new n.ContextTagKeys;t&&(\"string\"==typeof t.id&&(e[i.deviceId]=t.id),\"string\"==typeof t.ip&&(e[i.deviceIp]=t.ip),\"string\"==typeof t.language&&(e[i.deviceLanguage]=t.language),\"string\"==typeof t.locale&&(e[i.deviceLocale]=t.locale),\"string\"==typeof t.model&&(e[i.deviceModel]=t.model),void 0!==t.network&&(e[i.deviceNetwork]=t.network),\"string\"==typeof t.oemName&&(e[i.deviceOEMName]=t.oemName),\"string\"==typeof t.os&&(e[i.deviceOS]=t.os),\"string\"==typeof t.osversion&&(e[i.deviceOSVersion]=t.osversion),\"string\"==typeof t.resolution&&(e[i.deviceScreenResolution]=t.resolution),\"string\"==typeof t.type&&(e[i.deviceType]=t.type))},e.prototype._applyInternalContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.agentVersion&&(e[i.internalAgentVersion]=t.agentVersion),\"string\"==typeof t.sdkVersion&&(e[i.internalSdkVersion]=t.sdkVersion)}},e.prototype._applyLocationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.ip&&(e[i.locationIp]=t.ip)}},e.prototype._applyOperationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.id&&(e[i.operationId]=t.id),\"string\"==typeof t.name&&(e[i.operationName]=t.name),\"string\"==typeof t.parentId&&(e[i.operationParentId]=t.parentId),\"string\"==typeof t.rootId&&(e[i.operationRootId]=t.rootId),\"string\"==typeof t.syntheticSource&&(e[i.operationSyntheticSource]=t.syntheticSource)}},e.prototype._applySampleContext=function(e,t){t&&(e.sampleRate=t.sampleRate)},e.prototype._applySessionContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.id&&(e[i.sessionId]=t.id),void 0!==t.isFirst&&(e[i.sessionIsFirst]=t.isFirst)}},e.prototype._applyUserContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.accountId&&(e[i.userAccountId]=t.accountId),\"string\"==typeof t.agent&&(e[i.userAgent]=t.agent),\"string\"==typeof t.id&&(e[i.userId]=t.id),\"string\"==typeof t.authenticatedId&&(e[i.userAuthUserId]=t.authenticatedId),\"string\"==typeof t.storeRegion&&(e[i.userStoreRegion]=t.storeRegion)}},e}();t.TelemetryContext=d}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Location=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Application=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.id=\"browser\",this.type=\"Browser\"}}();t.Device=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(18)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(e){this.sdkVersion=(e.sdkExtension()?e.sdkExtension()+\"_\":\"\")+\"javascript:\"+n.ApplicationInsights.Version}}();t.Internal=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(){this.id=n.Util.newId(),window&&window.location&&window.location.pathname&&(this.name=window.location.pathname)}}();t.Operation=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(64),n(0)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e){this.INT_MAX_VALUE=2147483647,(e>100||e<0)&&(i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.SampleRateOutOfRange,\"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\",{samplingRate:e},!0),this.sampleRate=100),this.sampleRate=e,this.samplingScoreGenerator=new n.SamplingScoreGenerator}return e.prototype.isSampledIn=function(e){return!0},e}();t.Sample=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(65),n(0)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(){this.hashCodeGeneragor=new n.HashCodeScoreGenerator}return e.prototype.getSamplingScore=function(e){var t=new i.ContextTagKeys;return e.tags[t.userId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.userId]):e.tags[t.operationId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.operationId]):Math.random()},e}();t.SamplingScoreGenerator=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.getHashCodeScore=function(t){return 100*(this.getHashCode(t)/e.INT_MAX_VALUE)},e.prototype.getHashCode=function(t){if(\"\"==t)return 0;for(;t.length<e.MIN_INPUT_LENGTH;)t=t.concat(t);for(var n=5381,i=0;i<t.length;++i)n=(n<<5)+n+t.charCodeAt(i),n&=n;return Math.abs(n)},e.INT_MAX_VALUE=2147483647,e.MIN_INPUT_LENGTH=8,e}();t.HashCodeScoreGenerator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(t){var i=n.Util.getCookie(e.userCookieName);if(i){var r=i.split(e.cookieSeparator);r.length>0&&(this.id=r[0])}if(this.config=t,!this.id){this.id=n.Util.newId();var o=new Date,a=n.Util.toISOStringForIE8(o);this.accountAcquisitionDate=a,o.setTime(o.getTime()+31536e6);var s=[this.id,a],l=this.config.cookieDomain?this.config.cookieDomain():void 0;n.Util.setCookie(e.userCookieName,s.join(e.cookieSeparator)+\";expires=\"+o.toUTCString(),l),n.Util.removeStorage(\"ai_session\")}this.accountId=t.accountId?t.accountId():void 0;var c=n.Util.getCookie(e.authUserCookieName);if(c){var u=(c=decodeURI(c)).split(e.cookieSeparator);u[0]&&(this.authenticatedId=u[0]),u.length>1&&u[1]&&(this.accountId=u[1])}}return e.prototype.setAuthenticatedUserContext=function(t,i,r){if(void 0===r&&(r=!1),!this.validateUserInput(t)||i&&!this.validateUserInput(i))n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SetAuthContextFailedAccountName,\"Setting auth user context failed. User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\",!0);else{this.authenticatedId=t;var o=this.authenticatedId;i&&(this.accountId=i,o=[this.authenticatedId,this.accountId].join(e.cookieSeparator)),r&&n.Util.setCookie(e.authUserCookieName,encodeURI(o),this.config.cookieDomain())}},e.prototype.clearAuthenticatedUserContext=function(){this.authenticatedId=null,this.accountId=null,n.Util.deleteCookie(e.authUserCookieName)},e.prototype.validateUserInput=function(e){return!(\"string\"!=typeof e||!e||e.match(/,|;|=| |\\|/))},e.cookieSeparator=\"|\",e.userCookieName=\"ai_user\",e.authUserCookieName=\"ai_authUser\",e}();t.User=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(68)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){return function(){}}();t.Session=r;var o=function(){function e(t){t||(t={}),\"function\"!=typeof t.sessionExpirationMs&&(t.sessionExpirationMs=function(){return e.acquisitionSpan}),\"function\"!=typeof t.sessionRenewalMs&&(t.sessionRenewalMs=function(){return e.renewalSpan}),this.config=t,this.automaticSession=new r}return e.prototype.update=function(){this.automaticSession.id||this.initializeAutomaticSession();var t=i.dateTime.Now(),n=t-this.automaticSession.acquisitionDate>this.config.sessionExpirationMs(),r=t-this.automaticSession.renewalDate>this.config.sessionRenewalMs();n||r?(this.automaticSession.isFirst=void 0,this.renew()):(!this.cookieUpdatedTimestamp||t-this.cookieUpdatedTimestamp>e.cookieUpdateInterval)&&(this.automaticSession.renewalDate=t,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate))},e.prototype.backup=function(){this.setStorage(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate)},e.prototype.initializeAutomaticSession=function(){var e=n.Util.getCookie(\"ai_session\");if(e&&\"function\"==typeof e.split)this.initializeAutomaticSessionWithData(e);else{var t=n.Util.getStorage(\"ai_session\");t&&this.initializeAutomaticSessionWithData(t)}this.automaticSession.id||(this.automaticSession.isFirst=!0,this.renew())},e.prototype.initializeAutomaticSessionWithData=function(e){var t=e.split(\"|\");t.length>0&&(this.automaticSession.id=t[0]);try{if(t.length>1){var i=+t[1];this.automaticSession.acquisitionDate=+new Date(i),this.automaticSession.acquisitionDate=this.automaticSession.acquisitionDate>0?this.automaticSession.acquisitionDate:0}if(t.length>2){var r=+t[2];this.automaticSession.renewalDate=+new Date(r),this.automaticSession.renewalDate=this.automaticSession.renewalDate>0?this.automaticSession.renewalDate:0}}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.ErrorParsingAISessionCookie,\"Error parsing ai_session cookie, session will be reset: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}0==this.automaticSession.renewalDate&&n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SessionRenewalDateIsZero,\"AI session renewal date is 0, session will be reset.\")},e.prototype.renew=function(){var e=i.dateTime.Now();this.automaticSession.id=n.Util.newId(),this.automaticSession.acquisitionDate=e,this.automaticSession.renewalDate=e,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate),n.Util.canUseLocalStorage()||n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserDoesNotSupportLocalStorage,\"Browser does not support local storage. Session durations will be inaccurate.\")},e.prototype.setCookie=function(e,t,r){var o=t+this.config.sessionExpirationMs(),a=r+this.config.sessionRenewalMs(),s=new Date,l=[e,t,r];o<a?s.setTime(o):s.setTime(a);var c=this.config.cookieDomain?this.config.cookieDomain():null;n.Util.setCookie(\"ai_session\",l.join(\"|\")+\";expires=\"+s.toUTCString(),c),this.cookieUpdatedTimestamp=i.dateTime.Now()},e.prototype.setStorage=function(e,t,i){n.Util.setStorage(\"ai_session\",[e,t,i].join(\"|\"))},e.acquisitionSpan=864e5,e.renewalSpan=18e5,e.cookieUpdateInterval=6e4,e}();t._SessionManager=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.IsNullOrUndefined=function(e){return void 0===e||null===e},e}();t.extensions=n;var i=function(){function e(){}return e.GetLength=function(e){var t=0;if(!n.IsNullOrUndefined(e)){var i=\"\";try{i=e.toString()}catch(e){}t=i.length,t=isNaN(t)?0:t}return t},e}();t.stringUtils=i;var r=function(){function e(){}return e.Now=window.performance&&window.performance.now&&window.performance.timing?function(){return window.performance.now()+window.performance.timing.navigationStart}:function(){return(new Date).getTime()},e.GetDuration=function(e,t){var i=null;return 0===e||0===t||n.IsNullOrUndefined(e)||n.IsNullOrUndefined(t)||(i=t-e),i},e}();t.dateTime=r;var o=function(){function e(){}return e.AttachEvent=function(e,t,i){var r=!1;return n.IsNullOrUndefined(e)||(n.IsNullOrUndefined(e.attachEvent)?n.IsNullOrUndefined(e.addEventListener)||(e.addEventListener(t,i,!1),r=!0):(e.attachEvent(\"on\"+t,i),r=!0)),r},e.DetachEvent=function(e,t,i){n.IsNullOrUndefined(e)||(n.IsNullOrUndefined(e.detachEvent)?n.IsNullOrUndefined(e.removeEventListener)||e.removeEventListener(t,i,!1):e.detachEvent(\"on\"+t,i))},e}();t.EventHelper=o}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(){}return e.createItem=function(t,n,r,o){if(i.CoreUtils.isNullOrUndefined(t)||i.CoreUtils.isNullOrUndefined(n)||i.CoreUtils.isNullOrUndefined(r))throw Error(\"pageView doesn't contain all required fields\");return e.creator.create(t,n,r,o)},e.prototype.create=function(e,t,r,o){if(r=n.DataSanitizer.sanitizeString(r)||n.Util.NotSpecified,t===n.PageView.dataType){var a={name:r,timestamp:new Date,instrumentationKey:\"\",ctx:{},tags:[],data:{},baseType:t,baseData:e};if(!i.CoreUtils.isNullOrUndefined(o))for(var s in o)o.hasOwnProperty(s)&&(a.data[s]=o[s]);return a}throw Error(\"Not implemented\")},e.creator=new e,e}();t.TelemetryItemCreator=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(4),n(17),n(0),n(16)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(t){t.queue=t.queue||[];var n=t.config||{};n&&!n.instrumentationKey&&(n=t,i.ApplicationInsights.Version=\"2.0.0\"),this.appInsights=new i.ApplicationInsights,n=e.getDefaultConfig(n,this.appInsights.identifier),this.snippet=t,this.config=n}return e.prototype.loadAppInsights=function(){this.core=new n.AppInsightsCore;var e=[],t=new o.Sender;return e.push(t),e.push(this.appInsights),this.core.initialize(this.config,e),this.appInsights.initialize(this.config,this.core,e),t.initialize(this.config),this.appInsights},e.prototype.emptyQueue=function(){try{if(r.Util.isArray(this.snippet.queue)){for(var e=this.snippet.queue.length,t=0;t<e;t++){(0,this.snippet.queue[t])()}this.snippet.queue=void 0,delete this.snippet.queue}}catch(e){e&&\"function\"==typeof e.toString&&e.toString()}},e.prototype.pollInteralLogs=function(e){},e.prototype.addHousekeepingBeforeUnload=function(e){if(!e.config.disableFlushOnBeforeUnload&&\"onbeforeunload\"in window){r.Util.addEventHandler(\"beforeunload\",function(){this.core.getTransmissionControl().flush(!0),e.context._sessionManager.backup()})||r._InternalLogging.throwInternal(r.LoggingSeverity.CRITICAL,r._InternalMessageId.FailedToAddHandlerForOnBeforeUnload,\"Could not add handler for beforeunload\")}},e.getDefaultConfig=function(e,t){e||(e={}),e&&(t=t||\"AppAnalytics\");var n=e.extensions?e.extensions[t]:{};return e.endpointUrl=e.endpointUrl||\"https://dc.services.visualstudio.com/v2/track\",n.sessionRenewalMs=18e5,n.sessionExpirationMs=864e5,n.enableDebug=r.Util.stringToBoolOrDefault(n.enableDebug),n.disableExceptionTracking=r.Util.stringToBoolOrDefault(n.disableExceptionTracking),n.verboseLogging=r.Util.stringToBoolOrDefault(n.verboseLogging),n.diagnosticLogInterval=n.diagnosticLogInterval||1e4,n.autoTrackPageVisitTime=r.Util.stringToBoolOrDefault(n.autoTrackPageVisitTime),(isNaN(n.samplingPercentage)||n.samplingPercentage<=0||n.samplingPercentage>=100)&&(n.samplingPercentage=100),n.disableAjaxTracking=r.Util.stringToBoolOrDefault(n.disableAjaxTracking),n.maxAjaxCallsPerView=isNaN(n.maxAjaxCallsPerView)?500:n.maxAjaxCallsPerView,n.disableCorrelationHeaders=r.Util.stringToBoolOrDefault(n.disableCorrelationHeaders),n.correlationHeaderExcludedDomains=n.correlationHeaderExcludedDomains||[\"*.blob.core.windows.net\",\"*.blob.core.chinacloudapi.cn\",\"*.blob.core.cloudapi.de\",\"*.blob.core.usgovcloudapi.net\"],n.disableFlushOnBeforeUnload=r.Util.stringToBoolOrDefault(n.disableFlushOnBeforeUnload),n.isCookieUseDisabled=r.Util.stringToBoolOrDefault(n.isCookieUseDisabled),n.isStorageUseDisabled=r.Util.stringToBoolOrDefault(n.isStorageUseDisabled),n.isBrowserLinkTrackingEnabled=r.Util.stringToBoolOrDefault(n.isBrowserLinkTrackingEnabled),n.enableCorsCorrelation=r.Util.stringToBoolOrDefault(n.enableCorsCorrelation),e},e}();t.Initialization=a}.apply(t,i))||(e.exports=r)}])});\n//# sourceMappingURL=aisdk0.0.8.js.map"
  },
  {
    "path": "AISKU/dist-history/aisdk.min.0.0.9.js",
    "content": "!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var n=t();for(var i in n)(\"object\"==typeof exports?exports:e)[i]=n[i]}}(window,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=18)}([function(e,t,n){var i,r;i=[n,t,n(2),n(1),n(6),n(8),n(24),n(9),n(10),n(25),n(27),n(20),n(28),n(33),n(7),n(34),n(36),n(38),n(40),n(41),n(42),n(3)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p,d,f,g,h,v,y,_,m,I,S){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Util=n.Util,t.CorrelationIdHelper=n.CorrelationIdHelper,t.UrlHelper=n.UrlHelper,t._InternalMessageId=i._InternalMessageId,t.LoggingSeverity=i.LoggingSeverity,t.FieldType=i.FieldType,t._InternalLogging=r._InternalLogging,t._InternalLogMessage=r._InternalLogMessage,t.RequestHeaders=o.RequestHeaders,t.DisabledPropertyName=a.DisabledPropertyName,t.AIData=s.Data,t.AIBase=l.Base,t.Envelope=c.Envelope,t.Event=u.Event,t.Exception=p.Exception,t.Metric=d.Metric,t.PageView=f.PageView,t.PageViewData=g.PageViewData,t.RemoteDependencyData=h.RemoteDependencyData,t.Trace=v.Trace,t.PageViewPerformance=y.PageViewPerformance,t.Data=_.Data,t.SeverityLevel=m.SeverityLevel,t.ContextTagKeys=I.ContextTagKeys,t.DataSanitizer=S.DataSanitizer}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.CRITICAL=0]=\"CRITICAL\",e[e.WARNING=1]=\"WARNING\"}(t.LoggingSeverity||(t.LoggingSeverity={})),function(e){e[e.BrowserDoesNotSupportLocalStorage=0]=\"BrowserDoesNotSupportLocalStorage\",e[e.BrowserCannotReadLocalStorage=1]=\"BrowserCannotReadLocalStorage\",e[e.BrowserCannotReadSessionStorage=2]=\"BrowserCannotReadSessionStorage\",e[e.BrowserCannotWriteLocalStorage=3]=\"BrowserCannotWriteLocalStorage\",e[e.BrowserCannotWriteSessionStorage=4]=\"BrowserCannotWriteSessionStorage\",e[e.BrowserFailedRemovalFromLocalStorage=5]=\"BrowserFailedRemovalFromLocalStorage\",e[e.BrowserFailedRemovalFromSessionStorage=6]=\"BrowserFailedRemovalFromSessionStorage\",e[e.CannotSendEmptyTelemetry=7]=\"CannotSendEmptyTelemetry\",e[e.ClientPerformanceMathError=8]=\"ClientPerformanceMathError\",e[e.ErrorParsingAISessionCookie=9]=\"ErrorParsingAISessionCookie\",e[e.ErrorPVCalc=10]=\"ErrorPVCalc\",e[e.ExceptionWhileLoggingError=11]=\"ExceptionWhileLoggingError\",e[e.FailedAddingTelemetryToBuffer=12]=\"FailedAddingTelemetryToBuffer\",e[e.FailedMonitorAjaxAbort=13]=\"FailedMonitorAjaxAbort\",e[e.FailedMonitorAjaxDur=14]=\"FailedMonitorAjaxDur\",e[e.FailedMonitorAjaxOpen=15]=\"FailedMonitorAjaxOpen\",e[e.FailedMonitorAjaxRSC=16]=\"FailedMonitorAjaxRSC\",e[e.FailedMonitorAjaxSend=17]=\"FailedMonitorAjaxSend\",e[e.FailedMonitorAjaxGetCorrelationHeader=18]=\"FailedMonitorAjaxGetCorrelationHeader\",e[e.FailedToAddHandlerForOnBeforeUnload=19]=\"FailedToAddHandlerForOnBeforeUnload\",e[e.FailedToSendQueuedTelemetry=20]=\"FailedToSendQueuedTelemetry\",e[e.FailedToReportDataLoss=21]=\"FailedToReportDataLoss\",e[e.FlushFailed=22]=\"FlushFailed\",e[e.MessageLimitPerPVExceeded=23]=\"MessageLimitPerPVExceeded\",e[e.MissingRequiredFieldSpecification=24]=\"MissingRequiredFieldSpecification\",e[e.NavigationTimingNotSupported=25]=\"NavigationTimingNotSupported\",e[e.OnError=26]=\"OnError\",e[e.SessionRenewalDateIsZero=27]=\"SessionRenewalDateIsZero\",e[e.SenderNotInitialized=28]=\"SenderNotInitialized\",e[e.StartTrackEventFailed=29]=\"StartTrackEventFailed\",e[e.StopTrackEventFailed=30]=\"StopTrackEventFailed\",e[e.StartTrackFailed=31]=\"StartTrackFailed\",e[e.StopTrackFailed=32]=\"StopTrackFailed\",e[e.TelemetrySampledAndNotSent=33]=\"TelemetrySampledAndNotSent\",e[e.TrackEventFailed=34]=\"TrackEventFailed\",e[e.TrackExceptionFailed=35]=\"TrackExceptionFailed\",e[e.TrackMetricFailed=36]=\"TrackMetricFailed\",e[e.TrackPVFailed=37]=\"TrackPVFailed\",e[e.TrackPVFailedCalc=38]=\"TrackPVFailedCalc\",e[e.TrackTraceFailed=39]=\"TrackTraceFailed\",e[e.TransmissionFailed=40]=\"TransmissionFailed\",e[e.FailedToSetStorageBuffer=41]=\"FailedToSetStorageBuffer\",e[e.FailedToRestoreStorageBuffer=42]=\"FailedToRestoreStorageBuffer\",e[e.InvalidBackendResponse=43]=\"InvalidBackendResponse\",e[e.FailedToFixDepricatedValues=44]=\"FailedToFixDepricatedValues\",e[e.InvalidDurationValue=45]=\"InvalidDurationValue\",e[e.TelemetryEnvelopeInvalid=46]=\"TelemetryEnvelopeInvalid\",e[e.CreateEnvelopeError=47]=\"CreateEnvelopeError\",e[e.CannotSerializeObject=48]=\"CannotSerializeObject\",e[e.CannotSerializeObjectNonSerializable=49]=\"CannotSerializeObjectNonSerializable\",e[e.CircularReferenceDetected=50]=\"CircularReferenceDetected\",e[e.ClearAuthContextFailed=51]=\"ClearAuthContextFailed\",e[e.ExceptionTruncated=52]=\"ExceptionTruncated\",e[e.IllegalCharsInName=53]=\"IllegalCharsInName\",e[e.ItemNotInArray=54]=\"ItemNotInArray\",e[e.MaxAjaxPerPVExceeded=55]=\"MaxAjaxPerPVExceeded\",e[e.MessageTruncated=56]=\"MessageTruncated\",e[e.NameTooLong=57]=\"NameTooLong\",e[e.SampleRateOutOfRange=58]=\"SampleRateOutOfRange\",e[e.SetAuthContextFailed=59]=\"SetAuthContextFailed\",e[e.SetAuthContextFailedAccountName=60]=\"SetAuthContextFailedAccountName\",e[e.StringValueTooLong=61]=\"StringValueTooLong\",e[e.StartCalledMoreThanOnce=62]=\"StartCalledMoreThanOnce\",e[e.StopCalledWithoutStart=63]=\"StopCalledWithoutStart\",e[e.TelemetryInitializerFailed=64]=\"TelemetryInitializerFailed\",e[e.TrackArgumentsNotSpecified=65]=\"TrackArgumentsNotSpecified\",e[e.UrlTooLong=66]=\"UrlTooLong\",e[e.SessionStorageBufferFull=67]=\"SessionStorageBufferFull\",e[e.CannotAccessCookie=68]=\"CannotAccessCookie\",e[e.IdTooLong=69]=\"IdTooLong\"}(t._InternalMessageId||(t._InternalMessageId={})),function(e){e[e.LocalStorage=0]=\"LocalStorage\",e[e.SessionStorage=1]=\"SessionStorage\"}(t.StorageType||(t.StorageType={})),function(e){e[e.Default=0]=\"Default\",e[e.Required=1]=\"Required\",e[e.Array=2]=\"Array\",e[e.Hidden=4]=\"Hidden\"}(t.FieldType||(t.FieldType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(1),n(6),n(8),n(3)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(){}return e.disableStorage=function(){e._canUseLocalStorage=!1,e._canUseSessionStorage=!1},e._getLocalStorageObject=function(){return e.canUseLocalStorage()?e._getVerifiedStorageObject(n.StorageType.LocalStorage):null},e._getVerifiedStorageObject=function(e){var t,i,r=null;try{i=new Date,(r=e===n.StorageType.LocalStorage?window.localStorage:window.sessionStorage).setItem(i,i),t=r.getItem(i)!=i,r.removeItem(i),t&&(r=null)}catch(e){r=null}return r},e.isInternalApplicationInsightsEndpoint=function(t){return-1!==e._internalEndpoints.indexOf(t.toLowerCase())},e.canUseLocalStorage=function(){return void 0===e._canUseLocalStorage&&(e._canUseLocalStorage=!!e._getVerifiedStorageObject(n.StorageType.LocalStorage)),e._canUseLocalStorage},e.getStorage=function(t){var r=e._getLocalStorageObject();if(null!==r)try{return r.getItem(t)}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotReadLocalStorage,\"Browser failed read of local storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return null},e.setStorage=function(t,r){var o=e._getLocalStorageObject();if(null!==o)try{return o.setItem(t,r),!0}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotWriteLocalStorage,\"Browser failed write to local storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.removeStorage=function(t){var r=e._getLocalStorageObject();if(null!==r)try{return r.removeItem(t),!0}catch(t){e._canUseLocalStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserFailedRemovalFromLocalStorage,\"Browser failed removal of local storage item. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e._getSessionStorageObject=function(){return e.canUseSessionStorage()?e._getVerifiedStorageObject(n.StorageType.SessionStorage):null},e.canUseSessionStorage=function(){return void 0===e._canUseSessionStorage&&(e._canUseSessionStorage=!!e._getVerifiedStorageObject(n.StorageType.SessionStorage)),e._canUseSessionStorage},e.getSessionStorageKeys=function(){var t=[];if(e.canUseSessionStorage())for(var n in window.sessionStorage)t.push(n);return t},e.getSessionStorage=function(t){var r=e._getSessionStorageObject();if(null!==r)try{return r.getItem(t)}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotReadSessionStorage,\"Browser failed read of session storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return null},e.setSessionStorage=function(t,r){var o=e._getSessionStorageObject();if(null!==o)try{return o.setItem(t,r),!0}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserCannotWriteSessionStorage,\"Browser failed write to session storage. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.removeSessionStorage=function(t){var r=e._getSessionStorageObject();if(null!==r)try{return r.removeItem(t),!0}catch(t){e._canUseSessionStorage=!1,i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserFailedRemovalFromSessionStorage,\"Browser failed removal of session storage item. \"+e.getExceptionName(t),{exception:e.dump(t)})}return!1},e.disableCookies=function(){e._canUseCookies=!1},e.canUseCookies=function(){if(void 0===e._canUseCookies){e._canUseCookies=!1;try{e._canUseCookies=void 0!==e.document.cookie}catch(t){i._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CannotAccessCookie,\"Cannot access document.cookie - \"+e.getExceptionName(t),{exception:e.dump(t)})}}return e._canUseCookies},e.setCookie=function(t,n,i){var r=\"\",o=\"\";i&&(r=\";domain=\"+i),e.document.location&&\"https:\"===e.document.location.protocol&&(o=\";secure\"),e.canUseCookies()&&(e.document.cookie=t+\"=\"+n+r+\";path=/\"+o)},e.stringToBoolOrDefault=function(e,t){return void 0===t&&(t=!1),void 0===e||null===e?t:\"true\"===e.toString().toLowerCase()},e.getCookie=function(t){if(e.canUseCookies()){var n=\"\";if(t&&t.length)for(var i=t+\"=\",r=e.document.cookie.split(\";\"),o=0;o<r.length;o++){var a=r[o];if((a=e.trim(a))&&0===a.indexOf(i)){n=a.substring(i.length,r[o].length);break}}return n}},e.deleteCookie=function(t){e.canUseCookies()&&(e.document.cookie=t+\"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\")},e.trim=function(e){return\"string\"!=typeof e?e:e.replace(/^\\s+|\\s+$/g,\"\")},e.newId=function(){for(var e=\"\",t=1073741824*Math.random();t>0;){e+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(t%64),t=Math.floor(t/64)}return e},e.isArray=function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},e.isError=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)},e.isDate=function(e){return\"[object Date]\"===Object.prototype.toString.call(e)},e.toISOStringForIE8=function(t){if(e.isDate(t)){if(Date.prototype.toISOString)return t.toISOString();var n=function(e){var t=String(e);return 1===t.length&&(t=\"0\"+t),t};return t.getUTCFullYear()+\"-\"+n(t.getUTCMonth()+1)+\"-\"+n(t.getUTCDate())+\"T\"+n(t.getUTCHours())+\":\"+n(t.getUTCMinutes())+\":\"+n(t.getUTCSeconds())+\".\"+String((t.getUTCMilliseconds()/1e3).toFixed(3)).slice(2,5)+\"Z\"}},e.getIEVersion=function(e){void 0===e&&(e=null);var t=e?e.toLowerCase():navigator.userAgent.toLowerCase();return-1!=t.indexOf(\"msie\")?parseInt(t.split(\"msie\")[1]):null},e.msToTimeSpan=function(e){(isNaN(e)||e<0)&&(e=0);var t=\"\"+(e=Math.round(e))%1e3,n=\"\"+Math.floor(e/1e3)%60,i=\"\"+Math.floor(e/6e4)%60,r=\"\"+Math.floor(e/36e5)%24,o=Math.floor(e/864e5);return t=1===t.length?\"00\"+t:2===t.length?\"0\"+t:t,n=n.length<2?\"0\"+n:n,i=i.length<2?\"0\"+i:i,r=r.length<2?\"0\"+r:r,(o>0?o+\".\":\"\")+r+\":\"+i+\":\"+n+\".\"+t},e.isCrossOriginError=function(e,t,n,i,r){return(\"Script error.\"===e||\"Script error\"===e)&&!r},e.dump=function(e){var t=Object.prototype.toString.call(e),n=JSON.stringify(e);return\"[object Error]\"===t&&(n=\"{ stack: '\"+e.stack+\"', message: '\"+e.message+\"', name: '\"+e.name+\"'\"),t+n},e.getExceptionName=function(e){return\"[object Error]\"===Object.prototype.toString.call(e)?e.name:\"\"},e.addEventHandler=function(e,t){if(!window||\"string\"!=typeof e||\"function\"!=typeof t)return!1;var n=\"on\"+e;if(window.addEventListener)window.addEventListener(e,t,!1);else{if(!window.attachEvent)return!1;window.attachEvent(n,t)}return!0},e.IsBeaconApiSupported=function(){return\"sendBeacon\"in navigator&&navigator.sendBeacon},e.document=\"undefined\"!=typeof document?document:{},e._canUseCookies=void 0,e._canUseLocalStorage=void 0,e._canUseSessionStorage=void 0,e._internalEndpoints=[\"https://dc.services.visualstudio.com/v2/track\",\"https://breeze.aimon.applicationinsights.io/v2/track\",\"https://dc-int.services.visualstudio.com/v2/track\"],e.NotSpecified=\"not_specified\",e}();t.Util=a;var s=function(){function e(){}return e.parseUrl=function(t){return e.htmlAnchorElement||(e.htmlAnchorElement=e.document.createElement?e.document.createElement(\"a\"):{}),e.htmlAnchorElement.href=t,e.htmlAnchorElement},e.getAbsoluteUrl=function(t){var n,i=e.parseUrl(t);return i&&(n=i.href),n},e.getPathName=function(t){var n,i=e.parseUrl(t);return i&&(n=i.pathname),n},e.getCompleteUrl=function(e,t){return e?e.toUpperCase()+\" \"+t:t},e.document=\"undefined\"!=typeof document?document:{},e}();t.UrlHelper=s;var l=function(){function e(){}return e.canIncludeCorrelationHeader=function(e,t,n){if(e&&e.disableCorrelationHeaders)return!1;if(!t)return!1;var i=s.parseUrl(t).host.toLowerCase();if(!(e&&e.enableCorsCorrelation||i===n))return!1;var r=e&&e.correlationHeaderExcludedDomains;if(!r||0==r.length)return!0;for(var o=0;o<r.length;o++){if(new RegExp(r[o].toLowerCase().replace(/\\./g,\".\").replace(/\\*/g,\".*\")).test(i))return!1}return!0},e.getCorrelationContext=function(t){if(t){var n=e.getCorrelationContextValue(t,r.RequestHeaders.requestContextTargetKey);if(n&&n!==e.correlationIdPrefix)return n}},e.getCorrelationContextValue=function(e,t){if(e)for(var n=e.split(\",\"),i=0;i<n.length;++i){var r=n[i].split(\"=\");if(2==r.length&&r[0]==t)return r[1]}},e.correlationIdPrefix=\"cid-v1:\",e}();t.CorrelationIdHelper=l;var c=function(){function e(){}return e.ParseDependencyPath=function(e,t,n){var i,r;if(e&&e.length>0){var a=s.parseUrl(e);if(i=a.host,null!=a.pathname)\"/\"!==(n=0===a.pathname.length?\"/\":a.pathname).charAt(0)&&(n=\"/\"+n),r=o.DataSanitizer.sanitizeString(t?t+\" \"+n:n);else r=o.DataSanitizer.sanitizeString(e)}else i=n,r=n;return{target:i,name:r}},e}();t.AjaxHelper=c}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(6),n(2),n(1)],void 0===(r=function(e,t,n,i,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(){}return e.sanitizeKeyAndAddUniqueness=function(t,n){var i=t.length,r=e.sanitizeKey(t);if(r.length!==i){for(var o=0,a=r;void 0!==n[a];)o++,a=r.substring(0,e.MAX_NAME_LENGTH-3)+e.padNumber(o);r=a}return r},e.sanitizeKey=function(t){return t&&(t=i.Util.trim(t.toString())).length>e.MAX_NAME_LENGTH&&(t=t.substring(0,e.MAX_NAME_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.NameTooLong,\"name is too long.  It has been truncated to \"+e.MAX_NAME_LENGTH+\" characters.\",{name:t},!0)),t},e.sanitizeString=function(t,o){return void 0===o&&(o=e.MAX_STRING_LENGTH),t&&(o=o||e.MAX_STRING_LENGTH,(t=i.Util.trim(t)).toString().length>o&&(t=t.toString().substring(0,o),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.StringValueTooLong,\"string value is too long. It has been truncated to \"+o+\" characters.\",{value:t},!0))),t},e.sanitizeUrl=function(t){return e.sanitizeInput(t,e.MAX_URL_LENGTH,r._InternalMessageId.UrlTooLong)},e.sanitizeMessage=function(t){return t&&t.length>e.MAX_MESSAGE_LENGTH&&(t=t.substring(0,e.MAX_MESSAGE_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.MessageTruncated,\"message is too long, it has been truncated to \"+e.MAX_MESSAGE_LENGTH+\" characters.\",{message:t},!0)),t},e.sanitizeException=function(t){return t&&t.length>e.MAX_EXCEPTION_LENGTH&&(t=t.substring(0,e.MAX_EXCEPTION_LENGTH),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,r._InternalMessageId.ExceptionTruncated,\"exception is too long, it has been truncated to \"+e.MAX_EXCEPTION_LENGTH+\" characters.\",{exception:t},!0)),t},e.sanitizeProperties=function(t){if(t){var n={};for(var i in t){var r=e.sanitizeString(t[i],e.MAX_PROPERTY_LENGTH);n[i=e.sanitizeKeyAndAddUniqueness(i,n)]=r}t=n}return t},e.sanitizeMeasurements=function(t){if(t){var n={};for(var i in t){var r=t[i];n[i=e.sanitizeKeyAndAddUniqueness(i,n)]=r}t=n}return t},e.sanitizeId=function(t){return t?e.sanitizeInput(t,e.MAX_ID_LENGTH,r._InternalMessageId.IdTooLong).toString():t},e.sanitizeInput=function(e,t,o){return e&&(e=i.Util.trim(e)).length>t&&(e=e.substring(0,t),n._InternalLogging.throwInternal(r.LoggingSeverity.WARNING,o,\"input is too long, it has been truncated to \"+t+\" characters.\",{data:e},!0)),e},e.padNumber=function(e){var t=\"00\"+e;return t.substr(t.length-3)},e.MAX_NAME_LENGTH=150,e.MAX_ID_LENGTH=128,e.MAX_PROPERTY_LENGTH=8192,e.MAX_STRING_LENGTH=1024,e.MAX_URL_LENGTH=2048,e.MAX_MESSAGE_LENGTH=32768,e.MAX_EXCEPTION_LENGTH=32768,e}();t.DataSanitizer=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(14),n(15),n(44),n(16),n(17)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MinChannelPriorty=n.MinChannelPriorty,t.EventsDiscardedReason=i.EventsDiscardedReason,t.AppInsightsCore=r.AppInsightsCore,t.CoreUtils=o.CoreUtils,t.NotificationManager=a.NotificationManager}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Domain=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(1),n(2)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(t,i,r,o){void 0===r&&(r=!1),this.messageId=t,this.message=(r?e.AiUserActionablePrefix:e.AiNonUserActionablePrefix)+n._InternalMessageId[t].toString();var a=(i?\" message:\"+e.sanitizeDiagnosticText(i):\"\")+(o?\" props:\"+e.sanitizeDiagnosticText(JSON.stringify(o)):\"\");this.message+=a}return e.sanitizeDiagnosticText=function(e){return'\"'+e.replace(/\\\"/g,\"\")+'\"'},e.AiNonUserActionablePrefix=\"AI (Internal): \",e.AiUserActionablePrefix=\"AI: \",e}();t._InternalLogMessage=r;var o=function(){function e(){}return e.throwInternal=function(e,t,i,o,a){void 0===a&&(a=!1);var s=new r(t,i,a,o);if(this.enableDebugExceptions())throw s;if(void 0!==s&&s&&void 0!==s.message){if(a){var l=n._InternalMessageId[s.messageId];this._messageLogged[l]&&!this.verboseLogging()||(this.warnToConsole(s.message),this._messageLogged[l]=!0)}else this.verboseLogging()&&this.warnToConsole(s.message);this.logInternalMessage(e,s)}},e.warnToConsole=function(e){\"undefined\"!=typeof console&&console&&(\"function\"==typeof console.warn?console.warn(e):\"function\"==typeof console.log&&console.log(e))},e.resetInternalMessageCount=function(){this._messageCount=0,this._messageLogged={}},e.clearInternalMessageLoggedTypes=function(){if(i.Util.canUseSessionStorage())for(var t=i.Util.getSessionStorageKeys(),n=0;n<t.length;n++)0===t[n].indexOf(e.AIInternalMessagePrefix)&&i.Util.removeSessionStorage(t[n])},e.setMaxInternalMessageLimit=function(e){if(!e)throw new Error(\"limit cannot be undefined.\");this.MAX_INTERNAL_MESSAGE_LIMIT=e},e.logInternalMessage=function(t,o){if(!this._areInternalMessagesThrottled()){var a=!0,s=e.AIInternalMessagePrefix+n._InternalMessageId[o.messageId];if(i.Util.canUseSessionStorage())i.Util.getSessionStorage(s)?a=!1:i.Util.setSessionStorage(s,\"1\");else this._messageLogged[s]?a=!1:this._messageLogged[s]=!0;if(a&&((this.verboseLogging()||t===n.LoggingSeverity.CRITICAL)&&(this.queue.push(o),this._messageCount++),this._messageCount==this.MAX_INTERNAL_MESSAGE_LIMIT)){var l=\"Internal events throttle limit per PageView reached for this app.\",c=new r(n._InternalMessageId.MessageLimitPerPVExceeded,l,!1);this.queue.push(c),this.warnToConsole(l)}}},e._areInternalMessagesThrottled=function(){return this._messageCount>=this.MAX_INTERNAL_MESSAGE_LIMIT},e.AIInternalMessagePrefix=\"AITR_\",e.enableDebugExceptions=function(){return!1},e.verboseLogging=function(){return!1},e.queue=[],e.MAX_INTERNAL_MESSAGE_LIMIT=25,e._messageCount=0,e._messageLogged={},e}();t._InternalLogging=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(11)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.EventData);t.PageViewData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.requestContextHeader=\"Request-Context\",e.requestContextTargetKey=\"appId\",e.requestContextAppIdFormat=\"appId=cid-v1:\",e.requestIdHeader=\"Request-Id\",e.sdkContextHeader=\"Sdk-Context\",e.sdkContextHeaderAppIdRequest=\"appId\",e.requestContextHeaderLowerCase=\"request-context\",e}();t.RequestHeaders=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(10)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){return e.call(this)||this}return o(t,e),t}(n.Base);t.Data=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Base=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.EventData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(13)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ApplicationInsights=n.ApplicationInsights}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(43),n(4),n(45),n(57)],void 0===(r=function(e,t,n,i,r,o,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(){function e(){this._trackAjaxAttempts=0,this.identifier=e.defaultIdentifier,this.initialize=this._initialize.bind(this)}return e.prototype.processTelemetry=function(e){r.CoreUtils.isNullOrUndefined(this._nextPlugin)||this._nextPlugin.processTelemetry(e)},e.prototype.setNextPlugin=function(e){this._nextPlugin=e},e.prototype.trackPageView=function(e,t){try{this._pageViewManager.trackPageView(e,t),this.config.autoTrackPageVisitTime&&this._pageVisitTimeManager.trackPreviousPageVisit(e.name,e.uri)}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackPVFailed,\"trackPageView failed, page view will not be collected: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}},e.prototype.sendPageViewInternal=function(e,t,i){var r=a.TelemetryItemCreator.createItem(e,n.PageView.dataType,n.PageView.envelopeType,t,i);this.context.track(r),this._trackAjaxAttempts=0},e.prototype.sendPageViewPerformanceInternal=function(e){},e.prototype._initialize=function(t,a,s){var l=this;if(r.CoreUtils.isNullOrUndefined(a))throw Error(\"Error initializing\");this.core=a,this._globalconfig={instrumentationKey:t.instrumentationKey,endpointUrl:t.endpointUrl},this.config=t.extensions&&t.extensions[this.identifier]?t.extensions[this.identifier]:{};var c=e.appInsightsDefaultConfig;if(void 0!==c){if(c.extensions&&c.extensions[this.identifier])for(var u in c.extensions[this.identifier])void 0===this.config[u]&&(this.config[u]=c[u]);if(this._globalconfig)for(var u in c)void 0===this._globalconfig[u]&&(this._globalconfig[u]=c[u])}n._InternalLogging.verboseLogging=function(){return l.config.verboseLogging},n._InternalLogging.enableDebugExceptions=function(){return l.config.enableDebug},this.config.isCookieUseDisabled&&n.Util.disableCookies(),this.config.isStorageUseDisabled&&n.Util.disableStorage();var p={instrumentationKey:function(){return t.instrumentationKey},accountId:function(){return l.config.accountId},sessionRenewalMs:function(){return l.config.sessionRenewalMs},sessionExpirationMs:function(){return l.config.sessionExpirationMs},sampleRate:function(){return l.config.samplingPercentage},cookieDomain:function(){return l.config.cookieDomain},sdkExtension:function(){return l.config.sdkExtension},isBrowserLinkTrackingEnabled:function(){return l.config.isBrowserLinkTrackingEnabled},appId:function(){return l.config.appId}};this.context=new o.TelemetryContext(p,this.core),this._pageViewManager=new i.PageViewManager(this,this.config.overridePageViewDuration,this.core)},e.defaultIdentifier=\"ApplicationInsightsAnalytics\",e.Version=\"0.0.1\",e}();t.ApplicationInsights=s;!function(){function e(e){this._name=e,this._events={}}e.prototype.start=function(e){void 0!==this._events[e]&&n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.StartCalledMoreThanOnce,\"start was called more than once for this event without calling stop.\",{name:this._name,key:e},!0),this._events[e]=+new Date},e.prototype.stop=function(e,t,i,r){var o=this._events[e];if(isNaN(o))n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.StopCalledWithoutStart,\"stop was called without a corresponding start.\",{name:this._name,key:e},!0);else{var a=+new Date,s=n.PageViewPerformance.getDuration(o,a);this.action(e,t,s,i,r)}delete this._events[e],this._events[e]=void 0}}()}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.MinChannelPriorty=100}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventsDiscardedReason={Unknown:0,NonRetryableStatus:1,InvalidEvent:2,SizeLimitExceeded:3,KillSwitch:4,QueueFull:5}}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.isNullOrUndefined=function(e){return null===e||void 0===e},e}();t.CoreUtils=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){this.listeners=[]}return e.prototype.addNotificationListener=function(e){this.listeners.push(e)},e.prototype.removeNotificationListener=function(e){for(var t=this.listeners.indexOf(e);t>-1;)this.listeners.splice(t,1),t=this.listeners.indexOf(e)},e.prototype.eventsSent=function(e){for(var t=this,n=function(n){i.listeners[n].eventsSent&&setTimeout(function(){return t.listeners[n].eventsSent(e)},0)},i=this,r=0;r<this.listeners.length;++r)n(r)},e.prototype.eventsDiscarded=function(e,t){for(var n=this,i=function(i){r.listeners[i].eventsDiscarded&&setTimeout(function(){return n.listeners[i].eventsDiscarded(e,t)},0)},r=this,o=0;o<this.listeners.length;++o)i(o)},e}();t.NotificationManager=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){e.exports=n(19)},function(e,t,n){var i,r;i=[n,t,n(0),n(12),n(58)],void 0===(r=function(e,t,n,i,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});try{if(\"undefined\"!=typeof window&&\"undefined\"!=typeof JSON){if(void 0===window.appInsightsvNext)i.ApplicationInsights.appInsightsDefaultConfig=r.Initialization.getDefaultConfig();else{var o=window.appInsightsvNext||{},a=new r.Initialization(o),s=a.loadAppInsights();for(var l in s)o[l]=s[l];a.emptyQueue(),a.addHousekeepingBeforeUnload(s)}}}catch(e){n._InternalLogging.warnToConsole(\"Failed to initialize AppInsights JS SDK: \"+e.message)}}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(21),n(22),n(23),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a,s,l){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var c=function(e){function t(t,n,i,r){var o=e.call(this)||this;return o.aiDataContract={ver:s.FieldType.Required,exceptions:s.FieldType.Required,severityLevel:s.FieldType.Default,properties:s.FieldType.Default,measurements:s.FieldType.Default},o.properties=a.DataSanitizer.sanitizeProperties(n),o.measurements=a.DataSanitizer.sanitizeMeasurements(i),o.exceptions=[new u(t)],r&&(o.severityLevel=r),o}return o(t,e),t.CreateSimpleException=function(e,t,n,i,r,o){return{exceptions:[{hasFullStack:!0,message:e,stack:r,typeName:t}]}},t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Exception\",t.dataType=\"ExceptionData\",t}(i.ExceptionData);t.Exception=c;var u=function(e){function t(t){var n=e.call(this)||this;n.aiDataContract={id:s.FieldType.Default,outerId:s.FieldType.Default,typeName:s.FieldType.Required,message:s.FieldType.Required,hasFullStack:s.FieldType.Default,stack:s.FieldType.Default,parsedStack:s.FieldType.Array},n.typeName=a.DataSanitizer.sanitizeString(t.name)||l.Util.NotSpecified,n.message=a.DataSanitizer.sanitizeMessage(t.message)||l.Util.NotSpecified;var i=t.stack;return n.parsedStack=n.parseStack(i),n.stack=a.DataSanitizer.sanitizeException(i),n.hasFullStack=l.Util.isArray(n.parsedStack)&&n.parsedStack.length>0,n}return o(t,e),t.prototype.parseStack=function(e){var t=void 0;if(\"string\"==typeof e){var n=e.split(\"\\n\");t=[];for(var i=0,r=0,o=0;o<=n.length;o++){var a=n[o];if(p.regex.test(a)){var s=new p(n[o],i++);r+=s.sizeInBytes,t.push(s)}}if(r>32768)for(var l=0,c=t.length-1,u=0,d=l,f=c;l<c;){if((u+=t[l].sizeInBytes+t[c].sizeInBytes)>32768){var g=f-d+1;t.splice(d,g);break}d=l,f=c,l++,c--}}return t},t}(r.ExceptionDetails),p=function(e){function t(n,i){var r=e.call(this)||this;r.sizeInBytes=0,r.aiDataContract={level:s.FieldType.Required,method:s.FieldType.Required,assembly:s.FieldType.Default,fileName:s.FieldType.Default,line:s.FieldType.Default},r.level=i,r.method=\"<no_method>\",r.assembly=l.Util.trim(n);var o=n.match(t.regex);return o&&o.length>=5&&(r.method=l.Util.trim(o[2])||r.method,r.fileName=l.Util.trim(o[4]),r.line=parseInt(o[5])||0),r.sizeInBytes+=r.method.length,r.sizeInBytes+=r.fileName.length,r.sizeInBytes+=r.assembly.length,r.sizeInBytes+=t.baseSize,r.sizeInBytes+=r.level.toString().length,r.sizeInBytes+=r.line.toString().length,r}return o(t,e),t.regex=/^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/,t.baseSize=58,t}(n.StackFrame);t._StackFrame=p}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.StackFrame=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.exceptions=[],t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.ExceptionData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.hasFullStack=!0,this.parsedStack=[]}}();t.ExceptionDetails=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.DisabledPropertyName=\"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\"}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(26),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n){var o=e.call(this)||this;return o.name=i.DataSanitizer.sanitizeString(n)||a.Util.NotSpecified,o.data=t,o.time=a.Util.toISOStringForIE8(new Date),o.aiDataContract={time:r.FieldType.Required,iKey:r.FieldType.Required,name:r.FieldType.Required,sampleRate:function(){return 100==o.sampleRate?r.FieldType.Hidden:r.FieldType.Required},tags:r.FieldType.Required,data:r.FieldType.Required},o}return o(t,e),t}(n.Envelope);t.Envelope=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.ver=1,this.sampleRate=100,this.tags={}}}();t.Envelope=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(11),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o){var s=e.call(this)||this;return s.aiDataContract={ver:r.FieldType.Required,name:r.FieldType.Required,properties:r.FieldType.Default,measurements:r.FieldType.Default},s.name=i.DataSanitizer.sanitizeString(t)||a.Util.NotSpecified,s.properties=i.DataSanitizer.sanitizeProperties(n),s.measurements=i.DataSanitizer.sanitizeMeasurements(o),s}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Event\",t.dataType=\"EventData\",t}(n.EventData);t.Event=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(29),n(3),n(1),n(30),n(2)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(t,n,o,l,c,u){var p=e.call(this)||this;p.aiDataContract={ver:r.FieldType.Required,metrics:r.FieldType.Required,properties:r.FieldType.Default};var d=new a.DataPoint;return d.count=o>0?o:void 0,d.max=isNaN(c)||null===c?void 0:c,d.min=isNaN(l)||null===l?void 0:l,d.name=i.DataSanitizer.sanitizeString(t)||s.Util.NotSpecified,d.value=n,p.metrics=[d],p.properties=i.DataSanitizer.sanitizeProperties(u),p}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Metric\",t.dataType=\"MetricData\",t}(n.MetricData);t.Metric=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.metrics=[],t.properties={},t}return o(t,e),t}(n.Domain);t.MetricData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(31),n(1)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.aiDataContract={name:i.FieldType.Required,kind:i.FieldType.Default,value:i.FieldType.Required,count:i.FieldType.Default,min:i.FieldType.Default,max:i.FieldType.Default,stdDev:i.FieldType.Default},t}return o(t,e),t}(n.DataPoint);t.DataPoint=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(32)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(){this.kind=n.DataPointType.Measurement}}();t.DataPoint=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.Measurement=0]=\"Measurement\",e[e.Aggregation=1]=\"Aggregation\"}(t.DataPointType||(t.DataPointType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(7),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o,s,l,c){var u=e.call(this)||this;return u.aiDataContract={ver:r.FieldType.Required,name:r.FieldType.Default,url:r.FieldType.Default,duration:r.FieldType.Default,properties:r.FieldType.Default,measurements:r.FieldType.Default,id:r.FieldType.Default},u.id=i.DataSanitizer.sanitizeId(c),u.url=i.DataSanitizer.sanitizeUrl(n),u.name=i.DataSanitizer.sanitizeString(t)||a.Util.NotSpecified,isNaN(o)||(u.duration=a.Util.msToTimeSpan(o)),u.properties=i.DataSanitizer.sanitizeProperties(s),u.measurements=i.DataSanitizer.sanitizeMeasurements(l),u}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Pageview\",t.dataType=\"PageviewData\",t}(n.PageViewData);t.PageView=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(3),n(1),n(2),n(2),n(35)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(t,o,s,l,c,u,p,d,f){var g=e.call(this)||this;g.aiDataContract={id:i.FieldType.Required,ver:i.FieldType.Required,name:i.FieldType.Default,resultCode:i.FieldType.Default,duration:i.FieldType.Default,success:i.FieldType.Default,data:i.FieldType.Default,target:i.FieldType.Default,type:i.FieldType.Default,properties:i.FieldType.Default,measurements:i.FieldType.Default,kind:i.FieldType.Default,value:i.FieldType.Default,count:i.FieldType.Default,min:i.FieldType.Default,max:i.FieldType.Default,stdDev:i.FieldType.Default,dependencyKind:i.FieldType.Default,dependencySource:i.FieldType.Default,commandName:i.FieldType.Default,dependencyTypeName:i.FieldType.Default},g.id=t,g.duration=r.Util.msToTimeSpan(l),g.success=c,g.resultCode=u+\"\",g.type=\"Ajax\",g.data=n.DataSanitizer.sanitizeUrl(s);var h=a.AjaxHelper.ParseDependencyPath(o,p,s);return g.target=h.target,g.name=h.name,g.properties=n.DataSanitizer.sanitizeProperties(d),g.measurements=n.DataSanitizer.sanitizeMeasurements(f),g}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.RemoteDependency\",t.dataType=\"RemoteDependencyData\",t}(s.RemoteDependencyData);t.RemoteDependencyData=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.success=!0,t.properties={},t.measurements={},t}return o(t,e),t}(n.Domain);t.RemoteDependencyData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(37),n(3),n(1),n(2)],void 0===(r=function(e,t,n,i,r,a){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var s=function(e){function t(t,n,o){var s=e.call(this)||this;return s.aiDataContract={ver:r.FieldType.Required,message:r.FieldType.Required,severityLevel:r.FieldType.Default,properties:r.FieldType.Default},t=t||a.Util.NotSpecified,s.message=i.DataSanitizer.sanitizeMessage(t),s.properties=i.DataSanitizer.sanitizeProperties(n),o&&(s.severityLevel=o),s}return o(t,e),t.envelopeType=\"Microsoft.ApplicationInsights.{0}.Message\",t.dataType=\"MessageData\",t}(n.MessageData);t.Trace=s}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(5)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t}return o(t,e),t}(n.Domain);t.MessageData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(39),n(1),n(3),n(2),n(6)],void 0===(r=function(e,t,n,i,r,a,s){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var l=function(e){function t(n,o,l,c,u){var p=e.call(this)||this;p.aiDataContract={ver:i.FieldType.Required,name:i.FieldType.Default,url:i.FieldType.Default,duration:i.FieldType.Default,perfTotal:i.FieldType.Default,networkConnect:i.FieldType.Default,sentRequest:i.FieldType.Default,receivedResponse:i.FieldType.Default,domProcessing:i.FieldType.Default,properties:i.FieldType.Default,measurements:i.FieldType.Default},p.isValid=!1;var d=t.getPerformanceTiming();if(d){var f=t.getDuration(d.navigationStart,d.loadEventEnd),g=t.getDuration(d.navigationStart,d.connectEnd),h=t.getDuration(d.requestStart,d.responseStart),v=t.getDuration(d.responseStart,d.responseEnd),y=t.getDuration(d.responseEnd,d.loadEventEnd);0==f?s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.ErrorPVCalc,\"error calculating page view performance.\",{total:f,network:g,request:h,response:v,dom:y}):t.shouldCollectDuration(f,g,h,v,y)?f<Math.floor(g)+Math.floor(h)+Math.floor(v)+Math.floor(y)?s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.ClientPerformanceMathError,\"client performance math error.\",{total:f,network:g,request:h,response:v,dom:y}):(p.durationMs=f,p.perfTotal=p.duration=a.Util.msToTimeSpan(f),p.networkConnect=a.Util.msToTimeSpan(g),p.sentRequest=a.Util.msToTimeSpan(h),p.receivedResponse=a.Util.msToTimeSpan(v),p.domProcessing=a.Util.msToTimeSpan(y),p.isValid=!0):s._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.InvalidDurationValue,\"Invalid page load duration value. Browser perf data won't be sent.\",{total:f,network:g,request:h,response:v,dom:y})}return p.url=r.DataSanitizer.sanitizeUrl(o),p.name=r.DataSanitizer.sanitizeString(n)||a.Util.NotSpecified,p.properties=r.DataSanitizer.sanitizeProperties(c),p.measurements=r.DataSanitizer.sanitizeMeasurements(u),p}return o(t,e),t.prototype.getIsValid=function(){return this.isValid},t.prototype.getDurationMs=function(){return this.durationMs},t.getPerformanceTiming=function(){return t.isPerformanceTimingSupported()?window.performance.timing:null},t.isPerformanceTimingSupported=function(){return!1},t.isPerformanceTimingDataReady=function(){var e=window.performance.timing;return e.domainLookupStart>0&&e.navigationStart>0&&e.responseStart>0&&e.requestStart>0&&e.loadEventEnd>0&&e.responseEnd>0&&e.connectEnd>0&&e.domLoading>0},t.getDuration=function(e,t){var n=void 0;return isNaN(e)||isNaN(t)||(n=Math.max(t-e,0)),n},t.shouldCollectDuration=function(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];var i=[\"googlebot\",\"adsbot-google\",\"apis-google\",\"mediapartners-google\"],r=navigator.userAgent,o=!1;if(r)for(var a=0;a<i.length;a++)o=o||-1!==r.toLowerCase().indexOf(i[a]);if(o)return!1;for(var s=0;s<e.length;s++)if(e[s]>=t.MAX_DURATION_ALLOWED)return!1;return!0},t.envelopeType=\"Microsoft.ApplicationInsights.{0}.PageviewPerformance\",t.dataType=\"PageviewPerformanceData\",t.MAX_DURATION_ALLOWED=36e5,t}(n.PageViewPerfData);t.PageViewPerformance=l}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(7)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(e){function t(){var t=e.call(this)||this;return t.ver=2,t.properties={},t.measurements={},t}return o(t,e),t}(n.PageViewData);t.PageViewPerfData=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(9),n(1)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(e){function t(t,n){var r=e.call(this)||this;return r.aiDataContract={baseType:i.FieldType.Required,baseData:i.FieldType.Required},r.baseType=t,r.baseData=n,r}return o(t,e),t}(n.Data);t.Data=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),function(e){e[e.Verbose=0]=\"Verbose\",e[e.Information=1]=\"Information\",e[e.Warning=2]=\"Warning\",e[e.Error=3]=\"Error\",e[e.Critical=4]=\"Critical\"}(t.SeverityLevel||(t.SeverityLevel={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.applicationVersion=\"ai.application.ver\",this.applicationBuild=\"ai.application.build\",this.applicationTypeId=\"ai.application.typeId\",this.applicationId=\"ai.application.applicationId\",this.applicationLayer=\"ai.application.layer\",this.deviceId=\"ai.device.id\",this.deviceIp=\"ai.device.ip\",this.deviceLanguage=\"ai.device.language\",this.deviceLocale=\"ai.device.locale\",this.deviceModel=\"ai.device.model\",this.deviceFriendlyName=\"ai.device.friendlyName\",this.deviceNetwork=\"ai.device.network\",this.deviceNetworkName=\"ai.device.networkName\",this.deviceOEMName=\"ai.device.oemName\",this.deviceOS=\"ai.device.os\",this.deviceOSVersion=\"ai.device.osVersion\",this.deviceRoleInstance=\"ai.device.roleInstance\",this.deviceRoleName=\"ai.device.roleName\",this.deviceScreenResolution=\"ai.device.screenResolution\",this.deviceType=\"ai.device.type\",this.deviceMachineName=\"ai.device.machineName\",this.deviceVMName=\"ai.device.vmName\",this.deviceBrowser=\"ai.device.browser\",this.deviceBrowserVersion=\"ai.device.browserVersion\",this.locationIp=\"ai.location.ip\",this.locationCountry=\"ai.location.country\",this.locationProvince=\"ai.location.province\",this.locationCity=\"ai.location.city\",this.operationId=\"ai.operation.id\",this.operationName=\"ai.operation.name\",this.operationParentId=\"ai.operation.parentId\",this.operationRootId=\"ai.operation.rootId\",this.operationSyntheticSource=\"ai.operation.syntheticSource\",this.operationCorrelationVector=\"ai.operation.correlationVector\",this.sessionId=\"ai.session.id\",this.sessionIsFirst=\"ai.session.isFirst\",this.sessionIsNew=\"ai.session.isNew\",this.userAccountAcquisitionDate=\"ai.user.accountAcquisitionDate\",this.userAccountId=\"ai.user.accountId\",this.userAgent=\"ai.user.userAgent\",this.userId=\"ai.user.id\",this.userStoreRegion=\"ai.user.storeRegion\",this.userAuthUserId=\"ai.user.authUserId\",this.userAnonymousUserAcquisitionDate=\"ai.user.anonUserAcquisitionDate\",this.userAuthenticatedUserAcquisitionDate=\"ai.user.authUserAcquisitionDate\",this.cloudName=\"ai.cloud.name\",this.cloudRole=\"ai.cloud.role\",this.cloudRoleVer=\"ai.cloud.roleVer\",this.cloudRoleInstance=\"ai.cloud.roleInstance\",this.cloudEnvironment=\"ai.cloud.environment\",this.cloudLocation=\"ai.cloud.location\",this.cloudDeploymentUnit=\"ai.cloud.deploymentUnit\",this.internalSdkVersion=\"ai.internal.sdkVersion\",this.internalAgentVersion=\"ai.internal.agentVersion\",this.internalNodeName=\"ai.internal.nodeName\"}}();t.ContextTagKeys=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t,n){this.pageViewPerformanceSent=!1,this.overridePageViewDuration=!1,this.overridePageViewDuration=t,this.appInsights=e,n&&(this._channel=n.getTransmissionControl())}return e.prototype.trackPageView=function(e,t){var r=this,o=e.name;(i.CoreUtils.isNullOrUndefined(o)||\"string\"!=typeof o)&&(e.name=window.document&&window.document.title||\"\");var a=e.uri;if((i.CoreUtils.isNullOrUndefined(a)||\"string\"!=typeof a)&&(e.uri=window.location&&window.location.href||\"\"),!n.PageViewPerformance.isPerformanceTimingSupported())return this.appInsights.sendPageViewInternal(e,t),this._channel.flush(),void n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.NavigationTimingNotSupported,\"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");var s=!1,l=void 0,c=n.PageViewPerformance.getPerformanceTiming().navigationStart;l=n.PageViewPerformance.getDuration(c,+new Date),n.PageViewPerformance.shouldCollectDuration(l)||(l=void 0);var u=e.duration;!this.overridePageViewDuration&&isNaN(u)||(isNaN(u)&&(e.duration=l),this.appInsights.sendPageViewInternal(e,t),this._channel.flush(),s=!0);var p=setInterval(function(){try{if(n.PageViewPerformance.isPerformanceTimingDataReady()){clearInterval(p);var i=new n.PageViewPerformance(o,a,null,t,void 0);i.getIsValid()||s?(s||(e.duration=i.getDurationMs(),r.appInsights.sendPageViewInternal(e,t)),r.pageViewPerformanceSent||(r.appInsights.sendPageViewPerformanceInternal(i),r.pageViewPerformanceSent=!0),r._channel.flush()):(e.duration=l,r.appInsights.sendPageViewInternal(e,t),r._channel.flush())}else n.PageViewPerformance.getDuration(c,+new Date)>6e4&&(clearInterval(p),s||(e.duration=6e4,r.appInsights.sendPageViewInternal(e,t),r._channel.flush()))}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackPVFailedCalc,\"trackPageView failed on page load calculation: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}},100)},e}();t.PageViewManager=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(14),n(15),n(16),n(17)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(){this._extensions=new Array}return e.prototype.initialize=function(e,t){var n=this;if(!t||0===t.length)throw Error(\"At least one extension channel is required\");if(!e||r.CoreUtils.isNullOrUndefined(e.instrumentationKey))throw Error(\"Please provide instrumentation key\");this.config=e,this._notificationManager=new o.NotificationManager,this.config.extensions=this.config.extensions?this.config.extensions:{},this.config.extensions.NotificationManager=this._notificationManager,t.forEach(function(e){if(r.CoreUtils.isNullOrUndefined(e.initialize))throw Error(\"Extensions must provide callback to initialize\")}),this._extensions=t.sort(function(e,t){var n=e,i=t,r=typeof n.processTelemetry,o=typeof i.processTelemetry;return\"function\"===r&&\"function\"===o?n.priority>i.priority?1:-1:\"function\"===r&&\"function\"!==o?1:\"function\"!==r&&\"function\"===o?-1:void 0});for(var i=0;i<this._extensions.length-1;i++)this._extensions[i]&&\"function\"!=typeof this._extensions[i].processTelemetry||this._extensions[i].setNextPlugin(this._extensions[i+1]);this._extensions.forEach(function(e){return e.initialize(n.config,n,n._extensions)})},e.prototype.getTransmissionControl=function(){for(var e=0;e<this._extensions.length;e++){var t=this._extensions[e].priority;if(!r.CoreUtils.isNullOrUndefined(t)&&t>=n.MinChannelPriorty)return this._extensions[e]}throw new Error(\"No channel extension found\")},e.prototype.track=function(e){if(null===e)throw this._notifiyInvalidEvent(e),Error(\"Invalid telemetry item\");if(e.baseData&&!e.baseType)throw this._notifiyInvalidEvent(e),Error(\"Provide data.baseType for data.baseData\");this._validateTelmetryItem(e),e.instrumentationKey||(e.instrumentationKey=this.config.instrumentationKey);for(var t=0;t<this._extensions.length;){if(this._extensions[t].processTelemetry){this._extensions[t].processTelemetry(e);break}t++}},e.prototype.addNotificationListener=function(e){this._notificationManager.addNotificationListener(e)},e.prototype.removeNotificationListener=function(e){this._notificationManager.removeNotificationListener(e)},e.prototype._validateTelmetryItem=function(e){if(r.CoreUtils.isNullOrUndefined(e.name))throw this._notifiyInvalidEvent(e),Error(\"telemetry name required\");if(r.CoreUtils.isNullOrUndefined(e.timestamp))throw this._notifiyInvalidEvent(e),Error(\"telemetry timestamp required\");if(r.CoreUtils.isNullOrUndefined(e.instrumentationKey))throw this._notifiyInvalidEvent(e),Error(\"telemetry instrumentationKey required\")},e.prototype._notifiyInvalidEvent=function(e){this._notificationManager.eventsDiscarded([e],i.EventsDiscardedReason.InvalidEvent)},e}();t.AppInsightsCore=a}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(47),n(48),n(49),n(46),n(50),n(51),n(54),n(55),n(4)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var d=function(){function e(e,t){this._config=e,this._core=t,this._telemetryInitializers=[],\"undefined\"!=typeof window&&(this._sessionManager=new u._SessionManager(e),this.application=new i.Application,this.device=new r.Device,this.internal=new o.Internal(e),this.location=new a.Location,this.user=new c.User(e),this.operation=new s.Operation,this.session=new u.Session,this.sample=new l.Sample(e.sampleRate())),this._addDefaultTelemetryInitializers()}return e.prototype.addTelemetryInitializer=function(e){this._telemetryInitializers.push(e)},e.prototype.track=function(e){return p.CoreUtils.isNullOrUndefined(e)?n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TrackArgumentsNotSpecified,\"cannot call .track() with a null or undefined argument\",null,!0):(e.name===n.PageView.envelopeType&&n._InternalLogging.resetInternalMessageCount(),this.session&&\"string\"!=typeof this.session.id&&this._sessionManager.update(),this._track(e)),e},e.prototype._addDefaultTelemetryInitializers=function(){if(!this._config.isBrowserLinkTrackingEnabled()){var e=[\"/browserLinkSignalR/\",\"/__browserLink/\"];this.addTelemetryInitializer(function(t){if(t.name===n.RemoteDependencyData.envelopeType){var i=t.data;if(i&&i.baseData)for(var r=0;r<e.length;r++)if(i.baseData.name.indexOf(e[r])>=0)return!1}return!0})}},e.prototype._track=function(e){var t={};this.session&&(\"string\"==typeof this.session.id?this._applySessionContext(t,this.session):this._applySessionContext(t,this._sessionManager.automaticSession)),this._applyApplicationContext(t,this.application),this._applyDeviceContext(t,this.device),this._applyInternalContext(t,this.internal),this._applyLocationContext(t,this.location),this._applySampleContext(t,this.sample),this._applyUserContext(t,this.user),this._applyOperationContext(t,this.operation),e.tags.push(t),e.instrumentationKey=this._config.instrumentationKey();var i=!1;try{for(var r=this._telemetryInitializers.length,o=0;o<r;++o){var a=this._telemetryInitializers[o];if(a&&!1===a.apply(null,[e])){i=!0;break}}}catch(e){i=!0,n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryInitializerFailed,\"One of telemetry initializers failed, telemetry item will not be sent: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)},!0)}if(!i)if(e.name===n.Metric.envelopeType||this.sample.isSampledIn(e)){var s=this._config.instrumentationKey().replace(/-/g,\"\");e.name=e.name.replace(\"{0}\",s),this._core.track(e)}else n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.TelemetrySampledAndNotSent,\"Telemetry is sampled and not sent to the AI service.\",{SampleRate:this.sample.sampleRate},!0);return e},e.prototype._applyApplicationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.ver&&(e[i.applicationVersion]=t.ver),\"string\"==typeof t.build&&(e[i.applicationBuild]=t.build)}},e.prototype._applyDeviceContext=function(e,t){var i=new n.ContextTagKeys;t&&(\"string\"==typeof t.id&&(e[i.deviceId]=t.id),\"string\"==typeof t.ip&&(e[i.deviceIp]=t.ip),\"string\"==typeof t.language&&(e[i.deviceLanguage]=t.language),\"string\"==typeof t.locale&&(e[i.deviceLocale]=t.locale),\"string\"==typeof t.model&&(e[i.deviceModel]=t.model),void 0!==t.network&&(e[i.deviceNetwork]=t.network),\"string\"==typeof t.oemName&&(e[i.deviceOEMName]=t.oemName),\"string\"==typeof t.os&&(e[i.deviceOS]=t.os),\"string\"==typeof t.osversion&&(e[i.deviceOSVersion]=t.osversion),\"string\"==typeof t.resolution&&(e[i.deviceScreenResolution]=t.resolution),\"string\"==typeof t.type&&(e[i.deviceType]=t.type))},e.prototype._applyInternalContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.agentVersion&&(e[i.internalAgentVersion]=t.agentVersion),\"string\"==typeof t.sdkVersion&&(e[i.internalSdkVersion]=t.sdkVersion)}},e.prototype._applyLocationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.ip&&(e[i.locationIp]=t.ip)}},e.prototype._applyOperationContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.id&&(e[i.operationId]=t.id),\"string\"==typeof t.name&&(e[i.operationName]=t.name),\"string\"==typeof t.parentId&&(e[i.operationParentId]=t.parentId),\"string\"==typeof t.rootId&&(e[i.operationRootId]=t.rootId),\"string\"==typeof t.syntheticSource&&(e[i.operationSyntheticSource]=t.syntheticSource)}},e.prototype._applySampleContext=function(e,t){t&&(e.sampleRate=t.sampleRate)},e.prototype._applySessionContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.id&&(e[i.sessionId]=t.id),void 0!==t.isFirst&&(e[i.sessionIsFirst]=t.isFirst)}},e.prototype._applyUserContext=function(e,t){if(t){var i=new n.ContextTagKeys;\"string\"==typeof t.accountId&&(e[i.userAccountId]=t.accountId),\"string\"==typeof t.agent&&(e[i.userAgent]=t.agent),\"string\"==typeof t.id&&(e[i.userId]=t.id),\"string\"==typeof t.authenticatedId&&(e[i.userAuthUserId]=t.authenticatedId),\"string\"==typeof t.storeRegion&&(e[i.userStoreRegion]=t.storeRegion)}},e}();t.TelemetryContext=d}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Location=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){}}();t.Application=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){return function(){this.id=\"browser\",this.type=\"Browser\"}}();t.Device=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(13)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(e){this.sdkVersion=(e.sdkExtension()?e.sdkExtension()+\"_\":\"\")+\"javascript:\"+n.ApplicationInsights.Version}}();t.Internal=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){return function(){this.id=n.Util.newId(),window&&window.location&&window.location.pathname&&(this.name=window.location.pathname)}}();t.Operation=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(52),n(0)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e){this.INT_MAX_VALUE=2147483647,(e>100||e<0)&&(i._InternalLogging.throwInternal(i.LoggingSeverity.WARNING,i._InternalMessageId.SampleRateOutOfRange,\"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\",{samplingRate:e},!0),this.sampleRate=100),this.sampleRate=e,this.samplingScoreGenerator=new n.SamplingScoreGenerator}return e.prototype.isSampledIn=function(e){return!0},e}();t.Sample=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(53),n(0)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(){this.hashCodeGeneragor=new n.HashCodeScoreGenerator}return e.prototype.getSamplingScore=function(e){var t=new i.ContextTagKeys;return e.tags[t.userId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.userId]):e.tags[t.operationId]?this.hashCodeGeneragor.getHashCodeScore(e.tags[t.operationId]):Math.random()},e}();t.SamplingScoreGenerator=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.getHashCodeScore=function(t){return 100*(this.getHashCode(t)/e.INT_MAX_VALUE)},e.prototype.getHashCode=function(t){if(\"\"==t)return 0;for(;t.length<e.MIN_INPUT_LENGTH;)t=t.concat(t);for(var n=5381,i=0;i<t.length;++i)n=(n<<5)+n+t.charCodeAt(i),n&=n;return Math.abs(n)},e.INT_MAX_VALUE=2147483647,e.MIN_INPUT_LENGTH=8,e}();t.HashCodeScoreGenerator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(t){var i=n.Util.getCookie(e.userCookieName);if(i){var r=i.split(e.cookieSeparator);r.length>0&&(this.id=r[0])}if(this.config=t,!this.id){this.id=n.Util.newId();var o=new Date,a=n.Util.toISOStringForIE8(o);this.accountAcquisitionDate=a,o.setTime(o.getTime()+31536e6);var s=[this.id,a],l=this.config.cookieDomain?this.config.cookieDomain():void 0;n.Util.setCookie(e.userCookieName,s.join(e.cookieSeparator)+\";expires=\"+o.toUTCString(),l),n.Util.removeStorage(\"ai_session\")}this.accountId=t.accountId?t.accountId():void 0;var c=n.Util.getCookie(e.authUserCookieName);if(c){var u=(c=decodeURI(c)).split(e.cookieSeparator);u[0]&&(this.authenticatedId=u[0]),u.length>1&&u[1]&&(this.accountId=u[1])}}return e.prototype.setAuthenticatedUserContext=function(t,i,r){if(void 0===r&&(r=!1),!this.validateUserInput(t)||i&&!this.validateUserInput(i))n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SetAuthContextFailedAccountName,\"Setting auth user context failed. User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\",!0);else{this.authenticatedId=t;var o=this.authenticatedId;i&&(this.accountId=i,o=[this.authenticatedId,this.accountId].join(e.cookieSeparator)),r&&n.Util.setCookie(e.authUserCookieName,encodeURI(o),this.config.cookieDomain())}},e.prototype.clearAuthenticatedUserContext=function(){this.authenticatedId=null,this.accountId=null,n.Util.deleteCookie(e.authUserCookieName)},e.prototype.validateUserInput=function(e){return!(\"string\"!=typeof e||!e||e.match(/,|;|=| |\\|/))},e.cookieSeparator=\"|\",e.userCookieName=\"ai_user\",e.authUserCookieName=\"ai_authUser\",e}();t.User=i}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(0),n(56)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){return function(){}}();t.Session=r;var o=function(){function e(t){t||(t={}),\"function\"!=typeof t.sessionExpirationMs&&(t.sessionExpirationMs=function(){return e.acquisitionSpan}),\"function\"!=typeof t.sessionRenewalMs&&(t.sessionRenewalMs=function(){return e.renewalSpan}),this.config=t,this.automaticSession=new r}return e.prototype.update=function(){this.automaticSession.id||this.initializeAutomaticSession();var t=i.dateTime.Now(),n=t-this.automaticSession.acquisitionDate>this.config.sessionExpirationMs(),r=t-this.automaticSession.renewalDate>this.config.sessionRenewalMs();n||r?(this.automaticSession.isFirst=void 0,this.renew()):(!this.cookieUpdatedTimestamp||t-this.cookieUpdatedTimestamp>e.cookieUpdateInterval)&&(this.automaticSession.renewalDate=t,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate))},e.prototype.backup=function(){this.setStorage(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate)},e.prototype.initializeAutomaticSession=function(){var e=n.Util.getCookie(\"ai_session\");if(e&&\"function\"==typeof e.split)this.initializeAutomaticSessionWithData(e);else{var t=n.Util.getStorage(\"ai_session\");t&&this.initializeAutomaticSessionWithData(t)}this.automaticSession.id||(this.automaticSession.isFirst=!0,this.renew())},e.prototype.initializeAutomaticSessionWithData=function(e){var t=e.split(\"|\");t.length>0&&(this.automaticSession.id=t[0]);try{if(t.length>1){var i=+t[1];this.automaticSession.acquisitionDate=+new Date(i),this.automaticSession.acquisitionDate=this.automaticSession.acquisitionDate>0?this.automaticSession.acquisitionDate:0}if(t.length>2){var r=+t[2];this.automaticSession.renewalDate=+new Date(r),this.automaticSession.renewalDate=this.automaticSession.renewalDate>0?this.automaticSession.renewalDate:0}}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.ErrorParsingAISessionCookie,\"Error parsing ai_session cookie, session will be reset: \"+n.Util.getExceptionName(e),{exception:n.Util.dump(e)})}0==this.automaticSession.renewalDate&&n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SessionRenewalDateIsZero,\"AI session renewal date is 0, session will be reset.\")},e.prototype.renew=function(){var e=i.dateTime.Now();this.automaticSession.id=n.Util.newId(),this.automaticSession.acquisitionDate=e,this.automaticSession.renewalDate=e,this.setCookie(this.automaticSession.id,this.automaticSession.acquisitionDate,this.automaticSession.renewalDate),n.Util.canUseLocalStorage()||n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.BrowserDoesNotSupportLocalStorage,\"Browser does not support local storage. Session durations will be inaccurate.\")},e.prototype.setCookie=function(e,t,r){var o=t+this.config.sessionExpirationMs(),a=r+this.config.sessionRenewalMs(),s=new Date,l=[e,t,r];o<a?s.setTime(o):s.setTime(a);var c=this.config.cookieDomain?this.config.cookieDomain():null;n.Util.setCookie(\"ai_session\",l.join(\"|\")+\";expires=\"+s.toUTCString(),c),this.cookieUpdatedTimestamp=i.dateTime.Now()},e.prototype.setStorage=function(e,t,i){n.Util.setStorage(\"ai_session\",[e,t,i].join(\"|\"))},e.acquisitionSpan=864e5,e.renewalSpan=18e5,e.cookieUpdateInterval=6e4,e}();t._SessionManager=o}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.IsNullOrUndefined=function(e){return void 0===e||null===e},e}();t.extensions=n;var i=function(){function e(){}return e.GetLength=function(e){var t=0;if(!n.IsNullOrUndefined(e)){var i=\"\";try{i=e.toString()}catch(e){}t=i.length,t=isNaN(t)?0:t}return t},e}();t.stringUtils=i;var r=function(){function e(){}return e.Now=window.performance&&window.performance.now&&window.performance.timing?function(){return window.performance.now()+window.performance.timing.navigationStart}:function(){return(new Date).getTime()},e.GetDuration=function(e,t){var i=null;return 0===e||0===t||n.IsNullOrUndefined(e)||n.IsNullOrUndefined(t)||(i=t-e),i},e}();t.dateTime=r;var o=function(){function e(){}return e.AttachEvent=function(e,t,i){var r=!1;return n.IsNullOrUndefined(e)||(n.IsNullOrUndefined(e.attachEvent)?n.IsNullOrUndefined(e.addEventListener)||(e.addEventListener(t,i,!1),r=!0):(e.attachEvent(\"on\"+t,i),r=!0)),r},e.DetachEvent=function(e,t,i){n.IsNullOrUndefined(e)||(n.IsNullOrUndefined(e.detachEvent)?n.IsNullOrUndefined(e.removeEventListener)||e.removeEventListener(t,i,!1):e.detachEvent(\"on\"+t,i))},e}();t.EventHelper=o}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(){}return e.createItem=function(t,n,r,o,a){if(i.CoreUtils.isNullOrUndefined(t)||i.CoreUtils.isNullOrUndefined(n)||i.CoreUtils.isNullOrUndefined(r))throw Error(\"pageView doesn't contain all required fields\");return e.creator.create(t,n,r,o,a)},e.prototype.create=function(e,t,r,o,a){if(r=n.DataSanitizer.sanitizeString(r)||n.Util.NotSpecified,t===n.PageView.dataType){var s={name:r,timestamp:new Date,instrumentationKey:\"\",ctx:a||{},tags:[],data:{},baseType:t,baseData:e};if(!i.CoreUtils.isNullOrUndefined(o))for(var l in o)o.hasOwnProperty(l)&&(s.data[l]=o[l]);return s}throw Error(\"Not implemented\")},e.creator=new e,e}();t.TelemetryItemCreator=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(4),n(12),n(0),n(59)],void 0===(r=function(e,t,n,i,r,o){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(t){t.queue=t.queue||[];var n=t.config||{};n&&!n.instrumentationKey&&(n=t,i.ApplicationInsights.Version=\"2.0.0\"),this.appInsights=new i.ApplicationInsights,n=e.getDefaultConfig(n,this.appInsights.identifier),this.snippet=t,this.config=n}return e.prototype.loadAppInsights=function(){this.core=new n.AppInsightsCore;var e=[],t=new o.Sender;return e.push(t),e.push(this.appInsights),this.core.initialize(this.config,e),this.appInsights.initialize(this.config,this.core,e),t.initialize(this.config),this.appInsights},e.prototype.emptyQueue=function(){try{if(r.Util.isArray(this.snippet.queue)){for(var e=this.snippet.queue.length,t=0;t<e;t++){(0,this.snippet.queue[t])()}this.snippet.queue=void 0,delete this.snippet.queue}}catch(e){e&&\"function\"==typeof e.toString&&e.toString()}},e.prototype.pollInteralLogs=function(e){},e.prototype.addHousekeepingBeforeUnload=function(e){if(!e.config.disableFlushOnBeforeUnload&&\"onbeforeunload\"in window){r.Util.addEventHandler(\"beforeunload\",function(){this.core.getTransmissionControl().flush(!0),e.context._sessionManager.backup()})||r._InternalLogging.throwInternal(r.LoggingSeverity.CRITICAL,r._InternalMessageId.FailedToAddHandlerForOnBeforeUnload,\"Could not add handler for beforeunload\")}},e.getDefaultConfig=function(e,t){e||(e={}),e&&(t=t||\"AppAnalytics\");var n=e.extensions?e.extensions[t]:{};return e.endpointUrl=e.endpointUrl||\"https://dc.services.visualstudio.com/v2/track\",n.sessionRenewalMs=18e5,n.sessionExpirationMs=864e5,n.enableDebug=r.Util.stringToBoolOrDefault(n.enableDebug),n.disableExceptionTracking=r.Util.stringToBoolOrDefault(n.disableExceptionTracking),n.verboseLogging=r.Util.stringToBoolOrDefault(n.verboseLogging),n.diagnosticLogInterval=n.diagnosticLogInterval||1e4,n.autoTrackPageVisitTime=r.Util.stringToBoolOrDefault(n.autoTrackPageVisitTime),(isNaN(n.samplingPercentage)||n.samplingPercentage<=0||n.samplingPercentage>=100)&&(n.samplingPercentage=100),n.disableAjaxTracking=r.Util.stringToBoolOrDefault(n.disableAjaxTracking),n.maxAjaxCallsPerView=isNaN(n.maxAjaxCallsPerView)?500:n.maxAjaxCallsPerView,n.disableCorrelationHeaders=r.Util.stringToBoolOrDefault(n.disableCorrelationHeaders),n.correlationHeaderExcludedDomains=n.correlationHeaderExcludedDomains||[\"*.blob.core.windows.net\",\"*.blob.core.chinacloudapi.cn\",\"*.blob.core.cloudapi.de\",\"*.blob.core.usgovcloudapi.net\"],n.disableFlushOnBeforeUnload=r.Util.stringToBoolOrDefault(n.disableFlushOnBeforeUnload),n.isCookieUseDisabled=r.Util.stringToBoolOrDefault(n.isCookieUseDisabled),n.isStorageUseDisabled=r.Util.stringToBoolOrDefault(n.isStorageUseDisabled),n.isBrowserLinkTrackingEnabled=r.Util.stringToBoolOrDefault(n.isBrowserLinkTrackingEnabled),n.enableCorsCorrelation=r.Util.stringToBoolOrDefault(n.enableCorsCorrelation),e},e}();t.Initialization=a}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(60)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.Sender=n.Sender}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r;i=[n,t,n(62),n(63),n(64),n(65),n(66),n(61),n(67),n(68),n(69),n(70),n(0),n(4)],void 0===(r=function(e,t,n,i,r,o,a,s,l,c,u,p,d,f){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var g=function(){function e(){this.priority=200,this._XMLHttpRequestSupported=!1}return e.prototype.pause=function(){throw new Error(\"Method not implemented.\")},e.prototype.resume=function(){throw new Error(\"Method not implemented.\")},e.prototype.flush=function(){try{this.triggerSend()}catch(e){d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.FlushFailed,\"flush failed, telemetry will not be collected: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}},e.prototype.teardown=function(){throw new Error(\"Method not implemented.\")},e.prototype.initialize=function(t){(this.identifier=\"AppInsightsChannelPlugin\",this._consecutiveErrors=0,this._retryAt=null,this._lastSend=0,this._config=e._getDefaultAppInsightsChannelConfig(t,this.identifier),this._sender=null,this._buffer=d.Util.canUseSessionStorage()&&this._config.enableSessionStorageBuffer?new n.SessionStorageSendBuffer(this._config):new n.ArraySendBuffer(this._config),!this._config.isBeaconApiDisabled()&&d.Util.IsBeaconApiSupported())?this._sender=this._beaconSender:\"undefined\"!=typeof XMLHttpRequest&&(\"withCredentials\"in new XMLHttpRequest?(this._sender=this._xhrSender,this._XMLHttpRequestSupported=!0):\"undefined\"!=typeof XDomainRequest&&(this._sender=this._xdrSender))},e.prototype.processTelemetry=function(t){try{if(this._config.disableTelemetry())return;if(!t)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.CannotSendEmptyTelemetry,\"Cannot send empty telemetry\");if(!this._sender)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.SenderNotInitialized,\"Sender was not initialized\");if(!e._validate(t))return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TelemetryEnvelopeInvalid,\"Invalid telemetry envelope\");var n=e._constructEnvelope(t);if(!n)return void d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.CreateEnvelopeError,\"Unable to create an AppInsights envelope\");var i=p.Serializer.serialize(n),r=this._buffer.getItems(),o=this._buffer.batchPayloads(r);o&&o.length+i.length>this._config.maxBatchSizeInBytes()&&this.triggerSend(),this._buffer.enqueue(i),this._setupTimer()}catch(e){d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.FailedAddingTelemetryToBuffer,\"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}f.CoreUtils.isNullOrUndefined(this._nextPlugin)||this._nextPlugin.processTelemetry(t)},e.prototype.setNextPlugin=function(e){this._nextPlugin=e},e.prototype._xhrReadyStateChange=function(e,t,n){if(4===e.readyState){var i=null;this._appId||(i=this._parseResponse(e.responseText||e.response))&&i.appId&&(this._appId=i.appId),(e.status<200||e.status>=300)&&0!==e.status?!this._config.isRetryDisabled()&&this._isRetriable(e.status)?(this._resendPayload(t),d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\". Response code \"+e.status+\". Will retry to send \"+t.length+\" items.\")):this._onError(t,this._formatErrorMessageXhr(e)):206===e.status?(i||(i=this._parseResponse(e.responseText||e.response)),i&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,i):this._onError(t,this._formatErrorMessageXhr(e))):(this._consecutiveErrors=0,this._onSuccess(t,n))}},e.prototype.triggerSend=function(e){void 0===e&&(e=!0);try{if(this._config.disableTelemetry())this._buffer.clear();else{if(this._buffer.count()>0){var t=this._buffer.getItems();this._sender(t,e)}this._lastSend=+new Date}clearTimeout(this._timeoutHandle),this._timeoutHandle=null,this._retryAt=null}catch(e){(!d.Util.getIEVersion()||d.Util.getIEVersion()>9)&&d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TransmissionFailed,\"Telemetry transmission failed, some telemetry will be lost: \"+d.Util.getExceptionName(e),{exception:d.Util.dump(e)})}},e.prototype._onError=function(e,t,n){d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.OnError,\"Failed to send telemetry.\",{message:t}),this._buffer.clearSent(e)},e.prototype._onPartialSuccess=function(e,t){for(var n=[],i=[],r=0,o=t.errors.reverse();r<o.length;r++){var a=o[r],s=e.splice(a.index,1)[0];this._isRetriable(a.statusCode)?i.push(s):n.push(s)}e.length>0&&this._onSuccess(e,t.itemsAccepted),n.length>0&&this._onError(n,this._formatErrorMessageXhr(null,[\"partial success\",t.itemsAccepted,\"of\",t.itemsReceived].join(\" \"))),i.length>0&&(this._resendPayload(i),d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\"Partial success. Delivered: \"+e.length+\", Failed: \"+n.length+\". Will retry to send \"+i.length+\" our of \"+t.itemsReceived+\" items\"))},e.prototype._onSuccess=function(e,t){this._buffer.clearSent(e)},e.prototype._xdrOnLoad=function(e,t){if(!e||e.responseText+\"\"!=\"200\"&&\"\"!==e.responseText){var n=this._parseResponse(e.responseText);n&&n.itemsReceived&&n.itemsReceived>n.itemsAccepted&&!this._config.isRetryDisabled()?this._onPartialSuccess(t,n):this._onError(t,this._formatErrorMessageXdr(e))}else this._consecutiveErrors=0,this._onSuccess(t,0)},e._constructEnvelope=function(e){switch(e.baseType){case d.Event.dataType:return i.EventEnvelopeCreator.EventEnvelopeCreator.Create(e);case d.Trace.dataType:return i.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(e);case d.PageView.dataType:return i.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(e);case d.PageViewPerformance.dataType:return i.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(e);case d.Exception.dataType:return i.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(e);case d.Metric.dataType:return i.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(e);case d.RemoteDependencyData.dataType:return i.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(e);default:return null}},e._getDefaultAppInsightsChannelConfig=function(e,t){var n={},i=e.extensions&&e.extensions[t]?e.extensions[t]:{};return n.endpointUrl=function(){return e.endpointUrl||\"https://dc.services.visualstudio.com/v2/track\"},n.emitLineDelimitedJson=function(){return d.Util.stringToBoolOrDefault(i.emitLineDelimitedJson)},n.maxBatchInterval=function(){return isNaN(i.maxBatchInterval)?15e3:i.maxBatchInterval},n.maxBatchSizeInBytes=function(){return i.maxBatchSizeInBytes>0?i.maxBatchSizeInBytes:102400},n.disableTelemetry=function(){return d.Util.stringToBoolOrDefault(i.disableTelemetry)},n.enableSessionStorageBuffer=function(){return d.Util.stringToBoolOrDefault(i.enableSessionStorageBuffer,!0)},n.isRetryDisabled=function(){return d.Util.stringToBoolOrDefault(i.isRetryDisabled)},n.isBeaconApiDisabled=function(){return d.Util.stringToBoolOrDefault(i.isBeaconApiDisabled,!0)},n},e._validate=function(e){switch(e.baseType){case d.Event.dataType:return r.EventValidator.EventValidator.Validate(e);case d.Trace.dataType:return o.TraceValidator.TraceValidator.Validate(e);case d.Exception.dataType:return a.ExceptionValidator.ExceptionValidator.Validate(e);case d.Metric.dataType:return s.MetricValidator.MetricValidator.Validate(e);case d.PageView.dataType:return c.PageViewValidator.PageViewValidator.Validate(e);case d.PageViewPerformance.dataType:return l.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(e);case d.RemoteDependencyData.dataType:return u.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(e)}return!1},e.prototype._beaconSender=function(e,t){var n=this._config.endpointUrl(),i=this._buffer.batchPayloads(e),r=new Blob([i],{type:\"text/plain;charset=UTF-8\"});navigator.sendBeacon(n,r)?this._buffer.markAsSent(e):d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.TransmissionFailed,\". Failed to send telemetry with Beacon API.\")},e.prototype._xhrSender=function(e,t){var n=this,i=new XMLHttpRequest;i[d.DisabledPropertyName]=!0,i.open(\"POST\",this._config.endpointUrl(),t),i.setRequestHeader(\"Content-type\",\"application/json\"),d.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())&&i.setRequestHeader(d.RequestHeaders.sdkContextHeader,d.RequestHeaders.sdkContextHeaderAppIdRequest),i.onreadystatechange=function(){return n._xhrReadyStateChange(i,e,e.length)},i.onerror=function(t){return n._onError(e,n._formatErrorMessageXhr(i),t)};var r=this._buffer.batchPayloads(e);i.send(r),this._buffer.markAsSent(e)},e.prototype._parseResponse=function(e){try{if(e&&\"\"!==e){var t=JSON.parse(e);if(t&&t.itemsReceived&&t.itemsReceived>=t.itemsAccepted&&t.itemsReceived-t.itemsAccepted==t.errors.length)return t}}catch(t){d._InternalLogging.throwInternal(d.LoggingSeverity.CRITICAL,d._InternalMessageId.InvalidBackendResponse,\"Cannot parse the response. \"+d.Util.getExceptionName(t),{response:e})}return null},e.prototype._resendPayload=function(e){if(e&&0!==e.length){this._buffer.clearSent(e),this._consecutiveErrors++;for(var t=0,n=e;t<n.length;t++){var i=n[t];this._buffer.enqueue(i)}this._setRetryTime(),this._setupTimer()}},e.prototype._setRetryTime=function(){var e;if(this._consecutiveErrors<=1)e=10;else{var t=(Math.pow(2,this._consecutiveErrors)-1)/2,n=Math.floor(Math.random()*t*10)+1;e=Math.max(Math.min(n,3600),10)}var i=Date.now()+1e3*e;this._retryAt=i},e.prototype._setupTimer=function(){var e=this;if(!this._timeoutHandle){var t=this._retryAt?Math.max(0,this._retryAt-Date.now()):0,n=Math.max(this._config.maxBatchInterval(),t);this._timeoutHandle=setTimeout(function(){e.triggerSend()},n)}},e.prototype._isRetriable=function(e){return 408==e||429==e||500==e||503==e},e.prototype._formatErrorMessageXhr=function(e,t){return e?\"XMLHttpRequest,Status:\"+e.status+\",Response:\"+e.responseText||e.response||\"\":t},e.prototype._xdrSender=function(e,t){var n=this,i=new XDomainRequest;i.onload=function(){return n._xdrOnLoad(i,e)},i.onerror=function(t){return n._onError(e,n._formatErrorMessageXdr(i),t)};var r=window.location.protocol;if(0!==this._config.endpointUrl().lastIndexOf(r,0))return d._InternalLogging.throwInternal(d.LoggingSeverity.WARNING,d._InternalMessageId.TransmissionFailed,\". Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\"),void this._buffer.clear();var o=this._config.endpointUrl().replace(/^(https?:)/,\"\");i.open(\"POST\",o);var a=this._buffer.batchPayloads(e);i.send(a),this._buffer.markAsSent(e)},e.prototype._formatErrorMessageXdr=function(e,t){return e?\"XDomainRequest,Response:\"+e.responseText||\"\":t},e}();t.Sender=g}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!1},e.MetricValidator=new e,e}();t.MetricValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(e){this._config=e,this._buffer=[]}return e.prototype.enqueue=function(e){this._buffer.push(e)},e.prototype.count=function(){return this._buffer.length},e.prototype.clear=function(){this._buffer.length=0},e.prototype.getItems=function(){return this._buffer.slice(0)},e.prototype.batchPayloads=function(e){return e&&e.length>0?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},e.prototype.markAsSent=function(e){this.clear()},e.prototype.clearSent=function(e){},e}();t.ArraySendBuffer=i;var r=function(){function e(t){this._bufferFullMessageSent=!1,this._config=t;var n=this.getBuffer(e.BUFFER_KEY),i=this.getBuffer(e.SENT_BUFFER_KEY);this._buffer=n.concat(i),this._buffer.length>e.MAX_BUFFER_SIZE&&(this._buffer.length=e.MAX_BUFFER_SIZE),this.setBuffer(e.SENT_BUFFER_KEY,[]),this.setBuffer(e.BUFFER_KEY,this._buffer)}return e.prototype.enqueue=function(t){this._buffer.length>=e.MAX_BUFFER_SIZE?this._bufferFullMessageSent||(n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.SessionStorageBufferFull,\"Maximum buffer size reached: \"+this._buffer.length,!0),this._bufferFullMessageSent=!0):(this._buffer.push(t),this.setBuffer(e.BUFFER_KEY,this._buffer))},e.prototype.count=function(){return this._buffer.length},e.prototype.clear=function(){this._buffer.length=0,this.setBuffer(e.BUFFER_KEY,[]),this.setBuffer(e.SENT_BUFFER_KEY,[]),this._bufferFullMessageSent=!1},e.prototype.getItems=function(){return this._buffer.slice(0)},e.prototype.batchPayloads=function(e){return e&&e.length>0?this._config.emitLineDelimitedJson()?e.join(\"\\n\"):\"[\"+e.join(\",\")+\"]\":null},e.prototype.markAsSent=function(t){this._buffer=this.removePayloadsFromBuffer(t,this._buffer),this.setBuffer(e.BUFFER_KEY,this._buffer);var i=this.getBuffer(e.SENT_BUFFER_KEY);i instanceof Array&&t instanceof Array&&((i=i.concat(t)).length>e.MAX_BUFFER_SIZE&&(n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.SessionStorageBufferFull,\"Sent buffer reached its maximum size: \"+i.length,!0),i.length=e.MAX_BUFFER_SIZE),this.setBuffer(e.SENT_BUFFER_KEY,i))},e.prototype.clearSent=function(t){var n=this.getBuffer(e.SENT_BUFFER_KEY);n=this.removePayloadsFromBuffer(t,n),this.setBuffer(e.SENT_BUFFER_KEY,n)},e.prototype.removePayloadsFromBuffer=function(e,t){var n=[];for(var i in t){var r=!1;for(var o in e)if(e[o]===t[i]){r=!0;break}r||n.push(t[i])}return n},e.prototype.getBuffer=function(e){try{var t=n.Util.getSessionStorage(e);if(t){var i=JSON.parse(t);if(i)return i}}catch(t){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.FailedToRestoreStorageBuffer,\" storage key: \"+e+\", \"+n.Util.getExceptionName(t),{exception:n.Util.dump(t)})}return[]},e.prototype.setBuffer=function(e,t){try{var i=JSON.stringify(t);n.Util.setSessionStorage(e,i)}catch(t){n.Util.setSessionStorage(e,JSON.stringify([])),n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.FailedToSetStorageBuffer,\" storage key: \"+e+\", \"+n.Util.getExceptionName(t)+\". Buffer cleared\",{exception:n.Util.dump(t)})}},e.BUFFER_KEY=\"AI_buffer\",e.SENT_BUFFER_KEY=\"AI_sentBuffer\",e.MAX_BUFFER_SIZE=2e3,e}();t.SessionStorageSendBuffer=r}.apply(t,i))||(e.exports=r)},function(e,t,n){var i,r,o=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}();i=[n,t,n(0),n(4)],void 0===(r=function(e,t,n,i){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextTagKeys=[\"ai.application.ver\",\"ai.application.build\",\"ai.application.typeId\",\"ai.application.applicationId\",\"ai.application.layer\",\"ai.device.id\",\"ai.device.ip\",\"ai.device.language\",\"ai.device.locale\",\"ai.device.model\",\"ai.device.friendlyName\",\"ai.device.network\",\"ai.device.networkName\",\"ai.device.oemName\",\"ai.device.os\",\"ai.device.osVersion\",\"ai.device.roleInstance\",\"ai.device.roleName\",\"ai.device.screenResolution\",\"ai.device.type\",\"ai.device.machineName\",\"ai.device.vmName\",\"ai.device.browser\",\"ai.device.browserVersion\",\"ai.location.ip\",\"ai.location.country\",\"ai.location.province\",\"ai.location.city\",\"ai.operation.id\",\"ai.operation.name\",\"ai.operation.parentId\",\"ai.operation.rootId\",\"ai.operation.syntheticSource\",\"ai.operation.correlationVector\",\"ai.session.id\",\"ai.session.isFirst\",\"ai.session.isNew\",\"ai.user.accountAcquisitionDate\",\"ai.user.accountId\",\"ai.user.userAgent\",\"ai.user.id\",\"ai.user.storeRegion\",\"ai.user.authUserId\",\"ai.user.anonUserAcquisitionDate\",\"ai.user.authUserAcquisitionDate\",\"ai.cloud.name\",\"ai.cloud.role\",\"ai.cloud.roleVer\",\"ai.cloud.roleInstance\",\"ai.cloud.environment\",\"ai.cloud.location\",\"ai.cloud.deploymentUnit\",\"ai.internal.sdkVersion\",\"ai.internal.agentVersion\",\"ai.internal.nodeName\"];var r=function(){function e(){}return e.extractProperties=function(e){var t=null;for(var n in e)if(e.hasOwnProperty(n)){var i=e[n];\"number\"!=typeof i&&(t||(t={}),t[n]=i)}return t},e.extractPropsAndMeasurements=function(e,t,n){if(!i.CoreUtils.isNullOrUndefined(e))for(var r in e)if(e.hasOwnProperty(r)){var o=e[r];\"number\"==typeof o?n[r]=o:t[r]=o}},e.createEnvelope=function(e,i,r){var o=new n.Envelope(r,e);o.iKey=i.instrumentationKey;var a=i.instrumentationKey.replace(/-/g,\"\");for(var s in o.name=o.name.replace(\"{0}\",a),i.ctx)i.ctx.hasOwnProperty(s)&&t.ContextTagKeys.indexOf(s)>=0&&(o.tags[s]=i.ctx[s]);return i.tags.forEach(function(e){for(var n in e)e.hasOwnProperty(n)&&t.ContextTagKeys.indexOf(n)>=0&&(o.tags[n]=e[n])}),o},e}();t.EnvelopeCreator=r;var a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,o,t);var a=e.baseData.id,s=e.baseData.absoluteUrl,l=e.baseData.command,c=e.baseData.totalTime,u=e.baseData.success,p=e.baseData.resultCode,d=e.baseData.method,f=new n.RemoteDependencyData(a,s,l,c,u,p,d,o,t),g=new n.Data(n.RemoteDependencyData.dataType,f);return r.createEnvelope(n.RemoteDependencyData.envelopeType,e,g)},t.DependencyEnvelopeCreator=new t,t}(r);t.DependencyEnvelopeCreator=a;var s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=new n.Event(a,t,o),l=new n.Data(n.Event.dataType,s);return r.createEnvelope(n.Event.envelopeType,e,l)},t.EventEnvelopeCreator=new t,t}(r);t.EventEnvelopeCreator=s;var l=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.exception,s=e.baseData.severityLevel,l=new n.Exception(a,t,o,s),c=new n.Data(n.Exception.dataType,l);return r.createEnvelope(n.Exception.envelopeType,e,c)},t.ExceptionEnvelopeCreator=new t,t}(r);t.ExceptionEnvelopeCreator=l;var c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t=r.extractProperties(e.data),o=e.baseData.name,a=e.baseData.average,s=e.baseData.sampleCount,l=e.baseData.min,c=e.baseData.max,u=new n.Metric(o,a,s,l,c,t),p=new n.Data(n.Metric.dataType,u);return r.createEnvelope(n.Metric.envelopeType,e,p)},t.MetricEnvelopeCreator=new t,t}(r);t.MetricEnvelopeCreator=c;var u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=e.baseData.uri,l=e.baseData.duration;if(i.CoreUtils.isNullOrUndefined(e.baseData.refUri)||(t.refUri=e.baseData.refUri),i.CoreUtils.isNullOrUndefined(e.baseData.pageType)||(t.pageType=e.baseData.pageType),i.CoreUtils.isNullOrUndefined(e.baseData.isLoggedIn)||(t.isLoggedIn=e.baseData.isLoggedIn),!i.CoreUtils.isNullOrUndefined(e.baseData.pageTags)){var c=e.baseData.pageTags;for(var u in c)c.hasOwnProperty(u)&&(t[u]=c[u])}var p=new n.PageView(a,s,l,t,o),d=new n.Data(n.PageView.dataType,p);return r.createEnvelope(n.PageView.envelopeType,e,d)},t.PageViewEnvelopeCreator=new t,t}(r);t.PageViewEnvelopeCreator=u;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t={},o={};r.extractPropsAndMeasurements(e.data,t,o);var a=e.baseData.name,s=e.baseData.uri,l=e.baseData.duration,c=new n.PageViewPerformance(a,s,l,t,o),u=new n.Data(n.PageViewPerformance.dataType,c);return r.createEnvelope(n.PageViewPerformance.envelopeType,e,u)},t.PageViewPerformanceEnvelopeCreator=new t,t}(r);t.PageViewPerformanceEnvelopeCreator=p;var d=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.Create=function(e){i.CoreUtils.isNullOrUndefined(e.baseData)&&n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.TelemetryEnvelopeInvalid,\"telemetryItem.baseData cannot be null.\");var t=e.baseData.message,o=e.baseData.severityLevel,a=r.extractProperties(e.data),s=new n.Trace(t,a,o),l=new n.Data(n.Trace.dataType,s);return r.createEnvelope(n.Trace.envelopeType,e,l)},t.TraceEnvelopeCreator=new t,t}(r);t.TraceEnvelopeCreator=d}.apply(t,i))||(e.exports=r)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.EventValidator=new e,e}();t.EventValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.TraceValidator=new e,e}();t.TraceValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e._validateExceptions=function(e){return!0},e.ExceptionValidator=new e,e}();t.ExceptionValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.PageViewPerformanceValidator=new e,e}();t.PageViewPerformanceValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.PageViewValidator=new e,e}();t.PageViewValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(){function e(){}return e.prototype.Validate=function(e){return!0},e.RemoteDepdencyValidator=new e,e}();t.RemoteDepdencyValidator=n}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,r;i=[n,t,n(0)],void 0===(r=function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var i=function(){function e(){}return e.serialize=function(t){var n=e._serializeObject(t,\"root\");return JSON.stringify(n)},e._serializeObject=function(t,i){var r={};if(!t)return n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.CannotSerializeObject,\"cannot serialize object because it is null or undefined\",{name:i},!0),r;if(t.__aiCircularRefCheck)return n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CircularReferenceDetected,\"Circular reference detected while serializing object\",{name:i},!0),r;if(!t.aiDataContract){if(\"measurements\"===i)r=e._serializeStringMap(t,\"number\",i);else if(\"properties\"===i)r=e._serializeStringMap(t,\"string\",i);else if(\"tags\"===i)r=e._serializeStringMap(t,\"string\",i);else if(n.Util.isArray(t))r=e._serializeArray(t,i);else{n._InternalLogging.throwInternal(n.LoggingSeverity.WARNING,n._InternalMessageId.CannotSerializeObjectNonSerializable,\"Attempting to serialize an object which does not implement ISerializable\",{name:i},!0);try{JSON.stringify(t),r=t}catch(e){n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.CannotSerializeObject,e&&\"function\"==typeof e.toString?e.toString():\"Error serializing object\",null,!0)}}return r}for(var o in t.__aiCircularRefCheck=!0,t.aiDataContract){var a,s=t.aiDataContract[o],l=\"function\"==typeof s?s()&n.FieldType.Required:s&n.FieldType.Required,c=\"function\"==typeof s?s()&n.FieldType.Hidden:s&n.FieldType.Hidden,u=s&n.FieldType.Array,p=void 0!==t[o],d=\"object\"==typeof t[o]&&null!==t[o];if(!l||p||u){if(!c)void 0!==(a=d?u?e._serializeArray(t[o],o):e._serializeObject(t[o],o):t[o])&&(r[o]=a)}else n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.MissingRequiredFieldSpecification,\"Missing required field specification. The field is required but not present on source\",{field:o,name:i})}return delete t.__aiCircularRefCheck,r},e._serializeArray=function(t,i){var r=void 0;if(t)if(n.Util.isArray(t)){r=[];for(var o=0;o<t.length;o++){var a=t[o],s=e._serializeObject(a,i+\"[\"+o+\"]\");r.push(s)}}else n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,n._InternalMessageId.ItemNotInArray,\"This field was specified as an array in the contract but the item is not an array.\\r\\n\",{name:i},!0);return r},e._serializeStringMap=function(e,t,i){var r=void 0;if(e)for(var o in r={},e){var a=e[o];if(\"string\"===t)void 0===a?r[o]=\"undefined\":null===a?r[o]=\"null\":a.toString?r[o]=a.toString():r[o]=\"invalid field: toString() is not defined.\";else if(\"number\"===t)if(void 0===a)r[o]=\"undefined\";else if(null===a)r[o]=\"null\";else{var s=parseFloat(a);isNaN(s)?r[o]=\"NaN\":r[o]=s}else r[o]=\"invalid field: \"+i+\" is of unknown type.\",n._InternalLogging.throwInternal(n.LoggingSeverity.CRITICAL,r[o],null,!0)}return r},e}();t.Serializer=i}.apply(t,i))||(e.exports=r)}])});\n//# sourceMappingURL=aisdk.0.0.9.js.map"
  },
  {
    "path": "AISKU/examples/span-usage-example.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Example showing how to use the ApplicationInsights span functionality\n * with the provider pattern.\n */\n\nimport { ApplicationInsights, eOTelSpanKind } from \"@microsoft/applicationinsights-web\";\n\n// Initialize ApplicationInsights\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: \"YOUR_CONNECTION_STRING_HERE\"\n    }\n});\nappInsights.loadAppInsights();\n\n// Example usage\nfunction exampleSpanUsage() {\n    // Start a span\n    const span = appInsights.startSpan(\"example-operation\", {\n        kind: eOTelSpanKind.CLIENT,\n        attributes: {\n            \"operation.name\": \"example\",\n            \"user.id\": \"12345\"\n        }\n    });\n\n    if (span) {\n        try {\n            // Do some work...\n            span.setAttribute(\"result\", \"success\");\n            span.setAttribute(\"duration\", 100);\n            \n            // Create a child span\n            const childSpan = appInsights.startSpan(\"child-operation\", {\n                kind: eOTelSpanKind.INTERNAL,\n                startTime: Date.now()\n            }, span.spanContext());\n\n            if (childSpan) {\n                // Do child work...\n                childSpan.setAttribute(\"child.data\", \"value\");\n                childSpan.end();\n            }\n\n        } catch (error: any) {\n            span.setAttribute(\"error\", true);\n            span.setAttribute(\"error.message\", error.message);\n        } finally {\n            span.end();\n        }\n    }\n}\n\n// Example of checking if trace provider is available\nfunction checkTraceProviderAvailability() {\n    const provider = appInsights.getTraceProvider();\n    if (provider && provider.isAvailable()) {\n        console.log(`Trace provider available: ${provider.getProviderId()}`);\n        exampleSpanUsage();\n    } else {\n        console.log(\"No trace provider available\");\n    }\n}\n\nexport { exampleSpanUsage, checkTraceProviderAvailability };\n"
  },
  {
    "path": "AISKU/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-web\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - Web\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-web.js\",\n    \"module\": \"dist-es5/applicationinsights-web.js\",\n    \"types\": \"types/applicationinsights-web.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt aisku\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"build:snippet\": \"grunt snippetvnext\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt aiskuunittests\",\n        \"mintest\": \"grunt aisku-mintests\",\n        \"perftest\": \"grunt aiskuperf\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../scripts/dtsgen.js 'Microsoft.ApplicationInsights'\",\n        \"sri\": \"node ../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt aisku-min\",\n        \"ai-restore\": \"grunt aisku-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-offlinechannel-js\": \"0.4.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"sinon\": \"^7.3.1\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"finalhandler\": \"^1.1.1\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"selenium-server-standalone-jar\": \"^3.141.5\",\n        \"serve-static\": \"^1.13.2\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"puppeteer\": \"^24.40.0\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-analytics-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-channel-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-cfgsync-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-dependencies-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-properties-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "AISKU/rollup.config.js",
    "content": "import { createConfig } from \"../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"Init\";\nconst browserOutputName = \"ai\";\nconst entryPointName = \"applicationinsights-web\";\nconst outputName = \"applicationinsights-web\"; \n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Web, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ \"applicationinsights-web\" ]);"
  },
  {
    "path": "AISKU/samples/HelloWorld/index-snippet.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Hello World!</title>\n\n    <!-- import Application Insights JS SDK from CDN -->\n    <script type=\"text/javascript\">!function(T,l,y){var S=T.location,k=\"script\",D=\"instrumentationKey\",C=\"ingestionendpoint\",I=\"disableExceptionTracking\",E=\"ai.device.\",b=\"toLowerCase\",w=\"crossOrigin\",N=\"POST\",e=\"appInsightsSDK\",t=y.name||\"appInsights\";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:\"5\",version:2,config:d};function v(e,t){var n={},a=\"Browser\";return n[E+\"id\"]=a[b](),n[E+\"type\"]=a,n[\"ai.operation.name\"]=S&&S.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=\"\"+e;return 1===t.length&&(t=\"0\"+t),t}return e.getUTCFullYear()+\"-\"+t(1+e.getUTCMonth())+\"-\"+t(e.getUTCDate())+\"T\"+t(e.getUTCHours())+\":\"+t(e.getUTCMinutes())+\":\"+t(e.getUTCSeconds())+\".\"+((e.getUTCMilliseconds()/1e3).toFixed(3)+\"\").slice(2,5)+\"Z\"}(),iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(\";\"),a=0;a<n.length;a++){var i=n[a].split(\"=\");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]=\"https://\"+(o?o+\".\":\"\")+\"dc.\"+(r||\"services.visualstudio.com\")}return e}(),c=s[D]||d[D]||\"\",u=s[C],p=u?u+\"/v2/track\":d.endpointUrl,(l=[]).push((n=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=t,i=p,(o=(r=v(c,\"Exception\")).data).baseType=\"ExceptionData\",o.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:n.replace(/\\./g,\"-\"),hasFullStack:!1,stack:n+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(S&&S.pathname||\"_unknown_\")+\"\\nEndpoint: \"+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,\"Message\"),r=i.data;r.baseType=\"MessageData\";var o=r.baseData;return o.message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+n+\")\").replace(/\\\"/g,\"\")+'\"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:\"cors\"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader(\"Content-type\",\"application/json\"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&\"\"!==e||\"undefined\"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){\"loaded\"!==n.readyState&&\"complete\"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName(\"head\")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n=\"track\",r=\"TrackPage\",o=\"TrackEvent\";t([n+\"Event\",n+\"PageView\",n+\"Exception\",n+\"Trace\",n+\"DependencyData\",n+\"Metric\",n+\"PageViewPerformance\",\"start\"+r,\"stop\"+r,\"start\"+o,\"stop\"+o,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c=\"onerror\";t([\"_\"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m[\"_\"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{\n        src: \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\", // The SDK URL Source for the CDN\n        <!-- src: \"http://localhost:9001/AISKU/browser/es5/ai.3.3.1.js\", // The URL Source for the local build -->\n        crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n        cfg: { // Application Insights Configuration\n            connectionString: \"InstrumentationKey=YOUR_INSTRUMENTATION_KEY\",\n            expCfg: {\n              inclScripts: true,\n              expLog : () => {\n                  return {logs: [\"log info 1\", \"log info 2\"]};\n              },\n              maxLogs: 1\n            }\n            //disableIKeyValidation: true\n            // getExceptionScriptsInfo: true\n        }\n      });\n    </script>\n\n  </head>\n  <body>\n    <h1>Hello World!</h1>\n    trackException manual tests\n    <button onclick=\"javascript: throw 'String Error'\">Throw String Exception</button>\n    <button onclick=\"javascript: appInsights.trackException({ exception: 'String Error' })\">trackException with String as the exception</button>\n    <button onclick=\"javascript: try { throw 'String Error'; } catch(e) { appInsights.trackException({exception: e})}\">trackException with try / catch</button>\n\n    <button onclick=\"javascript: appInsights.trackException('String Error')\">trackException with String</button>\n    <button onclick=\"javascript: try { throw 'String Error'; } catch(e) { appInsights.trackException(null)}\">trackException with null</button>\n   \n  </body>\n</html>"
  },
  {
    "path": "AISKU/scripts/README.md",
    "content": "# Application Insights JavaScript SDK deployment scripts\n\n<properties\n    pageTitle=\"Application Insights SDK JavaScript API deployment scripts\"\n    description=\"Reference doc\"\n    services=\"application-insights\"\n/>\n\n<tags\n    ms.service=\"application-insights\"\n    ms.workload=\"tbd\"\n    ms.tgt_pltfrm=\"ibiza\"\n    ms.devlang=\"na\"\n    ms.topic=\"article\"\n    ms.date=\"08/24/2015\"/>\n\n## Deployment Scripts\n\nThis folder contains PowerShell scripts to assist with the deployment of releases.\n\nThe scripts require that the user (or automated runner) has the required access for the specified Azure Storage Account. If you don't have access to the requested account / subscription the scripts will fail with an error message.\n\nEach script will create a log file in the specified logs folder (defaults to <systemDrive>:\\Logs if not otherwise specified), this can be changed by passing ``-logPath \"<new log path>\"`` command-line argument to each script.\n\nThe Scripts and examples are included below, but as a summary they are\n| Script Name | Description\n|-------------|------------\n| ./publishAzReleaseToCdn.ps1 | Publish (Copy) the created resource files from the `browser/` folder to the Azure Storage account used as the source for the CDN.\n| ./setAzActiveCdnVersion.ps1 | Set the available version of the major (ai.2.min.js) and minor (ai.2.#.min.js) to the previously deployed target version.\n| ./listAzCdnVersions.ps1 | List the versions of the resources that are deployed to the Azure Storage account, identifying the associated properties and metadata. Optionally, listing the individual files.\n\n### ./publishAzReleaseToCdn.ps1\n\nThis script has been created to automate the deployment of the CDN resources at the same time as publishing of the NPM packages. This script will publish the full version (v2.#.#) of the current build to all staging folders (beta, next and public) of the source storage account, it does NOT change the major (ai.2.min.js) or minor (ai.2.#.min.js) release versions\n\n__Command line arguments__\n\n| Name | Type | Description\n|------|------|----------------\n| releaseFrom | string | [Optional] Identifies the location of the `package.json` and `browser/` folders are located as these are the source locations of the release. The version number of read from the `package.json` file and then the named version files are read from the `browser/` folder. Defaults to the parent folder of where the script is running from.\n| cdnStorePath | string | [Optional] Identifies the target Azure Storage account (by name) where the files will be uploaded to. As you may have access to multiple subscriptions, resource groups, and storage accounts (which can slow the automatic validation / identification process) you can optionally include the a partial subscription id and resource group name with the storage account name. So you can specify the target using any of the following 3 forms :-<br> - &lt;Full storage account name&gt; <br> - &lt;partial or full subscription id&gt;::&lt;Full storage account name&gt; <br> - &lt;partial or full subscription id&gt;::&lt;Full resource group name&gt;::&lt;Full storage account name&gt;<br>The subscription id is used to match against the collection of subscription id's that the user/runner has access to, it uses the PowerShell -like matching by wrapping the value in '*'<br>When a resource group name is supplied it will further limit the collection of storage accounts that are scanned / checked for the storage account name.<br>Example: `\"65b2f83e::tstcdnstore\"`\n| sasToken | string | [Optional] For automated deployments, it is recommended that you pass in a pre-generated Shared Access Signature (SAS) Token to avoid the script attempting to login the user which could cause a blocking UI to be displayed. When supplied the script bypasses the automated scan / checks and will just used the identified storage account name from the `cdnStorePath` argument. If this value is not specified the script will ensure that the user is logged into azure (displaying a login UI), enumerate all of the subscription Id's for the user to find full location of the storage account identified by the `cdnStorePath` argument, once identified it will then Generate a new SAS token for the script (as long as the user has permissions) for the target subscription.\n| logPath | string | [Optional] Identifies the location where the automatic log file will be written. Defaults to <systemDrive>:\\Logs\n| overwrite | switch | By default the script will NOT overwrite any existing Blob with the same name in each container as it sets the CacheControl period to 1yr. As such this flag is provided primarily for testing and validation purposes, passing this switch will include the \"-Force\" switch for the Azure RM PowerShell functions to cause any existing blob to be overwritten.\n| testOnly | switch | [Optional] By default the script will upload to the production containers (beta, next and scripts), for testing this switch will effectively cause the files to be uploaded to the \"tst\" container with and the normal container names will instead be prepended (simulating folders) to the name. ([tst] scripts/b/ai.2.min.js)\n| useConnectedAccount | switch | [Optional] By default the script will use the current logged in user to authenticate with Azure using SAS tokens, if you have disabled SAS token support for the storage account then you will need to use this switch and grant the user \"Storage Blob Data Contributor\" role.\n\n#### Example Usage and output\nFrom the &lt;repo&gt;/AISKU/scripts folder in a powershell environment\n\n~~~~\nPS D:\\git\\ApplicationInsights-JS\\AISKU\\scripts> .\\publishAzReleaseToCdn.ps1 -cdnStorePath \"65b2f83e::tstcdnstore\"\n[06/29/20 16:34:45] Store Path: 65b2f83e::tstcdnstore\n[06/29/20 16:34:45] Overwrite : False\n[06/29/20 16:34:45] Test Mode : False\n[06/29/20 16:34:45] SourcePath: D:\\git\\ApplicationInsights-JS\\AISKU\n[06/29/20 16:34:45] Log Path  : C:\\Logs\n[06/29/20 16:34:45] Mode      : Manual\n[06/29/20 16:34:45] Importing Module AzureRM.Profile for Login-AzureRMAccount\n[06/29/20 16:34:45] Importing Module AzureRM.Storage for Get-AzureRmStorageAccount\n[06/29/20 16:34:45] ----------------------------------------------------------------------\n[06/29/20 16:34:45] Subscription: 65b2f83e\n[06/29/20 16:34:45] StoreName   : tstcdnstore\n[06/29/20 16:34:45] ----------------------------------------------------------------------\n[06/29/20 16:34:45] **********************************************************************\n[06/29/20 16:34:45] Generating SAS token for user\n[06/29/20 16:34:45] **********************************************************************\n[06/29/20 16:34:45] Checking Logged in status.\n[06/29/20 16:34:46]   Finding Subscriptions\n[06/29/20 16:34:49]   Finding Storage Account\n[06/29/20 16:34:49]     Checking Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 16:34:55]     - Found Candidate Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 16:34:55] Generating SAS Token for\n[06/29/20 16:34:55]   Subscription: 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 16:34:55]   Group       : test\n[06/29/20 16:34:55]   StoreName   : tstcdnstore\n[06/29/20 16:34:56] ======================================================================\n[06/29/20 16:34:56] Releasing from : D:\\git\\ApplicationInsights-JS\\AISKU\n[06/29/20 16:34:56] Version        : 2.4.1\n[06/29/20 16:34:56] Adding files\n[06/29/20 16:34:56]  - D:\\git\\ApplicationInsights-JS\\AISKU\\browser\\ai.2.4.1.js\n[06/29/20 16:34:56]  - D:\\git\\ApplicationInsights-JS\\AISKU\\browser\\ai.2.4.1.js.map\n[06/29/20 16:34:56]  - D:\\git\\ApplicationInsights-JS\\AISKU\\browser\\ai.2.4.1.min.js\n[06/29/20 16:34:56]  - D:\\git\\ApplicationInsights-JS\\AISKU\\browser\\ai.2.4.1.min.js.map\n[06/29/20 16:34:56] Release Files : 4\n[06/29/20 16:34:56] ----------------------------------------------------------------------\n[06/29/20 16:34:56] Container  : beta Prefix:\n[06/29/20 16:34:56]     Using Cache Control: public, max-age=31536000, immutable\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.js is already present\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.js.map is already present\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.min.js is already present\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.min.js.map is already present\n[06/29/20 16:34:56] Container  : next Prefix:\n[06/29/20 16:34:56]     Using Cache Control: public, max-age=31536000, immutable\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.js is already present\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.js.map is already present\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.min.js is already present\n[06/29/20 16:34:56] [WRN]     ai.2.4.1.min.js.map is already present\n[06/29/20 16:34:56] Container  : scripts Prefix: b/\n[06/29/20 16:34:56]     Using Cache Control: public, max-age=31536000, immutable\n[06/29/20 16:34:57] [WRN]     b/ai.2.4.1.js is already present\n[06/29/20 16:34:57] [WRN]     b/ai.2.4.1.js.map is already present\n[06/29/20 16:34:57] [WRN]     b/ai.2.4.1.min.js is already present\n[06/29/20 16:34:57] [WRN]     b/ai.2.4.1.min.js.map is already present\n[06/29/20 16:34:57] ======================================================================\n~~~~\n\n### ./setAzActiveCdnVersion.ps1\n\nThis script will set the active release for the specified release folder (beta, next, public) to the requested full version (2.x.x) number. By default it will set both the major (ai.2.min.js) and minor (ai.2.x.min.js) versions to the requested full version, you can optionally only update the minor version.\n\n> :bulb: **Note**\n>\n> Note: The script does NOT use any local files to upload as the active versions, the full version MUST have already been deployed to the requested folder within the storage account. The script will validate and fail if the requested version is not available.\n\n__Command line arguments__\n\n| Name | Type | Description\n|------|------|----------------\n| container | string | __[Required]__ Identifies the target container to update (beta, next, public)\n| activeVersion | string | __[Required]__ Identifies the source full version number to copy and make the active released version fro the specified container. This MUST be the full version number in the form \"a.b.c\". The new active versions will be created (or overwritten) as the major version (ai.[a].min.js) and minor version (ai.[a].[b].min.js).\n| cdnStorePath | string | [Optional] Identifies the target Azure Storage account (by name) where the files will be uploaded to. As you may have access to multiple subscriptions, resource groups, and storage accounts (which can slow the automatic validation / identification process) you can optionally include the a partial subscription id and resource group name with the storage account name. So you can specify the target using any of the following 3 forms :-<br> - &lt;Full storage account name&gt; <br> - &lt;partial or full subscription id&gt;::&lt;Full storage account name&gt; <br> - &lt;partial or full subscription id&gt;::&lt;Full resource group name&gt;::&lt;Full storage account name&gt;<br>The subscription id is used to match against the collection of subscription id's that the user/runner has access to, it uses the PowerShell -like matching by wrapping the value in '*'<br>When a resource group name is supplied it will further limit the collection of storage accounts that are scanned / checked for the storage account name.<br>Example: `\"65b2f83e::tstcdnstore\"`\n| sasToken | string | [Optional] For automated deployments, it is recommended that you pass in a pre-generated Shared Access Signature (SAS) Token to avoid the script attempting to login the user which could cause a blocking UI to be displayed. When supplied the script bypasses the automated scan / checks and will just used the identified storage account name from the `cdnStorePath` argument. If this value is not specified the script will ensure that the user is logged into azure (displaying a login UI), enumerate all of the subscription Id's for the user to find full location of the storage account identified by the `cdnStorePath` argument, once identified it will then Generate a new SAS token for the script (as long as the user has permissions) for the target subscription.\n| logPath | string | [Optional] Identifies the location where the automatic log file will be written. Defaults to <systemDrive>:\\Logs\n| minorOnly | switch | By default the script will update both the major (ai.2.min.js) and minor (ai.2.#.min.js) available versions of the script. If this switch is set it will only update the minor version (ai.2.#.min.js) and the major version (ai.2.min.js) will be unaffected.\n| testOnly | switch | [Optional] By default the script will update the production containers (beta, next and scripts), for testing this switch will effectively only update the \"tst\" container versions with and the normal container names will instead be prepended (simulating folders) to the name. ([tst] scripts/b/ai.2.min.js)\n| useConnectedAccount | switch | [Optional] By default the script will use the current logged in user to authenticate with Azure using SAS tokens, if you have disabled SAS token support for the storage account then you will need to use this switch and grant the user \"Storage Blob Data Contributor\" role.\n\n #### Example Usage and output\n From the &lt;repo&gt;/AISKU/scripts folder in a powershell environment\n\n~~~~ \nPS D:\\git\\ApplicationInsights-JS\\AISKU\\scripts> .\\setAzActiveCdnVersion.ps1 public 2.4.1 -cdnStorePath \"65b2f83e::tstcdnstore\"\n[06/29/20 17:49:20] Container : public\n[06/29/20 17:49:20] Version   : 2.4.1\n[06/29/20 17:49:20] Store Path: 65b2f83e::tstcdnstore\n[06/29/20 17:49:20] Test Mode : False\n[06/29/20 17:49:20] Log Path  : C:\\Logs\n[06/29/20 17:49:20] Mode      : Manual\n[06/29/20 17:49:20] Importing Module AzureRM.Profile for Login-AzureRMAccount\n[06/29/20 17:49:20] Importing Module AzureRM.Storage for Get-AzureRmStorageAccount\n[06/29/20 17:49:20] ----------------------------------------------------------------------\n[06/29/20 17:49:20] Subscription: 65b2f83e\n[06/29/20 17:49:20] StoreName   : tstcdnstore\n[06/29/20 17:49:20] ----------------------------------------------------------------------\n[06/29/20 17:49:20] **********************************************************************\n[06/29/20 17:49:20] Generating SAS token for user\n[06/29/20 17:49:20] **********************************************************************\n[06/29/20 17:49:20] Checking Logged in status.\n[06/29/20 17:49:28]   Finding Subscriptions\n[06/29/20 17:49:33]   Finding Storage Account\n[06/29/20 17:49:33]     Checking Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 17:49:37]     - Found Candidate Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 17:49:37] Generating SAS Token for\n[06/29/20 17:49:37]   Subscription: 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 17:49:37]   Group       : test\n[06/29/20 17:49:37]   StoreName   : tstcdnstore\n[06/29/20 17:49:37] ======================================================================\n[06/29/20 17:49:37] Container  : scripts Prefix: b/\n[06/29/20 17:49:39]   - scripts/b/ai.2.4.1.js                     445.0 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:39]   - scripts/b/ai.2.4.1.js.map                 761.4 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:39]   - scripts/b/ai.2.4.1.min.js                 126.9 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:39]   - scripts/b/ai.2.4.1.min.js.map             621.8 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:39] Container  : scripts Prefix: b/\n[06/29/20 17:49:39] Storage Path : scripts/b\n[06/29/20 17:49:39] Container : scripts\n[06/29/20 17:49:39] BlobPrefix: b/\n[06/29/20 17:49:39] Copying: scripts/b/ai.2.4.1.js                     445.0 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:39]        - b/ai.2.4.1.js ==> b/ai.2.4.js.stage\n[06/29/20 17:49:39]        - b/ai.2.4.js.stage ==> b/ai.2.4.js\n[06/29/20 17:49:40]        - b/ai.2.4.js.stage ==> b/ai.2.js\n[06/29/20 17:49:40] Copying: scripts/b/ai.2.4.1.js.map                 761.4 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:40]        - b/ai.2.4.1.js.map ==> b/ai.2.4.js.map.stage\n[06/29/20 17:49:41]        - b/ai.2.4.js.map.stage ==> b/ai.2.4.js.map\n[06/29/20 17:49:42]        - b/ai.2.4.js.map.stage ==> b/ai.2.js.map\n[06/29/20 17:49:42] Copying: scripts/b/ai.2.4.1.min.js                 126.9 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:42]        - b/ai.2.4.1.min.js ==> b/ai.2.4.min.js.stage\n[06/29/20 17:49:43]        - b/ai.2.4.min.js.stage ==> b/ai.2.4.min.js\n[06/29/20 17:49:44]        - b/ai.2.4.min.js.stage ==> b/ai.2.min.js\n[06/29/20 17:49:44] Copying: scripts/b/ai.2.4.1.min.js.map             621.8 Kb  2020-06-29 21:52:17\n[06/29/20 17:49:44]        - b/ai.2.4.1.min.js.map ==> b/ai.2.4.min.js.map.stage\n[06/29/20 17:49:45]        - b/ai.2.4.min.js.map.stage ==> b/ai.2.4.min.js.map\n[06/29/20 17:49:46]        - b/ai.2.4.min.js.map.stage ==> b/ai.2.min.js.map\n[06/29/20 17:49:47] ======================================================================\n~~~~\n\n### ./listAzCdnVersions.ps1\n\nThis script will list all of the currently deployed application insights versions that are available via the CDN, this script does not change any of the deployed or active versions.\n\n> :bulb: **Note**\n>\n> Note: No deployed files are modified by this script, it only enumerates the files that have already been deployed to the storage account.\n\n__Command line arguments__\n\n| Name | Type | Description\n|------|------|----------------\n| container | string | __[Optional]__ Identifies the single target container to list the available versions for (beta, next, public). If not specified all containers will be enumerated.\n| cdnStorePath | string | [Optional] Identifies the target Azure Storage account (by name) where the files will be uploaded to. As you may have access to multiple subscriptions, resource groups, and storage accounts (which can slow the automatic validation / identification process) you can optionally include the a partial subscription id and resource group name with the storage account name. So you can specify the target using any of the following 3 forms :-<br> - &lt;Full storage account name&gt; <br> - &lt;partial or full subscription id&gt;::&lt;Full storage account name&gt; <br> - &lt;partial or full subscription id&gt;::&lt;Full resource group name&gt;::&lt;Full storage account name&gt;<br>The subscription id is used to match against the collection of subscription id's that the user/runner has access to, it uses the PowerShell -like matching by wrapping the value in '*'<br>When a resource group name is supplied it will further limit the collection of storage accounts that are scanned / checked for the storage account name.<br>Example: `\"65b2f83e::tstcdnstore\"`\n| sasToken | string | [Optional] For automated deployments, it is recommended that you pass in a pre-generated Shared Access Signature (SAS) Token to avoid the script attempting to login the user which could cause a blocking UI to be displayed. When supplied the script bypasses the automated scan / checks and will just used the identified storage account name from the `cdnStorePath` argument. If this value is not specified the script will ensure that the user is logged into azure (displaying a login UI), enumerate all of the subscription Id's for the user to find full location of the storage account identified by the `cdnStorePath` argument, once identified it will then Generate a new SAS token for the script (as long as the user has permissions) for the target subscription.\n| logPath | string | [Optional] Identifies the location where the automatic log file will be written. Defaults to <systemDrive>:\\Logs\n| showFiles | switch | [Optional] Identifies whether the details of each located blob should be listed, this includes the CacheControl and metadata for each file\n| testOnly | switch | [Optional] By default the script will update the production containers (beta, next and scripts), for testing this switch will effectively only update the \"tst\" container versions with and the normal container names will instead be prepended (simulating folders) to the name. ([tst] scripts/b/ai.2.min.js)\n| useConnectedAccount | switch | [Optional] By default the script will use the current logged in user to authenticate with Azure using SAS tokens, if you have disabled SAS token support for the storage account then you will need to use this switch and grant the user \"Storage Blob Data Contributor\" role.\n\n #### Example Usages and output\n From the &lt;repo&gt;/AISKU/scripts folder in a powershell environment\n\n~~~~\nPS D:\\git\\ApplicationInsights-JS\\AISKU\\scripts> .\\listAzCdnVersions.ps1 -cdnStorePath \"65b2f83e::tstcdnstore\"\n[06/29/20 18:29:15] Container :\n[06/29/20 18:29:15] Store Path: 65b2f83e::tstcdnstore\n[06/29/20 18:29:15] Log Path  : C:\\Logs\n[06/29/20 18:29:15] Show Files: False\n[06/29/20 18:29:15] Test Mode : False\n[06/29/20 18:29:15] Mode      : Manual\n[06/29/20 18:29:15] Importing Module AzureRM.Profile for Login-AzureRMAccount\n[06/29/20 18:29:15] Importing Module AzureRM.Storage for Get-AzureRmStorageAccount\n[06/29/20 18:29:15] ----------------------------------------------------------------------\n[06/29/20 18:29:15] Subscription: 65b2f83e\n[06/29/20 18:29:15] StoreName   : tstcdnstore\n[06/29/20 18:29:15] ----------------------------------------------------------------------\n[06/29/20 18:29:15] **********************************************************************\n[06/29/20 18:29:15] Generating SAS token for user\n[06/29/20 18:29:15] **********************************************************************\n[06/29/20 18:29:15] Checking Logged in status.\n[06/29/20 18:29:16]   Finding Subscriptions\n[06/29/20 18:29:37]   Finding Storage Account\n[06/29/20 18:29:37]     Checking Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 18:29:59]     - Found Candidate Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 18:29:59] Generating SAS Token for\n[06/29/20 18:29:59]   Subscription: 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 18:29:59]   Group       : test\n[06/29/20 18:29:59]   StoreName   : tstcdnstore\n[06/29/20 18:30:00] ======================================================================\n[06/29/20 18:30:00] Container  : beta Prefix:\n[06/29/20 18:30:01] Container  : next Prefix:\n[06/29/20 18:30:03] Container  : scripts Prefix: b/\n[06/29/20 18:30:03] v2        (12)  -  [beta]/ai.2.5.3.js    [next]/ai.2.5.5.js    [scripts]/b/ai.2.4.1.js\n[06/29/20 18:30:03] v2.4      (12)  -  [beta]/ai.2.4.2.js    [next]/ai.2.4.1.js    [scripts]/b/ai.2.4.1.js\n[06/29/20 18:30:03] v2.4.1    (12)  -  beta/                 next/                 scripts/b/\n[06/29/20 18:30:03] v2.4.2    (12)  -  beta/                 next/                 scripts/b/\n[06/29/20 18:30:03] v2.5      ( 8)  -  [beta]/ai.2.5.3.js    [next]/ai.2.5.5.js\n[06/29/20 18:30:03] v2.5.0    (12)  -  beta/                 next/                 scripts/b/\n[06/29/20 18:30:03] v2.5.1    (12)  -  beta/                 next/                 scripts/b/\n[06/29/20 18:30:03] v2.5.2    (12)  -  beta/                 next/                 scripts/b/\n[06/29/20 18:30:03] v2.5.3    (12)  -  beta/                 next/                 scripts/b/\n[06/29/20 18:30:03] v2.5.4    ( 2)  -  beta/                 scripts/b/\n[06/29/20 18:30:03] v2.5.5    ( 8)  -  next/                 scripts/b/\n[06/29/20 18:30:03] ======================================================================\n~~~~\n\nAnd listing the individual the files\n~~~~\nPS D:\\git\\ApplicationInsights-JS\\AISKU\\scripts> .\\listAzCdnVersions.ps1 public -showFiles -cdnStorePath \"65b2f83e::tstcdnstore\"\n[06/29/20 18:31:24] Container : public\n[06/29/20 18:31:24] Store Path: 65b2f83e::tstcdnstore\n[06/29/20 18:31:24] Log Path  : C:\\Logs\n[06/29/20 18:31:24] Show Files: True\n[06/29/20 18:31:24] Test Mode : False\n[06/29/20 18:31:24] Mode      : Manual\n[06/29/20 18:31:24] Importing Module AzureRM.Profile for Login-AzureRMAccount\n[06/29/20 18:31:24] Importing Module AzureRM.Storage for Get-AzureRmStorageAccount\n[06/29/20 18:31:24] ----------------------------------------------------------------------\n[06/29/20 18:31:24] Subscription: 65b2f83e\n[06/29/20 18:31:24] StoreName   : tstcdnstore\n[06/29/20 18:31:24] ----------------------------------------------------------------------\n[06/29/20 18:31:24] **********************************************************************\n[06/29/20 18:31:24] Generating SAS token for user\n[06/29/20 18:31:24] **********************************************************************\n[06/29/20 18:31:24] Checking Logged in status.\n[06/29/20 18:31:26]   Finding Subscriptions\nWARNING: Unable to acquire token for tenant '1309900a-b9a9-46b6-975d-d3d85f87aa28'\n[06/29/20 18:31:47]   Finding Storage Account\n[06/29/20 18:31:47]     Checking Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 18:32:10]     - Found Candidate Subscription 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 18:32:10] Generating SAS Token for\n[06/29/20 18:32:10]   Subscription: 65b2f83e-7af2-4bc3-0123-456789abcfef\n[06/29/20 18:32:10]   Group       : test\n[06/29/20 18:32:10]   StoreName   : tstcdnstore\n[06/29/20 18:32:10] ======================================================================\n[06/29/20 18:32:10] Container  : scripts Prefix: b/\n[06/29/20 18:32:12] v2        ( 4)\n[06/29/20 18:32:12]   - scripts/b/ai.2.js                         v2.4.1   445.0 Kb  2020-06-30 00:49:40  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.js;\n[06/29/20 18:32:12]   - scripts/b/ai.2.js.map                     v2.4.1   761.4 Kb  2020-06-30 00:49:42  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.js.map;\n[06/29/20 18:32:12]   - scripts/b/ai.2.min.js                     v2.4.1   126.9 Kb  2020-06-30 00:49:44  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.min.js;\n[06/29/20 18:32:12]   - scripts/b/ai.2.min.js.map                 v2.4.1   621.8 Kb  2020-06-30 00:49:47  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.min.js.map;\n[06/29/20 18:32:12] v2.4      ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.js                       v2.4.1   445.0 Kb  2020-06-30 00:49:40  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.js;\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.js.map                   v2.4.1   761.4 Kb  2020-06-30 00:49:42  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.js.map;\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.min.js                   v2.4.1   126.9 Kb  2020-06-30 00:49:44  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.min.js;\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.min.js.map               v2.4.1   621.8 Kb  2020-06-30 00:49:46  pub 30m im  aijssdksrc=[scripts]/b/ai.2.4.1.min.js.map;\n[06/29/20 18:32:13] v2.4.1    ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.1.js                     v2.4.1   445.0 Kb  2020-06-29 21:52:17  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.1.js.map                 v2.4.1   761.4 Kb  2020-06-29 21:52:17  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.1.min.js                 v2.4.1   126.9 Kb  2020-06-29 21:52:17  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.1.min.js.map             v2.4.1   621.8 Kb  2020-06-29 21:52:17  pub 1yr im\n[06/29/20 18:32:13] v2.4.2    ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.2.js                     v2.4.2   445.0 Kb  2020-06-29 20:18:47  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.2.js.map                 v2.4.2   761.4 Kb  2020-06-29 20:18:47  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.2.min.js                 v2.4.2   126.9 Kb  2020-06-29 20:18:48  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.4.2.min.js.map             v2.4.2   621.8 Kb  2020-06-29 20:18:48  pub 1yr im\n[06/29/20 18:32:13] v2.5.0    ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.0.js                     v2.5.0   445.0 Kb  2020-06-29 19:56:15  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.0.js.map                 v2.5.0   761.4 Kb  2020-06-29 19:56:15  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.0.min.js                 v2.5.0   126.9 Kb  2020-06-29 19:56:16  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.0.min.js.map             v2.5.0   621.8 Kb  2020-06-29 19:56:16  pub 1yr im\n[06/29/20 18:32:13] v2.5.1    ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.1.js                     v2.5.1   445.0 Kb  2020-06-29 19:51:49  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.1.js.map                 v2.5.1   761.4 Kb  2020-06-29 19:51:50  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.1.min.js                 v2.5.1   126.9 Kb  2020-06-29 19:51:50  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.1.min.js.map             v2.5.1   621.8 Kb  2020-06-29 19:51:50  pub 1yr im\n[06/29/20 18:32:13] v2.5.2    ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.2.js                     v2.5.2   445.0 Kb  2020-06-29 20:07:06  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.2.js.map                 v2.5.2   761.4 Kb  2020-06-29 20:07:06  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.2.min.js                 v2.5.2   126.9 Kb  2020-06-29 20:07:06  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.2.min.js.map             v2.5.2   621.8 Kb  2020-06-29 20:07:07  pub 1yr im\n[06/29/20 18:32:13] v2.5.3    ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.3.js                     v2.5.3   445.0 Kb  2020-06-29 20:12:50  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.3.js.map                 v2.5.3   761.4 Kb  2020-06-29 20:12:50  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.3.min.js                 v2.5.3   126.9 Kb  2020-06-29 20:12:51  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.3.min.js.map             v2.5.3   621.8 Kb  2020-06-29 20:12:51  pub 1yr im\n[06/29/20 18:32:13] v2.5.4    ( 1)\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.4.js                        ---   445.0 Kb  2020-06-25 00:14:26  pub 1yr im\n[06/29/20 18:32:13] v2.5.5    ( 4)\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.5.js                     v2.5.5   445.0 Kb  2020-06-29 19:28:29  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.5.js.map                 v2.5.5   761.4 Kb  2020-06-29 19:28:29  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.5.min.js                 v2.5.5   126.9 Kb  2020-06-29 19:28:29  pub 1yr im\n[06/29/20 18:32:13]   - scripts/b/ai.2.5.5.min.js.map             v2.5.5   621.8 Kb  2020-06-29 19:28:30  pub 1yr im\n[06/29/20 18:32:13] ======================================================================\n~~~~\n\nRefer to [our GitHub page](https://github.com/microsoft/applicationinsights-js) for more details on using Application Insights JS SDK.\n"
  },
  {
    "path": "AISKU/scripts/listAzCdnVersions.ps1",
    "content": "param (\n    [string] $container = $null,                        # Identify the container that you want to check blank == all\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $showFiles = $false,                       # Show the individual files with details as well\n    [switch] $inclExt = $false,                         # Include the extensions\n    [switch] $activeOnly = $false,                      # Only show the active (deployed) versions\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../common/publish/Logging\"\nImport-Module -Force -Name \"../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Container         : $container\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $cdnStorePath\"\n    Write-Log \"Write-LogPath     : $logDir\"\n    Write-Log \"Show Files        : $showFiles\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    # Validate parameters\n    if ([string]::IsNullOrWhiteSpace($container) -ne $true -and \"beta\",\"next\",\"public\", \"dev\", \"nightly\" -NotContains $container) {\n        Write-LogFailure \"[$($container)] is not a valid value, must be beta, next or public\"\n    }\n}\n\nFunction Get-AllVersionFiles(\n    [system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]] $files,\n    [string] $storagePath\n) {\n    Get-VersionFiles $files $storagePath \"ai.\" $null\n    if ($inclExt -eq $true) {\n        Get-VersionFiles $files \"$storagePath/ext\" \"ai.*\" $null\n    }\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"listCdnVersionsLog\"\n\nWrite-LogParams\nValidate-Params\n\n# Don't try and list anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n# Get the public files (scripts/b)\nif ([string]::IsNullOrWhiteSpace($container) -eq $true) {\n    Get-AllVersionFiles $files \"scripts/b\"\n    Get-AllVersionFiles $files \"beta\"\n    Get-AllVersionFiles $files \"next\"\n    Get-AllVersionFiles $files \"dev\"\n    Get-AllVersionFiles $files \"nightly\"\n}\n\nif ([string]::IsNullOrWhiteSpace($container) -ne $true) {\n    if ($container -eq \"public\") {\n        Get-AllVersionFiles $files \"scripts/b\"\n    } elseif ($container -eq \"beta\" -or $container -eq \"next\" -or $container -eq \"dev\" -or $container -eq \"nightly\") {\n        Get-AllVersionFiles $files \"$container\"\n    } else {\n        $global:connectDetails.testOnly = $true\n        $global:connectDetails.storeContainer = \"tst\"\n        Get-AllVersionFiles $files \"$container\"\n    }\n}\n\nListVersions $files $activeOnly $showFiles\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "AISKU/scripts/publishAzImgToCdn.ps1",
    "content": "param (\n    [string] $releaseFrom = $null,                      # The root path for where to find the files to be released\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $overwrite = $false,                       # Overwrite any existing files   \n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $cacheTest = $false,                       # Uploads the images with a shorter cache time\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../common/publish/Logging\"\nImport-Module -Force -Name \"../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\n$global:cacheValue = $null\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Overwrite         : $overwrite\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"SourcePath        : $jsSdkDir\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction GetReleaseFiles\n{\n    Write-Log \"Folder   : $jsSdkDir\"\n\n    # check if the img dir exists\n    $parentDir = Split-Path -Path $jsSdkDir -Parent\n    $imgSrcDir = Join-Path -Path $parentDir -ChildPath \"./AISKU/.cdn/img\"\n\n    Write-Log \"Image Folder   : $imgSrcDir\"\n\n    if (-Not (Test-Path $imgSrcDir)) {\n        Write-LogWarning \"'$imgSrcDir' directory doesn't exist. Generate IMG first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    # Get all files in the imgSrcDir directory\n    $imgFiles = Get-ChildItem -Path $imgSrcDir -File\n\n\n    Write-Log \"Adding files\";\n    # Iterate over each file\n    foreach ($file in $imgFiles) {\n        # Call AddReleaseFile for the current file\n        AddReleaseFile $files $imgSrcDir $file.Name\n    }\n\n    return $files\n}\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"publishReleaseCdnLog\"\n\n$jsSdkDir = $releaseFrom\nif ([string]::IsNullOrWhiteSpace($jsSdkDir) -eq $true) {\n    $jsSdkDir = Split-Path (Split-Path $MyInvocation.MyCommand.Path) -Parent\n}\n\n$cacheControl = \"public, max-age=31536000, immutable, no-transform\";\nif ($cacheTest -eq $true) {\n    $cacheControl = \"public, max-age=86400, immutable, no-transform\";\n}\n$contentType = \"image/svg+xml;\";\n\nWrite-LogParams\n\n# You will need to at least have the AzureRM module installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n$releaseFiles = GetReleaseFiles \nif ($null -eq $releaseFiles -or $releaseFiles.Count -eq 0) {\n    Write-LogFailure \"Unable to find any release files\"\n}\n\nWrite-Log \"Release Files : $($releaseFiles.Count)\"\n\nWrite-Log \"----------------------------------------------------------------------\"\n\n$contentDisposition = \"inline\"\n\n# Publish the img to the folder that is same to the script folder.\nPublishFiles $releaseFiles \"scripts/b\" $cacheControl $contentType $overwrite $contentDisposition\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "AISKU/scripts/publishAzReleaseToCdn.ps1",
    "content": "param (\n    [string] $releaseFrom = $null,                      # The root path for where to find the files to be released\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $overwrite = $false,                       # Overwrite any existing files   \n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../common/publish/Logging\"\nImport-Module -Force -Name \"../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\n$global:cacheValue = $null\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Overwrite         : $overwrite\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"SourcePath        : $jsSdkDir\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction GetReleaseFiles (\n    [hashtable] $verDetails\n)\n{\n    $version = $verDetails.full\n    Write-Log \"Version   : $($verDetails.full)\"\n    Write-Log \"  Number  : $($verDetails.ver)\"\n    Write-Log \"  Type    : $($verDetails.type)\"\n    Write-Log \"  BldNum  : $($verDetails.bldNum)\"\n\n    # check if the minified dir exists\n    $jsSdkSrcDir = Join-Path $jssdkDir -ChildPath \"browser\\es5\\\";\n\n    if (-Not (Test-Path $jsSdkSrcDir)) {\n        Write-LogWarning \"'$jsSdkSrcDir' directory doesn't exist. Compile JSSDK first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    Write-Log \"Adding files\";\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.integrity.json\" $true\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.cjs.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.cjs.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.cjs.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.cjs.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.gbl.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.gbl.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.gbl.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.$version.gbl.min.js.map\"\n\n    return $files\n}\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"publishReleaseCdnLog\"\n\n$jsSdkDir = $releaseFrom\nif ([string]::IsNullOrWhiteSpace($jsSdkDir) -eq $true) {\n    $jsSdkDir = Split-Path (Split-Path $MyInvocation.MyCommand.Path) -Parent\n}\n\n$cacheControl1Year = \"public, max-age=31536000, immutable, no-transform\";\n$contentType = \"text/javascript; charset=utf-8\";\n\nWrite-LogParams\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n$version = GetPackageVersion $jsSdkDir\n\n$releaseFiles = GetReleaseFiles $version      # Get the versioned files only\nif ($null -eq $releaseFiles -or $releaseFiles.Count -eq 0) {\n    Write-LogFailure \"Unable to find any release files\"\n}\n\nWrite-Log \"Release Files : $($releaseFiles.Count)\"\n\nWrite-Log \"----------------------------------------------------------------------\"\n\n# Publish the full versioned files to all release folders\nif ($version.type -eq \"release\") {\n    # Normal publishing deployment\n    PublishFiles $releaseFiles \"beta\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"scripts/b\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"rc\") {\n    PublishFiles $releaseFiles \"beta\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n    # Publish to release type folder folder\n    PublishFiles $releaseFiles \"$($version.type)\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -like \"nightly*\") {\n    # Publish to release nightly folder folder\n    PublishFiles $releaseFiles \"nightly\" $cacheControl1Year $contentType $overwrite\n}\nelse {\n    # Upload to the test container rather than the supplied one\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n    PublishFiles $releaseFiles \"$($version.type)\" $cacheControl1Year $contentType $overwrite\n}\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "AISKU/scripts/setAzActiveCdnVersion.ps1",
    "content": "[CmdletBinding()]\nparam (\n    [string] $container = \"\",                           # The container to update\n    [string] $activeVersion = \"\",                       # The version to copy as the active version\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $minorOnly = $false,                       # Only set the active minor version (v2.x) and not the major version (v2)\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../common/publish/Logging\"\nImport-Module -Force -Name \"../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    Write-Log \"Container         : $container\"\n    Write-Log \"Version           : $activeVersion\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    if ([string]::IsNullOrWhiteSpace($activeVersion) -eq $true) {\n        Write-LogFailure \"The Active version is not specified\"\n        exit\n    }\n\n    $version = Get-VersionDetails $activeVersion\n\n    if ([string]::IsNullOrWhiteSpace($version.type) -eq $true) {\n        Write-LogFailure \"Unknown release type\"\n    }\n\n    $versionParts = $version.ver.Split(\".\")\n    if ($versionParts.Length -ne 3) {\n        Write-LogFailure \"Active Version [$activeVersion] is not a valid version number\"\n    }\n\n    foreach ($verNum in $versionParts) {\n        [int]$value = 0\n        if ([int32]::TryParse($verNum, [ref]$value) -ne $true) {\n            Write-LogFailure \"[$($verNum)] is not a valid number within the version[$activeVersion]\"\n        }\n    }\n\n    # Publish the full versioned files to all release folders\n    if ($version.type -eq \"release\") {\n        # Normal publishing deployment\n        if (\"beta\",\"next\",\"public\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"rc\") {\n        if (\"beta\",\"next\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -like \"nightly*\") {\n        if (\"nightly\" -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    else {\n        # Upload to the test container rather than the supplied one\n        $global:connectDetails.testOnly = $true\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        } else {\n            Write-LogWarning \"Non-Standard release type using tst/$container as the destination\"\n        }\n    }\n    \n    return $version;\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"setActiveCdnVersionLog\"\n\nWrite-LogParams\n$version = Validate-Params\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n$storePath = \"$container\"\nif ($container -eq \"public\") {\n    $storePath = \"scripts/b\"\n} elseif ($container -ne \"beta\" -and $container -ne \"next\" -and $container -ne \"dev\" -and $container -ne \"nightly\") {\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n}\n\nGet-VersionFiles $files $storePath \"ai.\" $activeVersion\n\nif ($files.ContainsKey($activeVersion) -ne $true) {\n    Write-LogFailure \"Version [$activeVersion] does not appear to be deployed to [$container]\"\n} elseif ($files[$activeVersion].Count -ne 4 -and # Prior to 2.5.8\n        $files[$activeVersion].Count -ne 8 -and   # Since 2.5.8\n        $files[$activeVersion].Count -ne 9 -and   # Since 2.6.5\n        $files[$activeVersion].Count -ne 12 -and  # Since 2.5.8\n        $files[$activeVersion].Count -ne 13) {    # Since 2.6.5\n    Write-LogFailure \"Version [$activeVersion] does not fully deployed to [$container] -- only found [$($files[$activeVersion].Count)] file(s)\"\n}\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\nSetActiveVersion $files[$activeVersion] $storePath $minorOnly\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "AISKU/snippet/README.md",
    "content": "<properties\n\tpageTitle=\"Application Insights JavaScript SDK - Snippets\"\n\tdescription=\"Reference doc\"\n\tservices=\"application-insights\"\n    documentationCenter=\".net\"\n/>\n\n<tags\n\tms.service=\"application-insights\"\n\tms.workload=\"tbd\"\n\tms.tgt_pltfrm=\"ibiza\"\n\tms.devlang=\"na\"\n\tms.topic=\"article\"\n\tms.date=\"8/28/2020\"/>\n\n# Microsoft Application Insights JavaScript SDK - Snippet Injection\n\n## How to push Application Insights JS snippet changes consumed by Application Insights dotnet package.\n\n1.  Fork Application Insights dotnet [Repo](https://github.com/microsoft/ApplicationInsights-dotnet).\n2.  Get the latest copy of JS snippet and make changes in `NETCORE\\src\\Microsoft.ApplicationInsights.AspNetCore\\Resources.resx` file.\n\n### Build/Test Changes:\n1. Open `Everything.sln` file. Run build and Tests on AspNetCore project\n\n### Test Changes Locally:\n\n1. Create a dot net [SampleWebApp](https://docs.microsoft.com/en-us/visualstudio/ide/quickstart-aspnet-core?view=vs-2019).\n2.  Open your SampleWebApp and enable client side telemetry. More details on how to do this [here](https://docs.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core#enable-client-side-telemetry-for-web-applications)\n3.  In `SampleWebApp\\Startup.cs` configure ikey\n4.  In `SampleWebApp\\WebApplication1.csproj` Refer the package `Microsoft.ApplicationInsights.AspNetCore` you just built from the build output folder: `\\your visual studio workspace\\bin\\Debug\\NuGet`.\n\n## How to inject Javascript with Sharepoint Framework Extensions through [Snippet Setup](https://github.com/microsoft/ApplicationInsights-JS/tree/master/SPO#snippet-setup-ignore-if-using-npm-setup)\n\nDue to security concerns, you can't directly add the script that's described in [this](https://docs.microsoft.com/en-us/azure/azure-monitor/app/sharepoint) article to your webpages in the SharePoint modern UX. As an alternative, you can use [SharePoint Framework (SPFx)](/sharepoint/dev/spfx/extensions/overview-extensions) to build a custom extension that you can use to install Application Insights on your SharePoint sites. There are two ways to add Application Insights to your extension solution, either install via NPM setup or drop a script tag on the extension head. If you choose the second option, [view the sample](https://github.com/pnp/sp-dev-fx-extensions/tree/master/samples/js-application-appinsights). \n\n- Snippet for SPO (Sharepoint online) modern UX scenario: \n```js\n`!function(v,y,T){var S=v.location,k=\"script\",D=\"instrumentationKey\",C=\"ingestionendpoint\",I=\"disableExceptionTracking\",E=\"ai.device.\",b=\"toLowerCase\",w=(D[b](),\"crossOrigin\"),N=\"POST\",e=\"appInsightsSDK\",t=T.name||\"appInsights\",n=((T.name||v[e])&&(v[e]=t),v[t]||function(l){var u=!1,d=!1,g={initialize:!0,queue:[],sv:\"6\",version:2,config:l};function m(e,t){var n={},a=\"Browser\";return n[E+\"id\"]=a[b](),n[E+\"type\"]=a,n[\"ai.operation.name\"]=S&&S.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(g.sv||g.version),{time:(a=new Date).getUTCFullYear()+\"-\"+i(1+a.getUTCMonth())+\"-\"+i(a.getUTCDate())+\"T\"+i(a.getUTCHours())+\":\"+i(a.getUTCMinutes())+\":\"+i(a.getUTCSeconds())+\".\"+(a.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+\"Z\",iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}};function i(e){e=\"\"+e;return 1===e.length?\"0\"+e:e}}var e,n,f=l.url||T.src;function a(e){var t,n,a,i,o,s,r,c,p;u=!0,g.queue=[],d||(d=!0,i=f,r=(c=function(){var e,t={},n=l.connectionString;if(n)for(var a=n.split(\";\"),i=0;i<a.length;i++){var o=a[i].split(\"=\");2===o.length&&(t[o[0][b]()]=o[1])}return t[C]||(t[C]=\"https://\"+((e=(n=t.endpointsuffix)?t.location:null)?e+\".\":\"\")+\"dc.\"+(n||\"services.visualstudio.com\")),t}()).instrumentationkey||l[D]||\"\",c=(c=c[C])?c+\"/v2/track\":l.endpointUrl,(p=[]).push((t=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",n=i,o=c,(s=(a=m(r,\"Exception\")).data).baseType=\"ExceptionData\",s.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:t.replace(/\\./g,\"-\"),hasFullStack:!1,stack:t+\"\\nSnippet failed to load [\"+n+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(S&&S.pathname||\"_unknown_\")+\"\\nEndpoint: \"+o,parsedStack:[]}],a)),p.push((s=i,t=c,(o=(n=m(r,\"Message\")).data).baseType=\"MessageData\",(a=o.baseData).message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+s+\")\").replace(/\\\"/g,\"\")+'\"',a.properties={endpoint:t},n)),i=p,r=c,JSON&&((o=v.fetch)&&!T.useXhr?o(r,{method:N,body:JSON.stringify(i),mode:\"cors\"}):XMLHttpRequest&&((s=new XMLHttpRequest).open(N,r),s.setRequestHeader(\"Content-type\",\"application/json\"),s.send(JSON.stringify(i)))))}function i(e,t){d||setTimeout(function(){!t&&g.core||a()},500)}f&&((n=y.createElement(k)).src=f,!(o=T[w])&&\"\"!==o||\"undefined\"==n[w]||(n[w]=o),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){\"loaded\"!==n.readyState&&\"complete\"!==n.readyState||i(0,t)},e=n,T.ld<0?y.getElementsByTagName(\"head\")[0].appendChild(e):setTimeout(function(){y.getElementsByTagName(k)[0].parentNode.appendChild(e)},T.ld||0));try{g.cookie=y.cookie}catch(h){}function t(e){for(;e.length;)!function(t){g[t]=function(){var e=arguments;u||g.queue.push(function(){g[t].apply(g,e)})}}(e.pop())}var s,r,o=\"track\",c=\"TrackPage\",p=\"TrackEvent\",o=(t([o+\"Event\",o+\"PageView\",o+\"Exception\",o+\"Trace\",o+\"DependencyData\",o+\"Metric\",o+\"PageViewPerformance\",\"start\"+c,\"stop\"+c,\"start\"+p,\"stop\"+p,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),g.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(l.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==l[I]&&!0!==o[I]&&(t([\"_\"+(s=\"onerror\")]),r=v[s],v[s]=function(e,t,n,a,i){var o=r&&r(e,t,n,a,i);return!0!==o&&g[\"_\"+s]({message:e,url:t,lineNumber:n,columnNumber:a,error:i,evt:v.event}),o},l.autoExceptionInstrumented=!0),g}(T.cfg));function a(){T.onInit&&T.onInit(n)}(v[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{\n    src: \"https://js.monitor.azure.com/scripts/b/ai.2.gbl.min.js\", // The SDK URL Source\n    // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n    crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n    cfg: { // Application Insights Configuration\n        connectionString: \"InstrumentationKey=` + this.properties.instrumentationKey + `\"\n    }\n});`\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "AISKU/snippet/snippet.js",
    "content": "﻿(function (win, doc, snipConfig) {\n    var locn = win.location;\n    var helpLink = \"https://go.microsoft.com/fwlink/?linkid=2128109\";\n    var scriptText = \"script\";\n    var strInstrumentationKey = \"instrumentationKey\";\n    var strIngestionendpoint = \"ingestionendpoint\";\n    var strDisableExceptionTracking = \"disableExceptionTracking\";\n    var strAiDevice = \"ai.device.\";\n    var strAiOperationName = \"ai.operation.name\";\n    var strAiSdkVersion = \"ai.internal.sdkVersion\";\n    var strToLowerCase = \"toLowerCase\";\n    var strConStringIKey = strInstrumentationKey[strToLowerCase]();\n    var strEmpty = \"\";\n    var strUndefined = \"undefined\";\n    var strCrossOrigin = \"crossOrigin\";\n\n    var strPostMethod = \"POST\";\n    var sdkInstanceName = \"appInsightsSDK\";         // required for Initialization to find the current instance\n    var aiName = snipConfig.name || \"appInsights\";  // provide non default instance name through snipConfig name value\n    if (snipConfig.name || win[sdkInstanceName]) {\n        // Only set if supplied or another name is defined to avoid polluting the global namespace\n        win[sdkInstanceName] = aiName;\n    }\n    var aiSdk = win[aiName] || (function (aiConfig) {\n        var loadFailed = false;\n        var handled = false;\n        var appInsights = {\n            initialize: true,   // initialize sdk on download\n            queue: [],\n            sv: \"10\",            // Track the actual snippet version for reporting.\n            version: 2.0,       // initialization version, if this is not 2.0 the previous scripts fail to initialize\n            config: aiConfig\n        };\n        function _parseConnectionString() {\n            var fields = {};\n            var connectionString = aiConfig.connectionString;\n            if (connectionString) {\n                var kvPairs = connectionString.split(\";\");\n                for (var lp = 0; lp < kvPairs.length; lp++) {\n                    var kvParts = kvPairs[lp].split(\"=\");\n    \n                    if (kvParts.length === 2) { // only save fields with valid formats\n                        fields[kvParts[0][strToLowerCase]()] = kvParts[1];\n                    }\n                }\n            }\n\n            // apply the default endpoints\n            if (!fields[strIngestionendpoint]) {\n                // use endpoint suffix where overrides are not provided\n                var endpointSuffix = fields.endpointsuffix;\n                // Only fetch the location if a suffix was supplied\n                var fLocation = endpointSuffix ? fields.location : null;\n                fields[strIngestionendpoint] = \"https://\" + (fLocation ? fLocation + \".\" : strEmpty) + \"dc.\" + (endpointSuffix || \"services.visualstudio.com\");\n            }\n\n            return fields;\n        }\n\n        function _sendEvents(evts, endpointUrl) {\n            if (JSON) {\n                var sender = win.fetch;\n                if (sender && !snipConfig.useXhr) {\n                    sender(endpointUrl, { method:strPostMethod, body: JSON.stringify(evts), mode:\"cors\"});\n                } else if (XMLHttpRequest) {\n                    // IE doesn't support fetch and private clouds may only be using IE\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(strPostMethod, endpointUrl);\n                    xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                    xhr.send(JSON.stringify(evts));\n                }\n            }\n        }\n\n        function _reportFailure(targetSrc) {\n            var conString = _parseConnectionString();\n            var iKey = conString[strConStringIKey] || aiConfig[strInstrumentationKey] || strEmpty;\n            var ingest = conString[strIngestionendpoint];\n            var endpointUrl = ingest ? ingest + \"/v2/track\" : aiConfig.endpointUrl; // only add /v2/track when from connectionstring\n\n            var message = \"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\";\n            var evts = [];\n            evts.push(_createException(iKey, message, targetSrc, endpointUrl));\n            evts.push(_createInternal(iKey, message, targetSrc, endpointUrl));\n\n            _sendEvents(evts, endpointUrl);\n        }\n\n        // Gets the time as an ISO date format, using a function as IE7/8 doesn't support toISOString\n        function _getTime() {\n            var date = new Date();\n            function pad(num) {\n                var r = strEmpty + num;\n                if (r.length === 1) {\n                    r = \"0\" + r;\n                }\n\n                return r;\n            }\n\n            return date.getUTCFullYear()\n                + \"-\" + pad(date.getUTCMonth() + 1)\n                + \"-\" + pad(date.getUTCDate())\n                + \"T\" + pad(date.getUTCHours())\n                + \":\" + pad(date.getUTCMinutes())\n                + \":\" + pad(date.getUTCSeconds())\n                + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                + \"Z\";            \n        }\n\n        function _createEnvelope(iKey, theType) {\n            var tags = {};\n            var type = \"Browser\";\n            tags[strAiDevice + \"id\"] = type[strToLowerCase]();\n            tags[strAiDevice + \"type\"] = type;\n            tags[strAiOperationName] = locn && locn.pathname || \"_unknown_\";\n            tags[strAiSdkVersion] = \"javascript:snippet_\" + (appInsights.sv || appInsights.version);\n\n            return {\n                time: _getTime(),\n                iKey: iKey,\n                name: \"Microsoft.ApplicationInsights.\" + iKey.replace(/-/g, strEmpty) + \".\" + theType,\n                sampleRate: 100,\n                tags: tags,\n                data: {\n                    baseData: {\n                        ver: 2\n                    }\n                }\n            };\n        }\n\n        function _createInternal(iKey, message, targetSrc, endpointUrl) {\n            var envelope = _createEnvelope(iKey, \"Message\");\n            var data = envelope.data;\n            data.baseType = \"MessageData\";\n            var baseData = data.baseData;\n            baseData.message = \"AI (Internal): 99 message:\\\"\" + (message + \" (\" + targetSrc + \")\").replace(/\\\"/g, strEmpty) + \"\\\"\";\n            baseData.properties = {\n                endpoint: endpointUrl\n            };\n\n            return envelope;\n        }\n\n        function _createException(iKey, message, targetSrc, endpointUrl) {\n            var envelope = _createEnvelope(iKey, \"Exception\");\n            var data = envelope.data;\n            data.baseType = \"ExceptionData\";\n            data.baseData.exceptions = [{\n                typeName: \"SDKLoadFailed\",\n                message: message.replace(/\\./g, \"-\"),  // Replacing '.' characters as it causes the portal to hide the start of the message in the summary\n                hasFullStack: false,\n                stack: message + \"\\nSnippet failed to load [\" + targetSrc + \"] -- Telemetry is disabled\\nHelp Link: \" + helpLink + \"\\nHost: \" + (locn && locn.pathname || \"_unknown_\") + \"\\nEndpoint: \" + endpointUrl,\n                parsedStack: []\n            }];\n\n            return envelope;\n        }\n    \n        // Assigning these to local variables allows them to be minified to save space:\n        var targetSrc = aiConfig.url || snipConfig.src;\n        if (targetSrc) {\n            function _handleError(evt) {\n                loadFailed = true;\n                appInsights.queue = []; // Clear the queue\n                if (!handled) {\n                    handled = true;\n                    _reportFailure(targetSrc);\n                }\n            }\n\n            function _handleLoad(evt, isAbort) {\n                if (!handled) {\n                    // IE10, Opera calls loaded before the script is processed.\n                    // so delaying to give the script a chance to be processed\n                    setTimeout(function() {\n                        if (isAbort || !appInsights.core) {\n                            _handleError();\n                        }\n                    }, 500);\n                }\n            }\n\n            function _createScript() {\n                var scriptElement = doc.createElement(scriptText);\n                scriptElement.src = targetSrc;\n\n                // Allocate Cross origin only if defined and available\n                var crossOrigin = snipConfig[strCrossOrigin];\n                if ((crossOrigin || crossOrigin === \"\") && scriptElement[strCrossOrigin] != strUndefined) {\n                    scriptElement[strCrossOrigin] = crossOrigin;\n                }\n            \n                scriptElement.onload = _handleLoad;\n                scriptElement.onerror = _handleError;\n\n                // Some browsers support onload while others onreadystatechange and others both\n                scriptElement.onreadystatechange = function (evt, isAbort) {\n                    if (scriptElement.readyState === \"loaded\" || scriptElement.readyState === \"complete\") {\n                        _handleLoad(evt, isAbort);\n                    }\n                };                \n\n                return scriptElement;\n            }\n\n            var theScript = _createScript();\n            if (snipConfig.ld < 0) {\n                // if user wants to append tag to document head, blocking page load\n                var headNode = doc.getElementsByTagName(\"head\")[0];\n                headNode.appendChild(theScript);\n            } else {\n                setTimeout(function () {\n                    // Attempts to place the script tag in the same location as the first script on the page\n                    doc.getElementsByTagName(scriptText)[0].parentNode.appendChild(theScript);\n                }, snipConfig.ld || 0);\n            }\n        }\n    \n        // capture initial cookie\n        try {\n            appInsights.cookie = doc.cookie;\n        } catch (e) { }\n    \n        function _createMethods(methods) {\n            while (methods.length) {\n                (function (name) {\n                    // Define a temporary method that queues-up a the real method call\n                    appInsights[name] = function () {\n                        // Capture the original arguments passed to the method\n                        var originalArguments = arguments;\n                        if (!loadFailed) { // If we have detected that the main script failed to load then stop queuing events that will never be processed\n                            // Queue-up a call to the real method\n                            appInsights.queue.push(function () {\n                                // Invoke the real method with the captured original arguments\n                                appInsights[name].apply(appInsights, originalArguments);\n                            });\n                        }\n                    };\n                })(methods.pop());\n            }\n        }\n\n        var track = \"track\";\n        var trackPage = \"TrackPage\";\n        var trackEvent = \"TrackEvent\";\n        _createMethods([track + \"Event\", \n            track + \"PageView\", \n            track + \"Exception\", \n            track + \"Trace\", \n            track + \"DependencyData\", \n            track + \"Metric\", \n            track + \"PageViewPerformance\",\n            \"start\" + trackPage, \n            \"stop\" + trackPage,\n            \"start\" + trackEvent, \n            \"stop\" + trackEvent,\n            \"addTelemetryInitializer\", \n            \"setAuthenticatedUserContext\", \n            \"clearAuthenticatedUserContext\", \n            \"flush\"]);\n    \n        // expose SeverityLevel enum\n        appInsights['SeverityLevel'] = {\n            Verbose : 0,\n            Information : 1,\n            Warning : 2,\n            Error : 3,\n            Critical : 4\n        };\n    \n        // Collect global errors\n        // Note: ApplicationInsightsAnalytics is the extension string identifier for\n        //  AppAnalytics. It is defined in ApplicationInsights.ts:ApplicationInsights.identifer\n        var analyticsCfg = ((aiConfig.extensionConfig || {}).ApplicationInsightsAnalytics ||{});\n        if (!(aiConfig[strDisableExceptionTracking] === true || analyticsCfg[strDisableExceptionTracking] === true)) {\n            var method = \"onerror\";\n            _createMethods([\"_\" + method]);\n            var originalOnError = win[method];\n            win[method] = function(message, url, lineNumber, columnNumber, error) {\n                var handled = originalOnError && originalOnError(message, url, lineNumber, columnNumber, error);\n                if (handled !== true) {\n                    appInsights[\"_\" + method]({\n                        message: message,\n                        url: url,\n                        lineNumber: lineNumber,\n                        columnNumber: columnNumber,\n                        error: error,\n                        evt: win.event\n                    });\n                }\n    \n                return handled;\n            };\n            aiConfig.autoExceptionInstrumented = true;\n        }\n    \n        return appInsights;\n    })(snipConfig.cfg);\n\n    // global instance must be set in this order to mitigate issues in ie8 and lower\n    win[aiName] = aiSdk;\n    \n    function _onInit() {\n        if (snipConfig.onInit) {\n            snipConfig.onInit(aiSdk);\n        }\n    }\n\n    // if somebody calls the snippet twice, don't report page view again\n    if (aiSdk.queue && aiSdk.queue.length === 0) {\n        aiSdk.queue.push(_onInit);\n        aiSdk.trackPageView({});\n    } else {\n        // Already loaded so just call the onInit\n        _onInit();\n    }\n})(window, document, {\n    src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\", // The SDK URL Source\n    // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n    crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n    cfg: { // Application Insights Configuration\n        connectionString: \"YOUR_CONNECTION_STRING\"\n    }\n});\n"
  },
  {
    "path": "AISKU/src/AISku.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { AnalyticsPlugin, ApplicationInsights } from \"@microsoft/applicationinsights-analytics-js\";\nimport { CfgSyncPlugin, ICfgSyncConfig, ICfgSyncMode } from \"@microsoft/applicationinsights-cfgsync-js\";\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\";\nimport {\n    AnalyticsPluginIdentifier, AppInsightsCore, ConnectionString, DEFAULT_BREEZE_PATH, FeatureOptInMode, IAppInsightsCore,\n    IAutoExceptionTelemetry, IChannelControls, IConfig, IConfigDefaults, IConfiguration, ICookieMgr, ICustomProperties, IDependencyTelemetry,\n    IDiagnosticLogger, IDistributedTraceContext, IDynamicConfigHandler, IEventTelemetry, IExceptionTelemetry, ILoadedPlugin,\n    IMetricTelemetry, INotificationManager, IOTelApi, IOTelSpanOptions, IPageViewPerformanceTelemetry, IPageViewTelemetry, IPlugin,\n    IReadableSpan, IRequestHeaders, ISpanScope, ITelemetryContext as Common_ITelemetryContext, ITelemetryInitializerHandler, ITelemetryItem,\n    ITelemetryPlugin, ITelemetryUnloadState, IThrottleInterval, IThrottleLimit, IThrottleMgrConfig, ITraceApi, ITraceProvider,\n    ITraceTelemetry, IUnloadHook, OTelTimeInput, PropertiesPluginIdentifier, ThrottleMgr, UnloadHandler, WatcherFunction,\n    _eInternalMessageId, _throwInternal, addPageHideEventListener, addPageUnloadEventListener, cfgDfMerge, cfgDfValidate,\n    createDynamicConfig, createOTelApi, createProcessTelemetryContext, createTraceProvider, createUniqueNamespace, doPerf, eLoggingSeverity,\n    hasDocument, hasWindow, isArray, isFeatureEnabled, isFunction, isNullOrUndefined, isReactNative, isString, mergeEvtNamespace,\n    onConfigChange, parseConnectionString, proxyAssign, proxyFunctions, removePageHideEventListener, removePageUnloadEventListener, useSpan\n} from \"@microsoft/applicationinsights-core-js\";\nimport {\n    AjaxPlugin as DependenciesPlugin, DependencyInitializerFunction, DependencyListenerFunction, IDependencyInitializerHandler,\n    IDependencyListenerHandler\n} from \"@microsoft/applicationinsights-dependencies-js\";\nimport { PropertiesPlugin } from \"@microsoft/applicationinsights-properties-js\";\nimport { IPromise, createPromise, createSyncPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport {\n    ICachedValue, arrForEach, arrIndexOf, dumpObj, getDeferred, isPromiseLike, objDefine, objForEachKey, strIndexOf, throwUnsupported\n} from \"@nevware21/ts-utils\";\nimport { IApplicationInsights } from \"./IApplicationInsights\";\nimport {\n    CONFIG_ENDPOINT_URL, STR_ADD_TELEMETRY_INITIALIZER, STR_CLEAR_AUTHENTICATED_USER_CONTEXT, STR_EVT_NAMESPACE, STR_GET_COOKIE_MGR,\n    STR_GET_PLUGIN, STR_POLL_INTERNAL_LOGS, STR_SET_AUTHENTICATED_USER_CONTEXT, STR_SNIPPET, STR_START_TRACK_EVENT, STR_START_TRACK_PAGE,\n    STR_STOP_TRACK_EVENT, STR_STOP_TRACK_PAGE, STR_TRACK_DEPENDENCY_DATA, STR_TRACK_EVENT, STR_TRACK_EXCEPTION, STR_TRACK_METRIC,\n    STR_TRACK_PAGE_VIEW, STR_TRACK_TRACE, UNDEFINED_VALUE\n} from \"./InternalConstants\";\nimport { Snippet } from \"./Snippet\";\nimport { createTelemetryItemFromSpan } from \"./internal/trace/spanUtils\";\n\nexport { IRequestHeaders };\n\nlet _internalSdkSrc: string;\n\nconst STR_DEPENDENCIES = \"dependencies\";\nconst STR_PROPERTIES = \"properties\";\nconst STR_SNIPPET_VERSION = \"_snippetVersion\";\nconst STR_APP_INSIGHTS_NEW = \"appInsightsNew\";\nconst STR_GET_SKU_DEFAULTS = \"getSKUDefaults\";\n\n// This is an exclude list of properties that should not be updated during initialization\n// They include a combination of private and internal property names\nconst _ignoreUpdateSnippetProperties = [\n    STR_SNIPPET, STR_DEPENDENCIES, STR_PROPERTIES, STR_SNIPPET_VERSION, STR_APP_INSIGHTS_NEW, STR_GET_SKU_DEFAULTS, \"trace\", \"otelApi\"\n];\n\n// This is an exclude list of properties that should not be proxied to the snippet\n// They include a combination of private and internal property names\nconst _ignoreProxyAssignProperties = [\n    STR_SNIPPET, STR_DEPENDENCIES, STR_PROPERTIES, STR_SNIPPET_VERSION, STR_APP_INSIGHTS_NEW, STR_GET_SKU_DEFAULTS\n];\n\nconst IKEY_USAGE = \"iKeyUsage\";\nconst CDN_USAGE = \"CdnUsage\";\nconst SDK_LOADER_VER = \"SdkLoaderVer\";\nconst ZIP_PAYLOAD = \"zipPayload\";\n\nconst default_limit = {\n    samplingRate: 100,\n    maxSendNumber: 1\n} as IThrottleLimit;\n\nconst default_interval = {\n    monthInterval: 3,\n    daysOfMonth: [28]\n} as IThrottleInterval;\n\nconst default_throttle_config = {\n    disabled: true,\n    limit: cfgDfMerge<IThrottleLimit>(default_limit),\n    interval: cfgDfMerge<IThrottleInterval>(default_interval)\n} as IThrottleMgrConfig;\n\n// We need to include all properties that we only reference that we want to be dynamically updatable here\n// So they are converted even when not specified in the passed configuration\nconst defaultConfigValues: IConfigDefaults<IConfiguration & IConfig> = {\n    connectionString: UNDEFINED_VALUE,\n    endpointUrl: UNDEFINED_VALUE,\n    instrumentationKey: UNDEFINED_VALUE,\n    userOverrideEndpointUrl: UNDEFINED_VALUE,\n    diagnosticLogInterval: cfgDfValidate(_chkDiagLevel, 10000),\n    featureOptIn:{\n        [IKEY_USAGE]: {mode: FeatureOptInMode.enable}, //for versions after 3.1.2 (>= 3.2.0)\n        [CDN_USAGE]: {mode: FeatureOptInMode.disable},\n        [SDK_LOADER_VER]: {mode: FeatureOptInMode.disable},\n        [ZIP_PAYLOAD]: {mode: FeatureOptInMode.none}\n    },\n    throttleMgrCfg: cfgDfMerge<{[key:number]: IThrottleMgrConfig}>(\n        {\n            [_eInternalMessageId.DefaultThrottleMsgKey]:cfgDfMerge<IThrottleMgrConfig>(default_throttle_config),\n            [_eInternalMessageId.InstrumentationKeyDeprecation]:cfgDfMerge<IThrottleMgrConfig>(default_throttle_config),\n            [_eInternalMessageId.SdkLdrUpdate]:cfgDfMerge<IThrottleMgrConfig>(default_throttle_config),\n            [_eInternalMessageId.CdnDeprecation]:cfgDfMerge<IThrottleMgrConfig>(default_throttle_config)\n        }\n    ),\n    extensionConfig: cfgDfMerge<{[key: string]: any}>({\n        [\"AppInsightsCfgSyncPlugin\"]: cfgDfMerge<ICfgSyncConfig>({\n            cfgUrl: CONFIG_ENDPOINT_URL,\n            syncMode: ICfgSyncMode.Receive\n        })\n    })\n};\n\nfunction _chkDiagLevel(value: number) {\n    // Make sure we have a value > 0\n    return value && value > 0;\n}\n\nfunction _parseCs(config: IConfiguration & IConfig, configCs: string | IPromise<string>) {\n    return createSyncPromise<ConnectionString>((resolve, reject) => {\n        doAwaitResponse(configCs, (res) => {\n            let curCs = res && res.value;\n            let parsedCs = null;\n            if (!res.rejected && curCs) {\n                // replace cs with resolved values in case of circular promises\n                config.connectionString = curCs;\n                parsedCs = parseConnectionString(curCs);\n            }\n            \n            // if can't resolve cs promise, null will be returned\n            resolve(parsedCs);\n        });\n    });\n}\n\nfunction _initOTel(sku: AppInsightsSku, traceName: string, onEnd: (span: IReadableSpan) => void, onException?: (span: IReadableSpan, exception: any, time?: OTelTimeInput) => void): ICachedValue<IOTelApi> {\n    let otelApi: ICachedValue<IOTelApi> = getDeferred(createOTelApi, [{\n        host: sku\n    }]);\n\n    // Create the initial default traceProvider\n    sku.core.setTraceProvider(getDeferred(() => {\n        return createTraceProvider(sku, traceName, otelApi.v, onEnd, onException);\n    }));\n\n    return otelApi;\n}\n\n/**\n * Application Insights API\n * @group Entrypoint\n * @group Classes\n */\nexport class AppInsightsSku implements IApplicationInsights<IConfiguration & IConfig> {\n    public snippet: Snippet;\n\n    /**\n     * Access to the Dynamic Configuration for the current instance\n     */\n    public readonly config: IConfiguration & IConfig;\n\n    public readonly appInsights: ApplicationInsights;\n\n    public readonly core: IAppInsightsCore<IConfiguration & IConfig>;\n\n    public readonly context: Common_ITelemetryContext;\n\n    /**\n     * An array of the installed plugins that provide a version\n     */\n    public readonly pluginVersionStringArr: string[];\n    \n    /**\n     * The formatted string of the installed plugins that contain a version number\n     */\n    public readonly pluginVersionString: string;\n\n    public readonly trace: ITraceApi;\n\n    public readonly otelApi: IOTelApi;\n\n    constructor(snippet: Snippet) {\n        // NOTE!: DON'T set default values here, instead set them in the _initDefaults() function as it is also called during teardown()\n        let dependencies: DependenciesPlugin;\n        let properties: PropertiesPlugin;\n        let _sender: Sender;\n        let _snippetVersion: string;\n        let _evtNamespace: string;\n        let _houseKeepingNamespace: string | string[];\n        let _core: IAppInsightsCore<IConfiguration & IConfig>;\n        let _config: IConfiguration & IConfig;\n        let _analyticsPlugin: AnalyticsPlugin;\n        let _cfgSyncPlugin: CfgSyncPlugin;\n        let _throttleMgr: ThrottleMgr;\n        let _iKeySentMessage: boolean;\n        let _cdnSentMessage: boolean;\n        let _sdkVerSentMessage: boolean;\n        let _otelApi: ICachedValue<IOTelApi>;\n\n        dynamicProto(AppInsightsSku, this, (_self) => {\n            _initDefaults();\n\n            objDefine(_self, \"config\", {\n                g: function() {\n                    return _config;\n                }\n            });\n\n            arrForEach([\"pluginVersionStringArr\", \"pluginVersionString\"], (key: keyof AppInsightsSku) => {\n                objDefine(_self, key, {\n                    g: () => {\n                        if (_core) {\n                            return (_core as any)[key];\n                        }\n                        \n                        return null;\n                    }\n                });\n            });\n            \n            // initialize the queue and config in case they are undefined\n            _snippetVersion = \"\" + (snippet.sv || snippet.version || \"\");\n            snippet.queue = snippet.queue || [];\n            snippet.version = snippet.version || 2.0; // Default to new version\n            let cfgHandler: IDynamicConfigHandler<IConfiguration & IConfig> = createDynamicConfig(snippet.config || ({} as any), defaultConfigValues);\n            _config = cfgHandler.cfg;\n\n            _analyticsPlugin = new AnalyticsPlugin();\n\n            objDefine(_self, \"appInsights\", {\n                g: () => {\n                    return _analyticsPlugin;\n                }\n            });\n\n            properties = new PropertiesPlugin();\n            dependencies = new DependenciesPlugin();\n            _sender = new Sender();\n            _core = new AppInsightsCore();\n\n\n            objDefine(_self, \"core\", {\n                g: () => {\n                    return _core;\n                }\n            });\n\n            objDefine(_self, \"otelApi\", {\n                g: function() {\n                    return _otelApi ? _otelApi.v : null;\n                }\n            });\n\n            objDefine(_self, \"trace\", {\n                g: function() {\n                    return _otelApi ? _otelApi.v.trace : null;\n                }\n            });\n            \n            // Will get recalled if any referenced values are changed\n            _addUnloadHook(onConfigChange(cfgHandler, () => {\n                let configCs = _config.connectionString;\n                \n                if (isPromiseLike(configCs)) {\n                    let ikeyPromise = createSyncPromise<string>((resolve, reject) => {\n                        doAwaitResponse(_parseCs(_config, configCs), (rsp) => {\n                            if (!rsp.rejected) {\n                                let ikey = _config.instrumentationKey;\n                                let cs = rsp.value;\n                                ikey = cs && cs.instrumentationkey || ikey;\n                                resolve(ikey);\n                            } else {\n                                // parseCs will always resolve(unless timeout)\n                                // return null in case any error happens\n                                resolve(null);\n                            }\n                        });\n                    });\n                    \n                    let url: IPromise<string> | string = _config.userOverrideEndpointUrl;\n                    if (isNullOrUndefined(url)) {\n                        url = createSyncPromise<string>((resolve, reject) => {\n                            doAwaitResponse(_parseCs(_config, configCs), (rsp) => {\n                                if (!rsp.rejected) {\n                                    let url = _config.endpointUrl;\n                                    let cs = rsp.value;\n                                    let ingest = cs && cs.ingestionendpoint;\n                                    url = ingest? ingest + DEFAULT_BREEZE_PATH : url;\n                                    resolve(url);\n                                } else {\n                                    // parseCs will always resolve(unless timeout)\n                                    // return null in case any error happens\n                                    resolve(null);\n                                }\n                            });\n                        });\n                    }\n\n                    _config.instrumentationKey = ikeyPromise;\n                    _config.endpointUrl = url;\n                }\n\n                if (isString(configCs) && configCs) {\n                    // confirm if promiselike function present\n                    // handle cs promise here\n                    // add cases to oneNote\n                    const cs = parseConnectionString(configCs);\n                    const ingest = cs.ingestionendpoint;\n                    _config.endpointUrl =  _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : ingest + DEFAULT_BREEZE_PATH; // add /v2/track\n                    _config.instrumentationKey = cs.instrumentationkey || _config.instrumentationKey;\n                }\n                // userOverrideEndpointUrl have the highest priority\n                _config.endpointUrl = _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : _config.endpointUrl;\n            }));\n\n            _self.snippet = snippet;\n\n            _self.flush = (isAsync: boolean = true, callBack?: () => void) => {\n                let result: void | IPromise<void>;\n\n                doPerf(_core, () => \"AISKU.flush\", () => {\n                    if (isAsync && !callBack) {\n                        result = createPromise((resolve) => {\n                            callBack = resolve;\n                        });\n                    }\n\n                    let waiting = 1;\n                    const flushDone = () => {\n                        waiting --;\n                        if (waiting === 0) {\n                            callBack();\n                        }\n                    };\n\n                    arrForEach(_core.getChannels(), channel => {\n                        if (channel) {\n                            waiting++;\n                            channel.flush(isAsync, flushDone);\n                        }\n                    });\n\n                    // decrement the initial \"waiting\"\n                    flushDone();\n                }, null, isAsync);\n\n                return result;\n            };\n\n            _self.onunloadFlush = (isAsync: boolean = true) => {\n                arrForEach(_core.getChannels(), (channel: IChannelControls & Sender) => {\n                    if (channel.onunloadFlush) {\n                        channel.onunloadFlush();\n                    } else {\n                        channel.flush(isAsync);\n                    }\n                });\n            };\n        \n            _self.loadAppInsights = (legacyMode: boolean = false, logger?: IDiagnosticLogger, notificationManager?: INotificationManager): IApplicationInsights => {\n                if (legacyMode) {\n                    throwUnsupported(\"Legacy Mode is no longer supported\")\n                }\n\n                function _updateSnippetProperties(snippet: Snippet) {\n                    if (snippet) {\n                        let snippetVer = \"\";\n                        if (!isNullOrUndefined(_snippetVersion)) {\n                            snippetVer += _snippetVersion;\n                        }\n                        if (_self.context && _self.context.internal) {\n                            _self.context.internal.snippetVer = snippetVer || \"-\";\n                        }\n\n                        // apply updated properties to the global instance (snippet)\n                        objForEachKey(_self, (field, value) => {\n                            if (isString(field) &&\n                                    !isFunction(value) &&\n                                    field && field[0] !== \"_\" &&                                // Don't copy \"internal\" values\n                                    arrIndexOf(_ignoreUpdateSnippetProperties, field) === -1) {\n                                if ((snippet as any)[field] !== value) {\n                                    (snippet as any)[field as string] = value;\n                                }\n                            }\n                        });\n                    }\n                }\n\n                doPerf(_self.core, () => \"AISKU.loadAppInsights\", () => {\n                    // initialize core\n                    _core.initialize(_config, [ _sender, properties, dependencies, _analyticsPlugin, _cfgSyncPlugin], logger, notificationManager);\n\n                    // Initialize the initial OTel API\n                    _otelApi = _initOTel(_self, \"aisku\", _onEnd, _onException);\n                    \n                    objDefine(_self, \"context\", {\n                        g: () => properties.context\n                    });\n\n                    if (!_throttleMgr){\n                        _throttleMgr = new ThrottleMgr(_core);\n                    }\n                    let sdkSrc = _findSdkSourceFile();\n                    if (sdkSrc && _self.context) {\n                        _self.context.internal.sdkSrc = sdkSrc;\n                    }\n                    _updateSnippetProperties(_self.snippet);\n        \n                    // Empty queue of all api calls logged prior to sdk download\n                    _self.emptyQueue();\n                    _self.pollInternalLogs();\n                    _self.addHousekeepingBeforeUnload(_self);\n\n                    _addUnloadHook(onConfigChange(cfgHandler, () => {\n                        var defaultEnable = false;\n                        if (_config.throttleMgrCfg[_eInternalMessageId.DefaultThrottleMsgKey]){\n                            defaultEnable = !_config.throttleMgrCfg[_eInternalMessageId.DefaultThrottleMsgKey].disabled;\n                        }\n\n                        if (!_throttleMgr.isReady() && _config.extensionConfig && _config.extensionConfig[_cfgSyncPlugin.identifier] && defaultEnable) {\n                            // set ready state to true will automatically trigger flush()\n                            _throttleMgr.onReadyState(true);\n                        }\n\n                        if (!_iKeySentMessage && !_config.connectionString && isFeatureEnabled(IKEY_USAGE, _config, true)) {\n                            _throttleMgr.sendMessage( _eInternalMessageId.InstrumentationKeyDeprecation, \"See Instrumentation key support at aka.ms/IkeyMigrate\");\n                            _iKeySentMessage = true;\n                        }\n\n                        if (!_cdnSentMessage && _self.context.internal.sdkSrc && _self.context.internal.sdkSrc.indexOf(\"az416426\") != -1 && isFeatureEnabled(CDN_USAGE, _config, true)) {\n                            _throttleMgr.sendMessage( _eInternalMessageId.CdnDeprecation, \"See Cdn support notice at aka.ms/JsActiveCdn\");\n                            _cdnSentMessage = true;\n                        }\n                       \n                        if (!_sdkVerSentMessage && parseInt(_snippetVersion) < 6 && isFeatureEnabled(SDK_LOADER_VER, _config, true)) {\n                            _throttleMgr.sendMessage( _eInternalMessageId.SdkLdrUpdate, \"An updated Sdk Loader is available, see aka.ms/SnippetVer\");\n                            _sdkVerSentMessage = true;\n                        }\n                        \n                    }));\n                });\n                return _self;\n            };\n\n            _self.updateSnippetDefinitions = (snippet: Snippet) => {\n                // apply full appInsights to the global instance\n                // Note: This must be called before loadAppInsights is called\n                proxyAssign(snippet, _self, (name: string) => {\n                    // Not excluding names prefixed with \"_\" as we need to proxy some functions like _onError\n                    return name && arrIndexOf(_ignoreProxyAssignProperties, name) === -1;\n                });\n            };\n        \n            _self.emptyQueue = () => {\n                // call functions that were queued before the main script was loaded\n                try {\n                    if (isArray(_self.snippet.queue)) {\n                        // note: do not check length in the for-loop conditional in case something goes wrong and the stub methods are not overridden.\n                        const length = _self.snippet.queue.length;\n                        for (let i = 0; i < length; i++) {\n                            const call = _self.snippet.queue[i];\n                            call();\n                        }\n        \n                        _self.snippet.queue = undefined;\n                        delete _self.snippet.queue;\n                    }\n                } catch (exception) {\n                    const properties: any = {};\n                    if (exception && isFunction(exception.toString)) {\n                        properties.exception = exception.toString();\n                    }\n        \n                    // need from core\n                    // Microsoft.ApplicationInsights._InternalLogging.throwInternal(\n                    //     eLoggingSeverity.WARNING,\n                    //     _eInternalMessageId.FailedToSendQueuedTelemetry,\n                    //     \"Failed to send queued telemetry\",\n                    //     properties);\n                }\n            };\n\n            _self.addHousekeepingBeforeUnload = (appInsightsInstance: IApplicationInsights): void => {\n                // Add callback to push events when the user navigates away\n        \n                if (hasWindow() || hasDocument()) {\n                    const performHousekeeping = () => {\n                        // Adds the ability to flush all data before the page unloads.\n                        // Note: This approach tries to push a sync request with all the pending events onbeforeunload.\n                        // Firefox does not respect this.Other browsers DO push out the call with < 100% hit rate.\n                        // Telemetry here will help us analyze how effective this approach is.\n                        // Another approach would be to make this call sync with a acceptable timeout to reduce the\n                        // impact on user experience.\n        \n                        // appInsightsInstance.context._sender.triggerSend();\n                        appInsightsInstance.onunloadFlush(false);\n        \n                        // Back up the current session to local storage\n                        // This lets us close expired sessions after the cookies themselves expire\n                        if (isFunction(_self.core.getPlugin)) {\n                            let loadedPlugin = this.core.getPlugin(PropertiesPluginIdentifier);\n                            if (loadedPlugin) {\n                                let propertiesPlugin: any = loadedPlugin.plugin;\n                                if (propertiesPlugin && propertiesPlugin.context && propertiesPlugin.context._sessionManager) {\n                                    propertiesPlugin.context._sessionManager.backup();\n                                }\n                            }\n                        }\n                    };\n        \n                    let added = false;\n\n                    if (!_houseKeepingNamespace) {\n                        _houseKeepingNamespace = mergeEvtNamespace(_evtNamespace, _core.evtNamespace && _core.evtNamespace());\n                    }\n\n                    // Will be recalled if any referenced config properties change\n                    _addUnloadHook(onConfigChange(_config, (details) => {\n                        let coreConfig = details.cfg;\n                        let analyticsPlugin = appInsightsInstance.appInsights;\n                        let ctx = createProcessTelemetryContext(null, coreConfig, analyticsPlugin.core);\n                        let extConfig = ctx.getExtCfg<IConfig>(analyticsPlugin.identifier || AnalyticsPluginIdentifier);\n\n                        // As we could get recalled, remove any previously registered event handlers first\n                        _removePageEventHandlers();\n\n                        let excludePageUnloadEvents = coreConfig.disablePageUnloadEvents;\n                        if (!extConfig.disableFlushOnBeforeUnload) {\n                            // Hook the unload event for the document, window and body to ensure that the client events are flushed to the server\n                            // As just hooking the window does not always fire (on chrome) for page navigation's.\n                            if (addPageUnloadEventListener(performHousekeeping, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                                added = true;\n                            }\n            \n                            // We also need to hook the pagehide and visibilitychange events as not all versions of Safari support load/unload events.\n                            if (addPageHideEventListener(performHousekeeping, excludePageUnloadEvents, _houseKeepingNamespace)) {\n                                added = true;\n                            }\n            \n                            // A reactNative app may not have a window and therefore the beforeunload/pagehide events -- so don't\n                            // log the failure in this case\n                            if (!added && !isReactNative()) {\n                                _throwInternal(_core.logger,\n                                    eLoggingSeverity.CRITICAL,\n                                    _eInternalMessageId.FailedToAddHandlerForOnBeforeUnload,\n                                    \"Could not add handler for beforeunload and pagehide\");\n                            }\n                        }\n\n                        if (!added && !extConfig.disableFlushOnUnload) {\n                            // If we didn't add the normal set then attempt to add the pagehide and visibilitychange only\n                            addPageHideEventListener(performHousekeeping, excludePageUnloadEvents, _houseKeepingNamespace);\n                        }\n                    }));\n                }\n            };\n        \n            _self.getSender = (): Sender => {\n                return _sender;\n            };\n\n            _self.unload = (isAsync?: boolean, unloadComplete?: (unloadState: ITelemetryUnloadState) => void, cbTimeout?: number): void | IPromise<ITelemetryUnloadState> => {\n                let unloadDone = false;\n                let result: IPromise<ITelemetryUnloadState>;\n                if (isAsync !== false && !unloadComplete) {\n                    result = createPromise<ITelemetryUnloadState>((resolve) => {\n                        // Set the callback to the promise resolve callback\n                        unloadComplete = resolve;\n                    });\n                }\n\n                function _unloadCallback(unloadState: ITelemetryUnloadState) {\n                    if (!unloadDone) {\n                        unloadDone = true;\n\n                        // Reset OTel API to clean up all trace state before unloading core\n                        if (_core) {\n                            // Clear the trace provider to stop any active spans\n                            _core.setTraceProvider(null);\n\n                            // Reset the OTel API instances - this will be recreated on next init\n                            if (_otelApi) {\n                                _otelApi.v.shutdown();\n                            }\n\n                            _otelApi = null;\n                        }\n\n                        _initDefaults();\n\n                        unloadComplete && unloadComplete(unloadState);\n                    }\n                }\n\n                _self.onunloadFlush(isAsync);\n\n                _removePageEventHandlers();\n\n                _core.unload && _core.unload(isAsync, _unloadCallback, cbTimeout);\n\n                return result;\n            };\n        \n            proxyFunctions(_self, _analyticsPlugin, [\n                STR_GET_COOKIE_MGR,\n                STR_TRACK_EVENT,\n                STR_TRACK_PAGE_VIEW,\n                \"trackPageViewPerformance\",\n                STR_TRACK_EXCEPTION,\n                \"_onerror\",\n                STR_TRACK_TRACE,\n                STR_TRACK_METRIC,\n                STR_START_TRACK_PAGE,\n                STR_STOP_TRACK_PAGE,\n                STR_START_TRACK_EVENT,\n                STR_STOP_TRACK_EVENT\n            ]);\n\n            proxyFunctions(_self, _getCurrentDependencies, [\n                STR_TRACK_DEPENDENCY_DATA,\n                \"addDependencyListener\",\n                \"addDependencyInitializer\"\n            ]);\n\n            proxyFunctions(_self, _core, [\n                STR_ADD_TELEMETRY_INITIALIZER,\n                STR_POLL_INTERNAL_LOGS,\n                \"stopPollingInternalLogs\",\n                STR_GET_PLUGIN,\n                \"addPlugin\",\n                STR_EVT_NAMESPACE,\n                \"addUnloadCb\",\n                \"updateCfg\",\n                \"onCfgChange\",\n                // ITraceHost Proxy\n                \"getTraceCtx\",\n                \"setTraceCtx\",\n                \"startSpan\",\n                \"getActiveSpan\",\n                \"setActiveSpan\",\n                \"setTraceProvider\",\n                \"getTraceProvider\"\n            ]);\n\n            proxyFunctions(_self, () => {\n                let context = properties.context;\n                return context ? context.user : null;\n            }, [\n                STR_SET_AUTHENTICATED_USER_CONTEXT,\n                STR_CLEAR_AUTHENTICATED_USER_CONTEXT\n            ]);\n\n            // Handle span end event - create telemetry from span data\n            function _onEnd(span: IReadableSpan) {\n                if (_otelApi && span && span.isRecording() && !_otelApi.v.cfg.traceCfg.suppressTracing) {\n\n                    // Flip this span to be the \"current\" span during processing, so any telemetry created during the span processing\n                    // is associated with this span\n                    useSpan(_core, span, () => {\n                        try {\n                            // Create trace telemetry for the span\n                            let telemetryItem: ITelemetryItem = createTelemetryItemFromSpan(_core, span);\n                            if (telemetryItem) {\n                                _self.core.track(telemetryItem);\n                            }\n                        } catch (error) {\n                            // Log any errors during trace processing but don't let them break the span lifecycle\n                            _throwInternal(_core.logger, eLoggingSeverity.WARNING,\n                                _eInternalMessageId.TelemetryInitializerFailed,\n                                \"Error processing span - \" + dumpObj(error));\n                        }\n                    });\n                }\n            }\n\n            function _onException(span: IReadableSpan, exception: any, time?: OTelTimeInput) {\n                if (_otelApi) {\n                    // Flip this span to be the \"current\" span during processing, so any telemetry created during the span processing\n                    useSpan(_core, span, () => {\n                        try {\n                            _self.trackException({\n                                exception: exception,\n                                properties: {\n                                    time: time\n                                }\n                            });\n                        } catch (error) {\n                            // Log any errors during exception processing but don't let them break the span lifecycle\n                            _throwInternal(_core.logger, eLoggingSeverity.WARNING,\n                                _eInternalMessageId.TelemetryInitializerFailed,\n                                \"Error processing exception - \" + dumpObj(error));\n                        }\n                    });\n                }\n            }\n\n            // Using a function to support the dynamic adding / removal of plugins, so this will always return the current value\n            function _getCurrentDependencies() {\n                return dependencies;\n            }\n\n            function _initDefaults() {\n                _evtNamespace = createUniqueNamespace(\"AISKU\");\n                _houseKeepingNamespace = null;\n                dependencies = null;\n                properties = null;\n                _sender = null;\n                _snippetVersion = null;\n                _throttleMgr = null;\n                _iKeySentMessage = false;\n                _cdnSentMessage = false;\n                _sdkVerSentMessage = false;\n                _cfgSyncPlugin = new CfgSyncPlugin();\n            }\n\n            function _removePageEventHandlers() {\n                // Remove any registered event handlers\n                if (_houseKeepingNamespace) {\n                    removePageUnloadEventListener(null, _houseKeepingNamespace);\n                    removePageHideEventListener(null, _houseKeepingNamespace);\n                }\n            }\n\n            function _addUnloadHook(hooks: IUnloadHook | IUnloadHook[] | Iterator<IUnloadHook>) {\n                _core.addUnloadHook(hooks);\n            }\n        });\n    }\n\n    // Analytics Plugin\n\n    /**\n     * Get the current cookie manager for this instance\n     */\n    public getCookieMgr(): ICookieMgr {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Log a user action or other occurrence.\n     * @param event - event to be sent\n     * @param customProperties - properties that would be included as part of the event\n     */\n    public trackEvent(event: IEventTelemetry, customProperties?: ICustomProperties) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Logs that a page, or similar container was displayed to the user.\n     * @param pageView - page view to be sent\n     */\n    public trackPageView(pageView?: IPageViewTelemetry) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Log a bag of performance information via the customProperties field.\n     * @param pageViewPerformance - performance information to be sent\n     */\n    public trackPageViewPerformance(pageViewPerformance: IPageViewPerformanceTelemetry): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Log an exception that you have caught.\n     * @param exception - exception to be sent\n     * @param customProperties - Additional data used to filter pages and metrics in the portal. Defaults to empty.\n     */\n    public trackException(exception: IExceptionTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Manually send uncaught exception telemetry. This method is automatically triggered\n     * on a window.onerror event.\n     * @param exception - The exception to be sent.\n     */\n    public _onerror(exception: IAutoExceptionTelemetry): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Log a diagnostic scenario such entering or leaving a function.\n     * @param trace - trace to be sent\n     * @param customProperties - Additional custom properties to include in the event.\n     */\n    public trackTrace(trace: ITraceTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Log a numeric value that is not associated with a specific event. Typically used\n     * to send regular reports of performance indicators.\n     *\n     * To send a single measurement, just use the `name` and `average` fields\n     * of {@link IMetricTelemetry}.\n     *\n     * If you take measurements frequently, you can reduce the telemetry bandwidth by\n     * aggregating multiple measurements and sending the resulting average and modifying\n     * the `sampleCount` field of {@link IMetricTelemetry}.\n     * @param metric - input object argument. Only `name` and `average` are mandatory.\n     * @param customProperties - Additional custom properties to include in the event.\n     */\n    public trackMetric(metric: IMetricTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n    /**\n     * Starts the timer for tracking a page load time. Use this instead of `trackPageView` if you want to control when the page view timer starts and stops,\n     * but don't want to calculate the duration yourself. This method doesn't send any telemetry. Call `stopTrackPage` to log the end of the page view\n     * and send the event.\n     * @param name - A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n     */\n    public startTrackPage(name?: string): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Stops the timer that was started by calling `startTrackPage` and sends the pageview load time telemetry with the specified properties and measurements.\n     * The duration of the page view will be the time between calling `startTrackPage` and `stopTrackPage`.\n     * @param   name  - The string you used as the name in startTrackPage. Defaults to the document title.\n     * @param   url   - a relative or absolute URL that identifies the page or other item. Defaults to the window location.\n     * @param   properties - additional data used to filter pages and metrics in the portal. Defaults to empty.\n     * @param   measurements - metrics associated with this page, displayed in Metrics Explorer on the portal. Defaults to empty.\n     */\n    public stopTrackPage(name?: string, url?: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public startTrackEvent(name?: string): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Log an extended event that you started timing with `startTrackEvent`.\n     * @param   name  - The string you used to identify this event in `startTrackEvent`.\n     * @param   properties - map[string, string] - additional data used to filter events and metrics in the portal. Defaults to empty.\n     * @param   measurements -  map[string, number] - metrics associated with this event, displayed in Metrics Explorer on the portal. Defaults to empty.\n     */\n    public stopTrackEvent(name: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public addTelemetryInitializer(telemetryInitializer: (item: ITelemetryItem) => boolean | void): ITelemetryInitializerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    // Properties Plugin\n\n    /**\n     * Set the authenticated user id and the account id. Used for identifying a specific signed-in user. Parameters must not contain whitespace or ,;=|\n     *\n     * The method will only set the `authenticatedUserId` and `accountId` in the current page view. To set them for the whole session, you should set `storeInCookie = true`\n     * @param authenticatedUserId - The account ID to set\n     * @param accountId - The account ID to set\n     * @param storeInCookie - Whether the values should be set for the whole session\n     */\n    public setAuthenticatedUserContext(authenticatedUserId: string, accountId?: string, storeInCookie = false): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Clears the authenticated user id and account id. The associated cookie is cleared, if present.\n     */\n    public clearAuthenticatedUserContext(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    // Dependencies Plugin\n\n    /**\n     * Log a dependency call (e.g. ajax)\n     * @param dependencyData - dependency data object\n     */\n    public trackDependencyData(dependency: IDependencyTelemetry): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    // Misc\n\n    /**\n     * Attempt to flush data immediately; If executing asynchronously (the default) and\n     * you DO NOT pass a callback function then a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the flush is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param async - send data asynchronously when true\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @returns - If a callback is provided `true` to indicate that callback will be called after the flush is complete otherwise the caller\n     * should assume that any provided callback will never be called, Nothing or if occurring asynchronously a\n     * [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) which will be resolved once the unload is complete,\n     * the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) will only be returned when no callback is provided\n     * and async is true.\n     */\n    public flush(async?: boolean, callBack?: () => void): void | IPromise<void> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Manually trigger an immediate send of all telemetry still in the buffer using beacon Sender.\n     * Fall back to xhr sender if beacon is not supported.\n     * @param async - send data asynchronously when true, default is true\n     */\n    public onunloadFlush(async: boolean = true) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Initialize this instance of ApplicationInsights\n     * @param legacyMode - MUST always be false, it is no longer supported from v3.x onwards\n     * @returns The initialized {@link IApplicationInsights} instance\n     */\n    public loadAppInsights(legacyMode: boolean = false, logger?: IDiagnosticLogger, notificationManager?: INotificationManager): IApplicationInsights {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Overwrite the lazy loaded fields of global window snippet to contain the\n     * actual initialized API methods\n     * @param snippet - The global snippet\n     */\n    public updateSnippetDefinitions(snippet: Snippet) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Call any functions that were queued before the main script was loaded\n     */\n    public emptyQueue() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public pollInternalLogs(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public stopPollingInternalLogs(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public addHousekeepingBeforeUnload(appInsightsInstance: IApplicationInsights): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getSender(): Sender {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered\n     * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous\n     * unload call return `true` stating that all plugins reported that they also unloaded, the recommended\n     * approach is to create a new instance and initialize that instance.\n     * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable\n     * to successfully remove any global references or they may just be completing the unload process asynchronously.\n     * If you pass isAsync as true and do not provide\n     * If you pass isAsync as `true` (also the default) and DO NOT pass a callback function then an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the unload is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @param unloadComplete - An optional callback that will be called once the unload has completed\n     * @param cbTimeout - An optional timeout to wait for any flush operations to complete before proceeding with the\n     * unload. Defaults to 5 seconds.\n     * @returns Nothing or if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * which will be resolved once the unload is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will only be returned when no callback is provided and isAsync is true\n     */\n    public unload(isAsync?: boolean, unloadComplete?: (unloadState: ITelemetryUnloadState) => void, cbTimeout?: number): void | IPromise<ITelemetryUnloadState> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add a new plugin to the installation\n     * @param plugin - The new plugin to add\n     * @param replaceExisting - should any existing plugin be replaced, default is false\n     * @param doAsync - Should the add be performed asynchronously\n     * @param addCb - [Optional] callback to call after the plugin has been added\n     */\n    public addPlugin<T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting?: boolean, doAsync?: boolean, addCb?: (added?: boolean) => void): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Update the configuration used and broadcast the changes to all loaded plugins\n     * @param newConfig - The new configuration is apply\n     * @param mergeExisting - Should the new configuration merge with the existing or just replace it. Default is to merge.\n     */\n    public updateCfg<T extends IConfiguration = IConfiguration>(newConfig: T, mergeExisting?: boolean): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Returns the unique event namespace that should be used\n     */\n    public evtNamespace(): string {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add an unload handler that will be called when the SDK is being unloaded\n     * @param handler - the handler\n     */\n    public addUnloadCb(handler: UnloadHandler): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add an ajax listener which is called just prior to the request being sent and before the correlation headers are added, to allow you\n     * to access the headers and modify the values used to generate the distributed tracing correlation headers. (added in v2.8.4)\n     * @param dependencyListener - The Telemetry Initializer function\n     * @returns - A IDependencyListenerHandler to enable the initializer to be removed\n     */\n    public addDependencyListener(dependencyListener: DependencyListenerFunction): IDependencyListenerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add an dependency telemetry initializer callback function to allow populating additional properties or drop the request.\n     * It is called after the dependency call has completed and any available performance details are available. A dependency\n     * initializer is similar to the TelemetryInitializer function but it allows you to block the reporting of the dependency\n     * request so that it doesn't count against the `maxAjaxCallsPerView`.\n     * @param dependencyInitializer - The Dependency Telemetry Initializer function\n     * @returns - A IDependencyInitializerHandler to enable the initializer to be removed\n     */\n    public addDependencyInitializer(dependencyInitializer: DependencyInitializerFunction): IDependencyInitializerHandler {\n        return null;\n    }\n\n    /**\n     * Gets the current distributed trace context for this instance if available\n     */\n    public getTraceCtx(): IDistributedTraceContext | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Sets the current distributed trace context for this instance if available\n     */\n    public setTraceCtx(newTraceCtx: IDistributedTraceContext | null | undefined): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Watches and tracks changes for accesses to the current config, and if the accessed config changes the\n     * handler will be recalled.\n     * @param handler - The handler to call when the config changes\n     * @returns A watcher handler instance that can be used to remove itself when being unloaded\n     */\n    public onCfgChange(handler: WatcherFunction<IConfiguration>): IUnloadHook {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Start a new span with the given name and optional parent context.\n     *\n     * Note: This method only creates and returns the span. It does not automatically\n     * set the span as the active trace context. Context management should be handled\n     * separately using setTraceCtx() if needed.\n     *\n     * @param name - The name of the span\n     * @param options - Options for creating the span (kind, attributes, startTime)\n     * @param parent - Optional parent context. If not provided, uses the current active trace context\n     * @returns A new span instance, or null if no trace provider is available\n     * @since 3.4.0\n     */\n    public startSpan(name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Return the current active span, if no trace provider is available null will be returned\n     * but when a trace provider is available a span instance will always be returned, even if\n     * there is no active span (in which case a non-recording span will be returned).\n     * @param createNew - Optional flag to create a non-recording span if no active span exists, defaults to true.\n     * When false, returns the existing active span or null without creating a non-recording span.\n     * @returns The current active span or null if no trace provider is available or if createNew is false and no active span exists\n     * @since 3.4.0\n     */\n    public getActiveSpan(createNew?: boolean): IReadableSpan | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Set the current Active Span, if no trace provider is available the span will be not be set as the active span.\n     * @param span - The span to set as the active span\n     * @returns An ISpanScope instance that provides the current scope, the span will always be the span passed in\n     * even when no trace provider is available\n     * @since 3.4.0\n     */\n    public setActiveSpan(span: IReadableSpan): ISpanScope {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Set the trace provider for creating spans.\n     * This allows different SKUs to provide their own span implementations.\n     *\n     * @param provider - The trace provider to use for span creation\n     * @since 3.4.0\n     */\n    public setTraceProvider(provider: ICachedValue<ITraceProvider>): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get the current trace provider.\n     *\n     * @returns The current trace provider, or null if none is set\n     * @since 3.4.0\n     */\n    public getTraceProvider(): ITraceProvider | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n\n// tslint:disable-next-line\nexport function _findSdkSourceFile() {\n    if (_internalSdkSrc) {\n        // Use the cached value\n        return _internalSdkSrc;\n    }\n\n    let sdkSrc = null;\n    let isModule = false;\n    let cdns: string[] = [\n        \"://js.monitor.azure.com/\",\n        \"://az416426.vo.msecnd.net/\"\n    ];\n\n    try {\n        // Try and determine whether the sdk is being loaded from the CDN\n        // currentScript is only valid during initial processing\n        let scrpt = (document || {} as any).currentScript;\n        if (scrpt) {\n            sdkSrc = scrpt.src;\n        // } else {\n        //     // We need to update to at least typescript 2.9 for this to work :-(\n        //     // Leaving as a stub for now so after we upgrade this breadcrumb is available\n        //     let meta = import.meta;\n        //     sdkSrc = (meta || {}).url;\n        //     isModule = true;\n        }\n    } catch (e) {\n        // eslint-disable-next-line no-empty\n    }\n\n    if (sdkSrc) {\n        try {\n            let url = sdkSrc.toLowerCase();\n            if (url) {\n                let src = \"\";\n                arrForEach(cdns, (value, idx) => {\n                    if (strIndexOf(url, value) !== -1) {\n                        src = \"cdn\" + (idx + 1);\n                        if (strIndexOf(url, \"/scripts/\") === -1) {\n                            if (strIndexOf(url, \"/next/\") !== -1) {\n                                src += \"-next\";\n                            } else if (strIndexOf(url, \"/beta/\") !== -1) {\n                                src += \"-beta\";\n                            }\n                        }\n\n                        _internalSdkSrc = src + (isModule ? \".mod\" : \"\");\n                        return -1;\n                    }\n                });\n            }\n        } catch (e) {\n            // eslint-disable-next-line no-empty\n        }\n\n        // Cache the found value so we don't have to look it up again\n        _internalSdkSrc = sdkSrc;\n    }\n\n    return _internalSdkSrc;\n}\n"
  },
  {
    "path": "AISKU/src/ApplicationInsightsContainer.ts",
    "content": "import { throwUnsupported } from \"@nevware21/ts-utils\";\nimport { AppInsightsSku } from \"./AISku\";\nimport { IApplicationInsights } from \"./IApplicationInsights\";\nimport { Snippet } from \"./Snippet\";\n\nexport class ApplicationInsightsContainer {\n\n    public static getAppInsights(snippet: Snippet, version: number) : IApplicationInsights {\n        const theSku = new AppInsightsSku(snippet);\n        \n        // Two target scenarios:\n        // Removed: 1. Customer runs v1 snippet + runtime. If customer updates just cdn location to new SDK, it will run in compat mode so old apis work\n        // 2. Customer updates to new snippet (that uses cdn location to new SDK. This is same as a new customer onboarding\n        // and all api signatures are expected to map to new SDK. Note new snippet specifies version\n\n        if (version >= 2.0) {\n            theSku.updateSnippetDefinitions(snippet);\n            theSku.loadAppInsights(false);\n            return theSku; // default behavior with new snippet\n        }\n        \n        throwUnsupported(\"V1 API compatibility is no longer supported\");\n    }\n}\n"
  },
  {
    "path": "AISKU/src/IApplicationInsights.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { AnalyticsPlugin } from \"@microsoft/applicationinsights-analytics-js\";\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\";\nimport {\n    IAppInsights, IConfiguration, ILoadedPlugin, IOTelApi, IPlugin, IPropertiesPlugin, IRequestHeaders, ITelemetryPlugin,\n    ITelemetryUnloadState, ITraceApi, ITraceHost, UnloadHandler\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IDependenciesPlugin } from \"@microsoft/applicationinsights-dependencies-js\";\nimport { IPromise } from \"@nevware21/ts-async\";\n\nexport { IRequestHeaders };\n\nexport interface IApplicationInsights<CfgType extends IConfiguration = IConfiguration> extends IAppInsights, IDependenciesPlugin, IPropertiesPlugin, ITraceHost<CfgType> {\n    appInsights: AnalyticsPlugin;\n\n    /**\n     * The OpenTelemetry API instance associated with this instance\n     * Unlike OpenTelemetry, this API does not return a No-Op implementation and returns null if the SDK has been torn\n     * down or not yet initialized.\n     */\n    readonly otelApi: IOTelApi | null;\n\n    /**\n     * OpenTelemetry trace API for creating spans.\n     * Unlike OpenTelemetry, this API does not return a No-Op implementation and returns null if the SDK has been torn\n     * down or not yet initialized.\n     */\n    readonly trace: ITraceApi | null;\n\n    /**\n     * Attempt to flush data immediately; If executing asynchronously (the default) and\n     * you DO NOT pass a callback function then a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the flush is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param async - send data asynchronously when true\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @returns - If a callback is provided `true` to indicate that callback will be called after the flush is complete otherwise the caller\n     * should assume that any provided callback will never be called, Nothing or if occurring asynchronously a\n     * [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) which will be resolved once the unload is complete,\n     * the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) will only be returned when no callback is provided\n     * and async is true.\n     */\n    flush: (async?: boolean, callBack?: () => void) => void | IPromise<void>;\n\n    onunloadFlush: (async?: boolean) => void;\n    getSender: () => Sender;\n    setAuthenticatedUserContext(authenticatedUserId: string, accountId?: string, storeInCookie?: boolean): void;\n    clearAuthenticatedUserContext(): void;\n\n    /**\n     * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered\n     * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous\n     * unload call return `true` stating that all plugins reported that they also unloaded, the recommended\n     * approach is to create a new instance and initialize that instance.\n     * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable\n     * to successfully remove any global references or they may just be completing the unload process asynchronously.\n     * If you pass isAsync as `true` (also the default) and DO NOT pass a callback function then an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the unload is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @param unloadComplete - An optional callback that will be called once the unload has completed\n     * @param cbTimeout - An optional timeout to wait for any flush operations to complete before proceeding with the\n     * unload. Defaults to 5 seconds.\n     * @returns Nothing or if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * which will be resolved once the unload is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will only be returned when no callback is provided and isAsync is true\n     */\n    unload(isAsync?: boolean, unloadComplete?: (unloadState: ITelemetryUnloadState) => void, cbTimeout?: number): void | IPromise<ITelemetryUnloadState>;\n\n    /**\n     * Find and return the (first) plugin with the specified identifier if present\n     * @param pluginIdentifier - The identifier of the plugin to find\n     */\n    getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T>;\n  \n    /**\n     * Add a new plugin to the installation\n     * @param plugin - The new plugin to add\n     * @param replaceExisting - should any existing plugin be replaced\n     * @param doAsync - Should the add be performed asynchronously\n     */\n    addPlugin<T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting: boolean, doAsync: boolean, addCb?: (added?: boolean) => void): void;\n  \n    /**\n     * Update the configuration used and broadcast the changes to all loaded plugins, this does NOT support updating, adding or removing\n     * any the plugins. It will notify (if supported) that the configuration has changed but it will not remove or add any new plugins\n     * @param newConfig - The new configuration is apply\n     * @param mergeExisting - Should the new configuration merge with the existing or just replace it. Default is to merge.\n     */\n    updateCfg<T extends IConfiguration = IConfiguration>(newConfig: T, mergeExisting?: boolean): void;\n  \n    /**\n     * Returns the unique event namespace that should be used when registering events\n     */\n    evtNamespace(): string;\n  \n    /**\n     * Add a handler that will be called when the SDK is being unloaded\n     * @param handler - the handler\n     */\n    addUnloadCb(handler: UnloadHandler): void;\n}\n"
  },
  {
    "path": "AISKU/src/Init.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strUndefined } from \"@microsoft/applicationinsights-core-js\";\nimport { getInst } from \"@nevware21/ts-utils\";\nimport { ApplicationInsightsContainer } from \"./ApplicationInsightsContainer\";\nimport { Snippet } from \"./Snippet\";\n\n// ----------------------------------------------------------------------------------------------------\n// Exports available from the Cdn bundles\n// ----------------------------------------------------------------------------------------------------\nexport {\n    AppInsightsSku as ApplicationInsights\n} from \"./AISku\";\nexport { IApplicationInsights } from \"./IApplicationInsights\";\n\nexport { Snippet };\nexport {\n    LoggingSeverity,\n    PerfEvent,\n    PerfManager,\n    doPerf,\n    newId,\n    newGuid,\n    random32,\n    randomValue,\n    generateW3CId,\n    findW3cTraceParent,\n    findMetaTag,\n    mergeEvtNamespace,\n    eventOn,\n    eventOff,\n    addEventHandler,\n    removeEventHandler,\n    isBeaconsSupported\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport {\n    RequestHeaders,\n    DisabledPropertyName,\n    DEFAULT_BREEZE_ENDPOINT,\n    SeverityLevel,\n    DistributedTracingModes,\n    PropertiesPluginIdentifier,\n    BreezeChannelIdentifier,\n    AnalyticsPluginIdentifier\n} from \"@microsoft/applicationinsights-core-js\";\n\n// ----------------------------------------------------------------------------------------------------\n// End of Exports available from the Cdn bundles\n// ----------------------------------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------------------------------\n// Additional exports available from applicationinsights-web.ts (interfaces and enums for typedoc)\n// ----------------------------------------------------------------------------------------------------\nexport {\n    IConfiguration,\n    IAppInsightsCore,\n    eLoggingSeverity,\n    ITelemetryItem,\n    ITelemetryPlugin,\n    IPerfEvent,\n    IPerfManager,\n    IPerfManagerProvider,\n    INotificationListener,\n    IPlugin,\n    IDiagnosticLogger,\n    ITelemetryPluginChain,\n    ICustomProperties,\n    INotificationManager,\n    IProcessTelemetryContext,\n    ILoadedPlugin\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport {\n    IConfig,\n    IDependencyTelemetry,\n    IPageViewPerformanceTelemetry,\n    IPageViewTelemetry,\n    IExceptionTelemetry,\n    IAutoExceptionTelemetry,\n    ITraceTelemetry,\n    IMetricTelemetry,\n    IEventTelemetry,\n    IRequestTelemetry,\n    IAppInsights,\n    eSeverityLevel,\n    IRequestHeaders,\n    EventPersistence\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport { ISenderConfig } from \"@microsoft/applicationinsights-channel-js\";\n\nexport { IAppInsightsInternal } from \"@microsoft/applicationinsights-analytics-js\";\n\nexport {\n    IDependenciesPlugin,\n    DependencyListenerFunction,\n    DependencyInitializerFunction,\n    IDependencyInitializerHandler,\n    IDependencyListenerHandler\n} from \"@microsoft/applicationinsights-dependencies-js\";\n\nexport {\n    ICfgSyncPlugin,\n    ICfgSyncConfig,\n    ICfgSyncEvent,\n    ICfgSyncMode,\n    NonOverrideCfg,\n    OnCompleteCallback,\n    SendGetFunction\n} from \"@microsoft/applicationinsights-cfgsync-js\";\n\n// ----------------------------------------------------------------------------------------------------\n// End of Additional exports\n// ----------------------------------------------------------------------------------------------------\n\n\nfunction _logWarn(aiName:string, message:string) {\n    // TODO: Find better place to warn to console when SDK initialization fails\n    var _console = getInst<Console>(\"console\");\n    if (_console && _console.warn) {\n        _console.warn(\"Failed to initialize AppInsights JS SDK for instance \" + (aiName || \"<unknown>\") + \" - \" + message);\n    }\n}\n\n// should be global function that should load as soon as SDK loads\ntry {\n\n    // E2E sku on load initializes core and pipeline using snippet as input for configuration\n    // tslint:disable-next-line: no-var-keyword\n    var aiName;\n    if (typeof window !== strUndefined) {\n        var _window = window;\n        aiName = _window[\"appInsightsSDK\"] || \"appInsights\";\n        if (document.currentScript) {\n            aiName = document.currentScript.getAttribute(\"data-ai-name\") || aiName;\n        }\n        if (typeof JSON !== strUndefined) {\n            // get snippet or initialize to an empty object\n\n            if (_window[aiName] !== undefined) {\n                // this is the typical case for browser+snippet\n                const snippet: Snippet = _window[aiName] || ({ version: 2.0 } as any);\n\n                // overwrite snippet with full appInsights\n                // only initiaize if required and detected snippet version is >= 2 or not defined\n                if ((snippet.version >= 2 && (_window[aiName] as any).initialize) || snippet.version === undefined ) {\n                    ApplicationInsightsContainer.getAppInsights(snippet, snippet.version);\n                }\n            }\n        } else {\n            _logWarn(aiName, \"Missing JSON - you must supply a JSON polyfill!\");\n        }\n    } else {\n        _logWarn(aiName, \"Missing window\");\n    }\n    // Hack: If legacy SDK exists, skip this step (Microsoft.ApplicationInsights exists).\n    // else write what was there for v2 SDK prior to rollup bundle output name change.\n    // e.g Microsoft.ApplicationInsights.ApplicationInsights, Microsoft.ApplicationInsights.Telemetry\n    // @todo uncomment once integration tests for this can be added\n    // if (typeof window !== strUndefined && window && ((window as any).Microsoft && !(window as any).Microsoft.ApplicationInsights)) {\n    //     (window as any).Microsoft = (window as any).Microsoft || {};\n    //     (window as any).Microsoft.ApplicationInsights = {\n    //         ApplicationInsights, Telemetry\n    //     };\n    // }\n} catch (e) {\n    _logWarn(aiName, e.message);\n}\n"
  },
  {
    "path": "AISKU/src/InternalConstants.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// ###################################################################################################################################################\n// Note: DON'T Export these const from the package as we are still targeting IE/ES5 this will export a mutable variables that someone could change ###\n// ###################################################################################################################################################\n\n// Generally you should only put values that are used more than 2 times and then only if not already exposed as a constant (such as SdkCoreNames)\n// as when using \"short\" named values from here they will be will be minified smaller than the SdkCoreNames[eSdkCoreNames.xxxx] value.\n\nconst _AUTHENTICATED_USER_CONTEXT = \"AuthenticatedUserContext\";\nconst _TRACK = \"track\";\n\nexport const UNDEFINED_VALUE: undefined = undefined;\nexport const STR_EMPTY = \"\";\nexport const STR_SNIPPET = \"snippet\";\nexport const STR_GET_COOKIE_MGR = \"getCookieMgr\";\nexport const STR_START_TRACK_PAGE = \"startTrackPage\";\nexport const STR_STOP_TRACK_PAGE = \"stopTrackPage\";\nexport const STR_FLUSH = \"flush\";\nexport const STR_START_TRACK_EVENT = \"startTrackEvent\";\nexport const STR_STOP_TRACK_EVENT = \"stopTrackEvent\";\nexport const STR_ADD_TELEMETRY_INITIALIZER = \"addTelemetryInitializer\";\nexport const STR_ADD_TELEMETRY_INITIALIZERS = STR_ADD_TELEMETRY_INITIALIZER + \"s\" as \"addTelemetryInitializers\";\nexport const STR_POLL_INTERNAL_LOGS = \"pollInternalLogs\";\nexport const STR_GET_PLUGIN = \"getPlugin\";\nexport const STR_EVT_NAMESPACE = \"evtNamespace\";\nexport const STR_TRACK_EVENT = _TRACK + \"Event\" as \"trackEvent\";\nexport const STR_TRACK_TRACE = _TRACK + \"Trace\" as \"trackTrace\";\nexport const STR_TRACK_METRIC = _TRACK + \"Metric\" as \"trackMetric\";\nexport const STR_TRACK_PAGE_VIEW = _TRACK + \"PageView\" as \"trackPageView\";\nexport const STR_TRACK_EXCEPTION = _TRACK + \"Exception\" as \"trackException\";\nexport const STR_TRACK_DEPENDENCY_DATA = _TRACK + \"DependencyData\" as \"trackDependencyData\";\nexport const STR_SET_AUTHENTICATED_USER_CONTEXT = \"set\" + _AUTHENTICATED_USER_CONTEXT as \"setAuthenticatedUserContext\";\nexport const STR_CLEAR_AUTHENTICATED_USER_CONTEXT = \"clear\" + _AUTHENTICATED_USER_CONTEXT as \"clearAuthenticatedUserContext\";\nexport const CONFIG_ENDPOINT_URL = \"https://js.monitor.azure.com/scripts/b/ai.config.1.cfg.json\";\n"
  },
  {
    "path": "AISKU/src/Snippet.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport { IConfig, IConfiguration } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n *\n * @export\n * @interface Snippet\n */\nexport interface Snippet {\n    config: IConfiguration & IConfig;\n    queue?: Array<() => void>;\n    sv?: string;\n    version?: number;\n}\n"
  },
  {
    "path": "AISKU/src/applicationinsights-web.ts",
    "content": "export { Snippet } from \"./Snippet\";\nexport { IApplicationInsights } from \"./IApplicationInsights\";\nexport { AppInsightsSku as ApplicationInsights } from \"./AISku\";\n\nexport { ApplicationInsightsContainer } from \"./ApplicationInsightsContainer\";\n\n// OpenTelemetry trace API exports (public interfaces only)\nexport { IOTelTracerProvider, IOTelTracer, IAttributeContainer, IOTelAttributes, IReadableSpan } from \"@microsoft/applicationinsights-core-js\";\n\n// Re-exports\nexport {\n    IConfiguration,\n    AppInsightsCore,\n    IAppInsightsCore,\n    LoggingSeverity,\n    eLoggingSeverity,\n    _eInternalMessageId,\n    ITelemetryItem,\n    ITelemetryPlugin,\n    IPerfEvent,\n    IPerfManager,\n    IPerfManagerProvider,\n    PerfEvent,\n    PerfManager,\n    doPerf,\n    INotificationListener,\n    NotificationManager,\n    IPlugin,\n    IDiagnosticLogger,\n    BaseTelemetryPlugin,\n    ITelemetryPluginChain,\n    ICustomProperties,\n    INotificationManager,\n    IProcessTelemetryContext,\n    Tags,\n    ILoadedPlugin,\n    IOTelSpan,\n    eOTelSpanKind,\n    OTelSpanKind,\n    IOTelSpanOptions\n} from \"@microsoft/applicationinsights-core-js\";\nexport {\n    IConfig,\n    IDependencyTelemetry,\n    IPageViewPerformanceTelemetry,\n    IPageViewTelemetry,\n    IExceptionTelemetry,\n    IAutoExceptionTelemetry,\n    ITraceTelemetry,\n    IMetricTelemetry,\n    IEventTelemetry,\n    IAppInsights,\n    SeverityLevel,\n    eSeverityLevel,\n    Event,\n    Exception,\n    Metric,\n    PageView,\n    PageViewPerformance,\n    Trace,\n    DistributedTracingModes,\n    IRequestHeaders,\n    EventPersistence\n} from \"@microsoft/applicationinsights-core-js\";\nexport { Sender, ISenderConfig } from \"@microsoft/applicationinsights-channel-js\";\nexport { ApplicationInsights as ApplicationAnalytics, IAppInsightsInternal, IAnalyticsConfig } from \"@microsoft/applicationinsights-analytics-js\";\nexport { PropertiesPlugin } from \"@microsoft/applicationinsights-properties-js\";\nexport {\n    AjaxPlugin as DependenciesPlugin, IDependenciesPlugin,\n    DependencyListenerFunction, DependencyInitializerFunction, IDependencyInitializerHandler, IDependencyListenerHandler\n} from \"@microsoft/applicationinsights-dependencies-js\";\n\nexport { CfgSyncPlugin, ICfgSyncPlugin, ICfgSyncConfig, ICfgSyncEvent, ICfgSyncMode, NonOverrideCfg, OnCompleteCallback, SendGetFunction\n} from \"@microsoft/applicationinsights-cfgsync-js\";\n\n"
  },
  {
    "path": "AISKU/src/internal/trace/spanUtils.ts",
    "content": "// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n    ATTR_CLIENT_ADDRESS, ATTR_CLIENT_PORT, ATTR_ENDUSER_ID, ATTR_ENDUSER_PSEUDO_ID, ATTR_ERROR_TYPE, ATTR_EXCEPTION_MESSAGE,\n    ATTR_EXCEPTION_STACKTRACE, ATTR_EXCEPTION_TYPE, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_HTTP_ROUTE,\n    ATTR_NETWORK_LOCAL_ADDRESS, ATTR_NETWORK_LOCAL_PORT, ATTR_NETWORK_PEER_ADDRESS, ATTR_NETWORK_PEER_PORT, ATTR_NETWORK_PROTOCOL_NAME,\n    ATTR_NETWORK_PROTOCOL_VERSION, ATTR_NETWORK_TRANSPORT, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_URL_FULL, ATTR_URL_PATH,\n    ATTR_URL_QUERY, ATTR_URL_SCHEME, ATTR_USER_AGENT_ORIGINAL, CtxTagKeys, DBSYSTEMVALUES_MONGODB, DBSYSTEMVALUES_MYSQL,\n    DBSYSTEMVALUES_POSTGRESQL, DBSYSTEMVALUES_REDIS, EXP_ATTR_ENDUSER_ID, EXP_ATTR_ENDUSER_PSEUDO_ID, EXP_ATTR_SYNTHETIC_TYPE,\n    IAppInsightsCore, IAttributeContainer, IConfiguration, IContextTagKeys, IDependencyTelemetry, IReadableSpan, IRequestTelemetry,\n    ITelemetryItem, MicrosoftClientIp, OTelAttributeValue, RemoteDependencyDataType, RemoteDependencyEnvelopeType, RequestDataType,\n    RequestEnvelopeType, SEMATTRS_DB_NAME, SEMATTRS_DB_OPERATION, SEMATTRS_DB_STATEMENT, SEMATTRS_DB_SYSTEM, SEMATTRS_ENDUSER_ID,\n    SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_EXCEPTION_STACKTRACE, SEMATTRS_EXCEPTION_TYPE, SEMATTRS_HTTP_CLIENT_IP, SEMATTRS_HTTP_FLAVOR,\n    SEMATTRS_HTTP_HOST, SEMATTRS_HTTP_METHOD, SEMATTRS_HTTP_ROUTE, SEMATTRS_HTTP_SCHEME, SEMATTRS_HTTP_STATUS_CODE, SEMATTRS_HTTP_TARGET,\n    SEMATTRS_HTTP_URL, SEMATTRS_HTTP_USER_AGENT, SEMATTRS_NET_HOST_IP, SEMATTRS_NET_HOST_NAME, SEMATTRS_NET_HOST_PORT, SEMATTRS_NET_PEER_IP,\n    SEMATTRS_NET_PEER_NAME, SEMATTRS_NET_PEER_PORT, SEMATTRS_NET_TRANSPORT, SEMATTRS_PEER_SERVICE, SEMATTRS_RPC_GRPC_STATUS_CODE,\n    SEMATTRS_RPC_SYSTEM, Tags, createAttributeContainer, createTelemetryItem, eDependencyTypes, eOTelSpanKind, eOTelSpanStatusCode,\n    fieldRedaction, getDependencyTarget, getHttpMethod, getHttpStatusCode, getHttpUrl, getLocationIp, getUrl, getUserAgent,\n    hrTimeToMilliseconds, isSqlDB, isSyntheticSource, urlGetPathName\n} from \"@microsoft/applicationinsights-core-js\";\nimport { ILazyValue, arrIncludes, asString, getLazy, isNullOrUndefined, strLower, strStartsWith } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY, UNDEFINED_VALUE } from \"../../InternalConstants\";\n\n/**\n * Azure SDK namespace.\n * @internal\n */\nconst AzNamespace = \"az.namespace\";\nconst AzResourceNamespace = \"azure.resource_provider.namespace\";\n\n/**\n * Azure SDK Eventhub.\n * @internal\n */\nconst MicrosoftEventHub = \"Microsoft.EventHub\";\n\n/**\n * Azure SDK message bus destination.\n * @internal\n */\nconst MessageBusDestination = \"message_bus.destination\";\n\n/**\n * AI time since enqueued attribute.\n * @internal\n */\nconst TIME_SINCE_ENQUEUED = \"timeSinceEnqueued\";\n\nconst PORT_REGEX: ILazyValue<RegExp> = (/*#__PURE__*/ getLazy(() => new RegExp(/(https?)(:\\/\\/.*)(:\\d+)(\\S*)/)));\nconst HTTP_DOT = (/*#__PURE__*/ \"http.\");\n\nconst _MS_PROCESSED_BY_METRICS_EXTRACTORS = (/* #__PURE__*/\"_MS.ProcessedByMetricExtractors\");\n\n/**\n * Legacy HTTP semantic convention values\n * @internal\n */\nconst _ignoreSemanticValues: ILazyValue<string[]> = (/* #__PURE__*/ getLazy(_initIgnoreSemanticValues));\n\n/* #__NO_SIDE_EFFECTS__ */\nfunction _initIgnoreSemanticValues(): string[] {\n    return [\n        // Internal Microsoft attributes\n        _MS_PROCESSED_BY_METRICS_EXTRACTORS,\n\n        // Legacy HTTP semantic values\n        SEMATTRS_NET_PEER_IP,\n        SEMATTRS_NET_PEER_NAME,\n        SEMATTRS_NET_HOST_IP,\n        SEMATTRS_PEER_SERVICE,\n        SEMATTRS_HTTP_USER_AGENT,\n        SEMATTRS_HTTP_METHOD,\n        SEMATTRS_HTTP_URL,\n        SEMATTRS_HTTP_STATUS_CODE,\n        SEMATTRS_HTTP_ROUTE,\n        SEMATTRS_HTTP_HOST,\n        SEMATTRS_DB_SYSTEM,\n        SEMATTRS_DB_STATEMENT,\n        SEMATTRS_DB_OPERATION,\n        SEMATTRS_DB_NAME,\n        SEMATTRS_RPC_SYSTEM,\n        SEMATTRS_RPC_GRPC_STATUS_CODE,\n        SEMATTRS_EXCEPTION_TYPE,\n        SEMATTRS_EXCEPTION_MESSAGE,\n        SEMATTRS_EXCEPTION_STACKTRACE,\n        SEMATTRS_HTTP_SCHEME,\n        SEMATTRS_HTTP_TARGET,\n        SEMATTRS_HTTP_FLAVOR,\n        SEMATTRS_NET_TRANSPORT,\n        SEMATTRS_NET_HOST_NAME,\n        SEMATTRS_NET_HOST_PORT,\n        SEMATTRS_NET_PEER_PORT,\n        SEMATTRS_HTTP_CLIENT_IP,\n        SEMATTRS_ENDUSER_ID,\n        HTTP_DOT + \"status_text\",\n\n        // http Semabtic conventions\n        ATTR_CLIENT_ADDRESS,\n        ATTR_CLIENT_PORT,\n        ATTR_SERVER_ADDRESS,\n        ATTR_SERVER_PORT,\n        ATTR_URL_FULL,\n        ATTR_URL_PATH,\n        ATTR_URL_QUERY,\n        ATTR_URL_SCHEME,\n        ATTR_ERROR_TYPE,\n        ATTR_NETWORK_LOCAL_ADDRESS,\n        ATTR_NETWORK_LOCAL_PORT,\n        ATTR_NETWORK_PROTOCOL_NAME,\n        ATTR_NETWORK_PEER_ADDRESS,\n        ATTR_NETWORK_PEER_PORT,\n        ATTR_NETWORK_PROTOCOL_VERSION,\n        ATTR_NETWORK_TRANSPORT,\n        ATTR_USER_AGENT_ORIGINAL,\n        ATTR_HTTP_REQUEST_METHOD,\n        ATTR_HTTP_RESPONSE_STATUS_CODE,\n        ATTR_EXCEPTION_TYPE,\n        ATTR_EXCEPTION_MESSAGE,\n        ATTR_EXCEPTION_STACKTRACE,\n        EXP_ATTR_ENDUSER_ID,\n        EXP_ATTR_ENDUSER_PSEUDO_ID,\n        EXP_ATTR_SYNTHETIC_TYPE\n    ];\n}\n\nfunction _populateTagsFromSpan(telemetryItem: ITelemetryItem, span: IReadableSpan, contextKeys: IContextTagKeys, config: IConfiguration): void {\n\n    let tags: Tags = telemetryItem.tags = (telemetryItem.tags || [] as Tags);\n    let container = span.attribContainer || createAttributeContainer(span.attributes);\n\n    tags[contextKeys.operationId] = span.spanContext().traceId;\n    if ((span.parentSpanContext || {}).spanId) {\n        tags[contextKeys.operationParentId] = span.parentSpanContext.spanId;\n    }\n\n    // Map OpenTelemetry enduser attributes to Application Insights user attributes\n    const endUserId = container.get(ATTR_ENDUSER_ID);\n    if (endUserId) {\n        tags[contextKeys.userAuthUserId] = asString(endUserId);\n    }\n\n    const endUserPseudoId = container.get(ATTR_ENDUSER_PSEUDO_ID);\n    if (endUserPseudoId) {\n        tags[contextKeys.userId] = asString(endUserPseudoId);\n    }\n\n    const httpUserAgent = getUserAgent(container);\n    if (httpUserAgent) {\n        tags[\"ai.user.userAgent\"] = String(httpUserAgent);\n    }\n    if (isSyntheticSource(container)) {\n        tags[contextKeys.operationSyntheticSource] = \"True\";\n    }\n\n    // Check for microsoft.client.ip first - this takes precedence over all other IP logic\n    const microsoftClientIp = container.get(MicrosoftClientIp);\n    if (microsoftClientIp) {\n        tags[contextKeys.locationIp] = asString(microsoftClientIp);\n    }\n\n    if (span.kind === eOTelSpanKind.SERVER) {\n        const httpMethod = getHttpMethod(container);\n        // Only use the fallback IP logic for server spans if microsoft.client.ip is not set\n        if (!microsoftClientIp) {\n            tags[contextKeys.locationIp] = getLocationIp(container);\n        }\n\n        if (httpMethod) {\n            const httpRoute = container.get(ATTR_HTTP_ROUTE);\n            const httpUrl = getHttpUrl(container);\n            tags[contextKeys.operationName] = span.name; // Default\n            if (httpRoute) {\n                // AiOperationName max length is 1024\n                // https://github.com/MohanGsk/ApplicationInsights-Home/blob/master/EndpointSpecs/Schemas/Bond/ContextTagKeys.bond\n                tags[contextKeys.operationName] = httpMethod + \" \" + fieldRedaction(asString(httpRoute), config);\n            } else if (httpUrl) {\n                try {\n                    const urlPathName = fieldRedaction(urlGetPathName(asString(httpUrl)), config);\n                    tags[contextKeys.operationName] = httpMethod + \" \" + urlPathName;\n                } catch {\n                    /* no-op */\n                }\n            }\n        } else {\n            tags[contextKeys.operationName] = span.name;\n        }\n    } else {\n        let opName = container.get(contextKeys.operationName);\n        if (opName) {\n            tags[contextKeys.operationName] = opName as string;\n        }\n    }\n    // TODO: Location IP TBD for non server spans\n}\n\n/**\n * Check to see if the key is in the list of known properties to ignore (exclude)\n * from the properties collection\n * @param key - the property key to check\n * @param contextKeys - The current context keys\n * @returns true if the key should be ignored, false otherwise\n */\nfunction _isIgnorePropertiesKey(key: string, contextKeys: IContextTagKeys): boolean {\n    let result = false;\n\n    if (arrIncludes(_ignoreSemanticValues.v, key)) {\n        // The key is in set of known keys to ignore\n        result = true;\n    } else if (strStartsWith(key, \"microsoft.\")) {\n        // Ignoring all ALL keys starting with \"microsoft.\"\n        result = true;\n    } else if (key === contextKeys.operationName) {\n        // Ignoring the key if it is the operation name context tag\n        result = true;\n    }\n\n    return result;\n}\n\nfunction _populatePropertiesFromAttributes(item: ITelemetryItem, contextKeys: IContextTagKeys, container: IAttributeContainer): void {\n    if (container) {\n        let baseData = item.baseData = (item.baseData || {});\n        let properties: { [propertyName: string]: any } = baseData.properties = (baseData.properties || {});\n\n        container.forEach((key: string, value) => {\n            // Avoid duplication ignoring fields already mapped.\n            if (!_isIgnorePropertiesKey(key, contextKeys)) {\n                properties[key] = value;\n            }\n        });\n    }\n}\n\nfunction _populateHttpDependencyProperties(dependencyTelemetry: IDependencyTelemetry, container: IAttributeContainer, httpMethod: OTelAttributeValue | undefined, config: IConfiguration): boolean {\n    if (httpMethod) {\n        // HTTP Dependency\n        const httpUrl = getHttpUrl(container);\n        if (httpUrl) {\n            try {\n                const pathName = urlGetPathName(asString(httpUrl));\n                if (pathName) {\n                    dependencyTelemetry.name = httpMethod + \" \" + fieldRedaction(pathName, config);\n                }\n            } catch {\n                /* no-op */\n            }\n        }\n\n        dependencyTelemetry.type = eDependencyTypes.Http;\n        dependencyTelemetry.data = fieldRedaction(getUrl(container), config);\n        const httpStatusCode = getHttpStatusCode(container);\n        if (httpStatusCode) {\n            dependencyTelemetry.responseCode = +httpStatusCode;\n        }\n\n        let target = getDependencyTarget(container);\n        if (target) {\n            try {\n                // Remove default port\n                const res = PORT_REGEX.v.exec(target);\n                if (res !== null) {\n                    const protocol = res[1];\n                    const port = res[3];\n                    if (\n                        (protocol === \"https\" && port === \":443\") ||\n                        (protocol === \"http\" && port === \":80\")\n                    ) {\n                        // Drop port\n                        target = res[1] + res[2] + res[4];\n                    }\n                }\n            } catch {\n                /* no-op */\n            }\n\n            dependencyTelemetry.target = target;\n        }\n    }\n\n    return !!httpMethod;\n}\n\nfunction _populateDbDependencyProperties(dependencyTelemetry: IDependencyTelemetry, container: IAttributeContainer, dbSystem: OTelAttributeValue | undefined): boolean {\n    if (dbSystem) {\n        // TODO: Remove special logic when Azure UX supports OpenTelemetry dbSystem\n        if (String(dbSystem) === DBSYSTEMVALUES_MYSQL) {\n            dependencyTelemetry.type = \"mysql\";\n        } else if (String(dbSystem) === DBSYSTEMVALUES_POSTGRESQL) {\n            dependencyTelemetry.type = \"postgresql\";\n        } else if (String(dbSystem) === DBSYSTEMVALUES_MONGODB) {\n            dependencyTelemetry.type = \"mongodb\";\n        } else if (String(dbSystem) === DBSYSTEMVALUES_REDIS) {\n            dependencyTelemetry.type = \"redis\";\n        } else if (isSqlDB(String(dbSystem))) {\n            dependencyTelemetry.type = \"SQL\";\n        } else {\n            dependencyTelemetry.type = String(dbSystem);\n        }\n        const dbStatement = container.get(SEMATTRS_DB_STATEMENT);\n        const dbOperation = container.get(SEMATTRS_DB_OPERATION);\n        if (dbStatement) {\n            dependencyTelemetry.data = String(dbStatement);\n        } else if (dbOperation) {\n            dependencyTelemetry.data = String(dbOperation);\n        }\n        const target = getDependencyTarget(container);\n        const dbName = container.get(SEMATTRS_DB_NAME);\n        if (target) {\n            dependencyTelemetry.target = dbName ? target + \"|\" + asString(dbName) : target;\n        } else {\n            dependencyTelemetry.target = dbName ? asString(dbName) : asString(dbSystem);\n        }\n    }\n\n    return !!dbSystem;\n}\n\nfunction _populateRpcDependencyProperties(dependencyTelemetry: IDependencyTelemetry, container: IAttributeContainer, rpcSystem: OTelAttributeValue | undefined): boolean {\n    if (rpcSystem) {\n        if (strLower(rpcSystem) === \"wcf\") {\n            dependencyTelemetry.type = eDependencyTypes.Wcf;\n        } else {\n            dependencyTelemetry.type = eDependencyTypes.Grpc;\n        }\n        const grpcStatusCode = container.get(SEMATTRS_RPC_GRPC_STATUS_CODE);\n        if (!isNullOrUndefined(grpcStatusCode)) {\n            dependencyTelemetry.responseCode = +grpcStatusCode;\n        }\n        const target = getDependencyTarget(container);\n        if (target) {\n            dependencyTelemetry.target = asString(target);\n        } else {\n            dependencyTelemetry.target = String(rpcSystem);\n        }\n    }\n\n    return !!rpcSystem;\n}\n\nfunction createDependencyTelemetryItem(core: IAppInsightsCore, span: IReadableSpan, contextKeys: IContextTagKeys): ITelemetryItem {\n    let container = span.attribContainer || createAttributeContainer(span.attributes);\n    let dependencyType = \"Dependency\";\n\n    if (span.kind === eOTelSpanKind.PRODUCER) {\n        dependencyType = eDependencyTypes.QueueMessage;\n    } else if (span.kind === eOTelSpanKind.INTERNAL && span.parentSpanContext) {\n        dependencyType = eDependencyTypes.InProc;\n    }\n\n    let spanCtx = span.spanContext();\n    let dependencyTelemetry: IDependencyTelemetry = {\n        name: span.name, // Default\n        id: spanCtx.spanId || core.getTraceCtx().spanId,\n        success: (span.status || {}).code !== eOTelSpanStatusCode.ERROR,\n        responseCode: 0,\n        type: dependencyType,\n        duration: hrTimeToMilliseconds(span.duration),\n        data: STR_EMPTY,\n        target: STR_EMPTY,\n        properties: UNDEFINED_VALUE,\n        measurements: UNDEFINED_VALUE\n    };\n\n    // Check for HTTP Dependency\n    if (!_populateHttpDependencyProperties(dependencyTelemetry, container, getHttpMethod(container), core.config)) {\n        // Check for DB Dependency\n        if (!_populateDbDependencyProperties(dependencyTelemetry, container, container.get(SEMATTRS_DB_SYSTEM))) {\n            // Check for Rpc Dependency\n            _populateRpcDependencyProperties(dependencyTelemetry, container, container.get(SEMATTRS_RPC_SYSTEM));\n        }\n    }\n\n    return createTelemetryItem<IDependencyTelemetry>(dependencyTelemetry, RemoteDependencyDataType, RemoteDependencyEnvelopeType.replace(\"{0}.\", \"\"), core.logger);\n}\n\nfunction createRequestTelemetryItem(core: IAppInsightsCore, span: IReadableSpan, contextKeys: IContextTagKeys): ITelemetryItem {\n    let container = span.attribContainer || createAttributeContainer(span.attributes);\n\n    let spanCtx = span.spanContext();\n    const requestData: IRequestTelemetry = {\n        name: span.name, // Default\n        id: spanCtx.spanId || core.getTraceCtx().spanId,\n        success:\n            span.status.code !== eOTelSpanStatusCode.UNSET\n                ? span.status.code === eOTelSpanStatusCode.OK\n                : (Number(getHttpStatusCode(container)) || 0) < 400,\n        responseCode: 0,\n        duration: hrTimeToMilliseconds(span.duration),\n        source: undefined\n    };\n    const httpMethod = getHttpMethod(container);\n    const grpcStatusCode = container.get(SEMATTRS_RPC_GRPC_STATUS_CODE);\n    if (httpMethod) {\n        requestData.url = fieldRedaction(getUrl(container), core.config);\n        const httpStatusCode = getHttpStatusCode(container);\n        if (httpStatusCode) {\n            requestData.responseCode = +httpStatusCode;\n        }\n    } else if (grpcStatusCode) {\n        requestData.responseCode = +grpcStatusCode;\n    }\n\n    return createTelemetryItem<IRequestTelemetry>(requestData, RequestDataType, RequestEnvelopeType.replace(\"{0}.\", \"\"), core.logger);\n}\n\nexport function createTelemetryItemFromSpan(core: IAppInsightsCore, span: IReadableSpan): ITelemetryItem | null {\n    let telemetryItem: ITelemetryItem = null;\n    let container = span.attribContainer || createAttributeContainer(span.attributes);\n    let contextKeys: IContextTagKeys = CtxTagKeys;\n    let kind = span.kind;\n    if (kind == eOTelSpanKind.SERVER || kind == eOTelSpanKind.CONSUMER) {\n        // Request\n        telemetryItem = createRequestTelemetryItem(core, span, contextKeys);\n    } else if (kind == eOTelSpanKind.CLIENT || kind == eOTelSpanKind.PRODUCER || kind == eOTelSpanKind.INTERNAL) {\n        // RemoteDependency\n        telemetryItem = createDependencyTelemetryItem(core, span, contextKeys);\n    } else {\n        //diag.error(`Unsupported span kind ${span.kind}`);\n    }\n\n    if (telemetryItem) {\n        // Set start time for the telemetry item from the event, not the time it is being processed (the default)\n        // The channel envelope creator uses this value when creating the envelope only when defined, otherwise it\n        // uses the time when the item is being processed\n        let baseData = telemetryItem.baseData = telemetryItem.baseData || {};\n        baseData.startTime = new Date(hrTimeToMilliseconds(span.startTime));\n        \n        // Add dt extension to the telemetry item\n        let ext = telemetryItem.ext = telemetryItem.ext || {};\n        let dt = ext[\"dt\"] = ext[\"dt\"] || {};\n\n        // Don't overwrite any existing values\n        dt.spanId = dt.spanId || span.spanContext().spanId;\n        dt.traceId = dt.traceId || span.spanContext().traceId;\n        \n        let traceFlags = span.spanContext().traceFlags;\n        if (!isNullOrUndefined(traceFlags)) {\n            dt.traceFlags = dt.traceFlags || traceFlags;\n        }\n\n        _populateTagsFromSpan(telemetryItem, span, contextKeys, core.config);\n        _populatePropertiesFromAttributes(telemetryItem, contextKeys, container);\n\n        let sampleRate = container.get(\"microsoft.sample_rate\");\n        if (!isNullOrUndefined(sampleRate)) {\n            (telemetryItem as any).sampleRate = Number(sampleRate);\n        }\n\n        // Azure SDK\n        let azNamespace = container.get(AzResourceNamespace) || container.get(AzNamespace);\n        if (azNamespace) {\n            if (span.kind === eOTelSpanKind.INTERNAL) {\n                baseData.type = eDependencyTypes.InProc + \" | \" + azNamespace;\n            }\n\n            if (azNamespace === MicrosoftEventHub) {\n                _parseEventHubSpan(telemetryItem, span);\n            }\n        }\n    }\n\n    return telemetryItem;\n}\n\n/**\n * Implementation of Mapping to Azure Monitor\n *\n * https://gist.github.com/lmolkova/e4215c0f44a49ef824983382762e6b92#mapping-to-azure-monitor-application-insights-telemetry\n * @internal\n */\nfunction _parseEventHubSpan(telemetryItem: ITelemetryItem, span: IReadableSpan): void {\n    let baseData = telemetryItem.baseData = telemetryItem.baseData || {};\n    let container = span.attribContainer || createAttributeContainer(span.attributes);\n    const namespace = container.get(AzResourceNamespace) || container.get(AzNamespace);\n    const peerAddress = asString(container.get(SEMATTRS_NET_PEER_NAME) || container.get(\"peer.address\") || \"unknown\").replace(/\\/$/g, \"\"); // remove trailing \"/\"\n    const messageBusDestination = (container.get(MessageBusDestination) || \"unknown\") as string;\n    let baseType = baseData.type || \"\";\n    let kind = span.kind;\n\n    if (kind === eOTelSpanKind.CLIENT) {\n        baseType = namespace;\n        baseData.target = peerAddress + \"/\" + messageBusDestination;\n    } else if (kind === eOTelSpanKind.PRODUCER) {\n        baseType = \"Queue Message | \" + namespace;\n        baseData.target = peerAddress + \"/\" + messageBusDestination;\n    } else if (kind === eOTelSpanKind.CONSUMER) {\n        baseType = \"Queue Message | \" + namespace;\n        (baseData as any).source = peerAddress + \"/\" + messageBusDestination;\n\n        let measurements = baseData.measurements = (baseData.measurements || {});\n        let timeSinceEnqueued = container.get(\"timeSinceEnqueued\");\n        if (timeSinceEnqueued) {\n            measurements[TIME_SINCE_ENQUEUED] = Number(timeSinceEnqueued);\n        } else {\n            let enqueuedTime = parseFloat(asString(container.get(\"enqueuedTime\")));\n            if (isNaN(enqueuedTime)) {\n                enqueuedTime = 0;\n            }\n\n            measurements[TIME_SINCE_ENQUEUED] = hrTimeToMilliseconds(span.startTime) - enqueuedTime;\n        }\n    }\n\n    baseData.type = baseType;\n}\n"
  },
  {
    "path": "AISKU/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"target\": \"es5\",\n    \"moduleResolution\": \"Node\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}"
  },
  {
    "path": "AISKU/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "AISKU/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../tslint-base.json\"\n    ]\n}\n"
  },
  {
    "path": "AISKU/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/Init.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../docs/webSdk/applicationinsights-web\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/AISKU/README.md\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-web\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "AISKULight/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**\n\n"
  },
  {
    "path": "AISKULight/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "AISKULight/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "AISKULight/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "AISKULight/README.md",
    "content": "<properties\n\tpageTitle=\"Application Insights JavaScript SDK - AISKULight\"\n\tdescription=\"Reference doc\"\n\tservices=\"application-insights\"\n    documentationCenter=\".net\"\n/>\n\n<tags\n\tms.service=\"application-insights\"\n\tms.workload=\"tbd\"\n\tms.tgt_pltfrm=\"ibiza\"\n\tms.devlang=\"na\"\n\tms.topic=\"article\"\n\tms.date=\"10/8/2019\"/>\n\n# Microsoft Application Insights JavaScript SDK - Web Basic\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status/AppInsights%20-%20DevTools/1DS%20JavaScript%20SDK%20web%20SKU%20vNext?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web-basic.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web-basic)\n\nApplication Insights - Web Basic SDK\n\nApplication Insights AI SKU Light is a package that combines minimum required packages for Web scenarios.  \nRefer to [ApplicationInsights-JS](../README.md) for more details on getting started.\n\n## V3.x Release Breaking changes\n\n- Removed ES3 / IE8 Support\n- Removed V1 API Backward Compatibility (Upgrading V1 -> V3)\n\nSee [Breaking Changes](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v3_BreakingChanges.html)\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "AISKULight/Tests/Unit/src/AISKULightSize.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from '@nevware21/ts-utils';\nimport { createPromise, doAwait, IPromise } from '@nevware21/ts-async';\nimport * as pako from \"pako\";\n\nconst PACKAGE_JSON = \"../package.json\";\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction _loadPackageJson(cb:(isNightly: boolean, packageJson: any) => IPromise<void>): IPromise<void> {\n    return createPromise<void>((testCompleted, testFailed) => {\n        function _handleCallback(packageJson: any) {\n            let version = packageJson.version || \"unknown\";\n            let isNightly = version.includes(\"nightly\") || version.includes(\"dev\");\n            doAwait(cb(isNightly, packageJson), () => {\n                testCompleted();\n            }, (error) => {\n                Assert.ok(false, `checkIsNightlyBuild error: ${error}`);\n                testFailed(error);\n            });\n        }\n\n        fetch(PACKAGE_JSON).then((response) => {\n            if (!response.ok) {\n                Assert.ok(false, `fetch package.json error: ${dumpObj(response)}`);\n                _handleCallback(false);\n            } else {\n                return response.text().then((content) => {\n                    let json = JSON.parse(removeTrailingComma(content));\n                    _handleCallback(json);\n                }, (error) => {\n                    Assert.ok(false, `fetch package.json error: ${error}`);\n                    _handleCallback({});\n                });\n            }\n        }, (error) => {\n            Assert.ok(false, `fetch package.json error: ${error}`);\n            _handleCallback({});\n        });\n    });\n}\n\nfunction _checkSize(checkType: string, maxSize: number, size: number, isNightly: boolean): void {\n  if (isNightly) {\n        maxSize += .5;\n    }\n\n    Assert.ok(size <= maxSize, `exceed ${maxSize} KB, current ${checkType} size is: ${size} KB`);\n}    \n\nexport class AISKULightSizeCheck extends AITestClass {\n    private readonly MAX_RAW_SIZE = 102;\n    private readonly MAX_BUNDLE_SIZE = 102;\n    private readonly MAX_RAW_DEFLATE_SIZE = 42;\n    private readonly MAX_BUNDLE_DEFLATE_SIZE = 42;\n    private readonly rawFilePath = \"../dist/es5/applicationinsights-web-basic.min.js\";\n    private readonly currentVer = \"3.4.1\";\n    private readonly prodFilePath = `../browser/es5/aib.${this.currentVer[0]}.min.js`;\n\n    public testInitialize() {\n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        this.addRawFileSizeCheck();\n        this.addProdFileSizeCheck();\n    }\n\n    constructor() {\n        super(\"AISKULightSizeCheck\");\n    }\n\n    private addRawFileSizeCheck(): void {\n        this._checkFileSize(false);\n    }\n\n    private addProdFileSizeCheck(): void {\n        this._checkFileSize(true);\n    }\n    \n    private _checkFileSize(isProd: boolean): void {\n        let _filePath = isProd? this.prodFilePath : this.rawFilePath;\n        let _maxFullSize = isProd ? this.MAX_BUNDLE_SIZE : this.MAX_RAW_SIZE;\n        let _maxDeflateSize = isProd ? this.MAX_BUNDLE_DEFLATE_SIZE : this.MAX_RAW_DEFLATE_SIZE;\n        let postfix  = isProd? \" (prod)\" : \" (dist)\";\n        let fileName = _filePath.split(\"..\")[2];\n        this.testCase({\n            name: `Test AISKULight${postfix} deflate size`,\n            test: () => {\n                Assert.ok(true, `test file: ${fileName}`);\n                return _loadPackageJson((isNightly, packageJson) => {\n                    Assert.ok(true, `  checking : ${packageJson.name || \"??\"} v${packageJson.version || \"unknown\"}`);\n                    let request = new Request(_filePath, {method:\"GET\"});\n                    return fetch(request).then((response) => {\n                        if (!response.ok) {\n                            Assert.ok(false, `fetch AISKULight${postfix} error: ${response.statusText}`);\n                            return;\n                        } else {\n                            return response.text().then(text => {\n                                let size = Math.ceil((text.length/1024) * 100) / 100.0;\n                                _checkSize(\"bundle\", _maxFullSize, size, isNightly);\n\n                                let deflateSize = Math.ceil((pako.deflate(text).length/1024) * 100) / 100.0;\n                                _checkSize(\"deflate\", _maxDeflateSize, deflateSize, isNightly);\n                            }).catch((error: Error) => {\n                                Assert.ok(false, `AISKULight${postfix} response error: ${error}`);\n                            });\n                        }\n                    }).catch((error: Error) => {\n                        Assert.ok(false, `AISKULight${postfix} deflate size error: ${error}`);\n                    });\n                });\n            }\n        });\n    }\n}"
  },
  {
    "path": "AISKULight/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "AISKULight/Tests/Unit/src/aiskuliteunittests.ts",
    "content": "import { AISKULightSizeCheck } from \"./AISKULightSize.Tests\";\nimport { ApplicationInsightsDynamicConfigTests } from \"./dynamicconfig.tests\";\nimport { ApplicationInsightsConfigTests } from \"./config.tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\nimport { AISKULightOTelNegativeTests } from \"./otelNegative.tests\";\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new AISKULightSizeCheck().registerTests();\n    new ApplicationInsightsDynamicConfigTests().registerTests();\n    new ApplicationInsightsConfigTests().registerTests();\n    new AISKULightOTelNegativeTests().registerTests();\n}"
  },
  {
    "path": "AISKULight/Tests/Unit/src/config.tests.ts",
    "content": "import { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { ITelemetryItem, newId } from \"@microsoft/applicationinsights-core-js\";\nimport { ApplicationInsights} from \"../../../src/index\";\nimport { BreezeChannelIdentifier, ContextTagKeys, utlRemoveSessionStorage } from \"@microsoft/applicationinsights-core-js\";\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\";\n\nexport class ApplicationInsightsConfigTests extends AITestClass {\n    private readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private readonly _endpoint = \"endpoint\"\n    private readonly _connectionString = `InstrumentationKey=${this._instrumentationKey};ingestionendpoint=${this._endpoint}`;\n    private readonly _iKey = \"testKey\";\n    private _sessionPrefix: string = newId();\n    static registerTests: any;\n    private static readonly _expectedTrackMethods = [\n        \"flush\",\n        \"pollInternalLogs\",\n        \"stopPollingInternalLogs\",\n        \"unload\",\n        \"getPlugin\",\n        \"addPlugin\",\n        \"evtNamespace\",\n        \"addUnloadCb\",\n        \"onCfgChange\",\n        \"getTraceCtx\",\n        \"updateCfg\",\n        \"addTelemetryInitializer\"\n    ];\n\n    constructor(testName?: string) {\n        super(testName || \"ApplicationInsightsAISKULightTests\");\n    }\n    \n    protected _getTestConfig(sessionPrefix: string, ikey?: boolean, cs?: boolean) {\n        return {\n            instrumentationKey: ikey? this._iKey : undefined,\n            connectionString: cs? this._connectionString : undefined,\n            namePrefix: sessionPrefix\n        };\n    }\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        utlRemoveSessionStorage(null as any, \"AI_sentBuffer\", );\n        utlRemoveSessionStorage(null as any, \"AI_buffer\", );\n        utlRemoveSessionStorage(null as any, this._sessionPrefix + \"_AI_sentBuffer\", );\n        utlRemoveSessionStorage(null as any, this._sessionPrefix + \"_AI_buffer\", );\n\n        super.testCleanup();\n    }\n\n    public testFinishedCleanup(): void {\n        console.log(\"* testCleanup(\" + (AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<null>\") + \")\");\n    }\n\n    public registerTests() {\n        this.addConfigTests();\n        this.addApiTests();\n    }\n\n    private addConfigTests(): void {\n        this.testCase({\n            name: \"ConfigTests: ApplicationInsights config should set default endpoint\",\n            test: () => {\n                let expectedConnectionString = `InstrumentationKey=${this._instrumentationKey}`\n                let _config = {\n                    connectionString: expectedConnectionString,\n                    namePrefix:this._sessionPrefix\n                };\n                Assert.ok(_config)\n                let ai = new ApplicationInsights(_config);\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                Assert.ok(ai, \"ApplicationInsights light Instance is initialized\");\n            \n                let config = ai.config;\n                let expectedIkey = this._instrumentationKey;\n                let expectedEndpointUrl = \"https://dc.services.visualstudio.com/v2/track\";\n                let expectedLoggingLevel = 10000;\n                Assert.ok(config, \"ApplicationInsights Light config exists\");\n                Assert.equal(expectedConnectionString, config.connectionString, \"connection string is set\");\n                Assert.equal(expectedIkey, config.instrumentationKey, \"ikey is set\");\n                Assert.equal(expectedLoggingLevel, config.diagnosticLogInterval, \"diagnosticLogInterval is set to 1000 by default\");\n                Assert.equal(expectedEndpointUrl, config.endpointUrl, \"endpoint url is set from connection string\");\n            }\n        });\n\n        this.testCase({\n            name: \"ConfigTests: ApplicationInsights config works correctly with connection string\",\n            test: () => {\n                let _config = this._getTestConfig(this._sessionPrefix, false, true);\n                Assert.ok(_config)\n                let ai = new ApplicationInsights(_config);\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                Assert.ok(ai, \"ApplicationInsights light Instance is initialized\");\n            \n                let config = ai.config;\n                let expectedIkey = this._instrumentationKey;\n                let expectedConnectionString = this._connectionString;\n                let expectedEndpointUrl = `${this._endpoint}/v2/track`;\n                let expectedLoggingLevel = 10000;\n                Assert.ok(config, \"ApplicationInsights Light config exists\");\n                Assert.equal(expectedConnectionString, config.connectionString, \"connection string is set\");\n                Assert.equal(expectedIkey, config.instrumentationKey, \"ikey is set\");\n                Assert.equal(expectedLoggingLevel, config.diagnosticLogInterval, \"diagnosticLogInterval is set to 1000 by default\");\n                Assert.equal(expectedEndpointUrl, config.endpointUrl, \"endpoint url is set from connection string\");\n            }\n        });\n\n        this.testCase({\n            name: \"ConfigTests: ApplicationInsights config works correctly with connection string and Ikey\",\n            useFakeTimers: true,\n            test: () => {\n                let _config = this._getTestConfig(this._sessionPrefix, true, true);\n                Assert.ok(_config)\n                let ai = new ApplicationInsights(_config);\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                Assert.ok(ai, \"ApplicationInsights light Instance is initialized\");\n                Assert.ok(ai);\n                let config = ai.config;\n                let expectedIkey = this._instrumentationKey;\n                let expectedConnectionString = this._connectionString;\n                let expectedEndpointUrl = `${this._endpoint}/v2/track`;\n                let expectedLoggingLevel = 10000;\n                Assert.ok(config, \"ApplicationInsights Light config exists\");\n                Assert.equal(expectedConnectionString, config.connectionString, \"connection string is set\");\n                Assert.equal(expectedIkey, config.instrumentationKey, \"ikey is set from connection string\");\n                Assert.equal(expectedLoggingLevel, config.diagnosticLogInterval, \"diagnosticLogInterval is set to 1000 by default\");\n                Assert.equal(expectedEndpointUrl, config.endpointUrl, \"endpoint url is set from connection string\");\n            }\n        });\n\n        this.testCase({\n            name: \"ConfigTests: ApplicationInsights config works correctly with ikey\",\n            useFakeTimers: true,\n            test: () => {\n                let _config = this._getTestConfig(this._sessionPrefix, true, false);\n                Assert.ok(_config)\n                let ai = new ApplicationInsights(_config);\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                Assert.ok(ai, \"ApplicationInsights light Instance is initialized\");\n                Assert.ok(ai);\n                let config = ai.config;\n                let expectedIkey = this._iKey;\n                let expectedLoggingLevel = 10000;\n                Assert.ok(config, \"ApplicationInsights Light config exists\");\n                Assert.ok(!config.connectionString, \"connection string shoud not set\");\n                Assert.equal(expectedIkey, config.instrumentationKey, \"ikey is set\");\n                Assert.equal(expectedLoggingLevel, config.diagnosticLogInterval, \"diagnosticLogInterval is set to 1000 by default\");\n                Assert.ok(!config.endpointUrl, \"endpoint url should not set from ikey\");\n            }\n        });\n\n        this.testCase({\n            name: \"ConfigTests: ApplicationInsights sholuld throw error when no ikey and connection string provided\",\n            useFakeTimers: true,\n            test: () => {\n                try {\n                    let _config = this._getTestConfig(this._sessionPrefix, false, false);\n                    Assert.ok(_config)\n                    let ai = new ApplicationInsights(_config);\n                    this.onDone(() =>{\n                        ai.unload(false);\n                    });\n                    Assert.ok(false, \"ApplicationInsights light Instance should not be initialized\");\n                    Assert.ok(ai);\n                } catch(e) {\n                    Assert.ok(true, \"error should be thrown\");\n                }\n            }\n        });\n    }\n\n    public addApiTests(): void {\n        this.testCase({\n            name: \"DynamicConfigTests: Public Members exist\",\n            test: () => {\n                let _config = this._getTestConfig(this._sessionPrefix, true, false);\n                Assert.ok(_config)\n                let ai = new ApplicationInsights(_config);\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                Assert.ok(ai, \"ApplicationInsights light Instance is initialized\");\n                let trackMethod = \"track\";\n                let flushMethod = \"flush\";\n                Assert.ok(ai[trackMethod], `${trackMethod} method exists`);\n                Assert.equal(\"function\", typeof ai[\"track\"], `${trackMethod} is a function`);\n                Assert.ok(ai[flushMethod], `${flushMethod} method exists`);\n                Assert.equal(\"function\", typeof ai[flushMethod], `${flushMethod} is a function`);\n            }\n        });\n\n        \n        this.testCase({\n            name: 'Proxy function exist',\n            test: () => {\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                let _config = this._getTestConfig(this._sessionPrefix, true, false);\n                let ai = new ApplicationInsights(_config);\n                ApplicationInsightsConfigTests._expectedTrackMethods.forEach(method => {\n                    Assert.ok(ai[method], `${method} exists`);\n                    Assert.equal('function', typeof ai[method], `${method} is a function`);\n                });\n            }\n        });\n\n\n        this.testCase({\n            name: \"TrackTests: BaseData and baseType should exist\",\n            test: () => {\n                let _config = this._getTestConfig(this._sessionPrefix, true, false);\n                Assert.ok(_config)\n                let ai = new ApplicationInsights(_config);\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                Assert.ok(ai, \"ApplicationInsights light Instance is initialized\");\n                let trackMethod = \"track\";\n            \n                Assert.ok(ai[trackMethod], `${trackMethod} method exists`);\n                Assert.equal(\"function\", typeof ai[\"track\"], `${trackMethod} is a function`);\n\n                let sender: Sender = ai.getPlugin<Sender>(BreezeChannelIdentifier).plugin;\n                Assert.ok(sender && sender.processTelemetry, \"sender exists\");\n                let senderSpy = this.sandbox.spy(sender, \"processTelemetry\");\n               \n                // Case1: no baseData and no baseType\n                ai.track({name: \"test\"});\n                Assert.ok(senderSpy.calledOnce, \"sender should be called\");\n                let item = senderSpy.args[0][0];\n                Assert.equal(item.name, \"test\", \"name exists\");\n                Assert.deepEqual(item.baseData, {}, \"baseData exists\");\n                Assert.equal(item.baseType, \"EventData\", \"baseType exists\");\n\n                // Case2: baseData and no baseType\n                ai.track({name: \"test1\", baseData:{a: \"test1\"}});\n                Assert.equal(senderSpy.callCount, 2, \"sender should be called again test1\");\n                item = senderSpy.args[1][0];\n                Assert.equal(item.name, \"test1\", \"name exists test1\");\n                Assert.deepEqual(item.baseData, {a: \"test1\"}, \"baseData exists test1\");\n                Assert.equal(item.baseType, \"EventData\", \"baseType existstest1\");\n\n                // Case3: baseData and baseType\n                ai.track({name: \"test2\", baseData:{a: \"test2\"}, baseType: \"test2\"});\n                Assert.equal(senderSpy.callCount, 3, \"sender should be called again test2\");\n                item = senderSpy.args[2][0];\n                Assert.equal(item.name, \"test2\", \"name exists test2\");\n                Assert.deepEqual(item.baseData, {a: \"test2\"}, \"baseData exists test2\");\n                Assert.equal(item.baseType, \"test2\", \"baseType exists test2\");\n\n            }\n        });\n\n        this.testCase({\n            name: 'Proxy function exist',\n            test: () => {\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                let _config = this._getTestConfig(this._sessionPrefix, true, false);\n                let ai = new ApplicationInsights(_config);\n                ApplicationInsightsConfigTests._expectedTrackMethods.forEach(method => {\n                    Assert.ok(ai[method], `${method} exists`);\n                    Assert.equal('function', typeof ai[method], `${method} is a function`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: 'test proxy function (telemetry initializer) works',\n            useFakeTimers: true,\n            test: () => {\n                this.onDone(() =>{\n                    ai.unload(false);\n                });\n                let _config = this._getTestConfig(this._sessionPrefix, true, false);\n                let ai = new ApplicationInsights(_config);\n                const telemetryInitializer = {\n                    initializer: (envelope) => { }\n                }\n                const spy = this.sandbox.spy(telemetryInitializer, \"initializer\");\n                // act\n                ai.addTelemetryInitializer(telemetryInitializer.initializer);\n                ai.track({name: 'test event'});\n                this.clock.tick(1);\n\n                 // verify\n                 Assert.ok(spy.calledOnce, 'telemetryInitializer was called');\n            }\n        });\n    }\n\n}"
  },
  {
    "path": "AISKULight/Tests/Unit/src/dynamicconfig.tests.ts",
    "content": "import { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { IConfiguration, IPayloadData, isString, ITelemetryItem, IXHROverride, newId } from \"@microsoft/applicationinsights-core-js\";\nimport { ApplicationInsights, ISenderConfig } from \"../../../src/index\";\nimport { createAsyncResolvedPromise } from \"@nevware21/ts-async\";\nimport { SinonSpy } from 'sinon';\nexport class ApplicationInsightsDynamicConfigTests extends AITestClass {\n    private static readonly _instrumentationKey = \"b7170927-2d1c-44f1-acec-59f4e1751c11\";\n    private static readonly _connectionString = `InstrumentationKey=${ApplicationInsightsDynamicConfigTests._instrumentationKey}`;\n    private _ai: ApplicationInsights;\n    private _sessionPrefix: string = newId();\n    private _config: IConfiguration & IConfig;\n    static registerTests: any;\n    private genericSpy: SinonSpy;\n    private _ctx: any;\n    private xhrOverride: IXHROverride;\n    constructor(testName?: string) {\n        super(testName || \"AISKU Dynamic Config\");\n    }\n    \n    protected _getTestConfig(sessionPrefix: string) {\n        return {\n            connectionString: ApplicationInsightsDynamicConfigTests._connectionString,\n            namePrefix: sessionPrefix\n        };\n    }\n\n    public testInitialize() {\n        try {\n            this._config = this._getTestConfig(this._sessionPrefix);\n\n            this._ai = new ApplicationInsights(this._config);\n            this._ctx = {};\n            this.xhrOverride = new AutoCompleteXhrOverride();\n        } catch (e) {\n            console.error(\"Failed to initialize\", e);\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ai && this._ai.unload) {\n            // force unload\n            this._ai.unload(false);\n        }\n        this._ctx = null;\n\n        console.log(\"* testCleanup(\" + (AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<null>\") + \")\");\n    }\n\n    public registerTests() {\n        this.addDynamicConfigTests();\n        this.addApiTests();\n    }\n\n    private addDynamicConfigTests(): void {\n        this.testCase({\n            name: \"DynamicConfigTests: ApplicationInsights dynamic config works correctly\",\n            useFakeTimers: true,\n            test: () => {\n                Assert.ok(this._ai);\n                let config = this._ai.config;\n                let expectedIkey = ApplicationInsightsDynamicConfigTests._instrumentationKey;\n                let expectedConnectionString = ApplicationInsightsDynamicConfigTests._connectionString;\n                let expectedEndpointUrl = \"https://dc.services.visualstudio.com/v2/track\";\n                let expectedLoggingLevel = 10000;\n                Assert.ok(config, \"ApplicationInsights Light config exists\");\n                Assert.equal(expectedConnectionString, config.connectionString, \"connection string is set\");\n                Assert.equal(expectedIkey, config.instrumentationKey, \"ikey is set\");\n                Assert.equal(expectedLoggingLevel, config.diagnosticLogInterval, \"diagnosticLogInterval is set to 1000 by default\");\n                Assert.equal(expectedEndpointUrl, config.endpointUrl, \"endpoint url is set from connection string\");\n\n                let onChangeCalled = 0;\n                let handler = this._ai.onCfgChange((details) => {\n                    onChangeCalled ++;\n                    Assert.ok(details.cfg);\n                    Assert.equal(expectedIkey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                    Assert.equal(expectedLoggingLevel, details.cfg.diagnosticLogInterval, \"Expect the diagnosticLogInterval to be set\");\n                });\n\n                Assert.equal(1, onChangeCalled, \"OnCfgChange was called once\");\n\n                expectedIkey = \"newIkey\";\n                expectedConnectionString = `InstrumentationKey=${expectedIkey}`;\n                config.connectionString = expectedConnectionString;\n                Assert.equal(1, onChangeCalled, \"OnCfgChange was called\");\n                this.clock.tick(1);\n                Assert.equal(3, onChangeCalled, \"OnCfgChange was called again\");\n                Assert.equal(\"newIkey\", config.instrumentationKey);\n\n                //Remove the handler\n                handler.rm();\n            }\n        });\n        \n\n        this.testCase({\n            name: \"Init: init with cs promise\",\n            useFakeTimers: true,\n            test: () => {\n                // unload previous one first\n                let oriInst = this._ai;\n                if (oriInst && oriInst.unload) {\n                    // force unload\n                    oriInst.unload(false);\n                }\n        \n                this._config = this._getTestConfig(this._sessionPrefix);\n                let csPromise = createAsyncResolvedPromise(\"InstrumentationKey=testIkey;ingestionendpoint=testUrl\");\n                this._config.connectionString = csPromise;\n                this._config.initTimeOut= 80000;\n                this._ctx.csPromise = csPromise;\n\n                let init = new ApplicationInsights(this._config);\n                this._ai = init;\n                let config = this._ai.config;\n\n                return this._asyncQueue()\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    let csPromise = this._ctx.csPromise;\n                    let config = this._ai.config;\n                    let ikey = config.instrumentationKey;\n                \n                    if (csPromise.state === \"resolved\" && isString(ikey)) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000))\n                .add(() => {\n                    let config = this._ai.config;\n                    Assert.equal(\"testIkey\", config.instrumentationKey, \"ikey should be set\");\n                    Assert.equal(\"testUrl/v2/track\", config.endpointUrl ,\"endpoint shoule be set\");\n                    let sender = this._ai.getPlugin(\"AppInsightsChannelPlugin\").plugin;\n                    let senderConfig = sender[\"_senderConfig\"] as ISenderConfig; \n                    let senderIkey = senderConfig.instrumentationKey;\n                    Assert.equal(\"testIkey\", senderIkey, \"sender ikey is set from connection string\");\n                    let senderUrl = senderConfig.endpointUrl;\n                    Assert.equal(\"testUrl/v2/track\", senderUrl, \"sender endpoint url is set from connection string\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"zip test: gzip encode is working and content-encode header is set (feature opt-in)\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                this._ai.config.featureOptIn[\"zipPayload\"] = { mode: 3 };\n                this._ai.config.extensionConfig[\"AppInsightsChannelPlugin\"] = {\n                    httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true\n                }\n                this.clock.tick(10);\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                return this._asyncQueue().add(() => {\n                    this._ai.track(telemetryItem);\n                    this._ai.flush();\n                    this.clock.tick(10);\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy && this.genericSpy.called) {\n                        let argCount = 0;\n                        this.genericSpy.args.forEach(call => {\n                            argCount += call.length;\n                        });\n                        return argCount >= 1;\n                    }\n                    return false;\n                }, \"Wait for exception calls: 1 \" + new Date().toISOString(), 15, 1000))\n                .add(() => {\n                    let request = this.genericSpy.getCall(0).args[0];\n                    let gzipData = request.data;\n                    QUnit.assert.ok(gzipData, \"data should be set\");\n                    QUnit.assert.equal(true, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should be gzip encoded\");\n                    QUnit.assert.equal(request.headers[\"Content-Encoding\"], \"gzip\", \"telemetry should be gzip encoded\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"zip test: gzip encode will not working (feature opt-in is not set)\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                this._ai.config.extensionConfig[\"AppInsightsChannelPlugin\"] = {\n                    httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true\n                }\n                this.clock.tick(10);\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                return this._asyncQueue().add(() => {\n                    this._ai.track(telemetryItem);\n                    this._ai.flush();\n                    this.clock.tick(10);\n                })\n                .add(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy && this.genericSpy.called) {\n                        let argCount = 0;\n                        this.genericSpy.args.forEach(call => {\n                            argCount += call.length;\n                        });\n                        return argCount >= 1;\n                    }\n                    return false;\n                }, \"Wait for exception calls: 1 \" + new Date().toISOString(), 15, 1000))\n                .add(() => {\n                    let request = this.genericSpy.getCall(0).args[0];\n                    let gzipData = request.data;\n                    QUnit.assert.ok(gzipData, \"data should be set\");\n                    QUnit.assert.equal(false, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should not be gzip encoded\");\n                    QUnit.assert.equal(request.headers[\"Content-Encoding\"], undefined, \"telemetry should not be gzip encoded\");\n                });\n            }\n        });\n\n    }\n\n    public addApiTests(): void {\n        this.testCase({\n            name: \"DynamicConfigTests: Public Members exist\",\n            test: () => {\n                let trackMethod = \"track\";\n                let flushMethod = \"flush\";\n                Assert.ok(this._ai[trackMethod], `${trackMethod} method exists`);\n                Assert.equal(\"function\", typeof this._ai[\"track\"], `${trackMethod} is a function`);\n                Assert.ok(this._ai[flushMethod], `${flushMethod} method exists`);\n                Assert.equal(\"function\", typeof this._ai[flushMethod], `${flushMethod} is a function`);\n            }\n        });\n    }\n}\n\nclass AutoCompleteXhrOverride {\n    \n    public sendPOST(payload: IPayloadData, oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) {\n        console.log(\"AutoCompleteXhrOverride.sendPOST called with payload: \", payload);\n        oncomplete(200, null);\n    }\n}"
  },
  {
    "path": "AISKULight/Tests/Unit/src/otelNegative.tests.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { ApplicationInsights } from \"../../../src/index\";\nimport { utlRemoveSessionStorage } from \"@microsoft/applicationinsights-core-js\";\nimport { isNullOrUndefined, newId } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Negative tests for OpenTelemetry usage in AISKU Light\n * These tests ensure that no exceptions are thrown and helpers behave correctly\n * when there is no trace provider or OTel support instances\n */\nexport class AISKULightOTelNegativeTests extends AITestClass {\n    private readonly _instrumentationKey = \"testIkey-1234-5678-9012-3456789012\";\n    private _sessionPrefix: string;\n\n    public testInitialize() {\n        super.testInitialize();\n        this._sessionPrefix = newId();\n    }\n\n    public testCleanup() {\n        utlRemoveSessionStorage(null as any, \"AI_sentBuffer\");\n        utlRemoveSessionStorage(null as any, \"AI_buffer\");\n        utlRemoveSessionStorage(null as any, this._sessionPrefix + \"_AI_sentBuffer\");\n        utlRemoveSessionStorage(null as any, this._sessionPrefix + \"_AI_buffer\");\n        super.testCleanup();\n    }\n\n    public registerTests() {\n        this.addTraceContextWithoutProviderTests();\n        this.addUnloadWithoutProviderTests();\n        this.addConfigurationChangesWithoutProviderTests();\n    }\n\n    private addTraceContextWithoutProviderTests(): void {\n        this.testCase({\n            name: \"AISKULight.getTraceCtx: should return valid context without trace provider\",\n            test: () => {\n                // Arrange\n                const config = {\n                    instrumentationKey: this._instrumentationKey,\n                    namePrefix: this._sessionPrefix\n                };\n                const ai = new ApplicationInsights(config);\n                this.onDone(() => {\n                    ai.unload(false);\n                });\n\n                // Act - no trace provider is set by default in AISKU Light\n                const ctx = ai.getTraceCtx();\n\n                // Assert - should return a valid context without throwing\n                Assert.ok(ctx !== undefined, \"Should return a context (can be null)\");\n                \n                // If it returns a context, it should be valid\n                Assert.ok(!isNullOrUndefined(ctx?.traceId), \"Context should have traceId\");\n                Assert.ok(!isNullOrUndefined(ctx?.spanId), \"Context should have spanId\");\n                Assert.equal(\"\", ctx?.spanId, \"SpanId should be empty string without provider\");\n            }\n        });\n\n        this.testCase({\n            name: \"AISKULight.getTraceCtx: should not throw when called multiple times\",\n            test: () => {\n                // Arrange\n                const config = {\n                    instrumentationKey: this._instrumentationKey,\n                    namePrefix: this._sessionPrefix\n                };\n                const ai = new ApplicationInsights(config);\n                this.onDone(() => {\n                    ai.unload(false);\n                });\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                    const _ctx1 = ai.getTraceCtx();\n                    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                    const _ctx2 = ai.getTraceCtx();\n                    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                    const _ctx3 = ai.getTraceCtx();\n                    \n                    // Multiple calls should work without issues\n                    Assert.ok(true, \"Multiple getTraceCtx calls should not throw\");\n                    Assert.equal(_ctx1, _ctx2, \"Multiple calls should return same context instance\");\n                    Assert.equal(_ctx2, _ctx3, \"Multiple calls should return same context instance\");\n                    Assert.equal(_ctx1?.traceId, _ctx2?.traceId, \"TraceId should be consistent across calls\");\n                    Assert.equal(_ctx2?.traceId, _ctx3?.traceId, \"TraceId should be consistent across calls\");\n                    Assert.equal(_ctx1?.spanId, _ctx2?.spanId, \"SpanId should be consistent across calls\");\n                    Assert.equal(_ctx2?.spanId, _ctx3?.spanId, \"SpanId should be consistent across calls\");\n                }, \"Multiple getTraceCtx calls should be safe\");\n            }\n        });\n\n        this.testCase({\n            name: \"AISKULight: getTraceCtx should work after unload\",\n            test: () => {\n                // Arrange\n                const config = {\n                    instrumentationKey: this._instrumentationKey,\n                    namePrefix: this._sessionPrefix\n                };\n                const ai = new ApplicationInsights(config);\n\n                // Act - unload first\n                ai.unload(false);\n\n                // Assert - should not throw even after unload\n                Assert.doesNotThrow(() => {\n                    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                    const _ctx = ai.getTraceCtx();\n                    // Context might be null after unload, which is fine\n                }, \"getTraceCtx should not throw after unload\");\n            }\n        });\n    }\n\n\n\n    private addUnloadWithoutProviderTests(): void {\n        this.testCase({\n            name: \"AISKULight: unload should work gracefully without trace provider\",\n            test: () => {\n                // Arrange\n                const config = {\n                    instrumentationKey: this._instrumentationKey,\n                    namePrefix: this._sessionPrefix\n                };\n                const ai = new ApplicationInsights(config);\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    ai.unload(false);\n                }, \"Unload should work without trace provider\");\n\n                // Verify we can still access config after unload\n                Assert.ok(ai.config, \"Config should still be accessible after unload\");\n            }\n        });\n\n        this.testCase({\n            name: \"AISKULight: unload with async flag should work without provider\",\n            test: () => {\n                // Arrange\n                const config = {\n                    instrumentationKey: this._instrumentationKey,\n                    namePrefix: this._sessionPrefix\n                };\n                const ai = new ApplicationInsights(config);\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    ai.unload(true);\n                }, \"Async unload should work without trace provider\");\n            }\n        });\n    }\n\n    private addConfigurationChangesWithoutProviderTests(): void {\n        this.testCase({\n            name: \"AISKULight: should handle traceCfg in config without trace provider\",\n            test: () => {\n                // Arrange\n                const config = {\n                    instrumentationKey: this._instrumentationKey,\n                    namePrefix: this._sessionPrefix,\n                    traceCfg: {\n                        suppressTracing: false\n                    }\n                };\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const ai = new ApplicationInsights(config);\n                    \n                    // Verify traceCfg is present\n                    Assert.ok(ai.config.traceCfg, \"traceCfg should be accessible\");\n                    \n                    this.onDone(() => {\n                        ai.unload(false);\n                    });\n                }, \"Should handle traceCfg without trace provider\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "AISKULight/Tests/UnitTests.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript AISKU Light</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-7.3.1.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>    \n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                sinon: \"../../common/Tests/External/sinon-7.3.1\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\",\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"sinon\");\n        modules.add(\"pako\",\"./node_modules/pako/dist/pako\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n\n            var testModule = modules.add(\"Tests/Unit/src/aiskuliteunittests\", \"./Unit/dist/aiskuliteunittests.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "AISKULight/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}\n"
  },
  {
    "path": "AISKULight/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/index.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n  ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "AISKULight/build.cmd",
    "content": "REM rd /s /q node_modules\nREM del package-lock.json\n\nREM echo \"starting build\"\nREM npm install \nREM rd /s /q amd\\bundle\nREM call grunt aiskulite && echo \"copy files\"\nxcopy \"node_modules/applicationinsights-channel-js/bundle\" \"bundle\" /S /E /I\nxcopy \"node_modules/applicationinsights-common/bundle\" \"bundle\" /S /E /I\nxcopy \"node_modules/applicationinsights-core-js/bundle\" \"bundle\" /S /E  /I\n\n"
  },
  {
    "path": "AISKULight/dist-history/aisdklight.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (factory());\n}(this, (function () { 'use strict';\n\n    (function (factory) {\n        if (typeof module === \"object\" && typeof module.exports === \"object\") {\n            var v = factory(require, exports);\n            if (v !== undefined) module.exports = v;\n        }\n        else if (typeof define === \"function\" && define.amd) {\n            define([\"require\", \"exports\", \"applicationinsights-core-js\", \"applicationinsights-channel-js\"], factory);\n        }\n    })(function (require, exports) {\n        Object.defineProperty(exports, \"__esModule\", { value: true });\n        var applicationinsights_core_js_1 = require(\"applicationinsights-core-js\");\n        var applicationinsights_channel_js_1 = require(\"applicationinsights-channel-js\");\n        var ApplicationInsights = /** @class */ (function () {\n            function ApplicationInsights(config) {\n                // initialize the queue and config in case they are undefined\n                if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(config) || applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                    throw new Error(\"Invalid input configuration\");\n                }\n                this.initialize();\n            }\n            ApplicationInsights.prototype.initialize = function () {\n                this.core = new applicationinsights_core_js_1.AppInsightsCore();\n                var extensions = [];\n                var appInsightsChannel = new applicationinsights_channel_js_1.Sender();\n                extensions.push(appInsightsChannel);\n                // initialize core\n                this.core.initialize(this.config, extensions);\n                // initialize extensions\n                appInsightsChannel.initialize(this.config, this.core, extensions);\n            };\n            ApplicationInsights.prototype.track = function (item) {\n                this.core.track(item);\n            };\n            return ApplicationInsights;\n        }());\n        exports.ApplicationInsights = ApplicationInsights;\n    });\n\n})));\n//# sourceMappingURL=aisdklight.js.map\n"
  },
  {
    "path": "AISKULight/dist-history/aisdklite.0.0.3.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./bundle sync recursive\":\n/*!*********************!*\\\n  !*** ./bundle sync ***!\n  \\*********************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nfunction webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = \"./bundle sync recursive\";\n\n/***/ }),\n\n/***/ \"./bundle/index.js\":\n/*!*************************!*\\\n  !*** ./bundle/index.js ***!\n  \\*************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (factory) {\n    if (typeof module === \"object\" && typeof module.exports === \"object\") {\n        var v = factory(__webpack_require__(\"./bundle sync recursive\"), exports);\n        if (v !== undefined) module.exports = v;\n    }\n    else if (true) {\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-channel-js */ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    }\n})(function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var applicationinsights_core_js_1 = require(\"applicationinsights-core-js\");\n    var applicationinsights_channel_js_1 = require(\"applicationinsights-channel-js\");\n    \"use strict\";\n    var ApplicationInsights = /** @class */ (function () {\n        function ApplicationInsights(config) {\n            // initialize the queue and config in case they are undefined\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(config) || applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                throw new Error(\"Invalid input configuration\");\n            }\n            this.initialize();\n        }\n        ApplicationInsights.prototype.initialize = function () {\n            this.core = new applicationinsights_core_js_1.AppInsightsCore();\n            var extensions = [];\n            var appInsightsChannel = new applicationinsights_channel_js_1.Sender();\n            extensions.push(appInsightsChannel);\n            // initialize core\n            this.core.initialize(this.config, extensions);\n            // initialize extensions\n            appInsightsChannel.initialize(this.config, this.core, extensions);\n        };\n        ApplicationInsights.prototype.track = function (item) {\n            this.core.track(item);\n        };\n        return ApplicationInsights;\n    }());\n    exports.ApplicationInsights = ApplicationInsights;\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.ContextTagKeys = [\n        \"ai.application.ver\",\n        \"ai.application.build\",\n        \"ai.application.typeId\",\n        \"ai.application.applicationId\",\n        \"ai.application.layer\",\n        \"ai.device.id\",\n        \"ai.device.ip\",\n        \"ai.device.language\",\n        \"ai.device.locale\",\n        \"ai.device.model\",\n        \"ai.device.friendlyName\",\n        \"ai.device.network\",\n        \"ai.device.networkName\",\n        \"ai.device.oemName\",\n        \"ai.device.os\",\n        \"ai.device.osVersion\",\n        \"ai.device.roleInstance\",\n        \"ai.device.roleName\",\n        \"ai.device.screenResolution\",\n        \"ai.device.type\",\n        \"ai.device.machineName\",\n        \"ai.device.vmName\",\n        \"ai.device.browser\",\n        \"ai.device.browserVersion\",\n        \"ai.location.ip\",\n        \"ai.location.country\",\n        \"ai.location.province\",\n        \"ai.location.city\",\n        \"ai.operation.id\",\n        \"ai.operation.name\",\n        \"ai.operation.parentId\",\n        \"ai.operation.rootId\",\n        \"ai.operation.syntheticSource\",\n        \"ai.operation.correlationVector\",\n        \"ai.session.id\",\n        \"ai.session.isFirst\",\n        \"ai.session.isNew\",\n        \"ai.user.accountAcquisitionDate\",\n        \"ai.user.accountId\",\n        \"ai.user.userAgent\",\n        \"ai.user.id\",\n        \"ai.user.storeRegion\",\n        \"ai.user.authUserId\",\n        \"ai.user.anonUserAcquisitionDate\",\n        \"ai.user.authUserAcquisitionDate\",\n        \"ai.cloud.name\",\n        \"ai.cloud.role\",\n        \"ai.cloud.roleVer\",\n        \"ai.cloud.roleInstance\",\n        \"ai.cloud.environment\",\n        \"ai.cloud.location\",\n        \"ai.cloud.deploymentUnit\",\n        \"ai.internal.sdkVersion\",\n        \"ai.internal.agentVersion\",\n        \"ai.internal.nodeName\",\n    ];\n    // these two constants are used to filter out properties not needed when trying to extract custom properties and measurements from the incoming payload\n    var baseType = \"baseType\";\n    var baseData = \"baseData\";\n    var EnvelopeCreator = /** @class */ (function () {\n        function EnvelopeCreator() {\n        }\n        EnvelopeCreator.extractProperties = function (data) {\n            var customProperties = null;\n            for (var key in data) {\n                if (data.hasOwnProperty(key)) {\n                    var value = data[key];\n                    if (typeof value !== \"number\") {\n                        if (!customProperties) {\n                            customProperties = {};\n                        }\n                        customProperties[key] = value;\n                    }\n                }\n            }\n            return customProperties;\n        };\n        EnvelopeCreator.extractPropsAndMeasurements = function (data, properties, measurements) {\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(data)) {\n                for (var key in data) {\n                    if (data.hasOwnProperty(key)) {\n                        var value = data[key];\n                        if (typeof value === \"number\") {\n                            measurements[key] = value;\n                        }\n                        else {\n                            properties[key] = value;\n                        }\n                    }\n                }\n            }\n        };\n        // TODO: Do we want this to take logger as arg or use this._logger as nonstatic?\n        EnvelopeCreator.createEnvelope = function (logger, envelopeType, telemetryItem, data) {\n            var envelope = new applicationinsights_common_1.Envelope(logger, data, envelopeType);\n            envelope.iKey = telemetryItem.instrumentationKey;\n            var iKeyNoDashes = telemetryItem.instrumentationKey.replace(/-/g, \"\");\n            envelope.name = envelope.name.replace(\"{0}\", iKeyNoDashes);\n            // loop through the envelope ctx (Part A) and pick out the ones that should go in outgoing envelope tags\n            for (var key in telemetryItem.ctx) {\n                if (telemetryItem.ctx.hasOwnProperty(key)) {\n                    if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                        envelope.tags[key] = telemetryItem.ctx[key];\n                    }\n                }\n            }\n            // loop through the envelope tags (extension of Part A) and pick out the ones that should go in outgoing envelope tags\n            telemetryItem.tags.forEach(function (tag) {\n                for (var key in tag) {\n                    if (tag.hasOwnProperty(key)) {\n                        if (exports.ContextTagKeys.indexOf(key) >= 0) {\n                            envelope.tags[key] = tag[key];\n                        }\n                    }\n                }\n            });\n            return envelope;\n        };\n        return EnvelopeCreator;\n    }());\n    exports.EnvelopeCreator = EnvelopeCreator;\n    var DependencyEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(DependencyEnvelopeCreator, _super);\n        function DependencyEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        DependencyEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customMeasurements = {};\n            var customProperties = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var bd = telemetryItem.baseData;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(bd)) {\n                logger.warnToConsole(\"Invalid input for dependency data\");\n                return null;\n            }\n            var id = bd.id;\n            var absoluteUrl = bd.absoluteUrl;\n            var command = bd.commandName;\n            var duration = bd.duration;\n            var success = bd.success;\n            var resultCode = bd.resultCode;\n            var method = bd.method;\n            var baseData = new applicationinsights_common_1.RemoteDependencyData(logger, id, absoluteUrl, command, duration, success, resultCode, method, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.RemoteDependencyData.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.RemoteDependencyData.envelopeType, telemetryItem, data);\n        };\n        DependencyEnvelopeCreator.DependencyEnvelopeCreator = new DependencyEnvelopeCreator();\n        return DependencyEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.DependencyEnvelopeCreator = DependencyEnvelopeCreator;\n    var EventEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(EventEnvelopeCreator, _super);\n        function EventEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            if (telemetryItem.baseType !== applicationinsights_common_1.Event.dataType) {\n                EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.baseData, customProperties, customMeasurements);\n            }\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var eventName = telemetryItem.baseData.name;\n            var baseData = new applicationinsights_common_1.Event(logger, eventName, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Event.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Event.envelopeType, telemetryItem, data);\n        };\n        EventEnvelopeCreator.EventEnvelopeCreator = new EventEnvelopeCreator();\n        return EventEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.EventEnvelopeCreator = EventEnvelopeCreator;\n    var ExceptionEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(ExceptionEnvelopeCreator, _super);\n        function ExceptionEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ExceptionEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var exception = telemetryItem.baseData.error;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var baseData = new applicationinsights_common_1.Exception(logger, exception, customProperties, customMeasurements, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Exception.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Exception.envelopeType, telemetryItem, data);\n        };\n        ExceptionEnvelopeCreator.ExceptionEnvelopeCreator = new ExceptionEnvelopeCreator();\n        return ExceptionEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.ExceptionEnvelopeCreator = ExceptionEnvelopeCreator;\n    var MetricEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(MetricEnvelopeCreator, _super);\n        function MetricEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        MetricEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var name = telemetryItem.baseData.name;\n            var average = telemetryItem.baseData.average;\n            var sampleCount = telemetryItem.baseData.sampleCount;\n            var min = telemetryItem.baseData.min;\n            var max = telemetryItem.baseData.max;\n            var baseData = new applicationinsights_common_1.Metric(logger, name, average, sampleCount, min, max, customProperties);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Metric.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Metric.envelopeType, telemetryItem, data);\n        };\n        MetricEnvelopeCreator.MetricEnvelopeCreator = new MetricEnvelopeCreator();\n        return MetricEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.MetricEnvelopeCreator = MetricEnvelopeCreator;\n    var PageViewEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewEnvelopeCreator, _super);\n        function PageViewEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            // Since duration is not part of the domain properties in Common Schema, extract it from part C \n            var duration = undefined;\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data) &&\n                !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.data.duration)) {\n                duration = telemetryItem.data.duration;\n                delete telemetryItem.data.duration;\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            // Todo: move IPageViewTelemetry to common as we are missing type checks on baseData here\n            // refUri is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.refUri)) {\n                customProperties[\"refUri\"] = telemetryItem.baseData.refUri;\n            }\n            // pageType is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageType)) {\n                customProperties[\"pageType\"] = telemetryItem.baseData.pageType;\n            }\n            // isLoggedIn is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.isLoggedIn)) {\n                customProperties[\"isLoggedIn\"] = telemetryItem.baseData.isLoggedIn;\n            }\n            // pageTags is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData.pageTags)) {\n                var pageTags = telemetryItem.baseData.pageTags;\n                for (var key in pageTags) {\n                    if (pageTags.hasOwnProperty(key)) {\n                        customProperties[key] = pageTags[key];\n                    }\n                }\n            }\n            var baseData = new applicationinsights_common_1.PageView(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageView.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageView.envelopeType, telemetryItem, data);\n        };\n        PageViewEnvelopeCreator.PageViewEnvelopeCreator = new PageViewEnvelopeCreator();\n        return PageViewEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewEnvelopeCreator = PageViewEnvelopeCreator;\n    var PageViewPerformanceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(PageViewPerformanceEnvelopeCreator, _super);\n        function PageViewPerformanceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        PageViewPerformanceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var customProperties = {};\n            var customMeasurements = {};\n            EnvelopeCreator.extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n            var name = telemetryItem.baseData.name;\n            var url = telemetryItem.baseData.uri;\n            var duration = telemetryItem.baseData.duration;\n            var baseData = new applicationinsights_common_1.PageViewPerformance(logger, name, url, duration, customProperties, customMeasurements);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.PageViewPerformance.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.PageViewPerformance.envelopeType, telemetryItem, data);\n        };\n        PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator = new PageViewPerformanceEnvelopeCreator();\n        return PageViewPerformanceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.PageViewPerformanceEnvelopeCreator = PageViewPerformanceEnvelopeCreator;\n    var TraceEnvelopeCreator = /** @class */ (function (_super) {\n        __extends(TraceEnvelopeCreator, _super);\n        function TraceEnvelopeCreator() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        TraceEnvelopeCreator.prototype.Create = function (logger, telemetryItem) {\n            this._logger = logger;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(telemetryItem.baseData)) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n            }\n            var message = telemetryItem.baseData.message;\n            var severityLevel = telemetryItem.baseData.severityLevel;\n            var customProperties = EnvelopeCreator.extractProperties(telemetryItem.data);\n            var baseData = new applicationinsights_common_1.Trace(logger, message, customProperties, severityLevel);\n            var data = new applicationinsights_common_1.Data(applicationinsights_common_1.Trace.dataType, baseData);\n            return EnvelopeCreator.createEnvelope(logger, applicationinsights_common_1.Trace.envelopeType, telemetryItem, data);\n        };\n        TraceEnvelopeCreator.TraceEnvelopeCreator = new TraceEnvelopeCreator();\n        return TraceEnvelopeCreator;\n    }(EnvelopeCreator));\n    exports.TraceEnvelopeCreator = TraceEnvelopeCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EnvelopeCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Offline.js ***!\n  \\***********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * @description Monitors browser for offline events\n     * @export default - Offline: Static instance of OfflineListener\n     * @class OfflineListener\n     */\n    var OfflineListener = /** @class */ (function () {\n        function OfflineListener() {\n            this._onlineStatus = true;\n            if (window && window.addEventListener) {\n                window.addEventListener('online', this._setOnline.bind(this), false);\n                window.addEventListener('offline', this._setOffline.bind(this), false);\n                this.isListening = true;\n            }\n            else if (document && document.body) {\n                document.body.ononline = this._setOnline.bind(this);\n                document.body.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else if (document) {\n                document.ononline = this._setOnline.bind(this);\n                document.onoffline = this._setOffline.bind(this);\n                this.isListening = true;\n            }\n            else {\n                // Could not find a place to add event listener\n                this.isListening = false;\n            }\n        }\n        OfflineListener.prototype._setOnline = function () {\n            this._onlineStatus = true;\n        };\n        OfflineListener.prototype._setOffline = function () {\n            this._onlineStatus = false;\n        };\n        OfflineListener.prototype.isOnline = function () {\n            if (this.isListening) {\n                return this._onlineStatus;\n            }\n            else if (navigator) {\n                return navigator.onLine;\n            }\n            else {\n                // Cannot determine online status - report as online\n                return true;\n            }\n        };\n        OfflineListener.prototype.isOffline = function () {\n            return !this.isOnline();\n        };\n        OfflineListener.Offline = new OfflineListener;\n        return OfflineListener;\n    }());\n    exports.OfflineListener = OfflineListener;\n    exports.Offline = OfflineListener.Offline;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Offline.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /*\n     * An array based send buffer.\n     */\n    var ArraySendBuffer = /** @class */ (function () {\n        function ArraySendBuffer(config) {\n            this._config = config;\n            this._buffer = [];\n        }\n        ArraySendBuffer.prototype.enqueue = function (payload) {\n            this._buffer.push(payload);\n        };\n        ArraySendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        ArraySendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n        };\n        ArraySendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        ArraySendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        ArraySendBuffer.prototype.markAsSent = function (payload) {\n            this.clear();\n        };\n        ArraySendBuffer.prototype.clearSent = function (payload) {\n            // not supported\n        };\n        return ArraySendBuffer;\n    }());\n    exports.ArraySendBuffer = ArraySendBuffer;\n    /*\n     * Session storege buffer holds a copy of all unsent items in the browser session storage.\n     */\n    var SessionStorageSendBuffer = /** @class */ (function () {\n        function SessionStorageSendBuffer(logger, config) {\n            this._bufferFullMessageSent = false;\n            this._logger = logger;\n            this._config = config;\n            var bufferItems = this.getBuffer(SessionStorageSendBuffer.BUFFER_KEY);\n            var notDeliveredItems = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            this._buffer = bufferItems.concat(notDeliveredItems);\n            // If the buffer has too many items, drop items from the end.\n            if (this._buffer.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                this._buffer.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n            }\n            // update DataLossAnalyzer with the number of recovered items\n            // Uncomment if you want to use DataLossanalyzer\n            // DataLossAnalyzer.itemsRestoredFromSessionBuffer = this._buffer.length;\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        }\n        SessionStorageSendBuffer.prototype.enqueue = function (payload) {\n            if (this._buffer.length >= SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                // sent internal log only once per page view\n                if (!this._bufferFullMessageSent) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Maximum buffer size reached: \" + this._buffer.length, true);\n                    this._bufferFullMessageSent = true;\n                }\n                return;\n            }\n            this._buffer.push(payload);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n        };\n        SessionStorageSendBuffer.prototype.count = function () {\n            return this._buffer.length;\n        };\n        SessionStorageSendBuffer.prototype.clear = function () {\n            this._buffer.length = 0;\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, []);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            this._bufferFullMessageSent = false;\n        };\n        SessionStorageSendBuffer.prototype.getItems = function () {\n            return this._buffer.slice(0);\n        };\n        SessionStorageSendBuffer.prototype.batchPayloads = function (payload) {\n            if (payload && payload.length > 0) {\n                var batch = this._config.emitLineDelimitedJson() ?\n                    payload.join(\"\\n\") :\n                    \"[\" + payload.join(\",\") + \"]\";\n                return batch;\n            }\n            return null;\n        };\n        SessionStorageSendBuffer.prototype.markAsSent = function (payload) {\n            this._buffer = this.removePayloadsFromBuffer(payload, this._buffer);\n            this.setBuffer(SessionStorageSendBuffer.BUFFER_KEY, this._buffer);\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            if (sentElements instanceof Array && payload instanceof Array) {\n                sentElements = sentElements.concat(payload);\n                if (sentElements.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                    // We send telemetry normally. If the SENT_BUFFER is too big we don't add new elements\n                    // until we receive a response from the backend and the buffer has free space again (see clearSent method)\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SessionStorageBufferFull, \"Sent buffer reached its maximum size: \" + sentElements.length, true);\n                    sentElements.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n                }\n                this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n            }\n        };\n        SessionStorageSendBuffer.prototype.clearSent = function (payload) {\n            var sentElements = this.getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            sentElements = this.removePayloadsFromBuffer(payload, sentElements);\n            this.setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n        };\n        SessionStorageSendBuffer.prototype.removePayloadsFromBuffer = function (payloads, buffer) {\n            var remaining = [];\n            for (var i in buffer) {\n                var contains = false;\n                for (var j in payloads) {\n                    if (payloads[j] === buffer[i]) {\n                        contains = true;\n                        break;\n                    }\n                }\n                if (!contains) {\n                    remaining.push(buffer[i]);\n                }\n            }\n            ;\n            return remaining;\n        };\n        SessionStorageSendBuffer.prototype.getBuffer = function (key) {\n            try {\n                var bufferJson = applicationinsights_common_1.Util.getSessionStorage(this._logger, key);\n                if (bufferJson) {\n                    var buffer = JSON.parse(bufferJson);\n                    if (buffer) {\n                        return buffer;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FailedToRestoreStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            return [];\n        };\n        SessionStorageSendBuffer.prototype.setBuffer = function (key, buffer) {\n            try {\n                var bufferJson = JSON.stringify(buffer);\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, bufferJson);\n            }\n            catch (e) {\n                // if there was an error, clear the buffer\n                // telemetry is stored in the _buffer array so we won't loose any items\n                applicationinsights_common_1.Util.setSessionStorage(this._logger, key, JSON.stringify([]));\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedToSetStorageBuffer, \" storage key: \" + key + \", \" + applicationinsights_common_1.Util.getExceptionName(e) + \". Buffer cleared\", { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        SessionStorageSendBuffer.BUFFER_KEY = \"AI_buffer\";\n        SessionStorageSendBuffer.SENT_BUFFER_KEY = \"AI_sentBuffer\";\n        // Maximum number of payloads stored in the buffer. If the buffer is full, new elements will be dropped. \n        SessionStorageSendBuffer.MAX_BUFFER_SIZE = 2000;\n        return SessionStorageSendBuffer;\n    }());\n    exports.SessionStorageSendBuffer = SessionStorageSendBuffer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SendBuffer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Sender.js ***!\n  \\**********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./SendBuffer */ \"./node_modules/applicationinsights-channel-js/bundle/SendBuffer.js\"), __webpack_require__(/*! ./EnvelopeCreator */ \"./node_modules/applicationinsights-channel-js/bundle/EnvelopeCreator.js\"), __webpack_require__(/*! ./TelemetryValidation/EventValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/TraceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/ExceptionValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/MetricValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewPerformanceValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/PageViewValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\"), __webpack_require__(/*! ./TelemetryValidation/RemoteDepdencyValidator */ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\"), __webpack_require__(/*! ./Serializer */ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\"), __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./Offline */ \"./node_modules/applicationinsights-channel-js/bundle/Offline.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, SendBuffer_1, EnvelopeCreator_1, EventValidator_1, TraceValidator_1, ExceptionValidator_1, MetricValidator_1, PageViewPerformanceValidator_1, PageViewValidator_1, RemoteDepdencyValidator_1, Serializer_1, applicationinsights_common_1, applicationinsights_core_js_1, applicationinsights_core_js_2, Offline_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Sender = /** @class */ (function () {\n        function Sender() {\n            this.priority = 201;\n            /**\n             * Whether XMLHttpRequest object is supported. Older version of IE (8,9) do not support it.\n             */\n            this._XMLHttpRequestSupported = false;\n        }\n        Sender.prototype.pause = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.resume = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.flush = function () {\n            try {\n                this.triggerSend();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.FlushFailed, \"flush failed, telemetry will not be collected: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n        };\n        Sender.prototype.teardown = function () {\n            throw new Error(\"Method not implemented.\");\n        };\n        Sender.prototype.initialize = function (config, core, extensions) {\n            this.identifier = \"AppInsightsChannelPlugin\";\n            this._logger = core.logger;\n            this._serializer = new Serializer_1.Serializer(core.logger);\n            this._consecutiveErrors = 0;\n            this._retryAt = null;\n            this._lastSend = 0;\n            this._config = Sender._getDefaultAppInsightsChannelConfig(config, this.identifier);\n            this._sender = null;\n            this._buffer = (applicationinsights_common_1.Util.canUseSessionStorage() && this._config.enableSessionStorageBuffer)\n                ? new SendBuffer_1.SessionStorageSendBuffer(this._logger, this._config) : new SendBuffer_1.ArraySendBuffer(this._config);\n            if (!this._config.isBeaconApiDisabled() && applicationinsights_common_1.Util.IsBeaconApiSupported()) {\n                this._sender = this._beaconSender;\n            }\n            else {\n                if (typeof XMLHttpRequest != \"undefined\") {\n                    var testXhr = new XMLHttpRequest();\n                    if (\"withCredentials\" in testXhr) {\n                        this._sender = this._xhrSender;\n                        this._XMLHttpRequestSupported = true;\n                    }\n                    else if (typeof XDomainRequest !== \"undefined\") {\n                        this._sender = this._xdrSender; //IE 8 and 9\n                    }\n                }\n            }\n        };\n        Sender.prototype.processTelemetry = function (telemetryItem) {\n            try {\n                // if master off switch is set, don't send any data\n                if (this._config.disableTelemetry()) {\n                    // Do not send/save data\n                    return;\n                }\n                // validate input\n                if (!telemetryItem) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSendEmptyTelemetry, \"Cannot send empty telemetry\");\n                    return;\n                }\n                // ensure a sender was constructed\n                if (!this._sender) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.SenderNotInitialized, \"Sender was not initialized\");\n                    return;\n                }\n                // first we need to validate that the envelope passed down is valid\n                var isValid = Sender._validate(telemetryItem);\n                if (!isValid) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TelemetryEnvelopeInvalid, \"Invalid telemetry envelope\");\n                    return;\n                }\n                // construct an envelope that Application Insights endpoint can understand\n                var aiEnvelope = this._constructEnvelope(telemetryItem);\n                if (!aiEnvelope) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CreateEnvelopeError, \"Unable to create an AppInsights envelope\");\n                    return;\n                }\n                // check if the incoming payload is too large, truncate if necessary\n                var payload = this._serializer.serialize(aiEnvelope);\n                // flush if we would exceed the max-size limit by adding this item\n                var bufferPayload = this._buffer.getItems();\n                var batch = this._buffer.batchPayloads(bufferPayload);\n                if (batch && (batch.length + payload.length > this._config.maxBatchSizeInBytes())) {\n                    this.triggerSend();\n                }\n                // enqueue the payload\n                this._buffer.enqueue(payload);\n                // ensure an invocation timeout is set\n                this._setupTimer();\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.FailedAddingTelemetryToBuffer, \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n            }\n            // hand off the telemetry item to the next plugin\n            if (!applicationinsights_core_js_2.CoreUtils.isNullOrUndefined(this._nextPlugin)) {\n                this._nextPlugin.processTelemetry(telemetryItem);\n            }\n        };\n        Sender.prototype.setNextPlugin = function (next) {\n            this._nextPlugin = next;\n        };\n        /**\n         * xhr state changes\n         */\n        Sender.prototype._xhrReadyStateChange = function (xhr, payload, countOfItemsInPayload) {\n            if (xhr.readyState === 4) {\n                var response = null;\n                if (!this._appId) {\n                    response = this._parseResponse(xhr.responseText || xhr.response);\n                    if (response && response.appId) {\n                        this._appId = response.appId;\n                    }\n                }\n                if ((xhr.status < 200 || xhr.status >= 300) && xhr.status !== 0) {\n                    if (!this._config.isRetryDisabled() && this._isRetriable(xhr.status)) {\n                        this._resendPayload(payload);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                            \"Response code \" + xhr.status + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                    else {\n                        this._onError(payload, this._formatErrorMessageXhr(xhr));\n                    }\n                }\n                else if (xhr.status === 0 || Offline_1.Offline.isOffline()) {\n                    if (!this._config.isRetryDisabled()) {\n                        var offlineBackOffMultiplier = 10; // arbritrary number\n                        this._resendPayload(payload, offlineBackOffMultiplier);\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". Offline - Response Code: \" + xhr.status + \". Offline status: \" + Offline_1.Offline.isOffline() + \". Will retry to send \" + payload.length + \" items.\");\n                    }\n                }\n                else {\n                    if (xhr.status === 206) {\n                        if (!response) {\n                            response = this._parseResponse(xhr.responseText || xhr.response);\n                        }\n                        if (response && !this._config.isRetryDisabled()) {\n                            this._onPartialSuccess(payload, response);\n                        }\n                        else {\n                            this._onError(payload, this._formatErrorMessageXhr(xhr));\n                        }\n                    }\n                    else {\n                        this._consecutiveErrors = 0;\n                        this._onSuccess(payload, countOfItemsInPayload);\n                    }\n                }\n            }\n        };\n        /**\n         * Immediately send buffered data\n         * @param async {boolean} - Indicates if the events should be sent asynchronously\n         */\n        Sender.prototype.triggerSend = function (async) {\n            if (async === void 0) { async = true; }\n            try {\n                // Send data only if disableTelemetry is false\n                if (!this._config.disableTelemetry()) {\n                    if (this._buffer.count() > 0) {\n                        var payload = this._buffer.getItems();\n                        // invoke send\n                        this._sender(payload, async);\n                    }\n                    // update lastSend time to enable throttling\n                    this._lastSend = +new Date;\n                }\n                else {\n                    this._buffer.clear();\n                }\n                clearTimeout(this._timeoutHandle);\n                this._timeoutHandle = null;\n                this._retryAt = null;\n            }\n            catch (e) {\n                /* Ignore this error for IE under v10 */\n                if (!applicationinsights_common_1.Util.getIEVersion() || applicationinsights_common_1.Util.getIEVersion() > 9) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Telemetry transmission failed, some telemetry will be lost: \" + applicationinsights_common_1.Util.getExceptionName(e), { exception: applicationinsights_common_1.Util.dump(e) });\n                }\n            }\n        };\n        /**\n         * error handler\n         */\n        Sender.prototype._onError = function (payload, message, event) {\n            this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.OnError, \"Failed to send telemetry.\", { message: message });\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * partial success handler\n         */\n        Sender.prototype._onPartialSuccess = function (payload, results) {\n            var failed = [];\n            var retry = [];\n            // Iterate through the reversed array of errors so that splicing doesn't have invalid indexes after the first item.\n            var errors = results.errors.reverse();\n            for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n                var error = errors_1[_i];\n                var extracted = payload.splice(error.index, 1)[0];\n                if (this._isRetriable(error.statusCode)) {\n                    retry.push(extracted);\n                }\n                else {\n                    // All other errors, including: 402 (Monthly quota exceeded) and 439 (Too many requests and refresh cache).\n                    failed.push(extracted);\n                }\n            }\n            if (payload.length > 0) {\n                this._onSuccess(payload, results.itemsAccepted);\n            }\n            if (failed.length > 0) {\n                this._onError(failed, this._formatErrorMessageXhr(null, ['partial success', results.itemsAccepted, 'of', results.itemsReceived].join(' ')));\n            }\n            if (retry.length > 0) {\n                this._resendPayload(retry);\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \"Partial success. \" +\n                    \"Delivered: \" + payload.length + \", Failed: \" + failed.length +\n                    \". Will retry to send \" + retry.length + \" our of \" + results.itemsReceived + \" items\");\n            }\n        };\n        /**\n         * success handler\n         */\n        Sender.prototype._onSuccess = function (payload, countOfItemsInPayload) {\n            this._buffer.clearSent(payload);\n        };\n        /**\n         * xdr state changes\n         */\n        Sender.prototype._xdrOnLoad = function (xdr, payload) {\n            if (xdr && (xdr.responseText + \"\" === \"200\" || xdr.responseText === \"\")) {\n                this._consecutiveErrors = 0;\n                this._onSuccess(payload, 0);\n            }\n            else {\n                var results = this._parseResponse(xdr.responseText);\n                if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                    && !this._config.isRetryDisabled()) {\n                    this._onPartialSuccess(payload, results);\n                }\n                else {\n                    this._onError(payload, this._formatErrorMessageXdr(xdr));\n                }\n            }\n        };\n        Sender.prototype._constructEnvelope = function (envelope) {\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return EnvelopeCreator_1.TraceEnvelopeCreator.TraceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return EnvelopeCreator_1.PageViewEnvelopeCreator.PageViewEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return EnvelopeCreator_1.PageViewPerformanceEnvelopeCreator.PageViewPerformanceEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return EnvelopeCreator_1.ExceptionEnvelopeCreator.ExceptionEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return EnvelopeCreator_1.MetricEnvelopeCreator.MetricEnvelopeCreator.Create(this._logger, envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return EnvelopeCreator_1.DependencyEnvelopeCreator.DependencyEnvelopeCreator.Create(this._logger, envelope);\n                default:\n                    // default create custom event type\n                    return EnvelopeCreator_1.EventEnvelopeCreator.EventEnvelopeCreator.Create(this._logger, envelope);\n            }\n        };\n        Sender._getDefaultAppInsightsChannelConfig = function (config, identifier) {\n            var resultConfig = {};\n            var pluginConfig = config.extensionConfig && config.extensionConfig[identifier] ? config.extensionConfig[identifier] : {};\n            // set default values\n            resultConfig.endpointUrl = function () { return config.endpointUrl || \"https://dc.services.visualstudio.com/v2/track\"; };\n            resultConfig.emitLineDelimitedJson = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.emitLineDelimitedJson); };\n            resultConfig.maxBatchInterval = function () { return !isNaN(pluginConfig.maxBatchInterval) ? pluginConfig.maxBatchInterval : 15000; };\n            resultConfig.maxBatchSizeInBytes = function () { return pluginConfig.maxBatchSizeInBytes > 0 ? pluginConfig.maxBatchSizeInBytes : 102400; }; // 100kb\n            resultConfig.disableTelemetry = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.disableTelemetry); };\n            resultConfig.enableSessionStorageBuffer = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.enableSessionStorageBuffer, true); };\n            resultConfig.isRetryDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isRetryDisabled); };\n            resultConfig.isBeaconApiDisabled = function () { return applicationinsights_common_1.Util.stringToBoolOrDefault(pluginConfig.isBeaconApiDisabled, true); };\n            return resultConfig;\n        };\n        Sender._validate = function (envelope) {\n            // call the appropriate Validate depending on the baseType\n            switch (envelope.baseType) {\n                case applicationinsights_common_1.Event.dataType:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n                case applicationinsights_common_1.Trace.dataType:\n                    return TraceValidator_1.TraceValidator.TraceValidator.Validate(envelope);\n                case applicationinsights_common_1.Exception.dataType:\n                    return ExceptionValidator_1.ExceptionValidator.ExceptionValidator.Validate(envelope);\n                case applicationinsights_common_1.Metric.dataType:\n                    return MetricValidator_1.MetricValidator.MetricValidator.Validate(envelope);\n                case applicationinsights_common_1.PageView.dataType:\n                    return PageViewValidator_1.PageViewValidator.PageViewValidator.Validate(envelope);\n                case applicationinsights_common_1.PageViewPerformance.dataType:\n                    return PageViewPerformanceValidator_1.PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(envelope);\n                case applicationinsights_common_1.RemoteDependencyData.dataType:\n                    return RemoteDepdencyValidator_1.RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(envelope);\n                default:\n                    return EventValidator_1.EventValidator.EventValidator.Validate(envelope);\n            }\n        };\n        /**\n         * Send Beacon API request\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - not used\n         * Note: Beacon API does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._beaconSender = function (payload, isAsync) {\n            var url = this._config.endpointUrl();\n            var batch = this._buffer.batchPayloads(payload);\n            // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n            // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n            var plainTextBatch = new Blob([batch], { type: 'text/plain;charset=UTF-8' });\n            // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n            var queued = navigator.sendBeacon(url, plainTextBatch);\n            if (queued) {\n                this._buffer.markAsSent(payload);\n            }\n            else {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API.\");\n            }\n        };\n        /**\n         * Send XMLHttpRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         */\n        Sender.prototype._xhrSender = function (payload, isAsync) {\n            var _this = this;\n            var xhr = new XMLHttpRequest();\n            xhr[applicationinsights_common_1.DisabledPropertyName] = true;\n            xhr.open(\"POST\", this._config.endpointUrl(), isAsync);\n            xhr.setRequestHeader(\"Content-type\", \"application/json\");\n            // append Sdk-Context request header only in case of breeze endpoint \n            if (applicationinsights_common_1.Util.isInternalApplicationInsightsEndpoint(this._config.endpointUrl())) {\n                xhr.setRequestHeader(applicationinsights_common_1.RequestHeaders.sdkContextHeader, applicationinsights_common_1.RequestHeaders.sdkContextHeaderAppIdRequest);\n            }\n            xhr.onreadystatechange = function () { return _this._xhrReadyStateChange(xhr, payload, payload.length); };\n            xhr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXhr(xhr), event); };\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xhr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        /**\n         * Parses the response from the backend.\n         * @param response - XMLHttpRequest or XDomainRequest response\n         */\n        Sender.prototype._parseResponse = function (response) {\n            try {\n                if (response && response !== \"\") {\n                    var result = JSON.parse(response);\n                    if (result && result.itemsReceived && result.itemsReceived >= result.itemsAccepted &&\n                        result.itemsReceived - result.itemsAccepted == result.errors.length) {\n                        return result;\n                    }\n                }\n            }\n            catch (e) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.InvalidBackendResponse, \"Cannot parse the response. \" + applicationinsights_common_1.Util.getExceptionName(e), {\n                    response: response\n                });\n            }\n            return null;\n        };\n        /**\n         * Resend payload. Adds payload back to the send buffer and setup a send timer (with exponential backoff).\n         * @param payload\n         */\n        Sender.prototype._resendPayload = function (payload, linearFactor) {\n            if (linearFactor === void 0) { linearFactor = 1; }\n            if (!payload || payload.length === 0) {\n                return;\n            }\n            this._buffer.clearSent(payload);\n            this._consecutiveErrors++;\n            for (var _i = 0, payload_1 = payload; _i < payload_1.length; _i++) {\n                var item = payload_1[_i];\n                this._buffer.enqueue(item);\n            }\n            // setup timer\n            this._setRetryTime(linearFactor);\n            this._setupTimer();\n        };\n        /** Calculates the time to wait before retrying in case of an error based on\n         * http://en.wikipedia.org/wiki/Exponential_backoff\n         */\n        Sender.prototype._setRetryTime = function (linearFactor) {\n            var SlotDelayInSeconds = 10;\n            var delayInSeconds;\n            if (this._consecutiveErrors <= 1) {\n                delayInSeconds = SlotDelayInSeconds;\n            }\n            else {\n                var backOffSlot = (Math.pow(2, this._consecutiveErrors) - 1) / 2;\n                // tslint:disable-next-line:insecure-random\n                var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                backOffDelay = linearFactor * backOffDelay;\n                delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\n            }\n            // TODO: Log the backoff time like the C# version does.\n            var retryAfterTimeSpan = Date.now() + (delayInSeconds * 1000);\n            // TODO: Log the retry at time like the C# version does.\n            this._retryAt = retryAfterTimeSpan;\n        };\n        /**\n         * Sets up the timer which triggers actually sending the data.\n         */\n        Sender.prototype._setupTimer = function () {\n            var _this = this;\n            if (!this._timeoutHandle) {\n                var retryInterval = this._retryAt ? Math.max(0, this._retryAt - Date.now()) : 0;\n                var timerValue = Math.max(this._config.maxBatchInterval(), retryInterval);\n                this._timeoutHandle = setTimeout(function () {\n                    _this.triggerSend();\n                }, timerValue);\n            }\n        };\n        /**\n         * Checks if the SDK should resend the payload after receiving this status code from the backend.\n         * @param statusCode\n         */\n        Sender.prototype._isRetriable = function (statusCode) {\n            return statusCode == 408 // Timeout\n                || statusCode == 429 // Too many requests.\n                || statusCode == 500 // Internal server error.\n                || statusCode == 503; // Service unavailable.\n        };\n        Sender.prototype._formatErrorMessageXhr = function (xhr, message) {\n            if (xhr) {\n                return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + xhr.responseText || xhr.response || \"\";\n            }\n            return message;\n        };\n        /**\n         * Send XDomainRequest\n         * @param payload {string} - The data payload to be sent.\n         * @param isAsync {boolean} - Indicates if the request should be sent asynchronously\n         *\n         * Note: XDomainRequest does not support sync requests. This 'isAsync' parameter is added\n         * to maintain consistency with the xhrSender's contract\n         * Note: XDomainRequest does not support custom headers and we are not able to get\n         * appId from the backend for the correct correlation.\n         */\n        Sender.prototype._xdrSender = function (payload, isAsync) {\n            var _this = this;\n            var xdr = new XDomainRequest();\n            xdr.onload = function () { return _this._xdrOnLoad(xdr, payload); };\n            xdr.onerror = function (event) { return _this._onError(payload, _this._formatErrorMessageXdr(xdr), event); };\n            // XDomainRequest requires the same protocol as the hosting page. \n            // If the protocol doesn't match, we can't send the telemetry :(. \n            var hostingProtocol = window.location.protocol;\n            if (this._config.endpointUrl().lastIndexOf(hostingProtocol, 0) !== 0) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.TransmissionFailed, \". \" +\n                    \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\");\n                this._buffer.clear();\n                return;\n            }\n            var endpointUrl = this._config.endpointUrl().replace(/^(https?:)/, \"\");\n            xdr.open('POST', endpointUrl);\n            // compose an array of payloads\n            var batch = this._buffer.batchPayloads(payload);\n            xdr.send(batch);\n            this._buffer.markAsSent(payload);\n        };\n        Sender.prototype._formatErrorMessageXdr = function (xdr, message) {\n            if (xdr) {\n                return \"XDomainRequest,Response:\" + xdr.responseText || \"\";\n            }\n            return message;\n        };\n        return Sender;\n    }());\n    exports.Sender = Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Sender.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/Serializer.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/Serializer.js ***!\n  \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-common */ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_common_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Serializer = /** @class */ (function () {\n        function Serializer(logger) {\n            this._logger = logger;\n        }\n        /**\n         * Serializes the current object to a JSON string.\n         */\n        Serializer.prototype.serialize = function (input) {\n            var output = this._serializeObject(input, \"root\");\n            return JSON.stringify(output);\n        };\n        Serializer.prototype._serializeObject = function (source, name) {\n            var circularReferenceCheck = \"__aiCircularRefCheck\";\n            var output = {};\n            if (!source) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, \"cannot serialize object because it is null or undefined\", { name: name }, true);\n                return output;\n            }\n            if (source[circularReferenceCheck]) {\n                this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CircularReferenceDetected, \"Circular reference detected while serializing object\", { name: name }, true);\n                return output;\n            }\n            if (!source.aiDataContract) {\n                // special case for measurements/properties/tags\n                if (name === \"measurements\") {\n                    output = this._serializeStringMap(source, \"number\", name);\n                }\n                else if (name === \"properties\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (name === \"tags\") {\n                    output = this._serializeStringMap(source, \"string\", name);\n                }\n                else if (applicationinsights_common_1.Util.isArray(source)) {\n                    output = this._serializeArray(source, name);\n                }\n                else {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObjectNonSerializable, \"Attempting to serialize an object which does not implement ISerializable\", { name: name }, true);\n                    try {\n                        // verify that the object can be stringified\n                        JSON.stringify(source);\n                        output = source;\n                    }\n                    catch (e) {\n                        // if serialization fails return an empty string\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.CannotSerializeObject, (e && typeof e.toString === 'function') ? e.toString() : \"Error serializing object\", null, true);\n                    }\n                }\n                return output;\n            }\n            source[circularReferenceCheck] = true;\n            for (var field in source.aiDataContract) {\n                var contract = source.aiDataContract[field];\n                var isRequired = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Required) : (contract & applicationinsights_common_1.FieldType.Required);\n                var isHidden = (typeof contract === \"function\") ? (contract() & applicationinsights_common_1.FieldType.Hidden) : (contract & applicationinsights_common_1.FieldType.Hidden);\n                var isArray = contract & applicationinsights_common_1.FieldType.Array;\n                var isPresent = source[field] !== undefined;\n                var isObject = typeof source[field] === \"object\" && source[field] !== null;\n                if (isRequired && !isPresent && !isArray) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.MissingRequiredFieldSpecification, \"Missing required field specification. The field is required but not present on source\", { field: field, name: name });\n                    // If not in debug mode, continue and hope the error is permissible\n                    continue;\n                }\n                if (isHidden) {\n                    // Don't serialize hidden fields\n                    continue;\n                }\n                var value;\n                if (isObject) {\n                    if (isArray) {\n                        // special case; resurse on each object in the source array\n                        value = this._serializeArray(source[field], field);\n                    }\n                    else {\n                        // recurse on the source object in this field\n                        value = this._serializeObject(source[field], field);\n                    }\n                }\n                else {\n                    // assign the source field to the output even if undefined or required\n                    value = source[field];\n                }\n                // only emit this field if the value is defined\n                if (value !== undefined) {\n                    output[field] = value;\n                }\n            }\n            delete source[circularReferenceCheck];\n            return output;\n        };\n        Serializer.prototype._serializeArray = function (sources, name) {\n            var output = undefined;\n            if (!!sources) {\n                if (!applicationinsights_common_1.Util.isArray(sources)) {\n                    this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, applicationinsights_core_js_1._InternalMessageId.ItemNotInArray, \"This field was specified as an array in the contract but the item is not an array.\\r\\n\", { name: name }, true);\n                }\n                else {\n                    output = [];\n                    for (var i = 0; i < sources.length; i++) {\n                        var source = sources[i];\n                        var item = this._serializeObject(source, name + \"[\" + i + \"]\");\n                        output.push(item);\n                    }\n                }\n            }\n            return output;\n        };\n        Serializer.prototype._serializeStringMap = function (map, expectedType, name) {\n            var output = undefined;\n            if (map) {\n                output = {};\n                for (var field in map) {\n                    var value = map[field];\n                    if (expectedType === \"string\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else if (!value.toString) {\n                            output[field] = \"invalid field: toString() is not defined.\";\n                        }\n                        else {\n                            output[field] = value.toString();\n                        }\n                    }\n                    else if (expectedType === \"number\") {\n                        if (value === undefined) {\n                            output[field] = \"undefined\";\n                        }\n                        else if (value === null) {\n                            output[field] = \"null\";\n                        }\n                        else {\n                            var num = parseFloat(value);\n                            if (isNaN(num)) {\n                                output[field] = \"NaN\";\n                            }\n                            else {\n                                output[field] = num;\n                            }\n                        }\n                    }\n                    else {\n                        output[field] = \"invalid field: \" + name + \" is of unknown type.\";\n                        this._logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.CRITICAL, output[field], null, true);\n                    }\n                }\n            }\n            return output;\n        };\n        return Serializer;\n    }());\n    exports.Serializer = Serializer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Serializer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/EventValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var EventValidator = /** @class */ (function () {\n        function EventValidator() {\n        }\n        EventValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n            https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties || !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties || !item.domainProperties[\"name\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        EventValidator.EventValidator = new EventValidator();\n        return EventValidator;\n    }());\n    exports.EventValidator = EventValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/ExceptionValidator.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var ExceptionValidator = /** @class */ (function () {\n        function ExceptionValidator() {\n        }\n        ExceptionValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"exceptions\"] ||\n                !ExceptionValidator._validateExceptions(item.domainProperties[\"exceptions\"])) {\n                return false;\n            }\n            */\n            return true;\n        };\n        // TODO implement validation of exceptions\n        ExceptionValidator._validateExceptions = function (exceptions) {\n            // typeName\n            // message\n            // parsedStack\n            // stack\n            // hasFullStack\n            return true;\n        };\n        ExceptionValidator.ExceptionValidator = new ExceptionValidator();\n        return ExceptionValidator;\n    }());\n    exports.ExceptionValidator = ExceptionValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/MetricValidator.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var MetricValidator = /** @class */ (function () {\n        function MetricValidator() {\n        }\n        MetricValidator.prototype.Validate = function (event) {\n            return true;\n        };\n        MetricValidator.MetricValidator = new MetricValidator();\n        return MetricValidator;\n    }());\n    exports.MetricValidator = MetricValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js\":\n/*!****************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewPerformanceValidator.js ***!\n  \\****************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformanceValidator = /** @class */ (function () {\n        function PageViewPerformanceValidator() {\n        }\n        PageViewPerformanceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n            \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"domProcessing\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"networkConnect\"] ||\n                !item.domainProperties[\"perfTotal\"] ||\n                !item.domainProperties[\"receivedResponse\"] ||\n                !item.domainProperties[\"sentRequest\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewPerformanceValidator.PageViewPerformanceValidator = new PageViewPerformanceValidator();\n        return PageViewPerformanceValidator;\n    }());\n    exports.PageViewPerformanceValidator = PageViewPerformanceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformanceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/PageViewValidator.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewValidator = /** @class */ (function () {\n        function PageViewValidator() {\n        }\n        PageViewValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"url\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        PageViewValidator.PageViewValidator = new PageViewValidator();\n        return PageViewValidator;\n    }());\n    exports.PageViewValidator = PageViewValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/RemoteDepdencyValidator.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDepdencyValidator = /** @class */ (function () {\n        function RemoteDepdencyValidator() {\n        }\n        RemoteDepdencyValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n    \n            if (!item.domainProperties ||\n                !item.domainProperties[\"id\"] ||\n                !item.domainProperties[\"name\"] ||\n                !item.domainProperties[\"resultCode\"] ||\n                !item.domainProperties[\"duration\"] ||\n                !item.domainProperties[\"success\"] ||\n                !item.domainProperties[\"data\"] ||\n                !item.domainProperties[\"target\"] ||\n                !item.domainProperties[\"type\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        RemoteDepdencyValidator.RemoteDepdencyValidator = new RemoteDepdencyValidator();\n        return RemoteDepdencyValidator;\n    }());\n    exports.RemoteDepdencyValidator = RemoteDepdencyValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDepdencyValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js\":\n/*!**************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/TelemetryValidation/TraceValidator.js ***!\n  \\**************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TraceValidator = /** @class */ (function () {\n        function TraceValidator() {\n        }\n        TraceValidator.prototype.Validate = function (item) {\n            /* TODO re-enable once design of iTelemetryItem is finalized. Task used to track this:\n             https://mseng.visualstudio.com/AppInsights/_workitems/edit/1310871\n    \n            // verify system properties has a ver field\n            if (!item.sytemProperties ||\n                !item.sytemProperties[\"ver\"]) {\n                return false;\n            }\n            \n            if (!item.domainProperties ||\n                !item.domainProperties[\"message\"] ||\n                !item.domainProperties[\"severityLevel\"]) {\n                return false;\n            }\n            */\n            return true;\n        };\n        TraceValidator.TraceValidator = new TraceValidator();\n        return TraceValidator;\n    }());\n    exports.TraceValidator = TraceValidator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TraceValidator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-channel-js/bundle/applicationinsights-channel-js.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Sender */ \"./node_modules/applicationinsights-channel-js/bundle/Sender.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Sender_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Sender = Sender_1.Sender;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-channel-js.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Constants.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Constants.js ***!\n  \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.DisabledPropertyName = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Constants.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Enums.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Enums.js ***!\n  \\*****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Type of storage to differentiate between local storage and session storage\n    */\n    var StorageType;\n    (function (StorageType) {\n        StorageType[StorageType[\"LocalStorage\"] = 0] = \"LocalStorage\";\n        StorageType[StorageType[\"SessionStorage\"] = 1] = \"SessionStorage\";\n    })(StorageType = exports.StorageType || (exports.StorageType = {}));\n    /**\n     * Enum is used in aiDataContract to describe how fields are serialized.\n     * For instance: (Fieldtype.Required | FieldType.Array) will mark the field as required and indicate it's an array\n     */\n    var FieldType;\n    (function (FieldType) {\n        FieldType[FieldType[\"Default\"] = 0] = \"Default\";\n        FieldType[FieldType[\"Required\"] = 1] = \"Required\";\n        FieldType[FieldType[\"Array\"] = 2] = \"Array\";\n        FieldType[FieldType[\"Hidden\"] = 4] = \"Hidden\";\n    })(FieldType = exports.FieldType || (exports.FieldType = {}));\n    ;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Enums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n         * Data struct to contain only C section with custom fields.\n         */\n    var Base = /** @class */ (function () {\n        function Base() {\n        }\n        return Base;\n    }());\n    exports.Base = Base;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Base.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\":\n/*!*********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js ***!\n  \\*********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    var ContextTagKeys = /** @class */ (function () {\n        function ContextTagKeys() {\n            this.applicationVersion = \"ai.application.ver\";\n            this.applicationBuild = \"ai.application.build\";\n            this.applicationTypeId = \"ai.application.typeId\";\n            this.applicationId = \"ai.application.applicationId\";\n            this.applicationLayer = \"ai.application.layer\";\n            this.deviceId = \"ai.device.id\";\n            this.deviceIp = \"ai.device.ip\";\n            this.deviceLanguage = \"ai.device.language\";\n            this.deviceLocale = \"ai.device.locale\";\n            this.deviceModel = \"ai.device.model\";\n            this.deviceFriendlyName = \"ai.device.friendlyName\";\n            this.deviceNetwork = \"ai.device.network\";\n            this.deviceNetworkName = \"ai.device.networkName\";\n            this.deviceOEMName = \"ai.device.oemName\";\n            this.deviceOS = \"ai.device.os\";\n            this.deviceOSVersion = \"ai.device.osVersion\";\n            this.deviceRoleInstance = \"ai.device.roleInstance\";\n            this.deviceRoleName = \"ai.device.roleName\";\n            this.deviceScreenResolution = \"ai.device.screenResolution\";\n            this.deviceType = \"ai.device.type\";\n            this.deviceMachineName = \"ai.device.machineName\";\n            this.deviceVMName = \"ai.device.vmName\";\n            this.deviceBrowser = \"ai.device.browser\";\n            this.deviceBrowserVersion = \"ai.device.browserVersion\";\n            this.locationIp = \"ai.location.ip\";\n            this.locationCountry = \"ai.location.country\";\n            this.locationProvince = \"ai.location.province\";\n            this.locationCity = \"ai.location.city\";\n            this.operationId = \"ai.operation.id\";\n            this.operationName = \"ai.operation.name\";\n            this.operationParentId = \"ai.operation.parentId\";\n            this.operationRootId = \"ai.operation.rootId\";\n            this.operationSyntheticSource = \"ai.operation.syntheticSource\";\n            this.operationCorrelationVector = \"ai.operation.correlationVector\";\n            this.sessionId = \"ai.session.id\";\n            this.sessionIsFirst = \"ai.session.isFirst\";\n            this.sessionIsNew = \"ai.session.isNew\";\n            this.userAccountAcquisitionDate = \"ai.user.accountAcquisitionDate\";\n            this.userAccountId = \"ai.user.accountId\";\n            this.userAgent = \"ai.user.userAgent\";\n            this.userId = \"ai.user.id\";\n            this.userStoreRegion = \"ai.user.storeRegion\";\n            this.userAuthUserId = \"ai.user.authUserId\";\n            this.userAnonymousUserAcquisitionDate = \"ai.user.anonUserAcquisitionDate\";\n            this.userAuthenticatedUserAcquisitionDate = \"ai.user.authUserAcquisitionDate\";\n            this.cloudName = \"ai.cloud.name\";\n            this.cloudRole = \"ai.cloud.role\";\n            this.cloudRoleVer = \"ai.cloud.roleVer\";\n            this.cloudRoleInstance = \"ai.cloud.roleInstance\";\n            this.cloudEnvironment = \"ai.cloud.environment\";\n            this.cloudLocation = \"ai.cloud.location\";\n            this.cloudDeploymentUnit = \"ai.cloud.deploymentUnit\";\n            this.internalSdkVersion = \"ai.internal.sdkVersion\";\n            this.internalAgentVersion = \"ai.internal.agentVersion\";\n            this.internalNodeName = \"ai.internal.nodeName\";\n        }\n        return ContextTagKeys;\n    }());\n    exports.ContextTagKeys = ContextTagKeys;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ContextTagKeys.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\":\n/*!***********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js ***!\n  \\***********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Base_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Data struct to contain both B and C sections.\n     */\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        function Data() {\n            return _super.call(this) || this;\n        }\n        return Data;\n    }(Base_1.Base));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./DataPointType */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPointType_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Metric data single measurement.\n     */\n    var DataPoint = /** @class */ (function () {\n        function DataPoint() {\n            this.kind = DataPointType_1.DataPointType.Measurement;\n        }\n        return DataPoint;\n    }());\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPointType.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Type of the metric data measurement.\n     */\n    var DataPointType;\n    (function (DataPointType) {\n        DataPointType[DataPointType[\"Measurement\"] = 0] = \"Measurement\";\n        DataPointType[DataPointType[\"Aggregation\"] = 1] = \"Aggregation\";\n    })(DataPointType = exports.DataPointType || (exports.DataPointType = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPointType.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\":\n/*!*************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js ***!\n  \\*************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The abstract common base of all domains.\n     */\n    var Domain = /** @class */ (function () {\n        function Domain() {\n        }\n        return Domain;\n    }());\n    exports.Domain = Domain;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Domain.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\":\n/*!***************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js ***!\n  \\***************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * System variables for a telemetry item.\n     */\n    var Envelope = /** @class */ (function () {\n        function Envelope() {\n            this.ver = 1;\n            this.sampleRate = 100.0;\n            this.tags = {};\n        }\n        return Envelope;\n    }());\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\":\n/*!****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js ***!\n  \\****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Event represent structured event records that can be grouped and searched by their properties. Event data item also creates a metric of event count by name.\n     */\n    var EventData = /** @class */ (function (_super) {\n        __extends(EventData, _super);\n        function EventData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return EventData;\n    }(Domain_1.Domain));\n    exports.EventData = EventData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Exception represents a handled or unhandled exception that occurred during execution of the monitored application.\n     */\n    var ExceptionData = /** @class */ (function (_super) {\n        __extends(ExceptionData, _super);\n        function ExceptionData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.exceptions = [];\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return ExceptionData;\n    }(Domain_1.Domain));\n    exports.ExceptionData = ExceptionData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Exception details of the exception in a chain.\n     */\n    var ExceptionDetails = /** @class */ (function () {\n        function ExceptionDetails() {\n            this.hasFullStack = true;\n            this.parsedStack = [];\n        }\n        return ExceptionDetails;\n    }());\n    exports.ExceptionDetails = ExceptionDetails;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=ExceptionDetails.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Instances of Message represent printf-like trace statements that are text-searched. Log4Net, NLog and other text-based log file entries are translated into intances of this type. The message does not have measurements.\n     */\n    var MessageData = /** @class */ (function (_super) {\n        __extends(MessageData, _super);\n        function MessageData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            return _this;\n        }\n        return MessageData;\n    }(Domain_1.Domain));\n    exports.MessageData = MessageData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MessageData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of the Metric item is a list of measurements (single data points) and/or aggregations.\n     */\n    var MetricData = /** @class */ (function (_super) {\n        __extends(MetricData, _super);\n        function MetricData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.metrics = [];\n            _this.properties = {};\n            return _this;\n        }\n        return MetricData;\n    }(Domain_1.Domain));\n    exports.MetricData = MetricData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=MetricData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\":\n/*!*******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js ***!\n  \\*******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageView represents a generic action on a page like a button click. It is also the base type for PageView.\n     */\n    var PageViewData = /** @class */ (function (_super) {\n        __extends(PageViewData, _super);\n        function PageViewData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewData;\n    }(EventData_1.EventData));\n    exports.PageViewData = PageViewData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\":\n/*!***********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js ***!\n  \\***********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of PageViewPerf represents: a page view with no performance data, a page view with performance data, or just the performance data of an earlier page request.\n     */\n    var PageViewPerfData = /** @class */ (function (_super) {\n        __extends(PageViewPerfData, _super);\n        function PageViewPerfData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return PageViewPerfData;\n    }(PageViewData_1.PageViewData));\n    exports.PageViewPerfData = PageViewPerfData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerfData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\":\n/*!***************************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js ***!\n  \\***************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Domain */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Domain.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Domain_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * An instance of Remote Dependency represents an interaction of the monitored component with a remote component/service like SQL or an HTTP endpoint.\n     */\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        function RemoteDependencyData() {\n            var _this = _super.call(this) || this;\n            _this.ver = 2;\n            _this.success = true;\n            _this.properties = {};\n            _this.measurements = {};\n            return _this;\n        }\n        return RemoteDependencyData;\n    }(Domain_1.Domain));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\":\n/*!********************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js ***!\n  \\********************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// THIS FILE WAS AUTOGENERATED\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n    * Defines the level of severity for the event.\n    */\n    var SeverityLevel;\n    (function (SeverityLevel) {\n        SeverityLevel[SeverityLevel[\"Verbose\"] = 0] = \"Verbose\";\n        SeverityLevel[SeverityLevel[\"Information\"] = 1] = \"Information\";\n        SeverityLevel[SeverityLevel[\"Warning\"] = 2] = \"Warning\";\n        SeverityLevel[SeverityLevel[\"Error\"] = 3] = \"Error\";\n        SeverityLevel[SeverityLevel[\"Critical\"] = 4] = \"Critical\";\n    })(SeverityLevel = exports.SeverityLevel || (exports.SeverityLevel = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=SeverityLevel.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\":\n/*!*****************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js ***!\n  \\*****************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    // THIS FILE WAS AUTOGENERATED\n    /**\n     * Stack frame information.\n     */\n    var StackFrame = /** @class */ (function () {\n        function StackFrame() {\n        }\n        return StackFrame;\n    }());\n    exports.StackFrame = StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=StackFrame.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js ***!\n  \\**********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RequestHeaders = /** @class */ (function () {\n        function RequestHeaders() {\n        }\n        /**\n         * Request-Context header\n         */\n        RequestHeaders.requestContextHeader = \"Request-Context\";\n        /**\n         * Target instrumentation header that is added to the response and retrieved by the\n         * calling application when processing incoming responses.\n         */\n        RequestHeaders.requestContextTargetKey = \"appId\";\n        /**\n         * Request-Context appId format\n         */\n        RequestHeaders.requestContextAppIdFormat = \"appId=cid-v1:\";\n        /**\n         * Request-Id header\n         */\n        RequestHeaders.requestIdHeader = \"Request-Id\";\n        /**\n         * Sdk-Context header\n         * If this header passed with appId in content then appId will be returned back by the backend.\n         */\n        RequestHeaders.sdkContextHeader = \"Sdk-Context\";\n        /**\n         * String to pass in header for requesting appId back from the backend.\n         */\n        RequestHeaders.sdkContextHeaderAppIdRequest = \"appId\";\n        RequestHeaders.requestContextHeaderLowerCase = \"request-context\";\n        return RequestHeaders;\n    }());\n    exports.RequestHeaders = RequestHeaders;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RequestResponseHeaders.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\":\n/*!*********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js ***!\n  \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Data_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Data = /** @class */ (function (_super) {\n        __extends(Data, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Data(baseType, data) {\n            var _this = _super.call(this) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                baseType: Enums_1.FieldType.Required,\n                baseData: Enums_1.FieldType.Required\n            };\n            _this.baseType = baseType;\n            _this.baseData = data;\n            return _this;\n        }\n        return Data;\n    }(Data_1.Data));\n    exports.Data = Data;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Data.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/DataPoint.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataPoint_1, Enums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataPoint = /** @class */ (function (_super) {\n        __extends(DataPoint, _super);\n        function DataPoint() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            /**\n             * The data contract for serializing this object.\n             */\n            _this.aiDataContract = {\n                name: Enums_1.FieldType.Required,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Required,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default\n            };\n            return _this;\n        }\n        return DataPoint;\n    }(DataPoint_1.DataPoint));\n    exports.DataPoint = DataPoint;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataPoint.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, applicationinsights_core_js_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var DataSanitizer = /** @class */ (function () {\n        function DataSanitizer() {\n        }\n        DataSanitizer.sanitizeKeyAndAddUniqueness = function (logger, key, map) {\n            var origLength = key.length;\n            var field = DataSanitizer.sanitizeKey(logger, key);\n            // validation truncated the length.  We need to add uniqueness\n            if (field.length !== origLength) {\n                var i = 0;\n                var uniqueField = field;\n                while (map[uniqueField] !== undefined) {\n                    i++;\n                    uniqueField = field.substring(0, DataSanitizer.MAX_NAME_LENGTH - 3) + DataSanitizer.padNumber(i);\n                }\n                field = uniqueField;\n            }\n            return field;\n        };\n        DataSanitizer.sanitizeKey = function (logger, name) {\n            if (name) {\n                // Remove any leading or trailing whitepace\n                name = Util_1.Util.trim(name.toString());\n                // truncate the string to 150 chars\n                if (name.length > DataSanitizer.MAX_NAME_LENGTH) {\n                    name = name.substring(0, DataSanitizer.MAX_NAME_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.NameTooLong, \"name is too long.  It has been truncated to \" + DataSanitizer.MAX_NAME_LENGTH + \" characters.\", { name: name }, true);\n                }\n            }\n            return name;\n        };\n        DataSanitizer.sanitizeString = function (logger, value, maxLength) {\n            if (maxLength === void 0) { maxLength = DataSanitizer.MAX_STRING_LENGTH; }\n            if (value) {\n                maxLength = maxLength ? maxLength : DataSanitizer.MAX_STRING_LENGTH; // in case default parameters dont work\n                value = Util_1.Util.trim(value);\n                if (value.toString().length > maxLength) {\n                    value = value.toString().substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.StringValueTooLong, \"string value is too long. It has been truncated to \" + maxLength + \" characters.\", { value: value }, true);\n                }\n            }\n            return value;\n        };\n        DataSanitizer.sanitizeUrl = function (logger, url) {\n            return DataSanitizer.sanitizeInput(logger, url, DataSanitizer.MAX_URL_LENGTH, applicationinsights_core_js_1._InternalMessageId.UrlTooLong);\n        };\n        DataSanitizer.sanitizeMessage = function (logger, message) {\n            if (message) {\n                if (message.length > DataSanitizer.MAX_MESSAGE_LENGTH) {\n                    message = message.substring(0, DataSanitizer.MAX_MESSAGE_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.MessageTruncated, \"message is too long, it has been truncated to \" + DataSanitizer.MAX_MESSAGE_LENGTH + \" characters.\", { message: message }, true);\n                }\n            }\n            return message;\n        };\n        DataSanitizer.sanitizeException = function (logger, exception) {\n            if (exception) {\n                if (exception.length > DataSanitizer.MAX_EXCEPTION_LENGTH) {\n                    exception = exception.substring(0, DataSanitizer.MAX_EXCEPTION_LENGTH);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ExceptionTruncated, \"exception is too long, it has been truncated to \" + DataSanitizer.MAX_EXCEPTION_LENGTH + \" characters.\", { exception: exception }, true);\n                }\n            }\n            return exception;\n        };\n        DataSanitizer.sanitizeProperties = function (logger, properties) {\n            if (properties) {\n                var tempProps = {};\n                for (var prop in properties) {\n                    var value = DataSanitizer.sanitizeString(logger, properties[prop], DataSanitizer.MAX_PROPERTY_LENGTH);\n                    prop = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, prop, tempProps);\n                    tempProps[prop] = value;\n                }\n                properties = tempProps;\n            }\n            return properties;\n        };\n        DataSanitizer.sanitizeMeasurements = function (logger, measurements) {\n            if (measurements) {\n                var tempMeasurements = {};\n                for (var measure in measurements) {\n                    var value = measurements[measure];\n                    measure = DataSanitizer.sanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements);\n                    tempMeasurements[measure] = value;\n                }\n                measurements = tempMeasurements;\n            }\n            return measurements;\n        };\n        DataSanitizer.sanitizeId = function (logger, id) {\n            return id ? DataSanitizer.sanitizeInput(logger, id, DataSanitizer.MAX_ID_LENGTH, applicationinsights_core_js_1._InternalMessageId.IdTooLong).toString() : id;\n        };\n        DataSanitizer.sanitizeInput = function (logger, input, maxLength, _msgId) {\n            if (input) {\n                input = Util_1.Util.trim(input);\n                if (input.length > maxLength) {\n                    input = input.substring(0, maxLength);\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, _msgId, \"input is too long, it has been truncated to \" + maxLength + \" characters.\", { data: input }, true);\n                }\n            }\n            return input;\n        };\n        DataSanitizer.padNumber = function (num) {\n            var s = \"00\" + num;\n            return s.substr(s.length - 3);\n        };\n        /**\n        * Max length allowed for custom names.\n        */\n        DataSanitizer.MAX_NAME_LENGTH = 150;\n        /**\n         * Max length allowed for Id field in page views.\n         */\n        DataSanitizer.MAX_ID_LENGTH = 128;\n        /**\n         * Max length allowed for custom values.\n         */\n        DataSanitizer.MAX_PROPERTY_LENGTH = 8192;\n        /**\n         * Max length allowed for names\n         */\n        DataSanitizer.MAX_STRING_LENGTH = 1024;\n        /**\n         * Max length allowed for url.\n         */\n        DataSanitizer.MAX_URL_LENGTH = 2048;\n        /**\n         * Max length allowed for messages.\n         */\n        DataSanitizer.MAX_MESSAGE_LENGTH = 32768;\n        /**\n         * Max length allowed for exceptions.\n         */\n        DataSanitizer.MAX_EXCEPTION_LENGTH = 32768;\n        return DataSanitizer;\n    }());\n    exports.DataSanitizer = DataSanitizer;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DataSanitizer.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\":\n/*!*************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js ***!\n  \\*************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../../Interfaces/Contracts/Generated/Envelope */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Envelope.js\"), __webpack_require__(/*! ./DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Envelope_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Envelope = /** @class */ (function (_super) {\n        __extends(Envelope, _super);\n        /**\n         * Constructs a new instance of telemetry data.\n         */\n        function Envelope(logger, data, name) {\n            var _this = _super.call(this) || this;\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.data = data;\n            _this.time = Util_1.Util.toISOStringForIE8(new Date());\n            _this.aiDataContract = {\n                time: Enums_1.FieldType.Required,\n                iKey: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                sampleRate: function () {\n                    return (_this.sampleRate == 100) ? Enums_1.FieldType.Hidden : Enums_1.FieldType.Required;\n                },\n                tags: Enums_1.FieldType.Required,\n                data: Enums_1.FieldType.Required\n            };\n            return _this;\n        }\n        return Envelope;\n    }(Envelope_1.Envelope));\n    exports.Envelope = Envelope;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Envelope.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Event.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/EventData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/EventData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Event = /** @class */ (function (_super) {\n        __extends(Event, _super);\n        /**\n         * Constructs a new instance of the EventTelemetry object\n         */\n        function Event(logger, name, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        Event.envelopeType = \"Microsoft.ApplicationInsights.{0}.Event\";\n        Event.dataType = \"EventData\";\n        return Event;\n    }(EventData_1.EventData));\n    exports.Event = Event;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Event.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\":\n/*!*******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js ***!\n  \\*******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/StackFrame */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/StackFrame.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionData.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/ExceptionDetails */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ExceptionDetails.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, StackFrame_1, ExceptionData_1, ExceptionDetails_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Exception = /** @class */ (function (_super) {\n        __extends(Exception, _super);\n        /**\n        * Constructs a new isntance of the ExceptionTelemetry object\n        */\n        function Exception(logger, exception, properties, measurements, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                exceptions: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            _this.exceptions = [new _ExceptionDetails(logger, exception)];\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        /**\n        * Creates a simple exception with 1 stack frame. Useful for manual constracting of exception.\n        */\n        Exception.CreateSimpleException = function (message, typeName, assembly, fileName, details, line) {\n            return {\n                exceptions: [\n                    {\n                        hasFullStack: true,\n                        message: message,\n                        stack: details,\n                        typeName: typeName\n                    }\n                ]\n            };\n        };\n        Exception.envelopeType = \"Microsoft.ApplicationInsights.{0}.Exception\";\n        Exception.dataType = \"ExceptionData\";\n        return Exception;\n    }(ExceptionData_1.ExceptionData));\n    exports.Exception = Exception;\n    var _ExceptionDetails = /** @class */ (function (_super) {\n        __extends(_ExceptionDetails, _super);\n        function _ExceptionDetails(logger, exception) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Default,\n                outerId: Enums_1.FieldType.Default,\n                typeName: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                hasFullStack: Enums_1.FieldType.Default,\n                stack: Enums_1.FieldType.Default,\n                parsedStack: Enums_1.FieldType.Array\n            };\n            _this.typeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, exception.name) || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, exception.message) || Util_1.Util.NotSpecified;\n            var stack = exception[\"stack\"];\n            _this.parsedStack = _this.parseStack(stack);\n            _this.stack = DataSanitizer_1.DataSanitizer.sanitizeException(logger, stack);\n            _this.hasFullStack = Util_1.Util.isArray(_this.parsedStack) && _this.parsedStack.length > 0;\n            return _this;\n        }\n        _ExceptionDetails.prototype.parseStack = function (stack) {\n            var parsedStack = undefined;\n            if (typeof stack === \"string\") {\n                var frames = stack.split('\\n');\n                parsedStack = [];\n                var level = 0;\n                var totalSizeInBytes = 0;\n                for (var i = 0; i <= frames.length; i++) {\n                    var frame = frames[i];\n                    if (_StackFrame.regex.test(frame)) {\n                        var parsedFrame = new _StackFrame(frames[i], level++);\n                        totalSizeInBytes += parsedFrame.sizeInBytes;\n                        parsedStack.push(parsedFrame);\n                    }\n                }\n                // DP Constraint - exception parsed stack must be < 32KB\n                // remove frames from the middle to meet the threshold\n                var exceptionParsedStackThreshold = 32 * 1024;\n                if (totalSizeInBytes > exceptionParsedStackThreshold) {\n                    var left = 0;\n                    var right = parsedStack.length - 1;\n                    var size = 0;\n                    var acceptedLeft = left;\n                    var acceptedRight = right;\n                    while (left < right) {\n                        // check size\n                        var lSize = parsedStack[left].sizeInBytes;\n                        var rSize = parsedStack[right].sizeInBytes;\n                        size += lSize + rSize;\n                        if (size > exceptionParsedStackThreshold) {\n                            // remove extra frames from the middle\n                            var howMany = acceptedRight - acceptedLeft + 1;\n                            parsedStack.splice(acceptedLeft, howMany);\n                            break;\n                        }\n                        // update pointers\n                        acceptedLeft = left;\n                        acceptedRight = right;\n                        left++;\n                        right--;\n                    }\n                }\n            }\n            return parsedStack;\n        };\n        return _ExceptionDetails;\n    }(ExceptionDetails_1.ExceptionDetails));\n    var _StackFrame = /** @class */ (function (_super) {\n        __extends(_StackFrame, _super);\n        function _StackFrame(frame, level) {\n            var _this = _super.call(this) || this;\n            _this.sizeInBytes = 0;\n            _this.aiDataContract = {\n                level: Enums_1.FieldType.Required,\n                method: Enums_1.FieldType.Required,\n                assembly: Enums_1.FieldType.Default,\n                fileName: Enums_1.FieldType.Default,\n                line: Enums_1.FieldType.Default\n            };\n            _this.level = level;\n            _this.method = \"<no_method>\";\n            _this.assembly = Util_1.Util.trim(frame);\n            var matches = frame.match(_StackFrame.regex);\n            if (matches && matches.length >= 5) {\n                _this.method = Util_1.Util.trim(matches[2]) || _this.method;\n                _this.fileName = Util_1.Util.trim(matches[4]);\n                _this.line = parseInt(matches[5]) || 0;\n            }\n            _this.sizeInBytes += _this.method.length;\n            _this.sizeInBytes += _this.fileName.length;\n            _this.sizeInBytes += _this.assembly.length;\n            // todo: these might need to be removed depending on how the back-end settles on their size calculation\n            _this.sizeInBytes += _StackFrame.baseSize;\n            _this.sizeInBytes += _this.level.toString().length;\n            _this.sizeInBytes += _this.line.toString().length;\n            return _this;\n        }\n        // regex to match stack frames from ie/chrome/ff\n        // methodName=$2, fileName=$4, lineNo=$5, column=$6\n        _StackFrame.regex = /^([\\s]+at)?(.*?)(\\@|\\s\\(|\\s)([^\\(\\@\\n]+):([0-9]+):([0-9]+)(\\)?)$/;\n        _StackFrame.baseSize = 58; //'{\"method\":\"\",\"level\":,\"assembly\":\"\",\"fileName\":\"\",\"line\":}'.length\n        return _StackFrame;\n    }(StackFrame_1.StackFrame));\n    exports._StackFrame = _StackFrame;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Exception.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js ***!\n  \\****************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MetricData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MetricData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataPoint */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataPoint.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MetricData_1, DataSanitizer_1, Enums_1, DataPoint_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Metric = /** @class */ (function (_super) {\n        __extends(Metric, _super);\n        /**\n         * Constructs a new instance of the MetricTelemetry object\n         */\n        function Metric(logger, name, value, count, min, max, properties) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                metrics: Enums_1.FieldType.Required,\n                properties: Enums_1.FieldType.Default\n            };\n            var dataPoint = new DataPoint_1.DataPoint();\n            dataPoint.count = count > 0 ? count : undefined;\n            dataPoint.max = isNaN(max) || max === null ? undefined : max;\n            dataPoint.min = isNaN(min) || min === null ? undefined : min;\n            dataPoint.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            dataPoint.value = value;\n            _this.metrics = [dataPoint];\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            return _this;\n        }\n        Metric.envelopeType = \"Microsoft.ApplicationInsights.{0}.Metric\";\n        Metric.dataType = \"MetricData\";\n        return Metric;\n    }(MetricData_1.MetricData));\n    exports.Metric = Metric;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Metric.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js ***!\n  \\******************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageView = /** @class */ (function (_super) {\n        __extends(PageView, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageView(logger, name, url, durationMs, properties, measurements, id) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                id: Enums_1.FieldType.Default,\n            };\n            _this.id = DataSanitizer_1.DataSanitizer.sanitizeId(logger, id);\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            if (!isNaN(durationMs)) {\n                _this.duration = Util_1.Util.msToTimeSpan(durationMs);\n            }\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        PageView.envelopeType = \"Microsoft.ApplicationInsights.{0}.Pageview\";\n        PageView.dataType = \"PageviewData\";\n        return PageView;\n    }(PageViewData_1.PageViewData));\n    exports.PageView = PageView;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageView.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\":\n/*!*****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js ***!\n  \\*****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/PageViewPerfData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewPerfData.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, PageViewPerfData_1, Enums_1, DataSanitizer_1, Util_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var PageViewPerformance = /** @class */ (function (_super) {\n        __extends(PageViewPerformance, _super);\n        /**\n         * Constructs a new instance of the PageEventTelemetry object\n         */\n        function PageViewPerformance(logger, name, url, unused, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                url: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                perfTotal: Enums_1.FieldType.Default,\n                networkConnect: Enums_1.FieldType.Default,\n                sentRequest: Enums_1.FieldType.Default,\n                receivedResponse: Enums_1.FieldType.Default,\n                domProcessing: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default\n            };\n            _this.isValid = false;\n            /*\n             * http://www.w3.org/TR/navigation-timing/#processing-model\n             *  |-navigationStart\n             *  |             |-connectEnd\n             *  |             ||-requestStart\n             *  |             ||             |-responseStart\n             *  |             ||             |              |-responseEnd\n             *  |             ||             |              |\n             *  |             ||             |              |         |-loadEventEnd\n             *  |---network---||---request---|---response---|---dom---|\n             *  |--------------------------total----------------------|\n             */\n            var timing = PageViewPerformance.getPerformanceTiming();\n            if (timing) {\n                var total = PageViewPerformance.getDuration(timing.navigationStart, timing.loadEventEnd);\n                var network = PageViewPerformance.getDuration(timing.navigationStart, timing.connectEnd);\n                var request = PageViewPerformance.getDuration(timing.requestStart, timing.responseStart);\n                var response = PageViewPerformance.getDuration(timing.responseStart, timing.responseEnd);\n                var dom = PageViewPerformance.getDuration(timing.responseEnd, timing.loadEventEnd);\n                if (total == 0) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ErrorPVCalc, \"error calculating page view performance.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (!PageViewPerformance.shouldCollectDuration(total, network, request, response, dom)) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.InvalidDurationValue, \"Invalid page load duration value. Browser perf data won't be sent.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else if (total < Math.floor(network) + Math.floor(request) + Math.floor(response) + Math.floor(dom)) {\n                    // some browsers may report individual components incorrectly so that the sum of the parts will be bigger than total PLT\n                    // in this case, don't report client performance from this page\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.ClientPerformanceMathError, \"client performance math error.\", { total: total, network: network, request: request, response: response, dom: dom });\n                }\n                else {\n                    _this.durationMs = total;\n                    // convert to timespans\n                    _this.perfTotal = _this.duration = Util_1.Util.msToTimeSpan(total);\n                    _this.networkConnect = Util_1.Util.msToTimeSpan(network);\n                    _this.sentRequest = Util_1.Util.msToTimeSpan(request);\n                    _this.receivedResponse = Util_1.Util.msToTimeSpan(response);\n                    _this.domProcessing = Util_1.Util.msToTimeSpan(dom);\n                    _this.isValid = true;\n                }\n            }\n            _this.url = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, url);\n            _this.name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, name) || Util_1.Util.NotSpecified;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        /**\n         * Indicates whether this instance of PageViewPerformance is valid and should be sent\n         */\n        PageViewPerformance.prototype.getIsValid = function () {\n            return this.isValid;\n        };\n        /**\n        * Gets the total duration (PLT) in milliseconds. Check getIsValid() before using this method.\n        */\n        PageViewPerformance.prototype.getDurationMs = function () {\n            return this.durationMs;\n        };\n        PageViewPerformance.getPerformanceTiming = function () {\n            if (PageViewPerformance.isPerformanceTimingSupported()) {\n                return window.performance.timing;\n            }\n            return null;\n        };\n        /**\n        * Returns true is window performance timing API is supported, false otherwise.\n        */\n        PageViewPerformance.isPerformanceTimingSupported = function () {\n            return typeof window != \"undefined\" && window.performance && window.performance.timing;\n        };\n        /**\n         * As page loads different parts of performance timing numbers get set. When all of them are set we can report it.\n         * Returns true if ready, false otherwise.\n         */\n        PageViewPerformance.isPerformanceTimingDataReady = function () {\n            var timing = window.performance.timing;\n            return timing.domainLookupStart > 0\n                && timing.navigationStart > 0\n                && timing.responseStart > 0\n                && timing.requestStart > 0\n                && timing.loadEventEnd > 0\n                && timing.responseEnd > 0\n                && timing.connectEnd > 0\n                && timing.domLoading > 0;\n        };\n        PageViewPerformance.getDuration = function (start, end) {\n            var duration = undefined;\n            if (!(isNaN(start) || isNaN(end))) {\n                duration = Math.max(end - start, 0);\n            }\n            return duration;\n        };\n        /**\n         * This method tells if given durations should be excluded from collection.\n         */\n        PageViewPerformance.shouldCollectDuration = function () {\n            var durations = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                durations[_i] = arguments[_i];\n            }\n            // a full list of Google crawlers user agent strings - https://support.google.com/webmasters/answer/1061943?hl=en\n            var botAgentNames = ['googlebot', 'adsbot-google', 'apis-google', 'mediapartners-google'];\n            var userAgent = navigator.userAgent;\n            var isGoogleBot = false;\n            if (userAgent) {\n                for (var i_1 = 0; i_1 < botAgentNames.length; i_1++) {\n                    isGoogleBot = isGoogleBot || userAgent.toLowerCase().indexOf(botAgentNames[i_1]) !== -1;\n                }\n            }\n            if (isGoogleBot) {\n                // Don't report durations for GoogleBot, it is returning invalid values in performance.timing API. \n                return false;\n            }\n            else {\n                // for other page views, don't report if it's outside of a reasonable range\n                for (var i = 0; i < durations.length; i++) {\n                    if (durations[i] >= PageViewPerformance.MAX_DURATION_ALLOWED) {\n                        return false;\n                    }\n                }\n            }\n            return true;\n        };\n        PageViewPerformance.envelopeType = \"Microsoft.ApplicationInsights.{0}.PageviewPerformance\";\n        PageViewPerformance.dataType = \"PageviewPerformanceData\";\n        PageViewPerformance.MAX_DURATION_ALLOWED = 3600000; // 1h\n        return PageViewPerformance;\n    }(PageViewPerfData_1.PageViewPerfData));\n    exports.PageViewPerformance = PageViewPerformance;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=PageViewPerformance.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ../Interfaces/Contracts/Generated/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/RemoteDependencyData.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, DataSanitizer_1, Enums_1, Util_1, Util_2, RemoteDependencyData_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var RemoteDependencyData = /** @class */ (function (_super) {\n        __extends(RemoteDependencyData, _super);\n        /**\n         * Constructs a new instance of the RemoteDependencyData object\n         */\n        function RemoteDependencyData(logger, id, absoluteUrl, commandName, value, success, resultCode, method, properties, measurements) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                id: Enums_1.FieldType.Required,\n                ver: Enums_1.FieldType.Required,\n                name: Enums_1.FieldType.Default,\n                resultCode: Enums_1.FieldType.Default,\n                duration: Enums_1.FieldType.Default,\n                success: Enums_1.FieldType.Default,\n                data: Enums_1.FieldType.Default,\n                target: Enums_1.FieldType.Default,\n                type: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default,\n                measurements: Enums_1.FieldType.Default,\n                kind: Enums_1.FieldType.Default,\n                value: Enums_1.FieldType.Default,\n                count: Enums_1.FieldType.Default,\n                min: Enums_1.FieldType.Default,\n                max: Enums_1.FieldType.Default,\n                stdDev: Enums_1.FieldType.Default,\n                dependencyKind: Enums_1.FieldType.Default,\n                dependencySource: Enums_1.FieldType.Default,\n                commandName: Enums_1.FieldType.Default,\n                dependencyTypeName: Enums_1.FieldType.Default,\n            };\n            _this.id = id;\n            _this.duration = Util_1.Util.msToTimeSpan(value);\n            _this.success = success;\n            _this.resultCode = resultCode + \"\";\n            _this.type = \"Ajax\";\n            _this.data = DataSanitizer_1.DataSanitizer.sanitizeUrl(logger, commandName);\n            var dependencyFields = Util_2.AjaxHelper.ParseDependencyPath(logger, absoluteUrl, method, commandName);\n            _this.target = dependencyFields.target;\n            _this.name = dependencyFields.name;\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            _this.measurements = DataSanitizer_1.DataSanitizer.sanitizeMeasurements(logger, measurements);\n            return _this;\n        }\n        RemoteDependencyData.envelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n        RemoteDependencyData.dataType = \"RemoteDependencyData\";\n        return RemoteDependencyData;\n    }(RemoteDependencyData_1.RemoteDependencyData));\n    exports.RemoteDependencyData = RemoteDependencyData;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=RemoteDependencyData.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js ***!\n  \\***************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __extends = (this && this.__extends) || (function () {\n    var extendStatics = Object.setPrototypeOf ||\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../Interfaces/Contracts/Generated/MessageData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/MessageData.js\"), __webpack_require__(/*! ./Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ../Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ../Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, MessageData_1, DataSanitizer_1, Enums_1, Util_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Trace = /** @class */ (function (_super) {\n        __extends(Trace, _super);\n        /**\n         * Constructs a new instance of the TraceTelemetry object\n         */\n        function Trace(logger, message, properties, severityLevel) {\n            var _this = _super.call(this) || this;\n            _this.aiDataContract = {\n                ver: Enums_1.FieldType.Required,\n                message: Enums_1.FieldType.Required,\n                severityLevel: Enums_1.FieldType.Default,\n                properties: Enums_1.FieldType.Default\n            };\n            message = message || Util_1.Util.NotSpecified;\n            _this.message = DataSanitizer_1.DataSanitizer.sanitizeMessage(logger, message);\n            _this.properties = DataSanitizer_1.DataSanitizer.sanitizeProperties(logger, properties);\n            if (severityLevel) {\n                _this.severityLevel = severityLevel;\n            }\n            return _this;\n        }\n        Trace.envelopeType = \"Microsoft.ApplicationInsights.{0}.Message\";\n        Trace.dataType = \"MessageData\";\n        return Trace;\n    }(MessageData_1.MessageData));\n    exports.Trace = Trace;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Trace.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\":\n/*!********************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js ***!\n  \\********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, DataSanitizer_1, applicationinsights_core_js_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var TelemetryItemCreator = /** @class */ (function () {\n        function TelemetryItemCreator() {\n        }\n        /**\n         * Create a telemetry item that the 1DS channel understands\n         * @param item domain specific properties; part B\n         * @param baseType telemetry item type. ie PageViewData\n         * @param envelopeName name of the envelope. ie Microsoft.ApplicationInsights.<instrumentation key>.PageView\n         * @param customProperties user defined custom properties; part C\n         * @param systemProperties system properties that are added to the context; part A\n         * @returns ITelemetryItem that is sent to channel\n         */\n        TelemetryItemCreator.create = function (item, baseType, envelopeName, logger, customProperties, systemProperties) {\n            envelopeName = DataSanitizer_1.DataSanitizer.sanitizeString(logger, envelopeName) || Util_1.Util.NotSpecified;\n            if (applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(item) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(baseType) ||\n                applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(envelopeName)) {\n                throw Error(\"Input doesn't contain all required fields\");\n            }\n            var telemetryItem = {\n                name: envelopeName,\n                timestamp: new Date(),\n                instrumentationKey: \"\",\n                ctx: systemProperties ? systemProperties : {},\n                tags: [],\n                data: {},\n                baseType: baseType,\n                baseData: item\n            };\n            // Part C\n            if (!applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(customProperties)) {\n                for (var prop in customProperties) {\n                    if (customProperties.hasOwnProperty(prop)) {\n                        telemetryItem.data[prop] = customProperties[prop];\n                    }\n                }\n            }\n            return telemetryItem;\n        };\n        return TelemetryItemCreator;\n    }());\n    exports.TelemetryItemCreator = TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=TelemetryItemCreator.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/Util.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/Util.js ***!\n  \\****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! applicationinsights-core-js */ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Enums_1, applicationinsights_core_js_1, RequestResponseHeaders_1, DataSanitizer_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var Util = /** @class */ (function () {\n        function Util() {\n        }\n        /*\n         * Force the SDK not to use local and session storage\n        */\n        Util.disableStorage = function () {\n            Util._canUseLocalStorage = false;\n            Util._canUseSessionStorage = false;\n        };\n        /**\n         * Gets the localStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getLocalStorageObject = function () {\n            if (Util.canUseLocalStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return null;\n        };\n        /**\n         * Tests storage object (localStorage or sessionStorage) to verify that it is usable\n         * More details here: https://mathiasbynens.be/notes/localstorage-pattern\n         * @param storageType Type of storage\n         * @return {Storage} Returns storage object verified that it is usable\n         */\n        Util._getVerifiedStorageObject = function (storageType) {\n            var storage = null;\n            var fail;\n            var uid;\n            try {\n                uid = new Date;\n                storage = storageType === Enums_1.StorageType.LocalStorage ? window.localStorage : window.sessionStorage;\n                storage.setItem(uid, uid);\n                fail = storage.getItem(uid) != uid;\n                storage.removeItem(uid);\n                if (fail) {\n                    storage = null;\n                }\n            }\n            catch (exception) {\n                storage = null;\n            }\n            return storage;\n        };\n        /**\n         *  Checks if endpoint URL is application insights internal injestion service URL.\n         *\n         *  @param endpointUrl Endpoint URL to check.\n         *  @returns {boolean} True if if endpoint URL is application insights internal injestion service URL.\n         */\n        Util.isInternalApplicationInsightsEndpoint = function (endpointUrl) {\n            return Util._internalEndpoints.indexOf(endpointUrl.toLowerCase()) !== -1;\n        };\n        /**\n         *  Check if the browser supports local storage.\n         *\n         *  @returns {boolean} True if local storage is supported.\n         */\n        Util.canUseLocalStorage = function () {\n            if (Util._canUseLocalStorage === undefined) {\n                Util._canUseLocalStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.LocalStorage);\n            }\n            return Util._canUseLocalStorage;\n        };\n        /**\n         *  Get an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadLocalStorage, \"Browser failed read of local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's local storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setStorage = function (logger, name, data) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteLocalStorage, \"Browser failed write to local storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's local storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeStorage = function (logger, name) {\n            var storage = Util._getLocalStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseLocalStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromLocalStorage, \"Browser failed removal of local storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         * Gets the sessionStorage object if available\n         * @return {Storage} - Returns the storage object if available else returns null\n         */\n        Util._getSessionStorageObject = function () {\n            if (Util.canUseSessionStorage()) {\n                return Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return null;\n        };\n        /**\n         *  Check if the browser supports session storage.\n         *\n         *  @returns {boolean} True if session storage is supported.\n         */\n        Util.canUseSessionStorage = function () {\n            if (Util._canUseSessionStorage === undefined) {\n                Util._canUseSessionStorage = !!Util._getVerifiedStorageObject(Enums_1.StorageType.SessionStorage);\n            }\n            return Util._canUseSessionStorage;\n        };\n        /**\n         *  Gets the list of session storage keys\n         *\n         *  @returns {string[]} List of session storage keys\n         */\n        Util.getSessionStorageKeys = function () {\n            var keys = [];\n            if (Util.canUseSessionStorage()) {\n                for (var key in window.sessionStorage) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n        /**\n         *  Get an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to get from storage\n         *  @returns {string} The contents of the storage object with the given name. Null if storage is not supported.\n         */\n        Util.getSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    return storage.getItem(name);\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotReadSessionStorage, \"Browser failed read of session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return null;\n        };\n        /**\n         *  Set the contents of an object in the browser's session storage\n         *\n         *  @param {string} name - the name of the object to set in storage\n         *  @param {string} data - the contents of the object to set in storage\n         *  @returns {boolean} True if the storage object could be written.\n         */\n        Util.setSessionStorage = function (logger, name, data) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.setItem(name, data);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserCannotWriteSessionStorage, \"Browser failed write to session storage. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /**\n         *  Remove an object from the browser's session storage\n         *\n         *  @param {string} name - the name of the object to remove from storage\n         *  @returns {boolean} True if the storage object could be removed.\n         */\n        Util.removeSessionStorage = function (logger, name) {\n            var storage = Util._getSessionStorageObject();\n            if (storage !== null) {\n                try {\n                    storage.removeItem(name);\n                    return true;\n                }\n                catch (e) {\n                    Util._canUseSessionStorage = false;\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.BrowserFailedRemovalFromSessionStorage, \"Browser failed removal of session storage item. \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n            }\n            return false;\n        };\n        /*\n         * Force the SDK not to store and read any data from cookies\n         */\n        Util.disableCookies = function () {\n            Util._canUseCookies = false;\n        };\n        /*\n         * helper method to tell if document.cookie object is available\n         */\n        Util.canUseCookies = function (logger) {\n            if (Util._canUseCookies === undefined) {\n                Util._canUseCookies = false;\n                try {\n                    Util._canUseCookies = Util.document.cookie !== undefined;\n                }\n                catch (e) {\n                    logger.throwInternal(applicationinsights_core_js_1.LoggingSeverity.WARNING, applicationinsights_core_js_1._InternalMessageId.CannotAccessCookie, \"Cannot access document.cookie - \" + Util.getExceptionName(e), { exception: Util.dump(e) });\n                }\n                ;\n            }\n            return Util._canUseCookies;\n        };\n        /**\n         * helper method to set userId and sessionId cookie\n         */\n        Util.setCookie = function (logger, name, value, domain) {\n            var domainAttrib = \"\";\n            var secureAttrib = \"\";\n            if (domain) {\n                domainAttrib = \";domain=\" + domain;\n            }\n            if (Util.document.location && Util.document.location.protocol === \"https:\") {\n                secureAttrib = \";secure\";\n            }\n            if (Util.canUseCookies(logger)) {\n                Util.document.cookie = name + \"=\" + value + domainAttrib + \";path=/\" + secureAttrib;\n            }\n        };\n        Util.stringToBoolOrDefault = function (str, defaultValue) {\n            if (defaultValue === void 0) { defaultValue = false; }\n            if (str === undefined || str === null) {\n                return defaultValue;\n            }\n            return str.toString().toLowerCase() === \"true\";\n        };\n        /**\n         * helper method to access userId and sessionId cookie\n         */\n        Util.getCookie = function (logger, name) {\n            if (!Util.canUseCookies(logger)) {\n                return;\n            }\n            var value = \"\";\n            if (name && name.length) {\n                var cookieName = name + \"=\";\n                var cookies = Util.document.cookie.split(\";\");\n                for (var i = 0; i < cookies.length; i++) {\n                    var cookie = cookies[i];\n                    cookie = Util.trim(cookie);\n                    if (cookie && cookie.indexOf(cookieName) === 0) {\n                        value = cookie.substring(cookieName.length, cookies[i].length);\n                        break;\n                    }\n                }\n            }\n            return value;\n        };\n        /**\n         * Deletes a cookie by setting it's expiration time in the past.\n         * @param name - The name of the cookie to delete.\n         */\n        Util.deleteCookie = function (logger, name) {\n            if (Util.canUseCookies(logger)) {\n                // Setting the expiration date in the past immediately removes the cookie\n                Util.document.cookie = name + \"=;path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;\";\n            }\n        };\n        /**\n         * helper method to trim strings (IE8 does not implement String.prototype.trim)\n         */\n        Util.trim = function (str) {\n            if (typeof str !== \"string\")\n                return str;\n            return str.replace(/^\\s+|\\s+$/g, \"\");\n        };\n        /**\n         * generate random id string\n         */\n        Util.newId = function () {\n            var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n            var result = \"\";\n            // tslint:disable-next-line:insecure-random\n            var random = Math.random() * 1073741824; //5 symbols in base64, almost maxint\n            while (random > 0) {\n                var char = base64chars.charAt(random % 64);\n                result += char;\n                random = Math.floor(random / 64);\n            }\n            return result;\n        };\n        /**\n         * Check if an object is of type Array\n         */\n        Util.isArray = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n        /**\n         * Check if an object is of type Error\n         */\n        Util.isError = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Error]\";\n        };\n        /**\n         * Check if an object is of type Date\n         */\n        Util.isDate = function (obj) {\n            return Object.prototype.toString.call(obj) === \"[object Date]\";\n        };\n        /**\n         * Convert a date to I.S.O. format in IE8\n         */\n        Util.toISOStringForIE8 = function (date) {\n            if (Util.isDate(date)) {\n                if (Date.prototype.toISOString) {\n                    return date.toISOString();\n                }\n                else {\n                    var pad = function (num) {\n                        var r = String(num);\n                        if (r.length === 1) {\n                            r = \"0\" + r;\n                        }\n                        return r;\n                    };\n                    return date.getUTCFullYear()\n                        + \"-\" + pad(date.getUTCMonth() + 1)\n                        + \"-\" + pad(date.getUTCDate())\n                        + \"T\" + pad(date.getUTCHours())\n                        + \":\" + pad(date.getUTCMinutes())\n                        + \":\" + pad(date.getUTCSeconds())\n                        + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n                        + \"Z\";\n                }\n            }\n        };\n        /**\n         * Gets IE version if we are running on IE, or null otherwise\n         */\n        Util.getIEVersion = function (userAgentStr) {\n            if (userAgentStr === void 0) { userAgentStr = null; }\n            var myNav = userAgentStr ? userAgentStr.toLowerCase() : navigator.userAgent.toLowerCase();\n            return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : null;\n        };\n        /**\n         * Convert ms to c# time span format\n         */\n        Util.msToTimeSpan = function (totalms) {\n            if (isNaN(totalms) || totalms < 0) {\n                totalms = 0;\n            }\n            totalms = Math.round(totalms);\n            var ms = \"\" + totalms % 1000;\n            var sec = \"\" + Math.floor(totalms / 1000) % 60;\n            var min = \"\" + Math.floor(totalms / (1000 * 60)) % 60;\n            var hour = \"\" + Math.floor(totalms / (1000 * 60 * 60)) % 24;\n            var days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n            ms = ms.length === 1 ? \"00\" + ms : ms.length === 2 ? \"0\" + ms : ms;\n            sec = sec.length < 2 ? \"0\" + sec : sec;\n            min = min.length < 2 ? \"0\" + min : min;\n            hour = hour.length < 2 ? \"0\" + hour : hour;\n            return (days > 0 ? days + \".\" : \"\") + hour + \":\" + min + \":\" + sec + \".\" + ms;\n        };\n        /**\n        * Checks if error has no meaningful data inside. Ususally such errors are received by window.onerror when error\n        * happens in a script from other domain (cross origin, CORS).\n        */\n        Util.isCrossOriginError = function (message, url, lineNumber, columnNumber, error) {\n            return (message === \"Script error.\" || message === \"Script error\") && !error;\n        };\n        /**\n        * Returns string representation of an object suitable for diagnostics logging.\n        */\n        Util.dump = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            var propertyValueDump = JSON.stringify(object);\n            if (objectTypeDump === \"[object Error]\") {\n                propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n            }\n            return objectTypeDump + propertyValueDump;\n        };\n        /**\n        * Returns the name of object if it's an Error. Otherwise, returns empty string.\n        */\n        Util.getExceptionName = function (object) {\n            var objectTypeDump = Object.prototype.toString.call(object);\n            if (objectTypeDump === \"[object Error]\") {\n                return object.name;\n            }\n            return \"\";\n        };\n        /**\n         * Adds an event handler for the specified event\n         * @param eventName {string} - The name of the event\n         * @param callback {any} - The callback function that needs to be executed for the given event\n         * @return {boolean} - true if the handler was successfully added\n         */\n        Util.addEventHandler = function (eventName, callback) {\n            if (!window || typeof eventName !== 'string' || typeof callback !== 'function') {\n                return false;\n            }\n            // Create verb for the event\n            var verbEventName = 'on' + eventName;\n            // check if addEventListener is available\n            if (window.addEventListener) {\n                window.addEventListener(eventName, callback, false);\n            }\n            else if (window[\"attachEvent\"]) {\n                window[\"attachEvent\"](verbEventName, callback);\n            }\n            else {\n                return false;\n            }\n            return true;\n        };\n        /**\n         * Tells if a browser supports a Beacon API\n         */\n        Util.IsBeaconApiSupported = function () {\n            return ('sendBeacon' in navigator && navigator.sendBeacon);\n        };\n        Util.document = typeof document !== \"undefined\" ? document : {};\n        Util._canUseCookies = undefined;\n        Util._canUseLocalStorage = undefined;\n        Util._canUseSessionStorage = undefined;\n        // listing only non-geo specific locations \n        Util._internalEndpoints = [\n            \"https://dc.services.visualstudio.com/v2/track\",\n            \"https://breeze.aimon.applicationinsights.io/v2/track\",\n            \"https://dc-int.services.visualstudio.com/v2/track\"\n        ];\n        Util.NotSpecified = \"not_specified\";\n        return Util;\n    }());\n    exports.Util = Util;\n    var UrlHelper = /** @class */ (function () {\n        function UrlHelper() {\n        }\n        UrlHelper.parseUrl = function (url) {\n            if (!UrlHelper.htmlAnchorElement) {\n                UrlHelper.htmlAnchorElement = !!UrlHelper.document.createElement ? UrlHelper.document.createElement('a') : {};\n            }\n            UrlHelper.htmlAnchorElement.href = url;\n            return UrlHelper.htmlAnchorElement;\n        };\n        UrlHelper.getAbsoluteUrl = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.href;\n            }\n            return result;\n        };\n        UrlHelper.getPathName = function (url) {\n            var result;\n            var a = UrlHelper.parseUrl(url);\n            if (a) {\n                result = a.pathname;\n            }\n            return result;\n        };\n        UrlHelper.getCompleteUrl = function (method, absoluteUrl) {\n            if (method) {\n                return method.toUpperCase() + \" \" + absoluteUrl;\n            }\n            else {\n                return absoluteUrl;\n            }\n        };\n        UrlHelper.document = typeof document !== \"undefined\" ? document : {};\n        return UrlHelper;\n    }());\n    exports.UrlHelper = UrlHelper;\n    var CorrelationIdHelper = /** @class */ (function () {\n        function CorrelationIdHelper() {\n        }\n        /**\n        * Checks if a request url is not on a excluded domain list and if it is safe to add correlation headers\n        */\n        CorrelationIdHelper.canIncludeCorrelationHeader = function (config, requestUrl, currentHost) {\n            if (config && config.disableCorrelationHeaders) {\n                return false;\n            }\n            if (!requestUrl) {\n                return false;\n            }\n            var requestHost = UrlHelper.parseUrl(requestUrl).host.toLowerCase();\n            if ((!config || !config.enableCorsCorrelation) && requestHost !== currentHost) {\n                return false;\n            }\n            var excludedDomains = config && config.correlationHeaderExcludedDomains;\n            if (!excludedDomains || excludedDomains.length == 0) {\n                return true;\n            }\n            for (var i = 0; i < excludedDomains.length; i++) {\n                var regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\./g, \"\\.\").replace(/\\*/g, \".*\"));\n                if (regex.test(requestHost)) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        /**\n        * Combines target appId and target role name from response header.\n        */\n        CorrelationIdHelper.getCorrelationContext = function (responseHeader) {\n            if (responseHeader) {\n                var correlationId = CorrelationIdHelper.getCorrelationContextValue(responseHeader, RequestResponseHeaders_1.RequestHeaders.requestContextTargetKey);\n                if (correlationId && correlationId !== CorrelationIdHelper.correlationIdPrefix) {\n                    return correlationId;\n                }\n            }\n        };\n        /**\n        * Gets key from correlation response header\n        */\n        CorrelationIdHelper.getCorrelationContextValue = function (responseHeader, key) {\n            if (responseHeader) {\n                var keyValues = responseHeader.split(\",\");\n                for (var i = 0; i < keyValues.length; ++i) {\n                    var keyValue = keyValues[i].split(\"=\");\n                    if (keyValue.length == 2 && keyValue[0] == key) {\n                        return keyValue[1];\n                    }\n                }\n            }\n        };\n        CorrelationIdHelper.correlationIdPrefix = \"cid-v1:\";\n        return CorrelationIdHelper;\n    }());\n    exports.CorrelationIdHelper = CorrelationIdHelper;\n    var AjaxHelper = /** @class */ (function () {\n        function AjaxHelper() {\n        }\n        AjaxHelper.ParseDependencyPath = function (logger, absoluteUrl, method, pathName) {\n            var target, name;\n            if (absoluteUrl && absoluteUrl.length > 0) {\n                var parsedUrl = UrlHelper.parseUrl(absoluteUrl);\n                target = parsedUrl.host;\n                if (parsedUrl.pathname != null) {\n                    var pathName = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                    if (pathName.charAt(0) !== '/') {\n                        pathName = \"/\" + pathName;\n                    }\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, method ? method + \" \" + pathName : pathName);\n                }\n                else {\n                    name = DataSanitizer_1.DataSanitizer.sanitizeString(logger, absoluteUrl);\n                }\n            }\n            else {\n                target = pathName;\n                name = pathName;\n            }\n            return {\n                target: target,\n                name: name\n            };\n        };\n        return AjaxHelper;\n    }());\n    exports.AjaxHelper = AjaxHelper;\n    /**\n     * A utility class that helps getting time related parameters\n     */\n    var DateTimeUtils = /** @class */ (function () {\n        function DateTimeUtils() {\n        }\n        /**\n         * Get the number of milliseconds since 1970/01/01 in local timezone\n         */\n        DateTimeUtils.Now = (window.performance && window.performance.now && window.performance.timing) ?\n            function () {\n                return window.performance.now() + window.performance.timing.navigationStart;\n            }\n            :\n                function () {\n                    return new Date().getTime();\n                };\n        /**\n         * Gets duration between two timestamps\n         */\n        DateTimeUtils.GetDuration = function (start, end) {\n            var result = null;\n            if (start !== 0 && end !== 0 && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(start) && !applicationinsights_core_js_1.CoreUtils.isNullOrUndefined(end)) {\n                result = end - start;\n            }\n            return result;\n        };\n        return DateTimeUtils;\n    }());\n    exports.DateTimeUtils = DateTimeUtils;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=Util.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-common/bundle/applicationinsights-common.js\":\n/*!**************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-common/bundle/applicationinsights-common.js ***!\n  \\**************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./Util */ \"./node_modules/applicationinsights-common/bundle/Util.js\"), __webpack_require__(/*! ./Enums */ \"./node_modules/applicationinsights-common/bundle/Enums.js\"), __webpack_require__(/*! ./RequestResponseHeaders */ \"./node_modules/applicationinsights-common/bundle/RequestResponseHeaders.js\"), __webpack_require__(/*! ./Constants */ \"./node_modules/applicationinsights-common/bundle/Constants.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Data */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/Base */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/Base.js\"), __webpack_require__(/*! ./Telemetry/Common/Envelope */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Envelope.js\"), __webpack_require__(/*! ./Telemetry/Event */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Event.js\"), __webpack_require__(/*! ./Telemetry/Exception */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Exception.js\"), __webpack_require__(/*! ./Telemetry/Metric */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Metric.js\"), __webpack_require__(/*! ./Telemetry/PageView */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageView.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/PageViewData */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/PageViewData.js\"), __webpack_require__(/*! ./Telemetry/RemoteDependencyData */ \"./node_modules/applicationinsights-common/bundle/Telemetry/RemoteDependencyData.js\"), __webpack_require__(/*! ./Telemetry/Trace */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Trace.js\"), __webpack_require__(/*! ./Telemetry/PageViewPerformance */ \"./node_modules/applicationinsights-common/bundle/Telemetry/PageViewPerformance.js\"), __webpack_require__(/*! ./Telemetry/Common/Data */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/Data.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/SeverityLevel */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/SeverityLevel.js\"), __webpack_require__(/*! ./Interfaces/Contracts/Generated/ContextTagKeys */ \"./node_modules/applicationinsights-common/bundle/Interfaces/Contracts/Generated/ContextTagKeys.js\"), __webpack_require__(/*! ./Telemetry/Common/DataSanitizer */ \"./node_modules/applicationinsights-common/bundle/Telemetry/Common/DataSanitizer.js\"), __webpack_require__(/*! ./TelemetryItemCreator */ \"./node_modules/applicationinsights-common/bundle/TelemetryItemCreator.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Util_1, Enums_1, RequestResponseHeaders_1, Constants_1, Data_1, Base_1, Envelope_1, Event_1, Exception_1, Metric_1, PageView_1, PageViewData_1, RemoteDependencyData_1, Trace_1, PageViewPerformance_1, Data_2, SeverityLevel_1, ContextTagKeys_1, DataSanitizer_1, TelemetryItemCreator_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.Util = Util_1.Util;\n    exports.CorrelationIdHelper = Util_1.CorrelationIdHelper;\n    exports.UrlHelper = Util_1.UrlHelper;\n    exports.DateTimeUtils = Util_1.DateTimeUtils;\n    exports.FieldType = Enums_1.FieldType;\n    exports.RequestHeaders = RequestResponseHeaders_1.RequestHeaders;\n    exports.DisabledPropertyName = Constants_1.DisabledPropertyName;\n    exports.AIData = Data_1.Data;\n    exports.AIBase = Base_1.Base;\n    exports.Envelope = Envelope_1.Envelope;\n    exports.Event = Event_1.Event;\n    exports.Exception = Exception_1.Exception;\n    exports.Metric = Metric_1.Metric;\n    exports.PageView = PageView_1.PageView;\n    exports.PageViewData = PageViewData_1.PageViewData;\n    exports.RemoteDependencyData = RemoteDependencyData_1.RemoteDependencyData;\n    exports.Trace = Trace_1.Trace;\n    exports.PageViewPerformance = PageViewPerformance_1.PageViewPerformance;\n    exports.Data = Data_2.Data;\n    exports.SeverityLevel = SeverityLevel_1.SeverityLevel;\n    exports.ContextTagKeys = ContextTagKeys_1.ContextTagKeys;\n    exports.DataSanitizer = DataSanitizer_1.DataSanitizer;\n    exports.TelemetryItemCreator = TelemetryItemCreator_1.TelemetryItemCreator;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-common.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n     */\n    exports.EventsDiscardedReason = {\n        /**\n         * Unknown.\n         */\n        Unknown: 0,\n        /**\n         * Status set to non-retryable.\n         */\n        NonRetryableStatus: 1,\n        /**\n         * The event is invalid.\n         */\n        InvalidEvent: 2,\n        /**\n         * The size of the event is too large.\n         */\n        SizeLimitExceeded: 3,\n        /**\n         * The server is not accepting events from this instrumentation key.\n         */\n        KillSwitch: 4,\n        /**\n         * The event queue is full.\n         */\n        QueueFull: 5,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=EventsDiscardedReason.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\":\n/*!*********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js ***!\n  \\*********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var LoggingSeverity;\n    (function (LoggingSeverity) {\n        /**\n         * Error will be sent as internal telemetry\n         */\n        LoggingSeverity[LoggingSeverity[\"CRITICAL\"] = 1] = \"CRITICAL\";\n        /**\n         * Error will NOT be sent as internal telemetry, and will only be shown in browser console\n         */\n        LoggingSeverity[LoggingSeverity[\"WARNING\"] = 2] = \"WARNING\";\n    })(LoggingSeverity = exports.LoggingSeverity || (exports.LoggingSeverity = {}));\n    /**\n     * Internal message ID. Please create a new one for every conceptually different message. Please keep alphabetically ordered\n     */ ;\n    exports._InternalMessageId = {\n        // Non user actionable\n        BrowserDoesNotSupportLocalStorage: 0,\n        BrowserCannotReadLocalStorage: 1,\n        BrowserCannotReadSessionStorage: 2,\n        BrowserCannotWriteLocalStorage: 3,\n        BrowserCannotWriteSessionStorage: 4,\n        BrowserFailedRemovalFromLocalStorage: 5,\n        BrowserFailedRemovalFromSessionStorage: 6,\n        CannotSendEmptyTelemetry: 7,\n        ClientPerformanceMathError: 8,\n        ErrorParsingAISessionCookie: 9,\n        ErrorPVCalc: 10,\n        ExceptionWhileLoggingError: 11,\n        FailedAddingTelemetryToBuffer: 12,\n        FailedMonitorAjaxAbort: 13,\n        FailedMonitorAjaxDur: 14,\n        FailedMonitorAjaxOpen: 15,\n        FailedMonitorAjaxRSC: 16,\n        FailedMonitorAjaxSend: 17,\n        FailedMonitorAjaxGetCorrelationHeader: 18,\n        FailedToAddHandlerForOnBeforeUnload: 19,\n        FailedToSendQueuedTelemetry: 20,\n        FailedToReportDataLoss: 21,\n        FlushFailed: 22,\n        MessageLimitPerPVExceeded: 23,\n        MissingRequiredFieldSpecification: 24,\n        NavigationTimingNotSupported: 25,\n        OnError: 26,\n        SessionRenewalDateIsZero: 27,\n        SenderNotInitialized: 28,\n        StartTrackEventFailed: 29,\n        StopTrackEventFailed: 30,\n        StartTrackFailed: 31,\n        StopTrackFailed: 32,\n        TelemetrySampledAndNotSent: 33,\n        TrackEventFailed: 34,\n        TrackExceptionFailed: 35,\n        TrackMetricFailed: 36,\n        TrackPVFailed: 37,\n        TrackPVFailedCalc: 38,\n        TrackTraceFailed: 39,\n        TransmissionFailed: 40,\n        FailedToSetStorageBuffer: 41,\n        FailedToRestoreStorageBuffer: 42,\n        InvalidBackendResponse: 43,\n        FailedToFixDepricatedValues: 44,\n        InvalidDurationValue: 45,\n        TelemetryEnvelopeInvalid: 46,\n        CreateEnvelopeError: 47,\n        // User actionable\n        CannotSerializeObject: 48,\n        CannotSerializeObjectNonSerializable: 49,\n        CircularReferenceDetected: 50,\n        ClearAuthContextFailed: 51,\n        ExceptionTruncated: 52,\n        IllegalCharsInName: 53,\n        ItemNotInArray: 54,\n        MaxAjaxPerPVExceeded: 55,\n        MessageTruncated: 56,\n        NameTooLong: 57,\n        SampleRateOutOfRange: 58,\n        SetAuthContextFailed: 59,\n        SetAuthContextFailedAccountName: 60,\n        StringValueTooLong: 61,\n        StartCalledMoreThanOnce: 62,\n        StopCalledWithoutStart: 63,\n        TelemetryInitializerFailed: 64,\n        TrackArgumentsNotSpecified: 65,\n        UrlTooLong: 66,\n        SessionStorageBufferFull: 67,\n        CannotAccessCookie: 68,\n        IdTooLong: 69,\n    };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=LoggingEnums.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\":\n/*!******************************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js ***!\n  \\******************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = 100;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=IChannelControls.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\":\n/*!******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js ***!\n  \\******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, EventsDiscardedReason_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    \"use strict\";\n    var AppInsightsCore = /** @class */ (function () {\n        function AppInsightsCore() {\n            this._isInitialized = false;\n            this._extensions = new Array();\n            this._channelController = new ChannelController();\n        }\n        AppInsightsCore.prototype.initialize = function (config, extensions) {\n            var _this = this;\n            // Make sure core is only initialized once\n            if (this._isInitialized) {\n                throw Error(\"Core should not be initialized more than once\");\n            }\n            if (!config || CoreUtils_1.CoreUtils.isNullOrUndefined(config.instrumentationKey)) {\n                throw Error(\"Please provide instrumentation key\");\n            }\n            this.config = config;\n            this._notificationManager = new NotificationManager_1.NotificationManager();\n            this.config.extensions = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensions) ? [] : this.config.extensions;\n            // add notification to the extensions in the config so other plugins can access it\n            this.config.extensionConfig = CoreUtils_1.CoreUtils.isNullOrUndefined(this.config.extensionConfig) ? {} : this.config.extensionConfig;\n            this.config.extensionConfig.NotificationManager = this._notificationManager;\n            this.logger = new DiagnosticLogger_1.DiagnosticLogger(config);\n            // Initial validation\n            extensions.forEach(function (extension) {\n                if (CoreUtils_1.CoreUtils.isNullOrUndefined(extension.initialize)) {\n                    throw Error(validationError);\n                }\n            });\n            if (this.config.extensions.length > 0) {\n                var isValid_1 = true;\n                this.config.extensions.forEach(function (item) {\n                    if (CoreUtils_1.CoreUtils.isNullOrUndefined(item)) {\n                        isValid_1 = false;\n                    }\n                });\n                if (!isValid_1) {\n                    throw Error(validationError);\n                }\n            }\n            // Initial validation complete\n            // Concat all available extensions before sorting by priority\n            (_a = this._extensions).push.apply(_a, [this._channelController].concat(extensions, this.config.extensions));\n            this._extensions = this._extensions.sort(function (a, b) {\n                var extA = a;\n                var extB = b;\n                var typeExtA = typeof extA.processTelemetry;\n                var typeExtB = typeof extB.processTelemetry;\n                if (typeExtA === 'function' && typeExtB === 'function') {\n                    return extA.priority - extB.priority;\n                }\n                if (typeExtA === 'function' && typeExtB !== 'function') {\n                    // keep non telemetryplugin specific extensions at start\n                    return 1;\n                }\n                if (typeExtA !== 'function' && typeExtB === 'function') {\n                    return -1;\n                }\n            });\n            // sort complete\n            // Check if any two extensions have the same priority, then warn to console\n            var priority = {};\n            this._extensions.forEach(function (ext) {\n                var t = ext;\n                if (t && t.priority) {\n                    if (!CoreUtils_1.CoreUtils.isNullOrUndefined(priority[t.priority])) {\n                        _this.logger.warnToConsole(\"Two extensions have same priority\" + priority[t.priority] + \", \" + t.identifier);\n                    }\n                    else {\n                        priority[t.priority] = t.identifier; // set a value\n                    }\n                }\n            });\n            var c = -1;\n            // Set next plugin for all until channel controller\n            for (var idx = 0; idx < this._extensions.length - 1; idx++) {\n                var curr = (this._extensions[idx]);\n                if (curr && typeof curr.processTelemetry !== 'function') {\n                    // these are initialized only, allowing an entry point for extensions to be initialized when SDK initializes\n                    continue;\n                }\n                if (curr.priority === ChannelControllerPriority) {\n                    c = idx + 1;\n                    break; // channel controller will set remaining pipeline\n                }\n                this._extensions[idx].setNextPlugin(this._extensions[idx + 1]); // set next plugin\n            }\n            // initialize channel controller first, this will initialize all channel plugins\n            this._channelController.initialize(this.config, this, this._extensions);\n            // initialize remaining regular plugins\n            this._extensions.forEach(function (ext) {\n                var e = ext;\n                if (e && e.priority < ChannelControllerPriority) {\n                    ext.initialize(_this.config, _this, _this._extensions); // initialize\n                }\n            });\n            // Remove sender channels from main list\n            if (c < this._extensions.length) {\n                this._extensions.splice(c);\n            }\n            if (this.getTransmissionControls().length === 0) {\n                throw new Error(\"No channels available\");\n            }\n            this._isInitialized = true;\n            var _a;\n        };\n        AppInsightsCore.prototype.getTransmissionControls = function () {\n            return this._channelController.ChannelControls;\n        };\n        AppInsightsCore.prototype.track = function (telemetryItem) {\n            if (telemetryItem === null) {\n                this._notifiyInvalidEvent(telemetryItem);\n                // throw error\n                throw Error(\"Invalid telemetry item\");\n            }\n            if (telemetryItem.baseData && !telemetryItem.baseType) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"Provide data.baseType for data.baseData\");\n            }\n            if (!telemetryItem.baseType) {\n                // Hard coded from Common::Event.ts::Event.dataType\n                telemetryItem.baseType = \"EventData\";\n            }\n            if (!telemetryItem.instrumentationKey) {\n                // setup default ikey if not passed in\n                telemetryItem.instrumentationKey = this.config.instrumentationKey;\n            }\n            if (!telemetryItem.timestamp) {\n                // add default timestamp if not passed in\n                telemetryItem.timestamp = new Date();\n            }\n            // do basic validation before sending it through the pipeline\n            this._validateTelmetryItem(telemetryItem);\n            // invoke any common telemetry processors before sending through pipeline\n            var i = 0;\n            while (i < this._extensions.length) {\n                if (this._extensions[i].processTelemetry) {\n                    this._extensions[i].processTelemetry(telemetryItem); // pass on to first extension that can support processing\n                    break;\n                }\n                i++;\n            }\n        };\n        /**\n         * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n         * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n         * called.\n         * @param {INotificationListener} listener - An INotificationListener object.\n         */\n        AppInsightsCore.prototype.addNotificationListener = function (listener) {\n            this._notificationManager.addNotificationListener(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - INotificationListener to remove.\n         */\n        AppInsightsCore.prototype.removeNotificationListener = function (listener) {\n            this._notificationManager.removeNotificationListener(listener);\n        };\n        /**\n         * Periodically check logger.queue for\n         */\n        AppInsightsCore.prototype.pollInternalLogs = function () {\n            var _this = this;\n            if (!(this.config.diagnosticLoggingInterval > 0)) {\n                throw Error(\"config.diagnosticLoggingInterval must be a positive integer\");\n            }\n            return setInterval(function () {\n                var queue = _this.logger.queue;\n                queue.forEach(function (logMessage) {\n                    var item = {\n                        name: \"InternalMessageId: \" + logMessage.messageId,\n                        instrumentationKey: _this.config.instrumentationKey,\n                        timestamp: new Date(),\n                        baseType: DiagnosticLogger_1._InternalLogMessage.dataType,\n                        baseData: { message: logMessage.message }\n                    };\n                    _this.track(item);\n                });\n                queue.length = 0;\n            }, this.config.diagnosticLoggingInterval);\n        };\n        AppInsightsCore.prototype._validateTelmetryItem = function (telemetryItem) {\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.name)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry name required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.timestamp)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry timestamp required\");\n            }\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(telemetryItem.instrumentationKey)) {\n                this._notifiyInvalidEvent(telemetryItem);\n                throw Error(\"telemetry instrumentationKey required\");\n            }\n        };\n        AppInsightsCore.prototype._notifiyInvalidEvent = function (telemetryItem) {\n            this._notificationManager.eventsDiscarded([telemetryItem], EventsDiscardedReason_1.EventsDiscardedReason.InvalidEvent);\n        };\n        return AppInsightsCore;\n    }());\n    exports.AppInsightsCore = AppInsightsCore;\n    var ChannelController = /** @class */ (function () {\n        function ChannelController() {\n            this.identifier = \"ChannelControllerPlugin\";\n            this.priority = ChannelControllerPriority; // in reserved range 100 to 200\n        }\n        ChannelController.prototype.processTelemetry = function (item) {\n            this.channelQueue.forEach(function (queues) {\n                // pass on to first item in queue\n                if (queues.length > 0) {\n                    queues[0].processTelemetry(item);\n                }\n            });\n        };\n        Object.defineProperty(ChannelController.prototype, \"ChannelControls\", {\n            get: function () {\n                return this.channelQueue;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        ChannelController.prototype.initialize = function (config, core, extensions) {\n            var _this = this;\n            this.channelQueue = new Array();\n            if (config.channels) {\n                config.channels.forEach(function (queue) {\n                    if (queue && queue.length > 0) {\n                        queue = queue.sort(function (a, b) {\n                            return a.priority - b.priority;\n                        });\n                        // Initialize each plugin\n                        queue.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                        for (var i = 1; i < queue.length; i++) {\n                            queue[i - 1].setNextPlugin(queue[i]); // setup processing chain\n                        }\n                        _this.channelQueue.push(queue);\n                    }\n                });\n            }\n            else {\n                var arr = new Array();\n                for (var i = 0; i < extensions.length; i++) {\n                    var plugin = extensions[i];\n                    if (plugin.priority > ChannelControllerPriority) {\n                        arr.push(plugin);\n                    }\n                }\n                if (arr.length > 0) {\n                    // sort if not sorted\n                    arr = arr.sort(function (a, b) {\n                        return a.priority - b.priority;\n                    });\n                    // Initialize each plugin\n                    arr.forEach(function (queueItem) { return queueItem.initialize(config, core, extensions); });\n                    // setup next plugin\n                    for (var i = 1; i < arr.length; i++) {\n                        arr[i - 1].setNextPlugin(arr[i]);\n                    }\n                    this.channelQueue.push(arr);\n                }\n            }\n        };\n        return ChannelController;\n    }());\n    var validationError = \"Extensions must provide callback to initialize\";\n    var ChannelControllerPriority = 200;\n    var duplicatePriority = \"One or more extensions are set at same priority\";\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=AppInsightsCore.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\":\n/*!************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js ***!\n  \\************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var CoreUtils = /** @class */ (function () {\n        function CoreUtils() {\n        }\n        CoreUtils.isNullOrUndefined = function (input) {\n            return input === null || input === undefined;\n        };\n        /**\n    * Creates a new GUID.\n    * @return {string} A GUID.\n    */\n        CoreUtils.newGuid = function () {\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(GuidRegex, function (c) {\n                var r = (Math.random() * 16 | 0), v = (c === 'x' ? r : r & 0x3 | 0x8);\n                return v.toString(16);\n            });\n        };\n        return CoreUtils;\n    }());\n    exports.CoreUtils = CoreUtils;\n    var GuidRegex = /[xy]/g;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=CoreUtils.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\":\n/*!*******************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js ***!\n  \\*******************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ../JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\"), __webpack_require__(/*! ./CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, LoggingEnums_1, CoreUtils_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    var _InternalLogMessage = /** @class */ (function () {\n        function _InternalLogMessage(msgId, msg, isUserAct, properties) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            this.messageId = msgId;\n            this.message =\n                (isUserAct ? _InternalLogMessage.AiUserActionablePrefix : _InternalLogMessage.AiNonUserActionablePrefix) +\n                    msgId;\n            var diagnosticText = (msg ? \" message:\" + _InternalLogMessage.sanitizeDiagnosticText(msg) : \"\") +\n                (properties ? \" props:\" + _InternalLogMessage.sanitizeDiagnosticText(JSON.stringify(properties)) : \"\");\n            this.message += diagnosticText;\n        }\n        _InternalLogMessage.sanitizeDiagnosticText = function (text) {\n            return \"\\\"\" + text.replace(/\\\"/g, \"\") + \"\\\"\";\n        };\n        _InternalLogMessage.dataType = \"MessageData\";\n        /**\n         * For user non actionable traces use AI Internal prefix.\n         */\n        _InternalLogMessage.AiNonUserActionablePrefix = \"AI (Internal): \";\n        /**\n         * Prefix of the traces in portal.\n         */\n        _InternalLogMessage.AiUserActionablePrefix = \"AI: \";\n        return _InternalLogMessage;\n    }());\n    exports._InternalLogMessage = _InternalLogMessage;\n    var DiagnosticLogger = /** @class */ (function () {\n        function DiagnosticLogger(config) {\n            /**\n            *  Session storage key for the prefix for the key indicating message type already logged\n            */\n            this.AIInternalMessagePrefix = \"AITR_\";\n            /**\n             * When this is true the SDK will throw exceptions to aid in debugging.\n             */\n            this.enableDebugExceptions = function () { return false; };\n            /**\n             * 0: OFF\n             * 1: CRITICAL (default)\n             * 2: >= WARNING\n             */\n            this.consoleLoggingLevel = function () { return 1; };\n            /**\n             * 0: OFF (default)\n             * 1: CRITICAL\n             * 2: >= WARNING\n             */\n            this.telemetryLoggingLevel = function () { return 0; };\n            /**\n             * The maximum number of internal messages allowed to be sent per page view\n             */\n            this.maxInternalMessageLimit = function () { return 25; };\n            /**\n             * The internal logging queue\n             */\n            this.queue = [];\n            /**\n             * Count of internal messages sent\n             */\n            this._messageCount = 0;\n            /**\n             * Holds information about what message types were already logged to console or sent to server.\n             */\n            this._messageLogged = {};\n            if (CoreUtils_1.CoreUtils.isNullOrUndefined(config)) {\n                // TODO: Use default config\n                // config = AppInsightsCore.defaultConfig;\n                // For now, use defaults specified in DiagnosticLogger members;\n                return;\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelConsole)) {\n                this.consoleLoggingLevel = function () { return config.loggingLevelConsole; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.loggingLevelTelemetry)) {\n                this.telemetryLoggingLevel = function () { return config.loggingLevelTelemetry; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.maxMessageLimit)) {\n                this.maxInternalMessageLimit = function () { return config.maxMessageLimit; };\n            }\n            if (!CoreUtils_1.CoreUtils.isNullOrUndefined(config.enableDebugExceptions)) {\n                this.enableDebugExceptions = function () { return config.enableDebugExceptions; };\n            }\n        }\n        /**\n         * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The log message.\n         */\n        DiagnosticLogger.prototype.throwInternal = function (severity, msgId, msg, properties, isUserAct) {\n            if (isUserAct === void 0) { isUserAct = false; }\n            var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n            if (this.enableDebugExceptions()) {\n                throw message;\n            }\n            else {\n                if (typeof (message) !== \"undefined\" && !!message) {\n                    if (typeof (message.message) !== \"undefined\") {\n                        if (isUserAct) {\n                            // check if this message type was already logged to console for this page view and if so, don't log it again\n                            var messageKey = +message.messageId;\n                            if (!this._messageLogged[messageKey] || this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                                this._messageLogged[messageKey] = true;\n                            }\n                        }\n                        else {\n                            // don't log internal AI traces in the console, unless the verbose logging is enabled\n                            if (this.consoleLoggingLevel() >= LoggingEnums_1.LoggingSeverity.WARNING) {\n                                this.warnToConsole(message.message);\n                            }\n                        }\n                        this.logInternalMessage(severity, message);\n                    }\n                }\n            }\n        };\n        /**\n         * This will write a warning to the console if possible\n         * @param message {string} - The warning message\n         */\n        DiagnosticLogger.prototype.warnToConsole = function (message) {\n            if (typeof console !== \"undefined\" && !!console) {\n                if (typeof console.warn === \"function\") {\n                    console.warn(message);\n                }\n                else if (typeof console.log === \"function\") {\n                    console.log(message);\n                }\n            }\n        };\n        /**\n         * Resets the internal message count\n         */\n        DiagnosticLogger.prototype.resetInternalMessageCount = function () {\n            this._messageCount = 0;\n            this._messageLogged = {};\n        };\n        /**\n         * Logs a message to the internal queue.\n         * @param severity {LoggingSeverity} - The severity of the log message\n         * @param message {_InternalLogMessage} - The message to log.\n         */\n        DiagnosticLogger.prototype.logInternalMessage = function (severity, message) {\n            if (this._areInternalMessagesThrottled()) {\n                return;\n            }\n            // check if this message type was already logged for this session and if so, don't log it again\n            var logMessage = true;\n            var messageKey = this.AIInternalMessagePrefix + message.messageId;\n            // if the session storage is not available, limit to only one message type per page view\n            if (this._messageLogged[messageKey]) {\n                logMessage = false;\n            }\n            else {\n                this._messageLogged[messageKey] = true;\n            }\n            if (logMessage) {\n                // Push the event in the internal queue\n                if (severity <= this.telemetryLoggingLevel()) {\n                    this.queue.push(message);\n                    this._messageCount++;\n                }\n                // When throttle limit reached, send a special event\n                if (this._messageCount == this.maxInternalMessageLimit()) {\n                    var throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                    var throttleMessage = new _InternalLogMessage(LoggingEnums_1._InternalMessageId.MessageLimitPerPVExceeded, throttleLimitMessage, false);\n                    this.queue.push(throttleMessage);\n                    this.warnToConsole(throttleLimitMessage);\n                }\n            }\n        };\n        /**\n         * Indicates whether the internal events are throttled\n         */\n        DiagnosticLogger.prototype._areInternalMessagesThrottled = function () {\n            return this._messageCount >= this.maxInternalMessageLimit();\n        };\n        return DiagnosticLogger;\n    }());\n    exports.DiagnosticLogger = DiagnosticLogger;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=DiagnosticLogger.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\":\n/*!**********************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js ***!\n  \\**********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    /**\n     * Class to manage sending notifications to all the listeners.\n     */\n    var NotificationManager = /** @class */ (function () {\n        function NotificationManager() {\n            this.listeners = [];\n        }\n        /**\n         * Adds a notification listener.\n         * @param {INotificationListener} listener - The notification listener to be added.\n         */\n        NotificationManager.prototype.addNotificationListener = function (listener) {\n            this.listeners.push(listener);\n        };\n        /**\n         * Removes all instances of the listener.\n         * @param {INotificationListener} listener - AWTNotificationListener to remove.\n         */\n        NotificationManager.prototype.removeNotificationListener = function (listener) {\n            var index = this.listeners.indexOf(listener);\n            while (index > -1) {\n                this.listeners.splice(index, 1);\n                index = this.listeners.indexOf(listener);\n            }\n        };\n        /**\n         * Notification for events sent.\n         * @param {ITelemetryItem[]} events - The array of events that have been sent.\n         */\n        NotificationManager.prototype.eventsSent = function (events) {\n            var _this = this;\n            var _loop_1 = function (i) {\n                if (this_1.listeners[i].eventsSent) {\n                    setTimeout(function () { return _this.listeners[i].eventsSent(events); }, 0);\n                }\n            };\n            var this_1 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_1(i);\n            }\n        };\n        /**\n         * Notification for events being discarded.\n         * @param {ITelemetryItem[]} events - The array of events that have been discarded by the SDK.\n         * @param {number} reason           - The reason for which the SDK discarded the events. The EventsDiscardedReason\n         * constant should be used to check the different values.\n         */\n        NotificationManager.prototype.eventsDiscarded = function (events, reason) {\n            var _this = this;\n            var _loop_2 = function (i) {\n                if (this_2.listeners[i].eventsDiscarded) {\n                    setTimeout(function () { return _this.listeners[i].eventsDiscarded(events, reason); }, 0);\n                }\n            };\n            var this_2 = this;\n            for (var i = 0; i < this.listeners.length; ++i) {\n                _loop_2(i);\n            }\n        };\n        return NotificationManager;\n    }());\n    exports.NotificationManager = NotificationManager;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=NotificationManager.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js\":\n/*!****************************************************************************************!*\\\n  !*** ./node_modules/applicationinsights-core-js/bundle/applicationinsights-core-js.js ***!\n  \\****************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(/*! ./JavaScriptSDK.Interfaces/IChannelControls */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Interfaces/IChannelControls.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/EventsDiscardedReason */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/EventsDiscardedReason.js\"), __webpack_require__(/*! ./JavaScriptSDK/AppInsightsCore */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/AppInsightsCore.js\"), __webpack_require__(/*! ./JavaScriptSDK/CoreUtils */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/CoreUtils.js\"), __webpack_require__(/*! ./JavaScriptSDK/NotificationManager */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/NotificationManager.js\"), __webpack_require__(/*! ./JavaScriptSDK/DiagnosticLogger */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK/DiagnosticLogger.js\"), __webpack_require__(/*! ./JavaScriptSDK.Enums/LoggingEnums */ \"./node_modules/applicationinsights-core-js/bundle/JavaScriptSDK.Enums/LoggingEnums.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, IChannelControls_1, EventsDiscardedReason_1, AppInsightsCore_1, CoreUtils_1, NotificationManager_1, DiagnosticLogger_1, LoggingEnums_1) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", { value: true });\n    exports.MinChannelPriorty = IChannelControls_1.MinChannelPriorty;\n    exports.EventsDiscardedReason = EventsDiscardedReason_1.EventsDiscardedReason;\n    exports.AppInsightsCore = AppInsightsCore_1.AppInsightsCore;\n    exports.CoreUtils = CoreUtils_1.CoreUtils;\n    exports.NotificationManager = NotificationManager_1.NotificationManager;\n    exports.DiagnosticLogger = DiagnosticLogger_1.DiagnosticLogger;\n    exports._InternalLogMessage = DiagnosticLogger_1._InternalLogMessage;\n    exports._InternalMessageId = LoggingEnums_1._InternalMessageId;\n    exports.LoggingSeverity = LoggingEnums_1.LoggingSeverity;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceMappingURL=applicationinsights-core-js.js.map\n\n/***/ }),\n\n/***/ 0:\n/*!*******************************!*\\\n  !*** multi ./bundle/index.js ***!\n  \\*******************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./bundle/index.js */\"./bundle/index.js\");\n\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=aisdklite.0.0.3.js.map"
  },
  {
    "path": "AISKULight/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-web-basic\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - Web Basic\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-web-basic.js\",\n    \"module\": \"dist-es5/index.js\",\n    \"types\": \"types/applicationinsights-web-basic.d.ts\",\n    \"sideEffects\": false,\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt aiskulite\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt aiskuliteunittests\",\n        \"mintest\": \"grunt aiskulite-mintests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../scripts/dtsgen.js 'Microsoft.ApplicationInsights'\",\n        \"sri\": \"node ../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt aiskulite-min\",\n        \"ai-restore\": \"grunt aiskulite-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/AISKULight\",\n        \"directory\": \"AISKULight\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"tslib\": \"^2.0.0\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-channel-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "AISKULight/rollup.config.js",
    "content": "import { createConfig } from \"../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"index\";\nconst browserOutputName = \"aib\";\nconst entryPointName = \"index\";\nconst outputName = \"applicationinsights-web-basic\"; \n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript Web SDK - Basic, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ \"index\" ]);\n"
  },
  {
    "path": "AISKULight/src/index.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\";\nimport {\n    AppInsightsCore, DEFAULT_BREEZE_PATH, FeatureOptInMode, IConfig, IConfigDefaults, IConfiguration, IDistributedTraceContext,\n    IDynamicConfigHandler, ILoadedPlugin, IPlugin, ITelemetryInitializerHandler, ITelemetryItem, ITelemetryPlugin, ITelemetryUnloadState,\n    IUnloadHook, UnloadHandler, WatcherFunction, cfgDfValidate, createDynamicConfig, onConfigChange, parseConnectionString, proxyFunctions\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, createSyncPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { isNullOrUndefined, isPromiseLike, isString, objDefine, throwError } from \"@nevware21/ts-utils\";\n\nconst UNDEFINED_VALUE: undefined = undefined;\nconst defaultConfigValues: IConfigDefaults<IConfiguration> = {\n    diagnosticLogInterval: cfgDfValidate(_chkDiagLevel, 10000),\n    connectionString: UNDEFINED_VALUE,\n    endpointUrl: UNDEFINED_VALUE,\n    instrumentationKey: UNDEFINED_VALUE,\n    featureOptIn:{\n        [\"zipPayload\"]: {mode: FeatureOptInMode.none}\n    },\n    extensionConfig: {}\n};\n\nfunction _chkDiagLevel(value: number) {\n    // Make sure we have a value > 0\n    return value && value > 0;\n}\n\n\n/**\n * @export\n */\nexport class ApplicationInsights {\n    public readonly config: IConfiguration & IConfig;\n\n    /**\n     * Creates an instance of ApplicationInsights.\n     * @param config - The configuration to use for this ApplicationInsights instance\n     */\n    constructor(config: IConfiguration & IConfig) {\n        let core = new AppInsightsCore();\n        let _config: IConfiguration & IConfig;\n\n        // initialize the queue and config in case they are undefined\n        if (\n            isNullOrUndefined(config) ||\n            (isNullOrUndefined(config.instrumentationKey) && isNullOrUndefined(config.connectionString))\n        ) {\n            throwError(\"Invalid input configuration\");\n        }\n\n        dynamicProto(ApplicationInsights, this, (_self) => {\n            \n            // Define _self.config\n            objDefine(_self, \"config\", {\n                g: () => _config\n            });\n\n            _initialize();\n          \n            _self.initialize = _initialize;\n            _self.track = _track;\n        \n            proxyFunctions(_self, core, [\n                \"flush\",\n                \"pollInternalLogs\",\n                \"stopPollingInternalLogs\",\n                \"unload\",\n                \"getPlugin\",\n                \"addPlugin\",\n                \"evtNamespace\",\n                \"addUnloadCb\",\n                \"onCfgChange\",\n                \"getTraceCtx\",\n                \"updateCfg\",\n                \"addTelemetryInitializer\"\n            ]);\n\n            function _initialize(): void {\n                let cfgHandler: IDynamicConfigHandler<IConfiguration & IConfig> = createDynamicConfig(config || ({} as any), defaultConfigValues);\n                _config = cfgHandler.cfg;\n    \n                core.addUnloadHook(onConfigChange(cfgHandler, () => {\n                    let configCs =  _config.connectionString;\n                \n                    if (isPromiseLike(configCs)) {\n                        let ikeyPromise = createSyncPromise<string>((resolve, reject) => {\n                            doAwaitResponse(configCs, (res) => {\n                                let curCs = res.value;\n                                let ikey = _config.instrumentationKey;\n                                if (!res.rejected && curCs) {\n                                    // replace cs with resolved values in case of circular promises\n                                    _config.connectionString = curCs;\n                                    let resolvedCs = parseConnectionString(curCs);\n                                    ikey = resolvedCs.instrumentationkey || ikey;\n                                }\n                                resolve(ikey);\n                            });\n\n                        });\n\n                        let urlPromise = createSyncPromise<string>((resolve, reject) => {\n                            doAwaitResponse(configCs, (res) => {\n                                let curCs = res.value;\n                                let url = _config.endpointUrl;\n                                if (!res.rejected && curCs) {\n                                    let resolvedCs = parseConnectionString(curCs);\n                                    let ingest = resolvedCs.ingestionendpoint;\n                                    url = ingest? ingest + DEFAULT_BREEZE_PATH : url;\n                                }\n                                resolve(url);\n                            });\n\n                        });\n\n                        _config.instrumentationKey = ikeyPromise;\n                        _config.endpointUrl = _config.userOverrideEndpointUrl || urlPromise;\n                    \n                    }\n                    \n                    if (isString(configCs)) {\n                        const cs = parseConnectionString(configCs);\n                        const ingest = cs.ingestionendpoint;\n                        _config.endpointUrl = _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : (ingest + DEFAULT_BREEZE_PATH); // only add /v2/track when from connectionstring\n                        _config.instrumentationKey = cs.instrumentationkey || _config.instrumentationKey;\n                    }\n                    // userOverrideEndpointUrl have the highest priority\n                    _config.endpointUrl = _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : _config.endpointUrl;\n                }));\n    \n                // initialize core\n                core.initialize(_config, [new Sender()]);\n            }\n        });\n\n        function _track(item: ITelemetryItem) {\n            if (item) {\n                // to pass sender.processTelemetry()\n                item.baseData = item.baseData || {};\n                item.baseType = item.baseType || \"EventData\";\n            }\n\n            core.track(item);\n        }\n    }\n\n    /**\n     * Initialize this instance of ApplicationInsights\n     *\n     */\n    public initialize(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Send a manually constructed custom event\n     * @param item - The custom event to send\n     */\n    public track(item: ITelemetryItem) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Immediately send all batched telemetry\n     * @param isAsync - Should the flush be performed asynchronously\n     */\n    public flush(isAsync: boolean = true) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public pollInternalLogs(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public stopPollingInternalLogs(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered\n     * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous\n     * unload call return `true` stating that all plugins reported that they also unloaded, the recommended\n     * approach is to create a new instance and initialize that instance.\n     * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable\n     * to successfully remove any global references or they may just be completing the unload process asynchronously.\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @param unloadComplete - An optional callback that will be called once the unload has completed\n     * @param cbTimeout - An optional timeout to wait for any flush operations to complete before proceeding with the\n     * unload. Defaults to 5 seconds.\n     * @returns Nothing or if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * which will be resolved once the unload is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will only be returned when no callback is provided and isAsync is true\n     */\n    public unload(isAsync?: boolean, unloadComplete?: (unloadState: ITelemetryUnloadState) => void, cbTimeout?: number): void | IPromise<ITelemetryUnloadState> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Find and return the (first) plugin with the specified identifier if present\n     * @param pluginIdentifier - The identifier of the plugin to search for\n     */\n    public getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add a new plugin to the installation\n     * @param plugin - The new plugin to add\n     * @param replaceExisting - should any existing plugin be replaced\n     * @param doAsync - Should the add be performed asynchronously\n     */\n    public addPlugin<T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting: boolean, doAsync: boolean, addCb?: (added?: boolean) => void): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Returns the unique event namespace that should be used\n     */\n    public evtNamespace(): string {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add an unload handler that will be called when the SDK is being unloaded\n     * @param handler - the handler\n     */\n    public addUnloadCb(handler: UnloadHandler): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Gets the current distributed trace context for this instance if available\n     */\n    public getTraceCtx(): IDistributedTraceContext | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public addTelemetryInitializer(telemetryInitializer: (item: ITelemetryItem) => boolean | void): ITelemetryInitializerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Update the configuration used and broadcast the changes to all loaded plugins\n     * @param newConfig - The new configuration is apply\n     * @param mergeExisting - Should the new configuration merge with the existing or just replace it. Default is to merge.\n     */\n    public updateCfg<T extends IConfiguration = IConfiguration>(newConfig: T, mergeExisting?: boolean): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n\n    /**\n     * Watches and tracks changes for accesses to the current config, and if the accessed config changes the\n     * handler will be recalled.\n     * @param handler - The handler to call when the configuration changes\n     * @returns A watcher handler instance that can be used to remove itself when being unloaded\n     */\n    public onCfgChange(handler: WatcherFunction<IConfiguration>): IUnloadHook {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n    \n}\n\nexport {\n    IConfiguration,\n    AppInsightsCore,\n    IAppInsightsCore,\n    ITelemetryItem,\n    ILoadedPlugin,\n    arrForEach,\n    SendRequestReason,\n    _eInternalMessageId,\n    isNullOrUndefined,\n    throwError,\n    proxyFunctions,\n    IPlugin,\n    ITelemetryPlugin\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport {\n    SeverityLevel,\n    eSeverityLevel,\n    IPageViewTelemetry,\n    IDependencyTelemetry,\n    IAutoExceptionTelemetry,\n    IEventTelemetry,\n    IMetricTelemetry,\n    IPageViewPerformanceTelemetry,\n    ITraceTelemetry,\n    IRequestTelemetry\n} from \"@microsoft/applicationinsights-core-js\";\nexport { Sender, ISenderConfig } from \"@microsoft/applicationinsights-channel-js\";\n"
  },
  {
    "path": "AISKULight/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"target\": \"es5\",\n    \"moduleResolution\": \"Node\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}"
  },
  {
    "path": "AISKULight/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "AISKULight/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../tslint-base.json\"\n    ]\n}\n"
  },
  {
    "path": "AISKULight/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/index.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../docs/webSdk/applicationinsights-web-basic\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/AISKULight/README.md\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-web-basic\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "API-reference.md",
    "content": "# API Reference\n\nThis documentation has been moved to the [GitHub Pages documentation site](https://microsoft.github.io/ApplicationInsights-JS/API-reference).\n"
  },
  {
    "path": "CODEOWNERS",
    "content": "* @microsoft/ApplicationInsights-JS-owners\n* @microsoft/ApplicationInsights-JS-CodeOwners\n\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n\nResources:\n\n- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)\n- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\n- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Welcome\n\nWelcome and thank you for your interest in contributing to ApplicationInsights-JS.\n\nWe strongly welcome and encourage contributions to this project. Please read the [contributor's guide][ContribGuide] located in the ApplicationInsights-Home repository. If making a large change we request that you open an [issue][GitHubIssue] first. We follow the [Git Flow][GitFlow] approach to branching.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n[ContribGuide]: https://github.com/microsoft/ApplicationInsights-Home/blob/main/CONTRIBUTING.md\n[GitFlow]: http://nvie.com/posts/a-successful-git-branching-model/\n[GitHubIssue]: https://github.com/microsoft/ApplicationInsights-JS/issues\n\n## Clone and setup\n1. Clone the repository and create a new branch\n2. Install all dependencies\n\t```\n\tnpm install\n\tnpm install -g @microsoft/rush\n\t```\n3. Navigate to the root folder and update rush dependencies\n\t```\n\trush update\n\t```\n4. Build and test\n\t```\n\trush build\n\tnpm run test\n\t```\n\n## Build and test\n\nThe root folder contains 8 packages that are components of this next version of the SDK. When making changes in multiple packages, you can build using the following commands in root folder:\n\n1. rush rebuild --verbose\n\n    This will build all packages in order of dependencies. If there are build errors, verbose options is required to view error details.\n\n2. rush test --verbose\n\n    This will run tests in all packages in parallel.\n\nIf you are changing package versions or adding/removing any package dependencies, run> **rush update --purge --recheck --full** before building. Please check-in any files that change under common\\ folder.\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "README.md",
    "content": "# Application Insights JavaScript SDK\n\n<properties\n    pageTitle=\"Application Insights SDK JavaScript API\"\n    description=\"Reference doc\"\n    services=\"application-insights\"\n    documentationCenter=\".net\"\n/>\n\n<tags\n    ms.service=\"application-insights\"\n    ms.workload=\"tbd\"\n    ms.tgt_pltfrm=\"ibiza\"\n    ms.devlang=\"na\"\n    ms.topic=\"article\"\n    ms.date=\"08/24/2015\"/>\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web)\n[![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.min.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.min.js)\n[![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.min.js.gzip.svg)](https://js.monitor.azure.com/scripts/b/ai.3.min.js)\n\n# Menu\n- [Before Getting Started](#before-getting-started)\n- [Release Versions](#release-versions)\n- [Getting Started](#getting-started)\n- [Basic Usage](#basic-usage)\n- [Configuration](#configuration)\n- <details>\n  <summary>More</summary>\n  \n  - [Cookie Handling](#cookie-handling)\n  - [OpenTelemetry Tracing API](#opentelemetry-tracing-api)\n  - [Tree-Shaking Support and Enhancements](#tree-shaking-support-and-enhancements)\n  - [Service Notification](#service-notification)\n  - [Single Page Applications](#single-page-applications)\n  - [Source Map Support](#source-map-support)\n  - [Using Azure API Management as a proxy for Application Insights Telemetry](https://techcommunity.microsoft.com/blog/azureobservabilityblog/using-azure-api-management-as-a-proxy-for-application-insights-telemetry/4422236)\n  - [Examples](#examples)\n  - [Application Insights Web Basic](#application-insights-web-basic)\n  - [Available Extensions for the SDK](#available-extensions-for-the-sdk)\n  - [Build a New Extension for the SDK](#build-a-new-extension-for-the-sdk)\n  - [Build & Test This Repo](#build-and-test-this-repo)\n  - [Performance](#performance)\n  - [Module Formats](#module-formats)\n  - [Nightly Builds](#nightly-builds)\n  - [Release Notes](#release-notes)\n  - [Browser Support](#browser-support)\n  - [Contributing](#contributing)\n  - [Data Collection](#data-collection)\n  - [Trademarks](#trademarks)\n  - [License](#license)\n  \n  </details>\n\n> # URGENT ACTION: Stop using az416426.vo.msecnd.net\n>\n> To avoid any global OUTAGE you MUST change ALL of your CDN usage from “https://az416426.vo.msecnd.net/scripts/..” to our primary CDN endpoint https://js.monitor.azure.com/scripts/...\n>\n> See/follow [Issue #2457](https://github.com/microsoft/ApplicationInsights-JS/issues/2457) for updated details\n>\n> We are currently investigating the available options on how we can avoid / migrate / mitigate this situation, but at this point it is **HIGHLY** likely that there will be either a temporary or permanent outage of this domain. As we currently have no known way to “migrate” this domain to a different CDN.\n\n## Before Getting Started\n\nThis SDK is intended for browser environments and is not suitable for other environments, like Node.js applications.\n\nFor instrumenting a Node.js app, the recommended SDK is the [ApplicationInsights-node.js repository](https://github.com/microsoft/ApplicationInsights-node.js).\n\nES3 support has been removed from the latest version (v3.x), if required [see for ES3/IE8 Support](https://microsoft.github.io/ApplicationInsights-JS/es3_Support.html\n)\n\n## Release Versions\n\n| Version | Details\n|---------|--------------------------\n| <b>[3.x](https://github.com/microsoft/ApplicationInsights-JS/tree/main)<br/><sub>(main)</sub> </b>| Current supported release from April '2023.<br/>Supports dynamic configuration changes/updates after initialization. Supports all features of v2 except with the known <b>[Breaking changes from previous versions](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v3_BreakingChanges.html)</b> and does NOT support the previous v1.x compatible API proxy layer, it also removes support for ES3 / IE8. Minimum supported Runtime is now ES5 (IE9+).\n| [2.x](https://github.com/microsoft/ApplicationInsights-JS/tree/master)<br/><sub>(master)</sub> | Feature freeze from March '2023. Will only receive critical bug fixes when no workaround exists — no new features or back-porting from later versions.<br />Supports adding / removing extensions and full unloading/removal of the SDK after initialization. Last version to support ES3 (IE8+), also provides a v1.x compatible API proxy layer for upgrading from V1.x.\n| [1.0.x](https://github.com/microsoft/ApplicationInsights-JS/tree/legacy-v1)<br/><sub>(legacy-v1)</sub> | No longer actively maintained -- please Upgrade. The documentation for `applicationinsights-js@1.0.x` has moved [here](https://github.com/microsoft/ApplicationInsights-JS/tree/master/legacy/README.md). If you are looking to upgrade to the new version of the SDK, please see the [Upgrade Guide](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v2_UpgradeGuide.html). | Not actively maintained, please upgrade.\n\n\n> :bulb: **Note**\n> When multiple instances of Application Insights with different major version are active within a single session, errors may arise. For further details, please refer to the [version conflict doc](./versionConflict.md).\n\n## Getting Started\n\n1. Create an Application Insights resource in Azure by following [these instructions](https://docs.microsoft.com/en-us/azure/application-insights/app-insights-javascript?toc=/azure/azure-monitor/toc.json).\n2. Grab the _Connection String_ from the resource you created in\n   step 1. Later, you'll add it to the `connectionString` setting of the Application Insights JavaScript SDK.\n3. Add Application Insights to your app. **There are 2 ways to do this.**\n    - Install via NPM. Then, [set up an instance of Application Insights in your app.](#npm-setup-ignore-if-using-snippet-setup)\n        > *Note:* **Typings are included with this package**, so you do **not** need to install a separate typings package.\n\n        ```sh\n        npm i --save @microsoft/applicationinsights-web\n        ```\n\n    - [Pasting a script snippet at the beginning of every `<head>` tag for each page you want to monitor.](#snippet-setup-ignore-if-using-npm-setup)\n\n## Basic Usage\n\n### NPM Setup (ignore if using Snippet Setup)\n\n```js\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web'\n\nconst appInsights = new ApplicationInsights({ config: {\n  connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE'\n  /* ...Other Configuration Options... */\n} });\nappInsights.loadAppInsights();\nappInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n```\n\n### Snippet Setup (Ignore if using NPM Setup)\n\nIf your app does not use NPM, you can directly instrument your webpages with Application Insights by pasting this snippet at the top of each your pages. Preferably, it should be the first script in your `<head>` section so that it can monitor any potential issues with all of your dependencies.\n\nThe current version of the snippet is version 8, the version is identified by the \"sv:\" in the script.\n\n```html\n<script type=\"text/javascript\">\n  !(function (cfg){var k,x,D,E,L,C,b,U,O,A,e,t=\"track\",n=\"TrackPage\",i=\"TrackEvent\",I=[t+\"Event\",t+\"Exception\",t+\"PageView\",t+\"PageViewPerformance\",\"addTelemetryInitializer\",t+\"Trace\",t+\"DependencyData\",t+\"Metric\",\"start\"+n,\"stop\"+n,\"start\"+i,\"stop\"+i,\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"];function a(){cfg.onInit&&cfg.onInit(e)}k=window,x=document,D=k.location,E=\"script\",L=\"ingestionendpoint\",C=\"disableExceptionTracking\",b=\"crossOrigin\",U=\"POST\",O=cfg.pn||\"aiPolicy\",t=\"appInsightsSDK\",A=cfg.name||\"appInsights\",(cfg.name||k[t])&&(k[t]=A),e=k[A]||function(u){var n=u.url||cfg.src,s=!1,p=!1,l={initialize:!0,queue:[],sv:\"10\",config:u,version:2,extensions:void 0};function d(e){var t,n,i,a,r,o,c,s;!0!==cfg.dle&&(o=(t=function(){var e,t={},n=u.connectionString;if(\"string\"==typeof n&&n)for(var i=n.split(\";\"),a=0;a<i.length;a++){var r=i[a].split(\"=\");2===r.length&&(t[r[0].toLowerCase()]=r[1])}return t[L]||(e=(n=t.endpointsuffix)?t.location:null,t[L]=\"https://\"+(e?e+\".\":\"\")+\"dc.\"+(n||\"services.visualstudio.com\")),t}()).instrumentationkey||u.instrumentationKey||\"\",t=(t=(t=t[L])&&\"/\"===t.slice(-1)?t.slice(0,-1):t)?t+\"/v2/track\":u.endpointUrl,t=u.userOverrideEndpointUrl||t,(n=[]).push((i=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=e,c=t,(s=(r=f(o,\"Exception\")).data).baseType=\"ExceptionData\",s.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:i.replace(/\\./g,\"-\"),hasFullStack:!1,stack:i+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(D&&D.pathname||\"_unknown_\")+\"\\nEndpoint: \"+c,parsedStack:[]}],r)),n.push((s=e,i=t,(c=(a=f(o,\"Message\")).data).baseType=\"MessageData\",(r=c.baseData).message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+s+\")\").replace(/\\\"/g,\"\")+'\"',r.properties={endpoint:i},a)),e=n,o=t,JSON&&((c=k.fetch)&&!cfg.useXhr?c(o,{method:U,body:JSON.stringify(e),mode:\"cors\"}):XMLHttpRequest&&((s=new XMLHttpRequest).open(U,o),s.setRequestHeader(\"Content-type\",\"application/json\"),s.send(JSON.stringify(e)))))}function f(e,t){return e=e,t=t,i=l.sv,a=l.version,r=D,(o={})[\"ai.device.\"+\"id\"]=\"browser\",o[\"ai.device.type\"]=\"Browser\",o[\"ai.operation.name\"]=r&&r.pathname||\"_unknown_\",o[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(i||a),{time:(r=new Date).getUTCFullYear()+\"-\"+n(1+r.getUTCMonth())+\"-\"+n(r.getUTCDate())+\"T\"+n(r.getUTCHours())+\":\"+n(r.getUTCMinutes())+\":\"+n(r.getUTCSeconds())+\".\"+(r.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+\"Z\",iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:o,data:{baseData:{ver:2}},ver:undefined,seq:\"1\",aiDataContract:undefined};function n(e){e=\"\"+e;return 1===e.length?\"0\"+e:e}var i,a,r,o}var i,a,t,r,g=-1,h=0,m=[\"js.monitor.azure.com\",\"js.cdn.applicationinsights.io\",\"js.cdn.monitor.azure.com\",\"js0.cdn.applicationinsights.io\",\"js0.cdn.monitor.azure.com\",\"js2.cdn.applicationinsights.io\",\"js2.cdn.monitor.azure.com\",\"az416426.vo.msecnd.net\"],o=function(){return c(n,null)};function c(t,r){if((n=navigator)&&(~(n=(n.userAgent||\"\").toLowerCase()).indexOf(\"msie\")||~n.indexOf(\"trident/\"))&&~t.indexOf(\"ai.3\")&&(t=t.replace(/(\\/)(ai\\.3\\.)([^\\d]*)$/,function(e,t,n){return t+\"ai.2\"+n})),!1!==cfg.cr)for(var e=0;e<m.length;e++)if(0<t.indexOf(m[e])){g=e;break}var n,o=function(e){var a;l.queue=[],p||(0<=g&&h+1<m.length?(a=(g+h+1)%m.length,i(t.replace(/^(.*\\/\\/)([\\w\\.]*)(\\/.*)$/,function(e,t,n,i){return t+m[a]+i})),h+=1):(s=p=!0,d(t)))},c=function(e,t){p||setTimeout(function(){t&&!l.core&&o()},500),s=!1},i=function(e){var n,i=x.createElement(E),e=(cfg.pl?cfg.ttp&&cfg.ttp.createScript?i.src=cfg.ttp.createScriptURL(e):i.src=(null==(n=window.trustedTypes)?void 0:n.createPolicy(O,{createScriptURL:function(e){try{var t=new URL(e);if(t.host&&\"js.monitor.azure.com\"===t.host)return e;a(e)}catch(n){a(e)}}})).createScriptURL(e):i.src=e,cfg.nt&&i.setAttribute(\"nonce\",cfg.nt),r&&(i.integrity=r),i.setAttribute(\"data-ai-name\",A),cfg[b]);function a(e){d(\"AI policy blocked URL: \"+e)}return!e&&\"\"!==e||\"undefined\"==i[b]||(i[b]=e),i.onload=c,i.onerror=o,i.onreadystatechange=function(e,t){\"loaded\"!==i.readyState&&\"complete\"!==i.readyState||c(0,t)},cfg.ld&&cfg.ld<0?x.getElementsByTagName(\"head\")[0].appendChild(i):setTimeout(function(){x.getElementsByTagName(E)[0].parentNode.appendChild(i)},cfg.ld||0),i};i(t)}cfg.sri&&(i=n.match(/^((http[s]?:\\/\\/.*\\/)\\w+(\\.\\d+){1,5})\\.(([\\w]+\\.){0,2}js)$/))&&6===i.length?(T=\"\".concat(i[1],\".integrity.json\"),a=\"@\".concat(i[4]),S=window.fetch,t=function(e){if(!e.ext||!e.ext[a]||!e.ext[a].file)throw Error(\"Error Loading JSON response\");var t=e.ext[a].integrity||null;c(n=i[2]+e.ext[a].file,t)},S&&!cfg.useXhr?S(T,{method:\"GET\",mode:\"cors\"}).then(function(e){return e.json()[\"catch\"](function(){return{}})}).then(t)[\"catch\"](o):XMLHttpRequest&&((r=new XMLHttpRequest).open(\"GET\",T),r.onreadystatechange=function(){if(r.readyState===XMLHttpRequest.DONE)if(200===r.status)try{t(JSON.parse(r.responseText))}catch(e){o()}else o()},r.send())):n&&o();try{l.cookie=x.cookie}catch(w){}function e(e){for(;e.length;)!function(t){l[t]=function(){var e=arguments;s||l.queue.push(function(){l[t].apply(l,e)})}}(e.pop())}e(I);var v,y,S=!(l.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4}),T=(u.extensionConfig||{}).ApplicationInsightsAnalytics||{};return(S=!0!==u[C]&&!0!==T[C]||S)&&(e([\"_\"+(v=\"onerror\")]),y=k[v],k[v]=function(e,t,n,i,a){var r=y&&y(e,t,n,i,a);return!0!==r&&l[\"_\"+v]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:k.event}),r},u.autoExceptionInstrumented=!0),l}(cfg.cfg),(k[A]=e).queue&&0===e.queue.length?(e.queue.push(a),e.trackPageView({})):a();})({\n    src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n    // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n    // dle: true, // Prevent the SDK from reporting load failure log\n    crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n    // sri: false, // Custom optional value to specify whether fetching the snippet from integrity file and do integrity check \n    // pl: false, // Custom optional value to specify whether to enable the trusted type policy check on snippet\n    // pn: \"aiPolicy\", // Custom optional value to specify the name of the trusted type policy that would be implemented on the snippet, default is \"aiPolicy\"\n    // ttp: null, // Custom optional value to specify the trusted type policy that would be applied on the snippet src\n    // nt: null, // Custom optional value to specify the nounce tag value that would be applied on the script when we drop it on the page\n    cfg: { // Application Insights Configuration\n        connectionString: \"YOUR_CONNECTION_STRING\"\n    }\n});\n</script>\n```\n\n> :bulb: **Note**\n>\n> 1. For readability and to reduce possible JavaScript errors, all of the possible configuration options are listed on a new line in snippet code above, if you don't want to change the value of a commented line it can be removed.\n>\n> 2. ConnectionString format should follow \"InstrumentationKey=xxxx;....\" If the string provided does not meet this format, the sdk load process would fail\n\n#### Reporting Script load exceptions\n\nThis version of the snippet detects and reports an exception when loading the SDK from the CDN fails, this exception is reported to the Azure Monitor portal (under the failures &gt; exceptions &gt; browser), and provides visibility into failures of this type so that you are aware your application is not reporting telemetry (or other exceptions) as expected. This signal is an important measurement in understanding that you have lost telemetry because the SDK did not load or initialize, this provides clarity that you are missing the following telemetry:\n- Under-reporting of how users are using (or trying to use) your site;\n- Missing telemetry on how your end users are using your site;\n- Missing JavaScript errors that could potentially be blocking your end users from successfully using your site.\n\nFor details on this exception see [SDK Load Failure](https://microsoft.github.io/ApplicationInsights-JS/SdkLoadFailure) page.\n\nReporting of this failure as an exception to the portal does not use the configuration option ```disableExceptionTracking``` from the application insights configuration and therefore if this failure occurs it will always be reported by the snippet, even when the window.onerror support is disabled.\n\nReporting of SDK load exceptions is specifically NOT supported on IE 8 (or less). This assists with reducing the minified size of the snippet by assuming that most environments are not exclusively IE 8 or less. If you have this requirement and you wish to receive these exceptions, you will need to either include a fetch poly fill or create you own snippet version that uses ```XDomainRequest``` instead of ```XMLHttpRequest```, it is recommended that you use the [provided snippet source code](https://github.com/microsoft/ApplicationInsights-JS/blob/main/AISKU/snippet/snippet.js) as a starting point.\n\n> :bulb: **Note**\n>\n> If you are using a previous version of the snippet, it is highly recommended that you update to the latest version so that you will receive these previously unreported issues.\n\n#### [Snippet configuration options](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html)\n\nAll configuration options have now been move towards the end of the script to help avoid accidentally introducing JavaScript errors that would not just cause the SDK to fail to load, but also it would disable the reporting of the failure.\n\nEach configuration option is shown above on a new line, if you don't wish to override the default value of an item listed as [optional] you can  remove that line to minimize the resulting size of your returned page.\n\nThe available configuration options are: -\n\n| Name | Type | Description\n|------|------|----------------\n| [src](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#src) | string **[required]** | The full URL for where to load the SDK from. This value is used for the \"src\" attribute of a dynamically added &lt;script /&gt; tag. You can use the public CDN location or your own privately hosted one.\n| [name](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#name) | string *[optional]* | The global name for the initialized SDK, defaults to appInsights. So ```window.appInsights``` will be a reference to the initialized instance. Note: if you provide a name value or a previous instance appears to be assigned (via the global name appInsightsSDK) then this name value will also be defined in the global namespace as ```window.appInsightsSDK=<name value>```, this is required by the SDK initialization code to ensure it's initializing and updating the correct snippet skeleton and proxy methods.\n| [ld](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#ld) | number in ms *[optional]* | Defines the load delay to wait before attempting to load the SDK. Default value is 0ms and any negative value will immediately add a script tag to the &lt;head&gt; region of the page, which will then block the page load event until to script is loaded (or fails).\n| [useXhr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#useXhr) | boolean *[optional]* | This setting is used only for reporting SDK load failures. Reporting will first attempt to use fetch() if available and then fallback to XHR, setting this value to true just bypasses the fetch check. Use of this value is only be required if your application is being used in an environment where fetch would fail to send the failure events.\n| [crossOrigin](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#crossOrigin) | string *[optional]* | By including this setting, the script tag added to download the SDK will include the crossOrigin attribute with this string value. When not defined (the default) no crossOrigin attribute is added. Recommended values are not defined (the default); \"\"; or \"anonymous\" (For all valid values see [HTML attribute: crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin) documentation)\n| [onInit](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#onInit) | function(aiSdk) { ... } *[optional]* | This callback function which is called after the main SDK script has been successfully loaded and initialized from the CDN (based on the src value), it is passed a reference to the sdk instance that it is being called for and it is also called _before_ the first initial page view. If the SDK has already been loaded and initialized this callback will still be called. NOTE: As this callback is called during the processing of the sdk.queue array you CANNOT add any additional items to the queue as they will be ignored and dropped. (Added as part of snippet version 5 -- the sv:\"#\" value within the snippet script, the current version is 7)\n| [cfg](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#cfg) | object **[required]** | The [IConfiguration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html) passed to the Application Insights SDK during initialization.\n| [cr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#cr) | boolean *[optional]* | Controls CDN fallback retry behavior. By default (`true`), if the SDK fails to load from the configured `src` URL, the snippet automatically attempts to load from multiple supported CDN domains in case one or more of them is temporarily unavailable. Set to `false` to disable this fallback and only attempt the single configured `src` URL.\n| [sri](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#sri) | boolean *[optional]* | Custom optional value to specify whether to fetch the snippet from an integrity file and perform an integrity check. When this option is used, the integrity file is loaded first, affecting the load order and script execution. Hence the ld option will be ignored. Additionally, if the page navigates away before the integrity file is loaded, some events may be lost.\n| [dle](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#dle) | boolean *[optional]* | When set to `true`, prevents the SDK from reporting load failure telemetry.\n| [pl](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#pl) | boolean *[optional]* | Custom optional value to specify whether to enable the Trusted Type policy check on the snippet.\n| [pn](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#pn) | string *[optional]* | Custom optional value to specify the name of the Trusted Type policy that would be implemented on the snippet, default is 'aiPolicy'.\n| [ttp](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#ttp) | TrustedTypePolicy *[optional]* | Custom optional value to specify the Trusted Type policy that would be applied on the snippet src.\n| [nt](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web-snippet/interfaces/ISnippetConfig.html#nt) | string *[optional]* | Custom optional value to specify the nonce attribute value that will be applied to the script tag when it is added to the page.\n\n#### Internet Explorer: Automatic Version Fallback\n\n> **Important**: When the SDK Loader (snippet) detects that the page is being loaded by Internet Explorer (via the `msie` or `trident/` user agent strings), it will **automatically** rewrite the `src` URL to load the v2.x version of the SDK instead of v3.x. For example, `ai.3.gbl.min.js` will be changed to `ai.2.gbl.min.js`.\n>\n> This means that if your application uses the SDK Loader with a v3.x CDN URL and any of your users visit the page with Internet Explorer, they will receive the 2.x version of the SDK. As a result, **any APIs or features that are only available in v3.x or later — including the new OpenTelemetry-based APIs — will not exist** on the SDK instance for those users. Your code should account for this by checking for the existence of newer APIs before calling them, or by using only APIs that are available in both v2.x and v3.x.\n>\n> This fallback does **not** apply when using the NPM package directly, as NPM installations always load the specific version you have installed.\n\n#### Example using the snippet onInit callback\n\n```html\n<script type=\"text/javascript\">\n!function(T,l,y){<!-- Removed the Snippet code for brevity -->}(window,document,{\nsrc: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\ncrossOrigin: \"anonymous\",\nonInit: function (sdk) {\n  sdk.addTelemetryInitializer(function (envelope) {\n    envelope.data.someField = 'This item passed through my telemetry initializer';\n  });\n}, // Once the application insights instance has loaded and initialized this method will be called\ncfg: { // Application Insights Configuration\n    connectionString: \"YOUR_CONNECTION_STRING\"\n}});\n</script>\n```\n\n#### Active Public CDN endpoints\n\n> ## URGENT ACTION: Stop using az416426.vo.msecnd.net\n>\n> To avoid any global OUTAGE you MUST change ALL of your CDN usage from “https://az416426.vo.msecnd.net/scripts/..” to our primary CDN endpoint https://js.monitor.azure.com/scripts/...\n>\n> See/follow [Issue #2457](https://github.com/microsoft/ApplicationInsights-JS/issues/2457) for updated details\n>\n> We are currently investigating the available options on how we can avoid / migrate / mitigate this situation, but at this point it is **HIGHLY** likely that there will be either a temporary or permanent outage of this domain. As we currently have no known way to “migrate” this domain to a different CDN.\n\nTo help with global resiliency, we have added and updated our primary CDN endpoint (source URL) so that if required we can address any outages without the need for everyone to update the URL used by the Application Insights snippet within their application.\n\n~~All active CDN endpoints contain all of the previous (and future) versions of the SDK and there is currently no plans to stop or block accessing the snippet from the previous (legacy/backup) URL.~~\n\nDue to [Issue #2457](https://github.com/microsoft/ApplicationInsights-JS/issues/2457) we are now declaring that you MUST always use `js.monitor.azure.com` domain.\n\n\n| State | CDN Endpoint | Description\n|-------|--------------|--------------------\n| Primary | https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js | Provides additional resiliency, allowing us to redirect to a different CDN provider should there be an unexpected issue (if required).\n| ~~Legacy/Backup~~<br />:exclamation: ~~Deprecated~~ DO NOT USE | ~~https://az416426.vo.msecnd.net/scripts/b/ai.2.min.js~~ | ~~Due to the legacy nature of this URL / Domain, __if there is an unexpected issue (outage) with this domain, your application will need to be updated and deployed to use the new URL__.<br />:exclamation: Due to #1813 this URL is now being classified as Deprecated and we will be actively making changes to the SDK to warnings in your telemetry if we detect this domain being used.~~<br/>Due to [Issue #2457](https://github.com/microsoft/ApplicationInsights-JS/issues/2457) we are now declaring that you MUST always use `js.monitor.azure.com` domain.\n\n### Connection String Setup\n\nFor either the NPM or Snippet setup, you can also configure your instance of Application Insights using a Connection String. Simply replace the `instrumentationKey` field with the `connectionString` field.\n```js\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web'\n\nconst appInsights = new ApplicationInsights({ config: {\n  connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE'\n  /* ...Other Configuration Options... */\n} });\nappInsights.loadAppInsights();\nappInsights.trackPageView();\n```\n\n#### (Alternative Setup Method) Include AI JS SDK script and initialize statically\n\nUse this approach if you would like to host AI JS SDK script on your endpoint or bundle it with other scripts. \n```html\n<!-- use your own path to JS SDK script -->\n<script type=\"text/javascript\" src=\"/pathToAIJSSDK.js\"></script>\n```\nAfter JS script has loaded, include the following snippet to initialize Application Insights:\n\n```html\n<!-- the snippet below assumes that JS SDK script has already loaded -->\n<script type=\"text/javascript\">\n    var snippet = {\n        config: {\n            connectionString: \"InstrumentationKey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx\"\n        }\n    };\n    var init = new Microsoft.ApplicationInsights.ApplicationInsights(snippet);\n    var appInsights = init.loadAppInsights();\n    appInsights.trackPageView();\n</script>\n```\n\n### Sending Telemetry to the Azure Portal\n\nIf initialized using the snippet, your Application Insights instance is located by default at `window.appInsights`\n\n```js\nappInsights.trackEvent({name: 'some event'});\nappInsights.trackPageView({name: 'some page'});\nappInsights.trackPageViewPerformance({name : 'some page', url: 'some url'});\nappInsights.trackException({exception: new Error('some error')});\nappInsights.trackTrace({message: 'some trace'});\nappInsights.trackMetric({name: 'some metric', average: 42});\nappInsights.trackDependencyData({absoluteUrl: 'some url', responseCode: 200, method: 'GET', id: 'some id'});\nappInsights.startTrackPage(\"pageName\");\nappInsights.stopTrackPage(\"pageName\", null, {customePropertiesName: \"some value\"}, {customerMeasurementsName: 144});\nappInsights.startTrackEvent(\"event\");\nappInsights.stopTrackEvent(\"event\", null, {customePropertiesName: \"some value\"}, {customerMeasurementsName: 150});\nappInsights.flush();\n```\n\nCustom properties can be included in your telemetry through the `properties` named argument. This can be done with *any* of the Track APIs except stopTrackPage and stopTrackEvent.\n\n```js\nappInsights.trackEvent({\n  name: 'some event',\n  properties: { // accepts any type\n    prop1: 'string',\n    prop2: 123.45,\n    prop3: { nested: 'objects are okay too' }\n  }\n});\n```\n\nWhen using stopTrackPage and stopTrackEvent, you can pass in data categorized by types:\n\nStrings: These should be included under the properties field.\nNumbers: Add these under the measurements field.\nRemember, the order of the properties and measurements should not be altered. You can achieve this using the following code structure:\n\n```js\nappInsights.startTrackEvent(\"event name\"); \nappInsights.stopTrackEvent(\"event name\", {\n  stringProp1: 'string',\n  stringProp2: {nested: \"objects are okay too\", key: \"value\"} // In this example, stringProp2 will be sent as: \"stringProp2\": \"{\\\"nested\\\":\\\"objects are okay too\\\",\\\"key\\\":\\\"value\\\"}\".\n  },\n  {numProp1: 3.15, numProp2: 90000}\n)\n```\n\n### OpenTelemetry Tracing API\n\nThe Application Insights JavaScript SDK includes an **OpenTelemetry-compatible tracing API** that allows you to use familiar OpenTelemetry patterns for distributed tracing while automatically sending telemetry to Azure Application Insights.\n\n**Key Features:**\n- Use OpenTelemetry-like tracing APIs following industry-standard patterns\n- Automatic telemetry creation with full distributed tracing support\n- Parent-child span relationships for nested operations\n- Compatible with OpenTelemetry API specifications (tracing only)\n\n**Learn More:**\n\nFor comprehensive documentation on the OpenTelemetry tracing API, including tracer management, span utilities, helper functions, and detailed examples, see:\n\n- **[OpenTelemetry Tracing Documentation](https://microsoft.github.io/ApplicationInsights-JS/OTel/)** - Complete guide to OpenTelemetry-compatible tracing\n- **[startActiveSpan Helper](https://microsoft.github.io/ApplicationInsights-JS/OTel/startActiveSpan)** - Recommended method for creating spans with automatic lifecycle management\n- **[withSpan Helper](https://microsoft.github.io/ApplicationInsights-JS/OTel/withSpan)** - Execute code with existing span as active context\n- **[Trace API Reference](https://microsoft.github.io/ApplicationInsights-JS/OTel/traceApi)** - Tracer management and span utilities\n- **[Examples Guide](https://microsoft.github.io/ApplicationInsights-JS/OTel/examples)** - Comprehensive usage examples and patterns\n\n**Note:** This is an OpenTelemetry-compatible tracing API implementation, not a full OpenTelemetry SDK. Only tracing APIs are supported (metrics and logs APIs are not included).\n\n### Setting Up Autocollection\n\nAll autocollection is ON by default. The full version of the Application Insights Javascript SDK auto collects:\n\n- **Uncaught exceptions** in your app, including information on\n  - Stack trace\n  - Exception details and message accompanying the error\n  - Line & column number of error\n  - URL where error was raised\n- **Network Dependency Requests** made by your app **XHR** and **Fetch** (fetch collection is enabled by default) requests, include information on\n  - Url of dependency source\n  - Command & Method used to request the dependency\n  - Duration of the request\n  - Result code and success status of the request\n  - ID (if any) of user making the request\n  - Correlation context (if any) where request is made\n- **User information** (e.g. Location, network, IP)\n- **Device information** (e.g. Browser, OS, version, language, model)\n- **Session information**\n\n### Telemetry Initializers\n\nTelemetry initializers are used to modify the contents of collected telemetry before being sent from the user's browser. They can also be used to prevent certain telemetry from being sent, by returning `false`. Multiple telemetry initializers can be added to your Application Insights instance, and they are executed in order of adding them.\n\nThe input argument to `addTelemetryInitializer` is a callback that takes a [`ITelemetryItem`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#addTelemetryInitializer) as an argument and returns a `boolean` or `void`. If returning `false`, the telemetry item is not sent, else it proceeds to the next telemetry initializer, if any, or is sent to the telemetry collection endpoint.\n\n#### Example: [Setting Cloud Role Name](https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-map#set-cloud-role-name)\n\n```js\nvar telemetryInitializer = (envelope) => {\n  envelope.tags[\"ai.cloud.role\"] = \"your role name\";\n  envelope.tags[\"ai.cloud.roleInstance\"] = \"your role instance\";\n}\nappInsights.addTelemetryInitializer(telemetryInitializer);\n```\n\n#### Example: Filtering\n\n```js\nvar telemetryInitializer = (envelope) => {\n  envelope.data.someField = 'This item passed through my telemetry initializer';\n};\nappInsights.addTelemetryInitializer(telemetryInitializer);\nappInsights.trackTrace({message: 'This message will use a telemetry initializer'});\n\nappInsights.addTelemetryInitializer(() => false); // Nothing is sent after this is executed\nappInsights.trackTrace({message: 'this message will not be sent'}); // Not sent\n```\n\n### Dependency Listeners\n\nA [dependency listener is a callback function](https://microsoft.github.io/ApplicationInsights-JS/API-reference#addDependencyListener) that allows you to perform additional manipulation of the request details before the request is performed.\n\nThis includes :-\n\n- Complete access to either the XMLHttpRequest instance or the fetch API `input` and `init` arguments.\n- Ability to get/set the properties used to generate the W3C `traceparent` header (`traceId`, `spanId, `traceFlags)\n- Set values in the object context container for other listeners called after the current one, as well as this context object is also made available to all dependency initializers.\n\n### Dependency Initializers\n\nA [Dependency Initializer is very similar](https://microsoft.github.io/ApplicationInsights-JS/API-reference#addDependencyInitializer) to a [Telemetry Initializer](https://github.com/Microsoft/ApplicationInsights-JS#telemetry-initializers) in that it allows you modify the contents of collected telemetry before being sent from the user's browser. And you can also returning `false` to cause the event to not be emitted.\n\nThe differences between a telemetry initializer and a dependency initializer are :-\n- A Dependency Initializer is called \"before\" the event is processed by the pipeline, as such it will NOT (yet) contain the automatically populated properties that are applied later;\n- When a dependency initializer returns `false` to drop the event the event does NOT count against the `maxAjaxCallsPerView` as this blocks the event call from being tracked, and while returning `false` from a [Telemetry Initializer](https://github.com/Microsoft/ApplicationInsights-JS#telemetry-initializers) will also stop the event from being reported because this is further down the processing pipeline the dependency event IS counted against the `maxAjaxCallsPerView` limit.\n- It has access to an optional \"context\" `{ [key: string]: any }` object that is also available to the Dependency Listeners. This allows a listener to add additional details to the context (before the XHR/fetch request is sent), and the initializer will be called after the request has completed.\n\n### Advanced Setting Using Config/Extensions\n- [How to add more details in my Exception Telemetry?](https://microsoft.github.io/ApplicationInsights-JS/exceptionTelemetry) \n\n\n## [Configuration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html)\n\nMost configuration fields are named such that they can be defaulted to falsey. All fields are optional except for `instrumentationKey` or a `connectionString` containing the instrumentation key.\n\n| Name | Type | Default | Description |\n|------|------|---------|-------------|\n| [instrumentationKey](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#instrumentationKey) | string<br>[**Required if `connectionString` not supplied**]| null | Instrumentation key that you obtained from the Azure Portal. |\n| [connectionString](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#connectionString) | string<br>[**Require if `instrumentationKey` not supplied**] | null | The Connection string that you obtained from the Azure portal |\n| [accountId](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#accountId) | string | null | An optional account id, if your app groups users into accounts. No spaces, commas, semicolons, equals, or vertical bars |\n| [sessionRenewalMs](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#sessionRenewalMs) | numeric | 1800000 | A session is logged if the user is inactive for this amount of time in milliseconds. Default is 30 minutes |\n| [sessionExpirationMs](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#sessionExpirationMs) | numeric | 86400000 | A session is logged if it has continued for this amount of time in milliseconds. Default is 24 hours |\n| [maxBatchSizeInBytes](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#maxBatchSizeInBytes) | numberic | 10000 | Max size of telemetry batch. If a batch exceeds this limit, it is immediately sent and a new batch is started |\n| [maxBatchInterval](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#maxBatchInterval) | numeric | 15000 | How long to batch telemetry for before sending (milliseconds) |\n| [disableExceptionTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableExceptionTracking) | boolean || false | If true, exceptions are not autocollected. Default is false. |\n| [disableTelemetry](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableTelemetry) | boolean | false | If true, telemetry is not collected or sent. Default is false. |\n| [enableDebug](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#enableDebug) | boolean | false | If true, **internal** debugging data is thrown as an exception **instead** of being logged, regardless of SDK logging settings. Default is false. <br>***Note:*** Enabling this setting will result in dropped telemetry whenever an internal error occurs. This can be useful for quickly identifying issues with your configuration or usage of the SDK. If you do not want to lose telemetry while debugging, consider using `loggingLevelConsole` or `loggingLevelTelemetry` instead of `enableDebug`.\n| enableDebugExceptions | boolean | false | Removed from v3.x, Prior to v2.8.12 this was the only supported value and the documented `enableDebug` was incorrect, since v2.8.12 both `enableDebug` and `enableDebugExceptions` is supported.\n| [loggingLevelConsole](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#loggingLevelConsole) | numeric | 0 | Logs **internal** Application Insights errors to console. <br>0: off, <br>1: Critical errors only, <br>2: Everything (errors & warnings) |\n| [loggingLevelTelemetry](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#loggingLevelTelemetry) | numeric | 1 | Sends **internal** Application Insights errors as telemetry. <br>0: off, <br>1: Critical errors only, <br>2: Everything (errors & warnings) |\n| [diagnosticLogInterval](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#diagnosticLogInterval) | numeric | 10000 | (internal) Polling interval (in ms) for internal logging queue |\n| [samplingPercentage](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#samplingPercentage) | numeric | 100 | Percentage of events that will be sent. Default is 100, meaning all events are sent. Set this if you wish to preserve your datacap for large-scale applications. |\n| [autoTrackPageVisitTime](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#autoTrackPageVisitTime) | boolean | false | If true, on a pageview, the _previous_ instrumented page's view time is tracked and sent as telemetry and a new timer is started for the current pageview. It is sent as a custom metric named `PageVisitTime` in `milliseconds` and is calculated via the Date [now()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now) function (if available) and falls back to (new Date()).[getTime()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime) if now() is unavailable (IE8 or less). Default is false. |\n| [disableAjaxTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableAjaxTracking) | boolean | false | If true, Ajax calls are not autocollected. Default is false. |\n| [disableFetchTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableFetchTracking) | boolean | false | If true, Fetch requests are not autocollected. Default is false (Since v2.8.0, previously true) |\n| [excludeRequestFromAutoTrackingPatterns](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#excludeRequestFromAutoTrackingPatterns) | string[] \\| RegExp[] | undefined | Provide a way to exclude specific route from automatic tracking for XMLHttpRequest or Fetch request. If defined, for an ajax / fetch request that the request url matches with the regex patterns, auto tracking is turned off. Default is undefined. |\n| [addRequestContext](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#addRequestContext) | (requestContext: IRequestionContext) => {[key: string]: any} | undefined | Provide a way to enrich dependencies logs with context at the beginning of api call. Default is undefined. You will need to check if `xhr` exists if you configure `xhr` related conetext. You will need to check if `fetch request` and `fetch response` exist if you configure `fetch` related context. Otherwise you may not get the data you need. |\n| [overridePageViewDuration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#overridePageViewDuration) | boolean | false | If true, default behavior of trackPageView is changed to record end of page view duration interval when trackPageView is called. If false and no custom duration is provided to trackPageView, the page view performance is calculated using the navigation timing API. Default is false. |\n| [maxAjaxCallsPerView](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#maxAjaxCallsPerView) | numeric | 500 | Default 500 - controls how many ajax calls will be monitored per page view. Set to -1 to monitor all (unlimited) ajax calls on the page. |\n| [disableDataLossAnalysis](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableDataLossAnalysis) | boolean | true | If false, internal telemetry sender buffers will be checked at startup for items not yet sent. |\n| [disableCorrelationHeaders](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableCorrelationHeaders) | boolean | false | If false, the SDK will add two headers ('Request-Id' and 'Request-Context') to all dependency requests to correlate them with corresponding requests on the server side. Default is false. |\n| [correlationHeaderExcludedDomains](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#correlationHeaderExcludedDomains) | string[] | undefined | Disable correlation headers for specific domains |\n| [correlationHeaderExcludePatterns](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#correlationHeaderExcludePatterns) | regex[] | undefined | Disable correlation headers using regular expressions |\n| [correlationHeaderDomains](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#correlationHeaderDomains) | string[] | undefined | Enable correlation headers for specific domains |\n| [disableFlushOnBeforeUnload](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableFlushOnBeforeUnload) | boolean | false | Default false. If true, flush method will not be called when onBeforeUnload event triggers |\n| [enableSessionStorageBuffer](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableSessionStorageBuffer) | boolean | true | Default true. If true, the buffer with all unsent telemetry is stored in session storage. The buffer is restored on page load |\n| [cookieCfg](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#cookieCfg) | [ICookieCfgConfig](#ICookieMgrConfig)<br>[Optional]<br>(Since 2.6.0) | undefined | Defaults to cookie usage enabled see [ICookieCfgConfig](#ICookieMgrConfig) settings for full defaults. |\n| [~~isCookieUseDisabled~~<br>disableCookiesUsage](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableCookiesUsage) | alias for [`cookieCfg.enabled`](#ICookieMgrConfig)<br>[Optional] | false | Default false. A boolean that indicates whether to disable the use of cookies by the SDK. If true, the SDK will not store or read any data from cookies. isCookieUseDisable is deprecated in favor of disableCookiesUsage, when both are provided disableCookiesUsage take precedence.<br>(Since v2.6.0) If `cookieCfg.enabled` is defined it will take precedence over these values, Cookie usage can be re-enabled after initialization via the core.getCookieMgr().setEnabled(true). |\n| [cookieDomain](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#cookieDomain) | alias for [`cookieCfg.domain`](#ICookieMgrConfig)<br>[Optional] | null | Custom cookie domain. This is helpful if you want to share Application Insights cookies across subdomains.<br>(Since v2.6.0) If `cookieCfg.domain` is defined it will take precedence over this value. |\n| [cookiePath](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#cookiePath) | alias for [`cookieCfg.path`](#ICookieMgrConfig)<br>[Optional]<br>(Since 2.6.0) | null | Custom cookie path. This is helpful if you want to share Application Insights cookies behind an application gateway.<br>If `cookieCfg.path` is defined it will take precedence over this value.  |\n| [isRetryDisabled](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#isRetryDisabled) | boolean | false | Default false. If false, retry on 206 (partial success), 408 (timeout), 429 (too many requests), 500 (internal server error), 503 (service unavailable), and 0 (offline, only if detected) |\n| [isStorageUseDisabled](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#isStorageUseDisabled) | boolean | false | If true, the SDK will not store or read any data from local and session storage. Default is false. |\n| [isBeaconApiDisabled](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#isBeaconApiDisabled) | boolean | true | If false, the SDK will send all telemetry using the [Beacon API](https://www.w3.org/TR/beacon) |\n| [disableXhr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableXhr) | boolean | false | Don't use XMLHttpRequest or XDomainRequest (for IE < 9) by default instead attempt to use fetch() or sendBeacon. If no other transport is available it will still use XMLHttpRequest |\n| [onunloadDisableBeacon](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#onunloadDisableBeacon) | boolean | false | Default false. when tab is closed, the SDK will send all remaining telemetry using the [Beacon API](https://www.w3.org/TR/beacon) |\n| [onunloadDisableFetch](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#onunloadDisableFetch) | boolean | false | If fetch keepalive is supported do not use it for sending events during unload, it may still fallback to fetch() without keepalive |\n| [sdkExtension](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#sdkExtension) | string | null | Sets the sdk extension name. Only alphabetic characters are allowed. The extension name is added as a prefix to the 'ai.internal.sdkVersion' tag (e.g. 'ext_javascript:2.0.0'). Default is null. |\n| [isBrowserLinkTrackingEnabled](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#isBrowserLinkTrackingEnabled) | boolean | false | Default is false. If true, the SDK will track all [Browser Link](https://docs.microsoft.com/en-us/aspnet/core/client-side/using-browserlink) requests. |\n| [appId](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#appId) | string | null | AppId is used for the correlation between AJAX dependencies happening on the client-side with the server-side requests. When Beacon API is enabled, it cannot be used automatically, but can be set manually in the configuration. Default is null |\n| [enableCorsCorrelation](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableCorsCorrelation) | boolean | false | If true, the SDK will add two headers ('Request-Id' and 'Request-Context') to all CORS requests to correlate outgoing AJAX dependencies with corresponding requests on the server side. Default is false |\n| [namePrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#namePrefix) | string | undefined | An optional value that will be used as name postfix for localStorage and session cookie name.\n| [sessionCookiePostfix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#sessionCookiePostfix) | string | undefined | An optional value that will be used as name postfix for session cookie name. If undefined, namePrefix is used as name postfix for session cookie name.\n| [userCookiePostfix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#userCookiePostfix) | string | undefined | An optional value that will be used as name postfix for user cookie name. If undefined, no postfix is added on user cookie name.\n| [enableAutoRouteTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableAutoRouteTracking) | boolean | false | Automatically track route changes in Single Page Applications (SPA). If true, each route change will send a new Pageview to Application Insights. Hash route changes changes (`example.com/foo#bar`) are also recorded as new page views.\n| [enableRequestHeaderTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableRequestHeaderTracking) | boolean | false | If true, AJAX & Fetch request headers is tracked, default is false. If ignoreHeaders is not configured, Authorization and X-API-Key headers are not logged.\n| [enableResponseHeaderTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableResponseHeaderTracking) | boolean | false | If true, AJAX & Fetch request's response headers is tracked, default is false. If ignoreHeaders is not configured, WWW-Authenticate header is not logged.\n| [enableAjaxErrorStatusText](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableAjaxErrorStatusText) | boolean | false | Default false. If true, include response error data text | boolean in dependency event on failed AJAX requests.\n| [enableAjaxPerfTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableAjaxPerfTracking) | boolean | false | Default false. Flag to enable looking up and including additional browser window.performance timings in the reported ajax (XHR and fetch) reported metrics.\n| [maxAjaxPerfLookupAttempts](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#maxAjaxPerfLookupAttempts) | numeric | 3 | Defaults to 3. The maximum number of times to look for the window.performance timings (if available), this is required as not all browsers populate the window.performance before reporting the end of the XHR request and for fetch requests this is added after its complete.\n| [ajaxPerfLookupDelay](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#ajaxPerfLookupDelay) | numeric | 25 | Defaults to 25ms. The amount of time to wait before re-attempting to find the windows.performance timings for an ajax request, time is in milliseconds and is passed directly to setTimeout().\n| [distributedTracingMode](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#distributedTracingMode) | numeric or `DistributedTracingModes` | `DistributedTracingModes.AI_AND_W3C` | Sets the distributed tracing mode. If AI_AND_W3C mode or W3C mode is set, W3C trace context headers (traceparent/tracestate) will be generated and included in all outgoing requests. AI_AND_W3C is provided for back-compatibility with any legacy Application Insights instrumented services.\n| [enableUnhandledPromiseRejectionTracking](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#enableUnhandledPromiseRejectionTracking) | boolean | false | If true, unhandled promise rejections will be autocollected and reported as a javascript error. When disableExceptionTracking is true (dont track exceptions) the config value will be ignored and unhandled promise rejections will not be reported.\n| [disableInstrumentationKeyValidation](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#disableInstrumentationKeyValidation) | boolean | false | If true, instrumentation key validation check is bypassed. Default value is false.\n| [enablePerfMgr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#enablePerfMgr) | boolean | false | [Optional] When enabled (true) this will create local perfEvents for code that has been instrumented to emit perfEvents (via the doPerf() helper). This can be used to identify performance issues within the SDK based on your usage or optionally within your own instrumented code. [More details are available by the basic documentation](https://microsoft.github.io/ApplicationInsights-JS/PerformanceMonitoring). Since v2.5.7\n| [perfEvtsSendAll](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#perfEvtsSendAll) | boolean | false | [Optional] When _enablePerfMgr_ is enabled and the [IPerfManager](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IPerfManager.html) fires a [INotificationManager](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/INotificationManager.html).perfEvent() this flag determines whether an event is fired (and sent to all listeners) for all events (true) or only for 'parent' events (false &lt;default&gt;).<br />A parent [IPerfEvent](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IPerfEvent.html) is an event where no other IPerfEvent is still running at the point of this event being created and it's _parent_ property is not null or undefined. Since v2.5.7\n| [createPerfMgr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#createPerfMgr) | (core: IAppInsightsCore, notificationManager: INotificationManager) => IPerfManager | undefined | Callback function that will be called to create a the IPerfManager instance when required and ```enablePerfMgr``` is enabled, this enables you to override the default creation of a PerfManager() without needing to ```setPerfMgr()``` after initialization.\n| [idLength](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#idLength) | numeric | 22 | [Optional] Identifies the default length used to generate new random session and user id's. Defaults to 22, previous default value was 5 (v2.5.8 or less), if you need to keep the previous maximum length you should set this value to 5.\n| [customHeaders](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#customHeaders) | `[{header: string, value: string}]` | undefined | [Optional] The ability for the user to provide extra headers when using a custom endpoint. customHeaders will not be added on browser shutdown moment when beacon sender is used. And adding custom headers is not supported on IE9 or earlier.\n| [convertUndefined](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#convertUndefined) | `any` | undefined | [Optional] Provide user an option to convert undefined field to user defined value.\n| [eventsLimitInMem](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#eventsLimitInMem) | number | 10000 | [Optional] The number of events that can be kept in memory before the SDK starts to drop events when not using Session Storage (the default).\n| [disableIkeyDeprecationMessage](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#disableIkeyDeprecationMessage) | boolean | true | [Optional]  Disable instrumentation Key deprecation error message. If true, error message will NOT be sent. **Note: instrumentation key support will end soon**, see aka.ms/IkeyMigrate for more details.\n| [bufferOverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#bufferOverride) <br/><sub>since 2.8.12</sub> | IStorageBuffer | undefined | [Optional] Identifies a simple interface to allow you to override the storage mechanism used for tracking unsent and unacknowledged events, when not provided defaults to using SessionStorage interface. You MUST supply both the `getItem` and `setItem` functions when defined.\n| [storagePrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#storagePrefix) | string[] | undefined | [Optional] An optional value that will be added as name prefix for storage name. |\n| [featureOptIn](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#featureOptIn) (#feature)<br/><sub>since 3.0.3</sub> | IFeatureOptIn | undefined | [Optional]  Set Feature opt in details. |\n| [throttleMgrCfg](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfig.html#throttleMgrCfg) <br/><sub>since 3.0.3</sub> | `{[key: number]: IThrottleMgrConfig}` | undefined | [Optional]  Set throttle mgr configuration by key. |\n| retryCodes | number[] | undefined | Identifies the status codes that will cause event batches to be resent, when `null` or `undefined` the SDK will use it's defaults `[401, 408, 429, 500, 502, 503, 504]`. `403` was removed in version 3.1.1. |\n| [disablePageUnloadEvents](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#disablePageUnloadEvents) | string[] | undefined | [Optional] An array of the page unload events that you would like to be ignored. [See detailed documentation](https://microsoft.github.io/ApplicationInsights-JS/PageUnloadEvents.html). Unload events include \"beforeunload\", \"unload\", \"visibilitychange\" (with 'hidden' state) and \"pagehide\". This can be used to avoid jQuery 3.7.1+ deprecation warnings by configuring as `disablePageUnloadEvents: [\"unload\"]`. |\n| [disablePageShowEvents](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#disablePageShowEvents) | string[] | undefined | [Optional] An array of page show events that you would like to be ignored. [See detailed documentation](https://microsoft.github.io/ApplicationInsights-JS/PageUnloadEvents.html). Page Show events include \"pageshow\" and \"visibilitychange\" (with 'visible' state). |\n| [expCfg](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#expCfg) <br/><sub>since 3.3.1</sub>| [`IExceptionConfig`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IExceptionConfig.html) | undefined | Set additional configuration for exceptions, such as more scripts to include in the exception telemetry. |\n| [redactQueryParams](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#redactQueryParams) | string[] | `[\"sig\", \"Signature\", \"AWSAccessKeyId\", \"X-Goog-Signature\"]` | [Optional] Extends the list of query parameter names that are automatically replaced with `\"REDACTED\"` when `redactUrls` is enabled. Use this to mask application-specific tokens such as `auth_token` or `api_key`. |\n| [redactUrls](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html#redactUrls) | boolean | true | [Optional] Controls whether URL fields processed by the SDK have credentials and sensitive query-string values removed via the built-in field redaction helper. Set to `false` only if you explicitly want to send the original URL without masking. |\n\n### Page Unload and Visibility Event Handling\n\nApplication Insights SDK uses page lifecycle events to reliably send telemetry data before your page closes or navigates away. These events are essential for ensuring no telemetry data is lost during navigation, page refreshes, or tab/browser closures.\n\n**What these configurations do:**\n- Control which browser events the SDK uses to detect when the browser is about to unload, navigate away, become unresponsive, or get hibernated (especially on mobile)\n- Ensure all batched events are sent and not lost due to the browser closing or the user navigating away\n- Affect ALL telemetry types (page views, events, dependencies, exceptions, etc.)\n- Allow you to avoid deprecated event warnings (from jQuery 3.7.1+ or Chrome) while maintaining functionality\n\n**About visibility state:**\nWhen a browser tab becomes hidden (switching to another tab) or visible (returning to the tab), the browser fires \"visibilitychange\" events with document.visibilityState changing to \"hidden\" or \"visible\". The SDK uses these events to optimize telemetry sending.\n\n```js\nconst appInsights = new ApplicationInsights({\n  config: {\n    connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE',\n    // Disable the deprecated 'unload' event to avoid jQuery 3.7.1+ deprecation warnings\n    // This also prevents Chrome's warnings about the unload event\n    disablePageUnloadEvents: [\"unload\"],\n    /* ...Other Configuration Options... */\n  }\n});\nappInsights.loadAppInsights();\nappInsights.trackPageView();\n```\n\nFor more detailed information about browser compatibility and configuration options, see the [Page Unload Events documentation](https://microsoft.github.io/ApplicationInsights-JS/PageUnloadEvents.html).\n\n### Feature\n\nYou can use the `featureOptIn` configuration to enable or customize specific SDK features.\n\n#### Available Feature Flags\n\n| Name        | Default | Description                                  | Note |\n|-------------|---------|----------------------------------------------|------------|\n| `zipPayload` | `none`*(version 3.3.7)  | Enables compression using the Compression API to zip telemetry payloads. |If this feature is turned on and the CompressionStream API is available, the payload will be compressed using the CompressionStream API. Compression will only occur if the event is asynchronous. For events like unloads, compression will not be applied. Note: if user set payloadPreprocessor, this zip compression will not be applied.|\n\n* A default value of none means the SDK may automatically enable this feature in the future. To explicitly prevent this, set the feature to disable using FeatureOptInMode.disable.\n\n#### How to Enable a Feature\n\nTo enable a feature such as `zipPayload`, set the `featureOptIn` property in the SDK configuration as shown below:\n\n```javascript\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: \"YOUR_CONNECTION_STRING\",\n        // Other configuration options...\n        featureOptIn: {\n            zipPayload: {\n                mode: FeatureOptInMode.enable, // Set the opt-in status for the feature\n                blockCdnCfg: false,             // Define whether to block changes from CDN config\n            } as IFeatureOptInDetails\n        }\n    }\n});\n```\nSee [feature opt-in status](https://microsoft.github.io/ApplicationInsights-JS/WebConfig) for more details.\n\n\n### ExtensionConfig\n\n`extensionConfig` should be initialized under the specific extension rather than being defined in the root configuration. This allows for more granular configuration tailored to each extension's needs.\n\nFor instance, to configure the dependencies plugin, you would initialize it as follows:\n\n```js\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n        extensionConfig: {\n            [DependenciesPlugin.identifier]: {\n                ignoreHeaders: []\n            }\n        }\n    }\n});\n```\n\n| Name | Type | Default | Extenstion | Description |\n|------|------|---------|---------|-------------|\n| [ignoreHeaders](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependenciesPluginConfig.html#ignoreHeaders) | string[] | [\"Authorization\", \"X-API-Key\", \"WWW-Authenticate\"] | DependenciesPlugin | AJAX & Fetch request and response headers to be ignored in log data. To override or discard the default, add an array with all headers to be excluded or an empty array to the configuration. Need to be defined in depenedency plugin extension config, see more [here](./extensions/applicationinsights-dependencies-js/README.md)\n\n### [ICookieMgrConfig](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html)\n\nCookie Configuration for instance based cookie management added in version 2.6.0.\n\n| Name | Type | Default | Description |\n|------|------|---------|-------------|\n| [enabled](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#enabled) | boolean | true | A boolean that indicates whether the use of cookies by  the SDK is enabled by the current instance. If false, the instance of the SDK initialized by this configuration will not store or read any data from cookies |\n| [domain](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#domain) | string | null | Custom cookie domain. This is helpful if you want to share Application Insights cookies across subdomains. If not provided uses the value from root `cookieDomain` value. |\n| [path](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#path) | string | / | Specifies the path to use for the cookie, if not provided it will use any value from the root `cookiePath` value. |\n| [ignoreCookies](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#ignoreCookies) | string[] | undefined | Specify the cookie name(s) to be ignored, this will cause any matching cookie name to never be read or written. They may still be explicitly purged or deleted. You do not need to repeat the name in the `blockedCookies` configuration.(Since v2.8.8)\n| [blockedCookies](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#blockedCookies) | string[] | undefined | Specify the cookie name(s) to never be written, this will cause any cookie name to never be created or updated, they will still be read unless also included in the ignoreCookies and may still be explicitly purged or deleted. If not provided defaults to the same list provided in ignoreCookies. (Since v2.8.8)\n| [getCookie](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#getCookie) | `(name: string) => string` | null | Function to fetch the named cookie value, if not provided it will use the internal cookie parsing / caching. |\n| [setCookie](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#setCookie) | `(name: string, value: string) => void` | null | Function to set the named cookie with the specified value, only called when adding or updating a cookie. |\n| [delCookie](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ICookieMgrConfig.html#delCookie) | `(name: string, value: string) => void` | null | Function to delete the named cookie with the specified value, separated from setCookie to avoid the need to parse the value to determine whether the cookie is being added or removed.if not provided it will use the internal cookie parsing / caching. |\n\n## Cookie Handling\n\nFrom version 2.6.0, cookie management is now available directly from the instance and can be disabled and re-enabled after initialization.\n\nIf disabled during initialization via the `disableCookiesUsage` or `cookieCfg.enabled` configurations, you can now re-enable via the [ICookieMgr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html) `setEnabled` function.\n\nThe instance based cookie management also replaces the previous CoreUtils global functions of `disableCookies()`, `setCookie(...)`, `getCookie(...)` and `deleteCookie(...)`. And to benefit from the tree-shaking enhancements also introduced as part of version 2.6.0 you should no longer uses the global functions.\n\n### Simplified Usage of new instance Cookie Manager\n\n**General Guidance**\n\nWhen calling `getCookieMgr()` before the SDK has successfully initialized will return a temporary `ICookieMgr` instance that will have cookie support fully enabled, thus allowing the getting, setting and deleting of cookies. So unless you know that your configuration WILL ALLOW cookie usage you should delay accessing or using the cookie manager until after initialization.\n\n- appInsights.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).setEnabled(true/false)\n- appInsights.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).set(\"MyCookie\", \"thevalue\");\n- appInsights.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).get(\"MyCookie\");\n- appInsights.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).del(\"MyCookie\");\n\n> In v2.6.0 the `getCookieMgr()` is not directly available on the main entry points documented above for the snippet, NPM (`ApplicationInsights`) or React Plugin usages. As a workaround for this version you will need to access it via the `core` or `appInsights` properties as below (the `getCookieMgr()` will be available in later versions)\n>\n>- appInsights.**core.**[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).xxxxx\n>- appInsights.**appInsights.**[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).xxxxx\n\n**Snippet usage notes**\n\nThe `getCookieMgr()` method, `core` and `appInsights` properties are only available AFTER the SDK has been successfully loaded and initialized.\n\nSo you will need to only call or access the manager from within the onInit() callback function (available in snippet (v5) or above) or after you know that the SDK has been loaded and initialized, otherwise you will cause an exception, unless you also perform an existence check of the property or function.\n\n>**Additional Legacy snippet users for v2.6.0**\n>\n>If you are using a legacy snippet for your application (it is suggested that you upgrade), you will need to use the following options\n>\n>- appInsights.**core.**[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).xxxxx\n>- appInsights.**appInsights.core.**[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).xxxxx\n>- appInsights.**appInsightsNew.**[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).xxxxx\n\n## Tree-Shaking Support and enhancements\n\nAs part of changes being introduced in version 2.6.0 we are deprecating and removing the *internal* usages of the static helper classes `CoreUtils`, `EventHelper`, `Util`, `UrlHelper`, `DateTimeUtils` and `ConnectionStringParser` to provide better support for tree-shaking algorithms so that unused code can be safely dropped when using NPM packages.\n\n[See Tree-Shaking Recommendations](TreeShakingRecommendations.md)\n\n## Service Notification\n\nAs part of changes being introduced in version 3.0.3, we are intergrating [cfgSync plugin](https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-cfgsync-js) and [throttle manager](https://microsoft.github.io/ApplicationInsights-JS/ThrottleMgr) to AISKU.\nFor versions before 3.1.2, these components are disabled by default.\n\nFor versions after 3.1.2, these components are **turned on by default**.\nSee [feature opt-in status](https://microsoft.github.io/ApplicationInsights-JS/WebConfig) for more details.\n\nFor users behind a firewall, see [how to disable fetching from default CfgSync CDN](https://microsoft.github.io/ApplicationInsights-JS/WebConfig#basic-usage).\n\n## Single Page Applications\n\nBy default, this SDK will **not** handle state based route changing that occurs in single page applications. To enable automatic route change tracking for your single page application, you can add `enableAutoRouteTracking: true` to your setup configuration.\n\nCurrently, we support a separate [React plugin](#available-extensions-for-the-sdk) which you can initialize with this SDK. It will also accomplish route change tracking for you, as well as collect [other React specific telemetry](https://github.com/microsoft/applicationinsights-react-js).\n\n## Source Map Support\n\nThe minified callstack of your exception telemetry can be unminified in the Azure Portal. All existing integrations on the Exception Details panel will work with the newly unminified callstack. Drag and drop source map unminifying supports all existing and future JS SDKs (+Node.JS), so you do not need to upgrade your SDK version. To view your unminified callstack,\n1. Select an Exception Telemetry item in the Azure Portal to view its \"End-to-end transaction details\"\n2. Identify which source maps correspond to this call stack. The source map must match a stack frame's source file, but suffixed with `.map`\n3. Drag and drop the source maps onto the call stack in the Azure Portal\n![](https://i.imgur.com/Efue9nU.gif)\n\n## Examples\n\nFor runnable examples, see [Application Insights Javascript SDK Samples](https://github.com/topics/applicationinsights-js-demo)\n\n## Application Insights Web Basic\n\nFor a lightweight experience, you can instead install the basic version of Application Insights\n```\nnpm i --save @microsoft/applicationinsights-web-basic\n```\nThis version comes with the bare minimum amount of features and functionalities and relies on you to build it up as you see fit. For example, it performs no auto-collection (uncaught exceptions, ajax, etc). The APIs to send certain telemetry types, like `trackTrace`, `trackException`, etc, are not included in this version, so you will need to provide your own wrapper. The only api that is available is `track`. A [sample](https://github.com/Azure-Samples/applicationinsights-web-sample1/blob/master/testlightsku.html) is located here.\n\n## Available extensions for the SDK\n\n\n| Extensions    | NPM Version \n|---------------|-------------\n| [Angular](https://github.com/microsoft/applicationinsights-angularplugin-js) | [![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-angularplugin-js.svg)](https://www.npmjs.com/package/@microsoft/applicationinsights-angularplugin-js)\n| [React](https://github.com/microsoft/applicationinsights-react-js) | [![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-react-js.svg)](https://www.npmjs.com/package/@microsoft/applicationinsights-react-js)\n| [React Native](https://github.com/microsoft/applicationinsights-react-native) | [![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-react-native.svg)](https://www.npmjs.com/package/@microsoft/applicationinsights-react-native)\n\nClick here for a [Type Error Fixed Guideline](https://microsoft.github.io/ApplicationInsights-JS/ExtensionErrorSteps)\n\n## Notification\n\n### Error Handler\n\nThe SDK's error handler will send the error stack trace **without encryption**. This provides full visibility into errors for diagnostics and troubleshooting, but be aware that sensitive information might be included in error messages or stack traces.\n\n## Build a new extension for the SDK\n\nThe SDK supports the ability to include multiple extensions at runtime. In order to create a new extension, please implement the following interface:\n\n[ITelemetryPlugin](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryPlugin.html)\n\nOn initialization, config.extensions accepts an array of ITelemetryPlugin objects. These are hooked up and ITelemetryPlugin.processTelemetry() is chained based on priority of these plugins.\nPlease note that higher the priority, the later your processing code will be invoked. The SDK supports a plugin model and channels can also be plugged in similarly (advanced scenario).\nTarget scenarios for creating a brand new extension is to share a usage scenario that benefits multiple customers. Please follow guidelines\n\nHere is the priority ranges available:\n\n- Regular extension priority can be between 201 to 499.\n- Priorty range < 201 is reserved.\n- Priority range > 1000 is for channels (advanced scenario)\n\n[BaseTelemetryPlugin](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/classes/BaseTelemetryPlugin.html)\n\nTo help with the creation of new extensions there is now a supported base class which can be used, this not only provides the common (boilerplate) implementations of common functions it will enable future plugins to automatically receive functional updates with the need to recode the plugins. it provides implementations for :-\n* [ITelemetryPlugin.setNextPlugin()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryPlugin.html) implementation to continuing supporting existing (non-shared) execution of plugins, however, new plugins should use the new [IProcessTelemetryContext.processNext()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IProcessTelemetryContext.html) moving forward as this support the creation of shared (singleton) plugins;\n* New [ITelemetryPlugin.isInitialized()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryPlugin.html) implementation\n* And several helper methods.\n  * [processNext()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/classes/BaseTelemetryPlugin.html), - to call the next plugin using the context or the _nextPlugin value\n  * [diagLog()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/classes/BaseTelemetryPlugin.html): - to access the current [IDiagnosticLogger](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDiagnosticLogger.html) instance.\n\n  If you are creating new extensions it is recommended that you extend from this base class so that your extension will automatically inherit any future enhancements that are added to the ITelemetryPlugin interface without it requiring updates.\n\nUsage:\n\n```ts\nconst customPluginInstance = new YourCustomPlugin()\nconst appInsights = new ApplicationInsights({ config: {\n    connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE',\n    extensions: [customPluginInstance]\n    // Other Configuration Options...\n}});\nappInsights.loadAppInsights();\n```\n\n[ITelemetryPlugin](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryPlugin.html) has a simpler base type [IPlugin](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IPlugin.html) that you can instantiate for initialization purposes when SDK loads.\n\n## Build & Test this repo\n\n1. Install all dependencies\n\n    ```sh\n    npm install\n    npm install -g @microsoft/rush\n    ```\n\n2. Navigate to the root folder and update rush dependencies\n\n    ```sh\n    rush update\n    ```\n\n3. Build and test\n\n    ```sh\n    rush build\n    npm run test\n    ```\n\n## Performance\n\nApplication Insights JS adds a negligible amount of load time to your website. By using the snippet, minimal components of the library are quickly loaded. In the meantime, the full script is downloaded in the background.\n\nWhile the script downloads from the CDN, all tracking of your page is queued. Once the downloaded script finishes asynchronously initializing, all events that were queued are tracked. As a result, you will not lose any telemetry during the entire life cycle of your page. This setup process provides your page with a seamless analytics system, invisible to your users.\n\n> Summary:\n>\n> - ![current npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web.svg)\n> - ![gzip compressed size](https://js.monitor.azure.com/scripts/b/ai.3.min.js.gzip.svg)\n> - **~15 ms** overall initialization time\n> - **Zero** tracking missed during life cycle of page\n\n## Module Formats\n\nAs part of packaging we produce [umd (Universal Module Definition)](https://github.com/umdjs/umd) modules using [rollupjs](https://www.rollupjs.org/guide/en/) which creates a wrapper that works for most users as it supports module loading and initialization with or without [RequireJS](https://requirejs.org/).\n\nHowever, there are some cases where your code doesn't directly use [RequireJS](https://requirejs.org/) but it is loaded into the runtime environment before your code and the 1DS SDK, in these cases the [rollupjs](https://www.rollupjs.org/guide/en/) wrapper registers (defines) but does not initialize (execute) the SDK and instead waits for the first to call \"require()\" before the module is executed \n\neg. ```var aiSdk = require(\"@microsoft/applicationinsights-web\");```\n\nThis situation can also occur when the scripts are loaded lazily, late or dynamically (__and__ RequireJs is present) as this can cause a race condition between the SDK and RequireJS, which will cause the same issue if RequireJS is loaded first.\n\nIf users load Application Insights from the CDN via a script tag with require js running by other scripts, errors may occur. A typical error could be \"Error: Mismatched anonymous define() module\". The root reason is explained [here](https://requirejs.org/docs/errors.html#mismatch).\n\nTo support this usage pattern we also produce and publish to the CDN endpoints an [iife (Immediately Invoked Function Expression)](https://www.codeproject.com/Articles/5265230/Understanding-all-JavaScript-Module-Formats-and-To#iife-module-javascript-module-pattern) module so that the SDK is always executed and initialized.\n\nTo use these modules instead of using the default script name simply add ```.gbl``` before the ```.min.js``` eg. use ```.gbl.min.js``` instead of ```.min.js``` at the end of the script name. (Note: Since version 7, the gbl modules is set as default module to solve the potential [problem](#module-formats) caused by require.js)\n\nThese modules are also included in the NPM packages within the ```bundle``` folder.\n\nExample (not complete) CDN paths for the current major version.\n\n| Module | Default Module (Supports loading via requireJs) | IIFE Module\n|--------|----------------|--------------\n| [AISku<br/>(Main Sdk)](https://github.com/microsoft/ApplicationInsights-JS/tree/main/AISKU) | http://js.monitor.azure.com/scripts/b/ai.3.min.js<br/> http://js.monitor.azure.com/scripts/b/ai.2.min.js | http://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js <br />http://js.monitor.azure.com/scripts/b/ai.2.gbl.min.js\n| [Click Analytics Extension](https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-clickanalytics-js) | http://js.monitor.azure.com/scripts/b/ext/ai.clck.3.min.js<br />http://js.monitor.azure.com/scripts/b/ext/ai.clck.2.min.js | http://js.monitor.azure.com/scripts/b/ext/ai.clck.3.gbl.min.js<br />http://js.monitor.azure.com/scripts/b/ext/ai.clck.2.gbl.min.js\n| [Debug Plugin Extension](https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-debugplugin-js) | http://js.monitor.azure.com/scripts/b/ext/ai.dbg.3.min.js<br />http://js.monitor.azure.com/scripts/b/ext/ai.dbg.2.min.js | http://js.monitor.azure.com/scripts/b/ext/ai.dbg.3.gbl.min.js<br />http://js.monitor.azure.com/scripts/b/ext/ai.dbg.2.gbl.min.js\n| [Perf Mark/Measure Manager Extension](https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-perfmarkmeasure-js) | http://js.monitor.azure.com/scripts/b/ext/ai.prfmm-mgr.3.min.js<br />http://js.monitor.azure.com/scripts/b/ext/ai.prfmm-mgr.2.min.js | http://js.monitor.azure.com/scripts/b/ext/ai.prfmm-mgr.3.gbl.min.js<br />http://js.monitor.azure.com/scripts/b/ext/ai.prfmm-mgr.2.gbl.min.js\n\nAs part of the CDN deployment and promoting new versions as the default we also provide both minor and explicit versions of all modules, so each published module will also include the following versions and formats. The example names are assuming version 3 as the current major version and 3.1 and the current minor.\n\n| Major | Minor | Patch (Explicit) | Description\n|------|--------|------------------|-----------------\n| ```ai.3.min.js```<br />```ai.2.min.js``` | ```ai.3.0.min.js```<br />```ai.2.8.min.js``` | ```ai.3.0.2.min.js```<br />```ai.2.8.16.min.js``` | Minified UMD version\n| ```ai.3.gbl.min.js```<br />```ai.2.gbl.min.js``` | ```ai.3.0.gbl.min.js```<br />```ai.2.8.gbl.min.js``` | ```ai.3.0.2.gbl.min.js```<br />```ai.2.8.16.gbl.min.js``` | Minified IIFE version<br/>(Recommended for v3.x)\n\nAnd the process of Promoting (or rolling back) a deployed version is simply a case of replacing the major and minor version of the script with the current explicit version\n\n### CDN Debugging support\n\nWe support 2 basic approaches for debugging the SDK via the CDN hosted scripts\n\n- Every Module includes a ```//# sourceMappingURL=xxxx``` at the end of the file and has the referenced map file uploaded to the CDN.\n- We also publish unminified versions of every module, just drop the ```.min``` from the script name (eg. ```https://js.monitor.azure.com/scripts/b/ai.3.gbl.js```)\n\n| Major | Minor | Patch (Explicit) | Description\n|------|--------|------------------|-----------------\n| ```ai.3.min.js.map```<br />```ai.2.min.js.map``` | ```ai.3.0.min.js.map```<br />```ai.2.8.min.js.map``` | ```ai.3.0.2.min.js.map```<br />```ai.2.8.16.min.js.map``` | Map file for the UMD versions\n| ```ai.3.gbl.min.js.map```<br />```ai.2.gbl.min.js.map``` | ```ai.3.0.gbl.min.js.map```<br />```ai.2.8.gbl.min.js.map``` | ```ai.3.0.2.gbl.min.js.map```<br />```ai.2.8.16.gbl.min.js.map``` | Map file for the IIFE versions\n| ```ai.3.js```<br />```ai.2.js``` | ```ai.3.0.js```<br />```ai.2.8.js``` | ```ai.3.0.2.js```<br />```ai.2.8.16.js``` | Unminified UMD versions\n| ```ai.3.gbl.js```<br />```ai.2.gbl.js``` | ```ai.3.0.gbl.js```<br />```ai.2.8.gbl.js``` | ```ai.3.0.2.gbl.js```<br />```ai.2.8.16.gbl.js``` | Unminified IIFE versions\n\n## Nightly Builds\n\nTo aid with testing and validation we also produce and publish nightly builds whenever there is a change from the previous build. These builds are published to the [NpmJs registry](https://www.npmjs.com/package/@microsoft/applicationinsights-web) and to the CDN automatically on a successful build / test pass.\n\nThis process also [tags the source code](https://github.com/microsoft/ApplicationInsights-JS/tags) so that we can track the specific changes included using a nightly build specific version number which is the format \"nightly-yymm-##\" eg. ```nightly-2112-08```\n\nThese nightly builds will not be retained indefinitely and should only be used for __pre-production__ testing and/or validation of any changes that have not yet been released.\n\n### NPM\n\nThe NPM builds are tagged as \"nightly\" and can by downloaded using this as the version number ```npm install @microsoft/applicationinsights-web@nightly``` or using the nightly specific version number which is \"nightly.yyyymm-###\" (```npm install @microsoft/applicationinsights-web@2.7.3-nightly.2112-08```) where ## is the specific build number for the month (Note, slightly different version from the source code tag due to compatibility issues between the different systems).\n\n### CDN\n\nThese nightly builds are also uploaded to a different path on the CDN  and explicitly have the ```-nightly``` added to the module name eg. ```/nightly/ai.2-nightly.min.js```, each nightly build is re-numbered assuming the next release will be a patch release. So if the last release was 2.7.2, then all nightly builds will be numbered 2.7.3-nightly.\n\nSo to access simply update the URL used when downloading the required module.\n\n| Module | Nightly Build\n|--------|----------------\n| [AISku (Main Sdk)](https://github.com/microsoft/ApplicationInsights-JS/tree/main/AISKU) | http://js.monitor.azure.com/nightly/ai.2-nightly.min.js\n| [Click Analytics Extension](https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-clickanalytics-js) | http://js.monitor.azure.com/nightly/ext/ai.clck.2-nightly.min.js\n| [Debug Plugin Extension](https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-debugplugin-js) | http://js.monitor.azure.com/nightly/ext/ai.dbg.2-nightly.min.js\n| [Perf Mark/Measure Manager Extension](https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-perfmarkmeasure-js) | http://js.monitor.azure.com/nightly/ext/ai.prfmm-mgr.2-nightly.min.js\n\nAs with the normal release process the nightly builds also include major, minor, explicit, IIFE (```.gbl```), *.map and unminified versions, these are primarily available for validating changes between builds.\n\n| Module | CDN Path\n|--------|----------------\n| Major | http://js.monitor.azure.com/nightly/ai.2-nightly.min.js<br />http://js.monitor.azure.com/nightly/ai.2-nightly.gbl.min.js<br />http://js.monitor.azure.com/nightly/ai.2-nightly.js<br />http://js.monitor.azure.com/nightly/ai.2-nightly.gbl.js\n| Minor | http://js.monitor.azure.com/nightly/ai.2.7-nightly.min.js<br />http://js.monitor.azure.com/nightly/ai.2.7-nightly.gbl.min.js<br />http://js.monitor.azure.com/nightly/ai.2.7-nightly.js<br />http://js.monitor.azure.com/nightly/ai.2.7-nightly.gbl.js\n| Explicit | http://js.monitor.azure.com/nightly/ai.2.7.3-nightly.2112-08.min.js<br />http://js.monitor.azure.com/nightly/ai.2.7.3-nightly.2112-08.gbl.min.js<br />http://js.monitor.azure.com/nightly/ai.2.7.3-nightly.2112-08.js<br />http://js.monitor.azure.com/nightly/ai.2.7.3-nightly.2112-08.gbl.js\n\n### Deployment process and alternate CDN endpoints\n\nWhen a new release is deployed the following occurs as part of the release\n\n- NPM packages are created and published to [NpmJs](https://www.npmjs.com/package/@microsoft/applicationinsights-web)\n- The new explicit versioned files (eg. `ai.2.7.2.js`; `ai.2.7.2.min.js`; `ai.2.7.2.gbl.min.js`; `ai.2.7.2.min.js.map`; etc) are uploaded to all cdn endpoints URL's (public, next and beta - details below)\n- We then go through a deployment process of \"promoting\" the new version to the \"Major\" (`ai.3.gbl.min.js`) and \"Minor\" (`ai.3.x.gbl.min.js`) release URL's to upgrade everyone to the newly released version based on the schedule listed below\n\n| Endpoint | Url | Schedule\n|----------|-------------|--------\n| Beta | https://js.monitor.azure.com/beta/ai.3.gbl.min.js | Same day as the NPM release\n| Next | https://js.monitor.azure.com/next/ai.3.gbl.min.js | One additional work day after the `beta` URL promotion.\n| Public | https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js | Another One additional work day after the `next` URL promotion, (so 2 work days after initial release) unless this falls on the last work day of the week (eg. Friday) in which case it will be delayed until the first work day of the next work week.\n\nThe milestones for each release should include both the deployment plan (as it's about to be released) or the final release times as with [v2.7.2](https://github.com/microsoft/ApplicationInsights-JS/milestone/58)\n\nIt is expected that most users will be using the `Public` URL, however, it is also recommended that if you have a test or canary environment that you should use either the `beta` or `next` URL's so that you would be alerted first before any production users are impacted. If any issues are detected with the `beta` or `next` URL's as a new release is being deployed please raise a new [Issue](https://github.com/microsoft/ApplicationInsights-JS/issues) as soon as this is confirmed.\n\n## Release Notes\n\n- [Releases](https://github.com/microsoft/ApplicationInsights-JS/releases)\n- [Changelist Notes](./RELEASES.md)\n\n## Browser Support\n\n- ES5 Compliant browsers\n\n![Chrome](https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![IE](https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | ![Opera](https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Safari](https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png)\n--- | --- | --- | --- | --- |\nLatest ✔ | Latest ✔ | 9+ Full ✔ | Latest ✔ | Latest ✔ |\n\n> v3.x removed ES3 / IE8, if you need to retain ES3 (IE8) compatibility you will need to remain on the v2.x versions of the SDK, which is available on the old [master branch](https://github.com/Microsoft/ApplicationInsights-JS/tree/master). The 2.x branch will only receive critical bug fixes when no workaround exists — no new features or back-porting from later versions.\n\n### Submitting a Change to this Project\n\n```zsh\n<...added some code...>\nrush change\n<...enter details>\ngit add <...your changes and rush change file...>\ngit commit -m \"info about your change\"\ngit push\n```\n\n## Contributing\n\nRead our [contributing guide](./CONTRIBUTING.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Application Insights.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "RELEASES.md",
    "content": "# Releases\n\n> Note: ES3/IE8 compatibility will be removed in the future v3.x.x releases (scheduled for mid-late 2022), so if you need to retain ES3 compatibility you will need to remain on the 2.x.x versions of the SDK or your runtime will need install polyfill's to your ES3 environment before loading / initializing the SDK.\n\n<!-- ## Unreleased Changes -->\n\n## 3.4.1 (April 7th, 2026)\n\nThis is the first full supported release of the 3.4.x version line. While a 3.4.0-beta was previously released for early testing and validation, version 3.4.0 was not released as a standard supported version — 3.4.1 is the first production-ready release in this series. The `@microsoft/1ds-post-js` channel is numbered 4.4.1 and requires v3.4.1.\n\n### Significant Changes (since 3.3.11)\n\n> The following are the significant changes since the previous full release (3.3.11). Some of these changes were previously included in the 3.4.0-beta release.\n\n- **W3C Trace State Support**: Added full support for managing W3C Trace State and sending headers in distributed tracing, including new distributed tracing modes `AI_AND_W3C_TRACE` and `W3C_TRACE` that enable the [`tracestate`](https://www.w3.org/TR/trace-context/#tracestate-header) header to be sent with requests when trace state information is available, the existing states will continue to not send the header.\n\n- **New Distributed Tracing Modes**: Added new `eDistributedTracingModes` enum values:\n  - `AI_AND_W3C_TRACE` (17): Sends Application Insights headers + W3C `traceparent` + W3C `tracestate` headers (if state value is present)\n  - `W3C_TRACE` (18): Sends only W3C `traceparent` + W3C `tracestate` headers (if state value is present)\n\n- **Enhanced Distributed Tracing**: Refactored the distributed tracing implementation to provide better support for the W3C Trace Context specification and prepare for future OpenTelemetry Span-style API integration.\n\n- **New W3C TraceState API**: Introduced the `IW3cTraceState` interface that provides a mutable, ordered list of key/value pairs for trace state information with proper parent-child relationships.\n\n- **OpenTelemetry Integration Preparation**: Added foundational OpenTelemetry interfaces (`IOTelSpanContext`, `IOTelTraceState`) to provide OpenTelemetry API compatibility.\n\n- **Additional Configuration**: Added new configuration properties for W3C trace state support:\n  - `traceHdrMode`: Controls if the SDK should look for the `traceparent` and/or `tracestate` values from service timing headers or meta tags from the initial page load (in `IConfiguration`)\n  - Enhanced `distributedTracingMode` property to support the new W3C trace state modes (in `ICorrelationConfig`)\n\n- **Dependencies Extension**: The dependency tracking extension now includes additional logic for W3C trace state handling, which may affect custom dependency listeners or initializers. The following interfaces and functions have been enhanced with W3C trace state support:\n  - `IDependencyListenerDetails` interface now also includes a readonly `traceState` along with the previous `traceId`, `spanId`, `traceFlags` properties\n  - `addDependencyListener()` function now provides access to W3C trace state information through the enhanced details object\n  - `addDependencyInitializer()` function continues to work with existing dependency telemetry processing\n  - Custom dependency listeners can now access and modify W3C trace state information before requests are sent\n\n- **Enhanced Cookie Management**: Cookie values are now cached in memory when cookies are disabled instead of being lost, enabling support for consent banner workflows where cookies must be temporarily disabled until user approval. Automatic flushing occurs when cookies are re-enabled.\n\n- **OsPlugin Reliability Improvements**: Improved OsPlugin with proactive OS retrieval, unload handling, and session caching for more reliable OS detection.\n\n- **URL Redaction Enhancements**: Made URL redaction more dynamic for improved flexibility in field redaction scenarios.\n\n### Package Deprecation\n\nThe following packages have been merged into `@microsoft/applicationinsights-core-js` and are now **deprecated**. They continue to be published as backward-compatible shims (re-exporting from Core) so existing code will not break, but they are no longer used as dependencies by the main SDK packages. You should stop importing from these packages and migrate to `@microsoft/applicationinsights-core-js` directly.\n\n- **`@microsoft/applicationinsights-common`** — All exports have been merged into `@microsoft/applicationinsights-core-js`. The package is now a compatibility shim that re-exports from Core. See the [Migration Guide](https://github.com/microsoft/ApplicationInsights-JS/blob/main/docs/upgrade/MergeCommonToCore.md) for details on updating your imports. This package will be removed in a future major release (4.0.0).\n\n- **`@microsoft/1ds-core-js`** — All exports have been merged into `@microsoft/applicationinsights-core-js`. The package is now a compatibility shim that re-exports from Core. See the [1DS Core Migration Guide](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/1ds-core-js/README.md) for class/import name changes and migration steps. Consumers should update their imports to reference `@microsoft/applicationinsights-core-js` directly. This package will be removed in a future major release (4.0.0).\n\n### Breaking Changes\n\nThe following is a list of known breaking changes for anyone attempting to implement the interfaces, for end-users / consumers of the existing interface this is considered to be only a potential breaking change as the existing functions are still provided and provide the same level of functionality. The breaking nature of these changes is for anyone attempting to provide their own implementation of these changes.\n\n#### Interface Changes\n\n- The `IDistributedTraceContext` interface has been significantly expanded to include W3C trace state management capabilities, which may affect custom telemetry processors that interact with distributed tracing context.\n  - Added additional \"required\" property accessors which update ONLY the current trace context instance and DO NOT update any parent context instances (`pageName`, `traceId`, `spanId` and `traceFlags`).\n    - The previous set functions continue to also update (replace) any parent context values for existing backward compatability, but have been marked as depracted and will be removed in a future release due to their side-effects of overwriting the parent values.\n\n### Potential Breaking Changes\n\n- **Class Removal**: The `TelemetryTrace` class has been removed and is no longer exported as part of the distributed tracing refactoring, with its functionality integrated into the new W3C trace state implementation.\n  - The properties `telemetryTrace` is now a complete adpater to the existing `core.getTraceCtx()` value and as such is now marked as deprecated and will be removed in a future release.\n  - The value of the `appInsights.context.telemetryTrace` is no longer an instance of this removed class.\n\n- **Trace Context Initialization**: Due to the distributed tracing refactoring, the core instance and SDK will now always have a valid `traceId` available through `core.getTraceCtx()`. The `traceId` will be either a newly generated random value or inherited from any detected parent trace context. This ensures consistent trace context availability but may affect applications that previously relied on the absence of a `traceId` to determine if distributed tracing was active.\n\n- **Dependencies Extension - ajaxRecord Class Removal**: The internal `ajaxRecord` class has been removed and is no longer exported from the dependencies extension (`@microsoft/applicationinsights-dependencies-js`). The internal implementation now implements the new [`IAjaxRecordData`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-dependencies-js/interfaces/IAjaxRecordData.html) interface. This class was previously used internally for AJAX request tracking and was referenced in the `IInstrumentationRequirements.includeCorrelationHeaders()` function signature. **Important**: The previous exporting of the `ajaxRecord` class was unintentional and was never meant to be part of the public API - it was an internal implementation detail that inadvertently became accessible to external code.\n  - **Previous Signature**: `includeCorrelationHeaders(ajaxData: ajaxRecord, input?: Request | string, init?: RequestInit, xhr?: XMLHttpRequestInstrumented): any`\n  - **New Signature**: `includeCorrelationHeaders(ajaxData: IAjaxRecordData, input?: Request | string, init?: RequestInit, xhr?: XMLHttpRequestInstrumented): any`\n  - **New Interface**: The [`IAjaxRecordData`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-dependencies-js/interfaces/IAjaxRecordData.html) interface has been introduced to replace the `ajaxRecord` class in public API signatures and provides access to essential AJAX request properties:\n    - `getAbsoluteUrl(): string | null` - Gets the absolute URL for the request\n    - `getPathName(): string | null` - Gets the sanitized path name for the request URL  \n    - `traceCtx: IDistributedTraceContext` - The distributed trace context for the request\n    - `requestHeaders: { [key: string]: string }` - Object containing request headers\n    - `aborted?: number` - Indicates whether the request was aborted\n    - `context?: { [key: string]: any }` - Optional context object for dependency listeners\n  - **Impact**: This change only affects custom implementations that directly referenced the `ajaxRecord` class or implemented the `IInstrumentationRequirements` interface. Standard SDK usage and most custom dependency listeners/initializers are unaffected.\n  - **Migration**: If your code previously referenced `ajaxRecord` or implemented `IInstrumentationRequirements`, update it to use the new [`IAjaxRecordData`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-dependencies-js/interfaces/IAjaxRecordData.html) interface, which provides the same essential properties with proper TypeScript definitions and comprehensive JSDoc documentation.\n  - **Need Help?**: If you discover that your code depends on other functions or properties from the dependencies extension that are no longer exported and you believe should be part of the public API, please [raise an issue](https://github.com/microsoft/ApplicationInsights-JS/issues) with details about your use case so we can review and potentially provide a proper public API alternative.\n\n- **Flush Method Signature Change**: Renamed `flush` method parameter from `async` to `isAsync` in `IChannelControls` interface to avoid potential keyword conflicts (only affects code that relies on named parameters).\n  - Fixed return type of `flush` method to properly include `boolean` when callbacks complete synchronously\n\n### Potential behavioral changes\n\nThis release enhances the cookie management behavior when cookies are disabled. Previously, when cookies were disabled, calls to `cookieMgr.set()` would return `false` and cookie values would be lost. Now, these operations are cached in memory and automatically applied when cookies are re-enabled to allow for cookie compliance banners and delayed approval.\n\n**Behavior changes:**\n- `cookieMgr.set()` now returns `true` when cookies are disabled (because values are cached), instead of `false`\n- `cookieMgr.get()` now returns cached values when cookies are disabled, instead of empty strings\n- `cookieMgr.del()` operations are now cached and applied when cookies are re-enabled\n- Applications can now recover cookie state after temporary cookie blocking scenarios\n\n**These changes improve data persistence and are considered enhancements rather than breaking changes.** If your application logic depends on the previous behavior of `set()` returning `false` when cookies are disabled, you may need to check `cookieMgr.isEnabled()` instead, or configure `disableCookieCache: true` in your `cookieCfg` to maintain the previous behavior.\n\n### Known Limitations\n\n- **SDK Loader (Snippet) automatically downgrades to v2.x on Internet Explorer**: When the SDK Loader detects that Internet Explorer is being used (via the `msie` or `trident/` user agent strings), it automatically rewrites the CDN URL to load the v2.x SDK instead of v3.x (e.g. `ai.3.gbl.min.js` becomes `ai.2.gbl.min.js`). This means any v3.x-only APIs — including the new OpenTelemetry-based APIs — will not be available for users on Internet Explorer. If your code uses these newer APIs, you should check for their existence before calling them. This fallback does not apply when using the NPM package directly.\n\n### Changelog\n\n- #2719 Improve OsPlugin reliability: proactive OS retrieval, unload handling, and session caching\n- #2718 Address issue with the AppInsightsExtCore using the wrong version number\n- #2716 Make URL Redaction more dynamic\n- #2712 [Main] Merge 1ds-core-js into applicationinsights-core-js\n- #2710 [Main] Merge Trace API Features from Beta\n- #2628 Fix flush method root cause - handle async callbacks in _doSend with proper error handling\n  - **Potential breaking change**: Renamed `flush` method parameter from `async` to `isAsync` in `IChannelControls` interface to avoid potential keyword conflicts (only affects code that relies on named parameters)\n  - Fixed return type of `flush` method to properly include `boolean` when callbacks complete synchronously\n  - Fixed root cause where `_doSend()` couldn't handle asynchronous callbacks from `preparePayload()` when compression is enabled\n  - `await applicationInsights.flush()` now works correctly with compression enabled\n  - Added proper error handling and promise rejection propagation through async callback chains\n  - Improved handling of both synchronous and asynchronous callback execution patterns\n  - No polling overhead - uses direct callback invocation for better performance\n- #2631 [Feature] Update the ICookieMgr implementation to write cookies after being enabled\n  - **Enhancement**: Cookie values are now cached in memory when cookies are disabled instead of being lost, enabling support for consent banner workflows where cookies must be temporarily disabled until user approval\n  - **Enhancement**: Automatic flushing occurs when cookies are re-enabled via `setEnabled(true)` or dynamic configuration changes  \n  - **Enhancement**: Added `disableCookieDefer` configuration option to maintain backward compatibility with previous behavior (defaults to false)\n  - **Behavior change**: `cookieMgr.set()` now returns `true` when disabled (cached) instead of `false`\n  - **Behavior change**: `cookieMgr.get()` now returns cached values when disabled instead of empty strings\n- [Beta] Add W3c Trace State support / handling and refactor distributed trace handling to prepare for OpenTelemetry Span style API / management\n\n**Full Changelog**: https://github.com/microsoft/ApplicationInsights-JS/compare/3.3.11...3.4.1\n\n## 3.4.0-beta (February 23rd, 2026)\n\n### Significant Changes\n\n- **AppInsightsCommon Merged into AppInsightsCore**: The `@microsoft/applicationinsights-common` package has been merged into `@microsoft/applicationinsights-core-js` to simplify dependency management and improve tree-shaking capabilities.\n  - All exports previously in `applicationinsights-common` are now available from `applicationinsights-core-js`\n  - The `applicationinsights-common` package continues to work as a compatibility layer (re-exports from Core)\n  - No breaking changes to existing APIs\n  - See the [Migration Guide](docs/upgrade/MergeCommonToCore.md) for details on updating your imports\n  - **Timeline**: The Common package will be deprecated and eventually removed in version 4.0.0\n\n- **W3C Trace State Support**: Added full support for managing W3C Trace State and sending headers in distributed tracing, including new distributed tracing modes `AI_AND_W3C_TRACE` and `W3C_TRACE` that enable the [`tracestate`](https://www.w3.org/TR/trace-context/#tracestate-header) header to be sent with requests when trace state information is available, the existing states will continue to not send the header.\n\n- **New Distributed Tracing Modes**: Added new `eDistributedTracingModes` enum values:\n  - `AI_AND_W3C_TRACE` (17): Sends Application Insights headers + W3C `traceparent` + W3C `tracestate` headers (if state value is present)\n  - `W3C_TRACE` (18): Sends only W3C `traceparent` + W3C `tracestate` headers (if state value is present)\n\n- **Enhanced Distributed Tracing**: Refactored the distributed tracing implementation to provide better support for the W3C Trace Context specification and prepare for future OpenTelemetry Span-style API integration.\n\n- **New W3C TraceState API**: Introduced the `IW3cTraceState` interface that provides a mutable, ordered list of key/value pairs for trace state information with proper parent-child relationships.\n\n- **OpenTelemetry Integration Preparation**: Added foundational OpenTelemetry interfaces (`IOTelSpanContext`, `IOTelTraceState`) to provide OpenTelemetry API compatibility.\n\n- **Additional Configuration**: Added new configuration properties for W3C trace state support:\n  - `traceHdrMode`: Controls if the SDK should look for the `traceparent` and/or `tracestate` values from service timing headers or meta tags from the initial page load (in `IConfiguration`)\n  - Enhanced `distributedTracingMode` property to support the new W3C trace state modes (in `ICorrelationConfig`)\n\n- **Dependencies Extension**: The dependency tracking extension now includes additional logic for W3C trace state handling, which may affect custom dependency listeners or initializers. The following interfaces and functions have been enhanced with W3C trace state support:\n  - `IDependencyListenerDetails` interface now also includes a readonly `traceState` along with the previous `traceId`, `spanId`, `traceFlags` properties\n  - `addDependencyListener()` function now provides access to W3C trace state information through the enhanced details object\n  - `addDependencyInitializer()` function continues to work with existing dependency telemetry processing\n  - Custom dependency listeners can now access and modify W3C trace state information before requests are sent\n\n### Breaking Changes\n\nThe following is a list of known breaking changes for anyone attempting to implement the interfaces, for end-users / consumers of the existing interface this is considered to be only a potential breaking change as the existing functions are still provided and provide the same level of functionality. The breaking nature of these changes is for anyone attempting to provide their own implementation of these changes.\n\n#### Interface Changes\n\n- The `IDistributedTraceContext` interface has been significantly expanded to include W3C trace state management capabilities, which may affect custom telemetry processors that interact with distributed tracing context.\n  - Added additional \"required\" property accessors which update ONLY the current trace context instance and DO NOT update any parent context instances (`pageName`, `traceId`, `spanId` and `traceFlags`).\n    - The previous set functions continue to also update (replace) any parent context values for existing backward compatability, but have been marked as depracted and will be removed in a future release due to their side-effects of overwriting the parent values.\n\n### Potential Breaking Changes\n\n- **Class Removal**: The `TelemetryTrace` class has been removed and is no longer exported as part of the distributed tracing refactoring, with its functionality integrated into the new W3C trace state implementation.\n  - The properties `telemetryTrace` is now a complete adapter to the existing `core.getTraceCtx()` value and as such is now marked as deprecated and will be removed in a future release.\n  - The value of the `appInsights.context.telemetryTrace` is no longer an instance of this removed class.\n\n- **Trace Context Initialization**: Due to the distributed tracing refactoring, the core instance and SDK will now always have a valid `traceId` available through `core.getTraceCtx()`. The `traceId` will be either a newly generated random value or inherited from any detected parent trace context. This ensures consistent trace context availability but may affect applications that previously relied on the absence of a `traceId` to determine if distributed tracing was active.\n\n- **Dependencies Extension - ajaxRecord Class Removal**: The internal `ajaxRecord` class has been removed and is no longer exported from the dependencies extension (`@microsoft/applicationinsights-dependencies-js`). The internal implementation now implements the new [`IAjaxRecordData`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-dependencies-js/interfaces/IAjaxRecordData.html) interface. This class was previously used internally for AJAX request tracking and was referenced in the `IInstrumentationRequirements.includeCorrelationHeaders()` function signature. **Important**: The previous exporting of the `ajaxRecord` class was unintentional and was never meant to be part of the public API - it was an internal implementation detail that inadvertently became accessible to external code.\n  - **Previous Signature**: `includeCorrelationHeaders(ajaxData: ajaxRecord, input?: Request | string, init?: RequestInit, xhr?: XMLHttpRequestInstrumented): any`\n  - **New Signature**: `includeCorrelationHeaders(ajaxData: IAjaxRecordData, input?: Request | string, init?: RequestInit, xhr?: XMLHttpRequestInstrumented): any`\n  - **New Interface**: The [`IAjaxRecordData`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-dependencies-js/interfaces/IAjaxRecordData.html) interface has been introduced to replace the `ajaxRecord` class in public API signatures and provides access to essential AJAX request properties:\n    - `getAbsoluteUrl(): string | null` - Gets the absolute URL for the request\n    - `getPathName(): string | null` - Gets the sanitized path name for the request URL  \n    - `traceCtx: IDistributedTraceContext` - The distributed trace context for the request\n    - `requestHeaders: { [key: string]: string }` - Object containing request headers\n    - `aborted?: number` - Indicates whether the request was aborted\n    - `context?: { [key: string]: any }` - Optional context object for dependency listeners\n  - **Impact**: This change only affects custom implementations that directly referenced the `ajaxRecord` class or implemented the `IInstrumentationRequirements` interface. Standard SDK usage and most custom dependency listeners/initializers are unaffected.\n  - **Migration**: If your code previously referenced `ajaxRecord` or implemented `IInstrumentationRequirements`, update it to use the new [`IAjaxRecordData`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-dependencies-js/interfaces/IAjaxRecordData.html) interface, which provides the same essential properties with proper TypeScript definitions and comprehensive JSDoc documentation.\n  - **Need Help?**: If you discover that your code depends on other functions or properties from the dependencies extension that are no longer exported and you believe should be part of the public API, please [raise an issue](https://github.com/microsoft/ApplicationInsights-JS/issues) with details about your use case so we can review and potentially provide a proper public API alternative.\n\n### Changelog\n\n- [Beta] Add W3c Trace State support / handling and refactor distributed trace handling to prepare for OpenTelemetry Span style API / management\n\n## 3.3.11 (January 12th, 2026)\n\n### Changelog\n\n- #2642 Separate BeaconSendFailure and BeaconSendFailure from SizeLimitExceeded\n- #2675 Fix offline channel recovery for Offline -> Online (#2674)\n- #2666 Fix unload() to return promise when called without parameters\n- #2667 Add a check to prevent non-string URLs from being passed to fieldRedaction method\n\n#### Infrastructure changes\n\n- #2684 Fix minor issue with E2E test\n- #2681 Add redact URL configuration in readme\n- #2676 Fix Flakey Ajax test which has race condition\n- #2670 Fix static web CDN test assertion (Fixes failing CI tests)\n\n### Web snippet 1.2.3 (November 10, 2025)\n\n- #2659 [Web-Snippet] [BUG] @microsoft/applicationinsights-web-snippet Fix Snippet Loader Error \n\n## 3.3.10 (Sept 22nd, 2025)\n\n### Changelog\n\n- #2649 [Main][Task] 27922617: Provide Custom Provider Under Web Worker for Offline Channel\n- #2638 [Main][Task] 34470593: Update Async Tests Under Dependencies Extension To Use the Modern AsyncQueue Pattern \n- #2637 [Main][Task] 34470593: Update AISKU Async Tests To Use the Modern AsyncQueue Pattern\n- #2636 Fix TypeError in Click Analytics Data Collector\n- #2633 Fix flush method root cause - handle async callbacks in _doSend with proper error handling\n- #2632 [Feature] Implement cookie caching when disabled and automatic flushing when enabled with backward compatibility option\n- #2625 Add Azure API Management proxy documentation to FAQ sections\n- #2607 Update Async Tests Under AISKULight to Use the Modern AsyncQueue Pattern\n- #2597 Fix TypeScript compatibility issue with ITelemetryPlugin interface\n- #2595 Fix trackPageView not resetting maxAjaxCallsPerView counter\n- #2583 Create IAnalyticsConfig interface to properly define AnalyticsPlugin configuration subset\n- #2625 Add Azure API Management proxy documentation to FAQ sections\n- #2627 Add weekly GitHub action to delete closed and merged branches\n- #2635 Fix issue #2634 moving the conditional check for filtering\n- #2549 Redacting urls before sending to telemetry data\n- #2622 Suppressed credentials inline to avoid credscan false positive\n\n### Potential breaking changes\n\nRenamed `flush` method parameter from `async` to `isAsync` in `IChannelControls` interface to avoid potential keyword conflicts (only affects code that relies on named parameters)\n  - Fixed return type of `flush` method to properly include `boolean` when callbacks complete synchronously\n  - Fixed root cause where `_doSend()` couldn't handle asynchronous callbacks from `preparePayload()` when compression is enabled\n  - `await applicationInsights.flush()` now works correctly with compression enabled\n  - Added proper error handling and promise rejection propagation through async callback chains\n  - Improved handling of both synchronous and asynchronous callback execution patterns\n  - No polling overhead - uses direct callback invocation for better performance\n\n**Interfaces change:**\n```typescript\n// Before:\nflush(async: boolean = true, callBack?: (flushComplete?: boolean) => void): void | IPromise<boolean>;\n\n// After: \nflush(isAsync: boolean = true, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean>;\n```\n\n**This is only a breaking change if you rely on named parameters.** If you have custom channels or plugins that implement the `IChannelControls` interface directly and rely on passing named parameters, you will need to update the parameter name from `async` to `isAsync` in your implementation.\n\n\nThis release also includes:\n- Support for custom providers for Offline Channel which has added `customProvider` and `customUnloadProvider` interfaces to the `IOfflineChannelConfiguration`.\n- `IAnalyticsConfig` is exported for Analytics extension.\n- `redactUrls` and `redactQueryParams` are added to `IConfiguration` to support URL redaction.\n\n\n### Potential behavioral changes\n\nThis release enhances the cookie management behavior when cookies are disabled. Previously, when cookies were disabled, calls to `cookieMgr.set()` would return `false` and cookie values would be lost. Now, these operations are cached in memory and automatically applied when cookies are re-enabled to allow for cookie compliance banners and delayed approval.\n\n**Behavior changes:**\n- `cookieMgr.set()` now returns `true` when cookies are disabled (because values are cached), instead of `false`\n- `cookieMgr.get()` now returns cached values when cookies are disabled, instead of empty strings\n- `cookieMgr.del()` operations are now cached and applied when cookies are re-enabled\n- Applications can now recover cookie state after temporary cookie blocking scenarios\n\n**These changes improve data persistence and are considered enhancements rather than breaking changes.** If your application logic depends on the previous behavior of `set()` returning `false` when cookies are disabled, you may need to check `cookieMgr.isEnabled()` instead, or configure `disableCookieCache: true` in your `cookieCfg` to maintain the previous behavior.\n\n## 3.3.9 (June 25th, 2025)\n\nThis release contains an important fix for a change introduced in v3.3.7 that caused the `autoCaptureHandler` to incorrectly evaluate elements within `trackElementsType`, resulting in some click events not being auto-captured. See more details [here](https://github.com/microsoft/ApplicationInsights-JS/issues/2589).\n\n### Changelog\n\n- #2556 Update SDK Loader to rename the snippet postfix file to avoid CodeQL scanning issues\n- #2586 [AI][Task] 33246973: Update Readme on Error Handler\n- #2581 Export ICorrelationConfig interface from dependencies extension\n- #2587 Click Analytics - Fix capturning of HTML events\n\n## Web Snippet Release 1.2.2 (June 2nd, 2025)\n\nThis release adds support for Trusted Types in the Application Insights JavaScript SDK snippet loader. See more details [here](https://github.com/microsoft/ApplicationInsights-JS/blob/main/tools/applicationinsights-web-snippet/trustedTypeSupport.md).\n\n### Changelog\n- #2407 Custom Trusted Type Policy Support for Snippet Script Injection\n\n## 3.3.8 (May 22nd, 2025)\n\nThis release contains an important fix for a change introduced in v3.3.7 that caused a ReferenceError exception to be thrown when running in strict mode. See more details [here](https://github.com/microsoft/ApplicationInsights-JS/issues/2529).\n\n### Changelog\n\n- #2524 Update Components to address governance issues\n- #2536 Fix ReferenceError in Click Analytics v3.3.7 by reordering variable declaration\n- #2530 Add negative isArray check to _isConfigDefaults\n\n## 3.3.7 (May 7th, 2025)\n\n### Potential breaking change\n\nThis release contains a potential breaking change due to the new compress api feature added. If you are using a Proxy to redirect your telemetry to your own endpoint or are relying on the events to be uncompressed (this feature is initially disabled and it is intended to be enabled by the service in the near future), it is recommended to either update collection endpoint to support GZip or to explicitly disable the feature. See more details [here](https://github.com/Microsoft/ApplicationInsights-JS?tab=readme-ov-file#feature).\n\n### Changelog\n\n- #2518 Remove Generated docs from the repo\n- #2514 Address issues with isFeatureEnabled changes\n- #2517 Update Components to address governance issues\n- #2501 [Main][Task]31233527:Change Default RequestSizeLimitBytes\n- #2507 [main] Handle race condition during unload\n- #2513 [Main][Task]32698211: Add a Config to Allow Users to Change Max Number of Events Per Batch\n  - **Note**: New Config `maxEvtPerBatch` is added to the post channel `IChannelConfiguration`.\n- #2511 [Main][Task]31233527: Add a Config to Allow Users to Change RequestSizeLimitBytes\n  - **Note**: New Config `requestLimit` is added to the post channel `IChannelConfiguration`.\n- #2506 Drop correlation header to be passed on the dependency\n  - **Note**: Option to drop the enrichment of correlation header during dependency processing is added to `DependencyListenerFunction`\n- #2504 [main] [Click analytics] not logging no native html input elements\n  - **Note**: `trackElementTypes` is added to `IClickAnalyticsConfiguration` to allow additional, configurable HTML element types to be tracked in addition to the default set\n- #2451 [main] enable compress api in 1ds-post-channel and applicationinsights-channel\n  - **Note**: Using compress api feature is added through feature flag `zipPayload` and is currently disabled by default. See [how to enable this feature](https://github.com/Microsoft/ApplicationInsights-JS?tab=readme-ov-file#feature) and [more details](https://github.com/microsoft/ApplicationInsights-JS/blob/123ba4cd38f1478e91547d36c41668599834c734/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/IConfiguration.ts#L192).\n- #2489 [main][stats beat] implement stats beat in application insights\n\n## 3.3.6 (March 4th, 2025)\n\n### Changelog\n\n- #2481 [Main][Task]31338239: Add Config to allow excluding the configuration endpoints from being reported\n- #2486 Minification improvements\n\n## 3.3.5 (Feb 3rd, 2025)\n\n### Changelog\n\n#### Issues\n\n- #2430 [BUG] Type signature for stopTrackEvent is incorrect\n- #2442 [BUG] [Snippet] Unhandled exceptions are reported twice\n- #2470 [BUG] @microsoft/applicationinsights-channel-js lacks a proper repository URL\n- #2467 [BUG] The regex used to parse the stack trace appears to be skipping anonymous lines\n  - This fixes the portal missing stack frames which are from anonymous functions due to missed parsing of stack frames with unexpected formatting.\n\n#### Commits\n\n- #2428 [main] [snippet] Integrate 1DS with AI Snippet Generation\n- #2443 Update Stale Issue action\n- #2445 [main] snippet generation fix for pr #2428\n- #2446 [main] eliminate warning raised by tsdoc\n- #2447 [main] [debug plugin] upgrade manifast to v3\n- #2450 [main][doc] Type signature for stopTrackEvent is incorrect #2430\n- #2448 [main] fix tsdoc error for param and type tag\n- #2452 [main][fix] rush fix\n- #2459 [Main][Task]30499129: Turn on CDN Deprecation Message with Sampling Rate with 10% Each Day\n- #2458 URGENT ACTION: Stop using az416426.vo.msecnd.net\n- #2460 [ThrottleMgr] Turn on Test CDN Deprecation Message with Sampling Rate with 100% Each Day\n- #2461 Update config version to 1.0.1\n- #2463 [main][cfgsync] update test based on new config setting\n- #2462 [main][debug tool] fix the way of calling chrome storage and add new url\n- #2464 Update Code Owners\n- #2465 [main][debug tool] enable check compressed data\n- #2468 [Main][Task]31041354: Increase CDN Deprecation Message Sampling Rate to 20%\n- #2471 [Main][Task]31111291: Fix Repo links in package.json\n- #2455 [main] fix rush warning message\n- #2473 Update rush version\n\n## 3.3.4 (Oct 30th 2024)\n\n### Changelog\n\n- #2426 [Main][Task]29626594: PerfManager Should be Created without Customized CreatePerfMgr Function\n- #2421 [Main]: Make file size checks flexible for nightly/dev builds\n- #2434 [Main][Task]29884493: Add a Function to Export Offline Listener From Sender\n- #2437 [Main][Task]29519727: Better Handle Sender Dynamic Changes\n- #2438 [Main][Task]29445623: Update CfgSync Config Readme\n- #2439 [BUG] Sourcemap load errors in debugger from dependencies\n- #2429 Readme - Remove double negative\n\n## 3.3.3 (Sep 23rd 2024)\n\n### Changelog\n\n- #2401 [Main][Task]28966399: Separate critical events and non-critical events for Offline Support\n  - **Note**: New Config `splitEvts` is added to Offline Channel Config. By enabling it, offline events will be batched and saved separately based on persistence level\n- #2413 [Main][Task] 29445638: Fix Promise Initialization Sender Config Issue\n  - **Note**: the issue [ApplicationInsights Channel (Sender) endpoint Url Promise is Always Pending](https://github.com/microsoft/ApplicationInsights-JS/issues/2414) is resolved\n- #2416 [Main][Task]29519574: Update AISKU Light to better handle Init Promise\n- #2418 [Main][Task]29465842: Update Promise Initialization Post Channel\n- #2404 [main] fix expCfg to be optional\n- #2407 [main] Custom Trusted Type Policy Support for Snippet Script Injection\n- #2409 [main] Trusted Type Policy Support for nounce tag\n\n## 3.3.2 (Sep 3rd, 2024)\n\n### Changelog\n\n- #2396 [Main] Update generated typedoc documentation\n- #2397[Main] Change tslib peerDependency from \"*\" to open range\n- #2391 [Main] enhance exception telemetry with customer log Information\n  - Note: Config `expCfg` is moved from `IConfig` to `IConfiguration`(this change is going to cause the TypeScript type error).\n\n## 3.3.1 (Aug 7th, 2024)\n\n### Changelog\n\n- #2379 [Main][Task]28644993: Update Online Sender Status Code Check with Offline Mode\n- #2380 [Main][Task]28751664: Fix Offline Circular Dependency\n- #2386 [Main][Task]28846327: Fix Offline Default Max in Storage Time to 7 Days\n- #2387 [Main][Task]27760339: Typedoc is not including ILoadedPlugin\n- #2381 [Main] [CDN Publishing] Cleanup AzureRM scripts from AI and 1DS\n- #2377 Fix Nightly Size Tests\n- #2389 [main] fix AI Basic Sku by exporting proxy function\n- #2373 add withCredentials config\n- #2388 [main] enhance exception telemetry with optional script Information\n  - !! **New config `expCfg`** is available to provide more details of exception telemetry. See more details [here](https://microsoft.github.io/ApplicationInsights-JS/exceptionTelemetry)\n\n\n### Web snippet additional update to 1.2.1 (July 10th, 2024)\n\nThis release includes fix for dependency problem in version 1.2.0, check [#2369](https://github.com/microsoft/ApplicationInsights-JS/issues/2369) for more detail.\n\n### Changelog\n- #2374 [main][snippet] remove the snippet dependency on web package\n\n### Web snippet additional update to 1.2.0 (June 21st, 2024)\n\nThis release includes support for multiple snippet loading. Snippets with different names (passed in by the user via configuration; check [##2355](https://github.com/microsoft/ApplicationInsights-JS/issues/2355) and README for more details) can now run simultaneously.\n\n\nAdditionally, users can pass in a customized configuration with getSdkLoaderScript to get a ready-to-use snippet.\n\nUsers can also enable Integrity Check and minimize snippet loading time by setting sri to true.\n\n\n### Changelog\n- #2365 [main][snippet] prepare new snippet release, add support for more config \n- #2360 [main] set script attribut to avoid race condition when multiple sdks are inited #2355 \n- #2339 [main] create snippet mini loader\n\n## 3.3.0 (July 1st, 2024)\n\n### Potential breaking change\n\nThis release contains a potential break change due to enhancing the definition of the [IConfiguration](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/IConfiguration.ts) to support Promise types for the connectionString, instrumentationKey and endpointURL; any extension that relies on these base interfaces will VERY likely cause TypeScript to fail with potential warnings about the types being different.\n\n### Changelog\n\n- #2371 Bump @microsoft/rush from 5.97.1 to 5.129.6\n- #2340 [Main][Task]27939476: Initialization with iKey and endpoint to be promises\n\n!! potential breaking changes. IConfiguration support Promise types for the connectionString, instrumentationKey and endpointURL\n- #2366 [Sdk Loader] Increase version to 1.2.0\n- #2367 [main] update the way to generate ajax perforamance mark prefix \n\n## 3.2.2 (June 11th, 2024)\n\n### Changelog\n\n- #2356 [Main][Task]27488189: Modify offline support enums for isolated mode\n- #2357 [Main][Task]28050373: Expose Offline Support SendNextBatch function\n- #2358 [Main][Task]27080650: Initialization Should Handle Offline Support Dependency\n- #2362 [Main]Publishing: Add support for Az Modules instead of AzureRM Modules\n- #2360 set script attribut to avoid race condition when multiple sdks are inited\n\n## 3.2.1 (May 9th, 2024)\n\n### Changelog\n\n- #2333 [Main][Task]27749889: Change AISKU Sync Mode to Receive\n- #2335 [Main][Task]27681441: Fix async tests for MsAzure Migration\n- #2338 [Main][Task]27923018: Post Channel getOfflineSupport should set correct headers and url based on payload data\n- #2342 [Main][Task]27923018: 1ds post getOffline support url fix\n\n\n## 3.2.0 (Apr 23rd, 2024)\n\n!! CfgSync plugin is turned on. Throttling Ikey depreciation message is enabled with sampling rate 0.0001%\n[##2317](https://github.com/microsoft/ApplicationInsights-JS/pull/2317)\n\n!! Sender has breaking changes. The key used for session storage is changed and items stored in the storage now contain retry counts.\n[##2324](https://github.com/microsoft/ApplicationInsights-JS/pull/2324)\n\n### Changelog\n\n- #2371 [Main][Task]27365739 Turn on Ikey depreciation message with sampling rate 0.0001%\n- #2319 [Main] Fix config release script overwrite flag and cache time\n- #2321 [Main] Default request headers content-type for 1ds should be x-json-stream only ing\n- #2324 [Main][Task]27079894 Add a max retry count for Sender\n- #2325 [Main][Task]25716927: Change default CfgSync values to turn on the ikey deprecation message\n- #2331 [Main] Resetting the DataCacheHelper version number back to current version (from 3.0.5)\n- #2332 [Main][Task]27742145: Change nonOverrideCfgs to be added only during initialization\n- #2333 [Main][Task]27749889: Change AISKU Sync Mode to Receive\n\n## 3.1.2 (Mar 21st, 2024)\n\n!! Critical Bug fix for Memoery Leak !!\n[#2311](https://github.com/microsoft/ApplicationInsights-JS/issues/2311)\n\nIt also contains a packaging fix for webpack [#2307](https://github.com/microsoft/ApplicationInsights-JS/issues/2307) (caused by [#2306]](https://github.com/microsoft/ApplicationInsights-JS/issues/2306) ) and \n\n### Changelog\n\n- #2307 ApplicationInsights-JS latest version 3.1.1 giving TypeError: Cannot read properties of undefined (reading 'getCrypto')\n- #2306 [BUG] Circular dependencies\n- #2311 [BUG] Excessive memory usage for SPA where unload hooks keep accumulating\n- #2299 [Main][Task]27156360: Add json config cdn details to tool folder\n- #2308 [Main][Task]27221819: Remove node 14 (from ci.yml)\n\n## 3.1.1 (Mar 12th, 2024)\n\n### Changelog\n\n- #2296 [BUG] remove 403 as a “retriable” error code\n- #2276 Update api-docs (typedoc) with the current 3.1.0 release details\n- #2281 [Main][Task]26681188: Handle endpoint url change for offline channel and add notification mgr\n- #2282 Addng two new PII Kind values for IPv6 scrubbing and dropping data.\n- #2285 [Main][Task]25693679: Extract common sendPost implementation for online and offline sender\n- #2197 [main] [BUG] using EndPointUrl (and IngestionEndpoint) results in Telemetry sent to incorrect urls\n- #2288 [Main][Task]27064950: Add doc on adding offline support channel\n- #2295 [Main][Task]27064983: Update post channel to use sender post common interfaces from core\n- #2290 chore: remove extraneous console log from debug plugin\n\n### Web snippet additional update to 1.1.2 (March 1st, 2024)\nRefer to #2284 [Web-Snippet] [BUG] @microsoft/applicationinsights-web-snippet version 1.1.1 type problem \n\n### Web snippet additional update to 1.1.1 (Feb 16th, 2024)\nRefer to #2277 [Web-Snippet] dependency chain issues\n\n## 3.1.0 (Feb 14th, 2024)\n\n### Interface changes / Breaking changes\n\nThis release includes support for a new Offline Channel which has changed the `IChannelsControls` interface to include additional support for the new `offline` channel. This change is to support the new `offline` channel and is a breaking change for any custom channels that implement the `IChannelsControls` interface. If you have a custom channel that implements the `IChannelsControls` interface you will need to update your implementation to include the new `offline` channel.\n\n### Configuration default changes\n\nAs this is a minor version bump we have also change some default values for the following configuration options:\n\n- `disableUserInitMessage` is now `true` by default to disable the user init message.\n\n### Potential breaking change\n\nThis release contains a potential break change with 'tags' type [change](https://github.com/microsoft/ApplicationInsights-JS/pull/2269)\n\nWhile the interface changes are breaking changes, the changes are not expected to affect the majority of users as when the code attempted to serialize the `tags` property it would have failed due to the `Tags[]` type being used instead of the correct `Tags` type.\n\n#### Old\n\n```ts\n    tags?: Tags & Tags[]; \n```\n\n#### New\n\n```ts\n    tags?: Tags;\n\n```\n\n#### New Offline Channel\n\nThis release also includes the new `offline` channel which is a new channel that is designed to support offline scenarios. The `offline` channel is designed to store telemetry items in local storage and then send them when the user comes back online.\nTo take full advantage of the initial version you will need to implement your own IOfflineListener to handle situations where you may have \"network\" connectivity but not internet access. As the `navigator.onLine` property if available will only tell you if you have network connectivity and not internet access.\n\n### Changelog\n\n- #2186 [main] offlineListener preparation\n- #2241 [Main][Task]26451789: Add Offline Support\n- #2259 [Main][Task]26694421: Add Offline Support Publish Group\n- #2267 [Main][Task]26681220: Better handle timers in offline channel\n- #2028 [BUG] AI (Internal): 72 tracking\n  - Sets the default value for the `disableUserInitMessage` to `true` (was previously false since adding)\n- #2193 [main] Add extra config in sender to let users define transports type\n- #2200 [main] [doc] Highlight an issue with the default UMD module format when loading from the CDN into an environment that may have require.js\n- #2208 [Main][Task]26079397: Add disableBeaconSplit sender config and fix potential duplicated events during unload/fallback sender\n  - #2236 [Main][Task]26396663: Set default disableBeaconSplit to true\n- #2204 [BUG] Beacon sender reports error for success when diagnostics are enabled\n- #2214 [main] Merge Release-3.0 to main\n- #2221 [main] Fixup the ci.yml to address internal hash changes between different node versions\n- #2216 [Main][Task]26138416: Fix FetchKeepAliveSender send duplicated events during unload\n- #2228 [main] minor release preparation\n- #2229 [main] [doc] add requireJs problem in SdkLoadFailure.md\n- #2132 [BUG] Submitting NaN via trackEvent results in HTTP 400 Error Code\n- #2238 [Main] Merge release-3.0 to main\n- #2244 Internal Task: Update npm pack sequence\n- #2249 [main][1ds] Enhance Retry Policy Testing for Alignment with Collector Policy\n- #2245 [main] [snippet update] add functions to set configs of snippet\n- #2250 [main] [doc] minor comment update for avoidOptions\n- #2251 [Main][1DS][Post] Add support for the ext.metadata to NOT be included\n- #2253 [Main] Update Tests to support upcoming change in nevware21/tsutils dumpObj to better support JSON stringify and handle PURE comments\n- #2255 [main] #2225 pass customer exception id into telemetry\n- #2247 [main] [1ds-post] export add header func for auth-plugin to consume\n- #2209 [BUG] stopTrackEvent requires property values to be strings\n  - #2268 [main] Add example of how to use stopTrackEvent #2209\n  - #2270 [main] correct types define for stopTrackEvent and stopTrackPage for #2209\n- #2258 [BUG] ITelemetryItem uses intersection type instead of union type for tags property  \n  - #2269 [main] **[Possible Break]** Removed Tags[] from ITelemetryItem as this was breaking later versions of TypeScript by using the intersection type instead of union type for tags property\n- #2272 [release 3.0.8] Fix channel test\n- #2271 Cherry-pick from release-3.0 branch\n  - [Release-3.0] [Release] Increase version to 3.0.8 ([Release-3.0] [Release] Increase version to 3.0.8 #2264)\n  - [Release-3.0] Update namespaced types (DTS) generation to include referenced bundles\n\n\n## 3.0.8 (Feb, 7th, 2024)\n\nThis release changes the new beacon splitting code (added in 3.0.4) to be `disabled` by default. This change is to address the issue where the SDK was splitting the payload into multiple requests when the payload size exceeded the maximum allowed size for a single request. This issue was introduced in the 3.0.4 release and only affects the `sendBeacon` usage during page unload, it does not affect the `fetch` usage during page unload. This change is to address the issue where the SDK was splitting the payload into multiple requests when the payload size exceeded the maximum allowed size for a single request. This issue was introduced in the 3.0.4 release and only affects the `sendBeacon` usage during page unload, it does not affect the `fetch` usage during page unload.\n\n### Changelog\n\n- #2235 [BUG] - CRITICAL - Application runs out of memory\n  - #2236 [release-3.0] Cherry-Pick: [Main][Task]26396663: Set default disableBeaconSplit to true\n- #2242 [release-3.0] Update components\n  - Update @microsoft/dynamicProto-js to address possible prototype pollution issue\n- #2254 [Release3.0] Update Tests to support upcoming change in nevware21/tsutils dumpObj to better support JSON stringify and handle PURE comments\n- [Release 3.0] Update components for release #2261\n  - Update @nevware21/ts-utils version for better minification support\n\n## 3.0.7 (Dec 14th, 2023)\n\n### Changelog\n\nThis release is a hotfix for issue #2216, which is simular to the issue fixed in `3.0.6` but for the `fetch` (with the keep-alive flag).\n\n### Changelog\n\n- #2216 [release-3.0] Cherrypick (main): fix fetchkeepalive\n- #2221 [release-3.0] Cherrypick (main): Fixup the ci.yml to address internal hash changes between different node versions\n\n## 3.0.6 (Dec 7th, 2023)\n\nThis release fixes an issue with the `sendBeacon` usage during page unload, where the SDK was not correctly splitting the payload into multiple requests when the payload size exceeded the maximum allowed size for a single request. This issue was introduced in the 3.0.4 release and only affects the `sendBeacon` usage during page unload, it does not affect the `fetch` usage during page unload.\n\n### Changelog\n\n- #2195 [BUG] Beacon sender causes flood of thousands of requests on page unload\n- #2201 [BUG] applicationinsights.azure.com/v2/track making hundreds of thousands of requests when third party cookies are disabled\n- #2205 [BUG] Duplicate customEvent entries\n- #2204 [BUG] Beacon sender reports error for success when diagnostics are enabled\n\n## 3.0.5 (Nov 1st, 2023)\n\n### Changelog\n\n- #2184 [main] deactive send beacon when local storage is available \n- #2185 [main] retrieve reponseText when fetch in HttpManager\n- #2188 [main] generate typedoc\n- #2190 [Main][Task]25648004: Export ISenderConfig from Sender\n- #2191 [Main][Task]25649658: Update AISKU Light to add default baseType and baseData when calling track function \n\n## 3.0.4 (Oct 16th, 2023)\n\n### Changelog\n\n- #2162 [BUG] window is not defined at _getStackFromErrorObj \n- #2163 [BUG] Using App Insights connection string leads to double slash \n- #2164 [BUG] Fetch with empty string as first parameter does not include traceparent and does not successfully save dependency to Application Insights\n- #2165 [main] use proper URL for tracking when fetch is passed an empty string \n- #2180  [BUG] Same timestamp on multiple pageView-events after upgrade to 3.0.3 \n- CfgSyncPlugin improvment\n  - #2166 [main] correct throttle configdefault setting in aisku \n  - #2168 [Main][Task]24499167: add cfgSync plugin doc \n  - #2171 [main] test aisku config could correctly merge new config fetch from cdn \n  - #2175 [main] Update Service Notifications to not send message twice \n  - #2177 [Main]Set CfgSync version to 3.0.3 \n  - #2160 [Main] Include Config sync in publish group \n- Documentation update\n  - #2169 [Main][Task]24499172: add throttle manager doc \n  - #2170 [Main][Task]24499174: Add service notification doc \n- Github workflow improvement \n  - #2173 Add Issue state reporting script \n- Sender Update\n  - #2113 [Main][Task]16238553: Provide an override option for the Sender\n\n## 3.0.3 (Sep 20th, 2023)\n\n### Changelog\n\n- #2157 [Main] Bug New minified bundles are corrupting global scope\n- #2120 Missing traceparent header when running multiple SDK instances\n  - #2144 [Main][Part 2] Missing traceparent header when running multiple SDK instances #2120\n  - #2141 [Main][Bug] Missing traceparent header when running multiple SDK instances #2120\n- #2149 [BUG] Fetch with empty string as first parameter ignores second parameter when fetch tracking is enabled\n  - #2152 [main] allow empty string as first parameter to fetch\n- #2127 [Main] Add automated ability to reset the npm latest tag to a specific build\n- #2106 Consider export IClickAnalyticsConfiguration from the click plugin?\n- #2086 [BUG] Field 'fileName' on type 'StackFrame' is too long. Expected: 1024 characters\n  - #2118 [Main] [BUG] Field 'fileName' on type 'StackFrame' is too long. Expected: 1024 characters #2086\n- #2094 _getVerifiedStorageObject - contentious sessionStorage element\n  - #2110 [main] add prefix before storage name when setting it\n- #2137 [Main] Fix: edge case where the navigation entry is not present\n- #2135 Update @nevware21 base versions\n- #2104 [main] Use the navigation entry timeing for page load event start time\n- #2116 [Main] Fixup setVersion to support automated nightly release\n- #2097 disablePageUnloadEvents lost somewhere #2097\n- Internal Task 15757413: [VSCode] [1DS] Move 1DS Core and 1DS Post to GitHub #2102\n- #2089 [BUG] The v3.x exporting of the TelemetryContext does not export the sessionManager \"type\"\n- [BUG] Readme Issue for perfmarkmeasure @microsoft/applicationinsights-applicationinsights-perfmarkmeasure-js@ #2150\n- #2139 V3 Public CDN URL\n- #2093 Update project clean to make faster\n\n- Add support for service level notifications (disabled by default in this release, will be enabled by default in a future release)\n  - #2147 [main] throttle manager in aisku sending message\n  - #2133 [Main][Task]24841107: Refactor throttleMgr to support multiple message keys\n  - #2090 [Main][Task]17874465:Support Config sync across instances\n  - #2125 [Main][Task]24677395:add configurations for CDN to enable specific users opt-in implementation\n  - #2115 [Main][Task]24662146: cfgSync plugin improvement: timer handling for fetch/xhr\n\n- SDK Loader Updates (version 7 - will be published after this release is deployed to the CDN)\n  - #2091 rework web snippet (Convert to TypeScript)\n  - #2099 change loader src when detect IE\n  - #2098 Extend the config part in Min\n  - #2131 [main] Adding round robin retry for snippet script src loading\n\n## 3.0.2 (May 23rd, 2023)\n\n### Changelog\n\n- #2068 [BUG] SDK fails to initialize when the config includes objects with properties that are not configurable\n- #2075 [BUG] ClickAnalytics throwing errors in console\n- #2065 Type 'T' does not satisfy the constraint 'IConfiguration'\n- #2079 [BUG] The SDK is not limiting the sdkVersion length, which causes the night builds to cause an error\n- #2061 [BUG] hasDocument should be invoked as function\n- #2064 [Main] Task 20788238: [AI] Add ApplicationInsights namespace and workaround to support v2 and v3 loaded from the CDN\n- #2070 [Main] Update Minify script to always sort imports\n\n## 3.0.1 (May 2nd, 2023)\n\n### Changelog\n\n- #2057 [Main] Add ability to disable the pollInternalLogs via config and change to stop using setInterval #2055\n- #2051 [Main] Fix Perf Tests\n- #2053 [Main] [BUG] Typing issue with generated types causing Type X is not assignable to type Y #2052\n- #2058 [Bug] Fix issues related to dynamic config listeners during unloading\n  - Add Promise support during unloading\n\n## 3.0.0 (Apr 12th, 2023)\n\n#### Major release with breaking changes from v2.x see [v3.x Breaking Changes](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v3_BreakingChanges.html) for details.\n\nMaintained from the `main` branch, v2.x is in maintenance mode on the `master` branch\n\n### Changelog\n\n- All code from 2.8.12 has been merged into the `main` branch and therefore this release\n\n#### Major Changes\n\n- Removed ES3 (IE8) Support\n- Enabled dynamic config changes after initialization\n  - #1427 Dynamically updating config (for extensions in my case)\n\n- Too many individual commits to include as most revolve around the breaking changes and enabling dynamic configuration support for each extension\n  - All Extensions now **share** the same configuration object `core.config` in previous releases each component maintained their own copy with their own default values, now all defaults and configuration values are exposed on the shared config.\n  - By default the config object passed in during initialization is NOT the same object as that used as the shared config. Any previous assumptions around this being the same object will now be broken as this was a previously unsupported scenario.\n  - All properties of the config object are now using get/set functions (via Object.defineProperty) to allow listeners to be registered (`core.onCfgChange` and internally `onConfigChange`) so that the callback function will be called if any referenced config property is changed. Yes, this means you can register your own configuration listener via `core.onCfgChange` see the [AISku Manual Test](./AISKU/Tests/Manual//HelloWorld.html) for an example.\n  - All properties present during initialization are converted into dynamic properties and may be monitored, properties added \"after\" creation (initialization) are not. This is to continue to support IE which does not support `Proxy` implementation which also means we are not using the `Proxy` class.\n  - Extensions are now responsible for listening and responding to the configuration changes that they want to support\n  - Updating the config `extensions` and `channels` is NOT supported, you must use the individual plugin add / remove functions if you want to dynamically add / remove extensions / channels\n  - Support for parallel channels was removed from the Core and SKU's and extracted to the new `TeeChannel`, if you require this support you will need to use npm and include this module. \n- v2.x Extension support.\n  - While the basic API and support for Backward compatibility for the v2.x extension (plugin) API was maintained, due to the breaking changes (specifically the removal of the namespaced helpers) this will only support self contained components (without recompiling). Any npm module that attempts to import and use a removed helper function will potentially break and will need to be updated to use the newer or replacement helper functions (see the v3.x Breaking Changes for details), if you find an issue and are not able to work around please [raise an issue](https://github.com/microsoft/ApplicationInsights-JS/issues).\n\n## 2.8.13 (May 1st, 2023)\n\n### Changelog\n\n- #2052 [BUG] Typing issue with generated types causing Type X is not assignable to type Y\n- #2055 Add ability to disable the pollInternalLogs via config and change to stop using setInterval\n- #2049 [Master] Fix Perf Tests\n\n## 2.8.12 (Apr, 11th, 2023)\n\n### Changelog\n\n- #2014 [BUG] The documentation for enableDebug is incorrect, it should reference enableDebugExceptions\n- #2027 [BUG] SDK LOAD Failure reporting not working\n- #2034 [BUG] Failed XHR request after ever tracked item when gathered logs exceed maxBatchSizeInBytes while offline\n- #2037 [Master] Add local storage-based implementation #1419\n  - Add support for user provided storage option for Sender\n- #2029 [Master] Add npm-pack and npm-publish tasks\n- #2026 [Master] Fix examples, Throttle tests and export dependency types from Sku\n\n## 2.8.11 (Mar 8th, 2023)\n\n### Changelog\n\n- #1996 [BUG] SharedWorker does not Instrument fetch correctly\n- #1995 [BUG] App Insights not auto-capturing from a Web Worker\n  - Stops logging that workers can emit the PageView Performance event\n- #1792 [BUG] Documentation should clarify that node apps should use applicationinsights, not this package\n- #1794 [BUG] link on AISKULight goes to not found page\n- #1990 Field 'assembly' on type 'StackFrame' is too long. Expected: 1024 characters [BUG]\n- Update documentation and tests to replace `instrumentationKey` usage with `connectionString`\n  - #1997 Change Readme\n  - #1999 Add snippet connection string tests\n- #1991 Internal Task 17133116: Add Policheck exclusion file\n- #1989 [AI][Task]17099792: Add sample and doc to dependency plugin\n\n## 2.8.10 (Feb 6th, 2023)\n\n### Changelog\n\n- #1940 [BUG] Application Insights reports 'not_specified' to Azure when tracking unhandled browser exception\n- #1979 [BUG][ThrottleMgr] Incorrectly fires based on the number of days past\n- #1970 Add the Aborted flag to the dependency initializer / listeners\n- #1981 [AI][Task]16961420: fix throttleMgr incorrectly fires based on the number of days past\n- #1956 [AI Light][Task]14130466: Instrumentation key API is being deprecated - need to add support\n- #1962 Add --no-sandbox to test runs\n\n## 2.8.9 (Oct 25th, 2022)\n\n- Updates Chrome Debug Extension to 0.3.9\n\n### Changelog\n\n- #1920 Update to DynamicProto v1.1.7\n- #1935 Update to @microsoft/applicationinsights-shims: 2.0.2\n  - #1911 Uncaught ReferenceError: global is not defined\n- #1912 Update PerfTests to use the latest version\n- #1916 [Bug] Fix randomly failing tests\n- #1915 Fix CodeQL Identified potential Issues\n- #1906 [Task]14569737: add throttle cdn config\n- #1930 Remove the source-map-loader from the package.json as we don't use it.\n\n## Shims 2.0.2 (Oct 24th, 2022)\n\n## Changelog\n\n- #1911 Uncaught ReferenceError: global is not defined\n\n## 2.8.8 (Oct 3rd, 2022)\n\n- Updates Chrome Debug Extension to 0.3.8\n\n### Changelog\n\n- #1679 [BUG] enableUnhandledPromiseRejectionTracking shows no error trace\n  - #1900 [Task]15465575: add getErrorstackObj from reason.stack\n- #1901 [Feature] Add option to block the creation and usage of the cookies by name\n- #1904 Fixed release notes, previously used a deprecated file.\n\n## 2.8.7 (Sept 7th, 2022)\n\n- Updates Chrome Debug Extension to 0.3.7\n\n### Changelog\n\n- #1863 [BUG]urlCollectQuery not work for applicationinsights-clickanalytics-js\n  - #1874 Add clickanalytics plugin url config back\n- #1875 [BUG] error thrown using basic version + NPM setup\n  - fix(AISKULight): call getSKUDefaults after it's defined, change this\n- #1878 [JS SDK] Update Retry logic to handle additional response codes\n- #1890 [BUG] Behavior difference for an empty endpointUrl when upgrading from v1 to v2\n- #1895 Fix incorrect disableFetchTracking documentation\n- #1887 maxAjaxCallsPerView doesn't account for filtering by TelemetryInitializer\n  - adds addDependencyInitializer()\n\n## 2.8.6 (Aug 2nd, 2022)\n\n- React plugin is now located and released from [it's own repo](https://github.com/microsoft/applicationinsights-react-js)\n- React Native plugin is now located and released from [it's own repo](https://github.com/microsoft/applicationinsights-react-native)\n- Updates Chrome Debug Extension to 0.3.6\n\n### Changelog\n\n- #1862 [BUG] Remote Dependency requests don't \"always\" have the correct ai.operation.id tag (page view race condition)\n- #1870 [BUG] Performance improvements when calling newGuid multiple times (like 10,000)\n- #1865 Update and add legal compliance notices and license terms\n- #1866 Remove React-JS and React-Native code from this repo\n\n## 2.8.5 (Jul 6th, 2022)\n\n- Updates React Plugin to v3.3.5 (with v2.8.5 as dependency) -- using React 17\n- Updates React Native Plugin to 2.5.5 (with v2.8.5 as dependency)\n- Updates Chrome Debug Extension to 0.3.5\n\n### Changelog\n\n- #1636 [BUG] measurements not being sent when using stopTrackEvent(name, properties, measurements);\n- #1857 [BUG] CDN Packaging is not exposing the internal tools (CoreUtils / Telemetry / etc)\n  - This was caused by the updated tree-shaking component that we used, fixing this has increased the CDN payload but it provides backward compatibility again\n- #1852 [BUG] Snippet initialization with IE8 fails with minified code (works with un-minified code)\n  - This was specific to IE8 usages\n- #1076 Refactor code to provide better tree shaking and minification of generated code\n  - Final stage which provides automatic name crunching, however, because of the fix for #1857 the CDN package size does not show the full effect of this improvement\n- #1860 Address Component Governance issues\n\n## 2.8.4 (Jun 1st, 2022)\n\n- Updates React Plugin to v3.3.4 (with v2.8.4 as dependency) -- using React 17\n- Updates React Native Plugin to 2.5.4 (with v2.8.4 as dependency)\n- Updates Chrome Debug Extension to 0.3.4\n\n### Changelog\n\n- #198 Run-time Telemetry initializers for Ajax requests\n- #176 Single Page Application Page View Tracking\n- #1776 How to modify traceflag in traceparent header?\n- #1846 Task 7496325: Add Distributed tracing population for the properties for the core\n- #1838 [master] Task 14447552: Fix Component Governance vulnerabilities\n- #1841 Adding Microsoft SECURITY.MD\n- #1845 add readme for ikey error messge\n- #1840 add disableIkeyMessage config\n\n## 2.8.3 (May 3rd, 2022)\n\n- Updates React Plugin to v3.3.3 (with v2.8.3 as dependency) -- using React 17\n- Updates React Native Plugin to 2.5.3 (with v2.8.3 as dependency)\n- Updates Chrome Debug Extension to 0.3.3\n\nThis release has been manually validated to work with IE8 both directly and by extending the provided classes. While the previous version 2.8.2 also fully supported IE8 it did not handle classes extending the all of Core classes correctly in multiple cases. If you need to support IE8 it is strongly advised that you upgrade to, validate and use this version.\n\n### Changelog\n\n- #1831 Updates to dynamicProto() v1.1.6 which provides a final edge case fix for IE8\n  - [#50](https://github.com/microsoft/DynamicProto-JS/issues/50) [IE8] Fix in 1.1.5 only handles 2 levels of dynamically nested classes\n- #1828 Update README.md to redirect to Node.JS\n- #1829 Extracting HOC tracked component class base for re-use\n- #1804 [BUG] Error type in AppInsightsErrorBoundary after upgrading to react 18\n\n## 2.8.2 (May 2nd, 2022)\n\n- Updates React Plugin to v3.3.2 (with v2.8.2 as dependency) -- using React 17\n- Updates React Native Plugin to 2.5.2 (with v2.8.2 as dependency)\n- Updates Chrome Debug Extension to 0.3.2\n\nThis patch release restores complete ES3 support (broken in 2.8.0) and IE8 support (broken eariler via dynamicProto()) for the Sdk.\n\n### Changelog\n\n- #1822 [BUG] v2.8.1 with a Hosted IE environment fails to initialize for a hosted instance of IE #1822 (#1824)\n- #1823 [BUG] IE8 Support was broken by several components #1823\n- Also updates to dynamicProto() v1.1.5 to restore IE8 support\n\n## 2.8.1 (Apr 22nd, 2022)\n\n- Updates React Plugin to v3.3.1 (with v2.8.1 as dependency) -- using React 17\n- Updates React Native Plugin to 2.5.1 (with v2.8.1 as dependency)\n- Updates Chrome Debug Extension to 0.3.1\n\nThis patch release restores TypeScript 3.x support for the Sdk.\n\n### Changelog\n\n- #1807 [BUG] Angular project doesn't build after install latest version v.2.8.0\n- #1810 v2.8.0 has incompatible TypeScript 3.x type declaration\n- #1812 [BUG] Browser exceptions are no longer automatically tracked after 2.8.0\n- #1814 [BUG]SPFx React project doesn't build after latest version of @microsoft/application-insights-core-js v.2.8.0 got published\n\n## 2.8.0 (Apr 16th, 2022)\n\n- Updates React Plugin to v3.3.0 (with v2.8.0 as dependency) -- using React 17\n- Updates React Native Plugin to 2.5.0 (with v2.8.0 as dependency)\n- Updates Chrome Debug Extension to 0.3.0\n\n### Potential Breaking Change\n\n- `fetch` Ajax tracking was also been change to be on by default from this version moving forward, if you are running in an environment without `fetch` support and you are using an incompatible polyfill (that doesn't identify itself as a polyfill) or the SDK you start seeing recursive or duplicate (`fetch` and `XHR` requests) being reported you WILL need to add `disableFetchTracking` with a value of `true` to your configuration to disable this functionality.\n- TypeScript 4.x required for some typings from the core EnumHelperFuncs.d.ts  (Fixed in v2.8.1)\n\n### Significant changes\n\nThis release adds support for the SDK to\n\n- TelemetryInitializers have been moved to `BaseCore` so they are now available as part of all Sku's and not just those using the `analytics` plugin (@microsoft/applicationinsights-analytics-js) using the `appInsights.addTelemetryInitializer(...)`\n- Web Events (addEventHandler) now support \"event namespaces\" (similar to jQuery) to enable the removing of events by just specifying the namespace and new specific `eventOn(...)` and `eventOff(...)` API's.\n- Fully unload, removing all internal event handlers (may be re-initialized) via the `appInsights.unload(...)` function.\n- Dynamically add a plugin to an already initialized SDK (optionally replacing an existing) via new `appInsights.addPlugin(...)` function\n- New helper to get any plugin from an initialized SDK via `appInsights.getPlugin(\"...identifier...\")`\n- Dynamically remove a plugin via the `appInsights.getPlugin(\"...identifier..\").remove()`\n- Enable / Disable any plugin (even if the plugin doesn't support disabling itself) via `appInsights.getPlugin(\"...identifier...\").setEnabled(true/false)`\n- The standard name fro the `analytics` plugin @microsoft/applicationinsights-analytics-js has been renamed and is now exported as `AnalyticsPlugin`, for backward compatibility it is also exported as it's previous name `ApplicationInsights`, if you are using it directly it is recommended that you update to use the new exported name.\n\nWhile this release contains a substantial amount of additional functionality and code, there has also been significant minification efforts (which also drove some of the SDK naming) to keep the minified code around the same size. We intend to keep working on additional improvements to attempt to bring the size changes down further. However, the minification improvements do generally cause a lower level of GZip compression most because of the removal of duplicate names. The main readme for the [AISKU](https://github.com/microsoft/ApplicationInsights-JS/tree/master/AISKU) has a table of the CDN base SKU sizes, as the CDN version includes all public API's (older versions for backward compatibility and newer smaller versions) when using NPM you should see smaller sizes than those shown.\n\n> Note:\n> Due to the above changes required to support the above, there may be some minor TypeScript Type compatibility warnings when you attempt to use components from v2.8.0 with older SDK's (forward compatibility), backward compatibility, using Core v2.8.0 with older components is supported and v2.8.0 is completely backward compatible. This is due to some API's now support both older (for back compat) and new enhanced arguments, we have attempted to keep these changes to a minimum.\n> If you are getting typing errors such as \"Argument of type 'XXXXX' os not assignable to parameter of type 'YYYY'\", please ensure that you are using all v2.8.0 components and raise an issue if this does not resolve you issue. As a work around casting to work around this warning should not cause any issues.\n\n> Due the the size of this change, the above date is the NPM release date and CDN deployment will be over an extended period.\n\n### Changelog\n\n- Task 13064945: Enable the option to remove all \"added\" SDK event listeners as part of calling teardown()\n  - Partial, foundational support for #1427 Dynamically updating config (for extensions in my case)\n- #1773 [BUG] IConfig and IConfiguration define different configuration \"names\" for the cookie manager config \n- #1779 Allow including custom properties in useTrackMetric\n- #1791 Merge remote-tracking branch `upstream/beta` into `master`\n  * Update version update script to support default \"next\" release version (major/minor) not just patch (#1756)\n  * Additional Performance enhancements to use provided functions rather than internal polyfill's (#1758)\n  * Enable GitHub Actions on [beta] branch\n  * Beta Part 1: Part of Mega Dynamic Load/Unload support (#1766)\n    - Refactor TelemetryPluginChain ready to start supporting load/unload\n    - Move TelemetryInitializer to BaseCore\n    - add getPlugin (will be used for remove)\n    - Address Channel flush issue\n  * Additional Performance enhancements to use provided functions rather than internal polyfill's (#1758)\n  * Beta Part 2: Part of Mega Dynamic Load/Unload support (#1768)\n    - Add Event Namespace support\n    - Minification of constant values\n    - Add part of the unload functionality (required for unified `teardown()` functionality)\n  * Beta Part 3: Part of Mega Dynamic Load/Unload support (#1780)\n    - Add Core SDK Unload support\n  * Fix telemetry chain for null and undefined\n  * Beta Part 4: Part of Mega Dynamic Load/Unload support (#1781)\n    - Fix function typing issues\n    - Update Analytics Extension to start supporting teardown / unload (more tests required)\n    - Adds namespace option to instrumentation hooks (for debugging teardown issues)\n    - Update AITest Class to log and optionally assert events and hooks that have not been removed\n    - Add Update callback when plugins are added / removed (will be extended for config updates)\n    - Some minor minification improvements\n  * Add missing enum definition\n  * Update Sender tests\n  * Beta Part 5: Part of Mega Dynamic Load/Unload support (#1782)\n    - Add Missing Exports\n    - AnalyticsPlugin: Implement teardown and initial test validation\n    - Dependencies Plugin: Implement teardown and initial test validation\n    - Add flush() to IAppInsightsCore\n  * AI Beta: Minor bug fixes and additional debug info (#1787)\n  * Lint fixes: Enable Automatic formatting fixes (#1788)\n  * Beta Part 6: Part of Mega Dynamic Load/Unload support (#1782) (#1789)\n    - Add basic minimal unload / teardown support to all remaining components\n    - Update rollup cleanup dependencies\n  * Beta: Component Governance Updates to address known dependency issues (#1790)\n- #1793 Master Minification Improvements\n- #1796 Minification - Change to only use const enums internally\n- #1798 More Common Minification Updates\n- #1468 Enable fetch automatic dependency tracking by default\n- #1805 Finalize and Update the processTelemetry helper functions\n\n## 2.7.4 (Feb 28th, 2022)\n\n- Updates React Plugin to v3.2.4 (with v2.7.4 as dependency)\n- Updates React Native Plugin to 2.4.4 (with v2.7.4 as dependency)\n- Updates Chrome Debug Extension to 0.2.4\n\nThis release is primarily a performance improvement release where we will now use any built in (or provided polyfill) function\nover the internal polyfills for\n\n- String trim()\n- String endsWith()\n- String startsWith()\n- Additional Date toISOString()\n- Array isArray()\n- Array indexOf()\n- Array map()\n- Array reduce()\n- Object freeze()\n- Object seal()\n\n### Changelog\n\n- #1754 update react plugin readme\n- #1758 Additional Performance enhancements to use provided functions rather than internal polyfill's\n\n## 2.7.3 (Jan 31st, 2022)\n\n- Updates the @microsoft/applicationinsights-shims module to 2.0.1\n- Updates React Plugin to v3.2.3 (with v2.7.3 as dependency)\n- Updates React Native Plugin to 2.4.3 (with v2.7.3 as dependency)\n- Updates Chrome Debug Extension to 0.2.3\n\n### Changelog\n\n- #1735 [BUG] Dependency tracking is disabled when using an Embedded IE browser control\n- #1736 [BUG] New Fetch keepAlive support can cause duplicate events to be sent during unload processing\n- #1745 [Documentation] Document the deployed Module formats and release process\n- #1746 [Documentation] Update AISku Size tracking\n- #1744 Address CodeQL issues from https://github.com/microsoft/ApplicationInights-JS/security/code-scanning \n- Update to Rush 5.61.3 and NPM 8.4.0\n- #1750 [Performance] Use the Date.toISOString() native function if it exists\n- #1753 [Performance] Cache the result of the getGlobal() to reduce the number of typeof expressions\n\n## 2.7.2 (Dec 7th, 2021)\n\n### Changelog\n\n- #1729 [BUG] Addition of stdDev metric support has broken custom metric reporting from #1680\n- #1727 [BUG] Cannot track exception from service worker\n- #1731 Component Governance - Upgrade to npm v8.1.4\n\n## 2.7.1 (Nov 4th, 2021)\n\n### Changelog\n\n- #1667 Allow properly disposing AI\n  - expose internal log poller #1674\n- #1683 Add support to optionally configure the events used for detecting and handling when page unload and flushing occurs\n- #1655 [BUG] When using Multiple instances of AI only the first instance is correctly reporting ajax events\n- #1093 \"Pause\" sending of messages\n- #1692 [BUG] Field 'ai.operation.name' on type 'ContextTagKeys' is too long. Expected: 1024 characters\"\n- #1691 [BUG] Multiple errors are getting thrown and swallowed during initialization when no instrumentation Key is provided\n  - DiagnosticLogger: Fix typo in defining the console function #1699\n- #1676 React Plugin trackTrace method\n  - add trackTrace and expose analytics extension to react plugin #1697\n- #1680 [BUG] trackMetric does not track stdDev nor sum #1701\n- fix readme traceID generate method #1687\n- Update package.json to include the repository #1696\n- Governance Updates -- update used dependencies #1694\n- Refactor publishing script to combine shared content and support separate nightly container. #1677\n- Enable EsLint auto fixing rules for extra-semicolons, dangling commas and tailing spaces #1669\n- Update Perf Mark and Measure documentation and some exports #1666\n- Update Release script to provide better automated creation of nightly builds #1664\n\n## 2.7.0 (Sept 7th, 2021)\n\n___Major change___: Upgrades build environment to TypeScript __4.x__\n- No known breaking, configuration or definition changes\n\n### Changelog\n\n- #1640 [BUG] enableAjaxErrorStatusText: false (which is the default setting) does not turn off logging error response body\n- #1642 trackEvent() doesn't allow replacing the iKey\n- #1647 [BUG] customProperties parameter missing from trackException function\n- #1648 Update error reporting when a plugin throws an exception\n- #1650 [DebugPlugin] Add an option to disable DebugPlugin processTelemetry logging\n- #1653 Some requests are returning a CORB error for responses containing text content type\n  - The warning is only being reported via the sendBeacon request, therefore not loss of events\n  - Changes the 'unload' operations to try and use fetch with keepalive if available, fallsback to sendBeacon()\n  - Also attempts to send as manay events as possible via sendBeacon, when the payload size is > 64kb\n- #1656 [BUG] 'Cannot use 'in' operator to search for 'ver' in Timeout', name: 'TypeError'}​​​​​\n- #1660 [BUG] ITelemetryTrace parentId cannot be set to undefined\n\nIncludes: [2.7.0-beta.1 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/54)\n\n- #1171 ___Update to TypeScript 4.x___\n- #1526 [TypeScript Compile Error] Property 'sessionManager' does not exist on type 'ITelemetryContext'\n  - #1627 Add sesId to allow access to sessionManager session info\n- #1471 Convert undefined to blank in customDimensions?\n  - #1630 Convert undefined custom properties to empty string\n- #1585 ai_user cookie not present after re-enabling the cookie\n- #1561 How to enrich dependencies logs with context at the beginning of api call?\n  - #1624 Provide a way to enrich dependencies logs with context at the beginning of api call\n- #1633 Add GitHub Automated Lock closed issue action\n\n### New feature (may be release after primary release - out of band)\n\n- #617 Add performance.mark and performance.measure for performance browser tool integration\n\n### <span style='color:blue'>2.7.0-beta.1</span> (August 24th, 2021)\n\n- #1171 ___Update to TypeScript 4.x___\n- #1526 [TypeScript Compile Error] Property 'sessionManager' does not exist on type 'ITelemetryContext'\n  - #1627 Add sesId to allow access to sessionManager session info\n- #1471 Convert undefined to blank in customDimensions?\n  - #1630 Convert undefined custom properties to empty string\n- #1585 ai_user cookie not present after reenabling the cookie\n- #1561 How to enrich dependencies logs with context at the beginning of api call?\n  - #1624 Provide a way to enrich dependencies logs with context at the beginning of api call\n- #1633 Add GitHub Automated Lock closed issue action\n\n### Update React plugin to <span style='color:blue'>v3.2.0-beta.1</span>\n\n- Update Core dependency to v2.7.0-beta.1 Core changes\n\n### Update React Native plugin to <span style='color:blue'>v2.4.0-beta.1</span>\n\n- Update Core dependency to v2.7.0-beta.1 Core changes\n\n## 2.6.5 (August 3rd, 2021)\n\n[2.6.5 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/53)\n\n## Changelog\n\n- #1608 [BUG] empty messages for unhandled promise rejections\n- #1610 [BUG] error logging an error--need to null-check reason\n- #1621 [Task] Create and publish Sub Resource Integrity (SRI) hashes for the generated scripts\n- #1607 Remove AngularPlugin code from master and direct to new repo and angularplugin-legacy branch\n- #1606 Split Tests into Unit / Perf and update all active tests to use common test project\n- #1613 Update Dependencies\n- #1617 Add Stale Issue / PR GitHub Action\n\n### Update React plugin to v3.1.5\n\n- Update Core dependency to ^2.6.5 Core changes\n\n### Update React Native plugin to v2.3.5\n\n- Update Core dependency to ^2.6.5 Core changes\n\n## 2.6.4 (July 6th, 2021)\n\n[2.6.4 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/52)\n\n## Changelog\n\n- #1567 [BUG] Unit of \"PageVisitTime\" is well hidden\n- #1579 Add 307 Redirect Response\n- #1580 [BUG] URL without host fails in CanIncludeCorrelationHeader\n- #1586 [BUG] namePrefix is not getting assigned to ai_user Cookie\n  - #1587 ai_user cookie should use userCookiePostfix for user cookie storage\n- #1590 Task 9901543: Remediate security vulnerabilities (Build Dependencies)\n- #1596 Apply the eslint fixes (from Component Governance policy Checks)\n- #1597 [BUG] The Pointer Events for the DebugPlugin are getting blocked\n- #1599 Add visibilitychange event to the set of events tracked for triggering page unload\n- #1602 [BUG] DebugPlugin - helpers.js:334 Uncaught TypeError: Cannot convert a Symbol value to a string\n- #1472 [Enhancement] Add config to exclude a specific request auto tracking\n- #1446 [FEATURE REQUEST] Ability to stop requests being tracked for array of domains\n\n### Update React plugin to v3.1.4\n\n- Update Core dependency to ^2.6.4 Core changes\n\n### Update React Native plugin to v2.3.4\n\n- Update Core dependency to ^2.6.4 Core changes\n\n## 2.6.3 (June 8th, 2021)\n\n[2.6.3 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/50)\n\n### Changelog\n\n- #1268 Investigate and add a sender that uses fetch when XMLHttpRequest is not available\n- #1545 Cannot modify the request headers and cookies when using a custom endpoint\n- #1546 [Typings] Update the TypeScript typings to identify the readonly properties/fields and dynamic values of the snippet\n- #1541 ITelemetryContext.user is sometimes null - setAuthenticatedUserContext throws\n- #1569 [BUG] Authorization header included when enableRequestHeaderTracking is enabled\n  - As part of this change the [\"Authorization\", \"X-API-Key\", \"WWW-Authenticate\"] headers will NO longer be logged when ```enableRequestHeaderTracking``` is enabled, if you want these headers to be sent to AzureMonitor you will need to override the default ```ignoreHeaders``` config which excludes them (See the [Configuration settings](https://github.com/Microsoft/ApplicationInsights-JS#configuration)).\n- #1558 [BUG] Durations reported as zero (00:00:00.000) in Angular SPA for router changes\n- #363 Script error: Browser exception message not providing information type and method\n- #1568 Add VSCode specific exclusions\n- #1572 Task 9901543: Remediate security vulnerabilities\n\n### Update React plugin to v3.1.3\n\n- Update Core dependency to ^2.6.3 Core changes\n- Update DynamicProto version 1.1.4 (Removes unnecessary dependencies)\n\n### Update React Native plugin to v2.3.3\n\n- Update to React-Native 0.64.2\n- Update Core dependency to ^2.6.3 Core changes\n- Update DynamicProto version 1.1.4 (Removes unnecessary dependencies)\n\n## 2.6.2 (April 22nd, 2021)\n\n[2.6.2 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/49)\n\n### Changelog\n\n- #1536 Update DynamicProto version 1.1.2 (Fixes IE7 mode issue originally reported in #1534)\n- #1280 Investigate removing the globals __extends() and __assign() populated by applicationinsights-shims\n- #1523 Remove exposing global instances of __extends() and __assign() and update sideEffects usage (by removing globals)\n- #1538 [BUG] Telemetry Buffer Getting Cleared in Offline Mode - Online Status Incorrectly Initialized in Offline Listener\n- #1528 [BUG] correlationHeaderExcludePatterns is not honored in Ajax calls\n- #1516 [BUG] App insight library will flush telemetry using beforeUnload event but this event is cancellable\n- #1509 [BUG] Investigate changing the sideEffects: false to list only the files that include the shims module from the all AI modules so that webpack can evaluate correctly\n- #1517 [BUG] addHousekeepingBeforeUnload should also be listening to the 'unload' event\n- #1524 [BUG] Config items are not functional for current snippet disableFlushOnBeforeUnload, disableFlushOnBeforeUnload and maybe others\n- #1440 [BUG] PageViewPerformanceManager.populatePageViewPerformanceEvent() is always returning zero for the network time\n- #1393 [BUG] enableAutoRouteTracking should also update the Operation Name with the hashroute\n- [BUG] Add test coverage for #1518\n- #1510 Update PageView operation name to include the hash\n- #1522 add click plugin version to sdkversion tag\n- #1535 add click plugin js to cdn\n\n### Update React plugin to v3.1.1 (April 26th, 2021)\n\n- Update Core dependency to ^2.6.2 Core changes\n- Update Shims dependency to ^2.0.0 (to address the __extends() and __assign()) issue\n- #1536 Update DynamicProto version 1.1.2 (Fixes IE7 mode issue originally reported in #1534)\n\n### Update React Native plugin to v2.3.1\n\n- Update Core dependency to ^2.6.2 Core changes\n- Update Shims dependency to ^2.0.0 (to address the __extends() and __assign()) issue\n- #1536 Update DynamicProto version 1.1.2 (Fixes IE7 mode issue originally reported in #1534)\n\n## 2.6.1 (Hotfix - March 30th, 2021)\n\n[2.6.1 (Hotfix) Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/48)\n\n### Changelog\n\n- #1518 P1 - [BUG] v2.6.0 is not re-hydrating the automatic session id correctly for each request\n- #1512 Expose the getCookieMgr() on the snippet proxy and analytics web instances\n\n## 2.6.0 (March 23rd, 2021)\n\n[2.6.0 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/47)\n\n### Version bump is due to the following major changes\n\nA large amount of [Tree-Shaking improvements](https://github.com/microsoft/ApplicationInsights-JS#tree-shaking-support-and-enhancements) have been included in this version, please [see the recommendations](TreeShakingRecommendations.md) you may need to apply to your code to take complete advantage of these changes to reduce the overall module sizes (when using NPM packages)\n\nAlso includes major changes to the cookie management, please [see the readme cookie configuration section](https://github.com/microsoft/ApplicationInsights-JS#icookiemgrconfig) and [cookie handling changes](https://github.com/microsoft/ApplicationInsights-JS#cookie-handling).\n\n### Changelog\n\n- General Performance improvements / optimizations\n- #1059 Enable W3C distributed tracing on by default with backward compatibility\n- #1076 Multiple Treeshaking enhancements, [see recommendations](TreeShakingRecommendations.md)\n- #1091 Enable cookie support after the SDK has been initialized\n- #1125 Disable Cookies\n- #1276 [BUG] Does not work with Closure Compiler (possible fix, now generates `applicationinsights-web.d.ts` (This version is namespaced) and `applicationinsights-web.rollup.d.ts` in the dist folder\n- #1434 Ability to specify cookie Path so that AI works behind App Gateway\n- #1473 [BUG] New dts gneration doesn't work when the environment doesn't have powershell (introduced for #1276)\n- #1474 Add initial stamp endpoint redirection logic\n- #1478 [Bug] Ajax tracking for XHR and fetch is not always setting the start time correctly\n- #1496 [BUG] applicationinsights-web npm package does not have types or a types folder.\n- #1498 [BUG][ES6] TypeError: xxx is not a function or TypeError: DynamicProto [XXXX] is not in class heirarchy of [Object] #28\n- #1503 [BUG] New Perf tests are randomly failing when the build environment is busy (tests added as part of #1076 and #1091)\n- Some documentation updates\n\n### Update React plugin to v3.1.0\n\n- Update Core dependency to ^2.6.0 Core changes\n- #1470 Update applicationinsights-react-js to react 17\n\n### Update React Native plugin to v2.3.0\n\n- Update Core dependency to ^2.6.0 Core changes\n\n## 2.5.11 (January 15th, 2021)\n\n[2.5.11 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/46)\n\n### Changelog\n\n- #1452 [BUG] v2.5.10 Snippet Initialization fails to redirect proxied functions -- causing terminal exception\n- #1433 Typo in 'disableInstrumentaionKeyValidation' config property.\n\n### Update Click Analytics plugin to v2.5.11\n\n- Update Core dependency to ^2.5.11 Core changes\n- #1441 [BUG] Fix issues based on pageName,clickevent name and improved the way we collect useful telemetry data\n- Updated Docs\n\n\n## 2.5.10 (November 16th, 2020)\n\n[2.5.10 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/45)\n\n### New extension @microsoft/applicationinsights-clickanalytics-js\n\nProvides the ability to gather telemetry in Web pages to automatic track clicks using data meta tags.\n\n### Changelog\n\n- #1420 Fix issues with for..in usage with prototype extension libraries like ember.js and prototype.js\n- #1417 Adding nuspec for new Snippet nuget package\n- #1415 Update Publishing scripts to allow different container names -- replaces the cdn switch #1415\n- #1411 [BUG] - License file link is invalid #1411\n- #1410 Remove mention of resolution in Device Information\n- #1408 Update publish scripts to support a sub-container\n- #1409 Initial release of new Click Analytics Plugin\n- #1407 Adding logger during core constructor\n- #1403 [Feature Request] Snippet - Add an easier way to inject queue items as part of the snippet config (version 5 of snippet)\n- #1402 [BUG] \"ReferenceError: method is not defined\" from 2.5.5+\n- #420 CDN endpoint\n\n### Update React plugin to v3.0.5\n\n- Update Core dependency to ^2.5.10 Core changes\n\n### Update React Native plugin to v2.2.9\n\n- Update Core dependency to ^2.5.10 Core changes\n\n## 2.5.9 (October 5th, 2020)\n\n[2.5.9 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/44)\n\n### Changelog\n\n- #1395 Update publishing scripts to support automation\n- #1391 Increase the randomness and size of the sessionId (newId())\n- #1390 using older version of types/cheerio dependecy\n- #1389 take out SPO support\n- #1388 Bump shims version for React, React-Native and Angular to latest.\n- #1384 Add sideEffects field to applicationinsights-shims package.json\n  - Use updated Shims module (v1.0.2)\n- #1381 [BUG] NPM package for @microsoft/applicationinsights-angularplugin-js does not have a dist folder\n- #1377 [BUG] Session storage buffers being initialized though configured not to use\n- #1375 Make AI JS SDK for with NativeScript-Angular\n  - Use updated Shims module (v1.0.1)\n- #1374 indexof is wrongly cased\n- #1365 correlationHeaderExcludePatterns added to IConfig\n- #1364 [BUG] PerfManager and NotificationManager are not exported in AISKU\n- #1363 [BUG] correlationHeaderExcludePatterns missing from types\n- #1361 Debug plugin readme changes\n- #1359 Add trackMetric method for Angular plugin\n- #1358 Add snippet setup for SPO extension solution and update README\n\n### New Package applicationinsights-shims v1.0.2\n\n- #1384 Add sideEffects field to applicationinsights-shims package.json\n\n### New Package applicationinsights-shims v1.0.1\n\n- #1375 Make AI JS SDK for with NativeScript-Angular\n\n### Update React plugin to v3.0.4\n\n- Update Core dependency to ^2.5.9 Core changes\n\n### Update React Native plugin to v2.2.8\n\n- Update Core dependency to ^2.5.9 Core changes\n\n## 2.5.8 (August 31st, 2020)\n\n[2.5.8 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/43)\n\n### Changelog\n\n- #1356 add documentation on how to make snippet changes\n- #1355 update angular package name\n- #1350 [BUG] The new IPerfEvent is using Date.now() which is not supported in an ES3 environment\n- #1349 Update angular plugin track pageview logic and test\n- #1343 [BUG] IPerfManager interface - the create() function is defined to return an IPerfEvent and not an IPerfEvent?\n- #1340 Instrumentation Key validation\n- #1018 Error Mismatched anonymous define() module\n  - #1352 add .cjs.js and .cjs.min.js\n\n### Update applicationinsights-rollup-es3 to v1.1.3\n\n- #1350 [BUG] The new IPerfEvent is using Date.now() which is not supported in an ES3 environment\n  - Added additional checks for Date.now() and Performance Api perf.now()\n\n### Update React plugin to v3.0.3\n\n- Update Core dependency to ^2.5.8 Core changes\n\n### Update React Native plugin to v2.2.7\n\n- Update Core dependency to ^2.5.8 Core changes\n\n## 2.5.7 (August 7th, 2020)\n\n[2.5.7 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/42)\n\n### Changelog\n\n- #1335 Add Performance / Testing support\n  - Added IPerfManager and IPerfEvent interfaces to allow performance review / monitoring of the internal operations\n  - [Performance Manager Documentation](./docs/PerformanceMonitoring.md)\n- #1334 [BUG] Getting XMLHttpRequest and XDomainRequest is not defined errors for gatsby environment\n- #1333 [BUG] DebugPlugin various updates\n- #1331 AppInsightsCore: Enable setting NotificationManager during initialization\n  - #1076 Refactor code to provide better tree shaking and minification of generated code\n  - Updated Sender and support classes to move all private properties and methods into constructor closure\n- #1328 applicationinsights-debugplugin-js: fixed various issues and updating to beta-2\n- #1323 Add Retry as a SendRequestReason\n- #1324[BUG] Type 'ReactNativePlugin' is not assignable to type 'ITelemetryPlugin'\n  - Refactored the Plugin to extend BaseTelemetryPlugin (part of the #1076 work)\n- #1321 [BUG] @microsoft/applicationinsights-web fails to initialize with latest version\n- #1319 fix incorrect references to configuration parameter names\n- #1316 Update dependency version of DynamicProto\n  - Move all private properties and methods into constructor closure\n  - #1316 Update dependency version of DynamicProto\n\n### Updated React plugin to v3.0.2\n\n- Update Core dependency to ^2.5.7 Core changes\n- #1335 Add Performance / Testing support\n  - Added IPerfManager and IPerfEvent interfaces to allow performance review / monitoring of the internal operations \n  - [Performance Manager Documentation](./docs/PerformanceMonitoring.md)\n\n### Updated React Native plugin to v2.2.6\n\n- Update Core dependency to ^2.5.7 Core changes\n- #1335 Add Performance / Testing support\n  - Added IPerfManager and IPerfEvent interfaces to allow performance review / monitoring of the internal operations \n  - [Performance Manager Documentation](./docs/PerformanceMonitoring.md)\n- #1324 [BUG] Type 'ReactNativePlugin' is not assignable to type 'ITelemetryPlugin'\n  - Refactored the Plugin to extend BaseTelemetryPlugin (part of the #1076 work)\n- #1076 Refactor code to provide better tree shaking and minification of generated code\n  - Move all private properties and methods into constructor closure\n  - #1316 Update dependency version of DynamicProto\n\n## 2.5.6 (Jul 6th, 2020)\n\n[2.5.6 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/40)\n\n### New (Beta) extension applicationinsights-debugplugin-js\n\n- Created the initial extension to help developers understand, track, visualize and fix issues with events\n- This extension injects a UI onto your page details for the component is available at https://github.com/microsoft/ApplicationInsights-JS/tree/master/extensions/applicationinsights-debugplugin-js\n- This is a beta release so the UI, config etc are not yet complete, feedback for features, suggestions or changes are welcome -- please create an Issue\n- The detailed view is still under construction and contains known bugs, these will be address in the next few months (releases) as we build out the module. We had not originally planed to have any detailed view as part of this initial beta release.\n\n### Changelog\n\n- #1311 Allow the generated modules to extend the namespace defined by \"name\" in rollup config -- rather than always replace.\n  - Changes the way the \"Microsoft.ApplicationInsights\" is defined for each module to all modules to be added to the same namespace\n- #1309 When using prototype js the SessionStorage become corrupted causing requests internal exceptions\n- #1303 Task 7027291: Investigate CDN Configuration to support custom domain (automate CDN deployment scripts)\n- #1299 Releasing core queue as soon as possible (fixes lost events from page load immediate unload with no additional events)\n- #1297 Created initial applicationinsights-debugplugin-js\n- #1289 [Documentation] doc: SPO set up instruction\n- #1286 [Documentation] Update JS SDK Snippet documentation with bug fixes (new v4 snippet)\n- #1283 [BUG] (Snippet v3) AppInsights stub methods captured incorrect method names in the closure\n- #1262 [BUG] Custom properties added with addTelemetryInitializer are ignored for exceptions\n- #1245 React Native - AI (Internal): 19 message: \"Could not add handler for beforeunload and pagehide\"\n  - Add isReactNative() function for detecting the runtime environment\n- #1095 Add an Error Boundary to the React plugin\n- #1089 Blocking certain URIs/Patterns from fetch tracking (patch included)\n  - Added new config 'correlationHeaderExcludePatterns' to allow disabling correlation headers using regular expressions\n\n### Updated React plugin to v3.0.1\n\n- #1311 Allow the generated modules to extend the namespace defined by \"name\" in rollup config -- rather than always replace.\n  - Changes the way the \"Microsoft.ApplicationInsights\" is defined for each module to all modules to be added to the same namespace\n\n### Update applicationinsights-rollup-es3 to v1.1.2\n\n- #1311 Allow the generated modules to extend the namespace defined by \"name\" in rollup config -- rather than always replace.\n\n## 2.5.5 (Jun 2nd, 2020)\n\n[2.5.5 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/39)\n\n### Updated React plugin to v3.0.0\n\n- Updated to TypeScript 3.x\n- Removed React plugin from main rush pipeline\n- #991 Don't work with React HOOKS\n  - #1120 Introducing React Hooks for AppInsights #1120\n\n### New Package applicationinsights-shims v1.0.0\n\n- Created to remove dependency on TSLib as v 1.13.0 has introduced build breaks\n  - provides internal implementation of __extends() and __assign() when no pre-existing version is present\n\n### Changelog\n\n- #1278 Add optional 'eventsSendRequest' notification to NotificationManager\n- #1269 TsLib v1.13.0 has breaking change (Remove dependency on TSLib)\n  - Added new package **'applicationinsights-shims@1.0.0'**\n- Removed React plugin from main rush pipeline\n- #991 Don't work with React HOOKS\n  - #1120 Introducing React Hooks for AppInsights #1120\n- #1274 Fix for withAITracking wrapping functional components.\n- Using crypto to generate GUIDs when available (Make GUID more random)\n- #1260 [BUG] Can't include Correlation Header on IE can fail\n- #1258 Update snippet to support reporting script load failures\n- #1251 [BUG] ajax.ts is using string trim() which is not supported on IE7/8\n- #1249 Identify whether the script is being consumed via the CDN or NPM package\n- Several minor documentation updates\n\n## 2.5.4 (Apr 7th, 2020)\n\n[2.5.4 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/37)\n\n### Changelog\n\n- #1242 Upgrading the tslib dependency to 1.11.1\n- #1233 [BUG] Duplicate React dependency\n- #1232 [BUG] window.appInsights.properties is marked private\n  - Fix issue by always exposing window.appInsights.context\n- #1240 [BUG] Telemetry correlation headers are not included for all fetch requests\n- #1229 [BUG] Unable to include telemetry correlation headers\n- #1227 SPFX - undefinedundefined is not defined\n- #1221 npm @microsoft/applicationinsights-web: license information missing in package.json\n- #1191 [BUG] ICustomProperties does not support setting values\n\n## 2.5.3 (Mar 25th, 2020)\n\n[2.5.3 Milestone](https://github.com/microsoft/ApplicationInsights-JS/milestone/38)\n\n### Changelog\n\n- #1224 [BUG] When running in IE7/8 the app insights doesn't initialize and gets stuck in a loop (long running script)\n\n## 2.5.2 (Mar 11th, 2020)\n\n### Changelog\n\n- #1217 [BUG] App Insights fails when the XHR object is not extensible (or frozen)\n- #1186 [BUG] App Insights initialization setting 'enableAjaxErrorStatusText is not working #1218\n\n## 2.5.1 (Mar 9th, 2020)\n\n### Changelog\n\n- #1210 [BUG] Typescript error when using @microsoft/applicationinsights-web 2.5.0 and \"noImplicitAny\"/\"strict\" option\n- #1207 [BUG] The latest version 2.4.4 cannot connect front-end with back-end on the Application Map on Application Insights\n\n## 2.5.0 (Mar 9th, 2020)\n\n### Changelog\n\n- #1204 When a fetch polyfill is installed there reporting endpoint is also causing events to be sent\n- #1202 ai_user and ai_session cookies not set #1203\n- #1201 add to auto track exceptions in react native plugin\n- #1199 Build is breaking when you do a \"rush update --full --purge --recheck\" due to tslib v1.11.0 update\n- #1194 XHR/Fetch enhancement - add additional telemetry from window.performance #1195\n- #1193 add sanitizer for operationName\n- #1189 Add the option to specify the refUri with stopTrackPage #1190\n- #1186 App Insights initialization setting 'enableAjaxErrorStatusText' is not working #1187\n\n#### XHR/Fetch enhancement\n\nAdds additional performance data derived from the window.performance.getEntries() for the fetch or XHR request.\n\nConfiguration options\n| Name | Default | Description |\n|------|---------|-------------|\n| enableAjaxPerfTracking | false | Default false. Flag to enable looking up and including additional browser window.performance timings in the reported ajax (XHR and fetch) reported metrics. \n| maxAjaxPerfLookupAttempts | 3 | Defaults to 3. The maximum number of times to look for the window.performance timings (if available), this is required as not all browsers populate the window.performance before reporting the end of the XHR request and for fetch requests this is added after its complete.\n| ajaxPerfLookupDelay | 25 | Defaults to 25ms. The amount of time to wait before re-attempting to find the windows.performance timings for an ajax request, time is in milliseconds and is passed directly to setTimeout().\n\n#### Auto track exception React Native Plugin\n\nThis has been enabled by default in the updated version.\nIt can be disabled by adding the ```disableExceptionCollection``` config value with a value of true.\n\n## 2.4.4 (Feb 5th, 2020)\n\n### Changelog\n\n- #1182 Fix error TS2430: Interface 'Window' incorrectly extends interface 'WindowEventHandlers'\n- #1185 Rollback namespace overwrite change\n\n## 2.4.3\n\n## Changelog\n\n- Syntax error tools/rollup-es3/src/es3/Es3Tokens.ts #1179\n\n## 2.4.2\n\n### ES3 Support\n\nAn additional conversion was required for ES3 support as TypeScript was adding a getter for embedding a constant enum into the Common class.\n\n### Changelog\n\n - #1177 Add additional checks and polyfil for TypeScript get translations for constants\n\n## v 2.4.1...2.4.0\n\n### ES3 Support\n\nWith this release the source files can be loaded in an ES3 environment (IE7/8) and send requests to the server. As part of this change you will now receive requests from users using an older browser, prior to this version users using an ES3 base browser will (most likely) have been getting a javascript error, which would have caused no data to be sent.\n\n### Enable support for reusing plugins in multiple instances of AppInsights #1132\n\nWe have added upport to enable reusing the same plugin in different instances of AppInsights, owned by the same application (but using different Instrumentation keys) is required so that they can reuse a single Plugin instance for all instances.\n\nThis changes introduces a new [`IProcessTelemetryContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IProcessTelemetryContext.html) interface that is passed to the processTelemetry() method so that the plugins can use the current request context for the event rather than the context during initialization.\n\nTo assist with creating plugins we have also introduced a base class that you can use for creating new plugins [BaseTelemetryPlugin](https://github.com/microsoft/ApplicationInsights-JS/blob/master/shared/AppInsightsCore/src/JavaScriptSDK/BaseTelemetryPlugin.ts), details are included on the [Readme](https://github.com/microsoft/ApplicationInsights-JS/blob/master/README.md)\n\n### Changelog\n\n- #1175 [BUG] Typescript build with 2.4.0 breaks #1173\n- #1174 Legacy Manage SameSite Cookie Settings #1126\n- #1172 Update SameSite logic to handle UserAgents that don't support the attribute\n- #1169 Fixup Rollup ES3 plugin package.json\n- #1167 Add better support for referencing global objects from a window and web workers\n- #1164 add null check for sessionManager\n- #1162 [BUG]AppInsights not working in IE7 #1142\n- #1161 include response error data\n- #1159 Export Common Telemetry classes in Snippet\n- #1157 fix: only change SameSite when secure\n- #1154 Queue events when track is called and not all extensions are initialized\n- #1153 Do not clean telemetryInitializers during initialization\n- #1150 Remove interface code from API reference and link\n- #1135 fix: dont block corr on empty location host\n- #1133 Enable support for reusing plugins in multiple instances of AppInsights #1132\n- #1129 fix: console logging not honoring setting\n- #1122 fix anchor link\n- #1116 Move tslib to sku dependencies\n- #1113 [Enhancement] AI is not catching all \"Unload\" dom events #1080\n\n## v 2.3.1\n### Changelog\n- #1102 Enable support for IE8\n- #1096 Add extra window nullchecks for non-browser environments\n- #1105 Fix issue where operation name is overwritten\n\n## v 2.3.0...2.2.4\n\n### Changelog\n- #1066 Adds Connection String support\n- #1061, #1065,#1067, #1088 misc bug fixes\n\n## v 2.2.4\n\n### Changelog\n- #1054 Fix issue with AppInsightsCore refactor\n\n## v 2.2.3\n### Changelog\n- #1051 Add to call track trace on user init sending browser info to the end point when loggingLevelTelemetry config is on\n- #1050 Address issue https://github.com/MicrosoftDocs/azure-docs/issues/39011\n- #1049 Fix issue with PageViewPerformance event being sent with undefined name property\n- #1041 Add tslint error screening\n- #1038 Re-organize repo folders\n- #1035 Update to use PerformanceNavigationInterface for supported browsers\n\n## v 2.2.2\n### Changelog\n- #1030 Fix issue with appId correlation being appended with an incorrect format\n\n## v 2.2.1\n### Changelog\n- #1015 Update to use beaconSender for page unload when browser supports Beacon API\n- #1028 Fix issue where window.location is not defined\n- #1021 Fix issue with not parsing correlationContext\n- #1020 Disable by default logging to console internal SDK errors. Enable by default logging as telemetry for internal SDK errors\n\n## v 2.2.0\n### Changelog\n- #946 **Feature**: Adds automatic incoming/outgoing header tracking. *Outgoing header tracking is experimental and may be miss some headers*\n- #973 **Feature**: Support propagation of W3C compatible distributed tracing headers\n- #983: Fix issue regarding incorrect referrer uri when using `enableAutoRouteTracking`\n- #984: Fix issue where adding custom properties/tags would not work in telemetry processors\n- #999: Fix IE issue when using `enableAutoRouteTracking`\n- #1000\n\n## v 2.1.1\nPatch release containing fixes to automatic Single Page Application route change tracking via `enableAutoRouteTracking`\n\n### Changelog\n#970 - Fixes #967 #969\n\n## v 2.1.0\n### Highlights\n\n#### Source Map Support\n> *You do not need to upgrade for drag and drop to work. It will work on all previous and future versions of the javascript (and Node.js) SDK\n\nhttps://i.imgur.com/Efue9nU.gif\nYou can now drag and drop your source maps onto your Exception Telemetry in the Azure Portal to unminify your callstack. Please open an issue or use the Feedback button in the Portal if a source map you've uploaded is not working as intended. This is a first iteration and in a future update, your source maps will be automatically unminified.\n\n#### SPA Route Change Tracking\nYou can set `enableAutoRouteTracking: true` to enable state based route tracking for your Single Page Application (React, Angular, Vue, etc). You do not need to install a separate plugin to use this configuration option.\n\nThis setting will cause a new Page View telemetry item to be sent each time your app's route changes (**including** Hash route changes).\n\n### Changelog\n- #920 Resolve jest testing issues when using React plugin\n- #928 Make analytics plugin have last priority\n- #936 Fallback to XHR Sender when beacon sender tries to send >64 KB\n- #947 Add SPA route change tracking\n- #948 Docs: Source map support\n- #952 Re-enable `samplingPercentage` functionality\n- #918, #919, #932 #933 #935 #939 #940 #951\n\n## v 2.0.1\n\n### trackException Change\nThis update has a couple of **non-breaking** API changes. Namely, `trackException` is now consistent with the Node.js SDK. The only change here is the named argument is renamed from **`error`** to **`exception`**. A shim is in place so **any existing usages of `trackException` will still work**, and the old field is marked as optional, so any type-checked files will still \"compile\". There are no breaking changes with this change, but you are encouraged to use `exception` as your named argument field as error will be deprecated in a future major version.\n\n#### Old\n```js\nappInsights.trackException({ error: new Error() });\n```\n#### New\n```js\nappInsights.trackException({ exception: new Error() });\n```\n\n### Correlation Header Domain Whitelisting #869\n\nSecond, the ability to only send correlation headers to specific, whitelisted domains is now available as a configuration option , `correlationHeaderDomains`. It accepts an `array` of domain `strings`. Wildcards (\"*\") are okay. By populating this array, all other domains which your application makes requests to will **not** have correlation headers included. This setting makes it easy to avoid OPTIONS requests to services outside of your control.\n\nYou can use the inclusion list and the exclusion list in conjunction with each other to add correlation headers to a particular domain, `example.com`, and at the same time exclude headers from a prefixed version of it, `no-headers.example.com`.\n\n###  Tag Override Change #903\n\nPerforming custom tag overrides is now more consistent with all of the other Application Insights SDKs, in that it is modified via a simple key-value dictionary. There are no breaking changes with this update, and if you are setting any tags via the old way, they will still work as they do now. You are encouraged to update them since the old way will be deprecated in a future major version release.\n\n#### Old\n```js\nvar telemetryInitializer = (item) => {\n  item.tags.push({ \"ai.cloud.role\": \"My Web App\" });\n};\nappInsights.addTelemetryInitializer(telemetryInitializer);\n```\n#### New\n```js\nvar telemetryInitializer = (item) => {\n  item.tags[\"ai.cloud.role\"] = \"My Web App\";\n};\nappInsights.addTelemetryInitializer(telemetryInitializer);\n```\n\n### Changelog\n#869 - config: add ability to whitelist specific domains for adding correlation headers\n#893 - docs: fix sample configuration settings\n#899 - common: replace Array.some with Array.forEach to simplify polyfill story, add tests\n#902 - snippet: add missing methods to lazy loaders\n#903 - tags can now be set with same API as other AI SDKs\n#904 - rename IExceptionTelemetry.error --> IExceptionTelemetry.exception\n#905 - react: fix plugin causing jest tests to fail\n#907 - docs: add mention of how to update current context's operation\n#908 - react: remove analytics package dependency\n#910 - docs: update context refresh information\n#913 - Remove code from adding libVer from extensions\n#918 - automatically add `ai.operation.name` tag, add `id` to pageview telemetry\n#919 - fix issue with `namePrefix` not affecting send buffers\n\n## v 2.0.0\n\n### Changelog\n- #878 Fix issue with missing pageviewperformance\n- #881 Change access level of some non-exposed methods\n- #883 Allow `id` to be set in `Exception` telemetry\n"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "SUPPORT.md",
    "content": "# Support\n\n## How to file issues and get help  \n\nThis project uses GitHub Issues to track bugs and feature requests. Please search the existing\nissues before filing new issues to avoid duplicates.  For new issues, file your bug or\nfeature request as a new Issue.\n\nFor help and questions about using this project, please create a Support request issue on\nhttps://github.com/microsoft/ApplicationInsights-JS/issues.\n\n## Microsoft Support Policy  \n\nSupport for this **PROJECT or PRODUCT** is limited to the resources listed above.\n"
  },
  {
    "path": "ThirdPartyNotices.txt",
    "content": "\nTHIRD-PARTY SOFTWARE NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThe Microsoft Application Insights SDK for JavaScript source code repository includes third party material from the projects listed below. The original copyright notice and the license under which Microsoft received such third party material are set forth below. Microsoft reserves all other rights not expressly granted, whether by implication, estoppel or otherwise.  \n\n\n1.\tjslitmus (https://github.com/broofa/jslitmus)\n2.\tSinon.JS (http://sinonjs.org)\n3.\tSelenium (http://www.seleniumhq.org/download)\n4.\tQUnit  (http://code.jquery.com/)\n\n\n%% jslitmus NOTICES, INFORMATION, AND LICENSE BEGIN HERE\n=========================================\ncopyright(C) Robert Kieffer, 2010\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n=========================================\nEND OF jslitmus NOTICES, INFORMATION, AND LICENSE\n\n%% Sinon.JS NOTICES, INFORMATION, AND LICENSE BEGIN HERE\n=========================================\n(The BSD License)\n\nCopyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimer in the documentation\n      and/or other materials provided with the distribution.\n    * Neither the name of Christian Johansen nor the names of his contributors\n      may be used to endorse or promote products derived from this software\n      without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n=========================================\nEND OF Sinon.JS NOTICES, INFORMATION, AND LICENSE\n\n%% Selenium NOTICES, INFORMATION, AND LICENSE BEGIN HERE\n=========================================\nCopyright 2011-2015 Software Freedom Conservancy\nCopyright 2004-2011 Selenium committers\n\nApache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n=========================================\nEND OF Selenium NOTICES, INFORMATION, AND LICENSE\n\n%% QUnit  NOTICES, INFORMATION, AND LICENSE BEGIN HERE\n=========================================\nCopyright jQuery Foundation and other contributors, https://jquery.org/\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/jquery/qunit\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nAll files located in the node_modules directory are externally maintained\nlibraries used by this software which have their own licenses; we\nrecommend you read them, as their terms may differ from the terms above.\n=========================================\nEND OF QUnit  NOTICES, INFORMATION, AND LICENSE\n\n\n"
  },
  {
    "path": "TreeShakingRecommendations.md",
    "content": "# Tree-Shaking Enhancements / Recommendations\n\nAs part of changes introduced in version 2.6.0 we are deprecating and removing the *internal* usages of the static helper classes `CoreUtils`, `EventHelper`, `Util`, `UrlHelper`, `DateTimeUtils` and `ConnectionStringParser` to provide better support for tree-shaking algorithms so that unused code can be safely dropped when using NPM packages.\n\nAs part of these changes we are now exporting the functions as top level root (direct) from the modules so that you can simply refactor your code to achieve better tree-shaking.\n\nTo further assist with some tree-shakers, we have also changed these from static classes to const objects that reference the new exported functions (*mostly*). Future changes are required to continue refactoring out further the references below that have no currently available replacement or are not listed.\n\n**Why?**\n\nSimplistically, any reference to any property or function that was defined in these static classes would require that ALL of the properties and functions must be included in the resulting code as this code becomes unshakable (using static analysis).\n\n> Note: While we have tagged the classes as deprecated, they will continue to be exported and we are not currently planning on removing them from the current packages that they are exported from.\n\n## Deprecated functions and replacements\n\n| Existing | Replacement |\n|----------|-------------|\n| **CoreUtils** | **@microsoft/applicationinsights-core-js** |\n| CoreUtils._canUseCookies | None - Do not use as this will cause all of CoreUtils reference to be included in your final code.<br> Refactor your cookie handling to use the `appInsights.getCookieMgr().setEnabled(true/false)` to set the value and `appInsights.getCookieMgr().isEnabled()` to check the value. |\n| CoreUtils.isTypeof | isTypeof |\n| CoreUtils.isUndefined | isUndefined |\n| CoreUtils.isNullOrUndefined | isNullOrUndefined |\n| CoreUtils.hasOwnProperty | hasOwnProperty |\n| CoreUtils.isFunction | isFunction |\n| CoreUtils.isObject | isObject |\n| CoreUtils.isDate | isDate |\n| CoreUtils.isArray | isArray |\n| CoreUtils.isError | isError |\n| CoreUtils.isString | isString |\n| CoreUtils.isNumber | isNumber |\n| CoreUtils.isBoolean | isBoolean |\n| CoreUtils.toISOString | toISOString or getISOString |\n| CoreUtils.arrForEach | arrForEach |\n| CoreUtils.arrIndexOf | arrIndexOf |\n| CoreUtils.arrMap | arrMap |\n| CoreUtils.arrReduce | arrReduce |\n| CoreUtils.strTrim | strTrim |\n| CoreUtils.objCreate | objCreateFn |\n| CoreUtils.objKeys | objKeys |\n| CoreUtils.objDefineAccessors | objDefineAccessors |\n| CoreUtils.addEventHandler | addEventHandler |\n| CoreUtils.dateNow | dateNow |\n| CoreUtils.isIE | isIE |\n| CoreUtils.disableCookies | disableCookies<br>Referencing either will cause CoreUtils to be referenced for backward compatibility.<br> Refactor your cookie handling to use the `appInsights.getCookieMgr().setEnabled(false)` |\n| CoreUtils.newGuid | newGuid |\n| CoreUtils.perfNow | perfNow |\n| CoreUtils.newId | newId |\n| CoreUtils.randomValue | randomValue |\n| CoreUtils.random32 | random32 |\n| CoreUtils.mwcRandomSeed | mwcRandomSeed |\n| CoreUtils.mwcRandom32 | mwcRandom32 |\n| CoreUtils.generateW3CId | generateW3CId |\n| **EventHelper** | **@microsoft/applicationinsights-core-js** |\n| EventHelper.Attach | attachEvent |\n| EventHelper.AttachEvent | attachEvent |\n| EventHelper.Detach | detachEvent |\n| EventHelper.DetachEvent |  detachEvent |\n| **Util** | **@microsoft/applicationinsights-common-js** |\n| Util.NotSpecified | strNotSpecified |\n| Util.createDomEvent | createDomEvent |\n| Util.disableStorage | utlDisableStorage |\n| Util.isInternalApplicationInsightsEndpoint | isInternalApplicationInsightsEndpoint |\n| Util.canUseLocalStorage | utlCanUseLocalStorage |\n| Util.getStorage | utlGetLocalStorage |\n| Util.setStorage | utlSetLocalStorage |\n| Util.removeStorage | utlRemoveStorage |\n| Util.canUseSessionStorage | utlCanUseSessionStorage |\n| Util.getSessionStorageKeys | utlGetSessionStorageKeys |\n| Util.getSessionStorage | utlGetSessionStorage |\n| Util.setSessionStorage | utlSetSessionStorage |\n| Util.removeSessionStorage | utlRemoveSessionStorage |\n| Util.disableCookies | disableCookies<br>Referencing either will cause CoreUtils to be referenced for backward compatibility.<br> Refactor your cookie handling to use the `appInsights.getCookieMgr().setEnabled(false)` |\n| Util.canUseCookies | canUseCookies<br>Referencing either will cause CoreUtils to be referenced for backward compatibility.<br>Refactor your cookie handling to use the `appInsights.getCookieMgr().isEnabled()` |\n| Util.disallowsSameSiteNone | uaDisallowsSameSiteNone |\n| Util.setCookie | coreSetCookie<br>Referencing will cause CoreUtils to be referenced for backward compatibility.<br>Refactor your cookie handling to use the `appInsights.getCookieMgr().set(name: string, value: string)` |\n| Util.stringToBoolOrDefault | stringToBoolOrDefault |\n| Util.getCookie | coreGetCookie<br>Referencing will cause CoreUtils to be referenced for backward compatibility.<br>Refactor your cookie handling to use the `appInsights.getCookieMgr().get(name: string)` |\n| Util.deleteCookie | coreDeleteCookie<br>Referencing will cause CoreUtils to be referenced for backward compatibility.<br>Refactor your cookie handling to use the `appInsights.getCookieMgr().del(name: string, path?: string)` |\n| Util.trim | strTrim |\n| Util.newId | newId |\n| Util.random32 | ---<br>No replacement, refactor your code to use the core random32(true) |\n| Util.generateW3CId | generateW3CId |\n| Util.isArray | isArray |\n| Util.isError | isError |\n| Util.isDate | isDate |\n| Util.toISOStringForIE8 | toISOString |\n| Util.getIEVersion | getIEVersion |\n| Util.msToTimeSpan | msToTimeSpan |\n| Util.isCrossOriginError | isCrossOriginError |\n| Util.dump | dumpObj |\n| Util.getExceptionName | getExceptionName |\n| Util.addEventHandler | attachEvent |\n| Util.IsBeaconApiSupported | isBeaconApiSupported |\n| Util.getExtension | getExtensionByName\n| **UrlHelper** | **@microsoft/applicationinsights-common-js** |\n| UrlHelper.parseUrl | urlParseUrl |\n| UrlHelper.getAbsoluteUrl | urlGetAbsoluteUrl |\n| UrlHelper.getPathName | urlGetPathName |\n| UrlHelper.getCompeteUrl | urlGetCompleteUrl |\n| UrlHelper.parseHost | urlParseHost |\n| UrlHelper.parseFullHost | urlParseFullHost\n| **DateTimeUtils** | **@microsoft/applicationinsights-common-js** |\n| DateTimeUtils.Now | dateTimeUtilsNow |\n| DateTimeUtils.GetDuration | dateTimeUtilsDuration |\n| **ConnectionStringParser** | **@microsoft/applicationinsights-common-js** |\n| ConnectionStringParser.parse | parseConnectionString |\n"
  },
  {
    "path": "channels/1ds-post-js/.gitignore",
    "content": "/node_modules\n*.user\n/bundle\n/.vs\n/docs\n/dist-es5\n/dist\ntest/debug.log\n"
  },
  {
    "path": "channels/1ds-post-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es5/**\n!dist/**\n!bundle/**\n!types/**\n"
  },
  {
    "path": "channels/1ds-post-js/CODE_OF_CONDUCT.md",
    "content": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n\nResources:\n\n- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)\n- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\n- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns\n"
  },
  {
    "path": "channels/1ds-post-js/CONTRIBUTING.md",
    "content": "# Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "channels/1ds-post-js/LICENSE.TXT",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "channels/1ds-post-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "channels/1ds-post-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "channels/1ds-post-js/README.md",
    "content": "# Microsoft 1DS Web SDK Post Plugin\n\n## Description\n1DS Web SDK Post Channel main functionality is to send data to OneCollector using POST, currently supporting XMLHttpRequest, fetch API and XDomainRequest.\n\n## npm\n\nPackages available [here](https://www.npmjs.com/package/@microsoft/1ds-post-js).\n\n## Basic Usage\n\n### Setup\n\n```js\nimport { AppInsightsCore, IExtendedConfiguration } from '@microsoft/1ds-core-js';\nimport { PostChannel, IChannelConfiguration } from '@microsoft/1ds-post-js';\n```\n\n```js\nvar appInsightsCore: AppInsightsCore = new AppInsightsCore();\nvar postChannel: PostChannel = new PostChannel();\nvar coreConfig: IExtendedConfiguration = {\n      instrumentationKey: \"YOUR_TENANT_KEY\",\n      extensions: [\n        postChannel\n      ],\n      extensionConfig: {}\n};\nvar postChannelConfig: IChannelConfiguration = {\n    eventsLimitInMem: 5000\n};\ncoreConfig.extensionConfig[postChannel.identifier] = postChannelConfig;\n//Initialize SDK\nappInsightsCore.initialize(coreConfig, []);\n```\n\n## Configuration\n\n### [IChannelConfiguration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html)\n\n| Config | Description | Type\n|----------------|--------------|----\n| [eventsLimitInMem](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#eventsLimitInMem)     | The number of events that can be kept in memory before the SDK starts to drop events. By default, this is 10,000.|number\n| [immediateEventLimit](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#immediateEventLimit) | [Optional] Sets the maximum number of immediate latency events that will be cached in memory before the SDK starts to drop other immediate events only, does not drop normal and real time latency events as immediate events have their own internal queue. Under normal situations immediate events are scheduled to be sent in the next Javascript execution cycle, so the typically number of immediate events is small (~1), the only time more than one event may be present is when the channel is paused or immediate send is disabled (via manual transmit profile). By default max number of events is 500 and the default transmit time is 0ms. Added in v3.1.1 | number\n|  [autoFlushEventsLimit](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#autoFlushEventsLimit) | [Optional] If defined, once this number of events has been queued the system perform a flush() to send the queued events without waiting for the normal schedule timers. Default is undefined | number\n|  [httpXHROverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#httpXHROverride)      |The HTTP override that should be used to send requests, request properties and headers should be added to the request to maintain correct functionality with other plugins.|IXHROverride\n|  [overrideInstrumentationKey](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#overrideInstrumentationKey)     |Override for Instrumentation key.|string\n|  [overrideEndpointUrl](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#overrideEndpointUrl)     |Override for Endpoint where telemetry data is sent.|string\n|  [disableTelemetry](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#disableTelemetry)     |The master off switch.  Do not send any data if set to TRUE.|boolean\n|  [ignoreMc1Ms0CookieProcessing](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#ignoreMc1Ms0CookieProcessing)     |MC1 and MSFPC cookies will not be provided. Default is false.|boolean\n|  [payloadPreprocessor](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#payloadPreprocessor) |POST channel preprocessing function. Can be used to gzip the payload (and set appropriate HTTP headers) before transmission. |[Function](./src/DataModels.ts)\n|  [payloadListener](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#payloadListener) |POST channel function hook to listen to events being sent, called after the batched events have been committed to be sent. Also used by Remote DDV Channel to send requests. |[Function](./src/DataModels.ts)\n| [disableEventTimings](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#disableEventTimings) | [Optional] By default additional timing metrics details are added to each event after they are sent to allow you to review how long it took to create serialized request. As not all users require this level of detail and it's now possible to get the same metrics via the IPerfManager and IPerfEvent, so you can now disabled this previous level. Default value is false to retain the previous behavior, if you are not using these metrics and performance is a concern then it is recommended to set this value to true. | boolean\n| [valueSanitizer](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#valueSanitizer) | [Optional] The value sanitizer to use while constructing the envelope, if not provided the default sanitizeProperty() method is called to validate and convert the fields for serialization. The path / fields names are based on the format of the envelope (serialized object) as defined via the [Common Schema 4.0](https://aka.ms/CommonSchema) specification. | IValueSanitizer\n| [stringifyObjects](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#stringifyObjects) | [Optional] During serialization, when an object is identified should the object serialized by true => JSON.stringify(theObject); otherwise theObject.toString(). Defaults to false. | boolean\n| [enableCompoundKey](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#enableCompoundKey) | [Optional] Enables support for objects with compound keys which indirectly represent an object eg. event: { \"somedata.embeddedvalue\": 123 }  where the \"key\" of the object contains a \".\" as part of it's name.  Defaults to false. | boolean\n| [disableOptimizeObj](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#disableOptimizeObj) | [Optional] Switch to disable the v8 `optimizeObject()` calls used to provide better serialization performance. Defaults to false. | boolean\n| [transports](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#transports) | [Optional] Either an array or single value identifying the requested `TransportType` (const enum) type that should be used. This is used during initialization to identify the requested send transport, it will be ignored if a httpXHROverride is provided. | number or number[]\n| [useSendBeacon](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#useSendBeacon) | [Optional] A flag to enable or disable the usage of the sendBeacon() API if available by the runtime. If running on ReactNative this defaults to `false` for all other cases it defaults to `true`.\n| [disableFetchKeepAlive](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#disableFetchKeepAlive) | [Optional] A flag to disable the usage of the [fetch with keep-alive](https://javascript.info/fetch-api#keepalive) support.\n| [unloadTransports](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#unloadTransports) | [Optional] Either an array or single value identifying the requested TransportType type(s) that should be used during unload or events marked as sendBeacon. This is used during initialization to identify the requested send transport, it will be ignored if a httpXHROverride is provided and alwaysUseXhrOverride is true.\n| [avoidOptions](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#avoidOptions)<br/><sub><i>(Since 3.1.10+)</i></sub><br /><sub>Default: false (Since 3.2.0)<br />Previously true</sub> | [Optional] Avoid adding request headers to the outgoing request that would cause a pre-flight (OPTIONS) request to be sent for each request. | boolean\n| [xhrTimeout](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#xhrTimeout)<br/><sub><i>(Since 3.1.11+)</i></sub>  | [Optional] Specify a timeout (in ms) to apply to requests when sending requests using XHR or fetch() requests only, does not affect sendBeacon() or XDR (XDomainRequest) usage. Defaults to undefined and therefore the runtime defaults (normally zero for browser environments) | number\n| [disableXhrSync](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#disableXhrSync)<br/><sub><i>(Since 3.1.11+)</i></sub> | [Optional] When using [Xhr](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) for sending requests disable sending as synchronous during unload or synchronous flush. __You should enable this feature for IE (when there is no sendBeacon() or fetch (with keep-alive) support) and you have clients that end up blocking the UI during page unloading__. <span style=\"color:red\">This will cause ALL XHR requests to be sent asynchronously which during page unload may result in the lose of telemetry</span>. This does not affect any other request type (fetch(), sendBeacon() or XDR (XDomainRequest)) | boolean<br/>Default: undefined\n| [alwaysUseXhrOverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#alwaysUseXhrOverride)<br /><sub><i>(Since 3.1.11+)</i></sub> | [Optional] By default during unload (or when you specify to use sendBeacon() or sync fetch (with keep-alive) for an event) the SDK ignores any provided httpXhrOverride and attempts to use sendBeacon() or fetch(with keep-alive) when they are available. When this configuration option is true any provided httpXhrOverride will always be used, so any provided httpXhrOverride will also need to \"handle\" the synchronous unload scenario. | boolean<br /> Default: false\n| [maxEventRetryAttempts](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#maxEventRetryAttempts)<br /><sub><i>(Since 3.1.11+)</i></sub> | [Optional] Identifies the number of times any single event will be retried if it receives a failed (retirable) response, this  causes the event to be internally \"requeued\" and resent in the next batch. As each normal batched send request is retried at least once before starting to increase the internal backoff send interval, normally batched events will generally be attempted the next nearest even number of times. This means that the total number of actual send attempts will almost always be even (setting to 5 will cause 6 requests), unless using manual synchronous flushing (calling flush(false)) which is not subject to request level retry attempts. | number<br/>Default: 6\n| [maxUnloadEventRetryAttempts](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#maxUnloadEventRetryAttempts)<br /><sub><i>(Since 3.1.11+)</i></sub> | [Optional] Identifies the number of times any single event will be retried if it receives a failed (retriable) response as part of processing / flushing events once a page unload state has been detected, this causes the event to be internally \"requeued\" and resent in the next batch, which during page unload. Unlike the normal batching process, send requests are never retried, so the value listed here is always the maximum number of attempts for any single event.<br/>Notes: The SDK by default will use the sendBeacon() API if it exists which is treated as a fire and forget successful response, so for environments that support or supply this API the events won't be retried (because they will be deeded to be successfully sent). When an environment (IE) doesn't support sendBeacon(), this will cause multiple synchronous (by default) XMLHttpRequests to be sent, which will block the UI until a response is received. You can disable ALL synchronous XHR requests by setting the 'disableXhrSync' configuration setting and/or changing this value to 0 or 1. | number<br/>Default: 2\n| [addNoResponse](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#addNoResponse) <br /><sub><i>(Since 3.2.8+)</i></sub> | [Optional] flag to indicate whether the sendBeacon and fetch (with keep-alive flag) should add the \"NoResponseBody\" query string value to indicate that the server should return a 204 for successful requests. | boolean<br/>Default: true\n| [disableZip](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IChannelConfiguration.html#disableZip) <br /><sub><i>(Since 4.3.7+)</i></sub> | [Optional] flag to use CompressionStream API to compress the payload. Compression will only occur if the event is asynchronous. For events like unloads, compression will not be applied. * Note: if user set payloadPreprocessor, this zip compression will not be applied. | boolean<br/>Default: true\n\n### [IXHROverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IXHROverride.html)\n\n|  Config   | Description | Type\n|----------------|----------------------------------------|----|\n|  [sendPOST](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/interfaces/IXHROverride.html#sendPOST)     |This method sends data to the specified URI using a POST request. If sync is true then the request is sent synchronously. The <i>oncomplete</i> function should always be called after the request is completed (either successfully or timed out or failed due to errors).|function\n\n### Payload Preprocessors\n\n```ts\ninterface IPayloadData {\n    urlString: string;\n    data: Uint8Array | string;\n    headers?: { [name: string]: string };\n    timeout?: number;            // Optional value supplied by the xhrTimeout configuration option\n    disableXhrSync?: boolean;    // Optional value supplied by the disableXhrSync configuration option\n}\n\ntype PayloadPreprocessorFunction = (payload: IPayloadData, callback: (modifiedBuffer: IPayloadData) => void) => void;\n```\n\nTo perform some preprocessing operation on your payload before it is sent over the wire, you can supply the POST channel config with a `payloadPreprocessor` function. A typical usage of it would be to gzip your payloads.\n\n```ts\nconst zlib = require('zlib');\nconst gzipFn: PayloadPreprocessorFunction = (payload: IPayloadData, cb) => {\n  zlib.gzip(payload.data, (err, dataToSend) => {\n    if (err) return cb(payload); // send original payload on error\n    const payloadToSend = {\n      ...payload,\n      headers: { ...payload.headers, 'Content-Encoding': 'gzip' };\n      data: dataToSend,\n    };\n    cb(payloadToSend);\n  });\n}\n```\n\n### XHR Override\n\n```ts\n/**\n * SendPOSTFunction type defines how an HTTP POST request is sent to an ingestion server\n * @param payload - The payload object that should be sent, contains the url, bytes/string and headers for the request\n * @param oncomplete - The function to call once the request has completed whether a success, failure or timeout\n * @param sync - A boolean flag indicating whether the request should be sent as a synchronous request.\n */\nexport type SendPOSTFunction = (payload: IPayloadData, oncomplete: (status: number, headers: { [headerName: string]: string; }, response?: string) => void, sync?: boolean) => void;\n\n/**\n * The IXHROverride interface overrides the way HTTP requests are sent.\n */\nexport interface IXHROverride {\n    /**\n     * This method sends data to the specified URI using a POST request. If sync is true,\n     * then the request is sent synchronously. The <i>oncomplete</i> function should always be called after the request is\n     * completed (either successfully or timed out or failed due to errors).\n     */\n    sendPOST: SendPOSTFunction;\n}\n```\n\n#### Example using node.js Https module\n\n```ts\nconst oneDs = require('@microsoft/1ds-analytics-js');\nconst https = require('https');\n\n// XHR override using node.js https module\nvar customHttpXHROverride= {\n  sendPOST: (payload: IPayloadData, oncomplete) => {\n    var options = {\n      method: 'POST',\n      headers: {\n        ...payload.headers,\n        \"Content-Type\": \"application/json\",\n        \"Content-Length\": Buffer.byteLength(payload.data)\n      }\n    };\n    const req = https.request(payload.urlString, options, res => {\n      res.on('data', function (responseData) {\n        oncomplete(res.statusCode, res.headers, responseData.toString());\n      });\n    });\n    req.write(payload.data);\n    req.end();\n  }\n};\n\nvar postChannelConfig: IChannelConfiguration = {\n    httpXHROverride: customHttpXHROverride\n};\n\n```\n\n#### Example always using fetch API\n\nThis example is using the [fetch() API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch) for all requests, include synchronous requests and assumes that the browser environment supports the (currently) experimental keepalive option (for chromium).\n\n```ts\nfunction fetchHttpXHROverride(payload: IPayloadData, onComplete: OnCompleteCallback, sync?: boolean) {\n  let ignoreResponse = false;\n  let responseHandled = false;\n  let requestInit: RequestInit = {\n    body: payload.data,\n    method: Method,\n    headers: payload.headers,\n    [DisabledPropertyName]: true,\n    credentials: \"include\"\n  };\n\n  if (sync) {\n    // You should validate whether the runtime environment supports this flag and if not you should use either sendBeacon or a synchronous XHR request\n    requestInit.keepalive = true;\n    if (sync) {\n      // As a sync request (during unload), it is unlikely that we will get a chance to process the response so\n      // just like beacon send assume that the events have been accepted and processed\n      ignoreResponse = true;\n    }\n  }\n\n  fetch(payload.urlString, requestInit).then((response) => {\n    let headerMap = {};\n    let responseText = \"\";\n    if (response.headers) {\n      response.headers.forEach((value: string, name: string) => {\n        headerMap[name] = value;\n      });\n    }\n \n    if (response.body) {\n      response.text().then(function(text) {\n        responseText = text;\n      });\n    }\n\n    if (!responseHandled) {\n      responseHandled = true;\n      onComplete(response.status, headerMap, responseText);\n    }\n  }).catch((error) => {\n    // In case there is an error in the request. Set the status to 0\n    // so that the events can be retried later.\n    if (!responseHandled) {\n      responseHandled = true;\n      onComplete(0, {});\n    }\n  });\n\n  // If we are treating this as a synchronous (keepAlive) we need to assume success during unload processing\n  if (ignoreResponse && !responseHandled) {\n    responseHandled = true;\n    onComplete(200, {});\n  }\n\n  // Simulate timeout if a timeout was supplied\n  if (!responseHandled && payload.timeout > 0) {\n    setTimeout(() => {\n      if (!responseHandled) {\n        // Assume a 500 response (which will cause a retry)\n        responseHandled = true;\n        onComplete(500, {});\n      }\n    }, payload.timeout);                    \n  }\n}\n\nlet postChannelConfig: IChannelConfiguration = {\n  httpXHROverride: fetchHttpXHROverride,\n\n  // Enable this flag to cause the SDK to ALWAYS call your override otherwise during page unload the SDK will using it's internal\n  // sendPost implementation using sendBeacon() or fetch (with keepalive support) whichever is the first supported\n  //alwaysUseXhrOverride: true,\n\n  // If you want to specify a timeout this value is passed on the payload object as `payload.timeout`\n  //xhrTimeout: 20000,\n};\n\n```\n\n## IValueSanitizer Paths / Fields which are excluded\n\nTo ensure that the service can continue to accept events that are sent from the SDK, some paths and fields are explicitly blocked and are never processed\nvia any configured valueSanitizer. These fields are blocked at the serialization level and cannot be overridden.\n\nThe path / fields names are based on the format of the envelope (serialized object) as defined via the [Common Schema 4.0](https://aka.ms/CommonSchema) specification, so the path / field names used for the IValueSanitizer are based on how the data is serialized to the service (CS 4.0 location) and not specifically the location\non the event object you pass into the track methods (unless they are the same).\n\nThe currently configured set of fields include\n\n### Excluded Part A fields\n\n- All direct top-level fields of the envelope, this includes \"ver\"; \"name\"; \"time\" and \"iKey\". see [Common Schema 4.0 - Part A](https://aka.ms/CommonSchema/PartA) for all defined fields. Note: This exclusion does does not match sub-keys (objects) like \"ext\", \"data\" and \"properties\".\n- All fields of the web extension, this includes all fields and sub keys of \"ext.web\" (example fields include \"ext.web.browser\"; \"ext.web.domain\"; \"ext.web.consentDetails\"). see [Common Schema 4.0 - Part A Extension - web](https://aka.ms/CommonSchema/PartA/Web) for the complete set of defined fields.\n- All fields and paths of the metadata extension, this includes all fields and sub keys of \"ext.metadata\". see [Common Schema 4.0 - Part A Extension - metadata](https://aka.ms/CommonSchema/PartA/MetaData) for the complete set of defined fields.\n\n## Synchronous Events\n\nBy default events are batched and sent asynchronously, there are times when you want to send events immediately during the same JavaScript execution cycle.\n\nTo support this you can set the ```sync``` property on an event to tell the PostChannel to skip the normal event batching and send this event now within it's own outbound connection. Because each ```sync``` event will cause a new request / connection (per event) you should use this approach SPARINGLY to avoid creating an excessive number of requests from the users browser which may have a negative impact on their experience.\n\nNote: If the initial synchronous request fails (not the normal case) any sync event will be queued for resending as an asynchronous batch (unless an \"unload\" event has been detected).\n\n### Supported Sync values\n\nSupported event ```sync``` values to cause an event to be sent immediately during the same JavaScript execution cycle.\n\nIn the case of the sendBeacon() and fetch() [with keepalive] (SyncFetch) both of these API's have a maximum payload size defined as 64Kb, as such if the size of the serialized (JSON) events are larger than this the events will be dropped as there is no safe way to send the event. \n\n| Name     | Value | Description\n|----------|-------|-------------------\n| Batched  | undefined,<br />false,<br />0 | This is the default situation and will cause the event to be Batched and sent asynchronously.\n| Synchronous | true,<br />1 | Attempt to send the request using the default synchronous method.<br />This will use the first available transport option:<br/>- httpXHROverride;<br/>-XMLHttpRequest (with sync flag);<br/>-fetch() [with keepalive] (Since v3.1.3);<br/>-sendBeacon()  (Since v3.1.3)\n| SendBeacon | 2 | (Since v3.1.3) Attempt to send the event synchronously with a preference for the sendBeacon() API.<br />This will use the first available transport option:<br/>-sendBeacon();<br/>-fetch() [with keepalive];<br/>-XMLHttpRequest (with sync flag);<br/>-httpXHROverride\n| SyncFetch | 3 | (Since v3.1.3) Attempt to send the event synchronously with a preference for the fetch() API with the keepalive flag, the SDK checks to ensure that the fetch() implementation supports the 'keepalive' flag and if not it will skip this transport option.<br />This will use the first available transport option:<br/>-fetch() [with keepalive];<br/>-sendBeacon();<br/>-XMLHttpRequest (with sync flag);<br/>-httpXHROverride\n\nThe named values are available in TypeScript via the ```EventSendType``` const enum class since v3.1.3.\n\n> Note: The SDK explicitly checks for ```keepalive``` support for fetch() via the ```Request``` class, so if not available this transport will not be used. [Browsers natively supporting fetch() keepalive](https://caniuse.com/?search=keepalive), as such any polyfill would also need to support this flag for it to be used.\n\n___Special sendBeacon() Note___\n\nAs the sendBeacon() API does not provide any response handling, any events sent via this method are considered to have been successfully sent, even if the browser fails to send the requests. The only exception is that if the browser returns false indicating that it can't accept the sendBeacon() request, in this case the SDK will send a dropped event notification.\n\n### When to use 'sync' events\n\nEvents that cause a page navigation can cause a race condition that could result in either event loss or duplication. This happens when any previously batched events have been sent (the request is in-flight) and the browser subsequently cancels the request before a response is processed AND it also triggers the JavaScript \"cancel\" or \"abort\" event, normally only during the unload process.\n\nThe SDK listens to all supported \"unload\" events (```unload```, ```beforeunload``` and ```pagehide```) and when any one of these are detected it will immediately send all (unsent) batched events via the \"SendBeacon\" (and fallback) methods above. This successfully mitigates the event loss case above, but it can compound the event duplication case for some scenarios as the SDK works to ensure that all events are sent and acknowledged.\n\nThis situation has become more prevalent with the enforcement by modern browsers to disallow, cancel or abort the usage of synchronous Xhr requests during page \"unload\" event.\n\nThere are effectively 2 scenarios where you should consider adding the `sync` property to an event (using the asynchronous SendBeacon and SyncFetch values) to remove the possibility of event duplication (the WebAnalytics extension already handles these cases).\n\n1) You want to send your own event during the page \"unload\" events and you have hooked the \"unload\" events yourself (before) initializing the SDK.\n\n- When you listen to the events \"before\" the SDK initializes, there is a small window of time where any \"batched\" event may get sent (and therefore become in-flight) before the SDK receives and processes the \"unload\" events, thus the potential race condition.\n- If you attach to the \"unload\" events \"after\" the SDK is initialized, it will now (since v3.1.3) automatically convert all received event(s) into \"sync\" (SendBeacon) events to ensure delivery.\n\n2) You want to send you own telemetry event(s) based on some user action after which a page-navigation immediately occurs, either via an anchor &lt;a /&gt; containing a href and letting the event bubble or by directly causing a navigation via a form Post or location change.\n\n- This is because because the href / post / location change will eventually cause an \"unload\" event to occur and therefore (potentially) any outbound (in-flight) requests may get canceled and cause event to be duplicated.\n- While this situation can occur with any other batched events, it is more likely to occur when events are created during these know situations that are known to directly trigger the \"unload\" cycle.\n\n## API documentation\n\n[Typedoc generated API reference](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-post-js/index.html)\n\n## Learn More\n\nYou can learn more in [1DS First party getting started](https://aka.ms/1dsjs).\n\n## Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at [https://go.microsoft.com/fwlink/?LinkID=824704](https://go.microsoft.com/fwlink/?LinkID=824704). You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\nTo turn off sending telemetry to Microsoft, ensure that the POST channel is not configured in the extensions.  See below configuration for example:\n\n```js\nvar coreConfig: IExtendedConfiguration = {\n      instrumentationKey: \"YOUR_TENANT_KEY\",\n      extensions: [\n        postChannel  // << REMOVE THIS EXTENSION TO STOP SENDING TELEMETRY TO MICROSOFT\n      ],\n      extensionConfig: {}\n};\n```\n\n## Contributing\n\nRead our [contributing guide](./CONTRIBUTING.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Application Insights.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft�s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft�s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party�s policies.\n\n## License\n\n[MIT](./LICENSE.TXT)\n"
  },
  {
    "path": "channels/1ds-post-js/SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "channels/1ds-post-js/SUPPORT.md",
    "content": "# Support\n\n## How to file issues and get help  \n\nThis project uses GitHub Issues to track bugs and feature requests. Please search the existing\nissues before filing new issues to avoid duplicates.  For new issues, file your bug or\nfeature request as a new Issue.\n\nFor help and questions about using this project, please create a Support request issue on\nhttps://github.com/microsoft/ApplicationInsights-JS/issues.\n\n## Microsoft Support Policy  \n\nSupport for this **PROJECT or PRODUCT** is limited to the resources listed above.\n"
  },
  {
    "path": "channels/1ds-post-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n\n  /**\n   * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n   * standard settings to be shared across multiple projects.\n   *\n   * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n   * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n   * resolved using NodeJS require().\n   *\n   * SUPPORTED TOKENS: none\n   * DEFAULT VALUE: \"\"\n   */\n  // \"extends\": \"./shared/api-extractor-base.json\"\n  // \"extends\": \"my-package/include/api-extractor-base.json\"\n\n  /**\n   * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n   * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n   *\n   * The path is resolved relative to the folder of the config file that contains the setting.\n   *\n   * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n   * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n   * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n   * will be reported.\n   *\n   * SUPPORTED TOKENS: <lookup>\n   * DEFAULT VALUE: \"<lookup>\"\n   */\n  \"projectFolder\": \".\",\n\n  /**\n   * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n   * analyzes the symbols exported by this module.\n   *\n   * The file extension must be \".d.ts\" and not \".ts\".\n   *\n   * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n   * prepend a folder token such as \"<projectFolder>\".\n   *\n   * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n   */\n  \"mainEntryPointFilePath\": \"<projectFolder>/build/types/Index.d.ts\",\n\n  /**\n   * A list of NPM package names whose exports should be treated as part of this package.\n   *\n   * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n   * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n   * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n   * imports library2.  To avoid this, we can specify:\n   *\n   *   \"bundledPackages\": [ \"library2\" ],\n   *\n   * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n   * local files for library1.\n   */\n  \"bundledPackages\": [\n  ],\n\n  /**\n   * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n   */\n  \"compiler\": {\n    /**\n     * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n     */\n    // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n\n    /**\n     * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n     * The object must conform to the TypeScript tsconfig schema:\n     *\n     * http://json.schemastore.org/tsconfig\n     *\n     * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n     *\n     * DEFAULT VALUE: no overrideTsconfig section\n     */\n    // \"overrideTsconfig\": {\n    //   . . .\n    // }\n\n    /**\n     * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n     * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n     * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n     * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n     *\n     * DEFAULT VALUE: false\n     */\n    // \"skipLibCheck\": true,\n  },\n\n  /**\n   * Configures how the API report file (*.api.md) will be generated.\n   */\n  \"apiReport\": {\n    /**\n     * (REQUIRED) Whether to generate an API report.\n     */\n    \"enabled\": false,\n\n    /**\n     * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n     * a full file path.\n     *\n     * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n     *\n     * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n     */\n    \"reportFileName\": \"<unscopedPackageName>.api.md\",\n\n    /**\n     * Specifies the folder where the API report file is written.  The file name portion is determined by\n     * the \"reportFileName\" setting.\n     *\n     * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n     * e.g. for an API review.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/etc/\"\n     */\n    \"reportFolder\": \"<projectFolder>/build/dts/\",\n\n    /**\n     * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n     * the \"reportFileName\" setting.\n     *\n     * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n     * If they are different, a production build will fail.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/temp/\"\n     */\n    // \"reportTempFolder\": \"<projectFolder>/temp/\"\n  },\n\n  /**\n   * Configures how the doc model file (*.api.json) will be generated.\n   */\n  \"docModel\": {\n    /**\n     * (REQUIRED) Whether to generate a doc model file.\n     */\n    \"enabled\": true,\n\n    /**\n     * The output path for the doc model file.  The file extension should be \".api.json\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n     */\n    \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n  },\n\n  /**\n   * Configures how the .d.ts rollup file will be generated.\n   */\n  \"dtsRollup\": {\n    /**\n     * (REQUIRED) Whether to generate the .d.ts rollup file.\n     */\n    \"enabled\": true,\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n     * This file will include all declarations that are exported by the main entry point.\n     *\n     * If the path is an empty string, then this file will not be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n     */\n    \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n     * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"\"\n     */\n    // \"betaTrimmedFilePath\": \"<projectFolder>/dist/<unscopedPackageName>-beta.d.ts\",\n\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n     * This file will include only declarations that are marked as \"@public\".\n     *\n     * If the path is an empty string, then this file will not be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"\"\n     */\n    // \"publicTrimmedFilePath\": \"<projectFolder>/dist/<unscopedPackageName>-public.d.ts\",\n\n    /**\n     * When a declaration is trimmed, by default it will be replaced by a code comment such as\n     * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n     * declaration completely.\n     *\n     * DEFAULT VALUE: false\n     */\n    // \"omitTrimmingComments\": true\n  },\n\n  /**\n   * Configures how the tsdoc-metadata.json file will be generated.\n   */\n  \"tsdocMetadata\": {\n    /**\n     * Whether to generate the tsdoc-metadata.json file.\n     *\n     * DEFAULT VALUE: true\n     */\n    \"enabled\": false,\n\n    /**\n     * Specifies where the TSDoc metadata file should be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n     * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n     * falls back to \"tsdoc-metadata.json\" in the package folder.\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n  },\n\n  /**\n   * Configures how API Extractor reports error and warning messages produced during analysis.\n   *\n   * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n   */\n  \"messages\": {\n    /**\n     * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n     * the input .d.ts files.\n     *\n     * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n     *\n     * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n     */\n    \"compilerMessageReporting\": {\n      /**\n       * Configures the default routing for messages that don't match an explicit rule in this table.\n       */\n      \"default\": {\n        /**\n         * Specifies whether the message should be written to the the tool's output log.  Note that\n         * the \"addToApiReportFile\" property may supersede this option.\n         *\n         * Possible values: \"error\", \"warning\", \"none\"\n         *\n         * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n         * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n         * the \"--local\" option), the warning is displayed but the build will not fail.\n         *\n         * DEFAULT VALUE: \"warning\"\n         */\n        \"logLevel\": \"warning\",\n\n        /**\n         * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n         * then the message will be written inside that file; otherwise, the message is instead logged according to\n         * the \"logLevel\" option.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"addToApiReportFile\": false\n      },\n\n      // \"TS2551\": {\n      //   \"logLevel\": \"warning\",\n      //   \"addToApiReportFile\": true\n      // },\n      //\n      // . . .\n    },\n\n    /**\n     * Configures handling of messages reported by API Extractor during its analysis.\n     *\n     * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n     *\n     * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n     */\n    \"extractorMessageReporting\": {\n      \"default\": {\n        \"logLevel\": \"warning\",\n        // \"addToApiReportFile\": false\n      },\n\n      \"ae-missing-release-tag\": {\n        \"logLevel\": \"none\"\n      },\n      //\n      // . . .\n    },\n\n    /**\n     * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n     *\n     * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n     *\n     * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n     */\n    \"tsdocMessageReporting\": {\n      \"default\": {\n        \"logLevel\": \"warning\",\n        // \"addToApiReportFile\": false\n      }\n\n      // \"tsdoc-link-tag-unescaped-text\": {\n      //   \"logLevel\": \"warning\",\n      //   \"addToApiReportFile\": true\n      // },\n      //\n      // . . .\n    }\n  }\n\n}\n"
  },
  {
    "path": "channels/1ds-post-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/1ds-post-js\",\n    \"version\": \"4.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - 1ds-post-channel-js\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run dtsgen && npm run sri\",\n        \"build:esm\": \"grunt 1dsPostBuild\",\n        \"build:browser\": \"npx rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"ai-min\": \"grunt 1dsPost-min\",\n        \"ai-restore\": \"grunt 1dsPost-restore\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"1DS JS SDK Post Channel\\\" -oneDs\",\n        \"test\": \"grunt 1dsPostTest\",\n        \"mintest\": \"grunt adsPostMinTest\",\n        \"perftest\": \"\",\n        \"makePublicPackage\": \"node ../../tools/makePublic/makePublicPackage.js ./package.json && npm pack\",\n        \"publishPackage\": \"npm publish\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"sinon\": \"^7.3.1\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\",\n        \"pako\": \"^2.0.3\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/channels/1ds-post-js\"\n    },\n    \"main\": \"dist/es5/ms.post.js\",\n    \"module\": \"dist-es5/Index.js\",\n    \"types\": \"types/1ds-post-js.d.ts\",\n    \"keywords\": [\n        \"1DS\",\n        \"Js\",\n        \"SDK\"\n    ]\n}\n"
  },
  {
    "path": "channels/1ds-post-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst inputName = \"Index\";\nconst outputName = \"ms.post\";\nconst banner = [\n    \"/*!\",\n    ` * 1DS JS SDK POST plugin, ${version}`,\n    \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n    \" * (Microsoft Internal Only)\",\n    \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n    \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n    \"// Licensed under the ISC License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n    {\n        namespace: \"oneDS\", \n        version: version,\n        node: {\n            entryPoint: inputName,\n            outputName: outputName,\n        },\n        browser: {\n            entryPoint: inputName,\n            outputName: outputName\n        }\n    },\n    [ \"Index\" ],\n    true\n);\n"
  },
  {
    "path": "channels/1ds-post-js/src/BatchNotificationActions.ts",
    "content": "/**\n* BatchNotificationActions.ts\n* @author Nev Wylie (newylie)\n* @copyright Microsoft 2020\n*/\nimport { EventSendType } from \"@microsoft/applicationinsights-core-js\";\nimport { EventBatchNotificationReason } from \"./DataModels\";\nimport { EventBatch } from \"./EventBatch\";\n\nexport type BatchNotificationAction = (batches: EventBatch[], reason?: EventBatchNotificationReason, isSyncRequest?: boolean, sendType?: EventSendType) => void;\n\n// tslint:disable-next-line:interface-name\nexport interface BatchNotificationActions {\n    /**\n     * Attempts have been made to send the events but all failed.\n     * Requeue the events (if possible) for resending.\n     */\n    requeue?: BatchNotificationAction;\n\n    /**\n     * The batch is about to be sent\n     */\n    send?: BatchNotificationAction;\n\n    /**\n     * The batch has been sent acknowledged by the server\n     */\n    sent?: BatchNotificationAction;\n\n    /**\n     * The events of the batch have been dropped\n     */\n    drop?: BatchNotificationAction;\n\n    /**\n     * The events of the batch have been dropped after being sent but not acknowledged\n     */\n    rspFail?: BatchNotificationAction;\n\n    /**\n     * Default callback action to call when no specific action could be identified for the reason\n     */\n    oth?: BatchNotificationAction;\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/ClockSkewManager.ts",
    "content": "/**\n* ClockSkewManager.ts\n* @author Abhilash Panwar (abpanwar)\n* @copyright Microsoft 2018\n*/\n\n/**\n * Internal interface to manage clock skew correction.\n * @internal\n */\nexport interface IClockSkewManager {\n    /**\n     * Determine if the request can be sent.\n     * @returns True if requests can be sent, false otherwise.\n     */\n    allowRequestSending(): boolean;\n\n    /**\n     * Tells the ClockSkewManager that it should assume that the first request has now been sent,\n     * If this method had not yet been called AND the clock Skew had not been set this will set\n     * allowRequestSending to false until setClockSet() is called.\n     */\n    firstRequestSent(): void;\n\n    /**\n     * Determine if clock skew headers should be added to the request.\n     * @returns True if clock skew headers should be added, false otherwise.\n     */\n    shouldAddClockSkewHeaders(): boolean;\n\n    /**\n     * Gets the clock skew header value.\n     * @returns The clock skew header value.\n     */\n    getClockSkewHeaderValue(): string;\n\n    /**\n     * Sets the clock skew header value. Once clock skew is set this method\n     * is no-op.\n     * @param timeDeltaInMillis - Time delta to be saved as the clock skew header value.\n     */\n    setClockSkew(timeDeltaInMillis?: string): void;\n}\n\n/**\n * Factory function to create a ClockSkewManager instance.\n * @returns A new IClockSkewManager instance.\n * @internal\n */\nexport function createClockSkewManager(): IClockSkewManager {\n    let _allowRequestSending = true;\n    let _shouldAddClockSkewHeaders = true;\n    let _isFirstRequest = true;\n    let _clockSkewHeaderValue = \"use-collector-delta\";\n    let _clockSkewSet = false;\n\n    return {\n        /**\n         * Determine if requests can be sent.\n         * @returns True if requests can be sent, false otherwise.\n         */\n        allowRequestSending: (): boolean => {\n            return _allowRequestSending;\n        },\n\n        /**\n         * Tells the ClockSkewManager that it should assume that the first request has now been sent,\n         * If this method had not yet been called AND the clock Skew had not been set this will set\n         * allowRequestSending to false until setClockSet() is called.\n         */\n        firstRequestSent: () => {\n            if (_isFirstRequest) {\n                _isFirstRequest = false;\n                if (!_clockSkewSet) {\n                    // Block sending until we get the first clock Skew\n                    _allowRequestSending = false;\n                }\n            }\n        },\n\n        /**\n         * Determine if clock skew headers should be added to the request.\n         * @returns True if clock skew headers should be added, false otherwise.\n         */\n        shouldAddClockSkewHeaders: (): boolean => {\n            return _shouldAddClockSkewHeaders;\n        },\n\n        /**\n         * Gets the clock skew header value.\n         * @returns The clock skew header value.\n         */\n        getClockSkewHeaderValue: (): string => {\n            return _clockSkewHeaderValue;\n        },\n\n        /**\n         * Sets the clock skew header value. Once clock skew is set this method\n         * is no-op.\n         * @param timeDeltaInMillis - Time delta to be saved as the clock skew header value.\n         */\n        setClockSkew: (timeDeltaInMillis?: string) => {\n            if (!_clockSkewSet) {\n                if (timeDeltaInMillis) {\n                    _clockSkewHeaderValue = timeDeltaInMillis;\n                    _shouldAddClockSkewHeaders = true;\n                    _clockSkewSet = true;\n                } else {\n                    _shouldAddClockSkewHeaders = false;\n                }\n\n                // Unblock sending\n                _allowRequestSending = true;\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/DataModels.ts",
    "content": "/**\n* DataModels.ts\n* @author Abhilash Panwar (abpanwar) and Hector Hernandez (hectorh)\n* @copyright Microsoft 2018\n* File containing the interfaces for Post channel module.\n*/\nimport {\n    IDiagnosticLogger, IExtendedTelemetryItem, IPayloadData, IProcessTelemetryContext, ITelemetryPlugin, IUnloadHook, IValueSanitizer,\n    IXHROverride\n} from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Defines the function signature for the Payload Preprocessor.\n * @param payload - The Initial constructed payload that if not modified should be passed onto the callback function.\n * @param callback - The preprocessor MUST call the callback function to ensure that the events are sent to the server, failing to call WILL result in dropped events.\n * The modifiedBuffer argument can be either the original payload or may be modified by performing GZipping of the payload and adding the content header.\n * @param isSync - A boolean flag indicating whether this request was initiated as part of a sync response (unload / flush request), this is for informative only.\n * e.g the preprocessor may wish to not perform any GZip operations if the request was a sync request which is normally called as part of an unload request.\n */\nexport type PayloadPreprocessorFunction = (payload: IPayloadData, callback: (modifiedBuffer: IPayloadData) => void, isSync?: boolean) => void;\n\n/**\n * Defines the function signature of a payload listener, which is called after the payload has been sent to the server. The listener is passed\n * both the initial payload object and any altered (modified) payload from a preprocessor so it can determine what payload it may want to log or send.\n * Used by the Remove DDV extension to listen to server send events.\n * @param orgPayload - The initially constructed payload object\n * @param sendPayload - The alternative (possibly modified by a preprocessor) payload\n * @param isSync - A boolean flag indicating whether this request was initiated as part of a sync response (unload / flush request), this is for informative only.\n * @param isBeaconSend - A boolean flag indicating whether the payload was sent using the navigator.sendBeacon() API.\n */\nexport type PayloadListenerFunction = (orgPayload: IPayloadData, sendPayload?: IPayloadData, isSync?: boolean, isBeaconSend?: boolean) => void;\n\n/**\n * The IChannelConfiguration interface holds the configuration details passed to Post module.\n */\nexport interface IChannelConfiguration {\n    /**\n     * [Optional] The number of events that can be kept in memory before the SDK starts to drop events. By default, this is 10,000.\n     */\n    eventsLimitInMem?: number;\n\n    /**\n     * [Optional] Sets the maximum number of immediate latency events that will be cached in memory before the SDK starts to drop other\n     * immediate events only, does not drop normal and real time latency events as immediate events have their own internal queue. Under\n     * normal situations immediate events are scheduled to be sent in the next Javascript execution cycle, so the typically number of\n     * immediate events is small (~1), the only time more than one event may be present is when the channel is paused or immediate send\n     * is disabled (via manual transmit profile). By default max number of events is 500 and the default transmit time is 0ms.\n     */\n    immediateEventLimit?: number;\n\n    /**\n     * [Optional] If defined, when the number of queued events reaches or exceeded this limit this will cause the queue to be immediately\n     * flushed rather than waiting for the normal timers. Defaults to undefined.\n     */\n    autoFlushEventsLimit?: number;\n\n    /**\n     * [Optional] If defined allows you to disable the auto batch (iKey set of requests) flushing logic. This is in addition to the\n     * default transmission profile timers, autoFlushEventsLimit and eventsLimitInMem config values.\n     */\n    disableAutoBatchFlushLimit?: boolean;\n\n    /**\n     * [Optional] Sets the record and request size limit in bytes for serializer.\n     * Default for record size (sync) is 65000, record size (async) is 2000000.\n     * Default for request size (sync) is 65000, request size (async) is 3145728.\n     * @since 3.3.7\n     */\n    requestLimit?: IRequestSizeLimit;\n\n    /**\n     * [Optional] Sets the limit number of events per batch.\n     * Default is 500\n     * @since 3.3.7\n     */\n    maxEvtPerBatch?: number\n\n    /**\n     * [Optional] The HTTP override that should be used to send requests, as an IXHROverride object.\n     * By default during the unload of a page or if the event specifies that it wants to use sendBeacon() or sync fetch (with keep-alive),\n     * this override will NOT be called. You can now change this behavior by enabling the 'alwaysUseXhrOverride' configuration value.\n     * The payload data (first argument) now also includes any configured 'timeout' (defaults to undefined) and whether you should avoid\n     * creating any synchronous XHR requests 'disableXhrSync' (defaults to false/undefined)\n     */\n    httpXHROverride?: IXHROverride;\n\n    /**\n    * Override for Instrumentation key\n    */\n    overrideInstrumentationKey?: string;\n\n    /**\n    * Override for Endpoint where telemetry data is sent\n    */\n    overrideEndpointUrl?: string;\n\n    /**\n     * The master off switch.  Do not send any data if set to TRUE\n     */\n    disableTelemetry?: boolean;\n\n    /**\n     * MC1 and MS0 cookies will not be returned from Collector endpoint.\n     */\n    ignoreMc1Ms0CookieProcessing?: boolean;\n\n    /**\n    * Override for setTimeout\n    */\n    setTimeoutOverride?: typeof setTimeout;\n\n    /**\n    * Override for clearTimeout\n    */\n    clearTimeoutOverride?: typeof clearTimeout;\n\n    /**\n     * [Optional] POST channel preprocessing function. Can be used to gzip the payload before transmission and to set the appropriate\n     * Content-Encoding header. The preprocessor is explicitly not called during teardown when using the sendBeacon() API.\n     */\n    payloadPreprocessor?: PayloadPreprocessorFunction;\n\n    /**\n     * [Optional] POST channel listener function, used for enabling logging or reporting (RemoteDDVChannel) of the payload that is being sent.\n     */\n    payloadListener?: PayloadListenerFunction;\n\n    /**\n     * [Optional] By default additional timing metrics details are added to each event after they are sent to allow you to review how long it took\n     * to create serialized request. As not all implementations require this level of detail and it's now possible to get the same metrics via\n     * the IPerfManager and IPerfEvent we are enabling these details to be disabled. Default value is false to retain the previous behavior,\n     * if you are not using these metrics and performance is a concern then it is recommended to set this value to true.\n     */\n    disableEventTimings?: boolean;\n\n    /**\n     * [Optional] The value sanitizer to use while constructing the envelope.\n     */\n    valueSanitizer?: IValueSanitizer;\n\n    /**\n     * [Optional] During serialization, when an object is identified, should the object be serialized by JSON.stringify(theObject); (when true) otherwise by theObject.toString().\n     * Defaults to false\n     */\n    stringifyObjects?: boolean;\n\n    /**\n     * [Optional] Enables support for objects with compound keys which indirectly represent an object where the \"key\" of the object contains a \".\" as part of it's name.\n     * @example\n     * ```typescript\n     * event: { \"somedata.embeddedvalue\": 123 }\n     * ```\n     */\n    enableCompoundKey?: boolean;\n\n    /**\n     * [Optional] Switch to disable the v8 optimizeObject() calls used to provide better serialization performance. Defaults to false.\n     */\n    disableOptimizeObj?: boolean;\n\n    /**\n     * [Optional] By default a \"Cache-Control\" header will be added to the outbound payloads with the value \"no-cache, no-store\", this is to\n     * avoid instances where Chrome can \"Stall\" requests which use the same outbound URL.\n     */\n    // See Task #7178858 - Collector requires a change to support this\n    // disableCacheHeader?: boolean;\n\n    /**\n     * [Optional] Either an array or single value identifying the requested TransportType type that should be used.\n     * This is used during initialization to identify the requested send transport, it will be ignored if a httpXHROverride is provided.\n     */\n    transports?: number | number[];\n\n    /**\n     * [Optional] Either an array or single value identifying the requested TransportType type(s) that should be used during unload or events\n     * marked as sendBeacon. This is used during initialization to identify the requested send transport, it will be ignored if a httpXHROverride\n     * is provided and alwaysUseXhrOverride is true.\n     */\n    unloadTransports?: number | number[];\n\n    /**\n     * [Optional] A flag to enable or disable the usage of the sendBeacon() API (if available). If running on ReactNative this defaults\n     * to `false` for all other cases it defaults to `true`.\n     */\n    useSendBeacon?: boolean;\n\n    /**\n     * [Optional] A flag to disable the usage of the [fetch with keep-alive](https://javascript.info/fetch-api#keepalive) support.\n     */\n    disableFetchKeepAlive?: boolean;\n\n     /**\n     * [Optional] Avoid adding request headers to the outgoing request that would cause a pre-flight (OPTIONS) request to be sent for each request.\n     * This currently defaults to false. This is changed as the collector enables Access-Control-Max-Age to allow the browser to better cache any\n     * previous OPTIONS response. Hence, we moved some of the current dynamic values sent on the query string to a header.\n     */\n    avoidOptions?: boolean;\n\n    /**\n     * [Optional] Specify a timeout (in ms) to apply to requests when sending requests using XHR, XDR or fetch requests. Defaults to undefined\n     * and therefore the runtime defaults (normally zero for browser environments)\n     */\n    xhrTimeout?: number;\n\n    /**\n     * [Optional] When using Xhr for sending requests disable sending as synchronous during unload or synchronous flush.\n     * You should enable this feature for IE (when there is no sendBeacon() or fetch (with keep-alive)) and you have clients\n     * that end up blocking the UI during page unloading. This will cause ALL XHR requests to be sent asynchronously which\n     * during page unload may result in the lose of telemetry.\n     */\n    disableXhrSync?: boolean;\n\n    /**\n     * [Optional] By default during unload (or when you specify to use sendBeacon() or sync fetch (with keep-alive) for an event) the SDK\n     * ignores any provided httpXhrOverride and attempts to use sendBeacon() or fetch(with keep-alive) when they are available.\n     * When this configuration option is true any provided httpXhrOverride will always be used, so any provided httpXhrOverride will\n     * also need to \"handle\" the synchronous unload scenario.\n     */\n    alwaysUseXhrOverride?: boolean;\n\n    /**\n     * [Optional] Identifies the number of times any single event will be retried if it receives a failed (retirable) response, this\n     * causes the event to be internally \"requeued\" and resent in the next batch. As each normal batched send request is retried at\n     * least once before starting to increase the internal backoff send interval, normally batched events will generally be attempted\n     * the next nearest even number of times. This means that the total number of actual send attempts will almost always be even\n     * (setting to 5 will cause 6 requests), unless using manual synchronous flushing (calling flush(false)) which is not subject to\n     * request level retry attempts.\n     * Defaults to 6 times.\n     */\n    maxEventRetryAttempts?: number;\n\n    /**\n     * [Optional] Identifies the number of times any single event will be retried if it receives a failed (retriable) response as part\n     * of processing / flushing events once a page unload state has been detected, this causes the event to be internally \"requeued\"\n     * and resent in the next batch, which during page unload. Unlike the normal batching process, send requests are never retried,\n     * so the value listed here is always the maximum number of attempts for any single event.\n     * Defaults to 2 times.\n     * Notes:\n     * The SDK by default will use the sendBeacon() API if it exists which is treated as a fire and forget successful response, so for\n     * environments that support or supply this API the events won't be retried (because they will be deeded to be successfully sent).\n     * When an environment (IE) doesn't support sendBeacon(), this will cause multiple synchronous (by default) XMLHttpRequests to be sent,\n     * which will block the UI until a response is received. You can disable ALL synchronous XHR requests by setting the 'disableXhrSync'\n     * configuration setting and/or changing this value to 0 or 1.\n     */\n    maxUnloadEventRetryAttempts?: number;\n\n    /**\n     * [Optional] flag to indicate whether the sendBeacon and fetch (with keep-alive flag) should add the \"NoResponseBody\" query string\n     * value to indicate that the server should return a 204 for successful requests. Defaults to true\n     */\n    addNoResponse?: boolean;\n\n    /**\n     * :warning: DO NOT USE THIS FLAG UNLESS YOU KNOW THAT PII DATA WILL NEVER BE INCLUDED IN THE EVENT!\n     *\n     * [Optional] Flag to indicate whether the SDK should include the common schema metadata in the payload. Defaults to true.\n     * This flag is only applicable to the POST channel and will cause the SDK to exclude the common schema metadata from the payload,\n     * while this will reduce the size of the payload, also means that the data marked as PII will not be processed as PII by the backend\n     * and will not be included in the PII data purge process.\n     * @since 4.1.0\n     */\n    excludeCsMetaData?: boolean;\n\n    /**\n     * [Optional] Specify whether cross-site Access-Control fetch requests should include credentials such as cookies,\n     * authentication headers, or TLS client certificates.\n     *\n     * Possible values:\n     * - \"omit\": never send credentials in the request or include credentials in the response.\n     * - \"include\": always include credentials, even cross-origin.\n     * - \"same-origin\": only send and include credentials for same-origin requests.\n     *\n     * If not set, the default value will be \"include\".\n     *\n     * For more information, refer to:\n     * - [Fetch API - Using Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#including_credentials)\n     * @since 3.3.1\n     */\n    fetchCredentials?: RequestCredentials;\n}\n\n/**\n * An interface which extends the telemetry event to track send attempts.\n */\nexport interface IPostTransmissionTelemetryItem extends IExtendedTelemetryItem {\n    /**\n     * The number of times the telemtry item has been attempted to be sent.\n     */\n    sendAttempt?: number;\n}\n\n/**\n * Real Time profile (default profile). RealTime Latency events are sent every 1 sec and\n * Normal Latency events are sent every 2 sec.\n */\nexport const RT_PROFILE = \"REAL_TIME\";\n/**\n * Near Real Time profile. RealTime Latency events are sent every 3 sec and\n * Normal Latency events are sent every 6 sec.\n */\nexport const NRT_PROFILE = \"NEAR_REAL_TIME\";\n/**\n * Best Effort. RealTime Latency events are sent every 9 sec and\n * Normal Latency events are sent every 18 sec.\n */\nexport const BE_PROFILE = \"BEST_EFFORT\";\n\n/**\n * An interface representing Collector Web responses.\n */\nexport interface ICollectorResult {\n    /**\n    * Number of events accepted.\n    */\n    acc?: number;\n    /**\n   * Number of events rejected.\n   */\n    rej?: number;\n    /**\n     * Web Result.\n     */\n    webResult?: ICollectorWebResult;\n}\n\n/**\n * An interface representing Collector Web responses.\n */\nexport interface ICollectorWebResult {\n    /**\n     * MSFPC cookie.\n     */\n    msfpc?: string;\n    /**\n     * Authentication error.\n     */\n    authError?: string;\n    /**\n     * Auth Login URL.\n     */\n    authLoginUrl?: string;\n}\n\nexport interface IRequestSizeLimit {\n    /**\n     * Request size limit in bytes for serializer.\n     * The value should be two numbers array, with format [async request size limit, sync request size limit]\n     */\n    requestLimit?: number[];\n     /**\n     * Record size limit in bytes for serializer.\n     * The value should be two numbers array, with format [async record size limit, sync record size limit]\n     */\n    recordLimit?: number[];\n}\n\n/**\n * Post channel interface\n */\nexport interface IPostChannel extends ITelemetryPlugin {\n    /**\n     * Diagnostic logger\n     */\n    diagLog: (itemCtx?: IProcessTelemetryContext) => IDiagnosticLogger;\n\n    /**\n    * Override for setTimeout\n    */\n    _setTimeoutOverride?: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => any;\n\n    /**\n     * Backs off transmission. This exponentially increases all the timers.\n     */\n    _backOffTransmission(): void;\n\n    /**\n    * Clears back off for transmission.\n    */\n    _clearBackOff(): void;\n\n    /**\n    * Add handler to be executed with request response text.\n    */\n    addResponseHandler(responseHandler: (responseText: string) => void): IUnloadHook;\n}\n\n/**\n * This is an internal notification reason used by the HttpManager to report the reason for notification events\n * it contains general events as well as specific sections which encompass other enum values such as\n * SendRequestReason, EventsDiscardedReason and general HttpStatus values.\n */\nexport declare const enum EventBatchNotificationReason {\n    /**\n     * Unable to send the batch as the outbound connection channel is paused\n     */\n    Paused = 1,\n\n    /**\n     * The events failed to send or retry, so requeue them\n     */\n    RequeueEvents = 100,\n\n    /**\n     * The Batch was successfully sent and a response received, equivalent to the HttpStatusCode of 200\n     */\n    Complete = 200,\n\n    // Event Send Notifications (Mostly matched with SendRequestReason)\n    /**\n     * No specific reason was specified or normal event schedule / timer\n     */\n    SendingUndefined = 1000,\n\n    /**\n     * Events are being sent based on the normal event schedule / timer.\n     */\n    SendingNormalSchedule = 1001,\n    /**\n     * A manual flush request was received\n     */\n    // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n    SendingManualFlush = 1001,\n\n    /**\n     * Unload event is being processed\n     */\n    SendingUnload = 1002,\n    /**\n     * The event(s) being sent are sync events\n     */\n    SendingSyncEvent = 1003,\n    /**\n     * The Channel was resumed\n     */\n    SendingResumed = 1004,\n    /**\n     * The event(s) being sent as a retry\n     */\n    SendingRetry = 1005,\n    /**\n     * Maximum batch size would be exceeded\n     */\n    SendingMaxBatchSize = 1010,\n    /**\n     * The Maximum number of events have already been queued\n     */\n    SendingMaxQueuedEvents = 1020,\n\n    /**\n     * The final value for a Sending notification\n     */\n    SendingEventMax = 1999,\n\n    // Events Dropped - Failures\n    EventsDropped = 8000,               // EventsDiscardedReason.Unknown\n    NonRetryableStatus = 8001,          // EventsDiscardedReason.NonRetryableStatus\n    InvalidEvent = 8002,                // EventsDiscardedReason.InvalidEvent\n    SizeLimitExceeded = 8003,           // EventsDiscardedReason.SizeLimitExceeded\n    KillSwitch = 8004,                  // EventsDiscardedReason.KillSwitch,\n    QueueFull = 8005,                   // EventsDiscardedReason.QueueFull\n    BeaconSendFailure = 8006,           // EventsDiscardedReason.BeaconSendFailure\n    EventsDroppedMax = 8999,\n\n    /**\n     * Represents the range Http Status codes 000-999 as 9000-9999\n     */\n    ResponseFailure = 9000,\n\n    /**\n     * Represents the range Http Status codes 200-299\n     */\n    PartialSuccess = 9200,\n\n    /**\n     * Represents the range Http Status codes 300-399\n     */\n    ClientConfigFailure = 9300,\n\n    /**\n     * Represents the range Http Status codes 400-499\n     */\n    ClientFailure = 9400,\n\n    /**\n     * Represents the range Http Status codes 500-599\n     */\n    ServerFailure = 9500,\n\n    ResponseFailureMax = 9999\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/EventBatch.ts",
    "content": "/**\n* EventBatch.ts\n* @author Nev Wylie (newylie)\n* @copyright Microsoft 2020\n*/\nimport { isNullOrUndefined, isValueAssigned } from \"@microsoft/applicationinsights-core-js\";\nimport { IPostTransmissionTelemetryItem } from \"./DataModels\";\nimport { STR_EMPTY, STR_MSFPC } from \"./InternalConstants\";\n\nfunction _getEventMsfpc(theEvent: IPostTransmissionTelemetryItem): string {\n    let intWeb = ((theEvent.ext || {})[\"intweb\"]);\n    if (intWeb && isValueAssigned(intWeb[STR_MSFPC])) {\n        return intWeb[STR_MSFPC];\n    }\n\n    return null;\n}\n\nfunction _getMsfpc(theEvents: IPostTransmissionTelemetryItem[]): string {\n    let msfpc: string = null;\n    \n    for (let lp = 0; msfpc === null && lp < theEvents.length; lp++) {\n        msfpc = _getEventMsfpc(theEvents[lp]);\n    }\n\n    return msfpc;\n}\n\n/**\n* This class defines a \"batch\" events related to a specific iKey, it is used by the PostChannel and HttpManager\n* to collect and transfer ownership of events without duplicating them in-memory. This reduces the previous\n* array duplication and shared ownership issues that occurred due to race conditions caused by the async nature\n* of sending requests.\n*/\nexport class EventBatch {\n\n    /**\n     * Creates a new Event Batch object\n     * @param iKey - The iKey associated with this batch of events\n     */\n    public static create(iKey: string, theEvents?: IPostTransmissionTelemetryItem[]): EventBatch {\n        return new EventBatch(iKey, theEvents);\n    }\n\n    /**\n     * Returns the iKey associated with this batch of events\n     */\n    public iKey: () => string;\n\n    /**\n     * Returns the first msfpc value from the batch\n     */\n    public Msfpc:() => string;\n\n    /**\n     * Returns the number of events contained in the batch\n     */\n    public count: () => number;\n\n    public events: () => IPostTransmissionTelemetryItem[];\n\n    /**\n     * Add all of the events to the current batch, if the max number of events would be exceeded then no\n     * events are added.\n     * @param theEvents - The events that needs to be batched.\n     * @returns The number of events added.\n     */\n    public addEvent: (theEvents: IPostTransmissionTelemetryItem) => boolean;\n\n    /**\n     * Split this batch into 2 with any events > fromEvent returned in the new batch and all other\n     * events are kept in the current batch.\n     * @param fromEvent - The first event to remove from the current batch.\n     * @param numEvents - The number of events to be removed from the current batch and returned in the new one. Defaults to all trailing events\n     */\n    public split: (fromEvent: number, numEvents?: number) => EventBatch;\n\n    /**\n     * Private constructor so that caller is forced to use the static create method.\n     * @param iKey - The iKey to associate with the events (not validated)\n     * @param addEvents - The optional collection of events to assign to this batch - defaults to an empty array.\n     */\n    private constructor(iKey: string, addEvents?: IPostTransmissionTelemetryItem[]) {\n        let events: IPostTransmissionTelemetryItem[] = addEvents ? [].concat(addEvents) : [];\n        let _self = this;\n        let _msfpc = _getMsfpc(events);\n\n        _self.iKey = (): string => {\n            return iKey;\n        };\n\n        _self.Msfpc = (): string => {\n            // return the cached value unless it's undefined -- used to avoid cpu\n            return _msfpc || STR_EMPTY;\n        };\n\n        _self.count = (): number => {\n            return events.length;\n        };\n\n        _self.events = (): IPostTransmissionTelemetryItem[] => {\n            return events;\n        };\n\n        _self.addEvent = (theEvent: IPostTransmissionTelemetryItem): boolean => {\n            if (theEvent) {\n                events.push(theEvent);\n                if (!_msfpc) {\n                    // Not found so try and find one\n                    _msfpc = _getEventMsfpc(theEvent);\n                }\n\n                return true;\n            }\n\n            return false;\n        };\n\n        _self.split = (fromEvent: number, numEvents?: number) => {\n            // Create a new batch with the same iKey\n            let theEvents: IPostTransmissionTelemetryItem[];\n            if (fromEvent < events.length) {\n                let cnt = events.length - fromEvent;\n                if (!isNullOrUndefined(numEvents)) {\n                    cnt = numEvents < cnt ? numEvents : cnt;\n                }\n\n                theEvents = events.splice(fromEvent, cnt);\n\n                // reset the fetched msfpc value\n                _msfpc = _getMsfpc(events);\n            }\n\n            return new EventBatch(iKey, theEvents);\n        };\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/HttpManager.ts",
    "content": "/**\n* HttpManager.ts\n* @author Abhilash Panwar (abpanwar); Hector Hernandez (hectorh); Nev Wylie (newylie)\n* @copyright Microsoft 2018-2020\n*/\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    EventSendType, FullVersionString, IAppInsightsCore, ICookieMgr, IDiagnosticLogger, IExtendedConfiguration, IPayloadData, IPerfEvent,\n    ITelemetryItem, IUnloadHook, IXDomainRequest, IXHROverride, OnCompleteCallback, SendRequestReason, SenderPostManager, TransportType,\n    _IInternalXhrOverride, _ISendPostMgrConfig, _ISenderOnComplete, _eExtendedInternalMessageId, _eInternalMessageId, _getAllResponseHeaders,\n    _throwInternal, _warnToConsole, arrForEach, dateNow, doPerf, dumpObj, eLoggingSeverity, extend, getCommonSchemaMetaData, getNavigator,\n    getResponseText, getTime, hasOwnProperty, isBeaconsSupported, isFeatureEnabled, isFetchSupported, isNullOrUndefined, isReactNative,\n    isUndefined, isValueAssigned, objForEachKey, objKeys, onConfigChange, optimizeObject, prependTransports, strUndefined\n} from \"@microsoft/applicationinsights-core-js\";\nimport { arrAppend, getInst, isFunction } from \"@nevware21/ts-utils\";\nimport { BatchNotificationAction, BatchNotificationActions } from \"./BatchNotificationActions\";\nimport { IClockSkewManager, createClockSkewManager } from \"./ClockSkewManager\";\nimport {\n    EventBatchNotificationReason, IChannelConfiguration, ICollectorResult, IPostChannel, IPostTransmissionTelemetryItem,\n    PayloadListenerFunction, PayloadPreprocessorFunction\n} from \"./DataModels\";\nimport { EventBatch } from \"./EventBatch\";\nimport {\n    DEFAULT_CACHE_CONTROL, DEFAULT_CONTENT_TYPE, STR_API_KEY, STR_AUTH_XTOKEN, STR_CACHE_CONTROL, STR_CLIENT_ID, STR_CLIENT_VERSION,\n    STR_CONTENT_TYPE_HEADER, STR_DROPPED, STR_EMPTY, STR_KILL_DURATION_HEADER, STR_KILL_TOKENS_HEADER, STR_MSA_DEVICE_TICKET, STR_MSFPC,\n    STR_NO_RESPONSE_BODY, STR_OTHER, STR_REQUEUE, STR_RESPONSE_FAIL, STR_SENDING, STR_TIME_DELTA_HEADER, STR_TIME_DELTA_TO_APPLY,\n    STR_UPLOAD_TIME\n} from \"./InternalConstants\";\nimport { IKillSwitch, createKillSwitch } from \"./KillSwitch\";\nimport { retryPolicyGetMillisToBackoffForRetry, retryPolicyShouldRetryForStatus } from \"./RetryPolicy\";\nimport { ISerializedPayload, Serializer } from \"./Serializer\";\nimport { ITimeoutOverrideWrapper, createTimeoutWrapper } from \"./TimeoutOverrideWrapper\";\n\nconst strSendAttempt = \"sendAttempt\";\n\nconst _noResponseQs =  \"&\" + STR_NO_RESPONSE_BODY + \"=true\";\nconst UrlQueryString = \"?cors=true&\" + STR_CONTENT_TYPE_HEADER.toLowerCase() + \"=\" + DEFAULT_CONTENT_TYPE;\n\ninterface IRequestUrlDetails {\n    url: string,\n    hdrs: { [key: string]: string },\n    useHdrs: boolean\n}\n\n/**\n * Identifies the default notification reason to the action names\n */\nconst _eventActionMap: any = {\n    [EventBatchNotificationReason.Paused]: STR_REQUEUE,\n    [EventBatchNotificationReason.RequeueEvents]: STR_REQUEUE,\n    [EventBatchNotificationReason.Complete]: \"sent\",\n    [EventBatchNotificationReason.KillSwitch]: STR_DROPPED,\n    [EventBatchNotificationReason.SizeLimitExceeded]: STR_DROPPED,\n    [EventBatchNotificationReason.BeaconSendFailure]: STR_DROPPED\n};\n\nconst _collectorQsHeaders = { };\nconst _collectorHeaderToQs = { };\n\nfunction _addCollectorHeaderQsMapping(qsName: string, headerName: string, allowQs?: boolean) {\n    _collectorQsHeaders[qsName] = headerName;\n    if (allowQs !== false) {\n        _collectorHeaderToQs[headerName] = qsName;\n    }\n}\n\n_addCollectorHeaderQsMapping(STR_MSA_DEVICE_TICKET, STR_MSA_DEVICE_TICKET, false);\n_addCollectorHeaderQsMapping(STR_CLIENT_VERSION, STR_CLIENT_VERSION);\n_addCollectorHeaderQsMapping(STR_CLIENT_ID, \"Client-Id\");\n_addCollectorHeaderQsMapping(STR_API_KEY, STR_API_KEY);\n_addCollectorHeaderQsMapping(STR_TIME_DELTA_TO_APPLY, STR_TIME_DELTA_TO_APPLY);\n_addCollectorHeaderQsMapping(STR_UPLOAD_TIME, STR_UPLOAD_TIME);\n_addCollectorHeaderQsMapping(STR_AUTH_XTOKEN, STR_AUTH_XTOKEN);\n\ninterface IInternalPayloadData extends IPayloadData {\n    _thePayload: ISerializedPayload;\n    _sendReason: SendRequestReason;\n}\n\nfunction _hasHeader(headers: any, header: string) {\n    let hasHeader = false;\n    if (headers && header) {\n        const keys = objKeys(headers);\n        if (keys && keys.length > 0) {\n            const lowerHeader = header.toLowerCase();\n            for (let lp = 0; lp < keys.length; lp++) {\n                const value = keys[lp];\n                if (value && hasOwnProperty(header, value) &&\n                        value.toLowerCase() === lowerHeader) {\n                    hasHeader = true;\n                    break;\n                }\n            }\n        }\n    }\n\n    return hasHeader;\n}\n\nfunction _addRequestDetails(details: IRequestUrlDetails, name: string, value: string, useHeaders: boolean) {\n    if (name && value && value.length > 0) {\n        if (useHeaders && _collectorQsHeaders[name]) {\n            details.hdrs[_collectorQsHeaders[name]] = value;\n            details.useHdrs = true;\n        } else {\n            details.url += \"&\" + name + \"=\" + value;\n        }\n    }\n}\n\ninterface IQueryStringParams {\n    name: string,\n    value: string\n}\n\nfunction _addQueryStringParameter(qsParams: IQueryStringParams[], name: string, value: string) {\n    for (let i = 0; i < qsParams.length; i++) {\n        if (qsParams[i].name === name) {\n            qsParams[i].value = value;\n            return;\n        }\n    }\n    qsParams.push({ name: name, value: value });\n}\n\nfunction _removeQueryStringParameter(qsParams: IQueryStringParams[], name: string) {\n    for (let i = 0; i < qsParams.length; i++) {\n        if (qsParams[i].name === name) {\n            qsParams.splice(i, 1);\n            return;\n        }\n    }\n}\n\n\n/**\n * Class managing the sending of requests.\n */\nexport class HttpManager {\n\n    /**\n     * @constructor\n     * @param requestQueue   - The queue that contains the requests to be sent.\n     */\n    constructor(maxEventsPerBatch: number, maxConnections: number, maxRequestRetriesBeforeBackoff: number, actions: BatchNotificationActions) {\n        // ------------------------------------------------------------------------------------------------------------------------\n        // Only set \"Default\" values in the _initDefaults() method, unless value are not \"reset\" during unloading\n        // ------------------------------------------------------------------------------------------------------------------------\n        let _urlString: string;\n        let _killSwitch: IKillSwitch;\n        let _paused: boolean;\n        let _clockSkewManager: IClockSkewManager;\n        let _useBeacons = false;\n        let _outstandingRequests: number;           // Holds the number of outstanding async requests that have not returned a response yet\n        let _postManager: IPostChannel;\n        let _logger: IDiagnosticLogger;\n        let _sendInterfaces: { [key: number]: _IInternalXhrOverride };\n        let _core: IAppInsightsCore;\n        let _customHttpInterface: boolean;\n        let _queryStringParameters: IQueryStringParams[];\n        let _headers: { [name: string]: string };\n        let _batchQueue: EventBatch[];\n        let _serializer: Serializer;\n        let _enableEventTimings: boolean;\n        let _cookieMgr: ICookieMgr;\n        let _isUnloading: boolean;\n        let _useHeaders: boolean;\n        let _xhrTimeout: number;\n        let _zipPayload: boolean;\n        let _disableXhrSync: boolean;\n        let _disableFetchKeepAlive: boolean;\n        let _canHaveReducedPayload: boolean;\n        let _addNoResponse: boolean;\n        let _unloadHooks: IUnloadHook[];\n        let _sendHook: PayloadPreprocessorFunction | undefined;\n        let _sendListener: PayloadListenerFunction | undefined;\n        let _responseHandlers: Array<(responseText: string) => void>;\n        let _isInitialized: boolean;\n        let _timeoutWrapper: ITimeoutOverrideWrapper;\n        let _excludeCsMetaData: boolean;\n        let _sendPostMgr: SenderPostManager;\n        let _fetchCredentials: RequestCredentials;\n        let _maxEvtPerBatch: number = maxEventsPerBatch; // Sets default value in case the value is null\n\n        dynamicProto(HttpManager, this, (_self) => {\n            _initDefaults();\n\n            let _sendCredentials = true;\n\n            _self.initialize = (theConfig: IExtendedConfiguration, core: IAppInsightsCore, postChannel: IPostChannel) => {\n                if (!_isInitialized) {\n                    _core = core;\n                    _cookieMgr = core.getCookieMgr();\n                    _postManager = postChannel;\n                    _logger = _postManager.diagLog();\n    \n                    arrAppend(_unloadHooks, onConfigChange(theConfig, (details) => {\n                        let coreConfig = details.cfg;\n                        let channelConfig: IChannelConfiguration = details.cfg.extensionConfig[postChannel.identifier];\n    \n                        _timeoutWrapper = createTimeoutWrapper(channelConfig.setTimeoutOverride, channelConfig.clearTimeoutOverride);\n\n                        if (isValueAssigned(coreConfig.anonCookieName)) {\n                            _addQueryStringParameter(_queryStringParameters, \"anoncknm\", coreConfig.anonCookieName);\n                        } else {\n                            _removeQueryStringParameter(_queryStringParameters, \"anoncknm\");\n                        }\n    \n                        _sendHook = channelConfig.payloadPreprocessor;\n                        _sendListener = channelConfig.payloadListener;\n    \n                        let httpInterface = channelConfig.httpXHROverride;\n    \n                        // Override endpointUrl if provided in Post config\n                        let endpointUrl = channelConfig.overrideEndpointUrl ? channelConfig.overrideEndpointUrl : coreConfig.endpointUrl;\n                        _urlString = endpointUrl + UrlQueryString;\n                        _useHeaders = !isUndefined(channelConfig.avoidOptions) ? !channelConfig.avoidOptions : true;\n                        _enableEventTimings = !channelConfig.disableEventTimings;\n                        let maxEvtCfg = channelConfig.maxEvtPerBatch;\n                        _maxEvtPerBatch = maxEvtCfg && maxEvtCfg <= maxEventsPerBatch? maxEvtCfg : maxEventsPerBatch;\n    \n                        let valueSanitizer = channelConfig.valueSanitizer;\n                        let stringifyObjects = channelConfig.stringifyObjects;\n                        let enableCompoundKey = !!coreConfig.enableCompoundKey;\n                        if (!isUndefined(channelConfig.enableCompoundKey)) {\n                            enableCompoundKey = !!channelConfig.enableCompoundKey;\n                        }\n    \n                        _xhrTimeout = channelConfig.xhrTimeout;\n                        \n                        const csStream = getInst(\"CompressionStream\");\n\n                        // Controls whether payload compression (gzip) is enabled.\n                        _zipPayload = isFeatureEnabled(\"zipPayload\", coreConfig, false);\n                        // if user has payload processor (_sendHook), they may compress the payload themselves\n                        // to avoid double compression, we should disable the zipPayload\n                        if (!isFunction(csStream) || _sendHook) {\n                            _zipPayload = false;\n                        }\n\n                        _disableXhrSync = !!channelConfig.disableXhrSync;\n                        _disableFetchKeepAlive = !!channelConfig.disableFetchKeepAlive;\n                        _addNoResponse = channelConfig.addNoResponse !== false;\n                        _excludeCsMetaData = !!channelConfig.excludeCsMetaData;\n\n                        \n                        if (!!core.getPlugin(\"LocalStorage\")) {\n                            // Always disable fetch keep alive when persisten storage is available\n                            _disableFetchKeepAlive = true;\n                        }\n            \n                        _useBeacons = !isReactNative(); // Only use beacons if not running in React Native\n                        _serializer = new Serializer(_core, valueSanitizer, stringifyObjects, enableCompoundKey, getCommonSchemaMetaData, _excludeCsMetaData, channelConfig);\n        \n                        if (!isNullOrUndefined(channelConfig.useSendBeacon)) {\n                            _useBeacons = !!channelConfig.useSendBeacon;\n                        }\n                        if (channelConfig.fetchCredentials){\n                            _fetchCredentials= channelConfig.fetchCredentials;\n                        }\n                        let sendPostConfig = _getSendPostMgrConfig();\n                        // only init it once\n                        if (!_sendPostMgr) {\n                            _sendPostMgr = new SenderPostManager();\n                            _sendPostMgr.initialize(sendPostConfig, _logger);\n                        } else {\n                            _sendPostMgr.SetConfig(sendPostConfig);\n                        }\n    \n                        let syncHttpInterface = httpInterface;\n                        let beaconHttpInterface: IXHROverride = channelConfig.alwaysUseXhrOverride ? httpInterface : null;\n                        let fetchSyncHttpInterface: IXHROverride = channelConfig.alwaysUseXhrOverride ? httpInterface : null;\n                        let beaconUnloadTransports: TransportType[] = [TransportType.Beacon, TransportType.Fetch];\n        \n                        if (!httpInterface) {\n                            _customHttpInterface = false;\n        \n                            // this is handled in SendPostManager now\n                            // let location = getLocation();\n                            // if (location && location.protocol && location.protocol.toLowerCase() === \"file:\") {\n                            //     // Special case where a local html file fails with a CORS error on Chromium browsers\n                            //     _sendCredentials = false;\n                            // }\n        \n                            let theTransports: TransportType[] = [];\n                            if (isReactNative()) {\n                                // Use Fetch or XDR/XHR\n                                theTransports = [TransportType.Fetch, TransportType.Xhr];\n                                beaconUnloadTransports = [TransportType.Fetch, TransportType.Xhr, TransportType.Beacon];\n                            } else {\n                                // Use XDR/XHR, Fetch or beacons\n                                theTransports = [TransportType.Xhr, TransportType.Fetch, TransportType.Beacon];\n                            }\n        \n                            // Prefix any user requested transport(s) values\n                            theTransports = prependTransports(theTransports, channelConfig.transports);\n        \n                            httpInterface = _getSenderInterface(theTransports, false);\n                            if (!httpInterface) {\n                                _warnToConsole(_logger, \"No available transport to send events\");\n                            }\n        \n                            syncHttpInterface = _getSenderInterface(theTransports, true);\n                        }\n    \n                        if (!beaconHttpInterface) {\n                            // Allow overriding the usage of sendBeacon\n                            beaconUnloadTransports = prependTransports(beaconUnloadTransports, channelConfig.unloadTransports);\n                            beaconHttpInterface = _getSenderInterface(beaconUnloadTransports, true);\n                        }\n    \n                        _canHaveReducedPayload = !_customHttpInterface && ((_useBeacons && isBeaconsSupported()) || (!_disableFetchKeepAlive && isFetchSupported(true)));\n    \n                        _sendInterfaces = {\n                            [EventSendType.Batched]: httpInterface,\n                            [EventSendType.Synchronous]: syncHttpInterface || _getSenderInterface([TransportType.Xhr, TransportType.Fetch, TransportType.Beacon], true),\n                            [EventSendType.SendBeacon]: beaconHttpInterface || syncHttpInterface || _getSenderInterface([TransportType.Xhr], true),\n                            [EventSendType.SyncFetch]: fetchSyncHttpInterface || _getSenderInterface([TransportType.Fetch, TransportType.Beacon], true) || syncHttpInterface || _getSenderInterface([TransportType.Xhr], true)\n                        };\n                    }));\n\n                    _isInitialized = true;\n                }\n            };\n\n            _self.addResponseHandler = (responseHandler: (responseText: string) => void): IUnloadHook => {\n                _responseHandlers.push(responseHandler);\n                return {\n                    rm: () => {\n                        let index = _responseHandlers.indexOf(responseHandler);\n                        if (index >= 0){\n                            _responseHandlers.splice(index,1);\n                        }\n                    }\n                }\n            };\n\n            _self.serializeOfflineEvt = (evt) => {\n                try {\n                    if (_serializer) {\n                        return _serializer.getEventBlob(evt);\n                    }\n                      \n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return STR_EMPTY;\n                \n            }\n\n            _self.getOfflineRequestDetails = () => {\n                try {\n                    // get current url without paramter\n                    let payload = _serializer && _serializer.createPayload(0, false, false, false, SendRequestReason.NormalSchedule, EventSendType.Batched);\n                    return _buildRequestDetails(payload, _useHeaders);\n\n                } catch(e) {\n                    // eslint-disable-next-line no-empty\n                }\n               \n                return null;\n            }\n\n            _self.createOneDSPayload = (evts: ITelemetryItem[], optimize?: boolean) => {\n                try {\n                    // TODO: optimize\n                    let theBatches: EventBatch[] = [];\n                    // create a eventBatch for each event\n                    arrForEach(evts, (evt) => {\n                        if (optimize) {\n                            evt = optimizeObject(evt)\n                        }\n                        let batch = EventBatch.create(evt.iKey, [evt]);\n                        theBatches.push(batch);\n                    })\n          \n                    let thePayload: ISerializedPayload = null;\n\n                    while (theBatches.length > 0 && _serializer) {\n                        let theBatch = theBatches.shift();\n                        if (theBatch && theBatch.count() > 0) {\n                            thePayload = thePayload || _serializer.createPayload(0, false, false, false, SendRequestReason.NormalSchedule, EventSendType.Batched);\n                            _serializer.appendPayload(thePayload, theBatch, _maxEvtPerBatch)\n                        }\n                    }\n\n                    let requestDetails = _buildRequestDetails(thePayload, _useHeaders);\n\n                    let payloadData: IPayloadData = {\n                        data: thePayload.payloadBlob,\n                        urlString: requestDetails.url,\n                        headers: requestDetails.hdrs,\n                        timeout: _xhrTimeout,\n                        disableXhrSync: _disableXhrSync,\n                        disableFetchKeepAlive: _disableFetchKeepAlive\n                    };\n\n                    // Only automatically add the following headers if already sending headers and we are not attempting to avoid an options call\n                    if (_useHeaders) {\n                        if (!_hasHeader(payloadData.headers, STR_CACHE_CONTROL)) {\n                            payloadData.headers[STR_CACHE_CONTROL] = DEFAULT_CACHE_CONTROL;\n                        }\n\n                        if (!_hasHeader(payloadData.headers, STR_CONTENT_TYPE_HEADER)) {\n                            payloadData.headers[STR_CONTENT_TYPE_HEADER] = DEFAULT_CONTENT_TYPE;\n                        }\n                    }\n\n                    return payloadData;\n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return null;\n            }\n\n            \n\n            // Special internal method to allow the DebugPlugin to hook embedded objects\n            function _getSenderInterface(transports: TransportType[], syncSupport: boolean): _IInternalXhrOverride {\n                try {\n                    return _sendPostMgr && _sendPostMgr.getSenderInst(transports, syncSupport);\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return null;\n            }\n\n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [_sendInterfaces[EventSendType.Batched], _killSwitch, _serializer, _sendInterfaces, _getSendPostMgrConfig(), _urlString, _maxEvtPerBatch];\n            };\n\n            function _getSendPostMgrConfig(): _ISendPostMgrConfig {\n                try {\n                    let onCompleteFuncs = {\n                        xdrOnComplete: _xdrOncomplete,\n                        fetchOnComplete: _fetchOnComplete,\n                        xhrOnComplete: _xhrOnComplete,\n                        beaconOnRetry: _onBeaconRetry\n                    } as _ISenderOnComplete;\n\n                    let config = {\n                        enableSendPromise: false,\n                        isOneDs: true,\n                        disableCredentials: !_sendCredentials,\n                        fetchCredentials: _fetchCredentials,\n                        disableXhr: false,\n                        disableBeacon: !_useBeacons,\n                        disableBeaconSync: !_useBeacons,\n                        disableFetchKeepAlive: _disableFetchKeepAlive,\n                        timeWrapper: _timeoutWrapper,\n                        addNoResponse: _addNoResponse,\n                        senderOnCompleteCallBack: onCompleteFuncs\n                    } as _ISendPostMgrConfig;\n                    return config;\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return null;\n            }\n\n\n            function _xdrOncomplete(xdr: IXDomainRequest, oncomplete: OnCompleteCallback, payload?: IPayloadData) {\n                let response = getResponseText(xdr);\n                _doOnComplete(oncomplete, 200, {}, response);\n                _handleCollectorResponse(response);\n               \n            }\n\n            function _initDefaults() {\n                let undefValue: undefined;\n                _urlString = null\n                _killSwitch = createKillSwitch();\n                _paused = false;\n                _clockSkewManager = createClockSkewManager();\n                _useBeacons = false;\n                _outstandingRequests = 0;           // Holds the number of outstanding async requests that have not returned a response yet\n                _postManager = null\n                _logger = null\n                _sendInterfaces = null\n                _core = null\n                _customHttpInterface = true;\n                _queryStringParameters = [];\n                _headers = {};\n                _batchQueue = [];\n                _serializer = null;\n                _enableEventTimings = false;\n                _cookieMgr = null;\n                _isUnloading = false;\n                _useHeaders = false;\n                _xhrTimeout = undefValue;\n                _disableXhrSync = undefValue;\n                _disableFetchKeepAlive = undefValue;\n                _canHaveReducedPayload = undefValue;\n                _addNoResponse = undefValue;\n                _unloadHooks = [];\n                _sendHook = undefValue;\n                _sendListener = undefValue;\n                _responseHandlers = [];\n                _isInitialized = false;\n                _timeoutWrapper = createTimeoutWrapper();\n                _excludeCsMetaData = false;\n                _sendPostMgr = null;\n                _maxEvtPerBatch = null;\n            }\n\n            function _fetchOnComplete(response: Response, onComplete: OnCompleteCallback, resValue?: string, payload?: IPayloadData) {\n                const handleResponse = (status: number, headerMap: { [x: string]: string; }, responseText: string) => {\n                    _doOnComplete(onComplete, status, headerMap, responseText);\n                    _handleCollectorResponse(responseText);\n                };\n                let headerMap = {};\n                var headers = response.headers;\n                if (headers) {\n                    headers[\"forEach\"]((value: string, name: string) => {\n                        headerMap[name] = value;\n                    });\n                }\n                handleResponse(response.status, headerMap, resValue || STR_EMPTY);\n            }\n            \n\n            function _xhrOnComplete (request: XMLHttpRequest, oncomplete: OnCompleteCallback, payload?: IPayloadData) {\n                let response = getResponseText(request);\n                _doOnComplete(oncomplete, request.status, _getAllResponseHeaders(request, true), response);\n                _handleCollectorResponse(response);\n            }\n\n            function _doOnComplete(oncomplete: OnCompleteCallback, status: number, headers: { [headerName: string]: string }, response?: string) {\n                try {\n                    oncomplete(status, headers, response);\n                } catch (e) {\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eExtendedInternalMessageId.SendPostOnCompleteFailure, dumpObj(e));\n                }\n            }\n\n            function _onBeaconRetry(payload: IPayloadData, onComplete: OnCompleteCallback, canSend:(payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => boolean) {\n                // Custom headers not supported in sendBeacon payload.headers would be ignored\n                let internalPayloadData = payload as IInternalPayloadData;\n                let status = 200;\n                let thePayload = internalPayloadData._thePayload;\n                let theUrl = payload.urlString + (_addNoResponse ? _noResponseQs : STR_EMPTY);\n\n                try {\n                    let nav = getNavigator();\n                 \n                    if (thePayload) {\n                        let persistStorage = !!_core.getPlugin(\"LocalStorage\");\n                        // Failed to send entire payload so try and split data and try to send as much events as possible\n                        let droppedBatches: EventBatch[] = [];\n                        let sentBatches: EventBatch[] = [];\n                        arrForEach(thePayload.batches, (theBatch) => {\n                            if (droppedBatches && theBatch && theBatch.count() > 0) {\n                                let theEvents = theBatch.events();\n                                for (let lp = 0; lp < theEvents.length; lp++) {\n                                    if (!nav.sendBeacon(theUrl, _serializer.getEventBlob(theEvents[lp]))) {\n                                        // Can't send anymore, so split the batch and drop the rest\n                                        droppedBatches.push(theBatch.split(lp));\n                                        break;\n                                    } else {\n                                        sentBatches.push(theBatch[lp]);\n                                    }\n                                }\n                            } else {\n                                // Remove all of the events from the existing batch in the payload as the copy includes the original\n                                droppedBatches.push(theBatch.split(0));\n                            }\n                        });\n\n                        if (sentBatches.length > 0) {\n                            // Update the payload with the sent batches\n                            thePayload.sentEvts = sentBatches;\n                        }\n                        \n                        if (!persistStorage) {\n                            // Events passed Serializer size validation, log BeaconSendFailure\n                            // because it could still be size related but we did not exceed the\n                            // configured limit, and sendBeacon could fail for other reasons\n                            _sendBatchesNotification(droppedBatches, EventBatchNotificationReason.BeaconSendFailure, thePayload.sendType, true);\n                        }\n                    } else {\n                        status = 0;\n                    }\n                  \n\n                } catch (ex) {\n                    _warnToConsole(_logger, \"Failed to send telemetry using sendBeacon API. Ex:\" + dumpObj(ex));\n                    status = 0;\n                } finally {\n                    _doOnComplete(onComplete, status, {}, STR_EMPTY);\n                }\n\n            }\n\n\n            function _isBeaconPayload(sendType: EventSendType) {\n                // Sync Fetch has the same payload limitation as sendBeacon -- 64kb limit, so treat both as a beacon send\n                return sendType === EventSendType.SendBeacon || sendType === EventSendType.SyncFetch;\n            }\n\n            function _adjustSendType(sendType: EventSendType) {\n                if (_isUnloading && _isBeaconPayload(sendType)) {\n                    sendType = EventSendType.SendBeacon;\n                }\n\n                return sendType;\n            }\n\n            _self.addHeader = (name: string, value: string) => {\n                _headers[name] = value;\n            };\n\n            _self.removeHeader = (name: string) => {\n                delete _headers[name];\n            };\n\n            _self.canSendRequest = () => {\n                return _hasIdleConnection() && _clockSkewManager.allowRequestSending();\n            };\n\n            _self.sendQueuedRequests = (sendType?: EventSendType, sendReason?: SendRequestReason) => {\n                if (isUndefined(sendType)) {\n                    sendType = EventSendType.Batched;\n                }\n\n                if (_isUnloading) {\n                    sendType = _adjustSendType(sendType);\n                    sendReason = SendRequestReason.Unload;\n                }\n\n                if (_canSendPayload(_batchQueue, sendType, 0)) {\n                    _sendBatches(_clearQueue(), 0, false, sendType, sendReason || SendRequestReason.Undefined);\n                }\n            };\n\n            _self.isCompletelyIdle = (): boolean => {\n                return !_paused && _outstandingRequests === 0 && _batchQueue.length === 0;\n            };\n\n            _self.setUnloading = (value: boolean): void => {\n                _isUnloading = value;\n            };\n\n            _self.addBatch = (theBatch: EventBatch) => {\n                if (theBatch && theBatch.count() > 0) {\n                    // Try and kill the event faster\n                    if (_killSwitch.isTenantKilled(theBatch.iKey())) {\n                        return false;\n                    }\n\n                    _batchQueue.push(theBatch);\n                }\n\n                return true;\n            };\n\n            /**\n             * Queue all the remaining requests to be sent. The requests will be\n             * sent using HTML5 Beacons if they are available.\n             */\n            _self.teardown = () => {\n                if (_batchQueue.length > 0) {\n                    _sendBatches(_clearQueue(), 0, true, EventSendType.SendBeacon, SendRequestReason.Unload);\n                }\n\n                arrForEach(_unloadHooks, (hook) => {\n                    hook && hook.rm && hook.rm();\n                });\n                _unloadHooks = [];\n            };\n\n            /**\n             * Pause the sending of requests. No new requests will be sent.\n             */\n            _self.pause = () => {\n                _paused = true;\n            };\n\n            /**\n             * Resume the sending of requests.\n             */\n            _self.resume = () => {\n                _paused = false;\n                _self.sendQueuedRequests(EventSendType.Batched, SendRequestReason.Resumed);\n            };\n\n            /**\n             * Sends a request synchronously to the Aria collector. This api is used to send\n             * a request containing a single immediate event.\n             *\n             * @param batch - The request to be sent.\n             * @param sendReason   - The token used to send the request.\n             */\n            _self.sendSynchronousBatch = (batch: EventBatch, sendType?: EventSendType, sendReason?: SendRequestReason) => {\n                // This will not take into account the max connections restriction. Since this is sync, we can\n                // only send one of this request at a time and thus should not worry about multiple connections\n                // being used to send synchronous events.\n                // Increment active connection since we are still going to use a connection to send the request.\n                if (batch && batch.count() > 0) {\n                    if (isNullOrUndefined(sendType)) {\n                        sendType = EventSendType.Synchronous;\n                    }\n\n                    if (_isUnloading) {\n                        sendType = _adjustSendType(sendType);\n                        sendReason = SendRequestReason.Unload;\n                    }\n\n                    // For sync requests we will not wait for the clock skew.\n                    _sendBatches([batch], 0, false, sendType, sendReason || SendRequestReason.Undefined);\n                }\n            };\n\n            function _hasIdleConnection(): boolean {\n                return !_paused && _outstandingRequests < maxConnections;\n            }\n\n            function _clearQueue() {\n                let theQueue = _batchQueue;\n                _batchQueue = [];\n                return theQueue;\n            }\n\n            function _canSendPayload(theBatches: EventBatch[], sendType: EventSendType, retryCnt: number) {\n                let result = false;\n                if (theBatches && theBatches.length > 0 && !_paused && _sendInterfaces[sendType] && _serializer) {\n                    // Always attempt to send synchronous events don't wait for idle or clockSkew\n                    // and don't block retry requests if clockSkew is not yet set\n                    result = (sendType !== EventSendType.Batched) || (_hasIdleConnection() && (retryCnt > 0 || _clockSkewManager.allowRequestSending()));\n                }\n\n                return result;\n            }\n\n            function _createDebugBatches(theBatches: EventBatch[]) {\n                let values = {};\n\n                if (theBatches) {\n                    arrForEach(theBatches, (theBatch, idx) => {\n                        values[idx] = {\n                            iKey: theBatch.iKey(),\n                            evts: theBatch.events()\n                        };\n                    });\n                }\n\n                return values;\n            }\n\n            function _sendBatches(theBatches: EventBatch[], retryCount: number, isTeardown: boolean, sendType: EventSendType, sendReason: SendRequestReason) {\n                if (!theBatches || theBatches.length === 0) {\n                    // Nothing to do\n                    return;\n                }\n\n                if (_paused) {\n                    _sendBatchesNotification(theBatches, EventBatchNotificationReason.Paused, sendType);\n                    return;\n                }\n\n                // Make sure that if we are unloading the sendType is a supported version\n                sendType = _adjustSendType(sendType);\n\n                try {\n                    let orgBatches = theBatches;\n                    let isSynchronous = sendType !== EventSendType.Batched;\n                    doPerf(_core, () => \"HttpManager:_sendBatches\", (perfEvt?: IPerfEvent) => {\n                        if (perfEvt) {\n                            // Perf Monitoring is enabled, so create a \"Quick\" copy of the original batches so we still report\n                            // the original values as part of the perfEvent. This is because theBatches uses .shift() to remove each\n                            // batch as they are processed - removing from the original array, so by the time the _createDebugBatches()\n                            // function is called the passed in value has changed and therefore the reported value for the perfEvent is incorrect\n                            theBatches = theBatches.slice(0);\n                        }\n\n                        let droppedBatches: EventBatch[] = [];\n                        let thePayload: ISerializedPayload = null;\n                        let serializationStart = getTime();\n                        let sendInterface = _sendInterfaces[sendType] || (isSynchronous ? _sendInterfaces[EventSendType.Synchronous] : _sendInterfaces[EventSendType.Batched]);\n                        let sendTransport = sendInterface && sendInterface._transport;\n\n                        // Sync Fetch has the same payload limitation as sendBeacon -- 64kb limit\n                        let isReducedPayload = _canHaveReducedPayload && (_isUnloading || _isBeaconPayload(sendType) || (sendTransport === TransportType.Beacon || (sendInterface._isSync && sendTransport === TransportType.Fetch)));\n\n                        while (_canSendPayload(theBatches, sendType, retryCount)) {\n                            let theBatch = theBatches.shift();\n                            if (theBatch && theBatch.count() > 0) {\n                                if (!_killSwitch.isTenantKilled(theBatch.iKey())) {\n\n                                    // Make sure we have a payload object\n                                    thePayload = thePayload || _serializer.createPayload(retryCount, isTeardown, isSynchronous, isReducedPayload, sendReason, sendType);\n                                    \n                                    // Add the batch to the current payload\n                                    if (!_serializer.appendPayload(thePayload, theBatch, _maxEvtPerBatch)) {\n                                        // Entire batch was not added so send the payload and retry adding this batch\n                                        _doPayloadSend(thePayload, serializationStart, getTime(), sendReason);\n                                        serializationStart = getTime();\n                                        theBatches = [theBatch].concat(theBatches);\n                                        thePayload = null;\n                                    } else if (thePayload.overflow !== null) {\n                                        // Total Payload size was exceeded so send the payload and add the unsent as the next batch to send\n                                        theBatches = [thePayload.overflow].concat(theBatches);\n                                        thePayload.overflow = null;\n                                        _doPayloadSend(thePayload, serializationStart, getTime(), sendReason);\n                                        serializationStart = getTime();\n                                        thePayload = null;\n                                    }\n                                } else {\n                                    droppedBatches.push(theBatch);\n                                }\n                            }\n                        }\n\n                        // Make sure to flush any remaining payload\n                        if (thePayload) {\n                            _doPayloadSend(thePayload, serializationStart, getTime(), sendReason);\n                        }\n\n                        if (theBatches.length > 0) {\n                            // Add any unsent batches back to the head of the queue\n                            _batchQueue = theBatches.concat(_batchQueue);\n                        }\n\n                        // Now send notification about any dropped events\n                        _sendBatchesNotification(droppedBatches, EventBatchNotificationReason.KillSwitch, sendType);\n                    }, () => ({ batches: _createDebugBatches(orgBatches), retryCount, isTeardown, isSynchronous, sendReason, useSendBeacon: _isBeaconPayload(sendType), sendType }), !isSynchronous);\n                } catch (ex) {\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.CannotSerializeObject, \"Unexpected Exception sending batch: \" + dumpObj(ex));\n                }\n            }\n\n            function _buildRequestDetails(thePayload: ISerializedPayload, useHeaders: boolean): IRequestUrlDetails {\n                let requestDetails: IRequestUrlDetails = {\n                    url: _urlString,\n                    hdrs: {},\n                    useHdrs: false          // Assume no headers\n                };\n\n                if (!useHeaders) {\n                    // Attempt to map headers to a query string if possible\n                    objForEachKey(_headers, (name, value) => {\n                        if (_collectorHeaderToQs[name]) {\n                            _addRequestDetails(requestDetails, _collectorHeaderToQs[name], value, false);\n                        } else {\n                            // No mapping, so just include in the headers anyway (may not get sent if using sendBeacon())\n                            requestDetails.hdrs[name] = value;\n                            requestDetails.useHdrs = true;\n                        }\n                    });\n                } else {\n                    // Copy the pre-defined headers into the payload headers\n                    requestDetails.hdrs = extend(requestDetails.hdrs, _headers);\n                    requestDetails.useHdrs = (objKeys(requestDetails.hdrs).length > 0);\n                }\n\n                _addRequestDetails(requestDetails, STR_CLIENT_ID, \"NO_AUTH\", useHeaders);\n                _addRequestDetails(requestDetails, STR_CLIENT_VERSION, FullVersionString, useHeaders);\n\n                let apiQsKeys = STR_EMPTY;\n                arrForEach(thePayload.apiKeys, (apiKey) => {\n                    if (apiQsKeys.length > 0) {\n                        apiQsKeys += \",\";\n                    }\n\n                    apiQsKeys += apiKey;\n                });\n\n                _addRequestDetails(requestDetails, STR_API_KEY, apiQsKeys, useHeaders);\n                _addRequestDetails(requestDetails, STR_UPLOAD_TIME, dateNow().toString(), useHeaders);\n\n                let msfpc = _getMsfpc(thePayload);\n                if (isValueAssigned(msfpc)) {\n                    requestDetails.url += \"&ext.intweb.msfpc=\" + msfpc;\n                }\n\n                if (_clockSkewManager.shouldAddClockSkewHeaders()) {\n                    _addRequestDetails(requestDetails, STR_TIME_DELTA_TO_APPLY, _clockSkewManager.getClockSkewHeaderValue(), useHeaders);\n                }\n\n                if (_core.getWParam) {\n                    let wParam = _core.getWParam();\n                    if (wParam >= 0) {\n                        requestDetails.url += \"&w=\" + wParam;\n                    }\n                }\n\n                for (let i = 0; i < _queryStringParameters.length; i++) {\n                    requestDetails.url += \"&\" + _queryStringParameters[i].name + \"=\" + _queryStringParameters[i].value;\n                }\n\n                return requestDetails;\n            }\n\n            function _setTimingValue(timings: any, name: string, value: number) {\n                timings[name] = timings[name] || {};\n                timings[name][_postManager.identifier] = value;\n            }\n\n            function _doPayloadSend(thePayload: ISerializedPayload, serializationStart: number, serializationCompleted: number, sendReason: SendRequestReason) {\n\n                if (thePayload && thePayload.payloadBlob && thePayload.payloadBlob.length > 0) {\n                    let useSendHook = !!_sendHook;\n                    let sendInterface = _sendInterfaces[thePayload.sendType];\n\n                    // Send all data using a beacon style transport if closing mode is on or channel was teared down\n                    if (!_isBeaconPayload(thePayload.sendType) && thePayload.isBeacon && thePayload.sendReason === SendRequestReason.Unload) {\n                        sendInterface = _sendInterfaces[EventSendType.SendBeacon] || _sendInterfaces[EventSendType.SyncFetch] || sendInterface;\n                    }\n\n                    let useHeaders = _useHeaders;\n\n                    // Disable header usage if we know we are using sendBeacon as additional headers are not supported\n                    if (thePayload.isBeacon || sendInterface._transport === TransportType.Beacon) {\n                        useHeaders = false;\n                    }\n\n                    let requestDetails = _buildRequestDetails(thePayload, useHeaders);\n                    useHeaders = useHeaders || requestDetails.useHdrs;\n\n                    let sendEventStart = getTime();\n\n                    doPerf(_core, () => \"HttpManager:_doPayloadSend\", () => {\n                        // Increment the send attempt count and add timings after packaging (So it's not serialized in the 1st attempt)\n                        for (let batchLp = 0; batchLp < thePayload.batches.length; batchLp++) {\n                            let theBatch = thePayload.batches[batchLp];\n                            let theEvents: IPostTransmissionTelemetryItem[] = theBatch.events();\n                            for (let evtLp = 0; evtLp < theEvents.length; evtLp++) {\n                                let telemetryItem: IPostTransmissionTelemetryItem = theEvents[evtLp];\n                                if (_enableEventTimings) {\n                                    let timings = telemetryItem.timings = telemetryItem.timings || {};\n                                    _setTimingValue(timings, \"sendEventStart\", sendEventStart);\n                                    _setTimingValue(timings, \"serializationStart\", serializationStart);\n                                    _setTimingValue(timings, \"serializationCompleted\", serializationCompleted);\n                                }\n\n                                telemetryItem[strSendAttempt] > 0 ? telemetryItem[strSendAttempt]++ : telemetryItem[strSendAttempt] = 1;\n                            }\n                        }\n\n                        // Note: always sending this notification in a synchronous manner.\n                        _sendBatchesNotification(\n                            thePayload.batches,\n                            (EventBatchNotificationReason.SendingUndefined + (sendReason || SendRequestReason.Undefined)),\n                            thePayload.sendType,\n                            true);\n\n                        // Disabling the use of const because of Issue:\n                        // - Task 9227844: [1DS] Some environments and packagers automatically \"freeze\" objects which are defined as const which causes any mutations to throw\n                        // eslint-disable-next-line prefer-const\n                        let orgPayloadData: IInternalPayloadData = {\n                            data: thePayload.payloadBlob,\n                            urlString: requestDetails.url,\n                            headers: requestDetails.hdrs,\n                            _thePayload: thePayload,\n                            _sendReason: sendReason,\n                            timeout: _xhrTimeout,\n                            disableXhrSync: _disableXhrSync,\n                            disableFetchKeepAlive: _disableFetchKeepAlive\n                        };\n\n                        // Only automatically add the following headers if already sending headers and we are not attempting to avoid an options call\n                        if (useHeaders) {\n                            if (!_hasHeader(orgPayloadData.headers, STR_CACHE_CONTROL)) {\n                                orgPayloadData.headers[STR_CACHE_CONTROL] = DEFAULT_CACHE_CONTROL;\n                            }\n    \n                            if (!_hasHeader(orgPayloadData.headers, STR_CONTENT_TYPE_HEADER)) {\n                                orgPayloadData.headers[STR_CONTENT_TYPE_HEADER] = DEFAULT_CONTENT_TYPE;\n                            }\n                        }\n\n                        let sender: (payload: IPayloadData) => void = null;\n\n                        if (sendInterface) {\n                            // Send sync requests if the request is immediate or we are tearing down telemetry.\n                            sender = (payload: IPayloadData) => {\n                                // Notify the clock skew manager that we are sending the first request (Potentially blocking all further requests)\n                                _clockSkewManager.firstRequestSent();\n\n                                let onComplete = (status, headers) => {\n                                    _retryRequestIfNeeded(status, headers, thePayload, sendReason);\n                                };\n\n                                let isSync = thePayload.isTeardown || thePayload.isSync;\n                                _sendPostMgr.preparePayload((processedPayload: IPayloadData) => {\n                                    try {\n                                        sendInterface.sendPOST(processedPayload, onComplete, isSync);\n                                        if (_sendListener) {\n                                            // Send the original payload to the listener\n                                            _sendListener(orgPayloadData, processedPayload, isSync, thePayload.isBeacon);\n                                        }\n                                    } catch (ex) {\n                                        _doOnComplete(onComplete, 0, {});\n                                        _warnToConsole(_logger, \"Unexpected exception sending payload. Ex:\" + dumpObj(ex));\n                                    }\n                                }, _zipPayload, payload, isSync);\n                            };\n                        }\n\n                        doPerf(_core, () => \"HttpManager:_doPayloadSend.sender\", () => {\n                            if (sender) {\n                                if (thePayload.sendType === EventSendType.Batched) {\n                                    _outstandingRequests ++;\n                                }\n\n                                // Only call the hook if it's defined and we are not using sendBeacon as additional headers are not supported\n                                if (useSendHook && !thePayload.isBeacon && sendInterface._transport !== TransportType.Beacon) {\n                                    // Create a new IPayloadData that is sent into the hook method, so that the hook method\n                                    // can't change the object references to the orgPayloadData (it can still change the content -- mainly the headers)\n\n                                    // Disabling the use of const because of Issue:\n                                    // - Task 9227844: [1DS] Some environments and packagers automatically \"freeze\" objects which are defined as const which causes any mutations to throw\n                                    // eslint-disable-next-line prefer-const\n                                    let hookData: IPayloadData = {\n                                        data: orgPayloadData.data,\n                                        urlString: orgPayloadData.urlString,\n                                        headers: extend({}, orgPayloadData.headers),\n                                        timeout: orgPayloadData.timeout,\n                                        disableXhrSync: orgPayloadData.disableXhrSync,\n                                        disableFetchKeepAlive: orgPayloadData.disableFetchKeepAlive\n                                    };\n\n                                    let senderCalled = false;\n                                    doPerf(_core, () => \"HttpManager:_doPayloadSend.sendHook\", () => {\n                                        try {\n                                            _sendHook(\n                                                hookData,\n                                                (payload: IInternalPayloadData) => {\n                                                    senderCalled = true;\n                                                    // Add back the internal properties\n                                                    if (!_customHttpInterface && !payload._thePayload) {\n                                                        payload._thePayload = payload._thePayload || orgPayloadData._thePayload;\n                                                        payload._sendReason = payload._sendReason || orgPayloadData._sendReason;\n                                                    }\n\n                                                    sender(payload);\n                                                },\n                                                thePayload.isSync || thePayload.isTeardown);\n                                        } catch (ex) {\n                                            if (!senderCalled) {\n                                                // The hook never called the sender -- assume that it never will\n                                                sender(orgPayloadData);\n                                            }\n                                        }\n                                    });\n                                } else {\n                                    sender(orgPayloadData);\n                                }\n                            }\n                        });\n\n                    }, () => ({ thePayload, serializationStart, serializationCompleted, sendReason }), thePayload.isSync);\n                }\n\n                if (thePayload.sizeExceed && thePayload.sizeExceed.length > 0) {\n                    // Ensure that we send any discard events for oversize events even when there was no payload to send\n                    _sendBatchesNotification(thePayload.sizeExceed, EventBatchNotificationReason.SizeLimitExceeded, thePayload.sendType);\n                }\n\n                if (thePayload.failedEvts && thePayload.failedEvts.length > 0) {\n                    // Ensure that we send any discard events for events that could not be serialized even when there was no payload to send\n                    _sendBatchesNotification(thePayload.failedEvts, EventBatchNotificationReason.InvalidEvent, thePayload.sendType);\n                }\n            }\n\n            function _addEventCompletedTimings(theEvents: IPostTransmissionTelemetryItem[], sendEventCompleted: number) {\n                if (_enableEventTimings) {\n                    arrForEach(theEvents, (theEvent) => {\n                        let timings = theEvent.timings = theEvent.timings || {};\n                        _setTimingValue(timings, \"sendEventCompleted\", sendEventCompleted);\n                    });\n                }\n            }\n\n            function _retryRequestIfNeeded(status: number, headers: { [headerName: string]: string }, thePayload: ISerializedPayload, sendReason: SendRequestReason) {\n                let reason: EventBatchNotificationReason = EventBatchNotificationReason.ResponseFailure;\n                let droppedBatches: EventBatch[] = null;\n                let isRetrying = false;\n                let backOffTrans = false;\n\n                try {\n                    let shouldRetry = true;\n\n                    if (typeof status !== strUndefined) {\n                        if (headers) {\n                            _clockSkewManager.setClockSkew(headers[STR_TIME_DELTA_HEADER]);\n                            let killDuration = headers[STR_KILL_DURATION_HEADER] || headers[\"kill-duration-seconds\"];\n                            arrForEach(_killSwitch.setKillSwitchTenants(headers[STR_KILL_TOKENS_HEADER], killDuration), (killToken) => {\n                                arrForEach(thePayload.batches, (theBatch) => {\n                                    if (theBatch.iKey() === killToken) {\n                                        // Make sure we have initialized the array\n                                        droppedBatches = droppedBatches || [];\n\n                                        // Create a copy of the batch with all of the events (and more importantly the action functions)\n                                        let removedEvents = theBatch.split(0);\n                                        // And then remove the events for the payload batch and reduce the actual number of processed\n                                        thePayload.numEvents -= removedEvents.count();\n                                        droppedBatches.push(removedEvents);\n                                    }\n                                });\n                            });\n                        }\n\n                        // Disabling triple-equals rule to avoid httpOverrides from failing because they are returning a string value\n                        // tslint:disable-next-line:triple-equals\n                        if (status == 200 || status == 204) {\n                            // Response was successfully sent\n                            reason = EventBatchNotificationReason.Complete;\n                            return;\n                        }\n\n                        if (!retryPolicyShouldRetryForStatus(status) || thePayload.numEvents <= 0) {\n                            // Only retry for specific response codes and if there is still events after kill switch processing\n                            shouldRetry = false;\n                        }\n\n                        // Derive the notification response from the HttpStatus Code\n                        reason = EventBatchNotificationReason.ResponseFailure + (status % 1000);\n                    }\n\n                    if (shouldRetry) {\n                        // The events should be retried -- so change notification to requeue them\n                        reason = EventBatchNotificationReason.RequeueEvents;\n                        let retryCount = thePayload.retryCnt;\n                        if (thePayload.sendType === EventSendType.Batched) {\n                            // attempt to resend the entire batch\n                            if (retryCount < maxRequestRetriesBeforeBackoff) {\n                                isRetrying = true;\n                                _doAction(() => {\n                                    // try to resend the same batches\n                                    if (thePayload.sendType === EventSendType.Batched) {\n                                        // Reduce the outstanding request count (if this was an async request) as we didn't reduce the count\n                                        // previously and we are about to reschedule our retry attempt and we want an attempt to send\n                                        // to occur, it's also required to ensure that a follow up handleRequestFinished() call occurs\n                                        _outstandingRequests--;\n                                    }\n\n                                    _sendBatches(thePayload.batches, retryCount + 1, thePayload.isTeardown, _isUnloading ? EventSendType.SendBeacon : thePayload.sendType, SendRequestReason.Retry);\n                                }, _isUnloading, retryPolicyGetMillisToBackoffForRetry(retryCount));\n                            } else {\n                                backOffTrans = true;\n                                if (_isUnloading) {\n                                    // we are unloading so don't try and requeue the events otherwise let the events get requeued and resent during the backoff sending\n                                    // This will also cause the events to be purged based on the priority (if necessary)\n                                    reason = EventBatchNotificationReason.NonRetryableStatus;\n                                }\n                            }\n                        }\n                    }\n\n                } finally {\n                    if (!isRetrying) {\n                        // Make sure the clockSkewManager doesn't blocking further sending of requests once we have a proper response\n                        // This won't override any previously sent clock Skew value\n                        _clockSkewManager.setClockSkew();\n\n                        _handleRequestFinished(thePayload, reason, sendReason, backOffTrans);\n                    }\n\n                    _sendBatchesNotification(droppedBatches, EventBatchNotificationReason.KillSwitch, thePayload.sendType);\n                }\n            }\n\n            function _handleRequestFinished(\n                thePayload: ISerializedPayload,\n                batchReason: EventBatchNotificationReason,\n                sendReason: SendRequestReason,\n                backOffTrans: boolean) {\n\n                try {\n                    if (backOffTrans) {\n                        // Slow down the transmission requests\n                        _postManager._backOffTransmission();\n                    }\n\n                    let theBatches = thePayload.batches;\n                    if (batchReason === EventBatchNotificationReason.Complete) {\n                        theBatches = thePayload.sentEvts || thePayload.batches;\n                        if (!backOffTrans && !thePayload.isSync) {\n                            // We have a successful async response, so the lets open the floodgates\n                            // The reason for checking isSync is to avoid unblocking if beacon send occurred as it\n                            // doesn't wait for a response.\n                            _postManager._clearBackOff();\n                        }\n\n                        _addCompleteTimings(theBatches);\n                    }\n\n                    // Send the notifications synchronously\n                    _sendBatchesNotification(theBatches, batchReason, thePayload.sendType, true);\n\n                } finally {\n                    if (thePayload.sendType === EventSendType.Batched) {\n                        // we always need to decrement this value otherwise the httpmanager locks up and won't send any more events\n                        _outstandingRequests--;\n\n                        // Don't try to send additional queued events if this is a retry operation as the retried\n                        // response will eventually call _handleRequestFinished for the retried event\n                        if (sendReason !== SendRequestReason.Retry) {\n                            // Try and send any other queued batched events\n                            _self.sendQueuedRequests(thePayload.sendType, sendReason);\n                        }\n                    }\n                }\n            }\n\n            function _addCompleteTimings(theBatches: EventBatch[]) {\n                if (_enableEventTimings) {\n                    let sendEventCompleted = getTime();\n                    arrForEach(theBatches, (theBatch) => {\n                        if (theBatch && theBatch.count() > 0) {\n                            _addEventCompletedTimings(theBatch.events(), sendEventCompleted);\n                        }\n                    });\n                }\n            }\n\n            function _doAction(cb: VoidFunction, isSync: boolean, interval: number) {\n                if (isSync) {\n                    cb();\n                } else {\n                    _timeoutWrapper.set(cb, interval);\n                }\n            }\n\n\n            function _getMsfpc(thePayload: ISerializedPayload): string {\n                for (let lp = 0; lp < thePayload.batches.length; lp++) {\n                    let msfpc = thePayload.batches[lp].Msfpc();\n                    if (msfpc) {\n                        return encodeURIComponent(msfpc);\n                    }\n                }\n\n                return STR_EMPTY;\n            }\n\n            function _handleCollectorResponse(responseText: string): void {\n                let responseHandlers = _responseHandlers;\n                try {\n                    for (let i = 0; i < responseHandlers.length; i++) {\n                        try {\n                            responseHandlers[i](responseText);\n                        } catch (e) {\n                            _throwInternal(_logger,\n                                eLoggingSeverity.CRITICAL,\n                                _eExtendedInternalMessageId.PostResponseHandler,\n                                \"Response handler failed: \" + e);\n                        }\n                    }\n                    if (responseText) {\n                        let response = JSON.parse(responseText) as ICollectorResult;\n                        if (isValueAssigned(response.webResult) && isValueAssigned(response.webResult[STR_MSFPC])) {\n                            // Set cookie\n                            _cookieMgr.set(\"MSFPC\", response.webResult[STR_MSFPC], 365 * 86400);\n                        }\n                    }\n                } catch (ex) {\n                    // Doing nothing\n                }\n            }\n\n            function _sendBatchesNotification(theBatches: EventBatch[], batchReason: EventBatchNotificationReason, sendType: EventSendType, sendSync?: boolean) {\n                if (theBatches && theBatches.length > 0 && actions) {\n                    let theAction: BatchNotificationAction = actions[_getNotificationAction(batchReason)];\n                    if (theAction) {\n                        let isSyncRequest = sendType !== EventSendType.Batched;\n\n                        doPerf(_core, () => \"HttpManager:_sendBatchesNotification\", () => {\n                            _doAction(() => {\n                                try {\n                                    theAction.call(actions, theBatches, batchReason, isSyncRequest, sendType);\n                                } catch (e) {\n                                    _throwInternal(_logger,\n                                        eLoggingSeverity.CRITICAL,\n                                        _eInternalMessageId.NotificationException,\n                                        \"send request notification failed: \" + e);\n                                }\n                            }, sendSync || isSyncRequest, 0);\n                        }, () => ({ batches: _createDebugBatches(theBatches), reason: batchReason, isSync: isSyncRequest, sendSync: sendSync, sendType: sendType }), !isSyncRequest);\n                    }\n                }\n            }\n\n            function _getNotificationAction(reason: EventBatchNotificationReason): string {\n                let action = _eventActionMap[reason];\n                if (!isValueAssigned(action)) {\n                    action = STR_OTHER;\n                    if (reason >= EventBatchNotificationReason.ResponseFailure && reason <= EventBatchNotificationReason.ResponseFailureMax) {\n                        action = STR_RESPONSE_FAIL;\n                    } else if (reason >= EventBatchNotificationReason.EventsDropped && reason <= EventBatchNotificationReason.EventsDroppedMax) {\n                        action = STR_DROPPED;\n                    } else if (reason >= EventBatchNotificationReason.SendingUndefined && reason <= EventBatchNotificationReason.SendingEventMax) {\n                        action = STR_SENDING;\n                    }\n                }\n\n                return action;\n            }\n        });\n    }\n\n    /**\n     * @constructor\n     * @param requestQueue   - The queue that contains the requests to be sent.\n     * @param postManager   - The post manager that we should add requests back to if needed.\n     */\n    public initialize(coreConfig: IExtendedConfiguration, core: IAppInsightsCore, postChannel: IPostChannel) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add header to request\n     * @param name   - Header name.\n     * @param value  - Header value.\n     */\n    public addHeader(name: string, value: string) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n         * Remove header to request\n         * @param name   - Header name.\n         * @param value  - Header value.\n         */\n    public removeHeader(name: string) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n    \n    /**\n    * Add handler to be executed with request response text.\n    */\n    public addResponseHandler(responseHandler: (responseText: string) => void) : IUnloadHook {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add the batch of events to the queue for sending\n     * @param batch - The batch with the events to send\n     * @returns True if the http manager has accepted the batch (including if the batch is empty) otherwise false\n     */\n    public addBatch(batch: EventBatch): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Check if there is an idle connection and we can send a request.\n     * @returns True if there is an idle connection, false otherwise.\n     */\n    public canSendRequest(): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Send requests in the request queue up if there is an idle connection, sending is\n     * not pause and clock skew manager allows sending request.\n     * @param sendType - Identifies how the batched events should be send, defaults to Batched\n     * @param sendReason   - The reason the batch is being sent\n     */\n    public sendQueuedRequests(sendType?: EventSendType, sendReason?: SendRequestReason) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Check if there are no active requests being sent.\n     * @returns True if idle, false otherwise.\n     */\n    public isCompletelyIdle(): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Inform the HttpManager that a page unload event was received\n     */\n    public setUnloading(value: boolean): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Queue all the remaining requests to be sent. The requests will be\n     * sent using HTML5 Beacons if they are available.\n     */\n    public teardown() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Pause the sending of requests. No new requests will be sent.\n     */\n    public pause() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resume the sending of requests.\n     */\n    public resume() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Sends the batches synchronously to the collector. This api is used to send a batches immediate event.\n     *\n     * @param batch - The batch of events to be sent.\n     * @param sendReason   - The reason the batch is being sent\n     * @param sendType - Identifies the sending type to use when sending the batch\n     */\n    public sendSynchronousBatch(batch: EventBatch, sendType?: EventSendType, sendReason?: SendRequestReason) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    \n    /**\n     * Get Offline Serializer support\n     * @returns internal Offline Serializer object\n     */\n    public serializeOfflineEvt(evt: ITelemetryItem | IPostTransmissionTelemetryItem): string {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get Offline request details\n     * @returnsrequest details\n     */\n    public getOfflineRequestDetails(): IRequestUrlDetails {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Create payload data\n     * @param evts - telemetry events\n     * @returns payload\n     */\n    public createOneDSPayload(evts?: ITelemetryItem[], optimize?: boolean): IPayloadData {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/Index.ts",
    "content": "/**\n* @name Index.ts\n* @author Abhilash Panwar (abpanwar)\n* @copyright Microsoft 2018\n* File to export public classes.\n*/\n\nimport { IPayloadData, IXHROverride, OnCompleteCallback, SendPOSTFunction } from \"@microsoft/applicationinsights-core-js\";\nimport {\n    BE_PROFILE, IChannelConfiguration, IPostChannel, IRequestSizeLimit, NRT_PROFILE, PayloadListenerFunction, PayloadPreprocessorFunction,\n    RT_PROFILE\n} from \"./DataModels\";\nimport { PostChannel } from \"./PostChannel\";\n\nexport {\n    PostChannel, IChannelConfiguration, IRequestSizeLimit,\n    BE_PROFILE, NRT_PROFILE, RT_PROFILE, IXHROverride, IPostChannel,\n    SendPOSTFunction, IPayloadData, PayloadPreprocessorFunction, PayloadListenerFunction, OnCompleteCallback\n};\n"
  },
  {
    "path": "channels/1ds-post-js/src/InternalConstants.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// Note: DON'T Export these const from the package as we are still targeting ES3 this will export a mutable variables that someone could change!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n// Generally you should only put values that are used more than 2 times and then only if not already exposed as a constant (such as SdkCoreNames)\n// as when using \"short\" named values from here they will be will be minified smaller than the SdkCoreNames[eSdkCoreNames.xxxx] value.\n\nexport const STR_EMPTY = \"\";\nexport const STR_POST_METHOD = \"POST\";\nexport const STR_DISABLED_PROPERTY_NAME: string = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n\nexport const STR_DROPPED = \"drop\";\nexport const STR_SENDING = \"send\";\nexport const STR_REQUEUE = \"requeue\";\nexport const STR_RESPONSE_FAIL = \"rspFail\";\nexport const STR_OTHER = \"oth\";\n\nexport const DEFAULT_CACHE_CONTROL = \"no-cache, no-store\";\nexport const DEFAULT_CONTENT_TYPE = \"application/x-json-stream\";\nexport const STR_CACHE_CONTROL = \"cache-control\";\nexport const STR_CONTENT_TYPE_HEADER = \"content-type\";\nexport const STR_KILL_TOKENS_HEADER = \"kill-tokens\";\nexport const STR_KILL_DURATION_HEADER = \"kill-duration\";\nexport const STR_KILL_DURATION_SECONDS_HEADER = \"kill-duration-seconds\";\nexport const STR_TIME_DELTA_HEADER = \"time-delta-millis\";\nexport const STR_CLIENT_VERSION = \"client-version\";\nexport const STR_CLIENT_ID = \"client-id\";\nexport const STR_TIME_DELTA_TO_APPLY = \"time-delta-to-apply-millis\";\nexport const STR_UPLOAD_TIME = \"upload-time\";\nexport const STR_API_KEY = \"apikey\";\nexport const STR_MSA_DEVICE_TICKET = \"AuthMsaDeviceTicket\";\nexport const STR_AUTH_WEB_TOKEN = \"WebAuthToken\";\nexport const STR_AUTH_XTOKEN = \"AuthXToken\";\nexport const STR_SDK_VERSION = \"sdk-version\";\nexport const STR_NO_RESPONSE_BODY = \"NoResponseBody\";\n\nexport const STR_MSFPC = \"msfpc\";\n\nexport const STR_TRACE = \"trace\";\nexport const STR_USER = \"user\";\n"
  },
  {
    "path": "channels/1ds-post-js/src/KillSwitch.ts",
    "content": "/**\n* KillSwitch.ts\n* @author Abhilash Panwar (abpanwar)\n* @copyright Microsoft 2018\n*/\n\nimport { arrForEach, dateNow, strTrim } from \"@microsoft/applicationinsights-core-js\";\n\nconst SecToMsMultiplier = 1000;\n\n/**\n * Internal interface to stop certain tenants sending events.\n * @internal\n */\nexport interface IKillSwitch {\n    /**\n     * Set the tenants that are to be killed along with the duration. If the duration is\n     * a special value identifying that the tokens are too be killed for only this request, then\n     * a array of tokens is returned.\n     * @param killTokens - Tokens that are too be marked to be killed.\n     * @param killDuration - The duration for which the tokens are to be killed.\n     * @returns The tokens that are killed only for this given request.\n     */\n    setKillSwitchTenants(killTokens: string, killDuration: string): string[];\n\n    /**\n     * Determing if the given tenant token has been killed for the moment.\n     * @param tenantToken - The token to be checked.\n     * @returns True if token has been killed, false otherwise.\n     */\n    isTenantKilled(tenantToken: string): boolean;\n}\n\nfunction _normalizeTenants(values: string[]) {\n    let result: string[] = [];\n    if (values) {\n        arrForEach(values, (value) => {\n            result.push(strTrim(value));\n        });\n    }\n\n    return result;\n}\n\n/**\n * Factory function to create a KillSwitch instance.\n * @returns A new IKillSwitch instance.\n * @internal\n */\nexport function createKillSwitch(): IKillSwitch {\n    let _killedTokenDictionary: { [token: string]: number } = {};\n\n    return {\n        setKillSwitchTenants: (killTokens: string, killDuration: string): string[] => {\n            if (killTokens && killDuration) {\n                try {\n                    let killedTokens: string[] = _normalizeTenants(killTokens.split(\",\"));\n                    if (killDuration === \"this-request-only\") {\n                        return killedTokens;\n                    }\n                    const durationMs = parseInt(killDuration, 10) * SecToMsMultiplier;\n                    for (let i = 0; i < killedTokens.length; ++i) {\n                        _killedTokenDictionary[killedTokens[i]] = dateNow() + durationMs;\n                    }\n                } catch (ex) {\n                    return [];\n                }\n            }\n            return [];\n        },\n\n        isTenantKilled: (tenantToken: string): boolean => {\n            let killDictionary = _killedTokenDictionary;\n            let name = strTrim(tenantToken);\n            if (killDictionary[name] !== undefined && killDictionary[name] > dateNow()) {\n                return true;\n            }\n            delete killDictionary[name];\n            return false;\n        }\n    };\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/PostChannel.ts",
    "content": "/**\n* PostManager.ts\n* @author Abhilash Panwar (abpanwar); Hector Hernandez (hectorh); Nev Wylie (newylie)\n* @copyright Microsoft 2018-2020\n*/\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, EventLatencyValue, EventSendType, EventsDiscardedReason, IAppInsightsCore, IChannelControls, IConfigDefaults,\n    IExtendedConfiguration, IInternalOfflineSupport, IPlugin, IProcessTelemetryContext, IProcessTelemetryUnloadContext, ITelemetryItem,\n    ITelemetryUnloadState, IUnloadHook, NotificationManager, SendRequestReason, _eInternalMessageId, _throwInternal,\n    addPageHideEventListener, addPageShowEventListener, addPageUnloadEventListener, arrForEach, createProcessTelemetryContext,\n    createUniqueNamespace, doPerf, eLoggingSeverity, getWindow, isChromium, isGreaterThanZero, isNumber, mergeEvtNamespace, objForEachKey,\n    onConfigChange, optimizeObject, proxyFunctions, removePageHideEventListener, removePageShowEventListener, removePageUnloadEventListener,\n    setProcessTelemetryTimings\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, createPromise } from \"@nevware21/ts-async\";\nimport { ITimerHandler, isPromiseLike, mathCeil, mathMax, mathMin, objDeepFreeze } from \"@nevware21/ts-utils\";\nimport {\n    BE_PROFILE, EventBatchNotificationReason, IChannelConfiguration, IPostChannel, IPostTransmissionTelemetryItem, IRequestSizeLimit,\n    NRT_PROFILE, RT_PROFILE\n} from \"./DataModels\";\nimport { EventBatch } from \"./EventBatch\";\nimport { HttpManager } from \"./HttpManager\";\nimport { STR_AUTH_WEB_TOKEN, STR_MSA_DEVICE_TICKET, STR_TRACE, STR_USER } from \"./InternalConstants\";\nimport { retryPolicyGetMillisToBackoffForRetry } from \"./RetryPolicy\";\nimport { ITimeoutOverrideWrapper, createTimeoutWrapper } from \"./TimeoutOverrideWrapper\";\n\nconst FlushCheckTimer = 0.250;          // This needs to be in seconds, so this is 250ms\nconst MaxNumberEventPerBatch = 500;\nconst EventsDroppedAtOneTime = 20;\nconst MaxSendAttempts = 6;\nconst MaxSyncUnloadSendAttempts = 2;        // Assuming 2 based on beforeunload and unload\nconst MaxBackoffCount = 4;\nconst MaxConnections = 2;\nconst MaxRequestRetriesBeforeBackoff = 1;\nconst MaxEventsLimitInMem = 10000;\n\nconst strEventsDiscarded = \"eventsDiscarded\";\nconst EMPTY_STR = \"\";\n\nlet undefValue = undefined;\n\ninterface IPostChannelBatchQueue {\n    /**\n     * This is the actual queue of event batches\n     */\n    batches: EventBatch[];\n\n    /**\n     * This is just a lookup map using the iKey to link to the batch in the batches queue\n     */\n    iKeyMap: { [iKey: string]: EventBatch };\n}\n\n/**\n * The default settings for the config.\n * WE MUST include all defaults here to ensure that the config is created with all of the properties\n * defined as dynamic.\n */\nconst defaultPostChannelConfig: IConfigDefaults<IChannelConfiguration> = objDeepFreeze({\n    eventsLimitInMem: { isVal: isGreaterThanZero, v: MaxEventsLimitInMem },\n    immediateEventLimit: { isVal: isGreaterThanZero, v: 500 },\n    autoFlushEventsLimit: { isVal: isGreaterThanZero, v: 0 },\n    disableAutoBatchFlushLimit: false,\n    httpXHROverride: { isVal: isOverrideFn, v: undefValue },\n    overrideInstrumentationKey: undefValue,\n    overrideEndpointUrl: undefValue,\n    disableTelemetry: false,\n    ignoreMc1Ms0CookieProcessing: false,\n    setTimeoutOverride: undefValue,\n    clearTimeoutOverride: undefValue,\n    payloadPreprocessor: undefValue,\n    payloadListener: undefValue,\n    disableEventTimings: undefValue,\n    valueSanitizer: undefValue,\n    stringifyObjects: undefValue,\n    enableCompoundKey: undefValue,\n    disableOptimizeObj: false,\n    fetchCredentials: undefValue,\n    // disableCacheHeader: undefValue, // See Task #7178858 - Collector requires a change to support this\n    transports: undefValue,\n    unloadTransports: undefValue,\n    useSendBeacon: undefValue,\n    disableFetchKeepAlive: undefValue,\n    avoidOptions: false,\n    xhrTimeout: undefValue,\n    disableXhrSync: undefValue,\n    alwaysUseXhrOverride: false,\n    maxEventRetryAttempts: { isVal: isNumber, v: MaxSendAttempts },\n    maxUnloadEventRetryAttempts: { isVal: isNumber, v: MaxSyncUnloadSendAttempts},\n    addNoResponse: undefValue,\n    maxEvtPerBatch: {isVal: isNumber, v: MaxNumberEventPerBatch},\n    excludeCsMetaData: undefValue,\n    requestLimit: {} as IRequestSizeLimit\n});\n\nfunction isOverrideFn(httpXHROverride: any) {\n    return httpXHROverride && httpXHROverride.sendPOST;\n}\n\n/**\n * Class that manages adding events to inbound queues and batching of events\n * into requests.\n * @group Classes\n * @group Entrypoint\n */\nexport class PostChannel extends BaseTelemetryPlugin implements IChannelControls, IPostChannel {\n\n    public identifier = \"PostChannel\";\n    public priority = 1011;\n    public version = \"#version#\";\n\n    constructor() {\n        super();\n\n        let _postConfig: IChannelConfiguration;\n        let _isTeardownCalled = false;\n        let _flushCallbackQueue: Array<() => void> = [];\n        let _flushCallbackTimer: ITimerHandler;\n        let _paused = false;\n        let _immediateQueueSize = 0;\n        let _immediateQueueSizeLimit: number;\n        let _queueSize = 0;\n        let _queueSizeLimit: number;\n        let _profiles: { [profileName: string]: number[] } = {};\n        let _currentProfile = RT_PROFILE;\n        let _scheduledTimer: ITimerHandler;\n        let _immediateTimer: ITimerHandler;\n        let _currentBackoffCount;\n        let _timerCount;\n        let _httpManager: HttpManager;\n        let _batchQueues: { [eventLatency: number]: IPostChannelBatchQueue };\n        let _autoFlushEventsLimit: number | undefined;\n        // either MaxBatchSize * (1+ Max Connections) or _queueLimit / 6 (where 3 latency Queues [normal, realtime, cost deferred] * 2 [allow half full -- allow for retry])\n        let _autoFlushBatchLimit: number;\n        let _delayedBatchSendLatency: number;\n        let _delayedBatchReason: SendRequestReason;\n        let _optimizeObject: boolean;\n        let _isPageUnloadTriggered: boolean;\n        let _maxEventSendAttempts: number;\n        let _maxUnloadEventSendAttempts: number;\n        let _evtNamespace: string | string[];\n        let _timeoutWrapper: ITimeoutOverrideWrapper;\n        let _ignoreMc1Ms0CookieProcessing: boolean;\n        let _disableAutoBatchFlushLimit: boolean;\n        let _notificationManager: NotificationManager | undefined;\n        let _unloadHandlersAdded: boolean;\n        let _overrideInstrumentationKey: string;\n        let _disableTelemetry: boolean;\n        let _maxEvtPerBatch: number;\n\n        dynamicProto(PostChannel, this, (_self, _base) => {\n            _initDefaults();\n\n            // Special internal method to allow the DebugPlugin to hook embedded objects\n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [_httpManager, _postConfig];\n            };\n\n            _self.initialize = (theConfig: IExtendedConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) => {\n                doPerf(core, () => \"PostChannel:initialize\", () => {\n                    _base.initialize(theConfig, core, extensions);\n                    _notificationManager = core.getNotifyMgr();\n\n                    try {\n                        _evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());\n    \n                        _self._addHook(onConfigChange(theConfig, (details) => {\n                            let coreConfig = details.cfg;\n\n                            let ctx = createProcessTelemetryContext(null, coreConfig, core);\n                            _postConfig = ctx.getExtCfg<IChannelConfiguration>(_self.identifier, defaultPostChannelConfig);\n                            _timeoutWrapper = createTimeoutWrapper(_postConfig.setTimeoutOverride, _postConfig.clearTimeoutOverride);\n        \n                            // Only try and use the optimizeObject() if this appears to be a chromium based browser and it has not been explicitly disabled\n                            _optimizeObject = !_postConfig.disableOptimizeObj && isChromium();\n                            _ignoreMc1Ms0CookieProcessing = _postConfig.ignoreMc1Ms0CookieProcessing;\n                            _hookWParam(core); // _hookWParam uses _ignoreMc1Ms0CookieProcessing\n\n                            _queueSizeLimit = _postConfig.eventsLimitInMem;\n                            _immediateQueueSizeLimit = _postConfig.immediateEventLimit;\n                            _autoFlushEventsLimit = _postConfig.autoFlushEventsLimit;\n                            _maxEventSendAttempts = _postConfig.maxEventRetryAttempts;\n                            _maxUnloadEventSendAttempts = _postConfig.maxUnloadEventRetryAttempts;\n                            _disableAutoBatchFlushLimit = _postConfig.disableAutoBatchFlushLimit;\n                            _maxEvtPerBatch = _postConfig.maxEvtPerBatch;\n\n                            if (isPromiseLike(coreConfig.endpointUrl)) {\n                                _self.pause();\n                            } else if (!!_paused) {\n                                // if previous url is promise, resume\n                                _self.resume();\n                            }\n\n                            _setAutoLimits();\n \n                            // Override iKey if provided in Post config if provided for during initialization\n                            _overrideInstrumentationKey = _postConfig.overrideInstrumentationKey;\n\n                            // DisableTelemetry was defined in the config provided during initialization\n                            _disableTelemetry = !!_postConfig.disableTelemetry;\n                     \n                            if (_unloadHandlersAdded) {\n                                _removeUnloadHandlers();\n                            }\n\n                            let excludePageUnloadEvents = coreConfig.disablePageUnloadEvents || [];\n    \n                            // When running in Web browsers try to send all telemetry if page is unloaded\n                            _unloadHandlersAdded = addPageUnloadEventListener(_handleUnloadEvents, excludePageUnloadEvents, _evtNamespace);\n                            _unloadHandlersAdded = addPageHideEventListener(_handleUnloadEvents, excludePageUnloadEvents, _evtNamespace) || _unloadHandlersAdded;\n                            _unloadHandlersAdded = addPageShowEventListener(_handleShowEvents, coreConfig.disablePageShowEvents, _evtNamespace) || _unloadHandlersAdded;\n                        }));\n\n                        // only initialize the manager once\n                        _httpManager.initialize(theConfig, _self.core, _self);\n                    } catch (e) {\n                        // resetting the initialized state because of failure\n                        _self.setInitialized(false);\n                        throw e;\n                    }\n                }, () => ({ theConfig, core, extensions }));\n            };\n\n            _self.processTelemetry = (ev: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void => {\n                setProcessTelemetryTimings(ev, _self.identifier);\n                itemCtx = itemCtx || _self._getTelCtx(itemCtx);\n\n                var event = ev as IPostTransmissionTelemetryItem;\n                if (!_disableTelemetry && !_isTeardownCalled) {\n                    // Override iKey if provided in Post config if provided for during initialization\n                    if (_overrideInstrumentationKey) {\n                        event.iKey = _overrideInstrumentationKey;\n                    }\n\n                    _addEventToQueues(event, true);\n\n                    if (_isPageUnloadTriggered) {\n                        // Unload event has been received so we need to try and flush new events\n                        _releaseAllQueues(EventSendType.SendBeacon, SendRequestReason.Unload);\n                    } else {\n                        _scheduleTimer();\n                    }\n                }\n\n                _self.processNext(event, itemCtx);\n            };\n\n            _self.getOfflineSupport = () => {\n                try {\n                    let details = _httpManager && _httpManager.getOfflineRequestDetails();\n                    if (_httpManager) {\n                        return {\n                            getUrl: () => {\n                                if (details) {\n                                    return details.url\n\n                                }\n                                return null;\n                            },\n                            serialize: _serialize,\n                            batch: _batch,\n                            shouldProcess: (evt) => {\n                                return !_disableTelemetry;\n                            },\n                            createPayload: (evt) => {\n                                return null;\n                            },\n                            createOneDSPayload: (evts: ITelemetryItem[]) => {\n                                if (_httpManager.createOneDSPayload) {\n                                    return _httpManager.createOneDSPayload(evts, _optimizeObject);\n                                }\n                                \n                            }\n                        } as IInternalOfflineSupport;\n\n                    }\n                    \n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return null;\n               \n            };\n\n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _releaseAllQueues(EventSendType.SendBeacon, SendRequestReason.Unload);\n                _isTeardownCalled = true;\n                _httpManager.teardown();\n\n                _removeUnloadHandlers();\n\n                // Just register to remove all events associated with this namespace\n                _initDefaults();\n            };\n\n            function _removeUnloadHandlers() {\n                removePageUnloadEventListener(null, _evtNamespace);\n                removePageHideEventListener(null, _evtNamespace);\n                removePageShowEventListener(null, _evtNamespace);\n            }\n                        \n            function _hookWParam(core: IAppInsightsCore) {\n                var existingGetWParamMethod = core.getWParam;\n                core.getWParam = () => {\n                    var wparam = 0;\n                    if (_ignoreMc1Ms0CookieProcessing) {\n                        wparam = wparam | 2;\n                    }\n                    return wparam | existingGetWParamMethod.call(core);\n                };\n            }\n\n            function _batch(arr: string[]) {\n                let rlt = EMPTY_STR;\n                \n                if (arr && arr.length) {\n                    arrForEach(arr, (item) => {\n                        if (rlt) {\n                            rlt += \"\\n\";\n                        }\n                        rlt += item;\n\n                    });\n                }\n                return rlt;\n\n            }\n\n            function _serialize(event: ITelemetryItem) {\n\n                let rlt = EMPTY_STR;\n                try {\n                    _cleanEvent(event);\n                    rlt = _httpManager.serializeOfflineEvt(event);\n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return rlt;\n               \n            }\n\n            // Moving event handlers out from the initialize closure so that any local variables can be garbage collected\n            function _handleUnloadEvents(evt: any) {\n                let theEvt = evt || getWindow().event; // IE 8 does not pass the event\n                if (theEvt.type !== \"beforeunload\") {\n                    // Only set the unload trigger if not beforeunload event as beforeunload can be cancelled while the other events can't\n                    _isPageUnloadTriggered = true;\n                    _httpManager.setUnloading(_isPageUnloadTriggered);\n                }\n\n                _releaseAllQueues(EventSendType.SendBeacon, SendRequestReason.Unload);\n            }\n\n            function _handleShowEvents(evt: any) {\n                // Handle the page becoming visible again\n                _isPageUnloadTriggered = false;\n                _httpManager.setUnloading(_isPageUnloadTriggered);\n            }\n\n            function _cleanEvent(event: ITelemetryItem | IPostTransmissionTelemetryItem) {\n                if (event.ext && event.ext[STR_TRACE]) {\n                    delete (event.ext[STR_TRACE]);\n                }\n                if (event.ext && event.ext[STR_USER] && event.ext[STR_USER][\"id\"]) {\n                    delete (event.ext[STR_USER][\"id\"]);\n                }\n\n                // v8 performance optimization for iterating over the keys\n                if (_optimizeObject) {\n                    event.ext = optimizeObject(event.ext);\n                    if (event.baseData) {\n                        event.baseData = optimizeObject(event.baseData);\n                    }\n                    if (event.data) {\n                        event.data = optimizeObject(event.data);\n                    }\n                }\n\n            }\n\n            function _addEventToQueues(event: IPostTransmissionTelemetryItem, append: boolean) {\n                // If send attempt field is undefined we should set it to 0.\n                if (!event.sendAttempt) {\n                    event.sendAttempt = 0;\n                }\n                // Add default latency\n                if (!event.latency) {\n                    event.latency = EventLatencyValue.Normal;\n                }\n                _cleanEvent(event);\n\n\n                if (event.sync) {\n                    // If the transmission is backed off then do not send synchronous events.\n                    // We will convert these events to Real time latency instead.\n                    if (_currentBackoffCount || _paused) {\n                        event.latency = EventLatencyValue.RealTime;\n                        event.sync = false;\n                    } else {\n                        // Log the event synchronously\n                        if (_httpManager) {\n                            // v8 performance optimization for iterating over the keys\n                            if (_optimizeObject) {\n                                event = optimizeObject(event);\n                            }\n\n                            _httpManager.sendSynchronousBatch(\n                                EventBatch.create(event.iKey, [event]),\n                                event.sync === true ? EventSendType.Synchronous : event.sync as EventSendType,\n                                SendRequestReason.SyncEvent);\n                            return;\n                        }\n                    }\n                }\n\n                let evtLatency = event.latency;\n                let queueSize = _queueSize;\n                let queueLimit = _queueSizeLimit;\n                if (evtLatency === EventLatencyValue.Immediate) {\n                    queueSize = _immediateQueueSize;\n                    queueLimit = _immediateQueueSizeLimit;\n                }\n\n                let eventDropped = false;\n                // Only add the event if the queue isn't full or it's a direct event (which don't add to the queue sizes)\n                if (queueSize < queueLimit) {\n                    eventDropped = !_addEventToProperQueue(event, append);\n                } else {\n                    let dropLatency = EventLatencyValue.Normal;\n                    let dropNumber = EventsDroppedAtOneTime;\n                    if (evtLatency === EventLatencyValue.Immediate) {\n                        // Only drop other immediate events as they are not technically sharing the general queue\n                        dropLatency = EventLatencyValue.Immediate;\n                        dropNumber = 1;\n                    }\n\n                    // Drop old event from lower or equal latency\n                    eventDropped = true;\n                    if (_dropEventWithLatencyOrLess(event.iKey, event.latency, dropLatency, dropNumber)) {\n                        eventDropped = !_addEventToProperQueue(event, append);\n                    }\n                }\n\n                if (eventDropped) {\n                    // Can't drop events from current queues because the all the slots are taken by queues that are being flushed.\n                    _notifyEvents(strEventsDiscarded, [event], EventsDiscardedReason.QueueFull);\n                }\n            }\n\n            _self.setEventQueueLimits = (eventLimit: number, autoFlushLimit?: number) => {\n                _postConfig.eventsLimitInMem = _queueSizeLimit = isGreaterThanZero(eventLimit) ? eventLimit : MaxEventsLimitInMem;\n                _postConfig.autoFlushEventsLimit = _autoFlushEventsLimit = isGreaterThanZero(autoFlushLimit) ? autoFlushLimit : 0;\n\n                _setAutoLimits();\n\n                // We only do this check here as during normal event addition if the queue is > then events start getting dropped\n                let doFlush = _queueSize > eventLimit;\n\n                if (!doFlush && _autoFlushBatchLimit > 0) {\n                    // Check the auto flush max batch size\n                    for (let latency = EventLatencyValue.Normal; !doFlush && latency <= EventLatencyValue.RealTime; latency++) {\n                        let batchQueue: IPostChannelBatchQueue = _batchQueues[latency];\n                        if (batchQueue && batchQueue.batches) {\n                            arrForEach(batchQueue.batches, (theBatch) => {\n                                if (theBatch && theBatch.count() >= _autoFlushBatchLimit) {\n                                    // If any 1 batch is > than the limit then trigger an auto flush\n                                    doFlush = true;\n                                }\n                            });\n                        }\n                    }\n                }\n\n                _performAutoFlush(true, doFlush);\n            };\n\n            _self.pause = () => {\n                _clearScheduledTimer();\n                _paused = true;\n                _httpManager && _httpManager.pause();\n            };\n\n            _self.resume = () => {\n                _paused = false;\n                _httpManager && _httpManager.resume();\n                _scheduleTimer();\n            };\n\n            _self._loadTransmitProfiles = (profiles: { [profileName: string]: number[] }) => {\n                _resetTransmitProfiles();\n                objForEachKey(profiles, (profileName, profileValue) => {\n                    let profLen = profileValue.length;\n                    if (profLen >= 2) {\n                        let directValue = (profLen > 2 ? profileValue[2] : 0);\n                        profileValue.splice(0, profLen - 2);\n                        // Make sure if a higher latency is set to not send then don't send lower latency\n                        if (profileValue[1] < 0) {\n                            profileValue[0] = -1;\n                        }\n\n                        // Make sure each latency is multiple of the latency higher then it. If not a multiple\n                        // we round up so that it becomes a multiple.\n                        if (profileValue[1] > 0 && profileValue[0] > 0) {\n                            let timerMultiplier = profileValue[0] / profileValue[1];\n                            profileValue[0] = mathCeil(timerMultiplier) * profileValue[1];\n                        }\n\n                        // Add back the direct profile timeout\n                        if (directValue >= 0 && profileValue[1] >= 0 && directValue > profileValue[1]) {\n                            // Make sure if it's not disabled (< 0) then make sure it's not larger than RealTime\n                            directValue = profileValue[1];\n                        }\n                        profileValue.push(directValue);\n                        _profiles[profileName] = profileValue;\n                    }\n                });\n            };\n\n            \n            _self.flush = (isAsync: boolean = true, callback?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean> => {\n                let result: IPromise<boolean>;\n\n                if (!_paused) {\n\n                    sendReason = sendReason || SendRequestReason.ManualFlush;\n\n                    if (isAsync) {\n\n                        if (!callback) {\n                            result = createPromise<boolean>((resolve) => {\n                                // Set the callback to the promise resolve callback\n                                callback = resolve;\n                            });\n                        }\n\n                        if (_flushCallbackTimer == null) {\n                            // Clear the normal schedule timer as we are going to try and flush ASAP\n                            _clearScheduledTimer();\n\n                            // Move all queued events to the HttpManager so that we don't discard new events (Auto flush scenario)\n                            _queueBatches(EventLatencyValue.Normal, EventSendType.Batched, sendReason);\n                            \n                            _flushCallbackTimer = _createTimer(() => {\n                                _flushCallbackTimer = null;\n                                _flushImpl(callback, sendReason);\n                            }, 0);\n                        } else {\n                            // Even if null (no callback) this will ensure after the flushImpl finishes waiting\n                            // for a completely idle connection it will attempt to re-flush any queued events on the next cycle\n                            _flushCallbackQueue.push(callback);\n                        }\n                    } else {\n                        // Clear the normal schedule timer as we are going to try and flush ASAP\n                        let cleared = _clearScheduledTimer();\n\n                        // Now cause all queued events to be sent synchronously\n                        _sendEventsForLatencyAndAbove(EventLatencyValue.Normal, EventSendType.Synchronous, sendReason);\n                        callback && callback();\n\n                        if (cleared) {\n                            // restart the normal event timer if it was cleared\n                            _scheduleTimer();\n                        }\n                    }\n                }\n\n                return result;\n            };\n\n            _self.setMsaAuthTicket = (ticket: string) => {\n                _httpManager.addHeader(STR_MSA_DEVICE_TICKET, ticket);\n            };\n\n            _self.setAuthPluginHeader = (token: string) => {\n                _httpManager.addHeader(STR_AUTH_WEB_TOKEN, token);\n            };\n\n            _self.removeAuthPluginHeader = () => {\n                _httpManager.removeHeader(STR_AUTH_WEB_TOKEN);\n            };\n\n            _self.hasEvents = _hasEvents;\n\n            _self._setTransmitProfile = (profileName: string) => {\n                if (_currentProfile !== profileName && _profiles[profileName] !== undefined) {\n                    _clearScheduledTimer();\n                    _currentProfile = profileName;\n                    _scheduleTimer();\n                }\n            };\n\n            proxyFunctions(_self, () => _httpManager, [ \"addResponseHandler\" ]);\n\n\n            /**\n             * Batch and send events currently in the queue for the given latency.\n             * @param latency - Latency for which to send events.\n             */\n            function _sendEventsForLatencyAndAbove(latency: number, sendType: EventSendType, sendReason: SendRequestReason): boolean {\n                let queued = _queueBatches(latency, sendType, sendReason);\n\n                // Always trigger the request as while the post channel may not have queued additional events, the httpManager may already have waiting events\n                _httpManager.sendQueuedRequests(sendType, sendReason);\n\n                return queued;\n            }\n\n            function _hasEvents(): boolean {\n                return _queueSize > 0;\n            }\n\n            /**\n             * Try to schedule the timer after which events will be sent. If there are\n             * no events to be sent, or there is already a timer scheduled, or the\n             * http manager doesn't have any idle connections this method is no-op.\n             */\n            function _scheduleTimer() {\n                // If we had previously attempted to send requests, but the http manager didn't have any idle connections then the requests where delayed\n                // so try and requeue then again now\n                if (_delayedBatchSendLatency >= 0 && _queueBatches(_delayedBatchSendLatency, EventSendType.Batched, _delayedBatchReason)) {\n                    _httpManager.sendQueuedRequests(EventSendType.Batched, _delayedBatchReason);\n                }\n\n                if (_immediateQueueSize > 0 && !_immediateTimer && !_paused) {\n                    // During initialization _profiles enforce that the direct [2] is less than real time [1] timer value\n                    // If the immediateTimeout is disabled the immediate events will be sent with Real Time events\n                    let immediateTimeOut = _profiles[_currentProfile][2];\n                    if (immediateTimeOut >= 0) {\n                        _immediateTimer = _createTimer(() => {\n                            _immediateTimer = null;\n                            // Only try to send direct events\n                            _sendEventsForLatencyAndAbove(EventLatencyValue.Immediate, EventSendType.Batched, SendRequestReason.NormalSchedule);\n                            _scheduleTimer();\n                        }, immediateTimeOut);\n                    }\n                }\n\n                // During initialization the _profiles enforce that the normal [0] is a multiple of the real time [1] timer value\n                let timeOut = _profiles[_currentProfile][1];\n                if (!_scheduledTimer && !_flushCallbackTimer && timeOut >= 0 && !_paused) {\n                    if (_hasEvents()) {\n                        _scheduledTimer = _createTimer(() => {\n                            _scheduledTimer = null;\n                            _sendEventsForLatencyAndAbove(_timerCount === 0 ? EventLatencyValue.RealTime : EventLatencyValue.Normal, EventSendType.Batched, SendRequestReason.NormalSchedule);\n\n                            // Increment the count for next cycle\n                            _timerCount++;\n                            _timerCount %= 2;\n\n                            _scheduleTimer();\n                        }, timeOut);\n                    } else {\n                        _timerCount = 0;\n                    }\n                }\n            }\n\n            _self._backOffTransmission = () => {\n                if (_currentBackoffCount < MaxBackoffCount) {\n                    _currentBackoffCount++;\n                    _clearScheduledTimer();\n                    _scheduleTimer();\n                }\n            };\n\n            _self._clearBackOff = () => {\n                if (_currentBackoffCount) {\n                    _currentBackoffCount = 0;\n                    _clearScheduledTimer();\n                    _scheduleTimer();\n                }\n            };\n\n            function _initDefaults() {\n                _postConfig = null;\n                _isTeardownCalled = false;\n                _flushCallbackQueue = [];\n                _flushCallbackTimer = null;\n                _paused = false;\n                _immediateQueueSize = 0;\n                _immediateQueueSizeLimit = 500;\n                _queueSize = 0;\n                _queueSizeLimit = MaxEventsLimitInMem;\n                _profiles = {};\n                _currentProfile = RT_PROFILE;\n                _scheduledTimer = null;\n                _immediateTimer = null;\n                _currentBackoffCount = 0;\n                _timerCount = 0;\n                _batchQueues = {};\n                _autoFlushEventsLimit = 0;\n                _unloadHandlersAdded = false;\n                \n                // either MaxBatchSize * (1+ Max Connections) or _queueLimit / 6 (where 3 latency Queues [normal, realtime, cost deferred] * 2 [allow half full -- allow for retry])\n                _autoFlushBatchLimit = 0;\n                _delayedBatchSendLatency = -1;\n                _delayedBatchReason = null;\n                _optimizeObject = true;\n                _isPageUnloadTriggered = false;\n                _maxEventSendAttempts = MaxSendAttempts;\n                _maxUnloadEventSendAttempts = MaxSyncUnloadSendAttempts;\n                _evtNamespace = null;\n                _overrideInstrumentationKey = null;\n                _maxEvtPerBatch = null;\n                _disableTelemetry = false;\n                _timeoutWrapper = createTimeoutWrapper();\n                // httpManager init should use the default value, because _maxEvtPerBatch is null currently\n                _httpManager = new HttpManager(MaxNumberEventPerBatch, MaxConnections, MaxRequestRetriesBeforeBackoff, {\n                    requeue: _requeueEvents,\n                    send: _sendingEvent,\n                    sent: _eventsSentEvent,\n                    drop: _eventsDropped,\n                    rspFail: _eventsResponseFail,\n                    oth: _otherEvent\n                });\n\n                _initializeProfiles();\n                _clearQueues();\n                _setAutoLimits();\n            }\n\n            function _createTimer(theTimerFunc: () => void, timeOut: number): ITimerHandler {\n                // If the transmission is backed off make the timer at least 1 sec to allow for back off.\n                if (timeOut === 0 && _currentBackoffCount) {\n                    timeOut = 1;\n                }\n\n                let timerMultiplier = 1000;\n                if (_currentBackoffCount) {\n                    timerMultiplier = retryPolicyGetMillisToBackoffForRetry(_currentBackoffCount - 1);\n                }\n\n                return _timeoutWrapper.set(theTimerFunc, timeOut * timerMultiplier);\n            }\n\n            function _clearScheduledTimer() {\n                if (_scheduledTimer !== null) {\n                    _scheduledTimer.cancel();\n                    _scheduledTimer = null;\n                    _timerCount = 0;\n                    return true;\n                }\n\n                return false;\n            }\n\n            // Try to send all queued events using beacons if available\n            function _releaseAllQueues(sendType: EventSendType, sendReason: SendRequestReason) {\n                _clearScheduledTimer();\n\n                // Cancel all flush callbacks\n                if (_flushCallbackTimer) {\n                    _flushCallbackTimer.cancel();\n                    _flushCallbackTimer = null;\n                }\n\n                if (!_paused) {\n                    // Queue all the remaining requests to be sent. The requests will be sent using HTML5 Beacons if they are available.\n                    _sendEventsForLatencyAndAbove(EventLatencyValue.Normal, sendType, sendReason);\n                }\n            }\n\n            /**\n             * Add empty queues for all latencies in the inbound queues map. This is called\n             * when Transmission Manager is being flushed. This ensures that new events added\n             * after flush are stored separately till we flush the current events.\n             */\n            function _clearQueues() {\n                _batchQueues[EventLatencyValue.Immediate] = {\n                    batches: [],\n                    iKeyMap: {}\n                };\n                _batchQueues[EventLatencyValue.RealTime] = {\n                    batches: [],\n                    iKeyMap: {}\n                };\n                _batchQueues[EventLatencyValue.CostDeferred] = {\n                    batches: [],\n                    iKeyMap: {}\n                };\n                _batchQueues[EventLatencyValue.Normal] = {\n                    batches: [],\n                    iKeyMap: {}\n                };\n            }\n\n            function _getEventBatch(iKey: string, latency: number, create: boolean) {\n                let batchQueue: IPostChannelBatchQueue = _batchQueues[latency];\n                if (!batchQueue) {\n                    latency = EventLatencyValue.Normal;\n                    batchQueue = _batchQueues[latency];\n                }\n\n                let eventBatch = batchQueue.iKeyMap[iKey];\n                if (!eventBatch && create) {\n                    eventBatch = EventBatch.create(iKey);\n                    batchQueue.batches.push(eventBatch);\n                    batchQueue.iKeyMap[iKey] = eventBatch;\n                }\n\n                return eventBatch;\n            }\n\n            function _performAutoFlush(isAsync: boolean, doFlush?: boolean) {\n                // Only perform the auto flush check if the httpManager has an idle connection and we are not in a backoff situation\n                if (_httpManager.canSendRequest() && !_currentBackoffCount) {\n                    if (_autoFlushEventsLimit > 0 && _queueSize > _autoFlushEventsLimit) {\n                        // Force flushing\n                        doFlush = true;\n                    }\n\n                    if (doFlush && _flushCallbackTimer == null) {\n                        // Auto flush the queue, adding a callback to avoid the creation of a promise\n                        _self.flush(isAsync, () => {}, SendRequestReason.MaxQueuedEvents);\n                    }\n                }\n            }\n\n            function _addEventToProperQueue(event: IPostTransmissionTelemetryItem, append: boolean): boolean {\n                // v8 performance optimization for iterating over the keys\n                if (_optimizeObject) {\n                    event = optimizeObject(event);\n                }\n\n                const latency = event.latency;\n                let eventBatch = _getEventBatch(event.iKey, latency, true);\n                if (eventBatch.addEvent(event)) {\n                    if (latency !== EventLatencyValue.Immediate) {\n                        _queueSize++;\n\n                        // Check for auto flushing based on total events in the queue, but not for requeued or retry events\n                        if (append && event.sendAttempt === 0) {\n                            // Force the flushing of the batch if the batch (specific iKey / latency combination) reaches it's auto flush limit\n                            _performAutoFlush(!event.sync, _autoFlushBatchLimit > 0 && eventBatch.count() >= _autoFlushBatchLimit);\n                        }\n                    } else {\n                        // Direct events don't need auto flushing as they are scheduled (by default) for immediate delivery\n                        _immediateQueueSize++;\n                    }\n\n                    return true;\n                }\n\n                return false;\n            }\n\n            function _dropEventWithLatencyOrLess(iKey: string, latency: number, currentLatency: number, dropNumber: number): boolean {\n                while (currentLatency <= latency) {\n                    let eventBatch = _getEventBatch(iKey, latency, true);\n                    if (eventBatch && eventBatch.count() > 0) {\n                        // Dropped oldest events from lowest possible latency\n                        let droppedEvents = eventBatch.split(0, dropNumber);\n                        let droppedCount = droppedEvents.count();\n                        if (droppedCount > 0) {\n                            if (currentLatency === EventLatencyValue.Immediate) {\n                                _immediateQueueSize -= droppedCount;\n                            } else {\n                                _queueSize -= droppedCount;\n                            }\n\n                            _notifyBatchEvents(strEventsDiscarded, [droppedEvents], EventsDiscardedReason.QueueFull, undefined);\n                            return true;\n                        }\n                    }\n\n                    currentLatency++;\n                }\n\n                // Unable to drop any events -- lets just make sure the queue counts are correct to avoid exhaustion\n                _resetQueueCounts();\n\n                return false;\n            }\n\n            /**\n             * Internal helper to reset the queue counts, used as a backstop to avoid future queue exhaustion errors\n             * that might occur because of counting issues.\n             */\n            function _resetQueueCounts() {\n                let immediateQueue = 0;\n                let normalQueue = 0;\n                for (let latency = EventLatencyValue.Normal; latency <= EventLatencyValue.Immediate; latency++) {\n                    let batchQueue: IPostChannelBatchQueue = _batchQueues[latency];\n                    if (batchQueue && batchQueue.batches) {\n                        arrForEach(batchQueue.batches, (theBatch) => {\n                            if (latency === EventLatencyValue.Immediate) {\n                                immediateQueue += theBatch.count();\n                            } else {\n                                normalQueue += theBatch.count();\n                            }\n                        });\n                    }\n                }\n\n                _queueSize = normalQueue;\n                _immediateQueueSize = immediateQueue;\n            }\n\n            function _queueBatches(latency: number, sendType: EventSendType, sendReason: SendRequestReason): boolean {\n                let eventsQueued = false;\n                let isAsync = sendType === EventSendType.Batched;\n\n                // Only queue batches (to the HttpManager) if this is a sync request or the httpManager has an idle connection\n                // Thus keeping the events within the PostChannel until the HttpManager has a connection available\n                // This is so we can drop \"old\" events if the queue is getting full because we can't successfully send events\n                if (!isAsync || _httpManager.canSendRequest()) {\n                    doPerf(_self.core, () => \"PostChannel._queueBatches\", () => {\n                        let droppedEvents = [];\n                        let latencyToProcess = EventLatencyValue.Immediate;\n                        while (latencyToProcess >= latency) {\n                            let batchQueue: IPostChannelBatchQueue = _batchQueues[latencyToProcess];\n                            if (batchQueue && batchQueue.batches && batchQueue.batches.length > 0) {\n                                arrForEach(batchQueue.batches, (theBatch) => {\n                                    // Add the batch to the http manager to send the requests\n                                    if (!_httpManager.addBatch(theBatch)) {\n                                        // The events from this iKey are being dropped (killed)\n                                        droppedEvents = droppedEvents.concat(theBatch.events());\n                                    } else {\n                                        eventsQueued = eventsQueued || (theBatch && theBatch.count() > 0);\n                                    }\n\n                                    if (latencyToProcess === EventLatencyValue.Immediate) {\n                                        _immediateQueueSize -= theBatch.count();\n                                    } else {\n                                        _queueSize -= theBatch.count();\n                                    }\n                                });\n\n                                // Remove all batches from this Queue\n                                batchQueue.batches = [];\n                                batchQueue.iKeyMap = {};\n                            }\n\n                            latencyToProcess--;\n                        }\n\n                        if (droppedEvents.length > 0) {\n                            _notifyEvents(strEventsDiscarded, droppedEvents, EventsDiscardedReason.KillSwitch);\n                        }\n\n                        if (eventsQueued && _delayedBatchSendLatency >= latency) {\n                            // We have queued events at the same level as the delayed values so clear the setting\n                            _delayedBatchSendLatency = -1;\n                            _delayedBatchReason = SendRequestReason.Undefined;\n                        }\n                    }, () => ({ latency, sendType, sendReason }), !isAsync);\n                } else {\n                    // remember the min latency so that we can re-trigger later\n                    _delayedBatchSendLatency = _delayedBatchSendLatency >= 0 ? mathMin(_delayedBatchSendLatency, latency) : latency;\n                    _delayedBatchReason = mathMax(_delayedBatchReason, sendReason);\n                }\n\n                return eventsQueued;\n            }\n\n            /**\n             * This is the callback method is called as part of the manual flushing process.\n             * @param callback - The callback method to call after the flush is complete\n             * @param sendReason - The reason why the flush is being called\n             */\n            function _flushImpl(callback: () => void, sendReason: SendRequestReason) {\n                // Add any additional queued events and cause all queued events to be sent asynchronously\n                _sendEventsForLatencyAndAbove(EventLatencyValue.Normal, EventSendType.Batched, sendReason);\n\n                // All events (should) have been queue -- lets just make sure the queue counts are correct to avoid queue exhaustion (previous bug #9685112)\n                _resetQueueCounts();\n\n                _waitForIdleManager(() => {\n                    // Only called AFTER the httpManager does not have any outstanding requests\n                    if (callback) {\n                        callback();\n                    }\n\n                    if (_flushCallbackQueue.length > 0) {\n                        _flushCallbackTimer = _createTimer(() => {\n                            _flushCallbackTimer = null;\n                            _flushImpl(_flushCallbackQueue.shift(), sendReason);\n                        }, 0);\n                    } else {\n                        // No more flush requests\n                        _flushCallbackTimer = null;\n\n                        // Restart the normal timer schedule\n                        _scheduleTimer();\n                    }\n                });\n            }\n\n            function _waitForIdleManager(callback: () => void) {\n                if (_httpManager.isCompletelyIdle()) {\n                    callback();\n                } else {\n                    _flushCallbackTimer = _createTimer(() => {\n                        _flushCallbackTimer = null;\n                        _waitForIdleManager(callback);\n                    }, FlushCheckTimer);\n                }\n            }\n\n            /**\n             * Resets the transmit profiles to the default profiles of Real Time, Near Real Time\n             * and Best Effort. This removes all the custom profiles that were loaded.\n             */\n            function _resetTransmitProfiles() {\n                _clearScheduledTimer();\n                _initializeProfiles();\n                _currentProfile = RT_PROFILE;\n                _scheduleTimer();\n            }\n\n            function _initializeProfiles() {\n                _profiles = {};\n                _profiles[RT_PROFILE] = [2, 1, 0];\n                _profiles[NRT_PROFILE] = [6, 3, 0];\n                _profiles[BE_PROFILE] = [18, 9, 0];\n            }\n\n            /**\n             * The notification handler for requeue events\n             * @ignore\n             */\n            function _requeueEvents(batches: EventBatch[], reason?: number) {\n                let droppedEvents: IPostTransmissionTelemetryItem[] = [];\n                let maxSendAttempts = _maxEventSendAttempts;\n                if (_isPageUnloadTriggered) {\n                    // If a page unlaod has been triggered reduce the number of times we try to \"retry\"\n                    maxSendAttempts = _maxUnloadEventSendAttempts;\n                }\n\n                arrForEach(batches, (theBatch) => {\n                    if (theBatch && theBatch.count() > 0) {\n\n                        arrForEach(theBatch.events(), (theEvent: IPostTransmissionTelemetryItem) => {\n                            if (theEvent) {\n                                // Check if the request being added back is for a sync event in which case mark it no longer a sync event\n                                if (theEvent.sync) {\n                                    theEvent.latency = EventLatencyValue.Immediate;\n                                    theEvent.sync = false;\n                                }\n\n                                if (theEvent.sendAttempt < maxSendAttempts) {\n                                    // Reset the event timings\n                                    setProcessTelemetryTimings(theEvent, _self.identifier);\n                                    _addEventToQueues(theEvent, false);\n                                } else {\n                                    droppedEvents.push(theEvent);\n                                }\n                            }\n                        });\n                    }\n                });\n\n                if (droppedEvents.length > 0) {\n                    _notifyEvents(strEventsDiscarded, droppedEvents, EventsDiscardedReason.NonRetryableStatus);\n                }\n\n                if (_isPageUnloadTriggered) {\n                    // Unload event has been received so we need to try and flush new events\n                    _releaseAllQueues(EventSendType.SendBeacon, SendRequestReason.Unload);\n                }\n            }\n\n            function _callNotification(evtName: string, theArgs: any[]) {\n                let manager = (_notificationManager || ({} as NotificationManager));\n                let notifyFunc = manager[evtName];\n                if (notifyFunc) {\n                    try {\n                        notifyFunc.apply(manager, theArgs);\n                    } catch (e) {\n                        _throwInternal(_self.diagLog(),\n                            eLoggingSeverity.CRITICAL,\n                            _eInternalMessageId.NotificationException,\n                            evtName + \" notification failed: \" + e);\n                    }\n                }\n            }\n\n            function _notifyEvents(evtName: string, theEvents: IPostTransmissionTelemetryItem[], ...extraArgs) {\n                if (theEvents && theEvents.length > 0) {\n                    _callNotification(evtName, [theEvents].concat(extraArgs));\n                }\n            }\n\n            function _notifyBatchEvents(evtName: string, batches: EventBatch[], ...extraArgs) {\n                if (batches && batches.length > 0) {\n                    arrForEach(batches, (theBatch) => {\n                        if (theBatch && theBatch.count() > 0) {\n                            _callNotification(evtName, [theBatch.events()].concat(extraArgs));\n                        }\n                    });\n                }\n            }\n\n            /**\n             * The notification handler for when batches are about to be sent\n             * @ignore\n             */\n            function _sendingEvent(batches: EventBatch[], reason?: number, isSyncRequest?: boolean) {\n                if (batches && batches.length > 0) {\n                    _callNotification(\n                        \"eventsSendRequest\",\n                        [(reason >= EventBatchNotificationReason.SendingUndefined && reason <= EventBatchNotificationReason.SendingEventMax ?\n                            reason - EventBatchNotificationReason.SendingUndefined :\n                            SendRequestReason.Undefined), isSyncRequest !== true]);\n                }\n            }\n\n            /**\n             * This event represents that a batch of events have been successfully sent and a response received\n             * @param batches - The notification handler for when the batches have been successfully sent\n             * @param reason - For this event the reason will always be EventBatchNotificationReason.Complete\n             */\n            function _eventsSentEvent(batches: EventBatch[], reason?: number) {\n                _notifyBatchEvents(\"eventsSent\", batches, reason);\n\n                // Try and schedule the processing timer if we have events\n                _scheduleTimer();\n            }\n\n            function _eventsDropped(batches: EventBatch[], reason?: number, isSyncRequest?: boolean, sendType?: EventSendType) {\n                _notifyBatchEvents(\n                    strEventsDiscarded,\n                    batches,\n                    (reason >= EventBatchNotificationReason.EventsDropped && reason <= EventBatchNotificationReason.EventsDroppedMax ?\n                        reason - EventBatchNotificationReason.EventsDropped :\n                        EventsDiscardedReason.Unknown),\n                    sendType);\n            }\n\n            function _eventsResponseFail(batches: EventBatch[], reason?: number, isSyncRequest?: boolean, sendType?: EventSendType) {\n                _notifyBatchEvents(strEventsDiscarded, batches, EventsDiscardedReason.NonRetryableStatus, sendType);\n\n                // Try and schedule the processing timer if we have events\n                _scheduleTimer();\n            }\n\n            function _otherEvent(batches: EventBatch[], reason?: number, isSyncRequest?: boolean, sendType?: EventSendType) {\n                _notifyBatchEvents(strEventsDiscarded, batches, EventsDiscardedReason.Unknown, sendType);\n\n                // Try and schedule the processing timer if we have events\n                _scheduleTimer();\n            }\n\n            function _setAutoLimits() {\n                if (!_disableAutoBatchFlushLimit) {\n                    _autoFlushBatchLimit = mathMax(_maxEvtPerBatch * (MaxConnections + 1), _queueSizeLimit / 6);\n                } else {\n                    _autoFlushBatchLimit = 0;\n                }\n            }\n        });\n    }\n\n    /**\n     * Start the queue manager to batch and send events via post.\n     * @param config - The core configuration.\n     */\n    public initialize(coreConfig: IExtendedConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add an event to the appropriate inbound queue based on its latency.\n     * @param ev - The event to be added to the queue.\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    public processTelemetry(ev: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Sets the event queue limits at runtime (after initialization), if the number of queued events is greater than the\n     * eventLimit or autoFlushLimit then a flush() operation will be scheduled.\n     * @param eventLimit - The number of events that can be kept in memory before the SDK starts to drop events. If the value passed is less than or\n     * equal to zero the value will be reset to the default (10,000).\n     * @param autoFlushLimit - When defined, once this number of events has been queued the system perform a flush() to send the queued events\n     * without waiting for the normal schedule timers. Passing undefined, null or a value less than or equal to zero will disable the auto flush.\n     */\n    public setEventQueueLimits(eventLimit: number, autoFlushLimit?: number) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Pause the transmission of any requests\n     */\n    public pause() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resumes transmission of events.\n     */\n    public resume() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n    * Add handler to be executed with request response text.\n    */\n    public addResponseHandler(responseHanlder: (responseText: string) => void): IUnloadHook {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Flush to send data immediately; channel should default to sending data asynchronously. If executing asynchronously (the default) and\n     * you DO NOT pass a callback function then a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the flush is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - send data asynchronously when true\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @param sendReason - specify the reason that you are calling \"flush\" defaults to ManualFlush (1) if not specified\n     * @returns - If a callback is provided `true` to indicate that callback will be called after the flush is complete otherwise the caller\n     * should assume that any provided callback will never be called, Nothing or if occurring asynchronously a\n     * [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) which will be resolved once the unload is complete,\n     * the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) will only be returned when no callback is provided\n     * and isAsync is true.\n     */\n    public flush(isAsync: boolean = true, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Set AuthMsaDeviceTicket header\n     * @param ticket - Ticket value.\n     */\n    public setMsaAuthTicket(ticket: string) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Set setAuthPluginHeader header\n     * @param token - token value.\n     */\n    public setAuthPluginHeader(token: string) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * remove AuthPlugin Header\n     * @param token - token value.\n     */\n    public removeAuthPluginHeader(token: string) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n\n    /**\n     * Check if there are any events waiting to be scheduled for sending.\n     * @returns True if there are events, false otherwise.\n     */\n    public hasEvents(): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Load custom transmission profiles. Each profile should have timers for real time, and normal and can\n     * optionally specify the immediate latency time in ms (defaults to 0 when not defined). Each profile should\n     * make sure that a each normal latency timer is a multiple of the real-time latency and the immediate\n     * is smaller than the real-time.\n     * Setting the timer value to -1 means that the events for that latency will not be scheduled to be sent.\n     * Note that once a latency has been set to not send, all latencies below it will also not be sent. The\n     * timers should be in the form of [normal, high, [immediate]].\n     * e.g Custom:\n     * [10,5] - Sets the normal latency time to 10 seconds and real-time to 5 seconds; Immediate will default to 0ms\n     * [10,5,1] - Sets the normal latency time to 10 seconds and real-time to 5 seconds; Immediate will default to 1ms\n     * [10,5,0] - Sets the normal latency time to 10 seconds and real-time to 5 seconds; Immediate will default to 0ms\n     * [10,5,-1] - Sets the normal latency time to 10 seconds and real-time to 5 seconds; Immediate events will not be\n     * scheduled on their own and but they will be included with real-time or normal events as the first events in a batch.\n     * This also removes any previously loaded custom profiles.\n     * @param profiles - A dictionary containing the transmit profiles.\n     */\n    public _loadTransmitProfiles(profiles: { [profileName: string]: number[] }) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Set the transmit profile to be used. This will change the transmission timers\n     * based on the transmit profile.\n     * @param profileName - The name of the transmit profile to be used.\n     */\n    public _setTransmitProfile(profileName: string) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Backs off transmission. This exponentially increases all the timers.\n     */\n    public _backOffTransmission() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Clears backoff for transmission.\n     */\n    public _clearBackOff() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get Offline support\n     * @returns internal Offline support interface IInternalOfflineSupport\n     */\n    public getOfflineSupport(): IInternalOfflineSupport {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/RetryPolicy.ts",
    "content": "import { mathFloor, mathMin } from \"@nevware21/ts-utils\";\n\n/**\n* RetryPolicy.ts\n* @author Abhilash Panwar (abpanwar)\n* @copyright Microsoft 2018\n*/\nconst RandomizationLowerThreshold = 0.8;\nconst RandomizationUpperThreshold = 1.2;\nconst BaseBackoff = 3000;\nconst MaxBackoff = 600000;\n\n/**\n * Determine if the request should be retried for the given status code.\n * The below expression reads that we should only retry for:\n *      - HttpStatusCodes that are smaller than 300.\n *      - HttpStatusCodes greater or equal to 500 (except for 501-NotImplement\n *        and 505-HttpVersionNotSupport).\n *      - HttpStatusCode 408-RequestTimeout.\n *      - HttpStatusCode 429.\n * This is based on Microsoft.WindowsAzure.Storage.RetryPolicies.ExponentialRetry class\n * @param httpStatusCode - The status code returned for the request.\n * @returns True if request should be retried, false otherwise.\n */\nexport function retryPolicyShouldRetryForStatus(httpStatusCode: number): boolean {\n    /* tslint:disable:triple-equals */\n    // Disabling triple-equals rule to avoid httpOverrides from failing because they are returning a string value\n    return !((httpStatusCode >= 300 && httpStatusCode < 500  && httpStatusCode != 429)\n        || (httpStatusCode == 501)\n        || (httpStatusCode == 505));\n    /* tslint:enable:triple-equals */\n}\n\n/**\n * Gets the number of milliseconds to back off before retrying the request. The\n * back off duration is exponentially scaled based on the number of retries already\n * done for the request.\n * @param retriesSoFar - The number of times the request has already been retried.\n * @returns The back off duration for the request before it can be retried.\n */\nexport function retryPolicyGetMillisToBackoffForRetry(retriesSoFar: number): number {\n    let waitDuration = 0;\n    let minBackoff = BaseBackoff * RandomizationLowerThreshold;\n    let maxBackoff = BaseBackoff * RandomizationUpperThreshold;\n    let randomBackoff = mathFloor(Math.random() * (maxBackoff - minBackoff)) + minBackoff;\n    waitDuration = Math.pow(2, retriesSoFar) * randomBackoff;\n    return mathMin(waitDuration, MaxBackoff);\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/Serializer.ts",
    "content": "/**\n* Serializer.ts\n* @author Abhilash Panwar (abpanwar); Hector Hernandez (hectorh); Nev Wylie (newylie)\n* @copyright Microsoft 2018-2020\n*/\n// @skip-file-minify\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    EventSendType, FieldValueSanitizerFunc, FieldValueSanitizerType, IEventProperty, IPerfManagerProvider, IValueSanitizer,\n    SendRequestReason, arrIndexOf, doPerf, getCommonSchemaMetaData, getTenantId, isArray, isValueAssigned, objForEachKey, sanitizeProperty,\n    strStartsWith\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IChannelConfiguration, IPostTransmissionTelemetryItem, IRequestSizeLimit } from \"./DataModels\";\nimport { EventBatch } from \"./EventBatch\";\nimport { STR_EMPTY } from \"./InternalConstants\";\nimport { mathMin, strSubstr } from \"@nevware21/ts-utils\";\n\n/**\n * Note: This is an optimization for V8-based browsers. When V8 concatenates a string,\n * the strings are only joined logically using a \"cons string\" or \"constructed/concatenated\n * string\". These containers keep references to one another and can result in very large\n * memory usage. For example, if a 2MB string is constructed by concatenating 4 bytes\n * together at a time, the memory usage will be ~44MB; so ~22x increase. The strings are\n * only joined together when an operation requiring their joining takes place, such as\n * substr(). This function is called when adding data to this buffer to ensure these\n * types of strings are periodically joined to reduce the memory footprint.\n * Setting to every 20 events as the JSON.stringify() may have joined many strings\n * and calling this too much causes a minor delay while processing.\n */\nconst _MAX_STRING_JOINS = 20;\n\n// Max Size set by One Collector: https://msazure.visualstudio.com/OneDsCollector/_git/Collector?path=/Services/Azure/CollectorWorkerRoleAzure/ServiceConfiguration.Cloud.cscfg\nconst RequestSizeLimitBytes = 3145728; // approx 3.15 Mb\nconst BeaconRequestSizeLimitBytes = 65000; // approx 64kb (the current Edge, Firefox and Chrome max limit)\nconst MaxRecordSize = 2000000; // approx 2 Mb\nconst MaxBeaconRecordSize = mathMin(MaxRecordSize, BeaconRequestSizeLimitBytes);\nconst metadata = \"metadata\";\nconst f = \"f\";\nconst rCheckDot = /\\./;\n\n/**\n * @ignore\n * Identifies the callback to add metadata for a property.\n * @since 4.1.0\n * @group Private\n * @param pathKeys - The path keys for the property\n * @param key - The property key\n * @param value - The property value\n */\ntype EventMetaDataCallback = (pathKeys: string[], key: string, value: IEventProperty) => void;\n\n/**\n * @ignore\n * Identifies the callback to get the encoded type for a property.\n * This is added as a future hook for the serializer to allow for custom encoding of properties.\n * @since 4.1.0\n * @group Private\n * @param value - The property value\n * @param kind - The property value kind\n * @param type - The property type\n * @returns The encoded type for the property\n */\nexport type SerializerGetEncodedType = (value: string | boolean | number | string[] | number[] | boolean[] | undefined, kind: number | undefined, type?: number | undefined) => number;\n\nexport interface ISerializedPayload {\n    /**\n     * The collection of iKeys included in this payload\n     */\n    apiKeys: string[];\n\n    /**\n     * Serialized payload blob that needs to be sent.\n     */\n    payloadBlob: string;\n\n    /**\n     * Extra events that would not fit into the serialized blob limit\n     */\n    overflow: EventBatch;\n\n    /**\n     * Events that where dropped because they exceeded the individual limit\n     */\n    sizeExceed: EventBatch[];\n\n    /**\n     * Events that where dropped because they could not be serialized\n     */\n    failedEvts: EventBatch[];\n\n     /**\n     * The batches included in this payload\n     */\n    batches: EventBatch[];\n\n    /**\n     * The events that have been sent if not the full payload\n     */\n    sentEvts?: EventBatch[];\n\n    /**\n     * The number of events in the payload\n     */\n    numEvents: number;\n\n    /**\n     * The retry count for this payload\n     */\n    retryCnt: number;\n\n    /**\n     * Was this payload created during a teardown\n     */\n    isTeardown: boolean;\n\n    /**\n     * Is this payload a synchronous payload\n     */\n    isSync: boolean;\n\n    /**\n     * The payload has been constructed using a reduced payload size for usage with sendBeacon or fetch(with keepAlive) API's\n     */\n    isBeacon: boolean;\n\n    /**\n     * The request event sync type\n     */\n    sendType: EventSendType;\n\n    /**\n     * The reason the payload has is being sent\n     */\n    sendReason?: SendRequestReason;\n}\n\n/**\n* Class to handle serialization of event and request.\n* Currently uses Bond for serialization. Please note that this may be subject to change.\n*/\nexport class Serializer {\n\n    /**\n     * Constructs a new instance of the Serializer class\n     * @param perfManager - The performance manager to use for tracking performance\n     * @param valueSanitizer - The value sanitizer to use for sanitizing field values\n     * @param stringifyObjects - Should objects be stringified before being sent\n     * @param enableCompoundKey - Should compound keys be enabled (defaults to false)\n     * @param getEncodedTypeOverride - The callback to get the encoded type for a property defaults to ({@link getCommonSchemaMetaData }(...))\n     * @param excludeCsMetaData - (!DANGER!) Should metadata be populated when encoding the event blob (defaults to false) - PII data will NOT be tagged as PII for backend processing\n     * @param cfg channel cfg for setting request and record size limit\n     */\n    constructor(perfManager?: IPerfManagerProvider, valueSanitizer?: IValueSanitizer, stringifyObjects?: boolean, enableCompoundKey?: boolean, getEncodedTypeOverride?: SerializerGetEncodedType, excludeCsMetaData?: boolean, cfg?: IChannelConfiguration) {\n        const strData = \"data\";\n        const strBaseData = \"baseData\";\n        const strExt = \"ext\";\n\n        let _checkForCompoundkey = !!enableCompoundKey;\n        let _processSubKeys = true;\n        let _theSanitizer: IValueSanitizer = valueSanitizer;\n        let _isReservedCache = {};\n        let _excludeCsMetaData: boolean = !!excludeCsMetaData;\n        let _getEncodedType: SerializerGetEncodedType = getEncodedTypeOverride || getCommonSchemaMetaData;\n        let _sizeCfg = _getSizeLimtCfg(cfg);\n        let _requestSizeLimitBytes = _validateSizeLimit(_sizeCfg.requestLimit, RequestSizeLimitBytes, 0);\n        let _beaconRequestSizeLimitBytes = _validateSizeLimit(_sizeCfg.requestLimit, BeaconRequestSizeLimitBytes, 1);\n        let _maxRecordSize =  _validateSizeLimit(_sizeCfg.recordLimit, MaxRecordSize, 0);\n        let _maxBeaconRecordSize =  Math.min(_validateSizeLimit(_sizeCfg.recordLimit, MaxBeaconRecordSize, 1), _beaconRequestSizeLimitBytes);\n\n        dynamicProto(Serializer, this, (_self) => {\n\n            _self.createPayload = (retryCnt: number, isTeardown: boolean, isSync: boolean, isReducedPayload: boolean, sendReason: SendRequestReason, sendType: EventSendType): ISerializedPayload => {\n                return {\n                    apiKeys: [],\n                    payloadBlob: STR_EMPTY,\n                    overflow: null,\n                    sizeExceed: [],\n                    failedEvts: [],\n                    batches: [],\n                    numEvents: 0,\n                    retryCnt: retryCnt,\n                    isTeardown: isTeardown,\n                    isSync: isSync,\n                    isBeacon: isReducedPayload,\n                    sendType: sendType,\n                    sendReason: sendReason\n                };\n            };\n\n            _self.appendPayload = (payload: ISerializedPayload, theBatch: EventBatch, maxEventsPerBatch: number): boolean => {\n                let canAddEvents = payload && theBatch && !payload.overflow;\n                if (canAddEvents) {\n                    doPerf(perfManager, () => \"Serializer:appendPayload\", () => {\n                        let theEvents = theBatch.events();\n                        let payloadBlob = payload.payloadBlob;\n                        let payloadEvents = payload.numEvents;\n                        let eventsAdded = false;\n                        let sizeExceeded: IPostTransmissionTelemetryItem[] = [];\n                        let failedEvts: IPostTransmissionTelemetryItem[] = [];\n                        let isBeaconPayload = payload.isBeacon;\n                        let requestMaxSize = isBeaconPayload ? _beaconRequestSizeLimitBytes : _requestSizeLimitBytes;\n                        let recordMaxSize = isBeaconPayload ? _maxBeaconRecordSize : _maxRecordSize;\n\n                        let lp = 0;\n                        let joinCount = 0;\n                        while (lp < theEvents.length) {\n                            let theEvent = theEvents[lp];\n                            if (theEvent) {\n                                if (payloadEvents >= maxEventsPerBatch) {\n                                    // Maximum events per payload reached, so don't add any more\n                                    payload.overflow = theBatch.split(lp);\n                                    break;\n                                }\n\n                                let eventBlob = _self.getEventBlob(theEvent);\n                                if (eventBlob && eventBlob.length <= recordMaxSize) {\n                                    // This event will fit into the payload\n                                    let blobLength = eventBlob.length;\n                                    let currentSize = payloadBlob.length;\n                                    if (currentSize + blobLength > requestMaxSize) {\n                                        // Request or batch size exceeded, so don't add any more to the payload\n                                        payload.overflow = theBatch.split(lp);\n                                        break;\n                                    }\n\n                                    if (payloadBlob) {\n                                        payloadBlob += \"\\n\";\n                                    }\n\n                                    payloadBlob += eventBlob;\n\n                                    joinCount ++;\n                                    // v8 memory optimization only\n                                    if (joinCount > _MAX_STRING_JOINS) {\n                                        // this substr() should cause the constructed string to join\n                                        strSubstr(payloadBlob, 0, 1);\n                                        joinCount = 0;\n                                    }\n\n                                    eventsAdded = true;\n                                    payloadEvents++;\n                                } else {\n                                    if (eventBlob) {\n                                        // Single event size exceeded so remove from the batch\n                                        sizeExceeded.push(theEvent);\n                                    } else {\n                                        failedEvts.push(theEvent);\n                                    }\n\n                                    // We also need to remove this event from the existing array, otherwise a notification will be sent\n                                    // indicating that it was successfully sent\n                                    theEvents.splice(lp, 1);\n                                    lp--;\n                                }\n                            }\n\n                            lp++;\n                        }\n\n                        if (sizeExceeded.length > 0) {\n                            payload.sizeExceed.push(EventBatch.create(theBatch.iKey(), sizeExceeded));\n                            // Remove the exceeded events from the batch\n                        }\n\n                        if (failedEvts.length > 0) {\n                            payload.failedEvts.push(EventBatch.create(theBatch.iKey(), failedEvts));\n                            // Remove the failed events from the batch\n                        }\n\n                        if (eventsAdded) {\n                            payload.batches.push(theBatch);\n                            payload.payloadBlob = payloadBlob;\n                            payload.numEvents = payloadEvents;\n\n                            let apiKey = theBatch.iKey();\n                            if (arrIndexOf(payload.apiKeys, apiKey) === -1) {\n                                payload.apiKeys.push(apiKey);\n                            }\n                        }\n                    }, () => ({ payload: payload, theBatch: { iKey: theBatch.iKey(), evts: theBatch.events() }, max: maxEventsPerBatch }));\n                }\n\n                return canAddEvents;\n            };\n\n            _self.getEventBlob = (eventData: IPostTransmissionTelemetryItem): string => {\n                try {\n                    return doPerf(perfManager, () => \"Serializer.getEventBlob\", () => {\n                        let serializedEvent = { } as any;\n                        // Adding as dynamic keys for v8 performance\n                        serializedEvent.name = eventData.name;\n                        serializedEvent.time = eventData.time;\n                        serializedEvent.ver = eventData.ver;\n                        serializedEvent.iKey = \"o:\" + getTenantId(eventData.iKey);\n\n                        // Assigning local var so usage in part b/c don't throw if there is no ext\n                        let serializedExt = {};\n\n                        let _addMetadataCallback: EventMetaDataCallback;\n                        if (!_excludeCsMetaData) {\n                            _addMetadataCallback = (pathKeys: string[], key: string, value: IEventProperty) => {\n                                _addJSONPropertyMetaData(_getEncodedType, serializedExt, pathKeys, key, value);\n                            };\n                        }\n\n                        // Part A\n                        let eventExt = eventData[strExt];\n                        if (eventExt) {\n                            // Only assign ext if the event had one (There are tests covering this use case)\n                            serializedEvent[strExt] = serializedExt;\n                            objForEachKey(eventExt, (key, value) => {\n                                let data = serializedExt[key] = {};\n\n                                // Don't include a metadata callback as we don't currently set metadata Part A fields\n                                _processPathKeys(value, data, \"ext.\" + key, true, null, null, true);\n                            });\n                        }\n\n                        let serializedData: any = serializedEvent[strData] = {};\n                        serializedData.baseType = eventData.baseType;\n\n                        let serializedBaseData = serializedData[strBaseData] = {};\n\n                        // Part B\n                        _processPathKeys(eventData.baseData, serializedBaseData, strBaseData, false, [strBaseData], _addMetadataCallback, _processSubKeys);\n\n                        // Part C\n                        _processPathKeys(eventData.data, serializedData, strData, false, [], _addMetadataCallback, _processSubKeys);\n\n                        return JSON.stringify(serializedEvent);\n                    }, () => ({ item: eventData }));\n                } catch (e) {\n                    return null;\n                }\n            };\n\n            function _isReservedField(path: string, name: string): boolean {\n                let result = _isReservedCache[path];\n\n                if (result === undefined)  {\n                    if (path.length >= 7) {\n                        // Do not allow the changing of fields located in the ext.metadata or ext.web extension\n                        result = strStartsWith(path, \"ext.metadata\") || strStartsWith(path, \"ext.web\");\n                    }\n\n                    _isReservedCache[path] = result;\n                }\n\n                return result;\n            }\n\n            function _processPathKeys(\n                srcObj: any,\n                target: { [key: string]: {}},\n                thePath: string,\n                checkReserved: boolean,\n                metadataPathKeys: string[],\n                metadataCallback: EventMetaDataCallback,\n                processSubKeys: boolean) {\n\n                objForEachKey(srcObj, (key, srcValue) => {\n                    let prop: IEventProperty = null;\n                    if (srcValue || isValueAssigned(srcValue)) {\n                        let path = thePath;\n                        let name = key;\n\n                        let theMetaPathKeys = metadataPathKeys;\n                        let destObj = target;\n\n                        // Handle keys with embedded '.', like \"TestObject.testProperty\"\n                        if (_checkForCompoundkey && !checkReserved && rCheckDot.test(key)) {\n                            let subKeys = key.split(\".\");\n                            let keyLen = subKeys.length;\n                            if (keyLen > 1) {\n                                if (theMetaPathKeys) {\n                                    // Create a copy of the meta path keys so we can add the extra ones\n                                    theMetaPathKeys = theMetaPathKeys.slice();\n                                }\n\n                                for (let lp = 0; lp < keyLen - 1; lp++) {\n                                    let subKey = subKeys[lp];\n                                    // Add/reuse the sub key object\n                                    destObj = destObj[subKey] = destObj[subKey] || {};\n                                    path += \".\" + subKey;\n                                    if (theMetaPathKeys) {\n                                        theMetaPathKeys.push(subKey);\n                                    }\n                                }\n\n                                name = subKeys[keyLen - 1];\n                            }\n                        }\n\n                        let isReserved = checkReserved && _isReservedField(path, name);\n                        if (!isReserved && _theSanitizer && _theSanitizer.handleField(path, name)) {\n                            prop = _theSanitizer.value(path, name, srcValue, stringifyObjects);\n                        } else {\n                            prop = sanitizeProperty(name, srcValue, stringifyObjects);\n                        }\n\n                        if (prop) {\n                            // Set the value\n                            let newValue: any = prop.value;\n                            destObj[name] = newValue;\n\n                            if (metadataCallback) {\n                                metadataCallback(theMetaPathKeys, name, prop);\n                            }\n\n                            if (processSubKeys && typeof newValue === \"object\" && !isArray(newValue)) {\n                                let newPath = theMetaPathKeys;\n                                if (newPath) {\n                                    newPath = newPath.slice();\n                                    newPath.push(name);\n                                }\n\n                                // Make sure we process sub objects as well (for value sanitization and metadata)\n                                _processPathKeys(srcValue, newValue, path + \".\" + name, checkReserved, newPath, metadataCallback, processSubKeys);\n                            }\n                        }\n                    }\n                });\n            }\n        });\n    }\n\n    /**\n     * Create a serializer payload package\n     * @param retryCnt - The retry count for the events in this payload\n     * @param isTeardown - Is this payload being created as part of a teardown request\n     * @param isSync - Should this payload be sent as a synchronous request\n     * @param isReducedPayload - Is this payload going to be sent via sendBeacon() API\n     * @param sendReason - The reason the payload is being sent\n     * @param sendType - Identifies how this payload will be sent\n     */\n    public createPayload(retryCnt: number, isTeardown: boolean, isSync: boolean, isReducedPayload: boolean, sendReason: SendRequestReason, sendType: EventSendType): ISerializedPayload {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Append the batched events into the payload\n     * @param payload - The serialized payload detail object\n     * @param theBatch - The batched events to append to the payload\n     * @param maxEventsPerBatch - The maximum number of events to allow in the payload\n     * @returns True if the events from the new batch where attempted to be added to the payload otherwise false\n     */\n    public appendPayload(payload: ISerializedPayload, theBatch: EventBatch, maxEventsPerBatch: number): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Bond serialize the event.\n     * @param eventData - The event that needs to be serialized.\n     * @returns The serialized json event.\n     */\n    public getEventBlob(eventData: IPostTransmissionTelemetryItem): string {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Does this field value sanitizer handle this path / field combination\n     * @param path - The field path\n     * @param name - The name of the field\n     */\n    public handleField(path: string, name: string): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Get the field sanitizer for this type of field based on the field type, value kind and/or event property type\n     * @param path - The field path\n     * @param name - The name of the field\n     * @param theType - The type of field\n     * @param theKind - The value kind of the field\n     * @param propType - The property type of the field\n     */\n    public getSanitizer(path: string, name: string, theType: FieldValueSanitizerType, theKind?: number, propType?: number): FieldValueSanitizerFunc | null | undefined {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n}\n\nfunction _validateSizeLimit(cfgVal: number[], defaultVal: number, idx: number): number {\n    if (isArray(cfgVal)){\n        let val = cfgVal[idx];\n        if (val > 0 && val <= defaultVal) {\n            return val;\n        }\n    }\n    return defaultVal;\n}\n\nfunction _getSizeLimtCfg(cfg?: IChannelConfiguration) {\n    let defaultCfg = {} as IRequestSizeLimit;\n    if (cfg && cfg.requestLimit) {\n        return cfg.requestLimit;\n    }\n    return defaultCfg;\n}\n\n\n/**\n * @ignore\n * @param getEncodedType - The function to get the encoded type for the property\n * @param json - The json object to add the metadata to\n * @param propKeys - The property keys to add to the metadata\n * @param name - The name of the property\n * @param propertyValue - The property value\n */\nfunction _addJSONPropertyMetaData(\n    getEncodedType: (value: string | boolean | number | string[] | number[] | boolean[] | undefined, kind: number | undefined, type?: number | undefined) => number,\n    json: { [name: string]: {} },\n    propKeys: string[],\n    name: string,\n    propertyValue: IEventProperty | null) {\n\n    if (propertyValue && json) {\n        let encodedTypeValue = getEncodedType(propertyValue.value, propertyValue.kind, propertyValue.propertyType);\n        if (encodedTypeValue > -1) {\n            // Add the root metadata\n            let metaData = json[metadata];\n            if (!metaData) {\n                // Sets the root 'f'\n                metaData = json[metadata] = { f: {} };\n            }\n\n            let metaTarget = metaData[f];\n            if (!metaTarget) {\n                // This can occur if someone has manually added an ext.metadata object\n                // Such as ext.metadata.privLevel and ext.metadata.privTags\n                metaTarget = metaData[f] = {};\n            }\n\n            // Traverse the metadata path and build each object (contains an 'f' key) -- if required\n            if (propKeys) {\n                for (let lp = 0; lp < propKeys.length; lp++) {\n                    let key = propKeys[lp];\n                    if (!metaTarget[key]) {\n                        metaTarget[key] = { f: {} };\n                    }\n\n                    let newTarget = metaTarget[key][f];\n                    if (!newTarget) {\n                        // Not expected, but can occur if the metadata context was pre-created as part of the event\n                        newTarget = metaTarget[key][f] = {};\n                    }\n\n                    metaTarget = newTarget;\n                }\n            }\n\n            metaTarget = metaTarget[name] = { };\n            if (isArray(propertyValue.value)) {\n                metaTarget[\"a\"] = {\n                    t: encodedTypeValue\n                };\n            } else {\n                metaTarget[\"t\"] = encodedTypeValue;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/TimeoutOverrideWrapper.ts",
    "content": "/**\n* TimeoutOverrideWrapper.ts\n* @author  Nev Wylie (newylie)\n* @copyright Microsoft 2022\n* Simple internal timeout wrapper\n*/\n\nimport { ClearTimeoutOverrideFn, ITimerHandler, TimeoutOverrideFn, scheduleTimeoutWith } from \"@nevware21/ts-utils\";\n\nexport interface ITimeoutOverrideWrapper {\n    set: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => ITimerHandler;\n}\n\nexport function createTimeoutWrapper(argSetTimeout?: TimeoutOverrideFn, argClearTimeout?: ClearTimeoutOverrideFn) {\n    return {\n        set: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => {\n            return scheduleTimeoutWith([argSetTimeout, argClearTimeout], callback, ms, args);\n        }\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/src/typings/XDomainRequest.ts",
    "content": "// This interface was removed from newer versions of typescript. Restore it for legacy support\nexport interface XDomainRequest {\n    timeout: number;\n    onerror: (ev: Event) => any;\n    onload: (ev: Event) => any;\n    onprogress: (ev: any) => any;\n    ontimeout: (ev: Event) => any;\n    responseText: string;\n    contentType: string;\n    open(method: string, url: string): void;\n    create(): XDomainRequest;\n    abort(): void;\n    send(data?: any): void;\n    addEventListener(type: \"error\", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;\n    addEventListener(type: \"load\" | \"timeout\", listener: (ev: Event) => any, useCapture?: boolean): void;\n    addEventListener(type: \"progress\", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;\n    addEventListener(type: string, listener: EventListener, useCapture?: boolean): void;\n}\n\n// export declare var XDomainRequest: {\n//     prototype: IXDomainRequest;\n//     new (): IXDomainRequest;\n// };\n"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/FileSizeCheckTest.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { dumpObj, mathCeil } from '@nevware21/ts-utils';\nimport { createPromise, doAwait, IPromise } from '@nevware21/ts-async';\nimport * as pako from 'pako';\n\nconst MAX_DEFLATE_SIZE = 26.5;\n\nconst PACKAGE_JSON = \"../package.json\";\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction _loadPackageJson(cb: (isNightly: boolean, packageJson: any) => IPromise<void>): IPromise<void> {\n    return createPromise<void>((testCompleted, testFailed) => {\n        function _handleCallback(packageJson: any) {\n            let version = packageJson.version || \"unknown\";\n            let isNightly = version.includes(\"nightly\") || version.includes(\"dev\");\n            doAwait(cb(isNightly, packageJson), () => {\n                testCompleted();\n            }, (error) => {\n                QUnit.assert.ok(false, `checkIsNightlyBuild error: ${error}`);\n                testFailed(error);\n            });\n        }\n\n        fetch(PACKAGE_JSON).then((response) => {\n            if (!response.ok) {\n                QUnit.assert.ok(false, `fetch package.json error: ${dumpObj(response)}`);\n                _handleCallback(false);\n            } else {\n                return response.text().then((content) => {\n                    let json = JSON.parse(removeTrailingComma(content));\n                    _handleCallback(json);\n                }, (error) => {\n                    QUnit.assert.ok(false, `fetch package.json error: ${error}`);\n                    _handleCallback({});\n                });\n            }\n        }, (error) => {\n            QUnit.assert.ok(false, `fetch package.json error: ${error}`);\n            _handleCallback({});\n        });\n    });\n}\n\nfunction _checkSize(checkType: string, maxSize: number, size: number, isNightly: boolean): void {\n    if (isNightly) {\n        maxSize += .5;\n    }\n\n    QUnit.assert.ok(size <= maxSize, `exceed ${maxSize} KB, current ${checkType} size is: ${size} KB`);\n}\n\n\nexport class FileSizeCheckTest extends AITestClass {\n\n    public testInitialize() {\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Test ms.post gzip size\",\n            useFakeServer: false,\n            test: () => {\n                return _loadPackageJson((isNightly, packageJson) => {\n                    QUnit.assert.ok(true, `  checking : ${packageJson.name || \"??\"} v${packageJson.version || \"unknown\"}`);\n                    return createPromise<void>((testCompleted, testFailed) => {\n                        let xhr = new XMLHttpRequest();\n                        xhr.open('GET', '../bundle/es5/ms.post.min.js', true);\n                        xhr.onload = () => {\n                            let size = mathCeil(pako.deflate(xhr.responseText).length / 1024);\n                            _checkSize(\"deflate\", MAX_DEFLATE_SIZE, size, isNightly);\n                            testCompleted();\n                        };\n                        xhr.send()\n                        xhr.onerror = (err) => {\n                            QUnit.assert.ok(false, \"error in getting deflate size: \" + err)\n                            testFailed(err);\n                        }\n                    });\n                });\n            }\n        });\n    }\n}\n\n\n"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { Assert } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/HttpManagerTest.ts",
    "content": "import { AITestClass, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { HttpManager } from \"../../../src/HttpManager\";\nimport { AppInsightsExtCore, BaseTelemetryPlugin, EventSendType, IAppInsightsCore, IExtendedConfiguration, IPlugin, IProcessTelemetryContext, ITelemetryItem, SendRequestReason, TransportType, isBeaconsSupported, IXHROverride, IPayloadData } from \"@microsoft/applicationinsights-core-js\";\nimport { PostChannel } from \"../../../src/PostChannel\";\nimport { IPostTransmissionTelemetryItem, EventBatchNotificationReason, IChannelConfiguration } from \"../../../src/DataModels\";\nimport { EventBatch } from \"../../../src/EventBatch\";\nimport { retryPolicyShouldRetryForStatus } from \"../../../src/RetryPolicy\";\nimport { setBypassLazyCache } from \"@nevware21/ts-utils\";\n\ninterface EventDetail {\n    batches: EventBatch[];\n    reason: EventBatchNotificationReason;\n    isSync: boolean;\n}\n\ninterface SendHookDetail {\n    payload: IPayloadData;\n    isSync: boolean;\n}\n\nexport class HttpManagerTest extends AITestClass {\n\n    private postManager: PostChannel\n    private xhrOverrideSpy: any;\n    private core: IAppInsightsCore;\n    private _requeueEvents: EventDetail[] = [];\n    private _sendEvents: EventDetail[] = [];\n    private _sentEvents: EventDetail[] = [];\n    private _dropEvents: EventDetail[] = [];\n    private _hookCalls: SendHookDetail[] = [];\n\n    constructor(name?: string, emulateEs3?: boolean) {\n        super(name, emulateEs3);\n        \n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n    }\n\n    public testInitialize() {\n        super.testInitialize();\n        setBypassLazyCache(true);\n\n        // Reset the cached isBeacons supported\n        isBeaconsSupported(false);\n\n        this._requeueEvents = [];\n        this._sendEvents = [];\n        this._sentEvents = [];\n        this._dropEvents = [];\n        this._hookCalls = [];\n        this.core = new AppInsightsExtCore();\n        var config = {\n            instrumentationKey: \"\"\n        };\n        this.postManager = new PostChannel();\n        this.core.initialize(config, [this.postManager]);\n    }\n\n    public testFinishedCleanup(): void {\n        if (this.postManager) {\n            // Stop the post channel from sending any events (after the fake server has been removed)\n            this.postManager.pause();\n        }\n\n        if (this.core && this.core.isInitialized()) {\n            this.core.unload(false);\n        }\n        super.testFinishedCleanup();\n    }\n\n    public registerTests() {\n        let _requeueNotification = (batches: EventBatch[], reason?: EventBatchNotificationReason, isSyncRequest?: boolean) => {\n            this._requeueEvents.push({\n                batches: batches,\n                reason: reason,\n                isSync: isSyncRequest\n            });\n        };\n    \n        let _sendNotification = (batches: EventBatch[], reason?: EventBatchNotificationReason, isSyncRequest?: boolean) => {\n            this._sendEvents.push({\n                batches: batches,\n                reason: reason,\n                isSync: isSyncRequest\n            });\n        };\n    \n        let _sentNotification = (batches: EventBatch[], reason?: EventBatchNotificationReason, isSyncRequest?: boolean) => {\n            this._sentEvents.push({\n                batches: batches,\n                reason: reason,\n                isSync: isSyncRequest\n            });\n        };\n    \n        let _dropNotification = (batches: EventBatch[], reason?: EventBatchNotificationReason, isSyncRequest?: boolean) => {\n            this._dropEvents.push({\n                batches: batches,\n                reason: reason,\n                isSync: isSyncRequest\n            });\n        };\n\n        let _sendHook = (payload: IPayloadData, callback: (modifiedBuffer: IPayloadData) => void, isSync?: boolean) => {\n            this._hookCalls.push({\n                payload: payload,\n                isSync: isSync\n            });\n            // just call the callback\n            callback(payload);\n        };\n\n        this.testCase({\n            name: \"HttpManager: dynamic config\",\n            useFakeTimers: true,\n            test: () => {\n                let xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, {});\n                    }\n                };\n                let hookSpy = this.sandbox.spy(_sendHook);\n                let cbSpy = this.sandbox.spy();\n                let core = this.core;\n                let postChannel = this.postManager;\n                let postId = postChannel.identifier;\n                core.config.extensionConfig = core.config.extensionConfig || {};\n                core.config.extensionConfig[postId].payloadListener = cbSpy;\n                core.config.extensionConfig[postId].payloadPreprocessor = hookSpy;\n                core.config.extensionConfig[postId].httpXHROverride = xhrOverride;\n                core.config.endpointUrl = \"testEndpoint\";\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                let manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                \n                manager.initialize(core.config, core, postChannel);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \" the override should be set\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"transport is set to undefined\");\n                QUnit.assert.ok(hookSpy.notCalled, \"sendhook should not be called\");\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.ok(hookSpy.calledOnce, \"preprocessor should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(hookSpy.args[0][2], \"preprocessor should have been told its a sync request\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n                QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1, \"attempt should be 1\");\n                QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called\");\n                QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                let payload = cbSpy.args[0][1];\n                QUnit.assert.equal(payload.urlString, \"testEndpoint?cors=true&content-type=application/x-json-stream&w=0\", \"endpoint should be testEndpoint\");\n                QUnit.assert.equal(payload.headers.apikey, \"testToken\", \"headers should contain testToken\");\n                QUnit.assert.equal(payload.timeout, undefined, \"Timeout was undefined\");\n                QUnit.assert.equal(payload.disableXhrSync, false, \"disable XHRSync was false\");\n                QUnit.assert.equal(payload.disableFetchKeepAlive, false, \"disable fetch keep alive should be false\");\n\n                // dynamic changes\n                core.config.extensionConfig[postId].disableFetchKeepAlive = true;\n                core.config.endpointUrl = \"newEndpoint\";\n                this.clock.tick(1);\n                testBatch = EventBatch.create(\"newToken\", [this._createEvent()]);\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.equal(this._sendEvents.length, 2, \"batches sent should be 2\");\n                QUnit.assert.equal(this._sentEvents.length, 2, \"batches Completed should be 2\");\n                QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1, \"attempt should be 1\");\n                QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                QUnit.assert.equal(cbSpy.callCount, 2, \"listener should be called twice\");\n                payload = cbSpy.args[1][1];\n                QUnit.assert.equal(payload.urlString, \"newEndpoint?cors=true&content-type=application/x-json-stream&w=0\",\"endpoint should be newEndpoint\");\n                QUnit.assert.equal(payload.headers.apikey, \"newToken\", \"apikey should contain newToken\");\n                QUnit.assert.equal(payload.timeout, undefined, \"Timeout was undefined\");\n                QUnit.assert.equal(payload.disableXhrSync, false, \"disable XHRSync was false\");\n                QUnit.assert.equal(payload.disableFetchKeepAlive, true, \"disable fetch keep alive should be true\");\n\n                \n                let fetchCalls = this.hookFetch((resolve) => {\n                    setTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n                core.config.extensionConfig[postId].httpXHROverride = null;\n                core.config.extensionConfig[postId].transports= TransportType.Fetch;\n                core.config.extensionConfig[postId].disableFetchKeepAlive = false;\n                this.clock.tick(1);\n                QUnit.assert.ok(manager[\"_getDbgPlgTargets\"]()[0], \"Make sure that there is a transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that the transport type is fetch\");\n\n                testBatch = EventBatch.create(\"newToken\", [this._createEvent()]);\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.equal(fetchCalls.length, 1, \"fetch call length should be 1\");\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"requeueEvents should be 0\");\n                QUnit.assert.ok(fetchCalls[0].input, \"fetch call should not empty\");\n                QUnit.assert.equal(fetchCalls[0].init.body, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\", \"should get expected data\");\n                QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1, \"attempt should be 1\");\n            }\n        });\n\n        this.testCase({\n            name: \"HttpManager: Offline Support\",\n            useFakeTimers: true,\n            test: () => {\n                let core = this.core;\n                let postChannel = this.postManager;\n                core.config.extensionConfig = core.config.extensionConfig || {};\n                let postId = postChannel.identifier;\n      \n                core.config.endpointUrl = \"testEndpoint\";\n\n                let manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                \n                manager.initialize(core.config, core, postChannel);\n                QUnit.assert.ok(manager.serializeOfflineEvt, \"seralize function should exist\");\n                let evt = this._createEvent();\n                evt.iKey = \"testKey-123\";\n                let evtStr = manager.serializeOfflineEvt(evt);\n                QUnit.assert.equal(evtStr, `{\"name\":\"testEvent\",\"iKey\":\"o:testKey\",\"data\":{\"baseData\":{}}}`,\"Event should be serialized\");\n\n                QUnit.assert.ok(manager.getOfflineRequestDetails, \"request details function should exist\");\n                QUnit.assert.ok(manager.getOfflineRequestDetails(), \"request details should set\");\n                QUnit.assert.equal(manager.getOfflineRequestDetails().url, \"testEndpoint?cors=true&content-type=application/x-json-stream&w=0\", \"details url should be set\");\n                let details = manager.createOneDSPayload([evt]);\n                let headers = details.headers || {};\n                let apiKey = headers[\"apikey\"];\n                QUnit.assert.equal(apiKey, \"testKey-123\", \"should get expected api key\");\n                QUnit.assert.equal(details.data, `{\"name\":\"testEvent\",\"iKey\":\"o:testKey\",\"data\":{\"baseData\":{}}}`, \"should return expected data\");\n\n                let evt1 = this._createEvent();\n                evt1.iKey = \"testKey-12345\";\n                evt1.name = \"testEvent1\";\n                details = manager.createOneDSPayload([evt, evt1]);\n                headers = details.headers || {};\n                apiKey = headers[\"apikey\"];\n                QUnit.assert.equal(apiKey, \"testKey-123,testKey-12345\", \"should get expected api keys test1\");\n                QUnit.assert.equal(details.data, `{\"name\":\"testEvent\",\"iKey\":\"o:testKey\",\"data\":{\"baseData\":{}}}\\n{\"name\":\"testEvent1\",\"iKey\":\"o:testKey\",\"data\":{\"baseData\":{}}}`, \"should return expected data test1\");\n\n                let evt2 = this._createEvent();\n                evt2.iKey = \"testKey-123\";\n                evt2.name = \"testEvent2\";\n                details = manager.createOneDSPayload([evt, evt2]);\n                headers = details.headers || {};\n                apiKey = headers[\"apikey\"];\n                QUnit.assert.equal(apiKey, \"testKey-123\", \"should get expected api keys test2\");\n                QUnit.assert.equal(details.data, `{\"name\":\"testEvent\",\"iKey\":\"o:testKey\",\"data\":{\"baseData\":{}}}\\n{\"name\":\"testEvent2\",\"iKey\":\"o:testKey\",\"data\":{\"baseData\":{}}}`, \"should return expected data test2\");\n                \n            }\n        });\n\n        this.testCase({\n            name: \"Http Manager with maxNumberEvtPerBatch config set\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig = this.core.config.extensionConfig || {};\n                this.core.config.extensionConfig[this.postManager.identifier].maxEvtPerBatch = 3;\n                this.core.config.extensionConfig[this.postManager.identifier].payloadPreprocessor = hookSpy;\n                this.core.config.extensionConfig[this.postManager.identifier].httpXHROverride = xhrOverride;\n                \n                manager.initialize(this.core.config, this.core, this.postManager);\n                let maxNumberEvtPerBatch = manager[\"_getDbgPlgTargets\"]()[6];\n                QUnit.assert.equal(maxNumberEvtPerBatch, 3, \"max number of events per batch should be 3\");\n                let serializer = manager[\"_getDbgPlgTargets\"]()[2];\n                let spy = this.sandbox.spy(serializer, \"appendPayload\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.ok(hookSpy.notCalled); // precondition\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.ok(spy.notCalled, \"appendPayload should not be called yet\");\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.ok(spy.calledOnce, \"appendPayload should be called when the manager makes an HTTP request\");\n                let appendPayloadArgs = spy.args[0][2];\n                QUnit.assert.equal(appendPayloadArgs, 3, \"appendPayload should be called with max number of events per batch\");\n                QUnit.assert.ok(hookSpy.calledOnce, \"preprocessor should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(hookSpy.args[0][2], \"preprocessor should have been told its a sync request\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"Http Manager with maxNumberEvtPerBatch config set to 0 or large than the default value\",\n            useFakeTimers: true,\n            test: () => {\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig = this.core.config.extensionConfig || {};\n                this.core.config.extensionConfig[this.postManager.identifier].maxEvtPerBatch = 0;\n                manager.initialize(this.core.config, this.core, this.postManager);\n                let maxNumberEvtPerBatch = manager[\"_getDbgPlgTargets\"]()[6];\n                QUnit.assert.equal(maxNumberEvtPerBatch, 500, \"max number of events per batch should be 500\");\n\n                var manager1: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig[this.postManager.identifier].maxEvtPerBatch = 1000;\n                manager1.initialize(this.core.config, this.core, this.postManager);\n                maxNumberEvtPerBatch = manager1[\"_getDbgPlgTargets\"]()[6];\n                QUnit.assert.equal(maxNumberEvtPerBatch, 500, \"max number of events per batch should be 500 test1\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"payloadPreprocessor with override\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n\n                // Using the default values defined as const values in Postchannel\n                // 500 = MaxNumberEventPerBatch\n                // 2 = MaxConnections\n                // 1 = MaxRetries\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.ok(hookSpy.notCalled); // precondition\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.ok(hookSpy.calledOnce, \"preprocessor should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(hookSpy.args[0][2], \"preprocessor should have been told its a sync request\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n            }\n        });\n\n        this.testCase({\n            name: \"payloadPreprocessor with override throws before calling callback\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                let sendHookCalled = 0;\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = (payload, callback, isAsync) => {\n                    sendHookCalled++;\n                    throw \"Fake Error\";\n                };\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.ok(sendHookCalled == 0); // precondition\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                manager.sendSynchronousBatch(testBatch);\n                // Notifications are sent asynchronously\n                QUnit.assert.equal(sendHookCalled, 1, \"preprocessor should be called when the manager makes an HTTP request\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n            }\n        });\n\n        this.testCase({\n            name: \"payloadPreprocessor with override throws after calling callback\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                let sendHookCalled = 0;\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = (payload, callback, isAsync) => {\n                    sendHookCalled++;\n                    callback(payload);\n                    throw \"Fake Error\";\n                };\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.ok(sendHookCalled == 0); // precondition\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.equal(sendHookCalled, 1, \"preprocessor should be called when the manager makes an HTTP request\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n            }\n        });\n\n        if (!this.isEmulatingIe) {\n            this.testCase({\n                name: \"payloadPreprocessor should not be called during teardown with custom override\",\n                useFakeTimers: true,\n                test: () => {\n                    var xhrOverride: IXHROverride = {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                            oncomplete(200, null);\n                        }\n                    };\n    \n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n    \n                    const hookSpy = this.sandbox.spy(_sendHook);\n                    this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n    \n                    this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n    \n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(hookSpy.notCalled); // precondition\n                    QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                    QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                    manager.teardown();\n                    QUnit.assert.ok(hookSpy.notCalled, \"preprocessor should not be called when the manager is being torn down\");\n                    // QUnit.assert.ok(hookSpy.args[0][2], \"preprocessor should have been told its a sync request\");\n                    QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                    QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n                }\n            });\n\n            // Beacons don't exist in ES3 mode\n            this.testCase({\n                name: \"payloadPreprocessor not called during teardown with beacons\",\n                useFakeTimers: true,\n                test: () => {\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const hookSpy = this.sandbox.spy(_sendHook);\n                    this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n    \n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(hookSpy.notCalled); // precondition\n                    QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                    QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                    manager.teardown();\n                    QUnit.assert.ok(hookSpy.notCalled, \"preprocessor should not be called when the manager is being torn down\");\n                    QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                    QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n                }\n            });\n        }\n\n        this.testCase({\n            name: \"payloadListener with override\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const cbSpy = this.sandbox.spy();\n                this.core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.ok(cbSpy.notCalled); // precondition\n                manager.sendSynchronousBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                QUnit.assert.ok(!cbSpy.args[0][3], \"listener should have been told its not a beacon request\");\n            }\n        });\n\n        this.testCase({\n            name: \"payloadListener with override called during teardown\",\n            useFakeTimers: true,\n            test: () => {\n                let overrideCalled = false;\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        overrideCalled = true;\n                        oncomplete(200, null);\n                    }\n                };\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n\n                const cbSpy = this.sandbox.spy();\n                this.core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n\n                // This stops the internal code from falling back to use sendBeacon() when running in ES3 mode during testing\n                this.core.config.extensionConfig![this.postManager.identifier].alwaysUseXhrOverride = this.isEmulatingIe ? true : undefined;\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.ok(cbSpy.notCalled); // precondition\n                manager.teardown();\n                QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                QUnit.assert.ok(!cbSpy.args[0][3], \"listener should have been told its not a beacon request\");\n                if (this.isEmulatingIe) {\n                    QUnit.assert.ok(overrideCalled, \"The override should always be called\");\n                } else {\n                    QUnit.assert.ok(!overrideCalled, \"The override should not be called\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"payloadListener with override called during teardown and override is always called\",\n            useFakeTimers: true,\n            test: () => {\n                let overrideCalled = false;\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        overrideCalled = true;\n                        oncomplete(200, null);\n                    }\n                };\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n\n                const cbSpy = this.sandbox.spy();\n                this.core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n\n                // This stops the internal code from falling back to use sendBeacon() when running in ES3 mode during testing\n                this.core.config.extensionConfig![this.postManager.identifier].alwaysUseXhrOverride = true;\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.ok(cbSpy.notCalled); // precondition\n                manager.teardown();\n                QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                QUnit.assert.ok(!cbSpy.args[0][3], \"listener should have been told its not a beacon request\");\n                QUnit.assert.ok(overrideCalled, \"The override should always be called\");\n            }\n        });\n\n        if (!this.isEmulatingIe) {\n            this.testCase({\n                name: \"payloadListener called during teardown without xhr override using beacon for teardown\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n    \n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n    \n                    const cbSpy = this.sandbox.spy();\n                    this.core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Xhr, \"Make sure that XHR was actually selected as the transport\");\n    \n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"Make sure fetch was not called as beacons should be used for teardown\");\n                    QUnit.assert.equal(beaconCalls.length, 1, \"Expect thant sendBeacon was called\")\n                }\n            });\n\n            this.testCase({\n                name: \"SendBeacon would not drop batches when local storage is available\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return false;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n    \n                    var xhrOverride: IXHROverride = {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                            //Error code\n                            oncomplete(0, null);\n                        }\n                    };\n                    let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                   \n                    this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n    \n                    manager.sendSynchronousBatch(testBatch, EventSendType.SendBeacon);\n                    QUnit.assert.equal(this._requeueEvents.length, 0, \"Send Beacon doesn't Requeue failed events\");\n\n                    QUnit.assert.equal(beaconCalls.length, 2, \"Two Beacon attempts should have occurred\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No fetch calls should have occurred\");\n                    // Without local storage, after the second failure, baecon will be dropped\n                    QUnit.assert.equal(this._dropEvents.length, 1, \"No batches have been dropped\");\n\n                    let localStorage = new TestLocalStorageChannel();\n                    this.core.addPlugin(localStorage);\n                    let testBatch2 = EventBatch.create(\"testToken\", [this._createEvent(\"testEvent1\"), this._createEvent(\"testEvent2\"), this._createEvent(\"testEvent3\")]);\n\n                    this.clock.tick(1);\n                    \n                    manager.sendSynchronousBatch(testBatch2, EventSendType.SendBeacon);\n                    QUnit.assert.equal(this._requeueEvents.length, 0, \"Send Beacon doesn't Requeue failed events\");\n\n                    QUnit.assert.equal(beaconCalls.length, 4, \"Four Beacon attempts should have occurred\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No fetch calls should have occurred\");\n                    // With local storage, failed sending request will not cause the batch to get dropped\n                    QUnit.assert.equal(this._dropEvents.length, 1, \"This time batche will not be dropped\");\n                }\n            });\n\n            this.testCase({\n                name: \"even if local storage is available, beacon would not be dropped if successfully send\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n    \n                    var xhrOverride: IXHROverride = {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                            //Error code\n                            oncomplete(0, null);\n                        }\n                    };\n                    let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                   \n                    this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n    \n                    let localStorage = new TestLocalStorageChannel();\n                    this.core.addPlugin(localStorage);\n                    let testBatch2 = EventBatch.create(\"testToken\", [this._createEvent(\"testEvent1\"), this._createEvent(\"testEvent2\"), this._createEvent(\"testEvent3\")]);\n\n                    this.clock.tick(1);\n                    \n                    manager.sendSynchronousBatch(testBatch2, EventSendType.SendBeacon);\n                    QUnit.assert.equal(this._requeueEvents.length, 0, \"Send Beacon doesn't Requeue failed events\");\n                    // the first call would success, so should not go to the split and call again\n                    QUnit.assert.equal(beaconCalls.length, 1, \"Only one Beacon attempts should have occurred\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No fetch calls should have occurred\");\n                    // With local storage, sussefully sending request will not cause the batch to get dropped\n                    QUnit.assert.equal(this._dropEvents.length, 0, \"No batche should be dropped\");\n                }\n            });\n\n            this.testCase({\n                name: \"payloadListener called during teardown without xhr override using fetch\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: TransportType.Fetch,\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"Make sure fetch was not called as beacons should be used for teardown\");\n                    QUnit.assert.equal(beaconCalls.length, 1, \"Expect thant sendBeacon was called\")\n                }\n            });\n\n            this.testCase({\n                name: \"payloadListener called during teardown without xhr override using fetch and explicit sendBeacon\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: TransportType.Fetch,\n                        useSendBeacon: true\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.setUnloading(true);       // Simulate page unload\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"Make sure fetch was not called as beacons should be used for teardown\");\n                    QUnit.assert.equal(beaconCalls.length, 1, \"Expect thant sendBeacon was called\");\n                    QUnit.assert.ok(beaconCalls[0].url.indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                }\n            });\n\n\n            this.testCase({\n                name: \"payloadListener called during teardown without xhr override using fetch and explicit sendBeacon with addNoResponse\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: TransportType.Fetch,\n                        useSendBeacon: true,\n                        addNoResponse: false\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.setUnloading(true);       // Simulate page unload\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"Make sure fetch was not called as beacons should be used for teardown\");\n                    QUnit.assert.equal(beaconCalls.length, 1, \"Expect thant sendBeacon was called\");\n                    QUnit.assert.ok(beaconCalls[0].url.indexOf(\"NoResponseBody=\") === -1, \"Make sure NoResponseBody was NOT requested\")\n                }\n            });\n\n            this.testCase({\n                name: \"payloadListener called during teardown without xhr override and disabling sendBeacon using fetch\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: TransportType.Fetch,\n                        useSendBeacon: false\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled);   // precondition\n                    manager.setUnloading(true);         // Simulate page unload\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request (reduced payload size)\");\n                    QUnit.assert.equal(fetchCalls.length, 1, \"It should have used fetch as sendBeacon is disabled for teardown\");\n                    QUnit.assert.equal(beaconCalls.length, 0, \"Expect thant sendBeacon was not called\")\n                    QUnit.assert.ok((fetchCalls[0].input as string).indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                }\n            });\n\n            this.testCase({\n                name: \"payloadListener called during simulated unload with teardown without xhr override using fetch for unload and normal\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: TransportType.Fetch,\n                        unloadTransports: TransportType.Fetch\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.setUnloading(true);         // Simulate page unload\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(cbSpy.args[0][1].timeout, undefined, \"Timeout was undefined\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableXhrSync, false, \"disable XHRSync was false\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableFetchKeepAlive, false, \"disable fetch keep alive was false\");\n                    QUnit.assert.equal(fetchCalls.length, 1, \"It should have used fetch as we requested for teardown\");\n                    QUnit.assert.ok((fetchCalls[0].input as string).indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                    QUnit.assert.equal(beaconCalls.length, 0, \"Expect thant sendBeacon was not called\")\n                }\n            });\n\n            this.testCase({\n                name: \"payloadListener called during simulated unload with teardown without xhr override specifying fetch for unload and normal but disabling fetch keepalive\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: TransportType.Fetch,\n                        unloadTransports: TransportType.Fetch,\n                        disableFetchKeepAlive: true\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.setUnloading(true);         // Simulate page unload\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(cbSpy.args[0][1].timeout, undefined, \"Timeout was undefined\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableXhrSync, false, \"disable XHRSync was false\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableFetchKeepAlive, true, \"disable fetch keep alive was true\");\n    \n                    QUnit.assert.equal(fetchCalls.length, 0, \"It should have used fetch as we requested for teardown\");\n                    QUnit.assert.equal(beaconCalls.length, 1, \"Expect thant sendBeacon was called\")\n                    QUnit.assert.ok(beaconCalls[0].url.indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                }\n            });\n\n            this.testCase({\n                name: \"payloadListener called during teardown without send beacon and using fetch\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: [ TransportType.Fetch ],\n                        unloadTransports: [ TransportType.Fetch ]\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.setUnloading(true);         // Simulate page unload\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(cbSpy.args[0][1].timeout, undefined, \"Timeout was undefined\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableXhrSync, false, \"disable XHRSync was false\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableFetchKeepAlive, false, \"disable fetch keep alive was false\");\n                    QUnit.assert.equal(fetchCalls.length, 1, \"It should have used fetch as we requested for teardown\");\n                    QUnit.assert.ok((fetchCalls[0].input as string).indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                    QUnit.assert.equal(beaconCalls.length, 0, \"Expect thant sendBeacon was not called\")\n                }\n            });\n\n            this.testCase({\n                name: \"payloadListener called during teardown without send beacon and using fetch with noResponseBody\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                    let channelConfig: IChannelConfiguration = {\n                        transports: [ TransportType.Fetch ],\n                        unloadTransports: [ TransportType.Fetch ],\n                        addNoResponse: false\n                    };\n\n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n\n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n\n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    manager.setUnloading(true);         // Simulate page unload\n                    manager.teardown();\n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(cbSpy.args[0][2], \"listener should have been told its a sync request\");\n                    QUnit.assert.ok(cbSpy.args[0][3], \"listener should have been told its a beacon request\");\n                    QUnit.assert.equal(cbSpy.args[0][1].timeout, undefined, \"Timeout was undefined\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableXhrSync, false, \"disable XHRSync was false\");\n                    QUnit.assert.equal(cbSpy.args[0][1].disableFetchKeepAlive, false, \"disable fetch keep alive was false\");\n                    QUnit.assert.equal(fetchCalls.length, 1, \"It should have used fetch as we requested for teardown\");\n                    QUnit.assert.ok((fetchCalls[0].input as string).indexOf(\"NoResponseBody=\") === -1, \"Make sure NoResponseBody was NOT requested\")\n                    QUnit.assert.equal(beaconCalls.length, 0, \"Expect thant sendBeacon was not called\")\n                }\n            });\n        }\n\n        this.testCase({\n            name: \"payloadPreprocessor and payloadListener\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n\n                const listenerSpy = this.sandbox.spy();\n                this.core.config.extensionConfig![this.postManager.identifier].payloadListener = listenerSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.ok(hookSpy.notCalled); // precondition\n                QUnit.assert.ok(listenerSpy.notCalled); // precondition\n                manager.sendQueuedRequests();\n                QUnit.assert.ok(hookSpy.calledOnce, \"preprocessor should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(!hookSpy.args[0][2], \"preprocessor should have been told its not a sync request\");\n                QUnit.assert.ok(listenerSpy.called, \"listener requires the sendHook to call its callback\");\n                QUnit.assert.ok(listenerSpy.calledOnce, \"listener should be called via the send hook callback\");\n                QUnit.assert.ok(!listenerSpy.args[0][2], \"listener should have been told its not a sync request\");\n                QUnit.assert.ok(!listenerSpy.args[0][3], \"listener should have been told its not a beacon request\");\n            }\n        });\n\n        this.testCase({\n            name: \"payloadPreprocessor and payloadListener during teardown with override\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n\n                const listenerSpy = this.sandbox.spy();\n                this.core.config.extensionConfig![this.postManager.identifier].payloadListener = listenerSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.ok(hookSpy.notCalled); // precondition\n                QUnit.assert.ok(listenerSpy.notCalled); // precondition\n                manager.teardown();\n                QUnit.assert.ok(hookSpy.notCalled, \"preprocessor should not be called when the manager is being torn down\");\n                // QUnit.assert.ok(hookSpy.args[0][2], \"preprocessor should have been told its a sync request\");\n                QUnit.assert.ok(listenerSpy.called, \"listener should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(listenerSpy.calledOnce, \"listener should be called via the send hook callback\");\n                QUnit.assert.ok(listenerSpy.args[0][2], \"listener should have been told its a sync request\");\n                QUnit.assert.ok(!listenerSpy.args[0][3], \"listener should have been told its not a beacon request\");\n            }\n        });\n\n        this.testCase({\n            name: \"payloadPreprocessor and payloadListener during teardown without xhr override\",\n            useFakeTimers: true,\n            test: () => {\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n\n                const listenerSpy = this.sandbox.spy();\n                this.core.config.extensionConfig![this.postManager.identifier].payloadListener = listenerSpy;\n\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.ok(hookSpy.notCalled); // precondition\n                QUnit.assert.ok(listenerSpy.notCalled); // precondition\n                manager.teardown();\n                QUnit.assert.ok(hookSpy.notCalled, \"preprocessor should not be called when the manager is being torn down\");\n                QUnit.assert.ok(listenerSpy.calledOnce, \"listener should be called via the send hook callback\");\n                QUnit.assert.ok(listenerSpy.args[0][2], \"listener should have been told its a sync request\");\n                QUnit.assert.ok(listenerSpy.args[0][3], \"listener should have been told its a beacon request\");\n            }\n        });\n\n        this.testCase({\n            name: \"sendSynchronousRequest\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                let xhrOverrideSpy = this.sandbox.spy(xhrOverride, \"sendPOST\");\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No events sent yet\");\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.equal(this._sendEvents.length, 1, \"No events sent yet\");\n                QUnit.assert.equal(xhrOverrideSpy.called, true);\n                QUnit.assert.equal(this._requeueEvents.length, 0);\n                QUnit.assert.equal(this._sendEvents.length, 1);\n                QUnit.assert.equal(this._sentEvents.length, 1);\n                var overrideArgs = xhrOverrideSpy.getCall(0).args;\n                QUnit.assert.notEqual(overrideArgs[0].urlString, \"\");\n                QUnit.assert.equal(overrideArgs[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1);\n                this.clock.tick(1);\n                QUnit.assert.equal(this._requeueEvents.length, 0);\n                QUnit.assert.equal(this._sendEvents.length, 1);\n                QUnit.assert.equal(this._sentEvents.length, 1);\n            }\n        });\n\n        this.testCase({\n            name: \"Validate synchronous event with 299 response\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        // Error code\n                        oncomplete(299, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch);\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"Requeue got called once\");\n                var addBackRequestArg: EventBatch = this._requeueEvents[0].batches[0];\n                QUnit.assert.equal(addBackRequestArg.count(), 1);\n                QUnit.assert.equal(addBackRequestArg.events()[0].name, \"testEvent\");\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch Credentials config could be set from post channel and pass into sendPostManager\",\n            useFakeTimers: true,\n            test: () => {\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].fetchCredentials = \"omit\";\n                this.core.config.endpointUrl = \"testEndpoint\";\n                this.core.config.extensionConfig![this.postManager.identifier].alwaysUseXhrOverride = false;\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[4].fetchCredentials, \"omit\", \"Fetch credentials should be set to omit\");\n            }\n        });\n        this.testCase({\n            name: \"Validate synchronous event with zero response - Default Send Type (Synchronous)\",\n            useFakeTimers: true,\n            test: () => {\n                let beaconCalls = [];\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n                var fetchCalls = this.hookFetch((resolve) => {\n                    setTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(0, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch);\n                // Once requeued HttpManager has handed responsibility of the batch back to the \"listener\" (PostChannel)\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"Requeue got called once\");\n\n                var addBackRequestArg: EventBatch = this._requeueEvents[0].batches[0];\n                QUnit.assert.equal(addBackRequestArg.count(), 1);\n                QUnit.assert.equal(addBackRequestArg.events()[0].name, \"testEvent\");\n\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon calls should have occurred\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No fetch calls should have occurred\");\n\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n            }\n        });\n\n        if (!this.isEmulatingIe) {\n            this.testCase({\n                name: \"Validate synchronous event with failed response - Explicit Send Type (SendBeacon)\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return false;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n    \n                    var xhrOverride: IXHROverride = {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                            //Error code\n                            oncomplete(0, null);\n                        }\n                    };\n                        let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n    \n                    manager.sendSynchronousBatch(testBatch, EventSendType.SendBeacon);\n                    QUnit.assert.equal(this._requeueEvents.length, 0, \"Send Beacon doesn't Requeue failed events\");\n    \n                    QUnit.assert.equal(beaconCalls.length, 2, \"Two Beacon attempts should have occurred\");\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No fetch calls should have occurred\");\n                    QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                    QUnit.assert.equal(this._sentEvents.length, 1, \"No batches Completed yet\");\n                    // The 2nd failed will cause the batch to get dropped\n                    QUnit.assert.equal(this._dropEvents.length, 1, \"One batches have been dropped\");\n                }\n            });\n        }\n\n        this.testCase({\n            name: \"Validate synchronous event with zero response always using the override - Explicit Send Type (SendBeacon)\",\n            useFakeTimers: true,\n            test: () => {\n                let beaconCalls = [];\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n                var fetchCalls = this.hookFetch((resolve) => {\n                    setTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(0, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n\n                this.core.config.extensionConfig![this.postManager.identifier].alwaysUseXhrOverride = true;\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch, EventSendType.SendBeacon);\n                // Once Requeued HttpManager hands responsibility of the batch back to the PostChannel\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"The httpXhrOverride will Requeue\");\n\n                var addBackRequestArg: EventBatch = this._requeueEvents[0].batches[0];\n                QUnit.assert.equal(addBackRequestArg.count(), 1);\n                QUnit.assert.equal(addBackRequestArg.events()[0].name, \"testEvent\");\n\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon calls should have occurred\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No fetch calls should have occurred\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate synchronous event with delayed failed response - Explicit Send Type (SyncFetch)\",\n            useFakeTimers: true,\n            test: () => {\n                let beaconCalls = [];\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 1);\n                });\n\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(0, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch, EventSendType.SyncFetch);\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"wE need to wait for the response to get processed\");\n                QUnit.assert.equal(fetchCalls.length, 1, \"We should have performed a fetch call\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"Only unload reason causes the batch to be considered successful!\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n\n                // This would have caused a \"Retry\"\n                let retryAttempt = 0;\n                /// Trigger the retry as it's random we need to loop\n                while (retryAttempt < 4000 && this._sendEvents.length === 1) {\n                    this.clock.tick(100);\n                    retryAttempt += 100;\n                }\n                \n\n                this.clock.tick(100);\n\n                // Nothing should have occurred\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"A Sync Fetch eventually requeues should occur unless it was an unload\");\n                QUnit.assert.equal(fetchCalls.length, 1, \"We should have performed a fetch call\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"Only unload reason causes the batch to be considered successful!\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate synchronous event with delayed failed response but simulating unload - Explicit Send Type (SyncFetch)\",\n            useFakeTimers: true,\n            test: () => {\n                let beaconCalls = [];\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 1);\n                });\n\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(0, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch, EventSendType.SyncFetch, SendRequestReason.Unload);\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"A Sync Fetch during unload acts like sendBeacon() -- ignores response so no requeue should occur\");\n                QUnit.assert.equal(fetchCalls.length, 1, \"We should have performed a fetch call\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"A sync Fetch during an unload is considered successful!\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n\n                this.clock.tick(100);\n\n                // Nothing should have occurred\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"A Sync Fetch during unload acts like sendBeacon() -- ignores response so no requeue should occur\");\n                QUnit.assert.equal(fetchCalls.length, 1, \"We should have performed a fetch call\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"A sync Fetch during an unload is considered successful!\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate synchronous event with immediate reject - Explicit Send Type (SyncFetch)\",\n            useFakeTimers: true,\n            test: () => {\n                let beaconCalls = [];\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    reject();\n                });\n\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(0, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch, EventSendType.SyncFetch);\n                QUnit.assert.equal(fetchCalls.length, 1, \"We should have performed a fetch call\");\n\n                // An immediate failure should requeue the events and once requeued HttpManager has handed responsibility of the batch back to the \"listener\" (PostChannel)\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"Requeue got called once\");\n\n                var addBackRequestArg: EventBatch = this._requeueEvents[0].batches[0];\n                QUnit.assert.equal(addBackRequestArg.count(), 1);\n                QUnit.assert.equal(addBackRequestArg.events()[0].name, \"testEvent\");\n\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon calls should have occurred\");\n                QUnit.assert.equal(fetchCalls.length, 1, \"No fetch calls should have occurred\");\n\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n\n                /// Move forward to trigger and possible the 2nd timeout (which should not occur)\n                this.clock.tick(5000);\n\n                // Still No additional retries should occur\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon calls should have occurred\");\n                QUnit.assert.equal(fetchCalls.length, 1, \"No fetch calls should have occurred\");\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"It did not get Requeue again\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"Batches should have been dropped\");\n            }\n        });\n\n        this.testCase({\n            name: \"retry synchronous event with zero response always use override - Default Send Type (SyncFetch)\",\n            useFakeTimers: true,\n            test: () => {\n                let beaconCalls = [];\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n                var fetchCalls = this.hookFetch((resolve) => {\n                    setTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(0, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n\n                this.core.config.extensionConfig![this.postManager.identifier].alwaysUseXhrOverride = true;\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch, EventSendType.SendBeacon);\n                // Once Requeued HttpManager hands responsibility of the batch back to the PostChannel\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"The httpXhrOverride will Requeue\");\n\n                var addBackRequestArg: EventBatch = this._requeueEvents[0].batches[0];\n                QUnit.assert.equal(addBackRequestArg.count(), 1);\n                QUnit.assert.equal(addBackRequestArg.events()[0].name, \"testEvent\");\n\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon calls should have occurred\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No fetch calls should have occurred\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n            }\n        });\n\n        this.testCase({\n            name: \"retry synchronous event with zero response - Default Send Type (Batched)\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(0, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendSynchronousBatch(testBatch, EventSendType.Batched);\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"Normal batched events cause a retry and not a requeue\");\n\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n\n                let retryAttempt = 0;\n                /// Trigger the retry as it's random we need to loop (initial send plus retry send)\n                while (retryAttempt < 40 && this._sendEvents.length < 2) {\n                    this.clock.tick(100);\n                    retryAttempt += 1;\n                }\n                \n                QUnit.assert.equal(this._requeueEvents.length, 1, \"It got Requeued\");\n                QUnit.assert.equal(this._sendEvents.length, 2, \"And it got sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n            }\n        });\n\n        this.testCase({\n            name: \"sendQueuedRequests with override\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                let xhrOverrideSpy = this.sandbox.spy(xhrOverride, \"sendPOST\");\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.addBatch(testBatch);\n                manager.sendQueuedRequests();\n                QUnit.assert.equal(xhrOverrideSpy.called, true);\n                QUnit.assert.equal(this._requeueEvents.length, 0);\n                var overrideArgs = xhrOverrideSpy.getCall(0).args;\n                QUnit.assert.notEqual(overrideArgs[0].urlString, \"\");\n                QUnit.assert.equal(overrideArgs[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1);\n            }\n        });\n\n        this.testCase({\n            name: \"sendQueuedRequests with fetch\",\n            useFakeTimers: true,\n            test: () => {\n                var fetchCalls = this.hookFetch((resolve) => {\n                    setTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                this.core.config.extensionConfig![this.postManager.identifier].transports = TransportType.Fetch;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.ok(manager[\"_getDbgPlgTargets\"]()[0], \"Make sure that there is a transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that the transport type is fetch\");\n\n                manager.addBatch(testBatch);\n                manager.sendQueuedRequests();\n                QUnit.assert.equal(fetchCalls.length, 1);\n                QUnit.assert.equal(this._requeueEvents.length, 0);\n                QUnit.assert.notEqual(fetchCalls[0].input, \"\");\n                QUnit.assert.equal(fetchCalls[0].init.body, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1);\n            }\n        });\n\n        if (!this.isEmulatingIe) {\n            this.testCase({\n                name: \"sendQueuedRequests with beacons\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                        let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    this.core.config.extensionConfig![this.postManager.identifier].transports = TransportType.Beacon;\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    QUnit.assert.ok(manager[\"_getDbgPlgTargets\"]()[0], \"Make sure that there is a transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Beacon, \"Make sure that the transport type is Beacon\");\n\n                    manager.addBatch(testBatch);\n                    manager.sendQueuedRequests();\n                    QUnit.assert.equal(fetchCalls.length, 0);\n                    QUnit.assert.equal(beaconCalls.length, 1);\n                    QUnit.assert.equal(this._requeueEvents.length, 0);\n                    QUnit.assert.notEqual(beaconCalls[0].url, \"\");\n                    QUnit.assert.equal(beaconCalls[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1);\n                }\n            });\n\n            this.testCase({\n                name: \"sendQueuedRequests with beacons with splitting\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n\n                        if (beaconCalls.length === 1) {\n                            // fail the first request so it gets split and resent\n                            return false;\n                        }\n\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                        let testBatch = EventBatch.create(\"testToken\", [this._createEvent(\"testEvent1\"), this._createEvent(\"testEvent2\"), this._createEvent(\"testEvent3\")]);\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    this.core.config.extensionConfig![this.postManager.identifier].transports = TransportType.Beacon;\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    QUnit.assert.ok(manager[\"_getDbgPlgTargets\"]()[0], \"Make sure that there is a transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Beacon, \"Make sure that the transport type is Beacon\");\n\n                    manager.addBatch(testBatch);\n                    manager.sendQueuedRequests();\n                    QUnit.assert.equal(fetchCalls.length, 0);\n                    QUnit.assert.equal(beaconCalls.length, 4);\n                    QUnit.assert.equal(this._requeueEvents.length, 0);\n                    QUnit.assert.notEqual(beaconCalls[0].url, \"\");\n                    QUnit.assert.equal(beaconCalls[0].data, \"{\\\"name\\\":\\\"testEvent1\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\\n{\\\"name\\\":\\\"testEvent2\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\\n{\\\"name\\\":\\\"testEvent3\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1);\n                    QUnit.assert.notEqual(beaconCalls[1].url, \"\");\n                    QUnit.assert.equal(beaconCalls[1].data, \"{\\\"name\\\":\\\"testEvent1\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.notEqual(beaconCalls[2].url, \"\");\n                    QUnit.assert.equal(beaconCalls[2].data, \"{\\\"name\\\":\\\"testEvent2\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.notEqual(beaconCalls[3].url, \"\");\n                    QUnit.assert.equal(beaconCalls[3].data, \"{\\\"name\\\":\\\"testEvent3\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                }\n            });\n        }\n\n        this.testCase({\n            name: \"w parameter\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                let xhrOverrideSpy = this.sandbox.spy(xhrOverride, \"sendPOST\");\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                this.core.getWParam = () => {\n                    return 0;\n                }\n                manager.sendSynchronousBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.equal(xhrOverrideSpy.called, true);\n                var overrideArgs = xhrOverrideSpy.getCall(0).args;\n                QUnit.assert.ok(overrideArgs[0].urlString.indexOf(\"w=0\") > -1);\n                // w parameter is updated correctly\n                this.core.getWParam = () => {\n                    return 2;\n                }\n                manager.sendSynchronousBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                overrideArgs = xhrOverrideSpy.getCall(1).args;\n                QUnit.assert.ok(overrideArgs[0].urlString.indexOf(\"w=2\") > -1);\n            }\n        });\n\n        this.testCase({\n            name: \"MSFPC test\",\n            useFakeTimers: true,\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        oncomplete(200, null);\n                    }\n                };\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                let xhrOverrideSpy = this.sandbox.spy(xhrOverride, \"sendPOST\");\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                var testEvent = {\n                    name: \"testEvent\",\n                    ext: {}\n                };\n                testEvent.ext[\"intweb\"] = {};\n                testEvent.ext[\"intweb\"][\"msfpc\"] = \"testMSFPC\";\n                manager.sendSynchronousBatch(EventBatch.create(\"testToken\", [testEvent]));\n                QUnit.assert.equal(xhrOverrideSpy.called, true);\n                var overrideArgs = xhrOverrideSpy.getCall(0).args;\n                QUnit.assert.ok(overrideArgs[0].urlString.indexOf(\"ext.intweb.msfpc\") > -1);\n                // MSFPC not added in query string if not available in the event\n                manager.sendSynchronousBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                overrideArgs = xhrOverrideSpy.getCall(1).args;\n                QUnit.assert.ok(overrideArgs[0].urlString.indexOf(\"ext.intweb.msfpc\") === -1);\n            }\n        });\n\n        this.testCase({\n            name: \"retry not synchronous event\",\n            test: () => {\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData,\n                        oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        //Error code\n                        oncomplete(299, null);\n                    }\n                };\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                \n                manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                this.xhrOverrideSpy = this.sandbox.spy(xhrOverride, \"sendPOST\");\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                manager.sendQueuedRequests();\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (!this.xhrOverrideSpy.called || this.xhrOverrideSpy.callCount < 2) {\n                        // Wait for the expectations to be met\n                        return false;\n                    }\n\n                    QUnit.assert.equal(this.xhrOverrideSpy.called, true);\n                    QUnit.assert.equal(this.xhrOverrideSpy.callCount, 2);\n                    var secondEventArg = this.xhrOverrideSpy.getCall(1).args[0].urlString;\n                    QUnit.assert.notEqual(secondEventArg, null);\n\n                    return true;\n                }, \"Wait for events to send \", 10));\n            }\n        });\n\n        if (!this.isEmulatingIe) {\n            this.testCase({\n                name: \"sendQueuedRequests with beacons once unload is detected\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                        let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    manager.setUnloading(true);\n                    QUnit.assert.ok(manager[\"_getDbgPlgTargets\"]()[0], \"Make sure that there is a transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Xhr, \"Make sure that the transport type is Xhr\");\n\n                    manager.addBatch(testBatch);\n                    manager.sendQueuedRequests();\n                    QUnit.assert.equal(fetchCalls.length, 0);\n                    QUnit.assert.equal(beaconCalls.length, 1);\n                    QUnit.assert.equal(this._requeueEvents.length, 0);\n                    QUnit.assert.notEqual(beaconCalls[0].url, \"\");\n                    QUnit.assert.ok(beaconCalls[0].url.indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                    QUnit.assert.equal(beaconCalls[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1);\n                }\n            });\n\n            this.testCase({\n                name: \"sendQueuedRequests with beacons and splitting once unload is detected\",\n                useFakeTimers: true,\n                test: () => {\n                    let beaconCalls = [];\n                    this.hookSendBeacon((url, data) => {\n                        beaconCalls.push({\n                            url,\n                            data,\n                        });\n\n                        if (beaconCalls.length === 1) {\n                            // fail the first request so it gets split and resent\n                            return false;\n                        }\n\n                        return true;\n                    });\n                    var fetchCalls = this.hookFetch((resolve) => {\n                        setTimeout(function() {\n                            resolve();\n                        }, 0);\n                    });\n\n                        let testBatch = EventBatch.create(\"testToken\", [this._createEvent(\"testEvent1\"), this._createEvent(\"testEvent2\"), this._createEvent(\"testEvent3\")]);\n                    var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    this.core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(this.core.config, this.core, this.postManager);\n                    // Simulate sending with beacons\n                    manager.setUnloading(true);\n                    QUnit.assert.ok(manager[\"_getDbgPlgTargets\"]()[0], \"Make sure that there is a transport\");\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Xhr, \"Make sure that the transport type is Xhr\");\n\n                    manager.addBatch(testBatch);\n                    manager.sendQueuedRequests();\n                    QUnit.assert.equal(fetchCalls.length, 0);\n                    QUnit.assert.equal(beaconCalls.length, 4);\n                    QUnit.assert.equal(this._requeueEvents.length, 0);\n                    QUnit.assert.notEqual(beaconCalls[0].url, \"\");\n                    QUnit.assert.ok(beaconCalls[0].url.indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                    QUnit.assert.equal(beaconCalls[0].data, \"{\\\"name\\\":\\\"testEvent1\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\\n{\\\"name\\\":\\\"testEvent2\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\\n{\\\"name\\\":\\\"testEvent3\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.equal(testBatch.events()[0].sendAttempt, 1);\n                    QUnit.assert.notEqual(beaconCalls[1].url, \"\");\n                    QUnit.assert.ok(beaconCalls[1].url.indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                    QUnit.assert.equal(beaconCalls[1].data, \"{\\\"name\\\":\\\"testEvent1\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.notEqual(beaconCalls[2].url, \"\");\n                    QUnit.assert.ok(beaconCalls[2].url.indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                    QUnit.assert.equal(beaconCalls[2].data, \"{\\\"name\\\":\\\"testEvent2\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                    QUnit.assert.notEqual(beaconCalls[3].url, \"\");\n                    QUnit.assert.ok(beaconCalls[3].url.indexOf(\"NoResponseBody=\") !== -1, \"Make sure NoResponseBody was requested\")\n                    QUnit.assert.equal(beaconCalls[3].data, \"{\\\"name\\\":\\\"testEvent3\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                }\n            });\n        }\n\n        this.testCase({\n            name: \"Validate that override and preprocessor receives timeout and disableXhr config settings with defaults\",\n            useFakeTimers: true,\n            test: () => {\n                let sentPayloadData = [];\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData, oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        \n                        sentPayloadData.push({\n                            payload,\n                            sync\n                        });\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                manager.sendSynchronousBatch(testBatch);\n                // Notifications are sent asynchronously\n                QUnit.assert.equal(this._sendEvents.length, 1, \"batches sent\");\n                QUnit.assert.equal(this._sentEvents.length, 1, \"batches Completed\");\n\n                QUnit.assert.equal(this._hookCalls.length, 1, \"Hook data got the payload\");\n                QUnit.assert.equal(this._hookCalls[0].payload.timeout, undefined, \"Timeout was undefined\");\n                QUnit.assert.equal(this._hookCalls[0].payload.disableXhrSync, false, \"disable XHRSync was false\");\n                QUnit.assert.equal(this._hookCalls[0].payload.disableFetchKeepAlive, false, \"disable fetch keep alive was false\");\n\n                QUnit.assert.equal(sentPayloadData.length, 1, \"Sent payload data got the payload\");\n                QUnit.assert.equal(sentPayloadData[0].sync, true, \"This should have been a synchronous request\");\n                QUnit.assert.equal(sentPayloadData[0].payload.timeout, undefined, \"Timeout was undefined\");\n                QUnit.assert.equal(sentPayloadData[0].payload.disableXhrSync, false, \"disable XHRSync was false\");\n                QUnit.assert.equal(this._hookCalls[0].payload.disableFetchKeepAlive, false, \"disable fetch keep alive was false\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that override and preprocessor receives timeout and disableXhr config settings with not disabled\",\n            useFakeTimers: true,\n            test: () => {\n                let sentPayloadData = [];\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData, oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        \n                        sentPayloadData.push({\n                            payload,\n                            sync\n                        });\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].disableXhrSync = false;\n                this.core.config.extensionConfig![this.postManager.identifier].xhrTimeout = 1000;\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.equal(this._hookCalls.length, 0, \"Nothing should be sent yet\");\n                manager.sendSynchronousBatch(testBatch);\n\n                QUnit.assert.equal(this._hookCalls.length, 1, \"Hook data got the payload\");\n                QUnit.assert.equal(this._hookCalls[0].payload.timeout, 1000, \"Timeout was undefined\");\n                QUnit.assert.equal(this._hookCalls[0].payload.disableXhrSync, false, \"disable XHRSync was undefined\");\n\n                QUnit.assert.equal(sentPayloadData.length, 1, \"Sent payload data got the payload\");\n                QUnit.assert.equal(sentPayloadData[0].sync, true, \"Should have been a synchronous request\");\n                QUnit.assert.equal(sentPayloadData[0].payload.timeout, 1000, \"Timeout was undefined\");\n                QUnit.assert.equal(sentPayloadData[0].payload.disableXhrSync, false, \"disable XHRSync was undefined\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that override and preprocessor receives timeout and disableXhr config settings with not disabled\",\n            useFakeTimers: true,\n            test: () => {\n                let sentPayloadData = [];\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData, oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                        \n                        sentPayloadData.push({\n                            payload,\n                            sync\n                        });\n                        oncomplete(200, null);\n                    }\n                };\n\n                let testBatch = EventBatch.create(\"testToken\", [this._createEvent()]);\n\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n\n                const hookSpy = this.sandbox.spy(_sendHook);\n                this.core.config.extensionConfig![this.postManager.identifier].payloadPreprocessor = hookSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].disableXhrSync = true;\n                this.core.config.extensionConfig![this.postManager.identifier].xhrTimeout = 2000;\n                this.core.config.extensionConfig![this.postManager.identifier].httpXHROverride = xhrOverride;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0], xhrOverride, \"Make sure that the override is used as the internal transport\");\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, undefined, \"Make sure that no transport value is defined\");\n\n                QUnit.assert.equal(this._hookCalls.length, 0, \"Nothing should be called yet\");\n                manager.sendSynchronousBatch(testBatch);\n\n                QUnit.assert.equal(this._hookCalls.length, 1, \"Hook data got the payload\");\n                QUnit.assert.equal(this._hookCalls[0].payload.timeout, 2000, \"Timeout was undefined\");\n                QUnit.assert.equal(this._hookCalls[0].payload.disableXhrSync, true, \"disable XHRSync was undefined\");\n\n                QUnit.assert.equal(sentPayloadData.length, 1, \"Sent payload data got the payload\");\n                QUnit.assert.equal(sentPayloadData[0].sync, true, \"Should have been a synchronous request\");\n                QUnit.assert.equal(sentPayloadData[0].payload.timeout, 2000, \"Timeout was undefined\");\n                QUnit.assert.equal(sentPayloadData[0].payload.disableXhrSync, true, \"disable XHRSync was undefined\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate timeout with Xhr\",\n            useFakeTimers: true,\n            test: () => {\n                var manager: HttpManager = new HttpManager(500, 2, 1, {\n                    requeue: _requeueNotification,\n                    send: _sendNotification,\n                    sent: _sentNotification,\n                    drop: _dropNotification\n                });\n                \n                const cbSpy = this.sandbox.spy();\n                this.core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n\n                this.core.config.extensionConfig![this.postManager.identifier].xhrTimeout = 500;\n                this.core.config.endpointUrl = \"testEndpoint\";\n                manager.initialize(this.core.config, this.core, this.postManager);\n                QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Xhr, \"Make sure that XHR was actually selected as the transport\");\n\n                manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                QUnit.assert.ok(cbSpy.notCalled); // precondition\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"No batches requeued\");\n                QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n                manager.sendQueuedRequests(EventSendType.Batched);\n                this.clock.tick(100);\n\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"No batches requeued\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n\n                QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                QUnit.assert.ok(!cbSpy.args[0][2], \"listener should have been told its not a sync request\");\n                QUnit.assert.ok(!cbSpy.args[0][3], \"listener should have been told its not a beacon request\");\n\n                /// Move forward to trigger the \"timeout\" and notifications\n                this.clock.tick(400);\n\n                QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n\n                QUnit.assert.equal(this._requeueEvents.length, 0, \"No batches requeued\");\n                QUnit.assert.equal(this._sendEvents.length, 1, \"A batch has been sent\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n\n                let retryAttempt = 0;\n                /// Trigger the retry as it's random we need to loop\n                while (retryAttempt< 4000 && this._requeueEvents.length < 2) {\n                    this.clock.tick(100);\n                    retryAttempt += 1;\n                }\n                    \n                QUnit.assert.equal(cbSpy.callCount, 2, \"listener should be called when the manager makes an HTTP request\");\n\n                QUnit.assert.equal(this._sendEvents.length, 2, \"A batch has been sent twice (initial and retry)\");\n                QUnit.assert.equal(this._requeueEvents.length, 1, \"After the retry the events where requeued\");\n                QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                QUnit.assert.equal(this._dropEvents.length, 0, \"Events where not dropped\");\n            }\n        });\n\n        if (!this.isEmulatingIe) {\n            this.testCase({\n                name: \"Validate timeout with fetch\",\n                useFakeTimers: true,\n                test: () => {\n                    var fetchCalls = this.hookFetch((_resolve) => {\n                        // Do nothing to simulate no response\n                    });\n    \n                    let channelConfig: IChannelConfiguration = {\n                        transports: TransportType.Fetch,\n                        xhrTimeout: 500\n                    };\n    \n                    let core = new AppInsightsExtCore();\n                    var config: IExtendedConfiguration = {\n                        instrumentationKey: \"\",\n                        extensionConfig: {\n                            \"PostChannel\": channelConfig\n                        }\n                    };\n    \n                    let postManager = new PostChannel();\n                    core.initialize(config, [postManager]);\n    \n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n\n                        var manager: HttpManager = new HttpManager(500, 2, 1, {\n                        requeue: _requeueNotification,\n                        send: _sendNotification,\n                        sent: _sentNotification,\n                        drop: _dropNotification\n                    });\n                    const cbSpy = this.sandbox.spy();\n                    core.config.extensionConfig![this.postManager.identifier].payloadListener = cbSpy;\n    \n                    core.config.endpointUrl = \"testEndpoint\";\n                    manager.initialize(core.config, core, postManager);\n                    QUnit.assert.equal(manager[\"_getDbgPlgTargets\"]()[0]._transport, TransportType.Fetch, \"Make sure that fetch was actually selected as the transport\");\n    \n                    manager.addBatch(EventBatch.create(\"testToken\", [this._createEvent()]));\n                    QUnit.assert.ok(cbSpy.notCalled); // precondition\n                    QUnit.assert.equal(this._requeueEvents.length, 0, \"No batches requeued\");\n                    QUnit.assert.equal(this._sendEvents.length, 0, \"No batches sent yet\");\n                    QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                    QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n    \n                    manager.sendQueuedRequests(EventSendType.Batched);\n                    this.clock.tick(100);\n    \n                    QUnit.assert.equal(this._sendEvents.length, 1, \"One send attempt sent\");\n                    QUnit.assert.equal(this._requeueEvents.length, 0, \"No batches requeued\");\n                    QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                    QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n    \n                    QUnit.assert.ok(cbSpy.calledOnce, \"listener should be called when the manager makes an HTTP request\");\n                    QUnit.assert.ok(!cbSpy.args[0][2], \"listener should have been told its not a sync request\");\n                    QUnit.assert.ok(!cbSpy.args[0][3], \"listener should have been told its not a beacon request\");\n                    QUnit.assert.equal(fetchCalls.length, 1, \"Make sure fetch was called\");\n    \n                    let retryAttempt = 0;\n                    /// Trigger the retry as it's random we need to loop\n                    while (retryAttempt < 4000 && cbSpy.callCount === 1) {\n                        this.clock.tick(100);\n                        retryAttempt += 1;\n                    }\n                        \n                    QUnit.assert.equal(cbSpy.callCount, 2, \"listener should be called when the manager makes an HTTP request\");\n\n                    QUnit.assert.equal(this._sendEvents.length, 2, \"A batch has been sent\");\n                    QUnit.assert.equal(this._requeueEvents.length, 0, \"Batche was requeued\");\n                    QUnit.assert.equal(this._sentEvents.length, 0, \"No batches Completed yet\");\n                    QUnit.assert.equal(this._dropEvents.length, 0, \"No batches have been dropped\");\n                    QUnit.assert.equal(fetchCalls.length, 2, \"Make sure fetch was called\");\n                }\n            });\n\n            this.testCase({\n                name: \"HttpManager: RetryPolicy works as expected\",\n                useFakeTimers: true,\n                test: () => {\n                    // according to the one collector policy\n                    // status that should retry : 429, 500, 503\n                    // status that should not retry : 204 (will return complete before checking retry in httpManager), 400, 401, 403, 408, 415, 501, 505\n                    QUnit.assert.equal(true, retryPolicyShouldRetryForStatus(429), \"status code 429 should retry\");\n                    QUnit.assert.equal(true, retryPolicyShouldRetryForStatus(500), \"status code 500 should retry\");\n                    QUnit.assert.equal(true, retryPolicyShouldRetryForStatus(503), \"status code 503 should retry\");\n                    QUnit.assert.equal(false, retryPolicyShouldRetryForStatus(400), \"status code 400 should not retry\");\n                    QUnit.assert.equal(false, retryPolicyShouldRetryForStatus(401), \"status code 401 should not retry\");\n                    QUnit.assert.equal(false, retryPolicyShouldRetryForStatus(403), \"status code 403 should not retry\");\n                    QUnit.assert.equal(false, retryPolicyShouldRetryForStatus(408), \"status code 408 should not retry\");\n                    QUnit.assert.equal(false, retryPolicyShouldRetryForStatus(415), \"status code 415 should not retry\");\n                    QUnit.assert.equal(false, retryPolicyShouldRetryForStatus(501), \"status code 501 should not retry\");\n                    QUnit.assert.equal(false, retryPolicyShouldRetryForStatus(505), \"status code 505 should not retry\");\n                }\n            });\n    \n        }\n    }\n\n    private _createEvent(name = \"testEvent\") {\n        var testEvent: IPostTransmissionTelemetryItem = {\n            sendAttempt: 0,\n            name: name\n        };\n\n        return testEvent;\n    }\n}\n\nclass TestLocalStorageChannel extends BaseTelemetryPlugin implements IPlugin {\n    processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext | undefined): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    public identifier: string = \"LocalStorage\";    \n    \n}"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/KillSwitchTest.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { IKillSwitch, createKillSwitch } from '../../../src/KillSwitch';\n\nexport class KillSwitchTest extends AITestClass {\n\n    public testInitialize() {\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: 'check basic kill switch',\n            test: () => {\n                let killSwitch = createKillSwitch();\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"test-tenant\"), false, \"tenant should not be listed\");\n\n                let theRequest = killSwitch.setKillSwitchTenants(\"tenant1\", \"1000\");\n                QUnit.assert.equal(theRequest.length, 0);\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"test-tenant\"), false, \"tenant should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), true, \"tenant1 should be listed\");\n\n                theRequest = killSwitch.setKillSwitchTenants(\"tenant2\", \"1000\");\n                QUnit.assert.equal(theRequest.length, 0);\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"test-tenant\"), false, \"tenant should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), true, \"tenant1 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), true, \"tenant2 should be listed\");\n            }\n        });\n\n        this.testCase({\n            name: 'check basic kill switch with expiry',\n            useFakeTimers: true,\n            test: () => {\n                let killSwitch = createKillSwitch();\n\n                let theRequest = killSwitch.setKillSwitchTenants(\"tenant1\", \"1\");\n                QUnit.assert.equal(theRequest.length, 0);\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), true, \"tenant1 should be listed\");\n\n                theRequest = killSwitch.setKillSwitchTenants(\"tenant2\", \"2\");\n                QUnit.assert.equal(theRequest.length, 0);\n\n                this.clock.tick(999);\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), true, \"tenant1 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), true, \"tenant2 should be listed\");\n\n                this.clock.tick(1);\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), false, \"tenant1 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), true, \"tenant2 should be listed\");\n\n                this.clock.tick(1000);\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), false, \"tenant1 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), false, \"tenant2 should be listed\");\n            }\n        });\n\n        this.testCase({\n            name: 'check kill switch for this request only',\n            test: () => {\n                let killSwitch = createKillSwitch();\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"test-tenant\"), false, \"tenant should not be listed\");\n\n                let theRequest = killSwitch.setKillSwitchTenants(\"tenant1\", \"this-request-only\");\n                QUnit.assert.equal(theRequest.length, 1);\n                QUnit.assert.equal(theRequest[0], \"tenant1\");\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"test-tenant\"), false, \"tenant should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), false, \"tenant should not be listed\");\n            }\n        });\n\n        this.testCase({\n            name: 'check multiple tenants kill switch',\n            test: () => {\n                let killSwitch = createKillSwitch();\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"test-tenant\"), false, \"tenant should not be listed\");\n\n                let theRequest = killSwitch.setKillSwitchTenants(\"tenant1,tenant2\", \"1000\");\n                QUnit.assert.equal(theRequest.length, 0);\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"test-tenant\"), false, \"tenant should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), true, \"tenant1 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), true, \"tenant2 should be listed\");\n            }\n        });\n\n        this.testCase({\n            name: 'check multiple tenants kill switch with expiry',\n            useFakeTimers: true,\n            test: () => {\n                let killSwitch = createKillSwitch();\n\n                let theRequest = killSwitch.setKillSwitchTenants(\"tenant1,tenant2\", \"1\");\n                QUnit.assert.equal(theRequest.length, 0);\n\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), true, \"tenant1 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), true, \"tenant2 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant3\"), false, \"tenant3 should not be listed\");\n\n                theRequest = killSwitch.setKillSwitchTenants(\"tenant3\", \"3\");\n                QUnit.assert.equal(theRequest.length, 0);\n\n                this.clock.tick(999);\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), true, \"tenant1 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), true, \"tenant2 should be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant3\"), true, \"tenant3 should be listed\");\n\n                this.clock.tick(1);\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), false, \"tenant1 should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), false, \"tenant2 should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant3\"), true, \"tenant3 should be listed\");\n\n                this.clock.tick(2000);\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant1\"), false, \"tenant1 should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant2\"), false, \"tenant2 should not be listed\");\n                QUnit.assert.equal(killSwitch.isTenantKilled(\"tenant3\"), false, \"tenant3 should not be listed\");\n            }\n        });\n\n        this.testCase({\n            name: 'check whitespace kill switch',\n            test: () => {\n                let killSwitch = createKillSwitch();\n\n                let tenant1Checks: string[] = [\n                    \"tenant1\",\n                    \"tenant1 \",\n                    \" tenant1\",\n                    \" tenant1 \",\n                    \"tenant1\\r\",\n                    \"tenant1\\n\",\n                    \"tenant1\\r\\n\",\n                    \"\\rtenant1\",\n                    \"\\r\\ntenant1\",\n                    \"\\rtenant1\\r\\n\",\n                    \"\\r\\ntenant1\\r\\n\"\n                ];\n\n                let tenant2Checks: string[] = [\n                    \"tenant2\",\n                    \"tenant2 \",\n                    \" tenant2\",\n                    \" tenant2 \",\n                    \"tenant2\\r\",\n                    \"tenant2\\n\",\n                    \"tenant2\\r\\n\",\n                    \"\\rtenant2\",\n                    \"\\r\\ntenant2\",\n                    \"\\rtenant2\\r\\n\",\n                    \"\\r\\ntenant2\\r\\n\"\n                ];\n\n                tenant1Checks.forEach((tenant1) => {\n                    let killSwitch = createKillSwitch();\n                    let theRequest = killSwitch.setKillSwitchTenants(tenant1, \"1000\");\n                    QUnit.assert.equal(theRequest.length, 0);\n    \n                    tenant2Checks.forEach((tenant2) => {\n                        theRequest = killSwitch.setKillSwitchTenants(tenant2, \"1000\");\n                        QUnit.assert.equal(theRequest.length, 0);\n        \n                        tenant1Checks.forEach((value) => {\n                            QUnit.assert.equal(killSwitch.isTenantKilled(value), true, \"tenant1 should be listed from [\" + tenant1 + \"] with [\" + value + \"]\");\n                        });\n        \n                        tenant2Checks.forEach((value) => {\n                            QUnit.assert.equal(killSwitch.isTenantKilled(value), true, \"tenant2 should be listed from [\" + tenant2 + \"] with [\" + value + \"]\");\n                        });\n                    });\n                });\n            }\n        });\n\n        this.testCase({\n            name: 'check whitespace kill switch for this request only',\n            test: () => {\n                let tenant1Values: string[] = [\n                    \"tenant1 \", \" tenant1\", \" tenant1 \", \"a, tenant1\\n,b\", \"\\rtenant1\\r\", \" tenant1\\n,\", \"\\n tenant1 ,a\"\n                ];\n\n                tenant1Values.forEach((value) => {\n                    let killSwitch = createKillSwitch();\n\n                    let theRequest = killSwitch.setKillSwitchTenants(value, \"this-request-only\");\n                    let found = false;\n                    theRequest.forEach((tenant) => {\n                        if (tenant === \"tenant1\") {\n                            found = true;\n                        }\n                    });\n\n                    QUnit.assert.equal(found, true, \"Expected tenant1 in [\" + value + \"]\");\n                });\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/PostChannelTest.ts",
    "content": "import { AITestClass, PollingAssert, TestHelper } from \"@microsoft/ai-test-framework\";\nimport { \n    IExtendedConfiguration, EventLatency, ITelemetryItem, IExtendedTelemetryItem, SendRequestReason, EventSendType,\n    isFetchSupported, objKeys, arrForEach, isBeaconsSupported, EventPersistence, isNullOrUndefined, IXHROverride,\n    IPayloadData\n} from '@microsoft/applicationinsights-core-js';\nimport { PostChannel } from '../../../src/PostChannel';\nimport { IPostTransmissionTelemetryItem, IChannelConfiguration } from '../../../src/DataModels';\nimport { SinonSpy } from 'sinon';\nimport { createAsyncResolvedPromise } from \"@nevware21/ts-async\";\nimport { ActiveStatus, AppInsightsExtCore } from \"@microsoft/applicationinsights-core-js\";\nimport { setBypassLazyCache } from \"@nevware21/ts-utils\";\n\n\ninterface IEventsSendRequests {\n    sendReason: number;\n    isAsync: boolean;\n}\n\nexport function generateString(length: number): string {\n    let result: string = \"\";\n\n    for (let i = 0; i < length; ++i) {\n      result += \"a\";\n    }\n\n    return result;\n}\n\nexport class PostChannelTest extends AITestClass {\n    private config: IExtendedConfiguration;\n    private postChannel: PostChannel\n    private xhrOverride: IXHROverride;\n    private setTimeoutOverride: Function;\n    private clearTimeoutOverride: Function;\n    private genericSpy: SinonSpy;\n    private core: AppInsightsExtCore;\n    private eventsSent: Array<IExtendedTelemetryItem> = [];\n    private eventsDiscarded: Array<IExtendedTelemetryItem> = [];\n    private eventsSendRequests: Array<IEventsSendRequests> = [];\n    private testMessage: string;\n    private beaconCalls = [];\n    private ctx: any;\n\n    constructor(name?: string, emulateEs3?: boolean) {\n        super(name, emulateEs3);\n        \n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n    }\n\n\n    public testInitialize() {\n        super.testInitialize();\n        setBypassLazyCache(true);\n\n        // Reset the cached isBeacons supported\n        isBeaconsSupported(false);\n\n        this.core = new AppInsightsExtCore();\n        this.config = {\n            instrumentationKey: 'testIkey',\n            endpointUrl: 'https://testEndpoint',\n            featureOptIn : {[\"zipPayload\"]: {mode: 1}},\n            extensionConfig: []\n        };\n        this.postChannel = new PostChannel();\n        this.testMessage = \"\";\n        this.eventsSent = [];\n        this.eventsDiscarded = [];\n        this.eventsSendRequests = [];\n        this.xhrOverride = new AutoCompleteXhrOverride();\n        this.setTimeoutOverride = (handler: Function, timeout?: number) => {\n            this.testMessage = \"testSetTimeout\";\n            setTimeout(handler, timeout ? timeout / 2 : timeout);\n        };\n        this.clearTimeoutOverride = (params: any) => {\n            this.testMessage = \"testClearTimeout\";\n            clearTimeout(params);\n        };\n        this.ctx = {};\n    }\n\n    public testFinishedCleanup(): void {\n        if (this.postChannel) {\n            // Stop the post channel from sending any events (after the fake server has been removed)\n            this.postChannel.pause();\n        }\n\n        if (this.core && this.core.isInitialized()) {\n            this.core.unload(false);\n        }\n        this.ctx = null;\n        super.testFinishedCleanup();\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Override configs\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    overrideInstrumentationKey: \"overrideIkey-\",\n                    overrideEndpointUrl: \"overrideEndpoint\",\n                    httpXHROverride: this.xhrOverride,\n                };\n\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                this.core.initialize(this.config, [this.postChannel]);\n\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: true\n                };\n                this.postChannel.processTelemetry(event);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.ok(spy.getCall(0).args[0].urlString.toString().indexOf(\"overrideEndpoint\") > -1);\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                QUnit.assert.equal(isNaN(event.timings.processTelemetryStart[\"PostChannel\"] as number), false);\n            }\n        });\n\n        this.testCase({\n            name: \"Override configs at the root level with a post channel configuration\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n\n                this.config[\"overrideInstrumentationKey\"] = \"overrideIkey-\";\n                this.config[\"overrideEndpointUrl\"] = \"overrideEndpoint\";\n\n\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                this.core.initialize(this.config, [this.postChannel]);\n\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: true\n                };\n                this.postChannel.processTelemetry(event);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.ok(spy.getCall(0).args[0].urlString.toString().indexOf(\"overrideEndpoint\") > -1);\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                QUnit.assert.equal(isNaN(event.timings.processTelemetryStart[\"PostChannel\"] as number), false);\n            }\n        });\n\n        this.testCase({\n            name: \"Post Channel: dynamic config defaults\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this.config;\n                let core = this.core;\n                let postChannel = this.postChannel;\n                core.initialize(config, [postChannel]);\n                let identifier = postChannel.identifier;\n\n                let undefValue: undefined;\n                let expectedConfig : IChannelConfiguration = {\n                    eventsLimitInMem: 10000,\n                    immediateEventLimit: 500,\n                    autoFlushEventsLimit: 0,\n                    disableAutoBatchFlushLimit: false,\n                    httpXHROverride: undefValue ,\n                    overrideInstrumentationKey: undefValue,\n                    overrideEndpointUrl: undefValue,\n                    disableTelemetry: false,\n                    ignoreMc1Ms0CookieProcessing: false,\n                    setTimeoutOverride: undefValue,\n                    clearTimeoutOverride: undefValue,\n                    payloadPreprocessor: undefValue,\n                    payloadListener: undefValue,\n                    disableEventTimings: undefValue,\n                    valueSanitizer: undefValue,\n                    stringifyObjects: undefValue,\n                    enableCompoundKey: undefValue,\n                    disableOptimizeObj: false,\n                    transports: undefValue,\n                    unloadTransports: undefValue,\n                    useSendBeacon: undefValue,\n                    disableFetchKeepAlive: undefValue,\n                    avoidOptions: false,\n                    xhrTimeout: undefValue,\n                    disableXhrSync: undefValue,\n                    alwaysUseXhrOverride: false,\n                    fetchCredentials: undefValue,\n                    maxEventRetryAttempts: 6,\n                    maxUnloadEventRetryAttempts: 2,\n                    maxEvtPerBatch: 500,\n                    addNoResponse: undefValue,\n                    excludeCsMetaData: undefValue,\n                    requestLimit: {}\n                };\n                let actaulConfig =  postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.deepEqual(expectedConfig, actaulConfig, \"default config should be set\");\n\n                // change config with validation\n                core.config.extensionConfig = core.config.extensionConfig || {};\n                core.config.extensionConfig[identifier].eventsLimitInMem = -1;\n                core.config.extensionConfig[identifier].maxEventRetryAttempts = \"\";\n                core.config.extensionConfig[identifier].httpXHROverride = \"\";\n                this.clock.tick(1);\n                actaulConfig = postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.deepEqual(actaulConfig.eventsLimitInMem, 10000, \"eventsLimitInMem should not be changed by numbers smaller than 0\");\n                QUnit.assert.deepEqual(actaulConfig.maxEventRetryAttempts, 6, \"maxEventRetryAttempt should not be changed by string values\");\n                QUnit.assert.deepEqual(actaulConfig.httpXHROverride, undefined, \"xhttpXHROverride should not be changed by string values\");\n                \n                core.config.extensionConfig[identifier].eventsLimitInMem = 100;\n                core.config.extensionConfig[identifier].maxEventRetryAttempts = 10;\n                core.config.extensionConfig[identifier].httpXHROverride = this.xhrOverride;\n                this.clock.tick(1);\n                actaulConfig = postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.deepEqual(actaulConfig.eventsLimitInMem, 100, \"eventsLimitInMem should be changed dynamically\");\n                QUnit.assert.deepEqual(actaulConfig.maxEventRetryAttempts, 10, \"maxEventRetryAttempt should should be changed dynamically\");\n                QUnit.assert.deepEqual(actaulConfig.httpXHROverride, this.xhrOverride, \"xhrOverride should be changed dynamically\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"Fetch Credentials config default to be null, and support dynamic change\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this.config;\n                let core = this.core;\n                let postChannel = this.postChannel;\n                core.initialize(config, [postChannel]);\n                let actaulConfig =  postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.deepEqual(actaulConfig[\"fetchCredentials\"], undefined, \"fetchCredentials was undefined if not set\");\n                let httpManager =  postChannel[\"_getDbgPlgTargets\"]()[0];\n                QUnit.assert.deepEqual(httpManager[\"_getDbgPlgTargets\"]()[4].fetchCredentials, undefined, \"fetchCredentials was undefined if not set\");\n                if (core.config.extensionConfig){\n                    core.config.extensionConfig[postChannel.identifier].fetchCredentials = \"omit\";\n                }\n                this.clock.tick(1);\n                actaulConfig = postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.deepEqual(actaulConfig[\"fetchCredentials\"], \"omit\", \"post channel fetchCredentials was set to omit\");\n                httpManager =  postChannel[\"_getDbgPlgTargets\"]()[0];\n                console.log(\"get\", JSON.stringify(httpManager[\"_getDbgPlgTargets\"]()[4]));\n                QUnit.assert.deepEqual(httpManager[\"_getDbgPlgTargets\"]()[4].fetchCredentials, \"omit\", \"http manager fetchCredentials was set to omit\");\n            }\n        });\n\n        this.testCase({\n            name: \"Post Channel: dynamic config changes\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this.config;\n                let core = this.core;\n                let postChannel = this.postChannel;\n                let identifier = postChannel.identifier;\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    latency: EventLatency.RealTime,\n                    iKey: \"testIkey\"\n                };\n                core.initialize(config, [postChannel]);\n\n\n                // test timeout\n                postChannel.processTelemetry(event);\n                this.clock.tick(1001);\n                QUnit.assert.equal(this.testMessage, \"\", \"should use default test message\");\n                core.config.extensionConfig = core.config.extensionConfig || {};\n                core.config.extensionConfig[identifier].setTimeoutOverride = this.setTimeoutOverride;\n                this.clock.tick(1);\n\n                let extConfig = postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.ok(extConfig.setTimeoutOverride, \"setTimeoutOverride config should be changed dynamically\");\n                postChannel.processTelemetry(event);\n                this.clock.tick(501);\n                QUnit.assert.equal(this.testMessage, \"testSetTimeout\", \"setTimeoutOverride should be changed dynamically\");\n\n\n                //test ignoreMc1Ms0CookieProcessing\n                let path = core.getWParam();\n                QUnit.assert.equal(path, 0, \"warm path should be default to 0\");\n                core.config.extensionConfig[identifier].ignoreMc1Ms0CookieProcessing = true;\n                this.clock.tick(1);\n\n                path = core.getWParam();\n                QUnit.assert.equal(path, 2, \"warm path should be updated dynamically\");\n\n\n                // test disableTelemetry, overrideInstrumentationKey\n                postChannel.flush(false);\n                let spy = this.sandbox.spy(this.xhrOverride, \"sendPOST\");\n                core.config.extensionConfig[identifier].httpXHROverride = this.xhrOverride;\n                core.config.extensionConfig[identifier].overrideInstrumentationKey = \"overrideIkey-\";\n                this.clock.tick(1);\n\n                extConfig = postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.equal(extConfig.overrideInstrumentationKey, \"overrideIkey-\", \"overrideInstrumentationKey should be changed to true dynamically\");\n                QUnit.assert.ok(extConfig.httpXHROverride, \"httpXHROverride should be set\");\n                postChannel.processTelemetry(event);\n                postChannel.flush(false);\n                QUnit.assert.ok(spy.called, \"sendPOST should be called\");\n                QUnit.assert.equal(spy.callCount, 1, \"sendPOST count should be called once \");\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\", \"data should be set test1\");\n                \n                core.config.extensionConfig[identifier].disableTelemetry = true;\n                this.clock.tick(1);\n\n                extConfig = postChannel[\"_getDbgPlgTargets\"]()[1];\n                QUnit.assert.equal(extConfig.disableTelemetry, true, \"disableTelemetry should be changed dynamically\");\n                postChannel.processTelemetry(event);\n                postChannel.flush(false);\n                QUnit.assert.equal(spy.callCount, 1, \"sendPOST count should be 1 test1\");\n\n                 // test eventsLimitInMem\n                 core.config.extensionConfig[identifier].disableTelemetry = false;\n                 core.config.extensionConfig[identifier].eventsLimitInMem = 1;\n                 this.clock.tick(1);\n                 extConfig = postChannel[\"_getDbgPlgTargets\"]()[1];\n                 QUnit.assert.equal(extConfig.disableTelemetry, false, \"telemetry should be enabled dynamically\");\n                 QUnit.assert.equal(extConfig.eventsLimitInMem, 1, \"eventsLimitInMem should be changed dynamically\");\n                 postChannel.flush(false);\n                 QUnit.assert.equal(spy.callCount, 1, \"sendPOST count should be 1\");\n                 postChannel.processTelemetry(event);\n                 postChannel.processTelemetry(event);\n                 postChannel.flush(false);\n                 QUnit.assert.equal(spy.callCount, 2, \"sendPOST count should be 2\");\n                 QUnit.assert.equal(spy.getCall(1).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\", \"data should be set test2\");\n\n                 // TODO: NOTE: maxEventRetryAttempts and maxUnloadEventRetryAttempts are not used by httpMgr, http mgr will always use initial values\n\n            }\n        });\n\n        this.testCaseAsync({\n            name: \"zip test: gzip encode is working and content-encode header is set\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                    this.config.featureOptIn = {[\"zipPayload\"]: {mode: 3}};\n                    this.config.extensionConfig[this.postChannel.identifier] = {\n                        httpXHROverride: this.xhrOverride,\n                    };\n                    this.core.initialize(this.config, [this.postChannel]);\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    };\n                    this.postChannel.processTelemetry(event);\n                    this.postChannel.flush();\n                    this.clock.tick(10);\n                }].concat(PollingAssert.createPollingAssert(() => {\n                    if (this.genericSpy.called){\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(true, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should be gzip encoded\");\n                        QUnit.assert.equal(request.headers[\"Content-Encoding\"], \"gzip\", \"telemetry should be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000) as any)\n            });\n\n         \n        this.testCaseAsync({\n            name: \"zip is default to be off\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                    this.config.extensionConfig[this.postChannel.identifier] = {\n                        httpXHROverride: this.xhrOverride\n                    };\n                    this.core.initialize(this.config, [this.postChannel]);\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    };\n                    this.postChannel.processTelemetry(event);\n                    this.postChannel.flush();\n                    this.clock.tick(10);\n                }].concat(PollingAssert.createPollingAssert(() => {\n                    if (this.genericSpy.called){\n                        let request = this.genericSpy.getCall(0).args[0];\n                        QUnit.assert.equal(request.headers[\"Content-Encoding\"], undefined, \"header should not be added\");\n                        QUnit.assert.ok(JSON.stringify(request.data).includes(\"testEvent\"), \"telemetry should not be encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000) as any)\n            });\n\n            this.testCaseAsync({\n                name: \"test dynamic zip config\",\n                stepDelay: 10,\n                useFakeTimers: true,\n                useFakeServer: true,\n                steps: [\n                    () => {\n                        this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                        this.config.extensionConfig[this.postChannel.identifier] = {\n                            httpXHROverride: this.xhrOverride\n                        };\n                        this.core.initialize(this.config, [this.postChannel]);\n                        var event: IPostTransmissionTelemetryItem = {\n                            name: 'testEvent',\n                            sync: false,\n                            latency: EventLatency.Normal,\n                            iKey: 'testIkey'\n                        };\n                        this.postChannel.processTelemetry(event);\n                        this.postChannel.flush();\n                        this.clock.tick(10);\n                        this.core.config.featureOptIn = {[\"zipPayload\"]: {mode: 3}};\n                        this.clock.tick(1);\n                        this.core.track(event);\n                        this.postChannel.flush();\n                        this.clock.tick(10);\n                    }].concat(PollingAssert.createPollingAssert(() => {\n                        if (this.genericSpy.callCount === 2) {\n                            let request = this.genericSpy.getCall(0).args[0];\n                            QUnit.assert.equal(request.headers[\"Content-Encoding\"], undefined, \"header should not be added\");\n                            QUnit.assert.ok(JSON.stringify(request.data).includes(\"testEvent\"), \"telemetry should not be encoded\");\n                            let request2 = this.genericSpy.getCall(1).args[0];\n                            QUnit.assert.equal(request2.headers[\"Content-Encoding\"], \"gzip\", \"Telemetry should be gzip encoded after zipPayload is set to true\");\n                            return true;\n                        }\n                        return false;\n                    }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000) as any)\n                });\n           \n\n\n        this.testCaseAsync({\n            name: \"Init: init with ikey Promise and endpointUrl Promise\",\n            stepDelay: 100,\n            useFakeTimers: true,\n            steps: [() => {\n\n                let config = this.config;\n                config.initTimeOut = 80000;\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey-test\");\n                let urlPromise = createAsyncResolvedPromise(\"https://testEndpoint\");\n                this.ctx.ikeyPromise = ikeyPromise;\n                this.ctx.urlPromise = urlPromise;\n                config.instrumentationKey = ikeyPromise;\n                config.endpointUrl = urlPromise;\n                let core = this.core;\n                let postChannel = this.postChannel;\n                let identifier = postChannel.identifier;\n                let spy = this.sandbox.spy(this.xhrOverride, \"sendPOST\");\n                config.extensionConfig = {[identifier]: {}};\n                config.extensionConfig[identifier].httpXHROverride = this.xhrOverride;\n                this.ctx.spy = spy;\n         \n                core.initialize(config, [postChannel]);\n                let status = core.activeStatus && core.activeStatus();\n                QUnit.assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending\");\n\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: \"testIkey-test\",\n                    latency: EventLatency.RealTime\n                };\n                postChannel.processTelemetry(event);\n                \n            }].concat(PollingAssert.createPollingAssert(() => {\n                let core = this.core;\n                let activeStatus = core.activeStatus && core.activeStatus();\n                let ikeyPromise = this.ctx.ikeyPromise;\n                let urlPromise = this.ctx.urlPromise;\n                let config = this.core.config;\n                let spy = this.ctx.spy;\n              \n            \n                if (ikeyPromise.state === \"resolved\" && urlPromise.state === \"resolved\" && activeStatus === ActiveStatus.ACTIVE) {\n                    QUnit.assert.equal(\"testIkey-test\", core.config.instrumentationKey, \"ikey should be set\");\n                    QUnit.assert.equal(\"https://testEndpoint\", core.config.endpointUrl ,\"endpoint shoule be set\");\n\n                    let httpManager = this.postChannel[\"_getDbgPlgTargets\"]()[0];\n                    QUnit.assert.ok(httpManager ,\"http Manager exists\");\n                    let url = httpManager[\"_getDbgPlgTargets\"]()[5];\n                    QUnit.assert.ok(url.indexOf(\"https://testEndpoint\") > -1 ,\"http manager endpoint shoule be set\");\n\n                    this.postChannel.flush(false);\n                    QUnit.assert.equal(spy.callCount, 1, \"sendPOST count should be 1\");\n                    QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:testIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\", \"data should be set\");\n                    \n                    return true;\n                }\n                return false;\n            }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000) as any)\n        });\n\n\n        this.testCase({\n            name: \"Post Channel: Offline Support\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this.config;\n                let core = this.core;\n                let postChannel = this.postChannel;\n                let postId = this.postChannel.identifier;\n                config.instrumentationKey = \"ikey-123\"\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: \"testIkey-123\"\n                };\n                core.initialize(config, [postChannel]);\n                let offlineSupport = this.postChannel.getOfflineSupport() as any;\n                QUnit.assert.ok(offlineSupport.serialize, \"serialize exist\");\n                let eventStr = offlineSupport.serialize(event);\n                let expectedStr = `{\"name\":\"testEvent\",\"iKey\":\"o:testIkey\",\"data\":{\"baseData\":{}}}`;\n                QUnit.assert.equal(eventStr, expectedStr, \"get expected string\");\n\n                let url = offlineSupport.getUrl();\n                QUnit.assert.equal(url, \"https://testEndpoint?cors=true&content-type=application/x-json-stream&w=0\", \"get expected url string\");\n                \n                QUnit.assert.ok(offlineSupport.batch, \"batch should exit\");\n                let batch = offlineSupport.batch([expectedStr, expectedStr]);\n                QUnit.assert.equal(batch, expectedStr + \"\\n\" + expectedStr, \"get expected batch\");\n\n                QUnit.assert.ok(offlineSupport.shouldProcess, \"should process should exit\");\n                QUnit.assert.equal(offlineSupport.shouldProcess(event), true, \"should process\");\n\n                QUnit.assert.ok(offlineSupport.createPayload, \"createPayload should exit\");\n                QUnit.assert.equal(offlineSupport.createPayload(\"test\"), null, \"createPayload should return null now\");\n                let details = offlineSupport.createOneDSPayload([event]);\n                QUnit.assert.equal(details.urlString, \"https://testEndpoint?cors=true&content-type=application/x-json-stream&w=0\", \"get expected Url\");\n                QUnit.assert.ok(details.headers, \"get headers Url\");\n                QUnit.assert.equal(details.data, expectedStr, \"get expected data\");\n\n                this.core.config.extensionConfig = this.core.config.extensionConfig || {};\n                this.core.config.extensionConfig[postId].disableTelemetry = true;\n                this.clock.tick(1);\n                offlineSupport = this.postChannel.getOfflineSupport() as any;\n                QUnit.assert.equal(offlineSupport.shouldProcess(event), false, \"should not process\");\n                \n            }\n        });\n\n\n        this.testCase({\n            name: \"Send Sync Event with Specific type override\",\n            test: () => {\n                let beaconCalls = [];\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n\n                    return true;\n                });\n\n                var fetchCalls = this.hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    overrideInstrumentationKey: \"overrideIkey-\",\n                    overrideEndpointUrl: \"overrideEndpoint\",\n                    httpXHROverride: this.xhrOverride,\n                };\n\n                this.core.initialize(this.config, [this.postChannel]);\n\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent-xhr',\n                    sync: EventSendType.Synchronous\n                };\n                this.postChannel.processTelemetry(event);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.equal(fetchCalls.length, 0);\n                QUnit.assert.equal(beaconCalls.length, 0);\n                QUnit.assert.ok(spy.getCall(0).args[0].urlString.toString().indexOf(\"overrideEndpoint\") > -1);\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent-xhr\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                QUnit.assert.equal(isNaN(event.timings.processTelemetryStart[\"PostChannel\"] as number), false);\n\n                var eventFetch: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent-beacon',\n                    sync: EventSendType.SendBeacon\n                };\n                this.postChannel.processTelemetry(eventFetch);\n\n                QUnit.assert.equal(fetchCalls.length, 0);\n                QUnit.assert.equal(beaconCalls.length, 1);\n                QUnit.assert.notEqual(beaconCalls[0].input, \"\");\n                QUnit.assert.equal(beaconCalls[0].data, \"{\\\"name\\\":\\\"testEvent-beacon\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n\n                var eventFetch: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent-syncFetch',\n                    sync: EventSendType.SyncFetch\n                };\n                this.postChannel.processTelemetry(eventFetch);\n\n                if (!isFetchSupported(true)) {\n                    // Sync fetch is not supported (Firefox) so it should fall back to sendBeacon\n                    QUnit.assert.equal(fetchCalls.length, 0);\n                    QUnit.assert.equal(beaconCalls.length, 2);\n                    QUnit.assert.equal(beaconCalls[1].data, \"{\\\"name\\\":\\\"testEvent-syncFetch\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                } else {\n                    QUnit.assert.equal(fetchCalls.length, 1);\n                    QUnit.assert.equal(beaconCalls.length, 1);\n                    QUnit.assert.notEqual(fetchCalls[0].input, \"\");\n                    QUnit.assert.equal(fetchCalls[0].init.body, \"{\\\"name\\\":\\\"testEvent-syncFetch\\\",\\\"iKey\\\":\\\"o:overrideIkey\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"flush sync with override - Normal\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.equal(spy.callCount, 1);\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush sync with override - Cost Deferred\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.CostDeferred,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.equal(spy.callCount, 1);\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush sync with override - Real time\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.RealTime,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.equal(spy.callCount, 1);\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush sync with override - Direct\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Immediate,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.equal(spy.callCount, 1);\n                QUnit.assert.equal(spy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush async with override - Normal\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(true);\n\n                // Nothing should have been sent yet\n                QUnit.assert.equal(this.genericSpy.called, false);\n\n                this.clock.tick(1000);\n\n                QUnit.assert.equal(this.genericSpy.called, true);\n                QUnit.assert.equal(this.genericSpy.callCount, 1);\n                QUnit.assert.equal(this.genericSpy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush async with override - Cost Deferred\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.CostDeferred,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(true);\n\n                // Nothing should have been sent yet\n                QUnit.assert.equal(this.genericSpy.called, false);\n\n                this.clock.tick(1000);\n\n                QUnit.assert.equal(this.genericSpy.called, true);\n                QUnit.assert.equal(this.genericSpy.callCount, 1);\n                QUnit.assert.equal(this.genericSpy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush async with override - Real time\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.RealTime,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(true);\n\n                // Nothing should have been sent yet\n                QUnit.assert.equal(this.genericSpy.called, false);\n\n                this.clock.tick(1000);\n\n                QUnit.assert.equal(this.genericSpy.called, true);\n                QUnit.assert.equal(this.genericSpy.callCount, 1);\n                QUnit.assert.equal(this.genericSpy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush async with override - Direct\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Immediate,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(true);\n\n                // Nothing should have been sent yet\n                QUnit.assert.equal(this.genericSpy.called, false);\n\n                this.clock.tick(1000);\n\n                QUnit.assert.equal(this.genericSpy.called, true);\n                QUnit.assert.equal(this.genericSpy.callCount, 1);\n                QUnit.assert.equal(this.genericSpy.getCall(0).args[0].data, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:\\\",\\\"data\\\":{\\\"baseData\\\":{}}}\");\n            }\n        });\n\n        this.testCase({\n            name: \"qspHeaders\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.config.anonCookieName = \"APP_ANON\";\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.ok(spy.getCall(0).args[0].urlString.indexOf('anoncknm=APP_ANON') > -1);\n            }\n        });\n\n        this.testCase({\n            name: \"Avoid Headers: default\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.ok(spy.getCall(0).args[0].headers != null);\n                QUnit.assert.equal(objKeys(spy.getCall(0).args[0].headers).length, 7);\n            }\n        });\n\n        this.testCase({\n            name: \"Validate Avoid Headers: Explicitly Enabled (don't add default headers) with no manual headers\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride,\n                    avoidOptions: true\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.ok(spy.getCall(0).args[0].headers != null);\n                QUnit.assert.equal(objKeys(spy.getCall(0).args[0].headers).length, 0);\n            }\n        });\n\n        this.testCase({\n            name: \"Validate Avoid Headers: Explicitly Disabled (include and use headers)\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride,\n                    avoidOptions: false\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.ok(spy.getCall(0).args[0].headers != null);\n                QUnit.assert.equal(objKeys(spy.getCall(0).args[0].headers).length, 7);\n                QUnit.assert.equal(spy.getCall(0).args[0].headers[\"cache-control\"], \"no-cache, no-store\");\n                QUnit.assert.equal(spy.getCall(0).args[0].headers[\"content-type\"], \"application/x-json-stream\");\n                // Header should be present\n                QUnit.assert.notEqual(spy.getCall(0).args[0].headers[\"upload-time\"], undefined, spy.getCall(0).args[0].headers[\"upload-time\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"Validate Avoid Headers: Explicitly Enabled with manual headers (will add the default headers)\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride,\n                    avoidOptions: true                  // Also means put as much as possible on the query string\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                this.postChannel.setMsaAuthTicket(\"testMSA\");\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.ok(spy.getCall(0).args[0].headers != null);\n                QUnit.assert.equal(objKeys(spy.getCall(0).args[0].headers).length, 3);\n                QUnit.assert.equal(spy.getCall(0).args[0].headers[\"cache-control\"], \"no-cache, no-store\");\n                QUnit.assert.equal(spy.getCall(0).args[0].headers[\"content-type\"], \"application/x-json-stream\");\n                QUnit.assert.equal(spy.getCall(0).args[0].headers[\"AuthMsaDeviceTicket\"], \"testMSA\");\n\n                // Header should not be present as we should be attempting to avoid an options call\n                QUnit.assert.equal(spy.getCall(0).args[0].headers[\"upload-time\"], undefined, spy.getCall(0).args[0].headers[\"upload-time\"]);\n\n            }\n        });\n\n        this.testCase({\n            name: \"Add MSA Auth ticket in headers\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                this.postChannel.setMsaAuthTicket(\"testMSA\");\n                var spy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.flush(false);\n                QUnit.assert.equal(spy.called, true);\n                QUnit.assert.equal(spy.getCall(0).args[0].headers[\"AuthMsaDeviceTicket\"],\"testMSA\");\n            }\n        });\n\n        this.testCase({\n            name: \"event sent using beacons\",\n            useFakeTimers: true,\n            test: () => {\n                this.beaconCalls = [];\n                this.hookSendBeacon((url, body) => {\n                    this.beaconCalls.push({ url, body });\n                    return true;\n                });\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsDiscarded.push(events[i]);\n                        }\n                    },\n                });\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                QUnit.assert.equal(this.beaconCalls.length, 0);\n                // teardown should send events synchronously so don't cause any ticks\n                this.postChannel.teardown();\n                QUnit.assert.equal(this.beaconCalls.length, 1, \"There should have been 1 beacon call\");\n                if (this.eventsSent.length === 0) {\n                    // The NotificationManger currently always sends the eventsSent() and eventsDiscarded via a timeout, so we need to schedule it\n                    // Remove this after 3P Notification manager is fixed\n                    this.clock.tick(1);\n                } else {\n                    QUnit.assert.ok(false, \"Looks like the 3P notification manager is now fixed -- you should now remove this if block test work around\");\n                }\n                QUnit.assert.equal(this.eventsSent.length, 1, \"There should have been 1 event\");\n                QUnit.assert.equal(this.eventsDiscarded.length, 0, \"No events should have been discarded\");\n            }\n        });\n\n        this.testCase({\n            name: \"setTimeout override\",\n            useFakeTimers: true,\n            test: () => {\n                    this.config.extensionConfig[this.postChannel.identifier] = {\n                        httpXHROverride: this.xhrOverride,\n                        setTimeoutOverride: this.setTimeoutOverride\n                    };\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSent: (events: IExtendedTelemetryItem[]) => {\n                            for (var i = 0; i < events.length; i++) {\n                                this.eventsSent.push(events[i]);\n                            }\n                        },\n                        eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                            for (var i = 0; i < events.length; i++) {\n                                this.eventsDiscarded.push(events[i]);\n                            }\n                        },\n                    });\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent',\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    };\n                    this.postChannel.processTelemetry(event);\n\n                    // the override halves the timeout value so simulated 500ms should suffice plus 1ms for the event to be sent\n                    this.clock.tick(501);\n                    QUnit.assert.equal(this.eventsSent.length, 1);\n                    QUnit.assert.equal(isNaN(this.eventsSent[0].timings.processTelemetryStart[\"PostChannel\"] as number), false);\n                    QUnit.assert.equal(isNaN(this.eventsSent[0].timings.sendEventStart[\"PostChannel\"] as number), false);\n                    QUnit.assert.equal(isNaN(this.eventsSent[0].timings.sendEventCompleted[\"PostChannel\"] as number), false);\n                    QUnit.assert.equal(isNaN(this.eventsSent[0].timings.serializationStart[\"PostChannel\"] as number), false);\n                    QUnit.assert.equal(isNaN(this.eventsSent[0].timings.serializationCompleted[\"PostChannel\"] as number), false);\n                    QUnit.assert.equal(this.testMessage, \"testSetTimeout\");\n                }\n        });\n\n        this.testCaseAsync({\n            name: \"clearTimeout override\",\n            stepDelay: 4000,\n            steps: [\n                () => {\n                    this.config.extensionConfig[this.postChannel.identifier] = {\n                        httpXHROverride: this.xhrOverride,\n                        clearTimeoutOverride: this.clearTimeoutOverride,\n                    };\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSent: (events: IExtendedTelemetryItem[]) => {\n                            for (var i = 0; i < events.length; i++) {\n                                this.eventsSent.push(events[i]);\n                            }\n                        }\n                    });\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent',\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    };\n                    this.core.track(event);\n                    this.postChannel.flush(false);\n                }]\n                .concat(() => {\n                    QUnit.assert.ok(this.eventsSent.length == 1);\n                    QUnit.assert.equal(this.testMessage, \"testClearTimeout\");\n                })\n        });\n\n        this.testCase({\n            name: \"sendBeacon size limit\",\n            useFakeTimers: true,\n            test: () => {\n                    this.beaconCalls = [];\n                    this.hookSendBeacon((url, body) => {\n                        this.beaconCalls.push({ url, body });\n                        return true;\n                    });\n\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSent: (events: IExtendedTelemetryItem[]) => {\n                            for (var i = 0; i < events.length; i++) {\n                                this.eventsSent.push(events[i]);\n                            }\n                        },\n                        eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                            for (var i = 0; i < events.length; i++) {\n                                this.eventsDiscarded.push(events[i]);\n                            }\n                        },\n                    });\n                    for (var i = 0; i < 600; i++) {\n                        var event: IPostTransmissionTelemetryItem = {\n                            name: 'testEvent',\n                            sync: false,\n                            latency: EventLatency.Normal,\n                            iKey: 'testIkey',\n                            data: {\n                                field: \"1234567890qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm1234567890\"\n                            }\n                        };\n                        this.postChannel.processTelemetry(event);\n                    }\n\n                    QUnit.assert.equal(this.beaconCalls.length, 0);\n                    // teardown should send events synchronously so don't cause any ticks\n                    this.postChannel.teardown();\n\n                    QUnit.assert.ok(this.beaconCalls.length > 0);\n                    if (!(this.eventsSent.length > 400 && this.eventsSent.length < 590)) {\n                        // The NotificationManger currently always sends the eventsSent() and eventsDiscarded via a timeout, so we need to schedule it\n                        // Remove this after 3P Notification manager is fixed\n                        this.clock.tick(10);\n                    } else {\n                        QUnit.assert.ok(false, \"Looks like the 3P notification manager is now fixed -- you should now remove this if block test work around\");\n                    }\n\n                    QUnit.assert.equal(this.eventsSent.length, 600, \"expected all 600 events have been sent\");\n                    QUnit.assert.equal(this.eventsDiscarded.length, 0);\n                    QUnit.assert.equal(isNaN(this.eventsSent[0].timings.sendEventStart[\"PostChannel\"]), false);\n                    QUnit.assert.equal(isNaN(this.eventsSent[0].timings.sendEventCompleted[\"PostChannel\"]), false);\n                }\n        });\n\n        this.testCase({\n            name: \"Ignore MC1 and MS0 cookies\",\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    ignoreMc1Ms0CookieProcessing: true,\n                };\n                this.core.initialize(this.config, [this.postChannel]);\n                QUnit.assert.equal(this.core.getWParam(), 2)\n            }\n        });\n\n        this.testCase({\n            name: \"Notifications: events send notification on teardown\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        this.eventsSendRequests.push({\n                            sendReason,\n                            isAsync\n                        });\n                    }\n                });\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n                this.postChannel.teardown();\n\n                QUnit.assert.equal(this.eventsSendRequests.length, 1);\n                QUnit.assert.equal(SendRequestReason.Unload, this.eventsSendRequests[0].sendReason);\n                QUnit.assert.equal(false, this.eventsSendRequests[0].isAsync);\n\n                if (this.eventsSent.length === 0) {\n                    // The NotificationManger currently always sends the eventsSent() and eventsDiscarded via a timeout, so we need to schedule it\n                    // Remove this after 3P Notification manager is fixed\n                    this.clock.tick(1);\n                } else {\n                    QUnit.assert.ok(false, \"Looks like the 3P notification manager is now fixed -- you should now remove this if block test work around\");\n                }\n\n                QUnit.assert.equal(this.eventsSent.length, 1);\n                QUnit.assert.equal(this.eventsDiscarded.length, 0);\n            }\n        });\n\n        this.testCaseAsync({\n            name: \"Notifications: events send notification on flush\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                            this.eventsSendRequests.push({\n                                sendReason,\n                                isAsync\n                            });\n                        }\n                    });\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    };\n                    this.postChannel.processTelemetry(event);\n                    this.postChannel.flush();\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n                    this.clock.tick(10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 1);\n                    QUnit.assert.equal(SendRequestReason.ManualFlush, this.eventsSendRequests[0].sendReason);\n                    QUnit.assert.equal(true, this.eventsSendRequests[0].isAsync);\n                }]\n        });\n\n        this.testCaseAsync({\n            name: \"Notifications: events send events on auto flush limit exceeded\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                    extConfig.autoFlushEventsLimit = 2;\n                    this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                            this.eventsSendRequests.push({\n                                sendReason,\n                                isAsync\n                            });\n                        }\n                    });\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent1',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent2',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent3',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n                    this.clock.tick(10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 1);\n                    QUnit.assert.equal(SendRequestReason.MaxQueuedEvents, this.eventsSendRequests[0].sendReason);\n                    QUnit.assert.equal(true, this.eventsSendRequests[0].isAsync);\n                }]\n        });\n\n        this.testCaseAsync({\n            name: \"Notifications: events sent when dynamically changing the auto flush limit to a smaller value\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                    this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                            this.eventsSendRequests.push({\n                                sendReason,\n                                isAsync\n                            });\n                        }\n                    });\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent1',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent2',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent3',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n                    this.clock.tick(10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n\n                    this.postChannel.setEventQueueLimits(1000, 2);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n\n                    // Let the async flush occur\n                    this.clock.tick(10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 1);\n                    QUnit.assert.equal(SendRequestReason.MaxQueuedEvents, this.eventsSendRequests[0].sendReason);\n                    QUnit.assert.equal(true, this.eventsSendRequests[0].isAsync);\n                }]\n        });\n\n        this.testCaseAsync({\n            name: \"Notifications: events are not sent when dynamically changing the auto flush limit to a larger value\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                    this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                            this.eventsSendRequests.push({\n                                sendReason,\n                                isAsync\n                            });\n                        }\n                    });\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent1',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent2',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent3',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n                    this.clock.tick(10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n\n                    this.postChannel.setEventQueueLimits(1000, 10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n\n                    // Let the async flush occur\n                    for (let lp = 0; lp < 10; lp++) {\n                        this.clock.tick(10);\n                        QUnit.assert.equal(this.eventsSendRequests.length, 0);\n                    }\n                }]\n        });\n\n        this.testCaseAsync({\n            name: \"Notifications: events are not sent when dynamically changing the auto flush limit to nothing\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                    this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                    this.core.initialize(this.config, [this.postChannel]);\n                    this.core.addNotificationListener({\n                        eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                            this.eventsSendRequests.push({\n                                sendReason,\n                                isAsync\n                            });\n                        }\n                    });\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent1',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent2',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent3',\n                        sync: false,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n                    this.clock.tick(10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n\n                    this.postChannel.setEventQueueLimits(1000);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n\n                    // Let the async flush occur\n                    this.clock.tick(10);\n                    QUnit.assert.equal(this.eventsSendRequests.length, 0);\n                }]\n        });\n\n        this.testCase({\n            name: \"Notifications: validate discarded events for excessive event using beacons\",\n            useFakeTimers: true,\n            test: () => {\n                this.beaconCalls = [];\n                this.hookSendBeacon((url, body) => {\n                    this.beaconCalls.push({ url, body });\n                    return true;\n                });\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsDiscarded.push(events[i]);\n                        }\n                    },\n                });\n\n                let eventWithVeryLongString: IPostTransmissionTelemetryItem = {\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_InvalidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(64 * 1024) // 64Kb string\n                    }\n                };\n\n                this.postChannel.processTelemetry(eventWithVeryLongString);\n                QUnit.assert.equal(this.beaconCalls.length, 0);\n                // teardown should send events synchronously so don't cause any ticks\n                this.postChannel.teardown();\n                QUnit.assert.equal(this.beaconCalls.length, 0, \"There should still have been 0 beacon calls\");\n                if (this.eventsDiscarded.length === 0) {\n                    // The NotificationManger currently always sends the eventsSent() and eventsDiscarded via a timeout, so we need to schedule it\n                    // Remove this after 3P Notification manager is fixed\n                    this.clock.tick(1);\n                } else {\n                    QUnit.assert.ok(false, \"Looks like the 3P notification manager is now fixed -- you should now remove this if block test work around\");\n                }\n                QUnit.assert.equal(this.eventsSent.length, 0, \"The event should not have been sent\");\n                QUnit.assert.equal(this.eventsDiscarded.length, 1, \"The event should have been discarded\");\n                QUnit.assert.equal(this.eventsDiscarded[0].name, \"OfficeWAC_JS_1DS_Test_InvalidEvent\");\n            }\n        });\n\n        this.testCase({\n            name: \"Notifications: validate discarded events for excessive event and large (valid) event using beacons\",\n            useFakeTimers: true,\n            test: () => {\n                this.beaconCalls = [];\n                this.hookSendBeacon((url, body) => {\n                    this.beaconCalls.push({ url, body });\n                    return true;\n                });\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsDiscarded.push(events[i]);\n                        }\n                    },\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_InvalidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(64 * 1024) // 64Kb string\n                    }\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_ValidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(32 * 1024) // 32Kb string\n                    }\n                });\n                QUnit.assert.equal(this.beaconCalls.length, 0);\n                // teardown should send events synchronously so don't cause any ticks\n                this.postChannel.teardown();\n                QUnit.assert.equal(this.beaconCalls.length, 1, \"There should have been 1 beacon calls\");\n                if (this.eventsSent.length === 0) {\n                    // The NotificationManger currently always sends the eventsSent() and eventsDiscarded via a timeout, so we need to schedule it\n                    // Remove this after 3P Notification manager is fixed\n                    this.clock.tick(10);\n                } else {\n                    QUnit.assert.ok(false, \"Looks like the 3P notification manager is now fixed -- you should now remove this if block test work around\");\n                }\n                QUnit.assert.equal(this.eventsSent.length, 1, \"The valid event should have been sent\");\n                QUnit.assert.equal(this.eventsDiscarded.length, 1, \"The event should have been discarded\");\n                QUnit.assert.equal(this.eventsSent[0].name, \"OfficeWAC_JS_1DS_Test_ValidEvent\");\n                QUnit.assert.equal(this.eventsDiscarded[0].name, \"OfficeWAC_JS_1DS_Test_InvalidEvent\");\n            }\n        });\n\n        this.testCase({\n            name: \"Notifications: validate discarded events for large (valid) event and then an excessive event using beacons\",\n            useFakeTimers: true,\n            test: () => {\n                this.beaconCalls = [];\n                this.hookSendBeacon((url, body) => {\n                    this.beaconCalls.push({ url, body });\n                    return true;\n                });\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsDiscarded.push(events[i]);\n                        }\n                    },\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_ValidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(60 * 1024) // 60Kb string\n                    }\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_InvalidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(64 * 1024) // 64Kb string\n                    }\n                });\n                QUnit.assert.equal(this.beaconCalls.length, 0);\n                // teardown should send events synchronously so don't cause any ticks\n                this.postChannel.teardown();\n                QUnit.assert.equal(this.beaconCalls.length, 1, \"There should have been 1 beacon calls\");\n                if (this.eventsSent.length === 0) {\n                    // The NotificationManger currently always sends the eventsSent() and eventsDiscarded via a timeout, so we need to schedule it\n                    // Remove this after 3P Notification manager is fixed\n                    this.clock.tick(10);\n                } else {\n                    QUnit.assert.ok(false, \"Looks like the 3P notification manager is now fixed -- you should now remove this if block test work around\");\n                }\n                QUnit.assert.equal(this.eventsSent.length, 1, \"The valid event should have been sent\");\n                QUnit.assert.equal(this.eventsDiscarded.length, 1, \"The event should have been discarded\");\n                QUnit.assert.equal(this.eventsSent[0].name, \"OfficeWAC_JS_1DS_Test_ValidEvent\");\n                QUnit.assert.equal(this.eventsDiscarded[0].name, \"OfficeWAC_JS_1DS_Test_InvalidEvent\");\n            }\n        });\n\n        this.testCase({\n            name: \"Notifications: validate discarded events for excessive event using normal flow\",\n            useFakeTimers: true,\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsDiscarded.push(events[i]);\n                        }\n                    },\n                });\n\n                let eventWithVeryLongString: IPostTransmissionTelemetryItem = {\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_InvalidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(2.5 * 1024 * 1024) // 2.5Mb string\n                    }\n                };\n\n                this.postChannel.processTelemetry(eventWithVeryLongString);\n                QUnit.assert.equal(this.eventsSent.length, 0);\n                QUnit.assert.equal(this.eventsDiscarded.length, 0);\n                this.postChannel.flush(false);\n                this.clock.tick(100);\n                QUnit.assert.equal(this.eventsSent.length, 0, \"The event should not have been sent\");\n                QUnit.assert.equal(this.eventsDiscarded.length, 1, \"The event should have been discarded\");\n                QUnit.assert.equal(this.eventsDiscarded[0].name, \"OfficeWAC_JS_1DS_Test_InvalidEvent\");\n            }\n        });\n\n        this.testCase({\n            name: \"Notifications: validate discarded events for excessive event and a large event using normal flow\",\n            useFakeTimers: true,\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsDiscarded.push(events[i]);\n                        }\n                    },\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_InvalidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(2.5 * 1024 * 1024) // 2.5Mb string\n                    }\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_ValidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(64 * 1024) // 64Kb string (bigger than the beacon limit, but ok for normal flow)\n                    }\n                });\n                QUnit.assert.equal(this.eventsSent.length, 0);\n                this.postChannel.flush(false);\n                this.clock.tick(100);\n                QUnit.assert.equal(this.eventsSent.length, 1, \"The valid event should have been sent\");\n                QUnit.assert.equal(this.eventsDiscarded.length, 1, \"The event should have been discarded\");\n                QUnit.assert.equal(this.eventsSent[0].name, \"OfficeWAC_JS_1DS_Test_ValidEvent\");\n                QUnit.assert.equal(this.eventsDiscarded[0].name, \"OfficeWAC_JS_1DS_Test_InvalidEvent\");\n            }\n        });\n\n        this.testCase({\n            name: \"Notifications: validate discarded events for a large event and then an excessive event using normal flow\",\n            useFakeTimers: true,\n            test: () => {\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: this.xhrOverride\n                };\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsSent.push(events[i]);\n                        }\n                    },\n                    eventsDiscarded: (events: IExtendedTelemetryItem[]) => {\n                        for (var i = 0; i < events.length; i++) {\n                            this.eventsDiscarded.push(events[i]);\n                        }\n                    },\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_ValidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(64 * 1024) // 64Kb string (bigger than the beacon limit, but ok for normal flow)\n                    }\n                });\n\n                this.postChannel.processTelemetry({\n                    iKey: \"testIkey\",\n                    name: \"OfficeWAC_JS_1DS_Test_InvalidEvent\",\n                    data: {\n                        StringValue: \"Hello World Again\",\n                        VeryLongString: generateString(2.5 * 1024 * 1024) // 2.5Mb string\n                    }\n                });\n                QUnit.assert.equal(this.eventsSent.length, 0);\n                this.postChannel.flush(false);\n                this.clock.tick(100);\n                QUnit.assert.equal(this.eventsSent.length, 1, \"The valid event should have been sent\");\n                QUnit.assert.equal(this.eventsDiscarded.length, 1, \"The event should have been discarded\");\n                QUnit.assert.equal(this.eventsSent[0].name, \"OfficeWAC_JS_1DS_Test_ValidEvent\");\n                QUnit.assert.equal(this.eventsDiscarded[0].name, \"OfficeWAC_JS_1DS_Test_InvalidEvent\");\n            }\n        });\n\n        this.testCase({\n            name: \"addResponseHandler\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                let handlerCalled = false;\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.postChannel.addResponseHandler((responseText) => {\n                    handlerCalled = true;\n                });\n                QUnit.assert.ok(!handlerCalled, \"Make sure the response handler has not yet been called\");\n                this.postChannel.processTelemetry({\n                    name: 'testEvent1',\n                    sync: false,\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                } as IPostTransmissionTelemetryItem);\n                this.postChannel.flush();\n                this.clock.tick(100);\n                QUnit.assert.ok(!handlerCalled, \"Make sure the response handler has not yet been called\");\n                this._getXhrRequests().forEach((request) => {\n                    if (request.method) {\n                        this.sendJsonResponse(request, {}, 200);\n                    }\n                });\n                this.clock.tick(100);\n\n                QUnit.assert.ok(handlerCalled, \"Make sure the response handler is called\");\n            }\n        });\n\n        this.testCase({\n            name: \"removeResponseHandler\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                let handlerCalled = 0;\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                let removeCall = this.postChannel.addResponseHandler((responseText) => {\n                    handlerCalled += 1;\n                });\n                QUnit.assert.ok(handlerCalled == 0, \"Make sure the response handler has not yet been called\");\n                \n                // Send 1600 events and accumulate 1.6 seconds of \"time\"\n                for (let lp = 0; lp < 1600; lp++) {\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    };\n                    this.postChannel.processTelemetry(event);\n                    this.clock.tick(1);\n                }\n              \n                this.postChannel.flush();\n                this.clock.tick(400);\n                QUnit.assert.ok(handlerCalled == 0, \"Make sure the response handler has not yet been called\");\n                let request = this._getXhrRequests()[0]\n                this.sendJsonResponse(request, {}, 200);\n                \n                this.clock.tick(100);\n\n                let num = handlerCalled;\n                QUnit.assert.ok(num > 0, \"Make sure the response handler is called\");\n\n                removeCall.rm();\n                this.postChannel.flush();\n                this.clock.tick(400);\n                QUnit.assert.ok(num == handlerCalled, \"Make sure the response handler has not yet been called again\");\n                \n                request = this._getXhrRequests()[1]\n                this.sendJsonResponse(request, {}, 200);\n                this.clock.tick(100);\n                QUnit.assert.ok(num == handlerCalled, \"Make sure the response handler is removed and not being called\");\n            }\n        });\n\n        this.testCase({\n            name: \"test request batching and sending\",\n            useFakeTimers: true,\n            test: () => {\n                let sentRequests = [];\n                let sentEvents = [];\n                let discardEvents = [];\n                let sendEvents = [];\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                sentRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n                            }\n                    }\n                };\n\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentEvents.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardEvents.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendEvents.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                // Send 1600 events and accumulate 1.6 seconds of \"time\"\n                for (let lp = 0; lp < 1600; lp++) {\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    };\n                    this.postChannel.processTelemetry(event);\n                    this.clock.tick(1);\n                }\n\n                // No Events should yet be sent for \"normal\" events\n                QUnit.assert.equal(sentRequests.length, 0, 'No events should have been triggered yet');\n                QUnit.assert.equal(sendEvents.length, 0, 'No send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Move timer up to 2 seconds -- triggering the first request\n                this.clock.tick(400);\n                // Clock Skew manager should block any additional requests from being immediately sent\n                QUnit.assert.equal(sentRequests.length, 1, '1 request should have been triggered -- waiting for the kill switch for first response');\n                QUnit.assert.equal(sendEvents.length, 0, '1 send event should have been sent yet -- they are sent as a async event -- based on the request type');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 1, '1 send event should have been sent yet -- they are sent as a async event');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                let data = sentRequests[0].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                // process the 1st request as successful, triggering a flushing of 2 additional requests\n                sentRequests[0].oncomplete(200, {});\n\n                // No extra events should be triggered yet\n                QUnit.assert.equal(sentRequests.length, 3, '3 request should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 1, 'One send event should have been sent yet -- as they are sent async');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet - they are sent async');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 3, '3 send events should have been sent yet -- they are sent as a async event');\n                QUnit.assert.equal(sentEvents.length, 1, '1 sent event should have been sent yet -- they are sent async');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // This should have caused an additional 2 requests to be sent\n                QUnit.assert.equal(sentRequests.length, 3, '3 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 3, '3 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 1, 'One sent event should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // process the 3rd request as successful\n                sentRequests[2].oncomplete(200, {});\n\n                // This should have caused an additional requests to be sent\n                QUnit.assert.equal(sentRequests.length, 4, '4 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 3, '3 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 1, '1 sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // The forth request should have only included the remaining 400 requests\n                data = sentRequests[3].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 100, 'There should be 100 events');\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sentRequests.length, 4, '4 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 4, '4 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 2, '2 sent (completed) events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n            }\n        });\n\n        this.testCase({\n            name: \"test request batching and sending with a direct event after batched events\",\n            useFakeTimers: true,\n            test: () => {\n                let sentRequests = [];\n                let sentEvents = [];\n                let discardEvents = [];\n                let sendEvents = [];\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                sentRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n                            }\n                    }\n                };\n\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentEvents.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardEvents.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendEvents.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                // Send 1600 events and accumulate 1.6 seconds of \"time\"\n                for (let lp = 0; lp < 1600; lp++) {\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    };\n                    this.postChannel.processTelemetry(event);\n                    this.clock.tick(1);\n                }\n\n                // No Events should yet be sent for \"normal\" events\n                QUnit.assert.equal(sentRequests.length, 0, 'No events should have been triggered yet');\n                QUnit.assert.equal(sendEvents.length, 0, 'No send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                var event: IPostTransmissionTelemetryItem = {\n                    name: 'testEvent-direct0',\n                    latency: EventLatency.Immediate,\n                    iKey: 'testIkey'\n                };\n                this.postChannel.processTelemetry(event);\n\n                // Still No Events should yet be sent for \"normal\" events\n                QUnit.assert.equal(sentRequests.length, 0, 'No events should have been triggered yet');\n                QUnit.assert.equal(sendEvents.length, 0, 'No send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Move timer 1ms -- triggering the direct send\n                this.clock.tick(1);\n\n                // Clock Skew manager should block any additional requests from being immediately sent\n                QUnit.assert.equal(sentRequests.length, 1, '1 request should have been triggered -- waiting for the kill switch for first response');\n\n                let data = sentRequests[0].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 1, 'There should be 1 events');\n                QUnit.assert.ok(data[0].indexOf(\"testEvent-direct0\") !== -1, \"The sent event should be the direct event\");\n\n                // Move timer 1ms -- triggering the notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sentRequests.length, 1, '1 request should have been triggered -- waiting for the kill switch for first response');\n                QUnit.assert.equal(sendEvents.length, 1, '1 send event should have been sent yet -- they are sent as a async event -- based on the request type');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Move timer up to 2 seconds -- triggering the timeout for normal requests\n                this.clock.tick(399);\n\n                // Clock Skew manager should block any additional requests from being immediately sent\n                QUnit.assert.equal(sentRequests.length, 1, '1 request should have been triggered -- waiting for the kill switch for first response');\n                QUnit.assert.equal(sendEvents.length, 1, '1 send event should have been sent yet -- they are sent as a async event -- based on the request type');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // process the 1st request as successful, triggering a flushing of 2 additional requests\n                sentRequests[0].oncomplete(200, {});\n\n                QUnit.assert.equal(sentRequests.length, 3, '3 request should have been triggered -- waiting for the kill switch for first response');\n                QUnit.assert.equal(sendEvents.length, 1, '1 send event should have been sent yet -- they are sent as a async event');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                data = sentRequests[1].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                data = sentRequests[2].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                // Trigger any extra event notifications and 2nd send\n                this.clock.tick(1);\n\n                // No extra events should be triggered yet\n                QUnit.assert.equal(sentRequests.length, 3, '3 request should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 3, 'Three send event should have been sent yet -- as they are sent async');\n                QUnit.assert.equal(sentEvents.length, 1, 'No sent events should have been sent yet - they are sent async');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // process the 3rd request as successful\n                sentRequests[2].oncomplete(200, {});\n\n                // This should have caused an additional request to be sent (Direct + Normal + Normal (complete) + Normal)\n                QUnit.assert.equal(sentRequests.length, 4, '4 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 3, '3 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 1, '1 sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Trigger any extra event notifications and 2nd send\n                this.clock.tick(1);\n\n                QUnit.assert.equal(sentRequests.length, 4, '4 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 4, '4 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 2, '1 sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                data = sentRequests[3].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                // process the 3rd request as successful\n                sentRequests[1].oncomplete(200, {});\n\n                // This should have caused an additional request to be sent (Direct + Normal (complete) + Normal (complete) + Normal + Normal)\n                QUnit.assert.equal(sentRequests.length, 5, '5 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 4, '4 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 2, '1 sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                // This should have caused an additional request to be sent (Direct + Normal (complete) + Normal (complete) + Normal + Normal)\n                QUnit.assert.equal(sentRequests.length, 5, '5 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 5, '5 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 3, '3 sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // The forth request should have only included the remaining 400 requests\n                data = sentRequests[4].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 100, 'There should be 100 events');\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sentRequests.length, 5, '5 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 5, '5 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 3, '3 sent (completed) events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n            }\n        });\n\n        this.testCase({\n            name: \"test the default queueSize and discard events with excessive events before the first flush request with no response\",\n            useFakeTimers: true,\n            test: () => {\n                let sentRequests = [];\n                let sentEvents = [];\n                let discardEvents = [];\n                let sendEvents = [];\n\n                this.config.extensionConfig![this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                sentRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n                            }\n                    }\n                };\n\n                let extConfig = this.config.extensionConfig![this.postChannel.identifier] || {};\n                this.config.extensionConfig![this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentEvents.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardEvents.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendEvents.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                // Send 11666 events = Queuelimit of 10,000 + auto flush limit 1,667\n                for (let lp = 0; lp < 11667; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendEvents.length, 0, 'No Send events yet as they are sent async');\n                QUnit.assert.equal(sentRequests.length, 0, \"We haven't actually sent the request yet\");\n\n                // Include 10 additional events -- triggering 1 discard batch\n                for (let lp = 0; lp < 10; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'discardTriggerEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                // Let the auto flush send event to send\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(sentRequests.length, 1, 'Only 1 request should have been sent because of the kill switch');\n\n                let data = sentRequests[0].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                // Allow the request and event notifications to be sent\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(sentRequests.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(discardEvents.length, 1, 'We should have at least 1 discard event');\n\n                sentRequests[0].oncomplete(200, {});\n\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 3, '3 request should now have been sent');\n                QUnit.assert.equal(sentRequests.length, 3, '3 request should now have been sent');\n                QUnit.assert.equal(discardEvents.length, 1, 'We should have at least 1 discard event');\n\n                QUnit.assert.equal(discardEvents[0].events.length, 20, 'There should be 20 discarded events');\n                QUnit.assert.equal(discardEvents[0].events[0].name, 'testEvent-1667', 'The first event discarded should be event 1667 not the extra discarded event');\n                QUnit.assert.equal(discardEvents[0].events[1].name, 'testEvent-1668', 'The second event discarded should be event 1668 not the extra discarded event');\n\n                QUnit.assert.ok(JSON.stringify(discardEvents[0].events).indexOf('discardTriggerEvent-') === -1, 'The discard trigger event should not have been the event discarded');\n            }\n        });\n\n        this.testCase({\n            name: \"test the default queueSize and discard events with excessive events before the first flush request with no response and direct latency\",\n            useFakeTimers: true,\n            test: () => {\n                let sentRequests = [];\n                let sentEvents = [];\n                let discardEvents = [];\n                let sendEvents = [];\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                sentRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n                            }\n                    }\n                };\n\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentEvents.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardEvents.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendEvents.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                // Send 100 normal events\n                for (let lp = 0; lp < 100; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                // Send 10 direct events (should not cause any additional normal events to be discarded)\n                // As direct events are not \"effectively\" batched as part of the normal queuing\n                for (let lp = 0; lp < 10; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-direct-' + lp,\n                        latency: EventLatency.Immediate,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                // Send 11566 additional events = Queuelimit of 10,000 + auto flush limit 1,667\n                for (let lp = 100; lp < 11667; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendEvents.length, 0, 'No Send events yet as they are sent async');\n                QUnit.assert.equal(sentRequests.length, 0, \"We haven't actually sent the request yet\");\n\n                // Let the direct events to send\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(sentRequests.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(discardEvents.length, 0, 'We should have at least 0 discard event');\n\n                let data = sentRequests[0].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events -- the 10 direct plus 490 normal events');\n                QUnit.assert.ok(data[0].indexOf('testEvent-direct-0') !== -1);\n                QUnit.assert.ok(data[9].indexOf('testEvent-direct-9') !== -1);\n\n                this.postChannel.processTelemetry({\n                    name: 'discardTriggerEvent-0',\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                } as IPostTransmissionTelemetryItem);\n\n                // Cause the direct send events to process (unblocking normal sending)\n                sentRequests[0].oncomplete(200, {});\n\n                data = sentRequests[1].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                data = sentRequests[2].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                // Allow the request and event notifications to be sent\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 3, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(sentRequests.length, 3, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(discardEvents.length, 1, 'We should have at least 1 discard event');\n\n                sentRequests[1].oncomplete(200, {});\n\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 4, '4 request should now have been sent');\n                QUnit.assert.equal(sentRequests.length, 4, '4 request should now have been sent');\n                QUnit.assert.equal(discardEvents.length, 1, 'We should have at least 1 discard event');\n\n                QUnit.assert.equal(discardEvents[0].events.length, 20, 'There should be 20 discarded events');\n                QUnit.assert.equal(discardEvents[0].events[0].name, 'testEvent-1667', 'The first event discarded should be event 1667 not the extra discarded event');\n                QUnit.assert.equal(discardEvents[0].events[1].name, 'testEvent-1668', 'The second event discarded should be event 1668 not the extra discarded event');\n\n                QUnit.assert.ok(JSON.stringify(discardEvents[0].events).indexOf('discardTriggerEvent-0') === -1, 'The discard trigger event should not have been the event discarded');\n            }\n        });\n\n        this.testCase({\n            name: \"test the default queueSize and discard events with excessive events after the first flush request with no response\",\n            useFakeTimers: true,\n            test: () => {\n                let sentRequests = [];\n                let sentEvents = [];\n                let discardEvents = [];\n                let sendEvents = [];\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                sentRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n                            }\n                    }\n                };\n\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentEvents.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardEvents.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendEvents.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                // Send 11666 events = Queue limit of 10,000 + auto flush limit 1,667\n                for (let lp = 0; lp < 11667; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.Normal,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendEvents.length, 0, 'No Send events yet as they are sent async');\n                QUnit.assert.equal(sentRequests.length, 0, \"We haven't actually sent the request yet\");\n\n                // Let the auto flush queue and send event -- this will also clear the queue from the PostChannel\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(sentRequests.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                \n                let data = sentRequests[0].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                // No process the \"extra\" event (which fails if flush has not occurred)\n                this.postChannel.processTelemetry({\n                    name: 'discardEvent-0',\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                } as IPostTransmissionTelemetryItem);\n\n                // Allow the request and event notifications to be sent\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(sentRequests.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(discardEvents.length, 0, 'Nothing should have been discarded as the events are scheduled to be sent');\n\n                sentRequests[0].oncomplete(200, {});\n\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 3, '3 request should now have been sent');\n                QUnit.assert.equal(sentRequests.length, 3, '3 request should now have been sent');\n                QUnit.assert.equal(discardEvents.length, 0, 'Nothing should have been discarded as the events are scheduled to be sent');\n            }\n        });\n\n        this.testCase({\n            name: \"test mixed event latency batching and sending\",\n            useFakeTimers: true,\n            test: () => {\n                let sentRequests = [];\n                let sentEvents = [];\n                let discardEvents = [];\n                let sendEvents = [];\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                sentRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n                            }\n                    }\n                };\n\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentEvents.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardEvents.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendEvents.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                let latencyMap = {\n                    [EventLatency.Normal] : [],\n                    [EventLatency.RealTime] : []\n                };\n                // Send 1600 events and accumulate 1.6 seconds of \"time\"\n                for (let lp = 0; lp < 1600; lp++) {\n                    var event: IPostTransmissionTelemetryItem = {\n                        name: 'testEvent-' + lp,\n                        latency: lp % 2 ? EventLatency.Normal : EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    };\n                    latencyMap[event.latency].push(event.name);\n                    this.postChannel.processTelemetry(event);\n                    this.clock.tick(1);\n                }\n\n                // No Events should yet be sent for \"normal\" events, but the \"realtime\" ones should have been \n                QUnit.assert.equal(sentRequests.length, 1, 'Critical events should have been triggered yet');\n                QUnit.assert.equal(sendEvents.length, 1, '1 send event should have been sent -- they are sent as a async event');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                let data = sentRequests[0].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'There should be 500 events');\n\n                let allCritical = true;\n                for (let lp = 0; lp < data.length; lp++) {\n                    let evt = JSON.parse(data[lp]);\n                    if (latencyMap[EventLatency.RealTime].indexOf(evt.name) === -1) {\n                        QUnit.assert.ok(false, \"Event does not belong to the RealTime Latency - \" + JSON.stringify(evt));\n                        allCritical = false;\n                        break;\n                    }\n                }\n                QUnit.assert.ok(allCritical, \"Not all of the events in batch 1 where realtime events\");\n\n                // Move timer up to 2 seconds -- triggering the second request which should contain a mixture of events (normal / realtime)\n                this.clock.tick(400);\n                // Clock Skew manager should block any additional requests from being immediately sent\n                QUnit.assert.equal(sentRequests.length, 1, '1 request should have been triggered -- waiting for the kill switch for first response');\n                QUnit.assert.equal(sendEvents.length, 1, '1 send event should have been sent yet -- they are sent as a async event -- based on the request type');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sentRequests.length, 1, '1 request should have been triggered -- waiting for the kill switch for first response');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // process the 1st request as successful, triggering a flushing of 2 additional requests\n                sentRequests[0].oncomplete(200, {});\n\n                // No extra events should be triggered yet\n                QUnit.assert.equal(sentRequests.length, 3, '3 request should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 1, 'One send event should have been sent yet -- as they are sent async');\n                QUnit.assert.equal(sentEvents.length, 0, 'No sent events should have been sent yet - they are sent async');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                data = sentRequests[1].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 500, 'Second batch should also contain 500 events');\n\n                let hasCritical = false;\n                let hasNormal = false;\n                arrForEach(data, (evtData: string) => {\n                    let evt = JSON.parse(evtData);\n                    hasNormal = hasNormal || latencyMap[EventLatency.Normal].indexOf(evt.name) !== -1;\n                    hasCritical = hasCritical || latencyMap[EventLatency.RealTime].indexOf(evt.name) !== -1;\n                });\n\n                QUnit.assert.ok(hasCritical, \"Batch must contain realtime events - \" + JSON.stringify(data));\n                QUnit.assert.ok(hasNormal, \"Batch must contain normal events - \" + JSON.stringify(data));\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 3, '3 send events should have been sent yet -- they are sent as a async event');\n                QUnit.assert.equal(sentEvents.length, 1, '1 sent event should have been sent yet -- they are sent async');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // This should have caused an additional 2 requests to be sent\n                QUnit.assert.equal(sentRequests.length, 3, '3 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 3, '3 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 1, 'One sent event should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // process the 3rd request as successful\n                sentRequests[2].oncomplete(200, {});\n\n                // This should have caused an additional requests to be sent\n                QUnit.assert.equal(sentRequests.length, 4, '4 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 3, '3 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 1, '1 sent events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n\n                // The forth request should have only included the remaining 400 requests\n                data = sentRequests[3].payload.data.split('\\n');\n                QUnit.assert.equal(data.length, 100, 'There should be 100 events');\n\n                hasCritical = false;\n                hasNormal = false;\n                arrForEach(data, (evtData: string) => {\n                    let evt = JSON.parse(evtData);\n                    hasNormal = hasNormal || latencyMap[EventLatency.Normal].indexOf(evt.name) !== -1;\n                    hasCritical = hasCritical || latencyMap[EventLatency.RealTime].indexOf(evt.name) !== -1;\n                });\n\n                QUnit.assert.ok(!hasCritical, \"All critical events should have been sent in the first 2 batches - \" + JSON.stringify(data));\n                QUnit.assert.ok(hasNormal, \"Batch must contain normal events - \" + JSON.stringify(data));\n\n                // Trigger any extra event notifications\n                this.clock.tick(1);\n                QUnit.assert.equal(sentRequests.length, 4, '4 Events should have been triggered');\n                QUnit.assert.equal(sendEvents.length, 4, '4 send events should have been sent yet');\n                QUnit.assert.equal(sentEvents.length, 2, '2 sent (completed) events should have been sent yet');\n                QUnit.assert.equal(discardEvents.length, 0, 'No discard events should have been sent yet');\n            }\n        });\n\n        this.testCase({\n            name: \"test the queue counts are reset when events can't be dropped\",\n            useFakeTimers: true,\n            test: () => {\n                let sentRequests = [];\n                let sentEvents = [];\n                let discardEvents = [];\n                let sendEvents = [];\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                sentRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n                            }\n                    }\n                };\n\n                let extConfig = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = extConfig;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentEvents.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardEvents.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendEvents.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                // Send 11666 events = Queuelimit of 10,000 + auto flush limit 1,667\n                for (let lp = 0; lp < 11667; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendEvents.length, 0, 'No Send events yet as they are sent async');\n                QUnit.assert.equal(sentRequests.length, 0, \"We haven't actually sent the request yet\");\n\n                // Attempt to add a normal event that should get discarded\n                this.postChannel.processTelemetry({\n                    name: 'discardTriggerEvent-0',\n                    latency: EventLatency.Normal,\n                    iKey: 'testIkey'\n                } as IPostTransmissionTelemetryItem);\n\n                // Let the auto flush send event to send\n                this.clock.tick(1);\n                QUnit.assert.equal(sendEvents.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(sentRequests.length, 1, 'Only 1 request should have been sent because of the kill switch');\n                QUnit.assert.equal(discardEvents.length, 1, 'We should have at least 1 discard event');\n\n                QUnit.assert.equal(discardEvents[0].events.length, 1, 'There should be 1 discarded event');\n                QUnit.assert.equal(discardEvents[0].events[0].name, 'discardTriggerEvent-0', 'The first event discarded should be event discardTriggerEvent-0');\n            }\n        });\n\n        this.testCase({\n            name: \"Validate unload scenario with zero response code and requeuing during beforeunload/unload - default\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                // Simulate an beforeunload event which will cause the event to get re-queued\n                document.dispatchEvent(new Event(\"beforeunload\"));\n                QUnit.assert.equal(sendNotifications.length, 1, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 1, \"Only 1 requests should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                // Let the auto flush send event to send\n                this.clock.tick(1);\n                QUnit.assert.equal(sendNotifications.length, 1, '1 requests should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(xhrRequests.length, 1, '1 request should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(discardNotifications.length, 0, 'We should have at least no discard events');\n\n                // Simulate an unload event which will cause the event triggering the internal unload logic\n                document.dispatchEvent(new Event(\"unload\"));\n                QUnit.assert.equal(sendNotifications.length, 2, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 2, \"2 requests should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                QUnit.assert.equal(discardNotifications.length, 0, 'There should no discarded events yet!');\n                // Discard events are always executed on the next cycle\n                this.clock.tick(1);\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n\n                // Lets tick over some time to see if anything else happens\n                this.clock.tick(10000);\n                QUnit.assert.equal(sendNotifications.length, 2, '2 requests should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(xhrRequests.length, 2, '2 requests should have been sent because of requeue and sync resend');\n\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n            }\n        });\n\n        this.testCase({\n            name: \"Validate unload scenario with zero response code and requeuing during beforeunload/unload - maxUnloadRetryEvents == 5\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n                channelConfig.maxUnloadEventRetryAttempts = 5;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                // Simulate an beforeunload event which will cause the event to get re-queued\n                document.dispatchEvent(new Event(\"beforeunload\"));\n                QUnit.assert.equal(sendNotifications.length, 1, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 1, \"Only 1 requests should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                // Let the auto flush send event to send\n                this.clock.tick(1);\n                QUnit.assert.equal(sendNotifications.length, 1, '1 requests should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(xhrRequests.length, 1, '1 request should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(discardNotifications.length, 0, 'We should have at least no discard events');\n\n                // Simulate an unload event which will cause the event triggering the internal unload logic\n                document.dispatchEvent(new Event(\"unload\"));\n                QUnit.assert.equal(sendNotifications.length, 5, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 5, \"5 requests should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n                QUnit.assert.equal(discardNotifications.length, 0, 'There should no discarded events yet!');\n\n                // Discard events are always executed on the next cycle\n                this.clock.tick(1);\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n\n                // Just tick over some additional time\n                this.clock.tick(10000);\n                QUnit.assert.equal(sendNotifications.length, 5, '5 requests should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(xhrRequests.length, 5, '5 requests should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n            }\n        });\n\n        this.testCase({\n            name: \"Validate unload scenario with zero response code and requeuing during unload - default\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                // Simulate an unload event\n                document.dispatchEvent(new Event(\"unload\"));\n                QUnit.assert.equal(sendNotifications.length, 2, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 2, \"2 attempts requeue events should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n                QUnit.assert.equal(discardNotifications.length, 0, 'There should no discarded events yet!');\n\n                // Discard events are always executed on the next cycle\n                this.clock.tick(1);\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n\n                // Tick over some additional time\n                this.clock.tick(10000);\n                QUnit.assert.equal(sendNotifications.length, 2, '2 requests should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(xhrRequests.length, 2, 'Still 2 requests should have been sent because of requeue sync resend');\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n            }\n        });\n\n        this.testCase({\n            name: \"Validate unload scenario with zero response code and requeuing during unload - with maxUnloadEvents == 5\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n                channelConfig.maxUnloadEventRetryAttempts = 5;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                // Simulate an unload event\n                document.dispatchEvent(new Event(\"unload\"));\n                QUnit.assert.equal(sendNotifications.length, 5, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 5, \"5 attempts requeue events should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n                QUnit.assert.equal(discardNotifications.length, 0, 'There should no discarded events yet!');\n\n                // Discard events are always executed on the next cycle\n                this.clock.tick(1);\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n\n                // Tick over some time to make sure nothing else happens\n                this.clock.tick(10000);\n                QUnit.assert.equal(sendNotifications.length, 5, '5 requests should have been sent because of requeue and sync resend');\n                QUnit.assert.equal(xhrRequests.length, 5, 'Still 5 requests should have been sent because of requeue sync resend');\n\n                QUnit.assert.equal(discardNotifications.length, 1, 'There should be 1 batch of events should have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n            }\n        });\n\n        this.testCase({\n            name: \"Validate synchronous flush scenario with zero response code and requeuing with synchronous flushing and no unload - default retries\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                let flushCompleted = 0;\n                for (let lp = 0; lp < 8; lp++) {\n                    // cause a synchronous flush\n                    this.postChannel.flush(false, () => {\n                        flushCompleted++;\n                    });\n\n                    QUnit.assert.equal(flushCompleted, lp + 1, \"The flush should have been completed synchronously\");\n                    QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                    if (lp < 6) {\n                        QUnit.assert.equal(sendNotifications.length, lp + 1, 'request should have been sent and the events requeued');\n                        QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                        QUnit.assert.equal(xhrRequests.length, lp + 1, \"Check the number of attempts and requeue events should be sent\");\n                    } else {\n                        QUnit.assert.equal(sendNotifications.length, 6, 'request should have been sent and the events requeued');\n                        QUnit.assert.equal(xhrRequests.length, 6, \"Only 6 attempts and requeue events should be sent\");\n                        QUnit.assert.equal(discardNotifications.length, 1, 'The batch should now have been discarded');\n                        QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                        QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n                    }\n\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                    QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                    // Should not be required but lets just tick over some time\n                    this.clock.tick(1);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Validate asynchronous flush scenario with zero response code and requeuing and no unload - default retries\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                let flushCompleted = 0;\n                for (let lp = 0; lp < 8; lp++) {\n                    // cause a asynchronous flush\n                    this.postChannel.flush(true, () => {\n                        flushCompleted++;\n                    });\n\n                    QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                    if (lp < 3) {\n                        QUnit.assert.equal(flushCompleted, lp, lp + \":The flush should have been completed asynchronously\");\n                        QUnit.assert.equal(sendNotifications.length, (lp * 2), lp + \":request should have been sent and the events requeued\");\n                        QUnit.assert.equal(discardNotifications.length, 0, lp + \":No Discard events yet as they are sent\");\n                        QUnit.assert.equal(xhrRequests.length, (lp * 2), lp + \":Check the number of attempts and requeue events should be sent\");\n\n                        // Simulate time passing for the requeue/random back off timer for sending of the events and wait for the flush to complete\n                        let attempt = 0;\n                        while (attempt < 6000 && flushCompleted === lp) {\n                            this.clock.tick(10);\n                            attempt++;\n                        }\n\n                        QUnit.assert.equal(flushCompleted, lp + 1, \"The flush should have been completed asynchronously\");\n                        QUnit.assert.equal(sendNotifications.length, ((lp + 1) * 2), 'request should have been sent and the events requeued');\n                        QUnit.assert.equal(xhrRequests.length, ((lp + 1) * 2), \"Check the number of attempts and requeue events should be sent\");\n                        if (lp === 2) {\n                            QUnit.assert.equal(discardNotifications.length, 1, \"The batch should now have been discarded\");\n                            QUnit.assert.equal(discardNotifications[0].events.length, 50, \"There should be 50 discarded event\");\n                            QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', \"The first event discarded should be event testEvent-0\");\n                        } else {\n                            QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                        }\n                    } else {\n                        QUnit.assert.equal(flushCompleted, lp, lp + \":The flush should have been completed asynchronously\");\n                        this.clock.tick(30000);\n                        QUnit.assert.equal(flushCompleted, (lp + 1), lp + \":The flush should have been completed asynchronously\");\n                        QUnit.assert.equal(sendNotifications.length, 6, lp + \":request should have been sent and the events requeued\");\n                        QUnit.assert.equal(xhrRequests.length, 6, lp + \":Only 6 attempts and requeue events should be sent\");\n                        QUnit.assert.equal(discardNotifications.length, 1, 'No Discard events yet as they are sent');\n                        QUnit.assert.equal(discardNotifications[0].events.length, 50, \"There should be 50 discarded event\");\n                        QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', \"The first event discarded should be event testEvent-0\");\n                    }\n\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                    QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                    // Should not be required but lets just tick over some time\n                    this.clock.tick(1);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Validate synchronous flush scenario with zero response code and requeuing with synchronous flushing and no unload - maxEventRetry == 5\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n                channelConfig.maxEventRetryAttempts = 5;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                let flushCompleted = 0;\n                for (let lp = 0; lp < 8; lp++) {\n                    // cause a synchronous flush\n                    this.postChannel.flush(false, () => {\n                        flushCompleted++;\n                    });\n\n                    QUnit.assert.equal(flushCompleted, lp + 1, \"The flush should have been completed synchronously\");\n                    QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                    if (lp < 5) {\n                        QUnit.assert.equal(sendNotifications.length, lp + 1, 'request should have been sent and the events requeued');\n                        QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                        QUnit.assert.equal(xhrRequests.length, lp + 1, \"Check the number of attempts and requeue events should be sent\");\n                    } else {\n                        QUnit.assert.equal(sendNotifications.length, 5, 'request should have been sent and the events requeued');\n                        QUnit.assert.equal(xhrRequests.length, 5, \"Only 5 attempts and requeue events should be sent\");\n                        QUnit.assert.equal(discardNotifications.length, 1, 'The batch should now have been discarded');\n                        QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                        QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n                    }\n\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                    QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                    // Should not be required but lets just tick over some time\n                    this.clock.tick(1);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Validate asynchronous flush scenario with zero response code and requeuing and no unload - maxEventRetry == 5\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n                channelConfig.maxEventRetryAttempts = 5;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                let flushCompleted = 0;\n                for (let lp = 0; lp < 8; lp++) {\n                    // cause a asynchronous flush\n                    this.postChannel.flush(true, () => {\n                        flushCompleted++;\n                    });\n\n                    QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                    if (lp < 3) {\n                        QUnit.assert.equal(flushCompleted, lp, lp + \":The flush should have been completed asynchronously\");\n                        QUnit.assert.equal(sendNotifications.length, (lp * 2), lp + \":request should have been sent and the events requeued\");\n                        QUnit.assert.equal(discardNotifications.length, 0, lp + \":No Discard events yet as they are sent\");\n                        QUnit.assert.equal(xhrRequests.length, (lp * 2), lp + \":Check the number of attempts and requeue events should be sent\");\n\n                        // Simulate time passing for the requeue/random back off timer for sending of the events and wait for the flush to complete\n                        let attempt = 0;\n                        while (attempt < 6000 && flushCompleted === lp) {\n                            this.clock.tick(10);\n                            attempt++;\n                        }\n\n                        QUnit.assert.equal(flushCompleted, lp + 1, \"The flush should have been completed asynchronously\");\n                        if (lp === 2) {\n                            QUnit.assert.equal(sendNotifications.length, 6, lp + \":request should have been sent and the events requeued\");\n                            QUnit.assert.equal(xhrRequests.length, 6, lp + \":Only 6 attempts and requeue events should be sent\");\n                            QUnit.assert.equal(discardNotifications.length, 1, \"The batch should now have been discarded\");\n                            QUnit.assert.equal(discardNotifications[0].events.length, 50, \"There should be 50 discarded event\");\n                            QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', \"The first event discarded should be event testEvent-0\");\n                        } else {\n                            QUnit.assert.equal(sendNotifications.length, ((lp + 1) * 2), 'request should have been sent and the events requeued');\n                            QUnit.assert.equal(xhrRequests.length, ((lp + 1) * 2), \"Check the number of attempts and requeue events should be sent\");\n                            QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                        }\n                    } else {\n                        QUnit.assert.equal(flushCompleted, lp, lp + \":The flush should have been completed asynchronously\");\n                        this.clock.tick(30000);\n                        QUnit.assert.equal(flushCompleted, (lp + 1), lp + \":The flush should have been completed asynchronously\");\n                        QUnit.assert.equal(sendNotifications.length, 6, lp + \":request should have been sent and the events requeued\");\n                        QUnit.assert.equal(xhrRequests.length, 6, lp + \":Only 6 attempts and requeue events should be sent\");\n                        QUnit.assert.equal(discardNotifications.length, 1, 'No Discard events yet as they are sent');\n                        QUnit.assert.equal(discardNotifications[0].events.length, 50, \"There should be 50 discarded event\");\n                        QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', \"The first event discarded should be event testEvent-0\");\n                    }\n\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                    QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                    // Should not be required but lets just tick over some time\n                    this.clock.tick(1);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Validate asynchronous flush scenario with zero response code and requeuing and no unload - maxEventRetry == 4\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                // Return on error immediately to simulate a synchronous failure\n                                oncomplete(0, {});\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n                channelConfig.maxEventRetryAttempts = 4;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                let flushCompleted = 0;\n                for (let lp = 0; lp < 8; lp++) {\n                    // cause a asynchronous flush\n                    this.postChannel.flush(true, () => {\n                        flushCompleted++;\n                    });\n\n                    QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                    if (lp < 2) {\n                        QUnit.assert.equal(flushCompleted, lp, lp + \":The flush should have been completed asynchronously\");\n                        QUnit.assert.equal(sendNotifications.length, (lp * 2), lp + \":request should have been sent and the events requeued\");\n                        QUnit.assert.equal(discardNotifications.length, 0, lp + \":No Discard events yet as they are sent\");\n                        QUnit.assert.equal(xhrRequests.length, (lp * 2), lp + \":Check the number of attempts and requeue events should be sent\");\n\n                        // Simulate time passing for the requeue/random back off timer for sending of the events and wait for the flush to complete\n                        let attempt = 0;\n                        while (attempt < 6000 && flushCompleted === lp) {\n                            this.clock.tick(10);\n                            attempt++;\n                        }\n\n                        QUnit.assert.equal(flushCompleted, lp + 1, \"The flush should have been completed asynchronously\");\n                        if (lp === 1) {\n                            QUnit.assert.equal(sendNotifications.length, 4, lp + \":request should have been sent and the events requeued\");\n                            QUnit.assert.equal(xhrRequests.length, 4, lp + \":Only 4 attempts and requeue events should be sent\");\n                            QUnit.assert.equal(discardNotifications.length, 1, \"The batch should now have been discarded\");\n                            QUnit.assert.equal(discardNotifications[0].events.length, 50, \"There should be 50 discarded event\");\n                            QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', \"The first event discarded should be event testEvent-0\");\n                        } else {\n                            QUnit.assert.equal(sendNotifications.length, ((lp + 1) * 2), 'request should have been sent and the events requeued');\n                            QUnit.assert.equal(xhrRequests.length, ((lp + 1) * 2), \"Check the number of attempts and requeue events should be sent\");\n                            QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                        }\n                    } else {\n                        QUnit.assert.equal(flushCompleted, lp, lp + \":The flush should have been completed asynchronously\");\n                        this.clock.tick(30000);\n                        QUnit.assert.equal(flushCompleted, (lp + 1), lp + \":The flush should have been completed asynchronously\");\n                        QUnit.assert.equal(sendNotifications.length, 4, lp + \":request should have been sent and the events requeued\");\n                        QUnit.assert.equal(xhrRequests.length, 4, lp + \":Only 4 attempts and requeue events should be sent\");\n                        QUnit.assert.equal(discardNotifications.length, 1, 'No Discard events yet as they are sent');\n                        QUnit.assert.equal(discardNotifications[0].events.length, 50, \"There should be 50 discarded event\");\n                        QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', \"The first event discarded should be event testEvent-0\");\n                    }\n\n                    QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                    QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                    // Should not be required but lets just tick over some time\n                    this.clock.tick(1);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Validate retry scenario with zero response code -- hitting the maximum back off limit\",\n            useFakeTimers: true,\n            test: () => {\n                let sentNotifications = [];\n                let discardNotifications = [];\n                let sendNotifications = [];\n                let xhrRequests = [];\n                let beaconCalls = [];\n\n                this.hookSendBeacon((url, data) => {\n                    beaconCalls.push({\n                        url,\n                        data,\n                    });\n                    return false;\n                });\n\n                var fetchCalls = this.hookFetch((resolve, reject) => {\n                    setTimeout(function() {\n                        reject();\n                    }, 0);\n                });\n\n                this.config.extensionConfig[this.postChannel.identifier] = {\n                    httpXHROverride: {\n                        sendPOST: (payload: IPayloadData,\n                            oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) => {\n                                xhrRequests.push({\n                                    payload: payload,\n                                    isSync: sync,\n                                    oncomplete: oncomplete\n                                });\n\n                                setTimeout(function() {\n                                    oncomplete(0, {});\n                                }, 0);\n                            }\n                    }\n                };\n\n                let channelConfig: IChannelConfiguration = this.config.extensionConfig[this.postChannel.identifier] || {};\n                this.config.extensionConfig[this.postChannel.identifier] = channelConfig;\n\n                // Always use the XHR Override so that we can correct simulate a zero response\n                channelConfig.alwaysUseXhrOverride = true;\n\n                this.core.initialize(this.config, [this.postChannel]);\n                this.core.addNotificationListener({\n                    eventsSent: (events: ITelemetryItem[]) => {\n                        sentNotifications.push(events);\n                    },\n                    eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                        discardNotifications.push({\n                            events: events,\n                            reason: reason\n                        });\n                    },\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason: sendReason,\n                            isAsync: isAsync\n                        });\n                    }\n                });\n\n                for (let lp = 0; lp < 50; lp++) {\n                    this.postChannel.processTelemetry({\n                        name: 'testEvent-' + lp,\n                        latency: EventLatency.RealTime,\n                        iKey: 'testIkey'\n                    } as IPostTransmissionTelemetryItem);\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 0, 'No Send events yet as they are sent');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(discardNotifications.length, 0, 'No Discard events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 0, \"We haven't actually sent the request yet\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                this.postChannel.flush();\n\n                // Let the auto flush send event to send\n                this.clock.tick(2);\n\n                for (let retry = 0; retry < 8; retry++) {\n                    if (retry < 4) {\n                        QUnit.assert.equal(sendNotifications.length, retry + 1, retry + \": We should now have attempted to send the events\");\n                        QUnit.assert.equal(sentNotifications.length, 0, retry + \": No Sent events yet as they are sent\");\n                        QUnit.assert.equal(discardNotifications.length, 0, retry + \": No Discard events yet as they are sent\");\n                        QUnit.assert.equal(xhrRequests.length, retry + 1, retry + \": Check requests should be sent\");\n                        QUnit.assert.equal(fetchCalls.length, 0, retry + \": No Fetch requests\");\n                        QUnit.assert.equal(beaconCalls.length, 0, retry + \": No Beacon requests\");\n    \n                        // Simulate time passing for the requeue and sending of the events\n                        let attempt = 0;\n                        while (attempt < 6000 && sendNotifications.length === (retry + 1)) {\n                            this.clock.tick(10);\n                            attempt++;\n                        }\n                    } else {\n                        QUnit.assert.equal(sendNotifications.length, 4, retry + \": We should now have attempted to send the events\");\n                        QUnit.assert.equal(sentNotifications.length, 0, retry + \": No Sent events yet as they are sent\");\n                        QUnit.assert.equal(xhrRequests.length, 4, retry + \": Check requests should be sent\");\n                        QUnit.assert.equal(fetchCalls.length, 0, retry + \": No Fetch requests\");\n                        QUnit.assert.equal(beaconCalls.length, 0, retry + \": No Beacon requests\");\n\n                        // Jump forward 30 seconds\n                        this.clock.tick(30000);\n                    }\n                }\n\n                // Add a new event which will cause a new event to be sent\n                this.postChannel.processTelemetry({\n                    name: 'testEvent-extra',\n                    latency: EventLatency.RealTime,\n                    iKey: 'testIkey'\n                } as IPostTransmissionTelemetryItem);                \n\n                // Simulate time passing for the requeue/random back off timer for sending of the events\n                let attempt = 0;\n                while (attempt < 6000 && sendNotifications.length < 5) {\n                    this.clock.tick(10);\n                    attempt++;\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 5, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 5, \"Check requests should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                // Simulate time passing for the retry which uses a random back off timer for sending of the events\n                attempt = 0;\n                while (attempt < 7000 && (sendNotifications.length < 6 || discardNotifications.length < 1 || xhrRequests.length < 6)) {\n                    this.clock.tick(10);\n                    attempt++;\n                }\n\n                QUnit.assert.equal(sendNotifications.length, 6, 'We should now have attempted to send the events');\n                QUnit.assert.equal(sentNotifications.length, 0, 'No Sent events yet as they are sent');\n                QUnit.assert.equal(xhrRequests.length, 6, \"Check requests should be sent\");\n                QUnit.assert.equal(fetchCalls.length, 0, \"No Fetch requests\");\n                QUnit.assert.equal(beaconCalls.length, 0, \"No Beacon requests\");\n\n                QUnit.assert.equal(discardNotifications.length, 1, 'The batch should now have been discarded');\n                QUnit.assert.equal(discardNotifications[0].events.length, 50, 'There should be 50 discarded event');\n                QUnit.assert.equal(discardNotifications[0].events[0].name, 'testEvent-0', 'The first event discarded should be event testEvent-0');\n\n            }\n        });\n\n        this.testCase({\n            name: \"Post Channel: check excludeCsMetaData\",\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                let config = this.config;\n                let core = this.core;\n                let postChannel = this.postChannel;\n                let identifier = postChannel.identifier;\n                let event1: IPostTransmissionTelemetryItem = TestHelper.mockEvent(EventPersistence.Normal);\n                let event2: IPostTransmissionTelemetryItem = TestHelper.mockEvent(EventPersistence.Normal);\n                core.initialize(config, [postChannel]);\n\n                // test timeout\n                core.track(event1);\n                this.clock.tick(10001);\n\n                let requests = this._getXhrRequests();\n                QUnit.assert.equal(requests.length, 1, \"request should be sent\");\n                requests[0].respond(200, {}, \"response body\");\n\n                QUnit.assert.equal(requests[0].method, \"POST\", \"request method should be POST\");\n\n                let evt = JSON.parse(requests[0][\"requestBody\"]);\n                QUnit.assert.equal(evt.name, event1.name, \"request data should be set\");\n                let metaData = evt.ext.metadata;\n                QUnit.assert.ok(!isNullOrUndefined(metaData));\n                QUnit.assert.equal(metaData.f.evValue2.t, 8193, \"evValue should be tagged\");\n                QUnit.assert.equal(metaData.f.value5.t, 6, \"value5 should be tagged as number\");\n                QUnit.assert.equal(metaData.f.value1.a.t, 6, \"value1 should be tagged as array of numbers\");\n\n                // Disable CsMetaData\n                core!.config!.extensionConfig![identifier].excludeCsMetaData = true;\n                // Let the dynamic config changes occur\n                this.clock.tick(1);\n\n                core.track(event2);\n                this.clock.tick(10001);\n\n                requests = this._getXhrRequests();\n                QUnit.assert.equal(requests.length, 2, \"request should be sent\");\n                requests[1].respond(200, {}, \"response body\");\n\n                QUnit.assert.equal(requests[1].method, \"POST\", \"request method should be POST\");\n\n                evt = JSON.parse(requests[1][\"requestBody\"]);\n                QUnit.assert.equal(evt.name, event2.name, \"request data should be set\");\n                metaData = evt.ext.metadata;\n                QUnit.assert.equal(metaData, undefined, \"metadata should be undefined\");\n            }\n        });\n\n    }\n}\n\nclass AutoCompleteXhrOverride {\n    public sendPOST(payload: IPayloadData, oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) {\n        oncomplete(200, null);\n    }\n}"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/SerializerTest.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { HttpManager } from '../../../src/HttpManager';\nimport { AppInsightsCore, EventLatency, EventSendType, IEventProperty, SendRequestReason, IXHROverride, IPayloadData } from '@microsoft/applicationinsights-core-js';\nimport { PostChannel } from '../../../src/PostChannel';\nimport { IPostTransmissionTelemetryItem, EventBatchNotificationReason, IChannelConfiguration } from '../../../src/DataModels';\nimport { Serializer } from '../../../src/Serializer';\nimport { EventBatch } from \"../../../src/EventBatch\";\n\n\nexport class SerializerTest extends AITestClass {\n\n    constructor(name?: string, emulateEs3?: boolean) {\n        super(name, emulateEs3);\n        \n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: 'getEventBlob with compoundKey support',\n            test: () => {\n                let serializer = new Serializer(null, null, null, true);\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: \"1234-5678\",\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        'testObject.testProperty': 456\n                    },\n                    baseData: {},\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n\n                QUnit.assert.equal(serializedEvent, '{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject\\\":{\\\"testProperty\\\":456}}}');\n            }\n        });\n\n        this.testCase({\n            name: \"Append payload with max number per batch\",\n            test: () => {\n                let maxNumberEvtPerBatch = 3;\n                let serializer = new Serializer(null, null, null, false, null, null);\n                let ikey = \"1234-5678\";\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n                let event1: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent1\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n    \n                let payload = serializer.createPayload(0, false, false, false, SendRequestReason.NormalSchedule, EventSendType.Batched);\n                let batch = EventBatch.create(ikey, [event, event1]);\n                serializer.appendPayload(payload, batch, maxNumberEvtPerBatch);\n                let evts = payload.payloadBlob;\n                let expectedPayload = \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}\" + \"\\n\" +\n                \"{\\\"name\\\":\\\"testEvent1\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}\"\n                QUnit.assert.equal(evts, expectedPayload, \"should contain both events\");\n                let overflow = payload.overflow;\n                QUnit.assert.equal(overflow, null, \"should not have overflow batch\");\n                let sizeExceed = payload.sizeExceed;\n                QUnit.assert.equal(sizeExceed.length, 0, \"should not have size exceed batch\");\n            }\n        });\n\n        this.testCase({\n            name: \"Append payload with exceed max number per batch\",\n            test: () => {\n                let maxNumberEvtPerBatch = 1;\n                let serializer = new Serializer(null, null, null, false, null, null);\n                let ikey = \"1234-5678\";\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n                let event1: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent1\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n    \n                let payload = serializer.createPayload(0, false, false, false, SendRequestReason.NormalSchedule, EventSendType.Batched);\n                let batch = EventBatch.create(ikey, [event, event1]);\n                serializer.appendPayload(payload, batch, maxNumberEvtPerBatch);\n                let evts = payload.payloadBlob;\n                let expectedPayload = \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}\";\n                QUnit.assert.equal(evts, expectedPayload, \"should contain both events\");\n                let overflow = payload.overflow;\n                QUnit.assert.equal(overflow.count(), 1, \"should have only one overflow batch\");\n                let overflowEvts = overflow.events();\n                QUnit.assert.equal(overflowEvts.length, 1, \"should have only one overflow event\");\n                QUnit.assert.equal(overflowEvts[0], event1, \"overflow should have event1\");\n                let sizeExceed = payload.sizeExceed;\n                QUnit.assert.equal(sizeExceed.length, 0, \"should not have size exceed batch\");\n            }\n        });\n\n        this.testCase({\n            name: \"Append payload with size limit channel config\",\n            test: () => {\n                let cfg = {\n                    requestLimit: {\n                        requestLimit: [200, 200],\n                        recordLimit: [200,200]\n                    }\n                } as IChannelConfiguration\n                let serializer = new Serializer(null, null, null, false, null, null, cfg);\n                let ikey = \"1234-5678\";\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n                let event1: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent1\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n    \n                let payload = serializer.createPayload(0, false, false, false, SendRequestReason.NormalSchedule, EventSendType.Batched);\n                let batch = EventBatch.create(ikey, [event, event1]);\n                serializer.appendPayload(payload, batch, 100);\n                let evts = payload.payloadBlob;\n                let expectedPayload = \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}\" + \"\\n\" +\n                \"{\\\"name\\\":\\\"testEvent1\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}\"\n                QUnit.assert.equal(evts, expectedPayload, \"should contain both events\");\n                let overflow = payload.overflow;\n                QUnit.assert.equal(overflow, null, \"should not have overflow batch\");\n                let sizeExceed = payload.sizeExceed;\n                QUnit.assert.equal(sizeExceed.length, 0, \"should not have size exceed batch\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"Append overflow payload with size limit channel config\",\n            test: () => {\n                let cfg = {\n                    requestLimit: {\n                        recordLimit: [100,100],\n                        requestLimit: [100, 100]\n                    }\n                } as IChannelConfiguration\n                let serializer = new Serializer(null, null, null, false, null, null, cfg);\n                let ikey = \"1234-5678\";\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n                let event1: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent1\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n    \n                let payload = serializer.createPayload(0, false, false, false, SendRequestReason.NormalSchedule, EventSendType.Batched);\n                let batch = EventBatch.create(ikey, [event, event1]);\n                serializer.appendPayload(payload, batch, 100);\n                let evts = payload.payloadBlob;\n                QUnit.assert.equal(evts, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}\", \"should contain only one event\");\n                let overflow = payload.overflow;\n                QUnit.assert.equal(overflow.count(), 1, \"should have only one overflow batch\");\n                let overflowEvts = overflow.events();\n                QUnit.assert.equal(overflowEvts.length, 1, \"should have only one overflow event\");\n                QUnit.assert.equal(overflowEvts[0], event1, \"overflow should have event1\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"Append exceed size payload with size limit channel config\",\n            test: () => {\n                let cfg = {\n                    requestLimit: {\n                        recordLimit: [100,100],\n                        requestLimit: [100, 100]\n                    }\n                } as IChannelConfiguration\n                let serializer = new Serializer(null, null, null, false, null, null, cfg);\n                let ikey = \"1234-5678\";\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": 456\n                    },\n                    baseData: {}\n                };\n                let largEvent: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: ikey,\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        \"testObject.testProperty\": new Array(100).join(\"a\")\n                    },\n                    baseData: {}\n                };\n                let payload = serializer.createPayload(0, false, false, false, SendRequestReason.NormalSchedule, EventSendType.Batched);\n                let largeBatch = EventBatch.create(ikey, [event, largEvent]);\n                serializer.appendPayload(payload, largeBatch, 100);\n                let evts = payload.payloadBlob;\n                QUnit.assert.equal(evts, \"{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}\", \"should have only one overflow batch\");\n                let sizeExceed = payload.sizeExceed;\n                QUnit.assert.equal(sizeExceed.length, 1, \"should have only one payload with size exceed\");\n                let sizeExceedBatch = sizeExceed[0];\n                QUnit.assert.equal(sizeExceedBatch.count(), 1, \"exceed Batch should have only one event\");\n                let sizeExceedEvts = sizeExceedBatch.events();\n                QUnit.assert.equal(sizeExceedEvts[0], largEvent, \"exceed batch should only contain large event\")\n            }\n        });\n\n        this.testCase({\n            name: 'getEventBlob without compoundKey support',\n            test: () => {\n                let serializer = new Serializer(null, null, null, false);\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    iKey: \"1234-5678\",\n                    latency: EventLatency.Normal,       // Should not get serialized\n                    data: {\n                        'testObject.testProperty': 456\n                    },\n                    baseData: {},\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n\n                QUnit.assert.equal(serializedEvent, '{\\\"name\\\":\\\"testEvent\\\",\\\"iKey\\\":\\\"o:1234\\\",\\\"data\\\":{\\\"baseData\\\":{},\\\"testObject.testProperty\\\":456}}');\n            }\n        });\n\n        this.testCase({\n            name: 'metadata with event property with compoundKey support',\n            test: () => {\n                let serializer = new Serializer(null, null, null, true);\n\n                let testProperty: IEventProperty = {\n                    value: \"testValue\",\n                    kind: 13, //Pii_IPV4AddressLegacy\n                    propertyType: 1 //String\n                };\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        'testProperty': testProperty\n                    },\n                    data: {\n                        'testPartC': 123,\n                        'testObject.testProperty': 456\n                    },\n                    ext: {}\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n                let expectedMetaData: any = {\n                    f: {\n                        baseData: {\n                            f: {\n                                testProperty: { t: 417 }\n                            }\n                        },\n                        testPartC: { t: 6 },\n                        testObject: {\n                            f: {\n                                testProperty: { t: 6 }\n                            }\n                        }\n                    }\n                };\n\n                let metaData = JSON.stringify(parsedEvent.ext.metadata);\n                QUnit.assert.equal(metaData, JSON.stringify(expectedMetaData), 'Checking: ' + metaData);\n            }\n        });\n\n        this.testCase({\n            name: 'metadata with event property without compoundKey support',\n            test: () => {\n                let serializer = new Serializer(null, null, null, false);\n\n                let testProperty: IEventProperty = {\n                    value: \"testValue\",\n                    kind: 13, //Pii_IPV4AddressLegacy\n                    propertyType: 1 //String\n                };\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        'testProperty': testProperty\n                    },\n                    data: {\n                        'testPartC': 123,\n                        'testObject.testProperty': 456\n                    },\n                    ext: {}\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n                let expectedMetaData: any = {\n                    f: {\n                        baseData: {\n                            f: {\n                                testProperty: { t: 417 }\n                            }\n                        },\n                        testPartC: { t: 6 },\n                        'testObject.testProperty': { t: 6 }\n                    }\n                };\n\n                let metaData = JSON.stringify(parsedEvent.ext.metadata);\n                QUnit.assert.equal(metaData, JSON.stringify(expectedMetaData), 'Checking: ' + metaData);\n            }\n        });\n\n        this.testCase({\n            name: 'nested elements metadata',\n            test: () => {\n                let serializer = new Serializer();\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        \"testProperty\": {\n                            \"testA\": 123,\n                            \"testB\": \"test\"\n                        }\n                    },\n                    data: {\n                        \"testProperty2\": 123,\n                        \"testPartCNested\": {\n                            \"testC\": {\n                                \"testD\": {\n                                    \"test\": 456\n                                }\n                            }\n                        }\n                    },\n                    ext: {}\n                };\n\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n\n                let expectedMetaData: any = {\n                    f: {\n                        baseData: {\n                            f: {\n                                testProperty: {\n                                    f: {\n                                        testA: { t: 6 }\n                                    }\n                                }\n                            }\n                        },\n                        testProperty2: { t: 6 },\n                        testPartCNested: {\n                            f: {\n                                testC: {\n                                    f: {\n                                        testD: {\n                                            f: {\n                                                test: { t: 6 }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                };\n                \n                let metaData = JSON.stringify(parsedEvent.ext.metadata);\n                QUnit.assert.equal(metaData, JSON.stringify(expectedMetaData), 'Checking: ' + metaData);\n            }\n        });\n\n        this.testCase({\n            name: 'array metadata',\n            test: () => {\n                let serializer = new Serializer();\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        \"testProperty\": {\n                            \"testA\": [\"test1\", \"test2\", \"test3\"]\n                        }\n                    },\n                    data: {\n                        \"testProperty2\": [1, 2, 3, 4]\n                    },\n                    ext: {}\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n\n                let expectedMetaData: any = {\n                    f: {\n                        testProperty2: {\n                            a: { t: 6 }\n                        }\n                    }\n                };\n\n                let metaData = JSON.stringify(parsedEvent.ext.metadata);\n                QUnit.assert.equal(metaData, JSON.stringify(expectedMetaData), 'Checking: ' + metaData);\n            }\n        });\n\n        this.testCase({\n            name: 'excluded metadata with event property with compoundKey support',\n            test: () => {\n                let serializer = new Serializer(undefined, undefined, undefined, true, undefined, true);\n\n                let testProperty: IEventProperty = {\n                    value: \"testValue\",\n                    kind: 13, //Pii_IPV4AddressLegacy\n                    propertyType: 1 //String\n                };\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        'testProperty': testProperty\n                    },\n                    data: {\n                        'testPartC': 123,\n                        'testObject.testProperty': 456\n                    },\n                    ext: {}\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n                QUnit.assert.equal(parsedEvent.ext.metadata, undefined, 'Checking: Meta Data was not included');\n            }\n        });\n\n        this.testCase({\n            name: 'exclude metadata with event property without compoundKey support',\n            test: () => {\n                let serializer = new Serializer(undefined, undefined, undefined, false, undefined, true);\n\n                let testProperty: IEventProperty = {\n                    value: \"testValue\",\n                    kind: 13, //Pii_IPV4AddressLegacy\n                    propertyType: 1 //String\n                };\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        'testProperty': testProperty\n                    },\n                    data: {\n                        'testPartC': 123,\n                        'testObject.testProperty': 456\n                    },\n                    ext: {}\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n                QUnit.assert.equal(parsedEvent.ext.metadata, undefined, 'Checking: Meta Data was not included');\n            }\n        });\n\n        this.testCase({\n            name: 'nested elements excluding metadata',\n            test: () => {\n                let serializer = new Serializer(undefined, undefined, undefined, undefined, undefined, true);\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        \"testProperty\": {\n                            \"testA\": 123,\n                            \"testB\": \"test\"\n                        }\n                    },\n                    data: {\n                        \"testProperty2\": 123,\n                        \"testPartCNested\": {\n                            \"testC\": {\n                                \"testD\": {\n                                    \"test\": 456\n                                }\n                            }\n                        }\n                    },\n                    ext: {}\n                };\n\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n                QUnit.assert.equal(parsedEvent.ext.metadata, undefined, 'Checking: Meta Data was not included');\n            }\n        });\n\n        this.testCase({\n            name: 'array excluding metadata',\n            test: () => {\n                let serializer = new Serializer(undefined, undefined, undefined, undefined, undefined, true);\n                let event: IPostTransmissionTelemetryItem = {\n                    name: \"testEvent\",\n                    baseData: {\n                        \"testProperty\": {\n                            \"testA\": [\"test1\", \"test2\", \"test3\"]\n                        }\n                    },\n                    data: {\n                        \"testProperty2\": [1, 2, 3, 4]\n                    },\n                    ext: {}\n                };\n                let serializedEvent = serializer.getEventBlob(event);\n                let parsedEvent = JSON.parse(serializedEvent);\n                QUnit.assert.equal(parsedEvent.ext.metadata, undefined, 'Checking: Meta Data was not included');\n            }\n        });\n\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/TestHelper.ts",
    "content": "import { IExtendedTelemetryItem } from '@microsoft/applicationinsights-core-js';\n\nexport class TestHelper {\n    private static _idCount = 0;\n\n    static reset(key: string) {\n        this._idCount = 0;\n        localStorage.removeItem(key);\n    }\n\n    static mockEvent(persistence: number): IExtendedTelemetryItem {\n        this._idCount++;\n        return {\n            name: 'test_event-' + this._idCount.toString(),\n            baseType: 'custom',\n            time: '',\n            persistence: persistence,\n            data: {\n                'key': 'value',\n                empty: [],\n                value1: [1],\n                value2: ['Hello'],\n                value3: [['Hello']],\n                value4: true,\n                value5: 42,\n                value6: {\n                    more: {\n                        data: 'X'\n                    }\n                },\n                evValue1: {\n                    value: 'event Property'\n                },\n                evValue2: {\n                    value: 'event Property2',\n                    kind: 32 /* CustomerContent_GenericContent */,\n                    propertyType: 1 /* String */\n                }\n            }\n        };\n    }\n\n    static mockEvent2(persistence: number): IExtendedTelemetryItem {\n        this._idCount++;\n        return {\n            name: 'test_event-' + this._idCount.toString(),\n            time: ' 1970-01-01T00:00:00.000Z',\n            ver: '4.0',\n            iKey: 'o:12345-12345',\n            ext: {\n                sdk: {\n                    ver: 'Hello version 1.0',\n                    seq: 1,\n                    epoch: '0',\n                    installId: 'TestDeviceId'\n                },\n                app: { sesId: '####' },\n                user: { locale: 'en-US' },\n                web: { domain: 'localhost' },\n                intweb: { },\n                utc: { popSample: 100 },\n                loc: { tz: '-08:00' },\n                metadata: {\n                    f: {\n                        value1: { a: { t: 6 } },\n                        value5: { t: 6 },\n                        evValue2: { t: 8193 }\n                    }\n                }\n            },\n            baseData: {\n                properties: {\n                    version: '##currentPluginVersions##'\n                }\n            },\n            data: {\n                baseType: 'testEventBaseType',\n                value1: [1],\n                value2: ['Hello'],\n                value3: [['Hello']],\n                value4: true,\n                value5: 42,\n                value6: {\n                    more: {\n                        data: 'X'\n                    }\n                },\n                evValue1: 'event Property',\n                evValue2: 'event Property2'\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "channels/1ds-post-js/test/Unit/src/post.unittests.ts",
    "content": "import { PostChannelTest } from './PostChannelTest';\nimport { HttpManagerTest } from './HttpManagerTest';\nimport { KillSwitchTest } from './KillSwitchTest';\nimport { SerializerTest } from './SerializerTest';\nimport { FileSizeCheckTest } from \"./FileSizeCheckTest\"\nimport { GlobalTestHooks } from './GlobalTestHooks.Test';\n\nexport function registerTests() {\n    new GlobalTestHooks().registerTests();\n    new PostChannelTest(\"PostChannelTest\").registerTests();\n    new HttpManagerTest(\"HttpManagerTest\").registerTests();\n    new HttpManagerTest(\"HttpManagerTest\", true).registerTests();\n    new KillSwitchTest(\"KillSwitchTest\").registerTests();\n    new SerializerTest(\"SerializerTest\").registerTests();\n    new FileSizeCheckTest(\"FileSizeCheckTest\").registerTests();\n}\n\nregisterTests();\n"
  },
  {
    "path": "channels/1ds-post-js/test/UnitTests.html",
    "content": "<html>\n\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n  <meta name=\"viewport\" content=\"width=device-width\">\n  <title>1DS Unit Tests</title>\n  <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n  <script src=\"../../../common/Tests/Selenium/ExceptionHelper.js\"></script>\n  <script src=\"../../../common/Tests/External/sinon-7.3.1.js\"></script>\n  <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n  <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n  <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit:          \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.0.0\",\n                \"sinon\":        \"../../../common/Tests/External/sinon-7.3.1\",\n                \"pako\":        \"./node_modules/pako/dist/pako\",\n                \"@nevware21/ts-async\": \"./node_modules/@nevware21/ts-async/dist/es5/umd/ts-async\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, () => {\n          var testModule = modules.add(\"test/Unit/src/post.unittests\", \"./Unit/dist/post.unittests.js\")\n          testModule.run = function () {\n              console && console.log(\"Starting tests...\");\n              QUnit.start();\n          };\n\n          modules.run();\n        });\n\n\n  </script>\n</head>\n\n<body>\n  <div id=\"qunit\"></div>\n  <div id=\"qunit-fixture\"></div>\n  <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "channels/1ds-post-js/test/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}"
  },
  {
    "path": "channels/1ds-post-js/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"module\": \"es6\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"strictNullChecks\": false,\n        \"suppressImplicitAnyIndexErrors\": true,\n        \"allowSyntheticDefaultImports\": true,\n        \"importHelpers\": true,\n        \"noEmitHelpers\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"declaration\": true,\n        \"declarationDir\": \"build/types\",\n        \"removeComments\": false,\n        \"outDir\": \"dist-es5/\",\n        \"rootDir\": \"./src\"\n    },\n    \"include\": [\n        \"./src/**/*.ts\"\n    ],\n    \"exclude\": [\n        \"node_modules/\"\n    ]\n}"
  },
  {
    "path": "channels/1ds-post-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "channels/1ds-post-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/Index.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/1ds-post-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/1ds-post.js\",\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/channels/1ds-post.js\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/1ds-post-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "channels/applicationinsights-channel-js/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.sln.docstates\n\n# Build results\n[Dd]ebug/\n[Rr]elease/\n[Bb]in/\n[Oo]bj/\n[Oo]bj//Core/Javascript/ai*.[tj]s*\n\n# Telemetry output\n*.onesipkg\n\n# Enable \"build/\" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets\n!packages/*/build/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n*_i.c\n*_p.c\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.log\n*.scc\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Local tgz files\n*.tgz\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n*.ncrunch*\n.*crunch*.local.xml\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.Publish.xml\n\n# NuGet binaries downloaded automatically\npackages/\n\n# Windows Azure Build Output\ncsx\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Others\nsql/\n*.Cache\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.[Pp]ublish.xml\n*.publishsettings\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file to a newer\n# Visual Studio version. Backup files are not needed, because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\nApp_Data/*.mdf\nApp_Data/*.ldf\n\n\n#LightSwitch generated files\nGeneratedArtifacts/\n_Pvt_Extensions/\nModelManifest.xml\n\n# =========================\n# Windows detritus\n# =========================\n\n# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Mac desktop service store files\n.DS_Store\n\n# Build log files\n*.err\n*.prf\n*.wrn\n\n# Visual studio 2015 user specific files\nJavaScript/.vs\n\n# Temp directories\nbundle/\nnode_modules/\nout/\ncoreSDK/node_modules\n\n# Build directories\nbrowser/\ndist-esm/\ndist/\ntypes/\n\n# Grunt\n.tscache\n\n#npm\nnpm\n\n# Rollup\nstatistics.html\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "channels/applicationinsights-channel-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Channel\n\nChannel layer for the Application Insights JavaScript SDK\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-channel-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-channel-js)\n\n\n## Build\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n## Test\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/Tests/Unit/src/Sample.tests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { createSampler } from \"../../../src/TelemetryProcessors/Sample\";\nimport { ITelemetryItem, isBeaconsSupported, newId } from \"@microsoft/applicationinsights-core-js\";\nimport { TelemetryItemCreator, IPageViewTelemetry, PageViewDataType, PageViewEnvelopeType, ISample } from \"@microsoft/applicationinsights-core-js\";\nimport { getHashCodeScore } from \"../../../src/TelemetryProcessors/SamplingScoreGenerators/HashCodeScoreGenerator\";\n\nexport class SampleTests extends AITestClass {\n    private sample: ISample;\n    private item: ITelemetryItem;\n\n    public testInitialize() {\n        // Reset the cached isBeacons supported\n        isBeaconsSupported(false);\n    }\n\n    public testCleanup() {\n        this.sample = null;\n        this.item = null;\n    }\n\n    public registerTests() {\n        this.addSamplingTests();\n    }\n\n    private addSamplingTests() {\n        this.testCase({\n            name: 'Sampling: isSampledIn returns true for 100 sampling rate',\n            test: () => {\n                this.sample = createSampler(100);\n                this.item = this.getTelemetryItem();\n                const scoreStub = this.sandbox.stub(this.sample[\"generator\"], \"getScore\");\n\n                QUnit.assert.ok(this.sample.isSampledIn(this.item));\n                QUnit.assert.ok(scoreStub.notCalled);\n            }\n        });\n\n        this.testCase({\n            name: 'Sampling: hashing is based on user id even if operation id is provided',\n            test: () => {\n                this.sample = createSampler(33);\n\n                const userid = \"asdf\";\n\n                const item1 = this.getTelemetryItem();\n                item1.tags[\"ai.user.id\"] = userid;\n                item1.tags[\"ai.operation.id\"] = \"operation 1\";\n\n                const item2 = this.getTelemetryItem();\n                item2.tags[\"ai.user.id\"] = userid;\n                item2.tags[\"ai.operation.id\"] = \"operation 1\";\n\n                const isSampledIn1 = this.sample.isSampledIn(item1);\n                const isSampledIn2 = this.sample.isSampledIn(item2);\n\n                QUnit.assert.equal(isSampledIn1, isSampledIn2);\n            }\n        });\n\n        this.testCase({\n            name: 'Sampling: hashing is based on operation id if no user id is provided',\n            test: () => {\n                this.sample = createSampler(33);\n                const operationId = \"operation id\";\n\n                const item1 = this.getTelemetryItem();\n                item1.tags[\"ai.user.id\"] = null;\n                item1.tags[\"ai.operation.id\"] = operationId;\n\n                const item2 = this.getTelemetryItem();\n                item2.tags[\"ai.user.id\"] = null;\n                item2.tags[\"ai.operation.id\"] = operationId;\n\n                const item3 = this.getTelemetryItem();\n                item3.tags[\"ai.user.id\"] = null;\n                item3.tags[\"ai.operation.id\"] = operationId;\n\n                const item4 = this.getTelemetryItem();\n                item4.tags[\"ai.user.id\"] = null;\n                item4.tags[\"ai.operation.id\"] = operationId;\n\n                // Act\n                const isSampledIn1 = this.sample.isSampledIn(item1);\n                const isSampledIn2 = this.sample.isSampledIn(item2);\n                const isSampledIn3 = this.sample.isSampledIn(item3);\n                const isSampledIn4 = this.sample.isSampledIn(item4);\n\n                QUnit.assert.equal(isSampledIn1, isSampledIn2);\n                QUnit.assert.equal(isSampledIn1, isSampledIn3);\n                QUnit.assert.equal(isSampledIn1, isSampledIn4);\n            }\n        });\n\n        this.testCase({\n            name: 'Sampling: hashing is random if no user id nor operation id provided',\n            test: () => {\n                // setup\n                this.sample = createSampler(33);\n\n                const envelope1 = this.getTelemetryItem();\n                envelope1.tags[\"ai.user.id\"] = null;\n                envelope1.tags[\"ai.operation.id\"] = null;\n\n                const mathRandomSpy = this.sandbox.spy(Math, \"random\");\n\n                // act\n                this.sample.isSampledIn(envelope1);\n\n                // assert\n                QUnit.assert.ok(mathRandomSpy.calledOnce);\n            }\n        });\n\n        this.testCase({\n            name: 'Sampling: actual sampling rate should fall into 5% error range',\n            test: () => {\n\n                // setup\n                const errorRange = 5;\n                const totalItems = 1000;\n                const ids = [];\n                for (let i = 0; i < totalItems; ++i) {\n                    ids.push(newId());\n                }\n\n                const sampleRates = [50, 33, 25, 20, 16, 10];\n\n                // act\n                sampleRates.forEach((sampleRate) => {\n                    let countOfSampledItems = 0;\n\n                    ids.forEach((id) => {\n                        if (getHashCodeScore(id) < sampleRate) {++countOfSampledItems; }\n                    });\n\n                    // Assert\n                    const actualSampleRate = 100 * countOfSampledItems / totalItems;\n                    QUnit.assert.ok(Math.abs(actualSampleRate - sampleRate) < errorRange,\n                        \"Actual sampling (\" + actualSampleRate + \") does not fall into +-2% range from expected rate (\" + sampleRate + \")\");\n                });\n            }\n        });\n    }\n\n    private getTelemetryItem(): ITelemetryItem {\n        return TelemetryItemCreator.create<IPageViewTelemetry>({\n            name: 'some page',\n            uri: 'some uri'\n        }, PageViewDataType, PageViewEnvelopeType, null);\n    }\n\n    private getMetricItem(): ITelemetryItem {\n        return null;\n    }\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/Tests/Unit/src/Sender.tests.ts",
    "content": "import { AITestClass, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { Sender } from \"../../../src/Sender\";\nimport { ExceptionDataType, IOfflineListener, createOfflineListener, utlGetSessionStorageKeys, utlRemoveSessionStorage } from \"@microsoft/applicationinsights-core-js\";\nimport { EnvelopeCreator } from '../../../src/EnvelopeCreator';\nimport {\n    Exception, CtxTagKeys, DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, utlCanUseSessionStorage, utlGetSessionStorage, utlSetSessionStorage,\n    ITelemetryItem, AppInsightsCore, ITelemetryPlugin, DiagnosticLogger, NotificationManager, SendRequestReason, _eInternalMessageId, safeGetLogger,\n    isString, isArray, arrForEach, isBeaconsSupported, IXHROverride, IPayloadData,TransportType, getWindow, ActiveStatus\n} from \"@microsoft/applicationinsights-core-js\";\nimport { ArraySendBuffer, SessionStorageSendBuffer } from \"../../../src/SendBuffer\";\nimport { IInternalStorageItem, ISenderConfig } from \"../../../src/Interfaces\";\nimport { createAsyncResolvedPromise } from \"@nevware21/ts-async\";\nimport { isPromiseLike, isUndefined } from \"@nevware21/ts-utils\";\nimport { SinonSpy } from 'sinon';\n\n\nconst BUFFER_KEY = \"AI_buffer_1\";\nconst SENT_BUFFER_KEY = \"AI_sentBuffer_1\";\nexport class SenderTests extends AITestClass {\n    private _sender: Sender;\n    private _instrumentationKey = 'iKey';\n    private _offline: IOfflineListener;\n    private genericSpy: SinonSpy;\n    private xhrOverride: IXHROverride;\n\n    protected _getBuffer(key: string, logger: DiagnosticLogger, namePrefix?: string): IInternalStorageItem[] {\n        let prefixedKey = key;\n        try {\n            prefixedKey = namePrefix ? namePrefix + \"_\" + prefixedKey : prefixedKey;\n            const bufferJson = utlGetSessionStorage(logger, prefixedKey);\n            if (bufferJson) {\n                let buffer: IInternalStorageItem[] = JSON.parse(bufferJson);\n                if (isString(buffer)) {\n                    buffer = JSON.parse(buffer as any);\n                }\n\n                if (buffer && isArray(buffer)) {\n                    return buffer;\n                }\n            }\n        } catch (e) {\n            QUnit.assert.ok(false, \"Exception - \" + e);\n        }\n        return [];\n    }\n\n    public testInitialize() {\n        this._sender = new Sender();\n        this._offline = createOfflineListener(\"SenderTests\");\n        this.xhrOverride = new AutoCompleteXhrOverride();\n\n        // Reset the cached isBeacons supported\n        isBeaconsSupported(false);\n    }\n\n    public testFinishedCleanup() {\n        if (this._offline) {\n            this._offline.unload();\n        }\n\n        if (this._sender && this._sender.isInitialized()) {\n            this._sender.pause();\n            this._sender._buffer.clear();\n            this._sender.teardown();\n        }\n        this._sender = null;\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"Channel Config: Channel can properly take args from root config\",\n            test: () => {\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        }\n\n                    }, new AppInsightsCore(), []\n                );\n\n                let extConfig = this._sender._senderConfig;\n                QUnit.assert.equal(123, extConfig.maxBatchInterval, 'Channel config can be set from root config (maxBatchInterval)');\n                QUnit.assert.equal('https://example.com', extConfig.endpointUrl, 'Channel config can be set from root config (endpointUrl)');\n                QUnit.assert.notEqual(654, extConfig.maxBatchSizeInBytes, 'Channel config does not equal root config option if extensionConfig field is also set');\n                QUnit.assert.equal(456, extConfig.maxBatchSizeInBytes, 'Channel config prioritizes extensionConfig over root config');\n\n                let offlinelistener = this._sender.getOfflineListener();\n                QUnit.assert.ok(offlinelistener, \"offline listener exists\")\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Config can be set from root dynamically\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let id = this._sender.identifier;\n                let coreConfig = {\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [id]: {\n                        \n                        }\n                    }\n                }\n                core.initialize(coreConfig, [this._sender]);\n\n                // check defaults\n                let defaultSenderConfig = this._sender._senderConfig;\n                QUnit.assert.equal(15000, defaultSenderConfig.maxBatchInterval, \"Channel default maxBatchInterval config is set\");\n                QUnit.assert.equal(\"https://dc.services.visualstudio.com/v2/track\", defaultSenderConfig.endpointUrl, \"Channel default endpointUrl config is set\");\n                QUnit.assert.equal(102400, defaultSenderConfig.maxBatchSizeInBytes, \"Channel default maxBatchSizeInBytes config is set\");\n                QUnit.assert.equal(false, defaultSenderConfig.emitLineDelimitedJson, \"Channel default emitLineDelimitedJson config is set\");\n                QUnit.assert.equal(false, defaultSenderConfig.disableTelemetry, \"Channel default disableTelemetry config is set\");\n                QUnit.assert.equal(true, defaultSenderConfig.enableSessionStorageBuffer, \"Channel default enableSessionStorageBuffer config is set\");\n                QUnit.assert.equal(false, defaultSenderConfig.isRetryDisabled, \"Channel default isRetryDisabled config is set\");\n                QUnit.assert.equal(true, defaultSenderConfig.isBeaconApiDisabled, \"Channel default isBeaconApiDisabled config is set\");\n                QUnit.assert.equal(false, defaultSenderConfig.disableXhr, \"Channel default disableXhr config is set\");\n                QUnit.assert.equal(false, defaultSenderConfig.onunloadDisableFetch, \"Channel default onunloadDisableFetch config is set\");\n                QUnit.assert.equal(false, defaultSenderConfig.onunloadDisableBeacon, \"Channel default onunloadDisableBeacon config is set\");\n                QUnit.assert.equal(undefined, defaultSenderConfig.namePrefix, \"Channel default namePrefix config is set\");\n                QUnit.assert.equal(100, defaultSenderConfig.samplingPercentage, \"Channel default samplingPercentage config is set\");\n                QUnit.assert.equal(undefined, defaultSenderConfig.customHeaders, \"Channel default customHeaders config is set\");\n                QUnit.assert.equal(undefined, defaultSenderConfig.convertUndefined, \"Channel default convertUndefined config is set\");\n                QUnit.assert.equal(10000, defaultSenderConfig.eventsLimitInMem, \"Channel default eventsLimitInMem config is set\");\n                QUnit.assert.equal(undefined, defaultSenderConfig.httpXHROverride, \"Channel default httpXHROverride config is set\");\n                QUnit.assert.equal(false, defaultSenderConfig.alwaysUseXhrOverride, \"Channel default alwaysUseXhrOverride config is set\");\n                QUnit.assert.equal(true, defaultSenderConfig.disableSendBeaconSplit, \"Channel default disableSendBeaconSplit config is set\");\n                QUnit.assert.equal(10, defaultSenderConfig.maxRetryCnt, \"Channel default maxRetryCnt config is set\");\n\n                //check dynamic config\n                core.config.extensionConfig =  core.config.extensionConfig? core.config.extensionConfig : {};\n                let config = {\n                    maxBatchInterval: 10000,\n                    maxBatchSizeInBytes: 100000,\n                    endpointUrl: \"https://test\",\n                    emitLineDelimitedJson: true,\n                    disableTelemetry: true,\n                    enableSessionStorageBuffer: false,\n                    isRetryDisabled: true,\n                    disableXhr: true,\n                    samplingPercentage: 90,\n                    customHeaders: [{header: \"header1\",value:\"value1\"}],\n                    alwaysUseXhrOverride: true,\n                    disableSendBeaconSplit: false,\n                }\n                core.config.extensionConfig[id] = config;\n                this.clock.tick(1);\n                let curSenderConfig = this._sender._senderConfig;\n                QUnit.assert.equal(10000, curSenderConfig.maxBatchInterval, \"Channel maxBatchInterval config is dynamically set\");\n                QUnit.assert.equal(100000, curSenderConfig.maxBatchSizeInBytes, \"Channel maxBatchSizeInBytes config is dynamically set\");\n                QUnit.assert.equal(\"https://test\", curSenderConfig.endpointUrl, \"Channel endpointUrl config is dynamically set\");\n                QUnit.assert.equal(true, curSenderConfig.emitLineDelimitedJson, \"Channel emitLineDelimitedJson config is dynamically set\");\n                QUnit.assert.equal(true, curSenderConfig.disableTelemetry, \"Channel disableTelemetry config is dynamically set\");\n                QUnit.assert.equal(false, curSenderConfig.enableSessionStorageBuffer, \"Channel enableSessionStorageBuffer config is dynamically set\");\n                QUnit.assert.equal(true, curSenderConfig.isRetryDisabled, \"Channel isRetryDisabled config is dynamically set\");\n                QUnit.assert.equal(90, curSenderConfig.samplingPercentage, \"Channel samplingPercentage config is dynamically set\");\n                QUnit.assert.deepEqual([{header: \"header1\",value:\"value1\"}], curSenderConfig.customHeaders, \"Channel customHeaders config is dynamically set\");\n                QUnit.assert.deepEqual(true, curSenderConfig.alwaysUseXhrOverride, \"Channel alwaysUseXhrOverride config is dynamically set\");\n                QUnit.assert.equal(false, curSenderConfig.disableSendBeaconSplit, \"Channel disableSendBeaconSplit config is dynamically set\");\n                core.config.extensionConfig[this._sender.identifier].emitLineDelimitedJson = undefined;\n                core.config.extensionConfig[this._sender.identifier].endpointUrl = undefined;\n                this.clock.tick(1);\n                QUnit.assert.equal(\"https://dc.services.visualstudio.com/v2/track\", this._sender._senderConfig.endpointUrl, \"Channel default endpointUrl config is set\");\n                QUnit.assert.equal(false,  this._sender._senderConfig.emitLineDelimitedJson, \"Channel default emitLineDelimitedJson config is set\");\n            }\n        });\n\n        this.testCaseAsync({\n            name: \"zip test: gzip encode is working and content-encode header is set (feature opt-in)\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [\n                () => {\n                    this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                    let core = new AppInsightsCore();\n                   \n                    let coreConfig = {\n                        instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                        featureOptIn : {[\"zipPayload\"]: {mode: 3}},\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                httpXHROverride: this.xhrOverride,\n                                alwaysUseXhrOverride: true,\n                            }\n                        }\n                    }\n            \n                    core.initialize(coreConfig, [this._sender]);\n        \n                    const telemetryItem: ITelemetryItem = {\n                        name: 'fake item with some really long name to take up space quickly',\n                        iKey: 'iKey',\n                        baseType: 'some type',\n                        baseData: {}\n                    };\n                    this._sender.processTelemetry(telemetryItem);\n                    this._sender.flush();\n                    this.clock.tick(10);\n                }].concat(PollingAssert.createPollingAssert(() => {\n                    if (this.genericSpy.called){\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(true, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should be gzip encoded\");\n                        QUnit.assert.equal(request.headers[\"Content-Encoding\"], \"gzip\", \"telemetry should be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000) as any)\n            });\n\n            this.testCaseAsync({\n                name: \"zip test: gzip encode is disabled (feature opt-in not set)\",\n                stepDelay: 10,\n                useFakeTimers: true,\n                useFakeServer: true,\n                steps: [\n                    () => {\n                        this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                        let core = new AppInsightsCore();\n                       \n                        let coreConfig = {\n                            instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                            extensionConfig: {\n                                [this._sender.identifier]: {\n                                    httpXHROverride: this.xhrOverride,\n                                    alwaysUseXhrOverride: true,\n                                }\n                            }\n                        }\n                \n                        core.initialize(coreConfig, [this._sender]);\n            \n                        const telemetryItem: ITelemetryItem = {\n                            name: 'fake item with some really long name to take up space quickly',\n                            iKey: 'iKey',\n                            baseType: 'some type',\n                            baseData: {}\n                        };\n                        this._sender.processTelemetry(telemetryItem);\n                        this._sender.flush();\n                        this.clock.tick(10);\n                    }].concat(PollingAssert.createPollingAssert(() => {\n                        if (this.genericSpy.called){\n                            let request = this.genericSpy.getCall(0).args[0];\n                            let gzipData = request.data;\n                            QUnit.assert.ok(gzipData, \"data should be set\");\n                            QUnit.assert.equal(false, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should not be gzip encoded\");\n                            QUnit.assert.ok(!(\"Content-Encoding\" in request.headers), \"telemetry should not be gzip encoded\");                            return true;\n                        }\n                        return false;\n                    }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000) as any)\n                });\n\n        this.testCase({\n            name: \"zip test: gzip encode is working and content-encode header is set (feature opt-in)\",\n            pollDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                let core = new AppInsightsCore();\n\n                let coreConfig = {\n                    instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                    featureOptIn : {[\"zipPayload\"]: {mode: 3}},\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true,\n                        }\n                    }\n                }\n        \n                core.initialize(coreConfig, [this._sender]);\n    \n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem);\n                this._sender.flush();\n                this.clock.tick(10);\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy.called) {\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(true, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should be gzip encoded\");\n                        QUnit.assert.equal(request.headers[\"Content-Encoding\"], \"gzip\", \"telemetry should be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"zip test: gzip encode is disabled (feature opt-in not set)\",\n            pollDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                let core = new AppInsightsCore();\n                \n                let coreConfig = {\n                    instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true,\n                        }\n                    }\n                }\n        \n                core.initialize(coreConfig, [this._sender]);\n    \n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem);\n                this._sender.flush();\n                this.clock.tick(10);\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy.called){\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(false, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should not be gzip encoded\");\n                        QUnit.assert.ok(!(\"Content-Encoding\" in request.headers), \"telemetry should not be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"zip test: gzip encode is working and content-encode header is set (feature opt-in)\",\n            pollDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                let core = new AppInsightsCore();\n\n                let coreConfig = {\n                    instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                    featureOptIn : {[\"zipPayload\"]: {mode: 3}},\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true,\n                        }\n                    }\n                }\n        \n                core.initialize(coreConfig, [this._sender]);\n    \n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem);\n                this._sender.flush();\n                this.clock.tick(10);\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy.called) {\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(true, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should be gzip encoded\");\n                        QUnit.assert.equal(request.headers[\"Content-Encoding\"], \"gzip\", \"telemetry should be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"zip test: gzip encode is disabled (feature opt-in not set)\",\n            pollDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                let core = new AppInsightsCore();\n                \n                let coreConfig = {\n                    instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true,\n                        }\n                    }\n                }\n        \n                core.initialize(coreConfig, [this._sender]);\n    \n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem);\n                this._sender.flush();\n                this.clock.tick(10);\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy.called){\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(false, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should not be gzip encoded\");\n                        QUnit.assert.ok(!(\"Content-Encoding\" in request.headers), \"telemetry should not be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"zip test: gzip encode is working and content-encode header is set (feature opt-in)\",\n            pollDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                let core = new AppInsightsCore();\n\n                let coreConfig = {\n                    instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                    featureOptIn : {[\"zipPayload\"]: {mode: 3}},\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true,\n                        }\n                    }\n                }\n        \n                core.initialize(coreConfig, [this._sender]);\n    \n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem);\n                this._sender.flush();\n                this.clock.tick(10);\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy.called) {\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(true, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should be gzip encoded\");\n                        QUnit.assert.equal(request.headers[\"Content-Encoding\"], \"gzip\", \"telemetry should be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"zip test: gzip encode is disabled (feature opt-in not set)\",\n            pollDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            test: () => {\n                this.genericSpy = this.sandbox.spy(this.xhrOverride, 'sendPOST');\n                let core = new AppInsightsCore();\n                \n                let coreConfig = {\n                    instrumentationKey: \"000e0000-e000-0000-a000-000000000000\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: this.xhrOverride,\n                            alwaysUseXhrOverride: true,\n                        }\n                    }\n                }\n        \n                core.initialize(coreConfig, [this._sender]);\n    \n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem);\n                this._sender.flush();\n                this.clock.tick(10);\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    if (this.genericSpy.called){\n                        let request = this.genericSpy.getCall(0).args[0];\n                        let gzipData = request.data;\n                        QUnit.assert.ok(gzipData, \"data should be set\");\n                        QUnit.assert.equal(false, gzipData[0] === 0x1F && gzipData[1] === 0x8B, \"telemetry should not be gzip encoded\");\n                        QUnit.assert.ok(!(\"Content-Encoding\" in request.headers), \"telemetry should not be gzip encoded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Endpoint Url can be set from root dynamically\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let id = this._sender.identifier;\n                let coreConfig = {\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [id]: {\n                        \n                        }\n                    },\n                    endpointUrl: \"test\"\n                }\n                core.initialize(coreConfig, [this._sender]);\n\n                let senderConfig = this._sender._senderConfig;\n                QUnit.assert.equal(senderConfig.endpointUrl, \"test\", \"Channel default endpoint url config is set from root\");\n              \n                //check dynamic config\n                core.config.endpointUrl = \"test1\";\n                this.clock.tick(1);\n                let curSenderConfig = this._sender._senderConfig;\n                QUnit.assert.equal(curSenderConfig.endpointUrl,\"test1\", \"Channel endpoint config is dynamically changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Init: init with promise\",\n            useFakeTimers: true,\n            test: () => {\n\n                let core = new AppInsightsCore();\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey\");\n                let urlPromise = createAsyncResolvedPromise(\"testUrl\");\n                let coreConfig = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000,\n                    extensionConfig: {}\n                }\n                core.initialize(coreConfig, [this._sender]);\n        \n                let status = core.activeStatus && core.activeStatus();\n                QUnit.assert.equal(status, ActiveStatus.PENDING, \"status should be set to pending\");\n                \n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this._sender.core;\n                    let activeStatus = core.activeStatus && core.activeStatus();\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        QUnit.assert.equal(\"testIkey\", core.config.instrumentationKey, \"ikey should be set\");\n                        QUnit.assert.equal(\"testUrl\", core.config.endpointUrl ,\"endpoint shoule be set\");\n                        // getExtCfg only finds undefined values from core\n                        let senderConfig = this._sender._senderConfig;\n                        QUnit.assert.equal(\"testIkey\", senderConfig.instrumentationKey, \"sender ikey should be set\");\n                        QUnit.assert.equal(\"testUrl\", senderConfig.endpointUrl ,\"sender endpoint shoule be set\");\n                        \n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Sender override can be handled correctly\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let sentPayloadData: any[] = [];\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData, oncomplete: (status: number, headers: {[headerName: string]: string;}, response?: string) => void, sync?: boolean) => {\n                        sentPayloadData.push({payload: payload, sync: sync});\n                    }\n                };\n\n                let coreConfig = {\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: xhrOverride\n                        }\n                    }\n                }\n                let testBatch: IInternalStorageItem[] = [{item: \"test\", cnt: 0}, {item: \"test1\", cnt: 0}];\n                const telemetryItem: ITelemetryItem = {\n                    name: \"fake item\",\n                    iKey: \"test\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n                core.initialize(coreConfig, [this._sender]);\n\n                // with always override to false\n                QUnit.assert.deepEqual(xhrOverride, this._sender._senderConfig.httpXHROverride, \"Channel httpXHROverride config is set\");\n                QUnit.assert.deepEqual(false, this._sender._senderConfig.alwaysUseXhrOverride, \"Channel alwaysUseXhrOverride config is set\");\n                this._sender._sender(testBatch, true);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called once with always override to false\");\n                this._sender._sender(testBatch, false);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called once  with always override to false test1\");\n\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n                this._sender.onunloadFlush();\n                QUnit.assert.deepEqual(0, sentPayloadData.length, \"httpXHROverride should not be called again test2\");\n\n\n                // with always override to true\n                core.config.extensionConfig = core.config.extensionConfig || {};\n                core.config.extensionConfig[this._sender.identifier].alwaysUseXhrOverride = true;\n                this.clock.tick(1);\n                QUnit.assert.deepEqual(true, this._sender._senderConfig.alwaysUseXhrOverride, \"Channel alwaysUseXhrOverride config is set to true dynamically\");\n                this._sender._sender(testBatch, true);\n                QUnit.assert.deepEqual(1, sentPayloadData.length, \"httpXHROverride should be called with always override to true\");\n                let payload = sentPayloadData[0].payload;\n                let sync = sentPayloadData[0].sync;\n                QUnit.assert.equal(false, sync, \"Channel httpXHROverride sync is called with false during send test1 (sender interface should be opposite with the sender)\");\n                QUnit.assert.deepEqual(testBatch, payload.oriPayload, \"Channel httpXHROverride sync is called with expected original payload\");\n                QUnit.assert.deepEqual(this._sender._buffer.batchPayloads(testBatch),payload.data, \"Channel httpXHROverride sync is called with expected batch payload\");\n\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n                this._sender.onunloadFlush();\n                QUnit.assert.deepEqual(2, sentPayloadData.length, \"httpXHROverride should be called\");\n                let data = sentPayloadData[1].payload.oriPayload;\n                payload = JSON.parse(data[0].item);\n                QUnit.assert.deepEqual(\"test\", payload.iKey, \"httpXHROverride should send expected payload test1\");\n                sync = sentPayloadData[1].sync;\n                QUnit.assert.equal(true, sync, \"Channel httpXHROverride sync is called with true during send test2 (sender interface should be opposite with the sender)\");\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config MaxRetry Count: payload exceeds max retry count should not be sent again\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n\n                let coreConfig = {\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            //httpXHROverride: xhrOverride,\n                            //alwaysUseXhrOverride: true,\n                            maxRetryCnt: 1\n                        }\n                    }\n                }\n                const telemetryItem: ITelemetryItem = {\n                    name: \"fake item\",\n                    iKey: \"test\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n                core.initialize(coreConfig, [this._sender]);\n              \n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                core.logger = logger;\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                    QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger).length, 1, \"session storage buffer should have 1 item\");\n                    QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty test1\");\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n                \n                // inital send, cnt = 0\n                this._sender.flush(false);\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger).length, 1, \"session storage sent buffer should have one event\");\n\n                let requests = this._getXhrRequests();\n                QUnit.assert.deepEqual(requests.length, 1, \"should have only 1 requests\");\n                let request = requests[0];\n                this.sendJsonResponse(request, {}, 500);\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger).length, 1, \"session storage buffer should have one item test2\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer should not have one event test2\");\n                \n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger)[0].cnt, 1, \"session storage buffer should have item with retry cnt 1\");\n                \n                // retry 1, cnt = 1\n                this._sender.flush(false);\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty test4\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger).length, 1, \"session storage sent buffer should have one event test4\");\n                \n                requests = this._getXhrRequests();\n                QUnit.assert.deepEqual(requests.length, 2, \"should have only 1 requests\");\n                request = requests[1];\n                this.sendJsonResponse(request, {}, 500);\n                // items should not be added back\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer should not have one item test5\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer should not have one event test5\");\n                \n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Invalid paylod Sender should not be sent\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let sentPayloadData: any[] = [];\n                var xhrOverride: IXHROverride = {\n                    sendPOST: (payload: IPayloadData, oncomplete: (status: number, headers: {[headerName: string]: string;}, response?: string) => void, sync?: boolean) => {\n                        sentPayloadData.push({payload: payload, sync: sync});\n                    }\n                };\n\n                let coreConfig = {\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            httpXHROverride: xhrOverride,\n                            alwaysUseXhrOverride: true\n                        }\n                    }\n                }\n                let testBatch: string[] = [\"test\", \"test1\"];\n           \n                core.initialize(coreConfig, [this._sender]);\n\n                QUnit.assert.deepEqual(xhrOverride, this._sender._senderConfig.httpXHROverride, \"Channel httpXHROverride config is set\");\n                QUnit.assert.deepEqual(true, this._sender._senderConfig.alwaysUseXhrOverride, \"Channel alwaysUseXhrOverride config is set\");\n                // case 1: payload is null\n                this._sender._sender(null as any, true);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called test1\");\n                this._sender._sender(null as any, false);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called once sync test1\");\n\n                // case 2: payload is none array\n                this._sender._sender({} as any, true);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called test2\");\n                this._sender._sender({} as any, false);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called once sync test2\");\n\n                // case 3: payload is an empty array\n                this._sender._sender([] as any, true);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called test3\");\n                this._sender._sender([] as any, false);\n                QUnit.assert.equal(0, sentPayloadData.length, \"httpXHROverride is not called once sync test3\");\n\n                \n                this._sender._sender(testBatch, true);\n                QUnit.assert.equal(1, sentPayloadData.length, \"httpXHROverride is called test4\");\n                this._sender._sender(testBatch, false);\n                QUnit.assert.equal(2, sentPayloadData.length, \"httpXHROverride is called once sync test4\");\n                \n                \n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: sessionStorage can get items from previous buffers\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"b7170927-2d1c-44f1-acec-59f4e1751c13\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            namePrefix: \"test\"\n                        }\n                    }\n                }\n\n                let item1: ITelemetryItem = {\n                    name: \"fake item1\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                let item2: ITelemetryItem = {\n                    name: \"fake item2\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                let item3: ITelemetryItem = {\n                    name: \"fake item3\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                let item4: ITelemetryItem = {\n                    name: \"fake item4\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                let item5: ITelemetryItem = {\n                    name: \"fake item5\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                let items = [item1, item2];\n                let sentItems = [item3];\n                let prefixItems = [item4, item5];\n                //mock previous items stored in previous buffer key\n                sessionStorage.setItem(\"AI_buffer\",JSON.stringify(items));\n                sessionStorage.setItem(\"AI_sentBuffer\",JSON.stringify(sentItems));\n                sessionStorage.setItem(\"test_AI_buffer\",JSON.stringify(prefixItems));\n\n                let keys = utlGetSessionStorageKeys();\n                QUnit.assert.deepEqual(keys.length, 3, \"session buffer should contain only three keys\");\n\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                core.logger = logger;\n\n                core.initialize(coreConfig, [this._sender]);\n                QUnit.assert.equal(true, this._sender._senderConfig.enableSessionStorageBuffer, \"Channel default enableSessionStorageBuffer config is set\");\n                QUnit.assert.equal(true, utlCanUseSessionStorage(), \"SessionStorage should be able to use\");\n                QUnit.assert.deepEqual(this._getBuffer(\"test_\" + BUFFER_KEY, logger).length, 5, \"session storage buffer should contain all previous events\");\n                QUnit.assert.deepEqual(this._getBuffer(\"test_\" + SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n                \n                let previousItems = this._sender._buffer.getItems();\n                \n                QUnit.assert.deepEqual(previousItems.length, 5, \"buffer should contain 5 previous items\");\n                \n                keys = utlGetSessionStorageKeys();\n                QUnit.assert.deepEqual(keys.length, 2, \"session buffer should contain only two keys\");\n                QUnit.assert.ok(keys.indexOf(\"test_\" + BUFFER_KEY) > -1, \"session buffer key contain buffer key\");\n                QUnit.assert.ok(keys.indexOf(\"test_\" +  SENT_BUFFER_KEY) > -1, \"session buffer key contain sent buffer key\");\n\n                utlRemoveSessionStorage(logger, \"test_\" + BUFFER_KEY);\n                utlRemoveSessionStorage(logger, \"test_\" + SENT_BUFFER_KEY);\n                \n\n            }\n        });\n\n\n        this.testCase({\n            name: \"Channel Config: sessionStorage change from true to false can be handled correctly\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"b7170927-2d1c-44f1-acec-59f4e1751c13\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                        \n                        }\n                    }\n                }\n\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                core.logger = logger;\n                const loggerSpy = this.sandbox.stub(this._sender, \"triggerSend\");\n\n                core.initialize(coreConfig, [this._sender]);\n                QUnit.assert.equal(true, this._sender._senderConfig.enableSessionStorageBuffer, \"Channel default enableSessionStorageBuffer config is set\");\n                QUnit.assert.equal(true, utlCanUseSessionStorage(), \"SessionStorage should be able to use\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n                QUnit.assert.deepEqual(this._sender._buffer.getItems(), [], \"buffer is empty\");\n                \n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"fake item\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n\n                QUnit.assert.equal(false, loggerSpy.calledOnce, \"The send has not yet been triggered\");\n                let payload  = this._getBuffer(BUFFER_KEY, logger);\n                QUnit.assert.equal(payload.length, 1, \"payload length is equal to one\");\n                QUnit.assert.ok(payload[0].item.indexOf(\"some type\") > 0, \"payload is saved to session storage\");\n                let sentPayload  = this._getBuffer(SENT_BUFFER_KEY, logger);\n                QUnit.assert.deepEqual([], sentPayload, \"sent payload is empty\");\n                QUnit.assert.equal(this._sender._buffer.getItems().length, 1, \"buffer length shoule be one\");\n\n                // change enableSessionStorageBuffer\n                core.config.extensionConfig =  core.config.extensionConfig? core.config.extensionConfig : {};\n                core.config.extensionConfig[this._sender.identifier].enableSessionStorageBuffer = false;\n\n                this.clock.tick(1);\n                QUnit.assert.equal(false, this._sender._senderConfig.enableSessionStorageBuffer, \"Channel enableSessionStorageBuffer config is disabled\");\n                QUnit.assert.equal(this._sender._buffer.getItems().length, 1, \"session storage buffer is transferred\");\n                QUnit.assert.ok(this._sender._buffer.getItems()[0].item.indexOf(\"some type\") > 1, \"in memory storage buffer is set\");\n                \n                this.clock.tick(15000);\n                QUnit.assert.equal(true, loggerSpy.calledOnce, \"The send has been triggered\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"Storage Prefix Test: prefix should be added after init\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let setItemSpy = this.sandbox.spy(window.sessionStorage, \"setItem\");\n                let storagePrefix = \"storageTestPrefix\"\n                let coreConfig = {\n                    instrumentationKey: \"b7170927-2d1c-44f1-acec-59f4e1751c13ttt\",\n                    storagePrefix: storagePrefix,\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                        \n                        }\n                    }\n                }\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                core.logger = logger;\n                core.initialize(coreConfig, [this._sender]);\n                let firstCallArgs = setItemSpy.args[0]; // Arguments of the first call\n                QUnit.assert.true(JSON.stringify(firstCallArgs).includes(storagePrefix));\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: sessionStorage change from false to true can be handled correctly\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"b7170927-2d1c-44f1-acec-59f4e1751c13\",\n                    enableSessionStorageBuffer: false,\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                        \n                        }\n                    }\n                }\n\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                core.logger = logger;\n                const loggerSpy = this.sandbox.stub(this._sender, \"triggerSend\");\n                core.initialize(coreConfig, [this._sender]);\n                QUnit.assert.equal(false, this._sender._senderConfig.enableSessionStorageBuffer, \"Channel enableSessionStorageBuffer config is set to false\");\n                QUnit.assert.equal(true, utlCanUseSessionStorage(), \"utlCanUseSessionStorage should return true\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n                QUnit.assert.deepEqual(this._sender._buffer.getItems(), [], \"buffer is empty\");\n      \n                const telemetryItem: ITelemetryItem = {\n                    name: \"fake item\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n                QUnit.assert.equal(false, loggerSpy.calledOnce, \"The send has not yet been triggered\");\n                QUnit.assert.equal(this._sender._buffer.getItems().length, 1, \"session storage in memory buffer is set\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n\n                // change enableSessionStorageBuffer\n                core.config.extensionConfig =  core.config.extensionConfig? core.config.extensionConfig : {};\n                core.config.extensionConfig[this._sender.identifier].enableSessionStorageBuffer = true;\n                this.clock.tick(1);\n                QUnit.assert.equal(true, this._sender._senderConfig.enableSessionStorageBuffer, \"Channel enableSessionStorageBuffer config is set to true\");\n\n                let payload  = this._getBuffer(BUFFER_KEY, logger);\n                QUnit.assert.equal(payload.length, 1, \"payload length is equal to one\");\n                QUnit.assert.ok(payload[0].item.indexOf(\"some type\") > 0, \"payload is saved to session storage\");\n                QUnit.assert.equal(this._sender._buffer.getItems().length, 1, \"buffer length shoule be one\");\n                let sentPayload  = this._getBuffer(SENT_BUFFER_KEY, logger);\n                QUnit.assert.deepEqual([], sentPayload, \"sent payload is empty\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: sessionStorage prefixName change can be handled correctly\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"b7170927-2d1c-44f1-acec-59f4e1751c13\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                        \n                        }\n                    }\n                }\n                let prefixName = \"test\";\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                core.logger = logger;\n                const loggerSpy = this.sandbox.stub(this._sender, \"triggerSend\");\n                core.initialize(coreConfig, [this._sender]);\n                QUnit.assert.equal(true, this._sender._senderConfig.enableSessionStorageBuffer, \"Channel enableSessionStorageBuffer config is set to true\");\n                QUnit.assert.equal(undefined, this._sender._senderConfig.namePrefix, \"Channel namePrefix config is set to default\");\n                QUnit.assert.equal(true, utlCanUseSessionStorage(), \"utlCanUseSessionStorage should return true\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger, prefixName), [], \"session storage buffer with prefix is empty\");\n      \n                const telemetryItem: ITelemetryItem = {\n                    name: \"fake item\",\n                    iKey: \"abc\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n                QUnit.assert.equal(false, loggerSpy.calledOnce, \"The send has not yet been triggered\");\n                QUnit.assert.equal(this._sender._buffer.getItems().length, 1, \"session storage buffer is set\");\n                let payload  = this._getBuffer(BUFFER_KEY, logger);\n                QUnit.assert.equal(payload.length, 1, \"payload length is equal to one\");\n                QUnit.assert.ok(payload[0].item.indexOf(\"some type\") > 0, \"payload is saved to session storage\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger, prefixName), [], \"session storage buffer with prefix is empty\");\n\n\n                // change prefix\n                core.config.extensionConfig = core.config.extensionConfig? core.config.extensionConfig : {};\n                core.config.extensionConfig[this._sender.identifier].namePrefix = prefixName;\n                this.clock.tick(1);\n                QUnit.assert.equal(prefixName, this._sender._senderConfig.namePrefix, \"Channel namePrefix config is set\");\n\n                QUnit.assert.deepEqual([], this._getBuffer(BUFFER_KEY, logger), \"default buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n                payload  = this._getBuffer(BUFFER_KEY, logger, prefixName);\n                QUnit.assert.equal(payload.length, 1, \"payload length is equal to one\");\n                QUnit.assert.ok(payload[0].item.indexOf(\"some type\") > 0, \"payload is saved to session storage with prefix\");\n                QUnit.assert.equal(this._sender._buffer.getItems().length, 1, \"new session storage buffer is set\");\n               \n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n                utlSetSessionStorage(logger, `${prefixName}_${BUFFER_KEY}`,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: endpoint change can be handled correctly\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"b7170927-2d1c-44f1-acec-59f4e1751c13\",\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                        \n                        }\n                    }\n                }\n\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                core.logger = logger;\n                const loggerSpy = this.sandbox.stub(this._sender, \"triggerSend\");\n\n                core.initialize(coreConfig, [this._sender]);\n                QUnit.assert.equal(\"https://dc.services.visualstudio.com/v2/track\", this._sender._senderConfig.endpointUrl, \"Channel default endpointUrl config is set\");\n                QUnit.assert.equal(true, this._sender._senderConfig.enableSessionStorageBuffer, \"Channel enableSessionStorageBuffer config is set to false\");\n                QUnit.assert.equal(true, utlCanUseSessionStorage(), \"utlCanUseSessionStorage should return true\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer is empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer is empty\");\n                \n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"fake item\",\n                    iKey: \"test\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n\n                QUnit.assert.equal(false, loggerSpy.calledOnce, \"The send has not yet been triggered\");\n                let payload  = this._getBuffer(BUFFER_KEY, logger);\n                QUnit.assert.equal(payload.length, 1, \"payload length is equal to one\");\n                QUnit.assert.ok(payload[0].item.indexOf(\"some type\") > 0, \"payload is saved to session storage\");\n\n                // change endpointUrl\n                core.config.extensionConfig =  core.config.extensionConfig? core.config.extensionConfig : {};\n                core.config.extensionConfig[this._sender.identifier].endpointUrl = \"https://example.com\";\n\n                this.clock.tick(1);\n                QUnit.assert.equal(\"https://example.com\", this._sender._senderConfig.endpointUrl, \"Channel endpointUrl config is changed\");\n                payload  = this._sender._buffer.getItems();\n                QUnit.assert.deepEqual(payload.length, 1, \"buffer is not changed\");\n                payload  = this._getBuffer(BUFFER_KEY, logger);\n                QUnit.assert.ok(payload[0].item.indexOf(\"some type\") > 0, \"payload is not changed\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"ArraySendBuffer createNew: function createNew() can return expected array buffer\",\n            test: () => {\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000\n                } as ISenderConfig;\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n\n                let arrBuffer = new ArraySendBuffer(logger, config);\n                let arrBufferCopy= arrBuffer.createNew(logger, config, false); // set to false to make sure it is array buffer\n                QUnit.assert.deepEqual(arrBufferCopy.getItems(), [], \"payload should be empty\");\n\n                //let payload = [{\"payload1\"}, \"payload2\", \"payload3\", \"payload4\", \"payload5\", \"payload6\"];\n                let payload = [{item: \"payload1\", cnt: 0}, {item: \"payload2\", cnt: 0}, {item: \"payload3\", cnt: 0}, {item: \"payload4\", cnt: 0}, {item: \"payload5\", cnt: 0}, {item: \"payload6\", cnt: 0} ];\n                arrForEach(payload, (val) =>{\n                    arrBuffer.enqueue(val);\n                });\n                arrBufferCopy = arrBuffer.createNew(logger, config, false);\n                QUnit.assert.deepEqual(payload, arrBufferCopy.getItems(), \"payload should be same\");\n                arrBuffer.enqueue({item:\"payload\", cnt: 0});\n                QUnit.assert.deepEqual(arrBuffer.getItems().length, 7, \"arrBuffer length\");\n                QUnit.assert.deepEqual(arrBufferCopy.getItems().length, 6, \"copy is deep copy\");\n            }\n        });\n\n        this.testCase({\n            name: \"ArraySendBuffer Max Count: item exceeds max cnt should not be added again\",\n            test: () => {\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    maxRetryCnt: 1\n                } as ISenderConfig;\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n\n                let arrBuffer = new ArraySendBuffer(logger, config);\n                QUnit.assert.deepEqual(arrBuffer.getItems(), [], \"payload should be empty\");\n                let payload1 = {item: \"payload1\", cnt: 1};\n                arrBuffer.enqueue(payload1);\n                QUnit.assert.deepEqual(arrBuffer.getItems().length, 1, \"buffer should have one item\");\n\n                let payload2 = {item: \"payload2\", cnt: 2};\n                arrBuffer.enqueue(payload2);\n                QUnit.assert.deepEqual(arrBuffer.getItems().length, 1, \"payload exceeds max cnt should not be added again\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]))\n            }\n        });\n\n\n        this.testCase({\n            name: \"ArraySendBuffer createNew: function createNew() can return expected sessionStorage buffer\",\n            test: () => {\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000\n                } as ISenderConfig;\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n\n                let arrBuffer = new ArraySendBuffer(logger, config);\n                let sessionBuffer =  arrBuffer.createNew(logger, config, true); // set to false to make sure it is session storage buffer\n                QUnit.assert.deepEqual(sessionBuffer.getItems(), [], \"payload should be empty\");\n\n                //let payload = [\"payload1\", \"payload2\", \"payload3\", \"payload4\", \"payload5\", \"payload6\"];\n                let payload = [{item: \"payload1\", cnt: 0}, {item: \"payload2\", cnt: 0}, {item: \"payload3\", cnt: 0}, {item: \"payload4\", cnt: 0}, {item: \"payload5\", cnt: 0}, {item: \"payload6\", cnt: 0} ];\n                arrForEach(payload, (val) =>{\n                    arrBuffer.enqueue(val);\n                });\n                sessionBuffer = arrBuffer.createNew(logger, config, true);\n                QUnit.assert.deepEqual(sessionBuffer.getItems(), payload, \"payload should be same\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), payload, \"session storage buffer is set\");\n                arrBuffer.enqueue({item: \"payload\", cnt: 0});\n                QUnit.assert.deepEqual(arrBuffer.getItems().length, 7, \"arrBuffer length\");\n                QUnit.assert.deepEqual(sessionBuffer.getItems().length, 6, \"copy is deep copy\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"SessionStorageSendBuffer createNew: function createNew() can return expected array buffer\",\n            test: () => {\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000\n                } as ISenderConfig;\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                \n                let sessionBuffer = new SessionStorageSendBuffer(logger, config);\n                let arrBuffer = sessionBuffer.createNew(logger, config, false);\n                QUnit.assert.deepEqual(arrBuffer.getItems(), [], \"payload should be empty\");\n\n                //let payload = [\"payload1\", \"payload2\", \"payload3\", \"payload4\", \"payload5\", \"payload6\"];\n                let payload = [{item: \"payload1\", cnt: 0}, {item: \"payload2\", cnt: 0}, {item: \"payload3\", cnt: 0}, {item: \"payload4\", cnt: 0}, {item: \"payload5\", cnt: 0}, {item: \"payload6\", cnt: 0} ];\n                arrForEach(payload, (val) =>{\n                    sessionBuffer.enqueue(val);\n                });\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), payload, \"session storage buffer is set\");\n                arrBuffer = sessionBuffer.createNew(logger, config, false);\n                QUnit.assert.deepEqual(arrBuffer.getItems(), payload, \"payload should be same\");\n                sessionBuffer.enqueue({item: \"payload\", cnt: 0});\n                QUnit.assert.deepEqual(sessionBuffer.getItems().length, 1, \"sessionBuffer length\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [{item: \"payload\", cnt: 0}], \"session storage buffer is set\");\n                QUnit.assert.deepEqual(arrBuffer.getItems().length, 6, \"copy is deep copy\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"SessionStorageSendBuffer Max Count: payload exceeds max retry cnt should not be added again\",\n            test: () => {\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    maxRetryCnt: 1\n                } as ISenderConfig;\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                \n                let sessionBuffer = new SessionStorageSendBuffer(logger, config);\n                QUnit.assert.deepEqual(sessionBuffer.getItems(), [], \"payload should be empty\");\n                let payload1 = {item: \"payload1\", cnt: 1};\n                sessionBuffer.enqueue(payload1);\n                QUnit.assert.deepEqual(sessionBuffer.getItems().length, 1, \"should have only one payload\");\n\n                let payload2 = {item: \"payload2\", cnt: 2};\n                sessionBuffer.enqueue(payload2);\n                QUnit.assert.deepEqual(sessionBuffer.getItems().length, 1, \"should have only one payload\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"SessionStorageSendBuffer createNew: function createNew() can return expected sessionStorage buffer with same prefix name\",\n            test: () => {\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000\n                } as ISenderConfig;\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                \n                let sessionBuffer = new SessionStorageSendBuffer(logger, config);\n                let sessionBufferCopy = sessionBuffer.createNew(logger, config, true);\n                QUnit.assert.deepEqual(sessionBufferCopy.getItems(), [], \"payload should be empty\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer should be empty\");\n\n                //let payload = [\"payload1\", \"payload2\", \"payload3\", \"payload4\", \"payload5\", \"payload6\"];\n                let payload = [{item: \"payload1\", cnt: 0}, {item: \"payload2\", cnt: 0}, {item: \"payload3\", cnt: 0}, {item: \"payload4\", cnt: 0}, {item: \"payload5\", cnt: 0}, {item: \"payload6\", cnt: 0} ];\n                let sentPayload = [{item: \"sent1\", cnt: 0}, {item: \"sent2\", cnt: 0}, {item: \"sent3\", cnt: 0}, {item: \"sent4\", cnt: 0} ];\n                //let sentPayload = [\"sent1\", \"sent2\",\"sent3\",\"sent4\"];\n                arrForEach(payload, (val) =>{\n                    sessionBuffer.enqueue(val);\n                });\n                sessionBuffer.markAsSent(sentPayload);\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), payload, \"session storage buffer is set\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), sentPayload, \"session storage sent buffer is set\");\n\n                QUnit.assert.deepEqual(sessionBuffer.getItems(), payload, \"getItems() should only return unsent items\");\n                sessionBufferCopy = sessionBuffer.createNew(logger, config, true);\n                QUnit.assert.deepEqual(sessionBufferCopy.getItems(), payload, \"payload should be same\");\n                QUnit.assert.deepEqual(sessionBuffer.getItems(), [], \"original session storage buffer should be clear\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), payload, \"session storage should not be changed\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), sentPayload, \"session storage sent buffer should not be changed\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n                utlSetSessionStorage(logger, SENT_BUFFER_KEY,JSON.stringify([]));\n            }\n        });\n\n        this.testCase({\n            name: \"SessionStorageSendBuffer createNew: function createNew() can return expected sessionStorage buffer with different prefix name\",\n            test: () => {\n                let prefix = \"prefix\"\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000\n                } as ISenderConfig;\n                let newConfig = {...config};\n                newConfig.namePrefix = prefix;\n                let logger = new DiagnosticLogger({instrumentationKey: \"abc\"});\n                \n                let sessionBuffer = new SessionStorageSendBuffer(logger, config);\n                let sessionBufferCopy = sessionBuffer.createNew(logger, newConfig, true);\n                QUnit.assert.deepEqual(sessionBufferCopy.getItems(), [], \"payload should be empty\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"session storage buffer should be empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"session storage sent buffer should be empty\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger, prefix), [], \"session storage sent buffer with prefix should be empty\");\n\n                // let payload = [\"payload1\", \"payload2\", \"payload3\", \"payload4\", \"payload5\", \"payload6\"];\n                // let sentPayload = [\"sent1\", \"sent2\",\"sent3\",\"sent4\"];\n                let payload = [{item: \"payload1\", cnt: 0}, {item: \"payload2\", cnt: 0}, {item: \"payload3\", cnt: 0}, {item: \"payload4\", cnt: 0}, {item: \"payload5\", cnt: 0}, {item: \"payload6\", cnt: 0} ];\n                let sentPayload = [{item: \"sent1\", cnt: 0}, {item: \"sent2\", cnt: 0}, {item: \"sent3\", cnt: 0}, {item: \"sent4\", cnt: 0} ];\n                arrForEach(payload, (val) =>{\n                    sessionBuffer.enqueue(val);\n                });\n                sessionBuffer.markAsSent(sentPayload);\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), payload, \"session storage buffer is set\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), sentPayload, \"session storage sent buffer is set\");\n\n                QUnit.assert.deepEqual(sessionBuffer.getItems(), payload, \"getItems() should only return unsent items\");\n                sessionBufferCopy =  sessionBuffer.createNew(logger, newConfig, true);\n                QUnit.assert.deepEqual(sessionBufferCopy.getItems(), payload, \"payload should be same\");\n                QUnit.assert.deepEqual(sessionBuffer.getItems(), [], \"original session storage buffer should be clear\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger, prefix), payload, \"new session storage buffer should be set\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger, prefix), sentPayload, \"session storage sent buffer with prefix should be set\");\n                QUnit.assert.deepEqual(this._getBuffer(BUFFER_KEY, logger), [], \"previous session storage should be clear\");\n                QUnit.assert.deepEqual(this._getBuffer(SENT_BUFFER_KEY, logger), [], \"previous session storage sent buffer should be clear\");\n\n                utlSetSessionStorage(logger, BUFFER_KEY,JSON.stringify([]));\n                utlSetSessionStorage(logger, SENT_BUFFER_KEY,JSON.stringify([]));\n                utlSetSessionStorage(logger, `${prefix}_${BUFFER_KEY}`,JSON.stringify([]));\n                utlSetSessionStorage(logger, `${prefix}_${SENT_BUFFER_KEY}`,JSON.stringify([]));\n            }\n        });\n\n        \n        this.testCase({\n            name: \"Channel Config: Offline Support\",\n            test: () => {\n                this._sender.initialize(\n                    {\n                        instrumentationKey: \"abc\",\n                        maxBatchInterval: 123,\n                        endpointUrl: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH,\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        }\n\n                    }, new AppInsightsCore(), []\n                );\n\n                let event: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                let offlineSupport = this._sender.getOfflineSupport() as any;\n                QUnit.assert.ok(offlineSupport.serialize, \"serialize exist\");\n                let eventStr = offlineSupport.serialize(event);\n                let expectedStr = `\"iKey\":\"iKey\",\"name\":\"Microsoft.ApplicationInsights.iKey.Event\",\"tags\":{\"ai.internal.sdkVersion\":\"javascript:${EnvelopeCreator.Version}\"},\"data\":{\"baseType\":\"EventData\",\"baseData\":{\"ver\":2,\"name\":\"not_specified\",\"properties\":{\"baseTypeSource\":\"some type\"},\"measurements\":{}}}`;\n                QUnit.assert.ok(eventStr.indexOf(expectedStr) > -1, \"get expected string\");\n                \n                let testStr = `{\"name\":\"testEvent\",\"iKey\":\"o:testIkey\",\"data\":{\"baseData\":{}}}`;\n                QUnit.assert.ok(offlineSupport.batch, \"batch should exit\");\n                let batch = offlineSupport.batch([testStr, testStr]);\n                QUnit.assert.equal(batch, `[{\"name\":\"testEvent\",\"iKey\":\"o:testIkey\",\"data\":{\"baseData\":{}}},{\"name\":\"testEvent\",\"iKey\":\"o:testIkey\",\"data\":{\"baseData\":{}}}]`, \"get expected batch\");\n\n                QUnit.assert.ok(offlineSupport.shouldProcess, \"should process should exit\");\n                QUnit.assert.equal(offlineSupport.shouldProcess(event), true, \"should process\");\n\n                QUnit.assert.ok(offlineSupport.createPayload, \"getOffline createPayload should exit\");\n                let details = offlineSupport.createPayload(\"test\");\n                QUnit.assert.equal(details.urlString, \"https://dc.services.visualstudio.com/v2/track\", \"get expected Url\");\n                QUnit.assert.ok(details.headers, \"should have headers\");\n                QUnit.assert.equal(details.headers[\"Sdk-Context\"], \"appId\", \"get expected headers\");\n                QUnit.assert.equal(details.data, \"test\", \"should use headers\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"Channel Config: Validate empty endpointURL falls back to the default\",\n            test: () => {\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        endpointUrl: '',\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        }\n\n                    }, new AppInsightsCore(), []\n                );\n\n                QUnit.assert.equal(123, this._sender._senderConfig.maxBatchInterval, 'Channel config can be set from root config (maxBatchInterval)');\n                QUnit.assert.equal(DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH, this._sender._senderConfig.endpointUrl, 'Channel config can be set from root config (endpointUrl)');\n                QUnit.assert.notEqual(654, this._sender._senderConfig.maxBatchSizeInBytes, 'Channel config does not equal root config option if extensionConfig field is also set');\n                QUnit.assert.equal(456, this._sender._senderConfig.maxBatchSizeInBytes, 'Channel config prioritizes extensionConfig over root config');\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Session storage can be enabled\",\n            test: () => {\n                let setItemSpy = this.sandbox.spy(window.sessionStorage, \"setItem\");\n                let getItemSpy = this.sandbox.spy(window.sessionStorage, \"getItem\");\n\n                this._sender.initialize(\n                    {\n                        enableSessionStorageBuffer: true\n                    }, new AppInsightsCore(), []\n                );\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem, null);\n\n                QUnit.assert.true(this._sender._buffer instanceof SessionStorageSendBuffer, 'Channel config can be set from root config (enableSessionStorageBuffer)');\n                QUnit.assert.equal(false, setItemSpy.calledOnce, \"The setItem has not yet been triggered\");\n                QUnit.assert.equal(false, getItemSpy.calledOnce, \"The getItemSpy has not yet been triggered\");\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Session storage with buffer override is used\",\n            test: () => {\n                let setItemSpy = this.sandbox.stub();\n                let getItemSpy = this.sandbox.stub();\n\n                this._sender.initialize(\n                    {\n                        enableSessionStorageBuffer: true,\n                        bufferOverride: {\n                            getItem: getItemSpy,\n                            setItem: setItemSpy\n                        }\n                    }, new AppInsightsCore(), []\n                );\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                this._sender.processTelemetry(telemetryItem, null);\n\n                QUnit.assert.true(this._sender._buffer instanceof SessionStorageSendBuffer, 'Channel config can be set from root config (enableSessionStorageBuffer)');\n                QUnit.assert.equal(false, setItemSpy.calledOnce, \"The setItem has not yet been triggered\");\n                QUnit.assert.equal(false, getItemSpy.calledOnce, \"The getItemSpy has not yet been triggered\");\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Session storage can be disabled\",\n            test: () => {\n                this._sender.initialize(\n                    {\n                        enableSessionStorageBuffer: false\n                    }, new AppInsightsCore(), []\n                );\n\n                QUnit.assert.true(this._sender._buffer instanceof ArraySendBuffer, 'Channel config can be set from root config (enableSessionStorageBuffer)');\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Session storage ignores buffer override when disabled\",\n            test: () => {\n                this._sender.initialize(\n                    {\n                        enableSessionStorageBuffer: false,\n                        bufferOverride: {\n                            getItem: this.sandbox.stub(),\n                            setItem: this.sandbox.stub()\n                        }\n                    }, new AppInsightsCore(), []\n                );\n\n                QUnit.assert.true(this._sender._buffer instanceof ArraySendBuffer, 'Channel config can be set from root config (enableSessionStorageBuffer)');\n            }\n        });\n\n        this.testCase({\n            name: \"processTelemetry can be called with optional fields undefined\",\n            useFakeTimers: true,\n            test: () => {\n                this._sender.initialize({\n                    instrumentationKey: 'abc'\n                }, new AppInsightsCore(), []);\n\n                const loggerSpy = this.sandbox.stub(this._sender, \"triggerSend\");\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                try {\n                    this._sender.processTelemetry(telemetryItem, null);\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n\n                QUnit.assert.equal(false, loggerSpy.calledOnce, \"The send has not yet been triggered\");\n                this.clock.tick(15000);\n                QUnit.assert.equal(true, loggerSpy.calledOnce, \"The send has been triggered\");\n            }\n        })\n\n        this.testCase({\n            name: \"processTelemetry process ItelemetryItem with iKey\",\n            useFakeTimers: true,\n            test: () => {\n                this._sender.initialize({\n                    instrumentationKey: 'abc'\n                }, new AppInsightsCore(), []);\n\n                const loggerSpy = this.sandbox.stub(this._sender, \"triggerSend\");\n                const expectedIkey = 'testIkey';\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: expectedIkey,\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                try {\n                    this._sender.processTelemetry(telemetryItem, null);\n                    let buffer = this._sender._buffer.getItems();\n                    let payload = JSON.parse(buffer[buffer.length-1].item);\n                    var actualIkey = payload.iKey;\n                } catch(e) {\n                    QUnit.assert.ok(false, \"Exception - \" + e);\n                }\n\n                QUnit.assert.equal(false, loggerSpy.calledOnce, \"The send has not yet been triggered\");\n                QUnit.assert.equal(expectedIkey, actualIkey, \"processTelemetry replaced ItelemetryItem Ikey\");\n                this.clock.tick(15000);\n                QUnit.assert.equal(true, loggerSpy.calledOnce, \"The send has been triggered\");\n            }\n        })\n\n        this.testCase({\n            name: \"telemetry is not send when legacy telemetry initializer returns false\",\n            test: () => {\n                const cr = new AppInsightsCore();\n                cr.logger = new DiagnosticLogger({instrumentationKey: \"ikey\"});\n                this._sender.initialize({\n                    instrumentationKey: 'abc'\n                }, cr, []);\n\n                const nextPlugin = <ITelemetryPlugin> {\n                    identifier: \"foo\",\n                    processTelemetry: (it) => {},\n                    priority: 200,\n                    setNextPlugin: (it) => {}\n                };\n                this._sender.setNextPlugin(nextPlugin);\n\n                const processTelemetrySpy = this.sandbox.stub(nextPlugin, \"processTelemetry\");\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {},\n                    tags: [\n                    ]\n                };\n\n                telemetryItem.tags[\"ProcessLegacy\"] = [e => true, e => false, f=> true];\n                try {\n                    this._sender.processTelemetry(telemetryItem, null);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.ok(!processTelemetrySpy.calledOnce);\n            }\n        });\n\n        this.testCase({\n            name: 'BeaconAPI is not used when isBeaconApiDisabled flag is true',\n            test: () => {\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: true\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API is disabled, Beacon API is not called\");\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called when Beacon API is disabled\");\n            }\n        });\n\n        this.testCase({\n            name: 'beaconSender is called when isBeaconApiDisabled flag is false',\n            useFakeTimers: true,\n            test: () => {\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                const cr = new AppInsightsCore();\n                const sender = new Sender();\n\n                sender.initialize({\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: false\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                this.clock.tick(15000);\n\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called when Beacon API is enabled\");\n                QUnit.assert.equal(true, sendBeaconCalled, \"Beacon API is enabled, Beacon API is called\");\n            }\n        });\n\n        \n        this.testCase({\n            name: 'Unload Transport Type: User provide fetch in unloadtransports, but it is disabled, so we should use beacon',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled: false,\n                    disableXhr: false,\n                    onunloadDisableFetch: true,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    unloadTransports: [TransportType.Fetch]\n                } as ISenderConfig;\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n                var coreConfig = {\n                    instrumentationKey: \"\",\n                    extensionConfig: {[sender.identifier]: config}\n                };\n\n                cr.initialize(coreConfig, [sender]);\n\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(true, sendBeaconCalled, \"Beacon API should be called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called\");\n                QUnit.assert.ok(!fetchstub.called, \"fetch sender is blocked\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n        this.testCase({\n            name: 'Unload Transport Type: User provide fetch in unloadtransports, we should use fetch',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled: false,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    unloadTransports: [TransportType.Fetch]\n                } as ISenderConfig;\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n                var coreConfig = {\n                    instrumentationKey: \"\",\n                    extensionConfig: {[sender.identifier]: config}\n                };\n\n                cr.initialize(coreConfig, [sender]);\n\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API should not be called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called\");\n                QUnit.assert.ok(fetchstub.called, \"fetch sender is called\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n       \n        this.testCase({\n            name: 'Unload Transport Type: User provide beacon in unloadtransports, we should use beacon',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled: false,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    unloadTransports: [TransportType.Beacon]\n                } as ISenderConfig;\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n                var coreConfig = {\n                    instrumentationKey: \"\",\n                    extensionConfig: {[sender.identifier]: config}\n                };\n\n                cr.initialize(coreConfig, [sender]);\n\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(true, sendBeaconCalled, \"Beacon API should be called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called\");\n                QUnit.assert.ok(!fetchstub.called, \"fetch sender is not called\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n        this.testCase({\n            name: 'Transport Type: isBeaconApiDisabled is true and User provide beacon in transports, we should still block beacon',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return false;\n                });\n\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled: true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    transports: [TransportType.Beacon]\n                } as ISenderConfig;\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n                var coreConfig = {\n                    instrumentationKey: \"\",\n                    extensionConfig: {[sender.identifier]: config}\n                };\n\n                cr.initialize(coreConfig, [sender]);\n\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API is blocked, Beacon API should not be called\");\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called\");\n                QUnit.assert.ok(!fetchstub.called, \"fetch sender is not called\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n        this.testCase({\n            name: 'Transport Type: isBeaconApiDisabled is false and User provide beacon in transports, we should pick beacon',\n            useFakeTimers: true,\n            test: () => {\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n          let config = {\n                    isBeaconApiDisabled: false,\n                    disableXhr: false,\n                    transports: [TransportType.Beacon]\n                } as ISenderConfig;\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n                var coreConfig = {\n                    instrumentationKey: \"\",\n                    extensionConfig: {[sender.identifier]: config}\n                };\n\n                cr.initialize(coreConfig, [sender]);\n\n                this.onDone(() => {\n                    sender.teardown();\n                });\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                this.clock.tick(15000);\n\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called when Beacon API is enabled\");\n                QUnit.assert.equal(true, sendBeaconCalled, \"Beacon API is enabled, Beacon API is called\");\n            }\n        });\n\n \n\n        this.testCase({\n            name: 'Transport Type: disableXhr is false, and user provide xhr in transports',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return false;\n                });\n\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    transports: [TransportType.Xhr]\n                } as ISenderConfig;\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n                var coreConfig = {\n                    instrumentationKey: \"\",\n                    extensionConfig: {[sender.identifier]: config}\n                };\n\n                cr.initialize(coreConfig, [sender]);\n\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API is disabled, Beacon API is not called\");\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called\");\n                QUnit.assert.ok(!fetchstub.called, \"fetch sender is not called\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n        this.testCase({\n            name: 'Transport Type: disableXhr is false, but user provide fetch in transports',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return false;\n                });\n\n                let config = {\n                    endpointUrl: \"https//: test\",\n                    emitLineDelimitedJson: false,\n                    maxBatchInterval: 15000,\n                    maxBatchSizeInBytes: 102400,\n                    disableTelemetry: false,\n                    enableSessionStorageBuffer: true,\n                    isRetryDisabled: false,\n                    isBeaconApiDisabled:true,\n                    disableXhr: false,\n                    onunloadDisableFetch: false,\n                    onunloadDisableBeacon: false,\n                    instrumentationKey:\"key\",\n                    namePrefix: \"\",\n                    samplingPercentage: 100,\n                    customHeaders: [{header:\"header\",value:\"val\" }],\n                    convertUndefined: \"\",\n                    eventsLimitInMem: 10000,\n                    transports: [TransportType.Fetch]\n                } as ISenderConfig;\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n                var coreConfig = {\n                    instrumentationKey: \"\",\n                    extensionConfig: {[sender.identifier]: config}\n                };\n\n                cr.initialize(coreConfig, [sender]);\n\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API is disabled, Beacon API is not called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called\");\n                QUnit.assert.ok(fetchstub.called, \"fetch sender is called\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n        this.testCase({\n            name: \"disableBeaconSplit is set to true,  xhr should be used to send data diretly instead of splitting payloads.\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sessionStorage = window.sessionStorage;\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return false;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [sender.identifier]: {\n                            disableSendBeaconSplit: true,\n                            onunloadDisableFetch: true,\n                            disableXhr: true\n                            // to make sure beacon is used\n                        }\n                    }\n                    \n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"fake item\",\n                    iKey: \"iKey\",\n                    baseType: \"some type\",\n                    baseData: {\n                        largePayload: new Array(64 + 1).join(\"test\")\n                    }\n                };\n\n                let buffer = sender._buffer;\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should be clear\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    QUnit.assert.equal(1, buffer.getItems().length, \"sender buffer should have one payload\");\n                    let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                    QUnit.assert.equal(bufferItems.length, 1, \"sender buffer should have one payload\");\n                    let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                    QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload\");\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                this.clock.tick(5);\n\n                QUnit.assert.equal(true, sendBeaconCalled, \"Beacon API should be called\");\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender should be called\");\n                let xhrRequest =  this._getXhrRequests()[0];\n                QUnit.assert.equal(false, fetchstub.called, \"fetch sender is not called\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should not have one payload\");\n                QUnit.assert.equal(0, buffer.count(), \"sender buffer should not have any payload\");\n                let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(1, sentItems.length, \"sent buffer should have only one payload\");\n\n                this.sendJsonResponse(xhrRequest, {}, 200);\n                bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(0, sentItems.length, \"sent buffer should have no payload\");\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n                sessionStorage.clear();\n                \n            }\n        });\n\n        this.testCase({\n            name: \"disableBeaconSplit is set to false, xhr should not be called to send small payload.\",\n            test: () => {\n                let window = getWindow();\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sessionStorage = window.sessionStorage;\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n\n                let sendBeaconCalled = 0;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled += 1;\n                    return true;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [sender.identifier]: {\n                            onunloadDisableFetch: true,\n                            disableXhr: true,\n                            disableSendBeaconSplit: false\n                            // to make sure beacon is used\n                        }\n                    }\n                    \n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {}\n                };\n\n\n                let buffer = sender._buffer;\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should be clear\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    QUnit.assert.equal(1, buffer.getItems().length, \"sender buffer should have one payload\");\n                    let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                    QUnit.assert.equal(bufferItems.length, 1, \"sender buffer should have one payload\");\n                    let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                    QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload\");\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(1, sendBeaconCalled, \"Beacon API should be called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender should be called\");\n                QUnit.assert.equal(false, fetchstub.called, \"fetch sender is not called\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should not have one payload\");\n                QUnit.assert.equal(0, buffer.count(), \"sender buffer should not have any payload\");\n                let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(0, sentItems.length, \"sent buffer should not have one payload\");\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n                sessionStorage.clear();\n                \n            }\n        });\n\n        this.testCase({\n            name: \"disableBeaconSplit is set to false, xhr should be called to send large payload.\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sessionStorage = window.sessionStorage;\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n\n                let sendBeaconCalled = 0;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled += 1;\n                    if (sendBeaconCalled == 2) {\n                        return true;\n                    }\n                    return false;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [sender.identifier]: {\n                            onunloadDisableFetch: true,\n                            disableXhr: true,\n                            disableSendBeaconSplit: false\n                            \n                            // to make sure beacon is used\n                        }\n                    }\n                    \n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {}\n                };\n\n                const telemetryItem1: ITelemetryItem = {\n                    name: \"item\",\n                    iKey: \"iKey1\",\n                    baseType: \"type\",\n                    baseData: {}\n                };\n\n\n                let buffer = sender._buffer;\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should be clear\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.processTelemetry(telemetryItem1, null);\n                    QUnit.assert.equal(2, buffer.getItems().length, \"sender buffer should have one payload\");\n                    let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                    QUnit.assert.equal(bufferItems.length, 2, \"sender buffer should have one payload\");\n                    let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                    QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload\");\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n                this.clock.tick(5);\n\n                QUnit.assert.equal(3, sendBeaconCalled, \"Beacon API should be called 3 times\");\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender should be called\");\n                let xhrRequest = this._getXhrRequests()[0];\n                QUnit.assert.equal(false, fetchstub.called, \"fetch sender is not called\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should not have one payload\");\n                QUnit.assert.equal(0, buffer.count(), \"sender buffer should not have any payload\");\n                let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(1, sentItems.length, \"sent buffer should have one payload\");\n                QUnit.assert.ok(sentItems[0].item.indexOf(\"iKey1\") >= 0, \"sent buffer should have ikey1 payload\");\n\n                this.sendJsonResponse(xhrRequest, {}, 200);\n                bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should have no payload test1\");\n                sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload test1\");\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n                sessionStorage.clear();\n                \n            }\n        });\n\n        this.testCase({\n            name: \"fetchKeepAliveSender should not send duplicacted events during unload.\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sessionStorage = window.sessionStorage;\n                let sessionSpy = this.sandbox.spy(sessionStorage,\"setItem\");\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n\n                let sendBeaconCalled = 0;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled += 1;\n                    return true;\n                });\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [sender.identifier]: {\n                            disableXhr: true,\n                            disableSendBeaconSplit: false\n                        }\n                    }\n                    \n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {}\n                };\n\n\n                let buffer = sender._buffer;\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should be clear\");\n                QUnit.assert.equal(false, fetchstub.called, \"fetch sender is not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    QUnit.assert.equal(1, buffer.getItems().length, \"sender buffer should have one payload\");\n                    let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                    QUnit.assert.equal(bufferItems.length, 1, \"sender buffer should have one payload\");\n                    let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                    QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload\");\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n                this.clock.tick(5);\n\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API should be not called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender should not be called\");\n                QUnit.assert.equal(true, fetchstub.calledOnce, \"fetch sender is called once\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should not have one payload\");\n                QUnit.assert.equal(0, buffer.count(), \"sender buffer should not have any payload\");\n                let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(0, sentItems.length, \"sent buffer should have one payload test1\");\n\n                let setItemCalled = 0;\n                let args = sessionSpy.args;\n                let itemCount = 0;\n                args.forEach((arg) => {\n                    if (arg && arg[0] === SENT_BUFFER_KEY) {\n                        let data = JSON.parse(arg[1]);\n                        let cnt = data.length;\n                        if(data && cnt) {\n                            setItemCalled ++;\n                            itemCount += cnt;\n                        }\n                    }\n                });\n                QUnit.assert.equal(1, setItemCalled, \"sent buffer session should have be called once\");\n                QUnit.assert.equal(1, itemCount, \"sent buffer session should have be called once with one item\");\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n                sessionStorage.clear();\n                \n            }\n        });\n\n        this.testCase({\n            name: \"fetchKeepAliveSender should only trigger fetch once during unload.\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sessionStorage = window.sessionStorage;\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n\n                let sendBeaconCalled = 0;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled += 1;\n                    return true;\n                });\n                let fetchCalls = this.hookFetch((resolve) => {\n                    setTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [sender.identifier]: {\n                            disableXhr: true,\n                            disableSendBeaconSplit: false\n                        }\n                    }\n                    \n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {}\n                };\n\n\n                let buffer = sender._buffer;\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should be clear\");\n                QUnit.assert.equal(0, fetchCalls.length, \"fetch calls should not be called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    QUnit.assert.equal(1, buffer.getItems().length, \"sender buffer should have one payload\");\n                    let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                    QUnit.assert.equal(bufferItems.length, 1, \"sender buffer should have one payload\");\n                    let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                    QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload\");\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n                this.clock.tick(5);\n\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API should be not called\");\n                QUnit.assert.equal(1, fetchCalls.length, \"fetch calls should be called only once\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender should not be called\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should not have one payload\");\n                QUnit.assert.equal(0, buffer.count(), \"sender buffer should not have any payload\");\n                let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(0, sentItems.length, \"sent buffer should not have one payload\");\n\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n                sessionStorage.clear();\n                \n            }\n        });\n\n        this.testCase({\n            name: \"Onunloadflush: send payloads with fetch.\",\n            test: () => {\n                let window = getWindow();\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sessionStorage = window.sessionStorage;\n                let sessionSpy = this.sandbox.spy(sessionStorage,\"setItem\");\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n\n                let sendBeaconCalled = 0;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled += 1;\n                    return true;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [sender.identifier]: {\n                            onunloadDisableFetch: false,\n                            disableXhr: true,\n                            disableSendBeaconSplit: false\n                            // to make sure beacon is used\n                        }\n                    }\n\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"large item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {\n                        name: \"large item\"\n\n                    }\n                };\n\n                const telemetryItem1: ITelemetryItem = {\n                    name: \"smell item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {\n                        name: \"small item\"\n\n                    }\n                };\n\n\n                let buffer = sender._buffer;\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should be clear\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.processTelemetry(telemetryItem1, null);\n                    QUnit.assert.equal(2, buffer.getItems().length, \"sender buffer should have two payload\");\n                    let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                    QUnit.assert.equal(bufferItems.length, 2, \"sender buffer should have two payload\");\n                    let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                    QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload\");\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API should not be called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender should not be called\");\n                QUnit.assert.equal(true, fetchstub.called, \"fetch sender is called\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should not have one payload\");\n                QUnit.assert.equal(0, buffer.count(), \"sender buffer should not have any payload\");\n                let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(0, sentItems.length, \"sent buffer should have no payload left\");\n\n                let setItemCalled = 0;\n                let itemCount = 0;\n                let args = sessionSpy.args;\n                args.forEach((arg) => {\n                    if (arg && arg[0] === SENT_BUFFER_KEY) {\n                        let data = JSON.parse(arg[1]);\n                        let cnt = data.length;\n                        if(data && cnt) {\n                            setItemCalled ++;\n                            itemCount += cnt;\n                        }\n                    }\n                });\n                QUnit.assert.equal(1, setItemCalled, \"sent buffer session should have be called once\");\n                QUnit.assert.equal(2, itemCount, \"sent buffer session should have be called once with two item\");\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n                sessionStorage.clear();\n\n            }\n        });\n\n        this.testCase({\n            name: \"Onunloadflush: send payloads with beacon.\",\n            test: () => {\n                let window = getWindow();\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sessionStorage = window.sessionStorage;\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n\n                let sendBeaconCalled = 0;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled += 1;\n                    return false;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: \"abc\",\n                    extensionConfig: {\n                        [sender.identifier]: {\n                            onunloadDisableFetch: true,\n                            disableXhr: true,\n                            disableSendBeaconSplit: false\n                            // to make sure beacon is used\n                        }\n                    }\n\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: \"small item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {\n                        name: \"small item\"\n                    }\n                };\n\n                const telemetryItem1: ITelemetryItem = {\n                    name: \"large item\",\n                    iKey: \"iKey\",\n                    baseType: \"type\",\n                    baseData: {\n                        name: \"large item\"\n                    }\n                };\n\n\n                let buffer = sender._buffer;\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(0, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should be clear\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.processTelemetry(telemetryItem1, null);\n                    QUnit.assert.equal(2, buffer.getItems().length, \"sender buffer should have two payload\");\n                    let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                    QUnit.assert.equal(bufferItems.length, 2, \"sender buffer should have two payload\");\n                    let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                    QUnit.assert.equal(0, sentItems.length, \"sent buffer should have zero payload\");\n                    sender.onunloadFlush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(3, sendBeaconCalled, \"Beacon API should be called\");\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender should not be called\");\n                QUnit.assert.equal(false, fetchstub.called, \"fetch sender is called\");\n                QUnit.assert.equal(0, buffer.getItems().length, \"sender buffer should not have one payload\");\n                QUnit.assert.equal(0, buffer.count(), \"sender buffer should not have any payload\");\n                let bufferItems = JSON.parse(sessionStorage.getItem(BUFFER_KEY) as any);\n                QUnit.assert.equal(bufferItems.length, 0, \"sender buffer should be clear payload\");\n                let sentItems = JSON.parse(sessionStorage.getItem(SENT_BUFFER_KEY) as any);\n                QUnit.assert.equal(2, sentItems.length, \"sent buffer should not have two payload\");\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n                sessionStorage.clear();\n\n            }\n        });\n\n\n        this.testCase({\n            name: 'FetchAPI is used when isBeaconApiDisabled flag is true and disableXhr flag is true , use fetch sender.',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return false;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: true,\n                    disableXhr: true\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API is disabled, Beacon API is not called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called\");\n                QUnit.assert.ok(fetchstub.called, \"fetch sender is called\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n        this.testCase({\n            name: 'FetchAPI is used when isBeaconApiDisabled flag is true and XMLHttpRequest is not supported, use fetch sender.',\n            test: () => {\n                let window = getWindow();\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                (window as any).XMLHttpRequest = undefined;\n                let fetchstub = this.sandbox.stub((window as any), \"fetch\");\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return false;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: true\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API was not called before\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender was not called before\");\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, sendBeaconCalled, \"Beacon API is disabled, Beacon API is not called\");\n                QUnit.assert.equal(0, this._getXhrRequests().length, \"xhr sender is not called\");\n                QUnit.assert.ok(fetchstub.called, \"fetch sender is called\");\n                // store it back\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n        this.testCase({\n            name: 'Users are not allowed to add customHeaders when endpointUrl is Breeze.',\n            test: () => {\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: true,\n                    customHeaders: [\n                        {\n                            header: 'testHeader',\n                            value: 'testValue'\n                        }\n                    ]\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called\");\n                QUnit.assert.notOk(this._getXhrRequests()[0].requestHeaders.hasOwnProperty('testHeader'));\n            }\n        });\n\n        this.testCase({\n            name: 'Users could set the cross-origin header via request',\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let id = this._sender.identifier;\n                let coreConfig = {\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: true,\n                    extensionConfig: {\n                        [this._sender.identifier]: {\n                            corsPolicy: \"cross-origin\",\n                        }\n                    }\n                }\n                core.initialize(coreConfig, [this._sender]);\n\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                    this.clock.tick(30000);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n                const CrossOriginResourcePolicyHeader: string = \"X-Set-Cross-Origin-Resource-Policy\";\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called\");\n                let headers = this._getXhrRequests()[0].requestHeaders;\n                QUnit.assert.ok(headers.hasOwnProperty(CrossOriginResourcePolicyHeader));  \n                QUnit.assert.equal(headers[CrossOriginResourcePolicyHeader], 'cross-origin');\n                QUnit.assert.notOk(this._getXhrRequests()[0].requestHeaders.hasOwnProperty('testHeader'));\n\n                // dynamic change\n                core.config.extensionConfig[this._sender.identifier].corsPolicy = \"same-origin\";\n                this.clock.tick(1);\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                    this.clock.tick(30000);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n                headers = this._getXhrRequests()[1].requestHeaders;                \n                QUnit.assert.ok(headers.hasOwnProperty(CrossOriginResourcePolicyHeader));  \n                QUnit.assert.equal(headers[CrossOriginResourcePolicyHeader], 'same-origin');\n                QUnit.assert.notOk(this._getXhrRequests()[1].requestHeaders.hasOwnProperty('testHeader'));\n\n                // dynamic change to null\n                core.config.extensionConfig[this._sender.identifier].corsPolicy = null;\n                this.clock.tick(1);\n                try {\n                    this._sender.processTelemetry(telemetryItem);\n                    this.clock.tick(30000);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n                headers = this._getXhrRequests()[2].requestHeaders;                \n                QUnit.assert.notOk(this._getXhrRequests()[2].requestHeaders.hasOwnProperty(CrossOriginResourcePolicyHeader));\n            }\n        });\n\n        this.testCase({\n            name: 'Users are allowed to add customHeaders when endpointUrl is not Breeze.',\n            test: () => {\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.initialize({\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: true,\n                    endpointUrl: 'https://example.com',\n                    customHeaders: [\n                        {\n                            header: 'testHeader',\n                            value: 'testValue'\n                        }\n                    ]\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called\");\n                QUnit.assert.ok(this._getXhrRequests()[0].requestHeaders.hasOwnProperty('testHeader'));\n                QUnit.assert.equal(this._getXhrRequests()[0].requestHeaders.testHeader, 'testValue');\n            }\n        });\n\n        this.testCase({\n            name: 'Users are allowed to add customHeaders via addHeader method.',\n            test: () => {\n                let sendBeaconCalled = false;\n                this.hookSendBeacon((url: string) => {\n                    sendBeaconCalled = true;\n                    return true;\n                });\n\n                const sender = new Sender();\n                const cr = new AppInsightsCore();\n\n                sender.addHeader('testHeader', 'testValue');\n\n                sender.initialize({\n                    instrumentationKey: 'abc',\n                    isBeaconApiDisabled: true\n                }, cr, []);\n                this.onDone(() => {\n                    sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                try {\n                    sender.processTelemetry(telemetryItem, null);\n                    sender.flush();\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called\");\n                QUnit.assert.ok(this._getXhrRequests()[0].requestHeaders.hasOwnProperty('testHeader'));\n                QUnit.assert.equal(this._getXhrRequests()[0].requestHeaders.testHeader, 'testValue');\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: AppInsights Envelope created for Custom Event\",\n            test: () => {\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {\n                        app: {\n                            sesId: \"d041d2e5fa834b4f9eee41ac163bf402\"\n                        },\n                        device: {\n                            deviceClass: \"Browser\",\n                            localId: \"browser\"\n                        },\n                        os: {\n                            osVer: \"Windows11\"\n                        }\n                    },\n                    tags: [{\"ai.internal.sdkVersion\": \"javascript:2.5.1\"}],\n                    data: {\n                        \"property1\": \"val1\",\n                        \"measurement1\": 50.0,\n                        \"measurement2\": 1.3,\n                        \"property2\": \"val2\"\n                    },\n                    baseData: {\n                        \"name\": \"Event Name\"\n                    }\n                };\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, safeGetLogger(null));\n\n                const baseData = appInsightsEnvelope.data.baseData;\n\n                // Assert measurements\n                const resultMeasurements = baseData.measurements;\n                QUnit.assert.ok(resultMeasurements);\n                QUnit.assert.ok(resultMeasurements[\"measurement1\"]);\n                QUnit.assert.equal(50.0, resultMeasurements[\"measurement1\"]);\n                QUnit.assert.ok(resultMeasurements[\"measurement2\"]);\n                QUnit.assert.equal(1.3, resultMeasurements[\"measurement2\"]);\n\n                // Assert custom properties\n                QUnit.assert.ok(baseData.properties);\n                QUnit.assert.equal(\"val1\", baseData.properties[\"property1\"]);\n                QUnit.assert.equal(\"val2\", baseData.properties[\"property2\"]);\n\n                // Assert Event name\n                QUnit.assert.ok(baseData.name);\n                QUnit.assert.equal(\"Event Name\", baseData.name);\n\n                // Assert ver\n                QUnit.assert.ok(baseData.ver);\n                QUnit.assert.equal(2, baseData.ver);\n\n                // Assert baseType added by default\n                QUnit.assert.ok(appInsightsEnvelope.data.baseType);\n                QUnit.assert.equal(\"EventData\", appInsightsEnvelope.data.baseType);\n\n                // Assert tags\n                QUnit.assert.ok(appInsightsEnvelope.tags);\n                QUnit.assert.equal(\"d041d2e5fa834b4f9eee41ac163bf402\", appInsightsEnvelope.tags[\"ai.session.id\"]);\n                QUnit.assert.equal(\"browser\", appInsightsEnvelope.tags[\"ai.device.id\"]);\n                QUnit.assert.equal(\"browser\", appInsightsEnvelope.tags[\"ai.device.id\"]);\n                QUnit.assert.equal(\"Windows11\", appInsightsEnvelope.tags[\"ai.device.osVersion\"]);\n\n                QUnit.assert.equal(\"Browser\", appInsightsEnvelope.tags[\"ai.device.type\"]);\n                QUnit.assert.equal(\"javascript:2.5.1\", appInsightsEnvelope.tags[\"ai.internal.sdkVersion\"]);\n\n                // Assert name\n                QUnit.assert.ok(appInsightsEnvelope.name);\n                QUnit.assert.equal(\"Microsoft.ApplicationInsights.iKey.Event\", appInsightsEnvelope.name);\n\n                // Assert iKey\n                QUnit.assert.ok(appInsightsEnvelope.iKey);\n                QUnit.assert.equal(\"iKey\", appInsightsEnvelope.iKey);\n\n                // Assert timestamp\n                QUnit.assert.ok(appInsightsEnvelope.time);\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: AppInsights Envelope use default config iKey when iKey of ItelemetryItem is empty\",\n            test: () => {\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    iKey: \"\",\n                    ext: {},\n                    data: { \"property1\": \"val1\"},\n                    baseData: {\n                        \"name\": \"Event Name\"\n                    }\n                };\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n\n                const baseData = appInsightsEnvelope.data.baseData;\n\n                // Assert Event name\n                QUnit.assert.ok(baseData.name);\n                QUnit.assert.equal(\"Event Name\", baseData.name);\n\n                // Assert name\n                QUnit.assert.ok(appInsightsEnvelope.name);\n                QUnit.assert.equal(\"Microsoft.ApplicationInsights.iKey.Event\", appInsightsEnvelope.name);\n\n                // Assert iKey\n                QUnit.assert.ok(appInsightsEnvelope.iKey);\n                QUnit.assert.equal( this._instrumentationKey, appInsightsEnvelope.iKey, \"default config iKey is not set\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: AppInsights Envelope  unknown type returns custom Event data type\",\n            test: () => {\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {\n                        \"ai.session.id\": \"d041d2e5fa834b4f9eee41ac163bf402\",\n                        \"ai.device.id\": \"browser\",\n                        \"ai.device.type\": \"Browser\",\n                    },\n                    tags: [{}],\n                    data: {\n                        \"property1\": \"val1\",\n                        \"measurement1\": 50.0,\n                        \"measurement2\": 1.3,\n                        \"property2\": \"val2\"\n                    },\n                    baseType: \"PageUnloadData\",\n                    baseData: {\n                        id: \"EADE2F09-DEBA-4B60-A222-E1D80BB8AA7F\",\n                        vpHeight: 1002,\n                        vScrollOffset: 292\n                    }\n                };\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const baseData = appInsightsEnvelope.data.baseData;\n\n                // Assert measurements\n                const resultMeasurements = baseData.measurements;\n                QUnit.assert.ok(resultMeasurements);\n                QUnit.assert.ok(resultMeasurements[\"measurement1\"]);\n                QUnit.assert.equal(50.0, resultMeasurements[\"measurement1\"]);\n                QUnit.assert.ok(resultMeasurements[\"measurement2\"]);\n                QUnit.assert.equal(1.3, resultMeasurements[\"measurement2\"]);\n                QUnit.assert.ok(resultMeasurements[\"vpHeight\"]);\n                QUnit.assert.equal(1002, resultMeasurements[\"vpHeight\"]);\n                QUnit.assert.ok(resultMeasurements[\"vScrollOffset\"]);\n                QUnit.assert.equal(292, resultMeasurements[\"vScrollOffset\"]);\n\n                // Assert custom properties\n                QUnit.assert.ok(baseData.properties);\n                QUnit.assert.equal(\"val1\", baseData.properties[\"property1\"]);\n                QUnit.assert.equal(\"val2\", baseData.properties[\"property2\"]);\n                QUnit.assert.equal(\"EADE2F09-DEBA-4B60-A222-E1D80BB8AA7F\", baseData.properties[\"id\"]);\n\n                // Assert Event name\n                QUnit.assert.ok(baseData.name);\n                QUnit.assert.equal(\"PageUnloadData\", baseData.properties['baseTypeSource']);\n\n                // Assert ver\n                QUnit.assert.ok(baseData.ver);\n                QUnit.assert.equal(2, baseData.ver);\n\n                QUnit.assert.equal(`javascript:${EnvelopeCreator.Version}`, appInsightsEnvelope.tags[\"ai.internal.sdkVersion\"]);\n            }\n        })\n\n        this.testCase({\n            name: \"AppInsightsTests: AppInsights Envelope create for Dependency Data\",\n            test: () => {\n                // setup\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {\n                        \"user\" : {\n                            \"localId\": \"TestId\",\n                            \"authId\": \"AuthenticatedId\",\n                            \"id\": \"TestId\"\n                        }\n                    },\n                    tags: [{\"ai.user.accountId\": \"TestAccountId\"},\n                           {\"ai.location.ip\": \"10.22.8.2\"}],\n                    baseType: \"RemoteDependencyData\",\n                    baseData: {\n                        id: 'some id',\n                        name: \"Some name given\",\n                        success: true,\n                        responseCode: 200,\n                        duration: 123,\n                        type: 'Fetch',\n                        data: 'some data',\n                        target: 'https://example.com/test/name?q=bar',\n                        correlationContext: \"cid-v1:foo\"\n                    },\n                    data: {\n                        property1: \"val1\",\n                        property2: \"val2\",\n                        measurement1: 50.0,\n                        measurement2: 1.3\n                    }\n\n                }\n\n                // act\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const { baseData } = appInsightsEnvelope.data;\n\n                // assert\n                const resultDuration = baseData.duration;\n                QUnit.assert.equal(\"00:00:00.123\", resultDuration);\n\n                // Assert measurements\n                const resultMeasurements = baseData.measurements;\n                QUnit.assert.ok(resultMeasurements);\n                QUnit.assert.ok(resultMeasurements[\"measurement1\"]);\n                QUnit.assert.equal(50.0, resultMeasurements[\"measurement1\"]);\n                QUnit.assert.ok(resultMeasurements[\"measurement2\"]);\n                QUnit.assert.equal(1.3, resultMeasurements[\"measurement2\"]);\n                QUnit.assert.ok(!resultMeasurements.duration, \"duration is not supposed to be treated as measurement\");\n\n                // Assert custom properties\n                QUnit.assert.ok(baseData.properties);\n                QUnit.assert.equal(\"val1\", baseData.properties[\"property1\"]);\n                QUnit.assert.equal(\"val2\", baseData.properties[\"property2\"]);\n\n                // Assert baseData\n                QUnit.assert.ok(baseData.name);\n                QUnit.assert.equal(\"Some name given\", baseData.data);\n                QUnit.assert.equal(\"some id\", baseData.id);\n                QUnit.assert.equal(true, baseData.success);\n                QUnit.assert.equal(200, baseData.resultCode);\n                QUnit.assert.equal(\"Some name given\", baseData.name);\n                QUnit.assert.equal(\"example.com | cid-v1:foo\", baseData.target);\n\n                // Assert ver\n                QUnit.assert.ok(baseData.ver);\n                QUnit.assert.equal(2, baseData.ver);\n\n                // Assert baseType\n                QUnit.assert.ok(appInsightsEnvelope.data.baseType);\n                QUnit.assert.equal(\"RemoteDependencyData\", appInsightsEnvelope.data.baseType);\n\n                // Assert tags\n                QUnit.assert.ok(appInsightsEnvelope.tags);\n                QUnit.assert.equal(\"TestAccountId\", appInsightsEnvelope.tags[\"ai.user.accountId\"]);\n                QUnit.assert.equal(\"10.22.8.2\", appInsightsEnvelope.tags[\"ai.location.ip\"]);\n\n                QUnit.assert.equal(\"AuthenticatedId\", appInsightsEnvelope.tags[\"ai.user.authUserId\"]);\n                QUnit.assert.equal(\"TestId\", appInsightsEnvelope.tags[\"ai.user.id\"]);\n\n                // Assert name\n                QUnit.assert.ok(appInsightsEnvelope.name);\n                QUnit.assert.equal(\"Microsoft.ApplicationInsights.iKey.RemoteDependency\", appInsightsEnvelope.name);\n\n                // Assert iKey\n                QUnit.assert.ok(appInsightsEnvelope.iKey);\n                QUnit.assert.equal(\"iKey\", appInsightsEnvelope.iKey);\n\n                // Assert timestamp\n                QUnit.assert.ok(appInsightsEnvelope.time);\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: When name is not provided, it is obtained from hostname\",\n            test: () => {\n                // setup\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {\n                        \"user\" : {\n                            \"localId\": \"TestId\",\n                            \"authId\": \"AuthenticatedId\",\n                            \"id\": \"TestId\"\n                        }\n                    },\n                    tags: [{\"ai.user.accountId\": \"TestAccountId\"},\n                           {\"ai.location.ip\": \"10.22.8.2\"}, {\"ai.internal.sdkVersion\": \"1234\"}],\n                    baseType: \"RemoteDependencyData\",\n                    baseData: {\n                        id: 'some id',\n                        success: true,\n                        responseCode: 200,\n                        duration: 123,\n                        type: 'Fetch',\n                        data: 'some data',\n                        target: 'https://example.com/test/name'\n                    },\n                    data: {\n                        property1: \"val1\",\n                        property2: \"val2\",\n                        measurement1: 50.0,\n                        measurement2: 1.3\n                    }\n\n                }\n\n                // act\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const { baseData } = appInsightsEnvelope.data;\n\n                // Assert baseData\n                QUnit.assert.ok(baseData.name);\n                QUnit.assert.equal(\"GET /test/name\", baseData.name); // retrieved from target\n                QUnit.assert.equal(\"/test/name\", baseData.data);\n\n                // Assert sdkVersion\n                QUnit.assert.equal(\"1234\", appInsightsEnvelope.tags[\"ai.internal.sdkVersion\"])\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: AppInsights Envelope created for Page View\",\n            test: () => {\n                // setup\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {\n                        \"user\": {\n                            \"localId\": \"TestId\",\n                            \"authId\": \"AuthenticatedId\",\n                            \"id\": \"TestId\"\n                        },\n                        \"trace\": {\n                            \"traceID\": \"1528B5FF-6455-4657-BE77-E6664CAC72DC\",\n                            \"parentID\": \"1528B5FF-6455-4657-BE77-E6664CACEEEE\"\n                        }\n                    },\n                    tags: [{\"ai.user.accountId\": \"TestAccountId\"}],\n                    baseType: \"PageviewData\",\n                    baseData: {\n                        \"name\": \"Page View Name\",\n                        \"uri\": \"https://fakeUri.com\",\n                        properties: {\n                            \"property1\": \"val1\",\n                            \"property2\": \"val2\",\n                            \"duration\": 300000\n                        },\n                        measurements: {\n                            \"measurement1\": 50.0,\n                            \"measurement2\": 1.3,\n                        }\n                    },\n                    data: {\n                        \"property3\": \"val3\",\n                        \"measurement3\": 1000\n                    }\n                };\n\n                // Act\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const baseData = appInsightsEnvelope.data.baseData;\n\n                // Assert duration\n                const resultDuration = baseData.duration;\n                QUnit.assert.equal(\"00:05:00.000\", resultDuration);\n\n                // Assert measurements\n                const resultMeasurements = baseData.measurements;\n                const  props = baseData.properties;\n                QUnit.assert.ok(resultMeasurements);\n                QUnit.assert.ok(resultMeasurements[\"measurement1\"]);\n                QUnit.assert.equal(50.0, resultMeasurements[\"measurement1\"]);\n                QUnit.assert.ok(resultMeasurements[\"measurement2\"]);\n                QUnit.assert.equal(1.3, resultMeasurements[\"measurement2\"]);\n                QUnit.assert.ok(!resultMeasurements.duration, \"duration is not supposed to be treated as property in envelope\");\n\n                // Assert custom properties\n                QUnit.assert.ok(baseData.properties);\n                QUnit.assert.equal(\"val1\", baseData.properties[\"property1\"]);\n                QUnit.assert.equal(\"val2\", baseData.properties[\"property2\"]);\n\n                // Assert deprecated data custom properties/measurements\n                QUnit.assert.equal(\"val3\", baseData.properties[\"property3\"])\n                QUnit.assert.equal(1000, baseData.measurements[\"measurement3\"]);\n\n                // Assert Page View name\n                QUnit.assert.ok(baseData.name);\n                QUnit.assert.equal(\"Page View Name\", baseData.name);\n\n\n                // Assert ver\n                QUnit.assert.ok(baseData.ver);\n                QUnit.assert.equal(2, baseData.ver);\n\n                // Assert baseType\n                QUnit.assert.ok(appInsightsEnvelope.data.baseType);\n                QUnit.assert.equal(\"PageviewData\", appInsightsEnvelope.data.baseType);\n\n                // Assert tags\n                QUnit.assert.ok(appInsightsEnvelope.tags);\n                QUnit.assert.equal(\"TestAccountId\", appInsightsEnvelope.tags[\"ai.user.accountId\"]);\n                QUnit.assert.equal(\"AuthenticatedId\", appInsightsEnvelope.tags[\"ai.user.authUserId\"]);\n                QUnit.assert.equal(\"TestId\", appInsightsEnvelope.tags[\"ai.user.id\"]);\n\n                // Assert sdkVersion\n                QUnit.assert.ok(EnvelopeCreator.Version)\n                QUnit.assert.ok(EnvelopeCreator.Version.length > 0)\n                QUnit.assert.equal(`javascript:${EnvelopeCreator.Version}`, appInsightsEnvelope.tags[\"ai.internal.sdkVersion\"])\n\n                // QUnit.assert.equal(\"d041d2e5fa834b4f9eee41ac163bf402\", appInsightsEnvelope.tags[\"ai.session.id\"]);\n                // QUnit.assert.equal(\"browser\", appInsightsEnvelope.tags[\"ai.device.id\"]);\n                // QUnit.assert.equal(\"Browser\", appInsightsEnvelope.tags[\"ai.device.type\"]);\n                // QUnit.assert.equal(\"javascript:1.0.18\", appInsightsEnvelope.tags[\"ai.internal.sdkVersion\"]);\n\n                // Assert name\n                QUnit.assert.ok(appInsightsEnvelope.name);\n                QUnit.assert.equal(\"Microsoft.ApplicationInsights.iKey.Pageview\", appInsightsEnvelope.name);\n\n                // Assert iKey\n                QUnit.assert.ok(appInsightsEnvelope.iKey);\n                QUnit.assert.equal(\"iKey\", appInsightsEnvelope.iKey);\n\n                // Assert timestamp\n                QUnit.assert.ok(appInsightsEnvelope.time);\n\n\n                QUnit.assert.equal(\"1528B5FF-6455-4657-BE77-E6664CAC72DC\", appInsightsEnvelope.tags[\"ai.operation.id\"]);\n                QUnit.assert.equal(\"1528B5FF-6455-4657-BE77-E6664CACEEEE\", appInsightsEnvelope.tags[\"ai.operation.parentId\"])\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: AppInsights Envelope created for Page View with duration in customProperties Part C\",\n            test: () => {\n                // setup\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {\n                        \"user\": {\n                            \"localId\": \"TestId\",\n                            \"authId\": \"AuthenticatedId\",\n                            \"id\": \"TestId\"\n                        },\n                        \"trace\": {\n                            \"traceID\": \"1528B5FF-6455-4657-BE77-E6664CAC72DC\",\n                            \"parentID\": \"1528B5FF-6455-4657-BE77-E6664CACEEEE\"\n                        }\n                    },\n                    tags: [{\"ai.user.accountId\": \"TestAccountId\"}],\n                    baseType: \"PageviewData\",\n                    baseData: {\n                        \"name\": \"Page View Name\",\n                        \"uri\": \"https://fakeUri.com\",\n                        properties: {\n                            \"property1\": \"val1\",\n                            \"property2\": \"val2\",\n                        },\n                        measurements: {\n                            \"measurement1\": 50.0,\n                            \"measurement2\": 1.3,\n                        }\n                    },\n                    data: {\n                        \"duration\": 300000\n                    }\n                };\n\n                // Act\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const baseData = appInsightsEnvelope.data.baseData;\n\n                // Assert duration\n                const resultDuration = baseData.duration;\n                QUnit.assert.equal(\"00:05:00.000\", resultDuration);\n            }\n        });\n\n        this.testCase({\n            name: 'Envelope: custom properties are put into envelope for Exception data type',\n            test: () => {\n                const bd = new Exception(\n                    null,\n                    new Error(),\n                    {\"property1\": \"val1\", \"property2\": \"val2\" },\n                    {\"measurement1\": 50.0, \"measurement2\": 1.3 }\n                );\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    baseType: ExceptionDataType,\n                    baseData: bd,\n                    data: {\n                        \"property3\": \"val3\",\n                        \"measurement3\": 3.0\n                    },\n                    ext: {\n                        \"user\": {\n                            \"localId\": \"TestId\",\n                            \"authId\": \"AuthenticatedId\",\n                            \"id\": \"TestId\"\n                        }\n                    },\n                    tags: [{\"user.accountId\": \"TestAccountId\"}],\n                };\n\n                // Act\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const baseData = appInsightsEnvelope.data.baseData; \n\n                QUnit.assert.equal(\"val3\", baseData.properties[\"property3\"], \"ExceptionData: customProperties (item.data) are added to the properties of the envelope and not included in the item.data\")\n                QUnit.assert.equal(\"val1\", baseData.properties[\"property1\"], \"ExceptionData: properties (item.baseData.properties) are added to telemetry envelope\");\n                QUnit.assert.equal(50.0, baseData.measurements[\"measurement1\"], \"ExceptionData: measurements (item.baseData.measurements) are added to telemetry envelope\");\n\n            }\n        });\n\n        this.testCase({\n            name: 'Offline watcher is listening to events',\n            test: () => {\n                QUnit.assert.ok(this._offline.isListening(), 'Offline is listening');\n                QUnit.assert.equal(true, this._offline.isOnline(), 'Offline reports online status');\n            }\n        });\n\n        this.testCase({\n            name: 'Offline watcher responds to offline events (window.addEventListener)',\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                const offlineEvent = new Event('offline');\n                const onlineEvent = new Event('online');\n\n                // Verify precondition\n                QUnit.assert.ok(this._offline.isListening());\n                QUnit.assert.ok(this._offline.isOnline());\n\n                // Act - Go offline\n                window.dispatchEvent(offlineEvent);\n                this.clock.tick(1);\n\n                // Verify offline\n                QUnit.assert.ok(!this._offline.isOnline());\n\n                // Act - Go online\n                window.dispatchEvent(onlineEvent);\n                this.clock.tick(1);\n\n                // Verify online\n                QUnit.assert.ok(this._offline.isOnline());\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: AppInsights Envelope created for Page View with new web extension\",\n            test: () => {\n                // setup\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    iKey: \"iKey\",\n                    ext: {\n                        \"web\": {\n                            \"domain\": \"www.bing.com\",\n                            \"userConsent\": true,\n                            \"screenRes\": \"1024x768\",\n                            \"browser\": \"internet explorer\",\n                            \"browserVer\": \"48.0\",\n                            \"isManual\": true,\n                            \"browserLang\": \"EN\"\n                        }\n                    },\n                    baseType: \"PageviewData\",\n                    baseData: {\n                        \"name\": \"Page View Name\",\n                        \"uri\": \"https://fakeUri.com\",\n                        \"startTime\": new Date(123),\n                        properties: {\n                            \"property1\": \"val1\",\n                            \"property2\": \"val2\"\n                        },\n                        measurements: {\n                            \"measurement1\": 50.0,\n                        }\n                    }\n                };\n\n                // Act\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const baseData = appInsightsEnvelope.data.baseData;\n\n                // Assert envelope\n                QUnit.assert.deepEqual(appInsightsEnvelope.time, new Date(123).toISOString());\n\n                // Assert measurements\n                const resultMeasurements = baseData.measurements;\n                QUnit.assert.ok(resultMeasurements);\n                QUnit.assert.ok(resultMeasurements[\"measurement1\"]);\n                QUnit.assert.equal(50.0, resultMeasurements[\"measurement1\"]);\n\n                // Assert custom properties\n                QUnit.assert.ok(baseData.properties);\n                QUnit.assert.equal(\"val1\", baseData.properties[\"property1\"]);\n                QUnit.assert.equal(\"val2\", baseData.properties[\"property2\"]);\n                QUnit.assert.equal(\"true\", baseData.properties[\"isManual\"]);\n                QUnit.assert.equal(\"1024x768\", baseData.properties[\"screenRes\"]);\n                QUnit.assert.equal(\"true\", baseData.properties[\"userConsent\"]);\n                QUnit.assert.equal(\"www.bing.com\", baseData.properties[\"domain\"]);\n\n                QUnit.assert.equal(\"internet explorer\", appInsightsEnvelope.tags[CtxTagKeys.deviceBrowser]);\n                QUnit.assert.equal(\"48.0\", appInsightsEnvelope.tags[CtxTagKeys.deviceBrowserVersion]);\n                QUnit.assert.equal(\"EN\", appInsightsEnvelope.tags[CtxTagKeys.deviceLanguage]);\n\n                // Assert Page View name\n                QUnit.assert.ok(baseData.name);\n                QUnit.assert.equal(\"Page View Name\", baseData.name);\n\n                // Assert ver\n                QUnit.assert.ok(baseData.ver);\n                QUnit.assert.equal(2, baseData.ver);\n\n                // Assert baseType\n                QUnit.assert.ok(appInsightsEnvelope.data.baseType);\n                QUnit.assert.equal(\"PageviewData\", appInsightsEnvelope.data.baseType);\n\n                // Assert name\n                QUnit.assert.ok(appInsightsEnvelope.name);\n                QUnit.assert.equal(\"Microsoft.ApplicationInsights.iKey.Pageview\", appInsightsEnvelope.name);\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Notification is sent when requests are being sent when requests exceed max batch size\",\n            useFakeTimers: true,\n            test: () => {\n                let sendNotifications = [];\n                let notificationManager = new NotificationManager();\n                notificationManager.addNotificationListener({\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason,\n                            isAsync\n                        });\n                    }\n                });\n\n                let core = new AppInsightsCore();\n                this.sandbox.stub(core, \"getNotifyMgr\").returns(notificationManager);\n\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        maxBatchSizeInBytes: 100,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 100\n                            }\n                        }\n\n                    }, core, []\n                );\n\n                const loggerSpy = this.sandbox.spy(this._sender, \"triggerSend\");\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                try {\n                    this._sender.processTelemetry(telemetryItem, null);\n                    this._sender.processTelemetry(telemetryItem, null);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(true, loggerSpy.called);\n                this.clock.tick(1);\n                QUnit.assert.ok(sendNotifications.length === 1);\n                QUnit.assert.ok(sendNotifications[0].sendReason === SendRequestReason.MaxBatchSize);\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Notification is sent when requests are being sent with manual flush\",\n            useFakeTimers: true,\n            test: () => {\n                let sendNotifications = [];\n                let notificationManager = new NotificationManager();\n                notificationManager.addNotificationListener({\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason,\n                            isAsync\n                        });\n                    }\n                });\n\n                let core = new AppInsightsCore();\n                this.sandbox.stub(core, \"getNotifyMgr\").returns(notificationManager);\n\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        extensionConfig: {\n                        }\n\n                    }, core, []\n                );\n\n                const loggerSpy = this.sandbox.spy(this._sender, \"triggerSend\");\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                try {\n                    this._sender.processTelemetry(telemetryItem, null);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, loggerSpy.calledOnce);\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this._sender.flush();\n                QUnit.assert.equal(true, loggerSpy.calledOnce);\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this.clock.tick(1);\n\n                QUnit.assert.equal(1, sendNotifications.length);\n                QUnit.assert.equal(SendRequestReason.ManualFlush, sendNotifications[0].sendReason);\n            }\n        });\n\n        this.testCase({\n            name: \"IKey Validation Test\",\n            test: () => {\n                let appInsightsCore = new AppInsightsCore();\n                appInsightsCore.logger = new DiagnosticLogger();\n                let messageId: _eInternalMessageId = _eInternalMessageId.InvalidInstrumentationKey;\n                this._sender.initialize(\n                    {\n                        instrumentationKey: '1aa11111-bbbb-1ccc-8ddd-eeeeffff3333',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        }\n\n                    }, appInsightsCore, []\n                );\n\n                QUnit.assert.equal(0, appInsightsCore.logger.queue.length, \"POST: No messageId logged\");\n                this._sender.teardown();\n\n                appInsightsCore = new AppInsightsCore();\n                appInsightsCore.logger = new DiagnosticLogger();\n                messageId = _eInternalMessageId.InvalidInstrumentationKey;\n                this._sender.initialize(\n                    {\n                        instrumentationKey: '1aa11111bbbb1ccc8dddeeeeffff3333',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        }\n\n                    }, appInsightsCore, []\n                );\n\n                QUnit.assert.equal(1, appInsightsCore.logger.queue.length, \"POST: Correct messageId logged\");\n                QUnit.assert.ok(appInsightsCore.logger.queue[0].message.indexOf('Invalid Instrumentation key') !== -1, \"Correct message logged\");\n                QUnit.assert.equal(messageId, appInsightsCore.logger.queue[0].messageId, \"Correct message logged\");\n                this._sender.teardown();\n\n                appInsightsCore = new AppInsightsCore();\n                appInsightsCore.logger = new DiagnosticLogger();\n                messageId = _eInternalMessageId.InvalidInstrumentationKey;\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        }\n\n                    }, appInsightsCore, []\n                );\n\n                QUnit.assert.equal(1, appInsightsCore.logger.queue.length, \"POST: Correct messageId logged\");\n                QUnit.assert.ok(appInsightsCore.logger.queue[0].message.indexOf('Invalid Instrumentation key') !== -1, \"Correct message logged\");\n                QUnit.assert.equal(messageId, appInsightsCore.logger.queue[0].messageId, \"Correct message logged\");\n                this._sender.teardown();\n\n                appInsightsCore = new AppInsightsCore();\n                appInsightsCore.logger = new DiagnosticLogger();\n                messageId = _eInternalMessageId.InvalidInstrumentationKey;\n                this._sender.initialize(\n                    {\n                        instrumentationKey: '',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        }\n\n                    }, appInsightsCore, []\n                );\n\n                QUnit.assert.equal(1, appInsightsCore.logger.queue.length, \"POST: Correct messageId logged\");\n                QUnit.assert.ok(appInsightsCore.logger.queue[0].message.indexOf('Invalid Instrumentation key') !== -1, \"Correct message logged\");\n                QUnit.assert.equal(messageId, appInsightsCore.logger.queue[0].messageId, \"Correct message logged\");\n                this._sender.teardown();\n\n                appInsightsCore = new AppInsightsCore();\n                appInsightsCore.logger = new DiagnosticLogger();\n                messageId = _eInternalMessageId.InvalidInstrumentationKey;\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        maxBatchSizeInBytes: 654,\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                maxBatchSizeInBytes: 456\n                            }\n                        },\n                        disableInstrumentationKeyValidation: true\n\n                    }, appInsightsCore, []\n                );\n\n                QUnit.assert.equal(0, appInsightsCore.logger.queue.length, \"POST: No messageId logged\");\n                this._sender.teardown();\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: convert custom dimension undefined values to customer defined value with config convertUndefined\",\n            test: () => {\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    iKey: \"iKey\",\n                    data: {\n                        \"property1\": undefined,\n                        \"property2\": \"value2\"\n                    },\n                    baseData: {\n                        \"name\": \"Event Name\"\n                    }\n                };\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null, \"test\");\n\n                const baseData = appInsightsEnvelope.data.baseData;\n\n                // Assert custom properties\n                QUnit.assert.ok(baseData.properties);\n                QUnit.assert.equal(\"test\", baseData.properties[\"property1\"]);\n                QUnit.assert.equal(\"value2\", baseData.properties[\"property2\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Validate pausing and resuming sending with manual flush\",\n            useFakeTimers: true,\n            test: () => {\n                let sendNotifications = [];\n                let notificationManager = new NotificationManager();\n                notificationManager.addNotificationListener({\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason,\n                            isAsync\n                        });\n                    }\n                });\n\n                let core = new AppInsightsCore();\n                this.sandbox.stub(core, \"getNotifyMgr\").returns(notificationManager);\n\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        endpointUrl: 'https://example.com',\n                        extensionConfig: {\n                        }\n\n                    }, core, []\n                );\n\n                const loggerSpy = this.sandbox.spy(this._sender, \"triggerSend\");\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n                try {\n                    this._sender.processTelemetry(telemetryItem, null);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, loggerSpy.calledOnce);\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this._sender.pause();\n                this._sender.flush();\n                QUnit.assert.equal(false, loggerSpy.calledOnce);\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this.clock.tick(1);\n\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this._sender.resume();\n                this._sender.flush();\n                QUnit.assert.equal(true, loggerSpy.calledOnce);\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this.clock.tick(1);\n\n                QUnit.assert.equal(1, sendNotifications.length);\n                QUnit.assert.equal(SendRequestReason.ManualFlush, sendNotifications[0].sendReason);\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Validate pausing and resuming sending when exceeding the batch size limits\",\n            useFakeTimers: true,\n            test: () => {\n                let sendNotifications = [];\n                let notificationManager = new NotificationManager();\n                notificationManager.addNotificationListener({\n                    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n                        sendNotifications.push({\n                            sendReason,\n                            isAsync\n                        });\n                    }\n                });\n\n                let core = new AppInsightsCore();\n                this.sandbox.stub(core, \"getNotifyMgr\").returns(notificationManager);\n\n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        maxBatchSizeInBytes: 4096,\n                        endpointUrl: 'https://example.com',\n                        extensionConfig: {\n                        }\n\n                    }, core, []\n                );\n\n                const triggerSendSpy = this.sandbox.spy(this._sender, \"triggerSend\");\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                this._sender.pause();\n\n                // Keep sending events until the max payload size is reached\n                while (!triggerSendSpy.calledOnce) {\n                    try {\n                        this._sender.processTelemetry(telemetryItem, null);\n                    } catch(e) {\n                        QUnit.assert.ok(false);\n                    }\n                }\n\n                QUnit.assert.equal(true, triggerSendSpy.calledOnce);\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this.clock.tick(1);\n\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                QUnit.assert.equal(false, triggerSendSpy.calledTwice);\n                this._sender.resume();\n\n                QUnit.assert.equal(true, triggerSendSpy.calledTwice);\n                QUnit.assert.equal(0, sendNotifications.length);\n\n                this.clock.tick(1);\n\n                QUnit.assert.equal(1, sendNotifications.length);\n                QUnit.assert.equal(SendRequestReason.MaxBatchSize, sendNotifications[0].sendReason);\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Process telemetry when offline and exceeding the batch size limits\",\n            useFakeTimers: true,\n            test: () => {\n                const maxBatchSizeInBytes = 1024;\n                let core = new AppInsightsCore();\n                \n                this._sender.initialize(\n                    {\n                        instrumentationKey: 'abc',\n                        maxBatchInterval: 123,\n                        maxBatchSizeInBytes: maxBatchSizeInBytes,\n                        endpointUrl: 'https://example.com',\n                        extensionConfig: {\n                        }\n                        \n                    }, core, []\n                );\n                \n                const triggerSendSpy = this.sandbox.spy(this._sender, \"triggerSend\");\n                const telemetryItem: ITelemetryItem = {\n                    name: 'fake item with some really long name to take up space quickly',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                // Act - Go offline\n                const offlineEvent = new Event('offline');\n                window.dispatchEvent(offlineEvent);\n\n                // Keep sending events until the max payload size is exceeded\n                while (!triggerSendSpy.called && this._sender._buffer.size() < maxBatchSizeInBytes) {\n                    try {\n                        this._sender.processTelemetry(telemetryItem, null);\n                    } catch(e) {\n                        QUnit.assert.ok(false);\n                    }\n                }\n\n                QUnit.assert.equal(false, triggerSendSpy.called);\n\n                this.clock.tick(1);\n\n                QUnit.assert.equal(false, triggerSendSpy.called);\n            }\n        });\n\n        this.testCase({\n            name: \"Channel Config: Process telemetry when offline and reponse code is 200\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                \n                this._sender.initialize(\n                    {\n                        instrumentationKey: \"abc\",\n                        endpointUrl: 'https://example.com',\n                        extensionConfig: {\n                            [this._sender.identifier]: {\n                                namePrefix: \"offline\"\n                            }\n                        }\n                        \n                    }, core, []\n                );\n                \n                const triggerSendSpy = this.sandbox.spy(this._sender, \"triggerSend\");\n                const telemetryItem: ITelemetryItem = {\n                    name: \"testevent\",\n                    iKey: \"iKey\",\n                    baseType: \"some type\",\n                    baseData: {}\n                };\n\n                try {\n                    this._sender.processTelemetry(telemetryItem, undefined);\n                } catch(e) {\n                    QUnit.assert.ok(false);\n                }\n\n                QUnit.assert.equal(false, triggerSendSpy.called, \"trigger send should not be called\");\n\n                let keys = utlGetSessionStorageKeys();\n                QUnit.assert.deepEqual(keys.length, 2, \"session buffer should contain only two keys\");\n                let bufferKey = \"offline_\"+ BUFFER_KEY;\n                let sentKey = \"offline_\" + SENT_BUFFER_KEY;\n                QUnit.assert.ok(keys.indexOf(bufferKey) > -1, \"session buffer key contain buffer key\");\n                QUnit.assert.ok(keys.indexOf(sentKey) > -1, \"session buffer key contain sent buffer key\");\n                let itemsStr = sessionStorage.getItem(bufferKey) || \"\";\n                let items =JSON.parse(itemsStr);\n                QUnit.assert.equal(items.length, 1, \"items should be saved\");\n\n                this._sender.flush();\n\n                // Act - Go offline\n                const offlineEvent = new Event('offline');\n                window.dispatchEvent(offlineEvent);\n                QUnit.assert.equal(true, triggerSendSpy.called, \"trigger send should be called\");\n                itemsStr = sessionStorage.getItem(sentKey) || \"\";\n                items =JSON.parse(itemsStr);\n                QUnit.assert.equal(items.length, 1, \"items should be saved into sent buffer\");\n\n                let requests = this._getXhrRequests();\n                QUnit.assert.deepEqual(requests.length, 1, \"should have only 1 requests\");\n                let request = requests[0];\n                this.sendJsonResponse(request, {}, 200);\n\n                itemsStr = sessionStorage.getItem(bufferKey) || \"\";\n                items =JSON.parse(itemsStr);\n                QUnit.assert.equal(items.length, 0, \"items should be cleared\");\n\n                itemsStr = sessionStorage.getItem(sentKey) || \"\";\n                items =JSON.parse(itemsStr);\n                QUnit.assert.equal(items.length, 0, \"sent items should be cleared\");\n                \n            }\n        });\n\n        this.testCase({\n            name: 'Envelope: operation.name is correctly truncated if required',\n            test: () => {\n                const excessiveName = new Array(1234).join(\"a\"); // exceeds max of 1024\n\n                const bd = new Exception(\n                    null,\n                    new Error(),\n                    {\"property1\": \"val1\", \"property2\": \"val2\" },\n                    {\"measurement1\": 50.0, \"measurement2\": 1.3 }\n                );\n                const inputEnvelope: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    baseType: ExceptionDataType,\n                    baseData: bd,\n                    data: {\n                        \"property3\": \"val3\",\n                        \"measurement3\": 3.0\n                    },\n                    ext: {\n                        \"trace\": {\n                            \"traceID\": \"1528B5FF-6455-4657-BE77-E6664CAC72DC\",\n                            \"parentID\": \"1528B5FF-6455-4657-BE77-E6664CACEEEE\",\n                            \"name\": excessiveName\n                        }\n                    },\n                    tags: [\n                        {\"user.accountId\": \"TestAccountId\"},\n                    ],\n                };\n\n                // Act\n                const appInsightsEnvelope = Sender.constructEnvelope(inputEnvelope, this._instrumentationKey, null);\n                const baseData = appInsightsEnvelope.data.baseData; \n\n                QUnit.assert.equal(\"val3\", baseData.properties[\"property3\"], \"ExceptionData: customProperties (item.data) are added to the properties of the envelope and not included in the item.data\")\n                QUnit.assert.equal(\"val1\", baseData.properties[\"property1\"], \"ExceptionData: properties (item.baseData.properties) are added to telemetry envelope\");\n                QUnit.assert.equal(50.0, baseData.measurements[\"measurement1\"], \"ExceptionData: measurements (item.baseData.measurements) are added to telemetry envelope\");\n                QUnit.assert.equal(1024, appInsightsEnvelope.tags[\"ai.operation.name\"].length, \"The ai.operation.name should have been truncated to the maximum\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush method handles synchronous callback execution\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                this._sender.initialize({\n                    instrumentationKey: 'abc',\n                    endpointUrl: 'https://example.com',\n                    isBeaconApiDisabled: true\n                }, core, []);\n                this.onDone(() => {\n                    this._sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'test item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                // Add some telemetry to flush\n                this._sender.processTelemetry(telemetryItem);\n\n                // Test sync flush with callback\n                let callbackCalled = false;\n                let callbackResult: boolean;\n                const result = this._sender.flush(false, (success) => {\n                    callbackCalled = true;\n                    callbackResult = success;\n                });\n\n                QUnit.assert.equal(typeof result, 'boolean', \"flush should return boolean when callback provided\");\n                QUnit.assert.equal(result, true, \"flush should return true when callback will be called\");\n                QUnit.assert.equal(callbackCalled, true, \"callback should be called synchronously\");\n                QUnit.assert.equal(callbackResult, true, \"callback should receive success=true\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush method handles asynchronous callback execution without callback\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                this._sender.initialize({\n                    instrumentationKey: 'abc',\n                    endpointUrl: 'https://example.com',\n                    isBeaconApiDisabled: true\n                }, core, []);\n                this.onDone(() => {\n                    this._sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'test item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                // Add some telemetry to flush\n                this._sender.processTelemetry(telemetryItem);\n\n                // Test async flush without callback - should return promise-like\n                const result = this._sender.flush(true);\n                \n                // Check if result is promise-like (has then method)\n                QUnit.assert.ok(isPromiseLike(result), \"flush should return promise-like object when async=true and no callback\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush method handles asynchronous callback execution with callback\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                this._sender.initialize({\n                    instrumentationKey: 'abc',\n                    endpointUrl: 'https://example.com',\n                    isBeaconApiDisabled: true\n                }, core, []);\n                this.onDone(() => {\n                    this._sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'test item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                // Add some telemetry to flush\n                this._sender.processTelemetry(telemetryItem);\n\n                // Test async flush with callback\n                let callbackCalled = false;\n                let callbackResult: boolean;\n                const result = this._sender.flush(true, (success) => {\n                    callbackCalled = true;\n                    callbackResult = success;\n                });\n\n                QUnit.assert.equal(typeof result, 'boolean', \"flush should return boolean when callback provided\");\n                QUnit.assert.equal(result, true, \"flush should return true when callback will be called\");\n                QUnit.assert.equal(callbackCalled, true, \"callback should be called synchronously even when async=true\");\n                QUnit.assert.equal(callbackResult, true, \"callback should receive success=true\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush method returns correct boolean result for sync operation\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                this._sender.initialize({\n                    instrumentationKey: 'abc',\n                    endpointUrl: 'https://example.com',\n                    isBeaconApiDisabled: true\n                }, core, []);\n                this.onDone(() => {\n                    this._sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'test item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                // Add some telemetry to flush\n                this._sender.processTelemetry(telemetryItem);\n\n                // Test sync flush without callback - should return undefined/void\n                const result = this._sender.flush(false);\n                \n                QUnit.assert.ok(isUndefined(result), \"flush should return undefined when sync=true and no callback\");\n            }\n        });\n\n        this.testCase({\n            name: \"flush method handles paused state correctly\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                this._sender.initialize({\n                    instrumentationKey: 'abc',\n                    endpointUrl: 'https://example.com',\n                    isBeaconApiDisabled: true\n                }, core, []);\n                this.onDone(() => {\n                    this._sender.teardown();\n                });\n\n                const telemetryItem: ITelemetryItem = {\n                    name: 'test item',\n                    iKey: 'iKey',\n                    baseType: 'some type',\n                    baseData: {}\n                };\n\n                // Add some telemetry to flush\n                this._sender.processTelemetry(telemetryItem);\n\n                // Pause the sender\n                this._sender.pause();\n\n                // Test flush when paused - should return undefined\n                const result = this._sender.flush(true);\n                \n                QUnit.assert.ok(isUndefined(result), \"flush should return undefined when sender is paused\");\n            }\n        });\n    }\n}\n\nclass AutoCompleteXhrOverride {\n    public sendPOST(payload: IPayloadData, oncomplete: (status: number, headers: { [headerName: string]: string }) => void, sync?: boolean) {\n        oncomplete(200, null);\n    }\n}"
  },
  {
    "path": "channels/applicationinsights-channel-js/Tests/Unit/src/StatsBeat.tests.ts",
    "content": "// import { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\n// import { AppInsightsCore, createStatsMgr, eStatsType, FeatureOptInMode, getWindow, IPayloadData, IStatsBeatState, IStatsMgr, ITelemetryItem, IUnloadHook, TransportType } from \"@microsoft/applicationinsights-core-js\";\n// import { Sender } from \"../../../src/Sender\";\n// import { SinonSpy, SinonStub } from \"sinon\";\n// import { ISenderConfig } from \"../../../types/applicationinsights-channel-js\";\n// import { isBeaconsSupported } from \"@microsoft/applicationinsights-core-js\";\n\n// export class StatsbeatTests extends AITestClass {\n//     private _core: AppInsightsCore;\n//     private _sender: Sender;\n//     private _statsMgr: IStatsMgr;\n//     private _statsMgrUnloadHook: IUnloadHook | null;\n//     private statsbeatCountSpy: SinonSpy;\n//     private fetchStub: sinon.SinonStub;\n//     private beaconStub: sinon.SinonStub;\n//     private trackSpy: SinonSpy;\n\n//     public testInitialize() {\n//         this._core = new AppInsightsCore();\n//         this._sender = new Sender();\n//         this._statsMgr = createStatsMgr();\n//     }\n\n//     public testFinishedCleanup() {\n//         if (this._sender && this._sender.isInitialized()) {\n//             this._sender.pause();\n//             this._sender._buffer.clear();\n//             this._sender.teardown();\n//         }\n//         this._sender = null;\n//         this._core = null;\n//         this._statsMgr = null;\n//         if (this._statsMgrUnloadHook) {\n//             this._statsMgrUnloadHook.rm();\n//             this._statsMgrUnloadHook = null;\n//         }\n//         if (this.statsbeatCountSpy) {\n//             this.statsbeatCountSpy.restore();\n//         }\n//         if (this.fetchStub) {\n//             this.fetchStub.restore();\n//         }\n//         if (this.beaconStub) {\n//             this.beaconStub.restore();\n//         }\n//         if (this.trackSpy) {\n//             this.trackSpy.restore();\n//         }\n//     }\n\n//     private initializeCoreAndSender(config: any, instrumentationKey: string) {\n//         const sender = new Sender();\n//         const core = new AppInsightsCore();\n//         const coreConfig = {\n//             instrumentationKey,\n//             _sdk: { \n//                 stats: {\n//                     shrtInt: 900,\n//                     endCfg: [\n//                         { \n//                             type: 0,\n//                             keyMap: [\n//                                 {\n//                                     key: \"stats-key1\",\n//                                     match: [ \"https://example.endpoint.com\" ]\n//                                 }\n//                             ]\n//                         }\n//                     ]\n//                 }\n//             },\n//             extensionConfig: { [sender.identifier]: config }\n//         };\n\n//         let statsMgr = createStatsMgr();\n//         // Initialize\n//         let unloadHook = statsMgr.init(this._core, {\n//             feature: \"StatsBeat\",\n//             getCfg: (core, cfg) => {\n//                 return cfg?._sdk?.stats;\n//             }\n//         });\n        \n//         core.initialize(coreConfig, [sender]);\n//         core.setStatsMgr(statsMgr);\n\n//         this.statsbeatCountSpy = this.sandbox.spy(core.getStatsBeat(), \"count\");\n//         this.trackSpy = this.sandbox.spy(core, \"track\");\n\n//         this.onDone(() => {\n//             sender.teardown();\n//         });\n\n//         return { core, sender, statsMgr, unloadHook };\n//     }\n\n//     private createSenderConfig(transportType: TransportType) {\n//         return {\n//             endpointUrl: \"https://test\",\n//             emitLineDelimitedJson: false,\n//             maxBatchInterval: 15000,\n//             maxBatchSizeInBytes: 102400,\n//             disableTelemetry: false,\n//             enableSessionStorageBuffer: true,\n//             isRetryDisabled: false,\n//             isBeaconApiDisabled: false,\n//             disableXhr: false,\n//             onunloadDisableFetch: false,\n//             onunloadDisableBeacon: false,\n//             namePrefix: \"\",\n//             samplingPercentage: 100,\n//             customHeaders: [{ header: \"header\", value: \"val\" }],\n//             convertUndefined: \"\",\n//             eventsLimitInMem: 10000,\n//             transports: [transportType]\n//         };\n//     }\n\n//     private processTelemetryAndFlush(sender: Sender, telemetryItem: ITelemetryItem) {\n//         try {\n//             sender.processTelemetry(telemetryItem, null);\n//             sender.flush();\n//         } catch (e) {\n//             QUnit.assert.ok(false, \"Unexpected error during telemetry processing\");\n//         }\n//         this.clock.tick(900000); // Simulate time passing for statsbeat to be sent\n//     }\n\n//     private assertStatsbeatCall(statusCode: number, eventName: string) {\n//         Assert.equal(this.statsbeatCountSpy.callCount, 1, \"Statsbeat count should be called once\");\n//         Assert.equal(this.statsbeatCountSpy.firstCall.args[0], statusCode, `Statsbeat count should be called with status ${statusCode}`);\n//         const data = JSON.stringify(this.statsbeatCountSpy.firstCall.args[1]);\n//         Assert.ok(data.includes(\"startTime\"), \"Statsbeat count should be called with startTime set\");\n//         const statsbeatEvent = this.trackSpy.firstCall.args[0];\n//         Assert.equal(statsbeatEvent.baseType, \"MetricData\", \"Statsbeat event should be of type MetricData\");\n//         Assert.equal(statsbeatEvent.baseData.name, eventName, `Statsbeat event should be of type ${eventName}`);\n//     }\n\n//     public registerTests() {\n//         this.testCase({\n//             name: \"Statsbeat initializes when stats is true\",\n//             test: () => {\n//                 const config = {\n//                     instrumentationKey: \"Test-iKey\",\n//                     featureOptIn: {\n//                         \"StatsBeat\": {\n//                             mode: FeatureOptInMode.enable\n//                         }\n//                     },\n//                     _sdk: { \n//                         stats: {\n//                             shrtInt: 900,\n//                             endCfg: [\n//                                 { \n//                                     type: 0,\n//                                     keyMap: [\n//                                         {\n//                                             key: \"stats-key1\",\n//                                             match: [ \"https://example.endpoint.com\" ]\n//                                         }\n//                                     ]\n//                                 }\n//                             ]\n//                         }\n//                     },\n//                 };\n\n//                 this._core.initialize(config, [this._sender]);\n//                 this._statsMgrUnloadHook = this._statsMgr.init(this._core, {\n//                     feature: \"StatsBeat\",\n//                     getCfg: (core, cfg) => {\n//                         return cfg?._sdk?.stats;\n//                     }\n//                 });\n//                 let statsBeatState: IStatsBeatState = {\n//                     cKey: \"Test-iKey\",\n//                     endpoint: \"https://example.endpoint.com\",\n//                     sdkVer: \"1.0.0\",\n//                     type: eStatsType.SDK\n//                 };   \n\n//                 const statsbeat = this._core.getStatsBeat(statsBeatState);\n\n//                 QUnit.assert.ok(statsbeat, \"Statsbeat is initialized\");\n//                 QUnit.assert.ok(statsbeat.enabled, \"Statsbeat is marked as initialized\");\n//             }\n//         });\n\n//         this.testCaseAsync({\n//             name: \"Statsbeat increments success count when fetch sender is called once\",\n//             useFakeTimers: true,\n//             useFakeServer: true,\n//             stepDelay: 100,\n//             steps: [\n//                 () => {\n//                     this.fetchStub = this.sandbox.stub(window, \"fetch\").callsFake(() => { // only fetch is supported to stub, why?\n//                         return Promise.resolve(new Response(\"{}\", { status: 200, statusText: \"OK\" }));\n//                     });\n\n//                     const config = this.createSenderConfig(TransportType.Fetch);\n//                     const { sender } = this.initializeCoreAndSender(config, \"000e0000-e000-0000-a000-000000000000\");\n\n//                     const telemetryItem: ITelemetryItem = {\n//                         name: \"fake item\",\n//                         iKey: \"testIkey2;ingestionendpoint=testUrl1\",\n//                         baseType: \"some type\",\n//                         baseData: {}\n//                     };\n\n//                     this.processTelemetryAndFlush(sender, telemetryItem);\n                    \n//                 }\n//             ].concat(PollingAssert.createPollingAssert(() => {\n//                 if (this.statsbeatCountSpy.called && this.fetchStub.called) {\n//                     this.assertStatsbeatCall(200, \"Request_Success_Count\");\n//                     return true;\n//                 }\n//                 return false;\n//             }, \"Waiting for fetch sender and Statsbeat count to be called\") as any)\n//         });\n\n//         this.testCaseAsync({\n//             name: \"Statsbeat increments throttle count when fetch sender is called with status 439\",\n//             useFakeTimers: true,\n//             stepDelay: 100,\n//             steps: [\n//                 () => {\n//                     this.fetchStub = this.sandbox.stub(window, \"fetch\").callsFake(() => {\n//                         return Promise.resolve(new Response(\"{}\", { status: 439, statusText: \"Too Many Requests\" }));\n//                     });\n\n//                     const config = this.createSenderConfig(TransportType.Fetch);\n//                     const { sender } = this.initializeCoreAndSender(config, \"000e0000-e000-0000-a000-000000000000\");\n\n//                     const telemetryItem: ITelemetryItem = {\n//                         name: \"fake item\",\n//                         iKey: \"testIkey2;ingestionendpoint=testUrl1\",\n//                         baseType: \"some type\",\n//                         baseData: {}\n//                     };\n\n//                     this.processTelemetryAndFlush(sender, telemetryItem);\n//                 }\n//             ].concat(PollingAssert.createPollingAssert(() => {\n//                 if (this.statsbeatCountSpy.called && this.fetchStub.called) {\n//                     this.assertStatsbeatCall(439, \"Throttle_Count\");\n//                     return true;\n//                 }\n//                 return false;\n//             }, \"Waiting for fetch sender and Statsbeat count to be called\") as any)\n//         });\n\n//         this.testCaseAsync({\n//             name: \"Statsbeat increments success count for beacon sender\",\n//             useFakeTimers: true,\n//             stepDelay: 100,\n//             steps: [\n//                 () => {\n//                     const config = this.createSenderConfig(TransportType.Beacon);\n//                     const { sender } = this.initializeCoreAndSender(config, \"000e0000-e000-0000-a000-000000000000\");\n\n//                     const telemetryItem: ITelemetryItem = {\n//                         name: \"fake item\",\n//                         iKey: \"testIkey2;ingestionendpoint=testUrl1\",\n//                         baseType: \"some type\",\n//                         baseData: {}\n//                     };\n//                     let sendBeaconCalled = false;\n//                     this.hookSendBeacon((url: string) => {\n//                         sendBeaconCalled = true;\n//                         return true;\n//                     });\n//                     QUnit.assert.ok(isBeaconsSupported(), \"Beacon API is supported\");\n//                     this.processTelemetryAndFlush(sender, telemetryItem);\n//                 }\n//             ].concat(PollingAssert.createPollingAssert(() => {\n//                 if (this.statsbeatCountSpy.called) {\n//                     this.assertStatsbeatCall(200, \"Request_Success_Count\");\n//                     return true;\n//                 }\n//                 return false;\n//             }, \"Waiting for beacon sender and Statsbeat count to be called\") as any)\n//         });\n    \n\n//     this.testCaseAsync({\n//         name: \"Statsbeat increments success count for xhr sender\",\n//         useFakeTimers: true,\n//         useFakeServer: true,\n//         stepDelay: 100,\n//         fakeServerAutoRespond: true,\n//         steps: [\n//             () => {\n//                 let window = getWindow();\n//                 let fakeXMLHttpRequest = (window as any).XMLHttpRequest; // why we do this?\n//                 let config = this.createSenderConfig(TransportType.Xhr) && {disableSendBeaconSplit: true};\n//                 const { sender } = this.initializeCoreAndSender(config, \"000e0000-e000-0000-a000-000000000000\");\n//                 console.log(\"xhr sender called\", this._getXhrRequests().length);\n\n//                 const telemetryItem: ITelemetryItem = {\n//                     name: \"fake item\",\n//                     iKey: \"testIkey2;ingestionendpoint=testUrl1\",\n//                     baseType: \"some type\",\n//                     baseData: {}\n//                 };\n//                 this.processTelemetryAndFlush(sender, telemetryItem);\n//                 QUnit.assert.equal(1, this._getXhrRequests().length, \"xhr sender is called\");\n//                 console.log(\"xhr sender is called\", this._getXhrRequests().length);\n//                 (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n\n//             }\n//         ].concat(PollingAssert.createPollingAssert(() => {\n//             if (this.statsbeatCountSpy.called) {\n//                 this.assertStatsbeatCall(200, \"Request_Success_Count\");\n//                 console.log(\"Statsbeat count called with success count for xhr sender\");\n//                 return true;\n//             }\n//             return false;\n//         }, \"Waiting for xhr sender and Statsbeat count to be called\", 60, 1000) as any)\n//     });\n// }\n// }"
  },
  {
    "path": "channels/applicationinsights-channel-js/Tests/Unit/src/aichannel.tests.ts",
    "content": "﻿import { SenderTests } from \"./Sender.tests\";\nimport { SampleTests } from \"./Sample.tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\n// import { StatsbeatTests } from \"./StatsBeat.tests\";\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new SenderTests().registerTests();\n    new SampleTests().registerTests();\n    // new StatsbeatTests().registerTests();\n}"
  },
  {
    "path": "channels/applicationinsights-channel-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript API</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <!-- <script src=\"../../../common/Tests/External/sinon-7.3.1.js\"></script> -->\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                sinon: \"../../common/Tests/External/sinon-7.3.1\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"sinon\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/aichannel.tests\", \"./Unit/dist/aichannel.tests.js\");\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "channels/applicationinsights-channel-js/Tests/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": false,\n    \"module\": \"amd\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"declaration\": true\n  },\n  \"include\": [\n  ],\n  \"exclude\": [\n      \"node_modules/\"\n  ]\n}"
  },
  {
    "path": "channels/applicationinsights-channel-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-channel-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "channels/applicationinsights-channel-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-channel-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK Channel\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-channel-js.js\",\n    \"module\": \"dist-es5/applicationinsights-channel-js.js\",\n    \"types\": \"types/applicationinsights-channel-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/channels/applicationinsights-channel-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt aichannel\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt aichanneltest\",\n        \"mintest\": \"grunt aichannel-mintest\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights JavaScript SDK Channel\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt aichannel-min\",\n        \"ai-restore\": \"grunt aichannel-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@types/sinon\": \"4.3.3\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"sinon\": \"^7.3.1\",\n        \"typedoc\": \"^0.26.6\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"applicationinsights-channel-js\";\nconst browserOutputName = \"applicationinsights-channel-js\";\nconst entryPointName = \"applicationinsights-channel-js\";\nconst outputName = \"applicationinsights-channel-js\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Channel, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ \"applicationinsights-channel-js\" ]\n);\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/EnvelopeCreator.ts",
    "content": "import {\n    AIData, CtxTagKeys, Envelope, Event, EventDataType, EventEnvelopeType, Exception, ExceptionDataType, ExceptionEnvelopeType, HttpMethod,\n    IDependencyTelemetry, IDiagnosticLogger, IEnvelope, IExceptionInternal, IPageViewPerformanceTelemetry, IPageViewTelemetryInternal,\n    IRemoteDependencyData, IRequestTelemetry, ISerializable, ITelemetryItem, IWeb, Metric, MetricDataType, MetricEnvelopeType, PageView,\n    PageViewDataType, PageViewEnvelopeType, PageViewPerformance, PageViewPerformanceDataType, PageViewPerformanceEnvelopeType,\n    RemoteDependencyDataType, RequestDataType, SampleRate, Tags, Trace, TraceDataType, TraceEnvelopeType, _eInternalMessageId,\n    _throwInternal, _warnToConsole, dataSanitizeString, eLoggingSeverity, getJSON, hasJSON, isDate, isNullOrUndefined, isNumber, isString,\n    isTruthy, objForEachKey, optimizeObject, setValue, toISOString\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IRequestData } from \"./Interfaces/Contracts/IRequestData\";\nimport { STR_DURATION } from \"./InternalConstants\";\nimport { _createData } from \"./Telemetry/Common/Data\";\nimport { RemoteDependencyEnvelopeType, createRemoteDependencyData } from \"./Telemetry/RemoteDependencyData\";\nimport { RequestEnvelopeType, createRequestData } from \"./Telemetry/RequestData\";\n\n// these two constants are used to filter out properties not needed when trying to extract custom properties and measurements from the incoming payload\nconst strBaseType = \"baseType\";\nconst strBaseData = \"baseData\";\nconst strProperties = \"properties\";\nconst strTrue = \"true\";\n\nfunction _setValueIf<T>(target:T, field:keyof T, value:any) {\n    return setValue(target, field, value, isTruthy);\n}\n\n/*\n * Maps Part A data from CS 4.0\n */\nfunction _extractPartAExtensions(logger: IDiagnosticLogger, item: ITelemetryItem, env: IEnvelope) {\n    // todo: switch to keys from common in this method\n    let envTags = env.tags = env.tags || {};\n    let itmExt = item.ext = item.ext || {};\n    let itmTags = item.tags = item.tags || {} as Tags;\n\n    let extUser = itmExt.user;\n    if (extUser) {\n        _setValueIf(envTags, CtxTagKeys.userAuthUserId, extUser.authId);\n        _setValueIf(envTags, CtxTagKeys.userId, extUser.id || extUser.localId);\n    }\n\n    let extApp = itmExt.app;\n    if (extApp) {\n        _setValueIf(envTags, CtxTagKeys.sessionId, extApp.sesId);\n    }\n\n    let extDevice = itmExt.device;\n    if (extDevice) {\n        _setValueIf(envTags, CtxTagKeys.deviceId, extDevice.id || extDevice.localId);\n        _setValueIf(envTags, CtxTagKeys.deviceType, extDevice.deviceClass);\n        _setValueIf(envTags, CtxTagKeys.deviceIp, extDevice.ip);\n        _setValueIf(envTags, CtxTagKeys.deviceModel, extDevice.model);\n        _setValueIf(envTags, CtxTagKeys.deviceType, extDevice.deviceType);\n    }\n\n    const web: IWeb = item.ext.web as IWeb;\n    if (web) {\n        _setValueIf(envTags, CtxTagKeys.deviceLanguage, web.browserLang);\n        _setValueIf(envTags, CtxTagKeys.deviceBrowserVersion, web.browserVer);\n        _setValueIf(envTags, CtxTagKeys.deviceBrowser, web.browser);\n\n        let envData = env.data = env.data || {};\n        let envBaseData = envData[strBaseData] = envData[strBaseData] || {};\n        let envProps = envBaseData[strProperties] = envBaseData[strProperties] || {};\n\n        _setValueIf(envProps, \"domain\", web.domain);\n        _setValueIf(envProps, \"isManual\", web.isManual ? strTrue : null);\n        _setValueIf(envProps, \"screenRes\", web.screenRes);\n        _setValueIf(envProps, \"userConsent\", web.userConsent ? strTrue : null);\n    }\n\n    let extOs = itmExt.os;\n    if (extOs) {\n        _setValueIf(envTags, CtxTagKeys.deviceOS, extOs.name);\n        _setValueIf(envTags, CtxTagKeys.deviceOSVersion, extOs.osVer);\n    }\n\n    // No support for mapping Trace.traceState to 2.0 as it is currently empty\n\n    let extTrace = itmExt.trace;\n    if (extTrace) {\n        _setValueIf(envTags, CtxTagKeys.operationParentId, extTrace.parentID);\n        _setValueIf(envTags, CtxTagKeys.operationName, dataSanitizeString(logger, extTrace.name));\n        _setValueIf(envTags, CtxTagKeys.operationId, extTrace.traceID);\n    }\n\n    // Sample 4.0 schema\n    //  {\n    //     \"time\" : \"2018-09-05T22:51:22.4936Z\",\n    //     \"name\" : \"MetricWithNamespace\",\n    //     \"iKey\" : \"ABC-5a4cbd20-e601-4ef5-a3c6-5d6577e4398e\",\n    //     \"ext\": {  \"cloud\": {\n    //          \"role\": \"WATSON3\",\n    //          \"roleInstance\": \"CO4AEAP00000260\"\n    //      },\n    //      \"device\": {}, \"correlation\": {} },\n    //      \"tags\": [\n    //        { \"amazon.region\" : \"east2\" },\n    //        { \"os.expid\" : \"wp:02df239\" }\n    //     ]\n    //   }\n\n    const tgs: Tags = {};\n    // deals with tags.push({object})\n    for(let i = itmTags.length - 1; i >= 0; i--){\n        const tg = itmTags[i];\n        objForEachKey(tg, (key, value) => {\n            tgs[key] = value;\n        });\n\n        itmTags.splice(i, 1);\n    }\n\n    // deals with tags[key]=value (and handles hasOwnProperty)\n    objForEachKey(itmTags, (tg, value) => {\n        tgs[tg] = value;\n    });\n\n    let theTags = { ...envTags, ...tgs };\n    if(!theTags[CtxTagKeys.internalSdkVersion]) {\n        // Append a version in case it is not already set\n        theTags[CtxTagKeys.internalSdkVersion] = dataSanitizeString(logger, `javascript:${EnvelopeCreator.Version}`, 64);\n    }\n    \n    env.tags = optimizeObject(theTags);\n}\n\nfunction _extractPropsAndMeasurements(data: { [key: string]: any }, properties: { [key: string]: any }, measurements: { [key: string]: any }) {\n    if (!isNullOrUndefined(data)) {\n        objForEachKey(data, (key, value) => {\n            if (isNumber(value)) {\n                measurements[key] = value;\n            } else if (isString(value)) {\n                properties[key] = value;\n            } else if (hasJSON()) {\n                properties[key] = getJSON().stringify(value);\n            }\n        });\n    }\n}\n\nfunction _convertPropsUndefinedToCustomDefinedValue(properties: { [key: string]: any }, customUndefinedValue: any) {\n    if (!isNullOrUndefined(properties)) {\n        objForEachKey(properties, (key, value) => {\n            properties[key] = value || customUndefinedValue;\n        });\n    }\n}\n\n// TODO: Do we want this to take logger as arg or use this._logger as nonstatic?\nfunction _createEnvelope<T>(logger: IDiagnosticLogger, envelopeType: string, telemetryItem: ITelemetryItem, data: AIData<T>): IEnvelope {\n    const envelope = new Envelope(logger, data, envelopeType);\n\n    _setValueIf(envelope, \"sampleRate\", (telemetryItem as any)[SampleRate]);\n\n    let startTime = (telemetryItem[strBaseData] || {}).startTime;\n    if (isDate(startTime)) {\n        // Starting from Version 3.0.3, the time property will be assigned by the startTime value,\n        // which records the loadEvent time for the pageView event.\n        envelope.time = toISOString(startTime);\n    }\n\n    envelope.iKey = telemetryItem.iKey;\n    const iKeyNoDashes = telemetryItem.iKey.replace(/-/g, \"\");\n    envelope.name = envelope.name.replace(\"{0}\", iKeyNoDashes);\n\n    // extract all extensions from ctx\n    _extractPartAExtensions(logger, telemetryItem, envelope);\n\n    // loop through the envelope tags (extension of Part A) and pick out the ones that should go in outgoing envelope tags\n    telemetryItem.tags = telemetryItem.tags || [];\n\n    return optimizeObject(envelope);\n}\n\nfunction EnvelopeCreatorInit(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem) {\n    if (isNullOrUndefined(telemetryItem[strBaseData])) {\n        _throwInternal(logger,\n            eLoggingSeverity.CRITICAL,\n            _eInternalMessageId.TelemetryEnvelopeInvalid, \"telemetryItem.baseData cannot be null.\");\n    }\n}\n\nexport const EnvelopeCreator = {\n    Version: \"#version#\"\n};\n\nexport function DependencyEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    const customMeasurements = telemetryItem[strBaseData].measurements || {};\n    const customProperties = telemetryItem[strBaseData][strProperties] || {};\n    _extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    const bd = telemetryItem[strBaseData] as IDependencyTelemetry;\n    if (isNullOrUndefined(bd)) {\n        _warnToConsole(logger, \"Invalid input for dependency data\");\n        return null;\n    }\n\n    const method = bd[strProperties] && bd[strProperties][HttpMethod] ? bd[strProperties][HttpMethod] : \"GET\";\n    const remoteDepData = createRemoteDependencyData(logger, bd.id, bd.target, bd.name, bd.duration, bd.success, bd.responseCode, method, bd.type, bd.correlationContext, customProperties, customMeasurements);\n    const data = _createData<IRemoteDependencyData>(RemoteDependencyDataType, remoteDepData);\n    return _createEnvelope<IRemoteDependencyData>(logger, RemoteDependencyEnvelopeType, telemetryItem, data);\n}\n\nexport function RequestEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    const customMeasurements = telemetryItem[strBaseData].measurements || {};\n    const customProperties = telemetryItem[strBaseData][strProperties] || {};\n    _extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    const bd = telemetryItem[strBaseData] as IRequestTelemetry;\n    const requestData = createRequestData(logger, bd.id, bd.name, bd.duration, bd.success, bd.responseCode, bd.source, bd.url, customProperties, customMeasurements);\n    const data = _createData<IRequestData & ISerializable>(RequestDataType, requestData);\n    return _createEnvelope<IRequestData & ISerializable>(logger, RequestEnvelopeType, telemetryItem, data);\n}\n\n\nexport function EventEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    let customProperties = {} as { [key: string]: any };\n    let customMeasurements = {};\n    if (telemetryItem[strBaseType] !== EventDataType) {\n        (customProperties as any)[\"baseTypeSource\"] = telemetryItem[strBaseType]; // save the passed in base type as a property\n    }\n\n    if (telemetryItem[strBaseType] === EventDataType) { // take collection\n        customProperties = telemetryItem[strBaseData][strProperties] || {};\n        customMeasurements = telemetryItem[strBaseData].measurements || {};\n    } else { // if its not a known type, convert to custom event\n        if (telemetryItem[strBaseData]) {\n            _extractPropsAndMeasurements(telemetryItem[strBaseData], customProperties, customMeasurements);\n        }\n    }\n\n    // Extract root level properties from part C telemetryItem.data\n    _extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    const eventName = telemetryItem[strBaseData].name;\n    const eventData = new Event(logger, eventName, customProperties, customMeasurements);\n    const data = _createData<Event>(EventDataType, eventData);\n    return _createEnvelope<Event>(logger, EventEnvelopeType, telemetryItem, data);\n}\n\nexport function ExceptionEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    // Extract root level properties from part C telemetryItem.data\n    const customMeasurements = telemetryItem[strBaseData].measurements || {};\n    const customProperties = telemetryItem[strBaseData][strProperties] || {};\n    _extractPropsAndMeasurements(telemetryItem.data, customProperties, customMeasurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(customProperties, customUndefinedValue);\n    }\n    const bd = telemetryItem[strBaseData] as IExceptionInternal;\n    const exData = Exception.CreateFromInterface(logger, bd, customProperties, customMeasurements);\n    const data = _createData<Exception>(ExceptionDataType, exData);\n    return _createEnvelope<Exception>(logger, ExceptionEnvelopeType, telemetryItem, data);\n}\n\nexport function MetricEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    const baseData = telemetryItem[strBaseData];\n    const props = baseData[strProperties] || {};\n    const measurements = baseData.measurements || {};\n    _extractPropsAndMeasurements(telemetryItem.data, props, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n    }\n    const baseMetricData = new Metric(logger, baseData.name, baseData.average, baseData.sampleCount, baseData.min, baseData.max, baseData.stdDev, props, measurements);\n    const data = _createData<Metric>(MetricDataType, baseMetricData);\n    return _createEnvelope<Metric>(logger, MetricEnvelopeType, telemetryItem, data);\n}\n\nexport function PageViewEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    // Since duration is not part of the domain properties in Common Schema, extract it from part C\n    let duration;\n    let baseData = telemetryItem[strBaseData];\n    if (!isNullOrUndefined(baseData) &&\n        !isNullOrUndefined(baseData[strProperties]) &&\n        !isNullOrUndefined(baseData[strProperties][STR_DURATION])) { // from part B properties\n        duration = baseData[strProperties][STR_DURATION];\n        delete baseData[strProperties][STR_DURATION];\n    } else if (!isNullOrUndefined(telemetryItem.data) &&\n        !isNullOrUndefined(telemetryItem.data[STR_DURATION])) { // from custom properties\n        duration = telemetryItem.data[STR_DURATION];\n        delete telemetryItem.data[STR_DURATION];\n    }\n\n    const bd = telemetryItem[strBaseData] as IPageViewTelemetryInternal;\n\n    // special case: pageview.id is grabbed from current operation id. Analytics plugin is decoupled from properties plugin, so this is done here instead. This can be made a default telemetry intializer instead if needed to be decoupled from channel\n    let currentContextId;\n    if (((telemetryItem.ext || {}).trace || {}).traceID) {\n        currentContextId = telemetryItem.ext.trace.traceID;\n    }\n    const id = bd.id || currentContextId;\n    const name = bd.name;\n    const url = bd.uri;\n    const properties = bd[strProperties] || {};\n    const measurements = bd.measurements || {};\n\n    // refUri is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n    if (!isNullOrUndefined(bd.refUri)) {\n        properties[\"refUri\"] = bd.refUri;\n    }\n\n    // pageType is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n    if (!isNullOrUndefined(bd.pageType)) {\n        properties[\"pageType\"] = bd.pageType;\n    }\n\n    // isLoggedIn is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n    if (!isNullOrUndefined(bd.isLoggedIn)) {\n        properties[\"isLoggedIn\"] = bd.isLoggedIn.toString();\n    }\n\n    // pageTags is a field that Breeze still does not recognize as part of Part B. For now, put it in Part C until it supports it as a domain property\n    if (!isNullOrUndefined(bd[strProperties])) {\n        const pageTags = bd[strProperties];\n        objForEachKey(pageTags, (key, value) => {\n            properties[key] = value;\n        });\n    }\n\n    _extractPropsAndMeasurements(telemetryItem.data, properties, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n    }\n    const pageViewData = new PageView(logger, name, url, duration, properties, measurements, id);\n    const data = _createData<PageView>(PageViewDataType, pageViewData);\n    return _createEnvelope<PageView>(logger, PageViewEnvelopeType, telemetryItem, data);\n}\n\nexport function PageViewPerformanceEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    const bd = telemetryItem[strBaseData] as IPageViewPerformanceTelemetry;\n    const name = bd.name;\n    const url = bd.uri || (bd as any).url;\n    const properties = bd[strProperties] || {};\n    const measurements = bd.measurements || {};\n    _extractPropsAndMeasurements(telemetryItem.data, properties, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(properties, customUndefinedValue);\n    }\n    const baseData = new PageViewPerformance(logger, name, url, undefined, properties, measurements, bd);\n    const data = _createData<PageViewPerformance>(PageViewPerformanceDataType, baseData);\n    return _createEnvelope<PageViewPerformance>(logger, PageViewPerformanceEnvelopeType, telemetryItem, data);\n}\n\nexport function TraceEnvelopeCreator(logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any): IEnvelope {\n    EnvelopeCreatorInit(logger, telemetryItem);\n\n    const message = telemetryItem[strBaseData].message;\n    const severityLevel = telemetryItem[strBaseData].severityLevel;\n    const props = telemetryItem[strBaseData][strProperties] || {};\n    const measurements = telemetryItem[strBaseData].measurements || {};\n    _extractPropsAndMeasurements(telemetryItem.data, props, measurements);\n    if (!isNullOrUndefined(customUndefinedValue)) {\n        _convertPropsUndefinedToCustomDefinedValue(props, customUndefinedValue);\n    }\n    const baseData = new Trace(logger, message, severityLevel, props, measurements);\n    const data = _createData<Trace>(TraceDataType, baseData);\n    return _createEnvelope<Trace>(logger, TraceEnvelopeType, telemetryItem, data);\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/Interfaces/Contracts/IRequestData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDomain } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * This interface indentifies the serialized request data contract that is sent to Application Insights backend\n */\nexport interface IRequestData extends IDomain {\n\n    /**\n     * Schema version\n     */\n    ver: number; /* 2 */\n\n    /**\n     * Identifier of a request call instance. Used for correlation between request and other telemetry items.\n     */\n    id: string;\n\n    /**\n     * Name of the request. Represents code path taken to process request. Low cardinality value to allow better grouping of requests. For HTTP requests it represents the HTTP method and URL path template like 'GET /values/\\{id\\}'.\n     */\n    name?: string;\n\n    /**\n     * Request duration in format: DD.HH:MM:SS.MMMMMM. Must be less than 1000 days.\n     */\n    duration: string;\n\n    /**\n     * Indication of successful or unsuccessful call.\n     */\n    success: boolean;\n\n    /**\n     * Result of a request execution. HTTP status code for HTTP requests.\n     */\n    responseCode?: string;\n\n    /**\n     * Source of the request. Examples are the instrumentation key of the caller or the ip address of the caller.\n     */\n    source?: string;\n\n    /**\n     * Request URL with all query string parameters.\n     */\n    url?: string;\n\n    /**\n     * Collection of custom properties.\n     */\n    properties?: { [propertyName: string]: string }; /* \\{\\} */\n\n    /**\n     * Collection of custom measurements.\n     */\n    measurements?: { [propertyName: string]: number }; /* \\{\\} */\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/Interfaces.ts",
    "content": "import { IStorageBuffer, IXHROverride } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Internal interface for sendBuffer, do not export it\n * @internal\n * @since 3.1.3\n */\nexport interface IInternalStorageItem {\n    /**\n     * serialized telemetry to be stored.\n     */\n    item: string;\n    /**\n     * total retry count\n     */\n    cnt?: number;\n}\n\nexport interface ISenderConfig {\n    /**\n     * The url to which payloads will be sent\n     */\n    endpointUrl: string;\n\n   /**\n    * The JSON format (normal vs line delimited). True means line delimited JSON.\n    */\n    emitLineDelimitedJson: boolean;\n\n    /**\n     * The maximum size of a batch in bytes\n     */\n    maxBatchSizeInBytes: number;\n\n    /**\n     * The maximum interval allowed between calls to batchInvoke\n     */\n    maxBatchInterval: number;\n\n    /**\n     * The master off switch.  Do not send any data if set to TRUE\n     */\n    disableTelemetry: boolean;\n\n    /**\n     * Store a copy of a send buffer in the session storage\n     */\n    enableSessionStorageBuffer: boolean;\n\n    /**\n     * Specify the storage buffer type implementation.\n     * @since 2.8.12\n     */\n    bufferOverride: IStorageBuffer | false;\n\n    /**\n     * Is retry handler disabled.\n     * If enabled, retry on 206 (partial success), 408 (timeout), 429 (too many requests), 500 (internal server error) and 503 (service unavailable).\n     */\n    isRetryDisabled: boolean;\n\n    isBeaconApiDisabled: boolean;\n\n    /**\n     * Don't use XMLHttpRequest or XDomainRequest (for IE \\< 9) by default instead attempt to use fetch() or sendBeacon.\n     * If no other transport is available it will still use XMLHttpRequest\n     */\n    disableXhr: boolean;\n\n    /**\n     * If fetch keepalive is supported do not use it for sending events during unload, it may still fallback to fetch() without keepalive\n     */\n    onunloadDisableFetch: boolean;\n\n    /**\n     * Is beacon disabled on page unload.\n     * If enabled, flush events through beaconSender.\n     */\n    onunloadDisableBeacon: boolean;\n\n    /**\n     * (Optional) Override the instrumentation key that this channel instance sends to\n     */\n    instrumentationKey: string;\n\n    namePrefix: string;\n\n    samplingPercentage: number;\n\n    /**\n     * (Optional) The ability for the user to provide extra headers\n     */\n    customHeaders: [{header: string, value: string}];\n\n    /**\n     * (Optional) Provide user an option to convert undefined field to user defined value.\n     */\n    convertUndefined: any\n\n    /**\n     * (Optional) The number of events that can be kept in memory before the SDK starts to drop events. By default, this is 10,000.\n     */\n    eventsLimitInMem: number;\n\n    /**\n     * (Optional) Enable the sender to return a promise so that manually flushing (and general sending) can wait for the request to finish.\n     * Note: Enabling this may cause unhandled promise rejection errors to occur if you do not listen and handle any rejection response,\n     * this *should* only be for manual flush attempts.\n     * Defaults to false\n     * @since 3.0.1\n     */\n    enableSendPromise?: boolean;\n\n    /**\n     * [Optional] The HTTP override that should be used to send requests, as an IXHROverride object.\n     * By default during the unload of a page or if the event specifies that it wants to use sendBeacon() or sync fetch (with keep-alive),\n     * this override will NOT be called.\n     * If alwaysUseXhrOverride configuration value is set to true, the override will always be used.\n     * The payload data (first argument) now also includes any configured 'timeout' (defaults to undefined) and whether you should avoid\n     * creating any synchronous XHR requests 'disableXhr' (defaults to false/undefined)\n     * @since 3.0.4\n     */\n    httpXHROverride?: IXHROverride;\n\n    /**\n     * [Optional] By default during unload (or when you specify to use sendBeacon() or sync fetch (with keep-alive) for an event) the SDK\n     * ignores any provided httpXhrOverride and attempts to use sendBeacon() or fetch(with keep-alive) when they are available.\n     * When this configuration option is true any provided httpXhrOverride will always be used, so any provided httpXhrOverride will\n     * also need to \"handle\" the synchronous unload scenario.\n     * @since 3.0.4\n     */\n    alwaysUseXhrOverride?: boolean;\n\n    /**\n     * [Optional] Disable events splitting during sendbeacon.\n     * Default: false\n     * @since 3.0.6\n     */\n    disableSendBeaconSplit?: boolean;\n\n      /**\n     * [Optional] Either an array or single value identifying the requested TransportType type that should be used.\n     * This is used during initialization to identify the requested send transport, it will be ignored if a httpXHROverride is provided.\n     */\n    transports?: number | number[];\n\n       /**\n     * [Optional] Either an array or single value identifying the requested TransportType type(s) that should be used during unload or events\n     * marked as sendBeacon. This is used during initialization to identify the requested send transport, it will be ignored if a httpXHROverride\n     * is provided and alwaysUseXhrOverride is true.\n     */\n    unloadTransports?: number | number[];\n\n    /**\n     * (Optional) The specific error codes that will cause a retry of sending data to the backend.\n     * @since 3.1.1\n     */\n    retryCodes?: number[];\n\n    /**\n     * (Optional) The specific max retry count for each telemetry item.\n     * Default: 10\n     * if it is set to 0, means no retry allowed\n     * if it is set to undefined, means no limit for retry times\n     * @since 3.2.0\n     */\n    maxRetryCnt?: number;\n\n    /**\n     * [Optional] Specifies the Cross-Origin Resource Policy (CORP) for the endpoint.\n     * This value is included in the response header as `Cross-Origin-Resource-Policy`,\n     * which helps control how resources can be shared across different origins.\n     *\n     * Possible values:\n     * - `same-site`: Allows access only from the same site.\n     * - `same-origin`: Allows access only from the same origin (protocol, host, and port).\n     * - `cross-origin`: Allows access from any origin.\n     *\n     * @since 3.3.7\n     */\n    corsPolicy?: string;\n}\n\nexport interface IBackendResponse {\n    /**\n     * Number of items received by the backend\n     */\n    readonly itemsReceived: number;\n\n    /**\n     * Number of items succesfuly accepted by the backend\n     */\n    readonly itemsAccepted: number;\n\n    /**\n     * List of errors for items which were not accepted\n     */\n    readonly errors: IResponseError[];\n\n    /**\n     * App id returned by the backend - not necessary returned, but we don't need it with each response.\n     */\n    readonly appId?: string;\n}\n\nexport interface XDomainRequest extends XMLHttpRequestEventTarget {\n    readonly responseText: string;\n    send(payload: string): void;\n    open(method: string, url: string): void;\n}\n\nexport interface IResponseError {\n    readonly index: number;\n    readonly statusCode: number;\n    readonly message: string;\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/InternalConstants.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// ###################################################################################################################################################\n// Note: DON'T Export these const from the package as we are still targeting IE/ES5 this will export a mutable variables that someone could change ###\n// ###################################################################################################################################################\n\n// Generally you should only put values that are used more than 2 times and then only if not already exposed as a constant (such as SdkCoreNames)\n// as when using \"short\" named values from here they will be will be minified smaller than the SdkCoreNames[eSdkCoreNames.xxxx] value.\n\nexport const STR_DURATION = \"duration\";\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/SendBuffer.ts",
    "content": "import dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    IDiagnosticLogger, _eInternalMessageId, _throwInternal, arrForEach, arrIndexOf, dumpObj, eLoggingSeverity, getExceptionName, getJSON,\n    isArray, isFunction, isNullOrUndefined, isString, utlGetSessionStorage, utlRemoveSessionStorage, utlSetSessionStorage\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IInternalStorageItem, ISenderConfig } from \"./Interfaces\";\n\n/**\n * Before 3.1.2, payload only allow string\n * After 3.2.0,  IInternalStorageItem is accepted\n */\nexport interface ISendBuffer {\n\n    /**\n     * Enqueue the payload\n     */\n    enqueue: (payload: IInternalStorageItem) => void;\n\n    /**\n     * Returns the number of elements in the buffer\n     */\n    count: () => number;\n\n    /**\n     * Returns the current size of the serialized buffer\n     */\n    size: () => number;\n\n    /**\n     * Clears the buffer\n     */\n    clear: () => void;\n\n    /**\n     * Returns items stored in the buffer\n     */\n    getItems: () => IInternalStorageItem[];\n\n    /**\n     * Build a batch of all elements in the payload array\n     */\n    batchPayloads: (payload: IInternalStorageItem[]) => string;\n\n    /**\n     * Moves items to the SENT_BUFFER.\n     * The buffer holds items which were sent, but we haven't received any response from the backend yet.\n     */\n    markAsSent: (payload: IInternalStorageItem[]) => void;\n\n    /**\n     * Removes items from the SENT_BUFFER. Should be called on successful response from the backend.\n     */\n    clearSent: (payload: IInternalStorageItem[]) => void;\n\n     /**\n     * Copy current buffer items to a new buffer.\n     * if canUseSessionStorage is undefined, it will set to false.\n     * if newLogger and newConfig are undefined, current logger and empty config will be used.\n     * if canUseSessionStorage is set to true, new SessionStorageSendBuffer will be returned otherwise ArraySendBuffer will be returned.\n     */\n     createNew: (newLogger?: IDiagnosticLogger, newConfig?: ISenderConfig, canUseSessionStorage?: boolean) => ArraySendBuffer | SessionStorageSendBuffer;\n}\n\nabstract class BaseSendBuffer {\n\n    protected _get: () => IInternalStorageItem[];\n    protected _set: (buffer: IInternalStorageItem[]) => IInternalStorageItem[];\n\n    constructor(logger: IDiagnosticLogger, config: ISenderConfig) {\n        let _buffer: IInternalStorageItem[] = [];\n        let _bufferFullMessageSent = false;\n        let _maxRetryCnt = config.maxRetryCnt;\n\n        this._get = () => {\n            return _buffer;\n        };\n\n        this._set = (buffer: IInternalStorageItem[]) => {\n            _buffer = buffer;\n            return _buffer;\n        };\n\n        dynamicProto(BaseSendBuffer, this, (_self) => {\n\n            _self.enqueue = (payload: IInternalStorageItem) => {\n                if (_self.count() >= config.eventsLimitInMem) {\n                    // sent internal log only once per page view\n                    if (!_bufferFullMessageSent) {\n                        _throwInternal(logger,\n                            eLoggingSeverity.WARNING,\n                            _eInternalMessageId.InMemoryStorageBufferFull,\n                            \"Maximum in-memory buffer size reached: \" + _self.count(),\n                            true);\n                        _bufferFullMessageSent = true;\n                    }\n\n                    return;\n                }\n         \n                payload.cnt = payload.cnt || 0;\n                // max retry is defined, and max retry is reached, do not add the payload to buffer\n                if (!isNullOrUndefined(_maxRetryCnt)) {\n                    if (payload.cnt > _maxRetryCnt) {\n                        // TODO: add log here on dropping payloads\n                        // will log statsbeat exception later here\n                        \n                        return;\n                    }\n                }\n                _buffer.push(payload);\n\n                return;\n\n                \n            };\n\n            _self.count = (): number => {\n                return _buffer.length;\n            };\n\n            _self.size = (): number => {\n                let size = _buffer.length;\n                for (let lp = 0; lp < _buffer.length; lp++) {\n                    size += (_buffer[lp].item).length;\n                }\n\n                if (!config.emitLineDelimitedJson) {\n                    size += 2;\n                }\n\n                return size;\n            };\n\n            _self.clear = () => {\n                _buffer = [];\n                _bufferFullMessageSent = false;\n            };\n\n            _self.getItems = (): IInternalStorageItem[] => {\n                return _buffer.slice(0)\n            };\n\n            _self.batchPayloads = (payloads: IInternalStorageItem[]): string => {\n                if (payloads && payloads.length > 0) {\n                    let payloadStr: string[] = [];\n                    arrForEach(payloads, (payload) => {\n                        payloadStr.push(payload.item);\n                    })\n                    const batch = config.emitLineDelimitedJson ?\n                        payloadStr.join(\"\\n\") :\n                        \"[\" + payloadStr.join(\",\") + \"]\";\n        \n                    return batch;\n                }\n        \n                return null;\n            };\n\n            _self.createNew = (newLogger?: IDiagnosticLogger, newConfig?: ISenderConfig, canUseSessionStorage?: boolean): ArraySendBuffer | SessionStorageSendBuffer => {\n                let items = _buffer.slice(0);\n                newLogger = newLogger || logger;\n                newConfig = newConfig || {} as ISenderConfig;\n                let newBuffer = !!canUseSessionStorage? new SessionStorageSendBuffer(newLogger, newConfig) : new ArraySendBuffer(newLogger, newConfig);\n                arrForEach(items, (payload) => {\n                    newBuffer.enqueue(payload);\n                });\n                return newBuffer;\n            }\n        });\n    }\n\n    public enqueue(payload: IInternalStorageItem) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public count(): number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return 0;\n    }\n\n    public size(): number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return 0;\n    }\n\n    public clear() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getItems(): IInternalStorageItem[] {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public batchPayloads(payload: IInternalStorageItem[]): string {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public createNew(newLogger?: IDiagnosticLogger, newConfig?: ISenderConfig, canUseSessionStorage?: boolean): ArraySendBuffer | SessionStorageSendBuffer {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null\n    }\n}\n\n/*\n * An array based send buffer.\n */\nexport class ArraySendBuffer extends BaseSendBuffer implements ISendBuffer {\n\n    constructor(logger: IDiagnosticLogger, config: ISenderConfig) {\n        super(logger, config);\n\n        dynamicProto(ArraySendBuffer, this, (_self, _base) => {\n        \n            _self.markAsSent = (payload: IInternalStorageItem[]) => {\n                _base.clear();\n            };\n        \n            _self.clearSent = (payload: IInternalStorageItem[]) => {\n                // not supported\n            };\n        });\n    }\n\n    public markAsSent(payload: IInternalStorageItem[]) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public clearSent(payload: IInternalStorageItem[]) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n\nconst PREVIOUS_KEYS: string[] = [\"AI_buffer\", \"AI_sentBuffer\"];\n\n/*\n * Session storage buffer holds a copy of all unsent items in the browser session storage.\n */\nexport class SessionStorageSendBuffer extends BaseSendBuffer implements ISendBuffer {\n    static VERSION = \"_1\";\n    static BUFFER_KEY = \"AI_buffer\"+ this.VERSION;\n    static SENT_BUFFER_KEY = \"AI_sentBuffer\" + this.VERSION;\n\n    // Maximum number of payloads stored in the buffer. If the buffer is full, new elements will be dropped.\n    static MAX_BUFFER_SIZE = 2000;\n\n    constructor(logger: IDiagnosticLogger, config: ISenderConfig) {\n        super(logger, config);\n        let _bufferFullMessageSent = false;\n        //Note: should not use config.namePrefix directly, because it will always refers to the latest namePrefix\n        let _namePrefix = config?.namePrefix;\n        // TODO: add remove buffer override as well\n        const { getItem, setItem } = config.bufferOverride || { getItem: utlGetSessionStorage, setItem: utlSetSessionStorage };\n        let _maxRetryCnt = config.maxRetryCnt;\n\n        dynamicProto(SessionStorageSendBuffer, this, (_self, _base) => {\n            const bufferItems = _getBuffer(SessionStorageSendBuffer.BUFFER_KEY);\n            const itemsInSentBuffer = _getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n            let previousItems = _getPreviousEvents();\n            const notDeliveredItems = itemsInSentBuffer.concat(previousItems);\n    \n            let buffer = _self._set(bufferItems.concat(notDeliveredItems));\n            \n            // If the buffer has too many items, drop items from the end.\n            if (buffer.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                buffer.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n            }\n            _setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n            _setBuffer(SessionStorageSendBuffer.BUFFER_KEY, buffer);\n\n    \n            _self.enqueue = (payload: IInternalStorageItem) => {\n                if (_self.count() >= SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                    // sent internal log only once per page view\n                    if (!_bufferFullMessageSent) {\n                        _throwInternal(logger,\n                            eLoggingSeverity.WARNING,\n                            _eInternalMessageId.SessionStorageBufferFull,\n                            \"Maximum buffer size reached: \" + _self.count(),\n                            true);\n                        _bufferFullMessageSent = true;\n                    }\n\n                    return;\n                }\n                payload.cnt = payload.cnt || 0;\n                // max retry is defined, and max retry is reached, do not add the payload to buffer\n                if (!isNullOrUndefined(_maxRetryCnt)) {\n                    if (payload.cnt > _maxRetryCnt) {\n                        // TODO: add log here on dropping payloads\n                        return;\n                    }\n                }\n        \n                _base.enqueue(payload);\n                _setBuffer(SessionStorageSendBuffer.BUFFER_KEY, _self._get());\n            };\n       \n            _self.clear = () => {\n                _base.clear();\n                _setBuffer(SessionStorageSendBuffer.BUFFER_KEY, _self._get());\n                _setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, []);\n        \n                _bufferFullMessageSent = false;\n            };\n        \n            _self.markAsSent = (payload: IInternalStorageItem[]) => {\n                _setBuffer(SessionStorageSendBuffer.BUFFER_KEY,\n                    _self._set(_removePayloadsFromBuffer(payload, _self._get())));\n        \n                let sentElements = _getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n                if (sentElements instanceof Array && payload instanceof Array) {\n                    sentElements = sentElements.concat(payload);\n        \n                    if (sentElements.length > SessionStorageSendBuffer.MAX_BUFFER_SIZE) {\n                        // We send telemetry normally. If the SENT_BUFFER is too big we don't add new elements\n                        // until we receive a response from the backend and the buffer has free space again (see clearSent method)\n                        _throwInternal(logger,\n                            eLoggingSeverity.CRITICAL,\n                            _eInternalMessageId.SessionStorageBufferFull,\n                            \"Sent buffer reached its maximum size: \" + sentElements.length,\n                            true);\n        \n                        sentElements.length = SessionStorageSendBuffer.MAX_BUFFER_SIZE;\n                    }\n        \n                    _setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n                }\n            };\n        \n            _self.clearSent = (payload: IInternalStorageItem[]) => {\n                let sentElements = _getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY);\n                sentElements = _removePayloadsFromBuffer(payload, sentElements);\n        \n                _setBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY, sentElements);\n            };\n\n            _self.createNew = (newLogger?: IDiagnosticLogger, newConfig?: ISenderConfig, canUseSessionStorage?: boolean) => {\n                canUseSessionStorage = !!canUseSessionStorage;\n                let unsentItems = _self._get().slice(0);\n                let sentItems = _getBuffer(SessionStorageSendBuffer.SENT_BUFFER_KEY).slice(0);\n                newLogger = newLogger || logger;\n                newConfig = newConfig || {} as ISenderConfig;\n                \n                // to make sure that we do not send duplicated payloads when it is switched back to previous one\n                _self.clear();\n                let newBuffer = canUseSessionStorage? new SessionStorageSendBuffer(newLogger, newConfig) : new ArraySendBuffer(newLogger, newConfig);\n                arrForEach(unsentItems, (payload) => {\n                    newBuffer.enqueue(payload);\n                });\n                if (canUseSessionStorage) {\n                    // arr buffer will clear all payloads if markAsSent() is called\n                    newBuffer.markAsSent(sentItems);\n                }\n                return newBuffer;\n            };\n        \n            function _removePayloadsFromBuffer(payloads: IInternalStorageItem[], buffer: IInternalStorageItem[]): IInternalStorageItem[] {\n                const remaining: IInternalStorageItem[] = [];\n                let payloadStr: string[] = [];\n                arrForEach(payloads, (payload) => {\n                    payloadStr.push(payload.item);\n                });\n                arrForEach(buffer, (value) => {\n                    if (!isFunction(value) && arrIndexOf(payloadStr, value.item) === -1) {\n                        remaining.push(value);\n                    }\n                });\n        \n                return remaining;\n            }\n        \n            function _getBuffer(key: string): IInternalStorageItem[] {\n                let prefixedKey = key;\n                prefixedKey = _namePrefix ? _namePrefix + \"_\" + prefixedKey : prefixedKey;\n                return _getBufferBase<IInternalStorageItem>(prefixedKey);\n            }\n            \n            function _getBufferBase<T>(key: string): T[] {\n                try {\n                    const bufferJson = getItem(logger, key);\n                    if (bufferJson) {\n                        let buffer: T[] = getJSON().parse(bufferJson);\n                        if (isString(buffer)) {\n                            // When using some version prototype.js the stringify / parse cycle does not decode array's correctly\n                            buffer = getJSON().parse(buffer as any);\n                        }\n        \n                        if (buffer && isArray(buffer)) {\n                            return buffer;\n                        }\n                    }\n                } catch (e) {\n                    _throwInternal(logger, eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.FailedToRestoreStorageBuffer,\n                        \" storage key: \" + key + \", \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n        \n                return [];\n            }\n        \n            function _setBuffer(key: string, buffer: IInternalStorageItem[]) {\n                let prefixedKey = key;\n                try {\n                    prefixedKey = _namePrefix ? _namePrefix + \"_\" + prefixedKey : prefixedKey;\n                    const bufferJson = JSON.stringify(buffer);\n                    setItem(logger, prefixedKey, bufferJson);\n                } catch (e) {\n                    // if there was an error, clear the buffer\n                    // telemetry is stored in the _buffer array so we won't loose any items\n                    setItem(logger, prefixedKey, JSON.stringify([]));\n        \n                    _throwInternal(logger, eLoggingSeverity.WARNING,\n                        _eInternalMessageId.FailedToSetStorageBuffer,\n                        \" storage key: \" + prefixedKey + \", \" + getExceptionName(e) + \". Buffer cleared\",\n                        { exception: dumpObj(e) });\n                }\n            }\n\n            // this removes buffer with prefix+key\n            function _getPreviousEvents() {\n                let items: IInternalStorageItem[] = [];\n                try {\n                    arrForEach(PREVIOUS_KEYS, (key) => {\n                        let events = _getItemsFromPreviousKey(key);\n                        items = items.concat(events);\n                        \n                        // to make sure that we also transfer items from old prefixed + key buffer\n                        if (_namePrefix) {\n                            let prefixedKey = _namePrefix + \"_\" + key;\n                            let prefixEvents = _getItemsFromPreviousKey(prefixedKey);\n                            items = items.concat( prefixEvents);\n                        }\n                    });\n                    return items;\n                    \n\n                } catch(e) {\n                    _throwInternal(logger, eLoggingSeverity.WARNING,\n                        _eInternalMessageId.FailedToSetStorageBuffer,\n                        \"Transfer events from previous buffers: \" + getExceptionName(e) + \". previous Buffer items can not be removed\",\n                        { exception: dumpObj(e) });\n\n                }\n                return [];\n            }\n\n            // transform string[] to IInternalStorageItem[]\n            function _getItemsFromPreviousKey(key: string) {\n                try {\n                    let items = _getBufferBase<string>(key);\n                    let transFormedItems: IInternalStorageItem[] = [];\n                    arrForEach(items, (item) => {\n                        let internalItem = {\n                            item: item,\n                            cnt: 0 // previous events will be default to 0 count\n                        } as IInternalStorageItem;\n                        transFormedItems.push(internalItem);\n                    });\n                    // remove the session storage if we can add events back\n                    utlRemoveSessionStorage(logger, key);\n                    return transFormedItems;\n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return [];\n            }\n\n        });\n    }\n\n    public enqueue(payload: IInternalStorageItem) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public clear() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public markAsSent(payload: IInternalStorageItem[]) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public clearSent(payload: IInternalStorageItem[]) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public createNew(newLogger?: IDiagnosticLogger, newConfig?: ISenderConfig, canUseSessionStorage?: boolean): ArraySendBuffer | SessionStorageSendBuffer {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null\n    }\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/Sender.ts",
    "content": "import dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    ActiveStatus, BaseTelemetryPlugin, BreezeChannelIdentifier, DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, EventDataType,\n    ExceptionDataType, IAppInsightsCore, IBackendResponse, IChannelControls, IConfig, IConfigDefaults, IConfiguration, IDiagnosticLogger,\n    IEnvelope, IInternalOfflineSupport, INotificationManager, IOfflineListener, IPayloadData, IPlugin, IProcessTelemetryContext,\n    IProcessTelemetryUnloadContext, ISample, IStorageBuffer, ITelemetryItem, ITelemetryPluginChain, ITelemetryUnloadState, IXDomainRequest,\n    IXHROverride, MetricDataType, OnCompleteCallback, PageViewDataType, PageViewPerformanceDataType, ProcessLegacy, RemoteDependencyDataType,\n    RequestDataType, RequestHeaders, SampleRate, SendPOSTFunction, SendRequestReason, SenderPostManager, TraceDataType, TransportType,\n    _ISendPostMgrConfig, _ISenderOnComplete, _eInternalMessageId, _throwInternal, _warnToConsole, arrForEach, cfgDfBoolean, cfgDfValidate,\n    createOfflineListener, createProcessTelemetryContext, createUniqueNamespace, dateNow, dumpObj, eLoggingSeverity, eRequestHeaders,\n    formatErrorMessageXdr, formatErrorMessageXhr, getExceptionName, getIEVersion, isArray, isBeaconsSupported, isFeatureEnabled,\n    isFetchSupported, isInternalApplicationInsightsEndpoint, isNullOrUndefined, mergeEvtNamespace, objExtend, onConfigChange, parseResponse,\n    prependTransports, runTargetUnload, utlCanUseSessionStorage, utlSetStoragePrefix\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, createPromise, doAwait, doAwaitResponse } from \"@nevware21/ts-async\";\nimport {\n    ITimerHandler, getInst, isFunction, isNumber, isPromiseLike, isString, isTruthy, mathFloor, mathMax, mathMin, objDeepFreeze, objDefine,\n    scheduleTimeout\n} from \"@nevware21/ts-utils\";\nimport {\n    DependencyEnvelopeCreator, EnvelopeCreator, EventEnvelopeCreator, ExceptionEnvelopeCreator, MetricEnvelopeCreator,\n    PageViewEnvelopeCreator, PageViewPerformanceEnvelopeCreator, RequestEnvelopeCreator, TraceEnvelopeCreator\n} from \"./EnvelopeCreator\";\nimport { IInternalStorageItem, ISenderConfig } from \"./Interfaces\";\nimport { ArraySendBuffer, ISendBuffer, SessionStorageSendBuffer } from \"./SendBuffer\";\nimport { Serializer } from \"./Serializer\";\nimport { createSampler } from \"./TelemetryProcessors/Sample\";\n\nconst UNDEFINED_VALUE: undefined = undefined;\nconst EMPTY_STR = \"\";\n\nconst FetchSyncRequestSizeLimitBytes = 65000; // approx 64kb (the current Edge, Firefox and Chrome max limit)\n\ninterface IInternalPayloadData extends IPayloadData {\n    oriPayload: IInternalStorageItem[];\n    retryCnt?: number;\n    // statsBeatData?: IStatsEventData;\n}\n\n\nfunction _getResponseText(xhr: XMLHttpRequest | IXDomainRequest) {\n    try {\n        return xhr.responseText;\n    } catch (e) {\n        // Best effort, as XHR may throw while XDR wont so just ignore\n    }\n\n    return null;\n}\n\nfunction isOverrideFn(httpXHROverride: any) {\n    return httpXHROverride && httpXHROverride.sendPOST;\n}\n\n\nconst defaultAppInsightsChannelConfig: IConfigDefaults<ISenderConfig> = objDeepFreeze({\n    // Use the default value (handles empty string in the configuration)\n    endpointUrl: cfgDfValidate(isTruthy, DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH),\n    emitLineDelimitedJson: cfgDfBoolean(),\n    maxBatchInterval: 15000,\n    maxBatchSizeInBytes: 102400,  // 100kb\n    disableTelemetry: cfgDfBoolean(),\n    enableSessionStorageBuffer: cfgDfBoolean(true),\n    isRetryDisabled: cfgDfBoolean(),\n    isBeaconApiDisabled: cfgDfBoolean(true),\n    disableSendBeaconSplit: cfgDfBoolean(true),\n    disableXhr: cfgDfBoolean(),\n    onunloadDisableFetch: cfgDfBoolean(),\n    onunloadDisableBeacon: cfgDfBoolean(),\n    instrumentationKey: UNDEFINED_VALUE,  // Channel doesn't need iKey, it should be set already\n    namePrefix: UNDEFINED_VALUE,\n    samplingPercentage: cfgDfValidate(_chkSampling, 100),\n    customHeaders: UNDEFINED_VALUE,\n    convertUndefined: UNDEFINED_VALUE,\n    eventsLimitInMem: 10000,\n    bufferOverride: false,\n    httpXHROverride: { isVal: isOverrideFn, v:UNDEFINED_VALUE },\n    alwaysUseXhrOverride: cfgDfBoolean(),\n    transports: UNDEFINED_VALUE,\n    retryCodes: UNDEFINED_VALUE,\n    corsPolicy: UNDEFINED_VALUE,\n    maxRetryCnt: {isVal: isNumber, v:10}\n});\n\nconst CrossOriginResourcePolicyHeader: string = \"X-Set-Cross-Origin-Resource-Policy\";\n\nfunction _chkSampling(value: number) {\n    return !isNaN(value) && value > 0 && value <= 100;\n}\n\ntype EnvelopeCreator = (logger: IDiagnosticLogger, telemetryItem: ITelemetryItem, customUndefinedValue?: any) => IEnvelope;\n\nconst EnvelopeTypeCreator: { [key:string] : EnvelopeCreator } = {\n    [EventDataType]:                    EventEnvelopeCreator,\n    [TraceDataType]:                    TraceEnvelopeCreator,\n    [PageViewDataType]:                 PageViewEnvelopeCreator,\n    [PageViewPerformanceDataType]:      PageViewPerformanceEnvelopeCreator,\n    [ExceptionDataType]:                ExceptionEnvelopeCreator,\n    [MetricDataType]:                   MetricEnvelopeCreator,\n    [RemoteDependencyDataType]:         DependencyEnvelopeCreator,\n    [RequestDataType]:                  RequestEnvelopeCreator\n};\n\nexport type SenderFunction = (payload: string[] | IInternalStorageItem[], isAsync: boolean) => void | IPromise<boolean>;\n\nexport class Sender extends BaseTelemetryPlugin implements IChannelControls {\n\n    public static constructEnvelope(orig: ITelemetryItem, iKey: string, logger: IDiagnosticLogger, convertUndefined?: any): IEnvelope {\n        let envelope: ITelemetryItem;\n        if (iKey !== orig.iKey && !isNullOrUndefined(iKey)) {\n            envelope = {\n                ...orig,\n                iKey\n            };\n        } else {\n            envelope = orig;\n        }\n    \n        let creator: EnvelopeCreator = EnvelopeTypeCreator[envelope.baseType] || EventEnvelopeCreator;\n    \n        return creator(logger, envelope, convertUndefined);\n    }\n    \n    public readonly priority: number = 1001;\n\n    public readonly identifier: string = BreezeChannelIdentifier;\n\n    /**\n     * The configuration for this sender instance\n     */\n    public readonly _senderConfig: ISenderConfig;\n\n    /**\n     * A method which will cause data to be send to the url\n     */\n    public _sender: SenderFunction;\n\n    /**\n     * A send buffer object\n     */\n    public _buffer: ISendBuffer;\n\n    /**\n     * AppId of this component parsed from some backend response.\n     */\n    public _appId: string;\n\n    protected _sample: ISample;\n\n    constructor() {\n        super();\n\n        // Don't set the defaults here, set them in the _initDefaults() as this is also called during unload\n        let _consecutiveErrors: number;         // How many times in a row a retryable error condition has occurred.\n        let _retryAt: number;                   // The time to retry at in milliseconds from 1970/01/01 (this makes the timer calculation easy).\n        let _lastSend: number;                  // The time of the last send operation.\n        let _paused: boolean;                   // Flag indicating that the sending should be paused\n        let _timeoutHandle: ITimerHandler;      // Handle to the timer for delayed sending of batches of data.\n        let _serializer: Serializer;\n        let _stamp_specific_redirects: number;\n        let _headers: { [name: string]: string };\n        let _syncFetchPayload = 0;              // Keep track of the outstanding sync fetch payload total (as sync fetch has limits)\n        let _syncUnloadSender: SenderFunction;  // The identified sender to use for the synchronous unload stage\n        let _offlineListener: IOfflineListener;\n        let _evtNamespace: string | string[];\n        let _endpointUrl: string;\n        let _orgEndpointUrl: string;\n        let _maxBatchSizeInBytes: number;\n        let _beaconSupported: boolean;\n        let _beaconOnUnloadSupported: boolean;\n        let _beaconNormalSupported: boolean;\n        let _customHeaders: Array<{header: string, value: string}>;\n        let _disableTelemetry: boolean;\n        let _instrumentationKey: string;\n        let _convertUndefined: any;\n        let _isRetryDisabled: boolean;\n        let _maxBatchInterval: number;\n        let _sessionStorageUsed: boolean;\n        let _bufferOverrideUsed: IStorageBuffer | false;\n        let _namePrefix: string;\n        let _enableSendPromise: boolean;\n        let _alwaysUseCustomSend: boolean;\n        let _disableXhr: boolean;\n        let _fetchKeepAlive: boolean;\n        let _xhrSend: SenderFunction;\n        let _fallbackSend: SenderFunction;\n        let _disableBeaconSplit: boolean;\n        let _sendPostMgr: SenderPostManager;\n        let _retryCodes: number[];\n        let _zipPayload: boolean;\n\n        dynamicProto(Sender, this, (_self, _base) => {\n\n            _initDefaults();\n\n            _self.pause = () => {\n                _clearScheduledTimer();\n                _paused = true;\n            };\n        \n            _self.resume = () => {\n                if (_paused) {\n                    _paused = false;\n                    _retryAt = null;\n\n                    // flush if we have exceeded the max-size already\n                    _checkMaxSize();\n                    _setupTimer();\n                }\n            };\n        \n            _self.flush = (isAsync: boolean = true, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean> => {\n                if (!_paused) {\n                    // Clear the normal schedule timer as we are going to try and flush ASAP\n                    _clearScheduledTimer();\n\n                    try {\n                        let result = _self.triggerSend(isAsync, null, sendReason || SendRequestReason.ManualFlush);\n                        \n                        // Handles non-promise and always called if the returned promise resolves or rejects\n                        return doAwaitResponse(result as any, (rsp) => {\n                            if (callBack) {\n                                callBack(!rsp.rejected);\n                                return true;\n                            }\n                            \n                            // When async=true and no callback, return a promise\n                            if (isAsync) {\n                                return createPromise<boolean>((resolve) => {\n                                    resolve(!rsp.rejected);\n                                });\n                            }\n                            \n                            return result;\n                        });\n                    } catch (e) {\n                        _throwInternal(_self.diagLog(), eLoggingSeverity.CRITICAL,\n                            _eInternalMessageId.FlushFailed,\n                            \"flush failed, telemetry will not be collected: \" + getExceptionName(e),\n                            { exception: dumpObj(e) });\n                    }\n                }\n            };\n        \n            _self.onunloadFlush = () => {\n                if (!_paused) {\n                    if (_beaconSupported || _alwaysUseCustomSend) {\n                        try {\n                            return _self.triggerSend(true, _doUnloadSend, SendRequestReason.Unload);\n                        } catch (e) {\n                            _throwInternal(_self.diagLog(), eLoggingSeverity.CRITICAL,\n                                _eInternalMessageId.FailedToSendQueuedTelemetry,\n                                \"failed to flush with beacon sender on page unload, telemetry will not be collected: \" + getExceptionName(e),\n                                { exception: dumpObj(e) });\n                        }\n                    } else {\n                        _self.flush(false);\n                    }\n                }\n            };\n\n            _self.addHeader = (name: string, value: string) => {\n                _headers[name] = value;\n            };\n        \n            _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain): void => {\n                if (_self.isInitialized()) {\n                    _throwInternal(_self.diagLog(), eLoggingSeverity.CRITICAL, _eInternalMessageId.SenderNotInitialized, \"Sender is already initialized\");\n                }\n             \n                _base.initialize(config, core, extensions, pluginChain);\n                let identifier = _self.identifier;\n                _serializer = new Serializer(core.logger);\n                _consecutiveErrors = 0;\n                _retryAt = null;\n                _lastSend = 0;\n                _self._sender = null;\n                _stamp_specific_redirects = 0;\n                let diagLog = _self.diagLog();\n                _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"Sender\"), core.evtNamespace && core.evtNamespace());\n                _offlineListener = createOfflineListener(_evtNamespace);\n                // This function will be re-called whenever any referenced configuration is changed\n                _self._addHook(onConfigChange(config, (details) => {\n                    let config = details.cfg;\n                    if (config.storagePrefix){\n                        utlSetStoragePrefix(config.storagePrefix);\n                    }\n                    let ctx = createProcessTelemetryContext(null, config, core);\n                    // getExtCfg only finds undefined values from core\n                    let senderConfig = ctx.getExtCfg(identifier, defaultAppInsightsChannelConfig);\n                    let curExtUrl = senderConfig.endpointUrl;\n                    \n                    // if it is not inital change (_endpointUrl has value)\n                    // if current sender endpoint url is not changed directly\n                    // means ExtCfg is not changed directly\n                    // then we need to monitor endpoint url changes from core\n                    if (_endpointUrl && curExtUrl === _endpointUrl) {\n                        let coreUrl = config.endpointUrl as any;\n                        // if core endpoint url is changed\n                        if (coreUrl && coreUrl !== curExtUrl) {\n                            // and endpoint promise changes is handled by this as well\n                            senderConfig.endpointUrl = coreUrl;\n                        }\n                    }\n                    const csStream = getInst(\"CompressionStream\");\n                    // Determine whether to enable payload compression (zipping).\n                    _zipPayload = isFeatureEnabled(\"zipPayload\", config, false);\n                    if (!isFunction(csStream)) {\n                        _zipPayload = false;\n                    }\n                    let corsPolicy = senderConfig.corsPolicy;\n                    if (corsPolicy){\n                        if (corsPolicy === \"same-origin\" || corsPolicy === \"same-site\" || corsPolicy === \"cross-origin\") {\n                            this.addHeader(CrossOriginResourcePolicyHeader, corsPolicy);\n                        }\n                    } else {\n                        delete _headers[CrossOriginResourcePolicyHeader];\n                    }\n\n                    if(isPromiseLike(senderConfig.instrumentationKey)) {\n                        // if it is promise, means the endpoint url is from core.endpointurl\n                        senderConfig.instrumentationKey = config.instrumentationKey as any;\n                    }\n                    objDefine(_self, \"_senderConfig\", {\n                        g: function() {\n                            return senderConfig;\n                        }\n                    });\n\n                    // Only update the endpoint if the original config !== the current config\n                    // This is so any redirect endpointUrl is not overwritten\n                    if (_orgEndpointUrl !== senderConfig.endpointUrl) {\n                        if (_orgEndpointUrl) {\n                            // TODO: add doc to remind users to flush before changing endpoint, otherwise all unsent payload will be sent to new endpoint\n                        }\n                        _endpointUrl = _orgEndpointUrl = senderConfig.endpointUrl;\n                    }\n\n                    // or is not string\n                    if (core.activeStatus() === ActiveStatus.PENDING) {\n                        // waiting for core promises to be resolved\n                        // NOTE: if active status is set to pending, stop sending, clear timer here\n                        _self.pause();\n                    } else if (core.activeStatus() === ActiveStatus.ACTIVE) {\n                        // core status changed from pending to other status\n                        _self.resume();\n    \n                    }\n\n                    if (_customHeaders && _customHeaders !== senderConfig.customHeaders) {\n                        // Removing any previously defined custom headers as they have changed\n                        arrForEach(_customHeaders, customHeader => {\n                            delete _headers[customHeader.header];\n                        });\n                    }\n\n                    _maxBatchSizeInBytes = senderConfig.maxBatchSizeInBytes;\n                    _beaconSupported = (senderConfig.onunloadDisableBeacon === false || senderConfig.isBeaconApiDisabled === false) && isBeaconsSupported();\n                    _beaconOnUnloadSupported = senderConfig.onunloadDisableBeacon === false  && isBeaconsSupported();\n                    _beaconNormalSupported = senderConfig.isBeaconApiDisabled === false && isBeaconsSupported();\n\n                    _alwaysUseCustomSend = senderConfig.alwaysUseXhrOverride;\n                    _disableXhr = !!senderConfig.disableXhr;\n                    _retryCodes = senderConfig.retryCodes;\n                    \n                    let bufferOverride = senderConfig.bufferOverride;\n                    let canUseSessionStorage = !!senderConfig.enableSessionStorageBuffer &&\n                        (!!bufferOverride || utlCanUseSessionStorage());\n                    let namePrefix = senderConfig.namePrefix;\n                 \n                    //Note: emitLineDelimitedJson and eventsLimitInMem is directly accessed via config in senderBuffer\n                    //Therefore, if canUseSessionStorage is not changed, we do not need to re initialize a new one\n                    let shouldUpdate = (canUseSessionStorage !== _sessionStorageUsed)\n                                    || (canUseSessionStorage && (_namePrefix !== namePrefix))  // prefixName is only used in session storage\n                                    || (canUseSessionStorage && (_bufferOverrideUsed !== bufferOverride));\n\n                    if (_self._buffer) {\n                        // case1 (Pre and Now enableSessionStorageBuffer settings are same)\n                        // if namePrefix changes, transfer current buffer to new buffer\n                        // else no action needed\n\n                        //case2 (Pre and Now enableSessionStorageBuffer settings are changed)\n                        // transfer current buffer to new buffer\n                       \n                        if (shouldUpdate) {\n                            try {\n                                \n                                _self._buffer = _self._buffer.createNew(diagLog, senderConfig, canUseSessionStorage);\n                       \n                            } catch (e) {\n                                _throwInternal(_self.diagLog(), eLoggingSeverity.CRITICAL,\n                                    _eInternalMessageId.FailedAddingTelemetryToBuffer,\n                                    \"failed to transfer telemetry to different buffer storage, telemetry will be lost: \" + getExceptionName(e),\n                                    { exception: dumpObj(e) });\n                            }\n                        }\n                        _checkMaxSize();\n                    } else {\n                        _self._buffer = canUseSessionStorage\n                            ? new SessionStorageSendBuffer(diagLog, senderConfig) : new ArraySendBuffer(diagLog, senderConfig);\n                    }\n\n                    _namePrefix = namePrefix;\n                    _sessionStorageUsed = canUseSessionStorage;\n                    _bufferOverrideUsed = bufferOverride;\n                    _fetchKeepAlive = !senderConfig.onunloadDisableFetch && isFetchSupported(true);\n                    _disableBeaconSplit = !!senderConfig.disableSendBeaconSplit;\n\n                    _self._sample = createSampler(senderConfig.samplingPercentage, diagLog);\n\n                    _instrumentationKey = senderConfig.instrumentationKey;\n                    if(!isPromiseLike(_instrumentationKey) && !_validateInstrumentationKey(_instrumentationKey, config)) {\n                        _throwInternal(diagLog,\n                            eLoggingSeverity.CRITICAL,\n                            _eInternalMessageId.InvalidInstrumentationKey, \"Invalid Instrumentation key \" + _instrumentationKey);\n                    }\n\n                    _customHeaders = senderConfig.customHeaders;\n                    if (isString(_endpointUrl) && !isInternalApplicationInsightsEndpoint(_endpointUrl) && _customHeaders && _customHeaders.length > 0) {\n                        arrForEach(_customHeaders, customHeader => {\n                            this.addHeader(customHeader.header, customHeader.value);\n                        });\n                    } else {\n                        _customHeaders = null;\n                    }\n                    _enableSendPromise = senderConfig.enableSendPromise;\n                    let sendPostConfig = _getSendPostMgrConfig();\n\n                    // only init it once\n                    if (!_sendPostMgr) {\n                        _sendPostMgr = new SenderPostManager();\n                        _sendPostMgr.initialize(sendPostConfig, diagLog);\n                    } else {\n                        _sendPostMgr.SetConfig(sendPostConfig);\n                    }\n                    let customInterface = senderConfig.httpXHROverride;\n                    let httpInterface: IXHROverride = null;\n                    let syncInterface: IXHROverride = null;\n                   \n                    // User requested transport(s) values > Beacon > Fetch > XHR\n                    // Beacon would be filtered out if user has set disableBeaconApi to true at _getSenderInterface\n                    let theTransports: TransportType[] = prependTransports([TransportType.Beacon, TransportType.Xhr, TransportType.Fetch], senderConfig.transports);\n\n                    httpInterface = _sendPostMgr && _sendPostMgr.getSenderInst(theTransports, false);\n                  \n                    let xhrInterface = _sendPostMgr && _sendPostMgr.getFallbackInst();\n                    _xhrSend = (payload: IInternalStorageItem[], isAsync: boolean) => {\n                        return _doSend(xhrInterface, payload, isAsync);\n                    };\n                    _fallbackSend = (payload: IInternalStorageItem[], isAsync: boolean) => { // for fallback send, should NOT mark payload as sent again!\n                        return _doSend(xhrInterface, payload, isAsync, false);\n                    };\n    \n                    httpInterface = _alwaysUseCustomSend? customInterface : (httpInterface || customInterface || xhrInterface);\n\n                    _self._sender = (payload: IInternalStorageItem[], isAsync: boolean) => {\n                        return _doSend(httpInterface, payload, isAsync);\n                    };\n\n                    if (_fetchKeepAlive) {\n                        // Try and use the fetch with keepalive\n                        _syncUnloadSender = _fetchKeepAliveSender;\n                    }\n                    \n                    let syncTransports: TransportType[] = prependTransports([TransportType.Beacon, TransportType.Xhr], senderConfig.unloadTransports);\n                    if (!_fetchKeepAlive){\n                        // remove fetch from theTransports\n                        syncTransports = syncTransports.filter(transport => transport !== TransportType.Fetch);\n                    }\n\n                    syncInterface = _sendPostMgr && _sendPostMgr.getSenderInst(syncTransports, true);\n                    syncInterface = _alwaysUseCustomSend? customInterface : (syncInterface || customInterface);\n                   \n                    if ((_alwaysUseCustomSend || senderConfig.unloadTransports || !_syncUnloadSender) && syncInterface) {\n                        _syncUnloadSender = (payload: IInternalStorageItem[], isAsync: boolean) => {\n                            return _doSend(syncInterface, payload, isAsync);\n                        };\n                    }\n\n                    if (!_syncUnloadSender) {\n                        _syncUnloadSender = _xhrSend;\n                    }\n\n                    _disableTelemetry = senderConfig.disableTelemetry;\n                    _convertUndefined = senderConfig.convertUndefined || UNDEFINED_VALUE;\n                    _isRetryDisabled = senderConfig.isRetryDisabled;\n                    _maxBatchInterval = senderConfig.maxBatchInterval;\n                }));\n            };\n            \n            _self.processTelemetry = (telemetryItem: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                itemCtx = _self._getTelCtx(itemCtx);\n                let diagLogger = itemCtx.diagLog();\n                \n                try {\n                    let isValidate = _validate(telemetryItem, diagLogger);\n                    if (!isValidate) {\n                        return;\n                    }\n        \n                    let aiEnvelope = _getEnvelope(telemetryItem, diagLogger);\n                    if (!aiEnvelope) {\n                        return;\n                    }\n        \n                    // check if the incoming payload is too large, truncate if necessary\n                    const payload: string = _serializer.serialize(aiEnvelope);\n        \n                    // flush if we would exceed the max-size limit by adding this item\n                    const buffer = _self._buffer;\n                    _checkMaxSize(payload);\n                    let payloadItem = {\n                        item: payload,\n                        cnt: 0 // inital cnt will always be 0\n                    } as IInternalStorageItem;\n\n                    // enqueue the payload\n                    buffer.enqueue(payloadItem);\n        \n                    // ensure an invocation timeout is set\n                    _setupTimer();\n        \n                } catch (e) {\n                    _throwInternal(diagLogger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.FailedAddingTelemetryToBuffer,\n                        \"Failed adding telemetry to the sender's buffer, some telemetry will be lost: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n        \n                // hand off the telemetry item to the next plugin\n                _self.processNext(telemetryItem, itemCtx);\n            };\n\n            _self.isCompletelyIdle = () => {\n                return !_paused && _syncFetchPayload === 0 && _self._buffer.count() === 0;\n            }\n\n            _self.getOfflineListener = () => {\n                return _offlineListener;\n            }\n        \n            /**\n             * xhr state changes\n             */\n            _self._xhrReadyStateChange = (xhr: XMLHttpRequest, payload: string[] | IInternalStorageItem[], countOfItemsInPayload: number) => {\n                // since version 3.2.0, this function is no-op\n                if (_isStringArr(payload)) {\n                    return;\n                }\n                return _xhrReadyStateChange(xhr, payload as IInternalStorageItem[], countOfItemsInPayload);\n\n            }\n        \n            /**\n             * Immediately send buffered data\n             * @param isAsync - Indicates if the events should be sent asynchronously\n             * @param forcedSender - Indicates the forcedSender, undefined if not passed\n             */\n            _self.triggerSend = (isAsync = true, forcedSender?: SenderFunction, sendReason?: SendRequestReason) => {\n                let result: void | IPromise<boolean>;\n                if (!_paused) {\n                    try {\n                        const buffer = _self._buffer;\n    \n                        // Send data only if disableTelemetry is false\n                        if (!_disableTelemetry) {\n            \n                            if (buffer.count() > 0) {\n                                const payload = buffer.getItems();\n            \n                                _notifySendRequest(sendReason||SendRequestReason.Undefined, isAsync);\n            \n                                // invoke send\n                                if (forcedSender) {\n                                    result = forcedSender.call(_self, payload, isAsync);\n                                } else {\n                                    result = _self._sender(payload, isAsync);\n                                }\n                            }\n            \n                            // update lastSend time to enable throttling\n                            _lastSend = +new Date;\n                        } else {\n                            buffer.clear();\n                        }\n            \n                        _clearScheduledTimer();\n                    } catch (e) {\n                        /* Ignore this error for IE under v10 */\n                        let ieVer = getIEVersion();\n                        if (!ieVer || ieVer > 9) {\n                            _throwInternal(_self.diagLog(),\n                                eLoggingSeverity.CRITICAL,\n                                _eInternalMessageId.TransmissionFailed,\n                                \"Telemetry transmission failed, some telemetry will be lost: \" + getExceptionName(e),\n                                { exception: dumpObj(e) });\n                        }\n                        // potential place to call countException q3\n                    }\n                }\n\n                return result;\n            };\n            \n            _self.getOfflineSupport = () => {\n                return {\n                    getUrl: () => {\n                        return _endpointUrl;\n                    },\n                    createPayload:_createPayload,\n                    serialize: _serialize,\n                    batch: _batch,\n                    shouldProcess:(evt) => {\n                        return !!_validate(evt);\n                    }\n                } as IInternalOfflineSupport;\n            }\n        \n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _self.onunloadFlush();\n                runTargetUnload(_offlineListener, false);\n                _initDefaults();\n            };\n\n            /**\n             * error handler\n             */\n            _self._onError = (payload: IInternalStorageItem[] | string[], message: string, event?: ErrorEvent) => {\n                // since version 3.1.3, string[] is no-op\n                if (_isStringArr(payload)) {\n                    return;\n                }\n                return _onError(payload as IInternalStorageItem[], message, event);\n            };\n        \n            /**\n             * partial success handler\n             */\n            _self._onPartialSuccess = (payload: IInternalStorageItem[] | string[], results: IBackendResponse) => {\n                // since version 3.1.3, string[] is no-op\n                if (_isStringArr(payload)) {\n                    return;\n                }\n                return _onPartialSuccess(payload as IInternalStorageItem[], results);\n            };\n        \n            /**\n             * success handler\n             */\n            _self._onSuccess = (payload: IInternalStorageItem[] | string[], countOfItemsInPayload: number) => {\n                // since version 3.1.3, string[] is no-op\n                if (_isStringArr(payload)) {\n                    return;\n                }\n                return _onSuccess(payload as IInternalStorageItem[], countOfItemsInPayload);\n                \n                //_self._buffer && _self._buffer.clearSent(payload);\n            };\n\n        \n            /**\n             * xdr state changes\n             */\n            _self._xdrOnLoad = (xdr: IXDomainRequest, payload: IInternalStorageItem[] | string[]) => {\n                // since version 3.1.3, string[] is no-op\n                if (_isStringArr(payload)) {\n                    return;\n                }\n                return _xdrOnLoad(xdr, payload as IInternalStorageItem[]);\n\n            }\n\n            // function _getStatsBeat() {\n            //     let statsBeatConfig: IStatsBeatState = {\n            //         cKey: _self._senderConfig.instrumentationKey,\n            //         endpoint: _endpointUrl,\n            //         sdkVer: EnvelopeCreator.Version,\n            //         type: eStatsType.SDK\n            //     };\n\n            //     let core = _self.core;\n\n            //     // During page unload the core may have been cleared and some async events may not have been sent yet\n            //     // resulting in the core being null. In this case we don't want to create a statsbeat instance\n            //     return core ? core.getStatsBeat(statsBeatConfig) : null;\n            // }\n\n            function _xdrOnLoad (xdr: IXDomainRequest, payload: IInternalStorageItem[]) {\n                const responseText = _getResponseText(xdr);\n                if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\n                    _consecutiveErrors = 0;\n                    _self._onSuccess(payload, 0);\n                } else {\n                    const results = parseResponse(responseText);\n        \n                    if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                        && !_isRetryDisabled) {\n                        _self._onPartialSuccess(payload, results);\n                    } else {\n                        _self._onError(payload, formatErrorMessageXdr(xdr));\n                    }\n                }\n\n            }\n\n            function _getSendPostMgrConfig(): _ISendPostMgrConfig {\n                try {\n                    let onCompleteFuncs = {\n                        xdrOnComplete: (xdr: IXDomainRequest, oncomplete: OnCompleteCallback,payload?: IPayloadData) => {\n                            let payloadArr = _getPayloadArr(payload);\n                            if (!payloadArr) {\n                                return;\n                            }\n                            //const responseText = _getResponseText(xdr);\n                            // let statsbeat = _getStatsBeat();\n                            // if (statsbeat) {\n                            //     if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\n                            //         _consecutiveErrors = 0;\n                            //         statsbeat.count(200, payload, _endpointUrl);\n                            //     } else {\n                            //         const results = parseResponse(responseText);\n                        \n                            //         if (results && results.itemsReceived && results.itemsReceived > results.itemsAccepted\n                            //             && !_isRetryDisabled) {\n                            //             statsbeat.count(206, payload, _endpointUrl);\n                            //         } else {\n                            //             statsbeat.count(499, payload, _endpointUrl);\n                            //         }\n                            //     }\n                            // }\n\n                            return _xdrOnLoad(xdr, payloadArr);\n                           \n                        },\n                        fetchOnComplete: (response: Response, onComplete: OnCompleteCallback, resValue?: string, payload?: IPayloadData) => {\n                            let payloadArr = _getPayloadArr(payload);\n                            if (!payloadArr) {\n                                return;\n                            }\n                            // let statsbeat = _getStatsBeat();\n                            // if (statsbeat) {\n                            //     statsbeat.count(response.status, payload, _endpointUrl);\n                            // }\n                            return _checkResponsStatus(response.status, payloadArr, response.url, payloadArr.length, response.statusText, resValue || \"\");\n                        },\n                        xhrOnComplete: (request: XMLHttpRequest, oncomplete: OnCompleteCallback, payload?: IPayloadData) => {\n                            let payloadArr = _getPayloadArr(payload);\n                            if (!payloadArr) {\n                                return;\n                            }\n                            // let statsbeat = _getStatsBeat();\n                            // if (statsbeat && request.readyState === 4) {\n                            //     statsbeat.count(request.status, payload, _endpointUrl);\n                            // }\n\n                            return _xhrReadyStateChange(request, payloadArr, payloadArr.length);\n                        },\n                        beaconOnRetry: (data: IPayloadData, onComplete: OnCompleteCallback, canSend: (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => boolean) => {\n                            // let statsbeat = _getStatsBeat();\n                            // if (statsbeat) {\n                            //     statsbeat.count(499, data, _endpointUrl);\n                            // }\n\n                            return _onBeaconRetry(data, onComplete, canSend);\n                        }\n    \n                    } as _ISenderOnComplete;\n\n                    let config = {\n                        enableSendPromise: _enableSendPromise,\n                        isOneDs: false,\n                        disableCredentials: false,\n                        disableXhr: _disableXhr,\n                        disableBeacon: !_beaconNormalSupported,\n                        disableBeaconSync: !_beaconOnUnloadSupported,\n                        senderOnCompleteCallBack: onCompleteFuncs\n                    } as _ISendPostMgrConfig;\n                    return config;\n                 \n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return null;\n\n            }\n\n            /**\n             * xhr state changes\n             */\n            function _xhrReadyStateChange (xhr: XMLHttpRequest, payload: IInternalStorageItem[], countOfItemsInPayload: number) {\n                if (xhr.readyState === 4) {\n                    _checkResponsStatus(xhr.status, payload, xhr.responseURL, countOfItemsInPayload, formatErrorMessageXhr(xhr), _getResponseText(xhr) || xhr.response);\n                }\n            }\n\n            /**\n             * error handler\n             */\n            function _onError(payload: IInternalStorageItem[], message: string, event?: ErrorEvent) {\n                _throwInternal(_self.diagLog(),\n                    eLoggingSeverity.WARNING,\n                    _eInternalMessageId.OnError,\n                    \"Failed to send telemetry.\",\n                    { message });\n        \n                _self._buffer && _self._buffer.clearSent(payload);\n            }\n            /**\n             * partial success handler\n             */\n            function _onPartialSuccess(payload: IInternalStorageItem[], results: IBackendResponse) {\n                const failed: IInternalStorageItem[] = [];\n                const retry: IInternalStorageItem[] = [];\n        \n                // Iterate through the reversed array of errors so that splicing doesn't have invalid indexes after the first item.\n                const errors = results.errors.reverse();\n                for (const error of errors) {\n                    const extracted = payload.splice(error.index, 1)[0];\n                    if (_isRetriable(error.statusCode)) {\n                        retry.push(extracted);\n                    } else {\n                        // All other errors, including: 402 (Monthly quota exceeded) and 439 (Too many requests and refresh cache).\n                        failed.push(extracted);\n                    }\n                }\n        \n                if (payload.length > 0) {\n                    _self._onSuccess(payload, results.itemsAccepted);\n                }\n        \n                if (failed.length > 0) {\n                    _self._onError(failed, formatErrorMessageXhr(null, [\"partial success\", results.itemsAccepted, \"of\", results.itemsReceived].join(\" \")));\n                }\n        \n                if (retry.length > 0) {\n                    _resendPayload(retry);\n        \n                    _throwInternal(_self.diagLog(),\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.TransmissionFailed, \"Partial success. \" +\n                        \"Delivered: \" + payload.length + \", Failed: \" + failed.length +\n                        \". Will retry to send \" + retry.length + \" our of \" + results.itemsReceived + \" items\");\n                }\n            }\n\n             \n            /**\n             * success handler\n             */\n            function _onSuccess(payload: IInternalStorageItem[], countOfItemsInPayload: number) {\n                _self._buffer && _self._buffer.clearSent(payload);\n            }\n\n\n            function _getPayloadArr(payload?: IPayloadData) {\n                try {\n                    if (payload) {\n                        let internalPayload = payload as IInternalPayloadData;\n                        let arr = internalPayload.oriPayload;\n                        if (arr && arr.length)  {\n                            return arr;\n                        }\n                        return null;\n                    }\n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return null;\n\n            }\n\n            function _validate(telemetryItem: ITelemetryItem, diagLogger?: IDiagnosticLogger) {\n                if (_disableTelemetry) {\n                    // Do not send/save data\n                    return false;\n                }\n    \n                // validate input\n                if (!telemetryItem) {\n                    diagLogger && _throwInternal(diagLogger, eLoggingSeverity.CRITICAL, _eInternalMessageId.CannotSendEmptyTelemetry, \"Cannot send empty telemetry\");\n                    return false;\n                }\n    \n                // validate event\n                if (telemetryItem.baseData && !telemetryItem.baseType) {\n                    diagLogger && _throwInternal(diagLogger, eLoggingSeverity.CRITICAL, _eInternalMessageId.InvalidEvent, \"Cannot send telemetry without baseData and baseType\");\n                    return false;\n                }\n    \n                if (!telemetryItem.baseType) {\n                    // Default\n                    telemetryItem.baseType = \"EventData\";\n                }\n    \n                // ensure a sender was constructed\n                if (!_self._sender) {\n                    diagLogger && _throwInternal(diagLogger, eLoggingSeverity.CRITICAL, _eInternalMessageId.SenderNotInitialized, \"Sender was not initialized\");\n                    return false;\n                }\n              \n                // check if this item should be sampled in, else add sampleRate tag\n                let sampleRate = (telemetryItem as any).sampleRate;\n                if (isNullOrUndefined(sampleRate) || !isNumber(sampleRate) || sampleRate < 0 || sampleRate > 100) {\n                    if (!_isSampledIn(telemetryItem)) {\n                        // Item is sampled out, do not send it\n                        diagLogger && _throwInternal(diagLogger, eLoggingSeverity.WARNING, _eInternalMessageId.TelemetrySampledAndNotSent,\n                            \"Telemetry item was sampled out and not sent\", { SampleRate: _self._sample.sampleRate });\n                        return false;\n                    } else {\n                        telemetryItem[SampleRate] = _self._sample.sampleRate;\n                    }\n                }\n                return true;\n            }\n\n            function _getEnvelope(telemetryItem: ITelemetryItem, diagLogger: IDiagnosticLogger) {\n                // construct an envelope that Application Insights endpoint can understand\n                // if ikey of telemetry is provided and not empty, envelope will use this iKey instead of senderConfig iKey\n                let defaultEnvelopeIkey = telemetryItem.iKey || _instrumentationKey;\n                let aiEnvelope = Sender.constructEnvelope(telemetryItem, defaultEnvelopeIkey, diagLogger, _convertUndefined);\n                if (!aiEnvelope) {\n                    _throwInternal(diagLogger, eLoggingSeverity.CRITICAL, _eInternalMessageId.CreateEnvelopeError, \"Unable to create an AppInsights envelope\");\n                    return;\n                }\n    \n                let doNotSendItem = false;\n                // this is for running in legacy mode, where customer may already have a custom initializer present\n                if (telemetryItem.tags && telemetryItem.tags[ProcessLegacy]) {\n                    arrForEach(telemetryItem.tags[ProcessLegacy], (callBack: (env: IEnvelope) => boolean | void) => {\n                        try {\n                            if (callBack && callBack(aiEnvelope) === false) {\n                                doNotSendItem = true;\n                                _warnToConsole(diagLogger, \"Telemetry processor check returns false\");\n                            }\n                        } catch (e) {\n                            // log error but dont stop executing rest of the telemetry initializers\n                            // doNotSendItem = true;\n                            _throwInternal(diagLogger,\n                                eLoggingSeverity.CRITICAL, _eInternalMessageId.TelemetryInitializerFailed, \"One of telemetry initializers failed, telemetry item will not be sent: \" + getExceptionName(e),\n                                { exception: dumpObj(e) }, true);\n                        }\n                    });\n    \n                    delete telemetryItem.tags[ProcessLegacy];\n                }\n                if (doNotSendItem) {\n                    return; // do not send, no need to execute next plugin\n                }\n                return aiEnvelope;\n            }\n\n            function _serialize(item: ITelemetryItem) {\n                let rlt = EMPTY_STR;\n                let diagLogger = _self.diagLog();\n                try {\n                    let valid = _validate(item, diagLogger);\n                    let envelope = null;\n                    if (valid) {\n                        envelope = _getEnvelope(item, diagLogger);\n                    }\n                    if (envelope) {\n                        rlt = _serializer.serialize(envelope);\n                    }\n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return rlt;\n               \n            }\n\n            function _batch(arr: string[]) {\n                let rlt = EMPTY_STR;\n                if (arr && arr.length) {\n                    rlt = \"[\" + arr.join(\",\") + \"]\";\n                }\n                return rlt;\n            }\n\n            function _createPayload(data: string |Uint8Array) {\n                let headers = _getHeaders();\n                return {\n                    urlString: _endpointUrl,\n                    data: data,\n                    headers: headers\n                } as IPayloadData;\n            }\n        \n            function _isSampledIn(envelope: ITelemetryItem): boolean {\n                return _self._sample.isSampledIn(envelope);\n            }\n\n            function _getOnComplete(payload: IInternalStorageItem[], status: number, headers: {[headerName: string]: string;}, response?: string) {\n\n                // ***********************************************************************************************\n                //TODO: handle other status codes\n                if (status === 200 && payload) {\n                    _self._onSuccess(payload, payload.length);\n                } else {\n                    response && _self._onError(payload, response);\n                }\n            }\n\n            function _doSend(sendInterface: IXHROverride, payload: IInternalStorageItem[], isAsync: boolean, markAsSent: boolean = true): void | IPromise<boolean> {\n                let onComplete = (status: number, headers: {[headerName: string]: string;}, response?: string) => {\n                    // let statsbeat = _getStatsBeat();\n                    // if (statsbeat) {\n                    //     statsbeat.count(status, payloadData, _endpointUrl);\n                    // }\n\n                    return _getOnComplete(payload, status, headers, response);\n                }\n                let payloadData = _getPayload(payload);\n                // if (payloadData) {\n                //     payloadData.statsBeatData = {startTime: dateNow()};\n                // }\n\n                let sendPostFunc:  SendPOSTFunction = sendInterface && sendInterface.sendPOST;\n                if (sendPostFunc && payloadData) {\n                    // ***********************************************************************************************\n                    // mark payload as sent at the beginning of calling each send function\n                    if (markAsSent) {\n                        _self._buffer.markAsSent(payload);\n                    }\n\n                    let result: void | IPromise<boolean>;\n                    let callbackExecuted = false;\n                    let resolveFn: any;\n                    let rejectFn: any;\n                    \n                    _sendPostMgr.preparePayload((processedPayload: IPayloadData) => {\n                        result = sendPostFunc(processedPayload, onComplete, !isAsync);\n                        callbackExecuted = true;\n                        if (resolveFn) {\n                            doAwait(result as any, resolveFn, rejectFn);\n                        }\n                    }, _zipPayload, payloadData, !isAsync);\n                    \n                    if (callbackExecuted) {\n                        return result;\n                    }\n                    \n                    // Callback was not executed synchronously, so we need to return a promise\n                    return createPromise<boolean>((resolve, reject) => {\n                        resolveFn = resolve;\n                        rejectFn = reject;\n                    });\n                }\n                return null;\n            }\n\n            function _getPayload(payload: IInternalStorageItem[]): IInternalPayloadData {\n                if (isArray(payload) && payload.length > 0) {\n                    let batch = _self._buffer.batchPayloads(payload);\n                    let headers = _getHeaders();\n                    let payloadData: IInternalPayloadData = {\n                        data: batch,\n                        urlString: _endpointUrl,\n                        headers: headers,\n                        disableXhrSync: _disableXhr,\n                        disableFetchKeepAlive: !_fetchKeepAlive,\n                        oriPayload: payload\n                    };\n                    return payloadData;\n                }\n                \n                return null;\n            }\n\n            function _getHeaders() {\n                try {\n                    let headers = _headers || {};\n                    if (isInternalApplicationInsightsEndpoint(_endpointUrl)) {\n                        headers[RequestHeaders[eRequestHeaders.sdkContextHeader]] = RequestHeaders[eRequestHeaders.sdkContextHeaderAppIdRequest];\n                    }\n                    return headers;\n\n                } catch(e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return null;\n            }\n\n            function _checkMaxSize(incomingPayload?: string): boolean {\n                let incomingSize = incomingPayload? incomingPayload.length : 0;\n                if ((_self._buffer.size() + incomingSize) > _maxBatchSizeInBytes) {\n                    if (!_offlineListener || _offlineListener.isOnline()) { // only trigger send when currently online\n                        _self.triggerSend(true, null, SendRequestReason.MaxBatchSize);\n                    }\n\n                    return true;\n                }\n                return false;\n            }\n\n            function _checkResponsStatus(status: number, payload: IInternalStorageItem[], responseUrl: string, countOfItemsInPayload: number, errorMessage: string, res: any) {\n                let response: IBackendResponse = null;\n                if (!_self._appId) {\n                    response = parseResponse(res);\n                    if (response && response.appId) {\n                        _self._appId = response.appId;\n                    }\n                }\n    \n                if ((status < 200 || status >= 300) && status !== 0) {\n\n                    // Update End Point url if permanent redirect or moved permanently\n                    // Updates the end point url before retry\n                    if(status === 301 || status === 307 || status === 308) {\n                        if(!_checkAndUpdateEndPointUrl(responseUrl)) {\n                            _self._onError(payload, errorMessage);\n                            return;\n                        }\n                    }\n\n                    if (_offlineListener && !_offlineListener.isOnline()) { // offline\n                        // Note: Don't check for status == 0, since adblock gives this code\n                        if (!_isRetryDisabled) {\n                            const offlineBackOffMultiplier = 10; // arbritrary number\n                            _resendPayload(payload, offlineBackOffMultiplier);\n        \n                            _throwInternal(_self.diagLog(),\n                                eLoggingSeverity.WARNING,\n                                _eInternalMessageId.TransmissionFailed, `. Offline - Response Code: ${status}. Offline status: ${!_offlineListener.isOnline()}. Will retry to send ${payload.length} items.`);\n                        }\n                        return;\n                    }\n                    if (!_isRetryDisabled && _isRetriable(status)) {\n                        _resendPayload(payload);\n                        _throwInternal(_self.diagLog(),\n                            eLoggingSeverity.WARNING,\n                            _eInternalMessageId.TransmissionFailed, \". \" +\n                            \"Response code \" + status + \". Will retry to send \" + payload.length + \" items.\");\n                    } else {\n                        _self._onError(payload, errorMessage);\n                    }\n                } else {\n                    // check if the xhr's responseURL or fetch's response.url is same as endpoint url\n                    // TODO after 10 redirects force send telemetry with 'redirect=false' as query parameter.\n                    _checkAndUpdateEndPointUrl(responseUrl);\n                    \n                    if (status === 206) {\n                        if (!response) {\n                            response = parseResponse(res);\n                        }\n    \n                        if (response && !_isRetryDisabled) {\n                            _self._onPartialSuccess(payload, response);\n                        } else {\n                            _self._onError(payload, errorMessage);\n                        }\n                    } else {\n                        _consecutiveErrors = 0;\n                        _self._onSuccess(payload, countOfItemsInPayload);\n                    }\n                }\n            }\n\n            function _checkAndUpdateEndPointUrl(responseUrl: string) {\n                // Maximum stamp specific redirects allowed(uncomment this when breeze is ready with not allowing redirects feature)\n                if(_stamp_specific_redirects >= 10) {\n                    //  _self._senderConfig.endpointUrl = () => Sender._getDefaultAppInsightsChannelConfig().endpointUrl()+\"/?redirect=false\";\n                    //  _stamp_specific_redirects = 0;\n                    return false;\n                }\n                if(!isNullOrUndefined(responseUrl) && responseUrl !== \"\") {\n                    if(responseUrl !== _endpointUrl) {\n                        _endpointUrl = responseUrl;\n                        ++_stamp_specific_redirects;\n                        return true;\n                    }\n                }\n                return false;\n            }\n\n            function _doUnloadSend(payload: IInternalStorageItem[], isAsync: boolean) {\n\n                if (_syncUnloadSender) {\n                    // We are unloading so always call the sender with sync set to false\n                    _syncUnloadSender(payload, false);\n                } else {\n                    \n                    // Fallback to the previous beacon Sender (which causes a CORB warning on chrome now)\n                    let beaconInst = _sendPostMgr && _sendPostMgr.getSenderInst([TransportType.Beacon], true);\n                    return _doSend(beaconInst, payload, isAsync);\n                }\n            }\n\n            function _onBeaconRetry(payload: IPayloadData, onComplete: OnCompleteCallback, canSend:(payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => boolean) {\n\n                let internalPayload = payload as IInternalPayloadData;\n                let data = internalPayload  && internalPayload.oriPayload;\n                if (!_disableBeaconSplit) {\n                    // Failed to send entire payload so try and split data and try to send as much events as possible\n                    let droppedPayload: IInternalStorageItem[] = [];\n                    for (let lp = 0; lp < data.length; lp++) {\n                        const thePayload = data[lp];\n                        let arr = [thePayload];\n                        let item = _getPayload(arr);\n                        if (!canSend(item, onComplete)) {\n                            // Can't send anymore, so split the batch and drop the rest\n                            droppedPayload.push(thePayload);\n                        } else {\n                            _self._onSuccess(arr, arr.length);\n                        }\n                    }\n                    if (droppedPayload.length > 0) {\n                        _fallbackSend && _fallbackSend(droppedPayload, true);\n                        _throwInternal(_self.diagLog(), eLoggingSeverity.WARNING, _eInternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API, retried with normal sender.\");\n                    }\n                } else {\n                    _fallbackSend && _fallbackSend(data, true);\n                    _throwInternal(_self.diagLog(), eLoggingSeverity.WARNING, _eInternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API, retried with normal sender.\");\n                }\n\n            }\n\n            function _isStringArr(arr: string[] | IInternalStorageItem[]) {\n                try {\n                    if (arr && arr.length){\n                        return (isString(arr[0]));\n                    }\n\n                } catch(e) {\n                    //TODO: log, sender use IInternalStorageItem instead of string since 3.1.3\n                }\n                return null;\n                \n            }\n\n\n            function _fetchKeepAliveSender(payload: IInternalStorageItem[], isAsync: boolean) {\n             \n                let transport  = null;\n                if (isArray(payload)) {\n                    let payloadSize = payload.length;\n                    for (let lp = 0; lp < payload.length; lp++) {\n                        payloadSize += payload[lp].item.length;\n                    }\n\n                    let syncFetchPayload = _sendPostMgr.getSyncFetchPayload();\n\n                    if ((syncFetchPayload + payloadSize) <= FetchSyncRequestSizeLimitBytes) {\n                        transport = TransportType.Fetch;\n                    } else if (isBeaconsSupported()) {\n                        // Fallback to beacon sender as we at least get told which events can't be scheduled\n                        transport = TransportType.Beacon;\n                    } else {\n                        // Payload is going to be too big so just try and send via XHR\n                        transport = TransportType.Xhr;\n                        _throwInternal(_self.diagLog(), eLoggingSeverity.WARNING, _eInternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API, retried with xhrSender.\");\n                    }\n                    let inst = _sendPostMgr && _sendPostMgr.getSenderInst([transport], true);\n                    return _doSend(inst, payload, isAsync);\n                }\n                return null;\n\n            }\n\n            /**\n             * Resend payload. Adds payload back to the send buffer and setup a send timer (with exponential backoff).\n             * @param payload\n             */\n            function _resendPayload(payload: IInternalStorageItem[], linearFactor: number = 1) {\n                if (!payload || payload.length === 0) {\n                    return;\n                }\n        \n                const buffer = _self._buffer;\n                buffer.clearSent(payload);\n                _consecutiveErrors++;\n        \n                for (const item of payload) {\n                    item.cnt = item.cnt || 0; // to make sure we have cnt for each payload\n                    item.cnt ++; // when resend, increase cnt\n                    buffer.enqueue(item);\n                }\n        \n                // setup timer\n                _setRetryTime(linearFactor);\n                _setupTimer();\n            }\n        \n            /**\n             * Calculates the time to wait before retrying in case of an error based on\n             * http://en.wikipedia.org/wiki/Exponential_backoff\n             */\n            function _setRetryTime(linearFactor: number) {\n                const SlotDelayInSeconds = 10;\n                let delayInSeconds: number;\n        \n                if (_consecutiveErrors <= 1) {\n                    delayInSeconds = SlotDelayInSeconds;\n                } else {\n                    const backOffSlot = (Math.pow(2, _consecutiveErrors) - 1) / 2;\n                    // tslint:disable-next-line:insecure-random\n                    let backOffDelay = mathFloor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                    backOffDelay = linearFactor * backOffDelay;\n                    delayInSeconds = mathMax(mathMin(backOffDelay, 3600), SlotDelayInSeconds);\n                }\n        \n                // TODO: Log the backoff time like the C# version does.\n                const retryAfterTimeSpan = dateNow() + (delayInSeconds * 1000);\n        \n                // TODO: Log the retry at time like the C# version does.\n                _retryAt = retryAfterTimeSpan;\n            }\n        \n            /**\n             * Sets up the timer which triggers actually sending the data.\n             */\n            function _setupTimer() {\n                if (!_timeoutHandle && !_paused) {\n                    const retryInterval = _retryAt ? mathMax(0, _retryAt - dateNow()) : 0;\n                    const timerValue = mathMax(_maxBatchInterval, retryInterval);\n        \n                    _timeoutHandle = scheduleTimeout(() => {\n                        _timeoutHandle = null;\n                        _self.triggerSend(true, null, SendRequestReason.NormalSchedule);\n                    }, timerValue);\n                }\n            }\n\n            function _clearScheduledTimer() {\n                _timeoutHandle && _timeoutHandle.cancel();\n                _timeoutHandle = null;\n                _retryAt = null;\n            }\n        \n            /**\n             * Checks if the SDK should resend the payload after receiving this status code from the backend.\n             * @param statusCode\n             */\n            function _isRetriable(statusCode: number): boolean {\n                // retryCodes = [] means should not retry\n                if (!isNullOrUndefined(_retryCodes)) {\n                    return _retryCodes.length && _retryCodes.indexOf(statusCode) > -1;\n                }\n\n                return statusCode === 401 // Unauthorized\n                    // Removing as private links can return a 403 which causes excessive retries and session storage usage\n                    // || statusCode === 403 // Forbidden\n                    || statusCode === 408 // Timeout\n                    || statusCode === 429 // Too many requests.\n                    || statusCode === 500 // Internal server error.\n                    || statusCode === 502 // Bad Gateway.\n                    || statusCode === 503 // Service unavailable.\n                    || statusCode === 504; // Gateway timeout.\n            }\n        \n            // Using function lookups for backward compatibility as the getNotifyMgr() did not exist until after v2.5.6\n            function _getNotifyMgr() : INotificationManager {\n                const func = \"getNotifyMgr\";\n                let result: INotificationManager;\n                let core = _self.core;\n                if (core) {\n                    // During page unload the core may have been cleared and some async events may not have been sent yet\n                    // resulting in the core being null. In this case we don't want to create a statsbeat instance\n\n                    if (core[func]) {\n                        result = core[func]();\n                    } else {\n                        // using _self.core['_notificationManager'] for backward compatibility\n                        result = (core as any)[\"_notificationManager\"];\n                    }\n                }\n\n                return result;\n            }\n\n            function _notifySendRequest(sendRequest: SendRequestReason, isAsync: boolean) {\n                let manager = _getNotifyMgr();\n                if (manager && manager.eventsSendRequest) {\n                    try {\n                        manager.eventsSendRequest(sendRequest, isAsync);\n                    } catch (e) {\n                        _throwInternal(_self.diagLog(), eLoggingSeverity.CRITICAL,\n                            _eInternalMessageId.NotificationException,\n                            \"send request notification failed: \" + getExceptionName(e),\n                            { exception: dumpObj(e) });\n                    }\n                }\n            }\n\n            \n\n            /**\n             * Validate UUID Format\n             * Specs taken from https://tools.ietf.org/html/rfc4122 and breeze repo\n             */\n            function _validateInstrumentationKey(instrumentationKey: string, config: IConfiguration & IConfig) :boolean {\n                let disableValidation = config.disableInstrumentationKeyValidation;\n                const disableIKeyValidationFlag = isNullOrUndefined(disableValidation) ? false : disableValidation;\n                if(disableIKeyValidationFlag) {\n                    return true;\n                }\n\n                const UUID_Regex = \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n                const regexp = new RegExp(UUID_Regex);\n                return regexp.test(instrumentationKey);\n            }\n        \n            function _initDefaults() {\n                _self._sender = null;\n                _self._buffer = null;\n                _self._appId = null;\n                _self._sample = null;\n                _headers = {};\n                _offlineListener = null;\n                _consecutiveErrors = 0;\n                _retryAt = null;\n                _lastSend = null;\n                _paused = false;\n                _timeoutHandle = null;\n                _serializer = null;\n                _stamp_specific_redirects = 0;\n                _syncFetchPayload = 0;\n                _syncUnloadSender = null;\n                _evtNamespace = null;\n                _endpointUrl = null;\n                _orgEndpointUrl = null;\n                _maxBatchSizeInBytes = 0;\n                _beaconSupported = false;\n                _customHeaders = null;\n                _disableTelemetry = false;\n                _instrumentationKey = null;\n                _convertUndefined = UNDEFINED_VALUE;\n                _isRetryDisabled = false;\n                _sessionStorageUsed = null;\n                _namePrefix = UNDEFINED_VALUE;\n                _disableXhr = false;\n                _fetchKeepAlive = false;\n                _disableBeaconSplit = false;\n                _xhrSend = null;\n                _fallbackSend = null;\n                _sendPostMgr = null;\n\n                objDefine(_self, \"_senderConfig\", {\n                    g: function() {\n                        return objExtend({}, defaultAppInsightsChannelConfig);\n                    }\n                });\n            }\n        });\n    }\n\n    /**\n     * Pause the sending (transmission) of events, this will cause all events to be batched only until the maximum limits are\n     * hit at which point new events are dropped. Will also cause events to NOT be sent during page unload, so if Session storage\n     * is disabled events will be lost.\n     * SessionStorage Limit is 2000 events, In-Memory (Array) Storage is 10,000 events (can be configured via the eventsLimitInMem).\n     */\n    public pause(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resume the sending (transmission) of events, this will restart the timer and any batched events will be sent using the normal\n     * send interval.\n     */\n    public resume(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Flush to send data immediately; channel should default to sending data asynchronously. If executing asynchronously (the default) and\n     * you DO NOT pass a callback function then a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the flush is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - send data asynchronously when true\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @param sendReason - specify the reason that you are calling \"flush\" defaults to ManualFlush (1) if not specified\n     * @returns - If a callback is provided `true` to indicate that callback will be called after the flush is complete otherwise the caller\n     * should assume that any provided callback will never be called, Nothing or if occurring asynchronously a\n     * [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) which will be resolved once the unload is complete,\n     * the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) will only be returned when no callback is provided\n     * and isAsync is true.\n     */\n    public flush(isAsync: boolean = true, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Flush the batched events synchronously (if possible -- based on configuration).\n     * Will not flush if the Send has been paused.\n     */\n    public onunloadFlush() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public processTelemetry(telemetryItem: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * xhr state changes\n     * @deprecated\n     * since version 3.2.0, if the payload is string[], this function is no-op (string[] is only used for backwards Compatibility)\n     */\n    public _xhrReadyStateChange(xhr: XMLHttpRequest, payload: string[] | IInternalStorageItem[], countOfItemsInPayload: number) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        // TODO: no-op\n        // add note to users, this will be removed\n    }\n\n    /**\n     * Trigger the immediate send of buffered data; If executing asynchronously (the default) this may (not required) return\n     * an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) that will resolve once the\n     * send is complete. The actual implementation of the `IPromise` will be a native Promise (if supported) or the default\n     * as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - Indicates if the events should be sent asynchronously\n     * @param forcedSender - Indicates the forcedSender, undefined if not passed\n     * @returns - Nothing or optionally, if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * which will be resolved (or reject) once the send is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * should only be returned when isAsync is true.\n     */\n    public triggerSend(isAsync = true, forcedSender?: SenderFunction, sendReason?: SendRequestReason): void | IPromise<boolean> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * error handler\n     * @internal\n     * since version 3.2.0, if the payload is string[], this function is no-op (string[] is only used for backwards Compatibility)\n     */\n    public _onError(payload: string[] | IInternalStorageItem[], message: string, event?: ErrorEvent) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * partial success handler\n     * @internal\n     * since version 3.2.0, if the payload is string[], this function is no-op (string[] is only used for backwards Compatibility)\n     */\n    public _onPartialSuccess(payload: string[] | IInternalStorageItem[], results: IBackendResponse) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * success handler\n     * @internal\n     * since version 3.2.0, if the payload is string[], this function is no-op (string[] is only used for backwards Compatibility)\n     */\n    public _onSuccess(payload: string[] | IInternalStorageItem[], countOfItemsInPayload: number) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * xdr state changes\n     * @deprecated\n     * since version 3.2.0, if the payload is string[], this function is no-op (string[] is only used for backwards Compatibility)\n     */\n    public _xdrOnLoad(xdr: IXDomainRequest, payload: string[] | IInternalStorageItem[]) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add header to request\n     * @param name - Header name.\n     * @param value - Header value.\n     */\n    public addHeader(name: string, value: string) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Check if there are no active requests being sent.\n     * @returns True if idle, false otherwise.\n     */\n    public isCompletelyIdle(): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n    /**\n     * Get Offline Serializer support\n     * @returns internal Offline Serializer object\n     */\n    public getOfflineSupport(): IInternalOfflineSupport {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get Offline listener\n     * @returns offlineListener\n     * @since 3.3.4\n     */\n    public getOfflineListener(): IOfflineListener {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/Serializer.ts",
    "content": "import dynamicProto from \"@microsoft/dynamicproto-js\"\nimport {\n    IDiagnosticLogger, _eInternalMessageId, _throwInternal, eLoggingSeverity, getJSON, isArray, isFunction, isNullOrUndefined, isObject, objForEachKey\n} from \"@microsoft/applicationinsights-core-js\";\nimport { FieldType, ISerializable } from \"@microsoft/applicationinsights-core-js\";\n\nconst enum eSerializeType {\n    String = 1,\n    Number = 2\n}\n\n/**\n * Used to \"tag\" objects that are currently being serialized to detect circular references\n */\nconst circularReferenceCheck = \"__aiCircularRefCheck\";\n\nfunction _serializeObject(logger: IDiagnosticLogger, source: ISerializable, name: string): any {\n    let output: any = {};\n\n    if (!source) {\n        _throwInternal(logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.CannotSerializeObject, \"cannot serialize object because it is null or undefined\", { name }, true);\n        return output;\n    }\n\n    if ((source as any)[circularReferenceCheck]) {\n        _throwInternal(logger, eLoggingSeverity.WARNING, _eInternalMessageId.CircularReferenceDetected, \"Circular reference detected while serializing object\", { name }, true);\n        return output;\n    }\n\n    if (!source.aiDataContract) {\n        // special case for measurements/properties/tags\n        if (name === \"measurements\") {\n            output = _serializeStringMap(logger, source, eSerializeType.Number, name);\n        } else if (name === \"properties\") {\n            output = _serializeStringMap(logger, source, eSerializeType.String, name);\n        } else if (name === \"tags\") {\n            output = _serializeStringMap(logger, source, eSerializeType.String, name);\n        } else if (isArray(source)) {\n            output = _serializeArray(logger, source as any, name);\n        } else {\n            _throwInternal(logger, eLoggingSeverity.WARNING, _eInternalMessageId.CannotSerializeObjectNonSerializable, \"Attempting to serialize an object which does not implement ISerializable\", { name }, true);\n\n            try {\n                // verify that the object can be stringified\n                getJSON().stringify(source);\n                output = source;\n            } catch (e) {\n                // if serialization fails return an empty string\n                _throwInternal(logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.CannotSerializeObject, (e && isFunction(e.toString)) ? e.toString() : \"Error serializing object\", null, true);\n            }\n        }\n\n        return output;\n    }\n\n    (source as any)[circularReferenceCheck] = true;\n    objForEachKey(source.aiDataContract, (field, contract) => {\n        const fieldType = isFunction(contract) ? contract() : contract;\n        const isRequired =  fieldType & FieldType.Required;\n        const isHidden = fieldType & FieldType.Hidden;\n        const isArray = fieldType & FieldType.Array;\n        const isPresent = (source as any)[field] !== undefined;\n        const isObj = isObject((source as any)[field]) && (source as any)[field] !== null;\n\n        if (isRequired && !isPresent && !isArray) {\n            _throwInternal(logger,\n                eLoggingSeverity.CRITICAL,\n                _eInternalMessageId.MissingRequiredFieldSpecification,\n                \"Missing required field specification. The field is required but not present on source\",\n                { field, name });\n\n            // If not in debug mode, continue and hope the error is permissible\n        } else if (!isHidden) {  // Don't serialize hidden fields\n            let value;\n            if (isObj) {\n                if (isArray) {\n                    // special case; recurse on each object in the source array\n                    value = _serializeArray(logger, (source as any)[field], field);\n                } else {\n                    // recurse on the source object in this field\n                    value = _serializeObject(logger, (source as any)[field], field);\n                }\n            } else {\n                // assign the source field to the output even if undefined or required\n                value = (source as any)[field];\n            }\n\n            // only emit this field if the value is defined\n            if (value !== undefined) {\n                output[field] = value;\n            }\n        }\n    });\n\n    delete (source as any)[circularReferenceCheck];\n    return output;\n}\n\nfunction _serializeArray(logger: IDiagnosticLogger, sources: ISerializable[], name: string): any[] {\n    let output: any[];\n\n    if (!!sources) {\n        if (!isArray(sources)) {\n            _throwInternal(logger,\n                eLoggingSeverity.CRITICAL,\n                _eInternalMessageId.ItemNotInArray,\n                \"This field was specified as an array in the contract but the item is not an array.\\r\\n\",\n                { name }, true);\n        } else {\n            output = [];\n            for (let i = 0; i < sources.length; i++) {\n                const source = sources[i];\n                const item = _serializeObject(logger, source, name + \"[\" + i + \"]\");\n                output.push(item);\n            }\n        }\n    }\n\n    return output;\n}\n\nfunction _serializeStringMap(logger: IDiagnosticLogger, map: any, expectedType: eSerializeType, name: string) {\n    let output: any;\n    if (map) {\n        output = {};\n        objForEachKey(map, (field, value) => {\n            let serializedValue: string | number;\n            if (value === undefined) {\n                serializedValue = \"undefined\";\n            } else if (value === null) {\n                serializedValue = \"null\";\n            }\n\n            if (expectedType === eSerializeType.String && !serializedValue) {\n                if (!value.toString) {\n                    serializedValue = \"invalid field: toString() is not defined.\";\n                } else {\n                    serializedValue = value.toString();\n                }\n            } else if (expectedType === eSerializeType.Number && !serializedValue) {\n                serializedValue = parseFloat(value);\n            }\n\n            if (serializedValue || !isNullOrUndefined(value)) {\n                output[field] = serializedValue;\n            }\n        });\n    }\n\n    return output;\n}\n\nexport class Serializer {\n\n    constructor(logger: IDiagnosticLogger) {\n        dynamicProto(Serializer, this, (_self) => {\n            /**\n             * Serializes the current object to a JSON string.\n             */\n            _self.serialize = (input: ISerializable): string => {\n                const output = _serializeObject(logger, input, \"root\");\n                try {\n                    return getJSON().stringify(output);\n                } catch (e) {\n                    // if serialization fails return an empty string\n                    _throwInternal(logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.CannotSerializeObject, (e && isFunction(e.toString)) ? e.toString() : \"Error serializing object\", null, true);\n                }\n            }\n        });\n    }\n\n    /**\n     * Serializes the current object to a JSON string.\n     */\n    public serialize(input: ISerializable): string {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/Telemetry/Common/Data.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AIData, FieldType, ISerializable } from \"@microsoft/applicationinsights-core-js\";\n\nexport function _createData<TDomain>(baseType: string, data: TDomain): AIData<TDomain> & ISerializable {\n    return {\n        baseType: baseType,\n        baseData: data,\n        aiDataContract: {\n            baseType: FieldType.Required,\n            baseData: FieldType.Required\n        }\n    };\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/Telemetry/RemoteDependencyData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    FieldType, IDiagnosticLogger, IRemoteDependencyData, ISerializable, dataSanitizeMeasurements, dataSanitizeProperties, dataSanitizeString,\n    dataSanitizeUrl, msToTimeSpan, urlParseUrl\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport const RemoteDependencyEnvelopeType = \"Microsoft.ApplicationInsights.{0}.RemoteDependency\";\n\nfunction AjaxHelperParseDependencyPath(logger: IDiagnosticLogger, absoluteUrl: string, method: string, commandName: string) {\n    let target, name = commandName, data = commandName;\n\n    if (absoluteUrl && absoluteUrl.length > 0) {\n        const parsedUrl: HTMLAnchorElement = urlParseUrl(absoluteUrl);\n        target = parsedUrl.host;\n        if (!name) {\n            if (parsedUrl.pathname != null) {\n                let pathName: string = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                if (pathName.charAt(0) !== \"/\") {\n                    pathName = \"/\" + pathName;\n                }\n                data = parsedUrl.pathname;\n                name = dataSanitizeString(logger, method ? method + \" \" + pathName : pathName);\n            } else {\n                name = dataSanitizeString(logger, absoluteUrl);\n            }\n        }\n    } else {\n        target = commandName;\n        name = commandName;\n    }\n\n    return {\n        target,\n        name,\n        data\n    };\n}\n\nexport function createRemoteDependencyData(\n    logger: IDiagnosticLogger, id: string, absoluteUrl: string, commandName: string, value: number, success: boolean,\n    resultCode: number, method?: string, requestAPI: string = \"Ajax\", correlationContext?: string, properties?: Object,\n    measurements?: Object) : IRemoteDependencyData & ISerializable {\n    const dependencyFields = AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName);\n\n    let data: IRemoteDependencyData & ISerializable = {\n        ver: 2,\n        id: id,\n        duration: msToTimeSpan(value),\n        success: success,\n        resultCode: \"\" + resultCode,\n        type: dataSanitizeString(logger, requestAPI),\n        data: dataSanitizeUrl(logger, commandName) || dependencyFields.data, // get a value from hosturl if commandName not available\n        target: dataSanitizeString(logger, dependencyFields.target),\n        name: dataSanitizeString(logger, dependencyFields.name),\n        properties: dataSanitizeProperties(logger, properties),\n        measurements: dataSanitizeMeasurements(logger, measurements),\n\n        aiDataContract: {\n            id: FieldType.Required,\n            ver: FieldType.Required,\n            name: FieldType.Default,\n            resultCode: FieldType.Default,\n            duration: FieldType.Default,\n            success: FieldType.Default,\n            data: FieldType.Default,\n            target: FieldType.Default,\n            type: FieldType.Default,\n            properties: FieldType.Default,\n            measurements: FieldType.Default,\n\n            kind: FieldType.Default,\n            value: FieldType.Default,\n            count: FieldType.Default,\n            min: FieldType.Default,\n            max: FieldType.Default,\n            stdDev: FieldType.Default,\n            dependencyKind: FieldType.Default,\n            dependencySource: FieldType.Default,\n            commandName: FieldType.Default,\n            dependencyTypeName: FieldType.Default\n        }\n    };\n\n    if (correlationContext) {\n        data.target = \"\" + data.target + \" | \" + correlationContext;\n    }\n\n    return data;\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/Telemetry/RequestData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    FieldType, IDiagnosticLogger, ISerializable, asString, dataSanitizeMeasurements, dataSanitizeProperties, dataSanitizeString,\n    dataSanitizeUrl, msToTimeSpan\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IRequestData } from \"../Interfaces/Contracts/IRequestData\";\n\nexport const RequestEnvelopeType = \"Microsoft.ApplicationInsights.{0}.Request\";\n\n/**\n * Constructs a new instance of the RequestData object\n */\nexport function createRequestData(logger: IDiagnosticLogger, id: string, name: string | undefined, value: number, success: boolean, responseCode: number, source?: string, url?: string, properties?: Object, measurements?: Object): IRequestData & ISerializable {\n    return {\n        ver: 2,\n        id: id,\n        name: dataSanitizeString(logger, name),\n        duration: msToTimeSpan(value),\n        success: success,\n        responseCode: asString(responseCode || \"0\"),\n        source: dataSanitizeString(logger, source),\n        url: dataSanitizeUrl(logger, url),\n        properties: dataSanitizeProperties(logger, properties),\n        measurements: dataSanitizeMeasurements(logger, measurements),\n        aiDataContract: {\n            id: FieldType.Required,\n            ver: FieldType.Required,\n            name: FieldType.Default,\n            responseCode: FieldType.Required,\n            duration: FieldType.Required,\n            success: FieldType.Required,\n            source: FieldType.Default,\n            url: FieldType.Default,\n            properties: FieldType.Default,\n            measurements: FieldType.Default\n        }\n    };\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/TelemetryProcessors/Sample.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IDiagnosticLogger, ISample, ITelemetryItem, MetricDataType, _eInternalMessageId, _throwInternal, eLoggingSeverity\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IScoreGenerator, createSamplingScoreGenerator } from \"./SamplingScoreGenerators/SamplingScoreGenerator\";\n\nfunction _isSampledIn(envelope: ITelemetryItem, samplingPercentage: number, scoreGenerator: IScoreGenerator): boolean {\n    let isSampledIn = false;\n\n    if (samplingPercentage === null || samplingPercentage === undefined || samplingPercentage >= 100) {\n        isSampledIn = true;\n    } else if (envelope.baseType === MetricDataType) {\n        // exclude MetricData telemetry from sampling\n        isSampledIn = true;\n    }\n\n    if (!isSampledIn) {\n        isSampledIn = scoreGenerator.getScore(envelope) < samplingPercentage;\n    }\n    \n    return isSampledIn;\n}\n\nexport function createSampler(sampleRate: number, logger?: IDiagnosticLogger): ISample {\n    let _samplingScoreGenerator = createSamplingScoreGenerator();\n    \n    if (sampleRate > 100 || sampleRate < 0) {\n        _throwInternal(logger, eLoggingSeverity.WARNING,\n            _eInternalMessageId.SampleRateOutOfRange,\n            \"Sampling rate is out of range (0..100). Sampling will be disabled, you may be sending too much data which may affect your AI service level.\",\n            { samplingRate: sampleRate }, true);\n        sampleRate = 100;\n    }\n\n    let sampler: ISample & { generator: IScoreGenerator } = {\n        sampleRate: sampleRate,\n        generator: _samplingScoreGenerator,\n        isSampledIn: function (envelope: ITelemetryItem) {\n            return _isSampledIn(envelope, sampler.sampleRate, sampler.generator);\n        }\n    };\n\n    return sampler;\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/TelemetryProcessors/SamplingScoreGenerators/HashCodeScoreGenerator.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { mathAbs } from \"@nevware21/ts-utils\";\n\n// (Magic number) DJB algorithm can't work on shorter strings (results in poor distribution\nconst MIN_INPUT_LENGTH: number = 8;\n\n// We're using 32 bit math, hence max value is (2^31 - 1)\nconst INT_MAX_VALUE: number = 2147483647;\n\nexport function getHashCodeScore(key: string): number {\n    let score = 0;\n    let input = key;\n\n    if (input) {\n        while (input.length < MIN_INPUT_LENGTH) {\n            input = input.concat(input);\n        }\n\n        // 5381 is a magic number: http://stackoverflow.com/questions/10696223/reason-for-5381-number-in-djb-hash-function\n        let hash: number = 5381;\n\n        for (let i: number = 0; i < input.length; ++i) {\n            hash = ((hash << 5) + hash) + input.charCodeAt(i);\n            // 'hash' is of number type which means 53 bit integer (http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types-number-type)\n            // 'hash & hash' will keep it 32 bit integer - just to make it clearer what the result is.\n            hash = hash & hash;\n        }\n\n        score = mathAbs(hash) / INT_MAX_VALUE;\n    }\n\n    return score * 100;\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/TelemetryProcessors/SamplingScoreGenerators/SamplingScoreGenerator.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ContextTagKeys, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\nimport { getHashCodeScore } from \"./HashCodeScoreGenerator\";\n\nexport interface IScoreGenerator {\n    getScore(item: ITelemetryItem): number;\n}\n\nexport function createSamplingScoreGenerator(): IScoreGenerator {\n    let keys: ContextTagKeys = new ContextTagKeys();\n\n    return {\n        getScore: (item: ITelemetryItem): number => {\n            let score: number = 0;\n            if (item.tags && item.tags[keys.userId]) { // search in tags first, then ext\n                score = getHashCodeScore(item.tags[keys.userId]);\n            } else if (item.ext && item.ext.user && item.ext.user.id) {\n                score = getHashCodeScore(item.ext.user.id);\n            } else if (item.tags && item.tags[keys.operationId]) { // search in tags first, then ext\n                score = getHashCodeScore(item.tags[keys.operationId]);\n            } else if (item.ext && item.ext.telemetryTrace && item.ext.telemetryTrace.traceID) {\n                score = getHashCodeScore(item.ext.telemetryTrace.traceID);\n            } else {\n                // tslint:disable-next-line:insecure-random\n                score = (Math.random() * 100);\n            }\n    \n            return score;\n        }\n    };\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/src/applicationinsights-channel-js.ts",
    "content": "export { Sender } from \"./Sender\";\nexport { ISenderConfig } from \"./Interfaces\";\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "channels/applicationinsights-channel-js/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"prefer-conditional-expression\": false\n    }\n}\n"
  },
  {
    "path": "channels/applicationinsights-channel-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-channel-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-channel-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/channels/applicationinsights-channel-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-channel-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "channels/offline-channel-js/.gitignore",
    "content": "/node_modules\n*.user\n/bundle\n/.vs\n/docs\n/dist-es5\n/dist\ntest/debug.log\n"
  },
  {
    "path": "channels/offline-channel-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es5/**\n!dist/**\n!bundle/**\n!types/**\n"
  },
  {
    "path": "channels/offline-channel-js/CODE_OF_CONDUCT.md",
    "content": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n\nResources:\n\n- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)\n- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\n- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns\n"
  },
  {
    "path": "channels/offline-channel-js/CONTRIBUTING.md",
    "content": "# Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "channels/offline-channel-js/LICENSE.TXT",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "channels/offline-channel-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at <https://go.microsoft.com/fwlink/?LinkID=824704>. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n"
  },
  {
    "path": "channels/offline-channel-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Offline Channel\n\n## [Beta]\n\n## Description\n\nThe Offline Channel supports the saving of events when your application is offline and resending those events when the application is online.\n\n### Note\n\n- A post or sender channel is required for processing online events.\n- Request header details will be stored in local/session storage or IndexedDB based on your configuration.\n- If you are using the default endpoint `https://dc.services.visualstudio.com` for Application Insights, partial success is currently considered as success and events not sent in partial success will be dropped.\n\n## Configuration\n\n[`IOfflineChannelConfiguration`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html)\n\n| Name | Type | Default | Description |\n|------|------|---------|-------------|\n| [maxStorageSizeInBytes](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#maxStorageSizeInBytes) | [Optional]| 5000000 | The max size in bytes that should be used for storing events in local/session storage. |\n| [storageKeyPrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#storageKeyPrefix) | [Optional] | AIOffline | The storage key prefix that should be used when storing events in persistent storage. |\n| [minPersistenceLevel](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#minPersistenceLevel) | [Optional] | `EventPersistence.Normal` or 1 | Identifies the minimum level that will be cached in the offline channel. Valid values of this setting are defined by the `EventPersistence` enum, currently Normal (1) and Critical (2) with the default value being Normal (1), which means all events without a persistence level set or with invalid persistence level will be marked as Normal(1) events.|\n| [providers](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#providers) | [Optional] | [`eStorageProviders.LocalStorage, eStorageProviders.IndexedDB`]|  Identifies the StorageProviders that should be used by the system if available, the first available provider will be used. Valid available values are defined by the `eStorageProviders` enum. </br> Note: LocalStorage will be used to save unload events even if it is not in the providers list. |\n| [eventsLimitInMem](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#eventsLimitInMem) | [Optional] | null | Identifies the maximum number of events to store in memory before sending to persistent storage. |\n| [autoClean](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#autoClean) | [Optional] | false | Identifies if events that have existed in storage longer than the maximum allowed time (configured in inStorageMaxTime) should be cleaned after connection with storage. |\n| [inMemoMaxTime](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#inMemoMaxTime) | [Optional] | 15000 | Identifies the maximum time in ms that items should be in memory before being saved into storage. |\n| [inStorageMaxTime](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#inStorageMaxTime) | [Optional] | 10080000 (around 7days) | Identifies the maximum time in ms that items should be in the configured persistent storage. |\n| [maxRetry](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#maxRetry) | [Optional] | 1 | Identifies the maximum retry times for an event batch. |\n| [primaryOnlineChannelId](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#primaryOnlineChannelId) | [Optional] | `[AppInsightsChannelPlugin, PostChannel]` | Identifies online channel IDs in order. The first available one will be used. |\n| [maxBatchsize](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#maxBatchsize) | [Optional] | 63000 | Identifies the maximum size per batch in bytes that is saved in persistent storage. |\n| [senderCfg](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#senderCfg) | [Optional] | `IOfflineSenderConfig` | Identifies offline sender properties. |\n| [maxSentBatchInterval](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#maxSentBatchInterval) | [Optional] | 15000 | Identifies the interval time in ms that previously stored offline event batches should be sent under online status. |\n| [EventsToDropPerTime](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#EventsToDropPerTime) | [Optional] | 10 | Identifies the maximum event batch count when cleaning or releasing space for persistent storage per time. |\n| [maxCriticalEvtsDropCnt](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#maxCriticalEvtsDropCnt) | [Optional] | 2 | Identifies the maximum critical events count for an event batch to be able to drop when releasing space for persistent storage per time. |\n| [overrideInstrumentationKey](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineChannelConfiguration.html#overrideInstrumentationKey) | [Optional] | null | Identifies overridden for the Instrumentation key when the offline channel calls `processTelemetry`. |\n\n### [IOfflineSenderConfig](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineSenderConfig.html)\n\n| Name | Type | Default | Description |\n|------|------|---------|-------------|\n| [retryCodes](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineSenderConfig.html#retryCodes) | [Optional] | `[401, 403, 408, 429, 500, 502, 503, 504]` | Identifies status codes for re-sending event batches. |\n| [transports](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineSenderConfig.html#transports) | [Optional] | null | Either an array or single value identifying the requested TransportType type(s) that should be used for sending events. If not defined, the same transports will be used in the channel with the `primaryOnlineChannelI`. |\n| [httpXHROverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineSenderConfig.html#httpXHROverride) | [Optional] | null | The HTTP override that should be used to send requests, as an `IXHROverride` object. |\n| [alwaysUseXhrOverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-offlinechannel-js/interfaces/IOfflineSenderConfig.html#alwaysUseXhrOverride) | [Optional] | false | Identifies if provided httpXhrOverride will always be used. |\n\n## Basic Usage\n\n### NPM Setup\n\n```js\nimport { OfflineChannel, eStorageProviders } from \"@microsoft/applicationinsights-offlinechannel-js\";\n\nlet offlineChannel = new OfflineChannel();\nlet coreConfig = {\n    connectionString: \"YOUR_CONNECTION_STRING\",\n    extensionConfig: {\n        [offlineChannel.identifier]: {\n            providers: [eStorageProviders.LocalStorage, eStorageProviders.IndexedDb],\n            minPersistenceLevel:  2, // only events with PersistenceLevel >=2 will be saved/sent\n        } // Add config for offline support channel\n    }\n};\nlet appInsights = new ApplicationInsights({config: coreConfig});\nappInsights.loadAppInsights();\n// this is to make sure offline channel is initialized after sender channel\nappInsights.addPlugin(offlineChannel);\n\n// get offlineListener to set online/offline status\nlet offlineListener = offlineChannel.getOfflineListener();\n\n\n// set application status to online \nofflineListener.setOnlineState(1);\n// offline channel will not process events when the status is online\nappInsights.track({ name:\"onlineEvent\" }); // sender channel will send this event\n\n// set application status to offline\nofflineListener.setOnlineState(2);\n// offline channel will process and save this event to the configured persistent storage\n// the event will be sent when the application status is online again\nappInsights.track({ name:\"offlineEvent\" });\n\n```\n\n## Contributing\n\nRead our [contributing guide](./CONTRIBUTING.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Application Insights.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at <https://go.microsoft.com/fwlink/?LinkID=824704>. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.\n\n## License\n\n[MIT](./LICENSE.TXT)\n"
  },
  {
    "path": "channels/offline-channel-js/SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n# Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).\n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n* Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n* Full paths of source file(s) related to the manifestation of the issue\n* The location of the affected source code (tag/branch/commit or direct URL)\n* Any special configuration required to reproduce the issue\n* Step-by-step instructions to reproduce the issue\n* Proof-of-concept or exploit code (if possible)\n* Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "channels/offline-channel-js/SUPPORT.md",
    "content": "# Support\n\n## How to file issues and get help  \n\nThis project uses GitHub Issues to track bugs and feature requests. Please search the existing\nissues before filing new issues to avoid duplicates.  For new issues, file your bug or\nfeature request as a new Issue.\n\nFor help and questions about using this project, please create a Support request issue on\n<https://github.com/microsoft/ApplicationInsights-JS/issues>.\n\n## Microsoft Support Policy  \n\nSupport for this **PROJECT or PRODUCT** is limited to the resources listed above.\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/IndexedDB.tests.ts",
    "content": "import { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { IndexedDbHelper } from \"../../../src/Providers/IndexDbHelper\";\nimport { IIndexedDbOpenDbContext } from \"../../../src/Interfaces/IOfflineIndexDb\";\nimport { createAsyncPromise, doAwait } from \"@nevware21/ts-async\";\nimport { arrForEach } from \"@nevware21/ts-utils\";\n\ninterface IProviderDbContext {\n    iKey: string;               // The current iKey for the events\n    storageId: string;           // The current storage instance (think browser instance / tab)\n    iKeyPrefix?: () => string;   // Returns the prefix applied to all events of the current iKey\n    evtKeyPrefix?: () => string; // Returns the current prefix to apply to events\n}\n\nexport class OfflineIndexedDBTests extends AITestClass {\n    private dbHelper: any;\n    private ctx: any;\n \n    public testInitialize() {\n        super.testInitialize();\n        this.dbHelper = new IndexedDbHelper<IProviderDbContext>();\n        this.ctx = {};\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this.dbHelper = null;\n        this.ctx = null\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"IndexedDBHelper: Open one new db once and then close it\",\n            test: () => {\n                let dbName = \"testDB\";\n                let isAvailable = this.dbHelper.isAvailable();\n                Assert.ok(isAvailable, \"db should be available\");\n                let ctxKeys = Object.keys(this.ctx);\n                Assert.equal(ctxKeys.length, 0, \"db should not have ctx\");\n\n                let processFunc = (dbContext: IIndexedDbOpenDbContext<IProviderDbContext>) => {\n                    return createAsyncPromise<IIndexedDbOpenDbContext<IProviderDbContext>>((resolve, reject) => {\n                        if (dbContext) {\n                            this.ctx.processFunc = dbContext;\n                            resolve(dbContext);\n                        }\n                        reject(new Error(\"process function error\"));\n                    });\n                };\n                let versionChangeFunc = (dbContext: IIndexedDbOpenDbContext<IProviderDbContext>) =>  {\n                    function _createDb(db: IDBDatabase) {\n                        // data in the same db must have same endpoint url\n                        if (!db.objectStoreNames.contains(\"Evts\")) {\n                            // since we have in Memory timer, so time for each Ipayload data should be different.\n                            let evtStore = db.createObjectStore(\"Evts\", { keyPath: \"time\" });\n                            evtStore.createIndex(\"persistence\", \"persistence\", {unique: false });\n                        }\n                    }\n                    return createAsyncPromise<void>((resolve, reject) => {\n                        if (dbContext) {\n                            let db = dbContext.db;\n                            _createDb(db);\n                            this.ctx.versionChangeFunc = dbContext;\n                            resolve();\n                        }\n                        reject(new Error(\"versionChangeFunc function error\"));\n                    });\n                }\n                \n                this.dbHelper.openDb(dbName, 1, processFunc, versionChangeFunc);\n                this.dbHelper.deleteDb(dbName).then((val) => {\n                    this.ctx.isClosed = val;\n                });\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let processFunc = this.ctx.processFunc;\n                    let versionChangeFunc = this.ctx.processFunc;\n    \n                    if (processFunc && versionChangeFunc) {\n                    \n                        Assert.equal(processFunc.dbName, \"testDB\", \"process function should have correct db name\");\n                        Assert.equal(processFunc.dbVersion, 1, \"process function should have correct db version\");\n                        Assert.ok(processFunc.isNew, \"db is new\");\n        \n                        Assert.equal(versionChangeFunc.dbName,\"testDB\", \"versionChange function should have correct db name\");\n                        Assert.equal(versionChangeFunc.dbVersion,1, \"versionChange function should have correct db version\");\n                        Assert.ok(versionChangeFunc.isNew, \"db is new\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for response \" + new Date().toISOString(), 15, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let isClosed = this.ctx.isClosed;\n    \n                    if (isClosed) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for response \" + new Date().toISOString(), 15, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"IndexedDBHelper: Open one db mutiple times and close db once\",\n            test: () => {\n                let dbName = \"testDB\";\n                let isAvailable = this.dbHelper.isAvailable();\n                Assert.ok(isAvailable, \"db should be available\");\n                let ctxKeys = Object.keys(this.ctx);\n                Assert.equal(ctxKeys.length, 0, \"db should not have ctx\");\n                this.ctx = {\n                    process: [],\n                    versionChangeFunc: 0\n                }\n\n                let processFunc = (dbContext: IIndexedDbOpenDbContext<IProviderDbContext>) => {\n                    return createAsyncPromise<IIndexedDbOpenDbContext<IProviderDbContext>>((resolve, reject) => {\n                        if (dbContext) {\n                            this.ctx.process.push(dbContext)\n                            resolve(dbContext);\n                        }\n                        reject(new Error(\"process function error\"));\n                    });\n                };\n\n                let versionChangeFunc = (dbContext: IIndexedDbOpenDbContext<IProviderDbContext>) =>  {\n                    function _createDb(db: IDBDatabase) {\n                        // data in the same db must have same endpoint url\n                        if (!db.objectStoreNames.contains(\"Evts\")) {\n                            // since we have in Memory timer, so time for each Ipayload data should be different.\n                            let evtStore = db.createObjectStore(\"Evts\", { keyPath: \"time\" });\n                            evtStore.createIndex(\"persistence\", \"persistence\", {unique: false });\n                        }\n                    }\n                    return createAsyncPromise<void>((resolve, reject) => {\n                        if (dbContext) {\n                            let db = dbContext.db;\n                            _createDb(db);\n                            this.ctx.versionChangeFunc++;\n                            resolve();\n                        }\n                        reject(new Error(\"versionChangeFunc function error\"));\n                    });\n                }\n                \n                this.dbHelper.openDb(dbName, 1, processFunc, versionChangeFunc);\n                this.dbHelper.openDb(dbName, 1, processFunc, versionChangeFunc);\n                this.dbHelper.openDb(dbName, 1, processFunc, versionChangeFunc);\n                this.dbHelper.openDb(dbName, 1, processFunc, versionChangeFunc);\n                this.dbHelper.deleteDb(dbName).then((val) => {\n                    this.ctx.isClosed = val;\n                });\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let process = this.ctx.process;\n                    let versionChangeFunc = this.ctx.versionChangeFunc;\n    \n                    if (process.length > 3 && versionChangeFunc) {\n                        let newOpenRequest = 0;\n                        let oldOpenRequest = 0\n                        arrForEach(process, (item) => {\n                            item.isNew? newOpenRequest++ : oldOpenRequest++;\n                        })\n                        Assert.equal(newOpenRequest, 1, \"should have only one new open request\");\n                        Assert.equal(oldOpenRequest, 3, \"should have three old open request\");\n                        Assert.equal(versionChangeFunc, 1, \"versionChange function should be called 1 times\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for response \" + new Date().toISOString(), 15, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let isClosed = this.ctx.isClosed;\n    \n                    if (isClosed) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for response \" + new Date().toISOString(), 15, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"IndexedDBHelper: Open mutiple db and close all opend db\",\n            test: () => {\n                let dbName = \"testDB\";\n                let dbName1 = \"testDB1\";\n                let dbName2 = \"testDB2\";\n                let isAvailable = this.dbHelper.isAvailable();\n                Assert.ok(isAvailable, \"db should be available\");\n                let ctxKeys = Object.keys(this.ctx);\n                Assert.equal(ctxKeys.length, 0, \"db should not have ctx\");\n                this.ctx = {\n                    process: [],\n                    versionChangeFunc: 0,\n                    isClosed: 0\n                }\n\n                let processFunc = (dbContext: IIndexedDbOpenDbContext<IProviderDbContext>) => {\n                    return createAsyncPromise<IIndexedDbOpenDbContext<IProviderDbContext>>((resolve, reject) => {\n                        if (dbContext) {\n                            this.ctx.process.push(dbContext)\n                            resolve(dbContext);\n                        }\n                        reject(new Error(\"process function error\"));\n                    });\n                };\n\n                let versionChangeFunc = (dbContext: IIndexedDbOpenDbContext<IProviderDbContext>) =>  {\n                    function _createDb(db: IDBDatabase) {\n                        // data in the same db must have same endpoint url\n                        if (!db.objectStoreNames.contains(\"Evts\")) {\n                            // since we have in Memory timer, so time for each Ipayload data should be different.\n                            let evtStore = db.createObjectStore(\"Evts\", { keyPath: \"time\" });\n                            evtStore.createIndex(\"persistence\", \"persistence\", {unique: false });\n                        }\n                    }\n                    return createAsyncPromise<void>((resolve, reject) => {\n                        if (dbContext) {\n                            let db = dbContext.db;\n                            _createDb(db);\n                            this.ctx.versionChangeFunc++;\n                            resolve();\n                        }\n                        reject(new Error(\"versionChangeFunc function error\"));\n                    });\n                }\n                \n                this.dbHelper.openDb(dbName, 1, processFunc, versionChangeFunc);\n                this.dbHelper.openDb(dbName1, 1, processFunc, versionChangeFunc);\n                this.dbHelper.openDb(dbName2, 1, processFunc, versionChangeFunc);\n                this.dbHelper.deleteDb(dbName).then((val) => {\n                    this.ctx.isClosed ++;\n                });\n                this.dbHelper.deleteDb(dbName1).then((val) => {\n                    this.ctx.isClosed ++;\n                });\n                this.dbHelper.deleteDb(dbName2).then((val) => {\n                    this.ctx.isClosed ++;\n                });\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let process = this.ctx.process;\n                    let versionChangeFunc = this.ctx.versionChangeFunc;\n    \n                    if (process.length > 2 && versionChangeFunc) {\n                        let newOpenRequest = 0;\n                        let oldOpenRequest = 0\n                        arrForEach(process, (item) => {\n                            item.isNew? newOpenRequest++ : oldOpenRequest++;\n                        })\n                        Assert.equal(newOpenRequest, 3, \"should have three new open request\");\n                        Assert.equal(oldOpenRequest, 0, \"should have no open request\");\n                        Assert.equal(versionChangeFunc, 3, \"versionChange function should be called 3 times\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for response \" + new Date().toISOString(), 15, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let isClosed = this.ctx.isClosed;\n    \n                    if (isClosed == 3) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for response \" + new Date().toISOString(), 15, 1000));\n            }\n        });\n    }\n}\n\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/TestHelper.ts",
    "content": "import { BreezeChannelIdentifier, DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { BaseTelemetryPlugin, IAppInsightsCore, IChannelControls, IConfiguration, IInternalOfflineSupport, IPayloadData, IPlugin, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\nexport class TestChannel extends BaseTelemetryPlugin implements IChannelControls  {\n    public identifier = BreezeChannelIdentifier;\n    public priority: number = 1001;\n    public endpoint: string = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n    public isIdle: boolean = true;\n    public isInitialized = () => {\n        return true;\n    }\n\n    lastEventAdded: ITelemetryItem;\n    eventsAdded: ITelemetryItem[] = [];\n    flushCalled: boolean;\n    uploadNowCallback: () => void;\n    pauseCalled: boolean;\n    resumeCalled: boolean;\n    teardownCalled: boolean;\n\n\n    initialize(config: IConfig & IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) {\n        //No-op\n    }\n\n    processTelemetry(event: ITelemetryItem) {\n        this.lastEventAdded = <any>event;\n        this.eventsAdded.push(this.lastEventAdded);\n    }\n\n    pause() {\n        this.pauseCalled = true;\n    }\n\n    resume() {\n        this.resumeCalled = true;\n    }\n\n    teardown() {\n        this.teardownCalled = true;\n    }\n\n    flush(async = true, callback?: () => void) {\n        this.flushCalled = true;\n    }\n\n    setIsIdle(val) {\n        this.isIdle = val;\n    }\n    isCompletelyIdle() {\n        return this.isIdle;\n    }\n\n    getOfflineSupport() {\n        return {\n            serialize: (evt) => {\n                return JSON.stringify(evt);\n            },\n            batch: (arr) => {\n                if (!arr || !arr.length) {\n                    return \"\";\n                }\n                return \"[\" + arr.join(\",\") + \"]\";\n            },\n            shouldProcess: (evt) => {\n                return true;\n            },\n            getUrl: () => {\n                return this.endpoint;\n            },\n            createPayload: (evt) => {\n                return {\n                    urlString: this.endpoint,\n                    data: evt,\n                    headers: {header1: \"val1\"}\n                    \n                } as IPayloadData\n            }\n            \n        } as IInternalOfflineSupport;\n    }\n}\n\nexport function mockTelemetryItem(level?: number): ITelemetryItem {\n    let evt = {\n        ver: \"testVer\" + Math.random(),\n        name:\"testName\",\n        time: \"testTime\",\n        iKey:\"testKey\",\n        baseData: {pro1: \"prop1\", persistence: level},\n        baseType: \"testType\"\n    } as ITelemetryItem;\n    return evt;\n}\n\n\n\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/channel.tests.ts",
    "content": "import { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, EventPersistence, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { AppInsightsCore, IConfiguration, arrForEach, getGlobal, getGlobalInst, objKeys } from \"@microsoft/applicationinsights-core-js\";\nimport { TestChannel, mockTelemetryItem } from \"./TestHelper\";\nimport { OfflineChannel } from \"../../../src/OfflineChannel\"\nimport { IOfflineChannelConfiguration, eStorageProviders } from \"../../../src/applicationinsights-offlinechannel-js\";\n\nexport class ChannelTests extends AITestClass {\n    private core: AppInsightsCore;\n    private coreConfig: IConfig & IConfiguration;\n    private ctx: any;\n    private fetchStub: any;\n    private _fetch: any;\n    private evtSent: any;\n    private evtDiscard: any;\n    private evtStore: any;\n    private batchDrop: any;\n    private levelKeys: any;\n \n    public testInitialize() {\n        super.testInitialize();\n        AITestClass.orgLocalStorage.clear();\n        this.coreConfig = {\n            instrumentationKey: \"testIkey\",\n            disableInstrumentationKeyValidation: true,\n            endpointUrl: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n        };\n        this.core = new AppInsightsCore();\n        this.ctx = {};\n        this._fetch = getGlobalInst(\"fetch\");\n        this.evtDiscard = 0;\n        this.evtSent = 0;\n        this.evtStore = 0;\n        this.batchDrop = 0;\n        this.levelKeys = [EventPersistence.Critical, EventPersistence.Normal];\n        \n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        AITestClass.orgLocalStorage.clear();\n        this.onDone(() => {\n            this.core.unload(false);\n        });\n        this.core = null as any;\n        this.coreConfig = null as any;\n        AITestClass.orgLocalStorage.clear();\n        this.ctx = null;\n        this.fetchStub = null;\n        getGlobal().fetch = this._fetch;\n        if (window.localStorage){\n            window.localStorage.clear();\n        }\n        this.evtDiscard = 0;\n        this.evtSent = 0;\n        this.evtStore = 0;\n        this.batchDrop = 0;\n        this.levelKeys = null;\n       \n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"Channel: Init from core\",\n            useFakeTimers: true,\n            test: () => {\n                let channel = new OfflineChannel();\n                let onlineChannel = new TestChannel();\n                this.core.initialize(this.coreConfig,[channel, onlineChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n\n                    },\n                    offlineBatchSent: (batch) => {\n                        this.evtSent += 1;\n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n\n                this.clock.tick(1);\n\n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(1);\n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                arrForEach(this.levelKeys, (key) => {\n                    let inMemoBatch = inMemoMap[key];\n                    Assert.equal(inMemoBatch.count(), 0, key + \" in memo batch should exist\");\n                });\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n\n                channel.teardown();\n                \n            }\n            \n        });\n        \n        this.testCase({\n            name: \"Channel: Init from core indexed db\",\n            useFakeTimers: true,\n            test: () => {\n                let channel = new OfflineChannel();\n                let onlineChannel = new TestChannel();\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.IndexedDb], inMemoMaxTime: 2000} as IOfflineChannelConfiguration};\n                this.core.initialize(this.coreConfig,[channel, onlineChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n\n                    },\n                    offlineBatchSent: (batch) => {\n                        this.evtSent += 1;\n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n                this.clock.tick(1);\n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(1);\n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                arrForEach(this.levelKeys, (key) => {\n                    let inMemoBatch = inMemoMap[key];\n                    Assert.equal(inMemoBatch.count(), 0, key + \" in memo batch should exist\");\n                });\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n\n                channel.teardown();\n                \n            }\n            \n        });\n\n        this.testCase({\n            name: \"Channel: Process Telemetry with web provider \",\n            useFakeTimers: true,\n            test: () => {\n                let window = getGlobalInst(\"window\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {inMemoMaxTime: 2000} as IOfflineChannelConfiguration};\n                let sendChannel = new TestChannel();\n                let storedEvts:any[] = [];\n                let expectedStoreId: any[] = [];\n\n                this.core.initialize(this.coreConfig, [sendChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n                        arrForEach(evts, (item) => {\n                            storedEvts.push(item.ver);\n                        })\n                        \n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n            \n                let channel = new OfflineChannel();\n               \n                channel.initialize(this.coreConfig, this.core,[]);\n                this.onDone(() => {\n                    channel.teardown();\n                });\n\n                this.clock.tick(1);\n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(1);\n                let evt = mockTelemetryItem();\n                expectedStoreId.push(evt.ver);\n                channel.processTelemetry(evt);\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                arrForEach(this.levelKeys, (key) => {\n                    let inMemoBatch = inMemoMap[key];\n                    Assert.equal(inMemoBatch.count(), 0, key + \" in memo batch should exist\");\n                });\n\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n\n                offlineListener.setOnlineState(2);\n                channel.processTelemetry(evt);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"offline should process\");\n\n                this.clock.tick(2000);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 0, \"provider should store item\");\n                let storage = AITestClass.orgLocalStorage;\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = storage.getItem(storageKey) as any;\n                Assert.ok(storageStr.indexOf(\"header1\") > -1, \"should contain expeceted header\");\n\n                let storageObj = JSON.parse(storageStr);\n                let evts = storageObj.evts;\n                Assert.deepEqual(Object.keys(evts).length, 1, \"storage should have one event\");\n\n                this.clock.tick(10);\n\n                offlineListener.setOnlineState(1);\n                this.clock.tick(15000);\n\n                let requests = this._getXhrRequests();\n                Assert.deepEqual(requests.length, 1, \"xhr request should be triggered\");\n                storageStr = storage.getItem(storageKey) as any;\n                storageObj = JSON.parse(storageStr);\n                evts = storageObj.evts;\n                Assert.deepEqual(Object.keys(evts).length, 0, \"storage should not have one event\");\n                let request = requests[0];\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 0, \"in memo should not have item\");\n\n                offlineListener.setOnlineState(2);\n\n                evt = mockTelemetryItem();\n                expectedStoreId.push(evt.ver);\n                channel.processTelemetry(evt);\n                this.clock.tick(2000);\n\n                evt = mockTelemetryItem();\n                expectedStoreId.push(evt.ver);\n                channel.processTelemetry(evt);\n                this.clock.tick(2000);\n                storageStr = storage.getItem(storageKey) as any;\n                storageObj = JSON.parse(storageStr);\n                evts = storageObj.evts;\n                Assert.deepEqual(Object.keys(evts).length, 2, \"storage should have two events\");\n\n                offlineListener.setOnlineState(1);\n                this.clock.tick(15000);\n                requests = this._getXhrRequests();\n                Assert.deepEqual(requests.length, 2, \"xhr request should be triggered again\");\n                storageStr = storage.getItem(storageKey) as any;\n                storageObj = JSON.parse(storageStr);\n                evts = storageObj.evts;\n                Assert.deepEqual(Object.keys(evts).length, 1, \"storage should have one event test1\");\n                request = requests[1];\n                this.sendJsonResponse(request, {}, 200);\n\n                this.clock.tick(15000);\n                requests = this._getXhrRequests();\n                Assert.deepEqual(requests.length, 3, \"xhr request should be triggered again test1\");\n                request = requests[2];\n                this.sendJsonResponse(request, {}, 200);\n                storageStr = storage.getItem(storageKey) as any;\n                storageObj = JSON.parse(storageStr);\n                evts = storageObj.evts;\n                Assert.deepEqual(Object.keys(evts).length, 0, \"storage should not have one event test1\");\n\n                this.clock.tick(1);\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called test1\");\n                Assert.equal(this.evtStore, 3, \"store listener notification should be called three times test1\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called test1\");\n\n                Assert.deepEqual( storedEvts, expectedStoreId, \"should notify expected evts\");\n\n                channel.teardown();\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n        this.testCase({\n            name: \"Channel: Process Telemetry with web provider when splitevts is set to true \",\n            useFakeTimers: true,\n            test: () => {\n                let window = getGlobalInst(\"window\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {inMemoMaxTime: 2000, splitEvts: true} as IOfflineChannelConfiguration};\n                let sendChannel = new TestChannel();\n                let storedEvts:any[] = [];\n                let expectedStoreId: any[] = [];\n\n                this.core.initialize(this.coreConfig, [sendChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n                        arrForEach(evts, (item) => {\n                            storedEvts.push(item.ver);\n                        })\n                        \n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n            \n                let channel = new OfflineChannel();\n               \n                channel.initialize(this.coreConfig, this.core,[]);\n                this.onDone(() => {\n                    channel.teardown();\n                });\n\n                this.clock.tick(1);\n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(1);\n                let evt = mockTelemetryItem();\n                expectedStoreId.push(evt.ver);\n                channel.processTelemetry(evt);\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                arrForEach(this.levelKeys, (key) => {\n                    let inMemoBatch = inMemoMap[key];\n                    Assert.equal(inMemoBatch.count(), 0, key + \" in memo batch should exist\");\n                });\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n                \n                offlineListener.setOnlineState(2);\n                // process EventPersistence.Normal event\n                channel.processTelemetry(evt);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"offline should process normal event\");\n                // process ventPersistence.Critical event\n                let criticalEvt = mockTelemetryItem(2);\n                channel.processTelemetry(criticalEvt);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch.count(), 1, \"offline should process critical event\");\n                \n\n                this.clock.tick(2000);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 0, \"provider should store normal item\");\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch.count(), 0, \"provider should store critical normal item\");\n                let storage = AITestClass.orgLocalStorage;\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = storage.getItem(storageKey) as any;\n                Assert.ok(storageStr.indexOf(\"header1\") > -1, \"should contain expeceted header\");\n\n                let storageObj = JSON.parse(storageStr);\n                let evts = storageObj.evts;\n                Assert.deepEqual(Object.keys(evts).length, 2, \"storage should have two events\");\n\n                let normalCnt = '\"criticalCnt\":0';\n                let criticalCnt = '\"criticalCnt\":1';\n                Assert.ok(storageStr.indexOf(normalCnt) > -1, \"should contain expeceted critical count for normal event batches\");\n                Assert.ok(storageStr.indexOf(criticalCnt) > -1, \"should contain expeceted critical count for critical event batches\");\n\n                this.clock.tick(1);\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called test1\");\n                Assert.equal(this.evtStore, 2, \"store listener notification should be called two times test1\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called test1\");\n\n                channel.teardown();\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n            }\n        });\n\n       \n        this.testCase({\n            name: \"Channel: Process Telemetry with indexed db provider\",\n            useFakeTimers: true,\n            pollDelay: 100,\n            test: () => {\n                let window = getGlobalInst(\"window\");\n                let fakeXMLHttpRequest = (window as any).XMLHttpRequest;\n                let sendChannel = new TestChannel();\n                this.core.initialize(this.coreConfig, [sendChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n                    },\n                    offlineBatchSent: (batch) => {\n                        this.evtSent += 1;\n                        this.ctx.sent = this.ctx.sent || [];\n                        this.ctx.sent.push(batch.data);\n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n\n                let channel = new OfflineChannel();\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.IndexedDb], inMemoMaxTime: 2000} as IOfflineChannelConfiguration};\n                channel.initialize(this.coreConfig, this.core,[]);\n\n                this.clock.tick(1);\n                let senderInst =  channel[\"_getDbgPlgTargets\"]()[2];\n                let sender1 =  (payload: any, oncomplete: any, sync?: boolean) => {\n                    oncomplete(200, {});\n                }\n                this.ctx.called = 0;\n                this.sandbox.stub((senderInst) as any, \"sendPOST\").callsFake((payload: any, oncomplete: any, sync?: boolean) => {\n                    this.ctx.called++;\n                    return sender1(payload, oncomplete, sync)\n                });\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n                \n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(1);\n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                arrForEach(this.levelKeys, (key) => {\n                    let inMemoBatch = inMemoMap[key];\n                    Assert.equal(inMemoBatch.count(), 0, key + \" in memo batch should exist\");\n                });\n\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n            \n\n                offlineListener.setOnlineState(2);\n                channel.processTelemetry(evt);\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"offline should process\");\n\n                this.clock.tick(2000);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 0, \"provider should store item\");\n\n                this.clock.tick(10);\n\n                offlineListener.setOnlineState(1);\n                this.clock.tick(15000);\n\n\n                offlineListener.setOnlineState(2);\n\n                evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                this.clock.tick(2000);\n                evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                this.clock.tick(2000);\n                \n\n                offlineListener.setOnlineState(1);\n                this.clock.tick(15000);\n\n                channel.teardown();\n\n                (window as any).XMLHttpRequest = fakeXMLHttpRequest;\n      \n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let item = this.ctx.called;\n                    if (item == 2) {\n                        Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called test1\");\n                        Assert.equal(this.evtStore, 3, \"store listener notification should be called twice test1\");\n                        // only wait one 15000 interval, so sent notification should be sent twice only\n                        Assert.equal(this.evtSent, 2, \"sent listener notification should not called twice test1\");\n                        let evts = this.ctx.sent;\n                        Assert.ok(evts[0].indexOf(evts[1]) < 0, \"events should be different\");\n                        Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called test1\");\n\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for fetch response \" + new Date().toISOString(), 200, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"Channel: add event when in Memory batch is full\",\n            useFakeTimers: true,\n            test: () => {\n                let channel = new OfflineChannel();\n                let sendChannel = new TestChannel();\n                // make sure in memo time is long enough\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 200000000, eventsLimitInMem: 1, minPersistenceLevel: 2} as IOfflineChannelConfiguration};\n                this.core.initialize(this.coreConfig,[channel, sendChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n                    },\n                    offlineBatchSent: (batch) => {\n                        this.evtSent += 1;\n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n\n                this.clock.tick(1);\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n              \n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(2);\n                let evt1 = mockTelemetryItem(2);\n                let ver1 = evt1.ver;\n                let evt2 = mockTelemetryItem(2);\n                channel.processTelemetry(evt1);\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"online should process evt1\");\n\n\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                channel.processTelemetry(evt2);\n                Assert.equal(inMemoBatch.count(), 1, \"online should process evt2\");\n\n                let storage = AITestClass.orgLocalStorage;\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = storage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr);\n                let evts = storageObj.evts;\n                Assert.equal(evts && Object.keys(evts).length, 1, \"should have one events\");\n                Assert.ok(storageStr.indexOf(ver1) > -1, \"should contain only the first event\");\n                this.clock.tick(1);\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not called test1\");\n                Assert.equal(this.evtStore, 1, \"store listener notification should be called once test1\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called test1\")\n\n                let invalidEvt = mockTelemetryItem();\n                channel.processTelemetry(invalidEvt);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"online should not process invalid item\");\n                this.clock.tick(1);\n                Assert.equal(this.evtDiscard, 1, \"discard listener notification should be called once test2\");\n                Assert.equal(this.evtStore, 1, \"store listener notification should be called once test2\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called test2\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called test2\");\n                \n\n                channel.teardown();\n                \n            }\n            \n        });\n\n        this.testCase({\n            name: \"Channel: add event when in Memory batch is full with splitEvts set to true\",\n            useFakeTimers: true,\n            test: () => {\n                let channel = new OfflineChannel();\n                let sendChannel = new TestChannel();\n                // make sure in memo time is long enough\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 200000000, eventsLimitInMem: 1, splitEvts: true} as IOfflineChannelConfiguration};\n                this.core.initialize(this.coreConfig,[channel, sendChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n                    },\n                    offlineBatchSent: (batch) => {\n                        this.evtSent += 1;\n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n\n                this.clock.tick(1);\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n              \n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(2);\n\n                // eventsLimitInMem = 1, means for each persistent level, max number allowed for in memory events is 1\n\n                // process one critical event and one normal event (inMemoMap[nomral] should have 1 event and inMemoMap[critical] should have 1 event)\n                // then process another normal event (one normal event should be saved, inMemoMap[nomral] should have 1 event and inMemoMap[critical] should have 1 event)\n                let normalEvt1 = mockTelemetryItem();\n                let ver1 = normalEvt1.ver;\n                let normalEvt2 = mockTelemetryItem();\n                let criticalEvt1 = mockTelemetryItem(2);\n                let cVer1 = criticalEvt1.ver;\n                channel.processTelemetry(normalEvt1);\n                channel.processTelemetry(criticalEvt1);\n                \n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"online should process normal evt\");\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch.count(), 1, \"online should process critical evt2\");\n                channel.processTelemetry(normalEvt2);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"normal event batch should have one event\");\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch.count(), 1, \"critical event batch should have one event\");\n\n                let storage = AITestClass.orgLocalStorage;\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = storage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr);\n                let evts = storageObj.evts;\n                Assert.equal(evts && Object.keys(evts).length, 1, \"should have one events\");\n                Assert.ok(storageStr.indexOf(ver1) > -1, \"should contain only the first event\");\n                this.clock.tick(1);\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not called test1\");\n                Assert.equal(this.evtStore, 1, \"store listener notification should be called once test1\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called test1\");\n\n                // process another critical event\n                let criticalEvt2 = mockTelemetryItem(2);\n                channel.processTelemetry(criticalEvt2);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"normal event batch should have one event test1\");\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch.count(), 1, \"critical event batch should have one event test1\");\n\n                storage = AITestClass.orgLocalStorage;\n                storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                storageStr = storage.getItem(storageKey) as any;\n                storageObj = JSON.parse(storageStr);\n                evts = storageObj.evts;\n                Assert.equal(evts && Object.keys(evts).length, 2, \"should have two events\");\n                Assert.ok(storageStr.indexOf(ver1) > -1, \"should contain the first normal event\");\n                Assert.ok(storageStr.indexOf(cVer1) > -1, \"should contain the first critical event\");\n                this.clock.tick(1);\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not called test2\");\n                Assert.equal(this.evtStore, 2, \"store listener notification should be called twice test2\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called test2\");\n\n                \n                channel.teardown();\n                \n            }\n            \n        });\n\n        this.testCase({\n            name: \"Channel: drop batch notification should be handled with inMemo batch\",\n            useFakeTimers: true,\n            test: () => {\n                let channel = new OfflineChannel();\n                let sendChannel = new TestChannel();\n                // make sure in memo time is long enough\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 200000000, eventsLimitInMem: 1} as IOfflineChannelConfiguration};\n                this.core.initialize(this.coreConfig,[channel, sendChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n                    },\n                    offlineBatchSent: (batch) => {\n                        this.evtSent += 1;\n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n\n                this.clock.tick(1);\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n                this.sandbox.stub((inMemoBatch) as any, \"addEvent\").callsFake((evt) => {\n                    return false;\n                });\n                Assert.equal(inMemoBatch.count(), 0, \"in memo has no events\");\n                \n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should not be called\");\n              \n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(2);\n                let evt = mockTelemetryItem();\n               \n                channel.processTelemetry(evt);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 0, \"should not process evt\");\n\n                this.clock.tick(1);\n                Assert.equal(this.evtDiscard, 1, \"discard listener notification should be called once test1\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called once test1\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called test1\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should be called test1\");\n                \n\n                channel.teardown();\n                \n            }\n            \n        });\n\n        this.testCase({\n            name: \"Channel: drop batch notification should be with send\",\n            useFakeTimers: true,\n            test: () => {\n                let channel = new OfflineChannel();\n                let sendChannel = new TestChannel();\n                let senderCalled = 0;\n                // make sure in memo time is long enough\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 200, eventsLimitInMem: 1} as IOfflineChannelConfiguration};\n                this.core.initialize(this.coreConfig,[channel, sendChannel]);\n                this.core.addNotificationListener({\n                    eventsDiscarded: (evts, reason) => {\n                        this.evtDiscard += 1;\n                    },\n                    offlineEventsStored: (evts) => {\n                        this.evtStore += 1;\n                    },\n                    offlineBatchSent: (batch) => {\n                        this.evtSent += 1;\n                    },\n                    offlineBatchDrop(cnt, reason) {\n                        this.batchDrop += 1;\n                    }\n                });\n                this.clock.tick(1);\n\n                let senderInst =  channel[\"_getDbgPlgTargets\"]()[2];\n                let sender1 =  (payload: any, oncomplete: any, sync?: boolean) => {\n                    oncomplete(800, {});\n                }\n\n                this.sandbox.stub((senderInst) as any, \"sendPOST\").callsFake((payload: any, oncomplete: any, sync?: boolean) => {\n                    senderCalled ++;\n                    return sender1(payload, oncomplete, sync)\n                });\n\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.equal(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                arrForEach(this.levelKeys, (key) => {\n                    let inMemoBatch = inMemoMap[key];\n                    Assert.equal(inMemoBatch.count(), 0, key + \" in memo batch should exist\");\n                });\n\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification should not be called\");\n                Assert.equal(this.evtStore, 0, \"store listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called\");\n                Assert.equal(this.batchDrop, 0, \"batch drop listener notification should be called\");\n                \n              \n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(2);\n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                \n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"offline should process evt\");\n\n                this.clock.tick(300);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 0, \"in Memo should have no events remaining\");\n                let storage = AITestClass.orgLocalStorage;\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = storage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr);\n                let evts = storageObj.evts;\n                Assert.equal(evts && Object.keys(evts).length, 1, \"should have one events\");\n\n                offlineListener.setOnlineState(1);\n                this.clock.tick(15000);\n                Assert.equal(senderCalled, 1, \"sent should be called once\");\n\n                this.clock.tick(1);\n                Assert.equal(this.evtDiscard, 0, \"discard listener notification shouldnot be called once test1\");\n                Assert.equal(this.evtStore, 1, \"store listener notification should be called once test1\");\n                Assert.equal(this.evtSent, 0, \"sent listener notification should not be called test1\");\n\n                \n\n                channel.teardown();\n                \n            }\n            \n        });\n\n        this.testCase({\n            name: \"Channel: Should handle endpoint change\",\n            useFakeTimers: true,\n            test: () => {\n                let channel = new OfflineChannel();\n                let sendChannel = new TestChannel();\n                // make sure in memo time is long enough\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 200000} as IOfflineChannelConfiguration};\n                this.core.initialize(this.coreConfig,[channel, sendChannel]);\n\n                this.clock.tick(1);\n                \n                let offlineListener = channel.getOfflineListener() as any;\n                offlineListener.setOnlineState(2);\n\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let mapKeys = objKeys(inMemoMap);\n                Assert.deepEqual(mapKeys.length, this.levelKeys.length, \"in memo map should have expected keys\");\n                Assert.ok(inMemoMap, \"inMemoMap should exist\");\n                arrForEach(this.levelKeys, (key) => {\n                    let inMemoBatch = inMemoMap[key];\n                    Assert.equal(inMemoBatch.count(), 0, key + \" in memo batch should exist\");\n                });\n\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n                \n                let config = channel[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(config, \"should have config\");\n                Assert.equal(config.url, DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH, \"should have expected url\");\n\n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"offline should process evt\");\n\n                // should get url from online channel first\n                let expectedUrl = \"testUrl\";\n                sendChannel.endpoint = expectedUrl;\n                this.core.config.endpointUrl = expectedUrl;\n                this.core.config.instrumentationKey = \"test1\";\n                this.clock.tick(1);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"in memo has one events\");\n                Assert.equal(inMemoBatch.endpoint(), expectedUrl, \"in memo has expected url\");\n                config = channel[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(config, \"should have config\");\n                Assert.equal(config.url, expectedUrl, \"should have expected url\");\n\n                // when can't get from online channel, get from core\n                let expectedUrl1 = \"testURL1\";\n                sendChannel.endpoint = \"\";\n                this.core.config.instrumentationKey = \"test2\";\n                this.core.config.endpointUrl = expectedUrl1;\n                this.clock.tick(1);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"in memo has one events\");\n                Assert.equal(inMemoBatch.endpoint(), expectedUrl1, \"in memo has expected url test1\");\n                config = channel[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(config, \"should have config\");\n                Assert.equal(config.url, expectedUrl1, \"should have expected url test1\");\n\n\n                // when sender channel url change\n                let expectedUrl2 = \"testURL2\";\n                sendChannel.endpoint = \"\";\n                this.core.config.extensionConfig = this.core.config.extensionConfig || {};\n                this.core.config.endpointUrl = expectedUrl2;\n                this.core.config.extensionConfig[sendChannel.identifier].endpointUrl = expectedUrl2;\n                this.clock.tick(1);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch.count(), 1, \"in memo has one events\");\n                Assert.equal(inMemoBatch.endpoint(), expectedUrl2, \"in memo has expected url test1\");\n                config = channel[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(config, \"should have config\");\n                Assert.equal(config.url, expectedUrl2, \"should have expected url test1\");\n\n                \n                channel.teardown();\n                \n            }\n            \n        });\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/customprovider.tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { AppInsightsCore, arrForEach, createDynamicConfig, getJSON, IConfiguration, IProcessTelemetryContext, newGuid, objForEachKey } from \"@microsoft/applicationinsights-core-js\";\nimport { OfflineBatchHandler } from \"../../../src/OfflineBatchHandler\";\nimport { ILocalStorageProviderContext, IOfflineChannelConfiguration, IOfflineProvider, eStorageProviders } from \"../../../src/Interfaces/IOfflineProvider\";\nimport { getTimeId } from \"../../../src/Helpers/Utils\";\nimport { DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { mockTelemetryItem, TestChannel } from \"./TestHelper\";\nimport { OfflineChannel } from \"../../../src/OfflineChannel\";\n\n\nexport class OfflineCustomProviderTests extends AITestClass {\n    private syncStorage: any;\n    private core: AppInsightsCore;\n    private coreConfig: IConfig & IConfiguration;\n  \n\n    public testInitialize() {\n        super.testInitialize();\n        this.syncStorage = {};\n        let channel = new TestChannel();\n        this.coreConfig = {\n            instrumentationKey: \"testIkey\",\n            endpointUrl: \"https://testurl.com\"\n        };\n        this.core = new AppInsightsCore();\n        this.core.initialize(this.coreConfig, [channel]);\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        AITestClass.orgLocalStorage.clear();\n        this.onDone(() => {\n            this.core.unload();\n        });\n        this.core = null as any;\n        this.coreConfig = null as any;\n        this.syncStorage = null;\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"OfflineChannel: should initialize successfully with custom provider\",\n            useFakeTimers: true,\n            test: () => {\n                // Arrange\n                let mockCustomProvider = this._createMockProvider(true, true, true);\n                let channel = new OfflineChannel();\n                let sendChannel = new TestChannel();\n                let core = new AppInsightsCore();\n                \n                this.coreConfig.extensionConfig = {\n                    [\"OfflineChannel\"]: {\n                        customProvider: mockCustomProvider,\n                        providers: [eStorageProviders.LocalStorage],\n                        inMemoMaxTime: 2000\n                    } as IOfflineChannelConfiguration\n                };\n\n                core.initialize(this.coreConfig, [sendChannel, channel]);\n\n                // Act\n                this.clock.tick(1);\n\n                let offlineListener = channel.getOfflineListener();\n               \n                offlineListener && offlineListener.setOnlineState(2); // Set offline\n                \n                \n                \n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                \n                this.clock.tick(2100); // Wait for storage\n                \n                // Verify event was stored using custom provider\n                Assert.ok(this.syncStorage, \"Custom provider should have used syncStorage\");\n                let storageKeys = Object.keys(this.syncStorage);\n                Assert.ok(storageKeys.length > 0, \"Should have stored data in custom provider\");\n                \n                channel.teardown();\n                core.unload();\n            }\n        });\n\n        this.testCase({\n            name: \"initProvider: with custom provider(supports sync) and unload(supports sync) provider provided\",\n            test: () => {\n                // Arrange\n                let mockCustomProvider = this._createMockProvider(true, true);\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg as IOfflineChannelConfiguration;\n                storageConfig.customProvider = mockCustomProvider;\n                storageConfig.customUnloadProvider = mockCustomProvider;\n                let providerContext = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint:DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                }\n                let handler = new OfflineBatchHandler();\n\n                // Act\n                let initialized = handler.initialize(providerContext);\n\n                // Assert\n                Assert.ok(initialized, \"Handler should be initialized\");\n                let targets = handler[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], mockCustomProvider, \"Custom provider should be used as main provider\");\n                Assert.equal(targets[2], mockCustomProvider, \"Custom provider should be used as unload provider when it supports sync\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"initProvider: with custom provider(supports sync) and no unload provider provided\",\n            test: () => {\n                // Arrange\n                let mockCustomProvider = this._createMockProvider(true, true);\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg as IOfflineChannelConfiguration;\n                storageConfig.customProvider = mockCustomProvider;\n                // No customUnloadProvider specified\n                let providerContext = {\n                    itemCtx: itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                };\n                let handler = new OfflineBatchHandler();\n\n                // Act\n                let initialized = handler.initialize(providerContext);\n\n                // Assert\n                Assert.ok(initialized, \"Handler should be initialized\");\n                let targets = handler[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], mockCustomProvider, \"Custom provider should be used as main provider\");\n                Assert.equal(targets[2], mockCustomProvider, \"Custom provider should be used as unload provider when it supports sync and no unload provider specified\");\n            }\n        });\n\n        this.testCase({\n            name: \"initProvider: with custom provider(no sync support) and custom unload provider(supports sync)\",\n            test: () => {\n                // Arrange\n                let mockMainProvider = this._createMockProvider(true, false); // No sync support\n                let mockUnloadProvider = this._createMockProvider(true, true); // Supports sync\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg as IOfflineChannelConfiguration;\n                storageConfig.customProvider = mockMainProvider;\n                storageConfig.customUnloadProvider = mockUnloadProvider;\n                let providerContext = {\n                    itemCtx: itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                };\n                let handler = new OfflineBatchHandler();\n\n                // Act\n                let initialized = handler.initialize(providerContext);\n\n                // Assert\n                Assert.ok(initialized, \"Handler should be initialized\");\n                let targets = handler[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], mockMainProvider, \"Custom provider should be used as main provider\");\n                Assert.equal(targets[2], mockUnloadProvider, \"Custom unload provider should be used as unload provider\");\n                Assert.notEqual(targets[0], targets[2], \"Main and unload providers should be different\");\n            }\n        });\n\n        this.testCase({\n            name: \"initProvider: with custom provider(no sync support) and no unload provider provided\",\n            test: () => {\n                // Arrange\n                let mockCustomProvider = this._createMockProvider(true, false); // No sync support\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg as IOfflineChannelConfiguration;\n                storageConfig.customProvider = mockCustomProvider;\n                storageConfig.providers = [eStorageProviders.LocalStorage]; // Fallback for unload\n                // No customUnloadProvider specified\n                let providerContext = {\n                    itemCtx: itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                };\n                let handler = new OfflineBatchHandler();\n\n                // Act\n                let initialized = handler.initialize(providerContext);\n\n                // Assert\n                Assert.ok(initialized, \"Handler should be initialized\");\n                let targets = handler[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], mockCustomProvider, \"Custom provider should be used as main provider\");\n                Assert.notEqual(targets[2], mockCustomProvider, \"Should not use custom provider as unload provider when it doesn't support sync\");\n                Assert.ok(targets[2], \"Should have fallback unload provider\");\n            }\n        });\n\n        this.testCase({\n            name: \"initProvider: with custom provider initialization failure and fallback providers\",\n            test: () => {\n                // Arrange\n                let mockCustomProvider = this._createMockProvider(false, true); // Fails initialization\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg as IOfflineChannelConfiguration;\n                storageConfig.customProvider = mockCustomProvider;\n                storageConfig.providers = [eStorageProviders.LocalStorage];\n                let providerContext = {\n                    itemCtx: itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                };\n                let handler = new OfflineBatchHandler();\n\n                // Act\n                let initialized = handler.initialize(providerContext);\n\n                // Assert\n                Assert.ok(initialized, \"Handler should be initialized with fallback provider\");\n                let targets = handler[\"_getDbgPlgTargets\"]();\n                Assert.notEqual(targets[0], mockCustomProvider, \"Should not use failed custom provider\");\n                Assert.ok(targets[0], \"Should have fallback main provider\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"initProvider: with custom provider and storage operations\",\n            test: () => {\n                // Arrange\n                let mockCustomProvider = this._createMockProvider(true, true, true); // Full provider\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg as IOfflineChannelConfiguration;\n                storageConfig.customProvider = mockCustomProvider;\n                let providerContext = {\n                    itemCtx: itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                };\n                let handler = new OfflineBatchHandler();\n\n                // Act\n                let initialized = handler.initialize(providerContext);\n\n                // Assert - Test basic operations\n                Assert.ok(initialized, \"Handler should be initialized\");\n                let targets = handler[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], mockCustomProvider, \"Should use custom provider\");\n\n                // Test storage operations\n\n                let testEvent  = {\n                    urlString: \"testcustomprovider\",\n                    data: '[{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}},{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}}]',\n                    headers: {\n                        \"header1\": \"header1val\",\n                        \"header2\": \"header2val\"\n                    },\n                    disableXhrSync: false,\n                    disableFetchKeepAlive: false,\n                    sendReason: 1,\n                    id: newGuid(),\n                    iKey: \"testIKey\",\n                    criticalCnt: 1\n                }\n                let addResult = mockCustomProvider.addEvent(\"testKey\", testEvent, itemCtx);\n                Assert.ok(addResult, \"Should successfully add event to custom provider\");\n\n                let retrievedEvents = mockCustomProvider.getAllEvents() as any;\n                Assert.ok(retrievedEvents && retrievedEvents.length > 0, \"Should retrieve stored events from custom provider\");\n\n                let batchEvents = mockCustomProvider.getNextBatch();\n                Assert.ok(batchEvents, \"Should get next batch from custom provider\");\n\n                let removeResult = mockCustomProvider.removeEvents([testEvent]);\n                Assert.ok(removeResult, \"Should remove events from custom provider\");\n            }\n        });\n\n        \n\n    \n    }\n\n    private _createMockProvider(shouldInitialize: boolean, supportsSyncRequests: boolean, full?: boolean): IOfflineProvider {\n        let mockProvider = new MockNoopProvider(shouldInitialize, supportsSyncRequests);\n        if (!!full) {\n            mockProvider = new MockFullStorageProvider(this.syncStorage);\n        }\n        return mockProvider;\n    }\n\n}\n\n// Mock Storage Provider for testing - mimics WebStorageProvider but uses syncStorage instead of browser storage\n\nclass MockFullStorageProvider implements IOfflineProvider {\n    public id: string;\n\n    /**\n     * Creates a MockStorageProvider using syncStorage for testing\n     * @param syncStorage - The sync storage object to use for storing data\n     * @param id - Optional identifier for the provider\n     */\n    constructor(syncStorage: any, id?: string) {\n        dynamicProto(MockFullStorageProvider, this, (_this) => {\n            let _storage: any = null;\n            let _storageKeyPrefix: string = \"AIOffline\";\n            let _maxStorageSizeInBytes: number = 5000000;\n            let _storageKey: string;\n            let _endpoint: string ;\n            let _maxStorageTime: number = 604800000; // 7 days\n\n            _this.id = id || \"mock-provider\";\n\n            // Use the provided syncStorage instead of browser storage\n            _storage = syncStorage;\n\n            _this[\"_getDbgPlgTargets\"] = () => {\n                return [_storageKey, _maxStorageSizeInBytes, _maxStorageTime];\n            };\n\n            _this.initialize = (providerContext: ILocalStorageProviderContext, endpointUrl?: string) => {\n                if (!_storage) {\n                    return false;\n                }\n\n                let storageConfig = providerContext.storageConfig;\n                _endpoint = endpointUrl || providerContext.endpoint || \"test-endpoint\";\n\n                _maxStorageSizeInBytes = storageConfig.maxStorageSizeInBytes || 5000000;\n                _maxStorageTime = storageConfig.inStorageMaxTime || 604800000;\n                _storageKeyPrefix = storageConfig.storageKeyPrefix || \"AIOffline\";\n                _storageKey = _storageKeyPrefix + \"_1_\" + _endpoint;\n\n                return true;\n            };\n\n            /**\n             * Identifies whether this storage provider support synchronous requests\n             */\n            _this.supportsSyncRequests = () => {\n                return true;\n            };\n\n            /**\n             * Get all of the currently cached events from the storage mechanism\n             */\n            _this.getAllEvents = (cnt?: number) => {\n                try {\n                    if (!_storage) {\n                        return null;\n                    }\n                    return _getEvts(cnt);\n                } catch (e) {\n                    return null;\n                }\n            };\n\n            /**\n             * Get Next cached event from the storage mechanism\n             */\n            _this.getNextBatch = () => {\n                try {\n                    if (!_storage) {\n                        return null;\n                    }\n                    // set ordered to true, to make sure to get earliest events first\n                    return _getEvts(1);\n                } catch (e) {\n                    return null;\n                }\n            };\n\n            function _getEvts(cnt?: number) {\n                let allItems:any[] = [];\n                let theStore = _fetchStoredDb(_storageKey).db;\n                if (theStore) {\n                    let events = theStore.evts;\n                    objForEachKey(events, (evt) => {\n                        if (evt) {\n                            allItems.push(evt);\n                        }\n                        if (cnt && allItems && allItems.length === cnt) {\n                            return;\n                        }\n\n                    });\n                }\n                return allItems;\n            }\n\n            /**\n             * Stores the value into the storage using the specified key.\n             * @param key - The key value to use for the value\n             * @param evt - The actual event of the request\n             * @param itemCtx - This is the context for the current request\n             */\n            _this.addEvent = (key: string, evt: any, itemCtx: IProcessTelemetryContext) => {\n                try {\n                    let theStore = _fetchStoredDb(_storageKey);\n                    evt.id = evt.id || getTimeId();\n                    evt.criticalCnt = evt.criticalCnt || 0;\n                    let events = theStore.db.evts;\n                    let id = evt.id;\n\n                    events[id] = evt;\n                    if (_updateStoredDb(theStore)) {\n                        // Database successfully updated\n                        return evt;\n                    }\n\n                    return null;\n                    \n                } catch (e) {\n                    return null;\n                }\n            };\n\n            /**\n             * Removes the value associated with the provided key\n             * @param evts - The events to be removed\n             */\n            _this.removeEvents = (evts: any[]) => {\n                try {\n                    let theStore = _fetchStoredDb(_storageKey, false);\n                    let currentDb = theStore.db;\n                    if (currentDb) {\n                        let events = currentDb.evts;\n                        try {\n                            arrForEach(events, (evt) => {\n                                delete events[evt.id];\n\n                            });\n                            // Update takes care of removing the DB if it's completely empty now\n                            if (_updateStoredDb(theStore)) {\n                                return evts;\n                            }\n                        } catch (e) {\n                            // Storage corrupted\n                        }\n\n                        // failure here so try and remove db to unblock following events\n                        evts = _clearDatabase(theStore.key);\n                    }\n\n                    return evts;\n                } catch (e) {\n                    return evts || [];\n                }\n            };\n\n            /**\n             * Removes all entries from the storage provider for the current endpoint and returns them as part of the response, if there are any.\n             */\n            _this.clear = () => {\n                try {\n                    let removedItems: any[] = [];\n                    let theStore = _fetchStoredDb(_storageKey, false);\n                    let storedDb = theStore.db;\n                    if (storedDb) {\n                        let events = storedDb.evts;\n                        objForEachKey(events, (key) => {\n                            let evt = events[key];\n                            if (evt) {\n                                delete events[evt.id];\n                                removedItems.push(evt);\n                            }\n\n                        });\n                        _updateStoredDb(theStore);\n                    }\n\n                    return removedItems;\n                } catch (e) {\n                    return [];\n                }\n            };\n\n            _this.clean = () => {\n                let storeDetails = _fetchStoredDb(_storageKey, false);\n                let currentDb = storeDetails.db;\n                if (currentDb) {\n                    try {\n                        syncStorage = {};\n                        return true;\n                    } catch (e) {\n                        // should not throw errors here\n                        // because we don't want to block following process\n                    }\n                    return false;\n                }\n            };\n\n            /**\n             * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n             * This attempts to update the lastAccessTime for any storedDb\n             */\n            _this.teardown = () => {\n                try {\n                    let theStore = _fetchStoredDb(_storageKey, false);\n                    let storedDb = theStore.db;\n                    if (storedDb) {\n                        // reset the last access time\n                        storedDb.lastAccessTime = 0;\n                        _updateStoredDb(theStore, false);\n                    }\n                } catch (e) {\n                    // Add diagnostic logging\n                }\n            };\n\n            /**\n             * @ignore\n             * Creates a new json store with the StorageJSON (may be null), a null db value indicates that the store\n             * associated with the key is empty and should be removed.\n             * @param dbKey - The key to associate with the database\n             * @param db - The database\n             */\n            function _newStore(dbKey: string, db: any) {\n                return {\n                    key: dbKey,\n                    db: db\n                };\n            }\n\n            function _fetchStoredDb(dbKey: string, returnDefault?: boolean) {\n                let dbToStore;\n                if (_storage) {\n                    let previousDb = _storage[dbKey];\n\n                    if (previousDb) {\n                        try {\n                            dbToStore = getJSON().parse(previousDb);\n                        } catch (e) {\n                            // storage corrupted\n                            delete _storage[dbKey];\n                        }\n                    }\n\n                    if (returnDefault !== false && !dbToStore) {\n                        // Create and return a default empty database\n                        dbToStore = {\n                            evts: {},\n                            lastAccessTime: 0\n                        };\n                    }\n                }\n\n                return _newStore(dbKey, dbToStore);\n            }\n\n            function _updateStoredDb(jsonStore: any, updateLastAccessTime?: boolean) {\n                let dbToStore = jsonStore.db;\n                if (dbToStore) {\n                    if (updateLastAccessTime !== false) {\n                        // Update the last access time\n                        dbToStore.lastAccessTime = (new Date()).getTime();\n                    }\n                }\n\n                try {\n                    let jsonString = getJSON().stringify(dbToStore);\n                    if (jsonString.length > _maxStorageSizeInBytes) {\n                        // We can't store the database as it would exceed the configured max size\n                        return false;\n                    }\n\n                    _storage && (_storage[jsonStore.key] = jsonString);\n                } catch (e) {\n                    // catch exception due to trying to store or clear JSON\n                    // We could not store the database\n                    return false;\n                }\n\n                return true;\n            }\n\n            function _clearDatabase(dbKey: string) {\n                let removedItems: any[] = [];\n                let storeDetails = _fetchStoredDb(dbKey, false);\n                let currentDb = storeDetails.db;\n                if (currentDb) {\n                    try {\n                        let events = currentDb.evts;\n                        objForEachKey(events, (key) => {\n                            let evt = events[key];\n                            if (evt) {\n                                removedItems.push(evt);\n                            }\n\n                        });\n                    } catch (e) {\n                        // catch exception due to trying to store or clear JSON\n                    }\n\n                    // Remove the entire stored database\n                    _storage && delete _storage[storeDetails.key];\n                }\n\n                return removedItems;\n            }\n\n        });\n    }\n\n    /**\n     * Initializes the provider using the config\n     * @param providerContext - The provider context that should be used to initialize the provider\n     * @returns True if the provider is initialized and available for use otherwise false\n     */\n    public initialize(providerContext: ILocalStorageProviderContext): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Identifies whether this storage provider support synchronous requests\n     */\n    public supportsSyncRequests(): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Get all of the currently cached events from the storage mechanism\n     */\n    public getAllEvents(cnt?: number): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get the Next one cached batch from the storage mechanism\n     */\n    public getNextBatch(): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Stores the value into the storage using the specified key.\n     * @param key - The key value to use for the value\n     * @param evt - The actual event of the request\n     * @param itemCtx - This is the context for the current request\n     */\n    public addEvent(key: string, evt: any, itemCtx: IProcessTelemetryContext): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Removes the value associated with the provided key\n     * @param evts - The events to be removed\n     */\n    public removeEvents(evts: any[]): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Removes all entries from the storage provider, if there are any.\n     */\n    public clear(): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Removes all entries with storage time longer than inStorageMaxTime from the storage provider\n     */\n    public clean(): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n     */\n    public teardown(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n\n\n\n\n/**\n * Mock Storage Provider for testing - mimics WebStorageProvider but uses syncStorage instead of browser storage\n */\nexport class MockNoopProvider implements IOfflineProvider {\n    public id: string;\n\n    /**\n     * Creates a MockStorageProvider using syncStorage for testing\n     * @param syncStorage - The sync storage object to use for storing data\n     * @param id - Optional identifier for the provider\n     */\n    constructor(shouldInitialize: boolean, supportsSyncRequests: boolean) {\n        dynamicProto(MockNoopProvider, this, (_this) => {\n\n            _this.id = \"mock-syncnoop-provider\";\n\n            _this.initialize = (providerContext: ILocalStorageProviderContext, endpointUrl?: string) => {\n                return shouldInitialize;\n            };\n\n            _this.supportsSyncRequests = () => {\n                return supportsSyncRequests;\n            };\n\n            _this.getAllEvents = (cnt?: number) => {\n                return null;\n            };\n\n            _this.getNextBatch = () => {\n                return null;\n            };\n\n            _this.removeEvents = (evts: any[]) => {\n                return [];\n            };\n\n            _this.clear = () => {\n                return [];\n                \n            };\n\n            _this.clean = () => {\n                return false;\n            };\n\n        \n            _this.teardown = () => {\n                // tear down no op\n            };\n\n        });\n    }\n\n    /**\n     * Initializes the provider using the config\n     * @param providerContext - The provider context that should be used to initialize the provider\n     * @returns True if the provider is initialized and available for use otherwise false\n     */\n    public initialize(providerContext: ILocalStorageProviderContext): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Identifies whether this storage provider support synchronous requests\n     */\n    public supportsSyncRequests(): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Get all of the currently cached events from the storage mechanism\n     */\n    public getAllEvents(cnt?: number): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get the Next one cached batch from the storage mechanism\n     */\n    public getNextBatch(): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Stores the value into the storage using the specified key.\n     * @param key - The key value to use for the value\n     * @param evt - The actual event of the request\n     * @param itemCtx - This is the context for the current request\n     */\n    public addEvent(key: string, evt: any, itemCtx: IProcessTelemetryContext): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Removes the value associated with the provided key\n     * @param evts - The events to be removed\n     */\n    public removeEvents(evts: any[]): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Removes all entries from the storage provider, if there are any.\n     */\n    public clear(): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Removes all entries with storage time longer than inStorageMaxTime from the storage provider\n     */\n    public clean(): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n     */\n    public teardown(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/dbprovider.tests.ts",
    "content": "import { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { IndexedDbProvider } from \"../../../src/Providers/IndexDbProvider\";\nimport { createAsyncPromise, createAsyncRejectedPromise, createSyncPromise, doAwait, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { arrForEach, strSubstr } from \"@nevware21/ts-utils\";\nimport { TestChannel } from \"./TestHelper\";\nimport { AppInsightsCore, IConfiguration, createDynamicConfig, generateW3CId, newGuid } from \"@microsoft/applicationinsights-core-js\";\nimport { DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { IStorageTelemetryItem } from \"../../../src/Interfaces/IOfflineProvider\";\n\nexport class OfflineDbProviderTests extends AITestClass {\n    private core: AppInsightsCore;\n    private coreConfig: IConfig & IConfiguration;\n    private ctx: any;\n    private preEvts: IStorageTelemetryItem[] = [];\n    private batchDrop: any;\n \n    public testInitialize() {\n        super.testInitialize();\n        let channel = new TestChannel();\n        this.coreConfig = {\n            instrumentationKey: \"testIkey\",\n            endpointUrl: \"https://testurl.com\"\n        };\n        this.core = new AppInsightsCore();\n        this.core.initialize(this.coreConfig, [channel]);\n        this.ctx = {};\n        this.batchDrop = [];\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this.onDone(() => {\n            this.core.unload();\n        });\n        this.core = null as any;\n        this.coreConfig = null as any;\n        this.batchDrop = [];\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"IndexedDbProvider: init with auto clean set to false\",\n            test: () => {\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n                let ctx = provider[\"_getDbgPlgTargets\"]();\n                let expectedStorageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                Assert.equal(ctx[0], expectedStorageKey, \"should have expected storage\");\n                Assert.equal(ctx[1], \"dc.services.visualstudio.com\", \"default endpoint is set\");\n                let expectedMaxStorageTime = 604800000;\n                Assert.equal(ctx[2], expectedMaxStorageTime, \"default Max time is set\");\n                Assert.ok(!provider.supportsSyncRequests(), \"support sync should be set to false\");\n                // this test will run database creation/dbupgrade as well\n\n                provider.teardown();\n            }\n        });\n\n        this.testCase({\n            name: \"IndexedDbProvider: init with auto clean set to true\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({autoClean: true}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                };\n\n                return this._asyncQueue().add(() =>\n                    doAwait(provider.initialize(providerCxt), (val) => {\n                        this.ctx.isInit = val;\n                        Assert.ok(val, \"init process is successful\");\n                    }, (reason)=> {\n                        this.ctx.initErr = reason;\n                        Assert.ok(false, \"error for init\");\n                    })\n                ).add(() =>\n                    doAwait(provider.teardown(), () => {\n                        this.ctx.isclosed = true;\n                        Assert.ok(true, \"should teardown provider\");\n                    }, (reason) => {\n                        Assert.ok(false, \"error for teardown\");\n                    })\n                );\n            }\n        });\n\n        this.testCase({\n            name: \"IndexedDbProvider: addEvent with no previous stored events\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({autoClean: true}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                };\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n\n                return this._asyncQueue().add(() =>\n                    doAwait(provider.initialize(providerCxt), (val) => {\n                        this.ctx.isInit = val;\n                    }, (reason)=> {\n                        this.ctx.initErr = reason;\n                        Assert.ok(false, \"error for init\");\n                    })\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt, itemCtx), (item) => {\n                        this.ctx.evt = item;\n                        Assert.deepEqual(item, evt, \"should add expected item\");\n                        Assert.ok(evt.id, \"should add id to the item\");\n                        this.preEvts.push(evt);\n                    }, (reason) => {\n                        this.ctx.addEventErr = reason;\n                        Assert.ok(false, \"error for addEvt\");\n                    })\n                ).add(() =>\n                    doAwait(provider.getNextBatch(), (item) => {\n                        this.ctx.getEvt = item;\n                        Assert.equal(item && item.length, 1, \"should have one item\");\n                        Assert.deepEqual((item as any)[0], evt, \"should add expected item\");\n                    }, (reason) => {\n                        this.ctx.getEvtErr = reason;\n                        Assert.ok(false, \"error for get event\");\n                    })\n                ).add(() =>\n                    doAwait(provider.teardown(), () => {\n                        this.ctx.isclosed = true;\n                        Assert.ok(true, \"should teardown provider\");\n                    },(reason) => {\n                        Assert.ok(false, \"error for teardown\");\n                    })\n                );\n            }\n        });\n\n        this.testCase({\n            name: \"IndexedDbProvider: addEvent with previous stored events\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({autoClean: true}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                };\n\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 1, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 2, false);\n\n                return this._asyncQueue().add(() =>\n                    doAwait(provider.initialize(providerCxt), (val) => {\n                        this.ctx.isInit = val;\n                    }, (reason)=> {\n                        this.ctx.initErr = reason;\n                        Assert.ok(false, \"error for init\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.getAllEvents(), (val) => {\n                        this.ctx.preEvts = val;\n                        Assert.equal(val && val.length, 1 , \"should have the event from the previous test\");\n                        Assert.ok((val as any)[0].id, \"should have id\");\n                        Assert.equal((val as any)[0].id, this.preEvts[0].id, \"should get back expected previous events\");\n                    }, (reason)=> {\n                        this.ctx.preEvtsErr = reason;\n                        Assert.ok(false, \"get previous events error\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt, itemCtx), (item) => {\n                        this.ctx.evt = item;\n                        Assert.equal(item, evt, \"should have one event\");\n                    }, (reason)=> {\n                        this.ctx.preEvtsErr = reason;\n                        Assert.ok(false, \"get previous events error\");\n                    })\n                ).add(() =>\n                    doAwait(provider.getAllEvents(), (val) => {\n                        this.ctx.allEvts = val;\n                        Assert.equal(val && val.length, 2 , \"should have the two events\");\n                        Assert.deepEqual((val as any)[1], evt, \"should get back expected added events\");\n                    }, (reason) => {\n                        this.ctx.addEventErr = reason;\n                        Assert.ok(false, \"add event error\");\n                    })\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt1, itemCtx), (item) => {\n                        this.ctx.evt1 = item;\n                        Assert.deepEqual(item, evt1, \"should have expected event1\");\n                    }, (reason) => {\n                        this.ctx.addEvent1Err = reason;\n                        Assert.ok(false, \"add event1 error\");\n                    })\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt2, itemCtx), (item) => {\n                        this.ctx.evt2 = item;\n                        Assert.deepEqual(item, evt2, \"should have expected event2\");\n                    }, (reason) => {\n                        this.ctx.addEvent2Err = reason;\n                        Assert.ok(false, \"add event2 error\");\n                    })\n                    \n                ).add(() =>\n                    doAwait(provider.getAllEvents(), (val) => {\n                        this.ctx.allEvts1 = val;\n                        Assert.equal(val && (val as any).length, 4, \"should have four events\");\n                    }, (reason)=> {\n                        this.ctx.oneEvtsErr = reason;\n                        Assert.ok(false, \"get all events1 error\");\n                    })\n                   \n                ).add(() =>\n                    doAwait(provider.getNextBatch(), (val) => {\n                        this.ctx.nextBatch = val;\n                        Assert.equal(val && (val as any).length, 1, \"should return one event\");\n                        Assert.deepEqual((val as any)[0], this.preEvts[0], \"should have return the earliest event\");\n                    }, (reason)=> {\n                        this.ctx.nextBatchErr = reason;\n                        Assert.ok(false, \"get next batch error\");\n                    })\n                ).add(() =>\n                    doAwait(provider.getAllEvents(2), (val) => {\n                        this.ctx.twoEvts = val;\n                        Assert.equal(val && (val as any).length, 2, \"should return two events\");\n                        Assert.deepEqual((val as any)[0], this.preEvts[0], \"should have return the earliest event1\");\n                    }, (reason)=> {\n                        this.ctx.twoEvtsErr = reason;\n                        Assert.ok(false, \"get two events error\");\n                    })\n                ).add(() =>\n                    doAwait(provider.clear(), (val) => {\n                        this.ctx.clear = val;\n                        Assert.equal(val && (val as any).length, 4, \"should clear all events\");\n                    }, (reason)=> {\n                        this.ctx.twoEvtsErr = reason;\n                        Assert.ok(false, \"get two events error\");\n                    })\n                ).add(() =>\n                    doAwait(provider.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    }, (reason) => {\n                        Assert.ok(false, \"teardown error\");\n\n                    })\n                )\n            }\n        });\n\n\n        this.testCase({\n            name: \"IndexedDbProvider: getAllEvents should handle cursor errors\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({autoClean: true}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                };\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n\n                return this._asyncQueue().add(() =>\n                    doAwait(provider.initialize(providerCxt), (val) => {\n                        this.ctx.isInit = val;\n                    }, (reason)=> {\n                        this.ctx.initErr = reason;\n                        Assert.ok(false, \"error for init\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt, itemCtx), (item) => {\n                        this.ctx.evt = item;\n                    }, (reason) => {\n                        this.ctx.addEventErr = reason;\n                        Assert.ok(false, \"add evt error\");\n                        doAwait(provider.teardown(), () => {\n                            this.ctx.isclosed = true;\n                        });\n                    })\n\n                ).add(() => {\n                    let ctx = provider[\"_getDbgPlgTargets\"]();\n                    let db = ctx[3];\n                    this.sandbox.stub(db as any, \"openDb\").callsFake((name, ver, func, change?) => {\n                        return createAsyncPromise((resolve, reject)=> {\n                            try {\n                                let openDbCtx = {\n                                    openCursor: (var1, var2, var3?) => {\n                                        return createAsyncRejectedPromise(new Error(\"open cursor mock error\"));\n                                    }\n                                }\n                                // Database has been opened\n                                doAwait(func(openDbCtx), resolve, reject);\n                            } catch (e) {\n                                reject(e);\n                            }\n                        });\n                    });\n                    return doAwait(provider.getNextBatch(), (val) => {\n                        this.ctx.nextBatch = val;\n                        Assert.ok(false, \"should handle errors\");\n                    }, (reason)=> {\n                        this.ctx.nextBatchErr = reason;\n                        Assert.equal(reason.message, \"open cursor mock error\");\n                    });\n\n                }).add(() =>\n                    doAwait(provider.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    },(reason) => {\n                        Assert.ok(false, \"teardown errors\");\n                    })\n                )\n            }\n        });\n\n\n        this.testCase({\n            name: \"IndexedDbProvider: removeEvents should delete expected events\",\n            test: () => {\n                this.core.addNotificationListener({\n                    offlineBatchDrop: (cnt, reason)=> {\n                        this.batchDrop.push({cnt: cnt, reason: reason});\n                    }\n                });\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({autoClean: true, inStorageMaxTime:1}).cfg; // this should clean all previous events\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint,\n                    notificationMgr: this.core.getNotifyMgr()\n                };\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 1, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt4 = TestHelper.mockEvent(endpoint, 4, false);\n                \n                return this._asyncQueue().add(() =>\n                    doAwait(provider.initialize(providerCxt), (val) => {\n                        this.ctx.isInit = val;\n                    }, (reason)=> {\n                        this.ctx.initErr = reason;\n                        Assert.ok(false, \"error for init\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.removeEvents([evt]), (item) => {\n                        this.ctx.removeEvts = item;\n                        Assert.deepEqual(item && item.length, 0,\"should not delete any events\");\n                    }, (reason) => {\n                        this.ctx.removeEvtsErr = reason;\n                        Assert.ok(false, \"error for remove events\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt, itemCtx), (item) => {\n                        this.ctx.evt = item;\n                        Assert.deepEqual(item, evt, \"should add exepcted evt\");\n                    }, (reason) => {\n                        this.ctx.addEventErr = reason;\n                        Assert.ok(false, \"error for add events\");\n                    })\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt1, itemCtx), (item) => {\n                        this.ctx.evt1 = item;\n                        Assert.deepEqual(item, evt1, \"should add exepcted evt1\");\n                    }, (reason) => {\n                        this.ctx.addEvent1Err = reason;\n                        Assert.ok(false, \"error for add event 1\");\n                    })\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt2, itemCtx), (item) => {\n                        this.ctx.evt2 = item;\n                        Assert.deepEqual(item, evt2, \"should add exepcted evt2\");\n                    }, (reason) => {\n                        this.ctx.addEvent2Err = reason;\n                        Assert.ok(false, \"error for add event 2\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.getAllEvents(), (val) => {\n                        this.ctx.allEvts = val;\n                        Assert.deepEqual(val && val.length, 3, \"should have all expected 3 events\");\n                    }, (reason)=> {\n                        this.ctx.allEvtsErr = reason;\n                        Assert.ok(false, \"error for get all events\");\n                        \n                    })\n\n                ).add(() =>\n                    doAwait(provider.removeEvents([evt4]), (item) => {\n                        this.ctx.removeEvts1 = item;\n                        Assert.deepEqual(item && item.length, 0, \"should not delete event1\");\n                    }, (reason) => {\n                        this.ctx.removeEvts1Err = reason;\n                        Assert.ok(false, \"error for remove events1\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.removeEvents([evt, evt1]), (item) => {\n                        this.ctx.removeEvts2 = item;\n                        Assert.deepEqual(item && item.length, 2, \"should delete all expected events\");\n                        let item1 = (item as any)[0];\n                        let item2 = (item as any)[1];\n                        if (item1.id == evt1.id) {\n                            Assert.deepEqual(item1, evt1, \"should have deleted all event\");\n                            Assert.deepEqual(item2, evt, \"should have deleted all event1\");\n                        } else {\n                            Assert.deepEqual(item1, evt, \"should have deleted all event\");\n                            Assert.deepEqual(item2, evt1, \"should have deleted all event1\");\n                        }\n                    }, (reason) => {\n                        this.ctx.removeEvts2Err = reason;\n                        Assert.ok(false, \"error for remove events2\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.getAllEvents(), (val) => {\n                        this.ctx.allEvts1 = val;\n                        Assert.deepEqual(val && val.length, 1, \"should have one event remaining\");\n                        Assert.deepEqual((val as any)[0], evt2, \"should have evt2\");\n                    }, (reason)=> {\n                        this.ctx.allEvts1Err = reason;\n                        Assert.ok(false, \"error for get all evts1\");\n                    })\n                ).add(() =>\n                    doAwait(provider.teardown(), () => {\n                        this.ctx.isclosed = true;\n                        Assert.equal(this.batchDrop.length, 1, \"notification should be called once\"); // sent in clean process during initialization\n                        Assert.equal(this.batchDrop[0].reason, 3, \"notification should be called with expected reason time exceeded\");\n                    },(reason) => {\n                        Assert.ok(false, \"teardown error\");\n\n                    })\n\n                )\n            }\n        });\n\n\n        this.testCase({\n            name: \"IndexedDbProvider: clear should delete all events\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                };\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 1, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 2, false);\n                \n                return this._asyncQueue().add(() =>\n                    doAwait(provider.initialize(providerCxt), (val) => {\n                        this.ctx.isInit = val;\n                    }, (reason)=> {\n                        this.ctx.initErr = reason;\n                        Assert.ok(false, \"error for init\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt, itemCtx), (item) => {\n                        this.ctx.evt = item;\n                        Assert.deepEqual(item, evt, \"should add evt\");\n                    }, (reason) => {\n                        this.ctx.addEventErr = reason;\n                        Assert.ok(false, \"error for add evt\");\n                    })\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt1, itemCtx), (item) => {\n                        this.ctx.evt1 = item;\n                        Assert.deepEqual(item, evt1, \"should add evt1\");\n                    }, (reason) => {\n                        this.ctx.addEvent1Err = reason;\n                        Assert.ok(false, \"error for add evt1\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.addEvent(\"\", evt2, itemCtx), (item) => {\n                        this.ctx.evt2 = item;\n                        Assert.deepEqual(item, evt2, \"should add evt2\");\n                    }, (reason) => {\n                        this.ctx.addEvent2Err = reason;\n                        Assert.ok(false, \"error for add evt2\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.clear(), (val)=> {\n                        this.ctx.clearEvts = val;\n                        Assert.ok(val && val.length >= 3, \"should clear events\"); // may have the events from previous test\n                    }, (reason)=> {\n                        this.ctx.clearEvtsErr = reason;\n                        Assert.ok(false, \"error for clear\");\n\n                    })\n\n                ).add(() =>\n                    doAwait(provider.getAllEvents(), (val) => {\n                        this.ctx.allEvts1 = val;\n                        Assert.equal(val && val.length, 0, \"should not have any events\" );\n                    }, (reason)=> {\n                        this.ctx.allEvts1Err = reason;\n                        Assert.ok(false, \"get events error\");\n                    })\n                ).add(() =>\n                    doAwait(provider.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    },(reason) => {\n                        Assert.ok(false, \"teardown error\");\n                    })\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"IndexedDbProvider: clean should delete all events that exist longer than max storage time\",\n            pollDelay: 100,\n            useFakeTimers: true,\n            test: () => {\n                this.core.addNotificationListener({\n                    offlineBatchDrop: (cnt, reason)=> {\n                        this.batchDrop.push({cnt: cnt, reason: reason});\n                    }\n                });\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({inStorageMaxTime: 30000}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint,\n                    notificationMgr: this.core.getNotifyMgr()\n                };\n\n                doAwait(provider.initialize(providerCxt), (val) => {\n                    this.ctx.isInit = val;\n                }, (reason)=> {\n                    this.ctx.initErr = reason;\n                    Assert.ok(false, \"error for init\");\n                });\n\n   \n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 1, false);\n               \n                doAwait(provider.addEvent(\"\", evt, itemCtx), (item) => {\n                    this.ctx.evt = item;\n                    Assert.deepEqual(item, evt, \"should add event\");\n                }, (reason) => {\n                    this.ctx.addEventErr = reason;\n                    Assert.ok(false, \"error for add event\");\n                });\n                doAwait(provider.addEvent(\"\", evt1, itemCtx), (item) => {\n                    this.ctx.evt1 = item;\n                    Assert.deepEqual(item, evt1, \"should add event1\");\n                }, (reason) => {\n                    this.ctx.addEvent1Err = reason;\n                    Assert.ok(false, \"error for add event1\");\n                });\n                this.clock.tick(25000);\n\n\n                let evt2 = TestHelper.mockEvent(endpoint, 2, false);\n                doAwait(provider.addEvent(\"\", evt2, itemCtx), (item) => {\n                    this.ctx.evt2 = item;\n                    Assert.deepEqual(item, evt2, \"should add event2\");\n                }, (reason) => {\n                    this.ctx.addEvent2Err = reason;\n                    Assert.ok(false, \"error for add event2\");\n                });\n                doAwait(provider.getAllEvents(), (val) => {\n                    this.ctx.allEvts = val;\n                    Assert.equal(val && val.length, 3, \"should have three events\");\n                }, (reason)=> {\n                    this.ctx.allEvtsErr = reason;\n                    Assert.ok(false, \"error for get events\");\n                });\n                doAwait(provider.clean(), (val) => {\n                    this.ctx.cleanEvts = val;\n                    Assert.equal(val, true, \"should clean events\");\n                }, (reason)=> {\n                    this.ctx.cleanEvtsErr = reason;\n                    Assert.ok(false, \"error for clean\");\n                });\n\n\n                doAwait(provider.getAllEvents(), (val) => {\n                    this.ctx.allEvts1 = val;\n                    Assert.equal(val && val.length, 1, \"should only have one event\");\n                }, (reason)=> {\n                    this.ctx.allEvts1Err = reason;\n                    Assert.ok(false, \"get all events error\")\n                });\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let isInit = this.ctx.isInit;\n                    if (isInit) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for Init response\" + new Date().toISOString(), 30, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let items = this.ctx.allEvts;\n                    let cnt = 0;\n                    if (items && items.length == 3) {\n                        arrForEach(items, (item) => {\n                            cnt += item.criticalCnt;\n                        })\n                        Assert.equal(cnt, 6, \"should get expected three events\");\n                        return true;\n                    }\n                \n                    return false;\n                }, \"Wait for get Events response\" + new Date().toISOString(), 30, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let item = this.ctx.cleanEvts;\n                \n                    if (item) {\n                        return true;\n                    }\n                \n                    return false;\n                }, \"Wait for clean Events response\" + new Date().toISOString(), 30, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let items = this.ctx.allEvts1;\n                \n                    if (items) {\n                        doAwait(provider.teardown(), () => {\n                            this.ctx.isclosed = true;\n                        });\n                        return true;\n                    }\n                \n                    return false;\n                }, \"Wait for get Events1 response\" + new Date().toISOString(), 30, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let isclosed = this.ctx.isclosed;\n                    if (isclosed) {\n                        Assert.equal(this.batchDrop.length, 1, \"notification should be called once\");\n                        Assert.equal(this.batchDrop[0].cnt, 2, \"notification should be called with 2 count\");\n                        Assert.equal(this.batchDrop[0].reason, 3, \"notification should be called with expected reason clean time exceeded\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for close response\" + new Date().toISOString(), 30, 1000))\n            }\n        });\n\n\n        this.testCase({\n            name: \"IndexedDbProvider: Error handle should handle open errors\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new IndexedDbProvider();\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({autoClean: true}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                };\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n\n                return this._asyncQueue().add(() =>\n                    doAwait(provider.initialize(providerCxt), (val) => {\n                        this.ctx.isInit = val;\n                        let ctx = provider[\"_getDbgPlgTargets\"]();\n                        let db = ctx[3];\n                        this.sandbox.stub(db as any, \"openDb\").callsFake((name, ver, func, change?) => {\n                            return createAsyncPromise((resolve, reject)=> {\n                                try {\n                                    let openDbCtx = {\n                                        openCursor: (var1, var2, var3?) => {\n                                            return createAsyncRejectedPromise(new Error(\"open cursor mock error\"));\n                                        },\n                                        openStore: (var1, var2, var3) => {\n                                            return createAsyncRejectedPromise(new Error(\"open store mock error\"));\n                                        }\n                                    }\n                                    // Database has been opened\n                                    doAwait(func(openDbCtx), resolve, reject);\n                                } catch (e) {\n                                    reject(e);\n                                }\n\n                            });\n                        });\n                    }, (reason)=> {\n                        this.ctx.initErr = reason;\n                        Assert.ok(false, \"error for init\");\n                    })\n\n                ).add(() => {\n                    \n                    return doAwait(provider.addEvent(\"\", evt, itemCtx), (item) => {\n                        this.ctx.evt = item;\n                        Assert.ok(false, \"should handle add event error\");\n                    }, (reason) => {\n                        this.ctx.addEvent = reason;\n                        Assert.equal(reason.message, \"open store mock error\", \"add event message\");\n                    })\n                        \n\n                }).add(() => {\n                    doAwait(provider.getNextBatch(), (val) => {\n                        Assert.ok(false, \"should handle get next batch error\")\n                    }, (reason)=> {\n                        this.ctx.nextBatch = reason;\n                        Assert.equal(reason.message, \"open cursor mock error\", \"get next batch message\");\n                    })\n\n                }).add(() => {\n                    doAwait(provider.getAllEvents(), (val) => {\n                        Assert.ok(false, \"should handle get all events error\")\n                    }, (reason)=> {\n                        this.ctx.allEvts = reason;\n                        Assert.equal(reason.message, \"open cursor mock error\", \"get all events message\")\n                    })\n\n                }).add(() => {\n                    doAwait(provider.removeEvents([evt]), (val) => {\n                        this.ctx.removeEvts = val;\n                        Assert.deepEqual([], val, \"should handle remove events error\")\n                    }, (reason)=> {\n                        this.ctx.removeEvtsErr = reason;\n                        Assert.ok(false, \"error for get next batch\");\n                    })\n\n                }).add(() =>\n                    doAwait(provider.clear(), (val) => {\n                        this.ctx.clear = val;\n                        Assert.deepEqual([], val, \"should handle clear error\")\n                    }, (reason)=> {\n                        this.ctx.clearErr = reason;\n                        Assert.ok(false, \"error for clear\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.clean(), (val) => {\n                        this.ctx.clean = val;\n                        Assert.ok(!val, \"should handle clean error\")\n                    }, (reason)=> {\n                        this.ctx.cleanErr = reason;\n                        Assert.ok(false, \"error for clean\");\n                    })\n\n                ).add(() =>\n                    doAwait(provider.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    },(reason) => {\n                        Assert.ok(false, \"teardown error\");\n                    })\n                )\n            }\n        });\n\n    }\n}\n\n\nclass TestHelper {\n    private static _idCount = 0;\n\n    static reset(key: string) {\n        this._idCount = 0;\n        AITestClass.orgLocalStorage.removeItem(key);\n    }\n\n    static mockEvent(endPointUrl: string, criticalCnt: number, setId = true): IStorageTelemetryItem {\n        this._idCount++;\n        let time = new Date().getTime();\n        let random = strSubstr(generateW3CId(), 0, 8);\n        let payload = {\n            urlString: endPointUrl,\n            data: '[{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}},{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}}]',\n            headers: {\n                \"header1\": \"header1val\",\n                \"header2\": \"header2val\"\n            },\n            disableXhrSync: false,\n            disableFetchKeepAlive: false,\n            sendReason: 1,\n            id: setId? random : \"\",\n            iKey: \"testIKey123\",\n            criticalCnt: criticalCnt\n        }\n        return payload;\n    }\n \n}\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/inmemorybatch.tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport {IPostTransmissionTelemetryItem} from \"../../../src/Interfaces/IInMemoryBatch\";\nimport { InMemoryBatch } from \"../../../src/InMemoryBatch\";\nimport { DiagnosticLogger, IDiagnosticLogger, arrForEach } from \"@microsoft/applicationinsights-core-js\";\nimport { base64Decode, base64Encode, forEachMap, getEndpointDomain, getPersistence } from \"../../../src/Helpers/Utils\";\nimport { IStorageTelemetryItem } from \"../../../src/Interfaces/IOfflineProvider\";\n\n\nexport class OfflineInMemoryBatchTests extends AITestClass {\n    private _logger: IDiagnosticLogger;\n\n    public testInitialize() {\n        super.testInitialize();\n        this._logger = new DiagnosticLogger();\n        \n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this._logger = null as any;\n       \n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"Init: Init should contain expected events\",\n            test: () => {\n                let endpoint = \"testEndpoint\";\n                let inMemoBatch = new InMemoryBatch(this._logger, endpoint);\n                let evts = inMemoBatch.getItems();\n                Assert.deepEqual(evts, [], \"should have no events\");\n\n                let mockEvt = mockPostTransmissionTelemetryItem();\n                let evtArr = [mockEvt, mockEvt, mockEvt, mockEvt, mockEvt, mockEvt];\n                inMemoBatch = new InMemoryBatch(this._logger, endpoint, evtArr);\n                evts = inMemoBatch.getItems();\n                Assert.deepEqual(evts.length, 6, \"should have 6 events\");\n            }\n            \n        });\n\n\n        this.testCase({\n            name: \"Add Event: Add Event with expected event limit \",\n            test: () => {\n                let endpoint = \"testEndpoint\";\n                let inMemoBatch = new InMemoryBatch(this._logger, endpoint, undefined, 2);\n                let evts = inMemoBatch.getItems();\n                Assert.deepEqual(evts, [], \"should have no events\");\n\n                let mockEvt = mockPostTransmissionTelemetryItem();\n                inMemoBatch.addEvent(mockEvt);\n                inMemoBatch.addEvent(mockEvt);\n\n                evts = inMemoBatch.getItems();\n                Assert.deepEqual(evts.length, 2, \"should have 2 events\");\n               \n                let isAdded = inMemoBatch.addEvent(mockEvt);\n\n                Assert.ok(!isAdded, \"should not added\");\n                \n\n                evts = inMemoBatch.getItems();\n                Assert.deepEqual(evts.length, 2, \"should have 2 events test1\");\n\n                inMemoBatch.clear();\n                evts = inMemoBatch.getItems();\n                Assert.deepEqual(evts.length, 0, \"should clear events\");\n\n            }\n            \n        });\n       \n        this.testCase({\n            name: \"Get domain: get domain from endpoint\",\n            test: () => {\n                let testUrl: string[] = [\n                    \"test.com\",\n                    \"http://test.com\",\n                    \"https://test.com\",\n                    \"www.test.com\",\n                    \"https://test.com?test\",\n                    \"https://test.com??test\",\n                    \"https://test.com?test?test123\"\n                ]\n                let expectedDomain =  \"test.com\";\n\n                arrForEach(testUrl, (url) => {\n                    let domain =  getEndpointDomain(url);\n                    Assert.equal(domain, expectedDomain, \"should get expected domain\");\n                });\n\n                let domain = getEndpointDomain(\"http://test.us.eu-east.com?warmpth&auth=true\");\n                Assert.equal(domain, \"test.us.eu-east.com\", \"should get expected domain\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Uint8 tranform: Encode and decode Uint8 array\",\n            test: () => {\n                let arr = new Uint8Array([255,255,1,236,45,18]);\n             \n                let str = base64Encode(arr);\n                Assert.equal(str, \"MjU1LDI1NSwxLDIzNiw0NSwxOA==\", \"get expected string\")\n\n                let decode = base64Decode(str);\n                Assert.deepEqual(decode, arr, \"should return expected arr\")\n                Assert.deepEqual(decode.toString(), arr.toString(), \"get expected arr string back\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Get Persistent Level: Get persistent level from a telemetry item\",\n            test: () => {\n                let arr1 = [\n                    null,\n                    {},\n                    {name: \"test\"},\n                    {name: \"test\", baseData: {prop1: \"prop1\"}, data: {prop1: \"prop1\"}},\n                    {name: \"test\", persistence: 1},\n                    {name: \"test\", baseData: {persistence: 1, prop1: \"prop1\"}},\n                    {name: \"test\", data: {persistence: 1, prop1: \"prop1\"}},\n                    {name: \"test\", baseData: {persistence: 1, prop1: \"prop1\"}, data: {persistence: 2, prop1: \"prop1\"}},\n                    {name: \"test\", persistence: 1, baseData: {persistence: 2, prop1: \"prop1\"}, data: {persistence: 2, prop1: \"prop1\"}}\n                ];\n\n                arrForEach(arr1, (item) => {\n                    let level =  getPersistence(item as any);\n                    Assert.equal(level, 1, \"should get expected level\");\n                });\n                \n            }\n            \n        });\n\n        this.testCase({\n            name: \"Util for order map: should get events id in order\",\n            test: () => {\n                let arr1 = [\"1\", \"5.1\", \"2.abc\", \"6.jdfhhdf\", \"4.123\",\"8.123\"];\n                let expectedArr = [\"2.abc\", \"4.123\", \"5.1\", \"6.jdfhhdf\", \"8.123\", \"1\"];\n                let evts: {[key: string]:IStorageTelemetryItem} = {};\n                let idArr: string[] = [];\n\n                arrForEach(arr1, (id) => {\n                    let evt = mockStorageItem(id);\n                    evts[id] = evt;\n                });\n\n                forEachMap({}, (val, key) => {\n                    idArr.push(key);\n                    return true;\n                }, true);\n\n\n                forEachMap(evts, (val, key) => {\n                    idArr.push(key);\n                    return true;\n                }, true);\n\n                Assert.deepEqual(idArr, expectedArr, \"should get expected ordered id array\");\n                \n                \n            }\n            \n        });\n    }\n}\n\nfunction mockPostTransmissionTelemetryItem(): IPostTransmissionTelemetryItem {\n    let evt = {\n        ver: \"testVer\",\n        name:\"testName\",\n        time: \"testTime\",\n        iKey:\"testKey\",\n        sendAttempt: 1,\n        baseData: {pro1: \"prop1\"}\n\n    } as IPostTransmissionTelemetryItem;\n    return evt;\n}\n\nfunction mockStorageItem(id: string): IStorageTelemetryItem {\n    let evt = {\n        id: id,\n        urlString: \"testString\",\n        data: \"testData\"\n    } as IStorageTelemetryItem;\n    return evt;\n\n}"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/offlinebatchhandler.tests.ts",
    "content": "import { AITestClass, Assert, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore, IConfiguration, IPayloadData, OnCompleteCallback, arrForEach, createDynamicConfig, newGuid } from \"@microsoft/applicationinsights-core-js\";\nimport { TestChannel } from \"./TestHelper\";\nimport { DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { IOfflineChannelConfiguration, eStorageProviders } from \"../../../src/Interfaces/IOfflineProvider\";\nimport { OfflineBatchHandler } from \"../../../src/OfflineBatchHandler\";\nimport { createAsyncRejectedPromise, doAwait, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { eBatchSendStatus, eBatchStoreStatus } from \"../../../src/Interfaces/IOfflineBatch\";\n\nexport class OfflineBatchHandlerTests extends AITestClass {\n    private core: AppInsightsCore;\n    private coreConfig: IConfig & IConfiguration;\n    private ctx: any;\n    private batchHandler: any;\n \n    public testInitialize() {\n        super.testInitialize();\n        let channel = new TestChannel();\n        this.coreConfig = {\n            instrumentationKey: \"testIkey\",\n            endpointUrl: \"https://testurl.com\"\n        };\n        this.core = new AppInsightsCore();\n        this.core.initialize(this.coreConfig, [channel]);\n        \n   \n        this.ctx = {};\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        AITestClass.orgLocalStorage.clear();\n        this.onDone(() => {\n            this.core.unload();\n        });\n        this.core = null as any;\n        this.coreConfig = null as any;\n        \n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"Offline Batch Handler: init with web storge provider\",\n            test: () => {\n                let storageObj = {providers:[eStorageProviders.LocalStorage, eStorageProviders.SessionStorage], autoClean: true } as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n\n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint:DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n\n                batchHandler.teardown();\n            }\n        });\n\n        this.testCase({\n            name: \"Offline Batch Handler: init with IndexedDB storge provider\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.IndexedDb], autoClean: true, inStorageMaxTime: 1 } as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n\n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                return this._asyncQueue().add(() =>\n                    doAwait(batchHandler.initialize(providerCxt),(res) => {\n                        this.ctx.isInit = true;\n                        let items = batchHandler[\"_getDbgPlgTargets\"]();\n                        let provider = items[0];\n                        let isInit = items[1];\n                        Assert.ok(provider, \"provider is initialized\");\n                        Assert.ok(isInit, \"initialization is successful\");\n                   \n                    },(reason) => {\n                        Assert.ok(false, \"init errors\");\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.teardown(),(res) => {\n                        this.ctx.isclosed = true;\n                    },(reason) => {\n                        Assert.ok(false, \"teardown errors\");\n                    })\n                )\n\n            }\n                \n        });\n\n        this.testCase({\n            name: \"Store Batch: store batch with web storge provider\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true } as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n\n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                this.ctx.isInit = true;\n                this.ctx.handler = batchHandler;\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n\n                let result:any[] = [];\n                let cb = (res) => {\n                    result.push(res);\n                }\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n                \n                return this._asyncQueue().add(() =>\n                    doAwait(batchHandler.storeBatch(evt, cb) as any,(storeRes) => {\n                        this.ctx.storeBatch = true;\n                        this.ctx.result = result;\n                        let res = result[0];\n                        let state = res.state == eBatchStoreStatus.Success;\n                        Assert.ok(state, \"state should be ok\");\n                        let item = res.item;\n                        Assert.ok(item.id, \"item id should be set\");\n                        Assert.equal(item.criticalCnt, 1, \"expected item should be returned\");\n\n                        let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                        let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                        let storageObject = JSON.parse(storageStr);\n                        let storageEvts = storageObject.evts;\n                        Assert.deepEqual(Object.keys(storageEvts).length, 1, \"storgae should only have one event\");\n                        Assert.ok(storageEvts[item.id], \"storgae should contain expected item\");\n                        \n                        \n                    }, (reason) => {\n                        Assert.ok(false, \"init error\");\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.hasStoredBatch(),(res) => {\n                        this.ctx.hasBatch = res;\n                    }, (reason) => {\n                        Assert.ok(false, \"hasStoreBatch error\")\n                    })\n\n                ).add(() =>\n                    doAwait( batchHandler.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    },(reason) => {\n                        Assert.ok(false, \"teardown errors\")\n                    })\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Store Batch: store batch with indexedDB storge provider\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.IndexedDb], autoClean: true, inStorageMaxTime:1} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n\n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                let result:any[] = [];\n                let cb = (res) => {\n                    this.ctx.storeBatch = true;\n                    result.push(res);\n                }\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n                \n                return this._asyncQueue().add(() =>\n                    doAwait(batchHandler.initialize(providerCxt),(res) => {\n                        this.ctx.isInit = true;\n                        let items = batchHandler[\"_getDbgPlgTargets\"]();\n                        let provider = items[0];\n                        let isInit = items[1];\n                        Assert.ok(provider, \"provider is initialized\");\n                        Assert.ok(isInit, \"initialization is successful\");\n                    },(reason) => {\n                        Assert.ok(false, \"init errors\")\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt, cb) as any,(res) => {\n                        this.ctx.storeBatch = true;\n                        this.ctx.result = result;\n                    }, (reason) => {\n                        Assert.ok(false, \"storebatch error\")\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.hasStoredBatch(),(res) => {\n                        this.ctx.hasBatch = res;\n                    }, (reason) => {\n                        Assert.ok(false, \"hasbatch error\");\n                    })\n\n                ).add(() =>\n                    doAwait( batchHandler.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    }, (reason) => {\n                        Assert.ok(false, \"teardown error\")\n                    })\n\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Clean Batch: clean batch with web storge provider\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true, inStorageMaxTime:1} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n\n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                this.ctx.isInit = true;\n                this.ctx.handler = batchHandler;\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n\n                let result:any[] = [];\n                let cb = (res) => {\n                    result.push(res);\n                }\n                let cb1 = (res) => {\n                    this.ctx.hasBatch = res;\n                }\n                let cb2 = (res) => {\n                    this.ctx.cleanBatch = true;\n                    this.ctx.cleanBatchRes = res;\n                }\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 3, false);\n\n                return this._asyncQueue().add(() =>\n                    doAwait(batchHandler.storeBatch(evt, cb) as any,(res) => {\n                        this.ctx.storeBatch = 1;\n                        this.ctx.result = result;\n                    },(reason) => {\n                        Assert.ok(false, \"init errors\");\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt1, cb) as any,(res) => {\n                        this.ctx.storeBatch = 2;\n                        this.ctx.result = result;\n                    },(reason) => {\n                        Assert.ok(false, \"store batch errors\");\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt2, cb) as any,(res) => {\n                        this.ctx.storeBatch = 3;\n                        this.ctx.result = result;\n                        let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                        let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                        let storageObject = JSON.parse(storageStr);\n                        let storageEvts = storageObject.evts;\n                        Assert.deepEqual(Object.keys(storageEvts).length, 3, \"storage should have three events\");\n                    },(reason) => {\n                        Assert.ok(false, \"storebatch error\")\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.hasStoredBatch(cb1),(res) => {\n                    }, (reason) => {\n                        Assert.ok(false, \"hasstoredbatch error\");\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.cleanStorage(cb2) as any,(cleanRes) => {\n                        let res = this.ctx.cleanBatchRes;\n                        Assert.equal(res.batchCnt, 3, \"should clean all three items\");\n                        let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                        let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                        let storageObject = JSON.parse(storageStr);\n                        let storageEvts = storageObject.evts;\n                        Assert.deepEqual(Object.keys(storageEvts).length, 0, \"storgae should not only have any event\");\n                    },(reason) => {\n                        Assert.ok(false, \"clean storage errors\")\n                    })\n\n                ).add(() =>\n                    doAwait( batchHandler.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    }, (reason) => {\n                        Assert.ok(false, \"teardown error\")\n                    })\n\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Clean Batch: clean batch with IndexedDB storge provider\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.IndexedDb], autoClean: true, inStorageMaxTime:1} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n                AITestClass.orgLocalStorage.clear();\n\n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                let provider;\n                let result:any[] = [];\n                let cb = (res) => {\n                    result.push(res);\n                }\n                let cb1 = (res) => {\n                    this.ctx.hasBatch = res;\n                }\n                let cb2 = (res) => {\n                    this.ctx.cleanBatch = true;\n                    this.ctx.cleanBatchRes = res;\n                }\n                let cb3 = (res) => {\n                    this.ctx.hasBatch1Called = true;\n                    this.ctx.hasBatch1 = res;\n                }\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 3, false);\n                \n                return this._asyncQueue().add(() =>\n                    doAwait(batchHandler.initialize(providerCxt),(res) => {\n                        this.ctx.isInit = true;\n                        let items = batchHandler[\"_getDbgPlgTargets\"]();\n                        provider = items[0];\n                        let isInit = items[1];\n                        Assert.ok(provider, \"provider is initialized\");\n                        Assert.ok(isInit, \"initialization is successful\");\n                    }, (reason) => {\n                        Assert.ok(false, \"init errors\")\n                    })\n\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt, cb) as any,(res) => {\n                        this.ctx.storeBatch = 1;\n                        this.ctx.result = result;\n                    }, (reason) => {\n                        Assert.ok(false, \"store batch errors\")\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt1, cb) as any,(res) => {\n                        this.ctx.storeBatch = 2;\n                        this.ctx.result = result;\n                    }, (reason) => {\n                        Assert.ok(false, \"store batch error 1\")\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt2, cb) as any,(res) => {\n                        this.ctx.storeBatch = 3;\n                        this.ctx.result = result;\n                        Assert.equal(result.length, 3, \"response should have three items\");\n                    }, (reason) => {\n                        Assert.ok(false, \"store batch error 2\")\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.hasStoredBatch(cb1),(res) => {},(reason) => {\n                        Assert.ok(false, \"has store batch error\")\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.cleanStorage(cb2) as any,(cleanRes) => {\n                        let res = this.ctx.cleanBatchRes;\n                        Assert.equal(res.batchCnt, 3, \"should clean all three items\");\n                    },(reason) => {\n                        Assert.ok(false, \"clean store batch error\")\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.hasStoredBatch(cb3),(res) => {\n                        let hasBatch = this.ctx.hasBatch1;\n                        Assert.equal(hasBatch, false, \"should not contain any events\")\n                    },(reason) => {\n                        Assert.ok(false, \"has store store batch error\")\n\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    }, (reason) => {\n                        Assert.ok(false, \"teardown error\")\n\n                    })\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: send Next Batch with web storge provider\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true, senderCfg:{retryCodes: [500]}, maxRetry: 2} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n \n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                this.ctx.isInit = true;\n                this.ctx.handler = batchHandler;\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 3, false);\n\n                let sender1Payload: any[] = []\n                let sender1 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender1Payload.push(payload);\n                    oncomplete(400, {});\n                }\n                let sender2Payload: any[] = []\n                let sender2 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender2Payload.push(payload);\n                    oncomplete(200, {});\n                }\n                let sender3Payload: any[] = []\n                let sender3 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender3Payload.push(payload);\n                    oncomplete(500, {});\n                }\n\n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n                let res2: any[] = [];\n                let cb2 = (res) =>  {\n                    res2.push(res);\n                }\n                let res3: any[] = [];\n                let cb3 = (res) =>  {\n                    res3.push(res);\n                }\n                let cb4 = (res) => {\n                    this.ctx.hasBatch1Called = true;\n                    this.ctx.hasBatch1 = res && res.length >= 1;\n                }\n\n                return this._asyncQueue().add(() => {\n                    doAwait(batchHandler.storeBatch(evt), (res) => {\n                        this.ctx.storeBatch = 1;\n                    }, (reason) => {\n                        Assert.ok(false, \"storeBatch 1 error: \" + (reason && reason.message));\n                    });\n                }).add(() => {\n                    doAwait(batchHandler.storeBatch(evt1), (res) => {\n                        this.ctx.storeBatch = 2;\n                    }, (reason) => {\n                        Assert.ok(false, \"storeBatch 2 error: \" + (reason && reason.message));\n                    });\n                }).add(() => {\n                    doAwait(batchHandler.storeBatch(evt2), (res) => {\n                        this.ctx.storeBatch = 3;\n                    }, (reason) => {\n                        Assert.ok(false, \"storeBatch 3 error: \" + (reason && reason.message));\n                    });\n                }).add(() => {\n                    doAwait(batchHandler.sendNextBatch(cb1, false, {sendPOST: sender1}) as any, (res) => {\n                        this.ctx.sendBatch1 = true;\n                        this.ctx.sendBatch1Res = res1;\n                        this.ctx.sendBatch1Pd = sender1Payload;\n                    }, (reason) => {\n                        Assert.ok(false, \"sendNextBatch 1 error: \" + (reason && reason.message));\n                    });\n                }).add(() => {\n                    doAwait(batchHandler.sendNextBatch(cb2, false, {sendPOST: sender2}) as any, (res) => {\n                        this.ctx.sendBatch2 = true;\n                        this.ctx.sendBatch2Res = res2;\n                        this.ctx.sendBatch2Pd = sender2Payload;\n                    }, (reason) => {\n                        Assert.ok(false, \"sendNextBatch 2 error: \" + (reason && reason.message));\n                    });\n                }).add(() => {\n                    doAwait(batchHandler.sendNextBatch(cb3, false, {sendPOST: sender3}) as any, (res) => {\n                        this.ctx.sendBatch3 = true;\n                        this.ctx.sendBatch3Res = res3;\n                        this.ctx.sendBatch3Pd = sender3Payload;\n                    }, (reason) => {\n                        Assert.ok(false, \"sendNextBatch 3 error: \" + (reason && reason.message));\n                    });\n                }).add(() => {\n                    doAwait(batchHandler.hasStoredBatch(cb4), (res) => {\n                    }, (reason) => {\n                        Assert.ok(false, \"hasStoredBatch error: \" + (reason && reason.message));\n                    });\n                }).add(() => {\n                    doAwait(batchHandler.teardown(), () => {\n                        this.ctx.isclosed = true;\n                    }, (reason) => {\n                        Assert.ok(false, \"teardown error: \" + (reason && reason.message));\n                    });\n                })\n\n            }\n                \n        });\n\n        this.testCase({\n            name: \"Send Next Batch: send Next Batch with IndexedDB provider\",\n            test: ()=> {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.IndexedDb], autoClean: false, senderCfg:{retryCodes: [500]}, maxRetry: 2} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n \n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                this.ctx.isInit = true;\n                this.ctx.handler = batchHandler;\n                this.batchHandler = batchHandler;\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 3, false);\n\n                let sender1Payload: any[] = [];\n                let sender1 = (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender1Payload.push(payload);\n                    oncomplete(400, {});\n                };\n                let res1: any[] = [];\n                let cb1 = (res) => {\n                    res1.push(res);\n                };\n\n                return this._asyncQueue().add(() =>\n                    doAwait(batchHandler.storeBatch(evt), (res) => {\n                        this.ctx.storeBatch = 1;\n                    }, (reason) => {\n                        Assert.ok(false, \"storeBatch 1 error: \" + (reason && reason.message));\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt1), (res) => {\n                        this.ctx.storeBatch = 2;\n                    }, (reason) => {\n                        Assert.ok(false, \"storeBatch 2 error: \" + (reason && reason.message));\n                    })\n                ).add(() =>\n                    doAwait(batchHandler.storeBatch(evt2), (res) => {\n                        this.ctx.storeBatch = 3;\n                    }, (reason) => {\n                        Assert.ok(false, \"storeBatch 3 error: \" + (reason && reason.message));\n                    })\n                ).add(() =>\n               \n                    doAwaitResponse(batchHandler.sendNextBatch(cb1, false, {sendPOST: sender1}) as any, (res) => {\n                        this.ctx.sendBatch1 = true;\n                        this.ctx.sendBatch1Res = res1;\n                        this.ctx.sendBatch1Pd = sender1Payload;\n                        Assert.equal(res.value.state, eBatchSendStatus.Drop, \"should have drop status\");\n                        doAwaitResponse(provider.getAllEvents(), (res)=> {\n                            this.ctx.getAll = true;\n                            let val = res.value;\n                            Assert.equal(val && val.length, 2, \"should have 2 events\");\n                            let sentcriticalCnt = res1[0].data.criticalCnt;\n                            arrForEach(val, (item) => {\n                                Assert.ok(sentcriticalCnt !== item.criticalCnt, \"should not contain deleted item\");\n                            });\n                        });\n                    })\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: send Next Batch with IndexedDB provider test1 with retry code\",\n            test: () => {\n                let batchHandler = this.batchHandler;\n                this.ctx.isInit = true;\n                this.ctx.handler = batchHandler;\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n\n                let sender1Payload: any[] = []\n                let sender1 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender1Payload.push(payload);\n                    oncomplete(500, {});\n                }\n           \n\n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n         \n                return this._asyncQueue().add(() =>\n                    doAwaitResponse(batchHandler.sendNextBatch(cb1, false, {sendPOST: sender1}) as any,(res) => {\n                        this.ctx.sendBatch1 = true;\n                        this.ctx.sendBatch1Res = res1;\n                        this.ctx.sendBatch1Pd =  sender1Payload;\n                        Assert.equal(res.value.state, eBatchSendStatus.Retry, \"should have retry status\");\n                    })\n                ).add(()=>\n                    doAwaitResponse(provider.getAllEvents(), (res)=> {\n                        this.ctx.getAll = true;\n                        let val = res.value;\n                        Assert.equal(val && val.length, 1, \"should have 1 events\");\n                        let sentcriticalCnt = res1[0].data.criticalCnt;\n                        arrForEach(val, (item) => {\n                            Assert.ok(sentcriticalCnt !== item.criticalCnt, \"should not contain deleted item\");\n                        });\n                        let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                        let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                        let storageObject = JSON.parse(storageStr);\n                        let storageEvts = storageObject.evts;\n                        Assert.deepEqual(Object.keys(storageEvts).length, 1, \"storgae should only have one event\");\n                    })\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: send Next Batch with IndexedDB provider test1 with 200\",\n            test: () => {\n                let batchHandler = this.batchHandler;\n                this.ctx.isInit = true;\n                this.ctx.handler = batchHandler;\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n\n                let sender1Payload: any[] = []\n                let sender1 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender1Payload.push(payload);\n                    oncomplete(200, {});\n                }\n           \n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n         \n                return this._asyncQueue().add(() =>\n                    doAwaitResponse(batchHandler.sendNextBatch(cb1, false, {sendPOST: sender1}) as any,(res) => {\n                        this.ctx.sendBatch1 = true;\n                        this.ctx.sendBatch1Res = res1;\n                        this.ctx.sendBatch1Pd =  sender1Payload;\n                        Assert.equal(res.value.state, eBatchSendStatus.Complete, \"should have complete status\");\n                    })\n                ).add(() =>\n                    doAwaitResponse(provider.getAllEvents(), (res)=> {\n                        this.ctx.getAll = true;\n                        let val = res.value;\n                        Assert.equal(val && val.length, 0, \"should have 0 events\");\n                        let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                        let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                        Assert.deepEqual(storageStr, null, \"storgae should not have one event\");\n                    })\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: send Next Batch with IndexedDB provider test1 with unload events\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true, senderCfg:{retryCodes: [500]}, maxRetry: 2} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n \n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let unloadHandler = new OfflineBatchHandler();\n                unloadHandler.initialize(providerCxt);\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n                unloadHandler.storeBatch(evt); // add events to local storage\n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                Assert.ok(storageStr, \"storage should have one event\");\n\n\n                let batchHandler = this.batchHandler;\n                this.ctx.isInit = true;\n                this.ctx.handler = batchHandler;\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n\n                let sender1Payload: any[] = []\n                let sender1 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender1Payload.push(payload);\n                    oncomplete(200, {});\n                }\n           \n\n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n\n\n                return this._asyncQueue().add(() =>\n                    doAwaitResponse(batchHandler.sendNextBatch(cb1, false, {sendPOST: sender1}) as any,(res) => {\n                        this.ctx.sendBatch1 = true;\n                        this.ctx.sendBatch1Res = res1;\n                        this.ctx.sendBatch1Pd =  sender1Payload;\n                        Assert.equal(res.value.state, eBatchSendStatus.Complete, \"should have complete status\");\n                        Assert.equal(res.value.data.id, evt.id, \"should have expected event\");\n                    })\n                ).add(() =>\n                    doAwaitResponse(provider.getAllEvents(), (res)=> {\n                        this.ctx.getAll = true;\n                        let val = res.value;\n                        Assert.equal(val && val.length, 0, \"should have 0 events\");\n                        let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                        let evts = JSON.parse(storageStr).evts;\n                        Assert.deepEqual(evts, {}, \"storage should not have one event\");\n                    })\n                )\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: Error handle store batch\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true, senderCfg:{retryCodes: [500]}, maxRetry: 2} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n \n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n\n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n                this.sandbox.stub((provider) as any, \"addEvent\").callsFake((key) => {\n                    return createAsyncRejectedPromise(new Error (\"add event mock error\"));\n                });\n\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n\n                doAwaitResponse(batchHandler.storeBatch(evt, cb1),(res) => {\n                    this.ctx.storeBatch = true;\n                    if (res.rejected) {\n                        Assert.ok(false, \"error should be catched\");\n                        return;\n                    }\n\n                    let item = res.value;\n                    Assert.equal(item?.state, eBatchStoreStatus.Failure, \"should have expected state\");\n                    Assert.equal(item?.item.message, \"add event mock error\" , \"should have expected message\");\n                    Assert.equal(res1.length, 1, \"should call callback\");\n                    Assert.equal(res1[0].state, item?.state, \"should call callback with expected response\");\n                })\n                \n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let item =  this.ctx.storeBatch;\n                    \n                    if (item) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for store batch response\" + new Date().toISOString(), 15, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: Error handle clean batch\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true, senderCfg:{retryCodes: [500]}, maxRetry: 2} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n \n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n                this.sandbox.stub((provider) as any, \"clear\").callsFake((key) => {\n                    return createAsyncRejectedPromise(new Error (\"clear mock error\"));\n                });\n\n                doAwaitResponse(batchHandler.cleanStorage(cb1),(res) => {\n                    this.ctx.clearBatch = true;\n\n                    if (res.rejected) {\n                        Assert.ok(false, \"error should be catched\");\n                        return;\n                    }\n                    \n                    let item = res.value;\n                    Assert.equal(item?.batchCnt, 0, \"should have expected state\");\n                    Assert.equal(res1.length, 1, \"should call callback\");\n                    Assert.equal(res1[0].batchCnt, item?.batchCnt, \"should call callback with expected response\");\n                    batchHandler.teardown();\n                    \n                });\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let item =  this.ctx.clearBatch;\n                    \n                    if (item) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for clear batch response\" + new Date().toISOString(), 15, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: Error handle add batch with remove error\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true, senderCfg:{retryCodes: [500]}, maxRetry: 2} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n \n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n\n                let evt = TestHelper.mockEvent(endpoint, 1, false);\n\n                batchHandler.storeBatch(evt);\n                this.sandbox.stub((provider) as any, \"removeEvents\").callsFake((key) => {\n                    return createAsyncRejectedPromise(new Error (\"remove mock error\"));\n                });\n                let sender1Payload: any[] = []\n                let sender1 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender1Payload.push(payload);\n                    oncomplete(200, {});\n                }\n           \n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n         \n                doAwaitResponse(batchHandler.sendNextBatch(cb1, false, {sendPOST: sender1}),(res) => {\n                    this.ctx.addBatch = true;\n                    if (res.rejected) {\n                        Assert.ok(false, \"error should be catched\");\n                        Assert.equal(res.reason.message, \"error should be catched\");\n                        return;\n                    }\n                    \n                    let item = res.value;\n                    Assert.equal(item?.state, eBatchSendStatus.Failure, \"should have expected state\");\n                    Assert.equal(item?.data.message, \"remove mock error\" , \"should have expected message\");\n                    Assert.equal(res1.length, 1, \"should call callback\");\n                    Assert.equal(res1[0].state, item?.state, \"should call callback with expected response\");\n                    batchHandler.teardown();\n                });\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let item =  this.ctx.addBatch;\n                    if (item) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for add batch response\" + new Date().toISOString(), 15, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"Send Next Batch: Error handle add batch\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageObj = {providers:[eStorageProviders.LocalStorage], autoClean: true, senderCfg:{retryCodes: [500]}, maxRetry: 2} as IOfflineChannelConfiguration;\n                let  storageConfig = createDynamicConfig(storageObj).cfg;\n \n                let itemCtx = this.core.getProcessTelContext();\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let batchHandler = new OfflineBatchHandler();\n                batchHandler.initialize(providerCxt);\n                let items = batchHandler[\"_getDbgPlgTargets\"]();\n                let provider = items[0];\n                let isInit = items[1];\n                Assert.ok(provider, \"provider is initialized\");\n                Assert.ok(isInit, \"initialization is successful\");\n                \n                let sender1Payload: any[] = []\n                let sender1 =  (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sender1Payload.push(payload);\n                    oncomplete(200, {});\n                }\n           \n                let res1: any[] = [];\n                let cb1 = (res) =>  {\n                    res1.push(res);\n                }\n         \n                this.sandbox.stub((provider) as any, \"getNextBatch\").callsFake((key) => {\n                    return createAsyncRejectedPromise(new Error (\"get mock error\"));\n                });\n                doAwaitResponse(batchHandler.sendNextBatch(cb1, false, {sendPOST: sender1}),(res) => {\n                    this.ctx.getBatch = true;\n                    if (res.rejected) {\n                        Assert.ok(false, \"error should be catched test1\");\n                        return;\n                    }\n                    let item = res.value;\n                    Assert.equal(item?.state, eBatchSendStatus.Failure, \"should have expected state\");\n                    Assert.equal(item?.data.message, \"get mock error\" , \"should have expected message\");\n                    Assert.equal(res1.length, 1, \"should call callback again\");\n                    Assert.equal(res1[0].state, item?.state, \"should call callback with expected response\");\n                    batchHandler.teardown();\n                });\n\n               \n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let item =  this.ctx.getBatch;\n                    \n                    if (item) {\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for get batch response\" + new Date().toISOString(), 15, 1000))\n            }\n        });\n        \n    }\n}\n\n\nclass TestHelper {\n    private static _idCount = 0;\n\n    static reset(key: string) {\n        this._idCount = 0;\n        AITestClass.orgLocalStorage.removeItem(key);\n    }\n\n    static mockEvent(endPointUrl: string, criticalCnt: number, setId = true) {\n        this._idCount++;\n        let payload = {\n            urlString: endPointUrl,\n            data: '[{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}},{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}}]',\n            headers: {\n                \"header1\": \"header1val\",\n                \"header2\": \"header2val\"\n            },\n            disableXhrSync: false,\n            disableFetchKeepAlive: false,\n            sendReason: 1,\n            id: setId? newGuid() : \"\",\n            iKey: \"testIKey\",\n            criticalCnt: criticalCnt\n        }\n        return payload;\n    }\n \n}\n\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/offlinechannel.tests.ts",
    "content": "import { OfflineIndexedDBTests } from \"./IndexedDB.tests\";\nimport { OfflineWebProviderTests } from \"./webprovider.tests\";\nimport { OfflineDbProviderTests } from \"./dbprovider.tests\"\nimport { OfflineInMemoryBatchTests } from \"./inmemorybatch.tests\";\nimport { OfflineBatchHandlerTests } from \"./offlinebatchhandler.tests\";\nimport { ChannelTests } from \"./channel.tests\";\nimport { Offlinetimer } from \"./offlinetimer.tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\nimport { OfflineCustomProviderTests } from \"./customprovider.tests\";\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new OfflineIndexedDBTests().registerTests();\n    new OfflineWebProviderTests().registerTests();\n    new OfflineDbProviderTests().registerTests();\n    new OfflineInMemoryBatchTests().registerTests();\n    new ChannelTests().registerTests();\n    new OfflineBatchHandlerTests().registerTests();\n    new Offlinetimer().registerTests();\n    new OfflineCustomProviderTests().registerTests();\n    \n}"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/offlinetimer.tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, EventPersistence, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { AppInsightsCore, IConfiguration, IPayloadData, OnCompleteCallback } from \"@microsoft/applicationinsights-core-js\";\nimport { TestChannel, mockTelemetryItem } from \"./TestHelper\";\nimport { OfflineChannel } from \"../../../src/OfflineChannel\";\nimport { IOfflineChannelConfiguration, eStorageProviders } from \"../../../src/Interfaces/IOfflineProvider\";\nimport { IPostTransmissionTelemetryItem } from \"../../../src/applicationinsights-offlinechannel-js\";\n\nexport class Offlinetimer extends AITestClass {\n    private core: AppInsightsCore;\n    private coreConfig: IConfig & IConfiguration;\n \n    public testInitialize() {\n        super.testInitialize();\n        AITestClass.orgLocalStorage.clear();\n      \n        this.coreConfig = {\n            instrumentationKey: \"testIkey\",\n            endpointUrl:  DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n        };\n        this.core = new AppInsightsCore();\n        \n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        AITestClass.orgLocalStorage.clear();\n        this.onDone(() => {\n            this.core.unload();\n        });\n        this.core = null as any;\n        this.coreConfig = null as any;\n       \n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"InMemo Timer: Handle in memory timer\",\n            useFakeTimers: true,\n            test: () => {\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 2000, minPersistenceLevel: EventPersistence.Critical, eventsLimitInMem: 2 } as IOfflineChannelConfiguration};\n                let channel = new OfflineChannel();\n                let onlineChannel = new TestChannel();\n                this.core.initialize(this.coreConfig,[channel, onlineChannel]);\n\n                this.clock.tick(1);\n                let offlineListener = channel.getOfflineListener() as any;\n\n                // online, processTelemetry is not called\n                offlineListener.setOnlineState(1);\n                let inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer, \"in memo timer should be null\");\n\n                // offline, processTelemetry is not called\n                offlineListener.setOnlineState(2);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer, \"in memo timer should be null test1\");\n\n                // online, processTelemetry is called\n                offlineListener.setOnlineState(1);\n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer, \"in memo timer should be null test2\");\n\n                // offline, processTelemetry is called with event that should not be sent\n                offlineListener.setOnlineState(2);\n                evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer, \"in memo timer should be null test3\");\n\n                // offline, processTelemetry is called with event that should be sent\n                offlineListener.setOnlineState(2);\n                let validEvt = mockTelemetryItem() as IPostTransmissionTelemetryItem;\n                validEvt.persistence = 2;\n                channel.processTelemetry(validEvt);\n                channel.processTelemetry(validEvt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(inMemoTimer, \"in memo timer should be created\");\n                Assert.ok(inMemoTimer.enabled, \"in memo timer should be enabled\");\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n                //let inMemoBatch = channel[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 2, \"should have two events\");\n\n                // offline, flush all events in memory, and processTelemetry is not called again\n                this.clock.tick(2000);\n                //inMemoBatch = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no event left\");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer enabled should be false with no events in memory\");\n\n                this.clock.tick(2000);\n                //inMemoBatch = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no event left\");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer enabled should be false with no events in memory and no processTelemtry is called\");\n\n                // offline, flush all events and with one event left in memory, and processTelemetry is not called again\n                channel.processTelemetry(validEvt);\n                channel.processTelemetry(validEvt);\n                channel.processTelemetry(validEvt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(inMemoTimer.enabled, \"in memo timer should be enabled\");\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                //inMemoBatch = channel[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one event left after flush\");\n\n                this.clock.tick(2000);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                //inMemoBatch = channel[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no event left\");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer should be canceld with no events in memory test1\");\n\n                // offline with one event saved in memory, and then online with processTelemetry called\n                channel.processTelemetry(validEvt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(inMemoTimer.enabled, \"in memo timer should be enabled\");\n                //inMemoBatch = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one event left after flush\");\n\n                offlineListener.setOnlineState(1);\n                this.clock.tick(2000);\n                //inMemoBatch = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no event left\");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer should be canceld with no events in memory test2\");\n\n                channel.processTelemetry(validEvt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer should be canceld when back online\");\n\n              \n                channel.teardown();\n                \n            }\n        });\n\n        this.testCase({\n            name: \"InMemo Timer: Handle in memory timer with splitEvts set to true\",\n            useFakeTimers: true,\n            test: () => {\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 2000, eventsLimitInMem: 1, splitEvts: true } as IOfflineChannelConfiguration};\n                let channel = new OfflineChannel();\n                let onlineChannel = new TestChannel();\n                this.core.initialize(this.coreConfig,[channel, onlineChannel]);\n\n                this.clock.tick(1);\n                let offlineListener = channel.getOfflineListener() as any;\n\n                // online, processTelemetry is not called\n                offlineListener.setOnlineState(1);\n                let inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer, \"in memo timer should be null\");\n\n                // offline, processTelemetry is not called\n                offlineListener.setOnlineState(2);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer, \"in memo timer should be null test1\");\n\n                // online, processTelemetry is called\n                offlineListener.setOnlineState(1);\n                let evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer, \"in memo timer should be null test2\");\n\n                // offline, processTelemetry is called with normal event\n                offlineListener.setOnlineState(2);\n                evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(inMemoTimer, \"in memo timer should be created test3\");\n                Assert.ok(inMemoTimer.enabled, \"in memo timer should be enabled test1\");\n                let inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                let inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one normal event\");\n\n                // offline, processTelemetry is called with critical event\n                offlineListener.setOnlineState(2);\n                let criticalEvt = mockTelemetryItem(2) as IPostTransmissionTelemetryItem;\n                channel.processTelemetry(criticalEvt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(inMemoTimer, \"in memo timer should be not null\");\n                Assert.ok(inMemoTimer.enabled, \"in memo timer should be enabled test2\");\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one critical event\");\n\n                // offline, processTelemetry is called with normal event again\n                offlineListener.setOnlineState(2);\n                evt = mockTelemetryItem();\n                channel.processTelemetry(evt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(inMemoTimer, \"in memo timer should not be null test1\");\n                Assert.ok(inMemoTimer.enabled, \"in memo timer should be enabled test2\");\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one normal event test1\");\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one critical event test1\");\n\n                // offline, flush all events in memory, and processTelemetry is not called again\n                this.clock.tick(2000);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no noraml event left\");\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no critical event left\");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer enabled should be false with no events in memory\");\n\n                this.clock.tick(2000);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no noraml event left test1\");\n                inMemoBatch = inMemoMap[EventPersistence.Critical];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no critical event left tes1 \");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer enabled should be false with no events in memory\");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer enabled should be false with no events in memory and no processTelemtry is called\");\n            \n\n                // offline with one normal event saved in memory, and then online with processTelemetry called\n                channel.processTelemetry(evt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(inMemoTimer.enabled, \"in memo timer should be enabled\");\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 1, \"should have one normal event left test1\");\n\n                offlineListener.setOnlineState(1);\n                this.clock.tick(2000);\n                inMemoMap = channel[\"_getDbgPlgTargets\"]()[1];\n                inMemoBatch = inMemoMap[EventPersistence.Normal];\n                Assert.equal(inMemoBatch && inMemoBatch.count(), 0, \"should have no event left test1\");\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer should be canceld with no events in memory test2\");\n\n                channel.processTelemetry(evt);\n                inMemoTimer = channel[\"_getDbgPlgTargets\"]()[3];\n                Assert.ok(!inMemoTimer.enabled, \"in memo timer should be canceld when back online\");\n\n              \n                channel.teardown();\n                \n            }\n        });\n\n        this.testCase({\n            name: \"SendNextBatch Timer: Timer should resume sending after offline-to-online transition\",\n            useFakeTimers: true,\n            test: () => {\n                let sendCalled = 0;\n                \n                let sendPost = (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    sendCalled++;\n                    oncomplete(200, {});\n                    return;\n                }\n\n                let xhrOverride = {sendPOST: sendPost}\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {\n                    providers:[eStorageProviders.LocalStorage], \n                    inMemoMaxTime: 2000, \n                    eventsLimitInMem: 2, \n                    maxSentBatchInterval: 10000,\n                    senderCfg: {httpXHROverride: xhrOverride, alwaysUseXhrOverride: true}\n                } as IOfflineChannelConfiguration};\n                \n                let channel = new OfflineChannel();\n                let onlineChannel = new TestChannel();\n                onlineChannel.setIsIdle(true);\n                this.core.initialize(this.coreConfig,[channel, onlineChannel]);\n                \n                let offlineListener = channel.getOfflineListener() as any;\n                // Start offline\n                offlineListener.setOnlineState(2);\n                this.clock.tick(1);\n                \n                // Verify timer is still enabled while offline\n                let sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(sendBatchTimer.enabled, \"Timer should be initially enabled even when offline\");\n                Assert.equal(sendCalled, 0, \"No data should be sent while offline\");\n\n                // Add events while offline\n                let evt = mockTelemetryItem() as IPostTransmissionTelemetryItem;\n                evt.persistence = EventPersistence.Critical;\n                channel.processTelemetry(evt);\n                channel.processTelemetry(evt);\n\n                // Flush to storage\n                this.clock.tick(10000);\n                \n                // Timer should be disabled after send attempt\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(!sendBatchTimer.enabled, \"Timer should be disabled after send attempt\");\n                Assert.equal(sendCalled, 0, \"No data should be sent while offline\");\n                \n                // Transition from offline to online - this triggers the bug\n                offlineListener.setOnlineState(1);\n                \n                // Timer should be enabled after going online\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(sendBatchTimer, \"Timer should exist after going online\");\n                Assert.ok(sendBatchTimer.enabled, \"Timer should be enabled after going online\");\n                \n                // Wait for timer to fire\n                this.clock.tick(10000);\n                \n                // BUG: The timer callback still thinks we're offline due to stale closure\n                // so it cancels itself and doesn't send data\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                \n                // This assertion will fail with the bug - timer gets cancelled\n                Assert.ok(sendBatchTimer.enabled, \"Timer should still be enabled and continue sending batches\");\n                \n                // This assertion will fail with the bug - no data gets sent\n                Assert.ok(sendCalled > 0, \"Data should be sent after going online\");\n                \n                channel.teardown();\n            }\n        });\n\n        this.testCase({\n            name: \"SendNextBatch Timer: Handle sendNextBatch timer\",\n            useFakeTimers: true,\n            test: () => {\n                let called = 0;\n                let sendPost = (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => {\n                    // first call, return complete, data null;\n                    called ++;\n                    oncomplete(200, {});\n                    return;\n\n                }\n\n                let xhrOverride = {sendPOST: sendPost}\n                this.coreConfig.extensionConfig = {[\"OfflineChannel\"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 2000, eventsLimitInMem: 2, maxSentBatchInterval: 10000,\n                    senderCfg: {httpXHROverride: xhrOverride, alwaysUseXhrOverride: true}\n                } as IOfflineChannelConfiguration};\n                let channel = new OfflineChannel();\n                let onlineChannel = new TestChannel();\n                this.core.initialize(this.coreConfig,[channel, onlineChannel]);\n                this.clock.tick(1);\n                let offlineListener = channel.getOfflineListener() as any;\n\n                // online, processTelemetry is not called\n                offlineListener.setOnlineState(1);\n                let sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(sendBatchTimer, \"sendBatch timer should be created after init\");\n                Assert.ok(sendBatchTimer.enabled, \"sendBatch timer should be enabled\");\n\n                // online, processTelemetry is not called, no previous stored events returned\n                this.clock.tick(10000);\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(!sendBatchTimer.enabled, \"sendBatch timer should not start again with no events in storage\");\n\n                // online, processTelemetry called, no previous stored events returned\n                this.clock.tick(10000);\n                let evt = mockTelemetryItem() as IPostTransmissionTelemetryItem;\n                evt.persistence = 2;\n                channel.processTelemetry(evt);\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(!sendBatchTimer.enabled, \"sendBatch timer should not start again with no events in storage test1\");\n                Assert.equal(called, 0 , \"no data is sent\");\n\n                // offline, processTelemetry is not called\n                offlineListener.setOnlineState(2);\n                this.clock.tick(10000);\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(!sendBatchTimer.enabled, \"sendBatch timer should not start again with no events in storage test2\");\n                Assert.equal(called, 0 , \"no data is sent\");\n\n                // offline, processTelemetry is called, in Memory flush called\n                channel.processTelemetry(evt);\n                channel.processTelemetry(evt);\n                this.clock.tick(10000);\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(!sendBatchTimer.enabled, \"sendBatch timer should not start again with no events in storage test3\");\n                Assert.equal(called, 0 , \"no data is sent\");\n\n                // online, with online sender is not idle\n                offlineListener.setOnlineState(1);\n                onlineChannel.setIsIdle(false);\n                channel.processTelemetry(evt);\n                this.clock.tick(10000);\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(sendBatchTimer.enabled, \"sendBatch timer be refreshed when it is online and not idle\");\n                Assert.equal(called, 0 , \"no data is sent\");\n\n                // online, with online sender is idle\n                offlineListener.setOnlineState(1);\n                onlineChannel.setIsIdle(true);\n                channel.processTelemetry(evt);\n                this.clock.tick(10000);\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(sendBatchTimer.enabled, \"sendBatch timer be refreshed when it is online and idle\");\n                Assert.equal(called, 1 , \"data is sent\");\n\n                // online, with processTelemtry called again\n                offlineListener.setOnlineState(1);\n                channel.processTelemetry(evt);\n                this.clock.tick(10000);\n                sendBatchTimer = channel[\"_getDbgPlgTargets\"]()[4];\n                Assert.ok(!sendBatchTimer.enabled, \"sendBatch timer not be refreshed when it is online and no stored events\");\n                Assert.equal(called, 1 , \"no data is sent again\");\n\n              \n\n                channel.teardown();\n                \n            }\n        });\n    }\n}"
  },
  {
    "path": "channels/offline-channel-js/Tests/Unit/src/webprovider.tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore, IConfiguration, arrForEach, createDynamicConfig, eBatchDiscardedReason, generateW3CId, isArray } from \"@microsoft/applicationinsights-core-js\";\nimport { WebStorageProvider } from \"../../../src/Providers/WebStorageProvider\";\nimport { DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { TestChannel } from \"./TestHelper\";\nimport { IOfflineChannelConfiguration, IStorageTelemetryItem } from \"../../../src/Interfaces/IOfflineProvider\";\nimport { doAwaitResponse } from \"@nevware21/ts-async\";\nimport { strSubstr } from \"@nevware21/ts-utils\";\n\n\nexport class OfflineWebProviderTests extends AITestClass {\n    private core: AppInsightsCore;\n    private coreConfig: IConfig & IConfiguration;\n    private batchDrop: any;\n \n    public testInitialize() {\n        super.testInitialize();\n        AITestClass.orgLocalStorage.clear();\n        let channel = new TestChannel();\n        this.coreConfig = {\n            instrumentationKey: \"testIkey\",\n            endpointUrl: \"https://testurl.com\"\n        };\n        this.core = new AppInsightsCore();\n        this.core.initialize(this.coreConfig, [channel]);\n        this.batchDrop = [];\n        \n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        AITestClass.orgLocalStorage.clear();\n        this.onDone(() => {\n            this.core.unload();\n        });\n        this.core = null as any;\n        this.coreConfig = null as any;\n        this.batchDrop = [];\n       \n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"Web local Storage Provider: Init with storage available\",\n            test: () => {\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint:DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let ctx = provider[\"_getDbgPlgTargets\"]();\n                let expectedStorageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                Assert.equal(ctx[0], expectedStorageKey, \"should have expected storage\");\n                let expectedMaxStorage = 5000000;\n                Assert.equal(ctx[1], expectedMaxStorage, \"default MaxStorage is set\");\n                Assert.ok(provider.supportsSyncRequests(), \"support sync should be set to true\");\n            }\n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: Init with no storage available\",\n            test: () => {\n                let provider = new WebStorageProvider(\"testStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint:DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(!isInit, \"init process should return false\");\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: Init with expected config\",\n            test: () => {\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({\n                    autoClean: true,\n                    maxStorageSizeInBytes: 1000,\n                    inStorageMaxTime: 3600,\n                    storageKeyPrefix: \"testPrefix\"\n\n                } as IOfflineChannelConfiguration).cfg;\n                let providerCxt = {\n                    itemCtx: itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint:DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process should return true\");\n\n                let ctx = provider[\"_getDbgPlgTargets\"]();\n                let expectedStorageKey = \"testPrefix_1_dc.services.visualstudio.com\";\n                Assert.equal(ctx[0], expectedStorageKey, \"should have expected storage\");\n                let expectedMaxStorage = 1000;\n                Assert.equal(ctx[1], expectedMaxStorage, \"default MaxStorage is set\");\n                let expectedMaxTime = 3600;\n                Assert.equal(ctx[2], expectedMaxTime, \"default MaxStorageTime is set\");\n                Assert.ok(provider.supportsSyncRequests(), \"support sync should be set to true\");\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: getNextBatch with no old events\",\n            test: () => {\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint:DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let evts = provider.getNextBatch();\n                Assert.deepEqual(evts, [], \"should have no stored events and return array\");\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: getNextBatch with old events\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let expectedStorageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let evt = TestHelper.mockEvent(endpoint, 3);\n                let jsonObj = TestHelper.mockStorageJSON(evt);\n                let evtStr = JSON.stringify(jsonObj);\n                AITestClass.orgLocalStorage.setItem(expectedStorageKey, evtStr);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let ctx = provider[\"_getDbgPlgTargets\"]();\n                \n                Assert.equal(ctx[0], expectedStorageKey, \"should have expected storage\");\n\n                let evts = provider.getNextBatch();\n                Assert.deepEqual(evts, [evt], \"should have one stored event\");\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: getNextBatch should return expected number of events\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let expectedStorageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let evt = TestHelper.mockEvent(endpoint, 3);\n                let evt1 = TestHelper.mockEvent(endpoint, 2);\n                let evt2 = TestHelper.mockEvent(endpoint, 1);\n                let jsonObj = TestHelper.mockStorageJSON([evt, evt1, evt2]);\n                let evtStr = JSON.stringify(jsonObj);\n                AITestClass.orgLocalStorage.setItem(expectedStorageKey, evtStr);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let ctx = provider[\"_getDbgPlgTargets\"]();\n                \n                Assert.equal(ctx[0], expectedStorageKey, \"should have expected storage\");\n\n                let evts = provider.getNextBatch();\n                Assert.deepEqual(evts, [evt], \"should have one stored event\");\n                \n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: getNextBatch should handle errors\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let expectedStorageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                \n                this.sandbox.stub((window.localStorage) as any, \"getItem\").callsFake((key) => {\n                    throw new Error(\"test error\");\n                });\n                \n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let ctx = provider[\"_getDbgPlgTargets\"]();\n                \n                Assert.equal(ctx[0], expectedStorageKey, \"should have expected storage\");\n              \n                doAwaitResponse(provider.getNextBatch(), (res) => {\n                    if (res.reason) {\n                        Assert.ok(true, \"error promise created\");\n                        Assert.equal(res.reason.message, \"test error\", \"should create expected promise\");\n                    } else {\n                        Assert.ok(false, \"should create promise error\");\n                    }\n                    \n                });\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: getNextBatch should return null when no storage available\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                \n                let provider = new WebStorageProvider(\"testStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(!isInit, \"init process is expected\");\n\n                let ctx = provider[\"_getDbgPlgTargets\"]();\n                Assert.equal(ctx[0], undefined, \"should have expected storage\");\n              \n                doAwaitResponse(provider.getNextBatch(), (res) => {\n                    if (!res.rejected) {\n                        Assert.ok(true, \"response returned\");\n                        Assert.equal(res.value, null, \"should return null\");\n                    } else {\n                        Assert.ok(false, \"should return  successful response\");\n                    }\n                    \n                });\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: addEvent should set default id when it is not provided\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let addedEvt = provider.addEvent(\"\", evt, itemCtx);\n                Assert.ok(addedEvt, \"evt should be added\");\n                let id =  addedEvt && (addedEvt as any).id;\n                Assert.ok(id, \"evt id should be set\");\n                Assert.ok(id.indexOf(\".\") > -1, \"evt id should be set with time\");\n                let evts = provider.getAllEvents();\n                Assert.deepEqual(evts, [evt], \"should have the expected stored event\");\n\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr).evts;\n                Assert.deepEqual(Object.keys(storageObj).length, 1, \"storgae should have expected events\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: addEvent should add expected events\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let evt = TestHelper.mockEvent(endpoint, 3);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let addedEvt = provider.addEvent(\"\", evt, itemCtx);\n                Assert.ok(addedEvt, \"evt should be added\");\n                let evts = provider.getAllEvents();\n                Assert.deepEqual(evts, [evt], \"should have the expected stored event\");\n\n                let evt1 = TestHelper.mockEvent(endpoint, 2);\n                let addedEvt1 = provider.addEvent(\"\", evt1, itemCtx);\n                Assert.ok(addedEvt1, \"evt should be added test1\");\n                evts = provider.getAllEvents() as any[];\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt, evt1]), \"should have the expected stored event test1\");\n\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr).evts;\n                Assert.deepEqual(Object.keys(storageObj).length, 2, \"storgae should have expected two events\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: addEvent should handle errors\",\n            test: () => {\n                this.core.addNotificationListener({\n                    offlineBatchDrop: (cnt, reason)=> {\n                        this.batchDrop.push({cnt: cnt, reason: reason});\n                    }\n                });\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({EventsToDropPerTime: 2}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint,\n                    notificationMgr: this.core.getNotifyMgr()\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let evt = TestHelper.mockEvent(endpoint, 3, true);\n                let addedEvt = provider.addEvent(\"\", evt, itemCtx);\n                Assert.ok(addedEvt, \"evt should be added\");\n\n                let evt1 = TestHelper.mockEvent(endpoint, 2, true);\n                let addedEvt1 = provider.addEvent(\"\", evt1, itemCtx);\n                Assert.ok(addedEvt1, \"evt1 should be added\");\n\n\n                let evt2 = TestHelper.mockEvent(endpoint, 1, true);\n                let addedEvt2 = provider.addEvent(\"\", evt2, itemCtx);\n                Assert.ok(addedEvt2, \"evt2 should be added\");\n\n                let evt3 = TestHelper.mockEvent(endpoint, 0, true);\n                let addedEvt3 = provider.addEvent(\"\", evt3, itemCtx);\n                Assert.ok(addedEvt3, \"evt3 should be added\");\n\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr).evts;\n                Assert.deepEqual(Object.keys(storageObj).length, 4, \"storage should have expected four events\");\n\n                let called = -1;\n                let evts: any[] = []\n                this.sandbox.stub((window.localStorage) as any, \"setItem\").callsFake((key, val) => {\n                    evts.push(val);\n                    called += 1;\n                    if (called == 1) {\n                        return;\n                    }\n                    throw new Error(\"test error\");\n                });\n\n                let evt4 = TestHelper.mockEvent(endpoint, 5, true);\n                let addedEvt4 = provider.addEvent(\"\", evt4, itemCtx);\n                Assert.equal(evts.length, 2, \"should be called two times\"); // notification should be triggered here\n                let jsonObj = JSON.parse(evts[1]);\n                Assert.deepEqual(jsonObj.evts, {[evt.id as any]: evt, [evt1.id as any]: evt1, [evt2.id as any]: evt2, [evt4.id as any]: evt4}, \"should have expected events test1\");\n                let evt6 = TestHelper.mockEvent(endpoint, 6, true);\n                doAwaitResponse(provider.addEvent(\"\", evt6, itemCtx), (res) => {\n                    if (res.rejected) {\n                        Assert.ok(true, \"error triggered\");\n                        Assert.equal(res.reason.message, \"Unable to free up event space\", \"should have expected error\");\n                        Assert.equal(this.batchDrop.length, 1, \"notification should be called\");\n                        Assert.equal(this.batchDrop[0].cnt, 1, \"notification should be called with 1 cnt\");\n                        Assert.equal(this.batchDrop[0].reason, 2, \"notification should be called with expected reason\");\n                        return;\n                    }\n                    Assert.ok(false, \"error is not triggered\");\n                });\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: removeEvents with id set\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let evt = TestHelper.mockEvent(endpoint, 3);\n                let evt1 = TestHelper.mockEvent(endpoint, 2);\n                let evt2 = TestHelper.mockEvent(endpoint, 1);\n                let evt3 = TestHelper.mockEvent(endpoint, 0);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                provider.addEvent(\"\", evt, itemCtx);\n                provider.addEvent(\"\", evt1, itemCtx);\n                provider.addEvent(\"\", evt2, itemCtx);\n                provider.addEvent(\"\", evt3, itemCtx);\n                let evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt, evt1, evt2, evt3]), \"should have the expected stored events\");\n\n                provider.removeEvents([evt, evt1]);\n                evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt2, evt3]), \"should have the expected remaining stored events test1\");\n\n                provider.removeEvents([evt]);\n                evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt2, evt3]), \"should have the expected remaining stored events test2\");\n        \n                provider.removeEvents([evt, evt2]);\n                evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt3]), \"should have the expected remaining stored events test3\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: removeEvents with id not set\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 1, false);\n                let evt3 = TestHelper.mockEvent(endpoint, 0, false);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                provider.addEvent(\"\", evt, itemCtx);\n                provider.addEvent(\"\", evt1, itemCtx);\n                provider.addEvent(\"\", evt2, itemCtx);\n                provider.addEvent(\"\", evt3, itemCtx);\n                let evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt, evt1, evt2, evt3]), \"should have the expected stored events\");\n\n                let evts1 = provider.getAllEvents(1);\n                Assert.deepEqual(JSON.stringify(evts1), JSON.stringify([evt]), \"should have the expected 1 stored events\");\n                let evts2 = provider.getAllEvents(2);\n                Assert.deepEqual(JSON.stringify(evts2), JSON.stringify([evt, evt1]), \"should have the expected 2 stored events\");\n\n                provider.removeEvents([evt]);\n                evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt1, evt2, evt3]), \"should have the expected remaining stored events test1\");\n\n                provider.removeEvents([evt1]);\n                provider.removeEvents([evt2]);\n                provider.removeEvents([evt3]);\n                evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([]), \"should have the expected remaining stored events test2\");\n\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr);\n                Assert.deepEqual(storageObj.evts, {}, \"storgae should not have any remaining events\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: clear should clear all events in storage\",\n            test: () => {\n                this.core.addNotificationListener({\n                    offlineBatchDrop: (cnt, reason)=> {\n                        this.batchDrop.push({cnt: cnt, reason: reason});\n                    }\n                });\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 1, false);\n                let evt3 = TestHelper.mockEvent(endpoint, 0, false);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint,\n                    notificationMgr: this.core.getNotifyMgr()\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                provider.addEvent(\"\", evt, itemCtx);\n                provider.addEvent(\"\", evt1, itemCtx);\n                provider.addEvent(\"\", evt2, itemCtx);\n                provider.addEvent(\"\", evt3, itemCtx);\n                let evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt, evt1, evt2, evt3]), \"should have the expected stored events\");\n\n                provider.clear();\n                evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([]), \"should not have any remaining events\");\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr);\n                Assert.deepEqual(storageObj.evts, {}, \"storgae should not have any remaining events\");\n\n                Assert.equal(this.batchDrop.length, 0, \"notification should not be called\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: Clean should drop events that exist longer than max storage time\",\n            useFakeTimers: true,\n            test: () => {\n                this.core.addNotificationListener({\n                    offlineBatchDrop: (cnt, reason)=> {\n                        this.batchDrop.push({cnt: cnt, reason: reason});\n                    }\n                });\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                let evt2 = TestHelper.mockEvent(endpoint, 1, false);\n                let evt3 = TestHelper.mockEvent(endpoint, 0, false);\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({inStorageMaxTime: 1}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint,\n                    notificationMgr: this.core.getNotifyMgr()\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n                this.clock.tick(1);\n\n                provider.addEvent(\"\", evt, itemCtx);\n                provider.addEvent(\"\", evt1, itemCtx);\n                provider.addEvent(\"\", evt2, itemCtx);\n                provider.addEvent(\"\", evt3, itemCtx);\n                let evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt, evt1, evt2, evt3]), \"should have the expected stored events\");\n                this.clock.tick(10);\n\n                let isCleaned = provider.clean();\n                evts = provider.getAllEvents();\n                Assert.ok(isCleaned, \"should clean all events\");\n                evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([]), \"should have clean all previous events\");\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr);\n                Assert.deepEqual(storageObj.evts, {}, \"storgae should not have any remaining events\");\n\n                this.clock.tick(1);\n\n                Assert.equal(this.batchDrop.length, 1, \"notification should be called\");\n                Assert.equal(this.batchDrop[0].cnt, 4, \"notification should not be called with 4 count\");\n                Assert.equal(this.batchDrop[0].reason, eBatchDiscardedReason.MaxInStorageTimeExceeded, \"notification should be called with expected reason\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: autoClean should drop expected events when it is set to true\",\n            useFakeTimers: true,\n            test: () => {\n                this.core.addNotificationListener({\n                    offlineBatchDrop: (cnt, reason)=> {\n                        this.batchDrop.push({cnt: cnt, reason: reason});\n                    }\n                });\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let storageKey = \"AIOffline_1_dc.services.visualstudio.com\";\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint,\n                    notificationMgr: this.core.getNotifyMgr()\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n                this.clock.tick(10);\n                let evt = TestHelper.mockEvent(endpoint, 3, false);\n                let evt1 = TestHelper.mockEvent(endpoint, 2, false);\n                provider.addEvent(\"\", evt, itemCtx);\n                provider.addEvent(\"\", evt1, itemCtx);\n\n                this.clock.tick(20);\n              \n                let provider1 = new WebStorageProvider(\"localStorage\");\n                let storageConfig1 = createDynamicConfig({autoClean: true, inStorageMaxTime: 10}).cfg;\n                let providerCxt1 = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig1,\n                    endpoint: endpoint,\n                    notificationMgr: this.core.getNotifyMgr()\n                }\n                \n                \n                let evt2 = TestHelper.mockEvent(endpoint, 1, false);\n                let evt3 = TestHelper.mockEvent(endpoint, 0, false);\n                provider.addEvent(\"\", evt2, itemCtx);\n                provider.addEvent(\"\", evt3, itemCtx);\n\n                let isInit1 = provider1.initialize(providerCxt1);\n                Assert.ok(isInit1, \"init process is successful test1\");\n\n                let evts = provider.getAllEvents();\n                Assert.deepEqual(JSON.stringify(evts), JSON.stringify([evt2, evt3]), \"should clean the expected events\");\n                \n                let storageStr = AITestClass.orgLocalStorage.getItem(storageKey) as any;\n                let storageObj = JSON.parse(storageStr);\n                let remainingEvts = storageObj.evts;\n                Assert.deepEqual(Object.keys(remainingEvts).length, 2, \"storgae should have expected remaining events\");\n\n                this.clock.tick(1)\n\n                Assert.equal(this.batchDrop.length, 1, \"notification should be called\");\n                Assert.equal(this.batchDrop[0].cnt, 2, \"notification should not be called with 2 count\");\n                Assert.equal(this.batchDrop[0].reason, eBatchDiscardedReason.MaxInStorageTimeExceeded, \"notification should be called with expected reason\");\n\n            }\n            \n        });\n\n        this.testCase({\n            name: \"Web local Storage Provider: Uint8 Array should be handled correctly\",\n            test: () => {\n                let endpoint = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH;\n                let arr = new Uint8Array([21, 32]);\n                let evt = {\n                    urlString: endpoint,\n                    data: arr,\n                    headers: {\n                        \"header1\": \"header1val\",\n                        \"header2\": \"header2val\"\n                    },\n                    isArr: true,\n                    disableXhrSync: false,\n                    disableFetchKeepAlive: false,\n                    sendReason: 1,\n                    iKey: \"testIKey\",\n                    criticalCnt: 0\n                }\n                let provider = new WebStorageProvider(\"localStorage\");\n                let itemCtx = this.core.getProcessTelContext();\n                let storageConfig = createDynamicConfig({}).cfg;\n                let providerCxt = {\n                    itemCtx:  itemCtx,\n                    storageConfig: storageConfig,\n                    endpoint: endpoint\n                }\n                let isInit = provider.initialize(providerCxt);\n                Assert.ok(isInit, \"init process is successful\");\n\n                let addedEvt = provider.addEvent(\"\", evt, itemCtx);\n                Assert.ok(addedEvt, \"evt should be added\");\n                Assert.equal((addedEvt as IStorageTelemetryItem).data, \"MjEsMzI=\", \"should have the expected encoded stored event\");\n                let evts = provider.getAllEvents();\n                let data = evts && evts[0];\n                Assert.deepEqual(data.data, arr, \"should have the expected decoded stored event array\");\n            }\n            \n        });\n\n\n\n\n    }\n\n    \n    \n}\nclass TestHelper {\n        private static _idCount = 0;\n    \n        static reset(key: string) {\n            this._idCount = 0;\n            AITestClass.orgLocalStorage.removeItem(key);\n        }\n    \n        static mockEvent(endPointUrl: string, criticalCnt: number, setId = true): IStorageTelemetryItem {\n            let time = new Date().getTime();\n            let random = strSubstr(generateW3CId(), 0, 8);\n            this._idCount++;\n            let payload = {\n                urlString: endPointUrl,\n                data: '[{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}},{\"name\":\"test1\",\"prop\":{\"prop1\":\"prop1\"}}]',\n                headers: {\n                    \"header1\": \"header1val\",\n                    \"header2\": \"header2val\"\n                },\n                disableXhrSync: false,\n                disableFetchKeepAlive: false,\n                sendReason: 1,\n                id: setId? time + \".\" + random : \"\",\n                iKey: \"testIKey\",\n                criticalCnt: criticalCnt\n            }\n            return payload;\n        }\n\n        static mockStorageJSON(item: IStorageTelemetryItem | IStorageTelemetryItem[]): any {\n            if (isArray(item)) {\n                let evts = {};\n                arrForEach(item, (evt) => {\n                    let id = evt.id;\n                    evts[id as any] = evt\n\n                });\n                return {\n                    lastAccessTime: 0,\n                    evts:evts\n                }\n\n            }\n\n            let id = item.id;\n            return {\n                lastAccessTime: 0,\n                evts:{[id as any]: item }\n            }\n\n        }\n     \n}\n"
  },
  {
    "path": "channels/offline-channel-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript API</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <!-- <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script> -->\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>    \n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n\n    <script>\n  \n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                sinon: \"../../common/Tests/External/sinon-7.3.1\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        //modules.add(\"sinon\");   \n\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function () {\n            var testModule = modules.add(\"Tests/Unit/src/offlinechannel.tests\", \"./Unit/dist/offlinechannel.tests.js\")  \n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "channels/offline-channel-js/Tests/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": false,\n    \"module\": \"amd\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"declaration\": true\n  },\n  \"include\": [\n  ],\n  \"exclude\": [\n      \"node_modules/\"\n  ]\n}"
  },
  {
    "path": "channels/offline-channel-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n\n  /**\n   * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n   * standard settings to be shared across multiple projects.\n   *\n   * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n   * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n   * resolved using NodeJS require().\n   *\n   * SUPPORTED TOKENS: none\n   * DEFAULT VALUE: \"\"\n   */\n  // \"extends\": \"./shared/api-extractor-base.json\"\n  // \"extends\": \"my-package/include/api-extractor-base.json\"\n\n  /**\n   * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n   * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n   *\n   * The path is resolved relative to the folder of the config file that contains the setting.\n   *\n   * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n   * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n   * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n   * will be reported.\n   *\n   * SUPPORTED TOKENS: <lookup>\n   * DEFAULT VALUE: \"<lookup>\"\n   */\n  \"projectFolder\": \".\",\n\n  /**\n   * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n   * analyzes the symbols exported by this module.\n   *\n   * The file extension must be \".d.ts\" and not \".ts\".\n   *\n   * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n   * prepend a folder token such as \"<projectFolder>\".\n   *\n   * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n   */\n  \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-offlinechannel-js.d.ts\",\n\n  /**\n   * A list of NPM package names whose exports should be treated as part of this package.\n   *\n   * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n   * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n   * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n   * imports library2.  To avoid this, we can specify:\n   *\n   *   \"bundledPackages\": [ \"library2\" ],\n   *\n   * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n   * local files for library1.\n   */\n  \"bundledPackages\": [\n  ],\n\n  /**\n   * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n   */\n  \"compiler\": {\n    /**\n     * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n     */\n    // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n\n    /**\n     * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n     * The object must conform to the TypeScript tsconfig schema:\n     *\n     * http://json.schemastore.org/tsconfig\n     *\n     * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n     *\n     * DEFAULT VALUE: no overrideTsconfig section\n     */\n    // \"overrideTsconfig\": {\n    //   . . .\n    // }\n\n    /**\n     * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n     * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n     * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n     * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n     *\n     * DEFAULT VALUE: false\n     */\n    // \"skipLibCheck\": true,\n  },\n\n  /**\n   * Configures how the API report file (*.api.md) will be generated.\n   */\n  \"apiReport\": {\n    /**\n     * (REQUIRED) Whether to generate an API report.\n     */\n    \"enabled\": false,\n\n    /**\n     * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n     * a full file path.\n     *\n     * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n     *\n     * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n     */\n    \"reportFileName\": \"<unscopedPackageName>.api.md\",\n\n    /**\n     * Specifies the folder where the API report file is written.  The file name portion is determined by\n     * the \"reportFileName\" setting.\n     *\n     * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n     * e.g. for an API review.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/etc/\"\n     */\n    \"reportFolder\": \"<projectFolder>/build/dts/\",\n\n    /**\n     * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n     * the \"reportFileName\" setting.\n     *\n     * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n     * If they are different, a production build will fail.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/temp/\"\n     */\n    // \"reportTempFolder\": \"<projectFolder>/temp/\"\n  },\n\n  /**\n   * Configures how the doc model file (*.api.json) will be generated.\n   */\n  \"docModel\": {\n    /**\n     * (REQUIRED) Whether to generate a doc model file.\n     */\n    \"enabled\": true,\n\n    /**\n     * The output path for the doc model file.  The file extension should be \".api.json\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n     */\n    \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n  },\n\n  /**\n   * Configures how the .d.ts rollup file will be generated.\n   */\n  \"dtsRollup\": {\n    /**\n     * (REQUIRED) Whether to generate the .d.ts rollup file.\n     */\n    \"enabled\": true,\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n     * This file will include all declarations that are exported by the main entry point.\n     *\n     * If the path is an empty string, then this file will not be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n     */\n    \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n     * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"\"\n     */\n    // \"betaTrimmedFilePath\": \"<projectFolder>/dist/<unscopedPackageName>-beta.d.ts\",\n\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n     * This file will include only declarations that are marked as \"@public\".\n     *\n     * If the path is an empty string, then this file will not be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"\"\n     */\n    // \"publicTrimmedFilePath\": \"<projectFolder>/dist/<unscopedPackageName>-public.d.ts\",\n\n    /**\n     * When a declaration is trimmed, by default it will be replaced by a code comment such as\n     * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n     * declaration completely.\n     *\n     * DEFAULT VALUE: false\n     */\n    // \"omitTrimmingComments\": true\n  },\n\n  /**\n   * Configures how the tsdoc-metadata.json file will be generated.\n   */\n  \"tsdocMetadata\": {\n    /**\n     * Whether to generate the tsdoc-metadata.json file.\n     *\n     * DEFAULT VALUE: true\n     */\n    \"enabled\": false,\n\n    /**\n     * Specifies where the TSDoc metadata file should be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n     * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n     * falls back to \"tsdoc-metadata.json\" in the package folder.\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n  },\n\n  /**\n   * Configures how API Extractor reports error and warning messages produced during analysis.\n   *\n   * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n   */\n  \"messages\": {\n    /**\n     * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n     * the input .d.ts files.\n     *\n     * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n     *\n     * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n     */\n    \"compilerMessageReporting\": {\n      /**\n       * Configures the default routing for messages that don't match an explicit rule in this table.\n       */\n      \"default\": {\n        /**\n         * Specifies whether the message should be written to the the tool's output log.  Note that\n         * the \"addToApiReportFile\" property may supersede this option.\n         *\n         * Possible values: \"error\", \"warning\", \"none\"\n         *\n         * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n         * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n         * the \"--local\" option), the warning is displayed but the build will not fail.\n         *\n         * DEFAULT VALUE: \"warning\"\n         */\n        \"logLevel\": \"warning\",\n\n        /**\n         * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n         * then the message will be written inside that file; otherwise, the message is instead logged according to\n         * the \"logLevel\" option.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"addToApiReportFile\": false\n      },\n\n      // \"TS2551\": {\n      //   \"logLevel\": \"warning\",\n      //   \"addToApiReportFile\": true\n      // },\n      //\n      // . . .\n    },\n\n    /**\n     * Configures handling of messages reported by API Extractor during its analysis.\n     *\n     * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n     *\n     * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n     */\n    \"extractorMessageReporting\": {\n      \"default\": {\n        \"logLevel\": \"warning\",\n        // \"addToApiReportFile\": false\n      },\n\n      \"ae-missing-release-tag\": {\n        \"logLevel\": \"none\"\n      },\n      //\n      // . . .\n    },\n\n    /**\n     * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n     *\n     * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n     *\n     * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n     */\n    \"tsdocMessageReporting\": {\n      \"default\": {\n        \"logLevel\": \"warning\",\n        // \"addToApiReportFile\": false\n      }\n\n      // \"tsdoc-link-tag-unescaped-text\": {\n      //   \"logLevel\": \"warning\",\n      //   \"addToApiReportFile\": true\n      // },\n      //\n      // . . .\n    }\n  }\n\n}\n"
  },
  {
    "path": "channels/offline-channel-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-offlinechannel-js\",\n    \"version\": \"0.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK Offline Channel\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-offlinechannel-js.js\",\n    \"module\": \"dist-es5/applicationinsights-offlinechannel-js.js\",\n    \"types\": \"types/applicationinsights-offlinechannel-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/channels/offline-channel-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt offlinechannel\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt offlinechanneltest\",\n        \"mintest\": \"grunt offlinechannel-mintest\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights JavaScript SDK Offline Channel\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt offlinechannel-min\",\n        \"ai-restore\": \"grunt offlinechannel-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@types/sinon\": \"4.3.3\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"sinon\": \"^7.3.1\",\n        \"typedoc\": \"^0.26.6\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "channels/offline-channel-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst outputName = \"applicationinsights-offlinechannel-js\";\n\nconst banner = [\n    \"/*!\",\n    ` * Application Insights JavaScript SDK - Offline Channel, ${version}`,\n    \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n    \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n    \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n    \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner,\n    {\n        namespace: \"Microsoft.ApplicationInsights\",\n        version: version,\n        node: {\n            entryPoint: outputName,\n            outputName: outputName\n        },\n        browser: {\n            entryPoint: outputName,\n            outputName: outputName\n        }\n    },\n    [\"applicationinsights-offlinechannel-js\"]\n);\n\n\n\n"
  },
  {
    "path": "channels/offline-channel-js/src/Helpers/Utils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    EventPersistence, INotificationManager, ITelemetryItem, NotificationManager, eLoggingSeverity, generateW3CId\n} from \"@microsoft/applicationinsights-core-js\";\nimport { isNumber, isString, objKeys, strSubstr } from \"@nevware21/ts-utils\";\nimport { IPostTransmissionTelemetryItem } from \"../Interfaces/IInMemoryBatch\";\n\n/**\n* Checks if the value is a valid EventPersistence.\n* @param {enum} value - The value that needs to be checked.\n* @returns {boolean} True if the value is in EventPersistence, false otherwise.\n*/\nexport function isValidPersistenceLevel(value: EventPersistence | number): boolean {\n    return (isNumber(value) && value >= eLoggingSeverity.DISABLED && value <= EventPersistence.Critical);\n}\n\n\n// Endpoint schema\n// <prefix>.<suffix>\n//Prefix: Defines a service.\n//Suffix: Defines the common domain name.\n\n/**\n * Get domian from an endpoint url.\n * for example, https://test.com?auth=true, will return test.com\n * @param endpoint - endpoint url\n * @returns domain string\n */\nexport function getEndpointDomain(endpoint: string) {\n    try {\n        let url = endpoint.replace(/^https?:\\/\\/|^www\\./, \"\");\n        url = url.replace(/\\?/, \"/\");\n        let arr = url.split(\"/\");\n        if (arr && arr.length > 0) {\n            return arr[0];\n        }\n      \n    } catch (e) {\n        // eslint-disable-next-line no-empty\n    }\n    // if we can't get domain, entire endpoint will be used\n    return endpoint;\n}\n\n/**\n * If current value is equal or greater than zero.\n * @param value - number\n * @returns boolean\n */\nexport function isGreaterThanZero(value: number) {\n    return value >= 0;\n}\n\n\n//Base64 is a binary encoding rather than a text encoding,\n// it were added to the web platform before it supported binary data types.\n// As a result, the two functions use strings to represent binary data\nconst _base64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n/**\n * Base64-encodes a Uint8Array.\n *\n * @param data - the Uint8Array or string to encode.\n *\n * @returns the base64-encoded output string.\n */\nexport function base64Encode(data: string | Uint8Array) {\n    let line = \"\";\n    let input = \"\";\n\n    if (isString(data)) {\n        input = data;\n    } else {\n        input = data.toString();\n    }\n\n    let output = \"\";\n    // tslint:disable-next-line:one-variable-per-declaration\n    let chr1, chr2, chr3;\n\n    let lp = 0;\n    while (lp < input.length) {\n        chr1 = input.charCodeAt(lp++);\n        chr2 = input.charCodeAt(lp++);\n        chr3 = input.charCodeAt(lp++);\n\n        // encode 4 character group\n        line += _base64.charAt(chr1 >> 2);\n        line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4));\n        if (isNaN(chr2)) {\n            line += \"==\";\n        } else {\n            line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6));\n            line += isNaN(chr3) ? \"=\" : _base64.charAt(chr3 & 63);\n        }\n    }\n\n    output += line;\n\n    return output;\n}\n\n/**\n * Base64-decodes an encoded string and transforms it back to a Uint8Array.\n * @param input - the encoded string to decode\n * @returns  Uint8Array\n */\nexport function base64Decode(input: string) {\n    var output = \"\";\n    var chr1, chr2, chr3;\n    var enc1, enc2, enc3, enc4;\n    var i = 0;\n\n    input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n    while (i < input.length) {\n\n        enc1 = _base64.indexOf(input.charAt(i++));\n        enc2 = _base64.indexOf(input.charAt(i++));\n        enc3 = _base64.indexOf(input.charAt(i++));\n        enc4 = _base64.indexOf(input.charAt(i++));\n\n        chr1 = (enc1 << 2) | (enc2 >> 4);\n        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n        chr3 = ((enc3 & 3) << 6) | enc4;\n\n        output = output + String.fromCharCode(chr1);\n\n        if (enc3 != 64) {\n            output = output + String.fromCharCode(chr2);\n        }\n        if (enc4 != 64) {\n            output = output + String.fromCharCode(chr3);\n        }\n\n    }\n    let arr = output.split(\",\").map(c => Number(c));\n    return new Uint8Array(arr);\n\n}\n\n/**\n * Get number value of current time and append a random float number.\n * For example, if current time value is 12345678, so \"12345678.randomfl\" will be returned\n * @returns time id string\n */\nexport function getTimeId(): string {\n    let time = (new Date()).getTime();\n    // append random digits to avoid same timestamp value\n    const random = strSubstr(generateW3CId(), 0, 8);\n    // function to create spanid();\n    return time + \".\" + random;\n}\n\n/**\n * Get time value from a time id that is generated from getTimeId() function.\n * For example, if time id is \"12345678.randomfl\", 12345678 will be returned\n * @param id - time id string\n * @returns time value number\n */\nexport function getTimeFromId(id: string) {\n    try {\n        let regex = new RegExp(/\\d+\\./g);\n        if (id && isString(id) && regex.test(id)) {\n            let arr = id.split(\".\");\n            return parseInt(arr[0]);\n \n        }\n    } catch (e) {\n        // eslint-disable-next-line no-empty\n    }\n    return 0;\n}\n\n/**\n * Get persistence level from a telemetry item.\n * Persistence level will be get from root, baseData or data in order.\n * For example, if persistence level is set both in root and baseData, the root one will be returned.\n * If no valid persistence level defined, normal level will be returned.\n * @param item - telemetry item\n * @returns persistent level\n */\nexport function getPersistence(item: ITelemetryItem | IPostTransmissionTelemetryItem): number | EventPersistence {\n    let rlt = EventPersistence.Normal;\n    // if item is null, return normal level\n    if (!item) {\n        return rlt;\n    }\n    try {\n        let iItem = item as IPostTransmissionTelemetryItem;\n        let level = iItem.persistence || (iItem.baseData && iItem.baseData.persistence) || (iItem.data && iItem.data.persistence);\n        if (level && isValidPersistenceLevel(level)) {\n            return level;\n        }\n    } catch (e) {\n        // eslint-disable-next-line no-empty\n    }\n    return rlt;\n}\n\nexport const EVT_DISCARD_STR = \"eventsDiscarded\";\nexport const EVT_STORE_STR = \"offlineEventsStored\";\nexport const EVT_SENT_STR = \"offlineBatchSent\";\nexport const BATCH_DROP_STR = \"offlineBatchDrop\";\n\nexport function forEachMap<T>(map: { [key: string]: T }, callback: (value: T, key: string) => boolean, ordered?: boolean): void {\n    if (map) {\n        let keys = objKeys(map);\n        if (!!ordered && keys) {\n            let time = (new Date()).getTime();\n            keys = keys.sort((a,b) => {\n                try {\n                    // if getTimeFromId returns 0, mean the time is not valid\n                    let aTime = getTimeFromId(a) || time;\n                    let bTime = getTimeFromId(b) || time;\n                    return aTime - bTime;\n                } catch(e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return -1;\n            });\n        }\n        for (let lp = 0; lp < keys.length; lp++) {\n            let key = keys[lp];\n            if (!callback(map[key], key)) {\n                break;\n            }\n        }\n    }\n}\n\n \nexport function callNotification(mgr: INotificationManager, evtName: string, theArgs: any[]) {\n    let manager = (mgr || ({} as NotificationManager));\n    let notifyFunc = manager[evtName];\n    if (notifyFunc) {\n        try {\n            notifyFunc.apply(manager, theArgs);\n        } catch (e) {\n            // eslint-disable-next-line no-empty\n        }\n    }\n}\n\nexport function batchDropNotification(mgr: INotificationManager, cnt: number, reason?: number) {\n    if (mgr && cnt > 0) {\n        callNotification(mgr, BATCH_DROP_STR, [cnt, reason]);\n    }\n    return;\n}\n\n\n\n\n\n// OneCollector:\n// 200-OK – Success or partial success.\n// 204-NoContent – Success or partial success. Regarding accepting events, identical to 200-OK. If the request header contains NoResponseBody with the value of true and the request was successful/partially successful, 204-NoContent status code is returned instead of 200-OK.\n// 400-BadRequest – all events were rejected.\n// 403-Forbidden – client is above its quota and all events were throttled.\n// 413-RequestEntityTooLarge – the request doesn’t conform to limits described in Request constraints section.\n// 415-UnsupportedMediaType – the Content-Type or Content-Encoding header has an unexpected value.\n// 429-TooManyRequests – the server decided to throttle given request (no data accepted) as the client (device, client version, …) generates too much traffic.\n// 401-Unauthorized – Can occur under two conditions:\n//   All tenant tokens included in this request are invalid (unauthorized). kill-tokens header indicates which one(s). WWW-Authenticate: Token realm=\"ingestion\" (see: rfc2617 for more details) header is added.\n// The client has supplied the “strict” header (see section 3.3), and at least one MSA and/or XAuth event token cannot be used as a source of trusted user or device information.  The event failure reason “TokenCrackingFailure” will be present in the response’ JSON body.  In this scenario, the client is expected to fix or replace the offending ticket and retry.\n// 500-InternalServerError – an unexpected exception while handling the request.\n// 503-ServiceUnavailable – a machine serving this request is overloaded or shutting down. The request should be retried to a different machine. The server adds Connection: Close header to enforce TCP connection closing.\n\n\n\n// Breeze\n// 0 ad blockers\n// 200 Success!\n// 206 - Partial Accept\n// 307/308 - Redirect\n// 400 - Invalid\n//  400 can also be caused by Azure AD authentication.\n//  400 is not retriable and SDK should drop invalid data.\n// 401 - Unauthorized\n//  401 can be also caused by an AAD outage.\n//  401 is retriable.\n// 402 - Daily Quota Exceeded, drop the data.\n//  There is no retry-after in the response header for 402.\n// 403 - Forbidden\n//  403 can also caused by misconfiguring the access control assigned to the Application Insights resource.\n//  403 is retriable.\n// 404 - Ingestion is allowed only from stamp specific endpoint\n//  Telemetry will be dropped and customer must update their connection string.\n//  404 is not retriable and SDK should drop the data.\n// 408 - Timeout, retry it later. (offline might get this)\n// 429 - Too Many Requests, Breeze returns retry-after for status code 429 only.\n// 500 - Internal Server Error, retry it later.\n// 502 - Bad Gateway, retry it later.\n// 503 - Service Unavailable, retry it later. (offline)\n// 504 - Gateway timeout, retry it later.\n// All other response codes, SDK should drop the data.\n"
  },
  {
    "path": "channels/offline-channel-js/src/InMemoryBatch.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { IDiagnosticLogger, ITelemetryItem, isNullOrUndefined } from \"@microsoft/applicationinsights-core-js\";\nimport { IInMemoryBatch, IPostTransmissionTelemetryItem } from \"./Interfaces/IInMemoryBatch\";\n\nexport class InMemoryBatch implements IInMemoryBatch {\n\n\n    constructor(logger: IDiagnosticLogger, endpoint: string, evts?: IPostTransmissionTelemetryItem[], evtsLimitInMem?: number) {\n        let _buffer: IPostTransmissionTelemetryItem[] = evts ? [].concat(evts) : [];\n\n        dynamicProto(InMemoryBatch, this, (_self) => {\n\n\n            _self.endpoint = () =>{\n                return endpoint;\n            }\n\n            \n            _self.addEvent = (payload: IPostTransmissionTelemetryItem | ITelemetryItem) => {\n                if (!isNullOrUndefined(evtsLimitInMem) && _self.count() >= evtsLimitInMem) {\n                    return false;\n                }\n                _buffer.push(payload);\n                return true;\n            };\n\n            _self.count = (): number => {\n                return _buffer.length;\n            };\n\n            _self.clear = () => {\n                _buffer = [];\n            };\n\n            _self.getItems = () => {\n                return _buffer.slice(0);\n            };\n\n            _self.split = (fromEvt: number, numEvts?: number) => {\n                // Create a new batch with the same endpointUrl\n                let theEvts: IPostTransmissionTelemetryItem[];\n                if (fromEvt < _buffer.length) {\n                    let cnt = _buffer.length - fromEvt;\n                    if (!isNullOrUndefined(numEvts)) {\n                        cnt = numEvts < cnt ? numEvts : cnt;\n                    }\n    \n                    theEvts = _buffer.splice(fromEvt, cnt);\n                }\n    \n                return new InMemoryBatch(logger, endpoint, theEvts, evtsLimitInMem);\n            };\n\n            _self.createNew = (newEndpoint: string, evts?: IPostTransmissionTelemetryItem[] | ITelemetryItem[], newEvtsLimitInMem?: number) => {\n                return new InMemoryBatch(logger, newEndpoint, evts, newEvtsLimitInMem);\n            }\n\n        });\n    }\n\n    public addEvent(payload: IPostTransmissionTelemetryItem | ITelemetryItem) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n    public endpoint() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public count(): number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return 0;\n    }\n\n    public clear() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getItems(): IPostTransmissionTelemetryItem[] | ITelemetryItem[] {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Split this batch into 2 with any events > fromEvent returned in the new batch and all other\n     * events are kept in the current batch.\n     * @param fromEvt - The first event to remove from the current batch.\n\n     * @param numEvts - The number of events to be removed from the current batch and returned in the new one. Defaults to all trailing events\n     */\n    public split(fromEvt: number, numEvts?: number) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * create current buffer to a new endpoint\n     * @param endpoint - if not defined, current endpoint will be used\n     * @param evts - new events to be added\n     * @param addCurEvts - if it is set to true, current itemss will be transferred to the new batch\n     */\n    public createNew(endpoint: string, evts?: IPostTransmissionTelemetryItem[] | ITelemetryItem[], evtsLimitInMem?: number) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/Interfaces/IInMemoryBatch.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { EventPersistence, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * An internal interface which defines a in memory batch\n */\nexport interface IInMemoryBatch {\n    /**\n     * Enqueue the payload\n     */\n    addEvent: (evt: IPostTransmissionTelemetryItem | ITelemetryItem) => boolean;\n    /**\n     * Returns the number of elements in the buffer\n     */\n    count: () => number;\n\n    /**\n     * Returns items stored in the buffer\n     */\n    getItems: () => IPostTransmissionTelemetryItem[] | ITelemetryItem[];\n    \n    /**\n     * Split this batch into 2 with any events > fromEvent returned in the new batch and all other\n     * events are kept in the current batch.\n     * @param fromEvt - The first event to remove from the current batch.\n\n     * @param numEvts - The number of events to be removed from the current batch and returned in the new one. Defaults to all trailing events\n     */\n    split: (fromEvt: number, numEvts?: number) => IInMemoryBatch;\n     /**\n     * create current buffer to a new endpoint with current logger\n     * @param endpoint - new endpoint\n     * @param evts - new events to be added\n     * @param evtsLimitInMem - new evtsLimitInMem\n     */\n    createNew(endpoint: string, evts?: IPostTransmissionTelemetryItem[] | ITelemetryItem[], evtsLimitInMem?: number): IInMemoryBatch;\n\n}\n\nexport interface IPostTransmissionTelemetryItem extends ITelemetryItem {\n     /**\n     * [Optional] An EventPersistence value, that specifies the persistence for the event. The EventPersistence constant\n     */\n    persistence?: EventPersistence;\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/Interfaces/IOfflineBatch.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IOfflineListener, IPayloadData, IProcessTelemetryUnloadContext, ITelemetryUnloadState, IXHROverride, createEnumStyle\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise } from \"@nevware21/ts-async\";\n\n// NOTE: Most interfaces here should be moved to core eventually.\n// TODO: move interfaces to core\n//TODO: add doc\n\nexport interface IOfflineDetectorCfg {\n    autoStop: boolean; //default trues\n    pollingInterval: number; //default 5min\n    pollingUrl: string;\n}\n\nexport interface IOfflineDetector {\n    startPolling(): boolean;\n    stopPolling(): boolean;\n    getOfflineListener(): IOfflineListener;\n}\n\n\nexport declare type createDefaultOfflineDetector = (cfg?: IOfflineDetectorCfg) => IOfflineDetector;\n    \nexport declare type createNoopOfflineDetector = (cfg?: IOfflineDetectorCfg) => IOfflineDetector;\n    \n\nexport const enum eStorageType {\n    Unknown = 0,\n    LocalStorage = 1,\n    SessionStorage = 2,\n    IndexDb = 3\n}\n\nexport const StorageType = (/* @__PURE__ */ createEnumStyle<typeof eStorageType>({\n    Unknown: eStorageType.Unknown,\n    LocalStorage: eStorageType.LocalStorage,\n    SessionStorage: eStorageType.SessionStorage,\n    IndexDb: eStorageType.IndexDb\n}));\nexport type StorageType = number | eStorageType;\n \nexport const enum eBatchSendStatus {\n    Complete = 1,\n    Retry = 2,\n    Drop = 3,\n    Failure = 4\n}\nexport const BatchSendStatus = (/* @__PURE__ */ createEnumStyle<typeof eBatchSendStatus>({\n    Complete: eBatchSendStatus.Complete,\n    Retry: eBatchSendStatus.Retry,\n    Drop: eBatchSendStatus.Drop,\n    Failure: eBatchSendStatus.Failure\n}));\nexport type BatchSendStatus = number | eBatchSendStatus;\n \n\nexport const enum eBatchStoreStatus {\n    Success = 1,\n    Failure = 2\n}\nexport const BatchStoreStatus = (/* @__PURE__ */ createEnumStyle<typeof eBatchStoreStatus>({\n    Success: eBatchStoreStatus.Success,\n    Failure: eBatchStoreStatus.Failure\n}));\nexport type BatchStoreStatus = number | eBatchStoreStatus;\n \nexport interface IOfflineBatchHandlerCfg {\n    batchMaxSize?: number; // default 10000\n    storageType?: eStorageType; // default local storage\n    offineDetector?: IOfflineDetector; // default no-op detector\n    autoClean?: Boolean;\n    maxRetryCnt?: number; // Max count for retry default 5\n }\n \nexport interface IOfflineBatchResponse {\n     state: eBatchSendStatus,\n     data?: any;\n }\n \nexport interface IOfflineBatchStoreResponse {\n     // Identifies if the batch was stored successfully or not\n    state: eBatchStoreStatus;\n    item?: any;\n }\n \nexport interface IOfflineBatchCleanResponse {\n batchCnt: number;\n}\n\n \nexport declare type OfflineBatchSendCallback = (response: IOfflineBatchResponse) => void;\n\nexport declare type OfflineBatchStoreCallback = (response: IOfflineBatchStoreResponse) => void;\n\nexport declare type OfflineBatchCallback = (response: IOfflineBatchResponse) => void;\n\n\nexport interface IOfflineBatchHandler {\n    storeBatch(batch: IPayloadData, cb?: OfflineBatchStoreCallback, sync?: boolean): undefined | IOfflineBatchStoreResponse | IPromise<IOfflineBatchStoreResponse>;\n    sendNextBatch(cb?: OfflineBatchCallback, sync?: boolean, xhrOverride?: IXHROverride, cnt?: number): undefined | IOfflineBatchResponse | IPromise<IOfflineBatchResponse>;\n    hasStoredBatch(callback?: (hasBatches: boolean) => void): undefined | boolean | IPromise<boolean>;\n    cleanStorage(cb?:(res: IOfflineBatchCleanResponse) => void ): undefined | IOfflineBatchCleanResponse | IPromise<IOfflineBatchCleanResponse>;\n    teardown(unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState): void\n}\n\n//export declare type createOfflineBatchHandler = (storageType: eStorageType, cfg?: IOfflineBatchHandlerCfg) => IOfflineBatchHandler;\n"
  },
  {
    "path": "channels/offline-channel-js/src/Interfaces/IOfflineIndexDb.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise, ITaskScheduler } from \"@nevware21/ts-async\";\n\nexport interface IDbState {\n    ver: number;\n    table: any;\n    db: IDBDatabase;\n    active: boolean;\n    openErr: any;\n    isClosing: any;\n}\n\nexport interface IDbContext {\n    /**\n     * The name of the database that has been opened\n     */\n    name: string;\n    /**\n     * The specific ITaskScheduler that will be used to schedule events against this opened database\n     */\n    sch: ITaskScheduler;\n    /**\n     * The Actual IndexedDB IDBDatabase handles returned and opened by the helper instance.\n     */\n    dbHdl: IDBDatabase[];\n    /**\n     * Adds a new handle to the array of open handles\n     * @param db - */\n\n    add(db: IDBDatabase): void;\n\n    /**\n     * Removes the given handle from the array of open handles (if present)\n     * @param db - */\n    remove(db: IDBDatabase): void;\n\n    /**\n     * Returns whether the identified database if considered to be open (i.e. has at least 1 open db handle)\n     */\n    isOpen(): boolean;\n\n    /**\n     * Internal helper to return the first available open db handle\n     */\n    openHdl(): IDBDatabase;\n    state?: IDbState\n}\n\n\nexport interface IIndexedDbContext {\n    name: string;\n    ver?: string;\n\n}\n\n/**\n * Result value returned by the processFunc() delegate of the _openCursor() iterating function so that\n * the internal iteration knows whether to stop, continue or wait.\n */\nexport const enum CursorProcessResult {\n    /**\n     * Just move onto the next available item for the cursor\n     */\n    Continue = 0,\n\n    /**\n     * The process function is waiting on another async operation and will continue or complete when it's ready\n     */\n    Waiting = 1,\n\n    /**\n     * Stop processing the cursor and resolve the Promise returned from the openCursor() call.\n     */\n    Complete = 2\n}\n\n/**\n * The open database context created by the openDb() method and passed to the processFunc() delegate to perform operations\n * on the opened db, this is used to pass around the current db context.\n */\nexport interface IIndexedDbOpenDbContext<C> {\n    dbName: string;\n    dbVersion: number;\n    db: IDBDatabase;            // The opened indexedDb object\n    ctx: C;                     // User Context\n    isNew: boolean;             // Identifies if the Db was newly created during this event\n    txn: IDBTransaction;        // Open DB Transaction\n    /**\n     * Once the database hased been opened by the openDb() method you can use this method to open a specific table (store), once successfully opened\n     * the doAction callback will be called.\n     * The Promise returned by the openStore() method will not resolve until either the promise returned by the doAction() callback is resolved/rejected\n     * or there was an error opening the store (The database was not or is no longer open).\n     * Special Note: This method IS optional and will NOT exist for the versionChangeFunc() callback, but will always exist for the processFunc() provided during the openDb() method call.\n     * @param eventTable - The name of the store (table) to open\n     * @param doAction - The callback function to execute once the store is opened and will be passed a IIndexedDbStoreActionContext<> context instance, this\n     * context can be used to open a cursor and perform operations on the table. If the action does not return an Promise then open store will return a resolved promise with the returned value\n     */\n    openStore?<T>(\n        eventTable: string,\n        doAction: (store: IIndexedDbStoreActionContext<C>) => IPromise<T>|T|void): IPromise<T>;\n    /**\n     * A helper method that opens the store and a cursor on the table previously opened by the openStore() method of the IIndexedDbOpenDbContext<> instance that was provided by the openDb() call.\n     * This enables searching (query) and iterating over the request table. The returned Promise will be resolved with an array of the requested items (if successful) and whether\n     * the passed processFunc() requests or manually inserts the elements into the array. Or rejected if there was an issue opening the cursor.\n     * @param eventTable - The name of the store (table) to open\n     * @param query - Either a string that will be used to construct a SimpleQuery definition or an instance of the IIndexedDbSimpleQuery interface used to open the cursor on the store.\n     * May be null to iterate over the entire store.\n     * @param processFunc - [Optional] The callback method that will be called for every item found matching the query for the store.\n     * - If no callback is provided then the returned Promise will include all items matching the provided query (if any are found)\n     * - When provided it is the processFunc() responsibility to populate the passed values[] and this array will be the values used to resolve the outer Promise once the cursor has finished iterating.\n     * - The result of the processFunc() (A CursorProcessResult value) will be used to determine whether the cursor will just Continue onto the next value (if present), Complete (stop iterating) or\n     * Wait for the processFunc() to call the continue() or done() methods of the IProcessCursorState<> instance, when returning \"Waiting\" it is the responsibility of the processFunc() to call either of\n     * these methods, failure to do so will result in the operation to never complete.\n     */\n    openCursor?<T>(\n        eventTable: string,\n        query: string|IIndexedDbSimpleQuery,\n        processFunc?: (state: IProcessCursorState<C>, value: T, values: T[]) => CursorProcessResult): IPromise<T[]>;\n}\n\n/**\n * The context object created by _openStore() function and passed to the doAction() delegate.\n */\nexport interface IIndexedDbStoreActionContext<C> {\n    /**\n     * The open database context used and passed to the doAction() method from the openDb() call.\n     */\n    db: IIndexedDbOpenDbContext<C>; // The Open Db Context used for this requests\n    /**\n     * The IndexedDB database transaction used for this object store\n     */\n    tx: IDBTransaction;\n    /**\n     * Identifies the name of the current object store (Table) that was opened\n     */\n    tbl: string;\n    /**\n     * The actual IndexedDB IDBObjectStore instance for the opened store that can by used to perform operations on the table (add, put, etc)\n     */\n    store: IDBObjectStore;          // The IndexedDb object store interface\n    /**\n     * A helper method that opens a cursor on the table previously opened by the openStore() method of the IIndexedDbOpenDbContext<> instance that was provided by the openDb() call.\n     * This enables searching (query) and iterating over the request table. The returned Promise will be resolved with an array of the requested items (if successful) and whether\n     * the passed processFunc() requests or manually inserts the elements into the array. Or rejected if there was an issue opening the cursor.\n     * @param query - Either a string that will be used to construct a SimpleQuery definition or an instance of the IIndexedDbSimpleQuery interface used to open the cursor on the store.\n     * May be null to iterate over the entire store.\n     * @param processFunc - [Optional] The callback method that will be called for every item found matching the query for the store.\n     * - If no callback is provided then the returned Promise will include all items matching the provided query (if any are found)\n     * - When provided it is the processFunc() responsibility to populate the passed values[] and this array will be the values used to resolve the outer Promise once the cursor has finished iterating.\n     * - The result of the processFunc() (A CursorProcessResult value) will be used to determine whether the cursor will just Continue onto the next value (if present), Complete (stop iterating) or\n     * Wait for the processFunc() to call the continue() or done() methods of the IProcessCursorState<> instance, when returning \"Waiting\" it is the responsibility of the processFunc() to call either of\n     * these methods, failure to do so will result in the operation to never complete.\n     */\n    openCursor<T>(\n        query: string|IIndexedDbSimpleQuery,\n        processFunc?: (state: IProcessCursorState<C>, value: T, values: T[]) => CursorProcessResult): IPromise<T[]>;\n    /**\n     * Starts another transaction on the current store, once successfully created the doAction callback will be called.\n     * The Promise returned by the newTransaction() method will not resolve until either the promise returned by the doAction() callback is resolved/rejected\n     * or there was an error opening the store (The database was not or is no longer open).\n     * Special Note: This method IS optional and will NOT exist for the versionChangeFunc() callback, but will always exist for the processFunc() provided during the openDb() method call.\n     * @param doAction - The callback function to execute once the store is opened and will be passed a IIndexedDbStoreActionContext<> context instance, this\n     * context can be used to open a cursor and perform operations on the table.\n     */\n    newTransaction<T>(\n        doAction: (store: IIndexedDbStoreActionContext<C>) => IPromise<T>): IPromise<T>;\n}\n\n/**\n * Interface used for passing around internal state when iterating over a table via a cursor\n */\nexport interface IProcessCursorState<C> {\n    /**\n     * The context returned and used by the openStore() method returned from the openDb() method.\n     */\n    store: IIndexedDbStoreActionContext<C>;\n    /**\n     * The IndexedDB IDBCursorWithValue instance for the cursor operation\n     */\n    cursor: IDBCursorWithValue;\n    /**\n     * Helper to continue onto the next available item using the cursor\n     */\n    continue(): void;\n    /**\n     * Helper to stop processing/iterating over the cursor, the cursor operation will be stopped and the Promise returned by openCursor() will be\n     * resolved with the values[]/\n     */\n    done(): void;\n}\n\n/**\n * Interface defining the object returned by the getDbDetails() function\n */\nexport interface IIndexedDbDetails {\n    name: string;                           // The name of the database\n    version?: number;                         // The version of the database\n}\n\n/**\n * Interface defining the search query arguments used for the openCursor() function\n */\nexport interface IIndexedDbSimpleQuery {\n    /**\n     * [Optional] Returns and optional IndexedDB IDBKeyRange instance that will be passed to the IndexedDB Api openCursor() method.\n     * Value returned May be null.\n     */\n    keyRange?(): IDBKeyRange;\n\n    /**\n     * [Optional] Callback method used to provide additional validation on whether the returned value from the IndexedDB Api cursor iteration, this method\n     * must return true for the processFunc() of the openCursor() is called or the value is just added to the identified items.\n     * @param value - The value returned by the IndexedDB IDBCursorWithValue cursor event.\n     * @returns true if the value matches otherwise false\n     */\n    isMatch?(value: any): boolean;\n}\n\n"
  },
  {
    "path": "channels/offline-channel-js/src/Interfaces/IOfflineProvider.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    EventPersistence, INotificationManager, IPayloadData, IProcessTelemetryContext, IXHROverride, createEnumStyle\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise } from \"@nevware21/ts-async\";\n\n/**\n * Identifies the Storage Providers used by the LocalStorageChannel\n */\nexport const enum eStorageProviders {\n    /**\n     * Identifies that the provider that uses (window||globalThis||self).localStorage\n     */\n    LocalStorage = 1,\n\n    /**\n     * Identifies that the provider that uses (window||globalThis||self).sessionStorage\n     */\n    SessionStorage = 2,\n\n    /**\n     * Identifies that the provider that uses (window||globalThis||self).indexedDB\n     */\n    IndexedDb = 3\n}\n\nexport const StorageProviders = (/* @__PURE__ */ createEnumStyle<typeof eStorageProviders>({\n    LocalStorage: eStorageProviders.LocalStorage,\n    SessionStorage: eStorageProviders.SessionStorage,\n    IndexedDb: eStorageProviders.IndexedDb\n}));\nexport type StorageProviders = number | eStorageProviders;\n\n/**\n * The IOfflineChannelConfiguration interface defines the configuration options for offline channel,\n * supports offline events storage, retrieval and re-sending.\n */\nexport interface IOfflineChannelConfiguration {\n    /**\n     * [Optional] The max size in bytes that should be used for storing events(default up to 5 Mb) in local/session storage.\n     * The maximum size in bytes that should be used for storing events in storage If not specified, the system will use up to 5 MB\n     * @default 5000000\n     */\n    maxStorageSizeInBytes?: number;\n\n    /**\n     * [Optional] The storage key prefix that should be used when storing events in persistent storage.\n     * @default AIOffline\n     */\n    storageKeyPrefix?: string;\n\n    /**\n     * [Optional] Identifies the minimum level that will be cached in the offline channel. Valid values of this\n     * setting are defined by the EventPersistence enum, currently Normal (1) and Critical (2) with the default\n     * value being Normal (1), which means all events without a persistence level set or with invalid persistence level will be marked as Normal(1) events.\n     * @default 1\n     */\n    minPersistenceLevel?: number | EventPersistence;\n\n    /**\n     * [Optional] Identifies the StorageProviders that should be used by the system if available, the first available\n     * provider will be used. Valid available values are defined by the eStorageProviders enum. Only the first 5 entries\n     * are processed, so if this value contains more than 5 elements they will be ignored.\n     * Note: LocalStorage will be used to save unload events even if it is not in the providers list\n     * Default order is [StorageProviders.LocalStorage, StorageProviders.IndexedDB]\n     */\n    providers?: number[] | eStorageProviders[];\n\n    /**\n     * [Optional] The IndexedDb database name that should be used when storing events using (window||globalThis||self).indexedDb.\n     */\n    indexedDbName?: string;\n\n    /**\n     * [Optional] Identifies the maximum number of events to store in each memory batch before sending to persistent storage.\n     * For versions > 3.3.2, new config  splitEvts is added\n     * If splitEvts is set true, eventsLimitInMem will be applied to each persistent level batch\n     */\n    eventsLimitInMem?: number;\n\n    /**\n     * [Optional] Identifies if events that have existed in storage longer than the maximum allowed time (configured in inStorageMaxTime) should be cleaned after connection with storage.\n     * If not provided, default is false\n     */\n    autoClean?: boolean;\n\n    /**\n     * [Optional] Identifies the maximum time in ms that items should be in memory before being saved into storage.\n\n     * @default 15000\n     */\n    inMemoMaxTime?: number;\n\n    /**\n     * [Optional] Identifies the maximum time in ms that items should be in persistent storage.\n     * default: 10080000 (around 2.8 hours) for versions <= 3.3.0\n     * default: 604800000 (around 7days) for versions > 3.3.0\n     */\n    inStorageMaxTime?: number;\n\n    /**\n     * [Optional] Identifies the maximum retry times for an event batch.\n     * default: 1\n     */\n    maxRetry?: number;\n\n    /**\n     * Identifies online channel IDs in order. The first available one will be used.\n     * default is [AppInsightsChannelPlugin, PostChannel]\n     */\n    primaryOnlineChannelId?: string[];\n\n    /**\n     * Identifies the maximum size per batch in bytes that is saved in persistent storage.\n     * default 63000\n     */\n    maxBatchsize?: number;\n\n    /**\n     * Identifies offline sender properties. If not defined, settings will be the same as the online channel configured in primaryOnlineChannelId.\n     */\n    senderCfg?: IOfflineSenderConfig;\n\n    /**\n     * Identifies the interval time in ms that previously stored offline event batches should be sent under online status.\n     * default 15000\n     */\n    maxSentBatchInterval?: number;\n\n    /**\n     * Identifies the maximum event batch count when cleaning or releasing space for persistent storage per time.\n     * default 10\n     */\n    EventsToDropPerTime?: number;\n\n    /**\n     * Identifies the maximum critical events count for an event batch to be able to drop when releasing space for persistent storage per time.\n     * default 2\n     */\n    maxCriticalEvtsDropCnt?: number;\n\n    /**\n    * Identifies overridden for the Instrumentation key when the offline channel calls processTelemetry.\n    */\n    overrideInstrumentationKey?: string;\n\n    /**\n     * Identifies when saving events into the persistent storage, events will be batched and saved separately based on persistence level\n     * this is useful to help reduce the loss of critical events during cleaning process\n     * but it will result in more frequest storage implementations.\n     * If it is set to false, all events will be saved into single in memory batch\n     * Default: false\n     */\n    splitEvts?: boolean;\n\n\n    /**\n     * [Optional] Custom provider that can be used instead of the provided LocalStorage, SessionStorage, IndexedDB.\n     * Default: null\n     * @since 3.9.10\n     */\n    customProvider?: IOfflineProvider;\n\n    /**\n     * [Optional] Custom unload provider should be used for handling unload scenarios.\n     * This provider should support synchronous operations (supportsSyncRequests should return true)\n     * If the unload provider is not provided, the provided customProvider will be used if it supports sync requests,\n     * otherwise localStorage will be used by default.\n     * Default: null\n     * @since 3.9.10\n     */\n    customUnloadProvider?: IOfflineProvider;\n\n    //TODO: add do sampling\n   \n}\n\nexport interface IOfflineSenderConfig {\n\n    /**\n     * Identifies status codes for re-sending event batches\n     * Default: [401, 403, 408, 429, 500, 502, 503, 504]\n     */\n    retryCodes?: number[];\n\n    /**\n     * [Optional] Either an array or single value identifying the requested TransportType type(s) that should be used for sending events\n     * If not defined, the same transports will be used in the channel with the primaryOnlineChannelId\n     */\n    transports?: number | number[];\n\n    /**\n     * [Optional] The HTTP override that should be used to send requests, as an IXHROverride object.\n     */\n    httpXHROverride?: IXHROverride;\n\n    /**\n     * Identifies if provided httpXhrOverride will always be used\n     * default false\n     */\n    alwaysUseXhrOverride?: boolean;\n}\n\n/**\n * An internal interface which defines web provider Storage JSON details\n */\nexport interface IStorageJSON {\n    \n    /**\n     * The timestamp at which the storage was last accessed.\n     */\n    lastAccessTime?: number;\n    evts?: { [id: string]: IStorageTelemetryItem }; // id is the timestamp value\n}\n\n/**\n * An internal interface which defines a common storage item\n */\nexport interface IStorageTelemetryItem extends IPayloadData {\n    id?: string;\n    iKey?: string;\n    sync?: boolean;\n    criticalCnt?: number;\n    isArr?: boolean;\n    attempCnt?: number;\n}\n\n\n/**\n * An internal interface which defines a common provider context that is used to pass multiple values when initializing provider instances\n */\nexport interface ILocalStorageProviderContext {\n    /**\n     * Identifies the context for the current event\n     */\n    itemCtx?: IProcessTelemetryContext;\n\n    /**\n     * Identifies the local storage config that should be used to initialize the provider\n     */\n    storageConfig: IOfflineChannelConfiguration;\n\n    /**\n     * Identifies the unique identifier to be used for this provider instance, when not provided a new Guid will be generated for this instance.\n     * This value must be unique across all instances to avoid polluting events between browser / tabs instances as they may share the same persistent storage.\n     * The primary use case for setting this value is for unit testing.\n     */\n    id?: string;\n\n    /**\n     * Identifies endpoint url.\n     */\n    endpoint?: string;\n\n    /**\n     * Identifies Notification Manager\n     */\n    notificationMgr?: INotificationManager;\n}\n\n/*\n * An internal interface to provide access to different local storage options\n */\nexport interface IOfflineProvider {\n    /**\n     * Initializes the provider using the config\n     * @param providerContext - The provider context that should be used to initialize the provider\n     * @returns True if the provider is initialized and available for use otherwise false\n     */\n    initialize(providerContext: ILocalStorageProviderContext): boolean;\n\n    /**\n     * Identifies whether this storage provider support synchronious requests\n    */\n    supportsSyncRequests(): boolean;\n\n    /**\n     * Stores the value into the storage using the specified key.\n     * @param key - The key value to use for the value\n     * @param evt - The actual event of the request\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     * @returns Either the added element (for synchronous operation) or a Promise for an asynchronous processing\n     */\n    addEvent(key: string, evt: IStorageTelemetryItem, itemCtx: IProcessTelemetryContext): IStorageTelemetryItem | IPromise<IStorageTelemetryItem> | null;\n\n    /**\n     * Get Next batch from the storage\n     */\n     getNextBatch(): IStorageTelemetryItem[] | IPromise< IStorageTelemetryItem[]> | null;\n\n     /**\n     * Get all stored batches from the storage.\n     * @param cnt - batch numbers if it is defined, it will returns given number of batches.\n     * if cnt is not defined, it will return all available batches\n     */\n     getAllEvents(cnt?: number): IStorageTelemetryItem[] | IPromise< IStorageTelemetryItem[]> | null;\n   \n    /**\n     * Removes the value associated with the provided key\n     * @param evts - The events to be removed\n     * @returns Either the removed item array (for synchronous operation) or a Promise for an asynchronous processing\n     */\n    removeEvents(evts: IStorageTelemetryItem[]): IStorageTelemetryItem[] | IPromise<IStorageTelemetryItem[]> | null;\n\n    /**\n     * Removes all entries from the storage provider, if there are any.\n     * @returns Either the removed item array (for synchronous operation) or a Promise for an asynchronous processing\n     */\n    clear(): IStorageTelemetryItem[] | IPromise<IStorageTelemetryItem[]> | null;\n\n    /**\n     * Removes all entries with stroage time longer than inStorageMaxTime from the storage provider\n     */\n    clean(disable?: boolean): boolean | IPromise<boolean>;\n\n    /**\n     * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n     */\n    teardown(): void;\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/Interfaces/ISender.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// ***********************************************************************************************************\n// TODO: remove all interfaces here to common\n\nexport interface IBackendResponse {\n    /**\n     * Number of items received by the backend\n     */\n    readonly itemsReceived: number;\n\n    /**\n     * Number of items succesfuly accepted by the backend\n     */\n    readonly itemsAccepted: number;\n\n    /**\n     * List of errors for items which were not accepted\n     */\n    readonly errors: IResponseError[];\n\n    /**\n     * App id returned by the backend - not necessary returned, but we don't need it with each response.\n     */\n    readonly appId?: string;\n}\n\nexport interface XDomainRequest extends XMLHttpRequestEventTarget {\n    readonly responseText: string;\n    send(payload: string): void;\n    open(method: string, url: string): void;\n}\n\nexport interface IResponseError {\n    readonly index: number;\n    readonly statusCode: number;\n    readonly message: string;\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/OfflineBatchHandler.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    IDiagnosticLogger, IPayloadData, IProcessTelemetryContext, IProcessTelemetryUnloadContext, ITelemetryUnloadState, IUnloadHookContainer,\n    IXHROverride, isNullOrUndefined, isObject\n} from \"@microsoft/applicationinsights-core-js\";\nimport { AwaitResponse, IPromise, createPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport {\n    IOfflineBatchCleanResponse, IOfflineBatchHandler, IOfflineBatchResponse, IOfflineBatchStoreResponse, OfflineBatchCallback,\n    OfflineBatchStoreCallback, eBatchSendStatus, eBatchStoreStatus\n} from \"./Interfaces/IOfflineBatch\";\nimport { ILocalStorageProviderContext, IOfflineProvider, IStorageTelemetryItem, eStorageProviders } from \"./Interfaces/IOfflineProvider\";\nimport { IndexedDbProvider } from \"./Providers/IndexDbProvider\";\nimport { WebStorageProvider } from \"./Providers/WebStorageProvider\";\n\nconst MaxStorageProviderConfig = 2;\nconst NoProviderErrMsg = \"No provider is available\";\n\nexport class OfflineBatchHandler implements IOfflineBatchHandler {\n    constructor(logger?: IDiagnosticLogger, unloadHookContainer?: IUnloadHookContainer) {\n        dynamicProto(OfflineBatchHandler, this, (_self) => {\n            let _isInitialized: boolean;\n            let _logger: IDiagnosticLogger;\n            let _provider: IOfflineProvider;\n            let _unloadProvider: IOfflineProvider;\n            let _itemCtx: IProcessTelemetryContext;\n            let _maxRetryCnt: number;\n            let _retryCodes: number[];\n\n            _initDefaults();\n\n            _self.initialize = (providerContext: ILocalStorageProviderContext) => {\n                // TODO: handle provider change\n                try {\n                    if (!_isInitialized) {\n                        _logger = logger || providerContext.itemCtx.diagLog();\n                        _itemCtx = providerContext.itemCtx;\n                        _provider = _initProvider(providerContext);\n                        let storeCfg = providerContext.storageConfig || {};\n                        let retry = storeCfg.maxRetry;\n                        _maxRetryCnt = !isNullOrUndefined(retry)? retry : 2;\n                        _retryCodes = (storeCfg.senderCfg || {}).retryCodes;\n                        if (_provider) {\n                            _isInitialized = true;\n                        }\n                    }\n                   \n                } catch(e) {\n                    _isInitialized = false;\n                    \n                }\n                return _isInitialized;\n                \n            }\n\n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [_provider, _isInitialized, _unloadProvider];\n            };\n            \n\n            _self.storeBatch = (batch: IPayloadData, cb?: OfflineBatchStoreCallback, sync?: boolean) => {\n                \n                let provider = _provider;\n                if(!!sync) {\n                    provider = _unloadProvider;\n                }\n                return createPromise((resolve, reject) => {\n                    if (!provider) {\n                        reject(new Error(NoProviderErrMsg))\n                    }\n                    let evt = _getOfflineEvt(batch);\n                    return doAwaitResponse(provider.addEvent(evt.id, evt, _itemCtx), (response: AwaitResponse<IStorageTelemetryItem>) => {\n                        try {\n                            let evt = response.value || response.reason || [];\n                            let state = eBatchStoreStatus.Failure;\n                            if (!response.rejected) {\n                                state = eBatchStoreStatus.Success;\n                            }\n                            let res = {state: state, item: evt};\n                            try {\n                                cb && cb(res);\n                            } catch(e) {\n                                // eslint-disable-next-line no-empty\n                            }\n                            resolve(res);\n                        } catch(e) {\n                            reject(e);\n                        }\n                    });\n                });\n\n            }\n\n            _self.sendNextBatch = (cb?: OfflineBatchCallback, sync?: boolean, xhrOverride?: IXHROverride, cnt: number = 1) => {\n                return createPromise((resolve, reject) => {\n                    if (!_provider && !_unloadProvider) {\n                        reject(new Error(NoProviderErrMsg));\n                    }\n                    function storeResolve(result) {\n                        try {\n                            cb && cb(result);\n                        } catch (e) {\n                            // eslint-disable-next-line no-empty\n                        }\n                        \n                        resolve(result);\n                    }\n                    let provider = _provider;\n                    try {\n                        if (_unloadProvider) {\n                            doAwaitResponse(_unloadProvider.getNextBatch(), (res) => {\n                                if (res && !res.rejected) {\n                                    let unloadEvts = res.value;\n                                    if (unloadEvts && unloadEvts.length) {\n                                        // always try to send ones from local storage\n                                        provider = _unloadProvider;\n                                        return _handleNextBatch(unloadEvts);\n                                    }\n                                    \n    \n                                }\n                                return _sendNextBatch();\n                            });\n\n                        } else {\n                            return _sendNextBatch();\n                        }\n                       \n                    } catch(e) {\n                        // eslint-disable-next-line no-empty\n                        reject(e);\n                    }\n\n                    function _sendNextBatch() {\n                        return doAwaitResponse(provider.getNextBatch(), (response: AwaitResponse<IStorageTelemetryItem[]>) => {\n                            try {\n                                if(!response || response.rejected) {\n                                    let res = {state: eBatchSendStatus.Failure, data: response.reason};\n                                    storeResolve(res);\n                                    return;\n                                }\n                                let evts = response.value || [];\n                                return _handleNextBatch(evts);\n\n                            } catch(e) {\n                                reject(e);\n                            }\n                        });\n                        \n                    }\n\n                    function _handleNextBatch(evts: IStorageTelemetryItem[]) {\n                        let result = {state: eBatchSendStatus.Complete, data: null} as IOfflineBatchResponse;\n                        if (evts.length) {\n                            // make sure doawait has resolve\n                            return doAwaitResponse(provider.removeEvents(evts), (res) => {\n                                if(res && !res.rejected && res.value) {\n                                    let deletedItems = res.value;\n                                    for (let lp = 0; lp < deletedItems.length; lp++) {\n                                        try {\n                                            let evt = evts[lp];\n                                            result.data = evt; // add data\n                                            if (xhrOverride && xhrOverride.sendPOST) {\n                                                evt.attempCnt++;\n                                                let sender = xhrOverride.sendPOST; // use transports\n                                                let onCompleteCallback = (status: number, headers: {\n                                                    [headerName: string]: string;\n                                                }, res?: string) => {\n                                                 \n                                                    if (status == 200) { // status code (e.g: invalid key) drop payload\n                                                        result.state = eBatchSendStatus.Complete;\n                                                        \n                                                    } else {\n                                                        let isRetriable = _isRetriable(evt, status);\n                                                        if (isRetriable) {\n                                                            result.state = eBatchSendStatus.Retry;\n                                                            _unloadProvider && _unloadProvider.addEvent(evt.id, evt, _itemCtx);\n\n                                                        } else {\n                                                            result.state = eBatchSendStatus.Drop;\n                                                        }\n                                                    }\n                                                    storeResolve(result);\n                                                    \n                                                };\n                                                return doAwaitResponse(sender(evt, onCompleteCallback, sync) as any, (res) => {\n                                                    // do nothing, because it should be resolved in callback\n                                                });\n                                            }\n                                            // call resolve\n                                            result.state = eBatchSendStatus.Drop;\n                                            storeResolve(result);\n                                            return;\n                                            \n                                        } catch (e) {\n                                            reject(e);\n                                        }\n                                    }\n                                    // this case should never happen because this function is called after we confirm that evt is available\n                                    // add resolve here in case\n                                    result.state = eBatchSendStatus.Complete;\n                                    storeResolve(result);\n                                    return;\n\n                                }\n                                // if can not delete first, resolve\n                                result.state = eBatchSendStatus.Failure;\n                                result.data = res.reason;\n                                storeResolve(result);\n                                return;\n                            });\n                        }\n                        storeResolve(result);\n\n                    }\n                   \n                    \n                });\n            }\n\n            _self.hasStoredBatch = (cb?: (hasBatches: boolean) => void) => {\n                return createPromise((resolve, reject) => {\n                    if (!_provider) {\n                        reject(new Error(NoProviderErrMsg))\n                    }\n                    return doAwaitResponse(_provider.getNextBatch(), (response: AwaitResponse<IStorageTelemetryItem[]>) => {\n                        try {\n                            let evts = response.value || [];\n                            let hasEvts = evts.length > 0;\n                            cb && cb(hasEvts);\n                            resolve(hasEvts);\n                        } catch(e) {\n                            reject(e);\n                        }\n                    });\n\n                });\n            }\n\n            _self.cleanStorage = (cb?:(res: IOfflineBatchCleanResponse) => void) => {\n                \n                return createPromise((resolve, reject) => {\n                    // note: doawaitresponse currently returns undefined\n                    if (!_provider) {\n                        reject(new Error(NoProviderErrMsg))\n                    }\n                    return doAwaitResponse(_provider.clear(), (response: AwaitResponse<IStorageTelemetryItem[]>) => {\n                        try {\n                            let cnt = 0;\n                            if (!response.rejected) {\n                                let evts = response.value || [];\n                                cnt = evts.length;\n                            }\n                            let res = {batchCnt: cnt} as IOfflineBatchCleanResponse;\n                            cb && cb(res); // get value. make sure to use callback\n                            resolve(res); // won't get val\n\n                        } catch(e) {\n                            reject(e);\n                        }\n                    });\n                });\n                    \n                \n            }\n\n            _self.teardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _provider && _provider.teardown();\n                _initDefaults();\n            };\n\n            function _initDefaults() {\n                _provider = null;\n                _unloadProvider = null;\n                _isInitialized = false;\n                _maxRetryCnt = null;\n                _retryCodes = null;\n            }\n\n\n          \n\n            function _tryGetIndexedDbProvider(providerContext: ILocalStorageProviderContext): IOfflineProvider {\n                let newProvider = new IndexedDbProvider(undefined, unloadHookContainer);\n                if (!newProvider.initialize(providerContext)) {\n                    // Failed to initialize the provider\n                    newProvider = null;\n                }\n\n                return newProvider as any;\n              \n            }\n\n            function _tryGetWebStorageProvider(storageType: string, providerContext: ILocalStorageProviderContext): IOfflineProvider {\n                let newProvider = new WebStorageProvider(storageType, undefined, unloadHookContainer);\n                if (!newProvider.initialize(providerContext)) {\n                    // Failed to initialize the provider\n                    newProvider = null;\n                }\n\n                return newProvider as any;\n            }\n\n            function _tryGetCustomProvider(provider: IOfflineProvider, providerContext: ILocalStorageProviderContext, unload?: boolean): IOfflineProvider {\n                try {\n                    if (provider && provider.initialize(providerContext)) {\n                        return provider;\n                    }\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                \n                return null;\n            }\n\n            function _initProvider(providerContext: ILocalStorageProviderContext): IOfflineProvider {\n                let storageConfig = providerContext.storageConfig;\n                let providers = storageConfig.providers;\n                let newProvider: IOfflineProvider = null;\n                let lp: number = 0;\n\n                // If custom provider is provided, use the custom one instead\n                let cmProvider = _tryGetCustomProvider(storageConfig.customProvider, providerContext);\n                let cmUnloadProvider = _tryGetCustomProvider(storageConfig.customUnloadProvider, providerContext);\n                newProvider = cmProvider;\n                _unloadProvider = cmUnloadProvider;\n                while (!newProvider && lp < providers.length && lp < MaxStorageProviderConfig) {\n                    switch (providers[lp++]) {\n                    case eStorageProviders.LocalStorage:\n                        newProvider = _tryGetWebStorageProvider(\"localStorage\", providerContext);\n                        _unloadProvider = newProvider;\n                        break;\n                    case eStorageProviders.SessionStorage:\n                        newProvider = _tryGetWebStorageProvider(\"sessionStorage\", providerContext);\n                        _unloadProvider = newProvider;\n                        break;\n                    case eStorageProviders.IndexedDb:\n                        newProvider = _tryGetIndexedDbProvider(providerContext);\n                        _unloadProvider = _tryGetWebStorageProvider(\"localStorage\", providerContext);\n                    }\n                }\n                if (!_unloadProvider) {\n                    if (newProvider && newProvider.supportsSyncRequests && newProvider.supportsSyncRequests()) {\n                        _unloadProvider = newProvider;\n                    } else {\n                        _unloadProvider = _tryGetWebStorageProvider(\"localStorage\", providerContext);\n                    }\n                }\n\n                return newProvider;\n            }\n\n\n            function _getOfflineEvt(batch: IPayloadData) {\n                let item = batch as IStorageTelemetryItem;\n                // TODO: add details\n                let data = item.data;\n                if (data) {\n                    let isArr = isObject(data);\n                    item.isArr = isArr;\n                }\n                return item;\n            }\n\n            /**\n             * Checks if the SDK should resend the payload after receiving this status code from the backend.\n             * @param statusCode - */\n\n            function _isRetriable(item: IStorageTelemetryItem, statusCode: number): boolean {\n                if (!_shouldSend(item)) {\n                    return false;\n                }\n                // retryCodes = [] means should not retry\n                if (!isNullOrUndefined(_retryCodes)) {\n                    return _retryCodes.length && _retryCodes.indexOf(statusCode) > -1;\n                }\n\n                return statusCode === 401 // Unauthorized\n                    || statusCode === 403 // Forbidden\n                    || statusCode === 408 // Timeout\n                    || statusCode === 429 // Too many requests.\n                    || statusCode === 500 // Internal server error.\n                    || statusCode === 502 // Bad Gateway.\n                    || statusCode === 503 // Service unavailable.\n                    || statusCode === 504; // Gateway timeout.\n            }\n\n            function _shouldSend(item: IStorageTelemetryItem): boolean {\n                if (item && item.data) {\n                    item.attempCnt =  item.attempCnt || 0;\n                    return item.attempCnt <= _maxRetryCnt;\n                }\n                return false;\n            }\n\n        });\n    }\n\n    /**\n     * Initializes the provider using the config\n     * @returns True if the provider is initialized and available for use otherwise false\n     */\n    public initialize(providerContext: ILocalStorageProviderContext) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n  \n    public storeBatch(batch: IPayloadData, cb?: OfflineBatchStoreCallback, sync?: boolean): undefined | IOfflineBatchStoreResponse | IPromise<IOfflineBatchStoreResponse> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public sendNextBatch(cb?: OfflineBatchCallback, sync?: boolean, xhrOverride?: IXHROverride, cnt?: number): undefined | IOfflineBatchResponse | IPromise<IOfflineBatchResponse> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n\n    }\n    public hasStoredBatch(callback?: (hasBatches: boolean) => void): undefined | boolean | IPromise<boolean> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n    \n    public cleanStorage(cb?:(res: IOfflineBatchCleanResponse) => void ): undefined | IOfflineBatchCleanResponse | IPromise<IOfflineBatchCleanResponse> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public teardown (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/OfflineChannel.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, BreezeChannelIdentifier, EventPersistence, EventsDiscardedReason, IAppInsightsCore, IChannelControls, IConfig,\n    IConfigDefaults, IConfiguration, IDiagnosticLogger, IInternalOfflineSupport, INotificationListener, INotificationManager,\n    IOfflineListener, IPayloadData, IPlugin, IProcessTelemetryContext, IProcessTelemetryUnloadContext, ITelemetryItem, ITelemetryPluginChain,\n    ITelemetryUnloadState, IXHROverride, SendRequestReason, _eInternalMessageId, _throwInternal, arrForEach, createOfflineListener,\n    createProcessTelemetryContext, createUniqueNamespace, dateNow, eBatchDiscardedReason, eLoggingSeverity, mergeEvtNamespace,\n    onConfigChange, runTargetUnload\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, ITaskScheduler, createAsyncPromise, createTaskScheduler } from \"@nevware21/ts-async\";\nimport {\n    ITimerHandler, arrSlice, isFunction, isString, mathFloor, mathMax, mathMin, objDeepFreeze, objForEachKey, scheduleTimeout\n} from \"@nevware21/ts-utils\";\nimport {\n    EVT_DISCARD_STR, EVT_SENT_STR, EVT_STORE_STR, batchDropNotification, callNotification, isGreaterThanZero, isValidPersistenceLevel\n} from \"./Helpers/Utils\";\nimport { InMemoryBatch } from \"./InMemoryBatch\";\nimport { IPostTransmissionTelemetryItem } from \"./Interfaces/IInMemoryBatch\";\nimport {\n    IOfflineBatchHandler, OfflineBatchCallback, OfflineBatchStoreCallback, eBatchSendStatus, eBatchStoreStatus\n} from \"./Interfaces/IOfflineBatch\";\nimport {\n    ILocalStorageProviderContext, IOfflineChannelConfiguration, IOfflineSenderConfig, IStorageTelemetryItem, eStorageProviders\n} from \"./Interfaces/IOfflineProvider\";\nimport { OfflineBatchHandler } from \"./OfflineBatchHandler\";\nimport { Sender } from \"./Sender\";\n\nconst version = \"#version#\";\nconst DefaultOfflineIdentifier = \"OfflineChannel\";\nconst DefaultBatchInterval = 15000;\nconst DefaultInMemoMaxTime = 15000;\nconst PostChannelIdentifier = \"PostChannel\";\nconst PersistenceKeys = [EventPersistence.Critical, EventPersistence.Normal];\n\n\ninterface IUrlLocalStorageConfig {\n    iKey?: string;\n    url: string;\n    coreRootCtx: IProcessTelemetryContext;\n    providerContext: ILocalStorageProviderContext;\n    batchHandler: IOfflineBatchHandler; // simply use the current one, do not need to re-init\n    minPersistenceCacheLevel: number;\n    preListener?: INotificationListener;\n}\n\nlet undefValue = undefined;\n\nconst DefaultBatchSizeLimitBytes = 63000; // approx 64kb (the current Edge, Firefox and Chrome max limit)\n\nconst defaultOfflineChannelConfig: IConfigDefaults<IOfflineChannelConfiguration> = objDeepFreeze({\n    maxStorageSizeInBytes: { isVal: isGreaterThanZero, v: 5000000 },\n    storageKey: undefValue,\n    minPersistenceLevel: { isVal: isValidPersistenceLevel, v: EventPersistence.Normal },\n    providers: [eStorageProviders.LocalStorage, eStorageProviders.IndexedDb],\n    indexedDbName: undefValue,\n    maxStorageItems: { isVal: isGreaterThanZero, v: undefValue},\n    inMemoMaxTime: { isVal: isGreaterThanZero, v: DefaultInMemoMaxTime},\n    maxRetry: {isVal: isGreaterThanZero, v: 1}, // 0 means no retry\n    maxBatchsize:{ isVal: isGreaterThanZero, v: DefaultBatchSizeLimitBytes},\n    maxSentBatchInterval: { isVal: isGreaterThanZero, v: DefaultBatchInterval},\n    primaryOnlineChannelId: [BreezeChannelIdentifier, PostChannelIdentifier],\n    overrideInstrumentationKey: undefValue,\n    senderCfg: {} as IOfflineSenderConfig,\n    splitEvts: false\n});\n\n//TODO: add tests for sharedAnanlytics\n\n\nexport class OfflineChannel extends BaseTelemetryPlugin implements IChannelControls {\n    public identifier = DefaultOfflineIdentifier;\n    public priority = 1000; // before channel (post = 1011 and sender = 1001, teechannel = 999, localstorage:  1009)\n    public version = version;\n    public id: string;\n\n    constructor() {\n        super();\n        dynamicProto(OfflineChannel, this, (_self, _base) => {\n            // Internal properties used for tracking the current state, these are \"true\" internal/private properties for this instance\n            let _hasInitialized;\n            let _paused;\n            let _sender: Sender;\n            let _urlCfg: IUrlLocalStorageConfig;\n            let _offlineListener: IOfflineListener;\n            let _inMemoFlushTimer: ITimerHandler;\n            let _inMemoTimerOut: number;\n            let _diagLogger:IDiagnosticLogger;\n            let _endpoint: string;\n            let _maxBatchSize: number;\n            let _sendNextBatchTimer: ITimerHandler;\n            let _convertUndefined: any;\n            let _retryAt: number;\n            let _maxBatchInterval: number;\n            let _consecutiveErrors: number;\n            let _senderInst: IXHROverride;\n            let _taskScheduler: ITaskScheduler;\n            let _offineSupport: IInternalOfflineSupport;\n            let _primaryChannelId: string;\n            let _overrideIkey: string;\n            let _evtsLimitInMemo: number;\n            let _notificationManager: INotificationManager | undefined;\n            let _isLazyInit: boolean;\n            let _dependencyPlugin: IChannelControls;\n            let _splitEvts: Boolean;\n            let _inMemoMap:  { [priority: EventPersistence]: InMemoryBatch };\n\n\n            _initDefaults();\n\n            _self.initialize = (coreConfig: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) => {\n             \n                if (!_hasInitialized) {\n\n                    _base.initialize(coreConfig, core, extensions);\n\n                    // keep setting hasInitialized status here to avoid re-initialize\n                    _hasInitialized = true;\n\n                    _diagLogger = _self.diagLog();\n                    let evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"OfflineSender\"), core.evtNamespace && core.evtNamespace());\n                    _offlineListener = createOfflineListener(evtNamespace); // TODO: add config to be passed\n                    _taskScheduler = createTaskScheduler(createAsyncPromise, \"offline channel\");\n                    _notificationManager = core.getNotifyMgr();\n                }\n                // TODO: add refresh inside timer until dependency plugin is initialized\n                scheduleTimeout(() => {\n                    try {\n                        let _dependencyPlugin = _getDependencyPlugin(coreConfig, core);\n                        // make sure that online sender is initialized\n                        if (!_isLazyInit  && _dependencyPlugin && _dependencyPlugin.isInitialized()) {\n                            _isLazyInit = true;\n                            _createUrlConfig(coreConfig, core, extensions, pluginChain);\n                            let ctx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain);\n                            _sender.initialize(coreConfig, core, ctx, _diagLogger, _primaryChannelId, _self._unloadHooks);\n                            _senderInst = _sender.getXhrInst();\n                            _offlineListener.addListener((val)=> {\n                                if (!val.isOnline) {\n                                    _sendNextBatchTimer && _sendNextBatchTimer.cancel();\n                                } else {\n                                    _setSendNextTimer();\n                                }\n        \n                            });\n                        \n                            // need it for first time to confirm if there are any events\n                            _setSendNextTimer();\n    \n                        }\n                    }  catch (e) {\n                        // eslint-disable-next-line no-empty\n\n                    }\n                        \n                }, 0);\n\n            };\n\n            _self.processTelemetry = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                try {\n                    let onlineStatus = _offlineListener.isOnline();\n                    itemCtx =  itemCtx || _self._getTelCtx(itemCtx);\n\n\n                    if (!!onlineStatus || !_offineSupport || !_endpoint) {\n                        // if we can't get url from online sender or core config, process next\n                        _self.processNext(evt, itemCtx);\n                        return;\n                    }\n\n                    if (_hasInitialized && !_paused ) {\n                        let shouldProcess = true;\n                        if (isFunction(_offineSupport.shouldProcess)) {\n                            shouldProcess = _offineSupport.shouldProcess(evt);\n                        }\n                        if (!shouldProcess) {\n                            _self.processNext(evt, itemCtx);\n                            return;\n                        }\n\n                        let item = evt as IPostTransmissionTelemetryItem;\n                      \n                        //TODO: add function to better get level\n                        item.persistence = item.persistence  || (item.baseData && item.baseData.persistence) || EventPersistence.Normal; // in case the level is in baseData\n                        if (_shouldCacheEvent(_urlCfg, item) && _inMemoMap) {\n                            if (_overrideIkey) {\n                                item.iKey = _overrideIkey;\n                            }\n                            let added = _addEvtToMap(item);\n                            // inMemo is full\n                            if (!added) {\n                                _flushInMemoItems(false, item.persistence);\n                                let retry = _addEvtToMap(item);\n                                if (!retry) {\n                                    _evtDropNotification([evt], EventsDiscardedReason.QueueFull);\n                                    _throwInternal(_diagLogger,\n                                        eLoggingSeverity.WARNING,\n                                        _eInternalMessageId.InMemoryStorageBufferFull,\n                                        \"Maximum offline in-memory buffer size reached\",\n                                        true);\n                                }\n                                \n                            }\n                            // start timer when the first should-cache event added\n                            _setupInMemoTimer();\n                            \n                        } else {\n                            // if should not cache,send event drop notification\n                            _evtDropNotification([item], EventsDiscardedReason.InvalidEvent);\n                        }\n                       \n                       \n                        return;\n                    }\n        \n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                \n                }\n        \n                // hand off the telemetry item to the next plugin\n                _self.processNext(evt, itemCtx);\n                \n            };\n\n            _self.pause = () => {\n                _paused = true;\n                _clearScheduledTimer();\n                _consecutiveErrors = 0;\n                _retryAt = null;\n               \n            };\n\n            _self.resume = () => {\n                _paused = false;\n                _clearScheduledTimer();\n                _setupInMemoTimer();\n                _setSendNextTimer();\n            };\n\n            \n            _self.onunloadFlush = () => {\n                if (!_paused) {\n                    while (_hasEvts()) {\n                        _flushInMemoItems(true);\n                    }\n                    // TODO: unloadprovider might send events out of order\n                }\n            };\n\n            _self.flush = (sync: boolean, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean> => {\n                // TODO: should we implement normal flush\n                return _self.onunloadFlush();\n            };\n\n            _self.getOfflineListener = () => {\n                return _offlineListener;\n\n            };\n\n            _self.sendNextBatch = () => {\n                // TODO: add callback function\n                return _offineSupport && _setSendNextTimer();\n            };\n\n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _self.onunloadFlush();\n                _offlineListener && runTargetUnload(_offlineListener, false);\n                let handler = _urlCfg && _urlCfg.batchHandler;\n                handler && handler.teardown();\n                _clearScheduledTimer();\n                _initDefaults();\n            };\n\n\n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [_urlCfg, _inMemoMap, _senderInst, _inMemoFlushTimer, _sendNextBatchTimer];\n            };\n            \n\n            function _initDefaults() {\n                _hasInitialized = false;\n                _paused = false;\n                _sender = new Sender();\n                _urlCfg = null;\n                _offlineListener = null;\n                _diagLogger = null;\n                _endpoint = null;\n                _convertUndefined = undefValue;\n                _maxBatchSize = null;\n                _sendNextBatchTimer = null;\n                _consecutiveErrors = null;\n                _retryAt = null;\n                _maxBatchInterval = null;\n                _senderInst = null;\n                _offineSupport = null;\n                _primaryChannelId = null;\n                _overrideIkey = null;\n                _evtsLimitInMemo = null;\n                _isLazyInit = false;\n                _dependencyPlugin = null;\n                _splitEvts= false;\n                _inMemoMap = null;\n            }\n\n\n            function _shouldCacheEvent(urlConfig: IUrlLocalStorageConfig, item: IPostTransmissionTelemetryItem) {\n                if ((item.persistence) < urlConfig.minPersistenceCacheLevel) {\n                    return false;\n                }\n\n                return true;\n            }\n\n\n            function _setupInMemoTimer() {\n                if (!_inMemoFlushTimer) {\n                    _inMemoFlushTimer = scheduleTimeout(() => {\n                        _flushInMemoItems();\n                        let hasEvts = _hasEvts();\n                        if (hasEvts && _inMemoFlushTimer) {\n                            _inMemoFlushTimer.refresh();\n                        }\n                        _setSendNextTimer();\n\n                    }, _inMemoTimerOut);\n                    _inMemoFlushTimer.unref();\n                } else {\n                    // Restart the timer if not already running https://nevware21.github.io/ts-utils/typedoc/interfaces/ITimerHandler.html#enabled\n                    _inMemoFlushTimer.enabled = true;\n                }\n            }\n\n            //flush only flush max batch size event, may still have events lefts\n            function _flushInMemoItems(unload?: boolean, mapKey?: number | EventPersistence) {\n                try {\n                    // TODO: add while loop to flush everything\n                    let hasEvts = false;\n                    // can use objForEachKey(_inMemoMap, (key)), but keys returned by this function is always string\n                    arrForEach(PersistenceKeys, (key) => {\n                        let inMemoBatch: InMemoryBatch = _inMemoMap[key];\n                        let inMemo = inMemoBatch;\n                        let evts = inMemo && inMemo.getItems();\n                        if (!evts || !evts.length) {\n                            return;\n                        }\n                        if (_splitEvts && mapKey && mapKey !== key) {\n                            // if split evts is set to true\n                            // specific mapkey is defined\n                            // for key !== mapkey, only check if there are any events left in order to refresh timer\n                            hasEvts = hasEvts || !!evts.length;\n                            return;\n                        }\n                        let payloadArr:string[] = [];\n                        let size = 0;\n                        let idx = -1;\n                        let criticalCnt = 0;\n                        arrForEach(evts, (evt, index) => {\n                            let curEvt = evt as IPostTransmissionTelemetryItem\n                            idx = index;\n                            let payload = _getPayload(curEvt);\n                            size += payload.length;\n                            if (size > _maxBatchSize) {\n                                return;\n                            }\n                            if(curEvt.persistence == EventPersistence.Critical) {\n                                criticalCnt ++;\n                            }\n                            idx = index;\n                            payloadArr.push(payload);\n    \n                        });\n                        if (!payloadArr.length) {\n                            return;\n                        }\n                        \n                        let sentItems = evts.slice(0, idx + 1);\n                        if (idx + 1 < evts.length) {\n                            // keep track if there is any remaining events\n                            hasEvts = true;\n                        }\n                        _inMemoMap[key] = inMemoBatch.createNew(_endpoint, arrSlice(inMemo.getItems(),idx + 1), _evtsLimitInMemo);\n    \n                        let payloadData: IStorageTelemetryItem = null;\n                        if (_offineSupport && _offineSupport.createOneDSPayload) {\n                            payloadData = _offineSupport.createOneDSPayload(sentItems);\n                            if (payloadData) {\n                                payloadData.criticalCnt = criticalCnt;\n                            }\n                            \n                        } else {\n                            payloadData = _constructPayloadData(payloadArr, criticalCnt);\n                        }\n\n                        let callback: OfflineBatchStoreCallback = (res) => {\n                            if (!res || !res.state) {\n                                return null;\n                            }\n                            let state = res.state;\n    \n                            if (state == eBatchStoreStatus.Failure) {\n                                if (!unload) {\n                                    // for unload, just try to add each batch once\n                                    arrForEach(sentItems, (item) => {\n                                        _addEvtToMap(item);\n                                    });\n                                    _setupInMemoTimer();\n    \n                                } else {\n                                    // unload, drop events\n                                    _evtDropNotification(sentItems, EventsDiscardedReason.NonRetryableStatus);\n                                }\n                              \n                            } else {\n                                // if eBatchStoreStatus is success\n                                _storeNotification(sentItems);\n                            }\n                        };\n\n                        if (payloadData && _urlCfg && _urlCfg.batchHandler) {\n                            let promise = _urlCfg.batchHandler.storeBatch(payloadData, callback, unload);\n                            _queueStorageEvent(\"storeBatch\", promise);\n                        }\n\n                    });\n                    // this is outside loop\n                    if (!hasEvts) {\n                        _inMemoFlushTimer && _inMemoFlushTimer.cancel();\n                    }\n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n\n                }\n                return null;\n\n            }\n\n            function _setSendNextTimer() {\n                const isOnline = _offlineListener && _offlineListener.isOnline();\n           \n                if(!_sendNextBatchTimer) {\n                    let retryInterval = _retryAt ? mathMax(0, _retryAt - dateNow()) : 0;\n                    let timerValue = mathMax(_maxBatchInterval, retryInterval);\n                    _sendNextBatchTimer = scheduleTimeout(() => {\n                        if (_offlineListener && _offlineListener.isOnline()) {\n                            // is no isCompletelyIdle function is available, assume we can send\n                            if(isFunction(_sender.isCompletelyIdle) && !_sender.isCompletelyIdle()) {\n                                _sendNextBatchTimer && _sendNextBatchTimer.refresh();\n\n                            } else {\n                                let callback:  OfflineBatchCallback = (res) => {\n                                    let state = res && res.state;\n                                    if (state !== eBatchSendStatus.Complete) {\n                                        _consecutiveErrors ++;\n                                    }\n                                    let data = res && res.data;\n                                    if (state === eBatchSendStatus.Complete && data) {\n                                        // if status is complete and data is null, means no data\n                                        _sentNotification(data as IPayloadData);\n                                        _sendNextBatchTimer && _sendNextBatchTimer.refresh();\n                                    }\n\n                                    if (state === eBatchSendStatus.Drop) {\n                                        batchDropNotification(_notificationManager, 1, eBatchDiscardedReason.NonRetryableStatus);\n                                    }\n                                   \n                                }\n                                if (_urlCfg && _urlCfg.batchHandler) {\n                                    let promise = _urlCfg.batchHandler.sendNextBatch(callback, false, _senderInst);\n                                    _queueStorageEvent(\"sendNextBatch\", promise);\n                                }\n                               \n                            }\n                           \n                        } else {\n                            _sendNextBatchTimer && _sendNextBatchTimer.cancel();\n                        }\n                        // if offline, do nothing;\n\n                    },timerValue);\n\n                    _sendNextBatchTimer.unref();\n\n                } else {\n                    // only restart it when online\n                    if (isOnline) {\n                        _sendNextBatchTimer.enabled = true;\n                        _sendNextBatchTimer.refresh();\n                    }\n                    // if offline, do noting\n                    \n                }\n            }\n\n            function _clearScheduledTimer() {\n                _inMemoFlushTimer && _inMemoFlushTimer.cancel();\n                _sendNextBatchTimer && _sendNextBatchTimer.cancel();\n                _inMemoFlushTimer = null;\n                _sendNextBatchTimer = null;\n            }\n\n            function _queueStorageEvent<T>(taskName: string, task: T | IPromise<T>) {\n                if (_taskScheduler) {\n                    _taskScheduler.queue(() => {\n                        return task;\n                    }, taskName).catch((reason) => {\n                        // Just handling any rejection to avoid an unhandled rejection event\n                    });\n                }\n                \n            }\n\n            function _setRetryTime(linearFactor: number = 1) {\n                const SlotDelayInSeconds = 10;\n                let delayInSeconds: number;\n        \n                if (_consecutiveErrors <= 1) {\n                    delayInSeconds = SlotDelayInSeconds;\n                } else {\n                    const backOffSlot = (Math.pow(2, _consecutiveErrors) - 1) / 2;\n                    // tslint:disable-next-line:insecure-random\n                    let backOffDelay = mathFloor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\n                    backOffDelay = linearFactor * backOffDelay;\n                    delayInSeconds = mathMax(mathMin(backOffDelay, 3600), SlotDelayInSeconds);\n                }\n        \n                // TODO: Log the backoff time like the C# version does.\n                let retryAfterTimeSpan = dateNow() + (delayInSeconds * 1000);\n        \n                // TODO: Log the retry at time like the C# version does.\n                _retryAt = retryAfterTimeSpan;\n            }\n\n            function _getCoreItemCtx(coreConfig: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) {\n                if (coreConfig) {\n                    // Make sure the extensionConfig exists\n                    coreConfig.extensionConfig = coreConfig.extensionConfig || {};\n                }\n\n                if (!pluginChain && core) {\n                    // Get the first plugin from the core\n                    pluginChain = core.getProcessTelContext().getNext();\n                }\n\n                let nextPlugin: IPlugin = null;\n                let rootNext = _self._getTelCtx().getNext();\n                if (rootNext) {\n                    nextPlugin = rootNext.getPlugin();\n                }\n\n                return createProcessTelemetryContext(pluginChain, coreConfig, core, nextPlugin);\n            }\n\n\n            function _getPayload(evt: IPostTransmissionTelemetryItem | ITelemetryItem) {\n                try {\n\n                    if (evt) {\n                        return _offineSupport && _offineSupport.serialize(evt, _convertUndefined);\n                    }\n                    \n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return null;\n                \n            }\n\n            function _constructPayloadData(payloadArr: string[], criticalCnt?: number) {\n\n                try {\n                    if (!_offineSupport) {\n                        return null;\n                    }\n                    let cnt = criticalCnt || 0;\n                    let payload = _offineSupport.batch(payloadArr);\n                    let payloadData = _offineSupport.createPayload && _offineSupport.createPayload(payload) as IStorageTelemetryItem;\n                    if (payloadData) {\n                        payloadData.criticalCnt = cnt;\n                        return payloadData;\n                    }\n                   \n\n                } catch(e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return null;\n            }\n\n            function _createUrlConfig(coreConfig: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) {\n\n                _self._addHook(onConfigChange(coreConfig, (details) => {\n                    if (!isString(coreConfig.instrumentationKey) || !isString(coreConfig.endpointUrl)) {\n                        // if ikey or endpointUrl is promise, delay initialization\n                        _self.pause();\n                        return;\n                    }\n                    if (_paused) {\n                        _self.resume();\n                    }\n                    let storageConfig: IOfflineChannelConfiguration = null;\n                    let theConfig = details.cfg;\n\n                    let ctx = createProcessTelemetryContext(null, theConfig, core);\n                    storageConfig = ctx.getExtCfg<IOfflineChannelConfiguration>(_self.identifier, defaultOfflineChannelConfig);\n                    // let channelIds = storageConfig.primaryOnlineChannelId;\n                    let onlineUrl = null;\n                    let channel = _getDependencyPlugin(coreConfig, core);\n                    if (!!channel.isInitialized() && isFunction(channel.getOfflineSupport)) {\n                        _offineSupport = channel.getOfflineSupport();\n                        onlineUrl = isFunction(_offineSupport && _offineSupport.getUrl) && _offineSupport.getUrl();\n                    } else {\n                        return;\n                    }\n                    \n                    _overrideIkey = storageConfig.overrideInstrumentationKey;\n\n                    let urlConfig: IUrlLocalStorageConfig = _urlCfg;\n                    let curUrl = onlineUrl || coreConfig.endpointUrl || _endpoint;\n                    // NOTE: should add default endpoint value to core as well\n\n                    if (curUrl !== _endpoint) {\n                       \n                        let coreRootCtx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain);\n                        let providerContext: ILocalStorageProviderContext = {\n                            itemCtx: coreRootCtx,\n                            storageConfig: storageConfig,\n                            id: _self.id,\n                            endpoint: curUrl,\n                            notificationMgr: _notificationManager\n                        };\n                        let oriHandler = _urlCfg && _urlCfg.batchHandler;\n\n                        try {\n                            oriHandler && oriHandler.teardown();\n                        } catch(e) {\n                            // eslint-disable-next-line no-empty\n\n                        }\n\n                        let handler = new OfflineBatchHandler(_self.diagLog(), _self._unloadHooks);\n                   \n                        handler.initialize(providerContext);\n                        urlConfig = {\n                            iKey: coreConfig.instrumentationKey as string,\n                            url: curUrl,\n                            minPersistenceCacheLevel: storageConfig.minPersistenceLevel,\n                            coreRootCtx: coreRootCtx,\n                            providerContext: providerContext,\n                            batchHandler: handler\n                        };\n                        _evtsLimitInMemo = storageConfig.eventsLimitInMem;\n                        _inMemoMap = _inMemoMap  || {};\n                        let newMap = {};\n                        // transfer previous events to new buffer\n                        arrForEach(PersistenceKeys, (key) => {\n                            // when init map, we will initize a in memo batch for each EventPersistence key\n                            // evts to be transferred to new inMemo map\n                            let evts = null;\n                            \n                            if ( _inMemoMap && _inMemoMap[key]) {\n                                let inMemoBatch = _inMemoMap[key];\n                                let curEvts = inMemoBatch && inMemoBatch.getItems();\n                                if (curEvts && curEvts.length) {\n                                    evts = arrSlice(curEvts);\n                                    inMemoBatch && inMemoBatch.clear();\n                                }\n                            }\n                            newMap[key] = new InMemoryBatch(_self.diagLog(), curUrl, evts, _evtsLimitInMemo);\n\n\n                        });\n                        _inMemoMap = newMap;\n                        _inMemoTimerOut = storageConfig.inMemoMaxTime;\n                        let onlineConfig = ctx.getExtCfg<any>(_primaryChannelId, {}) || {};\n                        _convertUndefined = onlineConfig.convertUndefined;\n                        _endpoint = curUrl;\n                        _setRetryTime();\n                        _maxBatchInterval = storageConfig.maxSentBatchInterval;\n                        _maxBatchSize = storageConfig.maxBatchsize;\n                        _splitEvts = storageConfig.splitEvts;\n                    }\n                    _urlCfg = urlConfig;\n                    _endpoint = curUrl;\n                    \n                }));\n            }\n\n            function _getDependencyPlugin(coreConfig: IConfiguration & IConfig, core: IAppInsightsCore) {\n                if (!_dependencyPlugin) {\n                    let ctx = createProcessTelemetryContext(null, coreConfig, core);\n                    let storageConfig = ctx.getExtCfg<IOfflineChannelConfiguration>(_self.identifier, defaultOfflineChannelConfig);\n                    let channelIds = storageConfig.primaryOnlineChannelId;\n                    if (channelIds && channelIds.length) {\n                        arrForEach(channelIds, (id) => {\n                            let plugin = core.getPlugin<IChannelControls>(id);\n                            let channel = plugin && plugin.plugin;\n                            if (channel) {\n                                _dependencyPlugin = channel;\n                                return;\n                            }\n                                \n                            \n                        });\n                    }\n                }\n               \n                return _dependencyPlugin;\n            }\n\n            function _hasEvts() {\n                let hasEvts = false;\n                objForEachKey(_inMemoMap, (key) => {\n                    let inMemoBatch = _inMemoMap[key];\n                    if (inMemoBatch && inMemoBatch.count()) {\n                        hasEvts = true;\n                        return -1;\n                    }\n                });\n                return hasEvts;\n\n            }\n\n            function _addEvtToMap(item:IPostTransmissionTelemetryItem) {\n                // if split evts is false, all events will be saved into EventPersistence.Normal batch\n                let mapKey = EventPersistence.Normal;\n                if (_splitEvts && item.persistence) {\n                    mapKey = item.persistence;\n                }\n                let inMemoBatch = _inMemoMap[mapKey];\n                return inMemoBatch.addEvent(item);\n            }\n\n            \n            function _callNotification(evtName: string, theArgs: any[]) {\n                callNotification(_notificationManager, evtName, theArgs);\n            }\n\n            function _evtDropNotification(events: ITelemetryItem[] | IPostTransmissionTelemetryItem[], reason: number | EventsDiscardedReason ) {\n                if (events && events.length) {\n                    _callNotification(EVT_DISCARD_STR, [events, reason]);\n\n                }\n                return;\n            }\n\n            function _sentNotification(batch: IPayloadData) {\n                if (batch && batch.data) {\n                    _callNotification(EVT_SENT_STR, [batch]);\n                }\n                return;\n            }\n\n            function _storeNotification(events: ITelemetryItem[] | IPostTransmissionTelemetryItem[]) {\n                if (events && events.length) {\n                    _callNotification(EVT_STORE_STR, [events]);\n                }\n                return;\n            }\n\n        });\n    }\n\n    /* ================================================================================================================\n     * DO NOT add any code to these empty implementations as any code defined here will be removed, as\n     * this class is using @dynamicProto which will implement the methods during the execution of the\n     * dynamicProto() in the constructor.\n     *\n     * The final generated files will also have these implementations removed as part of the packaging process.\n     *\n     * These empty definitions exists only to keep the generated TypeScript definition files aligned with the\n     * actual resulting implementation, this is so that TS is still happy to create extension classes from the\n     * resulting definitions.\n     *\n     * This also keeps the generated *.d.ts files and documentation the same as they where prior to using dynamicProto()\n     */\n\n    /**\n     * The function does the initial set up. It adds a notification listener to determine which events to remove.\n     * @param coreConfig - The core configuration.\n     * @param core       - The AppInsights core.\n     * @param extensions - An array of all the plugins being used.\n     */\n    public initialize(coreConfig: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Process an event to add it to the local storage and then pass it to the next plugin.\n     * @param event - The event that needs to be stored.\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    public processTelemetry(evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    // ================================================================================================================\n\n    /**\n     * Pauses the adding of new events to the plugin. Also calls pause on the next\n     * plugin.\n     */\n    public pause(): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resumes the adding of new events to the plugin. Also calls resume on\n     * the next plugin. Adds all events in storage to the next plugin.\n     */\n    public resume(): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get offline listener\n     * @returns offline listener\n     */\n    public getOfflineListener() {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     *No op\n     */\n    public flush(sync: boolean, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Flush the batched events synchronously (if possible -- based on configuration).\n     * Will not flush if the Send has been paused.\n     */\n    public onunloadFlush() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Flush the next stored event batch\n     */\n    public sendNextBatch() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/PayloadHelper.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\"\nimport {\n    IDiagnosticLogger, _eInternalMessageId, _throwInternal, eLoggingSeverity, isFunction\n} from \"@microsoft/applicationinsights-core-js\";\nimport { base64Decode, base64Encode } from \"./Helpers/Utils\";\nimport { IStorageTelemetryItem } from \"./Interfaces/IOfflineProvider\";\n\nexport class PayloadHelper {\n\n    constructor(logger: IDiagnosticLogger) {\n        dynamicProto(PayloadHelper, this, (_self) => {\n            /**\n             * Deserializes the current stringto a JSON object.\n             */\n            _self.base64ToArr = (input: IStorageTelemetryItem): IStorageTelemetryItem => {\n                if (!input || !input.isArr) {\n                    return input;\n                }\n             \n                try {\n                    let data = input.data;\n                    if (data) {\n                        input.data = base64Decode(data as any);\n                    }\n                    return input;\n                } catch (e) {\n                    // if serialization fails return an empty string\n                    _throwInternal(logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.CannotSerializeObject, (e && isFunction(e.toString)) ? e.toString() : \"Error serializing object\", null, true);\n                }\n                return null;\n                \n            }\n\n            _self.base64ToStr = (item: IStorageTelemetryItem): IStorageTelemetryItem => {\n                if (!item || !item.isArr) {\n                    return item;\n                }\n                \n                try {\n                    let data = item.data;\n                    if (data) {\n                        item.data = base64Encode(data as any);\n                    }\n                    return item;\n                } catch (e) {\n                    // if serialization fails return an empty string\n                    _throwInternal(logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.CannotSerializeObject, (e && isFunction(e.toString)) ? e.toString() : \"Error serializing object\", null, true);\n                }\n                return null;\n               \n            }\n            \n        });\n    }\n\n    /**\n     *  Decode the JSON string back to Uint8 array.\n     */\n    public base64ToArr(input: IStorageTelemetryItem): IStorageTelemetryItem {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Code the Uint8 array object to string.\n     */\n    public base64ToStr(item: IStorageTelemetryItem): IStorageTelemetryItem {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/Providers/IndexDbHelper.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { IDiagnosticLogger, getGlobalInst } from \"@microsoft/applicationinsights-core-js\";\nimport {\n    IPromise, StartQueuedTaskFn, createAsyncPromise, createAsyncRejectedPromise, createAsyncResolvedPromise, createTaskScheduler, doAwait,\n    doAwaitResponse\n} from \"@nevware21/ts-async\";\nimport { getGlobal, isFunction, isPromiseLike, isString } from \"@nevware21/ts-utils\";\nimport {\n    CursorProcessResult, IDbContext, IIndexedDbDetails, IIndexedDbOpenDbContext, IIndexedDbSimpleQuery, IIndexedDbStoreActionContext,\n    IProcessCursorState\n} from \"../Interfaces/IOfflineIndexDb\";\n\n//TODO: move all const to one file\n//TODO: handle db names\nconst IndexedDBNames: string[] = [\"indexedDB\"/*, 'mozIndexedDB', 'webkitIndexedDB', 'msIndexedDb'*/];\nconst DbReadWrite = \"readwrite\";\nconst Result = \"result\";\nconst ErrorMessageUnableToOpenDb = \"DBError: Unable to open database\";\nconst ErrorMessageDbUpgradeRequired = \"DBError: Database upgrade required\";\nconst ErrorMessageDbNotOpen = \"Database is not open\";\nconst ErrorMessageDbDoesNotExist = \"DBError: Database does not exist\";\nconst ErrorMessageFailedToDeleteDatabase = \"DBError: Failed to delete the database\";\nconst ErrorMessageDbNotSupported = \"DBError: Feature not supported\";\nconst ErrorMessageFailedToOpenCursor = \"DBError: Failed to Open Cursor\";\n\n//window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;\n//window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;\n\n// By placing this variable here it becomes a global hidden static\n\n/**\n * This is used to enforce sequential access to the IndexedDb, so that all operations don't interfere\n * with each other, this is REALLY useful to ensure that any previous operation has completed before\n * subsequent operations are completed -- especially for testing using different IndexedDbHelper instances.\n */\nlet _dbContext: IDbContext[] = [];\n/**\n * Constructs the IDbContext instance\n * @param dbName - The current database name\n\n * @param diagLog - The diagnostics logger to use\n */\nfunction _getDbContext(dbName: string, diagLog?: IDiagnosticLogger): IDbContext {\n    let dbCtx: IDbContext = null;\n    for (let lp = 0; lp < _dbContext.length; lp++) {\n        dbCtx = _dbContext[lp];\n        if (dbCtx.name === dbName) {\n            return dbCtx;\n        }\n    }\n\n    // Create the global handle for the database\n    dbCtx = {\n        name: dbName,\n        sch: createTaskScheduler(createAsyncPromise, \"IndexedDbHelper[\" + dbName + \"]\"),\n        dbHdl: [],\n        add: (db: IDBDatabase) => {\n            dbCtx.dbHdl.push(db);\n            _debugLog(dbName, \"- dbOpened (add) -- hdls [\" + dbCtx.dbHdl.length + \"]\");\n        },\n        remove: (db: IDBDatabase) => {\n            let hdls = dbCtx.dbHdl;\n            for (let lp = 0; lp < hdls.length; lp++) {\n                if (hdls[lp] === db) {\n                    hdls.splice(lp, 1);\n                    break;\n                }\n            }\n\n            _debugLog(dbName, \"- dbClosed (remove) -- hdls [\" + dbCtx.dbHdl.length + \"]\");\n        },\n        isOpen: (): boolean => {\n            return dbCtx.dbHdl.length > 0;\n        },\n        openHdl: (): IDBDatabase => {\n            if (dbCtx.dbHdl.length > 0) {\n                return dbCtx.dbHdl[0];\n            }\n            return null;\n        }\n    };\n    _dbContext.push(dbCtx);\n\n    return dbCtx;\n}\n\n/**\n * Schedule an event that will execute the startEvent after all outstanding events are resolved or if any event rejects the optional\n * rejectEvent will be executed. This is used to ensure that we don't attempt to execute events out of order such as attempting to removed\n * an event from the indexedDb before the insertion of the event has completed. Only one of the startEvent or unableToStateEvent callbacks\n * functions will be called.\n * @param startEvent - The event to execute after all outstanding events are complete, may be called synchronously or asynchronously.\n * @param actionName - The name of the action being performed\n */\nfunction _scheduleEvent<T>(dbName: string, actionName: string, startEvent: StartQueuedTaskFn<T>, evtTimeOut?: number): IPromise<T> {\n    // Create or fetch the current scheduler for this dbName\n    let dbCtx = _getDbContext(dbName);\n    return dbCtx.sch.queue(startEvent, actionName, evtTimeOut);\n}\n\n\n// TODO: move to common to be able to used by lds\nexport function getDbFactory(): IDBFactory {\n    let global = getGlobal() || ({} as Window);\n    let dbFactory: IDBFactory = null;\n    if (global) {\n        try {\n            for (let lp = 0; lp < IndexedDBNames.length; lp++) {\n                dbFactory = (global[IndexedDBNames[lp]] as IDBFactory);\n                if (dbFactory && isFunction(dbFactory.open)) {\n                    return dbFactory;\n                }\n            }\n        } catch (e) {\n            dbFactory = null;\n        }\n    }\n\n    return dbFactory;\n}\n\nfunction _debugLog(dbName: string, message: string) {\n    // Only log if running within test harness\n    if (getGlobalInst(\"QUnit\")) {\n        // tslint:disable-next-line:no-console\n        console && console.log(\"IndexedDbHelper [\" + dbName + \"] \" + message);\n    }\n}\n\n/**\n * Helper method to map an Event rejection to a reject with a message, this is mainly for terminal errors where the\n * IndexedDb API returns an event which we are going to ignore\n * @param rejectMessage\n * @param rejectFunc\n */\nfunction _eventReject(dbName: string, rejectMessage: string, rejectFunc: (reason?: any) => void, evtName: string) {\n    return function(evt: Event) {\n        rejectFunc(new Error(rejectMessage));\n        _debugLog(dbName, \"[\" + evtName + \"] event rejected\");\n    };\n}\n\n\n// This helper is designed to allow multiple database implementation\n// The IndexedDB provider will be using only one database with different stores.\n// for each transaction, will open a new connection\nexport class IndexedDbHelper<C> {\n    \n    constructor(diagLog?: IDiagnosticLogger) {\n        let _dbFactory = getDbFactory() || null;\n\n        dynamicProto(IndexedDbHelper, this, (_this) => {\n\n            _this.isAvailable = (): boolean => {\n                return !!_dbFactory;\n            };\n            \n            /**\n             * Schedules the opening of the database if not already open\n             */\n            _this.openDb = <T>(\n                dbName: string,\n                dbVersion: number,\n                processFunc: (dbContext: IIndexedDbOpenDbContext<C>) => T | IPromise<T>,\n                versionChangeFunc?: (dbContext: IIndexedDbOpenDbContext<C>) => IPromise<void>): IPromise<T> => {\n\n                // Schedule the database to be opened\n                return _scheduleEvent<T>(dbName, \"openDb\", (evtName) => {\n                    return createAsyncPromise<T>((openResolve, openReject) => {\n                        let createdNewDb = false;\n                        function _createDbCtx(dbContext: IDbContext, db: IDBDatabase, dbOpenRequest: IDBOpenDBRequest, isNew: boolean, isUpgrade?: boolean): IIndexedDbOpenDbContext<C> {\n                            let crDbCtx: IIndexedDbOpenDbContext<C> = {\n                                db: db,\n                                dbName: dbName,\n                                dbVersion: dbVersion,\n                                ctx: null,\n                                isNew: isNew,\n                                txn: dbOpenRequest ? dbOpenRequest.transaction : null // Special case see the versionChangeFunc usage below\n                            };\n                        \n\n                            if (!isUpgrade) {\n                                crDbCtx.openStore = <R>(eventTable: string, doAction: (store: IIndexedDbStoreActionContext<C>) => IPromise<R>|R|void): IPromise<R> => {\n                                    return _openStore<R>(crDbCtx, eventTable, doAction);\n                                };\n                                crDbCtx.openCursor = <R>(eventTable: string, query: string|IIndexedDbSimpleQuery, cursorFunc?: (state: IProcessCursorState<C>, value: R, values: R[]) => CursorProcessResult): IPromise<R[]> => {\n                                    return _openCursor(crDbCtx, eventTable, query, cursorFunc);\n                                };\n                            }\n\n                            return crDbCtx;\n                        }\n                        // TODO: add function to handle version change\n                        function _databaseUpgrade(db: IDBDatabase, dbOpenRequest: IDBOpenDBRequest, ev?: Event) {\n                            _debugLog(dbName, \"db upgrade called\")\n                            let upgDbCtx = _createDbCtx(null, db, dbOpenRequest, true, true);\n\n                            if (!versionChangeFunc) {\n                                try {\n                                    dbOpenRequest.transaction && dbOpenRequest.transaction.abort();\n                                    dbOpenRequest.result && dbOpenRequest.result.close(); // close database to unblock others\n                                } finally {\n                                    openReject(new Error(ErrorMessageDbUpgradeRequired));\n                                }\n                                return;\n                            }\n\n                            createdNewDb = true;\n                            doAwaitResponse(versionChangeFunc(upgDbCtx), (response) => {\n                                if (!response.rejected) {\n                                    // Special case handling, when a DB is first created calling createObjectStore() will\n                                    // automatically start a version change transaction which will block all other transactions\n                                    // from getting created, so we save the auto opened on here for reuse as part of opening the store\n                                    _debugLog(upgDbCtx.dbName, \"on version change success\")\n                                    if (!upgDbCtx.txn) {\n                                        upgDbCtx.txn = dbOpenRequest.transaction;\n                                        _debugLog(upgDbCtx.dbName, \"added open request\")\n                                    }\n                                    \n                                } else {\n                                    // Abort the upgrade event\n                                    try {\n                                        dbOpenRequest.transaction && dbOpenRequest.transaction.abort();\n                                    } finally {\n                                        openReject(response.reason);\n                                    }\n                                }\n                            });\n                        }\n\n                        function _databaseOpen(db: IDBDatabase, dbOpenRequest: IDBOpenDBRequest) {\n                            // Save the IDBDatabase handle to the global reference (so we can make sure we can close/delete the Db)\n                            // Also used to track the number of times the DB has been opened\n                            let opDbCtx = _getDbContext(dbName);\n                            opDbCtx.add(db);\n\n                            db.onabort = (evt: Event) => {\n                                _debugLog(dbName, \"onabort -- closing the Db\");\n                                opDbCtx.remove(db);\n                            };\n                            db.onerror = (evt: Event) => {\n                                _debugLog(dbName, \"onerror -- closing the Db\");\n                                opDbCtx.remove(db);\n                            };\n                            \n                            (db as any).onclose = (evt: Event) => {\n                                _debugLog(dbName, \"onclose -- closing the Db\");\n                                opDbCtx.remove(db);\n                            };\n                            db.onversionchange = (evt: Event) => {\n                                _debugLog(dbName, \"onversionchange -- force closing the Db\");\n                                db.close();\n                                opDbCtx.remove(db);\n                            };\n\n                            let openDbCtx: IIndexedDbOpenDbContext<C> = null;\n                            let dbHdl: IDBDatabase = null;\n                            if (opDbCtx.dbHdl.length > 0) {\n                                dbHdl = opDbCtx.dbHdl[0];\n                            }\n\n                            openDbCtx = _createDbCtx(opDbCtx, dbHdl, dbOpenRequest, createdNewDb);\n\n                            try {\n                                // Database has been opened\n                                doAwait(processFunc(openDbCtx), openResolve, openReject);\n                            } catch (e) {\n                                openReject(e);\n                            }\n                        }\n\n                        let dbCtx = _getDbContext(dbName);\n\n                        if (_dbFactory == null) {\n                            openReject(new Error(\"No available storage factory\"));\n                        } else if (dbCtx.isOpen()) {\n                            // Database is already open\n                            let openDbCtx = _createDbCtx(dbCtx, dbCtx.openHdl(), null, false);\n                            doAwait(processFunc(openDbCtx), openResolve, openReject);\n                        } else {\n                            let dbOpenRequest = _dbFactory.open(dbName, dbVersion);\n                            if (!dbOpenRequest) {\n                                throw new Error(\"missing API\"); // in case, some corners case (such as private mode for certain browsers) does not support open db\n                            }\n\n                            // We can't open the database, possible issues are\n                            // - We are attempting to open the db as a different version but it's already open\n                            dbOpenRequest.onblocked = (evt: Event) => {\n                                _debugLog(dbName, \"Db Open Blocked event [\" + evtName + \"] - \" + (dbOpenRequest.error || \"\"))\n                                openReject(new Error(ErrorMessageUnableToOpenDb));\n                            };\n                            dbOpenRequest.onerror = (evt: Event) => {\n                                _debugLog( dbName,\"Db Open Error event [\" + evtName + \"] - \" + (dbOpenRequest.error || \"\"))\n                                openReject(new Error(ErrorMessageUnableToOpenDb));\n                            };\n                            dbOpenRequest.onupgradeneeded = (evt: Event) => {\n                                _debugLog(dbName, \"Db Open Create/Upgrade needed event [\" + evtName + \"]\");\n                                try {\n                                    let db = evt.target[Result] || dbOpenRequest.result;\n                                   \n                                    if (!db) {\n                                        _debugLog(dbName, \"no db\");\n                                        openReject(new Error(ErrorMessageUnableToOpenDb));\n                                        return;\n                                    }\n\n                                    _databaseUpgrade(db, dbOpenRequest, evt);\n                                } catch (e) {\n                                    _eventReject(dbName, ErrorMessageUnableToOpenDb, openReject, evtName)(e);\n                                }\n                            };\n\n                            dbOpenRequest.onsuccess = (evt) => {\n                                _debugLog(dbName, \"Db Open sucess [\" + evtName + \"]\");\n                                let db = evt.target[Result];\n                                if (!db) {\n                                    openReject(new Error(ErrorMessageUnableToOpenDb));\n                                    return;\n                                }\n                                _databaseOpen(db, dbOpenRequest);\n                            };\n                        }\n                    });\n                });\n            };\n\n            _this.closeDb = (dbName: string): void => {\n                // Schedule the close so we don't interrupt an previous scheduled operations\n                _debugLog(dbName, \"close db\");\n                _scheduleEvent(dbName, \"closeDb\", (evtName) => {\n                    let dbCtx = _getDbContext(dbName);\n                    let dbHdls = dbCtx.dbHdl;\n                    let len = dbHdls.length;\n                    if (len > 0) {\n                        for (let lp = 0; lp < len; lp++) {\n                            // Just call close the db.onclose() event should take care of decrementing and removing the references\n                            dbHdls[lp].close();\n                        }\n                        dbCtx.dbHdl = [];\n                    }\n\n                    return 1;\n                }).catch((reason) => {\n                    // Handle promise rejection to avoid an unhandled rejection event\n                });\n            };\n\n            _this.deleteDb = (dbName: string): boolean | IPromise<boolean> => {\n                if (_dbFactory == null) {\n                    return false;\n                }\n\n                return _scheduleEvent<boolean>(dbName, \"deleteDb\", (evtName) => {\n                    // Implicitly close any open db first as this WILL block the deleting\n                    let dbCtx = _getDbContext(dbName);\n                    let dbHdls = dbCtx.dbHdl;\n                    let len = dbHdls.length;\n                    if (len > 0) {\n                        _debugLog(dbName, \"Db is open [\" + len + \"] force closing\");\n                        for (let lp = 0; lp < len; lp++) {\n                            // Just call close the db.onclose() event should take care of decrementing and removing the references\n                            dbHdls[lp].close();\n                        }\n\n                        // Clear all of the existing handles as we have forced closed them and for compatibility we can't\n                        // rely on the db onclose event\n                        dbCtx.dbHdl = [];\n                    }\n\n                    return createAsyncPromise<boolean>((deleteResolve, deleteReject) => {\n                        // Attempting to delete the Db, only after we wait so that any outstanding operations can finish\n                        setTimeout(() => {\n                            try {\n                                _debugLog(dbName, \"[\" + evtName + \"] starting\");\n\n                                let dbRequest = _dbFactory.deleteDatabase(dbName);\n                                dbRequest.onerror = (evt: Event) => {\n                                    deleteReject(new Error(ErrorMessageFailedToDeleteDatabase));\n                                };\n                                dbRequest.onblocked = (evt: Event) => {\n                                    deleteReject(new Error(ErrorMessageFailedToDeleteDatabase));\n                                };\n                                dbRequest.onupgradeneeded = (evt: Event) => {\n                                    deleteReject(new Error(ErrorMessageFailedToDeleteDatabase));\n                                };\n                                dbRequest.onsuccess = (evt: Event) => {\n                                    _debugLog(dbName, \"[\" + evtName + \"] complete\");\n                                    deleteResolve(true);\n                                };\n                                _debugLog(dbName, \"[\" + evtName + \"] started\");\n                            } catch (e) {\n                                deleteReject(new Error(ErrorMessageFailedToDeleteDatabase + \" - \" + e));\n                            }\n                        }, 0);\n                    });\n                });\n            };\n\n            _this.getDbDetails = (dbName: string): IPromise<IIndexedDbDetails> => {\n                return _scheduleEvent<IIndexedDbDetails>(dbName, \"getDbDetails\", (evtName) => {\n                    if (_dbFactory == null || !(_dbFactory as any).databases) {\n                        // Either IndexedDb is not supported or databases is not supported\n                        return createAsyncRejectedPromise<IIndexedDbDetails>(new Error(ErrorMessageDbNotSupported));\n                    }\n\n                    return createAsyncPromise<IIndexedDbDetails>((databasesResolve, databasesReject) => {\n                        // databases() is still experimental, so it's not fully available\n                        // The promise will reject if there is a JS error\n                        let dbPromise = (_dbFactory as any).databases();\n                        dbPromise.then((databases) => {\n                            for (let lp = 0; lp < databases.length; lp++) {\n                                if (databases[lp].name === dbName) {\n                                    databasesResolve(databases[lp]);\n                                    return;\n                                }\n                            }\n                            databasesReject(new Error(ErrorMessageDbDoesNotExist));\n                        }, databasesReject);\n                    });\n                }, 2000);\n            };\n\n            function _createStoreContext(openDbCtx: IIndexedDbOpenDbContext<C>, eventTable: string): IIndexedDbStoreActionContext<C> {\n                // Save the current handle so we close the correct one during the transaction events\n                let dbHdl: IDBDatabase = openDbCtx.db || null;\n\n                // Check if the openDb event created a transaction that we should reuse\n                let tx: IDBTransaction = dbHdl && dbHdl.transaction(eventTable, DbReadWrite);\n                if (tx) {\n                    // The transaction was aborted and therefore the adding of the event failed\n                    tx.onabort = () => {\n                        // add log\n                    };\n                    tx.onerror = () => {\n                        // add log\n                    };\n\n                    // Note we don't listen for the transaction onComplete event as we don't have any value\n                    // to resolve the promise with, we are relying on the doAction() to resolve and the exception\n                    // handling below to ensure we don't deadlock.\n                    tx.oncomplete = () => {\n                        // We need to capture the transaction close event as not all browsers are triggering the db onclose event\n                        _debugLog(openDbCtx.dbName, \"txn.oncomplete\");\n                    };\n\n                    // Ok, so now we have the transaction handling setup lets try and store the event\n                    return  {\n                        db: openDbCtx,\n                        store: tx.objectStore(eventTable),\n                        tx: tx,\n                        tbl: eventTable,\n                        openCursor: <T>(\n                            query: string|IIndexedDbSimpleQuery,\n                            processFunc?: (state: IProcessCursorState<C>, value: T, values: T[]) => CursorProcessResult): IPromise<T[]> => {\n                            return _openCursor(openDbCtx, eventTable, query, processFunc);\n                        },\n                        newTransaction: <T>(doAction: (store: IIndexedDbStoreActionContext<C>) => IPromise<T>): IPromise<T> => {\n                            return _openStore<T>(openDbCtx, eventTable, doAction);\n                        }\n                    };\n                    \n                }\n                return null;\n            }\n\n            /**\n             * Opens the specific store for the database\n             * @param openDbCtx\n             * @param eventTable\n             * @param doAction\n             */\n            function _openStore<T>(openDbCtx: IIndexedDbOpenDbContext<C>, eventTable: string, doAction: (store: IIndexedDbStoreActionContext<C>) => IPromise<T>|T|void): IPromise<T> {\n                // While the open DB promise may have been resolved we still might not have opened the DB (This is to ensure that\n                // non-critical failures don't cause event execution out of order)\n                if (!openDbCtx || !openDbCtx.db) {\n                    // Database is not open so pass the only option is to resolve the event so it's passed onto the next on the event to the next chain\n                    return createAsyncRejectedPromise<T>(new Error(ErrorMessageDbNotOpen));\n                }\n\n                try {\n                    // Perform the transaction action\n                    let result = doAction(_createStoreContext(openDbCtx, eventTable));\n                    if (isPromiseLike(result)) {\n                        return result;\n                    }\n\n                    return createAsyncResolvedPromise<T>(result as T);\n                } catch (e) {\n                    return createAsyncRejectedPromise(e);\n                }\n            }\n\n            function _openCursor<T>(\n                openDbCtx: IIndexedDbOpenDbContext<C>,\n                eventTable: string,\n                query: string | IIndexedDbSimpleQuery,\n                processFunc?: (state: IProcessCursorState<C>, value: T, values: T[]) => CursorProcessResult): IPromise<T[]> {\n\n                // While the open DB promise may have been resolved we still might not have opened the DB (This is to ensure that\n                // non-critical failures don't cause event execution out of order)\n                if (!openDbCtx || !openDbCtx.db) {\n                    // Database is not open so pass the only option is to resolve the event so it's passed onto the next on the event to the next chain\n                    return createAsyncRejectedPromise<T[]>(new Error(ErrorMessageDbNotOpen));\n                }\n\n                let simpleQuery: IIndexedDbSimpleQuery = null;\n                if (query && isString(query)) {\n                    simpleQuery = new SimpleQuery(query as string);\n                } else if (query && (query as any).isMatch) {          // simple check to make sure this is a IIndexedDbSimpleQuery\n                    simpleQuery = (query as IIndexedDbSimpleQuery);\n                }\n\n                return createAsyncPromise<T[]>((openCursorResolve, openCursorReject) => {\n                    let values: T[] = [];\n                    let cursorRequest: IDBRequest = null;\n                    let queryKeyRange = null;\n                    if (simpleQuery && simpleQuery.keyRange) {\n                        queryKeyRange = simpleQuery.keyRange();\n                    }\n\n                    let storeCtx = _createStoreContext(openDbCtx, eventTable);\n\n                    if (queryKeyRange) {\n                        cursorRequest = storeCtx.store.openCursor(queryKeyRange);\n                    } else {\n                        cursorRequest = storeCtx.store.openCursor();\n                    }\n                    cursorRequest.onerror = _eventReject(storeCtx.db.dbName, ErrorMessageFailedToOpenCursor, openCursorReject, \"openCursor\");\n                    cursorRequest.onsuccess = (evt: Event) => {\n                        // Cursor was open/next iteration\n                        let cursor: IDBCursorWithValue = evt.target[Result];\n                        if (!cursor) {\n                            // This occurs when we get to the end of the cursor iteration\n                            openCursorResolve(values);\n                            return;\n                        }\n\n                        let processCursorState: IProcessCursorState<C> = {\n                            store: storeCtx,\n                            cursor: cursor,\n                            continue: () => {\n                                cursor.continue();\n                            },        // Moves to the next matching item\n                            done: () => {\n                                openCursorResolve(values);\n                            }     // Stops the cursor processing\n                        };\n\n                        var value = cursor.value;\n                        if (simpleQuery && !simpleQuery.isMatch(value)) {\n                            processCursorState.continue();\n                            return;\n                        }\n\n                        if (processFunc) {\n                            try {\n                                switch (processFunc(processCursorState, value, values)) {\n                                case CursorProcessResult.Complete:\n                                    openCursorResolve(values);\n                                    break;\n                                case CursorProcessResult.Waiting:\n                                    // The process method now controls whether th\n                                    break;\n                                case CursorProcessResult.Continue:\n                                default:\n                                    processCursorState.continue();\n                                    break;\n                                }\n                            } catch (ex) {\n                                // Make sure the reject the promise if the processFunc callback throws unexpectable\n                                openCursorReject(ex);\n                            }\n                        } else {\n                            values.push(value);\n                            processCursorState.continue();\n                        }\n                    };\n                });\n            }\n            \n        });\n\n        \n    }\n    \n    /**\n     * Identifies whether an IndexedDb api is available\n     */\n    public isAvailable(): boolean {\n    // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    public openDb<T>(\n        dbName: string,\n        dbVersion: number,\n        processFunc: (dbContext: IIndexedDbOpenDbContext<C>) => T | IPromise<T>,\n        versionChangeFunc?: (dbContext: IIndexedDbOpenDbContext<C>) => IPromise<void>): IPromise<T> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n\n    /**\n     * Request that any open database handles for the named database be closed.\n     * This method will return immediately, however, the scheduled event to close the open Db handles will not occur until all outstanding database operations\n     * (openDb, deleteDb, getDbDetails) started by IndexedDbHelper for the named db have completed. This will NOT affect or wait for any open database handles\n     * which have been directly opened by the IndexedDB Api.\n     * @param dbName - The name of the database to close, no error will be returned if the database does not exist or was not opened.\n     */\n    public closeDb(dbName: string): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Request that the named database should be deleted, this implicitly closes any previously opened database that was opened via IndexedDBHelper.\n     * It will also wait for all Promise objects from previous openDb, closeDb, getDbDetails to complete (resolve or reject) before attempting to\n     * perform the delete operation. This operation may block or fail if the database is opened outstide of the IndexedDbHelper\n     * The returned promise will be resolved or rejected depending on the outcome of the delete operation.\n     * @param dbName - The name of the database to delete\n     */\n    public deleteDb(dbName: string): boolean | IPromise<boolean> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Attempt to return the details (version) of the named database if possible.\n     * This method requires that the underlying browser support draft specification for IDBFactory.databases, if this is not supported then the returned\n     * Promise will be rejected with an error message stating that the feature is not supported.\n     * The returned Promise will be resolved with the details if available or rejected on error.\n     * @param dbName - The name of the database to request the details for\n     */\n    public getDbDetails(dbName: string): IPromise<IIndexedDbDetails> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n}\n\n\n\n\n/**\n * Internal value used by the SimpleQuery to identify the type of search being performed\n */\nconst enum ValueQueryType {\n    StartsWith = 0,\n    Contains = 1\n}\n\n/**\n * Internal Interface used by the SimpleQuery class to define the cursor search definition\n */\ninterface IValueQuery {\n    name: string;\n    value: string;\n    type: ValueQueryType;\n}\n\n/**\n * A simple query interface to provide a simple cursor query (IDBKeyRange) key range and matching.\n * Used by the openCursor() method.\n */\nclass SimpleQuery implements IIndexedDbSimpleQuery {\n\n    constructor(theQuery?: string) {\n        let _queryCols: IValueQuery[] = [];\n        let _keyRange: IDBKeyRange = null;\n\n        dynamicProto(SimpleQuery, this, (_this) => {\n            _this.keyRange = () => {\n                return _keyRange;\n            };\n\n            _this.parseQuery = (query: string) => {\n                _queryCols = [];\n\n                if (query) {\n                    let items = query.split(\";\");\n                    for (let lp = 0; lp < items.length; lp++) {\n                        let item = items[lp];\n                        let idx = item.indexOf(\"=\");\n                        if (idx !== -1) {\n                            let key = item.substring(0, idx);\n                            let value = item.substring(idx + 1);\n                            if (key.indexOf(\"#\") === 0) {\n                                key = key.substring(1);\n                                if (!_keyRange) {\n                                    _keyRange = IDBKeyRange.bound(value, value + \"\\uffff\");\n                                }\n                            }\n\n                            _this.startsWith(key, value);\n                        }\n                    }\n                }\n            };\n\n            _this.startsWith = (columnName: string, value: string) => {\n                _queryCols.push({\n                    name: columnName,\n                    value: value,\n                    type: ValueQueryType.StartsWith\n                });\n            };\n\n            _this.contains = (columnName: string, value: string) => {\n                _queryCols.push({\n                    name: columnName,\n                    value: value,\n                    type: ValueQueryType.Contains\n                });\n            };\n\n            _this.isMatch = (value: any) => {\n                // No query restriction so everything matches\n                if (!_queryCols || _queryCols.length === 0) {\n                    return true;\n                }\n\n                if (!value) {\n                    return false;\n                }\n\n                for (let lp = 0; lp < _queryCols.length; lp++) {\n                    let query = _queryCols[lp];\n                    let chkValue = value[query.name];\n                    if (chkValue) {\n                        if (query.type === ValueQueryType.StartsWith) {\n                            if (chkValue.indexOf(query.value) !== 0) {\n                                return false;\n                            }\n                        } else if (query.type === ValueQueryType.Contains) {\n                            if (chkValue.indexOf(query.value) === -1) {\n                                return false;\n                            }\n                        }\n                    }\n                }\n\n                return true;\n            };\n\n            if (theQuery) {\n                _this.parseQuery(theQuery);\n            }\n        });\n    }\n\n    /**\n     * [Optional] Returns and optional IndexedDB IDBKeyRange instance that will be passed to the IndexedDB Api openCursor() method.\n     * Value returned May be null.\n     */\n    public keyRange?(): IDBKeyRange;\n\n    /**\n     * Processes the provided string and attempts to create a simple query from the values, this can be a ';' seperated list of values where each value represents a\n     * <key>=<value> set with <key> being the property name to match and <value> being the value. If the <key> is prefixed with a '#' character then this will be used to as\n     * the query \"key\" and will populate the keyRange() returned by the keyRange() method.\n     * @param query - */\n    public parseQuery?(query: string): void;\n\n    /**\n     * Creates a simple \"startsWith\" check. This is same as passing \"<columnName>=<value>\" to the parseQuery() method.\n     * @param columnName - The property of the returned object\n     * @param value - The value of the property from the returned object to perform a startsWith() match against\n     */\n    public startsWith?(columnName: string, value: string): void;\n\n    /**\n     * Creates a simple \"contains\" check. This will create a search query that will return true whenever the <columnName> value contains <value>\n     * anywhere in the resulting string (i.e. it performs an xxxx.indexOf(<value>) != -1)\n     * @param columnName - The property of the returned object\n     * @param value - The value of the property from the returned object to perform a startsWith() match against\n     */\n    public contains?(columnName: string, value: string): void;\n\n    /**\n     * [Optional] Callback method used to provide additional validation on whether the returned value from the IndexedDB Api cursor iteration, this method\n     * must return true for the processFunc() of the openCursor() is called or the value is just added to the identified items.\n     * @param value - The value returned by the IndexedDB IDBCursorWithValue cursor event.\n     * @returns true if the value matches otherwise false\n     */\n    public isMatch?(value: any): boolean;\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/Providers/IndexDbProvider.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    INotificationManager, IProcessTelemetryContext, IUnloadHookContainer, eBatchDiscardedReason, isNotNullOrUndefined, isString, newGuid,\n    onConfigChange\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, createAsyncAllPromise, createAsyncPromise, doAwait, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { batchDropNotification, getEndpointDomain, getTimeFromId, getTimeId } from \"../Helpers/Utils\";\nimport {\n    CursorProcessResult, IIndexedDbOpenDbContext, IIndexedDbStoreActionContext, IProcessCursorState\n} from \"../Interfaces/IOfflineIndexDb\";\nimport {\n    ILocalStorageProviderContext, IOfflineChannelConfiguration, IOfflineProvider, IStorageTelemetryItem\n} from \"../Interfaces/IOfflineProvider\";\nimport { IndexedDbHelper } from \"./IndexDbHelper\";\n\n//TODO: move all const to one file\nconst EventsToDropAtOneTime = 10;                   // If we fail to add a new event this is the max number of events we will attempt to remove to make space\nconst StoreVersion = 1;                             // The Current version for the stored items, this will be used in the future for versioning\nconst OrhpanedEventThresholdInMs = 604800000;        // 7 days\nconst UnknowniKey = \"Unknown\";\nconst ErrorMessageUnableToAddEvent = \"DBError: Unable to add event\";\nconst MaxCriticalEvtsDropCnt = 2;\n\nexport const DefaultDbName = \"AIOffline\";  // Db Name including the version number on the end so that if we ever have to upgrade old and new code can co-exist\nexport const DbVersion = 1;                         // The Current version of the database (Used to trigger upgrades)\nexport const EventObjectStoreName = \"Evts\";\n\n\n/**\n * The format of the data stored in the iKey objectStore\n */\nexport interface IIkeyData {\n    iKey: string;               // The ikey\n    tm: number;                 // The last time this iKey was used\n}\n\n/**\n * The format of the data stored in the Evts objectStore\n */\nexport interface IIndexedDbItem {\n    key?: string;                // The actual key for the event\n    id: string | undefined | null;                 // The stored key of the event (This MUST be the id of the event)\n    evt: IStorageTelemetryItem;  // The actual store\n    tm: number;                 // Identifies when this event was added to the store\n    v: number;                   // Identifies the version type of this entry\n}\n\n/**\n * The open database context created by the _openDb() function and passed to the processFunc() delegate to perform operations\n * on the opened db, this is used to pass around the current db context.\n */\ninterface IProviderDbContext {\n    iKey: string;               // The current iKey for the events\n    storageId: string;\n    id?: string | number | undefined | null; // The current id/endpoint for the events\n    iKeyPrefix?: () => string;   // Returns the prefix applied to all events of the current iKey (used by 1ds)\n    evtKeyPrefix?: () => string; // Returns the current prefix to apply to events (used by 1ds)\n}\n\nfunction _getTime() {\n    return new Date().getTime();\n}\n\n\nfunction _createDb(db: IDBDatabase) {\n    // data in the same db must have same endpoint url\n    if (!db.objectStoreNames.contains(EventObjectStoreName)) {\n        let evtStore = db.createObjectStore(EventObjectStoreName, { keyPath: \"id\" });\n        evtStore.createIndex(\"criticalCnt\", \"criticalCnt\", { unique: false });\n    }\n}\n\n\nfunction _getEvents(values: IIndexedDbItem[]): IStorageTelemetryItem[] {\n    let events: IStorageTelemetryItem[] = [];\n  \n    for (let lp = 0; lp < values.length; lp++) {\n        let item = values[lp];\n        if (item && item.evt) {\n            events.push(item.evt);\n        }\n    }\n    return events;\n}\n\nfunction _addEventByTime(values: IIndexedDbItem[], newValue: IIndexedDbItem): IIndexedDbItem[] {\n    for (let idx = 0; idx < values.length; idx++) {\n        if (newValue.tm < values[idx].tm) {\n            values.splice(idx, 0, newValue);\n            return;\n        }\n    }\n\n    values.push(newValue);\n}\n\n\nfunction _getId(key: string | number , values: IStorageTelemetryItem[]|IIndexedDbItem[]) {\n    let len = values.length;\n    for (let lp = 0; lp < len; lp++) {\n        if (key === values[lp].id) {\n            return lp;\n        }\n    }\n\n    return -1;\n}\n\nfunction _cursorContinueEvent(cursorState: IProcessCursorState<IProviderDbContext>, value?: IIndexedDbItem) {\n    return (evt: any) => {\n        return cursorState.continue();\n    };\n}\n\nfunction _cursorDeleteAndContinue(cursorState: IProcessCursorState<IProviderDbContext>, value?: IIndexedDbItem) {\n    let deleteRequest = cursorState.cursor.delete();\n    deleteRequest.onerror = _cursorContinueEvent(cursorState);\n    deleteRequest.onsuccess = _cursorContinueEvent(cursorState);\n\n    return CursorProcessResult.Waiting;\n}\n\nfunction _getAllEvents(dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>, cursorQuery: string, cnt?: number): IPromise<IIndexedDbItem[]> {\n    // Open the Db store returning the embedded promise for handling resolving and rejecting the request chain\n    return dbCtx.openCursor<IIndexedDbItem>(\n        EventObjectStoreName,\n        cursorQuery,\n        (cursorState, value, values) => {\n            values.push(value);\n            if (cnt && values && values.length == cnt) {\n                return CursorProcessResult.Complete;\n            }\n            return CursorProcessResult.Continue;\n        });\n}\n\n\nfunction _deleteEvents(dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>, eventPrefixQuery: string, shouldDelete: (value: IIndexedDbItem) => boolean): IPromise<IIndexedDbItem[]> {\n    // Open the Event object store\n    return dbCtx.openCursor<IIndexedDbItem>(\n        EventObjectStoreName,\n        eventPrefixQuery,\n        (deleteCursorState, value: IIndexedDbItem, values: IIndexedDbItem[]) => {\n            if (shouldDelete(value)) {\n                values.push(value);\n                return _cursorDeleteAndContinue(deleteCursorState, value);\n            }\n            return CursorProcessResult.Continue;\n        });\n}\n\n\nfunction _dropMaxTimeEvents(dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>, maxTime?: number): IPromise<IIndexedDbItem[]> {\n    return createAsyncPromise<IIndexedDbItem[]>((deleteEvtsResolve, deleteEvtsReject) => {\n        return _deleteEvents(dbCtx, null, (value) => {\n            if (!value || !value.evt) {\n                return true;\n            }\n\n            let addedTime = getTimeFromId(value.id);\n            let minStartTime = _getTime() + 1 - maxTime;\n\n            if (addedTime <= minStartTime) {\n                return true;\n            }\n\n            return false;\n        }).then((values) => {\n            deleteEvtsResolve(values);\n\n        }, deleteEvtsReject);\n      \n    });\n}\n\n\nfunction _dropEventsUpToPersistence(dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>, maxpriorityCnt: number, maxDropCnt: number): IPromise<number> {\n    return createAsyncPromise<number>((dropEventsResolve, dropEventsReject) => {\n        let droppedEvents = 0;\n\n        function _resolveWithDroppedEvents() {\n            dropEventsResolve(droppedEvents);\n        }\n\n        function _dropEvent(deleteStoreCtx: IIndexedDbStoreActionContext<IProviderDbContext>, dropItem: IIndexedDbItem): IPromise<void> {\n            return createAsyncPromise<void>((deleteResolve) => {\n                let deleteRequest = deleteStoreCtx.store.delete(dropItem.key);\n                deleteRequest.onsuccess = (evt) => {\n                    droppedEvents++;\n                    deleteResolve();\n                };\n                deleteRequest.onerror = (evt) => {\n                    deleteResolve();\n                };\n            });\n        }\n\n        function _processCandidates(dropCandidates: IIndexedDbItem[]) {\n            if (dropCandidates.length === 0) {\n                _resolveWithDroppedEvents();\n                return;\n            }\n\n            dbCtx.openStore(EventObjectStoreName, (deleteStoreCtx) => {\n                let deleteEvts: Array<IPromise<void>> = [];\n                for (let lp = 0; lp < dropCandidates.length; lp++) {\n                    deleteEvts.push(_dropEvent(deleteStoreCtx, dropCandidates[lp]));\n                }\n\n                return createAsyncAllPromise(deleteEvts).then(_resolveWithDroppedEvents, _resolveWithDroppedEvents);\n            });\n        }\n\n        // Get all of the candidates that we may delete\n        var cursorPromise = dbCtx.openCursor<IIndexedDbItem>(\n            EventObjectStoreName,\n            null,\n            (cursorState, value: IIndexedDbItem, values: IIndexedDbItem[]) => {\n                if (value.evt.criticalCnt <= maxpriorityCnt) {\n                    _addEventByTime(values, value);\n                    if (values.length > maxDropCnt) {\n                        values.splice(values.length - 1, 1);\n                    }\n                }\n\n                return CursorProcessResult.Continue;\n            });\n\n        cursorPromise.then(_processCandidates, () => {\n            dropEventsResolve(0);\n        });\n    });\n}\n\n/**\n * Class that implements storing of events using the WebStorage Api ((window||globalThis||self).localstorage, (window||globalThis||self).sessionStorage).\n */\nexport class IndexedDbProvider implements IOfflineProvider {\n    public id: string;\n\n    /**\n     * Creates a WebStorageProvider using the provider storageType\n     */\n    constructor(id?: string, unloadHookContainer?: IUnloadHookContainer) {\n        dynamicProto(IndexedDbProvider, this, (_this) => {\n            let _indexedDb: IndexedDbHelper<IProviderDbContext> = null;\n            let _dbName: string = null;\n            let _iKey: string = UnknowniKey;\n            let _storageId: string = null;              // Used as a unique id so that when active on multiple tabs (threads) the apps don't corrupts each other\n            let _autoClean: boolean = null;\n            let _endpoint: string = null;\n            let _storageKeyPrefix: string = null;\n            let _maxStorageTime: number = null;\n            let _eventDropPerTime: number = null;\n            let _maxCriticalCnt: number = null;\n            let _notificationManager: INotificationManager = null;\n        \n            _this.id = id;\n\n            _this.initialize = (providerContext: ILocalStorageProviderContext) => {\n                let diagLog = providerContext.itemCtx.diagLog();\n                _indexedDb = new IndexedDbHelper<IProviderDbContext>(diagLog);\n                if (!_indexedDb.isAvailable()) {\n                    _indexedDb = null;\n                    return false;\n                }\n                let coreConfig = providerContext.itemCtx.getCfg();\n                let itemCtx = providerContext.itemCtx;\n                let ikey = itemCtx.getCfg().instrumentationKey || coreConfig.instrumentationKey;\n                if (!isString(ikey)) {\n                    //_iKey = ikey\n                    return;\n                }\n                _iKey = ikey;\n\n                let storageConfig: IOfflineChannelConfiguration = providerContext.storageConfig;\n                _storageId = _this.id || providerContext.id || newGuid();\n                _notificationManager = providerContext.notificationMgr;\n\n               \n                _endpoint = getEndpointDomain(providerContext.endpoint);\n                _autoClean = !!storageConfig.autoClean;\n                _storageKeyPrefix = storageConfig.storageKeyPrefix || DefaultDbName;\n                _dbName = _storageKeyPrefix + \"_\" + DbVersion + \"_\" + _endpoint;\n                \n\n                // currently, won't handle endpoint change\n                // new endpoint will open a new db\n                // endpoint change will be handled at offline batch lavel\n                // namePrefix should not contain any \"_\"\n              \n               \n\n                let unloadHook = onConfigChange(storageConfig, () => {\n                    _maxStorageTime = storageConfig.inStorageMaxTime || OrhpanedEventThresholdInMs; // TODO: handle 0\n                    let dropNum = storageConfig.EventsToDropPerTime;\n                    _eventDropPerTime = isNotNullOrUndefined(dropNum)? dropNum : EventsToDropAtOneTime;\n                    _maxCriticalCnt = storageConfig.maxCriticalEvtsDropCnt || MaxCriticalEvtsDropCnt;\n\n                    \n                });\n                unloadHookContainer && unloadHookContainer.add(unloadHook);\n\n                if (_dbName) {\n                  \n                    doAwaitResponse(_this.clean(!_autoClean), (response) => {\n                        _openDb(\n                            (dbCtx) => {\n                                return true;\n                            }).then(\n                            (value) => {\n                                // All done, but as initialize isn't waiting just ignore\n                            },\n                            (reason) => {\n                                // clear and stop using indexedDb\n                                diagLog.warnToConsole(\"IndexedDbProvider failed to initialize - \" + (reason || \"<unknown>\"));\n                                _indexedDb = null;\n                            });\n                    });\n                    \n                }\n\n                return true;\n            };\n\n            _this[\"_getDbgPlgTargets\"] = () => {\n                return [_dbName, _endpoint, _maxStorageTime, _indexedDb];\n            };\n\n            /**\n              * Identifies whether this storage provider support synchronious requests\n             */\n            _this.supportsSyncRequests = () => {\n                return false;\n            };\n\n            /**\n             * Get all of the currently cached events( with given number) from the storage mechanism\n             */\n            _this.getAllEvents = (cnt?: number) => {\n                if (_indexedDb == null || !_indexedDb.isAvailable()) {\n                    return [];\n                }\n\n                return _openDb<IStorageTelemetryItem[]>((dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>) => {\n                    return createAsyncPromise<IStorageTelemetryItem[]>((allEventsResolve, allEventsReject) => {\n                        _getAllEvents(dbCtx, null, cnt).then(\n                            (values: IIndexedDbItem[]) => {\n                                //TODO: orderEvents By CriticalCnt\n                                allEventsResolve(_getEvents(values));\n                            },\n                            allEventsReject);\n                    });\n                });\n            };\n\n            /**\n             * Get all of the currently cached events( with given number) from the storage mechanism\n             */\n            _this.getNextBatch = () => {\n                if (_indexedDb == null || !_indexedDb.isAvailable()) {\n                    return [];\n                }\n\n                // Start an asynchronous set of events to access the Db, this first one will wait until all current outstanding\n                // events are completed or rejected\n                return _openDb<IStorageTelemetryItem[]>((dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>) => {\n                    return createAsyncPromise<IStorageTelemetryItem[]>((allEventsResolve, allEventsReject) => {\n                        _getAllEvents(dbCtx, null, 1).then(\n                            (values: IIndexedDbItem[]) => {\n                                allEventsResolve(_getEvents(values));\n                            },\n                            allEventsReject);\n                    });\n                });\n            };\n\n            /**\n             * Stores the value into the storage using the specified key.\n             * @param key - The key value to use for the value\n             * @param value - The actual value of the request\n             */\n            _this.addEvent = (key: string, item: IStorageTelemetryItem, itemCtx: IProcessTelemetryContext) => {\n                if (_indexedDb == null || !_indexedDb.isAvailable()) {\n                    return item;\n                }\n\n                item.id = item.id || getTimeId();\n                item.criticalCnt = item.criticalCnt || 0;\n\n                return _openDb<IStorageTelemetryItem>(\n                    (dbCtx) => {\n                        let eventKey = key || item.id;\n                        let dbItem: IIndexedDbItem = {\n                            id: eventKey,\n                            evt: item,\n                            tm: _getTime(),\n                            v: StoreVersion\n                        };\n                        return _addDbEvent(dbCtx, dbItem, true);\n                    });\n            };\n\n            /**\n             * Removes the values\n             * @param evts - */\n\n            _this.removeEvents = (evts: IStorageTelemetryItem[]) => {\n                if (_indexedDb == null || !_indexedDb.isAvailable()) {\n                    return [];\n                }\n\n                let removedEvents: IStorageTelemetryItem[] = [];\n                return createAsyncPromise<IStorageTelemetryItem[]>((removeEventsResolve, removeEventsReject) => {\n                    // Open the Db store, this will handling resolving and rejecting this promise via the passed resolve/reject functions\n                    _openDb<IIndexedDbItem[]>((dbCtx) => {\n                        return dbCtx.openCursor<IIndexedDbItem>(\n                            EventObjectStoreName,\n                            null,\n                            (cursorState, value: IIndexedDbItem, values: IIndexedDbItem[]) => {\n                                if (_getId(value.id, evts) !== -1) {\n                                    \n                                    let deleteRequest = cursorState.cursor.delete();\n                                    deleteRequest.onerror = _cursorContinueEvent(cursorState);\n                                    deleteRequest.onsuccess = () => {\n                                        removedEvents.push(value.evt);\n                                        cursorState.continue();\n                                    };\n\n                                    return CursorProcessResult.Waiting;\n\n                                }\n                              \n                                return CursorProcessResult.Continue;\n                            });\n                    }).then(() => {\n                        removeEventsResolve(removedEvents);                         // Resolve the RemoveEvents call promise\n                    },\n                    (reason) => {\n                        removeEventsResolve(removedEvents);                         // Resolve the RemoveEvents call promise\n                    });\n                });\n            };\n\n            /**\n             * Removes all entries from the storage provider and returns them as part of the response, if there are any.\n             */\n            _this.clear = (disable?: boolean) => {\n                if (_indexedDb == null || !_indexedDb.isAvailable() || !!disable) {\n                    return [];\n                }\n\n                return createAsyncPromise<IStorageTelemetryItem[]>((clearResolve, clearReject) => {\n                    _openDb<IIndexedDbItem[]>((dbCtx) => {\n                        //delete all evts\n                        return _deleteEvents(dbCtx, null, (value) => {\n                            return true;\n                        });\n                    }).then(\n                        (values: IIndexedDbItem[]) => {\n                            clearResolve(_getEvents(values));\n                        }, (reason) => {\n                            clearResolve([]);\n                        }\n                    )\n                });\n            };\n\n            _this.clean = (disable?: boolean) => {\n                if (_indexedDb == null || !_indexedDb.isAvailable() || !!disable) {\n                    return false;\n                }\n\n                return createAsyncPromise<boolean>((cleanResolve, cleanReject) => {\n                    _openDb<IIndexedDbItem[]>((dbCtx) => {\n                        if (dbCtx.isNew) {\n                            return [];\n                        }\n                        return _dropMaxTimeEvents(dbCtx, _maxStorageTime);\n                    }).then(\n                        (value:IIndexedDbItem[]) => {\n                            let cnt = value && value.length;\n                            if (_notificationManager && cnt) {\n                                batchDropNotification(_notificationManager, cnt, eBatchDiscardedReason.MaxInStorageTimeExceeded);\n                            }\n                            cleanResolve(cnt && cnt > 0);\n                        },(reason) => {\n                            cleanResolve(false);\n                        }\n                    );\n                });\n\n            };\n\n            /**\n             * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n             * This attempts to update the lastAccessTime for any storedDb\n             */\n            _this.teardown = (): void => {\n                if (_indexedDb) {\n                    _indexedDb.closeDb(_dbName);\n                }\n            };\n\n            /**\n             * Schedules the opening of the database if not already open\n             */\n            function _openDb<T>(processFunc: (dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>) => T | IPromise<T>): IPromise<T> {\n                function _handleDbUpgrade(dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>) {\n                    return createAsyncPromise<void>((createResolve, createReject) => {\n                        try {\n                            _createDb(dbCtx.db);\n\n                        } catch(e) {\n                            createReject(e);\n                        }\n                        createResolve();\n                    });\n                }\n\n                function _handleDbOpen(dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>) {\n                    return createAsyncPromise<T>((openResolve, openReject) => {\n                        let providerCtx: IProviderDbContext = {\n                            iKey: _iKey,\n                            id: _endpoint,\n                            storageId: _storageId\n                        };\n\n                        dbCtx.ctx = providerCtx;\n                        doAwait(processFunc(dbCtx), openResolve, openReject);\n                    });\n                }\n                return _indexedDb.openDb<T>(\n                    _dbName,\n                    DbVersion,\n                    _handleDbOpen,\n                    _handleDbUpgrade);\n            }\n\n            function _addDbEvent(\n                dbCtx: IIndexedDbOpenDbContext<IProviderDbContext>,\n                dbItem: IIndexedDbItem,\n                doRetry: boolean): IPromise<IStorageTelemetryItem> {\n\n                return createAsyncPromise<IStorageTelemetryItem>((addEventResolve, addEventReject) => {\n                    function dropEvents(droppedFunc: (droppedCount: number) => void) {\n                        // Try and clear space by dropping the Normal level events, note dropEvents promise never rejects\n                        _dropEventsUpToPersistence(dbCtx, _maxCriticalCnt, _eventDropPerTime).then(\n                            (droppedCount) => {\n                                if (_notificationManager && droppedCount) {\n                                    batchDropNotification(_notificationManager, droppedCount, eBatchDiscardedReason.CleanStorage);\n                                }\n                                droppedFunc(droppedCount);\n                            }, (reason) => {\n                                // won't throw errors here, unblock following process\n                                droppedFunc(0);\n                            });\n                    }\n\n         \n                    function _insertNewEvent() {\n                     \n                        dbCtx.openStore(EventObjectStoreName, (storeCtx) => {\n                            let request = storeCtx.store.put(dbItem);\n                            request.onsuccess = (evt) => {\n                                addEventResolve(dbItem.evt);\n                            };\n                            request.onerror = (evt: Event) => {\n                                if (!doRetry) {\n                                    addEventReject(new Error(ErrorMessageUnableToAddEvent));                // Reject the calling promise\n                                    return;\n                                }\n\n                                function _retryAddEvent(dropCount: number) {\n                                    if (dropCount === 0) {\n                                        // We failed to free up space so just reject\n                                        addEventReject(new Error(ErrorMessageUnableToAddEvent));             // Reject the calling promise\n                                    }\n\n                                    // Retry sending the event\n                                    _addDbEvent(dbCtx, dbItem, false).then(\n                                        (theItem) => {\n                                            addEventResolve(dbItem.evt);                                     // Resolve the calling add Event promise\n                                        }, () => {\n                                            addEventReject(new Error(ErrorMessageUnableToAddEvent));         // Reject the calling promise\n                                        });\n                                }\n\n                                dropEvents((droppedCount: number) => {\n                                    if (droppedCount > 0) {\n                                        // We dropped some events so lets try adding the item again\n                                        _retryAddEvent(droppedCount);\n                                    } else {\n                                        // We have already tried to remove all we can\n                                        addEventReject(new Error(ErrorMessageUnableToAddEvent));         // Reject the calling promise\n                                    }\n                                });\n                            };\n                        }).catch((e)=> {\n                            addEventReject(e);\n                        });\n                    }\n                    _insertNewEvent();\n                });\n            }\n        });\n    }\n\n    /**\n     * Initializes the provider using the config\n     * @param providerContext - The provider context that should be used to initialize the provider\n     * @returns True if the provider is initialized and available for use otherwise false\n     */\n    public initialize(providerContext: ILocalStorageProviderContext): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Identifies whether this storage provider support synchronous requests\n    */\n    public supportsSyncRequests(): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Get all of the currently cached events from the storage mechanism\n     */\n    public getNextBatch(): IStorageTelemetryItem[] | IPromise<IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get all of the currently cached events from the storage mechanism\n     */\n    public getAllEvents(cnt?: number): IStorageTelemetryItem[] | IPromise< IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Stores the value into the storage using the specified key.\n     * @param key - The key value to use for the value\n     * @param evt - The actual event of the request\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    public addEvent(key: string, evt: any, itemCtx: IProcessTelemetryContext): IStorageTelemetryItem | IPromise<IStorageTelemetryItem> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Removes the value associated with the provided key\n     * @param evts - The events to be removed\n     */\n    public removeEvents(evts: any[]): IStorageTelemetryItem[] | IPromise<IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return\n    }\n\n    /**\n     * Removes all entries from the storage provider, if there are any.\n     */\n    public clear(disable?: boolean): IStorageTelemetryItem[] | IPromise<IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Removes all entries with stroage time longer than inStorageMaxTime from the storage provider\n     */\n    public clean(disable?: boolean): boolean | IPromise<boolean> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n     */\n    public teardown(): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/Providers/WebStorageProvider.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    INotificationManager, IProcessTelemetryContext, IUnloadHookContainer, eBatchDiscardedReason, getGlobal, getJSON, isNotNullOrUndefined,\n    onConfigChange\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, createAsyncRejectedPromise } from \"@nevware21/ts-async\";\nimport { batchDropNotification, forEachMap, getEndpointDomain, getTimeFromId, getTimeId } from \"../Helpers/Utils\";\nimport {\n    ILocalStorageProviderContext, IOfflineChannelConfiguration, IOfflineProvider, IStorageJSON, IStorageTelemetryItem\n} from \"../Interfaces/IOfflineProvider\";\nimport { PayloadHelper } from \"../PayloadHelper\";\n\n//TODO: move all const to one file\nconst EventsToDropAtOneTime = 10;\nconst Version = \"1\";\nconst DefaultStorageKey = \"AIOffline\";\nconst DefaultMaxStorageSizeInBytes = 5000000;\nconst MaxCriticalEvtsDropCnt = 2;\nconst DefaultMaxInStorageTime = 604800000; //7*24*60*60*1000 7days\n// [Optional for version 1]: TODO: order event by time\n\ninterface IJsonStoreDetails {\n    key: string;\n    db: IStorageJSON;\n}\n\n// Private helper methods that are not exposed as class methods\nfunction _isQuotaExceeded(storage: Storage, e) {\n    let result = false;\n    if (e instanceof DOMException) {\n        // test name field too, because code might not be present\n        if (e.code === 22 || e.name === \"QuotaExceededError\" ||            // everything except Firefox\n            e.code === 1014 || e.name === \"NS_ERROR_DOM_QUOTA_REACHED\") {   // Firefox\n            if (storage && storage.length !== 0) {\n                // acknowledge QuotaExceededError only if there's something already stored\n                result = true;\n            }\n        }\n    }\n\n    return result;\n}\n\n/**\n* Check and return that the storage type exists and has space to use\n*/\nfunction _getAvailableStorage(type: string): Storage {\n    let global = getGlobal() || ({} as Window);\n    let storage: Storage = null;\n    try {\n        storage = ((global[type]) as Storage);\n        if (storage) {\n            let x = \"__storage_test__\";\n            storage.setItem(x, x);\n            storage.removeItem(x);\n        }\n    } catch (e) {\n        if (!_isQuotaExceeded(storage, e)) {\n            // If not Quota exception then assume not available\n            storage = null;\n        }\n    }\n\n    return storage;\n}\n\n\n// will drop batches with no critical evts first\nfunction _dropEventsUpToPersistence(\n    maxCnt: number,\n    events: { [id: string]: IStorageTelemetryItem },\n    eventsToDropAtOneTime: number): number {\n    let dropKeys = [];\n    let persistenceCnt = 0;\n    let droppedEvents = 0;\n    while (persistenceCnt <= maxCnt && droppedEvents < eventsToDropAtOneTime) {\n        forEachMap<IStorageTelemetryItem>(events, (evt, key) => {\n            if (evt.criticalCnt === persistenceCnt) {\n                dropKeys.push(key);\n                droppedEvents++;\n            }\n            return (droppedEvents < eventsToDropAtOneTime);\n        });\n        if (droppedEvents > 0) {\n            for (let lp = 0; lp < dropKeys.length; lp++) {\n                delete events[dropKeys[lp]];\n            }\n            return droppedEvents;\n        }\n\n        persistenceCnt++;\n    }\n\n    return droppedEvents;\n}\n\nfunction _dropMaxTimeEvents(\n    maxStorageTime: number,\n    events: { [id: string]: IStorageTelemetryItem },\n    eventsToDropAtOneTime: number,\n    mgr?: INotificationManager): boolean {\n    let dropKeys = [];\n    let droppedEvents = 0;\n    let currentTime = (new Date()).getTime() + 1; // handle appended random float number\n    let minStartTime = (currentTime - maxStorageTime);\n    try {\n        forEachMap<IStorageTelemetryItem>(events, (evt, key) => {\n            let id = getTimeFromId(key);\n            if (id <= minStartTime) {\n                dropKeys.push(key);\n                droppedEvents++;\n            }\n            return (droppedEvents < eventsToDropAtOneTime);\n        });\n    \n        if (droppedEvents > 0) {\n            for (let lp = 0; lp < dropKeys.length; lp++) {\n                delete events[dropKeys[lp]];\n            }\n            if (mgr) {\n                batchDropNotification(mgr, droppedEvents, eBatchDiscardedReason.MaxInStorageTimeExceeded);\n            }\n           \n            return true;\n        }\n\n    } catch (e) {\n        // catch drop events error\n    }\n\n    return droppedEvents > 0;\n}\n\n\n\n/**\n * Class that implements storing of events using the WebStorage Api ((window||globalThis||self).localstorage, (window||globalThis||self).sessionStorage).\n */\nexport class WebStorageProvider implements IOfflineProvider {\n    public id: string;\n\n    /**\n     * Creates a WebStorageProvider using the provider storageType\n     * @param storageType - The type of Storage provider, normal values are \"localStorage\" or \"sessionStorage\"\n     */\n    constructor(storageType: string, id?: string, unloadHookContainer?: IUnloadHookContainer) {\n        dynamicProto(WebStorageProvider, this, (_this) => {\n            let _storage: Storage = null;\n            let _storageKeyPrefix: string = DefaultStorageKey;\n            let _maxStorageSizeInBytes: number = DefaultMaxStorageSizeInBytes;\n            let _payloadHelper: PayloadHelper = null;\n            let _storageKey: string = null;\n            let _endpoint: string = null;\n            let _maxStorageTime: number = null;\n            let _eventDropPerTime: number = null;\n            let _maxCriticalCnt: number = null;\n            let _notificationManager: INotificationManager = null;\n\n            _this.id = id;\n\n            _storage = _getAvailableStorage(storageType) || null;\n\n            _this[\"_getDbgPlgTargets\"] = () => {\n                return [_storageKey, _maxStorageSizeInBytes, _maxStorageTime];\n            };\n\n            _this.initialize = (providerContext: ILocalStorageProviderContext, endpointUrl?: string) => {\n                if (!_storage) {\n                    return false;\n                }\n               \n                let storageConfig: IOfflineChannelConfiguration = providerContext.storageConfig;\n                let itemCtx = providerContext.itemCtx;\n                _payloadHelper = new PayloadHelper(itemCtx.diagLog());\n                _endpoint = getEndpointDomain(endpointUrl || providerContext.endpoint);\n                let autoClean = !!storageConfig.autoClean;\n                _notificationManager = providerContext.notificationMgr;\n\n                let unloadHook = onConfigChange(storageConfig, () => {\n                    _maxStorageSizeInBytes = storageConfig.maxStorageSizeInBytes || DefaultMaxStorageSizeInBytes; // value checks and defaults should be applied during core config\n                    _maxStorageTime = storageConfig.inStorageMaxTime || DefaultMaxInStorageTime; // TODO: handle 0\n                    let dropNum = storageConfig.EventsToDropPerTime;\n                    _eventDropPerTime = isNotNullOrUndefined(dropNum)? dropNum : EventsToDropAtOneTime;\n                    _maxCriticalCnt = storageConfig.maxCriticalEvtsDropCnt || MaxCriticalEvtsDropCnt;\n                  \n                });\n                unloadHookContainer && unloadHookContainer.add(unloadHook);\n\n                // currently, won't handle endpoint change here\n                // new endpoint will open a new db\n                // endpoint change will be handled at offline batch level\n                // namePrefix should not contain any \"_\"\n                _storageKeyPrefix = storageConfig.storageKeyPrefix || DefaultStorageKey;\n                _storageKey = _storageKeyPrefix + \"_\" + Version + \"_\" + _endpoint;\n\n                if (autoClean) {\n                    // won't wait response here\n                    _this.clean();\n                }\n\n                \n                // TODO: handle versoin Upgrade\n                //_checkVersion();\n             \n\n                return true;\n            };\n\n            /**\n              * Identifies whether this storage provider support synchronous requests\n             */\n            _this.supportsSyncRequests = () => {\n                return true;\n            };\n\n            /**\n             * Get all of the currently cached events from the storage mechanism\n             */\n            _this.getAllEvents = (cnt?: number) => {\n                try {\n                    if (!_storage) {\n                        // if not init, return null\n                        return;\n                    }\n                    return _getEvts(cnt);\n                    \n                } catch (e) {\n                    return createAsyncRejectedPromise(e);\n                }\n            };\n\n            \n            /**\n             * Get Next cached event from the storage mechanism\n             */\n            _this.getNextBatch = () => {\n                try {\n                    if (!_storage) {\n                        // if not init, return null\n                        return;\n                    }\n                    // set ordered to true, to make sure to get earliest events first\n                    return _getEvts(1, true);\n                    \n                } catch (e) {\n                    return createAsyncRejectedPromise(e);\n                }\n            };\n\n            function _getEvts(cnt?: number, ordered?: boolean) {\n                let allItems: IStorageTelemetryItem[] = [];\n                let theStore = _fetchStoredDb(_storageKey).db;\n                if (theStore) {\n                    let events = theStore.evts;\n                    forEachMap(events, (evt) => {\n                        if (evt) {\n                            if (evt.isArr) {\n                                evt = _payloadHelper.base64ToArr(evt);\n                            }\n                            allItems.push(evt);\n                        }\n                        if(cnt && allItems && allItems.length == cnt) {\n                            return false;\n                        }\n                        return true;\n                    }, ordered);\n                }\n                return  allItems;\n                    \n            }\n\n\n            /**\n             * Stores the value into the storage using the specified key.\n             * @param key - The key value to use for the value\n             * @param value - The actual value of the request\n             */\n            _this.addEvent = (key: string, evt: IStorageTelemetryItem, itemCtx: IProcessTelemetryContext)  => {\n                try {\n                    let theStore = _fetchStoredDb(_storageKey);\n                    evt.id = evt.id || getTimeId();\n                    evt.criticalCnt = evt.criticalCnt || 0;\n                    let events = theStore.db.evts;\n                    let id = evt.id;\n                    if (evt && evt.isArr) {\n                        evt = _payloadHelper.base64ToStr(evt);\n                    }\n                    let preDroppedCnt = 0;\n\n                    // eslint-disable-next-line no-constant-condition\n                    while (true && evt) {\n                        events[id] = evt;\n                        if (_updateStoredDb(theStore)) {\n                            // Database successfully updated\n                            if (preDroppedCnt && _notificationManager) {\n                                // only send notification when batches are updated successfully in storage\n                                batchDropNotification(_notificationManager, preDroppedCnt, eBatchDiscardedReason.CleanStorage);\n                            }\n                            return evt;\n                        }\n\n                        // Could not not add events to storage assuming its full, so drop events to make space\n                        // or max size exceeded\n                        delete events[id];\n                        let droppedCnt = _dropEventsUpToPersistence(_maxCriticalCnt, events, _eventDropPerTime);\n                        preDroppedCnt += droppedCnt;\n                        if (!droppedCnt) {\n                            // Can't free any space for event\n                            return createAsyncRejectedPromise(new Error(\"Unable to free up event space\"));\n                        }\n                    }\n                } catch (e) {\n                    return createAsyncRejectedPromise(e);\n                }\n            };\n\n            /**\n             * Removes the value associated with the provided key\n             * @param evts - The events to be removed\n             */\n            _this.removeEvents = (evts: IStorageTelemetryItem[]) => {\n                try {\n                    let theStore = _fetchStoredDb(_storageKey, false);\n                    let currentDb = theStore.db;\n                    if (currentDb) {\n                        let events = currentDb.evts;\n                        try {\n                            for (let i = 0; i < evts.length; ++i) {\n                                let evt = evts[i];\n                                delete events[evt.id];\n                            }\n\n                            // Update takes care of removing the DB if it's completely empty now\n                            if (_updateStoredDb(theStore)) {\n                                return evts;\n                            }\n                        } catch (e) {\n                            // Storage corrupted\n                        }\n\n                        // failure here so try and remove db to unblock following events\n                        evts = _clearDatabase(theStore.key);\n                        \n                    }\n\n                    return evts;\n                } catch (e) {\n                    return createAsyncRejectedPromise(e);\n                }\n            };\n\n            /**\n             * Removes all entries from the storage provider for the current endpoint and returns them as part of the response, if there are any.\n             */\n            _this.clear = () => {\n                try {\n                    let removedItems: IStorageTelemetryItem[] = [];\n                    let theStore = _fetchStoredDb(_storageKey, false);\n                    let storedDb = theStore.db;\n                    if (storedDb) {\n                        let events = storedDb.evts;\n                        forEachMap(events, (evt) => {\n                            if (evt) {\n                                delete events[evt.id]\n                                removedItems.push(evt);\n                            }\n\n                            return true;\n                        });\n\n                        _updateStoredDb(theStore);\n                    }\n\n                    return removedItems;\n                } catch (e) {\n                    // Unable to clear the database\n                    return createAsyncRejectedPromise(e);\n                }\n            };\n\n            _this.clean = () => {\n                let storeDetails = _fetchStoredDb(_storageKey, false);\n                let currentDb = storeDetails.db;\n                if (currentDb) {\n                    let events = currentDb.evts;\n                    try {\n                        let isDropped = _dropMaxTimeEvents(_maxStorageTime, events, _eventDropPerTime, _notificationManager);\n                        if (isDropped) {\n                            return _updateStoredDb(storeDetails);\n                        }\n                        return true;\n                        \n                    } catch (e) {\n                        // should not throw errors here\n                        // because we don't want to block following process\n                    }\n                    return false;\n                }\n\n            };\n\n            /**\n             * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n             * This attempts to update the lastAccessTime for any storedDb\n             */\n            _this.teardown = (): void => {\n                try {\n                    let theStore = _fetchStoredDb(_storageKey, false);\n                    let storedDb = theStore.db;\n                    if (storedDb) {\n                        // reset the last access time\n                        storedDb.lastAccessTime = 0;\n                        _updateStoredDb(theStore, false);\n                    }\n                } catch (e) {\n                    // Add diagnostic logging\n                }\n            };\n\n            /**\n             * @ignore\n             * Creates a new json store with the StorageJSON (may be null), a null db value indicates that the store\n             * associated with the key is empty and should be removed.\n             * @param dbKey - The key to associate with the database\n             * @param db - The database\n             */\n            function _newStore(dbKey: string, db: IStorageJSON): IJsonStoreDetails {\n                return {\n                    key: dbKey,\n                    db: db\n                };\n            }\n\n            function _fetchStoredDb(dbKey: string, returnDefault = true): IJsonStoreDetails {\n                let dbToStore: IStorageJSON = null;\n                if (_storage) {\n                    let previousDb = _storage.getItem(dbKey);\n                 \n                    if (previousDb) {\n                        try {\n                            dbToStore = getJSON().parse(previousDb);\n                        } catch (e) {\n                            // storage corrupted\n                            _storage.removeItem(dbKey);\n                        }\n                    }\n\n                    if (returnDefault && !dbToStore) {\n                        // Create and return a default empty database\n                        dbToStore = {\n                            evts: {},\n                            lastAccessTime: 0\n                        };\n                    }\n                }\n\n                return _newStore(dbKey, dbToStore);\n            }\n\n            function _updateStoredDb(jsonStore: IJsonStoreDetails, updateLastAccessTime = true): boolean {\n                //let removeDb = true;\n                let dbToStore = jsonStore.db;\n                if (dbToStore) {\n                    if (updateLastAccessTime) {\n                        // Update the last access time\n                        dbToStore.lastAccessTime = (new Date()).getTime();\n                    }\n                }\n\n                try {\n\n                    let jsonString = getJSON().stringify(dbToStore);\n                    if (jsonString.length > _maxStorageSizeInBytes) {\n                        // We can't store the database as it would exceed the configured max size\n                        return false;\n                    }\n\n                    _storage && _storage.setItem(jsonStore.key, jsonString);\n                    //}\n                } catch (e) {\n                    // catch exception due to trying to store or clear JSON\n                    // We could not store the database\n                    return false;\n                }\n\n                return true;\n            }\n\n            function _clearDatabase(dbKey: string): IStorageTelemetryItem[] {\n                let removedItems: IStorageTelemetryItem[] = [];\n                let storeDetails = _fetchStoredDb(dbKey, false);\n                let currentDb = storeDetails.db;\n                if (currentDb) {\n                    let events = currentDb.evts;\n                    try {\n                        forEachMap(events, (evt) => {\n                            if (evt) {\n                                removedItems.push(evt);\n                            }\n\n                            return true;\n                        });\n                        \n                    } catch (e) {\n                        // catch exception due to trying to store or clear JSON\n                    }\n\n                    // Remove the entire stored database\n                    _storage && _storage.removeItem(storeDetails.key);\n                }\n\n                return removedItems;\n            }\n\n        });\n    }\n\n    /**\n     * Initializes the provider using the config\n     * @param providerContext - The provider context that should be used to initialize the provider\n     * @returns True if the provider is initialized and available for use otherwise false\n     */\n    public initialize(providerContext: ILocalStorageProviderContext): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Identifies whether this storage provider support synchronous requests\n    */\n    public supportsSyncRequests(): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Get all of the currently cached events from the storage mechanism\n     */\n    public getAllEvents(cnt?: number): IStorageTelemetryItem[] | IPromise< IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get the Next one cached batch from the storage mechanism\n     */\n    public getNextBatch(): IStorageTelemetryItem[] | IPromise< IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n\n    /**\n     * Stores the value into the storage using the specified key.\n     * @param key - The key value to use for the value\n     * @param evt - The actual event of the request\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    public addEvent(key: string, evt: any, itemCtx: IProcessTelemetryContext): IStorageTelemetryItem | IPromise<IStorageTelemetryItem> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Removes the value associated with the provided key\n     * @param evts - The events to be removed\n     */\n    public removeEvents(evts: any[]): IStorageTelemetryItem[] | IPromise<IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Removes all entries from the storage provider, if there are any.\n     */\n    public clear(): IStorageTelemetryItem[] | IPromise<IStorageTelemetryItem[]> | null {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Removes all entries with stroage time longer than inStorageMaxTime from the storage provider\n     */\n    public clean(): boolean | IPromise<boolean> {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return;\n    }\n\n    /**\n     * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\n     */\n    public teardown(): void {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/Sender.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BreezeChannelIdentifier, IAppInsightsCore, IConfig, IConfiguration, IDiagnosticLogger, IProcessTelemetryContext,\n    IProcessTelemetryUnloadContext, ITelemetryUnloadState, IUnloadHookContainer, IXDomainRequest, IXHROverride, OnCompleteCallback,\n    SendRequestReason, SenderPostManager, TransportType, _ISendPostMgrConfig, _ISenderOnComplete, _eInternalMessageId, _throwInternal,\n    createProcessTelemetryContext, eLoggingSeverity, formatErrorMessageXdr, getResponseText, onConfigChange, parseResponse,\n    prependTransports, utlSetStoragePrefix\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { isFunction } from \"@nevware21/ts-utils\";\nimport { IOfflineChannelConfiguration, IOfflineSenderConfig } from \"./Interfaces/IOfflineProvider\";\n\nconst DefaultOfflineIdentifier = \"OfflineChannel\";\nconst PostChannelId = \"PostChannel\";\n\nfunction isOverrideFn(httpXHROverride: any) {\n    return httpXHROverride && httpXHROverride.sendPOST;\n}\n\n\nexport type SenderFunction = (payload: string[], isAsync: boolean) => void | IPromise<boolean>;\n\nexport class Sender {\n\n    public _appId: string; //TODO: set id\n\n    constructor() {\n\n        let _consecutiveErrors: number;         // How many times in a row a retryable error condition has occurred.\n        let _retryAt: number;                   // The time to retry at in milliseconds from 1970/01/01 (this makes the timer calculation easy).\n        let _paused: boolean;                   // Flag indicating that the sending should be paused\n        let _enableSendPromise: boolean;\n        let _alwaysUseCustomSend: boolean;\n        let _isInitialized: boolean;\n        let _diagLog: IDiagnosticLogger;\n        let _core: IAppInsightsCore;\n        let _httpInterface: IXHROverride;\n        let _onlineChannelId: string;\n        let _isOneDs: boolean;\n        let _sendPostMgr: SenderPostManager;\n        let _disableCredentials: boolean;\n        let _fetchCredentials: RequestCredentials;\n       \n\n        dynamicProto(Sender, this, (_self, _base) => {\n\n            //let _sendCredentials = true; // for 1ds\n            _initDefaults();\n\n            _self.pause = () => {\n                _clearScheduledTimer();\n                _paused = true;\n            };\n        \n            _self.resume = () => {\n                if (_paused) {\n                    _paused = false;\n                    _retryAt = null;\n                }\n            };\n\n            _self.getXhrInst = (sync?: boolean): IXHROverride => {\n                // unload events will be saved. so not return unload interface\n                return _httpInterface;\n            }\n        \n            _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, cxt: IProcessTelemetryContext, diagLog: IDiagnosticLogger,  channelId?: string, unloadHookContainer?: IUnloadHookContainer): void => {\n                \n                _diagLog = diagLog || core.logger;\n                if (_isInitialized) {\n                    _throwInternal(_diagLog, eLoggingSeverity.CRITICAL, _eInternalMessageId.SenderNotInitialized, \"Sender is already initialized\");\n                }\n                _core = core;\n                _consecutiveErrors = 0;\n                _retryAt = null;\n\n                // This function will be re-called whenever any referenced configuration is changed\n                let hook = onConfigChange(config, (details) => {\n                    let config = details.cfg;\n                    if (config.storagePrefix){\n                        utlSetStoragePrefix(config.storagePrefix);\n                    }\n                    let ctx = createProcessTelemetryContext(null, config, core);\n\n                    let offlineCfg = ctx.getExtCfg(DefaultOfflineIdentifier) as IOfflineChannelConfiguration;\n                    _onlineChannelId = channelId || BreezeChannelIdentifier;\n                    let senderConfig = ctx.getExtCfg(_onlineChannelId, {}) as any;\n                    let offlineSenderCfg = offlineCfg.senderCfg || {} as IOfflineSenderConfig;\n                    _fetchCredentials = null;\n                    if (_onlineChannelId == PostChannelId) {\n                        _isOneDs = true;\n                        let channelConfig = ctx.getExtCfg(PostChannelId);\n                        if (channelConfig && channelConfig[\"fetchCredentials\"]) {\n                            _fetchCredentials = channelConfig[\"fetchCredentials\"];\n                        }\n                    }\n\n                    _alwaysUseCustomSend = offlineSenderCfg.alwaysUseXhrOverride;\n\n                    // default true\n                    _enableSendPromise = !(senderConfig.enableSendPromise === false);\n                    let xhrOverride = offlineSenderCfg.httpXHROverride || senderConfig.httpXHROverride;\n\n                    let customInterface = isOverrideFn(xhrOverride)? xhrOverride : null;\n                    _disableCredentials = !customInterface && _isOneDs;\n                    let sendPostMgrConfig = _getSendPostMgrConfig();\n                    if (!_sendPostMgr) {\n                        _sendPostMgr = new SenderPostManager();\n                        _sendPostMgr.initialize(sendPostMgrConfig, _diagLog);\n                    } else {\n                        _sendPostMgr.SetConfig(sendPostMgrConfig);\n                    }\n\n                    let httpInterface: IXHROverride = null;\n                    let customTransPorts = offlineSenderCfg.transports || senderConfig.transports || [];\n                    \n                    let theTransports: TransportType[] = prependTransports([TransportType.Xhr, TransportType.Fetch, TransportType.Beacon], customTransPorts);\n                    httpInterface = _sendPostMgr.getSenderInst(theTransports, false);\n                    let xhrInterface = _sendPostMgr.getFallbackInst();\n                    httpInterface = _alwaysUseCustomSend? customInterface : (httpInterface || customInterface || xhrInterface);\n                    _httpInterface = httpInterface || xhrInterface;\n\n                });\n                unloadHookContainer && unloadHookContainer.add(hook);\n            };\n            \n\n            _self.isCompletelyIdle = (): boolean => {\n                let syncPayload = 0;\n                try {\n                    let senderPlugin = (_core.getPlugin(_onlineChannelId).plugin as any);\n                    if (senderPlugin && isFunction(senderPlugin.isCompletelyIdle)) {\n                        if(!senderPlugin.isCompletelyIdle()) {\n                            return false;\n                        }\n                    }\n                    if (_sendPostMgr) {\n                        syncPayload = _sendPostMgr.getSyncFetchPayload();\n                    }\n\n\n                } catch (e) {\n                    // if can't get idle status of online sender, then isidle status only depends on offine sender idle status\n\n                }\n                \n                return !_paused && syncPayload === 0;\n            };\n            // partial 206, parse payload (not send again)\n        \n        \n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _initDefaults();\n            };\n\n            /**\n             * success handler\n             */\n            function _onSuccess (res?: string, onComplete?: OnCompleteCallback) {\n                _doOnComplete(onComplete, 200, {}, res);\n            }\n\n            function _getSendPostMgrConfig(): _ISendPostMgrConfig {\n                let config = {\n                    enableSendPromise: _enableSendPromise,\n                    isOneDs: _isOneDs,\n                    disableCredentials: _disableCredentials,\n                    fetchCredentials: _fetchCredentials,\n                    senderOnCompleteCallBack: _getOnCompleteFuncs()\n                } as _ISendPostMgrConfig;\n\n                return config;\n            }\n\n            /**\n             * error handler\n             */\n            function _onError(message: string, onComplete?: OnCompleteCallback) {\n                _throwInternal(_diagLog,\n                    eLoggingSeverity.WARNING,\n                    _eInternalMessageId.OnError,\n                    \"Failed to send telemetry.\",\n                    { message });\n                _doOnComplete(onComplete, 400, {});\n            }\n\n\n            function _getOnCompleteFuncs(): _ISenderOnComplete {\n                let funcs = {\n                    xdrOnComplete: (response: IXDomainRequest, oncomplete: OnCompleteCallback) => {\n                        return _xdrOnLoad(response, oncomplete);\n                    },\n                    fetchOnComplete: (response: Response, onComplete: OnCompleteCallback, resValue?: string) => {\n                        let status = response.status;\n                        return _handleResponse(onComplete, status, {}, resValue);\n                    },\n                    xhrOnComplete: (request, oncomplete) => {\n                        let response = getResponseText(request);\n                        return _handleResponse(oncomplete, request.status, {}, response);\n                    }\n                } as _ISenderOnComplete;\n                return funcs;\n            }\n\n\n\n            function _doOnComplete(oncomplete: OnCompleteCallback, status: number, headers: { [headerName: string]: string }, response?: string) {\n                try {\n                    oncomplete && oncomplete(status, headers, response);\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            }\n\n\n\n            function _handleResponse(oncomplete: OnCompleteCallback, status: number, headers?: {}, response?: string) {\n                if (status == 206 && !_isOneDs) {\n                    // for breeze, 206 is partially success, currently consider success\n                    // TODO: handle partial success\n                    _doOnComplete(oncomplete, 200, headers, response);  // TODO: doc (support partial success)-> partial success add known issue (breeze)\n                } else if (status == 204 && _isOneDs) {\n                    // one collector\n                    _doOnComplete(oncomplete, 200, headers, response);\n\n                } else {\n                    _doOnComplete(oncomplete, status, headers, response);\n                }\n\n            }\n\n            function _clearScheduledTimer() {\n                _retryAt = null;\n            }\n        \n            /**\n             * xdr state changes\n             */\n            function _xdrOnLoad(xdr: IXDomainRequest, oncomplete: OnCompleteCallback){\n                const responseText = getResponseText(xdr);\n                if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\n                    _consecutiveErrors = 0;\n                    _onSuccess(responseText, oncomplete);\n                } else {\n                    const results = parseResponse(responseText, _diagLog);\n                    if (results && results.itemsAccepted) {\n                        // TODO: onPartial success for appInsights\n                        _onSuccess(responseText, oncomplete);\n\n                    } else {\n                        _onError(formatErrorMessageXdr(xdr), oncomplete);\n                    }\n                }\n            }\n        \n        \n            function _initDefaults() {\n                _self._appId = null;\n                _consecutiveErrors = 0;\n                _retryAt = null;\n                _paused = false;\n                _isInitialized = false;\n                _core = null;\n                _onlineChannelId = null;\n                _sendPostMgr = null;\n            }\n        });\n    }\n\n    /**\n     * Pause the sending (transmission) of events, this will cause all events to be batched only until the maximum limits are\n     * hit at which point new events are dropped. Will also cause events to NOT be sent during page unload, so if Session storage\n     * is disabled events will be lost.\n     */\n    public pause(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resume the sending (transmission) of events, this will restart the timer and any batched events will be sent using the normal\n     * send interval.\n     */\n    public resume(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, cxt: IProcessTelemetryContext, diagLog: IDiagnosticLogger,  channelId?: string, unloadHookContainer?: IUnloadHookContainer): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n   \n    /**\n     * Trigger the immediate send of buffered data; If executing asynchronously (the default) this may (not required) return\n     * an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) that will resolve once the\n     * send is complete. The actual implementation of the `IPromise` will be a native Promise (if supported) or the default\n     * as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param async - Indicates if the events should be sent asynchronously\n     * @param forcedSender - Indicates the forcedSender, undefined if not passed\n     * @returns - Nothing or optionally, if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * which will be resolved (or reject) once the send is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * should only be returned when async is true.\n     */\n    public triggerSend(async = true, forcedSender?: SenderFunction, sendReason?: SendRequestReason): void | IPromise<boolean> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Check if there are no active requests being sent.\n     * @returns True if idle, false otherwise.\n     */\n    public isCompletelyIdle(): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    /**\n     * Get current xhr instance\n     */\n    public getXhrInst(sync?: boolean) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public _doTeardown (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "channels/offline-channel-js/src/applicationinsights-offlinechannel-js.ts",
    "content": "export { IInMemoryBatch, IPostTransmissionTelemetryItem } from \"./Interfaces/IInMemoryBatch\";\nexport  { IOfflineBatchCleanResponse, IOfflineBatchHandler, IOfflineBatchHandlerCfg, IOfflineBatchResponse,\n    IOfflineBatchStoreResponse, eBatchSendStatus, BatchSendStatus, eBatchStoreStatus, BatchStoreStatus, eStorageType, StorageType,\n    OfflineBatchSendCallback, OfflineBatchStoreCallback,OfflineBatchCallback,\n    createDefaultOfflineDetector, createNoopOfflineDetector, IOfflineDetector, IOfflineDetectorCfg } from \"./Interfaces/IOfflineBatch\";\nexport {IOfflineChannelConfiguration, ILocalStorageProviderContext, IOfflineProvider, IOfflineSenderConfig, IStorageTelemetryItem,\n    eStorageProviders, StorageProviders } from \"./Interfaces/IOfflineProvider\";\nexport { WebStorageProvider } from \"./Providers/WebStorageProvider\";\nexport { IndexedDbProvider } from \"./Providers/IndexDbProvider\";\nexport { OfflineBatchHandler } from \"./OfflineBatchHandler\";\nexport { InMemoryBatch } from \"./InMemoryBatch\";\nexport { Sender } from \"./Sender\";\nexport { OfflineChannel } from \"./OfflineChannel\";\n"
  },
  {
    "path": "channels/offline-channel-js/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"module\": \"es6\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"strictNullChecks\": false,\n        \"suppressImplicitAnyIndexErrors\": true,\n        \"allowSyntheticDefaultImports\": true,\n        \"importHelpers\": true,\n        \"noEmitHelpers\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"skipLibCheck\": true,\n        \"declaration\": true,\n        \"declarationDir\": \"build/types\",\n        \"removeComments\": false,\n        \"outDir\": \"dist-es5/\",\n        \"rootDir\": \"./src\"\n    },\n    \"include\": [\n        \"./src/**/*.ts\"],\n    \"exclude\": [\n        \"node_modules/**\"\n    ]\n}\n  "
  },
  {
    "path": "channels/offline-channel-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "channels/offline-channel-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-offlinechannel-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-offlinechannel-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/channels/offline-channel-js\",\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/channels/offline-channel-js\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-offlinechannel-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "channels/tee-channel-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n"
  },
  {
    "path": "channels/tee-channel-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "channels/tee-channel-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "channels/tee-channel-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "channels/tee-channel-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Tee Channel\n\nThis Channel is used to support multiple channel queues as defined by the `channels` configuration, this channel will execute\nall of the channels as defined in the `channels` array from index 1 onwards (`channels[1..X]`). The main ApplicationInsights\nCore will process the channels as defined in the `channels[0]`.\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-channel-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-channel-js)\n\n## Getting Started\n\n## NPM Setup (ignore if using Snippet Setup)\n\nInstall npm package:\n\n```bash\nnpm install --save @microsoft/applicationinsights-teechannel-js @microsoft/applicationinsights-web\n```\n\n```js\n\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { TeeChannel } from '@microsoft/applicationinsights-teechannel-js';\n\nconst teeChannel = new TeeChannel();\n\n// TeeChannel configuration\nconst teeChannelConfig = {\n    teeChannels: [[]],\n    ignoreCoreChannels: false\n};\n\n// Application Insights Configuration passing the tee Channel via extensions\nconst configObj = {\n  instrumentationKey: \"YOUR INSTRUMENTATION KEY\",\n  extensions: [teeChannel],\n  extensionConfig: {\n    [teeChannel.identifier]: teeChannelConfig\n  },\n};\n\nconst appInsights = new ApplicationInsights({ config: configObj });\nappInsights.loadAppInsights();\n```\n\n## [Configuration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-teechannel-js/interfaces/ITeeChannelConfig.html)\n\n| Name                  | Type                               | Default    | Description\n| --------------------- | -----------------------------------| -----------| ----------------------------------------------------------------------------------------------------------------\n| [teeChannels](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-teechannel-js/interfaces/ITeeChannelConfig.html#teeChannels)           | `IChannelControls`[][]             | undefined  | Defines the Channels specific to the TeeChannel\n| [ignoreCoreChannels](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-teechannel-js/interfaces/ITeeChannelConfig.html#ignoreCoreChannels)    | boolean                            | false      |By default the TeeChannel will use the core configuration `channels` (starting at index 1 `channels[1.xxx]`) as separate tee'd channel chains for processing events. This configuration allow you to ignore any additional core channels and only use the `teeChannels`\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "channels/tee-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "channels/tee-channel-js/Tests/Unit/src/TeeChannelCore.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { ITelemetryItem, AppInsightsCore, isNullOrUndefined, IChannelControls, ITelemetryPlugin, ITelemetryPluginChain, IConfiguration, IPlugin, eLoggingSeverity, _eInternalMessageId } from \"@microsoft/applicationinsights-core-js\";\nimport { TeeChannel } from \"../../../src/TeeChannel\";\n\nconst AIInternalMessagePrefix = \"AITR_\";\nconst MaxInt32 = 0xFFFFFFFF;\n\nexport class TeeChannelCoreTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"config.channel dynamic config\",\n            useFakeTimers: true,\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                const teeChannel = new TeeChannel();\n                const appInsightsCore = new AppInsightsCore();\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1030;\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 1031;\n                const extId = teeChannel.identifier;\n\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", channels: [[channelPlugin, teeChannel],[channelPlugin1]]},[]\n                );\n                let coreChannels =  appInsightsCore.getChannels();\n                Assert.equal(2, coreChannels.length, \"Total number of core channel queues in test 1\");\n                Assert.deepEqual(coreChannels[0], teeChannel, \"core channel 2 in test 1\");\n                Assert.deepEqual(coreChannels[1], channelPlugin, \"core channel 2 in test 1\");\n                let teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(1, teeChannels.length, \"Total number of tee channel queues\");\n                Assert.equal(1, teeChannels[0].length, \"tee channel 1 length in test 1\");\n                Assert.equal(channelPlugin1, teeChannels[0][0], \"tee channel 1 in test 1\");\n               \n                appInsightsCore.config.extensionConfig = appInsightsCore.config.extensionConfig? appInsightsCore.config.extensionConfig : {};\n                let extConfig = appInsightsCore.config.extensionConfig;\n                let teeChanneConfig = extConfig[extId];\n                Assert.deepEqual(teeChanneConfig, {ignoreCoreChannels: false, teeChannels: null}, \"default config is set\");\n\n                appInsightsCore.config.extensionConfig[extId] = {ignoreCoreChannels: false, teeChannels: [[channelPlugin2]]};\n                this.clock.tick(1);\n                coreChannels = appInsightsCore.getChannels();\n                Assert.equal(2, coreChannels.length, \"Total number of core channel queues in test 2\");\n                Assert.deepEqual(coreChannels[0], teeChannel, \"core channel 1 in test 2\");\n                Assert.deepEqual(coreChannels[1], channelPlugin, \"core channel 2 in test 2\");\n                teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(2, teeChannels.length, \"Total number of tee channel queues\");\n                Assert.equal(1, teeChannels[0].length, \"tee channel 1 length in test 2\");\n                Assert.equal(channelPlugin1, teeChannels[0][0], \"tee channel 1 in test 2\");\n                Assert.equal(1, teeChannels[1].length, \"tee channel 2 length in test 2\");\n                Assert.equal(channelPlugin2, teeChannels[1][0], \"tee channel 2 in test 2\");\n\n                appInsightsCore.config.extensionConfig[extId] = {ignoreCoreChannels: true, teeChannels: [[channelPlugin1, teeChannel]]};\n                this.clock.tick(1);\n                coreChannels = appInsightsCore.getChannels();\n                Assert.equal(2, coreChannels.length, \"Total number of core channel queues in test 3\");\n                Assert.deepEqual(coreChannels[0], teeChannel, \"core channel 1 in test 3\");\n                Assert.deepEqual(coreChannels[1], channelPlugin, \"core channel 2 in test 3\");\n                teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(1, teeChannels.length, \"Total number of tee channel queues\");\n                Assert.equal(1, teeChannels[0].length, \"tee channel 1 length in test 3\");\n                Assert.equal(channelPlugin1, teeChannels[0][0], \"tee channel 1 index 1 in test 3\");\n\n                appInsightsCore.config.extensionConfig[extId] = {ignoreCoreChannels: false, teeChannels: [[channelPlugin1, teeChannel]]};\n                this.clock.tick(1);\n                coreChannels = appInsightsCore.getChannels();\n                Assert.equal(2, coreChannels.length, \"Total number of core channel queues in test 4\");\n                Assert.deepEqual(coreChannels[0], teeChannel, \"core channel 1 in test 4\");\n                Assert.deepEqual(coreChannels[1], channelPlugin, \"core channel 2 in test 4\");\n                teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(2, teeChannels.length, \"Total number of tee channel queues\");\n                Assert.equal(1, teeChannels[0].length, \"tee channel 1 length in test 4\");\n                Assert.equal(channelPlugin1, teeChannels[0][0], \"tee channel 1 index1 in test 4\");\n                Assert.equal(1, teeChannels[1].length, \"tee channel 2 length in test 4\");\n                Assert.equal(channelPlugin1, teeChannels[1][0], \"tee channel 2 index 1 in test 4\");\n            }\n        });\n\n        this.testCase({\n            name: \"config.channel adds queue to existing channels\",\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1030;\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1030;\n\n                const teeChannel = new TeeChannel();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", channels: [[channelPlugin1, teeChannel]] },\n                    [channelPlugin]);\n\n\n                const coreChannels = appInsightsCore.getChannels();\n                const teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(3, coreChannels.length, \"Total number of channel queues\");\n                Assert.equal(0, teeChannels.length, \"Total number of tee channel queues\");\n            }\n        });\n\n        this.testCase({\n            name: \"teeChannels config adds queue to existing channels\",\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1030;\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1030;\n\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin1.priority = 1030;\n\n                const teeChannel = new TeeChannel();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        channels: [[channelPlugin1, teeChannel]],\n                        extensionConfig: {\n                            [teeChannel.identifier] : {\n                                teeChannels: [[channelPlugin2]]\n                            }\n                        }\n                    },\n                    [channelPlugin],\n                    );\n\n                const coreChannels = appInsightsCore.getChannels();\n                const teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(3, coreChannels.length, \"Total number of channel queues\");\n                Assert.equal(1, teeChannels.length, \"Total number of tee channel queues\");\n                Assert.equal(1, teeChannels[0].length, \"Number of tee channels in queue 1\");\n\n                Assert.ok(teeChannels[0][0] === channelPlugin2);\n            }\n        });\n\n        this.testCase({\n            name: \"Tee channels can be passed in through the config.channel with the teeChannel in the primary channel queue\",\n            test: () => {\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 1030;\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1030;\n\n                const teeChannel = new TeeChannel();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", channels: [[channelPlugin1, teeChannel], [channelPlugin2]] },\n                    []\n                    );\n\n                const coreChannels = appInsightsCore.getChannels();\n                const teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(2, coreChannels.length, \"Total number of channel queues\");\n                Assert.ok(coreChannels[0] === teeChannel);\n                Assert.ok(coreChannels[1] === channelPlugin1);\n                Assert.ok(channelPlugin1._nextPlugin === undefined);\n\n\n                Assert.equal(1, teeChannels.length, \"Total number of tee channel queues\");\n                Assert.equal(1, teeChannels[0].length, \"Number of tee channels in queue 1\");\n\n                Assert.ok(teeChannels[0][0] === channelPlugin2);\n                \n                Assert.ok(channelPlugin2._nextPlugin === undefined);\n\n            }\n        });\n\n        this.testCase({\n            name: \"Tee channels passed via config.channel and extensionConfig teeChannels\",\n            test: () => {\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1030;\n\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 1030;\n\n                const channelPlugin3 = new ChannelPlugin();\n                channelPlugin2.priority = 1030;\n\n                const teeChannel = new TeeChannel();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { \n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", \n                        channels: [[channelPlugin1, teeChannel], [channelPlugin2]],\n                        extensionConfig: {\n                            [teeChannel.identifier] : {\n                                teeChannels: [[channelPlugin3]]\n                            }\n                        }\n                    },\n                    []\n                    );\n\n                const coreChannels = appInsightsCore.getChannels();\n                const teeChannels = teeChannel.getTeeChannels();\n                Assert.equal(2, coreChannels.length, \"Total number of channel queues\");\n                Assert.ok(coreChannels[0] === teeChannel);\n                Assert.ok(coreChannels[1] === channelPlugin1);\n                Assert.ok(channelPlugin1._nextPlugin === undefined);\n\n\n                Assert.equal(2, teeChannels.length, \"Total number of tee channel queues\");\n                Assert.equal(1, teeChannels[0].length, \"Number of tee channels in queue 1\");\n                Assert.equal(1, teeChannels[1].length, \"Number of tee channels in queue 1\");\n\n                Assert.ok(teeChannels[0][0] === channelPlugin2);\n                Assert.ok(teeChannels[1][0] === channelPlugin3);\n                \n                Assert.ok(channelPlugin2._nextPlugin === undefined);\n\n            }\n        });\n\n        this.testCase({\n            name: \"Channels can be passed in through configuration with the teeChannel as an extension\",\n            test: () => {\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1001;\n\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 1002;\n\n                const channelPlugin3 = new ChannelPlugin();\n                channelPlugin3.priority = 1001;\n\n                const appInsightsCore = new AppInsightsCore();\n                const teeChannel = new TeeChannel();\n\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        channels: [[channelPlugin1, channelPlugin2], [channelPlugin3]],\n                        extensions: [teeChannel]\n                    },\n                    []);\n\n                Assert.ok(channelPlugin1._nextPlugin === channelPlugin2);\n                Assert.ok(isNullOrUndefined(channelPlugin3._nextPlugin));\n                const coreChannels = appInsightsCore.getChannels();\n                const teeChannels = teeChannel.getTeeChannels();\n\n                Assert.equal(3, coreChannels.length, \"Number of core channels\");\n                Assert.ok(coreChannels[0] === teeChannel);\n                Assert.ok(coreChannels[1] === channelPlugin1);\n                Assert.ok(coreChannels[2] === channelPlugin2);\n\n                Assert.equal(1, teeChannels[0].length);\n                Assert.ok(teeChannels[0][0] === channelPlugin3);\n                \n                Assert.ok(channelPlugin2._nextPlugin === undefined);\n                Assert.ok(channelPlugin3._nextPlugin === undefined);\n            }\n        });\n\n\n        this.testCase({\n            name: \"Validate a warning when the TeeChannel is not added\",\n            test: () => {\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1001;\n\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 1002;\n\n                const channelPlugin3 = new ChannelPlugin();\n                channelPlugin3.priority = 1001;\n\n                const appInsightsCore = new AppInsightsCore();\n                let throwSpy = this.sandbox.stub(appInsightsCore.logger, 'throwInternal');\n\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        channels: [[channelPlugin1, channelPlugin2], [channelPlugin3]]\n                    },\n                    [],\n                    appInsightsCore.logger      // Reuse the default logger\n                    );\n\n                Assert.ok(channelPlugin1._nextPlugin === channelPlugin2);\n                Assert.ok(isNullOrUndefined(channelPlugin3._nextPlugin));\n                const coreChannels = appInsightsCore.getChannels();\n\n                Assert.equal(2, coreChannels.length, \"Number of core channels\");\n                Assert.ok(coreChannels[0] === channelPlugin1);\n                Assert.ok(coreChannels[1] === channelPlugin2);\n\n                Assert.ok(channelPlugin2._nextPlugin === undefined);\n                Assert.ok(channelPlugin3._nextPlugin === undefined);\n\n                // Test\n                Assert.equal(throwSpy.calledOnce, true, \"Critical was logged\");\n                Assert.equal(throwSpy.args[0][0], eLoggingSeverity.CRITICAL, \"Checking that the error is critical\");\n                Assert.equal(throwSpy.args[0][1], _eInternalMessageId.SenderNotInitialized, \"Checking that the error number\");\n                Assert.ok(throwSpy.args[0][2].indexOf(\"TeeChannel\") != -1);\n                Assert.equal(throwSpy.args[0][4], false, \"Checking that this was not a user error\");\n            }\n        });\n    }\n}\n\nclass ChannelPlugin implements IChannelControls {\n    public _nextPlugin: ITelemetryPlugin | ITelemetryPluginChain;\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n    public version: string = \"1.0.33-Beta\";\n\n    public processTelemetry;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    onunloadFlush(async?: boolean) {\n        this.isUnloadInvoked = true;\n    }\n\n    setNextPlugin(next: ITelemetryPlugin | ITelemetryPluginChain) {\n        this._nextPlugin = next;\n    }\n\n    public initialize = (config: IConfiguration) => {\n    }\n\n    public _processTelemetry(env: ITelemetryItem) {\n    }\n}\n"
  },
  {
    "path": "channels/tee-channel-js/Tests/Unit/src/teechannel.tests.ts",
    "content": "import { TeeChannelCoreTests } from \"./TeeChannelCore.Tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new TeeChannelCoreTests().registerTests();\n}"
  },
  {
    "path": "channels/tee-channel-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript API</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <!-- <script src=\"../../../common/Tests/External/sinon-7.3.1.js\"></script> -->\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                sinon: \"../../common/Tests/External/sinon-7.3.1\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"sinon\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/teechannel.tests\", \"./Unit/dist/teechannel.tests.js\");\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "channels/tee-channel-js/Tests/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": false,\n    \"module\": \"amd\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"declaration\": true\n  },\n  \"include\": [\n  ],\n  \"exclude\": [\n      \"node_modules/\"\n  ]\n}"
  },
  {
    "path": "channels/tee-channel-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-teechannel-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "channels/tee-channel-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-teechannel-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK Tee Channel\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-teechannel-js.js\",\n    \"module\": \"dist-es5/applicationinsights-teechannel-js.js\",\n    \"types\": \"types/applicationinsights-teechannel-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/channels/tee-channel-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt teechannel\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt teechanneltest\",\n        \"mintest\": \"grunt teechannel-mintest\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights JavaScript SDK Tee Channel\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt teechannel-min\",\n        \"ai-restore\": \"grunt teechannel-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"npm-publish-ai\": \"node ../../tools/release-tools/npm_publish.js .\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@types/sinon\": \"4.3.3\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "channels/tee-channel-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"applicationinsights-teechannel-js\";\nconst browserOutputName = \"applicationinsights-teechannel-js\";\nconst entryPointName = \"applicationinsights-teechannel-js\";\nconst outputName = \"applicationinsights-teechannel-js\";\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Tee Channel, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ \"applicationinsights-teechannel-js\" ]\n);\n"
  },
  {
    "path": "channels/tee-channel-js/src/ChannelController.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IAppInsightsCore, IBaseProcessingContext, IChannelControls, IPlugin, IProcessTelemetryContext, IProcessTelemetryUnloadContext,\n    IProcessTelemetryUpdateContext, ITelemetryItem, ITelemetryUnloadState, ITelemetryUpdateState, SendRequestReason, TelemetryUnloadReason,\n    TelemetryUpdateReason, createProcessTelemetryContext\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, createPromise } from \"@nevware21/ts-async\";\nimport { ITimerHandler, arrForEach, scheduleTimeout } from \"@nevware21/ts-utils\";\n\nexport const ChannelControllerPriority = 500;\n\nexport interface IChannelController {\n\n    init: (channelQueue: _IInternalChannels[], core: IAppInsightsCore) => void;\n\n    getQueues: () => _IInternalChannels[];\n\n    /**\n     * Call back for telemetry processing before it it is sent\n     * @param env - This is the current event being reported\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    processTelemetry: (env: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => void;\n\n    /**\n     * The the plugin should re-evaluate configuration and update any cached configuration settings or\n     * plugins. If implemented this method will be called whenever a plugin is added or removed and if\n     * the configuration has bee updated.\n     * @param updateCtx - This is the context that should be used during updating.\n     * @param updateState - The details / state of the update process, it holds details like the current and previous configuration.\n     * @returns boolean - true if the plugin has or will call updateCtx.processNext(), this allows the plugin to perform any asynchronous operations.\n     */\n    update?: (updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState) => void | boolean;\n\n    /**\n     * Pause sending data\n     */\n    pause(): void;\n\n    /**\n     * Resume sending data\n     */\n    resume(): void;\n\n    /**\n     * Tear down the plugin and remove any hooked value, the plugin should be removed so that it is no longer initialized and\n     * therefore could be re-initialized after being torn down. The plugin should ensure that once this has been called any further\n     * processTelemetry calls are ignored and it just calls the processNext() with the provided context.\n     * @param unloadCtx - This is the context that should be used during unloading.\n     * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n     * @returns boolean - true if the plugin has or will call processNext(), this for backward compatibility as previously teardown was synchronous and returned nothing.\n     */\n    teardown: (unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState, onComplete: () => void) => void | boolean;\n\n    /**\n     * Flush any batched events immediately; Will not flush if the paused and channel should default to sending data asynchronously.\n     * If executing asynchronously and you DO NOT pass a callback function then a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the flush is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param async - send data asynchronously when true\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @param sendReason - specify the reason that you are calling \"flush\" defaults to ManualFlush (1) if not specified\n     * @returns - If a callback is provided `true` to indicate that callback will be called after the flush is complete otherwise the caller\n     * should assume that any provided callback will never be called, Nothing or if occurring asynchronously a\n     * [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) which will be resolved once the unload is complete,\n     * the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) will only be returned when no callback is provided\n     * and isAsync is true.\n     */\n    flush(isAsync: boolean, callBack: (flushComplete?: boolean) => void, sendReason: SendRequestReason, cbTimeout?: number): void;\n\n    /**\n     * Get and return the named channel instance (if present) from the queues\n     * @param pluginIdentifier - The identifier name of the plugin\n     */\n    getChannel<T extends IPlugin = IPlugin>(pluginIdentifier: string): T;\n}\n\nexport interface _IInternalChannels {\n    queue: IChannelControls[];\n}\n\nfunction _getTelCtx(core: IAppInsightsCore) {\n    return createProcessTelemetryContext(null, core.config, core, null)\n}\n\nfunction _processChannelQueue<T extends IBaseProcessingContext>(theChannels: _IInternalChannels[], itemCtx: T, processFn: (chainCtx: T) => void, onComplete: (() => void) | null) {\n    let waiting = theChannels ? (theChannels.length + 1) : 1;\n\n    function _runChainOnComplete() {\n        waiting --;\n\n        if (waiting === 0) {\n            onComplete && onComplete();\n            onComplete = null;\n        }\n    }\n\n    if (waiting > 0) {\n        arrForEach(theChannels, (channels) => {\n            // pass on to first item in queue\n            if (channels && channels.queue.length > 0) {\n                let chainCtx = itemCtx.createNew(channels.queue) as T;\n                chainCtx.onComplete(_runChainOnComplete);\n\n                // Cause this chain to start processing\n                processFn(chainCtx);\n            } else {\n                waiting --;\n            }\n        });\n    }\n\n    _runChainOnComplete();\n}\n\nexport function createChannelControllerPlugin(): IChannelController {\n\n    let _channelQueue: _IInternalChannels[] = [];\n    let _core: IAppInsightsCore = null;\n\n    function _doUpdate(updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState) {\n        let theUpdateState: ITelemetryUpdateState = updateState || {\n            reason: TelemetryUpdateReason.Unknown\n        };\n\n        _processChannelQueue(_channelQueue, updateCtx, (chainCtx: IProcessTelemetryUpdateContext) => {\n            chainCtx.processNext(theUpdateState);\n        }, () => {\n            updateCtx.processNext(theUpdateState);\n        });\n\n        return true;\n    }\n\n    function _getChannel<T extends IPlugin = IPlugin>(pluginIdentifier: string): T {\n        let thePlugin: T = null;\n\n        if (_channelQueue && _channelQueue.length > 0) {\n            arrForEach(_channelQueue, (channels) => {\n                // pass on to first item in queue\n                if (channels && channels.queue.length > 0) {\n                    arrForEach(channels.queue, (ext: any) => {\n                        if (ext.identifier === pluginIdentifier) {\n                            thePlugin = ext;\n                            // Cause arrForEach to stop iterating\n                            return -1;\n                        }\n                    });\n\n                    if (thePlugin) {\n                        // Cause arrForEach to stop iterating\n                        return -1;\n                    }\n                }\n            });\n        }\n\n        return thePlugin;\n    }\n\n    let channelController: IChannelController = {\n        init: (channelQueue: _IInternalChannels[], core: IAppInsightsCore) => {\n            _channelQueue = channelQueue;\n            _core = core;\n        },\n        getQueues: () => {\n            return _channelQueue;\n        },\n        processTelemetry: (item: ITelemetryItem, itemCtx: IProcessTelemetryContext) => {\n            _processChannelQueue(_channelQueue, itemCtx || _getTelCtx(_core), (chainCtx: IProcessTelemetryContext) => {\n                chainCtx.processNext(item);\n            }, () => {\n                itemCtx.processNext(item);\n            });\n        },\n        update: _doUpdate,\n        pause: () => {\n            _processChannelQueue(_channelQueue, _getTelCtx(_core), (chainCtx: IProcessTelemetryContext) => {\n                chainCtx.iterate<IChannelControls>((plugin) => {\n                    plugin.pause && plugin.pause();\n                });\n            }, null);\n        },\n        resume: () => {\n            _processChannelQueue(_channelQueue, _getTelCtx(_core), (chainCtx: IProcessTelemetryContext) => {\n                chainCtx.iterate<IChannelControls>((plugin) => {\n                    plugin.resume && plugin.resume();\n                });\n            }, null);\n        },\n        teardown: (unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState, onComplete: () => void) => {\n            let theUnloadState: ITelemetryUnloadState = unloadState || {\n                reason: TelemetryUnloadReason.ManualTeardown,\n                isAsync: false\n            };\n    \n            _processChannelQueue(_channelQueue, unloadCtx, (chainCtx: IProcessTelemetryUnloadContext) => {\n                chainCtx.processNext(theUnloadState);\n            }, () => {\n                unloadCtx.processNext(theUnloadState);\n                onComplete && onComplete();\n            });\n    \n            return true;\n        },\n        getChannel: _getChannel,\n        flush: (isAsync: boolean, callBack: (flushComplete?: boolean) => void, sendReason: SendRequestReason, cbTimeout?: number) => {\n            // Setting waiting to one so that we don't call the callBack until we finish iterating\n            let waiting = 1;\n            let doneIterating = false;\n            let cbTimer: ITimerHandler = null;\n            let result: boolean | IPromise<boolean> = true;\n\n            cbTimeout = cbTimeout || 5000;\n\n            if (isAsync && !callBack) {\n                result = createPromise((resolve) => {\n                    callBack = resolve;\n                });\n            }\n\n            function doCallback() {\n                waiting--;\n                if (doneIterating && waiting === 0) {\n                    cbTimer && cbTimer.cancel();\n                    cbTimer = null;\n\n                    callBack && callBack(doneIterating);\n                    callBack = null;\n                }\n            }\n\n            _processChannelQueue(_channelQueue, _getTelCtx(_core), (chainCtx: IProcessTelemetryContext) => {\n                chainCtx.iterate<IChannelControls>((plugin) => {\n                    if (plugin.flush) {\n                        waiting ++;\n\n                        let handled = false;\n                        // Not all channels will call this callback for every scenario\n                        if (!plugin.flush(isAsync, () => {\n                            handled = true;\n                            doCallback();\n                        }, sendReason)) {\n                            if (!handled) {\n                                // If any channel doesn't return true and it didn't call the callback, then we should assume that the callback\n                                // will never be called, so use a timeout to allow the channel(s) some time to \"finish\" before triggering any\n                                // followup function (such as unloading)\n                                if (isAsync && cbTimer == null) {\n                                    cbTimer = scheduleTimeout(() => {\n                                        cbTimer = null;\n                                        doCallback();\n                                    }, cbTimeout);\n                                } else {\n                                    doCallback();\n                                }\n                            }\n                        }\n                    }\n                });\n            }, () => {\n                doneIterating = true;\n                doCallback();\n            });\n\n            return result;\n        }\n    };\n\n    return channelController;\n}\n"
  },
  {
    "path": "channels/tee-channel-js/src/Interfaces/ITeeChannelConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IChannelControls } from \"@microsoft/applicationinsights-core-js\";\n\nexport interface ITeeChannelConfig {\n    /**\n     * Channel queues that is setup by caller in desired order.\n     * If channels are provided here, core will ignore any channels that are already setup, example if there is a SKU with an initialized channel\n     */\n    teeChannels?: IChannelControls[][];\n\n    /**\n     * By default the TeeChannel will use the core configuration `channels` (starting at index 1 `channels[1.xxx]`) as separate tee'd channel chains\n     * for processing events. This configuration allow you to ignore any additional core channels and only use the `teeChannels`\n     * Defaults to false\n     */\n    ignoreCoreChannels?: boolean;\n}"
  },
  {
    "path": "channels/tee-channel-js/src/TeeChannel.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, IAppInsightsCore, IChannelControls, IChannelControlsHost, IConfig, IConfigDefaults, IConfiguration, IPlugin,\n    IProcessTelemetryContext, IProcessTelemetryUnloadContext, IProcessTelemetryUpdateContext, ITelemetryItem, ITelemetryPluginChain,\n    ITelemetryUnloadState, ITelemetryUpdateState, SendRequestReason, cfgDfBoolean, createProcessTelemetryContext, initializePlugins,\n    onConfigChange, proxyFunctions\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { arrForEach, isArray, objDeepFreeze, objFreeze, throwError } from \"@nevware21/ts-utils\";\nimport { ChannelControllerPriority, IChannelController, _IInternalChannels, createChannelControllerPlugin } from \"./ChannelController\";\nimport { ITeeChannelConfig } from \"./Interfaces/ITeeChannelConfig\";\n\nconst ChannelValidationMessage = \"Channel has invalid priority - \";\n\nconst defaultTeeChannelConfig: IConfigDefaults<ITeeChannelConfig> = objDeepFreeze({\n    teeChannels: null,\n    ignoreCoreChannels: cfgDfBoolean()\n});\n\nfunction _addChannelQueue(channelQueue: _IInternalChannels[], queue: IChannelControls[], core: IAppInsightsCore, teeChannel?: IChannelControls) {\n    if (queue && isArray(queue) && queue.length > 0) {\n        queue = queue.sort((a, b) => { // sort based on priority within each queue\n            return a.priority - b.priority;\n        });\n\n        let _queue: IChannelControls[] = [];\n        arrForEach(queue, queueItem => {\n            if (queueItem.priority < ChannelControllerPriority) {\n                throwError(ChannelValidationMessage + queueItem.identifier);\n            }\n            if (queueItem !== teeChannel) {\n                _queue.push(queueItem);\n            }\n        });\n\n        channelQueue.push({\n            queue: objFreeze(_queue)\n        });\n        \n    }\n}\n\nfunction _createChannelQueues(config: ITeeChannelConfig, core: IAppInsightsCore, teeChannel?: TeeChannel) {\n    let channelQueue: _IInternalChannels[] = [];\n\n    if (config) {\n        if (!config.ignoreCoreChannels && core.config.channels) {\n            // Add and sort the configuration channel queues\n            arrForEach(core.config.channels, (queue, idx) => {\n                if (idx > 0) {\n                    _addChannelQueue(channelQueue, queue, core, teeChannel);\n                }\n            });\n        }\n\n        if (config.teeChannels) {\n            // Add and sort the configuration channel queues\n            arrForEach(config.teeChannels, queue => _addChannelQueue(channelQueue, queue, core, teeChannel));\n        }\n    }\n\n    return channelQueue;\n}\n\nexport class TeeChannel extends BaseTelemetryPlugin implements IChannelControlsHost {\n    public readonly identifier: string = \"TeeChannelController\";\n    public readonly priority: number = 999;\n\n    /**\n     * Returns whether the plugin has been initialized\n     */\n    public isInitialized: () => boolean;\n\n    constructor() {\n        super();\n\n        let _channelController: IChannelController;\n        let _isInitialized: boolean;\n\n        dynamicProto(TeeChannel, this, (_self, base) => {\n\n            _initDefaults();\n\n            _self.initialize = (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) => {\n                if (!_isInitialized) {\n                    _isInitialized = true;\n    \n                    _initChannels(_self, core);\n                }\n            };\n\n            _self.getTeeChannels = (): IChannelControls[][] => {\n                let controls: IChannelControls[][] = [];\n                let channelQueues = _channelController.getQueues()\n                if (channelQueues) {\n                    arrForEach(channelQueues, (channels) => {\n                        controls.push(channels.queue);\n                    });\n                }\n\n                return objFreeze(controls);\n            };\n\n            _self.isInitialized = () => {\n                return _isInitialized\n            };\n\n            _self.teardown = (unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => {\n                return _channelController.teardown(unloadCtx, unloadState, () => {\n                    _isInitialized = false;\n                });\n            };\n\n            proxyFunctions(_self, _channelController, [\n                \"processTelemetry\",\n                \"update\",\n                \"pause\",\n                \"resume\",\n                \"getChannel\",\n                \"flush\"\n            ]);\n        });\n\n        function _initDefaults() {\n            _channelController = createChannelControllerPlugin();\n            _isInitialized = false;\n        }\n\n        function _initChannels(self: TeeChannel, core: IAppInsightsCore) {\n            // This function will be re-called whenever any referenced configuration is changed\n            self._addHook(onConfigChange(core.config, (details) => {\n                let ctx = createProcessTelemetryContext(null, details.cfg, core);\n                let theConfig = ctx.getExtCfg(self.identifier, defaultTeeChannelConfig);\n\n                let channelQueue = _createChannelQueues(theConfig, core, self);\n\n                arrForEach(channelQueue, (channels) => {\n                    if (channels && channels.queue.length > 0) {\n                        initializePlugins(ctx.createNew(channels.queue), details.cfg.extensions);\n                    }\n                });\n\n                _channelController.init(channelQueue, core);\n            }));\n        }\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getTeeChannels(): IChannelControls[][] {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public processTelemetry(telemetryItem: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Tear down the plugin and remove any hooked value, the plugin should be removed so that it is no longer initialized and\n     * therefore could be re-initialized after being torn down. The plugin should ensure that once this has been called any further\n     * processTelemetry calls are ignored and it just calls the processNext() with the provided context.\n     * @param unloadCtx - This is the context that should be used during unloading.\n     * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n     * @returns boolean - true if the plugin has or will call processNext(), this for backward compatibility as previously teardown was synchronous and returned nothing.\n     */\n    public teardown(unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState): void | boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * The the plugin should re-evaluate configuration and update any cached configuration settings.\n     * @param updateCtx - This is the context that should be used during updating.\n     * @param updateState - The details / state of the update process, it holds details like the current and previous configuration.\n     * @returns boolean - true if the plugin has or will call updateCtx.processNext(), this allows the plugin to perform any asynchronous operations.\n     */\n    public update(updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState): void | boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n \n    /**\n     * Pause the sending (transmission) of events, this will cause all events to be batched only until the maximum limits are\n     * hit at which point new events are dropped. Will also cause events to NOT be sent during page unload, so if Session storage\n     * is disabled events will be lost.\n     * SessionStorage Limit is 2000 events, In-Memory (Array) Storage is 10,000 events (can be configured via the eventsLimitInMem).\n     */\n    public pause(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resume the sending (transmission) of events, this will restart the timer and any batched events will be sent using the normal\n     * send interval.\n     */\n    public resume(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Flush any batched events immediately; Will not flush if the paused and channel should default to sending data asynchronously.\n     * If executing asynchronously and you DO NOT pass a callback function then a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the flush is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param async - send data asynchronously when true\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @param sendReason - specify the reason that you are calling \"flush\" defaults to ManualFlush (1) if not specified\n     * @returns - If a callback is provided `true` to indicate that callback will be called after the flush is complete otherwise the caller\n     * should assume that any provided callback will never be called, Nothing or if occurring asynchronously a\n     * [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) which will be resolved once the unload is complete,\n     * the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) will only be returned when no callback is provided\n     * and isAsync is true.\n     */\n    public flush(isAsync: boolean, callBack: (flushComplete?: boolean) => void, sendReason: SendRequestReason, cbTimeout?: number): void | IPromise<boolean> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Flush the batched events synchronously (if possible -- based on configuration).\n     * Will not flush if the Send has been paused.\n     */\n    public onunloadFlush() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get and return the named channel instance (if present) from the queues\n     * @param pluginIdentifier - The identifier name of the plugin\n     */\n    public getChannel<T extends IPlugin = IPlugin>(pluginIdentifier: string): T {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "channels/tee-channel-js/src/applicationinsights-teechannel-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport { ITeeChannelConfig } from \"./Interfaces/ITeeChannelConfig\";\nexport { TeeChannel } from \"./TeeChannel\";\n"
  },
  {
    "path": "channels/tee-channel-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "channels/tee-channel-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "channels/tee-channel-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-teechannel-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-teechannel-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/channels/tee-channel-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-teechannel-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "common/Tests/External/blanket-1.2.2.js",
    "content": "\"undefined\" != typeof QUnit && (QUnit.config.autostart = !1), function (a) {\n    !function (b) { if (\"object\" == typeof exports && \"undefined\" != typeof module) module.exports = b(); else if (\"function\" == typeof a && a.amd) a([], b); else { var c; c = \"undefined\" != typeof window ? window : \"undefined\" != typeof global ? global : \"undefined\" != typeof self ? self : this, c.acorn = b() } }(function () {\n        return function a(b, c, d) { function e(g, h) { if (!c[g]) { if (!b[g]) { var i = \"function\" == typeof require && require; if (!h && i) return i(g, !0); if (f) return f(g, !0); var j = new Error(\"Cannot find module '\" + g + \"'\"); throw j.code = \"MODULE_NOT_FOUND\", j } var k = c[g] = { exports: {} }; b[g][0].call(k.exports, function (a) { var c = b[g][1][a]; return e(c ? c : a) }, k, k.exports, a, b, c, d) } return c[g].exports } for (var f = \"function\" == typeof require && require, g = 0; g < d.length; g++) e(d[g]); return e }({\n            1: [function (a, b, c) {\n                \"use strict\"; function d(a, b) { var c = g(b, a), d = c.pos, e = c.options.locations && c.curPosition(); return c.nextToken(), c.parseTopLevel(c.options.program || c.startNodeAt(d, e)) } function e(a, b, c) { var d = g(c, a, b); return d.nextToken(), d.parseExpression() } function f(a, b) { return g(b, a) } function g(a, b) { return new i(k(a), String(b)) } c.parse = d, c.parseExpressionAt = e, c.tokenizer = f, c.__esModule = !0;\n                // various contributors and released under an MIT license.\n                //\n                // Git repositories for Acorn are available at\n                //\n                //     http://marijnhaverbeke.nl/git/acorn\n                //     https://github.com/marijnh/acorn.git\n                //\n                // Please use the [github bug tracker][ghbt] to report issues.\n                //\n                // [ghbt]: https://github.com/marijnh/acorn/issues\n                //\n                // This file defines the main parser interface. The library also comes\n                // with a [error-tolerant parser][dammit] and an\n                // [abstract syntax tree walker][walk], defined in other files.\n                //\n                // [dammit]: acorn_loose.js\n                // [walk]: util/walk.js\n                var h = a(\"./state\"), i = h.Parser, j = a(\"./options\"), k = j.getOptions; a(\"./parseutil\"), a(\"./statement\"), a(\"./lval\"), a(\"./expression\"), c.Parser = h.Parser, c.plugins = h.plugins, c.defaultOptions = j.defaultOptions; var l = a(\"./location\"); c.SourceLocation = l.SourceLocation, c.getLineInfo = l.getLineInfo, c.Node = a(\"./node\").Node; var m = a(\"./tokentype\"); c.TokenType = m.TokenType, c.tokTypes = m.types; var n = a(\"./tokencontext\"); c.TokContext = n.TokContext, c.tokContexts = n.types; var o = a(\"./identifier\"); c.isIdentifierChar = o.isIdentifierChar, c.isIdentifierStart = o.isIdentifierStart, c.Token = a(\"./tokenize\").Token; var p = a(\"./whitespace\"); c.isNewLine = p.isNewLine, c.lineBreak = p.lineBreak, c.lineBreakG = p.lineBreakG; var q = \"1.2.2\"; c.version = q\n            }, { \"./expression\": 6, \"./identifier\": 7, \"./location\": 8, \"./lval\": 9, \"./node\": 10, \"./options\": 11, \"./parseutil\": 12, \"./state\": 13, \"./statement\": 14, \"./tokencontext\": 15, \"./tokenize\": 16, \"./tokentype\": 17, \"./whitespace\": 19 }], 2: [function (a, b, c) { \"function\" == typeof Object.create ? b.exports = function (a, b) { a.super_ = b, a.prototype = Object.create(b.prototype, { constructor: { value: a, enumerable: !1, writable: !0, configurable: !0 } }) } : b.exports = function (a, b) { a.super_ = b; var c = function () { }; c.prototype = b.prototype, a.prototype = new c, a.prototype.constructor = a } }, {}], 3: [function (a, b, c) { function d() { if (!h) { h = !0; for (var a, b = g.length; b;) { a = g, g = []; for (var c = -1; ++c < b;) a[c](); b = g.length } h = !1 } } function e() { } var f = b.exports = {}, g = [], h = !1; f.nextTick = function (a) { g.push(a), h || setTimeout(d, 0) }, f.title = \"browser\", f.browser = !0, f.env = {}, f.argv = [], f.version = \"\", f.versions = {}, f.on = e, f.addListener = e, f.once = e, f.off = e, f.removeListener = e, f.removeAllListeners = e, f.emit = e, f.binding = function (a) { throw new Error(\"process.binding is not supported\") }, f.cwd = function () { return \"/\" }, f.chdir = function (a) { throw new Error(\"process.chdir is not supported\") }, f.umask = function () { return 0 } }, {}], 4: [function (a, b, c) { b.exports = function (a) { return a && \"object\" == typeof a && \"function\" == typeof a.copy && \"function\" == typeof a.fill && \"function\" == typeof a.readUInt8 } }, {}], 5: [function (a, b, c) {\n                (function (b, d) {\n                    function e(a, b) { var d = { seen: [], stylize: g }; return arguments.length >= 3 && (d.depth = arguments[2]), arguments.length >= 4 && (d.colors = arguments[3]), p(b) ? d.showHidden = b : b && c._extend(d, b), v(d.showHidden) && (d.showHidden = !1), v(d.depth) && (d.depth = 2), v(d.colors) && (d.colors = !1), v(d.customInspect) && (d.customInspect = !0), d.colors && (d.stylize = f), i(d, a, d.depth) } function f(a, b) { var c = e.styles[b]; return c ? \"\u001b[\" + e.colors[c][0] + \"m\" + a + \"\u001b[\" + e.colors[c][1] + \"m\" : a } function g(a, b) { return a } function h(a) { var b = {}; return a.forEach(function (a, c) { b[a] = !0 }), b } function i(a, b, d) { if (a.customInspect && b && A(b.inspect) && b.inspect !== c.inspect && (!b.constructor || b.constructor.prototype !== b)) { var e = b.inspect(d, a); return t(e) || (e = i(a, e, d)), e } var f = j(a, b); if (f) return f; var g = Object.keys(b), p = h(g); if (a.showHidden && (g = Object.getOwnPropertyNames(b)), z(b) && (g.indexOf(\"message\") >= 0 || g.indexOf(\"description\") >= 0)) return k(b); if (0 === g.length) { if (A(b)) { var q = b.name ? \": \" + b.name : \"\"; return a.stylize(\"[Function\" + q + \"]\", \"special\") } if (w(b)) return a.stylize(RegExp.prototype.toString.call(b), \"regexp\"); if (y(b)) return a.stylize(Date.prototype.toString.call(b), \"date\"); if (z(b)) return k(b) } var r = \"\", s = !1, u = [\"{\", \"}\"]; if (o(b) && (s = !0, u = [\"[\", \"]\"]), A(b)) { var v = b.name ? \": \" + b.name : \"\"; r = \" [Function\" + v + \"]\" } if (w(b) && (r = \" \" + RegExp.prototype.toString.call(b)), y(b) && (r = \" \" + Date.prototype.toUTCString.call(b)), z(b) && (r = \" \" + k(b)), 0 === g.length && (!s || 0 == b.length)) return u[0] + r + u[1]; if (0 > d) return w(b) ? a.stylize(RegExp.prototype.toString.call(b), \"regexp\") : a.stylize(\"[Object]\", \"special\"); a.seen.push(b); var x; return x = s ? l(a, b, d, p, g) : g.map(function (c) { return m(a, b, d, p, c, s) }), a.seen.pop(), n(x, r, u) } function j(a, b) { if (v(b)) return a.stylize(\"undefined\", \"undefined\"); if (t(b)) { var c = \"'\" + JSON.stringify(b).replace(/^\"|\"$/g, \"\").replace(/'/g, \"\\\\'\").replace(/\\\\\"/g, '\"') + \"'\"; return a.stylize(c, \"string\") } return s(b) ? a.stylize(\"\" + b, \"number\") : p(b) ? a.stylize(\"\" + b, \"boolean\") : q(b) ? a.stylize(\"null\", \"null\") : void 0 } function k(a) { return \"[\" + Error.prototype.toString.call(a) + \"]\" } function l(a, b, c, d, e) { for (var f = [], g = 0, h = b.length; h > g; ++g) F(b, String(g)) ? f.push(m(a, b, c, d, String(g), !0)) : f.push(\"\"); return e.forEach(function (e) { e.match(/^\\d+$/) || f.push(m(a, b, c, d, e, !0)) }), f } function m(a, b, c, d, e, f) { var g, h, j; if (j = Object.getOwnPropertyDescriptor(b, e) || { value: b[e] }, j.get ? h = j.set ? a.stylize(\"[Getter/Setter]\", \"special\") : a.stylize(\"[Getter]\", \"special\") : j.set && (h = a.stylize(\"[Setter]\", \"special\")), F(d, e) || (g = \"[\" + e + \"]\"), h || (a.seen.indexOf(j.value) < 0 ? (h = q(c) ? i(a, j.value, null) : i(a, j.value, c - 1), h.indexOf(\"\\n\") > -1 && (h = f ? h.split(\"\\n\").map(function (a) { return \"  \" + a }).join(\"\\n\").substr(2) : \"\\n\" + h.split(\"\\n\").map(function (a) { return \"   \" + a }).join(\"\\n\"))) : h = a.stylize(\"[Circular]\", \"special\")), v(g)) { if (f && e.match(/^\\d+$/)) return h; g = JSON.stringify(\"\" + e), g.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/) ? (g = g.substr(1, g.length - 2), g = a.stylize(g, \"name\")) : (g = g.replace(/'/g, \"\\\\'\").replace(/\\\\\"/g, '\"').replace(/(^\"|\"$)/g, \"'\"), g = a.stylize(g, \"string\")) } return g + \": \" + h } function n(a, b, c) { var d = 0, e = a.reduce(function (a, b) { return d++, b.indexOf(\"\\n\") >= 0 && d++, a + b.replace(/\\u001b\\[\\d\\d?m/g, \"\").length + 1 }, 0); return e > 60 ? c[0] + (\"\" === b ? \"\" : b + \"\\n \") + \" \" + a.join(\",\\n  \") + \" \" + c[1] : c[0] + b + \" \" + a.join(\", \") + \" \" + c[1] } function o(a) { return Array.isArray(a) } function p(a) { return \"boolean\" == typeof a } function q(a) { return null === a } function r(a) { return null == a } function s(a) { return \"number\" == typeof a } function t(a) { return \"string\" == typeof a } function u(a) { return \"symbol\" == typeof a } function v(a) { return void 0 === a } function w(a) { return x(a) && \"[object RegExp]\" === C(a) } function x(a) { return \"object\" == typeof a && null !== a } function y(a) { return x(a) && \"[object Date]\" === C(a) } function z(a) { return x(a) && (\"[object Error]\" === C(a) || a instanceof Error) } function A(a) { return \"function\" == typeof a } function B(a) { return null === a || \"boolean\" == typeof a || \"number\" == typeof a || \"string\" == typeof a || \"symbol\" == typeof a || \"undefined\" == typeof a } function C(a) { return Object.prototype.toString.call(a) } function D(a) { return 10 > a ? \"0\" + a.toString(10) : a.toString(10) } function E() { var a = new Date, b = [D(a.getHours()), D(a.getMinutes()), D(a.getSeconds())].join(\":\"); return [a.getDate(), J[a.getMonth()], b].join(\" \") } function F(a, b) { return Object.prototype.hasOwnProperty.call(a, b) }\n                    // Copyright Joyent, Inc. and other Node contributors.\n                    //\n                    // Permission is hereby granted, free of charge, to any person obtaining a\n                    // copy of this software and associated documentation files (the\n                    // \"Software\"), to deal in the Software without restriction, including\n                    // without limitation the rights to use, copy, modify, merge, publish,\n                    // distribute, sublicense, and/or sell copies of the Software, and to permit\n                    // persons to whom the Software is furnished to do so, subject to the\n                    // following conditions:\n                    //\n                    // The above copyright notice and this permission notice shall be included\n                    // in all copies or substantial portions of the Software.\n                    //\n                    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n                    // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n                    // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n                    // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n                    // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n                    // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n                    // USE OR OTHER DEALINGS IN THE SOFTWARE.\n                    var G = /%[sdj%]/g; c.format = function (a) { if (!t(a)) { for (var b = [], c = 0; c < arguments.length; c++) b.push(e(arguments[c])); return b.join(\" \") } for (var c = 1, d = arguments, f = d.length, g = String(a).replace(G, function (a) { if (\"%%\" === a) return \"%\"; if (c >= f) return a; switch (a) { case \"%s\": return String(d[c++]); case \"%d\": return Number(d[c++]); case \"%j\": try { return JSON.stringify(d[c++]) } catch (b) { return \"[Circular]\" } default: return a } }), h = d[c]; f > c; h = d[++c]) g += q(h) || !x(h) ? \" \" + h : \" \" + e(h); return g }, c.deprecate = function (a, e) { function f() { if (!g) { if (b.throwDeprecation) throw new Error(e); b.traceDeprecation ? console.trace(e) : console.error(e), g = !0 } return a.apply(this, arguments) } if (v(d.process)) return function () { return c.deprecate(a, e).apply(this, arguments) }; if (b.noDeprecation === !0) return a; var g = !1; return f }; var H, I = {}; c.debuglog = function (a) { if (v(H) && (H = b.env.NODE_DEBUG || \"\"), a = a.toUpperCase(), !I[a]) if (new RegExp(\"\\\\b\" + a + \"\\\\b\", \"i\").test(H)) { var d = b.pid; I[a] = function () { var b = c.format.apply(c, arguments); console.error(\"%s %d: %s\", a, d, b) } } else I[a] = function () { }; return I[a] }, c.inspect = e, e.colors = { bold: [1, 22], italic: [3, 23], underline: [4, 24], inverse: [7, 27], white: [37, 39], grey: [90, 39], black: [30, 39], blue: [34, 39], cyan: [36, 39], green: [32, 39], magenta: [35, 39], red: [31, 39], yellow: [33, 39] }, e.styles = { special: \"cyan\", number: \"yellow\", \"boolean\": \"yellow\", undefined: \"grey\", \"null\": \"bold\", string: \"green\", date: \"magenta\", regexp: \"red\" }, c.isArray = o, c.isBoolean = p, c.isNull = q, c.isNullOrUndefined = r, c.isNumber = s, c.isString = t, c.isSymbol = u, c.isUndefined = v, c.isRegExp = w, c.isObject = x, c.isDate = y, c.isError = z, c.isFunction = A, c.isPrimitive = B, c.isBuffer = a(\"./support/isBuffer\"); var J = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]; c.log = function () { console.log(\"%s - %s\", E(), c.format.apply(c, arguments)) }, c.inherits = a(\"inherits\"), c._extend = function (a, b) { if (!b || !x(b)) return a; for (var c = Object.keys(b), d = c.length; d--;) a[c[d]] = b[c[d]]; return a }\n                }).call(this, a(\"_process\"), \"undefined\" != typeof global ? global : \"undefined\" != typeof self ? self : \"undefined\" != typeof window ? window : {})\n            }, { \"./support/isBuffer\": 4, _process: 3, inherits: 2 }], 6: [function (a, b, c) { \"use strict\"; var d = a(\"./tokentype\").types, e = a(\"./state\").Parser, f = a(\"./identifier\").reservedWords, g = a(\"./util\").has, h = e.prototype; h.checkPropClash = function (a, b) { if (!(this.options.ecmaVersion >= 6)) { var c = a.key, d = void 0; switch (c.type) { case \"Identifier\": d = c.name; break; case \"Literal\": d = String(c.value); break; default: return } var e = a.kind || \"init\", f = void 0; if (g(b, d)) { f = b[d]; var h = \"init\" !== e; ((this.strict || h) && f[e] || !(h ^ f.init)) && this.raise(c.start, \"Redefinition of property\") } else f = b[d] = { init: !1, get: !1, set: !1 }; f[e] = !0 } }, h.parseExpression = function (a, b) { var c = this.start, e = this.startLoc, f = this.parseMaybeAssign(a, b); if (this.type === d.comma) { var g = this.startNodeAt(c, e); for (g.expressions = [f]; this.eat(d.comma) ;) g.expressions.push(this.parseMaybeAssign(a, b)); return this.finishNode(g, \"SequenceExpression\") } return f }, h.parseMaybeAssign = function (a, b, c) { if (this.type == d._yield && this.inGenerator) return this.parseYield(); var e = void 0; b ? e = !1 : (b = { start: 0 }, e = !0); var f = this.start, g = this.startLoc; (this.type == d.parenL || this.type == d.name) && (this.potentialArrowAt = this.start); var h = this.parseMaybeConditional(a, b); if (c && (h = c.call(this, h, f, g)), this.type.isAssign) { var i = this.startNodeAt(f, g); return i.operator = this.value, i.left = this.type === d.eq ? this.toAssignable(h) : h, b.start = 0, this.checkLVal(h), this.next(), i.right = this.parseMaybeAssign(a), this.finishNode(i, \"AssignmentExpression\") } return e && b.start && this.unexpected(b.start), h }, h.parseMaybeConditional = function (a, b) { var c = this.start, e = this.startLoc, f = this.parseExprOps(a, b); if (b && b.start) return f; if (this.eat(d.question)) { var g = this.startNodeAt(c, e); return g.test = f, g.consequent = this.parseMaybeAssign(), this.expect(d.colon), g.alternate = this.parseMaybeAssign(a), this.finishNode(g, \"ConditionalExpression\") } return f }, h.parseExprOps = function (a, b) { var c = this.start, d = this.startLoc, e = this.parseMaybeUnary(b); return b && b.start ? e : this.parseExprOp(e, c, d, -1, a) }, h.parseExprOp = function (a, b, c, e, f) { var g = this.type.binop; if (Array.isArray(b) && this.options.locations && void 0 === f && (f = e, e = c, c = b[1], b = b[0]), null != g && (!f || this.type !== d._in) && g > e) { var h = this.startNodeAt(b, c); h.left = a, h.operator = this.value; var i = this.type; this.next(); var j = this.start, k = this.startLoc; return h.right = this.parseExprOp(this.parseMaybeUnary(), j, k, g, f), this.finishNode(h, i === d.logicalOR || i === d.logicalAND ? \"LogicalExpression\" : \"BinaryExpression\"), this.parseExprOp(h, b, c, e, f) } return a }, h.parseMaybeUnary = function (a) { if (this.type.prefix) { var b = this.startNode(), c = this.type === d.incDec; return b.operator = this.value, b.prefix = !0, this.next(), b.argument = this.parseMaybeUnary(), a && a.start && this.unexpected(a.start), c ? this.checkLVal(b.argument) : this.strict && \"delete\" === b.operator && \"Identifier\" === b.argument.type && this.raise(b.start, \"Deleting local variable in strict mode\"), this.finishNode(b, c ? \"UpdateExpression\" : \"UnaryExpression\") } var e = this.start, f = this.startLoc, g = this.parseExprSubscripts(a); if (a && a.start) return g; for (; this.type.postfix && !this.canInsertSemicolon() ;) { var b = this.startNodeAt(e, f); b.operator = this.value, b.prefix = !1, b.argument = g, this.checkLVal(g), this.next(), g = this.finishNode(b, \"UpdateExpression\") } return g }, h.parseExprSubscripts = function (a) { var b = this.start, c = this.startLoc, d = this.parseExprAtom(a); return a && a.start ? d : this.parseSubscripts(d, b, c) }, h.parseSubscripts = function (a, b, c, e) { for (Array.isArray(b) && this.options.locations && void 0 === e && (e = c, c = b[1], b = b[0]) ; ;) if (this.eat(d.dot)) { var f = this.startNodeAt(b, c); f.object = a, f.property = this.parseIdent(!0), f.computed = !1, a = this.finishNode(f, \"MemberExpression\") } else if (this.eat(d.bracketL)) { var f = this.startNodeAt(b, c); f.object = a, f.property = this.parseExpression(), f.computed = !0, this.expect(d.bracketR), a = this.finishNode(f, \"MemberExpression\") } else if (!e && this.eat(d.parenL)) { var f = this.startNodeAt(b, c); f.callee = a, f.arguments = this.parseExprList(d.parenR, !1), a = this.finishNode(f, \"CallExpression\") } else { if (this.type !== d.backQuote) return a; var f = this.startNodeAt(b, c); f.tag = a, f.quasi = this.parseTemplate(), a = this.finishNode(f, \"TaggedTemplateExpression\") } }, h.parseExprAtom = function (a) { var b = void 0, c = this.potentialArrowAt == this.start; switch (this.type) { case d._this: case d._super: var e = this.type === d._this ? \"ThisExpression\" : \"Super\"; return b = this.startNode(), this.next(), this.finishNode(b, e); case d._yield: this.inGenerator && this.unexpected(); case d.name: var f = this.start, g = this.startLoc, h = this.parseIdent(this.type !== d.name); return c && !this.canInsertSemicolon() && this.eat(d.arrow) ? this.parseArrowExpression(this.startNodeAt(f, g), [h]) : h; case d.regexp: var i = this.value; return b = this.parseLiteral(i.value), b.regex = { pattern: i.pattern, flags: i.flags }, b; case d.num: case d.string: return this.parseLiteral(this.value); case d._null: case d._true: case d._false: return b = this.startNode(), b.value = this.type === d._null ? null : this.type === d._true, b.raw = this.type.keyword, this.next(), this.finishNode(b, \"Literal\"); case d.parenL: return this.parseParenAndDistinguishExpression(c); case d.bracketL: return b = this.startNode(), this.next(), this.options.ecmaVersion >= 7 && this.type === d._for ? this.parseComprehension(b, !1) : (b.elements = this.parseExprList(d.bracketR, !0, !0, a), this.finishNode(b, \"ArrayExpression\")); case d.braceL: return this.parseObj(!1, a); case d._function: return b = this.startNode(), this.next(), this.parseFunction(b, !1); case d._class: return this.parseClass(this.startNode(), !1); case d._new: return this.parseNew(); case d.backQuote: return this.parseTemplate(); default: this.unexpected() } }, h.parseLiteral = function (a) { var b = this.startNode(); return b.value = a, b.raw = this.input.slice(this.start, this.end), this.next(), this.finishNode(b, \"Literal\") }, h.parseParenExpression = function () { this.expect(d.parenL); var a = this.parseExpression(); return this.expect(d.parenR), a }, h.parseParenAndDistinguishExpression = function (a) { var b = this.start, c = this.startLoc, e = void 0; if (this.options.ecmaVersion >= 6) { if (this.next(), this.options.ecmaVersion >= 7 && this.type === d._for) return this.parseComprehension(this.startNodeAt(b, c), !0); for (var f = this.start, g = this.startLoc, h = [], i = !0, j = { start: 0 }, k = void 0, l = void 0; this.type !== d.parenR;) { if (i ? i = !1 : this.expect(d.comma), this.type === d.ellipsis) { k = this.start, h.push(this.parseParenItem(this.parseRest())); break } this.type !== d.parenL || l || (l = this.start), h.push(this.parseMaybeAssign(!1, j, this.parseParenItem)) } var m = this.start, n = this.startLoc; if (this.expect(d.parenR), a && !this.canInsertSemicolon() && this.eat(d.arrow)) return l && this.unexpected(l), this.parseParenArrowList(b, c, h); h.length || this.unexpected(this.lastTokStart), k && this.unexpected(k), j.start && this.unexpected(j.start), h.length > 1 ? (e = this.startNodeAt(f, g), e.expressions = h, this.finishNodeAt(e, \"SequenceExpression\", m, n)) : e = h[0] } else e = this.parseParenExpression(); if (this.options.preserveParens) { var o = this.startNodeAt(b, c); return o.expression = e, this.finishNode(o, \"ParenthesizedExpression\") } return e }, h.parseParenItem = function (a) { return a }, h.parseParenArrowList = function (a, b, c) { return this.parseArrowExpression(this.startNodeAt(a, b), c) }; var i = []; h.parseNew = function () { var a = this.startNode(), b = this.parseIdent(!0); if (this.options.ecmaVersion >= 6 && this.eat(d.dot)) return a.meta = b, a.property = this.parseIdent(!0), \"target\" !== a.property.name && this.raise(a.property.start, \"The only valid meta property for new is new.target\"), this.finishNode(a, \"MetaProperty\"); var c = this.start, e = this.startLoc; return a.callee = this.parseSubscripts(this.parseExprAtom(), c, e, !0), this.eat(d.parenL) ? a.arguments = this.parseExprList(d.parenR, !1) : a.arguments = i, this.finishNode(a, \"NewExpression\") }, h.parseTemplateElement = function () { var a = this.startNode(); return a.value = { raw: this.input.slice(this.start, this.end), cooked: this.value }, this.next(), a.tail = this.type === d.backQuote, this.finishNode(a, \"TemplateElement\") }, h.parseTemplate = function () { var a = this.startNode(); this.next(), a.expressions = []; var b = this.parseTemplateElement(); for (a.quasis = [b]; !b.tail;) this.expect(d.dollarBraceL), a.expressions.push(this.parseExpression()), this.expect(d.braceR), a.quasis.push(b = this.parseTemplateElement()); return this.next(), this.finishNode(a, \"TemplateLiteral\") }, h.parseObj = function (a, b) { var c = this.startNode(), e = !0, f = {}; for (c.properties = [], this.next() ; !this.eat(d.braceR) ;) { if (e) e = !1; else if (this.expect(d.comma), this.afterTrailingComma(d.braceR)) break; var g = this.startNode(), h = void 0, i = void 0, j = void 0; this.options.ecmaVersion >= 6 && (g.method = !1, g.shorthand = !1, (a || b) && (i = this.start, j = this.startLoc), a || (h = this.eat(d.star))), this.parsePropertyName(g), this.parsePropertyValue(g, a, h, i, j, b), this.checkPropClash(g, f), c.properties.push(this.finishNode(g, \"Property\")) } return this.finishNode(c, a ? \"ObjectPattern\" : \"ObjectExpression\") }, h.parsePropertyValue = function (a, b, c, e, g, h) { this.eat(d.colon) ? (a.value = b ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(!1, h), a.kind = \"init\") : this.options.ecmaVersion >= 6 && this.type === d.parenL ? (b && this.unexpected(), a.kind = \"init\", a.method = !0, a.value = this.parseMethod(c)) : this.options.ecmaVersion >= 5 && !a.computed && \"Identifier\" === a.key.type && (\"get\" === a.key.name || \"set\" === a.key.name) && this.type != d.comma && this.type != d.braceR ? ((c || b) && this.unexpected(), a.kind = a.key.name, this.parsePropertyName(a), a.value = this.parseMethod(!1)) : this.options.ecmaVersion >= 6 && !a.computed && \"Identifier\" === a.key.type ? (a.kind = \"init\", b ? ((this.isKeyword(a.key.name) || this.strict && (f.strictBind(a.key.name) || f.strict(a.key.name)) || !this.options.allowReserved && this.isReservedWord(a.key.name)) && this.raise(a.key.start, \"Binding \" + a.key.name), a.value = this.parseMaybeDefault(e, g, a.key)) : this.type === d.eq && h ? (h.start || (h.start = this.start), a.value = this.parseMaybeDefault(e, g, a.key)) : a.value = a.key, a.shorthand = !0) : this.unexpected() }, h.parsePropertyName = function (a) { if (this.options.ecmaVersion >= 6) { if (this.eat(d.bracketL)) return a.computed = !0, a.key = this.parseMaybeAssign(), this.expect(d.bracketR), a.key; a.computed = !1 } return a.key = this.type === d.num || this.type === d.string ? this.parseExprAtom() : this.parseIdent(!0) }, h.initFunction = function (a) { a.id = null, this.options.ecmaVersion >= 6 && (a.generator = !1, a.expression = !1) }, h.parseMethod = function (a) { var b = this.startNode(); this.initFunction(b), this.expect(d.parenL), b.params = this.parseBindingList(d.parenR, !1, !1); var c = void 0; return this.options.ecmaVersion >= 6 ? (b.generator = a, c = !0) : c = !1, this.parseFunctionBody(b, c), this.finishNode(b, \"FunctionExpression\") }, h.parseArrowExpression = function (a, b) { return this.initFunction(a), a.params = this.toAssignableList(b, !0), this.parseFunctionBody(a, !0), this.finishNode(a, \"ArrowFunctionExpression\") }, h.parseFunctionBody = function (a, b) { var c = b && this.type !== d.braceL; if (c) a.body = this.parseMaybeAssign(), a.expression = !0; else { var e = this.inFunction, f = this.inGenerator, g = this.labels; this.inFunction = !0, this.inGenerator = a.generator, this.labels = [], a.body = this.parseBlock(!0), a.expression = !1, this.inFunction = e, this.inGenerator = f, this.labels = g } if (this.strict || !c && a.body.body.length && this.isUseStrict(a.body.body[0])) { var h = {}, i = this.strict; this.strict = !0, a.id && this.checkLVal(a.id, !0); for (var j = 0; j < a.params.length; j++) this.checkLVal(a.params[j], !0, h); this.strict = i } }, h.parseExprList = function (a, b, c, e) { for (var f = [], g = !0; !this.eat(a) ;) { if (g) g = !1; else if (this.expect(d.comma), b && this.afterTrailingComma(a)) break; c && this.type === d.comma ? f.push(null) : this.type === d.ellipsis ? f.push(this.parseSpread(e)) : f.push(this.parseMaybeAssign(!1, e)) } return f }, h.parseIdent = function (a) { var b = this.startNode(); return a && \"never\" == this.options.allowReserved && (a = !1), this.type === d.name ? (!a && (!this.options.allowReserved && this.isReservedWord(this.value) || this.strict && f.strict(this.value) && (this.options.ecmaVersion >= 6 || -1 == this.input.slice(this.start, this.end).indexOf(\"\\\\\"))) && this.raise(this.start, \"The keyword '\" + this.value + \"' is reserved\"), b.name = this.value) : a && this.type.keyword ? b.name = this.type.keyword : this.unexpected(), this.next(), this.finishNode(b, \"Identifier\") }, h.parseYield = function () { var a = this.startNode(); return this.next(), this.type == d.semi || this.canInsertSemicolon() || this.type != d.star && !this.type.startsExpr ? (a.delegate = !1, a.argument = null) : (a.delegate = this.eat(d.star), a.argument = this.parseMaybeAssign()), this.finishNode(a, \"YieldExpression\") }, h.parseComprehension = function (a, b) { for (a.blocks = []; this.type === d._for;) { var c = this.startNode(); this.next(), this.expect(d.parenL), c.left = this.parseBindingAtom(), this.checkLVal(c.left, !0), this.expectContextual(\"of\"), c.right = this.parseExpression(), this.expect(d.parenR), a.blocks.push(this.finishNode(c, \"ComprehensionBlock\")) } return a.filter = this.eat(d._if) ? this.parseParenExpression() : null, a.body = this.parseExpression(), this.expect(b ? d.parenR : d.bracketR), a.generator = b, this.finishNode(a, \"ComprehensionExpression\") } }, { \"./identifier\": 7, \"./state\": 13, \"./tokentype\": 17, \"./util\": 18 }], 7: [function (a, b, c) { \"use strict\"; function d(a) { function b(a) { if (1 == a.length) return c += \"return str === \" + JSON.stringify(a[0]) + \";\"; c += \"switch(str){\"; for (var b = 0; b < a.length; ++b) c += \"case \" + JSON.stringify(a[b]) + \":\"; c += \"return true}return false;\" } a = a.split(\" \"); var c = \"\", d = []; a: for (var e = 0; e < a.length; ++e) { for (var f = 0; f < d.length; ++f) if (d[f][0].length == a[e].length) { d[f].push(a[e]); continue a } d.push([a[e]]) } if (d.length > 3) { d.sort(function (a, b) { return b.length - a.length }), c += \"switch(str.length){\"; for (var e = 0; e < d.length; ++e) { var g = d[e]; c += \"case \" + g[0].length + \":\", b(g) } c += \"}\" } else b(a); return new Function(\"str\", c) } function e(a, b) { for (var c = 65536, d = 0; d < b.length; d += 2) { if (c += b[d], c > a) return !1; if (c += b[d + 1], c >= a) return !0 } } function f(a, b) { return 65 > a ? 36 === a : 91 > a ? !0 : 97 > a ? 95 === a : 123 > a ? !0 : 65535 >= a ? a >= 170 && m.test(String.fromCharCode(a)) : b === !1 ? !1 : e(a, o) } function g(a, b) { return 48 > a ? 36 === a : 58 > a ? !0 : 65 > a ? !1 : 91 > a ? !0 : 97 > a ? 95 === a : 123 > a ? !0 : 65535 >= a ? a >= 170 && n.test(String.fromCharCode(a)) : b === !1 ? !1 : e(a, o) || e(a, p) } c.isIdentifierStart = f, c.isIdentifierChar = g, c.__esModule = !0; var h = { 3: d(\"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\"), 5: d(\"class enum extends super const export import\"), 6: d(\"enum await\"), strict: d(\"implements interface let package private protected public static yield\"), strictBind: d(\"eval arguments\") }; c.reservedWords = h; var i = \"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\", j = { 5: d(i), 6: d(i + \" let const class extends export import yield super\") }; c.keywords = j; var k = \"ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠ-ࢲऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞭꞰꞱꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭟꭤꭥꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ﬀ-ﬆﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼＡ-Ｚａ-ｚｦ-ﾾￂ-ￇￊ-ￏￒ-ￗￚ-ￜ\", l = \"‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࣤ-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఃా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഁ-ഃാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ູົຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏ᦰ-ᧀᧈᧉ᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭ᳲ-᳴᳸᳹᷀-᷵᷼-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-꣄꣐-꣙꣠-꣱꤀-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︭︳︴﹍-﹏０-９＿\", m = new RegExp(\"[\" + k + \"]\"), n = new RegExp(\"[\" + k + l + \"]\"); k = l = null; var o = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 17, 26, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 99, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 98, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 26, 45, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 955, 52, 76, 44, 33, 24, 27, 35, 42, 34, 4, 0, 13, 47, 15, 3, 22, 0, 38, 17, 2, 24, 133, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 32, 4, 287, 47, 21, 1, 2, 0, 185, 46, 82, 47, 21, 0, 60, 42, 502, 63, 32, 0, 449, 56, 1288, 920, 104, 110, 2962, 1070, 13266, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 881, 68, 12, 0, 67, 12, 16481, 1, 3071, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 4149, 196, 1340, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42710, 42, 4148, 12, 221, 16355, 541], p = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 1306, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 52, 0, 13, 2, 49, 13, 16, 9, 83, 11, 168, 11, 6, 9, 8, 2, 57, 0, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 316, 19, 13, 9, 214, 6, 3, 8, 112, 16, 16, 9, 82, 12, 9, 9, 535, 9, 20855, 9, 135, 4, 60, 6, 26, 9, 1016, 45, 17, 3, 19723, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 4305, 6, 792618, 239] }, {}], 8: [function (a, b, c) { \"use strict\"; function d(a, b) { for (var c = 1, d = 0; ;) { g.lastIndex = d; var e = g.exec(a); if (!(e && e.index < b)) return new h(c, b - d); ++c, d = e.index + e[0].length } } var e = function (a, b) { if (!(a instanceof b)) throw new TypeError(\"Cannot call a class as a function\") }; c.getLineInfo = d, c.__esModule = !0; var f = a(\"./state\").Parser, g = a(\"./whitespace\").lineBreakG, h = (a(\"util\").deprecate, c.Position = function () { function a(b, c) { e(this, a), this.line = b, this.column = c } return a.prototype.offset = function (b) { return new a(this.line, this.column + b) }, a }()), i = (c.SourceLocation = function j(a, b, c) { e(this, j), this.start = b, this.end = c, null !== a.sourceFile && (this.source = a.sourceFile) }, f.prototype); i.raise = function (a, b) { var c = d(this.input, a); b += \" (\" + c.line + \":\" + c.column + \")\"; var e = new SyntaxError(b); throw e.pos = a, e.loc = c, e.raisedAt = this.pos, e }, i.curPosition = function () { return new h(this.curLine, this.pos - this.lineStart) }, i.markPosition = function () { return this.options.locations ? [this.start, this.startLoc] : this.start } }, { \"./state\": 13, \"./whitespace\": 19, util: 5 }], 9: [function (a, b, c) { \"use strict\"; var d = a(\"./tokentype\").types, e = a(\"./state\").Parser, f = a(\"./identifier\").reservedWords, g = a(\"./util\").has, h = e.prototype; h.toAssignable = function (a, b) { if (this.options.ecmaVersion >= 6 && a) switch (a.type) { case \"Identifier\": case \"ObjectPattern\": case \"ArrayPattern\": case \"AssignmentPattern\": break; case \"ObjectExpression\": a.type = \"ObjectPattern\"; for (var c = 0; c < a.properties.length; c++) { var d = a.properties[c]; \"init\" !== d.kind && this.raise(d.key.start, \"Object pattern can't contain getter or setter\"), this.toAssignable(d.value, b) } break; case \"ArrayExpression\": a.type = \"ArrayPattern\", this.toAssignableList(a.elements, b); break; case \"AssignmentExpression\": \"=\" === a.operator ? a.type = \"AssignmentPattern\" : this.raise(a.left.end, \"Only '=' operator can be used for specifying default value.\"); break; case \"ParenthesizedExpression\": a.expression = this.toAssignable(a.expression, b); break; case \"MemberExpression\": if (!b) break; default: this.raise(a.start, \"Assigning to rvalue\") } return a }, h.toAssignableList = function (a, b) { var c = a.length; if (c) { var d = a[c - 1]; if (d && \"RestElement\" == d.type)--c; else if (d && \"SpreadElement\" == d.type) { d.type = \"RestElement\"; var e = d.argument; this.toAssignable(e, b), \"Identifier\" !== e.type && \"MemberExpression\" !== e.type && \"ArrayPattern\" !== e.type && this.unexpected(e.start), --c } } for (var f = 0; c > f; f++) { var g = a[f]; g && this.toAssignable(g, b) } return a }, h.parseSpread = function (a) { var b = this.startNode(); return this.next(), b.argument = this.parseMaybeAssign(a), this.finishNode(b, \"SpreadElement\") }, h.parseRest = function () { var a = this.startNode(); return this.next(), a.argument = this.type === d.name || this.type === d.bracketL ? this.parseBindingAtom() : this.unexpected(), this.finishNode(a, \"RestElement\") }, h.parseBindingAtom = function () { if (this.options.ecmaVersion < 6) return this.parseIdent(); switch (this.type) { case d.name: return this.parseIdent(); case d.bracketL: var a = this.startNode(); return this.next(), a.elements = this.parseBindingList(d.bracketR, !0, !0), this.finishNode(a, \"ArrayPattern\"); case d.braceL: return this.parseObj(!0); default: this.unexpected() } }, h.parseBindingList = function (a, b, c) { for (var e = [], f = !0; !this.eat(a) ;) if (f ? f = !1 : this.expect(d.comma), b && this.type === d.comma) e.push(null); else { if (c && this.afterTrailingComma(a)) break; if (this.type === d.ellipsis) { var g = this.parseRest(); this.parseBindingListItem(g), e.push(g), this.expect(a); break } var h = this.parseMaybeDefault(this.start, this.startLoc); this.parseBindingListItem(h), e.push(h) } return e }, h.parseBindingListItem = function (a) { return a }, h.parseMaybeDefault = function (a, b, c) { if (Array.isArray(a) && this.options.locations && void 0 === noCalls && (c = b, b = a[1], a = a[0]), c = c || this.parseBindingAtom(), !this.eat(d.eq)) return c; var e = this.startNodeAt(a, b); return e.operator = \"=\", e.left = c, e.right = this.parseMaybeAssign(), this.finishNode(e, \"AssignmentPattern\") }, h.checkLVal = function (a, b, c) { switch (a.type) { case \"Identifier\": this.strict && (f.strictBind(a.name) || f.strict(a.name)) && this.raise(a.start, (b ? \"Binding \" : \"Assigning to \") + a.name + \" in strict mode\"), c && (g(c, a.name) && this.raise(a.start, \"Argument name clash in strict mode\"), c[a.name] = !0); break; case \"MemberExpression\": b && this.raise(a.start, (b ? \"Binding\" : \"Assigning to\") + \" member expression\"); break; case \"ObjectPattern\": for (var d = 0; d < a.properties.length; d++) this.checkLVal(a.properties[d].value, b, c); break; case \"ArrayPattern\": for (var d = 0; d < a.elements.length; d++) { var e = a.elements[d]; e && this.checkLVal(e, b, c) } break; case \"AssignmentPattern\": this.checkLVal(a.left, b, c); break; case \"RestElement\": this.checkLVal(a.argument, b, c); break; case \"ParenthesizedExpression\": this.checkLVal(a.expression, b, c); break; default: this.raise(a.start, (b ? \"Binding\" : \"Assigning to\") + \" rvalue\") } } }, { \"./identifier\": 7, \"./state\": 13, \"./tokentype\": 17, \"./util\": 18 }], 10: [function (a, b, c) { \"use strict\"; var d = function (a, b) { if (!(a instanceof b)) throw new TypeError(\"Cannot call a class as a function\") }; c.__esModule = !0; var e = a(\"./state\").Parser, f = a(\"./location\").SourceLocation, g = e.prototype, h = c.Node = function i() { d(this, i) }; g.startNode = function () { var a = new h; return a.start = this.start, this.options.locations && (a.loc = new f(this, this.startLoc)), this.options.directSourceFile && (a.sourceFile = this.options.directSourceFile), this.options.ranges && (a.range = [this.start, 0]), a }, g.startNodeAt = function (a, b) { var c = new h; return Array.isArray(a) && this.options.locations && void 0 === b && (b = a[1], a = a[0]), c.start = a, this.options.locations && (c.loc = new f(this, b)), this.options.directSourceFile && (c.sourceFile = this.options.directSourceFile), this.options.ranges && (c.range = [a, 0]), c }, g.finishNode = function (a, b) { return a.type = b, a.end = this.lastTokEnd, this.options.locations && (a.loc.end = this.lastTokEndLoc), this.options.ranges && (a.range[1] = this.lastTokEnd), a }, g.finishNodeAt = function (a, b, c, d) { return a.type = b, Array.isArray(c) && this.options.locations && void 0 === d && (d = c[1], c = c[0]), a.end = c, this.options.locations && (a.loc.end = d), this.options.ranges && (a.range[1] = c), a } }, { \"./location\": 8, \"./state\": 13 }], 11: [function (a, b, c) { \"use strict\"; function d(a) { var b = {}; for (var c in j) b[c] = a && g(a, c) ? a[c] : j[c]; return h(b.onToken) && !function () { var a = b.onToken; b.onToken = function (b) { return a.push(b) } }(), h(b.onComment) && (b.onComment = e(b, b.onComment)), b } function e(a, b) { return function (c, d, e, f, g, h) { var j = { type: c ? \"Block\" : \"Line\", value: d, start: e, end: f }; a.locations && (j.loc = new i(this, g, h)), a.ranges && (j.range = [e, f]), b.push(j) } } c.getOptions = d, c.__esModule = !0; var f = a(\"./util\"), g = f.has, h = f.isArray, i = a(\"./location\").SourceLocation, j = { ecmaVersion: 5, sourceType: \"script\", onInsertedSemicolon: null, onTrailingComma: null, allowReserved: !0, allowReturnOutsideFunction: !1, allowImportExportEverywhere: !1, allowHashBang: !1, locations: !1, onToken: null, onComment: null, ranges: !1, program: null, sourceFile: null, directSourceFile: null, preserveParens: !1, plugins: {} }; c.defaultOptions = j }, { \"./location\": 8, \"./util\": 18 }], 12: [function (a, b, c) { \"use strict\"; var d = a(\"./tokentype\").types, e = a(\"./state\").Parser, f = a(\"./whitespace\").lineBreak, g = e.prototype; g.isUseStrict = function (a) { return this.options.ecmaVersion >= 5 && \"ExpressionStatement\" === a.type && \"Literal\" === a.expression.type && \"use strict\" === a.expression.value }, g.eat = function (a) { return this.type === a ? (this.next(), !0) : !1 }, g.isContextual = function (a) { return this.type === d.name && this.value === a }, g.eatContextual = function (a) { return this.value === a && this.eat(d.name) }, g.expectContextual = function (a) { this.eatContextual(a) || this.unexpected() }, g.canInsertSemicolon = function () { return this.type === d.eof || this.type === d.braceR || f.test(this.input.slice(this.lastTokEnd, this.start)) }, g.insertSemicolon = function () { return this.canInsertSemicolon() ? (this.options.onInsertedSemicolon && this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc), !0) : void 0 }, g.semicolon = function () { this.eat(d.semi) || this.insertSemicolon() || this.unexpected() }, g.afterTrailingComma = function (a) { return this.type == a ? (this.options.onTrailingComma && this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc), this.next(), !0) : void 0 }, g.expect = function (a) { this.eat(a) || this.unexpected() }, g.unexpected = function (a) { this.raise(null != a ? a : this.start, \"Unexpected token\") } }, { \"./state\": 13, \"./tokentype\": 17, \"./whitespace\": 19 }], 13: [function (a, b, c) { \"use strict\"; function d(a, b, c) { this.options = a, this.sourceFile = this.options.sourceFile || null, this.isKeyword = g[this.options.ecmaVersion >= 6 ? 6 : 5], this.isReservedWord = f[this.options.ecmaVersion], this.input = b, this.loadPlugins(this.options.plugins), c ? (this.pos = c, this.lineStart = Math.max(0, this.input.lastIndexOf(\"\\n\", c)), this.curLine = this.input.slice(0, this.lineStart).split(i).length) : (this.pos = this.lineStart = 0, this.curLine = 1), this.type = h.eof, this.value = null, this.start = this.end = this.pos, this.startLoc = this.endLoc = null, this.lastTokEndLoc = this.lastTokStartLoc = null, this.lastTokStart = this.lastTokEnd = this.pos, this.context = this.initialContext(), this.exprAllowed = !0, this.strict = this.inModule = \"module\" === this.options.sourceType, this.potentialArrowAt = -1, this.inFunction = this.inGenerator = !1, this.labels = [], 0 === this.pos && this.options.allowHashBang && \"#!\" === this.input.slice(0, 2) && this.skipLineComment(2) } c.Parser = d, c.__esModule = !0; var e = a(\"./identifier\"), f = e.reservedWords, g = e.keywords, h = a(\"./tokentype\").types, i = a(\"./whitespace\").lineBreak; d.prototype.extend = function (a, b) { this[a] = b(this[a]) }; var j = {}; c.plugins = j, d.prototype.loadPlugins = function (a) { for (var b in a) { var d = c.plugins[b]; if (!d) throw new Error(\"Plugin '\" + b + \"' not found\"); d(this, a[b]) } } }, { \"./identifier\": 7, \"./tokentype\": 17, \"./whitespace\": 19 }], 14: [function (a, b, c) {\n                \"use strict\"; var d = a(\"./tokentype\").types, e = a(\"./state\").Parser, f = a(\"./whitespace\").lineBreak, g = e.prototype; g.parseTopLevel = function (a) { var b = !0; for (a.body || (a.body = []) ; this.type !== d.eof;) { var c = this.parseStatement(!0, !0); a.body.push(c), b && this.isUseStrict(c) && this.setStrict(!0), b = !1 } return this.next(), this.options.ecmaVersion >= 6 && (a.sourceType = this.options.sourceType), this.finishNode(a, \"Program\") }; var h = { kind: \"loop\" }, i = { kind: \"switch\" }; g.parseStatement = function (a, b) { var c = this.type, e = this.startNode(); switch (c) { case d._break: case d._continue: return this.parseBreakContinueStatement(e, c.keyword); case d._debugger: return this.parseDebuggerStatement(e); case d._do: return this.parseDoStatement(e); case d._for: return this.parseForStatement(e); case d._function: return !a && this.options.ecmaVersion >= 6 && this.unexpected(), this.parseFunctionStatement(e); case d._class: return a || this.unexpected(), this.parseClass(e, !0); case d._if: return this.parseIfStatement(e); case d._return: return this.parseReturnStatement(e); case d._switch: return this.parseSwitchStatement(e); case d._throw: return this.parseThrowStatement(e); case d._try: return this.parseTryStatement(e); case d._let: case d._const: a || this.unexpected(); case d._var: return this.parseVarStatement(e, c); case d._while: return this.parseWhileStatement(e); case d._with: return this.parseWithStatement(e); case d.braceL: return this.parseBlock(); case d.semi: return this.parseEmptyStatement(e); case d._export: case d._import: return this.options.allowImportExportEverywhere || (b || this.raise(this.start, \"'import' and 'export' may only appear at the top level\"), this.inModule || this.raise(this.start, \"'import' and 'export' may appear only with 'sourceType: module'\")), c === d._import ? this.parseImport(e) : this.parseExport(e); default: var f = this.value, g = this.parseExpression(); return c === d.name && \"Identifier\" === g.type && this.eat(d.colon) ? this.parseLabeledStatement(e, f, g) : this.parseExpressionStatement(e, g) } }, g.parseBreakContinueStatement = function (a, b) { var c = \"break\" == b; this.next(), this.eat(d.semi) || this.insertSemicolon() ? a.label = null : this.type !== d.name ? this.unexpected() : (a.label = this.parseIdent(), this.semicolon()); for (var e = 0; e < this.labels.length; ++e) { var f = this.labels[e]; if (null == a.label || f.name === a.label.name) { if (null != f.kind && (c || \"loop\" === f.kind)) break; if (a.label && c) break } } return e === this.labels.length && this.raise(a.start, \"Unsyntactic \" + b), this.finishNode(a, c ? \"BreakStatement\" : \"ContinueStatement\") }, g.parseDebuggerStatement = function (a) { return this.next(), this.semicolon(), this.finishNode(a, \"DebuggerStatement\") }, g.parseDoStatement = function (a) { return this.next(), this.labels.push(h), a.body = this.parseStatement(!1), this.labels.pop(), this.expect(d._while), a.test = this.parseParenExpression(), this.options.ecmaVersion >= 6 ? this.eat(d.semi) : this.semicolon(), this.finishNode(a, \"DoWhileStatement\") }, g.parseForStatement = function (a) {\n                    if (this.next(), this.labels.push(h), this.expect(d.parenL), this.type === d.semi) return this.parseFor(a, null); if (this.type === d._var || this.type === d._let || this.type === d._const) { var b = this.startNode(), c = this.type; return this.next(), this.parseVar(b, !0, c), this.finishNode(b, \"VariableDeclaration\"), !(this.type === d._in || this.options.ecmaVersion >= 6 && this.isContextual(\"of\")) || 1 !== b.declarations.length || c !== d._var && b.declarations[0].init ? this.parseFor(a, b) : this.parseForIn(a, b) } var e = { start: 0 }, f = this.parseExpression(!0, e); return this.type === d._in || this.options.ecmaVersion >= 6 && this.isContextual(\"of\") ? (this.toAssignable(f),\n                    this.checkLVal(f), this.parseForIn(a, f)) : (e.start && this.unexpected(e.start), this.parseFor(a, f))\n                }, g.parseFunctionStatement = function (a) { return this.next(), this.parseFunction(a, !0) }, g.parseIfStatement = function (a) { return this.next(), a.test = this.parseParenExpression(), a.consequent = this.parseStatement(!1), a.alternate = this.eat(d._else) ? this.parseStatement(!1) : null, this.finishNode(a, \"IfStatement\") }, g.parseReturnStatement = function (a) { return this.inFunction || this.options.allowReturnOutsideFunction || this.raise(this.start, \"'return' outside of function\"), this.next(), this.eat(d.semi) || this.insertSemicolon() ? a.argument = null : (a.argument = this.parseExpression(), this.semicolon()), this.finishNode(a, \"ReturnStatement\") }, g.parseSwitchStatement = function (a) { this.next(), a.discriminant = this.parseParenExpression(), a.cases = [], this.expect(d.braceL), this.labels.push(i); for (var b, c; this.type != d.braceR;) if (this.type === d._case || this.type === d._default) { var e = this.type === d._case; b && this.finishNode(b, \"SwitchCase\"), a.cases.push(b = this.startNode()), b.consequent = [], this.next(), e ? b.test = this.parseExpression() : (c && this.raise(this.lastTokStart, \"Multiple default clauses\"), c = !0, b.test = null), this.expect(d.colon) } else b || this.unexpected(), b.consequent.push(this.parseStatement(!0)); return b && this.finishNode(b, \"SwitchCase\"), this.next(), this.labels.pop(), this.finishNode(a, \"SwitchStatement\") }, g.parseThrowStatement = function (a) { return this.next(), f.test(this.input.slice(this.lastTokEnd, this.start)) && this.raise(this.lastTokEnd, \"Illegal newline after throw\"), a.argument = this.parseExpression(), this.semicolon(), this.finishNode(a, \"ThrowStatement\") }; var j = []; g.parseTryStatement = function (a) { if (this.next(), a.block = this.parseBlock(), a.handler = null, this.type === d._catch) { var b = this.startNode(); this.next(), this.expect(d.parenL), b.param = this.parseBindingAtom(), this.checkLVal(b.param, !0), this.expect(d.parenR), b.guard = null, b.body = this.parseBlock(), a.handler = this.finishNode(b, \"CatchClause\") } return a.guardedHandlers = j, a.finalizer = this.eat(d._finally) ? this.parseBlock() : null, a.handler || a.finalizer || this.raise(a.start, \"Missing catch or finally clause\"), this.finishNode(a, \"TryStatement\") }, g.parseVarStatement = function (a, b) { return this.next(), this.parseVar(a, !1, b), this.semicolon(), this.finishNode(a, \"VariableDeclaration\") }, g.parseWhileStatement = function (a) { return this.next(), a.test = this.parseParenExpression(), this.labels.push(h), a.body = this.parseStatement(!1), this.labels.pop(), this.finishNode(a, \"WhileStatement\") }, g.parseWithStatement = function (a) { return this.strict && this.raise(this.start, \"'with' in strict mode\"), this.next(), a.object = this.parseParenExpression(), a.body = this.parseStatement(!1), this.finishNode(a, \"WithStatement\") }, g.parseEmptyStatement = function (a) { return this.next(), this.finishNode(a, \"EmptyStatement\") }, g.parseLabeledStatement = function (a, b, c) { for (var e = 0; e < this.labels.length; ++e) this.labels[e].name === b && this.raise(c.start, \"Label '\" + b + \"' is already declared\"); var f = this.type.isLoop ? \"loop\" : this.type === d._switch ? \"switch\" : null; return this.labels.push({ name: b, kind: f }), a.body = this.parseStatement(!0), this.labels.pop(), a.label = c, this.finishNode(a, \"LabeledStatement\") }, g.parseExpressionStatement = function (a, b) { return a.expression = b, this.semicolon(), this.finishNode(a, \"ExpressionStatement\") }, g.parseBlock = function (a) { var b = this.startNode(), c = !0, e = void 0; for (b.body = [], this.expect(d.braceL) ; !this.eat(d.braceR) ;) { var f = this.parseStatement(!0); b.body.push(f), c && a && this.isUseStrict(f) && (e = this.strict, this.setStrict(this.strict = !0)), c = !1 } return e === !1 && this.setStrict(!1), this.finishNode(b, \"BlockStatement\") }, g.parseFor = function (a, b) { return a.init = b, this.expect(d.semi), a.test = this.type === d.semi ? null : this.parseExpression(), this.expect(d.semi), a.update = this.type === d.parenR ? null : this.parseExpression(), this.expect(d.parenR), a.body = this.parseStatement(!1), this.labels.pop(), this.finishNode(a, \"ForStatement\") }, g.parseForIn = function (a, b) { var c = this.type === d._in ? \"ForInStatement\" : \"ForOfStatement\"; return this.next(), a.left = b, a.right = this.parseExpression(), this.expect(d.parenR), a.body = this.parseStatement(!1), this.labels.pop(), this.finishNode(a, c) }, g.parseVar = function (a, b, c) { for (a.declarations = [], a.kind = c.keyword; ;) { var e = this.startNode(); if (this.parseVarId(e), this.eat(d.eq) ? e.init = this.parseMaybeAssign(b) : c !== d._const || this.type === d._in || this.options.ecmaVersion >= 6 && this.isContextual(\"of\") ? \"Identifier\" == e.id.type || b && (this.type === d._in || this.isContextual(\"of\")) ? e.init = null : this.raise(this.lastTokEnd, \"Complex binding patterns require an initialization value\") : this.unexpected(), a.declarations.push(this.finishNode(e, \"VariableDeclarator\")), !this.eat(d.comma)) break } return a }, g.parseVarId = function (a) { a.id = this.parseBindingAtom(), this.checkLVal(a.id, !0) }, g.parseFunction = function (a, b, c) { return this.initFunction(a), this.options.ecmaVersion >= 6 && (a.generator = this.eat(d.star)), (b || this.type === d.name) && (a.id = this.parseIdent()), this.parseFunctionParams(a), this.parseFunctionBody(a, c), this.finishNode(a, b ? \"FunctionDeclaration\" : \"FunctionExpression\") }, g.parseFunctionParams = function (a) { this.expect(d.parenL), a.params = this.parseBindingList(d.parenR, !1, !1) }, g.parseClass = function (a, b) { this.next(), this.parseClassId(a, b), this.parseClassSuper(a); var c = this.startNode(), e = !1; for (c.body = [], this.expect(d.braceL) ; !this.eat(d.braceR) ;) if (!this.eat(d.semi)) { var f = this.startNode(), g = this.eat(d.star), h = this.type === d.name && \"static\" === this.value; if (this.parsePropertyName(f), f[\"static\"] = h && this.type !== d.parenL, f[\"static\"] && (g && this.unexpected(), g = this.eat(d.star), this.parsePropertyName(f)), f.kind = \"method\", !f.computed) { var i = f.key, j = !1; g || \"Identifier\" !== i.type || this.type === d.parenL || \"get\" !== i.name && \"set\" !== i.name || (j = !0, f.kind = i.name, i = this.parsePropertyName(f)), !f[\"static\"] && (\"Identifier\" === i.type && \"constructor\" === i.name || \"Literal\" === i.type && \"constructor\" === i.value) && (e && this.raise(i.start, \"Duplicate constructor in the same class\"), j && this.raise(i.start, \"Constructor can't have get/set modifier\"), g && this.raise(i.start, \"Constructor can't be a generator\"), f.kind = \"constructor\", e = !0) } this.parseClassMethod(c, f, g) } return a.body = this.finishNode(c, \"ClassBody\"), this.finishNode(a, b ? \"ClassDeclaration\" : \"ClassExpression\") }, g.parseClassMethod = function (a, b, c) { b.value = this.parseMethod(c), a.body.push(this.finishNode(b, \"MethodDefinition\")) }, g.parseClassId = function (a, b) { a.id = this.type === d.name ? this.parseIdent() : b ? this.unexpected() : null }, g.parseClassSuper = function (a) { a.superClass = this.eat(d._extends) ? this.parseExprSubscripts() : null }, g.parseExport = function (a) { if (this.next(), this.eat(d.star)) return this.expectContextual(\"from\"), a.source = this.type === d.string ? this.parseExprAtom() : this.unexpected(), this.semicolon(), this.finishNode(a, \"ExportAllDeclaration\"); if (this.eat(d._default)) { var b = this.parseMaybeAssign(), c = !0; return (\"FunctionExpression\" == b.type || \"ClassExpression\" == b.type) && (c = !1, b.id && (b.type = \"FunctionExpression\" == b.type ? \"FunctionDeclaration\" : \"ClassDeclaration\")), a.declaration = b, c && this.semicolon(), this.finishNode(a, \"ExportDefaultDeclaration\") } return this.shouldParseExportStatement() ? (a.declaration = this.parseStatement(!0), a.specifiers = [], a.source = null) : (a.declaration = null, a.specifiers = this.parseExportSpecifiers(), this.eatContextual(\"from\") ? a.source = this.type === d.string ? this.parseExprAtom() : this.unexpected() : a.source = null, this.semicolon()), this.finishNode(a, \"ExportNamedDeclaration\") }, g.shouldParseExportStatement = function () { return this.type.keyword }, g.parseExportSpecifiers = function () { var a = [], b = !0; for (this.expect(d.braceL) ; !this.eat(d.braceR) ;) { if (b) b = !1; else if (this.expect(d.comma), this.afterTrailingComma(d.braceR)) break; var c = this.startNode(); c.local = this.parseIdent(this.type === d._default), c.exported = this.eatContextual(\"as\") ? this.parseIdent(!0) : c.local, a.push(this.finishNode(c, \"ExportSpecifier\")) } return a }, g.parseImport = function (a) { return this.next(), this.type === d.string ? (a.specifiers = j, a.source = this.parseExprAtom(), a.kind = \"\") : (a.specifiers = this.parseImportSpecifiers(), this.expectContextual(\"from\"), a.source = this.type === d.string ? this.parseExprAtom() : this.unexpected()), this.semicolon(), this.finishNode(a, \"ImportDeclaration\") }, g.parseImportSpecifiers = function () { var a = [], b = !0; if (this.type === d.name) { var c = this.startNode(); if (c.local = this.parseIdent(), this.checkLVal(c.local, !0), a.push(this.finishNode(c, \"ImportDefaultSpecifier\")), !this.eat(d.comma)) return a } if (this.type === d.star) { var c = this.startNode(); return this.next(), this.expectContextual(\"as\"), c.local = this.parseIdent(), this.checkLVal(c.local, !0), a.push(this.finishNode(c, \"ImportNamespaceSpecifier\")), a } for (this.expect(d.braceL) ; !this.eat(d.braceR) ;) { if (b) b = !1; else if (this.expect(d.comma), this.afterTrailingComma(d.braceR)) break; var c = this.startNode(); c.imported = this.parseIdent(!0), c.local = this.eatContextual(\"as\") ? this.parseIdent() : c.imported, this.checkLVal(c.local, !0), a.push(this.finishNode(c, \"ImportSpecifier\")) } return a }\n            }, { \"./state\": 13, \"./tokentype\": 17, \"./whitespace\": 19 }], 15: [function (a, b, c) { \"use strict\"; var d = function (a, b) { if (!(a instanceof b)) throw new TypeError(\"Cannot call a class as a function\") }; c.__esModule = !0; var e = a(\"./state\").Parser, f = a(\"./tokentype\").types, g = a(\"./whitespace\").lineBreak, h = c.TokContext = function k(a, b, c, e) { d(this, k), this.token = a, this.isExpr = b, this.preserveSpace = c, this.override = e }, i = { b_stat: new h(\"{\", !1), b_expr: new h(\"{\", !0), b_tmpl: new h(\"${\", !0), p_stat: new h(\"(\", !1), p_expr: new h(\"(\", !0), q_tmpl: new h(\"`\", !0, !0, function (a) { return a.readTmplToken() }), f_expr: new h(\"function\", !0) }; c.types = i; var j = e.prototype; j.initialContext = function () { return [i.b_stat] }, j.braceIsBlock = function (a) { var b = void 0; return a === f.colon && \"{\" == (b = this.curContext()).token ? !b.isExpr : a === f._return ? g.test(this.input.slice(this.lastTokEnd, this.start)) : a === f._else || a === f.semi || a === f.eof ? !0 : a == f.braceL ? this.curContext() === i.b_stat : !this.exprAllowed }, j.updateContext = function (a) { var b = void 0, c = this.type; c.keyword && a == f.dot ? this.exprAllowed = !1 : (b = c.updateContext) ? b.call(this, a) : this.exprAllowed = c.beforeExpr }, f.parenR.updateContext = f.braceR.updateContext = function () { if (1 == this.context.length) return void (this.exprAllowed = !0); var a = this.context.pop(); a === i.b_stat && this.curContext() === i.f_expr ? (this.context.pop(), this.exprAllowed = !1) : a === i.b_tmpl ? this.exprAllowed = !0 : this.exprAllowed = !a.isExpr }, f.braceL.updateContext = function (a) { this.context.push(this.braceIsBlock(a) ? i.b_stat : i.b_expr), this.exprAllowed = !0 }, f.dollarBraceL.updateContext = function () { this.context.push(i.b_tmpl), this.exprAllowed = !0 }, f.parenL.updateContext = function (a) { var b = a === f._if || a === f._for || a === f._with || a === f._while; this.context.push(b ? i.p_stat : i.p_expr), this.exprAllowed = !0 }, f.incDec.updateContext = function () { }, f._function.updateContext = function () { this.curContext() !== i.b_stat && this.context.push(i.f_expr), this.exprAllowed = !1 }, f.backQuote.updateContext = function () { this.curContext() === i.q_tmpl ? this.context.pop() : this.context.push(i.q_tmpl), this.exprAllowed = !1 } }, { \"./state\": 13, \"./tokentype\": 17, \"./whitespace\": 19 }], 16: [function (a, b, c) { \"use strict\"; function d(a) { return 65535 >= a ? String.fromCharCode(a) : String.fromCharCode((a - 65536 >> 10) + 55296, (a - 65536 & 1023) + 56320) } var e = function (a, b) { if (!(a instanceof b)) throw new TypeError(\"Cannot call a class as a function\") }; c.__esModule = !0; var f = a(\"./identifier\"), g = f.isIdentifierStart, h = f.isIdentifierChar, i = a(\"./tokentype\"), j = i.types, k = i.keywords, l = a(\"./state\").Parser, m = a(\"./location\").SourceLocation, n = a(\"./whitespace\"), o = n.lineBreak, p = n.lineBreakG, q = n.isNewLine, r = n.nonASCIIwhitespace, s = c.Token = function y(a) { e(this, y), this.type = a.type, this.value = a.value, this.start = a.start, this.end = a.end, a.options.locations && (this.loc = new m(a, a.startLoc, a.endLoc)), a.options.ranges && (this.range = [a.start, a.end]) }, t = l.prototype, u = \"undefined\" != typeof Packages; t.next = function () { this.options.onToken && this.options.onToken(new s(this)), this.lastTokEnd = this.end, this.lastTokStart = this.start, this.lastTokEndLoc = this.endLoc, this.lastTokStartLoc = this.startLoc, this.nextToken() }, t.getToken = function () { return this.next(), new s(this) }, \"undefined\" != typeof Symbol && (t[Symbol.iterator] = function () { var a = this; return { next: function () { var b = a.getToken(); return { done: b.type === j.eof, value: b } } } }), t.setStrict = function (a) { if (this.strict = a, this.type === j.num || this.type === j.string) { if (this.pos = this.start, this.options.locations) for (; this.pos < this.lineStart;) this.lineStart = this.input.lastIndexOf(\"\\n\", this.lineStart - 2) + 1, --this.curLine; this.nextToken() } }, t.curContext = function () { return this.context[this.context.length - 1] }, t.nextToken = function () { var a = this.curContext(); return a && a.preserveSpace || this.skipSpace(), this.start = this.pos, this.options.locations && (this.startLoc = this.curPosition()), this.pos >= this.input.length ? this.finishToken(j.eof) : a.override ? a.override(this) : void this.readToken(this.fullCharCodeAtPos()) }, t.readToken = function (a) { return g(a, this.options.ecmaVersion >= 6) || 92 === a ? this.readWord() : this.getTokenFromCode(a) }, t.fullCharCodeAtPos = function () { var a = this.input.charCodeAt(this.pos); if (55295 >= a || a >= 57344) return a; var b = this.input.charCodeAt(this.pos + 1); return (a << 10) + b - 56613888 }, t.skipBlockComment = function () { var a = this.options.onComment && this.options.locations && this.curPosition(), b = this.pos, c = this.input.indexOf(\"*/\", this.pos += 2); if (-1 === c && this.raise(this.pos - 2, \"Unterminated comment\"), this.pos = c + 2, this.options.locations) { p.lastIndex = b; for (var d = void 0; (d = p.exec(this.input)) && d.index < this.pos;)++this.curLine, this.lineStart = d.index + d[0].length } this.options.onComment && this.options.onComment(!0, this.input.slice(b + 2, c), b, this.pos, a, this.options.locations && this.curPosition()) }, t.skipLineComment = function (a) { for (var b = this.pos, c = this.options.onComment && this.options.locations && this.curPosition(), d = this.input.charCodeAt(this.pos += a) ; this.pos < this.input.length && 10 !== d && 13 !== d && 8232 !== d && 8233 !== d;)++this.pos, d = this.input.charCodeAt(this.pos); this.options.onComment && this.options.onComment(!1, this.input.slice(b + a, this.pos), b, this.pos, c, this.options.locations && this.curPosition()) }, t.skipSpace = function () { for (; this.pos < this.input.length;) { var a = this.input.charCodeAt(this.pos); if (32 === a)++this.pos; else if (13 === a) { ++this.pos; var b = this.input.charCodeAt(this.pos); 10 === b && ++this.pos, this.options.locations && (++this.curLine, this.lineStart = this.pos) } else if (10 === a || 8232 === a || 8233 === a)++this.pos, this.options.locations && (++this.curLine, this.lineStart = this.pos); else if (a > 8 && 14 > a)++this.pos; else if (47 === a) { var b = this.input.charCodeAt(this.pos + 1); if (42 === b) this.skipBlockComment(); else { if (47 !== b) break; this.skipLineComment(2) } } else if (160 === a)++this.pos; else { if (!(a >= 5760 && r.test(String.fromCharCode(a)))) break; ++this.pos } } }, t.finishToken = function (a, b) { this.end = this.pos, this.options.locations && (this.endLoc = this.curPosition()); var c = this.type; this.type = a, this.value = b, this.updateContext(c) }, t.readToken_dot = function () { var a = this.input.charCodeAt(this.pos + 1); if (a >= 48 && 57 >= a) return this.readNumber(!0); var b = this.input.charCodeAt(this.pos + 2); return this.options.ecmaVersion >= 6 && 46 === a && 46 === b ? (this.pos += 3, this.finishToken(j.ellipsis)) : (++this.pos, this.finishToken(j.dot)) }, t.readToken_slash = function () { var a = this.input.charCodeAt(this.pos + 1); return this.exprAllowed ? (++this.pos, this.readRegexp()) : 61 === a ? this.finishOp(j.assign, 2) : this.finishOp(j.slash, 1) }, t.readToken_mult_modulo = function (a) { var b = this.input.charCodeAt(this.pos + 1); return 61 === b ? this.finishOp(j.assign, 2) : this.finishOp(42 === a ? j.star : j.modulo, 1) }, t.readToken_pipe_amp = function (a) { var b = this.input.charCodeAt(this.pos + 1); return b === a ? this.finishOp(124 === a ? j.logicalOR : j.logicalAND, 2) : 61 === b ? this.finishOp(j.assign, 2) : this.finishOp(124 === a ? j.bitwiseOR : j.bitwiseAND, 1) }, t.readToken_caret = function () { var a = this.input.charCodeAt(this.pos + 1); return 61 === a ? this.finishOp(j.assign, 2) : this.finishOp(j.bitwiseXOR, 1) }, t.readToken_plus_min = function (a) { var b = this.input.charCodeAt(this.pos + 1); return b === a ? 45 == b && 62 == this.input.charCodeAt(this.pos + 2) && o.test(this.input.slice(this.lastTokEnd, this.pos)) ? (this.skipLineComment(3), this.skipSpace(), this.nextToken()) : this.finishOp(j.incDec, 2) : 61 === b ? this.finishOp(j.assign, 2) : this.finishOp(j.plusMin, 1) }, t.readToken_lt_gt = function (a) { var b = this.input.charCodeAt(this.pos + 1), c = 1; return b === a ? (c = 62 === a && 62 === this.input.charCodeAt(this.pos + 2) ? 3 : 2, 61 === this.input.charCodeAt(this.pos + c) ? this.finishOp(j.assign, c + 1) : this.finishOp(j.bitShift, c)) : 33 == b && 60 == a && 45 == this.input.charCodeAt(this.pos + 2) && 45 == this.input.charCodeAt(this.pos + 3) ? (this.inModule && this.unexpected(), this.skipLineComment(4), this.skipSpace(), this.nextToken()) : (61 === b && (c = 61 === this.input.charCodeAt(this.pos + 2) ? 3 : 2), this.finishOp(j.relational, c)) }, t.readToken_eq_excl = function (a) { var b = this.input.charCodeAt(this.pos + 1); return 61 === b ? this.finishOp(j.equality, 61 === this.input.charCodeAt(this.pos + 2) ? 3 : 2) : 61 === a && 62 === b && this.options.ecmaVersion >= 6 ? (this.pos += 2, this.finishToken(j.arrow)) : this.finishOp(61 === a ? j.eq : j.prefix, 1) }, t.getTokenFromCode = function (a) { switch (a) { case 46: return this.readToken_dot(); case 40: return ++this.pos, this.finishToken(j.parenL); case 41: return ++this.pos, this.finishToken(j.parenR); case 59: return ++this.pos, this.finishToken(j.semi); case 44: return ++this.pos, this.finishToken(j.comma); case 91: return ++this.pos, this.finishToken(j.bracketL); case 93: return ++this.pos, this.finishToken(j.bracketR); case 123: return ++this.pos, this.finishToken(j.braceL); case 125: return ++this.pos, this.finishToken(j.braceR); case 58: return ++this.pos, this.finishToken(j.colon); case 63: return ++this.pos, this.finishToken(j.question); case 96: if (this.options.ecmaVersion < 6) break; return ++this.pos, this.finishToken(j.backQuote); case 48: var b = this.input.charCodeAt(this.pos + 1); if (120 === b || 88 === b) return this.readRadixNumber(16); if (this.options.ecmaVersion >= 6) { if (111 === b || 79 === b) return this.readRadixNumber(8); if (98 === b || 66 === b) return this.readRadixNumber(2) } case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: return this.readNumber(!1); case 34: case 39: return this.readString(a); case 47: return this.readToken_slash(); case 37: case 42: return this.readToken_mult_modulo(a); case 124: case 38: return this.readToken_pipe_amp(a); case 94: return this.readToken_caret(); case 43: case 45: return this.readToken_plus_min(a); case 60: case 62: return this.readToken_lt_gt(a); case 61: case 33: return this.readToken_eq_excl(a); case 126: return this.finishOp(j.prefix, 1) } this.raise(this.pos, \"Unexpected character '\" + d(a) + \"'\") }, t.finishOp = function (a, b) { var c = this.input.slice(this.pos, this.pos + b); return this.pos += b, this.finishToken(a, c) }; var v = !1; try { new RegExp(\"￿\", \"u\"), v = !0 } catch (w) { } t.readRegexp = function () { for (var a = void 0, b = void 0, c = this.pos; ;) { this.pos >= this.input.length && this.raise(c, \"Unterminated regular expression\"); var d = this.input.charAt(this.pos); if (o.test(d) && this.raise(c, \"Unterminated regular expression\"), a) a = !1; else { if (\"[\" === d) b = !0; else if (\"]\" === d && b) b = !1; else if (\"/\" === d && !b) break; a = \"\\\\\" === d } ++this.pos } var e = this.input.slice(c, this.pos); ++this.pos; var f = this.readWord1(), g = e; if (f) { var h = /^[gmsiy]*$/; this.options.ecmaVersion >= 6 && (h = /^[gmsiyu]*$/), h.test(f) || this.raise(c, \"Invalid regular expression flag\"), f.indexOf(\"u\") >= 0 && !v && (g = g.replace(/\\\\u([a-fA-F0-9]{4})|\\\\u\\{([0-9a-fA-F]+)\\}|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\")) } var i = null; if (!u) { try { new RegExp(g) } catch (k) { k instanceof SyntaxError && this.raise(c, \"Error parsing regular expression: \" + k.message), this.raise(k) } try { i = new RegExp(e, f) } catch (l) { } } return this.finishToken(j.regexp, { pattern: e, flags: f, value: i }) }, t.readInt = function (a, b) { for (var c = this.pos, d = 0, e = 0, f = null == b ? 1 / 0 : b; f > e; ++e) { var g = this.input.charCodeAt(this.pos), h = void 0; if (h = g >= 97 ? g - 97 + 10 : g >= 65 ? g - 65 + 10 : g >= 48 && 57 >= g ? g - 48 : 1 / 0, h >= a) break; ++this.pos, d = d * a + h } return this.pos === c || null != b && this.pos - c !== b ? null : d }, t.readRadixNumber = function (a) { this.pos += 2; var b = this.readInt(a); return null == b && this.raise(this.start + 2, \"Expected number in radix \" + a), g(this.fullCharCodeAtPos()) && this.raise(this.pos, \"Identifier directly after number\"), this.finishToken(j.num, b) }, t.readNumber = function (a) { var b = this.pos, c = !1, d = 48 === this.input.charCodeAt(this.pos); a || null !== this.readInt(10) || this.raise(b, \"Invalid number\"), 46 === this.input.charCodeAt(this.pos) && (++this.pos, this.readInt(10), c = !0); var e = this.input.charCodeAt(this.pos); (69 === e || 101 === e) && (e = this.input.charCodeAt(++this.pos), (43 === e || 45 === e) && ++this.pos, null === this.readInt(10) && this.raise(b, \"Invalid number\"), c = !0), g(this.fullCharCodeAtPos()) && this.raise(this.pos, \"Identifier directly after number\"); var f = this.input.slice(b, this.pos), h = void 0; return c ? h = parseFloat(f) : d && 1 !== f.length ? /[89]/.test(f) || this.strict ? this.raise(b, \"Invalid number\") : h = parseInt(f, 8) : h = parseInt(f, 10), this.finishToken(j.num, h) }, t.readCodePoint = function () { var a = this.input.charCodeAt(this.pos), b = void 0; return 123 === a ? (this.options.ecmaVersion < 6 && this.unexpected(), ++this.pos, b = this.readHexChar(this.input.indexOf(\"}\", this.pos) - this.pos), ++this.pos, b > 1114111 && this.unexpected()) : b = this.readHexChar(4), b }, t.readString = function (a) { for (var b = \"\", c = ++this.pos; ;) { this.pos >= this.input.length && this.raise(this.start, \"Unterminated string constant\"); var d = this.input.charCodeAt(this.pos); if (d === a) break; 92 === d ? (b += this.input.slice(c, this.pos), b += this.readEscapedChar(), c = this.pos) : (q(d) && this.raise(this.start, \"Unterminated string constant\"), ++this.pos) } return b += this.input.slice(c, this.pos++), this.finishToken(j.string, b) }, t.readTmplToken = function () { for (var a = \"\", b = this.pos; ;) { this.pos >= this.input.length && this.raise(this.start, \"Unterminated template\"); var c = this.input.charCodeAt(this.pos); if (96 === c || 36 === c && 123 === this.input.charCodeAt(this.pos + 1)) return this.pos === this.start && this.type === j.template ? 36 === c ? (this.pos += 2, this.finishToken(j.dollarBraceL)) : (++this.pos, this.finishToken(j.backQuote)) : (a += this.input.slice(b, this.pos), this.finishToken(j.template, a)); 92 === c ? (a += this.input.slice(b, this.pos), a += this.readEscapedChar(), b = this.pos) : q(c) ? (a += this.input.slice(b, this.pos), ++this.pos, 13 === c && 10 === this.input.charCodeAt(this.pos) ? (++this.pos, a += \"\\n\") : a += String.fromCharCode(c), this.options.locations && (++this.curLine, this.lineStart = this.pos), b = this.pos) : ++this.pos } }, t.readEscapedChar = function () { var a = this.input.charCodeAt(++this.pos), b = /^[0-7]+/.exec(this.input.slice(this.pos, this.pos + 3)); for (b && (b = b[0]) ; b && parseInt(b, 8) > 255;) b = b.slice(0, -1); if (\"0\" === b && (b = null), ++this.pos, b) return this.strict && this.raise(this.pos - 2, \"Octal literal in strict mode\"), this.pos += b.length - 1, String.fromCharCode(parseInt(b, 8)); switch (a) { case 110: return \"\\n\"; case 114: return \"\\r\"; case 120: return String.fromCharCode(this.readHexChar(2)); case 117: return d(this.readCodePoint()); case 116: return \"\t\"; case 98: return \"\\b\"; case 118: return \"\\x0B\"; case 102: return \"\\f\"; case 48: return \"\\x00\"; case 13: 10 === this.input.charCodeAt(this.pos) && ++this.pos; case 10: return this.options.locations && (this.lineStart = this.pos, ++this.curLine), \"\"; default: return String.fromCharCode(a) } }, t.readHexChar = function (a) { var b = this.readInt(16, a); return null === b && this.raise(this.start, \"Bad character escape sequence\"), b }; var x; t.readWord1 = function () { x = !1; for (var a = \"\", b = !0, c = this.pos, e = this.options.ecmaVersion >= 6; this.pos < this.input.length;) { var f = this.fullCharCodeAtPos(); if (h(f, e)) this.pos += 65535 >= f ? 1 : 2; else { if (92 !== f) break; x = !0, a += this.input.slice(c, this.pos); var i = this.pos; 117 != this.input.charCodeAt(++this.pos) && this.raise(this.pos, \"Expecting Unicode escape sequence \\\\uXXXX\"), ++this.pos; var j = this.readCodePoint(); (b ? g : h)(j, e) || this.raise(i, \"Invalid Unicode escape\"), a += d(j), c = this.pos } b = !1 } return a + this.input.slice(c, this.pos) }, t.readWord = function () { var a = this.readWord1(), b = j.name; return (this.options.ecmaVersion >= 6 || !x) && this.isKeyword(a) && (b = k[a]), this.finishToken(b, a) } }, { \"./identifier\": 7, \"./location\": 8, \"./state\": 13, \"./tokentype\": 17, \"./whitespace\": 19 }], 17: [function (a, b, c) { \"use strict\"; function d(a, b) { return new g(a, { beforeExpr: !0, binop: b }) } function e(a) { var b = void 0 === arguments[1] ? {} : arguments[1]; b.keyword = a, k[a] = j[\"_\" + a] = new g(a, b) } var f = function (a, b) { if (!(a instanceof b)) throw new TypeError(\"Cannot call a class as a function\") }; c.__esModule = !0; var g = c.TokenType = function l(a) { var b = void 0 === arguments[1] ? {} : arguments[1]; f(this, l), this.label = a, this.keyword = b.keyword, this.beforeExpr = !!b.beforeExpr, this.startsExpr = !!b.startsExpr, this.isLoop = !!b.isLoop, this.isAssign = !!b.isAssign, this.prefix = !!b.prefix, this.postfix = !!b.postfix, this.binop = b.binop || null, this.updateContext = null }, h = { beforeExpr: !0 }, i = { startsExpr: !0 }, j = { num: new g(\"num\", i), regexp: new g(\"regexp\", i), string: new g(\"string\", i), name: new g(\"name\", i), eof: new g(\"eof\"), bracketL: new g(\"[\", { beforeExpr: !0, startsExpr: !0 }), bracketR: new g(\"]\"), braceL: new g(\"{\", { beforeExpr: !0, startsExpr: !0 }), braceR: new g(\"}\"), parenL: new g(\"(\", { beforeExpr: !0, startsExpr: !0 }), parenR: new g(\")\"), comma: new g(\",\", h), semi: new g(\";\", h), colon: new g(\":\", h), dot: new g(\".\"), question: new g(\"?\", h), arrow: new g(\"=>\", h), template: new g(\"template\"), ellipsis: new g(\"...\", h), backQuote: new g(\"`\", i), dollarBraceL: new g(\"${\", { beforeExpr: !0, startsExpr: !0 }), eq: new g(\"=\", { beforeExpr: !0, isAssign: !0 }), assign: new g(\"_=\", { beforeExpr: !0, isAssign: !0 }), incDec: new g(\"++/--\", { prefix: !0, postfix: !0, startsExpr: !0 }), prefix: new g(\"prefix\", { beforeExpr: !0, prefix: !0, startsExpr: !0 }), logicalOR: d(\"||\", 1), logicalAND: d(\"&&\", 2), bitwiseOR: d(\"|\", 3), bitwiseXOR: d(\"^\", 4), bitwiseAND: d(\"&\", 5), equality: d(\"==/!=\", 6), relational: d(\"</>\", 7), bitShift: d(\"<</>>\", 8), plusMin: new g(\"+/-\", { beforeExpr: !0, binop: 9, prefix: !0, startsExpr: !0 }), modulo: d(\"%\", 10), star: d(\"*\", 10), slash: d(\"/\", 10) }; c.types = j; var k = {}; c.keywords = k, e(\"break\"), e(\"case\", h), e(\"catch\"), e(\"continue\"), e(\"debugger\"), e(\"default\"), e(\"do\", { isLoop: !0 }), e(\"else\", h), e(\"finally\"), e(\"for\", { isLoop: !0 }), e(\"function\", i), e(\"if\"), e(\"return\", h), e(\"switch\"), e(\"throw\", h), e(\"try\"), e(\"var\"), e(\"let\"), e(\"const\"), e(\"while\", { isLoop: !0 }), e(\"with\"), e(\"new\", { beforeExpr: !0, startsExpr: !0 }), e(\"this\", i), e(\"super\", i), e(\"class\"), e(\"extends\", h), e(\"export\"), e(\"import\"), e(\"yield\", { beforeExpr: !0, startsExpr: !0 }), e(\"null\", i), e(\"true\", i), e(\"false\", i), e(\"in\", { beforeExpr: !0, binop: 7 }), e(\"instanceof\", { beforeExpr: !0, binop: 7 }), e(\"typeof\", { beforeExpr: !0, prefix: !0, startsExpr: !0 }), e(\"void\", { beforeExpr: !0, prefix: !0, startsExpr: !0 }), e(\"delete\", { beforeExpr: !0, prefix: !0, startsExpr: !0 }) }, {}], 18: [function (a, b, c) { \"use strict\"; function d(a) { return \"[object Array]\" === Object.prototype.toString.call(a) } function e(a, b) { return Object.prototype.hasOwnProperty.call(a, b) } c.isArray = d, c.has = e, c.__esModule = !0 }, {}], 19: [function (a, b, c) { \"use strict\"; function d(a) { return 10 === a || 13 === a || 8232 === a || 8233 == a } c.isNewLine = d, c.__esModule = !0; var e = /\\r\\n?|\\n|\\u2028|\\u2029/; c.lineBreak = e; var f = new RegExp(e.source, \"g\"); c.lineBreakG = f; var g = /[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/; c.nonASCIIwhitespace = g }, {}]\n        }, {}, [1])(1)\n    })\n}(null), function (a) { \"use strict\"; var b = Object.prototype.toString; a.exports = function (a) { var c = b.call(a), d = \"[object Arguments]\" === c; return d || (d = \"[object Array]\" !== c && null !== a && \"object\" == typeof a && \"number\" == typeof a.length && a.length >= 0 && \"[object Function]\" === b.call(a.callee)), d }, window.isArguments = a.exports }({ exports: {} }), function (a) { var b = Object.prototype.hasOwnProperty, c = Object.prototype.toString; a.exports = function (a, d, e) { if (\"[object Function]\" !== c.call(d)) throw new TypeError(\"iterator must be a function\"); var f = a.length; if (f === +f) for (var g = 0; f > g; g++) d.call(e, a[g], g, a); else for (var h in a) b.call(a, h) && d.call(e, a[h], h, a) }, window.forEach = a.exports }({ exports: {} }), function (a) { a.exports = Array.isArray || function (a) { return \"[object Array]\" == Object.prototype.toString.call(a) }, window.isArray = a.exports }({ exports: {} }), function (a, b) { \"use strict\"; var c = Object.prototype.hasOwnProperty, d = Object.prototype.toString, e = Array.prototype.slice, f = a(\"./isArguments\"), g = !{ toString: null }.propertyIsEnumerable(\"toString\"), h = function () { }.propertyIsEnumerable(\"prototype\"), i = [\"toString\", \"toLocaleString\", \"valueOf\", \"hasOwnProperty\", \"isPrototypeOf\", \"propertyIsEnumerable\", \"constructor\"], j = function (a) { var b = a.constructor; return b && b.prototype === a }, k = { $console: !0, $frame: !0, $frameElement: !0, $frames: !0, $parent: !0, $self: !0, $webkitIndexedDB: !0, $webkitStorageInfo: !0, $window: !0 }, l = function () { if (\"undefined\" == typeof window) return !1; for (var a in window) try { if (!k[\"$\" + a] && c.call(window, a) && null !== window[a] && \"object\" == typeof window[a]) try { j(window[a]) } catch (b) { return !0 } } catch (b) { return !0 } return !1 }(), m = function (a) { if (\"undefined\" == typeof window || !l) return j(a); try { return j(a) } catch (b) { return !1 } }, n = function (a) { var b = null !== a && \"object\" == typeof a, e = \"[object Function]\" === d.call(a), j = f(a), k = b && \"[object String]\" === d.call(a), l = []; if (!b && !e && !j) throw new TypeError(\"Object.keys called on a non-object\"); var n = h && e; if (k && a.length > 0 && !c.call(a, 0)) for (var o = 0; o < a.length; ++o) l.push(String(o)); if (j && a.length > 0) for (var p = 0; p < a.length; ++p) l.push(String(p)); else for (var q in a) n && \"prototype\" === q || !c.call(a, q) || l.push(String(q)); if (g) for (var r = m(a), s = 0; s < i.length; ++s) r && \"constructor\" === i[s] || !c.call(a, i[s]) || l.push(i[s]); return l }; n.shim = function () { if (Object.keys) { var a = function () { return 2 === (Object.keys(arguments) || \"\").length }(1, 2); if (!a) { var b = Object.keys; Object.keys = function (a) { return b(f(a) ? e.call(a) : a) } } } else Object.keys = n; return Object.keys || n }, b.exports = n, window.objectKeys = b.exports }(function () { return isArguments }, { exports: {} }),/*!\n * falafel (c) James Halliday / MIT License\n * https://github.com/substack/node-falafel\n */\nfunction (a, b) { function c(a, b, c) { function d(b) { c[a.start] = b; for (var d = a.start + 1; d < a.end; d++) c[d] = \"\" } if (a.parent = b, a.source = function () { return c.slice(a.start, a.end).join(\"\") }, a.update && \"object\" == typeof a.update) { var e = a.update; g(f(e), function (a) { d[a] = e[a] }), a.update = d } else a.update = d } var d = a(\"acorn\").parse, e = a(\"isarray\"), f = a(\"object-keys\"), g = a(\"foreach\"); b.exports = function (a, b, h) { \"function\" == typeof b && (h = b, b = {}), a && \"object\" == typeof a && \"Buffer\" === a.constructor.name ? a = a.toString() : a && \"object\" == typeof a && (b = a, a = b.source, delete b.source), a = void 0 === a ? b.source : a, \"string\" != typeof a && (a = String(a)), b.parser && (d = b.parser.parse); var i = d(a, b), j = { chunks: a.split(\"\"), toString: function () { return j.chunks.join(\"\") }, inspect: function () { return j.toString() } }; return function k(a, b) { c(a, b, j.chunks), g(f(a), function (b) { if (\"parent\" !== b) { var c = a[b]; e(c) ? g(c, function (b) { b && \"string\" == typeof b.type && k(b, a) }) : c && \"string\" == typeof c.type && k(c, a) } }), h(a) }(i, void 0), j }, window.falafel = b.exports }(function (a) { switch (a) { case \"acorn\": return { parse: acorn.parse }; case \"object-keys\": return objectKeys; case \"foreach\": return forEach; case \"isarray\": return isArray } }, { exports: {} }); var inBrowser = \"undefined\" != typeof window && this === window, parseAndModify = inBrowser ? window.falafel : require(\"falafel\"); (inBrowser ? window : exports).blanket = function () { var a, b = [\"ExpressionStatement\", \"BreakStatement\", \"ContinueStatement\", \"VariableDeclaration\", \"ReturnStatement\", \"ThrowStatement\", \"TryStatement\", \"FunctionDeclaration\", \"IfStatement\", \"WhileStatement\", \"DoWhileStatement\", \"ForStatement\", \"ForInStatement\", \"SwitchStatement\", \"WithStatement\"], c = [\"IfStatement\", \"WhileStatement\", \"DoWhileStatement\", \"ForStatement\", \"ForInStatement\", \"WithStatement\"], d = Math.floor(1e3 * Math.random()), e = {}, f = { reporter: null, adapter: null, filter: null, customVariable: null, loader: null, ignoreScriptError: !1, existingRequireJS: !1, autoStart: !1, timeout: 180, ignoreCors: !1, branchTracking: !1, sourceURL: !1, debug: !1, engineOnly: !1, testReadyCallback: null, commonJS: !1, instrumentCache: !1, modulePattern: null, ecmaVersion: 5 }; return inBrowser && \"undefined\" != typeof window.blanket && (a = window.blanket.noConflict()), _blanket = { noConflict: function () { return a ? a : _blanket }, _getCopyNumber: function () { return d }, extend: function (a) { _blanket._extend(_blanket, a) }, _extend: function (a, b) { if (b) for (var c in b) a[c] instanceof Object && \"function\" != typeof a[c] ? _blanket._extend(a[c], b[c]) : a[c] = b[c] }, getCovVar: function () { var a = _blanket.options(\"customVariable\"); return a ? (_blanket.options(\"debug\") && console.log(\"BLANKET-Using custom tracking variable:\", a), inBrowser ? \"window.\" + a : a) : inBrowser ? \"window._$blanket\" : \"_$jscoverage\" }, options: function (a, b) { if (\"string\" != typeof a) _blanket._extend(f, a); else { if (\"undefined\" == typeof b) return f[a]; f[a] = b } }, instrumentSync: function (a, b) { var c = a.inputFile, d = a.inputFileName; if (_blanket.options(\"instrumentCache\") && sessionStorage && sessionStorage.getItem(\"blanket_instrument_store-\" + d)) { if (_blanket.options(\"debug\") && console.log(\"BLANKET-Reading instrumentation from cache: \", d), !b) return sessionStorage.getItem(\"blanket_instrument_store-\" + d); b(sessionStorage.getItem(\"blanket_instrument_store-\" + d)) } else { var e = _blanket._prepareSource(c); _blanket._trackingArraySetup = [], c = c.replace(/^\\#\\!.*/, \"\"); var f = parseAndModify(c, { locations: !0, comment: !0, ecmaVersion: _blanket.options(\"ecmaVersion\") }, _blanket._addTracking(d)); if (f = _blanket._trackingSetup(d, e) + f, _blanket.options(\"sourceURL\") && (f += \"\\n//@ sourceURL=\" + d.replace(\"http://\", \"\")), _blanket.options(\"debug\") && console.log(\"BLANKET-Instrumented file: \", d), _blanket.options(\"instrumentCache\") && sessionStorage && (_blanket.options(\"debug\") && console.log(\"BLANKET-Saving instrumentation to cache: \", d), sessionStorage.setItem(\"blanket_instrument_store-\" + d, f)), !b) return f; b(f) } }, instrument: function (a, b) { _blanket.instrumentSync(a, b) }, _trackingArraySetup: [], _branchingArraySetup: [], _useStrictMode: !1, _prepareSource: function (a) { return a.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/(\\r\\n|\\n|\\r)/gm, \"\\n\").split(\"\\n\") }, _trackingSetup: function (a, b) { var c = _blanket.options(\"branchTracking\"), d = b.join(\"',\\n'\"), e = \"\", f = _blanket.getCovVar(); return _blanket._useStrictMode && (e += \"'use strict';\\n\"), e += \"if (typeof \" + f + \" === 'undefined') \" + f + \" = {};\\n\", c && (e += \"var _$branchFcn=function(f,l,c,r){ \", e += \"if (!!r) { \", e += f + \"[f].branchData[l][c][0] = \" + f + \"[f].branchData[l][c][0] || [];\", e += f + \"[f].branchData[l][c][0].push(r); }\", e += \"else { \", e += f + \"[f].branchData[l][c][1] = \" + f + \"[f].branchData[l][c][1] || [];\", e += f + \"[f].branchData[l][c][1].push(r); }\", e += \"return r;};\\n\"), e += \"if (typeof \" + f + \"['\" + a + \"'] === 'undefined'){\", e += f + \"['\" + a + \"']=[];\\n\", c && (e += f + \"['\" + a + \"'].branchData=[];\\n\"), e += f + \"['\" + a + \"'].source=['\" + d + \"'];\\n\", _blanket._trackingArraySetup.sort(function (a, b) { return parseInt(a, 10) > parseInt(b, 10) }).forEach(function (b) { e += f + \"['\" + a + \"'][\" + b + \"]=0;\\n\" }), c && _blanket._branchingArraySetup.sort(function (a, b) { return a.line > b.line }).sort(function (a, b) { return a.column > b.column }).forEach(function (b) { b.file === a && (e += \"if (typeof \" + f + \"['\" + a + \"'].branchData[\" + b.line + \"] === 'undefined'){\\n\", e += f + \"['\" + a + \"'].branchData[\" + b.line + \"]=[];\\n\", e += \"}\", e += f + \"['\" + a + \"'].branchData[\" + b.line + \"][\" + b.column + \"] = [];\\n\", e += f + \"['\" + a + \"'].branchData[\" + b.line + \"][\" + b.column + \"].consequent = \" + JSON.stringify(b.consequent) + \";\\n\", e += f + \"['\" + a + \"'].branchData[\" + b.line + \"][\" + b.column + \"].alternate = \" + JSON.stringify(b.alternate) + \";\\n\") }), e += \"}\" }, _blockifyIf: function (a) { if (c.indexOf(a.type) > -1) { var b = a.consequent || a.body, d = a.alternate; d && \"BlockStatement\" !== d.type && d.update(\"{\\n\" + d.source() + \"}\\n\"), b && \"BlockStatement\" !== b.type && b.update(\"{\\n\" + b.source() + \"}\\n\") } }, _trackBranch: function (a, b) { var c = a.loc.start.line, d = a.loc.start.column; _blanket._branchingArraySetup.push({ line: c, column: d, file: b, consequent: a.consequent.loc, alternate: a.alternate.loc }); var e = \"_$branchFcn('\" + b + \"',\" + c + \",\" + d + \",\" + a.test.source() + \")?\" + a.consequent.source() + \":\" + a.alternate.source(); a.update(e) }, _addTracking: function (a) { var c = _blanket.getCovVar(); return function (d) { if (_blanket._blockifyIf(d), b.indexOf(d.type) > -1 && \"LabeledStatement\" !== d.parent.type) { if (_blanket._checkDefs(d, a), \"VariableDeclaration\" === d.type && (\"ForStatement\" === d.parent.type || \"ForInStatement\" === d.parent.type)) return; if (!d.loc || !d.loc.start) throw new Error(\"The instrumenter encountered a node with no location: \" + Object.keys(d)); d.update(c + \"['\" + a + \"'][\" + d.loc.start.line + \"]++;\\n\" + d.source()), _blanket._trackingArraySetup.push(d.loc.start.line) } else _blanket.options(\"branchTracking\") && \"ConditionalExpression\" === d.type ? _blanket._trackBranch(d, a) : \"Literal\" === d.type && \"use strict\" === d.value && d.parent && \"ExpressionStatement\" === d.parent.type && d.parent.parent && \"Program\" === d.parent.parent.type && (_blanket._useStrictMode = !0) } }, _checkDefs: function (a, b) { if (inBrowser) { if (\"VariableDeclaration\" === a.type && a.declarations && a.declarations.forEach(function (c) {/*if(\"window\"===c.id.name)throw new Error(\"Instrumentation error, you cannot redefine the 'window' variable in  \"+b+\":\"+a.loc.start.line)*/ }), \"FunctionDeclaration\" === a.type && a.params && a.params.forEach(function (c) {/*if(\"window\"===c.name)throw new Error(\"Instrumentation error, you cannot redefine the 'window' variable in  \"+b+\":\"+a.loc.start.line)*/ }), \"ExpressionStatement\" === a.type && a.expression && a.expression.left && a.expression.left.object && a.expression.left.property && a.expression.left.object.name + \".\" + a.expression.left.property.name === _blanket.getCovVar()) throw new Error(\"Instrumentation error, you cannot redefine the coverage variable in  \" + b + \":\" + a.loc.start.line) } else if (\"ExpressionStatement\" === a.type && a.expression && a.expression.left && !a.expression.left.object && !a.expression.left.property && a.expression.left.name === _blanket.getCovVar()) throw new Error(\"Instrumentation error, you cannot redefine the coverage variable in  \" + b + \":\" + a.loc.start.line) }, setupCoverage: function () { e.instrumentation = \"blanket\", e.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0, start: new Date } }, _checkIfSetup: function () { if (!e.stats) throw new Error(\"You must call blanket.setupCoverage() first.\") }, onTestStart: function () { _blanket.options(\"debug\") && console.log(\"BLANKET-Test event started\"), this._checkIfSetup(), e.stats.tests++, e.stats.pending++ }, onTestDone: function (a, b) { this._checkIfSetup(), b === a ? e.stats.passes++ : e.stats.failures++, e.stats.pending-- }, onModuleStart: function () { this._checkIfSetup(), e.stats.suites++ }, onTestsDone: function () { _blanket.options(\"debug\") && console.log(\"BLANKET-Test event done\"), this._checkIfSetup(), e.stats.end = new Date, inBrowser ? this.report(e) : (_blanket.options(\"branchTracking\") || delete (inBrowser ? window : global)[_blanket.getCovVar()].branchFcn, this.options(\"reporter\").call(this, e)) } }, _blanket }(), function (a) { var b = a.options; a.extend({ outstandingRequireFiles: [], options: function (c, d) { var e = {}; if (\"string\" != typeof c) b(c), e = c; else { if (\"undefined\" == typeof d) return b(c); b(c, d), e[c] = d } e.adapter && a._loadFile(e.adapter), e.loader && a._loadFile(e.loader) }, requiringFile: function (b, c) { \"undefined\" == typeof b ? a.outstandingRequireFiles = [] : \"undefined\" == typeof c ? a.outstandingRequireFiles.push(b) : a.outstandingRequireFiles.splice(a.outstandingRequireFiles.indexOf(b), 1) }, requireFilesLoaded: function () { return 0 === a.outstandingRequireFiles.length }, showManualLoader: function () { if (!document.getElementById(\"blanketLoaderDialog\")) { var a = \"<div class='blanketDialogOverlay'>\"; a += \"&nbsp;</div>\", a += \"<div class='blanketDialogVerticalOffset'>\", a += \"<div class='blanketDialogBox'>\", a += \"<b>Error:</b> Blanket.js encountered a cross origin request error while instrumenting the source files.  \", a += \"<br><br>This is likely caused by the source files being referenced locally (using the file:// protocol). \", a += \"<br><br>Some solutions include <a href='http://askubuntu.com/questions/160245/making-google-chrome-option-allow-file-access-from-files-permanent' target='_blank'>starting Chrome with special flags</a>, <a target='_blank' href='https://github.com/remy/servedir'>running a server locally</a>, or using a browser without these CORS restrictions (Safari).\", a += \"<br>\", \"undefined\" != typeof FileReader && (a += \"<br>Or, try the experimental loader.  When prompted, simply click on the directory containing all the source files you want covered.\", a += \"<a href='javascript:document.getElementById(\\\"fileInput\\\").click();'>Start Loader</a>\", a += \"<input type='file' type='application/x-javascript' accept='application/x-javascript' webkitdirectory id='fileInput' multiple onchange='window.blanket.manualFileLoader(this.files)' style='visibility:hidden;position:absolute;top:-50;left:-50'/>\"), a += \"<br><span style='float:right;cursor:pointer;'  onclick=document.getElementById('blanketLoaderDialog').style.display='none';>Close</span>\", a += \"<div style='clear:both'></div>\", a += \"</div></div>\"; var b = \".blanketDialogWrapper {\"; b += \"display:block;\", b += \"position:fixed;\", b += \"z-index:40001; }\", b += \".blanketDialogOverlay {\", b += \"position:fixed;\", b += \"width:100%;\", b += \"height:100%;\", b += \"background-color:black;\", b += \"opacity:.5; \", b += \"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)'; \", b += \"filter:alpha(opacity=50); \", b += \"z-index:40001; }\", b += \".blanketDialogVerticalOffset { \", b += \"position:fixed;\", b += \"top:30%;\", b += \"width:100%;\", b += \"z-index:40002; }\", b += \".blanketDialogBox { \", b += \"width:405px; \", b += \"position:relative;\", b += \"margin:0 auto;\", b += \"background-color:white;\", b += \"padding:10px;\", b += \"border:1px solid black; }\"; var c = document.createElement(\"style\"); c.innerHTML = b, document.head.appendChild(c); var d = document.createElement(\"div\"); d.id = \"blanketLoaderDialog\", d.className = \"blanketDialogWrapper\", d.innerHTML = a, document.body.insertBefore(d, document.body.firstChild) } }, manualFileLoader: function (a) { function b(a) { var b = new FileReader; b.onload = g, b.readAsText(a) } var c = Array.prototype.slice; a = c.call(a).filter(function (a) { return \"\" !== a.type }); var d = a.length - 1, e = 0, f = {}; sessionStorage.blanketSessionLoader && (f = JSON.parse(sessionStorage.blanketSessionLoader)); var g = function (c) { var g = c.currentTarget.result, h = a[e], i = h.webkitRelativePath && \"\" !== h.webkitRelativePath ? h.webkitRelativePath : h.name; f[i] = g, e++, e === d ? (sessionStorage.setItem(\"blanketSessionLoader\", JSON.stringify(f)), document.location.reload()) : b(a[e]) }; b(a[e]) }, _loadFile: function (b) { if (\"undefined\" != typeof b) { var c = new XMLHttpRequest; c.open(\"GET\", b, !1), c.send(), a._addScript(c.responseText) } }, _addScript: function (a) { var b = document.createElement(\"script\"); b.type = \"text/javascript\", b.text = a, (document.body || document.getElementsByTagName(\"head\")[0]).appendChild(b) }, hasAdapter: function (b) { return null !== a.options(\"adapter\") }, report: function (b) { document.getElementById(\"blanketLoaderDialog\") || (a.blanketSession = null), b.files = window._$blanket; blanket.options(\"commonJS\") ? blanket._commonjs.require : window.require; if (!b.files || !Object.keys(b.files).length) return void (a.options(\"debug\") && console.log(\"BLANKET-Reporting No files were instrumented.\")); if (\"undefined\" != typeof b.files.branchFcn && delete b.files.branchFcn, \"string\" == typeof a.options(\"reporter\")) a._loadFile(a.options(\"reporter\")), a.customReporter(b, a.options(\"reporter_options\")); else if (\"function\" == typeof a.options(\"reporter\")) a.options(\"reporter\")(b, a.options(\"reporter_options\")); else { if (\"function\" != typeof a.defaultReporter) throw new Error(\"no reporter defined.\"); a.defaultReporter(b, a.options(\"reporter_options\")) } }, _bindStartTestRunner: function (a, b) { a ? a(b) : \"complete\" === document.readyState ? b() : window.addEventListener(\"load\", b, !1) }, _loadSourceFiles: function (b) { blanket.options(\"commonJS\") ? blanket._commonjs.require : window.require; a.options(\"debug\") && console.log(\"BLANKET-Collecting page scripts\"); var c = a.utils.collectPageScripts(); if (0 === c.length) b(); else { sessionStorage.blanketSessionLoader && (a.blanketSession = JSON.parse(sessionStorage.blanketSessionLoader)), c.forEach(function (b, c) { a.utils.cache[b] = { loaded: !1 } }); var d = -1; a.utils.loadAll(function (a) { return a ? \"undefined\" != typeof c[d + 1] : (d++, d >= c.length ? null : c[d]) }, b) } }, beforeStartTestRunner: function (b) { b = b || {}, b.checkRequirejs = \"undefined\" == typeof b.checkRequirejs ? !0 : b.checkRequirejs, b.callback = b.callback || function () { }, b.coverage = \"undefined\" == typeof b.coverage ? !0 : b.coverage, b.coverage ? a._bindStartTestRunner(b.bindEvent, function () { a._loadSourceFiles(function () { var c = function () { return b.condition ? b.condition() : a.requireFilesLoaded() }, d = function () { if (c()) { a.options(\"debug\") && console.log(\"BLANKET-All files loaded, init start test runner callback.\"); var e = a.options(\"testReadyCallback\"); e ? \"function\" == typeof e ? e(b.callback) : \"string\" == typeof e && (a._addScript(e), b.callback()) : b.callback() } else setTimeout(d, 13) }; d() }) }) : b.callback() }, utils: { qualifyURL: function (a) { var b = document.createElement(\"a\"); return b.href = a, b.href } } }) }(blanket), blanket.defaultReporter = function (a) { function b(a) { var b = document.getElementById(a); \"block\" === b.style.display ? b.style.display = \"none\" : b.style.display = \"block\" } function c(a) { return a.replace(/\\&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/\\>/g, \"&gt;\").replace(/\\\"/g, \"&quot;\").replace(/\\'/g, \"&apos;\").replace(/`/g, \"&grave;\").replace(/[$]/g, \"&dollar;\").replace(/&/g, \"&amp;\") } function d(a, b) { var c = b ? 0 : 1; return \"undefined\" == typeof a || null === typeof a || \"undefined\" == typeof a[c] ? !1 : a[c].length > 0 } function e(a, b, f, g, h) { var i = \"\", j = \"\"; if (q.length > 0) if (i += \"<span class='\" + (d(q[0][1], q[0][1].consequent === q[0][0]) ? \"branchOkay\" : \"branchWarning\") + \"'>\", q[0][0].end.line === h) { if (i += c(b.slice(0, q[0][0].end.column)) + \"</span>\", b = b.slice(q[0][0].end.column), q.shift(), q.length > 0) if (i += \"<span class='\" + (d(q[0][1], !1) ? \"branchOkay\" : \"branchWarning\") + \"'>\", q[0][0].end.line === h) { if (i += c(b.slice(0, q[0][0].end.column)) + \"</span>\", b = b.slice(q[0][0].end.column), q.shift(), !f) return { src: i + c(b), cols: f } } else { if (!f) return { src: i + c(b) + \"</span>\", cols: f }; j = \"</span>\" } else if (!f) return { src: i + c(b), cols: f } } else { if (!f) return { src: i + c(b) + \"</span>\", cols: f }; j = \"</span>\" } var k = f[a], l = k.consequent; if (l.start.line > h) q.unshift([k.alternate, k]), q.unshift([l, k]), b = c(b); else { var m = \"<span class='\" + (d(k, !0) ? \"branchOkay\" : \"branchWarning\") + \"'>\"; if (i += c(b.slice(0, l.start.column - g)) + m, f.length > a + 1 && f[a + 1].consequent.start.line === h && f[a + 1].consequent.start.column - g < f[a].consequent.end.column - g) { var n = e(a + 1, b.slice(l.start.column - g, l.end.column - g), f, l.start.column - g, h); i += n.src, f = n.cols, f[a + 1] = f[a + 2], f.length-- } else i += c(b.slice(l.start.column - g, l.end.column - g)); i += \"</span>\"; var o = k.alternate; if (o.start.line > h) i += c(b.slice(l.end.column - g)), q.unshift([o, k]); else { if (i += c(b.slice(l.end.column - g, o.start.column - g)), m = \"<span class='\" + (d(k, !1) ? \"branchOkay\" : \"branchWarning\") + \"'>\", i += m, f.length > a + 1 && f[a + 1].consequent.start.line === h && f[a + 1].consequent.start.column - g < f[a].alternate.end.column - g) { var p = e(a + 1, b.slice(o.start.column - g, o.end.column - g), f, o.start.column - g, h); i += p.src, f = p.cols, f[a + 1] = f[a + 2], f.length-- } else i += c(b.slice(o.start.column - g, o.end.column - g)); i += \"</span>\", i += c(b.slice(o.end.column - g)), b = i } } return { src: b + j, cols: f } } var f = \"#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;}  #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-left:50px; width:150px; float:right} .bl-nb {padding-right:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .hit{background-color:#c3e6c7} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}\", g = 60, h = document.head, i = 0, j = document.body, k = Object.keys(a.files).some(function (b) { return \"undefined\" != typeof a.files[b].branchData }), l = \"<div id='blanket-main'><div class='blanket bl-title'><div class='bl-cl bl-file'><a href='http://alex-seville.github.com/blanket/' target='_blank' class='bl-logo'>Blanket.js</a> results</div><div class='bl-cl rs'>Coverage (%)</div><div class='bl-cl rs'>Covered/Total Smts.</div>\" + (k ? \"<div class='bl-cl rs'>Covered/Total Branches</div>\" : \"\") + \"<div style='clear:both;'></div></div>\", m = \"<div class='blanket {{statusclass}}'><div class='bl-cl bl-file'><span class='bl-nb'>{{fileNumber}}.</span><a href='javascript:blanket_toggleSource(\\\"file-{{fileNumber}}\\\")'>{{file}}</a></div><div class='bl-cl rs'>{{percentage}} %</div><div class='bl-cl rs'>{{numberCovered}}/{{totalSmts}}</div>\" + (k ? \"<div class='bl-cl rs'>{{passedBranches}}/{{totalBranches}}</div>\" : \"\") + \"<div id='file-{{fileNumber}}' class='bl-source' style='display:none;'>{{source}}</div><div style='clear:both;'></div></div>\"; grandTotalTemplate = \"<div class='blanket grand-total {{statusclass}}'><div class='bl-cl'>{{rowTitle}}</div><div class='bl-cl rs'>{{percentage}} %</div><div class='bl-cl rs'>{{numberCovered}}/{{totalSmts}}</div>\" + (k ? \"<div class='bl-cl rs'>{{passedBranches}}/{{totalBranches}}</div>\" : \"\") + \"<div style='clear:both;'></div></div>\"; var n = document.createElement(\"script\"); n.type = \"text/javascript\", n.text = b.toString().replace(\"function \" + b.name, \"function blanket_toggleSource\"), j.appendChild(n); var o = function (a, b) { return Math.round(a / b * 100 * 100) / 100 }, p = function (a, b, c) { var d = document.createElement(a); d.innerHTML = c, b.appendChild(d) }, q = [], r = function (a) { return \"undefined\" != typeof a }, s = a.files, t = { totalSmts: 0, numberOfFilesCovered: 0, passedBranches: 0, totalBranches: 0, moduleTotalStatements: {}, moduleTotalCoveredStatements: {}, moduleTotalBranches: {}, moduleTotalCoveredBranches: {} }, u = _blanket.options(\"modulePattern\"), v = u ? new RegExp(u) : null; for (var w in s) if (s.hasOwnProperty(w)) { i++; var x, y = s[w], z = 0, A = 0, B = []; for (x = 0; x < y.source.length; x += 1) { var C = y.source[x]; if (q.length > 0 || \"undefined\" != typeof y.branchData) if (\"undefined\" != typeof y.branchData[x + 1]) { var D = y.branchData[x + 1].filter(r), E = 0; C = e(E, C, D, 0, x + 1).src } else C = q.length ? e(0, C, null, 0, x + 1).src : c(C); else C = c(C); var F = \"\"; y[x + 1] ? (A += 1, z += 1, F = \"hit\") : 0 === y[x + 1] && (z++, F = \"miss\"), B[x + 1] = \"<div class='\" + F + \"'><span class=''>\" + (x + 1) + \"</span>\" + C + \"</div>\" } t.totalSmts += z, t.numberOfFilesCovered += A; var G = 0, H = 0; if (\"undefined\" != typeof y.branchData) for (var I = 0; I < y.branchData.length; I++) if (\"undefined\" != typeof y.branchData[I]) for (var J = 0; J < y.branchData[I].length; J++) \"undefined\" != typeof y.branchData[I][J] && (G++, \"undefined\" != typeof y.branchData[I][J][0] && y.branchData[I][J][0].length > 0 && \"undefined\" != typeof y.branchData[I][J][1] && y.branchData[I][J][1].length > 0 && H++); if (t.passedBranches += H, t.totalBranches += G, v) { var K = w.match(v)[1]; t.moduleTotalStatements.hasOwnProperty(K) || (t.moduleTotalStatements[K] = 0, t.moduleTotalCoveredStatements[K] = 0), t.moduleTotalStatements[K] += z, t.moduleTotalCoveredStatements[K] += A, t.moduleTotalBranches.hasOwnProperty(K) || (t.moduleTotalBranches[K] = 0, t.moduleTotalCoveredBranches[K] = 0), t.moduleTotalBranches[K] += G, t.moduleTotalCoveredBranches[K] += H } var L = o(A, z), M = m.replace(\"{{file}}\", w).replace(\"{{percentage}}\", L).replace(\"{{numberCovered}}\", A).replace(/\\{\\{fileNumber\\}\\}/g, i).replace(\"{{totalSmts}}\", z).replace(\"{{totalBranches}}\", G).replace(\"{{passedBranches}}\", H).replace(\"{{source}}\", B.join(\" \")); M = g > L ? M.replace(\"{{statusclass}}\", \"bl-error\") : M.replace(\"{{statusclass}}\", \"bl-success\"), l += M } var N = function (a, b, c, d, e) { var f = o(b, a), h = g > f ? \"bl-error\" : \"bl-success\", i = e ? \"Total for module: \" + e : \"Global total\", j = grandTotalTemplate.replace(\"{{rowTitle}}\", i).replace(\"{{percentage}}\", f).replace(\"{{numberCovered}}\", b).replace(\"{{totalSmts}}\", a).replace(\"{{passedBranches}}\", d).replace(\"{{totalBranches}}\", c).replace(\"{{statusclass}}\", h); l += j }; if (v) for (var O in t.moduleTotalStatements) if (t.moduleTotalStatements.hasOwnProperty(O)) { var P = t.moduleTotalStatements[O], Q = t.moduleTotalCoveredStatements[O], R = t.moduleTotalBranches[O], S = t.moduleTotalCoveredBranches[O]; N(P, Q, R, S, O) } N(t.totalSmts, t.numberOfFilesCovered, t.totalBranches, t.passedBranches, null), l += \"</div>\", p(\"style\", h, f), document.getElementById(\"blanket-main\") ? document.getElementById(\"blanket-main\").innerHTML = l.slice(23, -6) : p(\"div\", j, l) }, function () { var a = {}, b = Array.prototype.slice, c = b.call(document.scripts); b.call(c[c.length - 1].attributes).forEach(function (b) { if (\"data-cover-only\" === b.nodeName && (a.filter = b.nodeValue), \"data-cover-never\" === b.nodeName && (a.antifilter = b.nodeValue), \"data-cover-reporter\" === b.nodeName && (a.reporter = b.nodeValue), \"data-cover-adapter\" === b.nodeName && (a.adapter = b.nodeValue), \"data-cover-loader\" === b.nodeName && (a.loader = b.nodeValue), \"data-cover-timeout\" === b.nodeName && (a.timeout = b.nodeValue), \"data-cover-modulepattern\" === b.nodeName && (a.modulePattern = b.nodeValue), \"data-cover-reporter-options\" === b.nodeName) try { a.reporter_options = JSON.parse(b.nodeValue) } catch (c) { if (blanket.options(\"debug\")) throw new Error(\"Invalid reporter options.  Must be a valid stringified JSON object.\") } if (\"data-cover-testReadyCallback\" === b.nodeName && (a.testReadyCallback = b.nodeValue), \"data-cover-customVariable\" === b.nodeName && (a.customVariable = b.nodeValue), \"data-cover-flags\" === b.nodeName) { var d = \" \" + b.nodeValue + \" \"; d.indexOf(\" ignoreError \") > -1 && (a.ignoreScriptError = !0), d.indexOf(\" autoStart \") > -1 && (a.autoStart = !0), d.indexOf(\" ignoreCors \") > -1 && (a.ignoreCors = !0), d.indexOf(\" branchTracking \") > -1 && (a.branchTracking = !0), d.indexOf(\" sourceURL \") > -1 && (a.sourceURL = !0), d.indexOf(\" debug \") > -1 && (a.debug = !0), d.indexOf(\" engineOnly \") > -1 && (a.engineOnly = !0), d.indexOf(\" commonJS \") > -1 && (a.commonJS = !0), d.indexOf(\" instrumentCache \") > -1 && (a.instrumentCache = !0) } }), blanket.options(a), \"undefined\" != typeof requirejs && blanket.options(\"existingRequireJS\", !0), blanket.options(\"commonJS\") && (blanket._commonjs = {}) }(), function (a) { a.extend({ utils: { normalizeBackslashes: function (a) { return a.replace(/\\\\/g, \"/\") }, matchPatternAttribute: function (b, c) { if (\"string\" == typeof c) { if (0 === c.indexOf(\"[\")) { var d = c.slice(1, c.length - 1).split(\",\"); return d.some(function (c) { return a.utils.matchPatternAttribute(b, a.utils.normalizeBackslashes(c.slice(1, -1))) }) } if (0 === c.indexOf(\"//\")) { var e = c.slice(2, c.lastIndexOf(\"/\")), f = c.slice(c.lastIndexOf(\"/\") + 1), g = new RegExp(e, f); return g.test(b) } return 0 === c.indexOf(\"#\") ? window[c.slice(1)].call(window, b) : b.indexOf(a.utils.normalizeBackslashes(c)) > -1 } return c instanceof Array ? c.some(function (c) { return a.utils.matchPatternAttribute(b, c) }) : c instanceof RegExp ? c.test(b) : \"function\" == typeof c ? c.call(window, b) : void 0 }, blanketEval: function (b) { a._addScript(b) }, collectPageScripts: function () { var b = Array.prototype.slice, c = (b.call(document.scripts), []), d = [], e = a.options(\"filter\"); if (null != e) { var f = a.options(\"antifilter\"); c = b.call(document.scripts).filter(function (c) { return 1 === b.call(c.attributes).filter(function (b) { return \"src\" === b.nodeName && a.utils.matchPatternAttribute(b.nodeValue, e) && (\"undefined\" == typeof f || !a.utils.matchPatternAttribute(b.nodeValue, f)) }).length }) } else c = b.call(document.querySelectorAll(\"script[data-cover]\")); return d = c.map(function (c) { return a.utils.qualifyURL(b.call(c.attributes).filter(function (a) { return \"src\" === a.nodeName })[0].nodeValue) }), e || a.options(\"filter\", \"['\" + d.join(\"','\") + \"']\"), d }, loadAll: function (b, c, d) { var e = b(), f = a.utils.scriptIsLoaded(e, a.utils.ifOrdered, b, c); if (a.utils.cache[e] && a.utils.cache[e].loaded) f(); else { var g = function () { a.options(\"debug\") && console.log(\"BLANKET-Mark script:\" + e + \", as loaded and move to next script.\"), f() }, h = function (b) { a.options(\"debug\") && console.log(\"BLANKET-File loading finished\"), \"undefined\" != typeof b && (a.options(\"debug\") && console.log(\"BLANKET-Add file to DOM.\"), a._addScript(b)), g() }; a.utils.attachScript({ url: e }, function (b) { a.utils.processFile(b, e, h, h) }) } }, attachScript: function (b, c) { var d = a.options(\"timeout\") || 3e3; setTimeout(function () { if (!a.utils.cache[b.url].loaded) throw new Error(\"error (timeout=\" + d + \") loading source script: \" + b.url) }, d), a.utils.getFile(b.url, c, function () { throw new Error(\"error loading source script: \" + b.url) }) }, ifOrdered: function (b, c) { var d = b(!0); d ? a.utils.loadAll(b, c) : c(new Error(\"Error in loading chain.\")) }, scriptIsLoaded: function (b, c, d, e) { return a.options(\"debug\") && console.log(\"BLANKET-Returning function\"), function () { a.options(\"debug\") && console.log(\"BLANKET-Marking file as loaded: \" + b), a.utils.cache[b].loaded = !0, a.utils.allLoaded() ? (a.options(\"debug\") && console.log(\"BLANKET-All files loaded\"), e()) : c && (a.options(\"debug\") && console.log(\"BLANKET-Load next file.\"), c(d, e)) } }, cache: {}, allLoaded: function () { for (var b = Object.keys(a.utils.cache), c = 0; c < b.length; c++) if (!a.utils.cache[b[c]].loaded) return !1; return !0 }, processFile: function (b, c, d, e) { var f = a.options(\"filter\"), g = a.options(\"antifilter\"); \"undefined\" != typeof g && a.utils.matchPatternAttribute(c, g) ? (e(b), a.options(\"debug\") && console.log(\"BLANKET-File will never be instrumented:\" + c), a.requiringFile(c, !0)) : a.utils.matchPatternAttribute(c, f) ? (a.options(\"debug\") && console.log(\"BLANKET-Attempting instrument of:\" + c), a.instrument({ inputFile: b, inputFileName: c }, function (e) { try { a.options(\"debug\") && console.log(\"BLANKET-instrument of:\" + c + \" was successfull.\"), a.utils.blanketEval(e), d(), a.requiringFile(c, !0) } catch (f) { if (!a.options(\"ignoreScriptError\")) { var g = new Error(\"Error parsing instrumented code: \" + f); throw g.error = f, g } a.options(\"debug\") && console.log(\"BLANKET-There was an error loading the file:\" + c), d(b), a.requiringFile(c, !0) } })) : (a.options(\"debug\") && console.log(\"BLANKET-Loading (without instrumenting) the file:\" + c), e(b), a.requiringFile(c, !0)) }, cacheXhrConstructor: function () { var a, b, c; if (\"undefined\" != typeof XMLHttpRequest) a = XMLHttpRequest, this.createXhr = function () { return new a }; else if (\"undefined\" != typeof ActiveXObject) { for (a = ActiveXObject, b = 0; 3 > b; b += 1) { c = progIds[b]; try { new ActiveXObject(c); break } catch (d) { } } this.createXhr = function () { return new a(c) } } }, craeteXhr: function () { throw new Error(\"cacheXhrConstructor is supposed to overwrite this function.\") }, getFile: function (b, c, d, e) { var f = !1; if (a.blanketSession) for (var g = Object.keys(a.blanketSession), h = 0; h < g.length; h++) { var i = g[h]; if (b.indexOf(i) > -1) return c(a.blanketSession[i]), void (f = !0) } if (!f) { var j = a.utils.createXhr(); j.open(\"GET\", b, !0), e && e(j, b), j.onreadystatechange = function (a) { var e, f; 4 === j.readyState && (e = j.status, e > 399 && 600 > e ? (f = new Error(b + \" HTTP status: \" + e), f.xhr = j, d(f)) : c(j.responseText)) }; try { j.send(null) } catch (k) { if (!k.code || 101 !== k.code && 1012 !== k.code || a.options(\"ignoreCors\") !== !1) throw k; a.showManualLoader() } } } } }), function () { var b = (blanket.options(\"commonJS\") ? blanket._commonjs.require : window.require, blanket.options(\"commonJS\") ? blanket._commonjs.requirejs : window.requirejs); !a.options(\"engineOnly\") && a.options(\"existingRequireJS\") && (a.utils.oldloader = b.load, b.load = function (b, c, d) { a.requiringFile(d), a.utils.getFile(d, function (e) { a.utils.processFile(e, d, function () { b.completeLoad(c) }, function () { a.utils.oldloader(b, c, d) }) }, function (b) { throw a.requiringFile(), b }) }), a.utils.cacheXhrConstructor() }() }(blanket), function () { if (\"undefined\" != typeof QUnit) { var a = function () { return window.QUnit.config.queue.length > 0 && blanket.noConflict().requireFilesLoaded() }; QUnit.config.urlConfig[0].tooltip ? (QUnit.config.urlConfig.push({ id: \"coverage\", label: \"Enable coverage\", tooltip: \"Enable code coverage.\" }), QUnit.urlParams.coverage || blanket.options(\"autoStart\") ? (QUnit.begin(function () { blanket.noConflict().setupCoverage() }), QUnit.done(function (a, b) { blanket.noConflict().onTestsDone() }), QUnit.moduleStart(function (a) { blanket.noConflict().onModuleStart() }), QUnit.testStart(function (a) { blanket.noConflict().onTestStart() }), QUnit.testDone(function (a) { blanket.noConflict().onTestDone(a.total, a.passed) }), blanket.noConflict().beforeStartTestRunner({ condition: a, callback: function () { (!blanket.options(\"existingRequireJS\") || blanket.options(\"autoStart\")) && QUnit.start() } })) : (blanket.options(\"existingRequireJS\") && (requirejs.load = _blanket.utils.oldloader), blanket.noConflict().beforeStartTestRunner({ condition: a, callback: function () { (!blanket.options(\"existingRequireJS\") || blanket.options(\"autoStart\")) && QUnit.start() }, coverage: !1 }))) : (QUnit.begin = function () { blanket.noConflict().setupCoverage() }, QUnit.done = function (a, b) { blanket.noConflict().onTestsDone() }, QUnit.moduleStart = function (a) { blanket.noConflict().onModuleStart() }, QUnit.testStart = function (a) { blanket.noConflict().onTestStart() }, QUnit.testDone = function (a) { blanket.noConflict().onTestDone(a.total, a.passed) }, blanket.beforeStartTestRunner({ condition: a, callback: QUnit.start })) } }();"
  },
  {
    "path": "common/Tests/External/blanket-reporter.js",
    "content": "﻿(function myReporter() {\n\n    var reported = false;\n    var a = document.createElement(\"a\");\n\n    document.body.appendChild(a);\n    //your reporter code\n    blanket.customReporter = function (coverage) {\n        blanket.defaultReporter(coverage);\n\n        var styleTags = document.getElementsByTagName(\"style\");\n\n        var styles = \"\";\n        for (var i = 0; i < styleTags.length; i++) {\n            styles += styleTags[i].outerHTML;\n        }\n\n        var scriptTags = document.getElementsByTagName(\"body\")[0].getElementsByTagName(\"script\");\n\n        var scripts = \"\";\n        for (var i = 0; i < scriptTags.length; i++) {\n            scripts += scriptTags[i].outerHTML;\n        }\n\n        var title = document.getElementsByTagName(\"title\")[0].text;\n        var documentName = title.replace(/[^\\w]/ig, '') + 'Coverage.html';\n\n        var coverageReport = '';\n        coverageReport += '<html>' + '<head>' + styles + \"</head><body><h1>\" + title.replace(/[^\\w\\s]/ig, '') + \"</h1>\" + scripts + document.getElementById(\"blanket-main\").outerHTML + \"</body></html>\";\n\n        var file = new Blob([coverageReport], { type: 'text/plain' });\n\n        a.href = URL.createObjectURL(file);\n\n        a.download = documentName;\n\n        if (!reported) {\n            a.click();\n            reported = true;\n        }\n        \n    };\n\n})();"
  },
  {
    "path": "common/Tests/External/jquery.d.ts",
    "content": "﻿// Type definitions for jQuery 1.10.x / 2.0.x\n// Project: http://jquery.com/\n// Definitions by: Boris Yankov <https://github.com/borisyankov/>, Christian Hoffmeister <https://github.com/choffmeister>, Steve Fenton <https://github.com/Steve-Fenton>, Diullei Gomes <https://github.com/Diullei>, Tass Iliopoulos <https://github.com/tasoili>, Jason Swearingen <https://github.com/jasons-novaleaf>, Sean Hill <https://github.com/seanski>, Guus Goossens <https://github.com/Guuz>, Kelly Summerlin <https://github.com/ksummerlin>, Basarat Ali Syed <https://github.com/basarat>, Nicholas Wolverson <https://github.com/nwolverson>, Derek Cicerone <https://github.com/derekcicerone>, Andrew Gaspar <https://github.com/AndrewGaspar>, James Harrison Fisher <https://github.com/jameshfisher>, Seikichi Kondo <https://github.com/seikichi>, Benjamin Jackman <https://github.com/benjaminjackman>, Poul Sorensen <https://github.com/s093294>, Josh Strobl <https://github.com/JoshStrobl>, John Reilly <https://github.com/johnnyreilly/>, Dick van den Brink <https://github.com/DickvdBrink>\n// Definitions: https://github.com/borisyankov/DefinitelyTyped\n\n/* *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n/**\n * Interface for the AJAX setting that will configure the AJAX request\n */\ninterface JQueryAjaxSettings {\n    /**\n     * The content type sent in the request header that tells the server what kind of response it will accept in return. If the accepts setting needs modification, it is recommended to do so once in the $.ajaxSetup() method.\n     */\n    accepts?: any;\n    /**\n     * By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: \"jsonp\" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active. As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated; you must use the success/error/complete callback options instead of the corresponding methods of the jqXHR object such as jqXHR.done() or the deprecated jqXHR.success().\n     */\n    async?: boolean;\n    /**\n     * A pre-request callback function that can be used to modify the jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object before it is sent. Use this to set custom headers, etc. The jqXHR and settings objects are passed as arguments. This is an Ajax Event. Returning false in the beforeSend function will cancel the request. As of jQuery 1.5, the beforeSend option will be called regardless of the type of request.\n     */\n    beforeSend? (jqXHR: JQueryXHR, settings: JQueryAjaxSettings): any;\n    /**\n     * If set to false, it will force requested pages not to be cached by the browser. Note: Setting cache to false will only work correctly with HEAD and GET requests. It works by appending \"_={timestamp}\" to the GET parameters. The parameter is not needed for other types of requests, except in IE8 when a POST is made to a URL that has already been requested by a GET.\n     */\n    cache?: boolean;\n    /**\n     * A function to be called when the request finishes (after success and error callbacks are executed). The function gets passed two arguments: The jqXHR (in jQuery 1.4.x, XMLHTTPRequest) object and a string categorizing the status of the request (\"success\", \"notmodified\", \"error\", \"timeout\", \"abort\", or \"parsererror\"). As of jQuery 1.5, the complete setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event.\n     */\n    complete? (jqXHR: JQueryXHR, textStatus: string): any;\n    /**\n     * An object of string/regular-expression pairs that determine how jQuery will parse the response, given its content type. (version added: 1.5)\n     */\n    contents?: { [key: string]: any; };\n    //According to jQuery.ajax source code, ajax's option actually allows contentType to set to \"false\"\n    // https://github.com/borisyankov/DefinitelyTyped/issues/742\n    /**\n     * When sending data to the server, use this content type. Default is \"application/x-www-form-urlencoded; charset=UTF-8\", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding.\n     */\n    contentType?: any;\n    /**\n     * This object will be made the context of all Ajax-related callbacks. By default, the context is an object that represents the ajax settings used in the call ($.ajaxSettings merged with the settings passed to $.ajax).\n     */\n    context?: any;\n    /**\n     * An object containing dataType-to-dataType converters. Each converter's value is a function that returns the transformed value of the response. (version added: 1.5)\n     */\n    converters?: { [key: string]: any; };\n    /**\n     * If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for example, server-side redirection to another domain. (version added: 1.5)\n     */\n    crossDomain?: boolean;\n    /**\n     * Data to be sent to the server. It is converted to a query string, if not already a string. It's appended to the url for GET-requests. See processData option to prevent this automatic processing. Object must be Key/Value pairs. If value is an Array, jQuery serializes multiple values with same key based on the value of the traditional setting (described below).\n     */\n    data?: any;\n    /**\n     * A function to be used to handle the raw response data of XMLHttpRequest.This is a pre-filtering function to sanitize the response. You should return the sanitized data. The function accepts two arguments: The raw data returned from the server and the 'dataType' parameter.\n     */\n    dataFilter? (data: any, ty: any): any;\n    /**\n     * The type of data that you're expecting back from the server. If none is specified, jQuery will try to infer it based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string). \n     */\n    dataType?: string;\n    /**\n     * A function to be called if the request fails. The function receives three arguments: The jqXHR (in jQuery 1.4.x, XMLHttpRequest) object, a string describing the type of error that occurred and an optional exception object, if one occurred. Possible values for the second argument (besides null) are \"timeout\", \"error\", \"abort\", and \"parsererror\". When an HTTP error occurs, errorThrown receives the textual portion of the HTTP status, such as \"Not Found\" or \"Internal Server Error.\" As of jQuery 1.5, the error setting can accept an array of functions. Each function will be called in turn. Note: This handler is not called for cross-domain script and cross-domain JSONP requests. This is an Ajax Event.\n     */\n    error? (jqXHR: JQueryXHR, textStatus: string, errorThrown: string): any;\n    /**\n     * Whether to trigger global Ajax event handlers for this request. The default is true. Set to false to prevent the global handlers like ajaxStart or ajaxStop from being triggered. This can be used to control various Ajax Events.\n     */\n    global?: boolean;\n    /**\n     * An object of additional header key/value pairs to send along with requests using the XMLHttpRequest transport. The header X-Requested-With: XMLHttpRequest is always added, but its default XMLHttpRequest value can be changed here. Values in the headers setting can also be overwritten from within the beforeSend function. (version added: 1.5)\n     */\n    headers?: { [key: string]: any; };\n    /**\n     * Allow the request to be successful only if the response has changed since the last request. This is done by checking the Last-Modified header. Default value is false, ignoring the header. In jQuery 1.4 this technique also checks the 'etag' specified by the server to catch unmodified data.\n     */\n    ifModified?: boolean;\n    /**\n     * Allow the current environment to be recognized as \"local,\" (e.g. the filesystem), even if jQuery does not recognize it as such by default. The following protocols are currently recognized as local: file, *-extension, and widget. If the isLocal setting needs modification, it is recommended to do so once in the $.ajaxSetup() method. (version added: 1.5.1)\n     */\n    isLocal?: boolean;\n    /**\n     * Override the callback function name in a jsonp request. This value will be used instead of 'callback' in the 'callback=?' part of the query string in the url. So {jsonp:'onJSONPLoad'} would result in 'onJSONPLoad=?' passed to the server. As of jQuery 1.5, setting the jsonp option to false prevents jQuery from adding the \"?callback\" string to the URL or attempting to use \"=?\" for transformation. In this case, you should also explicitly set the jsonpCallback setting. For example, { jsonp: false, jsonpCallback: \"callbackName\" }\n     */\n    jsonp?: any;\n    /**\n     * Specify the callback function name for a JSONP request. This value will be used instead of the random name automatically generated by jQuery. It is preferable to let jQuery generate a unique name as it'll make it easier to manage the requests and provide callbacks and error handling. You may want to specify the callback when you want to enable better browser caching of GET requests. As of jQuery 1.5, you can also use a function for this setting, in which case the value of jsonpCallback is set to the return value of that function.\n     */\n    jsonpCallback?: any;\n    /**\n     * A mime type to override the XHR mime type. (version added: 1.5.1)\n     */\n    mimeType?: string;\n    /**\n     * A password to be used with XMLHttpRequest in response to an HTTP access authentication request.\n     */\n    password?: string;\n    /**\n     * By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type \"application/x-www-form-urlencoded\". If you want to send a DOMDocument, or other non-processed data, set this option to false.\n     */\n    processData?: boolean;\n    /**\n     * Only applies when the \"script\" transport is used (e.g., cross-domain requests with \"jsonp\" or \"script\" dataType and \"GET\" type). Sets the charset attribute on the script tag used in the request. Used when the character set on the local page is not the same as the one on the remote script.\n     */\n    scriptCharset?: string;\n    /**\n     * An object of numeric HTTP codes and functions to be called when the response has the corresponding code. f the request is successful, the status code functions take the same parameters as the success callback; if it results in an error (including 3xx redirect), they take the same parameters as the error callback. (version added: 1.5)\n     */\n    statusCode?: { [key: string]: any; };\n    /**\n     * A function to be called if the request succeeds. The function gets passed three arguments: The data returned from the server, formatted according to the dataType parameter; a string describing the status; and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event.\n     */\n    success? (data: any, textStatus: string, jqXHR: JQueryXHR): any;\n    /**\n     * Set a timeout (in milliseconds) for the request. This will override any global timeout set with $.ajaxSetup(). The timeout period starts at the point the $.ajax call is made; if several other requests are in progress and the browser has no connections available, it is possible for a request to time out before it can be sent. In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period.\n     */\n    timeout?: number;\n    /**\n     * Set this to true if you wish to use the traditional style of param serialization.\n     */\n    traditional?: boolean;\n    /**\n     * The type of request to make (\"POST\" or \"GET\"), default is \"GET\". Note: Other HTTP request methods, such as PUT and DELETE, can also be used here, but they are not supported by all browsers.\n     */\n    type?: string;\n    /**\n     * A string containing the URL to which the request is sent.\n     */\n    url?: string;\n    /**\n     * A username to be used with XMLHttpRequest in response to an HTTP access authentication request.\n     */\n    username?: string;\n    /**\n     * Callback for creating the XMLHttpRequest object. Defaults to the ActiveXObject when available (IE), the XMLHttpRequest otherwise. Override to provide your own implementation for XMLHttpRequest or enhancements to the factory.\n     */\n    xhr?: any;\n    /**\n     * An object of fieldName-fieldValue pairs to set on the native XHR object. For example, you can use it to set withCredentials to true for cross-domain requests if needed. In jQuery 1.5, the withCredentials property was not propagated to the native XHR and thus CORS requests requiring it would ignore this flag. For this reason, we recommend using jQuery 1.5.1+ should you require the use of it. (version added: 1.5.1)\n     */\n    xhrFields?: { [key: string]: any; };\n}\n\n/**\n * Interface for the jqXHR object\n */\ninterface JQueryXHR extends XMLHttpRequest, JQueryPromise<any> {\n    /**\n     * The .overrideMimeType() method may be used in the beforeSend() callback function, for example, to modify the response content-type header. As of jQuery 1.5.1, the jqXHR object also contains the overrideMimeType() method (it was available in jQuery 1.4.x, as well, but was temporarily removed in jQuery 1.5). \n     */\n    overrideMimeType(mimeType: string): any;\n    /**\n     * Cancel the request. \n     *\n     * @param statusText - A string passed as the textStatus parameter for the done callback. Default value: \"canceled\"\n     */\n    abort(statusText?: string): void;\n    /**\n     * Incorporates the functionality of the .done() and .fail() methods, allowing (as of jQuery 1.8) the underlying Promise to be manipulated. Refer to deferred.then() for implementation details.\n     */\n    then(doneCallback: (data: any, textStatus: string, jqXHR: JQueryXHR) => void, failCallback?: (jqXHR: JQueryXHR, textStatus: string, errorThrown: any) => void): JQueryPromise<any>;\n    /**\n     * Property containing the parsed response if the response Content-Type is json\n     */\n    responseJSON?: any;\n}\n\n/**\n * Interface for the JQuery callback\n */\ninterface JQueryCallback {\n    /**\n     * Add a callback or a collection of callbacks to a callback list.\n     * \n     * @param callbacks - A function, or array of functions, that are to be added to the callback list.\n     */\n    add(callbacks: Function): JQueryCallback;\n    /**\n     * Add a callback or a collection of callbacks to a callback list.\n     * \n     * @param callbacks - A function, or array of functions, that are to be added to the callback list.\n     */\n    add(callbacks: Function[]): JQueryCallback;\n\n    /**\n     * Disable a callback list from doing anything more.\n     */\n    disable(): JQueryCallback;\n\n    /**\n     * Determine if the callbacks list has been disabled.\n     */\n    disabled(): boolean;\n\n    /**\n     * Remove all of the callbacks from a list.\n     */\n    empty(): JQueryCallback;\n\n    /**\n     * Call all of the callbacks with the given arguments\n     * \n     * @param arguments - The argument or list of arguments to pass back to the callback list.\n     */\n    fire(...arguments: any[]): JQueryCallback;\n\n    /**\n     * Determine if the callbacks have already been called at least once.\n     */\n    fired(): boolean;\n\n    /**\n     * Call all callbacks in a list with the given context and arguments.\n     * \n     * @param context - A reference to the context in which the callbacks in the list should be fired.\n     * @param arguments - An argument, or array of arguments, to pass to the callbacks in the list.\n     */\n    fireWith(context?: any, ...args: any[]): JQueryCallback;\n\n    /**\n     * Determine whether a supplied callback is in a list\n     * \n     * @param callback - The callback to search for.\n     */\n    has(callback: Function): boolean;\n\n    /**\n     * Lock a callback list in its current state.\n     */\n    lock(): JQueryCallback;\n\n    /**\n     * Determine if the callbacks list has been locked.\n     */\n    locked(): boolean;\n\n    /**\n     * Remove a callback or a collection of callbacks from a callback list.\n     * \n     * @param callbacks - A function, or array of functions, that are to be removed from the callback list.\n     */\n    remove(callbacks: Function): JQueryCallback;\n    /**\n     * Remove a callback or a collection of callbacks from a callback list.\n     * \n     * @param callbacks - A function, or array of functions, that are to be removed from the callback list.\n     */\n    remove(callbacks: Function[]): JQueryCallback;\n}\n\n/**\n * Allows jQuery Promises to interop with non-jQuery promises\n */\ninterface JQueryGenericPromise<T> {\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     */\n    then<U>(doneFilter: (value: T) => U, failFilter?: (reason: any) => U): JQueryGenericPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     */\n    then<U>(doneFilter: (value: T) => JQueryGenericPromise<U>, failFilter?: (reason: any) => U): JQueryGenericPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     */\n    then<U>(doneFilter: (value: T) => U, failFilter?: (reason: any) => JQueryGenericPromise<U>): JQueryGenericPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     */\n    then<U>(doneFilter: (value: T) => JQueryGenericPromise<U>, failFilter?: (reason: any) => JQueryGenericPromise<U>): JQueryGenericPromise<U>;\n}\n\n/**\n * Interface for the JQuery promise/deferred callbacks\n */\ninterface JQueryPromiseCallback<T> {\n    (value?: T, ...args: any[]): void;\n}\n\ninterface JQueryPromiseOperator<T, R> {\n    (callback: JQueryPromiseCallback<T>, ...callbacks: JQueryPromiseCallback<T>[]): JQueryPromise<R>;\n    (callback: JQueryPromiseCallback<T>[], ...callbacks: JQueryPromiseCallback<T>[]): JQueryPromise<R>;\n}\n\n/**\n * Interface for the JQuery promise, part of callbacks\n */\ninterface JQueryPromise<T> {\n    /**\n     * Add handlers to be called when the Deferred object is either resolved or rejected.\n     * \n     * @param alwaysCallbacks1 - A function, or array of functions, that is called when the Deferred is resolved or rejected.\n     * @param alwaysCallbacks2 - Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.\n     */\n    always: JQueryPromiseOperator<any, T>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved.\n     * \n     * @param doneCallbacks1 - A function, or array of functions, that are called when the Deferred is resolved.\n     * @param doneCallbacks2 - Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.\n     */\n    done: JQueryPromiseOperator<T, T>;\n    /**\n     * Add handlers to be called when the Deferred object is rejected.\n     * \n     * @param failCallbacks1 - A function, or array of functions, that are called when the Deferred is rejected.\n     * @param failCallbacks2 - Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.\n     */\n    fail: JQueryPromiseOperator<any, T>;\n    /**\n     * Add handlers to be called when the Deferred object generates progress notifications.\n     * \n     * @param progressCallbacks - A function, or array of functions, to be called when the Deferred generates progress notifications.\n     */\n    progress(progressCallback: JQueryPromiseCallback<T>): JQueryPromise<T>;\n    progress(progressCallbacks: JQueryPromiseCallback<T>[]): JQueryPromise<T>;\n\n    /**\n     * Determine the current state of a Deferred object.\n     */\n    state(): string;\n\n    // Deprecated - given no typings\n    pipe(doneFilter?: (x: any) => any, failFilter?: (x: any) => any, progressFilter?: (x: any) => any): JQueryPromise<any>;\n\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (value: T) => U, failFilter?: (...reasons: any[]) => U, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (value: T) => JQueryGenericPromise<U>, failFilter?: (...reasons: any[]) => U, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (value: T) => U, failFilter?: (...reasons: any[]) => JQueryGenericPromise<U>, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (value: T) => JQueryGenericPromise<U>, failFilter?: (...reasons: any[]) => JQueryGenericPromise<U>, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n\n    // Because JQuery Promises Suck\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (...values: any[]) => U, failFilter?: (...reasons: any[]) => U, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (...values: any[]) => JQueryGenericPromise<U>, failFilter?: (...reasons: any[]) => U, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (...values: any[]) => U, failFilter?: (...reasons: any[]) => JQueryGenericPromise<U>, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.\n     * \n     * @param doneFilter - A function that is called when the Deferred is resolved.\n     * @param failFilter - An optional function that is called when the Deferred is rejected.\n     * @param progressFilter - An optional function that is called when progress notifications are sent to the Deferred.\n     */\n    then<U>(doneFilter: (...values: any[]) => JQueryGenericPromise<U>, failFilter?: (...reasons: any[]) => JQueryGenericPromise<U>, progressFilter?: (...progression: any[]) => any): JQueryPromise<U>;\n}\n\n/**\n * Interface for the JQuery deferred, part of callbacks\n */\ninterface JQueryDeferred<T> extends JQueryPromise<T> {\n    /**\n     * Add handlers to be called when the Deferred object is either resolved or rejected.\n     * \n     * @param alwaysCallbacks1 - A function, or array of functions, that is called when the Deferred is resolved or rejected.\n     * @param alwaysCallbacks2 - Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.\n     */\n    always(alwaysCallbacks1?: JQueryPromiseCallback<T>, ...alwaysCallbacks2: JQueryPromiseCallback<T>[]): JQueryDeferred<T>;\n    always(alwaysCallbacks1?: JQueryPromiseCallback<T>[], ...alwaysCallbacks2: JQueryPromiseCallback<T>[]): JQueryDeferred<T>;\n    always(alwaysCallbacks1?: JQueryPromiseCallback<T>, ...alwaysCallbacks2: any[]): JQueryDeferred<T>;\n    always(alwaysCallbacks1?: JQueryPromiseCallback<T>[], ...alwaysCallbacks2: any[]): JQueryDeferred<T>;\n    /**\n     * Add handlers to be called when the Deferred object is resolved.\n     * \n     * @param doneCallbacks1 - A function, or array of functions, that are called when the Deferred is resolved.\n     * @param doneCallbacks2 - Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.\n     */\n    done(doneCallbacks1?: JQueryPromiseCallback<T>, ...doneCallbacks2: JQueryPromiseCallback<T>[]): JQueryDeferred<T>;\n    done(doneCallbacks1?: JQueryPromiseCallback<T>[], ...doneCallbacks2: JQueryPromiseCallback<T>[]): JQueryDeferred<T>;\n    done(doneCallbacks1?: JQueryPromiseCallback<T>, ...doneCallbacks2: any[]): JQueryDeferred<T>;\n    done(doneCallbacks1?: JQueryPromiseCallback<T>[], ...doneCallbacks2: any[]): JQueryDeferred<T>;\n    /**\n     * Add handlers to be called when the Deferred object is rejected.\n     * \n     * @param failCallbacks1 - A function, or array of functions, that are called when the Deferred is rejected.\n     * @param failCallbacks2 - Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.\n     */\n    fail(failCallbacks1?: JQueryPromiseCallback<T>, ...failCallbacks2: JQueryPromiseCallback<T>[]): JQueryDeferred<T>;\n    fail(failCallbacks1?: JQueryPromiseCallback<T>[], ...failCallbacks2: JQueryPromiseCallback<T>[]): JQueryDeferred<T>;\n    fail(failCallbacks1?: JQueryPromiseCallback<T>, ...failCallbacks2: any[]): JQueryDeferred<T>;\n    fail(failCallbacks1?: JQueryPromiseCallback<T>[], ...failCallbacks2: any[]): JQueryDeferred<T>;\n    /**\n     * Add handlers to be called when the Deferred object generates progress notifications.\n     * \n     * @param progressCallbacks - A function, or array of functions, to be called when the Deferred generates progress notifications.\n     */\n    progress(progressCallback: JQueryPromiseCallback<T>): JQueryDeferred<T>;\n    progress(progressCallbacks: JQueryPromiseCallback<T>[]): JQueryDeferred<T>;\n\n    /**\n     * Call the progressCallbacks on a Deferred object with the given args.\n     * \n     * @param args - Optional arguments that are passed to the progressCallbacks.\n     */\n    notify(...args: any[]): JQueryDeferred<T>;\n\n    /**\n     * Call the progressCallbacks on a Deferred object with the given context and args.\n     * \n     * @param context - Context passed to the progressCallbacks as the this object.\n     * @param args - Optional arguments that are passed to the progressCallbacks.\n     */\n    notifyWith(context: any, ...args: any[]): JQueryDeferred<T>;\n\n    /**\n     * Reject a Deferred object and call any failCallbacks with the given args.\n     * \n     * @param args - Optional arguments that are passed to the failCallbacks.\n     */\n    reject(...args: any[]): JQueryDeferred<T>;\n    /**\n     * Reject a Deferred object and call any failCallbacks with the given context and args.\n     * \n     * @param context - Context passed to the failCallbacks as the this object.\n     * @param args - An optional array of arguments that are passed to the failCallbacks.\n     */\n    rejectWith(context: any, ...args: any[]): JQueryDeferred<T>;\n\n    /**\n     * Resolve a Deferred object and call any doneCallbacks with the given args.\n     * \n     * @param value - First argument passed to doneCallbacks.\n     * @param args - Optional subsequent arguments that are passed to the doneCallbacks.\n     */\n    resolve(value?: T, ...args: any[]): JQueryDeferred<T>;\n\n    /**\n     * Resolve a Deferred object and call any doneCallbacks with the given context and args.\n     * \n     * @param context - Context passed to the doneCallbacks as the this object.\n     * @param args - An optional array of arguments that are passed to the doneCallbacks.\n     */\n    resolveWith(context: any, ...args: any[]): JQueryDeferred<T>;\n\n    /**\n     * Return a Deferred's Promise object.\n     * \n     * @param target - Object onto which the promise methods have to be attached\n     */\n    promise(target?: any): JQueryPromise<T>;\n}\n\n/**\n * Interface of the JQuery extension of the W3C event object\n */\ninterface BaseJQueryEventObject extends Event {\n    data: any;\n    delegateTarget: Element;\n    isDefaultPrevented(): boolean;\n    isImmediatePropagationStopped(): boolean;\n    isPropagationStopped(): boolean;\n    namespace: string;\n    originalEvent: Event;\n    preventDefault(): any;\n    relatedTarget: Element;\n    result: any;\n    stopImmediatePropagation(): void;\n    stopPropagation(): void;\n    pageX: number;\n    pageY: number;\n    which: number;\n    metaKey: boolean;\n}\n\ninterface JQueryInputEventObject extends BaseJQueryEventObject {\n    altKey: boolean;\n    ctrlKey: boolean;\n    metaKey: boolean;\n    shiftKey: boolean;\n}\n\ninterface JQueryMouseEventObject extends JQueryInputEventObject {\n    button: number;\n    clientX: number;\n    clientY: number;\n    offsetX: number;\n    offsetY: number;\n    pageX: number;\n    pageY: number;\n    screenX: number;\n    screenY: number;\n}\n\ninterface JQueryKeyEventObject extends JQueryInputEventObject {\n    char: any;\n    charCode: number;\n    key: any;\n    keyCode: number;\n}\n\ninterface JQueryEventObject extends BaseJQueryEventObject, JQueryInputEventObject, JQueryMouseEventObject, JQueryKeyEventObject {\n}\n\n/*\n    Collection of properties of the current browser\n*/\n\ninterface JQuerySupport {\n    ajax?: boolean;\n    boxModel?: boolean;\n    changeBubbles?: boolean;\n    checkClone?: boolean;\n    checkOn?: boolean;\n    cors?: boolean;\n    cssFloat?: boolean;\n    hrefNormalized?: boolean;\n    htmlSerialize?: boolean;\n    leadingWhitespace?: boolean;\n    noCloneChecked?: boolean;\n    noCloneEvent?: boolean;\n    opacity?: boolean;\n    optDisabled?: boolean;\n    optSelected?: boolean;\n    scriptEval? (): boolean;\n    style?: boolean;\n    submitBubbles?: boolean;\n    tbody?: boolean;\n}\n\ninterface JQueryParam {\n    /**\n     * Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.\n     * \n     * @param obj - An array or object to serialize.\n     */\n    (obj: any): string;\n\n    /**\n     * Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.\n     * \n     * @param obj - An array or object to serialize.\n     * @param traditional - A Boolean indicating whether to perform a traditional \"shallow\" serialization.\n     */\n    (obj: any, traditional: boolean): string;\n}\n\n/**\n * The interface used to construct jQuery events (with $.Event). It is\n * defined separately instead of inline in JQueryStatic to allow\n * overriding the construction function with specific strings\n * returning specific event objects.\n */\ninterface JQueryEventConstructor {\n    (name: string, eventProperties?: any): JQueryEventObject;\n    new (name: string, eventProperties?: any): JQueryEventObject;\n}\n\n/**\n * The interface used to specify coordinates.\n */\ninterface JQueryCoordinates {\n    left: number;\n    top: number;\n}\n\ninterface JQueryAnimationOptions {\n    /**\n     * A string or number determining how long the animation will run.\n     */\n    duration?: any;\n    /**\n     * A string indicating which easing function to use for the transition.\n     */\n    easing?: string;\n    /**\n     * A function to call once the animation is complete.\n     */\n    complete?: Function;\n    /**\n     * A function to be called for each animated property of each animated element. This function provides an opportunity to modify the Tween object to change the value of the property before it is set.\n     */\n    step?: (now: number, tween: any) => any;\n    /**\n     * A function to be called after each step of the animation, only once per animated element regardless of the number of animated properties. (version added: 1.8)\n     */\n    progress?: (animation: JQueryPromise<any>, progress: number, remainingMs: number) => any;\n    /**\n     * A function to call when the animation begins. (version added: 1.8)\n     */\n    start?: (animation: JQueryPromise<any>) => any;\n    /**\n     * A function to be called when the animation completes (its Promise object is resolved). (version added: 1.8)\n     */\n    done?: (animation: JQueryPromise<any>, jumpedToEnd: boolean) => any;\n    /**\n     * A function to be called when the animation fails to complete (its Promise object is rejected). (version added: 1.8)\n     */\n    fail?: (animation: JQueryPromise<any>, jumpedToEnd: boolean) => any;\n    /**\n     * A function to be called when the animation completes or stops without completing (its Promise object is either resolved or rejected). (version added: 1.8)\n     */\n    always?: (animation: JQueryPromise<any>, jumpedToEnd: boolean) => any;\n    /**\n     * A Boolean indicating whether to place the animation in the effects queue. If false, the animation will begin immediately. As of jQuery 1.7, the queue option can also accept a string, in which case the animation is added to the queue represented by that string. When a custom queue name is used the animation does not automatically start; you must call .dequeue(\"queuename\") to start it.\n     */\n    queue?: any;\n    /**\n     * A map of one or more of the CSS properties defined by the properties argument and their corresponding easing functions. (version added: 1.4)\n     */\n    specialEasing?: Object;\n}\n\n/**\n * Static members of jQuery (those on $ and jQuery themselves)\n */\ninterface JQueryStatic {\n\n    /**\n     * Perform an asynchronous HTTP (Ajax) request.\n     *\n     * @param settings - A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().\n     */\n    ajax(settings: JQueryAjaxSettings): JQueryXHR;\n    /**\n     * Perform an asynchronous HTTP (Ajax) request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param settings - A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().\n     */\n    ajax(url: string, settings?: JQueryAjaxSettings): JQueryXHR;\n\n    /**\n     * Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().\n     *\n     * @param dataTypes - An optional string containing one or more space-separated dataTypes\n     * @param handler - A handler to set default values for future Ajax requests.\n     */\n    ajaxPrefilter(dataTypes: string, handler: (opts: any, originalOpts: JQueryAjaxSettings, jqXHR: JQueryXHR) => any): void;\n    /**\n     * Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().\n     *\n     * @param handler - A handler to set default values for future Ajax requests.\n     */\n    ajaxPrefilter(handler: (opts: any, originalOpts: JQueryAjaxSettings, jqXHR: JQueryXHR) => any): void;\n\n    ajaxSettings: JQueryAjaxSettings;\n\n    /**\n     * Set default values for future Ajax requests. Its use is not recommended.\n     *\n     * @param options - A set of key/value pairs that configure the default Ajax request. All options are optional.\n     */\n    ajaxSetup(options: JQueryAjaxSettings): void;\n\n    /**\n     * Load data from the server using a HTTP GET request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param success - A callback function that is executed if the request succeeds.\n     * @param dataType - The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).\n     */\n    get(url: string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;\n    /**\n     * Load data from the server using a HTTP GET request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param success - A callback function that is executed if the request succeeds.\n     * @param dataType - The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).\n     */\n    get(url: string, data?: Object, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;\n    /**\n     * Load data from the server using a HTTP GET request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param success - A callback function that is executed if the request succeeds.\n     * @param dataType - The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).\n     */\n    get(url: string, data?: string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;\n    /**\n     * Load JSON-encoded data from the server using a GET HTTP request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param success - A callback function that is executed if the request succeeds.\n     */\n    getJSON(url: string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any): JQueryXHR;\n    /**\n     * Load JSON-encoded data from the server using a GET HTTP request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param success - A callback function that is executed if the request succeeds.\n     */\n    getJSON(url: string, data?: Object, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any): JQueryXHR;\n    /**\n     * Load JSON-encoded data from the server using a GET HTTP request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param success - A callback function that is executed if the request succeeds.\n     */\n    getJSON(url: string, data?: string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any): JQueryXHR;\n    /**\n     * Load a JavaScript file from the server using a GET HTTP request, then execute it.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param success - A callback function that is executed if the request succeeds.\n     */\n    getScript(url: string, success?: (script: string, textStatus: string, jqXHR: JQueryXHR) => any): JQueryXHR;\n\n    /**\n     * Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.\n     */\n    param: JQueryParam;\n\n    /**\n     * Load data from the server using a HTTP POST request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param success - A callback function that is executed if the request succeeds. Required if dataType is provided, but can be null in that case.\n     * @param dataType - The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).\n     */\n    post(url: string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;\n    /**\n     * Load data from the server using a HTTP POST request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param success - A callback function that is executed if the request succeeds. Required if dataType is provided, but can be null in that case.\n     * @param dataType - The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).\n     */\n    post(url: string, data?: Object, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;\n    /**\n     * Load data from the server using a HTTP POST request.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param success - A callback function that is executed if the request succeeds. Required if dataType is provided, but can be null in that case.\n     * @param dataType - The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).\n     */\n    post(url: string, data?: string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;\n\n    /**\n     * A multi-purpose callbacks list object that provides a powerful way to manage callback lists.\n     *\n     * @param flags - An optional list of space-separated flags that change how the callback list behaves.\n     */\n    Callbacks(flags?: string): JQueryCallback;\n\n    /**\n     * Holds or releases the execution of jQuery's ready event.\n     *\n     * @param hold - Indicates whether the ready hold is being requested or released\n     */\n    holdReady(hold: boolean): void;\n\n    /**\n     * Accepts a string containing a CSS selector which is then used to match a set of elements.\n     *\n     * @param selector - A string containing a selector expression\n     * @param context - A DOM Element, Document, or jQuery to use as context\n     */\n    (selector: string, context?: Element): JQuery;\n    /**\n     * Accepts a string containing a CSS selector which is then used to match a set of elements.\n     *\n     * @param selector - A string containing a selector expression\n     * @param context - A DOM Element, Document, or jQuery to use as context\n     */\n    (selector: string, context?: JQuery): JQuery;\n    /**\n     * Accepts a string containing a CSS selector which is then used to match a set of elements.\n     *\n     * @param element - A DOM element to wrap in a jQuery object.\n     */\n    (element: Element): JQuery;\n    /**\n     * Accepts a string containing a CSS selector which is then used to match a set of elements.\n     *\n     * @param elementArray - An array containing a set of DOM elements to wrap in a jQuery object.\n     */\n    (elementArray: Element[]): JQuery;\n    /**\n     * Accepts a string containing a CSS selector which is then used to match a set of elements.\n     *\n     * @param object - A plain object to wrap in a jQuery object.\n     */\n    (object: {}): JQuery;\n    /**\n     * Accepts a string containing a CSS selector which is then used to match a set of elements.\n     *\n     * @param object - An existing jQuery object to clone.\n     */\n    (object: JQuery): JQuery;\n    /**\n     * Specify a function to execute when the DOM is fully loaded.\n     */\n    (): JQuery;\n\n    /**\n     * Creates DOM elements on the fly from the provided string of raw HTML.\n     *\n     * @param html - A string of HTML to create on the fly. Note that this parses HTML, not XML.\n     * @param ownerDocument - A document in which the new elements will be created.\n     */\n    (html: string, ownerDocument?: Document): JQuery;\n    /**\n     * Creates DOM elements on the fly from the provided string of raw HTML.\n     *\n     * @param html - A string defining a single, standalone, HTML element (e.g. <div/> or <div></div>).\n     * @param attributes - An object of attributes, events, and methods to call on the newly-created element.\n     */\n    (html: string, attributes: Object): JQuery;\n\n    /**\n     * Binds a function to be executed when the DOM has finished loading.\n     *\n     * @param callback - A function to execute after the DOM is ready.\n     */\n    (callback: Function): JQuery;\n\n    /**\n     * Relinquish jQuery's control of the $ variable.\n     *\n     * @param removeAll - A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself).\n     */\n    noConflict(removeAll?: boolean): Object;\n\n    /**\n     * Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.\n     *\n     * @param deferreds - One or more Deferred objects, or plain JavaScript objects.\n     */\n    when<T>(...deferreds: JQueryGenericPromise<T>[]): JQueryPromise<T>;\n    /**\n     * Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.\n     *\n     * @param deferreds - One or more Deferred objects, or plain JavaScript objects.\n     */\n    when<T>(...deferreds: T[]): JQueryPromise<T>;\n    /**\n     * Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.\n     *\n     * @param deferreds - One or more Deferred objects, or plain JavaScript objects.\n     */\n    when<T>(...deferreds: any[]): JQueryPromise<T>;\n\n    /**\n     * Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties.\n     */\n    cssHooks: { [key: string]: any; };\n    cssNumber: any;\n\n    /**\n     * Store arbitrary data associated with the specified element. Returns the value that was set.\n     *\n     * @param element - The DOM element to associate with the data.\n     * @param key - A string naming the piece of data to set.\n     * @param value - The new data value.\n     */\n    data<T>(element: Element, key: string, value: T): T;\n    /**\n     * Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.\n     *\n     * @param element - The DOM element to associate with the data.\n     * @param key - A string naming the piece of data to set.\n     */\n    data(element: Element, key: string): any;\n    /**\n     * Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.\n     *\n     * @param element - The DOM element to associate with the data.\n     */\n    data(element: Element): any;\n\n    /**\n     * Execute the next function on the queue for the matched element.\n     *\n     * @param element - A DOM element from which to remove and execute a queued function.\n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     */\n    dequeue(element: Element, queueName?: string): void;\n\n    /**\n     * Determine whether an element has any jQuery data associated with it.\n     *\n     * @param element - A DOM element to be checked for data.\n     */\n    hasData(element: Element): boolean;\n\n    /**\n     * Show the queue of functions to be executed on the matched element.\n     *\n     * @param element - A DOM element to inspect for an attached queue.\n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     */\n    queue(element: Element, queueName?: string): any[];\n    /**\n     * Manipulate the queue of functions to be executed on the matched element.\n     *\n     * @param element - A DOM element where the array of queued functions is attached.\n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     * @param newQueue - An array of functions to replace the current queue contents.\n     */\n    queue(element: Element, queueName: string, newQueue: Function[]): JQuery;\n    /**\n     * Manipulate the queue of functions to be executed on the matched element.\n     *\n     * @param element - A DOM element on which to add a queued function.\n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     * @param callback - The new function to add to the queue.\n     */\n    queue(element: Element, queueName: string, callback: Function): JQuery;\n\n    /**\n     * Remove a previously-stored piece of data.\n     *\n     * @param element - A DOM element from which to remove data.\n     * @param name - A string naming the piece of data to remove.\n     */\n    removeData(element: Element, name?: string): JQuery;\n\n    /**\n     * A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.\n     *\n     * @param beforeStart - A function that is called just before the constructor returns.\n     */\n    Deferred<T>(beforeStart?: (deferred: JQueryDeferred<T>) => any): JQueryDeferred<T>;\n\n    /**\n     * Effects\n     */\n    fx: {\n        tick: () => void;\n        /**\n         * The rate (in milliseconds) at which animations fire.\n         */\n        interval: number;\n        stop: () => void;\n        speeds: { slow: number; fast: number; };\n        /**\n         * Globally disable all animations.\n         */\n        off: boolean;\n        step: any;\n    };\n\n    /**\n     * Takes a function and returns a new one that will always have a particular context.\n     *\n     * @param fnction - The function whose context will be changed.\n     * @param context - The object to which the context (this) of the function should be set.\n     * @param additionalArguments - Any number of arguments to be passed to the function referenced in the function argument.\n     */\n    proxy(fnction: (...args: any[]) => any, context: Object, ...additionalArguments: any[]): any;\n    /**\n     * Takes a function and returns a new one that will always have a particular context.\n     *\n     * @param context - The object to which the context (this) of the function should be set.\n     * @param name - The name of the function whose context will be changed (should be a property of the context object).\n     * @param additionalArguments - Any number of arguments to be passed to the function named in the name argument.\n     */\n    proxy(context: Object, name: string, ...additionalArguments: any[]): any;\n\n    Event: JQueryEventConstructor;\n\n    /**\n     * Takes a string and throws an exception containing it.\n     *\n     * @param message - The message to send out.\n     */\n    error(message: any): JQuery;\n\n    expr: any;\n    fn: any;  //TODO: Decide how we want to type this\n\n    isReady: boolean;\n\n    // Properties\n    support: JQuerySupport;\n\n    /**\n     * Check to see if a DOM element is a descendant of another DOM element.\n     * \n     * @param container - The DOM element that may contain the other element.\n     * @param contained - The DOM element that may be contained by (a descendant of) the other element.\n     */\n    contains(container: Element, contained: Element): boolean;\n\n    /**\n     * A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.\n     * \n     * @param collection - The object or array to iterate over.\n     * @param callback - The function that will be executed on every object.\n     */\n    each<T>(\n        collection: T[],\n        callback: (indexInArray: number, valueOfElement: T) => any\n        ): any;\n\n    /**\n     * A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.\n     * \n     * @param collection - The object or array to iterate over.\n     * @param callback - The function that will be executed on every object.\n     */\n    each(\n        collection: any,\n        callback: (indexInArray: any, valueOfElement: any) => any\n        ): any;\n\n    /**\n     * Merge the contents of two or more objects together into the first object.\n     *\n     * @param target - An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument.\n     * @param object1 - An object containing additional properties to merge in.\n     * @param objectN - Additional objects containing properties to merge in.\n     */\n    extend(target: any, object1?: any, ...objectN: any[]): any;\n    /**\n     * Merge the contents of two or more objects together into the first object.\n     *\n     * @param deep - If true, the merge becomes recursive (aka. deep copy).\n     * @param target - The object to extend. It will receive the new properties.\n     * @param object1 - An object containing additional properties to merge in.\n     * @param objectN - Additional objects containing properties to merge in.\n     */\n    extend(deep: boolean, target: any, object1?: any, ...objectN: any[]): any;\n\n    /**\n     * Execute some JavaScript code globally.\n     *\n     * @param code - The JavaScript code to execute.\n     */\n    globalEval(code: string): any;\n\n    /**\n     * Finds the elements of an array which satisfy a filter function. The original array is not affected.\n     *\n     * @param array - The array to search through.\n     * @param func - The function to process each item against. The first argument to the function is the item, and the second argument is the index. The function should return a Boolean value.  this will be the global window object.\n     * @param invert - If \"invert\" is false, or not provided, then the function returns an array consisting of all elements for which \"callback\" returns true. If \"invert\" is true, then the function returns an array consisting of all elements for which \"callback\" returns false.\n     */\n    grep<T>(array: T[], func: (elementOfArray: T, indexInArray: number) => boolean, invert?: boolean): T[];\n\n    /**\n     * Search for a specified value within an array and return its index (or -1 if not found).\n     *\n     * @param value - The value to search for.\n     * @param array - An array through which to search.\n     * @param fromIndex - he index of the array at which to begin the search. The default is 0, which will search the whole array.\n     */\n    inArray<T>(value: T, array: T[], fromIndex?: number): number;\n\n    /**\n     * Determine whether the argument is an array.\n     *\n     * @param obj - Object to test whether or not it is an array.\n     */\n    isArray(obj: any): boolean;\n    /**\n     * Check to see if an object is empty (contains no enumerable properties).\n     *\n     * @param obj - The object that will be checked to see if it's empty.\n     */\n    isEmptyObject(obj: any): boolean;\n    /**\n     * Determine if the argument passed is a Javascript function object.\n     *\n     * @param obj - Object to test whether or not it is a function.\n     */\n    isFunction(obj: any): boolean;\n    /**\n     * Determines whether its argument is a number.\n     *\n     * @param obj - The value to be tested.\n     */\n    isNumeric(value: any): boolean;\n    /**\n     * Check to see if an object is a plain object (created using \"{}\" or \"new Object\").\n     *\n     * @param obj - The object that will be checked to see if it's a plain object.\n     */\n    isPlainObject(obj: any): boolean;\n    /**\n     * Determine whether the argument is a window.\n     *\n     * @param obj - Object to test whether or not it is a window.\n     */\n    isWindow(obj: any): boolean;\n    /**\n     * Check to see if a DOM node is within an XML document (or is an XML document).\n     *\n     * @param node - he DOM node that will be checked to see if it's in an XML document.\n     */\n    isXMLDoc(node: Node): boolean;\n\n    /**\n     * Convert an array-like object into a true JavaScript array.\n     * \n     * @param obj - Any object to turn into a native Array.\n     */\n    makeArray(obj: any): any[];\n\n    /**\n     * Translate all items in an array or object to new array of items.\n     * \n     * @param array - The Array to translate.\n     * @param callback - The function to process each item against. The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.\n     */\n    map<T, U>(array: T[], callback: (elementOfArray: T, indexInArray: number) => U): U[];\n    /**\n     * Translate all items in an array or object to new array of items.\n     * \n     * @param arrayOrObject - The Array or Object to translate.\n     * @param callback - The function to process each item against. The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.\n     */\n    map(arrayOrObject: any, callback: (value: any, indexOrKey: any) => any): any;\n\n    /**\n     * Merge the contents of two arrays together into the first array.\n     * \n     * @param first - The first array to merge, the elements of second added.\n     * @param second - The second array to merge into the first, unaltered.\n     */\n    merge<T>(first: T[], second: T[]): T[];\n\n    /**\n     * An empty function.\n     */\n    noop(): any;\n\n    /**\n     * Return a number representing the current time.\n     */\n    now(): number;\n\n    /**\n     * Takes a well-formed JSON string and returns the resulting JavaScript object.\n     * \n     * @param json - The JSON string to parse.\n     */\n    parseJSON(json: string): any;\n\n    /**\n     * Parses a string into an XML document.\n     *\n     * @param data - a well-formed XML string to be parsed\n     */\n    parseXML(data: string): XMLDocument;\n\n    /**\n     * Remove the whitespace from the beginning and end of a string.\n     * \n     * @param str - Remove the whitespace from the beginning and end of a string.\n     */\n    trim(str: string): string;\n\n    /**\n     * Determine the internal JavaScript [[Class]] of an object.\n     * \n     * @param obj - Object to get the internal JavaScript [[Class]] of.\n     */\n    type(obj: any): string;\n\n    /**\n     * Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.\n     * \n     * @param array - The Array of DOM elements.\n     */\n    unique(array: Element[]): Element[];\n\n    /**\n     * Parses a string into an array of DOM nodes.\n     *\n     * @param data - HTML string to be parsed\n     * @param context - DOM element to serve as the context in which the HTML fragment will be created\n     * @param keepScripts - A Boolean indicating whether to include scripts passed in the HTML string\n     */\n    parseHTML(data: string, context?: HTMLElement, keepScripts?: boolean): any[];\n\n    /**\n     * Parses a string into an array of DOM nodes.\n     *\n     * @param data - HTML string to be parsed\n     * @param context - DOM element to serve as the context in which the HTML fragment will be created\n     * @param keepScripts - A Boolean indicating whether to include scripts passed in the HTML string\n     */\n    parseHTML(data: string, context?: Document, keepScripts?: boolean): any[];\n}\n\n/**\n * The jQuery instance members\n */\ninterface JQuery {\n    /**\n     * Register a handler to be called when Ajax requests complete. This is an AjaxEvent.\n     *\n     * @param handler - The function to be invoked.\n     */\n    ajaxComplete(handler: (event: JQueryEventObject, XMLHttpRequest: XMLHttpRequest, ajaxOptions: any) => any): JQuery;\n    /**\n     * Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event.\n     *\n     * @param handler - The function to be invoked.\n     */\n    ajaxError(handler: (event: JQueryEventObject, jqXHR: JQueryXHR, ajaxSettings: JQueryAjaxSettings, thrownError: any) => any): JQuery;\n    /**\n     * Attach a function to be executed before an Ajax request is sent. This is an Ajax Event.\n     *\n     * @param handler - The function to be invoked.\n     */\n    ajaxSend(handler: (event: JQueryEventObject, jqXHR: JQueryXHR, ajaxOptions: JQueryAjaxSettings) => any): JQuery;\n    /**\n     * Register a handler to be called when the first Ajax request begins. This is an Ajax Event.\n     *\n     * @param handler - The function to be invoked.\n     */\n    ajaxStart(handler: () => any): JQuery;\n    /**\n     * Register a handler to be called when all Ajax requests have completed. This is an Ajax Event.\n     *\n     * @param handler - The function to be invoked.\n     */\n    ajaxStop(handler: () => any): JQuery;\n    /**\n     * Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event.\n     *\n     * @param handler - The function to be invoked.\n     */\n    ajaxSuccess(handler: (event: JQueryEventObject, XMLHttpRequest: XMLHttpRequest, ajaxOptions: JQueryAjaxSettings) => any): JQuery;\n\n    /**\n     * Load data from the server and place the returned HTML into the matched element.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param complete - A callback function that is executed when the request completes.\n     */\n    load(url: string, data?: string, complete?: (responseText: string, textStatus: string, XMLHttpRequest: XMLHttpRequest) => any): JQuery;\n    /**\n     * Load data from the server and place the returned HTML into the matched element.\n     *\n     * @param url - A string containing the URL to which the request is sent.\n     * @param data - A plain object or string that is sent to the server with the request.\n     * @param complete - A callback function that is executed when the request completes.\n     */\n    load(url: string, data?: Object, complete?: (responseText: string, textStatus: string, XMLHttpRequest: XMLHttpRequest) => any): JQuery;\n\n    /**\n     * Encode a set of form elements as a string for submission.\n     */\n    serialize(): string;\n    /**\n     * Encode a set of form elements as an array of names and values.\n     */\n    serializeArray(): Object[];\n\n    /**\n     * Adds the specified class(es) to each of the set of matched elements.\n     *\n     * @param className - One or more space-separated classes to be added to the class attribute of each matched element.\n     */\n    addClass(className: string): JQuery;\n    /**\n     * Adds the specified class(es) to each of the set of matched elements.\n     *\n     * @param function - A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set.\n     */\n    addClass(func: (index: number, className: string) => string): JQuery;\n\n    /**\n     * Add the previous set of elements on the stack to the current set, optionally filtered by a selector.\n     */\n    addBack(selector?: string): JQuery;\n\n    /**\n     * Get the value of an attribute for the first element in the set of matched elements.\n     *\n     * @param attributeName - The name of the attribute to get.\n     */\n    attr(attributeName: string): string;\n    /**\n     * Set one or more attributes for the set of matched elements.\n     *\n     * @param attributeName - The name of the attribute to set.\n     * @param value - A value to set for the attribute.\n     */\n    attr(attributeName: string, value: string): JQuery;\n    /**\n     * Set one or more attributes for the set of matched elements.\n     *\n     * @param attributeName - The name of the attribute to set.\n     * @param value - A value to set for the attribute.\n     */\n    attr(attributeName: string, value: number): JQuery;\n    /**\n     * Set one or more attributes for the set of matched elements.\n     *\n     * @param attributeName - The name of the attribute to set.\n     * @param func - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments.\n     */\n    attr(attributeName: string, func: (index: number, attr: any) => any): JQuery;\n    /**\n     * Set one or more attributes for the set of matched elements.\n     *\n     * @param attributes - An object of attribute-value pairs to set.\n     */\n    attr(attributes: Object): JQuery;\n\n    /**\n     * Determine whether any of the matched elements are assigned the given class.\n     *\n     * @param className - The class name to search for.\n     */\n    hasClass(className: string): boolean;\n\n    /**\n     * Get the HTML contents of the first element in the set of matched elements.\n     */\n    html(): string;\n    /**\n     * Set the HTML contents of each element in the set of matched elements.\n     *\n     * @param htmlString - A string of HTML to set as the content of each matched element.\n     */\n    html(htmlString: string): JQuery;\n    /**\n     * Set the HTML contents of each element in the set of matched elements.\n     *\n     * @param func - A function returning the HTML content to set. Receives the index position of the element in the set and the old HTML value as arguments. jQuery empties the element before calling the function; use the oldhtml argument to reference the previous content. Within the function, this refers to the current element in the set.\n     */\n    html(func: (index: number, oldhtml: string) => string): JQuery;\n    /**\n     * Set the HTML contents of each element in the set of matched elements.\n     *\n     * @param func - A function returning the HTML content to set. Receives the index position of the element in the set and the old HTML value as arguments. jQuery empties the element before calling the function; use the oldhtml argument to reference the previous content. Within the function, this refers to the current element in the set.\n     */\n\n    /**\n     * Get the value of a property for the first element in the set of matched elements.\n     *\n     * @param propertyName - The name of the property to get.\n     */\n    prop(propertyName: string): any;\n    /**\n     * Set one or more properties for the set of matched elements.\n     *\n     * @param propertyName - The name of the property to set.\n     * @param value - A value to set for the property.\n     */\n    prop(propertyName: string, value: string): JQuery;\n    /**\n     * Set one or more properties for the set of matched elements.\n     *\n     * @param propertyName - The name of the property to set.\n     * @param value - A value to set for the property.\n     */\n    prop(propertyName: string, value: number): JQuery;\n    /**\n     * Set one or more properties for the set of matched elements.\n     *\n     * @param propertyName - The name of the property to set.\n     * @param value - A value to set for the property.\n     */\n    prop(propertyName: string, value: boolean): JQuery;\n    /**\n     * Set one or more properties for the set of matched elements.\n     *\n     * @param properties - An object of property-value pairs to set.\n     */\n    prop(properties: Object): JQuery;\n    /**\n     * Set one or more properties for the set of matched elements.\n     *\n     * @param propertyName - The name of the property to set.\n     * @param func - A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element.\n     */\n    prop(propertyName: string, func: (index: number, oldPropertyValue: any) => any): JQuery;\n\n    /**\n     * Remove an attribute from each element in the set of matched elements.\n     *\n     * @param attributeName - An attribute to remove; as of version 1.7, it can be a space-separated list of attributes.\n     */\n    removeAttr(attributeName: string): JQuery;\n\n    /**\n     * Remove a single class, multiple classes, or all classes from each element in the set of matched elements.\n     *\n     * @param className - One or more space-separated classes to be removed from the class attribute of each matched element.\n     */\n    removeClass(className?: string): JQuery;\n    /**\n     * Remove a single class, multiple classes, or all classes from each element in the set of matched elements.\n     *\n     * @param function - A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments.\n     */\n    removeClass(func: (index: number, className: string) => string): JQuery;\n\n    /**\n     * Remove a property for the set of matched elements.\n     *\n     * @param propertyName - The name of the property to remove.\n     */\n    removeProp(propertyName: string): JQuery;\n\n    /**\n     * Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.\n     *\n     * @param className - One or more class names (separated by spaces) to be toggled for each element in the matched set.\n     * @param swtch - A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.\n     */\n    toggleClass(className: string, swtch?: boolean): JQuery;\n    /**\n     * Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.\n     *\n     * @param swtch - A boolean value to determine whether the class should be added or removed.\n     */\n    toggleClass(swtch?: boolean): JQuery;\n    /**\n     * Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.\n     *\n     * @param func - A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments.\n     * @param swtch - A boolean value to determine whether the class should be added or removed.\n     */\n    toggleClass(func: (index: number, className: string, swtch: boolean) => string, swtch?: boolean): JQuery;\n\n    /**\n     * Get the current value of the first element in the set of matched elements.\n     */\n    val(): any;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param value - A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.\n     */\n    val(value: string): JQuery;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param value - A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.\n     */\n    val(value: string[]): JQuery;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param func - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    val(func: (index: number, value: string) => string): JQuery;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param func - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    val(func: (index: number, value: string[]) => string): JQuery;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param func - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    val(func: (index: number, value: number) => string): JQuery;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param func - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    val(func: (index: number, value: string) => string[]): JQuery;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param func - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    val(func: (index: number, value: string[]) => string[]): JQuery;\n    /**\n     * Set the value of each element in the set of matched elements.\n     *\n     * @param func - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    val(func: (index: number, value: number) => string[]): JQuery;\n\n    /**\n     * Get the value of style properties for the first element in the set of matched elements.\n     *\n     * @param propertyName - A CSS property.\n     */\n    css(propertyName: string): string;\n    /**\n     * Set one or more CSS properties for the set of matched elements.\n     *\n     * @param propertyName - A CSS property name.\n     * @param value - A value to set for the property.\n     */\n    css(propertyName: string, value: string): JQuery;\n    /**\n     * Set one or more CSS properties for the set of matched elements.\n     *\n     * @param propertyName - A CSS property name.\n     * @param value - A value to set for the property.\n     */\n    css(propertyName: string, value: number): JQuery;\n    /**\n     * Set one or more CSS properties for the set of matched elements.\n     *\n     * @param propertyName - A CSS property name.\n     * @param value - A value to set for the property.\n     */\n    css(propertyName: string, value: string[]): JQuery;\n    /**\n     * Set one or more CSS properties for the set of matched elements.\n     *\n     * @param propertyName - A CSS property name.\n     * @param value - A value to set for the property.\n     */\n    css(propertyName: string, value: number[]): JQuery;\n    /**\n     * Set one or more CSS properties for the set of matched elements.\n     *\n     * @param propertyName - A CSS property name.\n     * @param value - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    css(propertyName: string, value: (index: number, value: string) => string): JQuery;\n    /**\n     * Set one or more CSS properties for the set of matched elements.\n     *\n     * @param propertyName - A CSS property name.\n     * @param value - A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.\n     */\n    css(propertyName: string, value: (index: number, value: number) => number): JQuery;\n    /**\n     * Set one or more CSS properties for the set of matched elements.\n     *\n     * @param properties - An object of property-value pairs to set.\n     */\n    css(properties: Object): JQuery;\n\n    /**\n     * Get the current computed height for the first element in the set of matched elements.\n     */\n    height(): number;\n    /**\n     * Set the CSS height of every matched element.\n     *\n     * @param value - An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).\n     */\n    height(value: number): JQuery;\n    /**\n     * Set the CSS height of every matched element.\n     *\n     * @param value - An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).\n     */\n    height(value: string): JQuery;\n    /**\n     * Set the CSS height of every matched element.\n     *\n     * @param func - A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.\n     */\n    height(func: (index: number, height: number) => number): JQuery;\n    /**\n     * Set the CSS height of every matched element.\n     *\n     * @param func - A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.\n     */\n    height(func: (index: number, height: string) => string): JQuery;\n    /**\n     * Set the CSS height of every matched element.\n     *\n     * @param func - A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.\n     */\n    height(func: (index: number, height: string) => number): JQuery;\n    /**\n     * Set the CSS height of every matched element.\n     *\n     * @param func - A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.\n     */\n    height(func: (index: number, height: number) => string): JQuery;\n\n    /**\n     * Get the current computed height for the first element in the set of matched elements, including padding but not border.\n     */\n    innerHeight(): number;\n\n    /**\n     * Sets the inner height on elements in the set of matched elements, including padding but not border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    innerHeight(height: number): JQuery;\n\n    /**\n     * Sets the inner height on elements in the set of matched elements, including padding but not border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    innerHeight(height: string): JQuery;\n\n    /**\n     * Get the current computed width for the first element in the set of matched elements, including padding but not border.\n     */\n    innerWidth(): number;\n\n    /**\n     * Sets the inner width on elements in the set of matched elements, including padding but not border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    innerWidth(width: number): JQuery;\n\n    /**\n     * Sets the inner width on elements in the set of matched elements, including padding but not border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    innerWidth(width: string): JQuery;\n\n    /**\n     * Get the current coordinates of the first element in the set of matched elements, relative to the document.\n     */\n    offset(): JQueryCoordinates;\n    /**\n     * An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.\n     *\n     * @param coordinates - An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.\n     */\n    offset(coordinates: JQueryCoordinates): JQuery;\n    /**\n     * An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.\n     *\n     * @param func - A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties.\n     */\n    offset(func: (index: number, coords: JQueryCoordinates) => JQueryCoordinates): JQuery;\n\n    /**\n     * Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without \"px\") representation of the value or null if called on an empty set of elements.\n     *\n     * @param includeMargin - A Boolean indicating whether to include the element's margin in the calculation.\n     */\n    outerHeight(includeMargin?: boolean): number;\n\n    /**\n     * Sets the outer height on elements in the set of matched elements, including padding and border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    outerHeight(height: number): JQuery;\n\n    /**\n     * Sets the outer height on elements in the set of matched elements, including padding and border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    outerHeight(height: string): JQuery;\n\n    /**\n     * Get the current computed width for the first element in the set of matched elements, including padding and border.\n     *\n     * @param includeMargin - A Boolean indicating whether to include the element's margin in the calculation.\n     */\n    outerWidth(includeMargin?: boolean): number;\n\n    /**\n     * Sets the outer width on elements in the set of matched elements, including padding and border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    outerWidth(width: number): JQuery;\n\n    /**\n     * Sets the outer width on elements in the set of matched elements, including padding and border.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    outerWidth(width: string): JQuery;\n\n    /**\n     * Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.\n     */\n    position(): JQueryCoordinates;\n\n    /**\n     * Get the current horizontal position of the scroll bar for the first element in the set of matched elements or set the horizontal position of the scroll bar for every matched element.\n     */\n    scrollLeft(): number;\n    /**\n     * Set the current horizontal position of the scroll bar for each of the set of matched elements.\n     *\n     * @param value - An integer indicating the new position to set the scroll bar to.\n     */\n    scrollLeft(value: number): JQuery;\n\n    /**\n     * Get the current vertical position of the scroll bar for the first element in the set of matched elements or set the vertical position of the scroll bar for every matched element.\n     */\n    scrollTop(): number;\n    /**\n     * Set the current vertical position of the scroll bar for each of the set of matched elements.\n     *\n     * @param value - An integer indicating the new position to set the scroll bar to.\n     */\n    scrollTop(value: number): JQuery;\n\n    /**\n     * Get the current computed width for the first element in the set of matched elements.\n     */\n    width(): number;\n    /**\n     * Set the CSS width of each element in the set of matched elements.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    width(value: number): JQuery;\n    /**\n     * Set the CSS width of each element in the set of matched elements.\n     *\n     * @param value - An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).\n     */\n    width(value: string): JQuery;\n    /**\n     * Set the CSS width of each element in the set of matched elements.\n     *\n     * @param func - A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.\n     */\n    width(func: (index: number, width: number) => number): JQuery;\n    /**\n     * Set the CSS width of each element in the set of matched elements.\n     *\n     * @param func - A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.\n     */\n    width(func: (index: number, width: string) => string): JQuery;\n    /**\n     * Set the CSS width of each element in the set of matched elements.\n     *\n     * @param func - A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.\n     */\n    width(func: (index: number, width: string) => number): JQuery;\n    /**\n     * Set the CSS width of each element in the set of matched elements.\n     *\n     * @param func - A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.\n     */\n    width(func: (index: number, width: number) => string): JQuery;\n\n    /**\n     * Remove from the queue all items that have not yet been run.\n     *\n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     */\n    clearQueue(queueName?: string): JQuery;\n\n    /**\n     * Store arbitrary data associated with the matched elements.\n     *\n     * @param key - A string naming the piece of data to set.\n     * @param value - The new data value; it can be any Javascript type including Array or Object.\n     */\n    data(key: string, value: any): JQuery;\n    /**\n     * Store arbitrary data associated with the matched elements.\n     *\n     * @param obj - An object of key-value pairs of data to update.\n     */\n    data(obj: { [key: string]: any; }): JQuery;\n    /**\n     * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute.\n     *\n     * @param key - Name of the data stored.\n     */\n    data(key: string): any;\n    /**\n     * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute.\n     */\n    data(): any;\n\n    /**\n     * Execute the next function on the queue for the matched elements.\n     *\n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     */\n    dequeue(queueName?: string): JQuery;\n\n    /**\n     * Remove a previously-stored piece of data.\n     *\n     * @param name - A string naming the piece of data to delete or space-separated string naming the pieces of data to delete.\n     */\n    removeData(name: string): JQuery;\n    /**\n     * Remove a previously-stored piece of data.\n     *\n     * @param list - An array of strings naming the pieces of data to delete.\n     */\n    removeData(list: string[]): JQuery;\n\n    /**\n     * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.\n     *\n     * @param type - The type of queue that needs to be observed. (default: fx)\n     * @param target - Object onto which the promise methods have to be attached\n     */\n    promise(type?: string, target?: Object): JQueryPromise<any>;\n\n    /**\n     * Perform a custom animation of a set of CSS properties.\n     *\n     * @param properties - An object of CSS properties and values that the animation will move toward.\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    animate(properties: Object, duration?: string, complete?: Function): JQuery;\n    /**\n     * Perform a custom animation of a set of CSS properties.\n     *\n     * @param properties - An object of CSS properties and values that the animation will move toward.\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    animate(properties: Object, duration?: number, complete?: Function): JQuery;\n    /**\n     * Perform a custom animation of a set of CSS properties.\n     *\n     * @param properties - An object of CSS properties and values that the animation will move toward.\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition. (default: swing)\n     * @param complete - A function to call once the animation is complete.\n     */\n    animate(properties: Object, duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Perform a custom animation of a set of CSS properties.\n     *\n     * @param properties - An object of CSS properties and values that the animation will move toward.\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition. (default: swing)\n     * @param complete - A function to call once the animation is complete.\n     */\n    animate(properties: Object, duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Perform a custom animation of a set of CSS properties.\n     *\n     * @param properties - An object of CSS properties and values that the animation will move toward.\n     * @param options - A map of additional options to pass to the method.\n     */\n    animate(properties: Object, options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Set a timer to delay execution of subsequent items in the queue.\n     *\n     * @param duration - An integer indicating the number of milliseconds to delay execution of the next item in the queue.\n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     */\n    delay(duration: number, queueName?: string): JQuery;\n\n    /**\n     * Display the matched elements by fading them to opaque.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeIn(duration?: number, complete?: Function): JQuery;\n    /**\n     * Display the matched elements by fading them to opaque.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeIn(duration?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements by fading them to opaque.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeIn(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements by fading them to opaque.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeIn(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements by fading them to opaque.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    fadeIn(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Hide the matched elements by fading them to transparent.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeOut(duration?: number, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements by fading them to transparent.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeOut(duration?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements by fading them to transparent.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeOut(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements by fading them to transparent.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeOut(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements by fading them to transparent.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    fadeOut(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Adjust the opacity of the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param opacity - A number between 0 and 1 denoting the target opacity.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeTo(duration: string, opacity: number, complete?: Function): JQuery;\n    /**\n     * Adjust the opacity of the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param opacity - A number between 0 and 1 denoting the target opacity.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeTo(duration: number, opacity: number, complete?: Function): JQuery;\n    /**\n     * Adjust the opacity of the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param opacity - A number between 0 and 1 denoting the target opacity.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeTo(duration: string, opacity: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Adjust the opacity of the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param opacity - A number between 0 and 1 denoting the target opacity.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeTo(duration: number, opacity: number, easing?: string, complete?: Function): JQuery;\n\n    /**\n     * Display or hide the matched elements by animating their opacity.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeToggle(duration?: number, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements by animating their opacity.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeToggle(duration?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements by animating their opacity.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeToggle(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements by animating their opacity.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    fadeToggle(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements by animating their opacity.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    fadeToggle(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements.\n     *\n     * @param queue - The name of the queue in which to stop animations.\n     */\n    finish(queue?: string): JQuery;\n\n    /**\n     * Hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    hide(duration?: number, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    hide(duration?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    hide(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    hide(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    hide(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Display the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    show(duration?: number, complete?: Function): JQuery;\n    /**\n     * Display the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    show(duration?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    show(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    show(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    show(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Display the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideDown(duration?: number, complete?: Function): JQuery;\n    /**\n     * Display the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideDown(duration?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideDown(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideDown(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display the matched elements with a sliding motion.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    slideDown(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Display or hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideToggle(duration?: number, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideToggle(duration?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideToggle(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideToggle(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements with a sliding motion.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    slideToggle(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideUp(duration?: number, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideUp(duration?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideUp(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements with a sliding motion.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    slideUp(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Hide the matched elements with a sliding motion.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    slideUp(options: JQueryAnimationOptions): JQuery;\n\n    /**\n     * Stop the currently-running animation on the matched elements.\n     *\n     * @param clearQueue - A Boolean indicating whether to remove queued animation as well. Defaults to false.\n     * @param jumpToEnd - A Boolean indicating whether to complete the current animation immediately. Defaults to false.\n     */\n    stop(clearQueue?: boolean, jumpToEnd?: boolean): JQuery;\n    /**\n     * Stop the currently-running animation on the matched elements.\n     *\n     * @param queue - The name of the queue in which to stop animations.\n     * @param clearQueue - A Boolean indicating whether to remove queued animation as well. Defaults to false.\n     * @param jumpToEnd - A Boolean indicating whether to complete the current animation immediately. Defaults to false.\n     */\n    stop(queue?: string, clearQueue?: boolean, jumpToEnd?: boolean): JQuery;\n\n    /**\n     * Display or hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    toggle(duration?: number, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param complete - A function to call once the animation is complete.\n     */\n    toggle(duration?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    toggle(duration?: number, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements.\n     *\n     * @param duration - A string or number determining how long the animation will run.\n     * @param easing - A string indicating which easing function to use for the transition.\n     * @param complete - A function to call once the animation is complete.\n     */\n    toggle(duration?: string, easing?: string, complete?: Function): JQuery;\n    /**\n     * Display or hide the matched elements.\n     *\n     * @param options - A map of additional options to pass to the method.\n     */\n    toggle(options: JQueryAnimationOptions): JQuery;\n    /**\n     * Display or hide the matched elements.\n     *\n     * @param showOrHide - A Boolean indicating whether to show or hide the elements.\n     */\n    toggle(showOrHide: boolean): JQuery;\n\n    /**\n     * Attach a handler to an event for the elements.\n     * \n     * @param eventType - A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    bind(eventType: string, eventData: any, handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Attach a handler to an event for the elements.\n     * \n     * @param eventType - A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    bind(eventType: string, handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Attach a handler to an event for the elements.\n     * \n     * @param eventType - A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param preventBubble - Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.\n     */\n    bind(eventType: string, eventData: any, preventBubble: boolean): JQuery;\n    /**\n     * Attach a handler to an event for the elements.\n     * \n     * @param eventType - A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.\n     * @param preventBubble - Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.\n     */\n    bind(eventType: string, preventBubble: boolean): JQuery;\n    /**\n     * Attach a handler to an event for the elements.\n     * \n     * @param events - An object containing one or more DOM event types and functions to execute for them.\n     */\n    bind(events: any): JQuery;\n\n    /**\n     * Trigger the \"blur\" event on an element\n     */\n    blur(): JQuery;\n    /**\n     * Bind an event handler to the \"blur\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    blur(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"blur\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    blur(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"change\" event on an element.\n     */\n    change(): JQuery;\n    /**\n     * Bind an event handler to the \"change\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    change(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"change\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    change(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"click\" event on an element.\n     */\n    click(): JQuery;\n    /**\n     * Bind an event handler to the \"click\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     */\n    click(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"click\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    click(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"dblclick\" event on an element.\n     */\n    dblclick(): JQuery;\n    /**\n     * Bind an event handler to the \"dblclick\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    dblclick(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"dblclick\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    dblclick(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    delegate(selector: any, eventType: string, handler: (eventObject: JQueryEventObject) => any): JQuery;\n    delegate(selector: any, eventType: string, eventData: any, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"focus\" event on an element.\n     */\n    focus(): JQuery;\n    /**\n     * Bind an event handler to the \"focus\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    focus(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"focus\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    focus(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Bind an event handler to the \"focusin\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    focusin(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"focusin\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    focusin(eventData: Object, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Bind an event handler to the \"focusout\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    focusout(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"focusout\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    focusout(eventData: Object, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements.\n     *\n     * @param handlerIn - A function to execute when the mouse pointer enters the element.\n     * @param handlerOut - A function to execute when the mouse pointer leaves the element.\n     */\n    hover(handlerIn: (eventObject: JQueryEventObject) => any, handlerOut: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind a single handler to the matched elements, to be executed when the mouse pointer enters or leaves the elements.\n     *\n     * @param handlerInOut - A function to execute when the mouse pointer enters or leaves the element.\n     */\n    hover(handlerInOut: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"keydown\" event on an element.\n     */\n    keydown(): JQuery;\n    /**\n     * Bind an event handler to the \"keydown\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    keydown(handler: (eventObject: JQueryKeyEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"keydown\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    keydown(eventData?: any, handler?: (eventObject: JQueryKeyEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"keypress\" event on an element.\n     */\n    keypress(): JQuery;\n    /**\n     * Bind an event handler to the \"keypress\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    keypress(handler: (eventObject: JQueryKeyEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"keypress\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    keypress(eventData?: any, handler?: (eventObject: JQueryKeyEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"keyup\" event on an element.\n     */\n    keyup(): JQuery;\n    /**\n     * Bind an event handler to the \"keyup\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    keyup(handler: (eventObject: JQueryKeyEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"keyup\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    keyup(eventData?: any, handler?: (eventObject: JQueryKeyEventObject) => any): JQuery;\n\n    /**\n     * Bind an event handler to the \"load\" JavaScript event.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    load(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"load\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    load(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"mousedown\" event on an element.\n     */\n    mousedown(): JQuery;\n    /**\n     * Bind an event handler to the \"mousedown\" JavaScript event.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mousedown(handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"mousedown\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mousedown(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"mouseenter\" event on an element.\n     */\n    mouseenter(): JQuery;\n    /**\n     * Bind an event handler to be fired when the mouse enters an element.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseenter(handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to be fired when the mouse enters an element.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseenter(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"mouseleave\" event on an element.\n     */\n    mouseleave(): JQuery;\n    /**\n     * Bind an event handler to be fired when the mouse leaves an element.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseleave(handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to be fired when the mouse leaves an element.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseleave(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"mousemove\" event on an element.\n     */\n    mousemove(): JQuery;\n    /**\n     * Bind an event handler to the \"mousemove\" JavaScript event.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mousemove(handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"mousemove\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mousemove(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"mouseout\" event on an element.\n     */\n    mouseout(): JQuery;\n    /**\n     * Bind an event handler to the \"mouseout\" JavaScript event.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseout(handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"mouseout\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseout(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"mouseover\" event on an element.\n     */\n    mouseover(): JQuery;\n    /**\n     * Bind an event handler to the \"mouseover\" JavaScript event.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseover(handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"mouseover\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseover(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"mouseup\" event on an element.\n     */\n    mouseup(): JQuery;\n    /**\n     * Bind an event handler to the \"mouseup\" JavaScript event.\n     *\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseup(handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"mouseup\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    mouseup(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery;\n\n    /**\n     * Remove an event handler.\n     */\n    off(): JQuery;\n    /**\n     * Remove an event handler.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".\n     * @param selector - A selector which should match the one originally passed to .on() when attaching event handlers.\n     * @param handler - A handler function previously attached for the event(s), or the special value false.\n     */\n    off(events: string, selector?: string, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Remove an event handler.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".\n     * @param handler - A handler function previously attached for the event(s), or the special value false.\n     */\n    off(events: string, handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Remove an event handler.\n     *\n     * @param events - An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s).\n     * @param selector - A selector which should match the one originally passed to .on() when attaching event handlers.\n     */\n    off(events: { [key: string]: any; }, selector?: string): JQuery;\n\n    /**\n     * Attach an event handler function for one or more events to the selected elements.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".\n     * @param handler - A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false. Rest parameter args is for optional parameters passed to jQuery.trigger(). Note that the actual parameters on the event handler function must be marked as optional (? syntax).\n     */\n    on(events: string, handler: (eventObject: JQueryEventObject, ...args: any[]) => any): JQuery;\n    /**\n     * Attach an event handler function for one or more events to the selected elements.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".\n     * @param data - Data to be passed to the handler in event.data when an event is triggered.\n     * @param handler - A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.\n    */\n    on(events: string, data: any, handler: (eventObject: JQueryEventObject, ...args: any[]) => any): JQuery;\n    /**\n     * Attach an event handler function for one or more events to the selected elements.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".\n     * @param selector - A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.\n     * @param handler - A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.\n     */\n    on(events: string, selector: string, handler: (eventObject: JQueryEventObject, ...eventData: any[]) => any): JQuery;\n    /**\n     * Attach an event handler function for one or more events to the selected elements.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".\n     * @param selector - A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.\n     * @param data - Data to be passed to the handler in event.data when an event is triggered.\n     * @param handler - A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.\n     */\n    on(events: string, selector: string, data: any, handler: (eventObject: JQueryEventObject, ...eventData: any[]) => any): JQuery;\n    /**\n     * Attach an event handler function for one or more events to the selected elements.\n     *\n     * @param events - An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).\n     * @param selector - A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.\n     * @param data - Data to be passed to the handler in event.data when an event occurs.\n     */\n    on(events: { [key: string]: any; }, selector?: string, data?: any): JQuery;\n    /**\n     * Attach an event handler function for one or more events to the selected elements.\n     *\n     * @param events - An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).\n     * @param data - Data to be passed to the handler in event.data when an event occurs.\n     */\n    on(events: { [key: string]: any; }, data?: any): JQuery;\n\n    /**\n     * Attach a handler to an event for the elements. The handler is executed at most once per element per event type.\n     *\n     * @param events - A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.\n     * @param handler - A function to execute at the time the event is triggered.\n     */\n    one(events: string, handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Attach a handler to an event for the elements. The handler is executed at most once per element per event type.\n     *\n     * @param events - A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.\n     * @param data - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute at the time the event is triggered.\n     */\n    one(events: string, data: Object, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Attach a handler to an event for the elements. The handler is executed at most once per element per event type.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".\n     * @param selector - A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.\n     * @param handler - A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.\n     */\n    one(events: string, selector: string, handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Attach a handler to an event for the elements. The handler is executed at most once per element per event type.\n     *\n     * @param events - One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".\n     * @param selector - A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.\n     * @param data - Data to be passed to the handler in event.data when an event is triggered.\n     * @param handler - A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.\n     */\n    one(events: string, selector: string, data: any, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Attach a handler to an event for the elements. The handler is executed at most once per element per event type.\n     *\n     * @param events - An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).\n     * @param selector - A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.\n     * @param data - Data to be passed to the handler in event.data when an event occurs.\n     */\n    one(events: { [key: string]: any; }, selector?: string, data?: any): JQuery;\n\n    /**\n     * Attach a handler to an event for the elements. The handler is executed at most once per element per event type.\n     *\n     * @param events - An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).\n     * @param data - Data to be passed to the handler in event.data when an event occurs.\n     */\n    one(events: { [key: string]: any; }, data?: any): JQuery;\n\n\n    /**\n     * Specify a function to execute when the DOM is fully loaded.\n     *\n     * @param handler - A function to execute after the DOM is ready.\n     */\n    ready(handler: Function): JQuery;\n\n    /**\n     * Trigger the \"resize\" event on an element.\n     */\n    resize(): JQuery;\n    /**\n     * Bind an event handler to the \"resize\" JavaScript event.\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    resize(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"resize\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    resize(eventData: Object, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"scroll\" event on an element.\n     */\n    scroll(): JQuery;\n    /**\n     * Bind an event handler to the \"scroll\" JavaScript event.\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    scroll(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"scroll\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    scroll(eventData: Object, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"select\" event on an element.\n     */\n    select(): JQuery;\n    /**\n     * Bind an event handler to the \"select\" JavaScript event.\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    select(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"select\" JavaScript event.\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    select(eventData: Object, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Trigger the \"submit\" event on an element.\n     */\n    submit(): JQuery;\n    /**\n     * Bind an event handler to the \"submit\" JavaScript event\n     *\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    submit(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"submit\" JavaScript event\n     *\n     * @param eventData - An object containing data that will be passed to the event handler.\n     * @param handler - A function to execute each time the event is triggered.\n     */\n    submit(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Execute all handlers and behaviors attached to the matched elements for the given event type.\n     * \n     * @param eventType - A string containing a JavaScript event type, such as click or submit.\n     * @param extraParameters - Additional parameters to pass along to the event handler.\n     */\n    trigger(eventType: string, extraParameters?: any[]): JQuery;\n    /**\n     * Execute all handlers and behaviors attached to the matched elements for the given event type.\n     * \n     * @param eventType - A string containing a JavaScript event type, such as click or submit.\n     * @param extraParameters - Additional parameters to pass along to the event handler.\n     */\n    trigger(eventType: string, extraParameters?: Object): JQuery;\n    /**\n     * Execute all handlers and behaviors attached to the matched elements for the given event type.\n     * \n     * @param event - A jQuery.Event object.\n     * @param extraParameters - Additional parameters to pass along to the event handler.\n     */\n    trigger(event: JQueryEventObject, extraParameters?: any[]): JQuery;\n    /**\n     * Execute all handlers and behaviors attached to the matched elements for the given event type.\n     * \n     * @param event - A jQuery.Event object.\n     * @param extraParameters - Additional parameters to pass along to the event handler.\n     */\n    trigger(event: JQueryEventObject, extraParameters?: Object): JQuery;\n\n    /**\n     * Execute all handlers attached to an element for an event.\n     * \n     * @param eventType - A string containing a JavaScript event type, such as click or submit.\n     * @param extraParameters - An array of additional parameters to pass along to the event handler.\n     */\n    triggerHandler(eventType: string, ...extraParameters: any[]): Object;\n\n    /**\n     * Remove a previously-attached event handler from the elements.\n     * \n     * @param eventType - A string containing a JavaScript event type, such as click or submit.\n     * @param handler - The function that is to be no longer executed.\n     */\n    unbind(eventType?: string, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Remove a previously-attached event handler from the elements.\n     * \n     * @param eventType - A string containing a JavaScript event type, such as click or submit.\n     * @param fls - Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ).\n     */\n    unbind(eventType: string, fls: boolean): JQuery;\n    /**\n     * Remove a previously-attached event handler from the elements.\n     * \n     * @param evt - A JavaScript event object as passed to an event handler.\n     */\n    unbind(evt: any): JQuery;\n\n    /**\n     * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.\n     */\n    undelegate(): JQuery;\n    /**\n     * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.\n     * \n     * @param selector - A selector which will be used to filter the event results.\n     * @param eventType - A string containing a JavaScript event type, such as \"click\" or \"keydown\"\n     * @param handler - A function to execute at the time the event is triggered.\n     */\n    undelegate(selector: string, eventType: string, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.\n     * \n     * @param selector - A selector which will be used to filter the event results.\n     * @param events - An object of one or more event types and previously bound functions to unbind from them.\n     */\n    undelegate(selector: string, events: Object): JQuery;\n    /**\n     * Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.\n     * \n     * @param namespace - A string containing a namespace to unbind all events from.\n     */\n    undelegate(namespace: string): JQuery;\n\n    /**\n     * Bind an event handler to the \"unload\" JavaScript event. (DEPRECATED from v1.8)\n     * \n     * @param handler - A function to execute when the event is triggered.\n     */\n    unload(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"unload\" JavaScript event. (DEPRECATED from v1.8)\n     * \n     * @param eventData - A plain object of data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    unload(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document. (DEPRECATED from v1.10)\n     */\n    context: Element;\n\n    jquery: string;\n\n    /**\n     * Bind an event handler to the \"error\" JavaScript event. (DEPRECATED from v1.8)\n     * \n     * @param handler - A function to execute when the event is triggered.\n     */\n    error(handler: (eventObject: JQueryEventObject) => any): JQuery;\n    /**\n     * Bind an event handler to the \"error\" JavaScript event. (DEPRECATED from v1.8)\n     * \n     * @param eventData - A plain object of data that will be passed to the event handler.\n     * @param handler - A function to execute when the event is triggered.\n     */\n    error(eventData: any, handler: (eventObject: JQueryEventObject) => any): JQuery;\n\n    /**\n     * Add a collection of DOM elements onto the jQuery stack.\n     * \n     * @param elements - An array of elements to push onto the stack and make into a new jQuery object.\n     */\n    pushStack(elements: any[]): JQuery;\n    /**\n     * Add a collection of DOM elements onto the jQuery stack.\n     * \n     * @param elements - An array of elements to push onto the stack and make into a new jQuery object.\n     * @param name - The name of a jQuery method that generated the array of elements.\n     * @param arguments - The arguments that were passed in to the jQuery method (for serialization).\n     */\n    pushStack(elements: any[], name: string, arguments: any[]): JQuery;\n\n    /**\n     * Insert content, specified by the parameter, after each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert after each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.\n     */\n    after(content1: JQuery, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, after each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert after each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.\n     */\n    after(content1: any[], ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, after each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert after each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.\n     */\n    after(content1: Element, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, after each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert after each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.\n     */\n    after(content1: Text, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, after each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert after each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.\n     */\n    after(content1: string, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, after each element in the set of matched elements.\n     * \n     * param func A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.\n     */\n    after(func: (index: number) => any): JQuery;\n\n    /**\n     * Insert content, specified by the parameter, to the end of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.\n     */\n    append(content1: JQuery, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the end of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.\n     */\n    append(content1: any[], ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the end of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.\n     */\n    append(content1: Element, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the end of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.\n     */\n    append(content1: Text, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the end of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.\n     */\n    append(content1: string, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the end of each element in the set of matched elements.\n     * \n     * param func A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.\n     */\n    append(func: (index: number, html: string) => any): JQuery;\n\n    /**\n     * Insert every element in the set of matched elements to the end of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.\n     */\n    appendTo(target: JQuery): JQuery;\n    /**\n     * Insert every element in the set of matched elements to the end of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.\n     */\n    appendTo(target: any[]): JQuery;\n    /**\n     * Insert every element in the set of matched elements to the end of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.\n     */\n    appendTo(target: Element): JQuery;\n    /**\n     * Insert every element in the set of matched elements to the end of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.\n     */\n    appendTo(target: string): JQuery;\n\n    /**\n     * Insert content, specified by the parameter, before each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert before each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.\n     */\n    before(content1: JQuery, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, before each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert before each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.\n     */\n    before(content1: any[], ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, before each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert before each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.\n     */\n    before(content1: Element, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, before each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert before each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.\n     */\n    before(content1: Text, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, before each element in the set of matched elements.\n     * \n     * param content1 HTML string, DOM element, array of elements, or jQuery object to insert before each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.\n     */\n    before(content1: string, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, before each element in the set of matched elements.\n     * \n     * param func A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.\n     */\n    before(func: (index: number) => any): JQuery;\n\n    /**\n     * Create a deep copy of the set of matched elements.\n     * \n     * param withDataAndEvents A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false.\n     * param deepWithDataAndEvents A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false).\n     */\n    clone(withDataAndEvents?: boolean, deepWithDataAndEvents?: boolean): JQuery;\n\n    /**\n     * Remove the set of matched elements from the DOM.\n     * \n     * param selector A selector expression that filters the set of matched elements to be removed.\n     */\n    detach(selector?: string): JQuery;\n\n    /**\n     * Remove all child nodes of the set of matched elements from the DOM.\n     */\n    empty(): JQuery;\n\n    /**\n     * Insert every element in the set of matched elements after the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.\n     */\n    insertAfter(target: JQuery): JQuery;\n    /**\n     * Insert every element in the set of matched elements after the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.\n     */\n    insertAfter(target: any[]): JQuery;\n    /**\n     * Insert every element in the set of matched elements after the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.\n     */\n    insertAfter(target: Element): JQuery;\n    /**\n     * Insert every element in the set of matched elements after the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.\n     */\n    insertAfter(target: Text): JQuery;\n    /**\n     * Insert every element in the set of matched elements after the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.\n     */\n    insertAfter(target: string): JQuery;\n\n    /**\n     * Insert every element in the set of matched elements before the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.\n     */\n    insertBefore(target: JQuery): JQuery;\n    /**\n     * Insert every element in the set of matched elements before the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.\n     */\n    insertBefore(target: any[]): JQuery;\n    /**\n     * Insert every element in the set of matched elements before the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.\n     */\n    insertBefore(target: Element): JQuery;\n    /**\n     * Insert every element in the set of matched elements before the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.\n     */\n    insertBefore(target: Text): JQuery;\n    /**\n     * Insert every element in the set of matched elements before the target.\n     * \n     * param target A selector, element, array of elements, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.\n     */\n    insertBefore(target: string): JQuery;\n\n    /**\n     * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.\n     */\n    prepend(content1: JQuery, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.\n     */\n    prepend(content1: any[], ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.\n     */\n    prepend(content1: Element, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.\n     */\n    prepend(content1: Text, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.\n     * \n     * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.\n     * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.\n     */\n    prepend(content1: string, ...content2: any[]): JQuery;\n    /**\n     * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.\n     * \n     * param func A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.\n     */\n    prepend(func: (index: number, html: string) => any): JQuery;\n\n    /**\n     * Insert every element in the set of matched elements to the beginning of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.\n     */\n    prependTo(target: JQuery): JQuery;\n    /**\n     * Insert every element in the set of matched elements to the beginning of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.\n     */\n    prependTo(target: any[]): JQuery;\n    /**\n     * Insert every element in the set of matched elements to the beginning of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.\n     */\n    prependTo(target: Element): JQuery;\n    /**\n     * Insert every element in the set of matched elements to the beginning of the target.\n     * \n     * @param target - A selector, element, HTML string, array of elements, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.\n     */\n    prependTo(target: string): JQuery;\n\n    /**\n     * Remove the set of matched elements from the DOM.\n     * \n     * @param selector - A selector expression that filters the set of matched elements to be removed.\n     */\n    remove(selector?: string): JQuery;\n\n    /**\n     * Replace each target element with the set of matched elements.\n     * \n     * @param target - A selector string, jQuery object, DOM element, or array of elements indicating which element(s) to replace.\n     */\n    replaceAll(target: JQuery): JQuery;\n    /**\n     * Replace each target element with the set of matched elements.\n     * \n     * @param target - A selector string, jQuery object, DOM element, or array of elements indicating which element(s) to replace.\n     */\n    replaceAll(target: any[]): JQuery;\n    /**\n     * Replace each target element with the set of matched elements.\n     * \n     * @param target - A selector string, jQuery object, DOM element, or array of elements indicating which element(s) to replace.\n     */\n    replaceAll(target: Element): JQuery;\n    /**\n     * Replace each target element with the set of matched elements.\n     * \n     * @param target - A selector string, jQuery object, DOM element, or array of elements indicating which element(s) to replace.\n     */\n    replaceAll(target: string): JQuery;\n\n    /**\n     * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.\n     * \n     * param newContent The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object.\n     */\n    replaceWith(newContent: JQuery): JQuery;\n    /**\n     * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.\n     * \n     * param newContent The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object.\n     */\n    replaceWith(newContent: any[]): JQuery;\n    /**\n     * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.\n     * \n     * param newContent The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object.\n     */\n    replaceWith(newContent: Element): JQuery;\n    /**\n     * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.\n     * \n     * param newContent The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object.\n     */\n    replaceWith(newContent: Text): JQuery;\n    /**\n     * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.\n     * \n     * param newContent The content to insert. May be an HTML string, DOM element, array of DOM elements, or jQuery object.\n     */\n    replaceWith(newContent: string): JQuery;\n    /**\n     * Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.\n     * \n     * param func A function that returns content with which to replace the set of matched elements.\n     */\n    replaceWith(func: () => any): JQuery;\n\n    /**\n     * Get the combined text contents of each element in the set of matched elements, including their descendants.\n     */\n    text(): string;\n    /**\n     * Set the content of each element in the set of matched elements to the specified text.\n     * \n     * @param text - The text to set as the content of each matched element.\n     */\n    text(text: string): JQuery;\n    /**\n     * Set the content of each element in the set of matched elements to the specified text.\n     * \n     * @param text - The text to set as the content of each matched element.\n     */\n    text(text: number): JQuery;\n    /**\n     * Set the content of each element in the set of matched elements to the specified text.\n     * \n     * @param text - The text to set as the content of each matched element.\n     */\n    text(text: boolean): JQuery;\n    /**\n     * Set the content of each element in the set of matched elements to the specified text.\n     * \n     * @param func - A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments.\n     */\n    text(func: (index: number, text: string) => string): JQuery;\n\n    /**\n     * Retrieve all the elements contained in the jQuery set, as an array.\n     */\n    toArray(): any[];\n\n    /**\n     * Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.\n     */\n    unwrap(): JQuery;\n\n    /**\n     * Wrap an HTML structure around each element in the set of matched elements.\n     * \n     * @param wrappingElement - A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.\n     */\n    wrap(wrappingElement: JQuery): JQuery;\n    /**\n     * Wrap an HTML structure around each element in the set of matched elements.\n     * \n     * @param wrappingElement - A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.\n     */\n    wrap(wrappingElement: Element): JQuery;\n    /**\n     * Wrap an HTML structure around each element in the set of matched elements.\n     * \n     * @param wrappingElement - A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.\n     */\n    wrap(wrappingElement: string): JQuery;\n    /**\n     * Wrap an HTML structure around each element in the set of matched elements.\n     * \n     * @param func - A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.\n     */\n    wrap(func: (index: number) => any): JQuery;\n\n    /**\n     * Wrap an HTML structure around all elements in the set of matched elements.\n     * \n     * @param wrappingElement - A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.\n     */\n    wrapAll(wrappingElement: JQuery): JQuery;\n    /**\n     * Wrap an HTML structure around all elements in the set of matched elements.\n     * \n     * @param wrappingElement - A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.\n     */\n    wrapAll(wrappingElement: Element): JQuery;\n    /**\n     * Wrap an HTML structure around all elements in the set of matched elements.\n     * \n     * @param wrappingElement - A selector, element, HTML string, or jQuery object specifying the structure to wrap around the matched elements.\n     */\n    wrapAll(wrappingElement: string): JQuery;\n\n    /**\n     * Wrap an HTML structure around the content of each element in the set of matched elements.\n     * \n     * @param wrappingElement - An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.\n     */\n    wrapInner(wrappingElement: JQuery): JQuery;\n    /**\n     * Wrap an HTML structure around the content of each element in the set of matched elements.\n     * \n     * @param wrappingElement - An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.\n     */\n    wrapInner(wrappingElement: Element): JQuery;\n    /**\n     * Wrap an HTML structure around the content of each element in the set of matched elements.\n     * \n     * @param wrappingElement - An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.\n     */\n    wrapInner(wrappingElement: string): JQuery;\n    /**\n     * Wrap an HTML structure around the content of each element in the set of matched elements.\n     * \n     * @param func - A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.\n     */\n    wrapInner(func: (index: number) => any): JQuery;\n\n    /**\n     * Iterate over a jQuery object, executing a function for each matched element.\n     * \n     * @param func - A function to execute for each matched element.\n     */\n    each(func: (index: number, elem: Element) => any): JQuery;\n\n    /**\n     * Retrieve one of the elements matched by the jQuery object.\n     * \n     * @param index - A zero-based integer indicating which element to retrieve.\n     */\n    get(index: number): HTMLElement;\n    /**\n     * Retrieve the elements matched by the jQuery object.\n     */\n    get(): any[];\n\n    /**\n     * Search for a given element from among the matched elements.\n     */\n    index(): number;\n    /**\n     * Search for a given element from among the matched elements.\n     * \n     * @param selector - A selector representing a jQuery collection in which to look for an element.\n     */\n    index(selector: string): number;\n    /**\n     * Search for a given element from among the matched elements.\n     * \n     * @param element - The DOM element or first element within the jQuery object to look for.\n     */\n    index(element: JQuery): number;\n    /**\n     * Search for a given element from among the matched elements.\n     * \n     * @param element - The DOM element or first element within the jQuery object to look for.\n     */\n    index(element: Element): number;\n\n    /**\n     * The number of elements in the jQuery object.\n     */\n    length: number;\n    /**\n     * A selector representing selector passed to jQuery(), if any, when creating the original set.\n     * version deprecated: 1.7, removed: 1.9\n     */\n    selector: string;\n    [index: string]: any;\n    [index: number]: HTMLElement;\n\n    /**\n     * Add elements to the set of matched elements.\n     * \n     * @param selector - A string representing a selector expression to find additional elements to add to the set of matched elements.\n     * @param context - The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method.\n     */\n    add(selector: string, context?: Element): JQuery;\n    /**\n     * Add elements to the set of matched elements.\n     * \n     * @param elements - One or more elements to add to the set of matched elements.\n     */\n    add(...elements: Element[]): JQuery;\n    /**\n     * Add elements to the set of matched elements.\n     * \n     * @param html - An HTML fragment to add to the set of matched elements.\n     */\n    add(html: string): JQuery;\n    /**\n     * Add elements to the set of matched elements.\n     * \n     * @param obj - An existing jQuery object to add to the set of matched elements.\n     */\n    add(obj: JQuery): JQuery;\n\n    /**\n     * Get the children of each element in the set of matched elements, optionally filtered by a selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    children(selector?: string): JQuery;\n\n    /**\n     * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    closest(selector: string): JQuery;\n    /**\n     * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     * @param context - A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.\n     */\n    closest(selector: string, context?: Element): JQuery;\n    /**\n     * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n     * \n     * @param obj - A jQuery object to match elements against.\n     */\n    closest(obj: JQuery): JQuery;\n    /**\n     * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n     * \n     * @param element - An element to match elements against.\n     */\n    closest(element: Element): JQuery;\n\n    /**\n     * Get an array of all the elements and selectors matched against the current element up through the DOM tree.\n     * \n     * @param selectors - An array or string containing a selector expression to match elements against (can also be a jQuery object).\n     * @param context - A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.\n     */\n    closest(selectors: any, context?: Element): any[];\n\n    /**\n     * Get the children of each element in the set of matched elements, including text and comment nodes.\n     */\n    contents(): JQuery;\n\n    /**\n     * End the most recent filtering operation in the current chain and return the set of matched elements to its previous state.\n     */\n    end(): JQuery;\n\n    /**\n     * Reduce the set of matched elements to the one at the specified index.\n     * \n     * @param index - An integer indicating the 0-based position of the element. OR An integer indicating the position of the element, counting backwards from the last element in the set.\n     *  \n     */\n    eq(index: number): JQuery;\n\n    /**\n     * Reduce the set of matched elements to those that match the selector or pass the function's test.\n     * \n     * @param selector - A string containing a selector expression to match the current set of elements against.\n     */\n    filter(selector: string): JQuery;\n    /**\n     * Reduce the set of matched elements to those that match the selector or pass the function's test.\n     * \n     * @param func - A function used as a test for each element in the set. this is the current DOM element.\n     */\n    filter(func: (index: number, element: Element) => any): JQuery;\n    /**\n     * Reduce the set of matched elements to those that match the selector or pass the function's test.\n     * \n     * @param element - An element to match the current set of elements against.\n     */\n    filter(element: Element): JQuery;\n    /**\n     * Reduce the set of matched elements to those that match the selector or pass the function's test.\n     * \n     * @param obj - An existing jQuery object to match the current set of elements against.\n     */\n    filter(obj: JQuery): JQuery;\n\n    /**\n     * Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    find(selector: string): JQuery;\n    /**\n     * Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.\n     * \n     * @param element - An element to match elements against.\n     */\n    find(element: Element): JQuery;\n    /**\n     * Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.\n     * \n     * @param obj - A jQuery object to match elements against.\n     */\n    find(obj: JQuery): JQuery;\n\n    /**\n     * Reduce the set of matched elements to the first in the set.\n     */\n    first(): JQuery;\n\n    /**\n     * Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    has(selector: string): JQuery;\n    /**\n     * Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.\n     * \n     * @param contained - A DOM element to match elements against.\n     */\n    has(contained: Element): JQuery;\n\n    /**\n     * Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    is(selector: string): boolean;\n    /**\n     * Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.\n     * \n     * @param func - A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element.\n     */\n    is(func: (index: number) => any): boolean;\n    /**\n     * Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.\n     * \n     * @param obj - An existing jQuery object to match the current set of elements against.\n     */\n    is(obj: JQuery): boolean;\n    /**\n     * Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.\n     * \n     * @param elements - One or more elements to match the current set of elements against.\n     */\n    is(elements: any): boolean;\n\n    /**\n     * Reduce the set of matched elements to the final one in the set.\n     */\n    last(): JQuery;\n\n    /**\n     * Pass each element in the current matched set through a function, producing a new jQuery object containing the return values.\n     * \n     * @param callback - A function object that will be invoked for each element in the current set.\n     */\n    map(callback: (index: number, domElement: Element) => any): JQuery;\n\n    /**\n     * Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    next(selector?: string): JQuery;\n\n    /**\n     * Get all following siblings of each element in the set of matched elements, optionally filtered by a selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    nextAll(selector?: string): JQuery;\n\n    /**\n     * Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.\n     * \n     * @param selector - A string containing a selector expression to indicate where to stop matching following sibling elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    nextUntil(selector?: string, filter?: string): JQuery;\n    /**\n     * Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.\n     * \n     * @param element - A DOM node or jQuery object indicating where to stop matching following sibling elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    nextUntil(element?: Element, filter?: string): JQuery;\n    /**\n     * Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.\n     * \n     * @param obj - A DOM node or jQuery object indicating where to stop matching following sibling elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    nextUntil(obj?: JQuery, filter?: string): JQuery;\n\n    /**\n     * Remove elements from the set of matched elements.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    not(selector: string): JQuery;\n    /**\n     * Remove elements from the set of matched elements.\n     * \n     * @param func - A function used as a test for each element in the set. this is the current DOM element.\n     */\n    not(func: (index: number) => any): JQuery;\n    /**\n     * Remove elements from the set of matched elements.\n     * \n     * @param elements - One or more DOM elements to remove from the matched set.\n     */\n    not(...elements: Element[]): JQuery;\n    /**\n     * Remove elements from the set of matched elements.\n     * \n     * @param obj - An existing jQuery object to match the current set of elements against.\n     */\n    not(obj: JQuery): JQuery;\n\n    /**\n     * Get the closest ancestor element that is positioned.\n     */\n    offsetParent(): JQuery;\n\n    /**\n     * Get the parent of each element in the current set of matched elements, optionally filtered by a selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    parent(selector?: string): JQuery;\n\n    /**\n     * Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    parents(selector?: string): JQuery;\n\n    /**\n     * Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.\n     * \n     * @param selector - A string containing a selector expression to indicate where to stop matching ancestor elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    parentsUntil(selector?: string, filter?: string): JQuery;\n    /**\n     * Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.\n     * \n     * @param element - A DOM node or jQuery object indicating where to stop matching ancestor elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    parentsUntil(element?: Element, filter?: string): JQuery;\n    /**\n     * Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.\n     * \n     * @param obj - A DOM node or jQuery object indicating where to stop matching ancestor elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    parentsUntil(obj?: JQuery, filter?: string): JQuery;\n\n    /**\n     * Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    prev(selector?: string): JQuery;\n\n    /**\n     * Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    prevAll(selector?: string): JQuery;\n\n    /**\n     * Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.\n     * \n     * @param selector - A string containing a selector expression to indicate where to stop matching preceding sibling elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    prevUntil(selector?: string, filter?: string): JQuery;\n    /**\n     * Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.\n     * \n     * @param element - A DOM node or jQuery object indicating where to stop matching preceding sibling elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    prevUntil(element?: Element, filter?: string): JQuery;\n    /**\n     * Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.\n     * \n     * @param obj - A DOM node or jQuery object indicating where to stop matching preceding sibling elements.\n     * @param filter - A string containing a selector expression to match elements against.\n     */\n    prevUntil(obj?: JQuery, filter?: string): JQuery;\n\n    /**\n     * Get the siblings of each element in the set of matched elements, optionally filtered by a selector.\n     * \n     * @param selector - A string containing a selector expression to match elements against.\n     */\n    siblings(selector?: string): JQuery;\n\n    /**\n     * Reduce the set of matched elements to a subset specified by a range of indices.\n     * \n     * @param start - An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set.\n     * @param end - An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set.\n     */\n    slice(start: number, end?: number): JQuery;\n\n    /**\n     * Show the queue of functions to be executed on the matched elements.\n     * \n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     */\n    queue(queueName?: string): any[];\n    /**\n     * Manipulate the queue of functions to be executed, once for each matched element.\n     * \n     * @param newQueue - An array of functions to replace the current queue contents.\n     */\n    queue(newQueue: Function[]): JQuery;\n    /**\n     * Manipulate the queue of functions to be executed, once for each matched element.\n     * \n     * @param callback - The new function to add to the queue, with a function to call that will dequeue the next item.\n     */\n    queue(callback: Function): JQuery;\n    /**\n     * Manipulate the queue of functions to be executed, once for each matched element.\n     * \n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     * @param newQueue - An array of functions to replace the current queue contents.\n     */\n    queue(queueName: string, newQueue: Function[]): JQuery;\n    /**\n     * Manipulate the queue of functions to be executed, once for each matched element.\n     * \n     * @param queueName - A string containing the name of the queue. Defaults to fx, the standard effects queue.\n     * @param callback - The new function to add to the queue, with a function to call that will dequeue the next item.\n     */\n    queue(queueName: string, callback: Function): JQuery;\n}\ndeclare module \"jquery\" {\n    export = $;\n}\ndeclare var jQuery: JQueryStatic;\ndeclare var $: JQueryStatic;"
  },
  {
    "path": "common/Tests/External/magic-string.umd.js",
    "content": "(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global = global || self, global.MagicString = factory());\n}(this, function () { 'use strict';\n\n\tvar BitSet = function BitSet(arg) {\n\t\tthis.bits = arg instanceof BitSet ? arg.bits.slice() : [];\n\t};\n\n\tBitSet.prototype.add = function add (n) {\n\t\tthis.bits[Math.floor(n / BITS)] |= 1 << n % BITS;\n\t};\n\n\tBitSet.prototype.has = function has (n) {\n\t\treturn !!(this.bits[Math.floor(n / BITS)] & (1 << n % BITS));\n\t};\n\n\tvar BITS = 32;\n\n\tvar Chunk = function Chunk(start, end, content) {\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t\tthis.original = content;\n\n\t\tthis.intro = '';\n\t\tthis.outro = '';\n\n\t\tthis.content = content;\n\t\tthis.storeName = false;\n\t\tthis.edited = false;\n\n\t\t// we make these non-enumerable, for sanity while debugging\n\t\tObject.defineProperties(this, {\n\t\t\tprevious: { writable: true, value: null },\n\t\t\tnext:     { writable: true, value: null }\n\t\t});\n\t};\n\n\tChunk.prototype.appendLeft = function appendLeft (content) {\n\t\tthis.outro += content;\n\t};\n\n\tChunk.prototype.appendRight = function appendRight (content) {\n\t\tthis.intro = this.intro + content;\n\t};\n\n\tChunk.prototype.clone = function clone () {\n\t\tvar chunk = new Chunk(this.start, this.end, this.original);\n\n\t\tchunk.intro = this.intro;\n\t\tchunk.outro = this.outro;\n\t\tchunk.content = this.content;\n\t\tchunk.storeName = this.storeName;\n\t\tchunk.edited = this.edited;\n\n\t\treturn chunk;\n\t};\n\n\tChunk.prototype.contains = function contains (index) {\n\t\treturn this.start < index && index < this.end;\n\t};\n\n\tChunk.prototype.eachNext = function eachNext (fn) {\n\t\tvar chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.next;\n\t\t}\n\t};\n\n\tChunk.prototype.eachPrevious = function eachPrevious (fn) {\n\t\tvar chunk = this;\n\t\twhile (chunk) {\n\t\t\tfn(chunk);\n\t\t\tchunk = chunk.previous;\n\t\t}\n\t};\n\n\tChunk.prototype.edit = function edit (content, storeName, contentOnly) {\n\t\tthis.content = content;\n\t\tif (!contentOnly) {\n\t\t\tthis.intro = '';\n\t\t\tthis.outro = '';\n\t\t}\n\t\tthis.storeName = storeName;\n\n\t\tthis.edited = true;\n\n\t\treturn this;\n\t};\n\n\tChunk.prototype.prependLeft = function prependLeft (content) {\n\t\tthis.outro = content + this.outro;\n\t};\n\n\tChunk.prototype.prependRight = function prependRight (content) {\n\t\tthis.intro = content + this.intro;\n\t};\n\n\tChunk.prototype.split = function split (index) {\n\t\tvar sliceIndex = index - this.start;\n\n\t\tvar originalBefore = this.original.slice(0, sliceIndex);\n\t\tvar originalAfter = this.original.slice(sliceIndex);\n\n\t\tthis.original = originalBefore;\n\n\t\tvar newChunk = new Chunk(index, this.end, originalAfter);\n\t\tnewChunk.outro = this.outro;\n\t\tthis.outro = '';\n\n\t\tthis.end = index;\n\n\t\tif (this.edited) {\n\t\t\t// TODO is this block necessary?...\n\t\t\tnewChunk.edit('', false);\n\t\t\tthis.content = '';\n\t\t} else {\n\t\t\tthis.content = originalBefore;\n\t\t}\n\n\t\tnewChunk.next = this.next;\n\t\tif (newChunk.next) { newChunk.next.previous = newChunk; }\n\t\tnewChunk.previous = this;\n\t\tthis.next = newChunk;\n\n\t\treturn newChunk;\n\t};\n\n\tChunk.prototype.toString = function toString () {\n\t\treturn this.intro + this.content + this.outro;\n\t};\n\n\tChunk.prototype.trimEnd = function trimEnd (rx) {\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) { return true; }\n\n\t\tvar trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.start + trimmed.length).edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\tif (this.intro.length) { return true; }\n\t\t}\n\t};\n\n\tChunk.prototype.trimStart = function trimStart (rx) {\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) { return true; }\n\n\t\tvar trimmed = this.content.replace(rx, '');\n\n\t\tif (trimmed.length) {\n\t\t\tif (trimmed !== this.content) {\n\t\t\t\tthis.split(this.end - trimmed.length);\n\t\t\t\tthis.edit('', undefined, true);\n\t\t\t}\n\t\t\treturn true;\n\n\t\t} else {\n\t\t\tthis.edit('', undefined, true);\n\n\t\t\tthis.outro = this.outro.replace(rx, '');\n\t\t\tif (this.outro.length) { return true; }\n\t\t}\n\t};\n\n\tvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\tfunction encode(decoded) {\n\t    var sourceFileIndex = 0; // second field\n\t    var sourceCodeLine = 0; // third field\n\t    var sourceCodeColumn = 0; // fourth field\n\t    var nameIndex = 0; // fifth field\n\t    var mappings = '';\n\t    for (var i = 0; i < decoded.length; i++) {\n\t        var line = decoded[i];\n\t        if (i > 0)\n\t            mappings += ';';\n\t        if (line.length === 0)\n\t            continue;\n\t        var generatedCodeColumn = 0; // first field\n\t        var lineMappings = [];\n\t        for (var _i = 0, line_1 = line; _i < line_1.length; _i++) {\n\t            var segment = line_1[_i];\n\t            var segmentMappings = encodeInteger(segment[0] - generatedCodeColumn);\n\t            generatedCodeColumn = segment[0];\n\t            if (segment.length > 1) {\n\t                segmentMappings +=\n\t                    encodeInteger(segment[1] - sourceFileIndex) +\n\t                        encodeInteger(segment[2] - sourceCodeLine) +\n\t                        encodeInteger(segment[3] - sourceCodeColumn);\n\t                sourceFileIndex = segment[1];\n\t                sourceCodeLine = segment[2];\n\t                sourceCodeColumn = segment[3];\n\t            }\n\t            if (segment.length === 5) {\n\t                segmentMappings += encodeInteger(segment[4] - nameIndex);\n\t                nameIndex = segment[4];\n\t            }\n\t            lineMappings.push(segmentMappings);\n\t        }\n\t        mappings += lineMappings.join(',');\n\t    }\n\t    return mappings;\n\t}\n\tfunction encodeInteger(num) {\n\t    var result = '';\n\t    num = num < 0 ? (-num << 1) | 1 : num << 1;\n\t    do {\n\t        var clamped = num & 31;\n\t        num >>= 5;\n\t        if (num > 0) {\n\t            clamped |= 32;\n\t        }\n\t        result += chars[clamped];\n\t    } while (num > 0);\n\t    return result;\n\t}\n\n\tvar btoa = function () {\n\t\tthrow new Error('Unsupported environment: `window.btoa` or `Buffer` should be supported.');\n\t};\n\tif (typeof window !== 'undefined' && typeof window.btoa === 'function') {\n\t\tbtoa = function (str) { return window.btoa(unescape(encodeURIComponent(str))); };\n\t} else if (typeof Buffer === 'function') {\n\t\tbtoa = function (str) { return Buffer.from(str, 'utf-8').toString('base64'); };\n\t}\n\n\tvar SourceMap = function SourceMap(properties) {\n\t\tthis.version = 3;\n\t\tthis.file = properties.file;\n\t\tthis.sources = properties.sources;\n\t\tthis.sourcesContent = properties.sourcesContent;\n\t\tthis.names = properties.names;\n\t\tthis.mappings = encode(properties.mappings);\n\t};\n\n\tSourceMap.prototype.toString = function toString () {\n\t\treturn JSON.stringify(this);\n\t};\n\n\tSourceMap.prototype.toUrl = function toUrl () {\n\t\treturn 'data:application/json;charset=utf-8;base64,' + btoa(this.toString());\n\t};\n\n\tfunction guessIndent(code) {\n\t\tvar lines = code.split('\\n');\n\n\t\tvar tabbed = lines.filter(function (line) { return /^\\t+/.test(line); });\n\t\tvar spaced = lines.filter(function (line) { return /^ {2,}/.test(line); });\n\n\t\tif (tabbed.length === 0 && spaced.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// More lines tabbed than spaced? Assume tabs, and\n\t\t// default to tabs in the case of a tie (or nothing\n\t\t// to go on)\n\t\tif (tabbed.length >= spaced.length) {\n\t\t\treturn '\\t';\n\t\t}\n\n\t\t// Otherwise, we need to guess the multiple\n\t\tvar min = spaced.reduce(function (previous, current) {\n\t\t\tvar numSpaces = /^ +/.exec(current)[0].length;\n\t\t\treturn Math.min(numSpaces, previous);\n\t\t}, Infinity);\n\n\t\treturn new Array(min + 1).join(' ');\n\t}\n\n\tfunction getRelativePath(from, to) {\n\t\tvar fromParts = from.split(/[/\\\\]/);\n\t\tvar toParts = to.split(/[/\\\\]/);\n\n\t\tfromParts.pop(); // get dirname\n\n\t\twhile (fromParts[0] === toParts[0]) {\n\t\t\tfromParts.shift();\n\t\t\ttoParts.shift();\n\t\t}\n\n\t\tif (fromParts.length) {\n\t\t\tvar i = fromParts.length;\n\t\t\twhile (i--) { fromParts[i] = '..'; }\n\t\t}\n\n\t\treturn fromParts.concat(toParts).join('/');\n\t}\n\n\tvar toString = Object.prototype.toString;\n\n\tfunction isObject(thing) {\n\t\treturn toString.call(thing) === '[object Object]';\n\t}\n\n\tfunction getLocator(source) {\n\t\tvar originalLines = source.split('\\n');\n\t\tvar lineOffsets = [];\n\n\t\tfor (var i = 0, pos = 0; i < originalLines.length; i++) {\n\t\t\tlineOffsets.push(pos);\n\t\t\tpos += originalLines[i].length + 1;\n\t\t}\n\n\t\treturn function locate(index) {\n\t\t\tvar i = 0;\n\t\t\tvar j = lineOffsets.length;\n\t\t\twhile (i < j) {\n\t\t\t\tvar m = (i + j) >> 1;\n\t\t\t\tif (index < lineOffsets[m]) {\n\t\t\t\t\tj = m;\n\t\t\t\t} else {\n\t\t\t\t\ti = m + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar line = i - 1;\n\t\t\tvar column = index - lineOffsets[line];\n\t\t\treturn { line: line, column: column };\n\t\t};\n\t}\n\n\tvar Mappings = function Mappings(hires) {\n\t\tthis.hires = hires;\n\t\tthis.generatedCodeLine = 0;\n\t\tthis.generatedCodeColumn = 0;\n\t\tthis.raw = [];\n\t\tthis.rawSegments = this.raw[this.generatedCodeLine] = [];\n\t\tthis.pending = null;\n\t};\n\n\tMappings.prototype.addEdit = function addEdit (sourceIndex, content, loc, nameIndex) {\n\t\tif (content.length) {\n\t\t\tvar segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column];\n\t\t\tif (nameIndex >= 0) {\n\t\t\t\tsegment.push(nameIndex);\n\t\t\t}\n\t\t\tthis.rawSegments.push(segment);\n\t\t} else if (this.pending) {\n\t\t\tthis.rawSegments.push(this.pending);\n\t\t}\n\n\t\tthis.advance(content);\n\t\tthis.pending = null;\n\t};\n\n\tMappings.prototype.addUneditedChunk = function addUneditedChunk (sourceIndex, chunk, original, loc, sourcemapLocations) {\n\t\tvar originalCharIndex = chunk.start;\n\t\tvar first = true;\n\n\t\twhile (originalCharIndex < chunk.end) {\n\t\t\tif (this.hires || first || sourcemapLocations.has(originalCharIndex)) {\n\t\t\t\tthis.rawSegments.push([this.generatedCodeColumn, sourceIndex, loc.line, loc.column]);\n\t\t\t}\n\n\t\t\tif (original[originalCharIndex] === '\\n') {\n\t\t\t\tloc.line += 1;\n\t\t\t\tloc.column = 0;\n\t\t\t\tthis.generatedCodeLine += 1;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t\tthis.generatedCodeColumn = 0;\n\t\t\t\tfirst = true;\n\t\t\t} else {\n\t\t\t\tloc.column += 1;\n\t\t\t\tthis.generatedCodeColumn += 1;\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\toriginalCharIndex += 1;\n\t\t}\n\n\t\tthis.pending = sourceIndex > 0\n\t\t\t? [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]\n\t\t\t: null;\n\t};\n\n\tMappings.prototype.advance = function advance (str) {\n\t\tif (!str) { return; }\n\n\t\tvar lines = str.split('\\n');\n\n\t\tif (lines.length > 1) {\n\t\t\tfor (var i = 0; i < lines.length - 1; i++) {\n\t\t\t\tthis.generatedCodeLine++;\n\t\t\t\tthis.raw[this.generatedCodeLine] = this.rawSegments = [];\n\t\t\t}\n\t\t\tthis.generatedCodeColumn = 0;\n\t\t}\n\n\t\tthis.generatedCodeColumn += lines[lines.length - 1].length;\n\t};\n\n\tvar n = '\\n';\n\n\tvar warned = {\n\t\tinsertLeft: false,\n\t\tinsertRight: false,\n\t\tstoreName: false\n\t};\n\n\tvar MagicString = function MagicString(string, options) {\n\t\tif ( options === void 0 ) options = {};\n\n\t\tvar chunk = new Chunk(0, string.length, string);\n\n\t\tObject.defineProperties(this, {\n\t\t\toriginal:              { writable: true, value: string },\n\t\t\toutro:                 { writable: true, value: '' },\n\t\t\tintro:                 { writable: true, value: '' },\n\t\t\tfirstChunk:            { writable: true, value: chunk },\n\t\t\tlastChunk:             { writable: true, value: chunk },\n\t\t\tlastSearchedChunk:     { writable: true, value: chunk },\n\t\t\tbyStart:               { writable: true, value: {} },\n\t\t\tbyEnd:                 { writable: true, value: {} },\n\t\t\tfilename:              { writable: true, value: options.filename },\n\t\t\tindentExclusionRanges: { writable: true, value: options.indentExclusionRanges },\n\t\t\tsourcemapLocations:    { writable: true, value: new BitSet() },\n\t\t\tstoredNames:           { writable: true, value: {} },\n\t\t\tindentStr:             { writable: true, value: guessIndent(string) }\n\t\t});\n\n\t\tthis.byStart[0] = chunk;\n\t\tthis.byEnd[string.length] = chunk;\n\t};\n\n\tMagicString.prototype.addSourcemapLocation = function addSourcemapLocation (char) {\n\t\tthis.sourcemapLocations.add(char);\n\t};\n\n\tMagicString.prototype.append = function append (content) {\n\t\tif (typeof content !== 'string') { throw new TypeError('outro content must be a string'); }\n\n\t\tthis.outro += content;\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.appendLeft = function appendLeft (index, content) {\n\t\tif (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }\n\n\t\tthis._split(index);\n\n\t\tvar chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendLeft(content);\n\t\t} else {\n\t\t\tthis.intro += content;\n\t\t}\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.appendRight = function appendRight (index, content) {\n\t\tif (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }\n\n\t\tthis._split(index);\n\n\t\tvar chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.appendRight(content);\n\t\t} else {\n\t\t\tthis.outro += content;\n\t\t}\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.clone = function clone () {\n\t\tvar cloned = new MagicString(this.original, { filename: this.filename });\n\n\t\tvar originalChunk = this.firstChunk;\n\t\tvar clonedChunk = (cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone());\n\n\t\twhile (originalChunk) {\n\t\t\tcloned.byStart[clonedChunk.start] = clonedChunk;\n\t\t\tcloned.byEnd[clonedChunk.end] = clonedChunk;\n\n\t\t\tvar nextOriginalChunk = originalChunk.next;\n\t\t\tvar nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone();\n\n\t\t\tif (nextClonedChunk) {\n\t\t\t\tclonedChunk.next = nextClonedChunk;\n\t\t\t\tnextClonedChunk.previous = clonedChunk;\n\n\t\t\t\tclonedChunk = nextClonedChunk;\n\t\t\t}\n\n\t\t\toriginalChunk = nextOriginalChunk;\n\t\t}\n\n\t\tcloned.lastChunk = clonedChunk;\n\n\t\tif (this.indentExclusionRanges) {\n\t\t\tcloned.indentExclusionRanges = this.indentExclusionRanges.slice();\n\t\t}\n\n\t\tcloned.sourcemapLocations = new BitSet(this.sourcemapLocations);\n\n\t\tcloned.intro = this.intro;\n\t\tcloned.outro = this.outro;\n\n\t\treturn cloned;\n\t};\n\n\tMagicString.prototype.generateDecodedMap = function generateDecodedMap (options) {\n\t\t\tvar this$1 = this;\n\n\t\toptions = options || {};\n\n\t\tvar sourceIndex = 0;\n\t\tvar names = Object.keys(this.storedNames);\n\t\tvar mappings = new Mappings(options.hires);\n\n\t\tvar locate = getLocator(this.original);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.firstChunk.eachNext(function (chunk) {\n\t\t\tvar loc = locate(chunk.start);\n\n\t\t\tif (chunk.intro.length) { mappings.advance(chunk.intro); }\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tmappings.addEdit(\n\t\t\t\t\tsourceIndex,\n\t\t\t\t\tchunk.content,\n\t\t\t\t\tloc,\n\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tmappings.addUneditedChunk(sourceIndex, chunk, this$1.original, loc, this$1.sourcemapLocations);\n\t\t\t}\n\n\t\t\tif (chunk.outro.length) { mappings.advance(chunk.outro); }\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : null,\n\t\t\tsources: [options.source ? getRelativePath(options.file || '', options.source) : null],\n\t\t\tsourcesContent: options.includeContent ? [this.original] : [null],\n\t\t\tnames: names,\n\t\t\tmappings: mappings.raw\n\t\t};\n\t};\n\n\tMagicString.prototype.generateMap = function generateMap (options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t};\n\n\tMagicString.prototype.getIndentString = function getIndentString () {\n\t\treturn this.indentStr === null ? '\\t' : this.indentStr;\n\t};\n\n\tMagicString.prototype.indent = function indent (indentStr, options) {\n\t\tvar pattern = /^[^\\r\\n]/gm;\n\n\t\tif (isObject(indentStr)) {\n\t\t\toptions = indentStr;\n\t\t\tindentStr = undefined;\n\t\t}\n\n\t\tindentStr = indentStr !== undefined ? indentStr : this.indentStr || '\\t';\n\n\t\tif (indentStr === '') { return this; } // noop\n\n\t\toptions = options || {};\n\n\t\t// Process exclusion ranges\n\t\tvar isExcluded = {};\n\n\t\tif (options.exclude) {\n\t\t\tvar exclusions =\n\t\t\t\ttypeof options.exclude[0] === 'number' ? [options.exclude] : options.exclude;\n\t\t\texclusions.forEach(function (exclusion) {\n\t\t\t\tfor (var i = exclusion[0]; i < exclusion[1]; i += 1) {\n\t\t\t\t\tisExcluded[i] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvar shouldIndentNextCharacter = options.indentStart !== false;\n\t\tvar replacer = function (match) {\n\t\t\tif (shouldIndentNextCharacter) { return (\"\" + indentStr + match); }\n\t\t\tshouldIndentNextCharacter = true;\n\t\t\treturn match;\n\t\t};\n\n\t\tthis.intro = this.intro.replace(pattern, replacer);\n\n\t\tvar charIndex = 0;\n\t\tvar chunk = this.firstChunk;\n\n\t\twhile (chunk) {\n\t\t\tvar end = chunk.end;\n\n\t\t\tif (chunk.edited) {\n\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\tchunk.content = chunk.content.replace(pattern, replacer);\n\n\t\t\t\t\tif (chunk.content.length) {\n\t\t\t\t\t\tshouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === '\\n';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcharIndex = chunk.start;\n\n\t\t\t\twhile (charIndex < end) {\n\t\t\t\t\tif (!isExcluded[charIndex]) {\n\t\t\t\t\t\tvar char = this.original[charIndex];\n\n\t\t\t\t\t\tif (char === '\\n') {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = true;\n\t\t\t\t\t\t} else if (char !== '\\r' && shouldIndentNextCharacter) {\n\t\t\t\t\t\t\tshouldIndentNextCharacter = false;\n\n\t\t\t\t\t\t\tif (charIndex === chunk.start) {\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._splitChunk(chunk, charIndex);\n\t\t\t\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t\t\t\t\tchunk.prependRight(indentStr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcharIndex += 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcharIndex = chunk.end;\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tthis.outro = this.outro.replace(pattern, replacer);\n\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.insert = function insert () {\n\t\tthrow new Error('magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)');\n\t};\n\n\tMagicString.prototype.insertLeft = function insertLeft (index, content) {\n\t\tif (!warned.insertLeft) {\n\t\t\tconsole.warn('magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead'); // eslint-disable-line no-console\n\t\t\twarned.insertLeft = true;\n\t\t}\n\n\t\treturn this.appendLeft(index, content);\n\t};\n\n\tMagicString.prototype.insertRight = function insertRight (index, content) {\n\t\tif (!warned.insertRight) {\n\t\t\tconsole.warn('magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead'); // eslint-disable-line no-console\n\t\t\twarned.insertRight = true;\n\t\t}\n\n\t\treturn this.prependRight(index, content);\n\t};\n\n\tMagicString.prototype.move = function move (start, end, index) {\n\t\tif (index >= start && index <= end) { throw new Error('Cannot move a selection inside itself'); }\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\t\tthis._split(index);\n\n\t\tvar first = this.byStart[start];\n\t\tvar last = this.byEnd[end];\n\n\t\tvar oldLeft = first.previous;\n\t\tvar oldRight = last.next;\n\n\t\tvar newRight = this.byStart[index];\n\t\tif (!newRight && last === this.lastChunk) { return this; }\n\t\tvar newLeft = newRight ? newRight.previous : this.lastChunk;\n\n\t\tif (oldLeft) { oldLeft.next = oldRight; }\n\t\tif (oldRight) { oldRight.previous = oldLeft; }\n\n\t\tif (newLeft) { newLeft.next = first; }\n\t\tif (newRight) { newRight.previous = last; }\n\n\t\tif (!first.previous) { this.firstChunk = last.next; }\n\t\tif (!last.next) {\n\t\t\tthis.lastChunk = first.previous;\n\t\t\tthis.lastChunk.next = null;\n\t\t}\n\n\t\tfirst.previous = newLeft;\n\t\tlast.next = newRight || null;\n\n\t\tif (!newLeft) { this.firstChunk = first; }\n\t\tif (!newRight) { this.lastChunk = last; }\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.overwrite = function overwrite (start, end, content, options) {\n\t\tif (typeof content !== 'string') { throw new TypeError('replacement content must be a string'); }\n\n\t\twhile (start < 0) { start += this.original.length; }\n\t\twhile (end < 0) { end += this.original.length; }\n\n\t\tif (end > this.original.length) { throw new Error('end is out of bounds'); }\n\t\tif (start === end)\n\t\t\t{ throw new Error('Cannot overwrite a zero-length range – use appendLeft or prependRight instead'); }\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tif (options === true) {\n\t\t\tif (!warned.storeName) {\n\t\t\t\tconsole.warn('The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string'); // eslint-disable-line no-console\n\t\t\t\twarned.storeName = true;\n\t\t\t}\n\n\t\t\toptions = { storeName: true };\n\t\t}\n\t\tvar storeName = options !== undefined ? options.storeName : false;\n\t\tvar contentOnly = options !== undefined ? options.contentOnly : false;\n\n\t\tif (storeName) {\n\t\t\tvar original = this.original.slice(start, end);\n\t\t\tthis.storedNames[original] = true;\n\t\t}\n\n\t\tvar first = this.byStart[start];\n\t\tvar last = this.byEnd[end];\n\n\t\tif (first) {\n\t\t\tif (end > first.end && first.next !== this.byStart[first.end]) {\n\t\t\t\tthrow new Error('Cannot overwrite across a split point');\n\t\t\t}\n\n\t\t\tfirst.edit(content, storeName, contentOnly);\n\n\t\t\tif (first !== last) {\n\t\t\t\tvar chunk = first.next;\n\t\t\t\twhile (chunk !== last) {\n\t\t\t\t\tchunk.edit('', false);\n\t\t\t\t\tchunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tchunk.edit('', false);\n\t\t\t}\n\t\t} else {\n\t\t\t// must be inserting at the end\n\t\t\tvar newChunk = new Chunk(start, end, '').edit(content, storeName);\n\n\t\t\t// TODO last chunk in the array may not be the last chunk, if it's moved...\n\t\t\tlast.next = newChunk;\n\t\t\tnewChunk.previous = last;\n\t\t}\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.prepend = function prepend (content) {\n\t\tif (typeof content !== 'string') { throw new TypeError('outro content must be a string'); }\n\n\t\tthis.intro = content + this.intro;\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.prependLeft = function prependLeft (index, content) {\n\t\tif (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }\n\n\t\tthis._split(index);\n\n\t\tvar chunk = this.byEnd[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependLeft(content);\n\t\t} else {\n\t\t\tthis.intro = content + this.intro;\n\t\t}\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.prependRight = function prependRight (index, content) {\n\t\tif (typeof content !== 'string') { throw new TypeError('inserted content must be a string'); }\n\n\t\tthis._split(index);\n\n\t\tvar chunk = this.byStart[index];\n\n\t\tif (chunk) {\n\t\t\tchunk.prependRight(content);\n\t\t} else {\n\t\t\tthis.outro = content + this.outro;\n\t\t}\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.remove = function remove (start, end) {\n\t\twhile (start < 0) { start += this.original.length; }\n\t\twhile (end < 0) { end += this.original.length; }\n\n\t\tif (start === end) { return this; }\n\n\t\tif (start < 0 || end > this.original.length) { throw new Error('Character is out of bounds'); }\n\t\tif (start > end) { throw new Error('end must be greater than start'); }\n\n\t\tthis._split(start);\n\t\tthis._split(end);\n\n\t\tvar chunk = this.byStart[start];\n\n\t\twhile (chunk) {\n\t\t\tchunk.intro = '';\n\t\t\tchunk.outro = '';\n\t\t\tchunk.edit('');\n\n\t\t\tchunk = end > chunk.end ? this.byStart[chunk.end] : null;\n\t\t}\n\t\treturn this;\n\t};\n\n\tMagicString.prototype.lastChar = function lastChar () {\n\t\tif (this.outro.length)\n\t\t\t{ return this.outro[this.outro.length - 1]; }\n\t\tvar chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length)\n\t\t\t\t{ return chunk.outro[chunk.outro.length - 1]; }\n\t\t\tif (chunk.content.length)\n\t\t\t\t{ return chunk.content[chunk.content.length - 1]; }\n\t\t\tif (chunk.intro.length)\n\t\t\t\t{ return chunk.intro[chunk.intro.length - 1]; }\n\t\t} while (chunk = chunk.previous);\n\t\tif (this.intro.length)\n\t\t\t{ return this.intro[this.intro.length - 1]; }\n\t\treturn '';\n\t};\n\n\tMagicString.prototype.lastLine = function lastLine () {\n\t\tvar lineIndex = this.outro.lastIndexOf(n);\n\t\tif (lineIndex !== -1)\n\t\t\t{ return this.outro.substr(lineIndex + 1); }\n\t\tvar lineStr = this.outro;\n\t\tvar chunk = this.lastChunk;\n\t\tdo {\n\t\t\tif (chunk.outro.length > 0) {\n\t\t\t\tlineIndex = chunk.outro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1)\n\t\t\t\t\t{ return chunk.outro.substr(lineIndex + 1) + lineStr; }\n\t\t\t\tlineStr = chunk.outro + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.content.length > 0) {\n\t\t\t\tlineIndex = chunk.content.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1)\n\t\t\t\t\t{ return chunk.content.substr(lineIndex + 1) + lineStr; }\n\t\t\t\tlineStr = chunk.content + lineStr;\n\t\t\t}\n\n\t\t\tif (chunk.intro.length > 0) {\n\t\t\t\tlineIndex = chunk.intro.lastIndexOf(n);\n\t\t\t\tif (lineIndex !== -1)\n\t\t\t\t\t{ return chunk.intro.substr(lineIndex + 1) + lineStr; }\n\t\t\t\tlineStr = chunk.intro + lineStr;\n\t\t\t}\n\t\t} while (chunk = chunk.previous);\n\t\tlineIndex = this.intro.lastIndexOf(n);\n\t\tif (lineIndex !== -1)\n\t\t\t{ return this.intro.substr(lineIndex + 1) + lineStr; }\n\t\treturn this.intro + lineStr;\n\t};\n\n\tMagicString.prototype.slice = function slice (start, end) {\n\t\t\tif ( start === void 0 ) start = 0;\n\t\t\tif ( end === void 0 ) end = this.original.length;\n\n\t\twhile (start < 0) { start += this.original.length; }\n\t\twhile (end < 0) { end += this.original.length; }\n\n\t\tvar result = '';\n\n\t\t// find start chunk\n\t\tvar chunk = this.firstChunk;\n\t\twhile (chunk && (chunk.start > start || chunk.end <= start)) {\n\t\t\t// found end chunk before start\n\t\t\tif (chunk.start < end && chunk.end >= end) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\tif (chunk && chunk.edited && chunk.start !== start)\n\t\t\t{ throw new Error((\"Cannot use replaced character \" + start + \" as slice start anchor.\")); }\n\n\t\tvar startChunk = chunk;\n\t\twhile (chunk) {\n\t\t\tif (chunk.intro && (startChunk !== chunk || chunk.start === start)) {\n\t\t\t\tresult += chunk.intro;\n\t\t\t}\n\n\t\t\tvar containsEnd = chunk.start < end && chunk.end >= end;\n\t\t\tif (containsEnd && chunk.edited && chunk.end !== end)\n\t\t\t\t{ throw new Error((\"Cannot use replaced character \" + end + \" as slice end anchor.\")); }\n\n\t\t\tvar sliceStart = startChunk === chunk ? start - chunk.start : 0;\n\t\t\tvar sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length;\n\n\t\t\tresult += chunk.content.slice(sliceStart, sliceEnd);\n\n\t\t\tif (chunk.outro && (!containsEnd || chunk.end === end)) {\n\t\t\t\tresult += chunk.outro;\n\t\t\t}\n\n\t\t\tif (containsEnd) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// TODO deprecate this? not really very useful\n\tMagicString.prototype.snip = function snip (start, end) {\n\t\tvar clone = this.clone();\n\t\tclone.remove(0, start);\n\t\tclone.remove(end, clone.original.length);\n\n\t\treturn clone;\n\t};\n\n\tMagicString.prototype._split = function _split (index) {\n\t\tif (this.byStart[index] || this.byEnd[index]) { return; }\n\n\t\tvar chunk = this.lastSearchedChunk;\n\t\tvar searchForward = index > chunk.end;\n\n\t\twhile (chunk) {\n\t\t\tif (chunk.contains(index)) { return this._splitChunk(chunk, index); }\n\n\t\t\tchunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start];\n\t\t}\n\t};\n\n\tMagicString.prototype._splitChunk = function _splitChunk (chunk, index) {\n\t\tif (chunk.edited && chunk.content.length) {\n\t\t\t// zero-length edited chunks are a special case (overlapping replacements)\n\t\t\tvar loc = getLocator(this.original)(index);\n\t\t\tthrow new Error(\n\t\t\t\t(\"Cannot split a chunk that has already been edited (\" + (loc.line) + \":\" + (loc.column) + \" – \\\"\" + (chunk.original) + \"\\\")\")\n\t\t\t);\n\t\t}\n\n\t\tvar newChunk = chunk.split(index);\n\n\t\tthis.byEnd[index] = chunk;\n\t\tthis.byStart[index] = newChunk;\n\t\tthis.byEnd[newChunk.end] = newChunk;\n\n\t\tif (chunk === this.lastChunk) { this.lastChunk = newChunk; }\n\n\t\tthis.lastSearchedChunk = chunk;\n\t\treturn true;\n\t};\n\n\tMagicString.prototype.toString = function toString () {\n\t\tvar str = this.intro;\n\n\t\tvar chunk = this.firstChunk;\n\t\twhile (chunk) {\n\t\t\tstr += chunk.toString();\n\t\t\tchunk = chunk.next;\n\t\t}\n\n\t\treturn str + this.outro;\n\t};\n\n\tMagicString.prototype.isEmpty = function isEmpty () {\n\t\tvar chunk = this.firstChunk;\n\t\tdo {\n\t\t\tif (chunk.intro.length && chunk.intro.trim() ||\n\t\t\t\t\tchunk.content.length && chunk.content.trim() ||\n\t\t\t\t\tchunk.outro.length && chunk.outro.trim())\n\t\t\t\t{ return false; }\n\t\t} while (chunk = chunk.next);\n\t\treturn true;\n\t};\n\n\tMagicString.prototype.length = function length () {\n\t\tvar chunk = this.firstChunk;\n\t\tvar length = 0;\n\t\tdo {\n\t\t\tlength += chunk.intro.length + chunk.content.length + chunk.outro.length;\n\t\t} while (chunk = chunk.next);\n\t\treturn length;\n\t};\n\n\tMagicString.prototype.trimLines = function trimLines () {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t};\n\n\tMagicString.prototype.trim = function trim (charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t};\n\n\tMagicString.prototype.trimEndAborted = function trimEndAborted (charType) {\n\t\tvar rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tthis.outro = this.outro.replace(rx, '');\n\t\tif (this.outro.length) { return true; }\n\n\t\tvar chunk = this.lastChunk;\n\n\t\tdo {\n\t\t\tvar end = chunk.end;\n\t\t\tvar aborted = chunk.trimEnd(rx);\n\n\t\t\t// if chunk was trimmed, we have a new lastChunk\n\t\t\tif (chunk.end !== end) {\n\t\t\t\tif (this.lastChunk === chunk) {\n\t\t\t\t\tthis.lastChunk = chunk.next;\n\t\t\t\t}\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) { return true; }\n\t\t\tchunk = chunk.previous;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t};\n\n\tMagicString.prototype.trimEnd = function trimEnd (charType) {\n\t\tthis.trimEndAborted(charType);\n\t\treturn this;\n\t};\n\tMagicString.prototype.trimStartAborted = function trimStartAborted (charType) {\n\t\tvar rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\n\t\tthis.intro = this.intro.replace(rx, '');\n\t\tif (this.intro.length) { return true; }\n\n\t\tvar chunk = this.firstChunk;\n\n\t\tdo {\n\t\t\tvar end = chunk.end;\n\t\t\tvar aborted = chunk.trimStart(rx);\n\n\t\t\tif (chunk.end !== end) {\n\t\t\t\t// special case...\n\t\t\t\tif (chunk === this.lastChunk) { this.lastChunk = chunk.next; }\n\n\t\t\t\tthis.byEnd[chunk.end] = chunk;\n\t\t\t\tthis.byStart[chunk.next.start] = chunk.next;\n\t\t\t\tthis.byEnd[chunk.next.end] = chunk.next;\n\t\t\t}\n\n\t\t\tif (aborted) { return true; }\n\t\t\tchunk = chunk.next;\n\t\t} while (chunk);\n\n\t\treturn false;\n\t};\n\n\tMagicString.prototype.trimStart = function trimStart (charType) {\n\t\tthis.trimStartAborted(charType);\n\t\treturn this;\n\t};\n\n\tvar hasOwnProp = Object.prototype.hasOwnProperty;\n\n\tvar Bundle = function Bundle(options) {\n\t\tif ( options === void 0 ) options = {};\n\n\t\tthis.intro = options.intro || '';\n\t\tthis.separator = options.separator !== undefined ? options.separator : '\\n';\n\t\tthis.sources = [];\n\t\tthis.uniqueSources = [];\n\t\tthis.uniqueSourceIndexByFilename = {};\n\t};\n\n\tBundle.prototype.addSource = function addSource (source) {\n\t\tif (source instanceof MagicString) {\n\t\t\treturn this.addSource({\n\t\t\t\tcontent: source,\n\t\t\t\tfilename: source.filename,\n\t\t\t\tseparator: this.separator\n\t\t\t});\n\t\t}\n\n\t\tif (!isObject(source) || !source.content) {\n\t\t\tthrow new Error('bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`');\n\t\t}\n\n\t\t['filename', 'indentExclusionRanges', 'separator'].forEach(function (option) {\n\t\t\tif (!hasOwnProp.call(source, option)) { source[option] = source.content[option]; }\n\t\t});\n\n\t\tif (source.separator === undefined) {\n\t\t\t// TODO there's a bunch of this sort of thing, needs cleaning up\n\t\t\tsource.separator = this.separator;\n\t\t}\n\n\t\tif (source.filename) {\n\t\t\tif (!hasOwnProp.call(this.uniqueSourceIndexByFilename, source.filename)) {\n\t\t\t\tthis.uniqueSourceIndexByFilename[source.filename] = this.uniqueSources.length;\n\t\t\t\tthis.uniqueSources.push({ filename: source.filename, content: source.content.original });\n\t\t\t} else {\n\t\t\t\tvar uniqueSource = this.uniqueSources[this.uniqueSourceIndexByFilename[source.filename]];\n\t\t\t\tif (source.content.original !== uniqueSource.content) {\n\t\t\t\t\tthrow new Error((\"Illegal source: same filename (\" + (source.filename) + \"), different contents\"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.sources.push(source);\n\t\treturn this;\n\t};\n\n\tBundle.prototype.append = function append (str, options) {\n\t\tthis.addSource({\n\t\t\tcontent: new MagicString(str),\n\t\t\tseparator: (options && options.separator) || ''\n\t\t});\n\n\t\treturn this;\n\t};\n\n\tBundle.prototype.clone = function clone () {\n\t\tvar bundle = new Bundle({\n\t\t\tintro: this.intro,\n\t\t\tseparator: this.separator\n\t\t});\n\n\t\tthis.sources.forEach(function (source) {\n\t\t\tbundle.addSource({\n\t\t\t\tfilename: source.filename,\n\t\t\t\tcontent: source.content.clone(),\n\t\t\t\tseparator: source.separator\n\t\t\t});\n\t\t});\n\n\t\treturn bundle;\n\t};\n\n\tBundle.prototype.generateDecodedMap = function generateDecodedMap (options) {\n\t\t\tvar this$1 = this;\n\t\t\tif ( options === void 0 ) options = {};\n\n\t\tvar names = [];\n\t\tthis.sources.forEach(function (source) {\n\t\t\tObject.keys(source.content.storedNames).forEach(function (name) {\n\t\t\t\tif (!~names.indexOf(name)) { names.push(name); }\n\t\t\t});\n\t\t});\n\n\t\tvar mappings = new Mappings(options.hires);\n\n\t\tif (this.intro) {\n\t\t\tmappings.advance(this.intro);\n\t\t}\n\n\t\tthis.sources.forEach(function (source, i) {\n\t\t\tif (i > 0) {\n\t\t\t\tmappings.advance(this$1.separator);\n\t\t\t}\n\n\t\t\tvar sourceIndex = source.filename ? this$1.uniqueSourceIndexByFilename[source.filename] : -1;\n\t\t\tvar magicString = source.content;\n\t\t\tvar locate = getLocator(magicString.original);\n\n\t\t\tif (magicString.intro) {\n\t\t\t\tmappings.advance(magicString.intro);\n\t\t\t}\n\n\t\t\tmagicString.firstChunk.eachNext(function (chunk) {\n\t\t\t\tvar loc = locate(chunk.start);\n\n\t\t\t\tif (chunk.intro.length) { mappings.advance(chunk.intro); }\n\n\t\t\t\tif (source.filename) {\n\t\t\t\t\tif (chunk.edited) {\n\t\t\t\t\t\tmappings.addEdit(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk.content,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tchunk.storeName ? names.indexOf(chunk.original) : -1\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmappings.addUneditedChunk(\n\t\t\t\t\t\t\tsourceIndex,\n\t\t\t\t\t\t\tchunk,\n\t\t\t\t\t\t\tmagicString.original,\n\t\t\t\t\t\t\tloc,\n\t\t\t\t\t\t\tmagicString.sourcemapLocations\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmappings.advance(chunk.content);\n\t\t\t\t}\n\n\t\t\t\tif (chunk.outro.length) { mappings.advance(chunk.outro); }\n\t\t\t});\n\n\t\t\tif (magicString.outro) {\n\t\t\t\tmappings.advance(magicString.outro);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tfile: options.file ? options.file.split(/[/\\\\]/).pop() : null,\n\t\t\tsources: this.uniqueSources.map(function (source) {\n\t\t\t\treturn options.file ? getRelativePath(options.file, source.filename) : source.filename;\n\t\t\t}),\n\t\t\tsourcesContent: this.uniqueSources.map(function (source) {\n\t\t\t\treturn options.includeContent ? source.content : null;\n\t\t\t}),\n\t\t\tnames: names,\n\t\t\tmappings: mappings.raw\n\t\t};\n\t};\n\n\tBundle.prototype.generateMap = function generateMap (options) {\n\t\treturn new SourceMap(this.generateDecodedMap(options));\n\t};\n\n\tBundle.prototype.getIndentString = function getIndentString () {\n\t\tvar indentStringCounts = {};\n\n\t\tthis.sources.forEach(function (source) {\n\t\t\tvar indentStr = source.content.indentStr;\n\n\t\t\tif (indentStr === null) { return; }\n\n\t\t\tif (!indentStringCounts[indentStr]) { indentStringCounts[indentStr] = 0; }\n\t\t\tindentStringCounts[indentStr] += 1;\n\t\t});\n\n\t\treturn (\n\t\t\tObject.keys(indentStringCounts).sort(function (a, b) {\n\t\t\t\treturn indentStringCounts[a] - indentStringCounts[b];\n\t\t\t})[0] || '\\t'\n\t\t);\n\t};\n\n\tBundle.prototype.indent = function indent (indentStr) {\n\t\t\tvar this$1 = this;\n\n\t\tif (!arguments.length) {\n\t\t\tindentStr = this.getIndentString();\n\t\t}\n\n\t\tif (indentStr === '') { return this; } // noop\n\n\t\tvar trailingNewline = !this.intro || this.intro.slice(-1) === '\\n';\n\n\t\tthis.sources.forEach(function (source, i) {\n\t\t\tvar separator = source.separator !== undefined ? source.separator : this$1.separator;\n\t\t\tvar indentStart = trailingNewline || (i > 0 && /\\r?\\n$/.test(separator));\n\n\t\t\tsource.content.indent(indentStr, {\n\t\t\t\texclude: source.indentExclusionRanges,\n\t\t\t\tindentStart: indentStart //: trailingNewline || /\\r?\\n$/.test( separator )  //true///\\r?\\n/.test( separator )\n\t\t\t});\n\n\t\t\ttrailingNewline = source.content.lastChar() === '\\n';\n\t\t});\n\n\t\tif (this.intro) {\n\t\t\tthis.intro =\n\t\t\t\tindentStr +\n\t\t\t\tthis.intro.replace(/^[^\\n]/gm, function (match, index) {\n\t\t\t\t\treturn index > 0 ? indentStr + match : match;\n\t\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tBundle.prototype.prepend = function prepend (str) {\n\t\tthis.intro = str + this.intro;\n\t\treturn this;\n\t};\n\n\tBundle.prototype.toString = function toString () {\n\t\t\tvar this$1 = this;\n\n\t\tvar body = this.sources\n\t\t\t.map(function (source, i) {\n\t\t\t\tvar separator = source.separator !== undefined ? source.separator : this$1.separator;\n\t\t\t\tvar str = (i > 0 ? separator : '') + source.content.toString();\n\n\t\t\t\treturn str;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn this.intro + body;\n\t};\n\n\tBundle.prototype.isEmpty = function isEmpty () {\n\t\tif (this.intro.length && this.intro.trim())\n\t\t\t{ return false; }\n\t\tif (this.sources.some(function (source) { return !source.content.isEmpty(); }))\n\t\t\t{ return false; }\n\t\treturn true;\n\t};\n\n\tBundle.prototype.length = function length () {\n\t\treturn this.sources.reduce(function (length, source) { return length + source.content.length(); }, this.intro.length);\n\t};\n\n\tBundle.prototype.trimLines = function trimLines () {\n\t\treturn this.trim('[\\\\r\\\\n]');\n\t};\n\n\tBundle.prototype.trim = function trim (charType) {\n\t\treturn this.trimStart(charType).trimEnd(charType);\n\t};\n\n\tBundle.prototype.trimStart = function trimStart (charType) {\n\t\tvar rx = new RegExp('^' + (charType || '\\\\s') + '+');\n\t\tthis.intro = this.intro.replace(rx, '');\n\n\t\tif (!this.intro) {\n\t\t\tvar source;\n\t\t\tvar i = 0;\n\n\t\t\tdo {\n\t\t\t\tsource = this.sources[i++];\n\t\t\t\tif (!source) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (!source.content.trimStartAborted(charType));\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tBundle.prototype.trimEnd = function trimEnd (charType) {\n\t\tvar rx = new RegExp((charType || '\\\\s') + '+$');\n\n\t\tvar source;\n\t\tvar i = this.sources.length - 1;\n\n\t\tdo {\n\t\t\tsource = this.sources[i--];\n\t\t\tif (!source) {\n\t\t\t\tthis.intro = this.intro.replace(rx, '');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (!source.content.trimEndAborted(charType));\n\n\t\treturn this;\n\t};\n\n\tMagicString.Bundle = Bundle;\n\tMagicString.SourceMap = SourceMap;\n\tMagicString.default = MagicString; // work around TypeScript bug https://github.com/Rich-Harris/magic-string/pull/121\n\n\treturn MagicString;\n\n}));\n//# sourceMappingURL=magic-string.umd.js.map\n"
  },
  {
    "path": "common/Tests/External/qunit-1.23.1.css",
    "content": "/*!\n * QUnit 1.23.1\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2016-04-12T17:29Z\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n\n/** Resets */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n\n/** Header */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #8699A4;\n\tbackground-color: #0D3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: 400;\n\n\tborder-radius: 5px 5px 0 0;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: #C2CCD1;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #FFF;\n}\n\n#qunit-testrunner-toolbar label {\n\tdisplay: inline-block;\n\tpadding: 0 0.5em 0 0.1em;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tcolor: #5E740B;\n\tbackground-color: #EEE;\n\toverflow: hidden;\n}\n\n#qunit-filteredTest {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tbackground-color: #F4FF77;\n\tcolor: #366097;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tbackground-color: #2B81AF;\n\tcolor: #FFF;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n#qunit-modulefilter-container {\n\tfloat: right;\n\tpadding: 0.2em;\n}\n\n.qunit-url-config {\n\tdisplay: inline-block;\n\tpadding: 0.1em;\n}\n\n.qunit-filter {\n\tdisplay: block;\n\tfloat: right;\n\tmargin-left: 1em;\n}\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 1em 0.4em 1em;\n\tborder-bottom: 1px solid #FFF;\n\tlist-style-position: inside;\n}\n\n#qunit-tests > li {\n\tdisplay: none;\n}\n\n#qunit-tests li.running,\n#qunit-tests li.pass,\n#qunit-tests li.fail,\n#qunit-tests li.skipped {\n\tdisplay: list-item;\n}\n\n#qunit-tests.hidepass {\n\tposition: relative;\n}\n\n#qunit-tests.hidepass li.running,\n#qunit-tests.hidepass li.pass {\n\tvisibility: hidden;\n\tposition: absolute;\n\twidth:   0;\n\theight:  0;\n\tpadding: 0;\n\tborder:  0;\n\tmargin:  0;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li.skipped strong {\n\tcursor: default;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: #C2CCD1;\n\ttext-decoration: none;\n}\n\n#qunit-tests li p a {\n\tpadding: 0.25em;\n\tcolor: #6B6464;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #000;\n}\n\n#qunit-tests li .runtime {\n\tfloat: right;\n\tfont-size: smaller;\n}\n\n.qunit-assert-list {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #FFF;\n\n\tborder-radius: 5px;\n}\n\n.qunit-source {\n\tmargin: 0.6em 0 0.3em;\n}\n\n.qunit-collapsed {\n\tdisplay: none;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: 0.2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 0.5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tbackground-color: #E0F2BE;\n\tcolor: #374E0C;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tbackground-color: #FFCACA;\n\tcolor: #500;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: #000; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tpadding: 5px;\n\tbackground-color: #FFF;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n#qunit-tests li li.pass {\n\tcolor: #3C510C;\n\tbackground-color: #FFF;\n\tborder-left: 10px solid #C6E746;\n}\n\n#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }\n#qunit-tests .pass .test-name               { color: #366097; }\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #FFF;\n\tborder-left: 10px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 5px 5px;\n}\n\n#qunit-tests .fail                          { color: #000; background-color: #EE5757; }\n#qunit-tests .fail .test-name,\n#qunit-tests .fail .module-name             { color: #000; }\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: #008000; }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n/*** Skipped tests */\n\n#qunit-tests .skipped {\n\tbackground-color: #EBECE9;\n}\n\n#qunit-tests .qunit-skipped-label {\n\tbackground-color: #F4FF77;\n\tdisplay: inline-block;\n\tfont-style: normal;\n\tcolor: #366097;\n\tline-height: 1.8em;\n\tpadding: 0 0.5em;\n\tmargin: -0.4em 0.4em -0.4em 0;\n}\n\n/** Result */\n\n#qunit-testresult {\n\tpadding: 0.5em 1em 0.5em 1em;\n\n\tcolor: #2B81AF;\n\tbackground-color: #D2E0E6;\n\n\tborder-bottom: 1px solid #FFF;\n}\n#qunit-testresult .module-name {\n\tfont-weight: 700;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n\twidth: 1000px;\n\theight: 1000px;\n}\n"
  },
  {
    "path": "common/Tests/External/qunit-1.23.1.js",
    "content": "/*!\n * QUnit 1.23.1\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2016-04-12T17:29Z\n */\n\n( function( global ) {\n\nvar QUnit = {};\n\nvar Date = global.Date;\nvar now = Date.now || function() {\n\treturn new Date().getTime();\n};\n\nvar setTimeout = global.setTimeout;\nvar clearTimeout = global.clearTimeout;\n\n// Store a local window from the global to allow direct references.\nvar window = global.window;\n\nvar defined = {\n\tdocument: window && window.document !== undefined,\n\tsetTimeout: setTimeout !== undefined,\n\tsessionStorage: ( function() {\n\t\tvar x = \"qunit-test-string\";\n\t\ttry {\n\t\t\tsessionStorage.setItem( x, x );\n\t\t\tsessionStorage.removeItem( x );\n\t\t\treturn true;\n\t\t} catch ( e ) {\n\t\t\treturn false;\n\t\t}\n\t}() )\n};\n\nvar fileName = ( sourceFromStacktrace( 0 ) || \"\" ).replace( /(:\\d+)+\\)?/, \"\" ).replace( /.+\\//, \"\" );\nvar globalStartCalled = false;\nvar runStarted = false;\n\nvar toString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty;\n\n// Returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar i, j,\n\t\tresult = a.slice();\n\n\tfor ( i = 0; i < result.length; i++ ) {\n\t\tfor ( j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[ i ] === b[ j ] ) {\n\t\t\t\tresult.splice( i, 1 );\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\n// From jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Makes a clone of an object using only Array or Object as base,\n * and copies over the own enumerable properties.\n *\n * @param {Object} obj\n * @return {Object} New object with only the own properties (recursively).\n */\nfunction objectValues ( obj ) {\n\tvar key, val,\n\t\tvals = QUnit.is( \"array\", obj ) ? [] : {};\n\tfor ( key in obj ) {\n\t\tif ( hasOwn.call( obj, key ) ) {\n\t\t\tval = obj[ key ];\n\t\t\tvals[ key ] = val === Object( val ) ? objectValues( val ) : val;\n\t\t}\n\t}\n\treturn vals;\n}\n\nfunction extend( a, b, undefOnly ) {\n\tfor ( var prop in b ) {\n\t\tif ( hasOwn.call( b, prop ) ) {\n\n\t\t\t// Avoid \"Member not found\" error in IE8 caused by messing with window.constructor\n\t\t\t// This block runs on every environment, so `global` is being used instead of `window`\n\t\t\t// to avoid errors on node.\n\t\t\tif ( prop !== \"constructor\" || a !== global ) {\n\t\t\t\tif ( b[ prop ] === undefined ) {\n\t\t\t\t\tdelete a[ prop ];\n\t\t\t\t} else if ( !( undefOnly && typeof a[ prop ] !== \"undefined\" ) ) {\n\t\t\t\t\ta[ prop ] = b[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n}\n\nfunction objectType( obj ) {\n\tif ( typeof obj === \"undefined\" ) {\n\t\treturn \"undefined\";\n\t}\n\n\t// Consider: typeof null === object\n\tif ( obj === null ) {\n\t\treturn \"null\";\n\t}\n\n\tvar match = toString.call( obj ).match( /^\\[object\\s(.*)\\]$/ ),\n\t\ttype = match && match[ 1 ];\n\n\tswitch ( type ) {\n\t\tcase \"Number\":\n\t\t\tif ( isNaN( obj ) ) {\n\t\t\t\treturn \"nan\";\n\t\t\t}\n\t\t\treturn \"number\";\n\t\tcase \"String\":\n\t\tcase \"Boolean\":\n\t\tcase \"Array\":\n\t\tcase \"Set\":\n\t\tcase \"Map\":\n\t\tcase \"Date\":\n\t\tcase \"RegExp\":\n\t\tcase \"Function\":\n\t\tcase \"Symbol\":\n\t\t\treturn type.toLowerCase();\n\t}\n\tif ( typeof obj === \"object\" ) {\n\t\treturn \"object\";\n\t}\n}\n\n// Safe object type checking\nfunction is( type, obj ) {\n\treturn QUnit.objectType( obj ) === type;\n}\n\n// Doesn't support IE6 to IE9, it will return undefined on these browsers\n// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\nfunction extractStacktrace( e, offset ) {\n\toffset = offset === undefined ? 4 : offset;\n\n\tvar stack, include, i;\n\n\tif ( e.stack ) {\n\t\tstack = e.stack.split( \"\\n\" );\n\t\tif ( /^error$/i.test( stack[ 0 ] ) ) {\n\t\t\tstack.shift();\n\t\t}\n\t\tif ( fileName ) {\n\t\t\tinclude = [];\n\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n\t\t\t\tif ( stack[ i ].indexOf( fileName ) !== -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tinclude.push( stack[ i ] );\n\t\t\t}\n\t\t\tif ( include.length ) {\n\t\t\t\treturn include.join( \"\\n\" );\n\t\t\t}\n\t\t}\n\t\treturn stack[ offset ];\n\n\t// Support: Safari <=6 only\n\t} else if ( e.sourceURL ) {\n\n\t\t// Exclude useless self-reference for generated Error objects\n\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For actual exceptions, this is useful\n\t\treturn e.sourceURL + \":\" + e.line;\n\t}\n}\n\nfunction sourceFromStacktrace( offset ) {\n\tvar error = new Error();\n\n\t// Support: Safari <=7 only, IE <=10 - 11 only\n\t// Not all browsers generate the `stack` property for `new Error()`, see also #636\n\tif ( !error.stack ) {\n\t\ttry {\n\t\t\tthrow error;\n\t\t} catch ( err ) {\n\t\t\terror = err;\n\t\t}\n\t}\n\n\treturn extractStacktrace( error, offset );\n}\n\n/**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\nvar config = {\n\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// Block until document ready\n\tblocking: true,\n\n\t// By default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// By default, modify document.title when suite is done\n\taltertitle: true,\n\n\t// HTML Reporter: collapse every test except the first failing test\n\t// If false, all failing tests will be expanded\n\tcollapse: true,\n\n\t// By default, scroll to top of the page when suite is done\n\tscrolltop: true,\n\n\t// Depth up-to which object will be dumped\n\tmaxDepth: 5,\n\n\t// When enabled, all tests must call expect()\n\trequireExpects: false,\n\n\t// Placeholder for user-configurable form-exposed URL parameters\n\turlConfig: [],\n\n\t// Set of all modules.\n\tmodules: [],\n\n\t// Stack of nested modules\n\tmoduleStack: [],\n\n\t// The first unnamed module\n\tcurrentModule: {\n\t\tname: \"\",\n\t\ttests: []\n\t},\n\n\tcallbacks: {}\n};\n\n// Push a loose unnamed module to the modules collection\nconfig.modules.push( config.currentModule );\n\nvar loggingCallbacks = {};\n\n// Register logging callbacks\nfunction registerLoggingCallbacks( obj ) {\n\tvar i, l, key,\n\t\tcallbackNames = [ \"begin\", \"done\", \"log\", \"testStart\", \"testDone\",\n\t\t\t\"moduleStart\", \"moduleDone\" ];\n\n\tfunction registerLoggingCallback( key ) {\n\t\tvar loggingCallback = function( callback ) {\n\t\t\tif ( objectType( callback ) !== \"function\" ) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"QUnit logging methods require a callback function as their first parameters.\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconfig.callbacks[ key ].push( callback );\n\t\t};\n\n\t\t// DEPRECATED: This will be removed on QUnit 2.0.0+\n\t\t// Stores the registered functions allowing restoring\n\t\t// at verifyLoggingCallbacks() if modified\n\t\tloggingCallbacks[ key ] = loggingCallback;\n\n\t\treturn loggingCallback;\n\t}\n\n\tfor ( i = 0, l = callbackNames.length; i < l; i++ ) {\n\t\tkey = callbackNames[ i ];\n\n\t\t// Initialize key collection of logging callback\n\t\tif ( objectType( config.callbacks[ key ] ) === \"undefined\" ) {\n\t\t\tconfig.callbacks[ key ] = [];\n\t\t}\n\n\t\tobj[ key ] = registerLoggingCallback( key );\n\t}\n}\n\nfunction runLoggingCallbacks( key, args ) {\n\tvar i, l, callbacks;\n\n\tcallbacks = config.callbacks[ key ];\n\tfor ( i = 0, l = callbacks.length; i < l; i++ ) {\n\t\tcallbacks[ i ]( args );\n\t}\n}\n\n// DEPRECATED: This will be removed on 2.0.0+\n// This function verifies if the loggingCallbacks were modified by the user\n// If so, it will restore it, assign the given callback and print a console warning\nfunction verifyLoggingCallbacks() {\n\tvar loggingCallback, userCallback;\n\n\tfor ( loggingCallback in loggingCallbacks ) {\n\t\tif ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) {\n\n\t\t\tuserCallback = QUnit[ loggingCallback ];\n\n\t\t\t// Restore the callback function\n\t\t\tQUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ];\n\n\t\t\t// Assign the deprecated given callback\n\t\t\tQUnit[ loggingCallback ]( userCallback );\n\n\t\t\tif ( global.console && global.console.warn ) {\n\t\t\t\tglobal.console.warn(\n\t\t\t\t\t\"QUnit.\" + loggingCallback + \" was replaced with a new value.\\n\" +\n\t\t\t\t\t\"Please, check out the documentation on how to apply logging callbacks.\\n\" +\n\t\t\t\t\t\"Reference: https://api.qunitjs.com/category/callbacks/\"\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\n( function() {\n\tif ( !defined.document ) {\n\t\treturn;\n\t}\n\n\t// `onErrorFnPrev` initialized at top of scope\n\t// Preserve other handlers\n\tvar onErrorFnPrev = window.onerror;\n\n\t// Cover uncaught exceptions\n\t// Returning true will suppress the default browser handler,\n\t// returning false will let it run.\n\twindow.onerror = function( error, filePath, linerNr ) {\n\t\tvar ret = false;\n\t\tif ( onErrorFnPrev ) {\n\t\t\tret = onErrorFnPrev( error, filePath, linerNr );\n\t\t}\n\n\t\t// Treat return value as window.onerror itself does,\n\t\t// Only do our handling if not suppressed.\n\t\tif ( ret !== true ) {\n\t\t\tif ( QUnit.config.current ) {\n\t\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t} else {\n\t\t\t\tQUnit.test( \"global failure\", extend( function() {\n\t\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t\t}, { validTest: true } ) );\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\treturn ret;\n\t};\n}() );\n\n// Figure out if we're running the tests from a server or not\nQUnit.isLocal = !( defined.document && window.location.protocol !== \"file:\" );\n\n// Expose the current QUnit version\nQUnit.version = \"1.23.1\";\n\nextend( QUnit, {\n\n\t// Call on start of module test to prepend name to all tests\n\tmodule: function( name, testEnvironment, executeNow ) {\n\t\tvar module, moduleFns;\n\t\tvar currentModule = config.currentModule;\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tif ( objectType( testEnvironment ) === \"function\" ) {\n\t\t\t\texecuteNow = testEnvironment;\n\t\t\t\ttestEnvironment = undefined;\n\t\t\t}\n\t\t}\n\n\t\t// DEPRECATED: handles setup/teardown functions,\n\t\t// beforeEach and afterEach should be used instead\n\t\tif ( testEnvironment && testEnvironment.setup ) {\n\t\t\ttestEnvironment.beforeEach = testEnvironment.setup;\n\t\t\tdelete testEnvironment.setup;\n\t\t}\n\t\tif ( testEnvironment && testEnvironment.teardown ) {\n\t\t\ttestEnvironment.afterEach = testEnvironment.teardown;\n\t\t\tdelete testEnvironment.teardown;\n\t\t}\n\n\t\tmodule = createModule();\n\n\t\tmoduleFns = {\n\t\t\tbeforeEach: setHook( module, \"beforeEach\" ),\n\t\t\tafterEach: setHook( module, \"afterEach\" )\n\t\t};\n\n\t\tif ( objectType( executeNow ) === \"function\" ) {\n\t\t\tconfig.moduleStack.push( module );\n\t\t\tsetCurrentModule( module );\n\t\t\texecuteNow.call( module.testEnvironment, moduleFns );\n\t\t\tconfig.moduleStack.pop();\n\t\t\tmodule = module.parentModule || currentModule;\n\t\t}\n\n\t\tsetCurrentModule( module );\n\n\t\tfunction createModule() {\n\t\t\tvar parentModule = config.moduleStack.length ?\n\t\t\t\tconfig.moduleStack.slice( -1 )[ 0 ] : null;\n\t\t\tvar moduleName = parentModule !== null ?\n\t\t\t\t[ parentModule.name, name ].join( \" > \" ) : name;\n\t\t\tvar module = {\n\t\t\t\tname: moduleName,\n\t\t\t\tparentModule: parentModule,\n\t\t\t\ttests: [],\n\t\t\t\tmoduleId: generateHash( moduleName )\n\t\t\t};\n\n\t\t\tvar env = {};\n\t\t\tif ( parentModule ) {\n\t\t\t\textend( env, parentModule.testEnvironment );\n\t\t\t\tdelete env.beforeEach;\n\t\t\t\tdelete env.afterEach;\n\t\t\t}\n\t\t\textend( env, testEnvironment );\n\t\t\tmodule.testEnvironment = env;\n\n\t\t\tconfig.modules.push( module );\n\t\t\treturn module;\n\t\t}\n\n\t\tfunction setCurrentModule( module ) {\n\t\t\tconfig.currentModule = module;\n\t\t}\n\n\t},\n\n\t// DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0.\n\tasyncTest: asyncTest,\n\n\ttest: test,\n\n\tskip: skip,\n\n\tonly: only,\n\n\t// DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0.\n\t// In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior.\n\tstart: function( count ) {\n\t\tvar globalStartAlreadyCalled = globalStartCalled;\n\n\t\tif ( !config.current ) {\n\t\t\tglobalStartCalled = true;\n\n\t\t\tif ( runStarted ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context while already started\" );\n\t\t\t} else if ( globalStartAlreadyCalled || count > 1 ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context too many times\" );\n\t\t\t} else if ( config.autostart ) {\n\t\t\t\tthrow new Error( \"Called start() outside of a test context when \" +\n\t\t\t\t\t\"QUnit.config.autostart was true\" );\n\t\t\t} else if ( !config.pageLoaded ) {\n\n\t\t\t\t// The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it\n\t\t\t\tconfig.autostart = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// If a test is running, adjust its semaphore\n\t\t\tconfig.current.semaphore -= count || 1;\n\n\t\t\t// If semaphore is non-numeric, throw error\n\t\t\tif ( isNaN( config.current.semaphore ) ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\n\t\t\t\tQUnit.pushFailure(\n\t\t\t\t\t\"Called start() with a non-numeric decrement.\",\n\t\t\t\t\tsourceFromStacktrace( 2 )\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Don't start until equal number of stop-calls\n\t\t\tif ( config.current.semaphore > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Throw an Error if start is called more often than stop\n\t\t\tif ( config.current.semaphore < 0 ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\n\t\t\t\tQUnit.pushFailure(\n\t\t\t\t\t\"Called start() while already started (test's semaphore was 0 already)\",\n\t\t\t\t\tsourceFromStacktrace( 2 )\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tresumeProcessing();\n\t},\n\n\t// DEPRECATED: QUnit.stop() will be removed in QUnit 2.0.\n\tstop: function( count ) {\n\n\t\t// If there isn't a test running, don't allow QUnit.stop() to be called\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"Called stop() outside of a test context\" );\n\t\t}\n\n\t\t// If a test is running, adjust its semaphore\n\t\tconfig.current.semaphore += count || 1;\n\n\t\tpauseProcessing();\n\t},\n\n\tconfig: config,\n\n\tis: is,\n\n\tobjectType: objectType,\n\n\textend: extend,\n\n\tload: function() {\n\t\tconfig.pageLoaded = true;\n\n\t\t// Initialize the configuration options\n\t\textend( config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: 0,\n\t\t\tupdateRate: 1000,\n\t\t\tautostart: true,\n\t\t\tfilter: \"\"\n\t\t}, true );\n\n\t\tconfig.blocking = false;\n\n\t\tif ( config.autostart ) {\n\t\t\tresumeProcessing();\n\t\t}\n\t},\n\n\tstack: function( offset ) {\n\t\toffset = ( offset || 0 ) + 2;\n\t\treturn sourceFromStacktrace( offset );\n\t}\n} );\n\nregisterLoggingCallbacks( QUnit );\n\nfunction begin() {\n\tvar i, l,\n\t\tmodulesLog = [];\n\n\t// If the test run hasn't officially begun yet\n\tif ( !config.started ) {\n\n\t\t// Record the time of the test run's beginning\n\t\tconfig.started = now();\n\n\t\tverifyLoggingCallbacks();\n\n\t\t// Delete the loose unnamed module if unused.\n\t\tif ( config.modules[ 0 ].name === \"\" && config.modules[ 0 ].tests.length === 0 ) {\n\t\t\tconfig.modules.shift();\n\t\t}\n\n\t\t// Avoid unnecessary information by not logging modules' test environments\n\t\tfor ( i = 0, l = config.modules.length; i < l; i++ ) {\n\t\t\tmodulesLog.push( {\n\t\t\t\tname: config.modules[ i ].name,\n\t\t\t\ttests: config.modules[ i ].tests\n\t\t\t} );\n\t\t}\n\n\t\t// The test run is officially beginning now\n\t\trunLoggingCallbacks( \"begin\", {\n\t\t\ttotalTests: Test.count,\n\t\t\tmodules: modulesLog\n\t\t} );\n\t}\n\n\tconfig.blocking = false;\n\tprocess( true );\n}\n\nfunction process( last ) {\n\tfunction next() {\n\t\tprocess( last );\n\t}\n\tvar start = now();\n\tconfig.depth = ( config.depth || 0 ) + 1;\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( !defined.setTimeout || config.updateRate <= 0 ||\n\t\t\t\t( ( now() - start ) < config.updateRate ) ) {\n\t\t\tif ( config.current ) {\n\n\t\t\t\t// Reset async tracking for each phase of the Test lifecycle\n\t\t\t\tconfig.current.usedAsync = false;\n\t\t\t}\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\tsetTimeout( next, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tconfig.depth--;\n\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n\t\tdone();\n\t}\n}\n\nfunction pauseProcessing() {\n\tconfig.blocking = true;\n\n\tif ( config.testTimeout && defined.setTimeout ) {\n\t\tclearTimeout( config.timeout );\n\t\tconfig.timeout = setTimeout( function() {\n\t\t\tif ( config.current ) {\n\t\t\t\tconfig.current.semaphore = 0;\n\t\t\t\tQUnit.pushFailure( \"Test timed out\", sourceFromStacktrace( 2 ) );\n\t\t\t} else {\n\t\t\t\tthrow new Error( \"Test timed out\" );\n\t\t\t}\n\t\t\tresumeProcessing();\n\t\t}, config.testTimeout );\n\t}\n}\n\nfunction resumeProcessing() {\n\trunStarted = true;\n\n\t// A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)\n\tif ( defined.setTimeout ) {\n\t\tsetTimeout( function() {\n\t\t\tif ( config.current && config.current.semaphore > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( config.timeout ) {\n\t\t\t\tclearTimeout( config.timeout );\n\t\t\t}\n\n\t\t\tbegin();\n\t\t}, 13 );\n\t} else {\n\t\tbegin();\n\t}\n}\n\nfunction done() {\n\tvar runtime, passed;\n\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.previousModule ) {\n\t\trunLoggingCallbacks( \"moduleDone\", {\n\t\t\tname: config.previousModule.name,\n\t\t\ttests: config.previousModule.tests,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all,\n\t\t\truntime: now() - config.moduleStats.started\n\t\t} );\n\t}\n\tdelete config.previousModule;\n\n\truntime = now() - config.started;\n\tpassed = config.stats.all - config.stats.bad;\n\n\trunLoggingCallbacks( \"done\", {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t} );\n}\n\nfunction setHook( module, hookName ) {\n\tif ( module.testEnvironment === undefined ) {\n\t\tmodule.testEnvironment = {};\n\t}\n\n\treturn function( callback ) {\n\t\tmodule.testEnvironment[ hookName ] = callback;\n\t};\n}\n\nvar focused = false;\nvar priorityCount = 0;\nvar unitSampler;\n\nfunction Test( settings ) {\n\tvar i, l;\n\n\t++Test.count;\n\n\textend( this, settings );\n\tthis.assertions = [];\n\tthis.semaphore = 0;\n\tthis.usedAsync = false;\n\tthis.module = config.currentModule;\n\tthis.stack = sourceFromStacktrace( 3 );\n\n\t// Register unique strings\n\tfor ( i = 0, l = this.module.tests; i < l.length; i++ ) {\n\t\tif ( this.module.tests[ i ].name === this.testName ) {\n\t\t\tthis.testName += \" \";\n\t\t}\n\t}\n\n\tthis.testId = generateHash( this.module.name, this.testName );\n\n\tthis.module.tests.push( {\n\t\tname: this.testName,\n\t\ttestId: this.testId\n\t} );\n\n\tif ( settings.skip ) {\n\n\t\t// Skipped tests will fully ignore any sent callback\n\t\tthis.callback = function() {};\n\t\tthis.async = false;\n\t\tthis.expected = 0;\n\t} else {\n\t\tthis.assert = new Assert( this );\n\t}\n}\n\nTest.count = 0;\n\nTest.prototype = {\n\tbefore: function() {\n\t\tif (\n\n\t\t\t// Emit moduleStart when we're switching from one module to another\n\t\t\tthis.module !== config.previousModule ||\n\n\t\t\t\t// They could be equal (both undefined) but if the previousModule property doesn't\n\t\t\t\t// yet exist it means this is the first test in a suite that isn't wrapped in a\n\t\t\t\t// module, in which case we'll just emit a moduleStart event for 'undefined'.\n\t\t\t\t// Without this, reporters can get testStart before moduleStart  which is a problem.\n\t\t\t\t!hasOwn.call( config, \"previousModule\" )\n\t\t) {\n\t\t\tif ( hasOwn.call( config, \"previousModule\" ) ) {\n\t\t\t\trunLoggingCallbacks( \"moduleDone\", {\n\t\t\t\t\tname: config.previousModule.name,\n\t\t\t\t\ttests: config.previousModule.tests,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all,\n\t\t\t\t\truntime: now() - config.moduleStats.started\n\t\t\t\t} );\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0, started: now() };\n\t\t\trunLoggingCallbacks( \"moduleStart\", {\n\t\t\t\tname: this.module.name,\n\t\t\t\ttests: this.module.tests\n\t\t\t} );\n\t\t}\n\n\t\tconfig.current = this;\n\n\t\tif ( this.module.testEnvironment ) {\n\t\t\tdelete this.module.testEnvironment.beforeEach;\n\t\t\tdelete this.module.testEnvironment.afterEach;\n\t\t}\n\t\tthis.testEnvironment = extend( {}, this.module.testEnvironment );\n\n\t\tthis.started = now();\n\t\trunLoggingCallbacks( \"testStart\", {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module.name,\n\t\t\ttestId: this.testId\n\t\t} );\n\n\t\tif ( !config.pollution ) {\n\t\t\tsaveGlobal();\n\t\t}\n\t},\n\n\trun: function() {\n\t\tvar promise;\n\n\t\tconfig.current = this;\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tthis.callbackStarted = now();\n\n\t\tif ( config.notrycatch ) {\n\t\t\trunTest( this );\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\trunTest( this );\n\t\t} catch ( e ) {\n\t\t\tthis.pushFailure( \"Died on test #\" + ( this.assertions.length + 1 ) + \" \" +\n\t\t\t\tthis.stack + \": \" + ( e.message || e ), extractStacktrace( e, 0 ) );\n\n\t\t\t// Else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tQUnit.start();\n\t\t\t}\n\t\t}\n\n\t\tfunction runTest( test ) {\n\t\t\tpromise = test.callback.call( test.testEnvironment, test.assert );\n\t\t\ttest.resolvePromise( promise );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tcheckPollution();\n\t},\n\n\tqueueHook: function( hook, hookName ) {\n\t\tvar promise,\n\t\t\ttest = this;\n\t\treturn function runHook() {\n\t\t\tconfig.current = test;\n\t\t\tif ( config.notrycatch ) {\n\t\t\t\tcallHook();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tcallHook();\n\t\t\t} catch ( error ) {\n\t\t\t\ttest.pushFailure( hookName + \" failed on \" + test.testName + \": \" +\n\t\t\t\t( error.message || error ), extractStacktrace( error, 0 ) );\n\t\t\t}\n\n\t\t\tfunction callHook() {\n\t\t\t\tpromise = hook.call( test.testEnvironment, test.assert );\n\t\t\t\ttest.resolvePromise( promise, hookName );\n\t\t\t}\n\t\t};\n\t},\n\n\t// Currently only used for module level hooks, can be used to add global level ones\n\thooks: function( handler ) {\n\t\tvar hooks = [];\n\n\t\tfunction processHooks( test, module ) {\n\t\t\tif ( module.parentModule ) {\n\t\t\t\tprocessHooks( test, module.parentModule );\n\t\t\t}\n\t\t\tif ( module.testEnvironment &&\n\t\t\t\tQUnit.objectType( module.testEnvironment[ handler ] ) === \"function\" ) {\n\t\t\t\thooks.push( test.queueHook( module.testEnvironment[ handler ], handler ) );\n\t\t\t}\n\t\t}\n\n\t\t// Hooks are ignored on skipped tests\n\t\tif ( !this.skip ) {\n\t\t\tprocessHooks( this, this.module );\n\t\t}\n\t\treturn hooks;\n\t},\n\n\tfinish: function() {\n\t\tconfig.current = this;\n\t\tif ( config.requireExpects && this.expected === null ) {\n\t\t\tthis.pushFailure( \"Expected number of assertions to be defined, but expect() was \" +\n\t\t\t\t\"not called.\", this.stack );\n\t\t} else if ( this.expected !== null && this.expected !== this.assertions.length ) {\n\t\t\tthis.pushFailure( \"Expected \" + this.expected + \" assertions, but \" +\n\t\t\t\tthis.assertions.length + \" were run\", this.stack );\n\t\t} else if ( this.expected === null && !this.assertions.length ) {\n\t\t\tthis.pushFailure( \"Expected at least one assertion, but none were run - call \" +\n\t\t\t\t\"expect(0) to accept zero assertions.\", this.stack );\n\t\t}\n\n\t\tvar i,\n\t\t\tbad = 0;\n\n\t\tthis.runtime = now() - this.started;\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\tif ( !this.assertions[ i ].result ) {\n\t\t\t\tbad++;\n\t\t\t\tconfig.stats.bad++;\n\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"testDone\", {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module.name,\n\t\t\tskipped: !!this.skip,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length,\n\t\t\truntime: this.runtime,\n\n\t\t\t// HTML Reporter use\n\t\t\tassertions: this.assertions,\n\t\t\ttestId: this.testId,\n\n\t\t\t// Source of Test\n\t\t\tsource: this.stack,\n\n\t\t\t// DEPRECATED: this property will be removed in 2.0.0, use runtime instead\n\t\t\tduration: this.runtime\n\t\t} );\n\n\t\t// QUnit.reset() is deprecated and will be replaced for a new\n\t\t// fixture reset function on QUnit 2.0/2.1.\n\t\t// It's still called here for backwards compatibility handling\n\t\tQUnit.reset();\n\n\t\tconfig.current = undefined;\n\t},\n\n\tqueue: function() {\n\t\tvar priority,\n\t\t\ttest = this;\n\n\t\tif ( !this.valid() ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfunction run() {\n\n\t\t\t// Each of these can by async\n\t\t\tsynchronize( [\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.before();\n\t\t\t\t},\n\n\t\t\t\ttest.hooks( \"beforeEach\" ),\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.run();\n\t\t\t\t},\n\n\t\t\t\ttest.hooks( \"afterEach\" ).reverse(),\n\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.after();\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\ttest.finish();\n\t\t\t\t}\n\t\t\t] );\n\t\t}\n\n\t\t// Prioritize previously failed tests, detected from sessionStorage\n\t\tpriority = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t\t+sessionStorage.getItem( \"qunit-test-\" + this.module.name + \"-\" + this.testName );\n\n\t\treturn synchronize( run, priority, config.seed );\n\t},\n\n\tpushResult: function( resultInfo ) {\n\n\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n\t\tvar source,\n\t\t\tdetails = {\n\t\t\t\tmodule: this.module.name,\n\t\t\t\tname: this.testName,\n\t\t\t\tresult: resultInfo.result,\n\t\t\t\tmessage: resultInfo.message,\n\t\t\t\tactual: resultInfo.actual,\n\t\t\t\texpected: resultInfo.expected,\n\t\t\t\ttestId: this.testId,\n\t\t\t\tnegative: resultInfo.negative || false,\n\t\t\t\truntime: now() - this.started\n\t\t\t};\n\n\t\tif ( !resultInfo.result ) {\n\t\t\tsource = sourceFromStacktrace();\n\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", details );\n\n\t\tthis.assertions.push( {\n\t\t\tresult: !!resultInfo.result,\n\t\t\tmessage: resultInfo.message\n\t\t} );\n\t},\n\n\tpushFailure: function( message, source, actual ) {\n\t\tif ( !( this instanceof Test ) ) {\n\t\t\tthrow new Error( \"pushFailure() assertion outside test context, was \" +\n\t\t\t\tsourceFromStacktrace( 2 ) );\n\t\t}\n\n\t\tvar details = {\n\t\t\t\tmodule: this.module.name,\n\t\t\t\tname: this.testName,\n\t\t\t\tresult: false,\n\t\t\t\tmessage: message || \"error\",\n\t\t\t\tactual: actual || null,\n\t\t\t\ttestId: this.testId,\n\t\t\t\truntime: now() - this.started\n\t\t\t};\n\n\t\tif ( source ) {\n\t\t\tdetails.source = source;\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", details );\n\n\t\tthis.assertions.push( {\n\t\t\tresult: false,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tresolvePromise: function( promise, phase ) {\n\t\tvar then, message,\n\t\t\ttest = this;\n\t\tif ( promise != null ) {\n\t\t\tthen = promise.then;\n\t\t\tif ( QUnit.objectType( then ) === \"function\" ) {\n\t\t\t\tQUnit.stop();\n\t\t\t\tthen.call(\n\t\t\t\t\tpromise,\n\t\t\t\t\tfunction() { QUnit.start(); },\n\t\t\t\t\tfunction( error ) {\n\t\t\t\t\t\tmessage = \"Promise rejected \" +\n\t\t\t\t\t\t\t( !phase ? \"during\" : phase.replace( /Each$/, \"\" ) ) +\n\t\t\t\t\t\t\t\" \" + test.testName + \": \" + ( error.message || error );\n\t\t\t\t\t\ttest.pushFailure( message, extractStacktrace( error, 0 ) );\n\n\t\t\t\t\t\t// Else next test will carry the responsibility\n\t\t\t\t\t\tsaveGlobal();\n\n\t\t\t\t\t\t// Unblock\n\t\t\t\t\t\tQUnit.start();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tvalid: function() {\n\t\tvar filter = config.filter,\n\t\t\tregexFilter = /^(!?)\\/([\\w\\W]*)\\/(i?$)/.exec( filter ),\n\t\t\tmodule = config.module && config.module.toLowerCase(),\n\t\t\tfullName = ( this.module.name + \": \" + this.testName );\n\n\t\tfunction moduleChainNameMatch( testModule ) {\n\t\t\tvar testModuleName = testModule.name ? testModule.name.toLowerCase() : null;\n\t\t\tif ( testModuleName === module ) {\n\t\t\t\treturn true;\n\t\t\t} else if ( testModule.parentModule ) {\n\t\t\t\treturn moduleChainNameMatch( testModule.parentModule );\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfunction moduleChainIdMatch( testModule ) {\n\t\t\treturn inArray( testModule.moduleId, config.moduleId ) > -1 ||\n\t\t\t\ttestModule.parentModule && moduleChainIdMatch( testModule.parentModule );\n\t\t}\n\n\t\t// Internally-generated tests are always valid\n\t\tif ( this.callback && this.callback.validTest ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( config.moduleId && config.moduleId.length > 0 &&\n\t\t\t!moduleChainIdMatch( this.module ) ) {\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( config.testId && config.testId.length > 0 &&\n\t\t\tinArray( this.testId, config.testId ) < 0 ) {\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( module && !moduleChainNameMatch( this.module ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !filter ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn regexFilter ?\n\t\t\tthis.regexFilter( !!regexFilter[ 1 ], regexFilter[ 2 ], regexFilter[ 3 ], fullName ) :\n\t\t\tthis.stringFilter( filter, fullName );\n\t},\n\n\tregexFilter: function( exclude, pattern, flags, fullName ) {\n\t\tvar regex = new RegExp( pattern, flags );\n\t\tvar match = regex.test( fullName );\n\n\t\treturn match !== exclude;\n\t},\n\n\tstringFilter: function( filter, fullName ) {\n\t\tfilter = filter.toLowerCase();\n\t\tfullName = fullName.toLowerCase();\n\n\t\tvar include = filter.charAt( 0 ) !== \"!\";\n\t\tif ( !include ) {\n\t\t\tfilter = filter.slice( 1 );\n\t\t}\n\n\t\t// If the filter matches, we need to honour include\n\t\tif ( fullName.indexOf( filter ) !== -1 ) {\n\t\t\treturn include;\n\t\t}\n\n\t\t// Otherwise, do the opposite\n\t\treturn !include;\n\t}\n};\n\n// Resets the test setup. Useful for tests that modify the DOM.\n/*\nDEPRECATED: Use multiple tests instead of resetting inside a test.\nUse testStart or testDone for custom cleanup.\nThis method will throw an error in 2.0, and will be removed in 2.1\n*/\nQUnit.reset = function() {\n\n\t// Return on non-browser environments\n\t// This is necessary to not break on node tests\n\tif ( !defined.document ) {\n\t\treturn;\n\t}\n\n\tvar fixture = defined.document && document.getElementById &&\n\t\t\tdocument.getElementById( \"qunit-fixture\" );\n\n\tif ( fixture ) {\n\t\tfixture.innerHTML = config.fixture;\n\t}\n};\n\nQUnit.pushFailure = function() {\n\tif ( !QUnit.config.current ) {\n\t\tthrow new Error( \"pushFailure() assertion outside test context, in \" +\n\t\t\tsourceFromStacktrace( 2 ) );\n\t}\n\n\t// Gets current test obj\n\tvar currentTest = QUnit.config.current;\n\n\treturn currentTest.pushFailure.apply( currentTest, arguments );\n};\n\n// Based on Java's String.hashCode, a simple but not\n// rigorously collision resistant hashing function\nfunction generateHash( module, testName ) {\n\tvar hex,\n\t\ti = 0,\n\t\thash = 0,\n\t\tstr = module + \"\\x1C\" + testName,\n\t\tlen = str.length;\n\n\tfor ( ; i < len; i++ ) {\n\t\thash  = ( ( hash << 5 ) - hash ) + str.charCodeAt( i );\n\t\thash |= 0;\n\t}\n\n\t// Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n\t// strictly necessary but increases user understanding that the id is a SHA-like hash\n\thex = ( 0x100000000 + hash ).toString( 16 );\n\tif ( hex.length < 8 ) {\n\t\thex = \"0000000\" + hex;\n\t}\n\n\treturn hex.slice( -8 );\n}\n\nfunction synchronize( callback, priority, seed ) {\n\tvar last = !priority,\n\t\tindex;\n\n\tif ( QUnit.objectType( callback ) === \"array\" ) {\n\t\twhile ( callback.length ) {\n\t\t\tsynchronize( callback.shift() );\n\t\t}\n\t\treturn;\n\t}\n\n\tif ( priority ) {\n\t\tconfig.queue.splice( priorityCount++, 0, callback );\n\t} else if ( seed ) {\n\t\tif ( !unitSampler ) {\n\t\t\tunitSampler = unitSamplerGenerator( seed );\n\t\t}\n\n\t\t// Insert into a random position after all priority items\n\t\tindex = Math.floor( unitSampler() * ( config.queue.length - priorityCount + 1 ) );\n\t\tconfig.queue.splice( priorityCount + index, 0, callback );\n\t} else {\n\t\tconfig.queue.push( callback );\n\t}\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess( last );\n\t}\n}\n\nfunction unitSamplerGenerator( seed ) {\n\n\t// 32-bit xorshift, requires only a nonzero seed\n\t// http://excamera.com/sphinx/article-xorshift.html\n\tvar sample = parseInt( generateHash( seed ), 16 ) || -1;\n\treturn function() {\n\t\tsample ^= sample << 13;\n\t\tsample ^= sample >>> 17;\n\t\tsample ^= sample << 5;\n\n\t\t// ECMAScript has no unsigned number type\n\t\tif ( sample < 0 ) {\n\t\t\tsample += 0x100000000;\n\t\t}\n\n\t\treturn sample / 0x100000000;\n\t};\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in global ) {\n\t\t\tif ( hasOwn.call( global, key ) ) {\n\n\t\t\t\t// In Opera sometimes DOM element ids show up here, ignore them\n\t\t\t\tif ( /^qunit-test-output/.test( key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconfig.pollution.push( key );\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction checkPollution() {\n\tvar newGlobals,\n\t\tdeletedGlobals,\n\t\told = config.pollution;\n\n\tsaveGlobal();\n\n\tnewGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join( \", \" ) );\n\t}\n\n\tdeletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Deleted global variable(s): \" + deletedGlobals.join( \", \" ) );\n\t}\n}\n\n// Will be exposed as QUnit.asyncTest\nfunction asyncTest( testName, expected, callback ) {\n\tif ( arguments.length === 2 ) {\n\t\tcallback = expected;\n\t\texpected = null;\n\t}\n\n\tQUnit.test( testName, expected, callback, true );\n}\n\n// Will be exposed as QUnit.test\nfunction test( testName, expected, callback, async ) {\n\tif ( focused )  { return; }\n\n\tvar newTest;\n\n\tif ( arguments.length === 2 ) {\n\t\tcallback = expected;\n\t\texpected = null;\n\t}\n\n\tnewTest = new Test( {\n\t\ttestName: testName,\n\t\texpected: expected,\n\t\tasync: async,\n\t\tcallback: callback\n\t} );\n\n\tnewTest.queue();\n}\n\n// Will be exposed as QUnit.skip\nfunction skip( testName ) {\n\tif ( focused )  { return; }\n\n\tvar test = new Test( {\n\t\ttestName: testName,\n\t\tskip: true\n\t} );\n\n\ttest.queue();\n}\n\n// Will be exposed as QUnit.only\nfunction only( testName, expected, callback, async ) {\n\tvar newTest;\n\n\tif ( focused )  { return; }\n\n\tQUnit.config.queue.length = 0;\n\tfocused = true;\n\n\tif ( arguments.length === 2 ) {\n\t\tcallback = expected;\n\t\texpected = null;\n\t}\n\n\tnewTest = new Test( {\n\t\ttestName: testName,\n\t\texpected: expected,\n\t\tasync: async,\n\t\tcallback: callback\n\t} );\n\n\tnewTest.queue();\n}\n\nfunction Assert( testContext ) {\n\tthis.test = testContext;\n}\n\n// Assert helpers\nQUnit.assert = Assert.prototype = {\n\n\t// Specify the number of expected assertions to guarantee that failed test\n\t// (no assertions are run at all) don't slip through.\n\texpect: function( asserts ) {\n\t\tif ( arguments.length === 1 ) {\n\t\t\tthis.test.expected = asserts;\n\t\t} else {\n\t\t\treturn this.test.expected;\n\t\t}\n\t},\n\n\t// Increment this Test's semaphore counter, then return a function that\n\t// decrements that counter a maximum of once.\n\tasync: function( count ) {\n\t\tvar test = this.test,\n\t\t\tpopped = false,\n\t\t\tacceptCallCount = count;\n\n\t\tif ( typeof acceptCallCount === \"undefined\" ) {\n\t\t\tacceptCallCount = 1;\n\t\t}\n\n\t\ttest.semaphore += 1;\n\t\ttest.usedAsync = true;\n\t\tpauseProcessing();\n\n\t\treturn function done() {\n\n\t\t\tif ( popped ) {\n\t\t\t\ttest.pushFailure( \"Too many calls to the `assert.async` callback\",\n\t\t\t\t\tsourceFromStacktrace( 2 ) );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tacceptCallCount -= 1;\n\t\t\tif ( acceptCallCount > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttest.semaphore -= 1;\n\t\t\tpopped = true;\n\t\t\tresumeProcessing();\n\t\t};\n\t},\n\n\t// Exports test.push() to the user API\n\t// Alias of pushResult.\n\tpush: function( result, actual, expected, message, negative ) {\n\t\tvar currentAssert = this instanceof Assert ? this : QUnit.config.current.assert;\n\t\treturn currentAssert.pushResult( {\n\t\t\tresult: result,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: negative\n\t\t} );\n\t},\n\n\tpushResult: function( resultInfo ) {\n\n\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n\t\tvar assert = this,\n\t\t\tcurrentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;\n\n\t\t// Backwards compatibility fix.\n\t\t// Allows the direct use of global exported assertions and QUnit.assert.*\n\t\t// Although, it's use is not recommended as it can leak assertions\n\t\t// to other tests from async tests, because we only get a reference to the current test,\n\t\t// not exactly the test where assertion were intended to be called.\n\t\tif ( !currentTest ) {\n\t\t\tthrow new Error( \"assertion outside test context, in \" + sourceFromStacktrace( 2 ) );\n\t\t}\n\n\t\tif ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) {\n\t\t\tcurrentTest.pushFailure( \"Assertion after the final `assert.async` was resolved\",\n\t\t\t\tsourceFromStacktrace( 2 ) );\n\n\t\t\t// Allow this assertion to continue running anyway...\n\t\t}\n\n\t\tif ( !( assert instanceof Assert ) ) {\n\t\t\tassert = currentTest.assert;\n\t\t}\n\n\t\treturn assert.test.pushResult( resultInfo );\n\t},\n\n\tok: function( result, message ) {\n\t\tmessage = message || ( result ? \"okay\" : \"failed, expected argument to be truthy, was: \" +\n\t\t\tQUnit.dump.parse( result ) );\n\t\tthis.pushResult( {\n\t\t\tresult: !!result,\n\t\t\tactual: result,\n\t\t\texpected: true,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotOk: function( result, message ) {\n\t\tmessage = message || ( !result ? \"okay\" : \"failed, expected argument to be falsy, was: \" +\n\t\t\tQUnit.dump.parse( result ) );\n\t\tthis.pushResult( {\n\t\t\tresult: !result,\n\t\t\tactual: result,\n\t\t\texpected: false,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tequal: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tthis.pushResult( {\n\t\t\tresult: expected == actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotEqual: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tthis.pushResult( {\n\t\t\tresult: expected != actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\tpropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues( actual );\n\t\texpected = objectValues( expected );\n\t\tthis.pushResult( {\n\t\t\tresult: QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotPropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues( actual );\n\t\texpected = objectValues( expected );\n\t\tthis.pushResult( {\n\t\t\tresult: !QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\tdeepEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotDeepEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: !QUnit.equiv( actual, expected ),\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\tstrictEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: expected === actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message\n\t\t} );\n\t},\n\n\tnotStrictEqual: function( actual, expected, message ) {\n\t\tthis.pushResult( {\n\t\t\tresult: expected !== actual,\n\t\t\tactual: actual,\n\t\t\texpected: expected,\n\t\t\tmessage: message,\n\t\t\tnegative: true\n\t\t} );\n\t},\n\n\t\"throws\": function( block, expected, message ) {\n\t\tvar actual, expectedType,\n\t\t\texpectedOutput = expected,\n\t\t\tok = false,\n\t\t\tcurrentTest = ( this instanceof Assert && this.test ) || QUnit.config.current;\n\n\t\t// 'expected' is optional unless doing string comparison\n\t\tif ( message == null && typeof expected === \"string\" ) {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tcurrentTest.ignoreGlobalErrors = true;\n\t\ttry {\n\t\t\tblock.call( currentTest.testEnvironment );\n\t\t} catch ( e ) {\n\t\t\tactual = e;\n\t\t}\n\t\tcurrentTest.ignoreGlobalErrors = false;\n\n\t\tif ( actual ) {\n\t\t\texpectedType = QUnit.objectType( expected );\n\n\t\t\t// We don't want to validate thrown error\n\t\t\tif ( !expected ) {\n\t\t\t\tok = true;\n\t\t\t\texpectedOutput = null;\n\n\t\t\t// Expected is a regexp\n\t\t\t} else if ( expectedType === \"regexp\" ) {\n\t\t\t\tok = expected.test( errorString( actual ) );\n\n\t\t\t// Expected is a string\n\t\t\t} else if ( expectedType === \"string\" ) {\n\t\t\t\tok = expected === errorString( actual );\n\n\t\t\t// Expected is a constructor, maybe an Error constructor\n\t\t\t} else if ( expectedType === \"function\" && actual instanceof expected ) {\n\t\t\t\tok = true;\n\n\t\t\t// Expected is an Error object\n\t\t\t} else if ( expectedType === \"object\" ) {\n\t\t\t\tok = actual instanceof expected.constructor &&\n\t\t\t\t\tactual.name === expected.name &&\n\t\t\t\t\tactual.message === expected.message;\n\n\t\t\t// Expected is a validation function which returns true if validation passed\n\t\t\t} else if ( expectedType === \"function\" && expected.call( {}, actual ) === true ) {\n\t\t\t\texpectedOutput = null;\n\t\t\t\tok = true;\n\t\t\t}\n\t\t}\n\n\t\tcurrentTest.assert.pushResult( {\n\t\t\tresult: ok,\n\t\t\tactual: actual,\n\t\t\texpected: expectedOutput,\n\t\t\tmessage: message\n\t\t} );\n\t}\n};\n\n// Provide an alternative to assert.throws(), for environments that consider throws a reserved word\n// Known to us are: Closure Compiler, Narwhal\n( function() {\n\t/*jshint sub:true */\n\tAssert.prototype.raises = Assert.prototype [ \"throws\" ]; //jscs:ignore requireDotNotation\n}() );\n\nfunction errorString( error ) {\n\tvar name, message,\n\t\tresultErrorString = error.toString();\n\tif ( resultErrorString.substring( 0, 7 ) === \"[object\" ) {\n\t\tname = error.name ? error.name.toString() : \"Error\";\n\t\tmessage = error.message ? error.message.toString() : \"\";\n\t\tif ( name && message ) {\n\t\t\treturn name + \": \" + message;\n\t\t} else if ( name ) {\n\t\t\treturn name;\n\t\t} else if ( message ) {\n\t\t\treturn message;\n\t\t} else {\n\t\t\treturn \"Error\";\n\t\t}\n\t} else {\n\t\treturn resultErrorString;\n\t}\n}\n\n// Test for equality any JavaScript type.\n// Author: Philippe Rath <prathe@gmail.com>\nQUnit.equiv = ( function() {\n\n\t// Stack to decide between skip/abort functions\n\tvar callers = [];\n\n\t// Stack to avoiding loops from circular referencing\n\tvar parents = [];\n\tvar parentsB = [];\n\n\tvar getProto = Object.getPrototypeOf || function( obj ) {\n\n\t\t/*jshint proto: true */\n\t\treturn obj.__proto__;\n\t};\n\n\tfunction useStrictEquality( b, a ) {\n\n\t\t// To catch short annotation VS 'new' annotation of a declaration. e.g.:\n\t\t// `var i = 1;`\n\t\t// `var j = new Number(1);`\n\t\tif ( typeof a === \"object\" ) {\n\t\t\ta = a.valueOf();\n\t\t}\n\t\tif ( typeof b === \"object\" ) {\n\t\t\tb = b.valueOf();\n\t\t}\n\n\t\treturn a === b;\n\t}\n\n\tfunction compareConstructors( a, b ) {\n\t\tvar protoA = getProto( a );\n\t\tvar protoB = getProto( b );\n\n\t\t// Comparing constructors is more strict than using `instanceof`\n\t\tif ( a.constructor === b.constructor ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Ref #851\n\t\t// If the obj prototype descends from a null constructor, treat it\n\t\t// as a null prototype.\n\t\tif ( protoA && protoA.constructor === null ) {\n\t\t\tprotoA = null;\n\t\t}\n\t\tif ( protoB && protoB.constructor === null ) {\n\t\t\tprotoB = null;\n\t\t}\n\n\t\t// Allow objects with no prototype to be equivalent to\n\t\t// objects with Object as their constructor.\n\t\tif ( ( protoA === null && protoB === Object.prototype ) ||\n\t\t\t\t( protoB === null && protoA === Object.prototype ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction getRegExpFlags( regexp ) {\n\t\treturn \"flags\" in regexp ? regexp.flags : regexp.toString().match( /[gimuy]*$/ )[ 0 ];\n\t}\n\n\tvar callbacks = {\n\t\t\"string\": useStrictEquality,\n\t\t\"boolean\": useStrictEquality,\n\t\t\"number\": useStrictEquality,\n\t\t\"null\": useStrictEquality,\n\t\t\"undefined\": useStrictEquality,\n\t\t\"symbol\": useStrictEquality,\n\t\t\"date\": useStrictEquality,\n\n\t\t\"nan\": function() {\n\t\t\treturn true;\n\t\t},\n\n\t\t\"regexp\": function( b, a ) {\n\t\t\treturn a.source === b.source &&\n\n\t\t\t\t// Include flags in the comparison\n\t\t\t\tgetRegExpFlags( a ) === getRegExpFlags( b );\n\t\t},\n\n\t\t// - skip when the property is a method of an instance (OOP)\n\t\t// - abort otherwise,\n\t\t// initial === would have catch identical references anyway\n\t\t\"function\": function() {\n\t\t\tvar caller = callers[ callers.length - 1 ];\n\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t},\n\n\t\t\"array\": function( b, a ) {\n\t\t\tvar i, j, len, loop, aCircular, bCircular;\n\n\t\t\tlen = a.length;\n\t\t\tif ( len !== b.length ) {\n\n\t\t\t\t// Safe and faster\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Track reference to avoid circular references\n\t\t\tparents.push( a );\n\t\t\tparentsB.push( b );\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tloop = false;\n\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\taCircular = parents[ j ] === a[ i ];\n\t\t\t\t\tbCircular = parentsB[ j ] === b[ i ];\n\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\tif ( a[ i ] === b[ i ] || aCircular && bCircular ) {\n\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\tparentsB.pop();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {\n\t\t\t\t\tparents.pop();\n\t\t\t\t\tparentsB.pop();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tparents.pop();\n\t\t\tparentsB.pop();\n\t\t\treturn true;\n\t\t},\n\n\t\t\"set\": function( b, a ) {\n\t\t\tvar innerEq,\n\t\t\t\touterEq = true;\n\n\t\t\tif ( a.size !== b.size ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ta.forEach( function( aVal ) {\n\t\t\t\tinnerEq = false;\n\n\t\t\t\tb.forEach( function( bVal ) {\n\t\t\t\t\tif ( innerEquiv( bVal, aVal ) ) {\n\t\t\t\t\t\tinnerEq = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( !innerEq ) {\n\t\t\t\t\touterEq = false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn outerEq;\n\t\t},\n\n\t\t\"map\": function( b, a ) {\n\t\t\tvar innerEq,\n\t\t\t\touterEq = true;\n\n\t\t\tif ( a.size !== b.size ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ta.forEach( function( aVal, aKey ) {\n\t\t\t\tinnerEq = false;\n\n\t\t\t\tb.forEach( function( bVal, bKey ) {\n\t\t\t\t\tif ( innerEquiv( [ bVal, bKey ], [ aVal, aKey ] ) ) {\n\t\t\t\t\t\tinnerEq = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( !innerEq ) {\n\t\t\t\t\touterEq = false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn outerEq;\n\t\t},\n\n\t\t\"object\": function( b, a ) {\n\t\t\tvar i, j, loop, aCircular, bCircular;\n\n\t\t\t// Default to true\n\t\t\tvar eq = true;\n\t\t\tvar aProperties = [];\n\t\t\tvar bProperties = [];\n\n\t\t\tif ( compareConstructors( a, b ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Stack constructor before traversing properties\n\t\t\tcallers.push( a.constructor );\n\n\t\t\t// Track reference to avoid circular references\n\t\t\tparents.push( a );\n\t\t\tparentsB.push( b );\n\n\t\t\t// Be strict: don't ensure hasOwnProperty and go deep\n\t\t\tfor ( i in a ) {\n\t\t\t\tloop = false;\n\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\taCircular = parents[ j ] === a[ i ];\n\t\t\t\t\tbCircular = parentsB[ j ] === b[ i ];\n\t\t\t\t\tif ( aCircular || bCircular ) {\n\t\t\t\t\t\tif ( a[ i ] === b[ i ] || aCircular && bCircular ) {\n\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\taProperties.push( i );\n\t\t\t\tif ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {\n\t\t\t\t\teq = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tparents.pop();\n\t\t\tparentsB.pop();\n\n\t\t\t// Unstack, we are done\n\t\t\tcallers.pop();\n\n\t\t\tfor ( i in b ) {\n\n\t\t\t\t// Collect b's properties\n\t\t\t\tbProperties.push( i );\n\t\t\t}\n\n\t\t\t// Ensures identical properties name\n\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n\t\t}\n\t};\n\n\tfunction typeEquiv( a, b ) {\n\t\tvar type = QUnit.objectType( a );\n\t\treturn QUnit.objectType( b ) === type && callbacks[ type ]( b, a );\n\t}\n\n\t// The real equiv function\n\tfunction innerEquiv( a, b ) {\n\n\t\t// We're done when there's nothing more to compare\n\t\tif ( arguments.length < 2 ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Require type-specific equality\n\t\treturn ( a === b || typeEquiv( a, b ) ) &&\n\n\t\t\t// ...across all consecutive argument pairs\n\t\t\t( arguments.length === 2 || innerEquiv.apply( this, [].slice.call( arguments, 1 ) ) );\n\t}\n\n\treturn innerEquiv;\n}() );\n\n// Based on jsDump by Ariel Flesler\n// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html\nQUnit.dump = ( function() {\n\tfunction quote( str ) {\n\t\treturn \"\\\"\" + str.toString().replace( /\\\\/g, \"\\\\\\\\\" ).replace( /\"/g, \"\\\\\\\"\" ) + \"\\\"\";\n\t}\n\tfunction literal( o ) {\n\t\treturn o + \"\";\n\t}\n\tfunction join( pre, arr, post ) {\n\t\tvar s = dump.separator(),\n\t\t\tbase = dump.indent(),\n\t\t\tinner = dump.indent( 1 );\n\t\tif ( arr.join ) {\n\t\t\tarr = arr.join( \",\" + s + inner );\n\t\t}\n\t\tif ( !arr ) {\n\t\t\treturn pre + post;\n\t\t}\n\t\treturn [ pre, inner + arr, base + post ].join( s );\n\t}\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length,\n\t\t\tret = new Array( i );\n\n\t\tif ( dump.maxDepth && dump.depth > dump.maxDepth ) {\n\t\t\treturn \"[object Array]\";\n\t\t}\n\n\t\tthis.up();\n\t\twhile ( i-- ) {\n\t\t\tret[ i ] = this.parse( arr[ i ], undefined, stack );\n\t\t}\n\t\tthis.down();\n\t\treturn join( \"[\", ret, \"]\" );\n\t}\n\n\tvar reName = /^function (\\w+)/,\n\t\tdump = {\n\n\t\t\t// The objType is used mostly internally, you can fix a (custom) type in advance\n\t\t\tparse: function( obj, objType, stack ) {\n\t\t\t\tstack = stack || [];\n\t\t\t\tvar res, parser, parserType,\n\t\t\t\t\tinStack = inArray( obj, stack );\n\n\t\t\t\tif ( inStack !== -1 ) {\n\t\t\t\t\treturn \"recursion(\" + ( inStack - stack.length ) + \")\";\n\t\t\t\t}\n\n\t\t\t\tobjType = objType || this.typeOf( obj  );\n\t\t\t\tparser = this.parsers[ objType ];\n\t\t\t\tparserType = typeof parser;\n\n\t\t\t\tif ( parserType === \"function\" ) {\n\t\t\t\t\tstack.push( obj );\n\t\t\t\t\tres = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn ( parserType === \"string\" ) ? parser : this.parsers.error;\n\t\t\t},\n\t\t\ttypeOf: function( obj ) {\n\t\t\t\tvar type;\n\t\t\t\tif ( obj === null ) {\n\t\t\t\t\ttype = \"null\";\n\t\t\t\t} else if ( typeof obj === \"undefined\" ) {\n\t\t\t\t\ttype = \"undefined\";\n\t\t\t\t} else if ( QUnit.is( \"regexp\", obj ) ) {\n\t\t\t\t\ttype = \"regexp\";\n\t\t\t\t} else if ( QUnit.is( \"date\", obj ) ) {\n\t\t\t\t\ttype = \"date\";\n\t\t\t\t} else if ( QUnit.is( \"function\", obj ) ) {\n\t\t\t\t\ttype = \"function\";\n\t\t\t\t} else if ( obj.setInterval !== undefined &&\n\t\t\t\t\t\tobj.document !== undefined &&\n\t\t\t\t\t\tobj.nodeType === undefined ) {\n\t\t\t\t\ttype = \"window\";\n\t\t\t\t} else if ( obj.nodeType === 9 ) {\n\t\t\t\t\ttype = \"document\";\n\t\t\t\t} else if ( obj.nodeType ) {\n\t\t\t\t\ttype = \"node\";\n\t\t\t\t} else if (\n\n\t\t\t\t\t// Native arrays\n\t\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\n\t\t\t\t\t// NodeList objects\n\t\t\t\t\t( typeof obj.length === \"number\" && obj.item !== undefined &&\n\t\t\t\t\t( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null &&\n\t\t\t\t\tobj[ 0 ] === undefined ) ) )\n\t\t\t\t) {\n\t\t\t\t\ttype = \"array\";\n\t\t\t\t} else if ( obj.constructor === Error.prototype.constructor ) {\n\t\t\t\t\ttype = \"error\";\n\t\t\t\t} else {\n\t\t\t\t\ttype = typeof obj;\n\t\t\t\t}\n\t\t\t\treturn type;\n\t\t\t},\n\n\t\t\tseparator: function() {\n\t\t\t\treturn this.multiline ? this.HTML ? \"<br />\" : \"\\n\" : this.HTML ? \"&#160;\" : \" \";\n\t\t\t},\n\n\t\t\t// Extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\tindent: function( extra ) {\n\t\t\t\tif ( !this.multiline ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tvar chr = this.indentChar;\n\t\t\t\tif ( this.HTML ) {\n\t\t\t\t\tchr = chr.replace( /\\t/g, \"   \" ).replace( / /g, \"&#160;\" );\n\t\t\t\t}\n\t\t\t\treturn new Array( this.depth + ( extra || 0 ) ).join( chr );\n\t\t\t},\n\t\t\tup: function( a ) {\n\t\t\t\tthis.depth += a || 1;\n\t\t\t},\n\t\t\tdown: function( a ) {\n\t\t\t\tthis.depth -= a || 1;\n\t\t\t},\n\t\t\tsetParser: function( name, parser ) {\n\t\t\t\tthis.parsers[ name ] = parser;\n\t\t\t},\n\n\t\t\t// The next 3 are exposed so you can use them\n\t\t\tquote: quote,\n\t\t\tliteral: literal,\n\t\t\tjoin: join,\n\t\t\tdepth: 1,\n\t\t\tmaxDepth: QUnit.config.maxDepth,\n\n\t\t\t// This is the list of parsers, to modify them, use dump.setParser\n\t\t\tparsers: {\n\t\t\t\twindow: \"[Window]\",\n\t\t\t\tdocument: \"[Document]\",\n\t\t\t\terror: function( error ) {\n\t\t\t\t\treturn \"Error(\\\"\" + error.message + \"\\\")\";\n\t\t\t\t},\n\t\t\t\tunknown: \"[Unknown]\",\n\t\t\t\t\"null\": \"null\",\n\t\t\t\t\"undefined\": \"undefined\",\n\t\t\t\t\"function\": function( fn ) {\n\t\t\t\t\tvar ret = \"function\",\n\n\t\t\t\t\t\t// Functions never have name in IE\n\t\t\t\t\t\tname = \"name\" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];\n\n\t\t\t\t\tif ( name ) {\n\t\t\t\t\t\tret += \" \" + name;\n\t\t\t\t\t}\n\t\t\t\t\tret += \"(\";\n\n\t\t\t\t\tret = [ ret, dump.parse( fn, \"functionArgs\" ), \"){\" ].join( \"\" );\n\t\t\t\t\treturn join( ret, dump.parse( fn, \"functionCode\" ), \"}\" );\n\t\t\t\t},\n\t\t\t\tarray: array,\n\t\t\t\tnodelist: array,\n\t\t\t\t\"arguments\": array,\n\t\t\t\tobject: function( map, stack ) {\n\t\t\t\t\tvar keys, key, val, i, nonEnumerableProperties,\n\t\t\t\t\t\tret = [];\n\n\t\t\t\t\tif ( dump.maxDepth && dump.depth > dump.maxDepth ) {\n\t\t\t\t\t\treturn \"[object Object]\";\n\t\t\t\t\t}\n\n\t\t\t\t\tdump.up();\n\t\t\t\t\tkeys = [];\n\t\t\t\t\tfor ( key in map ) {\n\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Some properties are not always enumerable on Error objects.\n\t\t\t\t\tnonEnumerableProperties = [ \"message\", \"name\" ];\n\t\t\t\t\tfor ( i in nonEnumerableProperties ) {\n\t\t\t\t\t\tkey = nonEnumerableProperties[ i ];\n\t\t\t\t\t\tif ( key in map && inArray( key, keys ) < 0 ) {\n\t\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tkeys.sort();\n\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n\t\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\t\tval = map[ key ];\n\t\t\t\t\t\tret.push( dump.parse( key, \"key\" ) + \": \" +\n\t\t\t\t\t\t\tdump.parse( val, undefined, stack ) );\n\t\t\t\t\t}\n\t\t\t\t\tdump.down();\n\t\t\t\t\treturn join( \"{\", ret, \"}\" );\n\t\t\t\t},\n\t\t\t\tnode: function( node ) {\n\t\t\t\t\tvar len, i, val,\n\t\t\t\t\t\topen = dump.HTML ? \"&lt;\" : \"<\",\n\t\t\t\t\t\tclose = dump.HTML ? \"&gt;\" : \">\",\n\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n\t\t\t\t\t\tret = open + tag,\n\t\t\t\t\t\tattrs = node.attributes;\n\n\t\t\t\t\tif ( attrs ) {\n\t\t\t\t\t\tfor ( i = 0, len = attrs.length; i < len; i++ ) {\n\t\t\t\t\t\t\tval = attrs[ i ].nodeValue;\n\n\t\t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly\n\t\t\t\t\t\t\t// set. Those have values like undefined, null, 0, false, \"\" or\n\t\t\t\t\t\t\t// \"inherit\".\n\t\t\t\t\t\t\tif ( val && val !== \"inherit\" ) {\n\t\t\t\t\t\t\t\tret += \" \" + attrs[ i ].nodeName + \"=\" +\n\t\t\t\t\t\t\t\t\tdump.parse( val, \"attribute\" );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tret += close;\n\n\t\t\t\t\t// Show content of TextNode or CDATASection\n\t\t\t\t\tif ( node.nodeType === 3 || node.nodeType === 4 ) {\n\t\t\t\t\t\tret += node.nodeValue;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret + open + \"/\" + tag + close;\n\t\t\t\t},\n\n\t\t\t\t// Function calls it internally, it's the arguments part of the function\n\t\t\t\tfunctionArgs: function( fn ) {\n\t\t\t\t\tvar args,\n\t\t\t\t\t\tl = fn.length;\n\n\t\t\t\t\tif ( !l ) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\targs = new Array( l );\n\t\t\t\t\twhile ( l-- ) {\n\n\t\t\t\t\t\t// 97 is 'a'\n\t\t\t\t\t\targs[ l ] = String.fromCharCode( 97 + l );\n\t\t\t\t\t}\n\t\t\t\t\treturn \" \" + args.join( \", \" ) + \" \";\n\t\t\t\t},\n\n\t\t\t\t// Object calls it internally, the key part of an item in a map\n\t\t\t\tkey: quote,\n\n\t\t\t\t// Function calls it internally, it's the content of the function\n\t\t\t\tfunctionCode: \"[code]\",\n\n\t\t\t\t// Node calls it internally, it's a html attribute value\n\t\t\t\tattribute: quote,\n\t\t\t\tstring: quote,\n\t\t\t\tdate: quote,\n\t\t\t\tregexp: literal,\n\t\t\t\tnumber: literal,\n\t\t\t\t\"boolean\": literal\n\t\t\t},\n\n\t\t\t// If true, entities are escaped ( <, >, \\t, space and \\n )\n\t\t\tHTML: false,\n\n\t\t\t// Indentation unit\n\t\t\tindentChar: \"  \",\n\n\t\t\t// If true, items in a collection, are separated by a \\n, else just a space.\n\t\t\tmultiline: true\n\t\t};\n\n\treturn dump;\n}() );\n\n// Back compat\nQUnit.jsDump = QUnit.dump;\n\n// Deprecated\n// Extend assert methods to QUnit for Backwards compatibility\n( function() {\n\tvar i,\n\t\tassertions = Assert.prototype;\n\n\tfunction applyCurrent( current ) {\n\t\treturn function() {\n\t\t\tvar assert = new Assert( QUnit.config.current );\n\t\t\tcurrent.apply( assert, arguments );\n\t\t};\n\t}\n\n\tfor ( i in assertions ) {\n\t\tQUnit[ i ] = applyCurrent( assertions[ i ] );\n\t}\n}() );\n\n// For browser, export only select globals\nif ( defined.document ) {\n\n\t( function() {\n\t\tvar i, l,\n\t\t\tkeys = [\n\t\t\t\t\"test\",\n\t\t\t\t\"module\",\n\t\t\t\t\"expect\",\n\t\t\t\t\"asyncTest\",\n\t\t\t\t\"start\",\n\t\t\t\t\"stop\",\n\t\t\t\t\"ok\",\n\t\t\t\t\"notOk\",\n\t\t\t\t\"equal\",\n\t\t\t\t\"notEqual\",\n\t\t\t\t\"propEqual\",\n\t\t\t\t\"notPropEqual\",\n\t\t\t\t\"deepEqual\",\n\t\t\t\t\"notDeepEqual\",\n\t\t\t\t\"strictEqual\",\n\t\t\t\t\"notStrictEqual\",\n\t\t\t\t\"throws\",\n\t\t\t\t\"raises\"\n\t\t\t];\n\n\t\tfor ( i = 0, l = keys.length; i < l; i++ ) {\n\t\t\twindow[ keys[ i ] ] = QUnit[ keys[ i ] ];\n\t\t}\n\t}() );\n\n\twindow.QUnit = QUnit;\n}\n\n// For nodejs\nif ( typeof module !== \"undefined\" && module && module.exports ) {\n\tmodule.exports = QUnit;\n\n\t// For consistency with CommonJS environments' exports\n\tmodule.exports.QUnit = QUnit;\n}\n\n// For CommonJS with exports, but without module.exports, like Rhino\nif ( typeof exports !== \"undefined\" && exports ) {\n\texports.QUnit = QUnit;\n}\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( function() {\n\t\treturn QUnit;\n\t} );\n\tQUnit.config.autostart = false;\n}\n\n// Get a reference to the global object, like window in browsers\n}( ( function() {\n\treturn this;\n}() ) ) );\n\n( function() {\n\n// Only interact with URLs via window.location\nvar location = typeof window !== \"undefined\" && window.location;\nif ( !location ) {\n\treturn;\n}\n\nvar urlParams = getUrlParams();\n\nQUnit.urlParams = urlParams;\n\n// Match module/test by inclusion in an array\nQUnit.config.moduleId = [].concat( urlParams.moduleId || [] );\nQUnit.config.testId = [].concat( urlParams.testId || [] );\n\n// Exact case-insensitive match of the module name\nQUnit.config.module = urlParams.module;\n\n// Regular expression or case-insenstive substring match against \"moduleName: testName\"\nQUnit.config.filter = urlParams.filter;\n\n// Test order randomization\nif ( urlParams.seed === true ) {\n\n\t// Generate a random seed if the option is specified without a value\n\tQUnit.config.seed = Math.random().toString( 36 ).slice( 2 );\n} else if ( urlParams.seed ) {\n\tQUnit.config.seed = urlParams.seed;\n}\n\n// Add URL-parameter-mapped config values with UI form rendering data\nQUnit.config.urlConfig.push(\n\t{\n\t\tid: \"hidepassed\",\n\t\tlabel: \"Hide passed tests\",\n\t\ttooltip: \"Only show tests and assertions that fail. Stored as query-strings.\"\n\t},\n\t{\n\t\tid: \"noglobals\",\n\t\tlabel: \"Check for Globals\",\n\t\ttooltip: \"Enabling this will test if any test introduces new properties on the \" +\n\t\t\t\"global object (`window` in Browsers). Stored as query-strings.\"\n\t},\n\t{\n\t\tid: \"notrycatch\",\n\t\tlabel: \"No try-catch\",\n\t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging \" +\n\t\t\t\"exceptions in IE reasonable. Stored as query-strings.\"\n\t}\n);\n\nQUnit.begin( function() {\n\tvar i, option,\n\t\turlConfig = QUnit.config.urlConfig;\n\n\tfor ( i = 0; i < urlConfig.length; i++ ) {\n\n\t\t// Options can be either strings or objects with nonempty \"id\" properties\n\t\toption = QUnit.config.urlConfig[ i ];\n\t\tif ( typeof option !== \"string\" ) {\n\t\t\toption = option.id;\n\t\t}\n\n\t\tif ( QUnit.config[ option ] === undefined ) {\n\t\t\tQUnit.config[ option ] = urlParams[ option ];\n\t\t}\n\t}\n} );\n\nfunction getUrlParams() {\n\tvar i, param, name, value;\n\tvar urlParams = {};\n\tvar params = location.search.slice( 1 ).split( \"&\" );\n\tvar length = params.length;\n\n\tfor ( i = 0; i < length; i++ ) {\n\t\tif ( params[ i ] ) {\n\t\t\tparam = params[ i ].split( \"=\" );\n\t\t\tname = decodeURIComponent( param[ 0 ] );\n\n\t\t\t// Allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tvalue = param.length === 1 ||\n\t\t\t\tdecodeURIComponent( param.slice( 1 ).join( \"=\" ) ) ;\n\t\t\tif ( urlParams[ name ] ) {\n\t\t\t\turlParams[ name ] = [].concat( urlParams[ name ], value );\n\t\t\t} else {\n\t\t\t\turlParams[ name ] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn urlParams;\n}\n\n// Don't load the HTML Reporter on non-browser environments\nif ( typeof window === \"undefined\" || !window.document ) {\n\treturn;\n}\n\n// Deprecated QUnit.init - Ref #530\n// Re-initialize the configuration options\nQUnit.init = function() {\n\tvar config = QUnit.config;\n\n\tconfig.stats = { all: 0, bad: 0 };\n\tconfig.moduleStats = { all: 0, bad: 0 };\n\tconfig.started = 0;\n\tconfig.updateRate = 1000;\n\tconfig.blocking = false;\n\tconfig.autostart = true;\n\tconfig.autorun = false;\n\tconfig.filter = \"\";\n\tconfig.queue = [];\n\n\tappendInterface();\n};\n\nvar config = QUnit.config,\n\tdocument = window.document,\n\tcollapseNext = false,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tunfilteredUrl = setUrl( { filter: undefined, module: undefined,\n\t\tmoduleId: undefined, testId: undefined } ),\n\tdefined = {\n\t\tsessionStorage: ( function() {\n\t\t\tvar x = \"qunit-test-string\";\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem( x, x );\n\t\t\t\tsessionStorage.removeItem( x );\n\t\t\t\treturn true;\n\t\t\t} catch ( e ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}() )\n\t},\n\tmodulesList = [];\n\n/**\n* Escape text for attribute or text content.\n*/\nfunction escapeText( s ) {\n\tif ( !s ) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\n\t// Both single quotes and double quotes (for attributes)\n\treturn s.replace( /['\"<>&]/g, function( s ) {\n\t\tswitch ( s ) {\n\t\tcase \"'\":\n\t\t\treturn \"&#039;\";\n\t\tcase \"\\\"\":\n\t\t\treturn \"&quot;\";\n\t\tcase \"<\":\n\t\t\treturn \"&lt;\";\n\t\tcase \">\":\n\t\t\treturn \"&gt;\";\n\t\tcase \"&\":\n\t\t\treturn \"&amp;\";\n\t\t}\n\t} );\n}\n\n/**\n * @param {HTMLElement} elem\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvent( elem, type, fn ) {\n\tif ( elem.addEventListener ) {\n\n\t\t// Standards-based browsers\n\t\telem.addEventListener( type, fn, false );\n\t} else if ( elem.attachEvent ) {\n\n\t\t// Support: IE <9\n\t\telem.attachEvent( \"on\" + type, function() {\n\t\t\tvar event = window.event;\n\t\t\tif ( !event.target ) {\n\t\t\t\tevent.target = event.srcElement || document;\n\t\t\t}\n\n\t\t\tfn.call( elem, event );\n\t\t} );\n\t}\n}\n\n/**\n * @param {Array|NodeList} elems\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvents( elems, type, fn ) {\n\tvar i = elems.length;\n\twhile ( i-- ) {\n\t\taddEvent( elems[ i ], type, fn );\n\t}\n}\n\nfunction hasClass( elem, name ) {\n\treturn ( \" \" + elem.className + \" \" ).indexOf( \" \" + name + \" \" ) >= 0;\n}\n\nfunction addClass( elem, name ) {\n\tif ( !hasClass( elem, name ) ) {\n\t\telem.className += ( elem.className ? \" \" : \"\" ) + name;\n\t}\n}\n\nfunction toggleClass( elem, name, force ) {\n\tif ( force || typeof force === \"undefined\" && !hasClass( elem, name ) ) {\n\t\taddClass( elem, name );\n\t} else {\n\t\tremoveClass( elem, name );\n\t}\n}\n\nfunction removeClass( elem, name ) {\n\tvar set = \" \" + elem.className + \" \";\n\n\t// Class name may appear multiple times\n\twhile ( set.indexOf( \" \" + name + \" \" ) >= 0 ) {\n\t\tset = set.replace( \" \" + name + \" \", \" \" );\n\t}\n\n\t// Trim for prettiness\n\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace( /^\\s+|\\s+$/g, \"\" );\n}\n\nfunction id( name ) {\n\treturn document.getElementById && document.getElementById( name );\n}\n\nfunction getUrlConfigHtml() {\n\tvar i, j, val,\n\t\tescaped, escapedTooltip,\n\t\tselection = false,\n\t\turlConfig = config.urlConfig,\n\t\turlConfigHtml = \"\";\n\n\tfor ( i = 0; i < urlConfig.length; i++ ) {\n\n\t\t// Options can be either strings or objects with nonempty \"id\" properties\n\t\tval = config.urlConfig[ i ];\n\t\tif ( typeof val === \"string\" ) {\n\t\t\tval = {\n\t\t\t\tid: val,\n\t\t\t\tlabel: val\n\t\t\t};\n\t\t}\n\n\t\tescaped = escapeText( val.id );\n\t\tescapedTooltip = escapeText( val.tooltip );\n\n\t\tif ( !val.value || typeof val.value === \"string\" ) {\n\t\t\turlConfigHtml += \"<input id='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' name='\" + escaped + \"' type='checkbox'\" +\n\t\t\t\t( val.value ? \" value='\" + escapeText( val.value ) + \"'\" : \"\" ) +\n\t\t\t\t( config[ val.id ] ? \" checked='checked'\" : \"\" ) +\n\t\t\t\t\" title='\" + escapedTooltip + \"' /><label for='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' title='\" + escapedTooltip + \"'>\" + val.label + \"</label>\";\n\t\t} else {\n\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' title='\" + escapedTooltip + \"'>\" + val.label +\n\t\t\t\t\": </label><select id='qunit-urlconfig-\" + escaped +\n\t\t\t\t\"' name='\" + escaped + \"' title='\" + escapedTooltip + \"'><option></option>\";\n\n\t\t\tif ( QUnit.is( \"array\", val.value ) ) {\n\t\t\t\tfor ( j = 0; j < val.value.length; j++ ) {\n\t\t\t\t\tescaped = escapeText( val.value[ j ] );\n\t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"'\" +\n\t\t\t\t\t\t( config[ val.id ] === val.value[ j ] ?\n\t\t\t\t\t\t\t( selection = true ) && \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + escaped + \"</option>\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( j in val.value ) {\n\t\t\t\t\tif ( hasOwn.call( val.value, j ) ) {\n\t\t\t\t\t\turlConfigHtml += \"<option value='\" + escapeText( j ) + \"'\" +\n\t\t\t\t\t\t\t( config[ val.id ] === j ?\n\t\t\t\t\t\t\t\t( selection = true ) && \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\t\">\" + escapeText( val.value[ j ] ) + \"</option>\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( config[ val.id ] && !selection ) {\n\t\t\t\tescaped = escapeText( config[ val.id ] );\n\t\t\t\turlConfigHtml += \"<option value='\" + escaped +\n\t\t\t\t\t\"' selected='selected' disabled='disabled'>\" + escaped + \"</option>\";\n\t\t\t}\n\t\t\turlConfigHtml += \"</select>\";\n\t\t}\n\t}\n\n\treturn urlConfigHtml;\n}\n\n// Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n// Updates the URL with the new state of `config.urlConfig` values.\nfunction toolbarChanged() {\n\tvar updatedUrl, value, tests,\n\t\tfield = this,\n\t\tparams = {};\n\n\t// Detect if field is a select menu or a checkbox\n\tif ( \"selectedIndex\" in field ) {\n\t\tvalue = field.options[ field.selectedIndex ].value || undefined;\n\t} else {\n\t\tvalue = field.checked ? ( field.defaultValue || true ) : undefined;\n\t}\n\n\tparams[ field.name ] = value;\n\tupdatedUrl = setUrl( params );\n\n\t// Check if we can apply the change without a page refresh\n\tif ( \"hidepassed\" === field.name && \"replaceState\" in window.history ) {\n\t\tQUnit.urlParams[ field.name ] = value;\n\t\tconfig[ field.name ] = value || false;\n\t\ttests = id( \"qunit-tests\" );\n\t\tif ( tests ) {\n\t\t\ttoggleClass( tests, \"hidepass\", value || false );\n\t\t}\n\t\twindow.history.replaceState( null, \"\", updatedUrl );\n\t} else {\n\t\twindow.location = updatedUrl;\n\t}\n}\n\nfunction setUrl( params ) {\n\tvar key, arrValue, i,\n\t\tquerystring = \"?\",\n\t\tlocation = window.location;\n\n\tparams = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );\n\n\tfor ( key in params ) {\n\n\t\t// Skip inherited or undefined properties\n\t\tif ( hasOwn.call( params, key ) && params[ key ] !== undefined ) {\n\n\t\t\t// Output a parameter for each value of this key (but usually just one)\n\t\t\tarrValue = [].concat( params[ key ] );\n\t\t\tfor ( i = 0; i < arrValue.length; i++ ) {\n\t\t\t\tquerystring += encodeURIComponent( key );\n\t\t\t\tif ( arrValue[ i ] !== true ) {\n\t\t\t\t\tquerystring += \"=\" + encodeURIComponent( arrValue[ i ] );\n\t\t\t\t}\n\t\t\t\tquerystring += \"&\";\n\t\t\t}\n\t\t}\n\t}\n\treturn location.protocol + \"//\" + location.host +\n\t\tlocation.pathname + querystring.slice( 0, -1 );\n}\n\nfunction applyUrlParams() {\n\tvar selectedModule,\n\t\tmodulesList = id( \"qunit-modulefilter\" ),\n\t\tfilter = id( \"qunit-filter-input\" ).value;\n\n\tselectedModule = modulesList ?\n\t\tdecodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :\n\t\tundefined;\n\n\twindow.location = setUrl( {\n\t\tmodule: ( selectedModule === \"\" ) ? undefined : selectedModule,\n\t\tfilter: ( filter === \"\" ) ? undefined : filter,\n\n\t\t// Remove moduleId and testId filters\n\t\tmoduleId: undefined,\n\t\ttestId: undefined\n\t} );\n}\n\nfunction toolbarUrlConfigContainer() {\n\tvar urlConfigContainer = document.createElement( \"span\" );\n\n\turlConfigContainer.innerHTML = getUrlConfigHtml();\n\taddClass( urlConfigContainer, \"qunit-url-config\" );\n\n\t// For oldIE support:\n\t// * Add handlers to the individual elements instead of the container\n\t// * Use \"click\" instead of \"change\" for checkboxes\n\taddEvents( urlConfigContainer.getElementsByTagName( \"input\" ), \"click\", toolbarChanged );\n\taddEvents( urlConfigContainer.getElementsByTagName( \"select\" ), \"change\", toolbarChanged );\n\n\treturn urlConfigContainer;\n}\n\nfunction toolbarLooseFilter() {\n\tvar filter = document.createElement( \"form\" ),\n\t\tlabel = document.createElement( \"label\" ),\n\t\tinput = document.createElement( \"input\" ),\n\t\tbutton = document.createElement( \"button\" );\n\n\taddClass( filter, \"qunit-filter\" );\n\n\tlabel.innerHTML = \"Filter: \";\n\n\tinput.type = \"text\";\n\tinput.value = config.filter || \"\";\n\tinput.name = \"filter\";\n\tinput.id = \"qunit-filter-input\";\n\n\tbutton.innerHTML = \"Go\";\n\n\tlabel.appendChild( input );\n\n\tfilter.appendChild( label );\n\tfilter.appendChild( button );\n\taddEvent( filter, \"submit\", function( ev ) {\n\t\tapplyUrlParams();\n\n\t\tif ( ev && ev.preventDefault ) {\n\t\t\tev.preventDefault();\n\t\t}\n\n\t\treturn false;\n\t} );\n\n\treturn filter;\n}\n\nfunction toolbarModuleFilterHtml() {\n\tvar i,\n\t\tmoduleFilterHtml = \"\";\n\n\tif ( !modulesList.length ) {\n\t\treturn false;\n\t}\n\n\tmoduleFilterHtml += \"<label for='qunit-modulefilter'>Module: </label>\" +\n\t\t\"<select id='qunit-modulefilter' name='modulefilter'><option value='' \" +\n\t\t( QUnit.urlParams.module === undefined ? \"selected='selected'\" : \"\" ) +\n\t\t\">< All Modules ></option>\";\n\n\tfor ( i = 0; i < modulesList.length; i++ ) {\n\t\tmoduleFilterHtml += \"<option value='\" +\n\t\t\tescapeText( encodeURIComponent( modulesList[ i ] ) ) + \"' \" +\n\t\t\t( QUnit.urlParams.module === modulesList[ i ] ? \"selected='selected'\" : \"\" ) +\n\t\t\t\">\" + escapeText( modulesList[ i ] ) + \"</option>\";\n\t}\n\tmoduleFilterHtml += \"</select>\";\n\n\treturn moduleFilterHtml;\n}\n\nfunction toolbarModuleFilter() {\n\tvar toolbar = id( \"qunit-testrunner-toolbar\" ),\n\t\tmoduleFilter = document.createElement( \"span\" ),\n\t\tmoduleFilterHtml = toolbarModuleFilterHtml();\n\n\tif ( !toolbar || !moduleFilterHtml ) {\n\t\treturn false;\n\t}\n\n\tmoduleFilter.setAttribute( \"id\", \"qunit-modulefilter-container\" );\n\tmoduleFilter.innerHTML = moduleFilterHtml;\n\n\taddEvent( moduleFilter.lastChild, \"change\", applyUrlParams );\n\n\ttoolbar.appendChild( moduleFilter );\n}\n\nfunction appendToolbar() {\n\tvar toolbar = id( \"qunit-testrunner-toolbar\" );\n\n\tif ( toolbar ) {\n\t\ttoolbar.appendChild( toolbarUrlConfigContainer() );\n\t\ttoolbar.appendChild( toolbarLooseFilter() );\n\t\ttoolbarModuleFilter();\n\t}\n}\n\nfunction appendHeader() {\n\tvar header = id( \"qunit-header\" );\n\n\tif ( header ) {\n\t\theader.innerHTML = \"<a href='\" + escapeText( unfilteredUrl ) + \"'>\" + header.innerHTML +\n\t\t\t\"</a> \";\n\t}\n}\n\nfunction appendBanner() {\n\tvar banner = id( \"qunit-banner\" );\n\n\tif ( banner ) {\n\t\tbanner.className = \"\";\n\t}\n}\n\nfunction appendTestResults() {\n\tvar tests = id( \"qunit-tests\" ),\n\t\tresult = id( \"qunit-testresult\" );\n\n\tif ( result ) {\n\t\tresult.parentNode.removeChild( result );\n\t}\n\n\tif ( tests ) {\n\t\ttests.innerHTML = \"\";\n\t\tresult = document.createElement( \"p\" );\n\t\tresult.id = \"qunit-testresult\";\n\t\tresult.className = \"result\";\n\t\ttests.parentNode.insertBefore( result, tests );\n\t\tresult.innerHTML = \"Running...<br />&#160;\";\n\t}\n}\n\nfunction storeFixture() {\n\tvar fixture = id( \"qunit-fixture\" );\n\tif ( fixture ) {\n\t\tconfig.fixture = fixture.innerHTML;\n\t}\n}\n\nfunction appendFilteredTest() {\n\tvar testId = QUnit.config.testId;\n\tif ( !testId || testId.length <= 0 ) {\n\t\treturn \"\";\n\t}\n\treturn \"<div id='qunit-filteredTest'>Rerunning selected tests: \" +\n\t\tescapeText( testId.join( \", \" ) ) +\n\t\t\" <a id='qunit-clearFilter' href='\" +\n\t\tescapeText( unfilteredUrl ) +\n\t\t\"'>Run all tests</a></div>\";\n}\n\nfunction appendUserAgent() {\n\tvar userAgent = id( \"qunit-userAgent\" );\n\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = \"\";\n\t\tuserAgent.appendChild(\n\t\t\tdocument.createTextNode(\n\t\t\t\t\"QUnit \" + QUnit.version + \"; \" + navigator.userAgent\n\t\t\t)\n\t\t);\n\t}\n}\n\nfunction appendInterface() {\n\tvar qunit = id( \"qunit\" );\n\n\tif ( qunit ) {\n\t\tqunit.innerHTML =\n\t\t\t\"<h1 id='qunit-header'>\" + escapeText( document.title ) + \"</h1>\" +\n\t\t\t\"<h2 id='qunit-banner'></h2>\" +\n\t\t\t\"<div id='qunit-testrunner-toolbar'></div>\" +\n\t\t\tappendFilteredTest() +\n\t\t\t\"<h2 id='qunit-userAgent'></h2>\" +\n\t\t\t\"<ol id='qunit-tests'></ol>\";\n\t}\n\n\tappendHeader();\n\tappendBanner();\n\tappendTestResults();\n\tappendUserAgent();\n\tappendToolbar();\n}\n\nfunction appendTestsList( modules ) {\n\tvar i, l, x, z, test, moduleObj;\n\n\tfor ( i = 0, l = modules.length; i < l; i++ ) {\n\t\tmoduleObj = modules[ i ];\n\n\t\tfor ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {\n\t\t\ttest = moduleObj.tests[ x ];\n\n\t\t\tappendTest( test.name, test.testId, moduleObj.name );\n\t\t}\n\t}\n}\n\nfunction appendTest( name, testId, moduleName ) {\n\tvar title, rerunTrigger, testBlock, assertList,\n\t\ttests = id( \"qunit-tests\" );\n\n\tif ( !tests ) {\n\t\treturn;\n\t}\n\n\ttitle = document.createElement( \"strong\" );\n\ttitle.innerHTML = getNameHtml( name, moduleName );\n\n\trerunTrigger = document.createElement( \"a\" );\n\trerunTrigger.innerHTML = \"Rerun\";\n\trerunTrigger.href = setUrl( { testId: testId } );\n\n\ttestBlock = document.createElement( \"li\" );\n\ttestBlock.appendChild( title );\n\ttestBlock.appendChild( rerunTrigger );\n\ttestBlock.id = \"qunit-test-output-\" + testId;\n\n\tassertList = document.createElement( \"ol\" );\n\tassertList.className = \"qunit-assert-list\";\n\n\ttestBlock.appendChild( assertList );\n\n\ttests.appendChild( testBlock );\n}\n\n// HTML Reporter initialization and load\nQUnit.begin( function( details ) {\n\tvar i, moduleObj, tests;\n\n\t// Sort modules by name for the picker\n\tfor ( i = 0; i < details.modules.length; i++ ) {\n\t\tmoduleObj = details.modules[ i ];\n\t\tif ( moduleObj.name ) {\n\t\t\tmodulesList.push( moduleObj.name );\n\t\t}\n\t}\n\tmodulesList.sort( function( a, b ) {\n\t\treturn a.localeCompare( b );\n\t} );\n\n\t// Capture fixture HTML from the page\n\tstoreFixture();\n\n\t// Initialize QUnit elements\n\tappendInterface();\n\tappendTestsList( details.modules );\n\ttests = id( \"qunit-tests\" );\n\tif ( tests && config.hidepassed ) {\n\t\taddClass( tests, \"hidepass\" );\n\t}\n} );\n\nQUnit.done( function( details ) {\n\tvar i, key,\n\t\tbanner = id( \"qunit-banner\" ),\n\t\ttests = id( \"qunit-tests\" ),\n\t\thtml = [\n\t\t\t\"Tests completed in \",\n\t\t\tdetails.runtime,\n\t\t\t\" milliseconds.<br />\",\n\t\t\t\"<span class='passed'>\",\n\t\t\tdetails.passed,\n\t\t\t\"</span> assertions of <span class='total'>\",\n\t\t\tdetails.total,\n\t\t\t\"</span> passed, <span class='failed'>\",\n\t\t\tdetails.failed,\n\t\t\t\"</span> failed.\"\n\t\t].join( \"\" );\n\n\tif ( banner ) {\n\t\tbanner.className = details.failed ? \"qunit-fail\" : \"qunit-pass\";\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && document.title ) {\n\n\t\t// Show ? for good, ? for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t( details.failed ? \"\\u2716\" : \"\\u2714\" ),\n\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, \"\" )\n\t\t].join( \" \" );\n\t}\n\n\t// Clear own sessionStorage items if all tests passed\n\tif ( config.reorder && defined.sessionStorage && details.failed === 0 ) {\n\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n\t\t\tkey = sessionStorage.key( i++ );\n\t\t\tif ( key.indexOf( \"qunit-test-\" ) === 0 ) {\n\t\t\t\tsessionStorage.removeItem( key );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Scroll back to top to show results\n\tif ( config.scrolltop && window.scrollTo ) {\n\t\twindow.scrollTo( 0, 0 );\n\t}\n} );\n\nfunction getNameHtml( name, module ) {\n\tvar nameHtml = \"\";\n\n\tif ( module ) {\n\t\tnameHtml = \"<span class='module-name'>\" + escapeText( module ) + \"</span>: \";\n\t}\n\n\tnameHtml += \"<span class='test-name'>\" + escapeText( name ) + \"</span>\";\n\n\treturn nameHtml;\n}\n\nQUnit.testStart( function( details ) {\n\tvar running, testBlock, bad;\n\n\ttestBlock = id( \"qunit-test-output-\" + details.testId );\n\tif ( testBlock ) {\n\t\ttestBlock.className = \"running\";\n\t} else {\n\n\t\t// Report later registered tests\n\t\tappendTest( details.name, details.testId, details.module );\n\t}\n\n\trunning = id( \"qunit-testresult\" );\n\tif ( running ) {\n\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t+sessionStorage.getItem( \"qunit-test-\" + details.module + \"-\" + details.name );\n\n\t\trunning.innerHTML = ( bad ?\n\t\t\t\"Rerunning previously failed test: <br />\" :\n\t\t\t\"Running: <br />\" ) +\n\t\t\tgetNameHtml( details.name, details.module );\n\t}\n\n} );\n\nfunction stripHtml( string ) {\n\n\t// Strip tags, html entity and whitespaces\n\treturn string.replace( /<\\/?[^>]+(>|$)/g, \"\" ).replace( /\\&quot;/g, \"\" ).replace( /\\s+/g, \"\" );\n}\n\nQUnit.log( function( details ) {\n\tvar assertList, assertLi,\n\t\tmessage, expected, actual, diff,\n\t\tshowDiff = false,\n\t\ttestItem = id( \"qunit-test-output-\" + details.testId );\n\n\tif ( !testItem ) {\n\t\treturn;\n\t}\n\n\tmessage = escapeText( details.message ) || ( details.result ? \"okay\" : \"failed\" );\n\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\tmessage += \"<span class='runtime'>@ \" + details.runtime + \" ms</span>\";\n\n\t// The pushFailure doesn't provide details.expected\n\t// when it calls, it's implicit to also not show expected and diff stuff\n\t// Also, we need to check details.expected existence, as it can exist and be undefined\n\tif ( !details.result && hasOwn.call( details, \"expected\" ) ) {\n\t\tif ( details.negative ) {\n\t\t\texpected = \"NOT \" + QUnit.dump.parse( details.expected );\n\t\t} else {\n\t\t\texpected = QUnit.dump.parse( details.expected );\n\t\t}\n\n\t\tactual = QUnit.dump.parse( details.actual );\n\t\tmessage += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" +\n\t\t\tescapeText( expected ) +\n\t\t\t\"</pre></td></tr>\";\n\n\t\tif ( actual !== expected ) {\n\n\t\t\tmessage += \"<tr class='test-actual'><th>Result: </th><td><pre>\" +\n\t\t\t\tescapeText( actual ) + \"</pre></td></tr>\";\n\n\t\t\t// Don't show diff if actual or expected are booleans\n\t\t\tif ( !( /^(true|false)$/.test( actual ) ) &&\n\t\t\t\t\t!( /^(true|false)$/.test( expected ) ) ) {\n\t\t\t\tdiff = QUnit.diff( expected, actual );\n\t\t\t\tshowDiff = stripHtml( diff ).length !==\n\t\t\t\t\tstripHtml( expected ).length +\n\t\t\t\t\tstripHtml( actual ).length;\n\t\t\t}\n\n\t\t\t// Don't show diff if expected and actual are totally different\n\t\t\tif ( showDiff ) {\n\t\t\t\tmessage += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" +\n\t\t\t\t\tdiff + \"</pre></td></tr>\";\n\t\t\t}\n\t\t} else if ( expected.indexOf( \"[object Array]\" ) !== -1 ||\n\t\t\t\texpected.indexOf( \"[object Object]\" ) !== -1 ) {\n\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" +\n\t\t\t\t\"Diff suppressed as the depth of object is more than current max depth (\" +\n\t\t\t\tQUnit.config.maxDepth + \").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to \" +\n\t\t\t\t\" run with a higher max depth or <a href='\" +\n\t\t\t\tescapeText( setUrl( { maxDepth: -1 } ) ) + \"'>\" +\n\t\t\t\t\"Rerun</a> without max depth.</p></td></tr>\";\n\t\t} else {\n\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" +\n\t\t\t\t\"Diff suppressed as the expected and actual results have an equivalent\" +\n\t\t\t\t\" serialization</td></tr>\";\n\t\t}\n\n\t\tif ( details.source ) {\n\t\t\tmessage += \"<tr class='test-source'><th>Source: </th><td><pre>\" +\n\t\t\t\tescapeText( details.source ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\tmessage += \"</table>\";\n\n\t// This occurs when pushFailure is set and we have an extracted stack trace\n\t} else if ( !details.result && details.source ) {\n\t\tmessage += \"<table>\" +\n\t\t\t\"<tr class='test-source'><th>Source: </th><td><pre>\" +\n\t\t\tescapeText( details.source ) + \"</pre></td></tr>\" +\n\t\t\t\"</table>\";\n\t}\n\n\tassertList = testItem.getElementsByTagName( \"ol\" )[ 0 ];\n\n\tassertLi = document.createElement( \"li\" );\n\tassertLi.className = details.result ? \"pass\" : \"fail\";\n\tassertLi.innerHTML = message;\n\tassertList.appendChild( assertLi );\n} );\n\nQUnit.testDone( function( details ) {\n\tvar testTitle, time, testItem, assertList,\n\t\tgood, bad, testCounts, skipped, sourceName,\n\t\ttests = id( \"qunit-tests\" );\n\n\tif ( !tests ) {\n\t\treturn;\n\t}\n\n\ttestItem = id( \"qunit-test-output-\" + details.testId );\n\n\tassertList = testItem.getElementsByTagName( \"ol\" )[ 0 ];\n\n\tgood = details.passed;\n\tbad = details.failed;\n\n\t// Store result when possible\n\tif ( config.reorder && defined.sessionStorage ) {\n\t\tif ( bad ) {\n\t\t\tsessionStorage.setItem( \"qunit-test-\" + details.module + \"-\" + details.name, bad );\n\t\t} else {\n\t\t\tsessionStorage.removeItem( \"qunit-test-\" + details.module + \"-\" + details.name );\n\t\t}\n\t}\n\n\tif ( bad === 0 ) {\n\n\t\t// Collapse the passing tests\n\t\taddClass( assertList, \"qunit-collapsed\" );\n\t} else if ( bad && config.collapse && !collapseNext ) {\n\n\t\t// Skip collapsing the first failing test\n\t\tcollapseNext = true;\n\t} else {\n\n\t\t// Collapse remaining tests\n\t\taddClass( assertList, \"qunit-collapsed\" );\n\t}\n\n\t// The testItem.firstChild is the test name\n\ttestTitle = testItem.firstChild;\n\n\ttestCounts = bad ?\n\t\t\"<b class='failed'>\" + bad + \"</b>, \" + \"<b class='passed'>\" + good + \"</b>, \" :\n\t\t\"\";\n\n\ttestTitle.innerHTML += \" <b class='counts'>(\" + testCounts +\n\t\tdetails.assertions.length + \")</b>\";\n\n\tif ( details.skipped ) {\n\t\ttestItem.className = \"skipped\";\n\t\tskipped = document.createElement( \"em\" );\n\t\tskipped.className = \"qunit-skipped-label\";\n\t\tskipped.innerHTML = \"skipped\";\n\t\ttestItem.insertBefore( skipped, testTitle );\n\t} else {\n\t\taddEvent( testTitle, \"click\", function() {\n\t\t\ttoggleClass( assertList, \"qunit-collapsed\" );\n\t\t} );\n\n\t\ttestItem.className = bad ? \"fail\" : \"pass\";\n\n\t\ttime = document.createElement( \"span\" );\n\t\ttime.className = \"runtime\";\n\t\ttime.innerHTML = details.runtime + \" ms\";\n\t\ttestItem.insertBefore( time, assertList );\n\t}\n\n\t// Show the source of the test when showing assertions\n\tif ( details.source ) {\n\t\tsourceName = document.createElement( \"p\" );\n\t\tsourceName.innerHTML = \"<strong>Source: </strong>\" + details.source;\n\t\taddClass( sourceName, \"qunit-source\" );\n\t\tif ( bad === 0 ) {\n\t\t\taddClass( sourceName, \"qunit-collapsed\" );\n\t\t}\n\t\taddEvent( testTitle, \"click\", function() {\n\t\t\ttoggleClass( sourceName, \"qunit-collapsed\" );\n\t\t} );\n\t\ttestItem.appendChild( sourceName );\n\t}\n} );\n\n// Avoid readyState issue with phantomjs\n// Ref: #818\nvar notPhantom = ( function( p ) {\n\treturn !( p && p.version && p.version.major > 0 );\n} )( window.phantom );\n\nif ( notPhantom && document.readyState === \"complete\" ) {\n\tQUnit.load();\n} else {\n\taddEvent( window, \"load\", QUnit.load );\n}\n\n/*\n * This file is a modified version of google-diff-match-patch's JavaScript implementation\n * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n * modifications are licensed as more fully set forth in LICENSE.txt.\n *\n * The original source of google-diff-match-patch is attributable and licensed as follows:\n *\n * Copyright 2006 Google Inc.\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * More Info:\n *  https://code.google.com/p/google-diff-match-patch/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n */\nQUnit.diff = ( function() {\n\tfunction DiffMatchPatch() {\n\t}\n\n\t//  DIFF FUNCTIONS\n\n\t/**\n\t * The data structure representing a diff is an array of tuples:\n\t * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n\t * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n\t */\n\tvar DIFF_DELETE = -1,\n\t\tDIFF_INSERT = 1,\n\t\tDIFF_EQUAL = 0;\n\n\t/**\n\t * Find the differences between two texts.  Simplifies the problem by stripping\n\t * any common prefix or suffix off the texts before diffing.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n\t *     then don't run a line-level diff first to identify the changed areas.\n\t *     Defaults to true, which does a faster, slightly less optimal diff.\n\t * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {\n\t\tvar deadline, checklines, commonlength,\n\t\t\tcommonprefix, commonsuffix, diffs;\n\n\t\t// The diff must be complete in up to 1 second.\n\t\tdeadline = ( new Date() ).getTime() + 1000;\n\n\t\t// Check for null inputs.\n\t\tif ( text1 === null || text2 === null ) {\n\t\t\tthrow new Error( \"Null input. (DiffMain)\" );\n\t\t}\n\n\t\t// Check for equality (speedup).\n\t\tif ( text1 === text2 ) {\n\t\t\tif ( text1 ) {\n\t\t\t\treturn [\n\t\t\t\t\t[ DIFF_EQUAL, text1 ]\n\t\t\t\t];\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tif ( typeof optChecklines === \"undefined\" ) {\n\t\t\toptChecklines = true;\n\t\t}\n\n\t\tchecklines = optChecklines;\n\n\t\t// Trim off common prefix (speedup).\n\t\tcommonlength = this.diffCommonPrefix( text1, text2 );\n\t\tcommonprefix = text1.substring( 0, commonlength );\n\t\ttext1 = text1.substring( commonlength );\n\t\ttext2 = text2.substring( commonlength );\n\n\t\t// Trim off common suffix (speedup).\n\t\tcommonlength = this.diffCommonSuffix( text1, text2 );\n\t\tcommonsuffix = text1.substring( text1.length - commonlength );\n\t\ttext1 = text1.substring( 0, text1.length - commonlength );\n\t\ttext2 = text2.substring( 0, text2.length - commonlength );\n\n\t\t// Compute the diff on the middle block.\n\t\tdiffs = this.diffCompute( text1, text2, checklines, deadline );\n\n\t\t// Restore the prefix and suffix.\n\t\tif ( commonprefix ) {\n\t\t\tdiffs.unshift( [ DIFF_EQUAL, commonprefix ] );\n\t\t}\n\t\tif ( commonsuffix ) {\n\t\t\tdiffs.push( [ DIFF_EQUAL, commonsuffix ] );\n\t\t}\n\t\tthis.diffCleanupMerge( diffs );\n\t\treturn diffs;\n\t};\n\n\t/**\n\t * Reduce the number of edits by eliminating operationally trivial equalities.\n\t * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {\n\t\tvar changes, equalities, equalitiesLength, lastequality,\n\t\t\tpointer, preIns, preDel, postIns, postDel;\n\t\tchanges = false;\n\t\tequalities = []; // Stack of indices where equalities are found.\n\t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n\t\t/** @type {?string} */\n\t\tlastequality = null;\n\n\t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n\t\tpointer = 0; // Index of current position.\n\n\t\t// Is there an insertion operation before the last equality.\n\t\tpreIns = false;\n\n\t\t// Is there a deletion operation before the last equality.\n\t\tpreDel = false;\n\n\t\t// Is there an insertion operation after the last equality.\n\t\tpostIns = false;\n\n\t\t// Is there a deletion operation after the last equality.\n\t\tpostDel = false;\n\t\twhile ( pointer < diffs.length ) {\n\n\t\t\t// Equality found.\n\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {\n\t\t\t\tif ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {\n\n\t\t\t\t\t// Candidate found.\n\t\t\t\t\tequalities[ equalitiesLength++ ] = pointer;\n\t\t\t\t\tpreIns = postIns;\n\t\t\t\t\tpreDel = postDel;\n\t\t\t\t\tlastequality = diffs[ pointer ][ 1 ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// Not a candidate, and can never become one.\n\t\t\t\t\tequalitiesLength = 0;\n\t\t\t\t\tlastequality = null;\n\t\t\t\t}\n\t\t\t\tpostIns = postDel = false;\n\n\t\t\t// An insertion or deletion.\n\t\t\t} else {\n\n\t\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {\n\t\t\t\t\tpostDel = true;\n\t\t\t\t} else {\n\t\t\t\t\tpostIns = true;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Five types to be split:\n\t\t\t\t * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n\t\t\t\t * <ins>A</ins>X<ins>C</ins><del>D</del>\n\t\t\t\t * <ins>A</ins><del>B</del>X<ins>C</ins>\n\t\t\t\t * <ins>A</del>X<ins>C</ins><del>D</del>\n\t\t\t\t * <ins>A</ins><del>B</del>X<del>C</del>\n\t\t\t\t */\n\t\t\t\tif ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||\n\t\t\t\t\t\t( ( lastequality.length < 2 ) &&\n\t\t\t\t\t\t( preIns + preDel + postIns + postDel ) === 3 ) ) ) {\n\n\t\t\t\t\t// Duplicate record.\n\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\tequalities[ equalitiesLength - 1 ],\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t[ DIFF_DELETE, lastequality ]\n\t\t\t\t\t);\n\n\t\t\t\t\t// Change second copy to insert.\n\t\t\t\t\tdiffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;\n\t\t\t\t\tequalitiesLength--; // Throw away the equality we just deleted;\n\t\t\t\t\tlastequality = null;\n\t\t\t\t\tif ( preIns && preDel ) {\n\n\t\t\t\t\t\t// No changes made which could affect previous entry, keep going.\n\t\t\t\t\t\tpostIns = postDel = true;\n\t\t\t\t\t\tequalitiesLength = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tequalitiesLength--; // Throw away the previous equality.\n\t\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;\n\t\t\t\t\t\tpostIns = postDel = false;\n\t\t\t\t\t}\n\t\t\t\t\tchanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\n\t\tif ( changes ) {\n\t\t\tthis.diffCleanupMerge( diffs );\n\t\t}\n\t};\n\n\t/**\n\t * Convert a diff array into a pretty HTML report.\n\t * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n\t * @param {integer} string to be beautified.\n\t * @return {string} HTML representation.\n\t */\n\tDiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {\n\t\tvar op, data, x,\n\t\t\thtml = [];\n\t\tfor ( x = 0; x < diffs.length; x++ ) {\n\t\t\top = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)\n\t\t\tdata = diffs[ x ][ 1 ]; // Text of change.\n\t\t\tswitch ( op ) {\n\t\t\tcase DIFF_INSERT:\n\t\t\t\thtml[ x ] = \"<ins>\" + escapeText( data ) + \"</ins>\";\n\t\t\t\tbreak;\n\t\t\tcase DIFF_DELETE:\n\t\t\t\thtml[ x ] = \"<del>\" + escapeText( data ) + \"</del>\";\n\t\t\t\tbreak;\n\t\t\tcase DIFF_EQUAL:\n\t\t\t\thtml[ x ] = \"<span>\" + escapeText( data ) + \"</span>\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn html.join( \"\" );\n\t};\n\n\t/**\n\t * Determine the common prefix of two strings.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the start of each\n\t *     string.\n\t */\n\tDiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {\n\t\tvar pointermid, pointermax, pointermin, pointerstart;\n\n\t\t// Quick check for common null cases.\n\t\tif ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Binary search.\n\t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n\t\tpointermin = 0;\n\t\tpointermax = Math.min( text1.length, text2.length );\n\t\tpointermid = pointermax;\n\t\tpointerstart = 0;\n\t\twhile ( pointermin < pointermid ) {\n\t\t\tif ( text1.substring( pointerstart, pointermid ) ===\n\t\t\t\t\ttext2.substring( pointerstart, pointermid ) ) {\n\t\t\t\tpointermin = pointermid;\n\t\t\t\tpointerstart = pointermin;\n\t\t\t} else {\n\t\t\t\tpointermax = pointermid;\n\t\t\t}\n\t\t\tpointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );\n\t\t}\n\t\treturn pointermid;\n\t};\n\n\t/**\n\t * Determine the common suffix of two strings.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the end of each string.\n\t */\n\tDiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {\n\t\tvar pointermid, pointermax, pointermin, pointerend;\n\n\t\t// Quick check for common null cases.\n\t\tif ( !text1 ||\n\t\t\t\t!text2 ||\n\t\t\t\ttext1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Binary search.\n\t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n\t\tpointermin = 0;\n\t\tpointermax = Math.min( text1.length, text2.length );\n\t\tpointermid = pointermax;\n\t\tpointerend = 0;\n\t\twhile ( pointermin < pointermid ) {\n\t\t\tif ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===\n\t\t\t\t\ttext2.substring( text2.length - pointermid, text2.length - pointerend ) ) {\n\t\t\t\tpointermin = pointermid;\n\t\t\t\tpointerend = pointermin;\n\t\t\t} else {\n\t\t\t\tpointermax = pointermid;\n\t\t\t}\n\t\t\tpointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );\n\t\t}\n\t\treturn pointermid;\n\t};\n\n\t/**\n\t * Find the differences between two texts.  Assumes that the texts do not\n\t * have any common prefix or suffix.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {boolean} checklines Speedup flag.  If false, then don't run a\n\t *     line-level diff first to identify the changed areas.\n\t *     If true, then run a faster, slightly less optimal diff.\n\t * @param {number} deadline Time when the diff should be complete by.\n\t * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {\n\t\tvar diffs, longtext, shorttext, i, hm,\n\t\t\ttext1A, text2A, text1B, text2B,\n\t\t\tmidCommon, diffsA, diffsB;\n\n\t\tif ( !text1 ) {\n\n\t\t\t// Just add some text (speedup).\n\t\t\treturn [\n\t\t\t\t[ DIFF_INSERT, text2 ]\n\t\t\t];\n\t\t}\n\n\t\tif ( !text2 ) {\n\n\t\t\t// Just delete some text (speedup).\n\t\t\treturn [\n\t\t\t\t[ DIFF_DELETE, text1 ]\n\t\t\t];\n\t\t}\n\n\t\tlongtext = text1.length > text2.length ? text1 : text2;\n\t\tshorttext = text1.length > text2.length ? text2 : text1;\n\t\ti = longtext.indexOf( shorttext );\n\t\tif ( i !== -1 ) {\n\n\t\t\t// Shorter text is inside the longer text (speedup).\n\t\t\tdiffs = [\n\t\t\t\t[ DIFF_INSERT, longtext.substring( 0, i ) ],\n\t\t\t\t[ DIFF_EQUAL, shorttext ],\n\t\t\t\t[ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]\n\t\t\t];\n\n\t\t\t// Swap insertions for deletions if diff is reversed.\n\t\t\tif ( text1.length > text2.length ) {\n\t\t\t\tdiffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;\n\t\t\t}\n\t\t\treturn diffs;\n\t\t}\n\n\t\tif ( shorttext.length === 1 ) {\n\n\t\t\t// Single character string.\n\t\t\t// After the previous speedup, the character can't be an equality.\n\t\t\treturn [\n\t\t\t\t[ DIFF_DELETE, text1 ],\n\t\t\t\t[ DIFF_INSERT, text2 ]\n\t\t\t];\n\t\t}\n\n\t\t// Check to see if the problem can be split in two.\n\t\thm = this.diffHalfMatch( text1, text2 );\n\t\tif ( hm ) {\n\n\t\t\t// A half-match was found, sort out the return data.\n\t\t\ttext1A = hm[ 0 ];\n\t\t\ttext1B = hm[ 1 ];\n\t\t\ttext2A = hm[ 2 ];\n\t\t\ttext2B = hm[ 3 ];\n\t\t\tmidCommon = hm[ 4 ];\n\n\t\t\t// Send both pairs off for separate processing.\n\t\t\tdiffsA = this.DiffMain( text1A, text2A, checklines, deadline );\n\t\t\tdiffsB = this.DiffMain( text1B, text2B, checklines, deadline );\n\n\t\t\t// Merge the results.\n\t\t\treturn diffsA.concat( [\n\t\t\t\t[ DIFF_EQUAL, midCommon ]\n\t\t\t], diffsB );\n\t\t}\n\n\t\tif ( checklines && text1.length > 100 && text2.length > 100 ) {\n\t\t\treturn this.diffLineMode( text1, text2, deadline );\n\t\t}\n\n\t\treturn this.diffBisect( text1, text2, deadline );\n\t};\n\n\t/**\n\t * Do the two texts share a substring which is at least half the length of the\n\t * longer text?\n\t * This speedup can produce non-minimal diffs.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {Array.<string>} Five element Array, containing the prefix of\n\t *     text1, the suffix of text1, the prefix of text2, the suffix of\n\t *     text2 and the common middle.  Or null if there was no match.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {\n\t\tvar longtext, shorttext, dmp,\n\t\t\ttext1A, text2B, text2A, text1B, midCommon,\n\t\t\thm1, hm2, hm;\n\n\t\tlongtext = text1.length > text2.length ? text1 : text2;\n\t\tshorttext = text1.length > text2.length ? text2 : text1;\n\t\tif ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {\n\t\t\treturn null; // Pointless.\n\t\t}\n\t\tdmp = this; // 'this' becomes 'window' in a closure.\n\n\t\t/**\n\t\t * Does a substring of shorttext exist within longtext such that the substring\n\t\t * is at least half the length of longtext?\n\t\t * Closure, but does not reference any external variables.\n\t\t * @param {string} longtext Longer string.\n\t\t * @param {string} shorttext Shorter string.\n\t\t * @param {number} i Start index of quarter length substring within longtext.\n\t\t * @return {Array.<string>} Five element Array, containing the prefix of\n\t\t *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n\t\t *     of shorttext and the common middle.  Or null if there was no match.\n\t\t * @private\n\t\t */\n\t\tfunction diffHalfMatchI( longtext, shorttext, i ) {\n\t\t\tvar seed, j, bestCommon, prefixLength, suffixLength,\n\t\t\t\tbestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n\t\t\t// Start with a 1/4 length substring at position i as a seed.\n\t\t\tseed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );\n\t\t\tj = -1;\n\t\t\tbestCommon = \"\";\n\t\t\twhile ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {\n\t\t\t\tprefixLength = dmp.diffCommonPrefix( longtext.substring( i ),\n\t\t\t\t\tshorttext.substring( j ) );\n\t\t\t\tsuffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),\n\t\t\t\t\tshorttext.substring( 0, j ) );\n\t\t\t\tif ( bestCommon.length < suffixLength + prefixLength ) {\n\t\t\t\t\tbestCommon = shorttext.substring( j - suffixLength, j ) +\n\t\t\t\t\t\tshorttext.substring( j, j + prefixLength );\n\t\t\t\t\tbestLongtextA = longtext.substring( 0, i - suffixLength );\n\t\t\t\t\tbestLongtextB = longtext.substring( i + prefixLength );\n\t\t\t\t\tbestShorttextA = shorttext.substring( 0, j - suffixLength );\n\t\t\t\t\tbestShorttextB = shorttext.substring( j + prefixLength );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( bestCommon.length * 2 >= longtext.length ) {\n\t\t\t\treturn [ bestLongtextA, bestLongtextB,\n\t\t\t\t\tbestShorttextA, bestShorttextB, bestCommon\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// First check if the second quarter is the seed for a half-match.\n\t\thm1 = diffHalfMatchI( longtext, shorttext,\n\t\t\tMath.ceil( longtext.length / 4 ) );\n\n\t\t// Check again based on the third quarter.\n\t\thm2 = diffHalfMatchI( longtext, shorttext,\n\t\t\tMath.ceil( longtext.length / 2 ) );\n\t\tif ( !hm1 && !hm2 ) {\n\t\t\treturn null;\n\t\t} else if ( !hm2 ) {\n\t\t\thm = hm1;\n\t\t} else if ( !hm1 ) {\n\t\t\thm = hm2;\n\t\t} else {\n\n\t\t\t// Both matched.  Select the longest.\n\t\t\thm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;\n\t\t}\n\n\t\t// A half-match was found, sort out the return data.\n\t\ttext1A, text1B, text2A, text2B;\n\t\tif ( text1.length > text2.length ) {\n\t\t\ttext1A = hm[ 0 ];\n\t\t\ttext1B = hm[ 1 ];\n\t\t\ttext2A = hm[ 2 ];\n\t\t\ttext2B = hm[ 3 ];\n\t\t} else {\n\t\t\ttext2A = hm[ 0 ];\n\t\t\ttext2B = hm[ 1 ];\n\t\t\ttext1A = hm[ 2 ];\n\t\t\ttext1B = hm[ 3 ];\n\t\t}\n\t\tmidCommon = hm[ 4 ];\n\t\treturn [ text1A, text1B, text2A, text2B, midCommon ];\n\t};\n\n\t/**\n\t * Do a quick line-level diff on both strings, then rediff the parts for\n\t * greater accuracy.\n\t * This speedup can produce non-minimal diffs.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {number} deadline Time when the diff should be complete by.\n\t * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {\n\t\tvar a, diffs, linearray, pointer, countInsert,\n\t\t\tcountDelete, textInsert, textDelete, j;\n\n\t\t// Scan the text on a line-by-line basis first.\n\t\ta = this.diffLinesToChars( text1, text2 );\n\t\ttext1 = a.chars1;\n\t\ttext2 = a.chars2;\n\t\tlinearray = a.lineArray;\n\n\t\tdiffs = this.DiffMain( text1, text2, false, deadline );\n\n\t\t// Convert the diff back to original text.\n\t\tthis.diffCharsToLines( diffs, linearray );\n\n\t\t// Eliminate freak matches (e.g. blank lines)\n\t\tthis.diffCleanupSemantic( diffs );\n\n\t\t// Rediff any replacement blocks, this time character-by-character.\n\t\t// Add a dummy entry at the end.\n\t\tdiffs.push( [ DIFF_EQUAL, \"\" ] );\n\t\tpointer = 0;\n\t\tcountDelete = 0;\n\t\tcountInsert = 0;\n\t\ttextDelete = \"\";\n\t\ttextInsert = \"\";\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tswitch ( diffs[ pointer ][ 0 ] ) {\n\t\t\tcase DIFF_INSERT:\n\t\t\t\tcountInsert++;\n\t\t\t\ttextInsert += diffs[ pointer ][ 1 ];\n\t\t\t\tbreak;\n\t\t\tcase DIFF_DELETE:\n\t\t\t\tcountDelete++;\n\t\t\t\ttextDelete += diffs[ pointer ][ 1 ];\n\t\t\t\tbreak;\n\t\t\tcase DIFF_EQUAL:\n\n\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n\t\t\t\tif ( countDelete >= 1 && countInsert >= 1 ) {\n\n\t\t\t\t\t// Delete the offending records and add the merged ones.\n\t\t\t\t\tdiffs.splice( pointer - countDelete - countInsert,\n\t\t\t\t\t\tcountDelete + countInsert );\n\t\t\t\t\tpointer = pointer - countDelete - countInsert;\n\t\t\t\t\ta = this.DiffMain( textDelete, textInsert, false, deadline );\n\t\t\t\t\tfor ( j = a.length - 1; j >= 0; j-- ) {\n\t\t\t\t\t\tdiffs.splice( pointer, 0, a[ j ] );\n\t\t\t\t\t}\n\t\t\t\t\tpointer = pointer + a.length;\n\t\t\t\t}\n\t\t\t\tcountInsert = 0;\n\t\t\t\tcountDelete = 0;\n\t\t\t\ttextDelete = \"\";\n\t\t\t\ttextInsert = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\t\tdiffs.pop(); // Remove the dummy entry at the end.\n\n\t\treturn diffs;\n\t};\n\n\t/**\n\t * Find the 'middle snake' of a diff, split the problem in two\n\t * and return the recursively constructed diff.\n\t * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {number} deadline Time at which to bail if not yet complete.\n\t * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {\n\t\tvar text1Length, text2Length, maxD, vOffset, vLength,\n\t\t\tv1, v2, x, delta, front, k1start, k1end, k2start,\n\t\t\tk2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n\t\t// Cache the text lengths to prevent multiple calls.\n\t\ttext1Length = text1.length;\n\t\ttext2Length = text2.length;\n\t\tmaxD = Math.ceil( ( text1Length + text2Length ) / 2 );\n\t\tvOffset = maxD;\n\t\tvLength = 2 * maxD;\n\t\tv1 = new Array( vLength );\n\t\tv2 = new Array( vLength );\n\n\t\t// Setting all elements to -1 is faster in Chrome & Firefox than mixing\n\t\t// integers and undefined.\n\t\tfor ( x = 0; x < vLength; x++ ) {\n\t\t\tv1[ x ] = -1;\n\t\t\tv2[ x ] = -1;\n\t\t}\n\t\tv1[ vOffset + 1 ] = 0;\n\t\tv2[ vOffset + 1 ] = 0;\n\t\tdelta = text1Length - text2Length;\n\n\t\t// If the total number of characters is odd, then the front path will collide\n\t\t// with the reverse path.\n\t\tfront = ( delta % 2 !== 0 );\n\n\t\t// Offsets for start and end of k loop.\n\t\t// Prevents mapping of space beyond the grid.\n\t\tk1start = 0;\n\t\tk1end = 0;\n\t\tk2start = 0;\n\t\tk2end = 0;\n\t\tfor ( d = 0; d < maxD; d++ ) {\n\n\t\t\t// Bail out if deadline is reached.\n\t\t\tif ( ( new Date() ).getTime() > deadline ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Walk the front path one step.\n\t\t\tfor ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {\n\t\t\t\tk1Offset = vOffset + k1;\n\t\t\t\tif ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {\n\t\t\t\t\tx1 = v1[ k1Offset + 1 ];\n\t\t\t\t} else {\n\t\t\t\t\tx1 = v1[ k1Offset - 1 ] + 1;\n\t\t\t\t}\n\t\t\t\ty1 = x1 - k1;\n\t\t\t\twhile ( x1 < text1Length && y1 < text2Length &&\n\t\t\t\t\ttext1.charAt( x1 ) === text2.charAt( y1 ) ) {\n\t\t\t\t\tx1++;\n\t\t\t\t\ty1++;\n\t\t\t\t}\n\t\t\t\tv1[ k1Offset ] = x1;\n\t\t\t\tif ( x1 > text1Length ) {\n\n\t\t\t\t\t// Ran off the right of the graph.\n\t\t\t\t\tk1end += 2;\n\t\t\t\t} else if ( y1 > text2Length ) {\n\n\t\t\t\t\t// Ran off the bottom of the graph.\n\t\t\t\t\tk1start += 2;\n\t\t\t\t} else if ( front ) {\n\t\t\t\t\tk2Offset = vOffset + delta - k1;\n\t\t\t\t\tif ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {\n\n\t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n\t\t\t\t\t\tx2 = text1Length - v2[ k2Offset ];\n\t\t\t\t\t\tif ( x1 >= x2 ) {\n\n\t\t\t\t\t\t\t// Overlap detected.\n\t\t\t\t\t\t\treturn this.diffBisectSplit( text1, text2, x1, y1, deadline );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Walk the reverse path one step.\n\t\t\tfor ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {\n\t\t\t\tk2Offset = vOffset + k2;\n\t\t\t\tif ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {\n\t\t\t\t\tx2 = v2[ k2Offset + 1 ];\n\t\t\t\t} else {\n\t\t\t\t\tx2 = v2[ k2Offset - 1 ] + 1;\n\t\t\t\t}\n\t\t\t\ty2 = x2 - k2;\n\t\t\t\twhile ( x2 < text1Length && y2 < text2Length &&\n\t\t\t\t\ttext1.charAt( text1Length - x2 - 1 ) ===\n\t\t\t\t\ttext2.charAt( text2Length - y2 - 1 ) ) {\n\t\t\t\t\tx2++;\n\t\t\t\t\ty2++;\n\t\t\t\t}\n\t\t\t\tv2[ k2Offset ] = x2;\n\t\t\t\tif ( x2 > text1Length ) {\n\n\t\t\t\t\t// Ran off the left of the graph.\n\t\t\t\t\tk2end += 2;\n\t\t\t\t} else if ( y2 > text2Length ) {\n\n\t\t\t\t\t// Ran off the top of the graph.\n\t\t\t\t\tk2start += 2;\n\t\t\t\t} else if ( !front ) {\n\t\t\t\t\tk1Offset = vOffset + delta - k2;\n\t\t\t\t\tif ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {\n\t\t\t\t\t\tx1 = v1[ k1Offset ];\n\t\t\t\t\t\ty1 = vOffset + x1 - k1Offset;\n\n\t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n\t\t\t\t\t\tx2 = text1Length - x2;\n\t\t\t\t\t\tif ( x1 >= x2 ) {\n\n\t\t\t\t\t\t\t// Overlap detected.\n\t\t\t\t\t\t\treturn this.diffBisectSplit( text1, text2, x1, y1, deadline );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Diff took too long and hit the deadline or\n\t\t// number of diffs equals number of characters, no commonality at all.\n\t\treturn [\n\t\t\t[ DIFF_DELETE, text1 ],\n\t\t\t[ DIFF_INSERT, text2 ]\n\t\t];\n\t};\n\n\t/**\n\t * Given the location of the 'middle snake', split the diff in two parts\n\t * and recurse.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {number} x Index of split point in text1.\n\t * @param {number} y Index of split point in text2.\n\t * @param {number} deadline Time at which to bail if not yet complete.\n\t * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {\n\t\tvar text1a, text1b, text2a, text2b, diffs, diffsb;\n\t\ttext1a = text1.substring( 0, x );\n\t\ttext2a = text2.substring( 0, y );\n\t\ttext1b = text1.substring( x );\n\t\ttext2b = text2.substring( y );\n\n\t\t// Compute both diffs serially.\n\t\tdiffs = this.DiffMain( text1a, text2a, false, deadline );\n\t\tdiffsb = this.DiffMain( text1b, text2b, false, deadline );\n\n\t\treturn diffs.concat( diffsb );\n\t};\n\n\t/**\n\t * Reduce the number of edits by eliminating semantically trivial equalities.\n\t * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {\n\t\tvar changes, equalities, equalitiesLength, lastequality,\n\t\t\tpointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,\n\t\t\tlengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;\n\t\tchanges = false;\n\t\tequalities = []; // Stack of indices where equalities are found.\n\t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n\t\t/** @type {?string} */\n\t\tlastequality = null;\n\n\t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n\t\tpointer = 0; // Index of current position.\n\n\t\t// Number of characters that changed prior to the equality.\n\t\tlengthInsertions1 = 0;\n\t\tlengthDeletions1 = 0;\n\n\t\t// Number of characters that changed after the equality.\n\t\tlengthInsertions2 = 0;\n\t\tlengthDeletions2 = 0;\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.\n\t\t\t\tequalities[ equalitiesLength++ ] = pointer;\n\t\t\t\tlengthInsertions1 = lengthInsertions2;\n\t\t\t\tlengthDeletions1 = lengthDeletions2;\n\t\t\t\tlengthInsertions2 = 0;\n\t\t\t\tlengthDeletions2 = 0;\n\t\t\t\tlastequality = diffs[ pointer ][ 1 ];\n\t\t\t} else { // An insertion or deletion.\n\t\t\t\tif ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {\n\t\t\t\t\tlengthInsertions2 += diffs[ pointer ][ 1 ].length;\n\t\t\t\t} else {\n\t\t\t\t\tlengthDeletions2 += diffs[ pointer ][ 1 ].length;\n\t\t\t\t}\n\n\t\t\t\t// Eliminate an equality that is smaller or equal to the edits on both\n\t\t\t\t// sides of it.\n\t\t\t\tif ( lastequality && ( lastequality.length <=\n\t\t\t\t\t\tMath.max( lengthInsertions1, lengthDeletions1 ) ) &&\n\t\t\t\t\t\t( lastequality.length <= Math.max( lengthInsertions2,\n\t\t\t\t\t\t\tlengthDeletions2 ) ) ) {\n\n\t\t\t\t\t// Duplicate record.\n\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\tequalities[ equalitiesLength - 1 ],\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t[ DIFF_DELETE, lastequality ]\n\t\t\t\t\t);\n\n\t\t\t\t\t// Change second copy to insert.\n\t\t\t\t\tdiffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;\n\n\t\t\t\t\t// Throw away the equality we just deleted.\n\t\t\t\t\tequalitiesLength--;\n\n\t\t\t\t\t// Throw away the previous equality (it needs to be reevaluated).\n\t\t\t\t\tequalitiesLength--;\n\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;\n\n\t\t\t\t\t// Reset the counters.\n\t\t\t\t\tlengthInsertions1 = 0;\n\t\t\t\t\tlengthDeletions1 = 0;\n\t\t\t\t\tlengthInsertions2 = 0;\n\t\t\t\t\tlengthDeletions2 = 0;\n\t\t\t\t\tlastequality = null;\n\t\t\t\t\tchanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\n\t\t// Normalize the diff.\n\t\tif ( changes ) {\n\t\t\tthis.diffCleanupMerge( diffs );\n\t\t}\n\n\t\t// Find any overlaps between deletions and insertions.\n\t\t// e.g: <del>abcxxx</del><ins>xxxdef</ins>\n\t\t//   -> <del>abc</del>xxx<ins>def</ins>\n\t\t// e.g: <del>xxxabc</del><ins>defxxx</ins>\n\t\t//   -> <ins>def</ins>xxx<del>abc</del>\n\t\t// Only extract an overlap if it is as big as the edit ahead or behind it.\n\t\tpointer = 1;\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tif ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&\n\t\t\t\t\tdiffs[ pointer ][ 0 ] === DIFF_INSERT ) {\n\t\t\t\tdeletion = diffs[ pointer - 1 ][ 1 ];\n\t\t\t\tinsertion = diffs[ pointer ][ 1 ];\n\t\t\t\toverlapLength1 = this.diffCommonOverlap( deletion, insertion );\n\t\t\t\toverlapLength2 = this.diffCommonOverlap( insertion, deletion );\n\t\t\t\tif ( overlapLength1 >= overlapLength2 ) {\n\t\t\t\t\tif ( overlapLength1 >= deletion.length / 2 ||\n\t\t\t\t\t\t\toverlapLength1 >= insertion.length / 2 ) {\n\n\t\t\t\t\t\t// Overlap found.  Insert an equality and trim the surrounding edits.\n\t\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\t\tpointer,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t[ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] =\n\t\t\t\t\t\t\tdeletion.substring( 0, deletion.length - overlapLength1 );\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );\n\t\t\t\t\t\tpointer++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( overlapLength2 >= deletion.length / 2 ||\n\t\t\t\t\t\t\toverlapLength2 >= insertion.length / 2 ) {\n\n\t\t\t\t\t\t// Reverse overlap found.\n\t\t\t\t\t\t// Insert an equality and swap and trim the surrounding edits.\n\t\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\t\tpointer,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t[ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] =\n\t\t\t\t\t\t\tinsertion.substring( 0, insertion.length - overlapLength2 );\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] =\n\t\t\t\t\t\t\tdeletion.substring( overlapLength2 );\n\t\t\t\t\t\tpointer++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpointer++;\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\t};\n\n\t/**\n\t * Determine if the suffix of one string is the prefix of another.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the end of the first\n\t *     string and the start of the second string.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {\n\t\tvar text1Length, text2Length, textLength,\n\t\t\tbest, length, pattern, found;\n\n\t\t// Cache the text lengths to prevent multiple calls.\n\t\ttext1Length = text1.length;\n\t\ttext2Length = text2.length;\n\n\t\t// Eliminate the null case.\n\t\tif ( text1Length === 0 || text2Length === 0 ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Truncate the longer string.\n\t\tif ( text1Length > text2Length ) {\n\t\t\ttext1 = text1.substring( text1Length - text2Length );\n\t\t} else if ( text1Length < text2Length ) {\n\t\t\ttext2 = text2.substring( 0, text1Length );\n\t\t}\n\t\ttextLength = Math.min( text1Length, text2Length );\n\n\t\t// Quick check for the worst case.\n\t\tif ( text1 === text2 ) {\n\t\t\treturn textLength;\n\t\t}\n\n\t\t// Start by looking for a single character match\n\t\t// and increase length until no match is found.\n\t\t// Performance analysis: https://neil.fraser.name/news/2010/11/04/\n\t\tbest = 0;\n\t\tlength = 1;\n\t\twhile ( true ) {\n\t\t\tpattern = text1.substring( textLength - length );\n\t\t\tfound = text2.indexOf( pattern );\n\t\t\tif ( found === -1 ) {\n\t\t\t\treturn best;\n\t\t\t}\n\t\t\tlength += found;\n\t\t\tif ( found === 0 || text1.substring( textLength - length ) ===\n\t\t\t\t\ttext2.substring( 0, length ) ) {\n\t\t\t\tbest = length;\n\t\t\t\tlength++;\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Split two texts into an array of strings.  Reduce the texts to a string of\n\t * hashes where each Unicode character represents one line.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n\t *     An object containing the encoded text1, the encoded text2 and\n\t *     the array of unique strings.\n\t *     The zeroth element of the array of unique strings is intentionally blank.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {\n\t\tvar lineArray, lineHash, chars1, chars2;\n\t\tlineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n\t\tlineHash = {};  // E.g. lineHash['Hello\\n'] === 4\n\n\t\t// '\\x00' is a valid character, but various debuggers don't like it.\n\t\t// So we'll insert a junk entry to avoid generating a null character.\n\t\tlineArray[ 0 ] = \"\";\n\n\t\t/**\n\t\t * Split a text into an array of strings.  Reduce the texts to a string of\n\t\t * hashes where each Unicode character represents one line.\n\t\t * Modifies linearray and linehash through being a closure.\n\t\t * @param {string} text String to encode.\n\t\t * @return {string} Encoded string.\n\t\t * @private\n\t\t */\n\t\tfunction diffLinesToCharsMunge( text ) {\n\t\t\tvar chars, lineStart, lineEnd, lineArrayLength, line;\n\t\t\tchars = \"\";\n\n\t\t\t// Walk the text, pulling out a substring for each line.\n\t\t\t// text.split('\\n') would would temporarily double our memory footprint.\n\t\t\t// Modifying text would create many large strings to garbage collect.\n\t\t\tlineStart = 0;\n\t\t\tlineEnd = -1;\n\n\t\t\t// Keeping our own length variable is faster than looking it up.\n\t\t\tlineArrayLength = lineArray.length;\n\t\t\twhile ( lineEnd < text.length - 1 ) {\n\t\t\t\tlineEnd = text.indexOf( \"\\n\", lineStart );\n\t\t\t\tif ( lineEnd === -1 ) {\n\t\t\t\t\tlineEnd = text.length - 1;\n\t\t\t\t}\n\t\t\t\tline = text.substring( lineStart, lineEnd + 1 );\n\t\t\t\tlineStart = lineEnd + 1;\n\n\t\t\t\tif ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :\n\t\t\t\t\t\t\t( lineHash[ line ] !== undefined ) ) {\n\t\t\t\t\tchars += String.fromCharCode( lineHash[ line ] );\n\t\t\t\t} else {\n\t\t\t\t\tchars += String.fromCharCode( lineArrayLength );\n\t\t\t\t\tlineHash[ line ] = lineArrayLength;\n\t\t\t\t\tlineArray[ lineArrayLength++ ] = line;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn chars;\n\t\t}\n\n\t\tchars1 = diffLinesToCharsMunge( text1 );\n\t\tchars2 = diffLinesToCharsMunge( text2 );\n\t\treturn {\n\t\t\tchars1: chars1,\n\t\t\tchars2: chars2,\n\t\t\tlineArray: lineArray\n\t\t};\n\t};\n\n\t/**\n\t * Rehydrate the text in a diff from a string of line hashes to real lines of\n\t * text.\n\t * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n\t * @param {!Array.<string>} lineArray Array of unique strings.\n\t * @private\n\t */\n\tDiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {\n\t\tvar x, chars, text, y;\n\t\tfor ( x = 0; x < diffs.length; x++ ) {\n\t\t\tchars = diffs[ x ][ 1 ];\n\t\t\ttext = [];\n\t\t\tfor ( y = 0; y < chars.length; y++ ) {\n\t\t\t\ttext[ y ] = lineArray[ chars.charCodeAt( y ) ];\n\t\t\t}\n\t\t\tdiffs[ x ][ 1 ] = text.join( \"\" );\n\t\t}\n\t};\n\n\t/**\n\t * Reorder and merge like edit sections.  Merge equalities.\n\t * Any edit section can move as long as it doesn't cross an equality.\n\t * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n\t */\n\tDiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {\n\t\tvar pointer, countDelete, countInsert, textInsert, textDelete,\n\t\t\tcommonlength, changes, diffPointer, position;\n\t\tdiffs.push( [ DIFF_EQUAL, \"\" ] ); // Add a dummy entry at the end.\n\t\tpointer = 0;\n\t\tcountDelete = 0;\n\t\tcountInsert = 0;\n\t\ttextDelete = \"\";\n\t\ttextInsert = \"\";\n\t\tcommonlength;\n\t\twhile ( pointer < diffs.length ) {\n\t\t\tswitch ( diffs[ pointer ][ 0 ] ) {\n\t\t\tcase DIFF_INSERT:\n\t\t\t\tcountInsert++;\n\t\t\t\ttextInsert += diffs[ pointer ][ 1 ];\n\t\t\t\tpointer++;\n\t\t\t\tbreak;\n\t\t\tcase DIFF_DELETE:\n\t\t\t\tcountDelete++;\n\t\t\t\ttextDelete += diffs[ pointer ][ 1 ];\n\t\t\t\tpointer++;\n\t\t\t\tbreak;\n\t\t\tcase DIFF_EQUAL:\n\n\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n\t\t\t\tif ( countDelete + countInsert > 1 ) {\n\t\t\t\t\tif ( countDelete !== 0 && countInsert !== 0 ) {\n\n\t\t\t\t\t\t// Factor out any common prefixes.\n\t\t\t\t\t\tcommonlength = this.diffCommonPrefix( textInsert, textDelete );\n\t\t\t\t\t\tif ( commonlength !== 0 ) {\n\t\t\t\t\t\t\tif ( ( pointer - countDelete - countInsert ) > 0 &&\n\t\t\t\t\t\t\t\t\tdiffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===\n\t\t\t\t\t\t\t\t\tDIFF_EQUAL ) {\n\t\t\t\t\t\t\t\tdiffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=\n\t\t\t\t\t\t\t\t\ttextInsert.substring( 0, commonlength );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdiffs.splice( 0, 0, [ DIFF_EQUAL,\n\t\t\t\t\t\t\t\t\ttextInsert.substring( 0, commonlength )\n\t\t\t\t\t\t\t\t] );\n\t\t\t\t\t\t\t\tpointer++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttextInsert = textInsert.substring( commonlength );\n\t\t\t\t\t\t\ttextDelete = textDelete.substring( commonlength );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Factor out any common suffixies.\n\t\t\t\t\t\tcommonlength = this.diffCommonSuffix( textInsert, textDelete );\n\t\t\t\t\t\tif ( commonlength !== 0 ) {\n\t\t\t\t\t\t\tdiffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -\n\t\t\t\t\t\t\t\t\tcommonlength ) + diffs[ pointer ][ 1 ];\n\t\t\t\t\t\t\ttextInsert = textInsert.substring( 0, textInsert.length -\n\t\t\t\t\t\t\t\tcommonlength );\n\t\t\t\t\t\t\ttextDelete = textDelete.substring( 0, textDelete.length -\n\t\t\t\t\t\t\t\tcommonlength );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Delete the offending records and add the merged ones.\n\t\t\t\t\tif ( countDelete === 0 ) {\n\t\t\t\t\t\tdiffs.splice( pointer - countInsert,\n\t\t\t\t\t\t\tcountDelete + countInsert, [ DIFF_INSERT, textInsert ] );\n\t\t\t\t\t} else if ( countInsert === 0 ) {\n\t\t\t\t\t\tdiffs.splice( pointer - countDelete,\n\t\t\t\t\t\t\tcountDelete + countInsert, [ DIFF_DELETE, textDelete ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffs.splice(\n\t\t\t\t\t\t\tpointer - countDelete - countInsert,\n\t\t\t\t\t\t\tcountDelete + countInsert,\n\t\t\t\t\t\t\t[ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tpointer = pointer - countDelete - countInsert +\n\t\t\t\t\t\t( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;\n\t\t\t\t} else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {\n\n\t\t\t\t\t// Merge this equality with the previous one.\n\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];\n\t\t\t\t\tdiffs.splice( pointer, 1 );\n\t\t\t\t} else {\n\t\t\t\t\tpointer++;\n\t\t\t\t}\n\t\t\t\tcountInsert = 0;\n\t\t\t\tcountDelete = 0;\n\t\t\t\ttextDelete = \"\";\n\t\t\t\ttextInsert = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ( diffs[ diffs.length - 1 ][ 1 ] === \"\" ) {\n\t\t\tdiffs.pop(); // Remove the dummy entry at the end.\n\t\t}\n\n\t\t// Second pass: look for single edits surrounded on both sides by equalities\n\t\t// which can be shifted sideways to eliminate an equality.\n\t\t// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n\t\tchanges = false;\n\t\tpointer = 1;\n\n\t\t// Intentionally ignore the first and last element (don't need checking).\n\t\twhile ( pointer < diffs.length - 1 ) {\n\t\t\tif ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&\n\t\t\t\t\tdiffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {\n\n\t\t\t\tdiffPointer = diffs[ pointer ][ 1 ];\n\t\t\t\tposition = diffPointer.substring(\n\t\t\t\t\tdiffPointer.length - diffs[ pointer - 1 ][ 1 ].length\n\t\t\t\t);\n\n\t\t\t\t// This is a single edit surrounded by equalities.\n\t\t\t\tif ( position === diffs[ pointer - 1 ][ 1 ] ) {\n\n\t\t\t\t\t// Shift the edit over the previous equality.\n\t\t\t\t\tdiffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +\n\t\t\t\t\t\tdiffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -\n\t\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ].length );\n\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] =\n\t\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];\n\t\t\t\t\tdiffs.splice( pointer - 1, 1 );\n\t\t\t\t\tchanges = true;\n\t\t\t\t} else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ] ) {\n\n\t\t\t\t\t// Shift the edit over the next equality.\n\t\t\t\t\tdiffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];\n\t\t\t\t\tdiffs[ pointer ][ 1 ] =\n\t\t\t\t\t\tdiffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +\n\t\t\t\t\t\tdiffs[ pointer + 1 ][ 1 ];\n\t\t\t\t\tdiffs.splice( pointer + 1, 1 );\n\t\t\t\t\tchanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpointer++;\n\t\t}\n\n\t\t// If shifts were made, the diff needs reordering and another shift sweep.\n\t\tif ( changes ) {\n\t\t\tthis.diffCleanupMerge( diffs );\n\t\t}\n\t};\n\n\treturn function( o, n ) {\n\t\tvar diff, output, text;\n\t\tdiff = new DiffMatchPatch();\n\t\toutput = diff.DiffMain( o, n );\n\t\tdiff.diffCleanupEfficiency( output );\n\t\ttext = diff.diffPrettyHtml( output );\n\n\t\treturn text;\n\t};\n}() );\n\n}() );"
  },
  {
    "path": "common/Tests/External/qunit-2.9.1.css",
    "content": "/*!\n * QUnit 2.9.1\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2019-01-07T16:37Z\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n\n/** Resets */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n\n/** Header (excluding toolbar) */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #8699A4;\n\tbackground-color: #0D3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: 400;\n\n\tborder-radius: 5px 5px 0 0;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: #C2CCD1;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #FFF;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-filteredTest {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tcolor: #366097;\n\tbackground-color: #F4FF77;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tcolor: #FFF;\n\tbackground-color: #2B81AF;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n\n/** Toolbar */\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tcolor: #5E740B;\n\tbackground-color: #EEE;\n}\n\n#qunit-testrunner-toolbar .clearfix {\n\theight: 0;\n\tclear: both;\n}\n\n#qunit-testrunner-toolbar label {\n\tdisplay: inline-block;\n}\n\n#qunit-testrunner-toolbar input[type=checkbox],\n#qunit-testrunner-toolbar input[type=radio] {\n\tmargin: 3px;\n\tvertical-align: -2px;\n}\n\n#qunit-testrunner-toolbar input[type=text] {\n\tbox-sizing: border-box;\n\theight: 1.6em;\n}\n\n.qunit-url-config,\n.qunit-filter,\n#qunit-modulefilter {\n\tdisplay: inline-block;\n\tline-height: 2.1em;\n}\n\n.qunit-filter,\n#qunit-modulefilter {\n\tfloat: right;\n\tposition: relative;\n\tmargin-left: 1em;\n}\n\n.qunit-url-config label {\n\tmargin-right: 0.5em;\n}\n\n#qunit-modulefilter-search {\n\tbox-sizing: border-box;\n\twidth: 400px;\n}\n\n#qunit-modulefilter-search-container:after {\n\tposition: absolute;\n\tright: 0.3em;\n\tcontent: \"\\25bc\";\n\tcolor: black;\n}\n\n#qunit-modulefilter-dropdown {\n\t/* align with #qunit-modulefilter-search */\n\tbox-sizing: border-box;\n\twidth: 400px;\n\tposition: absolute;\n\tright: 0;\n\ttop: 50%;\n\tmargin-top: 0.8em;\n\n\tborder: 1px solid #D3D3D3;\n\tborder-top: none;\n\tborder-radius: 0 0 .25em .25em;\n\tcolor: #000;\n\tbackground-color: #F5F5F5;\n\tz-index: 99;\n}\n\n#qunit-modulefilter-dropdown a {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n\n#qunit-modulefilter-dropdown .clickable.checked {\n\tfont-weight: bold;\n\tcolor: #000;\n\tbackground-color: #D2E0E6;\n}\n\n#qunit-modulefilter-dropdown .clickable:hover {\n\tcolor: #FFF;\n\tbackground-color: #0D3349;\n}\n\n#qunit-modulefilter-actions {\n\tdisplay: block;\n\toverflow: auto;\n\n\t/* align with #qunit-modulefilter-dropdown-list */\n\tfont: smaller/1.5em sans-serif;\n}\n\n#qunit-modulefilter-dropdown #qunit-modulefilter-actions > * {\n\tbox-sizing: border-box;\n\tmax-height: 2.8em;\n\tdisplay: block;\n\tpadding: 0.4em;\n}\n\n#qunit-modulefilter-dropdown #qunit-modulefilter-actions > button {\n\tfloat: right;\n\tfont: inherit;\n}\n\n#qunit-modulefilter-dropdown #qunit-modulefilter-actions > :last-child {\n\t/* insert padding to align with checkbox margins */\n\tpadding-left: 3px;\n}\n\n#qunit-modulefilter-dropdown-list {\n\tmax-height: 200px;\n\toverflow-y: auto;\n\tmargin: 0;\n\tborder-top: 2px groove threedhighlight;\n\tpadding: 0.4em 0 0;\n\tfont: smaller/1.5em sans-serif;\n}\n\n#qunit-modulefilter-dropdown-list li {\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n#qunit-modulefilter-dropdown-list .clickable {\n\tdisplay: block;\n\tpadding-left: 0.15em;\n}\n\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 1em 0.4em 1em;\n\tborder-bottom: 1px solid #FFF;\n\tlist-style-position: inside;\n}\n\n#qunit-tests > li {\n\tdisplay: none;\n}\n\n#qunit-tests li.running,\n#qunit-tests li.pass,\n#qunit-tests li.fail,\n#qunit-tests li.skipped,\n#qunit-tests li.aborted {\n\tdisplay: list-item;\n}\n\n#qunit-tests.hidepass {\n\tposition: relative;\n}\n\n#qunit-tests.hidepass li.running,\n#qunit-tests.hidepass li.pass:not(.todo) {\n\tvisibility: hidden;\n\tposition: absolute;\n\twidth:   0;\n\theight:  0;\n\tpadding: 0;\n\tborder:  0;\n\tmargin:  0;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li.skipped strong {\n\tcursor: default;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: #C2CCD1;\n\ttext-decoration: none;\n}\n\n#qunit-tests li p a {\n\tpadding: 0.25em;\n\tcolor: #6B6464;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #000;\n}\n\n#qunit-tests li .runtime {\n\tfloat: right;\n\tfont-size: smaller;\n}\n\n.qunit-assert-list {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #FFF;\n\n\tborder-radius: 5px;\n}\n\n.qunit-source {\n\tmargin: 0.6em 0 0.3em;\n}\n\n.qunit-collapsed {\n\tdisplay: none;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: 0.2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 0.5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tcolor: #374E0C;\n\tbackground-color: #E0F2BE;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tcolor: #500;\n\tbackground-color: #FFCACA;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: #000; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tpadding: 5px;\n\tbackground-color: #FFF;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n#qunit-tests li li.pass {\n\tcolor: #3C510C;\n\tbackground-color: #FFF;\n\tborder-left: 10px solid #C6E746;\n}\n\n#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }\n#qunit-tests .pass .test-name               { color: #366097; }\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #FFF;\n\tborder-left: 10px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 5px 5px;\n}\n\n#qunit-tests .fail                          { color: #000; background-color: #EE5757; }\n#qunit-tests .fail .test-name,\n#qunit-tests .fail .module-name             { color: #000; }\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: #008000; }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n\n/*** Aborted tests */\n#qunit-tests .aborted { color: #000; background-color: orange; }\n/*** Skipped tests */\n\n#qunit-tests .skipped {\n\tbackground-color: #EBECE9;\n}\n\n#qunit-tests .qunit-todo-label,\n#qunit-tests .qunit-skipped-label {\n\tbackground-color: #F4FF77;\n\tdisplay: inline-block;\n\tfont-style: normal;\n\tcolor: #366097;\n\tline-height: 1.8em;\n\tpadding: 0 0.5em;\n\tmargin: -0.4em 0.4em -0.4em 0;\n}\n\n#qunit-tests .qunit-todo-label {\n\tbackground-color: #EEE;\n}\n\n/** Result */\n\n#qunit-testresult {\n\tcolor: #2B81AF;\n\tbackground-color: #D2E0E6;\n\n\tborder-bottom: 1px solid #FFF;\n}\n#qunit-testresult .clearfix {\n\theight: 0;\n\tclear: both;\n}\n#qunit-testresult .module-name {\n\tfont-weight: 700;\n}\n#qunit-testresult-display {\n\tpadding: 0.5em 1em 0.5em 1em;\n\twidth: 85%;\n\tfloat:left;\n}\n#qunit-testresult-controls {\n\tpadding: 0.5em 1em 0.5em 1em;\n  width: 10%;\n\tfloat:left;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n\twidth: 1000px;\n\theight: 1000px;\n}\n"
  },
  {
    "path": "common/Tests/External/qunit-2.9.1.js",
    "content": "/*!\n * QUnit 2.9.1\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2019-01-07T16:37Z\n */\n(function (global$1) {\n  'use strict';\n\n  global$1 = global$1 && global$1.hasOwnProperty('default') ? global$1['default'] : global$1;\n\n  var window$1 = global$1.window;\n  var self$1 = global$1.self;\n  var console = global$1.console;\n  var setTimeout$1 = global$1.setTimeout;\n  var clearTimeout = global$1.clearTimeout;\n\n  var document$1 = window$1 && window$1.document;\n  var navigator = window$1 && window$1.navigator;\n\n  var localSessionStorage = function () {\n  \tvar x = \"qunit-test-string\";\n  \ttry {\n  \t\tglobal$1.sessionStorage.setItem(x, x);\n  \t\tglobal$1.sessionStorage.removeItem(x);\n  \t\treturn global$1.sessionStorage;\n  \t} catch (e) {\n  \t\treturn undefined;\n  \t}\n  }();\n\n  /**\n   * Returns a function that proxies to the given method name on the globals\n   * console object. The proxy will also detect if the console doesn't exist and\n   * will appropriately no-op. This allows support for IE9, which doesn't have a\n   * console if the developer tools are not open.\n   */\n  function consoleProxy(method) {\n  \treturn function () {\n  \t\tif (console) {\n  \t\t\tconsole[method].apply(console, arguments);\n  \t\t}\n  \t};\n  }\n\n  var Logger = {\n  \twarn: consoleProxy(\"warn\")\n  };\n\n  var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  };\n\n\n\n\n\n\n\n\n\n\n\n  var classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n\n  var createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  var toConsumableArray = function (arr) {\n    if (Array.isArray(arr)) {\n      for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n      return arr2;\n    } else {\n      return Array.from(arr);\n    }\n  };\n\n  var toString = Object.prototype.toString;\n  var hasOwn = Object.prototype.hasOwnProperty;\n  var now = Date.now || function () {\n  \treturn new Date().getTime();\n  };\n\n  var hasPerformanceApi = detectPerformanceApi();\n  var performance = hasPerformanceApi ? window$1.performance : undefined;\n  var performanceNow = hasPerformanceApi ? performance.now.bind(performance) : now;\n\n  function detectPerformanceApi() {\n  \treturn window$1 && typeof window$1.performance !== \"undefined\" && typeof window$1.performance.mark === \"function\" && typeof window$1.performance.measure === \"function\";\n  }\n\n  function measure(comment, startMark, endMark) {\n\n  \t// `performance.measure` may fail if the mark could not be found.\n  \t// reasons a specific mark could not be found include: outside code invoking `performance.clearMarks()`\n  \ttry {\n  \t\tperformance.measure(comment, startMark, endMark);\n  \t} catch (ex) {\n  \t\tLogger.warn(\"performance.measure could not be executed because of \", ex.message);\n  \t}\n  }\n\n  var defined = {\n  \tdocument: window$1 && window$1.document !== undefined,\n  \tsetTimeout: setTimeout$1 !== undefined\n  };\n\n  // Returns a new Array with the elements that are in a but not in b\n  function diff(a, b) {\n  \tvar i,\n  \t    j,\n  \t    result = a.slice();\n\n  \tfor (i = 0; i < result.length; i++) {\n  \t\tfor (j = 0; j < b.length; j++) {\n  \t\t\tif (result[i] === b[j]) {\n  \t\t\t\tresult.splice(i, 1);\n  \t\t\t\ti--;\n  \t\t\t\tbreak;\n  \t\t\t}\n  \t\t}\n  \t}\n  \treturn result;\n  }\n\n  /**\n   * Determines whether an element exists in a given array or not.\n   *\n   * @method inArray\n   * @param {Any} elem\n   * @param {Array} array\n   * @return {Boolean}\n   */\n  function inArray(elem, array) {\n  \treturn array.indexOf(elem) !== -1;\n  }\n\n  /**\n   * Makes a clone of an object using only Array or Object as base,\n   * and copies over the own enumerable properties.\n   *\n   * @param {Object} obj\n   * @return {Object} New object with only the own properties (recursively).\n   */\n  function objectValues(obj) {\n  \tvar key,\n  \t    val,\n  \t    vals = is(\"array\", obj) ? [] : {};\n  \tfor (key in obj) {\n  \t\tif (hasOwn.call(obj, key)) {\n  \t\t\tval = obj[key];\n  \t\t\tvals[key] = val === Object(val) ? objectValues(val) : val;\n  \t\t}\n  \t}\n  \treturn vals;\n  }\n\n  function extend(a, b, undefOnly) {\n  \tfor (var prop in b) {\n  \t\tif (hasOwn.call(b, prop)) {\n  \t\t\tif (b[prop] === undefined) {\n  \t\t\t\tdelete a[prop];\n  \t\t\t} else if (!(undefOnly && typeof a[prop] !== \"undefined\")) {\n  \t\t\t\ta[prop] = b[prop];\n  \t\t\t}\n  \t\t}\n  \t}\n\n  \treturn a;\n  }\n\n  function objectType(obj) {\n  \tif (typeof obj === \"undefined\") {\n  \t\treturn \"undefined\";\n  \t}\n\n  \t// Consider: typeof null === object\n  \tif (obj === null) {\n  \t\treturn \"null\";\n  \t}\n\n  \tvar match = toString.call(obj).match(/^\\[object\\s(.*)\\]$/),\n  \t    type = match && match[1];\n\n  \tswitch (type) {\n  \t\tcase \"Number\":\n  \t\t\tif (isNaN(obj)) {\n  \t\t\t\treturn \"nan\";\n  \t\t\t}\n  \t\t\treturn \"number\";\n  \t\tcase \"String\":\n  \t\tcase \"Boolean\":\n  \t\tcase \"Array\":\n  \t\tcase \"Set\":\n  \t\tcase \"Map\":\n  \t\tcase \"Date\":\n  \t\tcase \"RegExp\":\n  \t\tcase \"Function\":\n  \t\tcase \"Symbol\":\n  \t\t\treturn type.toLowerCase();\n  \t\tdefault:\n  \t\t\treturn typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n  \t}\n  }\n\n  // Safe object type checking\n  function is(type, obj) {\n  \treturn objectType(obj) === type;\n  }\n\n  // Based on Java's String.hashCode, a simple but not\n  // rigorously collision resistant hashing function\n  function generateHash(module, testName) {\n  \tvar str = module + \"\\x1C\" + testName;\n  \tvar hash = 0;\n\n  \tfor (var i = 0; i < str.length; i++) {\n  \t\thash = (hash << 5) - hash + str.charCodeAt(i);\n  \t\thash |= 0;\n  \t}\n\n  \t// Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n  \t// strictly necessary but increases user understanding that the id is a SHA-like hash\n  \tvar hex = (0x100000000 + hash).toString(16);\n  \tif (hex.length < 8) {\n  \t\thex = \"0000000\" + hex;\n  \t}\n\n  \treturn hex.slice(-8);\n  }\n\n  // Test for equality any JavaScript type.\n  // Authors: Philippe Rathé <prathe@gmail.com>, David Chan <david@troi.org>\n  var equiv = (function () {\n\n  \t// Value pairs queued for comparison. Used for breadth-first processing order, recursion\n  \t// detection and avoiding repeated comparison (see below for details).\n  \t// Elements are { a: val, b: val }.\n  \tvar pairs = [];\n\n  \tvar getProto = Object.getPrototypeOf || function (obj) {\n  \t\treturn obj.__proto__;\n  \t};\n\n  \tfunction useStrictEquality(a, b) {\n\n  \t\t// This only gets called if a and b are not strict equal, and is used to compare on\n  \t\t// the primitive values inside object wrappers. For example:\n  \t\t// `var i = 1;`\n  \t\t// `var j = new Number(1);`\n  \t\t// Neither a nor b can be null, as a !== b and they have the same type.\n  \t\tif ((typeof a === \"undefined\" ? \"undefined\" : _typeof(a)) === \"object\") {\n  \t\t\ta = a.valueOf();\n  \t\t}\n  \t\tif ((typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === \"object\") {\n  \t\t\tb = b.valueOf();\n  \t\t}\n\n  \t\treturn a === b;\n  \t}\n\n  \tfunction compareConstructors(a, b) {\n  \t\tvar protoA = getProto(a);\n  \t\tvar protoB = getProto(b);\n\n  \t\t// Comparing constructors is more strict than using `instanceof`\n  \t\tif (a.constructor === b.constructor) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\t// Ref #851\n  \t\t// If the obj prototype descends from a null constructor, treat it\n  \t\t// as a null prototype.\n  \t\tif (protoA && protoA.constructor === null) {\n  \t\t\tprotoA = null;\n  \t\t}\n  \t\tif (protoB && protoB.constructor === null) {\n  \t\t\tprotoB = null;\n  \t\t}\n\n  \t\t// Allow objects with no prototype to be equivalent to\n  \t\t// objects with Object as their constructor.\n  \t\tif (protoA === null && protoB === Object.prototype || protoB === null && protoA === Object.prototype) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\treturn false;\n  \t}\n\n  \tfunction getRegExpFlags(regexp) {\n  \t\treturn \"flags\" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];\n  \t}\n\n  \tfunction isContainer(val) {\n  \t\treturn [\"object\", \"array\", \"map\", \"set\"].indexOf(objectType(val)) !== -1;\n  \t}\n\n  \tfunction breadthFirstCompareChild(a, b) {\n\n  \t\t// If a is a container not reference-equal to b, postpone the comparison to the\n  \t\t// end of the pairs queue -- unless (a, b) has been seen before, in which case skip\n  \t\t// over the pair.\n  \t\tif (a === b) {\n  \t\t\treturn true;\n  \t\t}\n  \t\tif (!isContainer(a)) {\n  \t\t\treturn typeEquiv(a, b);\n  \t\t}\n  \t\tif (pairs.every(function (pair) {\n  \t\t\treturn pair.a !== a || pair.b !== b;\n  \t\t})) {\n\n  \t\t\t// Not yet started comparing this pair\n  \t\t\tpairs.push({ a: a, b: b });\n  \t\t}\n  \t\treturn true;\n  \t}\n\n  \tvar callbacks = {\n  \t\t\"string\": useStrictEquality,\n  \t\t\"boolean\": useStrictEquality,\n  \t\t\"number\": useStrictEquality,\n  \t\t\"null\": useStrictEquality,\n  \t\t\"undefined\": useStrictEquality,\n  \t\t\"symbol\": useStrictEquality,\n  \t\t\"date\": useStrictEquality,\n\n  \t\t\"nan\": function nan() {\n  \t\t\treturn true;\n  \t\t},\n\n  \t\t\"regexp\": function regexp(a, b) {\n  \t\t\treturn a.source === b.source &&\n\n  \t\t\t// Include flags in the comparison\n  \t\t\tgetRegExpFlags(a) === getRegExpFlags(b);\n  \t\t},\n\n  \t\t// abort (identical references / instance methods were skipped earlier)\n  \t\t\"function\": function _function() {\n  \t\t\treturn false;\n  \t\t},\n\n  \t\t\"array\": function array(a, b) {\n  \t\t\tvar i, len;\n\n  \t\t\tlen = a.length;\n  \t\t\tif (len !== b.length) {\n\n  \t\t\t\t// Safe and faster\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\tfor (i = 0; i < len; i++) {\n\n  \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n  \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\n  \t\t\t\t\treturn false;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\treturn true;\n  \t\t},\n\n  \t\t// Define sets a and b to be equivalent if for each element aVal in a, there\n  \t\t// is some element bVal in b such that aVal and bVal are equivalent. Element\n  \t\t// repetitions are not counted, so these are equivalent:\n  \t\t// a = new Set( [ {}, [], [] ] );\n  \t\t// b = new Set( [ {}, {}, [] ] );\n  \t\t\"set\": function set$$1(a, b) {\n  \t\t\tvar innerEq,\n  \t\t\t    outerEq = true;\n\n  \t\t\tif (a.size !== b.size) {\n\n  \t\t\t\t// This optimization has certain quirks because of the lack of\n  \t\t\t\t// repetition counting. For instance, adding the same\n  \t\t\t\t// (reference-identical) element to two equivalent sets can\n  \t\t\t\t// make them non-equivalent.\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\ta.forEach(function (aVal) {\n\n  \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n  \t\t\t\t// with a break clause would be cleaner here, but it would cause\n  \t\t\t\t// a syntax error on older Javascript implementations even if\n  \t\t\t\t// Set is unused)\n  \t\t\t\tif (!outerEq) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tinnerEq = false;\n\n  \t\t\t\tb.forEach(function (bVal) {\n  \t\t\t\t\tvar parentPairs;\n\n  \t\t\t\t\t// Likewise, short-circuit if the result is already known\n  \t\t\t\t\tif (innerEq) {\n  \t\t\t\t\t\treturn;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n  \t\t\t\t\t// innerEquiv will clobber its contents\n  \t\t\t\t\tparentPairs = pairs;\n  \t\t\t\t\tif (innerEquiv(bVal, aVal)) {\n  \t\t\t\t\t\tinnerEq = true;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Replace the global pairs list\n  \t\t\t\t\tpairs = parentPairs;\n  \t\t\t\t});\n\n  \t\t\t\tif (!innerEq) {\n  \t\t\t\t\touterEq = false;\n  \t\t\t\t}\n  \t\t\t});\n\n  \t\t\treturn outerEq;\n  \t\t},\n\n  \t\t// Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)\n  \t\t// in a, there is some key-value pair (bKey, bVal) in b such that\n  \t\t// [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not\n  \t\t// counted, so these are equivalent:\n  \t\t// a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );\n  \t\t// b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );\n  \t\t\"map\": function map(a, b) {\n  \t\t\tvar innerEq,\n  \t\t\t    outerEq = true;\n\n  \t\t\tif (a.size !== b.size) {\n\n  \t\t\t\t// This optimization has certain quirks because of the lack of\n  \t\t\t\t// repetition counting. For instance, adding the same\n  \t\t\t\t// (reference-identical) key-value pair to two equivalent maps\n  \t\t\t\t// can make them non-equivalent.\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\ta.forEach(function (aVal, aKey) {\n\n  \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n  \t\t\t\t// with a break clause would be cleaner here, but it would cause\n  \t\t\t\t// a syntax error on older Javascript implementations even if\n  \t\t\t\t// Map is unused)\n  \t\t\t\tif (!outerEq) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tinnerEq = false;\n\n  \t\t\t\tb.forEach(function (bVal, bKey) {\n  \t\t\t\t\tvar parentPairs;\n\n  \t\t\t\t\t// Likewise, short-circuit if the result is already known\n  \t\t\t\t\tif (innerEq) {\n  \t\t\t\t\t\treturn;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n  \t\t\t\t\t// innerEquiv will clobber its contents\n  \t\t\t\t\tparentPairs = pairs;\n  \t\t\t\t\tif (innerEquiv([bVal, bKey], [aVal, aKey])) {\n  \t\t\t\t\t\tinnerEq = true;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Replace the global pairs list\n  \t\t\t\t\tpairs = parentPairs;\n  \t\t\t\t});\n\n  \t\t\t\tif (!innerEq) {\n  \t\t\t\t\touterEq = false;\n  \t\t\t\t}\n  \t\t\t});\n\n  \t\t\treturn outerEq;\n  \t\t},\n\n  \t\t\"object\": function object(a, b) {\n  \t\t\tvar i,\n  \t\t\t    aProperties = [],\n  \t\t\t    bProperties = [];\n\n  \t\t\tif (compareConstructors(a, b) === false) {\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\t// Be strict: don't ensure hasOwnProperty and go deep\n  \t\t\tfor (i in a) {\n\n  \t\t\t\t// Collect a's properties\n  \t\t\t\taProperties.push(i);\n\n  \t\t\t\t// Skip OOP methods that look the same\n  \t\t\t\tif (a.constructor !== Object && typeof a.constructor !== \"undefined\" && typeof a[i] === \"function\" && typeof b[i] === \"function\" && a[i].toString() === b[i].toString()) {\n  \t\t\t\t\tcontinue;\n  \t\t\t\t}\n\n  \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n  \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\n  \t\t\t\t\treturn false;\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tfor (i in b) {\n\n  \t\t\t\t// Collect b's properties\n  \t\t\t\tbProperties.push(i);\n  \t\t\t}\n\n  \t\t\t// Ensures identical properties name\n  \t\t\treturn typeEquiv(aProperties.sort(), bProperties.sort());\n  \t\t}\n  \t};\n\n  \tfunction typeEquiv(a, b) {\n  \t\tvar type = objectType(a);\n\n  \t\t// Callbacks for containers will append to the pairs queue to achieve breadth-first\n  \t\t// search order. The pairs queue is also used to avoid reprocessing any pair of\n  \t\t// containers that are reference-equal to a previously visited pair (a special case\n  \t\t// this being recursion detection).\n  \t\t//\n  \t\t// Because of this approach, once typeEquiv returns a false value, it should not be\n  \t\t// called again without clearing the pair queue else it may wrongly report a visited\n  \t\t// pair as being equivalent.\n  \t\treturn objectType(b) === type && callbacks[type](a, b);\n  \t}\n\n  \tfunction innerEquiv(a, b) {\n  \t\tvar i, pair;\n\n  \t\t// We're done when there's nothing more to compare\n  \t\tif (arguments.length < 2) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\t// Clear the global pair queue and add the top-level values being compared\n  \t\tpairs = [{ a: a, b: b }];\n\n  \t\tfor (i = 0; i < pairs.length; i++) {\n  \t\t\tpair = pairs[i];\n\n  \t\t\t// Perform type-specific comparison on any pairs that are not strictly\n  \t\t\t// equal. For container types, that comparison will postpone comparison\n  \t\t\t// of any sub-container pair to the end of the pair queue. This gives\n  \t\t\t// breadth-first search order. It also avoids the reprocessing of\n  \t\t\t// reference-equal siblings, cousins etc, which can have a significant speed\n  \t\t\t// impact when comparing a container of small objects each of which has a\n  \t\t\t// reference to the same (singleton) large object.\n  \t\t\tif (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) {\n  \t\t\t\treturn false;\n  \t\t\t}\n  \t\t}\n\n  \t\t// ...across all consecutive argument pairs\n  \t\treturn arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));\n  \t}\n\n  \treturn function () {\n  \t\tvar result = innerEquiv.apply(undefined, arguments);\n\n  \t\t// Release any retained objects\n  \t\tpairs.length = 0;\n  \t\treturn result;\n  \t};\n  })();\n\n  /**\n   * Config object: Maintain internal state\n   * Later exposed as QUnit.config\n   * `config` initialized at top of scope\n   */\n  var config = {\n\n  \t// The queue of tests to run\n  \tqueue: [],\n\n  \t// Block until document ready\n  \tblocking: true,\n\n  \t// By default, run previously failed tests first\n  \t// very useful in combination with \"Hide passed tests\" checked\n  \treorder: true,\n\n  \t// By default, modify document.title when suite is done\n  \taltertitle: true,\n\n  \t// HTML Reporter: collapse every test except the first failing test\n  \t// If false, all failing tests will be expanded\n  \tcollapse: true,\n\n  \t// By default, scroll to top of the page when suite is done\n  \tscrolltop: true,\n\n  \t// Depth up-to which object will be dumped\n  \tmaxDepth: 5,\n\n  \t// When enabled, all tests must call expect()\n  \trequireExpects: false,\n\n  \t// Placeholder for user-configurable form-exposed URL parameters\n  \turlConfig: [],\n\n  \t// Set of all modules.\n  \tmodules: [],\n\n  \t// The first unnamed module\n  \tcurrentModule: {\n  \t\tname: \"\",\n  \t\ttests: [],\n  \t\tchildModules: [],\n  \t\ttestsRun: 0,\n  \t\tunskippedTestsRun: 0,\n  \t\thooks: {\n  \t\t\tbefore: [],\n  \t\t\tbeforeEach: [],\n  \t\t\tafterEach: [],\n  \t\t\tafter: []\n  \t\t}\n  \t},\n\n  \tcallbacks: {},\n\n  \t// The storage module to use for reordering tests\n  \tstorage: localSessionStorage\n  };\n\n  // take a predefined QUnit.config and extend the defaults\n  var globalConfig = window$1 && window$1.QUnit && window$1.QUnit.config;\n\n  // only extend the global config if there is no QUnit overload\n  if (window$1 && window$1.QUnit && !window$1.QUnit.version) {\n  \textend(config, globalConfig);\n  }\n\n  // Push a loose unnamed module to the modules collection\n  config.modules.push(config.currentModule);\n\n  // Based on jsDump by Ariel Flesler\n  // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html\n  var dump = (function () {\n  \tfunction quote(str) {\n  \t\treturn \"\\\"\" + str.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\") + \"\\\"\";\n  \t}\n  \tfunction literal(o) {\n  \t\treturn o + \"\";\n  \t}\n  \tfunction join(pre, arr, post) {\n  \t\tvar s = dump.separator(),\n  \t\t    base = dump.indent(),\n  \t\t    inner = dump.indent(1);\n  \t\tif (arr.join) {\n  \t\t\tarr = arr.join(\",\" + s + inner);\n  \t\t}\n  \t\tif (!arr) {\n  \t\t\treturn pre + post;\n  \t\t}\n  \t\treturn [pre, inner + arr, base + post].join(s);\n  \t}\n  \tfunction array(arr, stack) {\n  \t\tvar i = arr.length,\n  \t\t    ret = new Array(i);\n\n  \t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n  \t\t\treturn \"[object Array]\";\n  \t\t}\n\n  \t\tthis.up();\n  \t\twhile (i--) {\n  \t\t\tret[i] = this.parse(arr[i], undefined, stack);\n  \t\t}\n  \t\tthis.down();\n  \t\treturn join(\"[\", ret, \"]\");\n  \t}\n\n  \tfunction isArray(obj) {\n  \t\treturn (\n\n  \t\t\t//Native Arrays\n  \t\t\ttoString.call(obj) === \"[object Array]\" ||\n\n  \t\t\t// NodeList objects\n  \t\t\ttypeof obj.length === \"number\" && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined)\n  \t\t);\n  \t}\n\n  \tvar reName = /^function (\\w+)/,\n  \t    dump = {\n\n  \t\t// The objType is used mostly internally, you can fix a (custom) type in advance\n  \t\tparse: function parse(obj, objType, stack) {\n  \t\t\tstack = stack || [];\n  \t\t\tvar res,\n  \t\t\t    parser,\n  \t\t\t    parserType,\n  \t\t\t    objIndex = stack.indexOf(obj);\n\n  \t\t\tif (objIndex !== -1) {\n  \t\t\t\treturn \"recursion(\" + (objIndex - stack.length) + \")\";\n  \t\t\t}\n\n  \t\t\tobjType = objType || this.typeOf(obj);\n  \t\t\tparser = this.parsers[objType];\n  \t\t\tparserType = typeof parser === \"undefined\" ? \"undefined\" : _typeof(parser);\n\n  \t\t\tif (parserType === \"function\") {\n  \t\t\t\tstack.push(obj);\n  \t\t\t\tres = parser.call(this, obj, stack);\n  \t\t\t\tstack.pop();\n  \t\t\t\treturn res;\n  \t\t\t}\n  \t\t\treturn parserType === \"string\" ? parser : this.parsers.error;\n  \t\t},\n  \t\ttypeOf: function typeOf(obj) {\n  \t\t\tvar type;\n\n  \t\t\tif (obj === null) {\n  \t\t\t\ttype = \"null\";\n  \t\t\t} else if (typeof obj === \"undefined\") {\n  \t\t\t\ttype = \"undefined\";\n  \t\t\t} else if (is(\"regexp\", obj)) {\n  \t\t\t\ttype = \"regexp\";\n  \t\t\t} else if (is(\"date\", obj)) {\n  \t\t\t\ttype = \"date\";\n  \t\t\t} else if (is(\"function\", obj)) {\n  \t\t\t\ttype = \"function\";\n  \t\t\t} else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) {\n  \t\t\t\ttype = \"window\";\n  \t\t\t} else if (obj.nodeType === 9) {\n  \t\t\t\ttype = \"document\";\n  \t\t\t} else if (obj.nodeType) {\n  \t\t\t\ttype = \"node\";\n  \t\t\t} else if (isArray(obj)) {\n  \t\t\t\ttype = \"array\";\n  \t\t\t} else if (obj.constructor === Error.prototype.constructor) {\n  \t\t\t\ttype = \"error\";\n  \t\t\t} else {\n  \t\t\t\ttype = typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n  \t\t\t}\n  \t\t\treturn type;\n  \t\t},\n\n  \t\tseparator: function separator() {\n  \t\t\tif (this.multiline) {\n  \t\t\t\treturn this.HTML ? \"<br />\" : \"\\n\";\n  \t\t\t} else {\n  \t\t\t\treturn this.HTML ? \"&#160;\" : \" \";\n  \t\t\t}\n  \t\t},\n\n  \t\t// Extra can be a number, shortcut for increasing-calling-decreasing\n  \t\tindent: function indent(extra) {\n  \t\t\tif (!this.multiline) {\n  \t\t\t\treturn \"\";\n  \t\t\t}\n  \t\t\tvar chr = this.indentChar;\n  \t\t\tif (this.HTML) {\n  \t\t\t\tchr = chr.replace(/\\t/g, \"   \").replace(/ /g, \"&#160;\");\n  \t\t\t}\n  \t\t\treturn new Array(this.depth + (extra || 0)).join(chr);\n  \t\t},\n  \t\tup: function up(a) {\n  \t\t\tthis.depth += a || 1;\n  \t\t},\n  \t\tdown: function down(a) {\n  \t\t\tthis.depth -= a || 1;\n  \t\t},\n  \t\tsetParser: function setParser(name, parser) {\n  \t\t\tthis.parsers[name] = parser;\n  \t\t},\n\n  \t\t// The next 3 are exposed so you can use them\n  \t\tquote: quote,\n  \t\tliteral: literal,\n  \t\tjoin: join,\n  \t\tdepth: 1,\n  \t\tmaxDepth: config.maxDepth,\n\n  \t\t// This is the list of parsers, to modify them, use dump.setParser\n  \t\tparsers: {\n  \t\t\twindow: \"[Window]\",\n  \t\t\tdocument: \"[Document]\",\n  \t\t\terror: function error(_error) {\n  \t\t\t\treturn \"Error(\\\"\" + _error.message + \"\\\")\";\n  \t\t\t},\n  \t\t\tunknown: \"[Unknown]\",\n  \t\t\t\"null\": \"null\",\n  \t\t\t\"undefined\": \"undefined\",\n  \t\t\t\"function\": function _function(fn) {\n  \t\t\t\tvar ret = \"function\",\n\n\n  \t\t\t\t// Functions never have name in IE\n  \t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];\n\n  \t\t\t\tif (name) {\n  \t\t\t\t\tret += \" \" + name;\n  \t\t\t\t}\n  \t\t\t\tret += \"(\";\n\n  \t\t\t\tret = [ret, dump.parse(fn, \"functionArgs\"), \"){\"].join(\"\");\n  \t\t\t\treturn join(ret, dump.parse(fn, \"functionCode\"), \"}\");\n  \t\t\t},\n  \t\t\tarray: array,\n  \t\t\tnodelist: array,\n  \t\t\t\"arguments\": array,\n  \t\t\tobject: function object(map, stack) {\n  \t\t\t\tvar keys,\n  \t\t\t\t    key,\n  \t\t\t\t    val,\n  \t\t\t\t    i,\n  \t\t\t\t    nonEnumerableProperties,\n  \t\t\t\t    ret = [];\n\n  \t\t\t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n  \t\t\t\t\treturn \"[object Object]\";\n  \t\t\t\t}\n\n  \t\t\t\tdump.up();\n  \t\t\t\tkeys = [];\n  \t\t\t\tfor (key in map) {\n  \t\t\t\t\tkeys.push(key);\n  \t\t\t\t}\n\n  \t\t\t\t// Some properties are not always enumerable on Error objects.\n  \t\t\t\tnonEnumerableProperties = [\"message\", \"name\"];\n  \t\t\t\tfor (i in nonEnumerableProperties) {\n  \t\t\t\t\tkey = nonEnumerableProperties[i];\n  \t\t\t\t\tif (key in map && !inArray(key, keys)) {\n  \t\t\t\t\t\tkeys.push(key);\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tkeys.sort();\n  \t\t\t\tfor (i = 0; i < keys.length; i++) {\n  \t\t\t\t\tkey = keys[i];\n  \t\t\t\t\tval = map[key];\n  \t\t\t\t\tret.push(dump.parse(key, \"key\") + \": \" + dump.parse(val, undefined, stack));\n  \t\t\t\t}\n  \t\t\t\tdump.down();\n  \t\t\t\treturn join(\"{\", ret, \"}\");\n  \t\t\t},\n  \t\t\tnode: function node(_node) {\n  \t\t\t\tvar len,\n  \t\t\t\t    i,\n  \t\t\t\t    val,\n  \t\t\t\t    open = dump.HTML ? \"&lt;\" : \"<\",\n  \t\t\t\t    close = dump.HTML ? \"&gt;\" : \">\",\n  \t\t\t\t    tag = _node.nodeName.toLowerCase(),\n  \t\t\t\t    ret = open + tag,\n  \t\t\t\t    attrs = _node.attributes;\n\n  \t\t\t\tif (attrs) {\n  \t\t\t\t\tfor (i = 0, len = attrs.length; i < len; i++) {\n  \t\t\t\t\t\tval = attrs[i].nodeValue;\n\n  \t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly\n  \t\t\t\t\t\t// set. Those have values like undefined, null, 0, false, \"\" or\n  \t\t\t\t\t\t// \"inherit\".\n  \t\t\t\t\t\tif (val && val !== \"inherit\") {\n  \t\t\t\t\t\t\tret += \" \" + attrs[i].nodeName + \"=\" + dump.parse(val, \"attribute\");\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tret += close;\n\n  \t\t\t\t// Show content of TextNode or CDATASection\n  \t\t\t\tif (_node.nodeType === 3 || _node.nodeType === 4) {\n  \t\t\t\t\tret += _node.nodeValue;\n  \t\t\t\t}\n\n  \t\t\t\treturn ret + open + \"/\" + tag + close;\n  \t\t\t},\n\n  \t\t\t// Function calls it internally, it's the arguments part of the function\n  \t\t\tfunctionArgs: function functionArgs(fn) {\n  \t\t\t\tvar args,\n  \t\t\t\t    l = fn.length;\n\n  \t\t\t\tif (!l) {\n  \t\t\t\t\treturn \"\";\n  \t\t\t\t}\n\n  \t\t\t\targs = new Array(l);\n  \t\t\t\twhile (l--) {\n\n  \t\t\t\t\t// 97 is 'a'\n  \t\t\t\t\targs[l] = String.fromCharCode(97 + l);\n  \t\t\t\t}\n  \t\t\t\treturn \" \" + args.join(\", \") + \" \";\n  \t\t\t},\n\n  \t\t\t// Object calls it internally, the key part of an item in a map\n  \t\t\tkey: quote,\n\n  \t\t\t// Function calls it internally, it's the content of the function\n  \t\t\tfunctionCode: \"[code]\",\n\n  \t\t\t// Node calls it internally, it's a html attribute value\n  \t\t\tattribute: quote,\n  \t\t\tstring: quote,\n  \t\t\tdate: quote,\n  \t\t\tregexp: literal,\n  \t\t\tnumber: literal,\n  \t\t\t\"boolean\": literal,\n  \t\t\tsymbol: function symbol(sym) {\n  \t\t\t\treturn sym.toString();\n  \t\t\t}\n  \t\t},\n\n  \t\t// If true, entities are escaped ( <, >, \\t, space and \\n )\n  \t\tHTML: false,\n\n  \t\t// Indentation unit\n  \t\tindentChar: \"  \",\n\n  \t\t// If true, items in a collection, are separated by a \\n, else just a space.\n  \t\tmultiline: true\n  \t};\n\n  \treturn dump;\n  })();\n\n  var SuiteReport = function () {\n  \tfunction SuiteReport(name, parentSuite) {\n  \t\tclassCallCheck(this, SuiteReport);\n\n  \t\tthis.name = name;\n  \t\tthis.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];\n\n  \t\tthis.tests = [];\n  \t\tthis.childSuites = [];\n\n  \t\tif (parentSuite) {\n  \t\t\tparentSuite.pushChildSuite(this);\n  \t\t}\n  \t}\n\n  \tcreateClass(SuiteReport, [{\n  \t\tkey: \"start\",\n  \t\tvalue: function start(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._startTime = performanceNow();\n\n  \t\t\t\tif (performance) {\n  \t\t\t\t\tvar suiteLevel = this.fullName.length;\n  \t\t\t\t\tperformance.mark(\"qunit_suite_\" + suiteLevel + \"_start\");\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\treturn {\n  \t\t\t\tname: this.name,\n  \t\t\t\tfullName: this.fullName.slice(),\n  \t\t\t\ttests: this.tests.map(function (test) {\n  \t\t\t\t\treturn test.start();\n  \t\t\t\t}),\n  \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n  \t\t\t\t\treturn suite.start();\n  \t\t\t\t}),\n  \t\t\t\ttestCounts: {\n  \t\t\t\t\ttotal: this.getTestCounts().total\n  \t\t\t\t}\n  \t\t\t};\n  \t\t}\n  \t}, {\n  \t\tkey: \"end\",\n  \t\tvalue: function end(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._endTime = performanceNow();\n\n  \t\t\t\tif (performance) {\n  \t\t\t\t\tvar suiteLevel = this.fullName.length;\n  \t\t\t\t\tperformance.mark(\"qunit_suite_\" + suiteLevel + \"_end\");\n\n  \t\t\t\t\tvar suiteName = this.fullName.join(\" – \");\n\n  \t\t\t\t\tmeasure(suiteLevel === 0 ? \"QUnit Test Run\" : \"QUnit Test Suite: \" + suiteName, \"qunit_suite_\" + suiteLevel + \"_start\", \"qunit_suite_\" + suiteLevel + \"_end\");\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\treturn {\n  \t\t\t\tname: this.name,\n  \t\t\t\tfullName: this.fullName.slice(),\n  \t\t\t\ttests: this.tests.map(function (test) {\n  \t\t\t\t\treturn test.end();\n  \t\t\t\t}),\n  \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n  \t\t\t\t\treturn suite.end();\n  \t\t\t\t}),\n  \t\t\t\ttestCounts: this.getTestCounts(),\n  \t\t\t\truntime: this.getRuntime(),\n  \t\t\t\tstatus: this.getStatus()\n  \t\t\t};\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushChildSuite\",\n  \t\tvalue: function pushChildSuite(suite) {\n  \t\t\tthis.childSuites.push(suite);\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushTest\",\n  \t\tvalue: function pushTest(test) {\n  \t\t\tthis.tests.push(test);\n  \t\t}\n  \t}, {\n  \t\tkey: \"getRuntime\",\n  \t\tvalue: function getRuntime() {\n  \t\t\treturn this._endTime - this._startTime;\n  \t\t}\n  \t}, {\n  \t\tkey: \"getTestCounts\",\n  \t\tvalue: function getTestCounts() {\n  \t\t\tvar counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 };\n\n  \t\t\tcounts = this.tests.reduce(function (counts, test) {\n  \t\t\t\tif (test.valid) {\n  \t\t\t\t\tcounts[test.getStatus()]++;\n  \t\t\t\t\tcounts.total++;\n  \t\t\t\t}\n\n  \t\t\t\treturn counts;\n  \t\t\t}, counts);\n\n  \t\t\treturn this.childSuites.reduce(function (counts, suite) {\n  \t\t\t\treturn suite.getTestCounts(counts);\n  \t\t\t}, counts);\n  \t\t}\n  \t}, {\n  \t\tkey: \"getStatus\",\n  \t\tvalue: function getStatus() {\n  \t\t\tvar _getTestCounts = this.getTestCounts(),\n  \t\t\t    total = _getTestCounts.total,\n  \t\t\t    failed = _getTestCounts.failed,\n  \t\t\t    skipped = _getTestCounts.skipped,\n  \t\t\t    todo = _getTestCounts.todo;\n\n  \t\t\tif (failed) {\n  \t\t\t\treturn \"failed\";\n  \t\t\t} else {\n  \t\t\t\tif (skipped === total) {\n  \t\t\t\t\treturn \"skipped\";\n  \t\t\t\t} else if (todo === total) {\n  \t\t\t\t\treturn \"todo\";\n  \t\t\t\t} else {\n  \t\t\t\t\treturn \"passed\";\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n  \t}]);\n  \treturn SuiteReport;\n  }();\n\n  var focused = false;\n\n  var moduleStack = [];\n\n  function createModule(name, testEnvironment, modifiers) {\n  \tvar parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;\n  \tvar moduleName = parentModule !== null ? [parentModule.name, name].join(\" > \") : name;\n  \tvar parentSuite = parentModule ? parentModule.suiteReport : globalSuite;\n\n  \tvar skip = parentModule !== null && parentModule.skip || modifiers.skip;\n  \tvar todo = parentModule !== null && parentModule.todo || modifiers.todo;\n\n  \tvar module = {\n  \t\tname: moduleName,\n  \t\tparentModule: parentModule,\n  \t\ttests: [],\n  \t\tmoduleId: generateHash(moduleName),\n  \t\ttestsRun: 0,\n  \t\tunskippedTestsRun: 0,\n  \t\tchildModules: [],\n  \t\tsuiteReport: new SuiteReport(name, parentSuite),\n\n  \t\t// Pass along `skip` and `todo` properties from parent module, in case\n  \t\t// there is one, to childs. And use own otherwise.\n  \t\t// This property will be used to mark own tests and tests of child suites\n  \t\t// as either `skipped` or `todo`.\n  \t\tskip: skip,\n  \t\ttodo: skip ? false : todo\n  \t};\n\n  \tvar env = {};\n  \tif (parentModule) {\n  \t\tparentModule.childModules.push(module);\n  \t\textend(env, parentModule.testEnvironment);\n  \t}\n  \textend(env, testEnvironment);\n  \tmodule.testEnvironment = env;\n\n  \tconfig.modules.push(module);\n  \treturn module;\n  }\n\n  function processModule(name, options, executeNow) {\n  \tvar modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n  \tif (objectType(options) === \"function\") {\n  \t\texecuteNow = options;\n  \t\toptions = undefined;\n  \t}\n\n  \tvar module = createModule(name, options, modifiers);\n\n  \t// Move any hooks to a 'hooks' object\n  \tvar testEnvironment = module.testEnvironment;\n  \tvar hooks = module.hooks = {};\n\n  \tsetHookFromEnvironment(hooks, testEnvironment, \"before\");\n  \tsetHookFromEnvironment(hooks, testEnvironment, \"beforeEach\");\n  \tsetHookFromEnvironment(hooks, testEnvironment, \"afterEach\");\n  \tsetHookFromEnvironment(hooks, testEnvironment, \"after\");\n\n  \tvar moduleFns = {\n  \t\tbefore: setHookFunction(module, \"before\"),\n  \t\tbeforeEach: setHookFunction(module, \"beforeEach\"),\n  \t\tafterEach: setHookFunction(module, \"afterEach\"),\n  \t\tafter: setHookFunction(module, \"after\")\n  \t};\n\n  \tvar currentModule = config.currentModule;\n  \tif (objectType(executeNow) === \"function\") {\n  \t\tmoduleStack.push(module);\n  \t\tconfig.currentModule = module;\n  \t\texecuteNow.call(module.testEnvironment, moduleFns);\n  \t\tmoduleStack.pop();\n  \t\tmodule = module.parentModule || currentModule;\n  \t}\n\n  \tconfig.currentModule = module;\n\n  \tfunction setHookFromEnvironment(hooks, environment, name) {\n  \t\tvar potentialHook = environment[name];\n  \t\thooks[name] = typeof potentialHook === \"function\" ? [potentialHook] : [];\n  \t\tdelete environment[name];\n  \t}\n\n  \tfunction setHookFunction(module, hookName) {\n  \t\treturn function setHook(callback) {\n  \t\t\tmodule.hooks[hookName].push(callback);\n  \t\t};\n  \t}\n  }\n\n  function module$1(name, options, executeNow) {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tprocessModule(name, options, executeNow);\n  }\n\n  module$1.only = function () {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tconfig.modules.length = 0;\n  \tconfig.queue.length = 0;\n\n  \tmodule$1.apply(undefined, arguments);\n\n  \tfocused = true;\n  };\n\n  module$1.skip = function (name, options, executeNow) {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tprocessModule(name, options, executeNow, { skip: true });\n  };\n\n  module$1.todo = function (name, options, executeNow) {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tprocessModule(name, options, executeNow, { todo: true });\n  };\n\n  var LISTENERS = Object.create(null);\n  var SUPPORTED_EVENTS = [\"runStart\", \"suiteStart\", \"testStart\", \"assertion\", \"testEnd\", \"suiteEnd\", \"runEnd\"];\n\n  /**\n   * Emits an event with the specified data to all currently registered listeners.\n   * Callbacks will fire in the order in which they are registered (FIFO). This\n   * function is not exposed publicly; it is used by QUnit internals to emit\n   * logging events.\n   *\n   * @private\n   * @method emit\n   * @param {String} eventName\n   * @param {Object} data\n   * @return {Void}\n   */\n  function emit(eventName, data) {\n  \tif (objectType(eventName) !== \"string\") {\n  \t\tthrow new TypeError(\"eventName must be a string when emitting an event\");\n  \t}\n\n  \t// Clone the callbacks in case one of them registers a new callback\n  \tvar originalCallbacks = LISTENERS[eventName];\n  \tvar callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : [];\n\n  \tfor (var i = 0; i < callbacks.length; i++) {\n  \t\tcallbacks[i](data);\n  \t}\n  }\n\n  /**\n   * Registers a callback as a listener to the specified event.\n   *\n   * @public\n   * @method on\n   * @param {String} eventName\n   * @param {Function} callback\n   * @return {Void}\n   */\n  function on(eventName, callback) {\n  \tif (objectType(eventName) !== \"string\") {\n  \t\tthrow new TypeError(\"eventName must be a string when registering a listener\");\n  \t} else if (!inArray(eventName, SUPPORTED_EVENTS)) {\n  \t\tvar events = SUPPORTED_EVENTS.join(\", \");\n  \t\tthrow new Error(\"\\\"\" + eventName + \"\\\" is not a valid event; must be one of: \" + events + \".\");\n  \t} else if (objectType(callback) !== \"function\") {\n  \t\tthrow new TypeError(\"callback must be a function when registering a listener\");\n  \t}\n\n  \tif (!LISTENERS[eventName]) {\n  \t\tLISTENERS[eventName] = [];\n  \t}\n\n  \t// Don't register the same callback more than once\n  \tif (!inArray(callback, LISTENERS[eventName])) {\n  \t\tLISTENERS[eventName].push(callback);\n  \t}\n  }\n\n  function objectOrFunction(x) {\n    var type = typeof x === 'undefined' ? 'undefined' : _typeof(x);\n    return x !== null && (type === 'object' || type === 'function');\n  }\n\n  function isFunction(x) {\n    return typeof x === 'function';\n  }\n\n\n\n  var _isArray = void 0;\n  if (Array.isArray) {\n    _isArray = Array.isArray;\n  } else {\n    _isArray = function _isArray(x) {\n      return Object.prototype.toString.call(x) === '[object Array]';\n    };\n  }\n\n  var isArray = _isArray;\n\n  var len = 0;\n  var vertxNext = void 0;\n  var customSchedulerFn = void 0;\n\n  var asap = function asap(callback, arg) {\n    queue[len] = callback;\n    queue[len + 1] = arg;\n    len += 2;\n    if (len === 2) {\n      // If len is 2, that means that we need to schedule an async flush.\n      // If additional callbacks are queued before the queue is flushed, they\n      // will be processed by this flush that we are scheduling.\n      if (customSchedulerFn) {\n        customSchedulerFn(flush);\n      } else {\n        scheduleFlush();\n      }\n    }\n  };\n\n  function setScheduler(scheduleFn) {\n    customSchedulerFn = scheduleFn;\n  }\n\n  function setAsap(asapFn) {\n    asap = asapFn;\n  }\n\n  var browserWindow = typeof window !== 'undefined' ? window : undefined;\n  var browserGlobal = browserWindow || {};\n  var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n  var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n  // test for web worker but not in IE10\n  var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n  // node\n  function useNextTick() {\n    // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n    // see https://github.com/cujojs/when/issues/410 for details\n    return function () {\n      return process.nextTick(flush);\n    };\n  }\n\n  // vertx\n  function useVertxTimer() {\n    if (typeof vertxNext !== 'undefined') {\n      return function () {\n        vertxNext(flush);\n      };\n    }\n\n    return useSetTimeout();\n  }\n\n  function useMutationObserver() {\n    var iterations = 0;\n    var observer = new BrowserMutationObserver(flush);\n    var node = document.createTextNode('');\n    observer.observe(node, { characterData: true });\n\n    return function () {\n      node.data = iterations = ++iterations % 2;\n    };\n  }\n\n  // web worker\n  function useMessageChannel() {\n    var channel = new MessageChannel();\n    channel.port1.onmessage = flush;\n    return function () {\n      return channel.port2.postMessage(0);\n    };\n  }\n\n  function useSetTimeout() {\n    // Store setTimeout reference so es6-promise will be unaffected by\n    // other code modifying setTimeout (like sinon.useFakeTimers())\n    var globalSetTimeout = setTimeout;\n    return function () {\n      return globalSetTimeout(flush, 1);\n    };\n  }\n\n  var queue = new Array(1000);\n  function flush() {\n    for (var i = 0; i < len; i += 2) {\n      var callback = queue[i];\n      var arg = queue[i + 1];\n\n      callback(arg);\n\n      queue[i] = undefined;\n      queue[i + 1] = undefined;\n    }\n\n    len = 0;\n  }\n\n  function attemptVertx() {\n    try {\n      var vertx = Function('return this')().require('vertx');\n      vertxNext = vertx.runOnLoop || vertx.runOnContext;\n      return useVertxTimer();\n    } catch (e) {\n      return useSetTimeout();\n    }\n  }\n\n  var scheduleFlush = void 0;\n  // Decide what async method to use to triggering processing of queued callbacks:\n  if (isNode) {\n    scheduleFlush = useNextTick();\n  } else if (BrowserMutationObserver) {\n    scheduleFlush = useMutationObserver();\n  } else if (isWorker) {\n    scheduleFlush = useMessageChannel();\n  } else if (browserWindow === undefined && typeof require === 'function') {\n    scheduleFlush = attemptVertx();\n  } else {\n    scheduleFlush = useSetTimeout();\n  }\n\n  function then(onFulfillment, onRejection) {\n    var parent = this;\n\n    var child = new this.constructor(noop);\n\n    if (child[PROMISE_ID] === undefined) {\n      makePromise(child);\n    }\n\n    var _state = parent._state;\n\n\n    if (_state) {\n      var callback = arguments[_state - 1];\n      asap(function () {\n        return invokeCallback(_state, child, callback, parent._result);\n      });\n    } else {\n      subscribe(parent, child, onFulfillment, onRejection);\n    }\n\n    return child;\n  }\n\n  /**\n    `Promise.resolve` returns a promise that will become resolved with the\n    passed `value`. It is shorthand for the following:\n\n    ```javascript\n    let promise = new Promise(function(resolve, reject){\n      resolve(1);\n    });\n\n    promise.then(function(value){\n      // value === 1\n    });\n    ```\n\n    Instead of writing the above, your code now simply becomes the following:\n\n    ```javascript\n    let promise = Promise.resolve(1);\n\n    promise.then(function(value){\n      // value === 1\n    });\n    ```\n\n    @method resolve\n    @static\n    @param {Any} value value that the returned promise will be resolved with\n    Useful for tooling.\n    @return {Promise} a promise that will become fulfilled with the given\n    `value`\n  */\n  function resolve$1(object) {\n    /*jshint validthis:true */\n    var Constructor = this;\n\n    if (object && (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && object.constructor === Constructor) {\n      return object;\n    }\n\n    var promise = new Constructor(noop);\n    resolve(promise, object);\n    return promise;\n  }\n\n  var PROMISE_ID = Math.random().toString(36).substring(2);\n\n  function noop() {}\n\n  var PENDING = void 0;\n  var FULFILLED = 1;\n  var REJECTED = 2;\n\n  var TRY_CATCH_ERROR = { error: null };\n\n  function selfFulfillment() {\n    return new TypeError(\"You cannot resolve a promise with itself\");\n  }\n\n  function cannotReturnOwn() {\n    return new TypeError('A promises callback cannot return that same promise.');\n  }\n\n  function getThen(promise) {\n    try {\n      return promise.then;\n    } catch (error) {\n      TRY_CATCH_ERROR.error = error;\n      return TRY_CATCH_ERROR;\n    }\n  }\n\n  function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n    try {\n      then$$1.call(value, fulfillmentHandler, rejectionHandler);\n    } catch (e) {\n      return e;\n    }\n  }\n\n  function handleForeignThenable(promise, thenable, then$$1) {\n    asap(function (promise) {\n      var sealed = false;\n      var error = tryThen(then$$1, thenable, function (value) {\n        if (sealed) {\n          return;\n        }\n        sealed = true;\n        if (thenable !== value) {\n          resolve(promise, value);\n        } else {\n          fulfill(promise, value);\n        }\n      }, function (reason) {\n        if (sealed) {\n          return;\n        }\n        sealed = true;\n\n        reject(promise, reason);\n      }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n      if (!sealed && error) {\n        sealed = true;\n        reject(promise, error);\n      }\n    }, promise);\n  }\n\n  function handleOwnThenable(promise, thenable) {\n    if (thenable._state === FULFILLED) {\n      fulfill(promise, thenable._result);\n    } else if (thenable._state === REJECTED) {\n      reject(promise, thenable._result);\n    } else {\n      subscribe(thenable, undefined, function (value) {\n        return resolve(promise, value);\n      }, function (reason) {\n        return reject(promise, reason);\n      });\n    }\n  }\n\n  function handleMaybeThenable(promise, maybeThenable, then$$1) {\n    if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n      handleOwnThenable(promise, maybeThenable);\n    } else {\n      if (then$$1 === TRY_CATCH_ERROR) {\n        reject(promise, TRY_CATCH_ERROR.error);\n        TRY_CATCH_ERROR.error = null;\n      } else if (then$$1 === undefined) {\n        fulfill(promise, maybeThenable);\n      } else if (isFunction(then$$1)) {\n        handleForeignThenable(promise, maybeThenable, then$$1);\n      } else {\n        fulfill(promise, maybeThenable);\n      }\n    }\n  }\n\n  function resolve(promise, value) {\n    if (promise === value) {\n      reject(promise, selfFulfillment());\n    } else if (objectOrFunction(value)) {\n      handleMaybeThenable(promise, value, getThen(value));\n    } else {\n      fulfill(promise, value);\n    }\n  }\n\n  function publishRejection(promise) {\n    if (promise._onerror) {\n      promise._onerror(promise._result);\n    }\n\n    publish(promise);\n  }\n\n  function fulfill(promise, value) {\n    if (promise._state !== PENDING) {\n      return;\n    }\n\n    promise._result = value;\n    promise._state = FULFILLED;\n\n    if (promise._subscribers.length !== 0) {\n      asap(publish, promise);\n    }\n  }\n\n  function reject(promise, reason) {\n    if (promise._state !== PENDING) {\n      return;\n    }\n    promise._state = REJECTED;\n    promise._result = reason;\n\n    asap(publishRejection, promise);\n  }\n\n  function subscribe(parent, child, onFulfillment, onRejection) {\n    var _subscribers = parent._subscribers;\n    var length = _subscribers.length;\n\n\n    parent._onerror = null;\n\n    _subscribers[length] = child;\n    _subscribers[length + FULFILLED] = onFulfillment;\n    _subscribers[length + REJECTED] = onRejection;\n\n    if (length === 0 && parent._state) {\n      asap(publish, parent);\n    }\n  }\n\n  function publish(promise) {\n    var subscribers = promise._subscribers;\n    var settled = promise._state;\n\n    if (subscribers.length === 0) {\n      return;\n    }\n\n    var child = void 0,\n        callback = void 0,\n        detail = promise._result;\n\n    for (var i = 0; i < subscribers.length; i += 3) {\n      child = subscribers[i];\n      callback = subscribers[i + settled];\n\n      if (child) {\n        invokeCallback(settled, child, callback, detail);\n      } else {\n        callback(detail);\n      }\n    }\n\n    promise._subscribers.length = 0;\n  }\n\n  function tryCatch(callback, detail) {\n    try {\n      return callback(detail);\n    } catch (e) {\n      TRY_CATCH_ERROR.error = e;\n      return TRY_CATCH_ERROR;\n    }\n  }\n\n  function invokeCallback(settled, promise, callback, detail) {\n    var hasCallback = isFunction(callback),\n        value = void 0,\n        error = void 0,\n        succeeded = void 0,\n        failed = void 0;\n\n    if (hasCallback) {\n      value = tryCatch(callback, detail);\n\n      if (value === TRY_CATCH_ERROR) {\n        failed = true;\n        error = value.error;\n        value.error = null;\n      } else {\n        succeeded = true;\n      }\n\n      if (promise === value) {\n        reject(promise, cannotReturnOwn());\n        return;\n      }\n    } else {\n      value = detail;\n      succeeded = true;\n    }\n\n    if (promise._state !== PENDING) {\n      // noop\n    } else if (hasCallback && succeeded) {\n      resolve(promise, value);\n    } else if (failed) {\n      reject(promise, error);\n    } else if (settled === FULFILLED) {\n      fulfill(promise, value);\n    } else if (settled === REJECTED) {\n      reject(promise, value);\n    }\n  }\n\n  function initializePromise(promise, resolver) {\n    try {\n      resolver(function resolvePromise(value) {\n        resolve(promise, value);\n      }, function rejectPromise(reason) {\n        reject(promise, reason);\n      });\n    } catch (e) {\n      reject(promise, e);\n    }\n  }\n\n  var id = 0;\n  function nextId() {\n    return id++;\n  }\n\n  function makePromise(promise) {\n    promise[PROMISE_ID] = id++;\n    promise._state = undefined;\n    promise._result = undefined;\n    promise._subscribers = [];\n  }\n\n  function validationError() {\n    return new Error('Array Methods must be provided an Array');\n  }\n\n  var Enumerator = function () {\n    function Enumerator(Constructor, input) {\n      classCallCheck(this, Enumerator);\n\n      this._instanceConstructor = Constructor;\n      this.promise = new Constructor(noop);\n\n      if (!this.promise[PROMISE_ID]) {\n        makePromise(this.promise);\n      }\n\n      if (isArray(input)) {\n        this.length = input.length;\n        this._remaining = input.length;\n\n        this._result = new Array(this.length);\n\n        if (this.length === 0) {\n          fulfill(this.promise, this._result);\n        } else {\n          this.length = this.length || 0;\n          this._enumerate(input);\n          if (this._remaining === 0) {\n            fulfill(this.promise, this._result);\n          }\n        }\n      } else {\n        reject(this.promise, validationError());\n      }\n    }\n\n    createClass(Enumerator, [{\n      key: '_enumerate',\n      value: function _enumerate(input) {\n        for (var i = 0; this._state === PENDING && i < input.length; i++) {\n          this._eachEntry(input[i], i);\n        }\n      }\n    }, {\n      key: '_eachEntry',\n      value: function _eachEntry(entry, i) {\n        var c = this._instanceConstructor;\n        var resolve$$1 = c.resolve;\n\n\n        if (resolve$$1 === resolve$1) {\n          var _then = getThen(entry);\n\n          if (_then === then && entry._state !== PENDING) {\n            this._settledAt(entry._state, i, entry._result);\n          } else if (typeof _then !== 'function') {\n            this._remaining--;\n            this._result[i] = entry;\n          } else if (c === Promise$2) {\n            var promise = new c(noop);\n            handleMaybeThenable(promise, entry, _then);\n            this._willSettleAt(promise, i);\n          } else {\n            this._willSettleAt(new c(function (resolve$$1) {\n              return resolve$$1(entry);\n            }), i);\n          }\n        } else {\n          this._willSettleAt(resolve$$1(entry), i);\n        }\n      }\n    }, {\n      key: '_settledAt',\n      value: function _settledAt(state, i, value) {\n        var promise = this.promise;\n\n\n        if (promise._state === PENDING) {\n          this._remaining--;\n\n          if (state === REJECTED) {\n            reject(promise, value);\n          } else {\n            this._result[i] = value;\n          }\n        }\n\n        if (this._remaining === 0) {\n          fulfill(promise, this._result);\n        }\n      }\n    }, {\n      key: '_willSettleAt',\n      value: function _willSettleAt(promise, i) {\n        var enumerator = this;\n\n        subscribe(promise, undefined, function (value) {\n          return enumerator._settledAt(FULFILLED, i, value);\n        }, function (reason) {\n          return enumerator._settledAt(REJECTED, i, reason);\n        });\n      }\n    }]);\n    return Enumerator;\n  }();\n\n  /**\n    `Promise.all` accepts an array of promises, and returns a new promise which\n    is fulfilled with an array of fulfillment values for the passed promises, or\n    rejected with the reason of the first passed promise to be rejected. It casts all\n    elements of the passed iterable to promises as it runs this algorithm.\n\n    Example:\n\n    ```javascript\n    let promise1 = resolve(1);\n    let promise2 = resolve(2);\n    let promise3 = resolve(3);\n    let promises = [ promise1, promise2, promise3 ];\n\n    Promise.all(promises).then(function(array){\n      // The array here would be [ 1, 2, 3 ];\n    });\n    ```\n\n    If any of the `promises` given to `all` are rejected, the first promise\n    that is rejected will be given as an argument to the returned promises's\n    rejection handler. For example:\n\n    Example:\n\n    ```javascript\n    let promise1 = resolve(1);\n    let promise2 = reject(new Error(\"2\"));\n    let promise3 = reject(new Error(\"3\"));\n    let promises = [ promise1, promise2, promise3 ];\n\n    Promise.all(promises).then(function(array){\n      // Code here never runs because there are rejected promises!\n    }, function(error) {\n      // error.message === \"2\"\n    });\n    ```\n\n    @method all\n    @static\n    @param {Array} entries array of promises\n    @param {String} label optional string for labeling the promise.\n    Useful for tooling.\n    @return {Promise} promise that is fulfilled when all `promises` have been\n    fulfilled, or rejected if any of them become rejected.\n    @static\n  */\n  function all(entries) {\n    return new Enumerator(this, entries).promise;\n  }\n\n  /**\n    `Promise.race` returns a new promise which is settled in the same way as the\n    first passed promise to settle.\n\n    Example:\n\n    ```javascript\n    let promise1 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        resolve('promise 1');\n      }, 200);\n    });\n\n    let promise2 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        resolve('promise 2');\n      }, 100);\n    });\n\n    Promise.race([promise1, promise2]).then(function(result){\n      // result === 'promise 2' because it was resolved before promise1\n      // was resolved.\n    });\n    ```\n\n    `Promise.race` is deterministic in that only the state of the first\n    settled promise matters. For example, even if other promises given to the\n    `promises` array argument are resolved, but the first settled promise has\n    become rejected before the other promises became fulfilled, the returned\n    promise will become rejected:\n\n    ```javascript\n    let promise1 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        resolve('promise 1');\n      }, 200);\n    });\n\n    let promise2 = new Promise(function(resolve, reject){\n      setTimeout(function(){\n        reject(new Error('promise 2'));\n      }, 100);\n    });\n\n    Promise.race([promise1, promise2]).then(function(result){\n      // Code here never runs\n    }, function(reason){\n      // reason.message === 'promise 2' because promise 2 became rejected before\n      // promise 1 became fulfilled\n    });\n    ```\n\n    An example real-world use case is implementing timeouts:\n\n    ```javascript\n    Promise.race([ajax('foo.json'), timeout(5000)])\n    ```\n\n    @method race\n    @static\n    @param {Array} promises array of promises to observe\n    Useful for tooling.\n    @return {Promise} a promise which settles in the same way as the first passed\n    promise to settle.\n  */\n  function race(entries) {\n    /*jshint validthis:true */\n    var Constructor = this;\n\n    if (!isArray(entries)) {\n      return new Constructor(function (_, reject) {\n        return reject(new TypeError('You must pass an array to race.'));\n      });\n    } else {\n      return new Constructor(function (resolve, reject) {\n        var length = entries.length;\n        for (var i = 0; i < length; i++) {\n          Constructor.resolve(entries[i]).then(resolve, reject);\n        }\n      });\n    }\n  }\n\n  /**\n    `Promise.reject` returns a promise rejected with the passed `reason`.\n    It is shorthand for the following:\n\n    ```javascript\n    let promise = new Promise(function(resolve, reject){\n      reject(new Error('WHOOPS'));\n    });\n\n    promise.then(function(value){\n      // Code here doesn't run because the promise is rejected!\n    }, function(reason){\n      // reason.message === 'WHOOPS'\n    });\n    ```\n\n    Instead of writing the above, your code now simply becomes the following:\n\n    ```javascript\n    let promise = Promise.reject(new Error('WHOOPS'));\n\n    promise.then(function(value){\n      // Code here doesn't run because the promise is rejected!\n    }, function(reason){\n      // reason.message === 'WHOOPS'\n    });\n    ```\n\n    @method reject\n    @static\n    @param {Any} reason value that the returned promise will be rejected with.\n    Useful for tooling.\n    @return {Promise} a promise rejected with the given `reason`.\n  */\n  function reject$1(reason) {\n    /*jshint validthis:true */\n    var Constructor = this;\n    var promise = new Constructor(noop);\n    reject(promise, reason);\n    return promise;\n  }\n\n  function needsResolver() {\n    throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n  }\n\n  function needsNew() {\n    throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n  }\n\n  /**\n    Promise objects represent the eventual result of an asynchronous operation. The\n    primary way of interacting with a promise is through its `then` method, which\n    registers callbacks to receive either a promise's eventual value or the reason\n    why the promise cannot be fulfilled.\n\n    Terminology\n    -----------\n\n    - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n    - `thenable` is an object or function that defines a `then` method.\n    - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n    - `exception` is a value that is thrown using the throw statement.\n    - `reason` is a value that indicates why a promise was rejected.\n    - `settled` the final resting state of a promise, fulfilled or rejected.\n\n    A promise can be in one of three states: pending, fulfilled, or rejected.\n\n    Promises that are fulfilled have a fulfillment value and are in the fulfilled\n    state.  Promises that are rejected have a rejection reason and are in the\n    rejected state.  A fulfillment value is never a thenable.\n\n    Promises can also be said to *resolve* a value.  If this value is also a\n    promise, then the original promise's settled state will match the value's\n    settled state.  So a promise that *resolves* a promise that rejects will\n    itself reject, and a promise that *resolves* a promise that fulfills will\n    itself fulfill.\n\n\n    Basic Usage:\n    ------------\n\n    ```js\n    let promise = new Promise(function(resolve, reject) {\n      // on success\n      resolve(value);\n\n      // on failure\n      reject(reason);\n    });\n\n    promise.then(function(value) {\n      // on fulfillment\n    }, function(reason) {\n      // on rejection\n    });\n    ```\n\n    Advanced Usage:\n    ---------------\n\n    Promises shine when abstracting away asynchronous interactions such as\n    `XMLHttpRequest`s.\n\n    ```js\n    function getJSON(url) {\n      return new Promise(function(resolve, reject){\n        let xhr = new XMLHttpRequest();\n\n        xhr.open('GET', url);\n        xhr.onreadystatechange = handler;\n        xhr.responseType = 'json';\n        xhr.setRequestHeader('Accept', 'application/json');\n        xhr.send();\n\n        function handler() {\n          if (this.readyState === this.DONE) {\n            if (this.status === 200) {\n              resolve(this.response);\n            } else {\n              reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n            }\n          }\n        };\n      });\n    }\n\n    getJSON('/posts.json').then(function(json) {\n      // on fulfillment\n    }, function(reason) {\n      // on rejection\n    });\n    ```\n\n    Unlike callbacks, promises are great composable primitives.\n\n    ```js\n    Promise.all([\n      getJSON('/posts'),\n      getJSON('/comments')\n    ]).then(function(values){\n      values[0] // => postsJSON\n      values[1] // => commentsJSON\n\n      return values;\n    });\n    ```\n\n    @class Promise\n    @param {Function} resolver\n    Useful for tooling.\n    @constructor\n  */\n\n  var Promise$2 = function () {\n    function Promise(resolver) {\n      classCallCheck(this, Promise);\n\n      this[PROMISE_ID] = nextId();\n      this._result = this._state = undefined;\n      this._subscribers = [];\n\n      if (noop !== resolver) {\n        typeof resolver !== 'function' && needsResolver();\n        this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n      }\n    }\n\n    /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n     ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n     Chaining\n    --------\n     The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n     ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n     findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we're unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n     ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n     Assimilation\n    ------------\n     Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n     ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n     If the assimliated promise rejects, then the downstream promise will also reject.\n     ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n     Simple Example\n    --------------\n     Synchronous Example\n     ```javascript\n    let result;\n     try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n     Errback Example\n     ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n     Promise Example;\n     ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n     Advanced Example\n    --------------\n     Synchronous Example\n     ```javascript\n    let author, books;\n     try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n     Errback Example\n     ```js\n     function foundBooks(books) {\n     }\n     function failure(reason) {\n     }\n     findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n     Promise Example;\n     ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n     @method then\n    @param {Function} onFulfilled\n    @param {Function} onRejected\n    Useful for tooling.\n    @return {Promise}\n    */\n\n    /**\n    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n    as the catch block of a try/catch statement.\n    ```js\n    function findAuthor(){\n    throw new Error('couldn't find that author');\n    }\n    // synchronous\n    try {\n    findAuthor();\n    } catch(reason) {\n    // something went wrong\n    }\n    // async with promises\n    findAuthor().catch(function(reason){\n    // something went wrong\n    });\n    ```\n    @method catch\n    @param {Function} onRejection\n    Useful for tooling.\n    @return {Promise}\n    */\n\n\n    createClass(Promise, [{\n      key: 'catch',\n      value: function _catch(onRejection) {\n        return this.then(null, onRejection);\n      }\n\n      /**\n        `finally` will be invoked regardless of the promise's fate just as native\n        try/catch/finally behaves\n      \n        Synchronous example:\n      \n        ```js\n        findAuthor() {\n          if (Math.random() > 0.5) {\n            throw new Error();\n          }\n          return new Author();\n        }\n      \n        try {\n          return findAuthor(); // succeed or fail\n        } catch(error) {\n          return findOtherAuther();\n        } finally {\n          // always runs\n          // doesn't affect the return value\n        }\n        ```\n      \n        Asynchronous example:\n      \n        ```js\n        findAuthor().catch(function(reason){\n          return findOtherAuther();\n        }).finally(function(){\n          // author was either found, or not\n        });\n        ```\n      \n        @method finally\n        @param {Function} callback\n        @return {Promise}\n      */\n\n    }, {\n      key: 'finally',\n      value: function _finally(callback) {\n        var promise = this;\n        var constructor = promise.constructor;\n\n        if (isFunction(callback)) {\n          return promise.then(function (value) {\n            return constructor.resolve(callback()).then(function () {\n              return value;\n            });\n          }, function (reason) {\n            return constructor.resolve(callback()).then(function () {\n              throw reason;\n            });\n          });\n        }\n\n        return promise.then(callback, callback);\n      }\n    }]);\n    return Promise;\n  }();\n\n  Promise$2.prototype.then = then;\n  Promise$2.all = all;\n  Promise$2.race = race;\n  Promise$2.resolve = resolve$1;\n  Promise$2.reject = reject$1;\n  Promise$2._setScheduler = setScheduler;\n  Promise$2._setAsap = setAsap;\n  Promise$2._asap = asap;\n\n  /*global self*/\n  function polyfill() {\n    var local = void 0;\n\n    if (typeof global !== 'undefined') {\n      local = global;\n    } else if (typeof self !== 'undefined') {\n      local = self;\n    } else {\n      try {\n        local = Function('return this')();\n      } catch (e) {\n        throw new Error('polyfill failed because global object is unavailable in this environment');\n      }\n    }\n\n    var P = local.Promise;\n\n    if (P) {\n      var promiseToString = null;\n      try {\n        promiseToString = Object.prototype.toString.call(P.resolve());\n      } catch (e) {\n        // silently ignored\n      }\n\n      if (promiseToString === '[object Promise]' && !P.cast) {\n        return;\n      }\n    }\n\n    local.Promise = Promise$2;\n  }\n\n  // Strange compat..\n  Promise$2.polyfill = polyfill;\n  Promise$2.Promise = Promise$2;\n\n  var Promise$1 = typeof Promise !== \"undefined\" ? Promise : Promise$2;\n\n  // Register logging callbacks\n  function registerLoggingCallbacks(obj) {\n  \tvar i,\n  \t    l,\n  \t    key,\n  \t    callbackNames = [\"begin\", \"done\", \"log\", \"testStart\", \"testDone\", \"moduleStart\", \"moduleDone\"];\n\n  \tfunction registerLoggingCallback(key) {\n  \t\tvar loggingCallback = function loggingCallback(callback) {\n  \t\t\tif (objectType(callback) !== \"function\") {\n  \t\t\t\tthrow new Error(\"QUnit logging methods require a callback function as their first parameters.\");\n  \t\t\t}\n\n  \t\t\tconfig.callbacks[key].push(callback);\n  \t\t};\n\n  \t\treturn loggingCallback;\n  \t}\n\n  \tfor (i = 0, l = callbackNames.length; i < l; i++) {\n  \t\tkey = callbackNames[i];\n\n  \t\t// Initialize key collection of logging callback\n  \t\tif (objectType(config.callbacks[key]) === \"undefined\") {\n  \t\t\tconfig.callbacks[key] = [];\n  \t\t}\n\n  \t\tobj[key] = registerLoggingCallback(key);\n  \t}\n  }\n\n  function runLoggingCallbacks(key, args) {\n  \tvar callbacks = config.callbacks[key];\n\n  \t// Handling 'log' callbacks separately. Unlike the other callbacks,\n  \t// the log callback is not controlled by the processing queue,\n  \t// but rather used by asserts. Hence to promisfy the 'log' callback\n  \t// would mean promisfying each step of a test\n  \tif (key === \"log\") {\n  \t\tcallbacks.map(function (callback) {\n  \t\t\treturn callback(args);\n  \t\t});\n  \t\treturn;\n  \t}\n\n  \t// ensure that each callback is executed serially\n  \treturn callbacks.reduce(function (promiseChain, callback) {\n  \t\treturn promiseChain.then(function () {\n  \t\t\treturn Promise$1.resolve(callback(args));\n  \t\t});\n  \t}, Promise$1.resolve([]));\n  }\n\n  // Doesn't support IE9, it will return undefined on these browsers\n  // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\n  var fileName = (sourceFromStacktrace(0) || \"\").replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\");\n\n  function extractStacktrace(e, offset) {\n  \toffset = offset === undefined ? 4 : offset;\n\n  \tvar stack, include, i;\n\n  \tif (e && e.stack) {\n  \t\tstack = e.stack.split(\"\\n\");\n  \t\tif (/^error$/i.test(stack[0])) {\n  \t\t\tstack.shift();\n  \t\t}\n  \t\tif (fileName) {\n  \t\t\tinclude = [];\n  \t\t\tfor (i = offset; i < stack.length; i++) {\n  \t\t\t\tif (stack[i].indexOf(fileName) !== -1) {\n  \t\t\t\t\tbreak;\n  \t\t\t\t}\n  \t\t\t\tinclude.push(stack[i]);\n  \t\t\t}\n  \t\t\tif (include.length) {\n  \t\t\t\treturn include.join(\"\\n\");\n  \t\t\t}\n  \t\t}\n  \t\treturn stack[offset];\n  \t}\n  }\n\n  function sourceFromStacktrace(offset) {\n  \tvar error = new Error();\n\n  \t// Support: Safari <=7 only, IE <=10 - 11 only\n  \t// Not all browsers generate the `stack` property for `new Error()`, see also #636\n  \tif (!error.stack) {\n  \t\ttry {\n  \t\t\tthrow error;\n  \t\t} catch (err) {\n  \t\t\terror = err;\n  \t\t}\n  \t}\n\n  \treturn extractStacktrace(error, offset);\n  }\n\n  var priorityCount = 0;\n  var unitSampler = void 0;\n\n  // This is a queue of functions that are tasks within a single test.\n  // After tests are dequeued from config.queue they are expanded into\n  // a set of tasks in this queue.\n  var taskQueue = [];\n\n  /**\n   * Advances the taskQueue to the next task. If the taskQueue is empty,\n   * process the testQueue\n   */\n  function advance() {\n  \tadvanceTaskQueue();\n\n  \tif (!taskQueue.length && !config.blocking && !config.current) {\n  \t\tadvanceTestQueue();\n  \t}\n  }\n\n  /**\n   * Advances the taskQueue with an increased depth\n   */\n  function advanceTaskQueue() {\n  \tvar start = now();\n  \tconfig.depth = (config.depth || 0) + 1;\n\n  \tprocessTaskQueue(start);\n\n  \tconfig.depth--;\n  }\n\n  /**\n   * Process the first task on the taskQueue as a promise.\n   * Each task is a function returned by https://github.com/qunitjs/qunit/blob/master/src/test.js#L381\n   */\n  function processTaskQueue(start) {\n  \tif (taskQueue.length && !config.blocking) {\n  \t\tvar elapsedTime = now() - start;\n\n  \t\tif (!defined.setTimeout || config.updateRate <= 0 || elapsedTime < config.updateRate) {\n  \t\t\tvar task = taskQueue.shift();\n  \t\t\tPromise$1.resolve(task()).then(function () {\n  \t\t\t\tif (!taskQueue.length) {\n  \t\t\t\t\tadvance();\n  \t\t\t\t} else {\n  \t\t\t\t\tprocessTaskQueue(start);\n  \t\t\t\t}\n  \t\t\t});\n  \t\t} else {\n  \t\t\tsetTimeout$1(advance);\n  \t\t}\n  \t}\n  }\n\n  /**\n   * Advance the testQueue to the next test to process. Call done() if testQueue completes.\n   */\n  function advanceTestQueue() {\n  \tif (!config.blocking && !config.queue.length && config.depth === 0) {\n  \t\tdone();\n  \t\treturn;\n  \t}\n\n  \tvar testTasks = config.queue.shift();\n  \taddToTaskQueue(testTasks());\n\n  \tif (priorityCount > 0) {\n  \t\tpriorityCount--;\n  \t}\n\n  \tadvance();\n  }\n\n  /**\n   * Enqueue the tasks for a test into the task queue.\n   * @param {Array} tasksArray\n   */\n  function addToTaskQueue(tasksArray) {\n  \ttaskQueue.push.apply(taskQueue, toConsumableArray(tasksArray));\n  }\n\n  /**\n   * Return the number of tasks remaining in the task queue to be processed.\n   * @return {Number}\n   */\n  function taskQueueLength() {\n  \treturn taskQueue.length;\n  }\n\n  /**\n   * Adds a test to the TestQueue for execution.\n   * @param {Function} testTasksFunc\n   * @param {Boolean} prioritize\n   * @param {String} seed\n   */\n  function addToTestQueue(testTasksFunc, prioritize, seed) {\n  \tif (prioritize) {\n  \t\tconfig.queue.splice(priorityCount++, 0, testTasksFunc);\n  \t} else if (seed) {\n  \t\tif (!unitSampler) {\n  \t\t\tunitSampler = unitSamplerGenerator(seed);\n  \t\t}\n\n  \t\t// Insert into a random position after all prioritized items\n  \t\tvar index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));\n  \t\tconfig.queue.splice(priorityCount + index, 0, testTasksFunc);\n  \t} else {\n  \t\tconfig.queue.push(testTasksFunc);\n  \t}\n  }\n\n  /**\n   * Creates a seeded \"sample\" generator which is used for randomizing tests.\n   */\n  function unitSamplerGenerator(seed) {\n\n  \t// 32-bit xorshift, requires only a nonzero seed\n  \t// http://excamera.com/sphinx/article-xorshift.html\n  \tvar sample = parseInt(generateHash(seed), 16) || -1;\n  \treturn function () {\n  \t\tsample ^= sample << 13;\n  \t\tsample ^= sample >>> 17;\n  \t\tsample ^= sample << 5;\n\n  \t\t// ECMAScript has no unsigned number type\n  \t\tif (sample < 0) {\n  \t\t\tsample += 0x100000000;\n  \t\t}\n\n  \t\treturn sample / 0x100000000;\n  \t};\n  }\n\n  /**\n   * This function is called when the ProcessingQueue is done processing all\n   * items. It handles emitting the final run events.\n   */\n  function done() {\n  \tvar storage = config.storage;\n\n  \tProcessingQueue.finished = true;\n\n  \tvar runtime = now() - config.started;\n  \tvar passed = config.stats.all - config.stats.bad;\n\n  \tif (config.stats.all === 0) {\n\n  \t\tif (config.filter && config.filter.length) {\n  \t\t\tthrow new Error(\"No tests matched the filter \\\"\" + config.filter + \"\\\".\");\n  \t\t}\n\n  \t\tif (config.module && config.module.length) {\n  \t\t\tthrow new Error(\"No tests matched the module \\\"\" + config.module + \"\\\".\");\n  \t\t}\n\n  \t\tif (config.moduleId && config.moduleId.length) {\n  \t\t\tthrow new Error(\"No tests matched the moduleId \\\"\" + config.moduleId + \"\\\".\");\n  \t\t}\n\n  \t\tif (config.testId && config.testId.length) {\n  \t\t\tthrow new Error(\"No tests matched the testId \\\"\" + config.testId + \"\\\".\");\n  \t\t}\n\n  \t\tthrow new Error(\"No tests were run.\");\n  \t}\n\n  \temit(\"runEnd\", globalSuite.end(true));\n  \trunLoggingCallbacks(\"done\", {\n  \t\tpassed: passed,\n  \t\tfailed: config.stats.bad,\n  \t\ttotal: config.stats.all,\n  \t\truntime: runtime\n  \t}).then(function () {\n\n  \t\t// Clear own storage items if all tests passed\n  \t\tif (storage && config.stats.bad === 0) {\n  \t\t\tfor (var i = storage.length - 1; i >= 0; i--) {\n  \t\t\t\tvar key = storage.key(i);\n\n  \t\t\t\tif (key.indexOf(\"qunit-test-\") === 0) {\n  \t\t\t\t\tstorage.removeItem(key);\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n  \t});\n  }\n\n  var ProcessingQueue = {\n  \tfinished: false,\n  \tadd: addToTestQueue,\n  \tadvance: advance,\n  \ttaskCount: taskQueueLength\n  };\n\n  var TestReport = function () {\n  \tfunction TestReport(name, suite, options) {\n  \t\tclassCallCheck(this, TestReport);\n\n  \t\tthis.name = name;\n  \t\tthis.suiteName = suite.name;\n  \t\tthis.fullName = suite.fullName.concat(name);\n  \t\tthis.runtime = 0;\n  \t\tthis.assertions = [];\n\n  \t\tthis.skipped = !!options.skip;\n  \t\tthis.todo = !!options.todo;\n\n  \t\tthis.valid = options.valid;\n\n  \t\tthis._startTime = 0;\n  \t\tthis._endTime = 0;\n\n  \t\tsuite.pushTest(this);\n  \t}\n\n  \tcreateClass(TestReport, [{\n  \t\tkey: \"start\",\n  \t\tvalue: function start(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._startTime = performanceNow();\n  \t\t\t\tif (performance) {\n  \t\t\t\t\tperformance.mark(\"qunit_test_start\");\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\treturn {\n  \t\t\t\tname: this.name,\n  \t\t\t\tsuiteName: this.suiteName,\n  \t\t\t\tfullName: this.fullName.slice()\n  \t\t\t};\n  \t\t}\n  \t}, {\n  \t\tkey: \"end\",\n  \t\tvalue: function end(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._endTime = performanceNow();\n  \t\t\t\tif (performance) {\n  \t\t\t\t\tperformance.mark(\"qunit_test_end\");\n\n  \t\t\t\t\tvar testName = this.fullName.join(\" – \");\n\n  \t\t\t\t\tmeasure(\"QUnit Test: \" + testName, \"qunit_test_start\", \"qunit_test_end\");\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\treturn extend(this.start(), {\n  \t\t\t\truntime: this.getRuntime(),\n  \t\t\t\tstatus: this.getStatus(),\n  \t\t\t\terrors: this.getFailedAssertions(),\n  \t\t\t\tassertions: this.getAssertions()\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushAssertion\",\n  \t\tvalue: function pushAssertion(assertion) {\n  \t\t\tthis.assertions.push(assertion);\n  \t\t}\n  \t}, {\n  \t\tkey: \"getRuntime\",\n  \t\tvalue: function getRuntime() {\n  \t\t\treturn this._endTime - this._startTime;\n  \t\t}\n  \t}, {\n  \t\tkey: \"getStatus\",\n  \t\tvalue: function getStatus() {\n  \t\t\tif (this.skipped) {\n  \t\t\t\treturn \"skipped\";\n  \t\t\t}\n\n  \t\t\tvar testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;\n\n  \t\t\tif (!testPassed) {\n  \t\t\t\treturn \"failed\";\n  \t\t\t} else if (this.todo) {\n  \t\t\t\treturn \"todo\";\n  \t\t\t} else {\n  \t\t\t\treturn \"passed\";\n  \t\t\t}\n  \t\t}\n  \t}, {\n  \t\tkey: \"getFailedAssertions\",\n  \t\tvalue: function getFailedAssertions() {\n  \t\t\treturn this.assertions.filter(function (assertion) {\n  \t\t\t\treturn !assertion.passed;\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"getAssertions\",\n  \t\tvalue: function getAssertions() {\n  \t\t\treturn this.assertions.slice();\n  \t\t}\n\n  \t\t// Remove actual and expected values from assertions. This is to prevent\n  \t\t// leaking memory throughout a test suite.\n\n  \t}, {\n  \t\tkey: \"slimAssertions\",\n  \t\tvalue: function slimAssertions() {\n  \t\t\tthis.assertions = this.assertions.map(function (assertion) {\n  \t\t\t\tdelete assertion.actual;\n  \t\t\t\tdelete assertion.expected;\n  \t\t\t\treturn assertion;\n  \t\t\t});\n  \t\t}\n  \t}]);\n  \treturn TestReport;\n  }();\n\n  var focused$1 = false;\n\n  function Test(settings) {\n  \tvar i, l;\n\n  \t++Test.count;\n\n  \tthis.expected = null;\n  \tthis.assertions = [];\n  \tthis.semaphore = 0;\n  \tthis.module = config.currentModule;\n  \tthis.stack = sourceFromStacktrace(3);\n  \tthis.steps = [];\n  \tthis.timeout = undefined;\n\n  \t// If a module is skipped, all its tests and the tests of the child suites\n  \t// should be treated as skipped even if they are defined as `only` or `todo`.\n  \t// As for `todo` module, all its tests will be treated as `todo` except for\n  \t// tests defined as `skip` which will be left intact.\n  \t//\n  \t// So, if a test is defined as `todo` and is inside a skipped module, we should\n  \t// then treat that test as if was defined as `skip`.\n  \tif (this.module.skip) {\n  \t\tsettings.skip = true;\n  \t\tsettings.todo = false;\n\n  \t\t// Skipped tests should be left intact\n  \t} else if (this.module.todo && !settings.skip) {\n  \t\tsettings.todo = true;\n  \t}\n\n  \textend(this, settings);\n\n  \tthis.testReport = new TestReport(settings.testName, this.module.suiteReport, {\n  \t\ttodo: settings.todo,\n  \t\tskip: settings.skip,\n  \t\tvalid: this.valid()\n  \t});\n\n  \t// Register unique strings\n  \tfor (i = 0, l = this.module.tests; i < l.length; i++) {\n  \t\tif (this.module.tests[i].name === this.testName) {\n  \t\t\tthis.testName += \" \";\n  \t\t}\n  \t}\n\n  \tthis.testId = generateHash(this.module.name, this.testName);\n\n  \tthis.module.tests.push({\n  \t\tname: this.testName,\n  \t\ttestId: this.testId,\n  \t\tskip: !!settings.skip\n  \t});\n\n  \tif (settings.skip) {\n\n  \t\t// Skipped tests will fully ignore any sent callback\n  \t\tthis.callback = function () {};\n  \t\tthis.async = false;\n  \t\tthis.expected = 0;\n  \t} else {\n  \t\tif (typeof this.callback !== \"function\") {\n  \t\t\tvar method = this.todo ? \"todo\" : \"test\";\n\n  \t\t\t// eslint-disable-next-line max-len\n  \t\t\tthrow new TypeError(\"You must provide a function as a test callback to QUnit.\" + method + \"(\\\"\" + settings.testName + \"\\\")\");\n  \t\t}\n\n  \t\tthis.assert = new Assert(this);\n  \t}\n  }\n\n  Test.count = 0;\n\n  function getNotStartedModules(startModule) {\n  \tvar module = startModule,\n  \t    modules = [];\n\n  \twhile (module && module.testsRun === 0) {\n  \t\tmodules.push(module);\n  \t\tmodule = module.parentModule;\n  \t}\n\n  \t// The above push modules from the child to the parent\n  \t// return a reversed order with the top being the top most parent module\n  \treturn modules.reverse();\n  }\n\n  Test.prototype = {\n  \tbefore: function before() {\n  \t\tvar _this = this;\n\n  \t\tvar module = this.module,\n  \t\t    notStartedModules = getNotStartedModules(module);\n\n  \t\t// ensure the callbacks are executed serially for each module\n  \t\tvar callbackPromises = notStartedModules.reduce(function (promiseChain, startModule) {\n  \t\t\treturn promiseChain.then(function () {\n  \t\t\t\tstartModule.stats = { all: 0, bad: 0, started: now() };\n  \t\t\t\temit(\"suiteStart\", startModule.suiteReport.start(true));\n  \t\t\t\treturn runLoggingCallbacks(\"moduleStart\", {\n  \t\t\t\t\tname: startModule.name,\n  \t\t\t\t\ttests: startModule.tests\n  \t\t\t\t});\n  \t\t\t});\n  \t\t}, Promise$1.resolve([]));\n\n  \t\treturn callbackPromises.then(function () {\n  \t\t\tconfig.current = _this;\n\n  \t\t\t_this.testEnvironment = extend({}, module.testEnvironment);\n\n  \t\t\t_this.started = now();\n  \t\t\temit(\"testStart\", _this.testReport.start(true));\n  \t\t\treturn runLoggingCallbacks(\"testStart\", {\n  \t\t\t\tname: _this.testName,\n  \t\t\t\tmodule: module.name,\n  \t\t\t\ttestId: _this.testId,\n  \t\t\t\tpreviousFailure: _this.previousFailure\n  \t\t\t}).then(function () {\n  \t\t\t\tif (!config.pollution) {\n  \t\t\t\t\tsaveGlobal();\n  \t\t\t\t}\n  \t\t\t});\n  \t\t});\n  \t},\n\n  \trun: function run() {\n  \t\tvar promise;\n\n  \t\tconfig.current = this;\n\n  \t\tthis.callbackStarted = now();\n\n  \t\tif (config.notrycatch) {\n  \t\t\trunTest(this);\n  \t\t\treturn;\n  \t\t}\n\n  \t\ttry {\n  \t\t\trunTest(this);\n  \t\t} catch (e) {\n  \t\t\tthis.pushFailure(\"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + (e.message || e), extractStacktrace(e, 0));\n\n  \t\t\t// Else next test will carry the responsibility\n  \t\t\tsaveGlobal();\n\n  \t\t\t// Restart the tests if they're blocking\n  \t\t\tif (config.blocking) {\n  \t\t\t\tinternalRecover(this);\n  \t\t\t}\n  \t\t}\n\n  \t\tfunction runTest(test) {\n  \t\t\tpromise = test.callback.call(test.testEnvironment, test.assert);\n  \t\t\ttest.resolvePromise(promise);\n\n  \t\t\t// If the test has a \"lock\" on it, but the timeout is 0, then we push a\n  \t\t\t// failure as the test should be synchronous.\n  \t\t\tif (test.timeout === 0 && test.semaphore !== 0) {\n  \t\t\t\tpushFailure(\"Test did not finish synchronously even though assert.timeout( 0 ) was used.\", sourceFromStacktrace(2));\n  \t\t\t}\n  \t\t}\n  \t},\n\n  \tafter: function after() {\n  \t\tcheckPollution();\n  \t},\n\n  \tqueueHook: function queueHook(hook, hookName, hookOwner) {\n  \t\tvar _this2 = this;\n\n  \t\tvar callHook = function callHook() {\n  \t\t\tvar promise = hook.call(_this2.testEnvironment, _this2.assert);\n  \t\t\t_this2.resolvePromise(promise, hookName);\n  \t\t};\n\n  \t\tvar runHook = function runHook() {\n  \t\t\tif (hookName === \"before\") {\n  \t\t\t\tif (hookOwner.unskippedTestsRun !== 0) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\t_this2.preserveEnvironment = true;\n  \t\t\t}\n\n  \t\t\t// The 'after' hook should only execute when there are not tests left and\n  \t\t\t// when the 'after' and 'finish' tasks are the only tasks left to process\n  \t\t\tif (hookName === \"after\" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && (config.queue.length > 0 || ProcessingQueue.taskCount() > 2)) {\n  \t\t\t\treturn;\n  \t\t\t}\n\n  \t\t\tconfig.current = _this2;\n  \t\t\tif (config.notrycatch) {\n  \t\t\t\tcallHook();\n  \t\t\t\treturn;\n  \t\t\t}\n  \t\t\ttry {\n  \t\t\t\tcallHook();\n  \t\t\t} catch (error) {\n  \t\t\t\t_this2.pushFailure(hookName + \" failed on \" + _this2.testName + \": \" + (error.message || error), extractStacktrace(error, 0));\n  \t\t\t}\n  \t\t};\n\n  \t\treturn runHook;\n  \t},\n\n\n  \t// Currently only used for module level hooks, can be used to add global level ones\n  \thooks: function hooks(handler) {\n  \t\tvar hooks = [];\n\n  \t\tfunction processHooks(test, module) {\n  \t\t\tif (module.parentModule) {\n  \t\t\t\tprocessHooks(test, module.parentModule);\n  \t\t\t}\n\n  \t\t\tif (module.hooks[handler].length) {\n  \t\t\t\tfor (var i = 0; i < module.hooks[handler].length; i++) {\n  \t\t\t\t\thooks.push(test.queueHook(module.hooks[handler][i], handler, module));\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\t// Hooks are ignored on skipped tests\n  \t\tif (!this.skip) {\n  \t\t\tprocessHooks(this, this.module);\n  \t\t}\n\n  \t\treturn hooks;\n  \t},\n\n\n  \tfinish: function finish() {\n  \t\tconfig.current = this;\n\n  \t\t// Release the test callback to ensure that anything referenced has been\n  \t\t// released to be garbage collected.\n  \t\tthis.callback = undefined;\n\n  \t\tif (this.steps.length) {\n  \t\t\tvar stepsList = this.steps.join(\", \");\n  \t\t\tthis.pushFailure(\"Expected assert.verifySteps() to be called before end of test \" + (\"after using assert.step(). Unverified steps: \" + stepsList), this.stack);\n  \t\t}\n\n  \t\tif (config.requireExpects && this.expected === null) {\n  \t\t\tthis.pushFailure(\"Expected number of assertions to be defined, but expect() was \" + \"not called.\", this.stack);\n  \t\t} else if (this.expected !== null && this.expected !== this.assertions.length) {\n  \t\t\tthis.pushFailure(\"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack);\n  \t\t} else if (this.expected === null && !this.assertions.length) {\n  \t\t\tthis.pushFailure(\"Expected at least one assertion, but none were run - call \" + \"expect(0) to accept zero assertions.\", this.stack);\n  \t\t}\n\n  \t\tvar i,\n  \t\t    module = this.module,\n  \t\t    moduleName = module.name,\n  \t\t    testName = this.testName,\n  \t\t    skipped = !!this.skip,\n  \t\t    todo = !!this.todo,\n  \t\t    bad = 0,\n  \t\t    storage = config.storage;\n\n  \t\tthis.runtime = now() - this.started;\n\n  \t\tconfig.stats.all += this.assertions.length;\n  \t\tmodule.stats.all += this.assertions.length;\n\n  \t\tfor (i = 0; i < this.assertions.length; i++) {\n  \t\t\tif (!this.assertions[i].result) {\n  \t\t\t\tbad++;\n  \t\t\t\tconfig.stats.bad++;\n  \t\t\t\tmodule.stats.bad++;\n  \t\t\t}\n  \t\t}\n\n  \t\tnotifyTestsRan(module, skipped);\n\n  \t\t// Store result when possible\n  \t\tif (storage) {\n  \t\t\tif (bad) {\n  \t\t\t\tstorage.setItem(\"qunit-test-\" + moduleName + \"-\" + testName, bad);\n  \t\t\t} else {\n  \t\t\t\tstorage.removeItem(\"qunit-test-\" + moduleName + \"-\" + testName);\n  \t\t\t}\n  \t\t}\n\n  \t\t// After emitting the js-reporters event we cleanup the assertion data to\n  \t\t// avoid leaking it. It is not used by the legacy testDone callbacks.\n  \t\temit(\"testEnd\", this.testReport.end(true));\n  \t\tthis.testReport.slimAssertions();\n\n  \t\treturn runLoggingCallbacks(\"testDone\", {\n  \t\t\tname: testName,\n  \t\t\tmodule: moduleName,\n  \t\t\tskipped: skipped,\n  \t\t\ttodo: todo,\n  \t\t\tfailed: bad,\n  \t\t\tpassed: this.assertions.length - bad,\n  \t\t\ttotal: this.assertions.length,\n  \t\t\truntime: skipped ? 0 : this.runtime,\n\n  \t\t\t// HTML Reporter use\n  \t\t\tassertions: this.assertions,\n  \t\t\ttestId: this.testId,\n\n  \t\t\t// Source of Test\n  \t\t\tsource: this.stack\n  \t\t}).then(function () {\n  \t\t\tif (module.testsRun === numberOfTests(module)) {\n  \t\t\t\tvar completedModules = [module];\n\n  \t\t\t\t// Check if the parent modules, iteratively, are done. If that the case,\n  \t\t\t\t// we emit the `suiteEnd` event and trigger `moduleDone` callback.\n  \t\t\t\tvar parent = module.parentModule;\n  \t\t\t\twhile (parent && parent.testsRun === numberOfTests(parent)) {\n  \t\t\t\t\tcompletedModules.push(parent);\n  \t\t\t\t\tparent = parent.parentModule;\n  \t\t\t\t}\n\n  \t\t\t\treturn completedModules.reduce(function (promiseChain, completedModule) {\n  \t\t\t\t\treturn promiseChain.then(function () {\n  \t\t\t\t\t\treturn logSuiteEnd(completedModule);\n  \t\t\t\t\t});\n  \t\t\t\t}, Promise$1.resolve([]));\n  \t\t\t}\n  \t\t}).then(function () {\n  \t\t\tconfig.current = undefined;\n  \t\t});\n\n  \t\tfunction logSuiteEnd(module) {\n\n  \t\t\t// Reset `module.hooks` to ensure that anything referenced in these hooks\n  \t\t\t// has been released to be garbage collected.\n  \t\t\tmodule.hooks = {};\n\n  \t\t\temit(\"suiteEnd\", module.suiteReport.end(true));\n  \t\t\treturn runLoggingCallbacks(\"moduleDone\", {\n  \t\t\t\tname: module.name,\n  \t\t\t\ttests: module.tests,\n  \t\t\t\tfailed: module.stats.bad,\n  \t\t\t\tpassed: module.stats.all - module.stats.bad,\n  \t\t\t\ttotal: module.stats.all,\n  \t\t\t\truntime: now() - module.stats.started\n  \t\t\t});\n  \t\t}\n  \t},\n\n  \tpreserveTestEnvironment: function preserveTestEnvironment() {\n  \t\tif (this.preserveEnvironment) {\n  \t\t\tthis.module.testEnvironment = this.testEnvironment;\n  \t\t\tthis.testEnvironment = extend({}, this.module.testEnvironment);\n  \t\t}\n  \t},\n\n  \tqueue: function queue() {\n  \t\tvar test = this;\n\n  \t\tif (!this.valid()) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tfunction runTest() {\n  \t\t\treturn [function () {\n  \t\t\t\treturn test.before();\n  \t\t\t}].concat(toConsumableArray(test.hooks(\"before\")), [function () {\n  \t\t\t\ttest.preserveTestEnvironment();\n  \t\t\t}], toConsumableArray(test.hooks(\"beforeEach\")), [function () {\n  \t\t\t\ttest.run();\n  \t\t\t}], toConsumableArray(test.hooks(\"afterEach\").reverse()), toConsumableArray(test.hooks(\"after\").reverse()), [function () {\n  \t\t\t\ttest.after();\n  \t\t\t}, function () {\n  \t\t\t\treturn test.finish();\n  \t\t\t}]);\n  \t\t}\n\n  \t\tvar previousFailCount = config.storage && +config.storage.getItem(\"qunit-test-\" + this.module.name + \"-\" + this.testName);\n\n  \t\t// Prioritize previously failed tests, detected from storage\n  \t\tvar prioritize = config.reorder && !!previousFailCount;\n\n  \t\tthis.previousFailure = !!previousFailCount;\n\n  \t\tProcessingQueue.add(runTest, prioritize, config.seed);\n\n  \t\t// If the queue has already finished, we manually process the new test\n  \t\tif (ProcessingQueue.finished) {\n  \t\t\tProcessingQueue.advance();\n  \t\t}\n  \t},\n\n\n  \tpushResult: function pushResult(resultInfo) {\n  \t\tif (this !== config.current) {\n  \t\t\tthrow new Error(\"Assertion occurred after test had finished.\");\n  \t\t}\n\n  \t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n  \t\tvar source,\n  \t\t    details = {\n  \t\t\tmodule: this.module.name,\n  \t\t\tname: this.testName,\n  \t\t\tresult: resultInfo.result,\n  \t\t\tmessage: resultInfo.message,\n  \t\t\tactual: resultInfo.actual,\n  \t\t\ttestId: this.testId,\n  \t\t\tnegative: resultInfo.negative || false,\n  \t\t\truntime: now() - this.started,\n  \t\t\ttodo: !!this.todo\n  \t\t};\n\n  \t\tif (hasOwn.call(resultInfo, \"expected\")) {\n  \t\t\tdetails.expected = resultInfo.expected;\n  \t\t}\n\n  \t\tif (!resultInfo.result) {\n  \t\t\tsource = resultInfo.source || sourceFromStacktrace();\n\n  \t\t\tif (source) {\n  \t\t\t\tdetails.source = source;\n  \t\t\t}\n  \t\t}\n\n  \t\tthis.logAssertion(details);\n\n  \t\tthis.assertions.push({\n  \t\t\tresult: !!resultInfo.result,\n  \t\t\tmessage: resultInfo.message\n  \t\t});\n  \t},\n\n  \tpushFailure: function pushFailure(message, source, actual) {\n  \t\tif (!(this instanceof Test)) {\n  \t\t\tthrow new Error(\"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2));\n  \t\t}\n\n  \t\tthis.pushResult({\n  \t\t\tresult: false,\n  \t\t\tmessage: message || \"error\",\n  \t\t\tactual: actual || null,\n  \t\t\tsource: source\n  \t\t});\n  \t},\n\n  \t/**\n    * Log assertion details using both the old QUnit.log interface and\n    * QUnit.on( \"assertion\" ) interface.\n    *\n    * @private\n    */\n  \tlogAssertion: function logAssertion(details) {\n  \t\trunLoggingCallbacks(\"log\", details);\n\n  \t\tvar assertion = {\n  \t\t\tpassed: details.result,\n  \t\t\tactual: details.actual,\n  \t\t\texpected: details.expected,\n  \t\t\tmessage: details.message,\n  \t\t\tstack: details.source,\n  \t\t\ttodo: details.todo\n  \t\t};\n  \t\tthis.testReport.pushAssertion(assertion);\n  \t\temit(\"assertion\", assertion);\n  \t},\n\n\n  \tresolvePromise: function resolvePromise(promise, phase) {\n  \t\tvar then,\n  \t\t    resume,\n  \t\t    message,\n  \t\t    test = this;\n  \t\tif (promise != null) {\n  \t\t\tthen = promise.then;\n  \t\t\tif (objectType(then) === \"function\") {\n  \t\t\t\tresume = internalStop(test);\n  \t\t\t\tif (config.notrycatch) {\n  \t\t\t\t\tthen.call(promise, function () {\n  \t\t\t\t\t\tresume();\n  \t\t\t\t\t});\n  \t\t\t\t} else {\n  \t\t\t\t\tthen.call(promise, function () {\n  \t\t\t\t\t\tresume();\n  \t\t\t\t\t}, function (error) {\n  \t\t\t\t\t\tmessage = \"Promise rejected \" + (!phase ? \"during\" : phase.replace(/Each$/, \"\")) + \" \\\"\" + test.testName + \"\\\": \" + (error && error.message || error);\n  \t\t\t\t\t\ttest.pushFailure(message, extractStacktrace(error, 0));\n\n  \t\t\t\t\t\t// Else next test will carry the responsibility\n  \t\t\t\t\t\tsaveGlobal();\n\n  \t\t\t\t\t\t// Unblock\n  \t\t\t\t\t\tinternalRecover(test);\n  \t\t\t\t\t});\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n  \t},\n\n  \tvalid: function valid() {\n  \t\tvar filter = config.filter,\n  \t\t    regexFilter = /^(!?)\\/([\\w\\W]*)\\/(i?$)/.exec(filter),\n  \t\t    module = config.module && config.module.toLowerCase(),\n  \t\t    fullName = this.module.name + \": \" + this.testName;\n\n  \t\tfunction moduleChainNameMatch(testModule) {\n  \t\t\tvar testModuleName = testModule.name ? testModule.name.toLowerCase() : null;\n  \t\t\tif (testModuleName === module) {\n  \t\t\t\treturn true;\n  \t\t\t} else if (testModule.parentModule) {\n  \t\t\t\treturn moduleChainNameMatch(testModule.parentModule);\n  \t\t\t} else {\n  \t\t\t\treturn false;\n  \t\t\t}\n  \t\t}\n\n  \t\tfunction moduleChainIdMatch(testModule) {\n  \t\t\treturn inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);\n  \t\t}\n\n  \t\t// Internally-generated tests are always valid\n  \t\tif (this.callback && this.callback.validTest) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\tif (config.moduleId && config.moduleId.length > 0 && !moduleChainIdMatch(this.module)) {\n\n  \t\t\treturn false;\n  \t\t}\n\n  \t\tif (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) {\n\n  \t\t\treturn false;\n  \t\t}\n\n  \t\tif (module && !moduleChainNameMatch(this.module)) {\n  \t\t\treturn false;\n  \t\t}\n\n  \t\tif (!filter) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\treturn regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName);\n  \t},\n\n  \tregexFilter: function regexFilter(exclude, pattern, flags, fullName) {\n  \t\tvar regex = new RegExp(pattern, flags);\n  \t\tvar match = regex.test(fullName);\n\n  \t\treturn match !== exclude;\n  \t},\n\n  \tstringFilter: function stringFilter(filter, fullName) {\n  \t\tfilter = filter.toLowerCase();\n  \t\tfullName = fullName.toLowerCase();\n\n  \t\tvar include = filter.charAt(0) !== \"!\";\n  \t\tif (!include) {\n  \t\t\tfilter = filter.slice(1);\n  \t\t}\n\n  \t\t// If the filter matches, we need to honour include\n  \t\tif (fullName.indexOf(filter) !== -1) {\n  \t\t\treturn include;\n  \t\t}\n\n  \t\t// Otherwise, do the opposite\n  \t\treturn !include;\n  \t}\n  };\n\n  function pushFailure() {\n  \tif (!config.current) {\n  \t\tthrow new Error(\"pushFailure() assertion outside test context, in \" + sourceFromStacktrace(2));\n  \t}\n\n  \t// Gets current test obj\n  \tvar currentTest = config.current;\n\n  \treturn currentTest.pushFailure.apply(currentTest, arguments);\n  }\n\n  function saveGlobal() {\n  \tconfig.pollution = [];\n\n  \tif (config.noglobals) {\n  \t\tfor (var key in global$1) {\n  \t\t\tif (hasOwn.call(global$1, key)) {\n\n  \t\t\t\t// In Opera sometimes DOM element ids show up here, ignore them\n  \t\t\t\tif (/^qunit-test-output/.test(key)) {\n  \t\t\t\t\tcontinue;\n  \t\t\t\t}\n  \t\t\t\tconfig.pollution.push(key);\n  \t\t\t}\n  \t\t}\n  \t}\n  }\n\n  function checkPollution() {\n  \tvar newGlobals,\n  \t    deletedGlobals,\n  \t    old = config.pollution;\n\n  \tsaveGlobal();\n\n  \tnewGlobals = diff(config.pollution, old);\n  \tif (newGlobals.length > 0) {\n  \t\tpushFailure(\"Introduced global variable(s): \" + newGlobals.join(\", \"));\n  \t}\n\n  \tdeletedGlobals = diff(old, config.pollution);\n  \tif (deletedGlobals.length > 0) {\n  \t\tpushFailure(\"Deleted global variable(s): \" + deletedGlobals.join(\", \"));\n  \t}\n  }\n\n  // Will be exposed as QUnit.test\n  function test(testName, callback) {\n  \tif (focused$1) {\n  \t\treturn;\n  \t}\n\n  \tvar newTest = new Test({\n  \t\ttestName: testName,\n  \t\tcallback: callback\n  \t});\n\n  \tnewTest.queue();\n  }\n\n  function todo(testName, callback) {\n  \tif (focused$1) {\n  \t\treturn;\n  \t}\n\n  \tvar newTest = new Test({\n  \t\ttestName: testName,\n  \t\tcallback: callback,\n  \t\ttodo: true\n  \t});\n\n  \tnewTest.queue();\n  }\n\n  // Will be exposed as QUnit.skip\n  function skip(testName) {\n  \tif (focused$1) {\n  \t\treturn;\n  \t}\n\n  \tvar test = new Test({\n  \t\ttestName: testName,\n  \t\tskip: true\n  \t});\n\n  \ttest.queue();\n  }\n\n  // Will be exposed as QUnit.only\n  function only(testName, callback) {\n  \tif (focused$1) {\n  \t\treturn;\n  \t}\n\n  \tconfig.queue.length = 0;\n  \tfocused$1 = true;\n\n  \tvar newTest = new Test({\n  \t\ttestName: testName,\n  \t\tcallback: callback\n  \t});\n\n  \tnewTest.queue();\n  }\n\n  // Put a hold on processing and return a function that will release it.\n  function internalStop(test) {\n  \ttest.semaphore += 1;\n  \tconfig.blocking = true;\n\n  \t// Set a recovery timeout, if so configured.\n  \tif (defined.setTimeout) {\n  \t\tvar timeoutDuration = void 0;\n\n  \t\tif (typeof test.timeout === \"number\") {\n  \t\t\ttimeoutDuration = test.timeout;\n  \t\t} else if (typeof config.testTimeout === \"number\") {\n  \t\t\ttimeoutDuration = config.testTimeout;\n  \t\t}\n\n  \t\tif (typeof timeoutDuration === \"number\" && timeoutDuration > 0) {\n  \t\t\tclearTimeout(config.timeout);\n  \t\t\tconfig.timeout = setTimeout$1(function () {\n  \t\t\t\tpushFailure(\"Test took longer than \" + timeoutDuration + \"ms; test timed out.\", sourceFromStacktrace(2));\n  \t\t\t\tinternalRecover(test);\n  \t\t\t}, timeoutDuration);\n  \t\t}\n  \t}\n\n  \tvar released = false;\n  \treturn function resume() {\n  \t\tif (released) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\treleased = true;\n  \t\ttest.semaphore -= 1;\n  \t\tinternalStart(test);\n  \t};\n  }\n\n  // Forcefully release all processing holds.\n  function internalRecover(test) {\n  \ttest.semaphore = 0;\n  \tinternalStart(test);\n  }\n\n  // Release a processing hold, scheduling a resumption attempt if no holds remain.\n  function internalStart(test) {\n\n  \t// If semaphore is non-numeric, throw error\n  \tif (isNaN(test.semaphore)) {\n  \t\ttest.semaphore = 0;\n\n  \t\tpushFailure(\"Invalid value on test.semaphore\", sourceFromStacktrace(2));\n  \t\treturn;\n  \t}\n\n  \t// Don't start until equal number of stop-calls\n  \tif (test.semaphore > 0) {\n  \t\treturn;\n  \t}\n\n  \t// Throw an Error if start is called more often than stop\n  \tif (test.semaphore < 0) {\n  \t\ttest.semaphore = 0;\n\n  \t\tpushFailure(\"Tried to restart test while already started (test's semaphore was 0 already)\", sourceFromStacktrace(2));\n  \t\treturn;\n  \t}\n\n  \t// Add a slight delay to allow more assertions etc.\n  \tif (defined.setTimeout) {\n  \t\tif (config.timeout) {\n  \t\t\tclearTimeout(config.timeout);\n  \t\t}\n  \t\tconfig.timeout = setTimeout$1(function () {\n  \t\t\tif (test.semaphore > 0) {\n  \t\t\t\treturn;\n  \t\t\t}\n\n  \t\t\tif (config.timeout) {\n  \t\t\t\tclearTimeout(config.timeout);\n  \t\t\t}\n\n  \t\t\tbegin();\n  \t\t});\n  \t} else {\n  \t\tbegin();\n  \t}\n  }\n\n  function collectTests(module) {\n  \tvar tests = [].concat(module.tests);\n  \tvar modules = [].concat(toConsumableArray(module.childModules));\n\n  \t// Do a breadth-first traversal of the child modules\n  \twhile (modules.length) {\n  \t\tvar nextModule = modules.shift();\n  \t\ttests.push.apply(tests, nextModule.tests);\n  \t\tmodules.push.apply(modules, toConsumableArray(nextModule.childModules));\n  \t}\n\n  \treturn tests;\n  }\n\n  function numberOfTests(module) {\n  \treturn collectTests(module).length;\n  }\n\n  function numberOfUnskippedTests(module) {\n  \treturn collectTests(module).filter(function (test) {\n  \t\treturn !test.skip;\n  \t}).length;\n  }\n\n  function notifyTestsRan(module, skipped) {\n  \tmodule.testsRun++;\n  \tif (!skipped) {\n  \t\tmodule.unskippedTestsRun++;\n  \t}\n  \twhile (module = module.parentModule) {\n  \t\tmodule.testsRun++;\n  \t\tif (!skipped) {\n  \t\t\tmodule.unskippedTestsRun++;\n  \t\t}\n  \t}\n  }\n\n  var Assert = function () {\n  \tfunction Assert(testContext) {\n  \t\tclassCallCheck(this, Assert);\n\n  \t\tthis.test = testContext;\n  \t}\n\n  \t// Assert helpers\n\n  \tcreateClass(Assert, [{\n  \t\tkey: \"timeout\",\n  \t\tvalue: function timeout(duration) {\n  \t\t\tif (typeof duration !== \"number\") {\n  \t\t\t\tthrow new Error(\"You must pass a number as the duration to assert.timeout\");\n  \t\t\t}\n\n  \t\t\tthis.test.timeout = duration;\n  \t\t}\n\n  \t\t// Documents a \"step\", which is a string value, in a test as a passing assertion\n\n  \t}, {\n  \t\tkey: \"step\",\n  \t\tvalue: function step(message) {\n  \t\t\tvar assertionMessage = message;\n  \t\t\tvar result = !!message;\n\n  \t\t\tthis.test.steps.push(message);\n\n  \t\t\tif (objectType(message) === \"undefined\" || message === \"\") {\n  \t\t\t\tassertionMessage = \"You must provide a message to assert.step\";\n  \t\t\t} else if (objectType(message) !== \"string\") {\n  \t\t\t\tassertionMessage = \"You must provide a string value to assert.step\";\n  \t\t\t\tresult = false;\n  \t\t\t}\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tmessage: assertionMessage\n  \t\t\t});\n  \t\t}\n\n  \t\t// Verifies the steps in a test match a given array of string values\n\n  \t}, {\n  \t\tkey: \"verifySteps\",\n  \t\tvalue: function verifySteps(steps, message) {\n\n  \t\t\t// Since the steps array is just string values, we can clone with slice\n  \t\t\tvar actualStepsClone = this.test.steps.slice();\n  \t\t\tthis.deepEqual(actualStepsClone, steps, message);\n  \t\t\tthis.test.steps.length = 0;\n  \t\t}\n\n  \t\t// Specify the number of expected assertions to guarantee that failed test\n  \t\t// (no assertions are run at all) don't slip through.\n\n  \t}, {\n  \t\tkey: \"expect\",\n  \t\tvalue: function expect(asserts) {\n  \t\t\tif (arguments.length === 1) {\n  \t\t\t\tthis.test.expected = asserts;\n  \t\t\t} else {\n  \t\t\t\treturn this.test.expected;\n  \t\t\t}\n  \t\t}\n\n  \t\t// Put a hold on processing and return a function that will release it a maximum of once.\n\n  \t}, {\n  \t\tkey: \"async\",\n  \t\tvalue: function async(count) {\n  \t\t\tvar test$$1 = this.test;\n\n  \t\t\tvar popped = false,\n  \t\t\t    acceptCallCount = count;\n\n  \t\t\tif (typeof acceptCallCount === \"undefined\") {\n  \t\t\t\tacceptCallCount = 1;\n  \t\t\t}\n\n  \t\t\tvar resume = internalStop(test$$1);\n\n  \t\t\treturn function done() {\n  \t\t\t\tif (config.current !== test$$1) {\n  \t\t\t\t\tthrow Error(\"assert.async callback called after test finished.\");\n  \t\t\t\t}\n\n  \t\t\t\tif (popped) {\n  \t\t\t\t\ttest$$1.pushFailure(\"Too many calls to the `assert.async` callback\", sourceFromStacktrace(2));\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tacceptCallCount -= 1;\n  \t\t\t\tif (acceptCallCount > 0) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tpopped = true;\n  \t\t\t\tresume();\n  \t\t\t};\n  \t\t}\n\n  \t\t// Exports test.push() to the user API\n  \t\t// Alias of pushResult.\n\n  \t}, {\n  \t\tkey: \"push\",\n  \t\tvalue: function push(result, actual, expected, message, negative) {\n  \t\t\tLogger.warn(\"assert.push is deprecated and will be removed in QUnit 3.0.\" + \" Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult).\");\n\n  \t\t\tvar currentAssert = this instanceof Assert ? this : config.current.assert;\n  \t\t\treturn currentAssert.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: negative\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushResult\",\n  \t\tvalue: function pushResult(resultInfo) {\n\n  \t\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n  \t\t\tvar assert = this;\n  \t\t\tvar currentTest = assert instanceof Assert && assert.test || config.current;\n\n  \t\t\t// Backwards compatibility fix.\n  \t\t\t// Allows the direct use of global exported assertions and QUnit.assert.*\n  \t\t\t// Although, it's use is not recommended as it can leak assertions\n  \t\t\t// to other tests from async tests, because we only get a reference to the current test,\n  \t\t\t// not exactly the test where assertion were intended to be called.\n  \t\t\tif (!currentTest) {\n  \t\t\t\tthrow new Error(\"assertion outside test context, in \" + sourceFromStacktrace(2));\n  \t\t\t}\n\n  \t\t\tif (!(assert instanceof Assert)) {\n  \t\t\t\tassert = currentTest.assert;\n  \t\t\t}\n\n  \t\t\treturn assert.test.pushResult(resultInfo);\n  \t\t}\n  \t}, {\n  \t\tkey: \"ok\",\n  \t\tvalue: function ok(result, message) {\n  \t\t\tif (!message) {\n  \t\t\t\tmessage = result ? \"okay\" : \"failed, expected argument to be truthy, was: \" + dump.parse(result);\n  \t\t\t}\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !!result,\n  \t\t\t\tactual: result,\n  \t\t\t\texpected: true,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notOk\",\n  \t\tvalue: function notOk(result, message) {\n  \t\t\tif (!message) {\n  \t\t\t\tmessage = !result ? \"okay\" : \"failed, expected argument to be falsy, was: \" + dump.parse(result);\n  \t\t\t}\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !result,\n  \t\t\t\tactual: result,\n  \t\t\t\texpected: false,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"equal\",\n  \t\tvalue: function equal(actual, expected, message) {\n\n  \t\t\t// eslint-disable-next-line eqeqeq\n  \t\t\tvar result = expected == actual;\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notEqual\",\n  \t\tvalue: function notEqual(actual, expected, message) {\n\n  \t\t\t// eslint-disable-next-line eqeqeq\n  \t\t\tvar result = expected != actual;\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"propEqual\",\n  \t\tvalue: function propEqual(actual, expected, message) {\n  \t\t\tactual = objectValues(actual);\n  \t\t\texpected = objectValues(expected);\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notPropEqual\",\n  \t\tvalue: function notPropEqual(actual, expected, message) {\n  \t\t\tactual = objectValues(actual);\n  \t\t\texpected = objectValues(expected);\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"deepEqual\",\n  \t\tvalue: function deepEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notDeepEqual\",\n  \t\tvalue: function notDeepEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"strictEqual\",\n  \t\tvalue: function strictEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: expected === actual,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notStrictEqual\",\n  \t\tvalue: function notStrictEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: expected !== actual,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"throws\",\n  \t\tvalue: function throws(block, expected, message) {\n  \t\t\tvar actual = void 0,\n  \t\t\t    result = false;\n\n  \t\t\tvar currentTest = this instanceof Assert && this.test || config.current;\n\n  \t\t\t// 'expected' is optional unless doing string comparison\n  \t\t\tif (objectType(expected) === \"string\") {\n  \t\t\t\tif (message == null) {\n  \t\t\t\t\tmessage = expected;\n  \t\t\t\t\texpected = null;\n  \t\t\t\t} else {\n  \t\t\t\t\tthrow new Error(\"throws/raises does not accept a string value for the expected argument.\\n\" + \"Use a non-string object value (e.g. regExp) instead if it's necessary.\");\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tcurrentTest.ignoreGlobalErrors = true;\n  \t\t\ttry {\n  \t\t\t\tblock.call(currentTest.testEnvironment);\n  \t\t\t} catch (e) {\n  \t\t\t\tactual = e;\n  \t\t\t}\n  \t\t\tcurrentTest.ignoreGlobalErrors = false;\n\n  \t\t\tif (actual) {\n  \t\t\t\tvar expectedType = objectType(expected);\n\n  \t\t\t\t// We don't want to validate thrown error\n  \t\t\t\tif (!expected) {\n  \t\t\t\t\tresult = true;\n\n  \t\t\t\t\t// Expected is a regexp\n  \t\t\t\t} else if (expectedType === \"regexp\") {\n  \t\t\t\t\tresult = expected.test(errorString(actual));\n\n  \t\t\t\t\t// Log the string form of the regexp\n  \t\t\t\t\texpected = String(expected);\n\n  \t\t\t\t\t// Expected is a constructor, maybe an Error constructor\n  \t\t\t\t} else if (expectedType === \"function\" && actual instanceof expected) {\n  \t\t\t\t\tresult = true;\n\n  \t\t\t\t\t// Expected is an Error object\n  \t\t\t\t} else if (expectedType === \"object\") {\n  \t\t\t\t\tresult = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;\n\n  \t\t\t\t\t// Log the string form of the Error object\n  \t\t\t\t\texpected = errorString(expected);\n\n  \t\t\t\t\t// Expected is a validation function which returns true if validation passed\n  \t\t\t\t} else if (expectedType === \"function\" && expected.call({}, actual) === true) {\n  \t\t\t\t\texpected = null;\n  \t\t\t\t\tresult = true;\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tcurrentTest.assert.pushResult({\n  \t\t\t\tresult: result,\n\n  \t\t\t\t// undefined if it didn't throw\n  \t\t\t\tactual: actual && errorString(actual),\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"rejects\",\n  \t\tvalue: function rejects(promise, expected, message) {\n  \t\t\tvar result = false;\n\n  \t\t\tvar currentTest = this instanceof Assert && this.test || config.current;\n\n  \t\t\t// 'expected' is optional unless doing string comparison\n  \t\t\tif (objectType(expected) === \"string\") {\n  \t\t\t\tif (message === undefined) {\n  \t\t\t\t\tmessage = expected;\n  \t\t\t\t\texpected = undefined;\n  \t\t\t\t} else {\n  \t\t\t\t\tmessage = \"assert.rejects does not accept a string value for the expected \" + \"argument.\\nUse a non-string object value (e.g. validator function) instead \" + \"if necessary.\";\n\n  \t\t\t\t\tcurrentTest.assert.pushResult({\n  \t\t\t\t\t\tresult: false,\n  \t\t\t\t\t\tmessage: message\n  \t\t\t\t\t});\n\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tvar then = promise && promise.then;\n  \t\t\tif (objectType(then) !== \"function\") {\n  \t\t\t\tvar _message = \"The value provided to `assert.rejects` in \" + \"\\\"\" + currentTest.testName + \"\\\" was not a promise.\";\n\n  \t\t\t\tcurrentTest.assert.pushResult({\n  \t\t\t\t\tresult: false,\n  \t\t\t\t\tmessage: _message,\n  \t\t\t\t\tactual: promise\n  \t\t\t\t});\n\n  \t\t\t\treturn;\n  \t\t\t}\n\n  \t\t\tvar done = this.async();\n\n  \t\t\treturn then.call(promise, function handleFulfillment() {\n  \t\t\t\tvar message = \"The promise returned by the `assert.rejects` callback in \" + \"\\\"\" + currentTest.testName + \"\\\" did not reject.\";\n\n  \t\t\t\tcurrentTest.assert.pushResult({\n  \t\t\t\t\tresult: false,\n  \t\t\t\t\tmessage: message,\n  \t\t\t\t\tactual: promise\n  \t\t\t\t});\n\n  \t\t\t\tdone();\n  \t\t\t}, function handleRejection(actual) {\n  \t\t\t\tvar expectedType = objectType(expected);\n\n  \t\t\t\t// We don't want to validate\n  \t\t\t\tif (expected === undefined) {\n  \t\t\t\t\tresult = true;\n\n  \t\t\t\t\t// Expected is a regexp\n  \t\t\t\t} else if (expectedType === \"regexp\") {\n  \t\t\t\t\tresult = expected.test(errorString(actual));\n\n  \t\t\t\t\t// Log the string form of the regexp\n  \t\t\t\t\texpected = String(expected);\n\n  \t\t\t\t\t// Expected is a constructor, maybe an Error constructor\n  \t\t\t\t} else if (expectedType === \"function\" && actual instanceof expected) {\n  \t\t\t\t\tresult = true;\n\n  \t\t\t\t\t// Expected is an Error object\n  \t\t\t\t} else if (expectedType === \"object\") {\n  \t\t\t\t\tresult = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;\n\n  \t\t\t\t\t// Log the string form of the Error object\n  \t\t\t\t\texpected = errorString(expected);\n\n  \t\t\t\t\t// Expected is a validation function which returns true if validation passed\n  \t\t\t\t} else {\n  \t\t\t\t\tif (expectedType === \"function\") {\n  \t\t\t\t\t\tresult = expected.call({}, actual) === true;\n  \t\t\t\t\t\texpected = null;\n\n  \t\t\t\t\t\t// Expected is some other invalid type\n  \t\t\t\t\t} else {\n  \t\t\t\t\t\tresult = false;\n  \t\t\t\t\t\tmessage = \"invalid expected value provided to `assert.rejects` \" + \"callback in \\\"\" + currentTest.testName + \"\\\": \" + expectedType + \".\";\n  \t\t\t\t\t}\n  \t\t\t\t}\n\n  \t\t\t\tcurrentTest.assert.pushResult({\n  \t\t\t\t\tresult: result,\n\n  \t\t\t\t\t// leave rejection value of undefined as-is\n  \t\t\t\t\tactual: actual && errorString(actual),\n  \t\t\t\t\texpected: expected,\n  \t\t\t\t\tmessage: message\n  \t\t\t\t});\n\n  \t\t\t\tdone();\n  \t\t\t});\n  \t\t}\n  \t}]);\n  \treturn Assert;\n  }();\n\n  // Provide an alternative to assert.throws(), for environments that consider throws a reserved word\n  // Known to us are: Closure Compiler, Narwhal\n  // eslint-disable-next-line dot-notation\n\n\n  Assert.prototype.raises = Assert.prototype[\"throws\"];\n\n  /**\n   * Converts an error into a simple string for comparisons.\n   *\n   * @param {Error|Object} error\n   * @return {String}\n   */\n  function errorString(error) {\n  \tvar resultErrorString = error.toString();\n\n  \t// If the error wasn't a subclass of Error but something like\n  \t// an object literal with name and message properties...\n  \tif (resultErrorString.substring(0, 7) === \"[object\") {\n  \t\tvar name = error.name ? error.name.toString() : \"Error\";\n  \t\tvar message = error.message ? error.message.toString() : \"\";\n\n  \t\tif (name && message) {\n  \t\t\treturn name + \": \" + message;\n  \t\t} else if (name) {\n  \t\t\treturn name;\n  \t\t} else if (message) {\n  \t\t\treturn message;\n  \t\t} else {\n  \t\t\treturn \"Error\";\n  \t\t}\n  \t} else {\n  \t\treturn resultErrorString;\n  \t}\n  }\n\n  /* global module, exports, define */\n  function exportQUnit(QUnit) {\n\n  \tif (defined.document) {\n\n  \t\t// QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined.\n  \t\tif (window$1.QUnit && window$1.QUnit.version) {\n  \t\t\tthrow new Error(\"QUnit has already been defined.\");\n  \t\t}\n\n  \t\twindow$1.QUnit = QUnit;\n  \t}\n\n  \t// For nodejs\n  \tif (typeof module !== \"undefined\" && module && module.exports) {\n  \t\tmodule.exports = QUnit;\n\n  \t\t// For consistency with CommonJS environments' exports\n  \t\tmodule.exports.QUnit = QUnit;\n  \t}\n\n  \t// For CommonJS with exports, but without module.exports, like Rhino\n  \tif (typeof exports !== \"undefined\" && exports) {\n  \t\texports.QUnit = QUnit;\n  \t}\n\n  \tif (typeof define === \"function\" && define.amd) {\n  \t\tdefine(function () {\n  \t\t\treturn QUnit;\n  \t\t});\n  \t\tQUnit.config.autostart = false;\n  \t}\n\n  \t// For Web/Service Workers\n  \tif (self$1 && self$1.WorkerGlobalScope && self$1 instanceof self$1.WorkerGlobalScope) {\n  \t\tself$1.QUnit = QUnit;\n  \t}\n  }\n\n  // Handle an unhandled exception. By convention, returns true if further\n  // error handling should be suppressed and false otherwise.\n  // In this case, we will only suppress further error handling if the\n  // \"ignoreGlobalErrors\" configuration option is enabled.\n  function onError(error) {\n  \tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n  \t\targs[_key - 1] = arguments[_key];\n  \t}\n\n  \tif (config.current) {\n  \t\tif (config.current.ignoreGlobalErrors) {\n  \t\t\treturn true;\n  \t\t}\n  \t\tpushFailure.apply(undefined, [error.message, error.stacktrace || error.fileName + \":\" + error.lineNumber].concat(args));\n  \t} else {\n  \t\ttest(\"global failure\", extend(function () {\n  \t\t\tpushFailure.apply(undefined, [error.message, error.stacktrace || error.fileName + \":\" + error.lineNumber].concat(args));\n  \t\t}, { validTest: true }));\n  \t}\n\n  \treturn false;\n  }\n\n  // Handle an unhandled rejection\n  function onUnhandledRejection(reason) {\n  \tvar resultInfo = {\n  \t\tresult: false,\n  \t\tmessage: reason.message || \"error\",\n  \t\tactual: reason,\n  \t\tsource: reason.stack || sourceFromStacktrace(3)\n  \t};\n\n  \tvar currentTest = config.current;\n  \tif (currentTest) {\n  \t\tcurrentTest.assert.pushResult(resultInfo);\n  \t} else {\n  \t\ttest(\"global failure\", extend(function (assert) {\n  \t\t\tassert.pushResult(resultInfo);\n  \t\t}, { validTest: true }));\n  \t}\n  }\n\n  var QUnit = {};\n  var globalSuite = new SuiteReport();\n\n  // The initial \"currentModule\" represents the global (or top-level) module that\n  // is not explicitly defined by the user, therefore we add the \"globalSuite\" to\n  // it since each module has a suiteReport associated with it.\n  config.currentModule.suiteReport = globalSuite;\n\n  var globalStartCalled = false;\n  var runStarted = false;\n\n  // Figure out if we're running the tests from a server or not\n  QUnit.isLocal = !(defined.document && window$1.location.protocol !== \"file:\");\n\n  // Expose the current QUnit version\n  QUnit.version = \"2.9.1\";\n\n  extend(QUnit, {\n  \ton: on,\n\n  \tmodule: module$1,\n\n  \ttest: test,\n\n  \ttodo: todo,\n\n  \tskip: skip,\n\n  \tonly: only,\n\n  \tstart: function start(count) {\n  \t\tvar globalStartAlreadyCalled = globalStartCalled;\n\n  \t\tif (!config.current) {\n  \t\t\tglobalStartCalled = true;\n\n  \t\t\tif (runStarted) {\n  \t\t\t\tthrow new Error(\"Called start() while test already started running\");\n  \t\t\t} else if (globalStartAlreadyCalled || count > 1) {\n  \t\t\t\tthrow new Error(\"Called start() outside of a test context too many times\");\n  \t\t\t} else if (config.autostart) {\n  \t\t\t\tthrow new Error(\"Called start() outside of a test context when \" + \"QUnit.config.autostart was true\");\n  \t\t\t} else if (!config.pageLoaded) {\n\n  \t\t\t\t// The page isn't completely loaded yet, so we set autostart and then\n  \t\t\t\t// load if we're in Node or wait for the browser's load event.\n  \t\t\t\tconfig.autostart = true;\n\n  \t\t\t\t// Starts from Node even if .load was not previously called. We still return\n  \t\t\t\t// early otherwise we'll wind up \"beginning\" twice.\n  \t\t\t\tif (!defined.document) {\n  \t\t\t\t\tQUnit.load();\n  \t\t\t\t}\n\n  \t\t\t\treturn;\n  \t\t\t}\n  \t\t} else {\n  \t\t\tthrow new Error(\"QUnit.start cannot be called inside a test context.\");\n  \t\t}\n\n  \t\tscheduleBegin();\n  \t},\n\n  \tconfig: config,\n\n  \tis: is,\n\n  \tobjectType: objectType,\n\n  \textend: extend,\n\n  \tload: function load() {\n  \t\tconfig.pageLoaded = true;\n\n  \t\t// Initialize the configuration options\n  \t\textend(config, {\n  \t\t\tstats: { all: 0, bad: 0 },\n  \t\t\tstarted: 0,\n  \t\t\tupdateRate: 1000,\n  \t\t\tautostart: true,\n  \t\t\tfilter: \"\"\n  \t\t}, true);\n\n  \t\tif (!runStarted) {\n  \t\t\tconfig.blocking = false;\n\n  \t\t\tif (config.autostart) {\n  \t\t\t\tscheduleBegin();\n  \t\t\t}\n  \t\t}\n  \t},\n\n  \tstack: function stack(offset) {\n  \t\toffset = (offset || 0) + 2;\n  \t\treturn sourceFromStacktrace(offset);\n  \t},\n\n  \tonError: onError,\n\n  \tonUnhandledRejection: onUnhandledRejection\n  });\n\n  QUnit.pushFailure = pushFailure;\n  QUnit.assert = Assert.prototype;\n  QUnit.equiv = equiv;\n  QUnit.dump = dump;\n\n  registerLoggingCallbacks(QUnit);\n\n  function scheduleBegin() {\n\n  \trunStarted = true;\n\n  \t// Add a slight delay to allow definition of more modules and tests.\n  \tif (defined.setTimeout) {\n  \t\tsetTimeout$1(function () {\n  \t\t\tbegin();\n  \t\t});\n  \t} else {\n  \t\tbegin();\n  \t}\n  }\n\n  function unblockAndAdvanceQueue() {\n  \tconfig.blocking = false;\n  \tProcessingQueue.advance();\n  }\n\n  function begin() {\n  \tvar i,\n  \t    l,\n  \t    modulesLog = [];\n\n  \t// If the test run hasn't officially begun yet\n  \tif (!config.started) {\n\n  \t\t// Record the time of the test run's beginning\n  \t\tconfig.started = now();\n\n  \t\t// Delete the loose unnamed module if unused.\n  \t\tif (config.modules[0].name === \"\" && config.modules[0].tests.length === 0) {\n  \t\t\tconfig.modules.shift();\n  \t\t}\n\n  \t\t// Avoid unnecessary information by not logging modules' test environments\n  \t\tfor (i = 0, l = config.modules.length; i < l; i++) {\n  \t\t\tmodulesLog.push({\n  \t\t\t\tname: config.modules[i].name,\n  \t\t\t\ttests: config.modules[i].tests\n  \t\t\t});\n  \t\t}\n\n  \t\t// The test run is officially beginning now\n  \t\temit(\"runStart\", globalSuite.start(true));\n  \t\trunLoggingCallbacks(\"begin\", {\n  \t\t\ttotalTests: Test.count,\n  \t\t\tmodules: modulesLog\n  \t\t}).then(unblockAndAdvanceQueue);\n  \t} else {\n  \t\tunblockAndAdvanceQueue();\n  \t}\n  }\n\n  exportQUnit(QUnit);\n\n  (function () {\n\n  \tif (typeof window$1 === \"undefined\" || typeof document$1 === \"undefined\") {\n  \t\treturn;\n  \t}\n\n  \tvar config = QUnit.config,\n  \t    hasOwn = Object.prototype.hasOwnProperty;\n\n  \t// Stores fixture HTML for resetting later\n  \tfunction storeFixture() {\n\n  \t\t// Avoid overwriting user-defined values\n  \t\tif (hasOwn.call(config, \"fixture\")) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tvar fixture = document$1.getElementById(\"qunit-fixture\");\n  \t\tif (fixture) {\n  \t\t\tconfig.fixture = fixture.cloneNode(true);\n  \t\t}\n  \t}\n\n  \tQUnit.begin(storeFixture);\n\n  \t// Resets the fixture DOM element if available.\n  \tfunction resetFixture() {\n  \t\tif (config.fixture == null) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tvar fixture = document$1.getElementById(\"qunit-fixture\");\n  \t\tvar resetFixtureType = _typeof(config.fixture);\n  \t\tif (resetFixtureType === \"string\") {\n\n  \t\t\t// support user defined values for `config.fixture`\n  \t\t\tvar newFixture = document$1.createElement(\"div\");\n  \t\t\tnewFixture.setAttribute(\"id\", \"qunit-fixture\");\n  \t\t\tnewFixture.innerHTML = config.fixture;\n  \t\t\tfixture.parentNode.replaceChild(newFixture, fixture);\n  \t\t} else {\n  \t\t\tvar clonedFixture = config.fixture.cloneNode(true);\n  \t\t\tfixture.parentNode.replaceChild(clonedFixture, fixture);\n  \t\t}\n  \t}\n\n  \tQUnit.testStart(resetFixture);\n  })();\n\n  (function () {\n\n  \t// Only interact with URLs via window.location\n  \tvar location = typeof window$1 !== \"undefined\" && window$1.location;\n  \tif (!location) {\n  \t\treturn;\n  \t}\n\n  \tvar urlParams = getUrlParams();\n\n  \tQUnit.urlParams = urlParams;\n\n  \t// Match module/test by inclusion in an array\n  \tQUnit.config.moduleId = [].concat(urlParams.moduleId || []);\n  \tQUnit.config.testId = [].concat(urlParams.testId || []);\n\n  \t// Exact case-insensitive match of the module name\n  \tQUnit.config.module = urlParams.module;\n\n  \t// Regular expression or case-insenstive substring match against \"moduleName: testName\"\n  \tQUnit.config.filter = urlParams.filter;\n\n  \t// Test order randomization\n  \tif (urlParams.seed === true) {\n\n  \t\t// Generate a random seed if the option is specified without a value\n  \t\tQUnit.config.seed = Math.random().toString(36).slice(2);\n  \t} else if (urlParams.seed) {\n  \t\tQUnit.config.seed = urlParams.seed;\n  \t}\n\n  \t// Add URL-parameter-mapped config values with UI form rendering data\n  \tQUnit.config.urlConfig.push({\n  \t\tid: \"hidepassed\",\n  \t\tlabel: \"Hide passed tests\",\n  \t\ttooltip: \"Only show tests and assertions that fail. Stored as query-strings.\"\n  \t}, {\n  \t\tid: \"noglobals\",\n  \t\tlabel: \"Check for Globals\",\n  \t\ttooltip: \"Enabling this will test if any test introduces new properties on the \" + \"global object (`window` in Browsers). Stored as query-strings.\"\n  \t}, {\n  \t\tid: \"notrycatch\",\n  \t\tlabel: \"No try-catch\",\n  \t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging \" + \"exceptions in IE reasonable. Stored as query-strings.\"\n  \t});\n\n  \tQUnit.begin(function () {\n  \t\tvar i,\n  \t\t    option,\n  \t\t    urlConfig = QUnit.config.urlConfig;\n\n  \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n  \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n  \t\t\toption = QUnit.config.urlConfig[i];\n  \t\t\tif (typeof option !== \"string\") {\n  \t\t\t\toption = option.id;\n  \t\t\t}\n\n  \t\t\tif (QUnit.config[option] === undefined) {\n  \t\t\t\tQUnit.config[option] = urlParams[option];\n  \t\t\t}\n  \t\t}\n  \t});\n\n  \tfunction getUrlParams() {\n  \t\tvar i, param, name, value;\n  \t\tvar urlParams = Object.create(null);\n  \t\tvar params = location.search.slice(1).split(\"&\");\n  \t\tvar length = params.length;\n\n  \t\tfor (i = 0; i < length; i++) {\n  \t\t\tif (params[i]) {\n  \t\t\t\tparam = params[i].split(\"=\");\n  \t\t\t\tname = decodeQueryParam(param[0]);\n\n  \t\t\t\t// Allow just a key to turn on a flag, e.g., test.html?noglobals\n  \t\t\t\tvalue = param.length === 1 || decodeQueryParam(param.slice(1).join(\"=\"));\n  \t\t\t\tif (name in urlParams) {\n  \t\t\t\t\turlParams[name] = [].concat(urlParams[name], value);\n  \t\t\t\t} else {\n  \t\t\t\t\turlParams[name] = value;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\treturn urlParams;\n  \t}\n\n  \tfunction decodeQueryParam(param) {\n  \t\treturn decodeURIComponent(param.replace(/\\+/g, \"%20\"));\n  \t}\n  })();\n\n  var stats = {\n  \tpassedTests: 0,\n  \tfailedTests: 0,\n  \tskippedTests: 0,\n  \ttodoTests: 0\n  };\n\n  // Escape text for attribute or text content.\n  function escapeText(s) {\n  \tif (!s) {\n  \t\treturn \"\";\n  \t}\n  \ts = s + \"\";\n\n  \t// Both single quotes and double quotes (for attributes)\n  \treturn s.replace(/['\"<>&]/g, function (s) {\n  \t\tswitch (s) {\n  \t\t\tcase \"'\":\n  \t\t\t\treturn \"&#039;\";\n  \t\t\tcase \"\\\"\":\n  \t\t\t\treturn \"&quot;\";\n  \t\t\tcase \"<\":\n  \t\t\t\treturn \"&lt;\";\n  \t\t\tcase \">\":\n  \t\t\t\treturn \"&gt;\";\n  \t\t\tcase \"&\":\n  \t\t\t\treturn \"&amp;\";\n  \t\t}\n  \t});\n  }\n\n  (function () {\n\n  \t// Don't load the HTML Reporter on non-browser environments\n  \tif (typeof window$1 === \"undefined\" || !window$1.document) {\n  \t\treturn;\n  \t}\n\n  \tvar config = QUnit.config,\n  \t    hiddenTests = [],\n  \t    document = window$1.document,\n  \t    collapseNext = false,\n  \t    hasOwn = Object.prototype.hasOwnProperty,\n  \t    unfilteredUrl = setUrl({ filter: undefined, module: undefined,\n  \t\tmoduleId: undefined, testId: undefined }),\n  \t    modulesList = [];\n\n  \tfunction addEvent(elem, type, fn) {\n  \t\telem.addEventListener(type, fn, false);\n  \t}\n\n  \tfunction removeEvent(elem, type, fn) {\n  \t\telem.removeEventListener(type, fn, false);\n  \t}\n\n  \tfunction addEvents(elems, type, fn) {\n  \t\tvar i = elems.length;\n  \t\twhile (i--) {\n  \t\t\taddEvent(elems[i], type, fn);\n  \t\t}\n  \t}\n\n  \tfunction hasClass(elem, name) {\n  \t\treturn (\" \" + elem.className + \" \").indexOf(\" \" + name + \" \") >= 0;\n  \t}\n\n  \tfunction addClass(elem, name) {\n  \t\tif (!hasClass(elem, name)) {\n  \t\t\telem.className += (elem.className ? \" \" : \"\") + name;\n  \t\t}\n  \t}\n\n  \tfunction toggleClass(elem, name, force) {\n  \t\tif (force || typeof force === \"undefined\" && !hasClass(elem, name)) {\n  \t\t\taddClass(elem, name);\n  \t\t} else {\n  \t\t\tremoveClass(elem, name);\n  \t\t}\n  \t}\n\n  \tfunction removeClass(elem, name) {\n  \t\tvar set = \" \" + elem.className + \" \";\n\n  \t\t// Class name may appear multiple times\n  \t\twhile (set.indexOf(\" \" + name + \" \") >= 0) {\n  \t\t\tset = set.replace(\" \" + name + \" \", \" \");\n  \t\t}\n\n  \t\t// Trim for prettiness\n  \t\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace(/^\\s+|\\s+$/g, \"\");\n  \t}\n\n  \tfunction id(name) {\n  \t\treturn document.getElementById && document.getElementById(name);\n  \t}\n\n  \tfunction abortTests() {\n  \t\tvar abortButton = id(\"qunit-abort-tests-button\");\n  \t\tif (abortButton) {\n  \t\t\tabortButton.disabled = true;\n  \t\t\tabortButton.innerHTML = \"Aborting...\";\n  \t\t}\n  \t\tQUnit.config.queue.length = 0;\n  \t\treturn false;\n  \t}\n\n  \tfunction interceptNavigation(ev) {\n  \t\tapplyUrlParams();\n\n  \t\tif (ev && ev.preventDefault) {\n  \t\t\tev.preventDefault();\n  \t\t}\n\n  \t\treturn false;\n  \t}\n\n  \tfunction getUrlConfigHtml() {\n  \t\tvar i,\n  \t\t    j,\n  \t\t    val,\n  \t\t    escaped,\n  \t\t    escapedTooltip,\n  \t\t    selection = false,\n  \t\t    urlConfig = config.urlConfig,\n  \t\t    urlConfigHtml = \"\";\n\n  \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n  \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n  \t\t\tval = config.urlConfig[i];\n  \t\t\tif (typeof val === \"string\") {\n  \t\t\t\tval = {\n  \t\t\t\t\tid: val,\n  \t\t\t\t\tlabel: val\n  \t\t\t\t};\n  \t\t\t}\n\n  \t\t\tescaped = escapeText(val.id);\n  \t\t\tescapedTooltip = escapeText(val.tooltip);\n\n  \t\t\tif (!val.value || typeof val.value === \"string\") {\n  \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'><input id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' type='checkbox'\" + (val.value ? \" value='\" + escapeText(val.value) + \"'\" : \"\") + (config[val.id] ? \" checked='checked'\" : \"\") + \" title='\" + escapedTooltip + \"' />\" + escapeText(val.label) + \"</label>\";\n  \t\t\t} else {\n  \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'>\" + val.label + \": </label><select id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' title='\" + escapedTooltip + \"'><option></option>\";\n\n  \t\t\t\tif (QUnit.is(\"array\", val.value)) {\n  \t\t\t\t\tfor (j = 0; j < val.value.length; j++) {\n  \t\t\t\t\t\tescaped = escapeText(val.value[j]);\n  \t\t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"'\" + (config[val.id] === val.value[j] ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escaped + \"</option>\";\n  \t\t\t\t\t}\n  \t\t\t\t} else {\n  \t\t\t\t\tfor (j in val.value) {\n  \t\t\t\t\t\tif (hasOwn.call(val.value, j)) {\n  \t\t\t\t\t\t\turlConfigHtml += \"<option value='\" + escapeText(j) + \"'\" + (config[val.id] === j ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escapeText(val.value[j]) + \"</option>\";\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tif (config[val.id] && !selection) {\n  \t\t\t\t\tescaped = escapeText(config[val.id]);\n  \t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"' selected='selected' disabled='disabled'>\" + escaped + \"</option>\";\n  \t\t\t\t}\n  \t\t\t\turlConfigHtml += \"</select>\";\n  \t\t\t}\n  \t\t}\n\n  \t\treturn urlConfigHtml;\n  \t}\n\n  \t// Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n  \t// Updates the URL with the new state of `config.urlConfig` values.\n  \tfunction toolbarChanged() {\n  \t\tvar updatedUrl,\n  \t\t    value,\n  \t\t    tests,\n  \t\t    field = this,\n  \t\t    params = {};\n\n  \t\t// Detect if field is a select menu or a checkbox\n  \t\tif (\"selectedIndex\" in field) {\n  \t\t\tvalue = field.options[field.selectedIndex].value || undefined;\n  \t\t} else {\n  \t\t\tvalue = field.checked ? field.defaultValue || true : undefined;\n  \t\t}\n\n  \t\tparams[field.name] = value;\n  \t\tupdatedUrl = setUrl(params);\n\n  \t\t// Check if we can apply the change without a page refresh\n  \t\tif (\"hidepassed\" === field.name && \"replaceState\" in window$1.history) {\n  \t\t\tQUnit.urlParams[field.name] = value;\n  \t\t\tconfig[field.name] = value || false;\n  \t\t\ttests = id(\"qunit-tests\");\n  \t\t\tif (tests) {\n  \t\t\t\tvar length = tests.children.length;\n  \t\t\t\tvar children = tests.children;\n\n  \t\t\t\tif (field.checked) {\n  \t\t\t\t\tfor (var i = 0; i < length; i++) {\n  \t\t\t\t\t\tvar test = children[i];\n\n  \t\t\t\t\t\tif (test && test.className.indexOf(\"pass\") > -1) {\n  \t\t\t\t\t\t\thiddenTests.push(test);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n\n  \t\t\t\t\tvar _iteratorNormalCompletion = true;\n  \t\t\t\t\tvar _didIteratorError = false;\n  \t\t\t\t\tvar _iteratorError = undefined;\n\n  \t\t\t\t\ttry {\n  \t\t\t\t\t\tfor (var _iterator = hiddenTests[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n  \t\t\t\t\t\t\tvar hiddenTest = _step.value;\n\n  \t\t\t\t\t\t\ttests.removeChild(hiddenTest);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t} catch (err) {\n  \t\t\t\t\t\t_didIteratorError = true;\n  \t\t\t\t\t\t_iteratorError = err;\n  \t\t\t\t\t} finally {\n  \t\t\t\t\t\ttry {\n  \t\t\t\t\t\t\tif (!_iteratorNormalCompletion && _iterator.return) {\n  \t\t\t\t\t\t\t\t_iterator.return();\n  \t\t\t\t\t\t\t}\n  \t\t\t\t\t\t} finally {\n  \t\t\t\t\t\t\tif (_didIteratorError) {\n  \t\t\t\t\t\t\t\tthrow _iteratorError;\n  \t\t\t\t\t\t\t}\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t} else {\n  \t\t\t\t\twhile ((test = hiddenTests.pop()) != null) {\n  \t\t\t\t\t\ttests.appendChild(test);\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\twindow$1.history.replaceState(null, \"\", updatedUrl);\n  \t\t} else {\n  \t\t\twindow$1.location = updatedUrl;\n  \t\t}\n  \t}\n\n  \tfunction setUrl(params) {\n  \t\tvar key,\n  \t\t    arrValue,\n  \t\t    i,\n  \t\t    querystring = \"?\",\n  \t\t    location = window$1.location;\n\n  \t\tparams = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params);\n\n  \t\tfor (key in params) {\n\n  \t\t\t// Skip inherited or undefined properties\n  \t\t\tif (hasOwn.call(params, key) && params[key] !== undefined) {\n\n  \t\t\t\t// Output a parameter for each value of this key\n  \t\t\t\t// (but usually just one)\n  \t\t\t\tarrValue = [].concat(params[key]);\n  \t\t\t\tfor (i = 0; i < arrValue.length; i++) {\n  \t\t\t\t\tquerystring += encodeURIComponent(key);\n  \t\t\t\t\tif (arrValue[i] !== true) {\n  \t\t\t\t\t\tquerystring += \"=\" + encodeURIComponent(arrValue[i]);\n  \t\t\t\t\t}\n  \t\t\t\t\tquerystring += \"&\";\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n  \t\treturn location.protocol + \"//\" + location.host + location.pathname + querystring.slice(0, -1);\n  \t}\n\n  \tfunction applyUrlParams() {\n  \t\tvar i,\n  \t\t    selectedModules = [],\n  \t\t    modulesList = id(\"qunit-modulefilter-dropdown-list\").getElementsByTagName(\"input\"),\n  \t\t    filter = id(\"qunit-filter-input\").value;\n\n  \t\tfor (i = 0; i < modulesList.length; i++) {\n  \t\t\tif (modulesList[i].checked) {\n  \t\t\t\tselectedModules.push(modulesList[i].value);\n  \t\t\t}\n  \t\t}\n\n  \t\twindow$1.location = setUrl({\n  \t\t\tfilter: filter === \"\" ? undefined : filter,\n  \t\t\tmoduleId: selectedModules.length === 0 ? undefined : selectedModules,\n\n  \t\t\t// Remove module and testId filter\n  \t\t\tmodule: undefined,\n  \t\t\ttestId: undefined\n  \t\t});\n  \t}\n\n  \tfunction toolbarUrlConfigContainer() {\n  \t\tvar urlConfigContainer = document.createElement(\"span\");\n\n  \t\turlConfigContainer.innerHTML = getUrlConfigHtml();\n  \t\taddClass(urlConfigContainer, \"qunit-url-config\");\n\n  \t\taddEvents(urlConfigContainer.getElementsByTagName(\"input\"), \"change\", toolbarChanged);\n  \t\taddEvents(urlConfigContainer.getElementsByTagName(\"select\"), \"change\", toolbarChanged);\n\n  \t\treturn urlConfigContainer;\n  \t}\n\n  \tfunction abortTestsButton() {\n  \t\tvar button = document.createElement(\"button\");\n  \t\tbutton.id = \"qunit-abort-tests-button\";\n  \t\tbutton.innerHTML = \"Abort\";\n  \t\taddEvent(button, \"click\", abortTests);\n  \t\treturn button;\n  \t}\n\n  \tfunction toolbarLooseFilter() {\n  \t\tvar filter = document.createElement(\"form\"),\n  \t\t    label = document.createElement(\"label\"),\n  \t\t    input = document.createElement(\"input\"),\n  \t\t    button = document.createElement(\"button\");\n\n  \t\taddClass(filter, \"qunit-filter\");\n\n  \t\tlabel.innerHTML = \"Filter: \";\n\n  \t\tinput.type = \"text\";\n  \t\tinput.value = config.filter || \"\";\n  \t\tinput.name = \"filter\";\n  \t\tinput.id = \"qunit-filter-input\";\n\n  \t\tbutton.innerHTML = \"Go\";\n\n  \t\tlabel.appendChild(input);\n\n  \t\tfilter.appendChild(label);\n  \t\tfilter.appendChild(document.createTextNode(\" \"));\n  \t\tfilter.appendChild(button);\n  \t\taddEvent(filter, \"submit\", interceptNavigation);\n\n  \t\treturn filter;\n  \t}\n\n  \tfunction moduleListHtml() {\n  \t\tvar i,\n  \t\t    checked,\n  \t\t    html = \"\";\n\n  \t\tfor (i = 0; i < config.modules.length; i++) {\n  \t\t\tif (config.modules[i].name !== \"\") {\n  \t\t\t\tchecked = config.moduleId.indexOf(config.modules[i].moduleId) > -1;\n  \t\t\t\thtml += \"<li><label class='clickable\" + (checked ? \" checked\" : \"\") + \"'><input type='checkbox' \" + \"value='\" + config.modules[i].moduleId + \"'\" + (checked ? \" checked='checked'\" : \"\") + \" />\" + escapeText(config.modules[i].name) + \"</label></li>\";\n  \t\t\t}\n  \t\t}\n\n  \t\treturn html;\n  \t}\n\n  \tfunction toolbarModuleFilter() {\n  \t\tvar allCheckbox,\n  \t\t    commit,\n  \t\t    reset,\n  \t\t    moduleFilter = document.createElement(\"form\"),\n  \t\t    label = document.createElement(\"label\"),\n  \t\t    moduleSearch = document.createElement(\"input\"),\n  \t\t    dropDown = document.createElement(\"div\"),\n  \t\t    actions = document.createElement(\"span\"),\n  \t\t    dropDownList = document.createElement(\"ul\"),\n  \t\t    dirty = false;\n\n  \t\tmoduleSearch.id = \"qunit-modulefilter-search\";\n  \t\tmoduleSearch.autocomplete = \"off\";\n  \t\taddEvent(moduleSearch, \"input\", searchInput);\n  \t\taddEvent(moduleSearch, \"input\", searchFocus);\n  \t\taddEvent(moduleSearch, \"focus\", searchFocus);\n  \t\taddEvent(moduleSearch, \"click\", searchFocus);\n\n  \t\tlabel.id = \"qunit-modulefilter-search-container\";\n  \t\tlabel.innerHTML = \"Module: \";\n  \t\tlabel.appendChild(moduleSearch);\n\n  \t\tactions.id = \"qunit-modulefilter-actions\";\n  \t\tactions.innerHTML = \"<button style='display:none'>Apply</button>\" + \"<button type='reset' style='display:none'>Reset</button>\" + \"<label class='clickable\" + (config.moduleId.length ? \"\" : \" checked\") + \"'><input type='checkbox'\" + (config.moduleId.length ? \"\" : \" checked='checked'\") + \" />All modules</label>\";\n  \t\tallCheckbox = actions.lastChild.firstChild;\n  \t\tcommit = actions.firstChild;\n  \t\treset = commit.nextSibling;\n  \t\taddEvent(commit, \"click\", applyUrlParams);\n\n  \t\tdropDownList.id = \"qunit-modulefilter-dropdown-list\";\n  \t\tdropDownList.innerHTML = moduleListHtml();\n\n  \t\tdropDown.id = \"qunit-modulefilter-dropdown\";\n  \t\tdropDown.style.display = \"none\";\n  \t\tdropDown.appendChild(actions);\n  \t\tdropDown.appendChild(dropDownList);\n  \t\taddEvent(dropDown, \"change\", selectionChange);\n  \t\tselectionChange();\n\n  \t\tmoduleFilter.id = \"qunit-modulefilter\";\n  \t\tmoduleFilter.appendChild(label);\n  \t\tmoduleFilter.appendChild(dropDown);\n  \t\taddEvent(moduleFilter, \"submit\", interceptNavigation);\n  \t\taddEvent(moduleFilter, \"reset\", function () {\n\n  \t\t\t// Let the reset happen, then update styles\n  \t\t\twindow$1.setTimeout(selectionChange);\n  \t\t});\n\n  \t\t// Enables show/hide for the dropdown\n  \t\tfunction searchFocus() {\n  \t\t\tif (dropDown.style.display !== \"none\") {\n  \t\t\t\treturn;\n  \t\t\t}\n\n  \t\t\tdropDown.style.display = \"block\";\n  \t\t\taddEvent(document, \"click\", hideHandler);\n  \t\t\taddEvent(document, \"keydown\", hideHandler);\n\n  \t\t\t// Hide on Escape keydown or outside-container click\n  \t\t\tfunction hideHandler(e) {\n  \t\t\t\tvar inContainer = moduleFilter.contains(e.target);\n\n  \t\t\t\tif (e.keyCode === 27 || !inContainer) {\n  \t\t\t\t\tif (e.keyCode === 27 && inContainer) {\n  \t\t\t\t\t\tmoduleSearch.focus();\n  \t\t\t\t\t}\n  \t\t\t\t\tdropDown.style.display = \"none\";\n  \t\t\t\t\tremoveEvent(document, \"click\", hideHandler);\n  \t\t\t\t\tremoveEvent(document, \"keydown\", hideHandler);\n  \t\t\t\t\tmoduleSearch.value = \"\";\n  \t\t\t\t\tsearchInput();\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\t// Processes module search box input\n  \t\tfunction searchInput() {\n  \t\t\tvar i,\n  \t\t\t    item,\n  \t\t\t    searchText = moduleSearch.value.toLowerCase(),\n  \t\t\t    listItems = dropDownList.children;\n\n  \t\t\tfor (i = 0; i < listItems.length; i++) {\n  \t\t\t\titem = listItems[i];\n  \t\t\t\tif (!searchText || item.textContent.toLowerCase().indexOf(searchText) > -1) {\n  \t\t\t\t\titem.style.display = \"\";\n  \t\t\t\t} else {\n  \t\t\t\t\titem.style.display = \"none\";\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\t// Processes selection changes\n  \t\tfunction selectionChange(evt) {\n  \t\t\tvar i,\n  \t\t\t    item,\n  \t\t\t    checkbox = evt && evt.target || allCheckbox,\n  \t\t\t    modulesList = dropDownList.getElementsByTagName(\"input\"),\n  \t\t\t    selectedNames = [];\n\n  \t\t\ttoggleClass(checkbox.parentNode, \"checked\", checkbox.checked);\n\n  \t\t\tdirty = false;\n  \t\t\tif (checkbox.checked && checkbox !== allCheckbox) {\n  \t\t\t\tallCheckbox.checked = false;\n  \t\t\t\tremoveClass(allCheckbox.parentNode, \"checked\");\n  \t\t\t}\n  \t\t\tfor (i = 0; i < modulesList.length; i++) {\n  \t\t\t\titem = modulesList[i];\n  \t\t\t\tif (!evt) {\n  \t\t\t\t\ttoggleClass(item.parentNode, \"checked\", item.checked);\n  \t\t\t\t} else if (checkbox === allCheckbox && checkbox.checked) {\n  \t\t\t\t\titem.checked = false;\n  \t\t\t\t\tremoveClass(item.parentNode, \"checked\");\n  \t\t\t\t}\n  \t\t\t\tdirty = dirty || item.checked !== item.defaultChecked;\n  \t\t\t\tif (item.checked) {\n  \t\t\t\t\tselectedNames.push(item.parentNode.textContent);\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tcommit.style.display = reset.style.display = dirty ? \"\" : \"none\";\n  \t\t\tmoduleSearch.placeholder = selectedNames.join(\", \") || allCheckbox.parentNode.textContent;\n  \t\t\tmoduleSearch.title = \"Type to filter list. Current selection:\\n\" + (selectedNames.join(\"\\n\") || allCheckbox.parentNode.textContent);\n  \t\t}\n\n  \t\treturn moduleFilter;\n  \t}\n\n  \tfunction appendToolbar() {\n  \t\tvar toolbar = id(\"qunit-testrunner-toolbar\");\n\n  \t\tif (toolbar) {\n  \t\t\ttoolbar.appendChild(toolbarUrlConfigContainer());\n  \t\t\ttoolbar.appendChild(toolbarModuleFilter());\n  \t\t\ttoolbar.appendChild(toolbarLooseFilter());\n  \t\t\ttoolbar.appendChild(document.createElement(\"div\")).className = \"clearfix\";\n  \t\t}\n  \t}\n\n  \tfunction appendHeader() {\n  \t\tvar header = id(\"qunit-header\");\n\n  \t\tif (header) {\n  \t\t\theader.innerHTML = \"<a href='\" + escapeText(unfilteredUrl) + \"'>\" + header.innerHTML + \"</a> \";\n  \t\t}\n  \t}\n\n  \tfunction appendBanner() {\n  \t\tvar banner = id(\"qunit-banner\");\n\n  \t\tif (banner) {\n  \t\t\tbanner.className = \"\";\n  \t\t}\n  \t}\n\n  \tfunction appendTestResults() {\n  \t\tvar tests = id(\"qunit-tests\"),\n  \t\t    result = id(\"qunit-testresult\"),\n  \t\t    controls;\n\n  \t\tif (result) {\n  \t\t\tresult.parentNode.removeChild(result);\n  \t\t}\n\n  \t\tif (tests) {\n  \t\t\ttests.innerHTML = \"\";\n  \t\t\tresult = document.createElement(\"p\");\n  \t\t\tresult.id = \"qunit-testresult\";\n  \t\t\tresult.className = \"result\";\n  \t\t\ttests.parentNode.insertBefore(result, tests);\n  \t\t\tresult.innerHTML = \"<div id=\\\"qunit-testresult-display\\\">Running...<br />&#160;</div>\" + \"<div id=\\\"qunit-testresult-controls\\\"></div>\" + \"<div class=\\\"clearfix\\\"></div>\";\n  \t\t\tcontrols = id(\"qunit-testresult-controls\");\n  \t\t}\n\n  \t\tif (controls) {\n  \t\t\tcontrols.appendChild(abortTestsButton());\n  \t\t}\n  \t}\n\n  \tfunction appendFilteredTest() {\n  \t\tvar testId = QUnit.config.testId;\n  \t\tif (!testId || testId.length <= 0) {\n  \t\t\treturn \"\";\n  \t\t}\n  \t\treturn \"<div id='qunit-filteredTest'>Rerunning selected tests: \" + escapeText(testId.join(\", \")) + \" <a id='qunit-clearFilter' href='\" + escapeText(unfilteredUrl) + \"'>Run all tests</a></div>\";\n  \t}\n\n  \tfunction appendUserAgent() {\n  \t\tvar userAgent = id(\"qunit-userAgent\");\n\n  \t\tif (userAgent) {\n  \t\t\tuserAgent.innerHTML = \"\";\n  \t\t\tuserAgent.appendChild(document.createTextNode(\"QUnit \" + QUnit.version + \"; \" + navigator.userAgent));\n  \t\t}\n  \t}\n\n  \tfunction appendInterface() {\n  \t\tvar qunit = id(\"qunit\");\n\n  \t\tif (qunit) {\n  \t\t\tqunit.innerHTML = \"<h1 id='qunit-header'>\" + escapeText(document.title) + \"</h1>\" + \"<h2 id='qunit-banner'></h2>\" + \"<div id='qunit-testrunner-toolbar'></div>\" + appendFilteredTest() + \"<h2 id='qunit-userAgent'></h2>\" + \"<ol id='qunit-tests'></ol>\";\n  \t\t}\n\n  \t\tappendHeader();\n  \t\tappendBanner();\n  \t\tappendTestResults();\n  \t\tappendUserAgent();\n  \t\tappendToolbar();\n  \t}\n\n  \tfunction appendTest(name, testId, moduleName) {\n  \t\tvar title,\n  \t\t    rerunTrigger,\n  \t\t    testBlock,\n  \t\t    assertList,\n  \t\t    tests = id(\"qunit-tests\");\n\n  \t\tif (!tests) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\ttitle = document.createElement(\"strong\");\n  \t\ttitle.innerHTML = getNameHtml(name, moduleName);\n\n  \t\trerunTrigger = document.createElement(\"a\");\n  \t\trerunTrigger.innerHTML = \"Rerun\";\n  \t\trerunTrigger.href = setUrl({ testId: testId });\n\n  \t\ttestBlock = document.createElement(\"li\");\n  \t\ttestBlock.appendChild(title);\n  \t\ttestBlock.appendChild(rerunTrigger);\n  \t\ttestBlock.id = \"qunit-test-output-\" + testId;\n\n  \t\tassertList = document.createElement(\"ol\");\n  \t\tassertList.className = \"qunit-assert-list\";\n\n  \t\ttestBlock.appendChild(assertList);\n\n  \t\ttests.appendChild(testBlock);\n  \t}\n\n  \t// HTML Reporter initialization and load\n  \tQUnit.begin(function (details) {\n  \t\tvar i, moduleObj;\n\n  \t\t// Sort modules by name for the picker\n  \t\tfor (i = 0; i < details.modules.length; i++) {\n  \t\t\tmoduleObj = details.modules[i];\n  \t\t\tif (moduleObj.name) {\n  \t\t\t\tmodulesList.push(moduleObj.name);\n  \t\t\t}\n  \t\t}\n  \t\tmodulesList.sort(function (a, b) {\n  \t\t\treturn a.localeCompare(b);\n  \t\t});\n\n  \t\t// Initialize QUnit elements\n  \t\tappendInterface();\n  \t});\n\n  \tQUnit.done(function (details) {\n  \t\tvar banner = id(\"qunit-banner\"),\n  \t\t    tests = id(\"qunit-tests\"),\n  \t\t    abortButton = id(\"qunit-abort-tests-button\"),\n  \t\t    totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests,\n  \t\t    html = [totalTests, \" tests completed in \", details.runtime, \" milliseconds, with \", stats.failedTests, \" failed, \", stats.skippedTests, \" skipped, and \", stats.todoTests, \" todo.<br />\", \"<span class='passed'>\", details.passed, \"</span> assertions of <span class='total'>\", details.total, \"</span> passed, <span class='failed'>\", details.failed, \"</span> failed.\"].join(\"\"),\n  \t\t    test,\n  \t\t    assertLi,\n  \t\t    assertList;\n\n  \t\t// Update remaing tests to aborted\n  \t\tif (abortButton && abortButton.disabled) {\n  \t\t\thtml = \"Tests aborted after \" + details.runtime + \" milliseconds.\";\n\n  \t\t\tfor (var i = 0; i < tests.children.length; i++) {\n  \t\t\t\ttest = tests.children[i];\n  \t\t\t\tif (test.className === \"\" || test.className === \"running\") {\n  \t\t\t\t\ttest.className = \"aborted\";\n  \t\t\t\t\tassertList = test.getElementsByTagName(\"ol\")[0];\n  \t\t\t\t\tassertLi = document.createElement(\"li\");\n  \t\t\t\t\tassertLi.className = \"fail\";\n  \t\t\t\t\tassertLi.innerHTML = \"Test aborted.\";\n  \t\t\t\t\tassertList.appendChild(assertLi);\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\tif (banner && (!abortButton || abortButton.disabled === false)) {\n  \t\t\tbanner.className = stats.failedTests ? \"qunit-fail\" : \"qunit-pass\";\n  \t\t}\n\n  \t\tif (abortButton) {\n  \t\t\tabortButton.parentNode.removeChild(abortButton);\n  \t\t}\n\n  \t\tif (tests) {\n  \t\t\tid(\"qunit-testresult-display\").innerHTML = html;\n  \t\t}\n\n  \t\tif (config.altertitle && document.title) {\n\n  \t\t\t// Show ✖ for good, ✔ for bad suite result in title\n  \t\t\t// use escape sequences in case file gets loaded with non-utf-8\n  \t\t\t// charset\n  \t\t\tdocument.title = [stats.failedTests ? \"\\u2716\" : \"\\u2714\", document.title.replace(/^[\\u2714\\u2716] /i, \"\")].join(\" \");\n  \t\t}\n\n  \t\t// Scroll back to top to show results\n  \t\tif (config.scrolltop && window$1.scrollTo) {\n  \t\t\twindow$1.scrollTo(0, 0);\n  \t\t}\n  \t});\n\n  \tfunction getNameHtml(name, module) {\n  \t\tvar nameHtml = \"\";\n\n  \t\tif (module) {\n  \t\t\tnameHtml = \"<span class='module-name'>\" + escapeText(module) + \"</span>: \";\n  \t\t}\n\n  \t\tnameHtml += \"<span class='test-name'>\" + escapeText(name) + \"</span>\";\n\n  \t\treturn nameHtml;\n  \t}\n\n  \tQUnit.testStart(function (details) {\n  \t\tvar running, bad;\n\n  \t\tappendTest(details.name, details.testId, details.module);\n\n  \t\trunning = id(\"qunit-testresult-display\");\n\n  \t\tif (running) {\n  \t\t\taddClass(running, \"running\");\n\n  \t\t\tbad = QUnit.config.reorder && details.previousFailure;\n\n  \t\t\trunning.innerHTML = [bad ? \"Rerunning previously failed test: <br />\" : \"Running: <br />\", getNameHtml(details.name, details.module)].join(\"\");\n  \t\t}\n  \t});\n\n  \tfunction stripHtml(string) {\n\n  \t\t// Strip tags, html entity and whitespaces\n  \t\treturn string.replace(/<\\/?[^>]+(>|$)/g, \"\").replace(/&quot;/g, \"\").replace(/\\s+/g, \"\");\n  \t}\n\n  \tQUnit.log(function (details) {\n  \t\tvar assertList,\n  \t\t    assertLi,\n  \t\t    message,\n  \t\t    expected,\n  \t\t    actual,\n  \t\t    diff,\n  \t\t    showDiff = false,\n  \t\t    testItem = id(\"qunit-test-output-\" + details.testId);\n\n  \t\tif (!testItem) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tmessage = escapeText(details.message) || (details.result ? \"okay\" : \"failed\");\n  \t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n  \t\tmessage += \"<span class='runtime'>@ \" + details.runtime + \" ms</span>\";\n\n  \t\t// The pushFailure doesn't provide details.expected\n  \t\t// when it calls, it's implicit to also not show expected and diff stuff\n  \t\t// Also, we need to check details.expected existence, as it can exist and be undefined\n  \t\tif (!details.result && hasOwn.call(details, \"expected\")) {\n  \t\t\tif (details.negative) {\n  \t\t\t\texpected = \"NOT \" + QUnit.dump.parse(details.expected);\n  \t\t\t} else {\n  \t\t\t\texpected = QUnit.dump.parse(details.expected);\n  \t\t\t}\n\n  \t\t\tactual = QUnit.dump.parse(details.actual);\n  \t\t\tmessage += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + escapeText(expected) + \"</pre></td></tr>\";\n\n  \t\t\tif (actual !== expected) {\n\n  \t\t\t\tmessage += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeText(actual) + \"</pre></td></tr>\";\n\n  \t\t\t\tif (typeof details.actual === \"number\" && typeof details.expected === \"number\") {\n  \t\t\t\t\tif (!isNaN(details.actual) && !isNaN(details.expected)) {\n  \t\t\t\t\t\tshowDiff = true;\n  \t\t\t\t\t\tdiff = details.actual - details.expected;\n  \t\t\t\t\t\tdiff = (diff > 0 ? \"+\" : \"\") + diff;\n  \t\t\t\t\t}\n  \t\t\t\t} else if (typeof details.actual !== \"boolean\" && typeof details.expected !== \"boolean\") {\n  \t\t\t\t\tdiff = QUnit.diff(expected, actual);\n\n  \t\t\t\t\t// don't show diff if there is zero overlap\n  \t\t\t\t\tshowDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length;\n  \t\t\t\t}\n\n  \t\t\t\tif (showDiff) {\n  \t\t\t\t\tmessage += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + diff + \"</pre></td></tr>\";\n  \t\t\t\t}\n  \t\t\t} else if (expected.indexOf(\"[object Array]\") !== -1 || expected.indexOf(\"[object Object]\") !== -1) {\n  \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the depth of object is more than current max depth (\" + QUnit.config.maxDepth + \").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to \" + \" run with a higher max depth or <a href='\" + escapeText(setUrl({ maxDepth: -1 })) + \"'>\" + \"Rerun</a> without max depth.</p></td></tr>\";\n  \t\t\t} else {\n  \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the expected and actual results have an equivalent\" + \" serialization</td></tr>\";\n  \t\t\t}\n\n  \t\t\tif (details.source) {\n  \t\t\t\tmessage += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\";\n  \t\t\t}\n\n  \t\t\tmessage += \"</table>\";\n\n  \t\t\t// This occurs when pushFailure is set and we have an extracted stack trace\n  \t\t} else if (!details.result && details.source) {\n  \t\t\tmessage += \"<table>\" + \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\" + \"</table>\";\n  \t\t}\n\n  \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n  \t\tassertLi = document.createElement(\"li\");\n  \t\tassertLi.className = details.result ? \"pass\" : \"fail\";\n  \t\tassertLi.innerHTML = message;\n  \t\tassertList.appendChild(assertLi);\n  \t});\n\n  \tQUnit.testDone(function (details) {\n  \t\tvar testTitle,\n  \t\t    time,\n  \t\t    testItem,\n  \t\t    assertList,\n  \t\t    status,\n  \t\t    good,\n  \t\t    bad,\n  \t\t    testCounts,\n  \t\t    skipped,\n  \t\t    sourceName,\n  \t\t    tests = id(\"qunit-tests\");\n\n  \t\tif (!tests) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\ttestItem = id(\"qunit-test-output-\" + details.testId);\n\n  \t\tremoveClass(testItem, \"running\");\n\n  \t\tif (details.failed > 0) {\n  \t\t\tstatus = \"failed\";\n  \t\t} else if (details.todo) {\n  \t\t\tstatus = \"todo\";\n  \t\t} else {\n  \t\t\tstatus = details.skipped ? \"skipped\" : \"passed\";\n  \t\t}\n\n  \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n  \t\tgood = details.passed;\n  \t\tbad = details.failed;\n\n  \t\t// This test passed if it has no unexpected failed assertions\n  \t\tvar testPassed = details.failed > 0 ? details.todo : !details.todo;\n\n  \t\tif (testPassed) {\n\n  \t\t\t// Collapse the passing tests\n  \t\t\taddClass(assertList, \"qunit-collapsed\");\n  \t\t} else if (config.collapse) {\n  \t\t\tif (!collapseNext) {\n\n  \t\t\t\t// Skip collapsing the first failing test\n  \t\t\t\tcollapseNext = true;\n  \t\t\t} else {\n\n  \t\t\t\t// Collapse remaining tests\n  \t\t\t\taddClass(assertList, \"qunit-collapsed\");\n  \t\t\t}\n  \t\t}\n\n  \t\t// The testItem.firstChild is the test name\n  \t\ttestTitle = testItem.firstChild;\n\n  \t\ttestCounts = bad ? \"<b class='failed'>\" + bad + \"</b>, \" + \"<b class='passed'>\" + good + \"</b>, \" : \"\";\n\n  \t\ttestTitle.innerHTML += \" <b class='counts'>(\" + testCounts + details.assertions.length + \")</b>\";\n\n  \t\tif (details.skipped) {\n  \t\t\tstats.skippedTests++;\n\n  \t\t\ttestItem.className = \"skipped\";\n  \t\t\tskipped = document.createElement(\"em\");\n  \t\t\tskipped.className = \"qunit-skipped-label\";\n  \t\t\tskipped.innerHTML = \"skipped\";\n  \t\t\ttestItem.insertBefore(skipped, testTitle);\n  \t\t} else {\n  \t\t\taddEvent(testTitle, \"click\", function () {\n  \t\t\t\ttoggleClass(assertList, \"qunit-collapsed\");\n  \t\t\t});\n\n  \t\t\ttestItem.className = testPassed ? \"pass\" : \"fail\";\n\n  \t\t\tif (details.todo) {\n  \t\t\t\tvar todoLabel = document.createElement(\"em\");\n  \t\t\t\ttodoLabel.className = \"qunit-todo-label\";\n  \t\t\t\ttodoLabel.innerHTML = \"todo\";\n  \t\t\t\ttestItem.className += \" todo\";\n  \t\t\t\ttestItem.insertBefore(todoLabel, testTitle);\n  \t\t\t}\n\n  \t\t\ttime = document.createElement(\"span\");\n  \t\t\ttime.className = \"runtime\";\n  \t\t\ttime.innerHTML = details.runtime + \" ms\";\n  \t\t\ttestItem.insertBefore(time, assertList);\n\n  \t\t\tif (!testPassed) {\n  \t\t\t\tstats.failedTests++;\n  \t\t\t} else if (details.todo) {\n  \t\t\t\tstats.todoTests++;\n  \t\t\t} else {\n  \t\t\t\tstats.passedTests++;\n  \t\t\t}\n  \t\t}\n\n  \t\t// Show the source of the test when showing assertions\n  \t\tif (details.source) {\n  \t\t\tsourceName = document.createElement(\"p\");\n  \t\t\tsourceName.innerHTML = \"<strong>Source: </strong>\" + escapeText(details.source);\n  \t\t\taddClass(sourceName, \"qunit-source\");\n  \t\t\tif (testPassed) {\n  \t\t\t\taddClass(sourceName, \"qunit-collapsed\");\n  \t\t\t}\n  \t\t\taddEvent(testTitle, \"click\", function () {\n  \t\t\t\ttoggleClass(sourceName, \"qunit-collapsed\");\n  \t\t\t});\n  \t\t\ttestItem.appendChild(sourceName);\n  \t\t}\n\n  \t\tif (config.hidepassed && status === \"passed\") {\n\n  \t\t\t// use removeChild instead of remove because of support\n  \t\t\thiddenTests.push(testItem);\n\n  \t\t\ttests.removeChild(testItem);\n  \t\t}\n  \t});\n\n  \t// Avoid readyState issue with phantomjs\n  \t// Ref: #818\n  \tvar notPhantom = function (p) {\n  \t\treturn !(p && p.version && p.version.major > 0);\n  \t}(window$1.phantom);\n\n  \tif (notPhantom && document.readyState === \"complete\") {\n  \t\tQUnit.load();\n  \t} else {\n  \t\taddEvent(window$1, \"load\", QUnit.load);\n  \t}\n\n  \t// Wrap window.onerror. We will call the original window.onerror to see if\n  \t// the existing handler fully handles the error; if not, we will call the\n  \t// QUnit.onError function.\n  \tvar originalWindowOnError = window$1.onerror;\n\n  \t// Cover uncaught exceptions\n  \t// Returning true will suppress the default browser handler,\n  \t// returning false will let it run.\n  \twindow$1.onerror = function (message, fileName, lineNumber, columnNumber, errorObj) {\n  \t\tvar ret = false;\n  \t\tif (originalWindowOnError) {\n  \t\t\tfor (var _len = arguments.length, args = Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {\n  \t\t\t\targs[_key - 5] = arguments[_key];\n  \t\t\t}\n\n  \t\t\tret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber, columnNumber, errorObj].concat(args));\n  \t\t}\n\n  \t\t// Treat return value as window.onerror itself does,\n  \t\t// Only do our handling if not suppressed.\n  \t\tif (ret !== true) {\n  \t\t\tvar error = {\n  \t\t\t\tmessage: message,\n  \t\t\t\tfileName: fileName,\n  \t\t\t\tlineNumber: lineNumber\n  \t\t\t};\n\n  \t\t\t// According to\n  \t\t\t// https://blog.sentry.io/2016/01/04/client-javascript-reporting-window-onerror,\n  \t\t\t// most modern browsers support an errorObj argument; use that to\n  \t\t\t// get a full stack trace if it's available.\n  \t\t\tif (errorObj && errorObj.stack) {\n  \t\t\t\terror.stacktrace = extractStacktrace(errorObj, 0);\n  \t\t\t}\n\n  \t\t\tret = QUnit.onError(error);\n  \t\t}\n\n  \t\treturn ret;\n  \t};\n\n  \t// Listen for unhandled rejections, and call QUnit.onUnhandledRejection\n  \twindow$1.addEventListener(\"unhandledrejection\", function (event) {\n  \t\tQUnit.onUnhandledRejection(event.reason);\n  \t});\n  })();\n\n  /*\n   * This file is a modified version of google-diff-match-patch's JavaScript implementation\n   * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n   * modifications are licensed as more fully set forth in LICENSE.txt.\n   *\n   * The original source of google-diff-match-patch is attributable and licensed as follows:\n   *\n   * Copyright 2006 Google Inc.\n   * https://code.google.com/p/google-diff-match-patch/\n   *\n   * Licensed under the Apache License, Version 2.0 (the \"License\");\n   * you may not use this file except in compliance with the License.\n   * You may obtain a copy of the License at\n   *\n   * https://www.apache.org/licenses/LICENSE-2.0\n   *\n   * Unless required by applicable law or agreed to in writing, software\n   * distributed under the License is distributed on an \"AS IS\" BASIS,\n   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   * See the License for the specific language governing permissions and\n   * limitations under the License.\n   *\n   * More Info:\n   *  https://code.google.com/p/google-diff-match-patch/\n   *\n   * Usage: QUnit.diff(expected, actual)\n   *\n   */\n  QUnit.diff = function () {\n  \tfunction DiffMatchPatch() {}\n\n  \t//  DIFF FUNCTIONS\n\n  \t/**\n    * The data structure representing a diff is an array of tuples:\n    * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n    * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n    */\n  \tvar DIFF_DELETE = -1,\n  \t    DIFF_INSERT = 1,\n  \t    DIFF_EQUAL = 0;\n\n  \t/**\n    * Find the differences between two texts.  Simplifies the problem by stripping\n    * any common prefix or suffix off the texts before diffing.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n    *     then don't run a line-level diff first to identify the changed areas.\n    *     Defaults to true, which does a faster, slightly less optimal diff.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {\n  \t\tvar deadline, checklines, commonlength, commonprefix, commonsuffix, diffs;\n\n  \t\t// The diff must be complete in up to 1 second.\n  \t\tdeadline = new Date().getTime() + 1000;\n\n  \t\t// Check for null inputs.\n  \t\tif (text1 === null || text2 === null) {\n  \t\t\tthrow new Error(\"Null input. (DiffMain)\");\n  \t\t}\n\n  \t\t// Check for equality (speedup).\n  \t\tif (text1 === text2) {\n  \t\t\tif (text1) {\n  \t\t\t\treturn [[DIFF_EQUAL, text1]];\n  \t\t\t}\n  \t\t\treturn [];\n  \t\t}\n\n  \t\tif (typeof optChecklines === \"undefined\") {\n  \t\t\toptChecklines = true;\n  \t\t}\n\n  \t\tchecklines = optChecklines;\n\n  \t\t// Trim off common prefix (speedup).\n  \t\tcommonlength = this.diffCommonPrefix(text1, text2);\n  \t\tcommonprefix = text1.substring(0, commonlength);\n  \t\ttext1 = text1.substring(commonlength);\n  \t\ttext2 = text2.substring(commonlength);\n\n  \t\t// Trim off common suffix (speedup).\n  \t\tcommonlength = this.diffCommonSuffix(text1, text2);\n  \t\tcommonsuffix = text1.substring(text1.length - commonlength);\n  \t\ttext1 = text1.substring(0, text1.length - commonlength);\n  \t\ttext2 = text2.substring(0, text2.length - commonlength);\n\n  \t\t// Compute the diff on the middle block.\n  \t\tdiffs = this.diffCompute(text1, text2, checklines, deadline);\n\n  \t\t// Restore the prefix and suffix.\n  \t\tif (commonprefix) {\n  \t\t\tdiffs.unshift([DIFF_EQUAL, commonprefix]);\n  \t\t}\n  \t\tif (commonsuffix) {\n  \t\t\tdiffs.push([DIFF_EQUAL, commonsuffix]);\n  \t\t}\n  \t\tthis.diffCleanupMerge(diffs);\n  \t\treturn diffs;\n  \t};\n\n  \t/**\n    * Reduce the number of edits by eliminating operationally trivial equalities.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {\n  \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;\n  \t\tchanges = false;\n  \t\tequalities = []; // Stack of indices where equalities are found.\n  \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n  \t\t/** @type {?string} */\n  \t\tlastequality = null;\n\n  \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n  \t\tpointer = 0; // Index of current position.\n\n  \t\t// Is there an insertion operation before the last equality.\n  \t\tpreIns = false;\n\n  \t\t// Is there a deletion operation before the last equality.\n  \t\tpreDel = false;\n\n  \t\t// Is there an insertion operation after the last equality.\n  \t\tpostIns = false;\n\n  \t\t// Is there a deletion operation after the last equality.\n  \t\tpostDel = false;\n  \t\twhile (pointer < diffs.length) {\n\n  \t\t\t// Equality found.\n  \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n  \t\t\t\tif (diffs[pointer][1].length < 4 && (postIns || postDel)) {\n\n  \t\t\t\t\t// Candidate found.\n  \t\t\t\t\tequalities[equalitiesLength++] = pointer;\n  \t\t\t\t\tpreIns = postIns;\n  \t\t\t\t\tpreDel = postDel;\n  \t\t\t\t\tlastequality = diffs[pointer][1];\n  \t\t\t\t} else {\n\n  \t\t\t\t\t// Not a candidate, and can never become one.\n  \t\t\t\t\tequalitiesLength = 0;\n  \t\t\t\t\tlastequality = null;\n  \t\t\t\t}\n  \t\t\t\tpostIns = postDel = false;\n\n  \t\t\t\t// An insertion or deletion.\n  \t\t\t} else {\n\n  \t\t\t\tif (diffs[pointer][0] === DIFF_DELETE) {\n  \t\t\t\t\tpostDel = true;\n  \t\t\t\t} else {\n  \t\t\t\t\tpostIns = true;\n  \t\t\t\t}\n\n  \t\t\t\t/*\n       * Five types to be split:\n       * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n       * <ins>A</ins>X<ins>C</ins><del>D</del>\n       * <ins>A</ins><del>B</del>X<ins>C</ins>\n       * <ins>A</del>X<ins>C</ins><del>D</del>\n       * <ins>A</ins><del>B</del>X<del>C</del>\n       */\n  \t\t\t\tif (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {\n\n  \t\t\t\t\t// Duplicate record.\n  \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n  \t\t\t\t\t// Change second copy to insert.\n  \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n  \t\t\t\t\tequalitiesLength--; // Throw away the equality we just deleted;\n  \t\t\t\t\tlastequality = null;\n  \t\t\t\t\tif (preIns && preDel) {\n\n  \t\t\t\t\t\t// No changes made which could affect previous entry, keep going.\n  \t\t\t\t\t\tpostIns = postDel = true;\n  \t\t\t\t\t\tequalitiesLength = 0;\n  \t\t\t\t\t} else {\n  \t\t\t\t\t\tequalitiesLength--; // Throw away the previous equality.\n  \t\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n  \t\t\t\t\t\tpostIns = postDel = false;\n  \t\t\t\t\t}\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n\n  \t\tif (changes) {\n  \t\t\tthis.diffCleanupMerge(diffs);\n  \t\t}\n  \t};\n\n  \t/**\n    * Convert a diff array into a pretty HTML report.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    * @param {integer} string to be beautified.\n    * @return {string} HTML representation.\n    */\n  \tDiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {\n  \t\tvar op,\n  \t\t    data,\n  \t\t    x,\n  \t\t    html = [];\n  \t\tfor (x = 0; x < diffs.length; x++) {\n  \t\t\top = diffs[x][0]; // Operation (insert, delete, equal)\n  \t\t\tdata = diffs[x][1]; // Text of change.\n  \t\t\tswitch (op) {\n  \t\t\t\tcase DIFF_INSERT:\n  \t\t\t\t\thtml[x] = \"<ins>\" + escapeText(data) + \"</ins>\";\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_DELETE:\n  \t\t\t\t\thtml[x] = \"<del>\" + escapeText(data) + \"</del>\";\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_EQUAL:\n  \t\t\t\t\thtml[x] = \"<span>\" + escapeText(data) + \"</span>\";\n  \t\t\t\t\tbreak;\n  \t\t\t}\n  \t\t}\n  \t\treturn html.join(\"\");\n  \t};\n\n  \t/**\n    * Determine the common prefix of two strings.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {number} The number of characters common to the start of each\n    *     string.\n    */\n  \tDiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {\n  \t\tvar pointermid, pointermax, pointermin, pointerstart;\n\n  \t\t// Quick check for common null cases.\n  \t\tif (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n  \t\t\treturn 0;\n  \t\t}\n\n  \t\t// Binary search.\n  \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n  \t\tpointermin = 0;\n  \t\tpointermax = Math.min(text1.length, text2.length);\n  \t\tpointermid = pointermax;\n  \t\tpointerstart = 0;\n  \t\twhile (pointermin < pointermid) {\n  \t\t\tif (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {\n  \t\t\t\tpointermin = pointermid;\n  \t\t\t\tpointerstart = pointermin;\n  \t\t\t} else {\n  \t\t\t\tpointermax = pointermid;\n  \t\t\t}\n  \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  \t\t}\n  \t\treturn pointermid;\n  \t};\n\n  \t/**\n    * Determine the common suffix of two strings.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {number} The number of characters common to the end of each string.\n    */\n  \tDiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {\n  \t\tvar pointermid, pointermax, pointermin, pointerend;\n\n  \t\t// Quick check for common null cases.\n  \t\tif (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {\n  \t\t\treturn 0;\n  \t\t}\n\n  \t\t// Binary search.\n  \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n  \t\tpointermin = 0;\n  \t\tpointermax = Math.min(text1.length, text2.length);\n  \t\tpointermid = pointermax;\n  \t\tpointerend = 0;\n  \t\twhile (pointermin < pointermid) {\n  \t\t\tif (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n  \t\t\t\tpointermin = pointermid;\n  \t\t\t\tpointerend = pointermin;\n  \t\t\t} else {\n  \t\t\t\tpointermax = pointermid;\n  \t\t\t}\n  \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  \t\t}\n  \t\treturn pointermid;\n  \t};\n\n  \t/**\n    * Find the differences between two texts.  Assumes that the texts do not\n    * have any common prefix or suffix.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {boolean} checklines Speedup flag.  If false, then don't run a\n    *     line-level diff first to identify the changed areas.\n    *     If true, then run a faster, slightly less optimal diff.\n    * @param {number} deadline Time when the diff should be complete by.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {\n  \t\tvar diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;\n\n  \t\tif (!text1) {\n\n  \t\t\t// Just add some text (speedup).\n  \t\t\treturn [[DIFF_INSERT, text2]];\n  \t\t}\n\n  \t\tif (!text2) {\n\n  \t\t\t// Just delete some text (speedup).\n  \t\t\treturn [[DIFF_DELETE, text1]];\n  \t\t}\n\n  \t\tlongtext = text1.length > text2.length ? text1 : text2;\n  \t\tshorttext = text1.length > text2.length ? text2 : text1;\n  \t\ti = longtext.indexOf(shorttext);\n  \t\tif (i !== -1) {\n\n  \t\t\t// Shorter text is inside the longer text (speedup).\n  \t\t\tdiffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n\n  \t\t\t// Swap insertions for deletions if diff is reversed.\n  \t\t\tif (text1.length > text2.length) {\n  \t\t\t\tdiffs[0][0] = diffs[2][0] = DIFF_DELETE;\n  \t\t\t}\n  \t\t\treturn diffs;\n  \t\t}\n\n  \t\tif (shorttext.length === 1) {\n\n  \t\t\t// Single character string.\n  \t\t\t// After the previous speedup, the character can't be an equality.\n  \t\t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n  \t\t}\n\n  \t\t// Check to see if the problem can be split in two.\n  \t\thm = this.diffHalfMatch(text1, text2);\n  \t\tif (hm) {\n\n  \t\t\t// A half-match was found, sort out the return data.\n  \t\t\ttext1A = hm[0];\n  \t\t\ttext1B = hm[1];\n  \t\t\ttext2A = hm[2];\n  \t\t\ttext2B = hm[3];\n  \t\t\tmidCommon = hm[4];\n\n  \t\t\t// Send both pairs off for separate processing.\n  \t\t\tdiffsA = this.DiffMain(text1A, text2A, checklines, deadline);\n  \t\t\tdiffsB = this.DiffMain(text1B, text2B, checklines, deadline);\n\n  \t\t\t// Merge the results.\n  \t\t\treturn diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);\n  \t\t}\n\n  \t\tif (checklines && text1.length > 100 && text2.length > 100) {\n  \t\t\treturn this.diffLineMode(text1, text2, deadline);\n  \t\t}\n\n  \t\treturn this.diffBisect(text1, text2, deadline);\n  \t};\n\n  \t/**\n    * Do the two texts share a substring which is at least half the length of the\n    * longer text?\n    * This speedup can produce non-minimal diffs.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {Array.<string>} Five element Array, containing the prefix of\n    *     text1, the suffix of text1, the prefix of text2, the suffix of\n    *     text2 and the common middle.  Or null if there was no match.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {\n  \t\tvar longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;\n\n  \t\tlongtext = text1.length > text2.length ? text1 : text2;\n  \t\tshorttext = text1.length > text2.length ? text2 : text1;\n  \t\tif (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n  \t\t\treturn null; // Pointless.\n  \t\t}\n  \t\tdmp = this; // 'this' becomes 'window' in a closure.\n\n  \t\t/**\n     * Does a substring of shorttext exist within longtext such that the substring\n     * is at least half the length of longtext?\n     * Closure, but does not reference any external variables.\n     * @param {string} longtext Longer string.\n     * @param {string} shorttext Shorter string.\n     * @param {number} i Start index of quarter length substring within longtext.\n     * @return {Array.<string>} Five element Array, containing the prefix of\n     *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n     *     of shorttext and the common middle.  Or null if there was no match.\n     * @private\n     */\n  \t\tfunction diffHalfMatchI(longtext, shorttext, i) {\n  \t\t\tvar seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n  \t\t\t// Start with a 1/4 length substring at position i as a seed.\n  \t\t\tseed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n  \t\t\tj = -1;\n  \t\t\tbestCommon = \"\";\n  \t\t\twhile ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n  \t\t\t\tprefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));\n  \t\t\t\tsuffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));\n  \t\t\t\tif (bestCommon.length < suffixLength + prefixLength) {\n  \t\t\t\t\tbestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);\n  \t\t\t\t\tbestLongtextA = longtext.substring(0, i - suffixLength);\n  \t\t\t\t\tbestLongtextB = longtext.substring(i + prefixLength);\n  \t\t\t\t\tbestShorttextA = shorttext.substring(0, j - suffixLength);\n  \t\t\t\t\tbestShorttextB = shorttext.substring(j + prefixLength);\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tif (bestCommon.length * 2 >= longtext.length) {\n  \t\t\t\treturn [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];\n  \t\t\t} else {\n  \t\t\t\treturn null;\n  \t\t\t}\n  \t\t}\n\n  \t\t// First check if the second quarter is the seed for a half-match.\n  \t\thm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));\n\n  \t\t// Check again based on the third quarter.\n  \t\thm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));\n  \t\tif (!hm1 && !hm2) {\n  \t\t\treturn null;\n  \t\t} else if (!hm2) {\n  \t\t\thm = hm1;\n  \t\t} else if (!hm1) {\n  \t\t\thm = hm2;\n  \t\t} else {\n\n  \t\t\t// Both matched.  Select the longest.\n  \t\t\thm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n  \t\t}\n\n  \t\t// A half-match was found, sort out the return data.\n  \t\tif (text1.length > text2.length) {\n  \t\t\ttext1A = hm[0];\n  \t\t\ttext1B = hm[1];\n  \t\t\ttext2A = hm[2];\n  \t\t\ttext2B = hm[3];\n  \t\t} else {\n  \t\t\ttext2A = hm[0];\n  \t\t\ttext2B = hm[1];\n  \t\t\ttext1A = hm[2];\n  \t\t\ttext1B = hm[3];\n  \t\t}\n  \t\tmidCommon = hm[4];\n  \t\treturn [text1A, text1B, text2A, text2B, midCommon];\n  \t};\n\n  \t/**\n    * Do a quick line-level diff on both strings, then rediff the parts for\n    * greater accuracy.\n    * This speedup can produce non-minimal diffs.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {number} deadline Time when the diff should be complete by.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {\n  \t\tvar a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;\n\n  \t\t// Scan the text on a line-by-line basis first.\n  \t\ta = this.diffLinesToChars(text1, text2);\n  \t\ttext1 = a.chars1;\n  \t\ttext2 = a.chars2;\n  \t\tlinearray = a.lineArray;\n\n  \t\tdiffs = this.DiffMain(text1, text2, false, deadline);\n\n  \t\t// Convert the diff back to original text.\n  \t\tthis.diffCharsToLines(diffs, linearray);\n\n  \t\t// Eliminate freak matches (e.g. blank lines)\n  \t\tthis.diffCleanupSemantic(diffs);\n\n  \t\t// Rediff any replacement blocks, this time character-by-character.\n  \t\t// Add a dummy entry at the end.\n  \t\tdiffs.push([DIFF_EQUAL, \"\"]);\n  \t\tpointer = 0;\n  \t\tcountDelete = 0;\n  \t\tcountInsert = 0;\n  \t\ttextDelete = \"\";\n  \t\ttextInsert = \"\";\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tswitch (diffs[pointer][0]) {\n  \t\t\t\tcase DIFF_INSERT:\n  \t\t\t\t\tcountInsert++;\n  \t\t\t\t\ttextInsert += diffs[pointer][1];\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_DELETE:\n  \t\t\t\t\tcountDelete++;\n  \t\t\t\t\ttextDelete += diffs[pointer][1];\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_EQUAL:\n\n  \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n  \t\t\t\t\tif (countDelete >= 1 && countInsert >= 1) {\n\n  \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n  \t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);\n  \t\t\t\t\t\tpointer = pointer - countDelete - countInsert;\n  \t\t\t\t\t\ta = this.DiffMain(textDelete, textInsert, false, deadline);\n  \t\t\t\t\t\tfor (j = a.length - 1; j >= 0; j--) {\n  \t\t\t\t\t\t\tdiffs.splice(pointer, 0, a[j]);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t\tpointer = pointer + a.length;\n  \t\t\t\t\t}\n  \t\t\t\t\tcountInsert = 0;\n  \t\t\t\t\tcountDelete = 0;\n  \t\t\t\t\ttextDelete = \"\";\n  \t\t\t\t\ttextInsert = \"\";\n  \t\t\t\t\tbreak;\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n  \t\tdiffs.pop(); // Remove the dummy entry at the end.\n\n  \t\treturn diffs;\n  \t};\n\n  \t/**\n    * Find the 'middle snake' of a diff, split the problem in two\n    * and return the recursively constructed diff.\n    * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {number} deadline Time at which to bail if not yet complete.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {\n  \t\tvar text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n  \t\t// Cache the text lengths to prevent multiple calls.\n  \t\ttext1Length = text1.length;\n  \t\ttext2Length = text2.length;\n  \t\tmaxD = Math.ceil((text1Length + text2Length) / 2);\n  \t\tvOffset = maxD;\n  \t\tvLength = 2 * maxD;\n  \t\tv1 = new Array(vLength);\n  \t\tv2 = new Array(vLength);\n\n  \t\t// Setting all elements to -1 is faster in Chrome & Firefox than mixing\n  \t\t// integers and undefined.\n  \t\tfor (x = 0; x < vLength; x++) {\n  \t\t\tv1[x] = -1;\n  \t\t\tv2[x] = -1;\n  \t\t}\n  \t\tv1[vOffset + 1] = 0;\n  \t\tv2[vOffset + 1] = 0;\n  \t\tdelta = text1Length - text2Length;\n\n  \t\t// If the total number of characters is odd, then the front path will collide\n  \t\t// with the reverse path.\n  \t\tfront = delta % 2 !== 0;\n\n  \t\t// Offsets for start and end of k loop.\n  \t\t// Prevents mapping of space beyond the grid.\n  \t\tk1start = 0;\n  \t\tk1end = 0;\n  \t\tk2start = 0;\n  \t\tk2end = 0;\n  \t\tfor (d = 0; d < maxD; d++) {\n\n  \t\t\t// Bail out if deadline is reached.\n  \t\t\tif (new Date().getTime() > deadline) {\n  \t\t\t\tbreak;\n  \t\t\t}\n\n  \t\t\t// Walk the front path one step.\n  \t\t\tfor (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n  \t\t\t\tk1Offset = vOffset + k1;\n  \t\t\t\tif (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {\n  \t\t\t\t\tx1 = v1[k1Offset + 1];\n  \t\t\t\t} else {\n  \t\t\t\t\tx1 = v1[k1Offset - 1] + 1;\n  \t\t\t\t}\n  \t\t\t\ty1 = x1 - k1;\n  \t\t\t\twhile (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {\n  \t\t\t\t\tx1++;\n  \t\t\t\t\ty1++;\n  \t\t\t\t}\n  \t\t\t\tv1[k1Offset] = x1;\n  \t\t\t\tif (x1 > text1Length) {\n\n  \t\t\t\t\t// Ran off the right of the graph.\n  \t\t\t\t\tk1end += 2;\n  \t\t\t\t} else if (y1 > text2Length) {\n\n  \t\t\t\t\t// Ran off the bottom of the graph.\n  \t\t\t\t\tk1start += 2;\n  \t\t\t\t} else if (front) {\n  \t\t\t\t\tk2Offset = vOffset + delta - k1;\n  \t\t\t\t\tif (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {\n\n  \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n  \t\t\t\t\t\tx2 = text1Length - v2[k2Offset];\n  \t\t\t\t\t\tif (x1 >= x2) {\n\n  \t\t\t\t\t\t\t// Overlap detected.\n  \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\t// Walk the reverse path one step.\n  \t\t\tfor (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n  \t\t\t\tk2Offset = vOffset + k2;\n  \t\t\t\tif (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {\n  \t\t\t\t\tx2 = v2[k2Offset + 1];\n  \t\t\t\t} else {\n  \t\t\t\t\tx2 = v2[k2Offset - 1] + 1;\n  \t\t\t\t}\n  \t\t\t\ty2 = x2 - k2;\n  \t\t\t\twhile (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {\n  \t\t\t\t\tx2++;\n  \t\t\t\t\ty2++;\n  \t\t\t\t}\n  \t\t\t\tv2[k2Offset] = x2;\n  \t\t\t\tif (x2 > text1Length) {\n\n  \t\t\t\t\t// Ran off the left of the graph.\n  \t\t\t\t\tk2end += 2;\n  \t\t\t\t} else if (y2 > text2Length) {\n\n  \t\t\t\t\t// Ran off the top of the graph.\n  \t\t\t\t\tk2start += 2;\n  \t\t\t\t} else if (!front) {\n  \t\t\t\t\tk1Offset = vOffset + delta - k2;\n  \t\t\t\t\tif (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {\n  \t\t\t\t\t\tx1 = v1[k1Offset];\n  \t\t\t\t\t\ty1 = vOffset + x1 - k1Offset;\n\n  \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n  \t\t\t\t\t\tx2 = text1Length - x2;\n  \t\t\t\t\t\tif (x1 >= x2) {\n\n  \t\t\t\t\t\t\t// Overlap detected.\n  \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\t// Diff took too long and hit the deadline or\n  \t\t// number of diffs equals number of characters, no commonality at all.\n  \t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n  \t};\n\n  \t/**\n    * Given the location of the 'middle snake', split the diff in two parts\n    * and recurse.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {number} x Index of split point in text1.\n    * @param {number} y Index of split point in text2.\n    * @param {number} deadline Time at which to bail if not yet complete.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {\n  \t\tvar text1a, text1b, text2a, text2b, diffs, diffsb;\n  \t\ttext1a = text1.substring(0, x);\n  \t\ttext2a = text2.substring(0, y);\n  \t\ttext1b = text1.substring(x);\n  \t\ttext2b = text2.substring(y);\n\n  \t\t// Compute both diffs serially.\n  \t\tdiffs = this.DiffMain(text1a, text2a, false, deadline);\n  \t\tdiffsb = this.DiffMain(text1b, text2b, false, deadline);\n\n  \t\treturn diffs.concat(diffsb);\n  \t};\n\n  \t/**\n    * Reduce the number of edits by eliminating semantically trivial equalities.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {\n  \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;\n  \t\tchanges = false;\n  \t\tequalities = []; // Stack of indices where equalities are found.\n  \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n  \t\t/** @type {?string} */\n  \t\tlastequality = null;\n\n  \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n  \t\tpointer = 0; // Index of current position.\n\n  \t\t// Number of characters that changed prior to the equality.\n  \t\tlengthInsertions1 = 0;\n  \t\tlengthDeletions1 = 0;\n\n  \t\t// Number of characters that changed after the equality.\n  \t\tlengthInsertions2 = 0;\n  \t\tlengthDeletions2 = 0;\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n  \t\t\t\t// Equality found.\n  \t\t\t\tequalities[equalitiesLength++] = pointer;\n  \t\t\t\tlengthInsertions1 = lengthInsertions2;\n  \t\t\t\tlengthDeletions1 = lengthDeletions2;\n  \t\t\t\tlengthInsertions2 = 0;\n  \t\t\t\tlengthDeletions2 = 0;\n  \t\t\t\tlastequality = diffs[pointer][1];\n  \t\t\t} else {\n  \t\t\t\t// An insertion or deletion.\n  \t\t\t\tif (diffs[pointer][0] === DIFF_INSERT) {\n  \t\t\t\t\tlengthInsertions2 += diffs[pointer][1].length;\n  \t\t\t\t} else {\n  \t\t\t\t\tlengthDeletions2 += diffs[pointer][1].length;\n  \t\t\t\t}\n\n  \t\t\t\t// Eliminate an equality that is smaller or equal to the edits on both\n  \t\t\t\t// sides of it.\n  \t\t\t\tif (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {\n\n  \t\t\t\t\t// Duplicate record.\n  \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n  \t\t\t\t\t// Change second copy to insert.\n  \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n\n  \t\t\t\t\t// Throw away the equality we just deleted.\n  \t\t\t\t\tequalitiesLength--;\n\n  \t\t\t\t\t// Throw away the previous equality (it needs to be reevaluated).\n  \t\t\t\t\tequalitiesLength--;\n  \t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n\n  \t\t\t\t\t// Reset the counters.\n  \t\t\t\t\tlengthInsertions1 = 0;\n  \t\t\t\t\tlengthDeletions1 = 0;\n  \t\t\t\t\tlengthInsertions2 = 0;\n  \t\t\t\t\tlengthDeletions2 = 0;\n  \t\t\t\t\tlastequality = null;\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n\n  \t\t// Normalize the diff.\n  \t\tif (changes) {\n  \t\t\tthis.diffCleanupMerge(diffs);\n  \t\t}\n\n  \t\t// Find any overlaps between deletions and insertions.\n  \t\t// e.g: <del>abcxxx</del><ins>xxxdef</ins>\n  \t\t//   -> <del>abc</del>xxx<ins>def</ins>\n  \t\t// e.g: <del>xxxabc</del><ins>defxxx</ins>\n  \t\t//   -> <ins>def</ins>xxx<del>abc</del>\n  \t\t// Only extract an overlap if it is as big as the edit ahead or behind it.\n  \t\tpointer = 1;\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tif (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {\n  \t\t\t\tdeletion = diffs[pointer - 1][1];\n  \t\t\t\tinsertion = diffs[pointer][1];\n  \t\t\t\toverlapLength1 = this.diffCommonOverlap(deletion, insertion);\n  \t\t\t\toverlapLength2 = this.diffCommonOverlap(insertion, deletion);\n  \t\t\t\tif (overlapLength1 >= overlapLength2) {\n  \t\t\t\t\tif (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {\n\n  \t\t\t\t\t\t// Overlap found.  Insert an equality and trim the surrounding edits.\n  \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);\n  \t\t\t\t\t\tdiffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);\n  \t\t\t\t\t\tdiffs[pointer + 1][1] = insertion.substring(overlapLength1);\n  \t\t\t\t\t\tpointer++;\n  \t\t\t\t\t}\n  \t\t\t\t} else {\n  \t\t\t\t\tif (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {\n\n  \t\t\t\t\t\t// Reverse overlap found.\n  \t\t\t\t\t\t// Insert an equality and swap and trim the surrounding edits.\n  \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);\n\n  \t\t\t\t\t\tdiffs[pointer - 1][0] = DIFF_INSERT;\n  \t\t\t\t\t\tdiffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);\n  \t\t\t\t\t\tdiffs[pointer + 1][0] = DIFF_DELETE;\n  \t\t\t\t\t\tdiffs[pointer + 1][1] = deletion.substring(overlapLength2);\n  \t\t\t\t\t\tpointer++;\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tpointer++;\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n  \t};\n\n  \t/**\n    * Determine if the suffix of one string is the prefix of another.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {number} The number of characters common to the end of the first\n    *     string and the start of the second string.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {\n  \t\tvar text1Length, text2Length, textLength, best, length, pattern, found;\n\n  \t\t// Cache the text lengths to prevent multiple calls.\n  \t\ttext1Length = text1.length;\n  \t\ttext2Length = text2.length;\n\n  \t\t// Eliminate the null case.\n  \t\tif (text1Length === 0 || text2Length === 0) {\n  \t\t\treturn 0;\n  \t\t}\n\n  \t\t// Truncate the longer string.\n  \t\tif (text1Length > text2Length) {\n  \t\t\ttext1 = text1.substring(text1Length - text2Length);\n  \t\t} else if (text1Length < text2Length) {\n  \t\t\ttext2 = text2.substring(0, text1Length);\n  \t\t}\n  \t\ttextLength = Math.min(text1Length, text2Length);\n\n  \t\t// Quick check for the worst case.\n  \t\tif (text1 === text2) {\n  \t\t\treturn textLength;\n  \t\t}\n\n  \t\t// Start by looking for a single character match\n  \t\t// and increase length until no match is found.\n  \t\t// Performance analysis: https://neil.fraser.name/news/2010/11/04/\n  \t\tbest = 0;\n  \t\tlength = 1;\n  \t\twhile (true) {\n  \t\t\tpattern = text1.substring(textLength - length);\n  \t\t\tfound = text2.indexOf(pattern);\n  \t\t\tif (found === -1) {\n  \t\t\t\treturn best;\n  \t\t\t}\n  \t\t\tlength += found;\n  \t\t\tif (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {\n  \t\t\t\tbest = length;\n  \t\t\t\tlength++;\n  \t\t\t}\n  \t\t}\n  \t};\n\n  \t/**\n    * Split two texts into an array of strings.  Reduce the texts to a string of\n    * hashes where each Unicode character represents one line.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n    *     An object containing the encoded text1, the encoded text2 and\n    *     the array of unique strings.\n    *     The zeroth element of the array of unique strings is intentionally blank.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {\n  \t\tvar lineArray, lineHash, chars1, chars2;\n  \t\tlineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n  \t\tlineHash = {}; // E.g. lineHash['Hello\\n'] === 4\n\n  \t\t// '\\x00' is a valid character, but various debuggers don't like it.\n  \t\t// So we'll insert a junk entry to avoid generating a null character.\n  \t\tlineArray[0] = \"\";\n\n  \t\t/**\n     * Split a text into an array of strings.  Reduce the texts to a string of\n     * hashes where each Unicode character represents one line.\n     * Modifies linearray and linehash through being a closure.\n     * @param {string} text String to encode.\n     * @return {string} Encoded string.\n     * @private\n     */\n  \t\tfunction diffLinesToCharsMunge(text) {\n  \t\t\tvar chars, lineStart, lineEnd, lineArrayLength, line;\n  \t\t\tchars = \"\";\n\n  \t\t\t// Walk the text, pulling out a substring for each line.\n  \t\t\t// text.split('\\n') would would temporarily double our memory footprint.\n  \t\t\t// Modifying text would create many large strings to garbage collect.\n  \t\t\tlineStart = 0;\n  \t\t\tlineEnd = -1;\n\n  \t\t\t// Keeping our own length variable is faster than looking it up.\n  \t\t\tlineArrayLength = lineArray.length;\n  \t\t\twhile (lineEnd < text.length - 1) {\n  \t\t\t\tlineEnd = text.indexOf(\"\\n\", lineStart);\n  \t\t\t\tif (lineEnd === -1) {\n  \t\t\t\t\tlineEnd = text.length - 1;\n  \t\t\t\t}\n  \t\t\t\tline = text.substring(lineStart, lineEnd + 1);\n  \t\t\t\tlineStart = lineEnd + 1;\n\n  \t\t\t\tvar lineHashExists = lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined;\n\n  \t\t\t\tif (lineHashExists) {\n  \t\t\t\t\tchars += String.fromCharCode(lineHash[line]);\n  \t\t\t\t} else {\n  \t\t\t\t\tchars += String.fromCharCode(lineArrayLength);\n  \t\t\t\t\tlineHash[line] = lineArrayLength;\n  \t\t\t\t\tlineArray[lineArrayLength++] = line;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\treturn chars;\n  \t\t}\n\n  \t\tchars1 = diffLinesToCharsMunge(text1);\n  \t\tchars2 = diffLinesToCharsMunge(text2);\n  \t\treturn {\n  \t\t\tchars1: chars1,\n  \t\t\tchars2: chars2,\n  \t\t\tlineArray: lineArray\n  \t\t};\n  \t};\n\n  \t/**\n    * Rehydrate the text in a diff from a string of line hashes to real lines of\n    * text.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    * @param {!Array.<string>} lineArray Array of unique strings.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {\n  \t\tvar x, chars, text, y;\n  \t\tfor (x = 0; x < diffs.length; x++) {\n  \t\t\tchars = diffs[x][1];\n  \t\t\ttext = [];\n  \t\t\tfor (y = 0; y < chars.length; y++) {\n  \t\t\t\ttext[y] = lineArray[chars.charCodeAt(y)];\n  \t\t\t}\n  \t\t\tdiffs[x][1] = text.join(\"\");\n  \t\t}\n  \t};\n\n  \t/**\n    * Reorder and merge like edit sections.  Merge equalities.\n    * Any edit section can move as long as it doesn't cross an equality.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {\n  \t\tvar pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position;\n  \t\tdiffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n  \t\tpointer = 0;\n  \t\tcountDelete = 0;\n  \t\tcountInsert = 0;\n  \t\ttextDelete = \"\";\n  \t\ttextInsert = \"\";\n\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tswitch (diffs[pointer][0]) {\n  \t\t\t\tcase DIFF_INSERT:\n  \t\t\t\t\tcountInsert++;\n  \t\t\t\t\ttextInsert += diffs[pointer][1];\n  \t\t\t\t\tpointer++;\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_DELETE:\n  \t\t\t\t\tcountDelete++;\n  \t\t\t\t\ttextDelete += diffs[pointer][1];\n  \t\t\t\t\tpointer++;\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_EQUAL:\n\n  \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n  \t\t\t\t\tif (countDelete + countInsert > 1) {\n  \t\t\t\t\t\tif (countDelete !== 0 && countInsert !== 0) {\n\n  \t\t\t\t\t\t\t// Factor out any common prefixes.\n  \t\t\t\t\t\t\tcommonlength = this.diffCommonPrefix(textInsert, textDelete);\n  \t\t\t\t\t\t\tif (commonlength !== 0) {\n  \t\t\t\t\t\t\t\tif (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {\n  \t\t\t\t\t\t\t\t\tdiffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);\n  \t\t\t\t\t\t\t\t} else {\n  \t\t\t\t\t\t\t\t\tdiffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);\n  \t\t\t\t\t\t\t\t\tpointer++;\n  \t\t\t\t\t\t\t\t}\n  \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(commonlength);\n  \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(commonlength);\n  \t\t\t\t\t\t\t}\n\n  \t\t\t\t\t\t\t// Factor out any common suffixies.\n  \t\t\t\t\t\t\tcommonlength = this.diffCommonSuffix(textInsert, textDelete);\n  \t\t\t\t\t\t\tif (commonlength !== 0) {\n  \t\t\t\t\t\t\t\tdiffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];\n  \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(0, textInsert.length - commonlength);\n  \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(0, textDelete.length - commonlength);\n  \t\t\t\t\t\t\t}\n  \t\t\t\t\t\t}\n\n  \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n  \t\t\t\t\t\tif (countDelete === 0) {\n  \t\t\t\t\t\t\tdiffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);\n  \t\t\t\t\t\t} else if (countInsert === 0) {\n  \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);\n  \t\t\t\t\t\t} else {\n  \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t\tpointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;\n  \t\t\t\t\t} else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n\n  \t\t\t\t\t\t// Merge this equality with the previous one.\n  \t\t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer][1];\n  \t\t\t\t\t\tdiffs.splice(pointer, 1);\n  \t\t\t\t\t} else {\n  \t\t\t\t\t\tpointer++;\n  \t\t\t\t\t}\n  \t\t\t\t\tcountInsert = 0;\n  \t\t\t\t\tcountDelete = 0;\n  \t\t\t\t\ttextDelete = \"\";\n  \t\t\t\t\ttextInsert = \"\";\n  \t\t\t\t\tbreak;\n  \t\t\t}\n  \t\t}\n  \t\tif (diffs[diffs.length - 1][1] === \"\") {\n  \t\t\tdiffs.pop(); // Remove the dummy entry at the end.\n  \t\t}\n\n  \t\t// Second pass: look for single edits surrounded on both sides by equalities\n  \t\t// which can be shifted sideways to eliminate an equality.\n  \t\t// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n  \t\tchanges = false;\n  \t\tpointer = 1;\n\n  \t\t// Intentionally ignore the first and last element (don't need checking).\n  \t\twhile (pointer < diffs.length - 1) {\n  \t\t\tif (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n\n  \t\t\t\tdiffPointer = diffs[pointer][1];\n  \t\t\t\tposition = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);\n\n  \t\t\t\t// This is a single edit surrounded by equalities.\n  \t\t\t\tif (position === diffs[pointer - 1][1]) {\n\n  \t\t\t\t\t// Shift the edit over the previous equality.\n  \t\t\t\t\tdiffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n  \t\t\t\t\tdiffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n  \t\t\t\t\tdiffs.splice(pointer - 1, 1);\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t} else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {\n\n  \t\t\t\t\t// Shift the edit over the next equality.\n  \t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer + 1][1];\n  \t\t\t\t\tdiffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n  \t\t\t\t\tdiffs.splice(pointer + 1, 1);\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n\n  \t\t// If shifts were made, the diff needs reordering and another shift sweep.\n  \t\tif (changes) {\n  \t\t\tthis.diffCleanupMerge(diffs);\n  \t\t}\n  \t};\n\n  \treturn function (o, n) {\n  \t\tvar diff, output, text;\n  \t\tdiff = new DiffMatchPatch();\n  \t\toutput = diff.DiffMain(o, n);\n  \t\tdiff.diffCleanupEfficiency(output);\n  \t\ttext = diff.diffPrettyHtml(output);\n\n  \t\treturn text;\n  \t};\n  }();\n\n}((function() { return this; }())));\n"
  },
  {
    "path": "common/Tests/External/qunit-2.9.3.css",
    "content": "/*!\n * QUnit 2.19.3\n * https://qunitjs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n\n/** Resets */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/* Style our buttons in a simple way, uninfluenced by the styles\n   the tested app might load. Don't affect buttons in #qunit-fixture!\n   https://github.com/qunitjs/qunit/pull/1395\n   https://github.com/qunitjs/qunit/issues/1437 */\n#qunit-testrunner-toolbar button,\n#qunit-testresult button {\n\tall: unset; /* best effort, modern browsers only */\n\tfont: inherit;\n\tcolor: initial;\n\tborder: initial;\n\tbackground-color: buttonface;\n\tpadding: 0 4px;\n}\n\n\n/** Fixed headers with scrollable tests */\n\n@supports (display: flex) or (display: -webkit-box) {\n\t@media (min-height: 500px) {\n\t\t#qunit {\n\t\t\tposition: fixed;\n\t\t\tleft: 0px;\n\t\t\tright: 0px;\n\t\t\ttop: 0px;\n\t\t\tbottom: 0px;\n\t\t\tpadding: 8px;\n\t\t\tdisplay: -webkit-box;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t}\n\n\t\t#qunit-tests {\n\t\t\toverflow: scroll;\n\t\t}\n\n\t\t#qunit-banner {\n\t\t\tflex: 5px 0 0;\n\t\t}\n\t}\n}\n\n\n/** Header (excluding toolbar) */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #C2CCD1;\n\tbackground-color: #0D3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: 400;\n\n\tborder-radius: 5px 5px 0 0;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: inherit;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #FFF;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-filteredTest {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tcolor: #366097;\n\tbackground-color: #F4FF77;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tcolor: #FFF;\n\tbackground-color: #2B81AF;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n\n/** Toolbar */\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 1em 0.5em 1em;\n\tcolor: #5E740B;\n\tbackground-color: #EEE;\n}\n\n#qunit-testrunner-toolbar .clearfix {\n\theight: 0;\n\tclear: both;\n}\n\n#qunit-testrunner-toolbar label {\n\tdisplay: inline-block;\n}\n\n#qunit-testrunner-toolbar input[type=checkbox],\n#qunit-testrunner-toolbar input[type=radio] {\n\tmargin: 3px;\n\tvertical-align: -2px;\n}\n\n#qunit-testrunner-toolbar input[type=text] {\n\tbox-sizing: border-box;\n\theight: 1.6em;\n}\n\n#qunit-testrunner-toolbar button,\n#qunit-testresult button {\n  border-radius: .25em;\n  border: 1px solid #AAA;\n  background-color: #F8F8F8;\n  color: #222;\n  line-height: 1.6;\n  cursor: pointer;\n}\n#qunit-testrunner-toolbar button:hover,\n#qunit-testresult button:hover {\n\tborder-color: #AAA;\n\tbackground-color: #FFF;\n\tcolor: #444;\n}\n#qunit-testrunner-toolbar button:active,\n#qunit-testresult button:active {\n\tborder-color: #777;\n\tbackground-color: #CCC;\n\tcolor: #000;\n}\n#qunit-testrunner-toolbar button:focus,\n#qunit-testresult button:focus {\n\tborder-color: #2F68DA;\n\t/* emulate 2px border without a layout shift */\n\tbox-shadow: inset 0 0 0 1px #2F68DA\n}\n#qunit-testrunner-toolbar button:disabled,\n#qunit-testresult button:disabled {\n\tborder-color: #CCC;\n\tbackground-color: #CCC;\n\tcolor: #FFF;\n  cursor: default;\n}\n\n#qunit-toolbar-filters {\n\tfloat: right;\n\t/* aligning right avoids overflows and inefficient use of space\n\t   around the dropdown menu on narrow viewports */\n\ttext-align: right;\n}\n\n.qunit-url-config,\n.qunit-filter,\n#qunit-modulefilter {\n\tdisplay: inline-block;\n\tline-height: 2.1em;\n\ttext-align: left;\n}\n\n.qunit-filter,\n#qunit-modulefilter {\n\tposition: relative;\n\tmargin-left: 1em;\n}\n\n.qunit-url-config label {\n\tmargin-right: 0.5em;\n}\n\n#qunit-modulefilter-search {\n\tbox-sizing: border-box;\n\tmin-width: 400px;\n\tmin-width: min(400px, 80vw);\n}\n\n#qunit-modulefilter-search-container {\n\tposition: relative;\n}\n#qunit-modulefilter-search-container:after {\n\tposition: absolute;\n\tright: 0.3em;\n\tbottom: 0;\n\tline-height: 100%;\n\tcontent: \"\\25bc\";\n\tcolor: black;\n}\n\n#qunit-modulefilter-dropdown {\n\t/* align with #qunit-modulefilter-search */\n\tbox-sizing: border-box;\n\tmin-width: 400px;\n\tmin-width: min(400px, 80vw);\n\tmax-width: 80vw;\n\tposition: absolute;\n\tright: 0;\n\ttop: 100%;\n\tmargin-top: 2px;\n\n\t/* ensure that when on a narrow viewports and having only one result,\n\t   that #qunit-modulefilter-actions fall outside the dropdown rectangle. */\n\tmin-height: 3em;\n\n\tborder: 1px solid #AAA;\n\tborder-top-color: transparent;\n\tborder-radius: 0 0 .25em .25em;\n\tcolor: #0D3349;\n\tbackground-color: #F5F5F5;\n\tz-index: 99;\n}\n\n#qunit-modulefilter-actions {\n\tdisplay: block;\n\toverflow: auto;\n\t/* align with #qunit-modulefilter-dropdown-list */\n\tfont: smaller/1.5em sans-serif;\n}\n@media (min-width: 350px) {\n\t#qunit-modulefilter-actions {\n\t\tposition: absolute;\n\t\tright: 0;\n\t}\n}\n\n#qunit-modulefilter-dropdown #qunit-modulefilter-actions > * {\n\tbox-sizing: border-box;\n\tmax-height: 2.8em;\n\tdisplay: block;\n\tpadding: 0.4em;\n}\n\n#qunit-modulefilter-dropdown #qunit-modulefilter-actions > button {\n\tfloat: right;\n\tmargin: 0.25em;\n}\n\n#qunit-modulefilter-dropdown-list {\n\tmargin: 0;\n\tpadding: 0;\n\tfont: smaller/1.5em sans-serif;\n}\n\n#qunit-modulefilter-dropdown-list li {\n\tlist-style: none;\n}\n#qunit-modulefilter-dropdown-list .clickable {\n\tdisplay: block;\n\tpadding: 0.25em 0.50em 0.25em 0.15em;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n#qunit-modulefilter-dropdown-list .clickable.checked {\n\tfont-weight: bold;\n\tbackground-color: #E2F0F7;\n\tcolor: #0D3349;\n}\n#qunit-modulefilter-dropdown .clickable:hover {\n\tbackground-color: #FFF;\n\tcolor: #444;\n}\n\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 1em 0.4em 1em;\n\tborder-bottom: 1px solid #FFF;\n\tlist-style-position: inside;\n}\n\n#qunit-tests > li {\n\tdisplay: none;\n}\n\n#qunit-tests li.running,\n#qunit-tests li.pass,\n#qunit-tests li.fail,\n#qunit-tests li.skipped,\n#qunit-tests li.aborted {\n\tdisplay: list-item;\n}\n\n#qunit-tests.hidepass {\n\tposition: relative;\n}\n\n#qunit-tests.hidepass li.running,\n#qunit-tests.hidepass li.pass:not(.todo) {\n\tvisibility: hidden;\n\tposition: absolute;\n\twidth:   0;\n\theight:  0;\n\tpadding: 0;\n\tborder:  0;\n\tmargin:  0;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li.skipped strong {\n\tcursor: default;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: inherit;\n\ttext-decoration: underline;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #0D3349;\n}\n\n#qunit-tests li .runtime {\n\tfloat: right;\n\tfont-size: smaller;\n}\n\n.qunit-assert-list {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #FFF;\n\n\tborder-radius: 5px;\n}\n\n.qunit-source {\n\tmargin: 0.6em 0 0.3em;\n}\n\n.qunit-collapsed {\n\tdisplay: none;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: 0.2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 0.5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tcolor: #374E0C;\n\tbackground-color: #E0F2BE;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tcolor: #500;\n\tbackground-color: #FFCACA;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: #0D3349; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tpadding: 5px;\n\tbackground-color: #FFF;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n\n#qunit-tests .pass {\n\tcolor: #2F68DA;\n\tbackground-color: #E2F0F7;\n}\n\n#qunit-tests .pass .test-name {\n\tcolor: #366097;\n}\n\n#qunit-tests li li.pass {\n\tcolor: #3C510C;\n\tbackground-color: #FFF;\n\tborder-left: 10px solid #C6E746;\n}\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests .fail {\n\tcolor: #000;\n\tbackground-color: #EE5757;\n}\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #FFF;\n\tborder-left: 10px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 5px 5px;\n}\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: #008000; }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n\n/*** Aborted tests */\n#qunit-tests .aborted { color: #000; background-color: orange; }\n/*** Skipped tests */\n\n#qunit-tests .skipped {\n\tbackground-color: #EBECE9;\n}\n\n#qunit-tests .qunit-todo-label,\n#qunit-tests .qunit-skipped-label {\n\tbackground-color: #F4FF77;\n\tdisplay: inline-block;\n\tfont-style: normal;\n\tcolor: #366097;\n\tline-height: 1.8em;\n\tpadding: 0 0.5em;\n\tmargin: -0.4em 0.4em -0.4em 0;\n}\n\n#qunit-tests .qunit-todo-label {\n\tbackground-color: #EEE;\n}\n\n/** Result */\n\n#qunit-testresult {\n\tcolor: #366097;\n\tbackground-color: #E2F0F7;\n\n\tborder-bottom: 1px solid #FFF;\n}\n#qunit-testresult a {\n\tcolor: #2F68DA;\n}\n#qunit-testresult .clearfix {\n\theight: 0;\n\tclear: both;\n}\n#qunit-testresult .module-name {\n\tfont-weight: 700;\n}\n#qunit-testresult-display {\n\tpadding: 0.5em 1em 0.5em 1em;\n\twidth: 85%;\n\tfloat:left;\n}\n#qunit-testresult-controls {\n\tpadding: 0.5em 1em 0.5em 1em;\n  width: 10%;\n\tfloat:left;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n\twidth: 1000px;\n\theight: 1000px;\n}\n"
  },
  {
    "path": "common/Tests/External/qunit-2.9.3.js",
    "content": "/*!\n * QUnit 2.19.3\n * https://qunitjs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n */\n(function () {\n  'use strict';\n\n  function _typeof(obj) {\n    \"@babel/helpers - typeof\";\n\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n      return typeof obj;\n    } : function (obj) {\n      return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, _typeof(obj);\n  }\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    Object.defineProperty(Constructor, \"prototype\", {\n      writable: false\n    });\n    return Constructor;\n  }\n  function _slicedToArray(arr, i) {\n    return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n  }\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n  function _arrayWithHoles(arr) {\n    if (Array.isArray(arr)) return arr;\n  }\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n  }\n  function _iterableToArrayLimit(arr, i) {\n    var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n    if (_i == null) return;\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _s, _e;\n    try {\n      for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n    return _arr;\n  }\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n  }\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n    return arr2;\n  }\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n  function _nonIterableRest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n  function _createForOfIteratorHelper(o, allowArrayLike) {\n    var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n    if (!it) {\n      if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n        if (it) o = it;\n        var i = 0;\n        var F = function () {};\n        return {\n          s: F,\n          n: function () {\n            if (i >= o.length) return {\n              done: true\n            };\n            return {\n              done: false,\n              value: o[i++]\n            };\n          },\n          e: function (e) {\n            throw e;\n          },\n          f: F\n        };\n      }\n      throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true,\n      didErr = false,\n      err;\n    return {\n      s: function () {\n        it = it.call(o);\n      },\n      n: function () {\n        var step = it.next();\n        normalCompletion = step.done;\n        return step;\n      },\n      e: function (e) {\n        didErr = true;\n        err = e;\n      },\n      f: function () {\n        try {\n          if (!normalCompletion && it.return != null) it.return();\n        } finally {\n          if (didErr) throw err;\n        }\n      }\n    };\n  }\n\n  // We don't use global-this-polyfill [1], because it modifies\n  // the globals scope by default. QUnit must not affect the host context\n  // as developers may test their project may be such a polyfill, and/or\n  // they may intentionally test their project with and without certain\n  // polyfills and we must not affect that. It also uses an obscure\n  // mechanism that seems to sometimes causes a runtime error in older\n  // browsers (specifically Safari and IE versions that support\n  // Object.defineProperty but then report _T_ as undefined).\n  // [1] https://github.com/ungap/global-this/blob/v0.4.4/esm/index.js\n  //\n  // Another way is `Function('return this')()`, but doing so relies\n  // on eval which will cause a CSP error on some servers.\n  //\n  // Instead, simply check the four options that already exist\n  // in all supported environments.\n  function getGlobalThis() {\n    if (typeof globalThis !== 'undefined') {\n      // For SpiderMonkey, modern browsers, and recent Node.js\n      // eslint-disable-next-line no-undef\n      return globalThis;\n    }\n    if (typeof self !== 'undefined') {\n      // For web workers\n      // eslint-disable-next-line no-undef\n      return self;\n    }\n    if (typeof window$1 !== 'undefined') {\n      // For document context in browsers\n      return window$1;\n    }\n    if (typeof global !== 'undefined') {\n      // For Node.js\n      // eslint-disable-next-line no-undef\n      return global;\n    }\n    throw new Error('Unable to locate global object');\n  }\n\n  // This avoids a simple `export const` assignment as that would lead Rollup\n  // to change getGlobalThis and use the same (generated) variable name there.\n  var g = getGlobalThis();\n  var window$1 = g.window;\n  var console$1 = g.console;\n  var setTimeout$1 = g.setTimeout;\n  var clearTimeout = g.clearTimeout;\n  var document = window$1 && window$1.document;\n  var navigator = window$1 && window$1.navigator;\n  var localSessionStorage = function () {\n    var x = 'qunit-test-string';\n    try {\n      g.sessionStorage.setItem(x, x);\n      g.sessionStorage.removeItem(x);\n      return g.sessionStorage;\n    } catch (e) {\n      return undefined;\n    }\n  }();\n\n  // Basic fallback for ES6 Map\n  // Support: IE 9-10, Safari 7, PhantomJS; Map is undefined\n  // Support: iOS 8; `new Map(iterable)` is not supported\n  //\n  // Fallback for ES7 Map#keys\n  // Support: IE 11; Map#keys is undefined\n  var StringMap = typeof g.Map === 'function' && typeof g.Map.prototype.keys === 'function' && typeof g.Symbol === 'function' && _typeof(g.Symbol.iterator) === 'symbol' ? g.Map : function StringMap(input) {\n    var _this = this;\n    var store = Object.create(null);\n    var hasOwn = Object.prototype.hasOwnProperty;\n    this.has = function (strKey) {\n      return hasOwn.call(store, strKey);\n    };\n    this.get = function (strKey) {\n      return store[strKey];\n    };\n    this.set = function (strKey, val) {\n      if (!hasOwn.call(store, strKey)) {\n        this.size++;\n      }\n      store[strKey] = val;\n      return this;\n    };\n    this.delete = function (strKey) {\n      if (hasOwn.call(store, strKey)) {\n        delete store[strKey];\n        this.size--;\n      }\n    };\n    this.forEach = function (callback) {\n      for (var strKey in store) {\n        callback(store[strKey], strKey);\n      }\n    };\n    this.keys = function () {\n      return Object.keys(store);\n    };\n    this.clear = function () {\n      store = Object.create(null);\n      this.size = 0;\n    };\n    this.size = 0;\n    if (input) {\n      input.forEach(function (val, strKey) {\n        _this.set(strKey, val);\n      });\n    }\n  };\n\n  // Basic fallback for ES6 Set\n  // Support: IE 11, `new Set(iterable)` parameter not yet implemented\n  // Test for Set#values() which came after Set(iterable).\n  var StringSet = typeof g.Set === 'function' && typeof g.Set.prototype.values === 'function' ? g.Set : function (input) {\n    var set = Object.create(null);\n    if (Array.isArray(input)) {\n      input.forEach(function (item) {\n        set[item] = true;\n      });\n    }\n    return {\n      add: function add(value) {\n        set[value] = true;\n      },\n      has: function has(value) {\n        return value in set;\n      },\n      get size() {\n        return Object.keys(set).length;\n      }\n    };\n  };\n\n  // Support: IE 9\n  // Detect if the console object exists and no-op otherwise.\n  // This allows support for IE 9, which doesn't have a console\n  // object if the developer tools are not open.\n\n  // Support: IE 9\n  // Function#bind is supported, but no console.log.bind().\n\n  // Support: SpiderMonkey (mozjs 68+)\n  // The console object has a log method, but no warn method.\n\n  var Logger = {\n    warn: console$1 ? Function.prototype.bind.call(console$1.warn || console$1.log, console$1) : function () {}\n  };\n\n  var toString = Object.prototype.toString;\n  var hasOwn$1 = Object.prototype.hasOwnProperty;\n  var nativePerf = getNativePerf();\n\n  // TODO: Consider using globalThis instead so that perf marks work\n  // in Node.js as well. As they can have overhead, we should also\n  // have a way to disable these, and/or make them an opt-in reporter\n  // in QUnit 3 and then support globalThis.\n  // For example: `QUnit.addReporter(QUnit.reporters.perf)`.\n  function getNativePerf() {\n    if (window$1 && typeof window$1.performance !== 'undefined' && typeof window$1.performance.mark === 'function' && typeof window$1.performance.measure === 'function') {\n      return window$1.performance;\n    } else {\n      return undefined;\n    }\n  }\n  var performance = {\n    now: nativePerf ? nativePerf.now.bind(nativePerf) : Date.now,\n    measure: nativePerf ? function (comment, startMark, endMark) {\n      // `performance.measure` may fail if the mark could not be found.\n      // reasons a specific mark could not be found include: outside code invoking `performance.clearMarks()`\n      try {\n        nativePerf.measure(comment, startMark, endMark);\n      } catch (ex) {\n        Logger.warn('performance.measure could not be executed because of ', ex.message);\n      }\n    } : function () {},\n    mark: nativePerf ? nativePerf.mark.bind(nativePerf) : function () {}\n  };\n\n  // Returns a new Array with the elements that are in a but not in b\n  function diff(a, b) {\n    return a.filter(function (a) {\n      return b.indexOf(a) === -1;\n    });\n  }\n\n  /**\n   * Determines whether an element exists in a given array or not.\n   *\n   * @method inArray\n   * @param {any} elem\n   * @param {Array} array\n   * @return {boolean}\n   */\n  function inArray(elem, array) {\n    return array.indexOf(elem) !== -1;\n  }\n\n  /**\n   * Recursively clone an object into a plain array or object, taking only the\n   * own enumerable properties.\n   *\n   * @param {any} obj\n   * @param {bool} [allowArray=true]\n   * @return {Object|Array}\n   */\n  function objectValues(obj) {\n    var allowArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var vals = allowArray && is('array', obj) ? [] : {};\n    for (var key in obj) {\n      if (hasOwn$1.call(obj, key)) {\n        var val = obj[key];\n        vals[key] = val === Object(val) ? objectValues(val, allowArray) : val;\n      }\n    }\n    return vals;\n  }\n\n  /**\n   * Recursively clone an object into a plain object, taking only the\n   * subset of own enumerable properties that exist a given model.\n   *\n   * @param {any} obj\n   * @param {any} model\n   * @return {Object}\n   */\n  function objectValuesSubset(obj, model) {\n    // Return primitive values unchanged to avoid false positives or confusing\n    // results from assert.propContains().\n    // E.g. an actual null or false wrongly equaling an empty object,\n    // or an actual string being reported as object not matching a partial object.\n    if (obj !== Object(obj)) {\n      return obj;\n    }\n\n    // Unlike objectValues(), subset arrays to a plain objects as well.\n    // This enables subsetting [20, 30] with {1: 30}.\n    var subset = {};\n    for (var key in model) {\n      if (hasOwn$1.call(model, key) && hasOwn$1.call(obj, key)) {\n        subset[key] = objectValuesSubset(obj[key], model[key]);\n      }\n    }\n    return subset;\n  }\n  function extend(a, b, undefOnly) {\n    for (var prop in b) {\n      if (hasOwn$1.call(b, prop)) {\n        if (b[prop] === undefined) {\n          delete a[prop];\n        } else if (!(undefOnly && typeof a[prop] !== 'undefined')) {\n          a[prop] = b[prop];\n        }\n      }\n    }\n    return a;\n  }\n  function objectType(obj) {\n    if (typeof obj === 'undefined') {\n      return 'undefined';\n    }\n\n    // Consider: typeof null === object\n    if (obj === null) {\n      return 'null';\n    }\n    var match = toString.call(obj).match(/^\\[object\\s(.*)\\]$/);\n    var type = match && match[1];\n    switch (type) {\n      case 'Number':\n        if (isNaN(obj)) {\n          return 'nan';\n        }\n        return 'number';\n      case 'String':\n      case 'Boolean':\n      case 'Array':\n      case 'Set':\n      case 'Map':\n      case 'Date':\n      case 'RegExp':\n      case 'Function':\n      case 'Symbol':\n        return type.toLowerCase();\n      default:\n        return _typeof(obj);\n    }\n  }\n\n  // Safe object type checking\n  function is(type, obj) {\n    return objectType(obj) === type;\n  }\n\n  // Based on Java's String.hashCode, a simple but not\n  // rigorously collision resistant hashing function\n  function generateHash(module, testName) {\n    var str = module + '\\x1C' + testName;\n    var hash = 0;\n    for (var i = 0; i < str.length; i++) {\n      hash = (hash << 5) - hash + str.charCodeAt(i);\n      hash |= 0;\n    }\n\n    // Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n    // strictly necessary but increases user understanding that the id is a SHA-like hash\n    var hex = (0x100000000 + hash).toString(16);\n    if (hex.length < 8) {\n      hex = '0000000' + hex;\n    }\n    return hex.slice(-8);\n  }\n\n  /**\n   * Converts an error into a simple string for comparisons.\n   *\n   * @param {Error|any} error\n   * @return {string}\n   */\n  function errorString(error) {\n    // Use String() instead of toString() to handle non-object values like undefined or null.\n    var resultErrorString = String(error);\n\n    // If the error wasn't a subclass of Error but something like\n    // an object literal with name and message properties...\n    if (resultErrorString.slice(0, 7) === '[object') {\n      // Based on https://es5.github.io/#x15.11.4.4\n      return (error.name || 'Error') + (error.message ? \": \".concat(error.message) : '');\n    } else {\n      return resultErrorString;\n    }\n  }\n\n  var BOXABLE_TYPES = new StringSet(['boolean', 'number', 'string']);\n\n  // Memory for previously seen containers (object, array, map, set).\n  // Used for recursion detection, and to avoid repeated comparison.\n  //\n  // Elements are { a: val, b: val }.\n  var memory = [];\n  function useStrictEquality(a, b) {\n    return a === b;\n  }\n  function useObjectValueEquality(a, b) {\n    return a === b || a.valueOf() === b.valueOf();\n  }\n  function compareConstructors(a, b) {\n    // Comparing constructors is more strict than using `instanceof`\n    return getConstructor(a) === getConstructor(b);\n  }\n  function getConstructor(obj) {\n    var proto = Object.getPrototypeOf(obj);\n\n    // If the obj prototype descends from a null constructor, treat it\n    // as a null prototype.\n    // Ref https://github.com/qunitjs/qunit/issues/851\n    //\n    // Allow objects with no prototype, from Object.create(null), to be equivalent to\n    // plain objects that have Object as their constructor.\n    return !proto || proto.constructor === null ? Object : obj.constructor;\n  }\n  function getRegExpFlags(regexp) {\n    return 'flags' in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];\n  }\n\n  // Specialised comparisons after entryTypeCallbacks.object, based on `objectType()`\n  var objTypeCallbacks = {\n    undefined: useStrictEquality,\n    null: useStrictEquality,\n    // Handle boxed boolean\n    boolean: useObjectValueEquality,\n    number: function number(a, b) {\n      // Handle NaN and boxed number\n      return a === b || a.valueOf() === b.valueOf() || isNaN(a.valueOf()) && isNaN(b.valueOf());\n    },\n    // Handle boxed string\n    string: useObjectValueEquality,\n    symbol: useStrictEquality,\n    date: useObjectValueEquality,\n    nan: function nan() {\n      return true;\n    },\n    regexp: function regexp(a, b) {\n      return a.source === b.source &&\n      // Include flags in the comparison\n      getRegExpFlags(a) === getRegExpFlags(b);\n    },\n    // identical reference only\n    function: useStrictEquality,\n    array: function array(a, b) {\n      if (a.length !== b.length) {\n        // Safe and faster\n        return false;\n      }\n      for (var i = 0; i < a.length; i++) {\n        if (!typeEquiv(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    },\n    // Define sets a and b to be equivalent if for each element aVal in a, there\n    // is some element bVal in b such that aVal and bVal are equivalent. Element\n    // repetitions are not counted, so these are equivalent:\n    // a = new Set( [ X={}, Y=[], Y ] );\n    // b = new Set( [ Y, X, X ] );\n    set: function set(a, b) {\n      if (a.size !== b.size) {\n        // This optimization has certain quirks because of the lack of\n        // repetition counting. For instance, adding the same\n        // (reference-identical) element to two equivalent sets can\n        // make them non-equivalent.\n        return false;\n      }\n      var outerEq = true;\n      a.forEach(function (aVal) {\n        // Short-circuit if the result is already known. (Using for...of\n        // with a break clause would be cleaner here, but it would cause\n        // a syntax error on older JavaScript implementations even if\n        // Set is unused)\n        if (!outerEq) {\n          return;\n        }\n        var innerEq = false;\n        b.forEach(function (bVal) {\n          // Likewise, short-circuit if the result is already known\n          if (innerEq) {\n            return;\n          }\n\n          // Swap out the global memory, as nested typeEquiv() would clobber it\n          var originalMemory = memory;\n          memory = [];\n          if (typeEquiv(bVal, aVal)) {\n            innerEq = true;\n          }\n          // Restore\n          memory = originalMemory;\n        });\n        if (!innerEq) {\n          outerEq = false;\n        }\n      });\n      return outerEq;\n    },\n    // Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)\n    // in a, there is some key-value pair (bKey, bVal) in b such that\n    // [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not\n    // counted, so these are equivalent:\n    // a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );\n    // b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );\n    map: function map(a, b) {\n      if (a.size !== b.size) {\n        // This optimization has certain quirks because of the lack of\n        // repetition counting. For instance, adding the same\n        // (reference-identical) key-value pair to two equivalent maps\n        // can make them non-equivalent.\n        return false;\n      }\n      var outerEq = true;\n      a.forEach(function (aVal, aKey) {\n        // Short-circuit if the result is already known. (Using for...of\n        // with a break clause would be cleaner here, but it would cause\n        // a syntax error on older JavaScript implementations even if\n        // Map is unused)\n        if (!outerEq) {\n          return;\n        }\n        var innerEq = false;\n        b.forEach(function (bVal, bKey) {\n          // Likewise, short-circuit if the result is already known\n          if (innerEq) {\n            return;\n          }\n\n          // Swap out the global memory, as nested typeEquiv() would clobber it\n          var originalMemory = memory;\n          memory = [];\n          if (objTypeCallbacks.array([bVal, bKey], [aVal, aKey])) {\n            innerEq = true;\n          }\n          // Restore\n          memory = originalMemory;\n        });\n        if (!innerEq) {\n          outerEq = false;\n        }\n      });\n      return outerEq;\n    }\n  };\n\n  // Entry points from typeEquiv, based on `typeof`\n  var entryTypeCallbacks = {\n    undefined: useStrictEquality,\n    null: useStrictEquality,\n    boolean: useStrictEquality,\n    number: function number(a, b) {\n      // Handle NaN\n      return a === b || isNaN(a) && isNaN(b);\n    },\n    string: useStrictEquality,\n    symbol: useStrictEquality,\n    function: useStrictEquality,\n    object: function object(a, b) {\n      // Handle memory (skip recursion)\n      if (memory.some(function (pair) {\n        return pair.a === a && pair.b === b;\n      })) {\n        return true;\n      }\n      memory.push({\n        a: a,\n        b: b\n      });\n      var aObjType = objectType(a);\n      var bObjType = objectType(b);\n      if (aObjType !== 'object' || bObjType !== 'object') {\n        // Handle literal `null`\n        // Handle: Array, Map/Set, Date, Regxp/Function, boxed primitives\n        return aObjType === bObjType && objTypeCallbacks[aObjType](a, b);\n      }\n\n      // NOTE: Literal null must not make it here as it would throw\n      if (compareConstructors(a, b) === false) {\n        return false;\n      }\n      var aProperties = [];\n      var bProperties = [];\n\n      // Be strict and go deep, no filtering with hasOwnProperty.\n      for (var i in a) {\n        // Collect a's properties\n        aProperties.push(i);\n\n        // Skip OOP methods that look the same\n        if (a.constructor !== Object && typeof a.constructor !== 'undefined' && typeof a[i] === 'function' && typeof b[i] === 'function' && a[i].toString() === b[i].toString()) {\n          continue;\n        }\n        if (!typeEquiv(a[i], b[i])) {\n          return false;\n        }\n      }\n      for (var _i in b) {\n        // Collect b's properties\n        bProperties.push(_i);\n      }\n      return objTypeCallbacks.array(aProperties.sort(), bProperties.sort());\n    }\n  };\n  function typeEquiv(a, b) {\n    // Optimization: Only perform type-specific comparison when pairs are not strictly equal.\n    if (a === b) {\n      return true;\n    }\n    var aType = _typeof(a);\n    var bType = _typeof(b);\n    if (aType !== bType) {\n      // Support comparing primitive to boxed primitives\n      // Try again after possibly unwrapping one\n      return (aType === 'object' && BOXABLE_TYPES.has(objectType(a)) ? a.valueOf() : a) === (bType === 'object' && BOXABLE_TYPES.has(objectType(b)) ? b.valueOf() : b);\n    }\n    return entryTypeCallbacks[aType](a, b);\n  }\n  function innerEquiv(a, b) {\n    var res = typeEquiv(a, b);\n    // Release any retained objects and reset recursion detection for next call\n    memory = [];\n    return res;\n  }\n\n  /**\n   * Test any two types of JavaScript values for equality.\n   *\n   * @author Philippe Rathé <prathe@gmail.com>\n   * @author David Chan <david@troi.org>\n   */\n  function equiv(a, b) {\n    if (arguments.length === 2) {\n      return a === b || innerEquiv(a, b);\n    }\n\n    // Given 0 or 1 arguments, just return true (nothing to compare).\n    // Given (A,B,C,D) compare C,D then B,C then A,B.\n    var i = arguments.length - 1;\n    while (i > 0) {\n      if (!innerEquiv(arguments[i - 1], arguments[i])) {\n        return false;\n      }\n      i--;\n    }\n    return true;\n  }\n\n  /**\n   * Config object: Maintain internal state\n   * Later exposed as QUnit.config\n   * `config` initialized at top of scope\n   */\n  var config = {\n    // HTML Reporter: Modify document.title when suite is done\n    altertitle: true,\n    // HTML Reporter: collapse every test except the first failing test\n    // If false, all failing tests will be expanded\n    collapse: true,\n    // whether or not to fail when there are zero tests\n    // defaults to `true`\n    failOnZeroTests: true,\n    // Select by pattern or case-insenstive substring match against \"moduleName: testName\"\n    filter: undefined,\n    // Depth up-to which object will be dumped\n    maxDepth: 5,\n    // Select case-insensitive match of the module name\n    module: undefined,\n    // HTML Reporter: Select module/test by array of internal IDs\n    moduleId: undefined,\n    // By default, run previously failed tests first\n    // very useful in combination with \"Hide passed tests\" checked\n    reorder: true,\n    // When enabled, all tests must call expect()\n    requireExpects: false,\n    // By default, scroll to top of the page when suite is done\n    scrolltop: true,\n    // The storage module to use for reordering tests\n    storage: localSessionStorage,\n    testId: undefined,\n    // HTML Reporter: List of URL parameters that are given visual controls\n    urlConfig: [],\n    // Internal: The first unnamed module\n    //\n    // By being defined as the intial value for currentModule, it is the\n    // receptacle and implied parent for any global tests. It is as if we\n    // called `QUnit.module( \"\" );` before any other tests were defined.\n    //\n    // If we reach begin() and no tests were put in it, we dequeue it as if it\n    // never existed, and in that case never expose it to the events and\n    // callbacks API.\n    //\n    // When global tests are defined, then this unnamed module will execute\n    // as any other module, including moduleStart/moduleDone events etc.\n    //\n    // Since this module isn't explicitly created by the user, they have no\n    // access to add hooks for it. The hooks object is defined to comply\n    // with internal expectations of test.js, but they will be empty.\n    // To apply hooks, place tests explicitly in a QUnit.module(), and use\n    // its hooks accordingly.\n    //\n    // For global hooks that apply to all tests and all modules, use QUnit.hooks.\n    //\n    // NOTE: This is *not* a \"global module\". It is not an ancestor of all modules\n    // and tests. It is merely the parent for any tests defined globally,\n    // before the first QUnit.module(). As such, the events for this unnamed\n    // module will fire as normal, right after its last test, and *not* at\n    // the end of the test run.\n    //\n    // NOTE: This also should probably also not become a global module, unless\n    // we keep it out of the public API. For example, it would likely not\n    // improve the user interface and plugin behaviour if all modules became\n    // wrapped between the start and end events of this module, and thus\n    // needlessly add indentation, indirection, or other visible noise.\n    // Unit tests for the callbacks API would detect that as a regression.\n    currentModule: {\n      name: '',\n      tests: [],\n      childModules: [],\n      testsRun: 0,\n      testsIgnored: 0,\n      hooks: {\n        before: [],\n        beforeEach: [],\n        afterEach: [],\n        after: []\n      }\n    },\n    // Internal: Exposed to make resets easier\n    // Ref https://github.com/qunitjs/qunit/pull/1598\n    globalHooks: {},\n    // Internal state\n    blocking: true,\n    callbacks: {},\n    modules: [],\n    queue: [],\n    stats: {\n      all: 0,\n      bad: 0,\n      testCount: 0\n    }\n  };\n\n  // Apply a predefined QUnit.config object\n  //\n  // Ignore QUnit.config if it is a QUnit distribution instead of preconfig.\n  // That means QUnit was loaded twice! (Use the same approach as export.js)\n  var preConfig = g && g.QUnit && !g.QUnit.version && g.QUnit.config;\n  if (preConfig) {\n    extend(config, preConfig);\n  }\n\n  // Push a loose unnamed module to the modules collection\n  config.modules.push(config.currentModule);\n\n  var dump = (function () {\n    function quote(str) {\n      return '\"' + str.toString().replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"') + '\"';\n    }\n    function literal(o) {\n      return o + '';\n    }\n    function join(pre, arr, post) {\n      var s = dump.separator();\n      var inner = dump.indent(1);\n      if (arr.join) {\n        arr = arr.join(',' + s + inner);\n      }\n      if (!arr) {\n        return pre + post;\n      }\n      var base = dump.indent();\n      return [pre, inner + arr, base + post].join(s);\n    }\n    function array(arr, stack) {\n      if (dump.maxDepth && dump.depth > dump.maxDepth) {\n        return '[object Array]';\n      }\n      this.up();\n      var i = arr.length;\n      var ret = new Array(i);\n      while (i--) {\n        ret[i] = this.parse(arr[i], undefined, stack);\n      }\n      this.down();\n      return join('[', ret, ']');\n    }\n    function isArray(obj) {\n      return (\n        // Native Arrays\n        toString.call(obj) === '[object Array]' ||\n        // NodeList objects\n        typeof obj.length === 'number' && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined)\n      );\n    }\n    var reName = /^function (\\w+)/;\n    var dump = {\n      // The objType is used mostly internally, you can fix a (custom) type in advance\n      parse: function parse(obj, objType, stack) {\n        stack = stack || [];\n        var objIndex = stack.indexOf(obj);\n        if (objIndex !== -1) {\n          return \"recursion(\".concat(objIndex - stack.length, \")\");\n        }\n        objType = objType || this.typeOf(obj);\n        var parser = this.parsers[objType];\n        var parserType = _typeof(parser);\n        if (parserType === 'function') {\n          stack.push(obj);\n          var res = parser.call(this, obj, stack);\n          stack.pop();\n          return res;\n        }\n        if (parserType === 'string') {\n          return parser;\n        }\n        return '[ERROR: Missing QUnit.dump formatter for type ' + objType + ']';\n      },\n      typeOf: function typeOf(obj) {\n        var type;\n        if (obj === null) {\n          type = 'null';\n        } else if (typeof obj === 'undefined') {\n          type = 'undefined';\n        } else if (is('regexp', obj)) {\n          type = 'regexp';\n        } else if (is('date', obj)) {\n          type = 'date';\n        } else if (is('function', obj)) {\n          type = 'function';\n        } else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) {\n          type = 'window';\n        } else if (obj.nodeType === 9) {\n          type = 'document';\n        } else if (obj.nodeType) {\n          type = 'node';\n        } else if (isArray(obj)) {\n          type = 'array';\n        } else if (obj.constructor === Error.prototype.constructor) {\n          type = 'error';\n        } else {\n          type = _typeof(obj);\n        }\n        return type;\n      },\n      separator: function separator() {\n        if (this.multiline) {\n          return this.HTML ? '<br />' : '\\n';\n        } else {\n          return this.HTML ? '&#160;' : ' ';\n        }\n      },\n      // Extra can be a number, shortcut for increasing-calling-decreasing\n      indent: function indent(extra) {\n        if (!this.multiline) {\n          return '';\n        }\n        var chr = this.indentChar;\n        if (this.HTML) {\n          chr = chr.replace(/\\t/g, '   ').replace(/ /g, '&#160;');\n        }\n        return new Array(this.depth + (extra || 0)).join(chr);\n      },\n      up: function up(a) {\n        this.depth += a || 1;\n      },\n      down: function down(a) {\n        this.depth -= a || 1;\n      },\n      setParser: function setParser(name, parser) {\n        this.parsers[name] = parser;\n      },\n      // The next 3 are exposed so you can use them\n      quote: quote,\n      literal: literal,\n      join: join,\n      depth: 1,\n      maxDepth: config.maxDepth,\n      // This is the list of parsers, to modify them, use dump.setParser\n      parsers: {\n        window: '[Window]',\n        document: '[Document]',\n        error: function error(_error) {\n          return 'Error(\"' + _error.message + '\")';\n        },\n        // This has been unused since QUnit 1.0.0.\n        // @todo Deprecate and remove.\n        unknown: '[Unknown]',\n        null: 'null',\n        undefined: 'undefined',\n        function: function _function(fn) {\n          var ret = 'function';\n\n          // Functions never have name in IE\n          var name = 'name' in fn ? fn.name : (reName.exec(fn) || [])[1];\n          if (name) {\n            ret += ' ' + name;\n          }\n          ret += '(';\n          ret = [ret, dump.parse(fn, 'functionArgs'), '){'].join('');\n          return join(ret, dump.parse(fn, 'functionCode'), '}');\n        },\n        array: array,\n        nodelist: array,\n        arguments: array,\n        object: function object(map, stack) {\n          var ret = [];\n          if (dump.maxDepth && dump.depth > dump.maxDepth) {\n            return '[object Object]';\n          }\n          dump.up();\n          var keys = [];\n          for (var key in map) {\n            keys.push(key);\n          }\n\n          // Some properties are not always enumerable on Error objects.\n          var nonEnumerableProperties = ['message', 'name'];\n          for (var i in nonEnumerableProperties) {\n            var _key = nonEnumerableProperties[i];\n            if (_key in map && !inArray(_key, keys)) {\n              keys.push(_key);\n            }\n          }\n          keys.sort();\n          for (var _i = 0; _i < keys.length; _i++) {\n            var _key2 = keys[_i];\n            var val = map[_key2];\n            ret.push(dump.parse(_key2, 'key') + ': ' + dump.parse(val, undefined, stack));\n          }\n          dump.down();\n          return join('{', ret, '}');\n        },\n        node: function node(_node) {\n          var open = dump.HTML ? '&lt;' : '<';\n          var close = dump.HTML ? '&gt;' : '>';\n          var tag = _node.nodeName.toLowerCase();\n          var ret = open + tag;\n          var attrs = _node.attributes;\n          if (attrs) {\n            for (var i = 0; i < attrs.length; i++) {\n              var val = attrs[i].nodeValue;\n\n              // IE6 includes all attributes in .attributes, even ones not explicitly\n              // set. Those have values like undefined, null, 0, false, \"\" or\n              // \"inherit\".\n              if (val && val !== 'inherit') {\n                ret += ' ' + attrs[i].nodeName + '=' + dump.parse(val, 'attribute');\n              }\n            }\n          }\n          ret += close;\n\n          // Show content of TextNode or CDATASection\n          if (_node.nodeType === 3 || _node.nodeType === 4) {\n            ret += _node.nodeValue;\n          }\n          return ret + open + '/' + tag + close;\n        },\n        // Function calls it internally, it's the arguments part of the function\n        functionArgs: function functionArgs(fn) {\n          var l = fn.length;\n          if (!l) {\n            return '';\n          }\n          var args = new Array(l);\n          while (l--) {\n            // 97 is 'a'\n            args[l] = String.fromCharCode(97 + l);\n          }\n          return ' ' + args.join(', ') + ' ';\n        },\n        // Object calls it internally, the key part of an item in a map\n        key: quote,\n        // Function calls it internally, it's the content of the function\n        functionCode: '[code]',\n        // Node calls it internally, it's a html attribute value\n        attribute: quote,\n        string: quote,\n        date: quote,\n        regexp: literal,\n        number: literal,\n        boolean: literal,\n        symbol: function symbol(sym) {\n          return sym.toString();\n        }\n      },\n      // If true, entities are escaped ( <, >, \\t, space and \\n )\n      HTML: false,\n      // Indentation unit\n      indentChar: '  ',\n      // If true, items in a collection, are separated by a \\n, else just a space.\n      multiline: true\n    };\n    return dump;\n  })();\n\n  var SuiteReport = /*#__PURE__*/function () {\n    function SuiteReport(name, parentSuite) {\n      _classCallCheck(this, SuiteReport);\n      this.name = name;\n      this.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];\n\n      // When an \"error\" event is emitted from onUncaughtException(), the\n      // \"runEnd\" event should report the status as failed. The \"runEnd\" event data\n      // is tracked through this property (via the \"runSuite\" instance).\n      this.globalFailureCount = 0;\n      this.tests = [];\n      this.childSuites = [];\n      if (parentSuite) {\n        parentSuite.pushChildSuite(this);\n      }\n    }\n    _createClass(SuiteReport, [{\n      key: \"start\",\n      value: function start(recordTime) {\n        if (recordTime) {\n          this._startTime = performance.now();\n          var suiteLevel = this.fullName.length;\n          performance.mark(\"qunit_suite_\".concat(suiteLevel, \"_start\"));\n        }\n        return {\n          name: this.name,\n          fullName: this.fullName.slice(),\n          tests: this.tests.map(function (test) {\n            return test.start();\n          }),\n          childSuites: this.childSuites.map(function (suite) {\n            return suite.start();\n          }),\n          testCounts: {\n            total: this.getTestCounts().total\n          }\n        };\n      }\n    }, {\n      key: \"end\",\n      value: function end(recordTime) {\n        if (recordTime) {\n          this._endTime = performance.now();\n          var suiteLevel = this.fullName.length;\n          var suiteName = this.fullName.join(' – ');\n          performance.mark(\"qunit_suite_\".concat(suiteLevel, \"_end\"));\n          performance.measure(suiteLevel === 0 ? 'QUnit Test Run' : \"QUnit Test Suite: \".concat(suiteName), \"qunit_suite_\".concat(suiteLevel, \"_start\"), \"qunit_suite_\".concat(suiteLevel, \"_end\"));\n        }\n        return {\n          name: this.name,\n          fullName: this.fullName.slice(),\n          tests: this.tests.map(function (test) {\n            return test.end();\n          }),\n          childSuites: this.childSuites.map(function (suite) {\n            return suite.end();\n          }),\n          testCounts: this.getTestCounts(),\n          runtime: this.getRuntime(),\n          status: this.getStatus()\n        };\n      }\n    }, {\n      key: \"pushChildSuite\",\n      value: function pushChildSuite(suite) {\n        this.childSuites.push(suite);\n      }\n    }, {\n      key: \"pushTest\",\n      value: function pushTest(test) {\n        this.tests.push(test);\n      }\n    }, {\n      key: \"getRuntime\",\n      value: function getRuntime() {\n        return Math.round(this._endTime - this._startTime);\n      }\n    }, {\n      key: \"getTestCounts\",\n      value: function getTestCounts() {\n        var counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n          passed: 0,\n          failed: 0,\n          skipped: 0,\n          todo: 0,\n          total: 0\n        };\n        counts.failed += this.globalFailureCount;\n        counts.total += this.globalFailureCount;\n        counts = this.tests.reduce(function (counts, test) {\n          if (test.valid) {\n            counts[test.getStatus()]++;\n            counts.total++;\n          }\n          return counts;\n        }, counts);\n        return this.childSuites.reduce(function (counts, suite) {\n          return suite.getTestCounts(counts);\n        }, counts);\n      }\n    }, {\n      key: \"getStatus\",\n      value: function getStatus() {\n        var _this$getTestCounts = this.getTestCounts(),\n          total = _this$getTestCounts.total,\n          failed = _this$getTestCounts.failed,\n          skipped = _this$getTestCounts.skipped,\n          todo = _this$getTestCounts.todo;\n        if (failed) {\n          return 'failed';\n        } else {\n          if (skipped === total) {\n            return 'skipped';\n          } else if (todo === total) {\n            return 'todo';\n          } else {\n            return 'passed';\n          }\n        }\n      }\n    }]);\n    return SuiteReport;\n  }();\n\n  var moduleStack = [];\n  var runSuite = new SuiteReport();\n  function isParentModuleInQueue() {\n    var modulesInQueue = config.modules.filter(function (module) {\n      return !module.ignored;\n    }).map(function (module) {\n      return module.moduleId;\n    });\n    return moduleStack.some(function (module) {\n      return modulesInQueue.includes(module.moduleId);\n    });\n  }\n  function createModule(name, testEnvironment, modifiers) {\n    var parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;\n    var moduleName = parentModule !== null ? [parentModule.name, name].join(' > ') : name;\n    var parentSuite = parentModule ? parentModule.suiteReport : runSuite;\n    var skip = parentModule !== null && parentModule.skip || modifiers.skip;\n    var todo = parentModule !== null && parentModule.todo || modifiers.todo;\n    var env = {};\n    if (parentModule) {\n      extend(env, parentModule.testEnvironment);\n    }\n    extend(env, testEnvironment);\n    var module = {\n      name: moduleName,\n      parentModule: parentModule,\n      hooks: {\n        before: [],\n        beforeEach: [],\n        afterEach: [],\n        after: []\n      },\n      testEnvironment: env,\n      tests: [],\n      moduleId: generateHash(moduleName),\n      testsRun: 0,\n      testsIgnored: 0,\n      childModules: [],\n      suiteReport: new SuiteReport(name, parentSuite),\n      // Initialised by test.js when the module start executing,\n      // i.e. before the first test in this module (or a child).\n      stats: null,\n      // Pass along `skip` and `todo` properties from parent module, in case\n      // there is one, to childs. And use own otherwise.\n      // This property will be used to mark own tests and tests of child suites\n      // as either `skipped` or `todo`.\n      skip: skip,\n      todo: skip ? false : todo,\n      ignored: modifiers.ignored || false\n    };\n    if (parentModule) {\n      parentModule.childModules.push(module);\n    }\n    config.modules.push(module);\n    return module;\n  }\n  function setHookFromEnvironment(hooks, environment, name) {\n    var potentialHook = environment[name];\n    if (typeof potentialHook === 'function') {\n      hooks[name].push(potentialHook);\n    }\n    delete environment[name];\n  }\n  function makeSetHook(module, hookName) {\n    return function setHook(callback) {\n      if (config.currentModule !== module) {\n        Logger.warn('The `' + hookName + '` hook was called inside the wrong module (`' + config.currentModule.name + '`). ' + 'Instead, use hooks provided by the callback to the containing module (`' + module.name + '`). ' + 'This will become an error in QUnit 3.0.');\n      }\n      module.hooks[hookName].push(callback);\n    };\n  }\n  function processModule(name, options, executeNow) {\n    var modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    if (typeof options === 'function') {\n      executeNow = options;\n      options = undefined;\n    }\n    var module = createModule(name, options, modifiers);\n\n    // Transfer any initial hooks from the options object to the 'hooks' object\n    var testEnvironment = module.testEnvironment;\n    var hooks = module.hooks;\n    setHookFromEnvironment(hooks, testEnvironment, 'before');\n    setHookFromEnvironment(hooks, testEnvironment, 'beforeEach');\n    setHookFromEnvironment(hooks, testEnvironment, 'afterEach');\n    setHookFromEnvironment(hooks, testEnvironment, 'after');\n    var moduleFns = {\n      before: makeSetHook(module, 'before'),\n      beforeEach: makeSetHook(module, 'beforeEach'),\n      afterEach: makeSetHook(module, 'afterEach'),\n      after: makeSetHook(module, 'after')\n    };\n    var prevModule = config.currentModule;\n    config.currentModule = module;\n    if (typeof executeNow === 'function') {\n      moduleStack.push(module);\n      try {\n        var cbReturnValue = executeNow.call(module.testEnvironment, moduleFns);\n        if (cbReturnValue && typeof cbReturnValue.then === 'function') {\n          Logger.warn('Returning a promise from a module callback is not supported. ' + 'Instead, use hooks for async behavior. ' + 'This will become an error in QUnit 3.0.');\n        }\n      } finally {\n        // If the module closure threw an uncaught error during the load phase,\n        // we let this bubble up to global error handlers. But, not until after\n        // we teardown internal state to ensure correct module nesting.\n        // Ref https://github.com/qunitjs/qunit/issues/1478.\n        moduleStack.pop();\n        config.currentModule = module.parentModule || prevModule;\n      }\n    }\n  }\n  var focused$1 = false; // indicates that the \"only\" filter was used\n\n  function module$1(name, options, executeNow) {\n    var ignored = focused$1 && !isParentModuleInQueue();\n    processModule(name, options, executeNow, {\n      ignored: ignored\n    });\n  }\n  module$1.only = function () {\n    if (!focused$1) {\n      // Upon the first module.only() call,\n      // delete any and all previously registered modules and tests.\n      config.modules.length = 0;\n      config.queue.length = 0;\n\n      // Ignore any tests declared after this block within the same\n      // module parent. https://github.com/qunitjs/qunit/issues/1645\n      config.currentModule.ignored = true;\n    }\n    focused$1 = true;\n    processModule.apply(void 0, arguments);\n  };\n  module$1.skip = function (name, options, executeNow) {\n    if (focused$1) {\n      return;\n    }\n    processModule(name, options, executeNow, {\n      skip: true\n    });\n  };\n  module$1.todo = function (name, options, executeNow) {\n    if (focused$1) {\n      return;\n    }\n    processModule(name, options, executeNow, {\n      todo: true\n    });\n  };\n\n  // Doesn't support IE9, it will return undefined on these browsers\n  // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\n  var fileName = (sourceFromStacktrace(0) || '').replace(/(:\\d+)+\\)?/, '')\n  // Remove anything prior to the last slash (Unix/Windows)\n  // from the last frame\n  .replace(/.+[/\\\\]/, '');\n  function extractStacktrace(e, offset) {\n    offset = offset === undefined ? 4 : offset;\n    if (e && e.stack) {\n      var stack = e.stack.split('\\n');\n      if (/^error$/i.test(stack[0])) {\n        stack.shift();\n      }\n      if (fileName) {\n        var include = [];\n        for (var i = offset; i < stack.length; i++) {\n          if (stack[i].indexOf(fileName) !== -1) {\n            break;\n          }\n          include.push(stack[i]);\n        }\n        if (include.length) {\n          return include.join('\\n');\n        }\n      }\n      return stack[offset];\n    }\n  }\n  function sourceFromStacktrace(offset) {\n    var error = new Error();\n\n    // Support: Safari <=7 only, IE <=10 - 11 only\n    // Not all browsers generate the `stack` property for `new Error()`, see also #636\n    if (!error.stack) {\n      try {\n        throw error;\n      } catch (err) {\n        error = err;\n      }\n    }\n    return extractStacktrace(error, offset);\n  }\n\n  var Assert = /*#__PURE__*/function () {\n    function Assert(testContext) {\n      _classCallCheck(this, Assert);\n      this.test = testContext;\n    }\n    _createClass(Assert, [{\n      key: \"timeout\",\n      value: function timeout(duration) {\n        if (typeof duration !== 'number') {\n          throw new Error('You must pass a number as the duration to assert.timeout');\n        }\n        this.test.timeout = duration;\n\n        // If a timeout has been set, clear it and reset with the new duration\n        if (config.timeout) {\n          clearTimeout(config.timeout);\n          config.timeout = null;\n          if (config.timeoutHandler && this.test.timeout > 0) {\n            this.test.internalResetTimeout(this.test.timeout);\n          }\n        }\n      }\n\n      // Documents a \"step\", which is a string value, in a test as a passing assertion\n    }, {\n      key: \"step\",\n      value: function step(message) {\n        var assertionMessage = message;\n        var result = !!message;\n        this.test.steps.push(message);\n        if (typeof message === 'undefined' || message === '') {\n          assertionMessage = 'You must provide a message to assert.step';\n        } else if (typeof message !== 'string') {\n          assertionMessage = 'You must provide a string value to assert.step';\n          result = false;\n        }\n        this.pushResult({\n          result: result,\n          message: assertionMessage\n        });\n      }\n\n      // Verifies the steps in a test match a given array of string values\n    }, {\n      key: \"verifySteps\",\n      value: function verifySteps(steps, message) {\n        // Since the steps array is just string values, we can clone with slice\n        var actualStepsClone = this.test.steps.slice();\n        this.deepEqual(actualStepsClone, steps, message);\n        this.test.steps.length = 0;\n      }\n    }, {\n      key: \"expect\",\n      value: function expect(asserts) {\n        if (arguments.length === 1) {\n          this.test.expected = asserts;\n        } else {\n          return this.test.expected;\n        }\n      }\n\n      // Create a new async pause and return a new function that can release the pause.\n    }, {\n      key: \"async\",\n      value: function async(count) {\n        var requiredCalls = count === undefined ? 1 : count;\n        return this.test.internalStop(requiredCalls);\n      }\n\n      // Exports test.push() to the user API\n      // Alias of pushResult.\n    }, {\n      key: \"push\",\n      value: function push(result, actual, expected, message, negative) {\n        Logger.warn('assert.push is deprecated and will be removed in QUnit 3.0.' + ' Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult).');\n        var currentAssert = this instanceof Assert ? this : config.current.assert;\n        return currentAssert.pushResult({\n          result: result,\n          actual: actual,\n          expected: expected,\n          message: message,\n          negative: negative\n        });\n      }\n    }, {\n      key: \"pushResult\",\n      value: function pushResult(resultInfo) {\n        // Destructure of resultInfo = { result, actual, expected, message, negative }\n        var assert = this;\n        var currentTest = assert instanceof Assert && assert.test || config.current;\n\n        // Backwards compatibility fix.\n        // Allows the direct use of global exported assertions and QUnit.assert.*\n        // Although, it's use is not recommended as it can leak assertions\n        // to other tests from async tests, because we only get a reference to the current test,\n        // not exactly the test where assertion were intended to be called.\n        if (!currentTest) {\n          throw new Error('assertion outside test context, in ' + sourceFromStacktrace(2));\n        }\n        if (!(assert instanceof Assert)) {\n          assert = currentTest.assert;\n        }\n        return assert.test.pushResult(resultInfo);\n      }\n    }, {\n      key: \"ok\",\n      value: function ok(result, message) {\n        if (!message) {\n          message = result ? 'okay' : \"failed, expected argument to be truthy, was: \".concat(dump.parse(result));\n        }\n        this.pushResult({\n          result: !!result,\n          actual: result,\n          expected: true,\n          message: message\n        });\n      }\n    }, {\n      key: \"notOk\",\n      value: function notOk(result, message) {\n        if (!message) {\n          message = !result ? 'okay' : \"failed, expected argument to be falsy, was: \".concat(dump.parse(result));\n        }\n        this.pushResult({\n          result: !result,\n          actual: result,\n          expected: false,\n          message: message\n        });\n      }\n    }, {\n      key: \"true\",\n      value: function _true(result, message) {\n        this.pushResult({\n          result: result === true,\n          actual: result,\n          expected: true,\n          message: message\n        });\n      }\n    }, {\n      key: \"false\",\n      value: function _false(result, message) {\n        this.pushResult({\n          result: result === false,\n          actual: result,\n          expected: false,\n          message: message\n        });\n      }\n    }, {\n      key: \"equal\",\n      value: function equal(actual, expected, message) {\n        this.pushResult({\n          // eslint-disable-next-line eqeqeq\n          result: expected == actual,\n          actual: actual,\n          expected: expected,\n          message: message\n        });\n      }\n    }, {\n      key: \"notEqual\",\n      value: function notEqual(actual, expected, message) {\n        this.pushResult({\n          // eslint-disable-next-line eqeqeq\n          result: expected != actual,\n          actual: actual,\n          expected: expected,\n          message: message,\n          negative: true\n        });\n      }\n    }, {\n      key: \"propEqual\",\n      value: function propEqual(actual, expected, message) {\n        actual = objectValues(actual);\n        expected = objectValues(expected);\n        this.pushResult({\n          result: equiv(actual, expected),\n          actual: actual,\n          expected: expected,\n          message: message\n        });\n      }\n    }, {\n      key: \"notPropEqual\",\n      value: function notPropEqual(actual, expected, message) {\n        actual = objectValues(actual);\n        expected = objectValues(expected);\n        this.pushResult({\n          result: !equiv(actual, expected),\n          actual: actual,\n          expected: expected,\n          message: message,\n          negative: true\n        });\n      }\n    }, {\n      key: \"propContains\",\n      value: function propContains(actual, expected, message) {\n        actual = objectValuesSubset(actual, expected);\n\n        // The expected parameter is usually a plain object, but clone it for\n        // consistency with propEqual(), and to make it easy to explain that\n        // inheritence is not considered (on either side), and to support\n        // recursively checking subsets of nested objects.\n        expected = objectValues(expected, false);\n        this.pushResult({\n          result: equiv(actual, expected),\n          actual: actual,\n          expected: expected,\n          message: message\n        });\n      }\n    }, {\n      key: \"notPropContains\",\n      value: function notPropContains(actual, expected, message) {\n        actual = objectValuesSubset(actual, expected);\n        expected = objectValues(expected);\n        this.pushResult({\n          result: !equiv(actual, expected),\n          actual: actual,\n          expected: expected,\n          message: message,\n          negative: true\n        });\n      }\n    }, {\n      key: \"deepEqual\",\n      value: function deepEqual(actual, expected, message) {\n        this.pushResult({\n          result: equiv(actual, expected),\n          actual: actual,\n          expected: expected,\n          message: message\n        });\n      }\n    }, {\n      key: \"notDeepEqual\",\n      value: function notDeepEqual(actual, expected, message) {\n        this.pushResult({\n          result: !equiv(actual, expected),\n          actual: actual,\n          expected: expected,\n          message: message,\n          negative: true\n        });\n      }\n    }, {\n      key: \"strictEqual\",\n      value: function strictEqual(actual, expected, message) {\n        this.pushResult({\n          result: expected === actual,\n          actual: actual,\n          expected: expected,\n          message: message\n        });\n      }\n    }, {\n      key: \"notStrictEqual\",\n      value: function notStrictEqual(actual, expected, message) {\n        this.pushResult({\n          result: expected !== actual,\n          actual: actual,\n          expected: expected,\n          message: message,\n          negative: true\n        });\n      }\n    }, {\n      key: 'throws',\n      value: function throws(block, expected, message) {\n        var _validateExpectedExce = validateExpectedExceptionArgs(expected, message, 'throws');\n        var _validateExpectedExce2 = _slicedToArray(_validateExpectedExce, 2);\n        expected = _validateExpectedExce2[0];\n        message = _validateExpectedExce2[1];\n        var currentTest = this instanceof Assert && this.test || config.current;\n        if (typeof block !== 'function') {\n          currentTest.assert.pushResult({\n            result: false,\n            actual: block,\n            message: 'The value provided to `assert.throws` in ' + '\"' + currentTest.testName + '\" was not a function.'\n          });\n          return;\n        }\n        var actual;\n        var result = false;\n        currentTest.ignoreGlobalErrors = true;\n        try {\n          block.call(currentTest.testEnvironment);\n        } catch (e) {\n          actual = e;\n        }\n        currentTest.ignoreGlobalErrors = false;\n        if (actual) {\n          var _validateException = validateException(actual, expected, message);\n          var _validateException2 = _slicedToArray(_validateException, 3);\n          result = _validateException2[0];\n          expected = _validateException2[1];\n          message = _validateException2[2];\n        }\n        currentTest.assert.pushResult({\n          result: result,\n          // undefined if it didn't throw\n          actual: actual && errorString(actual),\n          expected: expected,\n          message: message\n        });\n      }\n    }, {\n      key: \"rejects\",\n      value: function rejects(promise, expected, message) {\n        var _validateExpectedExce3 = validateExpectedExceptionArgs(expected, message, 'rejects');\n        var _validateExpectedExce4 = _slicedToArray(_validateExpectedExce3, 2);\n        expected = _validateExpectedExce4[0];\n        message = _validateExpectedExce4[1];\n        var currentTest = this instanceof Assert && this.test || config.current;\n        var then = promise && promise.then;\n        if (typeof then !== 'function') {\n          currentTest.assert.pushResult({\n            result: false,\n            message: 'The value provided to `assert.rejects` in ' + '\"' + currentTest.testName + '\" was not a promise.',\n            actual: promise\n          });\n          return;\n        }\n        var done = this.async();\n        return then.call(promise, function handleFulfillment() {\n          currentTest.assert.pushResult({\n            result: false,\n            message: 'The promise returned by the `assert.rejects` callback in ' + '\"' + currentTest.testName + '\" did not reject.',\n            actual: promise\n          });\n          done();\n        }, function handleRejection(actual) {\n          var result;\n          var _validateException3 = validateException(actual, expected, message);\n          var _validateException4 = _slicedToArray(_validateException3, 3);\n          result = _validateException4[0];\n          expected = _validateException4[1];\n          message = _validateException4[2];\n          currentTest.assert.pushResult({\n            result: result,\n            // leave rejection value of undefined as-is\n            actual: actual && errorString(actual),\n            expected: expected,\n            message: message\n          });\n          done();\n        });\n      }\n    }]);\n    return Assert;\n  }();\n  function validateExpectedExceptionArgs(expected, message, assertionMethod) {\n    var expectedType = objectType(expected);\n\n    // 'expected' is optional unless doing string comparison\n    if (expectedType === 'string') {\n      if (message === undefined) {\n        message = expected;\n        expected = undefined;\n        return [expected, message];\n      } else {\n        throw new Error('assert.' + assertionMethod + ' does not accept a string value for the expected argument.\\n' + 'Use a non-string object value (e.g. RegExp or validator function) ' + 'instead if necessary.');\n      }\n    }\n    var valid = !expected ||\n    // TODO: be more explicit here\n    expectedType === 'regexp' || expectedType === 'function' || expectedType === 'object';\n    if (!valid) {\n      throw new Error('Invalid expected value type (' + expectedType + ') ' + 'provided to assert.' + assertionMethod + '.');\n    }\n    return [expected, message];\n  }\n  function validateException(actual, expected, message) {\n    var result = false;\n    var expectedType = objectType(expected);\n\n    // These branches should be exhaustive, based on validation done in validateExpectedException\n\n    // We don't want to validate\n    if (!expected) {\n      result = true;\n\n      // Expected is a regexp\n    } else if (expectedType === 'regexp') {\n      result = expected.test(errorString(actual));\n\n      // Log the string form of the regexp\n      expected = String(expected);\n\n      // Expected is a constructor, maybe an Error constructor.\n      // Note the extra check on its prototype - this is an implicit\n      // requirement of \"instanceof\", else it will throw a TypeError.\n    } else if (expectedType === 'function' && expected.prototype !== undefined && actual instanceof expected) {\n      result = true;\n\n      // Expected is an Error object\n    } else if (expectedType === 'object') {\n      result = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;\n\n      // Log the string form of the Error object\n      expected = errorString(expected);\n\n      // Expected is a validation function which returns true if validation passed\n    } else if (expectedType === 'function') {\n      // protect against accidental semantics which could hard error in the test\n      try {\n        result = expected.call({}, actual) === true;\n        expected = null;\n      } catch (e) {\n        // assign the \"expected\" to a nice error string to communicate the local failure to the user\n        expected = errorString(e);\n      }\n    }\n    return [result, expected, message];\n  }\n\n  // Provide an alternative to assert.throws(), for environments that consider throws a reserved word\n  // Known to us are: Closure Compiler, Narwhal\n  // eslint-disable-next-line dot-notation\n  Assert.prototype.raises = Assert.prototype['throws'];\n\n  var LISTENERS = Object.create(null);\n  var SUPPORTED_EVENTS = ['error', 'runStart', 'suiteStart', 'testStart', 'assertion', 'testEnd', 'suiteEnd', 'runEnd'];\n\n  /**\n   * Emits an event with the specified data to all currently registered listeners.\n   * Callbacks will fire in the order in which they are registered (FIFO). This\n   * function is not exposed publicly; it is used by QUnit internals to emit\n   * logging events.\n   *\n   * @private\n   * @method emit\n   * @param {string} eventName\n   * @param {Object} data\n   * @return {void}\n   */\n  function emit(eventName, data) {\n    if (typeof eventName !== 'string') {\n      throw new TypeError('eventName must be a string when emitting an event');\n    }\n\n    // Clone the callbacks in case one of them registers a new callback\n    var originalCallbacks = LISTENERS[eventName];\n    var callbacks = originalCallbacks ? _toConsumableArray(originalCallbacks) : [];\n    for (var i = 0; i < callbacks.length; i++) {\n      callbacks[i](data);\n    }\n  }\n\n  /**\n   * Registers a callback as a listener to the specified event.\n   *\n   * @public\n   * @method on\n   * @param {string} eventName\n   * @param {Function} callback\n   * @return {void}\n   */\n  function on(eventName, callback) {\n    if (typeof eventName !== 'string') {\n      throw new TypeError('eventName must be a string when registering a listener');\n    } else if (!inArray(eventName, SUPPORTED_EVENTS)) {\n      var events = SUPPORTED_EVENTS.join(', ');\n      throw new Error(\"\\\"\".concat(eventName, \"\\\" is not a valid event; must be one of: \").concat(events, \".\"));\n    } else if (typeof callback !== 'function') {\n      throw new TypeError('callback must be a function when registering a listener');\n    }\n    if (!LISTENERS[eventName]) {\n      LISTENERS[eventName] = [];\n    }\n\n    // Don't register the same callback more than once\n    if (!inArray(callback, LISTENERS[eventName])) {\n      LISTENERS[eventName].push(callback);\n    }\n  }\n\n  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n  function commonjsRequire (path) {\n  \tthrow new Error('Could not dynamically require \"' + path + '\". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');\n  }\n\n  var promisePolyfill = {exports: {}};\n\n  (function () {\n\n    /** @suppress {undefinedVars} */\n    var globalNS = function () {\n      // the only reliable means to get the global object is\n      // `Function('return this')()`\n      // However, this causes CSP violations in Chrome apps.\n      if (typeof globalThis !== 'undefined') {\n        return globalThis;\n      }\n      if (typeof self !== 'undefined') {\n        return self;\n      }\n      if (typeof window !== 'undefined') {\n        return window;\n      }\n      if (typeof commonjsGlobal !== 'undefined') {\n        return commonjsGlobal;\n      }\n      throw new Error('unable to locate global object');\n    }();\n\n    // Expose the polyfill if Promise is undefined or set to a\n    // non-function value. The latter can be due to a named HTMLElement\n    // being exposed by browsers for legacy reasons.\n    // https://github.com/taylorhakes/promise-polyfill/issues/114\n    if (typeof globalNS['Promise'] === 'function') {\n      promisePolyfill.exports = globalNS['Promise'];\n      return;\n    }\n\n    /**\n     * @this {Promise}\n     */\n    function finallyConstructor(callback) {\n      var constructor = this.constructor;\n      return this.then(function (value) {\n        // @ts-ignore\n        return constructor.resolve(callback()).then(function () {\n          return value;\n        });\n      }, function (reason) {\n        // @ts-ignore\n        return constructor.resolve(callback()).then(function () {\n          // @ts-ignore\n          return constructor.reject(reason);\n        });\n      });\n    }\n    function allSettled(arr) {\n      var P = this;\n      return new P(function (resolve, reject) {\n        if (!(arr && typeof arr.length !== 'undefined')) {\n          return reject(new TypeError(_typeof(arr) + ' ' + arr + ' is not iterable(cannot read property Symbol(Symbol.iterator))'));\n        }\n        var args = Array.prototype.slice.call(arr);\n        if (args.length === 0) return resolve([]);\n        var remaining = args.length;\n        function res(i, val) {\n          if (val && (_typeof(val) === 'object' || typeof val === 'function')) {\n            var then = val.then;\n            if (typeof then === 'function') {\n              then.call(val, function (val) {\n                res(i, val);\n              }, function (e) {\n                args[i] = {\n                  status: 'rejected',\n                  reason: e\n                };\n                if (--remaining === 0) {\n                  resolve(args);\n                }\n              });\n              return;\n            }\n          }\n          args[i] = {\n            status: 'fulfilled',\n            value: val\n          };\n          if (--remaining === 0) {\n            resolve(args);\n          }\n        }\n        for (var i = 0; i < args.length; i++) {\n          res(i, args[i]);\n        }\n      });\n    }\n\n    // Store setTimeout reference so promise-polyfill will be unaffected by\n    // other code modifying setTimeout (like sinon.useFakeTimers())\n    var setTimeoutFunc = setTimeout;\n    function isArray(x) {\n      return Boolean(x && typeof x.length !== 'undefined');\n    }\n    function noop() {}\n\n    // Polyfill for Function.prototype.bind\n    function bind(fn, thisArg) {\n      return function () {\n        fn.apply(thisArg, arguments);\n      };\n    }\n\n    /**\n     * @constructor\n     * @param {Function} fn\n     */\n    function Promise(fn) {\n      if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new');\n      if (typeof fn !== 'function') throw new TypeError('not a function');\n      /** @type {!number} */\n      this._state = 0;\n      /** @type {!boolean} */\n      this._handled = false;\n      /** @type {Promise|undefined} */\n      this._value = undefined;\n      /** @type {!Array<!Function>} */\n      this._deferreds = [];\n      doResolve(fn, this);\n    }\n    function handle(self, deferred) {\n      while (self._state === 3) {\n        self = self._value;\n      }\n      if (self._state === 0) {\n        self._deferreds.push(deferred);\n        return;\n      }\n      self._handled = true;\n      Promise._immediateFn(function () {\n        var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n        if (cb === null) {\n          (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n          return;\n        }\n        var ret;\n        try {\n          ret = cb(self._value);\n        } catch (e) {\n          reject(deferred.promise, e);\n          return;\n        }\n        resolve(deferred.promise, ret);\n      });\n    }\n    function resolve(self, newValue) {\n      try {\n        // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n        if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');\n        if (newValue && (_typeof(newValue) === 'object' || typeof newValue === 'function')) {\n          var then = newValue.then;\n          if (newValue instanceof Promise) {\n            self._state = 3;\n            self._value = newValue;\n            finale(self);\n            return;\n          } else if (typeof then === 'function') {\n            doResolve(bind(then, newValue), self);\n            return;\n          }\n        }\n        self._state = 1;\n        self._value = newValue;\n        finale(self);\n      } catch (e) {\n        reject(self, e);\n      }\n    }\n    function reject(self, newValue) {\n      self._state = 2;\n      self._value = newValue;\n      finale(self);\n    }\n    function finale(self) {\n      if (self._state === 2 && self._deferreds.length === 0) {\n        Promise._immediateFn(function () {\n          if (!self._handled) {\n            Promise._unhandledRejectionFn(self._value);\n          }\n        });\n      }\n      for (var i = 0, len = self._deferreds.length; i < len; i++) {\n        handle(self, self._deferreds[i]);\n      }\n      self._deferreds = null;\n    }\n\n    /**\n     * @constructor\n     */\n    function Handler(onFulfilled, onRejected, promise) {\n      this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n      this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n      this.promise = promise;\n    }\n\n    /**\n     * Take a potentially misbehaving resolver function and make sure\n     * onFulfilled and onRejected are only called once.\n     *\n     * Makes no guarantees about asynchrony.\n     */\n    function doResolve(fn, self) {\n      var done = false;\n      try {\n        fn(function (value) {\n          if (done) return;\n          done = true;\n          resolve(self, value);\n        }, function (reason) {\n          if (done) return;\n          done = true;\n          reject(self, reason);\n        });\n      } catch (ex) {\n        if (done) return;\n        done = true;\n        reject(self, ex);\n      }\n    }\n    Promise.prototype['catch'] = function (onRejected) {\n      return this.then(null, onRejected);\n    };\n    Promise.prototype.then = function (onFulfilled, onRejected) {\n      // @ts-ignore\n      var prom = new this.constructor(noop);\n      handle(this, new Handler(onFulfilled, onRejected, prom));\n      return prom;\n    };\n    Promise.prototype['finally'] = finallyConstructor;\n    Promise.all = function (arr) {\n      return new Promise(function (resolve, reject) {\n        if (!isArray(arr)) {\n          return reject(new TypeError('Promise.all accepts an array'));\n        }\n        var args = Array.prototype.slice.call(arr);\n        if (args.length === 0) return resolve([]);\n        var remaining = args.length;\n        function res(i, val) {\n          try {\n            if (val && (_typeof(val) === 'object' || typeof val === 'function')) {\n              var then = val.then;\n              if (typeof then === 'function') {\n                then.call(val, function (val) {\n                  res(i, val);\n                }, reject);\n                return;\n              }\n            }\n            args[i] = val;\n            if (--remaining === 0) {\n              resolve(args);\n            }\n          } catch (ex) {\n            reject(ex);\n          }\n        }\n        for (var i = 0; i < args.length; i++) {\n          res(i, args[i]);\n        }\n      });\n    };\n    Promise.allSettled = allSettled;\n    Promise.resolve = function (value) {\n      if (value && _typeof(value) === 'object' && value.constructor === Promise) {\n        return value;\n      }\n      return new Promise(function (resolve) {\n        resolve(value);\n      });\n    };\n    Promise.reject = function (value) {\n      return new Promise(function (resolve, reject) {\n        reject(value);\n      });\n    };\n    Promise.race = function (arr) {\n      return new Promise(function (resolve, reject) {\n        if (!isArray(arr)) {\n          return reject(new TypeError('Promise.race accepts an array'));\n        }\n        for (var i = 0, len = arr.length; i < len; i++) {\n          Promise.resolve(arr[i]).then(resolve, reject);\n        }\n      });\n    };\n\n    // Use polyfill for setImmediate for performance gains\n    Promise._immediateFn =\n    // @ts-ignore\n    typeof setImmediate === 'function' && function (fn) {\n      // @ts-ignore\n      setImmediate(fn);\n    } || function (fn) {\n      setTimeoutFunc(fn, 0);\n    };\n    Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n      if (typeof console !== 'undefined' && console) {\n        console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n      }\n    };\n\n    promisePolyfill.exports = Promise;\n  })();\n  var _Promise = promisePolyfill.exports;\n\n  // Register logging callbacks\n  function registerLoggingCallbacks(obj) {\n    var callbackNames = ['begin', 'done', 'log', 'testStart', 'testDone', 'moduleStart', 'moduleDone'];\n    function registerLoggingCallback(key) {\n      return function loggingCallback(callback) {\n        if (typeof callback !== 'function') {\n          throw new Error('Callback parameter must be a function');\n        }\n        config.callbacks[key].push(callback);\n      };\n    }\n    for (var i = 0; i < callbackNames.length; i++) {\n      var key = callbackNames[i];\n\n      // Initialize key collection of logging callback\n      if (typeof config.callbacks[key] === 'undefined') {\n        config.callbacks[key] = [];\n      }\n      obj[key] = registerLoggingCallback(key);\n    }\n  }\n  function runLoggingCallbacks(key, args) {\n    var callbacks = config.callbacks[key];\n\n    // Handling 'log' callbacks separately. Unlike the other callbacks,\n    // the log callback is not controlled by the processing queue,\n    // but rather used by asserts. Hence to promisfy the 'log' callback\n    // would mean promisfying each step of a test\n    if (key === 'log') {\n      callbacks.map(function (callback) {\n        return callback(args);\n      });\n      return;\n    }\n\n    // ensure that each callback is executed serially\n    var promiseChain = _Promise.resolve();\n    callbacks.forEach(function (callback) {\n      promiseChain = promiseChain.then(function () {\n        return _Promise.resolve(callback(args));\n      });\n    });\n    return promiseChain;\n  }\n\n  var priorityCount = 0;\n  var unitSampler;\n\n  // This is a queue of functions that are tasks within a single test.\n  // After tests are dequeued from config.queue they are expanded into\n  // a set of tasks in this queue.\n  var taskQueue = [];\n\n  /**\n   * Advances the taskQueue to the next task. If the taskQueue is empty,\n   * process the testQueue\n   */\n  function advance() {\n    advanceTaskQueue();\n    if (!taskQueue.length && !config.blocking && !config.current) {\n      advanceTestQueue();\n    }\n  }\n\n  /**\n   * Advances the taskQueue with an increased depth\n   */\n  function advanceTaskQueue() {\n    var start = performance.now();\n    config.depth = (config.depth || 0) + 1;\n    processTaskQueue(start);\n    config.depth--;\n  }\n\n  /**\n   * Process the first task on the taskQueue as a promise.\n   * Each task is a function added by Test#queue() in /src/test.js\n   */\n  function processTaskQueue(start) {\n    if (taskQueue.length && !config.blocking) {\n      var elapsedTime = performance.now() - start;\n\n      // The updateRate ensures that a user interface (HTML Reporter) can be updated\n      // at least once every second. This can also prevent browsers from prompting\n      // a warning about long running scripts.\n      if (!setTimeout$1 || config.updateRate <= 0 || elapsedTime < config.updateRate) {\n        var task = taskQueue.shift();\n        _Promise.resolve(task()).then(function () {\n          if (!taskQueue.length) {\n            advance();\n          } else {\n            processTaskQueue(start);\n          }\n        });\n      } else {\n        setTimeout$1(advance);\n      }\n    }\n  }\n\n  /**\n   * Advance the testQueue to the next test to process. Call done() if testQueue completes.\n   */\n  function advanceTestQueue() {\n    if (!config.blocking && !config.queue.length && config.depth === 0) {\n      done();\n      return;\n    }\n    var testTasks = config.queue.shift();\n    addToTaskQueue(testTasks());\n    if (priorityCount > 0) {\n      priorityCount--;\n    }\n    advance();\n  }\n\n  /**\n   * Enqueue the tasks for a test into the task queue.\n   * @param {Array} tasksArray\n   */\n  function addToTaskQueue(tasksArray) {\n    taskQueue.push.apply(taskQueue, _toConsumableArray(tasksArray));\n  }\n\n  /**\n   * Return the number of tasks remaining in the task queue to be processed.\n   * @return {number}\n   */\n  function taskQueueLength() {\n    return taskQueue.length;\n  }\n\n  /**\n   * Adds a test to the TestQueue for execution.\n   * @param {Function} testTasksFunc\n   * @param {boolean} prioritize\n   * @param {string} seed\n   */\n  function addToTestQueue(testTasksFunc, prioritize, seed) {\n    if (prioritize) {\n      config.queue.splice(priorityCount++, 0, testTasksFunc);\n    } else if (seed) {\n      if (!unitSampler) {\n        unitSampler = unitSamplerGenerator(seed);\n      }\n\n      // Insert into a random position after all prioritized items\n      var index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));\n      config.queue.splice(priorityCount + index, 0, testTasksFunc);\n    } else {\n      config.queue.push(testTasksFunc);\n    }\n  }\n\n  /**\n   * Creates a seeded \"sample\" generator which is used for randomizing tests.\n   */\n  function unitSamplerGenerator(seed) {\n    // 32-bit xorshift, requires only a nonzero seed\n    // https://excamera.com/sphinx/article-xorshift.html\n    var sample = parseInt(generateHash(seed), 16) || -1;\n    return function () {\n      sample ^= sample << 13;\n      sample ^= sample >>> 17;\n      sample ^= sample << 5;\n\n      // ECMAScript has no unsigned number type\n      if (sample < 0) {\n        sample += 0x100000000;\n      }\n      return sample / 0x100000000;\n    };\n  }\n\n  /**\n   * This function is called when the ProcessingQueue is done processing all\n   * items. It handles emitting the final run events.\n   */\n  function done() {\n    // We have reached the end of the processing queue and are about to emit the\n    // \"runEnd\" event after which reporters typically stop listening and exit\n    // the process. First, check if we need to emit one final test.\n    if (config.stats.testCount === 0 && config.failOnZeroTests === true) {\n      var error;\n      if (config.filter && config.filter.length) {\n        error = new Error(\"No tests matched the filter \\\"\".concat(config.filter, \"\\\".\"));\n      } else if (config.module && config.module.length) {\n        error = new Error(\"No tests matched the module \\\"\".concat(config.module, \"\\\".\"));\n      } else if (config.moduleId && config.moduleId.length) {\n        error = new Error(\"No tests matched the moduleId \\\"\".concat(config.moduleId, \"\\\".\"));\n      } else if (config.testId && config.testId.length) {\n        error = new Error(\"No tests matched the testId \\\"\".concat(config.testId, \"\\\".\"));\n      } else {\n        error = new Error('No tests were run.');\n      }\n      test('global failure', extend(function (assert) {\n        assert.pushResult({\n          result: false,\n          message: error.message,\n          source: error.stack\n        });\n      }, {\n        validTest: true\n      }));\n\n      // We do need to call `advance()` in order to resume the processing queue.\n      // Once this new test is finished processing, we'll reach `done` again, and\n      // that time the above condition will evaluate to false.\n      advance();\n      return;\n    }\n    var storage = config.storage;\n    var runtime = Math.round(performance.now() - config.started);\n    var passed = config.stats.all - config.stats.bad;\n    ProcessingQueue.finished = true;\n    emit('runEnd', runSuite.end(true));\n    runLoggingCallbacks('done', {\n      // @deprecated since 2.19.0 Use done() without `details` parameter,\n      // or use `QUnit.on('runEnd')` instead. Parameter to be replaced in\n      // QUnit 3.0 with test counts.\n      passed: passed,\n      failed: config.stats.bad,\n      total: config.stats.all,\n      runtime: runtime\n    }).then(function () {\n      // Clear own storage items if all tests passed\n      if (storage && config.stats.bad === 0) {\n        for (var i = storage.length - 1; i >= 0; i--) {\n          var key = storage.key(i);\n          if (key.indexOf('qunit-test-') === 0) {\n            storage.removeItem(key);\n          }\n        }\n      }\n    });\n  }\n  var ProcessingQueue = {\n    finished: false,\n    add: addToTestQueue,\n    advance: advance,\n    taskCount: taskQueueLength\n  };\n\n  var TestReport = /*#__PURE__*/function () {\n    function TestReport(name, suite, options) {\n      _classCallCheck(this, TestReport);\n      this.name = name;\n      this.suiteName = suite.name;\n      this.fullName = suite.fullName.concat(name);\n      this.runtime = 0;\n      this.assertions = [];\n      this.skipped = !!options.skip;\n      this.todo = !!options.todo;\n      this.valid = options.valid;\n      this._startTime = 0;\n      this._endTime = 0;\n      suite.pushTest(this);\n    }\n    _createClass(TestReport, [{\n      key: \"start\",\n      value: function start(recordTime) {\n        if (recordTime) {\n          this._startTime = performance.now();\n          performance.mark('qunit_test_start');\n        }\n        return {\n          name: this.name,\n          suiteName: this.suiteName,\n          fullName: this.fullName.slice()\n        };\n      }\n    }, {\n      key: \"end\",\n      value: function end(recordTime) {\n        if (recordTime) {\n          this._endTime = performance.now();\n          if (performance) {\n            performance.mark('qunit_test_end');\n            var testName = this.fullName.join(' – ');\n            performance.measure(\"QUnit Test: \".concat(testName), 'qunit_test_start', 'qunit_test_end');\n          }\n        }\n        return extend(this.start(), {\n          runtime: this.getRuntime(),\n          status: this.getStatus(),\n          errors: this.getFailedAssertions(),\n          assertions: this.getAssertions()\n        });\n      }\n    }, {\n      key: \"pushAssertion\",\n      value: function pushAssertion(assertion) {\n        this.assertions.push(assertion);\n      }\n    }, {\n      key: \"getRuntime\",\n      value: function getRuntime() {\n        return Math.round(this._endTime - this._startTime);\n      }\n    }, {\n      key: \"getStatus\",\n      value: function getStatus() {\n        if (this.skipped) {\n          return 'skipped';\n        }\n        var testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;\n        if (!testPassed) {\n          return 'failed';\n        } else if (this.todo) {\n          return 'todo';\n        } else {\n          return 'passed';\n        }\n      }\n    }, {\n      key: \"getFailedAssertions\",\n      value: function getFailedAssertions() {\n        return this.assertions.filter(function (assertion) {\n          return !assertion.passed;\n        });\n      }\n    }, {\n      key: \"getAssertions\",\n      value: function getAssertions() {\n        return this.assertions.slice();\n      }\n\n      // Remove actual and expected values from assertions. This is to prevent\n      // leaking memory throughout a test suite.\n    }, {\n      key: \"slimAssertions\",\n      value: function slimAssertions() {\n        this.assertions = this.assertions.map(function (assertion) {\n          delete assertion.actual;\n          delete assertion.expected;\n          return assertion;\n        });\n      }\n    }]);\n    return TestReport;\n  }();\n\n  function Test(settings) {\n    this.expected = null;\n    this.assertions = [];\n    this.module = config.currentModule;\n    this.steps = [];\n    this.timeout = undefined;\n    this.data = undefined;\n    this.withData = false;\n    this.pauses = new StringMap();\n    this.nextPauseId = 1;\n\n    // For the most common case, we have:\n    // - 0: new Test\n    // - 1: addTest\n    // - 2: QUnit.test\n    // - 3: user file\n    //\n    // This needs is customised by test.each()\n    this.stackOffset = 3;\n    extend(this, settings);\n\n    // If a module is skipped, all its tests and the tests of the child suites\n    // should be treated as skipped even if they are defined as `only` or `todo`.\n    // As for `todo` module, all its tests will be treated as `todo` except for\n    // tests defined as `skip` which will be left intact.\n    //\n    // So, if a test is defined as `todo` and is inside a skipped module, we should\n    // then treat that test as if was defined as `skip`.\n    if (this.module.skip) {\n      this.skip = true;\n      this.todo = false;\n\n      // Skipped tests should be left intact\n    } else if (this.module.todo && !this.skip) {\n      this.todo = true;\n    }\n\n    // Queuing a late test after the run has ended is not allowed.\n    // This was once supported for internal use by QUnit.onError().\n    // Ref https://github.com/qunitjs/qunit/issues/1377\n    if (ProcessingQueue.finished) {\n      // Using this for anything other than onError(), such as testing in QUnit.done(),\n      // is unstable and will likely result in the added tests being ignored by CI.\n      // (Meaning the CI passes irregardless of the added tests).\n      //\n      // TODO: Make this an error in QUnit 3.0\n      // throw new Error( \"Unexpected test after runEnd\" );\n      Logger.warn('Unexpected test after runEnd. This is unstable and will fail in QUnit 3.0.');\n      return;\n    }\n    if (!this.skip && typeof this.callback !== 'function') {\n      var method = this.todo ? 'QUnit.todo' : 'QUnit.test';\n      throw new TypeError(\"You must provide a callback to \".concat(method, \"(\\\"\").concat(this.testName, \"\\\")\"));\n    }\n\n    // Register unique strings\n    for (var i = 0, l = this.module.tests; i < l.length; i++) {\n      if (this.module.tests[i].name === this.testName) {\n        this.testName += ' ';\n      }\n    }\n    this.testId = generateHash(this.module.name, this.testName);\n\n    // No validation after this. Beyond this point, failures must be recorded as\n    // a completed test with errors, instead of early bail out.\n    // Otherwise, internals may be left in an inconsistent state.\n    // Ref https://github.com/qunitjs/qunit/issues/1514\n\n    ++Test.count;\n    this.errorForStack = new Error();\n    if (this.callback && this.callback.validTest) {\n      // Omit the test-level trace for the internal \"No tests\" test failure,\n      // There is already an assertion-level trace, and that's noisy enough\n      // as it is.\n      this.errorForStack.stack = undefined;\n    }\n    this.testReport = new TestReport(this.testName, this.module.suiteReport, {\n      todo: this.todo,\n      skip: this.skip,\n      valid: this.valid()\n    });\n    this.module.tests.push({\n      name: this.testName,\n      testId: this.testId,\n      skip: !!this.skip\n    });\n    if (this.skip) {\n      // Skipped tests will fully ignore any sent callback\n      this.callback = function () {};\n      this.async = false;\n      this.expected = 0;\n    } else {\n      this.assert = new Assert(this);\n    }\n  }\n  Test.count = 0;\n  function getNotStartedModules(startModule) {\n    var module = startModule;\n    var modules = [];\n    while (module && module.testsRun === 0) {\n      modules.push(module);\n      module = module.parentModule;\n    }\n\n    // The above push modules from the child to the parent\n    // return a reversed order with the top being the top most parent module\n    return modules.reverse();\n  }\n  Test.prototype = {\n    // Use a getter to avoid computing a stack trace (which can be expensive),\n    // This is displayed by the HTML Reporter, but most other integrations do\n    // not access it.\n    get stack() {\n      return extractStacktrace(this.errorForStack, this.stackOffset);\n    },\n    before: function before() {\n      var _this = this;\n      var module = this.module;\n      var notStartedModules = getNotStartedModules(module);\n\n      // ensure the callbacks are executed serially for each module\n      var moduleStartChain = _Promise.resolve();\n      notStartedModules.forEach(function (startModule) {\n        moduleStartChain = moduleStartChain.then(function () {\n          startModule.stats = {\n            all: 0,\n            bad: 0,\n            started: performance.now()\n          };\n          emit('suiteStart', startModule.suiteReport.start(true));\n          return runLoggingCallbacks('moduleStart', {\n            name: startModule.name,\n            tests: startModule.tests\n          });\n        });\n      });\n      return moduleStartChain.then(function () {\n        config.current = _this;\n        _this.testEnvironment = extend({}, module.testEnvironment);\n        _this.started = performance.now();\n        emit('testStart', _this.testReport.start(true));\n        return runLoggingCallbacks('testStart', {\n          name: _this.testName,\n          module: module.name,\n          testId: _this.testId,\n          previousFailure: _this.previousFailure\n        }).then(function () {\n          if (!config.pollution) {\n            saveGlobal();\n          }\n        });\n      });\n    },\n    run: function run() {\n      config.current = this;\n      if (config.notrycatch) {\n        runTest(this);\n        return;\n      }\n      try {\n        runTest(this);\n      } catch (e) {\n        this.pushFailure('Died on test #' + (this.assertions.length + 1) + ': ' + (e.message || e) + '\\n' + this.stack, extractStacktrace(e, 0));\n\n        // Else next test will carry the responsibility\n        saveGlobal();\n\n        // Restart the tests if they're blocking\n        if (config.blocking) {\n          internalRecover(this);\n        }\n      }\n      function runTest(test) {\n        var promise;\n        if (test.withData) {\n          promise = test.callback.call(test.testEnvironment, test.assert, test.data);\n        } else {\n          promise = test.callback.call(test.testEnvironment, test.assert);\n        }\n        test.resolvePromise(promise);\n\n        // If the test has an async \"pause\" on it, but the timeout is 0, then we push a\n        // failure as the test should be synchronous.\n        if (test.timeout === 0 && test.pauses.size > 0) {\n          pushFailure('Test did not finish synchronously even though assert.timeout( 0 ) was used.', sourceFromStacktrace(2));\n        }\n      }\n    },\n    after: function after() {\n      checkPollution();\n    },\n    queueGlobalHook: function queueGlobalHook(hook, hookName) {\n      var _this2 = this;\n      var runHook = function runHook() {\n        config.current = _this2;\n        var promise;\n        if (config.notrycatch) {\n          promise = hook.call(_this2.testEnvironment, _this2.assert);\n        } else {\n          try {\n            promise = hook.call(_this2.testEnvironment, _this2.assert);\n          } catch (error) {\n            _this2.pushFailure('Global ' + hookName + ' failed on ' + _this2.testName + ': ' + errorString(error), extractStacktrace(error, 0));\n            return;\n          }\n        }\n        _this2.resolvePromise(promise, hookName);\n      };\n      return runHook;\n    },\n    queueHook: function queueHook(hook, hookName, hookOwner) {\n      var _this3 = this;\n      var callHook = function callHook() {\n        var promise = hook.call(_this3.testEnvironment, _this3.assert);\n        _this3.resolvePromise(promise, hookName);\n      };\n      var runHook = function runHook() {\n        if (hookName === 'before') {\n          if (hookOwner.testsRun !== 0) {\n            return;\n          }\n          _this3.preserveEnvironment = true;\n        }\n\n        // The 'after' hook should only execute when there are not tests left and\n        // when the 'after' and 'finish' tasks are the only tasks left to process\n        if (hookName === 'after' && !lastTestWithinModuleExecuted(hookOwner) && (config.queue.length > 0 || ProcessingQueue.taskCount() > 2)) {\n          return;\n        }\n        config.current = _this3;\n        if (config.notrycatch) {\n          callHook();\n          return;\n        }\n        try {\n          // This try-block includes the indirect call to resolvePromise, which shouldn't\n          // have to be inside try-catch. But, since we support any user-provided thenable\n          // object, the thenable might throw in some unexpected way.\n          // This subtle behaviour is undocumented. To avoid new failures in minor releases\n          // we will not change this until QUnit 3.\n          // TODO: In QUnit 3, reduce this try-block to just hook.call(), matching\n          // the simplicity of queueGlobalHook.\n          callHook();\n        } catch (error) {\n          _this3.pushFailure(hookName + ' failed on ' + _this3.testName + ': ' + (error.message || error), extractStacktrace(error, 0));\n        }\n      };\n      return runHook;\n    },\n    // Currently only used for module level hooks, can be used to add global level ones\n    hooks: function hooks(handler) {\n      var hooks = [];\n      function processGlobalhooks(test) {\n        if ((handler === 'beforeEach' || handler === 'afterEach') && config.globalHooks[handler]) {\n          for (var i = 0; i < config.globalHooks[handler].length; i++) {\n            hooks.push(test.queueGlobalHook(config.globalHooks[handler][i], handler));\n          }\n        }\n      }\n      function processHooks(test, module) {\n        if (module.parentModule) {\n          processHooks(test, module.parentModule);\n        }\n        if (module.hooks[handler].length) {\n          for (var i = 0; i < module.hooks[handler].length; i++) {\n            hooks.push(test.queueHook(module.hooks[handler][i], handler, module));\n          }\n        }\n      }\n\n      // Hooks are ignored on skipped tests\n      if (!this.skip) {\n        processGlobalhooks(this);\n        processHooks(this, this.module);\n      }\n      return hooks;\n    },\n    finish: function finish() {\n      config.current = this;\n\n      // Release the test callback to ensure that anything referenced has been\n      // released to be garbage collected.\n      this.callback = undefined;\n      if (this.steps.length) {\n        var stepsList = this.steps.join(', ');\n        this.pushFailure('Expected assert.verifySteps() to be called before end of test ' + \"after using assert.step(). Unverified steps: \".concat(stepsList), this.stack);\n      }\n      if (config.requireExpects && this.expected === null) {\n        this.pushFailure('Expected number of assertions to be defined, but expect() was ' + 'not called.', this.stack);\n      } else if (this.expected !== null && this.expected !== this.assertions.length) {\n        this.pushFailure('Expected ' + this.expected + ' assertions, but ' + this.assertions.length + ' were run', this.stack);\n      } else if (this.expected === null && !this.assertions.length) {\n        this.pushFailure('Expected at least one assertion, but none were run - call ' + 'expect(0) to accept zero assertions.', this.stack);\n      }\n      var module = this.module;\n      var moduleName = module.name;\n      var testName = this.testName;\n      var skipped = !!this.skip;\n      var todo = !!this.todo;\n      var bad = 0;\n      var storage = config.storage;\n      this.runtime = Math.round(performance.now() - this.started);\n      config.stats.all += this.assertions.length;\n      config.stats.testCount += 1;\n      module.stats.all += this.assertions.length;\n      for (var i = 0; i < this.assertions.length; i++) {\n        // A failing assertion will counts toward the HTML Reporter's\n        // \"X assertions, Y failed\" line even if it was inside a todo.\n        // Inverting this would be similarly confusing since all but the last\n        // passing assertion inside a todo test should be considered as good.\n        // These stats don't decide the outcome of anything, so counting them\n        // as failing seems the most intuitive.\n        if (!this.assertions[i].result) {\n          bad++;\n          config.stats.bad++;\n          module.stats.bad++;\n        }\n      }\n      if (skipped) {\n        incrementTestsIgnored(module);\n      } else {\n        incrementTestsRun(module);\n      }\n\n      // Store result when possible.\n      // Note that this also marks todo tests as bad, thus they get hoisted,\n      // and always run first on refresh.\n      if (storage) {\n        if (bad) {\n          storage.setItem('qunit-test-' + moduleName + '-' + testName, bad);\n        } else {\n          storage.removeItem('qunit-test-' + moduleName + '-' + testName);\n        }\n      }\n\n      // After emitting the js-reporters event we cleanup the assertion data to\n      // avoid leaking it. It is not used by the legacy testDone callbacks.\n      emit('testEnd', this.testReport.end(true));\n      this.testReport.slimAssertions();\n      var test = this;\n      return runLoggingCallbacks('testDone', {\n        name: testName,\n        module: moduleName,\n        skipped: skipped,\n        todo: todo,\n        failed: bad,\n        passed: this.assertions.length - bad,\n        total: this.assertions.length,\n        runtime: skipped ? 0 : this.runtime,\n        // HTML Reporter use\n        assertions: this.assertions,\n        testId: this.testId,\n        // Source of Test\n        // generating stack trace is expensive, so using a getter will help defer this until we need it\n        get source() {\n          return test.stack;\n        }\n      }).then(function () {\n        if (allTestsExecuted(module)) {\n          var completedModules = [module];\n\n          // Check if the parent modules, iteratively, are done. If that the case,\n          // we emit the `suiteEnd` event and trigger `moduleDone` callback.\n          var parent = module.parentModule;\n          while (parent && allTestsExecuted(parent)) {\n            completedModules.push(parent);\n            parent = parent.parentModule;\n          }\n          var moduleDoneChain = _Promise.resolve();\n          completedModules.forEach(function (completedModule) {\n            moduleDoneChain = moduleDoneChain.then(function () {\n              return logSuiteEnd(completedModule);\n            });\n          });\n          return moduleDoneChain;\n        }\n      }).then(function () {\n        config.current = undefined;\n      });\n      function logSuiteEnd(module) {\n        // Reset `module.hooks` to ensure that anything referenced in these hooks\n        // has been released to be garbage collected. Descendant modules that were\n        // entirely skipped, e.g. due to filtering, will never have this method\n        // called for them, but might have hooks with references pinning data in\n        // memory (even if the hooks weren't actually executed), so we reset the\n        // hooks on all descendant modules here as well. This is safe because we\n        // will never call this as long as any descendant modules still have tests\n        // to run. This also means that in multi-tiered nesting scenarios we might\n        // reset the hooks multiple times on some modules, but that's harmless.\n        var modules = [module];\n        while (modules.length) {\n          var nextModule = modules.shift();\n          nextModule.hooks = {};\n          modules.push.apply(modules, _toConsumableArray(nextModule.childModules));\n        }\n        emit('suiteEnd', module.suiteReport.end(true));\n        return runLoggingCallbacks('moduleDone', {\n          name: module.name,\n          tests: module.tests,\n          failed: module.stats.bad,\n          passed: module.stats.all - module.stats.bad,\n          total: module.stats.all,\n          runtime: Math.round(performance.now() - module.stats.started)\n        });\n      }\n    },\n    preserveTestEnvironment: function preserveTestEnvironment() {\n      if (this.preserveEnvironment) {\n        this.module.testEnvironment = this.testEnvironment;\n        this.testEnvironment = extend({}, this.module.testEnvironment);\n      }\n    },\n    queue: function queue() {\n      var test = this;\n      if (!this.valid()) {\n        incrementTestsIgnored(this.module);\n        return;\n      }\n      function runTest() {\n        return [function () {\n          return test.before();\n        }].concat(_toConsumableArray(test.hooks('before')), [function () {\n          test.preserveTestEnvironment();\n        }], _toConsumableArray(test.hooks('beforeEach')), [function () {\n          test.run();\n        }], _toConsumableArray(test.hooks('afterEach').reverse()), _toConsumableArray(test.hooks('after').reverse()), [function () {\n          test.after();\n        }, function () {\n          return test.finish();\n        }]);\n      }\n      var previousFailCount = config.storage && +config.storage.getItem('qunit-test-' + this.module.name + '-' + this.testName);\n\n      // Prioritize previously failed tests, detected from storage\n      var prioritize = config.reorder && !!previousFailCount;\n      this.previousFailure = !!previousFailCount;\n      ProcessingQueue.add(runTest, prioritize, config.seed);\n    },\n    pushResult: function pushResult(resultInfo) {\n      if (this !== config.current) {\n        var message = resultInfo && resultInfo.message || '';\n        var testName = this && this.testName || '';\n        var error = 'Assertion occurred after test finished.\\n' + '> Test: ' + testName + '\\n' + '> Message: ' + message + '\\n';\n        throw new Error(error);\n      }\n\n      // Destructure of resultInfo = { result, actual, expected, message, negative }\n      var details = {\n        module: this.module.name,\n        name: this.testName,\n        result: resultInfo.result,\n        message: resultInfo.message,\n        actual: resultInfo.actual,\n        testId: this.testId,\n        negative: resultInfo.negative || false,\n        runtime: Math.round(performance.now() - this.started),\n        todo: !!this.todo\n      };\n      if (hasOwn$1.call(resultInfo, 'expected')) {\n        details.expected = resultInfo.expected;\n      }\n      if (!resultInfo.result) {\n        var source = resultInfo.source || sourceFromStacktrace();\n        if (source) {\n          details.source = source;\n        }\n      }\n      this.logAssertion(details);\n      this.assertions.push({\n        result: !!resultInfo.result,\n        message: resultInfo.message\n      });\n    },\n    pushFailure: function pushFailure(message, source, actual) {\n      if (!(this instanceof Test)) {\n        throw new Error('pushFailure() assertion outside test context, was ' + sourceFromStacktrace(2));\n      }\n      this.pushResult({\n        result: false,\n        message: message || 'error',\n        actual: actual || null,\n        source: source\n      });\n    },\n    /**\n     * Log assertion details using both the old QUnit.log interface and\n     * QUnit.on( \"assertion\" ) interface.\n     *\n     * @private\n     */\n    logAssertion: function logAssertion(details) {\n      runLoggingCallbacks('log', details);\n      var assertion = {\n        passed: details.result,\n        actual: details.actual,\n        expected: details.expected,\n        message: details.message,\n        stack: details.source,\n        todo: details.todo\n      };\n      this.testReport.pushAssertion(assertion);\n      emit('assertion', assertion);\n    },\n    /**\n     * Reset config.timeout with a new timeout duration.\n     *\n     * @param {number} timeoutDuration\n     */\n    internalResetTimeout: function internalResetTimeout(timeoutDuration) {\n      clearTimeout(config.timeout);\n      config.timeout = setTimeout$1(config.timeoutHandler(timeoutDuration), timeoutDuration);\n    },\n    /**\n     * Create a new async pause and return a new function that can release the pause.\n     *\n     * This mechanism is internally used by:\n     *\n     * - explicit async pauses, created by calling `assert.async()`,\n     * - implicit async pauses, created when `QUnit.test()` or module hook callbacks\n     *   use async-await or otherwise return a Promise.\n     *\n     * Happy scenario:\n     *\n     * - Pause is created by calling internalStop().\n     *\n     *   Pause is released normally by invoking release() during the same test.\n     *\n     *   The release() callback lets internal processing resume.\n     *\n     * Failure scenarios:\n     *\n     * - The test fails due to an uncaught exception.\n     *\n     *   In this case, Test.run() will call internalRecover() which empties the clears all\n     *   async pauses and sets the cancelled flag, which means we silently ignore any\n     *   late calls to the resume() callback, as we will have moved on to a different\n     *   test by then, and we don't want to cause an extra \"release during a different test\"\n     *   errors that the developer isn't really responsible for. This can happen when a test\n     *   correctly schedules a call to release(), but also causes an uncaught error. The\n     *   uncaught error means we will no longer wait for the release (as it might not arrive).\n     *\n     * - Pause is never released, or called an insufficient number of times.\n     *\n     *   Our timeout handler will kill the pause and resume test processing, basically\n     *   like internalRecover(), but for one pause instead of any/all.\n     *\n     *   Here, too, any late calls to resume() will be silently ignored to avoid\n     *   extra errors. We tolerate this since the original test will have already been\n     *   marked as failure.\n     *\n     *   TODO: QUnit 3 will enable timeouts by default <https://github.com/qunitjs/qunit/issues/1483>,\n     *   but right now a test will hang indefinitely if async pauses are not released,\n     *   unless QUnit.config.testTimeout or assert.timeout() is used.\n     *\n     * - Pause is spontaneously released during a different test,\n     *   or when no test is currently running.\n     *\n     *   This is close to impossible because this error only happens if the original test\n     *   succesfully finished first (since other failure scenarios kill pauses and ignore\n     *   late calls). It can happen if a test ended exactly as expected, but has some\n     *   external or shared state continuing to hold a reference to the release callback,\n     *   and either the same test scheduled another call to it in the future, or a later test\n     *   causes it to be called through some shared state.\n     *\n     * - Pause release() is called too often, during the same test.\n     *\n     *   This simply throws an error, after which uncaught error handling picks it up\n     *   and processing resumes.\n     *\n     * @param {number} [requiredCalls=1]\n     */\n    internalStop: function internalStop() {\n      var requiredCalls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n      config.blocking = true;\n      var test = this;\n      var pauseId = this.nextPauseId++;\n      var pause = {\n        cancelled: false,\n        remaining: requiredCalls\n      };\n      test.pauses.set(pauseId, pause);\n      function release() {\n        if (pause.cancelled) {\n          return;\n        }\n        if (config.current === undefined) {\n          throw new Error('Unexpected release of async pause after tests finished.\\n' + \"> Test: \".concat(test.testName, \" [async #\").concat(pauseId, \"]\"));\n        }\n        if (config.current !== test) {\n          throw new Error('Unexpected release of async pause during a different test.\\n' + \"> Test: \".concat(test.testName, \" [async #\").concat(pauseId, \"]\"));\n        }\n        if (pause.remaining <= 0) {\n          throw new Error('Tried to release async pause that was already released.\\n' + \"> Test: \".concat(test.testName, \" [async #\").concat(pauseId, \"]\"));\n        }\n\n        // The `requiredCalls` parameter exists to support `assert.async(count)`\n        pause.remaining--;\n        if (pause.remaining === 0) {\n          test.pauses.delete(pauseId);\n        }\n        internalStart(test);\n      }\n\n      // Set a recovery timeout, if so configured.\n      if (setTimeout$1) {\n        var timeoutDuration;\n        if (typeof test.timeout === 'number') {\n          timeoutDuration = test.timeout;\n        } else if (typeof config.testTimeout === 'number') {\n          timeoutDuration = config.testTimeout;\n        }\n        if (typeof timeoutDuration === 'number' && timeoutDuration > 0) {\n          config.timeoutHandler = function (timeout) {\n            return function () {\n              config.timeout = null;\n              pause.cancelled = true;\n              test.pauses.delete(pauseId);\n              test.pushFailure(\"Test took longer than \".concat(timeout, \"ms; test timed out.\"), sourceFromStacktrace(2));\n              internalStart(test);\n            };\n          };\n          clearTimeout(config.timeout);\n          config.timeout = setTimeout$1(config.timeoutHandler(timeoutDuration), timeoutDuration);\n        }\n      }\n      return release;\n    },\n    resolvePromise: function resolvePromise(promise, phase) {\n      if (promise != null) {\n        var _test = this;\n        var then = promise.then;\n        if (typeof then === 'function') {\n          var resume = _test.internalStop();\n          var resolve = function resolve() {\n            resume();\n          };\n          if (config.notrycatch) {\n            then.call(promise, resolve);\n          } else {\n            var reject = function reject(error) {\n              var message = 'Promise rejected ' + (!phase ? 'during' : phase.replace(/Each$/, '')) + ' \"' + _test.testName + '\": ' + (error && error.message || error);\n              _test.pushFailure(message, extractStacktrace(error, 0));\n\n              // Else next test will carry the responsibility\n              saveGlobal();\n\n              // Unblock\n              internalRecover(_test);\n            };\n            then.call(promise, resolve, reject);\n          }\n        }\n      }\n    },\n    valid: function valid() {\n      // Internally-generated tests are always valid\n      if (this.callback && this.callback.validTest) {\n        return true;\n      }\n      function moduleChainIdMatch(testModule, selectedId) {\n        return (\n          // undefined or empty array\n          !selectedId || !selectedId.length || inArray(testModule.moduleId, selectedId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule, selectedId)\n        );\n      }\n      if (!moduleChainIdMatch(this.module, config.moduleId)) {\n        return false;\n      }\n      if (config.testId && config.testId.length && !inArray(this.testId, config.testId)) {\n        return false;\n      }\n      function moduleChainNameMatch(testModule, selectedModule) {\n        if (!selectedModule) {\n          // undefined or empty string\n          return true;\n        }\n        var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;\n        if (testModuleName === selectedModule) {\n          return true;\n        } else if (testModule.parentModule) {\n          return moduleChainNameMatch(testModule.parentModule, selectedModule);\n        } else {\n          return false;\n        }\n      }\n      var selectedModule = config.module && config.module.toLowerCase();\n      if (!moduleChainNameMatch(this.module, selectedModule)) {\n        return false;\n      }\n      var filter = config.filter;\n      if (!filter) {\n        return true;\n      }\n      var regexFilter = /^(!?)\\/([\\w\\W]*)\\/(i?$)/.exec(filter);\n      var fullName = this.module.name + ': ' + this.testName;\n      return regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName);\n    },\n    regexFilter: function regexFilter(exclude, pattern, flags, fullName) {\n      var regex = new RegExp(pattern, flags);\n      var match = regex.test(fullName);\n      return match !== exclude;\n    },\n    stringFilter: function stringFilter(filter, fullName) {\n      filter = filter.toLowerCase();\n      fullName = fullName.toLowerCase();\n      var include = filter.charAt(0) !== '!';\n      if (!include) {\n        filter = filter.slice(1);\n      }\n\n      // If the filter matches, we need to honour include\n      if (fullName.indexOf(filter) !== -1) {\n        return include;\n      }\n\n      // Otherwise, do the opposite\n      return !include;\n    }\n  };\n  function pushFailure() {\n    if (!config.current) {\n      throw new Error('pushFailure() assertion outside test context, in ' + sourceFromStacktrace(2));\n    }\n\n    // Gets current test obj\n    var currentTest = config.current;\n    return currentTest.pushFailure.apply(currentTest, arguments);\n  }\n  function saveGlobal() {\n    config.pollution = [];\n    if (config.noglobals) {\n      for (var key in g) {\n        if (hasOwn$1.call(g, key)) {\n          // In Opera sometimes DOM element ids show up here, ignore them\n          if (/^qunit-test-output/.test(key)) {\n            continue;\n          }\n          config.pollution.push(key);\n        }\n      }\n    }\n  }\n  function checkPollution() {\n    var old = config.pollution;\n    saveGlobal();\n    var newGlobals = diff(config.pollution, old);\n    if (newGlobals.length > 0) {\n      pushFailure('Introduced global variable(s): ' + newGlobals.join(', '));\n    }\n    var deletedGlobals = diff(old, config.pollution);\n    if (deletedGlobals.length > 0) {\n      pushFailure('Deleted global variable(s): ' + deletedGlobals.join(', '));\n    }\n  }\n  var focused = false; // indicates that the \"only\" filter was used\n\n  function addTest(settings) {\n    if (focused || config.currentModule.ignored) {\n      return;\n    }\n    var newTest = new Test(settings);\n    newTest.queue();\n  }\n  function addOnlyTest(settings) {\n    if (config.currentModule.ignored) {\n      return;\n    }\n    if (!focused) {\n      config.queue.length = 0;\n      focused = true;\n    }\n    var newTest = new Test(settings);\n    newTest.queue();\n  }\n\n  // Will be exposed as QUnit.test\n  function test(testName, callback) {\n    addTest({\n      testName: testName,\n      callback: callback\n    });\n  }\n  function makeEachTestName(testName, argument) {\n    return \"\".concat(testName, \" [\").concat(argument, \"]\");\n  }\n  function runEach(data, eachFn) {\n    if (Array.isArray(data)) {\n      for (var i = 0; i < data.length; i++) {\n        eachFn(data[i], i);\n      }\n    } else if (_typeof(data) === 'object' && data !== null) {\n      for (var key in data) {\n        eachFn(data[key], key);\n      }\n    } else {\n      throw new Error(\"test.each() expects an array or object as input, but\\nfound \".concat(_typeof(data), \" instead.\"));\n    }\n  }\n  extend(test, {\n    todo: function todo(testName, callback) {\n      addTest({\n        testName: testName,\n        callback: callback,\n        todo: true\n      });\n    },\n    skip: function skip(testName) {\n      addTest({\n        testName: testName,\n        skip: true\n      });\n    },\n    only: function only(testName, callback) {\n      addOnlyTest({\n        testName: testName,\n        callback: callback\n      });\n    },\n    each: function each(testName, dataset, callback) {\n      runEach(dataset, function (data, testKey) {\n        addTest({\n          testName: makeEachTestName(testName, testKey),\n          callback: callback,\n          withData: true,\n          stackOffset: 5,\n          data: data\n        });\n      });\n    }\n  });\n  test.todo.each = function (testName, dataset, callback) {\n    runEach(dataset, function (data, testKey) {\n      addTest({\n        testName: makeEachTestName(testName, testKey),\n        callback: callback,\n        todo: true,\n        withData: true,\n        stackOffset: 5,\n        data: data\n      });\n    });\n  };\n  test.skip.each = function (testName, dataset) {\n    runEach(dataset, function (_, testKey) {\n      addTest({\n        testName: makeEachTestName(testName, testKey),\n        stackOffset: 5,\n        skip: true\n      });\n    });\n  };\n  test.only.each = function (testName, dataset, callback) {\n    runEach(dataset, function (data, testKey) {\n      addOnlyTest({\n        testName: makeEachTestName(testName, testKey),\n        callback: callback,\n        withData: true,\n        stackOffset: 5,\n        data: data\n      });\n    });\n  };\n\n  // Forcefully release all processing holds.\n  function internalRecover(test) {\n    test.pauses.forEach(function (pause) {\n      pause.cancelled = true;\n    });\n    test.pauses.clear();\n    internalStart(test);\n  }\n\n  // Release a processing hold, scheduling a resumption attempt if no holds remain.\n  function internalStart(test) {\n    // Ignore if other async pauses still exist.\n    if (test.pauses.size > 0) {\n      return;\n    }\n\n    // Add a slight delay to allow more assertions etc.\n    if (setTimeout$1) {\n      clearTimeout(config.timeout);\n      config.timeout = setTimeout$1(function () {\n        if (test.pauses.size > 0) {\n          return;\n        }\n        clearTimeout(config.timeout);\n        config.timeout = null;\n        config.blocking = false;\n        ProcessingQueue.advance();\n      });\n    } else {\n      config.blocking = false;\n      ProcessingQueue.advance();\n    }\n  }\n  function collectTests(module) {\n    var tests = [].concat(module.tests);\n    var modules = _toConsumableArray(module.childModules);\n\n    // Do a breadth-first traversal of the child modules\n    while (modules.length) {\n      var nextModule = modules.shift();\n      tests.push.apply(tests, nextModule.tests);\n      modules.push.apply(modules, _toConsumableArray(nextModule.childModules));\n    }\n    return tests;\n  }\n\n  // This returns true after all executable and skippable tests\n  // in a module have been proccessed, and informs 'suiteEnd'\n  // and moduleDone().\n  function allTestsExecuted(module) {\n    return module.testsRun + module.testsIgnored === collectTests(module).length;\n  }\n\n  // This returns true during the last executable non-skipped test\n  // within a module, and informs the running of the 'after' hook\n  // for a given module. This runs only once for a given module,\n  // but must run during the last non-skipped test. When it runs,\n  // there may be non-zero skipped tests left.\n  function lastTestWithinModuleExecuted(module) {\n    return module.testsRun === collectTests(module).filter(function (test) {\n      return !test.skip;\n    }).length - 1;\n  }\n  function incrementTestsRun(module) {\n    module.testsRun++;\n    while (module = module.parentModule) {\n      module.testsRun++;\n    }\n  }\n  function incrementTestsIgnored(module) {\n    module.testsIgnored++;\n    while (module = module.parentModule) {\n      module.testsIgnored++;\n    }\n  }\n\n  /* global module, exports, define */\n  function exportQUnit(QUnit) {\n    var exportedModule = false;\n    if (window$1 && document) {\n      // QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined.\n      if (window$1.QUnit && window$1.QUnit.version) {\n        throw new Error('QUnit has already been defined.');\n      }\n      window$1.QUnit = QUnit;\n      exportedModule = true;\n    }\n\n    // For Node.js\n    if (typeof module !== 'undefined' && module && module.exports) {\n      module.exports = QUnit;\n\n      // For consistency with CommonJS environments' exports\n      module.exports.QUnit = QUnit;\n      exportedModule = true;\n    }\n\n    // For CommonJS with exports, but without module.exports, like Rhino\n    if (typeof exports !== 'undefined' && exports) {\n      exports.QUnit = QUnit;\n      exportedModule = true;\n    }\n\n    // For AMD\n    if (typeof define === 'function' && define.amd) {\n      define(function () {\n        return QUnit;\n      });\n      QUnit.config.autostart = false;\n      exportedModule = true;\n    }\n\n    // For other environments, including Web Workers (globalThis === self),\n    // SpiderMonkey (mozjs), and other embedded JavaScript engines\n    if (!exportedModule) {\n      g.QUnit = QUnit;\n    }\n  }\n\n  var ConsoleReporter = /*#__PURE__*/function () {\n    function ConsoleReporter(runner) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      _classCallCheck(this, ConsoleReporter);\n      // Cache references to console methods to ensure we can report failures\n      // from tests tests that mock the console object itself.\n      // https://github.com/qunitjs/qunit/issues/1340\n      // Support IE 9: Function#bind is supported, but no console.log.bind().\n      this.log = options.log || Function.prototype.bind.call(console$1.log, console$1);\n      runner.on('error', this.onError.bind(this));\n      runner.on('runStart', this.onRunStart.bind(this));\n      runner.on('testStart', this.onTestStart.bind(this));\n      runner.on('testEnd', this.onTestEnd.bind(this));\n      runner.on('runEnd', this.onRunEnd.bind(this));\n    }\n    _createClass(ConsoleReporter, [{\n      key: \"onError\",\n      value: function onError(error) {\n        this.log('error', error);\n      }\n    }, {\n      key: \"onRunStart\",\n      value: function onRunStart(runStart) {\n        this.log('runStart', runStart);\n      }\n    }, {\n      key: \"onTestStart\",\n      value: function onTestStart(test) {\n        this.log('testStart', test);\n      }\n    }, {\n      key: \"onTestEnd\",\n      value: function onTestEnd(test) {\n        this.log('testEnd', test);\n      }\n    }, {\n      key: \"onRunEnd\",\n      value: function onRunEnd(runEnd) {\n        this.log('runEnd', runEnd);\n      }\n    }], [{\n      key: \"init\",\n      value: function init(runner, options) {\n        return new ConsoleReporter(runner, options);\n      }\n    }]);\n    return ConsoleReporter;\n  }();\n\n  var FORCE_COLOR,\n    NODE_DISABLE_COLORS,\n    NO_COLOR,\n    TERM,\n    isTTY = true;\n  if (typeof process !== 'undefined') {\n    var _ref = process.env || {};\n    FORCE_COLOR = _ref.FORCE_COLOR;\n    NODE_DISABLE_COLORS = _ref.NODE_DISABLE_COLORS;\n    NO_COLOR = _ref.NO_COLOR;\n    TERM = _ref.TERM;\n    isTTY = process.stdout && process.stdout.isTTY;\n  }\n  var $ = {\n    enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== 'dumb' && (FORCE_COLOR != null && FORCE_COLOR !== '0' || isTTY),\n    // modifiers\n    reset: init(0, 0),\n    bold: init(1, 22),\n    dim: init(2, 22),\n    italic: init(3, 23),\n    underline: init(4, 24),\n    inverse: init(7, 27),\n    hidden: init(8, 28),\n    strikethrough: init(9, 29),\n    // colors\n    black: init(30, 39),\n    red: init(31, 39),\n    green: init(32, 39),\n    yellow: init(33, 39),\n    blue: init(34, 39),\n    magenta: init(35, 39),\n    cyan: init(36, 39),\n    white: init(37, 39),\n    gray: init(90, 39),\n    grey: init(90, 39),\n    // background colors\n    bgBlack: init(40, 49),\n    bgRed: init(41, 49),\n    bgGreen: init(42, 49),\n    bgYellow: init(43, 49),\n    bgBlue: init(44, 49),\n    bgMagenta: init(45, 49),\n    bgCyan: init(46, 49),\n    bgWhite: init(47, 49)\n  };\n  function run(arr, str) {\n    var i = 0,\n      tmp,\n      beg = '',\n      end = '';\n    for (; i < arr.length; i++) {\n      tmp = arr[i];\n      beg += tmp.open;\n      end += tmp.close;\n      if (!!~str.indexOf(tmp.close)) {\n        str = str.replace(tmp.rgx, tmp.close + tmp.open);\n      }\n    }\n    return beg + str + end;\n  }\n  function chain(has, keys) {\n    var ctx = {\n      has: has,\n      keys: keys\n    };\n    ctx.reset = $.reset.bind(ctx);\n    ctx.bold = $.bold.bind(ctx);\n    ctx.dim = $.dim.bind(ctx);\n    ctx.italic = $.italic.bind(ctx);\n    ctx.underline = $.underline.bind(ctx);\n    ctx.inverse = $.inverse.bind(ctx);\n    ctx.hidden = $.hidden.bind(ctx);\n    ctx.strikethrough = $.strikethrough.bind(ctx);\n    ctx.black = $.black.bind(ctx);\n    ctx.red = $.red.bind(ctx);\n    ctx.green = $.green.bind(ctx);\n    ctx.yellow = $.yellow.bind(ctx);\n    ctx.blue = $.blue.bind(ctx);\n    ctx.magenta = $.magenta.bind(ctx);\n    ctx.cyan = $.cyan.bind(ctx);\n    ctx.white = $.white.bind(ctx);\n    ctx.gray = $.gray.bind(ctx);\n    ctx.grey = $.grey.bind(ctx);\n    ctx.bgBlack = $.bgBlack.bind(ctx);\n    ctx.bgRed = $.bgRed.bind(ctx);\n    ctx.bgGreen = $.bgGreen.bind(ctx);\n    ctx.bgYellow = $.bgYellow.bind(ctx);\n    ctx.bgBlue = $.bgBlue.bind(ctx);\n    ctx.bgMagenta = $.bgMagenta.bind(ctx);\n    ctx.bgCyan = $.bgCyan.bind(ctx);\n    ctx.bgWhite = $.bgWhite.bind(ctx);\n    return ctx;\n  }\n  function init(open, close) {\n    var blk = {\n      open: \"\\x1B[\".concat(open, \"m\"),\n      close: \"\\x1B[\".concat(close, \"m\"),\n      rgx: new RegExp(\"\\\\x1b\\\\[\".concat(close, \"m\"), 'g')\n    };\n    return function (txt) {\n      if (this !== void 0 && this.has !== void 0) {\n        !!~this.has.indexOf(open) || (this.has.push(open), this.keys.push(blk));\n        return txt === void 0 ? this : $.enabled ? run(this.keys, txt + '') : txt + '';\n      }\n      return txt === void 0 ? chain([open], [blk]) : $.enabled ? run([blk], txt + '') : txt + '';\n    };\n  }\n\n  var hasOwn = Object.prototype.hasOwnProperty;\n\n  /**\n   * Format a given value into YAML.\n   *\n   * YAML is a superset of JSON that supports all the same data\n   * types and syntax, and more. As such, it is always possible\n   * to fallback to JSON.stringfify, but we generally avoid\n   * that to make output easier to read for humans.\n   *\n   * Supported data types:\n   *\n   * - null\n   * - boolean\n   * - number\n   * - string\n   * - array\n   * - object\n   *\n   * Anything else (including NaN, Infinity, and undefined)\n   * must be described in strings, for display purposes.\n   *\n   * Note that quotes are optional in YAML strings if the\n   * strings are \"simple\", and as such we generally prefer\n   * that for improved readability. We output strings in\n   * one of three ways:\n   *\n   * - bare unquoted text, for simple one-line strings.\n   * - JSON (quoted text), for complex one-line strings.\n   * - YAML Block, for complex multi-line strings.\n   *\n   * Objects with cyclical references will be stringifed as\n   * \"[Circular]\" as they cannot otherwise be represented.\n   */\n  function prettyYamlValue(value) {\n    var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 4;\n    if (value === undefined) {\n      // Not supported in JSON/YAML, turn into string\n      // and let the below output it as bare string.\n      value = String(value);\n    }\n\n    // Support IE 9-11: Use isFinite instead of ES6 Number.isFinite\n    if (typeof value === 'number' && !isFinite(value)) {\n      // Turn NaN and Infinity into simple strings.\n      // Paranoia: Don't return directly just in case there's\n      // a way to add special characters here.\n      value = String(value);\n    }\n    if (typeof value === 'number') {\n      // Simple numbers\n      return JSON.stringify(value);\n    }\n    if (typeof value === 'string') {\n      // If any of these match, then we can't output it\n      // as bare unquoted text, because that would either\n      // cause data loss or invalid YAML syntax.\n      //\n      // - Quotes, escapes, line breaks, or JSON-like stuff.\n      var rSpecialJson = /['\"\\\\/[{}\\]\\r\\n]/;\n\n      // - Characters that are special at the start of a YAML value\n      var rSpecialYaml = /[-?:,[\\]{}#&*!|=>'\"%@`]/;\n\n      // - Leading or trailing whitespace.\n      var rUntrimmed = /(^\\s|\\s$)/;\n\n      // - Ambiguous as YAML number, e.g. '2', '-1.2', '.2', or '2_000'\n      var rNumerical = /^[\\d._-]+$/;\n\n      // - Ambiguous as YAML bool.\n      //   Use case-insensitive match, although technically only\n      //   fully-lower, fully-upper, or uppercase-first would be ambiguous.\n      //   e.g. true/True/TRUE, but not tRUe.\n      var rBool = /^(true|false|y|n|yes|no|on|off)$/i;\n\n      // Is this a complex string?\n      if (value === '' || rSpecialJson.test(value) || rSpecialYaml.test(value[0]) || rUntrimmed.test(value) || rNumerical.test(value) || rBool.test(value)) {\n        if (!/\\n/.test(value)) {\n          // Complex one-line string, use JSON (quoted string)\n          return JSON.stringify(value);\n        }\n\n        // See also <https://yaml-multiline.info/>\n        // Support IE 9-11: Avoid ES6 String#repeat\n        var prefix = new Array(indent + 1).join(' ');\n        var trailingLinebreakMatch = value.match(/\\n+$/);\n        var trailingLinebreaks = trailingLinebreakMatch ? trailingLinebreakMatch[0].length : 0;\n        if (trailingLinebreaks === 1) {\n          // Use the most straight-forward \"Block\" string in YAML\n          // without any \"Chomping\" indicators.\n          var lines = value\n\n          // Ignore the last new line, since we'll get that one for free\n          // with the straight-forward Block syntax.\n          .replace(/\\n$/, '').split('\\n').map(function (line) {\n            return prefix + line;\n          });\n          return '|\\n' + lines.join('\\n');\n        } else {\n          // This has either no trailing new lines, or more than 1.\n          // Use |+ so that YAML parsers will preserve it exactly.\n          var _lines = value.split('\\n').map(function (line) {\n            return prefix + line;\n          });\n          return '|+\\n' + _lines.join('\\n');\n        }\n      } else {\n        // Simple string, use bare unquoted text\n        return value;\n      }\n    }\n\n    // Handle null, boolean, array, and object\n    return JSON.stringify(decycledShallowClone(value), null, 2);\n  }\n\n  /**\n   * Creates a shallow clone of an object where cycles have\n   * been replaced with \"[Circular]\".\n   */\n  function decycledShallowClone(object) {\n    var ancestors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n    if (ancestors.indexOf(object) !== -1) {\n      return '[Circular]';\n    }\n    var type = Object.prototype.toString.call(object).replace(/^\\[.+\\s(.+?)]$/, '$1').toLowerCase();\n    var clone;\n    switch (type) {\n      case 'array':\n        ancestors.push(object);\n        clone = object.map(function (element) {\n          return decycledShallowClone(element, ancestors);\n        });\n        ancestors.pop();\n        break;\n      case 'object':\n        ancestors.push(object);\n        clone = {};\n        Object.keys(object).forEach(function (key) {\n          clone[key] = decycledShallowClone(object[key], ancestors);\n        });\n        ancestors.pop();\n        break;\n      default:\n        clone = object;\n    }\n    return clone;\n  }\n  var TapReporter = /*#__PURE__*/function () {\n    function TapReporter(runner) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      _classCallCheck(this, TapReporter);\n      // Cache references to console methods to ensure we can report failures\n      // from tests tests that mock the console object itself.\n      // https://github.com/qunitjs/qunit/issues/1340\n      // Support IE 9: Function#bind is supported, but no console.log.bind().\n      this.log = options.log || Function.prototype.bind.call(console$1.log, console$1);\n      this.testCount = 0;\n      this.ended = false;\n      this.bailed = false;\n      runner.on('error', this.onError.bind(this));\n      runner.on('runStart', this.onRunStart.bind(this));\n      runner.on('testEnd', this.onTestEnd.bind(this));\n      runner.on('runEnd', this.onRunEnd.bind(this));\n    }\n    _createClass(TapReporter, [{\n      key: \"onRunStart\",\n      value: function onRunStart(_runSuite) {\n        this.log('TAP version 13');\n      }\n    }, {\n      key: \"onError\",\n      value: function onError(error) {\n        if (this.bailed) {\n          return;\n        }\n        this.bailed = true;\n\n        // Imitate onTestEnd\n        // Skip this if we're past \"runEnd\" as it would look odd\n        if (!this.ended) {\n          this.testCount = this.testCount + 1;\n          this.log($.red(\"not ok \".concat(this.testCount, \" global failure\")));\n          this.logError(error);\n        }\n        this.log('Bail out! ' + errorString(error).split('\\n')[0]);\n        if (this.ended) {\n          this.logError(error);\n        }\n      }\n    }, {\n      key: \"onTestEnd\",\n      value: function onTestEnd(test) {\n        var _this = this;\n        this.testCount = this.testCount + 1;\n        if (test.status === 'passed') {\n          this.log(\"ok \".concat(this.testCount, \" \").concat(test.fullName.join(' > ')));\n        } else if (test.status === 'skipped') {\n          this.log($.yellow(\"ok \".concat(this.testCount, \" # SKIP \").concat(test.fullName.join(' > '))));\n        } else if (test.status === 'todo') {\n          this.log($.cyan(\"not ok \".concat(this.testCount, \" # TODO \").concat(test.fullName.join(' > '))));\n          test.errors.forEach(function (error) {\n            return _this.logAssertion(error, 'todo');\n          });\n        } else {\n          this.log($.red(\"not ok \".concat(this.testCount, \" \").concat(test.fullName.join(' > '))));\n          test.errors.forEach(function (error) {\n            return _this.logAssertion(error);\n          });\n        }\n      }\n    }, {\n      key: \"onRunEnd\",\n      value: function onRunEnd(runSuite) {\n        this.ended = true;\n        this.log(\"1..\".concat(runSuite.testCounts.total));\n        this.log(\"# pass \".concat(runSuite.testCounts.passed));\n        this.log($.yellow(\"# skip \".concat(runSuite.testCounts.skipped)));\n        this.log($.cyan(\"# todo \".concat(runSuite.testCounts.todo)));\n        this.log($.red(\"# fail \".concat(runSuite.testCounts.failed)));\n      }\n    }, {\n      key: \"logAssertion\",\n      value: function logAssertion(error, severity) {\n        var out = '  ---';\n        out += \"\\n  message: \".concat(prettyYamlValue(error.message || 'failed'));\n        out += \"\\n  severity: \".concat(prettyYamlValue(severity || 'failed'));\n        if (hasOwn.call(error, 'actual')) {\n          out += \"\\n  actual  : \".concat(prettyYamlValue(error.actual));\n        }\n        if (hasOwn.call(error, 'expected')) {\n          out += \"\\n  expected: \".concat(prettyYamlValue(error.expected));\n        }\n        if (error.stack) {\n          // Since stacks aren't user generated, take a bit of liberty by\n          // adding a trailing new line to allow a straight-forward YAML Blocks.\n          out += \"\\n  stack: \".concat(prettyYamlValue(error.stack + '\\n'));\n        }\n        out += '\\n  ...';\n        this.log(out);\n      }\n    }, {\n      key: \"logError\",\n      value: function logError(error) {\n        var out = '  ---';\n        out += \"\\n  message: \".concat(prettyYamlValue(errorString(error)));\n        out += \"\\n  severity: \".concat(prettyYamlValue('failed'));\n        if (error && error.stack) {\n          out += \"\\n  stack: \".concat(prettyYamlValue(error.stack + '\\n'));\n        }\n        out += '\\n  ...';\n        this.log(out);\n      }\n    }], [{\n      key: \"init\",\n      value: function init(runner, options) {\n        return new TapReporter(runner, options);\n      }\n    }]);\n    return TapReporter;\n  }();\n\n  var reporters = {\n    console: ConsoleReporter,\n    tap: TapReporter\n  };\n\n  function makeAddGlobalHook(hookName) {\n    return function addGlobalHook(callback) {\n      if (!config.globalHooks[hookName]) {\n        config.globalHooks[hookName] = [];\n      }\n      config.globalHooks[hookName].push(callback);\n    };\n  }\n  var hooks = {\n    beforeEach: makeAddGlobalHook('beforeEach'),\n    afterEach: makeAddGlobalHook('afterEach')\n  };\n\n  /**\n   * Handle a global error that should result in a failed test run.\n   *\n   * Summary:\n   *\n   * - If we're strictly inside a test (or one if its module hooks), the exception\n   *   becomes a failed assertion.\n   *\n   *   This has the important side-effect that uncaught exceptions (such as\n   *   calling an undefined function) during a \"todo\" test do NOT result in\n   *   a failed test run.\n   *\n   * - If we're anywhere outside a test (be it in early event callbacks, or\n   *   internally between tests, or somewhere after \"runEnd\" if the process is\n   *   still alive for some reason), then send an \"error\" event to the reporters.\n   *\n   * @since 2.17.0\n   * @param {Error|any} error\n   */\n  function onUncaughtException(error) {\n    if (config.current) {\n      config.current.assert.pushResult({\n        result: false,\n        message: \"global failure: \".concat(errorString(error)),\n        // We could let callers specify an offset to subtract a number of frames via\n        // sourceFromStacktrace, in case they are a wrapper further away from the error\n        // handler, and thus reduce some noise in the stack trace. However, we're not\n        // doing this right now because it would almost never be used in practice given\n        // the vast majority of error values will be Error objects, and thus have their\n        // own stack trace already.\n        source: error && error.stack || sourceFromStacktrace(2)\n      });\n    } else {\n      // The \"error\" event was added in QUnit 2.17.\n      // Increase \"bad assertion\" stats despite no longer pushing an assertion in this case.\n      // This ensures \"runEnd\" and \"QUnit.done()\" handlers behave as expected, since the \"bad\"\n      // count is typically how reporters decide on the boolean outcome of the test run.\n      runSuite.globalFailureCount++;\n      config.stats.bad++;\n      config.stats.all++;\n      emit('error', error);\n    }\n  }\n\n  /**\n   * Handle a window.onerror error.\n   *\n   * If there is a current test that sets the internal `ignoreGlobalErrors` field\n   * (such as during `assert.throws()`), then the error is ignored and native\n   * error reporting is suppressed as well. This is because in browsers, an error\n   * can sometimes end up in `window.onerror` instead of in the local try/catch.\n   * This ignoring of errors does not apply to our general onUncaughtException\n   * method, nor to our `unhandledRejection` handlers, as those are not meant\n   * to receive an \"expected\" error during `assert.throws()`.\n   *\n   * @see <https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror>\n   * @deprecated since 2.17.0 Use QUnit.onUncaughtException instead.\n   * @param {Object} details\n   * @param {string} details.message\n   * @param {string} details.fileName\n   * @param {number} details.lineNumber\n   * @param {string|undefined} [details.stacktrace]\n   * @return {bool} True if native error reporting should be suppressed.\n   */\n  function onWindowError(details) {\n    Logger.warn('QUnit.onError is deprecated and will be removed in QUnit 3.0.' + ' Please use QUnit.onUncaughtException instead.');\n    if (config.current && config.current.ignoreGlobalErrors) {\n      return true;\n    }\n    var err = new Error(details.message);\n    err.stack = details.stacktrace || details.fileName + ':' + details.lineNumber;\n    onUncaughtException(err);\n    return false;\n  }\n\n  var QUnit = {};\n\n  // The \"currentModule\" object would ideally be defined using the createModule()\n  // function. Since it isn't, add the missing suiteReport property to it now that\n  // we have loaded all source code required to do so.\n  //\n  // TODO: Consider defining currentModule in core.js or module.js in its entirely\n  // rather than partly in config.js and partly here.\n  config.currentModule.suiteReport = runSuite;\n  var globalStartCalled = false;\n  var runStarted = false;\n\n  // Figure out if we're running the tests from a server or not\n  QUnit.isLocal = window$1 && window$1.location && window$1.location.protocol === 'file:';\n\n  // Expose the current QUnit version\n  QUnit.version = '2.19.3';\n  extend(QUnit, {\n    config: config,\n    dump: dump,\n    equiv: equiv,\n    reporters: reporters,\n    hooks: hooks,\n    is: is,\n    objectType: objectType,\n    on: on,\n    onError: onWindowError,\n    onUncaughtException: onUncaughtException,\n    pushFailure: pushFailure,\n    assert: Assert.prototype,\n    module: module$1,\n    test: test,\n    // alias other test flavors for easy access\n    todo: test.todo,\n    skip: test.skip,\n    only: test.only,\n    start: function start(count) {\n      if (config.current) {\n        throw new Error('QUnit.start cannot be called inside a test context.');\n      }\n      var globalStartAlreadyCalled = globalStartCalled;\n      globalStartCalled = true;\n      if (runStarted) {\n        throw new Error('Called start() while test already started running');\n      }\n      if (globalStartAlreadyCalled || count > 1) {\n        throw new Error('Called start() outside of a test context too many times');\n      }\n      if (config.autostart) {\n        throw new Error('Called start() outside of a test context when ' + 'QUnit.config.autostart was true');\n      }\n      if (!config.pageLoaded) {\n        // The page isn't completely loaded yet, so we set autostart and then\n        // load if we're in Node or wait for the browser's load event.\n        config.autostart = true;\n\n        // Starts from Node even if .load was not previously called. We still return\n        // early otherwise we'll wind up \"beginning\" twice.\n        if (!document) {\n          QUnit.load();\n        }\n        return;\n      }\n      scheduleBegin();\n    },\n    onUnhandledRejection: function onUnhandledRejection(reason) {\n      Logger.warn('QUnit.onUnhandledRejection is deprecated and will be removed in QUnit 3.0.' + ' Please use QUnit.onUncaughtException instead.');\n      onUncaughtException(reason);\n    },\n    extend: function extend$1() {\n      Logger.warn('QUnit.extend is deprecated and will be removed in QUnit 3.0.' + ' Please use Object.assign instead.');\n\n      // delegate to utility implementation, which does not warn and can be used elsewhere internally\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      return extend.apply(this, args);\n    },\n    load: function load() {\n      config.pageLoaded = true;\n\n      // Initialize the configuration options\n      extend(config, {\n        started: 0,\n        updateRate: 1000,\n        autostart: true,\n        filter: ''\n      }, true);\n      if (!runStarted) {\n        config.blocking = false;\n        if (config.autostart) {\n          scheduleBegin();\n        }\n      }\n    },\n    stack: function stack(offset) {\n      offset = (offset || 0) + 2;\n      return sourceFromStacktrace(offset);\n    }\n  });\n  registerLoggingCallbacks(QUnit);\n  function scheduleBegin() {\n    runStarted = true;\n\n    // Add a slight delay to allow definition of more modules and tests.\n    if (setTimeout$1) {\n      setTimeout$1(function () {\n        begin();\n      });\n    } else {\n      begin();\n    }\n  }\n  function unblockAndAdvanceQueue() {\n    config.blocking = false;\n    ProcessingQueue.advance();\n  }\n  function begin() {\n    if (config.started) {\n      unblockAndAdvanceQueue();\n      return;\n    }\n\n    // The test run hasn't officially begun yet\n    // Record the time of the test run's beginning\n    config.started = performance.now();\n\n    // Delete the loose unnamed module if unused.\n    if (config.modules[0].name === '' && config.modules[0].tests.length === 0) {\n      config.modules.shift();\n    }\n    var modulesLog = [];\n    for (var i = 0; i < config.modules.length; i++) {\n      // Don't expose the unnamed global test module to plugins.\n      if (config.modules[i].name !== '') {\n        modulesLog.push({\n          name: config.modules[i].name,\n          moduleId: config.modules[i].moduleId,\n          // Added in QUnit 1.16.0 for internal use by html-reporter,\n          // but no longer used since QUnit 2.7.0.\n          // @deprecated Kept unofficially to be removed in QUnit 3.0.\n          tests: config.modules[i].tests\n        });\n      }\n    }\n\n    // The test run is officially beginning now\n    emit('runStart', runSuite.start(true));\n    runLoggingCallbacks('begin', {\n      totalTests: Test.count,\n      modules: modulesLog\n    }).then(unblockAndAdvanceQueue);\n  }\n  exportQUnit(QUnit);\n\n  (function () {\n    if (!window$1 || !document) {\n      return;\n    }\n    var config = QUnit.config;\n    var hasOwn = Object.prototype.hasOwnProperty;\n\n    // Stores fixture HTML for resetting later\n    function storeFixture() {\n      // Avoid overwriting user-defined values\n      if (hasOwn.call(config, 'fixture')) {\n        return;\n      }\n      var fixture = document.getElementById('qunit-fixture');\n      if (fixture) {\n        config.fixture = fixture.cloneNode(true);\n      }\n    }\n    QUnit.begin(storeFixture);\n\n    // Resets the fixture DOM element if available.\n    function resetFixture() {\n      if (config.fixture == null) {\n        return;\n      }\n      var fixture = document.getElementById('qunit-fixture');\n      var resetFixtureType = _typeof(config.fixture);\n      if (resetFixtureType === 'string') {\n        // support user defined values for `config.fixture`\n        var newFixture = document.createElement('div');\n        newFixture.setAttribute('id', 'qunit-fixture');\n        newFixture.innerHTML = config.fixture;\n        fixture.parentNode.replaceChild(newFixture, fixture);\n      } else {\n        var clonedFixture = config.fixture.cloneNode(true);\n        fixture.parentNode.replaceChild(clonedFixture, fixture);\n      }\n    }\n    QUnit.testStart(resetFixture);\n  })();\n\n  (function () {\n    // Only interact with URLs via window.location\n    var location = typeof window$1 !== 'undefined' && window$1.location;\n    if (!location) {\n      return;\n    }\n    var urlParams = getUrlParams();\n    QUnit.urlParams = urlParams;\n    QUnit.config.filter = urlParams.filter;\n    QUnit.config.module = urlParams.module;\n    QUnit.config.moduleId = [].concat(urlParams.moduleId || []);\n    QUnit.config.testId = [].concat(urlParams.testId || []);\n\n    // Test order randomization\n    if (urlParams.seed === true) {\n      // Generate a random seed if the option is specified without a value\n      QUnit.config.seed = Math.random().toString(36).slice(2);\n    } else if (urlParams.seed) {\n      QUnit.config.seed = urlParams.seed;\n    }\n\n    // Add URL-parameter-mapped config values with UI form rendering data\n    QUnit.config.urlConfig.push({\n      id: 'hidepassed',\n      label: 'Hide passed tests',\n      tooltip: 'Only show tests and assertions that fail. Stored as query-strings.'\n    }, {\n      id: 'noglobals',\n      label: 'Check for Globals',\n      tooltip: 'Enabling this will test if any test introduces new properties on the ' + 'global object (`window` in Browsers). Stored as query-strings.'\n    }, {\n      id: 'notrycatch',\n      label: 'No try-catch',\n      tooltip: 'Enabling this will run tests outside of a try-catch block. Makes debugging ' + 'exceptions in IE reasonable. Stored as query-strings.'\n    });\n    QUnit.begin(function () {\n      var urlConfig = QUnit.config.urlConfig;\n      for (var i = 0; i < urlConfig.length; i++) {\n        // Options can be either strings or objects with nonempty \"id\" properties\n        var option = QUnit.config.urlConfig[i];\n        if (typeof option !== 'string') {\n          option = option.id;\n        }\n        if (QUnit.config[option] === undefined) {\n          QUnit.config[option] = urlParams[option];\n        }\n      }\n    });\n    function getUrlParams() {\n      var urlParams = Object.create(null);\n      var params = location.search.slice(1).split('&');\n      var length = params.length;\n      for (var i = 0; i < length; i++) {\n        if (params[i]) {\n          var param = params[i].split('=');\n          var name = decodeQueryParam(param[0]);\n\n          // Allow just a key to turn on a flag, e.g., test.html?noglobals\n          var value = param.length === 1 || decodeQueryParam(param.slice(1).join('='));\n          if (name in urlParams) {\n            urlParams[name] = [].concat(urlParams[name], value);\n          } else {\n            urlParams[name] = value;\n          }\n        }\n      }\n      return urlParams;\n    }\n    function decodeQueryParam(param) {\n      return decodeURIComponent(param.replace(/\\+/g, '%20'));\n    }\n  })();\n\n  var fuzzysort$1 = {exports: {}};\n\n  (function (module) {\n    (function (root, UMD) {\n      if (module.exports) module.exports = UMD();else root.fuzzysort = UMD();\n    })(commonjsGlobal, function UMD() {\n      function fuzzysortNew(instanceOptions) {\n        var fuzzysort = {\n          single: function single(search, target, options) {\n            if (search == 'farzher') return {\n              target: \"farzher was here (^-^*)/\",\n              score: 0,\n              indexes: [0, 1, 2, 3, 4, 5, 6]\n            };\n            if (!search) return null;\n            if (!isObj(search)) search = fuzzysort.getPreparedSearch(search);\n            if (!target) return null;\n            if (!isObj(target)) target = fuzzysort.getPrepared(target);\n            var allowTypo = options && options.allowTypo !== undefined ? options.allowTypo : instanceOptions && instanceOptions.allowTypo !== undefined ? instanceOptions.allowTypo : true;\n            var algorithm = allowTypo ? fuzzysort.algorithm : fuzzysort.algorithmNoTypo;\n            return algorithm(search, target, search[0]);\n          },\n          go: function go(search, targets, options) {\n            if (search == 'farzher') return [{\n              target: \"farzher was here (^-^*)/\",\n              score: 0,\n              indexes: [0, 1, 2, 3, 4, 5, 6],\n              obj: targets ? targets[0] : null\n            }];\n            if (!search) return noResults;\n            search = fuzzysort.prepareSearch(search);\n            var searchLowerCode = search[0];\n            var threshold = options && options.threshold || instanceOptions && instanceOptions.threshold || -9007199254740991;\n            var limit = options && options.limit || instanceOptions && instanceOptions.limit || 9007199254740991;\n            var allowTypo = options && options.allowTypo !== undefined ? options.allowTypo : instanceOptions && instanceOptions.allowTypo !== undefined ? instanceOptions.allowTypo : true;\n            var algorithm = allowTypo ? fuzzysort.algorithm : fuzzysort.algorithmNoTypo;\n            var resultsLen = 0;\n            var limitedCount = 0;\n            var targetsLen = targets.length;\n\n            // This code is copy/pasted 3 times for performance reasons [options.keys, options.key, no keys]\n\n            // options.keys\n            if (options && options.keys) {\n              var scoreFn = options.scoreFn || defaultScoreFn;\n              var keys = options.keys;\n              var keysLen = keys.length;\n              for (var i = targetsLen - 1; i >= 0; --i) {\n                var obj = targets[i];\n                var objResults = new Array(keysLen);\n                for (var keyI = keysLen - 1; keyI >= 0; --keyI) {\n                  var key = keys[keyI];\n                  var target = getValue(obj, key);\n                  if (!target) {\n                    objResults[keyI] = null;\n                    continue;\n                  }\n                  if (!isObj(target)) target = fuzzysort.getPrepared(target);\n                  objResults[keyI] = algorithm(search, target, searchLowerCode);\n                }\n                objResults.obj = obj; // before scoreFn so scoreFn can use it\n                var score = scoreFn(objResults);\n                if (score === null) continue;\n                if (score < threshold) continue;\n                objResults.score = score;\n                if (resultsLen < limit) {\n                  q.add(objResults);\n                  ++resultsLen;\n                } else {\n                  ++limitedCount;\n                  if (score > q.peek().score) q.replaceTop(objResults);\n                }\n              }\n\n              // options.key\n            } else if (options && options.key) {\n              var key = options.key;\n              for (var i = targetsLen - 1; i >= 0; --i) {\n                var obj = targets[i];\n                var target = getValue(obj, key);\n                if (!target) continue;\n                if (!isObj(target)) target = fuzzysort.getPrepared(target);\n                var result = algorithm(search, target, searchLowerCode);\n                if (result === null) continue;\n                if (result.score < threshold) continue;\n\n                // have to clone result so duplicate targets from different obj can each reference the correct obj\n                result = {\n                  target: result.target,\n                  _targetLowerCodes: null,\n                  _nextBeginningIndexes: null,\n                  score: result.score,\n                  indexes: result.indexes,\n                  obj: obj\n                }; // hidden\n\n                if (resultsLen < limit) {\n                  q.add(result);\n                  ++resultsLen;\n                } else {\n                  ++limitedCount;\n                  if (result.score > q.peek().score) q.replaceTop(result);\n                }\n              }\n\n              // no keys\n            } else {\n              for (var i = targetsLen - 1; i >= 0; --i) {\n                var target = targets[i];\n                if (!target) continue;\n                if (!isObj(target)) target = fuzzysort.getPrepared(target);\n                var result = algorithm(search, target, searchLowerCode);\n                if (result === null) continue;\n                if (result.score < threshold) continue;\n                if (resultsLen < limit) {\n                  q.add(result);\n                  ++resultsLen;\n                } else {\n                  ++limitedCount;\n                  if (result.score > q.peek().score) q.replaceTop(result);\n                }\n              }\n            }\n            if (resultsLen === 0) return noResults;\n            var results = new Array(resultsLen);\n            for (var i = resultsLen - 1; i >= 0; --i) {\n              results[i] = q.poll();\n            }\n            results.total = resultsLen + limitedCount;\n            return results;\n          },\n          goAsync: function goAsync(search, targets, options) {\n            var canceled = false;\n            var p = new Promise(function (resolve, reject) {\n              if (search == 'farzher') return resolve([{\n                target: \"farzher was here (^-^*)/\",\n                score: 0,\n                indexes: [0, 1, 2, 3, 4, 5, 6],\n                obj: targets ? targets[0] : null\n              }]);\n              if (!search) return resolve(noResults);\n              search = fuzzysort.prepareSearch(search);\n              var searchLowerCode = search[0];\n              var q = fastpriorityqueue();\n              var iCurrent = targets.length - 1;\n              var threshold = options && options.threshold || instanceOptions && instanceOptions.threshold || -9007199254740991;\n              var limit = options && options.limit || instanceOptions && instanceOptions.limit || 9007199254740991;\n              var allowTypo = options && options.allowTypo !== undefined ? options.allowTypo : instanceOptions && instanceOptions.allowTypo !== undefined ? instanceOptions.allowTypo : true;\n              var algorithm = allowTypo ? fuzzysort.algorithm : fuzzysort.algorithmNoTypo;\n              var resultsLen = 0;\n              var limitedCount = 0;\n              function step() {\n                if (canceled) return reject('canceled');\n                var startMs = Date.now();\n\n                // This code is copy/pasted 3 times for performance reasons [options.keys, options.key, no keys]\n\n                // options.keys\n                if (options && options.keys) {\n                  var scoreFn = options.scoreFn || defaultScoreFn;\n                  var keys = options.keys;\n                  var keysLen = keys.length;\n                  for (; iCurrent >= 0; --iCurrent) {\n                    if (iCurrent % 1000 /*itemsPerCheck*/ === 0) {\n                      if (Date.now() - startMs >= 10 /*asyncInterval*/) {\n                        isNode ? setImmediate(step) : setTimeout(step);\n                        return;\n                      }\n                    }\n                    var obj = targets[iCurrent];\n                    var objResults = new Array(keysLen);\n                    for (var keyI = keysLen - 1; keyI >= 0; --keyI) {\n                      var key = keys[keyI];\n                      var target = getValue(obj, key);\n                      if (!target) {\n                        objResults[keyI] = null;\n                        continue;\n                      }\n                      if (!isObj(target)) target = fuzzysort.getPrepared(target);\n                      objResults[keyI] = algorithm(search, target, searchLowerCode);\n                    }\n                    objResults.obj = obj; // before scoreFn so scoreFn can use it\n                    var score = scoreFn(objResults);\n                    if (score === null) continue;\n                    if (score < threshold) continue;\n                    objResults.score = score;\n                    if (resultsLen < limit) {\n                      q.add(objResults);\n                      ++resultsLen;\n                    } else {\n                      ++limitedCount;\n                      if (score > q.peek().score) q.replaceTop(objResults);\n                    }\n                  }\n\n                  // options.key\n                } else if (options && options.key) {\n                  var key = options.key;\n                  for (; iCurrent >= 0; --iCurrent) {\n                    if (iCurrent % 1000 /*itemsPerCheck*/ === 0) {\n                      if (Date.now() - startMs >= 10 /*asyncInterval*/) {\n                        isNode ? setImmediate(step) : setTimeout(step);\n                        return;\n                      }\n                    }\n                    var obj = targets[iCurrent];\n                    var target = getValue(obj, key);\n                    if (!target) continue;\n                    if (!isObj(target)) target = fuzzysort.getPrepared(target);\n                    var result = algorithm(search, target, searchLowerCode);\n                    if (result === null) continue;\n                    if (result.score < threshold) continue;\n\n                    // have to clone result so duplicate targets from different obj can each reference the correct obj\n                    result = {\n                      target: result.target,\n                      _targetLowerCodes: null,\n                      _nextBeginningIndexes: null,\n                      score: result.score,\n                      indexes: result.indexes,\n                      obj: obj\n                    }; // hidden\n\n                    if (resultsLen < limit) {\n                      q.add(result);\n                      ++resultsLen;\n                    } else {\n                      ++limitedCount;\n                      if (result.score > q.peek().score) q.replaceTop(result);\n                    }\n                  }\n\n                  // no keys\n                } else {\n                  for (; iCurrent >= 0; --iCurrent) {\n                    if (iCurrent % 1000 /*itemsPerCheck*/ === 0) {\n                      if (Date.now() - startMs >= 10 /*asyncInterval*/) {\n                        isNode ? setImmediate(step) : setTimeout(step);\n                        return;\n                      }\n                    }\n                    var target = targets[iCurrent];\n                    if (!target) continue;\n                    if (!isObj(target)) target = fuzzysort.getPrepared(target);\n                    var result = algorithm(search, target, searchLowerCode);\n                    if (result === null) continue;\n                    if (result.score < threshold) continue;\n                    if (resultsLen < limit) {\n                      q.add(result);\n                      ++resultsLen;\n                    } else {\n                      ++limitedCount;\n                      if (result.score > q.peek().score) q.replaceTop(result);\n                    }\n                  }\n                }\n                if (resultsLen === 0) return resolve(noResults);\n                var results = new Array(resultsLen);\n                for (var i = resultsLen - 1; i >= 0; --i) {\n                  results[i] = q.poll();\n                }\n                results.total = resultsLen + limitedCount;\n                resolve(results);\n              }\n              isNode ? setImmediate(step) : step(); //setTimeout here is too slow\n            });\n\n            p.cancel = function () {\n              canceled = true;\n            };\n            return p;\n          },\n          highlight: function highlight(result, hOpen, hClose) {\n            if (typeof hOpen == 'function') return fuzzysort.highlightCallback(result, hOpen);\n            if (result === null) return null;\n            if (hOpen === undefined) hOpen = '<b>';\n            if (hClose === undefined) hClose = '</b>';\n            var highlighted = '';\n            var matchesIndex = 0;\n            var opened = false;\n            var target = result.target;\n            var targetLen = target.length;\n            var matchesBest = result.indexes;\n            for (var i = 0; i < targetLen; ++i) {\n              var char = target[i];\n              if (matchesBest[matchesIndex] === i) {\n                ++matchesIndex;\n                if (!opened) {\n                  opened = true;\n                  highlighted += hOpen;\n                }\n                if (matchesIndex === matchesBest.length) {\n                  highlighted += char + hClose + target.substr(i + 1);\n                  break;\n                }\n              } else {\n                if (opened) {\n                  opened = false;\n                  highlighted += hClose;\n                }\n              }\n              highlighted += char;\n            }\n            return highlighted;\n          },\n          highlightCallback: function highlightCallback(result, cb) {\n            if (result === null) return null;\n            var target = result.target;\n            var targetLen = target.length;\n            var indexes = result.indexes;\n            var highlighted = '';\n            var matchI = 0;\n            var indexesI = 0;\n            var opened = false;\n            var result = [];\n            for (var i = 0; i < targetLen; ++i) {\n              var char = target[i];\n              if (indexes[indexesI] === i) {\n                ++indexesI;\n                if (!opened) {\n                  opened = true;\n                  result.push(highlighted);\n                  highlighted = '';\n                }\n                if (indexesI === indexes.length) {\n                  highlighted += char;\n                  result.push(cb(highlighted, matchI++));\n                  highlighted = '';\n                  result.push(target.substr(i + 1));\n                  break;\n                }\n              } else {\n                if (opened) {\n                  opened = false;\n                  result.push(cb(highlighted, matchI++));\n                  highlighted = '';\n                }\n              }\n              highlighted += char;\n            }\n            return result;\n          },\n          prepare: function prepare(target) {\n            if (!target) return {\n              target: '',\n              _targetLowerCodes: [0 /*this 0 doesn't make sense. here because an empty array causes the algorithm to deoptimize and run 50% slower!*/],\n              _nextBeginningIndexes: null,\n              score: null,\n              indexes: null,\n              obj: null\n            }; // hidden\n            return {\n              target: target,\n              _targetLowerCodes: fuzzysort.prepareLowerCodes(target),\n              _nextBeginningIndexes: null,\n              score: null,\n              indexes: null,\n              obj: null\n            }; // hidden\n          },\n\n          prepareSlow: function prepareSlow(target) {\n            if (!target) return {\n              target: '',\n              _targetLowerCodes: [0 /*this 0 doesn't make sense. here because an empty array causes the algorithm to deoptimize and run 50% slower!*/],\n              _nextBeginningIndexes: null,\n              score: null,\n              indexes: null,\n              obj: null\n            }; // hidden\n            return {\n              target: target,\n              _targetLowerCodes: fuzzysort.prepareLowerCodes(target),\n              _nextBeginningIndexes: fuzzysort.prepareNextBeginningIndexes(target),\n              score: null,\n              indexes: null,\n              obj: null\n            }; // hidden\n          },\n\n          prepareSearch: function prepareSearch(search) {\n            if (!search) search = '';\n            return fuzzysort.prepareLowerCodes(search);\n          },\n          // Below this point is only internal code\n          // Below this point is only internal code\n          // Below this point is only internal code\n          // Below this point is only internal code\n\n          getPrepared: function getPrepared(target) {\n            if (target.length > 999) return fuzzysort.prepare(target); // don't cache huge targets\n            var targetPrepared = preparedCache.get(target);\n            if (targetPrepared !== undefined) return targetPrepared;\n            targetPrepared = fuzzysort.prepare(target);\n            preparedCache.set(target, targetPrepared);\n            return targetPrepared;\n          },\n          getPreparedSearch: function getPreparedSearch(search) {\n            if (search.length > 999) return fuzzysort.prepareSearch(search); // don't cache huge searches\n            var searchPrepared = preparedSearchCache.get(search);\n            if (searchPrepared !== undefined) return searchPrepared;\n            searchPrepared = fuzzysort.prepareSearch(search);\n            preparedSearchCache.set(search, searchPrepared);\n            return searchPrepared;\n          },\n          algorithm: function algorithm(searchLowerCodes, prepared, searchLowerCode) {\n            var targetLowerCodes = prepared._targetLowerCodes;\n            var searchLen = searchLowerCodes.length;\n            var targetLen = targetLowerCodes.length;\n            var searchI = 0; // where we at\n            var targetI = 0; // where you at\n            var typoSimpleI = 0;\n            var matchesSimpleLen = 0;\n\n            // very basic fuzzy match; to remove non-matching targets ASAP!\n            // walk through target. find sequential matches.\n            // if all chars aren't found then exit\n            for (;;) {\n              var isMatch = searchLowerCode === targetLowerCodes[targetI];\n              if (isMatch) {\n                matchesSimple[matchesSimpleLen++] = targetI;\n                ++searchI;\n                if (searchI === searchLen) break;\n                searchLowerCode = searchLowerCodes[typoSimpleI === 0 ? searchI : typoSimpleI === searchI ? searchI + 1 : typoSimpleI === searchI - 1 ? searchI - 1 : searchI];\n              }\n              ++targetI;\n              if (targetI >= targetLen) {\n                // Failed to find searchI\n                // Check for typo or exit\n                // we go as far as possible before trying to transpose\n                // then we transpose backwards until we reach the beginning\n                for (;;) {\n                  if (searchI <= 1) return null; // not allowed to transpose first char\n                  if (typoSimpleI === 0) {\n                    // we haven't tried to transpose yet\n                    --searchI;\n                    var searchLowerCodeNew = searchLowerCodes[searchI];\n                    if (searchLowerCode === searchLowerCodeNew) continue; // doesn't make sense to transpose a repeat char\n                    typoSimpleI = searchI;\n                  } else {\n                    if (typoSimpleI === 1) return null; // reached the end of the line for transposing\n                    --typoSimpleI;\n                    searchI = typoSimpleI;\n                    searchLowerCode = searchLowerCodes[searchI + 1];\n                    var searchLowerCodeNew = searchLowerCodes[searchI];\n                    if (searchLowerCode === searchLowerCodeNew) continue; // doesn't make sense to transpose a repeat char\n                  }\n\n                  matchesSimpleLen = searchI;\n                  targetI = matchesSimple[matchesSimpleLen - 1] + 1;\n                  break;\n                }\n              }\n            }\n            var searchI = 0;\n            var typoStrictI = 0;\n            var successStrict = false;\n            var matchesStrictLen = 0;\n            var nextBeginningIndexes = prepared._nextBeginningIndexes;\n            if (nextBeginningIndexes === null) nextBeginningIndexes = prepared._nextBeginningIndexes = fuzzysort.prepareNextBeginningIndexes(prepared.target);\n            var firstPossibleI = targetI = matchesSimple[0] === 0 ? 0 : nextBeginningIndexes[matchesSimple[0] - 1];\n\n            // Our target string successfully matched all characters in sequence!\n            // Let's try a more advanced and strict test to improve the score\n            // only count it as a match if it's consecutive or a beginning character!\n            if (targetI !== targetLen) for (;;) {\n              if (targetI >= targetLen) {\n                // We failed to find a good spot for this search char, go back to the previous search char and force it forward\n                if (searchI <= 0) {\n                  // We failed to push chars forward for a better match\n                  // transpose, starting from the beginning\n                  ++typoStrictI;\n                  if (typoStrictI > searchLen - 2) break;\n                  if (searchLowerCodes[typoStrictI] === searchLowerCodes[typoStrictI + 1]) continue; // doesn't make sense to transpose a repeat char\n                  targetI = firstPossibleI;\n                  continue;\n                }\n                --searchI;\n                var lastMatch = matchesStrict[--matchesStrictLen];\n                targetI = nextBeginningIndexes[lastMatch];\n              } else {\n                var isMatch = searchLowerCodes[typoStrictI === 0 ? searchI : typoStrictI === searchI ? searchI + 1 : typoStrictI === searchI - 1 ? searchI - 1 : searchI] === targetLowerCodes[targetI];\n                if (isMatch) {\n                  matchesStrict[matchesStrictLen++] = targetI;\n                  ++searchI;\n                  if (searchI === searchLen) {\n                    successStrict = true;\n                    break;\n                  }\n                  ++targetI;\n                } else {\n                  targetI = nextBeginningIndexes[targetI];\n                }\n              }\n            }\n            {\n              // tally up the score & keep track of matches for highlighting later\n              if (successStrict) {\n                var matchesBest = matchesStrict;\n                var matchesBestLen = matchesStrictLen;\n              } else {\n                var matchesBest = matchesSimple;\n                var matchesBestLen = matchesSimpleLen;\n              }\n              var score = 0;\n              var lastTargetI = -1;\n              for (var i = 0; i < searchLen; ++i) {\n                var targetI = matchesBest[i];\n                // score only goes down if they're not consecutive\n                if (lastTargetI !== targetI - 1) score -= targetI;\n                lastTargetI = targetI;\n              }\n              if (!successStrict) {\n                score *= 1000;\n                if (typoSimpleI !== 0) score += -20; /*typoPenalty*/\n              } else {\n                if (typoStrictI !== 0) score += -20; /*typoPenalty*/\n              }\n\n              score -= targetLen - searchLen;\n              prepared.score = score;\n              prepared.indexes = new Array(matchesBestLen);\n              for (var i = matchesBestLen - 1; i >= 0; --i) {\n                prepared.indexes[i] = matchesBest[i];\n              }\n              return prepared;\n            }\n          },\n          algorithmNoTypo: function algorithmNoTypo(searchLowerCodes, prepared, searchLowerCode) {\n            var targetLowerCodes = prepared._targetLowerCodes;\n            var searchLen = searchLowerCodes.length;\n            var targetLen = targetLowerCodes.length;\n            var searchI = 0; // where we at\n            var targetI = 0; // where you at\n            var matchesSimpleLen = 0;\n\n            // very basic fuzzy match; to remove non-matching targets ASAP!\n            // walk through target. find sequential matches.\n            // if all chars aren't found then exit\n            for (;;) {\n              var isMatch = searchLowerCode === targetLowerCodes[targetI];\n              if (isMatch) {\n                matchesSimple[matchesSimpleLen++] = targetI;\n                ++searchI;\n                if (searchI === searchLen) break;\n                searchLowerCode = searchLowerCodes[searchI];\n              }\n              ++targetI;\n              if (targetI >= targetLen) return null; // Failed to find searchI\n            }\n\n            var searchI = 0;\n            var successStrict = false;\n            var matchesStrictLen = 0;\n            var nextBeginningIndexes = prepared._nextBeginningIndexes;\n            if (nextBeginningIndexes === null) nextBeginningIndexes = prepared._nextBeginningIndexes = fuzzysort.prepareNextBeginningIndexes(prepared.target);\n            targetI = matchesSimple[0] === 0 ? 0 : nextBeginningIndexes[matchesSimple[0] - 1];\n\n            // Our target string successfully matched all characters in sequence!\n            // Let's try a more advanced and strict test to improve the score\n            // only count it as a match if it's consecutive or a beginning character!\n            if (targetI !== targetLen) for (;;) {\n              if (targetI >= targetLen) {\n                // We failed to find a good spot for this search char, go back to the previous search char and force it forward\n                if (searchI <= 0) break; // We failed to push chars forward for a better match\n\n                --searchI;\n                var lastMatch = matchesStrict[--matchesStrictLen];\n                targetI = nextBeginningIndexes[lastMatch];\n              } else {\n                var isMatch = searchLowerCodes[searchI] === targetLowerCodes[targetI];\n                if (isMatch) {\n                  matchesStrict[matchesStrictLen++] = targetI;\n                  ++searchI;\n                  if (searchI === searchLen) {\n                    successStrict = true;\n                    break;\n                  }\n                  ++targetI;\n                } else {\n                  targetI = nextBeginningIndexes[targetI];\n                }\n              }\n            }\n            {\n              // tally up the score & keep track of matches for highlighting later\n              if (successStrict) {\n                var matchesBest = matchesStrict;\n                var matchesBestLen = matchesStrictLen;\n              } else {\n                var matchesBest = matchesSimple;\n                var matchesBestLen = matchesSimpleLen;\n              }\n              var score = 0;\n              var lastTargetI = -1;\n              for (var i = 0; i < searchLen; ++i) {\n                var targetI = matchesBest[i];\n                // score only goes down if they're not consecutive\n                if (lastTargetI !== targetI - 1) score -= targetI;\n                lastTargetI = targetI;\n              }\n              if (!successStrict) score *= 1000;\n              score -= targetLen - searchLen;\n              prepared.score = score;\n              prepared.indexes = new Array(matchesBestLen);\n              for (var i = matchesBestLen - 1; i >= 0; --i) {\n                prepared.indexes[i] = matchesBest[i];\n              }\n              return prepared;\n            }\n          },\n          prepareLowerCodes: function prepareLowerCodes(str) {\n            var strLen = str.length;\n            var lowerCodes = []; // new Array(strLen)    sparse array is too slow\n            var lower = str.toLowerCase();\n            for (var i = 0; i < strLen; ++i) {\n              lowerCodes[i] = lower.charCodeAt(i);\n            }\n            return lowerCodes;\n          },\n          prepareBeginningIndexes: function prepareBeginningIndexes(target) {\n            var targetLen = target.length;\n            var beginningIndexes = [];\n            var beginningIndexesLen = 0;\n            var wasUpper = false;\n            var wasAlphanum = false;\n            for (var i = 0; i < targetLen; ++i) {\n              var targetCode = target.charCodeAt(i);\n              var isUpper = targetCode >= 65 && targetCode <= 90;\n              var isAlphanum = isUpper || targetCode >= 97 && targetCode <= 122 || targetCode >= 48 && targetCode <= 57;\n              var isBeginning = isUpper && !wasUpper || !wasAlphanum || !isAlphanum;\n              wasUpper = isUpper;\n              wasAlphanum = isAlphanum;\n              if (isBeginning) beginningIndexes[beginningIndexesLen++] = i;\n            }\n            return beginningIndexes;\n          },\n          prepareNextBeginningIndexes: function prepareNextBeginningIndexes(target) {\n            var targetLen = target.length;\n            var beginningIndexes = fuzzysort.prepareBeginningIndexes(target);\n            var nextBeginningIndexes = []; // new Array(targetLen)     sparse array is too slow\n            var lastIsBeginning = beginningIndexes[0];\n            var lastIsBeginningI = 0;\n            for (var i = 0; i < targetLen; ++i) {\n              if (lastIsBeginning > i) {\n                nextBeginningIndexes[i] = lastIsBeginning;\n              } else {\n                lastIsBeginning = beginningIndexes[++lastIsBeginningI];\n                nextBeginningIndexes[i] = lastIsBeginning === undefined ? targetLen : lastIsBeginning;\n              }\n            }\n            return nextBeginningIndexes;\n          },\n          cleanup: cleanup,\n          new: fuzzysortNew\n        };\n        return fuzzysort;\n      } // fuzzysortNew\n\n      // This stuff is outside fuzzysortNew, because it's shared with instances of fuzzysort.new()\n      var isNode = typeof commonjsRequire !== 'undefined' && typeof window === 'undefined';\n      var MyMap = typeof Map === 'function' ? Map : function () {\n        var s = Object.create(null);\n        this.get = function (k) {\n          return s[k];\n        };\n        this.set = function (k, val) {\n          s[k] = val;\n          return this;\n        };\n        this.clear = function () {\n          s = Object.create(null);\n        };\n      };\n      var preparedCache = new MyMap();\n      var preparedSearchCache = new MyMap();\n      var noResults = [];\n      noResults.total = 0;\n      var matchesSimple = [];\n      var matchesStrict = [];\n      function cleanup() {\n        preparedCache.clear();\n        preparedSearchCache.clear();\n        matchesSimple = [];\n        matchesStrict = [];\n      }\n      function defaultScoreFn(a) {\n        var max = -9007199254740991;\n        for (var i = a.length - 1; i >= 0; --i) {\n          var result = a[i];\n          if (result === null) continue;\n          var score = result.score;\n          if (score > max) max = score;\n        }\n        if (max === -9007199254740991) return null;\n        return max;\n      }\n\n      // prop = 'key'              2.5ms optimized for this case, seems to be about as fast as direct obj[prop]\n      // prop = 'key1.key2'        10ms\n      // prop = ['key1', 'key2']   27ms\n      function getValue(obj, prop) {\n        var tmp = obj[prop];\n        if (tmp !== undefined) return tmp;\n        var segs = prop;\n        if (!Array.isArray(prop)) segs = prop.split('.');\n        var len = segs.length;\n        var i = -1;\n        while (obj && ++i < len) {\n          obj = obj[segs[i]];\n        }\n        return obj;\n      }\n      function isObj(x) {\n        return _typeof(x) === 'object';\n      } // faster as a function\n\n      // Hacked version of https://github.com/lemire/FastPriorityQueue.js\n      var fastpriorityqueue = function fastpriorityqueue() {\n        var r = [],\n          o = 0,\n          e = {};\n        function n() {\n          for (var e = 0, n = r[e], c = 1; c < o;) {\n            var f = c + 1;\n            e = c, f < o && r[f].score < r[c].score && (e = f), r[e - 1 >> 1] = r[e], c = 1 + (e << 1);\n          }\n          for (var a = e - 1 >> 1; e > 0 && n.score < r[a].score; a = (e = a) - 1 >> 1) {\n            r[e] = r[a];\n          }\n          r[e] = n;\n        }\n        return e.add = function (e) {\n          var n = o;\n          r[o++] = e;\n          for (var c = n - 1 >> 1; n > 0 && e.score < r[c].score; c = (n = c) - 1 >> 1) {\n            r[n] = r[c];\n          }\n          r[n] = e;\n        }, e.poll = function () {\n          if (0 !== o) {\n            var e = r[0];\n            return r[0] = r[--o], n(), e;\n          }\n        }, e.peek = function (e) {\n          if (0 !== o) return r[0];\n        }, e.replaceTop = function (o) {\n          r[0] = o, n();\n        }, e;\n      };\n      var q = fastpriorityqueue(); // reuse this, except for async, it needs to make its own\n\n      return fuzzysortNew();\n    }); // UMD\n\n    // TODO: (performance) wasm version!?\n    // TODO: (performance) threads?\n    // TODO: (performance) avoid cache misses\n    // TODO: (performance) preparedCache is a memory leak\n    // TODO: (like sublime) backslash === forwardslash\n    // TODO: (like sublime) spaces: \"a b\" should do 2 searches 1 for a and 1 for b\n    // TODO: (scoring) garbage in targets that allows most searches to strict match need a penality\n    // TODO: (performance) idk if allowTypo is optimized\n  })(fuzzysort$1);\n  var fuzzysort = fuzzysort$1.exports;\n\n  var stats = {\n    failedTests: [],\n    defined: 0,\n    completed: 0\n  };\n\n  // Escape text for attribute or text content.\n  function escapeText(str) {\n    if (!str) {\n      return '';\n    }\n\n    // Both single quotes and double quotes (for attributes)\n    return ('' + str).replace(/['\"<>&]/g, function (s) {\n      switch (s) {\n        case \"'\":\n          return '&#039;';\n        case '\"':\n          return '&quot;';\n        case '<':\n          return '&lt;';\n        case '>':\n          return '&gt;';\n        case '&':\n          return '&amp;';\n      }\n    });\n  }\n  (function () {\n    // Don't load the HTML Reporter on non-browser environments\n    if (!window$1 || !document) {\n      return;\n    }\n    var config = QUnit.config;\n    var hiddenTests = [];\n    var collapseNext = false;\n    var hasOwn = Object.prototype.hasOwnProperty;\n    var unfilteredUrl = setUrl({\n      filter: undefined,\n      module: undefined,\n      moduleId: undefined,\n      testId: undefined\n    });\n    var dropdownData = null;\n    function trim(string) {\n      if (typeof string.trim === 'function') {\n        return string.trim();\n      } else {\n        return string.replace(/^\\s+|\\s+$/g, '');\n      }\n    }\n    function addEvent(elem, type, fn) {\n      elem.addEventListener(type, fn, false);\n    }\n    function removeEvent(elem, type, fn) {\n      elem.removeEventListener(type, fn, false);\n    }\n    function addEvents(elems, type, fn) {\n      var i = elems.length;\n      while (i--) {\n        addEvent(elems[i], type, fn);\n      }\n    }\n    function hasClass(elem, name) {\n      return (' ' + elem.className + ' ').indexOf(' ' + name + ' ') >= 0;\n    }\n    function addClass(elem, name) {\n      if (!hasClass(elem, name)) {\n        elem.className += (elem.className ? ' ' : '') + name;\n      }\n    }\n    function toggleClass(elem, name, force) {\n      if (force || typeof force === 'undefined' && !hasClass(elem, name)) {\n        addClass(elem, name);\n      } else {\n        removeClass(elem, name);\n      }\n    }\n    function removeClass(elem, name) {\n      var set = ' ' + elem.className + ' ';\n\n      // Class name may appear multiple times\n      while (set.indexOf(' ' + name + ' ') >= 0) {\n        set = set.replace(' ' + name + ' ', ' ');\n      }\n\n      // Trim for prettiness\n      elem.className = trim(set);\n    }\n    function id(name) {\n      return document.getElementById && document.getElementById(name);\n    }\n    function abortTests() {\n      var abortButton = id('qunit-abort-tests-button');\n      if (abortButton) {\n        abortButton.disabled = true;\n        abortButton.innerHTML = 'Aborting...';\n      }\n      QUnit.config.queue.length = 0;\n      return false;\n    }\n    function interceptNavigation(ev) {\n      // Trim potential accidental whitespace so that QUnit doesn't throw an error about no tests matching the filter.\n      var filterInputElem = id('qunit-filter-input');\n      filterInputElem.value = trim(filterInputElem.value);\n      applyUrlParams();\n      if (ev && ev.preventDefault) {\n        ev.preventDefault();\n      }\n      return false;\n    }\n    function getUrlConfigHtml() {\n      var selection = false;\n      var urlConfig = config.urlConfig;\n      var urlConfigHtml = '';\n      for (var i = 0; i < urlConfig.length; i++) {\n        // Options can be either strings or objects with nonempty \"id\" properties\n        var val = config.urlConfig[i];\n        if (typeof val === 'string') {\n          val = {\n            id: val,\n            label: val\n          };\n        }\n        var escaped = escapeText(val.id);\n        var escapedTooltip = escapeText(val.tooltip);\n        if (!val.value || typeof val.value === 'string') {\n          urlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'><input id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' type='checkbox'\" + (val.value ? \" value='\" + escapeText(val.value) + \"'\" : '') + (config[val.id] ? \" checked='checked'\" : '') + \" title='\" + escapedTooltip + \"' />\" + escapeText(val.label) + '</label>';\n        } else {\n          urlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'>\" + val.label + \": </label><select id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' title='\" + escapedTooltip + \"'><option></option>\";\n          if (Array.isArray(val.value)) {\n            for (var j = 0; j < val.value.length; j++) {\n              escaped = escapeText(val.value[j]);\n              urlConfigHtml += \"<option value='\" + escaped + \"'\" + (config[val.id] === val.value[j] ? (selection = true) && \" selected='selected'\" : '') + '>' + escaped + '</option>';\n            }\n          } else {\n            for (var _j in val.value) {\n              if (hasOwn.call(val.value, _j)) {\n                urlConfigHtml += \"<option value='\" + escapeText(_j) + \"'\" + (config[val.id] === _j ? (selection = true) && \" selected='selected'\" : '') + '>' + escapeText(val.value[_j]) + '</option>';\n              }\n            }\n          }\n          if (config[val.id] && !selection) {\n            escaped = escapeText(config[val.id]);\n            urlConfigHtml += \"<option value='\" + escaped + \"' selected='selected' disabled='disabled'>\" + escaped + '</option>';\n          }\n          urlConfigHtml += '</select>';\n        }\n      }\n      return urlConfigHtml;\n    }\n\n    // Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n    // Updates the URL with the new state of `config.urlConfig` values.\n    function toolbarChanged() {\n      var field = this;\n      var params = {};\n\n      // Detect if field is a select menu or a checkbox\n      var value;\n      if ('selectedIndex' in field) {\n        value = field.options[field.selectedIndex].value || undefined;\n      } else {\n        value = field.checked ? field.defaultValue || true : undefined;\n      }\n      params[field.name] = value;\n      var updatedUrl = setUrl(params);\n\n      // Check if we can apply the change without a page refresh\n      if (field.name === 'hidepassed' && 'replaceState' in window$1.history) {\n        QUnit.urlParams[field.name] = value;\n        config[field.name] = value || false;\n        var tests = id('qunit-tests');\n        if (tests) {\n          var length = tests.children.length;\n          var children = tests.children;\n          if (field.checked) {\n            for (var i = 0; i < length; i++) {\n              var test = children[i];\n              var className = test ? test.className : '';\n              var classNameHasPass = className.indexOf('pass') > -1;\n              var classNameHasSkipped = className.indexOf('skipped') > -1;\n              if (classNameHasPass || classNameHasSkipped) {\n                hiddenTests.push(test);\n              }\n            }\n            var _iterator = _createForOfIteratorHelper(hiddenTests),\n              _step;\n            try {\n              for (_iterator.s(); !(_step = _iterator.n()).done;) {\n                var hiddenTest = _step.value;\n                tests.removeChild(hiddenTest);\n              }\n            } catch (err) {\n              _iterator.e(err);\n            } finally {\n              _iterator.f();\n            }\n          } else {\n            var _test;\n            while ((_test = hiddenTests.pop()) != null) {\n              tests.appendChild(_test);\n            }\n          }\n        }\n        window$1.history.replaceState(null, '', updatedUrl);\n      } else {\n        window$1.location = updatedUrl;\n      }\n    }\n    function setUrl(params) {\n      var querystring = '?';\n      var location = window$1.location;\n      params = extend(extend({}, QUnit.urlParams), params);\n      for (var key in params) {\n        // Skip inherited or undefined properties\n        if (hasOwn.call(params, key) && params[key] !== undefined) {\n          // Output a parameter for each value of this key\n          // (but usually just one)\n          var arrValue = [].concat(params[key]);\n          for (var i = 0; i < arrValue.length; i++) {\n            querystring += encodeURIComponent(key);\n            if (arrValue[i] !== true) {\n              querystring += '=' + encodeURIComponent(arrValue[i]);\n            }\n            querystring += '&';\n          }\n        }\n      }\n      return location.protocol + '//' + location.host + location.pathname + querystring.slice(0, -1);\n    }\n    function applyUrlParams() {\n      var filter = id('qunit-filter-input').value;\n      window$1.location = setUrl({\n        filter: filter === '' ? undefined : filter,\n        moduleId: _toConsumableArray(dropdownData.selectedMap.keys()),\n        // Remove module and testId filter\n        module: undefined,\n        testId: undefined\n      });\n    }\n    function toolbarUrlConfigContainer() {\n      var urlConfigContainer = document.createElement('span');\n      urlConfigContainer.innerHTML = getUrlConfigHtml();\n      addClass(urlConfigContainer, 'qunit-url-config');\n      addEvents(urlConfigContainer.getElementsByTagName('input'), 'change', toolbarChanged);\n      addEvents(urlConfigContainer.getElementsByTagName('select'), 'change', toolbarChanged);\n      return urlConfigContainer;\n    }\n    function abortTestsButton() {\n      var button = document.createElement('button');\n      button.id = 'qunit-abort-tests-button';\n      button.innerHTML = 'Abort';\n      addEvent(button, 'click', abortTests);\n      return button;\n    }\n    function toolbarLooseFilter() {\n      var filter = document.createElement('form');\n      var label = document.createElement('label');\n      var input = document.createElement('input');\n      var button = document.createElement('button');\n      addClass(filter, 'qunit-filter');\n      label.innerHTML = 'Filter: ';\n      input.type = 'text';\n      input.value = config.filter || '';\n      input.name = 'filter';\n      input.id = 'qunit-filter-input';\n      button.innerHTML = 'Go';\n      label.appendChild(input);\n      filter.appendChild(label);\n      filter.appendChild(document.createTextNode(' '));\n      filter.appendChild(button);\n      addEvent(filter, 'submit', interceptNavigation);\n      return filter;\n    }\n    function createModuleListItem(moduleId, name, checked) {\n      return '<li><label class=\"clickable' + (checked ? ' checked' : '') + '\"><input type=\"checkbox\" ' + 'value=\"' + escapeText(moduleId) + '\"' + (checked ? ' checked=\"checked\"' : '') + ' />' + escapeText(name) + '</label></li>';\n    }\n\n    /**\n     * @param {Array} Results from fuzzysort\n     * @return {string} HTML\n     */\n    function moduleListHtml(results) {\n      var html = '';\n\n      // Hoist the already selected items, and show them always\n      // even if not matched by the current search.\n      dropdownData.selectedMap.forEach(function (name, moduleId) {\n        html += createModuleListItem(moduleId, name, true);\n      });\n      for (var i = 0; i < results.length; i++) {\n        var mod = results[i].obj;\n        if (!dropdownData.selectedMap.has(mod.moduleId)) {\n          html += createModuleListItem(mod.moduleId, mod.name, false);\n        }\n      }\n      return html;\n    }\n    function toolbarModuleFilter(beginDetails) {\n      var initialSelected = null;\n      dropdownData = {\n        options: beginDetails.modules.slice(),\n        selectedMap: new StringMap(),\n        isDirty: function isDirty() {\n          return _toConsumableArray(dropdownData.selectedMap.keys()).sort().join(',') !== _toConsumableArray(initialSelected.keys()).sort().join(',');\n        }\n      };\n      if (config.moduleId.length) {\n        // The module dropdown is seeded with the runtime configuration of the last run.\n        //\n        // We don't reference `config.moduleId` directly after this and keep our own\n        // copy because:\n        // 1. This naturaly filters out unknown moduleIds.\n        // 2. Gives us a place to manage and remember unsubmitted checkbox changes.\n        // 3. Gives us an efficient way to map a selected moduleId to module name\n        //    during rendering.\n        for (var i = 0; i < beginDetails.modules.length; i++) {\n          var mod = beginDetails.modules[i];\n          if (config.moduleId.indexOf(mod.moduleId) !== -1) {\n            dropdownData.selectedMap.set(mod.moduleId, mod.name);\n          }\n        }\n      }\n      initialSelected = new StringMap(dropdownData.selectedMap);\n      var moduleSearch = document.createElement('input');\n      moduleSearch.id = 'qunit-modulefilter-search';\n      moduleSearch.autocomplete = 'off';\n      addEvent(moduleSearch, 'input', searchInput);\n      addEvent(moduleSearch, 'input', searchFocus);\n      addEvent(moduleSearch, 'focus', searchFocus);\n      addEvent(moduleSearch, 'click', searchFocus);\n      var label = document.createElement('label');\n      label.htmlFor = 'qunit-modulefilter-search';\n      label.textContent = 'Module:';\n      var searchContainer = document.createElement('span');\n      searchContainer.id = 'qunit-modulefilter-search-container';\n      searchContainer.appendChild(moduleSearch);\n      var applyButton = document.createElement('button');\n      applyButton.textContent = 'Apply';\n      applyButton.title = 'Re-run the selected test modules';\n      addEvent(applyButton, 'click', applyUrlParams);\n      var resetButton = document.createElement('button');\n      resetButton.textContent = 'Reset';\n      resetButton.type = 'reset';\n      resetButton.title = 'Restore the previous module selection';\n      var clearButton = document.createElement('button');\n      clearButton.textContent = 'Select none';\n      clearButton.type = 'button';\n      clearButton.title = 'Clear the current module selection';\n      addEvent(clearButton, 'click', function () {\n        dropdownData.selectedMap.clear();\n        selectionChange();\n        searchInput();\n      });\n      var actions = document.createElement('span');\n      actions.id = 'qunit-modulefilter-actions';\n      actions.appendChild(applyButton);\n      actions.appendChild(resetButton);\n      if (initialSelected.size) {\n        // Only show clear button if functionally different from reset\n        actions.appendChild(clearButton);\n      }\n      var dropDownList = document.createElement('ul');\n      dropDownList.id = 'qunit-modulefilter-dropdown-list';\n      var dropDown = document.createElement('div');\n      dropDown.id = 'qunit-modulefilter-dropdown';\n      dropDown.style.display = 'none';\n      dropDown.appendChild(actions);\n      dropDown.appendChild(dropDownList);\n      addEvent(dropDown, 'change', selectionChange);\n      searchContainer.appendChild(dropDown);\n      // Set initial moduleSearch.placeholder and clearButton/resetButton.\n      selectionChange();\n      var moduleFilter = document.createElement('form');\n      moduleFilter.id = 'qunit-modulefilter';\n      moduleFilter.appendChild(label);\n      moduleFilter.appendChild(document.createTextNode(' '));\n      moduleFilter.appendChild(searchContainer);\n      addEvent(moduleFilter, 'submit', interceptNavigation);\n      addEvent(moduleFilter, 'reset', function () {\n        dropdownData.selectedMap = new StringMap(initialSelected);\n        // Set moduleSearch.placeholder and reflect non-dirty state\n        selectionChange();\n        searchInput();\n      });\n\n      // Enables show/hide for the dropdown\n      function searchFocus() {\n        if (dropDown.style.display !== 'none') {\n          return;\n        }\n\n        // Optimization: Defer rendering options until focussed.\n        // https://github.com/qunitjs/qunit/issues/1664\n        searchInput();\n        dropDown.style.display = 'block';\n\n        // Hide on Escape keydown or on click outside the container\n        addEvent(document, 'click', hideHandler);\n        addEvent(document, 'keydown', hideHandler);\n        function hideHandler(e) {\n          var inContainer = moduleFilter.contains(e.target);\n          if (e.keyCode === 27 || !inContainer) {\n            if (e.keyCode === 27 && inContainer) {\n              moduleSearch.focus();\n            }\n            dropDown.style.display = 'none';\n            removeEvent(document, 'click', hideHandler);\n            removeEvent(document, 'keydown', hideHandler);\n            moduleSearch.value = '';\n            searchInput();\n          }\n        }\n      }\n\n      /**\n       * @param {string} searchText\n       * @return {string} HTML\n       */\n      function filterModules(searchText) {\n        var results;\n        if (searchText === '') {\n          // Improve on-boarding experience by having an immediate display of\n          // module names, indicating how the interface works. This also makes\n          // for a quicker interaction in the common case of small projects.\n          // Don't mandate typing just to get the menu.\n          results = dropdownData.options.slice(0, 20).map(function (obj) {\n            // Fake empty results. https://github.com/farzher/fuzzysort/issues/41\n            return {\n              obj: obj\n            };\n          });\n        } else {\n          results = fuzzysort.go(searchText, dropdownData.options, {\n            limit: 20,\n            key: 'name',\n            allowTypo: true\n          });\n        }\n        return moduleListHtml(results);\n      }\n\n      // Processes module search box input\n      var searchInputTimeout;\n      function searchInput() {\n        // Use a debounce with a ~0ms timeout. This is effectively instantaneous,\n        // but is better than undebounced because it avoids an ever-growing\n        // backlog of unprocessed now-outdated input events if fuzzysearch or\n        // drodown DOM is slow (e.g. very large test suite).\n        window$1.clearTimeout(searchInputTimeout);\n        searchInputTimeout = window$1.setTimeout(function () {\n          dropDownList.innerHTML = filterModules(moduleSearch.value);\n        });\n      }\n\n      // Processes checkbox change, or a generic render (initial render, or after reset event)\n      // Avoid any dropdown rendering here as this is used by toolbarModuleFilter()\n      // during the initial render, which should not delay test execution.\n      function selectionChange(evt) {\n        var checkbox = evt && evt.target || null;\n        if (checkbox) {\n          // Update internal state\n          if (checkbox.checked) {\n            dropdownData.selectedMap.set(checkbox.value, checkbox.parentNode.textContent);\n          } else {\n            dropdownData.selectedMap.delete(checkbox.value);\n          }\n\n          // Update UI state\n          toggleClass(checkbox.parentNode, 'checked', checkbox.checked);\n        }\n        var textForm = dropdownData.selectedMap.size ? dropdownData.selectedMap.size + ' ' + (dropdownData.selectedMap.size === 1 ? 'module' : 'modules') : 'All modules';\n        moduleSearch.placeholder = textForm;\n        moduleSearch.title = 'Type to search through and reduce the list.';\n        resetButton.disabled = !dropdownData.isDirty();\n        clearButton.style.display = dropdownData.selectedMap.size ? '' : 'none';\n      }\n      return moduleFilter;\n    }\n    function appendToolbar(beginDetails) {\n      var toolbar = id('qunit-testrunner-toolbar');\n      if (toolbar) {\n        toolbar.appendChild(toolbarUrlConfigContainer());\n        var toolbarFilters = document.createElement('span');\n        toolbarFilters.id = 'qunit-toolbar-filters';\n        toolbarFilters.appendChild(toolbarLooseFilter());\n        toolbarFilters.appendChild(toolbarModuleFilter(beginDetails));\n        var clearfix = document.createElement('div');\n        clearfix.className = 'clearfix';\n        toolbar.appendChild(toolbarFilters);\n        toolbar.appendChild(clearfix);\n      }\n    }\n    function appendHeader() {\n      var header = id('qunit-header');\n      if (header) {\n        header.innerHTML = \"<a href='\" + escapeText(unfilteredUrl) + \"'>\" + header.innerHTML + '</a> ';\n      }\n    }\n    function appendBanner() {\n      var banner = id('qunit-banner');\n      if (banner) {\n        banner.className = '';\n      }\n    }\n    function appendTestResults() {\n      var tests = id('qunit-tests');\n      var result = id('qunit-testresult');\n      var controls;\n      if (result) {\n        result.parentNode.removeChild(result);\n      }\n      if (tests) {\n        tests.innerHTML = '';\n        result = document.createElement('p');\n        result.id = 'qunit-testresult';\n        result.className = 'result';\n        tests.parentNode.insertBefore(result, tests);\n        result.innerHTML = '<div id=\"qunit-testresult-display\">Running...<br />&#160;</div>' + '<div id=\"qunit-testresult-controls\"></div>' + '<div class=\"clearfix\"></div>';\n        controls = id('qunit-testresult-controls');\n      }\n      if (controls) {\n        controls.appendChild(abortTestsButton());\n      }\n    }\n    function appendFilteredTest() {\n      var testId = QUnit.config.testId;\n      if (!testId || testId.length <= 0) {\n        return '';\n      }\n      return \"<div id='qunit-filteredTest'>Rerunning selected tests: \" + escapeText(testId.join(', ')) + \" <a id='qunit-clearFilter' href='\" + escapeText(unfilteredUrl) + \"'>Run all tests</a></div>\";\n    }\n    function appendUserAgent() {\n      var userAgent = id('qunit-userAgent');\n      if (userAgent) {\n        userAgent.innerHTML = '';\n        userAgent.appendChild(document.createTextNode('QUnit ' + QUnit.version + '; ' + navigator.userAgent));\n      }\n    }\n    function appendInterface(beginDetails) {\n      var qunit = id('qunit');\n\n      // For compat with QUnit 1.2, and to support fully custom theme HTML,\n      // we will use any existing elements if no id=\"qunit\" element exists.\n      //\n      // Note that we don't fail or fallback to creating it ourselves,\n      // because not having id=\"qunit\" (and not having the below elements)\n      // simply means QUnit acts headless, allowing users to use their own\n      // reporters, or for a test runner to listen for events directly without\n      // having the HTML reporter actively render anything.\n      if (qunit) {\n        qunit.setAttribute('role', 'main');\n\n        // Since QUnit 1.3, these are created automatically if the page\n        // contains id=\"qunit\".\n        qunit.innerHTML = \"<h1 id='qunit-header'>\" + escapeText(document.title) + '</h1>' + \"<h2 id='qunit-banner'></h2>\" + \"<div id='qunit-testrunner-toolbar' role='navigation'></div>\" + appendFilteredTest() + \"<h2 id='qunit-userAgent'></h2>\" + \"<ol id='qunit-tests'></ol>\";\n      }\n      appendHeader();\n      appendBanner();\n      appendTestResults();\n      appendUserAgent();\n      appendToolbar(beginDetails);\n    }\n    function appendTest(name, testId, moduleName) {\n      var tests = id('qunit-tests');\n      if (!tests) {\n        return;\n      }\n      var title = document.createElement('strong');\n      title.innerHTML = getNameHtml(name, moduleName);\n      var testBlock = document.createElement('li');\n      testBlock.appendChild(title);\n\n      // No ID or rerun link for \"global failure\" blocks\n      if (testId !== undefined) {\n        var rerunTrigger = document.createElement('a');\n        rerunTrigger.innerHTML = 'Rerun';\n        rerunTrigger.href = setUrl({\n          testId: testId\n        });\n        testBlock.id = 'qunit-test-output-' + testId;\n        testBlock.appendChild(rerunTrigger);\n      }\n      var assertList = document.createElement('ol');\n      assertList.className = 'qunit-assert-list';\n      testBlock.appendChild(assertList);\n      tests.appendChild(testBlock);\n      return testBlock;\n    }\n\n    // HTML Reporter initialization and load\n    QUnit.on('runStart', function (runStart) {\n      stats.defined = runStart.testCounts.total;\n    });\n    QUnit.begin(function (beginDetails) {\n      // Initialize QUnit elements\n      // This is done from begin() instead of runStart, because\n      // urlparams.js uses begin(), which we need to wait for.\n      // urlparams.js in turn uses begin() to allow plugins to\n      // add entries to QUnit.config.urlConfig, which may be done\n      // asynchronously.\n      // <https://github.com/qunitjs/qunit/issues/1657>\n      appendInterface(beginDetails);\n    });\n    function getRerunFailedHtml(failedTests) {\n      if (failedTests.length === 0) {\n        return '';\n      }\n      var href = setUrl({\n        testId: failedTests\n      });\n      return [\"<br /><a href='\" + escapeText(href) + \"'>\", failedTests.length === 1 ? 'Rerun 1 failed test' : 'Rerun ' + failedTests.length + ' failed tests', '</a>'].join('');\n    }\n    QUnit.on('runEnd', function (runEnd) {\n      var banner = id('qunit-banner');\n      var tests = id('qunit-tests');\n      var abortButton = id('qunit-abort-tests-button');\n      var assertPassed = config.stats.all - config.stats.bad;\n      var html = [runEnd.testCounts.total, ' tests completed in ', runEnd.runtime, ' milliseconds, with ', runEnd.testCounts.failed, ' failed, ', runEnd.testCounts.skipped, ' skipped, and ', runEnd.testCounts.todo, ' todo.<br />', \"<span class='passed'>\", assertPassed, \"</span> assertions of <span class='total'>\", config.stats.all, \"</span> passed, <span class='failed'>\", config.stats.bad, '</span> failed.', getRerunFailedHtml(stats.failedTests)].join('');\n      var test;\n      var assertLi;\n      var assertList;\n\n      // Update remaining tests to aborted\n      if (abortButton && abortButton.disabled) {\n        html = 'Tests aborted after ' + runEnd.runtime + ' milliseconds.';\n        for (var i = 0; i < tests.children.length; i++) {\n          test = tests.children[i];\n          if (test.className === '' || test.className === 'running') {\n            test.className = 'aborted';\n            assertList = test.getElementsByTagName('ol')[0];\n            assertLi = document.createElement('li');\n            assertLi.className = 'fail';\n            assertLi.innerHTML = 'Test aborted.';\n            assertList.appendChild(assertLi);\n          }\n        }\n      }\n      if (banner && (!abortButton || abortButton.disabled === false)) {\n        banner.className = runEnd.status === 'failed' ? 'qunit-fail' : 'qunit-pass';\n      }\n      if (abortButton) {\n        abortButton.parentNode.removeChild(abortButton);\n      }\n      if (tests) {\n        id('qunit-testresult-display').innerHTML = html;\n      }\n      if (config.altertitle && document.title) {\n        // Show ✖ for good, ✔ for bad suite result in title\n        // use escape sequences in case file gets loaded with non-utf-8\n        // charset\n        document.title = [runEnd.status === 'failed' ? \"\\u2716\" : \"\\u2714\", document.title.replace(/^[\\u2714\\u2716] /i, '')].join(' ');\n      }\n\n      // Scroll back to top to show results\n      if (config.scrolltop && window$1.scrollTo) {\n        window$1.scrollTo(0, 0);\n      }\n    });\n    function getNameHtml(name, module) {\n      var nameHtml = '';\n      if (module) {\n        nameHtml = \"<span class='module-name'>\" + escapeText(module) + '</span>: ';\n      }\n      nameHtml += \"<span class='test-name'>\" + escapeText(name) + '</span>';\n      return nameHtml;\n    }\n    function getProgressHtml(stats) {\n      return [stats.completed, ' / ', stats.defined, ' tests completed.<br />'].join('');\n    }\n    QUnit.testStart(function (details) {\n      var running, bad;\n      appendTest(details.name, details.testId, details.module);\n      running = id('qunit-testresult-display');\n      if (running) {\n        addClass(running, 'running');\n        bad = QUnit.config.reorder && details.previousFailure;\n        running.innerHTML = [getProgressHtml(stats), bad ? 'Rerunning previously failed test: <br />' : 'Running: ', getNameHtml(details.name, details.module), getRerunFailedHtml(stats.failedTests)].join('');\n      }\n    });\n    function stripHtml(string) {\n      // Strip tags, html entity and whitespaces\n      return string.replace(/<\\/?[^>]+(>|$)/g, '').replace(/&quot;/g, '').replace(/\\s+/g, '');\n    }\n    QUnit.log(function (details) {\n      var testItem = id('qunit-test-output-' + details.testId);\n      if (!testItem) {\n        return;\n      }\n      var message = escapeText(details.message) || (details.result ? 'okay' : 'failed');\n      message = \"<span class='test-message'>\" + message + '</span>';\n      message += \"<span class='runtime'>@ \" + details.runtime + ' ms</span>';\n      var expected;\n      var actual;\n      var diff;\n      var showDiff = false;\n\n      // The pushFailure doesn't provide details.expected\n      // when it calls, it's implicit to also not show expected and diff stuff\n      // Also, we need to check details.expected existence, as it can exist and be undefined\n      if (!details.result && hasOwn.call(details, 'expected')) {\n        if (details.negative) {\n          expected = 'NOT ' + QUnit.dump.parse(details.expected);\n        } else {\n          expected = QUnit.dump.parse(details.expected);\n        }\n        actual = QUnit.dump.parse(details.actual);\n        message += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + escapeText(expected) + '</pre></td></tr>';\n        if (actual !== expected) {\n          message += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeText(actual) + '</pre></td></tr>';\n          if (typeof details.actual === 'number' && typeof details.expected === 'number') {\n            if (!isNaN(details.actual) && !isNaN(details.expected)) {\n              showDiff = true;\n              diff = details.actual - details.expected;\n              diff = (diff > 0 ? '+' : '') + diff;\n            }\n          } else if (typeof details.actual !== 'boolean' && typeof details.expected !== 'boolean') {\n            diff = QUnit.diff(expected, actual);\n\n            // don't show diff if there is zero overlap\n            showDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length;\n          }\n          if (showDiff) {\n            message += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + diff + '</pre></td></tr>';\n          }\n        } else if (expected.indexOf('[object Array]') !== -1 || expected.indexOf('[object Object]') !== -1) {\n          message += \"<tr class='test-message'><th>Message: </th><td>\" + 'Diff suppressed as the depth of object is more than current max depth (' + QUnit.config.maxDepth + ').<p>Hint: Use <code>QUnit.dump.maxDepth</code> to ' + \" run with a higher max depth or <a href='\" + escapeText(setUrl({\n            maxDepth: -1\n          })) + \"'>\" + 'Rerun</a> without max depth.</p></td></tr>';\n        } else {\n          message += \"<tr class='test-message'><th>Message: </th><td>\" + 'Diff suppressed as the expected and actual results have an equivalent' + ' serialization</td></tr>';\n        }\n        if (details.source) {\n          message += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + '</pre></td></tr>';\n        }\n        message += '</table>';\n\n        // This occurs when pushFailure is set and we have an extracted stack trace\n      } else if (!details.result && details.source) {\n        message += '<table>' + \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + '</pre></td></tr>' + '</table>';\n      }\n      var assertList = testItem.getElementsByTagName('ol')[0];\n      var assertLi = document.createElement('li');\n      assertLi.className = details.result ? 'pass' : 'fail';\n      assertLi.innerHTML = message;\n      assertList.appendChild(assertLi);\n    });\n    QUnit.testDone(function (details) {\n      var tests = id('qunit-tests');\n      var testItem = id('qunit-test-output-' + details.testId);\n      if (!tests || !testItem) {\n        return;\n      }\n      removeClass(testItem, 'running');\n      var status;\n      if (details.failed > 0) {\n        status = 'failed';\n      } else if (details.todo) {\n        status = 'todo';\n      } else {\n        status = details.skipped ? 'skipped' : 'passed';\n      }\n      var assertList = testItem.getElementsByTagName('ol')[0];\n      var good = details.passed;\n      var bad = details.failed;\n\n      // This test passed if it has no unexpected failed assertions\n      var testPassed = details.failed > 0 ? details.todo : !details.todo;\n      if (testPassed) {\n        // Collapse the passing tests\n        addClass(assertList, 'qunit-collapsed');\n      } else {\n        stats.failedTests.push(details.testId);\n        if (config.collapse) {\n          if (!collapseNext) {\n            // Skip collapsing the first failing test\n            collapseNext = true;\n          } else {\n            // Collapse remaining tests\n            addClass(assertList, 'qunit-collapsed');\n          }\n        }\n      }\n\n      // The testItem.firstChild is the test name\n      var testTitle = testItem.firstChild;\n      var testCounts = bad ? \"<b class='failed'>\" + bad + '</b>, ' + \"<b class='passed'>\" + good + '</b>, ' : '';\n      testTitle.innerHTML += \" <b class='counts'>(\" + testCounts + details.assertions.length + ')</b>';\n      stats.completed++;\n      if (details.skipped) {\n        testItem.className = 'skipped';\n        var skipped = document.createElement('em');\n        skipped.className = 'qunit-skipped-label';\n        skipped.innerHTML = 'skipped';\n        testItem.insertBefore(skipped, testTitle);\n      } else {\n        addEvent(testTitle, 'click', function () {\n          toggleClass(assertList, 'qunit-collapsed');\n        });\n        testItem.className = testPassed ? 'pass' : 'fail';\n        if (details.todo) {\n          var todoLabel = document.createElement('em');\n          todoLabel.className = 'qunit-todo-label';\n          todoLabel.innerHTML = 'todo';\n          testItem.className += ' todo';\n          testItem.insertBefore(todoLabel, testTitle);\n        }\n        var time = document.createElement('span');\n        time.className = 'runtime';\n        time.innerHTML = details.runtime + ' ms';\n        testItem.insertBefore(time, assertList);\n      }\n\n      // Show the source of the test when showing assertions\n      if (details.source) {\n        var sourceName = document.createElement('p');\n        sourceName.innerHTML = '<strong>Source: </strong>' + escapeText(details.source);\n        addClass(sourceName, 'qunit-source');\n        if (testPassed) {\n          addClass(sourceName, 'qunit-collapsed');\n        }\n        addEvent(testTitle, 'click', function () {\n          toggleClass(sourceName, 'qunit-collapsed');\n        });\n        testItem.appendChild(sourceName);\n      }\n      if (config.hidepassed && (status === 'passed' || details.skipped)) {\n        // use removeChild instead of remove because of support\n        hiddenTests.push(testItem);\n        tests.removeChild(testItem);\n      }\n    });\n    QUnit.on('error', function (error) {\n      var testItem = appendTest('global failure');\n      if (!testItem) {\n        // HTML Reporter is probably disabled or not yet initialized.\n        return;\n      }\n\n      // Render similar to a failed assertion (see above QUnit.log callback)\n      var message = escapeText(errorString(error));\n      message = \"<span class='test-message'>\" + message + '</span>';\n      if (error && error.stack) {\n        message += '<table>' + \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(error.stack) + '</pre></td></tr>' + '</table>';\n      }\n      var assertList = testItem.getElementsByTagName('ol')[0];\n      var assertLi = document.createElement('li');\n      assertLi.className = 'fail';\n      assertLi.innerHTML = message;\n      assertList.appendChild(assertLi);\n\n      // Make it visible\n      testItem.className = 'fail';\n    });\n\n    // Avoid readyState issue with phantomjs\n    // Ref: #818\n    var usingPhantom = function (p) {\n      return p && p.version && p.version.major > 0;\n    }(window$1.phantom);\n    if (usingPhantom) {\n      console$1.warn('Support for PhantomJS is deprecated and will be removed in QUnit 3.0.');\n    }\n    if (!usingPhantom && document.readyState === 'complete') {\n      QUnit.load();\n    } else {\n      addEvent(window$1, 'load', QUnit.load);\n    }\n\n    // Wrap window.onerror. We will call the original window.onerror to see if\n    // the existing handler fully handles the error; if not, we will call the\n    // QUnit.onError function.\n    var originalWindowOnError = window$1.onerror;\n\n    // Cover uncaught exceptions\n    // Returning true will suppress the default browser handler,\n    // returning false will let it run.\n    window$1.onerror = function (message, fileName, lineNumber, columnNumber, errorObj) {\n      var ret = false;\n      if (originalWindowOnError) {\n        for (var _len = arguments.length, args = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {\n          args[_key - 5] = arguments[_key];\n        }\n        ret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber, columnNumber, errorObj].concat(args));\n      }\n\n      // Treat return value as window.onerror itself does,\n      // Only do our handling if not suppressed.\n      if (ret !== true) {\n        // If there is a current test that sets the internal `ignoreGlobalErrors` field\n        // (such as during `assert.throws()`), then the error is ignored and native\n        // error reporting is suppressed as well. This is because in browsers, an error\n        // can sometimes end up in `window.onerror` instead of in the local try/catch.\n        // This ignoring of errors does not apply to our general onUncaughtException\n        // method, nor to our `unhandledRejection` handlers, as those are not meant\n        // to receive an \"expected\" error during `assert.throws()`.\n        if (config.current && config.current.ignoreGlobalErrors) {\n          return true;\n        }\n\n        // According to\n        // https://blog.sentry.io/2016/01/04/client-javascript-reporting-window-onerror,\n        // most modern browsers support an errorObj argument; use that to\n        // get a full stack trace if it's available.\n        var error = errorObj || new Error(message);\n        if (!error.stack && fileName && lineNumber) {\n          error.stack = \"\".concat(fileName, \":\").concat(lineNumber);\n        }\n        QUnit.onUncaughtException(error);\n      }\n      return ret;\n    };\n    window$1.addEventListener('unhandledrejection', function (event) {\n      QUnit.onUncaughtException(event.reason);\n    });\n  })();\n\n  /*\n   * This file is a modified version of google-diff-match-patch's JavaScript implementation\n   * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n   * modifications are licensed as more fully set forth in LICENSE.txt.\n   *\n   * The original source of google-diff-match-patch is attributable and licensed as follows:\n   *\n   * Copyright 2006 Google Inc.\n   * https://code.google.com/p/google-diff-match-patch/\n   *\n   * Licensed under the Apache License, Version 2.0 (the \"License\");\n   * you may not use this file except in compliance with the License.\n   * You may obtain a copy of the License at\n   *\n   * https://www.apache.org/licenses/LICENSE-2.0\n   *\n   * Unless required by applicable law or agreed to in writing, software\n   * distributed under the License is distributed on an \"AS IS\" BASIS,\n   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   * See the License for the specific language governing permissions and\n   * limitations under the License.\n   *\n   * More Info:\n   *  https://code.google.com/p/google-diff-match-patch/\n   *\n   * Usage: QUnit.diff(expected, actual)\n   *\n   */\n  QUnit.diff = function () {\n    function DiffMatchPatch() {}\n\n    //  DIFF FUNCTIONS\n\n    /**\n     * The data structure representing a diff is an array of tuples:\n     * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n     * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n     */\n    var DIFF_DELETE = -1;\n    var DIFF_INSERT = 1;\n    var DIFF_EQUAL = 0;\n    var hasOwn = Object.prototype.hasOwnProperty;\n\n    /**\n     * Find the differences between two texts.  Simplifies the problem by stripping\n     * any common prefix or suffix off the texts before diffing.\n     * @param {string} text1 Old string to be diffed.\n     * @param {string} text2 New string to be diffed.\n     * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n     *     then don't run a line-level diff first to identify the changed areas.\n     *     Defaults to true, which does a faster, slightly less optimal diff.\n     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n     */\n    DiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {\n      // The diff must be complete in up to 1 second.\n      var deadline = Date.now() + 1000;\n\n      // Check for null inputs.\n      if (text1 === null || text2 === null) {\n        throw new Error('Cannot diff null input.');\n      }\n\n      // Check for equality (speedup).\n      if (text1 === text2) {\n        if (text1) {\n          return [[DIFF_EQUAL, text1]];\n        }\n        return [];\n      }\n      if (typeof optChecklines === 'undefined') {\n        optChecklines = true;\n      }\n\n      // Trim off common prefix (speedup).\n      var commonlength = this.diffCommonPrefix(text1, text2);\n      var commonprefix = text1.substring(0, commonlength);\n      text1 = text1.substring(commonlength);\n      text2 = text2.substring(commonlength);\n\n      // Trim off common suffix (speedup).\n      commonlength = this.diffCommonSuffix(text1, text2);\n      var commonsuffix = text1.substring(text1.length - commonlength);\n      text1 = text1.substring(0, text1.length - commonlength);\n      text2 = text2.substring(0, text2.length - commonlength);\n\n      // Compute the diff on the middle block.\n      var diffs = this.diffCompute(text1, text2, optChecklines, deadline);\n\n      // Restore the prefix and suffix.\n      if (commonprefix) {\n        diffs.unshift([DIFF_EQUAL, commonprefix]);\n      }\n      if (commonsuffix) {\n        diffs.push([DIFF_EQUAL, commonsuffix]);\n      }\n      this.diffCleanupMerge(diffs);\n      return diffs;\n    };\n\n    /**\n     * Reduce the number of edits by eliminating operationally trivial equalities.\n     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n     */\n    DiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {\n      var changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;\n      changes = false;\n      equalities = []; // Stack of indices where equalities are found.\n      equalitiesLength = 0; // Keeping our own length var is faster in JS.\n      /** @type {?string} */\n      lastequality = null;\n\n      // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n      pointer = 0; // Index of current position.\n\n      // Is there an insertion operation before the last equality.\n      preIns = false;\n\n      // Is there a deletion operation before the last equality.\n      preDel = false;\n\n      // Is there an insertion operation after the last equality.\n      postIns = false;\n\n      // Is there a deletion operation after the last equality.\n      postDel = false;\n      while (pointer < diffs.length) {\n        // Equality found.\n        if (diffs[pointer][0] === DIFF_EQUAL) {\n          if (diffs[pointer][1].length < 4 && (postIns || postDel)) {\n            // Candidate found.\n            equalities[equalitiesLength++] = pointer;\n            preIns = postIns;\n            preDel = postDel;\n            lastequality = diffs[pointer][1];\n          } else {\n            // Not a candidate, and can never become one.\n            equalitiesLength = 0;\n            lastequality = null;\n          }\n          postIns = postDel = false;\n\n          // An insertion or deletion.\n        } else {\n          if (diffs[pointer][0] === DIFF_DELETE) {\n            postDel = true;\n          } else {\n            postIns = true;\n          }\n\n          /*\n           * Five types to be split:\n           * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n           * <ins>A</ins>X<ins>C</ins><del>D</del>\n           * <ins>A</ins><del>B</del>X<ins>C</ins>\n           * <ins>A</del>X<ins>C</ins><del>D</del>\n           * <ins>A</ins><del>B</del>X<del>C</del>\n           */\n          if (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {\n            // Duplicate record.\n            diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n            // Change second copy to insert.\n            diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n            equalitiesLength--; // Throw away the equality we just deleted;\n            lastequality = null;\n            if (preIns && preDel) {\n              // No changes made which could affect previous entry, keep going.\n              postIns = postDel = true;\n              equalitiesLength = 0;\n            } else {\n              equalitiesLength--; // Throw away the previous equality.\n              pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n              postIns = postDel = false;\n            }\n            changes = true;\n          }\n        }\n        pointer++;\n      }\n      if (changes) {\n        this.diffCleanupMerge(diffs);\n      }\n    };\n\n    /**\n     * Convert a diff array into a pretty HTML report.\n     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n     * @param {integer} string to be beautified.\n     * @return {string} HTML representation.\n     */\n    DiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {\n      var html = [];\n      for (var x = 0; x < diffs.length; x++) {\n        var op = diffs[x][0]; // Operation (insert, delete, equal)\n        var data = diffs[x][1]; // Text of change.\n        switch (op) {\n          case DIFF_INSERT:\n            html[x] = '<ins>' + escapeText(data) + '</ins>';\n            break;\n          case DIFF_DELETE:\n            html[x] = '<del>' + escapeText(data) + '</del>';\n            break;\n          case DIFF_EQUAL:\n            html[x] = '<span>' + escapeText(data) + '</span>';\n            break;\n        }\n      }\n      return html.join('');\n    };\n\n    /**\n     * Determine the common prefix of two strings.\n     * @param {string} text1 First string.\n     * @param {string} text2 Second string.\n     * @return {number} The number of characters common to the start of each\n     *     string.\n     */\n    DiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {\n      var pointermid, pointermax, pointermin, pointerstart;\n\n      // Quick check for common null cases.\n      if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n        return 0;\n      }\n\n      // Binary search.\n      // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n      pointermin = 0;\n      pointermax = Math.min(text1.length, text2.length);\n      pointermid = pointermax;\n      pointerstart = 0;\n      while (pointermin < pointermid) {\n        if (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {\n          pointermin = pointermid;\n          pointerstart = pointermin;\n        } else {\n          pointermax = pointermid;\n        }\n        pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n      }\n      return pointermid;\n    };\n\n    /**\n     * Determine the common suffix of two strings.\n     * @param {string} text1 First string.\n     * @param {string} text2 Second string.\n     * @return {number} The number of characters common to the end of each string.\n     */\n    DiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {\n      var pointermid, pointermax, pointermin, pointerend;\n\n      // Quick check for common null cases.\n      if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {\n        return 0;\n      }\n\n      // Binary search.\n      // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n      pointermin = 0;\n      pointermax = Math.min(text1.length, text2.length);\n      pointermid = pointermax;\n      pointerend = 0;\n      while (pointermin < pointermid) {\n        if (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n          pointermin = pointermid;\n          pointerend = pointermin;\n        } else {\n          pointermax = pointermid;\n        }\n        pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n      }\n      return pointermid;\n    };\n\n    /**\n     * Find the differences between two texts.  Assumes that the texts do not\n     * have any common prefix or suffix.\n     * @param {string} text1 Old string to be diffed.\n     * @param {string} text2 New string to be diffed.\n     * @param {boolean} checklines Speedup flag.  If false, then don't run a\n     *     line-level diff first to identify the changed areas.\n     *     If true, then run a faster, slightly less optimal diff.\n     * @param {number} deadline Time when the diff should be complete by.\n     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {\n      var diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;\n      if (!text1) {\n        // Just add some text (speedup).\n        return [[DIFF_INSERT, text2]];\n      }\n      if (!text2) {\n        // Just delete some text (speedup).\n        return [[DIFF_DELETE, text1]];\n      }\n      longtext = text1.length > text2.length ? text1 : text2;\n      shorttext = text1.length > text2.length ? text2 : text1;\n      i = longtext.indexOf(shorttext);\n      if (i !== -1) {\n        // Shorter text is inside the longer text (speedup).\n        diffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n\n        // Swap insertions for deletions if diff is reversed.\n        if (text1.length > text2.length) {\n          diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n        }\n        return diffs;\n      }\n      if (shorttext.length === 1) {\n        // Single character string.\n        // After the previous speedup, the character can't be an equality.\n        return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n      }\n\n      // Check to see if the problem can be split in two.\n      hm = this.diffHalfMatch(text1, text2);\n      if (hm) {\n        // A half-match was found, sort out the return data.\n        text1A = hm[0];\n        text1B = hm[1];\n        text2A = hm[2];\n        text2B = hm[3];\n        midCommon = hm[4];\n\n        // Send both pairs off for separate processing.\n        diffsA = this.DiffMain(text1A, text2A, checklines, deadline);\n        diffsB = this.DiffMain(text1B, text2B, checklines, deadline);\n\n        // Merge the results.\n        return diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);\n      }\n      if (checklines && text1.length > 100 && text2.length > 100) {\n        return this.diffLineMode(text1, text2, deadline);\n      }\n      return this.diffBisect(text1, text2, deadline);\n    };\n\n    /**\n     * Do the two texts share a substring which is at least half the length of the\n     * longer text?\n     * This speedup can produce non-minimal diffs.\n     * @param {string} text1 First string.\n     * @param {string} text2 Second string.\n     * @return {Array.<string>} Five element Array, containing the prefix of\n     *     text1, the suffix of text1, the prefix of text2, the suffix of\n     *     text2 and the common middle.  Or null if there was no match.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {\n      var longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;\n      longtext = text1.length > text2.length ? text1 : text2;\n      shorttext = text1.length > text2.length ? text2 : text1;\n      if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n        return null; // Pointless.\n      }\n\n      dmp = this; // 'this' becomes 'window' in a closure.\n\n      /**\n       * Does a substring of shorttext exist within longtext such that the substring\n       * is at least half the length of longtext?\n       * Closure, but does not reference any external variables.\n       * @param {string} longtext Longer string.\n       * @param {string} shorttext Shorter string.\n       * @param {number} i Start index of quarter length substring within longtext.\n       * @return {Array.<string>} Five element Array, containing the prefix of\n       *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n       *     of shorttext and the common middle.  Or null if there was no match.\n       * @private\n       */\n      function diffHalfMatchI(longtext, shorttext, i) {\n        var seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n        // Start with a 1/4 length substring at position i as a seed.\n        seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n        j = -1;\n        bestCommon = '';\n        while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n          prefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));\n          suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));\n          if (bestCommon.length < suffixLength + prefixLength) {\n            bestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);\n            bestLongtextA = longtext.substring(0, i - suffixLength);\n            bestLongtextB = longtext.substring(i + prefixLength);\n            bestShorttextA = shorttext.substring(0, j - suffixLength);\n            bestShorttextB = shorttext.substring(j + prefixLength);\n          }\n        }\n        if (bestCommon.length * 2 >= longtext.length) {\n          return [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];\n        } else {\n          return null;\n        }\n      }\n\n      // First check if the second quarter is the seed for a half-match.\n      hm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));\n\n      // Check again based on the third quarter.\n      hm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));\n      if (!hm1 && !hm2) {\n        return null;\n      } else if (!hm2) {\n        hm = hm1;\n      } else if (!hm1) {\n        hm = hm2;\n      } else {\n        // Both matched.  Select the longest.\n        hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n      }\n\n      // A half-match was found, sort out the return data.\n      if (text1.length > text2.length) {\n        text1A = hm[0];\n        text1B = hm[1];\n        text2A = hm[2];\n        text2B = hm[3];\n      } else {\n        text2A = hm[0];\n        text2B = hm[1];\n        text1A = hm[2];\n        text1B = hm[3];\n      }\n      midCommon = hm[4];\n      return [text1A, text1B, text2A, text2B, midCommon];\n    };\n\n    /**\n     * Do a quick line-level diff on both strings, then rediff the parts for\n     * greater accuracy.\n     * This speedup can produce non-minimal diffs.\n     * @param {string} text1 Old string to be diffed.\n     * @param {string} text2 New string to be diffed.\n     * @param {number} deadline Time when the diff should be complete by.\n     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {\n      var a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;\n\n      // Scan the text on a line-by-line basis first.\n      a = this.diffLinesToChars(text1, text2);\n      text1 = a.chars1;\n      text2 = a.chars2;\n      linearray = a.lineArray;\n      diffs = this.DiffMain(text1, text2, false, deadline);\n\n      // Convert the diff back to original text.\n      this.diffCharsToLines(diffs, linearray);\n\n      // Eliminate freak matches (e.g. blank lines)\n      this.diffCleanupSemantic(diffs);\n\n      // Rediff any replacement blocks, this time character-by-character.\n      // Add a dummy entry at the end.\n      diffs.push([DIFF_EQUAL, '']);\n      pointer = 0;\n      countDelete = 0;\n      countInsert = 0;\n      textDelete = '';\n      textInsert = '';\n      while (pointer < diffs.length) {\n        switch (diffs[pointer][0]) {\n          case DIFF_INSERT:\n            countInsert++;\n            textInsert += diffs[pointer][1];\n            break;\n          case DIFF_DELETE:\n            countDelete++;\n            textDelete += diffs[pointer][1];\n            break;\n          case DIFF_EQUAL:\n            // Upon reaching an equality, check for prior redundancies.\n            if (countDelete >= 1 && countInsert >= 1) {\n              // Delete the offending records and add the merged ones.\n              diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);\n              pointer = pointer - countDelete - countInsert;\n              a = this.DiffMain(textDelete, textInsert, false, deadline);\n              for (j = a.length - 1; j >= 0; j--) {\n                diffs.splice(pointer, 0, a[j]);\n              }\n              pointer = pointer + a.length;\n            }\n            countInsert = 0;\n            countDelete = 0;\n            textDelete = '';\n            textInsert = '';\n            break;\n        }\n        pointer++;\n      }\n      diffs.pop(); // Remove the dummy entry at the end.\n\n      return diffs;\n    };\n\n    /**\n     * Find the 'middle snake' of a diff, split the problem in two\n     * and return the recursively constructed diff.\n     * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n     * @param {string} text1 Old string to be diffed.\n     * @param {string} text2 New string to be diffed.\n     * @param {number} deadline Time at which to bail if not yet complete.\n     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {\n      var text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n      // Cache the text lengths to prevent multiple calls.\n      text1Length = text1.length;\n      text2Length = text2.length;\n      maxD = Math.ceil((text1Length + text2Length) / 2);\n      vOffset = maxD;\n      vLength = 2 * maxD;\n      v1 = new Array(vLength);\n      v2 = new Array(vLength);\n\n      // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n      // integers and undefined.\n      for (x = 0; x < vLength; x++) {\n        v1[x] = -1;\n        v2[x] = -1;\n      }\n      v1[vOffset + 1] = 0;\n      v2[vOffset + 1] = 0;\n      delta = text1Length - text2Length;\n\n      // If the total number of characters is odd, then the front path will collide\n      // with the reverse path.\n      front = delta % 2 !== 0;\n\n      // Offsets for start and end of k loop.\n      // Prevents mapping of space beyond the grid.\n      k1start = 0;\n      k1end = 0;\n      k2start = 0;\n      k2end = 0;\n      for (d = 0; d < maxD; d++) {\n        // Bail out if deadline is reached.\n        if (Date.now() > deadline) {\n          break;\n        }\n\n        // Walk the front path one step.\n        for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n          k1Offset = vOffset + k1;\n          if (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {\n            x1 = v1[k1Offset + 1];\n          } else {\n            x1 = v1[k1Offset - 1] + 1;\n          }\n          y1 = x1 - k1;\n          while (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {\n            x1++;\n            y1++;\n          }\n          v1[k1Offset] = x1;\n          if (x1 > text1Length) {\n            // Ran off the right of the graph.\n            k1end += 2;\n          } else if (y1 > text2Length) {\n            // Ran off the bottom of the graph.\n            k1start += 2;\n          } else if (front) {\n            k2Offset = vOffset + delta - k1;\n            if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {\n              // Mirror x2 onto top-left coordinate system.\n              x2 = text1Length - v2[k2Offset];\n              if (x1 >= x2) {\n                // Overlap detected.\n                return this.diffBisectSplit(text1, text2, x1, y1, deadline);\n              }\n            }\n          }\n        }\n\n        // Walk the reverse path one step.\n        for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n          k2Offset = vOffset + k2;\n          if (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {\n            x2 = v2[k2Offset + 1];\n          } else {\n            x2 = v2[k2Offset - 1] + 1;\n          }\n          y2 = x2 - k2;\n          while (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {\n            x2++;\n            y2++;\n          }\n          v2[k2Offset] = x2;\n          if (x2 > text1Length) {\n            // Ran off the left of the graph.\n            k2end += 2;\n          } else if (y2 > text2Length) {\n            // Ran off the top of the graph.\n            k2start += 2;\n          } else if (!front) {\n            k1Offset = vOffset + delta - k2;\n            if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {\n              x1 = v1[k1Offset];\n              y1 = vOffset + x1 - k1Offset;\n\n              // Mirror x2 onto top-left coordinate system.\n              x2 = text1Length - x2;\n              if (x1 >= x2) {\n                // Overlap detected.\n                return this.diffBisectSplit(text1, text2, x1, y1, deadline);\n              }\n            }\n          }\n        }\n      }\n\n      // Diff took too long and hit the deadline or\n      // number of diffs equals number of characters, no commonality at all.\n      return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n    };\n\n    /**\n     * Given the location of the 'middle snake', split the diff in two parts\n     * and recurse.\n     * @param {string} text1 Old string to be diffed.\n     * @param {string} text2 New string to be diffed.\n     * @param {number} x Index of split point in text1.\n     * @param {number} y Index of split point in text2.\n     * @param {number} deadline Time at which to bail if not yet complete.\n     * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {\n      var text1a, text1b, text2a, text2b, diffs, diffsb;\n      text1a = text1.substring(0, x);\n      text2a = text2.substring(0, y);\n      text1b = text1.substring(x);\n      text2b = text2.substring(y);\n\n      // Compute both diffs serially.\n      diffs = this.DiffMain(text1a, text2a, false, deadline);\n      diffsb = this.DiffMain(text1b, text2b, false, deadline);\n      return diffs.concat(diffsb);\n    };\n\n    /**\n     * Reduce the number of edits by eliminating semantically trivial equalities.\n     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n     */\n    DiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {\n      var changes = false;\n      var equalities = []; // Stack of indices where equalities are found.\n      var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n      /** @type {?string} */\n      var lastequality = null;\n\n      // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n      var pointer = 0; // Index of current position.\n\n      // Number of characters that changed prior to the equality.\n      var lengthInsertions1 = 0;\n      var lengthDeletions1 = 0;\n\n      // Number of characters that changed after the equality.\n      var lengthInsertions2 = 0;\n      var lengthDeletions2 = 0;\n      while (pointer < diffs.length) {\n        if (diffs[pointer][0] === DIFF_EQUAL) {\n          // Equality found.\n          equalities[equalitiesLength++] = pointer;\n          lengthInsertions1 = lengthInsertions2;\n          lengthDeletions1 = lengthDeletions2;\n          lengthInsertions2 = 0;\n          lengthDeletions2 = 0;\n          lastequality = diffs[pointer][1];\n        } else {\n          // An insertion or deletion.\n          if (diffs[pointer][0] === DIFF_INSERT) {\n            lengthInsertions2 += diffs[pointer][1].length;\n          } else {\n            lengthDeletions2 += diffs[pointer][1].length;\n          }\n\n          // Eliminate an equality that is smaller or equal to the edits on both\n          // sides of it.\n          if (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {\n            // Duplicate record.\n            diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n            // Change second copy to insert.\n            diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n\n            // Throw away the equality we just deleted.\n            equalitiesLength--;\n\n            // Throw away the previous equality (it needs to be reevaluated).\n            equalitiesLength--;\n            pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n\n            // Reset the counters.\n            lengthInsertions1 = 0;\n            lengthDeletions1 = 0;\n            lengthInsertions2 = 0;\n            lengthDeletions2 = 0;\n            lastequality = null;\n            changes = true;\n          }\n        }\n        pointer++;\n      }\n\n      // Normalize the diff.\n      if (changes) {\n        this.diffCleanupMerge(diffs);\n      }\n      var deletion, insertion, overlapLength1, overlapLength2;\n\n      // Find any overlaps between deletions and insertions.\n      // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n      //   -> <del>abc</del>xxx<ins>def</ins>\n      // e.g: <del>xxxabc</del><ins>defxxx</ins>\n      //   -> <ins>def</ins>xxx<del>abc</del>\n      // Only extract an overlap if it is as big as the edit ahead or behind it.\n      pointer = 1;\n      while (pointer < diffs.length) {\n        if (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {\n          deletion = diffs[pointer - 1][1];\n          insertion = diffs[pointer][1];\n          overlapLength1 = this.diffCommonOverlap(deletion, insertion);\n          overlapLength2 = this.diffCommonOverlap(insertion, deletion);\n          if (overlapLength1 >= overlapLength2) {\n            if (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {\n              // Overlap found.  Insert an equality and trim the surrounding edits.\n              diffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);\n              diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);\n              diffs[pointer + 1][1] = insertion.substring(overlapLength1);\n              pointer++;\n            }\n          } else {\n            if (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {\n              // Reverse overlap found.\n              // Insert an equality and swap and trim the surrounding edits.\n              diffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);\n              diffs[pointer - 1][0] = DIFF_INSERT;\n              diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);\n              diffs[pointer + 1][0] = DIFF_DELETE;\n              diffs[pointer + 1][1] = deletion.substring(overlapLength2);\n              pointer++;\n            }\n          }\n          pointer++;\n        }\n        pointer++;\n      }\n    };\n\n    /**\n     * Determine if the suffix of one string is the prefix of another.\n     * @param {string} text1 First string.\n     * @param {string} text2 Second string.\n     * @return {number} The number of characters common to the end of the first\n     *     string and the start of the second string.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {\n      // Cache the text lengths to prevent multiple calls.\n      var text1Length = text1.length;\n      var text2Length = text2.length;\n\n      // Eliminate the null case.\n      if (text1Length === 0 || text2Length === 0) {\n        return 0;\n      }\n\n      // Truncate the longer string.\n      if (text1Length > text2Length) {\n        text1 = text1.substring(text1Length - text2Length);\n      } else if (text1Length < text2Length) {\n        text2 = text2.substring(0, text1Length);\n      }\n      var textLength = Math.min(text1Length, text2Length);\n\n      // Quick check for the worst case.\n      if (text1 === text2) {\n        return textLength;\n      }\n\n      // Start by looking for a single character match\n      // and increase length until no match is found.\n      // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n      var best = 0;\n      var length = 1;\n      while (true) {\n        var pattern = text1.substring(textLength - length);\n        var found = text2.indexOf(pattern);\n        if (found === -1) {\n          return best;\n        }\n        length += found;\n        if (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {\n          best = length;\n          length++;\n        }\n      }\n    };\n\n    /**\n     * Split two texts into an array of strings.  Reduce the texts to a string of\n     * hashes where each Unicode character represents one line.\n     * @param {string} text1 First string.\n     * @param {string} text2 Second string.\n     * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n     *     An object containing the encoded text1, the encoded text2 and\n     *     the array of unique strings.\n     *     The zeroth element of the array of unique strings is intentionally blank.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {\n      var lineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n      var lineHash = {}; // E.g. lineHash['Hello\\n'] === 4\n\n      // '\\x00' is a valid character, but various debuggers don't like it.\n      // So we'll insert a junk entry to avoid generating a null character.\n      lineArray[0] = '';\n\n      /**\n       * Split a text into an array of strings.  Reduce the texts to a string of\n       * hashes where each Unicode character represents one line.\n       * Modifies linearray and linehash through being a closure.\n       * @param {string} text String to encode.\n       * @return {string} Encoded string.\n       * @private\n       */\n      function diffLinesToCharsMunge(text) {\n        var chars = '';\n\n        // Walk the text, pulling out a substring for each line.\n        // text.split('\\n') would would temporarily double our memory footprint.\n        // Modifying text would create many large strings to garbage collect.\n        var lineStart = 0;\n        var lineEnd = -1;\n\n        // Keeping our own length variable is faster than looking it up.\n        var lineArrayLength = lineArray.length;\n        while (lineEnd < text.length - 1) {\n          lineEnd = text.indexOf('\\n', lineStart);\n          if (lineEnd === -1) {\n            lineEnd = text.length - 1;\n          }\n          var line = text.substring(lineStart, lineEnd + 1);\n          lineStart = lineEnd + 1;\n          if (hasOwn.call(lineHash, line)) {\n            chars += String.fromCharCode(lineHash[line]);\n          } else {\n            chars += String.fromCharCode(lineArrayLength);\n            lineHash[line] = lineArrayLength;\n            lineArray[lineArrayLength++] = line;\n          }\n        }\n        return chars;\n      }\n      var chars1 = diffLinesToCharsMunge(text1);\n      var chars2 = diffLinesToCharsMunge(text2);\n      return {\n        chars1: chars1,\n        chars2: chars2,\n        lineArray: lineArray\n      };\n    };\n\n    /**\n     * Rehydrate the text in a diff from a string of line hashes to real lines of\n     * text.\n     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n     * @param {!Array.<string>} lineArray Array of unique strings.\n     * @private\n     */\n    DiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {\n      for (var x = 0; x < diffs.length; x++) {\n        var chars = diffs[x][1];\n        var text = [];\n        for (var y = 0; y < chars.length; y++) {\n          text[y] = lineArray[chars.charCodeAt(y)];\n        }\n        diffs[x][1] = text.join('');\n      }\n    };\n\n    /**\n     * Reorder and merge like edit sections.  Merge equalities.\n     * Any edit section can move as long as it doesn't cross an equality.\n     * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n     */\n    DiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {\n      diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end.\n      var pointer = 0;\n      var countDelete = 0;\n      var countInsert = 0;\n      var textDelete = '';\n      var textInsert = '';\n      while (pointer < diffs.length) {\n        switch (diffs[pointer][0]) {\n          case DIFF_INSERT:\n            countInsert++;\n            textInsert += diffs[pointer][1];\n            pointer++;\n            break;\n          case DIFF_DELETE:\n            countDelete++;\n            textDelete += diffs[pointer][1];\n            pointer++;\n            break;\n          case DIFF_EQUAL:\n            // Upon reaching an equality, check for prior redundancies.\n            if (countDelete + countInsert > 1) {\n              if (countDelete !== 0 && countInsert !== 0) {\n                // Factor out any common prefixes.\n                var commonlength = this.diffCommonPrefix(textInsert, textDelete);\n                if (commonlength !== 0) {\n                  if (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {\n                    diffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);\n                  } else {\n                    diffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);\n                    pointer++;\n                  }\n                  textInsert = textInsert.substring(commonlength);\n                  textDelete = textDelete.substring(commonlength);\n                }\n\n                // Factor out any common suffixies.\n                commonlength = this.diffCommonSuffix(textInsert, textDelete);\n                if (commonlength !== 0) {\n                  diffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];\n                  textInsert = textInsert.substring(0, textInsert.length - commonlength);\n                  textDelete = textDelete.substring(0, textDelete.length - commonlength);\n                }\n              }\n\n              // Delete the offending records and add the merged ones.\n              if (countDelete === 0) {\n                diffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);\n              } else if (countInsert === 0) {\n                diffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);\n              } else {\n                diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);\n              }\n              pointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;\n            } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n              // Merge this equality with the previous one.\n              diffs[pointer - 1][1] += diffs[pointer][1];\n              diffs.splice(pointer, 1);\n            } else {\n              pointer++;\n            }\n            countInsert = 0;\n            countDelete = 0;\n            textDelete = '';\n            textInsert = '';\n            break;\n        }\n      }\n      if (diffs[diffs.length - 1][1] === '') {\n        diffs.pop(); // Remove the dummy entry at the end.\n      }\n\n      // Second pass: look for single edits surrounded on both sides by equalities\n      // which can be shifted sideways to eliminate an equality.\n      // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n      var changes = false;\n      pointer = 1;\n\n      // Intentionally ignore the first and last element (don't need checking).\n      while (pointer < diffs.length - 1) {\n        if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n          var diffPointer = diffs[pointer][1];\n          var position = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);\n\n          // This is a single edit surrounded by equalities.\n          if (position === diffs[pointer - 1][1]) {\n            // Shift the edit over the previous equality.\n            diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n            diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n            diffs.splice(pointer - 1, 1);\n            changes = true;\n          } else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {\n            // Shift the edit over the next equality.\n            diffs[pointer - 1][1] += diffs[pointer + 1][1];\n            diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n            diffs.splice(pointer + 1, 1);\n            changes = true;\n          }\n        }\n        pointer++;\n      }\n\n      // If shifts were made, the diff needs reordering and another shift sweep.\n      if (changes) {\n        this.diffCleanupMerge(diffs);\n      }\n    };\n    return function (o, n) {\n      var diff, output, text;\n      diff = new DiffMatchPatch();\n      output = diff.DiffMain(o, n);\n      diff.diffCleanupEfficiency(output);\n      text = diff.diffPrettyHtml(output);\n      return text;\n    };\n  }();\n\n})();\n"
  },
  {
    "path": "common/Tests/External/qunit.d.ts",
    "content": "// Type definitions for QUnit 1.10\n// Project: http://qunitjs.com/\n// Definitions by: Diullei Gomes <https://github.com/diullei>\n// DefinitelyTyped: https://github.com/borisyankov/DefinitelyTyped\n\n\ninterface DoneCallbackObject {\n\t/**\n\t* The number of failed assertions\n\t*/\n\tfailed: number;\n\n\t/**\n\t* The number of passed assertions\n\t*/\n\tpassed: number;\n\n\t/**\n\t* The total number of assertions\n\t*/\n\ttotal: number;\n\n\t/**\n\t* The time in milliseconds it took tests to run from start to finish.\n\t*/\n\truntime: number;\n}\n\ninterface LogCallbackObject {\n\t/**\n\t* The boolean result of an assertion, true means passed, false means failed.\n\t*/\n\tresult: boolean;\n\n\t/**\n\t* One side of a comparision assertion. Can be undefined when ok() is used.\n\t*/\n\tactual: Object;\n\n\t/**\n\t* One side of a comparision assertion. Can be undefined when ok() is used.\n\t*/\n\texpected: Object;\n\n\t/**\n\t* A string description provided by the assertion.\n\t*/\n\tmessage: string;\n\n\t/**\n\t* The associated stacktrace, either from an exception or pointing to the source \n\t* of the assertion. Depends on browser support for providing stacktraces, so can be \n\t* undefined.\n\t*/\n\tsource: string;\n}\n\ninterface ModuleStartCallbackObject {\n\t/**\n\t* Name of the next module to run\n\t*/\n\tname: string;\n}\n\ninterface ModuleDoneCallbackObject {\n\t/**\n\t* Name of this module\n\t*/\n\tname: string;\n\n\t/**\n\t* The number of failed assertions\n\t*/\n\tfailed: number;\n\n\t/**\n\t* The number of passed assertions\n\t*/\n\tpassed: number;\n\n\t/**\n\t* The total number of assertions\n\t*/\n\ttotal: number;\n}\n\ninterface TestDoneCallbackObject {\n\t/**\n\t* TName of the next test to run\n\t*/\n\tname: string;\n\n\t/**\n\t* Name of the current module\n\t*/\n\tmodule: string;\n\n\t/**\n\t* The number of failed assertions\n\t*/\n\tfailed: number;\n\n\t/**\n\t* The number of passed assertions\n\t*/\n\tpassed: number;\n\n\t/**\n\t* The total number of assertions\n\t*/\n\ttotal: number;\n\n\t/**\n\t* The total runtime, including setup and teardown\n\t*/\n\tduration: number;\n}\n\ninterface TestStartCallbackObject {\n\t/**\n\t* Name of the next test to run\n\t*/\n\tname: string;\n\n\t/**\n\t* Name of the current module\n\t*/\n\tmodule: string;\n}\n\ninterface Config {\n\taltertitle: boolean;\n\tautostart: boolean;\n\tcurrent: Object;\n\treorder: boolean;\n\trequireExpects: boolean;\n\ttestTimeout: number;\n\turlConfig: Array<URLConfigItem>;\n\tdone: any;\n}\n\ninterface URLConfigItem {\n\tid: string;\n\tlabel: string;\n\ttooltip: string;\n}\n\ninterface LifecycleObject {\n\t/**\n\t* Runs before each test\n\t*/\n\tsetup?: () => any;\n\n\t/**\n\t* Runs after each test\n\t*/\n\tteardown?: () => any;\n}\n\ninterface QUnitAssert {\n\t/* ASSERT */\n\tassert: any;\n\tcurrent_testEnvironment: any;\n\tjsDump: any;\n\n\t/**\n\t* A deep recursive comparison assertion, working on primitive types, arrays, objects, \n\t* regular expressions, dates and functions.\n\t*\n\t* The deepEqual() assertion can be used just like equal() when comparing the value of \n\t* objects, such that { key: value } is equal to { key: value }. For non-scalar values, \n\t* identity will be disregarded by deepEqual.\n\t*\n\t* @param actual - Object or Expression being tested\n\t* @param expected - Known comparison value\n\t* @param message - A short description of the assertion\n\t*/\n\tdeepEqual(actual: any, expected: any, message?: string): any;\n\n\t/** \n\t* A non-strict comparison assertion, roughly equivalent to JUnit assertEquals.\n\t*\n\t* The equal assertion uses the simple comparison operator (==) to compare the actual \n\t* and expected arguments. When they are equal, the assertion passes: any; otherwise, it fails. \n\t* When it fails, both actual and expected values are displayed in the test result, \n\t* in addition to a given message.\n\t* \n\t* @param actual - Expression being tested\n\t* @param expected - Known comparison value\n\t* @param message - A short description of the assertion\n\t*/\n\tequal(actual: any, expected: any, message?: string): any;\n\n\t/**\n\t* An inverted deep recursive comparison assertion, working on primitive types, \n\t* arrays, objects, regular expressions, dates and functions.\n\t*\n\t* The notDeepEqual() assertion can be used just like equal() when comparing the \n\t* value of objects, such that { key: value } is equal to { key: value }. For non-scalar \n\t* values, identity will be disregarded by notDeepEqual.\n\t* \n\t* @param actual - Object or Expression being tested\n\t* @param expected - Known comparison value\n\t* @param message - A short description of the assertion\n\t*/\n\tnotDeepEqual(actual: any, expected: any, message?: string): any;\n\n\t/**\n\t* A non-strict comparison assertion, checking for inequality.\n\t*\n\t* The notEqual assertion uses the simple inverted comparison operator (!=) to compare \n\t* the actual and expected arguments. When they aren't equal, the assertion passes: any; \n\t* otherwise, it fails. When it fails, both actual and expected values are displayed \n\t* in the test result, in addition to a given message.\n\t* \n\t* @param actual - Expression being tested\n\t* @param expected - Known comparison value\n\t* @param message - A short description of the assertion\n\t*/\n\tnotEqual(actual: any, expected: any, message?: string): any;\n\n\tnotPropEqual(actual: any, expected: any, message?: string): any;\n\n\tpropEqual(actual: any, expected: any, message?: string): any;\n\n\t/**\n\t* A non-strict comparison assertion, checking for inequality.\n\t*\n\t* The notStrictEqual assertion uses the strict inverted comparison operator (!==) \n\t* to compare the actual and expected arguments. When they aren't equal, the assertion \n\t* passes: any; otherwise, it fails. When it fails, both actual and expected values are \n\t* displayed in the test result, in addition to a given message.\n\t* \n\t* @param actual - Expression being tested\n\t* @param expected - Known comparison value\n\t* @param message - A short description of the assertion\n\t*/\n\tnotStrictEqual(actual: any, expected: any, message?: string): any;\n\n\t/**\n\t* A boolean assertion, equivalent to CommonJS’s assert.ok() and JUnit’s assertTrue(). \n\t* Passes if the first argument is truthy.\n\t*\n\t* The most basic assertion in QUnit, ok() requires just one argument. If the argument \n\t* evaluates to true, the assertion passes; otherwise, it fails. If a second message \n\t* argument is provided, it will be displayed in place of the result.\n\t* \n\t* @param state - Expression being tested\n\t* @param message - A short description of the assertion\n\t*/\n\tok(state: any, message?: string): any;\n\n\t/**\n\t* A strict type and value comparison assertion.\n\t*\n\t* The strictEqual() assertion provides the most rigid comparison of type and value with \n\t* the strict equality operator (===)\n\t* \n\t* @param actual - Expression being tested\n\t* @param expected - Known comparison value\n\t* @param message - A short description of the assertion\n\t*/\n\tstrictEqual(actual: any, expected: any, message?: string): any;\n\n\t/**\n\t* Assertion to test if a callback throws an exception when run.\n\t* \n\t* When testing code that is expected to throw an exception based on a specific set of \n\t* circumstances, use throws() to catch the error object for testing and comparison.\n\t* \n\t* @param block - Function to execute\n\t* @param expected - Error Object to compare\n\t* @param message - A short description of the assertion\n\t*/\n\tthrows(block: () => any, expected: any, message?: string): any;\n\n\t/**\n\t* @param block - Function to execute\n\t* @param message - A short description of the assertion\n\t*/\n\tthrows(block: () => any, message?: string): any;\n}\n\ninterface QUnitStatic extends QUnitAssert{\t\n\t/* ASYNC CONTROL */\n\n\t/**\n\t* Start running tests again after the testrunner was stopped. See stop().\n\t*\n\t* When your async test has multiple exit points, call start() for the corresponding number of stop() increments.\n\t* \n\t* @param decrement - Optional argument to merge multiple start() calls into one. Use with multiple corrsponding stop() calls.\n\t*/\n\tstart(decrement?: number): any;\n\n\t/**\n\t* Stop the testrunner to wait for async tests to run. Call start() to continue.\n\t*\n\t* When your async test has multiple exit points, call stop() with the increment argument, corresponding to the number of start() calls you need.\n\t*\n\t* On Blackberry 5.0, window.stop is a native read-only function. If you deal with that browser, use QUnit.stop() instead, which will work anywhere.\n\t*\n\t* @param decrement - Optional argument to merge multiple stop() calls into one. Use with multiple corrsponding start() calls.\n\t*/\n\tstop(increment? : number): any;\n\t\n\t/* CALLBACKS */\n\n\t/**\n\t* Register a callback to fire whenever the test suite begins.\n\t*\n\t* QUnit.begin() is called once before running any tests. (a better would've been QUnit.start, \n\t* but thats already in use elsewhere and can't be changed.)\n\t*\n\t* @param callback - Callback to execute\n\t*/\n\tbegin(callback: () => any): any;\n\n\t/**\n\t* Register a callback to fire whenever the test suite ends.\n\t*\n\t* @param callback - Callback to execute.\n\t*/\n\tdone(callback: (details: DoneCallbackObject) => any): any;\n\n\t/**\n\t* Register a callback to fire whenever an assertion completes.\n\t*\n\t* This is one of several callbacks QUnit provides. Its intended for integration scenarios like \n\t* PhantomJS or Jenkins. The properties of the details argument are listed below as options.\n\t*\n\t* @param callback - Callback to execute.\n\t*/\n\tlog(callback: (details: LogCallbackObject) => any): any;\n\n\t/**\n\t* Register a callback to fire whenever a module ends.\n\t*\n\t* @param callback - Callback to execute.\n\t*/\n\tmoduleDone(callback: (details: ModuleDoneCallbackObject) => any): any;\n\n\t/**\n\t* Register a callback to fire whenever a module begins.\n\t*\n\t* @param callback - Callback to execute.\n\t*/\n\tmoduleStart(callback: (details: ModuleStartCallbackObject) => any): any;\n\n\t/**\n\t* Register a callback to fire whenever a test ends.\n\t*\n\t* @param callback - Callback to execute.\n\t*/\n\ttestDone(callback: (details: TestDoneCallbackObject) => any): any;\n\n\t/**\n\t* Register a callback to fire whenever a test begins.\n\t*\n\t* @param callback - Callback to execute.\n\t*/\n\ttestStart(callback: (details: TestStartCallbackObject) => any): any;\n\t\n\t/* CONFIGURATION */\n\n\t/**\n\t* QUnit has a bunch of internal configuration defaults, some of which are \n\t* useful to override. Check the description for each option for details.\n\t*/\n\tconfig: Config;\n\t\n\t/* TEST */\n\n\t/**\n\t* Add an asynchronous test to run. The test must include a call to start().\n\t*\n\t* For testing asynchronous code, asyncTest will automatically stop the test runner \n\t* and wait for your code to call start() to continue.\n\t*\n\t* @param name - Title of unit being tested\n\t* @param expected - Number of assertions in this test\n\t* @param test - Function to close over assertions\n\t*/\n\tasyncTest(name: string, expected: number, test: () => any): any;\n\n\t/**\n\t* Add an asynchronous test to run. The test must include a call to start().\n\t*\n\t* For testing asynchronous code, asyncTest will automatically stop the test runner \n\t* and wait for your code to call start() to continue.\n\t*\n\t* @param name - Title of unit being tested\n\t* @param test - Function to close over assertions\n\t*/\n\tasyncTest(name: string, test: () => any): any;\n\n\t/**\n\t* Specify how many assertions are expected to run within a test.\n\t*\n\t* To ensure that an explicit number of assertions are run within any test, use \n\t* expect( number ) to register an expected count. If the number of assertions \n\t* run does not match the expected count, the test will fail.\n\t*\n\t* @param amount - Number of assertions in this test.\n\t*/\n\texpect(amount: number): any;\n\n\t/**\n\t* Group related tests under a single label.\n\t*\n\t* All tests that occur after a call to module() will be grouped into that module. \n\t* The test names will all be preceded by the module name in the test results. \n\t* You can then use that module name to select tests to run.\n\t*\n\t* @param name - Label for this group of tests\n\t* @param lifecycle - Callbacks to run before and after each test\n\t*/\n\tmodule(name: string, lifecycle?: LifecycleObject): any;\n\n\t/**\n\t* Add a test to run.\n\t*\n\t* When testing the most common, synchronous code, use test().\n\t* The assert argument to the callback contains all of QUnit's assertion methods. \n\t* If you are avoiding using any of QUnit's globals, you can use the assert \n\t* argument instead.\n\t* \n\t* @param title - Title of unit being tested\n\t* @param expected - Number of assertions in this test\n\t* @param test - Function to close over assertions\n\t*/\n\ttest(title: string, expected: number, test: (assert: QUnitAssert) => any): any;\n\n\t/**\n\t* @param title - Title of unit being tested\n\t* @param test - Function to close over assertions\n\t*/\n\ttest(title: string, test: (assert: QUnitAssert) => any): any;\n\n\t/**\n\t* https://github.com/jquery/qunit/blob/master/qunit/qunit.js#L1568\n\t*/\n\tequiv(a: any, b: any): any;\n\n\t// https://github.com/jquery/qunit/blob/master/qunit/qunit.js#L661\n\traises: any;\n\n\t/**\n\t* https://github.com/jquery/qunit/blob/master/qunit/qunit.js#L897\n\t*/\n\tpush(result: any, actual: any, expected: any, message: string): any;\n\n\t/**\n\t* https://github.com/jquery/qunit/blob/master/qunit/qunit.js#L839\n\t*/\n\treset(): any;\n}\n\n/* ASSERT */\n\n/**\n* A deep recursive comparison assertion, working on primitive types, arrays, objects, \n* regular expressions, dates and functions.\n*\n* The deepEqual() assertion can be used just like equal() when comparing the value of \n* objects, such that { key: value } is equal to { key: value }. For non-scalar values, \n* identity will be disregarded by deepEqual.\n*\n* @param actual - Object or Expression being tested\n* @param expected - Known comparison value\n* @param message - A short description of the assertion\n*/\ndeclare function deepEqual(actual: any, expected: any, message?: string): any;\n\n/** \n* A non-strict comparison assertion, roughly equivalent to JUnit assertEquals.\n*\n* The equal assertion uses the simple comparison operator (==) to compare the actual \n* and expected arguments. When they are equal, the assertion passes: any; otherwise, it fails. \n* When it fails, both actual and expected values are displayed in the test result, \n* in addition to a given message.\n* \n* @param actual - Expression being tested\n* @param expected - Known comparison value\n* @param message - A short description of the assertion\n*/\ndeclare function equal(actual: any, expected: any, message?: string): any;\n\n/**\n* An inverted deep recursive comparison assertion, working on primitive types, \n* arrays, objects, regular expressions, dates and functions.\n*\n* The notDeepEqual() assertion can be used just like equal() when comparing the \n* value of objects, such that { key: value } is equal to { key: value }. For non-scalar \n* values, identity will be disregarded by notDeepEqual.\n* \n* @param actual - Object or Expression being tested\n* @param expected - Known comparison value\n* @param message - A short description of the assertion\n*/\ndeclare function notDeepEqual(actual: any, expected: any, message?: string): any;\n\n/**\n* A non-strict comparison assertion, checking for inequality.\n*\n* The notEqual assertion uses the simple inverted comparison operator (!=) to compare \n* the actual and expected arguments. When they aren't equal, the assertion passes; \n* otherwise, it fails. When it fails, both actual and expected values are displayed \n* in the test result, in addition to a given message.\n* \n* @param actual - Expression being tested\n* @param expected - Known comparison value\n* @param message - A short description of the assertion\n*/\ndeclare function notEqual(actual: any, expected: any, message?: string): any;\n\n/**\n* A non-strict comparison assertion, checking for inequality.\n*\n* The notStrictEqual assertion uses the strict inverted comparison operator (!==) \n* to compare the actual and expected arguments. When they aren't equal, the assertion \n* passes; otherwise, it fails. When it fails, both actual and expected values are \n* displayed in the test result, in addition to a given message.\n* \n* @param actual - Expression being tested\n* @param expected - Known comparison value\n* @param message - A short description of the assertion\n*/\ndeclare function notStrictEqual(actual: any, expected: any, message?: string): any;\n\n/**\n* A boolean assertion, equivalent to CommonJS’s assert.ok() and JUnit’s assertTrue(). \n* Passes if the first argument is truthy.\n*\n* The most basic assertion in QUnit, ok() requires just one argument. If the argument \n* evaluates to true, the assertion passes; otherwise, it fails. If a second message \n* argument is provided, it will be displayed in place of the result.\n* \n* @param state - Expression being tested\n* @param message - A short description of the assertion\n*/\ndeclare function ok(state: any, message?: string): any;\n\n/**\n* A strict type and value comparison assertion.\n*\n* The strictEqual() assertion provides the most rigid comparison of type and value with \n* the strict equality operator (===)\n* \n* @param actual - Expression being tested\n* @param expected - Known comparison value\n* @param message - A short description of the assertion\n*/\ndeclare function strictEqual(actual: any, expected: any, message?: string): any;\n\n/**\n* Assertion to test if a callback throws an exception when run.\n* \n* When testing code that is expected to throw an exception based on a specific set of \n* circumstances, use throws() to catch the error object for testing and comparison.\n* \n* @param block - Function to execute\n* @param expected - Error Object to compare\n* @param message - A short description of the assertion\n*/\ndeclare function throws(block: () => any, expected: any, message?: string): any;\n\n/**\n* @param block - Function to execute\n* @param message - A short description of the assertion\n*/\ndeclare function throws(block: () => any, message?: string): any;\n\n/* ASYNC CONTROL */\n\n/**\n* Start running tests again after the testrunner was stopped. See stop().\n*\n* When your async test has multiple exit points, call start() for the corresponding number of stop() increments.\n* \n* @param decrement - Optional argument to merge multiple start() calls into one. Use with multiple corrsponding stop() calls.\n*/\ndeclare function start(decrement?: number): any;\n\n/**\n* Stop the testrunner to wait for async tests to run. Call start() to continue.\n*\n* When your async test has multiple exit points, call stop() with the increment argument, corresponding to the number of start() calls you need.\n*\n* On Blackberry 5.0, window.stop is a native read-only function. If you deal with that browser, use QUnit.stop() instead, which will work anywhere.\n*\n* @param decrement - Optional argument to merge multiple stop() calls into one. Use with multiple corrsponding start() calls.\n*/\ndeclare function stop(increment? : number): any;\n\t\n/* CALLBACKS */\n\n/**\n* Register a callback to fire whenever the test suite begins.\n*\n* QUnit.begin() is called once before running any tests. (a better would've been QUnit.start, \n* but thats already in use elsewhere and can't be changed.)\n*\n* @param callback - Callback to execute\n*/\ndeclare function begin(callback: () => any): any;\n\n/**\n* Register a callback to fire whenever the test suite ends.\n*\n* @param callback - Callback to execute.\n*/\ndeclare function done(callback: (details: DoneCallbackObject) => any): any;\n\n/**\n* Register a callback to fire whenever an assertion completes.\n*\n* This is one of several callbacks QUnit provides. Its intended for integration scenarios like \n* PhantomJS or Jenkins. The properties of the details argument are listed below as options.\n*\n* @param callback - Callback to execute.\n*/\ndeclare function log(callback: (details: LogCallbackObject) => any): any;\n\n/**\n* Register a callback to fire whenever a module ends.\n*\n* @param callback - Callback to execute.\n*/\ndeclare function moduleDone(callback: (details: ModuleDoneCallbackObject) => any): any;\n\n/**\n* Register a callback to fire whenever a module begins.\n*\n* @param callback - Callback to execute.\n*/\ndeclare function moduleStart(callback: (name: string) => any): any;\n\n/**\n* Register a callback to fire whenever a test ends.\n*\n* @param callback - Callback to execute.\n*/\ndeclare function testDone(callback: (details: TestDoneCallbackObject) => any): any;\n\n/**\n* Register a callback to fire whenever a test begins.\n*\n* @param callback - Callback to execute.\n*/\ndeclare function testStart(callback: (details: TestStartCallbackObject) => any): any;\n\t\n/* TEST */\n\n/**\n* Add an asynchronous test to run. The test must include a call to start().\n*\n* For testing asynchronous code, asyncTest will automatically stop the test runner \n* and wait for your code to call start() to continue.\n*\n* @param name - Title of unit being tested\n* @param expected - Number of assertions in this test\n* @param test - Function to close over assertions\n*/\ndeclare function asyncTest(name: string, expected?: any, test?: () => any): any;\n\n/**\n* Add an asynchronous test to run. The test must include a call to start().\n*\n* For testing asynchronous code, asyncTest will automatically stop the test runner \n* and wait for your code to call start() to continue.\n*\n* @param name - Title of unit being tested\n* @param test - Function to close over assertions\n*/\ndeclare function asyncTest(name: string, test: () => any): any;\n\n/**\n* Specify how many assertions are expected to run within a test.\n*\n* To ensure that an explicit number of assertions are run within any test, use \n* expect( number ) to register an expected count. If the number of assertions \n* run does not match the expected count, the test will fail.\n*\n* @param amount - Number of assertions in this test.\n*/\ndeclare function expect(amount: number): any;\n\n// ** conflict with TypeScript module keyword. Must be used on QUnit namespace\n//declare var module: (name: string, lifecycle?: LifecycleObject) => any;\n\n/**\n* Add a test to run.\n*\n* When testing the most common, synchronous code, use test().\n* The assert argument to the callback contains all of QUnit's assertion methods. \n* If you are avoiding using any of QUnit's globals, you can use the assert \n* argument instead.\n* \n* @param title - Title of unit being tested\n* @param expected - Number of assertions in this test\n* @param test - Function to close over assertions\n*/\ndeclare function test(title: string, expected: number, test: (assert?: QUnitAssert) => any): any;\n\n/**\n* @param title - Title of unit being tested\n* @param test - Function to close over assertions\n*/\ndeclare function test(title: string, test: (assert?: QUnitAssert) => any): any;\n\ndeclare function notPropEqual(actual: any, expected: any, message?: string): any;\n\ndeclare function propEqual(actual: any, expected: any, message?: string): any;\n\n// https://github.com/jquery/qunit/blob/master/qunit/qunit.js#L1568\ndeclare function equiv(a: any, b: any): any;\n\n// https://github.com/jquery/qunit/blob/master/qunit/qunit.js#L661\ndeclare var raises: any;\n\n/* QUNIT */\ndeclare var QUnit: QUnitStatic;"
  },
  {
    "path": "common/Tests/External/require-2.2.0.js",
    "content": "/** vim: et:ts=4:sw=4:sts=4\n * @license RequireJS 2.2.0 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/requirejs/LICENSE\n */\n//Not using strict: uneven strict support in browsers, #392, and causes\n//problems with requirejs.exec()/transpiler plugins that may not be strict.\n/*jslint regexp: true, nomen: true, sloppy: true */\n/*global window, navigator, document, importScripts, setTimeout, opera */\n\nvar requirejs, require, define;\n(function (global) {\n    var req, s, head, baseElement, dataMain, src,\n        interactiveScript, currentlyAddingScript, mainScript, subPath,\n        version = '2.2.0',\n        commentRegExp = /(\\/\\*([\\s\\S]*?)\\*\\/|([^:]|^)\\/\\/(.*)$)/mg,\n        cjsRequireRegExp = /[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,\n        jsSuffixRegExp = /\\.js$/,\n        currDirRegExp = /^\\.\\//,\n        op = Object.prototype,\n        ostring = op.toString,\n        hasOwn = op.hasOwnProperty,\n        isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document),\n        isWebWorker = !isBrowser && typeof importScripts !== 'undefined',\n        //PS3 indicates loaded and complete, but need to wait for complete\n        //specifically. Sequence is 'loading', 'loaded', execution,\n        // then 'complete'. The UA check is unfortunate, but not sure how\n        //to feature test w/o causing perf issues.\n        readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?\n                      /^complete$/ : /^(complete|loaded)$/,\n        defContextName = '_',\n        //Oh the tragedy, detecting opera. See the usage of isOpera for reason.\n        isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',\n        contexts = {},\n        cfg = {},\n        globalDefQueue = [],\n        useInteractive = false;\n\n    //Could match something like ')//comment', do not lose the prefix to comment.\n    function commentReplace(match, multi, multiText, singlePrefix) {\n        return singlePrefix || '';\n    }\n\n    function isFunction(it) {\n        return ostring.call(it) === '[object Function]';\n    }\n\n    function isArray(it) {\n        return ostring.call(it) === '[object Array]';\n    }\n\n    /**\n     * Helper function for iterating over an array. If the func returns\n     * a true value, it will break out of the loop.\n     */\n    function each(ary, func) {\n        if (ary) {\n            var i;\n            for (i = 0; i < ary.length; i += 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Helper function for iterating over an array backwards. If the func\n     * returns a true value, it will break out of the loop.\n     */\n    function eachReverse(ary, func) {\n        if (ary) {\n            var i;\n            for (i = ary.length - 1; i > -1; i -= 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    function getOwn(obj, prop) {\n        return hasProp(obj, prop) && obj[prop];\n    }\n\n    /**\n     * Cycles over properties in an object and calls a function for each\n     * property value. If the function returns a truthy value, then the\n     * iteration is stopped.\n     */\n    function eachProp(obj, func) {\n        var prop;\n        for (prop in obj) {\n            if (hasProp(obj, prop)) {\n                if (func(obj[prop], prop)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Simple function to mix in properties from source into target,\n     * but only if target does not already have a property of the same name.\n     */\n    function mixin(target, source, force, deepStringMixin) {\n        if (source) {\n            eachProp(source, function (value, prop) {\n                if (force || !hasProp(target, prop)) {\n                    if (deepStringMixin && typeof value === 'object' && value &&\n                        !isArray(value) && !isFunction(value) &&\n                        !(value instanceof RegExp)) {\n\n                        if (!target[prop]) {\n                            target[prop] = {};\n                        }\n                        mixin(target[prop], value, force, deepStringMixin);\n                    } else {\n                        target[prop] = value;\n                    }\n                }\n            });\n        }\n        return target;\n    }\n\n    //Similar to Function.prototype.bind, but the 'this' object is specified\n    //first, since it is easier to read/figure out what 'this' will be.\n    function bind(obj, fn) {\n        return function () {\n            return fn.apply(obj, arguments);\n        };\n    }\n\n    function scripts() {\n        return document.getElementsByTagName('script');\n    }\n\n    function defaultOnError(err) {\n        throw err;\n    }\n\n    //Allow getting a global that is expressed in\n    //dot notation, like 'a.b.c'.\n    function getGlobal(value) {\n        if (!value) {\n            return value;\n        }\n        var g = global;\n        each(value.split('.'), function (part) {\n            g = g[part];\n        });\n        return g;\n    }\n\n    /**\n     * Constructs an error with a pointer to an URL with more information.\n     * @param {String} id the error ID that maps to an ID on a web page.\n     * @param {String} message human readable error.\n     * @param {Error} [err] the original error, if there is one.\n     *\n     * @returns {Error}\n     */\n    function makeError(id, msg, err, requireModules) {\n        var e = new Error(msg + '\\nhttp://requirejs.org/docs/errors.html#' + id);\n        e.requireType = id;\n        e.requireModules = requireModules;\n        if (err) {\n            e.originalError = err;\n        }\n        return e;\n    }\n\n    if (typeof define !== 'undefined') {\n        //If a define is already in play via another AMD loader,\n        //do not overwrite.\n        return;\n    }\n\n    if (typeof requirejs !== 'undefined') {\n        if (isFunction(requirejs)) {\n            //Do not overwrite an existing requirejs instance.\n            return;\n        }\n        cfg = requirejs;\n        requirejs = undefined;\n    }\n\n    //Allow for a require config object\n    if (typeof require !== 'undefined' && !isFunction(require)) {\n        //assume it is a config object.\n        cfg = require;\n        require = undefined;\n    }\n\n    function newContext(contextName) {\n        var inCheckLoaded, Module, context, handlers,\n            checkLoadedTimeoutId,\n            config = {\n                //Defaults. Do not set a default for map\n                //config to speed up normalize(), which\n                //will run faster if there is no default.\n                waitSeconds: 7,\n                baseUrl: './',\n                paths: {},\n                bundles: {},\n                pkgs: {},\n                shim: {},\n                config: {}\n            },\n            registry = {},\n            //registry of just enabled modules, to speed\n            //cycle breaking code when lots of modules\n            //are registered, but not activated.\n            enabledRegistry = {},\n            undefEvents = {},\n            defQueue = [],\n            defined = {},\n            urlFetched = {},\n            bundlesMap = {},\n            requireCounter = 1,\n            unnormalizedCounter = 1;\n\n        /**\n         * Trims the . and .. from an array of path segments.\n         * It will keep a leading path segment if a .. will become\n         * the first path segment, to help with module name lookups,\n         * which act like paths, but can be remapped. But the end result,\n         * all paths that use this function should look normalized.\n         * NOTE: this method MODIFIES the input array.\n         * @param {Array} ary the array of path segments.\n         */\n        function trimDots(ary) {\n            var i, part;\n            for (i = 0; i < ary.length; i++) {\n                part = ary[i];\n                if (part === '.') {\n                    ary.splice(i, 1);\n                    i -= 1;\n                } else if (part === '..') {\n                    // If at the start, or previous value is still ..,\n                    // keep them so that when converted to a path it may\n                    // still work when converted to a path, even though\n                    // as an ID it is less than ideal. In larger point\n                    // releases, may be better to just kick out an error.\n                    if (i === 0 || (i === 1 && ary[2] === '..') || ary[i - 1] === '..') {\n                        continue;\n                    } else if (i > 0) {\n                        ary.splice(i - 1, 2);\n                        i -= 2;\n                    }\n                }\n            }\n        }\n\n        /**\n         * Given a relative module name, like ./something, normalize it to\n         * a real name that can be mapped to a path.\n         * @param {String} name the relative name\n         * @param {String} baseName a real name that the name arg is relative\n         * to.\n         * @param {Boolean} applyMap apply the map config to the value. Should\n         * only be done if this normalization is for a dependency ID.\n         * @returns {String} normalized name\n         */\n        function normalize(name, baseName, applyMap) {\n            var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex,\n                foundMap, foundI, foundStarMap, starI, normalizedBaseParts,\n                baseParts = (baseName && baseName.split('/')),\n                map = config.map,\n                starMap = map && map['*'];\n\n            //Adjust any relative paths.\n            if (name) {\n                name = name.split('/');\n                lastIndex = name.length - 1;\n\n                // If wanting node ID compatibility, strip .js from end\n                // of IDs. Have to do this here, and not in nameToUrl\n                // because node allows either .js or non .js to map\n                // to same file.\n                if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n                    name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n                }\n\n                // Starts with a '.' so need the baseName\n                if (name[0].charAt(0) === '.' && baseParts) {\n                    //Convert baseName to array, and lop off the last part,\n                    //so that . matches that 'directory' and not name of the baseName's\n                    //module. For instance, baseName of 'one/two/three', maps to\n                    //'one/two/three.js', but we want the directory, 'one/two' for\n                    //this normalization.\n                    normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                    name = normalizedBaseParts.concat(name);\n                }\n\n                trimDots(name);\n                name = name.join('/');\n            }\n\n            //Apply map config if available.\n            if (applyMap && map && (baseParts || starMap)) {\n                nameParts = name.split('/');\n\n                outerLoop: for (i = nameParts.length; i > 0; i -= 1) {\n                    nameSegment = nameParts.slice(0, i).join('/');\n\n                    if (baseParts) {\n                        //Find the longest baseName segment match in the config.\n                        //So, do joins on the biggest to smallest lengths of baseParts.\n                        for (j = baseParts.length; j > 0; j -= 1) {\n                            mapValue = getOwn(map, baseParts.slice(0, j).join('/'));\n\n                            //baseName segment has config, find if it has one for\n                            //this name.\n                            if (mapValue) {\n                                mapValue = getOwn(mapValue, nameSegment);\n                                if (mapValue) {\n                                    //Match, update name to the new value.\n                                    foundMap = mapValue;\n                                    foundI = i;\n                                    break outerLoop;\n                                }\n                            }\n                        }\n                    }\n\n                    //Check for a star map match, but just hold on to it,\n                    //if there is a shorter segment match later in a matching\n                    //config, then favor over this star map.\n                    if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {\n                        foundStarMap = getOwn(starMap, nameSegment);\n                        starI = i;\n                    }\n                }\n\n                if (!foundMap && foundStarMap) {\n                    foundMap = foundStarMap;\n                    foundI = starI;\n                }\n\n                if (foundMap) {\n                    nameParts.splice(0, foundI, foundMap);\n                    name = nameParts.join('/');\n                }\n            }\n\n            // If the name points to a package's name, use\n            // the package main instead.\n            pkgMain = getOwn(config.pkgs, name);\n\n            return pkgMain ? pkgMain : name;\n        }\n\n        function removeScript(name) {\n            if (isBrowser) {\n                each(scripts(), function (scriptNode) {\n                    if (scriptNode.getAttribute('data-requiremodule') === name &&\n                            scriptNode.getAttribute('data-requirecontext') === context.contextName) {\n                        scriptNode.parentNode.removeChild(scriptNode);\n                        return true;\n                    }\n                });\n            }\n        }\n\n        function hasPathFallback(id) {\n            var pathConfig = getOwn(config.paths, id);\n            if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {\n                //Pop off the first array value, since it failed, and\n                //retry\n                pathConfig.shift();\n                context.require.undef(id);\n\n                //Custom require that does not do map translation, since\n                //ID is \"absolute\", already mapped/resolved.\n                context.makeRequire(null, {\n                    skipMap: true\n                })([id]);\n\n                return true;\n            }\n        }\n\n        //Turns a plugin!resource to [plugin, resource]\n        //with the plugin being undefined if the name\n        //did not have a plugin prefix.\n        function splitPrefix(name) {\n            var prefix,\n                index = name ? name.indexOf('!') : -1;\n            if (index > -1) {\n                prefix = name.substring(0, index);\n                name = name.substring(index + 1, name.length);\n            }\n            return [prefix, name];\n        }\n\n        /**\n         * Creates a module mapping that includes plugin prefix, module\n         * name, and path. If parentModuleMap is provided it will\n         * also normalize the name via require.normalize()\n         *\n         * @param {String} name the module name\n         * @param {String} [parentModuleMap] parent module map\n         * for the module name, used to resolve relative names.\n         * @param {Boolean} isNormalized: is the ID already normalized.\n         * This is true if this call is done for a define() module ID.\n         * @param {Boolean} applyMap: apply the map config to the ID.\n         * Should only be true if this map is for a dependency.\n         *\n         * @returns {Object}\n         */\n        function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {\n            var url, pluginModule, suffix, nameParts,\n                prefix = null,\n                parentName = parentModuleMap ? parentModuleMap.name : null,\n                originalName = name,\n                isDefine = true,\n                normalizedName = '';\n\n            //If no name, then it means it is a require call, generate an\n            //internal name.\n            if (!name) {\n                isDefine = false;\n                name = '_@r' + (requireCounter += 1);\n            }\n\n            nameParts = splitPrefix(name);\n            prefix = nameParts[0];\n            name = nameParts[1];\n\n            if (prefix) {\n                prefix = normalize(prefix, parentName, applyMap);\n                pluginModule = getOwn(defined, prefix);\n            }\n\n            //Account for relative paths if there is a base name.\n            if (name) {\n                if (prefix) {\n                    if (pluginModule && pluginModule.normalize) {\n                        //Plugin is loaded, use its normalize method.\n                        normalizedName = pluginModule.normalize(name, function (name) {\n                            return normalize(name, parentName, applyMap);\n                        });\n                    } else {\n                        // If nested plugin references, then do not try to\n                        // normalize, as it will not normalize correctly. This\n                        // places a restriction on resourceIds, and the longer\n                        // term solution is not to normalize until plugins are\n                        // loaded and all normalizations to allow for async\n                        // loading of a loader plugin. But for now, fixes the\n                        // common uses. Details in #1131\n                        normalizedName = name.indexOf('!') === -1 ?\n                                         normalize(name, parentName, applyMap) :\n                                         name;\n                    }\n                } else {\n                    //A regular module.\n                    normalizedName = normalize(name, parentName, applyMap);\n\n                    //Normalized name may be a plugin ID due to map config\n                    //application in normalize. The map config values must\n                    //already be normalized, so do not need to redo that part.\n                    nameParts = splitPrefix(normalizedName);\n                    prefix = nameParts[0];\n                    normalizedName = nameParts[1];\n                    isNormalized = true;\n\n                    url = context.nameToUrl(normalizedName);\n                }\n            }\n\n            //If the id is a plugin id that cannot be determined if it needs\n            //normalization, stamp it with a unique ID so two matching relative\n            //ids that may conflict can be separate.\n            suffix = prefix && !pluginModule && !isNormalized ?\n                     '_unnormalized' + (unnormalizedCounter += 1) :\n                     '';\n\n            return {\n                prefix: prefix,\n                name: normalizedName,\n                parentMap: parentModuleMap,\n                unnormalized: !!suffix,\n                url: url,\n                originalName: originalName,\n                isDefine: isDefine,\n                id: (prefix ?\n                        prefix + '!' + normalizedName :\n                        normalizedName) + suffix\n            };\n        }\n\n        function getModule(depMap) {\n            var id = depMap.id,\n                mod = getOwn(registry, id);\n\n            if (!mod) {\n                mod = registry[id] = new context.Module(depMap);\n            }\n\n            return mod;\n        }\n\n        function on(depMap, name, fn) {\n            var id = depMap.id,\n                mod = getOwn(registry, id);\n\n            if (hasProp(defined, id) &&\n                    (!mod || mod.defineEmitComplete)) {\n                if (name === 'defined') {\n                    fn(defined[id]);\n                }\n            } else {\n                mod = getModule(depMap);\n                if (mod.error && name === 'error') {\n                    fn(mod.error);\n                } else {\n                    mod.on(name, fn);\n                }\n            }\n        }\n\n        function onError(err, errback) {\n            var ids = err.requireModules,\n                notified = false;\n\n            if (errback) {\n                errback(err);\n            } else {\n                each(ids, function (id) {\n                    var mod = getOwn(registry, id);\n                    if (mod) {\n                        //Set error on module, so it skips timeout checks.\n                        mod.error = err;\n                        if (mod.events.error) {\n                            notified = true;\n                            mod.emit('error', err);\n                        }\n                    }\n                });\n\n                if (!notified) {\n                    req.onError(err);\n                }\n            }\n        }\n\n        /**\n         * Internal method to transfer globalQueue items to this context's\n         * defQueue.\n         */\n        function takeGlobalQueue() {\n            //Push all the globalDefQueue items into the context's defQueue\n            if (globalDefQueue.length) {\n                each(globalDefQueue, function(queueItem) {\n                    var id = queueItem[0];\n                    if (typeof id === 'string') {\n                        context.defQueueMap[id] = true;\n                    }\n                    defQueue.push(queueItem);\n                });\n                globalDefQueue = [];\n            }\n        }\n\n        handlers = {\n            'require': function (mod) {\n                if (mod.require) {\n                    return mod.require;\n                } else {\n                    return (mod.require = context.makeRequire(mod.map));\n                }\n            },\n            'exports': function (mod) {\n                mod.usingExports = true;\n                if (mod.map.isDefine) {\n                    if (mod.exports) {\n                        return (defined[mod.map.id] = mod.exports);\n                    } else {\n                        return (mod.exports = defined[mod.map.id] = {});\n                    }\n                }\n            },\n            'module': function (mod) {\n                if (mod.module) {\n                    return mod.module;\n                } else {\n                    return (mod.module = {\n                        id: mod.map.id,\n                        uri: mod.map.url,\n                        config: function () {\n                            return getOwn(config.config, mod.map.id) || {};\n                        },\n                        exports: mod.exports || (mod.exports = {})\n                    });\n                }\n            }\n        };\n\n        function cleanRegistry(id) {\n            //Clean up machinery used for waiting modules.\n            delete registry[id];\n            delete enabledRegistry[id];\n        }\n\n        function breakCycle(mod, traced, processed) {\n            var id = mod.map.id;\n\n            if (mod.error) {\n                mod.emit('error', mod.error);\n            } else {\n                traced[id] = true;\n                each(mod.depMaps, function (depMap, i) {\n                    var depId = depMap.id,\n                        dep = getOwn(registry, depId);\n\n                    //Only force things that have not completed\n                    //being defined, so still in the registry,\n                    //and only if it has not been matched up\n                    //in the module already.\n                    if (dep && !mod.depMatched[i] && !processed[depId]) {\n                        if (getOwn(traced, depId)) {\n                            mod.defineDep(i, defined[depId]);\n                            mod.check(); //pass false?\n                        } else {\n                            breakCycle(dep, traced, processed);\n                        }\n                    }\n                });\n                processed[id] = true;\n            }\n        }\n\n        function checkLoaded() {\n            var err, usingPathFallback,\n                waitInterval = config.waitSeconds * 1000,\n                //It is possible to disable the wait interval by using waitSeconds of 0.\n                expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),\n                noLoads = [],\n                reqCalls = [],\n                stillLoading = false,\n                needCycleCheck = true;\n\n            //Do not bother if this call was a result of a cycle break.\n            if (inCheckLoaded) {\n                return;\n            }\n\n            inCheckLoaded = true;\n\n            //Figure out the state of all the modules.\n            eachProp(enabledRegistry, function (mod) {\n                var map = mod.map,\n                    modId = map.id;\n\n                //Skip things that are not enabled or in error state.\n                if (!mod.enabled) {\n                    return;\n                }\n\n                if (!map.isDefine) {\n                    reqCalls.push(mod);\n                }\n\n                if (!mod.error) {\n                    //If the module should be executed, and it has not\n                    //been inited and time is up, remember it.\n                    if (!mod.inited && expired) {\n                        if (hasPathFallback(modId)) {\n                            usingPathFallback = true;\n                            stillLoading = true;\n                        } else {\n                            noLoads.push(modId);\n                            removeScript(modId);\n                        }\n                    } else if (!mod.inited && mod.fetched && map.isDefine) {\n                        stillLoading = true;\n                        if (!map.prefix) {\n                            //No reason to keep looking for unfinished\n                            //loading. If the only stillLoading is a\n                            //plugin resource though, keep going,\n                            //because it may be that a plugin resource\n                            //is waiting on a non-plugin cycle.\n                            return (needCycleCheck = false);\n                        }\n                    }\n                }\n            });\n\n            if (expired && noLoads.length) {\n                //If wait time expired, throw error of unloaded modules.\n                err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);\n                err.contextName = context.contextName;\n                return onError(err);\n            }\n\n            //Not expired, check for a cycle.\n            if (needCycleCheck) {\n                each(reqCalls, function (mod) {\n                    breakCycle(mod, {}, {});\n                });\n            }\n\n            //If still waiting on loads, and the waiting load is something\n            //other than a plugin resource, or there are still outstanding\n            //scripts, then just try back later.\n            if ((!expired || usingPathFallback) && stillLoading) {\n                //Something is still waiting to load. Wait for it, but only\n                //if a timeout is not already in effect.\n                if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {\n                    checkLoadedTimeoutId = setTimeout(function () {\n                        checkLoadedTimeoutId = 0;\n                        checkLoaded();\n                    }, 50);\n                }\n            }\n\n            inCheckLoaded = false;\n        }\n\n        Module = function (map) {\n            this.events = getOwn(undefEvents, map.id) || {};\n            this.map = map;\n            this.shim = getOwn(config.shim, map.id);\n            this.depExports = [];\n            this.depMaps = [];\n            this.depMatched = [];\n            this.pluginMaps = {};\n            this.depCount = 0;\n\n            /* this.exports this.factory\n               this.depMaps = [],\n               this.enabled, this.fetched\n            */\n        };\n\n        Module.prototype = {\n            init: function (depMaps, factory, errback, options) {\n                options = options || {};\n\n                //Do not do more inits if already done. Can happen if there\n                //are multiple define calls for the same module. That is not\n                //a normal, common case, but it is also not unexpected.\n                if (this.inited) {\n                    return;\n                }\n\n                this.factory = factory;\n\n                if (errback) {\n                    //Register for errors on this module.\n                    this.on('error', errback);\n                } else if (this.events.error) {\n                    //If no errback already, but there are error listeners\n                    //on this module, set up an errback to pass to the deps.\n                    errback = bind(this, function (err) {\n                        this.emit('error', err);\n                    });\n                }\n\n                //Do a copy of the dependency array, so that\n                //source inputs are not modified. For example\n                //\"shim\" deps are passed in here directly, and\n                //doing a direct modification of the depMaps array\n                //would affect that config.\n                this.depMaps = depMaps && depMaps.slice(0);\n\n                this.errback = errback;\n\n                //Indicate this module has be initialized\n                this.inited = true;\n\n                this.ignore = options.ignore;\n\n                //Could have option to init this module in enabled mode,\n                //or could have been previously marked as enabled. However,\n                //the dependencies are not known until init is called. So\n                //if enabled previously, now trigger dependencies as enabled.\n                if (options.enabled || this.enabled) {\n                    //Enable this module and dependencies.\n                    //Will call this.check()\n                    this.enable();\n                } else {\n                    this.check();\n                }\n            },\n\n            defineDep: function (i, depExports) {\n                //Because of cycles, defined callback for a given\n                //export can be called more than once.\n                if (!this.depMatched[i]) {\n                    this.depMatched[i] = true;\n                    this.depCount -= 1;\n                    this.depExports[i] = depExports;\n                }\n            },\n\n            fetch: function () {\n                if (this.fetched) {\n                    return;\n                }\n                this.fetched = true;\n\n                context.startTime = (new Date()).getTime();\n\n                var map = this.map;\n\n                //If the manager is for a plugin managed resource,\n                //ask the plugin to load it now.\n                if (this.shim) {\n                    context.makeRequire(this.map, {\n                        enableBuildCallback: true\n                    })(this.shim.deps || [], bind(this, function () {\n                        return map.prefix ? this.callPlugin() : this.load();\n                    }));\n                } else {\n                    //Regular dependency.\n                    return map.prefix ? this.callPlugin() : this.load();\n                }\n            },\n\n            load: function () {\n                var url = this.map.url;\n\n                //Regular dependency.\n                if (!urlFetched[url]) {\n                    urlFetched[url] = true;\n                    context.load(this.map.id, url);\n                }\n            },\n\n            /**\n             * Checks if the module is ready to define itself, and if so,\n             * define it.\n             */\n            check: function () {\n                if (!this.enabled || this.enabling) {\n                    return;\n                }\n\n                var err, cjsModule,\n                    id = this.map.id,\n                    depExports = this.depExports,\n                    exports = this.exports,\n                    factory = this.factory;\n\n                if (!this.inited) {\n                    // Only fetch if not already in the defQueue.\n                    if (!hasProp(context.defQueueMap, id)) {\n                        this.fetch();\n                    }\n                } else if (this.error) {\n                    this.emit('error', this.error);\n                } else if (!this.defining) {\n                    //The factory could trigger another require call\n                    //that would result in checking this module to\n                    //define itself again. If already in the process\n                    //of doing that, skip this work.\n                    this.defining = true;\n\n                    if (this.depCount < 1 && !this.defined) {\n                        if (isFunction(factory)) {\n                            //If there is an error listener, favor passing\n                            //to that instead of throwing an error. However,\n                            //only do it for define()'d  modules. require\n                            //errbacks should not be called for failures in\n                            //their callbacks (#699). However if a global\n                            //onError is set, use that.\n                            if ((this.events.error && this.map.isDefine) ||\n                                req.onError !== defaultOnError) {\n                                try {\n                                    exports = context.execCb(id, factory, depExports, exports);\n                                } catch (e) {\n                                    err = e;\n                                }\n                            } else {\n                                exports = context.execCb(id, factory, depExports, exports);\n                            }\n\n                            // Favor return value over exports. If node/cjs in play,\n                            // then will not have a return value anyway. Favor\n                            // module.exports assignment over exports object.\n                            if (this.map.isDefine && exports === undefined) {\n                                cjsModule = this.module;\n                                if (cjsModule) {\n                                    exports = cjsModule.exports;\n                                } else if (this.usingExports) {\n                                    //exports already set the defined value.\n                                    exports = this.exports;\n                                }\n                            }\n\n                            if (err) {\n                                err.requireMap = this.map;\n                                err.requireModules = this.map.isDefine ? [this.map.id] : null;\n                                err.requireType = this.map.isDefine ? 'define' : 'require';\n                                return onError((this.error = err));\n                            }\n\n                        } else {\n                            //Just a literal value\n                            exports = factory;\n                        }\n\n                        this.exports = exports;\n\n                        if (this.map.isDefine && !this.ignore) {\n                            defined[id] = exports;\n\n                            if (req.onResourceLoad) {\n                                var resLoadMaps = [];\n                                each(this.depMaps, function (depMap) {\n                                    resLoadMaps.push(depMap.normalizedMap || depMap);\n                                });\n                                req.onResourceLoad(context, this.map, resLoadMaps);\n                            }\n                        }\n\n                        //Clean up\n                        cleanRegistry(id);\n\n                        this.defined = true;\n                    }\n\n                    //Finished the define stage. Allow calling check again\n                    //to allow define notifications below in the case of a\n                    //cycle.\n                    this.defining = false;\n\n                    if (this.defined && !this.defineEmitted) {\n                        this.defineEmitted = true;\n                        this.emit('defined', this.exports);\n                        this.defineEmitComplete = true;\n                    }\n\n                }\n            },\n\n            callPlugin: function () {\n                var map = this.map,\n                    id = map.id,\n                    //Map already normalized the prefix.\n                    pluginMap = makeModuleMap(map.prefix);\n\n                //Mark this as a dependency for this plugin, so it\n                //can be traced for cycles.\n                this.depMaps.push(pluginMap);\n\n                on(pluginMap, 'defined', bind(this, function (plugin) {\n                    var load, normalizedMap, normalizedMod,\n                        bundleId = getOwn(bundlesMap, this.map.id),\n                        name = this.map.name,\n                        parentName = this.map.parentMap ? this.map.parentMap.name : null,\n                        localRequire = context.makeRequire(map.parentMap, {\n                            enableBuildCallback: true\n                        });\n\n                    //If current map is not normalized, wait for that\n                    //normalized name to load instead of continuing.\n                    if (this.map.unnormalized) {\n                        //Normalize the ID if the plugin allows it.\n                        if (plugin.normalize) {\n                            name = plugin.normalize(name, function (name) {\n                                return normalize(name, parentName, true);\n                            }) || '';\n                        }\n\n                        //prefix and name should already be normalized, no need\n                        //for applying map config again either.\n                        normalizedMap = makeModuleMap(map.prefix + '!' + name,\n                                                      this.map.parentMap);\n                        on(normalizedMap,\n                            'defined', bind(this, function (value) {\n                                this.map.normalizedMap = normalizedMap;\n                                this.init([], function () { return value; }, null, {\n                                    enabled: true,\n                                    ignore: true\n                                });\n                            }));\n\n                        normalizedMod = getOwn(registry, normalizedMap.id);\n                        if (normalizedMod) {\n                            //Mark this as a dependency for this plugin, so it\n                            //can be traced for cycles.\n                            this.depMaps.push(normalizedMap);\n\n                            if (this.events.error) {\n                                normalizedMod.on('error', bind(this, function (err) {\n                                    this.emit('error', err);\n                                }));\n                            }\n                            normalizedMod.enable();\n                        }\n\n                        return;\n                    }\n\n                    //If a paths config, then just load that file instead to\n                    //resolve the plugin, as it is built into that paths layer.\n                    if (bundleId) {\n                        this.map.url = context.nameToUrl(bundleId);\n                        this.load();\n                        return;\n                    }\n\n                    load = bind(this, function (value) {\n                        this.init([], function () { return value; }, null, {\n                            enabled: true\n                        });\n                    });\n\n                    load.error = bind(this, function (err) {\n                        this.inited = true;\n                        this.error = err;\n                        err.requireModules = [id];\n\n                        //Remove temp unnormalized modules for this module,\n                        //since they will never be resolved otherwise now.\n                        eachProp(registry, function (mod) {\n                            if (mod.map.id.indexOf(id + '_unnormalized') === 0) {\n                                cleanRegistry(mod.map.id);\n                            }\n                        });\n\n                        onError(err);\n                    });\n\n                    //Allow plugins to load other code without having to know the\n                    //context or how to 'complete' the load.\n                    load.fromText = bind(this, function (text, textAlt) {\n                        /*jslint evil: true */\n                        var moduleName = map.name,\n                            moduleMap = makeModuleMap(moduleName),\n                            hasInteractive = useInteractive;\n\n                        //As of 2.1.0, support just passing the text, to reinforce\n                        //fromText only being called once per resource. Still\n                        //support old style of passing moduleName but discard\n                        //that moduleName in favor of the internal ref.\n                        if (textAlt) {\n                            text = textAlt;\n                        }\n\n                        //Turn off interactive script matching for IE for any define\n                        //calls in the text, then turn it back on at the end.\n                        if (hasInteractive) {\n                            useInteractive = false;\n                        }\n\n                        //Prime the system by creating a module instance for\n                        //it.\n                        getModule(moduleMap);\n\n                        //Transfer any config to this other module.\n                        if (hasProp(config.config, id)) {\n                            config.config[moduleName] = config.config[id];\n                        }\n\n                        try {\n                            req.exec(text);\n                        } catch (e) {\n                            return onError(makeError('fromtexteval',\n                                             'fromText eval for ' + id +\n                                            ' failed: ' + e,\n                                             e,\n                                             [id]));\n                        }\n\n                        if (hasInteractive) {\n                            useInteractive = true;\n                        }\n\n                        //Mark this as a dependency for the plugin\n                        //resource\n                        this.depMaps.push(moduleMap);\n\n                        //Support anonymous modules.\n                        context.completeLoad(moduleName);\n\n                        //Bind the value of that module to the value for this\n                        //resource ID.\n                        localRequire([moduleName], load);\n                    });\n\n                    //Use parentName here since the plugin's name is not reliable,\n                    //could be some weird string with no path that actually wants to\n                    //reference the parentName's path.\n                    plugin.load(map.name, localRequire, load, config);\n                }));\n\n                context.enable(pluginMap, this);\n                this.pluginMaps[pluginMap.id] = pluginMap;\n            },\n\n            enable: function () {\n                enabledRegistry[this.map.id] = this;\n                this.enabled = true;\n\n                //Set flag mentioning that the module is enabling,\n                //so that immediate calls to the defined callbacks\n                //for dependencies do not trigger inadvertent load\n                //with the depCount still being zero.\n                this.enabling = true;\n\n                //Enable each dependency\n                each(this.depMaps, bind(this, function (depMap, i) {\n                    var id, mod, handler;\n\n                    if (typeof depMap === 'string') {\n                        //Dependency needs to be converted to a depMap\n                        //and wired up to this module.\n                        depMap = makeModuleMap(depMap,\n                                               (this.map.isDefine ? this.map : this.map.parentMap),\n                                               false,\n                                               !this.skipMap);\n                        this.depMaps[i] = depMap;\n\n                        handler = getOwn(handlers, depMap.id);\n\n                        if (handler) {\n                            this.depExports[i] = handler(this);\n                            return;\n                        }\n\n                        this.depCount += 1;\n\n                        on(depMap, 'defined', bind(this, function (depExports) {\n                            if (this.undefed) {\n                                return;\n                            }\n                            this.defineDep(i, depExports);\n                            this.check();\n                        }));\n\n                        if (this.errback) {\n                            on(depMap, 'error', bind(this, this.errback));\n                        } else if (this.events.error) {\n                            // No direct errback on this module, but something\n                            // else is listening for errors, so be sure to\n                            // propagate the error correctly.\n                            on(depMap, 'error', bind(this, function(err) {\n                                this.emit('error', err);\n                            }));\n                        }\n                    }\n\n                    id = depMap.id;\n                    mod = registry[id];\n\n                    //Skip special modules like 'require', 'exports', 'module'\n                    //Also, don't call enable if it is already enabled,\n                    //important in circular dependency cases.\n                    if (!hasProp(handlers, id) && mod && !mod.enabled) {\n                        context.enable(depMap, this);\n                    }\n                }));\n\n                //Enable each plugin that is used in\n                //a dependency\n                eachProp(this.pluginMaps, bind(this, function (pluginMap) {\n                    var mod = getOwn(registry, pluginMap.id);\n                    if (mod && !mod.enabled) {\n                        context.enable(pluginMap, this);\n                    }\n                }));\n\n                this.enabling = false;\n\n                this.check();\n            },\n\n            on: function (name, cb) {\n                var cbs = this.events[name];\n                if (!cbs) {\n                    cbs = this.events[name] = [];\n                }\n                cbs.push(cb);\n            },\n\n            emit: function (name, evt) {\n                each(this.events[name], function (cb) {\n                    cb(evt);\n                });\n                if (name === 'error') {\n                    //Now that the error handler was triggered, remove\n                    //the listeners, since this broken Module instance\n                    //can stay around for a while in the registry.\n                    delete this.events[name];\n                }\n            }\n        };\n\n        function callGetModule(args) {\n            //Skip modules already defined.\n            if (!hasProp(defined, args[0])) {\n                getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);\n            }\n        }\n\n        function removeListener(node, func, name, ieName) {\n            //Favor detachEvent because of IE9\n            //issue, see attachEvent/addEventListener comment elsewhere\n            //in this file.\n            if (node.detachEvent && !isOpera) {\n                //Probably IE. If not it will throw an error, which will be\n                //useful to know.\n                if (ieName) {\n                    node.detachEvent(ieName, func);\n                }\n            } else {\n                node.removeEventListener(name, func, false);\n            }\n        }\n\n        /**\n         * Given an event from a script node, get the requirejs info from it,\n         * and then removes the event listeners on the node.\n         * @param {Event} evt\n         * @returns {Object}\n         */\n        function getScriptData(evt) {\n            //Using currentTarget instead of target for Firefox 2.0's sake. Not\n            //all old browsers will be supported, but this one was easy enough\n            //to support and still makes sense.\n            var node = evt.currentTarget || evt.srcElement;\n\n            //Remove the listeners once here.\n            removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');\n            removeListener(node, context.onScriptError, 'error');\n\n            return {\n                node: node,\n                id: node && node.getAttribute('data-requiremodule')\n            };\n        }\n\n        function intakeDefines() {\n            var args;\n\n            //Any defined modules in the global queue, intake them now.\n            takeGlobalQueue();\n\n            //Make sure any remaining defQueue items get properly processed.\n            while (defQueue.length) {\n                args = defQueue.shift();\n                if (args[0] === null) {\n                    return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' +\n                        args[args.length - 1]));\n                } else {\n                    //args are id, deps, factory. Should be normalized by the\n                    //define() function.\n                    callGetModule(args);\n                }\n            }\n            context.defQueueMap = {};\n        }\n\n        context = {\n            config: config,\n            contextName: contextName,\n            registry: registry,\n            defined: defined,\n            urlFetched: urlFetched,\n            defQueue: defQueue,\n            defQueueMap: {},\n            Module: Module,\n            makeModuleMap: makeModuleMap,\n            nextTick: req.nextTick,\n            onError: onError,\n\n            /**\n             * Set a configuration for the context.\n             * @param {Object} cfg config object to integrate.\n             */\n            configure: function (cfg) {\n                //Make sure the baseUrl ends in a slash.\n                if (cfg.baseUrl) {\n                    if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {\n                        cfg.baseUrl += '/';\n                    }\n                }\n\n                // Convert old style urlArgs string to a function.\n                if (typeof cfg.urlArgs === 'string') {\n                    var urlArgs = cfg.urlArgs;\n                    cfg.urlArgs = function(id, url) {\n                        return (url.indexOf('?') === -1 ? '?' : '&') + urlArgs;\n                    };\n                }\n\n                //Save off the paths since they require special processing,\n                //they are additive.\n                var shim = config.shim,\n                    objs = {\n                        paths: true,\n                        bundles: true,\n                        config: true,\n                        map: true\n                    };\n\n                eachProp(cfg, function (value, prop) {\n                    if (objs[prop]) {\n                        if (!config[prop]) {\n                            config[prop] = {};\n                        }\n                        mixin(config[prop], value, true, true);\n                    } else {\n                        config[prop] = value;\n                    }\n                });\n\n                //Reverse map the bundles\n                if (cfg.bundles) {\n                    eachProp(cfg.bundles, function (value, prop) {\n                        each(value, function (v) {\n                            if (v !== prop) {\n                                bundlesMap[v] = prop;\n                            }\n                        });\n                    });\n                }\n\n                //Merge shim\n                if (cfg.shim) {\n                    eachProp(cfg.shim, function (value, id) {\n                        //Normalize the structure\n                        if (isArray(value)) {\n                            value = {\n                                deps: value\n                            };\n                        }\n                        if ((value.exports || value.init) && !value.exportsFn) {\n                            value.exportsFn = context.makeShimExports(value);\n                        }\n                        shim[id] = value;\n                    });\n                    config.shim = shim;\n                }\n\n                //Adjust packages if necessary.\n                if (cfg.packages) {\n                    each(cfg.packages, function (pkgObj) {\n                        var location, name;\n\n                        pkgObj = typeof pkgObj === 'string' ? {name: pkgObj} : pkgObj;\n\n                        name = pkgObj.name;\n                        location = pkgObj.location;\n                        if (location) {\n                            config.paths[name] = pkgObj.location;\n                        }\n\n                        //Save pointer to main module ID for pkg name.\n                        //Remove leading dot in main, so main paths are normalized,\n                        //and remove any trailing .js, since different package\n                        //envs have different conventions: some use a module name,\n                        //some use a file name.\n                        config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main')\n                                     .replace(currDirRegExp, '')\n                                     .replace(jsSuffixRegExp, '');\n                    });\n                }\n\n                //If there are any \"waiting to execute\" modules in the registry,\n                //update the maps for them, since their info, like URLs to load,\n                //may have changed.\n                eachProp(registry, function (mod, id) {\n                    //If module already has init called, since it is too\n                    //late to modify them, and ignore unnormalized ones\n                    //since they are transient.\n                    if (!mod.inited && !mod.map.unnormalized) {\n                        mod.map = makeModuleMap(id, null, true);\n                    }\n                });\n\n                //If a deps array or a config callback is specified, then call\n                //require with those args. This is useful when require is defined as a\n                //config object before require.js is loaded.\n                if (cfg.deps || cfg.callback) {\n                    context.require(cfg.deps || [], cfg.callback);\n                }\n            },\n\n            makeShimExports: function (value) {\n                function fn() {\n                    var ret;\n                    if (value.init) {\n                        ret = value.init.apply(global, arguments);\n                    }\n                    return ret || (value.exports && getGlobal(value.exports));\n                }\n                return fn;\n            },\n\n            makeRequire: function (relMap, options) {\n                options = options || {};\n\n                function localRequire(deps, callback, errback) {\n                    var id, map, requireMod;\n\n                    if (options.enableBuildCallback && callback && isFunction(callback)) {\n                        callback.__requireJsBuild = true;\n                    }\n\n                    if (typeof deps === 'string') {\n                        if (isFunction(callback)) {\n                            //Invalid call\n                            return onError(makeError('requireargs', 'Invalid require call'), errback);\n                        }\n\n                        //If require|exports|module are requested, get the\n                        //value for them from the special handlers. Caveat:\n                        //this only works while module is being defined.\n                        if (relMap && hasProp(handlers, deps)) {\n                            return handlers[deps](registry[relMap.id]);\n                        }\n\n                        //Synchronous access to one module. If require.get is\n                        //available (as in the Node adapter), prefer that.\n                        if (req.get) {\n                            return req.get(context, deps, relMap, localRequire);\n                        }\n\n                        //Normalize module name, if it contains . or ..\n                        map = makeModuleMap(deps, relMap, false, true);\n                        id = map.id;\n\n                        if (!hasProp(defined, id)) {\n                            return onError(makeError('notloaded', 'Module name \"' +\n                                        id +\n                                        '\" has not been loaded yet for context: ' +\n                                        contextName +\n                                        (relMap ? '' : '. Use require([])')));\n                        }\n                        return defined[id];\n                    }\n\n                    //Grab defines waiting in the global queue.\n                    intakeDefines();\n\n                    //Mark all the dependencies as needing to be loaded.\n                    context.nextTick(function () {\n                        //Some defines could have been added since the\n                        //require call, collect them.\n                        intakeDefines();\n\n                        requireMod = getModule(makeModuleMap(null, relMap));\n\n                        //Store if map config should be applied to this require\n                        //call for dependencies.\n                        requireMod.skipMap = options.skipMap;\n\n                        requireMod.init(deps, callback, errback, {\n                            enabled: true\n                        });\n\n                        checkLoaded();\n                    });\n\n                    return localRequire;\n                }\n\n                mixin(localRequire, {\n                    isBrowser: isBrowser,\n\n                    /**\n                     * Converts a module name + .extension into an URL path.\n                     * *Requires* the use of a module name. It does not support using\n                     * plain URLs like nameToUrl.\n                     */\n                    toUrl: function (moduleNamePlusExt) {\n                        var ext,\n                            index = moduleNamePlusExt.lastIndexOf('.'),\n                            segment = moduleNamePlusExt.split('/')[0],\n                            isRelative = segment === '.' || segment === '..';\n\n                        //Have a file extension alias, and it is not the\n                        //dots from a relative path.\n                        if (index !== -1 && (!isRelative || index > 1)) {\n                            ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);\n                            moduleNamePlusExt = moduleNamePlusExt.substring(0, index);\n                        }\n\n                        return context.nameToUrl(normalize(moduleNamePlusExt,\n                                                relMap && relMap.id, true), ext,  true);\n                    },\n\n                    defined: function (id) {\n                        return hasProp(defined, makeModuleMap(id, relMap, false, true).id);\n                    },\n\n                    specified: function (id) {\n                        id = makeModuleMap(id, relMap, false, true).id;\n                        return hasProp(defined, id) || hasProp(registry, id);\n                    }\n                });\n\n                //Only allow undef on top level require calls\n                if (!relMap) {\n                    localRequire.undef = function (id) {\n                        //Bind any waiting define() calls to this context,\n                        //fix for #408\n                        takeGlobalQueue();\n\n                        var map = makeModuleMap(id, relMap, true),\n                            mod = getOwn(registry, id);\n\n                        mod.undefed = true;\n                        removeScript(id);\n\n                        delete defined[id];\n                        delete urlFetched[map.url];\n                        delete undefEvents[id];\n\n                        //Clean queued defines too. Go backwards\n                        //in array so that the splices do not\n                        //mess up the iteration.\n                        eachReverse(defQueue, function(args, i) {\n                            if (args[0] === id) {\n                                defQueue.splice(i, 1);\n                            }\n                        });\n                        delete context.defQueueMap[id];\n\n                        if (mod) {\n                            //Hold on to listeners in case the\n                            //module will be attempted to be reloaded\n                            //using a different config.\n                            if (mod.events.defined) {\n                                undefEvents[id] = mod.events;\n                            }\n\n                            cleanRegistry(id);\n                        }\n                    };\n                }\n\n                return localRequire;\n            },\n\n            /**\n             * Called to enable a module if it is still in the registry\n             * awaiting enablement. A second arg, parent, the parent module,\n             * is passed in for context, when this method is overridden by\n             * the optimizer. Not shown here to keep code compact.\n             */\n            enable: function (depMap) {\n                var mod = getOwn(registry, depMap.id);\n                if (mod) {\n                    getModule(depMap).enable();\n                }\n            },\n\n            /**\n             * Internal method used by environment adapters to complete a load event.\n             * A load event could be a script load or just a load pass from a synchronous\n             * load call.\n             * @param {String} moduleName the name of the module to potentially complete.\n             */\n            completeLoad: function (moduleName) {\n                var found, args, mod,\n                    shim = getOwn(config.shim, moduleName) || {},\n                    shExports = shim.exports;\n\n                takeGlobalQueue();\n\n                while (defQueue.length) {\n                    args = defQueue.shift();\n                    if (args[0] === null) {\n                        args[0] = moduleName;\n                        //If already found an anonymous module and bound it\n                        //to this name, then this is some other anon module\n                        //waiting for its completeLoad to fire.\n                        if (found) {\n                            break;\n                        }\n                        found = true;\n                    } else if (args[0] === moduleName) {\n                        //Found matching define call for this script!\n                        found = true;\n                    }\n\n                    callGetModule(args);\n                }\n                context.defQueueMap = {};\n\n                //Do this after the cycle of callGetModule in case the result\n                //of those calls/init calls changes the registry.\n                mod = getOwn(registry, moduleName);\n\n                if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {\n                    if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {\n                        if (hasPathFallback(moduleName)) {\n                            return;\n                        } else {\n                            return onError(makeError('nodefine',\n                                             'No define call for ' + moduleName,\n                                             null,\n                                             [moduleName]));\n                        }\n                    } else {\n                        //A script that does not call define(), so just simulate\n                        //the call for it.\n                        callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);\n                    }\n                }\n\n                checkLoaded();\n            },\n\n            /**\n             * Converts a module name to a file path. Supports cases where\n             * moduleName may actually be just an URL.\n             * Note that it **does not** call normalize on the moduleName,\n             * it is assumed to have already been normalized. This is an\n             * internal API, not a public one. Use toUrl for the public API.\n             */\n            nameToUrl: function (moduleName, ext, skipExt) {\n                var paths, syms, i, parentModule, url,\n                    parentPath, bundleId,\n                    pkgMain = getOwn(config.pkgs, moduleName);\n\n                if (pkgMain) {\n                    moduleName = pkgMain;\n                }\n\n                bundleId = getOwn(bundlesMap, moduleName);\n\n                if (bundleId) {\n                    return context.nameToUrl(bundleId, ext, skipExt);\n                }\n\n                //If a colon is in the URL, it indicates a protocol is used and it is just\n                //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)\n                //or ends with .js, then assume the user meant to use an url and not a module id.\n                //The slash is important for protocol-less URLs as well as full paths.\n                if (req.jsExtRegExp.test(moduleName)) {\n                    //Just a plain path, not module name lookup, so just return it.\n                    //Add extension if it is included. This is a bit wonky, only non-.js things pass\n                    //an extension, this method probably needs to be reworked.\n                    url = moduleName + (ext || '');\n                } else {\n                    //A module that needs to be converted to a path.\n                    paths = config.paths;\n\n                    syms = moduleName.split('/');\n                    //For each module name segment, see if there is a path\n                    //registered for it. Start with most specific name\n                    //and work up from it.\n                    for (i = syms.length; i > 0; i -= 1) {\n                        parentModule = syms.slice(0, i).join('/');\n\n                        parentPath = getOwn(paths, parentModule);\n                        if (parentPath) {\n                            //If an array, it means there are a few choices,\n                            //Choose the one that is desired\n                            if (isArray(parentPath)) {\n                                parentPath = parentPath[0];\n                            }\n                            syms.splice(0, i, parentPath);\n                            break;\n                        }\n                    }\n\n                    //Join the path parts together, then figure out if baseUrl is needed.\n                    url = syms.join('/');\n                    url += (ext || (/^data\\:|^blob\\:|\\?/.test(url) || skipExt ? '' : '.js'));\n                    url = (url.charAt(0) === '/' || url.match(/^[\\w\\+\\.\\-]+:/) ? '' : config.baseUrl) + url;\n                }\n\n                return config.urlArgs && !/^blob\\:/.test(url) ?\n                       url + config.urlArgs(moduleName, url) : url;\n            },\n\n            //Delegates to req.load. Broken out as a separate function to\n            //allow overriding in the optimizer.\n            load: function (id, url) {\n                req.load(context, id, url);\n            },\n\n            /**\n             * Executes a module callback function. Broken out as a separate function\n             * solely to allow the build system to sequence the files in the built\n             * layer in the right sequence.\n             *\n             * @private\n             */\n            execCb: function (name, callback, args, exports) {\n                return callback.apply(exports, args);\n            },\n\n            /**\n             * callback for script loads, used to check status of loading.\n             *\n             * @param {Event} evt the event from the browser for the script\n             * that was loaded.\n             */\n            onScriptLoad: function (evt) {\n                //Using currentTarget instead of target for Firefox 2.0's sake. Not\n                //all old browsers will be supported, but this one was easy enough\n                //to support and still makes sense.\n                if (evt.type === 'load' ||\n                        (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {\n                    //Reset interactive script so a script node is not held onto for\n                    //to long.\n                    interactiveScript = null;\n\n                    //Pull out the name of the module and the context.\n                    var data = getScriptData(evt);\n                    context.completeLoad(data.id);\n                }\n            },\n\n            /**\n             * Callback for script errors.\n             */\n            onScriptError: function (evt) {\n                var data = getScriptData(evt);\n                if (!hasPathFallback(data.id)) {\n                    var parents = [];\n                    eachProp(registry, function(value, key) {\n                        if (key.indexOf('_@r') !== 0) {\n                            each(value.depMaps, function(depMap) {\n                                if (depMap.id === data.id) {\n                                    parents.push(key);\n                                    return true;\n                                }\n                            });\n                        }\n                    });\n                    return onError(makeError('scripterror', 'Script error for \"' + data.id +\n                                             (parents.length ?\n                                             '\", needed by: ' + parents.join(', ') :\n                                             '\"'), evt, [data.id]));\n                }\n            }\n        };\n\n        context.require = context.makeRequire();\n        return context;\n    }\n\n    /**\n     * Main entry point.\n     *\n     * If the only argument to require is a string, then the module that\n     * is represented by that string is fetched for the appropriate context.\n     *\n     * If the first argument is an array, then it will be treated as an array\n     * of dependency string names to fetch. An optional function callback can\n     * be specified to execute when all of those dependencies are available.\n     *\n     * Make a local req variable to help Caja compliance (it assumes things\n     * on a require that are not standardized), and to give a short\n     * name for minification/local scope use.\n     */\n    req = requirejs = function (deps, callback, errback, optional) {\n\n        //Find the right context, use default\n        var context, config,\n            contextName = defContextName;\n\n        // Determine if have config object in the call.\n        if (!isArray(deps) && typeof deps !== 'string') {\n            // deps is a config object\n            config = deps;\n            if (isArray(callback)) {\n                // Adjust args if there are dependencies\n                deps = callback;\n                callback = errback;\n                errback = optional;\n            } else {\n                deps = [];\n            }\n        }\n\n        if (config && config.context) {\n            contextName = config.context;\n        }\n\n        context = getOwn(contexts, contextName);\n        if (!context) {\n            context = contexts[contextName] = req.s.newContext(contextName);\n        }\n\n        if (config) {\n            context.configure(config);\n        }\n\n        return context.require(deps, callback, errback);\n    };\n\n    /**\n     * Support require.config() to make it easier to cooperate with other\n     * AMD loaders on globally agreed names.\n     */\n    req.config = function (config) {\n        return req(config);\n    };\n\n    /**\n     * Execute something after the current tick\n     * of the event loop. Override for other envs\n     * that have a better solution than setTimeout.\n     * @param  {Function} fn function to execute later.\n     */\n    req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {\n        setTimeout(fn, 4);\n    } : function (fn) { fn(); };\n\n    /**\n     * Export require as a global, but only if it does not already exist.\n     */\n    if (!require) {\n        require = req;\n    }\n\n    req.version = version;\n\n    //Used to filter out dependencies that are already paths.\n    req.jsExtRegExp = /^\\/|:|\\?|\\.js$/;\n    req.isBrowser = isBrowser;\n    s = req.s = {\n        contexts: contexts,\n        newContext: newContext\n    };\n\n    //Create default context.\n    req({});\n\n    //Exports some context-sensitive methods on global require.\n    each([\n        'toUrl',\n        'undef',\n        'defined',\n        'specified'\n    ], function (prop) {\n        //Reference from contexts instead of early binding to default context,\n        //so that during builds, the latest instance of the default context\n        //with its config gets used.\n        req[prop] = function () {\n            var ctx = contexts[defContextName];\n            return ctx.require[prop].apply(ctx, arguments);\n        };\n    });\n\n    if (isBrowser) {\n        head = s.head = document.getElementsByTagName('head')[0];\n        //If BASE tag is in play, using appendChild is a problem for IE6.\n        //When that browser dies, this can be removed. Details in this jQuery bug:\n        //http://dev.jquery.com/ticket/2709\n        baseElement = document.getElementsByTagName('base')[0];\n        if (baseElement) {\n            head = s.head = baseElement.parentNode;\n        }\n    }\n\n    /**\n     * Any errors that require explicitly generates will be passed to this\n     * function. Intercept/override it if you want custom error handling.\n     * @param {Error} err the error object.\n     */\n    req.onError = defaultOnError;\n\n    /**\n     * Creates the node for the load command. Only used in browser envs.\n     */\n    req.createNode = function (config, moduleName, url) {\n        var node = config.xhtml ?\n                document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :\n                document.createElement('script');\n        node.type = config.scriptType || 'text/javascript';\n        node.charset = 'utf-8';\n        node.async = true;\n        return node;\n    };\n\n    /**\n     * Does the request to load a module for the browser case.\n     * Make this a separate function to allow other environments\n     * to override it.\n     *\n     * @param {Object} context the require context to find state.\n     * @param {String} moduleName the name of the module.\n     * @param {Object} url the URL to the module.\n     */\n    req.load = function (context, moduleName, url) {\n        var config = (context && context.config) || {},\n            node;\n        if (isBrowser) {\n            //In the browser so use a script tag\n            node = req.createNode(config, moduleName, url);\n\n            node.setAttribute('data-requirecontext', context.contextName);\n            node.setAttribute('data-requiremodule', moduleName);\n\n            //Set up load listener. Test attachEvent first because IE9 has\n            //a subtle issue in its addEventListener and script onload firings\n            //that do not match the behavior of all other browsers with\n            //addEventListener support, which fire the onload event for a\n            //script right after the script execution. See:\n            //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution\n            //UNFORTUNATELY Opera implements attachEvent but does not follow the script\n            //script execution mode.\n            if (node.attachEvent &&\n                    //Check if node.attachEvent is artificially added by custom script or\n                    //natively supported by browser\n                    //read https://github.com/requirejs/requirejs/issues/187\n                    //if we can NOT find [native code] then it must NOT natively supported.\n                    //in IE8, node.attachEvent does not have toString()\n                    //Note the test for \"[native code\" with no closing brace, see:\n                    //https://github.com/requirejs/requirejs/issues/273\n                    !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&\n                    !isOpera) {\n                //Probably IE. IE (at least 6-8) do not fire\n                //script onload right after executing the script, so\n                //we cannot tie the anonymous define call to a name.\n                //However, IE reports the script as being in 'interactive'\n                //readyState at the time of the define call.\n                useInteractive = true;\n\n                node.attachEvent('onreadystatechange', context.onScriptLoad);\n                //It would be great to add an error handler here to catch\n                //404s in IE9+. However, onreadystatechange will fire before\n                //the error handler, so that does not help. If addEventListener\n                //is used, then IE will fire error before load, but we cannot\n                //use that pathway given the connect.microsoft.com issue\n                //mentioned above about not doing the 'script execute,\n                //then fire the script load event listener before execute\n                //next script' that other browsers do.\n                //Best hope: IE10 fixes the issues,\n                //and then destroys all installs of IE 6-9.\n                //node.attachEvent('onerror', context.onScriptError);\n            } else {\n                node.addEventListener('load', context.onScriptLoad, false);\n                node.addEventListener('error', context.onScriptError, false);\n            }\n            node.src = url;\n\n            //Calling onNodeCreated after all properties on the node have been\n            //set, but before it is placed in the DOM.\n            if (config.onNodeCreated) {\n                config.onNodeCreated(node, config, moduleName, url);\n            }\n\n            //For some cache cases in IE 6-8, the script executes before the end\n            //of the appendChild execution, so to tie an anonymous define\n            //call to the module name (which is stored on the node), hold on\n            //to a reference to this node, but clear after the DOM insertion.\n            currentlyAddingScript = node;\n            if (baseElement) {\n                head.insertBefore(node, baseElement);\n            } else {\n                head.appendChild(node);\n            }\n            currentlyAddingScript = null;\n\n            return node;\n        } else if (isWebWorker) {\n            try {\n                //In a web worker, use importScripts. This is not a very\n                //efficient use of importScripts, importScripts will block until\n                //its script is downloaded and evaluated. However, if web workers\n                //are in play, the expectation is that a build has been done so\n                //that only one script needs to be loaded anyway. This may need\n                //to be reevaluated if other use cases become common.\n\n                // Post a task to the event loop to work around a bug in WebKit\n                // where the worker gets garbage-collected after calling\n                // importScripts(): https://webkit.org/b/153317\n                setTimeout(function() {}, 0);\n                importScripts(url);\n\n                //Account for anonymous modules\n                context.completeLoad(moduleName);\n            } catch (e) {\n                context.onError(makeError('importscripts',\n                                'importScripts failed for ' +\n                                    moduleName + ' at ' + url,\n                                e,\n                                [moduleName]));\n            }\n        }\n    };\n\n    function getInteractiveScript() {\n        if (interactiveScript && interactiveScript.readyState === 'interactive') {\n            return interactiveScript;\n        }\n\n        eachReverse(scripts(), function (script) {\n            if (script.readyState === 'interactive') {\n                return (interactiveScript = script);\n            }\n        });\n        return interactiveScript;\n    }\n\n    //Look for a data-main script attribute, which could also adjust the baseUrl.\n    if (isBrowser && !cfg.skipDataMain) {\n        //Figure out baseUrl. Get it from the script tag with require.js in it.\n        eachReverse(scripts(), function (script) {\n            //Set the 'head' where we can append children by\n            //using the script's parent.\n            if (!head) {\n                head = script.parentNode;\n            }\n\n            //Look for a data-main attribute to set main script for the page\n            //to load. If it is there, the path to data main becomes the\n            //baseUrl, if it is not already set.\n            dataMain = script.getAttribute('data-main');\n            if (dataMain) {\n                //Preserve dataMain in case it is a path (i.e. contains '?')\n                mainScript = dataMain;\n\n                //Set final baseUrl if there is not already an explicit one,\n                //but only do so if the data-main value is not a loader plugin\n                //module ID.\n                if (!cfg.baseUrl && mainScript.indexOf('!') === -1) {\n                    //Pull off the directory of data-main for use as the\n                    //baseUrl.\n                    src = mainScript.split('/');\n                    mainScript = src.pop();\n                    subPath = src.length ? src.join('/')  + '/' : './';\n\n                    cfg.baseUrl = subPath;\n                }\n\n                //Strip off any trailing .js since mainScript is now\n                //like a module name.\n                mainScript = mainScript.replace(jsSuffixRegExp, '');\n\n                //If mainScript is still a path, fall back to dataMain\n                if (req.jsExtRegExp.test(mainScript)) {\n                    mainScript = dataMain;\n                }\n\n                //Put the data-main script in the files to load.\n                cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript];\n\n                return true;\n            }\n        });\n    }\n\n    /**\n     * The function that handles definitions of modules. Differs from\n     * require() in that a string for the module should be the first argument,\n     * and the function to execute after dependencies are loaded should\n     * return a value to define the module corresponding to the first argument's\n     * name.\n     */\n    define = function (name, deps, callback) {\n        var node, context;\n\n        //Allow for anonymous modules\n        if (typeof name !== 'string') {\n            //Adjust args appropriately\n            callback = deps;\n            deps = name;\n            name = null;\n        }\n\n        //This module may not have dependencies\n        if (!isArray(deps)) {\n            callback = deps;\n            deps = null;\n        }\n\n        //If no name, and callback is a function, then figure out if it a\n        //CommonJS thing with dependencies.\n        if (!deps && isFunction(callback)) {\n            deps = [];\n            //Remove comments from the callback string,\n            //look for require calls, and pull them into the dependencies,\n            //but only if there are function args.\n            if (callback.length) {\n                callback\n                    .toString()\n                    .replace(commentRegExp, commentReplace)\n                    .replace(cjsRequireRegExp, function (match, dep) {\n                        deps.push(dep);\n                    });\n\n                //May be a CommonJS thing even without require calls, but still\n                //could use exports, and module. Avoid doing exports and module\n                //work though if it just needs require.\n                //REQUIRES the function to expect the CommonJS variables in the\n                //order listed below.\n                deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);\n            }\n        }\n\n        //If in IE 6-8 and hit an anonymous define() call, do the interactive\n        //work.\n        if (useInteractive) {\n            node = currentlyAddingScript || getInteractiveScript();\n            if (node) {\n                if (!name) {\n                    name = node.getAttribute('data-requiremodule');\n                }\n                context = contexts[node.getAttribute('data-requirecontext')];\n            }\n        }\n\n        //Always save off evaluating the def call until the script onload handler.\n        //This allows multiple modules to be in a file without prematurely\n        //tracing dependencies, and allows for anonymous module support,\n        //where the module name is not known until the script onload event\n        //occurs. If no context, use the global queue, and get it processed\n        //in the onscript load callback.\n        if (context) {\n            context.defQueue.push([name, deps, callback]);\n            context.defQueueMap[name] = true;\n        } else {\n            globalDefQueue.push([name, deps, callback]);\n        }\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n\n    /**\n     * Executes the text. Normally just uses eval, but can be modified\n     * to use a better, environment-specific call. Only used for transpiling\n     * loader plugins, not for plain JS modules.\n     * @param {String} text the text to execute/evaluate.\n     */\n    req.exec = function (text) {\n        /*jslint evil: true */\n        return eval(text);\n    };\n\n    //Set up with config info.\n    req(cfg);\n}(this));\n"
  },
  {
    "path": "common/Tests/External/require-2.3.6.js",
    "content": "/** vim: et:ts=4:sw=4:sts=4\n * @license RequireJS 2.3.6 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE\n */\nvar requirejs,require,define;!function(global,setTimeout){var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version=\"2.3.6\",commentRegExp=/\\/\\*[\\s\\S]*?\\*\\/|([^:\"'=]|^)\\/\\/.*$/gm,cjsRequireRegExp=/[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,jsSuffixRegExp=/\\.js$/,currDirRegExp=/^\\.\\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!(\"undefined\"==typeof window||\"undefined\"==typeof navigator||!window.document),isWebWorker=!isBrowser&&\"undefined\"!=typeof importScripts,readyRegExp=isBrowser&&\"PLAYSTATION 3\"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName=\"_\",isOpera=\"undefined\"!=typeof opera&&\"[object Opera]\"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;function commentReplace(e,t){return t||\"\"}function isFunction(e){return\"[object Function]\"===ostring.call(e)}function isArray(e){return\"[object Array]\"===ostring.call(e)}function each(e,t){var i;if(e)for(i=0;i<e.length&&(!e[i]||!t(e[i],i,e));i+=1);}function eachReverse(e,t){var i;if(e)for(i=e.length-1;-1<i&&(!e[i]||!t(e[i],i,e));i-=1);}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(i,e,r,n){return e&&eachProp(e,function(e,t){!r&&hasProp(i,t)||(!n||\"object\"!=typeof e||!e||isArray(e)||isFunction(e)||e instanceof RegExp?i[t]=e:(i[t]||(i[t]={}),mixin(i[t],e,r,n)))}),i}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName(\"script\")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split(\".\"),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+\"\\nhttps://requirejs.org/docs/errors.html#\"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}if(void 0===define){if(void 0!==requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}void 0===require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||\"string\"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),(n=getOwn(contexts,a))||(n=contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick=void 0!==setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\\/|:|\\?|\\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each([\"toUrl\",\"undef\",\"defined\",\"specified\"],function(t){req[t]=function(){var e=contexts[defContextName];return e.require[t].apply(e,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName(\"head\")[0],baseElement=document.getElementsByTagName(\"base\")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"html:script\"):document.createElement(\"script\");return r.type=e.scriptType||\"text/javascript\",r.charset=\"utf-8\",r.async=!0,r},req.load=function(t,i,r){var e,n=t&&t.config||{};if(isBrowser)return(e=req.createNode(n,i,r)).setAttribute(\"data-requirecontext\",t.contextName),e.setAttribute(\"data-requiremodule\",i),!e.attachEvent||e.attachEvent.toString&&e.attachEvent.toString().indexOf(\"[native code\")<0||isOpera?(e.addEventListener(\"load\",t.onScriptLoad,!1),e.addEventListener(\"error\",t.onScriptError,!1)):(useInteractive=!0,e.attachEvent(\"onreadystatechange\",t.onScriptLoad)),e.src=r,n.onNodeCreated&&n.onNodeCreated(e,n,i,r),currentlyAddingScript=e,baseElement?head.insertBefore(e,baseElement):head.appendChild(e),currentlyAddingScript=null,e;if(isWebWorker)try{setTimeout(function(){},0),importScripts(r),t.completeLoad(i)}catch(e){t.onError(makeError(\"importscripts\",\"importScripts failed for \"+i+\" at \"+r,e,[i]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head||(head=e.parentNode),dataMain=e.getAttribute(\"data-main\"))return mainScript=dataMain,cfg.baseUrl||-1!==mainScript.indexOf(\"!\")||(mainScript=(src=mainScript.split(\"/\")).pop(),subPath=src.length?src.join(\"/\")+\"/\":\"./\",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,\"\"),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,i,t){var r,n;\"string\"!=typeof e&&(t=i,i=e,e=null),isArray(i)||(t=i,i=null),!i&&isFunction(t)&&(i=[],t.length&&(t.toString().replace(commentRegExp,commentReplace).replace(cjsRequireRegExp,function(e,t){i.push(t)}),i=(1===t.length?[\"require\"]:[\"require\",\"exports\",\"module\"]).concat(i))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript())&&(e||(e=r.getAttribute(\"data-requiremodule\")),n=contexts[r.getAttribute(\"data-requirecontext\")]),n?(n.defQueue.push([e,i,t]),n.defQueueMap[e]=!0):globalDefQueue.push([e,i,t])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}function newContext(u){var i,e,l,c,d,g={waitSeconds:7,baseUrl:\"./\",paths:{},bundles:{},pkgs:{},shim:{},config:{}},p={},f={},r={},h=[],m={},n={},v={},x=1,b=1;function q(e,t,i){var r,n,o,a,s,u,c,d,p,f,l=t&&t.split(\"/\"),h=g.map,m=h&&h[\"*\"];if(e&&(u=(e=e.split(\"/\")).length-1,g.nodeIdCompat&&jsSuffixRegExp.test(e[u])&&(e[u]=e[u].replace(jsSuffixRegExp,\"\")),\".\"===e[0].charAt(0)&&l&&(e=l.slice(0,l.length-1).concat(e)),function(e){var t,i;for(t=0;t<e.length;t++)if(\".\"===(i=e[t]))e.splice(t,1),t-=1;else if(\"..\"===i){if(0===t||1===t&&\"..\"===e[2]||\"..\"===e[t-1])continue;0<t&&(e.splice(t-1,2),t-=2)}}(e),e=e.join(\"/\")),i&&h&&(l||m)){e:for(o=(n=e.split(\"/\")).length;0<o;o-=1){if(s=n.slice(0,o).join(\"/\"),l)for(a=l.length;0<a;a-=1)if((r=getOwn(h,l.slice(0,a).join(\"/\")))&&(r=getOwn(r,s))){c=r,d=o;break e}!p&&m&&getOwn(m,s)&&(p=getOwn(m,s),f=o)}!c&&p&&(c=p,d=f),c&&(n.splice(0,d,c),e=n.join(\"/\"))}return getOwn(g.pkgs,e)||e}function E(t){isBrowser&&each(scripts(),function(e){if(e.getAttribute(\"data-requiremodule\")===t&&e.getAttribute(\"data-requirecontext\")===l.contextName)return e.parentNode.removeChild(e),!0})}function w(e){var t=getOwn(g.paths,e);if(t&&isArray(t)&&1<t.length)return t.shift(),l.require.undef(e),l.makeRequire(null,{skipMap:!0})([e]),!0}function y(e){var t,i=e?e.indexOf(\"!\"):-1;return-1<i&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function S(e,t,i,r){var n,o,a,s,u=null,c=t?t.name:null,d=e,p=!0,f=\"\";return e||(p=!1,e=\"_@r\"+(x+=1)),u=(s=y(e))[0],e=s[1],u&&(u=q(u,c,r),o=getOwn(m,u)),e&&(u?f=i?e:o&&o.normalize?o.normalize(e,function(e){return q(e,c,r)}):-1===e.indexOf(\"!\")?q(e,c,r):e:(u=(s=y(f=q(e,c,r)))[0],f=s[1],i=!0,n=l.nameToUrl(f))),{prefix:u,name:f,parentMap:t,unnormalized:!!(a=!u||o||i?\"\":\"_unnormalized\"+(b+=1)),url:n,originalName:d,isDefine:p,id:(u?u+\"!\"+f:f)+a}}function k(e){var t=e.id,i=getOwn(p,t);return i||(i=p[t]=new l.Module(e)),i}function M(e,t,i){var r=e.id,n=getOwn(p,r);!hasProp(m,r)||n&&!n.defineEmitComplete?(n=k(e)).error&&\"error\"===t?i(n.error):n.on(t,i):\"defined\"===t&&i(m[r])}function O(i,e){var t=i.requireModules,r=!1;e?e(i):(each(t,function(e){var t=getOwn(p,e);t&&(t.error=i,t.events.error&&(r=!0,t.emit(\"error\",i)))}),r||req.onError(i))}function j(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];\"string\"==typeof t&&(l.defQueueMap[t]=!0),h.push(e)}),globalDefQueue=[])}function P(e){delete p[e],delete f[e]}function R(){var e,r,t=1e3*g.waitSeconds,n=t&&l.startTime+t<(new Date).getTime(),o=[],a=[],s=!1,u=!0;if(!i){if(i=!0,eachProp(f,function(e){var t=e.map,i=t.id;if(e.enabled&&(t.isDefine||a.push(e),!e.error))if(!e.inited&&n)w(i)?s=r=!0:(o.push(i),E(i));else if(!e.inited&&e.fetched&&t.isDefine&&(s=!0,!t.prefix))return u=!1}),n&&o.length)return(e=makeError(\"timeout\",\"Load timeout for modules: \"+o,null,o)).contextName=l.contextName,O(e);u&&each(a,function(e){!function n(o,a,s){var e=o.map.id;o.error?o.emit(\"error\",o.error):(a[e]=!0,each(o.depMaps,function(e,t){var i=e.id,r=getOwn(p,i);!r||o.depMatched[t]||s[i]||(getOwn(a,i)?(o.defineDep(t,m[i]),o.check()):n(r,a,s))}),s[e]=!0)}(e,{},{})}),n&&!r||!s||!isBrowser&&!isWebWorker||d||(d=setTimeout(function(){d=0,R()},50)),i=!1}}function a(e){hasProp(m,e[0])||k(S(e[0],null,!0)).init(e[1],e[2])}function o(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function s(e){var t=e.currentTarget||e.srcElement;return o(t,l.onScriptLoad,\"load\",\"onreadystatechange\"),o(t,l.onScriptError,\"error\"),{node:t,id:t&&t.getAttribute(\"data-requiremodule\")}}function T(){var e;for(j();h.length;){if(null===(e=h.shift())[0])return O(makeError(\"mismatch\",\"Mismatched anonymous define() module: \"+e[e.length-1]));a(e)}l.defQueueMap={}}return c={require:function(e){return e.require?e.require:e.require=l.makeRequire(e.map)},exports:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?m[e.map.id]=e.exports:e.exports=m[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(g.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},(e=function(e){this.events=getOwn(r,e.id)||{},this.map=e,this.shim=getOwn(g.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0}).prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on(\"error\",i):this.events.error&&(i=bind(this,function(e){this.emit(\"error\",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,l.startTime=(new Date).getTime();var e=this.map;if(!this.shim)return e.prefix?this.callPlugin():this.load();l.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()}))}},load:function(){var e=this.map.url;n[e]||(n[e]=!0,l.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var t,e,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit(\"error\",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=l.execCb(i,o,r,n)}catch(e){t=e}else n=l.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&((e=this.module)?n=e.exports:this.usingExports&&(n=this.exports)),t)return t.requireMap=this.map,t.requireModules=this.map.isDefine?[this.map.id]:null,t.requireType=this.map.isDefine?\"define\":\"require\",O(this.error=t)}else n=o;if(this.exports=n,this.map.isDefine&&!this.ignore&&(m[i]=n,req.onResourceLoad)){var a=[];each(this.depMaps,function(e){a.push(e.normalizedMap||e)}),req.onResourceLoad(l,this.map,a)}P(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit(\"defined\",this.exports),this.defineEmitComplete=!0)}}else hasProp(l.defQueueMap,i)||this.fetch()}},callPlugin:function(){var u=this.map,c=u.id,e=S(u.prefix);this.depMaps.push(e),M(e,\"defined\",bind(this,function(e){var o,t,i,r=getOwn(v,this.map.id),n=this.map.name,a=this.map.parentMap?this.map.parentMap.name:null,s=l.makeRequire(u.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(e.normalize&&(n=e.normalize(n,function(e){return q(e,a,!0)})||\"\"),M(t=S(u.prefix+\"!\"+n,this.map.parentMap,!0),\"defined\",bind(this,function(e){this.map.normalizedMap=t,this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),void((i=getOwn(p,t.id))&&(this.depMaps.push(t),this.events.error&&i.on(\"error\",bind(this,function(e){this.emit(\"error\",e)})),i.enable()))):r?(this.map.url=l.nameToUrl(r),void this.load()):((o=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})})).error=bind(this,function(e){this.inited=!0,(this.error=e).requireModules=[c],eachProp(p,function(e){0===e.map.id.indexOf(c+\"_unnormalized\")&&P(e.map.id)}),O(e)}),o.fromText=bind(this,function(e,t){var i=u.name,r=S(i),n=useInteractive;t&&(e=t),n&&(useInteractive=!1),k(r),hasProp(g.config,c)&&(g.config[i]=g.config[c]);try{req.exec(e)}catch(e){return O(makeError(\"fromtexteval\",\"fromText eval for \"+c+\" failed: \"+e,e,[c]))}n&&(useInteractive=!0),this.depMaps.push(r),l.completeLoad(i),s([i],o)}),void e.load(u.name,s,o,g))})),l.enable(e,this),this.pluginMaps[e.id]=e},enable:function(){(f[this.map.id]=this).enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if(\"string\"==typeof e){if(e=S(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(c,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,M(e,\"defined\",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?M(e,\"error\",bind(this,this.errback)):this.events.error&&M(e,\"error\",bind(this,function(e){this.emit(\"error\",e)}))}i=e.id,r=p[i],hasProp(c,i)||!r||r.enabled||l.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(p,e.id);t&&!t.enabled&&l.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),\"error\"===e&&delete this.events[e]}},(l={config:g,contextName:u,registry:p,defined:m,urlFetched:n,defQueue:h,defQueueMap:{},Module:e,makeModuleMap:S,nextTick:req.nextTick,onError:O,configure:function(e){if(e.baseUrl&&\"/\"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+=\"/\"),\"string\"==typeof e.urlArgs){var i=e.urlArgs;e.urlArgs=function(e,t){return(-1===t.indexOf(\"?\")?\"?\":\"&\")+i}}var r=g.shim,n={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){n[t]?(g[t]||(g[t]={}),mixin(g[t],e,!0,!0)):g[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(v[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=l.makeShimExports(e)),r[t]=e}),g.shim=r),e.packages&&each(e.packages,function(e){var t;t=(e=\"string\"==typeof e?{name:e}:e).name,e.location&&(g.paths[t]=e.location),g.pkgs[t]=e.name+\"/\"+(e.main||\"main\").replace(currDirRegExp,\"\").replace(jsSuffixRegExp,\"\")}),eachProp(p,function(e,t){e.inited||e.map.unnormalized||(e.map=S(t,null,!0))}),(e.deps||e.callback)&&l.require(e.deps||[],e.callback)},makeShimExports:function(t){return function(){var e;return t.init&&(e=t.init.apply(global,arguments)),e||t.exports&&getGlobal(t.exports)}},makeRequire:function(o,a){function s(e,t,i){var r,n;return a.enableBuildCallback&&t&&isFunction(t)&&(t.__requireJsBuild=!0),\"string\"==typeof e?isFunction(t)?O(makeError(\"requireargs\",\"Invalid require call\"),i):o&&hasProp(c,e)?c[e](p[o.id]):req.get?req.get(l,e,o,s):(r=S(e,o,!1,!0).id,hasProp(m,r)?m[r]:O(makeError(\"notloaded\",'Module name \"'+r+'\" has not been loaded yet for context: '+u+(o?\"\":\". Use require([])\")))):(T(),l.nextTick(function(){T(),(n=k(S(null,o))).skipMap=a.skipMap,n.init(e,t,i,{enabled:!0}),R()}),s)}return a=a||{},mixin(s,{isBrowser:isBrowser,toUrl:function(e){var t,i=e.lastIndexOf(\".\"),r=e.split(\"/\")[0];return-1!==i&&(!(\".\"===r||\"..\"===r)||1<i)&&(t=e.substring(i,e.length),e=e.substring(0,i)),l.nameToUrl(q(e,o&&o.id,!0),t,!0)},defined:function(e){return hasProp(m,S(e,o,!1,!0).id)},specified:function(e){return e=S(e,o,!1,!0).id,hasProp(m,e)||hasProp(p,e)}}),o||(s.undef=function(i){j();var e=S(i,o,!0),t=getOwn(p,i);t.undefed=!0,E(i),delete m[i],delete n[e.url],delete r[i],eachReverse(h,function(e,t){e[0]===i&&h.splice(t,1)}),delete l.defQueueMap[i],t&&(t.events.defined&&(r[i]=t.events),P(i))}),s},enable:function(e){getOwn(p,e.id)&&k(e).enable()},completeLoad:function(e){var t,i,r,n=getOwn(g.shim,e)||{},o=n.exports;for(j();h.length;){if(null===(i=h.shift())[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);a(i)}if(l.defQueueMap={},r=getOwn(p,e),!t&&!hasProp(m,e)&&r&&!r.inited){if(!(!g.enforceDefine||o&&getGlobal(o)))return w(e)?void 0:O(makeError(\"nodefine\",\"No define call for \"+e,null,[e]));a([e,n.deps||[],n.exportsFn])}R()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c=getOwn(g.pkgs,e);if(c&&(e=c),u=getOwn(v,e))return l.nameToUrl(u,t,i);if(req.jsExtRegExp.test(e))a=e+(t||\"\");else{for(r=g.paths,o=(n=e.split(\"/\")).length;0<o;o-=1)if(s=getOwn(r,n.slice(0,o).join(\"/\"))){isArray(s)&&(s=s[0]),n.splice(0,o,s);break}a=n.join(\"/\"),a=(\"/\"===(a+=t||(/^data\\:|^blob\\:|\\?/.test(a)||i?\"\":\".js\")).charAt(0)||a.match(/^[\\w\\+\\.\\-]+:/)?\"\":g.baseUrl)+a}return g.urlArgs&&!/^blob\\:/.test(a)?a+g.urlArgs(e,a):a},load:function(e,t){req.load(l,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){if(\"load\"===e.type||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){interactiveScript=null;var t=s(e);l.completeLoad(t.id)}},onScriptError:function(e){var i=s(e);if(!w(i.id)){var r=[];return eachProp(p,function(e,t){0!==t.indexOf(\"_@r\")&&each(e.depMaps,function(e){if(e.id===i.id)return r.push(t),!0})}),O(makeError(\"scripterror\",'Script error for \"'+i.id+(r.length?'\", needed by: '+r.join(\", \"):'\"'),e,[i.id]))}}}).require=l.makeRequire(),l}function getInteractiveScript(){return interactiveScript&&\"interactive\"===interactiveScript.readyState||eachReverse(scripts(),function(e){if(\"interactive\"===e.readyState)return interactiveScript=e}),interactiveScript}}(this,\"undefined\"==typeof setTimeout?void 0:setTimeout);"
  },
  {
    "path": "common/Tests/External/sinon-1.17.2.js",
    "content": "/**\n * Sinon.JS 1.17.2, 2015/10/21\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS\n *\n * (The BSD License)\n * \n * Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * \n *     * Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright notice,\n *       this list of conditions and the following disclaimer in the documentation\n *       and/or other materials provided with the distribution.\n *     * Neither the name of Christian Johansen nor the names of his contributors\n *       may be used to endorse or promote products derived from this software\n *       without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function (root, factory) {\n    'use strict';\n    if (typeof define === 'function' && define.amd) {\n        define('sinon', [], function () {\n            return (root.sinon = factory());\n        });\n    } else if (typeof exports === 'object') {\n        module.exports = factory();\n    } else {\n        root.sinon = factory();\n    }\n}(this, function () {\n    'use strict';\n    var samsam, formatio, lolex;\n    (function () {\n        function define(mod, deps, fn) {\n            if (mod == \"samsam\") {\n                samsam = deps();\n            } else if (typeof deps === \"function\" && mod.length === 0) {\n                lolex = deps();\n            } else if (typeof fn === \"function\") {\n                formatio = fn(samsam);\n            }\n        }\n        define.amd = {};\n        ((typeof define === \"function\" && define.amd && function (m) { define(\"samsam\", m); }) ||\n         (typeof module === \"object\" &&\n              function (m) { module.exports = m(); }) || // Node\n         function (m) { this.samsam = m(); } // Browser globals\n        )(function () {\n            var o = Object.prototype;\n            var div = typeof document !== \"undefined\" && document.createElement(\"div\");\n\n            function isNaN(value) {\n                // Unlike global isNaN, this avoids type coercion\n                // typeof check avoids IE host object issues, hat tip to\n                // lodash\n                var val = value; // JsLint thinks value !== value is \"weird\"\n                return typeof value === \"number\" && value !== val;\n            }\n\n            function getClass(value) {\n                // Returns the internal [[Class]] by calling Object.prototype.toString\n                // with the provided value as this. Return value is a string, naming the\n                // internal class, e.g. \"Array\"\n                return o.toString.call(value).split(/[ \\]]/)[1];\n            }\n\n            /**\n             * @name samsam.isArguments\n             * @param Object object\n             *\n             * Returns ``true`` if ``object`` is an ``arguments`` object,\n             * ``false`` otherwise.\n             */\n            function isArguments(object) {\n                if (getClass(object) === 'Arguments') { return true; }\n                if (typeof object !== \"object\" || typeof object.length !== \"number\" ||\n                        getClass(object) === \"Array\") {\n                    return false;\n                }\n                if (typeof object.callee == \"function\") { return true; }\n                try {\n                    object[object.length] = 6;\n                    delete object[object.length];\n                } catch (e) {\n                    return true;\n                }\n                return false;\n            }\n\n            /**\n             * @name samsam.isElement\n             * @param Object object\n             *\n             * Returns ``true`` if ``object`` is a DOM element node. Unlike\n             * Underscore.js/lodash, this function will return ``false`` if ``object``\n             * is an *element-like* object, i.e. a regular object with a ``nodeType``\n             * property that holds the value ``1``.\n             */\n            function isElement(object) {\n                if (!object || object.nodeType !== 1 || !div) { return false; }\n                try {\n                    object.appendChild(div);\n                    object.removeChild(div);\n                } catch (e) {\n                    return false;\n                }\n                return true;\n            }\n\n            /**\n             * @name samsam.keys\n             * @param Object object\n             *\n             * Return an array of own property names.\n             */\n            function keys(object) {\n                var ks = [], prop;\n                for (prop in object) {\n                    if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }\n                }\n                return ks;\n            }\n\n            /**\n             * @name samsam.isDate\n             * @param Object value\n             *\n             * Returns true if the object is a ``Date``, or *date-like*. Duck typing\n             * of date objects work by checking that the object has a ``getTime``\n             * function whose return value equals the return value from the object's\n             * ``valueOf``.\n             */\n            function isDate(value) {\n                return typeof value.getTime == \"function\" &&\n                    value.getTime() == value.valueOf();\n            }\n\n            /**\n             * @name samsam.isNegZero\n             * @param Object value\n             *\n             * Returns ``true`` if ``value`` is ``-0``.\n             */\n            function isNegZero(value) {\n                return value === 0 && 1 / value === -Infinity;\n            }\n\n            /**\n             * @name samsam.equal\n             * @param Object obj1\n             * @param Object obj2\n             *\n             * Returns ``true`` if two objects are strictly equal. Compared to\n             * ``===`` there are two exceptions:\n             *\n             *   - NaN is considered equal to NaN\n             *   - -0 and +0 are not considered equal\n             */\n            function identical(obj1, obj2) {\n                if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {\n                    return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);\n                }\n            }\n\n\n            /**\n             * @name samsam.deepEqual\n             * @param Object obj1\n             * @param Object obj2\n             *\n             * Deep equal comparison. Two values are \"deep equal\" if:\n             *\n             *   - They are equal, according to samsam.identical\n             *   - They are both date objects representing the same time\n             *   - They are both arrays containing elements that are all deepEqual\n             *   - They are objects with the same set of properties, and each property\n             *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``\n             *\n             * Supports cyclic objects.\n             */\n            function deepEqualCyclic(obj1, obj2) {\n\n                // used for cyclic comparison\n                // contain already visited objects\n                var objects1 = [],\n                    objects2 = [],\n                // contain pathes (position in the object structure)\n                // of the already visited objects\n                // indexes same as in objects arrays\n                    paths1 = [],\n                    paths2 = [],\n                // contains combinations of already compared objects\n                // in the manner: { \"$1['ref']$2['ref']\": true }\n                    compared = {};\n\n                /**\n                 * used to check, if the value of a property is an object\n                 * (cyclic logic is only needed for objects)\n                 * only needed for cyclic logic\n                 */\n                function isObject(value) {\n\n                    if (typeof value === 'object' && value !== null &&\n                            !(value instanceof Boolean) &&\n                            !(value instanceof Date) &&\n                            !(value instanceof Number) &&\n                            !(value instanceof RegExp) &&\n                            !(value instanceof String)) {\n\n                        return true;\n                    }\n\n                    return false;\n                }\n\n                /**\n                 * returns the index of the given object in the\n                 * given objects array, -1 if not contained\n                 * only needed for cyclic logic\n                 */\n                function getIndex(objects, obj) {\n\n                    var i;\n                    for (i = 0; i < objects.length; i++) {\n                        if (objects[i] === obj) {\n                            return i;\n                        }\n                    }\n\n                    return -1;\n                }\n\n                // does the recursion for the deep equal check\n                return (function deepEqual(obj1, obj2, path1, path2) {\n                    var type1 = typeof obj1;\n                    var type2 = typeof obj2;\n\n                    // == null also matches undefined\n                    if (obj1 === obj2 ||\n                            isNaN(obj1) || isNaN(obj2) ||\n                            obj1 == null || obj2 == null ||\n                            type1 !== \"object\" || type2 !== \"object\") {\n\n                        return identical(obj1, obj2);\n                    }\n\n                    // Elements are only equal if identical(expected, actual)\n                    if (isElement(obj1) || isElement(obj2)) { return false; }\n\n                    var isDate1 = isDate(obj1), isDate2 = isDate(obj2);\n                    if (isDate1 || isDate2) {\n                        if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {\n                            return false;\n                        }\n                    }\n\n                    if (obj1 instanceof RegExp && obj2 instanceof RegExp) {\n                        if (obj1.toString() !== obj2.toString()) { return false; }\n                    }\n\n                    var class1 = getClass(obj1);\n                    var class2 = getClass(obj2);\n                    var keys1 = keys(obj1);\n                    var keys2 = keys(obj2);\n\n                    if (isArguments(obj1) || isArguments(obj2)) {\n                        if (obj1.length !== obj2.length) { return false; }\n                    } else {\n                        if (type1 !== type2 || class1 !== class2 ||\n                                keys1.length !== keys2.length) {\n                            return false;\n                        }\n                    }\n\n                    var key, i, l,\n                        // following vars are used for the cyclic logic\n                        value1, value2,\n                        isObject1, isObject2,\n                        index1, index2,\n                        newPath1, newPath2;\n\n                    for (i = 0, l = keys1.length; i < l; i++) {\n                        key = keys1[i];\n                        if (!o.hasOwnProperty.call(obj2, key)) {\n                            return false;\n                        }\n\n                        // Start of the cyclic logic\n\n                        value1 = obj1[key];\n                        value2 = obj2[key];\n\n                        isObject1 = isObject(value1);\n                        isObject2 = isObject(value2);\n\n                        // determine, if the objects were already visited\n                        // (it's faster to check for isObject first, than to\n                        // get -1 from getIndex for non objects)\n                        index1 = isObject1 ? getIndex(objects1, value1) : -1;\n                        index2 = isObject2 ? getIndex(objects2, value2) : -1;\n\n                        // determine the new pathes of the objects\n                        // - for non cyclic objects the current path will be extended\n                        //   by current property name\n                        // - for cyclic objects the stored path is taken\n                        newPath1 = index1 !== -1\n                            ? paths1[index1]\n                            : path1 + '[' + JSON.stringify(key) + ']';\n                        newPath2 = index2 !== -1\n                            ? paths2[index2]\n                            : path2 + '[' + JSON.stringify(key) + ']';\n\n                        // stop recursion if current objects are already compared\n                        if (compared[newPath1 + newPath2]) {\n                            return true;\n                        }\n\n                        // remember the current objects and their pathes\n                        if (index1 === -1 && isObject1) {\n                            objects1.push(value1);\n                            paths1.push(newPath1);\n                        }\n                        if (index2 === -1 && isObject2) {\n                            objects2.push(value2);\n                            paths2.push(newPath2);\n                        }\n\n                        // remember that the current objects are already compared\n                        if (isObject1 && isObject2) {\n                            compared[newPath1 + newPath2] = true;\n                        }\n\n                        // End of cyclic logic\n\n                        // neither value1 nor value2 is a cycle\n                        // continue with next level\n                        if (!deepEqual(value1, value2, newPath1, newPath2)) {\n                            return false;\n                        }\n                    }\n\n                    return true;\n\n                }(obj1, obj2, '$1', '$2'));\n            }\n\n            var match;\n\n            function arrayContains(array, subset) {\n                if (subset.length === 0) { return true; }\n                var i, l, j, k;\n                for (i = 0, l = array.length; i < l; ++i) {\n                    if (match(array[i], subset[0])) {\n                        for (j = 0, k = subset.length; j < k; ++j) {\n                            if (!match(array[i + j], subset[j])) { return false; }\n                        }\n                        return true;\n                    }\n                }\n                return false;\n            }\n\n            /**\n             * @name samsam.match\n             * @param Object object\n             * @param Object matcher\n             *\n             * Compare arbitrary value ``object`` with matcher.\n             */\n            match = function match(object, matcher) {\n                if (matcher && typeof matcher.test === \"function\") {\n                    return matcher.test(object);\n                }\n\n                if (typeof matcher === \"function\") {\n                    return matcher(object) === true;\n                }\n\n                if (typeof matcher === \"string\") {\n                    matcher = matcher.toLowerCase();\n                    var notNull = typeof object === \"string\" || !!object;\n                    return notNull &&\n                        (String(object)).toLowerCase().indexOf(matcher) >= 0;\n                }\n\n                if (typeof matcher === \"number\") {\n                    return matcher === object;\n                }\n\n                if (typeof matcher === \"boolean\") {\n                    return matcher === object;\n                }\n\n                if (typeof (matcher) === \"undefined\") {\n                    return typeof (object) === \"undefined\";\n                }\n\n                if (matcher === null) {\n                    return object === null;\n                }\n\n                if (getClass(object) === \"Array\" && getClass(matcher) === \"Array\") {\n                    return arrayContains(object, matcher);\n                }\n\n                if (matcher && typeof matcher === \"object\") {\n                    if (matcher === object) {\n                        return true;\n                    }\n                    var prop;\n                    for (prop in matcher) {\n                        var value = object[prop];\n                        if (typeof value === \"undefined\" &&\n                                typeof object.getAttribute === \"function\") {\n                            value = object.getAttribute(prop);\n                        }\n                        if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {\n                            if (value !== matcher[prop]) {\n                                return false;\n                            }\n                        } else if (typeof value === \"undefined\" || !match(value, matcher[prop])) {\n                            return false;\n                        }\n                    }\n                    return true;\n                }\n\n                throw new Error(\"Matcher was not a string, a number, a \" +\n                                \"function, a boolean or an object\");\n            };\n\n            return {\n                isArguments: isArguments,\n                isElement: isElement,\n                isDate: isDate,\n                isNegZero: isNegZero,\n                identical: identical,\n                deepEqual: deepEqualCyclic,\n                match: match,\n                keys: keys\n            };\n        });\n        ((typeof define === \"function\" && define.amd && function (m) {\n            define(\"formatio\", [\"samsam\"], m);\n        }) || (typeof module === \"object\" && function (m) {\n            module.exports = m(require(\"samsam\"));\n        }) || function (m) { this.formatio = m(this.samsam); }\n        )(function (samsam) {\n\n            var formatio = {\n                excludeConstructors: [\"Object\", /^.$/],\n                quoteStrings: true,\n                limitChildrenCount: 0\n            };\n\n            var hasOwn = Object.prototype.hasOwnProperty;\n\n            var specialObjects = [];\n            if (typeof global !== \"undefined\") {\n                specialObjects.push({ object: global, value: \"[object global]\" });\n            }\n            if (typeof document !== \"undefined\") {\n                specialObjects.push({\n                    object: document,\n                    value: \"[object HTMLDocument]\"\n                });\n            }\n            if (typeof window !== \"undefined\") {\n                specialObjects.push({ object: window, value: \"[object Window]\" });\n            }\n\n            function functionName(func) {\n                if (!func) { return \"\"; }\n                if (func.displayName) { return func.displayName; }\n                if (func.name) { return func.name; }\n                var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n                return (matches && matches[1]) || \"\";\n            }\n\n            function constructorName(f, object) {\n                var name = functionName(object && object.constructor);\n                var excludes = f.excludeConstructors ||\n                        formatio.excludeConstructors || [];\n\n                var i, l;\n                for (i = 0, l = excludes.length; i < l; ++i) {\n                    if (typeof excludes[i] === \"string\" && excludes[i] === name) {\n                        return \"\";\n                    } else if (excludes[i].test && excludes[i].test(name)) {\n                        return \"\";\n                    }\n                }\n\n                return name;\n            }\n\n            function isCircular(object, objects) {\n                if (typeof object !== \"object\") { return false; }\n                var i, l;\n                for (i = 0, l = objects.length; i < l; ++i) {\n                    if (objects[i] === object) { return true; }\n                }\n                return false;\n            }\n\n            function ascii(f, object, processed, indent) {\n                if (typeof object === \"string\") {\n                    var qs = f.quoteStrings;\n                    var quote = typeof qs !== \"boolean\" || qs;\n                    return processed || quote ? '\"' + object + '\"' : object;\n                }\n\n                if (typeof object === \"function\" && !(object instanceof RegExp)) {\n                    return ascii.func(object);\n                }\n\n                processed = processed || [];\n\n                if (isCircular(object, processed)) { return \"[Circular]\"; }\n\n                if (Object.prototype.toString.call(object) === \"[object Array]\") {\n                    return ascii.array.call(f, object, processed);\n                }\n\n                if (!object) { return String((1 / object) === -Infinity ? \"-0\" : object); }\n                if (samsam.isElement(object)) { return ascii.element(object); }\n\n                if (typeof object.toString === \"function\" &&\n                        object.toString !== Object.prototype.toString) {\n                    return object.toString();\n                }\n\n                var i, l;\n                for (i = 0, l = specialObjects.length; i < l; i++) {\n                    if (object === specialObjects[i].object) {\n                        return specialObjects[i].value;\n                    }\n                }\n\n                return ascii.object.call(f, object, processed, indent);\n            }\n\n            ascii.func = function (func) {\n                return \"function \" + functionName(func) + \"() {}\";\n            };\n\n            ascii.array = function (array, processed) {\n                processed = processed || [];\n                processed.push(array);\n                var pieces = [];\n                var i, l;\n                l = (this.limitChildrenCount > 0) ?\n                    Math.min(this.limitChildrenCount, array.length) : array.length;\n\n                for (i = 0; i < l; ++i) {\n                    pieces.push(ascii(this, array[i], processed));\n                }\n\n                if (l < array.length)\n                    pieces.push(\"[... \" + (array.length - l) + \" more elements]\");\n\n                return \"[\" + pieces.join(\", \") + \"]\";\n            };\n\n            ascii.object = function (object, processed, indent) {\n                processed = processed || [];\n                processed.push(object);\n                indent = indent || 0;\n                var pieces = [], properties = samsam.keys(object).sort();\n                var length = 3;\n                var prop, str, obj, i, k, l;\n                l = (this.limitChildrenCount > 0) ?\n                    Math.min(this.limitChildrenCount, properties.length) : properties.length;\n\n                for (i = 0; i < l; ++i) {\n                    prop = properties[i];\n                    obj = object[prop];\n\n                    if (isCircular(obj, processed)) {\n                        str = \"[Circular]\";\n                    } else {\n                        str = ascii(this, obj, processed, indent + 2);\n                    }\n\n                    str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n                    length += str.length;\n                    pieces.push(str);\n                }\n\n                var cons = constructorName(this, object);\n                var prefix = cons ? \"[\" + cons + \"] \" : \"\";\n                var is = \"\";\n                for (i = 0, k = indent; i < k; ++i) { is += \" \"; }\n\n                if (l < properties.length)\n                    pieces.push(\"[... \" + (properties.length - l) + \" more elements]\");\n\n                if (length + indent > 80) {\n                    return prefix + \"{\\n  \" + is + pieces.join(\",\\n  \" + is) + \"\\n\" +\n                        is + \"}\";\n                }\n                return prefix + \"{ \" + pieces.join(\", \") + \" }\";\n            };\n\n            ascii.element = function (element) {\n                var tagName = element.tagName.toLowerCase();\n                var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;\n\n                for (i = 0, l = attrs.length; i < l; ++i) {\n                    attr = attrs.item(i);\n                    attrName = attr.nodeName.toLowerCase().replace(\"html:\", \"\");\n                    val = attr.nodeValue;\n                    if (attrName !== \"contenteditable\" || val !== \"inherit\") {\n                        if (!!val) { pairs.push(attrName + \"=\\\"\" + val + \"\\\"\"); }\n                    }\n                }\n\n                var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n                var content = element.innerHTML;\n\n                if (content.length > 20) {\n                    content = content.substr(0, 20) + \"[...]\";\n                }\n\n                var res = formatted + pairs.join(\" \") + \">\" + content +\n                        \"</\" + tagName + \">\";\n\n                return res.replace(/ contentEditable=\"inherit\"/, \"\");\n            };\n\n            function Formatio(options) {\n                for (var opt in options) {\n                    this[opt] = options[opt];\n                }\n            }\n\n            Formatio.prototype = {\n                functionName: functionName,\n\n                configure: function (options) {\n                    return new Formatio(options);\n                },\n\n                constructorName: function (object) {\n                    return constructorName(this, object);\n                },\n\n                ascii: function (object, processed, indent) {\n                    return ascii(this, object, processed, indent);\n                }\n            };\n\n            return Formatio.prototype;\n        });\n        !function (e) { if (\"object\" == typeof exports && \"undefined\" != typeof module) module.exports = e(); else if (\"function\" == typeof define && define.amd) define([], e); else { var f; \"undefined\" != typeof window ? f = window : \"undefined\" != typeof global ? f = global : \"undefined\" != typeof self && (f = self), f.lolex = e() } }(function () {\n            var define, module, exports; return (function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require == \"function\" && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error(\"Cannot find module '\" + o + \"'\"); throw f.code = \"MODULE_NOT_FOUND\", f } var l = n[o] = { exports: {} }; t[o][0].call(l.exports, function (e) { var n = t[o][1][e]; return s(n ? n : e) }, l, l.exports, e, t, n, r) } return n[o].exports } var i = typeof require == \"function\" && require; for (var o = 0; o < r.length; o++) s(r[o]); return s })({\n                1: [function (require, module, exports) {\n                    (function (global) {\n                        /*global global, window*/\n                        /**\n                         * @author Christian Johansen (christian@cjohansen.no) and contributors\n                         * @license BSD\n                         *\n                         * Copyright (c) 2010-2014 Christian Johansen\n                         */\n\n                        (function (global) {\n\n                            // Make properties writable in IE, as per\n                            // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html\n                            // JSLint being anal\n                            var glbl = global;\n\n                            global.setTimeout = glbl.setTimeout;\n                            global.clearTimeout = glbl.clearTimeout;\n                            global.setInterval = glbl.setInterval;\n                            global.clearInterval = glbl.clearInterval;\n                            global.Date = glbl.Date;\n\n                            // setImmediate is not a standard function\n                            // avoid adding the prop to the window object if not present\n                            if ('setImmediate' in global) {\n                                global.setImmediate = glbl.setImmediate;\n                                global.clearImmediate = glbl.clearImmediate;\n                            }\n\n                            // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()\n                            // browsers, a number.\n                            // see https://github.com/cjohansen/Sinon.JS/pull/436\n\n                            var NOOP = function () { return undefined; };\n                            var timeoutResult = setTimeout(NOOP, 0);\n                            var addTimerReturnsObject = typeof timeoutResult === \"object\";\n                            clearTimeout(timeoutResult);\n\n                            var NativeDate = Date;\n                            var uniqueTimerId = 1;\n\n                            /**\n                             * Parse strings like \"01:10:00\" (meaning 1 hour, 10 minutes, 0 seconds) into\n                             * number of milliseconds. This is used to support human-readable strings passed\n                             * to clock.tick()\n                             */\n                            function parseTime(str) {\n                                if (!str) {\n                                    return 0;\n                                }\n\n                                var strings = str.split(\":\");\n                                var l = strings.length, i = l;\n                                var ms = 0, parsed;\n\n                                if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n                                    throw new Error(\"tick only understands numbers and 'h:m:s'\");\n                                }\n\n                                while (i--) {\n                                    parsed = parseInt(strings[i], 10);\n\n                                    if (parsed >= 60) {\n                                        throw new Error(\"Invalid time \" + str);\n                                    }\n\n                                    ms += parsed * Math.pow(60, (l - i - 1));\n                                }\n\n                                return ms * 1000;\n                            }\n\n                            /**\n                             * Used to grok the `now` parameter to createClock.\n                             */\n                            function getEpoch(epoch) {\n                                if (!epoch) { return 0; }\n                                if (typeof epoch.getTime === \"function\") { return epoch.getTime(); }\n                                if (typeof epoch === \"number\") { return epoch; }\n                                throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n                            }\n\n                            function inRange(from, to, timer) {\n                                return timer && timer.callAt >= from && timer.callAt <= to;\n                            }\n\n                            function mirrorDateProperties(target, source) {\n                                var prop;\n                                for (prop in source) {\n                                    if (source.hasOwnProperty(prop)) {\n                                        target[prop] = source[prop];\n                                    }\n                                }\n\n                                // set special now implementation\n                                if (source.now) {\n                                    target.now = function now() {\n                                        return target.clock.now;\n                                    };\n                                } else {\n                                    delete target.now;\n                                }\n\n                                // set special toSource implementation\n                                if (source.toSource) {\n                                    target.toSource = function toSource() {\n                                        return source.toSource();\n                                    };\n                                } else {\n                                    delete target.toSource;\n                                }\n\n                                // set special toString implementation\n                                target.toString = function toString() {\n                                    return source.toString();\n                                };\n\n                                target.prototype = source.prototype;\n                                target.parse = source.parse;\n                                target.UTC = source.UTC;\n                                target.prototype.toUTCString = source.prototype.toUTCString;\n\n                                return target;\n                            }\n\n                            function createDate() {\n                                function ClockDate(year, month, date, hour, minute, second, ms) {\n                                    // Defensive and verbose to avoid potential harm in passing\n                                    // explicit undefined when user does not pass argument\n                                    switch (arguments.length) {\n                                        case 0:\n                                            return new NativeDate(ClockDate.clock.now);\n                                        case 1:\n                                            return new NativeDate(year);\n                                        case 2:\n                                            return new NativeDate(year, month);\n                                        case 3:\n                                            return new NativeDate(year, month, date);\n                                        case 4:\n                                            return new NativeDate(year, month, date, hour);\n                                        case 5:\n                                            return new NativeDate(year, month, date, hour, minute);\n                                        case 6:\n                                            return new NativeDate(year, month, date, hour, minute, second);\n                                        default:\n                                            return new NativeDate(year, month, date, hour, minute, second, ms);\n                                    }\n                                }\n\n                                return mirrorDateProperties(ClockDate, NativeDate);\n                            }\n\n                            function addTimer(clock, timer) {\n                                if (timer.func === undefined) {\n                                    throw new Error(\"Callback must be provided to timer calls\");\n                                }\n\n                                if (!clock.timers) {\n                                    clock.timers = {};\n                                }\n\n                                timer.id = uniqueTimerId++;\n                                timer.createdAt = clock.now;\n                                timer.callAt = clock.now + (timer.delay || (clock.duringTick ? 1 : 0));\n\n                                clock.timers[timer.id] = timer;\n\n                                if (addTimerReturnsObject) {\n                                    return {\n                                        id: timer.id,\n                                        ref: NOOP,\n                                        unref: NOOP\n                                    };\n                                }\n\n                                return timer.id;\n                            }\n\n\n                            function compareTimers(a, b) {\n                                // Sort first by absolute timing\n                                if (a.callAt < b.callAt) {\n                                    return -1;\n                                }\n                                if (a.callAt > b.callAt) {\n                                    return 1;\n                                }\n\n                                // Sort next by immediate, immediate timers take precedence\n                                if (a.immediate && !b.immediate) {\n                                    return -1;\n                                }\n                                if (!a.immediate && b.immediate) {\n                                    return 1;\n                                }\n\n                                // Sort next by creation time, earlier-created timers take precedence\n                                if (a.createdAt < b.createdAt) {\n                                    return -1;\n                                }\n                                if (a.createdAt > b.createdAt) {\n                                    return 1;\n                                }\n\n                                // Sort next by id, lower-id timers take precedence\n                                if (a.id < b.id) {\n                                    return -1;\n                                }\n                                if (a.id > b.id) {\n                                    return 1;\n                                }\n\n                                // As timer ids are unique, no fallback `0` is necessary\n                            }\n\n                            function firstTimerInRange(clock, from, to) {\n                                var timers = clock.timers,\n                                    timer = null,\n                                    id,\n                                    isInRange;\n\n                                for (id in timers) {\n                                    if (timers.hasOwnProperty(id)) {\n                                        isInRange = inRange(from, to, timers[id]);\n\n                                        if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) {\n                                            timer = timers[id];\n                                        }\n                                    }\n                                }\n\n                                return timer;\n                            }\n\n                            function callTimer(clock, timer) {\n                                var exception;\n\n                                if (typeof timer.interval === \"number\") {\n                                    clock.timers[timer.id].callAt += timer.interval;\n                                } else {\n                                    delete clock.timers[timer.id];\n                                }\n\n                                try {\n                                    if (typeof timer.func === \"function\") {\n                                        timer.func.apply(null, timer.args);\n                                    } else {\n                                        eval(timer.func);\n                                    }\n                                } catch (e) {\n                                    exception = e;\n                                }\n\n                                if (!clock.timers[timer.id]) {\n                                    if (exception) {\n                                        throw exception;\n                                    }\n                                    return;\n                                }\n\n                                if (exception) {\n                                    throw exception;\n                                }\n                            }\n\n                            function timerType(timer) {\n                                if (timer.immediate) {\n                                    return \"Immediate\";\n                                } else if (typeof timer.interval !== \"undefined\") {\n                                    return \"Interval\";\n                                } else {\n                                    return \"Timeout\";\n                                }\n                            }\n\n                            function clearTimer(clock, timerId, ttype) {\n                                if (!timerId) {\n                                    // null appears to be allowed in most browsers, and appears to be\n                                    // relied upon by some libraries, like Bootstrap carousel\n                                    return;\n                                }\n\n                                if (!clock.timers) {\n                                    clock.timers = [];\n                                }\n\n                                // in Node, timerId is an object with .ref()/.unref(), and\n                                // its .id field is the actual timer id.\n                                if (typeof timerId === \"object\") {\n                                    timerId = timerId.id;\n                                }\n\n                                if (clock.timers.hasOwnProperty(timerId)) {\n                                    // check that the ID matches a timer of the correct type\n                                    var timer = clock.timers[timerId];\n                                    if (timerType(timer) === ttype) {\n                                        delete clock.timers[timerId];\n                                    } else {\n                                        throw new Error(\"Cannot clear timer: timer created with set\" + ttype + \"() but cleared with clear\" + timerType(timer) + \"()\");\n                                    }\n                                }\n                            }\n\n                            function uninstall(clock, target) {\n                                var method,\n                                    i,\n                                    l;\n\n                                for (i = 0, l = clock.methods.length; i < l; i++) {\n                                    method = clock.methods[i];\n\n                                    if (target[method].hadOwnProperty) {\n                                        target[method] = clock[\"_\" + method];\n                                    } else {\n                                        try {\n                                            delete target[method];\n                                        } catch (ignore) { }\n                                    }\n                                }\n\n                                // Prevent multiple executions which will completely remove these props\n                                clock.methods = [];\n                            }\n\n                            function hijackMethod(target, method, clock) {\n                                var prop;\n\n                                clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);\n                                clock[\"_\" + method] = target[method];\n\n                                if (method === \"Date\") {\n                                    var date = mirrorDateProperties(clock[method], target[method]);\n                                    target[method] = date;\n                                } else {\n                                    target[method] = function () {\n                                        return clock[method].apply(clock, arguments);\n                                    };\n\n                                    for (prop in clock[method]) {\n                                        if (clock[method].hasOwnProperty(prop)) {\n                                            target[method][prop] = clock[method][prop];\n                                        }\n                                    }\n                                }\n\n                                target[method].clock = clock;\n                            }\n\n                            var timers = {\n                                setTimeout: setTimeout,\n                                clearTimeout: clearTimeout,\n                                setImmediate: global.setImmediate,\n                                clearImmediate: global.clearImmediate,\n                                setInterval: setInterval,\n                                clearInterval: clearInterval,\n                                Date: Date\n                            };\n\n                            var keys = Object.keys || function (obj) {\n                                var ks = [],\n                                    key;\n\n                                for (key in obj) {\n                                    if (obj.hasOwnProperty(key)) {\n                                        ks.push(key);\n                                    }\n                                }\n\n                                return ks;\n                            };\n\n                            exports.timers = timers;\n\n                            function createClock(now) {\n                                var clock = {\n                                    now: getEpoch(now),\n                                    timeouts: {},\n                                    Date: createDate()\n                                };\n\n                                clock.Date.clock = clock;\n\n                                clock.setTimeout = function setTimeout(func, timeout) {\n                                    return addTimer(clock, {\n                                        func: func,\n                                        args: Array.prototype.slice.call(arguments, 2),\n                                        delay: timeout\n                                    });\n                                };\n\n                                clock.clearTimeout = function clearTimeout(timerId) {\n                                    return clearTimer(clock, timerId, \"Timeout\");\n                                };\n\n                                clock.setInterval = function setInterval(func, timeout) {\n                                    return addTimer(clock, {\n                                        func: func,\n                                        args: Array.prototype.slice.call(arguments, 2),\n                                        delay: timeout,\n                                        interval: timeout\n                                    });\n                                };\n\n                                clock.clearInterval = function clearInterval(timerId) {\n                                    return clearTimer(clock, timerId, \"Interval\");\n                                };\n\n                                clock.setImmediate = function setImmediate(func) {\n                                    return addTimer(clock, {\n                                        func: func,\n                                        args: Array.prototype.slice.call(arguments, 1),\n                                        immediate: true\n                                    });\n                                };\n\n                                clock.clearImmediate = function clearImmediate(timerId) {\n                                    return clearTimer(clock, timerId, \"Immediate\");\n                                };\n\n                                clock.tick = function tick(ms) {\n                                    ms = typeof ms === \"number\" ? ms : parseTime(ms);\n                                    var tickFrom = clock.now, tickTo = clock.now + ms, previous = clock.now;\n                                    var timer = firstTimerInRange(clock, tickFrom, tickTo);\n                                    var oldNow;\n\n                                    clock.duringTick = true;\n\n                                    var firstException;\n                                    while (timer && tickFrom <= tickTo) {\n                                        if (clock.timers[timer.id]) {\n                                            tickFrom = clock.now = timer.callAt;\n                                            try {\n                                                oldNow = clock.now;\n                                                callTimer(clock, timer);\n                                                // compensate for any setSystemTime() call during timer callback\n                                                if (oldNow !== clock.now) {\n                                                    tickFrom += clock.now - oldNow;\n                                                    tickTo += clock.now - oldNow;\n                                                    previous += clock.now - oldNow;\n                                                }\n                                            } catch (e) {\n                                                firstException = firstException || e;\n                                            }\n                                        }\n\n                                        timer = firstTimerInRange(clock, previous, tickTo);\n                                        previous = tickFrom;\n                                    }\n\n                                    clock.duringTick = false;\n                                    clock.now = tickTo;\n\n                                    if (firstException) {\n                                        throw firstException;\n                                    }\n\n                                    return clock.now;\n                                };\n\n                                clock.reset = function reset() {\n                                    clock.timers = {};\n                                };\n\n                                clock.setSystemTime = function setSystemTime(now) {\n                                    // determine time difference\n                                    var newNow = getEpoch(now);\n                                    var difference = newNow - clock.now;\n\n                                    // update 'system clock'\n                                    clock.now = newNow;\n\n                                    // update timers and intervals to keep them stable\n                                    for (var id in clock.timers) {\n                                        if (clock.timers.hasOwnProperty(id)) {\n                                            var timer = clock.timers[id];\n                                            timer.createdAt += difference;\n                                            timer.callAt += difference;\n                                        }\n                                    }\n                                };\n\n                                return clock;\n                            }\n                            exports.createClock = createClock;\n\n                            exports.install = function install(target, now, toFake) {\n                                var i,\n                                    l;\n\n                                if (typeof target === \"number\") {\n                                    toFake = now;\n                                    now = target;\n                                    target = null;\n                                }\n\n                                if (!target) {\n                                    target = global;\n                                }\n\n                                var clock = createClock(now);\n\n                                clock.uninstall = function () {\n                                    uninstall(clock, target);\n                                };\n\n                                clock.methods = toFake || [];\n\n                                if (clock.methods.length === 0) {\n                                    clock.methods = keys(timers);\n                                }\n\n                                for (i = 0, l = clock.methods.length; i < l; i++) {\n                                    hijackMethod(target, clock.methods[i], clock);\n                                }\n\n                                return clock;\n                            };\n\n                        }(global || this));\n\n                    }).call(this, typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n                }, {}]\n            }, {}, [1])(1)\n        });\n    })();\n    var define;\n    /**\n     * Sinon core utilities. For internal use only.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    var sinon = (function () {\n        \"use strict\";\n        // eslint-disable-line no-unused-vars\n\n        var sinonModule;\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            sinonModule = module.exports = require(\"./sinon/util/core\");\n            require(\"./sinon/extend\");\n            require(\"./sinon/walk\");\n            require(\"./sinon/typeOf\");\n            require(\"./sinon/times_in_words\");\n            require(\"./sinon/spy\");\n            require(\"./sinon/call\");\n            require(\"./sinon/behavior\");\n            require(\"./sinon/stub\");\n            require(\"./sinon/mock\");\n            require(\"./sinon/collection\");\n            require(\"./sinon/assert\");\n            require(\"./sinon/sandbox\");\n            require(\"./sinon/test\");\n            require(\"./sinon/test_case\");\n            require(\"./sinon/match\");\n            require(\"./sinon/format\");\n            require(\"./sinon/log_error\");\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n        } else if (isNode) {\n            loadDependencies(require, module.exports, module);\n            sinonModule = module.exports;\n        } else {\n            sinonModule = {};\n        }\n\n        return sinonModule;\n    }());\n\n    /**\n     * @depend ../../sinon.js\n     */\n    /**\n     * Sinon core utilities. For internal use only.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        var div = typeof document !== \"undefined\" && document.createElement(\"div\");\n        var hasOwn = Object.prototype.hasOwnProperty;\n\n        function isDOMNode(obj) {\n            var success = false;\n\n            try {\n                obj.appendChild(div);\n                success = div.parentNode === obj;\n            } catch (e) {\n                return false;\n            } finally {\n                try {\n                    obj.removeChild(div);\n                } catch (e) {\n                    // Remove failed, not much we can do about that\n                }\n            }\n\n            return success;\n        }\n\n        function isElement(obj) {\n            return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n        }\n\n        function isFunction(obj) {\n            return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n        }\n\n        function isReallyNaN(val) {\n            return typeof val === \"number\" && isNaN(val);\n        }\n\n        function mirrorProperties(target, source) {\n            for (var prop in source) {\n                if (!hasOwn.call(target, prop)) {\n                    target[prop] = source[prop];\n                }\n            }\n        }\n\n        function isRestorable(obj) {\n            return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n        }\n\n        // Cheap way to detect if we have ES5 support.\n        var hasES5Support = \"keys\" in Object;\n\n        function makeApi(sinon) {\n            sinon.wrapMethod = function wrapMethod(object, property, method) {\n                if (!object) {\n                    throw new TypeError(\"Should wrap property of object\");\n                }\n\n                if (typeof method !== \"function\" && typeof method !== \"object\") {\n                    throw new TypeError(\"Method wrapper should be a function or a property descriptor\");\n                }\n\n                function checkWrappedMethod(wrappedMethod) {\n                    var error;\n\n                    if (!isFunction(wrappedMethod)) {\n                        error = new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n                                            property + \" as function\");\n                    } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n                        error = new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n                    } else if (wrappedMethod.calledBefore) {\n                        var verb = wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n                        error = new TypeError(\"Attempted to wrap \" + property + \" which is already \" + verb);\n                    }\n\n                    if (error) {\n                        if (wrappedMethod && wrappedMethod.stackTrace) {\n                            error.stack += \"\\n--------------\\n\" + wrappedMethod.stackTrace;\n                        }\n                        throw error;\n                    }\n                }\n\n                var error, wrappedMethod, i;\n\n                // IE 8 does not support hasOwnProperty on the window object and Firefox has a problem\n                // when using hasOwn.call on objects from other frames.\n                var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);\n\n                if (hasES5Support) {\n                    var methodDesc = (typeof method === \"function\") ? { value: method } : method;\n                    var wrappedMethodDesc = sinon.getPropertyDescriptor(object, property);\n\n                    if (!wrappedMethodDesc) {\n                        error = new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n                                            property + \" as function\");\n                    } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {\n                        error = new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n                    }\n                    if (error) {\n                        if (wrappedMethodDesc && wrappedMethodDesc.stackTrace) {\n                            error.stack += \"\\n--------------\\n\" + wrappedMethodDesc.stackTrace;\n                        }\n                        throw error;\n                    }\n\n                    var types = sinon.objectKeys(methodDesc);\n                    for (i = 0; i < types.length; i++) {\n                        wrappedMethod = wrappedMethodDesc[types[i]];\n                        checkWrappedMethod(wrappedMethod);\n                    }\n\n                    mirrorProperties(methodDesc, wrappedMethodDesc);\n                    for (i = 0; i < types.length; i++) {\n                        mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);\n                    }\n                    Object.defineProperty(object, property, methodDesc);\n                } else {\n                    wrappedMethod = object[property];\n                    checkWrappedMethod(wrappedMethod);\n                    object[property] = method;\n                    method.displayName = property;\n                }\n\n                method.displayName = property;\n\n                // Set up a stack trace which can be used later to find what line of\n                // code the original method was created on.\n                method.stackTrace = (new Error(\"Stack Trace for original\")).stack;\n\n                method.restore = function () {\n                    // For prototype properties try to reset by delete first.\n                    // If this fails (ex: localStorage on mobile safari) then force a reset\n                    // via direct assignment.\n                    if (!owned) {\n                        // In some cases `delete` may throw an error\n                        try {\n                            delete object[property];\n                        } catch (e) { } // eslint-disable-line no-empty\n                        // For native code functions `delete` fails without throwing an error\n                        // on Chrome < 43, PhantomJS, etc.\n                    } else if (hasES5Support) {\n                        Object.defineProperty(object, property, wrappedMethodDesc);\n                    }\n\n                    // Use strict equality comparison to check failures then force a reset\n                    // via direct assignment.\n                    if (object[property] === method) {\n                        object[property] = wrappedMethod;\n                    }\n                };\n\n                method.restore.sinon = true;\n\n                if (!hasES5Support) {\n                    mirrorProperties(method, wrappedMethod);\n                }\n\n                return method;\n            };\n\n            sinon.create = function create(proto) {\n                var F = function () { };\n                F.prototype = proto;\n                return new F();\n            };\n\n            sinon.deepEqual = function deepEqual(a, b) {\n                if (sinon.match && sinon.match.isMatcher(a)) {\n                    return a.test(b);\n                }\n\n                if (typeof a !== \"object\" || typeof b !== \"object\") {\n                    return isReallyNaN(a) && isReallyNaN(b) || a === b;\n                }\n\n                if (isElement(a) || isElement(b)) {\n                    return a === b;\n                }\n\n                if (a === b) {\n                    return true;\n                }\n\n                if ((a === null && b !== null) || (a !== null && b === null)) {\n                    return false;\n                }\n\n                if (a instanceof RegExp && b instanceof RegExp) {\n                    return (a.source === b.source) && (a.global === b.global) &&\n                        (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);\n                }\n\n                var aString = Object.prototype.toString.call(a);\n                if (aString !== Object.prototype.toString.call(b)) {\n                    return false;\n                }\n\n                if (aString === \"[object Date]\") {\n                    return a.valueOf() === b.valueOf();\n                }\n\n                var prop;\n                var aLength = 0;\n                var bLength = 0;\n\n                if (aString === \"[object Array]\" && a.length !== b.length) {\n                    return false;\n                }\n\n                for (prop in a) {\n                    if (a.hasOwnProperty(prop)) {\n                        aLength += 1;\n\n                        if (!(prop in b)) {\n                            return false;\n                        }\n\n                        if (!deepEqual(a[prop], b[prop])) {\n                            return false;\n                        }\n                    }\n                }\n\n                for (prop in b) {\n                    if (b.hasOwnProperty(prop)) {\n                        bLength += 1;\n                    }\n                }\n\n                return aLength === bLength;\n            };\n\n            sinon.functionName = function functionName(func) {\n                var name = func.displayName || func.name;\n\n                // Use function decomposition as a last resort to get function\n                // name. Does not rely on function decomposition to work - if it\n                // doesn't debugging will be slightly less informative\n                // (i.e. toString will say 'spy' rather than 'myFunc').\n                if (!name) {\n                    var matches = func.toString().match(/function ([^\\s\\(]+)/);\n                    name = matches && matches[1];\n                }\n\n                return name;\n            };\n\n            sinon.functionToString = function toString() {\n                if (this.getCall && this.callCount) {\n                    var thisValue,\n                        prop;\n                    var i = this.callCount;\n\n                    while (i--) {\n                        thisValue = this.getCall(i).thisValue;\n\n                        for (prop in thisValue) {\n                            if (thisValue[prop] === this) {\n                                return prop;\n                            }\n                        }\n                    }\n                }\n\n                return this.displayName || \"sinon fake\";\n            };\n\n            sinon.objectKeys = function objectKeys(obj) {\n                if (obj !== Object(obj)) {\n                    throw new TypeError(\"sinon.objectKeys called on a non-object\");\n                }\n\n                var keys = [];\n                var key;\n                for (key in obj) {\n                    if (hasOwn.call(obj, key)) {\n                        keys.push(key);\n                    }\n                }\n\n                return keys;\n            };\n\n            sinon.getPropertyDescriptor = function getPropertyDescriptor(object, property) {\n                var proto = object;\n                var descriptor;\n\n                while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {\n                    proto = Object.getPrototypeOf(proto);\n                }\n                return descriptor;\n            };\n\n            sinon.getConfig = function (custom) {\n                var config = {};\n                custom = custom || {};\n                var defaults = sinon.defaultConfig;\n\n                for (var prop in defaults) {\n                    if (defaults.hasOwnProperty(prop)) {\n                        config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];\n                    }\n                }\n\n                return config;\n            };\n\n            sinon.defaultConfig = {\n                injectIntoThis: true,\n                injectInto: null,\n                properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n                useFakeTimers: true,\n                useFakeServer: true\n            };\n\n            sinon.timesInWords = function timesInWords(count) {\n                return count === 1 && \"once\" ||\n                    count === 2 && \"twice\" ||\n                    count === 3 && \"thrice\" ||\n                    (count || 0) + \" times\";\n            };\n\n            sinon.calledInOrder = function (spies) {\n                for (var i = 1, l = spies.length; i < l; i++) {\n                    if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {\n                        return false;\n                    }\n                }\n\n                return true;\n            };\n\n            sinon.orderByFirstCall = function (spies) {\n                return spies.sort(function (a, b) {\n                    // uuid, won't ever be equal\n                    var aCall = a.getCall(0);\n                    var bCall = b.getCall(0);\n                    var aId = aCall && aCall.callId || -1;\n                    var bId = bCall && bCall.callId || -1;\n\n                    return aId < bId ? -1 : 1;\n                });\n            };\n\n            sinon.createStubInstance = function (constructor) {\n                if (typeof constructor !== \"function\") {\n                    throw new TypeError(\"The constructor should be a function.\");\n                }\n                return sinon.stub(sinon.create(constructor.prototype));\n            };\n\n            sinon.restore = function (object) {\n                if (object !== null && typeof object === \"object\") {\n                    for (var prop in object) {\n                        if (isRestorable(object[prop])) {\n                            object[prop].restore();\n                        }\n                    }\n                } else if (isRestorable(object)) {\n                    object.restore();\n                }\n            };\n\n            return sinon;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports) {\n            makeApi(exports);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n\n            // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\n            var hasDontEnumBug = (function () {\n                var obj = {\n                    constructor: function () {\n                        return \"0\";\n                    },\n                    toString: function () {\n                        return \"1\";\n                    },\n                    valueOf: function () {\n                        return \"2\";\n                    },\n                    toLocaleString: function () {\n                        return \"3\";\n                    },\n                    prototype: function () {\n                        return \"4\";\n                    },\n                    isPrototypeOf: function () {\n                        return \"5\";\n                    },\n                    propertyIsEnumerable: function () {\n                        return \"6\";\n                    },\n                    hasOwnProperty: function () {\n                        return \"7\";\n                    },\n                    length: function () {\n                        return \"8\";\n                    },\n                    unique: function () {\n                        return \"9\";\n                    }\n                };\n\n                var result = [];\n                for (var prop in obj) {\n                    if (obj.hasOwnProperty(prop)) {\n                        result.push(obj[prop]());\n                    }\n                }\n                return result.join(\"\") !== \"0123456789\";\n            })();\n\n            /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will\n             *         override properties in previous sources.\n             *\n             * target - The Object to extend\n             * sources - Objects to copy properties from.\n             *\n             * Returns the extended target\n             */\n            function extend(target /*, sources */) {\n                var sources = Array.prototype.slice.call(arguments, 1);\n                var source, i, prop;\n\n                for (i = 0; i < sources.length; i++) {\n                    source = sources[i];\n\n                    for (prop in source) {\n                        if (source.hasOwnProperty(prop)) {\n                            target[prop] = source[prop];\n                        }\n                    }\n\n                    // Make sure we copy (own) toString method even when in JScript with DontEnum bug\n                    // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\n                    if (hasDontEnumBug && source.hasOwnProperty(\"toString\") && source.toString !== target.toString) {\n                        target.toString = source.toString;\n                    }\n                }\n\n                return target;\n            }\n\n            sinon.extend = extend;\n            return sinon.extend;\n        }\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            module.exports = makeApi(sinon);\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n\n            function timesInWords(count) {\n                switch (count) {\n                    case 1:\n                        return \"once\";\n                    case 2:\n                        return \"twice\";\n                    case 3:\n                        return \"thrice\";\n                    default:\n                        return (count || 0) + \" times\";\n                }\n            }\n\n            sinon.timesInWords = timesInWords;\n            return sinon.timesInWords;\n        }\n\n        function loadDependencies(require, exports, module) {\n            var core = require(\"./util/core\");\n            module.exports = makeApi(core);\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     */\n    /**\n     * Format functions\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2014 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            function typeOf(value) {\n                if (value === null) {\n                    return \"null\";\n                } else if (value === undefined) {\n                    return \"undefined\";\n                }\n                var string = Object.prototype.toString.call(value);\n                return string.substring(8, string.length - 1).toLowerCase();\n            }\n\n            sinon.typeOf = typeOf;\n            return sinon.typeOf;\n        }\n\n        function loadDependencies(require, exports, module) {\n            var core = require(\"./util/core\");\n            module.exports = makeApi(core);\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     * @depend typeOf.js\n     */\n    /*jslint eqeqeq: false, onevar: false, plusplus: false*/\n    /*global module, require, sinon*/\n    /**\n     * Match functions\n     *\n     * @author Maximilian Antoni (mail@maxantoni.de)\n     * @license BSD\n     *\n     * Copyright (c) 2012 Maximilian Antoni\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            function assertType(value, type, name) {\n                var actual = sinon.typeOf(value);\n                if (actual !== type) {\n                    throw new TypeError(\"Expected type of \" + name + \" to be \" +\n                        type + \", but was \" + actual);\n                }\n            }\n\n            var matcher = {\n                toString: function () {\n                    return this.message;\n                }\n            };\n\n            function isMatcher(object) {\n                return matcher.isPrototypeOf(object);\n            }\n\n            function matchObject(expectation, actual) {\n                if (actual === null || actual === undefined) {\n                    return false;\n                }\n                for (var key in expectation) {\n                    if (expectation.hasOwnProperty(key)) {\n                        var exp = expectation[key];\n                        var act = actual[key];\n                        if (isMatcher(exp)) {\n                            if (!exp.test(act)) {\n                                return false;\n                            }\n                        } else if (sinon.typeOf(exp) === \"object\") {\n                            if (!matchObject(exp, act)) {\n                                return false;\n                            }\n                        } else if (!sinon.deepEqual(exp, act)) {\n                            return false;\n                        }\n                    }\n                }\n                return true;\n            }\n\n            function match(expectation, message) {\n                var m = sinon.create(matcher);\n                var type = sinon.typeOf(expectation);\n                switch (type) {\n                    case \"object\":\n                        if (typeof expectation.test === \"function\") {\n                            m.test = function (actual) {\n                                return expectation.test(actual) === true;\n                            };\n                            m.message = \"match(\" + sinon.functionName(expectation.test) + \")\";\n                            return m;\n                        }\n                        var str = [];\n                        for (var key in expectation) {\n                            if (expectation.hasOwnProperty(key)) {\n                                str.push(key + \": \" + expectation[key]);\n                            }\n                        }\n                        m.test = function (actual) {\n                            return matchObject(expectation, actual);\n                        };\n                        m.message = \"match(\" + str.join(\", \") + \")\";\n                        break;\n                    case \"number\":\n                        m.test = function (actual) {\n                            // we need type coercion here\n                            return expectation == actual; // eslint-disable-line eqeqeq\n                        };\n                        break;\n                    case \"string\":\n                        m.test = function (actual) {\n                            if (typeof actual !== \"string\") {\n                                return false;\n                            }\n                            return actual.indexOf(expectation) !== -1;\n                        };\n                        m.message = \"match(\\\"\" + expectation + \"\\\")\";\n                        break;\n                    case \"regexp\":\n                        m.test = function (actual) {\n                            if (typeof actual !== \"string\") {\n                                return false;\n                            }\n                            return expectation.test(actual);\n                        };\n                        break;\n                    case \"function\":\n                        m.test = expectation;\n                        if (message) {\n                            m.message = message;\n                        } else {\n                            m.message = \"match(\" + sinon.functionName(expectation) + \")\";\n                        }\n                        break;\n                    default:\n                        m.test = function (actual) {\n                            return sinon.deepEqual(expectation, actual);\n                        };\n                }\n                if (!m.message) {\n                    m.message = \"match(\" + expectation + \")\";\n                }\n                return m;\n            }\n\n            matcher.or = function (m2) {\n                if (!arguments.length) {\n                    throw new TypeError(\"Matcher expected\");\n                } else if (!isMatcher(m2)) {\n                    m2 = match(m2);\n                }\n                var m1 = this;\n                var or = sinon.create(matcher);\n                or.test = function (actual) {\n                    return m1.test(actual) || m2.test(actual);\n                };\n                or.message = m1.message + \".or(\" + m2.message + \")\";\n                return or;\n            };\n\n            matcher.and = function (m2) {\n                if (!arguments.length) {\n                    throw new TypeError(\"Matcher expected\");\n                } else if (!isMatcher(m2)) {\n                    m2 = match(m2);\n                }\n                var m1 = this;\n                var and = sinon.create(matcher);\n                and.test = function (actual) {\n                    return m1.test(actual) && m2.test(actual);\n                };\n                and.message = m1.message + \".and(\" + m2.message + \")\";\n                return and;\n            };\n\n            match.isMatcher = isMatcher;\n\n            match.any = match(function () {\n                return true;\n            }, \"any\");\n\n            match.defined = match(function (actual) {\n                return actual !== null && actual !== undefined;\n            }, \"defined\");\n\n            match.truthy = match(function (actual) {\n                return !!actual;\n            }, \"truthy\");\n\n            match.falsy = match(function (actual) {\n                return !actual;\n            }, \"falsy\");\n\n            match.same = function (expectation) {\n                return match(function (actual) {\n                    return expectation === actual;\n                }, \"same(\" + expectation + \")\");\n            };\n\n            match.typeOf = function (type) {\n                assertType(type, \"string\", \"type\");\n                return match(function (actual) {\n                    return sinon.typeOf(actual) === type;\n                }, \"typeOf(\\\"\" + type + \"\\\")\");\n            };\n\n            match.instanceOf = function (type) {\n                assertType(type, \"function\", \"type\");\n                return match(function (actual) {\n                    return actual instanceof type;\n                }, \"instanceOf(\" + sinon.functionName(type) + \")\");\n            };\n\n            function createPropertyMatcher(propertyTest, messagePrefix) {\n                return function (property, value) {\n                    assertType(property, \"string\", \"property\");\n                    var onlyProperty = arguments.length === 1;\n                    var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n                    if (!onlyProperty) {\n                        message += \", \" + value;\n                    }\n                    message += \")\";\n                    return match(function (actual) {\n                        if (actual === undefined || actual === null ||\n                                !propertyTest(actual, property)) {\n                            return false;\n                        }\n                        return onlyProperty || sinon.deepEqual(value, actual[property]);\n                    }, message);\n                };\n            }\n\n            match.has = createPropertyMatcher(function (actual, property) {\n                if (typeof actual === \"object\") {\n                    return property in actual;\n                }\n                return actual[property] !== undefined;\n            }, \"has\");\n\n            match.hasOwn = createPropertyMatcher(function (actual, property) {\n                return actual.hasOwnProperty(property);\n            }, \"hasOwn\");\n\n            match.bool = match.typeOf(\"boolean\");\n            match.number = match.typeOf(\"number\");\n            match.string = match.typeOf(\"string\");\n            match.object = match.typeOf(\"object\");\n            match.func = match.typeOf(\"function\");\n            match.array = match.typeOf(\"array\");\n            match.regexp = match.typeOf(\"regexp\");\n            match.date = match.typeOf(\"date\");\n\n            sinon.match = match;\n            return match;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            require(\"./typeOf\");\n            module.exports = makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     */\n    /**\n     * Format functions\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2014 Christian Johansen\n     */\n    (function (sinonGlobal, formatio) {\n\n        function makeApi(sinon) {\n            function valueFormatter(value) {\n                return \"\" + value;\n            }\n\n            function getFormatioFormatter() {\n                var formatter = formatio.configure({\n                    quoteStrings: false,\n                    limitChildrenCount: 250\n                });\n\n                function format() {\n                    return formatter.ascii.apply(formatter, arguments);\n                }\n\n                return format;\n            }\n\n            function getNodeFormatter() {\n                try {\n                    var util = require(\"util\");\n                } catch (e) {\n                    /* Node, but no util module - would be very old, but better safe than sorry */\n                }\n\n                function format(v) {\n                    var isObjectWithNativeToString = typeof v === \"object\" && v.toString === Object.prototype.toString;\n                    return isObjectWithNativeToString ? util.inspect(v) : v;\n                }\n\n                return util ? format : valueFormatter;\n            }\n\n            var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n            var formatter;\n\n            if (isNode) {\n                try {\n                    formatio = require(\"formatio\");\n                }\n                catch (e) { } // eslint-disable-line no-empty\n            }\n\n            if (formatio) {\n                formatter = getFormatioFormatter();\n            } else if (isNode) {\n                formatter = getNodeFormatter();\n            } else {\n                formatter = valueFormatter;\n            }\n\n            sinon.format = formatter;\n            return sinon.format;\n        }\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            module.exports = makeApi(sinon);\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon, // eslint-disable-line no-undef\n        typeof formatio === \"object\" && formatio // eslint-disable-line no-undef\n    ));\n\n    /**\n      * @depend util/core.js\n      * @depend match.js\n      * @depend format.js\n      */\n    /**\n      * Spy calls\n      *\n      * @author Christian Johansen (christian@cjohansen.no)\n      * @author Maximilian Antoni (mail@maxantoni.de)\n      * @license BSD\n      *\n      * Copyright (c) 2010-2013 Christian Johansen\n      * Copyright (c) 2013 Maximilian Antoni\n      */\n    (function (sinonGlobal) {\n\n        var slice = Array.prototype.slice;\n\n        function makeApi(sinon) {\n            function throwYieldError(proxy, text, args) {\n                var msg = sinon.functionName(proxy) + text;\n                if (args.length) {\n                    msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n                }\n                throw new Error(msg);\n            }\n\n            var callProto = {\n                calledOn: function calledOn(thisValue) {\n                    if (sinon.match && sinon.match.isMatcher(thisValue)) {\n                        return thisValue.test(this.thisValue);\n                    }\n                    return this.thisValue === thisValue;\n                },\n\n                calledWith: function calledWith() {\n                    var l = arguments.length;\n                    if (l > this.args.length) {\n                        return false;\n                    }\n                    for (var i = 0; i < l; i += 1) {\n                        if (!sinon.deepEqual(arguments[i], this.args[i])) {\n                            return false;\n                        }\n                    }\n\n                    return true;\n                },\n\n                calledWithMatch: function calledWithMatch() {\n                    var l = arguments.length;\n                    if (l > this.args.length) {\n                        return false;\n                    }\n                    for (var i = 0; i < l; i += 1) {\n                        var actual = this.args[i];\n                        var expectation = arguments[i];\n                        if (!sinon.match || !sinon.match(expectation).test(actual)) {\n                            return false;\n                        }\n                    }\n                    return true;\n                },\n\n                calledWithExactly: function calledWithExactly() {\n                    return arguments.length === this.args.length &&\n                        this.calledWith.apply(this, arguments);\n                },\n\n                notCalledWith: function notCalledWith() {\n                    return !this.calledWith.apply(this, arguments);\n                },\n\n                notCalledWithMatch: function notCalledWithMatch() {\n                    return !this.calledWithMatch.apply(this, arguments);\n                },\n\n                returned: function returned(value) {\n                    return sinon.deepEqual(value, this.returnValue);\n                },\n\n                threw: function threw(error) {\n                    if (typeof error === \"undefined\" || !this.exception) {\n                        return !!this.exception;\n                    }\n\n                    return this.exception === error || this.exception.name === error;\n                },\n\n                calledWithNew: function calledWithNew() {\n                    return this.proxy.prototype && this.thisValue instanceof this.proxy;\n                },\n\n                calledBefore: function (other) {\n                    return this.callId < other.callId;\n                },\n\n                calledAfter: function (other) {\n                    return this.callId > other.callId;\n                },\n\n                callArg: function (pos) {\n                    this.args[pos]();\n                },\n\n                callArgOn: function (pos, thisValue) {\n                    this.args[pos].apply(thisValue);\n                },\n\n                callArgWith: function (pos) {\n                    this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n                },\n\n                callArgOnWith: function (pos, thisValue) {\n                    var args = slice.call(arguments, 2);\n                    this.args[pos].apply(thisValue, args);\n                },\n\n                \"yield\": function () {\n                    this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n                },\n\n                yieldOn: function (thisValue) {\n                    var args = this.args;\n                    for (var i = 0, l = args.length; i < l; ++i) {\n                        if (typeof args[i] === \"function\") {\n                            args[i].apply(thisValue, slice.call(arguments, 1));\n                            return;\n                        }\n                    }\n                    throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n                },\n\n                yieldTo: function (prop) {\n                    this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n                },\n\n                yieldToOn: function (prop, thisValue) {\n                    var args = this.args;\n                    for (var i = 0, l = args.length; i < l; ++i) {\n                        if (args[i] && typeof args[i][prop] === \"function\") {\n                            args[i][prop].apply(thisValue, slice.call(arguments, 2));\n                            return;\n                        }\n                    }\n                    throwYieldError(this.proxy, \" cannot yield to '\" + prop +\n                        \"' since no callback was passed.\", args);\n                },\n\n                getStackFrames: function () {\n                    // Omit the error message and the two top stack frames in sinon itself:\n                    return this.stack && this.stack.split(\"\\n\").slice(3);\n                },\n\n                toString: function () {\n                    var callStr = this.proxy.toString() + \"(\";\n                    var args = [];\n\n                    for (var i = 0, l = this.args.length; i < l; ++i) {\n                        args.push(sinon.format(this.args[i]));\n                    }\n\n                    callStr = callStr + args.join(\", \") + \")\";\n\n                    if (typeof this.returnValue !== \"undefined\") {\n                        callStr += \" => \" + sinon.format(this.returnValue);\n                    }\n\n                    if (this.exception) {\n                        callStr += \" !\" + this.exception.name;\n\n                        if (this.exception.message) {\n                            callStr += \"(\" + this.exception.message + \")\";\n                        }\n                    }\n                    if (this.stack) {\n                        callStr += this.getStackFrames()[0].replace(/^\\s*(?:at\\s+|@)?/, \" at \");\n\n                    }\n\n                    return callStr;\n                }\n            };\n\n            callProto.invokeCallback = callProto.yield;\n\n            function createSpyCall(spy, thisValue, args, returnValue, exception, id, stack) {\n                if (typeof id !== \"number\") {\n                    throw new TypeError(\"Call id is not a number\");\n                }\n                var proxyCall = sinon.create(callProto);\n                proxyCall.proxy = spy;\n                proxyCall.thisValue = thisValue;\n                proxyCall.args = args;\n                proxyCall.returnValue = returnValue;\n                proxyCall.exception = exception;\n                proxyCall.callId = id;\n                proxyCall.stack = stack;\n\n                return proxyCall;\n            }\n            createSpyCall.toString = callProto.toString; // used by mocks\n\n            sinon.spyCall = createSpyCall;\n            return createSpyCall;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            require(\"./match\");\n            require(\"./format\");\n            module.exports = makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n      * @depend times_in_words.js\n      * @depend util/core.js\n      * @depend extend.js\n      * @depend call.js\n      * @depend format.js\n      */\n    /**\n      * Spy functions\n      *\n      * @author Christian Johansen (christian@cjohansen.no)\n      * @license BSD\n      *\n      * Copyright (c) 2010-2013 Christian Johansen\n      */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            var push = Array.prototype.push;\n            var slice = Array.prototype.slice;\n            var callId = 0;\n\n            function spy(object, property, types) {\n                if (!property && typeof object === \"function\") {\n                    return spy.create(object);\n                }\n\n                if (!object && !property) {\n                    return spy.create(function () { });\n                }\n\n                if (types) {\n                    var methodDesc = sinon.getPropertyDescriptor(object, property);\n                    for (var i = 0; i < types.length; i++) {\n                        methodDesc[types[i]] = spy.create(methodDesc[types[i]]);\n                    }\n                    return sinon.wrapMethod(object, property, methodDesc);\n                }\n\n                return sinon.wrapMethod(object, property, spy.create(object[property]));\n            }\n\n            function matchingFake(fakes, args, strict) {\n                if (!fakes) {\n                    return undefined;\n                }\n\n                for (var i = 0, l = fakes.length; i < l; i++) {\n                    if (fakes[i].matches(args, strict)) {\n                        return fakes[i];\n                    }\n                }\n            }\n\n            function incrementCallCount() {\n                this.called = true;\n                this.callCount += 1;\n                this.notCalled = false;\n                this.calledOnce = this.callCount === 1;\n                this.calledTwice = this.callCount === 2;\n                this.calledThrice = this.callCount === 3;\n            }\n\n            function createCallProperties() {\n                this.firstCall = this.getCall(0);\n                this.secondCall = this.getCall(1);\n                this.thirdCall = this.getCall(2);\n                this.lastCall = this.getCall(this.callCount - 1);\n            }\n\n            var vars = \"a,b,c,d,e,f,g,h,i,j,k,l\";\n            function createProxy(func, proxyLength) {\n                // Retain the function length:\n                var p;\n                if (proxyLength) {\n                    eval(\"p = (function proxy(\" + vars.substring(0, proxyLength * 2 - 1) + // eslint-disable-line no-eval\n                        \") { return p.invoke(func, this, slice.call(arguments)); });\");\n                } else {\n                    p = function proxy() {\n                        return p.invoke(func, this, slice.call(arguments));\n                    };\n                }\n                p.isSinonProxy = true;\n                return p;\n            }\n\n            var uuid = 0;\n\n            // Public API\n            var spyApi = {\n                reset: function () {\n                    if (this.invoking) {\n                        var err = new Error(\"Cannot reset Sinon function while invoking it. \" +\n                                            \"Move the call to .reset outside of the callback.\");\n                        err.name = \"InvalidResetException\";\n                        throw err;\n                    }\n\n                    this.called = false;\n                    this.notCalled = true;\n                    this.calledOnce = false;\n                    this.calledTwice = false;\n                    this.calledThrice = false;\n                    this.callCount = 0;\n                    this.firstCall = null;\n                    this.secondCall = null;\n                    this.thirdCall = null;\n                    this.lastCall = null;\n                    this.args = [];\n                    this.returnValues = [];\n                    this.thisValues = [];\n                    this.exceptions = [];\n                    this.callIds = [];\n                    this.stacks = [];\n                    if (this.fakes) {\n                        for (var i = 0; i < this.fakes.length; i++) {\n                            this.fakes[i].reset();\n                        }\n                    }\n\n                    return this;\n                },\n\n                create: function create(func, spyLength) {\n                    var name;\n\n                    if (typeof func !== \"function\") {\n                        func = function () { };\n                    } else {\n                        name = sinon.functionName(func);\n                    }\n\n                    if (!spyLength) {\n                        spyLength = func.length;\n                    }\n\n                    var proxy = createProxy(func, spyLength);\n\n                    sinon.extend(proxy, spy);\n                    delete proxy.create;\n                    sinon.extend(proxy, func);\n\n                    proxy.reset();\n                    proxy.prototype = func.prototype;\n                    proxy.displayName = name || \"spy\";\n                    proxy.toString = sinon.functionToString;\n                    proxy.instantiateFake = sinon.spy.create;\n                    proxy.id = \"spy#\" + uuid++;\n\n                    return proxy;\n                },\n\n                invoke: function invoke(func, thisValue, args) {\n                    var matching = matchingFake(this.fakes, args);\n                    var exception, returnValue;\n\n                    incrementCallCount.call(this);\n                    push.call(this.thisValues, thisValue);\n                    push.call(this.args, args);\n                    push.call(this.callIds, callId++);\n\n                    // Make call properties available from within the spied function:\n                    createCallProperties.call(this);\n\n                    try {\n                        this.invoking = true;\n\n                        if (matching) {\n                            returnValue = matching.invoke(func, thisValue, args);\n                        } else {\n                            returnValue = (this.func || func).apply(thisValue, args);\n                        }\n\n                        var thisCall = this.getCall(this.callCount - 1);\n                        if (thisCall.calledWithNew() && typeof returnValue !== \"object\") {\n                            returnValue = thisValue;\n                        }\n                    } catch (e) {\n                        exception = e;\n                    } finally {\n                        delete this.invoking;\n                    }\n\n                    push.call(this.exceptions, exception);\n                    push.call(this.returnValues, returnValue);\n                    push.call(this.stacks, new Error().stack);\n\n                    // Make return value and exception available in the calls:\n                    createCallProperties.call(this);\n\n                    if (exception !== undefined) {\n                        throw exception;\n                    }\n\n                    return returnValue;\n                },\n\n                named: function named(name) {\n                    this.displayName = name;\n                    return this;\n                },\n\n                getCall: function getCall(i) {\n                    if (i < 0 || i >= this.callCount) {\n                        return null;\n                    }\n\n                    return sinon.spyCall(this, this.thisValues[i], this.args[i],\n                                            this.returnValues[i], this.exceptions[i],\n                                            this.callIds[i], this.stacks[i]);\n                },\n\n                getCalls: function () {\n                    var calls = [];\n                    var i;\n\n                    for (i = 0; i < this.callCount; i++) {\n                        calls.push(this.getCall(i));\n                    }\n\n                    return calls;\n                },\n\n                calledBefore: function calledBefore(spyFn) {\n                    if (!this.called) {\n                        return false;\n                    }\n\n                    if (!spyFn.called) {\n                        return true;\n                    }\n\n                    return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n                },\n\n                calledAfter: function calledAfter(spyFn) {\n                    if (!this.called || !spyFn.called) {\n                        return false;\n                    }\n\n                    return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];\n                },\n\n                withArgs: function () {\n                    var args = slice.call(arguments);\n\n                    if (this.fakes) {\n                        var match = matchingFake(this.fakes, args, true);\n\n                        if (match) {\n                            return match;\n                        }\n                    } else {\n                        this.fakes = [];\n                    }\n\n                    var original = this;\n                    var fake = this.instantiateFake();\n                    fake.matchingAguments = args;\n                    fake.parent = this;\n                    push.call(this.fakes, fake);\n\n                    fake.withArgs = function () {\n                        return original.withArgs.apply(original, arguments);\n                    };\n\n                    for (var i = 0; i < this.args.length; i++) {\n                        if (fake.matches(this.args[i])) {\n                            incrementCallCount.call(fake);\n                            push.call(fake.thisValues, this.thisValues[i]);\n                            push.call(fake.args, this.args[i]);\n                            push.call(fake.returnValues, this.returnValues[i]);\n                            push.call(fake.exceptions, this.exceptions[i]);\n                            push.call(fake.callIds, this.callIds[i]);\n                        }\n                    }\n                    createCallProperties.call(fake);\n\n                    return fake;\n                },\n\n                matches: function (args, strict) {\n                    var margs = this.matchingAguments;\n\n                    if (margs.length <= args.length &&\n                        sinon.deepEqual(margs, args.slice(0, margs.length))) {\n                        return !strict || margs.length === args.length;\n                    }\n                },\n\n                printf: function (format) {\n                    var spyInstance = this;\n                    var args = slice.call(arguments, 1);\n                    var formatter;\n\n                    return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n                        formatter = spyApi.formatters[specifyer];\n\n                        if (typeof formatter === \"function\") {\n                            return formatter.call(null, spyInstance, args);\n                        } else if (!isNaN(parseInt(specifyer, 10))) {\n                            return sinon.format(args[specifyer - 1]);\n                        }\n\n                        return \"%\" + specifyer;\n                    });\n                }\n            };\n\n            function delegateToCalls(method, matchAny, actual, notCalled) {\n                spyApi[method] = function () {\n                    if (!this.called) {\n                        if (notCalled) {\n                            return notCalled.apply(this, arguments);\n                        }\n                        return false;\n                    }\n\n                    var currentCall;\n                    var matches = 0;\n\n                    for (var i = 0, l = this.callCount; i < l; i += 1) {\n                        currentCall = this.getCall(i);\n\n                        if (currentCall[actual || method].apply(currentCall, arguments)) {\n                            matches += 1;\n\n                            if (matchAny) {\n                                return true;\n                            }\n                        }\n                    }\n\n                    return matches === this.callCount;\n                };\n            }\n\n            delegateToCalls(\"calledOn\", true);\n            delegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\n            delegateToCalls(\"calledWith\", true);\n            delegateToCalls(\"calledWithMatch\", true);\n            delegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\n            delegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\n            delegateToCalls(\"calledWithExactly\", true);\n            delegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\n            delegateToCalls(\"neverCalledWith\", false, \"notCalledWith\", function () {\n                return true;\n            });\n            delegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\", function () {\n                return true;\n            });\n            delegateToCalls(\"threw\", true);\n            delegateToCalls(\"alwaysThrew\", false, \"threw\");\n            delegateToCalls(\"returned\", true);\n            delegateToCalls(\"alwaysReturned\", false, \"returned\");\n            delegateToCalls(\"calledWithNew\", true);\n            delegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n            delegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n                throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n            });\n            spyApi.callArgWith = spyApi.callArg;\n            delegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n                throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n            });\n            spyApi.callArgOnWith = spyApi.callArgOn;\n            delegateToCalls(\"yield\", false, \"yield\", function () {\n                throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n            });\n            // \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\n            spyApi.invokeCallback = spyApi.yield;\n            delegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n                throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n            });\n            delegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n                throw new Error(this.toString() + \" cannot yield to '\" + property +\n                    \"' since it was not yet invoked.\");\n            });\n            delegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n                throw new Error(this.toString() + \" cannot yield to '\" + property +\n                    \"' since it was not yet invoked.\");\n            });\n\n            spyApi.formatters = {\n                c: function (spyInstance) {\n                    return sinon.timesInWords(spyInstance.callCount);\n                },\n\n                n: function (spyInstance) {\n                    return spyInstance.toString();\n                },\n\n                C: function (spyInstance) {\n                    var calls = [];\n\n                    for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n                        var stringifiedCall = \"    \" + spyInstance.getCall(i).toString();\n                        if (/\\n/.test(calls[i - 1])) {\n                            stringifiedCall = \"\\n\" + stringifiedCall;\n                        }\n                        push.call(calls, stringifiedCall);\n                    }\n\n                    return calls.length > 0 ? \"\\n\" + calls.join(\"\\n\") : \"\";\n                },\n\n                t: function (spyInstance) {\n                    var objects = [];\n\n                    for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n                        push.call(objects, sinon.format(spyInstance.thisValues[i]));\n                    }\n\n                    return objects.join(\", \");\n                },\n\n                \"*\": function (spyInstance, args) {\n                    var formatted = [];\n\n                    for (var i = 0, l = args.length; i < l; ++i) {\n                        push.call(formatted, sinon.format(args[i]));\n                    }\n\n                    return formatted.join(\", \");\n                }\n            };\n\n            sinon.extend(spy, spyApi);\n\n            spy.spyCall = sinon.spyCall;\n            sinon.spy = spy;\n\n            return spy;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var core = require(\"./util/core\");\n            require(\"./call\");\n            require(\"./extend\");\n            require(\"./times_in_words\");\n            require(\"./format\");\n            module.exports = makeApi(core);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     * @depend extend.js\n     */\n    /**\n     * Stub behavior\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @author Tim Fischbach (mail@timfischbach.de)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        var slice = Array.prototype.slice;\n        var join = Array.prototype.join;\n        var useLeftMostCallback = -1;\n        var useRightMostCallback = -2;\n\n        var nextTick = (function () {\n            if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n                return process.nextTick;\n            }\n\n            if (typeof setImmediate === \"function\") {\n                return setImmediate;\n            }\n\n            return function (callback) {\n                setTimeout(callback, 0);\n            };\n        })();\n\n        function throwsException(error, message) {\n            if (typeof error === \"string\") {\n                this.exception = new Error(message || \"\");\n                this.exception.name = error;\n            } else if (!error) {\n                this.exception = new Error(\"Error\");\n            } else {\n                this.exception = error;\n            }\n\n            return this;\n        }\n\n        function getCallback(behavior, args) {\n            var callArgAt = behavior.callArgAt;\n\n            if (callArgAt >= 0) {\n                return args[callArgAt];\n            }\n\n            var argumentList;\n\n            if (callArgAt === useLeftMostCallback) {\n                argumentList = args;\n            }\n\n            if (callArgAt === useRightMostCallback) {\n                argumentList = slice.call(args).reverse();\n            }\n\n            var callArgProp = behavior.callArgProp;\n\n            for (var i = 0, l = argumentList.length; i < l; ++i) {\n                if (!callArgProp && typeof argumentList[i] === \"function\") {\n                    return argumentList[i];\n                }\n\n                if (callArgProp && argumentList[i] &&\n                    typeof argumentList[i][callArgProp] === \"function\") {\n                    return argumentList[i][callArgProp];\n                }\n            }\n\n            return null;\n        }\n\n        function makeApi(sinon) {\n            function getCallbackError(behavior, func, args) {\n                if (behavior.callArgAt < 0) {\n                    var msg;\n\n                    if (behavior.callArgProp) {\n                        msg = sinon.functionName(behavior.stub) +\n                            \" expected to yield to '\" + behavior.callArgProp +\n                            \"', but no object with such a property was passed.\";\n                    } else {\n                        msg = sinon.functionName(behavior.stub) +\n                            \" expected to yield, but no callback was passed.\";\n                    }\n\n                    if (args.length > 0) {\n                        msg += \" Received [\" + join.call(args, \", \") + \"]\";\n                    }\n\n                    return msg;\n                }\n\n                return \"argument at index \" + behavior.callArgAt + \" is not a function: \" + func;\n            }\n\n            function callCallback(behavior, args) {\n                if (typeof behavior.callArgAt === \"number\") {\n                    var func = getCallback(behavior, args);\n\n                    if (typeof func !== \"function\") {\n                        throw new TypeError(getCallbackError(behavior, func, args));\n                    }\n\n                    if (behavior.callbackAsync) {\n                        nextTick(function () {\n                            func.apply(behavior.callbackContext, behavior.callbackArguments);\n                        });\n                    } else {\n                        func.apply(behavior.callbackContext, behavior.callbackArguments);\n                    }\n                }\n            }\n\n            var proto = {\n                create: function create(stub) {\n                    var behavior = sinon.extend({}, sinon.behavior);\n                    delete behavior.create;\n                    behavior.stub = stub;\n\n                    return behavior;\n                },\n\n                isPresent: function isPresent() {\n                    return (typeof this.callArgAt === \"number\" ||\n                            this.exception ||\n                            typeof this.returnArgAt === \"number\" ||\n                            this.returnThis ||\n                            this.returnValueDefined);\n                },\n\n                invoke: function invoke(context, args) {\n                    callCallback(this, args);\n\n                    if (this.exception) {\n                        throw this.exception;\n                    } else if (typeof this.returnArgAt === \"number\") {\n                        return args[this.returnArgAt];\n                    } else if (this.returnThis) {\n                        return context;\n                    }\n\n                    return this.returnValue;\n                },\n\n                onCall: function onCall(index) {\n                    return this.stub.onCall(index);\n                },\n\n                onFirstCall: function onFirstCall() {\n                    return this.stub.onFirstCall();\n                },\n\n                onSecondCall: function onSecondCall() {\n                    return this.stub.onSecondCall();\n                },\n\n                onThirdCall: function onThirdCall() {\n                    return this.stub.onThirdCall();\n                },\n\n                withArgs: function withArgs(/* arguments */) {\n                    throw new Error(\n                        \"Defining a stub by invoking \\\"stub.onCall(...).withArgs(...)\\\" \" +\n                        \"is not supported. Use \\\"stub.withArgs(...).onCall(...)\\\" \" +\n                        \"to define sequential behavior for calls with certain arguments.\"\n                    );\n                },\n\n                callsArg: function callsArg(pos) {\n                    if (typeof pos !== \"number\") {\n                        throw new TypeError(\"argument index is not number\");\n                    }\n\n                    this.callArgAt = pos;\n                    this.callbackArguments = [];\n                    this.callbackContext = undefined;\n                    this.callArgProp = undefined;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                callsArgOn: function callsArgOn(pos, context) {\n                    if (typeof pos !== \"number\") {\n                        throw new TypeError(\"argument index is not number\");\n                    }\n                    if (typeof context !== \"object\") {\n                        throw new TypeError(\"argument context is not an object\");\n                    }\n\n                    this.callArgAt = pos;\n                    this.callbackArguments = [];\n                    this.callbackContext = context;\n                    this.callArgProp = undefined;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                callsArgWith: function callsArgWith(pos) {\n                    if (typeof pos !== \"number\") {\n                        throw new TypeError(\"argument index is not number\");\n                    }\n\n                    this.callArgAt = pos;\n                    this.callbackArguments = slice.call(arguments, 1);\n                    this.callbackContext = undefined;\n                    this.callArgProp = undefined;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                callsArgOnWith: function callsArgWith(pos, context) {\n                    if (typeof pos !== \"number\") {\n                        throw new TypeError(\"argument index is not number\");\n                    }\n                    if (typeof context !== \"object\") {\n                        throw new TypeError(\"argument context is not an object\");\n                    }\n\n                    this.callArgAt = pos;\n                    this.callbackArguments = slice.call(arguments, 2);\n                    this.callbackContext = context;\n                    this.callArgProp = undefined;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                yields: function () {\n                    this.callArgAt = useLeftMostCallback;\n                    this.callbackArguments = slice.call(arguments, 0);\n                    this.callbackContext = undefined;\n                    this.callArgProp = undefined;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                yieldsRight: function () {\n                    this.callArgAt = useRightMostCallback;\n                    this.callbackArguments = slice.call(arguments, 0);\n                    this.callbackContext = undefined;\n                    this.callArgProp = undefined;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                yieldsOn: function (context) {\n                    if (typeof context !== \"object\") {\n                        throw new TypeError(\"argument context is not an object\");\n                    }\n\n                    this.callArgAt = useLeftMostCallback;\n                    this.callbackArguments = slice.call(arguments, 1);\n                    this.callbackContext = context;\n                    this.callArgProp = undefined;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                yieldsTo: function (prop) {\n                    this.callArgAt = useLeftMostCallback;\n                    this.callbackArguments = slice.call(arguments, 1);\n                    this.callbackContext = undefined;\n                    this.callArgProp = prop;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                yieldsToOn: function (prop, context) {\n                    if (typeof context !== \"object\") {\n                        throw new TypeError(\"argument context is not an object\");\n                    }\n\n                    this.callArgAt = useLeftMostCallback;\n                    this.callbackArguments = slice.call(arguments, 2);\n                    this.callbackContext = context;\n                    this.callArgProp = prop;\n                    this.callbackAsync = false;\n\n                    return this;\n                },\n\n                throws: throwsException,\n                throwsException: throwsException,\n\n                returns: function returns(value) {\n                    this.returnValue = value;\n                    this.returnValueDefined = true;\n                    this.exception = undefined;\n\n                    return this;\n                },\n\n                returnsArg: function returnsArg(pos) {\n                    if (typeof pos !== \"number\") {\n                        throw new TypeError(\"argument index is not number\");\n                    }\n\n                    this.returnArgAt = pos;\n\n                    return this;\n                },\n\n                returnsThis: function returnsThis() {\n                    this.returnThis = true;\n\n                    return this;\n                }\n            };\n\n            function createAsyncVersion(syncFnName) {\n                return function () {\n                    var result = this[syncFnName].apply(this, arguments);\n                    this.callbackAsync = true;\n                    return result;\n                };\n            }\n\n            // create asynchronous versions of callsArg* and yields* methods\n            for (var method in proto) {\n                // need to avoid creating anotherasync versions of the newly added async methods\n                if (proto.hasOwnProperty(method) && method.match(/^(callsArg|yields)/) && !method.match(/Async/)) {\n                    proto[method + \"Async\"] = createAsyncVersion(method);\n                }\n            }\n\n            sinon.behavior = proto;\n            return proto;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            require(\"./extend\");\n            module.exports = makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            function walkInternal(obj, iterator, context, originalObj, seen) {\n                var proto, prop;\n\n                if (typeof Object.getOwnPropertyNames !== \"function\") {\n                    // We explicitly want to enumerate through all of the prototype's properties\n                    // in this case, therefore we deliberately leave out an own property check.\n                    /* eslint-disable guard-for-in */\n                    for (prop in obj) {\n                        iterator.call(context, obj[prop], prop, obj);\n                    }\n                    /* eslint-enable guard-for-in */\n\n                    return;\n                }\n\n                Object.getOwnPropertyNames(obj).forEach(function (k) {\n                    if (!seen[k]) {\n                        seen[k] = true;\n                        var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === \"function\" ?\n                            originalObj : obj;\n                        iterator.call(context, target[k], k, target);\n                    }\n                });\n\n                proto = Object.getPrototypeOf(obj);\n                if (proto) {\n                    walkInternal(proto, iterator, context, originalObj, seen);\n                }\n            }\n\n            /* Public: walks the prototype chain of an object and iterates over every own property\n             * name encountered. The iterator is called in the same fashion that Array.prototype.forEach\n             * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional\n             * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will\n             * default to using a simple for..in loop.\n             *\n             * obj - The object to walk the prototype chain for.\n             * iterator - The function to be called on each pass of the walk.\n             * context - (Optional) When given, the iterator will be called with this object as the receiver.\n             */\n            function walk(obj, iterator, context) {\n                return walkInternal(obj, iterator, context, obj, {});\n            }\n\n            sinon.walk = walk;\n            return sinon.walk;\n        }\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            module.exports = makeApi(sinon);\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     * @depend extend.js\n     * @depend spy.js\n     * @depend behavior.js\n     * @depend walk.js\n     */\n    /**\n     * Stub functions\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            function stub(object, property, func) {\n                if (!!func && typeof func !== \"function\" && typeof func !== \"object\") {\n                    throw new TypeError(\"Custom stub should be a function or a property descriptor\");\n                }\n\n                var wrapper;\n\n                if (func) {\n                    if (typeof func === \"function\") {\n                        wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;\n                    } else {\n                        wrapper = func;\n                        if (sinon.spy && sinon.spy.create) {\n                            var types = sinon.objectKeys(wrapper);\n                            for (var i = 0; i < types.length; i++) {\n                                wrapper[types[i]] = sinon.spy.create(wrapper[types[i]]);\n                            }\n                        }\n                    }\n                } else {\n                    var stubLength = 0;\n                    if (typeof object === \"object\" && typeof object[property] === \"function\") {\n                        stubLength = object[property].length;\n                    }\n                    wrapper = stub.create(stubLength);\n                }\n\n                if (!object && typeof property === \"undefined\") {\n                    return sinon.stub.create();\n                }\n\n                if (typeof property === \"undefined\" && typeof object === \"object\") {\n                    sinon.walk(object || {}, function (value, prop, propOwner) {\n                        // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object\n                        // is not Object.prototype\n                        if (\n                            propOwner !== Object.prototype &&\n                            prop !== \"constructor\" &&\n                            typeof sinon.getPropertyDescriptor(propOwner, prop).value === \"function\"\n                        ) {\n                            stub(object, prop);\n                        }\n                    });\n\n                    return object;\n                }\n\n                return sinon.wrapMethod(object, property, wrapper);\n            }\n\n\n            /*eslint-disable no-use-before-define*/\n            function getParentBehaviour(stubInstance) {\n                return (stubInstance.parent && getCurrentBehavior(stubInstance.parent));\n            }\n\n            function getDefaultBehavior(stubInstance) {\n                return stubInstance.defaultBehavior ||\n                        getParentBehaviour(stubInstance) ||\n                        sinon.behavior.create(stubInstance);\n            }\n\n            function getCurrentBehavior(stubInstance) {\n                var behavior = stubInstance.behaviors[stubInstance.callCount - 1];\n                return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stubInstance);\n            }\n            /*eslint-enable no-use-before-define*/\n\n            var uuid = 0;\n\n            var proto = {\n                create: function create(stubLength) {\n                    var functionStub = function () {\n                        return getCurrentBehavior(functionStub).invoke(this, arguments);\n                    };\n\n                    functionStub.id = \"stub#\" + uuid++;\n                    var orig = functionStub;\n                    functionStub = sinon.spy.create(functionStub, stubLength);\n                    functionStub.func = orig;\n\n                    sinon.extend(functionStub, stub);\n                    functionStub.instantiateFake = sinon.stub.create;\n                    functionStub.displayName = \"stub\";\n                    functionStub.toString = sinon.functionToString;\n\n                    functionStub.defaultBehavior = null;\n                    functionStub.behaviors = [];\n\n                    return functionStub;\n                },\n\n                resetBehavior: function () {\n                    var i;\n\n                    this.defaultBehavior = null;\n                    this.behaviors = [];\n\n                    delete this.returnValue;\n                    delete this.returnArgAt;\n                    this.returnThis = false;\n\n                    if (this.fakes) {\n                        for (i = 0; i < this.fakes.length; i++) {\n                            this.fakes[i].resetBehavior();\n                        }\n                    }\n                },\n\n                onCall: function onCall(index) {\n                    if (!this.behaviors[index]) {\n                        this.behaviors[index] = sinon.behavior.create(this);\n                    }\n\n                    return this.behaviors[index];\n                },\n\n                onFirstCall: function onFirstCall() {\n                    return this.onCall(0);\n                },\n\n                onSecondCall: function onSecondCall() {\n                    return this.onCall(1);\n                },\n\n                onThirdCall: function onThirdCall() {\n                    return this.onCall(2);\n                }\n            };\n\n            function createBehavior(behaviorMethod) {\n                return function () {\n                    this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);\n                    this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);\n                    return this;\n                };\n            }\n\n            for (var method in sinon.behavior) {\n                if (sinon.behavior.hasOwnProperty(method) &&\n                    !proto.hasOwnProperty(method) &&\n                    method !== \"create\" &&\n                    method !== \"withArgs\" &&\n                    method !== \"invoke\") {\n                    proto[method] = createBehavior(method);\n                }\n            }\n\n            sinon.extend(stub, proto);\n            sinon.stub = stub;\n\n            return stub;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var core = require(\"./util/core\");\n            require(\"./behavior\");\n            require(\"./spy\");\n            require(\"./extend\");\n            module.exports = makeApi(core);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend times_in_words.js\n     * @depend util/core.js\n     * @depend call.js\n     * @depend extend.js\n     * @depend match.js\n     * @depend spy.js\n     * @depend stub.js\n     * @depend format.js\n     */\n    /**\n     * Mock functions.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            var push = [].push;\n            var match = sinon.match;\n\n            function mock(object) {\n                // if (typeof console !== undefined && console.warn) {\n                //     console.warn(\"mock will be removed from Sinon.JS v2.0\");\n                // }\n\n                if (!object) {\n                    return sinon.expectation.create(\"Anonymous mock\");\n                }\n\n                return mock.create(object);\n            }\n\n            function each(collection, callback) {\n                if (!collection) {\n                    return;\n                }\n\n                for (var i = 0, l = collection.length; i < l; i += 1) {\n                    callback(collection[i]);\n                }\n            }\n\n            function arrayEquals(arr1, arr2, compareLength) {\n                if (compareLength && (arr1.length !== arr2.length)) {\n                    return false;\n                }\n\n                for (var i = 0, l = arr1.length; i < l; i++) {\n                    if (!sinon.deepEqual(arr1[i], arr2[i])) {\n                        return false;\n                    }\n                }\n                return true;\n            }\n\n            sinon.extend(mock, {\n                create: function create(object) {\n                    if (!object) {\n                        throw new TypeError(\"object is null\");\n                    }\n\n                    var mockObject = sinon.extend({}, mock);\n                    mockObject.object = object;\n                    delete mockObject.create;\n\n                    return mockObject;\n                },\n\n                expects: function expects(method) {\n                    if (!method) {\n                        throw new TypeError(\"method is falsy\");\n                    }\n\n                    if (!this.expectations) {\n                        this.expectations = {};\n                        this.proxies = [];\n                    }\n\n                    if (!this.expectations[method]) {\n                        this.expectations[method] = [];\n                        var mockObject = this;\n\n                        sinon.wrapMethod(this.object, method, function () {\n                            return mockObject.invokeMethod(method, this, arguments);\n                        });\n\n                        push.call(this.proxies, method);\n                    }\n\n                    var expectation = sinon.expectation.create(method);\n                    push.call(this.expectations[method], expectation);\n\n                    return expectation;\n                },\n\n                restore: function restore() {\n                    var object = this.object;\n\n                    each(this.proxies, function (proxy) {\n                        if (typeof object[proxy].restore === \"function\") {\n                            object[proxy].restore();\n                        }\n                    });\n                },\n\n                verify: function verify() {\n                    var expectations = this.expectations || {};\n                    var messages = [];\n                    var met = [];\n\n                    each(this.proxies, function (proxy) {\n                        each(expectations[proxy], function (expectation) {\n                            if (!expectation.met()) {\n                                push.call(messages, expectation.toString());\n                            } else {\n                                push.call(met, expectation.toString());\n                            }\n                        });\n                    });\n\n                    this.restore();\n\n                    if (messages.length > 0) {\n                        sinon.expectation.fail(messages.concat(met).join(\"\\n\"));\n                    } else if (met.length > 0) {\n                        sinon.expectation.pass(messages.concat(met).join(\"\\n\"));\n                    }\n\n                    return true;\n                },\n\n                invokeMethod: function invokeMethod(method, thisValue, args) {\n                    var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : [];\n                    var expectationsWithMatchingArgs = [];\n                    var currentArgs = args || [];\n                    var i, available;\n\n                    for (i = 0; i < expectations.length; i += 1) {\n                        var expectedArgs = expectations[i].expectedArguments || [];\n                        if (arrayEquals(expectedArgs, currentArgs, expectations[i].expectsExactArgCount)) {\n                            expectationsWithMatchingArgs.push(expectations[i]);\n                        }\n                    }\n\n                    for (i = 0; i < expectationsWithMatchingArgs.length; i += 1) {\n                        if (!expectationsWithMatchingArgs[i].met() &&\n                            expectationsWithMatchingArgs[i].allowsCall(thisValue, args)) {\n                            return expectationsWithMatchingArgs[i].apply(thisValue, args);\n                        }\n                    }\n\n                    var messages = [];\n                    var exhausted = 0;\n\n                    for (i = 0; i < expectationsWithMatchingArgs.length; i += 1) {\n                        if (expectationsWithMatchingArgs[i].allowsCall(thisValue, args)) {\n                            available = available || expectationsWithMatchingArgs[i];\n                        } else {\n                            exhausted += 1;\n                        }\n                    }\n\n                    if (available && exhausted === 0) {\n                        return available.apply(thisValue, args);\n                    }\n\n                    for (i = 0; i < expectations.length; i += 1) {\n                        push.call(messages, \"    \" + expectations[i].toString());\n                    }\n\n                    messages.unshift(\"Unexpected call: \" + sinon.spyCall.toString.call({\n                        proxy: method,\n                        args: args\n                    }));\n\n                    sinon.expectation.fail(messages.join(\"\\n\"));\n                }\n            });\n\n            var times = sinon.timesInWords;\n            var slice = Array.prototype.slice;\n\n            function callCountInWords(callCount) {\n                if (callCount === 0) {\n                    return \"never called\";\n                }\n\n                return \"called \" + times(callCount);\n            }\n\n            function expectedCallCountInWords(expectation) {\n                var min = expectation.minCalls;\n                var max = expectation.maxCalls;\n\n                if (typeof min === \"number\" && typeof max === \"number\") {\n                    var str = times(min);\n\n                    if (min !== max) {\n                        str = \"at least \" + str + \" and at most \" + times(max);\n                    }\n\n                    return str;\n                }\n\n                if (typeof min === \"number\") {\n                    return \"at least \" + times(min);\n                }\n\n                return \"at most \" + times(max);\n            }\n\n            function receivedMinCalls(expectation) {\n                var hasMinLimit = typeof expectation.minCalls === \"number\";\n                return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n            }\n\n            function receivedMaxCalls(expectation) {\n                if (typeof expectation.maxCalls !== \"number\") {\n                    return false;\n                }\n\n                return expectation.callCount === expectation.maxCalls;\n            }\n\n            function verifyMatcher(possibleMatcher, arg) {\n                var isMatcher = match && match.isMatcher(possibleMatcher);\n\n                return isMatcher && possibleMatcher.test(arg) || true;\n            }\n\n            sinon.expectation = {\n                minCalls: 1,\n                maxCalls: 1,\n\n                create: function create(methodName) {\n                    var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);\n                    delete expectation.create;\n                    expectation.method = methodName;\n\n                    return expectation;\n                },\n\n                invoke: function invoke(func, thisValue, args) {\n                    this.verifyCallAllowed(thisValue, args);\n\n                    return sinon.spy.invoke.apply(this, arguments);\n                },\n\n                atLeast: function atLeast(num) {\n                    if (typeof num !== \"number\") {\n                        throw new TypeError(\"'\" + num + \"' is not number\");\n                    }\n\n                    if (!this.limitsSet) {\n                        this.maxCalls = null;\n                        this.limitsSet = true;\n                    }\n\n                    this.minCalls = num;\n\n                    return this;\n                },\n\n                atMost: function atMost(num) {\n                    if (typeof num !== \"number\") {\n                        throw new TypeError(\"'\" + num + \"' is not number\");\n                    }\n\n                    if (!this.limitsSet) {\n                        this.minCalls = null;\n                        this.limitsSet = true;\n                    }\n\n                    this.maxCalls = num;\n\n                    return this;\n                },\n\n                never: function never() {\n                    return this.exactly(0);\n                },\n\n                once: function once() {\n                    return this.exactly(1);\n                },\n\n                twice: function twice() {\n                    return this.exactly(2);\n                },\n\n                thrice: function thrice() {\n                    return this.exactly(3);\n                },\n\n                exactly: function exactly(num) {\n                    if (typeof num !== \"number\") {\n                        throw new TypeError(\"'\" + num + \"' is not a number\");\n                    }\n\n                    this.atLeast(num);\n                    return this.atMost(num);\n                },\n\n                met: function met() {\n                    return !this.failed && receivedMinCalls(this);\n                },\n\n                verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n                    if (receivedMaxCalls(this)) {\n                        this.failed = true;\n                        sinon.expectation.fail(this.method + \" already called \" + times(this.maxCalls));\n                    }\n\n                    if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n                        sinon.expectation.fail(this.method + \" called with \" + thisValue + \" as thisValue, expected \" +\n                            this.expectedThis);\n                    }\n\n                    if (!(\"expectedArguments\" in this)) {\n                        return;\n                    }\n\n                    if (!args) {\n                        sinon.expectation.fail(this.method + \" received no arguments, expected \" +\n                            sinon.format(this.expectedArguments));\n                    }\n\n                    if (args.length < this.expectedArguments.length) {\n                        sinon.expectation.fail(this.method + \" received too few arguments (\" + sinon.format(args) +\n                            \"), expected \" + sinon.format(this.expectedArguments));\n                    }\n\n                    if (this.expectsExactArgCount &&\n                        args.length !== this.expectedArguments.length) {\n                        sinon.expectation.fail(this.method + \" received too many arguments (\" + sinon.format(args) +\n                            \"), expected \" + sinon.format(this.expectedArguments));\n                    }\n\n                    for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n\n                        if (!verifyMatcher(this.expectedArguments[i], args[i])) {\n                            sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n                                \", didn't match \" + this.expectedArguments.toString());\n                        }\n\n                        if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n                            sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n                                \", expected \" + sinon.format(this.expectedArguments));\n                        }\n                    }\n                },\n\n                allowsCall: function allowsCall(thisValue, args) {\n                    if (this.met() && receivedMaxCalls(this)) {\n                        return false;\n                    }\n\n                    if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n                        return false;\n                    }\n\n                    if (!(\"expectedArguments\" in this)) {\n                        return true;\n                    }\n\n                    args = args || [];\n\n                    if (args.length < this.expectedArguments.length) {\n                        return false;\n                    }\n\n                    if (this.expectsExactArgCount &&\n                        args.length !== this.expectedArguments.length) {\n                        return false;\n                    }\n\n                    for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n                        if (!verifyMatcher(this.expectedArguments[i], args[i])) {\n                            return false;\n                        }\n\n                        if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n                            return false;\n                        }\n                    }\n\n                    return true;\n                },\n\n                withArgs: function withArgs() {\n                    this.expectedArguments = slice.call(arguments);\n                    return this;\n                },\n\n                withExactArgs: function withExactArgs() {\n                    this.withArgs.apply(this, arguments);\n                    this.expectsExactArgCount = true;\n                    return this;\n                },\n\n                on: function on(thisValue) {\n                    this.expectedThis = thisValue;\n                    return this;\n                },\n\n                toString: function () {\n                    var args = (this.expectedArguments || []).slice();\n\n                    if (!this.expectsExactArgCount) {\n                        push.call(args, \"[...]\");\n                    }\n\n                    var callStr = sinon.spyCall.toString.call({\n                        proxy: this.method || \"anonymous mock expectation\",\n                        args: args\n                    });\n\n                    var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n                        expectedCallCountInWords(this);\n\n                    if (this.met()) {\n                        return \"Expectation met: \" + message;\n                    }\n\n                    return \"Expected \" + message + \" (\" +\n                        callCountInWords(this.callCount) + \")\";\n                },\n\n                verify: function verify() {\n                    if (!this.met()) {\n                        sinon.expectation.fail(this.toString());\n                    } else {\n                        sinon.expectation.pass(this.toString());\n                    }\n\n                    return true;\n                },\n\n                pass: function pass(message) {\n                    sinon.assert.pass(message);\n                },\n\n                fail: function fail(message) {\n                    var exception = new Error(message);\n                    exception.name = \"ExpectationError\";\n\n                    throw exception;\n                }\n            };\n\n            sinon.mock = mock;\n            return mock;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            require(\"./times_in_words\");\n            require(\"./call\");\n            require(\"./extend\");\n            require(\"./match\");\n            require(\"./spy\");\n            require(\"./stub\");\n            require(\"./format\");\n\n            module.exports = makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     * @depend spy.js\n     * @depend stub.js\n     * @depend mock.js\n     */\n    /**\n     * Collections of stubs, spies and mocks.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        var push = [].push;\n        var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n        function getFakes(fakeCollection) {\n            if (!fakeCollection.fakes) {\n                fakeCollection.fakes = [];\n            }\n\n            return fakeCollection.fakes;\n        }\n\n        function each(fakeCollection, method) {\n            var fakes = getFakes(fakeCollection);\n\n            for (var i = 0, l = fakes.length; i < l; i += 1) {\n                if (typeof fakes[i][method] === \"function\") {\n                    fakes[i][method]();\n                }\n            }\n        }\n\n        function compact(fakeCollection) {\n            var fakes = getFakes(fakeCollection);\n            var i = 0;\n            while (i < fakes.length) {\n                fakes.splice(i, 1);\n            }\n        }\n\n        function makeApi(sinon) {\n            var collection = {\n                verify: function resolve() {\n                    each(this, \"verify\");\n                },\n\n                restore: function restore() {\n                    each(this, \"restore\");\n                    compact(this);\n                },\n\n                reset: function restore() {\n                    each(this, \"reset\");\n                },\n\n                verifyAndRestore: function verifyAndRestore() {\n                    var exception;\n\n                    try {\n                        this.verify();\n                    } catch (e) {\n                        exception = e;\n                    }\n\n                    this.restore();\n\n                    if (exception) {\n                        throw exception;\n                    }\n                },\n\n                add: function add(fake) {\n                    push.call(getFakes(this), fake);\n                    return fake;\n                },\n\n                spy: function spy() {\n                    return this.add(sinon.spy.apply(sinon, arguments));\n                },\n\n                stub: function stub(object, property, value) {\n                    if (property) {\n                        var original = object[property];\n\n                        if (typeof original !== \"function\") {\n                            if (!hasOwnProperty.call(object, property)) {\n                                throw new TypeError(\"Cannot stub non-existent own property \" + property);\n                            }\n\n                            object[property] = value;\n\n                            return this.add({\n                                restore: function () {\n                                    object[property] = original;\n                                }\n                            });\n                        }\n                    }\n                    if (!property && !!object && typeof object === \"object\") {\n                        var stubbedObj = sinon.stub.apply(sinon, arguments);\n\n                        for (var prop in stubbedObj) {\n                            if (typeof stubbedObj[prop] === \"function\") {\n                                this.add(stubbedObj[prop]);\n                            }\n                        }\n\n                        return stubbedObj;\n                    }\n\n                    return this.add(sinon.stub.apply(sinon, arguments));\n                },\n\n                mock: function mock() {\n                    return this.add(sinon.mock.apply(sinon, arguments));\n                },\n\n                inject: function inject(obj) {\n                    var col = this;\n\n                    obj.spy = function () {\n                        return col.spy.apply(col, arguments);\n                    };\n\n                    obj.stub = function () {\n                        return col.stub.apply(col, arguments);\n                    };\n\n                    obj.mock = function () {\n                        return col.mock.apply(col, arguments);\n                    };\n\n                    return obj;\n                }\n            };\n\n            sinon.collection = collection;\n            return collection;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            require(\"./mock\");\n            require(\"./spy\");\n            require(\"./stub\");\n            module.exports = makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * Fake timer API\n     * setTimeout\n     * setInterval\n     * clearTimeout\n     * clearInterval\n     * tick\n     * reset\n     * Date\n     *\n     * Inspired by jsUnitMockTimeOut from JsUnit\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function () {\n\n        function makeApi(s, lol) {\n            /*global lolex */\n            var llx = typeof lolex !== \"undefined\" ? lolex : lol;\n\n            s.useFakeTimers = function () {\n                var now;\n                var methods = Array.prototype.slice.call(arguments);\n\n                if (typeof methods[0] === \"string\") {\n                    now = 0;\n                } else {\n                    now = methods.shift();\n                }\n\n                var clock = llx.install(now || 0, methods);\n                clock.restore = clock.uninstall;\n                return clock;\n            };\n\n            s.clock = {\n                create: function (now) {\n                    return llx.createClock(now);\n                }\n            };\n\n            s.timers = {\n                setTimeout: setTimeout,\n                clearTimeout: clearTimeout,\n                setImmediate: (typeof setImmediate !== \"undefined\" ? setImmediate : undefined),\n                clearImmediate: (typeof clearImmediate !== \"undefined\" ? clearImmediate : undefined),\n                setInterval: setInterval,\n                clearInterval: clearInterval,\n                Date: Date\n            };\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, epxorts, module, lolex) {\n            var core = require(\"./core\");\n            makeApi(core, lolex);\n            module.exports = core;\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n        } else if (isNode) {\n            loadDependencies(require, module.exports, module, require(\"lolex\"));\n        } else {\n            makeApi(sinon); // eslint-disable-line no-undef\n        }\n    }());\n\n    /**\n     * Minimal Event interface implementation\n     *\n     * Original implementation by Sven Fuchs: https://gist.github.com/995028\n     * Modifications and tests by Christian Johansen.\n     *\n     * @author Sven Fuchs (svenfuchs@artweb-design.de)\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n     */\n    if (typeof sinon === \"undefined\") {\n        this.sinon = {};\n    }\n\n    (function () {\n\n        var push = [].push;\n\n        function makeApi(sinon) {\n            sinon.Event = function Event(type, bubbles, cancelable, target) {\n                this.initEvent(type, bubbles, cancelable, target);\n            };\n\n            sinon.Event.prototype = {\n                initEvent: function (type, bubbles, cancelable, target) {\n                    this.type = type;\n                    this.bubbles = bubbles;\n                    this.cancelable = cancelable;\n                    this.target = target;\n                },\n\n                stopPropagation: function () { },\n\n                preventDefault: function () {\n                    this.defaultPrevented = true;\n                }\n            };\n\n            sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {\n                this.initEvent(type, false, false, target);\n                this.loaded = progressEventRaw.loaded || null;\n                this.total = progressEventRaw.total || null;\n                this.lengthComputable = !!progressEventRaw.total;\n            };\n\n            sinon.ProgressEvent.prototype = new sinon.Event();\n\n            sinon.ProgressEvent.prototype.constructor = sinon.ProgressEvent;\n\n            sinon.CustomEvent = function CustomEvent(type, customData, target) {\n                this.initEvent(type, false, false, target);\n                this.detail = customData.detail || null;\n            };\n\n            sinon.CustomEvent.prototype = new sinon.Event();\n\n            sinon.CustomEvent.prototype.constructor = sinon.CustomEvent;\n\n            sinon.EventTarget = {\n                addEventListener: function addEventListener(event, listener) {\n                    this.eventListeners = this.eventListeners || {};\n                    this.eventListeners[event] = this.eventListeners[event] || [];\n                    push.call(this.eventListeners[event], listener);\n                },\n\n                removeEventListener: function removeEventListener(event, listener) {\n                    var listeners = this.eventListeners && this.eventListeners[event] || [];\n\n                    for (var i = 0, l = listeners.length; i < l; ++i) {\n                        if (listeners[i] === listener) {\n                            return listeners.splice(i, 1);\n                        }\n                    }\n                },\n\n                dispatchEvent: function dispatchEvent(event) {\n                    var type = event.type;\n                    var listeners = this.eventListeners && this.eventListeners[type] || [];\n\n                    for (var i = 0; i < listeners.length; i++) {\n                        if (typeof listeners[i] === \"function\") {\n                            listeners[i].call(this, event);\n                        } else {\n                            listeners[i].handleEvent(event);\n                        }\n                    }\n\n                    return !!event.defaultPrevented;\n                }\n            };\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require) {\n            var sinon = require(\"./core\");\n            makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n        } else if (isNode) {\n            loadDependencies(require);\n        } else {\n            makeApi(sinon); // eslint-disable-line no-undef\n        }\n    }());\n\n    /**\n     * @depend util/core.js\n     */\n    /**\n     * Logs errors\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2014 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        // cache a reference to setTimeout, so that our reference won't be stubbed out\n        // when using fake timers and errors will still get logged\n        // https://github.com/cjohansen/Sinon.JS/issues/381\n        var realSetTimeout = setTimeout;\n\n        function makeApi(sinon) {\n\n            function log() { }\n\n            function logError(label, err) {\n                var msg = label + \" threw exception: \";\n\n                function throwLoggedError() {\n                    err.message = msg + err.message;\n                    throw err;\n                }\n\n                sinon.log(msg + \"[\" + err.name + \"] \" + err.message);\n\n                if (err.stack) {\n                    sinon.log(err.stack);\n                }\n\n                if (logError.useImmediateExceptions) {\n                    throwLoggedError();\n                } else {\n                    logError.setTimeout(throwLoggedError, 0);\n                }\n            }\n\n            // When set to true, any errors logged will be thrown immediately;\n            // If set to false, the errors will be thrown in separate execution frame.\n            logError.useImmediateExceptions = false;\n\n            // wrap realSetTimeout with something we can stub in tests\n            logError.setTimeout = function (func, timeout) {\n                realSetTimeout(func, timeout);\n            };\n\n            var exports = {};\n            exports.log = sinon.log = log;\n            exports.logError = sinon.logError = logError;\n\n            return exports;\n        }\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            module.exports = makeApi(sinon);\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend core.js\n     * @depend ../extend.js\n     * @depend event.js\n     * @depend ../log_error.js\n     */\n    /**\n     * Fake XDomainRequest object\n     */\n    if (typeof sinon === \"undefined\") {\n        this.sinon = {};\n    }\n\n    // wrapper for global\n    (function (global) {\n\n        var xdr = { XDomainRequest: global.XDomainRequest };\n        xdr.GlobalXDomainRequest = global.XDomainRequest;\n        xdr.supportsXDR = typeof xdr.GlobalXDomainRequest !== \"undefined\";\n        xdr.workingXDR = xdr.supportsXDR ? xdr.GlobalXDomainRequest : false;\n\n        function makeApi(sinon) {\n            sinon.xdr = xdr;\n\n            function FakeXDomainRequest() {\n                this.readyState = FakeXDomainRequest.UNSENT;\n                this.requestBody = null;\n                this.requestHeaders = {};\n                this.status = 0;\n                this.timeout = null;\n\n                if (typeof FakeXDomainRequest.onCreate === \"function\") {\n                    FakeXDomainRequest.onCreate(this);\n                }\n            }\n\n            function verifyState(x) {\n                if (x.readyState !== FakeXDomainRequest.OPENED) {\n                    throw new Error(\"INVALID_STATE_ERR\");\n                }\n\n                if (x.sendFlag) {\n                    throw new Error(\"INVALID_STATE_ERR\");\n                }\n            }\n\n            function verifyRequestSent(x) {\n                if (x.readyState === FakeXDomainRequest.UNSENT) {\n                    throw new Error(\"Request not sent\");\n                }\n                if (x.readyState === FakeXDomainRequest.DONE) {\n                    throw new Error(\"Request done\");\n                }\n            }\n\n            function verifyResponseBodyType(body) {\n                if (typeof body !== \"string\") {\n                    var error = new Error(\"Attempted to respond to fake XDomainRequest with \" +\n                                        body + \", which is not a string.\");\n                    error.name = \"InvalidBodyException\";\n                    throw error;\n                }\n            }\n\n            sinon.extend(FakeXDomainRequest.prototype, sinon.EventTarget, {\n                open: function open(method, url) {\n                    this.method = method;\n                    this.url = url;\n\n                    this.responseText = null;\n                    this.sendFlag = false;\n\n                    this.readyStateChange(FakeXDomainRequest.OPENED);\n                },\n\n                readyStateChange: function readyStateChange(state) {\n                    this.readyState = state;\n                    var eventName = \"\";\n                    switch (this.readyState) {\n                        case FakeXDomainRequest.UNSENT:\n                            break;\n                        case FakeXDomainRequest.OPENED:\n                            break;\n                        case FakeXDomainRequest.LOADING:\n                            if (this.sendFlag) {\n                                //raise the progress event\n                                eventName = \"onprogress\";\n                            }\n                            break;\n                        case FakeXDomainRequest.DONE:\n                            if (this.isTimeout) {\n                                eventName = \"ontimeout\";\n                            } else if (this.errorFlag || (this.status < 200 || this.status > 299)) {\n                                eventName = \"onerror\";\n                            } else {\n                                eventName = \"onload\";\n                            }\n                            break;\n                    }\n\n                    // raising event (if defined)\n                    if (eventName) {\n                        if (typeof this[eventName] === \"function\") {\n                            try {\n                                this[eventName]();\n                            } catch (e) {\n                                sinon.logError(\"Fake XHR \" + eventName + \" handler\", e);\n                            }\n                        }\n                    }\n                },\n\n                send: function send(data) {\n                    verifyState(this);\n\n                    if (!/^(get|head)$/i.test(this.method)) {\n                        this.requestBody = data;\n                    }\n                    this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n\n                    this.errorFlag = false;\n                    this.sendFlag = true;\n                    this.readyStateChange(FakeXDomainRequest.OPENED);\n\n                    if (typeof this.onSend === \"function\") {\n                        this.onSend(this);\n                    }\n                },\n\n                abort: function abort() {\n                    this.aborted = true;\n                    this.responseText = null;\n                    this.errorFlag = true;\n\n                    if (this.readyState > sinon.FakeXDomainRequest.UNSENT && this.sendFlag) {\n                        this.readyStateChange(sinon.FakeXDomainRequest.DONE);\n                        this.sendFlag = false;\n                    }\n                },\n\n                setResponseBody: function setResponseBody(body) {\n                    verifyRequestSent(this);\n                    verifyResponseBodyType(body);\n\n                    var chunkSize = this.chunkSize || 10;\n                    var index = 0;\n                    this.responseText = \"\";\n\n                    do {\n                        this.readyStateChange(FakeXDomainRequest.LOADING);\n                        this.responseText += body.substring(index, index + chunkSize);\n                        index += chunkSize;\n                    } while (index < body.length);\n\n                    this.readyStateChange(FakeXDomainRequest.DONE);\n                },\n\n                respond: function respond(status, contentType, body) {\n                    // content-type ignored, since XDomainRequest does not carry this\n                    // we keep the same syntax for respond(...) as for FakeXMLHttpRequest to ease\n                    // test integration across browsers\n                    this.status = typeof status === \"number\" ? status : 200;\n                    this.setResponseBody(body || \"\");\n                },\n\n                simulatetimeout: function simulatetimeout() {\n                    this.status = 0;\n                    this.isTimeout = true;\n                    // Access to this should actually throw an error\n                    this.responseText = undefined;\n                    this.readyStateChange(FakeXDomainRequest.DONE);\n                }\n            });\n\n            sinon.extend(FakeXDomainRequest, {\n                UNSENT: 0,\n                OPENED: 1,\n                LOADING: 3,\n                DONE: 4\n            });\n\n            sinon.useFakeXDomainRequest = function useFakeXDomainRequest() {\n                sinon.FakeXDomainRequest.restore = function restore(keepOnCreate) {\n                    if (xdr.supportsXDR) {\n                        global.XDomainRequest = xdr.GlobalXDomainRequest;\n                    }\n\n                    delete sinon.FakeXDomainRequest.restore;\n\n                    if (keepOnCreate !== true) {\n                        delete sinon.FakeXDomainRequest.onCreate;\n                    }\n                };\n                if (xdr.supportsXDR) {\n                    global.XDomainRequest = sinon.FakeXDomainRequest;\n                }\n                return sinon.FakeXDomainRequest;\n            };\n\n            sinon.FakeXDomainRequest = FakeXDomainRequest;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./core\");\n            require(\"../extend\");\n            require(\"./event\");\n            require(\"../log_error\");\n            makeApi(sinon);\n            module.exports = sinon;\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n        } else if (isNode) {\n            loadDependencies(require, module.exports, module);\n        } else {\n            makeApi(sinon); // eslint-disable-line no-undef\n        }\n    })(typeof global !== \"undefined\" ? global : self);\n\n    /**\n     * @depend core.js\n     * @depend ../extend.js\n     * @depend event.js\n     * @depend ../log_error.js\n     */\n    /**\n     * Fake XMLHttpRequest object\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal, global) {\n\n        function getWorkingXHR(globalScope) {\n            var supportsXHR = typeof globalScope.XMLHttpRequest !== \"undefined\";\n            if (supportsXHR) {\n                return globalScope.XMLHttpRequest;\n            }\n\n            var supportsActiveX = typeof globalScope.ActiveXObject !== \"undefined\";\n            if (supportsActiveX) {\n                return function () {\n                    return new globalScope.ActiveXObject(\"MSXML2.XMLHTTP.3.0\");\n                };\n            }\n\n            return false;\n        }\n\n        var supportsProgress = typeof ProgressEvent !== \"undefined\";\n        var supportsCustomEvent = typeof CustomEvent !== \"undefined\";\n        var supportsFormData = typeof FormData !== \"undefined\";\n        var supportsArrayBuffer = typeof ArrayBuffer !== \"undefined\";\n        var supportsBlob = typeof Blob === \"function\";\n        var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };\n        sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\n        sinonXhr.GlobalActiveXObject = global.ActiveXObject;\n        sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject !== \"undefined\";\n        sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== \"undefined\";\n        sinonXhr.workingXHR = getWorkingXHR(global);\n        sinonXhr.supportsCORS = sinonXhr.supportsXHR && \"withCredentials\" in (new sinonXhr.GlobalXMLHttpRequest());\n\n        var unsafeHeaders = {\n            \"Accept-Charset\": true,\n            \"Accept-Encoding\": true,\n            Connection: true,\n            \"Content-Length\": true,\n            Cookie: true,\n            Cookie2: true,\n            \"Content-Transfer-Encoding\": true,\n            Date: true,\n            Expect: true,\n            Host: true,\n            \"Keep-Alive\": true,\n            Referer: true,\n            TE: true,\n            Trailer: true,\n            \"Transfer-Encoding\": true,\n            Upgrade: true,\n            \"User-Agent\": true,\n            Via: true\n        };\n\n        // An upload object is created for each\n        // FakeXMLHttpRequest and allows upload\n        // events to be simulated using uploadProgress\n        // and uploadError.\n        function UploadProgress() {\n            this.eventListeners = {\n                progress: [],\n                load: [],\n                abort: [],\n                error: []\n            };\n        }\n\n        UploadProgress.prototype.addEventListener = function addEventListener(event, listener) {\n            this.eventListeners[event].push(listener);\n        };\n\n        UploadProgress.prototype.removeEventListener = function removeEventListener(event, listener) {\n            var listeners = this.eventListeners[event] || [];\n\n            for (var i = 0, l = listeners.length; i < l; ++i) {\n                if (listeners[i] === listener) {\n                    return listeners.splice(i, 1);\n                }\n            }\n        };\n\n        UploadProgress.prototype.dispatchEvent = function dispatchEvent(event) {\n            var listeners = this.eventListeners[event.type] || [];\n\n            for (var i = 0, listener; (listener = listeners[i]) != null; i++) {\n                listener(event);\n            }\n        };\n\n        // Note that for FakeXMLHttpRequest to work pre ES5\n        // we lose some of the alignment with the spec.\n        // To ensure as close a match as possible,\n        // set responseType before calling open, send or respond;\n        function FakeXMLHttpRequest() {\n            this.readyState = FakeXMLHttpRequest.UNSENT;\n            this.requestHeaders = {};\n            this.requestBody = null;\n            this.status = 0;\n            this.statusText = \"\";\n            this.upload = new UploadProgress();\n            this.responseType = \"\";\n            this.response = \"\";\n            if (sinonXhr.supportsCORS) {\n                this.withCredentials = false;\n            }\n\n            var xhr = this;\n            var events = [\"loadstart\", \"load\", \"abort\", \"loadend\"];\n\n            function addEventListener(eventName) {\n                xhr.addEventListener(eventName, function (event) {\n                    var listener = xhr[\"on\" + eventName];\n\n                    if (listener && typeof listener === \"function\") {\n                        listener.call(this, event);\n                    }\n                });\n            }\n\n            for (var i = events.length - 1; i >= 0; i--) {\n                addEventListener(events[i]);\n            }\n\n            if (typeof FakeXMLHttpRequest.onCreate === \"function\") {\n                FakeXMLHttpRequest.onCreate(this);\n            }\n        }\n\n        function verifyState(xhr) {\n            if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n                throw new Error(\"INVALID_STATE_ERR\");\n            }\n\n            if (xhr.sendFlag) {\n                throw new Error(\"INVALID_STATE_ERR\");\n            }\n        }\n\n        function getHeader(headers, header) {\n            header = header.toLowerCase();\n\n            for (var h in headers) {\n                if (h.toLowerCase() === header) {\n                    return h;\n                }\n            }\n\n            return null;\n        }\n\n        // filtering to enable a white-list version of Sinon FakeXhr,\n        // where whitelisted requests are passed through to real XHR\n        function each(collection, callback) {\n            if (!collection) {\n                return;\n            }\n\n            for (var i = 0, l = collection.length; i < l; i += 1) {\n                callback(collection[i]);\n            }\n        }\n        function some(collection, callback) {\n            for (var index = 0; index < collection.length; index++) {\n                if (callback(collection[index]) === true) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        // largest arity in XHR is 5 - XHR#open\n        var apply = function (obj, method, args) {\n            switch (args.length) {\n                case 0: return obj[method]();\n                case 1: return obj[method](args[0]);\n                case 2: return obj[method](args[0], args[1]);\n                case 3: return obj[method](args[0], args[1], args[2]);\n                case 4: return obj[method](args[0], args[1], args[2], args[3]);\n                case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]);\n            }\n        };\n\n        FakeXMLHttpRequest.filters = [];\n        FakeXMLHttpRequest.addFilter = function addFilter(fn) {\n            this.filters.push(fn);\n        };\n        var IE6Re = /MSIE 6/;\n        FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {\n            var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap\n\n            each([\n                \"open\",\n                \"setRequestHeader\",\n                \"send\",\n                \"abort\",\n                \"getResponseHeader\",\n                \"getAllResponseHeaders\",\n                \"addEventListener\",\n                \"overrideMimeType\",\n                \"removeEventListener\"\n            ], function (method) {\n                fakeXhr[method] = function () {\n                    return apply(xhr, method, arguments);\n                };\n            });\n\n            var copyAttrs = function (args) {\n                each(args, function (attr) {\n                    try {\n                        fakeXhr[attr] = xhr[attr];\n                    } catch (e) {\n                        if (!IE6Re.test(navigator.userAgent)) {\n                            throw e;\n                        }\n                    }\n                });\n            };\n\n            var stateChange = function stateChange() {\n                fakeXhr.readyState = xhr.readyState;\n                if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                    copyAttrs([\"status\", \"statusText\"]);\n                }\n                if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n                    copyAttrs([\"responseText\", \"response\"]);\n                }\n                if (xhr.readyState === FakeXMLHttpRequest.DONE) {\n                    copyAttrs([\"responseXML\"]);\n                }\n                if (fakeXhr.onreadystatechange) {\n                    fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });\n                }\n            };\n\n            if (xhr.addEventListener) {\n                for (var event in fakeXhr.eventListeners) {\n                    if (fakeXhr.eventListeners.hasOwnProperty(event)) {\n\n                        /*eslint-disable no-loop-func*/\n                        each(fakeXhr.eventListeners[event], function (handler) {\n                            xhr.addEventListener(event, handler);\n                        });\n                        /*eslint-enable no-loop-func*/\n                    }\n                }\n                xhr.addEventListener(\"readystatechange\", stateChange);\n            } else {\n                xhr.onreadystatechange = stateChange;\n            }\n            apply(xhr, \"open\", xhrArgs);\n        };\n        FakeXMLHttpRequest.useFilters = false;\n\n        function verifyRequestOpened(xhr) {\n            if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n                throw new Error(\"INVALID_STATE_ERR - \" + xhr.readyState);\n            }\n        }\n\n        function verifyRequestSent(xhr) {\n            if (xhr.readyState === FakeXMLHttpRequest.DONE) {\n                throw new Error(\"Request done\");\n            }\n        }\n\n        function verifyHeadersReceived(xhr) {\n            if (xhr.async && xhr.readyState !== FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                throw new Error(\"No headers received\");\n            }\n        }\n\n        function verifyResponseBodyType(body) {\n            if (typeof body !== \"string\") {\n                var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n                                     body + \", which is not a string.\");\n                error.name = \"InvalidBodyException\";\n                throw error;\n            }\n        }\n\n        function convertToArrayBuffer(body) {\n            var buffer = new ArrayBuffer(body.length);\n            var view = new Uint8Array(buffer);\n            for (var i = 0; i < body.length; i++) {\n                var charCode = body.charCodeAt(i);\n                if (charCode >= 256) {\n                    throw new TypeError(\"arraybuffer or blob responseTypes require binary string, \" +\n                                        \"invalid character \" + body[i] + \" found.\");\n                }\n                view[i] = charCode;\n            }\n            return buffer;\n        }\n\n        function isXmlContentType(contentType) {\n            return !contentType || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(contentType);\n        }\n\n        function convertResponseBody(responseType, contentType, body) {\n            if (responseType === \"\" || responseType === \"text\") {\n                return body;\n            } else if (supportsArrayBuffer && responseType === \"arraybuffer\") {\n                return convertToArrayBuffer(body);\n            } else if (responseType === \"json\") {\n                try {\n                    return JSON.parse(body);\n                } catch (e) {\n                    // Return parsing failure as null\n                    return null;\n                }\n            } else if (supportsBlob && responseType === \"blob\") {\n                var blobOptions = {};\n                if (contentType) {\n                    blobOptions.type = contentType;\n                }\n                return new Blob([convertToArrayBuffer(body)], blobOptions);\n            } else if (responseType === \"document\") {\n                if (isXmlContentType(contentType)) {\n                    return FakeXMLHttpRequest.parseXML(body);\n                }\n                return null;\n            }\n            throw new Error(\"Invalid responseType \" + responseType);\n        }\n\n        function clearResponse(xhr) {\n            if (xhr.responseType === \"\" || xhr.responseType === \"text\") {\n                xhr.response = xhr.responseText = \"\";\n            } else {\n                xhr.response = xhr.responseText = null;\n            }\n            xhr.responseXML = null;\n        }\n\n        FakeXMLHttpRequest.parseXML = function parseXML(text) {\n            // Treat empty string as parsing failure\n            if (text !== \"\") {\n                try {\n                    if (typeof DOMParser !== \"undefined\") {\n                        var parser = new DOMParser();\n                        return parser.parseFromString(text, \"text/xml\");\n                    }\n                    var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n                    xmlDoc.async = \"false\";\n                    xmlDoc.loadXML(text);\n                    return xmlDoc;\n                } catch (e) {\n                    // Unable to parse XML - no biggie\n                }\n            }\n\n            return null;\n        };\n\n        FakeXMLHttpRequest.statusCodes = {\n            100: \"Continue\",\n            101: \"Switching Protocols\",\n            200: \"OK\",\n            201: \"Created\",\n            202: \"Accepted\",\n            203: \"Non-Authoritative Information\",\n            204: \"No Content\",\n            205: \"Reset Content\",\n            206: \"Partial Content\",\n            207: \"Multi-Status\",\n            300: \"Multiple Choice\",\n            301: \"Moved Permanently\",\n            302: \"Found\",\n            303: \"See Other\",\n            304: \"Not Modified\",\n            305: \"Use Proxy\",\n            307: \"Temporary Redirect\",\n            400: \"Bad Request\",\n            401: \"Unauthorized\",\n            402: \"Payment Required\",\n            403: \"Forbidden\",\n            404: \"Not Found\",\n            405: \"Method Not Allowed\",\n            406: \"Not Acceptable\",\n            407: \"Proxy Authentication Required\",\n            408: \"Request Timeout\",\n            409: \"Conflict\",\n            410: \"Gone\",\n            411: \"Length Required\",\n            412: \"Precondition Failed\",\n            413: \"Request Entity Too Large\",\n            414: \"Request-URI Too Long\",\n            415: \"Unsupported Media Type\",\n            416: \"Requested Range Not Satisfiable\",\n            417: \"Expectation Failed\",\n            422: \"Unprocessable Entity\",\n            500: \"Internal Server Error\",\n            501: \"Not Implemented\",\n            502: \"Bad Gateway\",\n            503: \"Service Unavailable\",\n            504: \"Gateway Timeout\",\n            505: \"HTTP Version Not Supported\"\n        };\n\n        function makeApi(sinon) {\n            sinon.xhr = sinonXhr;\n\n            sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {\n                async: true,\n\n                open: function open(method, url, async, username, password) {\n                    this.method = method;\n                    this.url = url;\n                    this.async = typeof async === \"boolean\" ? async : true;\n                    this.username = username;\n                    this.password = password;\n                    clearResponse(this);\n                    this.requestHeaders = {};\n                    this.sendFlag = false;\n\n                    if (FakeXMLHttpRequest.useFilters === true) {\n                        var xhrArgs = arguments;\n                        var defake = some(FakeXMLHttpRequest.filters, function (filter) {\n                            return filter.apply(this, xhrArgs);\n                        });\n                        if (defake) {\n                            return FakeXMLHttpRequest.defake(this, arguments);\n                        }\n                    }\n                    this.readyStateChange(FakeXMLHttpRequest.OPENED);\n                },\n\n                readyStateChange: function readyStateChange(state) {\n                    this.readyState = state;\n\n                    var readyStateChangeEvent = new sinon.Event(\"readystatechange\", false, false, this);\n\n                    if (typeof this.onreadystatechange === \"function\") {\n                        try {\n                            this.onreadystatechange(readyStateChangeEvent);\n                        } catch (e) {\n                            sinon.logError(\"Fake XHR onreadystatechange handler\", e);\n                        }\n                    }\n\n                    switch (this.readyState) {\n                        case FakeXMLHttpRequest.DONE:\n                            if (supportsProgress) {\n                                this.upload.dispatchEvent(new sinon.ProgressEvent(\"progress\", { loaded: 100, total: 100 }));\n                                this.dispatchEvent(new sinon.ProgressEvent(\"progress\", { loaded: 100, total: 100 }));\n                            }\n                            this.upload.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n                            this.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n                            this.dispatchEvent(new sinon.Event(\"loadend\", false, false, this));\n                            break;\n                    }\n\n                    this.dispatchEvent(readyStateChangeEvent);\n                },\n\n                setRequestHeader: function setRequestHeader(header, value) {\n                    verifyState(this);\n\n                    if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n                        throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n                    }\n\n                    if (this.requestHeaders[header]) {\n                        this.requestHeaders[header] += \",\" + value;\n                    } else {\n                        this.requestHeaders[header] = value;\n                    }\n                },\n\n                // Helps testing\n                setResponseHeaders: function setResponseHeaders(headers) {\n                    verifyRequestOpened(this);\n                    this.responseHeaders = {};\n\n                    for (var header in headers) {\n                        if (headers.hasOwnProperty(header)) {\n                            this.responseHeaders[header] = headers[header];\n                        }\n                    }\n\n                    if (this.async) {\n                        this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n                    } else {\n                        this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n                    }\n                },\n\n                // Currently treats ALL data as a DOMString (i.e. no Document)\n                send: function send(data) {\n                    verifyState(this);\n\n                    if (!/^(get|head)$/i.test(this.method)) {\n                        var contentType = getHeader(this.requestHeaders, \"Content-Type\");\n                        if (this.requestHeaders[contentType]) {\n                            var value = this.requestHeaders[contentType].split(\";\");\n                            this.requestHeaders[contentType] = value[0] + \";charset=utf-8\";\n                        } else if (supportsFormData && !(data instanceof FormData)) {\n                            this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n                        }\n\n                        this.requestBody = data;\n                    }\n\n                    this.errorFlag = false;\n                    this.sendFlag = this.async;\n                    clearResponse(this);\n                    this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\n                    if (typeof this.onSend === \"function\") {\n                        this.onSend(this);\n                    }\n\n                    this.dispatchEvent(new sinon.Event(\"loadstart\", false, false, this));\n                },\n\n                abort: function abort() {\n                    this.aborted = true;\n                    clearResponse(this);\n                    this.errorFlag = true;\n                    this.requestHeaders = {};\n                    this.responseHeaders = {};\n\n                    if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n                        this.readyStateChange(FakeXMLHttpRequest.DONE);\n                        this.sendFlag = false;\n                    }\n\n                    this.readyState = FakeXMLHttpRequest.UNSENT;\n\n                    this.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n\n                    this.upload.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n\n                    if (typeof this.onerror === \"function\") {\n                        this.onerror();\n                    }\n                },\n\n                getResponseHeader: function getResponseHeader(header) {\n                    if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                        return null;\n                    }\n\n                    if (/^Set-Cookie2?$/i.test(header)) {\n                        return null;\n                    }\n\n                    header = getHeader(this.responseHeaders, header);\n\n                    return this.responseHeaders[header] || null;\n                },\n\n                getAllResponseHeaders: function getAllResponseHeaders() {\n                    if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                        return \"\";\n                    }\n\n                    var headers = \"\";\n\n                    for (var header in this.responseHeaders) {\n                        if (this.responseHeaders.hasOwnProperty(header) &&\n                            !/^Set-Cookie2?$/i.test(header)) {\n                            headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\";\n                        }\n                    }\n\n                    return headers;\n                },\n\n                setResponseBody: function setResponseBody(body) {\n                    verifyRequestSent(this);\n                    verifyHeadersReceived(this);\n                    verifyResponseBodyType(body);\n                    var contentType = this.getResponseHeader(\"Content-Type\");\n\n                    var isTextResponse = this.responseType === \"\" || this.responseType === \"text\";\n                    clearResponse(this);\n                    if (this.async) {\n                        var chunkSize = this.chunkSize || 10;\n                        var index = 0;\n\n                        do {\n                            this.readyStateChange(FakeXMLHttpRequest.LOADING);\n\n                            if (isTextResponse) {\n                                this.responseText = this.response += body.substring(index, index + chunkSize);\n                            }\n                            index += chunkSize;\n                        } while (index < body.length);\n                    }\n\n                    this.response = convertResponseBody(this.responseType, contentType, body);\n                    if (isTextResponse) {\n                        this.responseText = this.response;\n                    }\n\n                    if (this.responseType === \"document\") {\n                        this.responseXML = this.response;\n                    } else if (this.responseType === \"\" && isXmlContentType(contentType)) {\n                        this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n                    }\n                    this.readyStateChange(FakeXMLHttpRequest.DONE);\n                },\n\n                respond: function respond(status, headers, body) {\n                    this.status = typeof status === \"number\" ? status : 200;\n                    this.statusText = FakeXMLHttpRequest.statusCodes[this.status];\n                    this.setResponseHeaders(headers || {});\n                    this.setResponseBody(body || \"\");\n                },\n\n                uploadProgress: function uploadProgress(progressEventRaw) {\n                    if (supportsProgress) {\n                        this.upload.dispatchEvent(new sinon.ProgressEvent(\"progress\", progressEventRaw));\n                    }\n                },\n\n                downloadProgress: function downloadProgress(progressEventRaw) {\n                    if (supportsProgress) {\n                        this.dispatchEvent(new sinon.ProgressEvent(\"progress\", progressEventRaw));\n                    }\n                },\n\n                uploadError: function uploadError(error) {\n                    if (supportsCustomEvent) {\n                        this.upload.dispatchEvent(new sinon.CustomEvent(\"error\", { detail: error }));\n                    }\n                }\n            });\n\n            sinon.extend(FakeXMLHttpRequest, {\n                UNSENT: 0,\n                OPENED: 1,\n                HEADERS_RECEIVED: 2,\n                LOADING: 3,\n                DONE: 4\n            });\n\n            sinon.useFakeXMLHttpRequest = function () {\n                FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n                    if (sinonXhr.supportsXHR) {\n                        global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;\n                    }\n\n                    if (sinonXhr.supportsActiveX) {\n                        global.ActiveXObject = sinonXhr.GlobalActiveXObject;\n                    }\n\n                    delete FakeXMLHttpRequest.restore;\n\n                    if (keepOnCreate !== true) {\n                        delete FakeXMLHttpRequest.onCreate;\n                    }\n                };\n                if (sinonXhr.supportsXHR) {\n                    global.XMLHttpRequest = FakeXMLHttpRequest;\n                }\n\n                if (sinonXhr.supportsActiveX) {\n                    global.ActiveXObject = function ActiveXObject(objId) {\n                        if (objId === \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\n                            return new FakeXMLHttpRequest();\n                        }\n\n                        return new sinonXhr.GlobalActiveXObject(objId);\n                    };\n                }\n\n                return FakeXMLHttpRequest;\n            };\n\n            sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./core\");\n            require(\"../extend\");\n            require(\"./event\");\n            require(\"../log_error\");\n            makeApi(sinon);\n            module.exports = sinon;\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon, // eslint-disable-line no-undef\n        typeof global !== \"undefined\" ? global : self\n    ));\n\n    /**\n     * @depend fake_xdomain_request.js\n     * @depend fake_xml_http_request.js\n     * @depend ../format.js\n     * @depend ../log_error.js\n     */\n    /**\n     * The Sinon \"server\" mimics a web server that receives requests from\n     * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,\n     * both synchronously and asynchronously. To respond synchronuously, canned\n     * answers have to be provided upfront.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function () {\n\n        var push = [].push;\n\n        function responseArray(handler) {\n            var response = handler;\n\n            if (Object.prototype.toString.call(handler) !== \"[object Array]\") {\n                response = [200, {}, handler];\n            }\n\n            if (typeof response[2] !== \"string\") {\n                throw new TypeError(\"Fake server response body should be string, but was \" +\n                                    typeof response[2]);\n            }\n\n            return response;\n        }\n\n        var wloc = typeof window !== \"undefined\" ? window.location : {};\n        var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\n        function matchOne(response, reqMethod, reqUrl) {\n            var rmeth = response.method;\n            var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase();\n            var url = response.url;\n            var matchUrl = !url || url === reqUrl || (typeof url.test === \"function\" && url.test(reqUrl));\n\n            return matchMethod && matchUrl;\n        }\n\n        function match(response, request) {\n            var requestUrl = request.url;\n\n            if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n                requestUrl = requestUrl.replace(rCurrLoc, \"\");\n            }\n\n            if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n                if (typeof response.response === \"function\") {\n                    var ru = response.url;\n                    var args = [request].concat(ru && typeof ru.exec === \"function\" ? ru.exec(requestUrl).slice(1) : []);\n                    return response.response.apply(response, args);\n                }\n\n                return true;\n            }\n\n            return false;\n        }\n\n        function makeApi(sinon) {\n            sinon.fakeServer = {\n                create: function (config) {\n                    var server = sinon.create(this);\n                    server.configure(config);\n                    if (!sinon.xhr.supportsCORS) {\n                        this.xhr = sinon.useFakeXDomainRequest();\n                    } else {\n                        this.xhr = sinon.useFakeXMLHttpRequest();\n                    }\n                    server.requests = [];\n\n                    this.xhr.onCreate = function (xhrObj) {\n                        server.addRequest(xhrObj);\n                    };\n\n                    return server;\n                },\n                configure: function (config) {\n                    var whitelist = {\n                        \"autoRespond\": true,\n                        \"autoRespondAfter\": true,\n                        \"respondImmediately\": true,\n                        \"fakeHTTPMethods\": true\n                    };\n                    var setting;\n\n                    config = config || {};\n                    for (setting in config) {\n                        if (whitelist.hasOwnProperty(setting) && config.hasOwnProperty(setting)) {\n                            this[setting] = config[setting];\n                        }\n                    }\n                },\n                addRequest: function addRequest(xhrObj) {\n                    var server = this;\n                    push.call(this.requests, xhrObj);\n\n                    xhrObj.onSend = function () {\n                        server.handleRequest(this);\n\n                        if (server.respondImmediately) {\n                            server.respond();\n                        } else if (server.autoRespond && !server.responding) {\n                            setTimeout(function () {\n                                server.responding = false;\n                                server.respond();\n                            }, server.autoRespondAfter || 10);\n\n                            server.responding = true;\n                        }\n                    };\n                },\n\n                getHTTPMethod: function getHTTPMethod(request) {\n                    if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n                        var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n                        return matches ? matches[1] : request.method;\n                    }\n\n                    return request.method;\n                },\n\n                handleRequest: function handleRequest(xhr) {\n                    if (xhr.async) {\n                        if (!this.queue) {\n                            this.queue = [];\n                        }\n\n                        push.call(this.queue, xhr);\n                    } else {\n                        this.processRequest(xhr);\n                    }\n                },\n\n                log: function log(response, request) {\n                    var str;\n\n                    str = \"Request:\\n\" + sinon.format(request) + \"\\n\\n\";\n                    str += \"Response:\\n\" + sinon.format(response) + \"\\n\\n\";\n\n                    sinon.log(str);\n                },\n\n                respondWith: function respondWith(method, url, body) {\n                    if (arguments.length === 1 && typeof method !== \"function\") {\n                        this.response = responseArray(method);\n                        return;\n                    }\n\n                    if (!this.responses) {\n                        this.responses = [];\n                    }\n\n                    if (arguments.length === 1) {\n                        body = method;\n                        url = method = null;\n                    }\n\n                    if (arguments.length === 2) {\n                        body = url;\n                        url = method;\n                        method = null;\n                    }\n\n                    push.call(this.responses, {\n                        method: method,\n                        url: url,\n                        response: typeof body === \"function\" ? body : responseArray(body)\n                    });\n                },\n\n                respond: function respond() {\n                    if (arguments.length > 0) {\n                        this.respondWith.apply(this, arguments);\n                    }\n\n                    var queue = this.queue || [];\n                    var requests = queue.splice(0, queue.length);\n\n                    for (var i = 0; i < requests.length; i++) {\n                        this.processRequest(requests[i]);\n                    }\n                },\n\n                processRequest: function processRequest(request) {\n                    try {\n                        if (request.aborted) {\n                            return;\n                        }\n\n                        var response = this.response || [404, {}, \"\"];\n\n                        if (this.responses) {\n                            for (var l = this.responses.length, i = l - 1; i >= 0; i--) {\n                                if (match.call(this, this.responses[i], request)) {\n                                    response = this.responses[i].response;\n                                    break;\n                                }\n                            }\n                        }\n\n                        if (request.readyState !== 4) {\n                            this.log(response, request);\n\n                            request.respond(response[0], response[1], response[2]);\n                        }\n                    } catch (e) {\n                        sinon.logError(\"Fake server request processing\", e);\n                    }\n                },\n\n                restore: function restore() {\n                    return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n                }\n            };\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./core\");\n            require(\"./fake_xdomain_request\");\n            require(\"./fake_xml_http_request\");\n            require(\"../format\");\n            makeApi(sinon);\n            module.exports = sinon;\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n        } else if (isNode) {\n            loadDependencies(require, module.exports, module);\n        } else {\n            makeApi(sinon); // eslint-disable-line no-undef\n        }\n    }());\n\n    /**\n     * @depend fake_server.js\n     * @depend fake_timers.js\n     */\n    /**\n     * Add-on for sinon.fakeServer that automatically handles a fake timer along with\n     * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery\n     * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,\n     * it polls the object for completion with setInterval. Dispite the direct\n     * motivation, there is nothing jQuery-specific in this file, so it can be used\n     * in any environment where the ajax implementation depends on setInterval or\n     * setTimeout.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function () {\n\n        function makeApi(sinon) {\n            function Server() { }\n            Server.prototype = sinon.fakeServer;\n\n            sinon.fakeServerWithClock = new Server();\n\n            sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {\n                if (xhr.async) {\n                    if (typeof setTimeout.clock === \"object\") {\n                        this.clock = setTimeout.clock;\n                    } else {\n                        this.clock = sinon.useFakeTimers();\n                        this.resetClock = true;\n                    }\n\n                    if (!this.longestTimeout) {\n                        var clockSetTimeout = this.clock.setTimeout;\n                        var clockSetInterval = this.clock.setInterval;\n                        var server = this;\n\n                        this.clock.setTimeout = function (fn, timeout) {\n                            server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                            return clockSetTimeout.apply(this, arguments);\n                        };\n\n                        this.clock.setInterval = function (fn, timeout) {\n                            server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                            return clockSetInterval.apply(this, arguments);\n                        };\n                    }\n                }\n\n                return sinon.fakeServer.addRequest.call(this, xhr);\n            };\n\n            sinon.fakeServerWithClock.respond = function respond() {\n                var returnVal = sinon.fakeServer.respond.apply(this, arguments);\n\n                if (this.clock) {\n                    this.clock.tick(this.longestTimeout || 0);\n                    this.longestTimeout = 0;\n\n                    if (this.resetClock) {\n                        this.clock.restore();\n                        this.resetClock = false;\n                    }\n                }\n\n                return returnVal;\n            };\n\n            sinon.fakeServerWithClock.restore = function restore() {\n                if (this.clock) {\n                    this.clock.restore();\n                }\n\n                return sinon.fakeServer.restore.apply(this, arguments);\n            };\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require) {\n            var sinon = require(\"./core\");\n            require(\"./fake_server\");\n            require(\"./fake_timers\");\n            makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n        } else if (isNode) {\n            loadDependencies(require);\n        } else {\n            makeApi(sinon); // eslint-disable-line no-undef\n        }\n    }());\n\n    /**\n     * @depend util/core.js\n     * @depend extend.js\n     * @depend collection.js\n     * @depend util/fake_timers.js\n     * @depend util/fake_server_with_clock.js\n     */\n    /**\n     * Manages fake collections as well as fake utilities such as Sinon's\n     * timers and fake XHR implementation in one convenient object.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            var push = [].push;\n\n            function exposeValue(sandbox, config, key, value) {\n                if (!value) {\n                    return;\n                }\n\n                if (config.injectInto && !(key in config.injectInto)) {\n                    config.injectInto[key] = value;\n                    sandbox.injectedKeys.push(key);\n                } else {\n                    push.call(sandbox.args, value);\n                }\n            }\n\n            function prepareSandboxFromConfig(config) {\n                var sandbox = sinon.create(sinon.sandbox);\n\n                if (config.useFakeServer) {\n                    if (typeof config.useFakeServer === \"object\") {\n                        sandbox.serverPrototype = config.useFakeServer;\n                    }\n\n                    sandbox.useFakeServer();\n                }\n\n                if (config.useFakeTimers) {\n                    if (typeof config.useFakeTimers === \"object\") {\n                        sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n                    } else {\n                        sandbox.useFakeTimers();\n                    }\n                }\n\n                return sandbox;\n            }\n\n            sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {\n                useFakeTimers: function useFakeTimers() {\n                    this.clock = sinon.useFakeTimers.apply(sinon, arguments);\n\n                    return this.add(this.clock);\n                },\n\n                serverPrototype: sinon.fakeServer,\n\n                useFakeServer: function useFakeServer() {\n                    var proto = this.serverPrototype || sinon.fakeServer;\n\n                    if (!proto || !proto.create) {\n                        return null;\n                    }\n\n                    this.server = proto.create();\n                    return this.add(this.server);\n                },\n\n                inject: function (obj) {\n                    sinon.collection.inject.call(this, obj);\n\n                    if (this.clock) {\n                        obj.clock = this.clock;\n                    }\n\n                    if (this.server) {\n                        obj.server = this.server;\n                        obj.requests = this.server.requests;\n                    }\n\n                    obj.match = sinon.match;\n\n                    return obj;\n                },\n\n                restore: function () {\n                    sinon.collection.restore.apply(this, arguments);\n                    this.restoreContext();\n                },\n\n                restoreContext: function () {\n                    if (this.injectedKeys) {\n                        for (var i = 0, j = this.injectedKeys.length; i < j; i++) {\n                            delete this.injectInto[this.injectedKeys[i]];\n                        }\n                        this.injectedKeys = [];\n                    }\n                },\n\n                create: function (config) {\n                    if (!config) {\n                        return sinon.create(sinon.sandbox);\n                    }\n\n                    var sandbox = prepareSandboxFromConfig(config);\n                    sandbox.args = sandbox.args || [];\n                    sandbox.injectedKeys = [];\n                    sandbox.injectInto = config.injectInto;\n                    var prop,\n                        value;\n                    var exposed = sandbox.inject({});\n\n                    if (config.properties) {\n                        for (var i = 0, l = config.properties.length; i < l; i++) {\n                            prop = config.properties[i];\n                            value = exposed[prop] || prop === \"sandbox\" && sandbox;\n                            exposeValue(sandbox, config, prop, value);\n                        }\n                    } else {\n                        exposeValue(sandbox, config, \"sandbox\", value);\n                    }\n\n                    return sandbox;\n                },\n\n                match: sinon.match\n            });\n\n            sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;\n\n            return sinon.sandbox;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            require(\"./extend\");\n            require(\"./util/fake_server_with_clock\");\n            require(\"./util/fake_timers\");\n            require(\"./collection\");\n            module.exports = makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend util/core.js\n     * @depend sandbox.js\n     */\n    /**\n     * Test function, sandboxes fakes\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        function makeApi(sinon) {\n            var slice = Array.prototype.slice;\n\n            function test(callback) {\n                var type = typeof callback;\n\n                if (type !== \"function\") {\n                    throw new TypeError(\"sinon.test needs to wrap a test function, got \" + type);\n                }\n\n                function sinonSandboxedTest() {\n                    var config = sinon.getConfig(sinon.config);\n                    config.injectInto = config.injectIntoThis && this || config.injectInto;\n                    var sandbox = sinon.sandbox.create(config);\n                    var args = slice.call(arguments);\n                    var oldDone = args.length && args[args.length - 1];\n                    var exception, result;\n\n                    if (typeof oldDone === \"function\") {\n                        args[args.length - 1] = function sinonDone(res) {\n                            if (res) {\n                                sandbox.restore();\n                            } else {\n                                sandbox.verifyAndRestore();\n                            }\n                            oldDone(res);\n                        };\n                    }\n\n                    try {\n                        result = callback.apply(this, args.concat(sandbox.args));\n                    } catch (e) {\n                        exception = e;\n                    }\n\n                    if (typeof oldDone !== \"function\") {\n                        if (typeof exception !== \"undefined\") {\n                            sandbox.restore();\n                            throw exception;\n                        } else {\n                            sandbox.verifyAndRestore();\n                        }\n                    }\n\n                    return result;\n                }\n\n                if (callback.length) {\n                    return function sinonAsyncSandboxedTest(done) { // eslint-disable-line no-unused-vars\n                        return sinonSandboxedTest.apply(this, arguments);\n                    };\n                }\n\n                return sinonSandboxedTest;\n            }\n\n            test.config = {\n                injectIntoThis: true,\n                injectInto: null,\n                properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n                useFakeTimers: true,\n                useFakeServer: true\n            };\n\n            sinon.test = test;\n            return test;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var core = require(\"./util/core\");\n            require(\"./sandbox\");\n            module.exports = makeApi(core);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n        } else if (isNode) {\n            loadDependencies(require, module.exports, module);\n        } else if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(typeof sinon === \"object\" && sinon || null)); // eslint-disable-line no-undef\n\n    /**\n     * @depend util/core.js\n     * @depend test.js\n     */\n    /**\n     * Test case, sandboxes all test functions\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal) {\n\n        function createTest(property, setUp, tearDown) {\n            return function () {\n                if (setUp) {\n                    setUp.apply(this, arguments);\n                }\n\n                var exception, result;\n\n                try {\n                    result = property.apply(this, arguments);\n                } catch (e) {\n                    exception = e;\n                }\n\n                if (tearDown) {\n                    tearDown.apply(this, arguments);\n                }\n\n                if (exception) {\n                    throw exception;\n                }\n\n                return result;\n            };\n        }\n\n        function makeApi(sinon) {\n            function testCase(tests, prefix) {\n                if (!tests || typeof tests !== \"object\") {\n                    throw new TypeError(\"sinon.testCase needs an object with test functions\");\n                }\n\n                prefix = prefix || \"test\";\n                var rPrefix = new RegExp(\"^\" + prefix);\n                var methods = {};\n                var setUp = tests.setUp;\n                var tearDown = tests.tearDown;\n                var testName,\n                    property,\n                    method;\n\n                for (testName in tests) {\n                    if (tests.hasOwnProperty(testName) && !/^(setUp|tearDown)$/.test(testName)) {\n                        property = tests[testName];\n\n                        if (typeof property === \"function\" && rPrefix.test(testName)) {\n                            method = property;\n\n                            if (setUp || tearDown) {\n                                method = createTest(property, setUp, tearDown);\n                            }\n\n                            methods[testName] = sinon.test(method);\n                        } else {\n                            methods[testName] = tests[testName];\n                        }\n                    }\n                }\n\n                return methods;\n            }\n\n            sinon.testCase = testCase;\n            return testCase;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var core = require(\"./util/core\");\n            require(\"./test\");\n            module.exports = makeApi(core);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon // eslint-disable-line no-undef\n    ));\n\n    /**\n     * @depend times_in_words.js\n     * @depend util/core.js\n     * @depend match.js\n     * @depend format.js\n     */\n    /**\n     * Assertions matching the test spy retrieval interface.\n     *\n     * @author Christian Johansen (christian@cjohansen.no)\n     * @license BSD\n     *\n     * Copyright (c) 2010-2013 Christian Johansen\n     */\n    (function (sinonGlobal, global) {\n\n        var slice = Array.prototype.slice;\n\n        function makeApi(sinon) {\n            var assert;\n\n            function verifyIsStub() {\n                var method;\n\n                for (var i = 0, l = arguments.length; i < l; ++i) {\n                    method = arguments[i];\n\n                    if (!method) {\n                        assert.fail(\"fake is not a spy\");\n                    }\n\n                    if (method.proxy && method.proxy.isSinonProxy) {\n                        verifyIsStub(method.proxy);\n                    } else {\n                        if (typeof method !== \"function\") {\n                            assert.fail(method + \" is not a function\");\n                        }\n\n                        if (typeof method.getCall !== \"function\") {\n                            assert.fail(method + \" is not stubbed\");\n                        }\n                    }\n\n                }\n            }\n\n            function failAssertion(object, msg) {\n                object = object || global;\n                var failMethod = object.fail || assert.fail;\n                failMethod.call(object, msg);\n            }\n\n            function mirrorPropAsAssertion(name, method, message) {\n                if (arguments.length === 2) {\n                    message = method;\n                    method = name;\n                }\n\n                assert[name] = function (fake) {\n                    verifyIsStub(fake);\n\n                    var args = slice.call(arguments, 1);\n                    var failed = false;\n\n                    if (typeof method === \"function\") {\n                        failed = !method(fake);\n                    } else {\n                        failed = typeof fake[method] === \"function\" ?\n                            !fake[method].apply(fake, args) : !fake[method];\n                    }\n\n                    if (failed) {\n                        failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, [message].concat(args)));\n                    } else {\n                        assert.pass(name);\n                    }\n                };\n            }\n\n            function exposedName(prefix, prop) {\n                return !prefix || /^fail/.test(prop) ? prop :\n                    prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n            }\n\n            assert = {\n                failException: \"AssertError\",\n\n                fail: function fail(message) {\n                    var error = new Error(message);\n                    error.name = this.failException || assert.failException;\n\n                    throw error;\n                },\n\n                pass: function pass() { },\n\n                callOrder: function assertCallOrder() {\n                    verifyIsStub.apply(null, arguments);\n                    var expected = \"\";\n                    var actual = \"\";\n\n                    if (!sinon.calledInOrder(arguments)) {\n                        try {\n                            expected = [].join.call(arguments, \", \");\n                            var calls = slice.call(arguments);\n                            var i = calls.length;\n                            while (i) {\n                                if (!calls[--i].called) {\n                                    calls.splice(i, 1);\n                                }\n                            }\n                            actual = sinon.orderByFirstCall(calls).join(\", \");\n                        } catch (e) {\n                            // If this fails, we'll just fall back to the blank string\n                        }\n\n                        failAssertion(this, \"expected \" + expected + \" to be \" +\n                                    \"called in order but were called as \" + actual);\n                    } else {\n                        assert.pass(\"callOrder\");\n                    }\n                },\n\n                callCount: function assertCallCount(method, count) {\n                    verifyIsStub(method);\n\n                    if (method.callCount !== count) {\n                        var msg = \"expected %n to be called \" + sinon.timesInWords(count) +\n                            \" but was called %c%C\";\n                        failAssertion(this, method.printf(msg));\n                    } else {\n                        assert.pass(\"callCount\");\n                    }\n                },\n\n                expose: function expose(target, options) {\n                    if (!target) {\n                        throw new TypeError(\"target is null or undefined\");\n                    }\n\n                    var o = options || {};\n                    var prefix = typeof o.prefix === \"undefined\" && \"assert\" || o.prefix;\n                    var includeFail = typeof o.includeFail === \"undefined\" || !!o.includeFail;\n\n                    for (var method in this) {\n                        if (method !== \"expose\" && (includeFail || !/^(fail)/.test(method))) {\n                            target[exposedName(prefix, method)] = this[method];\n                        }\n                    }\n\n                    return target;\n                },\n\n                match: function match(actual, expectation) {\n                    var matcher = sinon.match(expectation);\n                    if (matcher.test(actual)) {\n                        assert.pass(\"match\");\n                    } else {\n                        var formatted = [\n                            \"expected value to match\",\n                            \"    expected = \" + sinon.format(expectation),\n                            \"    actual = \" + sinon.format(actual)\n                        ];\n\n                        failAssertion(this, formatted.join(\"\\n\"));\n                    }\n                }\n            };\n\n            mirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\n            mirrorPropAsAssertion(\"notCalled\", function (spy) {\n                return !spy.called;\n            }, \"expected %n to not have been called but was called %c%C\");\n            mirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\n            mirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\n            mirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\n            mirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\n            mirrorPropAsAssertion(\n                \"alwaysCalledOn\",\n                \"expected %n to always be called with %1 as this but was called with %t\"\n            );\n            mirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\n            mirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\n            mirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %*%C\");\n            mirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %*%C\");\n            mirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %*%C\");\n            mirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %*%C\");\n            mirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %*%C\");\n            mirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %*%C\");\n            mirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\n            mirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\n            mirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\n            mirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\n            sinon.assert = assert;\n            return assert;\n        }\n\n        var isNode = typeof module !== \"undefined\" && module.exports && typeof require === \"function\";\n        var isAMD = typeof define === \"function\" && typeof define.amd === \"object\" && define.amd;\n\n        function loadDependencies(require, exports, module) {\n            var sinon = require(\"./util/core\");\n            require(\"./match\");\n            require(\"./format\");\n            module.exports = makeApi(sinon);\n        }\n\n        if (isAMD) {\n            define(loadDependencies);\n            return;\n        }\n\n        if (isNode) {\n            loadDependencies(require, module.exports, module);\n            return;\n        }\n\n        if (sinonGlobal) {\n            makeApi(sinonGlobal);\n        }\n    }(\n        typeof sinon === \"object\" && sinon, // eslint-disable-line no-undef\n        typeof global !== \"undefined\" ? global : self\n    ));\n\n    return sinon;\n}));"
  },
  {
    "path": "common/Tests/External/sinon-2.3.8.js",
    "content": "/* Sinon.JS 2.3.8, 2017-07-13, @license BSD-3 */(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.sinon = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n\"use strict\";\n\nvar match = require(\"./sinon/match\");\nvar deepEqual = require(\"./sinon/util/core/deep-equal\");\nvar deprecated = require(\"./sinon/util/core/deprecated\");\n\nfunction exposeCoreUtils(target, utils) {\n    var keys = Object.keys(utils);\n\n    keys.forEach(function (key) {\n        var value = utils[key];\n\n        // allow deepEqual to check equality of matchers through dependency injection. Otherwise we get a circular\n        // dependency\n        if (key === \"deepEqual\") {\n            value = deepEqual.use(match);\n        }\n        if (typeof value === \"function\") {\n            value = deprecated.wrap(value, deprecated.defaultMsg(key));\n        }\n        target[key] = value;\n    });\n}\n\nfunction exposeEventTarget(target, eventTarget) {\n    var keys = Object.keys(eventTarget);\n\n    keys.forEach(function (key) {\n        target[key] = deprecated.wrap(eventTarget[key], deprecated.defaultMsg(\"EventTarget\"));\n    });\n}\n\n// Expose internal utilities on `sinon` global for backwards compatibility.\nexposeCoreUtils(exports, require(\"./sinon/util/core/index\"));\n\nexports.assert = require(\"./sinon/assert\");\nexports.collection = require(\"./sinon/collection\");\nexports.match = match;\nexports.spy = require(\"./sinon/spy\");\nexports.spyCall = require(\"./sinon/call\");\nexports.stub = require(\"./sinon/stub\");\nexports.mock = require(\"./sinon/mock\");\nexports.sandbox = require(\"./sinon/sandbox\");\nexports.expectation = require(\"./sinon/mock-expectation\");\nexports.createStubInstance = require(\"./sinon/stub\").createStubInstance;\n\nvar fakeTimers = require(\"./sinon/util/fake_timers\");\nexports.useFakeTimers = fakeTimers.useFakeTimers;\nexports.clock = fakeTimers.clock;\nexports.timers = fakeTimers.timers;\n\nvar event = require(\"./sinon/util/event\");\nexports.Event = deprecated.wrap(event.Event, deprecated.defaultMsg(\"Event\"));\nexports.CustomEvent = deprecated.wrap(event.CustomEvent, deprecated.defaultMsg(\"CustomEvent\"));\nexports.ProgressEvent = deprecated.wrap(event.ProgressEvent, deprecated.defaultMsg(\"ProgressEvent\"));\nexports.EventTarget = {};\nexposeEventTarget(exports.EventTarget, event.EventTarget);\n\nvar fakeXhr = require(\"./sinon/util/fake_xml_http_request\");\nexports.xhr = fakeXhr.xhr;\nexports.FakeXMLHttpRequest = fakeXhr.FakeXMLHttpRequest;\nexports.useFakeXMLHttpRequest = fakeXhr.useFakeXMLHttpRequest;\n\nexports.fakeServer = require(\"./sinon/util/fake_server\");\nexports.fakeServerWithClock = require(\"./sinon/util/fake_server_with_clock\");\n\nvar behavior = require(\"./sinon/behavior\");\n\nexports.addBehavior = function (name, fn) {\n    behavior.addBehavior(exports.stub, name, fn);\n};\n\n},{\"./sinon/assert\":2,\"./sinon/behavior\":3,\"./sinon/call\":5,\"./sinon/collection\":7,\"./sinon/match\":10,\"./sinon/mock\":12,\"./sinon/mock-expectation\":11,\"./sinon/sandbox\":14,\"./sinon/spy\":16,\"./sinon/stub\":20,\"./sinon/util/core/deep-equal\":23,\"./sinon/util/core/deprecated\":25,\"./sinon/util/core/index\":33,\"./sinon/util/event\":43,\"./sinon/util/fake_server\":44,\"./sinon/util/fake_server_with_clock\":45,\"./sinon/util/fake_timers\":46,\"./sinon/util/fake_xml_http_request\":47}],2:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar calledInOrder = require(\"./util/core/called-in-order\");\nvar orderByFirstCall = require(\"./util/core/order-by-first-call\");\nvar timesInWords = require(\"./util/core/times-in-words\");\nvar format = require(\"./util/core/format\");\nvar sinonMatch = require(\"./match\");\n\nvar slice = Array.prototype.slice;\n\nvar assert;\n\nfunction verifyIsStub() {\n    var args = Array.prototype.slice.call(arguments);\n\n    args.forEach(function (method) {\n        if (!method) {\n            assert.fail(\"fake is not a spy\");\n        }\n\n        if (method.proxy && method.proxy.isSinonProxy) {\n            verifyIsStub(method.proxy);\n        } else {\n            if (typeof method !== \"function\") {\n                assert.fail(method + \" is not a function\");\n            }\n\n            if (typeof method.getCall !== \"function\") {\n                assert.fail(method + \" is not stubbed\");\n            }\n        }\n    });\n}\n\nfunction verifyIsValidAssertion(assertionMethod, assertionArgs) {\n    switch (assertionMethod) {\n        case \"notCalled\":\n        case \"called\":\n        case \"calledOnce\":\n        case \"calledTwice\":\n        case \"calledThrice\":\n            if (assertionArgs.length !== 0) {\n                assert.fail(assertionMethod +\n                            \" takes 1 argument but was called with \" + (assertionArgs.length + 1) + \" arguments\");\n            }\n            break;\n        default:\n            break;\n    }\n}\n\nfunction failAssertion(object, msg) {\n    object = object || global;\n    var failMethod = object.fail || assert.fail;\n    failMethod.call(object, msg);\n}\n\nfunction mirrorPropAsAssertion(name, method, message) {\n    if (arguments.length === 2) {\n        message = method;\n        method = name;\n    }\n\n    assert[name] = function (fake) {\n        verifyIsStub(fake);\n\n        var args = slice.call(arguments, 1);\n        var failed = false;\n\n        verifyIsValidAssertion(name, args);\n\n        if (typeof method === \"function\") {\n            failed = !method(fake);\n        } else {\n            failed = typeof fake[method] === \"function\" ?\n                !fake[method].apply(fake, args) : !fake[method];\n        }\n\n        if (failed) {\n            failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, [message].concat(args)));\n        } else {\n            assert.pass(name);\n        }\n    };\n}\n\nfunction exposedName(prefix, prop) {\n    return !prefix || /^fail/.test(prop) ? prop :\n        prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n}\n\nassert = {\n    failException: \"AssertError\",\n\n    fail: function fail(message) {\n        var error = new Error(message);\n        error.name = this.failException || assert.failException;\n\n        throw error;\n    },\n\n    pass: function pass() {},\n\n    callOrder: function assertCallOrder() {\n        verifyIsStub.apply(null, arguments);\n        var expected = \"\";\n        var actual = \"\";\n\n        if (!calledInOrder(arguments)) {\n            try {\n                expected = [].join.call(arguments, \", \");\n                var calls = slice.call(arguments);\n                var i = calls.length;\n                while (i) {\n                    if (!calls[--i].called) {\n                        calls.splice(i, 1);\n                    }\n                }\n                actual = orderByFirstCall(calls).join(\", \");\n            } catch (e) {\n                // If this fails, we'll just fall back to the blank string\n            }\n\n            failAssertion(this, \"expected \" + expected + \" to be \" +\n                        \"called in order but were called as \" + actual);\n        } else {\n            assert.pass(\"callOrder\");\n        }\n    },\n\n    callCount: function assertCallCount(method, count) {\n        verifyIsStub(method);\n\n        if (method.callCount !== count) {\n            var msg = \"expected %n to be called \" + timesInWords(count) +\n                \" but was called %c%C\";\n            failAssertion(this, method.printf(msg));\n        } else {\n            assert.pass(\"callCount\");\n        }\n    },\n\n    expose: function expose(target, options) {\n        if (!target) {\n            throw new TypeError(\"target is null or undefined\");\n        }\n\n        var o = options || {};\n        var prefix = typeof o.prefix === \"undefined\" && \"assert\" || o.prefix;\n        var includeFail = typeof o.includeFail === \"undefined\" || !!o.includeFail;\n        var instance = this;\n\n        Object.keys(instance).forEach(function (method) {\n            if (method !== \"expose\" && (includeFail || !/^(fail)/.test(method))) {\n                target[exposedName(prefix, method)] = instance[method];\n            }\n        });\n\n        return target;\n    },\n\n    match: function match(actual, expectation) {\n        var matcher = sinonMatch(expectation);\n        if (matcher.test(actual)) {\n            assert.pass(\"match\");\n        } else {\n            var formatted = [\n                \"expected value to match\",\n                \"    expected = \" + format(expectation),\n                \"    actual = \" + format(actual)\n            ];\n\n            failAssertion(this, formatted.join(\"\\n\"));\n        }\n    }\n};\n\nmirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\nmirrorPropAsAssertion(\"notCalled\", function (spy) {\n    return !spy.called;\n}, \"expected %n to not have been called but was called %c%C\");\nmirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\nmirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\nmirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\nmirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\nmirrorPropAsAssertion(\n    \"alwaysCalledOn\",\n    \"expected %n to always be called with %1 as this but was called with %t\"\n);\nmirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\nmirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\nmirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %D\");\nmirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %D\");\nmirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %D\");\nmirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %D\");\nmirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %D\");\nmirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %D\");\nmirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\nmirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\nmirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\nmirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\nmodule.exports = assert;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./match\":10,\"./util/core/called-in-order\":22,\"./util/core/format\":28,\"./util/core/order-by-first-call\":36,\"./util/core/times-in-words\":38}],3:[function(require,module,exports){\n(function (process){\n\"use strict\";\n\nvar extend = require(\"./util/core/extend\");\nvar functionName = require(\"./util/core/function-name\");\nvar valueToString = require(\"./util/core/value-to-string\");\n\nvar slice = Array.prototype.slice;\nvar join = Array.prototype.join;\nvar useLeftMostCallback = -1;\nvar useRightMostCallback = -2;\n\nvar nextTick = (function () {\n    if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n        return process.nextTick;\n    }\n\n    if (typeof setImmediate === \"function\") {\n        return setImmediate;\n    }\n\n    return function (callback) {\n        setTimeout(callback, 0);\n    };\n})();\n\nfunction getCallback(behavior, args) {\n    var callArgAt = behavior.callArgAt;\n\n    if (callArgAt >= 0) {\n        return args[callArgAt];\n    }\n\n    var argumentList;\n\n    if (callArgAt === useLeftMostCallback) {\n        argumentList = args;\n    }\n\n    if (callArgAt === useRightMostCallback) {\n        argumentList = slice.call(args).reverse();\n    }\n\n    var callArgProp = behavior.callArgProp;\n\n    for (var i = 0, l = argumentList.length; i < l; ++i) {\n        if (!callArgProp && typeof argumentList[i] === \"function\") {\n            return argumentList[i];\n        }\n\n        if (callArgProp && argumentList[i] &&\n            typeof argumentList[i][callArgProp] === \"function\") {\n            return argumentList[i][callArgProp];\n        }\n    }\n\n    return null;\n}\n\nfunction getCallbackError(behavior, func, args) {\n    if (behavior.callArgAt < 0) {\n        var msg;\n\n        if (behavior.callArgProp) {\n            msg = functionName(behavior.stub) +\n                \" expected to yield to '\" + valueToString(behavior.callArgProp) +\n                \"', but no object with such a property was passed.\";\n        } else {\n            msg = functionName(behavior.stub) +\n                \" expected to yield, but no callback was passed.\";\n        }\n\n        if (args.length > 0) {\n            msg += \" Received [\" + join.call(args, \", \") + \"]\";\n        }\n\n        return msg;\n    }\n\n    return \"argument at index \" + behavior.callArgAt + \" is not a function: \" + func;\n}\n\nfunction callCallback(behavior, args) {\n    if (typeof behavior.callArgAt === \"number\") {\n        var func = getCallback(behavior, args);\n\n        if (typeof func !== \"function\") {\n            throw new TypeError(getCallbackError(behavior, func, args));\n        }\n\n        if (behavior.callbackAsync) {\n            nextTick(function () {\n                func.apply(behavior.callbackContext, behavior.callbackArguments);\n            });\n        } else {\n            func.apply(behavior.callbackContext, behavior.callbackArguments);\n        }\n    }\n}\n\nvar proto = {\n    create: function create(stub) {\n        var behavior = extend({}, proto);\n        delete behavior.create;\n        delete behavior.addBehavior;\n        delete behavior.createBehavior;\n        behavior.stub = stub;\n\n        if (stub.defaultBehavior && stub.defaultBehavior.promiseLibrary) {\n            behavior.promiseLibrary = stub.defaultBehavior.promiseLibrary;\n        }\n\n        return behavior;\n    },\n\n    isPresent: function isPresent() {\n        return (typeof this.callArgAt === \"number\" ||\n                this.exception ||\n                typeof this.returnArgAt === \"number\" ||\n                this.returnThis ||\n                typeof this.throwArgAt === \"number\" ||\n                this.fakeFn ||\n                this.returnValueDefined);\n    },\n\n    invoke: function invoke(context, args) {\n        callCallback(this, args);\n\n        if (this.exception) {\n            throw this.exception;\n        } else if (typeof this.returnArgAt === \"number\") {\n            return args[this.returnArgAt];\n        } else if (this.returnThis) {\n            return context;\n        } else if (typeof this.throwArgAt === \"number\") {\n            if (args.length < this.throwArgAt) {\n                throw new TypeError(\n                    \"throwArgs failed: \" + this.throwArgAt\n                    + \" arguments required but only \" + args.length\n                    + \" present\"\n                );\n            }\n            throw args[this.throwArgAt];\n        } else if (this.fakeFn) {\n            return this.fakeFn.apply(context, args);\n        } else if (this.resolve) {\n            return (this.promiseLibrary || Promise).resolve(this.returnValue);\n        } else if (this.reject) {\n            return (this.promiseLibrary || Promise).reject(this.returnValue);\n        } else if (this.callsThrough) {\n            return this.stub.wrappedMethod.apply(context, args);\n        }\n        return this.returnValue;\n    },\n\n    onCall: function onCall(index) {\n        return this.stub.onCall(index);\n    },\n\n    onFirstCall: function onFirstCall() {\n        return this.stub.onFirstCall();\n    },\n\n    onSecondCall: function onSecondCall() {\n        return this.stub.onSecondCall();\n    },\n\n    onThirdCall: function onThirdCall() {\n        return this.stub.onThirdCall();\n    },\n\n    withArgs: function withArgs(/* arguments */) {\n        throw new Error(\n            \"Defining a stub by invoking \\\"stub.onCall(...).withArgs(...)\\\" \" +\n            \"is not supported. Use \\\"stub.withArgs(...).onCall(...)\\\" \" +\n            \"to define sequential behavior for calls with certain arguments.\"\n        );\n    }\n};\n\nfunction createAsyncVersion(syncFnName) {\n    return function () {\n        var result = this[syncFnName].apply(this, arguments);\n        this.callbackAsync = true;\n        return result;\n    };\n}\n\n// create asynchronous versions of callsArg* and yields* methods\nObject.keys(proto).forEach(function (method) {\n    // need to avoid creating anotherasync versions of the newly added async methods\n    if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) {\n        proto[method + \"Async\"] = createAsyncVersion(method);\n    }\n});\n\nfunction createBehavior(behaviorMethod) {\n    return function () {\n        this.defaultBehavior = this.defaultBehavior || proto.create(this);\n        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);\n        return this;\n    };\n}\n\nfunction addBehavior(stub, name, fn) {\n    proto[name] = function () {\n        fn.apply(this, [this].concat([].slice.call(arguments)));\n        return this.stub || this;\n    };\n\n    stub[name] = createBehavior(name);\n}\n\nproto.addBehavior = addBehavior;\nproto.createBehavior = createBehavior;\nmodule.exports = proto;\n\n}).call(this,require('_process'))\n\n},{\"./util/core/extend\":27,\"./util/core/function-name\":29,\"./util/core/value-to-string\":40,\"_process\":53}],4:[function(require,module,exports){\n/*global Blob */\n\"use strict\";\n\nexports.isSupported = (function () {\n    try {\n        return !!new Blob();\n    } catch (e) {\n        return false;\n    }\n}());\n\n},{}],5:[function(require,module,exports){\n\"use strict\";\n\nvar sinonMatch = require(\"./match\");\nvar deepEqual = require(\"./util/core/deep-equal\").use(sinonMatch);\nvar functionName = require(\"./util/core/function-name\");\nvar sinonFormat = require(\"./util/core/format\");\nvar valueToString = require(\"./util/core/value-to-string\");\nvar slice = Array.prototype.slice;\n\nfunction throwYieldError(proxy, text, args) {\n    var msg = functionName(proxy) + text;\n    if (args.length) {\n        msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n    }\n    throw new Error(msg);\n}\n\nvar callProto = {\n    calledOn: function calledOn(thisValue) {\n        if (sinonMatch && sinonMatch.isMatcher(thisValue)) {\n            return thisValue.test(this.thisValue);\n        }\n        return this.thisValue === thisValue;\n    },\n\n    calledWith: function calledWith() {\n        var self = this;\n        var calledWithArgs = slice.call(arguments);\n\n        if (calledWithArgs.length > self.args.length) {\n            return false;\n        }\n\n        return calledWithArgs.reduce(function (prev, arg, i) {\n            return prev && deepEqual(arg, self.args[i]);\n        }, true);\n    },\n\n    calledWithMatch: function calledWithMatch() {\n        var self = this;\n        var calledWithMatchArgs = slice.call(arguments);\n\n        if (calledWithMatchArgs.length > self.args.length) {\n            return false;\n        }\n\n        return calledWithMatchArgs.reduce(function (prev, expectation, i) {\n            var actual = self.args[i];\n\n            return prev && (sinonMatch && sinonMatch(expectation).test(actual));\n        }, true);\n    },\n\n    calledWithExactly: function calledWithExactly() {\n        return arguments.length === this.args.length &&\n            this.calledWith.apply(this, arguments);\n    },\n\n    notCalledWith: function notCalledWith() {\n        return !this.calledWith.apply(this, arguments);\n    },\n\n    notCalledWithMatch: function notCalledWithMatch() {\n        return !this.calledWithMatch.apply(this, arguments);\n    },\n\n    returned: function returned(value) {\n        return deepEqual(value, this.returnValue);\n    },\n\n    threw: function threw(error) {\n        if (typeof error === \"undefined\" || !this.exception) {\n            return !!this.exception;\n        }\n\n        return this.exception === error || this.exception.name === error;\n    },\n\n    calledWithNew: function calledWithNew() {\n        return this.proxy.prototype && this.thisValue instanceof this.proxy;\n    },\n\n    calledBefore: function (other) {\n        return this.callId < other.callId;\n    },\n\n    calledAfter: function (other) {\n        return this.callId > other.callId;\n    },\n\n    calledImmediatelyBefore: function (other) {\n        return this.callId === other.callId - 1;\n    },\n\n    calledImmediatelyAfter: function (other) {\n        return this.callId === other.callId + 1;\n    },\n\n    callArg: function (pos) {\n        this.args[pos]();\n    },\n\n    callArgOn: function (pos, thisValue) {\n        this.args[pos].apply(thisValue);\n    },\n\n    callArgWith: function (pos) {\n        this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n    },\n\n    callArgOnWith: function (pos, thisValue) {\n        var args = slice.call(arguments, 2);\n        this.args[pos].apply(thisValue, args);\n    },\n\n    throwArg: function (pos) {\n        if (pos > this.args.length) {\n            throw new TypeError(\n                \"Not enough arguments: \" + pos\n                + \" required but only \" + this.args.length\n                + \" present\"\n            );\n        }\n\n        throw this.args[pos];\n    },\n\n    \"yield\": function () {\n        this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n    },\n\n    yieldOn: function (thisValue) {\n        var args = slice.call(this.args);\n        var yieldFn = args.filter(function (arg) {\n            return typeof arg === \"function\";\n        })[0];\n\n        if (!yieldFn) {\n            throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n        }\n\n        yieldFn.apply(thisValue, slice.call(arguments, 1));\n    },\n\n    yieldTo: function (prop) {\n        this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n    },\n\n    yieldToOn: function (prop, thisValue) {\n        var args = slice.call(this.args);\n        var yieldArg = args.filter(function (arg) {\n            return arg && typeof arg[prop] === \"function\";\n        })[0];\n        var yieldFn = yieldArg && yieldArg[prop];\n\n        if (!yieldFn) {\n            throwYieldError(this.proxy, \" cannot yield to '\" + valueToString(prop) +\n                \"' since no callback was passed.\", args);\n        }\n\n        yieldFn.apply(thisValue, slice.call(arguments, 2));\n    },\n\n    toString: function () {\n        var callStr = this.proxy ? this.proxy.toString() + \"(\" : \"\";\n        var formattedArgs;\n\n        if (!this.args) {\n            return \":(\";\n        }\n\n        formattedArgs = slice.call(this.args).map(function (arg) {\n            return sinonFormat(arg);\n        });\n\n        callStr = callStr + formattedArgs.join(\", \") + \")\";\n\n        if (typeof this.returnValue !== \"undefined\") {\n            callStr += \" => \" + sinonFormat(this.returnValue);\n        }\n\n        if (this.exception) {\n            callStr += \" !\" + this.exception.name;\n\n            if (this.exception.message) {\n                callStr += \"(\" + this.exception.message + \")\";\n            }\n        }\n        if (this.stack) {\n            // Omit the error message and the two top stack frames in sinon itself:\n            callStr += ( this.stack.split(\"\\n\")[3] || \"unknown\" ).replace(/^\\s*(?:at\\s+|@)?/, \" at \");\n        }\n\n        return callStr;\n    }\n};\nObject.defineProperty(callProto, \"stack\", {\n    enumerable: true,\n    configurable: true,\n    get: function () {\n        return this.errorWithCallStack && this.errorWithCallStack.stack || \"\";\n    }\n});\n\ncallProto.invokeCallback = callProto.yield;\n\nfunction createSpyCall(spy, thisValue, args, returnValue, exception, id, errorWithCallStack) {\n    if (typeof id !== \"number\") {\n        throw new TypeError(\"Call id is not a number\");\n    }\n    var proxyCall = Object.create(callProto);\n    proxyCall.proxy = spy;\n    proxyCall.thisValue = thisValue;\n    proxyCall.args = args;\n    proxyCall.returnValue = returnValue;\n    proxyCall.exception = exception;\n    proxyCall.callId = id;\n    proxyCall.errorWithCallStack = errorWithCallStack;\n\n    return proxyCall;\n}\ncreateSpyCall.toString = callProto.toString; // used by mocks\n\nmodule.exports = createSpyCall;\n\n},{\"./match\":10,\"./util/core/deep-equal\":23,\"./util/core/format\":28,\"./util/core/function-name\":29,\"./util/core/value-to-string\":40}],6:[function(require,module,exports){\n\"use strict\";\n\nvar walk = require(\"./util/core/walk\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\n\nfunction collectMethod(methods, object, prop, propOwner) {\n    if (\n        typeof getPropertyDescriptor(propOwner, prop).value === \"function\" &&\n        object.hasOwnProperty(prop)\n    ) {\n        methods.push(object[prop]);\n    }\n}\n\n// This function returns an array of all the own methods on the passed object\nfunction collectOwnMethods(object) {\n    var methods = [];\n\n    walk(object, collectMethod.bind(null, methods, object));\n\n    return methods;\n}\n\nmodule.exports = collectOwnMethods;\n\n},{\"./util/core/get-property-descriptor\":32,\"./util/core/walk\":41}],7:[function(require,module,exports){\n\"use strict\";\n\nvar sinonSpy = require(\"./spy\");\nvar sinonStub = require(\"./stub\");\nvar sinonMock = require(\"./mock\");\nvar sandboxStub = require(\"./sandbox-stub\");\nvar collectOwnMethods = require(\"./collect-own-methods\");\n\nvar push = [].push;\n\nfunction getFakes(fakeCollection) {\n    if (!fakeCollection.fakes) {\n        fakeCollection.fakes = [];\n    }\n\n    return fakeCollection.fakes;\n}\n\nfunction each(fakeCollection, method) {\n    var fakes = getFakes(fakeCollection);\n    var matchingFakes = fakes.filter(function (fake) {\n        return typeof fake[method] === \"function\";\n    });\n\n    matchingFakes.forEach(function (fake) {\n        fake[method]();\n    });\n}\n\nvar collection = {\n    verify: function verify() {\n        each(this, \"verify\");\n    },\n\n    restore: function restore() {\n        each(this, \"restore\");\n        this.fakes = [];\n    },\n\n    reset: function reset() {\n        each(this, \"reset\");\n    },\n\n    resetBehavior: function resetBehavior() {\n        each(this, \"resetBehavior\");\n    },\n\n    resetHistory: function resetHistory() {\n        getFakes(this).forEach(function (fake) {\n            var method = fake.resetHistory || fake.reset;\n\n            if (method) {\n                method.call(fake);\n            }\n        });\n    },\n\n    verifyAndRestore: function verifyAndRestore() {\n        var exception;\n\n        try {\n            this.verify();\n        } catch (e) {\n            exception = e;\n        }\n\n        this.restore();\n\n        if (exception) {\n            throw exception;\n        }\n    },\n\n    add: function add(fake) {\n        push.call(getFakes(this), fake);\n        return fake;\n    },\n\n    addUsingPromise: function (fake) {\n        fake.usingPromise(this.promiseLibrary);\n        return fake;\n    },\n\n    spy: function spy() {\n        return this.add(sinonSpy.apply(sinonSpy, arguments));\n    },\n\n    stub: function stub(object, property/*, value*/) {\n        if (arguments.length > 2) {\n            return sandboxStub.apply(this, arguments);\n        }\n\n        var stubbed = sinonStub.apply(null, arguments);\n        var isStubbingEntireObject = typeof property === \"undefined\" && typeof object === \"object\";\n\n        if (isStubbingEntireObject) {\n            var ownMethods = collectOwnMethods(stubbed);\n            ownMethods.forEach(this.add.bind(this));\n            if (this.promiseLibrary) {\n                ownMethods.forEach(this.addUsingPromise.bind(this));\n            }\n        } else {\n            this.add(stubbed);\n            if (this.promiseLibrary) {\n                stubbed.usingPromise(this.promiseLibrary);\n            }\n        }\n\n        return stubbed;\n    },\n\n    mock: function mock() {\n        return this.add(sinonMock.apply(null, arguments));\n    },\n\n    inject: function inject(obj) {\n        var col = this;\n\n        obj.spy = function () {\n            return col.spy.apply(col, arguments);\n        };\n\n        obj.stub = function () {\n            return col.stub.apply(col, arguments);\n        };\n\n        obj.mock = function () {\n            return col.mock.apply(col, arguments);\n        };\n\n        return obj;\n    }\n};\n\nmodule.exports = collection;\n\n},{\"./collect-own-methods\":6,\"./mock\":12,\"./sandbox-stub\":13,\"./spy\":16,\"./stub\":20}],8:[function(require,module,exports){\n(function (process){\n\"use strict\";\n\nvar canColor = typeof process !== \"undefined\";\n\nfunction colorize(str, color) {\n    if (!canColor) {\n        return str;\n    }\n\n    return \"\\x1b[\" + color + \"m\" + str + \"\\x1b[0m\";\n}\n\nexports.red = function (str) {\n    return colorize(str, 31);\n};\n\nexports.green = function (str) {\n    return colorize(str, 32);\n};\n\n}).call(this,require('_process'))\n\n},{\"_process\":53}],9:[function(require,module,exports){\n\"use strict\";\n\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\n\nvar slice = [].slice;\nvar useLeftMostCallback = -1;\nvar useRightMostCallback = -2;\n\nfunction throwsException(fake, error, message) {\n    if (typeof error === \"string\") {\n        fake.exception = new Error(message || \"\");\n        fake.exception.name = error;\n    } else if (!error) {\n        fake.exception = new Error(\"Error\");\n    } else {\n        fake.exception = error;\n    }\n}\n\nfunction isPropertyConfigurable(obj, propName) {\n    var propertyDescriptor = getPropertyDescriptor(obj, propName);\n\n    return propertyDescriptor ? propertyDescriptor.configurable : true;\n}\n\nmodule.exports = {\n    callsFake: function callsFake(fake, fn) {\n        fake.fakeFn = fn;\n    },\n\n    callsArg: function callsArg(fake, pos) {\n        if (typeof pos !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = pos;\n        fake.callbackArguments = [];\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    callsArgOn: function callsArgOn(fake, pos, context) {\n        if (typeof pos !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = pos;\n        fake.callbackArguments = [];\n        fake.callbackContext = context;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    callsArgWith: function callsArgWith(fake, pos) {\n        if (typeof pos !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = pos;\n        fake.callbackArguments = slice.call(arguments, 2);\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    callsArgOnWith: function callsArgWith(fake, pos, context) {\n        if (typeof pos !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = pos;\n        fake.callbackArguments = slice.call(arguments, 3);\n        fake.callbackContext = context;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    usingPromise: function usingPromise(fake, promiseLibrary) {\n        fake.promiseLibrary = promiseLibrary;\n    },\n\n    yields: function (fake) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice.call(arguments, 1);\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    yieldsRight: function (fake) {\n        fake.callArgAt = useRightMostCallback;\n        fake.callbackArguments = slice.call(arguments, 1);\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    yieldsOn: function (fake, context) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice.call(arguments, 2);\n        fake.callbackContext = context;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    yieldsTo: function (fake, prop) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice.call(arguments, 2);\n        fake.callbackContext = undefined;\n        fake.callArgProp = prop;\n        fake.callbackAsync = false;\n    },\n\n    yieldsToOn: function (fake, prop, context) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice.call(arguments, 3);\n        fake.callbackContext = context;\n        fake.callArgProp = prop;\n        fake.callbackAsync = false;\n    },\n\n    throws: throwsException,\n    throwsException: throwsException,\n\n    returns: function returns(fake, value) {\n        fake.returnValue = value;\n        fake.resolve = false;\n        fake.reject = false;\n        fake.returnValueDefined = true;\n        fake.exception = undefined;\n        fake.fakeFn = undefined;\n    },\n\n    returnsArg: function returnsArg(fake, pos) {\n        if (typeof pos !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.returnArgAt = pos;\n    },\n\n    throwsArg: function throwsArg(fake, pos) {\n        if (typeof pos !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.throwArgAt = pos;\n    },\n\n    returnsThis: function returnsThis(fake) {\n        fake.returnThis = true;\n    },\n\n    resolves: function resolves(fake, value) {\n        fake.returnValue = value;\n        fake.resolve = true;\n        fake.reject = false;\n        fake.returnValueDefined = true;\n        fake.exception = undefined;\n        fake.fakeFn = undefined;\n    },\n\n    rejects: function rejects(fake, error, message) {\n        var reason;\n        if (typeof error === \"string\") {\n            reason = new Error(message || \"\");\n            reason.name = error;\n        } else if (!error) {\n            reason = new Error(\"Error\");\n        } else {\n            reason = error;\n        }\n        fake.returnValue = reason;\n        fake.resolve = false;\n        fake.reject = true;\n        fake.returnValueDefined = true;\n        fake.exception = undefined;\n        fake.fakeFn = undefined;\n\n        return fake;\n    },\n\n    callThrough: function callThrough(fake) {\n        fake.callsThrough = true;\n    },\n\n    get: function get(fake, getterFunction) {\n        var rootStub = fake.stub || fake;\n\n        Object.defineProperty(rootStub.rootObj, rootStub.propName, {\n            get: getterFunction,\n            configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)\n        });\n\n        return fake;\n    },\n\n    set: function set(fake, setterFunction) {\n        var rootStub = fake.stub || fake;\n\n        Object.defineProperty(rootStub.rootObj, rootStub.propName, { // eslint-disable-line accessor-pairs\n            set: setterFunction,\n            configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)\n        });\n\n        return fake;\n    },\n\n    value: function value(fake, newVal) {\n        var rootStub = fake.stub || fake;\n\n        Object.defineProperty(rootStub.rootObj, rootStub.propName, {\n            value: newVal,\n            enumerable: true,\n            configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)\n        });\n\n        return fake;\n    }\n};\n\nfunction createAsyncVersion(syncFnName) {\n    return function () {\n        var result = module.exports[syncFnName].apply(this, arguments);\n        this.callbackAsync = true;\n        return result;\n    };\n}\n\n// create asynchronous versions of callsArg* and yields* methods\nObject.keys(module.exports).forEach(function (method) {\n    // need to avoid creating anotherasync versions of the newly added async methods\n    if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) {\n        module.exports[method + \"Async\"] = createAsyncVersion(method);\n    }\n});\n\n},{\"./util/core/get-property-descriptor\":32}],10:[function(require,module,exports){\n\"use strict\";\n\nvar deepEqual = require(\"./util/core/deep-equal\").use(match); // eslint-disable-line no-use-before-define\nvar every = require(\"./util/core/every\");\nvar functionName = require(\"./util/core/function-name\");\nvar iterableToString = require(\"./util/core/iterable-to-string\");\nvar typeOf = require(\"./util/core/typeOf\");\nvar valueToString = require(\"./util/core/value-to-string\");\n\nvar indexOf = Array.prototype.indexOf;\n\nfunction assertType(value, type, name) {\n    var actual = typeOf(value);\n    if (actual !== type) {\n        throw new TypeError(\"Expected type of \" + name + \" to be \" +\n            type + \", but was \" + actual);\n    }\n}\n\nvar matcher = {\n    toString: function () {\n        return this.message;\n    }\n};\n\nfunction isMatcher(object) {\n    return matcher.isPrototypeOf(object);\n}\n\nfunction matchObject(expectation, actual) {\n    if (actual === null || actual === undefined) {\n        return false;\n    }\n\n    return Object.keys(expectation).every(function (key) {\n        var exp = expectation[key];\n        var act = actual[key];\n\n        if (isMatcher(exp)) {\n            if (!exp.test(act)) {\n                return false;\n            }\n        } else if (typeOf(exp) === \"object\") {\n            if (!matchObject(exp, act)) {\n                return false;\n            }\n        } else if (!deepEqual(exp, act)) {\n            return false;\n        }\n\n        return true;\n    });\n}\n\nvar TYPE_MAP = {\n    \"function\": function (m, expectation, message) {\n        m.test = expectation;\n        m.message = message || \"match(\" + functionName(expectation) + \")\";\n    },\n    number: function (m, expectation) {\n        m.test = function (actual) {\n            // we need type coercion here\n            return expectation == actual; // eslint-disable-line eqeqeq\n        };\n    },\n    object: function (m, expectation) {\n        var array = [];\n\n        if (typeof expectation.test === \"function\") {\n            m.test = function (actual) {\n                return expectation.test(actual) === true;\n            };\n            m.message = \"match(\" + functionName(expectation.test) + \")\";\n            return m;\n        }\n\n        array = Object.keys(expectation).map(function (key) {\n            return key + \": \" + valueToString(expectation[key]);\n        });\n\n        m.test = function (actual) {\n            return matchObject(expectation, actual);\n        };\n        m.message = \"match(\" + array.join(\", \") + \")\";\n\n        return m;\n    },\n    regexp: function (m, expectation) {\n        m.test = function (actual) {\n            return typeof actual === \"string\" && expectation.test(actual);\n        };\n    },\n    string: function (m, expectation) {\n        m.test = function (actual) {\n            return typeof actual === \"string\" && actual.indexOf(expectation) !== -1;\n        };\n        m.message = \"match(\\\"\" + expectation + \"\\\")\";\n    }\n};\n\nfunction match(expectation, message) {\n    var m = Object.create(matcher);\n    var type = typeOf(expectation);\n\n    if (type in TYPE_MAP) {\n        TYPE_MAP[type](m, expectation, message);\n    } else {\n        m.test = function (actual) {\n            return deepEqual(expectation, actual);\n        };\n    }\n\n    if (!m.message) {\n        m.message = \"match(\" + valueToString(expectation) + \")\";\n    }\n\n    return m;\n}\n\nmatcher.or = function (m2) {\n    if (!arguments.length) {\n        throw new TypeError(\"Matcher expected\");\n    } else if (!isMatcher(m2)) {\n        m2 = match(m2);\n    }\n    var m1 = this;\n    var or = Object.create(matcher);\n    or.test = function (actual) {\n        return m1.test(actual) || m2.test(actual);\n    };\n    or.message = m1.message + \".or(\" + m2.message + \")\";\n    return or;\n};\n\nmatcher.and = function (m2) {\n    if (!arguments.length) {\n        throw new TypeError(\"Matcher expected\");\n    } else if (!isMatcher(m2)) {\n        m2 = match(m2);\n    }\n    var m1 = this;\n    var and = Object.create(matcher);\n    and.test = function (actual) {\n        return m1.test(actual) && m2.test(actual);\n    };\n    and.message = m1.message + \".and(\" + m2.message + \")\";\n    return and;\n};\n\nmatch.isMatcher = isMatcher;\n\nmatch.any = match(function () {\n    return true;\n}, \"any\");\n\nmatch.defined = match(function (actual) {\n    return actual !== null && actual !== undefined;\n}, \"defined\");\n\nmatch.truthy = match(function (actual) {\n    return !!actual;\n}, \"truthy\");\n\nmatch.falsy = match(function (actual) {\n    return !actual;\n}, \"falsy\");\n\nmatch.same = function (expectation) {\n    return match(function (actual) {\n        return expectation === actual;\n    }, \"same(\" + valueToString(expectation) + \")\");\n};\n\nmatch.typeOf = function (type) {\n    assertType(type, \"string\", \"type\");\n    return match(function (actual) {\n        return typeOf(actual) === type;\n    }, \"typeOf(\\\"\" + type + \"\\\")\");\n};\n\nmatch.instanceOf = function (type) {\n    assertType(type, \"function\", \"type\");\n    return match(function (actual) {\n        return actual instanceof type;\n    }, \"instanceOf(\" + functionName(type) + \")\");\n};\n\nfunction createPropertyMatcher(propertyTest, messagePrefix) {\n    return function (property, value) {\n        assertType(property, \"string\", \"property\");\n        var onlyProperty = arguments.length === 1;\n        var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n        if (!onlyProperty) {\n            message += \", \" + valueToString(value);\n        }\n        message += \")\";\n        return match(function (actual) {\n            if (actual === undefined || actual === null ||\n                    !propertyTest(actual, property)) {\n                return false;\n            }\n            return onlyProperty || deepEqual(value, actual[property]);\n        }, message);\n    };\n}\n\nmatch.has = createPropertyMatcher(function (actual, property) {\n    if (typeof actual === \"object\") {\n        return property in actual;\n    }\n    return actual[property] !== undefined;\n}, \"has\");\n\nmatch.hasOwn = createPropertyMatcher(function (actual, property) {\n    return actual.hasOwnProperty(property);\n}, \"hasOwn\");\n\nmatch.array = match.typeOf(\"array\");\n\nmatch.array.deepEquals = function (expectation) {\n    return match(function (actual) {\n        // Comparing lengths is the fastest way to spot a difference before iterating through every item\n        var sameLength = actual.length === expectation.length;\n        return typeOf(actual) === \"array\" && sameLength && every(actual, function (element, index) {\n            return expectation[index] === element;\n        });\n    }, \"deepEquals([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.array.startsWith = function (expectation) {\n    return match(function (actual) {\n        return typeOf(actual) === \"array\" && every(expectation, function (expectedElement, index) {\n            return actual[index] === expectedElement;\n        });\n    }, \"startsWith([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.array.endsWith = function (expectation) {\n    return match(function (actual) {\n        // This indicates the index in which we should start matching\n        var offset = actual.length - expectation.length;\n\n        return typeOf(actual) === \"array\" && every(expectation, function (expectedElement, index) {\n            return actual[offset + index] === expectedElement;\n        });\n    }, \"endsWith([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.array.contains = function (expectation) {\n    return match(function (actual) {\n        return typeOf(actual) === \"array\" && every(expectation, function (expectedElement) {\n            return indexOf.call(actual, expectedElement) !== -1;\n        });\n    }, \"contains([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.map = match.typeOf(\"map\");\n\nmatch.map.deepEquals = function mapDeepEquals(expectation) {\n    return match(function (actual) {\n        // Comparing lengths is the fastest way to spot a difference before iterating through every item\n        var sameLength = actual.size === expectation.size;\n        return typeOf(actual) === \"map\" && sameLength && every(actual, function (element, key) {\n            return expectation.has(key) && expectation.get(key) === element;\n        });\n    }, \"deepEquals(Map[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.map.contains = function mapContains(expectation) {\n    return match(function (actual) {\n        return typeOf(actual) === \"map\" && every(expectation, function (element, key) {\n            return actual.has(key) && actual.get(key) === element;\n        });\n    }, \"contains(Map[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.set = match.typeOf(\"set\");\n\nmatch.set.deepEquals = function setDeepEquals(expectation) {\n    return match(function (actual) {\n        // Comparing lengths is the fastest way to spot a difference before iterating through every item\n        var sameLength = actual.size === expectation.size;\n        return typeOf(actual) === \"set\" && sameLength && every(actual, function (element) {\n            return expectation.has(element);\n        });\n    }, \"deepEquals(Set[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.set.contains = function setContains(expectation) {\n    return match(function (actual) {\n        return typeOf(actual) === \"set\" && every(expectation, function (element) {\n            return actual.has(element);\n        });\n    }, \"contains(Set[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.bool = match.typeOf(\"boolean\");\nmatch.number = match.typeOf(\"number\");\nmatch.string = match.typeOf(\"string\");\nmatch.object = match.typeOf(\"object\");\nmatch.func = match.typeOf(\"function\");\nmatch.regexp = match.typeOf(\"regexp\");\nmatch.date = match.typeOf(\"date\");\nmatch.symbol = match.typeOf(\"symbol\");\n\nmodule.exports = match;\n\n},{\"./util/core/deep-equal\":23,\"./util/core/every\":26,\"./util/core/function-name\":29,\"./util/core/iterable-to-string\":34,\"./util/core/typeOf\":39,\"./util/core/value-to-string\":40}],11:[function(require,module,exports){\n\"use strict\";\n\nvar spyInvoke = require(\"./spy\").invoke;\nvar spyCallToString = require(\"./call\").toString;\nvar timesInWords = require(\"./util/core/times-in-words\");\nvar extend = require(\"./util/core/extend\");\nvar match = require(\"./match\");\nvar stub = require(\"./stub\");\nvar assert = require(\"./assert\");\nvar deepEqual = require(\"./util/core/deep-equal\").use(match);\nvar format = require(\"./util/core/format\");\nvar valueToString = require(\"./util/core/value-to-string\");\n\nvar slice = Array.prototype.slice;\nvar push = Array.prototype.push;\n\nfunction callCountInWords(callCount) {\n    if (callCount === 0) {\n        return \"never called\";\n    }\n\n    return \"called \" + timesInWords(callCount);\n}\n\nfunction expectedCallCountInWords(expectation) {\n    var min = expectation.minCalls;\n    var max = expectation.maxCalls;\n\n    if (typeof min === \"number\" && typeof max === \"number\") {\n        var str = timesInWords(min);\n\n        if (min !== max) {\n            str = \"at least \" + str + \" and at most \" + timesInWords(max);\n        }\n\n        return str;\n    }\n\n    if (typeof min === \"number\") {\n        return \"at least \" + timesInWords(min);\n    }\n\n    return \"at most \" + timesInWords(max);\n}\n\nfunction receivedMinCalls(expectation) {\n    var hasMinLimit = typeof expectation.minCalls === \"number\";\n    return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n}\n\nfunction receivedMaxCalls(expectation) {\n    if (typeof expectation.maxCalls !== \"number\") {\n        return false;\n    }\n\n    return expectation.callCount === expectation.maxCalls;\n}\n\nfunction verifyMatcher(possibleMatcher, arg) {\n    var isMatcher = match && match.isMatcher(possibleMatcher);\n\n    return isMatcher && possibleMatcher.test(arg) || true;\n}\n\nvar mockExpectation = {\n    minCalls: 1,\n    maxCalls: 1,\n\n    create: function create(methodName) {\n        var expectation = extend(stub.create(), mockExpectation);\n        delete expectation.create;\n        expectation.method = methodName;\n\n        return expectation;\n    },\n\n    invoke: function invoke(func, thisValue, args) {\n        this.verifyCallAllowed(thisValue, args);\n\n        return spyInvoke.apply(this, arguments);\n    },\n\n    atLeast: function atLeast(num) {\n        if (typeof num !== \"number\") {\n            throw new TypeError(\"'\" + valueToString(num) + \"' is not number\");\n        }\n\n        if (!this.limitsSet) {\n            this.maxCalls = null;\n            this.limitsSet = true;\n        }\n\n        this.minCalls = num;\n\n        return this;\n    },\n\n    atMost: function atMost(num) {\n        if (typeof num !== \"number\") {\n            throw new TypeError(\"'\" + valueToString(num) + \"' is not number\");\n        }\n\n        if (!this.limitsSet) {\n            this.minCalls = null;\n            this.limitsSet = true;\n        }\n\n        this.maxCalls = num;\n\n        return this;\n    },\n\n    never: function never() {\n        return this.exactly(0);\n    },\n\n    once: function once() {\n        return this.exactly(1);\n    },\n\n    twice: function twice() {\n        return this.exactly(2);\n    },\n\n    thrice: function thrice() {\n        return this.exactly(3);\n    },\n\n    exactly: function exactly(num) {\n        if (typeof num !== \"number\") {\n            throw new TypeError(\"'\" + valueToString(num) + \"' is not a number\");\n        }\n\n        this.atLeast(num);\n        return this.atMost(num);\n    },\n\n    met: function met() {\n        return !this.failed && receivedMinCalls(this);\n    },\n\n    verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n        var expectedArguments = this.expectedArguments;\n\n        if (receivedMaxCalls(this)) {\n            this.failed = true;\n            mockExpectation.fail(this.method + \" already called \" + timesInWords(this.maxCalls));\n        }\n\n        if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n            mockExpectation.fail(this.method + \" called with \" + valueToString(thisValue) +\n                \" as thisValue, expected \" + valueToString(this.expectedThis));\n        }\n\n        if (!(\"expectedArguments\" in this)) {\n            return;\n        }\n\n        if (!args) {\n            mockExpectation.fail(this.method + \" received no arguments, expected \" +\n                format(expectedArguments));\n        }\n\n        if (args.length < expectedArguments.length) {\n            mockExpectation.fail(this.method + \" received too few arguments (\" + format(args) +\n                \"), expected \" + format(expectedArguments));\n        }\n\n        if (this.expectsExactArgCount &&\n            args.length !== expectedArguments.length) {\n            mockExpectation.fail(this.method + \" received too many arguments (\" + format(args) +\n                \"), expected \" + format(expectedArguments));\n        }\n\n        expectedArguments.forEach(function (expectedArgument, i) {\n            if (!verifyMatcher(expectedArgument, args[i])) {\n                mockExpectation.fail(this.method + \" received wrong arguments \" + format(args) +\n                    \", didn't match \" + expectedArguments.toString());\n            }\n\n            if (!deepEqual(expectedArgument, args[i])) {\n                mockExpectation.fail(this.method + \" received wrong arguments \" + format(args) +\n                    \", expected \" + format(expectedArguments));\n            }\n        }, this);\n    },\n\n    allowsCall: function allowsCall(thisValue, args) {\n        var expectedArguments = this.expectedArguments;\n\n        if (this.met() && receivedMaxCalls(this)) {\n            return false;\n        }\n\n        if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n            return false;\n        }\n\n        if (!(\"expectedArguments\" in this)) {\n            return true;\n        }\n\n        args = args || [];\n\n        if (args.length < expectedArguments.length) {\n            return false;\n        }\n\n        if (this.expectsExactArgCount &&\n            args.length !== expectedArguments.length) {\n            return false;\n        }\n\n        return expectedArguments.every(function (expectedArgument, i) {\n            if (!verifyMatcher(expectedArgument, args[i])) {\n                return false;\n            }\n\n            if (!deepEqual(expectedArgument, args[i])) {\n                return false;\n            }\n\n            return true;\n        });\n    },\n\n    withArgs: function withArgs() {\n        this.expectedArguments = slice.call(arguments);\n        return this;\n    },\n\n    withExactArgs: function withExactArgs() {\n        this.withArgs.apply(this, arguments);\n        this.expectsExactArgCount = true;\n        return this;\n    },\n\n    on: function on(thisValue) {\n        this.expectedThis = thisValue;\n        return this;\n    },\n\n    toString: function () {\n        var args = (this.expectedArguments || []).slice();\n\n        if (!this.expectsExactArgCount) {\n            push.call(args, \"[...]\");\n        }\n\n        var callStr = spyCallToString.call({\n            proxy: this.method || \"anonymous mock expectation\",\n            args: args\n        });\n\n        var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n            expectedCallCountInWords(this);\n\n        if (this.met()) {\n            return \"Expectation met: \" + message;\n        }\n\n        return \"Expected \" + message + \" (\" +\n            callCountInWords(this.callCount) + \")\";\n    },\n\n    verify: function verify() {\n        if (!this.met()) {\n            mockExpectation.fail(this.toString());\n        } else {\n            mockExpectation.pass(this.toString());\n        }\n\n        return true;\n    },\n\n    pass: function pass(message) {\n        assert.pass(message);\n    },\n\n    fail: function fail(message) {\n        var exception = new Error(message);\n        exception.name = \"ExpectationError\";\n\n        throw exception;\n    }\n};\n\nmodule.exports = mockExpectation;\n\n},{\"./assert\":2,\"./call\":5,\"./match\":10,\"./spy\":16,\"./stub\":20,\"./util/core/deep-equal\":23,\"./util/core/extend\":27,\"./util/core/format\":28,\"./util/core/times-in-words\":38,\"./util/core/value-to-string\":40}],12:[function(require,module,exports){\n\"use strict\";\n\nvar mockExpectation = require(\"./mock-expectation\");\nvar spyCallToString = require(\"./call\").toString;\nvar extend = require(\"./util/core/extend\");\nvar match = require(\"./match\");\nvar deepEqual = require(\"./util/core/deep-equal\").use(match);\nvar wrapMethod = require(\"./util/core/wrap-method\");\n\nvar push = Array.prototype.push;\n\nfunction mock(object) {\n    if (!object) {\n        return mockExpectation.create(\"Anonymous mock\");\n    }\n\n    return mock.create(object);\n}\n\nfunction each(collection, callback) {\n    var col = collection || [];\n\n    col.forEach(callback);\n}\n\nfunction arrayEquals(arr1, arr2, compareLength) {\n    if (compareLength && (arr1.length !== arr2.length)) {\n        return false;\n    }\n\n    return arr1.every(function (element, i) {\n        return deepEqual(element, arr2[i]);\n\n    });\n}\n\nextend(mock, {\n    create: function create(object) {\n        if (!object) {\n            throw new TypeError(\"object is null\");\n        }\n\n        var mockObject = extend({}, mock);\n        mockObject.object = object;\n        delete mockObject.create;\n\n        return mockObject;\n    },\n\n    expects: function expects(method) {\n        if (!method) {\n            throw new TypeError(\"method is falsy\");\n        }\n\n        if (!this.expectations) {\n            this.expectations = {};\n            this.proxies = [];\n            this.failures = [];\n        }\n\n        if (!this.expectations[method]) {\n            this.expectations[method] = [];\n            var mockObject = this;\n\n            wrapMethod(this.object, method, function () {\n                return mockObject.invokeMethod(method, this, arguments);\n            });\n\n            push.call(this.proxies, method);\n        }\n\n        var expectation = mockExpectation.create(method);\n        push.call(this.expectations[method], expectation);\n\n        return expectation;\n    },\n\n    restore: function restore() {\n        var object = this.object;\n\n        each(this.proxies, function (proxy) {\n            if (typeof object[proxy].restore === \"function\") {\n                object[proxy].restore();\n            }\n        });\n    },\n\n    verify: function verify() {\n        var expectations = this.expectations || {};\n        var messages = this.failures ? this.failures.slice() : [];\n        var met = [];\n\n        each(this.proxies, function (proxy) {\n            each(expectations[proxy], function (expectation) {\n                if (!expectation.met()) {\n                    push.call(messages, expectation.toString());\n                } else {\n                    push.call(met, expectation.toString());\n                }\n            });\n        });\n\n        this.restore();\n\n        if (messages.length > 0) {\n            mockExpectation.fail(messages.concat(met).join(\"\\n\"));\n        } else if (met.length > 0) {\n            mockExpectation.pass(messages.concat(met).join(\"\\n\"));\n        }\n\n        return true;\n    },\n\n    invokeMethod: function invokeMethod(method, thisValue, args) {\n        /* if we cannot find any matching files we will explicitly call mockExpection#fail with error messages */\n        /* eslint consistent-return: \"off\" */\n        var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : [];\n        var currentArgs = args || [];\n        var available;\n\n        var expectationsWithMatchingArgs = expectations.filter(function (expectation) {\n            var expectedArgs = expectation.expectedArguments || [];\n\n            return arrayEquals(expectedArgs, currentArgs, expectation.expectsExactArgCount);\n        });\n\n        var expectationsToApply = expectationsWithMatchingArgs.filter(function (expectation) {\n            return !expectation.met() && expectation.allowsCall(thisValue, args);\n        });\n\n        if (expectationsToApply.length > 0) {\n            return expectationsToApply[0].apply(thisValue, args);\n        }\n\n        var messages = [];\n        var exhausted = 0;\n\n        expectationsWithMatchingArgs.forEach(function (expectation) {\n            if (expectation.allowsCall(thisValue, args)) {\n                available = available || expectation;\n            } else {\n                exhausted += 1;\n            }\n        });\n\n        if (available && exhausted === 0) {\n            return available.apply(thisValue, args);\n        }\n\n        expectations.forEach(function (expectation) {\n            push.call(messages, \"    \" + expectation.toString());\n        });\n\n        messages.unshift(\"Unexpected call: \" + spyCallToString.call({\n            proxy: method,\n            args: args\n        }));\n\n        var err = new Error();\n        if (!err.stack) {\n            // PhantomJS does not serialize the stack trace until the error has been thrown\n            try {\n                throw err;\n            } catch (e) {/* empty */}\n        }\n        this.failures.push(\"Unexpected call: \" + spyCallToString.call({\n            proxy: method,\n            args: args,\n            stack: err.stack\n        }));\n\n        mockExpectation.fail(messages.join(\"\\n\"));\n    }\n});\n\nmodule.exports = mock;\n\n},{\"./call\":5,\"./match\":10,\"./mock-expectation\":11,\"./util/core/deep-equal\":23,\"./util/core/extend\":27,\"./util/core/wrap-method\":42}],13:[function(require,module,exports){\n\"use strict\";\n\nvar collectOwnMethods = require(\"./collect-own-methods\");\nvar deprecated = require(\"./util/core/deprecated\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar stubNonFunctionProperty = require(\"./stub-non-function-property\");\nvar sinonStub = require(\"./stub\");\nvar throwOnFalsyObject = require(\"./throw-on-falsy-object\");\n\n// This is deprecated and will be removed in a future version of sinon.\n// We will only consider pull requests that fix serious bugs in the implementation\nfunction sandboxStub(object, property/*, value*/) {\n    deprecated.printWarning(\n      \"sandbox.stub(obj, 'meth', val) is deprecated and will be removed from \" +\n      \"the public API in a future version of sinon.\" +\n      \"\\n Use sandbox.stub(obj, 'meth').callsFake(fn) instead in order to stub a function.\" +\n      \"\\n Use sandbox.stub(obj, 'meth').value(fn) instead in order to stub a non-function value.\"\n    );\n\n    throwOnFalsyObject.apply(null, arguments);\n\n    var actualDescriptor = getPropertyDescriptor(object, property);\n    var isStubbingEntireObject = typeof property === \"undefined\" && typeof object === \"object\";\n    var isStubbingNonFuncProperty = typeof object === \"object\"\n                                    && typeof property !== \"undefined\"\n                                    && (typeof actualDescriptor === \"undefined\"\n                                    || typeof actualDescriptor.value !== \"function\");\n\n\n    // When passing a value as third argument it will be applied to stubNonFunctionProperty\n    var stubbed = isStubbingNonFuncProperty ?\n                    stubNonFunctionProperty.apply(null, arguments) :\n                    sinonStub.apply(null, arguments);\n\n    if (isStubbingEntireObject) {\n        var ownMethods = collectOwnMethods(stubbed);\n        ownMethods.forEach(this.add.bind(this));\n        if (this.promiseLibrary) {\n            ownMethods.forEach(this.addUsingPromise.bind(this));\n        }\n    } else {\n        this.add(stubbed);\n        if (this.promiseLibrary) {\n            stubbed.usingPromise(this.promiseLibrary);\n        }\n    }\n\n    return stubbed;\n}\n\nmodule.exports = sandboxStub;\n\n},{\"./collect-own-methods\":6,\"./stub\":20,\"./stub-non-function-property\":19,\"./throw-on-falsy-object\":21,\"./util/core/deprecated\":25,\"./util/core/get-property-descriptor\":32}],14:[function(require,module,exports){\n\"use strict\";\n\nvar extend = require(\"./util/core/extend\");\nvar sinonCollection = require(\"./collection\");\nvar sinonMatch = require(\"./match\");\nvar sinonAssert = require(\"./assert\");\nvar sinonClock = require(\"./util/fake_timers\");\nvar fakeServer = require(\"./util/fake_server\");\nvar fakeXhr = require(\"./util/fake_xml_http_request\");\nvar fakeServerWithClock = require(\"./util/fake_server_with_clock\");\n\nvar push = [].push;\n\nvar sinonSandbox = Object.create(sinonCollection);\n\nfunction exposeValue(sandbox, config, key, value) {\n    if (!value) {\n        return;\n    }\n\n    if (config.injectInto && !(key in config.injectInto)) {\n        config.injectInto[key] = value;\n        sandbox.injectedKeys.push(key);\n    } else {\n        push.call(sandbox.args, value);\n    }\n}\n\nfunction prepareSandboxFromConfig(config) {\n    var sandbox = Object.create(sinonSandbox);\n\n    if (config.useFakeServer) {\n        if (typeof config.useFakeServer === \"object\") {\n            sandbox.serverPrototype = config.useFakeServer;\n        }\n\n        sandbox.useFakeServer();\n    }\n\n    if (config.useFakeTimers) {\n        if (typeof config.useFakeTimers === \"object\") {\n            sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n        } else {\n            sandbox.useFakeTimers();\n        }\n    }\n\n    return sandbox;\n}\n\nextend(sinonSandbox, {\n    useFakeTimers: function useFakeTimers() {\n        this.clock = sinonClock.useFakeTimers.apply(null, arguments);\n\n        return this.add(this.clock);\n    },\n\n    serverPrototype: fakeServerWithClock,\n\n    useFakeServer: function useFakeServer() {\n        var proto = this.serverPrototype || fakeServer;\n\n        if (!proto || !proto.create) {\n            return null;\n        }\n\n        this.server = proto.create();\n        return this.add(this.server);\n    },\n\n    useFakeXMLHttpRequest: function useFakeXMLHttpRequest() {\n        var xhr = fakeXhr.useFakeXMLHttpRequest();\n        return this.add(xhr);\n    },\n\n    inject: function (obj) {\n        sinonCollection.inject.call(this, obj);\n\n        if (this.clock) {\n            obj.clock = this.clock;\n        }\n\n        if (this.server) {\n            obj.server = this.server;\n            obj.requests = this.server.requests;\n        }\n\n        obj.match = sinonMatch;\n\n        return obj;\n    },\n\n    usingPromise: function (promiseLibrary) {\n\n        this.promiseLibrary = promiseLibrary;\n\n        return this;\n    },\n\n    restore: function () {\n        if (arguments.length) {\n            throw new Error(\"sandbox.restore() does not take any parameters. Perhaps you meant stub.restore()\");\n        }\n\n        sinonCollection.restore.apply(this, arguments);\n        this.restoreContext();\n    },\n\n    restoreContext: function () {\n        var injectedKeys = this.injectedKeys;\n        var injectInto = this.injectInto;\n\n        if (!injectedKeys) {\n            return;\n        }\n\n        injectedKeys.forEach(function (injectedKey) {\n            delete injectInto[injectedKey];\n        });\n\n        injectedKeys = [];\n    },\n\n    create: function (config) {\n        if (!config) {\n            return Object.create(sinonSandbox);\n        }\n\n        var sandbox = prepareSandboxFromConfig(config);\n        sandbox.args = sandbox.args || [];\n        sandbox.injectedKeys = [];\n        sandbox.injectInto = config.injectInto;\n        var exposed = sandbox.inject({});\n\n        if (config.properties) {\n            config.properties.forEach(function (prop) {\n                var value = exposed[prop] || prop === \"sandbox\" && sandbox;\n                exposeValue(sandbox, config, prop, value);\n            });\n        } else {\n            exposeValue(sandbox, config, \"sandbox\");\n        }\n\n        return sandbox;\n    },\n\n    match: sinonMatch,\n\n    assert: sinonAssert\n});\n\nmodule.exports = sinonSandbox;\n\n},{\"./assert\":2,\"./collection\":7,\"./match\":10,\"./util/core/extend\":27,\"./util/fake_server\":44,\"./util/fake_server_with_clock\":45,\"./util/fake_timers\":46,\"./util/fake_xml_http_request\":47}],15:[function(require,module,exports){\n\"use strict\";\n\nvar color = require(\"./color\");\nvar timesInWords = require(\"./util/core/times-in-words\");\nvar sinonFormat = require(\"./util/core/format\");\nvar sinonMatch = require(\"./match\");\nvar jsDiff = require(\"diff\");\nvar push = Array.prototype.push;\n\nfunction colorSinonMatchText(matcher, calledArg, calledArgMessage) {\n    if (!matcher.test(calledArg)) {\n        matcher.message = color.red(matcher.message);\n        if (calledArgMessage) {\n            calledArgMessage = color.green(calledArgMessage);\n        }\n    }\n    return calledArgMessage + \" \" + matcher.message;\n}\n\nfunction colorDiffText(diff) {\n    var objects = diff.map(function (part) {\n        var text = part.value;\n        if (part.added) {\n            text = color.green(text);\n        } else if (part.removed) {\n            text = color.red(text);\n        }\n        if (diff.length === 2) {\n            text += \" \"; // format simple diffs\n        }\n        return text;\n    });\n    return objects.join(\"\");\n}\n\nmodule.exports = {\n    c: function (spyInstance) {\n        return timesInWords(spyInstance.callCount);\n    },\n\n    n: function (spyInstance) {\n        return spyInstance.toString();\n    },\n\n    D: function (spyInstance, args) {\n        var message = \"\";\n\n        for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n            // describe multiple calls\n            if (l > 1) {\n                if (i > 0) {\n                    message += \"\\n\";\n                }\n                message += \"Call \" + (i + 1) + \":\";\n            }\n            var calledArgs = spyInstance.getCall(i).args;\n            for (var j = 0; j < calledArgs.length || j < args.length; ++j) {\n                message += \"\\n\";\n                var calledArgMessage = j < calledArgs.length ? sinonFormat(calledArgs[j]) : \"\";\n                if (sinonMatch.isMatcher(args[j])) {\n                    message += colorSinonMatchText(args[j], calledArgs[j], calledArgMessage);\n                } else {\n                    var expectedArgMessage = j < args.length ? sinonFormat(args[j]) : \"\";\n                    var diff = jsDiff.diffJson(calledArgMessage, expectedArgMessage);\n                    message += colorDiffText(diff);\n                }\n            }\n        }\n\n        return message;\n    },\n\n    C: function (spyInstance) {\n        var calls = [];\n\n        for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n            var stringifiedCall = \"    \" + spyInstance.getCall(i).toString();\n            if (/\\n/.test(calls[i - 1])) {\n                stringifiedCall = \"\\n\" + stringifiedCall;\n            }\n            push.call(calls, stringifiedCall);\n        }\n\n        return calls.length > 0 ? \"\\n\" + calls.join(\"\\n\") : \"\";\n    },\n\n    t: function (spyInstance) {\n        var objects = [];\n\n        for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n            push.call(objects, sinonFormat(spyInstance.thisValues[i]));\n        }\n\n        return objects.join(\", \");\n    },\n\n    \"*\": function (spyInstance, args) {\n        return args.map(function (arg) { return sinonFormat(arg); }).join(\", \");\n    }\n};\n\n},{\"./color\":8,\"./match\":10,\"./util/core/format\":28,\"./util/core/times-in-words\":38,\"diff\":48}],16:[function(require,module,exports){\n\"use strict\";\n\nvar extend = require(\"./util/core/extend\");\nvar functionName = require(\"./util/core/function-name\");\nvar functionToString = require(\"./util/core/function-to-string\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar sinonMatch = require(\"./match\");\nvar deepEqual = require(\"./util/core/deep-equal\").use(sinonMatch);\nvar spyCall = require(\"./call\");\nvar wrapMethod = require(\"./util/core/wrap-method\");\nvar sinonFormat = require(\"./util/core/format\");\nvar valueToString = require(\"./util/core/value-to-string\");\n\nvar push = Array.prototype.push;\nvar slice = Array.prototype.slice;\nvar callId = 0;\nvar ErrorConstructor = Error.prototype.constructor;\n\nfunction spy(object, property, types) {\n    var descriptor, methodDesc;\n\n    if (!property && typeof object === \"function\") {\n        return spy.create(object);\n    }\n\n    if (!object && !property) {\n        return spy.create(function () { });\n    }\n\n    if (!types) {\n        return wrapMethod(object, property, spy.create(object[property]));\n    }\n\n    descriptor = {};\n    methodDesc = getPropertyDescriptor(object, property);\n\n    types.forEach(function (type) {\n        descriptor[type] = spy.create(methodDesc[type]);\n    });\n\n    return wrapMethod(object, property, descriptor);\n}\n\nfunction incrementCallCount() {\n    this.called = true;\n    this.callCount += 1;\n    this.notCalled = false;\n    this.calledOnce = this.callCount === 1;\n    this.calledTwice = this.callCount === 2;\n    this.calledThrice = this.callCount === 3;\n}\n\nfunction createCallProperties() {\n    this.firstCall = this.getCall(0);\n    this.secondCall = this.getCall(1);\n    this.thirdCall = this.getCall(2);\n    this.lastCall = this.getCall(this.callCount - 1);\n}\n\nfunction createProxy(func, proxyLength) {\n    // Retain the function length:\n    var p;\n    if (proxyLength) {\n        // Do not change this to use an eval. Projects that depend on sinon block the use of eval.\n        // ref: https://github.com/sinonjs/sinon/issues/710\n        switch (proxyLength) {\n            /*eslint-disable no-unused-vars, max-len*/\n            case 1: p = function proxy(a) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 2: p = function proxy(a, b) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 3: p = function proxy(a, b, c) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 4: p = function proxy(a, b, c, d) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 5: p = function proxy(a, b, c, d, e) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 6: p = function proxy(a, b, c, d, e, f) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 7: p = function proxy(a, b, c, d, e, f, g) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 8: p = function proxy(a, b, c, d, e, f, g, h) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 9: p = function proxy(a, b, c, d, e, f, g, h, i) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 10: p = function proxy(a, b, c, d, e, f, g, h, i, j) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 11: p = function proxy(a, b, c, d, e, f, g, h, i, j, k) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            case 12: p = function proxy(a, b, c, d, e, f, g, h, i, j, k, l) { return p.invoke(func, this, slice.call(arguments)); }; break;\n            default: p = function proxy() { return p.invoke(func, this, slice.call(arguments)); }; break;\n            /*eslint-enable*/\n        }\n    } else {\n        p = function proxy() {\n            return p.invoke(func, this, slice.call(arguments));\n        };\n    }\n    p.isSinonProxy = true;\n    return p;\n}\n\nvar uuid = 0;\n\n// Public API\nvar spyApi = {\n    formatters: require(\"./spy-formatters\"),\n\n    reset: function () {\n        if (this.invoking) {\n            var err = new Error(\"Cannot reset Sinon function while invoking it. \" +\n                                \"Move the call to .reset outside of the callback.\");\n            err.name = \"InvalidResetException\";\n            throw err;\n        }\n\n        this.called = false;\n        this.notCalled = true;\n        this.calledOnce = false;\n        this.calledTwice = false;\n        this.calledThrice = false;\n        this.callCount = 0;\n        this.firstCall = null;\n        this.secondCall = null;\n        this.thirdCall = null;\n        this.lastCall = null;\n        this.args = [];\n        this.returnValues = [];\n        this.thisValues = [];\n        this.exceptions = [];\n        this.callIds = [];\n        this.errorsWithCallStack = [];\n        if (this.fakes) {\n            this.fakes.forEach(function (fake) {\n                if (fake.resetHistory) {\n                    fake.resetHistory();\n                } else {\n                    fake.reset();\n                }\n            });\n        }\n\n        return this;\n    },\n\n    create: function create(func, spyLength) {\n        var name;\n\n        if (typeof func !== \"function\") {\n            func = function () { };\n        } else {\n            name = functionName(func);\n        }\n\n        if (!spyLength) {\n            spyLength = func.length;\n        }\n\n        var proxy = createProxy(func, spyLength);\n\n        extend(proxy, spy);\n        delete proxy.create;\n        extend(proxy, func);\n\n        proxy.reset();\n        proxy.prototype = func.prototype;\n        proxy.displayName = name || \"spy\";\n        proxy.toString = functionToString;\n        proxy.instantiateFake = spy.create;\n        proxy.id = \"spy#\" + uuid++;\n\n        return proxy;\n    },\n\n    invoke: function invoke(func, thisValue, args) {\n        var matchings = this.matchingFakes(args);\n        var currentCallId = callId++;\n        var exception, returnValue;\n\n        incrementCallCount.call(this);\n        push.call(this.thisValues, thisValue);\n        push.call(this.args, args);\n        push.call(this.callIds, currentCallId);\n        matchings.forEach(function (matching) {\n            incrementCallCount.call(matching);\n            push.call(matching.thisValues, thisValue);\n            push.call(matching.args, args);\n            push.call(matching.callIds, currentCallId);\n        });\n\n        // Make call properties available from within the spied function:\n        createCallProperties.call(this);\n        matchings.forEach(function (matching) {\n            createCallProperties.call(matching);\n        });\n\n        try {\n            this.invoking = true;\n\n            returnValue = (this.func || func).apply(thisValue, args);\n\n            var thisCall = this.getCall(this.callCount - 1);\n            if (thisCall.calledWithNew() && typeof returnValue !== \"object\") {\n                returnValue = thisValue;\n            }\n        } catch (e) {\n            exception = e;\n        } finally {\n            delete this.invoking;\n        }\n\n        push.call(this.exceptions, exception);\n        push.call(this.returnValues, returnValue);\n        matchings.forEach(function (matching) {\n            push.call(matching.exceptions, exception);\n            push.call(matching.returnValues, returnValue);\n        });\n\n        var err = new ErrorConstructor();\n        // 1. Please do not get stack at this point. It may be so very slow, and not actually used\n        // 2. PhantomJS does not serialize the stack trace until the error has been thrown:\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack\n        try {\n            throw err;\n        } catch (e) {/* empty */}\n        push.call(this.errorsWithCallStack, err);\n        matchings.forEach(function (matching) {\n            push.call(matching.errorsWithCallStack, err);\n        });\n\n        // Make return value and exception available in the calls:\n        createCallProperties.call(this);\n\n        if (exception !== undefined) {\n            throw exception;\n        }\n\n        return returnValue;\n    },\n\n    named: function named(name) {\n        this.displayName = name;\n        return this;\n    },\n\n    getCall: function getCall(i) {\n        if (i < 0 || i >= this.callCount) {\n            return null;\n        }\n\n        return spyCall(this, this.thisValues[i], this.args[i],\n                                this.returnValues[i], this.exceptions[i],\n                                this.callIds[i], this.errorsWithCallStack[i]);\n    },\n\n    getCalls: function () {\n        var calls = [];\n        var i;\n\n        for (i = 0; i < this.callCount; i++) {\n            calls.push(this.getCall(i));\n        }\n\n        return calls;\n    },\n\n    calledBefore: function calledBefore(spyFn) {\n        if (!this.called) {\n            return false;\n        }\n\n        if (!spyFn.called) {\n            return true;\n        }\n\n        return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n    },\n\n    calledAfter: function calledAfter(spyFn) {\n        if (!this.called || !spyFn.called) {\n            return false;\n        }\n\n        return this.callIds[this.callCount - 1] > spyFn.callIds[0];\n    },\n\n    calledImmediatelyBefore: function calledImmediatelyBefore(spyFn) {\n        if (!this.called || !spyFn.called) {\n            return false;\n        }\n\n        return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] - 1;\n    },\n\n    calledImmediatelyAfter: function calledImmediatelyAfter(spyFn) {\n        if (!this.called || !spyFn.called) {\n            return false;\n        }\n\n        return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] + 1;\n    },\n\n    withArgs: function () {\n        var args = slice.call(arguments);\n\n        if (this.fakes) {\n            var matching = this.matchingFakes(args, true).pop();\n\n            if (matching) {\n                return matching;\n            }\n        } else {\n            this.fakes = [];\n        }\n\n        var original = this;\n        var fake = this.instantiateFake();\n        fake.matchingArguments = args;\n        fake.parent = this;\n        push.call(this.fakes, fake);\n\n        fake.withArgs = function () {\n            return original.withArgs.apply(original, arguments);\n        };\n\n        original.args.forEach(function (arg, i) {\n            if (!fake.matches(arg)) {\n                return;\n            }\n\n            incrementCallCount.call(fake);\n            push.call(fake.thisValues, original.thisValues[i]);\n            push.call(fake.args, arg);\n            push.call(fake.returnValues, original.returnValues[i]);\n            push.call(fake.exceptions, original.exceptions[i]);\n            push.call(fake.callIds, original.callIds[i]);\n        });\n\n        createCallProperties.call(fake);\n\n        return fake;\n    },\n\n    matchingFakes: function (args, strict) {\n        return (this.fakes || []).filter(function (fake) {\n            return fake.matches(args, strict);\n        });\n    },\n\n    matches: function (args, strict) {\n        var margs = this.matchingArguments;\n\n        if (margs.length <= args.length &&\n            deepEqual(margs, args.slice(0, margs.length))) {\n            return !strict || margs.length === args.length;\n        }\n\n        return undefined;\n    },\n\n    printf: function (format) {\n        var spyInstance = this;\n        var args = slice.call(arguments, 1);\n        var formatter;\n\n        return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n            formatter = spyApi.formatters[specifyer];\n\n            if (typeof formatter === \"function\") {\n                return formatter.call(null, spyInstance, args);\n            } else if (!isNaN(parseInt(specifyer, 10))) {\n                return sinonFormat(args[specifyer - 1]);\n            }\n\n            return \"%\" + specifyer;\n        });\n    }\n};\n\nfunction delegateToCalls(method, matchAny, actual, notCalled) {\n    spyApi[method] = function () {\n        if (!this.called) {\n            if (notCalled) {\n                return notCalled.apply(this, arguments);\n            }\n            return false;\n        }\n\n        var currentCall;\n        var matches = 0;\n\n        for (var i = 0, l = this.callCount; i < l; i += 1) {\n            currentCall = this.getCall(i);\n\n            if (currentCall[actual || method].apply(currentCall, arguments)) {\n                matches += 1;\n\n                if (matchAny) {\n                    return true;\n                }\n            }\n        }\n\n        return matches === this.callCount;\n    };\n}\n\ndelegateToCalls(\"calledOn\", true);\ndelegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\ndelegateToCalls(\"calledWith\", true);\ndelegateToCalls(\"calledWithMatch\", true);\ndelegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\ndelegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\ndelegateToCalls(\"calledWithExactly\", true);\ndelegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\ndelegateToCalls(\"neverCalledWith\", false, \"notCalledWith\", function () {\n    return true;\n});\ndelegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\", function () {\n    return true;\n});\ndelegateToCalls(\"threw\", true);\ndelegateToCalls(\"alwaysThrew\", false, \"threw\");\ndelegateToCalls(\"returned\", true);\ndelegateToCalls(\"alwaysReturned\", false, \"returned\");\ndelegateToCalls(\"calledWithNew\", true);\ndelegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\ndelegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n    throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n});\nspyApi.callArgWith = spyApi.callArg;\ndelegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n    throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n});\nspyApi.callArgOnWith = spyApi.callArgOn;\ndelegateToCalls(\"throwArg\", false, \"throwArg\", function () {\n    throw new Error(this.toString() + \" cannot throw arg since it was not yet invoked.\");\n});\ndelegateToCalls(\"yield\", false, \"yield\", function () {\n    throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n});\n// \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\nspyApi.invokeCallback = spyApi.yield;\ndelegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n    throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n});\ndelegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n    throw new Error(this.toString() + \" cannot yield to '\" + valueToString(property) +\n        \"' since it was not yet invoked.\");\n});\ndelegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n    throw new Error(this.toString() + \" cannot yield to '\" + valueToString(property) +\n        \"' since it was not yet invoked.\");\n});\n\nextend(spy, spyApi);\nspy.spyCall = spyCall;\nmodule.exports = spy;\n\n},{\"./call\":5,\"./match\":10,\"./spy-formatters\":15,\"./util/core/deep-equal\":23,\"./util/core/extend\":27,\"./util/core/format\":28,\"./util/core/function-name\":29,\"./util/core/function-to-string\":30,\"./util/core/get-property-descriptor\":32,\"./util/core/value-to-string\":40,\"./util/core/wrap-method\":42}],17:[function(require,module,exports){\n\"use strict\";\n\nvar deprecated = require(\"./util/core/deprecated\");\nvar spy = require(\"./spy\");\nvar wrapMethod = require(\"./util/core/wrap-method\");\n\n// This is deprecated and will be removed in a future version of sinon.\n// We will only consider pull requests that fix serious bugs in the implementation\nfunction stubDescriptor(object, property, descriptor) {\n    var wrapper;\n\n    deprecated.printWarning(\n      \"sinon.stub(obj, 'meth', fn) is deprecated and will be removed from \" +\n      \"the public API in a future version of sinon.\" +\n      \"\\n Use stub(obj, 'meth').callsFake(fn).\" +\n      \"\\n Codemod available at https://github.com/hurrymaplelad/sinon-codemod\"\n    );\n\n    if (!!descriptor && typeof descriptor !== \"function\" && typeof descriptor !== \"object\") {\n        throw new TypeError(\"Custom stub should be a property descriptor\");\n    }\n\n    if (typeof descriptor === \"object\" && Object.keys(descriptor).length === 0) {\n        throw new TypeError(\"Expected property descriptor to have at least one key\");\n    }\n\n    if (typeof descriptor === \"function\") {\n        wrapper = spy && spy.create ? spy.create(descriptor) : descriptor;\n    } else {\n        wrapper = descriptor;\n        if (spy && spy.create) {\n            Object.keys(wrapper).forEach(function (type) {\n                wrapper[type] = spy.create(wrapper[type]);\n            });\n        }\n    }\n\n    return wrapMethod(object, property, wrapper);\n}\n\nmodule.exports = stubDescriptor;\n\n},{\"./spy\":16,\"./util/core/deprecated\":25,\"./util/core/wrap-method\":42}],18:[function(require,module,exports){\n\"use strict\";\n\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar walk = require(\"./util/core/walk\");\n\nfunction stubEntireObject(stub, object) {\n    walk(object || {}, function (prop, propOwner) {\n        // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object\n        // is not Object.prototype\n        if (\n            propOwner !== Object.prototype &&\n            prop !== \"constructor\" &&\n            typeof getPropertyDescriptor(propOwner, prop).value === \"function\"\n        ) {\n            stub(object, prop);\n        }\n    });\n\n    return object;\n}\n\nmodule.exports = stubEntireObject;\n\n},{\"./util/core/get-property-descriptor\":32,\"./util/core/walk\":41}],19:[function(require,module,exports){\n\"use strict\";\n\nvar valueToString = require(\"./util/core/value-to-string\");\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction stubNonFunctionProperty(object, property, value) {\n    var original = object[property];\n\n    if (!hasOwnProperty.call(object, property)) {\n        throw new TypeError(\"Cannot stub non-existent own property \" + valueToString(property));\n    }\n\n    object[property] = value;\n\n    return {\n        restore: function restore() {\n            object[property] = original;\n        }\n    };\n}\n\nmodule.exports = stubNonFunctionProperty;\n\n},{\"./util/core/value-to-string\":40}],20:[function(require,module,exports){\n\"use strict\";\n\nvar behavior = require(\"./behavior\");\nvar behaviors = require(\"./default-behaviors\");\nvar spy = require(\"./spy\");\nvar extend = require(\"./util/core/extend\");\nvar functionToString = require(\"./util/core/function-to-string\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar wrapMethod = require(\"./util/core/wrap-method\");\nvar stubEntireObject = require(\"./stub-entire-object\");\nvar stubDescriptor = require(\"./stub-descriptor\");\nvar throwOnFalsyObject = require(\"./throw-on-falsy-object\");\n\nvar slice = Array.prototype.slice;\n\nfunction stub(object, property, descriptor) {\n    throwOnFalsyObject.apply(null, arguments);\n\n    var actualDescriptor = getPropertyDescriptor(object, property);\n    var isStubbingEntireObject = typeof property === \"undefined\" && typeof object === \"object\";\n    var isCreatingNewStub = !object && typeof property === \"undefined\";\n    var isStubbingDescriptor = object && property && Boolean(descriptor);\n    var isStubbingNonFuncProperty = (typeof object === \"object\" || typeof object === \"function\")\n                                    && typeof property !== \"undefined\"\n                                    && (typeof actualDescriptor === \"undefined\"\n                                    || typeof actualDescriptor.value !== \"function\")\n                                    && typeof descriptor === \"undefined\";\n    var isStubbingExistingMethod = !isStubbingDescriptor\n                                    && typeof object === \"object\"\n                                    && typeof actualDescriptor !== \"undefined\"\n                                    && typeof actualDescriptor.value === \"function\";\n    var arity = isStubbingExistingMethod ? object[property].length : 0;\n\n    if (isStubbingEntireObject) {\n        return stubEntireObject(stub, object);\n    }\n\n    if (isStubbingDescriptor) {\n        return stubDescriptor.apply(null, arguments);\n    }\n\n    if (isCreatingNewStub) {\n        return stub.create();\n    }\n\n    var s = stub.create(arity);\n    s.rootObj = object;\n    s.propName = property;\n    s.restore = function restore() {\n        if (actualDescriptor !== undefined) {\n            Object.defineProperty(object, property, actualDescriptor);\n            return;\n        }\n\n        delete object[property];\n    };\n\n    return isStubbingNonFuncProperty ? s : wrapMethod(object, property, s);\n}\n\nstub.createStubInstance = function (constructor) {\n    if (typeof constructor !== \"function\") {\n        throw new TypeError(\"The constructor should be a function.\");\n    }\n    return stub(Object.create(constructor.prototype));\n};\n\n/*eslint-disable no-use-before-define*/\nfunction getParentBehaviour(stubInstance) {\n    return (stubInstance.parent && getCurrentBehavior(stubInstance.parent));\n}\n\nfunction getDefaultBehavior(stubInstance) {\n    return stubInstance.defaultBehavior ||\n            getParentBehaviour(stubInstance) ||\n            behavior.create(stubInstance);\n}\n\nfunction getCurrentBehavior(stubInstance) {\n    var currentBehavior = stubInstance.behaviors[stubInstance.callCount - 1];\n    return currentBehavior && currentBehavior.isPresent() ? currentBehavior : getDefaultBehavior(stubInstance);\n}\n/*eslint-enable no-use-before-define*/\n\nvar uuid = 0;\n\nvar proto = {\n    create: function create(stubLength) {\n        var functionStub = function () {\n            var args = slice.call(arguments);\n            var matchings = functionStub.matchingFakes(args);\n\n            var fnStub = matchings.sort(function (a, b) {\n                return a.matchingArguments.length - b.matchingArguments.length;\n            }).pop() || functionStub;\n            return getCurrentBehavior(fnStub).invoke(this, arguments);\n        };\n\n        functionStub.id = \"stub#\" + uuid++;\n        var orig = functionStub;\n        functionStub = spy.create(functionStub, stubLength);\n        functionStub.func = orig;\n\n        extend(functionStub, stub);\n        functionStub.instantiateFake = stub.create;\n        functionStub.displayName = \"stub\";\n        functionStub.toString = functionToString;\n\n        functionStub.defaultBehavior = null;\n        functionStub.behaviors = [];\n\n        return functionStub;\n    },\n\n    resetBehavior: function () {\n        var fakes = this.fakes || [];\n\n        this.defaultBehavior = null;\n        this.behaviors = [];\n\n        delete this.returnValue;\n        delete this.returnArgAt;\n        delete this.throwArgAt;\n        delete this.fakeFn;\n        this.returnThis = false;\n\n        fakes.forEach(function (fake) {\n            fake.resetBehavior();\n        });\n    },\n\n    resetHistory: spy.reset,\n\n    reset: function () {\n        this.resetHistory();\n        this.resetBehavior();\n    },\n\n    onCall: function onCall(index) {\n        if (!this.behaviors[index]) {\n            this.behaviors[index] = behavior.create(this);\n        }\n\n        return this.behaviors[index];\n    },\n\n    onFirstCall: function onFirstCall() {\n        return this.onCall(0);\n    },\n\n    onSecondCall: function onSecondCall() {\n        return this.onCall(1);\n    },\n\n    onThirdCall: function onThirdCall() {\n        return this.onCall(2);\n    }\n};\n\nObject.keys(behavior).forEach(function (method) {\n    if (behavior.hasOwnProperty(method) &&\n        !proto.hasOwnProperty(method) &&\n        method !== \"create\" &&\n        method !== \"withArgs\" &&\n        method !== \"invoke\") {\n        proto[method] = behavior.createBehavior(method);\n    }\n});\n\nObject.keys(behaviors).forEach(function (method) {\n    if (behaviors.hasOwnProperty(method) && !proto.hasOwnProperty(method)) {\n        behavior.addBehavior(stub, method, behaviors[method]);\n    }\n});\n\nextend(stub, proto);\nmodule.exports = stub;\n\n},{\"./behavior\":3,\"./default-behaviors\":9,\"./spy\":16,\"./stub-descriptor\":17,\"./stub-entire-object\":18,\"./throw-on-falsy-object\":21,\"./util/core/extend\":27,\"./util/core/function-to-string\":30,\"./util/core/get-property-descriptor\":32,\"./util/core/wrap-method\":42}],21:[function(require,module,exports){\n\"use strict\";\nvar valueToString = require(\"./util/core/value-to-string\");\n\nfunction throwOnFalsyObject(object, property) {\n    if (property && !object) {\n        var type = object === null ? \"null\" : \"undefined\";\n        throw new Error(\"Trying to stub property '\" + valueToString(property) + \"' of \" + type);\n    }\n}\n\nmodule.exports = throwOnFalsyObject;\n\n},{\"./util/core/value-to-string\":40}],22:[function(require,module,exports){\n\"use strict\";\n\nvar every = Array.prototype.every;\n\nmodule.exports = function calledInOrder(spies) {\n    var callMap = {};\n\n    function hasCallsLeft(spy) {\n        if (callMap[spy.id] === undefined) {\n            callMap[spy.id] = 0;\n        }\n\n        return callMap[spy.id] < spy.callCount;\n    }\n\n    if (arguments.length > 1) {\n        spies = arguments;\n    }\n\n    return every.call(spies, function checkAdjacentCalls(spy, i) {\n        var calledBeforeNext = true;\n\n        if (i !== spies.length - 1) {\n            calledBeforeNext = spy.calledBefore(spies[i + 1]);\n        }\n\n        if (hasCallsLeft(spy) && calledBeforeNext) {\n            callMap[spy.id] += 1;\n            return true;\n        }\n\n        return false;\n    });\n};\n\n},{}],23:[function(require,module,exports){\n\"use strict\";\n\nvar div = typeof document !== \"undefined\" && document.createElement(\"div\");\n\nfunction isReallyNaN(val) {\n    return val !== val;\n}\n\nfunction isDOMNode(obj) {\n    var success = false;\n\n    try {\n        obj.appendChild(div);\n        success = div.parentNode === obj;\n    } catch (e) {\n        return false;\n    } finally {\n        try {\n            obj.removeChild(div);\n        } catch (e) {\n            // Remove failed, not much we can do about that\n        }\n    }\n\n    return success;\n}\n\nfunction isElement(obj) {\n    return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n}\n\nvar deepEqual = module.exports = function deepEqual(a, b) {\n    if (typeof a !== \"object\" || typeof b !== \"object\") {\n        return isReallyNaN(a) && isReallyNaN(b) || a === b;\n    }\n\n    if (isElement(a) || isElement(b)) {\n        return a === b;\n    }\n\n    if (a === b) {\n        return true;\n    }\n\n    if ((a === null && b !== null) || (a !== null && b === null)) {\n        return false;\n    }\n\n    if (a instanceof RegExp && b instanceof RegExp) {\n        return (a.source === b.source) && (a.global === b.global) &&\n            (a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);\n    }\n\n    if (a instanceof Error && b instanceof Error) {\n        return a === b;\n    }\n\n    var aString = Object.prototype.toString.call(a);\n    if (aString !== Object.prototype.toString.call(b)) {\n        return false;\n    }\n\n    if (aString === \"[object Date]\") {\n        return a.valueOf() === b.valueOf();\n    }\n\n    var prop;\n    var aLength = 0;\n    var bLength = 0;\n\n    if (aString === \"[object Array]\" && a.length !== b.length) {\n        return false;\n    }\n\n    for (prop in a) {\n        if (Object.prototype.hasOwnProperty.call(a, prop)) {\n            aLength += 1;\n\n            if (!(prop in b)) {\n                return false;\n            }\n\n            // allow alternative function for recursion\n            if (!(arguments[2] || deepEqual)(a[prop], b[prop])) {\n                return false;\n            }\n        }\n    }\n\n    for (prop in b) {\n        if (Object.prototype.hasOwnProperty.call(b, prop)) {\n            bLength += 1;\n        }\n    }\n\n    return aLength === bLength;\n};\n\ndeepEqual.use = function (match) {\n    return function deepEqual$matcher(a, b) {\n        // If both are matchers they must be the same instance in order to be considered equal\n        // If we didn't do that we would end up running one matcher against the other\n        if (match.isMatcher(a)) {\n            if (match.isMatcher(b)) {\n                return a === b;\n            }\n\n            return a.test(b);\n        }\n\n        return deepEqual(a, b, deepEqual$matcher);\n    };\n};\n\n},{}],24:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {\n    injectIntoThis: true,\n    injectInto: null,\n    properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n    useFakeTimers: true,\n    useFakeServer: true\n};\n\n},{}],25:[function(require,module,exports){\n/*eslint no-console: 0 */\n\"use strict\";\n\n// wrap returns a function that will invoke the supplied function and print a deprecation warning to the console each\n// time it is called.\nexports.wrap = function (func, msg) {\n    var wrapped = function () {\n        exports.printWarning(msg);\n        return func.apply(this, arguments);\n    };\n    if (func.prototype) {\n        wrapped.prototype = func.prototype;\n    }\n    return wrapped;\n};\n\n// defaultMsg returns a string which can be supplied to `wrap()` to notify the user that a particular part of the\n// sinon API has been deprecated.\nexports.defaultMsg = function (funcName) {\n    return \"sinon.\" + funcName + \" is deprecated and will be removed from the public API in a future version of sinon.\";\n};\n\nexports.printWarning = function (msg) {\n    // Watch out for IE7 and below! :(\n    if (typeof console !== \"undefined\") {\n        if (console.info) {\n            console.info(msg);\n        } else {\n            console.log(msg);\n        }\n    }\n};\n\n},{}],26:[function(require,module,exports){\n\"use strict\";\n\n// This is an `every` implementation that works for all iterables\nmodule.exports = function every(obj, fn) {\n    var pass = true;\n\n    try {\n        obj.forEach(function () {\n            if (!fn.apply(this, arguments)) {\n                // Throwing an error is the only way to break `forEach`\n                throw new Error();\n            }\n        });\n    } catch (e) {\n        pass = false;\n    }\n\n    return pass;\n};\n\n},{}],27:[function(require,module,exports){\n\"use strict\";\n\n// Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\nvar hasDontEnumBug = (function () {\n    var obj = {\n        constructor: function () {\n            return \"0\";\n        },\n        toString: function () {\n            return \"1\";\n        },\n        valueOf: function () {\n            return \"2\";\n        },\n        toLocaleString: function () {\n            return \"3\";\n        },\n        prototype: function () {\n            return \"4\";\n        },\n        isPrototypeOf: function () {\n            return \"5\";\n        },\n        propertyIsEnumerable: function () {\n            return \"6\";\n        },\n        hasOwnProperty: function () {\n            return \"7\";\n        },\n        length: function () {\n            return \"8\";\n        },\n        unique: function () {\n            return \"9\";\n        }\n    };\n\n    var result = [];\n    for (var prop in obj) {\n        if (obj.hasOwnProperty(prop)) {\n            result.push(obj[prop]());\n        }\n    }\n    return result.join(\"\") !== \"0123456789\";\n})();\n\n/* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will\n *         override properties in previous sources.\n *\n * target - The Object to extend\n * sources - Objects to copy properties from.\n *\n * Returns the extended target\n */\nmodule.exports = function extend(target /*, sources */) {\n    var sources = Array.prototype.slice.call(arguments, 1);\n    var source, i, prop;\n\n    for (i = 0; i < sources.length; i++) {\n        source = sources[i];\n\n        for (prop in source) {\n            if (source.hasOwnProperty(prop)) {\n                target[prop] = source[prop];\n            }\n        }\n\n        // Make sure we copy (own) toString method even when in JScript with DontEnum bug\n        // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\n        if (hasDontEnumBug && source.hasOwnProperty(\"toString\") && source.toString !== target.toString) {\n            target.toString = source.toString;\n        }\n    }\n\n    return target;\n};\n\n},{}],28:[function(require,module,exports){\n\"use strict\";\n\nvar formatio = require(\"formatio\");\n\nvar formatter = formatio.configure({\n    quoteStrings: false,\n    limitChildrenCount: 250\n});\n\nmodule.exports = function format() {\n    return formatter.ascii.apply(formatter, arguments);\n};\n\n},{\"formatio\":49}],29:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function functionName(func) {\n    var name = func.displayName || func.name;\n    var matches;\n\n    // Use function decomposition as a last resort to get function\n    // name. Does not rely on function decomposition to work - if it\n    // doesn't debugging will be slightly less informative\n    // (i.e. toString will say 'spy' rather than 'myFunc').\n    if (!name && (matches = func.toString().match(/function ([^\\s\\(]+)/))) {\n        name = matches[1];\n    }\n\n    return name;\n};\n\n\n},{}],30:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function toString() {\n    var i, prop, thisValue;\n    if (this.getCall && this.callCount) {\n        i = this.callCount;\n\n        while (i--) {\n            thisValue = this.getCall(i).thisValue;\n\n            for (prop in thisValue) {\n                if (thisValue[prop] === this) {\n                    return prop;\n                }\n            }\n        }\n    }\n\n    return this.displayName || \"sinon fake\";\n};\n\n},{}],31:[function(require,module,exports){\n\"use strict\";\n\nvar defaultConfig = require(\"./default-config\");\n\nmodule.exports = function getConfig(custom) {\n    var config = {};\n    var prop;\n\n    custom = custom || {};\n\n    for (prop in defaultConfig) {\n        if (defaultConfig.hasOwnProperty(prop)) {\n            config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaultConfig[prop];\n        }\n    }\n\n    return config;\n};\n\n},{\"./default-config\":24}],32:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function getPropertyDescriptor(object, property) {\n    var proto = object;\n    var descriptor;\n\n    while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {\n        proto = Object.getPrototypeOf(proto);\n    }\n    return descriptor;\n};\n\n},{}],33:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {\n    calledInOrder: require(\"./called-in-order\"),\n    configureLogError: require(\"./log_error\"),\n    defaultConfig: require(\"./default-config\"),\n    deepEqual: require(\"./deep-equal\"),\n    every: require(\"./every\"),\n    extend: require(\"./extend\"),\n    format: require(\"./format\"),\n    functionName: require(\"./function-name\"),\n    functionToString: require(\"./function-to-string\"),\n    getConfig: require(\"./get-config\"),\n    getPropertyDescriptor: require(\"./get-property-descriptor\"),\n    iterableToString: require(\"./iterable-to-string\"),\n    orderByFirstCall: require(\"./order-by-first-call\"),\n    restore: require(\"./restore\"),\n    timesInWords: require(\"./times-in-words\"),\n    typeOf: require(\"./typeOf\"),\n    walk: require(\"./walk\"),\n    wrapMethod: require(\"./wrap-method\")\n};\n\n},{\"./called-in-order\":22,\"./deep-equal\":23,\"./default-config\":24,\"./every\":26,\"./extend\":27,\"./format\":28,\"./function-name\":29,\"./function-to-string\":30,\"./get-config\":31,\"./get-property-descriptor\":32,\"./iterable-to-string\":34,\"./log_error\":35,\"./order-by-first-call\":36,\"./restore\":37,\"./times-in-words\":38,\"./typeOf\":39,\"./walk\":41,\"./wrap-method\":42}],34:[function(require,module,exports){\n\"use strict\";\nvar typeOf = require(\"./typeOf\");\n\nmodule.exports = function iterableToString(obj) {\n    var representation = \"\";\n\n    function stringify(item) {\n        return typeof item === \"string\" ? \"'\" + item + \"'\" : String(item);\n    }\n\n    function mapToString(map) {\n        map.forEach(function (value, key) {\n            representation += \"[\" + stringify(key) + \",\" + stringify(value) + \"],\";\n        });\n\n        representation = representation.slice(0, -1);\n        return representation;\n    }\n\n    function genericIterableToString(iterable) {\n        iterable.forEach(function (value) {\n            representation += stringify(value) + \",\";\n        });\n\n        representation = representation.slice(0, -1);\n        return representation;\n    }\n\n    if (typeOf(obj) === \"map\") {\n        return mapToString(obj);\n    }\n\n    return genericIterableToString(obj);\n};\n\n},{\"./typeOf\":39}],35:[function(require,module,exports){\n\"use strict\";\n\n// cache a reference to setTimeout, so that our reference won't be stubbed out\n// when using fake timers and errors will still get logged\n// https://github.com/cjohansen/Sinon.JS/issues/381\nvar realSetTimeout = setTimeout;\n\nfunction configure(config) {\n    config = config || {};\n    // Function which prints errors.\n    if (!config.hasOwnProperty(\"logger\")) {\n        config.logger = function () { };\n    }\n    // When set to true, any errors logged will be thrown immediately;\n    // If set to false, the errors will be thrown in separate execution frame.\n    if (!config.hasOwnProperty(\"useImmediateExceptions\")) {\n        config.useImmediateExceptions = true;\n    }\n    // wrap realSetTimeout with something we can stub in tests\n    if (!config.hasOwnProperty(\"setTimeout\")) {\n        config.setTimeout = realSetTimeout;\n    }\n\n    return function logError(label, e) {\n        var msg = label + \" threw exception: \";\n        var err = { name: e.name || label, message: e.message || e.toString(), stack: e.stack };\n\n        function throwLoggedError() {\n            err.message = msg + err.message;\n            throw err;\n        }\n\n        config.logger(msg + \"[\" + err.name + \"] \" + err.message);\n\n        if (err.stack) {\n            config.logger(err.stack);\n        }\n\n        if (config.useImmediateExceptions) {\n            throwLoggedError();\n        } else {\n            config.setTimeout(throwLoggedError, 0);\n        }\n    };\n}\n\nmodule.exports = configure;\n\n},{}],36:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function orderByFirstCall(spies) {\n    return spies.sort(function (a, b) {\n        // uuid, won't ever be equal\n        var aCall = a.getCall(0);\n        var bCall = b.getCall(0);\n        var aId = aCall && aCall.callId || -1;\n        var bId = bCall && bCall.callId || -1;\n\n        return aId < bId ? -1 : 1;\n    });\n};\n\n},{}],37:[function(require,module,exports){\n\"use strict\";\n\nvar walk = require(\"./walk\");\n\nfunction isRestorable(obj) {\n    return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n}\n\nmodule.exports = function restore(object) {\n    if (object !== null && typeof object === \"object\") {\n        walk(object, function (prop) {\n            if (isRestorable(object[prop])) {\n                object[prop].restore();\n            }\n        });\n    } else if (isRestorable(object)) {\n        object.restore();\n    }\n};\n\n},{\"./walk\":41}],38:[function(require,module,exports){\n\"use strict\";\n\nvar array = [null, \"once\", \"twice\", \"thrice\"];\n\nmodule.exports = function timesInWords(count) {\n    return array[count] || (count || 0) + \" times\";\n};\n\n},{}],39:[function(require,module,exports){\n\"use strict\";\n\nvar type = require(\"type-detect\");\n\nmodule.exports = function typeOf(value) {\n    return type(value).toLowerCase();\n};\n\n},{\"type-detect\":58}],40:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (value) {\n    if (value && value.toString) {\n        return value.toString();\n    }\n    return String(value);\n};\n\n},{}],41:[function(require,module,exports){\n\"use strict\";\n\nfunction walkInternal(obj, iterator, context, originalObj, seen) {\n    var proto, prop;\n\n    if (typeof Object.getOwnPropertyNames !== \"function\") {\n        // We explicitly want to enumerate through all of the prototype's properties\n        // in this case, therefore we deliberately leave out an own property check.\n        /* eslint-disable guard-for-in */\n        for (prop in obj) {\n            iterator.call(context, obj[prop], prop, obj);\n        }\n        /* eslint-enable guard-for-in */\n\n        return;\n    }\n\n    Object.getOwnPropertyNames(obj).forEach(function (k) {\n        if (seen[k] !== true) {\n            seen[k] = true;\n            var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === \"function\" ?\n                originalObj : obj;\n            iterator.call(context, k, target);\n        }\n    });\n\n    proto = Object.getPrototypeOf(obj);\n    if (proto) {\n        walkInternal(proto, iterator, context, originalObj, seen);\n    }\n}\n\n/* Walks the prototype chain of an object and iterates over every own property\n * name encountered. The iterator is called in the same fashion that Array.prototype.forEach\n * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional\n * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will\n * default to using a simple for..in loop.\n *\n * obj - The object to walk the prototype chain for.\n * iterator - The function to be called on each pass of the walk.\n * context - (Optional) When given, the iterator will be called with this object as the receiver.\n */\nmodule.exports = function walk(obj, iterator, context) {\n    return walkInternal(obj, iterator, context, obj, {});\n};\n\n},{}],42:[function(require,module,exports){\n\"use strict\";\n\nvar getPropertyDescriptor = require(\"./get-property-descriptor\");\nvar valueToString = require(\"./value-to-string\");\n\nvar hasOwn = Object.prototype.hasOwnProperty;\n\nfunction isFunction(obj) {\n    return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n}\n\nfunction mirrorProperties(target, source) {\n    for (var prop in source) {\n        if (!hasOwn.call(target, prop)) {\n            target[prop] = source[prop];\n        }\n    }\n}\n\n// Cheap way to detect if we have ES5 support.\nvar hasES5Support = \"keys\" in Object;\n\nmodule.exports = function wrapMethod(object, property, method) {\n    if (!object) {\n        throw new TypeError(\"Should wrap property of object\");\n    }\n\n    if (typeof method !== \"function\" && typeof method !== \"object\") {\n        throw new TypeError(\"Method wrapper should be a function or a property descriptor\");\n    }\n\n    function checkWrappedMethod(wrappedMethod) {\n        var error;\n\n        if (!isFunction(wrappedMethod)) {\n            error = new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n                                valueToString(property) + \" as function\");\n        } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n            error = new TypeError(\"Attempted to wrap \" + valueToString(property) + \" which is already wrapped\");\n        } else if (wrappedMethod.calledBefore) {\n            var verb = wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n            error = new TypeError(\"Attempted to wrap \" + valueToString(property) + \" which is already \" + verb);\n        }\n\n        if (error) {\n            if (wrappedMethod && wrappedMethod.stackTrace) {\n                error.stack += \"\\n--------------\\n\" + wrappedMethod.stackTrace;\n            }\n            throw error;\n        }\n    }\n\n    var error, wrappedMethod, i;\n\n    function simplePropertyAssignment() {\n        wrappedMethod = object[property];\n        checkWrappedMethod(wrappedMethod);\n        object[property] = method;\n        method.displayName = property;\n    }\n\n    // Firefox has a problem when using hasOwn.call on objects from other frames.\n    var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);\n\n    if (hasES5Support) {\n        var methodDesc = (typeof method === \"function\") ? {value: method} : method;\n        var wrappedMethodDesc = getPropertyDescriptor(object, property);\n\n        if (!wrappedMethodDesc) {\n            error = new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n                                property + \" as function\");\n        } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {\n            error = new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n        }\n        if (error) {\n            if (wrappedMethodDesc && wrappedMethodDesc.stackTrace) {\n                error.stack += \"\\n--------------\\n\" + wrappedMethodDesc.stackTrace;\n            }\n            throw error;\n        }\n\n        var types = Object.keys(methodDesc);\n        for (i = 0; i < types.length; i++) {\n            wrappedMethod = wrappedMethodDesc[types[i]];\n            checkWrappedMethod(wrappedMethod);\n        }\n\n        mirrorProperties(methodDesc, wrappedMethodDesc);\n        for (i = 0; i < types.length; i++) {\n            mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);\n        }\n        Object.defineProperty(object, property, methodDesc);\n\n        // catch failing assignment\n        // this is the converse of the check in `.restore` below\n        if ( typeof method === \"function\" && object[property] !== method ) {\n            // correct any wrongdoings caused by the defineProperty call above,\n            // such as adding new items (if object was a Storage object)\n            delete object[property];\n            simplePropertyAssignment();\n        }\n    } else {\n        simplePropertyAssignment();\n    }\n\n    method.displayName = property;\n\n    // Set up a stack trace which can be used later to find what line of\n    // code the original method was created on.\n    method.stackTrace = (new Error(\"Stack Trace for original\")).stack;\n\n    method.restore = function () {\n        // For prototype properties try to reset by delete first.\n        // If this fails (ex: localStorage on mobile safari) then force a reset\n        // via direct assignment.\n        if (!owned) {\n            // In some cases `delete` may throw an error\n            try {\n                delete object[property];\n            } catch (e) {} // eslint-disable-line no-empty\n            // For native code functions `delete` fails without throwing an error\n            // on Chrome < 43, PhantomJS, etc.\n        } else if (hasES5Support) {\n            Object.defineProperty(object, property, wrappedMethodDesc);\n        }\n\n        if (hasES5Support) {\n            var descriptor = getPropertyDescriptor(object, property);\n            if (descriptor && descriptor.value === method) {\n                object[property] = wrappedMethod;\n            }\n        }\n        else {\n        // Use strict equality comparison to check failures then force a reset\n        // via direct assignment.\n            if (object[property] === method) {\n                object[property] = wrappedMethod;\n            }\n        }\n    };\n\n    method.wrappedMethod = wrappedMethod;\n\n    method.restore.sinon = true;\n\n    if (!hasES5Support) {\n        mirrorProperties(method, wrappedMethod);\n    }\n\n    return method;\n};\n\n},{\"./get-property-descriptor\":32,\"./value-to-string\":40}],43:[function(require,module,exports){\n\"use strict\";\n\nvar push = [].push;\n\nfunction Event(type, bubbles, cancelable, target) {\n    this.initEvent(type, bubbles, cancelable, target);\n}\n\nEvent.prototype = {\n    initEvent: function (type, bubbles, cancelable, target) {\n        this.type = type;\n        this.bubbles = bubbles;\n        this.cancelable = cancelable;\n        this.target = target;\n    },\n\n    stopPropagation: function () {},\n\n    preventDefault: function () {\n        this.defaultPrevented = true;\n    }\n};\n\nfunction ProgressEvent(type, progressEventRaw, target) {\n    this.initEvent(type, false, false, target);\n    this.loaded = typeof progressEventRaw.loaded === \"number\" ? progressEventRaw.loaded : null;\n    this.total = typeof progressEventRaw.total === \"number\" ? progressEventRaw.total : null;\n    this.lengthComputable = !!progressEventRaw.total;\n}\n\nProgressEvent.prototype = new Event();\n\nProgressEvent.prototype.constructor = ProgressEvent;\n\nfunction CustomEvent(type, customData, target) {\n    this.initEvent(type, false, false, target);\n    this.detail = customData.detail || null;\n}\n\nCustomEvent.prototype = new Event();\n\nCustomEvent.prototype.constructor = CustomEvent;\n\nvar EventTarget = {\n    addEventListener: function addEventListener(event, listener) {\n        this.eventListeners = this.eventListeners || {};\n        this.eventListeners[event] = this.eventListeners[event] || [];\n        push.call(this.eventListeners[event], listener);\n    },\n\n    removeEventListener: function removeEventListener(event, listener) {\n        var listeners = this.eventListeners && this.eventListeners[event] || [];\n        var index = listeners.indexOf(listener);\n\n        if (index === -1) {\n            return;\n        }\n\n        listeners.splice(index, 1);\n    },\n\n    dispatchEvent: function dispatchEvent(event) {\n        var self = this;\n        var type = event.type;\n        var listeners = self.eventListeners && self.eventListeners[type] || [];\n\n        listeners.forEach(function (listener) {\n            if (typeof listener === \"function\") {\n                listener.call(self, event);\n            } else {\n                listener.handleEvent(event);\n            }\n        });\n\n        return !!event.defaultPrevented;\n    }\n};\n\nmodule.exports = {\n    Event: Event,\n    ProgressEvent: ProgressEvent,\n    CustomEvent: CustomEvent,\n    EventTarget: EventTarget\n};\n\n},{}],44:[function(require,module,exports){\n\"use strict\";\n\nvar fakeXhr = require(\"./fake_xml_http_request\");\nvar push = [].push;\nvar format = require(\"./core/format\");\nvar configureLogError = require(\"./core/log_error\");\nvar pathToRegexp = require(\"path-to-regexp\");\n\nfunction responseArray(handler) {\n    var response = handler;\n\n    if (Object.prototype.toString.call(handler) !== \"[object Array]\") {\n        response = [200, {}, handler];\n    }\n\n    if (typeof response[2] !== \"string\") {\n        throw new TypeError(\"Fake server response body should be string, but was \" +\n                            typeof response[2]);\n    }\n\n    return response;\n}\n\nfunction getDefaultWindowLocation() {\n    return { \"host\": \"localhost\", \"protocol\": \"http\" };\n}\n\nfunction getWindowLocation() {\n    if (typeof window === \"undefined\") {\n        // Fallback\n        return getDefaultWindowLocation();\n    }\n\n    if (typeof window.location !== \"undefined\") {\n        // Browsers place location on window\n        return window.location;\n    }\n\n    if ((typeof window.window !== \"undefined\") && (typeof window.window.location !== \"undefined\")) {\n        // React Native on Android places location on window.window\n        return window.window.location;\n    }\n\n    return getDefaultWindowLocation();\n}\n\nvar wloc = getWindowLocation();\n\nvar rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\nfunction matchOne(response, reqMethod, reqUrl) {\n    var rmeth = response.method;\n    var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase();\n    var url = response.url;\n    var matchUrl = !url || url === reqUrl || (typeof url.test === \"function\" && url.test(reqUrl));\n\n    return matchMethod && matchUrl;\n}\n\nfunction match(response, request) {\n    var requestUrl = request.url;\n\n    if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n        requestUrl = requestUrl.replace(rCurrLoc, \"\");\n    }\n\n    if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n        if (typeof response.response === \"function\") {\n            var ru = response.url;\n            var args = [request].concat(ru && typeof ru.exec === \"function\" ? ru.exec(requestUrl).slice(1) : []);\n            return response.response.apply(response, args);\n        }\n\n        return true;\n    }\n\n    return false;\n}\n\nfunction incrementRequestCount() {\n    var count = ++this.requestCount;\n\n    this.requested = true;\n\n    this.requestedOnce = count === 1;\n    this.requestedTwice = count === 2;\n    this.requestedThrice = count === 3;\n\n    this.firstRequest = this.getRequest(0);\n    this.secondRequest = this.getRequest(1);\n    this.thirdRequest = this.getRequest(2);\n\n    this.lastRequest = this.getRequest(count - 1);\n}\n\nvar fakeServer = {\n    create: function (config) {\n        var server = Object.create(this);\n        server.configure(config);\n        this.xhr = fakeXhr.useFakeXMLHttpRequest();\n        server.requests = [];\n        server.requestCount = 0;\n        server.queue = [];\n        server.responses = [];\n\n\n        this.xhr.onCreate = function (xhrObj) {\n            xhrObj.unsafeHeadersEnabled = function () {\n                return !(server.unsafeHeadersEnabled === false);\n            };\n            server.addRequest(xhrObj);\n        };\n\n        return server;\n    },\n\n    configure: function (config) {\n        var self = this;\n        var whitelist = {\n            \"autoRespond\": true,\n            \"autoRespondAfter\": true,\n            \"respondImmediately\": true,\n            \"fakeHTTPMethods\": true,\n            \"logger\": true,\n            \"unsafeHeadersEnabled\": true\n        };\n\n        config = config || {};\n\n        Object.keys(config).forEach(function (setting) {\n            if (setting in whitelist) {\n                self[setting] = config[setting];\n            }\n        });\n\n        self.logError = configureLogError(config);\n    },\n\n    addRequest: function addRequest(xhrObj) {\n        var server = this;\n        push.call(this.requests, xhrObj);\n\n        incrementRequestCount.call(this);\n\n        xhrObj.onSend = function () {\n            server.handleRequest(this);\n\n            if (server.respondImmediately) {\n                server.respond();\n            } else if (server.autoRespond && !server.responding) {\n                setTimeout(function () {\n                    server.responding = false;\n                    server.respond();\n                }, server.autoRespondAfter || 10);\n\n                server.responding = true;\n            }\n        };\n    },\n\n    getHTTPMethod: function getHTTPMethod(request) {\n        if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n            var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n            return matches ? matches[1] : request.method;\n        }\n\n        return request.method;\n    },\n\n    handleRequest: function handleRequest(xhr) {\n        if (xhr.async) {\n            push.call(this.queue, xhr);\n        } else {\n            this.processRequest(xhr);\n        }\n    },\n\n    logger: function () {\n        // no-op; override via configure()\n    },\n\n    logError: configureLogError({}),\n\n    log: function log(response, request) {\n        var str;\n\n        str = \"Request:\\n\" + format(request) + \"\\n\\n\";\n        str += \"Response:\\n\" + format(response) + \"\\n\\n\";\n\n        if (typeof this.logger === \"function\") {\n            this.logger(str);\n        }\n    },\n\n    respondWith: function respondWith(method, url, body) {\n        if (arguments.length === 1 && typeof method !== \"function\") {\n            this.response = responseArray(method);\n            return;\n        }\n\n        if (arguments.length === 1) {\n            body = method;\n            url = method = null;\n        }\n\n        if (arguments.length === 2) {\n            body = url;\n            url = method;\n            method = null;\n        }\n\n        push.call(this.responses, {\n            method: method,\n            url: typeof url === \"string\" && url !== \"\" ? pathToRegexp(url) : url,\n            response: typeof body === \"function\" ? body : responseArray(body)\n        });\n    },\n\n    respond: function respond() {\n        if (arguments.length > 0) {\n            this.respondWith.apply(this, arguments);\n        }\n\n        var queue = this.queue || [];\n        var requests = queue.splice(0, queue.length);\n        var self = this;\n\n        requests.forEach(function (request) {\n            self.processRequest(request);\n        });\n    },\n\n    processRequest: function processRequest(request) {\n        try {\n            if (request.aborted) {\n                return;\n            }\n\n            var response = this.response || [404, {}, \"\"];\n\n            if (this.responses) {\n                for (var l = this.responses.length, i = l - 1; i >= 0; i--) {\n                    if (match.call(this, this.responses[i], request)) {\n                        response = this.responses[i].response;\n                        break;\n                    }\n                }\n            }\n\n            if (request.readyState !== 4) {\n                this.log(response, request);\n\n                request.respond(response[0], response[1], response[2]);\n            }\n        } catch (e) {\n            this.logError(\"Fake server request processing\", e);\n        }\n    },\n\n    restore: function restore() {\n        return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n    },\n\n    getRequest: function getRequest(index) {\n        return this.requests[index] || null;\n    },\n\n    reset: function reset() {\n        this.resetBehavior();\n        this.resetHistory();\n    },\n\n    resetBehavior: function resetBehavior() {\n        this.responses.length = this.queue.length = 0;\n    },\n\n    resetHistory: function resetHistory() {\n        this.requests.length = this.requestCount = 0;\n\n        this.requestedOnce = this.requestedTwice = this.requestedThrice = this.requested = false;\n\n        this.firstRequest = this.secondRequest = this.thirdRequest = this.lastRequest = null;\n    }\n};\n\nmodule.exports = fakeServer;\n\n},{\"./core/format\":28,\"./core/log_error\":35,\"./fake_xml_http_request\":47,\"path-to-regexp\":52}],45:[function(require,module,exports){\n\"use strict\";\n\nvar fakeServer = require(\"./fake_server\");\nvar fakeTimers = require(\"./fake_timers\");\n\nfunction Server() {}\nServer.prototype = fakeServer;\n\nvar fakeServerWithClock = new Server();\n\nfakeServerWithClock.addRequest = function addRequest(xhr) {\n    if (xhr.async) {\n        if (typeof setTimeout.clock === \"object\") {\n            this.clock = setTimeout.clock;\n        } else {\n            this.clock = fakeTimers.useFakeTimers();\n            this.resetClock = true;\n        }\n\n        if (!this.longestTimeout) {\n            var clockSetTimeout = this.clock.setTimeout;\n            var clockSetInterval = this.clock.setInterval;\n            var server = this;\n\n            this.clock.setTimeout = function (fn, timeout) {\n                server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                return clockSetTimeout.apply(this, arguments);\n            };\n\n            this.clock.setInterval = function (fn, timeout) {\n                server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                return clockSetInterval.apply(this, arguments);\n            };\n        }\n    }\n\n    return fakeServer.addRequest.call(this, xhr);\n};\n\nfakeServerWithClock.respond = function respond() {\n    var returnVal = fakeServer.respond.apply(this, arguments);\n\n    if (this.clock) {\n        this.clock.tick(this.longestTimeout || 0);\n        this.longestTimeout = 0;\n\n        if (this.resetClock) {\n            this.clock.restore();\n            this.resetClock = false;\n        }\n    }\n\n    return returnVal;\n};\n\nfakeServerWithClock.restore = function restore() {\n    if (this.clock) {\n        this.clock.restore();\n    }\n\n    return fakeServer.restore.apply(this, arguments);\n};\n\nmodule.exports = fakeServerWithClock;\n\n},{\"./fake_server\":44,\"./fake_timers\":46}],46:[function(require,module,exports){\n\"use strict\";\n\nvar llx = require(\"lolex\");\n\nexports.useFakeTimers = function () {\n    var now;\n    var methods = Array.prototype.slice.call(arguments);\n\n    if (typeof methods[0] === \"string\") {\n        now = 0;\n    } else {\n        now = methods.shift();\n    }\n\n    var clock = llx.install(now || 0, methods);\n    clock.restore = clock.uninstall;\n    return clock;\n};\n\nexports.clock = {\n    create: function (now) {\n        return llx.createClock(now);\n    }\n};\n\nexports.timers = {\n    setTimeout: setTimeout,\n    clearTimeout: clearTimeout,\n    setImmediate: (typeof setImmediate !== \"undefined\" ? setImmediate : undefined),\n    clearImmediate: (typeof clearImmediate !== \"undefined\" ? clearImmediate : undefined),\n    setInterval: setInterval,\n    clearInterval: clearInterval,\n    Date: Date\n};\n\n},{\"lolex\":51}],47:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar TextEncoder = require(\"text-encoding\").TextEncoder;\n\nvar configureLogError = require(\"./core/log_error\");\nvar sinonEvent = require(\"./event\");\nvar extend = require(\"./core/extend\");\n\nfunction getWorkingXHR(globalScope) {\n    var supportsXHR = typeof globalScope.XMLHttpRequest !== \"undefined\";\n    if (supportsXHR) {\n        return globalScope.XMLHttpRequest;\n    }\n\n    var supportsActiveX = typeof globalScope.ActiveXObject !== \"undefined\";\n    if (supportsActiveX) {\n        return function () {\n            return new globalScope.ActiveXObject(\"MSXML2.XMLHTTP.3.0\");\n        };\n    }\n\n    return false;\n}\n\nvar supportsProgress = typeof ProgressEvent !== \"undefined\";\nvar supportsCustomEvent = typeof CustomEvent !== \"undefined\";\nvar supportsFormData = typeof FormData !== \"undefined\";\nvar supportsArrayBuffer = typeof ArrayBuffer !== \"undefined\";\nvar supportsBlob = require(\"../blob\").isSupported;\nvar isReactNative = global.navigator && global.navigator.product === \"ReactNative\";\nvar sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };\nsinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\nsinonXhr.GlobalActiveXObject = global.ActiveXObject;\nsinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject !== \"undefined\";\nsinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== \"undefined\";\nsinonXhr.workingXHR = getWorkingXHR(global);\nsinonXhr.supportsCORS = isReactNative ||\n    (sinonXhr.supportsXHR && \"withCredentials\" in (new sinonXhr.GlobalXMLHttpRequest()));\n\nvar unsafeHeaders = {\n    \"Accept-Charset\": true,\n    \"Accept-Encoding\": true,\n    \"Connection\": true,\n    \"Content-Length\": true,\n    \"Cookie\": true,\n    \"Cookie2\": true,\n    \"Content-Transfer-Encoding\": true,\n    \"Date\": true,\n    \"Expect\": true,\n    \"Host\": true,\n    \"Keep-Alive\": true,\n    \"Referer\": true,\n    \"TE\": true,\n    \"Trailer\": true,\n    \"Transfer-Encoding\": true,\n    \"Upgrade\": true,\n    \"User-Agent\": true,\n    \"Via\": true\n};\n\n\nfunction EventTargetHandler() {\n    var self = this;\n    var events = [\"loadstart\", \"progress\", \"abort\", \"error\", \"load\", \"timeout\", \"loadend\"];\n\n    function addEventListener(eventName) {\n        self.addEventListener(eventName, function (event) {\n            var listener = self[\"on\" + eventName];\n\n            if (listener && typeof listener === \"function\") {\n                listener.call(this, event);\n            }\n        });\n    }\n\n    events.forEach(addEventListener);\n}\n\nEventTargetHandler.prototype = sinonEvent.EventTarget;\n\n// Note that for FakeXMLHttpRequest to work pre ES5\n// we lose some of the alignment with the spec.\n// To ensure as close a match as possible,\n// set responseType before calling open, send or respond;\nfunction FakeXMLHttpRequest(config) {\n    EventTargetHandler.call(this);\n    this.readyState = FakeXMLHttpRequest.UNSENT;\n    this.requestHeaders = {};\n    this.requestBody = null;\n    this.status = 0;\n    this.statusText = \"\";\n    this.upload = new EventTargetHandler();\n    this.responseType = \"\";\n    this.response = \"\";\n    this.logError = configureLogError(config);\n    if (sinonXhr.supportsCORS) {\n        this.withCredentials = false;\n    }\n\n    if (typeof FakeXMLHttpRequest.onCreate === \"function\") {\n        FakeXMLHttpRequest.onCreate(this);\n    }\n}\n\nfunction verifyState(xhr) {\n    if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n        throw new Error(\"INVALID_STATE_ERR\");\n    }\n\n    if (xhr.sendFlag) {\n        throw new Error(\"INVALID_STATE_ERR\");\n    }\n}\n\nfunction getHeader(headers, header) {\n    var foundHeader = Object.keys(headers).filter(function (h) {\n        return h.toLowerCase() === header.toLowerCase();\n    });\n\n    return foundHeader[0] || null;\n}\n\nfunction excludeSetCookie2Header(header) {\n    return !/^Set-Cookie2?$/i.test(header);\n}\n\n// largest arity in XHR is 5 - XHR#open\nvar apply = function (obj, method, args) {\n    switch (args.length) {\n        case 0: return obj[method]();\n        case 1: return obj[method](args[0]);\n        case 2: return obj[method](args[0], args[1]);\n        case 3: return obj[method](args[0], args[1], args[2]);\n        case 4: return obj[method](args[0], args[1], args[2], args[3]);\n        case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]);\n        default: throw new Error(\"Unhandled case\");\n    }\n};\n\nFakeXMLHttpRequest.filters = [];\nFakeXMLHttpRequest.addFilter = function addFilter(fn) {\n    this.filters.push(fn);\n};\nFakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {\n    var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap\n\n    [\n        \"open\",\n        \"setRequestHeader\",\n        \"send\",\n        \"abort\",\n        \"getResponseHeader\",\n        \"getAllResponseHeaders\",\n        \"addEventListener\",\n        \"overrideMimeType\",\n        \"removeEventListener\"\n    ].forEach(function (method) {\n        fakeXhr[method] = function () {\n            return apply(xhr, method, arguments);\n        };\n    });\n\n    var copyAttrs = function (args) {\n        args.forEach(function (attr) {\n            fakeXhr[attr] = xhr[attr];\n        });\n    };\n\n    var stateChange = function stateChange() {\n        fakeXhr.readyState = xhr.readyState;\n        if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            copyAttrs([\"status\", \"statusText\"]);\n        }\n        if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n            copyAttrs([\"responseText\", \"response\"]);\n        }\n        if (xhr.readyState === FakeXMLHttpRequest.DONE) {\n            copyAttrs([\"responseXML\"]);\n        }\n        if (fakeXhr.onreadystatechange) {\n            fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });\n        }\n    };\n\n    if (xhr.addEventListener) {\n        Object.keys(fakeXhr.eventListeners).forEach(function (event) {\n            /*eslint-disable no-loop-func*/\n            fakeXhr.eventListeners[event].forEach(function (handler) {\n                xhr.addEventListener(event, handler);\n            });\n            /*eslint-enable no-loop-func*/\n        });\n\n        xhr.addEventListener(\"readystatechange\", stateChange);\n    } else {\n        xhr.onreadystatechange = stateChange;\n    }\n    apply(xhr, \"open\", xhrArgs);\n};\nFakeXMLHttpRequest.useFilters = false;\n\nfunction verifyRequestOpened(xhr) {\n    if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n        throw new Error(\"INVALID_STATE_ERR - \" + xhr.readyState);\n    }\n}\n\nfunction verifyRequestSent(xhr) {\n    if (xhr.readyState === FakeXMLHttpRequest.DONE) {\n        throw new Error(\"Request done\");\n    }\n}\n\nfunction verifyHeadersReceived(xhr) {\n    if (xhr.async && xhr.readyState !== FakeXMLHttpRequest.HEADERS_RECEIVED) {\n        throw new Error(\"No headers received\");\n    }\n}\n\nfunction verifyResponseBodyType(body) {\n    if (typeof body !== \"string\") {\n        var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n                             body + \", which is not a string.\");\n        error.name = \"InvalidBodyException\";\n        throw error;\n    }\n}\n\nfunction convertToArrayBuffer(body, encoding) {\n    return new TextEncoder(encoding || \"utf-8\").encode(body).buffer;\n}\n\nfunction isXmlContentType(contentType) {\n    return !contentType || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(contentType);\n}\n\nfunction convertResponseBody(responseType, contentType, body) {\n    if (responseType === \"\" || responseType === \"text\") {\n        return body;\n    } else if (supportsArrayBuffer && responseType === \"arraybuffer\") {\n        return convertToArrayBuffer(body);\n    } else if (responseType === \"json\") {\n        try {\n            return JSON.parse(body);\n        } catch (e) {\n            // Return parsing failure as null\n            return null;\n        }\n    } else if (supportsBlob && responseType === \"blob\") {\n        var blobOptions = {};\n        if (contentType) {\n            blobOptions.type = contentType;\n        }\n        return new Blob([convertToArrayBuffer(body)], blobOptions);\n    } else if (responseType === \"document\") {\n        if (isXmlContentType(contentType)) {\n            return FakeXMLHttpRequest.parseXML(body);\n        }\n        return null;\n    }\n    throw new Error(\"Invalid responseType \" + responseType);\n}\n\nfunction clearResponse(xhr) {\n    if (xhr.responseType === \"\" || xhr.responseType === \"text\") {\n        xhr.response = xhr.responseText = \"\";\n    } else {\n        xhr.response = xhr.responseText = null;\n    }\n    xhr.responseXML = null;\n}\n\nFakeXMLHttpRequest.parseXML = function parseXML(text) {\n    // Treat empty string as parsing failure\n    if (text !== \"\") {\n        try {\n            if (typeof DOMParser !== \"undefined\") {\n                var parser = new DOMParser();\n                return parser.parseFromString(text, \"text/xml\");\n            }\n            var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n            xmlDoc.async = \"false\";\n            xmlDoc.loadXML(text);\n            return xmlDoc;\n        } catch (e) {\n            // Unable to parse XML - no biggie\n        }\n    }\n\n    return null;\n};\n\nFakeXMLHttpRequest.statusCodes = {\n    100: \"Continue\",\n    101: \"Switching Protocols\",\n    200: \"OK\",\n    201: \"Created\",\n    202: \"Accepted\",\n    203: \"Non-Authoritative Information\",\n    204: \"No Content\",\n    205: \"Reset Content\",\n    206: \"Partial Content\",\n    207: \"Multi-Status\",\n    300: \"Multiple Choice\",\n    301: \"Moved Permanently\",\n    302: \"Found\",\n    303: \"See Other\",\n    304: \"Not Modified\",\n    305: \"Use Proxy\",\n    307: \"Temporary Redirect\",\n    400: \"Bad Request\",\n    401: \"Unauthorized\",\n    402: \"Payment Required\",\n    403: \"Forbidden\",\n    404: \"Not Found\",\n    405: \"Method Not Allowed\",\n    406: \"Not Acceptable\",\n    407: \"Proxy Authentication Required\",\n    408: \"Request Timeout\",\n    409: \"Conflict\",\n    410: \"Gone\",\n    411: \"Length Required\",\n    412: \"Precondition Failed\",\n    413: \"Request Entity Too Large\",\n    414: \"Request-URI Too Long\",\n    415: \"Unsupported Media Type\",\n    416: \"Requested Range Not Satisfiable\",\n    417: \"Expectation Failed\",\n    422: \"Unprocessable Entity\",\n    500: \"Internal Server Error\",\n    501: \"Not Implemented\",\n    502: \"Bad Gateway\",\n    503: \"Service Unavailable\",\n    504: \"Gateway Timeout\",\n    505: \"HTTP Version Not Supported\"\n};\n\nextend(FakeXMLHttpRequest.prototype, sinonEvent.EventTarget, {\n    async: true,\n\n    open: function open(method, url, async, username, password) {\n        this.method = method;\n        this.url = url;\n        this.async = typeof async === \"boolean\" ? async : true;\n        this.username = username;\n        this.password = password;\n        clearResponse(this);\n        this.requestHeaders = {};\n        this.sendFlag = false;\n\n        if (FakeXMLHttpRequest.useFilters === true) {\n            var xhrArgs = arguments;\n            var defake = FakeXMLHttpRequest.filters.some(function (filter) {\n                return filter.apply(this, xhrArgs);\n            });\n            if (defake) {\n                FakeXMLHttpRequest.defake(this, arguments);\n                return;\n            }\n        }\n        this.readyStateChange(FakeXMLHttpRequest.OPENED);\n    },\n\n    readyStateChange: function readyStateChange(state) {\n        this.readyState = state;\n\n        var readyStateChangeEvent = new sinonEvent.Event(\"readystatechange\", false, false, this);\n        var event, progress;\n\n        if (typeof this.onreadystatechange === \"function\") {\n            try {\n                this.onreadystatechange(readyStateChangeEvent);\n            } catch (e) {\n                this.logError(\"Fake XHR onreadystatechange handler\", e);\n            }\n        }\n\n        if (this.readyState === FakeXMLHttpRequest.DONE) {\n            if (this.aborted || this.status === 0) {\n                progress = {loaded: 0, total: 0};\n                event = this.aborted ? \"abort\" : \"error\";\n            } else {\n                progress = {loaded: 100, total: 100};\n                event = \"load\";\n            }\n\n            if (supportsProgress) {\n                this.upload.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progress, this));\n                this.upload.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this));\n                this.upload.dispatchEvent(new sinonEvent.ProgressEvent(\"loadend\", progress, this));\n            }\n\n            this.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progress, this));\n            this.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this));\n            this.dispatchEvent(new sinonEvent.ProgressEvent(\"loadend\", progress, this));\n        }\n\n        this.dispatchEvent(readyStateChangeEvent);\n    },\n\n    setRequestHeader: function setRequestHeader(header, value) {\n        verifyState(this);\n\n        var checkUnsafeHeaders = true;\n        if (typeof this.unsafeHeadersEnabled === \"function\") {\n            checkUnsafeHeaders = this.unsafeHeadersEnabled();\n        }\n\n        if (checkUnsafeHeaders && (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header))) {\n            throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n        }\n\n        if (this.requestHeaders[header]) {\n            this.requestHeaders[header] += \",\" + value;\n        } else {\n            this.requestHeaders[header] = value;\n        }\n    },\n\n    setStatus: function setStatus(status) {\n        var sanitizedStatus = typeof status === \"number\" ? status : 200;\n\n        verifyRequestOpened(this);\n        this.status = sanitizedStatus;\n        this.statusText = FakeXMLHttpRequest.statusCodes[sanitizedStatus];\n    },\n\n    // Helps testing\n    setResponseHeaders: function setResponseHeaders(headers) {\n        verifyRequestOpened(this);\n\n        var responseHeaders = this.responseHeaders = {};\n\n        Object.keys(headers).forEach(function (header) {\n            responseHeaders[header] = headers[header];\n        });\n\n        if (this.async) {\n            this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n        } else {\n            this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n        }\n    },\n\n    // Currently treats ALL data as a DOMString (i.e. no Document)\n    send: function send(data) {\n        verifyState(this);\n\n        if (!/^(head)$/i.test(this.method)) {\n            var contentType = getHeader(this.requestHeaders, \"Content-Type\");\n            if (this.requestHeaders[contentType]) {\n                var value = this.requestHeaders[contentType].split(\";\");\n                this.requestHeaders[contentType] = value[0] + \";charset=utf-8\";\n            } else if (supportsFormData && !(data instanceof FormData)) {\n                this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n            }\n\n            this.requestBody = data;\n        }\n\n        this.errorFlag = false;\n        this.sendFlag = this.async;\n        clearResponse(this);\n        this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\n        if (typeof this.onSend === \"function\") {\n            this.onSend(this);\n        }\n\n        this.dispatchEvent(new sinonEvent.Event(\"loadstart\", false, false, this));\n    },\n\n    abort: function abort() {\n        this.aborted = true;\n        clearResponse(this);\n        this.errorFlag = true;\n        this.requestHeaders = {};\n        this.responseHeaders = {};\n\n        if (this.readyState !== FakeXMLHttpRequest.UNSENT && this.sendFlag\n            && this.readyState !== FakeXMLHttpRequest.DONE) {\n            this.readyStateChange(FakeXMLHttpRequest.DONE);\n            this.sendFlag = false;\n        }\n\n        this.readyState = FakeXMLHttpRequest.UNSENT;\n    },\n\n    error: function () {\n        clearResponse(this);\n        this.errorFlag = true;\n        this.requestHeaders = {};\n        this.responseHeaders = {};\n\n        this.readyStateChange(FakeXMLHttpRequest.DONE);\n    },\n\n    getResponseHeader: function getResponseHeader(header) {\n        if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            return null;\n        }\n\n        if (/^Set-Cookie2?$/i.test(header)) {\n            return null;\n        }\n\n        header = getHeader(this.responseHeaders, header);\n\n        return this.responseHeaders[header] || null;\n    },\n\n    getAllResponseHeaders: function getAllResponseHeaders() {\n        if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            return \"\";\n        }\n\n        var responseHeaders = this.responseHeaders;\n        var headers = Object.keys(responseHeaders)\n            .filter(excludeSetCookie2Header)\n            .reduce(function (prev, header) {\n                var value = responseHeaders[header];\n\n                return prev + (header + \": \" + value + \"\\r\\n\");\n            }, \"\");\n\n        return headers;\n    },\n\n    setResponseBody: function setResponseBody(body) {\n        verifyRequestSent(this);\n        verifyHeadersReceived(this);\n        verifyResponseBodyType(body);\n        var contentType = this.overriddenMimeType || this.getResponseHeader(\"Content-Type\");\n\n        var isTextResponse = this.responseType === \"\" || this.responseType === \"text\";\n        clearResponse(this);\n        if (this.async) {\n            var chunkSize = this.chunkSize || 10;\n            var index = 0;\n\n            do {\n                this.readyStateChange(FakeXMLHttpRequest.LOADING);\n\n                if (isTextResponse) {\n                    this.responseText = this.response += body.substring(index, index + chunkSize);\n                }\n                index += chunkSize;\n            } while (index < body.length);\n        }\n\n        this.response = convertResponseBody(this.responseType, contentType, body);\n        if (isTextResponse) {\n            this.responseText = this.response;\n        }\n\n        if (this.responseType === \"document\") {\n            this.responseXML = this.response;\n        } else if (this.responseType === \"\" && isXmlContentType(contentType)) {\n            this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n        }\n        this.readyStateChange(FakeXMLHttpRequest.DONE);\n    },\n\n    respond: function respond(status, headers, body) {\n        this.setStatus(status);\n        this.setResponseHeaders(headers || {});\n        this.setResponseBody(body || \"\");\n    },\n\n    uploadProgress: function uploadProgress(progressEventRaw) {\n        if (supportsProgress) {\n            this.upload.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progressEventRaw));\n        }\n    },\n\n    downloadProgress: function downloadProgress(progressEventRaw) {\n        if (supportsProgress) {\n            this.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progressEventRaw));\n        }\n    },\n\n    uploadError: function uploadError(error) {\n        if (supportsCustomEvent) {\n            this.upload.dispatchEvent(new sinonEvent.CustomEvent(\"error\", {detail: error}));\n        }\n    },\n\n    overrideMimeType: function overrideMimeType(type) {\n        if (this.readyState >= FakeXMLHttpRequest.LOADING) {\n            throw new Error(\"INVALID_STATE_ERR\");\n        }\n        this.overriddenMimeType = type;\n    }\n});\n\nvar states = {\n    UNSENT: 0,\n    OPENED: 1,\n    HEADERS_RECEIVED: 2,\n    LOADING: 3,\n    DONE: 4\n};\n\nextend(FakeXMLHttpRequest, states);\nextend(FakeXMLHttpRequest.prototype, states);\n\nfunction useFakeXMLHttpRequest() {\n    FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n        if (sinonXhr.supportsXHR) {\n            global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;\n        }\n\n        if (sinonXhr.supportsActiveX) {\n            global.ActiveXObject = sinonXhr.GlobalActiveXObject;\n        }\n\n        delete FakeXMLHttpRequest.restore;\n\n        if (keepOnCreate !== true) {\n            delete FakeXMLHttpRequest.onCreate;\n        }\n    };\n    if (sinonXhr.supportsXHR) {\n        global.XMLHttpRequest = FakeXMLHttpRequest;\n    }\n\n    if (sinonXhr.supportsActiveX) {\n        global.ActiveXObject = function ActiveXObject(objId) {\n            if (objId === \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\n                return new FakeXMLHttpRequest();\n            }\n\n            return new sinonXhr.GlobalActiveXObject(objId);\n        };\n    }\n\n    return FakeXMLHttpRequest;\n}\n\nmodule.exports = {\n    xhr: sinonXhr,\n    FakeXMLHttpRequest: FakeXMLHttpRequest,\n    useFakeXMLHttpRequest: useFakeXMLHttpRequest\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../blob\":4,\"./core/extend\":27,\"./core/log_error\":35,\"./event\":43,\"text-encoding\":55}],48:[function(require,module,exports){\n/*!\n\n diff v3.3.0\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com>\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n  copyright notice, this list of conditions and the\n  following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n  copyright notice, this list of conditions and the\n  following disclaimer in the documentation and/or other\n  materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n  contributors may be used to endorse or promote products\n  derived from this software without specific prior\n  written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n@license\n*/\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JsDiff\"] = factory();\n\telse\n\t\troot[\"JsDiff\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined;\n\t/*istanbul ignore end*/\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/\n\tvar /*istanbul ignore start*/_character = __webpack_require__(2) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_word = __webpack_require__(3) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_sentence = __webpack_require__(6) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_css = __webpack_require__(7) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_json = __webpack_require__(8) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_array = __webpack_require__(9) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_apply = __webpack_require__(10) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_merge = __webpack_require__(13) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_dmp = __webpack_require__(16) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_xml = __webpack_require__(17) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/* See LICENSE file for terms of use */\n\n\t/*\n\t * Text diff implementation.\n\t *\n\t * This library supports the following APIS:\n\t * JsDiff.diffChars: Character by character diff\n\t * JsDiff.diffWords: Word (as defined by \\b regex) diff which ignores whitespace\n\t * JsDiff.diffLines: Line based diff\n\t *\n\t * JsDiff.diffCss: Diff targeted at CSS content\n\t *\n\t * These methods are based on the implementation proposed in\n\t * \"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986).\n\t * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927\n\t */\n\texports. /*istanbul ignore end*/Diff = _base2['default'];\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = _character.diffChars;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = _word.diffWords;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = _word.diffWordsWithSpace;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = _line.diffLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = _line.diffTrimmedLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = _sentence.diffSentences;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = _css.diffCss;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = _json.diffJson;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = _array.diffArrays;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = _create.structuredPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = _create.createTwoFilesPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = _create.createPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = _apply.applyPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = _apply.applyPatches;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = _parse.parsePatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = _merge.merge;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = _dmp.convertChangesToDMP;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = _xml.convertChangesToXML;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = _json.canonicalize;\n\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports['default'] = /*istanbul ignore end*/Diff;\n\tfunction Diff() {}\n\n\tDiff.prototype = { /*istanbul ignore start*/\n\t  /*istanbul ignore end*/diff: function diff(oldString, newString) {\n\t    /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n\t    var callback = options.callback;\n\t    if (typeof options === 'function') {\n\t      callback = options;\n\t      options = {};\n\t    }\n\t    this.options = options;\n\n\t    var self = this;\n\n\t    function done(value) {\n\t      if (callback) {\n\t        setTimeout(function () {\n\t          callback(undefined, value);\n\t        }, 0);\n\t        return true;\n\t      } else {\n\t        return value;\n\t      }\n\t    }\n\n\t    // Allow subclasses to massage the input prior to running\n\t    oldString = this.castInput(oldString);\n\t    newString = this.castInput(newString);\n\n\t    oldString = this.removeEmpty(this.tokenize(oldString));\n\t    newString = this.removeEmpty(this.tokenize(newString));\n\n\t    var newLen = newString.length,\n\t        oldLen = oldString.length;\n\t    var editLength = 1;\n\t    var maxEditLength = newLen + oldLen;\n\t    var bestPath = [{ newPos: -1, components: [] }];\n\n\t    // Seed editLength = 0, i.e. the content starts with the same values\n\t    var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n\t    if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n\t      // Identity per the equality and tokenizer\n\t      return done([{ value: this.join(newString), count: newString.length }]);\n\t    }\n\n\t    // Main worker method. checks all permutations of a given edit length for acceptance.\n\t    function execEditLength() {\n\t      for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n\t        var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t        var addPath = bestPath[diagonalPath - 1],\n\t            removePath = bestPath[diagonalPath + 1],\n\t            _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n\t        if (addPath) {\n\t          // No one else is going to attempt to use this value, clear it\n\t          bestPath[diagonalPath - 1] = undefined;\n\t        }\n\n\t        var canAdd = addPath && addPath.newPos + 1 < newLen,\n\t            canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\n\t        if (!canAdd && !canRemove) {\n\t          // If this path is a terminal then prune\n\t          bestPath[diagonalPath] = undefined;\n\t          continue;\n\t        }\n\n\t        // Select the diagonal that we want to branch from. We select the prior\n\t        // path whose position in the new string is the farthest from the origin\n\t        // and does not pass the bounds of the diff graph\n\t        if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\n\t          basePath = clonePath(removePath);\n\t          self.pushComponent(basePath.components, undefined, true);\n\t        } else {\n\t          basePath = addPath; // No need to clone, we've pulled it from the list\n\t          basePath.newPos++;\n\t          self.pushComponent(basePath.components, true, undefined);\n\t        }\n\n\t        _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);\n\n\t        // If we have hit the end of both strings, then we are done\n\t        if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\n\t          return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\n\t        } else {\n\t          // Otherwise track this path as a potential candidate and continue.\n\t          bestPath[diagonalPath] = basePath;\n\t        }\n\t      }\n\n\t      editLength++;\n\t    }\n\n\t    // Performs the length of edit iteration. Is a bit fugly as this has to support the\n\t    // sync and async mode which is never fun. Loops over execEditLength until a value\n\t    // is produced.\n\t    if (callback) {\n\t      (function exec() {\n\t        setTimeout(function () {\n\t          // This should not happen, but we want to be safe.\n\t          /* istanbul ignore next */\n\t          if (editLength > maxEditLength) {\n\t            return callback();\n\t          }\n\n\t          if (!execEditLength()) {\n\t            exec();\n\t          }\n\t        }, 0);\n\t      })();\n\t    } else {\n\t      while (editLength <= maxEditLength) {\n\t        var ret = execEditLength();\n\t        if (ret) {\n\t          return ret;\n\t        }\n\t      }\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) {\n\t    var last = components[components.length - 1];\n\t    if (last && last.added === added && last.removed === removed) {\n\t      // We need to clone here as the component clone operation is just\n\t      // as shallow array clone\n\t      components[components.length - 1] = { count: last.count + 1, added: added, removed: removed };\n\t    } else {\n\t      components.push({ count: 1, added: added, removed: removed });\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\n\t    var newLen = newString.length,\n\t        oldLen = oldString.length,\n\t        newPos = basePath.newPos,\n\t        oldPos = newPos - diagonalPath,\n\t        commonCount = 0;\n\t    while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n\t      newPos++;\n\t      oldPos++;\n\t      commonCount++;\n\t    }\n\n\t    if (commonCount) {\n\t      basePath.components.push({ count: commonCount });\n\t    }\n\n\t    basePath.newPos = newPos;\n\t    return oldPos;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) {\n\t    return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) {\n\t    var ret = [];\n\t    for (var i = 0; i < array.length; i++) {\n\t      if (array[i]) {\n\t        ret.push(array[i]);\n\t      }\n\t    }\n\t    return ret;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) {\n\t    return value;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) {\n\t    return value.split('');\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) {\n\t    return chars.join('');\n\t  }\n\t};\n\n\tfunction buildValues(diff, components, newString, oldString, useLongestToken) {\n\t  var componentPos = 0,\n\t      componentLen = components.length,\n\t      newPos = 0,\n\t      oldPos = 0;\n\n\t  for (; componentPos < componentLen; componentPos++) {\n\t    var component = components[componentPos];\n\t    if (!component.removed) {\n\t      if (!component.added && useLongestToken) {\n\t        var value = newString.slice(newPos, newPos + component.count);\n\t        value = value.map(function (value, i) {\n\t          var oldValue = oldString[oldPos + i];\n\t          return oldValue.length > value.length ? oldValue : value;\n\t        });\n\n\t        component.value = diff.join(value);\n\t      } else {\n\t        component.value = diff.join(newString.slice(newPos, newPos + component.count));\n\t      }\n\t      newPos += component.count;\n\n\t      // Common case\n\t      if (!component.added) {\n\t        oldPos += component.count;\n\t      }\n\t    } else {\n\t      component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\n\t      oldPos += component.count;\n\n\t      // Reverse add and remove so removes are output first to match common convention\n\t      // The diffing algorithm is tied to add then remove output and this is the simplest\n\t      // route to get the desired output with minimal overhead.\n\t      if (componentPos && components[componentPos - 1].added) {\n\t        var tmp = components[componentPos - 1];\n\t        components[componentPos - 1] = components[componentPos];\n\t        components[componentPos] = tmp;\n\t      }\n\t    }\n\t  }\n\n\t  // Special case handle for when one terminal is ignored. For this case we merge the\n\t  // terminal into the prior string and drop the change.\n\t  var lastComponent = components[componentLen - 1];\n\t  if (componentLen > 1 && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {\n\t    components[componentLen - 2].value += lastComponent.value;\n\t    components.pop();\n\t  }\n\n\t  return components;\n\t}\n\n\tfunction clonePath(path) {\n\t  return { newPos: path.newPos, components: path.components.slice(0) };\n\t}\n\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.characterDiff = undefined;\n\texports. /*istanbul ignore end*/diffChars = diffChars;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;\n\tfunction diffChars(oldStr, newStr, options) {\n\t  return characterDiff.diff(oldStr, newStr, options);\n\t}\n\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.wordDiff = undefined;\n\texports. /*istanbul ignore end*/diffWords = diffWords;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/\n\tvar /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/\n\n\t// Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode\n\t//\n\t// Ranges and exceptions:\n\t// Latin-1 Supplement, 0080–00FF\n\t//  - U+00D7  × Multiplication sign\n\t//  - U+00F7  ÷ Division sign\n\t// Latin Extended-A, 0100–017F\n\t// Latin Extended-B, 0180–024F\n\t// IPA Extensions, 0250–02AF\n\t// Spacing Modifier Letters, 02B0–02FF\n\t//  - U+02C7  ˇ &#711;  Caron\n\t//  - U+02D8  ˘ &#728;  Breve\n\t//  - U+02D9  ˙ &#729;  Dot Above\n\t//  - U+02DA  ˚ &#730;  Ring Above\n\t//  - U+02DB  ˛ &#731;  Ogonek\n\t//  - U+02DC  ˜ &#732;  Small Tilde\n\t//  - U+02DD  ˝ &#733;  Double Acute Accent\n\t// Latin Extended Additional, 1E00–1EFF\n\tvar extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\n\n\tvar reWhitespace = /\\S/;\n\n\tvar wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;\n\twordDiff.equals = function (left, right) {\n\t  if (this.options.ignoreCase) {\n\t    left = left.toLowerCase();\n\t    right = right.toLowerCase();\n\t  }\n\t  return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\n\t};\n\twordDiff.tokenize = function (value) {\n\t  var tokens = value.split(/(\\s+|\\b)/);\n\n\t  // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.\n\t  for (var i = 0; i < tokens.length - 1; i++) {\n\t    // If we have an empty string in the next field and we have only word chars before and after, merge\n\t    if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\n\t      tokens[i] += tokens[i + 2];\n\t      tokens.splice(i + 1, 2);\n\t      i--;\n\t    }\n\t  }\n\n\t  return tokens;\n\t};\n\n\tfunction diffWords(oldStr, newStr, options) {\n\t  options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true });\n\t  return wordDiff.diff(oldStr, newStr, options);\n\t}\n\n\tfunction diffWordsWithSpace(oldStr, newStr, options) {\n\t  return wordDiff.diff(oldStr, newStr, options);\n\t}\n\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/generateOptions = generateOptions;\n\tfunction generateOptions(options, defaults) {\n\t  if (typeof options === 'function') {\n\t    defaults.callback = options;\n\t  } else if (options) {\n\t    for (var name in options) {\n\t      /* istanbul ignore else */\n\t      if (options.hasOwnProperty(name)) {\n\t        defaults[name] = options[name];\n\t      }\n\t    }\n\t  }\n\t  return defaults;\n\t}\n\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.lineDiff = undefined;\n\texports. /*istanbul ignore end*/diffLines = diffLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/\n\tvar /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;\n\tlineDiff.tokenize = function (value) {\n\t  var retLines = [],\n\t      linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n\n\t  // Ignore the final empty token that occurs if the string ends with a new line\n\t  if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n\t    linesAndNewlines.pop();\n\t  }\n\n\t  // Merge the content and line separators into single tokens\n\t  for (var i = 0; i < linesAndNewlines.length; i++) {\n\t    var line = linesAndNewlines[i];\n\n\t    if (i % 2 && !this.options.newlineIsToken) {\n\t      retLines[retLines.length - 1] += line;\n\t    } else {\n\t      if (this.options.ignoreWhitespace) {\n\t        line = line.trim();\n\t      }\n\t      retLines.push(line);\n\t    }\n\t  }\n\n\t  return retLines;\n\t};\n\n\tfunction diffLines(oldStr, newStr, callback) {\n\t  return lineDiff.diff(oldStr, newStr, callback);\n\t}\n\tfunction diffTrimmedLines(oldStr, newStr, callback) {\n\t  var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true });\n\t  return lineDiff.diff(oldStr, newStr, options);\n\t}\n\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.sentenceDiff = undefined;\n\texports. /*istanbul ignore end*/diffSentences = diffSentences;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;\n\tsentenceDiff.tokenize = function (value) {\n\t  return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\n\t};\n\n\tfunction diffSentences(oldStr, newStr, callback) {\n\t  return sentenceDiff.diff(oldStr, newStr, callback);\n\t}\n\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.cssDiff = undefined;\n\texports. /*istanbul ignore end*/diffCss = diffCss;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;\n\tcssDiff.tokenize = function (value) {\n\t  return value.split(/([{}:;,]|\\s+)/);\n\t};\n\n\tfunction diffCss(oldStr, newStr, callback) {\n\t  return cssDiff.diff(oldStr, newStr, callback);\n\t}\n\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.jsonDiff = undefined;\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n\texports. /*istanbul ignore end*/diffJson = diffJson;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/\n\tvar /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/\n\n\tvar objectPrototypeToString = Object.prototype.toString;\n\n\tvar jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;\n\t// Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n\t// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n\tjsonDiff.useLongestToken = true;\n\n\tjsonDiff.tokenize = /*istanbul ignore start*/_line.lineDiff. /*istanbul ignore end*/tokenize;\n\tjsonDiff.castInput = function (value) {\n\t  /*istanbul ignore start*/var /*istanbul ignore end*/undefinedReplacement = this.options.undefinedReplacement;\n\n\n\t  return typeof value === 'string' ? value : JSON.stringify(canonicalize(value), function (k, v) {\n\t    if (typeof v === 'undefined') {\n\t      return undefinedReplacement;\n\t    }\n\n\t    return v;\n\t  }, '  ');\n\t};\n\tjsonDiff.equals = function (left, right) {\n\t  return (/*istanbul ignore start*/_base2['default']. /*istanbul ignore end*/prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'))\n\t  );\n\t};\n\n\tfunction diffJson(oldObj, newObj, options) {\n\t  return jsonDiff.diff(oldObj, newObj, options);\n\t}\n\n\t// This function handles the presence of circular references by bailing out when encountering an\n\t// object that is already on the \"stack\" of items being processed.\n\tfunction canonicalize(obj, stack, replacementStack) {\n\t  stack = stack || [];\n\t  replacementStack = replacementStack || [];\n\n\t  var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  for (i = 0; i < stack.length; i += 1) {\n\t    if (stack[i] === obj) {\n\t      return replacementStack[i];\n\t    }\n\t  }\n\n\t  var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  if ('[object Array]' === objectPrototypeToString.call(obj)) {\n\t    stack.push(obj);\n\t    canonicalizedObj = new Array(obj.length);\n\t    replacementStack.push(canonicalizedObj);\n\t    for (i = 0; i < obj.length; i += 1) {\n\t      canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack);\n\t    }\n\t    stack.pop();\n\t    replacementStack.pop();\n\t    return canonicalizedObj;\n\t  }\n\n\t  if (obj && obj.toJSON) {\n\t    obj = obj.toJSON();\n\t  }\n\n\t  if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) {\n\t    stack.push(obj);\n\t    canonicalizedObj = {};\n\t    replacementStack.push(canonicalizedObj);\n\t    var sortedKeys = [],\n\t        key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t    for (key in obj) {\n\t      /* istanbul ignore else */\n\t      if (obj.hasOwnProperty(key)) {\n\t        sortedKeys.push(key);\n\t      }\n\t    }\n\t    sortedKeys.sort();\n\t    for (i = 0; i < sortedKeys.length; i += 1) {\n\t      key = sortedKeys[i];\n\t      canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack);\n\t    }\n\t    stack.pop();\n\t    replacementStack.pop();\n\t  } else {\n\t    canonicalizedObj = obj;\n\t  }\n\t  return canonicalizedObj;\n\t}\n\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.arrayDiff = undefined;\n\texports. /*istanbul ignore end*/diffArrays = diffArrays;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default']() /*istanbul ignore end*/;\n\tarrayDiff.tokenize = arrayDiff.join = function (value) {\n\t  return value.slice();\n\t};\n\n\tfunction diffArrays(oldArr, newArr, callback) {\n\t  return arrayDiff.diff(oldArr, newArr, callback);\n\t}\n\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/applyPatch = applyPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_distanceIterator = __webpack_require__(12) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tvar _distanceIterator2 = _interopRequireDefault(_distanceIterator);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/function applyPatch(source, uniDiff) {\n\t  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];\n\n\t  if (typeof uniDiff === 'string') {\n\t    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);\n\t  }\n\n\t  if (Array.isArray(uniDiff)) {\n\t    if (uniDiff.length > 1) {\n\t      throw new Error('applyPatch only works with a single input.');\n\t    }\n\n\t    uniDiff = uniDiff[0];\n\t  }\n\n\t  // Apply the diff to the input\n\t  var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n\t      delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n\t      hunks = uniDiff.hunks,\n\t      compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{\n\t    return (/*istanbul ignore end*/line === patchContent\n\t    );\n\t  },\n\t      errorCount = 0,\n\t      fuzzFactor = options.fuzzFactor || 0,\n\t      minLine = 0,\n\t      offset = 0,\n\t      removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,\n\t      addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  /**\n\t   * Checks if the hunk exactly fits on the provided location\n\t   */\n\t  function hunkFits(hunk, toPos) {\n\t    for (var j = 0; j < hunk.lines.length; j++) {\n\t      var line = hunk.lines[j],\n\t          operation = line[0],\n\t          content = line.substr(1);\n\n\t      if (operation === ' ' || operation === '-') {\n\t        // Context sanity check\n\t        if (!compareLine(toPos + 1, lines[toPos], operation, content)) {\n\t          errorCount++;\n\n\t          if (errorCount > fuzzFactor) {\n\t            return false;\n\t          }\n\t        }\n\t        toPos++;\n\t      }\n\t    }\n\n\t    return true;\n\t  }\n\n\t  // Search best fit offsets for each hunk based on the previous ones\n\t  for (var i = 0; i < hunks.length; i++) {\n\t    var hunk = hunks[i],\n\t        maxLine = lines.length - hunk.oldLines,\n\t        localOffset = 0,\n\t        toPos = offset + hunk.oldStart - 1;\n\n\t    var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine);\n\n\t    for (; localOffset !== undefined; localOffset = iterator()) {\n\t      if (hunkFits(hunk, toPos + localOffset)) {\n\t        hunk.offset = offset += localOffset;\n\t        break;\n\t      }\n\t    }\n\n\t    if (localOffset === undefined) {\n\t      return false;\n\t    }\n\n\t    // Set lower text limit to end of the current hunk, so next ones don't try\n\t    // to fit over already patched text\n\t    minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\n\t  }\n\n\t  // Apply patch hunks\n\t  var diffOffset = 0;\n\t  for (var _i = 0; _i < hunks.length; _i++) {\n\t    var _hunk = hunks[_i],\n\t        _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\n\t    diffOffset += _hunk.newLines - _hunk.oldLines;\n\n\t    for (var j = 0; j < _hunk.lines.length; j++) {\n\t      var line = _hunk.lines[j],\n\t          operation = line[0],\n\t          content = line.substr(1),\n\t          delimiter = _hunk.linedelimiters[j];\n\n\t      if (operation === ' ') {\n\t        _toPos++;\n\t      } else if (operation === '-') {\n\t        lines.splice(_toPos, 1);\n\t        delimiters.splice(_toPos, 1);\n\t        /* istanbul ignore else */\n\t      } else if (operation === '+') {\n\t          lines.splice(_toPos, 0, content);\n\t          delimiters.splice(_toPos, 0, delimiter);\n\t          _toPos++;\n\t        } else if (operation === '\\\\') {\n\t          var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\n\t          if (previousOperation === '+') {\n\t            removeEOFNL = true;\n\t          } else if (previousOperation === '-') {\n\t            addEOFNL = true;\n\t          }\n\t        }\n\t    }\n\t  }\n\n\t  // Handle EOFNL insertion/removal\n\t  if (removeEOFNL) {\n\t    while (!lines[lines.length - 1]) {\n\t      lines.pop();\n\t      delimiters.pop();\n\t    }\n\t  } else if (addEOFNL) {\n\t    lines.push('');\n\t    delimiters.push('\\n');\n\t  }\n\t  for (var _k = 0; _k < lines.length - 1; _k++) {\n\t    lines[_k] = lines[_k] + delimiters[_k];\n\t  }\n\t  return lines.join('');\n\t}\n\n\t// Wrapper that supports multiple file patches via callbacks.\n\tfunction applyPatches(uniDiff, options) {\n\t  if (typeof uniDiff === 'string') {\n\t    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);\n\t  }\n\n\t  var currentIndex = 0;\n\t  function processIndex() {\n\t    var index = uniDiff[currentIndex++];\n\t    if (!index) {\n\t      return options.complete();\n\t    }\n\n\t    options.loadFile(index, function (err, data) {\n\t      if (err) {\n\t        return options.complete(err);\n\t      }\n\n\t      var updatedContent = applyPatch(data, index, options);\n\t      options.patched(index, updatedContent, function (err) {\n\t        if (err) {\n\t          return options.complete(err);\n\t        }\n\n\t        processIndex();\n\t      });\n\t    });\n\t  }\n\t  processIndex();\n\t}\n\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/parsePatch = parsePatch;\n\tfunction parsePatch(uniDiff) {\n\t  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n\t  var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n\t      delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n\t      list = [],\n\t      i = 0;\n\n\t  function parseIndex() {\n\t    var index = {};\n\t    list.push(index);\n\n\t    // Parse diff metadata\n\t    while (i < diffstr.length) {\n\t      var line = diffstr[i];\n\n\t      // File header found, end parsing diff metadata\n\t      if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\n\t        break;\n\t      }\n\n\t      // Diff index\n\t      var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\n\t      if (header) {\n\t        index.index = header[1];\n\t      }\n\n\t      i++;\n\t    }\n\n\t    // Parse file headers if they are defined. Unified diff requires them, but\n\t    // there's no technical issues to have an isolated hunk without file header\n\t    parseFileHeader(index);\n\t    parseFileHeader(index);\n\n\t    // Parse hunks\n\t    index.hunks = [];\n\n\t    while (i < diffstr.length) {\n\t      var _line = diffstr[i];\n\n\t      if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\n\t        break;\n\t      } else if (/^@@/.test(_line)) {\n\t        index.hunks.push(parseHunk());\n\t      } else if (_line && options.strict) {\n\t        // Ignore unexpected content unless in strict mode\n\t        throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));\n\t      } else {\n\t        i++;\n\t      }\n\t    }\n\t  }\n\n\t  // Parses the --- and +++ headers, if none are found, no lines\n\t  // are consumed.\n\t  function parseFileHeader(index) {\n\t    var headerPattern = /^(---|\\+\\+\\+)\\s+([\\S ]*)(?:\\t(.*?)\\s*)?$/;\n\t    var fileHeader = headerPattern.exec(diffstr[i]);\n\t    if (fileHeader) {\n\t      var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';\n\t      var fileName = fileHeader[2].replace(/\\\\\\\\/g, '\\\\');\n\t      if (/^\".*\"$/.test(fileName)) {\n\t        fileName = fileName.substr(1, fileName.length - 2);\n\t      }\n\t      index[keyPrefix + 'FileName'] = fileName;\n\t      index[keyPrefix + 'Header'] = fileHeader[3];\n\n\t      i++;\n\t    }\n\t  }\n\n\t  // Parses a hunk\n\t  // This assumes that we are at the start of a hunk.\n\t  function parseHunk() {\n\t    var chunkHeaderIndex = i,\n\t        chunkHeaderLine = diffstr[i++],\n\t        chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n\n\t    var hunk = {\n\t      oldStart: +chunkHeader[1],\n\t      oldLines: +chunkHeader[2] || 1,\n\t      newStart: +chunkHeader[3],\n\t      newLines: +chunkHeader[4] || 1,\n\t      lines: [],\n\t      linedelimiters: []\n\t    };\n\n\t    var addCount = 0,\n\t        removeCount = 0;\n\t    for (; i < diffstr.length; i++) {\n\t      // Lines starting with '---' could be mistaken for the \"remove line\" operation\n\t      // But they could be the header for the next file. Therefore prune such cases out.\n\t      if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {\n\t        break;\n\t      }\n\t      var operation = diffstr[i][0];\n\n\t      if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\n\t        hunk.lines.push(diffstr[i]);\n\t        hunk.linedelimiters.push(delimiters[i] || '\\n');\n\n\t        if (operation === '+') {\n\t          addCount++;\n\t        } else if (operation === '-') {\n\t          removeCount++;\n\t        } else if (operation === ' ') {\n\t          addCount++;\n\t          removeCount++;\n\t        }\n\t      } else {\n\t        break;\n\t      }\n\t    }\n\n\t    // Handle the empty block count case\n\t    if (!addCount && hunk.newLines === 1) {\n\t      hunk.newLines = 0;\n\t    }\n\t    if (!removeCount && hunk.oldLines === 1) {\n\t      hunk.oldLines = 0;\n\t    }\n\n\t    // Perform optional sanity checking\n\t    if (options.strict) {\n\t      if (addCount !== hunk.newLines) {\n\t        throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n\t      }\n\t      if (removeCount !== hunk.oldLines) {\n\t        throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n\t      }\n\t    }\n\n\t    return hunk;\n\t  }\n\n\t  while (i < diffstr.length) {\n\t    parseIndex();\n\t  }\n\n\t  return list;\n\t}\n\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\n\texports[\"default\"] = /*istanbul ignore end*/function (start, minLine, maxLine) {\n\t  var wantForward = true,\n\t      backwardExhausted = false,\n\t      forwardExhausted = false,\n\t      localOffset = 1;\n\n\t  return function iterator() {\n\t    if (wantForward && !forwardExhausted) {\n\t      if (backwardExhausted) {\n\t        localOffset++;\n\t      } else {\n\t        wantForward = false;\n\t      }\n\n\t      // Check if trying to fit beyond text length, and if not, check it fits\n\t      // after offset location (or desired location on first iteration)\n\t      if (start + localOffset <= maxLine) {\n\t        return localOffset;\n\t      }\n\n\t      forwardExhausted = true;\n\t    }\n\n\t    if (!backwardExhausted) {\n\t      if (!forwardExhausted) {\n\t        wantForward = true;\n\t      }\n\n\t      // Check if trying to fit before text beginning, and if not, check it fits\n\t      // before offset location\n\t      if (minLine <= start - localOffset) {\n\t        return -localOffset++;\n\t      }\n\n\t      backwardExhausted = true;\n\t      return iterator();\n\t    }\n\n\t    // We tried to fit hunk before text beginning and beyond text lenght, then\n\t    // hunk can't fit on the text. Return undefined\n\t  };\n\t};\n\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/calcLineCount = calcLineCount;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge;\n\n\tvar /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_array = __webpack_require__(15) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\t/*istanbul ignore end*/function calcLineCount(hunk) {\n\t  var conflicted = false;\n\n\t  hunk.oldLines = 0;\n\t  hunk.newLines = 0;\n\n\t  hunk.lines.forEach(function (line) {\n\t    if (typeof line !== 'string') {\n\t      conflicted = true;\n\t      return;\n\t    }\n\n\t    if (line[0] === '+' || line[0] === ' ') {\n\t      hunk.newLines++;\n\t    }\n\t    if (line[0] === '-' || line[0] === ' ') {\n\t      hunk.oldLines++;\n\t    }\n\t  });\n\n\t  if (conflicted) {\n\t    delete hunk.oldLines;\n\t    delete hunk.newLines;\n\t  }\n\t}\n\n\tfunction merge(mine, theirs, base) {\n\t  mine = loadPatch(mine, base);\n\t  theirs = loadPatch(theirs, base);\n\n\t  var ret = {};\n\n\t  // For index we just let it pass through as it doesn't have any necessary meaning.\n\t  // Leaving sanity checks on this to the API consumer that may know more about the\n\t  // meaning in their own context.\n\t  if (mine.index || theirs.index) {\n\t    ret.index = mine.index || theirs.index;\n\t  }\n\n\t  if (mine.newFileName || theirs.newFileName) {\n\t    if (!fileNameChanged(mine)) {\n\t      // No header or no change in ours, use theirs (and ours if theirs does not exist)\n\t      ret.oldFileName = theirs.oldFileName || mine.oldFileName;\n\t      ret.newFileName = theirs.newFileName || mine.newFileName;\n\t      ret.oldHeader = theirs.oldHeader || mine.oldHeader;\n\t      ret.newHeader = theirs.newHeader || mine.newHeader;\n\t    } else if (!fileNameChanged(theirs)) {\n\t      // No header or no change in theirs, use ours\n\t      ret.oldFileName = mine.oldFileName;\n\t      ret.newFileName = mine.newFileName;\n\t      ret.oldHeader = mine.oldHeader;\n\t      ret.newHeader = mine.newHeader;\n\t    } else {\n\t      // Both changed... figure it out\n\t      ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\n\t      ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\n\t      ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\n\t      ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\n\t    }\n\t  }\n\n\t  ret.hunks = [];\n\n\t  var mineIndex = 0,\n\t      theirsIndex = 0,\n\t      mineOffset = 0,\n\t      theirsOffset = 0;\n\n\t  while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\n\t    var mineCurrent = mine.hunks[mineIndex] || { oldStart: Infinity },\n\t        theirsCurrent = theirs.hunks[theirsIndex] || { oldStart: Infinity };\n\n\t    if (hunkBefore(mineCurrent, theirsCurrent)) {\n\t      // This patch does not overlap with any of the others, yay.\n\t      ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\n\t      mineIndex++;\n\t      theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\n\t    } else if (hunkBefore(theirsCurrent, mineCurrent)) {\n\t      // This patch does not overlap with any of the others, yay.\n\t      ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\n\t      theirsIndex++;\n\t      mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\n\t    } else {\n\t      // Overlap, merge as best we can\n\t      var mergedHunk = {\n\t        oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\n\t        oldLines: 0,\n\t        newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\n\t        newLines: 0,\n\t        lines: []\n\t      };\n\t      mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\n\t      theirsIndex++;\n\t      mineIndex++;\n\n\t      ret.hunks.push(mergedHunk);\n\t    }\n\t  }\n\n\t  return ret;\n\t}\n\n\tfunction loadPatch(param, base) {\n\t  if (typeof param === 'string') {\n\t    if (/^@@/m.test(param) || /^Index:/m.test(param)) {\n\t      return (/*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(param)[0]\n\t      );\n\t    }\n\n\t    if (!base) {\n\t      throw new Error('Must provide a base reference or pass in a patch');\n\t    }\n\t    return (/*istanbul ignore start*/(0, _create.structuredPatch) /*istanbul ignore end*/(undefined, undefined, base, param)\n\t    );\n\t  }\n\n\t  return param;\n\t}\n\n\tfunction fileNameChanged(patch) {\n\t  return patch.newFileName && patch.newFileName !== patch.oldFileName;\n\t}\n\n\tfunction selectField(index, mine, theirs) {\n\t  if (mine === theirs) {\n\t    return mine;\n\t  } else {\n\t    index.conflict = true;\n\t    return { mine: mine, theirs: theirs };\n\t  }\n\t}\n\n\tfunction hunkBefore(test, check) {\n\t  return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\n\t}\n\n\tfunction cloneHunk(hunk, offset) {\n\t  return {\n\t    oldStart: hunk.oldStart, oldLines: hunk.oldLines,\n\t    newStart: hunk.newStart + offset, newLines: hunk.newLines,\n\t    lines: hunk.lines\n\t  };\n\t}\n\n\tfunction mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\n\t  // This will generally result in a conflicted hunk, but there are cases where the context\n\t  // is the only overlap where we can successfully merge the content here.\n\t  var mine = { offset: mineOffset, lines: mineLines, index: 0 },\n\t      their = { offset: theirOffset, lines: theirLines, index: 0 };\n\n\t  // Handle any leading content\n\t  insertLeading(hunk, mine, their);\n\t  insertLeading(hunk, their, mine);\n\n\t  // Now in the overlap content. Scan through and select the best changes from each.\n\t  while (mine.index < mine.lines.length && their.index < their.lines.length) {\n\t    var mineCurrent = mine.lines[mine.index],\n\t        theirCurrent = their.lines[their.index];\n\n\t    if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {\n\t      // Both modified ...\n\t      mutualChange(hunk, mine, their);\n\t    } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {\n\t      /*istanbul ignore start*/\n\t      var _hunk$lines;\n\n\t      /*istanbul ignore end*/\n\t      // Mine inserted\n\t      /*istanbul ignore start*/(_hunk$lines = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(mine)));\n\t    } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {\n\t      /*istanbul ignore start*/\n\t      var _hunk$lines2;\n\n\t      /*istanbul ignore end*/\n\t      // Theirs inserted\n\t      /*istanbul ignore start*/(_hunk$lines2 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(their)));\n\t    } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {\n\t      // Mine removed or edited\n\t      removal(hunk, mine, their);\n\t    } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {\n\t      // Their removed or edited\n\t      removal(hunk, their, mine, true);\n\t    } else if (mineCurrent === theirCurrent) {\n\t      // Context identity\n\t      hunk.lines.push(mineCurrent);\n\t      mine.index++;\n\t      their.index++;\n\t    } else {\n\t      // Context mismatch\n\t      conflict(hunk, collectChange(mine), collectChange(their));\n\t    }\n\t  }\n\n\t  // Now push anything that may be remaining\n\t  insertTrailing(hunk, mine);\n\t  insertTrailing(hunk, their);\n\n\t  calcLineCount(hunk);\n\t}\n\n\tfunction mutualChange(hunk, mine, their) {\n\t  var myChanges = collectChange(mine),\n\t      theirChanges = collectChange(their);\n\n\t  if (allRemoves(myChanges) && allRemoves(theirChanges)) {\n\t    // Special case for remove changes that are supersets of one another\n\t    if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\n\t      /*istanbul ignore start*/\n\t      var _hunk$lines3;\n\n\t      /*istanbul ignore end*/\n\t      /*istanbul ignore start*/(_hunk$lines3 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges));\n\t      return;\n\t    } else if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\n\t      /*istanbul ignore start*/\n\t      var _hunk$lines4;\n\n\t      /*istanbul ignore end*/\n\t      /*istanbul ignore start*/(_hunk$lines4 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines4 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges));\n\t      return;\n\t    }\n\t  } else if ( /*istanbul ignore start*/(0, _array.arrayEqual) /*istanbul ignore end*/(myChanges, theirChanges)) {\n\t    /*istanbul ignore start*/\n\t    var _hunk$lines5;\n\n\t    /*istanbul ignore end*/\n\t    /*istanbul ignore start*/(_hunk$lines5 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines5 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges));\n\t    return;\n\t  }\n\n\t  conflict(hunk, myChanges, theirChanges);\n\t}\n\n\tfunction removal(hunk, mine, their, swap) {\n\t  var myChanges = collectChange(mine),\n\t      theirChanges = collectContext(their, myChanges);\n\t  if (theirChanges.merged) {\n\t    /*istanbul ignore start*/\n\t    var _hunk$lines6;\n\n\t    /*istanbul ignore end*/\n\t    /*istanbul ignore start*/(_hunk$lines6 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines6 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges.merged));\n\t  } else {\n\t    conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\n\t  }\n\t}\n\n\tfunction conflict(hunk, mine, their) {\n\t  hunk.conflict = true;\n\t  hunk.lines.push({\n\t    conflict: true,\n\t    mine: mine,\n\t    theirs: their\n\t  });\n\t}\n\n\tfunction insertLeading(hunk, insert, their) {\n\t  while (insert.offset < their.offset && insert.index < insert.lines.length) {\n\t    var line = insert.lines[insert.index++];\n\t    hunk.lines.push(line);\n\t    insert.offset++;\n\t  }\n\t}\n\tfunction insertTrailing(hunk, insert) {\n\t  while (insert.index < insert.lines.length) {\n\t    var line = insert.lines[insert.index++];\n\t    hunk.lines.push(line);\n\t  }\n\t}\n\n\tfunction collectChange(state) {\n\t  var ret = [],\n\t      operation = state.lines[state.index][0];\n\t  while (state.index < state.lines.length) {\n\t    var line = state.lines[state.index];\n\n\t    // Group additions that are immediately after subtractions and treat them as one \"atomic\" modify change.\n\t    if (operation === '-' && line[0] === '+') {\n\t      operation = '+';\n\t    }\n\n\t    if (operation === line[0]) {\n\t      ret.push(line);\n\t      state.index++;\n\t    } else {\n\t      break;\n\t    }\n\t  }\n\n\t  return ret;\n\t}\n\tfunction collectContext(state, matchChanges) {\n\t  var changes = [],\n\t      merged = [],\n\t      matchIndex = 0,\n\t      contextChanges = false,\n\t      conflicted = false;\n\t  while (matchIndex < matchChanges.length && state.index < state.lines.length) {\n\t    var change = state.lines[state.index],\n\t        match = matchChanges[matchIndex];\n\n\t    // Once we've hit our add, then we are done\n\t    if (match[0] === '+') {\n\t      break;\n\t    }\n\n\t    contextChanges = contextChanges || change[0] !== ' ';\n\n\t    merged.push(match);\n\t    matchIndex++;\n\n\t    // Consume any additions in the other block as a conflict to attempt\n\t    // to pull in the remaining context after this\n\t    if (change[0] === '+') {\n\t      conflicted = true;\n\n\t      while (change[0] === '+') {\n\t        changes.push(change);\n\t        change = state.lines[++state.index];\n\t      }\n\t    }\n\n\t    if (match.substr(1) === change.substr(1)) {\n\t      changes.push(change);\n\t      state.index++;\n\t    } else {\n\t      conflicted = true;\n\t    }\n\t  }\n\n\t  if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {\n\t    conflicted = true;\n\t  }\n\n\t  if (conflicted) {\n\t    return changes;\n\t  }\n\n\t  while (matchIndex < matchChanges.length) {\n\t    merged.push(matchChanges[matchIndex++]);\n\t  }\n\n\t  return {\n\t    merged: merged,\n\t    changes: changes\n\t  };\n\t}\n\n\tfunction allRemoves(changes) {\n\t  return changes.reduce(function (prev, change) {\n\t    return prev && change[0] === '-';\n\t  }, true);\n\t}\n\tfunction skipRemoveSuperset(state, removeChanges, delta) {\n\t  for (var i = 0; i < delta; i++) {\n\t    var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\n\t    if (state.lines[state.index + i] !== ' ' + changeContent) {\n\t      return false;\n\t    }\n\t  }\n\n\t  state.index += delta;\n\t  return true;\n\t}\n\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/structuredPatch = structuredPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch;\n\n\tvar /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\t/*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  if (!options) {\n\t    options = {};\n\t  }\n\t  if (typeof options.context === 'undefined') {\n\t    options.context = 4;\n\t  }\n\n\t  var diff = /*istanbul ignore start*/(0, _line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options);\n\t  diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier\n\n\t  function contextLines(lines) {\n\t    return lines.map(function (entry) {\n\t      return ' ' + entry;\n\t    });\n\t  }\n\n\t  var hunks = [];\n\t  var oldRangeStart = 0,\n\t      newRangeStart = 0,\n\t      curRange = [],\n\t      oldLine = 1,\n\t      newLine = 1;\n\t  /*istanbul ignore start*/\n\t  var _loop = function _loop( /*istanbul ignore end*/i) {\n\t    var current = diff[i],\n\t        lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\n\t    current.lines = lines;\n\n\t    if (current.added || current.removed) {\n\t      /*istanbul ignore start*/\n\t      var _curRange;\n\n\t      /*istanbul ignore end*/\n\t      // If we have previous context, start with that\n\t      if (!oldRangeStart) {\n\t        var prev = diff[i - 1];\n\t        oldRangeStart = oldLine;\n\t        newRangeStart = newLine;\n\n\t        if (prev) {\n\t          curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\n\t          oldRangeStart -= curRange.length;\n\t          newRangeStart -= curRange.length;\n\t        }\n\t      }\n\n\t      // Output our changes\n\t      /*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) {\n\t        return (current.added ? '+' : '-') + entry;\n\t      })));\n\n\t      // Track the updated file position\n\t      if (current.added) {\n\t        newLine += lines.length;\n\t      } else {\n\t        oldLine += lines.length;\n\t      }\n\t    } else {\n\t      // Identical context lines. Track line changes\n\t      if (oldRangeStart) {\n\t        // Close out any changes that have been output (or join overlapping)\n\t        if (lines.length <= options.context * 2 && i < diff.length - 2) {\n\t          /*istanbul ignore start*/\n\t          var _curRange2;\n\n\t          /*istanbul ignore end*/\n\t          // Overlapping\n\t          /*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines)));\n\t        } else {\n\t          /*istanbul ignore start*/\n\t          var _curRange3;\n\n\t          /*istanbul ignore end*/\n\t          // end the range and output\n\t          var contextSize = Math.min(lines.length, options.context);\n\t          /*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize))));\n\n\t          var hunk = {\n\t            oldStart: oldRangeStart,\n\t            oldLines: oldLine - oldRangeStart + contextSize,\n\t            newStart: newRangeStart,\n\t            newLines: newLine - newRangeStart + contextSize,\n\t            lines: curRange\n\t          };\n\t          if (i >= diff.length - 2 && lines.length <= options.context) {\n\t            // EOF is inside this hunk\n\t            var oldEOFNewline = /\\n$/.test(oldStr);\n\t            var newEOFNewline = /\\n$/.test(newStr);\n\t            if (lines.length == 0 && !oldEOFNewline) {\n\t              // special case: old has no eol and no trailing context; no-nl can end up before adds\n\t              curRange.splice(hunk.oldLines, 0, '\\\\ No newline at end of file');\n\t            } else if (!oldEOFNewline || !newEOFNewline) {\n\t              curRange.push('\\\\ No newline at end of file');\n\t            }\n\t          }\n\t          hunks.push(hunk);\n\n\t          oldRangeStart = 0;\n\t          newRangeStart = 0;\n\t          curRange = [];\n\t        }\n\t      }\n\t      oldLine += lines.length;\n\t      newLine += lines.length;\n\t    }\n\t  };\n\n\t  for (var i = 0; i < diff.length; i++) {\n\t    /*istanbul ignore start*/\n\t    _loop( /*istanbul ignore end*/i);\n\t  }\n\n\t  return {\n\t    oldFileName: oldFileName, newFileName: newFileName,\n\t    oldHeader: oldHeader, newHeader: newHeader,\n\t    hunks: hunks\n\t  };\n\t}\n\n\tfunction createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);\n\n\t  var ret = [];\n\t  if (oldFileName == newFileName) {\n\t    ret.push('Index: ' + oldFileName);\n\t  }\n\t  ret.push('===================================================================');\n\t  ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\\t' + diff.oldHeader));\n\t  ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\\t' + diff.newHeader));\n\n\t  for (var i = 0; i < diff.hunks.length; i++) {\n\t    var hunk = diff.hunks[i];\n\t    ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');\n\t    ret.push.apply(ret, hunk.lines);\n\t  }\n\n\t  return ret.join('\\n') + '\\n';\n\t}\n\n\tfunction createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n\t}\n\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/arrayEqual = arrayEqual;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/arrayStartsWith = arrayStartsWith;\n\tfunction arrayEqual(a, b) {\n\t  if (a.length !== b.length) {\n\t    return false;\n\t  }\n\n\t  return arrayStartsWith(a, b);\n\t}\n\n\tfunction arrayStartsWith(array, start) {\n\t  if (start.length > array.length) {\n\t    return false;\n\t  }\n\n\t  for (var i = 0; i < start.length; i++) {\n\t    if (start[i] !== array[i]) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\n\n\n/***/ },\n/* 16 */\n/***/ function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP;\n\t// See: http://code.google.com/p/google-diff-match-patch/wiki/API\n\tfunction convertChangesToDMP(changes) {\n\t  var ret = [],\n\t      change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,\n\t      operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t  for (var i = 0; i < changes.length; i++) {\n\t    change = changes[i];\n\t    if (change.added) {\n\t      operation = 1;\n\t    } else if (change.removed) {\n\t      operation = -1;\n\t    } else {\n\t      operation = 0;\n\t    }\n\n\t    ret.push([operation, change.value]);\n\t  }\n\t  return ret;\n\t}\n\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML;\n\tfunction convertChangesToXML(changes) {\n\t  var ret = [];\n\t  for (var i = 0; i < changes.length; i++) {\n\t    var change = changes[i];\n\t    if (change.added) {\n\t      ret.push('<ins>');\n\t    } else if (change.removed) {\n\t      ret.push('<del>');\n\t    }\n\n\t    ret.push(escapeHTML(change.value));\n\n\t    if (change.added) {\n\t      ret.push('</ins>');\n\t    } else if (change.removed) {\n\t      ret.push('</del>');\n\t    }\n\t  }\n\t  return ret.join('');\n\t}\n\n\tfunction escapeHTML(s) {\n\t  var n = s;\n\t  n = n.replace(/&/g, '&amp;');\n\t  n = n.replace(/</g, '&lt;');\n\t  n = n.replace(/>/g, '&gt;');\n\t  n = n.replace(/\"/g, '&quot;');\n\n\t  return n;\n\t}\n\n\n\n/***/ }\n/******/ ])\n});\n;\n},{}],49:[function(require,module,exports){\n(function (global){\n((typeof define === \"function\" && define.amd && function (m) {\n    define(\"formatio\", [\"samsam\"], m);\n}) || (typeof module === \"object\" && function (m) {\n    module.exports = m(require(\"samsam\"));\n}) || function (m) { this.formatio = m(this.samsam); }\n)(function (samsam) {\n    \"use strict\";\n\n    var formatio = {\n        excludeConstructors: [\"Object\", /^.$/],\n        quoteStrings: true,\n        limitChildrenCount: 0\n    };\n\n    var hasOwn = Object.prototype.hasOwnProperty;\n\n    var specialObjects = [];\n    if (typeof global !== \"undefined\") {\n        specialObjects.push({ object: global, value: \"[object global]\" });\n    }\n    if (typeof document !== \"undefined\") {\n        specialObjects.push({\n            object: document,\n            value: \"[object HTMLDocument]\"\n        });\n    }\n    if (typeof window !== \"undefined\") {\n        specialObjects.push({ object: window, value: \"[object Window]\" });\n    }\n\n    function functionName(func) {\n        if (!func) { return \"\"; }\n        if (func.displayName) { return func.displayName; }\n        if (func.name) { return func.name; }\n        var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n        return (matches && matches[1]) || \"\";\n    }\n\n    function constructorName(f, object) {\n        var name = functionName(object && object.constructor);\n        var excludes = f.excludeConstructors ||\n                formatio.excludeConstructors || [];\n\n        var i, l;\n        for (i = 0, l = excludes.length; i < l; ++i) {\n            if (typeof excludes[i] === \"string\" && excludes[i] === name) {\n                return \"\";\n            } else if (excludes[i].test && excludes[i].test(name)) {\n                return \"\";\n            }\n        }\n\n        return name;\n    }\n\n    function isCircular(object, objects) {\n        if (typeof object !== \"object\") { return false; }\n        var i, l;\n        for (i = 0, l = objects.length; i < l; ++i) {\n            if (objects[i] === object) { return true; }\n        }\n        return false;\n    }\n\n    function ascii(f, object, processed, indent) {\n        if (typeof object === \"string\") {\n            if (object.length === 0) { return \"(empty string)\"; }\n            var qs = f.quoteStrings;\n            var quote = typeof qs !== \"boolean\" || qs;\n            return processed || quote ? '\"' + object + '\"' : object;\n        }\n\n        if (typeof object === \"function\" && !(object instanceof RegExp)) {\n            return ascii.func(object);\n        }\n\n        processed = processed || [];\n\n        if (isCircular(object, processed)) { return \"[Circular]\"; }\n\n        if (Object.prototype.toString.call(object) === \"[object Array]\") {\n            return ascii.array.call(f, object, processed);\n        }\n\n        if (!object) { return String((1/object) === -Infinity ? \"-0\" : object); }\n        if (samsam.isElement(object)) { return ascii.element(object); }\n\n        if (typeof object.toString === \"function\" &&\n                object.toString !== Object.prototype.toString) {\n            return object.toString();\n        }\n\n        var i, l;\n        for (i = 0, l = specialObjects.length; i < l; i++) {\n            if (object === specialObjects[i].object) {\n                return specialObjects[i].value;\n            }\n        }\n\n        if (typeof Set !== 'undefined' && object instanceof Set) {\n            return ascii.set.call(f, object, processed);\n        }\n\n        return ascii.object.call(f, object, processed, indent);\n    }\n\n    ascii.func = function (func) {\n        return \"function \" + functionName(func) + \"() {}\";\n    };\n\n    function delimit(str, delimiters) {\n        delimiters = delimiters || [\"[\", \"]\"];\n        return delimiters[0] + str + delimiters[1];\n    }\n\n    ascii.array = function (array, processed, delimiters) {\n        processed = processed || [];\n        processed.push(array);\n        var pieces = [];\n        var i, l;\n        l = (this.limitChildrenCount > 0) ? \n            Math.min(this.limitChildrenCount, array.length) : array.length;\n\n        for (i = 0; i < l; ++i) {\n            pieces.push(ascii(this, array[i], processed));\n        }\n\n        if (l < array.length) {\n            pieces.push(\"[... \" + (array.length - l) + \" more elements]\");\n        }\n\n        return delimit(pieces.join(\", \"), delimiters);\n    };\n\n    ascii.set = function (set, processed) {\n        return ascii.array.call(this, Array.from(set), processed, ['Set {', '}']);\n    };\n\n    ascii.object = function (object, processed, indent) {\n        processed = processed || [];\n        processed.push(object);\n        indent = indent || 0;\n        var pieces = [], properties = samsam.keys(object).sort();\n        var length = 3;\n        var prop, str, obj, i, k, l;\n        l = (this.limitChildrenCount > 0) ? \n            Math.min(this.limitChildrenCount, properties.length) : properties.length;\n\n        for (i = 0; i < l; ++i) {\n            prop = properties[i];\n            obj = object[prop];\n\n            if (isCircular(obj, processed)) {\n                str = \"[Circular]\";\n            } else {\n                str = ascii(this, obj, processed, indent + 2);\n            }\n\n            str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n            length += str.length;\n            pieces.push(str);\n        }\n\n        var cons = constructorName(this, object);\n        var prefix = cons ? \"[\" + cons + \"] \" : \"\";\n        var is = \"\";\n        for (i = 0, k = indent; i < k; ++i) { is += \" \"; }\n\n        if(l < properties.length)\n            pieces.push(\"[... \" + (properties.length - l) + \" more elements]\");\n\n        if (length + indent > 80) {\n            return prefix + \"{\\n  \" + is + pieces.join(\",\\n  \" + is) + \"\\n\" +\n                is + \"}\";\n        }\n        return prefix + \"{ \" + pieces.join(\", \") + \" }\";\n    };\n\n    ascii.element = function (element) {\n        var tagName = element.tagName.toLowerCase();\n        var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;\n\n        for (i = 0, l = attrs.length; i < l; ++i) {\n            attr = attrs.item(i);\n            attrName = attr.nodeName.toLowerCase().replace(\"html:\", \"\");\n            val = attr.nodeValue;\n            if (attrName !== \"contenteditable\" || val !== \"inherit\") {\n                if (!!val) { pairs.push(attrName + \"=\\\"\" + val + \"\\\"\"); }\n            }\n        }\n\n        var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n        // SVG elements have undefined innerHTML\n        var content = element.innerHTML || '';\n\n        if (content.length > 20) {\n            content = content.substr(0, 20) + \"[...]\";\n        }\n\n        var res = formatted + pairs.join(\" \") + \">\" + content +\n                \"</\" + tagName + \">\";\n\n        return res.replace(/ contentEditable=\"inherit\"/, \"\");\n    };\n\n    function Formatio(options) {\n        for (var opt in options) {\n            this[opt] = options[opt];\n        }\n    }\n\n    Formatio.prototype = {\n        functionName: functionName,\n\n        configure: function (options) {\n            return new Formatio(options);\n        },\n\n        constructorName: function (object) {\n            return constructorName(this, object);\n        },\n\n        ascii: function (object, processed, indent) {\n            return ascii(this, object, processed, indent);\n        }\n    };\n\n    return Formatio.prototype;\n});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"samsam\":54}],50:[function(require,module,exports){\nmodule.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n},{}],51:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar userAgent = global.navigator && global.navigator.userAgent;\nvar isRunningInIE = userAgent && userAgent.indexOf(\"MSIE \") > -1;\n\n// Make properties writable in IE, as per\n// http://www.adequatelygood.com/Replacing-setTimeout-Globally.html\nif (isRunningInIE) {\n    global.setTimeout = global.setTimeout;\n    global.clearTimeout = global.clearTimeout;\n    global.setInterval = global.setInterval;\n    global.clearInterval = global.clearInterval;\n    global.Date = global.Date;\n}\n\n// setImmediate is not a standard function\n// avoid adding the prop to the window object if not present\nif (global.setImmediate !== undefined) {\n    global.setImmediate = global.setImmediate;\n    global.clearImmediate = global.clearImmediate;\n}\n\n// node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()\n// browsers, a number.\n// see https://github.com/cjohansen/Sinon.JS/pull/436\n\nvar NOOP = function () { return undefined; };\nvar timeoutResult = setTimeout(NOOP, 0);\nvar addTimerReturnsObject = typeof timeoutResult === \"object\";\nvar hrtimePresent = (global.process && typeof global.process.hrtime === \"function\");\nclearTimeout(timeoutResult);\n\nvar NativeDate = Date;\nvar uniqueTimerId = 1;\n\n/**\n * Parse strings like \"01:10:00\" (meaning 1 hour, 10 minutes, 0 seconds) into\n * number of milliseconds. This is used to support human-readable strings passed\n * to clock.tick()\n */\nfunction parseTime(str) {\n    if (!str) {\n        return 0;\n    }\n\n    var strings = str.split(\":\");\n    var l = strings.length;\n    var i = l;\n    var ms = 0;\n    var parsed;\n\n    if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n        throw new Error(\"tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits\");\n    }\n\n    while (i--) {\n        parsed = parseInt(strings[i], 10);\n\n        if (parsed >= 60) {\n            throw new Error(\"Invalid time \" + str);\n        }\n\n        ms += parsed * Math.pow(60, (l - i - 1));\n    }\n\n    return ms * 1000;\n}\n\n/**\n * Floor function that also works for negative numbers\n */\nfunction fixedFloor(n) {\n    return (n >= 0 ? Math.floor(n) : Math.ceil(n));\n}\n\n/**\n * % operator that also works for negative numbers\n */\nfunction fixedModulo(n, m) {\n    return ((n % m) + m) % m;\n}\n\n/**\n * Used to grok the `now` parameter to createClock.\n */\nfunction getEpoch(epoch) {\n    if (!epoch) { return 0; }\n    if (typeof epoch.getTime === \"function\") { return epoch.getTime(); }\n    if (typeof epoch === \"number\") { return epoch; }\n    throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n}\n\nfunction inRange(from, to, timer) {\n    return timer && timer.callAt >= from && timer.callAt <= to;\n}\n\nfunction mirrorDateProperties(target, source) {\n    var prop;\n    for (prop in source) {\n        if (source.hasOwnProperty(prop)) {\n            target[prop] = source[prop];\n        }\n    }\n\n    // set special now implementation\n    if (source.now) {\n        target.now = function now() {\n            return target.clock.now;\n        };\n    } else {\n        delete target.now;\n    }\n\n    // set special toSource implementation\n    if (source.toSource) {\n        target.toSource = function toSource() {\n            return source.toSource();\n        };\n    } else {\n        delete target.toSource;\n    }\n\n    // set special toString implementation\n    target.toString = function toString() {\n        return source.toString();\n    };\n\n    target.prototype = source.prototype;\n    target.parse = source.parse;\n    target.UTC = source.UTC;\n    target.prototype.toUTCString = source.prototype.toUTCString;\n\n    return target;\n}\n\nfunction createDate() {\n    function ClockDate(year, month, date, hour, minute, second, ms) {\n        // Defensive and verbose to avoid potential harm in passing\n        // explicit undefined when user does not pass argument\n        switch (arguments.length) {\n            case 0:\n                return new NativeDate(ClockDate.clock.now);\n            case 1:\n                return new NativeDate(year);\n            case 2:\n                return new NativeDate(year, month);\n            case 3:\n                return new NativeDate(year, month, date);\n            case 4:\n                return new NativeDate(year, month, date, hour);\n            case 5:\n                return new NativeDate(year, month, date, hour, minute);\n            case 6:\n                return new NativeDate(year, month, date, hour, minute, second);\n            default:\n                return new NativeDate(year, month, date, hour, minute, second, ms);\n        }\n    }\n\n    return mirrorDateProperties(ClockDate, NativeDate);\n}\n\nfunction addTimer(clock, timer) {\n    if (timer.func === undefined) {\n        throw new Error(\"Callback must be provided to timer calls\");\n    }\n\n    if (!clock.timers) {\n        clock.timers = {};\n    }\n\n    timer.id = uniqueTimerId++;\n    timer.createdAt = clock.now;\n    timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0));\n\n    clock.timers[timer.id] = timer;\n\n    if (addTimerReturnsObject) {\n        return {\n            id: timer.id,\n            ref: NOOP,\n            unref: NOOP\n        };\n    }\n\n    return timer.id;\n}\n\n\n/* eslint consistent-return: \"off\" */\nfunction compareTimers(a, b) {\n    // Sort first by absolute timing\n    if (a.callAt < b.callAt) {\n        return -1;\n    }\n    if (a.callAt > b.callAt) {\n        return 1;\n    }\n\n    // Sort next by immediate, immediate timers take precedence\n    if (a.immediate && !b.immediate) {\n        return -1;\n    }\n    if (!a.immediate && b.immediate) {\n        return 1;\n    }\n\n    // Sort next by creation time, earlier-created timers take precedence\n    if (a.createdAt < b.createdAt) {\n        return -1;\n    }\n    if (a.createdAt > b.createdAt) {\n        return 1;\n    }\n\n    // Sort next by id, lower-id timers take precedence\n    if (a.id < b.id) {\n        return -1;\n    }\n    if (a.id > b.id) {\n        return 1;\n    }\n\n    // As timer ids are unique, no fallback `0` is necessary\n}\n\nfunction firstTimerInRange(clock, from, to) {\n    var timers = clock.timers;\n    var timer = null;\n    var id, isInRange;\n\n    for (id in timers) {\n        if (timers.hasOwnProperty(id)) {\n            isInRange = inRange(from, to, timers[id]);\n\n            if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) {\n                timer = timers[id];\n            }\n        }\n    }\n\n    return timer;\n}\n\nfunction firstTimer(clock) {\n    var timers = clock.timers;\n    var timer = null;\n    var id;\n\n    for (id in timers) {\n        if (timers.hasOwnProperty(id)) {\n            if (!timer || compareTimers(timer, timers[id]) === 1) {\n                timer = timers[id];\n            }\n        }\n    }\n\n    return timer;\n}\n\nfunction lastTimer(clock) {\n    var timers = clock.timers;\n    var timer = null;\n    var id;\n\n    for (id in timers) {\n        if (timers.hasOwnProperty(id)) {\n            if (!timer || compareTimers(timer, timers[id]) === -1) {\n                timer = timers[id];\n            }\n        }\n    }\n\n    return timer;\n}\n\nfunction callTimer(clock, timer) {\n    var exception;\n\n    if (typeof timer.interval === \"number\") {\n        clock.timers[timer.id].callAt += timer.interval;\n    } else {\n        delete clock.timers[timer.id];\n    }\n\n    try {\n        if (typeof timer.func === \"function\") {\n            timer.func.apply(null, timer.args);\n        } else {\n            /* eslint no-eval: \"off\" */\n            eval(timer.func);\n        }\n    } catch (e) {\n        exception = e;\n    }\n\n    if (!clock.timers[timer.id]) {\n        if (exception) {\n            throw exception;\n        }\n        return;\n    }\n\n    if (exception) {\n        throw exception;\n    }\n}\n\nfunction timerType(timer) {\n    if (timer.immediate) {\n        return \"Immediate\";\n    }\n    if (timer.interval !== undefined) {\n        return \"Interval\";\n    }\n    return \"Timeout\";\n}\n\nfunction clearTimer(clock, timerId, ttype) {\n    if (!timerId) {\n        // null appears to be allowed in most browsers, and appears to be\n        // relied upon by some libraries, like Bootstrap carousel\n        return;\n    }\n\n    if (!clock.timers) {\n        clock.timers = [];\n    }\n\n    // in Node, timerId is an object with .ref()/.unref(), and\n    // its .id field is the actual timer id.\n    if (typeof timerId === \"object\") {\n        timerId = timerId.id;\n    }\n\n    if (clock.timers.hasOwnProperty(timerId)) {\n        // check that the ID matches a timer of the correct type\n        var timer = clock.timers[timerId];\n        if (timerType(timer) === ttype) {\n            delete clock.timers[timerId];\n        } else {\n            throw new Error(\"Cannot clear timer: timer created with set\" + timerType(timer)\n                            + \"() but cleared with clear\" + ttype + \"()\");\n        }\n    }\n}\n\nfunction uninstall(clock, target) {\n    var method,\n        i,\n        l;\n    var installedHrTime = \"_hrtime\";\n\n    for (i = 0, l = clock.methods.length; i < l; i++) {\n        method = clock.methods[i];\n        if (method === \"hrtime\" && target.process) {\n            target.process.hrtime = clock[installedHrTime];\n        } else {\n            if (target[method] && target[method].hadOwnProperty) {\n                target[method] = clock[\"_\" + method];\n            } else {\n                try {\n                    delete target[method];\n                } catch (ignore) { /* eslint empty-block: \"off\" */ }\n            }\n        }\n    }\n\n    // Prevent multiple executions which will completely remove these props\n    clock.methods = [];\n}\n\nfunction hijackMethod(target, method, clock) {\n    var prop;\n\n    clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);\n    clock[\"_\" + method] = target[method];\n\n    if (method === \"Date\") {\n        var date = mirrorDateProperties(clock[method], target[method]);\n        target[method] = date;\n    } else {\n        target[method] = function () {\n            return clock[method].apply(clock, arguments);\n        };\n\n        for (prop in clock[method]) {\n            if (clock[method].hasOwnProperty(prop)) {\n                target[method][prop] = clock[method][prop];\n            }\n        }\n    }\n\n    target[method].clock = clock;\n}\n\nvar timers = {\n    setTimeout: setTimeout,\n    clearTimeout: clearTimeout,\n    setImmediate: global.setImmediate,\n    clearImmediate: global.clearImmediate,\n    setInterval: setInterval,\n    clearInterval: clearInterval,\n    Date: Date\n};\n\nif (hrtimePresent) {\n    timers.hrtime = global.process.hrtime;\n}\n\nvar keys = Object.keys || function (obj) {\n    var ks = [];\n    var key;\n\n    for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n            ks.push(key);\n        }\n    }\n\n    return ks;\n};\n\nexports.timers = timers;\n\nfunction createClock(now, loopLimit) {\n    loopLimit = loopLimit || 1000;\n\n    var clock = {\n        now: getEpoch(now),\n        hrNow: 0,\n        timeouts: {},\n        Date: createDate(),\n        loopLimit: loopLimit\n    };\n\n    clock.Date.clock = clock;\n\n    clock.setTimeout = function setTimeout(func, timeout) {\n        return addTimer(clock, {\n            func: func,\n            args: Array.prototype.slice.call(arguments, 2),\n            delay: timeout\n        });\n    };\n\n    clock.clearTimeout = function clearTimeout(timerId) {\n        return clearTimer(clock, timerId, \"Timeout\");\n    };\n\n    clock.setInterval = function setInterval(func, timeout) {\n        return addTimer(clock, {\n            func: func,\n            args: Array.prototype.slice.call(arguments, 2),\n            delay: timeout,\n            interval: timeout\n        });\n    };\n\n    clock.clearInterval = function clearInterval(timerId) {\n        return clearTimer(clock, timerId, \"Interval\");\n    };\n\n    clock.setImmediate = function setImmediate(func) {\n        return addTimer(clock, {\n            func: func,\n            args: Array.prototype.slice.call(arguments, 1),\n            immediate: true\n        });\n    };\n\n    clock.clearImmediate = function clearImmediate(timerId) {\n        return clearTimer(clock, timerId, \"Immediate\");\n    };\n\n    clock.tick = function tick(ms) {\n        ms = typeof ms === \"number\" ? ms : parseTime(ms);\n        var tickFrom = clock.now;\n        var tickTo = clock.now + ms;\n        var previous = clock.now;\n        var timer = firstTimerInRange(clock, tickFrom, tickTo);\n        var oldNow, firstException;\n\n        clock.duringTick = true;\n\n        function updateHrTime(newNow) {\n            clock.hrNow += (newNow - clock.now);\n        }\n\n        while (timer && tickFrom <= tickTo) {\n            if (clock.timers[timer.id]) {\n                updateHrTime(timer.callAt);\n                tickFrom = timer.callAt;\n                clock.now = timer.callAt;\n                try {\n                    oldNow = clock.now;\n                    callTimer(clock, timer);\n                    // compensate for any setSystemTime() call during timer callback\n                    if (oldNow !== clock.now) {\n                        tickFrom += clock.now - oldNow;\n                        tickTo += clock.now - oldNow;\n                        previous += clock.now - oldNow;\n                    }\n                } catch (e) {\n                    firstException = firstException || e;\n                }\n            }\n\n            timer = firstTimerInRange(clock, previous, tickTo);\n            previous = tickFrom;\n        }\n\n        clock.duringTick = false;\n        updateHrTime(tickTo);\n        clock.now = tickTo;\n\n        if (firstException) {\n            throw firstException;\n        }\n\n        return clock.now;\n    };\n\n    clock.next = function next() {\n        var timer = firstTimer(clock);\n        if (!timer) {\n            return clock.now;\n        }\n\n        clock.duringTick = true;\n        try {\n            clock.now = timer.callAt;\n            callTimer(clock, timer);\n            return clock.now;\n        } finally {\n            clock.duringTick = false;\n        }\n    };\n\n    clock.runAll = function runAll() {\n        var numTimers, i;\n        for (i = 0; i < clock.loopLimit; i++) {\n            if (!clock.timers) {\n                return clock.now;\n            }\n\n            numTimers = Object.keys(clock.timers).length;\n            if (numTimers === 0) {\n                return clock.now;\n            }\n\n            clock.next();\n        }\n\n        throw new Error(\"Aborting after running \" + clock.loopLimit + \" timers, assuming an infinite loop!\");\n    };\n\n    clock.runToLast = function runToLast() {\n        var timer = lastTimer(clock);\n        if (!timer) {\n            return clock.now;\n        }\n\n        return clock.tick(timer.callAt);\n    };\n\n    clock.reset = function reset() {\n        clock.timers = {};\n    };\n\n    clock.setSystemTime = function setSystemTime(systemTime) {\n        // determine time difference\n        var newNow = getEpoch(systemTime);\n        var difference = newNow - clock.now;\n        var id, timer;\n\n        // update 'system clock'\n        clock.now = newNow;\n\n        // update timers and intervals to keep them stable\n        for (id in clock.timers) {\n            if (clock.timers.hasOwnProperty(id)) {\n                timer = clock.timers[id];\n                timer.createdAt += difference;\n                timer.callAt += difference;\n            }\n        }\n    };\n\n    if (hrtimePresent) {\n        clock.hrtime = function (prev) {\n            if (Array.isArray(prev)) {\n                var oldSecs = (prev[0] + prev[1] / 1e9);\n                var newSecs = (clock.hrNow / 1000);\n                var difference = (newSecs - oldSecs);\n                var secs = fixedFloor(difference);\n                var nanosecs = fixedModulo(difference * 1e9, 1e9);\n                return [\n                    secs,\n                    nanosecs\n                ];\n            }\n            return [\n                fixedFloor(clock.hrNow / 1000),\n                fixedModulo(clock.hrNow * 1e6, 1e9)\n            ];\n        };\n    }\n\n    return clock;\n}\nexports.createClock = createClock;\n\nexports.install = function install(target, now, toFake, loopLimit) {\n    var i, l;\n\n    if (target instanceof Date) {\n        toFake = now;\n        now = target.getTime();\n        target = null;\n    }\n\n    if (typeof target === \"number\") {\n        toFake = now;\n        now = target;\n        target = null;\n    }\n\n    if (!target) {\n        target = global;\n    }\n\n    var clock = createClock(now, loopLimit);\n\n    clock.uninstall = function () {\n        uninstall(clock, target);\n    };\n\n    clock.methods = toFake || [];\n\n    if (clock.methods.length === 0) {\n        clock.methods = keys(timers);\n    }\n\n    for (i = 0, l = clock.methods.length; i < l; i++) {\n        if (clock.methods[i] === \"hrtime\") {\n            if (target.process && typeof target.process.hrtime === \"function\") {\n                hijackMethod(target.process, clock.methods[i], clock);\n            }\n        } else {\n            hijackMethod(target, clock.methods[i], clock);\n        }\n    }\n\n    return clock;\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],52:[function(require,module,exports){\nvar isarray = require('isarray')\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n  // Match escaped characters that would otherwise appear in future matches.\n  // This allows the user to escape special characters that won't transform.\n  '(\\\\\\\\.)',\n  // Match Express-style parameters and un-named parameters with a prefix\n  // and optional suffixes. Matches appear as:\n  //\n  // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n  // \"/route(\\\\d+)\"  => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n  // \"/*\"            => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n  '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param  {string}  str\n * @param  {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n  var tokens = []\n  var key = 0\n  var index = 0\n  var path = ''\n  var defaultDelimiter = options && options.delimiter || '/'\n  var res\n\n  while ((res = PATH_REGEXP.exec(str)) != null) {\n    var m = res[0]\n    var escaped = res[1]\n    var offset = res.index\n    path += str.slice(index, offset)\n    index = offset + m.length\n\n    // Ignore already escaped sequences.\n    if (escaped) {\n      path += escaped[1]\n      continue\n    }\n\n    var next = str[index]\n    var prefix = res[2]\n    var name = res[3]\n    var capture = res[4]\n    var group = res[5]\n    var modifier = res[6]\n    var asterisk = res[7]\n\n    // Push the current path onto the tokens.\n    if (path) {\n      tokens.push(path)\n      path = ''\n    }\n\n    var partial = prefix != null && next != null && next !== prefix\n    var repeat = modifier === '+' || modifier === '*'\n    var optional = modifier === '?' || modifier === '*'\n    var delimiter = res[2] || defaultDelimiter\n    var pattern = capture || group\n\n    tokens.push({\n      name: name || key++,\n      prefix: prefix || '',\n      delimiter: delimiter,\n      optional: optional,\n      repeat: repeat,\n      partial: partial,\n      asterisk: !!asterisk,\n      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n    })\n  }\n\n  // Match any characters still remaining.\n  if (index < str.length) {\n    path += str.substr(index)\n  }\n\n  // If the path exists, push it onto the end.\n  if (path) {\n    tokens.push(path)\n  }\n\n  return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param  {string}             str\n * @param  {Object=}            options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n  return tokensToFunction(parse(str, options))\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n  return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n  return encodeURI(str).replace(/[?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n  // Compile all the tokens into regexps.\n  var matches = new Array(tokens.length)\n\n  // Compile all the patterns before compilation.\n  for (var i = 0; i < tokens.length; i++) {\n    if (typeof tokens[i] === 'object') {\n      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$')\n    }\n  }\n\n  return function (obj, opts) {\n    var path = ''\n    var data = obj || {}\n    var options = opts || {}\n    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n    for (var i = 0; i < tokens.length; i++) {\n      var token = tokens[i]\n\n      if (typeof token === 'string') {\n        path += token\n\n        continue\n      }\n\n      var value = data[token.name]\n      var segment\n\n      if (value == null) {\n        if (token.optional) {\n          // Prepend partial segment prefixes.\n          if (token.partial) {\n            path += token.prefix\n          }\n\n          continue\n        } else {\n          throw new TypeError('Expected \"' + token.name + '\" to be defined')\n        }\n      }\n\n      if (isarray(value)) {\n        if (!token.repeat) {\n          throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n        }\n\n        if (value.length === 0) {\n          if (token.optional) {\n            continue\n          } else {\n            throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n          }\n        }\n\n        for (var j = 0; j < value.length; j++) {\n          segment = encode(value[j])\n\n          if (!matches[i].test(segment)) {\n            throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n          }\n\n          path += (j === 0 ? token.prefix : token.delimiter) + segment\n        }\n\n        continue\n      }\n\n      segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n      if (!matches[i].test(segment)) {\n        throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n      }\n\n      path += token.prefix + segment\n    }\n\n    return path\n  }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param  {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n  return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param  {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n  return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param  {!RegExp} re\n * @param  {Array}   keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n  re.keys = keys\n  return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param  {Object} options\n * @return {string}\n */\nfunction flags (options) {\n  return options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param  {!RegExp} path\n * @param  {!Array}  keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n  // Use a negative lookahead to match only capturing groups.\n  var groups = path.source.match(/\\((?!\\?)/g)\n\n  if (groups) {\n    for (var i = 0; i < groups.length; i++) {\n      keys.push({\n        name: i,\n        prefix: null,\n        delimiter: null,\n        optional: false,\n        repeat: false,\n        partial: false,\n        asterisk: false,\n        pattern: null\n      })\n    }\n  }\n\n  return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param  {!Array}  path\n * @param  {Array}   keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n  var parts = []\n\n  for (var i = 0; i < path.length; i++) {\n    parts.push(pathToRegexp(path[i], keys, options).source)\n  }\n\n  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n  return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param  {string}  path\n * @param  {!Array}  keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n  return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param  {!Array}          tokens\n * @param  {(Array|Object)=} keys\n * @param  {Object=}         options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  var strict = options.strict\n  var end = options.end !== false\n  var route = ''\n\n  // Iterate over the tokens and create our regexp string.\n  for (var i = 0; i < tokens.length; i++) {\n    var token = tokens[i]\n\n    if (typeof token === 'string') {\n      route += escapeString(token)\n    } else {\n      var prefix = escapeString(token.prefix)\n      var capture = '(?:' + token.pattern + ')'\n\n      keys.push(token)\n\n      if (token.repeat) {\n        capture += '(?:' + prefix + capture + ')*'\n      }\n\n      if (token.optional) {\n        if (!token.partial) {\n          capture = '(?:' + prefix + '(' + capture + '))?'\n        } else {\n          capture = prefix + '(' + capture + ')?'\n        }\n      } else {\n        capture = prefix + '(' + capture + ')'\n      }\n\n      route += capture\n    }\n  }\n\n  var delimiter = escapeString(options.delimiter || '/')\n  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n  // In non-strict mode we allow a slash at the end of match. If the path to\n  // match already ends with a slash, we remove it for consistency. The slash\n  // is valid at the end of a path match, not in the middle. This is important\n  // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n  if (!strict) {\n    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n  }\n\n  if (end) {\n    route += '$'\n  } else {\n    // In non-ending mode, we need the capturing groups to match as much as\n    // possible by using a positive lookahead to the end or next path segment.\n    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n  }\n\n  return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param  {(string|RegExp|Array)} path\n * @param  {(Array|Object)=}       keys\n * @param  {Object=}               options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  if (path instanceof RegExp) {\n    return regexpToRegexp(path, /** @type {!Array} */ (keys))\n  }\n\n  if (isarray(path)) {\n    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n  }\n\n  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n\n},{\"isarray\":50}],53:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],54:[function(require,module,exports){\n((typeof define === \"function\" && define.amd && function (m) { define(\"samsam\", m); }) ||\n (typeof module === \"object\" &&\n      function (m) { module.exports = m(); }) || // Node\n function (m) { this.samsam = m(); } // Browser globals\n)(function () {\n    var o = Object.prototype;\n    var div = typeof document !== \"undefined\" && document.createElement(\"div\");\n\n    function isNaN(value) {\n        // Unlike global isNaN, this avoids type coercion\n        // typeof check avoids IE host object issues, hat tip to\n        // lodash\n        var val = value; // JsLint thinks value !== value is \"weird\"\n        return typeof value === \"number\" && value !== val;\n    }\n\n    function getClass(value) {\n        // Returns the internal [[Class]] by calling Object.prototype.toString\n        // with the provided value as this. Return value is a string, naming the\n        // internal class, e.g. \"Array\"\n        return o.toString.call(value).split(/[ \\]]/)[1];\n    }\n\n    /**\n     * @name samsam.isArguments\n     * @param Object object\n     *\n     * Returns ``true`` if ``object`` is an ``arguments`` object,\n     * ``false`` otherwise.\n     */\n    function isArguments(object) {\n        if (getClass(object) === 'Arguments') { return true; }\n        if (typeof object !== \"object\" || typeof object.length !== \"number\" ||\n                getClass(object) === \"Array\") {\n            return false;\n        }\n        if (typeof object.callee == \"function\") { return true; }\n        try {\n            object[object.length] = 6;\n            delete object[object.length];\n        } catch (e) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * @name samsam.isElement\n     * @param Object object\n     *\n     * Returns ``true`` if ``object`` is a DOM element node. Unlike\n     * Underscore.js/lodash, this function will return ``false`` if ``object``\n     * is an *element-like* object, i.e. a regular object with a ``nodeType``\n     * property that holds the value ``1``.\n     */\n    function isElement(object) {\n        if (!object || object.nodeType !== 1 || !div) { return false; }\n        try {\n            object.appendChild(div);\n            object.removeChild(div);\n        } catch (e) {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @name samsam.keys\n     * @param Object object\n     *\n     * Return an array of own property names.\n     */\n    function keys(object) {\n        var ks = [], prop;\n        for (prop in object) {\n            if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }\n        }\n        return ks;\n    }\n\n    /**\n     * @name samsam.isDate\n     * @param Object value\n     *\n     * Returns true if the object is a ``Date``, or *date-like*. Duck typing\n     * of date objects work by checking that the object has a ``getTime``\n     * function whose return value equals the return value from the object's\n     * ``valueOf``.\n     */\n    function isDate(value) {\n        return typeof value.getTime == \"function\" &&\n            value.getTime() == value.valueOf();\n    }\n\n    /**\n     * @name samsam.isNegZero\n     * @param Object value\n     *\n     * Returns ``true`` if ``value`` is ``-0``.\n     */\n    function isNegZero(value) {\n        return value === 0 && 1 / value === -Infinity;\n    }\n\n    /**\n     * @name samsam.equal\n     * @param Object obj1\n     * @param Object obj2\n     *\n     * Returns ``true`` if two objects are strictly equal. Compared to\n     * ``===`` there are two exceptions:\n     *\n     *   - NaN is considered equal to NaN\n     *   - -0 and +0 are not considered equal\n     */\n    function identical(obj1, obj2) {\n        if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {\n            return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);\n        }\n    }\n\n    function isSet(val) {\n        if (typeof Set !== 'undefined' && val instanceof Set) {\n            return true;\n        }\n    }\n\n    function isSubset(s1, s2, compare) {\n        var values1 = Array.from(s1);\n        var values2 = Array.from(s2);\n\n        for (var i = 0; i < values1.length; i++) {\n            var includes = false;\n\n            for (var j = 0; j < values2.length; j++) {\n                if (compare(values2[j], values1[i])) {\n                    includes = true;\n                    break;\n                }\n            }\n\n            if (!includes) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * @name samsam.deepEqual\n     * @param Object obj1\n     * @param Object obj2\n     *\n     * Deep equal comparison. Two values are \"deep equal\" if:\n     *\n     *   - They are equal, according to samsam.identical\n     *   - They are both date objects representing the same time\n     *   - They are both arrays containing elements that are all deepEqual\n     *   - They are objects with the same set of properties, and each property\n     *     in ``obj1`` is deepEqual to the corresponding property in ``obj2``\n     *\n     * Supports cyclic objects.\n     */\n    function deepEqualCyclic(obj1, obj2) {\n\n        // used for cyclic comparison\n        // contain already visited objects\n        var objects1 = [],\n            objects2 = [],\n        // contain pathes (position in the object structure)\n        // of the already visited objects\n        // indexes same as in objects arrays\n            paths1 = [],\n            paths2 = [],\n        // contains combinations of already compared objects\n        // in the manner: { \"$1['ref']$2['ref']\": true }\n            compared = {};\n\n        /**\n         * used to check, if the value of a property is an object\n         * (cyclic logic is only needed for objects)\n         * only needed for cyclic logic\n         */\n        function isObject(value) {\n\n            if (typeof value === 'object' && value !== null &&\n                    !(value instanceof Boolean) &&\n                    !(value instanceof Date)    &&\n                    !(value instanceof Number)  &&\n                    !(value instanceof RegExp)  &&\n                    !(value instanceof String)) {\n\n                return true;\n            }\n\n            return false;\n        }\n\n        /**\n         * returns the index of the given object in the\n         * given objects array, -1 if not contained\n         * only needed for cyclic logic\n         */\n        function getIndex(objects, obj) {\n\n            var i;\n            for (i = 0; i < objects.length; i++) {\n                if (objects[i] === obj) {\n                    return i;\n                }\n            }\n\n            return -1;\n        }\n\n        // does the recursion for the deep equal check\n        return (function deepEqual(obj1, obj2, path1, path2) {\n            var type1 = typeof obj1;\n            var type2 = typeof obj2;\n\n            // == null also matches undefined\n            if (obj1 === obj2 ||\n                    isNaN(obj1) || isNaN(obj2) ||\n                    obj1 == null || obj2 == null ||\n                    type1 !== \"object\" || type2 !== \"object\") {\n\n                return identical(obj1, obj2);\n            }\n\n            // Elements are only equal if identical(expected, actual)\n            if (isElement(obj1) || isElement(obj2)) { return false; }\n\n            var isDate1 = isDate(obj1), isDate2 = isDate(obj2);\n            if (isDate1 || isDate2) {\n                if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {\n                    return false;\n                }\n            }\n\n            if (obj1 instanceof RegExp && obj2 instanceof RegExp) {\n                if (obj1.toString() !== obj2.toString()) { return false; }\n            }\n\n            var class1 = getClass(obj1);\n            var class2 = getClass(obj2);\n            var keys1 = keys(obj1);\n            var keys2 = keys(obj2);\n\n            if (isArguments(obj1) || isArguments(obj2)) {\n                if (obj1.length !== obj2.length) { return false; }\n            } else {\n                if (type1 !== type2 || class1 !== class2 ||\n                        keys1.length !== keys2.length) {\n                    return false;\n                }\n            }\n\n            if (isSet(obj1) || isSet(obj2)) {\n                if (!isSet(obj1) || !isSet(obj2) || obj1.size !== obj2.size) {\n                    return false;\n                }\n\n                return isSubset(obj1, obj2, deepEqual);\n            }\n\n            var key, i, l,\n                // following vars are used for the cyclic logic\n                value1, value2,\n                isObject1, isObject2,\n                index1, index2,\n                newPath1, newPath2;\n\n            for (i = 0, l = keys1.length; i < l; i++) {\n                key = keys1[i];\n                if (!o.hasOwnProperty.call(obj2, key)) {\n                    return false;\n                }\n\n                // Start of the cyclic logic\n\n                value1 = obj1[key];\n                value2 = obj2[key];\n\n                isObject1 = isObject(value1);\n                isObject2 = isObject(value2);\n\n                // determine, if the objects were already visited\n                // (it's faster to check for isObject first, than to\n                // get -1 from getIndex for non objects)\n                index1 = isObject1 ? getIndex(objects1, value1) : -1;\n                index2 = isObject2 ? getIndex(objects2, value2) : -1;\n\n                // determine the new pathes of the objects\n                // - for non cyclic objects the current path will be extended\n                //   by current property name\n                // - for cyclic objects the stored path is taken\n                newPath1 = index1 !== -1\n                    ? paths1[index1]\n                    : path1 + '[' + JSON.stringify(key) + ']';\n                newPath2 = index2 !== -1\n                    ? paths2[index2]\n                    : path2 + '[' + JSON.stringify(key) + ']';\n\n                // stop recursion if current objects are already compared\n                if (compared[newPath1 + newPath2]) {\n                    return true;\n                }\n\n                // remember the current objects and their pathes\n                if (index1 === -1 && isObject1) {\n                    objects1.push(value1);\n                    paths1.push(newPath1);\n                }\n                if (index2 === -1 && isObject2) {\n                    objects2.push(value2);\n                    paths2.push(newPath2);\n                }\n\n                // remember that the current objects are already compared\n                if (isObject1 && isObject2) {\n                    compared[newPath1 + newPath2] = true;\n                }\n\n                // End of cyclic logic\n\n                // neither value1 nor value2 is a cycle\n                // continue with next level\n                if (!deepEqual(value1, value2, newPath1, newPath2)) {\n                    return false;\n                }\n            }\n\n            return true;\n\n        }(obj1, obj2, '$1', '$2'));\n    }\n\n    function arrayContains(array, subset, compare) {\n        if (subset.length === 0) { return true; }\n        var i, l, j, k;\n        for (i = 0, l = array.length; i < l; ++i) {\n            if (compare(array[i], subset[0])) {\n                for (j = 0, k = subset.length; j < k; ++j) {\n                    if ((i + j) >= l) { return false; }\n                    if (!compare(array[i + j], subset[j])) { return false; }\n                }\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @name samsam.match\n     * @param Object object\n     * @param Object matcher\n     *\n     * Compare arbitrary value ``object`` with matcher.\n     */\n    function match(object, matcher) {\n        if (matcher && typeof matcher.test === \"function\") {\n            return matcher.test(object);\n        }\n\n        if (typeof matcher === \"function\") {\n            return matcher(object) === true;\n        }\n\n        if (typeof matcher === \"string\") {\n            matcher = matcher.toLowerCase();\n            var notNull = typeof object === \"string\" || !!object;\n            return notNull &&\n                (String(object)).toLowerCase().indexOf(matcher) >= 0;\n        }\n\n        if (typeof matcher === \"number\") {\n            return matcher === object;\n        }\n\n        if (typeof matcher === \"boolean\") {\n            return matcher === object;\n        }\n\n        if (typeof(matcher) === \"undefined\") {\n            return typeof(object) === \"undefined\";\n        }\n\n        if (matcher === null) {\n            return object === null;\n        }\n\n        if (isSet(object)) {\n            return isSubset(matcher, object, match);\n        }\n\n        if (getClass(object) === \"Array\" && getClass(matcher) === \"Array\") {\n            return arrayContains(object, matcher, match);\n        }\n\n        if (matcher && typeof matcher === \"object\") {\n            if (matcher === object) {\n                return true;\n            }\n            var prop;\n            for (prop in matcher) {\n                var value = object[prop];\n                if (typeof value === \"undefined\" &&\n                        typeof object.getAttribute === \"function\") {\n                    value = object.getAttribute(prop);\n                }\n                if (matcher[prop] === null || typeof matcher[prop] === 'undefined') {\n                    if (value !== matcher[prop]) {\n                        return false;\n                    }\n                } else if (typeof  value === \"undefined\" || !match(value, matcher[prop])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        throw new Error(\"Matcher was not a string, a number, a \" +\n                        \"function, a boolean or an object\");\n    }\n\n    return {\n        isArguments: isArguments,\n        isElement: isElement,\n        isDate: isDate,\n        isNegZero: isNegZero,\n        identical: identical,\n        deepEqual: deepEqualCyclic,\n        match: match,\n        keys: keys\n    };\n});\n\n},{}],55:[function(require,module,exports){\n// This is free and unencumbered software released into the public domain.\n// See LICENSE.md for more information.\n\nvar encoding = require(\"./lib/encoding.js\");\n\nmodule.exports = {\n  TextEncoder: encoding.TextEncoder,\n  TextDecoder: encoding.TextDecoder,\n};\n\n},{\"./lib/encoding.js\":57}],56:[function(require,module,exports){\n(function(global) {\n  'use strict';\n\n  if (typeof module !== \"undefined\" && module.exports) {\n    module.exports = global;\n  }\n\n  global[\"encoding-indexes\"] =\n{\n  \"big5\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188],\n  \"euc-kr\":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"gb18030\":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565],\n  \"gb18030-ranges\":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]],\n  \"jis0208\":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"jis0212\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"ibm866\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160],\n  \"iso-8859-2\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n  \"iso-8859-3\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729],\n  \"iso-8859-4\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729],\n  \"iso-8859-5\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119],\n  \"iso-8859-6\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"iso-8859-7\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n  \"iso-8859-8\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n  \"iso-8859-10\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312],\n  \"iso-8859-13\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217],\n  \"iso-8859-14\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255],\n  \"iso-8859-15\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n  \"iso-8859-16\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255],\n  \"koi8-r\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n  \"koi8-u\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n  \"macintosh\":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711],\n  \"windows-874\":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null],\n  \"windows-1250\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n  \"windows-1251\":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103],\n  \"windows-1252\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n  \"windows-1253\":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n  \"windows-1254\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255],\n  \"windows-1255\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n  \"windows-1256\":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746],\n  \"windows-1257\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729],\n  \"windows-1258\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255],\n  \"x-mac-cyrillic\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364]\n};\n\n// For strict environments where `this` inside the global scope\n// is `undefined`, take a pure object instead\n}(this || {}));\n},{}],57:[function(require,module,exports){\n// This is free and unencumbered software released into the public domain.\n// See LICENSE.md for more information.\n\n/**\n * @fileoverview Global |this| required for resolving indexes in node.\n * @suppress {globalThis}\n */\n(function(global) {\n  'use strict';\n\n  // If we're in node require encoding-indexes and attach it to the global.\n  if (typeof module !== \"undefined\" && module.exports &&\n    !global[\"encoding-indexes\"]) {\n    global[\"encoding-indexes\"] =\n      require(\"./encoding-indexes.js\")[\"encoding-indexes\"];\n  }\n\n  //\n  // Utilities\n  //\n\n  /**\n   * @param {number} a The number to test.\n   * @param {number} min The minimum value in the range, inclusive.\n   * @param {number} max The maximum value in the range, inclusive.\n   * @return {boolean} True if a >= min and a <= max.\n   */\n  function inRange(a, min, max) {\n    return min <= a && a <= max;\n  }\n\n  /**\n   * @param {!Array.<*>} array The array to check.\n   * @param {*} item The item to look for in the array.\n   * @return {boolean} True if the item appears in the array.\n   */\n  function includes(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  var floor = Math.floor;\n\n  /**\n   * @param {*} o\n   * @return {Object}\n   */\n  function ToDictionary(o) {\n    if (o === undefined) return {};\n    if (o === Object(o)) return o;\n    throw TypeError('Could not convert argument to dictionary');\n  }\n\n  /**\n   * @param {string} string Input string of UTF-16 code units.\n   * @return {!Array.<number>} Code points.\n   */\n  function stringToCodePoints(string) {\n    // https://heycam.github.io/webidl/#dfn-obtain-unicode\n\n    // 1. Let S be the DOMString value.\n    var s = String(string);\n\n    // 2. Let n be the length of S.\n    var n = s.length;\n\n    // 3. Initialize i to 0.\n    var i = 0;\n\n    // 4. Initialize U to be an empty sequence of Unicode characters.\n    var u = [];\n\n    // 5. While i < n:\n    while (i < n) {\n\n      // 1. Let c be the code unit in S at index i.\n      var c = s.charCodeAt(i);\n\n      // 2. Depending on the value of c:\n\n      // c < 0xD800 or c > 0xDFFF\n      if (c < 0xD800 || c > 0xDFFF) {\n        // Append to U the Unicode character with code point c.\n        u.push(c);\n      }\n\n      // 0xDC00 ≤ c ≤ 0xDFFF\n      else if (0xDC00 <= c && c <= 0xDFFF) {\n        // Append to U a U+FFFD REPLACEMENT CHARACTER.\n        u.push(0xFFFD);\n      }\n\n      // 0xD800 ≤ c ≤ 0xDBFF\n      else if (0xD800 <= c && c <= 0xDBFF) {\n        // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT\n        // CHARACTER.\n        if (i === n - 1) {\n          u.push(0xFFFD);\n        }\n        // 2. Otherwise, i < n−1:\n        else {\n          // 1. Let d be the code unit in S at index i+1.\n          var d = s.charCodeAt(i + 1);\n\n          // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then:\n          if (0xDC00 <= d && d <= 0xDFFF) {\n            // 1. Let a be c & 0x3FF.\n            var a = c & 0x3FF;\n\n            // 2. Let b be d & 0x3FF.\n            var b = d & 0x3FF;\n\n            // 3. Append to U the Unicode character with code point\n            // 2^16+2^10*a+b.\n            u.push(0x10000 + (a << 10) + b);\n\n            // 4. Set i to i+1.\n            i += 1;\n          }\n\n          // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a\n          // U+FFFD REPLACEMENT CHARACTER.\n          else  {\n            u.push(0xFFFD);\n          }\n        }\n      }\n\n      // 3. Set i to i+1.\n      i += 1;\n    }\n\n    // 6. Return U.\n    return u;\n  }\n\n  /**\n   * @param {!Array.<number>} code_points Array of code points.\n   * @return {string} string String of UTF-16 code units.\n   */\n  function codePointsToString(code_points) {\n    var s = '';\n    for (var i = 0; i < code_points.length; ++i) {\n      var cp = code_points[i];\n      if (cp <= 0xFFFF) {\n        s += String.fromCharCode(cp);\n      } else {\n        cp -= 0x10000;\n        s += String.fromCharCode((cp >> 10) + 0xD800,\n                                 (cp & 0x3FF) + 0xDC00);\n      }\n    }\n    return s;\n  }\n\n\n  //\n  // Implementation of Encoding specification\n  // https://encoding.spec.whatwg.org/\n  //\n\n  //\n  // 4. Terminology\n  //\n\n  /**\n   * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive.\n   * @param {number} a The number to test.\n   * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive.\n   */\n  function isASCIIByte(a) {\n    return 0x00 <= a && a <= 0x7F;\n  }\n\n  /**\n   * An ASCII code point is a code point in the range U+0000 to\n   * U+007F, inclusive.\n   */\n  var isASCIICodePoint = isASCIIByte;\n\n\n  /**\n   * End-of-stream is a special token that signifies no more tokens\n   * are in the stream.\n   * @const\n   */ var end_of_stream = -1;\n\n  /**\n   * A stream represents an ordered sequence of tokens.\n   *\n   * @constructor\n   * @param {!(Array.<number>|Uint8Array)} tokens Array of tokens that provide\n   * the stream.\n   */\n  function Stream(tokens) {\n    /** @type {!Array.<number>} */\n    this.tokens = [].slice.call(tokens);\n    // Reversed as push/pop is more efficient than shift/unshift.\n    this.tokens.reverse();\n  }\n\n  Stream.prototype = {\n    /**\n     * @return {boolean} True if end-of-stream has been hit.\n     */\n    endOfStream: function() {\n      return !this.tokens.length;\n    },\n\n    /**\n     * When a token is read from a stream, the first token in the\n     * stream must be returned and subsequently removed, and\n     * end-of-stream must be returned otherwise.\n     *\n     * @return {number} Get the next token from the stream, or\n     * end_of_stream.\n     */\n     read: function() {\n      if (!this.tokens.length)\n        return end_of_stream;\n       return this.tokens.pop();\n     },\n\n    /**\n     * When one or more tokens are prepended to a stream, those tokens\n     * must be inserted, in given order, before the first token in the\n     * stream.\n     *\n     * @param {(number|!Array.<number>)} token The token(s) to prepend to the\n     * stream.\n     */\n    prepend: function(token) {\n      if (Array.isArray(token)) {\n        var tokens = /**@type {!Array.<number>}*/(token);\n        while (tokens.length)\n          this.tokens.push(tokens.pop());\n      } else {\n        this.tokens.push(token);\n      }\n    },\n\n    /**\n     * When one or more tokens are pushed to a stream, those tokens\n     * must be inserted, in given order, after the last token in the\n     * stream.\n     *\n     * @param {(number|!Array.<number>)} token The tokens(s) to push to the\n     * stream.\n     */\n    push: function(token) {\n      if (Array.isArray(token)) {\n        var tokens = /**@type {!Array.<number>}*/(token);\n        while (tokens.length)\n          this.tokens.unshift(tokens.shift());\n      } else {\n        this.tokens.unshift(token);\n      }\n    }\n  };\n\n  //\n  // 5. Encodings\n  //\n\n  // 5.1 Encoders and decoders\n\n  /** @const */\n  var finished = -1;\n\n  /**\n   * @param {boolean} fatal If true, decoding errors raise an exception.\n   * @param {number=} opt_code_point Override the standard fallback code point.\n   * @return {number} The code point to insert on a decoding error.\n   */\n  function decoderError(fatal, opt_code_point) {\n    if (fatal)\n      throw TypeError('Decoder error');\n    return opt_code_point || 0xFFFD;\n  }\n\n  /**\n   * @param {number} code_point The code point that could not be encoded.\n   * @return {number} Always throws, no value is actually returned.\n   */\n  function encoderError(code_point) {\n    throw TypeError('The code point ' + code_point + ' could not be encoded.');\n  }\n\n  /** @interface */\n  function Decoder() {}\n  Decoder.prototype = {\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point, or |finished|.\n     */\n    handler: function(stream, bite) {}\n  };\n\n  /** @interface */\n  function Encoder() {}\n  Encoder.prototype = {\n    /**\n     * @param {Stream} stream The stream of code points being encoded.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit, or |finished|.\n     */\n    handler: function(stream, code_point) {}\n  };\n\n  // 5.2 Names and labels\n\n  // TODO: Define @typedef for Encoding: {name:string,labels:Array.<string>}\n  // https://github.com/google/closure-compiler/issues/247\n\n  /**\n   * @param {string} label The encoding label.\n   * @return {?{name:string,labels:Array.<string>}}\n   */\n  function getEncoding(label) {\n    // 1. Remove any leading and trailing ASCII whitespace from label.\n    label = String(label).trim().toLowerCase();\n\n    // 2. If label is an ASCII case-insensitive match for any of the\n    // labels listed in the table below, return the corresponding\n    // encoding, and failure otherwise.\n    if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {\n      return label_to_encoding[label];\n    }\n    return null;\n  }\n\n  /**\n   * Encodings table: https://encoding.spec.whatwg.org/encodings.json\n   * @const\n   * @type {!Array.<{\n   *          heading: string,\n   *          encodings: Array.<{name:string,labels:Array.<string>}>\n   *        }>}\n   */\n  var encodings = [\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"unicode-1-1-utf-8\",\n            \"utf-8\",\n            \"utf8\"\n          ],\n          \"name\": \"UTF-8\"\n        }\n      ],\n      \"heading\": \"The Encoding\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"866\",\n            \"cp866\",\n            \"csibm866\",\n            \"ibm866\"\n          ],\n          \"name\": \"IBM866\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin2\",\n            \"iso-8859-2\",\n            \"iso-ir-101\",\n            \"iso8859-2\",\n            \"iso88592\",\n            \"iso_8859-2\",\n            \"iso_8859-2:1987\",\n            \"l2\",\n            \"latin2\"\n          ],\n          \"name\": \"ISO-8859-2\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin3\",\n            \"iso-8859-3\",\n            \"iso-ir-109\",\n            \"iso8859-3\",\n            \"iso88593\",\n            \"iso_8859-3\",\n            \"iso_8859-3:1988\",\n            \"l3\",\n            \"latin3\"\n          ],\n          \"name\": \"ISO-8859-3\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin4\",\n            \"iso-8859-4\",\n            \"iso-ir-110\",\n            \"iso8859-4\",\n            \"iso88594\",\n            \"iso_8859-4\",\n            \"iso_8859-4:1988\",\n            \"l4\",\n            \"latin4\"\n          ],\n          \"name\": \"ISO-8859-4\"\n        },\n        {\n          \"labels\": [\n            \"csisolatincyrillic\",\n            \"cyrillic\",\n            \"iso-8859-5\",\n            \"iso-ir-144\",\n            \"iso8859-5\",\n            \"iso88595\",\n            \"iso_8859-5\",\n            \"iso_8859-5:1988\"\n          ],\n          \"name\": \"ISO-8859-5\"\n        },\n        {\n          \"labels\": [\n            \"arabic\",\n            \"asmo-708\",\n            \"csiso88596e\",\n            \"csiso88596i\",\n            \"csisolatinarabic\",\n            \"ecma-114\",\n            \"iso-8859-6\",\n            \"iso-8859-6-e\",\n            \"iso-8859-6-i\",\n            \"iso-ir-127\",\n            \"iso8859-6\",\n            \"iso88596\",\n            \"iso_8859-6\",\n            \"iso_8859-6:1987\"\n          ],\n          \"name\": \"ISO-8859-6\"\n        },\n        {\n          \"labels\": [\n            \"csisolatingreek\",\n            \"ecma-118\",\n            \"elot_928\",\n            \"greek\",\n            \"greek8\",\n            \"iso-8859-7\",\n            \"iso-ir-126\",\n            \"iso8859-7\",\n            \"iso88597\",\n            \"iso_8859-7\",\n            \"iso_8859-7:1987\",\n            \"sun_eu_greek\"\n          ],\n          \"name\": \"ISO-8859-7\"\n        },\n        {\n          \"labels\": [\n            \"csiso88598e\",\n            \"csisolatinhebrew\",\n            \"hebrew\",\n            \"iso-8859-8\",\n            \"iso-8859-8-e\",\n            \"iso-ir-138\",\n            \"iso8859-8\",\n            \"iso88598\",\n            \"iso_8859-8\",\n            \"iso_8859-8:1988\",\n            \"visual\"\n          ],\n          \"name\": \"ISO-8859-8\"\n        },\n        {\n          \"labels\": [\n            \"csiso88598i\",\n            \"iso-8859-8-i\",\n            \"logical\"\n          ],\n          \"name\": \"ISO-8859-8-I\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin6\",\n            \"iso-8859-10\",\n            \"iso-ir-157\",\n            \"iso8859-10\",\n            \"iso885910\",\n            \"l6\",\n            \"latin6\"\n          ],\n          \"name\": \"ISO-8859-10\"\n        },\n        {\n          \"labels\": [\n            \"iso-8859-13\",\n            \"iso8859-13\",\n            \"iso885913\"\n          ],\n          \"name\": \"ISO-8859-13\"\n        },\n        {\n          \"labels\": [\n            \"iso-8859-14\",\n            \"iso8859-14\",\n            \"iso885914\"\n          ],\n          \"name\": \"ISO-8859-14\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin9\",\n            \"iso-8859-15\",\n            \"iso8859-15\",\n            \"iso885915\",\n            \"iso_8859-15\",\n            \"l9\"\n          ],\n          \"name\": \"ISO-8859-15\"\n        },\n        {\n          \"labels\": [\n            \"iso-8859-16\"\n          ],\n          \"name\": \"ISO-8859-16\"\n        },\n        {\n          \"labels\": [\n            \"cskoi8r\",\n            \"koi\",\n            \"koi8\",\n            \"koi8-r\",\n            \"koi8_r\"\n          ],\n          \"name\": \"KOI8-R\"\n        },\n        {\n          \"labels\": [\n            \"koi8-ru\",\n            \"koi8-u\"\n          ],\n          \"name\": \"KOI8-U\"\n        },\n        {\n          \"labels\": [\n            \"csmacintosh\",\n            \"mac\",\n            \"macintosh\",\n            \"x-mac-roman\"\n          ],\n          \"name\": \"macintosh\"\n        },\n        {\n          \"labels\": [\n            \"dos-874\",\n            \"iso-8859-11\",\n            \"iso8859-11\",\n            \"iso885911\",\n            \"tis-620\",\n            \"windows-874\"\n          ],\n          \"name\": \"windows-874\"\n        },\n        {\n          \"labels\": [\n            \"cp1250\",\n            \"windows-1250\",\n            \"x-cp1250\"\n          ],\n          \"name\": \"windows-1250\"\n        },\n        {\n          \"labels\": [\n            \"cp1251\",\n            \"windows-1251\",\n            \"x-cp1251\"\n          ],\n          \"name\": \"windows-1251\"\n        },\n        {\n          \"labels\": [\n            \"ansi_x3.4-1968\",\n            \"ascii\",\n            \"cp1252\",\n            \"cp819\",\n            \"csisolatin1\",\n            \"ibm819\",\n            \"iso-8859-1\",\n            \"iso-ir-100\",\n            \"iso8859-1\",\n            \"iso88591\",\n            \"iso_8859-1\",\n            \"iso_8859-1:1987\",\n            \"l1\",\n            \"latin1\",\n            \"us-ascii\",\n            \"windows-1252\",\n            \"x-cp1252\"\n          ],\n          \"name\": \"windows-1252\"\n        },\n        {\n          \"labels\": [\n            \"cp1253\",\n            \"windows-1253\",\n            \"x-cp1253\"\n          ],\n          \"name\": \"windows-1253\"\n        },\n        {\n          \"labels\": [\n            \"cp1254\",\n            \"csisolatin5\",\n            \"iso-8859-9\",\n            \"iso-ir-148\",\n            \"iso8859-9\",\n            \"iso88599\",\n            \"iso_8859-9\",\n            \"iso_8859-9:1989\",\n            \"l5\",\n            \"latin5\",\n            \"windows-1254\",\n            \"x-cp1254\"\n          ],\n          \"name\": \"windows-1254\"\n        },\n        {\n          \"labels\": [\n            \"cp1255\",\n            \"windows-1255\",\n            \"x-cp1255\"\n          ],\n          \"name\": \"windows-1255\"\n        },\n        {\n          \"labels\": [\n            \"cp1256\",\n            \"windows-1256\",\n            \"x-cp1256\"\n          ],\n          \"name\": \"windows-1256\"\n        },\n        {\n          \"labels\": [\n            \"cp1257\",\n            \"windows-1257\",\n            \"x-cp1257\"\n          ],\n          \"name\": \"windows-1257\"\n        },\n        {\n          \"labels\": [\n            \"cp1258\",\n            \"windows-1258\",\n            \"x-cp1258\"\n          ],\n          \"name\": \"windows-1258\"\n        },\n        {\n          \"labels\": [\n            \"x-mac-cyrillic\",\n            \"x-mac-ukrainian\"\n          ],\n          \"name\": \"x-mac-cyrillic\"\n        }\n      ],\n      \"heading\": \"Legacy single-byte encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"chinese\",\n            \"csgb2312\",\n            \"csiso58gb231280\",\n            \"gb2312\",\n            \"gb_2312\",\n            \"gb_2312-80\",\n            \"gbk\",\n            \"iso-ir-58\",\n            \"x-gbk\"\n          ],\n          \"name\": \"GBK\"\n        },\n        {\n          \"labels\": [\n            \"gb18030\"\n          ],\n          \"name\": \"gb18030\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Chinese (simplified) encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"big5\",\n            \"big5-hkscs\",\n            \"cn-big5\",\n            \"csbig5\",\n            \"x-x-big5\"\n          ],\n          \"name\": \"Big5\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Chinese (traditional) encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"cseucpkdfmtjapanese\",\n            \"euc-jp\",\n            \"x-euc-jp\"\n          ],\n          \"name\": \"EUC-JP\"\n        },\n        {\n          \"labels\": [\n            \"csiso2022jp\",\n            \"iso-2022-jp\"\n          ],\n          \"name\": \"ISO-2022-JP\"\n        },\n        {\n          \"labels\": [\n            \"csshiftjis\",\n            \"ms932\",\n            \"ms_kanji\",\n            \"shift-jis\",\n            \"shift_jis\",\n            \"sjis\",\n            \"windows-31j\",\n            \"x-sjis\"\n          ],\n          \"name\": \"Shift_JIS\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Japanese encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"cseuckr\",\n            \"csksc56011987\",\n            \"euc-kr\",\n            \"iso-ir-149\",\n            \"korean\",\n            \"ks_c_5601-1987\",\n            \"ks_c_5601-1989\",\n            \"ksc5601\",\n            \"ksc_5601\",\n            \"windows-949\"\n          ],\n          \"name\": \"EUC-KR\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Korean encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"csiso2022kr\",\n            \"hz-gb-2312\",\n            \"iso-2022-cn\",\n            \"iso-2022-cn-ext\",\n            \"iso-2022-kr\"\n          ],\n          \"name\": \"replacement\"\n        },\n        {\n          \"labels\": [\n            \"utf-16be\"\n          ],\n          \"name\": \"UTF-16BE\"\n        },\n        {\n          \"labels\": [\n            \"utf-16\",\n            \"utf-16le\"\n          ],\n          \"name\": \"UTF-16LE\"\n        },\n        {\n          \"labels\": [\n            \"x-user-defined\"\n          ],\n          \"name\": \"x-user-defined\"\n        }\n      ],\n      \"heading\": \"Legacy miscellaneous encodings\"\n    }\n  ];\n\n  // Label to encoding registry.\n  /** @type {Object.<string,{name:string,labels:Array.<string>}>} */\n  var label_to_encoding = {};\n  encodings.forEach(function(category) {\n    category.encodings.forEach(function(encoding) {\n      encoding.labels.forEach(function(label) {\n        label_to_encoding[label] = encoding;\n      });\n    });\n  });\n\n  // Registry of of encoder/decoder factories, by encoding name.\n  /** @type {Object.<string, function({fatal:boolean}): Encoder>} */\n  var encoders = {};\n  /** @type {Object.<string, function({fatal:boolean}): Decoder>} */\n  var decoders = {};\n\n  //\n  // 6. Indexes\n  //\n\n  /**\n   * @param {number} pointer The |pointer| to search for.\n   * @param {(!Array.<?number>|undefined)} index The |index| to search within.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in |index|.\n   */\n  function indexCodePointFor(pointer, index) {\n    if (!index) return null;\n    return index[pointer] || null;\n  }\n\n  /**\n   * @param {number} code_point The |code point| to search for.\n   * @param {!Array.<?number>} index The |index| to search within.\n   * @return {?number} The first pointer corresponding to |code point| in\n   *     |index|, or null if |code point| is not in |index|.\n   */\n  function indexPointerFor(code_point, index) {\n    var pointer = index.indexOf(code_point);\n    return pointer === -1 ? null : pointer;\n  }\n\n  /**\n   * @param {string} name Name of the index.\n   * @return {(!Array.<number>|!Array.<Array.<number>>)}\n   *  */\n  function index(name) {\n    if (!('encoding-indexes' in global)) {\n      throw Error(\"Indexes missing.\" +\n                  \" Did you forget to include encoding-indexes.js first?\");\n    }\n    return global['encoding-indexes'][name];\n  }\n\n  /**\n   * @param {number} pointer The |pointer| to search for in the gb18030 index.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in the gb18030 index.\n   */\n  function indexGB18030RangesCodePointFor(pointer) {\n    // 1. If pointer is greater than 39419 and less than 189000, or\n    // pointer is greater than 1237575, return null.\n    if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))\n      return null;\n\n    // 2. If pointer is 7457, return code point U+E7C7.\n    if (pointer === 7457) return 0xE7C7;\n\n    // 3. Let offset be the last pointer in index gb18030 ranges that\n    // is equal to or less than pointer and let code point offset be\n    // its corresponding code point.\n    var offset = 0;\n    var code_point_offset = 0;\n    var idx = index('gb18030-ranges');\n    var i;\n    for (i = 0; i < idx.length; ++i) {\n      /** @type {!Array.<number>} */\n      var entry = idx[i];\n      if (entry[0] <= pointer) {\n        offset = entry[0];\n        code_point_offset = entry[1];\n      } else {\n        break;\n      }\n    }\n\n    // 4. Return a code point whose value is code point offset +\n    // pointer − offset.\n    return code_point_offset + pointer - offset;\n  }\n\n  /**\n   * @param {number} code_point The |code point| to locate in the gb18030 index.\n   * @return {number} The first pointer corresponding to |code point| in the\n   *     gb18030 index.\n   */\n  function indexGB18030RangesPointerFor(code_point) {\n    // 1. If code point is U+E7C7, return pointer 7457.\n    if (code_point === 0xE7C7) return 7457;\n\n    // 2. Let offset be the last code point in index gb18030 ranges\n    // that is equal to or less than code point and let pointer offset\n    // be its corresponding pointer.\n    var offset = 0;\n    var pointer_offset = 0;\n    var idx = index('gb18030-ranges');\n    var i;\n    for (i = 0; i < idx.length; ++i) {\n      /** @type {!Array.<number>} */\n      var entry = idx[i];\n      if (entry[1] <= code_point) {\n        offset = entry[1];\n        pointer_offset = entry[0];\n      } else {\n        break;\n      }\n    }\n\n    // 3. Return a pointer whose value is pointer offset + code point\n    // − offset.\n    return pointer_offset + code_point - offset;\n  }\n\n  /**\n   * @param {number} code_point The |code_point| to search for in the Shift_JIS\n   *     index.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in the Shift_JIS index.\n   */\n  function indexShiftJISPointerFor(code_point) {\n    // 1. Let index be index jis0208 excluding all entries whose\n    // pointer is in the range 8272 to 8835, inclusive.\n    shift_jis_index = shift_jis_index ||\n      index('jis0208').map(function(code_point, pointer) {\n        return inRange(pointer, 8272, 8835) ? null : code_point;\n      });\n    var index_ = shift_jis_index;\n\n    // 2. Return the index pointer for code point in index.\n    return index_.indexOf(code_point);\n  }\n  var shift_jis_index;\n\n  /**\n   * @param {number} code_point The |code_point| to search for in the big5\n   *     index.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in the big5 index.\n   */\n  function indexBig5PointerFor(code_point) {\n    // 1. Let index be index Big5 excluding all entries whose pointer\n    big5_index_no_hkscs = big5_index_no_hkscs ||\n      index('big5').map(function(code_point, pointer) {\n        return (pointer < (0xA1 - 0x81) * 157) ? null : code_point;\n      });\n    var index_ = big5_index_no_hkscs;\n\n    // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or\n    // U+5345, return the last pointer corresponding to code point in\n    // index.\n    if (code_point === 0x2550 || code_point === 0x255E ||\n        code_point === 0x2561 || code_point === 0x256A ||\n        code_point === 0x5341 || code_point === 0x5345) {\n      return index_.lastIndexOf(code_point);\n    }\n\n    // 3. Return the index pointer for code point in index.\n    return indexPointerFor(code_point, index_);\n  }\n  var big5_index_no_hkscs;\n\n  //\n  // 8. API\n  //\n\n  /** @const */ var DEFAULT_ENCODING = 'utf-8';\n\n  // 8.1 Interface TextDecoder\n\n  /**\n   * @constructor\n   * @param {string=} label The label of the encoding;\n   *     defaults to 'utf-8'.\n   * @param {Object=} options\n   */\n  function TextDecoder(label, options) {\n    // Web IDL conventions\n    if (!(this instanceof TextDecoder))\n      throw TypeError('Called as a function. Did you forget \\'new\\'?');\n    label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n    options = ToDictionary(options);\n\n    // A TextDecoder object has an associated encoding, decoder,\n    // stream, ignore BOM flag (initially unset), BOM seen flag\n    // (initially unset), error mode (initially replacement), and do\n    // not flush flag (initially unset).\n\n    /** @private */\n    this._encoding = null;\n    /** @private @type {?Decoder} */\n    this._decoder = null;\n    /** @private @type {boolean} */\n    this._ignoreBOM = false;\n    /** @private @type {boolean} */\n    this._BOMseen = false;\n    /** @private @type {string} */\n    this._error_mode = 'replacement';\n    /** @private @type {boolean} */\n    this._do_not_flush = false;\n\n\n    // 1. Let encoding be the result of getting an encoding from\n    // label.\n    var encoding = getEncoding(label);\n\n    // 2. If encoding is failure or replacement, throw a RangeError.\n    if (encoding === null || encoding.name === 'replacement')\n      throw RangeError('Unknown encoding: ' + label);\n    if (!decoders[encoding.name]) {\n      throw Error('Decoder not present.' +\n                  ' Did you forget to include encoding-indexes.js first?');\n    }\n\n    // 3. Let dec be a new TextDecoder object.\n    var dec = this;\n\n    // 4. Set dec's encoding to encoding.\n    dec._encoding = encoding;\n\n    // 5. If options's fatal member is true, set dec's error mode to\n    // fatal.\n    if (Boolean(options['fatal']))\n      dec._error_mode = 'fatal';\n\n    // 6. If options's ignoreBOM member is true, set dec's ignore BOM\n    // flag.\n    if (Boolean(options['ignoreBOM']))\n      dec._ignoreBOM = true;\n\n    // For pre-ES5 runtimes:\n    if (!Object.defineProperty) {\n      this.encoding = dec._encoding.name.toLowerCase();\n      this.fatal = dec._error_mode === 'fatal';\n      this.ignoreBOM = dec._ignoreBOM;\n    }\n\n    // 7. Return dec.\n    return dec;\n  }\n\n  if (Object.defineProperty) {\n    // The encoding attribute's getter must return encoding's name.\n    Object.defineProperty(TextDecoder.prototype, 'encoding', {\n      /** @this {TextDecoder} */\n      get: function() { return this._encoding.name.toLowerCase(); }\n    });\n\n    // The fatal attribute's getter must return true if error mode\n    // is fatal, and false otherwise.\n    Object.defineProperty(TextDecoder.prototype, 'fatal', {\n      /** @this {TextDecoder} */\n      get: function() { return this._error_mode === 'fatal'; }\n    });\n\n    // The ignoreBOM attribute's getter must return true if ignore\n    // BOM flag is set, and false otherwise.\n    Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', {\n      /** @this {TextDecoder} */\n      get: function() { return this._ignoreBOM; }\n    });\n  }\n\n  /**\n   * @param {BufferSource=} input The buffer of bytes to decode.\n   * @param {Object=} options\n   * @return {string} The decoded string.\n   */\n  TextDecoder.prototype.decode = function decode(input, options) {\n    var bytes;\n    if (typeof input === 'object' && input instanceof ArrayBuffer) {\n      bytes = new Uint8Array(input);\n    } else if (typeof input === 'object' && 'buffer' in input &&\n               input.buffer instanceof ArrayBuffer) {\n      bytes = new Uint8Array(input.buffer,\n                             input.byteOffset,\n                             input.byteLength);\n    } else {\n      bytes = new Uint8Array(0);\n    }\n\n    options = ToDictionary(options);\n\n    // 1. If the do not flush flag is unset, set decoder to a new\n    // encoding's decoder, set stream to a new stream, and unset the\n    // BOM seen flag.\n    if (!this._do_not_flush) {\n      this._decoder = decoders[this._encoding.name]({\n        fatal: this._error_mode === 'fatal'});\n      this._BOMseen = false;\n    }\n\n    // 2. If options's stream is true, set the do not flush flag, and\n    // unset the do not flush flag otherwise.\n    this._do_not_flush = Boolean(options['stream']);\n\n    // 3. If input is given, push a copy of input to stream.\n    // TODO: Align with spec algorithm - maintain stream on instance.\n    var input_stream = new Stream(bytes);\n\n    // 4. Let output be a new stream.\n    var output = [];\n\n    /** @type {?(number|!Array.<number>)} */\n    var result;\n\n    // 5. While true:\n    while (true) {\n      // 1. Let token be the result of reading from stream.\n      var token = input_stream.read();\n\n      // 2. If token is end-of-stream and the do not flush flag is\n      // set, return output, serialized.\n      // TODO: Align with spec algorithm.\n      if (token === end_of_stream)\n        break;\n\n      // 3. Otherwise, run these subsubsteps:\n\n      // 1. Let result be the result of processing token for decoder,\n      // stream, output, and error mode.\n      result = this._decoder.handler(input_stream, token);\n\n      // 2. If result is finished, return output, serialized.\n      if (result === finished)\n        break;\n\n      if (result !== null) {\n        if (Array.isArray(result))\n          output.push.apply(output, /**@type {!Array.<number>}*/(result));\n        else\n          output.push(result);\n      }\n\n      // 3. Otherwise, if result is error, throw a TypeError.\n      // (Thrown in handler)\n\n      // 4. Otherwise, do nothing.\n    }\n    // TODO: Align with spec algorithm.\n    if (!this._do_not_flush) {\n      do {\n        result = this._decoder.handler(input_stream, input_stream.read());\n        if (result === finished)\n          break;\n        if (result === null)\n          continue;\n        if (Array.isArray(result))\n          output.push.apply(output, /**@type {!Array.<number>}*/(result));\n        else\n          output.push(result);\n      } while (!input_stream.endOfStream());\n      this._decoder = null;\n    }\n\n    // A TextDecoder object also has an associated serialize stream\n    // algorithm...\n    /**\n     * @param {!Array.<number>} stream\n     * @return {string}\n     * @this {TextDecoder}\n     */\n    function serializeStream(stream) {\n      // 1. Let token be the result of reading from stream.\n      // (Done in-place on array, rather than as a stream)\n\n      // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore\n      // BOM flag and BOM seen flag are unset, run these subsubsteps:\n      if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) &&\n          !this._ignoreBOM && !this._BOMseen) {\n        if (stream.length > 0 && stream[0] === 0xFEFF) {\n          // 1. If token is U+FEFF, set BOM seen flag.\n          this._BOMseen = true;\n          stream.shift();\n        } else if (stream.length > 0) {\n          // 2. Otherwise, if token is not end-of-stream, set BOM seen\n          // flag and append token to stream.\n          this._BOMseen = true;\n        } else {\n          // 3. Otherwise, if token is not end-of-stream, append token\n          // to output.\n          // (no-op)\n        }\n      }\n      // 4. Otherwise, return output.\n      return codePointsToString(stream);\n    }\n\n    return serializeStream.call(this, output);\n  };\n\n  // 8.2 Interface TextEncoder\n\n  /**\n   * @constructor\n   * @param {string=} label The label of the encoding. NONSTANDARD.\n   * @param {Object=} options NONSTANDARD.\n   */\n  function TextEncoder(label, options) {\n    // Web IDL conventions\n    if (!(this instanceof TextEncoder))\n      throw TypeError('Called as a function. Did you forget \\'new\\'?');\n    options = ToDictionary(options);\n\n    // A TextEncoder object has an associated encoding and encoder.\n\n    /** @private */\n    this._encoding = null;\n    /** @private @type {?Encoder} */\n    this._encoder = null;\n\n    // Non-standard\n    /** @private @type {boolean} */\n    this._do_not_flush = false;\n    /** @private @type {string} */\n    this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement';\n\n    // 1. Let enc be a new TextEncoder object.\n    var enc = this;\n\n    // 2. Set enc's encoding to UTF-8's encoder.\n    if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {\n      // NONSTANDARD behavior.\n      label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n      var encoding = getEncoding(label);\n      if (encoding === null || encoding.name === 'replacement')\n        throw RangeError('Unknown encoding: ' + label);\n      if (!encoders[encoding.name]) {\n        throw Error('Encoder not present.' +\n                    ' Did you forget to include encoding-indexes.js first?');\n      }\n      enc._encoding = encoding;\n    } else {\n      // Standard behavior.\n      enc._encoding = getEncoding('utf-8');\n\n      if (label !== undefined && 'console' in global) {\n        console.warn('TextEncoder constructor called with encoding label, '\n                     + 'which is ignored.');\n      }\n    }\n\n    // For pre-ES5 runtimes:\n    if (!Object.defineProperty)\n      this.encoding = enc._encoding.name.toLowerCase();\n\n    // 3. Return enc.\n    return enc;\n  }\n\n  if (Object.defineProperty) {\n    // The encoding attribute's getter must return encoding's name.\n    Object.defineProperty(TextEncoder.prototype, 'encoding', {\n      /** @this {TextEncoder} */\n      get: function() { return this._encoding.name.toLowerCase(); }\n    });\n  }\n\n  /**\n   * @param {string=} opt_string The string to encode.\n   * @param {Object=} options\n   * @return {!Uint8Array} Encoded bytes, as a Uint8Array.\n   */\n  TextEncoder.prototype.encode = function encode(opt_string, options) {\n    opt_string = opt_string === undefined ? '' : String(opt_string);\n    options = ToDictionary(options);\n\n    // NOTE: This option is nonstandard. None of the encodings\n    // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when\n    // the input is a USVString so streaming is not necessary.\n    if (!this._do_not_flush)\n      this._encoder = encoders[this._encoding.name]({\n        fatal: this._fatal === 'fatal'});\n    this._do_not_flush = Boolean(options['stream']);\n\n    // 1. Convert input to a stream.\n    var input = new Stream(stringToCodePoints(opt_string));\n\n    // 2. Let output be a new stream\n    var output = [];\n\n    /** @type {?(number|!Array.<number>)} */\n    var result;\n    // 3. While true, run these substeps:\n    while (true) {\n      // 1. Let token be the result of reading from input.\n      var token = input.read();\n      if (token === end_of_stream)\n        break;\n      // 2. Let result be the result of processing token for encoder,\n      // input, output.\n      result = this._encoder.handler(input, token);\n      if (result === finished)\n        break;\n      if (Array.isArray(result))\n        output.push.apply(output, /**@type {!Array.<number>}*/(result));\n      else\n        output.push(result);\n    }\n    // TODO: Align with spec algorithm.\n    if (!this._do_not_flush) {\n      while (true) {\n        result = this._encoder.handler(input, input.read());\n        if (result === finished)\n          break;\n        if (Array.isArray(result))\n          output.push.apply(output, /**@type {!Array.<number>}*/(result));\n        else\n          output.push(result);\n      }\n      this._encoder = null;\n    }\n    // 3. If result is finished, convert output into a byte sequence,\n    // and then return a Uint8Array object wrapping an ArrayBuffer\n    // containing output.\n    return new Uint8Array(output);\n  };\n\n\n  //\n  // 9. The encoding\n  //\n\n  // 9.1 utf-8\n\n  // 9.1.1 utf-8 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function UTF8Decoder(options) {\n    var fatal = options.fatal;\n\n    // utf-8's decoder's has an associated utf-8 code point, utf-8\n    // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8\n    // lower boundary (initially 0x80), and a utf-8 upper boundary\n    // (initially 0xBF).\n    var /** @type {number} */ utf8_code_point = 0,\n        /** @type {number} */ utf8_bytes_seen = 0,\n        /** @type {number} */ utf8_bytes_needed = 0,\n        /** @type {number} */ utf8_lower_boundary = 0x80,\n        /** @type {number} */ utf8_upper_boundary = 0xBF;\n\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and utf-8 bytes needed is not 0,\n      // set utf-8 bytes needed to 0 and return error.\n      if (bite === end_of_stream && utf8_bytes_needed !== 0) {\n        utf8_bytes_needed = 0;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream, return finished.\n      if (bite === end_of_stream)\n        return finished;\n\n      // 3. If utf-8 bytes needed is 0, based on byte:\n      if (utf8_bytes_needed === 0) {\n\n        // 0x00 to 0x7F\n        if (inRange(bite, 0x00, 0x7F)) {\n          // Return a code point whose value is byte.\n          return bite;\n        }\n\n        // 0xC2 to 0xDF\n        else if (inRange(bite, 0xC2, 0xDF)) {\n          // 1. Set utf-8 bytes needed to 1.\n          utf8_bytes_needed = 1;\n\n          // 2. Set UTF-8 code point to byte & 0x1F.\n          utf8_code_point = bite & 0x1F;\n        }\n\n        // 0xE0 to 0xEF\n        else if (inRange(bite, 0xE0, 0xEF)) {\n          // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0.\n          if (bite === 0xE0)\n            utf8_lower_boundary = 0xA0;\n          // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F.\n          if (bite === 0xED)\n            utf8_upper_boundary = 0x9F;\n          // 3. Set utf-8 bytes needed to 2.\n          utf8_bytes_needed = 2;\n          // 4. Set UTF-8 code point to byte & 0xF.\n          utf8_code_point = bite & 0xF;\n        }\n\n        // 0xF0 to 0xF4\n        else if (inRange(bite, 0xF0, 0xF4)) {\n          // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90.\n          if (bite === 0xF0)\n            utf8_lower_boundary = 0x90;\n          // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F.\n          if (bite === 0xF4)\n            utf8_upper_boundary = 0x8F;\n          // 3. Set utf-8 bytes needed to 3.\n          utf8_bytes_needed = 3;\n          // 4. Set UTF-8 code point to byte & 0x7.\n          utf8_code_point = bite & 0x7;\n        }\n\n        // Otherwise\n        else {\n          // Return error.\n          return decoderError(fatal);\n        }\n\n        // Return continue.\n        return null;\n      }\n\n      // 4. If byte is not in the range utf-8 lower boundary to utf-8\n      // upper boundary, inclusive, run these substeps:\n      if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) {\n\n        // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8\n        // bytes seen to 0, set utf-8 lower boundary to 0x80, and set\n        // utf-8 upper boundary to 0xBF.\n        utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n        utf8_lower_boundary = 0x80;\n        utf8_upper_boundary = 0xBF;\n\n        // 2. Prepend byte to stream.\n        stream.prepend(bite);\n\n        // 3. Return error.\n        return decoderError(fatal);\n      }\n\n      // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary\n      // to 0xBF.\n      utf8_lower_boundary = 0x80;\n      utf8_upper_boundary = 0xBF;\n\n      // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte &\n      // 0x3F)\n      utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F);\n\n      // 7. Increase utf-8 bytes seen by one.\n      utf8_bytes_seen += 1;\n\n      // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed,\n      // continue.\n      if (utf8_bytes_seen !== utf8_bytes_needed)\n        return null;\n\n      // 9. Let code point be utf-8 code point.\n      var code_point = utf8_code_point;\n\n      // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes\n      // seen to 0.\n      utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n\n      // 11. Return a code point whose value is code point.\n      return code_point;\n    };\n  }\n\n  // 9.1.2 utf-8 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function UTF8Encoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Set count and offset based on the range code point is in:\n      var count, offset;\n      // U+0080 to U+07FF, inclusive:\n      if (inRange(code_point, 0x0080, 0x07FF)) {\n        // 1 and 0xC0\n        count = 1;\n        offset = 0xC0;\n      }\n      // U+0800 to U+FFFF, inclusive:\n      else if (inRange(code_point, 0x0800, 0xFFFF)) {\n        // 2 and 0xE0\n        count = 2;\n        offset = 0xE0;\n      }\n      // U+10000 to U+10FFFF, inclusive:\n      else if (inRange(code_point, 0x10000, 0x10FFFF)) {\n        // 3 and 0xF0\n        count = 3;\n        offset = 0xF0;\n      }\n\n      // 4. Let bytes be a byte sequence whose first byte is (code\n      // point >> (6 × count)) + offset.\n      var bytes = [(code_point >> (6 * count)) + offset];\n\n      // 5. Run these substeps while count is greater than 0:\n      while (count > 0) {\n\n        // 1. Set temp to code point >> (6 × (count − 1)).\n        var temp = code_point >> (6 * (count - 1));\n\n        // 2. Append to bytes 0x80 | (temp & 0x3F).\n        bytes.push(0x80 | (temp & 0x3F));\n\n        // 3. Decrease count by one.\n        count -= 1;\n      }\n\n      // 6. Return bytes bytes, in order.\n      return bytes;\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['UTF-8'] = function(options) {\n    return new UTF8Encoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['UTF-8'] = function(options) {\n    return new UTF8Decoder(options);\n  };\n\n  //\n  // 10. Legacy single-byte encodings\n  //\n\n  // 10.1 single-byte decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {!Array.<number>} index The encoding index.\n   * @param {{fatal: boolean}} options\n   */\n  function SingleByteDecoder(index, options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream, return finished.\n      if (bite === end_of_stream)\n        return finished;\n\n      // 2. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 3. Let code point be the index code point for byte − 0x80 in\n      // index single-byte.\n      var code_point = index[bite - 0x80];\n\n      // 4. If code point is null, return error.\n      if (code_point === null)\n        return decoderError(fatal);\n\n      // 5. Return a code point whose value is code point.\n      return code_point;\n    };\n  }\n\n  // 10.2 single-byte encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {!Array.<?number>} index The encoding index.\n   * @param {{fatal: boolean}} options\n   */\n  function SingleByteEncoder(index, options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Let pointer be the index pointer for code point in index\n      // single-byte.\n      var pointer = indexPointerFor(code_point, index);\n\n      // 4. If pointer is null, return error with code point.\n      if (pointer === null)\n        encoderError(code_point);\n\n      // 5. Return a byte whose value is pointer + 0x80.\n      return pointer + 0x80;\n    };\n  }\n\n  (function() {\n    if (!('encoding-indexes' in global))\n      return;\n    encodings.forEach(function(category) {\n      if (category.heading !== 'Legacy single-byte encodings')\n        return;\n      category.encodings.forEach(function(encoding) {\n        var name = encoding.name;\n        var idx = index(name.toLowerCase());\n        /** @param {{fatal: boolean}} options */\n        decoders[name] = function(options) {\n          return new SingleByteDecoder(idx, options);\n        };\n        /** @param {{fatal: boolean}} options */\n        encoders[name] = function(options) {\n          return new SingleByteEncoder(idx, options);\n        };\n      });\n    });\n  }());\n\n  //\n  // 11. Legacy multi-byte Chinese (simplified) encodings\n  //\n\n  // 11.1 gbk\n\n  // 11.1.1 gbk decoder\n  // gbk's decoder is gb18030's decoder.\n  /** @param {{fatal: boolean}} options */\n  decoders['GBK'] = function(options) {\n    return new GB18030Decoder(options);\n  };\n\n  // 11.1.2 gbk encoder\n  // gbk's encoder is gb18030's encoder with its gbk flag set.\n  /** @param {{fatal: boolean}} options */\n  encoders['GBK'] = function(options) {\n    return new GB18030Encoder(options, true);\n  };\n\n  // 11.2 gb18030\n\n  // 11.2.1 gb18030 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function GB18030Decoder(options) {\n    var fatal = options.fatal;\n    // gb18030's decoder has an associated gb18030 first, gb18030\n    // second, and gb18030 third (all initially 0x00).\n    var /** @type {number} */ gb18030_first = 0x00,\n        /** @type {number} */ gb18030_second = 0x00,\n        /** @type {number} */ gb18030_third = 0x00;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and gb18030 first, gb18030\n      // second, and gb18030 third are 0x00, return finished.\n      if (bite === end_of_stream && gb18030_first === 0x00 &&\n          gb18030_second === 0x00 && gb18030_third === 0x00) {\n        return finished;\n      }\n      // 2. If byte is end-of-stream, and gb18030 first, gb18030\n      // second, or gb18030 third is not 0x00, set gb18030 first,\n      // gb18030 second, and gb18030 third to 0x00, and return error.\n      if (bite === end_of_stream &&\n          (gb18030_first !== 0x00 || gb18030_second !== 0x00 ||\n           gb18030_third !== 0x00)) {\n        gb18030_first = 0x00;\n        gb18030_second = 0x00;\n        gb18030_third = 0x00;\n        decoderError(fatal);\n      }\n      var code_point;\n      // 3. If gb18030 third is not 0x00, run these substeps:\n      if (gb18030_third !== 0x00) {\n        // 1. Let code point be null.\n        code_point = null;\n        // 2. If byte is in the range 0x30 to 0x39, inclusive, set\n        // code point to the index gb18030 ranges code point for\n        // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) ×\n        // 126 + gb18030 third − 0x81) × 10 + byte − 0x30.\n        if (inRange(bite, 0x30, 0x39)) {\n          code_point = indexGB18030RangesCodePointFor(\n              (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 +\n               gb18030_third - 0x81) * 10 + bite - 0x30);\n        }\n\n        // 3. Let buffer be a byte sequence consisting of gb18030\n        // second, gb18030 third, and byte, in order.\n        var buffer = [gb18030_second, gb18030_third, bite];\n\n        // 4. Set gb18030 first, gb18030 second, and gb18030 third to\n        // 0x00.\n        gb18030_first = 0x00;\n        gb18030_second = 0x00;\n        gb18030_third = 0x00;\n\n        // 5. If code point is null, prepend buffer to stream and\n        // return error.\n        if (code_point === null) {\n          stream.prepend(buffer);\n          return decoderError(fatal);\n        }\n\n        // 6. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If gb18030 second is not 0x00, run these substeps:\n      if (gb18030_second !== 0x00) {\n\n        // 1. If byte is in the range 0x81 to 0xFE, inclusive, set\n        // gb18030 third to byte and return continue.\n        if (inRange(bite, 0x81, 0xFE)) {\n          gb18030_third = bite;\n          return null;\n        }\n\n        // 2. Prepend gb18030 second followed by byte to stream, set\n        // gb18030 first and gb18030 second to 0x00, and return error.\n        stream.prepend([gb18030_second, bite]);\n        gb18030_first = 0x00;\n        gb18030_second = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 5. If gb18030 first is not 0x00, run these substeps:\n      if (gb18030_first !== 0x00) {\n\n        // 1. If byte is in the range 0x30 to 0x39, inclusive, set\n        // gb18030 second to byte and return continue.\n        if (inRange(bite, 0x30, 0x39)) {\n          gb18030_second = bite;\n          return null;\n        }\n\n        // 2. Let lead be gb18030 first, let pointer be null, and set\n        // gb18030 first to 0x00.\n        var lead = gb18030_first;\n        var pointer = null;\n        gb18030_first = 0x00;\n\n        // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41\n        // otherwise.\n        var offset = bite < 0x7F ? 0x40 : 0x41;\n\n        // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80\n        // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 +\n        // (byte − offset).\n        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE))\n          pointer = (lead - 0x81) * 190 + (bite - offset);\n\n        // 5. Let code point be null if pointer is null and the index\n        // code point for pointer in index gb18030 otherwise.\n        code_point = pointer === null ? null :\n            indexCodePointFor(pointer, index('gb18030'));\n\n        // 6. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (code_point === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 7. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 8. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 6. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 7. If byte is 0x80, return code point U+20AC.\n      if (bite === 0x80)\n        return 0x20AC;\n\n      // 8. If byte is in the range 0x81 to 0xFE, inclusive, set\n      // gb18030 first to byte and return continue.\n      if (inRange(bite, 0x81, 0xFE)) {\n        gb18030_first = bite;\n        return null;\n      }\n\n      // 9. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 11.2.2 gb18030 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   * @param {boolean=} gbk_flag\n   */\n  function GB18030Encoder(options, gbk_flag) {\n    var fatal = options.fatal;\n    // gb18030's decoder has an associated gbk flag (initially unset).\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. If code point is U+E5E5, return error with code point.\n      if (code_point === 0xE5E5)\n        return encoderError(code_point);\n\n      // 4. If the gbk flag is set and code point is U+20AC, return\n      // byte 0x80.\n      if (gbk_flag && code_point === 0x20AC)\n        return 0x80;\n\n      // 5. Let pointer be the index pointer for code point in index\n      // gb18030.\n      var pointer = indexPointerFor(code_point, index('gb18030'));\n\n      // 6. If pointer is not null, run these substeps:\n      if (pointer !== null) {\n\n        // 1. Let lead be floor(pointer / 190) + 0x81.\n        var lead = floor(pointer / 190) + 0x81;\n\n        // 2. Let trail be pointer % 190.\n        var trail = pointer % 190;\n\n        // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise.\n        var offset = trail < 0x3F ? 0x40 : 0x41;\n\n        // 4. Return two bytes whose values are lead and trail + offset.\n        return [lead, trail + offset];\n      }\n\n      // 7. If gbk flag is set, return error with code point.\n      if (gbk_flag)\n        return encoderError(code_point);\n\n      // 8. Set pointer to the index gb18030 ranges pointer for code\n      // point.\n      pointer = indexGB18030RangesPointerFor(code_point);\n\n      // 9. Let byte1 be floor(pointer / 10 / 126 / 10).\n      var byte1 = floor(pointer / 10 / 126 / 10);\n\n      // 10. Set pointer to pointer − byte1 × 10 × 126 × 10.\n      pointer = pointer - byte1 * 10 * 126 * 10;\n\n      // 11. Let byte2 be floor(pointer / 10 / 126).\n      var byte2 = floor(pointer / 10 / 126);\n\n      // 12. Set pointer to pointer − byte2 × 10 × 126.\n      pointer = pointer - byte2 * 10 * 126;\n\n      // 13. Let byte3 be floor(pointer / 10).\n      var byte3 = floor(pointer / 10);\n\n      // 14. Let byte4 be pointer − byte3 × 10.\n      var byte4 = pointer - byte3 * 10;\n\n      // 15. Return four bytes whose values are byte1 + 0x81, byte2 +\n      // 0x30, byte3 + 0x81, byte4 + 0x30.\n      return [byte1 + 0x81,\n              byte2 + 0x30,\n              byte3 + 0x81,\n              byte4 + 0x30];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['gb18030'] = function(options) {\n    return new GB18030Encoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['gb18030'] = function(options) {\n    return new GB18030Decoder(options);\n  };\n\n\n  //\n  // 12. Legacy multi-byte Chinese (traditional) encodings\n  //\n\n  // 12.1 Big5\n\n  // 12.1.1 Big5 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function Big5Decoder(options) {\n    var fatal = options.fatal;\n    // Big5's decoder has an associated Big5 lead (initially 0x00).\n    var /** @type {number} */ Big5_lead = 0x00;\n\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and Big5 lead is not 0x00, set\n      // Big5 lead to 0x00 and return error.\n      if (bite === end_of_stream && Big5_lead !== 0x00) {\n        Big5_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and Big5 lead is 0x00, return\n      // finished.\n      if (bite === end_of_stream && Big5_lead === 0x00)\n        return finished;\n\n      // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let\n      // pointer be null, set Big5 lead to 0x00, and then run these\n      // substeps:\n      if (Big5_lead !== 0x00) {\n        var lead = Big5_lead;\n        var pointer = null;\n        Big5_lead = 0x00;\n\n        // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62\n        // otherwise.\n        var offset = bite < 0x7F ? 0x40 : 0x62;\n\n        // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1\n        // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 +\n        // (byte − offset).\n        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE))\n          pointer = (lead - 0x81) * 157 + (bite - offset);\n\n        // 3. If there is a row in the table below whose first column\n        // is pointer, return the two code points listed in its second\n        // column\n        // Pointer | Code points\n        // --------+--------------\n        // 1133    | U+00CA U+0304\n        // 1135    | U+00CA U+030C\n        // 1164    | U+00EA U+0304\n        // 1166    | U+00EA U+030C\n        switch (pointer) {\n          case 1133: return [0x00CA, 0x0304];\n          case 1135: return [0x00CA, 0x030C];\n          case 1164: return [0x00EA, 0x0304];\n          case 1166: return [0x00EA, 0x030C];\n        }\n\n        // 4. Let code point be null if pointer is null and the index\n        // code point for pointer in index Big5 otherwise.\n        var code_point = (pointer === null) ? null :\n            indexCodePointFor(pointer, index('big5'));\n\n        // 5. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (code_point === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 6. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 7. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5\n      // lead to byte and return continue.\n      if (inRange(bite, 0x81, 0xFE)) {\n        Big5_lead = bite;\n        return null;\n      }\n\n      // 6. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 12.1.2 Big5 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function Big5Encoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Let pointer be the index Big5 pointer for code point.\n      var pointer = indexBig5PointerFor(code_point);\n\n      // 4. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 5. Let lead be floor(pointer / 157) + 0x81.\n      var lead = floor(pointer / 157) + 0x81;\n\n      // 6. If lead is less than 0xA1, return error with code point.\n      if (lead < 0xA1)\n        return encoderError(code_point);\n\n      // 7. Let trail be pointer % 157.\n      var trail = pointer % 157;\n\n      // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62\n      // otherwise.\n      var offset = trail < 0x3F ? 0x40 : 0x62;\n\n      // Return two bytes whose values are lead and trail + offset.\n      return [lead, trail + offset];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['Big5'] = function(options) {\n    return new Big5Encoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['Big5'] = function(options) {\n    return new Big5Decoder(options);\n  };\n\n\n  //\n  // 13. Legacy multi-byte Japanese encodings\n  //\n\n  // 13.1 euc-jp\n\n  // 13.1.1 euc-jp decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCJPDecoder(options) {\n    var fatal = options.fatal;\n\n    // euc-jp's decoder has an associated euc-jp jis0212 flag\n    // (initially unset) and euc-jp lead (initially 0x00).\n    var /** @type {boolean} */ eucjp_jis0212_flag = false,\n        /** @type {number} */ eucjp_lead = 0x00;\n\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set\n      // euc-jp lead to 0x00, and return error.\n      if (bite === end_of_stream && eucjp_lead !== 0x00) {\n        eucjp_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and euc-jp lead is 0x00, return\n      // finished.\n      if (bite === end_of_stream && eucjp_lead === 0x00)\n        return finished;\n\n      // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to\n      // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code\n      // point whose value is 0xFF61 − 0xA1 + byte.\n      if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) {\n        eucjp_lead = 0x00;\n        return 0xFF61 - 0xA1 + bite;\n      }\n\n      // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to\n      // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead\n      // to byte, and return continue.\n      if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) {\n        eucjp_jis0212_flag = true;\n        eucjp_lead = bite;\n        return null;\n      }\n\n      // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set\n      // euc-jp lead to 0x00, and run these substeps:\n      if (eucjp_lead !== 0x00) {\n        var lead = eucjp_lead;\n        eucjp_lead = 0x00;\n\n        // 1. Let code point be null.\n        var code_point = null;\n\n        // 2. If lead and byte are both in the range 0xA1 to 0xFE,\n        // inclusive, set code point to the index code point for (lead\n        // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp\n        // jis0212 flag is unset and in index jis0212 otherwise.\n        if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {\n          code_point = indexCodePointFor(\n            (lead - 0xA1) * 94 + (bite - 0xA1),\n            index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212'));\n        }\n\n        // 3. Unset the euc-jp jis0212 flag.\n        eucjp_jis0212_flag = false;\n\n        // 4. If byte is not in the range 0xA1 to 0xFE, inclusive,\n        // prepend byte to stream.\n        if (!inRange(bite, 0xA1, 0xFE))\n          stream.prepend(bite);\n\n        // 5. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 6. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 6. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE,\n      // inclusive, set euc-jp lead to byte and return continue.\n      if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) {\n        eucjp_lead = bite;\n        return null;\n      }\n\n      // 8. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 13.1.2 euc-jp encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCJPEncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. If code point is U+00A5, return byte 0x5C.\n      if (code_point === 0x00A5)\n        return 0x5C;\n\n      // 4. If code point is U+203E, return byte 0x7E.\n      if (code_point === 0x203E)\n        return 0x7E;\n\n      // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,\n      // return two bytes whose values are 0x8E and code point −\n      // 0xFF61 + 0xA1.\n      if (inRange(code_point, 0xFF61, 0xFF9F))\n        return [0x8E, code_point - 0xFF61 + 0xA1];\n\n      // 6. If code point is U+2212, set it to U+FF0D.\n      if (code_point === 0x2212)\n        code_point = 0xFF0D;\n\n      // 7. Let pointer be the index pointer for code point in index\n      // jis0208.\n      var pointer = indexPointerFor(code_point, index('jis0208'));\n\n      // 8. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 9. Let lead be floor(pointer / 94) + 0xA1.\n      var lead = floor(pointer / 94) + 0xA1;\n\n      // 10. Let trail be pointer % 94 + 0xA1.\n      var trail = pointer % 94 + 0xA1;\n\n      // 11. Return two bytes whose values are lead and trail.\n      return [lead, trail];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['EUC-JP'] = function(options) {\n    return new EUCJPEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['EUC-JP'] = function(options) {\n    return new EUCJPDecoder(options);\n  };\n\n  // 13.2 iso-2022-jp\n\n  // 13.2.1 iso-2022-jp decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ISO2022JPDecoder(options) {\n    var fatal = options.fatal;\n    /** @enum */\n    var states = {\n      ASCII: 0,\n      Roman: 1,\n      Katakana: 2,\n      LeadByte: 3,\n      TrailByte: 4,\n      EscapeStart: 5,\n      Escape: 6\n    };\n    // iso-2022-jp's decoder has an associated iso-2022-jp decoder\n    // state (initially ASCII), iso-2022-jp decoder output state\n    // (initially ASCII), iso-2022-jp lead (initially 0x00), and\n    // iso-2022-jp output flag (initially unset).\n    var /** @type {number} */ iso2022jp_decoder_state = states.ASCII,\n        /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII,\n        /** @type {number} */ iso2022jp_lead = 0x00,\n        /** @type {boolean} */ iso2022jp_output_flag = false;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // switching on iso-2022-jp decoder state:\n      switch (iso2022jp_decoder_state) {\n      default:\n      case states.ASCII:\n        // ASCII\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B\n        if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E\n            && bite !== 0x0F && bite !== 0x1B) {\n          // Unset the iso-2022-jp output flag and return a code point\n          // whose value is byte.\n          iso2022jp_output_flag = false;\n          return bite;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.Roman:\n        // Roman\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x5C\n        if (bite === 0x5C) {\n          // Unset the iso-2022-jp output flag and return code point\n          // U+00A5.\n          iso2022jp_output_flag = false;\n          return 0x00A5;\n        }\n\n        // 0x7E\n        if (bite === 0x7E) {\n          // Unset the iso-2022-jp output flag and return code point\n          // U+203E.\n          iso2022jp_output_flag = false;\n          return 0x203E;\n        }\n\n        // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E\n        if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F\n            && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) {\n          // Unset the iso-2022-jp output flag and return a code point\n          // whose value is byte.\n          iso2022jp_output_flag = false;\n          return bite;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.Katakana:\n        // Katakana\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x21 to 0x5F\n        if (inRange(bite, 0x21, 0x5F)) {\n          // Unset the iso-2022-jp output flag and return a code point\n          // whose value is 0xFF61 − 0x21 + byte.\n          iso2022jp_output_flag = false;\n          return 0xFF61 - 0x21 + bite;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.LeadByte:\n        // Lead byte\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x21 to 0x7E\n        if (inRange(bite, 0x21, 0x7E)) {\n          // Unset the iso-2022-jp output flag, set iso-2022-jp lead\n          // to byte, iso-2022-jp decoder state to trail byte, and\n          // return continue.\n          iso2022jp_output_flag = false;\n          iso2022jp_lead = bite;\n          iso2022jp_decoder_state = states.TrailByte;\n          return null;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.TrailByte:\n        // Trail byte\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return decoderError(fatal);\n        }\n\n        // 0x21 to 0x7E\n        if (inRange(bite, 0x21, 0x7E)) {\n          // 1. Set the iso-2022-jp decoder state to lead byte.\n          iso2022jp_decoder_state = states.LeadByte;\n\n          // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21.\n          var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;\n\n          // 3. Let code point be the index code point for pointer in\n          // index jis0208.\n          var code_point = indexCodePointFor(pointer, index('jis0208'));\n\n          // 4. If code point is null, return error.\n          if (code_point === null)\n            return decoderError(fatal);\n\n          // 5. Return a code point whose value is code point.\n          return code_point;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Set the iso-2022-jp decoder state to lead byte, prepend\n          // byte to stream, and return error.\n          iso2022jp_decoder_state = states.LeadByte;\n          stream.prepend(bite);\n          return decoderError(fatal);\n        }\n\n        // Otherwise\n        // Set iso-2022-jp decoder state to lead byte and return\n        // error.\n        iso2022jp_decoder_state = states.LeadByte;\n        return decoderError(fatal);\n\n      case states.EscapeStart:\n        // Escape start\n\n        // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to\n        // byte, iso-2022-jp decoder state to escape, and return\n        // continue.\n        if (bite === 0x24 || bite === 0x28) {\n          iso2022jp_lead = bite;\n          iso2022jp_decoder_state = states.Escape;\n          return null;\n        }\n\n        // 2. Prepend byte to stream.\n        stream.prepend(bite);\n\n        // 3. Unset the iso-2022-jp output flag, set iso-2022-jp\n        // decoder state to iso-2022-jp decoder output state, and\n        // return error.\n        iso2022jp_output_flag = false;\n        iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n        return decoderError(fatal);\n\n      case states.Escape:\n        // Escape\n\n        // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to\n        // 0x00.\n        var lead = iso2022jp_lead;\n        iso2022jp_lead = 0x00;\n\n        // 2. Let state be null.\n        var state = null;\n\n        // 3. If lead is 0x28 and byte is 0x42, set state to ASCII.\n        if (lead === 0x28 && bite === 0x42)\n          state = states.ASCII;\n\n        // 4. If lead is 0x28 and byte is 0x4A, set state to Roman.\n        if (lead === 0x28 && bite === 0x4A)\n          state = states.Roman;\n\n        // 5. If lead is 0x28 and byte is 0x49, set state to Katakana.\n        if (lead === 0x28 && bite === 0x49)\n          state = states.Katakana;\n\n        // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set\n        // state to lead byte.\n        if (lead === 0x24 && (bite === 0x40 || bite === 0x42))\n          state = states.LeadByte;\n\n        // 7. If state is non-null, run these substeps:\n        if (state !== null) {\n          // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder\n          // output state to states.\n          iso2022jp_decoder_state = iso2022jp_decoder_state = state;\n\n          // 2. Let output flag be the iso-2022-jp output flag.\n          var output_flag = iso2022jp_output_flag;\n\n          // 3. Set the iso-2022-jp output flag.\n          iso2022jp_output_flag = true;\n\n          // 4. Return continue, if output flag is unset, and error\n          // otherwise.\n          return !output_flag ? null : decoderError(fatal);\n        }\n\n        // 8. Prepend lead and byte to stream.\n        stream.prepend([lead, bite]);\n\n        // 9. Unset the iso-2022-jp output flag, set iso-2022-jp\n        // decoder state to iso-2022-jp decoder output state and\n        // return error.\n        iso2022jp_output_flag = false;\n        iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n        return decoderError(fatal);\n      }\n    };\n  }\n\n  // 13.2.2 iso-2022-jp encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ISO2022JPEncoder(options) {\n    var fatal = options.fatal;\n    // iso-2022-jp's encoder has an associated iso-2022-jp encoder\n    // state which is one of ASCII, Roman, and jis0208 (initially\n    // ASCII).\n    /** @enum */\n    var states = {\n      ASCII: 0,\n      Roman: 1,\n      jis0208: 2\n    };\n    var /** @type {number} */ iso2022jp_state = states.ASCII;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream and iso-2022-jp encoder\n      // state is not ASCII, prepend code point to stream, set\n      // iso-2022-jp encoder state to ASCII, and return three bytes\n      // 0x1B 0x28 0x42.\n      if (code_point === end_of_stream &&\n          iso2022jp_state !== states.ASCII) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.ASCII;\n        return [0x1B, 0x28, 0x42];\n      }\n\n      // 2. If code point is end-of-stream and iso-2022-jp encoder\n      // state is ASCII, return finished.\n      if (code_point === end_of_stream && iso2022jp_state === states.ASCII)\n        return finished;\n\n      // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code\n      // point is U+000E, U+000F, or U+001B, return error with U+FFFD.\n      if ((iso2022jp_state === states.ASCII ||\n           iso2022jp_state === states.Roman) &&\n          (code_point === 0x000E || code_point === 0x000F ||\n           code_point === 0x001B)) {\n        return encoderError(0xFFFD);\n      }\n\n      // 4. If iso-2022-jp encoder state is ASCII and code point is an\n      // ASCII code point, return a byte whose value is code point.\n      if (iso2022jp_state === states.ASCII &&\n          isASCIICodePoint(code_point))\n        return code_point;\n\n      // 5. If iso-2022-jp encoder state is Roman and code point is an\n      // ASCII code point, excluding U+005C and U+007E, or is U+00A5\n      // or U+203E, run these substeps:\n      if (iso2022jp_state === states.Roman &&\n          ((isASCIICodePoint(code_point) &&\n           code_point !== 0x005C && code_point !== 0x007E) ||\n          (code_point == 0x00A5 || code_point == 0x203E))) {\n\n        // 1. If code point is an ASCII code point, return a byte\n        // whose value is code point.\n        if (isASCIICodePoint(code_point))\n          return code_point;\n\n        // 2. If code point is U+00A5, return byte 0x5C.\n        if (code_point === 0x00A5)\n          return 0x5C;\n\n        // 3. If code point is U+203E, return byte 0x7E.\n        if (code_point === 0x203E)\n          return 0x7E;\n      }\n\n      // 6. If code point is an ASCII code point, and iso-2022-jp\n      // encoder state is not ASCII, prepend code point to stream, set\n      // iso-2022-jp encoder state to ASCII, and return three bytes\n      // 0x1B 0x28 0x42.\n      if (isASCIICodePoint(code_point) &&\n          iso2022jp_state !== states.ASCII) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.ASCII;\n        return [0x1B, 0x28, 0x42];\n      }\n\n      // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp\n      // encoder state is not Roman, prepend code point to stream, set\n      // iso-2022-jp encoder state to Roman, and return three bytes\n      // 0x1B 0x28 0x4A.\n      if ((code_point === 0x00A5 || code_point === 0x203E) &&\n          iso2022jp_state !== states.Roman) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.Roman;\n        return [0x1B, 0x28, 0x4A];\n      }\n\n      // 8. If code point is U+2212, set it to U+FF0D.\n      if (code_point === 0x2212)\n        code_point = 0xFF0D;\n\n      // 9. Let pointer be the index pointer for code point in index\n      // jis0208.\n      var pointer = indexPointerFor(code_point, index('jis0208'));\n\n      // 10. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 11. If iso-2022-jp encoder state is not jis0208, prepend code\n      // point to stream, set iso-2022-jp encoder state to jis0208,\n      // and return three bytes 0x1B 0x24 0x42.\n      if (iso2022jp_state !== states.jis0208) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.jis0208;\n        return [0x1B, 0x24, 0x42];\n      }\n\n      // 12. Let lead be floor(pointer / 94) + 0x21.\n      var lead = floor(pointer / 94) + 0x21;\n\n      // 13. Let trail be pointer % 94 + 0x21.\n      var trail = pointer % 94 + 0x21;\n\n      // 14. Return two bytes whose values are lead and trail.\n      return [lead, trail];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['ISO-2022-JP'] = function(options) {\n    return new ISO2022JPEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['ISO-2022-JP'] = function(options) {\n    return new ISO2022JPDecoder(options);\n  };\n\n  // 13.3 Shift_JIS\n\n  // 13.3.1 Shift_JIS decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ShiftJISDecoder(options) {\n    var fatal = options.fatal;\n    // Shift_JIS's decoder has an associated Shift_JIS lead (initially\n    // 0x00).\n    var /** @type {number} */ Shift_JIS_lead = 0x00;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00,\n      // set Shift_JIS lead to 0x00 and return error.\n      if (bite === end_of_stream && Shift_JIS_lead !== 0x00) {\n        Shift_JIS_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and Shift_JIS lead is 0x00,\n      // return finished.\n      if (bite === end_of_stream && Shift_JIS_lead === 0x00)\n        return finished;\n\n      // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead,\n      // let pointer be null, set Shift_JIS lead to 0x00, and then run\n      // these substeps:\n      if (Shift_JIS_lead !== 0x00) {\n        var lead = Shift_JIS_lead;\n        var pointer = null;\n        Shift_JIS_lead = 0x00;\n\n        // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41\n        // otherwise.\n        var offset = (bite < 0x7F) ? 0x40 : 0x41;\n\n        // 2. Let lead offset be 0x81, if lead is less than 0xA0, and\n        // 0xC1 otherwise.\n        var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;\n\n        // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80\n        // to 0xFC, inclusive, set pointer to (lead − lead offset) ×\n        // 188 + byte − offset.\n        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC))\n          pointer = (lead - lead_offset) * 188 + bite - offset;\n\n        // 4. If pointer is in the range 8836 to 10715, inclusive,\n        // return a code point whose value is 0xE000 − 8836 + pointer.\n        if (inRange(pointer, 8836, 10715))\n          return 0xE000 - 8836 + pointer;\n\n        // 5. Let code point be null, if pointer is null, and the\n        // index code point for pointer in index jis0208 otherwise.\n        var code_point = (pointer === null) ? null :\n              indexCodePointFor(pointer, index('jis0208'));\n\n        // 6. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (code_point === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 7. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 8. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If byte is an ASCII byte or 0x80, return a code point\n      // whose value is byte.\n      if (isASCIIByte(bite) || bite === 0x80)\n        return bite;\n\n      // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a\n      // code point whose value is 0xFF61 − 0xA1 + byte.\n      if (inRange(bite, 0xA1, 0xDF))\n        return 0xFF61 - 0xA1 + bite;\n\n      // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0\n      // to 0xFC, inclusive, set Shift_JIS lead to byte and return\n      // continue.\n      if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {\n        Shift_JIS_lead = bite;\n        return null;\n      }\n\n      // 7. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 13.3.2 Shift_JIS encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ShiftJISEncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point or U+0080, return a\n      // byte whose value is code point.\n      if (isASCIICodePoint(code_point) || code_point === 0x0080)\n        return code_point;\n\n      // 3. If code point is U+00A5, return byte 0x5C.\n      if (code_point === 0x00A5)\n        return 0x5C;\n\n      // 4. If code point is U+203E, return byte 0x7E.\n      if (code_point === 0x203E)\n        return 0x7E;\n\n      // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,\n      // return a byte whose value is code point − 0xFF61 + 0xA1.\n      if (inRange(code_point, 0xFF61, 0xFF9F))\n        return code_point - 0xFF61 + 0xA1;\n\n      // 6. If code point is U+2212, set it to U+FF0D.\n      if (code_point === 0x2212)\n        code_point = 0xFF0D;\n\n      // 7. Let pointer be the index Shift_JIS pointer for code point.\n      var pointer = indexShiftJISPointerFor(code_point);\n\n      // 8. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 9. Let lead be floor(pointer / 188).\n      var lead = floor(pointer / 188);\n\n      // 10. Let lead offset be 0x81, if lead is less than 0x1F, and\n      // 0xC1 otherwise.\n      var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1;\n\n      // 11. Let trail be pointer % 188.\n      var trail = pointer % 188;\n\n      // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41\n      // otherwise.\n      var offset = (trail < 0x3F) ? 0x40 : 0x41;\n\n      // 13. Return two bytes whose values are lead + lead offset and\n      // trail + offset.\n      return [lead + lead_offset, trail + offset];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['Shift_JIS'] = function(options) {\n    return new ShiftJISEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['Shift_JIS'] = function(options) {\n    return new ShiftJISDecoder(options);\n  };\n\n  //\n  // 14. Legacy multi-byte Korean encodings\n  //\n\n  // 14.1 euc-kr\n\n  // 14.1.1 euc-kr decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCKRDecoder(options) {\n    var fatal = options.fatal;\n\n    // euc-kr's decoder has an associated euc-kr lead (initially 0x00).\n    var /** @type {number} */ euckr_lead = 0x00;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set\n      // euc-kr lead to 0x00 and return error.\n      if (bite === end_of_stream && euckr_lead !== 0) {\n        euckr_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and euc-kr lead is 0x00, return\n      // finished.\n      if (bite === end_of_stream && euckr_lead === 0)\n        return finished;\n\n      // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let\n      // pointer be null, set euc-kr lead to 0x00, and then run these\n      // substeps:\n      if (euckr_lead !== 0x00) {\n        var lead = euckr_lead;\n        var pointer = null;\n        euckr_lead = 0x00;\n\n        // 1. If byte is in the range 0x41 to 0xFE, inclusive, set\n        // pointer to (lead − 0x81) × 190 + (byte − 0x41).\n        if (inRange(bite, 0x41, 0xFE))\n          pointer = (lead - 0x81) * 190 + (bite - 0x41);\n\n        // 2. Let code point be null, if pointer is null, and the\n        // index code point for pointer in index euc-kr otherwise.\n        var code_point = (pointer === null)\n              ? null : indexCodePointFor(pointer, index('euc-kr'));\n\n        // 3. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (pointer === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 4. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 5. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 5. If byte is in the range 0x81 to 0xFE, inclusive, set\n      // euc-kr lead to byte and return continue.\n      if (inRange(bite, 0x81, 0xFE)) {\n        euckr_lead = bite;\n        return null;\n      }\n\n      // 6. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 14.1.2 euc-kr encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCKREncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Let pointer be the index pointer for code point in index\n      // euc-kr.\n      var pointer = indexPointerFor(code_point, index('euc-kr'));\n\n      // 4. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 5. Let lead be floor(pointer / 190) + 0x81.\n      var lead = floor(pointer / 190) + 0x81;\n\n      // 6. Let trail be pointer % 190 + 0x41.\n      var trail = (pointer % 190) + 0x41;\n\n      // 7. Return two bytes whose values are lead and trail.\n      return [lead, trail];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['EUC-KR'] = function(options) {\n    return new EUCKREncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['EUC-KR'] = function(options) {\n    return new EUCKRDecoder(options);\n  };\n\n\n  //\n  // 15. Legacy miscellaneous encodings\n  //\n\n  // 15.1 replacement\n\n  // Not needed - API throws RangeError\n\n  // 15.2 Common infrastructure for utf-16be and utf-16le\n\n  /**\n   * @param {number} code_unit\n   * @param {boolean} utf16be\n   * @return {!Array.<number>} bytes\n   */\n  function convertCodeUnitToBytes(code_unit, utf16be) {\n    // 1. Let byte1 be code unit >> 8.\n    var byte1 = code_unit >> 8;\n\n    // 2. Let byte2 be code unit & 0x00FF.\n    var byte2 = code_unit & 0x00FF;\n\n    // 3. Then return the bytes in order:\n        // utf-16be flag is set: byte1, then byte2.\n    if (utf16be)\n      return [byte1, byte2];\n    // utf-16be flag is unset: byte2, then byte1.\n    return [byte2, byte1];\n  }\n\n  // 15.2.1 shared utf-16 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {boolean} utf16_be True if big-endian, false if little-endian.\n   * @param {{fatal: boolean}} options\n   */\n  function UTF16Decoder(utf16_be, options) {\n    var fatal = options.fatal;\n    var /** @type {?number} */ utf16_lead_byte = null,\n        /** @type {?number} */ utf16_lead_surrogate = null;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and either utf-16 lead byte or\n      // utf-16 lead surrogate is not null, set utf-16 lead byte and\n      // utf-16 lead surrogate to null, and return error.\n      if (bite === end_of_stream && (utf16_lead_byte !== null ||\n                                utf16_lead_surrogate !== null)) {\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and utf-16 lead byte and utf-16\n      // lead surrogate are null, return finished.\n      if (bite === end_of_stream && utf16_lead_byte === null &&\n          utf16_lead_surrogate === null) {\n        return finished;\n      }\n\n      // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte\n      // and return continue.\n      if (utf16_lead_byte === null) {\n        utf16_lead_byte = bite;\n        return null;\n      }\n\n      // 4. Let code unit be the result of:\n      var code_unit;\n      if (utf16_be) {\n        // utf-16be decoder flag is set\n        //   (utf-16 lead byte << 8) + byte.\n        code_unit = (utf16_lead_byte << 8) + bite;\n      } else {\n        // utf-16be decoder flag is unset\n        //   (byte << 8) + utf-16 lead byte.\n        code_unit = (bite << 8) + utf16_lead_byte;\n      }\n      // Then set utf-16 lead byte to null.\n      utf16_lead_byte = null;\n\n      // 5. If utf-16 lead surrogate is not null, let lead surrogate\n      // be utf-16 lead surrogate, set utf-16 lead surrogate to null,\n      // and then run these substeps:\n      if (utf16_lead_surrogate !== null) {\n        var lead_surrogate = utf16_lead_surrogate;\n        utf16_lead_surrogate = null;\n\n        // 1. If code unit is in the range U+DC00 to U+DFFF,\n        // inclusive, return a code point whose value is 0x10000 +\n        // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00).\n        if (inRange(code_unit, 0xDC00, 0xDFFF)) {\n          return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +\n              (code_unit - 0xDC00);\n        }\n\n        // 2. Prepend the sequence resulting of converting code unit\n        // to bytes using utf-16be decoder flag to stream and return\n        // error.\n        stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be));\n        return decoderError(fatal);\n      }\n\n      // 6. If code unit is in the range U+D800 to U+DBFF, inclusive,\n      // set utf-16 lead surrogate to code unit and return continue.\n      if (inRange(code_unit, 0xD800, 0xDBFF)) {\n        utf16_lead_surrogate = code_unit;\n        return null;\n      }\n\n      // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive,\n      // return error.\n      if (inRange(code_unit, 0xDC00, 0xDFFF))\n        return decoderError(fatal);\n\n      // 8. Return code point code unit.\n      return code_unit;\n    };\n  }\n\n  // 15.2.2 shared utf-16 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {boolean} utf16_be True if big-endian, false if little-endian.\n   * @param {{fatal: boolean}} options\n   */\n  function UTF16Encoder(utf16_be, options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is in the range U+0000 to U+FFFF, inclusive,\n      // return the sequence resulting of converting code point to\n      // bytes using utf-16be encoder flag.\n      if (inRange(code_point, 0x0000, 0xFFFF))\n        return convertCodeUnitToBytes(code_point, utf16_be);\n\n      // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800,\n      // converted to bytes using utf-16be encoder flag.\n      var lead = convertCodeUnitToBytes(\n        ((code_point - 0x10000) >> 10) + 0xD800, utf16_be);\n\n      // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00,\n      // converted to bytes using utf-16be encoder flag.\n      var trail = convertCodeUnitToBytes(\n        ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be);\n\n      // 5. Return a byte sequence of lead followed by trail.\n      return lead.concat(trail);\n    };\n  }\n\n  // 15.3 utf-16be\n  // 15.3.1 utf-16be decoder\n  /** @param {{fatal: boolean}} options */\n  encoders['UTF-16BE'] = function(options) {\n    return new UTF16Encoder(true, options);\n  };\n  // 15.3.2 utf-16be encoder\n  /** @param {{fatal: boolean}} options */\n  decoders['UTF-16BE'] = function(options) {\n    return new UTF16Decoder(true, options);\n  };\n\n  // 15.4 utf-16le\n  // 15.4.1 utf-16le decoder\n  /** @param {{fatal: boolean}} options */\n  encoders['UTF-16LE'] = function(options) {\n    return new UTF16Encoder(false, options);\n  };\n  // 15.4.2 utf-16le encoder\n  /** @param {{fatal: boolean}} options */\n  decoders['UTF-16LE'] = function(options) {\n    return new UTF16Decoder(false, options);\n  };\n\n  // 15.5 x-user-defined\n\n  // 15.5.1 x-user-defined decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function XUserDefinedDecoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream, return finished.\n      if (bite === end_of_stream)\n        return finished;\n\n      // 2. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 3. Return a code point whose value is 0xF780 + byte − 0x80.\n      return 0xF780 + bite - 0x80;\n    };\n  }\n\n  // 15.5.2 x-user-defined encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function XUserDefinedEncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1.If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. If code point is in the range U+F780 to U+F7FF, inclusive,\n      // return a byte whose value is code point − 0xF780 + 0x80.\n      if (inRange(code_point, 0xF780, 0xF7FF))\n        return code_point - 0xF780 + 0x80;\n\n      // 4. Return error with code point.\n      return encoderError(code_point);\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['x-user-defined'] = function(options) {\n    return new XUserDefinedEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['x-user-defined'] = function(options) {\n    return new XUserDefinedDecoder(options);\n  };\n\n  if (!global['TextEncoder'])\n    global['TextEncoder'] = TextEncoder;\n  if (!global['TextDecoder'])\n    global['TextDecoder'] = TextDecoder;\n\n  if (typeof module !== \"undefined\" && module.exports) {\n    module.exports = {\n      TextEncoder: global['TextEncoder'],\n      TextDecoder: global['TextDecoder'],\n      EncodingIndexes: global[\"encoding-indexes\"]\n    };\n  }\n\n// For strict environments where `this` inside the global scope\n// is `undefined`, take a pure object instead\n}(this || {}));\n},{\"./encoding-indexes.js\":56}],58:[function(require,module,exports){\n(function (global){\n'use strict';\n\n/* !\n * type-detect\n * Copyright(c) 2013 jake luer <jake@alogicalparadox.com>\n * MIT Licensed\n */\nvar promiseExists = typeof Promise === 'function';\nvar globalObject = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : self; // eslint-disable-line\nvar isDom = 'location' in globalObject && 'document' in globalObject;\nvar symbolExists = typeof Symbol !== 'undefined';\nvar mapExists = typeof Map !== 'undefined';\nvar setExists = typeof Set !== 'undefined';\nvar weakMapExists = typeof WeakMap !== 'undefined';\nvar weakSetExists = typeof WeakSet !== 'undefined';\nvar dataViewExists = typeof DataView !== 'undefined';\nvar symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined';\nvar symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined';\nvar setEntriesExists = setExists && typeof Set.prototype.entries === 'function';\nvar mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function';\nvar setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries());\nvar mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries());\nvar arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function';\nvar arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());\nvar stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function';\nvar stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]());\nvar toStringLeftSliceLength = 8;\nvar toStringRightSliceLength = -1;\n/**\n * ### typeOf (obj)\n *\n * Uses `Object.prototype.toString` to determine the type of an object,\n * normalising behaviour across engine versions & well optimised.\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\nmodule.exports = function typeDetect(obj) {\n  /* ! Speed optimisation\n   * Pre:\n   *   string literal     x 3,039,035 ops/sec ±1.62% (78 runs sampled)\n   *   boolean literal    x 1,424,138 ops/sec ±4.54% (75 runs sampled)\n   *   number literal     x 1,653,153 ops/sec ±1.91% (82 runs sampled)\n   *   undefined          x 9,978,660 ops/sec ±1.92% (75 runs sampled)\n   *   function           x 2,556,769 ops/sec ±1.73% (77 runs sampled)\n   * Post:\n   *   string literal     x 38,564,796 ops/sec ±1.15% (79 runs sampled)\n   *   boolean literal    x 31,148,940 ops/sec ±1.10% (79 runs sampled)\n   *   number literal     x 32,679,330 ops/sec ±1.90% (78 runs sampled)\n   *   undefined          x 32,363,368 ops/sec ±1.07% (82 runs sampled)\n   *   function           x 31,296,870 ops/sec ±0.96% (83 runs sampled)\n   */\n  var typeofObj = typeof obj;\n  if (typeofObj !== 'object') {\n    return typeofObj;\n  }\n\n  /* ! Speed optimisation\n   * Pre:\n   *   null               x 28,645,765 ops/sec ±1.17% (82 runs sampled)\n   * Post:\n   *   null               x 36,428,962 ops/sec ±1.37% (84 runs sampled)\n   */\n  if (obj === null) {\n    return 'null';\n  }\n\n  /* ! Spec Conformance\n   * Test: `Object.prototype.toString.call(window)``\n   *  - Node === \"[object global]\"\n   *  - Chrome === \"[object global]\"\n   *  - Firefox === \"[object Window]\"\n   *  - PhantomJS === \"[object Window]\"\n   *  - Safari === \"[object Window]\"\n   *  - IE 11 === \"[object Window]\"\n   *  - IE Edge === \"[object Window]\"\n   * Test: `Object.prototype.toString.call(this)``\n   *  - Chrome Worker === \"[object global]\"\n   *  - Firefox Worker === \"[object DedicatedWorkerGlobalScope]\"\n   *  - Safari Worker === \"[object DedicatedWorkerGlobalScope]\"\n   *  - IE 11 Worker === \"[object WorkerGlobalScope]\"\n   *  - IE Edge Worker === \"[object WorkerGlobalScope]\"\n   */\n  if (obj === globalObject) {\n    return 'global';\n  }\n\n  /* ! Speed optimisation\n   * Pre:\n   *   array literal      x 2,888,352 ops/sec ±0.67% (82 runs sampled)\n   * Post:\n   *   array literal      x 22,479,650 ops/sec ±0.96% (81 runs sampled)\n   */\n  if (\n    Array.isArray(obj) &&\n    (symbolToStringTagExists === false || !(Symbol.toStringTag in obj))\n  ) {\n    return 'Array';\n  }\n\n  if (isDom) {\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/multipage/browsers.html#location)\n     * WhatWG HTML$7.7.3 - The `Location` interface\n     * Test: `Object.prototype.toString.call(window.location)``\n     *  - IE <=11 === \"[object Object]\"\n     *  - IE Edge <=13 === \"[object Object]\"\n     */\n    if (obj === globalObject.location) {\n      return 'Location';\n    }\n\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/#document)\n     * WhatWG HTML$3.1.1 - The `Document` object\n     * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n     *       (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268)\n     *       which suggests that browsers should use HTMLTableCellElement for\n     *       both TD and TH elements. WhatWG separates these.\n     *       WhatWG HTML states:\n     *         > For historical reasons, Window objects must also have a\n     *         > writable, configurable, non-enumerable property named\n     *         > HTMLDocument whose value is the Document interface object.\n     * Test: `Object.prototype.toString.call(document)``\n     *  - Chrome === \"[object HTMLDocument]\"\n     *  - Firefox === \"[object HTMLDocument]\"\n     *  - Safari === \"[object HTMLDocument]\"\n     *  - IE <=10 === \"[object Document]\"\n     *  - IE 11 === \"[object HTMLDocument]\"\n     *  - IE Edge <=13 === \"[object HTMLDocument]\"\n     */\n    if (obj === globalObject.document) {\n      return 'Document';\n    }\n\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray)\n     * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray\n     * Test: `Object.prototype.toString.call(navigator.mimeTypes)``\n     *  - IE <=10 === \"[object MSMimeTypesCollection]\"\n     */\n    if (obj === (globalObject.navigator || {}).mimeTypes) {\n      return 'MimeTypeArray';\n    }\n\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)\n     * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray\n     * Test: `Object.prototype.toString.call(navigator.plugins)``\n     *  - IE <=10 === \"[object MSPluginsCollection]\"\n     */\n    if (obj === (globalObject.navigator || {}).plugins) {\n      return 'PluginArray';\n    }\n\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)\n     * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement`\n     * Test: `Object.prototype.toString.call(document.createElement('blockquote'))``\n     *  - IE <=10 === \"[object HTMLBlockElement]\"\n     */\n    if (obj instanceof HTMLElement && obj.tagName === 'BLOCKQUOTE') {\n      return 'HTMLQuoteElement';\n    }\n\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/#htmltabledatacellelement)\n     * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement`\n     * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n     *       (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)\n     *       which suggests that browsers should use HTMLTableCellElement for\n     *       both TD and TH elements. WhatWG separates these.\n     * Test: Object.prototype.toString.call(document.createElement('td'))\n     *  - Chrome === \"[object HTMLTableCellElement]\"\n     *  - Firefox === \"[object HTMLTableCellElement]\"\n     *  - Safari === \"[object HTMLTableCellElement]\"\n     */\n    if (obj instanceof HTMLElement && obj.tagName === 'TD') {\n      return 'HTMLTableDataCellElement';\n    }\n\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/#htmltableheadercellelement)\n     * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement`\n     * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n     *       (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)\n     *       which suggests that browsers should use HTMLTableCellElement for\n     *       both TD and TH elements. WhatWG separates these.\n     * Test: Object.prototype.toString.call(document.createElement('th'))\n     *  - Chrome === \"[object HTMLTableCellElement]\"\n     *  - Firefox === \"[object HTMLTableCellElement]\"\n     *  - Safari === \"[object HTMLTableCellElement]\"\n     */\n    if (obj instanceof HTMLElement && obj.tagName === 'TH') {\n      return 'HTMLTableHeaderCellElement';\n    }\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   Float64Array       x 625,644 ops/sec ±1.58% (80 runs sampled)\n  *   Float32Array       x 1,279,852 ops/sec ±2.91% (77 runs sampled)\n  *   Uint32Array        x 1,178,185 ops/sec ±1.95% (83 runs sampled)\n  *   Uint16Array        x 1,008,380 ops/sec ±2.25% (80 runs sampled)\n  *   Uint8Array         x 1,128,040 ops/sec ±2.11% (81 runs sampled)\n  *   Int32Array         x 1,170,119 ops/sec ±2.88% (80 runs sampled)\n  *   Int16Array         x 1,176,348 ops/sec ±5.79% (86 runs sampled)\n  *   Int8Array          x 1,058,707 ops/sec ±4.94% (77 runs sampled)\n  *   Uint8ClampedArray  x 1,110,633 ops/sec ±4.20% (80 runs sampled)\n  * Post:\n  *   Float64Array       x 7,105,671 ops/sec ±13.47% (64 runs sampled)\n  *   Float32Array       x 5,887,912 ops/sec ±1.46% (82 runs sampled)\n  *   Uint32Array        x 6,491,661 ops/sec ±1.76% (79 runs sampled)\n  *   Uint16Array        x 6,559,795 ops/sec ±1.67% (82 runs sampled)\n  *   Uint8Array         x 6,463,966 ops/sec ±1.43% (85 runs sampled)\n  *   Int32Array         x 5,641,841 ops/sec ±3.49% (81 runs sampled)\n  *   Int16Array         x 6,583,511 ops/sec ±1.98% (80 runs sampled)\n  *   Int8Array          x 6,606,078 ops/sec ±1.74% (81 runs sampled)\n  *   Uint8ClampedArray  x 6,602,224 ops/sec ±1.77% (83 runs sampled)\n  */\n  var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]);\n  if (typeof stringTag === 'string') {\n    return stringTag;\n  }\n\n  var objPrototype = Object.getPrototypeOf(obj);\n  /* ! Speed optimisation\n  * Pre:\n  *   regex literal      x 1,772,385 ops/sec ±1.85% (77 runs sampled)\n  *   regex constructor  x 2,143,634 ops/sec ±2.46% (78 runs sampled)\n  * Post:\n  *   regex literal      x 3,928,009 ops/sec ±0.65% (78 runs sampled)\n  *   regex constructor  x 3,931,108 ops/sec ±0.58% (84 runs sampled)\n  */\n  if (objPrototype === RegExp.prototype) {\n    return 'RegExp';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   date               x 2,130,074 ops/sec ±4.42% (68 runs sampled)\n  * Post:\n  *   date               x 3,953,779 ops/sec ±1.35% (77 runs sampled)\n  */\n  if (objPrototype === Date.prototype) {\n    return 'Date';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag)\n   * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be \"Promise\":\n   * Test: `Object.prototype.toString.call(Promise.resolve())``\n   *  - Chrome <=47 === \"[object Object]\"\n   *  - Edge <=20 === \"[object Object]\"\n   *  - Firefox 29-Latest === \"[object Promise]\"\n   *  - Safari 7.1-Latest === \"[object Promise]\"\n   */\n  if (promiseExists && objPrototype === Promise.prototype) {\n    return 'Promise';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   set                x 2,222,186 ops/sec ±1.31% (82 runs sampled)\n  * Post:\n  *   set                x 4,545,879 ops/sec ±1.13% (83 runs sampled)\n  */\n  if (setExists && objPrototype === Set.prototype) {\n    return 'Set';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   map                x 2,396,842 ops/sec ±1.59% (81 runs sampled)\n  * Post:\n  *   map                x 4,183,945 ops/sec ±6.59% (82 runs sampled)\n  */\n  if (mapExists && objPrototype === Map.prototype) {\n    return 'Map';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   weakset            x 1,323,220 ops/sec ±2.17% (76 runs sampled)\n  * Post:\n  *   weakset            x 4,237,510 ops/sec ±2.01% (77 runs sampled)\n  */\n  if (weakSetExists && objPrototype === WeakSet.prototype) {\n    return 'WeakSet';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   weakmap            x 1,500,260 ops/sec ±2.02% (78 runs sampled)\n  * Post:\n  *   weakmap            x 3,881,384 ops/sec ±1.45% (82 runs sampled)\n  */\n  if (weakMapExists && objPrototype === WeakMap.prototype) {\n    return 'WeakMap';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag)\n   * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be \"DataView\":\n   * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (dataViewExists && objPrototype === DataView.prototype) {\n    return 'DataView';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag)\n   * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be \"Map Iterator\":\n   * Test: `Object.prototype.toString.call(new Map().entries())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (mapExists && objPrototype === mapIteratorPrototype) {\n    return 'Map Iterator';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag)\n   * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be \"Set Iterator\":\n   * Test: `Object.prototype.toString.call(new Set().entries())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (setExists && objPrototype === setIteratorPrototype) {\n    return 'Set Iterator';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag)\n   * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be \"Array Iterator\":\n   * Test: `Object.prototype.toString.call([][Symbol.iterator]())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {\n    return 'Array Iterator';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag)\n   * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be \"String Iterator\":\n   * Test: `Object.prototype.toString.call(''[Symbol.iterator]())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (stringIteratorExists && objPrototype === stringIteratorPrototype) {\n    return 'String Iterator';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   object from null   x 2,424,320 ops/sec ±1.67% (76 runs sampled)\n  * Post:\n  *   object from null   x 5,838,000 ops/sec ±0.99% (84 runs sampled)\n  */\n  if (objPrototype === null) {\n    return 'Object';\n  }\n\n  return Object\n    .prototype\n    .toString\n    .call(obj)\n    .slice(toStringLeftSliceLength, toStringRightSliceLength);\n};\n\nmodule.exports.typeDetect = module.exports;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}]},{},[1])(1)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvc2lub24uanMiLCJsaWIvc2lub24vYXNzZXJ0LmpzIiwibGliL3Npbm9uL2JlaGF2aW9yLmpzIiwibGliL3Npbm9uL2Jsb2IuanMiLCJsaWIvc2lub24vY2FsbC5qcyIsImxpYi9zaW5vbi9jb2xsZWN0LW93bi1tZXRob2RzLmpzIiwibGliL3Npbm9uL2NvbGxlY3Rpb24uanMiLCJsaWIvc2lub24vY29sb3IuanMiLCJsaWIvc2lub24vZGVmYXVsdC1iZWhhdmlvcnMuanMiLCJsaWIvc2lub24vbWF0Y2guanMiLCJsaWIvc2lub24vbW9jay1leHBlY3RhdGlvbi5qcyIsImxpYi9zaW5vbi9tb2NrLmpzIiwibGliL3Npbm9uL3NhbmRib3gtc3R1Yi5qcyIsImxpYi9zaW5vbi9zYW5kYm94LmpzIiwibGliL3Npbm9uL3NweS1mb3JtYXR0ZXJzLmpzIiwibGliL3Npbm9uL3NweS5qcyIsImxpYi9zaW5vbi9zdHViLWRlc2NyaXB0b3IuanMiLCJsaWIvc2lub24vc3R1Yi1lbnRpcmUtb2JqZWN0LmpzIiwibGliL3Npbm9uL3N0dWItbm9uLWZ1bmN0aW9uLXByb3BlcnR5LmpzIiwibGliL3Npbm9uL3N0dWIuanMiLCJsaWIvc2lub24vdGhyb3ctb24tZmFsc3ktb2JqZWN0LmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9jYWxsZWQtaW4tb3JkZXIuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2RlZXAtZXF1YWwuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2RlZmF1bHQtY29uZmlnLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9kZXByZWNhdGVkLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9ldmVyeS5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZXh0ZW5kLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9mb3JtYXQuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2Z1bmN0aW9uLW5hbWUuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2Z1bmN0aW9uLXRvLXN0cmluZy5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZ2V0LWNvbmZpZy5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2luZGV4LmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9pdGVyYWJsZS10by1zdHJpbmcuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2xvZ19lcnJvci5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvb3JkZXItYnktZmlyc3QtY2FsbC5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvcmVzdG9yZS5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvdGltZXMtaW4td29yZHMuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL3R5cGVPZi5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvdmFsdWUtdG8tc3RyaW5nLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS93YWxrLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS93cmFwLW1ldGhvZC5qcyIsImxpYi9zaW5vbi91dGlsL2V2ZW50LmpzIiwibGliL3Npbm9uL3V0aWwvZmFrZV9zZXJ2ZXIuanMiLCJsaWIvc2lub24vdXRpbC9mYWtlX3NlcnZlcl93aXRoX2Nsb2NrLmpzIiwibGliL3Npbm9uL3V0aWwvZmFrZV90aW1lcnMuanMiLCJsaWIvc2lub24vdXRpbC9mYWtlX3htbF9odHRwX3JlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvc3JjL2NvbnZlcnQveG1sLmpzIiwibm9kZV9tb2R1bGVzL2Zvcm1hdGlvL2xpYi9mb3JtYXRpby5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvbGV4L3NyYy9sb2xleC1zcmMuanMiLCJub2RlX21vZHVsZXMvcGF0aC10by1yZWdleHAvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3NhbXNhbS9saWIvc2Ftc2FtLmpzIiwibm9kZV9tb2R1bGVzL3RleHQtZW5jb2RpbmcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdGV4dC1lbmNvZGluZy9saWIvZW5jb2RpbmctaW5kZXhlcy5qcyIsIm5vZGVfbW9kdWxlcy90ZXh0LWVuY29kaW5nL2xpYi9lbmNvZGluZy5qcyIsIm5vZGVfbW9kdWxlcy90eXBlLWRldGVjdC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMzTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3ZJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O2dDQ3JvQmdCLG1CLEdBQUEsbUI7QUFBVCxTQUFTLG1CQUFULENBQTZCLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUksTUFBTSxFQUFWO0FBQ0EsT0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFFBQVEsTUFBNUIsRUFBb0MsR0FBcEMsRUFBeUM7QUFDdkMsUUFBSSxTQUFTLFFBQVEsQ0FBUixDQUFiO0FBQ0EsUUFBSSxPQUFPLEtBQVgsRUFBa0I7QUFDaEIsVUFBSSxJQUFKLENBQVMsT0FBVDtBQUNELEtBRkQsTUFFTyxJQUFJLE9BQU8sT0FBWCxFQUFvQjtBQUN6QixVQUFJLElBQUosQ0FBUyxPQUFUO0FBQ0Q7O0FBRUQsUUFBSSxJQUFKLENBQVMsV0FBVyxPQUFPLEtBQWxCLENBQVQ7O0FBRUEsUUFBSSxPQUFPLEtBQVgsRUFBa0I7QUFDaEIsVUFBSSxJQUFKLENBQVMsUUFBVDtBQUNELEtBRkQsTUFFTyxJQUFJLE9BQU8sT0FBWCxFQUFvQjtBQUN6QixVQUFJLElBQUosQ0FBUyxRQUFUO0FBQ0Q7QUFDRjtBQUNELFNBQU8sSUFBSSxJQUFKLENBQVMsRUFBVCxDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxVQUFULENBQW9CLENBQXBCLEVBQXVCO0FBQ3JCLE1BQUksSUFBSSxDQUFSO0FBQ0EsTUFBSSxFQUFFLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE9BQWhCLENBQUo7QUFDQSxNQUFJLEVBQUUsT0FBRixDQUFVLElBQVYsRUFBZ0IsTUFBaEIsQ0FBSjtBQUNBLE1BQUksRUFBRSxPQUFGLENBQVUsSUFBVixFQUFnQixNQUFoQixDQUFKO0FBQ0EsTUFBSSxFQUFFLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLFFBQWhCLENBQUo7O0FBRUEsU0FBTyxDQUFQO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyT0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2h2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1hdGNoID0gcmVxdWlyZShcIi4vc2lub24vbWF0Y2hcIik7XG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZShcIi4vc2lub24vdXRpbC9jb3JlL2RlZXAtZXF1YWxcIik7XG52YXIgZGVwcmVjYXRlZCA9IHJlcXVpcmUoXCIuL3Npbm9uL3V0aWwvY29yZS9kZXByZWNhdGVkXCIpO1xuXG5mdW5jdGlvbiBleHBvc2VDb3JlVXRpbHModGFyZ2V0LCB1dGlscykge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModXRpbHMpO1xuXG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdXRpbHNba2V5XTtcblxuICAgICAgICAvLyBhbGxvdyBkZWVwRXF1YWwgdG8gY2hlY2sgZXF1YWxpdHkgb2YgbWF0Y2hlcnMgdGhyb3VnaCBkZXBlbmRlbmN5IGluamVjdGlvbi4gT3RoZXJ3aXNlIHdlIGdldCBhIGNpcmN1bGFyXG4gICAgICAgIC8vIGRlcGVuZGVuY3lcbiAgICAgICAgaWYgKGtleSA9PT0gXCJkZWVwRXF1YWxcIikge1xuICAgICAgICAgICAgdmFsdWUgPSBkZWVwRXF1YWwudXNlKG1hdGNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZGVwcmVjYXRlZC53cmFwKHZhbHVlLCBkZXByZWNhdGVkLmRlZmF1bHRNc2coa2V5KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZXhwb3NlRXZlbnRUYXJnZXQodGFyZ2V0LCBldmVudFRhcmdldCkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRUYXJnZXQpO1xuXG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBkZXByZWNhdGVkLndyYXAoZXZlbnRUYXJnZXRba2V5XSwgZGVwcmVjYXRlZC5kZWZhdWx0TXNnKFwiRXZlbnRUYXJnZXRcIikpO1xuICAgIH0pO1xufVxuXG4vLyBFeHBvc2UgaW50ZXJuYWwgdXRpbGl0aWVzIG9uIGBzaW5vbmAgZ2xvYmFsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbmV4cG9zZUNvcmVVdGlscyhleHBvcnRzLCByZXF1aXJlKFwiLi9zaW5vbi91dGlsL2NvcmUvaW5kZXhcIikpO1xuXG5leHBvcnRzLmFzc2VydCA9IHJlcXVpcmUoXCIuL3Npbm9uL2Fzc2VydFwiKTtcbmV4cG9ydHMuY29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuL3Npbm9uL2NvbGxlY3Rpb25cIik7XG5leHBvcnRzLm1hdGNoID0gbWF0Y2g7XG5leHBvcnRzLnNweSA9IHJlcXVpcmUoXCIuL3Npbm9uL3NweVwiKTtcbmV4cG9ydHMuc3B5Q2FsbCA9IHJlcXVpcmUoXCIuL3Npbm9uL2NhbGxcIik7XG5leHBvcnRzLnN0dWIgPSByZXF1aXJlKFwiLi9zaW5vbi9zdHViXCIpO1xuZXhwb3J0cy5tb2NrID0gcmVxdWlyZShcIi4vc2lub24vbW9ja1wiKTtcbmV4cG9ydHMuc2FuZGJveCA9IHJlcXVpcmUoXCIuL3Npbm9uL3NhbmRib3hcIik7XG5leHBvcnRzLmV4cGVjdGF0aW9uID0gcmVxdWlyZShcIi4vc2lub24vbW9jay1leHBlY3RhdGlvblwiKTtcbmV4cG9ydHMuY3JlYXRlU3R1Ykluc3RhbmNlID0gcmVxdWlyZShcIi4vc2lub24vc3R1YlwiKS5jcmVhdGVTdHViSW5zdGFuY2U7XG5cbnZhciBmYWtlVGltZXJzID0gcmVxdWlyZShcIi4vc2lub24vdXRpbC9mYWtlX3RpbWVyc1wiKTtcbmV4cG9ydHMudXNlRmFrZVRpbWVycyA9IGZha2VUaW1lcnMudXNlRmFrZVRpbWVycztcbmV4cG9ydHMuY2xvY2sgPSBmYWtlVGltZXJzLmNsb2NrO1xuZXhwb3J0cy50aW1lcnMgPSBmYWtlVGltZXJzLnRpbWVycztcblxudmFyIGV2ZW50ID0gcmVxdWlyZShcIi4vc2lub24vdXRpbC9ldmVudFwiKTtcbmV4cG9ydHMuRXZlbnQgPSBkZXByZWNhdGVkLndyYXAoZXZlbnQuRXZlbnQsIGRlcHJlY2F0ZWQuZGVmYXVsdE1zZyhcIkV2ZW50XCIpKTtcbmV4cG9ydHMuQ3VzdG9tRXZlbnQgPSBkZXByZWNhdGVkLndyYXAoZXZlbnQuQ3VzdG9tRXZlbnQsIGRlcHJlY2F0ZWQuZGVmYXVsdE1zZyhcIkN1c3RvbUV2ZW50XCIpKTtcbmV4cG9ydHMuUHJvZ3Jlc3NFdmVudCA9IGRlcHJlY2F0ZWQud3JhcChldmVudC5Qcm9ncmVzc0V2ZW50LCBkZXByZWNhdGVkLmRlZmF1bHRNc2coXCJQcm9ncmVzc0V2ZW50XCIpKTtcbmV4cG9ydHMuRXZlbnRUYXJnZXQgPSB7fTtcbmV4cG9zZUV2ZW50VGFyZ2V0KGV4cG9ydHMuRXZlbnRUYXJnZXQsIGV2ZW50LkV2ZW50VGFyZ2V0KTtcblxudmFyIGZha2VYaHIgPSByZXF1aXJlKFwiLi9zaW5vbi91dGlsL2Zha2VfeG1sX2h0dHBfcmVxdWVzdFwiKTtcbmV4cG9ydHMueGhyID0gZmFrZVhoci54aHI7XG5leHBvcnRzLkZha2VYTUxIdHRwUmVxdWVzdCA9IGZha2VYaHIuRmFrZVhNTEh0dHBSZXF1ZXN0O1xuZXhwb3J0cy51c2VGYWtlWE1MSHR0cFJlcXVlc3QgPSBmYWtlWGhyLnVzZUZha2VYTUxIdHRwUmVxdWVzdDtcblxuZXhwb3J0cy5mYWtlU2VydmVyID0gcmVxdWlyZShcIi4vc2lub24vdXRpbC9mYWtlX3NlcnZlclwiKTtcbmV4cG9ydHMuZmFrZVNlcnZlcldpdGhDbG9jayA9IHJlcXVpcmUoXCIuL3Npbm9uL3V0aWwvZmFrZV9zZXJ2ZXJfd2l0aF9jbG9ja1wiKTtcblxudmFyIGJlaGF2aW9yID0gcmVxdWlyZShcIi4vc2lub24vYmVoYXZpb3JcIik7XG5cbmV4cG9ydHMuYWRkQmVoYXZpb3IgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgICBiZWhhdmlvci5hZGRCZWhhdmlvcihleHBvcnRzLnN0dWIsIG5hbWUsIGZuKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNhbGxlZEluT3JkZXIgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvY2FsbGVkLWluLW9yZGVyXCIpO1xudmFyIG9yZGVyQnlGaXJzdENhbGwgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvb3JkZXItYnktZmlyc3QtY2FsbFwiKTtcbnZhciB0aW1lc0luV29yZHMgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdGltZXMtaW4td29yZHNcIik7XG52YXIgZm9ybWF0ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2Zvcm1hdFwiKTtcbnZhciBzaW5vbk1hdGNoID0gcmVxdWlyZShcIi4vbWF0Y2hcIik7XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIGFzc2VydDtcblxuZnVuY3Rpb24gdmVyaWZ5SXNTdHViKCkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcImZha2UgaXMgbm90IGEgc3B5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC5wcm94eSAmJiBtZXRob2QucHJveHkuaXNTaW5vblByb3h5KSB7XG4gICAgICAgICAgICB2ZXJpZnlJc1N0dWIobWV0aG9kLnByb3h5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbChtZXRob2QgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QuZ2V0Q2FsbCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwobWV0aG9kICsgXCIgaXMgbm90IHN0dWJiZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SXNWYWxpZEFzc2VydGlvbihhc3NlcnRpb25NZXRob2QsIGFzc2VydGlvbkFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFzc2VydGlvbk1ldGhvZCkge1xuICAgICAgICBjYXNlIFwibm90Q2FsbGVkXCI6XG4gICAgICAgIGNhc2UgXCJjYWxsZWRcIjpcbiAgICAgICAgY2FzZSBcImNhbGxlZE9uY2VcIjpcbiAgICAgICAgY2FzZSBcImNhbGxlZFR3aWNlXCI6XG4gICAgICAgIGNhc2UgXCJjYWxsZWRUaHJpY2VcIjpcbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25BcmdzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKGFzc2VydGlvbk1ldGhvZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgdGFrZXMgMSBhcmd1bWVudCBidXQgd2FzIGNhbGxlZCB3aXRoIFwiICsgKGFzc2VydGlvbkFyZ3MubGVuZ3RoICsgMSkgKyBcIiBhcmd1bWVudHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZmFpbEFzc2VydGlvbihvYmplY3QsIG1zZykge1xuICAgIG9iamVjdCA9IG9iamVjdCB8fCBnbG9iYWw7XG4gICAgdmFyIGZhaWxNZXRob2QgPSBvYmplY3QuZmFpbCB8fCBhc3NlcnQuZmFpbDtcbiAgICBmYWlsTWV0aG9kLmNhbGwob2JqZWN0LCBtc2cpO1xufVxuXG5mdW5jdGlvbiBtaXJyb3JQcm9wQXNBc3NlcnRpb24obmFtZSwgbWV0aG9kLCBtZXNzYWdlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1ldGhvZDtcbiAgICAgICAgbWV0aG9kID0gbmFtZTtcbiAgICB9XG5cbiAgICBhc3NlcnRbbmFtZV0gPSBmdW5jdGlvbiAoZmFrZSkge1xuICAgICAgICB2ZXJpZnlJc1N0dWIoZmFrZSk7XG5cbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHZhciBmYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICB2ZXJpZnlJc1ZhbGlkQXNzZXJ0aW9uKG5hbWUsIGFyZ3MpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGZhaWxlZCA9ICFtZXRob2QoZmFrZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmYWlsZWQgPSB0eXBlb2YgZmFrZVttZXRob2RdID09PSBcImZ1bmN0aW9uXCIgP1xuICAgICAgICAgICAgICAgICFmYWtlW21ldGhvZF0uYXBwbHkoZmFrZSwgYXJncykgOiAhZmFrZVttZXRob2RdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgZmFpbEFzc2VydGlvbih0aGlzLCAoZmFrZS5wcmludGYgfHwgZmFrZS5wcm94eS5wcmludGYpLmFwcGx5KGZha2UsIFttZXNzYWdlXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydC5wYXNzKG5hbWUpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZXhwb3NlZE5hbWUocHJlZml4LCBwcm9wKSB7XG4gICAgcmV0dXJuICFwcmVmaXggfHwgL15mYWlsLy50ZXN0KHByb3ApID8gcHJvcCA6XG4gICAgICAgIHByZWZpeCArIHByb3Auc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKSArIHByb3Auc2xpY2UoMSk7XG59XG5cbmFzc2VydCA9IHtcbiAgICBmYWlsRXhjZXB0aW9uOiBcIkFzc2VydEVycm9yXCIsXG5cbiAgICBmYWlsOiBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5uYW1lID0gdGhpcy5mYWlsRXhjZXB0aW9uIHx8IGFzc2VydC5mYWlsRXhjZXB0aW9uO1xuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH0sXG5cbiAgICBwYXNzOiBmdW5jdGlvbiBwYXNzKCkge30sXG5cbiAgICBjYWxsT3JkZXI6IGZ1bmN0aW9uIGFzc2VydENhbGxPcmRlcigpIHtcbiAgICAgICAgdmVyaWZ5SXNTdHViLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIHZhciBleHBlY3RlZCA9IFwiXCI7XG4gICAgICAgIHZhciBhY3R1YWwgPSBcIlwiO1xuXG4gICAgICAgIGlmICghY2FsbGVkSW5PcmRlcihhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gW10uam9pbi5jYWxsKGFyZ3VtZW50cywgXCIsIFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBjYWxscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsc1stLWldLmNhbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFjdHVhbCA9IG9yZGVyQnlGaXJzdENhbGwoY2FsbHMpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCB3ZSdsbCBqdXN0IGZhbGwgYmFjayB0byB0aGUgYmxhbmsgc3RyaW5nXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZhaWxBc3NlcnRpb24odGhpcywgXCJleHBlY3RlZCBcIiArIGV4cGVjdGVkICsgXCIgdG8gYmUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYWxsZWQgaW4gb3JkZXIgYnV0IHdlcmUgY2FsbGVkIGFzIFwiICsgYWN0dWFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydC5wYXNzKFwiY2FsbE9yZGVyXCIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNhbGxDb3VudDogZnVuY3Rpb24gYXNzZXJ0Q2FsbENvdW50KG1ldGhvZCwgY291bnQpIHtcbiAgICAgICAgdmVyaWZ5SXNTdHViKG1ldGhvZCk7XG5cbiAgICAgICAgaWYgKG1ldGhvZC5jYWxsQ291bnQgIT09IGNvdW50KSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgXCIgKyB0aW1lc0luV29yZHMoY291bnQpICtcbiAgICAgICAgICAgICAgICBcIiBidXQgd2FzIGNhbGxlZCAlYyVDXCI7XG4gICAgICAgICAgICBmYWlsQXNzZXJ0aW9uKHRoaXMsIG1ldGhvZC5wcmludGYobXNnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQucGFzcyhcImNhbGxDb3VudFwiKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBleHBvc2U6IGZ1bmN0aW9uIGV4cG9zZSh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ0YXJnZXQgaXMgbnVsbCBvciB1bmRlZmluZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHZhciBwcmVmaXggPSB0eXBlb2Ygby5wcmVmaXggPT09IFwidW5kZWZpbmVkXCIgJiYgXCJhc3NlcnRcIiB8fCBvLnByZWZpeDtcbiAgICAgICAgdmFyIGluY2x1ZGVGYWlsID0gdHlwZW9mIG8uaW5jbHVkZUZhaWwgPT09IFwidW5kZWZpbmVkXCIgfHwgISFvLmluY2x1ZGVGYWlsO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGluc3RhbmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgICAgIGlmIChtZXRob2QgIT09IFwiZXhwb3NlXCIgJiYgKGluY2x1ZGVGYWlsIHx8ICEvXihmYWlsKS8udGVzdChtZXRob2QpKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtleHBvc2VkTmFtZShwcmVmaXgsIG1ldGhvZCldID0gaW5zdGFuY2VbbWV0aG9kXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9LFxuXG4gICAgbWF0Y2g6IGZ1bmN0aW9uIG1hdGNoKGFjdHVhbCwgZXhwZWN0YXRpb24pIHtcbiAgICAgICAgdmFyIG1hdGNoZXIgPSBzaW5vbk1hdGNoKGV4cGVjdGF0aW9uKTtcbiAgICAgICAgaWYgKG1hdGNoZXIudGVzdChhY3R1YWwpKSB7XG4gICAgICAgICAgICBhc3NlcnQucGFzcyhcIm1hdGNoXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGZvcm1hdHRlZCA9IFtcbiAgICAgICAgICAgICAgICBcImV4cGVjdGVkIHZhbHVlIHRvIG1hdGNoXCIsXG4gICAgICAgICAgICAgICAgXCIgICAgZXhwZWN0ZWQgPSBcIiArIGZvcm1hdChleHBlY3RhdGlvbiksXG4gICAgICAgICAgICAgICAgXCIgICAgYWN0dWFsID0gXCIgKyBmb3JtYXQoYWN0dWFsKVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgZmFpbEFzc2VydGlvbih0aGlzLCBmb3JtYXR0ZWQuam9pbihcIlxcblwiKSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRcIiwgXCJleHBlY3RlZCAlbiB0byBoYXZlIGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2UgYnV0IHdhcyBuZXZlciBjYWxsZWRcIik7XG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJub3RDYWxsZWRcIiwgZnVuY3Rpb24gKHNweSkge1xuICAgIHJldHVybiAhc3B5LmNhbGxlZDtcbn0sIFwiZXhwZWN0ZWQgJW4gdG8gbm90IGhhdmUgYmVlbiBjYWxsZWQgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZE9uY2VcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgb25jZSBidXQgd2FzIGNhbGxlZCAlYyVDXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkVHdpY2VcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgdHdpY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFRocmljZVwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB0aHJpY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZE9uXCIsIFwiZXhwZWN0ZWQgJW4gdG8gYmUgY2FsbGVkIHdpdGggJTEgYXMgdGhpcyBidXQgd2FzIGNhbGxlZCB3aXRoICV0XCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFxuICAgIFwiYWx3YXlzQ2FsbGVkT25cIixcbiAgICBcImV4cGVjdGVkICVuIHRvIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCAlMSBhcyB0aGlzIGJ1dCB3YXMgY2FsbGVkIHdpdGggJXRcIlxuKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFdpdGhOZXdcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgd2l0aCBuZXdcIik7XG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJhbHdheXNDYWxsZWRXaXRoTmV3XCIsIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG5ld1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFdpdGhcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgJURcIik7XG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRXaXRoTWF0Y2hcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgd2l0aCBtYXRjaCAlRFwiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c0NhbGxlZFdpdGhcIiwgXCJleHBlY3RlZCAlbiB0byBhbHdheXMgYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzICVEXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiYWx3YXlzQ2FsbGVkV2l0aE1hdGNoXCIsIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG1hdGNoICVEXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkV2l0aEV4YWN0bHlcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgd2l0aCBleGFjdCBhcmd1bWVudHMgJURcIik7XG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJhbHdheXNDYWxsZWRXaXRoRXhhY3RseVwiLCBcImV4cGVjdGVkICVuIHRvIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCBleGFjdCBhcmd1bWVudHMgJURcIik7XG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJuZXZlckNhbGxlZFdpdGhcIiwgXCJleHBlY3RlZCAlbiB0byBuZXZlciBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgJSolQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcIm5ldmVyQ2FsbGVkV2l0aE1hdGNoXCIsIFwiZXhwZWN0ZWQgJW4gdG8gbmV2ZXIgYmUgY2FsbGVkIHdpdGggbWF0Y2ggJSolQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcInRocmV3XCIsIFwiJW4gZGlkIG5vdCB0aHJvdyBleGNlcHRpb24lQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c1RocmV3XCIsIFwiJW4gZGlkIG5vdCBhbHdheXMgdGhyb3cgZXhjZXB0aW9uJUNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZXh0ZW5kXCIpO1xudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mdW5jdGlvbi1uYW1lXCIpO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdmFsdWUtdG8tc3RyaW5nXCIpO1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgam9pbiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xudmFyIHVzZUxlZnRNb3N0Q2FsbGJhY2sgPSAtMTtcbnZhciB1c2VSaWdodE1vc3RDYWxsYmFjayA9IC0yO1xuXG52YXIgbmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICAgIH07XG59KSgpO1xuXG5mdW5jdGlvbiBnZXRDYWxsYmFjayhiZWhhdmlvciwgYXJncykge1xuICAgIHZhciBjYWxsQXJnQXQgPSBiZWhhdmlvci5jYWxsQXJnQXQ7XG5cbiAgICBpZiAoY2FsbEFyZ0F0ID49IDApIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbY2FsbEFyZ0F0XTtcbiAgICB9XG5cbiAgICB2YXIgYXJndW1lbnRMaXN0O1xuXG4gICAgaWYgKGNhbGxBcmdBdCA9PT0gdXNlTGVmdE1vc3RDYWxsYmFjaykge1xuICAgICAgICBhcmd1bWVudExpc3QgPSBhcmdzO1xuICAgIH1cblxuICAgIGlmIChjYWxsQXJnQXQgPT09IHVzZVJpZ2h0TW9zdENhbGxiYWNrKSB7XG4gICAgICAgIGFyZ3VtZW50TGlzdCA9IHNsaWNlLmNhbGwoYXJncykucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHZhciBjYWxsQXJnUHJvcCA9IGJlaGF2aW9yLmNhbGxBcmdQcm9wO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudExpc3QubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmICghY2FsbEFyZ1Byb3AgJiYgdHlwZW9mIGFyZ3VtZW50TGlzdFtpXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRMaXN0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxBcmdQcm9wICYmIGFyZ3VtZW50TGlzdFtpXSAmJlxuICAgICAgICAgICAgdHlwZW9mIGFyZ3VtZW50TGlzdFtpXVtjYWxsQXJnUHJvcF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50TGlzdFtpXVtjYWxsQXJnUHJvcF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tFcnJvcihiZWhhdmlvciwgZnVuYywgYXJncykge1xuICAgIGlmIChiZWhhdmlvci5jYWxsQXJnQXQgPCAwKSB7XG4gICAgICAgIHZhciBtc2c7XG5cbiAgICAgICAgaWYgKGJlaGF2aW9yLmNhbGxBcmdQcm9wKSB7XG4gICAgICAgICAgICBtc2cgPSBmdW5jdGlvbk5hbWUoYmVoYXZpb3Iuc3R1YikgK1xuICAgICAgICAgICAgICAgIFwiIGV4cGVjdGVkIHRvIHlpZWxkIHRvICdcIiArIHZhbHVlVG9TdHJpbmcoYmVoYXZpb3IuY2FsbEFyZ1Byb3ApICtcbiAgICAgICAgICAgICAgICBcIicsIGJ1dCBubyBvYmplY3Qgd2l0aCBzdWNoIGEgcHJvcGVydHkgd2FzIHBhc3NlZC5cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1zZyA9IGZ1bmN0aW9uTmFtZShiZWhhdmlvci5zdHViKSArXG4gICAgICAgICAgICAgICAgXCIgZXhwZWN0ZWQgdG8geWllbGQsIGJ1dCBubyBjYWxsYmFjayB3YXMgcGFzc2VkLlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbXNnICs9IFwiIFJlY2VpdmVkIFtcIiArIGpvaW4uY2FsbChhcmdzLCBcIiwgXCIpICsgXCJdXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbXNnO1xuICAgIH1cblxuICAgIHJldHVybiBcImFyZ3VtZW50IGF0IGluZGV4IFwiICsgYmVoYXZpb3IuY2FsbEFyZ0F0ICsgXCIgaXMgbm90IGEgZnVuY3Rpb246IFwiICsgZnVuYztcbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGJlaGF2aW9yLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBiZWhhdmlvci5jYWxsQXJnQXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXRDYWxsYmFjayhiZWhhdmlvciwgYXJncyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZ2V0Q2FsbGJhY2tFcnJvcihiZWhhdmlvciwgZnVuYywgYXJncykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlaGF2aW9yLmNhbGxiYWNrQXN5bmMpIHtcbiAgICAgICAgICAgIG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGJlaGF2aW9yLmNhbGxiYWNrQ29udGV4dCwgYmVoYXZpb3IuY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmdW5jLmFwcGx5KGJlaGF2aW9yLmNhbGxiYWNrQ29udGV4dCwgYmVoYXZpb3IuY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgcHJvdG8gPSB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoc3R1Yikge1xuICAgICAgICB2YXIgYmVoYXZpb3IgPSBleHRlbmQoe30sIHByb3RvKTtcbiAgICAgICAgZGVsZXRlIGJlaGF2aW9yLmNyZWF0ZTtcbiAgICAgICAgZGVsZXRlIGJlaGF2aW9yLmFkZEJlaGF2aW9yO1xuICAgICAgICBkZWxldGUgYmVoYXZpb3IuY3JlYXRlQmVoYXZpb3I7XG4gICAgICAgIGJlaGF2aW9yLnN0dWIgPSBzdHViO1xuXG4gICAgICAgIGlmIChzdHViLmRlZmF1bHRCZWhhdmlvciAmJiBzdHViLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeSkge1xuICAgICAgICAgICAgYmVoYXZpb3IucHJvbWlzZUxpYnJhcnkgPSBzdHViLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiZWhhdmlvcjtcbiAgICB9LFxuXG4gICAgaXNQcmVzZW50OiBmdW5jdGlvbiBpc1ByZXNlbnQoKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRoaXMuY2FsbEFyZ0F0ID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5yZXR1cm5BcmdBdCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVGhpcyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnRocm93QXJnQXQgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmZha2VGbiB8fFxuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWVEZWZpbmVkKTtcbiAgICB9LFxuXG4gICAgaW52b2tlOiBmdW5jdGlvbiBpbnZva2UoY29udGV4dCwgYXJncykge1xuICAgICAgICBjYWxsQ2FsbGJhY2sodGhpcywgYXJncyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLmV4Y2VwdGlvbjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZXR1cm5BcmdBdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3NbdGhpcy5yZXR1cm5BcmdBdF07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXR1cm5UaGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy50aHJvd0FyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCB0aGlzLnRocm93QXJnQXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcInRocm93QXJncyBmYWlsZWQ6IFwiICsgdGhpcy50aHJvd0FyZ0F0XG4gICAgICAgICAgICAgICAgICAgICsgXCIgYXJndW1lbnRzIHJlcXVpcmVkIGJ1dCBvbmx5IFwiICsgYXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKyBcIiBwcmVzZW50XCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgYXJnc1t0aGlzLnRocm93QXJnQXRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmFrZUZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWtlRm4uYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNvbHZlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMucHJvbWlzZUxpYnJhcnkgfHwgUHJvbWlzZSkucmVzb2x2ZSh0aGlzLnJldHVyblZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnByb21pc2VMaWJyYXJ5IHx8IFByb21pc2UpLnJlamVjdCh0aGlzLnJldHVyblZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbGxzVGhyb3VnaCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi53cmFwcGVkTWV0aG9kLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJldHVyblZhbHVlO1xuICAgIH0sXG5cbiAgICBvbkNhbGw6IGZ1bmN0aW9uIG9uQ2FsbChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHViLm9uQ2FsbChpbmRleCk7XG4gICAgfSxcblxuICAgIG9uRmlyc3RDYWxsOiBmdW5jdGlvbiBvbkZpcnN0Q2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vbkZpcnN0Q2FsbCgpO1xuICAgIH0sXG5cbiAgICBvblNlY29uZENhbGw6IGZ1bmN0aW9uIG9uU2Vjb25kQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vblNlY29uZENhbGwoKTtcbiAgICB9LFxuXG4gICAgb25UaGlyZENhbGw6IGZ1bmN0aW9uIG9uVGhpcmRDYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHViLm9uVGhpcmRDYWxsKCk7XG4gICAgfSxcblxuICAgIHdpdGhBcmdzOiBmdW5jdGlvbiB3aXRoQXJncygvKiBhcmd1bWVudHMgKi8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJEZWZpbmluZyBhIHN0dWIgYnkgaW52b2tpbmcgXFxcInN0dWIub25DYWxsKC4uLikud2l0aEFyZ3MoLi4uKVxcXCIgXCIgK1xuICAgICAgICAgICAgXCJpcyBub3Qgc3VwcG9ydGVkLiBVc2UgXFxcInN0dWIud2l0aEFyZ3MoLi4uKS5vbkNhbGwoLi4uKVxcXCIgXCIgK1xuICAgICAgICAgICAgXCJ0byBkZWZpbmUgc2VxdWVudGlhbCBiZWhhdmlvciBmb3IgY2FsbHMgd2l0aCBjZXJ0YWluIGFyZ3VtZW50cy5cIlxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUFzeW5jVmVyc2lvbihzeW5jRm5OYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXNbc3luY0ZuTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuXG4vLyBjcmVhdGUgYXN5bmNocm9ub3VzIHZlcnNpb25zIG9mIGNhbGxzQXJnKiBhbmQgeWllbGRzKiBtZXRob2RzXG5PYmplY3Qua2V5cyhwcm90bykuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgLy8gbmVlZCB0byBhdm9pZCBjcmVhdGluZyBhbm90aGVyYXN5bmMgdmVyc2lvbnMgb2YgdGhlIG5ld2x5IGFkZGVkIGFzeW5jIG1ldGhvZHNcbiAgICBpZiAobWV0aG9kLm1hdGNoKC9eKGNhbGxzQXJnfHlpZWxkcykvKSAmJiAhbWV0aG9kLm1hdGNoKC9Bc3luYy8pKSB7XG4gICAgICAgIHByb3RvW21ldGhvZCArIFwiQXN5bmNcIl0gPSBjcmVhdGVBc3luY1ZlcnNpb24obWV0aG9kKTtcbiAgICB9XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlQmVoYXZpb3IoYmVoYXZpb3JNZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvciA9IHRoaXMuZGVmYXVsdEJlaGF2aW9yIHx8IHByb3RvLmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QmVoYXZpb3JbYmVoYXZpb3JNZXRob2RdLmFwcGx5KHRoaXMuZGVmYXVsdEJlaGF2aW9yLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRCZWhhdmlvcihzdHViLCBuYW1lLCBmbikge1xuICAgIHByb3RvW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmbi5hcHBseSh0aGlzLCBbdGhpc10uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdHViIHx8IHRoaXM7XG4gICAgfTtcblxuICAgIHN0dWJbbmFtZV0gPSBjcmVhdGVCZWhhdmlvcihuYW1lKTtcbn1cblxucHJvdG8uYWRkQmVoYXZpb3IgPSBhZGRCZWhhdmlvcjtcbnByb3RvLmNyZWF0ZUJlaGF2aW9yID0gY3JlYXRlQmVoYXZpb3I7XG5tb2R1bGUuZXhwb3J0cyA9IHByb3RvO1xuIiwiLypnbG9iYWwgQmxvYiAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuaXNTdXBwb3J0ZWQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAhIW5ldyBCbG9iKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSgpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc2lub25NYXRjaCA9IHJlcXVpcmUoXCIuL21hdGNoXCIpO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9kZWVwLWVxdWFsXCIpLnVzZShzaW5vbk1hdGNoKTtcbnZhciBmdW5jdGlvbk5hbWUgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZnVuY3Rpb24tbmFtZVwiKTtcbnZhciBzaW5vbkZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS92YWx1ZS10by1zdHJpbmdcIik7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbmZ1bmN0aW9uIHRocm93WWllbGRFcnJvcihwcm94eSwgdGV4dCwgYXJncykge1xuICAgIHZhciBtc2cgPSBmdW5jdGlvbk5hbWUocHJveHkpICsgdGV4dDtcbiAgICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgbXNnICs9IFwiIFJlY2VpdmVkIFtcIiArIHNsaWNlLmNhbGwoYXJncykuam9pbihcIiwgXCIpICsgXCJdXCI7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG52YXIgY2FsbFByb3RvID0ge1xuICAgIGNhbGxlZE9uOiBmdW5jdGlvbiBjYWxsZWRPbih0aGlzVmFsdWUpIHtcbiAgICAgICAgaWYgKHNpbm9uTWF0Y2ggJiYgc2lub25NYXRjaC5pc01hdGNoZXIodGhpc1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNWYWx1ZS50ZXN0KHRoaXMudGhpc1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50aGlzVmFsdWUgPT09IHRoaXNWYWx1ZTtcbiAgICB9LFxuXG4gICAgY2FsbGVkV2l0aDogZnVuY3Rpb24gY2FsbGVkV2l0aCgpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgY2FsbGVkV2l0aEFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYgKGNhbGxlZFdpdGhBcmdzLmxlbmd0aCA+IHNlbGYuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxsZWRXaXRoQXJncy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGFyZywgaSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXYgJiYgZGVlcEVxdWFsKGFyZywgc2VsZi5hcmdzW2ldKTtcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgfSxcblxuICAgIGNhbGxlZFdpdGhNYXRjaDogZnVuY3Rpb24gY2FsbGVkV2l0aE1hdGNoKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBjYWxsZWRXaXRoTWF0Y2hBcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChjYWxsZWRXaXRoTWF0Y2hBcmdzLmxlbmd0aCA+IHNlbGYuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxsZWRXaXRoTWF0Y2hBcmdzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgZXhwZWN0YXRpb24sIGkpIHtcbiAgICAgICAgICAgIHZhciBhY3R1YWwgPSBzZWxmLmFyZ3NbaV07XG5cbiAgICAgICAgICAgIHJldHVybiBwcmV2ICYmIChzaW5vbk1hdGNoICYmIHNpbm9uTWF0Y2goZXhwZWN0YXRpb24pLnRlc3QoYWN0dWFsKSk7XG4gICAgICAgIH0sIHRydWUpO1xuICAgIH0sXG5cbiAgICBjYWxsZWRXaXRoRXhhY3RseTogZnVuY3Rpb24gY2FsbGVkV2l0aEV4YWN0bHkoKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSB0aGlzLmFyZ3MubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLmNhbGxlZFdpdGguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgbm90Q2FsbGVkV2l0aDogZnVuY3Rpb24gbm90Q2FsbGVkV2l0aCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNhbGxlZFdpdGguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgbm90Q2FsbGVkV2l0aE1hdGNoOiBmdW5jdGlvbiBub3RDYWxsZWRXaXRoTWF0Y2goKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jYWxsZWRXaXRoTWF0Y2guYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgcmV0dXJuZWQ6IGZ1bmN0aW9uIHJldHVybmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWVwRXF1YWwodmFsdWUsIHRoaXMucmV0dXJuVmFsdWUpO1xuICAgIH0sXG5cbiAgICB0aHJldzogZnVuY3Rpb24gdGhyZXcoZXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhdGhpcy5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuZXhjZXB0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhjZXB0aW9uID09PSBlcnJvciB8fCB0aGlzLmV4Y2VwdGlvbi5uYW1lID09PSBlcnJvcjtcbiAgICB9LFxuXG4gICAgY2FsbGVkV2l0aE5ldzogZnVuY3Rpb24gY2FsbGVkV2l0aE5ldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkucHJvdG90eXBlICYmIHRoaXMudGhpc1ZhbHVlIGluc3RhbmNlb2YgdGhpcy5wcm94eTtcbiAgICB9LFxuXG4gICAgY2FsbGVkQmVmb3JlOiBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbElkIDwgb3RoZXIuY2FsbElkO1xuICAgIH0sXG5cbiAgICBjYWxsZWRBZnRlcjogZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA+IG90aGVyLmNhbGxJZDtcbiAgICB9LFxuXG4gICAgY2FsbGVkSW1tZWRpYXRlbHlCZWZvcmU6IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWQgPT09IG90aGVyLmNhbGxJZCAtIDE7XG4gICAgfSxcblxuICAgIGNhbGxlZEltbWVkaWF0ZWx5QWZ0ZXI6IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWQgPT09IG90aGVyLmNhbGxJZCArIDE7XG4gICAgfSxcblxuICAgIGNhbGxBcmc6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgdGhpcy5hcmdzW3Bvc10oKTtcbiAgICB9LFxuXG4gICAgY2FsbEFyZ09uOiBmdW5jdGlvbiAocG9zLCB0aGlzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5hcmdzW3Bvc10uYXBwbHkodGhpc1ZhbHVlKTtcbiAgICB9LFxuXG4gICAgY2FsbEFyZ1dpdGg6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgdGhpcy5jYWxsQXJnT25XaXRoLmFwcGx5KHRoaXMsIFtwb3MsIG51bGxdLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpKTtcbiAgICB9LFxuXG4gICAgY2FsbEFyZ09uV2l0aDogZnVuY3Rpb24gKHBvcywgdGhpc1ZhbHVlKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgICAgICB0aGlzLmFyZ3NbcG9zXS5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgIH0sXG5cbiAgICB0aHJvd0FyZzogZnVuY3Rpb24gKHBvcykge1xuICAgICAgICBpZiAocG9zID4gdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIk5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIiArIHBvc1xuICAgICAgICAgICAgICAgICsgXCIgcmVxdWlyZWQgYnV0IG9ubHkgXCIgKyB0aGlzLmFyZ3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgKyBcIiBwcmVzZW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyB0aGlzLmFyZ3NbcG9zXTtcbiAgICB9LFxuXG4gICAgXCJ5aWVsZFwiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMueWllbGRPbi5hcHBseSh0aGlzLCBbbnVsbF0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSkpO1xuICAgIH0sXG5cbiAgICB5aWVsZE9uOiBmdW5jdGlvbiAodGhpc1ZhbHVlKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbCh0aGlzLmFyZ3MpO1xuICAgICAgICB2YXIgeWllbGRGbiA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH0pWzBdO1xuXG4gICAgICAgIGlmICgheWllbGRGbikge1xuICAgICAgICAgICAgdGhyb3dZaWVsZEVycm9yKHRoaXMucHJveHksIFwiIGNhbm5vdCB5aWVsZCBzaW5jZSBubyBjYWxsYmFjayB3YXMgcGFzc2VkLlwiLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHlpZWxkRm4uYXBwbHkodGhpc1ZhbHVlLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuICAgIH0sXG5cbiAgICB5aWVsZFRvOiBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICB0aGlzLnlpZWxkVG9Pbi5hcHBseSh0aGlzLCBbcHJvcCwgbnVsbF0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSkpO1xuICAgIH0sXG5cbiAgICB5aWVsZFRvT246IGZ1bmN0aW9uIChwcm9wLCB0aGlzVmFsdWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKHRoaXMuYXJncyk7XG4gICAgICAgIHZhciB5aWVsZEFyZyA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZ1twcm9wXSA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9KVswXTtcbiAgICAgICAgdmFyIHlpZWxkRm4gPSB5aWVsZEFyZyAmJiB5aWVsZEFyZ1twcm9wXTtcblxuICAgICAgICBpZiAoIXlpZWxkRm4pIHtcbiAgICAgICAgICAgIHRocm93WWllbGRFcnJvcih0aGlzLnByb3h5LCBcIiBjYW5ub3QgeWllbGQgdG8gJ1wiICsgdmFsdWVUb1N0cmluZyhwcm9wKSArXG4gICAgICAgICAgICAgICAgXCInIHNpbmNlIG5vIGNhbGxiYWNrIHdhcyBwYXNzZWQuXCIsIGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgeWllbGRGbi5hcHBseSh0aGlzVmFsdWUsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSk7XG4gICAgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYWxsU3RyID0gdGhpcy5wcm94eSA/IHRoaXMucHJveHkudG9TdHJpbmcoKSArIFwiKFwiIDogXCJcIjtcbiAgICAgICAgdmFyIGZvcm1hdHRlZEFyZ3M7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjooXCI7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXR0ZWRBcmdzID0gc2xpY2UuY2FsbCh0aGlzLmFyZ3MpLm1hcChmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2lub25Gb3JtYXQoYXJnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbFN0ciA9IGNhbGxTdHIgKyBmb3JtYXR0ZWRBcmdzLmpvaW4oXCIsIFwiKSArIFwiKVwiO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5yZXR1cm5WYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FsbFN0ciArPSBcIiA9PiBcIiArIHNpbm9uRm9ybWF0KHRoaXMucmV0dXJuVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBjYWxsU3RyICs9IFwiICFcIiArIHRoaXMuZXhjZXB0aW9uLm5hbWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbi5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY2FsbFN0ciArPSBcIihcIiArIHRoaXMuZXhjZXB0aW9uLm1lc3NhZ2UgKyBcIilcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGFjaykge1xuICAgICAgICAgICAgLy8gT21pdCB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHR3byB0b3Agc3RhY2sgZnJhbWVzIGluIHNpbm9uIGl0c2VsZjpcbiAgICAgICAgICAgIGNhbGxTdHIgKz0gKCB0aGlzLnN0YWNrLnNwbGl0KFwiXFxuXCIpWzNdIHx8IFwidW5rbm93blwiICkucmVwbGFjZSgvXlxccyooPzphdFxccyt8QCk/LywgXCIgYXQgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxTdHI7XG4gICAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYWxsUHJvdG8sIFwic3RhY2tcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcldpdGhDYWxsU3RhY2sgJiYgdGhpcy5lcnJvcldpdGhDYWxsU3RhY2suc3RhY2sgfHwgXCJcIjtcbiAgICB9XG59KTtcblxuY2FsbFByb3RvLmludm9rZUNhbGxiYWNrID0gY2FsbFByb3RvLnlpZWxkO1xuXG5mdW5jdGlvbiBjcmVhdGVTcHlDYWxsKHNweSwgdGhpc1ZhbHVlLCBhcmdzLCByZXR1cm5WYWx1ZSwgZXhjZXB0aW9uLCBpZCwgZXJyb3JXaXRoQ2FsbFN0YWNrKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2FsbCBpZCBpcyBub3QgYSBudW1iZXJcIik7XG4gICAgfVxuICAgIHZhciBwcm94eUNhbGwgPSBPYmplY3QuY3JlYXRlKGNhbGxQcm90byk7XG4gICAgcHJveHlDYWxsLnByb3h5ID0gc3B5O1xuICAgIHByb3h5Q2FsbC50aGlzVmFsdWUgPSB0aGlzVmFsdWU7XG4gICAgcHJveHlDYWxsLmFyZ3MgPSBhcmdzO1xuICAgIHByb3h5Q2FsbC5yZXR1cm5WYWx1ZSA9IHJldHVyblZhbHVlO1xuICAgIHByb3h5Q2FsbC5leGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgcHJveHlDYWxsLmNhbGxJZCA9IGlkO1xuICAgIHByb3h5Q2FsbC5lcnJvcldpdGhDYWxsU3RhY2sgPSBlcnJvcldpdGhDYWxsU3RhY2s7XG5cbiAgICByZXR1cm4gcHJveHlDYWxsO1xufVxuY3JlYXRlU3B5Q2FsbC50b1N0cmluZyA9IGNhbGxQcm90by50b1N0cmluZzsgLy8gdXNlZCBieSBtb2Nrc1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVNweUNhbGw7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHdhbGsgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvd2Fsa1wiKTtcbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG5cbmZ1bmN0aW9uIGNvbGxlY3RNZXRob2QobWV0aG9kcywgb2JqZWN0LCBwcm9wLCBwcm9wT3duZXIpIHtcbiAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcE93bmVyLCBwcm9wKS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIG9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wKVxuICAgICkge1xuICAgICAgICBtZXRob2RzLnB1c2gob2JqZWN0W3Byb3BdKTtcbiAgICB9XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG93biBtZXRob2RzIG9uIHRoZSBwYXNzZWQgb2JqZWN0XG5mdW5jdGlvbiBjb2xsZWN0T3duTWV0aG9kcyhvYmplY3QpIHtcbiAgICB2YXIgbWV0aG9kcyA9IFtdO1xuXG4gICAgd2FsayhvYmplY3QsIGNvbGxlY3RNZXRob2QuYmluZChudWxsLCBtZXRob2RzLCBvYmplY3QpKTtcblxuICAgIHJldHVybiBtZXRob2RzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxlY3RPd25NZXRob2RzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzaW5vblNweSA9IHJlcXVpcmUoXCIuL3NweVwiKTtcbnZhciBzaW5vblN0dWIgPSByZXF1aXJlKFwiLi9zdHViXCIpO1xudmFyIHNpbm9uTW9jayA9IHJlcXVpcmUoXCIuL21vY2tcIik7XG52YXIgc2FuZGJveFN0dWIgPSByZXF1aXJlKFwiLi9zYW5kYm94LXN0dWJcIik7XG52YXIgY29sbGVjdE93bk1ldGhvZHMgPSByZXF1aXJlKFwiLi9jb2xsZWN0LW93bi1tZXRob2RzXCIpO1xuXG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbmZ1bmN0aW9uIGdldEZha2VzKGZha2VDb2xsZWN0aW9uKSB7XG4gICAgaWYgKCFmYWtlQ29sbGVjdGlvbi5mYWtlcykge1xuICAgICAgICBmYWtlQ29sbGVjdGlvbi5mYWtlcyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBmYWtlQ29sbGVjdGlvbi5mYWtlcztcbn1cblxuZnVuY3Rpb24gZWFjaChmYWtlQ29sbGVjdGlvbiwgbWV0aG9kKSB7XG4gICAgdmFyIGZha2VzID0gZ2V0RmFrZXMoZmFrZUNvbGxlY3Rpb24pO1xuICAgIHZhciBtYXRjaGluZ0Zha2VzID0gZmFrZXMuZmlsdGVyKGZ1bmN0aW9uIChmYWtlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZmFrZVttZXRob2RdID09PSBcImZ1bmN0aW9uXCI7XG4gICAgfSk7XG5cbiAgICBtYXRjaGluZ0Zha2VzLmZvckVhY2goZnVuY3Rpb24gKGZha2UpIHtcbiAgICAgICAgZmFrZVttZXRob2RdKCk7XG4gICAgfSk7XG59XG5cbnZhciBjb2xsZWN0aW9uID0ge1xuICAgIHZlcmlmeTogZnVuY3Rpb24gdmVyaWZ5KCkge1xuICAgICAgICBlYWNoKHRoaXMsIFwidmVyaWZ5XCIpO1xuICAgIH0sXG5cbiAgICByZXN0b3JlOiBmdW5jdGlvbiByZXN0b3JlKCkge1xuICAgICAgICBlYWNoKHRoaXMsIFwicmVzdG9yZVwiKTtcbiAgICAgICAgdGhpcy5mYWtlcyA9IFtdO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIGVhY2godGhpcywgXCJyZXNldFwiKTtcbiAgICB9LFxuXG4gICAgcmVzZXRCZWhhdmlvcjogZnVuY3Rpb24gcmVzZXRCZWhhdmlvcigpIHtcbiAgICAgICAgZWFjaCh0aGlzLCBcInJlc2V0QmVoYXZpb3JcIik7XG4gICAgfSxcblxuICAgIHJlc2V0SGlzdG9yeTogZnVuY3Rpb24gcmVzZXRIaXN0b3J5KCkge1xuICAgICAgICBnZXRGYWtlcyh0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChmYWtlKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kID0gZmFrZS5yZXNldEhpc3RvcnkgfHwgZmFrZS5yZXNldDtcblxuICAgICAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKGZha2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgdmVyaWZ5QW5kUmVzdG9yZTogZnVuY3Rpb24gdmVyaWZ5QW5kUmVzdG9yZSgpIHtcbiAgICAgICAgdmFyIGV4Y2VwdGlvbjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXhjZXB0aW9uID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzdG9yZSgpO1xuXG4gICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGQ6IGZ1bmN0aW9uIGFkZChmYWtlKSB7XG4gICAgICAgIHB1c2guY2FsbChnZXRGYWtlcyh0aGlzKSwgZmFrZSk7XG4gICAgICAgIHJldHVybiBmYWtlO1xuICAgIH0sXG5cbiAgICBhZGRVc2luZ1Byb21pc2U6IGZ1bmN0aW9uIChmYWtlKSB7XG4gICAgICAgIGZha2UudXNpbmdQcm9taXNlKHRoaXMucHJvbWlzZUxpYnJhcnkpO1xuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxuXG4gICAgc3B5OiBmdW5jdGlvbiBzcHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZChzaW5vblNweS5hcHBseShzaW5vblNweSwgYXJndW1lbnRzKSk7XG4gICAgfSxcblxuICAgIHN0dWI6IGZ1bmN0aW9uIHN0dWIob2JqZWN0LCBwcm9wZXJ0eS8qLCB2YWx1ZSovKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgcmV0dXJuIHNhbmRib3hTdHViLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3R1YmJlZCA9IHNpbm9uU3R1Yi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB2YXIgaXNTdHViYmluZ0VudGlyZU9iamVjdCA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiO1xuXG4gICAgICAgIGlmIChpc1N0dWJiaW5nRW50aXJlT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgb3duTWV0aG9kcyA9IGNvbGxlY3RPd25NZXRob2RzKHN0dWJiZWQpO1xuICAgICAgICAgICAgb3duTWV0aG9kcy5mb3JFYWNoKHRoaXMuYWRkLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvbWlzZUxpYnJhcnkpIHtcbiAgICAgICAgICAgICAgICBvd25NZXRob2RzLmZvckVhY2godGhpcy5hZGRVc2luZ1Byb21pc2UuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZChzdHViYmVkKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb21pc2VMaWJyYXJ5KSB7XG4gICAgICAgICAgICAgICAgc3R1YmJlZC51c2luZ1Byb21pc2UodGhpcy5wcm9taXNlTGlicmFyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R1YmJlZDtcbiAgICB9LFxuXG4gICAgbW9jazogZnVuY3Rpb24gbW9jaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKHNpbm9uTW9jay5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICB9LFxuXG4gICAgaW5qZWN0OiBmdW5jdGlvbiBpbmplY3Qob2JqKSB7XG4gICAgICAgIHZhciBjb2wgPSB0aGlzO1xuXG4gICAgICAgIG9iai5zcHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sLnNweS5hcHBseShjb2wsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLnN0dWIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sLnN0dWIuYXBwbHkoY29sLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9iai5tb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbC5tb2NrLmFwcGx5KGNvbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGVjdGlvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY2FuQ29sb3IgPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZnVuY3Rpb24gY29sb3JpemUoc3RyLCBjb2xvcikge1xuICAgIGlmICghY2FuQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcXHgxYltcIiArIGNvbG9yICsgXCJtXCIgKyBzdHIgKyBcIlxceDFiWzBtXCI7XG59XG5cbmV4cG9ydHMucmVkID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiBjb2xvcml6ZShzdHIsIDMxKTtcbn07XG5cbmV4cG9ydHMuZ3JlZW4gPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIGNvbG9yaXplKHN0ciwgMzIpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xuXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciB1c2VMZWZ0TW9zdENhbGxiYWNrID0gLTE7XG52YXIgdXNlUmlnaHRNb3N0Q2FsbGJhY2sgPSAtMjtcblxuZnVuY3Rpb24gdGhyb3dzRXhjZXB0aW9uKGZha2UsIGVycm9yLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IG5ldyBFcnJvcihtZXNzYWdlIHx8IFwiXCIpO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbi5uYW1lID0gZXJyb3I7XG4gICAgfSBlbHNlIGlmICghZXJyb3IpIHtcbiAgICAgICAgZmFrZS5leGNlcHRpb24gPSBuZXcgRXJyb3IoXCJFcnJvclwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IGVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShvYmosIHByb3BOYW1lKSB7XG4gICAgdmFyIHByb3BlcnR5RGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3BOYW1lKTtcblxuICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3IgPyBwcm9wZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhYmxlIDogdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgY2FsbHNGYWtlOiBmdW5jdGlvbiBjYWxsc0Zha2UoZmFrZSwgZm4pIHtcbiAgICAgICAgZmFrZS5mYWtlRm4gPSBmbjtcbiAgICB9LFxuXG4gICAgY2FsbHNBcmc6IGZ1bmN0aW9uIGNhbGxzQXJnKGZha2UsIHBvcykge1xuICAgICAgICBpZiAodHlwZW9mIHBvcyAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHBvcztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IFtdO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNhbGxzQXJnT246IGZ1bmN0aW9uIGNhbGxzQXJnT24oZmFrZSwgcG9zLCBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gcG9zO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gW107XG4gICAgICAgIGZha2UuY2FsbGJhY2tDb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNhbGxzQXJnV2l0aDogZnVuY3Rpb24gY2FsbHNBcmdXaXRoKGZha2UsIHBvcykge1xuICAgICAgICBpZiAodHlwZW9mIHBvcyAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHBvcztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjYWxsc0FyZ09uV2l0aDogZnVuY3Rpb24gY2FsbHNBcmdXaXRoKGZha2UsIHBvcywgY29udGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIHBvcyAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHBvcztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBmYWtlLmNhbGxBcmdQcm9wID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXN5bmMgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgdXNpbmdQcm9taXNlOiBmdW5jdGlvbiB1c2luZ1Byb21pc2UoZmFrZSwgcHJvbWlzZUxpYnJhcnkpIHtcbiAgICAgICAgZmFrZS5wcm9taXNlTGlicmFyeSA9IHByb21pc2VMaWJyYXJ5O1xuICAgIH0sXG5cbiAgICB5aWVsZHM6IGZ1bmN0aW9uIChmYWtlKSB7XG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gdXNlTGVmdE1vc3RDYWxsYmFjaztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNSaWdodDogZnVuY3Rpb24gKGZha2UpIHtcbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSB1c2VSaWdodE1vc3RDYWxsYmFjaztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNPbjogZnVuY3Rpb24gKGZha2UsIGNvbnRleHQpIHtcbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSB1c2VMZWZ0TW9zdENhbGxiYWNrO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNUbzogZnVuY3Rpb24gKGZha2UsIHByb3ApIHtcbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSB1c2VMZWZ0TW9zdENhbGxiYWNrO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHByb3A7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNUb09uOiBmdW5jdGlvbiAoZmFrZSwgcHJvcCwgY29udGV4dCkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG4gICAgICAgIGZha2UuY2FsbGJhY2tDb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHByb3A7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB0aHJvd3M6IHRocm93c0V4Y2VwdGlvbixcbiAgICB0aHJvd3NFeGNlcHRpb246IHRocm93c0V4Y2VwdGlvbixcblxuICAgIHJldHVybnM6IGZ1bmN0aW9uIHJldHVybnMoZmFrZSwgdmFsdWUpIHtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZWplY3QgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSB0cnVlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5mYWtlRm4gPSB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIHJldHVybnNBcmc6IGZ1bmN0aW9uIHJldHVybnNBcmcoZmFrZSwgcG9zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UucmV0dXJuQXJnQXQgPSBwb3M7XG4gICAgfSxcblxuICAgIHRocm93c0FyZzogZnVuY3Rpb24gdGhyb3dzQXJnKGZha2UsIHBvcykge1xuICAgICAgICBpZiAodHlwZW9mIHBvcyAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLnRocm93QXJnQXQgPSBwb3M7XG4gICAgfSxcblxuICAgIHJldHVybnNUaGlzOiBmdW5jdGlvbiByZXR1cm5zVGhpcyhmYWtlKSB7XG4gICAgICAgIGZha2UucmV0dXJuVGhpcyA9IHRydWU7XG4gICAgfSxcblxuICAgIHJlc29sdmVzOiBmdW5jdGlvbiByZXNvbHZlcyhmYWtlLCB2YWx1ZSkge1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlID0gdmFsdWU7XG4gICAgICAgIGZha2UucmVzb2x2ZSA9IHRydWU7XG4gICAgICAgIGZha2UucmVqZWN0ID0gZmFsc2U7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWVEZWZpbmVkID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5leGNlcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICByZWplY3RzOiBmdW5jdGlvbiByZWplY3RzKGZha2UsIGVycm9yLCBtZXNzYWdlKSB7XG4gICAgICAgIHZhciByZWFzb247XG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlYXNvbiA9IG5ldyBFcnJvcihtZXNzYWdlIHx8IFwiXCIpO1xuICAgICAgICAgICAgcmVhc29uLm5hbWUgPSBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIHJlYXNvbiA9IG5ldyBFcnJvcihcIkVycm9yXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVhc29uID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHJlYXNvbjtcbiAgICAgICAgZmFrZS5yZXNvbHZlID0gZmFsc2U7XG4gICAgICAgIGZha2UucmVqZWN0ID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSB0cnVlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5mYWtlRm4gPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIGZha2U7XG4gICAgfSxcblxuICAgIGNhbGxUaHJvdWdoOiBmdW5jdGlvbiBjYWxsVGhyb3VnaChmYWtlKSB7XG4gICAgICAgIGZha2UuY2FsbHNUaHJvdWdoID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoZmFrZSwgZ2V0dGVyRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIHJvb3RTdHViID0gZmFrZS5zdHViIHx8IGZha2U7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lLCB7XG4gICAgICAgICAgICBnZXQ6IGdldHRlckZ1bmN0aW9uLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lKVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxuXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoZmFrZSwgc2V0dGVyRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIHJvb3RTdHViID0gZmFrZS5zdHViIHx8IGZha2U7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lLCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYWNjZXNzb3ItcGFpcnNcbiAgICAgICAgICAgIHNldDogc2V0dGVyRnVuY3Rpb24sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGlzUHJvcGVydHlDb25maWd1cmFibGUocm9vdFN0dWIucm9vdE9iaiwgcm9vdFN0dWIucHJvcE5hbWUpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWtlO1xuICAgIH0sXG5cbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoZmFrZSwgbmV3VmFsKSB7XG4gICAgICAgIHZhciByb290U3R1YiA9IGZha2Uuc3R1YiB8fCBmYWtlO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyb290U3R1Yi5yb290T2JqLCByb290U3R1Yi5wcm9wTmFtZSwge1xuICAgICAgICAgICAgdmFsdWU6IG5ld1ZhbCxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGlzUHJvcGVydHlDb25maWd1cmFibGUocm9vdFN0dWIucm9vdE9iaiwgcm9vdFN0dWIucHJvcE5hbWUpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWtlO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUFzeW5jVmVyc2lvbihzeW5jRm5OYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG1vZHVsZS5leHBvcnRzW3N5bmNGbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tBc3luYyA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cblxuLy8gY3JlYXRlIGFzeW5jaHJvbm91cyB2ZXJzaW9ucyBvZiBjYWxsc0FyZyogYW5kIHlpZWxkcyogbWV0aG9kc1xuT2JqZWN0LmtleXMobW9kdWxlLmV4cG9ydHMpLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIC8vIG5lZWQgdG8gYXZvaWQgY3JlYXRpbmcgYW5vdGhlcmFzeW5jIHZlcnNpb25zIG9mIHRoZSBuZXdseSBhZGRlZCBhc3luYyBtZXRob2RzXG4gICAgaWYgKG1ldGhvZC5tYXRjaCgvXihjYWxsc0FyZ3x5aWVsZHMpLykgJiYgIW1ldGhvZC5tYXRjaCgvQXN5bmMvKSkge1xuICAgICAgICBtb2R1bGUuZXhwb3J0c1ttZXRob2QgKyBcIkFzeW5jXCJdID0gY3JlYXRlQXN5bmNWZXJzaW9uKG1ldGhvZCk7XG4gICAgfVxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9kZWVwLWVxdWFsXCIpLnVzZShtYXRjaCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbnZhciBldmVyeSA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9ldmVyeVwiKTtcbnZhciBmdW5jdGlvbk5hbWUgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZnVuY3Rpb24tbmFtZVwiKTtcbnZhciBpdGVyYWJsZVRvU3RyaW5nID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2l0ZXJhYmxlLXRvLXN0cmluZ1wiKTtcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdHlwZU9mXCIpO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdmFsdWUtdG8tc3RyaW5nXCIpO1xuXG52YXIgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuXG5mdW5jdGlvbiBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlLCBuYW1lKSB7XG4gICAgdmFyIGFjdHVhbCA9IHR5cGVPZih2YWx1ZSk7XG4gICAgaWYgKGFjdHVhbCAhPT0gdHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgdHlwZSBvZiBcIiArIG5hbWUgKyBcIiB0byBiZSBcIiArXG4gICAgICAgICAgICB0eXBlICsgXCIsIGJ1dCB3YXMgXCIgKyBhY3R1YWwpO1xuICAgIH1cbn1cblxudmFyIG1hdGNoZXIgPSB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBpc01hdGNoZXIob2JqZWN0KSB7XG4gICAgcmV0dXJuIG1hdGNoZXIuaXNQcm90b3R5cGVPZihvYmplY3QpO1xufVxuXG5mdW5jdGlvbiBtYXRjaE9iamVjdChleHBlY3RhdGlvbiwgYWN0dWFsKSB7XG4gICAgaWYgKGFjdHVhbCA9PT0gbnVsbCB8fCBhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGV4cGVjdGF0aW9uKS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBleHAgPSBleHBlY3RhdGlvbltrZXldO1xuICAgICAgICB2YXIgYWN0ID0gYWN0dWFsW2tleV07XG5cbiAgICAgICAgaWYgKGlzTWF0Y2hlcihleHApKSB7XG4gICAgICAgICAgICBpZiAoIWV4cC50ZXN0KGFjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZU9mKGV4cCkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hPYmplY3QoZXhwLCBhY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFkZWVwRXF1YWwoZXhwLCBhY3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbn1cblxudmFyIFRZUEVfTUFQID0ge1xuICAgIFwiZnVuY3Rpb25cIjogZnVuY3Rpb24gKG0sIGV4cGVjdGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIG0udGVzdCA9IGV4cGVjdGF0aW9uO1xuICAgICAgICBtLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwibWF0Y2goXCIgKyBmdW5jdGlvbk5hbWUoZXhwZWN0YXRpb24pICsgXCIpXCI7XG4gICAgfSxcbiAgICBudW1iZXI6IGZ1bmN0aW9uIChtLCBleHBlY3RhdGlvbikge1xuICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHR5cGUgY29lcmNpb24gaGVyZVxuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uID09IGFjdHVhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIG9iamVjdDogZnVuY3Rpb24gKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZXhwZWN0YXRpb24udGVzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uLnRlc3QoYWN0dWFsKSA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtLm1lc3NhZ2UgPSBcIm1hdGNoKFwiICsgZnVuY3Rpb25OYW1lKGV4cGVjdGF0aW9uLnRlc3QpICsgXCIpXCI7XG4gICAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFycmF5ID0gT2JqZWN0LmtleXMoZXhwZWN0YXRpb24pLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5ICsgXCI6IFwiICsgdmFsdWVUb1N0cmluZyhleHBlY3RhdGlvbltrZXldKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbS50ZXN0ID0gZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoT2JqZWN0KGV4cGVjdGF0aW9uLCBhY3R1YWwpO1xuICAgICAgICB9O1xuICAgICAgICBtLm1lc3NhZ2UgPSBcIm1hdGNoKFwiICsgYXJyYXkuam9pbihcIiwgXCIpICsgXCIpXCI7XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfSxcbiAgICByZWdleHA6IGZ1bmN0aW9uIChtLCBleHBlY3RhdGlvbikge1xuICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gXCJzdHJpbmdcIiAmJiBleHBlY3RhdGlvbi50ZXN0KGFjdHVhbCk7XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBzdHJpbmc6IGZ1bmN0aW9uIChtLCBleHBlY3RhdGlvbikge1xuICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gXCJzdHJpbmdcIiAmJiBhY3R1YWwuaW5kZXhPZihleHBlY3RhdGlvbikgIT09IC0xO1xuICAgICAgICB9O1xuICAgICAgICBtLm1lc3NhZ2UgPSBcIm1hdGNoKFxcXCJcIiArIGV4cGVjdGF0aW9uICsgXCJcXFwiKVwiO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIG1hdGNoKGV4cGVjdGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgdmFyIG0gPSBPYmplY3QuY3JlYXRlKG1hdGNoZXIpO1xuICAgIHZhciB0eXBlID0gdHlwZU9mKGV4cGVjdGF0aW9uKTtcblxuICAgIGlmICh0eXBlIGluIFRZUEVfTUFQKSB7XG4gICAgICAgIFRZUEVfTUFQW3R5cGVdKG0sIGV4cGVjdGF0aW9uLCBtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGV4cGVjdGF0aW9uLCBhY3R1YWwpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmICghbS5tZXNzYWdlKSB7XG4gICAgICAgIG0ubWVzc2FnZSA9IFwibWF0Y2goXCIgKyB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiKVwiO1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG5tYXRjaGVyLm9yID0gZnVuY3Rpb24gKG0yKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYXRjaGVyIGV4cGVjdGVkXCIpO1xuICAgIH0gZWxzZSBpZiAoIWlzTWF0Y2hlcihtMikpIHtcbiAgICAgICAgbTIgPSBtYXRjaChtMik7XG4gICAgfVxuICAgIHZhciBtMSA9IHRoaXM7XG4gICAgdmFyIG9yID0gT2JqZWN0LmNyZWF0ZShtYXRjaGVyKTtcbiAgICBvci50ZXN0ID0gZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gbTEudGVzdChhY3R1YWwpIHx8IG0yLnRlc3QoYWN0dWFsKTtcbiAgICB9O1xuICAgIG9yLm1lc3NhZ2UgPSBtMS5tZXNzYWdlICsgXCIub3IoXCIgKyBtMi5tZXNzYWdlICsgXCIpXCI7XG4gICAgcmV0dXJuIG9yO1xufTtcblxubWF0Y2hlci5hbmQgPSBmdW5jdGlvbiAobTIpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hdGNoZXIgZXhwZWN0ZWRcIik7XG4gICAgfSBlbHNlIGlmICghaXNNYXRjaGVyKG0yKSkge1xuICAgICAgICBtMiA9IG1hdGNoKG0yKTtcbiAgICB9XG4gICAgdmFyIG0xID0gdGhpcztcbiAgICB2YXIgYW5kID0gT2JqZWN0LmNyZWF0ZShtYXRjaGVyKTtcbiAgICBhbmQudGVzdCA9IGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIG0xLnRlc3QoYWN0dWFsKSAmJiBtMi50ZXN0KGFjdHVhbCk7XG4gICAgfTtcbiAgICBhbmQubWVzc2FnZSA9IG0xLm1lc3NhZ2UgKyBcIi5hbmQoXCIgKyBtMi5tZXNzYWdlICsgXCIpXCI7XG4gICAgcmV0dXJuIGFuZDtcbn07XG5cbm1hdGNoLmlzTWF0Y2hlciA9IGlzTWF0Y2hlcjtcblxubWF0Y2guYW55ID0gbWF0Y2goZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cnVlO1xufSwgXCJhbnlcIik7XG5cbm1hdGNoLmRlZmluZWQgPSBtYXRjaChmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgcmV0dXJuIGFjdHVhbCAhPT0gbnVsbCAmJiBhY3R1YWwgIT09IHVuZGVmaW5lZDtcbn0sIFwiZGVmaW5lZFwiKTtcblxubWF0Y2gudHJ1dGh5ID0gbWF0Y2goZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgIHJldHVybiAhIWFjdHVhbDtcbn0sIFwidHJ1dGh5XCIpO1xuXG5tYXRjaC5mYWxzeSA9IG1hdGNoKGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICByZXR1cm4gIWFjdHVhbDtcbn0sIFwiZmFsc3lcIik7XG5cbm1hdGNoLnNhbWUgPSBmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24gPT09IGFjdHVhbDtcbiAgICB9LCBcInNhbWUoXCIgKyB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiKVwiKTtcbn07XG5cbm1hdGNoLnR5cGVPZiA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgYXNzZXJ0VHlwZSh0eXBlLCBcInN0cmluZ1wiLCBcInR5cGVcIik7XG4gICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVPZihhY3R1YWwpID09PSB0eXBlO1xuICAgIH0sIFwidHlwZU9mKFxcXCJcIiArIHR5cGUgKyBcIlxcXCIpXCIpO1xufTtcblxubWF0Y2guaW5zdGFuY2VPZiA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgYXNzZXJ0VHlwZSh0eXBlLCBcImZ1bmN0aW9uXCIsIFwidHlwZVwiKTtcbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gYWN0dWFsIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9LCBcImluc3RhbmNlT2YoXCIgKyBmdW5jdGlvbk5hbWUodHlwZSkgKyBcIilcIik7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eU1hdGNoZXIocHJvcGVydHlUZXN0LCBtZXNzYWdlUHJlZml4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VHlwZShwcm9wZXJ0eSwgXCJzdHJpbmdcIiwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgdmFyIG9ubHlQcm9wZXJ0eSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDE7XG4gICAgICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVByZWZpeCArIFwiKFxcXCJcIiArIHByb3BlcnR5ICsgXCJcXFwiXCI7XG4gICAgICAgIGlmICghb25seVByb3BlcnR5KSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9IFwiLCBcIiArIHZhbHVlVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gXCIpXCI7XG4gICAgICAgIHJldHVybiBtYXRjaChmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgICAgICBpZiAoYWN0dWFsID09PSB1bmRlZmluZWQgfHwgYWN0dWFsID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgICFwcm9wZXJ0eVRlc3QoYWN0dWFsLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb25seVByb3BlcnR5IHx8IGRlZXBFcXVhbCh2YWx1ZSwgYWN0dWFsW3Byb3BlcnR5XSk7XG4gICAgICAgIH0sIG1lc3NhZ2UpO1xuICAgIH07XG59XG5cbm1hdGNoLmhhcyA9IGNyZWF0ZVByb3BlcnR5TWF0Y2hlcihmdW5jdGlvbiAoYWN0dWFsLCBwcm9wZXJ0eSkge1xuICAgIGlmICh0eXBlb2YgYWN0dWFsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiBhY3R1YWw7XG4gICAgfVxuICAgIHJldHVybiBhY3R1YWxbcHJvcGVydHldICE9PSB1bmRlZmluZWQ7XG59LCBcImhhc1wiKTtcblxubWF0Y2guaGFzT3duID0gY3JlYXRlUHJvcGVydHlNYXRjaGVyKGZ1bmN0aW9uIChhY3R1YWwsIHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGFjdHVhbC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSk7XG59LCBcImhhc093blwiKTtcblxubWF0Y2guYXJyYXkgPSBtYXRjaC50eXBlT2YoXCJhcnJheVwiKTtcblxubWF0Y2guYXJyYXkuZGVlcEVxdWFscyA9IGZ1bmN0aW9uIChleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgIC8vIENvbXBhcmluZyBsZW5ndGhzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBzcG90IGEgZGlmZmVyZW5jZSBiZWZvcmUgaXRlcmF0aW5nIHRocm91Z2ggZXZlcnkgaXRlbVxuICAgICAgICB2YXIgc2FtZUxlbmd0aCA9IGFjdHVhbC5sZW5ndGggPT09IGV4cGVjdGF0aW9uLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiYgc2FtZUxlbmd0aCAmJiBldmVyeShhY3R1YWwsIGZ1bmN0aW9uIChlbGVtZW50LCBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uW2luZGV4XSA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgfSwgXCJkZWVwRXF1YWxzKFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbm1hdGNoLmFycmF5LnN0YXJ0c1dpdGggPSBmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gdHlwZU9mKGFjdHVhbCkgPT09IFwiYXJyYXlcIiAmJiBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24gKGV4cGVjdGVkRWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3R1YWxbaW5kZXhdID09PSBleHBlY3RlZEVsZW1lbnQ7XG4gICAgICAgIH0pO1xuICAgIH0sIFwic3RhcnRzV2l0aChbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5hcnJheS5lbmRzV2l0aCA9IGZ1bmN0aW9uIChleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoZSBpbmRleCBpbiB3aGljaCB3ZSBzaG91bGQgc3RhcnQgbWF0Y2hpbmdcbiAgICAgICAgdmFyIG9mZnNldCA9IGFjdHVhbC5sZW5ndGggLSBleHBlY3RhdGlvbi5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiYgZXZlcnkoZXhwZWN0YXRpb24sIGZ1bmN0aW9uIChleHBlY3RlZEVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsW29mZnNldCArIGluZGV4XSA9PT0gZXhwZWN0ZWRFbGVtZW50O1xuICAgICAgICB9KTtcbiAgICB9LCBcImVuZHNXaXRoKFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbm1hdGNoLmFycmF5LmNvbnRhaW5zID0gZnVuY3Rpb24gKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiYgZXZlcnkoZXhwZWN0YXRpb24sIGZ1bmN0aW9uIChleHBlY3RlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleE9mLmNhbGwoYWN0dWFsLCBleHBlY3RlZEVsZW1lbnQpICE9PSAtMTtcbiAgICAgICAgfSk7XG4gICAgfSwgXCJjb250YWlucyhbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5tYXAgPSBtYXRjaC50eXBlT2YoXCJtYXBcIik7XG5cbm1hdGNoLm1hcC5kZWVwRXF1YWxzID0gZnVuY3Rpb24gbWFwRGVlcEVxdWFscyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgIC8vIENvbXBhcmluZyBsZW5ndGhzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBzcG90IGEgZGlmZmVyZW5jZSBiZWZvcmUgaXRlcmF0aW5nIHRocm91Z2ggZXZlcnkgaXRlbVxuICAgICAgICB2YXIgc2FtZUxlbmd0aCA9IGFjdHVhbC5zaXplID09PSBleHBlY3RhdGlvbi5zaXplO1xuICAgICAgICByZXR1cm4gdHlwZU9mKGFjdHVhbCkgPT09IFwibWFwXCIgJiYgc2FtZUxlbmd0aCAmJiBldmVyeShhY3R1YWwsIGZ1bmN0aW9uIChlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbi5oYXMoa2V5KSAmJiBleHBlY3RhdGlvbi5nZXQoa2V5KSA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgfSwgXCJkZWVwRXF1YWxzKE1hcFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbm1hdGNoLm1hcC5jb250YWlucyA9IGZ1bmN0aW9uIG1hcENvbnRhaW5zKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uIChhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVPZihhY3R1YWwpID09PSBcIm1hcFwiICYmIGV2ZXJ5KGV4cGVjdGF0aW9uLCBmdW5jdGlvbiAoZWxlbWVudCwga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsLmhhcyhrZXkpICYmIGFjdHVhbC5nZXQoa2V5KSA9PT0gZWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgfSwgXCJjb250YWlucyhNYXBbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5zZXQgPSBtYXRjaC50eXBlT2YoXCJzZXRcIik7XG5cbm1hdGNoLnNldC5kZWVwRXF1YWxzID0gZnVuY3Rpb24gc2V0RGVlcEVxdWFscyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbiAoYWN0dWFsKSB7XG4gICAgICAgIC8vIENvbXBhcmluZyBsZW5ndGhzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBzcG90IGEgZGlmZmVyZW5jZSBiZWZvcmUgaXRlcmF0aW5nIHRocm91Z2ggZXZlcnkgaXRlbVxuICAgICAgICB2YXIgc2FtZUxlbmd0aCA9IGFjdHVhbC5zaXplID09PSBleHBlY3RhdGlvbi5zaXplO1xuICAgICAgICByZXR1cm4gdHlwZU9mKGFjdHVhbCkgPT09IFwic2V0XCIgJiYgc2FtZUxlbmd0aCAmJiBldmVyeShhY3R1YWwsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24uaGFzKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9LCBcImRlZXBFcXVhbHMoU2V0W1wiICsgaXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbikgKyBcIl0pXCIpO1xufTtcblxubWF0Y2guc2V0LmNvbnRhaW5zID0gZnVuY3Rpb24gc2V0Q29udGFpbnMoZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24gKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gdHlwZU9mKGFjdHVhbCkgPT09IFwic2V0XCIgJiYgZXZlcnkoZXhwZWN0YXRpb24sIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsLmhhcyhlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfSwgXCJjb250YWlucyhTZXRbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5ib29sID0gbWF0Y2gudHlwZU9mKFwiYm9vbGVhblwiKTtcbm1hdGNoLm51bWJlciA9IG1hdGNoLnR5cGVPZihcIm51bWJlclwiKTtcbm1hdGNoLnN0cmluZyA9IG1hdGNoLnR5cGVPZihcInN0cmluZ1wiKTtcbm1hdGNoLm9iamVjdCA9IG1hdGNoLnR5cGVPZihcIm9iamVjdFwiKTtcbm1hdGNoLmZ1bmMgPSBtYXRjaC50eXBlT2YoXCJmdW5jdGlvblwiKTtcbm1hdGNoLnJlZ2V4cCA9IG1hdGNoLnR5cGVPZihcInJlZ2V4cFwiKTtcbm1hdGNoLmRhdGUgPSBtYXRjaC50eXBlT2YoXCJkYXRlXCIpO1xubWF0Y2guc3ltYm9sID0gbWF0Y2gudHlwZU9mKFwic3ltYm9sXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdGNoO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzcHlJbnZva2UgPSByZXF1aXJlKFwiLi9zcHlcIikuaW52b2tlO1xudmFyIHNweUNhbGxUb1N0cmluZyA9IHJlcXVpcmUoXCIuL2NhbGxcIikudG9TdHJpbmc7XG52YXIgdGltZXNJbldvcmRzID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3RpbWVzLWluLXdvcmRzXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG52YXIgbWF0Y2ggPSByZXF1aXJlKFwiLi9tYXRjaFwiKTtcbnZhciBzdHViID0gcmVxdWlyZShcIi4vc3R1YlwiKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKFwiLi9hc3NlcnRcIik7XG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2RlZXAtZXF1YWxcIikudXNlKG1hdGNoKTtcbnZhciBmb3JtYXQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZm9ybWF0XCIpO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdmFsdWUtdG8tc3RyaW5nXCIpO1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xuXG5mdW5jdGlvbiBjYWxsQ291bnRJbldvcmRzKGNhbGxDb3VudCkge1xuICAgIGlmIChjYWxsQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwibmV2ZXIgY2FsbGVkXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiY2FsbGVkIFwiICsgdGltZXNJbldvcmRzKGNhbGxDb3VudCk7XG59XG5cbmZ1bmN0aW9uIGV4cGVjdGVkQ2FsbENvdW50SW5Xb3JkcyhleHBlY3RhdGlvbikge1xuICAgIHZhciBtaW4gPSBleHBlY3RhdGlvbi5taW5DYWxscztcbiAgICB2YXIgbWF4ID0gZXhwZWN0YXRpb24ubWF4Q2FsbHM7XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHZhciBzdHIgPSB0aW1lc0luV29yZHMobWluKTtcblxuICAgICAgICBpZiAobWluICE9PSBtYXgpIHtcbiAgICAgICAgICAgIHN0ciA9IFwiYXQgbGVhc3QgXCIgKyBzdHIgKyBcIiBhbmQgYXQgbW9zdCBcIiArIHRpbWVzSW5Xb3JkcyhtYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gXCJhdCBsZWFzdCBcIiArIHRpbWVzSW5Xb3JkcyhtaW4pO1xuICAgIH1cblxuICAgIHJldHVybiBcImF0IG1vc3QgXCIgKyB0aW1lc0luV29yZHMobWF4KTtcbn1cblxuZnVuY3Rpb24gcmVjZWl2ZWRNaW5DYWxscyhleHBlY3RhdGlvbikge1xuICAgIHZhciBoYXNNaW5MaW1pdCA9IHR5cGVvZiBleHBlY3RhdGlvbi5taW5DYWxscyA9PT0gXCJudW1iZXJcIjtcbiAgICByZXR1cm4gIWhhc01pbkxpbWl0IHx8IGV4cGVjdGF0aW9uLmNhbGxDb3VudCA+PSBleHBlY3RhdGlvbi5taW5DYWxscztcbn1cblxuZnVuY3Rpb24gcmVjZWl2ZWRNYXhDYWxscyhleHBlY3RhdGlvbikge1xuICAgIGlmICh0eXBlb2YgZXhwZWN0YXRpb24ubWF4Q2FsbHMgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RhdGlvbi5jYWxsQ291bnQgPT09IGV4cGVjdGF0aW9uLm1heENhbGxzO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlNYXRjaGVyKHBvc3NpYmxlTWF0Y2hlciwgYXJnKSB7XG4gICAgdmFyIGlzTWF0Y2hlciA9IG1hdGNoICYmIG1hdGNoLmlzTWF0Y2hlcihwb3NzaWJsZU1hdGNoZXIpO1xuXG4gICAgcmV0dXJuIGlzTWF0Y2hlciAmJiBwb3NzaWJsZU1hdGNoZXIudGVzdChhcmcpIHx8IHRydWU7XG59XG5cbnZhciBtb2NrRXhwZWN0YXRpb24gPSB7XG4gICAgbWluQ2FsbHM6IDEsXG4gICAgbWF4Q2FsbHM6IDEsXG5cbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZShtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBleHBlY3RhdGlvbiA9IGV4dGVuZChzdHViLmNyZWF0ZSgpLCBtb2NrRXhwZWN0YXRpb24pO1xuICAgICAgICBkZWxldGUgZXhwZWN0YXRpb24uY3JlYXRlO1xuICAgICAgICBleHBlY3RhdGlvbi5tZXRob2QgPSBtZXRob2ROYW1lO1xuXG4gICAgICAgIHJldHVybiBleHBlY3RhdGlvbjtcbiAgICB9LFxuXG4gICAgaW52b2tlOiBmdW5jdGlvbiBpbnZva2UoZnVuYywgdGhpc1ZhbHVlLCBhcmdzKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5Q2FsbEFsbG93ZWQodGhpc1ZhbHVlLCBhcmdzKTtcblxuICAgICAgICByZXR1cm4gc3B5SW52b2tlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIGF0TGVhc3Q6IGZ1bmN0aW9uIGF0TGVhc3QobnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiJ1wiICsgdmFsdWVUb1N0cmluZyhudW0pICsgXCInIGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubGltaXRzU2V0KSB7XG4gICAgICAgICAgICB0aGlzLm1heENhbGxzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubGltaXRzU2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWluQ2FsbHMgPSBudW07XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGF0TW9zdDogZnVuY3Rpb24gYXRNb3N0KG51bSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidcIiArIHZhbHVlVG9TdHJpbmcobnVtKSArIFwiJyBpcyBub3QgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpbWl0c1NldCkge1xuICAgICAgICAgICAgdGhpcy5taW5DYWxscyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxpbWl0c1NldCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1heENhbGxzID0gbnVtO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBuZXZlcjogZnVuY3Rpb24gbmV2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMCk7XG4gICAgfSxcblxuICAgIG9uY2U6IGZ1bmN0aW9uIG9uY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMSk7XG4gICAgfSxcblxuICAgIHR3aWNlOiBmdW5jdGlvbiB0d2ljZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhhY3RseSgyKTtcbiAgICB9LFxuXG4gICAgdGhyaWNlOiBmdW5jdGlvbiB0aHJpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMyk7XG4gICAgfSxcblxuICAgIGV4YWN0bHk6IGZ1bmN0aW9uIGV4YWN0bHkobnVtKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiJ1wiICsgdmFsdWVUb1N0cmluZyhudW0pICsgXCInIGlzIG5vdCBhIG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXRMZWFzdChudW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5hdE1vc3QobnVtKTtcbiAgICB9LFxuXG4gICAgbWV0OiBmdW5jdGlvbiBtZXQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5mYWlsZWQgJiYgcmVjZWl2ZWRNaW5DYWxscyh0aGlzKTtcbiAgICB9LFxuXG4gICAgdmVyaWZ5Q2FsbEFsbG93ZWQ6IGZ1bmN0aW9uIHZlcmlmeUNhbGxBbGxvd2VkKHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgICB2YXIgZXhwZWN0ZWRBcmd1bWVudHMgPSB0aGlzLmV4cGVjdGVkQXJndW1lbnRzO1xuXG4gICAgICAgIGlmIChyZWNlaXZlZE1heENhbGxzKHRoaXMpKSB7XG4gICAgICAgICAgICB0aGlzLmZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbCh0aGlzLm1ldGhvZCArIFwiIGFscmVhZHkgY2FsbGVkIFwiICsgdGltZXNJbldvcmRzKHRoaXMubWF4Q2FsbHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcImV4cGVjdGVkVGhpc1wiIGluIHRoaXMgJiYgdGhpcy5leHBlY3RlZFRoaXMgIT09IHRoaXNWYWx1ZSkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwodGhpcy5tZXRob2QgKyBcIiBjYWxsZWQgd2l0aCBcIiArIHZhbHVlVG9TdHJpbmcodGhpc1ZhbHVlKSArXG4gICAgICAgICAgICAgICAgXCIgYXMgdGhpc1ZhbHVlLCBleHBlY3RlZCBcIiArIHZhbHVlVG9TdHJpbmcodGhpcy5leHBlY3RlZFRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKFwiZXhwZWN0ZWRBcmd1bWVudHNcIiBpbiB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcmdzKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbCh0aGlzLm1ldGhvZCArIFwiIHJlY2VpdmVkIG5vIGFyZ3VtZW50cywgZXhwZWN0ZWQgXCIgK1xuICAgICAgICAgICAgICAgIGZvcm1hdChleHBlY3RlZEFyZ3VtZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgZXhwZWN0ZWRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbCh0aGlzLm1ldGhvZCArIFwiIHJlY2VpdmVkIHRvbyBmZXcgYXJndW1lbnRzIChcIiArIGZvcm1hdChhcmdzKSArXG4gICAgICAgICAgICAgICAgXCIpLCBleHBlY3RlZCBcIiArIGZvcm1hdChleHBlY3RlZEFyZ3VtZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZXhwZWN0c0V4YWN0QXJnQ291bnQgJiZcbiAgICAgICAgICAgIGFyZ3MubGVuZ3RoICE9PSBleHBlY3RlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKHRoaXMubWV0aG9kICsgXCIgcmVjZWl2ZWQgdG9vIG1hbnkgYXJndW1lbnRzIChcIiArIGZvcm1hdChhcmdzKSArXG4gICAgICAgICAgICAgICAgXCIpLCBleHBlY3RlZCBcIiArIGZvcm1hdChleHBlY3RlZEFyZ3VtZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwZWN0ZWRBcmd1bWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXhwZWN0ZWRBcmd1bWVudCwgaSkge1xuICAgICAgICAgICAgaWYgKCF2ZXJpZnlNYXRjaGVyKGV4cGVjdGVkQXJndW1lbnQsIGFyZ3NbaV0pKSB7XG4gICAgICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwodGhpcy5tZXRob2QgKyBcIiByZWNlaXZlZCB3cm9uZyBhcmd1bWVudHMgXCIgKyBmb3JtYXQoYXJncykgK1xuICAgICAgICAgICAgICAgICAgICBcIiwgZGlkbid0IG1hdGNoIFwiICsgZXhwZWN0ZWRBcmd1bWVudHMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGV4cGVjdGVkQXJndW1lbnQsIGFyZ3NbaV0pKSB7XG4gICAgICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwodGhpcy5tZXRob2QgKyBcIiByZWNlaXZlZCB3cm9uZyBhcmd1bWVudHMgXCIgKyBmb3JtYXQoYXJncykgK1xuICAgICAgICAgICAgICAgICAgICBcIiwgZXhwZWN0ZWQgXCIgKyBmb3JtYXQoZXhwZWN0ZWRBcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfSxcblxuICAgIGFsbG93c0NhbGw6IGZ1bmN0aW9uIGFsbG93c0NhbGwodGhpc1ZhbHVlLCBhcmdzKSB7XG4gICAgICAgIHZhciBleHBlY3RlZEFyZ3VtZW50cyA9IHRoaXMuZXhwZWN0ZWRBcmd1bWVudHM7XG5cbiAgICAgICAgaWYgKHRoaXMubWV0KCkgJiYgcmVjZWl2ZWRNYXhDYWxscyh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFwiZXhwZWN0ZWRUaGlzXCIgaW4gdGhpcyAmJiB0aGlzLmV4cGVjdGVkVGhpcyAhPT0gdGhpc1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShcImV4cGVjdGVkQXJndW1lbnRzXCIgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncyA9IGFyZ3MgfHwgW107XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgZXhwZWN0ZWRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCAmJlxuICAgICAgICAgICAgYXJncy5sZW5ndGggIT09IGV4cGVjdGVkQXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkQXJndW1lbnRzLmV2ZXJ5KGZ1bmN0aW9uIChleHBlY3RlZEFyZ3VtZW50LCBpKSB7XG4gICAgICAgICAgICBpZiAoIXZlcmlmeU1hdGNoZXIoZXhwZWN0ZWRBcmd1bWVudCwgYXJnc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGV4cGVjdGVkQXJndW1lbnQsIGFyZ3NbaV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHdpdGhBcmdzOiBmdW5jdGlvbiB3aXRoQXJncygpIHtcbiAgICAgICAgdGhpcy5leHBlY3RlZEFyZ3VtZW50cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHdpdGhFeGFjdEFyZ3M6IGZ1bmN0aW9uIHdpdGhFeGFjdEFyZ3MoKSB7XG4gICAgICAgIHRoaXMud2l0aEFyZ3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gb24odGhpc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0ZWRUaGlzID0gdGhpc1ZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSAodGhpcy5leHBlY3RlZEFyZ3VtZW50cyB8fCBbXSkuc2xpY2UoKTtcblxuICAgICAgICBpZiAoIXRoaXMuZXhwZWN0c0V4YWN0QXJnQ291bnQpIHtcbiAgICAgICAgICAgIHB1c2guY2FsbChhcmdzLCBcIlsuLi5dXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbGxTdHIgPSBzcHlDYWxsVG9TdHJpbmcuY2FsbCh7XG4gICAgICAgICAgICBwcm94eTogdGhpcy5tZXRob2QgfHwgXCJhbm9ueW1vdXMgbW9jayBleHBlY3RhdGlvblwiLFxuICAgICAgICAgICAgYXJnczogYXJnc1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgbWVzc2FnZSA9IGNhbGxTdHIucmVwbGFjZShcIiwgWy4uLlwiLCBcIlssIC4uLlwiKSArIFwiIFwiICtcbiAgICAgICAgICAgIGV4cGVjdGVkQ2FsbENvdW50SW5Xb3Jkcyh0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5tZXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiRXhwZWN0YXRpb24gbWV0OiBcIiArIG1lc3NhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJFeHBlY3RlZCBcIiArIG1lc3NhZ2UgKyBcIiAoXCIgK1xuICAgICAgICAgICAgY2FsbENvdW50SW5Xb3Jkcyh0aGlzLmNhbGxDb3VudCkgKyBcIilcIjtcbiAgICB9LFxuXG4gICAgdmVyaWZ5OiBmdW5jdGlvbiB2ZXJpZnkoKSB7XG4gICAgICAgIGlmICghdGhpcy5tZXQoKSkge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwodGhpcy50b1N0cmluZygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5wYXNzKHRoaXMudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgcGFzczogZnVuY3Rpb24gcGFzcyhtZXNzYWdlKSB7XG4gICAgICAgIGFzc2VydC5wYXNzKG1lc3NhZ2UpO1xuICAgIH0sXG5cbiAgICBmYWlsOiBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGV4Y2VwdGlvbiA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgZXhjZXB0aW9uLm5hbWUgPSBcIkV4cGVjdGF0aW9uRXJyb3JcIjtcblxuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBtb2NrRXhwZWN0YXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1vY2tFeHBlY3RhdGlvbiA9IHJlcXVpcmUoXCIuL21vY2stZXhwZWN0YXRpb25cIik7XG52YXIgc3B5Q2FsbFRvU3RyaW5nID0gcmVxdWlyZShcIi4vY2FsbFwiKS50b1N0cmluZztcbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZXh0ZW5kXCIpO1xudmFyIG1hdGNoID0gcmVxdWlyZShcIi4vbWF0Y2hcIik7XG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2RlZXAtZXF1YWxcIikudXNlKG1hdGNoKTtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dyYXAtbWV0aG9kXCIpO1xuXG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xuXG5mdW5jdGlvbiBtb2NrKG9iamVjdCkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBtb2NrRXhwZWN0YXRpb24uY3JlYXRlKFwiQW5vbnltb3VzIG1vY2tcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vY2suY3JlYXRlKG9iamVjdCk7XG59XG5cbmZ1bmN0aW9uIGVhY2goY29sbGVjdGlvbiwgY2FsbGJhY2spIHtcbiAgICB2YXIgY29sID0gY29sbGVjdGlvbiB8fCBbXTtcblxuICAgIGNvbC5mb3JFYWNoKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlFcXVhbHMoYXJyMSwgYXJyMiwgY29tcGFyZUxlbmd0aCkge1xuICAgIGlmIChjb21wYXJlTGVuZ3RoICYmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyMS5ldmVyeShmdW5jdGlvbiAoZWxlbWVudCwgaSkge1xuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGVsZW1lbnQsIGFycjJbaV0pO1xuXG4gICAgfSk7XG59XG5cbmV4dGVuZChtb2NrLCB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUob2JqZWN0KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwib2JqZWN0IGlzIG51bGxcIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbW9ja09iamVjdCA9IGV4dGVuZCh7fSwgbW9jayk7XG4gICAgICAgIG1vY2tPYmplY3Qub2JqZWN0ID0gb2JqZWN0O1xuICAgICAgICBkZWxldGUgbW9ja09iamVjdC5jcmVhdGU7XG5cbiAgICAgICAgcmV0dXJuIG1vY2tPYmplY3Q7XG4gICAgfSxcblxuICAgIGV4cGVjdHM6IGZ1bmN0aW9uIGV4cGVjdHMobWV0aG9kKSB7XG4gICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibWV0aG9kIGlzIGZhbHN5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4cGVjdGF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5leHBlY3RhdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMucHJveGllcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5mYWlsdXJlcyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4cGVjdGF0aW9uc1ttZXRob2RdKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGVjdGF0aW9uc1ttZXRob2RdID0gW107XG4gICAgICAgICAgICB2YXIgbW9ja09iamVjdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHdyYXBNZXRob2QodGhpcy5vYmplY3QsIG1ldGhvZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2NrT2JqZWN0Lmludm9rZU1ldGhvZChtZXRob2QsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcHVzaC5jYWxsKHRoaXMucHJveGllcywgbWV0aG9kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHBlY3RhdGlvbiA9IG1vY2tFeHBlY3RhdGlvbi5jcmVhdGUobWV0aG9kKTtcbiAgICAgICAgcHVzaC5jYWxsKHRoaXMuZXhwZWN0YXRpb25zW21ldGhvZF0sIGV4cGVjdGF0aW9uKTtcblxuICAgICAgICByZXR1cm4gZXhwZWN0YXRpb247XG4gICAgfSxcblxuICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgIHZhciBvYmplY3QgPSB0aGlzLm9iamVjdDtcblxuICAgICAgICBlYWNoKHRoaXMucHJveGllcywgZnVuY3Rpb24gKHByb3h5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iamVjdFtwcm94eV0ucmVzdG9yZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W3Byb3h5XS5yZXN0b3JlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB2ZXJpZnk6IGZ1bmN0aW9uIHZlcmlmeSgpIHtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9ucyA9IHRoaXMuZXhwZWN0YXRpb25zIHx8IHt9O1xuICAgICAgICB2YXIgbWVzc2FnZXMgPSB0aGlzLmZhaWx1cmVzID8gdGhpcy5mYWlsdXJlcy5zbGljZSgpIDogW107XG4gICAgICAgIHZhciBtZXQgPSBbXTtcblxuICAgICAgICBlYWNoKHRoaXMucHJveGllcywgZnVuY3Rpb24gKHByb3h5KSB7XG4gICAgICAgICAgICBlYWNoKGV4cGVjdGF0aW9uc1twcm94eV0sIGZ1bmN0aW9uIChleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICghZXhwZWN0YXRpb24ubWV0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaC5jYWxsKG1lc3NhZ2VzLCBleHBlY3RhdGlvbi50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwdXNoLmNhbGwobWV0LCBleHBlY3RhdGlvbi50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG5cbiAgICAgICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKG1lc3NhZ2VzLmNvbmNhdChtZXQpLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICB9IGVsc2UgaWYgKG1ldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24ucGFzcyhtZXNzYWdlcy5jb25jYXQobWV0KS5qb2luKFwiXFxuXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBpbnZva2VNZXRob2Q6IGZ1bmN0aW9uIGludm9rZU1ldGhvZChtZXRob2QsIHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgICAvKiBpZiB3ZSBjYW5ub3QgZmluZCBhbnkgbWF0Y2hpbmcgZmlsZXMgd2Ugd2lsbCBleHBsaWNpdGx5IGNhbGwgbW9ja0V4cGVjdGlvbiNmYWlsIHdpdGggZXJyb3IgbWVzc2FnZXMgKi9cbiAgICAgICAgLyogZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOiBcIm9mZlwiICovXG4gICAgICAgIHZhciBleHBlY3RhdGlvbnMgPSB0aGlzLmV4cGVjdGF0aW9ucyAmJiB0aGlzLmV4cGVjdGF0aW9uc1ttZXRob2RdID8gdGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSA6IFtdO1xuICAgICAgICB2YXIgY3VycmVudEFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgICAgICB2YXIgYXZhaWxhYmxlO1xuXG4gICAgICAgIHZhciBleHBlY3RhdGlvbnNXaXRoTWF0Y2hpbmdBcmdzID0gZXhwZWN0YXRpb25zLmZpbHRlcihmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIHZhciBleHBlY3RlZEFyZ3MgPSBleHBlY3RhdGlvbi5leHBlY3RlZEFyZ3VtZW50cyB8fCBbXTtcblxuICAgICAgICAgICAgcmV0dXJuIGFycmF5RXF1YWxzKGV4cGVjdGVkQXJncywgY3VycmVudEFyZ3MsIGV4cGVjdGF0aW9uLmV4cGVjdHNFeGFjdEFyZ0NvdW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uc1RvQXBwbHkgPSBleHBlY3RhdGlvbnNXaXRoTWF0Y2hpbmdBcmdzLmZpbHRlcihmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAhZXhwZWN0YXRpb24ubWV0KCkgJiYgZXhwZWN0YXRpb24uYWxsb3dzQ2FsbCh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZXhwZWN0YXRpb25zVG9BcHBseS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb25zVG9BcHBseVswXS5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1lc3NhZ2VzID0gW107XG4gICAgICAgIHZhciBleGhhdXN0ZWQgPSAwO1xuXG4gICAgICAgIGV4cGVjdGF0aW9uc1dpdGhNYXRjaGluZ0FyZ3MuZm9yRWFjaChmdW5jdGlvbiAoZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICAgIGlmIChleHBlY3RhdGlvbi5hbGxvd3NDYWxsKHRoaXNWYWx1ZSwgYXJncykpIHtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSBhdmFpbGFibGUgfHwgZXhwZWN0YXRpb247XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4aGF1c3RlZCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXZhaWxhYmxlICYmIGV4aGF1c3RlZCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZS5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhwZWN0YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICBwdXNoLmNhbGwobWVzc2FnZXMsIFwiICAgIFwiICsgZXhwZWN0YXRpb24udG9TdHJpbmcoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lc3NhZ2VzLnVuc2hpZnQoXCJVbmV4cGVjdGVkIGNhbGw6IFwiICsgc3B5Q2FsbFRvU3RyaW5nLmNhbGwoe1xuICAgICAgICAgICAgcHJveHk6IG1ldGhvZCxcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIC8vIFBoYW50b21KUyBkb2VzIG5vdCBzZXJpYWxpemUgdGhlIHN0YWNrIHRyYWNlIHVudGlsIHRoZSBlcnJvciBoYXMgYmVlbiB0aHJvd25cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkgey8qIGVtcHR5ICovfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmFpbHVyZXMucHVzaChcIlVuZXhwZWN0ZWQgY2FsbDogXCIgKyBzcHlDYWxsVG9TdHJpbmcuY2FsbCh7XG4gICAgICAgICAgICBwcm94eTogbWV0aG9kLFxuICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgIHN0YWNrOiBlcnIuc3RhY2tcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKG1lc3NhZ2VzLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vY2s7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNvbGxlY3RPd25NZXRob2RzID0gcmVxdWlyZShcIi4vY29sbGVjdC1vd24tbWV0aG9kc1wiKTtcbnZhciBkZXByZWNhdGVkID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2RlcHJlY2F0ZWRcIik7XG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIHN0dWJOb25GdW5jdGlvblByb3BlcnR5ID0gcmVxdWlyZShcIi4vc3R1Yi1ub24tZnVuY3Rpb24tcHJvcGVydHlcIik7XG52YXIgc2lub25TdHViID0gcmVxdWlyZShcIi4vc3R1YlwiKTtcbnZhciB0aHJvd09uRmFsc3lPYmplY3QgPSByZXF1aXJlKFwiLi90aHJvdy1vbi1mYWxzeS1vYmplY3RcIik7XG5cbi8vIFRoaXMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2Ygc2lub24uXG4vLyBXZSB3aWxsIG9ubHkgY29uc2lkZXIgcHVsbCByZXF1ZXN0cyB0aGF0IGZpeCBzZXJpb3VzIGJ1Z3MgaW4gdGhlIGltcGxlbWVudGF0aW9uXG5mdW5jdGlvbiBzYW5kYm94U3R1YihvYmplY3QsIHByb3BlcnR5LyosIHZhbHVlKi8pIHtcbiAgICBkZXByZWNhdGVkLnByaW50V2FybmluZyhcbiAgICAgIFwic2FuZGJveC5zdHViKG9iaiwgJ21ldGgnLCB2YWwpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIFwiICtcbiAgICAgIFwidGhlIHB1YmxpYyBBUEkgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBzaW5vbi5cIiArXG4gICAgICBcIlxcbiBVc2Ugc2FuZGJveC5zdHViKG9iaiwgJ21ldGgnKS5jYWxsc0Zha2UoZm4pIGluc3RlYWQgaW4gb3JkZXIgdG8gc3R1YiBhIGZ1bmN0aW9uLlwiICtcbiAgICAgIFwiXFxuIFVzZSBzYW5kYm94LnN0dWIob2JqLCAnbWV0aCcpLnZhbHVlKGZuKSBpbnN0ZWFkIGluIG9yZGVyIHRvIHN0dWIgYSBub24tZnVuY3Rpb24gdmFsdWUuXCJcbiAgICApO1xuXG4gICAgdGhyb3dPbkZhbHN5T2JqZWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgYWN0dWFsRGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICB2YXIgaXNTdHViYmluZ0VudGlyZU9iamVjdCA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiO1xuICAgIHZhciBpc1N0dWJiaW5nTm9uRnVuY1Byb3BlcnR5ID0gdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZW9mIHByb3BlcnR5ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHlwZW9mIGFjdHVhbERlc2NyaXB0b3IgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGVvZiBhY3R1YWxEZXNjcmlwdG9yLnZhbHVlICE9PSBcImZ1bmN0aW9uXCIpO1xuXG5cbiAgICAvLyBXaGVuIHBhc3NpbmcgYSB2YWx1ZSBhcyB0aGlyZCBhcmd1bWVudCBpdCB3aWxsIGJlIGFwcGxpZWQgdG8gc3R1Yk5vbkZ1bmN0aW9uUHJvcGVydHlcbiAgICB2YXIgc3R1YmJlZCA9IGlzU3R1YmJpbmdOb25GdW5jUHJvcGVydHkgP1xuICAgICAgICAgICAgICAgICAgICBzdHViTm9uRnVuY3Rpb25Qcm9wZXJ0eS5hcHBseShudWxsLCBhcmd1bWVudHMpIDpcbiAgICAgICAgICAgICAgICAgICAgc2lub25TdHViLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoaXNTdHViYmluZ0VudGlyZU9iamVjdCkge1xuICAgICAgICB2YXIgb3duTWV0aG9kcyA9IGNvbGxlY3RPd25NZXRob2RzKHN0dWJiZWQpO1xuICAgICAgICBvd25NZXRob2RzLmZvckVhY2godGhpcy5hZGQuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLnByb21pc2VMaWJyYXJ5KSB7XG4gICAgICAgICAgICBvd25NZXRob2RzLmZvckVhY2godGhpcy5hZGRVc2luZ1Byb21pc2UuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZChzdHViYmVkKTtcbiAgICAgICAgaWYgKHRoaXMucHJvbWlzZUxpYnJhcnkpIHtcbiAgICAgICAgICAgIHN0dWJiZWQudXNpbmdQcm9taXNlKHRoaXMucHJvbWlzZUxpYnJhcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0dWJiZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FuZGJveFN0dWI7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG52YXIgc2lub25Db2xsZWN0aW9uID0gcmVxdWlyZShcIi4vY29sbGVjdGlvblwiKTtcbnZhciBzaW5vbk1hdGNoID0gcmVxdWlyZShcIi4vbWF0Y2hcIik7XG52YXIgc2lub25Bc3NlcnQgPSByZXF1aXJlKFwiLi9hc3NlcnRcIik7XG52YXIgc2lub25DbG9jayA9IHJlcXVpcmUoXCIuL3V0aWwvZmFrZV90aW1lcnNcIik7XG52YXIgZmFrZVNlcnZlciA9IHJlcXVpcmUoXCIuL3V0aWwvZmFrZV9zZXJ2ZXJcIik7XG52YXIgZmFrZVhociA9IHJlcXVpcmUoXCIuL3V0aWwvZmFrZV94bWxfaHR0cF9yZXF1ZXN0XCIpO1xudmFyIGZha2VTZXJ2ZXJXaXRoQ2xvY2sgPSByZXF1aXJlKFwiLi91dGlsL2Zha2Vfc2VydmVyX3dpdGhfY2xvY2tcIik7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxudmFyIHNpbm9uU2FuZGJveCA9IE9iamVjdC5jcmVhdGUoc2lub25Db2xsZWN0aW9uKTtcblxuZnVuY3Rpb24gZXhwb3NlVmFsdWUoc2FuZGJveCwgY29uZmlnLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5pbmplY3RJbnRvICYmICEoa2V5IGluIGNvbmZpZy5pbmplY3RJbnRvKSkge1xuICAgICAgICBjb25maWcuaW5qZWN0SW50b1trZXldID0gdmFsdWU7XG4gICAgICAgIHNhbmRib3guaW5qZWN0ZWRLZXlzLnB1c2goa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoLmNhbGwoc2FuZGJveC5hcmdzLCB2YWx1ZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlU2FuZGJveEZyb21Db25maWcoY29uZmlnKSB7XG4gICAgdmFyIHNhbmRib3ggPSBPYmplY3QuY3JlYXRlKHNpbm9uU2FuZGJveCk7XG5cbiAgICBpZiAoY29uZmlnLnVzZUZha2VTZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcudXNlRmFrZVNlcnZlciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgc2FuZGJveC5zZXJ2ZXJQcm90b3R5cGUgPSBjb25maWcudXNlRmFrZVNlcnZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhbmRib3gudXNlRmFrZVNlcnZlcigpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcudXNlRmFrZVRpbWVycykge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy51c2VGYWtlVGltZXJzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBzYW5kYm94LnVzZUZha2VUaW1lcnMuYXBwbHkoc2FuZGJveCwgY29uZmlnLnVzZUZha2VUaW1lcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2FuZGJveC51c2VGYWtlVGltZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2FuZGJveDtcbn1cblxuZXh0ZW5kKHNpbm9uU2FuZGJveCwge1xuICAgIHVzZUZha2VUaW1lcnM6IGZ1bmN0aW9uIHVzZUZha2VUaW1lcnMoKSB7XG4gICAgICAgIHRoaXMuY2xvY2sgPSBzaW5vbkNsb2NrLnVzZUZha2VUaW1lcnMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZGQodGhpcy5jbG9jayk7XG4gICAgfSxcblxuICAgIHNlcnZlclByb3RvdHlwZTogZmFrZVNlcnZlcldpdGhDbG9jayxcblxuICAgIHVzZUZha2VTZXJ2ZXI6IGZ1bmN0aW9uIHVzZUZha2VTZXJ2ZXIoKSB7XG4gICAgICAgIHZhciBwcm90byA9IHRoaXMuc2VydmVyUHJvdG90eXBlIHx8IGZha2VTZXJ2ZXI7XG5cbiAgICAgICAgaWYgKCFwcm90byB8fCAhcHJvdG8uY3JlYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VydmVyID0gcHJvdG8uY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZCh0aGlzLnNlcnZlcik7XG4gICAgfSxcblxuICAgIHVzZUZha2VYTUxIdHRwUmVxdWVzdDogZnVuY3Rpb24gdXNlRmFrZVhNTEh0dHBSZXF1ZXN0KCkge1xuICAgICAgICB2YXIgeGhyID0gZmFrZVhoci51c2VGYWtlWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKHhocik7XG4gICAgfSxcblxuICAgIGluamVjdDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICBzaW5vbkNvbGxlY3Rpb24uaW5qZWN0LmNhbGwodGhpcywgb2JqKTtcblxuICAgICAgICBpZiAodGhpcy5jbG9jaykge1xuICAgICAgICAgICAgb2JqLmNsb2NrID0gdGhpcy5jbG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZlcikge1xuICAgICAgICAgICAgb2JqLnNlcnZlciA9IHRoaXMuc2VydmVyO1xuICAgICAgICAgICAgb2JqLnJlcXVlc3RzID0gdGhpcy5zZXJ2ZXIucmVxdWVzdHM7XG4gICAgICAgIH1cblxuICAgICAgICBvYmoubWF0Y2ggPSBzaW5vbk1hdGNoO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcblxuICAgIHVzaW5nUHJvbWlzZTogZnVuY3Rpb24gKHByb21pc2VMaWJyYXJ5KSB7XG5cbiAgICAgICAgdGhpcy5wcm9taXNlTGlicmFyeSA9IHByb21pc2VMaWJyYXJ5O1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICByZXN0b3JlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzYW5kYm94LnJlc3RvcmUoKSBkb2VzIG5vdCB0YWtlIGFueSBwYXJhbWV0ZXJzLiBQZXJoYXBzIHlvdSBtZWFudCBzdHViLnJlc3RvcmUoKVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNpbm9uQ29sbGVjdGlvbi5yZXN0b3JlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMucmVzdG9yZUNvbnRleHQoKTtcbiAgICB9LFxuXG4gICAgcmVzdG9yZUNvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluamVjdGVkS2V5cyA9IHRoaXMuaW5qZWN0ZWRLZXlzO1xuICAgICAgICB2YXIgaW5qZWN0SW50byA9IHRoaXMuaW5qZWN0SW50bztcblxuICAgICAgICBpZiAoIWluamVjdGVkS2V5cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGluamVjdGVkS2V5KSB7XG4gICAgICAgICAgICBkZWxldGUgaW5qZWN0SW50b1tpbmplY3RlZEtleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGluamVjdGVkS2V5cyA9IFtdO1xuICAgIH0sXG5cbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHNpbm9uU2FuZGJveCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2FuZGJveCA9IHByZXBhcmVTYW5kYm94RnJvbUNvbmZpZyhjb25maWcpO1xuICAgICAgICBzYW5kYm94LmFyZ3MgPSBzYW5kYm94LmFyZ3MgfHwgW107XG4gICAgICAgIHNhbmRib3guaW5qZWN0ZWRLZXlzID0gW107XG4gICAgICAgIHNhbmRib3guaW5qZWN0SW50byA9IGNvbmZpZy5pbmplY3RJbnRvO1xuICAgICAgICB2YXIgZXhwb3NlZCA9IHNhbmRib3guaW5qZWN0KHt9KTtcblxuICAgICAgICBpZiAoY29uZmlnLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbmZpZy5wcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBleHBvc2VkW3Byb3BdIHx8IHByb3AgPT09IFwic2FuZGJveFwiICYmIHNhbmRib3g7XG4gICAgICAgICAgICAgICAgZXhwb3NlVmFsdWUoc2FuZGJveCwgY29uZmlnLCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9zZVZhbHVlKHNhbmRib3gsIGNvbmZpZywgXCJzYW5kYm94XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgfSxcblxuICAgIG1hdGNoOiBzaW5vbk1hdGNoLFxuXG4gICAgYXNzZXJ0OiBzaW5vbkFzc2VydFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2lub25TYW5kYm94O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjb2xvciA9IHJlcXVpcmUoXCIuL2NvbG9yXCIpO1xudmFyIHRpbWVzSW5Xb3JkcyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS90aW1lcy1pbi13b3Jkc1wiKTtcbnZhciBzaW5vbkZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgc2lub25NYXRjaCA9IHJlcXVpcmUoXCIuL21hdGNoXCIpO1xudmFyIGpzRGlmZiA9IHJlcXVpcmUoXCJkaWZmXCIpO1xudmFyIHB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaDtcblxuZnVuY3Rpb24gY29sb3JTaW5vbk1hdGNoVGV4dChtYXRjaGVyLCBjYWxsZWRBcmcsIGNhbGxlZEFyZ01lc3NhZ2UpIHtcbiAgICBpZiAoIW1hdGNoZXIudGVzdChjYWxsZWRBcmcpKSB7XG4gICAgICAgIG1hdGNoZXIubWVzc2FnZSA9IGNvbG9yLnJlZChtYXRjaGVyLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoY2FsbGVkQXJnTWVzc2FnZSkge1xuICAgICAgICAgICAgY2FsbGVkQXJnTWVzc2FnZSA9IGNvbG9yLmdyZWVuKGNhbGxlZEFyZ01lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWxsZWRBcmdNZXNzYWdlICsgXCIgXCIgKyBtYXRjaGVyLm1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGNvbG9yRGlmZlRleHQoZGlmZikge1xuICAgIHZhciBvYmplY3RzID0gZGlmZi5tYXAoZnVuY3Rpb24gKHBhcnQpIHtcbiAgICAgICAgdmFyIHRleHQgPSBwYXJ0LnZhbHVlO1xuICAgICAgICBpZiAocGFydC5hZGRlZCkge1xuICAgICAgICAgICAgdGV4dCA9IGNvbG9yLmdyZWVuKHRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnQucmVtb3ZlZCkge1xuICAgICAgICAgICAgdGV4dCA9IGNvbG9yLnJlZCh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHRleHQgKz0gXCIgXCI7IC8vIGZvcm1hdCBzaW1wbGUgZGlmZnNcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKFwiXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjOiBmdW5jdGlvbiAoc3B5SW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVzSW5Xb3JkcyhzcHlJbnN0YW5jZS5jYWxsQ291bnQpO1xuICAgIH0sXG5cbiAgICBuOiBmdW5jdGlvbiAoc3B5SW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuIHNweUluc3RhbmNlLnRvU3RyaW5nKCk7XG4gICAgfSxcblxuICAgIEQ6IGZ1bmN0aW9uIChzcHlJbnN0YW5jZSwgYXJncykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9IFwiXCI7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBzcHlJbnN0YW5jZS5jYWxsQ291bnQ7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGRlc2NyaWJlIG11bHRpcGxlIGNhbGxzXG4gICAgICAgICAgICBpZiAobCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBcIlxcblwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9IFwiQ2FsbCBcIiArIChpICsgMSkgKyBcIjpcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjYWxsZWRBcmdzID0gc3B5SW5zdGFuY2UuZ2V0Q2FsbChpKS5hcmdzO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjYWxsZWRBcmdzLmxlbmd0aCB8fCBqIDwgYXJncy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gXCJcXG5cIjtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGVkQXJnTWVzc2FnZSA9IGogPCBjYWxsZWRBcmdzLmxlbmd0aCA/IHNpbm9uRm9ybWF0KGNhbGxlZEFyZ3Nbal0pIDogXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoc2lub25NYXRjaC5pc01hdGNoZXIoYXJnc1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBjb2xvclNpbm9uTWF0Y2hUZXh0KGFyZ3Nbal0sIGNhbGxlZEFyZ3Nbal0sIGNhbGxlZEFyZ01lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleHBlY3RlZEFyZ01lc3NhZ2UgPSBqIDwgYXJncy5sZW5ndGggPyBzaW5vbkZvcm1hdChhcmdzW2pdKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0ganNEaWZmLmRpZmZKc29uKGNhbGxlZEFyZ01lc3NhZ2UsIGV4cGVjdGVkQXJnTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gY29sb3JEaWZmVGV4dChkaWZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuXG4gICAgQzogZnVuY3Rpb24gKHNweUluc3RhbmNlKSB7XG4gICAgICAgIHZhciBjYWxscyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3B5SW5zdGFuY2UuY2FsbENvdW50OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgc3RyaW5naWZpZWRDYWxsID0gXCIgICAgXCIgKyBzcHlJbnN0YW5jZS5nZXRDYWxsKGkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoL1xcbi8udGVzdChjYWxsc1tpIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgc3RyaW5naWZpZWRDYWxsID0gXCJcXG5cIiArIHN0cmluZ2lmaWVkQ2FsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHB1c2guY2FsbChjYWxscywgc3RyaW5naWZpZWRDYWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxscy5sZW5ndGggPiAwID8gXCJcXG5cIiArIGNhbGxzLmpvaW4oXCJcXG5cIikgOiBcIlwiO1xuICAgIH0sXG5cbiAgICB0OiBmdW5jdGlvbiAoc3B5SW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHNweUluc3RhbmNlLmNhbGxDb3VudDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgcHVzaC5jYWxsKG9iamVjdHMsIHNpbm9uRm9ybWF0KHNweUluc3RhbmNlLnRoaXNWYWx1ZXNbaV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RzLmpvaW4oXCIsIFwiKTtcbiAgICB9LFxuXG4gICAgXCIqXCI6IGZ1bmN0aW9uIChzcHlJbnN0YW5jZSwgYXJncykge1xuICAgICAgICByZXR1cm4gYXJncy5tYXAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gc2lub25Gb3JtYXQoYXJnKTsgfSkuam9pbihcIiwgXCIpO1xuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2Z1bmN0aW9uLW5hbWVcIik7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mdW5jdGlvbi10by1zdHJpbmdcIik7XG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIHNpbm9uTWF0Y2ggPSByZXF1aXJlKFwiLi9tYXRjaFwiKTtcbnZhciBkZWVwRXF1YWwgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZGVlcC1lcXVhbFwiKS51c2Uoc2lub25NYXRjaCk7XG52YXIgc3B5Q2FsbCA9IHJlcXVpcmUoXCIuL2NhbGxcIik7XG52YXIgd3JhcE1ldGhvZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS93cmFwLW1ldGhvZFwiKTtcbnZhciBzaW5vbkZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS92YWx1ZS10by1zdHJpbmdcIik7XG5cbnZhciBwdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgY2FsbElkID0gMDtcbnZhciBFcnJvckNvbnN0cnVjdG9yID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5mdW5jdGlvbiBzcHkob2JqZWN0LCBwcm9wZXJ0eSwgdHlwZXMpIHtcbiAgICB2YXIgZGVzY3JpcHRvciwgbWV0aG9kRGVzYztcblxuICAgIGlmICghcHJvcGVydHkgJiYgdHlwZW9mIG9iamVjdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBzcHkuY3JlYXRlKG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKCFvYmplY3QgJiYgIXByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBzcHkuY3JlYXRlKGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0eXBlcykge1xuICAgICAgICByZXR1cm4gd3JhcE1ldGhvZChvYmplY3QsIHByb3BlcnR5LCBzcHkuY3JlYXRlKG9iamVjdFtwcm9wZXJ0eV0pKTtcbiAgICB9XG5cbiAgICBkZXNjcmlwdG9yID0ge307XG4gICAgbWV0aG9kRGVzYyA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgZGVzY3JpcHRvclt0eXBlXSA9IHNweS5jcmVhdGUobWV0aG9kRGVzY1t0eXBlXSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd3JhcE1ldGhvZChvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcbn1cblxuZnVuY3Rpb24gaW5jcmVtZW50Q2FsbENvdW50KCkge1xuICAgIHRoaXMuY2FsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNhbGxDb3VudCArPSAxO1xuICAgIHRoaXMubm90Q2FsbGVkID0gZmFsc2U7XG4gICAgdGhpcy5jYWxsZWRPbmNlID0gdGhpcy5jYWxsQ291bnQgPT09IDE7XG4gICAgdGhpcy5jYWxsZWRUd2ljZSA9IHRoaXMuY2FsbENvdW50ID09PSAyO1xuICAgIHRoaXMuY2FsbGVkVGhyaWNlID0gdGhpcy5jYWxsQ291bnQgPT09IDM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNhbGxQcm9wZXJ0aWVzKCkge1xuICAgIHRoaXMuZmlyc3RDYWxsID0gdGhpcy5nZXRDYWxsKDApO1xuICAgIHRoaXMuc2Vjb25kQ2FsbCA9IHRoaXMuZ2V0Q2FsbCgxKTtcbiAgICB0aGlzLnRoaXJkQ2FsbCA9IHRoaXMuZ2V0Q2FsbCgyKTtcbiAgICB0aGlzLmxhc3RDYWxsID0gdGhpcy5nZXRDYWxsKHRoaXMuY2FsbENvdW50IC0gMSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3h5KGZ1bmMsIHByb3h5TGVuZ3RoKSB7XG4gICAgLy8gUmV0YWluIHRoZSBmdW5jdGlvbiBsZW5ndGg6XG4gICAgdmFyIHA7XG4gICAgaWYgKHByb3h5TGVuZ3RoKSB7XG4gICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyB0byB1c2UgYW4gZXZhbC4gUHJvamVjdHMgdGhhdCBkZXBlbmQgb24gc2lub24gYmxvY2sgdGhlIHVzZSBvZiBldmFsLlxuICAgICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5vbmpzL3Npbm9uL2lzc3Vlcy83MTBcbiAgICAgICAgc3dpdGNoIChwcm94eUxlbmd0aCkge1xuICAgICAgICAgICAgLyplc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycywgbWF4LWxlbiovXG4gICAgICAgICAgICBjYXNlIDE6IHAgPSBmdW5jdGlvbiBwcm94eShhKSB7IHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykpOyB9OyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjogcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIpIHsgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7IH07IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOiBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYykgeyByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpKTsgfTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6IHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkKSB7IHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykpOyB9OyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTogcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUpIHsgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7IH07IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2OiBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZikgeyByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpKTsgfTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDc6IHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnKSB7IHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykpOyB9OyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgODogcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpIHsgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7IH07IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5OiBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgeyByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpKTsgfTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEwOiBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgeyByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpKTsgfTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDExOiBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgeyByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpKTsgfTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOiBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgeyByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpKTsgfTsgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiBwID0gZnVuY3Rpb24gcHJveHkoKSB7IHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykpOyB9OyBicmVhaztcbiAgICAgICAgICAgIC8qZXNsaW50LWVuYWJsZSovXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoKSB7XG4gICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcC5pc1Npbm9uUHJveHkgPSB0cnVlO1xuICAgIHJldHVybiBwO1xufVxuXG52YXIgdXVpZCA9IDA7XG5cbi8vIFB1YmxpYyBBUElcbnZhciBzcHlBcGkgPSB7XG4gICAgZm9ybWF0dGVyczogcmVxdWlyZShcIi4vc3B5LWZvcm1hdHRlcnNcIiksXG5cbiAgICByZXNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pbnZva2luZykge1xuICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIkNhbm5vdCByZXNldCBTaW5vbiBmdW5jdGlvbiB3aGlsZSBpbnZva2luZyBpdC4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk1vdmUgdGhlIGNhbGwgdG8gLnJlc2V0IG91dHNpZGUgb2YgdGhlIGNhbGxiYWNrLlwiKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gXCJJbnZhbGlkUmVzZXRFeGNlcHRpb25cIjtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYWxsZWRPbmNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsbGVkVHdpY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsZWRUaHJpY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmZpcnN0Q2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2Vjb25kQ2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMudGhpcmRDYWxsID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0Q2FsbCA9IG51bGw7XG4gICAgICAgIHRoaXMuYXJncyA9IFtdO1xuICAgICAgICB0aGlzLnJldHVyblZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLnRoaXNWYWx1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5leGNlcHRpb25zID0gW107XG4gICAgICAgIHRoaXMuY2FsbElkcyA9IFtdO1xuICAgICAgICB0aGlzLmVycm9yc1dpdGhDYWxsU3RhY2sgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuZmFrZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmFrZXMuZm9yRWFjaChmdW5jdGlvbiAoZmFrZSkge1xuICAgICAgICAgICAgICAgIGlmIChmYWtlLnJlc2V0SGlzdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICBmYWtlLnJlc2V0SGlzdG9yeSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZha2UucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZShmdW5jLCBzcHlMZW5ndGgpIHtcbiAgICAgICAgdmFyIG5hbWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuYW1lID0gZnVuY3Rpb25OYW1lKGZ1bmMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzcHlMZW5ndGgpIHtcbiAgICAgICAgICAgIHNweUxlbmd0aCA9IGZ1bmMubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb3h5ID0gY3JlYXRlUHJveHkoZnVuYywgc3B5TGVuZ3RoKTtcblxuICAgICAgICBleHRlbmQocHJveHksIHNweSk7XG4gICAgICAgIGRlbGV0ZSBwcm94eS5jcmVhdGU7XG4gICAgICAgIGV4dGVuZChwcm94eSwgZnVuYyk7XG5cbiAgICAgICAgcHJveHkucmVzZXQoKTtcbiAgICAgICAgcHJveHkucHJvdG90eXBlID0gZnVuYy5wcm90b3R5cGU7XG4gICAgICAgIHByb3h5LmRpc3BsYXlOYW1lID0gbmFtZSB8fCBcInNweVwiO1xuICAgICAgICBwcm94eS50b1N0cmluZyA9IGZ1bmN0aW9uVG9TdHJpbmc7XG4gICAgICAgIHByb3h5Lmluc3RhbnRpYXRlRmFrZSA9IHNweS5jcmVhdGU7XG4gICAgICAgIHByb3h5LmlkID0gXCJzcHkjXCIgKyB1dWlkKys7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH0sXG5cbiAgICBpbnZva2U6IGZ1bmN0aW9uIGludm9rZShmdW5jLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIG1hdGNoaW5ncyA9IHRoaXMubWF0Y2hpbmdGYWtlcyhhcmdzKTtcbiAgICAgICAgdmFyIGN1cnJlbnRDYWxsSWQgPSBjYWxsSWQrKztcbiAgICAgICAgdmFyIGV4Y2VwdGlvbiwgcmV0dXJuVmFsdWU7XG5cbiAgICAgICAgaW5jcmVtZW50Q2FsbENvdW50LmNhbGwodGhpcyk7XG4gICAgICAgIHB1c2guY2FsbCh0aGlzLnRoaXNWYWx1ZXMsIHRoaXNWYWx1ZSk7XG4gICAgICAgIHB1c2guY2FsbCh0aGlzLmFyZ3MsIGFyZ3MpO1xuICAgICAgICBwdXNoLmNhbGwodGhpcy5jYWxsSWRzLCBjdXJyZW50Q2FsbElkKTtcbiAgICAgICAgbWF0Y2hpbmdzLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICBpbmNyZW1lbnRDYWxsQ291bnQuY2FsbChtYXRjaGluZyk7XG4gICAgICAgICAgICBwdXNoLmNhbGwobWF0Y2hpbmcudGhpc1ZhbHVlcywgdGhpc1ZhbHVlKTtcbiAgICAgICAgICAgIHB1c2guY2FsbChtYXRjaGluZy5hcmdzLCBhcmdzKTtcbiAgICAgICAgICAgIHB1c2guY2FsbChtYXRjaGluZy5jYWxsSWRzLCBjdXJyZW50Q2FsbElkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFrZSBjYWxsIHByb3BlcnRpZXMgYXZhaWxhYmxlIGZyb20gd2l0aGluIHRoZSBzcGllZCBmdW5jdGlvbjpcbiAgICAgICAgY3JlYXRlQ2FsbFByb3BlcnRpZXMuY2FsbCh0aGlzKTtcbiAgICAgICAgbWF0Y2hpbmdzLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICBjcmVhdGVDYWxsUHJvcGVydGllcy5jYWxsKG1hdGNoaW5nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9ICh0aGlzLmZ1bmMgfHwgZnVuYykuYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcblxuICAgICAgICAgICAgdmFyIHRoaXNDYWxsID0gdGhpcy5nZXRDYWxsKHRoaXMuY2FsbENvdW50IC0gMSk7XG4gICAgICAgICAgICBpZiAodGhpc0NhbGwuY2FsbGVkV2l0aE5ldygpICYmIHR5cGVvZiByZXR1cm5WYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gdGhpc1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleGNlcHRpb24gPSBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW52b2tpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoLmNhbGwodGhpcy5leGNlcHRpb25zLCBleGNlcHRpb24pO1xuICAgICAgICBwdXNoLmNhbGwodGhpcy5yZXR1cm5WYWx1ZXMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgbWF0Y2hpbmdzLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICBwdXNoLmNhbGwobWF0Y2hpbmcuZXhjZXB0aW9ucywgZXhjZXB0aW9uKTtcbiAgICAgICAgICAgIHB1c2guY2FsbChtYXRjaGluZy5yZXR1cm5WYWx1ZXMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvckNvbnN0cnVjdG9yKCk7XG4gICAgICAgIC8vIDEuIFBsZWFzZSBkbyBub3QgZ2V0IHN0YWNrIGF0IHRoaXMgcG9pbnQuIEl0IG1heSBiZSBzbyB2ZXJ5IHNsb3csIGFuZCBub3QgYWN0dWFsbHkgdXNlZFxuICAgICAgICAvLyAyLiBQaGFudG9tSlMgZG9lcyBub3Qgc2VyaWFsaXplIHRoZSBzdGFjayB0cmFjZSB1bnRpbCB0aGUgZXJyb3IgaGFzIGJlZW4gdGhyb3duOlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvci9TdGFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGNhdGNoIChlKSB7LyogZW1wdHkgKi99XG4gICAgICAgIHB1c2guY2FsbCh0aGlzLmVycm9yc1dpdGhDYWxsU3RhY2ssIGVycik7XG4gICAgICAgIG1hdGNoaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRjaGluZykge1xuICAgICAgICAgICAgcHVzaC5jYWxsKG1hdGNoaW5nLmVycm9yc1dpdGhDYWxsU3RhY2ssIGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1ha2UgcmV0dXJuIHZhbHVlIGFuZCBleGNlcHRpb24gYXZhaWxhYmxlIGluIHRoZSBjYWxsczpcbiAgICAgICAgY3JlYXRlQ2FsbFByb3BlcnRpZXMuY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAoZXhjZXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9LFxuXG4gICAgbmFtZWQ6IGZ1bmN0aW9uIG5hbWVkKG5hbWUpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBnZXRDYWxsOiBmdW5jdGlvbiBnZXRDYWxsKGkpIHtcbiAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5jYWxsQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNweUNhbGwodGhpcywgdGhpcy50aGlzVmFsdWVzW2ldLCB0aGlzLmFyZ3NbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWVzW2ldLCB0aGlzLmV4Y2VwdGlvbnNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbElkc1tpXSwgdGhpcy5lcnJvcnNXaXRoQ2FsbFN0YWNrW2ldKTtcbiAgICB9LFxuXG4gICAgZ2V0Q2FsbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbGxzID0gW107XG4gICAgICAgIHZhciBpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNhbGxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjYWxscy5wdXNoKHRoaXMuZ2V0Q2FsbChpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsbHM7XG4gICAgfSxcblxuICAgIGNhbGxlZEJlZm9yZTogZnVuY3Rpb24gY2FsbGVkQmVmb3JlKHNweUZuKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3B5Rm4uY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZHNbMF0gPCBzcHlGbi5jYWxsSWRzW3NweUZuLmNhbGxJZHMubGVuZ3RoIC0gMV07XG4gICAgfSxcblxuICAgIGNhbGxlZEFmdGVyOiBmdW5jdGlvbiBjYWxsZWRBZnRlcihzcHlGbikge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbGVkIHx8ICFzcHlGbi5jYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZHNbdGhpcy5jYWxsQ291bnQgLSAxXSA+IHNweUZuLmNhbGxJZHNbMF07XG4gICAgfSxcblxuICAgIGNhbGxlZEltbWVkaWF0ZWx5QmVmb3JlOiBmdW5jdGlvbiBjYWxsZWRJbW1lZGlhdGVseUJlZm9yZShzcHlGbikge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbGVkIHx8ICFzcHlGbi5jYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZHNbdGhpcy5jYWxsQ291bnQgLSAxXSA9PT0gc3B5Rm4uY2FsbElkc1tzcHlGbi5jYWxsQ291bnQgLSAxXSAtIDE7XG4gICAgfSxcblxuICAgIGNhbGxlZEltbWVkaWF0ZWx5QWZ0ZXI6IGZ1bmN0aW9uIGNhbGxlZEltbWVkaWF0ZWx5QWZ0ZXIoc3B5Rm4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCB8fCAhc3B5Rm4uY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWRzW3RoaXMuY2FsbENvdW50IC0gMV0gPT09IHNweUZuLmNhbGxJZHNbc3B5Rm4uY2FsbENvdW50IC0gMV0gKyAxO1xuICAgIH0sXG5cbiAgICB3aXRoQXJnczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICAgICAgICBpZiAodGhpcy5mYWtlcykge1xuICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gdGhpcy5tYXRjaGluZ0Zha2VzKGFyZ3MsIHRydWUpLnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZha2VzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb3JpZ2luYWwgPSB0aGlzO1xuICAgICAgICB2YXIgZmFrZSA9IHRoaXMuaW5zdGFudGlhdGVGYWtlKCk7XG4gICAgICAgIGZha2UubWF0Y2hpbmdBcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICBmYWtlLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIHB1c2guY2FsbCh0aGlzLmZha2VzLCBmYWtlKTtcblxuICAgICAgICBmYWtlLndpdGhBcmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLndpdGhBcmdzLmFwcGx5KG9yaWdpbmFsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9yaWdpbmFsLmFyZ3MuZm9yRWFjaChmdW5jdGlvbiAoYXJnLCBpKSB7XG4gICAgICAgICAgICBpZiAoIWZha2UubWF0Y2hlcyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmNyZW1lbnRDYWxsQ291bnQuY2FsbChmYWtlKTtcbiAgICAgICAgICAgIHB1c2guY2FsbChmYWtlLnRoaXNWYWx1ZXMsIG9yaWdpbmFsLnRoaXNWYWx1ZXNbaV0pO1xuICAgICAgICAgICAgcHVzaC5jYWxsKGZha2UuYXJncywgYXJnKTtcbiAgICAgICAgICAgIHB1c2guY2FsbChmYWtlLnJldHVyblZhbHVlcywgb3JpZ2luYWwucmV0dXJuVmFsdWVzW2ldKTtcbiAgICAgICAgICAgIHB1c2guY2FsbChmYWtlLmV4Y2VwdGlvbnMsIG9yaWdpbmFsLmV4Y2VwdGlvbnNbaV0pO1xuICAgICAgICAgICAgcHVzaC5jYWxsKGZha2UuY2FsbElkcywgb3JpZ2luYWwuY2FsbElkc1tpXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNyZWF0ZUNhbGxQcm9wZXJ0aWVzLmNhbGwoZmFrZSk7XG5cbiAgICAgICAgcmV0dXJuIGZha2U7XG4gICAgfSxcblxuICAgIG1hdGNoaW5nRmFrZXM6IGZ1bmN0aW9uIChhcmdzLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZha2VzIHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGZha2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWtlLm1hdGNoZXMoYXJncywgc3RyaWN0KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIG1hdGNoZXM6IGZ1bmN0aW9uIChhcmdzLCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIG1hcmdzID0gdGhpcy5tYXRjaGluZ0FyZ3VtZW50cztcblxuICAgICAgICBpZiAobWFyZ3MubGVuZ3RoIDw9IGFyZ3MubGVuZ3RoICYmXG4gICAgICAgICAgICBkZWVwRXF1YWwobWFyZ3MsIGFyZ3Muc2xpY2UoMCwgbWFyZ3MubGVuZ3RoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiAhc3RyaWN0IHx8IG1hcmdzLmxlbmd0aCA9PT0gYXJncy5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBwcmludGY6IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgdmFyIHNweUluc3RhbmNlID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHZhciBmb3JtYXR0ZXI7XG5cbiAgICAgICAgcmV0dXJuIChmb3JtYXQgfHwgXCJcIikucmVwbGFjZSgvJSguKS9nLCBmdW5jdGlvbiAobWF0Y2gsIHNwZWNpZnllcikge1xuICAgICAgICAgICAgZm9ybWF0dGVyID0gc3B5QXBpLmZvcm1hdHRlcnNbc3BlY2lmeWVyXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuY2FsbChudWxsLCBzcHlJbnN0YW5jZSwgYXJncyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihwYXJzZUludChzcGVjaWZ5ZXIsIDEwKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lub25Gb3JtYXQoYXJnc1tzcGVjaWZ5ZXIgLSAxXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBcIiVcIiArIHNwZWNpZnllcjtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gZGVsZWdhdGVUb0NhbGxzKG1ldGhvZCwgbWF0Y2hBbnksIGFjdHVhbCwgbm90Q2FsbGVkKSB7XG4gICAgc3B5QXBpW21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWxsZWQpIHtcbiAgICAgICAgICAgIGlmIChub3RDYWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm90Q2FsbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3VycmVudENhbGw7XG4gICAgICAgIHZhciBtYXRjaGVzID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuY2FsbENvdW50OyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjdXJyZW50Q2FsbCA9IHRoaXMuZ2V0Q2FsbChpKTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDYWxsW2FjdHVhbCB8fCBtZXRob2RdLmFwcGx5KGN1cnJlbnRDYWxsLCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcyArPSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoQW55KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaGVzID09PSB0aGlzLmNhbGxDb3VudDtcbiAgICB9O1xufVxuXG5kZWxlZ2F0ZVRvQ2FsbHMoXCJjYWxsZWRPblwiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhcImFsd2F5c0NhbGxlZE9uXCIsIGZhbHNlLCBcImNhbGxlZE9uXCIpO1xuZGVsZWdhdGVUb0NhbGxzKFwiY2FsbGVkV2l0aFwiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhcImNhbGxlZFdpdGhNYXRjaFwiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhcImFsd2F5c0NhbGxlZFdpdGhcIiwgZmFsc2UsIFwiY2FsbGVkV2l0aFwiKTtcbmRlbGVnYXRlVG9DYWxscyhcImFsd2F5c0NhbGxlZFdpdGhNYXRjaFwiLCBmYWxzZSwgXCJjYWxsZWRXaXRoTWF0Y2hcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJjYWxsZWRXaXRoRXhhY3RseVwiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhcImFsd2F5c0NhbGxlZFdpdGhFeGFjdGx5XCIsIGZhbHNlLCBcImNhbGxlZFdpdGhFeGFjdGx5XCIpO1xuZGVsZWdhdGVUb0NhbGxzKFwibmV2ZXJDYWxsZWRXaXRoXCIsIGZhbHNlLCBcIm5vdENhbGxlZFdpdGhcIiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cnVlO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJuZXZlckNhbGxlZFdpdGhNYXRjaFwiLCBmYWxzZSwgXCJub3RDYWxsZWRXaXRoTWF0Y2hcIiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cnVlO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJ0aHJld1wiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhcImFsd2F5c1RocmV3XCIsIGZhbHNlLCBcInRocmV3XCIpO1xuZGVsZWdhdGVUb0NhbGxzKFwicmV0dXJuZWRcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJhbHdheXNSZXR1cm5lZFwiLCBmYWxzZSwgXCJyZXR1cm5lZFwiKTtcbmRlbGVnYXRlVG9DYWxscyhcImNhbGxlZFdpdGhOZXdcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJhbHdheXNDYWxsZWRXaXRoTmV3XCIsIGZhbHNlLCBcImNhbGxlZFdpdGhOZXdcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJjYWxsQXJnXCIsIGZhbHNlLCBcImNhbGxBcmdXaXRoXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50b1N0cmluZygpICsgXCIgY2Fubm90IGNhbGwgYXJnIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuXCIpO1xufSk7XG5zcHlBcGkuY2FsbEFyZ1dpdGggPSBzcHlBcGkuY2FsbEFyZztcbmRlbGVnYXRlVG9DYWxscyhcImNhbGxBcmdPblwiLCBmYWxzZSwgXCJjYWxsQXJnT25XaXRoXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50b1N0cmluZygpICsgXCIgY2Fubm90IGNhbGwgYXJnIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuXCIpO1xufSk7XG5zcHlBcGkuY2FsbEFyZ09uV2l0aCA9IHNweUFwaS5jYWxsQXJnT247XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJ0aHJvd0FyZ1wiLCBmYWxzZSwgXCJ0aHJvd0FyZ1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB0aHJvdyBhcmcgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5cIik7XG59KTtcbmRlbGVnYXRlVG9DYWxscyhcInlpZWxkXCIsIGZhbHNlLCBcInlpZWxkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50b1N0cmluZygpICsgXCIgY2Fubm90IHlpZWxkIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuXCIpO1xufSk7XG4vLyBcImludm9rZUNhbGxiYWNrXCIgaXMgYW4gYWxpYXMgZm9yIFwieWllbGRcIiBzaW5jZSBcInlpZWxkXCIgaXMgaW52YWxpZCBpbiBzdHJpY3QgbW9kZS5cbnNweUFwaS5pbnZva2VDYWxsYmFjayA9IHNweUFwaS55aWVsZDtcbmRlbGVnYXRlVG9DYWxscyhcInlpZWxkT25cIiwgZmFsc2UsIFwieWllbGRPblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB5aWVsZCBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiKTtcbn0pO1xuZGVsZWdhdGVUb0NhbGxzKFwieWllbGRUb1wiLCBmYWxzZSwgXCJ5aWVsZFRvXCIsIGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcih0aGlzLnRvU3RyaW5nKCkgKyBcIiBjYW5ub3QgeWllbGQgdG8gJ1wiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkgK1xuICAgICAgICBcIicgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5cIik7XG59KTtcbmRlbGVnYXRlVG9DYWxscyhcInlpZWxkVG9PblwiLCBmYWxzZSwgXCJ5aWVsZFRvT25cIiwgZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB5aWVsZCB0byAnXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArXG4gICAgICAgIFwiJyBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiKTtcbn0pO1xuXG5leHRlbmQoc3B5LCBzcHlBcGkpO1xuc3B5LnNweUNhbGwgPSBzcHlDYWxsO1xubW9kdWxlLmV4cG9ydHMgPSBzcHk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGRlcHJlY2F0ZWQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZGVwcmVjYXRlZFwiKTtcbnZhciBzcHkgPSByZXF1aXJlKFwiLi9zcHlcIik7XG52YXIgd3JhcE1ldGhvZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS93cmFwLW1ldGhvZFwiKTtcblxuLy8gVGhpcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBzaW5vbi5cbi8vIFdlIHdpbGwgb25seSBjb25zaWRlciBwdWxsIHJlcXVlc3RzIHRoYXQgZml4IHNlcmlvdXMgYnVncyBpbiB0aGUgaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIHN0dWJEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpIHtcbiAgICB2YXIgd3JhcHBlcjtcblxuICAgIGRlcHJlY2F0ZWQucHJpbnRXYXJuaW5nKFxuICAgICAgXCJzaW5vbi5zdHViKG9iaiwgJ21ldGgnLCBmbikgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGZyb20gXCIgK1xuICAgICAgXCJ0aGUgcHVibGljIEFQSSBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHNpbm9uLlwiICtcbiAgICAgIFwiXFxuIFVzZSBzdHViKG9iaiwgJ21ldGgnKS5jYWxsc0Zha2UoZm4pLlwiICtcbiAgICAgIFwiXFxuIENvZGVtb2QgYXZhaWxhYmxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9odXJyeW1hcGxlbGFkL3Npbm9uLWNvZGVtb2RcIlxuICAgICk7XG5cbiAgICBpZiAoISFkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGRlc2NyaXB0b3IgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkN1c3RvbSBzdHViIHNob3VsZCBiZSBhIHByb3BlcnR5IGRlc2NyaXB0b3JcIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgcHJvcGVydHkgZGVzY3JpcHRvciB0byBoYXZlIGF0IGxlYXN0IG9uZSBrZXlcIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgd3JhcHBlciA9IHNweSAmJiBzcHkuY3JlYXRlID8gc3B5LmNyZWF0ZShkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd3JhcHBlciA9IGRlc2NyaXB0b3I7XG4gICAgICAgIGlmIChzcHkgJiYgc3B5LmNyZWF0ZSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMod3JhcHBlcikuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXJbdHlwZV0gPSBzcHkuY3JlYXRlKHdyYXBwZXJbdHlwZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcE1ldGhvZChvYmplY3QsIHByb3BlcnR5LCB3cmFwcGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRGVzY3JpcHRvcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIHdhbGsgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvd2Fsa1wiKTtcblxuZnVuY3Rpb24gc3R1YkVudGlyZU9iamVjdChzdHViLCBvYmplY3QpIHtcbiAgICB3YWxrKG9iamVjdCB8fCB7fSwgZnVuY3Rpb24gKHByb3AsIHByb3BPd25lcikge1xuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHN0dWIgdGhpbmdzIGxpa2UgdG9TdHJpbmcoKSwgdmFsdWVPZigpLCBldGMuIHNvIHdlIG9ubHkgc3R1YiBpZiB0aGUgb2JqZWN0XG4gICAgICAgIC8vIGlzIG5vdCBPYmplY3QucHJvdG90eXBlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BPd25lciAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJlxuICAgICAgICAgICAgcHJvcCAhPT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BPd25lciwgcHJvcCkudmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHN0dWIob2JqZWN0LCBwcm9wKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRW50aXJlT2JqZWN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3ZhbHVlLXRvLXN0cmluZ1wiKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHN0dWJOb25GdW5jdGlvblByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgdmFyIG9yaWdpbmFsID0gb2JqZWN0W3Byb3BlcnR5XTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHN0dWIgbm9uLWV4aXN0ZW50IG93biBwcm9wZXJ0eSBcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpKTtcbiAgICB9XG5cbiAgICBvYmplY3RbcHJvcGVydHldID0gdmFsdWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0b3JlOiBmdW5jdGlvbiByZXN0b3JlKCkge1xuICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IG9yaWdpbmFsO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViTm9uRnVuY3Rpb25Qcm9wZXJ0eTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYmVoYXZpb3IgPSByZXF1aXJlKFwiLi9iZWhhdmlvclwiKTtcbnZhciBiZWhhdmlvcnMgPSByZXF1aXJlKFwiLi9kZWZhdWx0LWJlaGF2aW9yc1wiKTtcbnZhciBzcHkgPSByZXF1aXJlKFwiLi9zcHlcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2V4dGVuZFwiKTtcbnZhciBmdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2Z1bmN0aW9uLXRvLXN0cmluZ1wiKTtcbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgd3JhcE1ldGhvZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS93cmFwLW1ldGhvZFwiKTtcbnZhciBzdHViRW50aXJlT2JqZWN0ID0gcmVxdWlyZShcIi4vc3R1Yi1lbnRpcmUtb2JqZWN0XCIpO1xudmFyIHN0dWJEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vc3R1Yi1kZXNjcmlwdG9yXCIpO1xudmFyIHRocm93T25GYWxzeU9iamVjdCA9IHJlcXVpcmUoXCIuL3Rocm93LW9uLWZhbHN5LW9iamVjdFwiKTtcblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5mdW5jdGlvbiBzdHViKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpIHtcbiAgICB0aHJvd09uRmFsc3lPYmplY3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgIHZhciBhY3R1YWxEZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuICAgIHZhciBpc1N0dWJiaW5nRW50aXJlT2JqZWN0ID0gdHlwZW9mIHByb3BlcnR5ID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCI7XG4gICAgdmFyIGlzQ3JlYXRpbmdOZXdTdHViID0gIW9iamVjdCAmJiB0eXBlb2YgcHJvcGVydHkgPT09IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzU3R1YmJpbmdEZXNjcmlwdG9yID0gb2JqZWN0ICYmIHByb3BlcnR5ICYmIEJvb2xlYW4oZGVzY3JpcHRvcik7XG4gICAgdmFyIGlzU3R1YmJpbmdOb25GdW5jUHJvcGVydHkgPSAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqZWN0ID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlb2YgcHJvcGVydHkgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICh0eXBlb2YgYWN0dWFsRGVzY3JpcHRvciA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZW9mIGFjdHVhbERlc2NyaXB0b3IudmFsdWUgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGVvZiBkZXNjcmlwdG9yID09PSBcInVuZGVmaW5lZFwiO1xuICAgIHZhciBpc1N0dWJiaW5nRXhpc3RpbmdNZXRob2QgPSAhaXNTdHViYmluZ0Rlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGVvZiBhY3R1YWxEZXNjcmlwdG9yICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlb2YgYWN0dWFsRGVzY3JpcHRvci52YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIHZhciBhcml0eSA9IGlzU3R1YmJpbmdFeGlzdGluZ01ldGhvZCA/IG9iamVjdFtwcm9wZXJ0eV0ubGVuZ3RoIDogMDtcblxuICAgIGlmIChpc1N0dWJiaW5nRW50aXJlT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBzdHViRW50aXJlT2JqZWN0KHN0dWIsIG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3R1YmJpbmdEZXNjcmlwdG9yKSB7XG4gICAgICAgIHJldHVybiBzdHViRGVzY3JpcHRvci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGlmIChpc0NyZWF0aW5nTmV3U3R1Yikge1xuICAgICAgICByZXR1cm4gc3R1Yi5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICB2YXIgcyA9IHN0dWIuY3JlYXRlKGFyaXR5KTtcbiAgICBzLnJvb3RPYmogPSBvYmplY3Q7XG4gICAgcy5wcm9wTmFtZSA9IHByb3BlcnR5O1xuICAgIHMucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgIGlmIChhY3R1YWxEZXNjcmlwdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBhY3R1YWxEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldO1xuICAgIH07XG5cbiAgICByZXR1cm4gaXNTdHViYmluZ05vbkZ1bmNQcm9wZXJ0eSA/IHMgOiB3cmFwTWV0aG9kKG9iamVjdCwgcHJvcGVydHksIHMpO1xufVxuXG5zdHViLmNyZWF0ZVN0dWJJbnN0YW5jZSA9IGZ1bmN0aW9uIChjb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0dWIoT2JqZWN0LmNyZWF0ZShjb25zdHJ1Y3Rvci5wcm90b3R5cGUpKTtcbn07XG5cbi8qZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZnVuY3Rpb24gZ2V0UGFyZW50QmVoYXZpb3VyKHN0dWJJbnN0YW5jZSkge1xuICAgIHJldHVybiAoc3R1Ykluc3RhbmNlLnBhcmVudCAmJiBnZXRDdXJyZW50QmVoYXZpb3Ioc3R1Ykluc3RhbmNlLnBhcmVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0QmVoYXZpb3Ioc3R1Ykluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN0dWJJbnN0YW5jZS5kZWZhdWx0QmVoYXZpb3IgfHxcbiAgICAgICAgICAgIGdldFBhcmVudEJlaGF2aW91cihzdHViSW5zdGFuY2UpIHx8XG4gICAgICAgICAgICBiZWhhdmlvci5jcmVhdGUoc3R1Ykluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEJlaGF2aW9yKHN0dWJJbnN0YW5jZSkge1xuICAgIHZhciBjdXJyZW50QmVoYXZpb3IgPSBzdHViSW5zdGFuY2UuYmVoYXZpb3JzW3N0dWJJbnN0YW5jZS5jYWxsQ291bnQgLSAxXTtcbiAgICByZXR1cm4gY3VycmVudEJlaGF2aW9yICYmIGN1cnJlbnRCZWhhdmlvci5pc1ByZXNlbnQoKSA/IGN1cnJlbnRCZWhhdmlvciA6IGdldERlZmF1bHRCZWhhdmlvcihzdHViSW5zdGFuY2UpO1xufVxuLyplc2xpbnQtZW5hYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cblxudmFyIHV1aWQgPSAwO1xuXG52YXIgcHJvdG8gPSB7XG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoc3R1Ykxlbmd0aCkge1xuICAgICAgICB2YXIgZnVuY3Rpb25TdHViID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB2YXIgbWF0Y2hpbmdzID0gZnVuY3Rpb25TdHViLm1hdGNoaW5nRmFrZXMoYXJncyk7XG5cbiAgICAgICAgICAgIHZhciBmblN0dWIgPSBtYXRjaGluZ3Muc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm1hdGNoaW5nQXJndW1lbnRzLmxlbmd0aCAtIGIubWF0Y2hpbmdBcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgfSkucG9wKCkgfHwgZnVuY3Rpb25TdHViO1xuICAgICAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRCZWhhdmlvcihmblN0dWIpLmludm9rZSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uU3R1Yi5pZCA9IFwic3R1YiNcIiArIHV1aWQrKztcbiAgICAgICAgdmFyIG9yaWcgPSBmdW5jdGlvblN0dWI7XG4gICAgICAgIGZ1bmN0aW9uU3R1YiA9IHNweS5jcmVhdGUoZnVuY3Rpb25TdHViLCBzdHViTGVuZ3RoKTtcbiAgICAgICAgZnVuY3Rpb25TdHViLmZ1bmMgPSBvcmlnO1xuXG4gICAgICAgIGV4dGVuZChmdW5jdGlvblN0dWIsIHN0dWIpO1xuICAgICAgICBmdW5jdGlvblN0dWIuaW5zdGFudGlhdGVGYWtlID0gc3R1Yi5jcmVhdGU7XG4gICAgICAgIGZ1bmN0aW9uU3R1Yi5kaXNwbGF5TmFtZSA9IFwic3R1YlwiO1xuICAgICAgICBmdW5jdGlvblN0dWIudG9TdHJpbmcgPSBmdW5jdGlvblRvU3RyaW5nO1xuXG4gICAgICAgIGZ1bmN0aW9uU3R1Yi5kZWZhdWx0QmVoYXZpb3IgPSBudWxsO1xuICAgICAgICBmdW5jdGlvblN0dWIuYmVoYXZpb3JzID0gW107XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uU3R1YjtcbiAgICB9LFxuXG4gICAgcmVzZXRCZWhhdmlvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZmFrZXMgPSB0aGlzLmZha2VzIHx8IFtdO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdEJlaGF2aW9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5iZWhhdmlvcnMgPSBbXTtcblxuICAgICAgICBkZWxldGUgdGhpcy5yZXR1cm5WYWx1ZTtcbiAgICAgICAgZGVsZXRlIHRoaXMucmV0dXJuQXJnQXQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRocm93QXJnQXQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmZha2VGbjtcbiAgICAgICAgdGhpcy5yZXR1cm5UaGlzID0gZmFsc2U7XG5cbiAgICAgICAgZmFrZXMuZm9yRWFjaChmdW5jdGlvbiAoZmFrZSkge1xuICAgICAgICAgICAgZmFrZS5yZXNldEJlaGF2aW9yKCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICByZXNldEhpc3Rvcnk6IHNweS5yZXNldCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgICAgIHRoaXMucmVzZXRCZWhhdmlvcigpO1xuICAgIH0sXG5cbiAgICBvbkNhbGw6IGZ1bmN0aW9uIG9uQ2FsbChpbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMuYmVoYXZpb3JzW2luZGV4XSkge1xuICAgICAgICAgICAgdGhpcy5iZWhhdmlvcnNbaW5kZXhdID0gYmVoYXZpb3IuY3JlYXRlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYmVoYXZpb3JzW2luZGV4XTtcbiAgICB9LFxuXG4gICAgb25GaXJzdENhbGw6IGZ1bmN0aW9uIG9uRmlyc3RDYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbkNhbGwoMCk7XG4gICAgfSxcblxuICAgIG9uU2Vjb25kQ2FsbDogZnVuY3Rpb24gb25TZWNvbmRDYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbkNhbGwoMSk7XG4gICAgfSxcblxuICAgIG9uVGhpcmRDYWxsOiBmdW5jdGlvbiBvblRoaXJkQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25DYWxsKDIpO1xuICAgIH1cbn07XG5cbk9iamVjdC5rZXlzKGJlaGF2aW9yKS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICBpZiAoYmVoYXZpb3IuaGFzT3duUHJvcGVydHkobWV0aG9kKSAmJlxuICAgICAgICAhcHJvdG8uaGFzT3duUHJvcGVydHkobWV0aG9kKSAmJlxuICAgICAgICBtZXRob2QgIT09IFwiY3JlYXRlXCIgJiZcbiAgICAgICAgbWV0aG9kICE9PSBcIndpdGhBcmdzXCIgJiZcbiAgICAgICAgbWV0aG9kICE9PSBcImludm9rZVwiKSB7XG4gICAgICAgIHByb3RvW21ldGhvZF0gPSBiZWhhdmlvci5jcmVhdGVCZWhhdmlvcihtZXRob2QpO1xuICAgIH1cbn0pO1xuXG5PYmplY3Qua2V5cyhiZWhhdmlvcnMpLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIGlmIChiZWhhdmlvcnMuaGFzT3duUHJvcGVydHkobWV0aG9kKSAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkobWV0aG9kKSkge1xuICAgICAgICBiZWhhdmlvci5hZGRCZWhhdmlvcihzdHViLCBtZXRob2QsIGJlaGF2aW9yc1ttZXRob2RdKTtcbiAgICB9XG59KTtcblxuZXh0ZW5kKHN0dWIsIHByb3RvKTtcbm1vZHVsZS5leHBvcnRzID0gc3R1YjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdmFsdWUtdG8tc3RyaW5nXCIpO1xuXG5mdW5jdGlvbiB0aHJvd09uRmFsc3lPYmplY3Qob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIGlmIChwcm9wZXJ0eSAmJiAhb2JqZWN0KSB7XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0ID09PSBudWxsID8gXCJudWxsXCIgOiBcInVuZGVmaW5lZFwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc3R1YiBwcm9wZXJ0eSAnXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArIFwiJyBvZiBcIiArIHR5cGUpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvd09uRmFsc3lPYmplY3Q7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGV2ZXJ5ID0gQXJyYXkucHJvdG90eXBlLmV2ZXJ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxlZEluT3JkZXIoc3BpZXMpIHtcbiAgICB2YXIgY2FsbE1hcCA9IHt9O1xuXG4gICAgZnVuY3Rpb24gaGFzQ2FsbHNMZWZ0KHNweSkge1xuICAgICAgICBpZiAoY2FsbE1hcFtzcHkuaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhbGxNYXBbc3B5LmlkXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsbE1hcFtzcHkuaWRdIDwgc3B5LmNhbGxDb3VudDtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgc3BpZXMgPSBhcmd1bWVudHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZXJ5LmNhbGwoc3BpZXMsIGZ1bmN0aW9uIGNoZWNrQWRqYWNlbnRDYWxscyhzcHksIGkpIHtcbiAgICAgICAgdmFyIGNhbGxlZEJlZm9yZU5leHQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChpICE9PSBzcGllcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBjYWxsZWRCZWZvcmVOZXh0ID0gc3B5LmNhbGxlZEJlZm9yZShzcGllc1tpICsgMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0NhbGxzTGVmdChzcHkpICYmIGNhbGxlZEJlZm9yZU5leHQpIHtcbiAgICAgICAgICAgIGNhbGxNYXBbc3B5LmlkXSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBkaXYgPSB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuZnVuY3Rpb24gaXNSZWFsbHlOYU4odmFsKSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gdmFsO1xufVxuXG5mdW5jdGlvbiBpc0RPTU5vZGUob2JqKSB7XG4gICAgdmFyIHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICAgIG9iai5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICBzdWNjZXNzID0gZGl2LnBhcmVudE5vZGUgPT09IG9iajtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgb2JqLnJlbW92ZUNoaWxkKGRpdik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBmYWlsZWQsIG5vdCBtdWNoIHdlIGNhbiBkbyBhYm91dCB0aGF0XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2Vzcztcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KG9iaikge1xuICAgIHJldHVybiBkaXYgJiYgb2JqICYmIG9iai5ub2RlVHlwZSA9PT0gMSAmJiBpc0RPTU5vZGUob2JqKTtcbn1cblxudmFyIGRlZXBFcXVhbCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIpIHtcbiAgICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIGlzUmVhbGx5TmFOKGEpICYmIGlzUmVhbGx5TmFOKGIpIHx8IGEgPT09IGI7XG4gICAgfVxuXG4gICAgaWYgKGlzRWxlbWVudChhKSB8fCBpc0VsZW1lbnQoYikpIHtcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgfVxuXG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKChhID09PSBudWxsICYmIGIgIT09IG51bGwpIHx8IChhICE9PSBudWxsICYmIGIgPT09IG51bGwpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBiIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAoYS5zb3VyY2UgPT09IGIuc291cmNlKSAmJiAoYS5nbG9iYWwgPT09IGIuZ2xvYmFsKSAmJlxuICAgICAgICAgICAgKGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlKSAmJiAoYS5tdWx0aWxpbmUgPT09IGIubXVsdGlsaW5lKTtcbiAgICB9XG5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIEVycm9yICYmIGIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICB9XG5cbiAgICB2YXIgYVN0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTtcbiAgICBpZiAoYVN0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoYVN0cmluZyA9PT0gXCJbb2JqZWN0IERhdGVdXCIpIHtcbiAgICAgICAgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcDtcbiAgICB2YXIgYUxlbmd0aCA9IDA7XG4gICAgdmFyIGJMZW5ndGggPSAwO1xuXG4gICAgaWYgKGFTdHJpbmcgPT09IFwiW29iamVjdCBBcnJheV1cIiAmJiBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAocHJvcCBpbiBhKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSwgcHJvcCkpIHtcbiAgICAgICAgICAgIGFMZW5ndGggKz0gMTtcblxuICAgICAgICAgICAgaWYgKCEocHJvcCBpbiBiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWxsb3cgYWx0ZXJuYXRpdmUgZnVuY3Rpb24gZm9yIHJlY3Vyc2lvblxuICAgICAgICAgICAgaWYgKCEoYXJndW1lbnRzWzJdIHx8IGRlZXBFcXVhbCkoYVtwcm9wXSwgYltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHByb3AgaW4gYikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHByb3ApKSB7XG4gICAgICAgICAgICBiTGVuZ3RoICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYUxlbmd0aCA9PT0gYkxlbmd0aDtcbn07XG5cbmRlZXBFcXVhbC51c2UgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVlcEVxdWFsJG1hdGNoZXIoYSwgYikge1xuICAgICAgICAvLyBJZiBib3RoIGFyZSBtYXRjaGVycyB0aGV5IG11c3QgYmUgdGhlIHNhbWUgaW5zdGFuY2UgaW4gb3JkZXIgdG8gYmUgY29uc2lkZXJlZCBlcXVhbFxuICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZG8gdGhhdCB3ZSB3b3VsZCBlbmQgdXAgcnVubmluZyBvbmUgbWF0Y2hlciBhZ2FpbnN0IHRoZSBvdGhlclxuICAgICAgICBpZiAobWF0Y2guaXNNYXRjaGVyKGEpKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2guaXNNYXRjaGVyKGIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhLnRlc3QoYik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGEsIGIsIGRlZXBFcXVhbCRtYXRjaGVyKTtcbiAgICB9O1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbmplY3RJbnRvVGhpczogdHJ1ZSxcbiAgICBpbmplY3RJbnRvOiBudWxsLFxuICAgIHByb3BlcnRpZXM6IFtcInNweVwiLCBcInN0dWJcIiwgXCJtb2NrXCIsIFwiY2xvY2tcIiwgXCJzZXJ2ZXJcIiwgXCJyZXF1ZXN0c1wiXSxcbiAgICB1c2VGYWtlVGltZXJzOiB0cnVlLFxuICAgIHVzZUZha2VTZXJ2ZXI6IHRydWVcbn07XG4iLCIvKmVzbGludCBuby1jb25zb2xlOiAwICovXG5cInVzZSBzdHJpY3RcIjtcblxuLy8gd3JhcCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGludm9rZSB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gYW5kIHByaW50IGEgZGVwcmVjYXRpb24gd2FybmluZyB0byB0aGUgY29uc29sZSBlYWNoXG4vLyB0aW1lIGl0IGlzIGNhbGxlZC5cbmV4cG9ydHMud3JhcCA9IGZ1bmN0aW9uIChmdW5jLCBtc2cpIHtcbiAgICB2YXIgd3JhcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwb3J0cy5wcmludFdhcm5pbmcobXNnKTtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIGlmIChmdW5jLnByb3RvdHlwZSkge1xuICAgICAgICB3cmFwcGVkLnByb3RvdHlwZSA9IGZ1bmMucHJvdG90eXBlO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbi8vIGRlZmF1bHRNc2cgcmV0dXJucyBhIHN0cmluZyB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gYHdyYXAoKWAgdG8gbm90aWZ5IHRoZSB1c2VyIHRoYXQgYSBwYXJ0aWN1bGFyIHBhcnQgb2YgdGhlXG4vLyBzaW5vbiBBUEkgaGFzIGJlZW4gZGVwcmVjYXRlZC5cbmV4cG9ydHMuZGVmYXVsdE1zZyA9IGZ1bmN0aW9uIChmdW5jTmFtZSkge1xuICAgIHJldHVybiBcInNpbm9uLlwiICsgZnVuY05hbWUgKyBcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgcHVibGljIEFQSSBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHNpbm9uLlwiO1xufTtcblxuZXhwb3J0cy5wcmludFdhcm5pbmcgPSBmdW5jdGlvbiAobXNnKSB7XG4gICAgLy8gV2F0Y2ggb3V0IGZvciBJRTcgYW5kIGJlbG93ISA6KFxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAoY29uc29sZS5pbmZvKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8obXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFRoaXMgaXMgYW4gYGV2ZXJ5YCBpbXBsZW1lbnRhdGlvbiB0aGF0IHdvcmtzIGZvciBhbGwgaXRlcmFibGVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV2ZXJ5KG9iaiwgZm4pIHtcbiAgICB2YXIgcGFzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBUaHJvd2luZyBhbiBlcnJvciBpcyB0aGUgb25seSB3YXkgdG8gYnJlYWsgYGZvckVhY2hgXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcGFzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXNzO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9FQ01BU2NyaXB0X0RvbnRFbnVtX2F0dHJpYnV0ZSNKU2NyaXB0X0RvbnRFbnVtX0J1Z1xudmFyIGhhc0RvbnRFbnVtQnVnID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMFwiO1xuICAgICAgICB9LFxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMVwiO1xuICAgICAgICB9LFxuICAgICAgICB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIyXCI7XG4gICAgICAgIH0sXG4gICAgICAgIHRvTG9jYWxlU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIzXCI7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3RvdHlwZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiNFwiO1xuICAgICAgICB9LFxuICAgICAgICBpc1Byb3RvdHlwZU9mOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI1XCI7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI2XCI7XG4gICAgICAgIH0sXG4gICAgICAgIGhhc093blByb3BlcnR5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI3XCI7XG4gICAgICAgIH0sXG4gICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiOFwiO1xuICAgICAgICB9LFxuICAgICAgICB1bmlxdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjlcIjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gob2JqW3Byb3BdKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuam9pbihcIlwiKSAhPT0gXCIwMTIzNDU2Nzg5XCI7XG59KSgpO1xuXG4vKiBQdWJsaWM6IEV4dGVuZCB0YXJnZXQgaW4gcGxhY2Ugd2l0aCBhbGwgKG93bikgcHJvcGVydGllcyBmcm9tIHNvdXJjZXMgaW4tb3JkZXIuIFRodXMsIGxhc3Qgc291cmNlIHdpbGxcbiAqICAgICAgICAgb3ZlcnJpZGUgcHJvcGVydGllcyBpbiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqIHRhcmdldCAtIFRoZSBPYmplY3QgdG8gZXh0ZW5kXG4gKiBzb3VyY2VzIC0gT2JqZWN0cyB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqXG4gKiBSZXR1cm5zIHRoZSBleHRlbmRlZCB0YXJnZXRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCBzb3VyY2VzICovKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBzb3VyY2UsIGksIHByb3A7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzb3VyY2UgPSBzb3VyY2VzW2ldO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29weSAob3duKSB0b1N0cmluZyBtZXRob2QgZXZlbiB3aGVuIGluIEpTY3JpcHQgd2l0aCBEb250RW51bSBidWdcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvRUNNQVNjcmlwdF9Eb250RW51bV9hdHRyaWJ1dGUjSlNjcmlwdF9Eb250RW51bV9CdWdcbiAgICAgICAgaWYgKGhhc0RvbnRFbnVtQnVnICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShcInRvU3RyaW5nXCIpICYmIHNvdXJjZS50b1N0cmluZyAhPT0gdGFyZ2V0LnRvU3RyaW5nKSB7XG4gICAgICAgICAgICB0YXJnZXQudG9TdHJpbmcgPSBzb3VyY2UudG9TdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZm9ybWF0aW8gPSByZXF1aXJlKFwiZm9ybWF0aW9cIik7XG5cbnZhciBmb3JtYXR0ZXIgPSBmb3JtYXRpby5jb25maWd1cmUoe1xuICAgIHF1b3RlU3RyaW5nczogZmFsc2UsXG4gICAgbGltaXRDaGlsZHJlbkNvdW50OiAyNTBcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgICByZXR1cm4gZm9ybWF0dGVyLmFzY2lpLmFwcGx5KGZvcm1hdHRlciwgYXJndW1lbnRzKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmdW5jdGlvbk5hbWUoZnVuYykge1xuICAgIHZhciBuYW1lID0gZnVuYy5kaXNwbGF5TmFtZSB8fCBmdW5jLm5hbWU7XG4gICAgdmFyIG1hdGNoZXM7XG5cbiAgICAvLyBVc2UgZnVuY3Rpb24gZGVjb21wb3NpdGlvbiBhcyBhIGxhc3QgcmVzb3J0IHRvIGdldCBmdW5jdGlvblxuICAgIC8vIG5hbWUuIERvZXMgbm90IHJlbHkgb24gZnVuY3Rpb24gZGVjb21wb3NpdGlvbiB0byB3b3JrIC0gaWYgaXRcbiAgICAvLyBkb2Vzbid0IGRlYnVnZ2luZyB3aWxsIGJlIHNsaWdodGx5IGxlc3MgaW5mb3JtYXRpdmVcbiAgICAvLyAoaS5lLiB0b1N0cmluZyB3aWxsIHNheSAnc3B5JyByYXRoZXIgdGhhbiAnbXlGdW5jJykuXG4gICAgaWYgKCFuYW1lICYmIChtYXRjaGVzID0gZnVuYy50b1N0cmluZygpLm1hdGNoKC9mdW5jdGlvbiAoW15cXHNcXChdKykvKSkpIHtcbiAgICAgICAgbmFtZSA9IG1hdGNoZXNbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWU7XG59O1xuXG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgaSwgcHJvcCwgdGhpc1ZhbHVlO1xuICAgIGlmICh0aGlzLmdldENhbGwgJiYgdGhpcy5jYWxsQ291bnQpIHtcbiAgICAgICAgaSA9IHRoaXMuY2FsbENvdW50O1xuXG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIHRoaXNWYWx1ZSA9IHRoaXMuZ2V0Q2FsbChpKS50aGlzVmFsdWU7XG5cbiAgICAgICAgICAgIGZvciAocHJvcCBpbiB0aGlzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1ZhbHVlW3Byb3BdID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lIHx8IFwic2lub24gZmFrZVwiO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZGVmYXVsdENvbmZpZyA9IHJlcXVpcmUoXCIuL2RlZmF1bHQtY29uZmlnXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldENvbmZpZyhjdXN0b20pIHtcbiAgICB2YXIgY29uZmlnID0ge307XG4gICAgdmFyIHByb3A7XG5cbiAgICBjdXN0b20gPSBjdXN0b20gfHwge307XG5cbiAgICBmb3IgKHByb3AgaW4gZGVmYXVsdENvbmZpZykge1xuICAgICAgICBpZiAoZGVmYXVsdENvbmZpZy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgY29uZmlnW3Byb3BdID0gY3VzdG9tLmhhc093blByb3BlcnR5KHByb3ApID8gY3VzdG9tW3Byb3BdIDogZGVmYXVsdENvbmZpZ1twcm9wXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICB2YXIgcHJvdG8gPSBvYmplY3Q7XG4gICAgdmFyIGRlc2NyaXB0b3I7XG5cbiAgICB3aGlsZSAocHJvdG8gJiYgIShkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgcHJvcGVydHkpKSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjYWxsZWRJbk9yZGVyOiByZXF1aXJlKFwiLi9jYWxsZWQtaW4tb3JkZXJcIiksXG4gICAgY29uZmlndXJlTG9nRXJyb3I6IHJlcXVpcmUoXCIuL2xvZ19lcnJvclwiKSxcbiAgICBkZWZhdWx0Q29uZmlnOiByZXF1aXJlKFwiLi9kZWZhdWx0LWNvbmZpZ1wiKSxcbiAgICBkZWVwRXF1YWw6IHJlcXVpcmUoXCIuL2RlZXAtZXF1YWxcIiksXG4gICAgZXZlcnk6IHJlcXVpcmUoXCIuL2V2ZXJ5XCIpLFxuICAgIGV4dGVuZDogcmVxdWlyZShcIi4vZXh0ZW5kXCIpLFxuICAgIGZvcm1hdDogcmVxdWlyZShcIi4vZm9ybWF0XCIpLFxuICAgIGZ1bmN0aW9uTmFtZTogcmVxdWlyZShcIi4vZnVuY3Rpb24tbmFtZVwiKSxcbiAgICBmdW5jdGlvblRvU3RyaW5nOiByZXF1aXJlKFwiLi9mdW5jdGlvbi10by1zdHJpbmdcIiksXG4gICAgZ2V0Q29uZmlnOiByZXF1aXJlKFwiLi9nZXQtY29uZmlnXCIpLFxuICAgIGdldFByb3BlcnR5RGVzY3JpcHRvcjogcmVxdWlyZShcIi4vZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIiksXG4gICAgaXRlcmFibGVUb1N0cmluZzogcmVxdWlyZShcIi4vaXRlcmFibGUtdG8tc3RyaW5nXCIpLFxuICAgIG9yZGVyQnlGaXJzdENhbGw6IHJlcXVpcmUoXCIuL29yZGVyLWJ5LWZpcnN0LWNhbGxcIiksXG4gICAgcmVzdG9yZTogcmVxdWlyZShcIi4vcmVzdG9yZVwiKSxcbiAgICB0aW1lc0luV29yZHM6IHJlcXVpcmUoXCIuL3RpbWVzLWluLXdvcmRzXCIpLFxuICAgIHR5cGVPZjogcmVxdWlyZShcIi4vdHlwZU9mXCIpLFxuICAgIHdhbGs6IHJlcXVpcmUoXCIuL3dhbGtcIiksXG4gICAgd3JhcE1ldGhvZDogcmVxdWlyZShcIi4vd3JhcC1tZXRob2RcIilcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiLi90eXBlT2ZcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXRlcmFibGVUb1N0cmluZyhvYmopIHtcbiAgICB2YXIgcmVwcmVzZW50YXRpb24gPSBcIlwiO1xuXG4gICAgZnVuY3Rpb24gc3RyaW5naWZ5KGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBpdGVtICsgXCInXCIgOiBTdHJpbmcoaXRlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwVG9TdHJpbmcobWFwKSB7XG4gICAgICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiArPSBcIltcIiArIHN0cmluZ2lmeShrZXkpICsgXCIsXCIgKyBzdHJpbmdpZnkodmFsdWUpICsgXCJdLFwiO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXByZXNlbnRhdGlvbiA9IHJlcHJlc2VudGF0aW9uLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyaWNJdGVyYWJsZVRvU3RyaW5nKGl0ZXJhYmxlKSB7XG4gICAgICAgIGl0ZXJhYmxlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiArPSBzdHJpbmdpZnkodmFsdWUpICsgXCIsXCI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb24uc2xpY2UoMCwgLTEpO1xuICAgICAgICByZXR1cm4gcmVwcmVzZW50YXRpb247XG4gICAgfVxuXG4gICAgaWYgKHR5cGVPZihvYmopID09PSBcIm1hcFwiKSB7XG4gICAgICAgIHJldHVybiBtYXBUb1N0cmluZyhvYmopO1xuICAgIH1cblxuICAgIHJldHVybiBnZW5lcmljSXRlcmFibGVUb1N0cmluZyhvYmopO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBjYWNoZSBhIHJlZmVyZW5jZSB0byBzZXRUaW1lb3V0LCBzbyB0aGF0IG91ciByZWZlcmVuY2Ugd29uJ3QgYmUgc3R1YmJlZCBvdXRcbi8vIHdoZW4gdXNpbmcgZmFrZSB0aW1lcnMgYW5kIGVycm9ycyB3aWxsIHN0aWxsIGdldCBsb2dnZWRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jam9oYW5zZW4vU2lub24uSlMvaXNzdWVzLzM4MVxudmFyIHJlYWxTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblxuZnVuY3Rpb24gY29uZmlndXJlKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAvLyBGdW5jdGlvbiB3aGljaCBwcmludHMgZXJyb3JzLlxuICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KFwibG9nZ2VyXCIpKSB7XG4gICAgICAgIGNvbmZpZy5sb2dnZXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIC8vIFdoZW4gc2V0IHRvIHRydWUsIGFueSBlcnJvcnMgbG9nZ2VkIHdpbGwgYmUgdGhyb3duIGltbWVkaWF0ZWx5O1xuICAgIC8vIElmIHNldCB0byBmYWxzZSwgdGhlIGVycm9ycyB3aWxsIGJlIHRocm93biBpbiBzZXBhcmF0ZSBleGVjdXRpb24gZnJhbWUuXG4gICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoXCJ1c2VJbW1lZGlhdGVFeGNlcHRpb25zXCIpKSB7XG4gICAgICAgIGNvbmZpZy51c2VJbW1lZGlhdGVFeGNlcHRpb25zID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gd3JhcCByZWFsU2V0VGltZW91dCB3aXRoIHNvbWV0aGluZyB3ZSBjYW4gc3R1YiBpbiB0ZXN0c1xuICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KFwic2V0VGltZW91dFwiKSkge1xuICAgICAgICBjb25maWcuc2V0VGltZW91dCA9IHJlYWxTZXRUaW1lb3V0O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBsb2dFcnJvcihsYWJlbCwgZSkge1xuICAgICAgICB2YXIgbXNnID0gbGFiZWwgKyBcIiB0aHJldyBleGNlcHRpb246IFwiO1xuICAgICAgICB2YXIgZXJyID0geyBuYW1lOiBlLm5hbWUgfHwgbGFiZWwsIG1lc3NhZ2U6IGUubWVzc2FnZSB8fCBlLnRvU3RyaW5nKCksIHN0YWNrOiBlLnN0YWNrIH07XG5cbiAgICAgICAgZnVuY3Rpb24gdGhyb3dMb2dnZWRFcnJvcigpIHtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlID0gbXNnICsgZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcubG9nZ2VyKG1zZyArIFwiW1wiICsgZXJyLm5hbWUgKyBcIl0gXCIgKyBlcnIubWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlcihlcnIuc3RhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy51c2VJbW1lZGlhdGVFeGNlcHRpb25zKSB7XG4gICAgICAgICAgICB0aHJvd0xvZ2dlZEVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuc2V0VGltZW91dCh0aHJvd0xvZ2dlZEVycm9yLCAwKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uZmlndXJlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3JkZXJCeUZpcnN0Q2FsbChzcGllcykge1xuICAgIHJldHVybiBzcGllcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIC8vIHV1aWQsIHdvbid0IGV2ZXIgYmUgZXF1YWxcbiAgICAgICAgdmFyIGFDYWxsID0gYS5nZXRDYWxsKDApO1xuICAgICAgICB2YXIgYkNhbGwgPSBiLmdldENhbGwoMCk7XG4gICAgICAgIHZhciBhSWQgPSBhQ2FsbCAmJiBhQ2FsbC5jYWxsSWQgfHwgLTE7XG4gICAgICAgIHZhciBiSWQgPSBiQ2FsbCAmJiBiQ2FsbC5jYWxsSWQgfHwgLTE7XG5cbiAgICAgICAgcmV0dXJuIGFJZCA8IGJJZCA/IC0xIDogMTtcbiAgICB9KTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHdhbGsgPSByZXF1aXJlKFwiLi93YWxrXCIpO1xuXG5mdW5jdGlvbiBpc1Jlc3RvcmFibGUob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2Ygb2JqLnJlc3RvcmUgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmoucmVzdG9yZS5zaW5vbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXN0b3JlKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB3YWxrKG9iamVjdCwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIGlmIChpc1Jlc3RvcmFibGUob2JqZWN0W3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIG9iamVjdFtwcm9wXS5yZXN0b3JlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNSZXN0b3JhYmxlKG9iamVjdCkpIHtcbiAgICAgICAgb2JqZWN0LnJlc3RvcmUoKTtcbiAgICB9XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheSA9IFtudWxsLCBcIm9uY2VcIiwgXCJ0d2ljZVwiLCBcInRocmljZVwiXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0aW1lc0luV29yZHMoY291bnQpIHtcbiAgICByZXR1cm4gYXJyYXlbY291bnRdIHx8IChjb3VudCB8fCAwKSArIFwiIHRpbWVzXCI7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB0eXBlID0gcmVxdWlyZShcInR5cGUtZGV0ZWN0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHR5cGVPZih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50b1N0cmluZykge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIHdhbGtJbnRlcm5hbChvYmosIGl0ZXJhdG9yLCBjb250ZXh0LCBvcmlnaW5hbE9iaiwgc2Vlbikge1xuICAgIHZhciBwcm90bywgcHJvcDtcblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHdhbnQgdG8gZW51bWVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBwcm90b3R5cGUncyBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIGluIHRoaXMgY2FzZSwgdGhlcmVmb3JlIHdlIGRlbGliZXJhdGVseSBsZWF2ZSBvdXQgYW4gb3duIHByb3BlcnR5IGNoZWNrLlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbiAgICAgICAgZm9yIChwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpbcHJvcF0sIHByb3AsIG9iaik7XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBndWFyZC1mb3ItaW4gKi9cblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIGlmIChzZWVuW2tdICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBzZWVuW2tdID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGspLmdldCA9PT0gXCJmdW5jdGlvblwiID9cbiAgICAgICAgICAgICAgICBvcmlnaW5hbE9iaiA6IG9iajtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgaywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgd2Fsa0ludGVybmFsKHByb3RvLCBpdGVyYXRvciwgY29udGV4dCwgb3JpZ2luYWxPYmosIHNlZW4pO1xuICAgIH1cbn1cblxuLyogV2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgYW5kIGl0ZXJhdGVzIG92ZXIgZXZlcnkgb3duIHByb3BlcnR5XG4gKiBuYW1lIGVuY291bnRlcmVkLiBUaGUgaXRlcmF0b3IgaXMgY2FsbGVkIGluIHRoZSBzYW1lIGZhc2hpb24gdGhhdCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICogd29ya3MsIHdoZXJlIGl0IGlzIHBhc3NlZCB0aGUgdmFsdWUsIGtleSwgYW5kIG93biBvYmplY3QgYXMgdGhlIDFzdCwgMm5kLCBhbmQgM3JkIHBvc2l0aW9uYWxcbiAqIGFyZ3VtZW50LCByZXNwZWN0aXZlbHkuIEluIGNhc2VzIHdoZXJlIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIGlzIG5vdCBhdmFpbGFibGUsIHdhbGsgd2lsbFxuICogZGVmYXVsdCB0byB1c2luZyBhIHNpbXBsZSBmb3IuLmluIGxvb3AuXG4gKlxuICogb2JqIC0gVGhlIG9iamVjdCB0byB3YWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gZm9yLlxuICogaXRlcmF0b3IgLSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggcGFzcyBvZiB0aGUgd2Fsay5cbiAqIGNvbnRleHQgLSAoT3B0aW9uYWwpIFdoZW4gZ2l2ZW4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoaXMgb2JqZWN0IGFzIHRoZSByZWNlaXZlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3YWxrKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gd2Fsa0ludGVybmFsKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQsIG9iaiwge30pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCIuL3ZhbHVlLXRvLXN0cmluZ1wiKTtcblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiB8fCAhIShvYmogJiYgb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jYWxsICYmIG9iai5hcHBseSk7XG59XG5cbmZ1bmN0aW9uIG1pcnJvclByb3BlcnRpZXModGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoIWhhc093bi5jYWxsKHRhcmdldCwgcHJvcCkpIHtcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gQ2hlYXAgd2F5IHRvIGRldGVjdCBpZiB3ZSBoYXZlIEVTNSBzdXBwb3J0LlxudmFyIGhhc0VTNVN1cHBvcnQgPSBcImtleXNcIiBpbiBPYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gd3JhcE1ldGhvZChvYmplY3QsIHByb3BlcnR5LCBtZXRob2QpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2hvdWxkIHdyYXAgcHJvcGVydHkgb2Ygb2JqZWN0XCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG1ldGhvZCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWV0aG9kIHdyYXBwZXIgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yXCIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrV3JhcHBlZE1ldGhvZCh3cmFwcGVkTWV0aG9kKSB7XG4gICAgICAgIHZhciBlcnJvcjtcblxuICAgICAgICBpZiAoIWlzRnVuY3Rpb24od3JhcHBlZE1ldGhvZCkpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcIkF0dGVtcHRlZCB0byB3cmFwIFwiICsgKHR5cGVvZiB3cmFwcGVkTWV0aG9kKSArIFwiIHByb3BlcnR5IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkgKyBcIiBhcyBmdW5jdGlvblwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh3cmFwcGVkTWV0aG9kLnJlc3RvcmUgJiYgd3JhcHBlZE1ldGhvZC5yZXN0b3JlLnNpbm9uKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBUeXBlRXJyb3IoXCJBdHRlbXB0ZWQgdG8gd3JhcCBcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpICsgXCIgd2hpY2ggaXMgYWxyZWFkeSB3cmFwcGVkXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHdyYXBwZWRNZXRob2QuY2FsbGVkQmVmb3JlKSB7XG4gICAgICAgICAgICB2YXIgdmVyYiA9IHdyYXBwZWRNZXRob2QucmV0dXJucyA/IFwic3R1YmJlZFwiIDogXCJzcGllZCBvblwiO1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFwiQXR0ZW1wdGVkIHRvIHdyYXAgXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArIFwiIHdoaWNoIGlzIGFscmVhZHkgXCIgKyB2ZXJiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKHdyYXBwZWRNZXRob2QgJiYgd3JhcHBlZE1ldGhvZC5zdGFja1RyYWNlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Iuc3RhY2sgKz0gXCJcXG4tLS0tLS0tLS0tLS0tLVxcblwiICsgd3JhcHBlZE1ldGhvZC5zdGFja1RyYWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZXJyb3IsIHdyYXBwZWRNZXRob2QsIGk7XG5cbiAgICBmdW5jdGlvbiBzaW1wbGVQcm9wZXJ0eUFzc2lnbm1lbnQoKSB7XG4gICAgICAgIHdyYXBwZWRNZXRob2QgPSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICBjaGVja1dyYXBwZWRNZXRob2Qod3JhcHBlZE1ldGhvZCk7XG4gICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBtZXRob2Q7XG4gICAgICAgIG1ldGhvZC5kaXNwbGF5TmFtZSA9IHByb3BlcnR5O1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3ggaGFzIGEgcHJvYmxlbSB3aGVuIHVzaW5nIGhhc093bi5jYWxsIG9uIG9iamVjdHMgZnJvbSBvdGhlciBmcmFtZXMuXG4gICAgdmFyIG93bmVkID0gb2JqZWN0Lmhhc093blByb3BlcnR5ID8gb2JqZWN0Lmhhc093blByb3BlcnR5KHByb3BlcnR5KSA6IGhhc093bi5jYWxsKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgaWYgKGhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgdmFyIG1ldGhvZERlc2MgPSAodHlwZW9mIG1ldGhvZCA9PT0gXCJmdW5jdGlvblwiKSA/IHt2YWx1ZTogbWV0aG9kfSA6IG1ldGhvZDtcbiAgICAgICAgdmFyIHdyYXBwZWRNZXRob2REZXNjID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmICghd3JhcHBlZE1ldGhvZERlc2MpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcIkF0dGVtcHRlZCB0byB3cmFwIFwiICsgKHR5cGVvZiB3cmFwcGVkTWV0aG9kKSArIFwiIHByb3BlcnR5IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgKyBcIiBhcyBmdW5jdGlvblwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh3cmFwcGVkTWV0aG9kRGVzYy5yZXN0b3JlICYmIHdyYXBwZWRNZXRob2REZXNjLnJlc3RvcmUuc2lub24pIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcIkF0dGVtcHRlZCB0byB3cmFwIFwiICsgcHJvcGVydHkgKyBcIiB3aGljaCBpcyBhbHJlYWR5IHdyYXBwZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAod3JhcHBlZE1ldGhvZERlc2MgJiYgd3JhcHBlZE1ldGhvZERlc2Muc3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgICAgIGVycm9yLnN0YWNrICs9IFwiXFxuLS0tLS0tLS0tLS0tLS1cXG5cIiArIHdyYXBwZWRNZXRob2REZXNjLnN0YWNrVHJhY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0eXBlcyA9IE9iamVjdC5rZXlzKG1ldGhvZERlc2MpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHdyYXBwZWRNZXRob2QgPSB3cmFwcGVkTWV0aG9kRGVzY1t0eXBlc1tpXV07XG4gICAgICAgICAgICBjaGVja1dyYXBwZWRNZXRob2Qod3JhcHBlZE1ldGhvZCk7XG4gICAgICAgIH1cblxuICAgICAgICBtaXJyb3JQcm9wZXJ0aWVzKG1ldGhvZERlc2MsIHdyYXBwZWRNZXRob2REZXNjKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtaXJyb3JQcm9wZXJ0aWVzKG1ldGhvZERlc2NbdHlwZXNbaV1dLCB3cmFwcGVkTWV0aG9kRGVzY1t0eXBlc1tpXV0pO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBtZXRob2REZXNjKTtcblxuICAgICAgICAvLyBjYXRjaCBmYWlsaW5nIGFzc2lnbm1lbnRcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgY29udmVyc2Ugb2YgdGhlIGNoZWNrIGluIGAucmVzdG9yZWAgYmVsb3dcbiAgICAgICAgaWYgKCB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqZWN0W3Byb3BlcnR5XSAhPT0gbWV0aG9kICkge1xuICAgICAgICAgICAgLy8gY29ycmVjdCBhbnkgd3Jvbmdkb2luZ3MgY2F1c2VkIGJ5IHRoZSBkZWZpbmVQcm9wZXJ0eSBjYWxsIGFib3ZlLFxuICAgICAgICAgICAgLy8gc3VjaCBhcyBhZGRpbmcgbmV3IGl0ZW1zIChpZiBvYmplY3Qgd2FzIGEgU3RvcmFnZSBvYmplY3QpXG4gICAgICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIHNpbXBsZVByb3BlcnR5QXNzaWdubWVudCgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2ltcGxlUHJvcGVydHlBc3NpZ25tZW50KCk7XG4gICAgfVxuXG4gICAgbWV0aG9kLmRpc3BsYXlOYW1lID0gcHJvcGVydHk7XG5cbiAgICAvLyBTZXQgdXAgYSBzdGFjayB0cmFjZSB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0byBmaW5kIHdoYXQgbGluZSBvZlxuICAgIC8vIGNvZGUgdGhlIG9yaWdpbmFsIG1ldGhvZCB3YXMgY3JlYXRlZCBvbi5cbiAgICBtZXRob2Quc3RhY2tUcmFjZSA9IChuZXcgRXJyb3IoXCJTdGFjayBUcmFjZSBmb3Igb3JpZ2luYWxcIikpLnN0YWNrO1xuXG4gICAgbWV0aG9kLnJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEZvciBwcm90b3R5cGUgcHJvcGVydGllcyB0cnkgdG8gcmVzZXQgYnkgZGVsZXRlIGZpcnN0LlxuICAgICAgICAvLyBJZiB0aGlzIGZhaWxzIChleDogbG9jYWxTdG9yYWdlIG9uIG1vYmlsZSBzYWZhcmkpIHRoZW4gZm9yY2UgYSByZXNldFxuICAgICAgICAvLyB2aWEgZGlyZWN0IGFzc2lnbm1lbnQuXG4gICAgICAgIGlmICghb3duZWQpIHtcbiAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMgYGRlbGV0ZWAgbWF5IHRocm93IGFuIGVycm9yXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICAgICAgLy8gRm9yIG5hdGl2ZSBjb2RlIGZ1bmN0aW9ucyBgZGVsZXRlYCBmYWlscyB3aXRob3V0IHRocm93aW5nIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBvbiBDaHJvbWUgPCA0MywgUGhhbnRvbUpTLCBldGMuXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzRVM1U3VwcG9ydCkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHdyYXBwZWRNZXRob2REZXNjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNFUzVTdXBwb3J0KSB7XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWUgPT09IG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSB3cmFwcGVkTWV0aG9kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAvLyBVc2Ugc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb24gdG8gY2hlY2sgZmFpbHVyZXMgdGhlbiBmb3JjZSBhIHJlc2V0XG4gICAgICAgIC8vIHZpYSBkaXJlY3QgYXNzaWdubWVudC5cbiAgICAgICAgICAgIGlmIChvYmplY3RbcHJvcGVydHldID09PSBtZXRob2QpIHtcbiAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gd3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBtZXRob2Qud3JhcHBlZE1ldGhvZCA9IHdyYXBwZWRNZXRob2Q7XG5cbiAgICBtZXRob2QucmVzdG9yZS5zaW5vbiA9IHRydWU7XG5cbiAgICBpZiAoIWhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgbWlycm9yUHJvcGVydGllcyhtZXRob2QsIHdyYXBwZWRNZXRob2QpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2Q7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBwdXNoID0gW10ucHVzaDtcblxuZnVuY3Rpb24gRXZlbnQodHlwZSwgYnViYmxlcywgY2FuY2VsYWJsZSwgdGFyZ2V0KSB7XG4gICAgdGhpcy5pbml0RXZlbnQodHlwZSwgYnViYmxlcywgY2FuY2VsYWJsZSwgdGFyZ2V0KTtcbn1cblxuRXZlbnQucHJvdG90eXBlID0ge1xuICAgIGluaXRFdmVudDogZnVuY3Rpb24gKHR5cGUsIGJ1YmJsZXMsIGNhbmNlbGFibGUsIHRhcmdldCkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmJ1YmJsZXMgPSBidWJibGVzO1xuICAgICAgICB0aGlzLmNhbmNlbGFibGUgPSBjYW5jZWxhYmxlO1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB9LFxuXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7fSxcblxuICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gUHJvZ3Jlc3NFdmVudCh0eXBlLCBwcm9ncmVzc0V2ZW50UmF3LCB0YXJnZXQpIHtcbiAgICB0aGlzLmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHRhcmdldCk7XG4gICAgdGhpcy5sb2FkZWQgPSB0eXBlb2YgcHJvZ3Jlc3NFdmVudFJhdy5sb2FkZWQgPT09IFwibnVtYmVyXCIgPyBwcm9ncmVzc0V2ZW50UmF3LmxvYWRlZCA6IG51bGw7XG4gICAgdGhpcy50b3RhbCA9IHR5cGVvZiBwcm9ncmVzc0V2ZW50UmF3LnRvdGFsID09PSBcIm51bWJlclwiID8gcHJvZ3Jlc3NFdmVudFJhdy50b3RhbCA6IG51bGw7XG4gICAgdGhpcy5sZW5ndGhDb21wdXRhYmxlID0gISFwcm9ncmVzc0V2ZW50UmF3LnRvdGFsO1xufVxuXG5Qcm9ncmVzc0V2ZW50LnByb3RvdHlwZSA9IG5ldyBFdmVudCgpO1xuXG5Qcm9ncmVzc0V2ZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFByb2dyZXNzRXZlbnQ7XG5cbmZ1bmN0aW9uIEN1c3RvbUV2ZW50KHR5cGUsIGN1c3RvbURhdGEsIHRhcmdldCkge1xuICAgIHRoaXMuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSwgdGFyZ2V0KTtcbiAgICB0aGlzLmRldGFpbCA9IGN1c3RvbURhdGEuZGV0YWlsIHx8IG51bGw7XG59XG5cbkN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IG5ldyBFdmVudCgpO1xuXG5DdXN0b21FdmVudC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdXN0b21FdmVudDtcblxudmFyIEV2ZW50VGFyZ2V0ID0ge1xuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50XSA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnRdIHx8IFtdO1xuICAgICAgICBwdXNoLmNhbGwodGhpcy5ldmVudExpc3RlbmVyc1tldmVudF0sIGxpc3RlbmVyKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMgJiYgdGhpcy5ldmVudExpc3RlbmVyc1tldmVudF0gfHwgW107XG4gICAgICAgIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciB0eXBlID0gZXZlbnQudHlwZTtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHNlbGYuZXZlbnRMaXN0ZW5lcnMgJiYgc2VsZi5ldmVudExpc3RlbmVyc1t0eXBlXSB8fCBbXTtcblxuICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwoc2VsZiwgZXZlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAhIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgRXZlbnQ6IEV2ZW50LFxuICAgIFByb2dyZXNzRXZlbnQ6IFByb2dyZXNzRXZlbnQsXG4gICAgQ3VzdG9tRXZlbnQ6IEN1c3RvbUV2ZW50LFxuICAgIEV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldFxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZmFrZVhociA9IHJlcXVpcmUoXCIuL2Zha2VfeG1sX2h0dHBfcmVxdWVzdFwiKTtcbnZhciBwdXNoID0gW10ucHVzaDtcbnZhciBmb3JtYXQgPSByZXF1aXJlKFwiLi9jb3JlL2Zvcm1hdFwiKTtcbnZhciBjb25maWd1cmVMb2dFcnJvciA9IHJlcXVpcmUoXCIuL2NvcmUvbG9nX2Vycm9yXCIpO1xudmFyIHBhdGhUb1JlZ2V4cCA9IHJlcXVpcmUoXCJwYXRoLXRvLXJlZ2V4cFwiKTtcblxuZnVuY3Rpb24gcmVzcG9uc2VBcnJheShoYW5kbGVyKSB7XG4gICAgdmFyIHJlc3BvbnNlID0gaGFuZGxlcjtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaGFuZGxlcikgIT09IFwiW29iamVjdCBBcnJheV1cIikge1xuICAgICAgICByZXNwb25zZSA9IFsyMDAsIHt9LCBoYW5kbGVyXTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlWzJdICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWtlIHNlcnZlciByZXNwb25zZSBib2R5IHNob3VsZCBiZSBzdHJpbmcsIGJ1dCB3YXMgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXNwb25zZVsyXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0V2luZG93TG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHsgXCJob3N0XCI6IFwibG9jYWxob3N0XCIsIFwicHJvdG9jb2xcIjogXCJodHRwXCIgfTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93TG9jYXRpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgcmV0dXJuIGdldERlZmF1bHRXaW5kb3dMb2NhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIEJyb3dzZXJzIHBsYWNlIGxvY2F0aW9uIG9uIHdpbmRvd1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uO1xuICAgIH1cblxuICAgIGlmICgodHlwZW9mIHdpbmRvdy53aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpICYmICh0eXBlb2Ygd2luZG93LndpbmRvdy5sb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikpIHtcbiAgICAgICAgLy8gUmVhY3QgTmF0aXZlIG9uIEFuZHJvaWQgcGxhY2VzIGxvY2F0aW9uIG9uIHdpbmRvdy53aW5kb3dcbiAgICAgICAgcmV0dXJuIHdpbmRvdy53aW5kb3cubG9jYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldERlZmF1bHRXaW5kb3dMb2NhdGlvbigpO1xufVxuXG52YXIgd2xvYyA9IGdldFdpbmRvd0xvY2F0aW9uKCk7XG5cbnZhciByQ3VyckxvYyA9IG5ldyBSZWdFeHAoXCJeXCIgKyB3bG9jLnByb3RvY29sICsgXCIvL1wiICsgd2xvYy5ob3N0KTtcblxuZnVuY3Rpb24gbWF0Y2hPbmUocmVzcG9uc2UsIHJlcU1ldGhvZCwgcmVxVXJsKSB7XG4gICAgdmFyIHJtZXRoID0gcmVzcG9uc2UubWV0aG9kO1xuICAgIHZhciBtYXRjaE1ldGhvZCA9ICFybWV0aCB8fCBybWV0aC50b0xvd2VyQ2FzZSgpID09PSByZXFNZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHZhciBtYXRjaFVybCA9ICF1cmwgfHwgdXJsID09PSByZXFVcmwgfHwgKHR5cGVvZiB1cmwudGVzdCA9PT0gXCJmdW5jdGlvblwiICYmIHVybC50ZXN0KHJlcVVybCkpO1xuXG4gICAgcmV0dXJuIG1hdGNoTWV0aG9kICYmIG1hdGNoVXJsO1xufVxuXG5mdW5jdGlvbiBtYXRjaChyZXNwb25zZSwgcmVxdWVzdCkge1xuICAgIHZhciByZXF1ZXN0VXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICBpZiAoIS9eaHR0cHM/OlxcL1xcLy8udGVzdChyZXF1ZXN0VXJsKSB8fCByQ3VyckxvYy50ZXN0KHJlcXVlc3RVcmwpKSB7XG4gICAgICAgIHJlcXVlc3RVcmwgPSByZXF1ZXN0VXJsLnJlcGxhY2UockN1cnJMb2MsIFwiXCIpO1xuICAgIH1cblxuICAgIGlmIChtYXRjaE9uZShyZXNwb25zZSwgdGhpcy5nZXRIVFRQTWV0aG9kKHJlcXVlc3QpLCByZXF1ZXN0VXJsKSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlLnJlc3BvbnNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHZhciBydSA9IHJlc3BvbnNlLnVybDtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW3JlcXVlc3RdLmNvbmNhdChydSAmJiB0eXBlb2YgcnUuZXhlYyA9PT0gXCJmdW5jdGlvblwiID8gcnUuZXhlYyhyZXF1ZXN0VXJsKS5zbGljZSgxKSA6IFtdKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5yZXNwb25zZS5hcHBseShyZXNwb25zZSwgYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGluY3JlbWVudFJlcXVlc3RDb3VudCgpIHtcbiAgICB2YXIgY291bnQgPSArK3RoaXMucmVxdWVzdENvdW50O1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWRPbmNlID0gY291bnQgPT09IDE7XG4gICAgdGhpcy5yZXF1ZXN0ZWRUd2ljZSA9IGNvdW50ID09PSAyO1xuICAgIHRoaXMucmVxdWVzdGVkVGhyaWNlID0gY291bnQgPT09IDM7XG5cbiAgICB0aGlzLmZpcnN0UmVxdWVzdCA9IHRoaXMuZ2V0UmVxdWVzdCgwKTtcbiAgICB0aGlzLnNlY29uZFJlcXVlc3QgPSB0aGlzLmdldFJlcXVlc3QoMSk7XG4gICAgdGhpcy50aGlyZFJlcXVlc3QgPSB0aGlzLmdldFJlcXVlc3QoMik7XG5cbiAgICB0aGlzLmxhc3RSZXF1ZXN0ID0gdGhpcy5nZXRSZXF1ZXN0KGNvdW50IC0gMSk7XG59XG5cbnZhciBmYWtlU2VydmVyID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgc2VydmVyID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgc2VydmVyLmNvbmZpZ3VyZShjb25maWcpO1xuICAgICAgICB0aGlzLnhociA9IGZha2VYaHIudXNlRmFrZVhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHNlcnZlci5yZXF1ZXN0cyA9IFtdO1xuICAgICAgICBzZXJ2ZXIucmVxdWVzdENvdW50ID0gMDtcbiAgICAgICAgc2VydmVyLnF1ZXVlID0gW107XG4gICAgICAgIHNlcnZlci5yZXNwb25zZXMgPSBbXTtcblxuXG4gICAgICAgIHRoaXMueGhyLm9uQ3JlYXRlID0gZnVuY3Rpb24gKHhock9iaikge1xuICAgICAgICAgICAgeGhyT2JqLnVuc2FmZUhlYWRlcnNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhKHNlcnZlci51bnNhZmVIZWFkZXJzRW5hYmxlZCA9PT0gZmFsc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNlcnZlci5hZGRSZXF1ZXN0KHhock9iaik7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9LFxuXG4gICAgY29uZmlndXJlOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHdoaXRlbGlzdCA9IHtcbiAgICAgICAgICAgIFwiYXV0b1Jlc3BvbmRcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiYXV0b1Jlc3BvbmRBZnRlclwiOiB0cnVlLFxuICAgICAgICAgICAgXCJyZXNwb25kSW1tZWRpYXRlbHlcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZmFrZUhUVFBNZXRob2RzXCI6IHRydWUsXG4gICAgICAgICAgICBcImxvZ2dlclwiOiB0cnVlLFxuICAgICAgICAgICAgXCJ1bnNhZmVIZWFkZXJzRW5hYmxlZFwiOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaChmdW5jdGlvbiAoc2V0dGluZykge1xuICAgICAgICAgICAgaWYgKHNldHRpbmcgaW4gd2hpdGVsaXN0KSB7XG4gICAgICAgICAgICAgICAgc2VsZltzZXR0aW5nXSA9IGNvbmZpZ1tzZXR0aW5nXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VsZi5sb2dFcnJvciA9IGNvbmZpZ3VyZUxvZ0Vycm9yKGNvbmZpZyk7XG4gICAgfSxcblxuICAgIGFkZFJlcXVlc3Q6IGZ1bmN0aW9uIGFkZFJlcXVlc3QoeGhyT2JqKSB7XG4gICAgICAgIHZhciBzZXJ2ZXIgPSB0aGlzO1xuICAgICAgICBwdXNoLmNhbGwodGhpcy5yZXF1ZXN0cywgeGhyT2JqKTtcblxuICAgICAgICBpbmNyZW1lbnRSZXF1ZXN0Q291bnQuY2FsbCh0aGlzKTtcblxuICAgICAgICB4aHJPYmoub25TZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VydmVyLmhhbmRsZVJlcXVlc3QodGhpcyk7XG5cbiAgICAgICAgICAgIGlmIChzZXJ2ZXIucmVzcG9uZEltbWVkaWF0ZWx5KSB7XG4gICAgICAgICAgICAgICAgc2VydmVyLnJlc3BvbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyLmF1dG9SZXNwb25kICYmICFzZXJ2ZXIucmVzcG9uZGluZykge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIucmVzcG9uZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIucmVzcG9uZCgpO1xuICAgICAgICAgICAgICAgIH0sIHNlcnZlci5hdXRvUmVzcG9uZEFmdGVyIHx8IDEwKTtcblxuICAgICAgICAgICAgICAgIHNlcnZlci5yZXNwb25kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgZ2V0SFRUUE1ldGhvZDogZnVuY3Rpb24gZ2V0SFRUUE1ldGhvZChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLmZha2VIVFRQTWV0aG9kcyAmJiAvcG9zdC9pLnRlc3QocmVxdWVzdC5tZXRob2QpKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IChyZXF1ZXN0LnJlcXVlc3RCb2R5IHx8IFwiXCIpLm1hdGNoKC9fbWV0aG9kPShbXlxcYjtdKykvKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6IHJlcXVlc3QubWV0aG9kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QubWV0aG9kO1xuICAgIH0sXG5cbiAgICBoYW5kbGVSZXF1ZXN0OiBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KHhocikge1xuICAgICAgICBpZiAoeGhyLmFzeW5jKSB7XG4gICAgICAgICAgICBwdXNoLmNhbGwodGhpcy5xdWV1ZSwgeGhyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3QoeGhyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2dnZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gbm8tb3A7IG92ZXJyaWRlIHZpYSBjb25maWd1cmUoKVxuICAgIH0sXG5cbiAgICBsb2dFcnJvcjogY29uZmlndXJlTG9nRXJyb3Ioe30pLFxuXG4gICAgbG9nOiBmdW5jdGlvbiBsb2cocmVzcG9uc2UsIHJlcXVlc3QpIHtcbiAgICAgICAgdmFyIHN0cjtcblxuICAgICAgICBzdHIgPSBcIlJlcXVlc3Q6XFxuXCIgKyBmb3JtYXQocmVxdWVzdCkgKyBcIlxcblxcblwiO1xuICAgICAgICBzdHIgKz0gXCJSZXNwb25zZTpcXG5cIiArIGZvcm1hdChyZXNwb25zZSkgKyBcIlxcblxcblwiO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2dnZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIoc3RyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXNwb25kV2l0aDogZnVuY3Rpb24gcmVzcG9uZFdpdGgobWV0aG9kLCB1cmwsIGJvZHkpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VBcnJheShtZXRob2QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGJvZHkgPSBtZXRob2Q7XG4gICAgICAgICAgICB1cmwgPSBtZXRob2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGJvZHkgPSB1cmw7XG4gICAgICAgICAgICB1cmwgPSBtZXRob2Q7XG4gICAgICAgICAgICBtZXRob2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaC5jYWxsKHRoaXMucmVzcG9uc2VzLCB7XG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHVybDogdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIiAmJiB1cmwgIT09IFwiXCIgPyBwYXRoVG9SZWdleHAodXJsKSA6IHVybCxcbiAgICAgICAgICAgIHJlc3BvbnNlOiB0eXBlb2YgYm9keSA9PT0gXCJmdW5jdGlvblwiID8gYm9keSA6IHJlc3BvbnNlQXJyYXkoYm9keSlcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc3BvbmQ6IGZ1bmN0aW9uIHJlc3BvbmQoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kV2l0aC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHF1ZXVlID0gdGhpcy5xdWV1ZSB8fCBbXTtcbiAgICAgICAgdmFyIHJlcXVlc3RzID0gcXVldWUuc3BsaWNlKDAsIHF1ZXVlLmxlbmd0aCk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICByZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICBzZWxmLnByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JlcXVlc3Q6IGZ1bmN0aW9uIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IHRoaXMucmVzcG9uc2UgfHwgWzQwNCwge30sIFwiXCJdO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gdGhpcy5yZXNwb25zZXMubGVuZ3RoLCBpID0gbCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5jYWxsKHRoaXMsIHRoaXMucmVzcG9uc2VzW2ldLCByZXF1ZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlc1tpXS5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cocmVzcG9uc2UsIHJlcXVlc3QpO1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25kKHJlc3BvbnNlWzBdLCByZXNwb25zZVsxXSwgcmVzcG9uc2VbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Vycm9yKFwiRmFrZSBzZXJ2ZXIgcmVxdWVzdCBwcm9jZXNzaW5nXCIsIGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhoci5yZXN0b3JlICYmIHRoaXMueGhyLnJlc3RvcmUuYXBwbHkodGhpcy54aHIsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIGdldFJlcXVlc3Q6IGZ1bmN0aW9uIGdldFJlcXVlc3QoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdHNbaW5kZXhdIHx8IG51bGw7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEJlaGF2aW9yKCk7XG4gICAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgfSxcblxuICAgIHJlc2V0QmVoYXZpb3I6IGZ1bmN0aW9uIHJlc2V0QmVoYXZpb3IoKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VzLmxlbmd0aCA9IHRoaXMucXVldWUubGVuZ3RoID0gMDtcbiAgICB9LFxuXG4gICAgcmVzZXRIaXN0b3J5OiBmdW5jdGlvbiByZXNldEhpc3RvcnkoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdHMubGVuZ3RoID0gdGhpcy5yZXF1ZXN0Q291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdGVkT25jZSA9IHRoaXMucmVxdWVzdGVkVHdpY2UgPSB0aGlzLnJlcXVlc3RlZFRocmljZSA9IHRoaXMucmVxdWVzdGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5maXJzdFJlcXVlc3QgPSB0aGlzLnNlY29uZFJlcXVlc3QgPSB0aGlzLnRoaXJkUmVxdWVzdCA9IHRoaXMubGFzdFJlcXVlc3QgPSBudWxsO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmFrZVNlcnZlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZmFrZVNlcnZlciA9IHJlcXVpcmUoXCIuL2Zha2Vfc2VydmVyXCIpO1xudmFyIGZha2VUaW1lcnMgPSByZXF1aXJlKFwiLi9mYWtlX3RpbWVyc1wiKTtcblxuZnVuY3Rpb24gU2VydmVyKCkge31cblNlcnZlci5wcm90b3R5cGUgPSBmYWtlU2VydmVyO1xuXG52YXIgZmFrZVNlcnZlcldpdGhDbG9jayA9IG5ldyBTZXJ2ZXIoKTtcblxuZmFrZVNlcnZlcldpdGhDbG9jay5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24gYWRkUmVxdWVzdCh4aHIpIHtcbiAgICBpZiAoeGhyLmFzeW5jKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dC5jbG9jayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhpcy5jbG9jayA9IHNldFRpbWVvdXQuY2xvY2s7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb2NrID0gZmFrZVRpbWVycy51c2VGYWtlVGltZXJzKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2xvY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvbmdlc3RUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgY2xvY2tTZXRUaW1lb3V0ID0gdGhpcy5jbG9jay5zZXRUaW1lb3V0O1xuICAgICAgICAgICAgdmFyIGNsb2NrU2V0SW50ZXJ2YWwgPSB0aGlzLmNsb2NrLnNldEludGVydmFsO1xuICAgICAgICAgICAgdmFyIHNlcnZlciA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuY2xvY2suc2V0VGltZW91dCA9IGZ1bmN0aW9uIChmbiwgdGltZW91dCkge1xuICAgICAgICAgICAgICAgIHNlcnZlci5sb25nZXN0VGltZW91dCA9IE1hdGgubWF4KHRpbWVvdXQsIHNlcnZlci5sb25nZXN0VGltZW91dCB8fCAwKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjbG9ja1NldFRpbWVvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuY2xvY2suc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiAoZm4sIHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXIubG9uZ2VzdFRpbWVvdXQgPSBNYXRoLm1heCh0aW1lb3V0LCBzZXJ2ZXIubG9uZ2VzdFRpbWVvdXQgfHwgMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2tTZXRJbnRlcnZhbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWtlU2VydmVyLmFkZFJlcXVlc3QuY2FsbCh0aGlzLCB4aHIpO1xufTtcblxuZmFrZVNlcnZlcldpdGhDbG9jay5yZXNwb25kID0gZnVuY3Rpb24gcmVzcG9uZCgpIHtcbiAgICB2YXIgcmV0dXJuVmFsID0gZmFrZVNlcnZlci5yZXNwb25kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAodGhpcy5jbG9jaykge1xuICAgICAgICB0aGlzLmNsb2NrLnRpY2sodGhpcy5sb25nZXN0VGltZW91dCB8fCAwKTtcbiAgICAgICAgdGhpcy5sb25nZXN0VGltZW91dCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMucmVzZXRDbG9jaykge1xuICAgICAgICAgICAgdGhpcy5jbG9jay5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2xvY2sgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWw7XG59O1xuXG5mYWtlU2VydmVyV2l0aENsb2NrLnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKCkge1xuICAgIGlmICh0aGlzLmNsb2NrKSB7XG4gICAgICAgIHRoaXMuY2xvY2sucmVzdG9yZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWtlU2VydmVyLnJlc3RvcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmFrZVNlcnZlcldpdGhDbG9jaztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbGx4ID0gcmVxdWlyZShcImxvbGV4XCIpO1xuXG5leHBvcnRzLnVzZUZha2VUaW1lcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vdztcbiAgICB2YXIgbWV0aG9kcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZHNbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbm93ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBub3cgPSBtZXRob2RzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgdmFyIGNsb2NrID0gbGx4Lmluc3RhbGwobm93IHx8IDAsIG1ldGhvZHMpO1xuICAgIGNsb2NrLnJlc3RvcmUgPSBjbG9jay51bmluc3RhbGw7XG4gICAgcmV0dXJuIGNsb2NrO1xufTtcblxuZXhwb3J0cy5jbG9jayA9IHtcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgcmV0dXJuIGxseC5jcmVhdGVDbG9jayhub3cpO1xuICAgIH1cbn07XG5cbmV4cG9ydHMudGltZXJzID0ge1xuICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsXG4gICAgY2xlYXJUaW1lb3V0OiBjbGVhclRpbWVvdXQsXG4gICAgc2V0SW1tZWRpYXRlOiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IHNldEltbWVkaWF0ZSA6IHVuZGVmaW5lZCksXG4gICAgY2xlYXJJbW1lZGlhdGU6ICh0eXBlb2YgY2xlYXJJbW1lZGlhdGUgIT09IFwidW5kZWZpbmVkXCIgPyBjbGVhckltbWVkaWF0ZSA6IHVuZGVmaW5lZCksXG4gICAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsLFxuICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgRGF0ZTogRGF0ZVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgVGV4dEVuY29kZXIgPSByZXF1aXJlKFwidGV4dC1lbmNvZGluZ1wiKS5UZXh0RW5jb2RlcjtcblxudmFyIGNvbmZpZ3VyZUxvZ0Vycm9yID0gcmVxdWlyZShcIi4vY29yZS9sb2dfZXJyb3JcIik7XG52YXIgc2lub25FdmVudCA9IHJlcXVpcmUoXCIuL2V2ZW50XCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL2NvcmUvZXh0ZW5kXCIpO1xuXG5mdW5jdGlvbiBnZXRXb3JraW5nWEhSKGdsb2JhbFNjb3BlKSB7XG4gICAgdmFyIHN1cHBvcnRzWEhSID0gdHlwZW9mIGdsb2JhbFNjb3BlLlhNTEh0dHBSZXF1ZXN0ICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIGlmIChzdXBwb3J0c1hIUikge1xuICAgICAgICByZXR1cm4gZ2xvYmFsU2NvcGUuWE1MSHR0cFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgdmFyIHN1cHBvcnRzQWN0aXZlWCA9IHR5cGVvZiBnbG9iYWxTY29wZS5BY3RpdmVYT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIGlmIChzdXBwb3J0c0FjdGl2ZVgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgZ2xvYmFsU2NvcGUuQWN0aXZlWE9iamVjdChcIk1TWE1MMi5YTUxIVFRQLjMuMFwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBzdXBwb3J0c1Byb2dyZXNzID0gdHlwZW9mIFByb2dyZXNzRXZlbnQgIT09IFwidW5kZWZpbmVkXCI7XG52YXIgc3VwcG9ydHNDdXN0b21FdmVudCA9IHR5cGVvZiBDdXN0b21FdmVudCAhPT0gXCJ1bmRlZmluZWRcIjtcbnZhciBzdXBwb3J0c0Zvcm1EYXRhID0gdHlwZW9mIEZvcm1EYXRhICE9PSBcInVuZGVmaW5lZFwiO1xudmFyIHN1cHBvcnRzQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09IFwidW5kZWZpbmVkXCI7XG52YXIgc3VwcG9ydHNCbG9iID0gcmVxdWlyZShcIi4uL2Jsb2JcIikuaXNTdXBwb3J0ZWQ7XG52YXIgaXNSZWFjdE5hdGl2ZSA9IGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5wcm9kdWN0ID09PSBcIlJlYWN0TmF0aXZlXCI7XG52YXIgc2lub25YaHIgPSB7IFhNTEh0dHBSZXF1ZXN0OiBnbG9iYWwuWE1MSHR0cFJlcXVlc3QgfTtcbnNpbm9uWGhyLkdsb2JhbFhNTEh0dHBSZXF1ZXN0ID0gZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0O1xuc2lub25YaHIuR2xvYmFsQWN0aXZlWE9iamVjdCA9IGdsb2JhbC5BY3RpdmVYT2JqZWN0O1xuc2lub25YaHIuc3VwcG9ydHNBY3RpdmVYID0gdHlwZW9mIHNpbm9uWGhyLkdsb2JhbEFjdGl2ZVhPYmplY3QgIT09IFwidW5kZWZpbmVkXCI7XG5zaW5vblhoci5zdXBwb3J0c1hIUiA9IHR5cGVvZiBzaW5vblhoci5HbG9iYWxYTUxIdHRwUmVxdWVzdCAhPT0gXCJ1bmRlZmluZWRcIjtcbnNpbm9uWGhyLndvcmtpbmdYSFIgPSBnZXRXb3JraW5nWEhSKGdsb2JhbCk7XG5zaW5vblhoci5zdXBwb3J0c0NPUlMgPSBpc1JlYWN0TmF0aXZlIHx8XG4gICAgKHNpbm9uWGhyLnN1cHBvcnRzWEhSICYmIFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBzaW5vblhoci5HbG9iYWxYTUxIdHRwUmVxdWVzdCgpKSk7XG5cbnZhciB1bnNhZmVIZWFkZXJzID0ge1xuICAgIFwiQWNjZXB0LUNoYXJzZXRcIjogdHJ1ZSxcbiAgICBcIkFjY2VwdC1FbmNvZGluZ1wiOiB0cnVlLFxuICAgIFwiQ29ubmVjdGlvblwiOiB0cnVlLFxuICAgIFwiQ29udGVudC1MZW5ndGhcIjogdHJ1ZSxcbiAgICBcIkNvb2tpZVwiOiB0cnVlLFxuICAgIFwiQ29va2llMlwiOiB0cnVlLFxuICAgIFwiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ1wiOiB0cnVlLFxuICAgIFwiRGF0ZVwiOiB0cnVlLFxuICAgIFwiRXhwZWN0XCI6IHRydWUsXG4gICAgXCJIb3N0XCI6IHRydWUsXG4gICAgXCJLZWVwLUFsaXZlXCI6IHRydWUsXG4gICAgXCJSZWZlcmVyXCI6IHRydWUsXG4gICAgXCJURVwiOiB0cnVlLFxuICAgIFwiVHJhaWxlclwiOiB0cnVlLFxuICAgIFwiVHJhbnNmZXItRW5jb2RpbmdcIjogdHJ1ZSxcbiAgICBcIlVwZ3JhZGVcIjogdHJ1ZSxcbiAgICBcIlVzZXItQWdlbnRcIjogdHJ1ZSxcbiAgICBcIlZpYVwiOiB0cnVlXG59O1xuXG5cbmZ1bmN0aW9uIEV2ZW50VGFyZ2V0SGFuZGxlcigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGV2ZW50cyA9IFtcImxvYWRzdGFydFwiLCBcInByb2dyZXNzXCIsIFwiYWJvcnRcIiwgXCJlcnJvclwiLCBcImxvYWRcIiwgXCJ0aW1lb3V0XCIsIFwibG9hZGVuZFwiXTtcblxuICAgIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lKSB7XG4gICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gc2VsZltcIm9uXCIgKyBldmVudE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAobGlzdGVuZXIgJiYgdHlwZW9mIGxpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXZlbnRzLmZvckVhY2goYWRkRXZlbnRMaXN0ZW5lcik7XG59XG5cbkV2ZW50VGFyZ2V0SGFuZGxlci5wcm90b3R5cGUgPSBzaW5vbkV2ZW50LkV2ZW50VGFyZ2V0O1xuXG4vLyBOb3RlIHRoYXQgZm9yIEZha2VYTUxIdHRwUmVxdWVzdCB0byB3b3JrIHByZSBFUzVcbi8vIHdlIGxvc2Ugc29tZSBvZiB0aGUgYWxpZ25tZW50IHdpdGggdGhlIHNwZWMuXG4vLyBUbyBlbnN1cmUgYXMgY2xvc2UgYSBtYXRjaCBhcyBwb3NzaWJsZSxcbi8vIHNldCByZXNwb25zZVR5cGUgYmVmb3JlIGNhbGxpbmcgb3Blbiwgc2VuZCBvciByZXNwb25kO1xuZnVuY3Rpb24gRmFrZVhNTEh0dHBSZXF1ZXN0KGNvbmZpZykge1xuICAgIEV2ZW50VGFyZ2V0SGFuZGxlci5jYWxsKHRoaXMpO1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9IEZha2VYTUxIdHRwUmVxdWVzdC5VTlNFTlQ7XG4gICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIHRoaXMucmVxdWVzdEJvZHkgPSBudWxsO1xuICAgIHRoaXMuc3RhdHVzID0gMDtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBcIlwiO1xuICAgIHRoaXMudXBsb2FkID0gbmV3IEV2ZW50VGFyZ2V0SGFuZGxlcigpO1xuICAgIHRoaXMucmVzcG9uc2VUeXBlID0gXCJcIjtcbiAgICB0aGlzLnJlc3BvbnNlID0gXCJcIjtcbiAgICB0aGlzLmxvZ0Vycm9yID0gY29uZmlndXJlTG9nRXJyb3IoY29uZmlnKTtcbiAgICBpZiAoc2lub25YaHIuc3VwcG9ydHNDT1JTKSB7XG4gICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBGYWtlWE1MSHR0cFJlcXVlc3Qub25DcmVhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBGYWtlWE1MSHR0cFJlcXVlc3Qub25DcmVhdGUodGhpcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2ZXJpZnlTdGF0ZSh4aHIpIHtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IEZha2VYTUxIdHRwUmVxdWVzdC5PUEVORUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRF9TVEFURV9FUlJcIik7XG4gICAgfVxuXG4gICAgaWYgKHhoci5zZW5kRmxhZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEX1NUQVRFX0VSUlwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEhlYWRlcihoZWFkZXJzLCBoZWFkZXIpIHtcbiAgICB2YXIgZm91bmRIZWFkZXIgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5maWx0ZXIoZnVuY3Rpb24gKGgpIHtcbiAgICAgICAgcmV0dXJuIGgudG9Mb3dlckNhc2UoKSA9PT0gaGVhZGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm91bmRIZWFkZXJbMF0gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldENvb2tpZTJIZWFkZXIoaGVhZGVyKSB7XG4gICAgcmV0dXJuICEvXlNldC1Db29raWUyPyQvaS50ZXN0KGhlYWRlcik7XG59XG5cbi8vIGxhcmdlc3QgYXJpdHkgaW4gWEhSIGlzIDUgLSBYSFIjb3BlblxudmFyIGFwcGx5ID0gZnVuY3Rpb24gKG9iaiwgbWV0aG9kLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBvYmpbbWV0aG9kXSgpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBvYmpbbWV0aG9kXShhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gb2JqW21ldGhvZF0oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG9ialttZXRob2RdKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBvYmpbbWV0aG9kXShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgY2FzZSA1OiByZXR1cm4gb2JqW21ldGhvZF0oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBjYXNlXCIpO1xuICAgIH1cbn07XG5cbkZha2VYTUxIdHRwUmVxdWVzdC5maWx0ZXJzID0gW107XG5GYWtlWE1MSHR0cFJlcXVlc3QuYWRkRmlsdGVyID0gZnVuY3Rpb24gYWRkRmlsdGVyKGZuKSB7XG4gICAgdGhpcy5maWx0ZXJzLnB1c2goZm4pO1xufTtcbkZha2VYTUxIdHRwUmVxdWVzdC5kZWZha2UgPSBmdW5jdGlvbiBkZWZha2UoZmFrZVhociwgeGhyQXJncykge1xuICAgIHZhciB4aHIgPSBuZXcgc2lub25YaHIud29ya2luZ1hIUigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblxuICAgIFtcbiAgICAgICAgXCJvcGVuXCIsXG4gICAgICAgIFwic2V0UmVxdWVzdEhlYWRlclwiLFxuICAgICAgICBcInNlbmRcIixcbiAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICBcImdldFJlc3BvbnNlSGVhZGVyXCIsXG4gICAgICAgIFwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzXCIsXG4gICAgICAgIFwiYWRkRXZlbnRMaXN0ZW5lclwiLFxuICAgICAgICBcIm92ZXJyaWRlTWltZVR5cGVcIixcbiAgICAgICAgXCJyZW1vdmVFdmVudExpc3RlbmVyXCJcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICBmYWtlWGhyW21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoeGhyLCBtZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICB2YXIgY29weUF0dHJzID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgICAgICBmYWtlWGhyW2F0dHJdID0geGhyW2F0dHJdO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIHN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gc3RhdGVDaGFuZ2UoKSB7XG4gICAgICAgIGZha2VYaHIucmVhZHlTdGF0ZSA9IHhoci5yZWFkeVN0YXRlO1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPj0gRmFrZVhNTEh0dHBSZXF1ZXN0LkhFQURFUlNfUkVDRUlWRUQpIHtcbiAgICAgICAgICAgIGNvcHlBdHRycyhbXCJzdGF0dXNcIiwgXCJzdGF0dXNUZXh0XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPj0gRmFrZVhNTEh0dHBSZXF1ZXN0LkxPQURJTkcpIHtcbiAgICAgICAgICAgIGNvcHlBdHRycyhbXCJyZXNwb25zZVRleHRcIiwgXCJyZXNwb25zZVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSBGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xuICAgICAgICAgICAgY29weUF0dHJzKFtcInJlc3BvbnNlWE1MXCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFrZVhoci5vbnJlYWR5c3RhdGVjaGFuZ2UpIHtcbiAgICAgICAgICAgIGZha2VYaHIub25yZWFkeXN0YXRlY2hhbmdlLmNhbGwoZmFrZVhociwgeyB0YXJnZXQ6IGZha2VYaHIgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHhoci5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGZha2VYaHIuZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAvKmVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyovXG4gICAgICAgICAgICBmYWtlWGhyLmV2ZW50TGlzdGVuZXJzW2V2ZW50XS5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKmVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jKi9cbiAgICAgICAgfSk7XG5cbiAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoXCJyZWFkeXN0YXRlY2hhbmdlXCIsIHN0YXRlQ2hhbmdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gc3RhdGVDaGFuZ2U7XG4gICAgfVxuICAgIGFwcGx5KHhociwgXCJvcGVuXCIsIHhockFyZ3MpO1xufTtcbkZha2VYTUxIdHRwUmVxdWVzdC51c2VGaWx0ZXJzID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHZlcmlmeVJlcXVlc3RPcGVuZWQoeGhyKSB7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuT1BFTkVEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSIC0gXCIgKyB4aHIucmVhZHlTdGF0ZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2ZXJpZnlSZXF1ZXN0U2VudCh4aHIpIHtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IEZha2VYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlcXVlc3QgZG9uZVwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUhlYWRlcnNSZWNlaXZlZCh4aHIpIHtcbiAgICBpZiAoeGhyLmFzeW5jICYmIHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuSEVBREVSU19SRUNFSVZFRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBoZWFkZXJzIHJlY2VpdmVkXCIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmVyaWZ5UmVzcG9uc2VCb2R5VHlwZShib2R5KSB7XG4gICAgaWYgKHR5cGVvZiBib2R5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihcIkF0dGVtcHRlZCB0byByZXNwb25kIHRvIGZha2UgWE1MSHR0cFJlcXVlc3Qgd2l0aCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKyBcIiwgd2hpY2ggaXMgbm90IGEgc3RyaW5nLlwiKTtcbiAgICAgICAgZXJyb3IubmFtZSA9IFwiSW52YWxpZEJvZHlFeGNlcHRpb25cIjtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0VG9BcnJheUJ1ZmZlcihib2R5LCBlbmNvZGluZykge1xuICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoZW5jb2RpbmcgfHwgXCJ1dGYtOFwiKS5lbmNvZGUoYm9keSkuYnVmZmVyO1xufVxuXG5mdW5jdGlvbiBpc1htbENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKSB7XG4gICAgcmV0dXJuICFjb250ZW50VHlwZSB8fCAvKHRleHRcXC94bWwpfChhcHBsaWNhdGlvblxcL3htbCl8KFxcK3htbCkvLnRlc3QoY29udGVudFR5cGUpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UmVzcG9uc2VCb2R5KHJlc3BvbnNlVHlwZSwgY29udGVudFR5cGUsIGJvZHkpIHtcbiAgICBpZiAocmVzcG9uc2VUeXBlID09PSBcIlwiIHx8IHJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0FycmF5QnVmZmVyICYmIHJlc3BvbnNlVHlwZSA9PT0gXCJhcnJheWJ1ZmZlclwiKSB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0VG9BcnJheUJ1ZmZlcihib2R5KTtcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gcGFyc2luZyBmYWlsdXJlIGFzIG51bGxcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0Jsb2IgJiYgcmVzcG9uc2VUeXBlID09PSBcImJsb2JcIikge1xuICAgICAgICB2YXIgYmxvYk9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICBibG9iT3B0aW9ucy50eXBlID0gY29udGVudFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtjb252ZXJ0VG9BcnJheUJ1ZmZlcihib2R5KV0sIGJsb2JPcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PT0gXCJkb2N1bWVudFwiKSB7XG4gICAgICAgIGlmIChpc1htbENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZha2VYTUxIdHRwUmVxdWVzdC5wYXJzZVhNTChib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByZXNwb25zZVR5cGUgXCIgKyByZXNwb25zZVR5cGUpO1xufVxuXG5mdW5jdGlvbiBjbGVhclJlc3BvbnNlKHhocikge1xuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiIHx8IHhoci5yZXNwb25zZVR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIHhoci5yZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHQgPSBcIlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHhoci5yZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHQgPSBudWxsO1xuICAgIH1cbiAgICB4aHIucmVzcG9uc2VYTUwgPSBudWxsO1xufVxuXG5GYWtlWE1MSHR0cFJlcXVlc3QucGFyc2VYTUwgPSBmdW5jdGlvbiBwYXJzZVhNTCh0ZXh0KSB7XG4gICAgLy8gVHJlYXQgZW1wdHkgc3RyaW5nIGFzIHBhcnNpbmcgZmFpbHVyZVxuICAgIGlmICh0ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIERPTVBhcnNlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGV4dCwgXCJ0ZXh0L3htbFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB4bWxEb2MgPSBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoXCJNaWNyb3NvZnQuWE1MRE9NXCIpO1xuICAgICAgICAgICAgeG1sRG9jLmFzeW5jID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgeG1sRG9jLmxvYWRYTUwodGV4dCk7XG4gICAgICAgICAgICByZXR1cm4geG1sRG9jO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBVbmFibGUgdG8gcGFyc2UgWE1MIC0gbm8gYmlnZ2llXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbkZha2VYTUxIdHRwUmVxdWVzdC5zdGF0dXNDb2RlcyA9IHtcbiAgICAxMDA6IFwiQ29udGludWVcIixcbiAgICAxMDE6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuICAgIDIwMDogXCJPS1wiLFxuICAgIDIwMTogXCJDcmVhdGVkXCIsXG4gICAgMjAyOiBcIkFjY2VwdGVkXCIsXG4gICAgMjAzOiBcIk5vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uXCIsXG4gICAgMjA0OiBcIk5vIENvbnRlbnRcIixcbiAgICAyMDU6IFwiUmVzZXQgQ29udGVudFwiLFxuICAgIDIwNjogXCJQYXJ0aWFsIENvbnRlbnRcIixcbiAgICAyMDc6IFwiTXVsdGktU3RhdHVzXCIsXG4gICAgMzAwOiBcIk11bHRpcGxlIENob2ljZVwiLFxuICAgIDMwMTogXCJNb3ZlZCBQZXJtYW5lbnRseVwiLFxuICAgIDMwMjogXCJGb3VuZFwiLFxuICAgIDMwMzogXCJTZWUgT3RoZXJcIixcbiAgICAzMDQ6IFwiTm90IE1vZGlmaWVkXCIsXG4gICAgMzA1OiBcIlVzZSBQcm94eVwiLFxuICAgIDMwNzogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcbiAgICA0MDA6IFwiQmFkIFJlcXVlc3RcIixcbiAgICA0MDE6IFwiVW5hdXRob3JpemVkXCIsXG4gICAgNDAyOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcbiAgICA0MDM6IFwiRm9yYmlkZGVuXCIsXG4gICAgNDA0OiBcIk5vdCBGb3VuZFwiLFxuICAgIDQwNTogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcbiAgICA0MDY6IFwiTm90IEFjY2VwdGFibGVcIixcbiAgICA0MDc6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgICA0MDg6IFwiUmVxdWVzdCBUaW1lb3V0XCIsXG4gICAgNDA5OiBcIkNvbmZsaWN0XCIsXG4gICAgNDEwOiBcIkdvbmVcIixcbiAgICA0MTE6IFwiTGVuZ3RoIFJlcXVpcmVkXCIsXG4gICAgNDEyOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIixcbiAgICA0MTM6IFwiUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlXCIsXG4gICAgNDE0OiBcIlJlcXVlc3QtVVJJIFRvbyBMb25nXCIsXG4gICAgNDE1OiBcIlVuc3VwcG9ydGVkIE1lZGlhIFR5cGVcIixcbiAgICA0MTY6IFwiUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLFxuICAgIDQxNzogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcbiAgICA0MjI6IFwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcbiAgICA1MDA6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXG4gICAgNTAxOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuICAgIDUwMjogXCJCYWQgR2F0ZXdheVwiLFxuICAgIDUwMzogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXG4gICAgNTA0OiBcIkdhdGV3YXkgVGltZW91dFwiLFxuICAgIDUwNTogXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiXG59O1xuXG5leHRlbmQoRmFrZVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwgc2lub25FdmVudC5FdmVudFRhcmdldCwge1xuICAgIGFzeW5jOiB0cnVlLFxuXG4gICAgb3BlbjogZnVuY3Rpb24gb3BlbihtZXRob2QsIHVybCwgYXN5bmMsIHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuYXN5bmMgPSB0eXBlb2YgYXN5bmMgPT09IFwiYm9vbGVhblwiID8gYXN5bmMgOiB0cnVlO1xuICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICAgICAgY2xlYXJSZXNwb25zZSh0aGlzKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgICAgICB0aGlzLnNlbmRGbGFnID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKEZha2VYTUxIdHRwUmVxdWVzdC51c2VGaWx0ZXJzID09PSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgeGhyQXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgIHZhciBkZWZha2UgPSBGYWtlWE1MSHR0cFJlcXVlc3QuZmlsdGVycy5zb21lKGZ1bmN0aW9uIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyLmFwcGx5KHRoaXMsIHhockFyZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVmYWtlKSB7XG4gICAgICAgICAgICAgICAgRmFrZVhNTEh0dHBSZXF1ZXN0LmRlZmFrZSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWR5U3RhdGVDaGFuZ2UoRmFrZVhNTEh0dHBSZXF1ZXN0Lk9QRU5FRCk7XG4gICAgfSxcblxuICAgIHJlYWR5U3RhdGVDaGFuZ2U6IGZ1bmN0aW9uIHJlYWR5U3RhdGVDaGFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gc3RhdGU7XG5cbiAgICAgICAgdmFyIHJlYWR5U3RhdGVDaGFuZ2VFdmVudCA9IG5ldyBzaW5vbkV2ZW50LkV2ZW50KFwicmVhZHlzdGF0ZWNoYW5nZVwiLCBmYWxzZSwgZmFsc2UsIHRoaXMpO1xuICAgICAgICB2YXIgZXZlbnQsIHByb2dyZXNzO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZShyZWFkeVN0YXRlQ2hhbmdlRXZlbnQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nRXJyb3IoXCJGYWtlIFhIUiBvbnJlYWR5c3RhdGVjaGFuZ2UgaGFuZGxlclwiLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IEZha2VYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hYm9ydGVkIHx8IHRoaXMuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB7bG9hZGVkOiAwLCB0b3RhbDogMH07XG4gICAgICAgICAgICAgICAgZXZlbnQgPSB0aGlzLmFib3J0ZWQgPyBcImFib3J0XCIgOiBcImVycm9yXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzID0ge2xvYWRlZDogMTAwLCB0b3RhbDogMTAwfTtcbiAgICAgICAgICAgICAgICBldmVudCA9IFwibG9hZFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3VwcG9ydHNQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcInByb2dyZXNzXCIsIHByb2dyZXNzLCB0aGlzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWQuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KGV2ZW50LCBwcm9ncmVzcywgdGhpcykpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcImxvYWRlbmRcIiwgcHJvZ3Jlc3MsIHRoaXMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBzaW5vbkV2ZW50LlByb2dyZXNzRXZlbnQoXCJwcm9ncmVzc1wiLCBwcm9ncmVzcywgdGhpcykpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBzaW5vbkV2ZW50LlByb2dyZXNzRXZlbnQoZXZlbnQsIHByb2dyZXNzLCB0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcImxvYWRlbmRcIiwgcHJvZ3Jlc3MsIHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChyZWFkeVN0YXRlQ2hhbmdlRXZlbnQpO1xuICAgIH0sXG5cbiAgICBzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgdmFsdWUpIHtcbiAgICAgICAgdmVyaWZ5U3RhdGUodGhpcyk7XG5cbiAgICAgICAgdmFyIGNoZWNrVW5zYWZlSGVhZGVycyA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51bnNhZmVIZWFkZXJzRW5hYmxlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjaGVja1Vuc2FmZUhlYWRlcnMgPSB0aGlzLnVuc2FmZUhlYWRlcnNFbmFibGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hlY2tVbnNhZmVIZWFkZXJzICYmICh1bnNhZmVIZWFkZXJzW2hlYWRlcl0gfHwgL14oU2VjLXxQcm94eS0pLy50ZXN0KGhlYWRlcikpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWZ1c2VkIHRvIHNldCB1bnNhZmUgaGVhZGVyIFxcXCJcIiArIGhlYWRlciArIFwiXFxcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RIZWFkZXJzW2hlYWRlcl0pIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnNbaGVhZGVyXSArPSBcIixcIiArIHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVyc1toZWFkZXJdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0U3RhdHVzOiBmdW5jdGlvbiBzZXRTdGF0dXMoc3RhdHVzKSB7XG4gICAgICAgIHZhciBzYW5pdGl6ZWRTdGF0dXMgPSB0eXBlb2Ygc3RhdHVzID09PSBcIm51bWJlclwiID8gc3RhdHVzIDogMjAwO1xuXG4gICAgICAgIHZlcmlmeVJlcXVlc3RPcGVuZWQodGhpcyk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc2FuaXRpemVkU3RhdHVzO1xuICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSBGYWtlWE1MSHR0cFJlcXVlc3Quc3RhdHVzQ29kZXNbc2FuaXRpemVkU3RhdHVzXTtcbiAgICB9LFxuXG4gICAgLy8gSGVscHMgdGVzdGluZ1xuICAgIHNldFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24gc2V0UmVzcG9uc2VIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICAgICAgdmVyaWZ5UmVxdWVzdE9wZW5lZCh0aGlzKTtcblxuICAgICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1toZWFkZXJdID0gaGVhZGVyc1toZWFkZXJdO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5hc3luYykge1xuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IEZha2VYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEN1cnJlbnRseSB0cmVhdHMgQUxMIGRhdGEgYXMgYSBET01TdHJpbmcgKGkuZS4gbm8gRG9jdW1lbnQpXG4gICAgc2VuZDogZnVuY3Rpb24gc2VuZChkYXRhKSB7XG4gICAgICAgIHZlcmlmeVN0YXRlKHRoaXMpO1xuXG4gICAgICAgIGlmICghL14oaGVhZCkkL2kudGVzdCh0aGlzLm1ldGhvZCkpIHtcbiAgICAgICAgICAgIHZhciBjb250ZW50VHlwZSA9IGdldEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3RIZWFkZXJzW2NvbnRlbnRUeXBlXSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucmVxdWVzdEhlYWRlcnNbY29udGVudFR5cGVdLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzW2NvbnRlbnRUeXBlXSA9IHZhbHVlWzBdICsgXCI7Y2hhcnNldD11dGYtOFwiO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0c0Zvcm1EYXRhICYmICEoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtOFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RCb2R5ID0gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXJyb3JGbGFnID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VuZEZsYWcgPSB0aGlzLmFzeW5jO1xuICAgICAgICBjbGVhclJlc3BvbnNlKHRoaXMpO1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGVDaGFuZ2UoRmFrZVhNTEh0dHBSZXF1ZXN0Lk9QRU5FRCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uU2VuZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLm9uU2VuZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5FdmVudChcImxvYWRzdGFydFwiLCBmYWxzZSwgZmFsc2UsIHRoaXMpKTtcbiAgICB9LFxuXG4gICAgYWJvcnQ6IGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgICB0aGlzLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclJlc3BvbnNlKHRoaXMpO1xuICAgICAgICB0aGlzLmVycm9yRmxhZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSB7fTtcblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuVU5TRU5UICYmIHRoaXMuc2VuZEZsYWdcbiAgICAgICAgICAgICYmIHRoaXMucmVhZHlTdGF0ZSAhPT0gRmFrZVhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZUNoYW5nZShGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORSk7XG4gICAgICAgICAgICB0aGlzLnNlbmRGbGFnID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBGYWtlWE1MSHR0cFJlcXVlc3QuVU5TRU5UO1xuICAgIH0sXG5cbiAgICBlcnJvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjbGVhclJlc3BvbnNlKHRoaXMpO1xuICAgICAgICB0aGlzLmVycm9yRmxhZyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSB7fTtcblxuICAgICAgICB0aGlzLnJlYWR5U3RhdGVDaGFuZ2UoRmFrZVhNTEh0dHBSZXF1ZXN0LkRPTkUpO1xuICAgIH0sXG5cbiAgICBnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPCBGYWtlWE1MSHR0cFJlcXVlc3QuSEVBREVSU19SRUNFSVZFRCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoL15TZXQtQ29va2llMj8kL2kudGVzdChoZWFkZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGhlYWRlciA9IGdldEhlYWRlcih0aGlzLnJlc3BvbnNlSGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZUhlYWRlcnNbaGVhZGVyXSB8fCBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uIGdldEFsbFJlc3BvbnNlSGVhZGVycygpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA8IEZha2VYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXNwb25zZUhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycztcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBPYmplY3Qua2V5cyhyZXNwb25zZUhlYWRlcnMpXG4gICAgICAgICAgICAuZmlsdGVyKGV4Y2x1ZGVTZXRDb29raWUySGVhZGVyKVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAocHJldiwgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVzcG9uc2VIZWFkZXJzW2hlYWRlcl07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIChoZWFkZXIgKyBcIjogXCIgKyB2YWx1ZSArIFwiXFxyXFxuXCIpO1xuICAgICAgICAgICAgfSwgXCJcIik7XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfSxcblxuICAgIHNldFJlc3BvbnNlQm9keTogZnVuY3Rpb24gc2V0UmVzcG9uc2VCb2R5KGJvZHkpIHtcbiAgICAgICAgdmVyaWZ5UmVxdWVzdFNlbnQodGhpcyk7XG4gICAgICAgIHZlcmlmeUhlYWRlcnNSZWNlaXZlZCh0aGlzKTtcbiAgICAgICAgdmVyaWZ5UmVzcG9uc2VCb2R5VHlwZShib2R5KTtcbiAgICAgICAgdmFyIGNvbnRlbnRUeXBlID0gdGhpcy5vdmVycmlkZGVuTWltZVR5cGUgfHwgdGhpcy5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKTtcblxuICAgICAgICB2YXIgaXNUZXh0UmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gXCJcIiB8fCB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCI7XG4gICAgICAgIGNsZWFyUmVzcG9uc2UodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmFzeW5jKSB7XG4gICAgICAgICAgICB2YXIgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemUgfHwgMTA7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5MT0FESU5HKTtcblxuICAgICAgICAgICAgICAgIGlmIChpc1RleHRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IHRoaXMucmVzcG9uc2UgKz0gYm9keS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgY2h1bmtTaXplKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gY2h1bmtTaXplO1xuICAgICAgICAgICAgfSB3aGlsZSAoaW5kZXggPCBib2R5Lmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gY29udmVydFJlc3BvbnNlQm9keSh0aGlzLnJlc3BvbnNlVHlwZSwgY29udGVudFR5cGUsIGJvZHkpO1xuICAgICAgICBpZiAoaXNUZXh0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gdGhpcy5yZXNwb25zZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlVHlwZSA9PT0gXCJkb2N1bWVudFwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlWE1MID0gdGhpcy5yZXNwb25zZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc3BvbnNlVHlwZSA9PT0gXCJcIiAmJiBpc1htbENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZVhNTCA9IEZha2VYTUxIdHRwUmVxdWVzdC5wYXJzZVhNTCh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5ET05FKTtcbiAgICB9LFxuXG4gICAgcmVzcG9uZDogZnVuY3Rpb24gcmVzcG9uZChzdGF0dXMsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0dXMoc3RhdHVzKTtcbiAgICAgICAgdGhpcy5zZXRSZXNwb25zZUhlYWRlcnMoaGVhZGVycyB8fCB7fSk7XG4gICAgICAgIHRoaXMuc2V0UmVzcG9uc2VCb2R5KGJvZHkgfHwgXCJcIik7XG4gICAgfSxcblxuICAgIHVwbG9hZFByb2dyZXNzOiBmdW5jdGlvbiB1cGxvYWRQcm9ncmVzcyhwcm9ncmVzc0V2ZW50UmF3KSB7XG4gICAgICAgIGlmIChzdXBwb3J0c1Byb2dyZXNzKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZC5kaXNwYXRjaEV2ZW50KG5ldyBzaW5vbkV2ZW50LlByb2dyZXNzRXZlbnQoXCJwcm9ncmVzc1wiLCBwcm9ncmVzc0V2ZW50UmF3KSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZG93bmxvYWRQcm9ncmVzczogZnVuY3Rpb24gZG93bmxvYWRQcm9ncmVzcyhwcm9ncmVzc0V2ZW50UmF3KSB7XG4gICAgICAgIGlmIChzdXBwb3J0c1Byb2dyZXNzKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcInByb2dyZXNzXCIsIHByb2dyZXNzRXZlbnRSYXcpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGxvYWRFcnJvcjogZnVuY3Rpb24gdXBsb2FkRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzQ3VzdG9tRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuQ3VzdG9tRXZlbnQoXCJlcnJvclwiLCB7ZGV0YWlsOiBlcnJvcn0pKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiBvdmVycmlkZU1pbWVUeXBlKHR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA+PSBGYWtlWE1MSHR0cFJlcXVlc3QuTE9BRElORykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRF9TVEFURV9FUlJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdmVycmlkZGVuTWltZVR5cGUgPSB0eXBlO1xuICAgIH1cbn0pO1xuXG52YXIgc3RhdGVzID0ge1xuICAgIFVOU0VOVDogMCxcbiAgICBPUEVORUQ6IDEsXG4gICAgSEVBREVSU19SRUNFSVZFRDogMixcbiAgICBMT0FESU5HOiAzLFxuICAgIERPTkU6IDRcbn07XG5cbmV4dGVuZChGYWtlWE1MSHR0cFJlcXVlc3QsIHN0YXRlcyk7XG5leHRlbmQoRmFrZVhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSwgc3RhdGVzKTtcblxuZnVuY3Rpb24gdXNlRmFrZVhNTEh0dHBSZXF1ZXN0KCkge1xuICAgIEZha2VYTUxIdHRwUmVxdWVzdC5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShrZWVwT25DcmVhdGUpIHtcbiAgICAgICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzWEhSKSB7XG4gICAgICAgICAgICBnbG9iYWwuWE1MSHR0cFJlcXVlc3QgPSBzaW5vblhoci5HbG9iYWxYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW5vblhoci5zdXBwb3J0c0FjdGl2ZVgpIHtcbiAgICAgICAgICAgIGdsb2JhbC5BY3RpdmVYT2JqZWN0ID0gc2lub25YaHIuR2xvYmFsQWN0aXZlWE9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBGYWtlWE1MSHR0cFJlcXVlc3QucmVzdG9yZTtcblxuICAgICAgICBpZiAoa2VlcE9uQ3JlYXRlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBkZWxldGUgRmFrZVhNTEh0dHBSZXF1ZXN0Lm9uQ3JlYXRlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoc2lub25YaHIuc3VwcG9ydHNYSFIpIHtcbiAgICAgICAgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0ID0gRmFrZVhNTEh0dHBSZXF1ZXN0O1xuICAgIH1cblxuICAgIGlmIChzaW5vblhoci5zdXBwb3J0c0FjdGl2ZVgpIHtcbiAgICAgICAgZ2xvYmFsLkFjdGl2ZVhPYmplY3QgPSBmdW5jdGlvbiBBY3RpdmVYT2JqZWN0KG9iaklkKSB7XG4gICAgICAgICAgICBpZiAob2JqSWQgPT09IFwiTWljcm9zb2Z0LlhNTEhUVFBcIiB8fCAvXk1zeG1sMlxcLlhNTEhUVFAvaS50ZXN0KG9iaklkKSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWtlWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBzaW5vblhoci5HbG9iYWxBY3RpdmVYT2JqZWN0KG9iaklkKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gRmFrZVhNTEh0dHBSZXF1ZXN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICB4aHI6IHNpbm9uWGhyLFxuICAgIEZha2VYTUxIdHRwUmVxdWVzdDogRmFrZVhNTEh0dHBSZXF1ZXN0LFxuICAgIHVzZUZha2VYTUxIdHRwUmVxdWVzdDogdXNlRmFrZVhNTEh0dHBSZXF1ZXN0XG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuICBsZXQgcmV0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8aW5zPicpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8ZGVsPicpO1xuICAgIH1cblxuICAgIHJldC5wdXNoKGVzY2FwZUhUTUwoY2hhbmdlLnZhbHVlKSk7XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICByZXQucHVzaCgnPC9pbnM+Jyk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgcmV0LnB1c2goJzwvZGVsPicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgbGV0IG4gPSBzO1xuICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXG4gIHJldHVybiBuO1xufVxuIiwiKCh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCAmJiBmdW5jdGlvbiAobSkge1xuICAgIGRlZmluZShcImZvcm1hdGlvXCIsIFtcInNhbXNhbVwiXSwgbSk7XG59KSB8fCAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBmdW5jdGlvbiAobSkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gbShyZXF1aXJlKFwic2Ftc2FtXCIpKTtcbn0pIHx8IGZ1bmN0aW9uIChtKSB7IHRoaXMuZm9ybWF0aW8gPSBtKHRoaXMuc2Ftc2FtKTsgfVxuKShmdW5jdGlvbiAoc2Ftc2FtKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgZm9ybWF0aW8gPSB7XG4gICAgICAgIGV4Y2x1ZGVDb25zdHJ1Y3RvcnM6IFtcIk9iamVjdFwiLCAvXi4kL10sXG4gICAgICAgIHF1b3RlU3RyaW5nczogdHJ1ZSxcbiAgICAgICAgbGltaXRDaGlsZHJlbkNvdW50OiAwXG4gICAgfTtcblxuICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4gICAgdmFyIHNwZWNpYWxPYmplY3RzID0gW107XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgc3BlY2lhbE9iamVjdHMucHVzaCh7IG9iamVjdDogZ2xvYmFsLCB2YWx1ZTogXCJbb2JqZWN0IGdsb2JhbF1cIiB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBzcGVjaWFsT2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICAgIG9iamVjdDogZG9jdW1lbnQsXG4gICAgICAgICAgICB2YWx1ZTogXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgc3BlY2lhbE9iamVjdHMucHVzaCh7IG9iamVjdDogd2luZG93LCB2YWx1ZTogXCJbb2JqZWN0IFdpbmRvd11cIiB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmdW5jdGlvbk5hbWUoZnVuYykge1xuICAgICAgICBpZiAoIWZ1bmMpIHsgcmV0dXJuIFwiXCI7IH1cbiAgICAgICAgaWYgKGZ1bmMuZGlzcGxheU5hbWUpIHsgcmV0dXJuIGZ1bmMuZGlzcGxheU5hbWU7IH1cbiAgICAgICAgaWYgKGZ1bmMubmFtZSkgeyByZXR1cm4gZnVuYy5uYW1lOyB9XG4gICAgICAgIHZhciBtYXRjaGVzID0gZnVuYy50b1N0cmluZygpLm1hdGNoKC9mdW5jdGlvblxccysoW15cXChdKykvbSk7XG4gICAgICAgIHJldHVybiAobWF0Y2hlcyAmJiBtYXRjaGVzWzFdKSB8fCBcIlwiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnN0cnVjdG9yTmFtZShmLCBvYmplY3QpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBmdW5jdGlvbk5hbWUob2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIHZhciBleGNsdWRlcyA9IGYuZXhjbHVkZUNvbnN0cnVjdG9ycyB8fFxuICAgICAgICAgICAgICAgIGZvcm1hdGlvLmV4Y2x1ZGVDb25zdHJ1Y3RvcnMgfHwgW107XG5cbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBleGNsdWRlcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhjbHVkZXNbaV0gPT09IFwic3RyaW5nXCIgJiYgZXhjbHVkZXNbaV0gPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjbHVkZXNbaV0udGVzdCAmJiBleGNsdWRlc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0NpcmN1bGFyKG9iamVjdCwgb2JqZWN0cykge1xuICAgICAgICBpZiAodHlwZW9mIG9iamVjdCAhPT0gXCJvYmplY3RcIikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgaWYgKG9iamVjdHNbaV0gPT09IG9iamVjdCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhc2NpaShmLCBvYmplY3QsIHByb2Nlc3NlZCwgaW5kZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAob2JqZWN0Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gXCIoZW1wdHkgc3RyaW5nKVwiOyB9XG4gICAgICAgICAgICB2YXIgcXMgPSBmLnF1b3RlU3RyaW5ncztcbiAgICAgICAgICAgIHZhciBxdW90ZSA9IHR5cGVvZiBxcyAhPT0gXCJib29sZWFuXCIgfHwgcXM7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkIHx8IHF1b3RlID8gJ1wiJyArIG9iamVjdCArICdcIicgOiBvYmplY3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJmdW5jdGlvblwiICYmICEob2JqZWN0IGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFzY2lpLmZ1bmMob2JqZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3NlZCA9IHByb2Nlc3NlZCB8fCBbXTtcblxuICAgICAgICBpZiAoaXNDaXJjdWxhcihvYmplY3QsIHByb2Nlc3NlZCkpIHsgcmV0dXJuIFwiW0NpcmN1bGFyXVwiOyB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBhc2NpaS5hcnJheS5jYWxsKGYsIG9iamVjdCwgcHJvY2Vzc2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB7IHJldHVybiBTdHJpbmcoKDEvb2JqZWN0KSA9PT0gLUluZmluaXR5ID8gXCItMFwiIDogb2JqZWN0KTsgfVxuICAgICAgICBpZiAoc2Ftc2FtLmlzRWxlbWVudChvYmplY3QpKSB7IHJldHVybiBhc2NpaS5lbGVtZW50KG9iamVjdCk7IH1cblxuICAgICAgICBpZiAodHlwZW9mIG9iamVjdC50b1N0cmluZyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgb2JqZWN0LnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHNwZWNpYWxPYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgaWYgKG9iamVjdCA9PT0gc3BlY2lhbE9iamVjdHNbaV0ub2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpYWxPYmplY3RzW2ldLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIG9iamVjdCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgcmV0dXJuIGFzY2lpLnNldC5jYWxsKGYsIG9iamVjdCwgcHJvY2Vzc2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhc2NpaS5vYmplY3QuY2FsbChmLCBvYmplY3QsIHByb2Nlc3NlZCwgaW5kZW50KTtcbiAgICB9XG5cbiAgICBhc2NpaS5mdW5jID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb24gXCIgKyBmdW5jdGlvbk5hbWUoZnVuYykgKyBcIigpIHt9XCI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGRlbGltaXQoc3RyLCBkZWxpbWl0ZXJzKSB7XG4gICAgICAgIGRlbGltaXRlcnMgPSBkZWxpbWl0ZXJzIHx8IFtcIltcIiwgXCJdXCJdO1xuICAgICAgICByZXR1cm4gZGVsaW1pdGVyc1swXSArIHN0ciArIGRlbGltaXRlcnNbMV07XG4gICAgfVxuXG4gICAgYXNjaWkuYXJyYXkgPSBmdW5jdGlvbiAoYXJyYXksIHByb2Nlc3NlZCwgZGVsaW1pdGVycykge1xuICAgICAgICBwcm9jZXNzZWQgPSBwcm9jZXNzZWQgfHwgW107XG4gICAgICAgIHByb2Nlc3NlZC5wdXNoKGFycmF5KTtcbiAgICAgICAgdmFyIHBpZWNlcyA9IFtdO1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgbCA9ICh0aGlzLmxpbWl0Q2hpbGRyZW5Db3VudCA+IDApID8gXG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLmxpbWl0Q2hpbGRyZW5Db3VudCwgYXJyYXkubGVuZ3RoKSA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBwaWVjZXMucHVzaChhc2NpaSh0aGlzLCBhcnJheVtpXSwgcHJvY2Vzc2VkKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobCA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgcGllY2VzLnB1c2goXCJbLi4uIFwiICsgKGFycmF5Lmxlbmd0aCAtIGwpICsgXCIgbW9yZSBlbGVtZW50c11cIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVsaW1pdChwaWVjZXMuam9pbihcIiwgXCIpLCBkZWxpbWl0ZXJzKTtcbiAgICB9O1xuXG4gICAgYXNjaWkuc2V0ID0gZnVuY3Rpb24gKHNldCwgcHJvY2Vzc2VkKSB7XG4gICAgICAgIHJldHVybiBhc2NpaS5hcnJheS5jYWxsKHRoaXMsIEFycmF5LmZyb20oc2V0KSwgcHJvY2Vzc2VkLCBbJ1NldCB7JywgJ30nXSk7XG4gICAgfTtcblxuICAgIGFzY2lpLm9iamVjdCA9IGZ1bmN0aW9uIChvYmplY3QsIHByb2Nlc3NlZCwgaW5kZW50KSB7XG4gICAgICAgIHByb2Nlc3NlZCA9IHByb2Nlc3NlZCB8fCBbXTtcbiAgICAgICAgcHJvY2Vzc2VkLnB1c2gob2JqZWN0KTtcbiAgICAgICAgaW5kZW50ID0gaW5kZW50IHx8IDA7XG4gICAgICAgIHZhciBwaWVjZXMgPSBbXSwgcHJvcGVydGllcyA9IHNhbXNhbS5rZXlzKG9iamVjdCkuc29ydCgpO1xuICAgICAgICB2YXIgbGVuZ3RoID0gMztcbiAgICAgICAgdmFyIHByb3AsIHN0ciwgb2JqLCBpLCBrLCBsO1xuICAgICAgICBsID0gKHRoaXMubGltaXRDaGlsZHJlbkNvdW50ID4gMCkgPyBcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMubGltaXRDaGlsZHJlbkNvdW50LCBwcm9wZXJ0aWVzLmxlbmd0aCkgOiBwcm9wZXJ0aWVzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIG9iaiA9IG9iamVjdFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKGlzQ2lyY3VsYXIob2JqLCBwcm9jZXNzZWQpKSB7XG4gICAgICAgICAgICAgICAgc3RyID0gXCJbQ2lyY3VsYXJdXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ciA9IGFzY2lpKHRoaXMsIG9iaiwgcHJvY2Vzc2VkLCBpbmRlbnQgKyAyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RyID0gKC9cXHMvLnRlc3QocHJvcCkgPyAnXCInICsgcHJvcCArICdcIicgOiBwcm9wKSArIFwiOiBcIiArIHN0cjtcbiAgICAgICAgICAgIGxlbmd0aCArPSBzdHIubGVuZ3RoO1xuICAgICAgICAgICAgcGllY2VzLnB1c2goc3RyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb25zID0gY29uc3RydWN0b3JOYW1lKHRoaXMsIG9iamVjdCk7XG4gICAgICAgIHZhciBwcmVmaXggPSBjb25zID8gXCJbXCIgKyBjb25zICsgXCJdIFwiIDogXCJcIjtcbiAgICAgICAgdmFyIGlzID0gXCJcIjtcbiAgICAgICAgZm9yIChpID0gMCwgayA9IGluZGVudDsgaSA8IGs7ICsraSkgeyBpcyArPSBcIiBcIjsgfVxuXG4gICAgICAgIGlmKGwgPCBwcm9wZXJ0aWVzLmxlbmd0aClcbiAgICAgICAgICAgIHBpZWNlcy5wdXNoKFwiWy4uLiBcIiArIChwcm9wZXJ0aWVzLmxlbmd0aCAtIGwpICsgXCIgbW9yZSBlbGVtZW50c11cIik7XG5cbiAgICAgICAgaWYgKGxlbmd0aCArIGluZGVudCA+IDgwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgXCJ7XFxuICBcIiArIGlzICsgcGllY2VzLmpvaW4oXCIsXFxuICBcIiArIGlzKSArIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgIGlzICsgXCJ9XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZWZpeCArIFwieyBcIiArIHBpZWNlcy5qb2luKFwiLCBcIikgKyBcIiB9XCI7XG4gICAgfTtcblxuICAgIGFzY2lpLmVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB2YXIgYXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXMsIGF0dHIsIHBhaXJzID0gW10sIGF0dHJOYW1lLCBpLCBsLCB2YWw7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgYXR0ciA9IGF0dHJzLml0ZW0oaSk7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwiaHRtbDpcIiwgXCJcIik7XG4gICAgICAgICAgICB2YWwgPSBhdHRyLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIGlmIChhdHRyTmFtZSAhPT0gXCJjb250ZW50ZWRpdGFibGVcIiB8fCB2YWwgIT09IFwiaW5oZXJpdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEhdmFsKSB7IHBhaXJzLnB1c2goYXR0ck5hbWUgKyBcIj1cXFwiXCIgKyB2YWwgKyBcIlxcXCJcIik7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb3JtYXR0ZWQgPSBcIjxcIiArIHRhZ05hbWUgKyAocGFpcnMubGVuZ3RoID4gMCA/IFwiIFwiIDogXCJcIik7XG4gICAgICAgIC8vIFNWRyBlbGVtZW50cyBoYXZlIHVuZGVmaW5lZCBpbm5lckhUTUxcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50LmlubmVySFRNTCB8fCAnJztcblxuICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPiAyMCkge1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyKDAsIDIwKSArIFwiWy4uLl1cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXMgPSBmb3JtYXR0ZWQgKyBwYWlycy5qb2luKFwiIFwiKSArIFwiPlwiICsgY29udGVudCArXG4gICAgICAgICAgICAgICAgXCI8L1wiICsgdGFnTmFtZSArIFwiPlwiO1xuXG4gICAgICAgIHJldHVybiByZXMucmVwbGFjZSgvIGNvbnRlbnRFZGl0YWJsZT1cImluaGVyaXRcIi8sIFwiXCIpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBGb3JtYXRpbyhvcHRpb25zKSB7XG4gICAgICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzW29wdF0gPSBvcHRpb25zW29wdF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBGb3JtYXRpby5wcm90b3R5cGUgPSB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuXG4gICAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybWF0aW8ob3B0aW9ucyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29uc3RydWN0b3JOYW1lOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3JOYW1lKHRoaXMsIG9iamVjdCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXNjaWk6IGZ1bmN0aW9uIChvYmplY3QsIHByb2Nlc3NlZCwgaW5kZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYXNjaWkodGhpcywgb2JqZWN0LCBwcm9jZXNzZWQsIGluZGVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIEZvcm1hdGlvLnByb3RvdHlwZTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB1c2VyQWdlbnQgPSBnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3IudXNlckFnZW50O1xudmFyIGlzUnVubmluZ0luSUUgPSB1c2VyQWdlbnQgJiYgdXNlckFnZW50LmluZGV4T2YoXCJNU0lFIFwiKSA+IC0xO1xuXG4vLyBNYWtlIHByb3BlcnRpZXMgd3JpdGFibGUgaW4gSUUsIGFzIHBlclxuLy8gaHR0cDovL3d3dy5hZGVxdWF0ZWx5Z29vZC5jb20vUmVwbGFjaW5nLXNldFRpbWVvdXQtR2xvYmFsbHkuaHRtbFxuaWYgKGlzUnVubmluZ0luSUUpIHtcbiAgICBnbG9iYWwuc2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0O1xuICAgIGdsb2JhbC5jbGVhclRpbWVvdXQgPSBnbG9iYWwuY2xlYXJUaW1lb3V0O1xuICAgIGdsb2JhbC5zZXRJbnRlcnZhbCA9IGdsb2JhbC5zZXRJbnRlcnZhbDtcbiAgICBnbG9iYWwuY2xlYXJJbnRlcnZhbCA9IGdsb2JhbC5jbGVhckludGVydmFsO1xuICAgIGdsb2JhbC5EYXRlID0gZ2xvYmFsLkRhdGU7XG59XG5cbi8vIHNldEltbWVkaWF0ZSBpcyBub3QgYSBzdGFuZGFyZCBmdW5jdGlvblxuLy8gYXZvaWQgYWRkaW5nIHRoZSBwcm9wIHRvIHRoZSB3aW5kb3cgb2JqZWN0IGlmIG5vdCBwcmVzZW50XG5pZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZ2xvYmFsLnNldEltbWVkaWF0ZSA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG4gICAgZ2xvYmFsLmNsZWFySW1tZWRpYXRlID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xufVxuXG4vLyBub2RlIGV4cGVjdHMgc2V0VGltZW91dC9zZXRJbnRlcnZhbCB0byByZXR1cm4gYSBmbiBvYmplY3Qgdy8gLnJlZigpLy51bnJlZigpXG4vLyBicm93c2VycywgYSBudW1iZXIuXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nqb2hhbnNlbi9TaW5vbi5KUy9wdWxsLzQzNlxuXG52YXIgTk9PUCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfTtcbnZhciB0aW1lb3V0UmVzdWx0ID0gc2V0VGltZW91dChOT09QLCAwKTtcbnZhciBhZGRUaW1lclJldHVybnNPYmplY3QgPSB0eXBlb2YgdGltZW91dFJlc3VsdCA9PT0gXCJvYmplY3RcIjtcbnZhciBocnRpbWVQcmVzZW50ID0gKGdsb2JhbC5wcm9jZXNzICYmIHR5cGVvZiBnbG9iYWwucHJvY2Vzcy5ocnRpbWUgPT09IFwiZnVuY3Rpb25cIik7XG5jbGVhclRpbWVvdXQodGltZW91dFJlc3VsdCk7XG5cbnZhciBOYXRpdmVEYXRlID0gRGF0ZTtcbnZhciB1bmlxdWVUaW1lcklkID0gMTtcblxuLyoqXG4gKiBQYXJzZSBzdHJpbmdzIGxpa2UgXCIwMToxMDowMFwiIChtZWFuaW5nIDEgaG91ciwgMTAgbWludXRlcywgMCBzZWNvbmRzKSBpbnRvXG4gKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydCBodW1hbi1yZWFkYWJsZSBzdHJpbmdzIHBhc3NlZFxuICogdG8gY2xvY2sudGljaygpXG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGltZShzdHIpIHtcbiAgICBpZiAoIXN0cikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgc3RyaW5ncyA9IHN0ci5zcGxpdChcIjpcIik7XG4gICAgdmFyIGwgPSBzdHJpbmdzLmxlbmd0aDtcbiAgICB2YXIgaSA9IGw7XG4gICAgdmFyIG1zID0gMDtcbiAgICB2YXIgcGFyc2VkO1xuXG4gICAgaWYgKGwgPiAzIHx8ICEvXihcXGRcXGQ6KXswLDJ9XFxkXFxkPyQvLnRlc3Qoc3RyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aWNrIG9ubHkgdW5kZXJzdGFuZHMgbnVtYmVycywgJ206cycgYW5kICdoOm06cycuIEVhY2ggcGFydCBtdXN0IGJlIHR3byBkaWdpdHNcIik7XG4gICAgfVxuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBwYXJzZWQgPSBwYXJzZUludChzdHJpbmdzW2ldLCAxMCk7XG5cbiAgICAgICAgaWYgKHBhcnNlZCA+PSA2MCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0aW1lIFwiICsgc3RyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1zICs9IHBhcnNlZCAqIE1hdGgucG93KDYwLCAobCAtIGkgLSAxKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1zICogMTAwMDtcbn1cblxuLyoqXG4gKiBGbG9vciBmdW5jdGlvbiB0aGF0IGFsc28gd29ya3MgZm9yIG5lZ2F0aXZlIG51bWJlcnNcbiAqL1xuZnVuY3Rpb24gZml4ZWRGbG9vcihuKSB7XG4gICAgcmV0dXJuIChuID49IDAgPyBNYXRoLmZsb29yKG4pIDogTWF0aC5jZWlsKG4pKTtcbn1cblxuLyoqXG4gKiAlIG9wZXJhdG9yIHRoYXQgYWxzbyB3b3JrcyBmb3IgbmVnYXRpdmUgbnVtYmVyc1xuICovXG5mdW5jdGlvbiBmaXhlZE1vZHVsbyhuLCBtKSB7XG4gICAgcmV0dXJuICgobiAlIG0pICsgbSkgJSBtO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gZ3JvayB0aGUgYG5vd2AgcGFyYW1ldGVyIHRvIGNyZWF0ZUNsb2NrLlxuICovXG5mdW5jdGlvbiBnZXRFcG9jaChlcG9jaCkge1xuICAgIGlmICghZXBvY2gpIHsgcmV0dXJuIDA7IH1cbiAgICBpZiAodHlwZW9mIGVwb2NoLmdldFRpbWUgPT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4gZXBvY2guZ2V0VGltZSgpOyB9XG4gICAgaWYgKHR5cGVvZiBlcG9jaCA9PT0gXCJudW1iZXJcIikgeyByZXR1cm4gZXBvY2g7IH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibm93IHNob3VsZCBiZSBtaWxsaXNlY29uZHMgc2luY2UgVU5JWCBlcG9jaFwiKTtcbn1cblxuZnVuY3Rpb24gaW5SYW5nZShmcm9tLCB0bywgdGltZXIpIHtcbiAgICByZXR1cm4gdGltZXIgJiYgdGltZXIuY2FsbEF0ID49IGZyb20gJiYgdGltZXIuY2FsbEF0IDw9IHRvO1xufVxuXG5mdW5jdGlvbiBtaXJyb3JEYXRlUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHZhciBwcm9wO1xuICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHNwZWNpYWwgbm93IGltcGxlbWVudGF0aW9uXG4gICAgaWYgKHNvdXJjZS5ub3cpIHtcbiAgICAgICAgdGFyZ2V0Lm5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuY2xvY2subm93O1xuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0YXJnZXQubm93O1xuICAgIH1cblxuICAgIC8vIHNldCBzcGVjaWFsIHRvU291cmNlIGltcGxlbWVudGF0aW9uXG4gICAgaWYgKHNvdXJjZS50b1NvdXJjZSkge1xuICAgICAgICB0YXJnZXQudG9Tb3VyY2UgPSBmdW5jdGlvbiB0b1NvdXJjZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2UudG9Tb3VyY2UoKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGFyZ2V0LnRvU291cmNlO1xuICAgIH1cblxuICAgIC8vIHNldCBzcGVjaWFsIHRvU3RyaW5nIGltcGxlbWVudGF0aW9uXG4gICAgdGFyZ2V0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2UudG9TdHJpbmcoKTtcbiAgICB9O1xuXG4gICAgdGFyZ2V0LnByb3RvdHlwZSA9IHNvdXJjZS5wcm90b3R5cGU7XG4gICAgdGFyZ2V0LnBhcnNlID0gc291cmNlLnBhcnNlO1xuICAgIHRhcmdldC5VVEMgPSBzb3VyY2UuVVRDO1xuICAgIHRhcmdldC5wcm90b3R5cGUudG9VVENTdHJpbmcgPSBzb3VyY2UucHJvdG90eXBlLnRvVVRDU3RyaW5nO1xuXG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGF0ZSgpIHtcbiAgICBmdW5jdGlvbiBDbG9ja0RhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtcykge1xuICAgICAgICAvLyBEZWZlbnNpdmUgYW5kIHZlcmJvc2UgdG8gYXZvaWQgcG90ZW50aWFsIGhhcm0gaW4gcGFzc2luZ1xuICAgICAgICAvLyBleHBsaWNpdCB1bmRlZmluZWQgd2hlbiB1c2VyIGRvZXMgbm90IHBhc3MgYXJndW1lbnRcbiAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKENsb2NrRGF0ZS5jbG9jay5ub3cpO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlRGF0ZSh5ZWFyKTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgpO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyKTtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIsIG1pbnV0ZSk7XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUsIHNlY29uZCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtaXJyb3JEYXRlUHJvcGVydGllcyhDbG9ja0RhdGUsIE5hdGl2ZURhdGUpO1xufVxuXG5mdW5jdGlvbiBhZGRUaW1lcihjbG9jaywgdGltZXIpIHtcbiAgICBpZiAodGltZXIuZnVuYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQgdG8gdGltZXIgY2FsbHNcIik7XG4gICAgfVxuXG4gICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgY2xvY2sudGltZXJzID0ge307XG4gICAgfVxuXG4gICAgdGltZXIuaWQgPSB1bmlxdWVUaW1lcklkKys7XG4gICAgdGltZXIuY3JlYXRlZEF0ID0gY2xvY2subm93O1xuICAgIHRpbWVyLmNhbGxBdCA9IGNsb2NrLm5vdyArIChwYXJzZUludCh0aW1lci5kZWxheSkgfHwgKGNsb2NrLmR1cmluZ1RpY2sgPyAxIDogMCkpO1xuXG4gICAgY2xvY2sudGltZXJzW3RpbWVyLmlkXSA9IHRpbWVyO1xuXG4gICAgaWYgKGFkZFRpbWVyUmV0dXJuc09iamVjdCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHRpbWVyLmlkLFxuICAgICAgICAgICAgcmVmOiBOT09QLFxuICAgICAgICAgICAgdW5yZWY6IE5PT1BcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZXIuaWQ7XG59XG5cblxuLyogZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOiBcIm9mZlwiICovXG5mdW5jdGlvbiBjb21wYXJlVGltZXJzKGEsIGIpIHtcbiAgICAvLyBTb3J0IGZpcnN0IGJ5IGFic29sdXRlIHRpbWluZ1xuICAgIGlmIChhLmNhbGxBdCA8IGIuY2FsbEF0KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKGEuY2FsbEF0ID4gYi5jYWxsQXQpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLy8gU29ydCBuZXh0IGJ5IGltbWVkaWF0ZSwgaW1tZWRpYXRlIHRpbWVycyB0YWtlIHByZWNlZGVuY2VcbiAgICBpZiAoYS5pbW1lZGlhdGUgJiYgIWIuaW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKCFhLmltbWVkaWF0ZSAmJiBiLmltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IG5leHQgYnkgY3JlYXRpb24gdGltZSwgZWFybGllci1jcmVhdGVkIHRpbWVycyB0YWtlIHByZWNlZGVuY2VcbiAgICBpZiAoYS5jcmVhdGVkQXQgPCBiLmNyZWF0ZWRBdCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChhLmNyZWF0ZWRBdCA+IGIuY3JlYXRlZEF0KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIFNvcnQgbmV4dCBieSBpZCwgbG93ZXItaWQgdGltZXJzIHRha2UgcHJlY2VkZW5jZVxuICAgIGlmIChhLmlkIDwgYi5pZCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChhLmlkID4gYi5pZCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBBcyB0aW1lciBpZHMgYXJlIHVuaXF1ZSwgbm8gZmFsbGJhY2sgYDBgIGlzIG5lY2Vzc2FyeVxufVxuXG5mdW5jdGlvbiBmaXJzdFRpbWVySW5SYW5nZShjbG9jaywgZnJvbSwgdG8pIHtcbiAgICB2YXIgdGltZXJzID0gY2xvY2sudGltZXJzO1xuICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgdmFyIGlkLCBpc0luUmFuZ2U7XG5cbiAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICBpZiAodGltZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgaXNJblJhbmdlID0gaW5SYW5nZShmcm9tLCB0bywgdGltZXJzW2lkXSk7XG5cbiAgICAgICAgICAgIGlmIChpc0luUmFuZ2UgJiYgKCF0aW1lciB8fCBjb21wYXJlVGltZXJzKHRpbWVyLCB0aW1lcnNbaWRdKSA9PT0gMSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHRpbWVyc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGltZXI7XG59XG5cbmZ1bmN0aW9uIGZpcnN0VGltZXIoY2xvY2spIHtcbiAgICB2YXIgdGltZXJzID0gY2xvY2sudGltZXJzO1xuICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgdmFyIGlkO1xuXG4gICAgZm9yIChpZCBpbiB0aW1lcnMpIHtcbiAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgIGlmICghdGltZXIgfHwgY29tcGFyZVRpbWVycyh0aW1lciwgdGltZXJzW2lkXSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHRpbWVyc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGltZXI7XG59XG5cbmZ1bmN0aW9uIGxhc3RUaW1lcihjbG9jaykge1xuICAgIHZhciB0aW1lcnMgPSBjbG9jay50aW1lcnM7XG4gICAgdmFyIHRpbWVyID0gbnVsbDtcbiAgICB2YXIgaWQ7XG5cbiAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICBpZiAodGltZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgaWYgKCF0aW1lciB8fCBjb21wYXJlVGltZXJzKHRpbWVyLCB0aW1lcnNbaWRdKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHRpbWVyc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGltZXI7XG59XG5cbmZ1bmN0aW9uIGNhbGxUaW1lcihjbG9jaywgdGltZXIpIHtcbiAgICB2YXIgZXhjZXB0aW9uO1xuXG4gICAgaWYgKHR5cGVvZiB0aW1lci5pbnRlcnZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjbG9jay50aW1lcnNbdGltZXIuaWRdLmNhbGxBdCArPSB0aW1lci5pbnRlcnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgY2xvY2sudGltZXJzW3RpbWVyLmlkXTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHRpbWVyLmZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGltZXIuZnVuYy5hcHBseShudWxsLCB0aW1lci5hcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGVzbGludCBuby1ldmFsOiBcIm9mZlwiICovXG4gICAgICAgICAgICBldmFsKHRpbWVyLmZ1bmMpO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBleGNlcHRpb24gPSBlO1xuICAgIH1cblxuICAgIGlmICghY2xvY2sudGltZXJzW3RpbWVyLmlkXSkge1xuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdGltZXJUeXBlKHRpbWVyKSB7XG4gICAgaWYgKHRpbWVyLmltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm4gXCJJbW1lZGlhdGVcIjtcbiAgICB9XG4gICAgaWYgKHRpbWVyLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFwiSW50ZXJ2YWxcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiVGltZW91dFwiO1xufVxuXG5mdW5jdGlvbiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCB0dHlwZSkge1xuICAgIGlmICghdGltZXJJZCkge1xuICAgICAgICAvLyBudWxsIGFwcGVhcnMgdG8gYmUgYWxsb3dlZCBpbiBtb3N0IGJyb3dzZXJzLCBhbmQgYXBwZWFycyB0byBiZVxuICAgICAgICAvLyByZWxpZWQgdXBvbiBieSBzb21lIGxpYnJhcmllcywgbGlrZSBCb290c3RyYXAgY2Fyb3VzZWxcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2xvY2sudGltZXJzKSB7XG4gICAgICAgIGNsb2NrLnRpbWVycyA9IFtdO1xuICAgIH1cblxuICAgIC8vIGluIE5vZGUsIHRpbWVySWQgaXMgYW4gb2JqZWN0IHdpdGggLnJlZigpLy51bnJlZigpLCBhbmRcbiAgICAvLyBpdHMgLmlkIGZpZWxkIGlzIHRoZSBhY3R1YWwgdGltZXIgaWQuXG4gICAgaWYgKHR5cGVvZiB0aW1lcklkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRpbWVySWQgPSB0aW1lcklkLmlkO1xuICAgIH1cblxuICAgIGlmIChjbG9jay50aW1lcnMuaGFzT3duUHJvcGVydHkodGltZXJJZCkpIHtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgSUQgbWF0Y2hlcyBhIHRpbWVyIG9mIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgICAgdmFyIHRpbWVyID0gY2xvY2sudGltZXJzW3RpbWVySWRdO1xuICAgICAgICBpZiAodGltZXJUeXBlKHRpbWVyKSA9PT0gdHR5cGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjbG9jay50aW1lcnNbdGltZXJJZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2xlYXIgdGltZXI6IHRpbWVyIGNyZWF0ZWQgd2l0aCBzZXRcIiArIHRpbWVyVHlwZSh0aW1lcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFwiKCkgYnV0IGNsZWFyZWQgd2l0aCBjbGVhclwiICsgdHR5cGUgKyBcIigpXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1bmluc3RhbGwoY2xvY2ssIHRhcmdldCkge1xuICAgIHZhciBtZXRob2QsXG4gICAgICAgIGksXG4gICAgICAgIGw7XG4gICAgdmFyIGluc3RhbGxlZEhyVGltZSA9IFwiX2hydGltZVwiO1xuXG4gICAgZm9yIChpID0gMCwgbCA9IGNsb2NrLm1ldGhvZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIG1ldGhvZCA9IGNsb2NrLm1ldGhvZHNbaV07XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwiaHJ0aW1lXCIgJiYgdGFyZ2V0LnByb2Nlc3MpIHtcbiAgICAgICAgICAgIHRhcmdldC5wcm9jZXNzLmhydGltZSA9IGNsb2NrW2luc3RhbGxlZEhyVGltZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0W21ldGhvZF0gJiYgdGFyZ2V0W21ldGhvZF0uaGFkT3duUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGNsb2NrW1wiX1wiICsgbWV0aG9kXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFttZXRob2RdO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgeyAvKiBlc2xpbnQgZW1wdHktYmxvY2s6IFwib2ZmXCIgKi8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBtdWx0aXBsZSBleGVjdXRpb25zIHdoaWNoIHdpbGwgY29tcGxldGVseSByZW1vdmUgdGhlc2UgcHJvcHNcbiAgICBjbG9jay5tZXRob2RzID0gW107XG59XG5cbmZ1bmN0aW9uIGhpamFja01ldGhvZCh0YXJnZXQsIG1ldGhvZCwgY2xvY2spIHtcbiAgICB2YXIgcHJvcDtcblxuICAgIGNsb2NrW21ldGhvZF0uaGFkT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBtZXRob2QpO1xuICAgIGNsb2NrW1wiX1wiICsgbWV0aG9kXSA9IHRhcmdldFttZXRob2RdO1xuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJEYXRlXCIpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBtaXJyb3JEYXRlUHJvcGVydGllcyhjbG9ja1ttZXRob2RdLCB0YXJnZXRbbWV0aG9kXSk7XG4gICAgICAgIHRhcmdldFttZXRob2RdID0gZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9ja1ttZXRob2RdLmFwcGx5KGNsb2NrLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBjbG9ja1ttZXRob2RdKSB7XG4gICAgICAgICAgICBpZiAoY2xvY2tbbWV0aG9kXS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFttZXRob2RdW3Byb3BdID0gY2xvY2tbbWV0aG9kXVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldFttZXRob2RdLmNsb2NrID0gY2xvY2s7XG59XG5cbnZhciB0aW1lcnMgPSB7XG4gICAgc2V0VGltZW91dDogc2V0VGltZW91dCxcbiAgICBjbGVhclRpbWVvdXQ6IGNsZWFyVGltZW91dCxcbiAgICBzZXRJbW1lZGlhdGU6IGdsb2JhbC5zZXRJbW1lZGlhdGUsXG4gICAgY2xlYXJJbW1lZGlhdGU6IGdsb2JhbC5jbGVhckltbWVkaWF0ZSxcbiAgICBzZXRJbnRlcnZhbDogc2V0SW50ZXJ2YWwsXG4gICAgY2xlYXJJbnRlcnZhbDogY2xlYXJJbnRlcnZhbCxcbiAgICBEYXRlOiBEYXRlXG59O1xuXG5pZiAoaHJ0aW1lUHJlc2VudCkge1xuICAgIHRpbWVycy5ocnRpbWUgPSBnbG9iYWwucHJvY2Vzcy5ocnRpbWU7XG59XG5cbnZhciBrZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBrcyA9IFtdO1xuICAgIHZhciBrZXk7XG5cbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBrcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ga3M7XG59O1xuXG5leHBvcnRzLnRpbWVycyA9IHRpbWVycztcblxuZnVuY3Rpb24gY3JlYXRlQ2xvY2sobm93LCBsb29wTGltaXQpIHtcbiAgICBsb29wTGltaXQgPSBsb29wTGltaXQgfHwgMTAwMDtcblxuICAgIHZhciBjbG9jayA9IHtcbiAgICAgICAgbm93OiBnZXRFcG9jaChub3cpLFxuICAgICAgICBock5vdzogMCxcbiAgICAgICAgdGltZW91dHM6IHt9LFxuICAgICAgICBEYXRlOiBjcmVhdGVEYXRlKCksXG4gICAgICAgIGxvb3BMaW1pdDogbG9vcExpbWl0XG4gICAgfTtcblxuICAgIGNsb2NrLkRhdGUuY2xvY2sgPSBjbG9jaztcblxuICAgIGNsb2NrLnNldFRpbWVvdXQgPSBmdW5jdGlvbiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIHtcbiAgICAgICAgcmV0dXJuIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgICAgICAgIGRlbGF5OiB0aW1lb3V0XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjbG9jay5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiBjbGVhclRpbWVvdXQodGltZXJJZCkge1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJUaW1lb3V0XCIpO1xuICAgIH07XG5cbiAgICBjbG9jay5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uIHNldEludGVydmFsKGZ1bmMsIHRpbWVvdXQpIHtcbiAgICAgICAgcmV0dXJuIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgYXJnczogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSxcbiAgICAgICAgICAgIGRlbGF5OiB0aW1lb3V0LFxuICAgICAgICAgICAgaW50ZXJ2YWw6IHRpbWVvdXRcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNsb2NrLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbiBjbGVhckludGVydmFsKHRpbWVySWQpIHtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIFwiSW50ZXJ2YWxcIik7XG4gICAgfTtcblxuICAgIGNsb2NrLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmdW5jKSB7XG4gICAgICAgIHJldHVybiBhZGRUaW1lcihjbG9jaywge1xuICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNsb2NrLmNsZWFySW1tZWRpYXRlID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUodGltZXJJZCkge1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJJbW1lZGlhdGVcIik7XG4gICAgfTtcblxuICAgIGNsb2NrLnRpY2sgPSBmdW5jdGlvbiB0aWNrKG1zKSB7XG4gICAgICAgIG1zID0gdHlwZW9mIG1zID09PSBcIm51bWJlclwiID8gbXMgOiBwYXJzZVRpbWUobXMpO1xuICAgICAgICB2YXIgdGlja0Zyb20gPSBjbG9jay5ub3c7XG4gICAgICAgIHZhciB0aWNrVG8gPSBjbG9jay5ub3cgKyBtcztcbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvY2subm93O1xuICAgICAgICB2YXIgdGltZXIgPSBmaXJzdFRpbWVySW5SYW5nZShjbG9jaywgdGlja0Zyb20sIHRpY2tUbyk7XG4gICAgICAgIHZhciBvbGROb3csIGZpcnN0RXhjZXB0aW9uO1xuXG4gICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSB0cnVlO1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUhyVGltZShuZXdOb3cpIHtcbiAgICAgICAgICAgIGNsb2NrLmhyTm93ICs9IChuZXdOb3cgLSBjbG9jay5ub3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRpbWVyICYmIHRpY2tGcm9tIDw9IHRpY2tUbykge1xuICAgICAgICAgICAgaWYgKGNsb2NrLnRpbWVyc1t0aW1lci5pZF0pIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVIclRpbWUodGltZXIuY2FsbEF0KTtcbiAgICAgICAgICAgICAgICB0aWNrRnJvbSA9IHRpbWVyLmNhbGxBdDtcbiAgICAgICAgICAgICAgICBjbG9jay5ub3cgPSB0aW1lci5jYWxsQXQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgb2xkTm93ID0gY2xvY2subm93O1xuICAgICAgICAgICAgICAgICAgICBjYWxsVGltZXIoY2xvY2ssIHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcGVuc2F0ZSBmb3IgYW55IHNldFN5c3RlbVRpbWUoKSBjYWxsIGR1cmluZyB0aW1lciBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAob2xkTm93ICE9PSBjbG9jay5ub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tGcm9tICs9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tUbyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0RXhjZXB0aW9uID0gZmlyc3RFeGNlcHRpb24gfHwgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbWVyID0gZmlyc3RUaW1lckluUmFuZ2UoY2xvY2ssIHByZXZpb3VzLCB0aWNrVG8pO1xuICAgICAgICAgICAgcHJldmlvdXMgPSB0aWNrRnJvbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcbiAgICAgICAgdXBkYXRlSHJUaW1lKHRpY2tUbyk7XG4gICAgICAgIGNsb2NrLm5vdyA9IHRpY2tUbztcblxuICAgICAgICBpZiAoZmlyc3RFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IGZpcnN0RXhjZXB0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICB9O1xuXG4gICAgY2xvY2submV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIHZhciB0aW1lciA9IGZpcnN0VGltZXIoY2xvY2spO1xuICAgICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjbG9jay5ub3cgPSB0aW1lci5jYWxsQXQ7XG4gICAgICAgICAgICBjYWxsVGltZXIoY2xvY2ssIHRpbWVyKTtcbiAgICAgICAgICAgIHJldHVybiBjbG9jay5ub3c7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbG9jay5kdXJpbmdUaWNrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY2xvY2sucnVuQWxsID0gZnVuY3Rpb24gcnVuQWxsKCkge1xuICAgICAgICB2YXIgbnVtVGltZXJzLCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xvY2subG9vcExpbWl0OyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY2xvY2sudGltZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbnVtVGltZXJzID0gT2JqZWN0LmtleXMoY2xvY2sudGltZXJzKS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobnVtVGltZXJzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xvY2submV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJvcnRpbmcgYWZ0ZXIgcnVubmluZyBcIiArIGNsb2NrLmxvb3BMaW1pdCArIFwiIHRpbWVycywgYXNzdW1pbmcgYW4gaW5maW5pdGUgbG9vcCFcIik7XG4gICAgfTtcblxuICAgIGNsb2NrLnJ1blRvTGFzdCA9IGZ1bmN0aW9uIHJ1blRvTGFzdCgpIHtcbiAgICAgICAgdmFyIHRpbWVyID0gbGFzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5vdztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbG9jay50aWNrKHRpbWVyLmNhbGxBdCk7XG4gICAgfTtcblxuICAgIGNsb2NrLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIGNsb2NrLnRpbWVycyA9IHt9O1xuICAgIH07XG5cbiAgICBjbG9jay5zZXRTeXN0ZW1UaW1lID0gZnVuY3Rpb24gc2V0U3lzdGVtVGltZShzeXN0ZW1UaW1lKSB7XG4gICAgICAgIC8vIGRldGVybWluZSB0aW1lIGRpZmZlcmVuY2VcbiAgICAgICAgdmFyIG5ld05vdyA9IGdldEVwb2NoKHN5c3RlbVRpbWUpO1xuICAgICAgICB2YXIgZGlmZmVyZW5jZSA9IG5ld05vdyAtIGNsb2NrLm5vdztcbiAgICAgICAgdmFyIGlkLCB0aW1lcjtcblxuICAgICAgICAvLyB1cGRhdGUgJ3N5c3RlbSBjbG9jaydcbiAgICAgICAgY2xvY2subm93ID0gbmV3Tm93O1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aW1lcnMgYW5kIGludGVydmFscyB0byBrZWVwIHRoZW0gc3RhYmxlXG4gICAgICAgIGZvciAoaWQgaW4gY2xvY2sudGltZXJzKSB7XG4gICAgICAgICAgICBpZiAoY2xvY2sudGltZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gY2xvY2sudGltZXJzW2lkXTtcbiAgICAgICAgICAgICAgICB0aW1lci5jcmVhdGVkQXQgKz0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICB0aW1lci5jYWxsQXQgKz0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaHJ0aW1lUHJlc2VudCkge1xuICAgICAgICBjbG9jay5ocnRpbWUgPSBmdW5jdGlvbiAocHJldikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJldikpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2xkU2VjcyA9IChwcmV2WzBdICsgcHJldlsxXSAvIDFlOSk7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1NlY3MgPSAoY2xvY2suaHJOb3cgLyAxMDAwKTtcbiAgICAgICAgICAgICAgICB2YXIgZGlmZmVyZW5jZSA9IChuZXdTZWNzIC0gb2xkU2Vjcyk7XG4gICAgICAgICAgICAgICAgdmFyIHNlY3MgPSBmaXhlZEZsb29yKGRpZmZlcmVuY2UpO1xuICAgICAgICAgICAgICAgIHZhciBuYW5vc2VjcyA9IGZpeGVkTW9kdWxvKGRpZmZlcmVuY2UgKiAxZTksIDFlOSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgc2VjcyxcbiAgICAgICAgICAgICAgICAgICAgbmFub3NlY3NcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBmaXhlZEZsb29yKGNsb2NrLmhyTm93IC8gMTAwMCksXG4gICAgICAgICAgICAgICAgZml4ZWRNb2R1bG8oY2xvY2suaHJOb3cgKiAxZTYsIDFlOSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb2NrO1xufVxuZXhwb3J0cy5jcmVhdGVDbG9jayA9IGNyZWF0ZUNsb2NrO1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbiBpbnN0YWxsKHRhcmdldCwgbm93LCB0b0Zha2UsIGxvb3BMaW1pdCkge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgdG9GYWtlID0gbm93O1xuICAgICAgICBub3cgPSB0YXJnZXQuZ2V0VGltZSgpO1xuICAgICAgICB0YXJnZXQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHRvRmFrZSA9IG5vdztcbiAgICAgICAgbm93ID0gdGFyZ2V0O1xuICAgICAgICB0YXJnZXQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgICB9XG5cbiAgICB2YXIgY2xvY2sgPSBjcmVhdGVDbG9jayhub3csIGxvb3BMaW1pdCk7XG5cbiAgICBjbG9jay51bmluc3RhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVuaW5zdGFsbChjbG9jaywgdGFyZ2V0KTtcbiAgICB9O1xuXG4gICAgY2xvY2subWV0aG9kcyA9IHRvRmFrZSB8fCBbXTtcblxuICAgIGlmIChjbG9jay5tZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjbG9jay5tZXRob2RzID0ga2V5cyh0aW1lcnMpO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDAsIGwgPSBjbG9jay5tZXRob2RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoY2xvY2subWV0aG9kc1tpXSA9PT0gXCJocnRpbWVcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5wcm9jZXNzICYmIHR5cGVvZiB0YXJnZXQucHJvY2Vzcy5ocnRpbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGhpamFja01ldGhvZCh0YXJnZXQucHJvY2VzcywgY2xvY2subWV0aG9kc1tpXSwgY2xvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlqYWNrTWV0aG9kKHRhcmdldCwgY2xvY2subWV0aG9kc1tpXSwgY2xvY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb2NrO1xufTtcbiIsInZhciBpc2FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbi8qKlxuICogRXhwb3NlIGBwYXRoVG9SZWdleHBgLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGhUb1JlZ2V4cFxubW9kdWxlLmV4cG9ydHMucGFyc2UgPSBwYXJzZVxubW9kdWxlLmV4cG9ydHMuY29tcGlsZSA9IGNvbXBpbGVcbm1vZHVsZS5leHBvcnRzLnRva2Vuc1RvRnVuY3Rpb24gPSB0b2tlbnNUb0Z1bmN0aW9uXG5tb2R1bGUuZXhwb3J0cy50b2tlbnNUb1JlZ0V4cCA9IHRva2Vuc1RvUmVnRXhwXG5cbi8qKlxuICogVGhlIG1haW4gcGF0aCBtYXRjaGluZyByZWdleHAgdXRpbGl0eS5cbiAqXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG52YXIgUEFUSF9SRUdFWFAgPSBuZXcgUmVnRXhwKFtcbiAgLy8gTWF0Y2ggZXNjYXBlZCBjaGFyYWN0ZXJzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGFwcGVhciBpbiBmdXR1cmUgbWF0Y2hlcy5cbiAgLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IHdvbid0IHRyYW5zZm9ybS5cbiAgJyhcXFxcXFxcXC4pJyxcbiAgLy8gTWF0Y2ggRXhwcmVzcy1zdHlsZSBwYXJhbWV0ZXJzIGFuZCB1bi1uYW1lZCBwYXJhbWV0ZXJzIHdpdGggYSBwcmVmaXhcbiAgLy8gYW5kIG9wdGlvbmFsIHN1ZmZpeGVzLiBNYXRjaGVzIGFwcGVhciBhczpcbiAgLy9cbiAgLy8gXCIvOnRlc3QoXFxcXGQrKT9cIiA9PiBbXCIvXCIsIFwidGVzdFwiLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCBcIj9cIiwgdW5kZWZpbmVkXVxuICAvLyBcIi9yb3V0ZShcXFxcZCspXCIgID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gIC8vIFwiLypcIiAgICAgICAgICAgID0+IFtcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIipcIl1cbiAgJyhbXFxcXC8uXSk/KD86KD86XFxcXDooXFxcXHcrKSg/OlxcXFwoKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKCldKSspXFxcXCkpP3xcXFxcKCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpXSkrKVxcXFwpKShbKyo/XSk/fChcXFxcKikpJ1xuXS5qb2luKCd8JyksICdnJylcblxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBmb3IgdGhlIHJhdyB0b2tlbnMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgc3RyXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshQXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlIChzdHIsIG9wdGlvbnMpIHtcbiAgdmFyIHRva2VucyA9IFtdXG4gIHZhciBrZXkgPSAwXG4gIHZhciBpbmRleCA9IDBcbiAgdmFyIHBhdGggPSAnJ1xuICB2YXIgZGVmYXVsdERlbGltaXRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kZWxpbWl0ZXIgfHwgJy8nXG4gIHZhciByZXNcblxuICB3aGlsZSAoKHJlcyA9IFBBVEhfUkVHRVhQLmV4ZWMoc3RyKSkgIT0gbnVsbCkge1xuICAgIHZhciBtID0gcmVzWzBdXG4gICAgdmFyIGVzY2FwZWQgPSByZXNbMV1cbiAgICB2YXIgb2Zmc2V0ID0gcmVzLmluZGV4XG4gICAgcGF0aCArPSBzdHIuc2xpY2UoaW5kZXgsIG9mZnNldClcbiAgICBpbmRleCA9IG9mZnNldCArIG0ubGVuZ3RoXG5cbiAgICAvLyBJZ25vcmUgYWxyZWFkeSBlc2NhcGVkIHNlcXVlbmNlcy5cbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgcGF0aCArPSBlc2NhcGVkWzFdXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBuZXh0ID0gc3RyW2luZGV4XVxuICAgIHZhciBwcmVmaXggPSByZXNbMl1cbiAgICB2YXIgbmFtZSA9IHJlc1szXVxuICAgIHZhciBjYXB0dXJlID0gcmVzWzRdXG4gICAgdmFyIGdyb3VwID0gcmVzWzVdXG4gICAgdmFyIG1vZGlmaWVyID0gcmVzWzZdXG4gICAgdmFyIGFzdGVyaXNrID0gcmVzWzddXG5cbiAgICAvLyBQdXNoIHRoZSBjdXJyZW50IHBhdGggb250byB0aGUgdG9rZW5zLlxuICAgIGlmIChwYXRoKSB7XG4gICAgICB0b2tlbnMucHVzaChwYXRoKVxuICAgICAgcGF0aCA9ICcnXG4gICAgfVxuXG4gICAgdmFyIHBhcnRpYWwgPSBwcmVmaXggIT0gbnVsbCAmJiBuZXh0ICE9IG51bGwgJiYgbmV4dCAhPT0gcHJlZml4XG4gICAgdmFyIHJlcGVhdCA9IG1vZGlmaWVyID09PSAnKycgfHwgbW9kaWZpZXIgPT09ICcqJ1xuICAgIHZhciBvcHRpb25hbCA9IG1vZGlmaWVyID09PSAnPycgfHwgbW9kaWZpZXIgPT09ICcqJ1xuICAgIHZhciBkZWxpbWl0ZXIgPSByZXNbMl0gfHwgZGVmYXVsdERlbGltaXRlclxuICAgIHZhciBwYXR0ZXJuID0gY2FwdHVyZSB8fCBncm91cFxuXG4gICAgdG9rZW5zLnB1c2goe1xuICAgICAgbmFtZTogbmFtZSB8fCBrZXkrKyxcbiAgICAgIHByZWZpeDogcHJlZml4IHx8ICcnLFxuICAgICAgZGVsaW1pdGVyOiBkZWxpbWl0ZXIsXG4gICAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICByZXBlYXQ6IHJlcGVhdCxcbiAgICAgIHBhcnRpYWw6IHBhcnRpYWwsXG4gICAgICBhc3RlcmlzazogISFhc3RlcmlzayxcbiAgICAgIHBhdHRlcm46IHBhdHRlcm4gPyBlc2NhcGVHcm91cChwYXR0ZXJuKSA6IChhc3RlcmlzayA/ICcuKicgOiAnW14nICsgZXNjYXBlU3RyaW5nKGRlbGltaXRlcikgKyAnXSs/JylcbiAgICB9KVxuICB9XG5cbiAgLy8gTWF0Y2ggYW55IGNoYXJhY3RlcnMgc3RpbGwgcmVtYWluaW5nLlxuICBpZiAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgcGF0aCArPSBzdHIuc3Vic3RyKGluZGV4KVxuICB9XG5cbiAgLy8gSWYgdGhlIHBhdGggZXhpc3RzLCBwdXNoIGl0IG9udG8gdGhlIGVuZC5cbiAgaWYgKHBhdGgpIHtcbiAgICB0b2tlbnMucHVzaChwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBzdHJpbmcgdG8gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdGhlIHBhdGguXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICBzdHJcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IWZ1bmN0aW9uKE9iamVjdD0sIE9iamVjdD0pfVxuICovXG5mdW5jdGlvbiBjb21waWxlIChzdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvRnVuY3Rpb24ocGFyc2Uoc3RyLCBvcHRpb25zKSlcbn1cblxuLyoqXG4gKiBQcmV0dGllciBlbmNvZGluZyBvZiBVUkkgcGF0aCBzZWdtZW50cy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bXFwvPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEVuY29kZSB0aGUgYXN0ZXJpc2sgcGFyYW1ldGVyLiBTaW1pbGFyIHRvIGBwcmV0dHlgLCBidXQgYWxsb3dzIHNsYXNoZXMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlbmNvZGVBc3RlcmlzayAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIG1ldGhvZCBmb3IgdHJhbnNmb3JtaW5nIHRva2VucyBpbnRvIHRoZSBwYXRoIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uICh0b2tlbnMpIHtcbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHRva2VucyBpbnRvIHJlZ2V4cHMuXG4gIHZhciBtYXRjaGVzID0gbmV3IEFycmF5KHRva2Vucy5sZW5ndGgpXG5cbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHBhdHRlcm5zIGJlZm9yZSBjb21waWxhdGlvbi5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHRva2Vuc1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG1hdGNoZXNbaV0gPSBuZXcgUmVnRXhwKCdeKD86JyArIHRva2Vuc1tpXS5wYXR0ZXJuICsgJykkJylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuICAgIHZhciBwYXRoID0gJydcbiAgICB2YXIgZGF0YSA9IG9iaiB8fCB7fVxuICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fVxuICAgIHZhciBlbmNvZGUgPSBvcHRpb25zLnByZXR0eSA/IGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSA6IGVuY29kZVVSSUNvbXBvbmVudFxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXRoICs9IHRva2VuXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gZGF0YVt0b2tlbi5uYW1lXVxuICAgICAgdmFyIHNlZ21lbnRcblxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgaWYgKHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgICAgLy8gUHJlcGVuZCBwYXJ0aWFsIHNlZ21lbnQgcHJlZml4ZXMuXG4gICAgICAgICAgaWYgKHRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIGJlIGRlZmluZWQnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc2FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAoIXRva2VuLnJlcGVhdCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IHJlcGVhdCwgYnV0IHJlY2VpdmVkIGAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ2AnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBub3QgYmUgZW1wdHknKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBzZWdtZW50ID0gZW5jb2RlKHZhbHVlW2pdKVxuXG4gICAgICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGFsbCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG1hdGNoIFwiJyArIHRva2VuLnBhdHRlcm4gKyAnXCIsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHNlZ21lbnQpICsgJ2AnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhdGggKz0gKGogPT09IDAgPyB0b2tlbi5wcmVmaXggOiB0b2tlbi5kZWxpbWl0ZXIpICsgc2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc2VnbWVudCA9IHRva2VuLmFzdGVyaXNrID8gZW5jb2RlQXN0ZXJpc2sodmFsdWUpIDogZW5jb2RlKHZhbHVlKVxuXG4gICAgICBpZiAoIW1hdGNoZXNbaV0udGVzdChzZWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG1hdGNoIFwiJyArIHRva2VuLnBhdHRlcm4gKyAnXCIsIGJ1dCByZWNlaXZlZCBcIicgKyBzZWdtZW50ICsgJ1wiJylcbiAgICAgIH1cblxuICAgICAgcGF0aCArPSB0b2tlbi5wcmVmaXggKyBzZWdtZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxufVxuXG4vKipcbiAqIEVzY2FwZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZXNjYXBlU3RyaW5nIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4rKj89XiE6JHt9KClbXFxdfFxcL1xcXFxdKS9nLCAnXFxcXCQxJylcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGhlIGNhcHR1cmluZyBncm91cCBieSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBncm91cFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVHcm91cCAoZ3JvdXApIHtcbiAgcmV0dXJuIGdyb3VwLnJlcGxhY2UoLyhbPSE6JFxcLygpXSkvZywgJ1xcXFwkMScpXG59XG5cbi8qKlxuICogQXR0YWNoIHRoZSBrZXlzIGFzIGEgcHJvcGVydHkgb2YgdGhlIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshUmVnRXhwfSByZVxuICogQHBhcmFtICB7QXJyYXl9ICAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gYXR0YWNoS2V5cyAocmUsIGtleXMpIHtcbiAgcmUua2V5cyA9IGtleXNcbiAgcmV0dXJuIHJlXG59XG5cbi8qKlxuICogR2V0IHRoZSBmbGFncyBmb3IgYSByZWdleHAgZnJvbSB0aGUgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZmxhZ3MgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMuc2Vuc2l0aXZlID8gJycgOiAnaSdcbn1cblxuLyoqXG4gKiBQdWxsIG91dCBrZXlzIGZyb20gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcmVnZXhwVG9SZWdleHAgKHBhdGgsIGtleXMpIHtcbiAgLy8gVXNlIGEgbmVnYXRpdmUgbG9va2FoZWFkIHRvIG1hdGNoIG9ubHkgY2FwdHVyaW5nIGdyb3Vwcy5cbiAgdmFyIGdyb3VwcyA9IHBhdGguc291cmNlLm1hdGNoKC9cXCgoPyFcXD8pL2cpXG5cbiAgaWYgKGdyb3Vwcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXlzLnB1c2goe1xuICAgICAgICBuYW1lOiBpLFxuICAgICAgICBwcmVmaXg6IG51bGwsXG4gICAgICAgIGRlbGltaXRlcjogbnVsbCxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICByZXBlYXQ6IGZhbHNlLFxuICAgICAgICBwYXJ0aWFsOiBmYWxzZSxcbiAgICAgICAgYXN0ZXJpc2s6IGZhbHNlLFxuICAgICAgICBwYXR0ZXJuOiBudWxsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKHBhdGgsIGtleXMpXG59XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGFycmF5IGludG8gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgcGF0aFxuICogQHBhcmFtICB7QXJyYXl9ICAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICB2YXIgcGFydHMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIHBhcnRzLnB1c2gocGF0aFRvUmVnZXhwKHBhdGhbaV0sIGtleXMsIG9wdGlvbnMpLnNvdXJjZSlcbiAgfVxuXG4gIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKCcoPzonICsgcGFydHMuam9pbignfCcpICsgJyknLCBmbGFncyhvcHRpb25zKSlcblxuICByZXR1cm4gYXR0YWNoS2V5cyhyZWdleHAsIGtleXMpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcGF0aCByZWdleHAgZnJvbSBzdHJpbmcgaW5wdXQuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9SZWdleHAgKHBhdGgsIGtleXMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvUmVnRXhwKHBhcnNlKHBhdGgsIG9wdGlvbnMpLCBrZXlzLCBvcHRpb25zKVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIGZ1bmN0aW9uIGZvciB0YWtpbmcgdG9rZW5zIGFuZCByZXR1cm5pbmcgYSBSZWdFeHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgICAgICAgICB0b2tlbnNcbiAqIEBwYXJhbSAgeyhBcnJheXxPYmplY3QpPX0ga2V5c1xuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiB0b2tlbnNUb1JlZ0V4cCAodG9rZW5zLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpXG4gICAga2V5cyA9IFtdXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdFxuICB2YXIgZW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlXG4gIHZhciByb3V0ZSA9ICcnXG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0b2tlbnMgYW5kIGNyZWF0ZSBvdXIgcmVnZXhwIHN0cmluZy5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV1cblxuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByb3V0ZSArPSBlc2NhcGVTdHJpbmcodG9rZW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmVmaXggPSBlc2NhcGVTdHJpbmcodG9rZW4ucHJlZml4KVxuICAgICAgdmFyIGNhcHR1cmUgPSAnKD86JyArIHRva2VuLnBhdHRlcm4gKyAnKSdcblxuICAgICAga2V5cy5wdXNoKHRva2VuKVxuXG4gICAgICBpZiAodG9rZW4ucmVwZWF0KSB7XG4gICAgICAgIGNhcHR1cmUgKz0gJyg/OicgKyBwcmVmaXggKyBjYXB0dXJlICsgJykqJ1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5wYXJ0aWFsKSB7XG4gICAgICAgICAgY2FwdHVyZSA9ICcoPzonICsgcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpKT8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKT8nXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcHR1cmUgPSBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJyknXG4gICAgICB9XG5cbiAgICAgIHJvdXRlICs9IGNhcHR1cmVcbiAgICB9XG4gIH1cblxuICB2YXIgZGVsaW1pdGVyID0gZXNjYXBlU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVyIHx8ICcvJylcbiAgdmFyIGVuZHNXaXRoRGVsaW1pdGVyID0gcm91dGUuc2xpY2UoLWRlbGltaXRlci5sZW5ndGgpID09PSBkZWxpbWl0ZXJcblxuICAvLyBJbiBub24tc3RyaWN0IG1vZGUgd2UgYWxsb3cgYSBzbGFzaCBhdCB0aGUgZW5kIG9mIG1hdGNoLiBJZiB0aGUgcGF0aCB0b1xuICAvLyBtYXRjaCBhbHJlYWR5IGVuZHMgd2l0aCBhIHNsYXNoLCB3ZSByZW1vdmUgaXQgZm9yIGNvbnNpc3RlbmN5LiBUaGUgc2xhc2hcbiAgLy8gaXMgdmFsaWQgYXQgdGhlIGVuZCBvZiBhIHBhdGggbWF0Y2gsIG5vdCBpbiB0aGUgbWlkZGxlLiBUaGlzIGlzIGltcG9ydGFudFxuICAvLyBpbiBub24tZW5kaW5nIG1vZGUsIHdoZXJlIFwiL3Rlc3QvXCIgc2hvdWxkbid0IG1hdGNoIFwiL3Rlc3QvL3JvdXRlXCIuXG4gIGlmICghc3RyaWN0KSB7XG4gICAgcm91dGUgPSAoZW5kc1dpdGhEZWxpbWl0ZXIgPyByb3V0ZS5zbGljZSgwLCAtZGVsaW1pdGVyLmxlbmd0aCkgOiByb3V0ZSkgKyAnKD86JyArIGRlbGltaXRlciArICcoPz0kKSk/J1xuICB9XG5cbiAgaWYgKGVuZCkge1xuICAgIHJvdXRlICs9ICckJ1xuICB9IGVsc2Uge1xuICAgIC8vIEluIG5vbi1lbmRpbmcgbW9kZSwgd2UgbmVlZCB0aGUgY2FwdHVyaW5nIGdyb3VwcyB0byBtYXRjaCBhcyBtdWNoIGFzXG4gICAgLy8gcG9zc2libGUgYnkgdXNpbmcgYSBwb3NpdGl2ZSBsb29rYWhlYWQgdG8gdGhlIGVuZCBvciBuZXh0IHBhdGggc2VnbWVudC5cbiAgICByb3V0ZSArPSBzdHJpY3QgJiYgZW5kc1dpdGhEZWxpbWl0ZXIgPyAnJyA6ICcoPz0nICsgZGVsaW1pdGVyICsgJ3wkKSdcbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKG5ldyBSZWdFeHAoJ14nICsgcm91dGUsIGZsYWdzKG9wdGlvbnMpKSwga2V5cylcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGdpdmVuIHBhdGggc3RyaW5nLCByZXR1cm5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQW4gZW1wdHkgYXJyYXkgY2FuIGJlIHBhc3NlZCBpbiBmb3IgdGhlIGtleXMsIHdoaWNoIHdpbGwgaG9sZCB0aGVcbiAqIHBsYWNlaG9sZGVyIGtleSBkZXNjcmlwdGlvbnMuIEZvciBleGFtcGxlLCB1c2luZyBgL3VzZXIvOmlkYCwgYGtleXNgIHdpbGxcbiAqIGNvbnRhaW4gYFt7IG5hbWU6ICdpZCcsIGRlbGltaXRlcjogJy8nLCBvcHRpb25hbDogZmFsc2UsIHJlcGVhdDogZmFsc2UgfV1gLlxuICpcbiAqIEBwYXJhbSAgeyhzdHJpbmd8UmVnRXhwfEFycmF5KX0gcGF0aFxuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSAgICAgICBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHBhdGhUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICBpZiAoIWlzYXJyYXkoa2V5cykpIHtcbiAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshT2JqZWN0fSAqLyAoa2V5cyB8fCBvcHRpb25zKVxuICAgIGtleXMgPSBbXVxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiByZWdleHBUb1JlZ2V4cChwYXRoLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpKVxuICB9XG5cbiAgaWYgKGlzYXJyYXkocGF0aCkpIHtcbiAgICByZXR1cm4gYXJyYXlUb1JlZ2V4cCgvKiogQHR5cGUgeyFBcnJheX0gKi8gKHBhdGgpLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIHN0cmluZ1RvUmVnZXhwKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG59XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiKCh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCAmJiBmdW5jdGlvbiAobSkgeyBkZWZpbmUoXCJzYW1zYW1cIiwgbSk7IH0pIHx8XG4gKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIGZ1bmN0aW9uIChtKSB7IG1vZHVsZS5leHBvcnRzID0gbSgpOyB9KSB8fCAvLyBOb2RlXG4gZnVuY3Rpb24gKG0pIHsgdGhpcy5zYW1zYW0gPSBtKCk7IH0gLy8gQnJvd3NlciBnbG9iYWxzXG4pKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbyA9IE9iamVjdC5wcm90b3R5cGU7XG4gICAgdmFyIGRpdiA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgICAgLy8gVW5saWtlIGdsb2JhbCBpc05hTiwgdGhpcyBhdm9pZHMgdHlwZSBjb2VyY2lvblxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgYXZvaWRzIElFIGhvc3Qgb2JqZWN0IGlzc3VlcywgaGF0IHRpcCB0b1xuICAgICAgICAvLyBsb2Rhc2hcbiAgICAgICAgdmFyIHZhbCA9IHZhbHVlOyAvLyBKc0xpbnQgdGhpbmtzIHZhbHVlICE9PSB2YWx1ZSBpcyBcIndlaXJkXCJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSAhPT0gdmFsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENsYXNzKHZhbHVlKSB7XG4gICAgICAgIC8vIFJldHVybnMgdGhlIGludGVybmFsIFtbQ2xhc3NdXSBieSBjYWxsaW5nIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUgYXMgdGhpcy4gUmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nLCBuYW1pbmcgdGhlXG4gICAgICAgIC8vIGludGVybmFsIGNsYXNzLCBlLmcuIFwiQXJyYXlcIlxuICAgICAgICByZXR1cm4gby50b1N0cmluZy5jYWxsKHZhbHVlKS5zcGxpdCgvWyBcXF1dLylbMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5hbWUgc2Ftc2FtLmlzQXJndW1lbnRzXG4gICAgICogQHBhcmFtIE9iamVjdCBvYmplY3RcbiAgICAgKlxuICAgICAqIFJldHVybnMgYGB0cnVlYGAgaWYgYGBvYmplY3RgYCBpcyBhbiBgYGFyZ3VtZW50c2BgIG9iamVjdCxcbiAgICAgKiBgYGZhbHNlYGAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJndW1lbnRzKG9iamVjdCkge1xuICAgICAgICBpZiAoZ2V0Q2xhc3Mob2JqZWN0KSA9PT0gJ0FyZ3VtZW50cycpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iamVjdC5sZW5ndGggIT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICBnZXRDbGFzcyhvYmplY3QpID09PSBcIkFycmF5XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9iamVjdC5jYWxsZWUgPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvYmplY3Rbb2JqZWN0Lmxlbmd0aF0gPSA2O1xuICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtvYmplY3QubGVuZ3RoXTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHNhbXNhbS5pc0VsZW1lbnRcbiAgICAgKiBAcGFyYW0gT2JqZWN0IG9iamVjdFxuICAgICAqXG4gICAgICogUmV0dXJucyBgYHRydWVgYCBpZiBgYG9iamVjdGBgIGlzIGEgRE9NIGVsZW1lbnQgbm9kZS4gVW5saWtlXG4gICAgICogVW5kZXJzY29yZS5qcy9sb2Rhc2gsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYGBmYWxzZWBgIGlmIGBgb2JqZWN0YGBcbiAgICAgKiBpcyBhbiAqZWxlbWVudC1saWtlKiBvYmplY3QsIGkuZS4gYSByZWd1bGFyIG9iamVjdCB3aXRoIGEgYGBub2RlVHlwZWBgXG4gICAgICogcHJvcGVydHkgdGhhdCBob2xkcyB0aGUgdmFsdWUgYGAxYGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICAgICAgICBpZiAoIW9iamVjdCB8fCBvYmplY3Qubm9kZVR5cGUgIT09IDEgfHwgIWRpdikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG9iamVjdC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICAgICAgb2JqZWN0LnJlbW92ZUNoaWxkKGRpdik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSBzYW1zYW0ua2V5c1xuICAgICAqIEBwYXJhbSBPYmplY3Qgb2JqZWN0XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygb3duIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICAgIHZhciBrcyA9IFtdLCBwcm9wO1xuICAgICAgICBmb3IgKHByb3AgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoby5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcCkpIHsga3MucHVzaChwcm9wKTsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSBzYW1zYW0uaXNEYXRlXG4gICAgICogQHBhcmFtIE9iamVjdCB2YWx1ZVxuICAgICAqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBgYERhdGVgYCwgb3IgKmRhdGUtbGlrZSouIER1Y2sgdHlwaW5nXG4gICAgICogb2YgZGF0ZSBvYmplY3RzIHdvcmsgYnkgY2hlY2tpbmcgdGhhdCB0aGUgb2JqZWN0IGhhcyBhIGBgZ2V0VGltZWBgXG4gICAgICogZnVuY3Rpb24gd2hvc2UgcmV0dXJuIHZhbHVlIGVxdWFscyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG9iamVjdCdzXG4gICAgICogYGB2YWx1ZU9mYGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUuZ2V0VGltZSA9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHZhbHVlLmdldFRpbWUoKSA9PSB2YWx1ZS52YWx1ZU9mKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5hbWUgc2Ftc2FtLmlzTmVnWmVyb1xuICAgICAqIEBwYXJhbSBPYmplY3QgdmFsdWVcbiAgICAgKlxuICAgICAqIFJldHVybnMgYGB0cnVlYGAgaWYgYGB2YWx1ZWBgIGlzIGBgLTBgYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05lZ1plcm8odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA9PT0gLUluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBuYW1lIHNhbXNhbS5lcXVhbFxuICAgICAqIEBwYXJhbSBPYmplY3Qgb2JqMVxuICAgICAqIEBwYXJhbSBPYmplY3Qgb2JqMlxuICAgICAqXG4gICAgICogUmV0dXJucyBgYHRydWVgYCBpZiB0d28gb2JqZWN0cyBhcmUgc3RyaWN0bHkgZXF1YWwuIENvbXBhcmVkIHRvXG4gICAgICogYGA9PT1gYCB0aGVyZSBhcmUgdHdvIGV4Y2VwdGlvbnM6XG4gICAgICpcbiAgICAgKiAgIC0gTmFOIGlzIGNvbnNpZGVyZWQgZXF1YWwgdG8gTmFOXG4gICAgICogICAtIC0wIGFuZCArMCBhcmUgbm90IGNvbnNpZGVyZWQgZXF1YWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGljYWwob2JqMSwgb2JqMikge1xuICAgICAgICBpZiAob2JqMSA9PT0gb2JqMiB8fCAoaXNOYU4ob2JqMSkgJiYgaXNOYU4ob2JqMikpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqMSAhPT0gMCB8fCBpc05lZ1plcm8ob2JqMSkgPT09IGlzTmVnWmVybyhvYmoyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2V0KHZhbCkge1xuICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU3Vic2V0KHMxLCBzMiwgY29tcGFyZSkge1xuICAgICAgICB2YXIgdmFsdWVzMSA9IEFycmF5LmZyb20oczEpO1xuICAgICAgICB2YXIgdmFsdWVzMiA9IEFycmF5LmZyb20oczIpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGluY2x1ZGVzID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWVzMi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb21wYXJlKHZhbHVlczJbal0sIHZhbHVlczFbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWluY2x1ZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5hbWUgc2Ftc2FtLmRlZXBFcXVhbFxuICAgICAqIEBwYXJhbSBPYmplY3Qgb2JqMVxuICAgICAqIEBwYXJhbSBPYmplY3Qgb2JqMlxuICAgICAqXG4gICAgICogRGVlcCBlcXVhbCBjb21wYXJpc29uLiBUd28gdmFsdWVzIGFyZSBcImRlZXAgZXF1YWxcIiBpZjpcbiAgICAgKlxuICAgICAqICAgLSBUaGV5IGFyZSBlcXVhbCwgYWNjb3JkaW5nIHRvIHNhbXNhbS5pZGVudGljYWxcbiAgICAgKiAgIC0gVGhleSBhcmUgYm90aCBkYXRlIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHRpbWVcbiAgICAgKiAgIC0gVGhleSBhcmUgYm90aCBhcnJheXMgY29udGFpbmluZyBlbGVtZW50cyB0aGF0IGFyZSBhbGwgZGVlcEVxdWFsXG4gICAgICogICAtIFRoZXkgYXJlIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBzZXQgb2YgcHJvcGVydGllcywgYW5kIGVhY2ggcHJvcGVydHlcbiAgICAgKiAgICAgaW4gYGBvYmoxYGAgaXMgZGVlcEVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGluIGBgb2JqMmBgXG4gICAgICpcbiAgICAgKiBTdXBwb3J0cyBjeWNsaWMgb2JqZWN0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWVwRXF1YWxDeWNsaWMob2JqMSwgb2JqMikge1xuXG4gICAgICAgIC8vIHVzZWQgZm9yIGN5Y2xpYyBjb21wYXJpc29uXG4gICAgICAgIC8vIGNvbnRhaW4gYWxyZWFkeSB2aXNpdGVkIG9iamVjdHNcbiAgICAgICAgdmFyIG9iamVjdHMxID0gW10sXG4gICAgICAgICAgICBvYmplY3RzMiA9IFtdLFxuICAgICAgICAvLyBjb250YWluIHBhdGhlcyAocG9zaXRpb24gaW4gdGhlIG9iamVjdCBzdHJ1Y3R1cmUpXG4gICAgICAgIC8vIG9mIHRoZSBhbHJlYWR5IHZpc2l0ZWQgb2JqZWN0c1xuICAgICAgICAvLyBpbmRleGVzIHNhbWUgYXMgaW4gb2JqZWN0cyBhcnJheXNcbiAgICAgICAgICAgIHBhdGhzMSA9IFtdLFxuICAgICAgICAgICAgcGF0aHMyID0gW10sXG4gICAgICAgIC8vIGNvbnRhaW5zIGNvbWJpbmF0aW9ucyBvZiBhbHJlYWR5IGNvbXBhcmVkIG9iamVjdHNcbiAgICAgICAgLy8gaW4gdGhlIG1hbm5lcjogeyBcIiQxWydyZWYnXSQyWydyZWYnXVwiOiB0cnVlIH1cbiAgICAgICAgICAgIGNvbXBhcmVkID0ge307XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHVzZWQgdG8gY2hlY2ssIGlmIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGlzIGFuIG9iamVjdFxuICAgICAgICAgKiAoY3ljbGljIGxvZ2ljIGlzIG9ubHkgbmVlZGVkIGZvciBvYmplY3RzKVxuICAgICAgICAgKiBvbmx5IG5lZWRlZCBmb3IgY3ljbGljIGxvZ2ljXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgJiZcbiAgICAgICAgICAgICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpICAgICYmXG4gICAgICAgICAgICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpICAmJlxuICAgICAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAgJiZcbiAgICAgICAgICAgICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIG9iamVjdCBpbiB0aGVcbiAgICAgICAgICogZ2l2ZW4gb2JqZWN0cyBhcnJheSwgLTEgaWYgbm90IGNvbnRhaW5lZFxuICAgICAgICAgKiBvbmx5IG5lZWRlZCBmb3IgY3ljbGljIGxvZ2ljXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRJbmRleChvYmplY3RzLCBvYmopIHtcblxuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3RzW2ldID09PSBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkb2VzIHRoZSByZWN1cnNpb24gZm9yIHRoZSBkZWVwIGVxdWFsIGNoZWNrXG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24gZGVlcEVxdWFsKG9iajEsIG9iajIsIHBhdGgxLCBwYXRoMikge1xuICAgICAgICAgICAgdmFyIHR5cGUxID0gdHlwZW9mIG9iajE7XG4gICAgICAgICAgICB2YXIgdHlwZTIgPSB0eXBlb2Ygb2JqMjtcblxuICAgICAgICAgICAgLy8gPT0gbnVsbCBhbHNvIG1hdGNoZXMgdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAob2JqMSA9PT0gb2JqMiB8fFxuICAgICAgICAgICAgICAgICAgICBpc05hTihvYmoxKSB8fCBpc05hTihvYmoyKSB8fFxuICAgICAgICAgICAgICAgICAgICBvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUxICE9PSBcIm9iamVjdFwiIHx8IHR5cGUyICE9PSBcIm9iamVjdFwiKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaWRlbnRpY2FsKG9iajEsIG9iajIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbGVtZW50cyBhcmUgb25seSBlcXVhbCBpZiBpZGVudGljYWwoZXhwZWN0ZWQsIGFjdHVhbClcbiAgICAgICAgICAgIGlmIChpc0VsZW1lbnQob2JqMSkgfHwgaXNFbGVtZW50KG9iajIpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICB2YXIgaXNEYXRlMSA9IGlzRGF0ZShvYmoxKSwgaXNEYXRlMiA9IGlzRGF0ZShvYmoyKTtcbiAgICAgICAgICAgIGlmIChpc0RhdGUxIHx8IGlzRGF0ZTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRGF0ZTEgfHwgIWlzRGF0ZTIgfHwgb2JqMS5nZXRUaW1lKCkgIT09IG9iajIuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvYmoxIGluc3RhbmNlb2YgUmVnRXhwICYmIG9iajIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqMS50b1N0cmluZygpICE9PSBvYmoyLnRvU3RyaW5nKCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjbGFzczEgPSBnZXRDbGFzcyhvYmoxKTtcbiAgICAgICAgICAgIHZhciBjbGFzczIgPSBnZXRDbGFzcyhvYmoyKTtcbiAgICAgICAgICAgIHZhciBrZXlzMSA9IGtleXMob2JqMSk7XG4gICAgICAgICAgICB2YXIga2V5czIgPSBrZXlzKG9iajIpO1xuXG4gICAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqMSkgfHwgaXNBcmd1bWVudHMob2JqMikpIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqMS5sZW5ndGggIT09IG9iajIubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZTEgIT09IHR5cGUyIHx8IGNsYXNzMSAhPT0gY2xhc3MyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTZXQob2JqMSkgfHwgaXNTZXQob2JqMikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9iajEpIHx8ICFpc1NldChvYmoyKSB8fCBvYmoxLnNpemUgIT09IG9iajIuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3Vic2V0KG9iajEsIG9iajIsIGRlZXBFcXVhbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBrZXksIGksIGwsXG4gICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIHZhcnMgYXJlIHVzZWQgZm9yIHRoZSBjeWNsaWMgbG9naWNcbiAgICAgICAgICAgICAgICB2YWx1ZTEsIHZhbHVlMixcbiAgICAgICAgICAgICAgICBpc09iamVjdDEsIGlzT2JqZWN0MixcbiAgICAgICAgICAgICAgICBpbmRleDEsIGluZGV4MixcbiAgICAgICAgICAgICAgICBuZXdQYXRoMSwgbmV3UGF0aDI7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzMS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXlzMVtpXTtcbiAgICAgICAgICAgICAgICBpZiAoIW8uaGFzT3duUHJvcGVydHkuY2FsbChvYmoyLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvZiB0aGUgY3ljbGljIGxvZ2ljXG5cbiAgICAgICAgICAgICAgICB2YWx1ZTEgPSBvYmoxW2tleV07XG4gICAgICAgICAgICAgICAgdmFsdWUyID0gb2JqMltrZXldO1xuXG4gICAgICAgICAgICAgICAgaXNPYmplY3QxID0gaXNPYmplY3QodmFsdWUxKTtcbiAgICAgICAgICAgICAgICBpc09iamVjdDIgPSBpc09iamVjdCh2YWx1ZTIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lLCBpZiB0aGUgb2JqZWN0cyB3ZXJlIGFscmVhZHkgdmlzaXRlZFxuICAgICAgICAgICAgICAgIC8vIChpdCdzIGZhc3RlciB0byBjaGVjayBmb3IgaXNPYmplY3QgZmlyc3QsIHRoYW4gdG9cbiAgICAgICAgICAgICAgICAvLyBnZXQgLTEgZnJvbSBnZXRJbmRleCBmb3Igbm9uIG9iamVjdHMpXG4gICAgICAgICAgICAgICAgaW5kZXgxID0gaXNPYmplY3QxID8gZ2V0SW5kZXgob2JqZWN0czEsIHZhbHVlMSkgOiAtMTtcbiAgICAgICAgICAgICAgICBpbmRleDIgPSBpc09iamVjdDIgPyBnZXRJbmRleChvYmplY3RzMiwgdmFsdWUyKSA6IC0xO1xuXG4gICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBuZXcgcGF0aGVzIG9mIHRoZSBvYmplY3RzXG4gICAgICAgICAgICAgICAgLy8gLSBmb3Igbm9uIGN5Y2xpYyBvYmplY3RzIHRoZSBjdXJyZW50IHBhdGggd2lsbCBiZSBleHRlbmRlZFxuICAgICAgICAgICAgICAgIC8vICAgYnkgY3VycmVudCBwcm9wZXJ0eSBuYW1lXG4gICAgICAgICAgICAgICAgLy8gLSBmb3IgY3ljbGljIG9iamVjdHMgdGhlIHN0b3JlZCBwYXRoIGlzIHRha2VuXG4gICAgICAgICAgICAgICAgbmV3UGF0aDEgPSBpbmRleDEgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gcGF0aHMxW2luZGV4MV1cbiAgICAgICAgICAgICAgICAgICAgOiBwYXRoMSArICdbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXSc7XG4gICAgICAgICAgICAgICAgbmV3UGF0aDIgPSBpbmRleDIgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gcGF0aHMyW2luZGV4Ml1cbiAgICAgICAgICAgICAgICAgICAgOiBwYXRoMiArICdbJyArIEpTT04uc3RyaW5naWZ5KGtleSkgKyAnXSc7XG5cbiAgICAgICAgICAgICAgICAvLyBzdG9wIHJlY3Vyc2lvbiBpZiBjdXJyZW50IG9iamVjdHMgYXJlIGFscmVhZHkgY29tcGFyZWRcbiAgICAgICAgICAgICAgICBpZiAoY29tcGFyZWRbbmV3UGF0aDEgKyBuZXdQYXRoMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIGN1cnJlbnQgb2JqZWN0cyBhbmQgdGhlaXIgcGF0aGVzXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4MSA9PT0gLTEgJiYgaXNPYmplY3QxKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdHMxLnB1c2godmFsdWUxKTtcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMxLnB1c2gobmV3UGF0aDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXgyID09PSAtMSAmJiBpc09iamVjdDIpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0czIucHVzaCh2YWx1ZTIpO1xuICAgICAgICAgICAgICAgICAgICBwYXRoczIucHVzaChuZXdQYXRoMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhhdCB0aGUgY3VycmVudCBvYmplY3RzIGFyZSBhbHJlYWR5IGNvbXBhcmVkXG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0MSAmJiBpc09iamVjdDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyZWRbbmV3UGF0aDEgKyBuZXdQYXRoMl0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBjeWNsaWMgbG9naWNcblxuICAgICAgICAgICAgICAgIC8vIG5laXRoZXIgdmFsdWUxIG5vciB2YWx1ZTIgaXMgYSBjeWNsZVxuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggbmV4dCBsZXZlbFxuICAgICAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKHZhbHVlMSwgdmFsdWUyLCBuZXdQYXRoMSwgbmV3UGF0aDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIH0ob2JqMSwgb2JqMiwgJyQxJywgJyQyJykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyYXksIHN1YnNldCwgY29tcGFyZSkge1xuICAgICAgICBpZiAoc3Vic2V0Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICB2YXIgaSwgbCwgaiwgaztcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbaV0sIHN1YnNldFswXSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBrID0gc3Vic2V0Lmxlbmd0aDsgaiA8IGs7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGkgKyBqKSA+PSBsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmUoYXJyYXlbaSArIGpdLCBzdWJzZXRbal0pKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5hbWUgc2Ftc2FtLm1hdGNoXG4gICAgICogQHBhcmFtIE9iamVjdCBvYmplY3RcbiAgICAgKiBAcGFyYW0gT2JqZWN0IG1hdGNoZXJcbiAgICAgKlxuICAgICAqIENvbXBhcmUgYXJiaXRyYXJ5IHZhbHVlIGBgb2JqZWN0YGAgd2l0aCBtYXRjaGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoKG9iamVjdCwgbWF0Y2hlcikge1xuICAgICAgICBpZiAobWF0Y2hlciAmJiB0eXBlb2YgbWF0Y2hlci50ZXN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLnRlc3Qob2JqZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihvYmplY3QpID09PSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBtYXRjaGVyID0gbWF0Y2hlci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgdmFyIG5vdE51bGwgPSB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiIHx8ICEhb2JqZWN0O1xuICAgICAgICAgICAgcmV0dXJuIG5vdE51bGwgJiZcbiAgICAgICAgICAgICAgICAoU3RyaW5nKG9iamVjdCkpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihtYXRjaGVyKSA+PSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlciA9PT0gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIgPT09IG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YobWF0Y2hlcikgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2Yob2JqZWN0KSA9PT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRjaGVyID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzU2V0KG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpc1N1YnNldChtYXRjaGVyLCBvYmplY3QsIG1hdGNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRDbGFzcyhvYmplY3QpID09PSBcIkFycmF5XCIgJiYgZ2V0Q2xhc3MobWF0Y2hlcikgPT09IFwiQXJyYXlcIikge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5Q29udGFpbnMob2JqZWN0LCBtYXRjaGVyLCBtYXRjaCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlciAmJiB0eXBlb2YgbWF0Y2hlciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXIgPT09IG9iamVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHByb3A7XG4gICAgICAgICAgICBmb3IgKHByb3AgaW4gbWF0Y2hlcikge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb2JqZWN0LmdldEF0dHJpYnV0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0LmdldEF0dHJpYnV0ZShwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXJbcHJvcF0gPT09IG51bGwgfHwgdHlwZW9mIG1hdGNoZXJbcHJvcF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbWF0Y2hlcltwcm9wXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgIHZhbHVlID09PSBcInVuZGVmaW5lZFwiIHx8ICFtYXRjaCh2YWx1ZSwgbWF0Y2hlcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWF0Y2hlciB3YXMgbm90IGEgc3RyaW5nLCBhIG51bWJlciwgYSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uLCBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGlzQXJndW1lbnRzOiBpc0FyZ3VtZW50cyxcbiAgICAgICAgaXNFbGVtZW50OiBpc0VsZW1lbnQsXG4gICAgICAgIGlzRGF0ZTogaXNEYXRlLFxuICAgICAgICBpc05lZ1plcm86IGlzTmVnWmVybyxcbiAgICAgICAgaWRlbnRpY2FsOiBpZGVudGljYWwsXG4gICAgICAgIGRlZXBFcXVhbDogZGVlcEVxdWFsQ3ljbGljLFxuICAgICAgICBtYXRjaDogbWF0Y2gsXG4gICAgICAgIGtleXM6IGtleXNcbiAgICB9O1xufSk7XG4iLCIvLyBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuLy8gU2VlIExJQ0VOU0UubWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbnZhciBlbmNvZGluZyA9IHJlcXVpcmUoXCIuL2xpYi9lbmNvZGluZy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFRleHRFbmNvZGVyOiBlbmNvZGluZy5UZXh0RW5jb2RlcixcbiAgVGV4dERlY29kZXI6IGVuY29kaW5nLlRleHREZWNvZGVyLFxufTtcbiIsIihmdW5jdGlvbihnbG9iYWwpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG4gIH1cblxuICBnbG9iYWxbXCJlbmNvZGluZy1pbmRleGVzXCJdID1cbntcbiAgXCJiaWc1XCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE3MzkyLDE5NTA2LDE3OTIzLDE3ODMwLDE3Nzg0LDE2MDM1OSwxOTgzMSwxNzg0MywxNjI5OTMsMTk2ODIsMTYzMDEzLDE1MjUzLDE4MjMwLDE4MjQ0LDE5NTI3LDE5NTIwLDE0ODE1OSwxNDQ5MTksMTYwNTk0LDE1OTM3MSwxNTk5NTQsMTk1NDMsMTcyODgxLDE4MjU1LDE3ODgyLDE5NTg5LDE2MjkyNCwxOTcxOSwxOTEwOCwxODA4MSwxNTg0OTksMjkyMjEsMTU0MTk2LDEzNzgyNywxNDY5NTAsMTQ3Mjk3LDI2MTg5LDIyMjY3LG51bGwsMzIxNDksMjI4MTMsMTY2ODQxLDE1ODYwLDM4NzA4LDE2Mjc5OSwyMzUxNSwxMzg1OTAsMjMyMDQsMTM4NjEsMTcxNjk2LDIzMjQ5LDIzNDc5LDIzODA0LDI2NDc4LDM0MTk1LDE3MDMwOSwyOTc5MywyOTg1MywxNDQ1MywxMzg1NzksMTQ1MDU0LDE1NTY4MSwxNjEwOCwxNTM4MjIsMTUwOTMsMzE0ODQsNDA4NTUsMTQ3ODA5LDE2NjE1NywxNDM4NTAsMTMzNzcwLDE0Mzk2NiwxNzE2MiwzMzkyNCw0MDg1NCwzNzkzNSwxODczNiwzNDMyMywyMjY3OCwzODczMCwzNzQwMCwzMTE4NCwzMTI4MiwyNjIwOCwyNzE3NywzNDk3MywyOTc3MiwzMTY4NSwyNjQ5OCwzMTI3NiwyMTA3MSwzNjkzNCwxMzU0MiwyOTYzNiwxNTUwNjUsMjk4OTQsNDA5MDMsMjI0NTEsMTg3MzUsMjE1ODAsMTY2ODksMTQ1MDM4LDIyNTUyLDMxMzQ2LDE2MjY2MSwzNTcyNywxODA5NCwxNTkzNjgsMTY3NjksMTU1MDMzLDMxNjYyLDE0MDQ3Niw0MDkwNCwxNDA0ODEsMTQwNDg5LDE0MDQ5Miw0MDkwNSwzNDA1MiwxNDQ4MjcsMTY1NjQsNDA5MDYsMTc2MzMsMTc1NjE1LDI1MjgxLDI4NzgyLDQwOTA3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTI3MzYsMTI3MzcsMTI3MzgsMTI3MzksMTI3NDAsMTMxMzQwLDEyNzQxLDEzMTI4MSwxMzEyNzcsMTI3NDIsMTI3NDMsMTMxMjc1LDEzOTI0MCwxMjc0NCwxMzEyNzQsMTI3NDUsMTI3NDYsMTI3NDcsMTI3NDgsMTMxMzQyLDEyNzQ5LDEyNzUwLDI1NiwxOTMsNDYxLDE5MiwyNzQsMjAxLDI4MiwyMDAsMzMyLDIxMSw0NjUsMjEwLG51bGwsNzg3MCxudWxsLDc4NzIsMjAyLDI1NywyMjUsNDYyLDIyNCw1OTMsMjc1LDIzMywyODMsMjMyLDI5OSwyMzcsNDY0LDIzNiwzMzMsMjQzLDQ2NiwyNDIsMzYzLDI1MCw0NjgsMjQ5LDQ3MCw0NzIsNDc0LDQ3NiwyNTIsbnVsbCw3ODcxLG51bGwsNzg3MywyMzQsNjA5LDkxNzgsOTE3OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxNzI5NjksMTM1NDkzLG51bGwsMjU4NjYsbnVsbCxudWxsLDIwMDI5LDI4MzgxLDQwMjcwLDM3MzQzLG51bGwsbnVsbCwxNjE1ODksMjU3NDUsMjAyNTAsMjAyNjQsMjAzOTIsMjA4MjIsMjA4NTIsMjA4OTIsMjA5NjQsMjExNTMsMjExNjAsMjEzMDcsMjEzMjYsMjE0NTcsMjE0NjQsMjIyNDIsMjI3NjgsMjI3ODgsMjI3OTEsMjI4MzQsMjI4MzYsMjMzOTgsMjM0NTQsMjM0NTUsMjM3MDYsMjQxOTgsMjQ2MzUsMjU5OTMsMjY2MjIsMjY2MjgsMjY3MjUsMjc5ODIsMjg4NjAsMzAwMDUsMzI0MjAsMzI0MjgsMzI0NDIsMzI0NTUsMzI0NjMsMzI0NzksMzI1MTgsMzI1NjcsMzM0MDIsMzM0ODcsMzM2NDcsMzUyNzAsMzU3NzQsMzU4MTAsMzY3MTAsMzY3MTEsMzY3MTgsMjk3MTMsMzE5OTYsMzIyMDUsMjY5NTAsMzE0MzMsMjEwMzEsbnVsbCxudWxsLG51bGwsbnVsbCwzNzI2MCwzMDkwNCwzNzIxNCwzMjk1NixudWxsLDM2MTA3LDMzMDE0LDEzMzYwNyxudWxsLG51bGwsMzI5MjcsNDA2NDcsMTk2NjEsNDAzOTMsNDA0NjAsMTk1MTgsMTcxNTEwLDE1OTc1OCw0MDQ1OCwxNzIzMzksMTM3NjEsbnVsbCwyODMxNCwzMzM0MiwyOTk3NyxudWxsLDE4NzA1LDM5NTMyLDM5NTY3LDQwODU3LDMxMTExLDE2NDk3MiwxMzg2OTgsMTMyNTYwLDE0MjA1NCwyMDAwNCwyMDA5NywyMDA5NiwyMDEwMywyMDE1OSwyMDIwMywyMDI3OSwxMzM4OCwyMDQxMywxNTk0NCwyMDQ4MywyMDYxNiwxMzQzNywxMzQ1OSwxMzQ3NywyMDg3MCwyMjc4OSwyMDk1NSwyMDk4OCwyMDk5NywyMDEwNSwyMTExMywyMTEzNiwyMTI4NywxMzc2NywyMTQxNywxMzY0OSwyMTQyNCwxMzY1MSwyMTQ0MiwyMTUzOSwxMzY3NywxMzY4MiwxMzk1MywyMTY1MSwyMTY2NywyMTY4NCwyMTY4OSwyMTcxMiwyMTc0MywyMTc4NCwyMTc5NSwyMTgwMCwxMzcyMCwyMTgyMywxMzczMywxMzc1OSwyMTk3NSwxMzc2NSwxNjMyMDQsMjE3OTcsbnVsbCwxMzQyMTAsMTM0NDIxLDE1MTg1MSwyMTkwNCwxNDI1MzQsMTQ4MjgsMTMxOTA1LDM2NDIyLDE1MDk2OCwxNjkxODksMTY0NjcsMTY0MDMwLDMwNTg2LDE0MjM5MiwxNDkwMCwxODM4OSwxNjQxODksMTU4MTk0LDE1MTAxOCwyNTgyMSwxMzQ1MjQsMTM1MDkyLDEzNDM1NywxMzU0MTIsMjU3NDEsMzY0NzgsMTM0ODA2LDEzNDE1NSwxMzUwMTIsMTQyNTA1LDE2NDQzOCwxNDg2OTEsbnVsbCwxMzQ0NzAsMTcwNTczLDE2NDA3MywxODQyMCwxNTEyMDcsMTQyNTMwLDM5NjAyLDE0OTUxLDE2OTQ2MCwxNjM2NSwxMzU3NCwxNTIyNjMsMTY5OTQwLDE2MTk5MiwxNDI2NjAsNDAzMDIsMzg5MzMsbnVsbCwxNzM2OSwxNTU4MTMsMjU3ODAsMjE3MzEsMTQyNjY4LDE0MjI4MiwxMzUyODcsMTQ4NDMsMTM1Mjc5LDE1NzQwMiwxNTc0NjIsMTYyMjA4LDI1ODM0LDE1MTYzNCwxMzQyMTEsMzY0NTYsMTM5NjgxLDE2NjczMiwxMzI5MTMsbnVsbCwxODQ0MywxMzE0OTcsMTYzNzgsMjI2NDMsMTQyNzMzLG51bGwsMTQ4OTM2LDEzMjM0OCwxNTU3OTksMTM0OTg4LDEzNDU1MCwyMTg4MSwxNjU3MSwxNzMzOCxudWxsLDE5MTI0LDE0MTkyNiwxMzUzMjUsMzMxOTQsMzkxNTcsMTM0NTU2LDI1NDY1LDE0ODQ2LDE0MTE3MywzNjI4OCwyMjE3NywyNTcyNCwxNTkzOSxudWxsLDE3MzU2OSwxMzQ2NjUsMTQyMDMxLDE0MjUzNyxudWxsLDEzNTM2OCwxNDU4NTgsMTQ3MzgsMTQ4NTQsMTY0NTA3LDEzNjg4LDE1NTIwOSwxMzk0NjMsMjIwOTgsMTM0OTYxLDE0MjUxNCwxNjk3NjAsMTM1MDAsMjc3MDksMTUxMDk5LG51bGwsbnVsbCwxNjExNDAsMTQyOTg3LDEzOTc4NCwxNzM2NTksMTY3MTE3LDEzNDc3OCwxMzQxOTYsMTU3NzI0LDMyNjU5LDEzNTM3NSwxNDEzMTUsMTQxNjI1LDEzODE5LDE1MjAzNSwxMzQ3OTYsMTM1MDUzLDEzNDgyNiwxNjI3NSwxMzQ5NjAsMTM0NDcxLDEzNTUwMywxMzQ3MzIsbnVsbCwxMzQ4MjcsMTM0MDU3LDEzNDQ3MiwxMzUzNjAsMTM1NDg1LDE2Mzc3LDE0MDk1MCwyNTY1MCwxMzUwODUsMTQ0MzcyLDE2MTMzNywxNDIyODYsMTM0NTI2LDEzNDUyNywxNDI0MTcsMTQyNDIxLDE0ODcyLDEzNDgwOCwxMzUzNjcsMTM0OTU4LDE3MzYxOCwxNTg1NDQsMTY3MTIyLDE2NzMyMSwxNjcxMTQsMzgzMTQsMjE3MDgsMzM0NzYsMjE5NDUsbnVsbCwxNzE3MTUsMzk5NzQsMzk2MDYsMTYxNjMwLDE0MjgzMCwyODk5MiwzMzEzMywzMzAwNCwyMzU4MCwxNTcwNDIsMzMwNzYsMTQyMzEsMjEzNDMsMTY0MDI5LDM3MzAyLDEzNDkwNiwxMzQ2NzEsMTM0Nzc1LDEzNDkwNywxMzc4OSwxNTEwMTksMTM4MzMsMTM0MzU4LDIyMTkxLDE0MTIzNywxMzUzNjksMTM0NjcyLDEzNDc3NiwxMzUyODgsMTM1NDk2LDE2NDM1OSwxMzYyNzcsMTM0Nzc3LDE1MTEyMCwxNDI3NTYsMjMxMjQsMTM1MTk3LDEzNTE5OCwxMzU0MTMsMTM1NDE0LDIyNDI4LDEzNDY3MywxNjE0MjgsMTY0NTU3LDEzNTA5MywxMzQ3NzksMTUxOTM0LDE0MDgzLDEzNTA5NCwxMzU1NTIsMTUyMjgwLDE3MjczMywxNDk5NzgsMTM3Mjc0LDE0NzgzMSwxNjQ0NzYsMjI2ODEsMjEwOTYsMTM4NTAsMTUzNDA1LDMxNjY2LDIzNDAwLDE4NDMyLDE5MjQ0LDQwNzQzLDE4OTE5LDM5OTY3LDM5ODIxLDE1NDQ4NCwxNDM2NzcsMjIwMTEsMTM4MTAsMjIxNTMsMjAwMDgsMjI3ODYsMTM4MTc3LDE5NDY4MCwzODczNywxMzEyMDYsMjAwNTksMjAxNTUsMTM2MzAsMjM1ODcsMjQ0MDEsMjQ1MTYsMTQ1ODYsMjUxNjQsMjU5MDksMjc1MTQsMjc3MDEsMjc3MDYsMjg3ODAsMjkyMjcsMjAwMTIsMjkzNTcsMTQ5NzM3LDMyNTk0LDMxMDM1LDMxOTkzLDMyNTk1LDE1NjI2NiwxMzUwNSxudWxsLDE1NjQ5MSwzMjc3MCwzMjg5NiwxNTcyMDIsMTU4MDMzLDIxMzQxLDM0OTE2LDM1MjY1LDE2MTk3MCwzNTc0NCwzNjEyNSwzODAyMSwzODI2NCwzODI3MSwzODM3NiwxNjc0MzksMzg4ODYsMzkwMjksMzkxMTgsMzkxMzQsMzkyNjcsMTcwMDAwLDQwMDYwLDQwNDc5LDQwNjQ0LDI3NTAzLDYzNzUxLDIwMDIzLDEzMTIwNywzODQyOSwyNTE0MywzODA1MCxudWxsLDIwNTM5LDI4MTU4LDE3MTEyMyw0MDg3MCwxNTgxNywzNDk1OSwxNDc3OTAsMjg3OTEsMjM3OTcsMTkyMzIsMTUyMDEzLDEzNjU3LDE1NDkyOCwyNDg2NiwxNjY0NTAsMzY3NzUsMzczNjYsMjkwNzMsMjYzOTMsMjk2MjYsMTQ0MDAxLDE3MjI5NSwxNTQ5OSwxMzc2MDAsMTkyMTYsMzA5NDgsMjk2OTgsMjA5MTAsMTY1NjQ3LDE2MzkzLDI3MjM1LDE3MjczMCwxNjkzMSwzNDMxOSwxMzM3NDMsMzEyNzQsMTcwMzExLDE2NjYzNCwzODc0MSwyODc0OSwyMTI4NCwxMzkzOTAsMzc4NzYsMzA0MjUsMTY2MzcxLDQwODcxLDMwNjg1LDIwMTMxLDIwNDY0LDIwNjY4LDIwMDE1LDIwMjQ3LDQwODcyLDIxNTU2LDMyMTM5LDIyNjc0LDIyNzM2LDEzODY3OCwyNDIxMCwyNDIxNywyNDUxNCwxNDEwNzQsMjU5OTUsMTQ0Mzc3LDI2OTA1LDI3MjAzLDE0NjUzMSwyNzkwMyxudWxsLDI5MTg0LDE0ODc0MSwyOTU4MCwxNjA5MSwxNTAwMzUsMjMzMTcsMjk4ODEsMzU3MTUsMTU0Nzg4LDE1MzIzNywzMTM3OSwzMTcyNCwzMTkzOSwzMjM2NCwzMzUyOCwzNDE5OSw0MDg3MywzNDk2MCw0MDg3NCwzNjUzNyw0MDg3NSwzNjgxNSwzNDE0MywzOTM5MiwzNzQwOSw0MDg3NiwxNjczNTMsMTM2MjU1LDE2NDk3LDE3MDU4LDIzMDY2LG51bGwsbnVsbCxudWxsLDM5MDE2LDI2NDc1LDE3MDE0LDIyMzMzLG51bGwsMzQyNjIsMTQ5ODgzLDMzNDcxLDE2MDAxMywxOTU4NSwxNTkwOTIsMjM5MzEsMTU4NDg1LDE1OTY3OCw0MDg3Nyw0MDg3OCwyMzQ0Niw0MDg3OSwyNjM0MywzMjM0NywyODI0NywzMTE3OCwxNTc1MiwxNzYwMywxNDM5NTgsMTQxMjA2LDE3MzA2LDE3NzE4LG51bGwsMjM3NjUsMTQ2MjAyLDM1NTc3LDIzNjcyLDE1NjM0LDE0NDcyMSwyMzkyOCw0MDg4MiwyOTAxNSwxNzc1MiwxNDc2OTIsMTM4Nzg3LDE5NTc1LDE0NzEyLDEzMzg2LDEzMTQ5MiwxNTg3ODUsMzU1MzIsMjA0MDQsMTMxNjQxLDIyOTc1LDMzMTMyLDM4OTk4LDE3MDIzNCwyNDM3OSwxMzQwNDcsbnVsbCwxMzk3MTMsMTY2MjUzLDE2NjQyLDE4MTA3LDE2ODA1NywxNjEzNSw0MDg4MywxNzI0NjksMTY2MzIsMTQyOTQsMTgxNjcsMTU4NzkwLDE2NzY0LDE2NTU1NCwxNjA3NjcsMTc3NzMsMTQ1NDgsMTUyNzMwLDE3NzYxLDE3NjkxLDE5ODQ5LDE5NTc5LDE5ODMwLDE3ODk4LDE2MzI4LDE1MDI4NywxMzkyMSwxNzYzMCwxNzU5NywxNjg3NywyMzg3MCwyMzg4MCwyMzg5NCwxNTg2OCwxNDM1MSwyMzk3MiwyMzk5MywxNDM2OCwxNDM5MiwyNDEzMCwyNDI1MywyNDM1NywyNDQ1MSwxNDYwMCwxNDYxMiwxNDY1NSwxNDY2OSwyNDc5MSwyNDg5MywyMzc4MSwxNDcyOSwyNTAxNSwyNTAxNywyNTAzOSwxNDc3NiwyNTEzMiwyNTIzMiwyNTMxNywyNTM2OCwxNDg0MCwyMjE5MywxNDg1MSwyNTU3MCwyNTU5NSwyNTYwNywyNTY5MCwxNDkyMywyNTc5MiwyMzgyOSwyMjA0OSw0MDg2MywxNDk5OSwyNTk5MCwxNTAzNywyNjExMSwyNjE5NSwxNTA5MCwyNjI1OCwxNTEzOCwyNjM5MCwxNTE3MCwyNjUzMiwyNjYyNCwxNTE5MiwyNjY5OCwyNjc1NiwxNTIxOCwxNTIxNywxNTIyNywyNjg4OSwyNjk0NywyOTI3NiwyNjk4MCwyNzAzOSwyNzAxMywxNTI5MiwyNzA5NCwxNTMyNSwyNzIzNywyNzI1MiwyNzI0OSwyNzI2NiwxNTM0MCwyNzI4OSwxNTM0NiwyNzMwNywyNzMxNywyNzM0OCwyNzM4MiwyNzUyMSwyNzU4NSwyNzYyNiwyNzc2NSwyNzgxOCwxNTU2MywyNzkwNiwyNzkxMCwyNzk0MiwyODAzMywxNTU5OSwyODA2OCwyODA4MSwyODE4MSwyODE4NCwyODIwMSwyODI5NCwxNjYzMzYsMjgzNDcsMjgzODYsMjgzNzgsNDA4MzEsMjgzOTIsMjgzOTMsMjg0NTIsMjg0NjgsMTU2ODYsMTQ3MjY1LDI4NTQ1LDI4NjA2LDE1NzIyLDE1NzMzLDI5MTExLDIzNzA1LDE1NzU0LDI4NzE2LDE1NzYxLDI4NzUyLDI4NzU2LDI4NzgzLDI4Nzk5LDI4ODA5LDEzMTg3NywxNzM0NSwxMzgwOSwxMzQ4NzIsMTQ3MTU5LDIyNDYyLDE1OTQ0MywyODk5MCwxNTM1NjgsMTM5MDIsMjcwNDIsMTY2ODg5LDIzNDEyLDMxMzA1LDE1MzgyNSwxNjkxNzcsMzEzMzMsMzEzNTcsMTU0MDI4LDMxNDE5LDMxNDA4LDMxNDI2LDMxNDI3LDI5MTM3LDE1NjgxMywxNjg0MiwzMTQ1MCwzMTQ1MywzMTQ2NiwxNjg3OSwyMTY4MiwxNTQ2MjUsMzE0OTksMzE1NzMsMzE1MjksMTUyMzM0LDE1NDg3OCwzMTY1MCwzMTU5OSwzMzY5MiwxNTQ1NDgsMTU4ODQ3LDMxNjk2LDMzODI1LDMxNjM0LDMxNjcyLDE1NDkxMiwxNTc4OSwxNTQ3MjUsMzM5MzgsMzE3MzgsMzE3NTAsMzE3OTcsMTU0ODE3LDMxODEyLDMxODc1LDE0OTYzNCwzMTkxMCwyNjIzNywxNDg4NTYsMzE5NDUsMzE5NDMsMzE5NzQsMzE4NjAsMzE5ODcsMzE5ODksMzE5NTAsMzIzNTksMTc2OTMsMTU5MzAwLDMyMDkzLDE1OTQ0NiwyOTgzNywzMjEzNywzMjE3MSwyODk4MSwzMjE3OSwzMjIxMCwxNDc1NDMsMTU1Njg5LDMyMjI4LDE1NjM1LDMyMjQ1LDEzNzIwOSwzMjIyOSwxNjQ3MTcsMzIyODUsMTU1OTM3LDE1NTk5NCwzMjM2NiwzMjQwMiwxNzE5NSwzNzk5NiwzMjI5NSwzMjU3NiwzMjU3NywzMjU4MywzMTAzMCwxNTYzNjgsMzkzOTMsMzI2NjMsMTU2NDk3LDMyNjc1LDEzNjgwMSwxMzExNzYsMTc3NTYsMTQ1MjU0LDE3NjY3LDE2NDY2NiwzMjc2MiwxNTY4MDksMzI3NzMsMzI3NzYsMzI3OTcsMzI4MDgsMzI4MTUsMTcyMTY3LDE1ODkxNSwzMjgyNywzMjgyOCwzMjg2NSwxNDEwNzYsMTg4MjUsMTU3MjIyLDE0NjkxNSwxNTc0MTYsMjY0MDUsMzI5MzUsMTY2NDcyLDMzMDMxLDMzMDUwLDIyNzA0LDE0MTA0NiwyNzc3NSwxNTY4MjQsMTUxNDgwLDI1ODMxLDEzNjMzMCwzMzMwNCwxMzczMTAsMjcyMTksMTUwMTE3LDE1MDE2NSwxNzUzMCwzMzMyMSwxMzM5MDEsMTU4MjkwLDE0NjgxNCwyMDQ3MywxMzY0NDUsMzQwMTgsMzM2MzQsMTU4NDc0LDE0OTkyNywxNDQ2ODgsMTM3MDc1LDE0NjkzNiwzMzQ1MCwyNjkwNywxOTQ5NjQsMTY4NTksMzQxMjMsMzM0ODgsMzM1NjIsMTM0Njc4LDEzNzE0MCwxNDAxNywxNDM3NDEsMTQ0NzMwLDMzNDAzLDMzNTA2LDMzNTYwLDE0NzA4MywxNTkxMzksMTU4NDY5LDE1ODYxNSwxNDQ4NDYsMTU4MDcsMzM1NjUsMjE5OTYsMzM2NjksMTc2NzUsMTU5MTQxLDMzNzA4LDMzNzI5LDMzNzQ3LDEzNDM4LDE1OTQ0NCwyNzIyMywzNDEzOCwxMzQ2MiwxNTkyOTgsMTQzMDg3LDMzODgwLDE1NDU5NiwzMzkwNSwxNTgyNywxNzYzNiwyNzMwMywzMzg2NiwxNDY2MTMsMzEwNjQsMzM5NjAsMTU4NjE0LDE1OTM1MSwxNTkyOTksMzQwMTQsMzM4MDcsMzM2ODEsMTc1NjgsMzM5MzksMzQwMjAsMTU0NzY5LDE2OTYwLDE1NDgxNiwxNzczMSwzNDEwMCwyMzI4MiwxNTkzODUsMTc3MDMsMzQxNjMsMTc2ODYsMjY1NTksMzQzMjYsMTY1NDEzLDE2NTQzNSwzNDI0MSwxNTk4ODAsMzQzMDYsMTM2NTc4LDE1OTk0OSwxOTQ5OTQsMTc3NzAsMzQzNDQsMTM4OTYsMTM3Mzc4LDIxNDk1LDE2MDY2NiwzNDQzMCwzNDY3MywxNzIyODAsMzQ3OTgsMTQyMzc1LDM0NzM3LDM0Nzc4LDM0ODMxLDIyMTEzLDM0NDEyLDI2NzEwLDE3OTM1LDM0ODg1LDM0ODg2LDE2MTI0OCwxNDY4NzMsMTYxMjUyLDM0OTEwLDM0OTcyLDE4MDExLDM0OTk2LDM0OTk3LDI1NTM3LDM1MDEzLDMwNTgzLDE2MTU1MSwzNTIwNywzNTIxMCwzNTIzOCwzNTI0MSwzNTIzOSwzNTI2MCwxNjY0MzcsMzUzMDMsMTYyMDg0LDE2MjQ5MywzNTQ4NCwzMDYxMSwzNzM3NCwzNTQ3MiwxNjIzOTMsMzE0NjUsMTYyNjE4LDE0NzM0MywxODE5NSwxNjI2MTYsMjkwNTIsMzU1OTYsMzU2MTUsMTUyNjI0LDE1MjkzMywzNTY0NywzNTY2MCwzNTY2MSwzNTQ5NywxNTAxMzgsMzU3MjgsMzU3MzksMzU1MDMsMTM2OTI3LDE3OTQxLDM0ODk1LDM1OTk1LDE2MzE1NiwxNjMyMTUsMTk1MDI4LDE0MTE3LDE2MzE1NSwzNjA1NCwxNjMyMjQsMTYzMjYxLDM2MTE0LDM2MDk5LDEzNzQ4OCwzNjA1OSwyODc2NCwzNjExMywxNTA3MjksMTYwODAsMzYyMTUsMzYyNjUsMTYzODQyLDEzNTE4OCwxNDk4OTgsMTUyMjgsMTY0Mjg0LDE2MDAxMiwzMTQ2MywzNjUyNSwzNjUzNCwzNjU0NywzNzU4OCwzNjYzMywzNjY1MywxNjQ3MDksMTY0ODgyLDM2NzczLDM3NjM1LDE3MjcwMywxMzM3MTIsMzY3ODcsMTg3MzAsMTY2MzY2LDE2NTE4MSwxNDY4NzUsMjQzMTIsMTQzOTcwLDM2ODU3LDE3MjA1MiwxNjU1NjQsMTY1MTIxLDE0MDA2OSwxNDcyMCwxNTk0NDcsMzY5MTksMTY1MTgwLDE2MjQ5NCwzNjk2MSwxNjUyMjgsMTY1Mzg3LDM3MDMyLDE2NTY1MSwzNzA2MCwxNjU2MDYsMzcwMzgsMzcxMTcsMzcyMjMsMTUwODgsMzcyODksMzczMTYsMzE5MTYsMTY2MTk1LDEzODg4OSwzNzM5MCwyNzgwNywzNzQ0MSwzNzQ3NCwxNTMwMTcsMzc1NjEsMTY2NTk4LDE0NjU4NywxNjY2NjgsMTUzMDUxLDEzNDQ0OSwzNzY3NiwzNzczOSwxNjY2MjUsMTY2ODkxLDI4ODE1LDIzMjM1LDE2NjYyNiwxNjY2MjksMTg3ODksMzc0NDQsMTY2ODkyLDE2Njk2OSwxNjY5MTEsMzc3NDcsMzc5NzksMzY1NDAsMzgyNzcsMzgzMTAsMzc5MjYsMzgzMDQsMjg2NjIsMTcwODEsMTQwOTIyLDE2NTU5MiwxMzU4MDQsMTQ2OTkwLDE4OTExLDI3Njc2LDM4NTIzLDM4NTUwLDE2NzQ4LDM4NTYzLDE1OTQ0NSwyNTA1MCwzODU4MiwzMDk2NSwxNjY2MjQsMzg1ODksMjE0NTIsMTg4NDksMTU4OTA0LDEzMTcwMCwxNTY2ODgsMTY4MTExLDE2ODE2NSwxNTAyMjUsMTM3NDkzLDE0NDEzOCwzODcwNSwzNDM3MCwzODcxMCwxODk1OSwxNzcyNSwxNzc5NywxNTAyNDksMjg3ODksMjMzNjEsMzg2ODMsMzg3NDgsMTY4NDA1LDM4NzQzLDIzMzcwLDE2ODQyNywzODc1MSwzNzkyNSwyMDY4OCwxNDM1NDMsMTQzNTQ4LDM4NzkzLDM4ODE1LDM4ODMzLDM4ODQ2LDM4ODQ4LDM4ODY2LDM4ODgwLDE1MjY4NCwzODg5NCwyOTcyNCwxNjkwMTEsMzg5MTEsMzg5MDEsMTY4OTg5LDE2MjE3MCwxOTE1MywzODk2NCwzODk2MywzODk4NywzOTAxNCwxNTExOCwxNjAxMTcsMTU2OTcsMTMyNjU2LDE0NzgwNCwxNTMzNTAsMzkxMTQsMzkwOTUsMzkxMTIsMzkxMTEsMTkxOTksMTU5MDE1LDEzNjkxNSwyMTkzNiwzOTEzNywzOTE0MiwzOTE0OCwzNzc1MiwzOTIyNSwxNTAwNTcsMTkzMTQsMTcwMDcxLDE3MDI0NSwzOTQxMywzOTQzNiwzOTQ4MywzOTQ0MCwzOTUxMiwxNTMzODEsMTQwMjAsMTY4MTEzLDE3MDk2NSwzOTY0OCwzOTY1MCwxNzA3NTcsMzk2NjgsMTk0NzAsMzk3MDAsMzk3MjUsMTY1Mzc2LDIwNTMyLDM5NzMyLDE1ODEyMCwxNDUzMSwxNDM0ODUsMzk3NjAsMzk3NDQsMTcxMzI2LDIzMTA5LDEzNzMxNSwzOTgyMiwxNDgwNDMsMzk5MzgsMzk5MzUsMzk5NDgsMTcxNjI0LDQwNDA0LDE3MTk1OSwxNzI0MzQsMTcyNDU5LDE3MjI1NywxNzIzMjMsMTcyNTExLDQwMzE4LDQwMzIzLDE3MjM0MCw0MDQ2MiwyNjc2MCw0MDM4OCwxMzk2MTEsMTcyNDM1LDE3MjU3NiwxMzc1MzEsMTcyNTk1LDQwMjQ5LDE3MjIxNywxNzI3MjQsNDA1OTIsNDA1OTcsNDA2MDYsNDA2MTAsMTk3NjQsNDA2MTgsNDA2MjMsMTQ4MzI0LDQwNjQxLDE1MjAwLDE0ODIxLDE1NjQ1LDIwMjc0LDE0MjcwLDE2Njk1NSw0MDcwNiw0MDcxMiwxOTM1MCwzNzkyNCwxNTkxMzgsNDA3MjcsNDA3MjYsNDA3NjEsMjIxNzUsMjIxNTQsNDA3NzMsMzkzNTIsMTY4MDc1LDM4ODk4LDMzOTE5LDQwODAyLDQwODA5LDMxNDUyLDQwODQ2LDI5MjA2LDE5MzkwLDE0OTg3NywxNDk5NDcsMjkwNDcsMTUwMDA4LDE0ODI5NiwxNTAwOTcsMjk1OTgsMTY2ODc0LDEzNzQ2NiwzMTEzNSwxNjYyNzAsMTY3NDc4LDM3NzM3LDM3ODc1LDE2NjQ2OCwzNzYxMiwzNzc2MSwzNzgzNSwxNjYyNTIsMTQ4NjY1LDI5MjA3LDE2MTA3LDMwNTc4LDMxMjk5LDI4ODgwLDE0ODU5NSwxNDg0NzIsMjkwNTQsMTM3MTk5LDI4ODM1LDEzNzQwNiwxNDQ3OTMsMTYwNzEsMTM3MzQ5LDE1MjYyMywxMzcyMDgsMTQxMTQsMTM2OTU1LDEzNzI3MywxNDA0OSwxMzcwNzYsMTM3NDI1LDE1NTQ2NywxNDExNSwxMzY4OTYsMjIzNjMsMTUwMDUzLDEzNjE5MCwxMzU4NDgsMTM2MTM0LDEzNjM3NCwzNDA1MSwxNDUwNjIsMzQwNTEsMzM4NzcsMTQ5OTA4LDE2MDEwMSwxNDY5OTMsMTUyOTI0LDE0NzE5NSwxNTk4MjYsMTc2NTIsMTQ1MTM0LDE3MDM5NywxNTk1MjYsMjY2MTcsMTQxMzEsMTUzODEsMTU4NDcsMjI2MzYsMTM3NTA2LDI2NjQwLDE2NDcxLDE0NTIxNSwxNDc2ODEsMTQ3NTk1LDE0NzcyNywxNTg3NTMsMjE3MDcsMjIxNzQsMTU3MzYxLDIyMTYyLDEzNTEzNSwxMzQwNTYsMTM0NjY5LDM3ODMwLDE2NjY3NSwzNzc4OCwyMDIxNiwyMDc3OSwxNDM2MSwxNDg1MzQsMjAxNTYsMTMyMTk3LDEzMTk2NywyMDI5OSwyMDM2MiwxNTMxNjksMjMxNDQsMTMxNDk5LDEzMjA0MywxNDc0NSwxMzE4NTAsMTMyMTE2LDEzMzY1LDIwMjY1LDEzMTc3NiwxNjc2MDMsMTMxNzAxLDM1NTQ2LDEzMTU5NiwyMDEyMCwyMDY4NSwyMDc0OSwyMDM4NiwyMDIyNywxNTAwMzAsMTQ3MDgyLDIwMjkwLDIwNTI2LDIwNTg4LDIwNjA5LDIwNDI4LDIwNDUzLDIwNTY4LDIwNzMyLDIwODI1LDIwODI3LDIwODI5LDIwODMwLDI4Mjc4LDE0NDc4OSwxNDcwMDEsMTQ3MTM1LDI4MDE4LDEzNzM0OCwxNDcwODEsMjA5MDQsMjA5MzEsMTMyNTc2LDE3NjI5LDEzMjI1OSwxMzIyNDIsMTMyMjQxLDM2MjE4LDE2NjU1NiwxMzI4NzgsMjEwODEsMjExNTYsMTMzMjM1LDIxMjE3LDM3NzQyLDE4MDQyLDI5MDY4LDE0ODM2NCwxMzQxNzYsMTQ5OTMyLDEzNTM5NiwyNzA4OSwxMzQ2ODUsMjk4MTcsMTYwOTQsMjk4NDksMjk3MTYsMjk3ODIsMjk1OTIsMTkzNDIsMTUwMjA0LDE0NzU5NywyMTQ1NiwxMzcwMCwyOTE5OSwxNDc2NTcsMjE5NDAsMTMxOTA5LDIxNzA5LDEzNDA4NiwyMjMwMSwzNzQ2OSwzODY0NCwzNzczNCwyMjQ5MywyMjQxMywyMjM5OSwxMzg4NiwyMjczMSwyMzE5MywxNjY0NzAsMTM2OTU0LDEzNzA3MSwxMzY5NzYsMjMwODQsMjI5NjgsMzc1MTksMjMxNjYsMjMyNDcsMjMwNTgsMTUzOTI2LDEzNzcxNSwxMzczMTMsMTQ4MTE3LDE0MDY5LDI3OTA5LDI5NzYzLDIzMDczLDE1NTI2NywyMzE2OSwxNjY4NzEsMTMyMTE1LDM3ODU2LDI5ODM2LDEzNTkzOSwyODkzMywxODgwMiwzNzg5NiwxNjYzOTUsMzc4MjEsMTQyNDAsMjM1ODIsMjM3MTAsMjQxNTgsMjQxMzYsMTM3NjIyLDEzNzU5NiwxNDYxNTgsMjQyNjksMjMzNzUsMTM3NDc1LDEzNzQ3NiwxNDA4MSwxMzczNzYsMTQwNDUsMTM2OTU4LDE0MDM1LDMzMDY2LDE2NjQ3MSwxMzg2ODIsMTQ0NDk4LDE2NjMxMiwyNDMzMiwyNDMzNCwxMzc1MTEsMTM3MTMxLDIzMTQ3LDEzNzAxOSwyMzM2NCwzNDMyNCwxNjEyNzcsMzQ5MTIsMjQ3MDIsMTQxNDA4LDE0MDg0MywyNDUzOSwxNjA1NiwxNDA3MTksMTQwNzM0LDE2ODA3MiwxNTk2MDMsMjUwMjQsMTMxMTM0LDEzMTE0MiwxNDA4MjcsMjQ5ODUsMjQ5ODQsMjQ2OTMsMTQyNDkxLDE0MjU5OSwxNDkyMDQsMTY4MjY5LDI1NzEzLDE0OTA5MywxNDIxODYsMTQ4ODksMTQyMTE0LDE0NDQ2NCwxNzAyMTgsMTQyOTY4LDI1Mzk5LDE3MzE0NywyNTc4MiwyNTM5MywyNTU1MywxNDk5ODcsMTQyNjk1LDI1MjUyLDE0MjQ5NywyNTY1OSwyNTk2MywyNjk5NCwxNTM0OCwxNDM1MDIsMTQ0MDQ1LDE0OTg5NywxNDQwNDMsMjE3NzMsMTQ0MDk2LDEzNzQzMywxNjkwMjMsMjYzMTgsMTQ0MDA5LDE0Mzc5NSwxNTA3MiwxNjc4NCwxNTI5NjQsMTY2NjkwLDE1Mjk3NSwxMzY5NTYsMTUyOTIzLDE1MjYxMywzMDk1OCwxNDM2MTksMTM3MjU4LDE0MzkyNCwxMzQxMiwxNDM4ODcsMTQzNzQ2LDE0ODE2OSwyNjI1NCwxNTkwMTIsMjYyMTksMTkzNDcsMjYxNjAsMTYxOTA0LDEzODczMSwyNjIxMSwxNDQwODIsMTQ0MDk3LDI2MTQyLDE1MzcxNCwxNDU0NSwxNDU0NjYsMTQ1MzQwLDE1MjU3LDE0NTMxNCwxNDQzODIsMjk5MDQsMTUyNTQsMjY1MTEsMTQ5MDM0LDI2ODA2LDI2NjU0LDE1MzAwLDI3MzI2LDE0NDM1LDE0NTM2NSwxNDg2MTUsMjcxODcsMjcyMTgsMjczMzcsMjczOTcsMTM3NDkwLDI1ODczLDI2Nzc2LDI3MjEyLDE1MzE5LDI3MjU4LDI3NDc5LDE0NzM5MiwxNDY1ODYsMzc3OTIsMzc2MTgsMTY2ODkwLDE2NjYwMywzNzUxMywxNjM4NzAsMTY2MzY0LDM3OTkxLDI4MDY5LDI4NDI3LDE0OTk5NiwyODAwNywxNDczMjcsMTU3NTksMjgxNjQsMTQ3NTE2LDIzMTAxLDI4MTcwLDIyNTk5LDI3OTQwLDMwNzg2LDI4OTg3LDE0ODI1MCwxNDgwODYsMjg5MTMsMjkyNjQsMjkzMTksMjkzMzIsMTQ5MzkxLDE0OTI4NSwyMDg1NywxNTAxODAsMTMyNTg3LDI5ODE4LDE0NzE5MiwxNDQ5OTEsMTUwMDkwLDE0OTc4MywxNTU2MTcsMTYxMzQsMTYwNDksMTUwMjM5LDE2Njk0NywxNDcyNTMsMjQ3NDMsMTYxMTUsMjk5MDAsMjk3NTYsMzc3NjcsMjk3NTEsMTc1NjcsMTU5MjEwLDE3NzQ1LDMwMDgzLDE2MjI3LDE1MDc0NSwxNTA3OTAsMTYyMTYsMzAwMzcsMzAzMjMsMTczNTEwLDE1MTI5LDI5ODAwLDE2NjYwNCwxNDk5MzEsMTQ5OTAyLDE1MDk5LDE1ODIxLDE1MDA5NCwxNjEyNywxNDk5NTcsMTQ5NzQ3LDM3MzcwLDIyMzIyLDM3Njk4LDE2NjYyNywxMzczMTYsMjA3MDMsMTUyMDk3LDE1MjAzOSwzMDU4NCwxNDM5MjIsMzA0NzgsMzA0NzksMzA1ODcsMTQ5MTQzLDE0NTI4MSwxNDk0MiwxNDk3NDQsMjk3NTIsMjk4NTEsMTYwNjMsMTUwMjAyLDE1MDIxNSwxNjU4NCwxNTAxNjYsMTU2MDc4LDM3NjM5LDE1Mjk2MSwzMDc1MCwzMDg2MSwzMDg1NiwzMDkzMCwyOTY0OCwzMTA2NSwxNjE2MDEsMTUzMzE1LDE2NjU0LDMxMTMxLDMzOTQyLDMxMTQxLDI3MTgxLDE0NzE5NCwzMTI5MCwzMTIyMCwxNjc1MCwxMzY5MzQsMTY2OTAsMzc0MjksMzEyMTcsMTM0NDc2LDE0OTkwMCwxMzE3MzcsMTQ2ODc0LDEzNzA3MCwxMzcxOSwyMTg2NywxMzY4MCwxMzk5NCwxMzE1NDAsMTM0MTU3LDMxNDU4LDIzMTI5LDE0MTA0NSwxNTQyODcsMTU0MjY4LDIzMDUzLDEzMTY3NSwzMDk2MCwyMzA4MiwxNTQ1NjYsMzE0ODYsMTY4ODksMzE4MzcsMzE4NTMsMTY5MTMsMTU0NTQ3LDE1NTMyNCwxNTUzMDIsMzE5NDksMTUwMDA5LDEzNzEzNiwzMTg4NiwzMTg2OCwzMTkxOCwyNzMxNCwzMjIyMCwzMjI2MywzMjIxMSwzMjU5MCwxNTYyNTcsMTU1OTk2LDE2MjYzMiwzMjE1MSwxNTUyNjYsMTcwMDIsMTU4NTgxLDEzMzM5OCwyNjU4MiwxMzExNTAsMTQ0ODQ3LDIyNDY4LDE1NjY5MCwxNTY2NjQsMTQ5ODU4LDMyNzMzLDMxNTI3LDEzMzE2NCwxNTQzNDUsMTU0OTQ3LDMxNTAwLDE1NTE1MCwzOTM5OCwzNDM3MywzOTUyMywyNzE2NCwxNDQ0NDcsMTQ4MTgsMTUwMDA3LDE1NzEwMSwzOTQ1NSwxNTcwODgsMzM5MjAsMTYwMDM5LDE1ODkyOSwxNzY0MiwzMzA3OSwxNzQxMCwzMjk2NiwzMzAzMywzMzA5MCwxNTc2MjAsMzkxMDcsMTU4Mjc0LDMzMzc4LDMzMzgxLDE1ODI4OSwzMzg3NSwxNTkxNDMsMzQzMjAsMTYwMjgzLDIzMTc0LDE2NzY3LDEzNzI4MCwyMzMzOSwxMzczNzcsMjMyNjgsMTM3NDMyLDM0NDY0LDE5NTAwNCwxNDY4MzEsMzQ4NjEsMTYwODAyLDIzMDQyLDM0OTI2LDIwMjkzLDM0OTUxLDM1MDA3LDM1MDQ2LDM1MTczLDM1MTQ5LDE1MzIxOSwzNTE1NiwxNjE2NjksMTYxNjY4LDE2NjkwMSwxNjY4NzMsMTY2ODEyLDE2NjM5MywxNjA0NSwzMzk1NSwxODE2NSwxODEyNywxNDMyMiwzNTM4OSwzNTM1NiwxNjkwMzIsMjQzOTcsMzc0MTksMTQ4MTAwLDI2MDY4LDI4OTY5LDI4ODY4LDEzNzI4NSw0MDMwMSwzNTk5OSwzNjA3MywxNjMyOTIsMjI5MzgsMzA2NTksMjMwMjQsMTcyNjIsMTQwMzYsMzYzOTQsMzY1MTksMTUwNTM3LDM2NjU2LDM2NjgyLDE3MTQwLDI3NzM2LDI4NjAzLDE0MDA2NSwxODU4NywyODUzNywyODI5OSwxMzcxNzgsMzk5MTMsMTQwMDUsMTQ5ODA3LDM3MDUxLDM3MDE1LDIxODczLDE4Njk0LDM3MzA3LDM3ODkyLDE2NjQ3NSwxNjQ4MiwxNjY2NTIsMzc5MjcsMTY2OTQxLDE2Njk3MSwzNDAyMSwzNTM3MSwzODI5NywzODMxMSwzODI5NSwzODI5NCwxNjcyMjAsMjk3NjUsMTYwNjYsMTQ5NzU5LDE1MDA4MiwxNDg0NTgsMTYxMDMsMTQzOTA5LDM4NTQzLDE2NzY1NSwxNjc1MjYsMTY3NTI1LDE2MDc2LDE0OTk5NywxNTAxMzYsMTQ3NDM4LDI5NzE0LDI5ODAzLDE2MTI0LDM4NzIxLDE2ODExMiwyNjY5NSwxODk3MywxNjgwODMsMTUzNTY3LDM4NzQ5LDM3NzM2LDE2NjI4MSwxNjY5NTAsMTY2NzAzLDE1NjYwNiwzNzU2MiwyMzMxMywzNTY4OSwxODc0OCwyOTY4OSwxNDc5OTUsMzg4MTEsMzg3NjksMzkyMjQsMTM0OTUwLDI0MDAxLDE2Njg1MywxNTAxOTQsMzg5NDMsMTY5MTc4LDM3NjIyLDE2OTQzMSwzNzM0OSwxNzYwMCwxNjY3MzYsMTUwMTE5LDE2Njc1NiwzOTEzMiwxNjY0NjksMTYxMjgsMzc0MTgsMTg3MjUsMzM4MTIsMzkyMjcsMzkyNDUsMTYyNTY2LDE1ODY5LDM5MzIzLDE5MzExLDM5MzM4LDM5NTE2LDE2Njc1NywxNTM4MDAsMjcyNzksMzk0NTcsMjMyOTQsMzk0NzEsMTcwMjI1LDE5MzQ0LDE3MDMxMiwzOTM1NiwxOTM4OSwxOTM1MSwzNzc1NywyMjY0MiwxMzU5MzgsMjI1NjIsMTQ5OTQ0LDEzNjQyNCwzMDc4OCwxNDEwODcsMTQ2ODcyLDI2ODIxLDE1NzQxLDM3OTc2LDE0NjMxLDI0OTEyLDE0MTE4NSwxNDE2NzUsMjQ4MzksNDAwMTUsNDAwMTksNDAwNTksMzk5ODksMzk5NTIsMzk4MDcsMzk4ODcsMTcxNTY1LDM5ODM5LDE3MjUzMywxNzIyODYsNDAyMjUsMTk2MzAsMTQ3NzE2LDQwNDcyLDE5NjMyLDQwMjA0LDE3MjQ2OCwxNzIyNjksMTcyMjc1LDE3MDI4Nyw0MDM1NywzMzk4MSwxNTkyNTAsMTU5NzExLDE1ODU5NCwzNDMwMCwxNzcxNSwxNTkxNDAsMTU5MzY0LDE1OTIxNiwzMzgyNCwzNDI4NiwxNTkyMzIsMTQ1MzY3LDE1NTc0OCwzMTIwMiwxNDQ3OTYsMTQ0OTYwLDE4NzMzLDE0OTk4MiwxNTcxNCwzNzg1MSwzNzU2NiwzNzcwNCwxMzE3NzUsMzA5MDUsMzc0OTUsMzc5NjUsMjA0NTIsMTMzNzYsMzY5NjQsMTUyOTI1LDMwNzgxLDMwODA0LDMwOTAyLDMwNzk1LDEzNzA0NywxNDM4MTcsMTQ5ODI1LDEzOTc4LDIwMzM4LDI4NjM0LDI4NjMzLDI4NzAyLDI4NzAyLDIxNTI0LDE0Nzg5MywyMjQ1OSwyMjc3MSwyMjQxMCw0MDIxNCwyMjQ4NywyODk4MCwxMzQ4NywxNDc4ODQsMjkxNjMsMTU4Nzg0LDE1MTQ0NywyMzMzNiwxMzcxNDEsMTY2NDczLDI0ODQ0LDIzMjQ2LDIzMDUxLDE3MDg0LDE0ODYxNiwxNDEyNCwxOTMyMywxNjYzOTYsMzc4MTksMzc4MTYsMTM3NDMwLDEzNDk0MSwzMzkwNiwxNTg5MTIsMTM2MjExLDE0ODIxOCwxNDIzNzQsMTQ4NDE3LDIyOTMyLDE0Njg3MSwxNTc1MDUsMzIxNjgsMTU1OTk1LDE1NTgxMiwxNDk5NDUsMTQ5ODk5LDE2NjM5NCwzNzYwNSwyOTY2NiwxNjEwNSwyOTg3NiwxNjY3NTUsMTM3Mzc1LDE2MDk3LDE1MDE5NSwyNzM1MiwyOTY4MywyOTY5MSwxNjA4NiwxNTAwNzgsMTUwMTY0LDEzNzE3NywxNTAxMTgsMTMyMDA3LDEzNjIyOCwxNDk5ODksMjk3NjgsMTQ5NzgyLDI4ODM3LDE0OTg3OCwzNzUwOCwyOTY3MCwzNzcyNywxMzIzNTAsMzc2ODEsMTY2NjA2LDE2NjQyMiwzNzc2NiwxNjY4ODcsMTUzMDQ1LDE4NzQxLDE2NjUzMCwyOTAzNSwxNDk4MjcsMTM0Mzk5LDIyMTgwLDEzMjYzNCwxMzQxMjMsMTM0MzI4LDIxNzYyLDMxMTcyLDEzNzIxMCwzMjI1NCwxMzY4OTgsMTUwMDk2LDEzNzI5OCwxNzcxMCwzNzg4OSwxNDA5MCwxNjY1OTIsMTQ5OTMzLDIyOTYwLDEzNzQwNywxMzczNDcsMTYwOTAwLDIzMjAxLDE0MDUwLDE0Njc3OSwxNDAwMCwzNzQ3MSwyMzE2MSwxNjY1MjksMTM3MzE0LDM3NzQ4LDE1NTY1LDEzMzgxMiwxOTA5NCwxNDczMCwyMDcyNCwxNTcyMSwxNTY5MiwxMzYwOTIsMjkwNDUsMTcxNDcsMTY0Mzc2LDI4MTc1LDE2ODE2NCwxNzY0MywyNzk5MSwxNjM0MDcsMjg3NzUsMjc4MjMsMTU1NzQsMTQ3NDM3LDE0Njk4OSwyODE2MiwyODQyOCwxNTcyNywxMzIwODUsMzAwMzMsMTQwMTIsMTM1MTIsMTgwNDgsMTYwOTAsMTg1NDUsMjI5ODAsMzc0ODYsMTg3NTAsMzY2NzMsMTY2OTQwLDE1ODY1NiwyMjU0NiwyMjQ3MiwxNDAzOCwxMzYyNzQsMjg5MjYsMTQ4MzIyLDE1MDEyOSwxNDMzMzEsMTM1ODU2LDE0MDIyMSwyNjgwOSwyNjk4MywxMzYwODgsMTQ0NjEzLDE2MjgwNCwxNDUxMTksMTY2NTMxLDE0NTM2NiwxNDQzNzgsMTUwNjg3LDI3MTYyLDE0NTA2OSwxNTg5MDMsMzM4NTQsMTc2MzEsMTc2MTQsMTU5MDE0LDE1OTA1NywxNTg4NTAsMTU5NzEwLDI4NDM5LDE2MDAwOSwzMzU5NywxMzcwMTgsMzM3NzMsMTU4ODQ4LDE1OTgyNywxMzcxNzksMjI5MjEsMjMxNzAsMTM3MTM5LDIzMTM3LDIzMTUzLDEzNzQ3NywxNDc5NjQsMTQxMjUsMjMwMjMsMTM3MDIwLDE0MDIzLDI5MDcwLDM3Nzc2LDI2MjY2LDE0ODEzMywyMzE1MCwyMzA4MywxNDgxMTUsMjcxNzksMTQ3MTkzLDE2MTU5MCwxNDg1NzEsMTQ4MTcwLDI4OTU3LDE0ODA1NywxNjYzNjksMjA0MDAsMTU5MDE2LDIzNzQ2LDE0ODY4NiwxNjM0MDUsMTQ4NDEzLDI3MTQ4LDE0ODA1NCwxMzU5NDAsMjg4MzgsMjg5NzksMTQ4NDU3LDE1NzgxLDI3ODcxLDE5NDU5NywxNTAwOTUsMzIzNTcsMjMwMTksMjM4NTUsMTU4NTksMjQ0MTIsMTUwMTA5LDEzNzE4MywzMjE2NCwzMzgzMCwyMTYzNywxNDYxNzAsMTQ0MTI4LDEzMTYwNCwyMjM5OCwxMzMzMzMsMTMyNjMzLDE2MzU3LDEzOTE2NiwxNzI3MjYsMjg2NzUsMTY4MjgzLDIzOTIwLDI5NTgzLDMxOTU1LDE2NjQ4OSwxNjg5OTIsMjA0MjQsMzI3NDMsMjkzODksMjk0NTYsMTYyNTQ4LDI5NDk2LDI5NDk3LDE1MzMzNCwyOTUwNSwyOTUxMiwxNjA0MSwxNjI1ODQsMzY5NzIsMjkxNzMsMTQ5NzQ2LDI5NjY1LDMzMjcwLDE2MDc0LDMwNDc2LDE2MDgxLDI3ODEwLDIyMjY5LDI5NzIxLDI5NzI2LDI5NzI3LDE2MDk4LDE2MTEyLDE2MTE2LDE2MTIyLDI5OTA3LDE2MTQyLDE2MjExLDMwMDE4LDMwMDYxLDMwMDY2LDMwMDkzLDE2MjUyLDMwMTUyLDMwMTcyLDE2MzIwLDMwMjg1LDE2MzQzLDMwMzI0LDE2MzQ4LDMwMzMwLDE1MTM4OCwyOTA2NCwyMjA1MSwzNTIwMCwyMjYzMywxNjQxMywzMDUzMSwxNjQ0MSwyNjQ2NSwxNjQ1MywxMzc4NywzMDYxNiwxNjQ5MCwxNjQ5NSwyMzY0NiwzMDY1NCwzMDY2NywyMjc3MCwzMDc0NCwyODg1NywzMDc0OCwxNjU1MiwzMDc3NywzMDc5MSwzMDgwMSwzMDgyMiwzMzg2NCwxNTI4ODUsMzEwMjcsMjY2MjcsMzEwMjYsMTY2NDMsMTY2NDksMzExMjEsMzExMjksMzY3OTUsMzEyMzgsMzY3OTYsMTY3NDMsMzEzNzcsMTY4MTgsMzE0MjAsMzM0MDEsMTY4MzYsMzE0MzksMzE0NTEsMTY4NDcsMjAwMDEsMzE1ODYsMzE1OTYsMzE2MTEsMzE3NjIsMzE3NzEsMTY5OTIsMTcwMTgsMzE4NjcsMzE5MDAsMTcwMzYsMzE5MjgsMTcwNDQsMzE5ODEsMzY3NTUsMjg4NjQsMTM0MzUxLDMyMjA3LDMyMjEyLDMyMjA4LDMyMjUzLDMyNjg2LDMyNjkyLDI5MzQzLDE3MzAzLDMyODAwLDMyODA1LDMxNTQ1LDMyODE0LDMyODE3LDMyODUyLDE1ODIwLDIyNDUyLDI4ODMyLDMyOTUxLDMzMDAxLDE3Mzg5LDMzMDM2LDI5NDgyLDMzMDM4LDMzMDQyLDMwMDQ4LDMzMDQ0LDE3NDA5LDE1MTYxLDMzMTEwLDMzMTEzLDMzMTE0LDE3NDI3LDIyNTg2LDMzMTQ4LDMzMTU2LDE3NDQ1LDMzMTcxLDE3NDUzLDMzMTg5LDIyNTExLDMzMjE3LDMzMjUyLDMzMzY0LDE3NTUxLDMzNDQ2LDMzMzk4LDMzNDgyLDMzNDk2LDMzNTM1LDE3NTg0LDMzNjIzLDM4NTA1LDI3MDE4LDMzNzk3LDI4OTE3LDMzODkyLDI0ODAzLDMzOTI4LDE3NjY4LDMzOTgyLDM0MDE3LDM0MDQwLDM0MDY0LDM0MTA0LDM0MTMwLDE3NzIzLDM0MTU5LDM0MTYwLDM0MjcyLDE3NzgzLDM0NDE4LDM0NDUwLDM0NDgyLDM0NTQzLDM4NDY5LDM0Njk5LDE3OTI2LDE3OTQzLDM0OTkwLDM1MDcxLDM1MTA4LDM1MTQzLDM1MjE3LDE2MjE1MSwzNTM2OSwzNTM4NCwzNTQ3NiwzNTUwOCwzNTkyMSwzNjA1MiwzNjA4MiwzNjEyNCwxODMyOCwyMjYyMywzNjI5MSwxODQxMywyMDIwNiwzNjQxMCwyMTk3NiwyMjM1NiwzNjQ2NSwyMjAwNSwzNjUyOCwxODQ4NywzNjU1OCwzNjU3OCwzNjU4MCwzNjU4OSwzNjU5NCwzNjc5MSwzNjgwMSwzNjgxMCwzNjgxMiwzNjkxNSwzOTM2NCwxODYwNSwzOTEzNiwzNzM5NSwxODcxOCwzNzQxNiwzNzQ2NCwzNzQ4MywzNzU1MywzNzU1MCwzNzU2NywzNzYwMywzNzYxMSwzNzYxOSwzNzYyMCwzNzYyOSwzNzY5OSwzNzc2NCwzNzgwNSwxODc1NywxODc2OSw0MDYzOSwzNzkxMSwyMTI0OSwzNzkxNywzNzkzMywzNzk1MCwxODc5NCwzNzk3MiwzODAwOSwzODE4OSwzODMwNiwxODg1NSwzODM4OCwzODQ1MSwxODkxNywyNjUyOCwxODk4MCwzODcyMCwxODk5NywzODgzNCwzODg1MCwyMjEwMCwxOTE3MiwyNDgwOCwzOTA5NywxOTIyNSwzOTE1MywyMjU5NiwzOTE4MiwzOTE5MywyMDkxNiwzOTE5NiwzOTIyMywzOTIzNCwzOTI2MSwzOTI2NiwxOTMxMiwzOTM2NSwxOTM1NywzOTQ4NCwzOTY5NSwzMTM2MywzOTc4NSwzOTgwOSwzOTkwMSwzOTkyMSwzOTkyNCwxOTU2NSwzOTk2OCwxNDE5MSwxMzgxNzgsNDAyNjUsMzk5OTQsNDA3MDIsMjIwOTYsNDAzMzksNDAzODEsNDAzODQsNDA0NDQsMzgxMzQsMzY3OTAsNDA1NzEsNDA2MjAsNDA2MjUsNDA2MzcsNDA2NDYsMzgxMDgsNDA2NzQsNDA2ODksNDA2OTYsMzE0MzIsNDA3NzIsMTMxMjIwLDEzMTc2NywxMzIwMDAsMjY5MDYsMzgwODMsMjI5NTYsMTMyMzExLDIyNTkyLDM4MDgxLDE0MjY1LDEzMjU2NSwxMzI2MjksMTMyNzI2LDEzNjg5MCwyMjM1OSwyOTA0MywxMzM4MjYsMTMzODM3LDEzNDA3OSwyMTYxMCwxOTQ2MTksMTM0MDkxLDIxNjYyLDEzNDEzOSwxMzQyMDMsMTM0MjI3LDEzNDI0NSwxMzQyNjgsMjQ4MDcsMTM0Mjg1LDIyMTM4LDEzNDMyNSwxMzQzNjUsMTM0MzgxLDEzNDUxMSwxMzQ1NzgsMTM0NjAwLDI2OTY1LDM5OTgzLDM0NzI1LDEzNDY2MCwxMzQ2NzAsMTM0ODcxLDEzNTA1NiwxMzQ5NTcsMTM0NzcxLDIzNTg0LDEzNTEwMCwyNDA3NSwxMzUyNjAsMTM1MjQ3LDEzNTI4NiwyNjM5OCwxMzUyOTEsMTM1MzA0LDEzNTMxOCwxMzg5NSwxMzUzNTksMTM1Mzc5LDEzNTQ3MSwxMzU0ODMsMjEzNDgsMzM5NjUsMTM1OTA3LDEzNjA1MywxMzU5OTAsMzU3MTMsMTM2NTY3LDEzNjcyOSwxMzcxNTUsMTM3MTU5LDIwMDg4LDI4ODU5LDEzNzI2MSwxMzc1NzgsMTM3NzczLDEzNzc5NywxMzgyODIsMTM4MzUyLDEzODQxMiwxMzg5NTIsMjUyODMsMTM4OTY1LDEzOTAyOSwyOTA4MCwyNjcwOSwxMzkzMzMsMjcxMTMsMTQwMjQsMTM5OTAwLDE0MDI0NywxNDAyODIsMTQxMDk4LDE0MTQyNSwxNDE2NDcsMzM1MzMsMTQxNjcxLDE0MTcxNSwxNDIwMzcsMzUyMzcsMTQyMDU2LDM2NzY4LDE0MjA5NCwzODg0MCwxNDIxNDMsMzg5ODMsMzk2MTMsMTQyNDEyLG51bGwsMTQyNDcyLDE0MjUxOSwxNTQ2MDAsMTQyNjAwLDE0MjYxMCwxNDI3NzUsMTQyNzQxLDE0MjkxNCwxNDMyMjAsMTQzMzA4LDE0MzQxMSwxNDM0NjIsMTQ0MTU5LDE0NDM1MCwyNDQ5NywyNjE4NCwyNjMwMywxNjI0MjUsMTQ0NzQzLDE0NDg4MywyOTE4NSwxNDk5NDYsMzA2NzksMTQ0OTIyLDE0NTE3NCwzMjM5MSwxMzE5MTAsMjI3MDksMjYzODIsMjY5MDQsMTQ2MDg3LDE2MTM2NywxNTU2MTgsMTQ2OTYxLDE0NzEyOSwxNjEyNzgsMTM5NDE4LDE4NjQwLDE5MTI4LDE0NzczNywxNjY1NTQsMTQ4MjA2LDE0ODIzNywxNDc1MTUsMTQ4Mjc2LDE0ODM3NCwxNTAwODUsMTMyNTU0LDIwOTQ2LDEzMjYyNSwyMjk0MywxMzg5MjAsMTUyOTQsMTQ2Njg3LDE0ODQ4NCwxNDg2OTQsMjI0MDgsMTQ5MTA4LDE0NzQ3LDE0OTI5NSwxNjUzNTIsMTcwNDQxLDE0MTc4LDEzOTcxNSwzNTY3OCwxNjY3MzQsMzkzODIsMTQ5NTIyLDE0OTc1NSwxNTAwMzcsMjkxOTMsMTUwMjA4LDEzNDI2NCwyMjg4NSwxNTEyMDUsMTUxNDMwLDEzMjk4NSwzNjU3MCwxNTE1OTYsMjExMzUsMjIzMzUsMjkwNDEsMTUyMjE3LDE1MjYwMSwxNDcyNzQsMTUwMTgzLDIxOTQ4LDE1MjY0NiwxNTI2ODYsMTU4NTQ2LDM3MzMyLDEzNDI3LDE1Mjg5NSwxNjEzMzAsMTUyOTI2LDE4MjAwLDE1MjkzMCwxNTI5MzQsMTUzNTQzLDE0OTgyMywxNTM2OTMsMjA1ODIsMTM1NjMsMTQ0MzMyLDI0Nzk4LDE1Mzg1OSwxODMwMCwxNjYyMTYsMTU0Mjg2LDE1NDUwNSwxNTQ2MzAsMTM4NjQwLDIyNDMzLDI5MDA5LDI4NTk4LDE1NTkwNiwxNjI4MzQsMzY5NTAsMTU2MDgyLDE1MTQ1MCwzNTY4MiwxNTY2NzQsMTU2NzQ2LDIzODk5LDE1ODcxMSwzNjY2MiwxNTY4MDQsMTM3NTAwLDM1NTYyLDE1MDAwNiwxNTY4MDgsMTQ3NDM5LDE1Njk0NiwxOTM5MiwxNTcxMTksMTU3MzY1LDE0MTA4MywzNzk4OSwxNTM1NjksMjQ5ODEsMjMwNzksMTk0NzY1LDIwNDExLDIyMjAxLDE0ODc2OSwxNTc0MzYsMjAwNzQsMTQ5ODEyLDM4NDg2LDI4MDQ3LDE1ODkwOSwxMzg0OCwzNTE5MSwxNTc1OTMsMTU3ODA2LDE1NjY4OSwxNTc3OTAsMjkxNTEsMTU3ODk1LDMxNTU0LDE2ODEyOCwxMzM2NDksMTU3OTkwLDM3MTI0LDE1ODAwOSwzMTMwMSw0MDQzMiwxNTgyMDIsMzk0NjIsMTU4MjUzLDEzOTE5LDE1Njc3NywxMzExMDUsMzExMDcsMTU4MjYwLDE1ODU1NSwyMzg1MiwxNDQ2NjUsMzM3NDMsMTU4NjIxLDE4MTI4LDE1ODg4NCwzMDAxMSwzNDkxNywxNTkxNTAsMjI3MTAsMTQxMDgsMTQwNjg1LDE1OTgxOSwxNjAyMDUsMTU0NDQsMTYwMzg0LDE2MDM4OSwzNzUwNSwxMzk2NDIsMTYwMzk1LDM3NjgwLDE2MDQ4NiwxNDk5NjgsMjc3MDUsMzgwNDcsMTYwODQ4LDEzNDkwNCwzNDg1NSwzNTA2MSwxNDE2MDYsMTY0OTc5LDEzNzEzNywyODM0NCwxNTAwNTgsMTM3MjQ4LDE0NzU2LDE0MDA5LDIzNTY4LDMxMjAzLDE3NzI3LDI2Mjk0LDE3MTE4MSwxNzAxNDgsMzUxMzksMTYxNzQwLDE2MTg4MCwyMjIzMCwxNjYwNywxMzY3MTQsMTQ3NTMsMTQ1MTk5LDE2NDA3MiwxMzYxMzMsMjkxMDEsMzM2MzgsMTYyMjY5LDE2ODM2MCwyMzE0MywxOTYzOSwxNTk5MTksMTY2MzE1LDE2MjMwMSwxNjIzMTQsMTYyNTcxLDE2MzE3NCwxNDc4MzQsMzE1NTUsMzExMDIsMTYzODQ5LDI4NTk3LDE3Mjc2NywyNzEzOSwxNjQ2MzIsMjE0MTAsMTU5MjM5LDM3ODIzLDI2Njc4LDM4NzQ5LDE2NDIwNywxNjM4NzUsMTU4MTMzLDEzNjE3MywxNDM5MTksMTYzOTEyLDIzOTQxLDE2Njk2MCwxNjM5NzEsMjIyOTMsMzg5NDcsMTY2MjE3LDIzOTc5LDE0OTg5NiwyNjA0NiwyNzA5MywyMTQ1OCwxNTAxODEsMTQ3MzI5LDE1Mzc3LDI2NDIyLDE2Mzk4NCwxNjQwODQsMTY0MTQyLDEzOTE2OSwxNjQxNzUsMTY0MjMzLDE2NDI3MSwxNjQzNzgsMTY0NjE0LDE2NDY1NSwxNjQ3NDYsMTM3NzAsMTY0OTY4LDE2NTU0NiwxODY4MiwyNTU3NCwxNjYyMzAsMzA3MjgsMzc0NjEsMTY2MzI4LDE3Mzk0LDE2NjM3NSwxNzM3NSwxNjYzNzYsMTY2NzI2LDE2Njg2OCwyMzAzMiwxNjY5MjEsMzY2MTksMTY3ODc3LDE2ODE3MiwzMTU2OSwxNjgyMDgsMTY4MjUyLDE1ODYzLDE2ODI4NiwxNTAyMTgsMzY4MTYsMjkzMjcsMjIxNTUsMTY5MTkxLDE2OTQ0OSwxNjkzOTIsMTY5NDAwLDE2OTc3OCwxNzAxOTMsMTcwMzEzLDE3MDM0NiwxNzA0MzUsMTcwNTM2LDE3MDc2NiwxNzEzNTQsMTcxNDE5LDMyNDE1LDE3MTc2OCwxNzE4MTEsMTk2MjAsMzgyMTUsMTcyNjkxLDI5MDkwLDE3Mjc5OSwxOTg1NywzNjg4MiwxNzM1MTUsMTk4NjgsMTM0MzAwLDM2Nzk4LDIxOTUzLDM2Nzk0LDE0MDQ2NCwzNjc5MywxNTAxNjMsMTc2NzMsMzIzODMsMjg1MDIsMjczMTMsMjAyMDIsMTM1NDAsMTY2NzAwLDE2MTk0OSwxNDEzOCwzNjQ4MCwxMzcyMDUsMTYzODc2LDE2Njc2NCwxNjY4MDksMTYyMzY2LDE1NzM1OSwxNTg1MSwxNjEzNjUsMTQ2NjE1LDE1MzE0MSwxNTM5NDIsMjAxMjIsMTU1MjY1LDE1NjI0OCwyMjIwNywxMzQ3NjUsMzYzNjYsMjM0MDUsMTQ3MDgwLDE1MDY4NiwyNTU2NiwyNTI5NiwxMzcyMDYsMTM3MzM5LDI1OTA0LDIyMDYxLDE1NDY5OCwyMTUzMCwxNTIzMzcsMTU4MTQsMTcxNDE2LDE5NTgxLDIyMDUwLDIyMDQ2LDMyNTg1LDE1NTM1MiwyMjkwMSwxNDY3NTIsMzQ2NzIsMTk5OTYsMTM1MTQ2LDEzNDQ3MywxNDUwODIsMzMwNDcsNDAyODYsMzYxMjAsMzAyNjcsNDAwMDUsMzAyODYsMzA2NDksMzc3MDEsMjE1NTQsMzMwOTYsMzM1MjcsMjIwNTMsMzMwNzQsMzM4MTYsMzI5NTcsMjE5OTQsMzEwNzQsMjIwODMsMjE1MjYsMTM0ODEzLDEzNzc0LDIyMDIxLDIyMDAxLDI2MzUzLDE2NDU3OCwxMzg2OSwzMDAwNCwyMjAwMCwyMTk0NiwyMTY1NSwyMTg3NCwxMzQyMDksMTM0Mjk0LDI0MjcyLDE1MTg4MCwxMzQ3NzQsMTQyNDM0LDEzNDgxOCw0MDYxOSwzMjA5MCwyMTk4MiwxMzUyODUsMjUyNDUsMzg3NjUsMjE2NTIsMzYwNDUsMjkxNzQsMzcyMzgsMjU1OTYsMjU1MjksMjU1OTgsMjE4NjUsMTQyMTQ3LDQwMDUwLDE0MzAyNywyMDg5MCwxMzUzNSwxMzQ1NjcsMjA5MDMsMjE1ODEsMjE3OTAsMjE3NzksMzAzMTAsMzYzOTcsMTU3ODM0LDMwMTI5LDMyOTUwLDM0ODIwLDM0Njk0LDM1MDE1LDMzMjA2LDMzODIwLDEzNTM2MSwxNzY0NCwyOTQ0NCwxNDkyNTQsMjM0NDAsMzM1NDcsMTU3ODQzLDIyMTM5LDE0MTA0NCwxNjMxMTksMTQ3ODc1LDE2MzE4NywxNTk0NDAsMTYwNDM4LDM3MjMyLDEzNTY0MSwzNzM4NCwxNDY2ODQsMTczNzM3LDEzNDgyOCwxMzQ5MDUsMjkyODYsMTM4NDAyLDE4MjU0LDE1MTQ5MCwxNjM4MzMsMTM1MTQ3LDE2NjM0LDQwMDI5LDI1ODg3LDE0Mjc1MiwxODY3NSwxNDk0NzIsMTcxMzg4LDEzNTE0OCwxMzQ2NjYsMjQ2NzQsMTYxMTg3LDEzNTE0OSxudWxsLDE1NTcyMCwxMzU1NTksMjkwOTEsMzIzOTgsNDAyNzIsMTk5OTQsMTk5NzIsMTM2ODcsMjMzMDksMjc4MjYsMjEzNTEsMTM5OTYsMTQ4MTIsMjEzNzMsMTM5ODksMTQ5MDE2LDIyNjgyLDE1MDM4MiwzMzMyNSwyMTU3OSwyMjQ0MiwxNTQyNjEsMTMzNDk3LG51bGwsMTQ5MzAsMTQwMzg5LDI5NTU2LDE3MTY5MiwxOTcyMSwzOTkxNywxNDY2ODYsMTcxODI0LDE5NTQ3LDE1MTQ2NSwxNjkzNzQsMTcxOTk4LDMzODg0LDE0Njg3MCwxNjA0MzQsMTU3NjE5LDE0NTE4NCwyNTM5MCwzMjAzNywxNDcxOTEsMTQ2OTg4LDE0ODkwLDM2ODcyLDIxMTk2LDE1OTg4LDEzOTQ2LDE3ODk3LDEzMjIzOCwzMDI3MiwyMzI4MCwxMzQ4MzgsMzA4NDIsMTYzNjMwLDIyNjk1LDE2NTc1LDIyMTQwLDM5ODE5LDIzOTI0LDMwMjkyLDE3MzEwOCw0MDU4MSwxOTY4MSwzMDIwMSwxNDMzMSwyNDg1NywxNDM1NzgsMTQ4NDY2LG51bGwsMjIxMDksMTM1ODQ5LDIyNDM5LDE0OTg1OSwxNzE1MjYsMjEwNDQsMTU5OTE4LDEzNzQxLDI3NzIyLDQwMzE2LDMxODMwLDM5NzM3LDIyNDk0LDEzNzA2OCwyMzYzNSwyNTgxMSwxNjkxNjgsMTU2NDY5LDE2MDEwMCwzNDQ3NywxMzQ0NDAsMTU5MDEwLDE1MDI0MiwxMzQ1MTMsbnVsbCwyMDk5MCwxMzkwMjMsMjM5NTAsMzg2NTksMTM4NzA1LDQwNTc3LDM2OTQwLDMxNTE5LDM5NjgyLDIzNzYxLDMxNjUxLDI1MTkyLDI1Mzk3LDM5Njc5LDMxNjk1LDM5NzIyLDMxODcwLDM5NzI2LDMxODEwLDMxODc4LDM5OTU3LDMxNzQwLDM5Njg5LDQwNzI3LDM5OTYzLDE0OTgyMiw0MDc5NCwyMTg3NSwyMzQ5MSwyMDQ3Nyw0MDYwMCwyMDQ2NiwyMTA4OCwxNTg3OCwyMTIwMSwyMjM3NSwyMDU2NiwyMjk2NywyNDA4MiwzODg1Niw0MDM2MywzNjcwMCwyMTYwOSwzODgzNiwzOTIzMiwzODg0MiwyMTI5MiwyNDg4MCwyNjkyNCwyMTQ2NiwzOTk0Niw0MDE5NCwxOTUxNSwzODQ2NSwyNzAwOCwyMDY0NiwzMDAyMiwxMzcwNjksMzkzODYsMjExMDcsbnVsbCwzNzIwOSwzODUyOSwzNzIxMixudWxsLDM3MjAxLDE2NzU3NSwyNTQ3MSwxNTkwMTEsMjczMzgsMjIwMzMsMzcyNjIsMzAwNzQsMjUyMjEsMTMyMDkyLDI5NTE5LDMxODU2LDE1NDY1NywxNDY2ODUsbnVsbCwxNDk3ODUsMzA0MjIsMzk4MzcsMjAwMTAsMTM0MzU2LDMzNzI2LDM0ODgyLG51bGwsMjM2MjYsMjcwNzIsMjA3MTcsMjIzOTQsMjEwMjMsMjQwNTMsMjAxNzQsMjc2OTcsMTMxNTcwLDIwMjgxLDIxNjYwLDIxNzIyLDIxMTQ2LDM2MjI2LDEzODIyLDI0MzMyLDEzODExLG51bGwsMjc0NzQsMzcyNDQsNDA4NjksMzk4MzEsMzg5NTgsMzkwOTIsMzk2MTAsNDA2MTYsNDA1ODAsMjkwNTAsMzE1MDgsbnVsbCwyNzY0MiwzNDg0MCwzMjYzMixudWxsLDIyMDQ4LDE3MzY0MiwzNjQ3MSw0MDc4NyxudWxsLDM2MzA4LDM2NDMxLDQwNDc2LDM2MzUzLDI1MjE4LDE2NDczMywzNjM5MiwzNjQ2OSwzMTQ0MywxNTAxMzUsMzEyOTQsMzA5MzYsMjc4ODIsMzU0MzEsMzAyMTUsMTY2NDkwLDQwNzQyLDI3ODU0LDM0Nzc0LDMwMTQ3LDE3MjcyMiwzMDgwMywxOTQ2MjQsMzYxMDgsMjk0MTAsMjk1NTMsMzU2MjksMjk0NDIsMjk5MzcsMzYwNzUsMTUwMjAzLDM0MzUxLDI0NTA2LDM0OTc2LDE3NTkxLG51bGwsMTM3Mjc1LDE1OTIzNyxudWxsLDM1NDU0LDE0MDU3MSxudWxsLDI0ODI5LDMwMzExLDM5NjM5LDQwMjYwLDM3NzQyLDM5ODIzLDM0ODA1LG51bGwsMzQ4MzEsMzYwODcsMjk0ODQsMzg2ODksMzk4NTYsMTM3ODIsMjkzNjIsMTk0NjMsMzE4MjUsMzkyNDIsMTU1OTkzLDI0OTIxLDE5NDYwLDQwNTk4LDI0OTU3LG51bGwsMjIzNjcsMjQ5NDMsMjUyNTQsMjUxNDUsMjUyOTQsMTQ5NDAsMjUwNTgsMjE0MTgsMTQ0MzczLDI1NDQ0LDI2NjI2LDEzNzc4LDIzODk1LDE2Njg1MCwzNjgyNiwxNjc0ODEsbnVsbCwyMDY5NywxMzg1NjYsMzA5ODIsMjEyOTgsMzg0NTYsMTM0OTcxLDE2NDg1LG51bGwsMzA3MTgsbnVsbCwzMTkzOCwxNTU0MTgsMzE5NjIsMzEyNzcsMzI4NzAsMzI4NjcsMzIwNzcsMjk5NTcsMjk5MzgsMzUyMjAsMzMzMDYsMjYzODAsMzI4NjYsMTYwOTAyLDMyODU5LDI5OTM2LDMzMDI3LDMwNTAwLDM1MjA5LDE1NzY0NCwzMDAzNSwxNTk0NDEsMzQ3MjksMzQ3NjYsMzMyMjQsMzQ3MDAsMzU0MDEsMzYwMTMsMzU2NTEsMzA1MDcsMjk5NDQsMzQwMTAsMTM4NzcsMjcwNTgsMzYyNjIsbnVsbCwzNTI0MSwyOTgwMCwyODA4OSwzNDc1MywxNDc0NzMsMjk5MjcsMTU4MzUsMjkwNDYsMjQ3NDAsMjQ5ODgsMTU1NjksMjkwMjYsMjQ2OTUsbnVsbCwzMjYyNSwxNjY3MDEsMjkyNjQsMjQ4MDksMTkzMjYsMjEwMjQsMTUzODQsMTQ2NjMxLDE1NTM1MSwxNjEzNjYsMTUyODgxLDEzNzU0MCwxMzU5MzQsMTcwMjQzLDE1OTE5NiwxNTk5MTcsMjM3NDUsMTU2MDc3LDE2NjQxNSwxNDUwMTUsMTMxMzEwLDE1Nzc2NiwxNTEzMTAsMTc3NjIsMjMzMjcsMTU2NDkyLDQwNzg0LDQwNjE0LDE1NjI2NywxMjI4OCw2NTI5MiwxMjI4OSwxMjI5MCw2NTI5NCw4MjMxLDY1MzA3LDY1MzA2LDY1MzExLDY1MjgxLDY1MDcyLDgyMzAsODIyOSw2NTEwNCw2NTEwNSw2NTEwNiwxODMsNjUxMDgsNjUxMDksNjUxMTAsNjUxMTEsNjUzNzIsODIxMSw2NTA3Myw4MjEyLDY1MDc1LDk1ODgsNjUwNzYsNjUxMDMsNjUyODgsNjUyODksNjUwNzcsNjUwNzgsNjUzNzEsNjUzNzMsNjUwNzksNjUwODAsMTIzMDgsMTIzMDksNjUwODEsNjUwODIsMTIzMDQsMTIzMDUsNjUwODMsNjUwODQsMTIyOTgsMTIyOTksNjUwODUsNjUwODYsMTIyOTYsMTIyOTcsNjUwODcsNjUwODgsMTIzMDAsMTIzMDEsNjUwODksNjUwOTAsMTIzMDIsMTIzMDMsNjUwOTEsNjUwOTIsNjUxMTMsNjUxMTQsNjUxMTUsNjUxMTYsNjUxMTcsNjUxMTgsODIxNiw4MjE3LDgyMjAsODIyMSwxMjMxNywxMjMxOCw4MjQ1LDgyNDIsNjUyODMsNjUyODYsNjUyOTAsODI1MSwxNjcsMTIyOTEsOTY3NSw5Njc5LDk2NTEsOTY1MCw5Njc4LDk3MzQsOTczMyw5NjcxLDk2NzAsOTYzMyw5NjMyLDk2NjEsOTY2MCwxMjk2Myw4NDUzLDE3NSw2NTUwNyw2NTM0Myw3MTcsNjUwOTcsNjUwOTgsNjUxMDEsNjUxMDIsNjUwOTksNjUxMDAsNjUxMTksNjUxMjAsNjUxMjEsNjUyOTEsNjUyOTMsMjE1LDI0NywxNzcsODczMCw2NTMwOCw2NTMxMCw2NTMwOSw4ODA2LDg4MDcsODgwMCw4NzM0LDg3ODYsODgwMSw2NTEyMiw2NTEyMyw2NTEyNCw2NTEyNSw2NTEyNiw2NTM3NCw4NzQ1LDg3NDYsODg2OSw4NzM2LDg3MzUsODg5NSwxMzI2NiwxMzI2NSw4NzQ3LDg3NTAsODc1Nyw4NzU2LDk3OTIsOTc5NCw4ODUzLDg4NTcsODU5Myw4NTk1LDg1OTIsODU5NCw4NTk4LDg1OTksODYwMSw4NjAwLDg3NDEsODczOSw2NTI5NSw2NTM0MCw4NzI1LDY1MTI4LDY1Mjg0LDY1NTA5LDEyMzA2LDY1NTA0LDY1NTA1LDY1Mjg1LDY1MzEyLDg0NTEsODQ1Nyw2NTEyOSw2NTEzMCw2NTEzMSwxMzI2OSwxMzIxMiwxMzIxMywxMzIxNCwxMzI2MiwxMzIxNywxMzE5OCwxMzE5OSwxMzI1MiwxNzYsMjA4MjUsMjA4MjcsMjA4MzAsMjA4MjksMjA4MzMsMjA4MzUsMjE5OTEsMjk5MjksMzE5NTAsOTYwMSw5NjAyLDk2MDMsOTYwNCw5NjA1LDk2MDYsOTYwNyw5NjA4LDk2MTUsOTYxNCw5NjEzLDk2MTIsOTYxMSw5NjEwLDk2MDksOTUzMiw5NTI0LDk1MTYsOTUwOCw5NTAwLDk2MjAsOTQ3Miw5NDc0LDk2MjEsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTgxLDk1ODIsOTU4NCw5NTgzLDk1NTIsOTU2Niw5NTc4LDk1NjksOTY5OCw5Njk5LDk3MDEsOTcwMCw5NTg1LDk1ODYsOTU4Nyw2NTI5Niw2NTI5Nyw2NTI5OCw2NTI5OSw2NTMwMCw2NTMwMSw2NTMwMiw2NTMwMyw2NTMwNCw2NTMwNSw4NTQ0LDg1NDUsODU0Niw4NTQ3LDg1NDgsODU0OSw4NTUwLDg1NTEsODU1Miw4NTUzLDEyMzIxLDEyMzIyLDEyMzIzLDEyMzI0LDEyMzI1LDEyMzI2LDEyMzI3LDEyMzI4LDEyMzI5LDIxMzEzLDIxMzE2LDIxMzE3LDY1MzEzLDY1MzE0LDY1MzE1LDY1MzE2LDY1MzE3LDY1MzE4LDY1MzE5LDY1MzIwLDY1MzIxLDY1MzIyLDY1MzIzLDY1MzI0LDY1MzI1LDY1MzI2LDY1MzI3LDY1MzI4LDY1MzI5LDY1MzMwLDY1MzMxLDY1MzMyLDY1MzMzLDY1MzM0LDY1MzM1LDY1MzM2LDY1MzM3LDY1MzM4LDY1MzQ1LDY1MzQ2LDY1MzQ3LDY1MzQ4LDY1MzQ5LDY1MzUwLDY1MzUxLDY1MzUyLDY1MzUzLDY1MzU0LDY1MzU1LDY1MzU2LDY1MzU3LDY1MzU4LDY1MzU5LDY1MzYwLDY1MzYxLDY1MzYyLDY1MzYzLDY1MzY0LDY1MzY1LDY1MzY2LDY1MzY3LDY1MzY4LDY1MzY5LDY1MzcwLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksOTMxLDkzMiw5MzMsOTM0LDkzNSw5MzYsOTM3LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDEyNTQ5LDEyNTUwLDEyNTUxLDEyNTUyLDEyNTUzLDEyNTU0LDEyNTU1LDEyNTU2LDEyNTU3LDEyNTU4LDEyNTU5LDEyNTYwLDEyNTYxLDEyNTYyLDEyNTYzLDEyNTY0LDEyNTY1LDEyNTY2LDEyNTY3LDEyNTY4LDEyNTY5LDEyNTcwLDEyNTcxLDEyNTcyLDEyNTczLDEyNTc0LDEyNTc1LDEyNTc2LDEyNTc3LDEyNTc4LDEyNTc5LDEyNTgwLDEyNTgxLDEyNTgyLDEyNTgzLDEyNTg0LDEyNTg1LDcyOSw3MTMsNzE0LDcxMSw3MTUsOTIxNiw5MjE3LDkyMTgsOTIxOSw5MjIwLDkyMjEsOTIyMiw5MjIzLDkyMjQsOTIyNSw5MjI2LDkyMjcsOTIyOCw5MjI5LDkyMzAsOTIzMSw5MjMyLDkyMzMsOTIzNCw5MjM1LDkyMzYsOTIzNyw5MjM4LDkyMzksOTI0MCw5MjQxLDkyNDIsOTI0Myw5MjQ0LDkyNDUsOTI0Niw5MjQ3LDkyNDksODM2NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTk5NjgsMjAwNTcsMTk5NjksMTk5NzEsMjAwMzUsMjAwNjEsMjAxMDIsMjAxMDgsMjAxNTQsMjA3OTksMjA4MzcsMjA4NDMsMjA5NjAsMjA5OTIsMjA5OTMsMjExNDcsMjEyNjksMjEzMTMsMjEzNDAsMjE0NDgsMTk5NzcsMTk5NzksMTk5NzYsMTk5NzgsMjAwMTEsMjAwMjQsMjA5NjEsMjAwMzcsMjAwNDAsMjAwNjMsMjAwNjIsMjAxMTAsMjAxMjksMjA4MDAsMjA5OTUsMjEyNDIsMjEzMTUsMjE0NDksMjE0NzUsMjIzMDMsMjI3NjMsMjI4MDUsMjI4MjMsMjI4OTksMjMzNzYsMjMzNzcsMjMzNzksMjM1NDQsMjM1NjcsMjM1ODYsMjM2MDgsMjM2NjUsMjQwMjksMjQwMzcsMjQwNDksMjQwNTAsMjQwNTEsMjQwNjIsMjQxNzgsMjQzMTgsMjQzMzEsMjQzMzksMjUxNjUsMTk5ODUsMTk5ODQsMTk5ODEsMjAwMTMsMjAwMTYsMjAwMjUsMjAwNDMsMjM2MDksMjAxMDQsMjAxMTMsMjAxMTcsMjAxMTQsMjAxMTYsMjAxMzAsMjAxNjEsMjAxNjAsMjAxNjMsMjAxNjYsMjAxNjcsMjAxNzMsMjAxNzAsMjAxNzEsMjAxNjQsMjA4MDMsMjA4MDEsMjA4MzksMjA4NDUsMjA4NDYsMjA4NDQsMjA4ODcsMjA5ODIsMjA5OTgsMjA5OTksMjEwMDAsMjEyNDMsMjEyNDYsMjEyNDcsMjEyNzAsMjEzMDUsMjEzMjAsMjEzMTksMjEzMTcsMjEzNDIsMjEzODAsMjE0NTEsMjE0NTAsMjE0NTMsMjI3NjQsMjI4MjUsMjI4MjcsMjI4MjYsMjI4MjksMjMzODAsMjM1NjksMjM1ODgsMjM2MTAsMjM2NjMsMjQwNTIsMjQxODcsMjQzMTksMjQzNDAsMjQzNDEsMjQ1MTUsMjUwOTYsMjUxNDIsMjUxNjMsMjUxNjYsMjU5MDMsMjU5OTEsMjYwMDcsMjYwMjAsMjYwNDEsMjYwODUsMjYzNTIsMjYzNzYsMjY0MDgsMjc0MjQsMjc0OTAsMjc1MTMsMjc1OTUsMjc2MDQsMjc2MTEsMjc2NjMsMjc3MDAsMjg3NzksMjkyMjYsMjkyMzgsMjkyNDMsMjkyNTUsMjkyNzMsMjkyNzUsMjkzNTYsMjk1NzksMTk5OTMsMTk5OTAsMTk5ODksMTk5ODgsMTk5OTIsMjAwMjcsMjAwNDUsMjAwNDcsMjAwNDYsMjAxOTcsMjAxODQsMjAxODAsMjAxODEsMjAxODIsMjAxODMsMjAxOTUsMjAxOTYsMjAxODUsMjAxOTAsMjA4MDUsMjA4MDQsMjA4NzMsMjA4NzQsMjA5MDgsMjA5ODUsMjA5ODYsMjA5ODQsMjEwMDIsMjExNTIsMjExNTEsMjEyNTMsMjEyNTQsMjEyNzEsMjEyNzcsMjAxOTEsMjEzMjIsMjEzMjEsMjEzNDUsMjEzNDQsMjEzNTksMjEzNTgsMjE0MzUsMjE0ODcsMjE0NzYsMjE0OTEsMjE0ODQsMjE0ODYsMjE0ODEsMjE0ODAsMjE1MDAsMjE0OTYsMjE0OTMsMjE0ODMsMjE0NzgsMjE0ODIsMjE0OTAsMjE0ODksMjE0ODgsMjE0NzcsMjE0ODUsMjE0OTksMjIyMzUsMjIyMzQsMjI4MDYsMjI4MzAsMjI4MzMsMjI5MDAsMjI5MDIsMjMzODEsMjM0MjcsMjM2MTIsMjQwNDAsMjQwMzksMjQwMzgsMjQwNjYsMjQwNjcsMjQxNzksMjQxODgsMjQzMjEsMjQzNDQsMjQzNDMsMjQ1MTcsMjUwOTgsMjUxNzEsMjUxNzIsMjUxNzAsMjUxNjksMjYwMjEsMjYwODYsMjY0MTQsMjY0MTIsMjY0MTAsMjY0MTEsMjY0MTMsMjc0OTEsMjc1OTcsMjc2NjUsMjc2NjQsMjc3MDQsMjc3MTMsMjc3MTIsMjc3MTAsMjkzNTksMjk1NzIsMjk1NzcsMjk5MTYsMjk5MjYsMjk5NzYsMjk5ODMsMjk5OTIsMjk5OTMsMzAwMDAsMzAwMDEsMzAwMDIsMzAwMDMsMzAwOTEsMzAzMzMsMzAzODIsMzAzOTksMzA0NDYsMzA2ODMsMzA2OTAsMzA3MDcsMzEwMzQsMzExNjYsMzEzNDgsMzE0MzUsMTk5OTgsMTk5OTksMjAwNTAsMjAwNTEsMjAwNzMsMjAxMjEsMjAxMzIsMjAxMzQsMjAxMzMsMjAyMjMsMjAyMzMsMjAyNDksMjAyMzQsMjAyNDUsMjAyMzcsMjAyNDAsMjAyNDEsMjAyMzksMjAyMTAsMjAyMTQsMjAyMTksMjAyMDgsMjAyMTEsMjAyMjEsMjAyMjUsMjAyMzUsMjA4MDksMjA4MDcsMjA4MDYsMjA4MDgsMjA4NDAsMjA4NDksMjA4NzcsMjA5MTIsMjEwMTUsMjEwMDksMjEwMTAsMjEwMDYsMjEwMTQsMjExNTUsMjEyNTYsMjEyODEsMjEyODAsMjEzNjAsMjEzNjEsMjE1MTMsMjE1MTksMjE1MTYsMjE1MTQsMjE1MjAsMjE1MDUsMjE1MTUsMjE1MDgsMjE1MjEsMjE1MTcsMjE1MTIsMjE1MDcsMjE1MTgsMjE1MTAsMjE1MjIsMjIyNDAsMjIyMzgsMjIyMzcsMjIzMjMsMjIzMjAsMjIzMTIsMjIzMTcsMjIzMTYsMjIzMTksMjIzMTMsMjI4MDksMjI4MTAsMjI4MzksMjI4NDAsMjI5MTYsMjI5MDQsMjI5MTUsMjI5MDksMjI5MDUsMjI5MTQsMjI5MTMsMjMzODMsMjMzODQsMjM0MzEsMjM0MzIsMjM0MjksMjM0MzMsMjM1NDYsMjM1NzQsMjM2NzMsMjQwMzAsMjQwNzAsMjQxODIsMjQxODAsMjQzMzUsMjQzNDcsMjQ1MzcsMjQ1MzQsMjUxMDIsMjUxMDAsMjUxMDEsMjUxMDQsMjUxODcsMjUxNzksMjUxNzYsMjU5MTAsMjYwODksMjYwODgsMjYwOTIsMjYwOTMsMjYzNTQsMjYzNTUsMjYzNzcsMjY0MjksMjY0MjAsMjY0MTcsMjY0MjEsMjc0MjUsMjc0OTIsMjc1MTUsMjc2NzAsMjc3NDEsMjc3MzUsMjc3MzcsMjc3NDMsMjc3NDQsMjc3MjgsMjc3MzMsMjc3NDUsMjc3MzksMjc3MjUsMjc3MjYsMjg3ODQsMjkyNzksMjkyNzcsMzAzMzQsMzE0ODEsMzE4NTksMzE5OTIsMzI1NjYsMzI2NTAsMzI3MDEsMzI3NjksMzI3NzEsMzI3ODAsMzI3ODYsMzI4MTksMzI4OTUsMzI5MDUsMzI5MDcsMzI5MDgsMzMyNTEsMzMyNTgsMzMyNjcsMzMyNzYsMzMyOTIsMzMzMDcsMzMzMTEsMzMzOTAsMzMzOTQsMzM0MDYsMzQ0MTEsMzQ4ODAsMzQ4OTIsMzQ5MTUsMzUxOTksMzg0MzMsMjAwMTgsMjAxMzYsMjAzMDEsMjAzMDMsMjAyOTUsMjAzMTEsMjAzMTgsMjAyNzYsMjAzMTUsMjAzMDksMjAyNzIsMjAzMDQsMjAzMDUsMjAyODUsMjAyODIsMjAyODAsMjAyOTEsMjAzMDgsMjAyODQsMjAyOTQsMjAzMjMsMjAzMTYsMjAzMjAsMjAyNzEsMjAzMDIsMjAyNzgsMjAzMTMsMjAzMTcsMjAyOTYsMjAzMTQsMjA4MTIsMjA4MTEsMjA4MTMsMjA4NTMsMjA5MTgsMjA5MTksMjEwMjksMjEwMjgsMjEwMzMsMjEwMzQsMjEwMzIsMjExNjMsMjExNjEsMjExNjIsMjExNjQsMjEyODMsMjEzNjMsMjEzNjUsMjE1MzMsMjE1NDksMjE1MzQsMjE1NjYsMjE1NDIsMjE1ODIsMjE1NDMsMjE1NzQsMjE1NzEsMjE1NTUsMjE1NzYsMjE1NzAsMjE1MzEsMjE1NDUsMjE1NzgsMjE1NjEsMjE1NjMsMjE1NjAsMjE1NTAsMjE1NTcsMjE1NTgsMjE1MzYsMjE1NjQsMjE1NjgsMjE1NTMsMjE1NDcsMjE1MzUsMjE1NDgsMjIyNTAsMjIyNTYsMjIyNDQsMjIyNTEsMjIzNDYsMjIzNTMsMjIzMzYsMjIzNDksMjIzNDMsMjIzNTAsMjIzMzQsMjIzNTIsMjIzNTEsMjIzMzEsMjI3NjcsMjI4NDYsMjI5NDEsMjI5MzAsMjI5NTIsMjI5NDIsMjI5NDcsMjI5MzcsMjI5MzQsMjI5MjUsMjI5NDgsMjI5MzEsMjI5MjIsMjI5NDksMjMzODksMjMzODgsMjMzODYsMjMzODcsMjM0MzYsMjM0MzUsMjM0MzksMjM1OTYsMjM2MTYsMjM2MTcsMjM2MTUsMjM2MTQsMjM2OTYsMjM2OTcsMjM3MDAsMjM2OTIsMjQwNDMsMjQwNzYsMjQyMDcsMjQxOTksMjQyMDIsMjQzMTEsMjQzMjQsMjQzNTEsMjQ0MjAsMjQ0MTgsMjQ0MzksMjQ0NDEsMjQ1MzYsMjQ1MjQsMjQ1MzUsMjQ1MjUsMjQ1NjEsMjQ1NTUsMjQ1NjgsMjQ1NTQsMjUxMDYsMjUxMDUsMjUyMjAsMjUyMzksMjUyMzgsMjUyMTYsMjUyMDYsMjUyMjUsMjUxOTcsMjUyMjYsMjUyMTIsMjUyMTQsMjUyMDksMjUyMDMsMjUyMzQsMjUxOTksMjUyNDAsMjUxOTgsMjUyMzcsMjUyMzUsMjUyMzMsMjUyMjIsMjU5MTMsMjU5MTUsMjU5MTIsMjYwOTcsMjYzNTYsMjY0NjMsMjY0NDYsMjY0NDcsMjY0NDgsMjY0NDksMjY0NjAsMjY0NTQsMjY0NjIsMjY0NDEsMjY0MzgsMjY0NjQsMjY0NTEsMjY0NTUsMjc0OTMsMjc1OTksMjc3MTQsMjc3NDIsMjc4MDEsMjc3NzcsMjc3ODQsMjc3ODUsMjc3ODEsMjc4MDMsMjc3NTQsMjc3NzAsMjc3OTIsMjc3NjAsMjc3ODgsMjc3NTIsMjc3OTgsMjc3OTQsMjc3NzMsMjc3NzksMjc3NjIsMjc3NzQsMjc3NjQsMjc3ODIsMjc3NjYsMjc3ODksMjc3OTYsMjc4MDAsMjc3NzgsMjg3OTAsMjg3OTYsMjg3OTcsMjg3OTIsMjkyODIsMjkyODEsMjkyODAsMjkzODAsMjkzNzgsMjk1OTAsMjk5OTYsMjk5OTUsMzAwMDcsMzAwMDgsMzAzMzgsMzA0NDcsMzA2OTEsMzExNjksMzExNjgsMzExNjcsMzEzNTAsMzE5OTUsMzI1OTcsMzI5MTgsMzI5MTUsMzI5MjUsMzI5MjAsMzI5MjMsMzI5MjIsMzI5NDYsMzMzOTEsMzM0MjYsMzM0MTksMzM0MjEsMzUyMTEsMzUyODIsMzUzMjgsMzU4OTUsMzU5MTAsMzU5MjUsMzU5OTcsMzYxOTYsMzYyMDgsMzYyNzUsMzY1MjMsMzY1NTQsMzY3NjMsMzY3ODQsMzY4MDIsMzY4MDYsMzY4MDUsMzY4MDQsMjQwMzMsMzcwMDksMzcwMjYsMzcwMzQsMzcwMzAsMzcwMjcsMzcxOTMsMzczMTgsMzczMjQsMzg0NTAsMzg0NDYsMzg0NDksMzg0NDIsMzg0NDQsMjAwMDYsMjAwNTQsMjAwODMsMjAxMDcsMjAxMjMsMjAxMjYsMjAxMzksMjAxNDAsMjAzMzUsMjAzODEsMjAzNjUsMjAzMzksMjAzNTEsMjAzMzIsMjAzNzksMjAzNjMsMjAzNTgsMjAzNTUsMjAzMzYsMjAzNDEsMjAzNjAsMjAzMjksMjAzNDcsMjAzNzQsMjAzNTAsMjAzNjcsMjAzNjksMjAzNDYsMjA4MjAsMjA4MTgsMjA4MjEsMjA4NDEsMjA4NTUsMjA4NTQsMjA4NTYsMjA5MjUsMjA5ODksMjEwNTEsMjEwNDgsMjEwNDcsMjEwNTAsMjEwNDAsMjEwMzgsMjEwNDYsMjEwNTcsMjExODIsMjExNzksMjEzMzAsMjEzMzIsMjEzMzEsMjEzMjksMjEzNTAsMjEzNjcsMjEzNjgsMjEzNjksMjE0NjIsMjE0NjAsMjE0NjMsMjE2MTksMjE2MjEsMjE2NTQsMjE2MjQsMjE2NTMsMjE2MzIsMjE2MjcsMjE2MjMsMjE2MzYsMjE2NTAsMjE2MzgsMjE2MjgsMjE2NDgsMjE2MTcsMjE2MjIsMjE2NDQsMjE2NTgsMjE2MDIsMjE2MDgsMjE2NDMsMjE2MjksMjE2NDYsMjIyNjYsMjI0MDMsMjIzOTEsMjIzNzgsMjIzNzcsMjIzNjksMjIzNzQsMjIzNzIsMjIzOTYsMjI4MTIsMjI4NTcsMjI4NTUsMjI4NTYsMjI4NTIsMjI4NjgsMjI5NzQsMjI5NzEsMjI5OTYsMjI5NjksMjI5NTgsMjI5OTMsMjI5ODIsMjI5OTIsMjI5ODksMjI5ODcsMjI5OTUsMjI5ODYsMjI5NTksMjI5NjMsMjI5OTQsMjI5ODEsMjMzOTEsMjMzOTYsMjMzOTUsMjM0NDcsMjM0NTAsMjM0NDgsMjM0NTIsMjM0NDksMjM0NTEsMjM1NzgsMjM2MjQsMjM2MjEsMjM2MjIsMjM3MzUsMjM3MTMsMjM3MzYsMjM3MjEsMjM3MjMsMjM3MjksMjM3MzEsMjQwODgsMjQwOTAsMjQwODYsMjQwODUsMjQwOTEsMjQwODEsMjQxODQsMjQyMTgsMjQyMTUsMjQyMjAsMjQyMTMsMjQyMTQsMjQzMTAsMjQzNTgsMjQzNTksMjQzNjEsMjQ0NDgsMjQ0NDksMjQ0NDcsMjQ0NDQsMjQ1NDEsMjQ1NDQsMjQ1NzMsMjQ1NjUsMjQ1NzUsMjQ1OTEsMjQ1OTYsMjQ2MjMsMjQ2MjksMjQ1OTgsMjQ2MTgsMjQ1OTcsMjQ2MDksMjQ2MTUsMjQ2MTcsMjQ2MTksMjQ2MDMsMjUxMTAsMjUxMDksMjUxNTEsMjUxNTAsMjUxNTIsMjUyMTUsMjUyODksMjUyOTIsMjUyODQsMjUyNzksMjUyODIsMjUyNzMsMjUyOTgsMjUzMDcsMjUyNTksMjUyOTksMjUzMDAsMjUyOTEsMjUyODgsMjUyNTYsMjUyNzcsMjUyNzYsMjUyOTYsMjUzMDUsMjUyODcsMjUyOTMsMjUyNjksMjUzMDYsMjUyNjUsMjUzMDQsMjUzMDIsMjUzMDMsMjUyODYsMjUyNjAsMjUyOTQsMjU5MTgsMjYwMjMsMjYwNDQsMjYxMDYsMjYxMzIsMjYxMzEsMjYxMjQsMjYxMTgsMjYxMTQsMjYxMjYsMjYxMTIsMjYxMjcsMjYxMzMsMjYxMjIsMjYxMTksMjYzODEsMjYzNzksMjY0NzcsMjY1MDcsMjY1MTcsMjY0ODEsMjY1MjQsMjY0ODMsMjY0ODcsMjY1MDMsMjY1MjUsMjY1MTksMjY0NzksMjY0ODAsMjY0OTUsMjY1MDUsMjY0OTQsMjY1MTIsMjY0ODUsMjY1MjIsMjY1MTUsMjY0OTIsMjY0NzQsMjY0ODIsMjc0MjcsMjc0OTQsMjc0OTUsMjc1MTksMjc2NjcsMjc2NzUsMjc4NzUsMjc4ODAsMjc4OTEsMjc4MjUsMjc4NTIsMjc4NzcsMjc4MjcsMjc4MzcsMjc4MzgsMjc4MzYsMjc4NzQsMjc4MTksMjc4NjEsMjc4NTksMjc4MzIsMjc4NDQsMjc4MzMsMjc4NDEsMjc4MjIsMjc4NjMsMjc4NDUsMjc4ODksMjc4MzksMjc4MzUsMjc4NzMsMjc4NjcsMjc4NTAsMjc4MjAsMjc4ODcsMjc4NjgsMjc4NjIsMjc4NzIsMjg4MjEsMjg4MTQsMjg4MTgsMjg4MTAsMjg4MjUsMjkyMjgsMjkyMjksMjkyNDAsMjkyNTYsMjkyODcsMjkyODksMjkzNzYsMjkzOTAsMjk0MDEsMjkzOTksMjkzOTIsMjk2MDksMjk2MDgsMjk1OTksMjk2MTEsMjk2MDUsMzAwMTMsMzAxMDksMzAxMDUsMzAxMDYsMzAzNDAsMzA0MDIsMzA0NTAsMzA0NTIsMzA2OTMsMzA3MTcsMzEwMzgsMzEwNDAsMzEwNDEsMzExNzcsMzExNzYsMzEzNTQsMzEzNTMsMzE0ODIsMzE5OTgsMzI1OTYsMzI2NTIsMzI2NTEsMzI3NzMsMzI5NTQsMzI5MzMsMzI5MzAsMzI5NDUsMzI5MjksMzI5MzksMzI5MzcsMzI5NDgsMzI5MzgsMzI5NDMsMzMyNTMsMzMyNzgsMzMyOTMsMzM0NTksMzM0MzcsMzM0MzMsMzM0NTMsMzM0NjksMzM0MzksMzM0NjUsMzM0NTcsMzM0NTIsMzM0NDUsMzM0NTUsMzM0NjQsMzM0NDMsMzM0NTYsMzM0NzAsMzM0NjMsMzQzODIsMzQ0MTcsMjEwMjEsMzQ5MjAsMzY1NTUsMzY4MTQsMzY4MjAsMzY4MTcsMzcwNDUsMzcwNDgsMzcwNDEsMzcwNDYsMzczMTksMzczMjksMzgyNjMsMzgyNzIsMzg0MjgsMzg0NjQsMzg0NjMsMzg0NTksMzg0NjgsMzg0NjYsMzg1ODUsMzg2MzIsMzg3MzgsMzg3NTAsMjAxMjcsMjAxNDEsMjAxNDIsMjA0NDksMjA0MDUsMjAzOTksMjA0MTUsMjA0NDgsMjA0MzMsMjA0MzEsMjA0NDUsMjA0MTksMjA0MDYsMjA0NDAsMjA0NDcsMjA0MjYsMjA0MzksMjAzOTgsMjA0MzIsMjA0MjAsMjA0MTgsMjA0NDIsMjA0MzAsMjA0NDYsMjA0MDcsMjA4MjMsMjA4ODIsMjA4ODEsMjA4OTYsMjEwNzAsMjEwNTksMjEwNjYsMjEwNjksMjEwNjgsMjEwNjcsMjEwNjMsMjExOTEsMjExOTMsMjExODcsMjExODUsMjEyNjEsMjEzMzUsMjEzNzEsMjE0MDIsMjE0NjcsMjE2NzYsMjE2OTYsMjE2NzIsMjE3MTAsMjE3MDUsMjE2ODgsMjE2NzAsMjE2ODMsMjE3MDMsMjE2OTgsMjE2OTMsMjE2NzQsMjE2OTcsMjE3MDAsMjE3MDQsMjE2NzksMjE2NzUsMjE2ODEsMjE2OTEsMjE2NzMsMjE2NzEsMjE2OTUsMjIyNzEsMjI0MDIsMjI0MTEsMjI0MzIsMjI0MzUsMjI0MzQsMjI0NzgsMjI0NDYsMjI0MTksMjI4NjksMjI4NjUsMjI4NjMsMjI4NjIsMjI4NjQsMjMwMDQsMjMwMDAsMjMwMzksMjMwMTEsMjMwMTYsMjMwNDMsMjMwMTMsMjMwMTgsMjMwMDIsMjMwMTQsMjMwNDEsMjMwMzUsMjM0MDEsMjM0NTksMjM0NjIsMjM0NjAsMjM0NTgsMjM0NjEsMjM1NTMsMjM2MzAsMjM2MzEsMjM2MjksMjM2MjcsMjM3NjksMjM3NjIsMjQwNTUsMjQwOTMsMjQxMDEsMjQwOTUsMjQxODksMjQyMjQsMjQyMzAsMjQzMTQsMjQzMjgsMjQzNjUsMjQ0MjEsMjQ0NTYsMjQ0NTMsMjQ0NTgsMjQ0NTksMjQ0NTUsMjQ0NjAsMjQ0NTcsMjQ1OTQsMjQ2MDUsMjQ2MDgsMjQ2MTMsMjQ1OTAsMjQ2MTYsMjQ2NTMsMjQ2ODgsMjQ2ODAsMjQ2NzQsMjQ2NDYsMjQ2NDMsMjQ2ODQsMjQ2ODMsMjQ2ODIsMjQ2NzYsMjUxNTMsMjUzMDgsMjUzNjYsMjUzNTMsMjUzNDAsMjUzMjUsMjUzNDUsMjUzMjYsMjUzNDEsMjUzNTEsMjUzMjksMjUzMzUsMjUzMjcsMjUzMjQsMjUzNDIsMjUzMzIsMjUzNjEsMjUzNDYsMjU5MTksMjU5MjUsMjYwMjcsMjYwNDUsMjYwODIsMjYxNDksMjYxNTcsMjYxNDQsMjYxNTEsMjYxNTksMjYxNDMsMjYxNTIsMjYxNjEsMjYxNDgsMjYzNTksMjY2MjMsMjY1NzksMjY2MDksMjY1ODAsMjY1NzYsMjY2MDQsMjY1NTAsMjY1NDMsMjY2MTMsMjY2MDEsMjY2MDcsMjY1NjQsMjY1NzcsMjY1NDgsMjY1ODYsMjY1OTcsMjY1NTIsMjY1NzUsMjY1OTAsMjY2MTEsMjY1NDQsMjY1ODUsMjY1OTQsMjY1ODksMjY1NzgsMjc0OTgsMjc1MjMsMjc1MjYsMjc1NzMsMjc2MDIsMjc2MDcsMjc2NzksMjc4NDksMjc5MTUsMjc5NTQsMjc5NDYsMjc5NjksMjc5NDEsMjc5MTYsMjc5NTMsMjc5MzQsMjc5MjcsMjc5NjMsMjc5NjUsMjc5NjYsMjc5NTgsMjc5MzEsMjc4OTMsMjc5NjEsMjc5NDMsMjc5NjAsMjc5NDUsMjc5NTAsMjc5NTcsMjc5MTgsMjc5NDcsMjg4NDMsMjg4NTgsMjg4NTEsMjg4NDQsMjg4NDcsMjg4NDUsMjg4NTYsMjg4NDYsMjg4MzYsMjkyMzIsMjkyOTgsMjkyOTUsMjkzMDAsMjk0MTcsMjk0MDgsMjk0MDksMjk2MjMsMjk2NDIsMjk2MjcsMjk2MTgsMjk2NDUsMjk2MzIsMjk2MTksMjk5NzgsMjk5OTcsMzAwMzEsMzAwMjgsMzAwMzAsMzAwMjcsMzAxMjMsMzAxMTYsMzAxMTcsMzAxMTQsMzAxMTUsMzAzMjgsMzAzNDIsMzAzNDMsMzAzNDQsMzA0MDgsMzA0MDYsMzA0MDMsMzA0MDUsMzA0NjUsMzA0NTcsMzA0NTYsMzA0NzMsMzA0NzUsMzA0NjIsMzA0NjAsMzA0NzEsMzA2ODQsMzA3MjIsMzA3NDAsMzA3MzIsMzA3MzMsMzEwNDYsMzEwNDksMzEwNDgsMzEwNDcsMzExNjEsMzExNjIsMzExODUsMzExODYsMzExNzksMzEzNTksMzEzNjEsMzE0ODcsMzE0ODUsMzE4NjksMzIwMDIsMzIwMDUsMzIwMDAsMzIwMDksMzIwMDcsMzIwMDQsMzIwMDYsMzI1NjgsMzI2NTQsMzI3MDMsMzI3NzIsMzI3ODQsMzI3ODEsMzI3ODUsMzI4MjIsMzI5ODIsMzI5OTcsMzI5ODYsMzI5NjMsMzI5NjQsMzI5NzIsMzI5OTMsMzI5ODcsMzI5NzQsMzI5OTAsMzI5OTYsMzI5ODksMzMyNjgsMzMzMTQsMzM1MTEsMzM1MzksMzM1NDEsMzM1MDcsMzM0OTksMzM1MTAsMzM1NDAsMzM1MDksMzM1MzgsMzM1NDUsMzM0OTAsMzM0OTUsMzM1MjEsMzM1MzcsMzM1MDAsMzM0OTIsMzM0ODksMzM1MDIsMzM0OTEsMzM1MDMsMzM1MTksMzM1NDIsMzQzODQsMzQ0MjUsMzQ0MjcsMzQ0MjYsMzQ4OTMsMzQ5MjMsMzUyMDEsMzUyODQsMzUzMzYsMzUzMzAsMzUzMzEsMzU5OTgsMzYwMDAsMzYyMTIsMzYyMTEsMzYyNzYsMzY1NTcsMzY1NTYsMzY4NDgsMzY4MzgsMzY4MzQsMzY4NDIsMzY4MzcsMzY4NDUsMzY4NDMsMzY4MzYsMzY4NDAsMzcwNjYsMzcwNzAsMzcwNTcsMzcwNTksMzcxOTUsMzcxOTQsMzczMjUsMzgyNzQsMzg0ODAsMzg0NzUsMzg0NzYsMzg0NzcsMzg3NTQsMzg3NjEsMzg4NTksMzg4OTMsMzg4OTksMzg5MTMsMzkwODAsMzkxMzEsMzkxMzUsMzkzMTgsMzkzMjEsMjAwNTYsMjAxNDcsMjA0OTIsMjA0OTMsMjA1MTUsMjA0NjMsMjA1MTgsMjA1MTcsMjA0NzIsMjA1MjEsMjA1MDIsMjA0ODYsMjA1NDAsMjA1MTEsMjA1MDYsMjA0OTgsMjA0OTcsMjA0NzQsMjA0ODAsMjA1MDAsMjA1MjAsMjA0NjUsMjA1MTMsMjA0OTEsMjA1MDUsMjA1MDQsMjA0NjcsMjA0NjIsMjA1MjUsMjA1MjIsMjA0NzgsMjA1MjMsMjA0ODksMjA4NjAsMjA5MDAsMjA5MDEsMjA4OTgsMjA5NDEsMjA5NDAsMjA5MzQsMjA5MzksMjEwNzgsMjEwODQsMjEwNzYsMjEwODMsMjEwODUsMjEyOTAsMjEzNzUsMjE0MDcsMjE0MDUsMjE0NzEsMjE3MzYsMjE3NzYsMjE3NjEsMjE4MTUsMjE3NTYsMjE3MzMsMjE3NDYsMjE3NjYsMjE3NTQsMjE3ODAsMjE3MzcsMjE3NDEsMjE3MjksMjE3NjksMjE3NDIsMjE3MzgsMjE3MzQsMjE3OTksMjE3NjcsMjE3NTcsMjE3NzUsMjIyNzUsMjIyNzYsMjI0NjYsMjI0ODQsMjI0NzUsMjI0NjcsMjI1MzcsMjI3OTksMjI4NzEsMjI4NzIsMjI4NzQsMjMwNTcsMjMwNjQsMjMwNjgsMjMwNzEsMjMwNjcsMjMwNTksMjMwMjAsMjMwNzIsMjMwNzUsMjMwODEsMjMwNzcsMjMwNTIsMjMwNDksMjM0MDMsMjM2NDAsMjM0NzIsMjM0NzUsMjM0NzgsMjM0NzYsMjM0NzAsMjM0NzcsMjM0ODEsMjM0ODAsMjM1NTYsMjM2MzMsMjM2MzcsMjM2MzIsMjM3ODksMjM4MDUsMjM4MDMsMjM3ODYsMjM3ODQsMjM3OTIsMjM3OTgsMjM4MDksMjM3OTYsMjQwNDYsMjQxMDksMjQxMDcsMjQyMzUsMjQyMzcsMjQyMzEsMjQzNjksMjQ0NjYsMjQ0NjUsMjQ0NjQsMjQ2NjUsMjQ2NzUsMjQ2NzcsMjQ2NTYsMjQ2NjEsMjQ2ODUsMjQ2ODEsMjQ2ODcsMjQ3MDgsMjQ3MzUsMjQ3MzAsMjQ3MTcsMjQ3MjQsMjQ3MTYsMjQ3MDksMjQ3MjYsMjUxNTksMjUzMzEsMjUzNTIsMjUzNDMsMjU0MjIsMjU0MDYsMjUzOTEsMjU0MjksMjU0MTAsMjU0MTQsMjU0MjMsMjU0MTcsMjU0MDIsMjU0MjQsMjU0MDUsMjUzODYsMjUzODcsMjUzODQsMjU0MjEsMjU0MjAsMjU5MjgsMjU5MjksMjYwMDksMjYwNDksMjYwNTMsMjYxNzgsMjYxODUsMjYxOTEsMjYxNzksMjYxOTQsMjYxODgsMjYxODEsMjYxNzcsMjYzNjAsMjYzODgsMjYzODksMjYzOTEsMjY2NTcsMjY2ODAsMjY2OTYsMjY2OTQsMjY3MDcsMjY2ODEsMjY2OTAsMjY3MDgsMjY2NjUsMjY4MDMsMjY2NDcsMjY3MDAsMjY3MDUsMjY2ODUsMjY2MTIsMjY3MDQsMjY2ODgsMjY2ODQsMjY2OTEsMjY2NjYsMjY2OTMsMjY2NDMsMjY2NDgsMjY2ODksMjc1MzAsMjc1MjksMjc1NzUsMjc2ODMsMjc2ODcsMjc2ODgsMjc2ODYsMjc2ODQsMjc4ODgsMjgwMTAsMjgwNTMsMjgwNDAsMjgwMzksMjgwMDYsMjgwMjQsMjgwMjMsMjc5OTMsMjgwNTEsMjgwMTIsMjgwNDEsMjgwMTQsMjc5OTQsMjgwMjAsMjgwMDksMjgwNDQsMjgwNDIsMjgwMjUsMjgwMzcsMjgwMDUsMjgwNTIsMjg4NzQsMjg4ODgsMjg5MDAsMjg4ODksMjg4NzIsMjg4NzksMjkyNDEsMjkzMDUsMjk0MzYsMjk0MzMsMjk0MzcsMjk0MzIsMjk0MzEsMjk1NzQsMjk2NzcsMjk3MDUsMjk2NzgsMjk2NjQsMjk2NzQsMjk2NjIsMzAwMzYsMzAwNDUsMzAwNDQsMzAwNDIsMzAwNDEsMzAxNDIsMzAxNDksMzAxNTEsMzAxMzAsMzAxMzEsMzAxNDEsMzAxNDAsMzAxMzcsMzAxNDYsMzAxMzYsMzAzNDcsMzAzODQsMzA0MTAsMzA0MTMsMzA0MTQsMzA1MDUsMzA0OTUsMzA0OTYsMzA1MDQsMzA2OTcsMzA3NjgsMzA3NTksMzA3NzYsMzA3NDksMzA3NzIsMzA3NzUsMzA3NTcsMzA3NjUsMzA3NTIsMzA3NTEsMzA3NzAsMzEwNjEsMzEwNTYsMzEwNzIsMzEwNzEsMzEwNjIsMzEwNzAsMzEwNjksMzEwNjMsMzEwNjYsMzEyMDQsMzEyMDMsMzEyMDcsMzExOTksMzEyMDYsMzEyMDksMzExOTIsMzEzNjQsMzEzNjgsMzE0NDksMzE0OTQsMzE1MDUsMzE4ODEsMzIwMzMsMzIwMjMsMzIwMTEsMzIwMTAsMzIwMzIsMzIwMzQsMzIwMjAsMzIwMTYsMzIwMjEsMzIwMjYsMzIwMjgsMzIwMTMsMzIwMjUsMzIwMjcsMzI1NzAsMzI2MDcsMzI2NjAsMzI3MDksMzI3MDUsMzI3NzQsMzI3OTIsMzI3ODksMzI3OTMsMzI3OTEsMzI4MjksMzI4MzEsMzMwMDksMzMwMjYsMzMwMDgsMzMwMjksMzMwMDUsMzMwMTIsMzMwMzAsMzMwMTYsMzMwMTEsMzMwMzIsMzMwMjEsMzMwMzQsMzMwMjAsMzMwMDcsMzMyNjEsMzMyNjAsMzMyODAsMzMyOTYsMzMzMjIsMzMzMjMsMzMzMjAsMzMzMjQsMzM0NjcsMzM1NzksMzM2MTgsMzM2MjAsMzM2MTAsMzM1OTIsMzM2MTYsMzM2MDksMzM1ODksMzM1ODgsMzM2MTUsMzM1ODYsMzM1OTMsMzM1OTAsMzM1NTksMzM2MDAsMzM1ODUsMzM1NzYsMzM2MDMsMzQzODgsMzQ0NDIsMzQ0NzQsMzQ0NTEsMzQ0NjgsMzQ0NzMsMzQ0NDQsMzQ0NjcsMzQ0NjAsMzQ5MjgsMzQ5MzUsMzQ5NDUsMzQ5NDYsMzQ5NDEsMzQ5MzcsMzUzNTIsMzUzNDQsMzUzNDIsMzUzNDAsMzUzNDksMzUzMzgsMzUzNTEsMzUzNDcsMzUzNTAsMzUzNDMsMzUzNDUsMzU5MTIsMzU5NjIsMzU5NjEsMzYwMDEsMzYwMDIsMzYyMTUsMzY1MjQsMzY1NjIsMzY1NjQsMzY1NTksMzY3ODUsMzY4NjUsMzY4NzAsMzY4NTUsMzY4NjQsMzY4NTgsMzY4NTIsMzY4NjcsMzY4NjEsMzY4NjksMzY4NTYsMzcwMTMsMzcwODksMzcwODUsMzcwOTAsMzcyMDIsMzcxOTcsMzcxOTYsMzczMzYsMzczNDEsMzczMzUsMzczNDAsMzczMzcsMzgyNzUsMzg0OTgsMzg0OTksMzg0OTcsMzg0OTEsMzg0OTMsMzg1MDAsMzg0ODgsMzg0OTQsMzg1ODcsMzkxMzgsMzkzNDAsMzk1OTIsMzk2NDAsMzk3MTcsMzk3MzAsMzk3NDAsMjAwOTQsMjA2MDIsMjA2MDUsMjA1NzIsMjA1NTEsMjA1NDcsMjA1NTYsMjA1NzAsMjA1NTMsMjA1ODEsMjA1OTgsMjA1NTgsMjA1NjUsMjA1OTcsMjA1OTYsMjA1OTksMjA1NTksMjA0OTUsMjA1OTEsMjA1ODksMjA4MjgsMjA4ODUsMjA5NzYsMjEwOTgsMjExMDMsMjEyMDIsMjEyMDksMjEyMDgsMjEyMDUsMjEyNjQsMjEyNjMsMjEyNzMsMjEzMTEsMjEzMTIsMjEzMTAsMjE0NDMsMjYzNjQsMjE4MzAsMjE4NjYsMjE4NjIsMjE4MjgsMjE4NTQsMjE4NTcsMjE4MjcsMjE4MzQsMjE4MDksMjE4NDYsMjE4MzksMjE4NDUsMjE4MDcsMjE4NjAsMjE4MTYsMjE4MDYsMjE4NTIsMjE4MDQsMjE4NTksMjE4MTEsMjE4MjUsMjE4NDcsMjIyODAsMjIyODMsMjIyODEsMjI0OTUsMjI1MzMsMjI1MzgsMjI1MzQsMjI0OTYsMjI1MDAsMjI1MjIsMjI1MzAsMjI1ODEsMjI1MTksMjI1MjEsMjI4MTYsMjI4ODIsMjMwOTQsMjMxMDUsMjMxMTMsMjMxNDIsMjMxNDYsMjMxMDQsMjMxMDAsMjMxMzgsMjMxMzAsMjMxMTAsMjMxMTQsMjM0MDgsMjM0OTUsMjM0OTMsMjM0OTIsMjM0OTAsMjM0ODcsMjM0OTQsMjM1NjEsMjM1NjAsMjM1NTksMjM2NDgsMjM2NDQsMjM2NDUsMjM4MTUsMjM4MTQsMjM4MjIsMjM4MzUsMjM4MzAsMjM4NDIsMjM4MjUsMjM4NDksMjM4MjgsMjM4MzMsMjM4NDQsMjM4NDcsMjM4MzEsMjQwMzQsMjQxMjAsMjQxMTgsMjQxMTUsMjQxMTksMjQyNDcsMjQyNDgsMjQyNDYsMjQyNDUsMjQyNTQsMjQzNzMsMjQzNzUsMjQ0MDcsMjQ0MjgsMjQ0MjUsMjQ0MjcsMjQ0NzEsMjQ0NzMsMjQ0NzgsMjQ0NzIsMjQ0ODEsMjQ0ODAsMjQ0NzYsMjQ3MDMsMjQ3MzksMjQ3MTMsMjQ3MzYsMjQ3NDQsMjQ3NzksMjQ3NTYsMjQ4MDYsMjQ3NjUsMjQ3NzMsMjQ3NjMsMjQ3NTcsMjQ3OTYsMjQ3NjQsMjQ3OTIsMjQ3ODksMjQ3NzQsMjQ3OTksMjQ3NjAsMjQ3OTQsMjQ3NzUsMjUxMTQsMjUxMTUsMjUxNjAsMjU1MDQsMjU1MTEsMjU0NTgsMjU0OTQsMjU1MDYsMjU1MDksMjU0NjMsMjU0NDcsMjU0OTYsMjU1MTQsMjU0NTcsMjU1MTMsMjU0ODEsMjU0NzUsMjU0OTksMjU0NTEsMjU1MTIsMjU0NzYsMjU0ODAsMjU0OTcsMjU1MDUsMjU1MTYsMjU0OTAsMjU0ODcsMjU0NzIsMjU0NjcsMjU0NDksMjU0NDgsMjU0NjYsMjU5NDksMjU5NDIsMjU5MzcsMjU5NDUsMjU5NDMsMjE4NTUsMjU5MzUsMjU5NDQsMjU5NDEsMjU5NDAsMjYwMTIsMjYwMTEsMjYwMjgsMjYwNjMsMjYwNTksMjYwNjAsMjYwNjIsMjYyMDUsMjYyMDIsMjYyMTIsMjYyMTYsMjYyMTQsMjYyMDYsMjYzNjEsMjEyMDcsMjYzOTUsMjY3NTMsMjY3OTksMjY3ODYsMjY3NzEsMjY4MDUsMjY3NTEsMjY3NDIsMjY4MDEsMjY3OTEsMjY3NzUsMjY4MDAsMjY3NTUsMjY4MjAsMjY3OTcsMjY3NTgsMjY3NTcsMjY3NzIsMjY3ODEsMjY3OTIsMjY3ODMsMjY3ODUsMjY3NTQsMjc0NDIsMjc1NzgsMjc2MjcsMjc2MjgsMjc2OTEsMjgwNDYsMjgwOTIsMjgxNDcsMjgxMjEsMjgwODIsMjgxMjksMjgxMDgsMjgxMzIsMjgxNTUsMjgxNTQsMjgxNjUsMjgxMDMsMjgxMDcsMjgwNzksMjgxMTMsMjgwNzgsMjgxMjYsMjgxNTMsMjgwODgsMjgxNTEsMjgxNDksMjgxMDEsMjgxMTQsMjgxODYsMjgwODUsMjgxMjIsMjgxMzksMjgxMjAsMjgxMzgsMjgxNDUsMjgxNDIsMjgxMzYsMjgxMDIsMjgxMDAsMjgwNzQsMjgxNDAsMjgwOTUsMjgxMzQsMjg5MjEsMjg5MzcsMjg5MzgsMjg5MjUsMjg5MTEsMjkyNDUsMjkzMDksMjkzMTMsMjk0NjgsMjk0NjcsMjk0NjIsMjk0NTksMjk0NjUsMjk1NzUsMjk3MDEsMjk3MDYsMjk2OTksMjk3MDIsMjk2OTQsMjk3MDksMjk5MjAsMjk5NDIsMjk5NDMsMjk5ODAsMjk5ODYsMzAwNTMsMzAwNTQsMzAwNTAsMzAwNjQsMzAwOTUsMzAxNjQsMzAxNjUsMzAxMzMsMzAxNTQsMzAxNTcsMzAzNTAsMzA0MjAsMzA0MTgsMzA0MjcsMzA1MTksMzA1MjYsMzA1MjQsMzA1MTgsMzA1MjAsMzA1MjIsMzA4MjcsMzA3ODcsMzA3OTgsMzEwNzcsMzEwODAsMzEwODUsMzEyMjcsMzEzNzgsMzEzODEsMzE1MjAsMzE1MjgsMzE1MTUsMzE1MzIsMzE1MjYsMzE1MTMsMzE1MTgsMzE1MzQsMzE4OTAsMzE4OTUsMzE4OTMsMzIwNzAsMzIwNjcsMzIxMTMsMzIwNDYsMzIwNTcsMzIwNjAsMzIwNjQsMzIwNDgsMzIwNTEsMzIwNjgsMzIwNDcsMzIwNjYsMzIwNTAsMzIwNDksMzI1NzMsMzI2NzAsMzI2NjYsMzI3MTYsMzI3MTgsMzI3MjIsMzI3OTYsMzI4NDIsMzI4MzgsMzMwNzEsMzMwNDYsMzMwNTksMzMwNjcsMzMwNjUsMzMwNzIsMzMwNjAsMzMyODIsMzMzMzMsMzMzMzUsMzMzMzQsMzMzMzcsMzM2NzgsMzM2OTQsMzM2ODgsMzM2NTYsMzM2OTgsMzM2ODYsMzM3MjUsMzM3MDcsMzM2ODIsMzM2NzQsMzM2ODMsMzM2NzMsMzM2OTYsMzM2NTUsMzM2NTksMzM2NjAsMzM2NzAsMzM3MDMsMzQzODksMjQ0MjYsMzQ1MDMsMzQ0OTYsMzQ0ODYsMzQ1MDAsMzQ0ODUsMzQ1MDIsMzQ1MDcsMzQ0ODEsMzQ0NzksMzQ1MDUsMzQ4OTksMzQ5NzQsMzQ5NTIsMzQ5ODcsMzQ5NjIsMzQ5NjYsMzQ5NTcsMzQ5NTUsMzUyMTksMzUyMTUsMzUzNzAsMzUzNTcsMzUzNjMsMzUzNjUsMzUzNzcsMzUzNzMsMzUzNTksMzUzNTUsMzUzNjIsMzU5MTMsMzU5MzAsMzYwMDksMzYwMTIsMzYwMTEsMzYwMDgsMzYwMTAsMzYwMDcsMzYxOTksMzYxOTgsMzYyODYsMzYyODIsMzY1NzEsMzY1NzUsMzY4ODksMzY4NzcsMzY4OTAsMzY4ODcsMzY4OTksMzY4OTUsMzY4OTMsMzY4ODAsMzY4ODUsMzY4OTQsMzY4OTYsMzY4NzksMzY4OTgsMzY4ODYsMzY4OTEsMzY4ODQsMzcwOTYsMzcxMDEsMzcxMTcsMzcyMDcsMzczMjYsMzczNjUsMzczNTAsMzczNDcsMzczNTEsMzczNTcsMzczNTMsMzgyODEsMzg1MDYsMzg1MTcsMzg1MTUsMzg1MjAsMzg1MTIsMzg1MTYsMzg1MTgsMzg1MTksMzg1MDgsMzg1OTIsMzg2MzQsMzg2MzMsMzE0NTYsMzE0NTUsMzg5MTQsMzg5MTUsMzk3NzAsNDAxNjUsNDA1NjUsNDA1NzUsNDA2MTMsNDA2MzUsMjA2NDIsMjA2MjEsMjA2MTMsMjA2MzMsMjA2MjUsMjA2MDgsMjA2MzAsMjA2MzIsMjA2MzQsMjYzNjgsMjA5NzcsMjExMDYsMjExMDgsMjExMDksMjEwOTcsMjEyMTQsMjEyMTMsMjEyMTEsMjEzMzgsMjE0MTMsMjE4ODMsMjE4ODgsMjE5MjcsMjE4ODQsMjE4OTgsMjE5MTcsMjE5MTIsMjE4OTAsMjE5MTYsMjE5MzAsMjE5MDgsMjE4OTUsMjE4OTksMjE4OTEsMjE5MzksMjE5MzQsMjE5MTksMjE4MjIsMjE5MzgsMjE5MTQsMjE5NDcsMjE5MzIsMjE5MzcsMjE4ODYsMjE4OTcsMjE5MzEsMjE5MTMsMjIyODUsMjI1NzUsMjI1NzAsMjI1ODAsMjI1NjQsMjI1NzYsMjI1NzcsMjI1NjEsMjI1NTcsMjI1NjAsMjI3NzcsMjI3NzgsMjI4ODAsMjMxNTksMjMxOTQsMjMxNjcsMjMxODYsMjMxOTUsMjMyMDcsMjM0MTEsMjM0MDksMjM1MDYsMjM1MDAsMjM1MDcsMjM1MDQsMjM1NjIsMjM1NjMsMjM2MDEsMjM4ODQsMjM4ODgsMjM4NjAsMjM4NzksMjQwNjEsMjQxMzMsMjQxMjUsMjQxMjgsMjQxMzEsMjQxOTAsMjQyNjYsMjQyNTcsMjQyNTgsMjQyNjAsMjQzODAsMjQ0MjksMjQ0ODksMjQ0OTAsMjQ0ODgsMjQ3ODUsMjQ4MDEsMjQ3NTQsMjQ3NTgsMjQ4MDAsMjQ4NjAsMjQ4NjcsMjQ4MjYsMjQ4NTMsMjQ4MTYsMjQ4MjcsMjQ4MjAsMjQ5MzYsMjQ4MTcsMjQ4NDYsMjQ4MjIsMjQ4NDEsMjQ4MzIsMjQ4NTAsMjUxMTksMjUxNjEsMjU1MDcsMjU0ODQsMjU1NTEsMjU1MzYsMjU1NzcsMjU1NDUsMjU1NDIsMjU1NDksMjU1NTQsMjU1NzEsMjU1NTIsMjU1NjksMjU1NTgsMjU1ODEsMjU1ODIsMjU0NjIsMjU1ODgsMjU1NzgsMjU1NjMsMjU2ODIsMjU1NjIsMjU1OTMsMjU5NTAsMjU5NTgsMjU5NTQsMjU5NTUsMjYwMDEsMjYwMDAsMjYwMzEsMjYyMjIsMjYyMjQsMjYyMjgsMjYyMzAsMjYyMjMsMjYyNTcsMjYyMzQsMjYyMzgsMjYyMzEsMjYzNjYsMjYzNjcsMjYzOTksMjYzOTcsMjY4NzQsMjY4MzcsMjY4NDgsMjY4NDAsMjY4MzksMjY4ODUsMjY4NDcsMjY4NjksMjY4NjIsMjY4NTUsMjY4NzMsMjY4MzQsMjY4NjYsMjY4NTEsMjY4MjcsMjY4MjksMjY4OTMsMjY4OTgsMjY4OTQsMjY4MjUsMjY4NDIsMjY5OTAsMjY4NzUsMjc0NTQsMjc0NTAsMjc0NTMsMjc1NDQsMjc1NDIsMjc1ODAsMjc2MzEsMjc2OTQsMjc2OTUsMjc2OTIsMjgyMDcsMjgyMTYsMjgyNDQsMjgxOTMsMjgyMTAsMjgyNjMsMjgyMzQsMjgxOTIsMjgxOTcsMjgxOTUsMjgxODcsMjgyNTEsMjgyNDgsMjgxOTYsMjgyNDYsMjgyNzAsMjgyMDUsMjgxOTgsMjgyNzEsMjgyMTIsMjgyMzcsMjgyMTgsMjgyMDQsMjgyMjcsMjgxODksMjgyMjIsMjgzNjMsMjgyOTcsMjgxODUsMjgyMzgsMjgyNTksMjgyMjgsMjgyNzQsMjgyNjUsMjgyNTUsMjg5NTMsMjg5NTQsMjg5NjYsMjg5NzYsMjg5NjEsMjg5ODIsMjkwMzgsMjg5NTYsMjkyNjAsMjkzMTYsMjkzMTIsMjk0OTQsMjk0NzcsMjk0OTIsMjk0ODEsMjk3NTQsMjk3MzgsMjk3NDcsMjk3MzAsMjk3MzMsMjk3NDksMjk3NTAsMjk3NDgsMjk3NDMsMjk3MjMsMjk3MzQsMjk3MzYsMjk5ODksMjk5OTAsMzAwNTksMzAwNTgsMzAxNzgsMzAxNzEsMzAxNzksMzAxNjksMzAxNjgsMzAxNzQsMzAxNzYsMzAzMzEsMzAzMzIsMzAzNTgsMzAzNTUsMzAzODgsMzA0MjgsMzA1NDMsMzA3MDEsMzA4MTMsMzA4MjgsMzA4MzEsMzEyNDUsMzEyNDAsMzEyNDMsMzEyMzcsMzEyMzIsMzEzODQsMzEzODMsMzEzODIsMzE0NjEsMzE0NTksMzE1NjEsMzE1NzQsMzE1NTgsMzE1NjgsMzE1NzAsMzE1NzIsMzE1NjUsMzE1NjMsMzE1NjcsMzE1NjksMzE5MDMsMzE5MDksMzIwOTQsMzIwODAsMzIxMDQsMzIwODUsMzIwNDMsMzIxMTAsMzIxMTQsMzIwOTcsMzIxMDIsMzIwOTgsMzIxMTIsMzIxMTUsMjE4OTIsMzI3MjQsMzI3MjUsMzI3NzksMzI4NTAsMzI5MDEsMzMxMDksMzMxMDgsMzMwOTksMzMxMDUsMzMxMDIsMzMwODEsMzMwOTQsMzMwODYsMzMxMDAsMzMxMDcsMzMxNDAsMzMyOTgsMzMzMDgsMzM3NjksMzM3OTUsMzM3ODQsMzM4MDUsMzM3NjAsMzM3MzMsMzM4MDMsMzM3MjksMzM3NzUsMzM3NzcsMzM3ODAsMzM4NzksMzM4MDIsMzM3NzYsMzM4MDQsMzM3NDAsMzM3ODksMzM3NzgsMzM3MzgsMzM4NDgsMzM4MDYsMzM3OTYsMzM3NTYsMzM3OTksMzM3NDgsMzM3NTksMzQzOTUsMzQ1MjcsMzQ1MjEsMzQ1NDEsMzQ1MTYsMzQ1MjMsMzQ1MzIsMzQ1MTIsMzQ1MjYsMzQ5MDMsMzUwMDksMzUwMTAsMzQ5OTMsMzUyMDMsMzUyMjIsMzUzODcsMzU0MjQsMzU0MTMsMzU0MjIsMzUzODgsMzUzOTMsMzU0MTIsMzU0MTksMzU0MDgsMzUzOTgsMzUzODAsMzUzODYsMzUzODIsMzU0MTQsMzU5MzcsMzU5NzAsMzYwMTUsMzYwMjgsMzYwMTksMzYwMjksMzYwMzMsMzYwMjcsMzYwMzIsMzYwMjAsMzYwMjMsMzYwMjIsMzYwMzEsMzYwMjQsMzYyMzQsMzYyMjksMzYyMjUsMzYzMDIsMzYzMTcsMzYyOTksMzYzMTQsMzYzMDUsMzYzMDAsMzYzMTUsMzYyOTQsMzY2MDMsMzY2MDAsMzY2MDQsMzY3NjQsMzY5MTAsMzY5MTcsMzY5MTMsMzY5MjAsMzY5MTQsMzY5MTgsMzcxMjIsMzcxMDksMzcxMjksMzcxMTgsMzcyMTksMzcyMjEsMzczMjcsMzczOTYsMzczOTcsMzc0MTEsMzczODUsMzc0MDYsMzczODksMzczOTIsMzczODMsMzczOTMsMzgyOTIsMzgyODcsMzgyODMsMzgyODksMzgyOTEsMzgyOTAsMzgyODYsMzg1MzgsMzg1NDIsMzg1MzksMzg1MjUsMzg1MzMsMzg1MzQsMzg1NDEsMzg1MTQsMzg1MzIsMzg1OTMsMzg1OTcsMzg1OTYsMzg1OTgsMzg1OTksMzg2MzksMzg2NDIsMzg4NjAsMzg5MTcsMzg5MTgsMzg5MjAsMzkxNDMsMzkxNDYsMzkxNTEsMzkxNDUsMzkxNTQsMzkxNDksMzkzNDIsMzkzNDEsNDA2NDMsNDA2NTMsNDA2NTcsMjAwOTgsMjA2NTMsMjA2NjEsMjA2NTgsMjA2NTksMjA2NzcsMjA2NzAsMjA2NTIsMjA2NjMsMjA2NjcsMjA2NTUsMjA2NzksMjExMTksMjExMTEsMjExMTcsMjEyMTUsMjEyMjIsMjEyMjAsMjEyMTgsMjEyMTksMjEyOTUsMjE5ODMsMjE5OTIsMjE5NzEsMjE5OTAsMjE5NjYsMjE5ODAsMjE5NTksMjE5NjksMjE5ODcsMjE5ODgsMjE5OTksMjE5NzgsMjE5ODUsMjE5NTcsMjE5NTgsMjE5ODksMjE5NjEsMjIyOTAsMjIyOTEsMjI2MjIsMjI2MDksMjI2MTYsMjI2MTUsMjI2MTgsMjI2MTIsMjI2MzUsMjI2MDQsMjI2MzcsMjI2MDIsMjI2MjYsMjI2MTAsMjI2MDMsMjI4ODcsMjMyMzMsMjMyNDEsMjMyNDQsMjMyMzAsMjMyMjksMjMyMjgsMjMyMTksMjMyMzQsMjMyMTgsMjM5MTMsMjM5MTksMjQxNDAsMjQxODUsMjQyNjUsMjQyNjQsMjQzMzgsMjQ0MDksMjQ0OTIsMjQ0OTQsMjQ4NTgsMjQ4NDcsMjQ5MDQsMjQ4NjMsMjQ4MTksMjQ4NTksMjQ4MjUsMjQ4MzMsMjQ4NDAsMjQ5MTAsMjQ5MDgsMjQ5MDAsMjQ5MDksMjQ4OTQsMjQ4ODQsMjQ4NzEsMjQ4NDUsMjQ4MzgsMjQ4ODcsMjUxMjEsMjUxMjIsMjU2MTksMjU2NjIsMjU2MzAsMjU2NDIsMjU2NDUsMjU2NjEsMjU2NDQsMjU2MTUsMjU2MjgsMjU2MjAsMjU2MTMsMjU2NTQsMjU2MjIsMjU2MjMsMjU2MDYsMjU5NjQsMjYwMTUsMjYwMzIsMjYyNjMsMjYyNDksMjYyNDcsMjYyNDgsMjYyNjIsMjYyNDQsMjYyNjQsMjYyNTMsMjYzNzEsMjcwMjgsMjY5ODksMjY5NzAsMjY5OTksMjY5NzYsMjY5NjQsMjY5OTcsMjY5MjgsMjcwMTAsMjY5NTQsMjY5ODQsMjY5ODcsMjY5NzQsMjY5NjMsMjcwMDEsMjcwMTQsMjY5NzMsMjY5NzksMjY5NzEsMjc0NjMsMjc1MDYsMjc1ODQsMjc1ODMsMjc2MDMsMjc2NDUsMjgzMjIsMjgzMzUsMjgzNzEsMjgzNDIsMjgzNTQsMjgzMDQsMjgzMTcsMjgzNTksMjgzNTcsMjgzMjUsMjgzMTIsMjgzNDgsMjgzNDYsMjgzMzEsMjgzNjksMjgzMTAsMjgzMTYsMjgzNTYsMjgzNzIsMjgzMzAsMjgzMjcsMjgzNDAsMjkwMDYsMjkwMTcsMjkwMzMsMjkwMjgsMjkwMDEsMjkwMzEsMjkwMjAsMjkwMzYsMjkwMzAsMjkwMDQsMjkwMjksMjkwMjIsMjg5OTgsMjkwMzIsMjkwMTQsMjkyNDIsMjkyNjYsMjk0OTUsMjk1MDksMjk1MDMsMjk1MDIsMjk4MDcsMjk3ODYsMjk3ODEsMjk3OTEsMjk3OTAsMjk3NjEsMjk3NTksMjk3ODUsMjk3ODcsMjk3ODgsMzAwNzAsMzAwNzIsMzAyMDgsMzAxOTIsMzAyMDksMzAxOTQsMzAxOTMsMzAyMDIsMzAyMDcsMzAxOTYsMzAxOTUsMzA0MzAsMzA0MzEsMzA1NTUsMzA1NzEsMzA1NjYsMzA1NTgsMzA1NjMsMzA1ODUsMzA1NzAsMzA1NzIsMzA1NTYsMzA1NjUsMzA1NjgsMzA1NjIsMzA3MDIsMzA4NjIsMzA4OTYsMzA4NzEsMzA4NzIsMzA4NjAsMzA4NTcsMzA4NDQsMzA4NjUsMzA4NjcsMzA4NDcsMzEwOTgsMzExMDMsMzExMDUsMzM4MzYsMzExNjUsMzEyNjAsMzEyNTgsMzEyNjQsMzEyNTIsMzEyNjMsMzEyNjIsMzEzOTEsMzEzOTIsMzE2MDcsMzE2ODAsMzE1ODQsMzE1OTgsMzE1OTEsMzE5MjEsMzE5MjMsMzE5MjUsMzIxNDcsMzIxMjEsMzIxNDUsMzIxMjksMzIxNDMsMzIwOTEsMzI2MjIsMzI2MTcsMzI2MTgsMzI2MjYsMzI2ODEsMzI2ODAsMzI2NzYsMzI4NTQsMzI4NTYsMzI5MDIsMzI5MDAsMzMxMzcsMzMxMzYsMzMxNDQsMzMxMjUsMzMxMzQsMzMxMzksMzMxMzEsMzMxNDUsMzMxNDYsMzMxMjYsMzMyODUsMzMzNTEsMzM5MjIsMzM5MTEsMzM4NTMsMzM4NDEsMzM5MDksMzM4OTQsMzM4OTksMzM4NjUsMzM5MDAsMzM4ODMsMzM4NTIsMzM4NDUsMzM4ODksMzM4OTEsMzM4OTcsMzM5MDEsMzM4NjIsMzQzOTgsMzQzOTYsMzQzOTksMzQ1NTMsMzQ1NzksMzQ1NjgsMzQ1NjcsMzQ1NjAsMzQ1NTgsMzQ1NTUsMzQ1NjIsMzQ1NjMsMzQ1NjYsMzQ1NzAsMzQ5MDUsMzUwMzksMzUwMjgsMzUwMzMsMzUwMzYsMzUwMzIsMzUwMzcsMzUwNDEsMzUwMTgsMzUwMjksMzUwMjYsMzUyMjgsMzUyOTksMzU0MzUsMzU0NDIsMzU0NDMsMzU0MzAsMzU0MzMsMzU0NDAsMzU0NjMsMzU0NTIsMzU0MjcsMzU0ODgsMzU0NDEsMzU0NjEsMzU0MzcsMzU0MjYsMzU0MzgsMzU0MzYsMzU0NDksMzU0NTEsMzUzOTAsMzU0MzIsMzU5MzgsMzU5NzgsMzU5NzcsMzYwNDIsMzYwMzksMzYwNDAsMzYwMzYsMzYwMTgsMzYwMzUsMzYwMzQsMzYwMzcsMzYzMjEsMzYzMTksMzYzMjgsMzYzMzUsMzYzMzksMzYzNDYsMzYzMzAsMzYzMjQsMzYzMjYsMzY1MzAsMzY2MTEsMzY2MTcsMzY2MDYsMzY2MTgsMzY3NjcsMzY3ODYsMzY5MzksMzY5MzgsMzY5NDcsMzY5MzAsMzY5NDgsMzY5MjQsMzY5NDksMzY5NDQsMzY5MzUsMzY5NDMsMzY5NDIsMzY5NDEsMzY5NDUsMzY5MjYsMzY5MjksMzcxMzgsMzcxNDMsMzcyMjgsMzcyMjYsMzcyMjUsMzczMjEsMzc0MzEsMzc0NjMsMzc0MzIsMzc0MzcsMzc0NDAsMzc0MzgsMzc0NjcsMzc0NTEsMzc0NzYsMzc0NTcsMzc0MjgsMzc0NDksMzc0NTMsMzc0NDUsMzc0MzMsMzc0MzksMzc0NjYsMzgyOTYsMzg1NTIsMzg1NDgsMzg1NDksMzg2MDUsMzg2MDMsMzg2MDEsMzg2MDIsMzg2NDcsMzg2NTEsMzg2NDksMzg2NDYsMzg3NDIsMzg3NzIsMzg3NzQsMzg5MjgsMzg5MjksMzg5MzEsMzg5MjIsMzg5MzAsMzg5MjQsMzkxNjQsMzkxNTYsMzkxNjUsMzkxNjYsMzkzNDcsMzkzNDUsMzkzNDgsMzk2NDksNDAxNjksNDA1NzgsNDA3MTgsNDA3MjMsNDA3MzYsMjA3MTEsMjA3MTgsMjA3MDksMjA2OTQsMjA3MTcsMjA2OTgsMjA2OTMsMjA2ODcsMjA2ODksMjA3MjEsMjA2ODYsMjA3MTMsMjA4MzQsMjA5NzksMjExMjMsMjExMjIsMjEyOTcsMjE0MjEsMjIwMTQsMjIwMTYsMjIwNDMsMjIwMzksMjIwMTMsMjIwMzYsMjIwMjIsMjIwMjUsMjIwMjksMjIwMzAsMjIwMDcsMjIwMzgsMjIwNDcsMjIwMjQsMjIwMzIsMjIwMDYsMjIyOTYsMjIyOTQsMjI2NDUsMjI2NTQsMjI2NTksMjI2NzUsMjI2NjYsMjI2NDksMjI2NjEsMjI2NTMsMjI3ODEsMjI4MjEsMjI4MTgsMjI4MjAsMjI4OTAsMjI4ODksMjMyNjUsMjMyNzAsMjMyNzMsMjMyNTUsMjMyNTQsMjMyNTYsMjMyNjcsMjM0MTMsMjM1MTgsMjM1MjcsMjM1MjEsMjM1MjUsMjM1MjYsMjM1MjgsMjM1MjIsMjM1MjQsMjM1MTksMjM1NjUsMjM2NTAsMjM5NDAsMjM5NDMsMjQxNTUsMjQxNjMsMjQxNDksMjQxNTEsMjQxNDgsMjQyNzUsMjQyNzgsMjQzMzAsMjQzOTAsMjQ0MzIsMjQ1MDUsMjQ5MDMsMjQ4OTUsMjQ5MDcsMjQ5NTEsMjQ5MzAsMjQ5MzEsMjQ5MjcsMjQ5MjIsMjQ5MjAsMjQ5NDksMjUxMzAsMjU3MzUsMjU2ODgsMjU2ODQsMjU3NjQsMjU3MjAsMjU2OTUsMjU3MjIsMjU2ODEsMjU3MDMsMjU2NTIsMjU3MDksMjU3MjMsMjU5NzAsMjYwMTcsMjYwNzEsMjYwNzAsMjYyNzQsMjYyODAsMjYyNjksMjcwMzYsMjcwNDgsMjcwMjksMjcwNzMsMjcwNTQsMjcwOTEsMjcwODMsMjcwMzUsMjcwNjMsMjcwNjcsMjcwNTEsMjcwNjAsMjcwODgsMjcwODUsMjcwNTMsMjcwODQsMjcwNDYsMjcwNzUsMjcwNDMsMjc0NjUsMjc0NjgsMjc2OTksMjg0NjcsMjg0MzYsMjg0MTQsMjg0MzUsMjg0MDQsMjg0NTcsMjg0NzgsMjg0NDgsMjg0NjAsMjg0MzEsMjg0MTgsMjg0NTAsMjg0MTUsMjgzOTksMjg0MjIsMjg0NjUsMjg0NzIsMjg0NjYsMjg0NTEsMjg0MzcsMjg0NTksMjg0NjMsMjg1NTIsMjg0NTgsMjgzOTYsMjg0MTcsMjg0MDIsMjgzNjQsMjg0MDcsMjkwNzYsMjkwODEsMjkwNTMsMjkwNjYsMjkwNjAsMjkwNzQsMjkyNDYsMjkzMzAsMjkzMzQsMjk1MDgsMjk1MjAsMjk3OTYsMjk3OTUsMjk4MDIsMjk4MDgsMjk4MDUsMjk5NTYsMzAwOTcsMzAyNDcsMzAyMjEsMzAyMTksMzAyMTcsMzAyMjcsMzA0MzMsMzA0MzUsMzA1OTYsMzA1ODksMzA1OTEsMzA1NjEsMzA5MTMsMzA4NzksMzA4ODcsMzA4OTksMzA4ODksMzA4ODMsMzExMTgsMzExMTksMzExMTcsMzEyNzgsMzEyODEsMzE0MDIsMzE0MDEsMzE0NjksMzE0NzEsMzE2NDksMzE2MzcsMzE2MjcsMzE2MDUsMzE2MzksMzE2NDUsMzE2MzYsMzE2MzEsMzE2NzIsMzE2MjMsMzE2MjAsMzE5MjksMzE5MzMsMzE5MzQsMzIxODcsMzIxNzYsMzIxNTYsMzIxODksMzIxOTAsMzIxNjAsMzIyMDIsMzIxODAsMzIxNzgsMzIxNzcsMzIxODYsMzIxNjIsMzIxOTEsMzIxODEsMzIxODQsMzIxNzMsMzIyMTAsMzIxOTksMzIxNzIsMzI2MjQsMzI3MzYsMzI3MzcsMzI3MzUsMzI4NjIsMzI4NTgsMzI5MDMsMzMxMDQsMzMxNTIsMzMxNjcsMzMxNjAsMzMxNjIsMzMxNTEsMzMxNTQsMzMyNTUsMzMyNzQsMzMyODcsMzMzMDAsMzMzMTAsMzMzNTUsMzM5OTMsMzM5ODMsMzM5OTAsMzM5ODgsMzM5NDUsMzM5NTAsMzM5NzAsMzM5NDgsMzM5OTUsMzM5NzYsMzM5ODQsMzQwMDMsMzM5MzYsMzM5ODAsMzQwMDEsMzM5OTQsMzQ2MjMsMzQ1ODgsMzQ2MTksMzQ1OTQsMzQ1OTcsMzQ2MTIsMzQ1ODQsMzQ2NDUsMzQ2MTUsMzQ2MDEsMzUwNTksMzUwNzQsMzUwNjAsMzUwNjUsMzUwNjQsMzUwNjksMzUwNDgsMzUwOTgsMzUwNTUsMzU0OTQsMzU0NjgsMzU0ODYsMzU0OTEsMzU0NjksMzU0ODksMzU0NzUsMzU0OTIsMzU0OTgsMzU0OTMsMzU0OTYsMzU0ODAsMzU0NzMsMzU0ODIsMzU0OTUsMzU5NDYsMzU5ODEsMzU5ODAsMzYwNTEsMzYwNDksMzYwNTAsMzYyMDMsMzYyNDksMzYyNDUsMzYzNDgsMzY2MjgsMzY2MjYsMzY2MjksMzY2MjcsMzY3NzEsMzY5NjAsMzY5NTIsMzY5NTYsMzY5NjMsMzY5NTMsMzY5NTgsMzY5NjIsMzY5NTcsMzY5NTUsMzcxNDUsMzcxNDQsMzcxNTAsMzcyMzcsMzcyNDAsMzcyMzksMzcyMzYsMzc0OTYsMzc1MDQsMzc1MDksMzc1MjgsMzc1MjYsMzc0OTksMzc1MjMsMzc1MzIsMzc1NDQsMzc1MDAsMzc1MjEsMzgzMDUsMzgzMTIsMzgzMTMsMzgzMDcsMzgzMDksMzgzMDgsMzg1NTMsMzg1NTYsMzg1NTUsMzg2MDQsMzg2MTAsMzg2NTYsMzg3ODAsMzg3ODksMzg5MDIsMzg5MzUsMzg5MzYsMzkwODcsMzkwODksMzkxNzEsMzkxNzMsMzkxODAsMzkxNzcsMzkzNjEsMzk1OTksMzk2MDAsMzk2NTQsMzk3NDUsMzk3NDYsNDAxODAsNDAxODIsNDAxNzksNDA2MzYsNDA3NjMsNDA3NzgsMjA3NDAsMjA3MzYsMjA3MzEsMjA3MjUsMjA3MjksMjA3MzgsMjA3NDQsMjA3NDUsMjA3NDEsMjA5NTYsMjExMjcsMjExMjgsMjExMjksMjExMzMsMjExMzAsMjEyMzIsMjE0MjYsMjIwNjIsMjIwNzUsMjIwNzMsMjIwNjYsMjIwNzksMjIwNjgsMjIwNTcsMjIwOTksMjIwOTQsMjIxMDMsMjIxMzIsMjIwNzAsMjIwNjMsMjIwNjQsMjI2NTYsMjI2ODcsMjI2ODYsMjI3MDcsMjI2ODQsMjI3MDIsMjI2OTcsMjI2OTQsMjI4OTMsMjMzMDUsMjMyOTEsMjMzMDcsMjMyODUsMjMzMDgsMjMzMDQsMjM1MzQsMjM1MzIsMjM1MjksMjM1MzEsMjM2NTIsMjM2NTMsMjM5NjUsMjM5NTYsMjQxNjIsMjQxNTksMjQxNjEsMjQyOTAsMjQyODIsMjQyODcsMjQyODUsMjQyOTEsMjQyODgsMjQzOTIsMjQ0MzMsMjQ1MDMsMjQ1MDEsMjQ5NTAsMjQ5MzUsMjQ5NDIsMjQ5MjUsMjQ5MTcsMjQ5NjIsMjQ5NTYsMjQ5NDQsMjQ5MzksMjQ5NTgsMjQ5OTksMjQ5NzYsMjUwMDMsMjQ5NzQsMjUwMDQsMjQ5ODYsMjQ5OTYsMjQ5ODAsMjUwMDYsMjUxMzQsMjU3MDUsMjU3MTEsMjU3MjEsMjU3NTgsMjU3NzgsMjU3MzYsMjU3NDQsMjU3NzYsMjU3NjUsMjU3NDcsMjU3NDksMjU3NjksMjU3NDYsMjU3NzQsMjU3NzMsMjU3NzEsMjU3NTQsMjU3NzIsMjU3NTMsMjU3NjIsMjU3NzksMjU5NzMsMjU5NzUsMjU5NzYsMjYyODYsMjYyODMsMjYyOTIsMjYyODksMjcxNzEsMjcxNjcsMjcxMTIsMjcxMzcsMjcxNjYsMjcxNjEsMjcxMzMsMjcxNjksMjcxNTUsMjcxNDYsMjcxMjMsMjcxMzgsMjcxNDEsMjcxMTcsMjcxNTMsMjc0NzIsMjc0NzAsMjc1NTYsMjc1ODksMjc1OTAsMjg0NzksMjg1NDAsMjg1NDgsMjg0OTcsMjg1MTgsMjg1MDAsMjg1NTAsMjg1MjUsMjg1MDcsMjg1MzYsMjg1MjYsMjg1NTgsMjg1MzgsMjg1MjgsMjg1MTYsMjg1NjcsMjg1MDQsMjgzNzMsMjg1MjcsMjg1MTIsMjg1MTEsMjkwODcsMjkxMDAsMjkxMDUsMjkwOTYsMjkyNzAsMjkzMzksMjk1MTgsMjk1MjcsMjk4MDEsMjk4MzUsMjk4MjcsMjk4MjIsMjk4MjQsMzAwNzksMzAyNDAsMzAyNDksMzAyMzksMzAyNDQsMzAyNDYsMzAyNDEsMzAyNDIsMzAzNjIsMzAzOTQsMzA0MzYsMzA2MDYsMzA1OTksMzA2MDQsMzA2MDksMzA2MDMsMzA5MjMsMzA5MTcsMzA5MDYsMzA5MjIsMzA5MTAsMzA5MzMsMzA5MDgsMzA5MjgsMzEyOTUsMzEyOTIsMzEyOTYsMzEyOTMsMzEyODcsMzEyOTEsMzE0MDcsMzE0MDYsMzE2NjEsMzE2NjUsMzE2ODQsMzE2NjgsMzE2ODYsMzE2ODcsMzE2ODEsMzE2NDgsMzE2OTIsMzE5NDYsMzIyMjQsMzIyNDQsMzIyMzksMzIyNTEsMzIyMTYsMzIyMzYsMzIyMjEsMzIyMzIsMzIyMjcsMzIyMTgsMzIyMjIsMzIyMzMsMzIxNTgsMzIyMTcsMzIyNDIsMzIyNDksMzI2MjksMzI2MzEsMzI2ODcsMzI3NDUsMzI4MDYsMzMxNzksMzMxODAsMzMxODEsMzMxODQsMzMxNzgsMzMxNzYsMzQwNzEsMzQxMDksMzQwNzQsMzQwMzAsMzQwOTIsMzQwOTMsMzQwNjcsMzQwNjUsMzQwODMsMzQwODEsMzQwNjgsMzQwMjgsMzQwODUsMzQwNDcsMzQwNTQsMzQ2OTAsMzQ2NzYsMzQ2NzgsMzQ2NTYsMzQ2NjIsMzQ2ODAsMzQ2NjQsMzQ2NDksMzQ2NDcsMzQ2MzYsMzQ2NDMsMzQ5MDcsMzQ5MDksMzUwODgsMzUwNzksMzUwOTAsMzUwOTEsMzUwOTMsMzUwODIsMzU1MTYsMzU1MzgsMzU1MjcsMzU1MjQsMzU0NzcsMzU1MzEsMzU1NzYsMzU1MDYsMzU1MjksMzU1MjIsMzU1MTksMzU1MDQsMzU1NDIsMzU1MzMsMzU1MTAsMzU1MTMsMzU1NDcsMzU5MTYsMzU5MTgsMzU5NDgsMzYwNjQsMzYwNjIsMzYwNzAsMzYwNjgsMzYwNzYsMzYwNzcsMzYwNjYsMzYwNjcsMzYwNjAsMzYwNzQsMzYwNjUsMzYyMDUsMzYyNTUsMzYyNTksMzYzOTUsMzYzNjgsMzYzODEsMzYzODYsMzYzNjcsMzYzOTMsMzYzODMsMzYzODUsMzYzODIsMzY1MzgsMzY2MzcsMzY2MzUsMzY2MzksMzY2NDksMzY2NDYsMzY2NTAsMzY2MzYsMzY2MzgsMzY2NDUsMzY5NjksMzY5NzQsMzY5NjgsMzY5NzMsMzY5ODMsMzcxNjgsMzcxNjUsMzcxNTksMzcxNjksMzcyNTUsMzcyNTcsMzcyNTksMzcyNTEsMzc1NzMsMzc1NjMsMzc1NTksMzc2MTAsMzc1NDgsMzc2MDQsMzc1NjksMzc1NTUsMzc1NjQsMzc1ODYsMzc1NzUsMzc2MTYsMzc1NTQsMzgzMTcsMzgzMjEsMzg2NjAsMzg2NjIsMzg2NjMsMzg2NjUsMzg3NTIsMzg3OTcsMzg3OTUsMzg3OTksMzg5NDUsMzg5NTUsMzg5NDAsMzkwOTEsMzkxNzgsMzkxODcsMzkxODYsMzkxOTIsMzkzODksMzkzNzYsMzkzOTEsMzkzODcsMzkzNzcsMzkzODEsMzkzNzgsMzkzODUsMzk2MDcsMzk2NjIsMzk2NjMsMzk3MTksMzk3NDksMzk3NDgsMzk3OTksMzk3OTEsNDAxOTgsNDAyMDEsNDAxOTUsNDA2MTcsNDA2MzgsNDA2NTQsMjI2OTYsNDA3ODYsMjA3NTQsMjA3NjAsMjA3NTYsMjA3NTIsMjA3NTcsMjA4NjQsMjA5MDYsMjA5NTcsMjExMzcsMjExMzksMjEyMzUsMjIxMDUsMjIxMjMsMjIxMzcsMjIxMjEsMjIxMTYsMjIxMzYsMjIxMjIsMjIxMjAsMjIxMTcsMjIxMjksMjIxMjcsMjIxMjQsMjIxMTQsMjIxMzQsMjI3MjEsMjI3MTgsMjI3MjcsMjI3MjUsMjI4OTQsMjMzMjUsMjMzNDgsMjM0MTYsMjM1MzYsMjM1NjYsMjQzOTQsMjUwMTAsMjQ5NzcsMjUwMDEsMjQ5NzAsMjUwMzcsMjUwMTQsMjUwMjIsMjUwMzQsMjUwMzIsMjUxMzYsMjU3OTcsMjU3OTMsMjU4MDMsMjU3ODcsMjU3ODgsMjU4MTgsMjU3OTYsMjU3OTksMjU3OTQsMjU4MDUsMjU3OTEsMjU4MTAsMjU4MTIsMjU3OTAsMjU5NzIsMjYzMTAsMjYzMTMsMjYyOTcsMjYzMDgsMjYzMTEsMjYyOTYsMjcxOTcsMjcxOTIsMjcxOTQsMjcyMjUsMjcyNDMsMjcyMjQsMjcxOTMsMjcyMDQsMjcyMzQsMjcyMzMsMjcyMTEsMjcyMDcsMjcxODksMjcyMzEsMjcyMDgsMjc0ODEsMjc1MTEsMjc2NTMsMjg2MTAsMjg1OTMsMjg1NzcsMjg2MTEsMjg1ODAsMjg2MDksMjg1ODMsMjg1OTUsMjg2MDgsMjg2MDEsMjg1OTgsMjg1ODIsMjg1NzYsMjg1OTYsMjkxMTgsMjkxMjksMjkxMzYsMjkxMzgsMjkxMjgsMjkxNDEsMjkxMTMsMjkxMzQsMjkxNDUsMjkxNDgsMjkxMjMsMjkxMjQsMjk1NDQsMjk4NTIsMjk4NTksMjk4NDgsMjk4NTUsMjk4NTQsMjk5MjIsMjk5NjQsMjk5NjUsMzAyNjAsMzAyNjQsMzAyNjYsMzA0MzksMzA0MzcsMzA2MjQsMzA2MjIsMzA2MjMsMzA2MjksMzA5NTIsMzA5MzgsMzA5NTYsMzA5NTEsMzExNDIsMzEzMDksMzEzMTAsMzEzMDIsMzEzMDgsMzEzMDcsMzE0MTgsMzE3MDUsMzE3NjEsMzE2ODksMzE3MTYsMzE3MDcsMzE3MTMsMzE3MjEsMzE3MTgsMzE5NTcsMzE5NTgsMzIyNjYsMzIyNzMsMzIyNjQsMzIyODMsMzIyOTEsMzIyODYsMzIyODUsMzIyNjUsMzIyNzIsMzI2MzMsMzI2OTAsMzI3NTIsMzI3NTMsMzI3NTAsMzI4MDgsMzMyMDMsMzMxOTMsMzMxOTIsMzMyNzUsMzMyODgsMzMzNjgsMzMzNjksMzQxMjIsMzQxMzcsMzQxMjAsMzQxNTIsMzQxNTMsMzQxMTUsMzQxMjEsMzQxNTcsMzQxNTQsMzQxNDIsMzQ2OTEsMzQ3MTksMzQ3MTgsMzQ3MjIsMzQ3MDEsMzQ5MTMsMzUxMTQsMzUxMjIsMzUxMDksMzUxMTUsMzUxMDUsMzUyNDIsMzUyMzgsMzU1NTgsMzU1NzgsMzU1NjMsMzU1NjksMzU1ODQsMzU1NDgsMzU1NTksMzU1NjYsMzU1ODIsMzU1ODUsMzU1ODYsMzU1NzUsMzU1NjUsMzU1NzEsMzU1NzQsMzU1ODAsMzU5NDcsMzU5NDksMzU5ODcsMzYwODQsMzY0MjAsMzY0MDEsMzY0MDQsMzY0MTgsMzY0MDksMzY0MDUsMzY2NjcsMzY2NTUsMzY2NjQsMzY2NTksMzY3NzYsMzY3NzQsMzY5ODEsMzY5ODAsMzY5ODQsMzY5NzgsMzY5ODgsMzY5ODYsMzcxNzIsMzcyNjYsMzc2NjQsMzc2ODYsMzc2MjQsMzc2ODMsMzc2NzksMzc2NjYsMzc2MjgsMzc2NzUsMzc2MzYsMzc2NTgsMzc2NDgsMzc2NzAsMzc2NjUsMzc2NTMsMzc2NzgsMzc2NTcsMzgzMzEsMzg1NjcsMzg1NjgsMzg1NzAsMzg2MTMsMzg2NzAsMzg2NzMsMzg2NzgsMzg2NjksMzg2NzUsMzg2NzEsMzg3NDcsMzg3NDgsMzg3NTgsMzg4MDgsMzg5NjAsMzg5NjgsMzg5NzEsMzg5NjcsMzg5NTcsMzg5NjksMzg5NDgsMzkxODQsMzkyMDgsMzkxOTgsMzkxOTUsMzkyMDEsMzkxOTQsMzk0MDUsMzkzOTQsMzk0MDksMzk2MDgsMzk2MTIsMzk2NzUsMzk2NjEsMzk3MjAsMzk4MjUsNDAyMTMsNDAyMjcsNDAyMzAsNDAyMzIsNDAyMTAsNDAyMTksNDA2NjQsNDA2NjAsNDA4NDUsNDA4NjAsMjA3NzgsMjA3NjcsMjA3NjksMjA3ODYsMjEyMzcsMjIxNTgsMjIxNDQsMjIxNjAsMjIxNDksMjIxNTEsMjIxNTksMjI3NDEsMjI3MzksMjI3MzcsMjI3MzQsMjMzNDQsMjMzMzgsMjMzMzIsMjM0MTgsMjM2MDcsMjM2NTYsMjM5OTYsMjM5OTQsMjM5OTcsMjM5OTIsMjQxNzEsMjQzOTYsMjQ1MDksMjUwMzMsMjUwMjYsMjUwMzEsMjUwNjIsMjUwMzUsMjUxMzgsMjUxNDAsMjU4MDYsMjU4MDIsMjU4MTYsMjU4MjQsMjU4NDAsMjU4MzAsMjU4MzYsMjU4NDEsMjU4MjYsMjU4MzcsMjU5ODYsMjU5ODcsMjYzMjksMjYzMjYsMjcyNjQsMjcyODQsMjcyNjgsMjcyOTgsMjcyOTIsMjczNTUsMjcyOTksMjcyNjIsMjcyODcsMjcyODAsMjcyOTYsMjc0ODQsMjc1NjYsMjc2MTAsMjc2NTYsMjg2MzIsMjg2NTcsMjg2MzksMjg2NDAsMjg2MzUsMjg2NDQsMjg2NTEsMjg2NTUsMjg1NDQsMjg2NTIsMjg2NDEsMjg2NDksMjg2MjksMjg2NTQsMjg2NTYsMjkxNTksMjkxNTEsMjkxNjYsMjkxNTgsMjkxNTcsMjkxNjUsMjkxNjQsMjkxNzIsMjkxNTIsMjkyMzcsMjkyNTQsMjk1NTIsMjk1NTQsMjk4NjUsMjk4NzIsMjk4NjIsMjk4NjQsMzAyNzgsMzAyNzQsMzAyODQsMzA0NDIsMzA2NDMsMzA2MzQsMzA2NDAsMzA2MzYsMzA2MzEsMzA2MzcsMzA3MDMsMzA5NjcsMzA5NzAsMzA5NjQsMzA5NTksMzA5NzcsMzExNDMsMzExNDYsMzEzMTksMzE0MjMsMzE3NTEsMzE3NTcsMzE3NDIsMzE3MzUsMzE3NTYsMzE3MTIsMzE5NjgsMzE5NjQsMzE5NjYsMzE5NzAsMzE5NjcsMzE5NjEsMzE5NjUsMzIzMDIsMzIzMTgsMzIzMjYsMzIzMTEsMzIzMDYsMzIzMjMsMzIyOTksMzIzMTcsMzIzMDUsMzIzMjUsMzIzMjEsMzIzMDgsMzIzMTMsMzIzMjgsMzIzMDksMzIzMTksMzIzMDMsMzI1ODAsMzI3NTUsMzI3NjQsMzI4ODEsMzI4ODIsMzI4ODAsMzI4NzksMzI4ODMsMzMyMjIsMzMyMTksMzMyMTAsMzMyMTgsMzMyMTYsMzMyMTUsMzMyMTMsMzMyMjUsMzMyMTQsMzMyNTYsMzMyODksMzMzOTMsMzQyMTgsMzQxODAsMzQxNzQsMzQyMDQsMzQxOTMsMzQxOTYsMzQyMjMsMzQyMDMsMzQxODMsMzQyMTYsMzQxODYsMzQ0MDcsMzQ3NTIsMzQ3NjksMzQ3MzksMzQ3NzAsMzQ3NTgsMzQ3MzEsMzQ3NDcsMzQ3NDYsMzQ3NjAsMzQ3NjMsMzUxMzEsMzUxMjYsMzUxNDAsMzUxMjgsMzUxMzMsMzUyNDQsMzU1OTgsMzU2MDcsMzU2MDksMzU2MTEsMzU1OTQsMzU2MTYsMzU2MTMsMzU1ODgsMzU2MDAsMzU5MDUsMzU5MDMsMzU5NTUsMzYwOTAsMzYwOTMsMzYwOTIsMzYwODgsMzYwOTEsMzYyNjQsMzY0MjUsMzY0MjcsMzY0MjQsMzY0MjYsMzY2NzYsMzY2NzAsMzY2NzQsMzY2NzcsMzY2NzEsMzY5OTEsMzY5ODksMzY5OTYsMzY5OTMsMzY5OTQsMzY5OTIsMzcxNzcsMzcyODMsMzcyNzgsMzcyNzYsMzc3MDksMzc3NjIsMzc2NzIsMzc3NDksMzc3MDYsMzc3MzMsMzc3MDcsMzc2NTYsMzc3NTgsMzc3NDAsMzc3MjMsMzc3NDQsMzc3MjIsMzc3MTYsMzgzNDYsMzgzNDcsMzgzNDgsMzgzNDQsMzgzNDIsMzg1NzcsMzg1ODQsMzg2MTQsMzg2ODQsMzg2ODYsMzg4MTYsMzg4NjcsMzg5ODIsMzkwOTQsMzkyMjEsMzk0MjUsMzk0MjMsMzk4NTQsMzk4NTEsMzk4NTAsMzk4NTMsNDAyNTEsNDAyNTUsNDA1ODcsNDA2NTUsNDA2NzAsNDA2NjgsNDA2NjksNDA2NjcsNDA3NjYsNDA3NzksMjE0NzQsMjIxNjUsMjIxOTAsMjI3NDUsMjI3NDQsMjMzNTIsMjQ0MTMsMjUwNTksMjUxMzksMjU4NDQsMjU4NDIsMjU4NTQsMjU4NjIsMjU4NTAsMjU4NTEsMjU4NDcsMjYwMzksMjYzMzIsMjY0MDYsMjczMTUsMjczMDgsMjczMzEsMjczMjMsMjczMjAsMjczMzAsMjczMTAsMjczMTEsMjc0ODcsMjc1MTIsMjc1NjcsMjg2ODEsMjg2ODMsMjg2NzAsMjg2NzgsMjg2NjYsMjg2ODksMjg2ODcsMjkxNzksMjkxODAsMjkxODIsMjkxNzYsMjk1NTksMjk1NTcsMjk4NjMsMjk4ODcsMjk5NzMsMzAyOTQsMzAyOTYsMzAyOTAsMzA2NTMsMzA2NTUsMzA2NTEsMzA2NTIsMzA5OTAsMzExNTAsMzEzMjksMzEzMzAsMzEzMjgsMzE0MjgsMzE0MjksMzE3ODcsMzE3ODMsMzE3ODYsMzE3NzQsMzE3NzksMzE3NzcsMzE5NzUsMzIzNDAsMzIzNDEsMzIzNTAsMzIzNDYsMzIzNTMsMzIzMzgsMzIzNDUsMzI1ODQsMzI3NjEsMzI3NjMsMzI4ODcsMzI4ODYsMzMyMjksMzMyMzEsMzMyOTAsMzQyNTUsMzQyMTcsMzQyNTMsMzQyNTYsMzQyNDksMzQyMjQsMzQyMzQsMzQyMzMsMzQyMTQsMzQ3OTksMzQ3OTYsMzQ4MDIsMzQ3ODQsMzUyMDYsMzUyNTAsMzUzMTYsMzU2MjQsMzU2NDEsMzU2MjgsMzU2MjcsMzU5MjAsMzYxMDEsMzY0NDEsMzY0NTEsMzY0NTQsMzY0NTIsMzY0NDcsMzY0MzcsMzY1NDQsMzY2ODEsMzY2ODUsMzY5OTksMzY5OTUsMzcwMDAsMzcyOTEsMzcyOTIsMzczMjgsMzc3ODAsMzc3NzAsMzc3ODIsMzc3OTQsMzc4MTEsMzc4MDYsMzc4MDQsMzc4MDgsMzc3ODQsMzc3ODYsMzc3ODMsMzgzNTYsMzgzNTgsMzgzNTIsMzgzNTcsMzg2MjYsMzg2MjAsMzg2MTcsMzg2MTksMzg2MjIsMzg2OTIsMzg4MTksMzg4MjIsMzg4MjksMzg5MDUsMzg5ODksMzg5OTEsMzg5ODgsMzg5OTAsMzg5OTUsMzkwOTgsMzkyMzAsMzkyMzEsMzkyMjksMzkyMTQsMzkzMzMsMzk0MzgsMzk2MTcsMzk2ODMsMzk2ODYsMzk3NTksMzk3NTgsMzk3NTcsMzk4ODIsMzk4ODEsMzk5MzMsMzk4ODAsMzk4NzIsNDAyNzMsNDAyODUsNDAyODgsNDA2NzIsNDA3MjUsNDA3NDgsMjA3ODcsMjIxODEsMjI3NTAsMjI3NTEsMjI3NTQsMjM1NDEsNDA4NDgsMjQzMDAsMjUwNzQsMjUwNzksMjUwNzgsMjUwNzcsMjU4NTYsMjU4NzEsMjYzMzYsMjYzMzMsMjczNjUsMjczNTcsMjczNTQsMjczNDcsMjg2OTksMjg3MDMsMjg3MTIsMjg2OTgsMjg3MDEsMjg2OTMsMjg2OTYsMjkxOTAsMjkxOTcsMjkyNzIsMjkzNDYsMjk1NjAsMjk1NjIsMjk4ODUsMjk4OTgsMjk5MjMsMzAwODcsMzAwODYsMzAzMDMsMzAzMDUsMzA2NjMsMzEwMDEsMzExNTMsMzEzMzksMzEzMzcsMzE4MDYsMzE4MDcsMzE4MDAsMzE4MDUsMzE3OTksMzE4MDgsMzIzNjMsMzIzNjUsMzIzNzcsMzIzNjEsMzIzNjIsMzI2NDUsMzIzNzEsMzI2OTQsMzI2OTcsMzI2OTYsMzMyNDAsMzQyODEsMzQyNjksMzQyODIsMzQyNjEsMzQyNzYsMzQyNzcsMzQyOTUsMzQ4MTEsMzQ4MjEsMzQ4MjksMzQ4MDksMzQ4MTQsMzUxNjgsMzUxNjcsMzUxNTgsMzUxNjYsMzU2NDksMzU2NzYsMzU2NzIsMzU2NTcsMzU2NzQsMzU2NjIsMzU2NjMsMzU2NTQsMzU2NzMsMzYxMDQsMzYxMDYsMzY0NzYsMzY0NjYsMzY0ODcsMzY0NzAsMzY0NjAsMzY0NzQsMzY0NjgsMzY2OTIsMzY2ODYsMzY3ODEsMzcwMDIsMzcwMDMsMzcyOTcsMzcyOTQsMzc4NTcsMzc4NDEsMzc4NTUsMzc4MjcsMzc4MzIsMzc4NTIsMzc4NTMsMzc4NDYsMzc4NTgsMzc4MzcsMzc4NDgsMzc4NjAsMzc4NDcsMzc4NjQsMzgzNjQsMzg1ODAsMzg2MjcsMzg2OTgsMzg2OTUsMzg3NTMsMzg4NzYsMzg5MDcsMzkwMDYsMzkwMDAsMzkwMDMsMzkxMDAsMzkyMzcsMzkyNDEsMzk0NDYsMzk0NDksMzk2OTMsMzk5MTIsMzk5MTEsMzk4OTQsMzk4OTksNDAzMjksNDAyODksNDAzMDYsNDAyOTgsNDAzMDAsNDA1OTQsNDA1OTksNDA1OTUsNDA2MjgsMjEyNDAsMjIxODQsMjIxOTksMjIxOTgsMjIxOTYsMjIyMDQsMjI3NTYsMjMzNjAsMjMzNjMsMjM0MjEsMjM1NDIsMjQwMDksMjUwODAsMjUwODIsMjU4ODAsMjU4NzYsMjU4ODEsMjYzNDIsMjY0MDcsMjczNzIsMjg3MzQsMjg3MjAsMjg3MjIsMjkyMDAsMjk1NjMsMjk5MDMsMzAzMDYsMzAzMDksMzEwMTQsMzEwMTgsMzEwMjAsMzEwMTksMzE0MzEsMzE0NzgsMzE4MjAsMzE4MTEsMzE4MjEsMzE5ODMsMzE5ODQsMzY3ODIsMzIzODEsMzIzODAsMzIzODYsMzI1ODgsMzI3NjgsMzMyNDIsMzMzODIsMzQyOTksMzQyOTcsMzQzMjEsMzQyOTgsMzQzMTAsMzQzMTUsMzQzMTEsMzQzMTQsMzQ4MzYsMzQ4MzcsMzUxNzIsMzUyNTgsMzUzMjAsMzU2OTYsMzU2OTIsMzU2ODYsMzU2OTUsMzU2NzksMzU2OTEsMzYxMTEsMzYxMDksMzY0ODksMzY0ODEsMzY0ODUsMzY0ODIsMzczMDAsMzczMjMsMzc5MTIsMzc4OTEsMzc4ODUsMzgzNjksMzg3MDQsMzkxMDgsMzkyNTAsMzkyNDksMzkzMzYsMzk0NjcsMzk0NzIsMzk0NzksMzk0NzcsMzk5NTUsMzk5NDksNDA1NjksNDA2MjksNDA2ODAsNDA3NTEsNDA3OTksNDA4MDMsNDA4MDEsMjA3OTEsMjA3OTIsMjIyMDksMjIyMDgsMjIyMTAsMjI4MDQsMjM2NjAsMjQwMTMsMjUwODQsMjUwODYsMjU4ODUsMjU4ODQsMjYwMDUsMjYzNDUsMjczODcsMjczOTYsMjczODYsMjc1NzAsMjg3NDgsMjkyMTEsMjkzNTEsMjk5MTAsMjk5MDgsMzAzMTMsMzA2NzUsMzE4MjQsMzIzOTksMzIzOTYsMzI3MDAsMzQzMjcsMzQzNDksMzQzMzAsMzQ4NTEsMzQ4NTAsMzQ4NDksMzQ4NDcsMzUxNzgsMzUxODAsMzUyNjEsMzU3MDAsMzU3MDMsMzU3MDksMzYxMTUsMzY0OTAsMzY0OTMsMzY0OTEsMzY3MDMsMzY3ODMsMzczMDYsMzc5MzQsMzc5MzksMzc5NDEsMzc5NDYsMzc5NDQsMzc5MzgsMzc5MzEsMzgzNzAsMzg3MTIsMzg3MTMsMzg3MDYsMzg5MTEsMzkwMTUsMzkwMTMsMzkyNTUsMzk0OTMsMzk0OTEsMzk0ODgsMzk0ODYsMzk2MzEsMzk3NjQsMzk3NjEsMzk5ODEsMzk5NzMsNDAzNjcsNDAzNzIsNDAzODYsNDAzNzYsNDA2MDUsNDA2ODcsNDA3MjksNDA3OTYsNDA4MDYsNDA4MDcsMjA3OTYsMjA3OTUsMjIyMTYsMjIyMTgsMjIyMTcsMjM0MjMsMjQwMjAsMjQwMTgsMjQzOTgsMjUwODcsMjU4OTIsMjc0MDIsMjc0ODksMjg3NTMsMjg3NjAsMjk1NjgsMjk5MjQsMzAwOTAsMzAzMTgsMzAzMTYsMzExNTUsMzE4NDAsMzE4MzksMzI4OTQsMzI4OTMsMzMyNDcsMzUxODYsMzUxODMsMzUzMjQsMzU3MTIsMzYxMTgsMzYxMTksMzY0OTcsMzY0OTksMzY3MDUsMzcxOTIsMzc5NTYsMzc5NjksMzc5NzAsMzg3MTcsMzg3MTgsMzg4NTEsMzg4NDksMzkwMTksMzkyNTMsMzk1MDksMzk1MDEsMzk2MzQsMzk3MDYsNDAwMDksMzk5ODUsMzk5OTgsMzk5OTUsNDA0MDMsNDA0MDcsNDA3NTYsNDA4MTIsNDA4MTAsNDA4NTIsMjIyMjAsMjQwMjIsMjUwODgsMjU4OTEsMjU4OTksMjU4OTgsMjYzNDgsMjc0MDgsMjk5MTQsMzE0MzQsMzE4NDQsMzE4NDMsMzE4NDUsMzI0MDMsMzI0MDYsMzI0MDQsMzMyNTAsMzQzNjAsMzQzNjcsMzQ4NjUsMzU3MjIsMzcwMDgsMzcwMDcsMzc5ODcsMzc5ODQsMzc5ODgsMzg3NjAsMzkwMjMsMzkyNjAsMzk1MTQsMzk1MTUsMzk1MTEsMzk2MzUsMzk2MzYsMzk2MzMsNDAwMjAsNDAwMjMsNDAwMjIsNDA0MjEsNDA2MDcsNDA2OTIsMjIyMjUsMjI3NjEsMjU5MDAsMjg3NjYsMzAzMjEsMzAzMjIsMzA2NzksMzI1OTIsMzI2NDgsMzQ4NzAsMzQ4NzMsMzQ5MTQsMzU3MzEsMzU3MzAsMzU3MzQsMzMzOTksMzYxMjMsMzczMTIsMzc5OTQsMzg3MjIsMzg3MjgsMzg3MjQsMzg4NTQsMzkwMjQsMzk1MTksMzk3MTQsMzk3NjgsNDAwMzEsNDA0NDEsNDA0NDIsNDA1NzIsNDA1NzMsNDA3MTEsNDA4MjMsNDA4MTgsMjQzMDcsMjc0MTQsMjg3NzEsMzE4NTIsMzE4NTQsMzQ4NzUsMzUyNjQsMzY1MTMsMzczMTMsMzgwMDIsMzgwMDAsMzkwMjUsMzkyNjIsMzk2MzgsMzk3MTUsNDA2NTIsMjg3NzIsMzA2ODIsMzU3MzgsMzgwMDcsMzg4NTcsMzk1MjIsMzk1MjUsMzI0MTIsMzU3NDAsMzY1MjIsMzczMTcsMzgwMTMsMzgwMTQsMzgwMTIsNDAwNTUsNDAwNTYsNDA2OTUsMzU5MjQsMzgwMTUsNDA0NzQsMjkyMjQsMzk1MzAsMzk3MjksNDA0NzUsNDA0NzgsMzE4NTgsOTMxMiw5MzEzLDkzMTQsOTMxNSw5MzE2LDkzMTcsOTMxOCw5MzE5LDkzMjAsOTMyMSw5MzMyLDkzMzMsOTMzNCw5MzM1LDkzMzYsOTMzNyw5MzM4LDkzMzksOTM0MCw5MzQxLDg1NjAsODU2MSw4NTYyLDg1NjMsODU2NCw4NTY1LDg1NjYsODU2Nyw4NTY4LDg1NjksMjAwMjIsMjAwMzEsMjAxMDEsMjAxMjgsMjA4NjYsMjA4ODYsMjA5MDcsMjEyNDEsMjEzMDQsMjEzNTMsMjE0MzAsMjI3OTQsMjM0MjQsMjQwMjcsMTIwODMsMjQxOTEsMjQzMDgsMjQ0MDAsMjQ0MTcsMjU5MDgsMjYwODAsMzAwOTgsMzAzMjYsMzY3ODksMzg1ODIsMTY4LDcxMCwxMjU0MSwxMjU0MiwxMjQ0NSwxMjQ0NiwxMjI5MSwyMDE4OSwxMjI5MywxMjI5NCwxMjI5NSwxMjU0MCw2NTMzOSw2NTM0MSwxMDA0NSwxMjM1MywxMjM1NCwxMjM1NSwxMjM1NiwxMjM1NywxMjM1OCwxMjM1OSwxMjM2MCwxMjM2MSwxMjM2MiwxMjM2MywxMjM2NCwxMjM2NSwxMjM2NiwxMjM2NywxMjM2OCwxMjM2OSwxMjM3MCwxMjM3MSwxMjM3MiwxMjM3MywxMjM3NCwxMjM3NSwxMjM3NiwxMjM3NywxMjM3OCwxMjM3OSwxMjM4MCwxMjM4MSwxMjM4MiwxMjM4MywxMjM4NCwxMjM4NSwxMjM4NiwxMjM4NywxMjM4OCwxMjM4OSwxMjM5MCwxMjM5MSwxMjM5MiwxMjM5MywxMjM5NCwxMjM5NSwxMjM5NiwxMjM5NywxMjM5OCwxMjM5OSwxMjQwMCwxMjQwMSwxMjQwMiwxMjQwMywxMjQwNCwxMjQwNSwxMjQwNiwxMjQwNywxMjQwOCwxMjQwOSwxMjQxMCwxMjQxMSwxMjQxMiwxMjQxMywxMjQxNCwxMjQxNSwxMjQxNiwxMjQxNywxMjQxOCwxMjQxOSwxMjQyMCwxMjQyMSwxMjQyMiwxMjQyMywxMjQyNCwxMjQyNSwxMjQyNiwxMjQyNywxMjQyOCwxMjQyOSwxMjQzMCwxMjQzMSwxMjQzMiwxMjQzMywxMjQzNCwxMjQzNSwxMjQ0OSwxMjQ1MCwxMjQ1MSwxMjQ1MiwxMjQ1MywxMjQ1NCwxMjQ1NSwxMjQ1NiwxMjQ1NywxMjQ1OCwxMjQ1OSwxMjQ2MCwxMjQ2MSwxMjQ2MiwxMjQ2MywxMjQ2NCwxMjQ2NSwxMjQ2NiwxMjQ2NywxMjQ2OCwxMjQ2OSwxMjQ3MCwxMjQ3MSwxMjQ3MiwxMjQ3MywxMjQ3NCwxMjQ3NSwxMjQ3NiwxMjQ3NywxMjQ3OCwxMjQ3OSwxMjQ4MCwxMjQ4MSwxMjQ4MiwxMjQ4MywxMjQ4NCwxMjQ4NSwxMjQ4NiwxMjQ4NywxMjQ4OCwxMjQ4OSwxMjQ5MCwxMjQ5MSwxMjQ5MiwxMjQ5MywxMjQ5NCwxMjQ5NSwxMjQ5NiwxMjQ5NywxMjQ5OCwxMjQ5OSwxMjUwMCwxMjUwMSwxMjUwMiwxMjUwMywxMjUwNCwxMjUwNSwxMjUwNiwxMjUwNywxMjUwOCwxMjUwOSwxMjUxMCwxMjUxMSwxMjUxMiwxMjUxMywxMjUxNCwxMjUxNSwxMjUxNiwxMjUxNywxMjUxOCwxMjUxOSwxMjUyMCwxMjUyMSwxMjUyMiwxMjUyMywxMjUyNCwxMjUyNSwxMjUyNiwxMjUyNywxMjUyOCwxMjUyOSwxMjUzMCwxMjUzMSwxMjUzMiwxMjUzMywxMjUzNCwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDI1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMTA1LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMyw4Njc5LDg2MzIsODYzMywxMjc1MSwxMzEyNzYsMjAwNTgsMTMxMjEwLDIwOTk0LDE3NTUzLDQwODgwLDIwODcyLDQwODgxLDE2MTI4NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDY1NTA2LDY1NTA4LDY1Mjg3LDY1MjgyLDEyODQ5LDg0NzAsODQ4MSwxMjQ0MywxMjQ0NCwxMTkwNCwxMTkwOCwxMTkxMCwxMTkxMSwxMTkxMiwxMTkxNCwxMTkxNiwxMTkxNywxMTkyNSwxMTkzMiwxMTkzMywxMTk0MSwxMTk0MywxMTk0NiwxMTk0OCwxMTk1MCwxMTk1OCwxMTk2NCwxMTk2NiwxMTk3NCwxMTk3OCwxMTk4MCwxMTk4MSwxMTk4MywxMTk5MCwxMTk5MSwxMTk5OCwxMjAwMyxudWxsLG51bGwsbnVsbCw2NDMsNTkyLDYwMyw1OTYsNjI5LDMzOSwyNDgsMzMxLDY1MCw2MTgsMjAwMzQsMjAwNjAsMjA5ODEsMjEyNzQsMjEzNzgsMTk5NzUsMTk5ODAsMjAwMzksMjAxMDksMjIyMzEsNjQwMTIsMjM2NjIsMjQ0MzUsMTk5ODMsMjA4NzEsMTk5ODIsMjAwMTQsMjAxMTUsMjAxNjIsMjAxNjksMjAxNjgsMjA4ODgsMjEyNDQsMjEzNTYsMjE0MzMsMjIzMDQsMjI3ODcsMjI4MjgsMjM1NjgsMjQwNjMsMjYwODEsMjc1NzEsMjc1OTYsMjc2NjgsMjkyNDcsMjAwMTcsMjAwMjgsMjAyMDAsMjAxODgsMjAyMDEsMjAxOTMsMjAxODksMjAxODYsMjEwMDQsMjEyNzYsMjEzMjQsMjIzMDYsMjIzMDcsMjI4MDcsMjI4MzEsMjM0MjUsMjM0MjgsMjM1NzAsMjM2MTEsMjM2NjgsMjM2NjcsMjQwNjgsMjQxOTIsMjQxOTQsMjQ1MjEsMjUwOTcsMjUxNjgsMjc2NjksMjc3MDIsMjc3MTUsMjc3MTEsMjc3MDcsMjkzNTgsMjkzNjAsMjk1NzgsMzExNjAsMzI5MDYsMzg0MzAsMjAyMzgsMjAyNDgsMjAyNjgsMjAyMTMsMjAyNDQsMjAyMDksMjAyMjQsMjAyMTUsMjAyMzIsMjAyNTMsMjAyMjYsMjAyMjksMjAyNTgsMjAyNDMsMjAyMjgsMjAyMTIsMjAyNDIsMjA5MTMsMjEwMTEsMjEwMDEsMjEwMDgsMjExNTgsMjEyODIsMjEyNzksMjEzMjUsMjEzODYsMjE1MTEsMjIyNDEsMjIyMzksMjIzMTgsMjIzMTQsMjIzMjQsMjI4NDQsMjI5MTIsMjI5MDgsMjI5MTcsMjI5MDcsMjI5MTAsMjI5MDMsMjI5MTEsMjMzODIsMjM1NzMsMjM1ODksMjM2NzYsMjM2NzQsMjM2NzUsMjM2NzgsMjQwMzEsMjQxODEsMjQxOTYsMjQzMjIsMjQzNDYsMjQ0MzYsMjQ1MzMsMjQ1MzIsMjQ1MjcsMjUxODAsMjUxODIsMjUxODgsMjUxODUsMjUxOTAsMjUxODYsMjUxNzcsMjUxODQsMjUxNzgsMjUxODksMjYwOTUsMjYwOTQsMjY0MzAsMjY0MjUsMjY0MjQsMjY0MjcsMjY0MjYsMjY0MzEsMjY0MjgsMjY0MTksMjc2NzIsMjc3MTgsMjc3MzAsMjc3NDAsMjc3MjcsMjc3MjIsMjc3MzIsMjc3MjMsMjc3MjQsMjg3ODUsMjkyNzgsMjkzNjQsMjkzNjUsMjk1ODIsMjk5OTQsMzAzMzUsMzEzNDksMzI1OTMsMzM0MDAsMzM0MDQsMzM0MDgsMzM0MDUsMzM0MDcsMzQzODEsMzUxOTgsMzcwMTcsMzcwMTUsMzcwMTYsMzcwMTksMzcwMTIsMzg0MzQsMzg0MzYsMzg0MzIsMzg0MzUsMjAzMTAsMjAyODMsMjAzMjIsMjAyOTcsMjAzMDcsMjAzMjQsMjAyODYsMjAzMjcsMjAzMDYsMjAzMTksMjAyODksMjAzMTIsMjAyNjksMjAyNzUsMjAyODcsMjAzMjEsMjA4NzksMjA5MjEsMjEwMjAsMjEwMjIsMjEwMjUsMjExNjUsMjExNjYsMjEyNTcsMjEzNDcsMjEzNjIsMjEzOTAsMjEzOTEsMjE1NTIsMjE1NTksMjE1NDYsMjE1ODgsMjE1NzMsMjE1MjksMjE1MzIsMjE1NDEsMjE1MjgsMjE1NjUsMjE1ODMsMjE1NjksMjE1NDQsMjE1NDAsMjE1NzUsMjIyNTQsMjIyNDcsMjIyNDUsMjIzMzcsMjIzNDEsMjIzNDgsMjIzNDUsMjIzNDcsMjIzNTQsMjI3OTAsMjI4NDgsMjI5NTAsMjI5MzYsMjI5NDQsMjI5MzUsMjI5MjYsMjI5NDYsMjI5MjgsMjI5MjcsMjI5NTEsMjI5NDUsMjM0MzgsMjM0NDIsMjM1OTIsMjM1OTQsMjM2OTMsMjM2OTUsMjM2ODgsMjM2OTEsMjM2ODksMjM2OTgsMjM2OTAsMjM2ODYsMjM2OTksMjM3MDEsMjQwMzIsMjQwNzQsMjQwNzgsMjQyMDMsMjQyMDEsMjQyMDQsMjQyMDAsMjQyMDUsMjQzMjUsMjQzNDksMjQ0NDAsMjQ0MzgsMjQ1MzAsMjQ1MjksMjQ1MjgsMjQ1NTcsMjQ1NTIsMjQ1NTgsMjQ1NjMsMjQ1NDUsMjQ1NDgsMjQ1NDcsMjQ1NzAsMjQ1NTksMjQ1NjcsMjQ1NzEsMjQ1NzYsMjQ1NjQsMjUxNDYsMjUyMTksMjUyMjgsMjUyMzAsMjUyMzEsMjUyMzYsMjUyMjMsMjUyMDEsMjUyMTEsMjUyMTAsMjUyMDAsMjUyMTcsMjUyMjQsMjUyMDcsMjUyMTMsMjUyMDIsMjUyMDQsMjU5MTEsMjYwOTYsMjYxMDAsMjYwOTksMjYwOTgsMjYxMDEsMjY0MzcsMjY0MzksMjY0NTcsMjY0NTMsMjY0NDQsMjY0NDAsMjY0NjEsMjY0NDUsMjY0NTgsMjY0NDMsMjc2MDAsMjc2NzMsMjc2NzQsMjc3NjgsMjc3NTEsMjc3NTUsMjc3ODAsMjc3ODcsMjc3OTEsMjc3NjEsMjc3NTksMjc3NTMsMjc4MDIsMjc3NTcsMjc3ODMsMjc3OTcsMjc4MDQsMjc3NTAsMjc3NjMsMjc3NDksMjc3NzEsMjc3OTAsMjg3ODgsMjg3OTQsMjkyODMsMjkzNzUsMjkzNzMsMjkzNzksMjkzODIsMjkzNzcsMjkzNzAsMjkzODEsMjk1ODksMjk1OTEsMjk1ODcsMjk1ODgsMjk1ODYsMzAwMTAsMzAwMDksMzAxMDAsMzAxMDEsMzAzMzcsMzEwMzcsMzI4MjAsMzI5MTcsMzI5MjEsMzI5MTIsMzI5MTQsMzI5MjQsMzM0MjQsMzM0MjMsMzM0MTMsMzM0MjIsMzM0MjUsMzM0MjcsMzM0MTgsMzM0MTEsMzM0MTIsMzU5NjAsMzY4MDksMzY3OTksMzcwMjMsMzcwMjUsMzcwMjksMzcwMjIsMzcwMzEsMzcwMjQsMzg0NDgsMzg0NDAsMzg0NDcsMzg0NDUsMjAwMTksMjAzNzYsMjAzNDgsMjAzNTcsMjAzNDksMjAzNTIsMjAzNTksMjAzNDIsMjAzNDAsMjAzNjEsMjAzNTYsMjAzNDMsMjAzMDAsMjAzNzUsMjAzMzAsMjAzNzgsMjAzNDUsMjAzNTMsMjAzNDQsMjAzNjgsMjAzODAsMjAzNzIsMjAzODIsMjAzNzAsMjAzNTQsMjAzNzMsMjAzMzEsMjAzMzQsMjA4OTQsMjA5MjQsMjA5MjYsMjEwNDUsMjEwNDIsMjEwNDMsMjEwNjIsMjEwNDEsMjExODAsMjEyNTgsMjEyNTksMjEzMDgsMjEzOTQsMjEzOTYsMjE2MzksMjE2MzEsMjE2MzMsMjE2NDksMjE2MzQsMjE2NDAsMjE2MTEsMjE2MjYsMjE2MzAsMjE2MDUsMjE2MTIsMjE2MjAsMjE2MDYsMjE2NDUsMjE2MTUsMjE2MDEsMjE2MDAsMjE2NTYsMjE2MDMsMjE2MDcsMjE2MDQsMjIyNjMsMjIyNjUsMjIzODMsMjIzODYsMjIzODEsMjIzNzksMjIzODUsMjIzODQsMjIzOTAsMjI0MDAsMjIzODksMjIzOTUsMjIzODcsMjIzODgsMjIzNzAsMjIzNzYsMjIzOTcsMjI3OTYsMjI4NTMsMjI5NjUsMjI5NzAsMjI5OTEsMjI5OTAsMjI5NjIsMjI5ODgsMjI5NzcsMjI5NjYsMjI5NzIsMjI5NzksMjI5OTgsMjI5NjEsMjI5NzMsMjI5NzYsMjI5ODQsMjI5NjQsMjI5ODMsMjMzOTQsMjMzOTcsMjM0NDMsMjM0NDUsMjM2MjAsMjM2MjMsMjM3MjYsMjM3MTYsMjM3MTIsMjM3MzMsMjM3MjcsMjM3MjAsMjM3MjQsMjM3MTEsMjM3MTUsMjM3MjUsMjM3MTQsMjM3MjIsMjM3MTksMjM3MDksMjM3MTcsMjM3MzQsMjM3MjgsMjM3MTgsMjQwODcsMjQwODQsMjQwODksMjQzNjAsMjQzNTQsMjQzNTUsMjQzNTYsMjQ0MDQsMjQ0NTAsMjQ0NDYsMjQ0NDUsMjQ1NDIsMjQ1NDksMjQ2MjEsMjQ2MTQsMjQ2MDEsMjQ2MjYsMjQ1ODcsMjQ2MjgsMjQ1ODYsMjQ1OTksMjQ2MjcsMjQ2MDIsMjQ2MDYsMjQ2MjAsMjQ2MTAsMjQ1ODksMjQ1OTIsMjQ2MjIsMjQ1OTUsMjQ1OTMsMjQ1ODgsMjQ1ODUsMjQ2MDQsMjUxMDgsMjUxNDksMjUyNjEsMjUyNjgsMjUyOTcsMjUyNzgsMjUyNTgsMjUyNzAsMjUyOTAsMjUyNjIsMjUyNjcsMjUyNjMsMjUyNzUsMjUyNTcsMjUyNjQsMjUyNzIsMjU5MTcsMjYwMjQsMjYwNDMsMjYxMjEsMjYxMDgsMjYxMTYsMjYxMzAsMjYxMjAsMjYxMDcsMjYxMTUsMjYxMjMsMjYxMjUsMjYxMTcsMjYxMDksMjYxMjksMjYxMjgsMjYzNTgsMjYzNzgsMjY1MDEsMjY0NzYsMjY1MTAsMjY1MTQsMjY0ODYsMjY0OTEsMjY1MjAsMjY1MDIsMjY1MDAsMjY0ODQsMjY1MDksMjY1MDgsMjY0OTAsMjY1MjcsMjY1MTMsMjY1MjEsMjY0OTksMjY0OTMsMjY0OTcsMjY0ODgsMjY0ODksMjY1MTYsMjc0MjksMjc1MjAsMjc1MTgsMjc2MTQsMjc2NzcsMjc3OTUsMjc4ODQsMjc4ODMsMjc4ODYsMjc4NjUsMjc4MzAsMjc4NjAsMjc4MjEsMjc4NzksMjc4MzEsMjc4NTYsMjc4NDIsMjc4MzQsMjc4NDMsMjc4NDYsMjc4ODUsMjc4OTAsMjc4NTgsMjc4NjksMjc4MjgsMjc3ODYsMjc4MDUsMjc3NzYsMjc4NzAsMjc4NDAsMjc5NTIsMjc4NTMsMjc4NDcsMjc4MjQsMjc4OTcsMjc4NTUsMjc4ODEsMjc4NTcsMjg4MjAsMjg4MjQsMjg4MDUsMjg4MTksMjg4MDYsMjg4MDQsMjg4MTcsMjg4MjIsMjg4MDIsMjg4MjYsMjg4MDMsMjkyOTAsMjkzOTgsMjkzODcsMjk0MDAsMjkzODUsMjk0MDQsMjkzOTQsMjkzOTYsMjk0MDIsMjkzODgsMjkzOTMsMjk2MDQsMjk2MDEsMjk2MTMsMjk2MDYsMjk2MDIsMjk2MDAsMjk2MTIsMjk1OTcsMjk5MTcsMjk5MjgsMzAwMTUsMzAwMTYsMzAwMTQsMzAwOTIsMzAxMDQsMzAzODMsMzA0NTEsMzA0NDksMzA0NDgsMzA0NTMsMzA3MTIsMzA3MTYsMzA3MTMsMzA3MTUsMzA3MTQsMzA3MTEsMzEwNDIsMzEwMzksMzExNzMsMzEzNTIsMzEzNTUsMzE0ODMsMzE4NjEsMzE5OTcsMzI4MjEsMzI5MTEsMzI5NDIsMzI5MzEsMzI5NTIsMzI5NDksMzI5NDEsMzMzMTIsMzM0NDAsMzM0NzIsMzM0NTEsMzM0MzQsMzM0MzIsMzM0MzUsMzM0NjEsMzM0NDcsMzM0NTQsMzM0NjgsMzM0MzgsMzM0NjYsMzM0NjAsMzM0NDgsMzM0NDEsMzM0NDksMzM0NzQsMzM0NDQsMzM0NzUsMzM0NjIsMzM0NDIsMzQ0MTYsMzQ0MTUsMzQ0MTMsMzQ0MTQsMzU5MjYsMzY4MTgsMzY4MTEsMzY4MTksMzY4MTMsMzY4MjIsMzY4MjEsMzY4MjMsMzcwNDIsMzcwNDQsMzcwMzksMzcwNDMsMzcwNDAsMzg0NTcsMzg0NjEsMzg0NjAsMzg0NTgsMzg0NjcsMjA0MjksMjA0MjEsMjA0MzUsMjA0MDIsMjA0MjUsMjA0MjcsMjA0MTcsMjA0MzYsMjA0NDQsMjA0NDEsMjA0MTEsMjA0MDMsMjA0NDMsMjA0MjMsMjA0MzgsMjA0MTAsMjA0MTYsMjA0MDksMjA0NjAsMjEwNjAsMjEwNjUsMjExODQsMjExODYsMjEzMDksMjEzNzIsMjEzOTksMjEzOTgsMjE0MDEsMjE0MDAsMjE2OTAsMjE2NjUsMjE2NzcsMjE2NjksMjE3MTEsMjE2OTksMzM1NDksMjE2ODcsMjE2NzgsMjE3MTgsMjE2ODYsMjE3MDEsMjE3MDIsMjE2NjQsMjE2MTYsMjE2OTIsMjE2NjYsMjE2OTQsMjE2MTgsMjE3MjYsMjE2ODAsMjI0NTMsMjI0MzAsMjI0MzEsMjI0MzYsMjI0MTIsMjI0MjMsMjI0MjksMjI0MjcsMjI0MjAsMjI0MjQsMjI0MTUsMjI0MjUsMjI0MzcsMjI0MjYsMjI0MjEsMjI3NzIsMjI3OTcsMjI4NjcsMjMwMDksMjMwMDYsMjMwMjIsMjMwNDAsMjMwMjUsMjMwMDUsMjMwMzQsMjMwMzcsMjMwMzYsMjMwMzAsMjMwMTIsMjMwMjYsMjMwMzEsMjMwMDMsMjMwMTcsMjMwMjcsMjMwMjksMjMwMDgsMjMwMzgsMjMwMjgsMjMwMjEsMjM0NjQsMjM2MjgsMjM3NjAsMjM3NjgsMjM3NTYsMjM3NjcsMjM3NTUsMjM3NzEsMjM3NzQsMjM3NzAsMjM3NTMsMjM3NTEsMjM3NTQsMjM3NjYsMjM3NjMsMjM3NjQsMjM3NTksMjM3NTIsMjM3NTAsMjM3NTgsMjM3NzUsMjM4MDAsMjQwNTcsMjQwOTcsMjQwOTgsMjQwOTksMjQwOTYsMjQxMDAsMjQyNDAsMjQyMjgsMjQyMjYsMjQyMTksMjQyMjcsMjQyMjksMjQzMjcsMjQzNjYsMjQ0MDYsMjQ0NTQsMjQ2MzEsMjQ2MzMsMjQ2NjAsMjQ2OTAsMjQ2NzAsMjQ2NDUsMjQ2NTksMjQ2NDcsMjQ2NDksMjQ2NjcsMjQ2NTIsMjQ2NDAsMjQ2NDIsMjQ2NzEsMjQ2MTIsMjQ2NDQsMjQ2NjQsMjQ2NzgsMjQ2ODYsMjUxNTQsMjUxNTUsMjUyOTUsMjUzNTcsMjUzNTUsMjUzMzMsMjUzNTgsMjUzNDcsMjUzMjMsMjUzMzcsMjUzNTksMjUzNTYsMjUzMzYsMjUzMzQsMjUzNDQsMjUzNjMsMjUzNjQsMjUzMzgsMjUzNjUsMjUzMzksMjUzMjgsMjU5MjEsMjU5MjMsMjYwMjYsMjYwNDcsMjYxNjYsMjYxNDUsMjYxNjIsMjYxNjUsMjYxNDAsMjYxNTAsMjYxNDYsMjYxNjMsMjYxNTUsMjYxNzAsMjYxNDEsMjYxNjQsMjYxNjksMjYxNTgsMjYzODMsMjYzODQsMjY1NjEsMjY2MTAsMjY1NjgsMjY1NTQsMjY1ODgsMjY1NTUsMjY2MTYsMjY1ODQsMjY1NjAsMjY1NTEsMjY1NjUsMjY2MDMsMjY1OTYsMjY1OTEsMjY1NDksMjY1NzMsMjY1NDcsMjY2MTUsMjY2MTQsMjY2MDYsMjY1OTUsMjY1NjIsMjY1NTMsMjY1NzQsMjY1OTksMjY2MDgsMjY1NDYsMjY2MjAsMjY1NjYsMjY2MDUsMjY1NzIsMjY1NDIsMjY1OTgsMjY1ODcsMjY2MTgsMjY1NjksMjY1NzAsMjY1NjMsMjY2MDIsMjY1NzEsMjc0MzIsMjc1MjIsMjc1MjQsMjc1NzQsMjc2MDYsMjc2MDgsMjc2MTYsMjc2ODAsMjc2ODEsMjc5NDQsMjc5NTYsMjc5NDksMjc5MzUsMjc5NjQsMjc5NjcsMjc5MjIsMjc5MTQsMjc4NjYsMjc5NTUsMjc5MDgsMjc5MjksMjc5NjIsMjc5MzAsMjc5MjEsMjc5MDQsMjc5MzMsMjc5NzAsMjc5MDUsMjc5MjgsMjc5NTksMjc5MDcsMjc5MTksMjc5NjgsMjc5MTEsMjc5MzYsMjc5NDgsMjc5MTIsMjc5MzgsMjc5MTMsMjc5MjAsMjg4NTUsMjg4MzEsMjg4NjIsMjg4NDksMjg4NDgsMjg4MzMsMjg4NTIsMjg4NTMsMjg4NDEsMjkyNDksMjkyNTcsMjkyNTgsMjkyOTIsMjkyOTYsMjkyOTksMjkyOTQsMjkzODYsMjk0MTIsMjk0MTYsMjk0MTksMjk0MDcsMjk0MTgsMjk0MTQsMjk0MTEsMjk1NzMsMjk2NDQsMjk2MzQsMjk2NDAsMjk2MzcsMjk2MjUsMjk2MjIsMjk2MjEsMjk2MjAsMjk2NzUsMjk2MzEsMjk2MzksMjk2MzAsMjk2MzUsMjk2MzgsMjk2MjQsMjk2NDMsMjk5MzIsMjk5MzQsMjk5OTgsMzAwMjMsMzAwMjQsMzAxMTksMzAxMjIsMzAzMjksMzA0MDQsMzA0NzIsMzA0NjcsMzA0NjgsMzA0NjksMzA0NzQsMzA0NTUsMzA0NTksMzA0NTgsMzA2OTUsMzA2OTYsMzA3MjYsMzA3MzcsMzA3MzgsMzA3MjUsMzA3MzYsMzA3MzUsMzA3MzQsMzA3MjksMzA3MjMsMzA3MzksMzEwNTAsMzEwNTIsMzEwNTEsMzEwNDUsMzEwNDQsMzExODksMzExODEsMzExODMsMzExOTAsMzExODIsMzEzNjAsMzEzNTgsMzE0NDEsMzE0ODgsMzE0ODksMzE4NjYsMzE4NjQsMzE4NjUsMzE4NzEsMzE4NzIsMzE4NzMsMzIwMDMsMzIwMDgsMzIwMDEsMzI2MDAsMzI2NTcsMzI2NTMsMzI3MDIsMzI3NzUsMzI3ODIsMzI3ODMsMzI3ODgsMzI4MjMsMzI5ODQsMzI5NjcsMzI5OTIsMzI5NzcsMzI5NjgsMzI5NjIsMzI5NzYsMzI5NjUsMzI5OTUsMzI5ODUsMzI5ODgsMzI5NzAsMzI5ODEsMzI5NjksMzI5NzUsMzI5ODMsMzI5OTgsMzI5NzMsMzMyNzksMzMzMTMsMzM0MjgsMzM0OTcsMzM1MzQsMzM1MjksMzM1NDMsMzM1MTIsMzM1MzYsMzM0OTMsMzM1OTQsMzM1MTUsMzM0OTQsMzM1MjQsMzM1MTYsMzM1MDUsMzM1MjIsMzM1MjUsMzM1NDgsMzM1MzEsMzM1MjYsMzM1MjAsMzM1MTQsMzM1MDgsMzM1MDQsMzM1MzAsMzM1MjMsMzM1MTcsMzQ0MjMsMzQ0MjAsMzQ0MjgsMzQ0MTksMzQ4ODEsMzQ4OTQsMzQ5MTksMzQ5MjIsMzQ5MjEsMzUyODMsMzUzMzIsMzUzMzUsMzYyMTAsMzY4MzUsMzY4MzMsMzY4NDYsMzY4MzIsMzcxMDUsMzcwNTMsMzcwNTUsMzcwNzcsMzcwNjEsMzcwNTQsMzcwNjMsMzcwNjcsMzcwNjQsMzczMzIsMzczMzEsMzg0ODQsMzg0NzksMzg0ODEsMzg0ODMsMzg0NzQsMzg0NzgsMjA1MTAsMjA0ODUsMjA0ODcsMjA0OTksMjA1MTQsMjA1MjgsMjA1MDcsMjA0NjksMjA0NjgsMjA1MzEsMjA1MzUsMjA1MjQsMjA0NzAsMjA0NzEsMjA1MDMsMjA1MDgsMjA1MTIsMjA1MTksMjA1MzMsMjA1MjcsMjA1MjksMjA0OTQsMjA4MjYsMjA4ODQsMjA4ODMsMjA5MzgsMjA5MzIsMjA5MzMsMjA5MzYsMjA5NDIsMjEwODksMjEwODIsMjEwNzQsMjEwODYsMjEwODcsMjEwNzcsMjEwOTAsMjExOTcsMjEyNjIsMjE0MDYsMjE3OTgsMjE3MzAsMjE3ODMsMjE3NzgsMjE3MzUsMjE3NDcsMjE3MzIsMjE3ODYsMjE3NTksMjE3NjQsMjE3NjgsMjE3MzksMjE3NzcsMjE3NjUsMjE3NDUsMjE3NzAsMjE3NTUsMjE3NTEsMjE3NTIsMjE3MjgsMjE3NzQsMjE3NjMsMjE3NzEsMjIyNzMsMjIyNzQsMjI0NzYsMjI1NzgsMjI0ODUsMjI0ODIsMjI0NTgsMjI0NzAsMjI0NjEsMjI0NjAsMjI0NTYsMjI0NTQsMjI0NjMsMjI0NzEsMjI0ODAsMjI0NTcsMjI0NjUsMjI3OTgsMjI4NTgsMjMwNjUsMjMwNjIsMjMwODUsMjMwODYsMjMwNjEsMjMwNTUsMjMwNjMsMjMwNTAsMjMwNzAsMjMwOTEsMjM0MDQsMjM0NjMsMjM0NjksMjM0NjgsMjM1NTUsMjM2MzgsMjM2MzYsMjM3ODgsMjM4MDcsMjM3OTAsMjM3OTMsMjM3OTksMjM4MDgsMjM4MDEsMjQxMDUsMjQxMDQsMjQyMzIsMjQyMzgsMjQyMzQsMjQyMzYsMjQzNzEsMjQzNjgsMjQ0MjMsMjQ2NjksMjQ2NjYsMjQ2NzksMjQ2NDEsMjQ3MzgsMjQ3MTIsMjQ3MDQsMjQ3MjIsMjQ3MDUsMjQ3MzMsMjQ3MDcsMjQ3MjUsMjQ3MzEsMjQ3MjcsMjQ3MTEsMjQ3MzIsMjQ3MTgsMjUxMTMsMjUxNTgsMjUzMzAsMjUzNjAsMjU0MzAsMjUzODgsMjU0MTIsMjU0MTMsMjUzOTgsMjU0MTEsMjU1NzIsMjU0MDEsMjU0MTksMjU0MTgsMjU0MDQsMjUzODUsMjU0MDksMjUzOTYsMjU0MzIsMjU0MjgsMjU0MzMsMjUzODksMjU0MTUsMjUzOTUsMjU0MzQsMjU0MjUsMjU0MDAsMjU0MzEsMjU0MDgsMjU0MTYsMjU5MzAsMjU5MjYsMjYwNTQsMjYwNTEsMjYwNTIsMjYwNTAsMjYxODYsMjYyMDcsMjYxODMsMjYxOTMsMjYzODYsMjYzODcsMjY2NTUsMjY2NTAsMjY2OTcsMjY2NzQsMjY2NzUsMjY2ODMsMjY2OTksMjY3MDMsMjY2NDYsMjY2NzMsMjY2NTIsMjY2NzcsMjY2NjcsMjY2NjksMjY2NzEsMjY3MDIsMjY2OTIsMjY2NzYsMjY2NTMsMjY2NDIsMjY2NDQsMjY2NjIsMjY2NjQsMjY2NzAsMjY3MDEsMjY2ODIsMjY2NjEsMjY2NTYsMjc0MzYsMjc0MzksMjc0MzcsMjc0NDEsMjc0NDQsMjc1MDEsMzI4OTgsMjc1MjgsMjc2MjIsMjc2MjAsMjc2MjQsMjc2MTksMjc2MTgsMjc2MjMsMjc2ODUsMjgwMjYsMjgwMDMsMjgwMDQsMjgwMjIsMjc5MTcsMjgwMDEsMjgwNTAsMjc5OTIsMjgwMDIsMjgwMTMsMjgwMTUsMjgwNDksMjgwNDUsMjgxNDMsMjgwMzEsMjgwMzgsMjc5OTgsMjgwMDcsMjgwMDAsMjgwNTUsMjgwMTYsMjgwMjgsMjc5OTksMjgwMzQsMjgwNTYsMjc5NTEsMjgwMDgsMjgwNDMsMjgwMzAsMjgwMzIsMjgwMzYsMjc5MjYsMjgwMzUsMjgwMjcsMjgwMjksMjgwMjEsMjgwNDgsMjg4OTIsMjg4ODMsMjg4ODEsMjg4OTMsMjg4NzUsMzI1NjksMjg4OTgsMjg4ODcsMjg4ODIsMjg4OTQsMjg4OTYsMjg4ODQsMjg4NzcsMjg4NjksMjg4NzAsMjg4NzEsMjg4OTAsMjg4NzgsMjg4OTcsMjkyNTAsMjkzMDQsMjkzMDMsMjkzMDIsMjk0NDAsMjk0MzQsMjk0MjgsMjk0MzgsMjk0MzAsMjk0MjcsMjk0MzUsMjk0NDEsMjk2NTEsMjk2NTcsMjk2NjksMjk2NTQsMjk2MjgsMjk2NzEsMjk2NjcsMjk2NzMsMjk2NjAsMjk2NTAsMjk2NTksMjk2NTIsMjk2NjEsMjk2NTgsMjk2NTUsMjk2NTYsMjk2NzIsMjk5MTgsMjk5MTksMjk5NDAsMjk5NDEsMjk5ODUsMzAwNDMsMzAwNDcsMzAxMjgsMzAxNDUsMzAxMzksMzAxNDgsMzAxNDQsMzAxNDMsMzAxMzQsMzAxMzgsMzAzNDYsMzA0MDksMzA0OTMsMzA0OTEsMzA0ODAsMzA0ODMsMzA0ODIsMzA0OTksMzA0ODEsMzA0ODUsMzA0ODksMzA0OTAsMzA0OTgsMzA1MDMsMzA3NTUsMzA3NjQsMzA3NTQsMzA3NzMsMzA3NjcsMzA3NjAsMzA3NjYsMzA3NjMsMzA3NTMsMzA3NjEsMzA3NzEsMzA3NjIsMzA3NjksMzEwNjAsMzEwNjcsMzEwNTUsMzEwNjgsMzEwNTksMzEwNTgsMzEwNTcsMzEyMTEsMzEyMTIsMzEyMDAsMzEyMTQsMzEyMTMsMzEyMTAsMzExOTYsMzExOTgsMzExOTcsMzEzNjYsMzEzNjksMzEzNjUsMzEzNzEsMzEzNzIsMzEzNzAsMzEzNjcsMzE0NDgsMzE1MDQsMzE0OTIsMzE1MDcsMzE0OTMsMzE1MDMsMzE0OTYsMzE0OTgsMzE1MDIsMzE0OTcsMzE1MDYsMzE4NzYsMzE4ODksMzE4ODIsMzE4ODQsMzE4ODAsMzE4ODUsMzE4NzcsMzIwMzAsMzIwMjksMzIwMTcsMzIwMTQsMzIwMjQsMzIwMjIsMzIwMTksMzIwMzEsMzIwMTgsMzIwMTUsMzIwMTIsMzI2MDQsMzI2MDksMzI2MDYsMzI2MDgsMzI2MDUsMzI2MDMsMzI2NjIsMzI2NTgsMzI3MDcsMzI3MDYsMzI3MDQsMzI3OTAsMzI4MzAsMzI4MjUsMzMwMTgsMzMwMTAsMzMwMTcsMzMwMTMsMzMwMjUsMzMwMTksMzMwMjQsMzMyODEsMzMzMjcsMzMzMTcsMzM1ODcsMzM1ODEsMzM2MDQsMzM1NjEsMzM2MTcsMzM1NzMsMzM2MjIsMzM1OTksMzM2MDEsMzM1NzQsMzM1NjQsMzM1NzAsMzM2MDIsMzM2MTQsMzM1NjMsMzM1NzgsMzM1NDQsMzM1OTYsMzM2MTMsMzM1NTgsMzM1NzIsMzM1NjgsMzM1OTEsMzM1ODMsMzM1NzcsMzM2MDcsMzM2MDUsMzM2MTIsMzM2MTksMzM1NjYsMzM1ODAsMzM2MTEsMzM1NzUsMzM2MDgsMzQzODcsMzQzODYsMzQ0NjYsMzQ0NzIsMzQ0NTQsMzQ0NDUsMzQ0NDksMzQ0NjIsMzQ0MzksMzQ0NTUsMzQ0MzgsMzQ0NDMsMzQ0NTgsMzQ0MzcsMzQ0NjksMzQ0NTcsMzQ0NjUsMzQ0NzEsMzQ0NTMsMzQ0NTYsMzQ0NDYsMzQ0NjEsMzQ0NDgsMzQ0NTIsMzQ4ODMsMzQ4ODQsMzQ5MjUsMzQ5MzMsMzQ5MzQsMzQ5MzAsMzQ5NDQsMzQ5MjksMzQ5NDMsMzQ5MjcsMzQ5NDcsMzQ5NDIsMzQ5MzIsMzQ5NDAsMzUzNDYsMzU5MTEsMzU5MjcsMzU5NjMsMzYwMDQsMzYwMDMsMzYyMTQsMzYyMTYsMzYyNzcsMzYyNzksMzYyNzgsMzY1NjEsMzY1NjMsMzY4NjIsMzY4NTMsMzY4NjYsMzY4NjMsMzY4NTksMzY4NjgsMzY4NjAsMzY4NTQsMzcwNzgsMzcwODgsMzcwODEsMzcwODIsMzcwOTEsMzcwODcsMzcwOTMsMzcwODAsMzcwODMsMzcwNzksMzcwODQsMzcwOTIsMzcyMDAsMzcxOTgsMzcxOTksMzczMzMsMzczNDYsMzczMzgsMzg0OTIsMzg0OTUsMzg1ODgsMzkxMzksMzk2NDcsMzk3MjcsMjAwOTUsMjA1OTIsMjA1ODYsMjA1NzcsMjA1NzQsMjA1NzYsMjA1NjMsMjA1NTUsMjA1NzMsMjA1OTQsMjA1NTIsMjA1NTcsMjA1NDUsMjA1NzEsMjA1NTQsMjA1NzgsMjA1MDEsMjA1NDksMjA1NzUsMjA1ODUsMjA1ODcsMjA1NzksMjA1ODAsMjA1NTAsMjA1NDQsMjA1OTAsMjA1OTUsMjA1NjcsMjA1NjEsMjA5NDQsMjEwOTksMjExMDEsMjExMDAsMjExMDIsMjEyMDYsMjEyMDMsMjEyOTMsMjE0MDQsMjE4NzcsMjE4NzgsMjE4MjAsMjE4MzcsMjE4NDAsMjE4MTIsMjE4MDIsMjE4NDEsMjE4NTgsMjE4MTQsMjE4MTMsMjE4MDgsMjE4NDIsMjE4MjksMjE3NzIsMjE4MTAsMjE4NjEsMjE4MzgsMjE4MTcsMjE4MzIsMjE4MDUsMjE4MTksMjE4MjQsMjE4MzUsMjIyODIsMjIyNzksMjI1MjMsMjI1NDgsMjI0OTgsMjI1MTgsMjI0OTIsMjI1MTYsMjI1MjgsMjI1MDksMjI1MjUsMjI1MzYsMjI1MjAsMjI1MzksMjI1MTUsMjI0NzksMjI1MzUsMjI1MTAsMjI0OTksMjI1MTQsMjI1MDEsMjI1MDgsMjI0OTcsMjI1NDIsMjI1MjQsMjI1NDQsMjI1MDMsMjI1MjksMjI1NDAsMjI1MTMsMjI1MDUsMjI1MTIsMjI1NDEsMjI1MzIsMjI4NzYsMjMxMzYsMjMxMjgsMjMxMjUsMjMxNDMsMjMxMzQsMjMwOTYsMjMwOTMsMjMxNDksMjMxMjAsMjMxMzUsMjMxNDEsMjMxNDgsMjMxMjMsMjMxNDAsMjMxMjcsMjMxMDcsMjMxMzMsMjMxMjIsMjMxMDgsMjMxMzEsMjMxMTIsMjMxODIsMjMxMDIsMjMxMTcsMjMwOTcsMjMxMTYsMjMxNTIsMjMxNDUsMjMxMTEsMjMxMjEsMjMxMjYsMjMxMDYsMjMxMzIsMjM0MTAsMjM0MDYsMjM0ODksMjM0ODgsMjM2NDEsMjM4MzgsMjM4MTksMjM4MzcsMjM4MzQsMjM4NDAsMjM4MjAsMjM4NDgsMjM4MjEsMjM4NDYsMjM4NDUsMjM4MjMsMjM4NTYsMjM4MjYsMjM4NDMsMjM4MzksMjM4NTQsMjQxMjYsMjQxMTYsMjQyNDEsMjQyNDQsMjQyNDksMjQyNDIsMjQyNDMsMjQzNzQsMjQzNzYsMjQ0NzUsMjQ0NzAsMjQ0NzksMjQ3MTQsMjQ3MjAsMjQ3MTAsMjQ3NjYsMjQ3NTIsMjQ3NjIsMjQ3ODcsMjQ3ODgsMjQ3ODMsMjQ4MDQsMjQ3OTMsMjQ3OTcsMjQ3NzYsMjQ3NTMsMjQ3OTUsMjQ3NTksMjQ3NzgsMjQ3NjcsMjQ3NzEsMjQ3ODEsMjQ3NjgsMjUzOTQsMjU0NDUsMjU0ODIsMjU0NzQsMjU0NjksMjU1MzMsMjU1MDIsMjU1MTcsMjU1MDEsMjU0OTUsMjU1MTUsMjU0ODYsMjU0NTUsMjU0NzksMjU0ODgsMjU0NTQsMjU1MTksMjU0NjEsMjU1MDAsMjU0NTMsMjU1MTgsMjU0NjgsMjU1MDgsMjU0MDMsMjU1MDMsMjU0NjQsMjU0NzcsMjU0NzMsMjU0ODksMjU0ODUsMjU0NTYsMjU5MzksMjYwNjEsMjYyMTMsMjYyMDksMjYyMDMsMjYyMDEsMjYyMDQsMjYyMTAsMjYzOTIsMjY3NDUsMjY3NTksMjY3NjgsMjY3ODAsMjY3MzMsMjY3MzQsMjY3OTgsMjY3OTUsMjY5NjYsMjY3MzUsMjY3ODcsMjY3OTYsMjY3OTMsMjY3NDEsMjY3NDAsMjY4MDIsMjY3NjcsMjY3NDMsMjY3NzAsMjY3NDgsMjY3MzEsMjY3MzgsMjY3OTQsMjY3NTIsMjY3MzcsMjY3NTAsMjY3NzksMjY3NzQsMjY3NjMsMjY3ODQsMjY3NjEsMjY3ODgsMjY3NDQsMjY3NDcsMjY3NjksMjY3NjQsMjY3NjIsMjY3NDksMjc0NDYsMjc0NDMsMjc0NDcsMjc0NDgsMjc1MzcsMjc1MzUsMjc1MzMsMjc1MzQsMjc1MzIsMjc2OTAsMjgwOTYsMjgwNzUsMjgwODQsMjgwODMsMjgyNzYsMjgwNzYsMjgxMzcsMjgxMzAsMjgwODcsMjgxNTAsMjgxMTYsMjgxNjAsMjgxMDQsMjgxMjgsMjgxMjcsMjgxMTgsMjgwOTQsMjgxMzMsMjgxMjQsMjgxMjUsMjgxMjMsMjgxNDgsMjgxMDYsMjgwOTMsMjgxNDEsMjgxNDQsMjgwOTAsMjgxMTcsMjgwOTgsMjgxMTEsMjgxMDUsMjgxMTIsMjgxNDYsMjgxMTUsMjgxNTcsMjgxMTksMjgxMDksMjgxMzEsMjgwOTEsMjg5MjIsMjg5NDEsMjg5MTksMjg5NTEsMjg5MTYsMjg5NDAsMjg5MTIsMjg5MzIsMjg5MTUsMjg5NDQsMjg5MjQsMjg5MjcsMjg5MzQsMjg5NDcsMjg5MjgsMjg5MjAsMjg5MTgsMjg5MzksMjg5MzAsMjg5NDIsMjkzMTAsMjkzMDcsMjkzMDgsMjkzMTEsMjk0NjksMjk0NjMsMjk0NDcsMjk0NTcsMjk0NjQsMjk0NTAsMjk0NDgsMjk0MzksMjk0NTUsMjk0NzAsMjk1NzYsMjk2ODYsMjk2ODgsMjk2ODUsMjk3MDAsMjk2OTcsMjk2OTMsMjk3MDMsMjk2OTYsMjk2OTAsMjk2OTIsMjk2OTUsMjk3MDgsMjk3MDcsMjk2ODQsMjk3MDQsMzAwNTIsMzAwNTEsMzAxNTgsMzAxNjIsMzAxNTksMzAxNTUsMzAxNTYsMzAxNjEsMzAxNjAsMzAzNTEsMzAzNDUsMzA0MTksMzA1MjEsMzA1MTEsMzA1MDksMzA1MTMsMzA1MTQsMzA1MTYsMzA1MTUsMzA1MjUsMzA1MDEsMzA1MjMsMzA1MTcsMzA3OTIsMzA4MDIsMzA3OTMsMzA3OTcsMzA3OTQsMzA3OTYsMzA3NTgsMzA3ODksMzA4MDAsMzEwNzYsMzEwNzksMzEwODEsMzEwODIsMzEwNzUsMzEwODMsMzEwNzMsMzExNjMsMzEyMjYsMzEyMjQsMzEyMjIsMzEyMjMsMzEzNzUsMzEzODAsMzEzNzYsMzE1NDEsMzE1NTksMzE1NDAsMzE1MjUsMzE1MzYsMzE1MjIsMzE1MjQsMzE1MzksMzE1MTIsMzE1MzAsMzE1MTcsMzE1MzcsMzE1MzEsMzE1MzMsMzE1MzUsMzE1MzgsMzE1NDQsMzE1MTQsMzE1MjMsMzE4OTIsMzE4OTYsMzE4OTQsMzE5MDcsMzIwNTMsMzIwNjEsMzIwNTYsMzIwNTQsMzIwNTgsMzIwNjksMzIwNDQsMzIwNDEsMzIwNjUsMzIwNzEsMzIwNjIsMzIwNjMsMzIwNzQsMzIwNTksMzIwNDAsMzI2MTEsMzI2NjEsMzI2NjgsMzI2NjksMzI2NjcsMzI3MTQsMzI3MTUsMzI3MTcsMzI3MjAsMzI3MjEsMzI3MTEsMzI3MTksMzI3MTMsMzI3OTksMzI3OTgsMzI3OTUsMzI4MzksMzI4MzUsMzI4NDAsMzMwNDgsMzMwNjEsMzMwNDksMzMwNTEsMzMwNjksMzMwNTUsMzMwNjgsMzMwNTQsMzMwNTcsMzMwNDUsMzMwNjMsMzMwNTMsMzMwNTgsMzMyOTcsMzMzMzYsMzMzMzEsMzMzMzgsMzMzMzIsMzMzMzAsMzMzOTYsMzM2ODAsMzM2OTksMzM3MDQsMzM2NzcsMzM2NTgsMzM2NTEsMzM3MDAsMzM2NTIsMzM2NzksMzM2NjUsMzM2ODUsMzM2ODksMzM2NTMsMzM2ODQsMzM3MDUsMzM2NjEsMzM2NjcsMzM2NzYsMzM2OTMsMzM2OTEsMzM3MDYsMzM2NzUsMzM2NjIsMzM3MDEsMzM3MTEsMzM2NzIsMzM2ODcsMzM3MTIsMzM2NjMsMzM3MDIsMzM2NzEsMzM3MTAsMzM2NTQsMzM2OTAsMzQzOTMsMzQzOTAsMzQ0OTUsMzQ0ODcsMzQ0OTgsMzQ0OTcsMzQ1MDEsMzQ0OTAsMzQ0ODAsMzQ1MDQsMzQ0ODksMzQ0ODMsMzQ0ODgsMzQ1MDgsMzQ0ODQsMzQ0OTEsMzQ0OTIsMzQ0OTksMzQ0OTMsMzQ0OTQsMzQ4OTgsMzQ5NTMsMzQ5NjUsMzQ5ODQsMzQ5NzgsMzQ5ODYsMzQ5NzAsMzQ5NjEsMzQ5NzcsMzQ5NzUsMzQ5NjgsMzQ5ODMsMzQ5NjksMzQ5NzEsMzQ5NjcsMzQ5ODAsMzQ5ODgsMzQ5NTYsMzQ5NjMsMzQ5NTgsMzUyMDIsMzUyODYsMzUyODksMzUyODUsMzUzNzYsMzUzNjcsMzUzNzIsMzUzNTgsMzU4OTcsMzU4OTksMzU5MzIsMzU5MzMsMzU5NjUsMzYwMDUsMzYyMjEsMzYyMTksMzYyMTcsMzYyODQsMzYyOTAsMzYyODEsMzYyODcsMzYyODksMzY1NjgsMzY1NzQsMzY1NzMsMzY1NzIsMzY1NjcsMzY1NzYsMzY1NzcsMzY5MDAsMzY4NzUsMzY4ODEsMzY4OTIsMzY4NzYsMzY4OTcsMzcxMDMsMzcwOTgsMzcxMDQsMzcxMDgsMzcxMDYsMzcxMDcsMzcwNzYsMzcwOTksMzcxMDAsMzcwOTcsMzcyMDYsMzcyMDgsMzcyMTAsMzcyMDMsMzcyMDUsMzczNTYsMzczNjQsMzczNjEsMzczNjMsMzczNjgsMzczNDgsMzczNjksMzczNTQsMzczNTUsMzczNjcsMzczNTIsMzczNTgsMzgyNjYsMzgyNzgsMzgyODAsMzg1MjQsMzg1MDksMzg1MDcsMzg1MTMsMzg1MTEsMzg1OTEsMzg3NjIsMzg5MTYsMzkxNDEsMzkzMTksMjA2MzUsMjA2MjksMjA2MjgsMjA2MzgsMjA2MTksMjA2NDMsMjA2MTEsMjA2MjAsMjA2MjIsMjA2MzcsMjA1ODQsMjA2MzYsMjA2MjYsMjA2MTAsMjA2MTUsMjA4MzEsMjA5NDgsMjEyNjYsMjEyNjUsMjE0MTIsMjE0MTUsMjE5MDUsMjE5MjgsMjE5MjUsMjE5MzMsMjE4NzksMjIwODUsMjE5MjIsMjE5MDcsMjE4OTYsMjE5MDMsMjE5NDEsMjE4ODksMjE5MjMsMjE5MDYsMjE5MjQsMjE4ODUsMjE5MDAsMjE5MjYsMjE4ODcsMjE5MDksMjE5MjEsMjE5MDIsMjIyODQsMjI1NjksMjI1ODMsMjI1NTMsMjI1NTgsMjI1NjcsMjI1NjMsMjI1NjgsMjI1MTcsMjI2MDAsMjI1NjUsMjI1NTYsMjI1NTUsMjI1NzksMjI1OTEsMjI1ODIsMjI1NzQsMjI1ODUsMjI1ODQsMjI1NzMsMjI1NzIsMjI1ODcsMjI4ODEsMjMyMTUsMjMxODgsMjMxOTksMjMxNjIsMjMyMDIsMjMxOTgsMjMxNjAsMjMyMDYsMjMxNjQsMjMyMDUsMjMyMTIsMjMxODksMjMyMTQsMjMwOTUsMjMxNzIsMjMxNzgsMjMxOTEsMjMxNzEsMjMxNzksMjMyMDksMjMxNjMsMjMxNjUsMjMxODAsMjMxOTYsMjMxODMsMjMxODcsMjMxOTcsMjM1MzAsMjM1MDEsMjM0OTksMjM1MDgsMjM1MDUsMjM0OTgsMjM1MDIsMjM1NjQsMjM2MDAsMjM4NjMsMjM4NzUsMjM5MTUsMjM4NzMsMjM4ODMsMjM4NzEsMjM4NjEsMjM4ODksMjM4ODYsMjM4OTMsMjM4NTksMjM4NjYsMjM4OTAsMjM4NjksMjM4NTcsMjM4OTcsMjM4NzQsMjM4NjUsMjM4ODEsMjM4NjQsMjM4NjgsMjM4NTgsMjM4NjIsMjM4NzIsMjM4NzcsMjQxMzIsMjQxMjksMjQ0MDgsMjQ0ODYsMjQ0ODUsMjQ0OTEsMjQ3NzcsMjQ3NjEsMjQ3ODAsMjQ4MDIsMjQ3ODIsMjQ3NzIsMjQ4NTIsMjQ4MTgsMjQ4NDIsMjQ4NTQsMjQ4MzcsMjQ4MjEsMjQ4NTEsMjQ4MjQsMjQ4MjgsMjQ4MzAsMjQ3NjksMjQ4MzUsMjQ4NTYsMjQ4NjEsMjQ4NDgsMjQ4MzEsMjQ4MzYsMjQ4NDMsMjUxNjIsMjU0OTIsMjU1MjEsMjU1MjAsMjU1NTAsMjU1NzMsMjU1NzYsMjU1ODMsMjU1MzksMjU3NTcsMjU1ODcsMjU1NDYsMjU1NjgsMjU1OTAsMjU1NTcsMjU1ODYsMjU1ODksMjU2OTcsMjU1NjcsMjU1MzQsMjU1NjUsMjU1NjQsMjU1NDAsMjU1NjAsMjU1NTUsMjU1MzgsMjU1NDMsMjU1NDgsMjU1NDcsMjU1NDQsMjU1ODQsMjU1NTksMjU1NjEsMjU5MDYsMjU5NTksMjU5NjIsMjU5NTYsMjU5NDgsMjU5NjAsMjU5NTcsMjU5OTYsMjYwMTMsMjYwMTQsMjYwMzAsMjYwNjQsMjYwNjYsMjYyMzYsMjYyMjAsMjYyMzUsMjYyNDAsMjYyMjUsMjYyMzMsMjYyMTgsMjYyMjYsMjYzNjksMjY4OTIsMjY4MzUsMjY4ODQsMjY4NDQsMjY5MjIsMjY4NjAsMjY4NTgsMjY4NjUsMjY4OTUsMjY4MzgsMjY4NzEsMjY4NTksMjY4NTIsMjY4NzAsMjY4OTksMjY4OTYsMjY4NjcsMjY4NDksMjY4ODcsMjY4MjgsMjY4ODgsMjY5OTIsMjY4MDQsMjY4OTcsMjY4NjMsMjY4MjIsMjY5MDAsMjY4NzIsMjY4MzIsMjY4NzcsMjY4NzYsMjY4NTYsMjY4OTEsMjY4OTAsMjY5MDMsMjY4MzAsMjY4MjQsMjY4NDUsMjY4NDYsMjY4NTQsMjY4NjgsMjY4MzMsMjY4ODYsMjY4MzYsMjY4NTcsMjY5MDEsMjY5MTcsMjY4MjMsMjc0NDksMjc0NTEsMjc0NTUsMjc0NTIsMjc1NDAsMjc1NDMsMjc1NDUsMjc1NDEsMjc1ODEsMjc2MzIsMjc2MzQsMjc2MzUsMjc2OTYsMjgxNTYsMjgyMzAsMjgyMzEsMjgxOTEsMjgyMzMsMjgyOTYsMjgyMjAsMjgyMjEsMjgyMjksMjgyNTgsMjgyMDMsMjgyMjMsMjgyMjUsMjgyNTMsMjgyNzUsMjgxODgsMjgyMTEsMjgyMzUsMjgyMjQsMjgyNDEsMjgyMTksMjgxNjMsMjgyMDYsMjgyNTQsMjgyNjQsMjgyNTIsMjgyNTcsMjgyMDksMjgyMDAsMjgyNTYsMjgyNzMsMjgyNjcsMjgyMTcsMjgxOTQsMjgyMDgsMjgyNDMsMjgyNjEsMjgxOTksMjgyODAsMjgyNjAsMjgyNzksMjgyNDUsMjgyODEsMjgyNDIsMjgyNjIsMjgyMTMsMjgyMTQsMjgyNTAsMjg5NjAsMjg5NTgsMjg5NzUsMjg5MjMsMjg5NzQsMjg5NzcsMjg5NjMsMjg5NjUsMjg5NjIsMjg5NzgsMjg5NTksMjg5NjgsMjg5ODYsMjg5NTUsMjkyNTksMjkyNzQsMjkzMjAsMjkzMjEsMjkzMTgsMjkzMTcsMjkzMjMsMjk0NTgsMjk0NTEsMjk0ODgsMjk0NzQsMjk0ODksMjk0OTEsMjk0NzksMjk0OTAsMjk0ODUsMjk0NzgsMjk0NzUsMjk0OTMsMjk0NTIsMjk3NDIsMjk3NDAsMjk3NDQsMjk3MzksMjk3MTgsMjk3MjIsMjk3MjksMjk3NDEsMjk3NDUsMjk3MzIsMjk3MzEsMjk3MjUsMjk3MzcsMjk3MjgsMjk3NDYsMjk5NDcsMjk5OTksMzAwNjMsMzAwNjAsMzAxODMsMzAxNzAsMzAxNzcsMzAxODIsMzAxNzMsMzAxNzUsMzAxODAsMzAxNjcsMzAzNTcsMzAzNTQsMzA0MjYsMzA1MzQsMzA1MzUsMzA1MzIsMzA1NDEsMzA1MzMsMzA1MzgsMzA1NDIsMzA1MzksMzA1NDAsMzA2ODYsMzA3MDAsMzA4MTYsMzA4MjAsMzA4MjEsMzA4MTIsMzA4MjksMzA4MzMsMzA4MjYsMzA4MzAsMzA4MzIsMzA4MjUsMzA4MjQsMzA4MTQsMzA4MTgsMzEwOTIsMzEwOTEsMzEwOTAsMzEwODgsMzEyMzQsMzEyNDIsMzEyMzUsMzEyNDQsMzEyMzYsMzEzODUsMzE0NjIsMzE0NjAsMzE1NjIsMzE1NDcsMzE1NTYsMzE1NjAsMzE1NjQsMzE1NjYsMzE1NTIsMzE1NzYsMzE1NTcsMzE5MDYsMzE5MDIsMzE5MTIsMzE5MDUsMzIwODgsMzIxMTEsMzIwOTksMzIwODMsMzIwODYsMzIxMDMsMzIxMDYsMzIwNzksMzIxMDksMzIwOTIsMzIxMDcsMzIwODIsMzIwODQsMzIxMDUsMzIwODEsMzIwOTUsMzIwNzgsMzI1NzQsMzI1NzUsMzI2MTMsMzI2MTQsMzI2NzQsMzI2NzIsMzI2NzMsMzI3MjcsMzI4NDksMzI4NDcsMzI4NDgsMzMwMjIsMzI5ODAsMzMwOTEsMzMwOTgsMzMxMDYsMzMxMDMsMzMwOTUsMzMwODUsMzMxMDEsMzMwODIsMzMyNTQsMzMyNjIsMzMyNzEsMzMyNzIsMzMyNzMsMzMyODQsMzMzNDAsMzMzNDEsMzMzNDMsMzMzOTcsMzM1OTUsMzM3NDMsMzM3ODUsMzM4MjcsMzM3MjgsMzM3NjgsMzM4MTAsMzM3NjcsMzM3NjQsMzM3ODgsMzM3ODIsMzM4MDgsMzM3MzQsMzM3MzYsMzM3NzEsMzM3NjMsMzM3MjcsMzM3OTMsMzM3NTcsMzM3NjUsMzM3NTIsMzM3OTEsMzM3NjEsMzM3MzksMzM3NDIsMzM3NTAsMzM3ODEsMzM3MzcsMzM4MDEsMzM4MDcsMzM3NTgsMzM4MDksMzM3OTgsMzM3MzAsMzM3NzksMzM3NDksMzM3ODYsMzM3MzUsMzM3NDUsMzM3NzAsMzM4MTEsMzM3MzEsMzM3NzIsMzM3NzQsMzM3MzIsMzM3ODcsMzM3NTEsMzM3NjIsMzM4MTksMzM3NTUsMzM3OTAsMzQ1MjAsMzQ1MzAsMzQ1MzQsMzQ1MTUsMzQ1MzEsMzQ1MjIsMzQ1MzgsMzQ1MjUsMzQ1MzksMzQ1MjQsMzQ1NDAsMzQ1MzcsMzQ1MTksMzQ1MzYsMzQ1MTMsMzQ4ODgsMzQ5MDIsMzQ5MDEsMzUwMDIsMzUwMzEsMzUwMDEsMzUwMDAsMzUwMDgsMzUwMDYsMzQ5OTgsMzUwMDQsMzQ5OTksMzUwMDUsMzQ5OTQsMzUwNzMsMzUwMTcsMzUyMjEsMzUyMjQsMzUyMjMsMzUyOTMsMzUyOTAsMzUyOTEsMzU0MDYsMzU0MDUsMzUzODUsMzU0MTcsMzUzOTIsMzU0MTUsMzU0MTYsMzUzOTYsMzUzOTcsMzU0MTAsMzU0MDAsMzU0MDksMzU0MDIsMzU0MDQsMzU0MDcsMzU5MzUsMzU5NjksMzU5NjgsMzYwMjYsMzYwMzAsMzYwMTYsMzYwMjUsMzYwMjEsMzYyMjgsMzYyMjQsMzYyMzMsMzYzMTIsMzYzMDcsMzYzMDEsMzYyOTUsMzYzMTAsMzYzMTYsMzYzMDMsMzYzMDksMzYzMTMsMzYyOTYsMzYzMTEsMzYyOTMsMzY1OTEsMzY1OTksMzY2MDIsMzY2MDEsMzY1ODIsMzY1OTAsMzY1ODEsMzY1OTcsMzY1ODMsMzY1ODQsMzY1OTgsMzY1ODcsMzY1OTMsMzY1ODgsMzY1OTYsMzY1ODUsMzY5MDksMzY5MTYsMzY5MTEsMzcxMjYsMzcxNjQsMzcxMjQsMzcxMTksMzcxMTYsMzcxMjgsMzcxMTMsMzcxMTUsMzcxMjEsMzcxMjAsMzcxMjcsMzcxMjUsMzcxMjMsMzcyMTcsMzcyMjAsMzcyMTUsMzcyMTgsMzcyMTYsMzczNzcsMzczODYsMzc0MTMsMzczNzksMzc0MDIsMzc0MTQsMzczOTEsMzczODgsMzczNzYsMzczOTQsMzczNzUsMzczNzMsMzczODIsMzczODAsMzc0MTUsMzczNzgsMzc0MDQsMzc0MTIsMzc0MDEsMzczOTksMzczODEsMzczOTgsMzgyNjcsMzgyODUsMzgyODQsMzgyODgsMzg1MzUsMzg1MjYsMzg1MzYsMzg1MzcsMzg1MzEsMzg1MjgsMzg1OTQsMzg2MDAsMzg1OTUsMzg2NDEsMzg2NDAsMzg3NjQsMzg3NjgsMzg3NjYsMzg5MTksMzkwODEsMzkxNDcsNDAxNjYsNDA2OTcsMjAwOTksMjAxMDAsMjAxNTAsMjA2NjksMjA2NzEsMjA2NzgsMjA2NTQsMjA2NzYsMjA2ODIsMjA2NjAsMjA2ODAsMjA2NzQsMjA2NTYsMjA2NzMsMjA2NjYsMjA2NTcsMjA2ODMsMjA2ODEsMjA2NjIsMjA2NjQsMjA5NTEsMjExMTQsMjExMTIsMjExMTUsMjExMTYsMjE5NTUsMjE5NzksMjE5NjQsMjE5NjgsMjE5NjMsMjE5NjIsMjE5ODEsMjE5NTIsMjE5NzIsMjE5NTYsMjE5OTMsMjE5NTEsMjE5NzAsMjE5MDEsMjE5NjcsMjE5NzMsMjE5ODYsMjE5NzQsMjE5NjAsMjIwMDIsMjE5NjUsMjE5NzcsMjE5NTQsMjIyOTIsMjI2MTEsMjI2MzIsMjI2MjgsMjI2MDcsMjI2MDUsMjI2MDEsMjI2MzksMjI2MTMsMjI2MDYsMjI2MjEsMjI2MTcsMjI2MjksMjI2MTksMjI1ODksMjI2MjcsMjI2NDEsMjI3ODAsMjMyMzksMjMyMzYsMjMyNDMsMjMyMjYsMjMyMjQsMjMyMTcsMjMyMjEsMjMyMTYsMjMyMzEsMjMyNDAsMjMyMjcsMjMyMzgsMjMyMjMsMjMyMzIsMjMyNDIsMjMyMjAsMjMyMjIsMjMyNDUsMjMyMjUsMjMxODQsMjM1MTAsMjM1MTIsMjM1MTMsMjM1ODMsMjM2MDMsMjM5MjEsMjM5MDcsMjM4ODIsMjM5MDksMjM5MjIsMjM5MTYsMjM5MDIsMjM5MTIsMjM5MTEsMjM5MDYsMjQwNDgsMjQxNDMsMjQxNDIsMjQxMzgsMjQxNDEsMjQxMzksMjQyNjEsMjQyNjgsMjQyNjIsMjQyNjcsMjQyNjMsMjQzODQsMjQ0OTUsMjQ0OTMsMjQ4MjMsMjQ5MDUsMjQ5MDYsMjQ4NzUsMjQ5MDEsMjQ4ODYsMjQ4ODIsMjQ4NzgsMjQ5MDIsMjQ4NzksMjQ5MTEsMjQ4NzMsMjQ4OTYsMjUxMjAsMzcyMjQsMjUxMjMsMjUxMjUsMjUxMjQsMjU1NDEsMjU1ODUsMjU1NzksMjU2MTYsMjU2MTgsMjU2MDksMjU2MzIsMjU2MzYsMjU2NTEsMjU2NjcsMjU2MzEsMjU2MjEsMjU2MjQsMjU2NTcsMjU2NTUsMjU2MzQsMjU2MzUsMjU2MTIsMjU2MzgsMjU2NDgsMjU2NDAsMjU2NjUsMjU2NTMsMjU2NDcsMjU2MTAsMjU2MjYsMjU2NjQsMjU2MzcsMjU2MzksMjU2MTEsMjU1NzUsMjU2MjcsMjU2NDYsMjU2MzMsMjU2MTQsMjU5NjcsMjYwMDIsMjYwNjcsMjYyNDYsMjYyNTIsMjYyNjEsMjYyNTYsMjYyNTEsMjYyNTAsMjYyNjUsMjYyNjAsMjYyMzIsMjY0MDAsMjY5ODIsMjY5NzUsMjY5MzYsMjY5NTgsMjY5NzgsMjY5OTMsMjY5NDMsMjY5NDksMjY5ODYsMjY5MzcsMjY5NDYsMjY5NjcsMjY5NjksMjcwMDIsMjY5NTIsMjY5NTMsMjY5MzMsMjY5ODgsMjY5MzEsMjY5NDEsMjY5ODEsMjY4NjQsMjcwMDAsMjY5MzIsMjY5ODUsMjY5NDQsMjY5OTEsMjY5NDgsMjY5OTgsMjY5NjgsMjY5NDUsMjY5OTYsMjY5NTYsMjY5MzksMjY5NTUsMjY5MzUsMjY5NzIsMjY5NTksMjY5NjEsMjY5MzAsMjY5NjIsMjY5MjcsMjcwMDMsMjY5NDAsMjc0NjIsMjc0NjEsMjc0NTksMjc0NTgsMjc0NjQsMjc0NTcsMjc1NDcsNjQwMTMsMjc2NDMsMjc2NDQsMjc2NDEsMjc2MzksMjc2NDAsMjgzMTUsMjgzNzQsMjgzNjAsMjgzMDMsMjgzNTIsMjgzMTksMjgzMDcsMjgzMDgsMjgzMjAsMjgzMzcsMjgzNDUsMjgzNTgsMjgzNzAsMjgzNDksMjgzNTMsMjgzMTgsMjgzNjEsMjgzNDMsMjgzMzYsMjgzNjUsMjgzMjYsMjgzNjcsMjgzMzgsMjgzNTAsMjgzNTUsMjgzODAsMjgzNzYsMjgzMTMsMjgzMDYsMjgzMDIsMjgzMDEsMjgzMjQsMjgzMjEsMjgzNTEsMjgzMzksMjgzNjgsMjgzNjIsMjgzMTEsMjgzMzQsMjgzMjMsMjg5OTksMjkwMTIsMjkwMTAsMjkwMjcsMjkwMjQsMjg5OTMsMjkwMjEsMjkwMjYsMjkwNDIsMjkwNDgsMjkwMzQsMjkwMjUsMjg5OTQsMjkwMTYsMjg5OTUsMjkwMDMsMjkwNDAsMjkwMjMsMjkwMDgsMjkwMTEsMjg5OTYsMjkwMDUsMjkwMTgsMjkyNjMsMjkzMjUsMjkzMjQsMjkzMjksMjkzMjgsMjkzMjYsMjk1MDAsMjk1MDYsMjk0OTksMjk0OTgsMjk1MDQsMjk1MTQsMjk1MTMsMjk3NjQsMjk3NzAsMjk3NzEsMjk3NzgsMjk3NzcsMjk3ODMsMjk3NjAsMjk3NzUsMjk3NzYsMjk3NzQsMjk3NjIsMjk3NjYsMjk3NzMsMjk3ODAsMjk5MjEsMjk5NTEsMjk5NTAsMjk5NDksMjk5ODEsMzAwNzMsMzAwNzEsMjcwMTEsMzAxOTEsMzAyMjMsMzAyMTEsMzAxOTksMzAyMDYsMzAyMDQsMzAyMDEsMzAyMDAsMzAyMjQsMzAyMDMsMzAxOTgsMzAxODksMzAxOTcsMzAyMDUsMzAzNjEsMzAzODksMzA0MjksMzA1NDksMzA1NTksMzA1NjAsMzA1NDYsMzA1NTAsMzA1NTQsMzA1NjksMzA1NjcsMzA1NDgsMzA1NTMsMzA1NzMsMzA2ODgsMzA4NTUsMzA4NzQsMzA4NjgsMzA4NjMsMzA4NTIsMzA4NjksMzA4NTMsMzA4NTQsMzA4ODEsMzA4NTEsMzA4NDEsMzA4NzMsMzA4NDgsMzA4NzAsMzA4NDMsMzExMDAsMzExMDYsMzExMDEsMzEwOTcsMzEyNDksMzEyNTYsMzEyNTcsMzEyNTAsMzEyNTUsMzEyNTMsMzEyNjYsMzEyNTEsMzEyNTksMzEyNDgsMzEzOTUsMzEzOTQsMzEzOTAsMzE0NjcsMzE1OTAsMzE1ODgsMzE1OTcsMzE2MDQsMzE1OTMsMzE2MDIsMzE1ODksMzE2MDMsMzE2MDEsMzE2MDAsMzE1ODUsMzE2MDgsMzE2MDYsMzE1ODcsMzE5MjIsMzE5MjQsMzE5MTksMzIxMzYsMzIxMzQsMzIxMjgsMzIxNDEsMzIxMjcsMzIxMzMsMzIxMjIsMzIxNDIsMzIxMjMsMzIxMzEsMzIxMjQsMzIxNDAsMzIxNDgsMzIxMzIsMzIxMjUsMzIxNDYsMzI2MjEsMzI2MTksMzI2MTUsMzI2MTYsMzI2MjAsMzI2NzgsMzI2NzcsMzI2NzksMzI3MzEsMzI3MzIsMzI4MDEsMzMxMjQsMzMxMjAsMzMxNDMsMzMxMTYsMzMxMjksMzMxMTUsMzMxMjIsMzMxMzgsMjY0MDEsMzMxMTgsMzMxNDIsMzMxMjcsMzMxMzUsMzMwOTIsMzMxMjEsMzMzMDksMzMzNTMsMzMzNDgsMzMzNDQsMzMzNDYsMzMzNDksMzQwMzMsMzM4NTUsMzM4NzgsMzM5MTAsMzM5MTMsMzM5MzUsMzM5MzMsMzM4OTMsMzM4NzMsMzM4NTYsMzM5MjYsMzM4OTUsMzM4NDAsMzM4NjksMzM5MTcsMzM4ODIsMzM4ODEsMzM5MDgsMzM5MDcsMzM4ODUsMzQwNTUsMzM4ODYsMzM4NDcsMzM4NTAsMzM4NDQsMzM5MTQsMzM4NTksMzM5MTIsMzM4NDIsMzM4NjEsMzM4MzMsMzM3NTMsMzM4NjcsMzM4MzksMzM4NTgsMzM4MzcsMzM4ODcsMzM5MDQsMzM4NDksMzM4NzAsMzM4NjgsMzM4NzQsMzM5MDMsMzM5ODksMzM5MzQsMzM4NTEsMzM4NjMsMzM4NDYsMzM4NDMsMzM4OTYsMzM5MTgsMzM4NjAsMzM4MzUsMzM4ODgsMzM4NzYsMzM5MDIsMzM4NzIsMzQ1NzEsMzQ1NjQsMzQ1NTEsMzQ1NzIsMzQ1NTQsMzQ1MTgsMzQ1NDksMzQ2MzcsMzQ1NTIsMzQ1NzQsMzQ1NjksMzQ1NjEsMzQ1NTAsMzQ1NzMsMzQ1NjUsMzUwMzAsMzUwMTksMzUwMjEsMzUwMjIsMzUwMzgsMzUwMzUsMzUwMzQsMzUwMjAsMzUwMjQsMzUyMDUsMzUyMjcsMzUyOTUsMzUzMDEsMzUzMDAsMzUyOTcsMzUyOTYsMzUyOTgsMzUyOTIsMzUzMDIsMzU0NDYsMzU0NjIsMzU0NTUsMzU0MjUsMzUzOTEsMzU0NDcsMzU0NTgsMzU0NjAsMzU0NDUsMzU0NTksMzU0NTcsMzU0NDQsMzU0NTAsMzU5MDAsMzU5MTUsMzU5MTQsMzU5NDEsMzU5NDAsMzU5NDIsMzU5NzQsMzU5NzIsMzU5NzMsMzYwNDQsMzYyMDAsMzYyMDEsMzYyNDEsMzYyMzYsMzYyMzgsMzYyMzksMzYyMzcsMzYyNDMsMzYyNDQsMzYyNDAsMzYyNDIsMzYzMzYsMzYzMjAsMzYzMzIsMzYzMzcsMzYzMzQsMzYzMDQsMzYzMjksMzYzMjMsMzYzMjIsMzYzMjcsMzYzMzgsMzYzMzEsMzYzNDAsMzY2MTQsMzY2MDcsMzY2MDksMzY2MDgsMzY2MTMsMzY2MTUsMzY2MTYsMzY2MTAsMzY2MTksMzY5NDYsMzY5MjcsMzY5MzIsMzY5MzcsMzY5MjUsMzcxMzYsMzcxMzMsMzcxMzUsMzcxMzcsMzcxNDIsMzcxNDAsMzcxMzEsMzcxMzQsMzcyMzAsMzcyMzEsMzc0NDgsMzc0NTgsMzc0MjQsMzc0MzQsMzc0NzgsMzc0MjcsMzc0NzcsMzc0NzAsMzc1MDcsMzc0MjIsMzc0NTAsMzc0NDYsMzc0ODUsMzc0ODQsMzc0NTUsMzc0NzIsMzc0NzksMzc0ODcsMzc0MzAsMzc0NzMsMzc0ODgsMzc0MjUsMzc0NjAsMzc0NzUsMzc0NTYsMzc0OTAsMzc0NTQsMzc0NTksMzc0NTIsMzc0NjIsMzc0MjYsMzgzMDMsMzgzMDAsMzgzMDIsMzgyOTksMzg1NDYsMzg1NDcsMzg1NDUsMzg1NTEsMzg2MDYsMzg2NTAsMzg2NTMsMzg2NDgsMzg2NDUsMzg3NzEsMzg3NzUsMzg3NzYsMzg3NzAsMzg5MjcsMzg5MjUsMzg5MjYsMzkwODQsMzkxNTgsMzkxNjEsMzkzNDMsMzkzNDYsMzkzNDQsMzkzNDksMzk1OTcsMzk1OTUsMzk3NzEsNDAxNzAsNDAxNzMsNDAxNjcsNDA1NzYsNDA3MDEsMjA3MTAsMjA2OTIsMjA2OTUsMjA3MTIsMjA3MjMsMjA2OTksMjA3MTQsMjA3MDEsMjA3MDgsMjA2OTEsMjA3MTYsMjA3MjAsMjA3MTksMjA3MDcsMjA3MDQsMjA5NTIsMjExMjAsMjExMjEsMjEyMjUsMjEyMjcsMjEyOTYsMjE0MjAsMjIwNTUsMjIwMzcsMjIwMjgsMjIwMzQsMjIwMTIsMjIwMzEsMjIwNDQsMjIwMTcsMjIwMzUsMjIwMTgsMjIwMTAsMjIwNDUsMjIwMjAsMjIwMTUsMjIwMDksMjI2NjUsMjI2NTIsMjI2NzIsMjI2ODAsMjI2NjIsMjI2NTcsMjI2NTUsMjI2NDQsMjI2NjcsMjI2NTAsMjI2NjMsMjI2NzMsMjI2NzAsMjI2NDYsMjI2NTgsMjI2NjQsMjI2NTEsMjI2NzYsMjI2NzEsMjI3ODIsMjI4OTEsMjMyNjAsMjMyNzgsMjMyNjksMjMyNTMsMjMyNzQsMjMyNTgsMjMyNzcsMjMyNzUsMjMyODMsMjMyNjYsMjMyNjQsMjMyNTksMjMyNzYsMjMyNjIsMjMyNjEsMjMyNTcsMjMyNzIsMjMyNjMsMjM0MTUsMjM1MjAsMjM1MjMsMjM2NTEsMjM5MzgsMjM5MzYsMjM5MzMsMjM5NDIsMjM5MzAsMjM5MzcsMjM5MjcsMjM5NDYsMjM5NDUsMjM5NDQsMjM5MzQsMjM5MzIsMjM5NDksMjM5MjksMjM5MzUsMjQxNTIsMjQxNTMsMjQxNDcsMjQyODAsMjQyNzMsMjQyNzksMjQyNzAsMjQyODQsMjQyNzcsMjQyODEsMjQyNzQsMjQyNzYsMjQzODgsMjQzODcsMjQ0MzEsMjQ1MDIsMjQ4NzYsMjQ4NzIsMjQ4OTcsMjQ5MjYsMjQ5NDUsMjQ5NDcsMjQ5MTQsMjQ5MTUsMjQ5NDYsMjQ5NDAsMjQ5NjAsMjQ5NDgsMjQ5MTYsMjQ5NTQsMjQ5MjMsMjQ5MzMsMjQ4OTEsMjQ5MzgsMjQ5MjksMjQ5MTgsMjUxMjksMjUxMjcsMjUxMzEsMjU2NDMsMjU2NzcsMjU2OTEsMjU2OTMsMjU3MTYsMjU3MTgsMjU3MTQsMjU3MTUsMjU3MjUsMjU3MTcsMjU3MDIsMjU3NjYsMjU2NzgsMjU3MzAsMjU2OTQsMjU2OTIsMjU2NzUsMjU2ODMsMjU2OTYsMjU2ODAsMjU3MjcsMjU2NjMsMjU3MDgsMjU3MDcsMjU2ODksMjU3MDEsMjU3MTksMjU5NzEsMjYwMTYsMjYyNzMsMjYyNzIsMjYyNzEsMjYzNzMsMjYzNzIsMjY0MDIsMjcwNTcsMjcwNjIsMjcwODEsMjcwNDAsMjcwODYsMjcwMzAsMjcwNTYsMjcwNTIsMjcwNjgsMjcwMjUsMjcwMzMsMjcwMjIsMjcwNDcsMjcwMjEsMjcwNDksMjcwNzAsMjcwNTUsMjcwNzEsMjcwNzYsMjcwNjksMjcwNDQsMjcwOTIsMjcwNjUsMjcwODIsMjcwMzQsMjcwODcsMjcwNTksMjcwMjcsMjcwNTAsMjcwNDEsMjcwMzgsMjcwOTcsMjcwMzEsMjcwMjQsMjcwNzQsMjcwNjEsMjcwNDUsMjcwNzgsMjc0NjYsMjc0NjksMjc0NjcsMjc1NTAsMjc1NTEsMjc1NTIsMjc1ODcsMjc1ODgsMjc2NDYsMjgzNjYsMjg0MDUsMjg0MDEsMjg0MTksMjg0NTMsMjg0MDgsMjg0NzEsMjg0MTEsMjg0NjIsMjg0MjUsMjg0OTQsMjg0NDEsMjg0NDIsMjg0NTUsMjg0NDAsMjg0NzUsMjg0MzQsMjgzOTcsMjg0MjYsMjg0NzAsMjg1MzEsMjg0MDksMjgzOTgsMjg0NjEsMjg0ODAsMjg0NjQsMjg0NzYsMjg0NjksMjgzOTUsMjg0MjMsMjg0MzAsMjg0ODMsMjg0MjEsMjg0MTMsMjg0MDYsMjg0NzMsMjg0NDQsMjg0MTIsMjg0NzQsMjg0NDcsMjg0MjksMjg0NDYsMjg0MjQsMjg0NDksMjkwNjMsMjkwNzIsMjkwNjUsMjkwNTYsMjkwNjEsMjkwNTgsMjkwNzEsMjkwNTEsMjkwNjIsMjkwNTcsMjkwNzksMjkyNTIsMjkyNjcsMjkzMzUsMjkzMzMsMjkzMzEsMjk1MDcsMjk1MTcsMjk1MjEsMjk1MTYsMjk3OTQsMjk4MTEsMjk4MDksMjk4MTMsMjk4MTAsMjk3OTksMjk4MDYsMjk5NTIsMjk5NTQsMjk5NTUsMzAwNzcsMzAwOTYsMzAyMzAsMzAyMTYsMzAyMjAsMzAyMjksMzAyMjUsMzAyMTgsMzAyMjgsMzAzOTIsMzA1OTMsMzA1ODgsMzA1OTcsMzA1OTQsMzA1NzQsMzA1OTIsMzA1NzUsMzA1OTAsMzA1OTUsMzA4OTgsMzA4OTAsMzA5MDAsMzA4OTMsMzA4ODgsMzA4NDYsMzA4OTEsMzA4NzgsMzA4ODUsMzA4ODAsMzA4OTIsMzA4ODIsMzA4ODQsMzExMjgsMzExMTQsMzExMTUsMzExMjYsMzExMjUsMzExMjQsMzExMjMsMzExMjcsMzExMTIsMzExMjIsMzExMjAsMzEyNzUsMzEzMDYsMzEyODAsMzEyNzksMzEyNzIsMzEyNzAsMzE0MDAsMzE0MDMsMzE0MDQsMzE0NzAsMzE2MjQsMzE2NDQsMzE2MjYsMzE2MzMsMzE2MzIsMzE2MzgsMzE2MjksMzE2MjgsMzE2NDMsMzE2MzAsMzE2MjEsMzE2NDAsMjExMjQsMzE2NDEsMzE2NTIsMzE2MTgsMzE5MzEsMzE5MzUsMzE5MzIsMzE5MzAsMzIxNjcsMzIxODMsMzIxOTQsMzIxNjMsMzIxNzAsMzIxOTMsMzIxOTIsMzIxOTcsMzIxNTcsMzIyMDYsMzIxOTYsMzIxOTgsMzIyMDMsMzIyMDQsMzIxNzUsMzIxODUsMzIxNTAsMzIxODgsMzIxNTksMzIxNjYsMzIxNzQsMzIxNjksMzIxNjEsMzIyMDEsMzI2MjcsMzI3MzgsMzI3MzksMzI3NDEsMzI3MzQsMzI4MDQsMzI4NjEsMzI4NjAsMzMxNjEsMzMxNTgsMzMxNTUsMzMxNTksMzMxNjUsMzMxNjQsMzMxNjMsMzMzMDEsMzM5NDMsMzM5NTYsMzM5NTMsMzM5NTEsMzM5NzgsMzM5OTgsMzM5ODYsMzM5NjQsMzM5NjYsMzM5NjMsMzM5NzcsMzM5NzIsMzM5ODUsMzM5OTcsMzM5NjIsMzM5NDYsMzM5NjksMzQwMDAsMzM5NDksMzM5NTksMzM5NzksMzM5NTQsMzM5NDAsMzM5OTEsMzM5OTYsMzM5NDcsMzM5NjEsMzM5NjcsMzM5NjAsMzQwMDYsMzM5NDQsMzM5NzQsMzM5OTksMzM5NTIsMzQwMDcsMzQwMDQsMzQwMDIsMzQwMTEsMzM5NjgsMzM5MzcsMzQ0MDEsMzQ2MTEsMzQ1OTUsMzQ2MDAsMzQ2NjcsMzQ2MjQsMzQ2MDYsMzQ1OTAsMzQ1OTMsMzQ1ODUsMzQ1ODcsMzQ2MjcsMzQ2MDQsMzQ2MjUsMzQ2MjIsMzQ2MzAsMzQ1OTIsMzQ2MTAsMzQ2MDIsMzQ2MDUsMzQ2MjAsMzQ1NzgsMzQ2MTgsMzQ2MDksMzQ2MTMsMzQ2MjYsMzQ1OTgsMzQ1OTksMzQ2MTYsMzQ1OTYsMzQ1ODYsMzQ2MDgsMzQ1NzcsMzUwNjMsMzUwNDcsMzUwNTcsMzUwNTgsMzUwNjYsMzUwNzAsMzUwNTQsMzUwNjgsMzUwNjIsMzUwNjcsMzUwNTYsMzUwNTIsMzUwNTEsMzUyMjksMzUyMzMsMzUyMzEsMzUyMzAsMzUzMDUsMzUzMDcsMzUzMDQsMzU0OTksMzU0ODEsMzU0NjcsMzU0NzQsMzU0NzEsMzU0NzgsMzU5MDEsMzU5NDQsMzU5NDUsMzYwNTMsMzYwNDcsMzYwNTUsMzYyNDYsMzYzNjEsMzYzNTQsMzYzNTEsMzYzNjUsMzYzNDksMzYzNjIsMzYzNTUsMzYzNTksMzYzNTgsMzYzNTcsMzYzNTAsMzYzNTIsMzYzNTYsMzY2MjQsMzY2MjUsMzY2MjIsMzY2MjEsMzcxNTUsMzcxNDgsMzcxNTIsMzcxNTQsMzcxNTEsMzcxNDksMzcxNDYsMzcxNTYsMzcxNTMsMzcxNDcsMzcyNDIsMzcyMzQsMzcyNDEsMzcyMzUsMzc1NDEsMzc1NDAsMzc0OTQsMzc1MzEsMzc0OTgsMzc1MzYsMzc1MjQsMzc1NDYsMzc1MTcsMzc1NDIsMzc1MzAsMzc1NDcsMzc0OTcsMzc1MjcsMzc1MDMsMzc1MzksMzc2MTQsMzc1MTgsMzc1MDYsMzc1MjUsMzc1MzgsMzc1MDEsMzc1MTIsMzc1MzcsMzc1MTQsMzc1MTAsMzc1MTYsMzc1MjksMzc1NDMsMzc1MDIsMzc1MTEsMzc1NDUsMzc1MzMsMzc1MTUsMzc0MjEsMzg1NTgsMzg1NjEsMzg2NTUsMzg3NDQsMzg3ODEsMzg3NzgsMzg3ODIsMzg3ODcsMzg3ODQsMzg3ODYsMzg3NzksMzg3ODgsMzg3ODUsMzg3ODMsMzg4NjIsMzg4NjEsMzg5MzQsMzkwODUsMzkwODYsMzkxNzAsMzkxNjgsMzkxNzUsMzkzMjUsMzkzMjQsMzkzNjMsMzkzNTMsMzkzNTUsMzkzNTQsMzkzNjIsMzkzNTcsMzkzNjcsMzk2MDEsMzk2NTEsMzk2NTUsMzk3NDIsMzk3NDMsMzk3NzYsMzk3NzcsMzk3NzUsNDAxNzcsNDAxNzgsNDAxODEsNDA2MTUsMjA3MzUsMjA3MzksMjA3ODQsMjA3MjgsMjA3NDIsMjA3NDMsMjA3MjYsMjA3MzQsMjA3NDcsMjA3NDgsMjA3MzMsMjA3NDYsMjExMzEsMjExMzIsMjEyMzMsMjEyMzEsMjIwODgsMjIwODIsMjIwOTIsMjIwNjksMjIwODEsMjIwOTAsMjIwODksMjIwODYsMjIxMDQsMjIxMDYsMjIwODAsMjIwNjcsMjIwNzcsMjIwNjAsMjIwNzgsMjIwNzIsMjIwNTgsMjIwNzQsMjIyOTgsMjI2OTksMjI2ODUsMjI3MDUsMjI2ODgsMjI2OTEsMjI3MDMsMjI3MDAsMjI2OTMsMjI2ODksMjI3ODMsMjMyOTUsMjMyODQsMjMyOTMsMjMyODcsMjMyODYsMjMyOTksMjMyODgsMjMyOTgsMjMyODksMjMyOTcsMjMzMDMsMjMzMDEsMjMzMTEsMjM2NTUsMjM5NjEsMjM5NTksMjM5NjcsMjM5NTQsMjM5NzAsMjM5NTUsMjM5NTcsMjM5NjgsMjM5NjQsMjM5NjksMjM5NjIsMjM5NjYsMjQxNjksMjQxNTcsMjQxNjAsMjQxNTYsMzIyNDMsMjQyODMsMjQyODYsMjQyODksMjQzOTMsMjQ0OTgsMjQ5NzEsMjQ5NjMsMjQ5NTMsMjUwMDksMjUwMDgsMjQ5OTQsMjQ5NjksMjQ5ODcsMjQ5NzksMjUwMDcsMjUwMDUsMjQ5OTEsMjQ5NzgsMjUwMDIsMjQ5OTMsMjQ5NzMsMjQ5MzQsMjUwMTEsMjUxMzMsMjU3MTAsMjU3MTIsMjU3NTAsMjU3NjAsMjU3MzMsMjU3NTEsMjU3NTYsMjU3NDMsMjU3MzksMjU3MzgsMjU3NDAsMjU3NjMsMjU3NTksMjU3MDQsMjU3NzcsMjU3NTIsMjU5NzQsMjU5NzgsMjU5NzcsMjU5NzksMjYwMzQsMjYwMzUsMjYyOTMsMjYyODgsMjYyODEsMjYyOTAsMjYyOTUsMjYyODIsMjYyODcsMjcxMzYsMjcxNDIsMjcxNTksMjcxMDksMjcxMjgsMjcxNTcsMjcxMjEsMjcxMDgsMjcxNjgsMjcxMzUsMjcxMTYsMjcxMDYsMjcxNjMsMjcxNjUsMjcxMzQsMjcxNzUsMjcxMjIsMjcxMTgsMjcxNTYsMjcxMjcsMjcxMTEsMjcyMDAsMjcxNDQsMjcxMTAsMjcxMzEsMjcxNDksMjcxMzIsMjcxMTUsMjcxNDUsMjcxNDAsMjcxNjAsMjcxNzMsMjcxNTEsMjcxMjYsMjcxNzQsMjcxNDMsMjcxMjQsMjcxNTgsMjc0NzMsMjc1NTcsMjc1NTUsMjc1NTQsMjc1NTgsMjc2NDksMjc2NDgsMjc2NDcsMjc2NTAsMjg0ODEsMjg0NTQsMjg1NDIsMjg1NTEsMjg2MTQsMjg1NjIsMjg1NTcsMjg1NTMsMjg1NTYsMjg1MTQsMjg0OTUsMjg1NDksMjg1MDYsMjg1NjYsMjg1MzQsMjg1MjQsMjg1NDYsMjg1MDEsMjg1MzAsMjg0OTgsMjg0OTYsMjg1MDMsMjg1NjQsMjg1NjMsMjg1MDksMjg0MTYsMjg1MTMsMjg1MjMsMjg1NDEsMjg1MTksMjg1NjAsMjg0OTksMjg1NTUsMjg1MjEsMjg1NDMsMjg1NjUsMjg1MTUsMjg1MzUsMjg1MjIsMjg1MzksMjkxMDYsMjkxMDMsMjkwODMsMjkxMDQsMjkwODgsMjkwODIsMjkwOTcsMjkxMDksMjkwODUsMjkwOTMsMjkwODYsMjkwOTIsMjkwODksMjkwOTgsMjkwODQsMjkwOTUsMjkxMDcsMjkzMzYsMjkzMzgsMjk1MjgsMjk1MjIsMjk1MzQsMjk1MzUsMjk1MzYsMjk1MzMsMjk1MzEsMjk1MzcsMjk1MzAsMjk1MjksMjk1MzgsMjk4MzEsMjk4MzMsMjk4MzQsMjk4MzAsMjk4MjUsMjk4MjEsMjk4MjksMjk4MzIsMjk4MjAsMjk4MTcsMjk5NjAsMjk5NTksMzAwNzgsMzAyNDUsMzAyMzgsMzAyMzMsMzAyMzcsMzAyMzYsMzAyNDMsMzAyMzQsMzAyNDgsMzAyMzUsMzAzNjQsMzAzNjUsMzAzNjYsMzAzNjMsMzA2MDUsMzA2MDcsMzA2MDEsMzA2MDAsMzA5MjUsMzA5MDcsMzA5MjcsMzA5MjQsMzA5MjksMzA5MjYsMzA5MzIsMzA5MjAsMzA5MTUsMzA5MTYsMzA5MjEsMzExMzAsMzExMzcsMzExMzYsMzExMzIsMzExMzgsMzExMzEsMjc1MTAsMzEyODksMzE0MTAsMzE0MTIsMzE0MTEsMzE2NzEsMzE2OTEsMzE2NzgsMzE2NjAsMzE2OTQsMzE2NjMsMzE2NzMsMzE2OTAsMzE2NjksMzE5NDEsMzE5NDQsMzE5NDgsMzE5NDcsMzIyNDcsMzIyMTksMzIyMzQsMzIyMzEsMzIyMTUsMzIyMjUsMzIyNTksMzIyNTAsMzIyMzAsMzIyNDYsMzIyNDEsMzIyNDAsMzIyMzgsMzIyMjMsMzI2MzAsMzI2ODQsMzI2ODgsMzI2ODUsMzI3NDksMzI3NDcsMzI3NDYsMzI3NDgsMzI3NDIsMzI3NDQsMzI4NjgsMzI4NzEsMzMxODcsMzMxODMsMzMxODIsMzMxNzMsMzMxODYsMzMxNzcsMzMxNzUsMzMzMDIsMzMzNTksMzMzNjMsMzMzNjIsMzMzNjAsMzMzNTgsMzMzNjEsMzQwODQsMzQxMDcsMzQwNjMsMzQwNDgsMzQwODksMzQwNjIsMzQwNTcsMzQwNjEsMzQwNzksMzQwNTgsMzQwODcsMzQwNzYsMzQwNDMsMzQwOTEsMzQwNDIsMzQwNTYsMzQwNjAsMzQwMzYsMzQwOTAsMzQwMzQsMzQwNjksMzQwMzksMzQwMjcsMzQwMzUsMzQwNDQsMzQwNjYsMzQwMjYsMzQwMjUsMzQwNzAsMzQwNDYsMzQwODgsMzQwNzcsMzQwOTQsMzQwNTAsMzQwNDUsMzQwNzgsMzQwMzgsMzQwOTcsMzQwODYsMzQwMjMsMzQwMjQsMzQwMzIsMzQwMzEsMzQwNDEsMzQwNzIsMzQwODAsMzQwOTYsMzQwNTksMzQwNzMsMzQwOTUsMzQ0MDIsMzQ2NDYsMzQ2NTksMzQ2NjAsMzQ2NzksMzQ3ODUsMzQ2NzUsMzQ2NDgsMzQ2NDQsMzQ2NTEsMzQ2NDIsMzQ2NTcsMzQ2NTAsMzQ2NDEsMzQ2NTQsMzQ2NjksMzQ2NjYsMzQ2NDAsMzQ2MzgsMzQ2NTUsMzQ2NTMsMzQ2NzEsMzQ2NjgsMzQ2ODIsMzQ2NzAsMzQ2NTIsMzQ2NjEsMzQ2MzksMzQ2ODMsMzQ2NzcsMzQ2NTgsMzQ2NjMsMzQ2NjUsMzQ5MDYsMzUwNzcsMzUwODQsMzUwOTIsMzUwODMsMzUwOTUsMzUwOTYsMzUwOTcsMzUwNzgsMzUwOTQsMzUwODksMzUwODYsMzUwODEsMzUyMzQsMzUyMzYsMzUyMzUsMzUzMDksMzUzMTIsMzUzMDgsMzU1MzUsMzU1MjYsMzU1MTIsMzU1MzksMzU1MzcsMzU1NDAsMzU1NDEsMzU1MTUsMzU1NDMsMzU1MTgsMzU1MjAsMzU1MjUsMzU1NDQsMzU1MjMsMzU1MTQsMzU1MTcsMzU1NDUsMzU5MDIsMzU5MTcsMzU5ODMsMzYwNjksMzYwNjMsMzYwNTcsMzYwNzIsMzYwNTgsMzYwNjEsMzYwNzEsMzYyNTYsMzYyNTIsMzYyNTcsMzYyNTEsMzYzODQsMzYzODcsMzYzODksMzYzODgsMzYzOTgsMzYzNzMsMzYzNzksMzYzNzQsMzYzNjksMzYzNzcsMzYzOTAsMzYzOTEsMzYzNzIsMzYzNzAsMzYzNzYsMzYzNzEsMzYzODAsMzYzNzUsMzYzNzgsMzY2NTIsMzY2NDQsMzY2MzIsMzY2MzQsMzY2NDAsMzY2NDMsMzY2MzAsMzY2MzEsMzY5NzksMzY5NzYsMzY5NzUsMzY5NjcsMzY5NzEsMzcxNjcsMzcxNjMsMzcxNjEsMzcxNjIsMzcxNzAsMzcxNTgsMzcxNjYsMzcyNTMsMzcyNTQsMzcyNTgsMzcyNDksMzcyNTAsMzcyNTIsMzcyNDgsMzc1ODQsMzc1NzEsMzc1NzIsMzc1NjgsMzc1OTMsMzc1NTgsMzc1ODMsMzc2MTcsMzc1OTksMzc1OTIsMzc2MDksMzc1OTEsMzc1OTcsMzc1ODAsMzc2MTUsMzc1NzAsMzc2MDgsMzc1NzgsMzc1NzYsMzc1ODIsMzc2MDYsMzc1ODEsMzc1ODksMzc1NzcsMzc2MDAsMzc1OTgsMzc2MDcsMzc1ODUsMzc1ODcsMzc1NTcsMzc2MDEsMzc1NzQsMzc1NTYsMzgyNjgsMzgzMTYsMzgzMTUsMzgzMTgsMzgzMjAsMzg1NjQsMzg1NjIsMzg2MTEsMzg2NjEsMzg2NjQsMzg2NTgsMzg3NDYsMzg3OTQsMzg3OTgsMzg3OTIsMzg4NjQsMzg4NjMsMzg5NDIsMzg5NDEsMzg5NTAsMzg5NTMsMzg5NTIsMzg5NDQsMzg5MzksMzg5NTEsMzkwOTAsMzkxNzYsMzkxNjIsMzkxODUsMzkxODgsMzkxOTAsMzkxOTEsMzkxODksMzkzODgsMzkzNzMsMzkzNzUsMzkzNzksMzkzODAsMzkzNzQsMzkzNjksMzkzODIsMzkzODQsMzkzNzEsMzkzODMsMzkzNzIsMzk2MDMsMzk2NjAsMzk2NTksMzk2NjcsMzk2NjYsMzk2NjUsMzk3NTAsMzk3NDcsMzk3ODMsMzk3OTYsMzk3OTMsMzk3ODIsMzk3OTgsMzk3OTcsMzk3OTIsMzk3ODQsMzk3ODAsMzk3ODgsNDAxODgsNDAxODYsNDAxODksNDAxOTEsNDAxODMsNDAxOTksNDAxOTIsNDAxODUsNDAxODcsNDAyMDAsNDAxOTcsNDAxOTYsNDA1NzksNDA2NTksNDA3MTksNDA3MjAsMjA3NjQsMjA3NTUsMjA3NTksMjA3NjIsMjA3NTMsMjA5NTgsMjEzMDAsMjE0NzMsMjIxMjgsMjIxMTIsMjIxMjYsMjIxMzEsMjIxMTgsMjIxMTUsMjIxMjUsMjIxMzAsMjIxMTAsMjIxMzUsMjIzMDAsMjIyOTksMjI3MjgsMjI3MTcsMjI3MjksMjI3MTksMjI3MTQsMjI3MjIsMjI3MTYsMjI3MjYsMjMzMTksMjMzMjEsMjMzMjMsMjMzMjksMjMzMTYsMjMzMTUsMjMzMTIsMjMzMTgsMjMzMzYsMjMzMjIsMjMzMjgsMjMzMjYsMjM1MzUsMjM5ODAsMjM5ODUsMjM5NzcsMjM5NzUsMjM5ODksMjM5ODQsMjM5ODIsMjM5NzgsMjM5NzYsMjM5ODYsMjM5ODEsMjM5ODMsMjM5ODgsMjQxNjcsMjQxNjgsMjQxNjYsMjQxNzUsMjQyOTcsMjQyOTUsMjQyOTQsMjQyOTYsMjQyOTMsMjQzOTUsMjQ1MDgsMjQ5ODksMjUwMDAsMjQ5ODIsMjUwMjksMjUwMTIsMjUwMzAsMjUwMjUsMjUwMzYsMjUwMTgsMjUwMjMsMjUwMTYsMjQ5NzIsMjU4MTUsMjU4MTQsMjU4MDgsMjU4MDcsMjU4MDEsMjU3ODksMjU3MzcsMjU3OTUsMjU4MTksMjU4NDMsMjU4MTcsMjU5MDcsMjU5ODMsMjU5ODAsMjYwMTgsMjYzMTIsMjYzMDIsMjYzMDQsMjYzMTQsMjYzMTUsMjYzMTksMjYzMDEsMjYyOTksMjYyOTgsMjYzMTYsMjY0MDMsMjcxODgsMjcyMzgsMjcyMDksMjcyMzksMjcxODYsMjcyNDAsMjcxOTgsMjcyMjksMjcyNDUsMjcyNTQsMjcyMjcsMjcyMTcsMjcxNzYsMjcyMjYsMjcxOTUsMjcxOTksMjcyMDEsMjcyNDIsMjcyMzYsMjcyMTYsMjcyMTUsMjcyMjAsMjcyNDcsMjcyNDEsMjcyMzIsMjcxOTYsMjcyMzAsMjcyMjIsMjcyMjEsMjcyMTMsMjcyMTQsMjcyMDYsMjc0NzcsMjc0NzYsMjc0NzgsMjc1NTksMjc1NjIsMjc1NjMsMjc1OTIsMjc1OTEsMjc2NTIsMjc2NTEsMjc2NTQsMjg1ODksMjg2MTksMjg1NzksMjg2MTUsMjg2MDQsMjg2MjIsMjg2MTYsMjg1MTAsMjg2MTIsMjg2MDUsMjg1NzQsMjg2MTgsMjg1ODQsMjg2NzYsMjg1ODEsMjg1OTAsMjg2MDIsMjg1ODgsMjg1ODYsMjg2MjMsMjg2MDcsMjg2MDAsMjg1NzgsMjg2MTcsMjg1ODcsMjg2MjEsMjg1OTEsMjg1OTQsMjg1OTIsMjkxMjUsMjkxMjIsMjkxMTksMjkxMTIsMjkxNDIsMjkxMjAsMjkxMjEsMjkxMzEsMjkxNDAsMjkxMzAsMjkxMjcsMjkxMzUsMjkxMTcsMjkxNDQsMjkxMTYsMjkxMjYsMjkxNDYsMjkxNDcsMjkzNDEsMjkzNDIsMjk1NDUsMjk1NDIsMjk1NDMsMjk1NDgsMjk1NDEsMjk1NDcsMjk1NDYsMjk4MjMsMjk4NTAsMjk4NTYsMjk4NDQsMjk4NDIsMjk4NDUsMjk4NTcsMjk5NjMsMzAwODAsMzAyNTUsMzAyNTMsMzAyNTcsMzAyNjksMzAyNTksMzAyNjgsMzAyNjEsMzAyNTgsMzAyNTYsMzAzOTUsMzA0MzgsMzA2MTgsMzA2MjEsMzA2MjUsMzA2MjAsMzA2MTksMzA2MjYsMzA2MjcsMzA2MTMsMzA2MTcsMzA2MTUsMzA5NDEsMzA5NTMsMzA5NDksMzA5NTQsMzA5NDIsMzA5NDcsMzA5MzksMzA5NDUsMzA5NDYsMzA5NTcsMzA5NDMsMzA5NDQsMzExNDAsMzEzMDAsMzEzMDQsMzEzMDMsMzE0MTQsMzE0MTYsMzE0MTMsMzE0MDksMzE0MTUsMzE3MTAsMzE3MTUsMzE3MTksMzE3MDksMzE3MDEsMzE3MTcsMzE3MDYsMzE3MjAsMzE3MzcsMzE3MDAsMzE3MjIsMzE3MTQsMzE3MDgsMzE3MjMsMzE3MDQsMzE3MTEsMzE5NTQsMzE5NTYsMzE5NTksMzE5NTIsMzE5NTMsMzIyNzQsMzIyODksMzIyNzksMzIyNjgsMzIyODcsMzIyODgsMzIyNzUsMzIyNzAsMzIyODQsMzIyNzcsMzIyODIsMzIyOTAsMzIyNjcsMzIyNzEsMzIyNzgsMzIyNjksMzIyNzYsMzIyOTMsMzIyOTIsMzI1NzksMzI2MzUsMzI2MzYsMzI2MzQsMzI2ODksMzI3NTEsMzI4MTAsMzI4MDksMzI4NzYsMzMyMDEsMzMxOTAsMzMxOTgsMzMyMDksMzMyMDUsMzMxOTUsMzMyMDAsMzMxOTYsMzMyMDQsMzMyMDIsMzMyMDcsMzMxOTEsMzMyNjYsMzMzNjUsMzMzNjYsMzMzNjcsMzQxMzQsMzQxMTcsMzQxNTUsMzQxMjUsMzQxMzEsMzQxNDUsMzQxMzYsMzQxMTIsMzQxMTgsMzQxNDgsMzQxMTMsMzQxNDYsMzQxMTYsMzQxMjksMzQxMTksMzQxNDcsMzQxMTAsMzQxMzksMzQxNjEsMzQxMjYsMzQxNTgsMzQxNjUsMzQxMzMsMzQxNTEsMzQxNDQsMzQxODgsMzQxNTAsMzQxNDEsMzQxMzIsMzQxNDksMzQxNTYsMzQ0MDMsMzQ0MDUsMzQ0MDQsMzQ3MTUsMzQ3MDMsMzQ3MTEsMzQ3MDcsMzQ3MDYsMzQ2OTYsMzQ2ODksMzQ3MTAsMzQ3MTIsMzQ2ODEsMzQ2OTUsMzQ3MjMsMzQ2OTMsMzQ3MDQsMzQ3MDUsMzQ3MTcsMzQ2OTIsMzQ3MDgsMzQ3MTYsMzQ3MTQsMzQ2OTcsMzUxMDIsMzUxMTAsMzUxMjAsMzUxMTcsMzUxMTgsMzUxMTEsMzUxMjEsMzUxMDYsMzUxMTMsMzUxMDcsMzUxMTksMzUxMTYsMzUxMDMsMzUzMTMsMzU1NTIsMzU1NTQsMzU1NzAsMzU1NzIsMzU1NzMsMzU1NDksMzU2MDQsMzU1NTYsMzU1NTEsMzU1NjgsMzU1MjgsMzU1NTAsMzU1NTMsMzU1NjAsMzU1ODMsMzU1NjcsMzU1NzksMzU5ODUsMzU5ODYsMzU5ODQsMzYwODUsMzYwNzgsMzYwODEsMzYwODAsMzYwODMsMzYyMDQsMzYyMDYsMzYyNjEsMzYyNjMsMzY0MDMsMzY0MTQsMzY0MDgsMzY0MTYsMzY0MjEsMzY0MDYsMzY0MTIsMzY0MTMsMzY0MTcsMzY0MDAsMzY0MTUsMzY1NDEsMzY2NjIsMzY2NTQsMzY2NjEsMzY2NTgsMzY2NjUsMzY2NjMsMzY2NjAsMzY5ODIsMzY5ODUsMzY5ODcsMzY5OTgsMzcxMTQsMzcxNzEsMzcxNzMsMzcxNzQsMzcyNjcsMzcyNjQsMzcyNjUsMzcyNjEsMzcyNjMsMzc2NzEsMzc2NjIsMzc2NDAsMzc2NjMsMzc2MzgsMzc2NDcsMzc3NTQsMzc2ODgsMzc2OTIsMzc2NTksMzc2NjcsMzc2NTAsMzc2MzMsMzc3MDIsMzc2NzcsMzc2NDYsMzc2NDUsMzc1NzksMzc2NjEsMzc2MjYsMzc2NjksMzc2NTEsMzc2MjUsMzc2MjMsMzc2ODQsMzc2MzQsMzc2NjgsMzc2MzEsMzc2NzMsMzc2ODksMzc2ODUsMzc2NzQsMzc2NTIsMzc2NDQsMzc2NDMsMzc2MzAsMzc2NDEsMzc2MzIsMzc2MjcsMzc2NTQsMzgzMzIsMzgzNDksMzgzMzQsMzgzMjksMzgzMzAsMzgzMjYsMzgzMzUsMzgzMjUsMzgzMzMsMzg1NjksMzg2MTIsMzg2NjcsMzg2NzQsMzg2NzIsMzg4MDksMzg4MDcsMzg4MDQsMzg4OTYsMzg5MDQsMzg5NjUsMzg5NTksMzg5NjIsMzkyMDQsMzkxOTksMzkyMDcsMzkyMDksMzkzMjYsMzk0MDYsMzk0MDQsMzkzOTcsMzkzOTYsMzk0MDgsMzkzOTUsMzk0MDIsMzk0MDEsMzkzOTksMzk2MDksMzk2MTUsMzk2MDQsMzk2MTEsMzk2NzAsMzk2NzQsMzk2NzMsMzk2NzEsMzk3MzEsMzk4MDgsMzk4MTMsMzk4MTUsMzk4MDQsMzk4MDYsMzk4MDMsMzk4MTAsMzk4MjcsMzk4MjYsMzk4MjQsMzk4MDIsMzk4MjksMzk4MDUsMzk4MTYsNDAyMjksNDAyMTUsNDAyMjQsNDAyMjIsNDAyMTIsNDAyMzMsNDAyMjEsNDAyMTYsNDAyMjYsNDAyMDgsNDAyMTcsNDAyMjMsNDA1ODQsNDA1ODIsNDA1ODMsNDA2MjIsNDA2MjEsNDA2NjEsNDA2NjIsNDA2OTgsNDA3MjIsNDA3NjUsMjA3NzQsMjA3NzMsMjA3NzAsMjA3NzIsMjA3NjgsMjA3NzcsMjEyMzYsMjIxNjMsMjIxNTYsMjIxNTcsMjIxNTAsMjIxNDgsMjIxNDcsMjIxNDIsMjIxNDYsMjIxNDMsMjIxNDUsMjI3NDIsMjI3NDAsMjI3MzUsMjI3MzgsMjMzNDEsMjMzMzMsMjMzNDYsMjMzMzEsMjMzNDAsMjMzMzUsMjMzMzQsMjMzNDMsMjMzNDIsMjM0MTksMjM1MzcsMjM1MzgsMjM5OTEsMjQxNzIsMjQxNzAsMjQ1MTAsMjQ1MDcsMjUwMjcsMjUwMTMsMjUwMjAsMjUwNjMsMjUwNTYsMjUwNjEsMjUwNjAsMjUwNjQsMjUwNTQsMjU4MzksMjU4MzMsMjU4MjcsMjU4MzUsMjU4MjgsMjU4MzIsMjU5ODUsMjU5ODQsMjYwMzgsMjYwNzQsMjYzMjIsMjcyNzcsMjcyODYsMjcyNjUsMjczMDEsMjcyNzMsMjcyOTUsMjcyOTEsMjcyOTcsMjcyOTQsMjcyNzEsMjcyODMsMjcyNzgsMjcyODUsMjcyNjcsMjczMDQsMjczMDAsMjcyODEsMjcyNjMsMjczMDIsMjcyOTAsMjcyNjksMjcyNzYsMjcyODIsMjc0ODMsMjc1NjUsMjc2NTcsMjg2MjAsMjg1ODUsMjg2NjAsMjg2MjgsMjg2NDMsMjg2MzYsMjg2NTMsMjg2NDcsMjg2NDYsMjg2MzgsMjg2NTgsMjg2MzcsMjg2NDIsMjg2NDgsMjkxNTMsMjkxNjksMjkxNjAsMjkxNzAsMjkxNTYsMjkxNjgsMjkxNTQsMjk1NTUsMjk1NTAsMjk1NTEsMjk4NDcsMjk4NzQsMjk4NjcsMjk4NDAsMjk4NjYsMjk4NjksMjk4NzMsMjk4NjEsMjk4NzEsMjk5NjgsMjk5NjksMjk5NzAsMjk5NjcsMzAwODQsMzAyNzUsMzAyODAsMzAyODEsMzAyNzksMzAzNzIsMzA0NDEsMzA2NDUsMzA2MzUsMzA2NDIsMzA2NDcsMzA2NDYsMzA2NDQsMzA2NDEsMzA2MzIsMzA3MDQsMzA5NjMsMzA5NzMsMzA5NzgsMzA5NzEsMzA5NzIsMzA5NjIsMzA5ODEsMzA5NjksMzA5NzQsMzA5ODAsMzExNDcsMzExNDQsMzEzMjQsMzEzMjMsMzEzMTgsMzEzMjAsMzEzMTYsMzEzMjIsMzE0MjIsMzE0MjQsMzE0MjUsMzE3NDksMzE3NTksMzE3MzAsMzE3NDQsMzE3NDMsMzE3MzksMzE3NTgsMzE3MzIsMzE3NTUsMzE3MzEsMzE3NDYsMzE3NTMsMzE3NDcsMzE3NDUsMzE3MzYsMzE3NDEsMzE3NTAsMzE3MjgsMzE3MjksMzE3NjAsMzE3NTQsMzE5NzYsMzIzMDEsMzIzMTYsMzIzMjIsMzIzMDcsMzg5ODQsMzIzMTIsMzIyOTgsMzIzMjksMzIzMjAsMzIzMjcsMzIyOTcsMzIzMzIsMzIzMDQsMzIzMTUsMzIzMTAsMzIzMjQsMzIzMTQsMzI1ODEsMzI2MzksMzI2MzgsMzI2MzcsMzI3NTYsMzI3NTQsMzI4MTIsMzMyMTEsMzMyMjAsMzMyMjgsMzMyMjYsMzMyMjEsMzMyMjMsMzMyMTIsMzMyNTcsMzMzNzEsMzMzNzAsMzMzNzIsMzQxNzksMzQxNzYsMzQxOTEsMzQyMTUsMzQxOTcsMzQyMDgsMzQxODcsMzQyMTEsMzQxNzEsMzQyMTIsMzQyMDIsMzQyMDYsMzQxNjcsMzQxNzIsMzQxODUsMzQyMDksMzQxNzAsMzQxNjgsMzQxMzUsMzQxOTAsMzQxOTgsMzQxODIsMzQxODksMzQyMDEsMzQyMDUsMzQxNzcsMzQyMTAsMzQxNzgsMzQxODQsMzQxODEsMzQxNjksMzQxNjYsMzQyMDAsMzQxOTIsMzQyMDcsMzQ0MDgsMzQ3NTAsMzQ3MzAsMzQ3MzMsMzQ3NTcsMzQ3MzYsMzQ3MzIsMzQ3NDUsMzQ3NDEsMzQ3NDgsMzQ3MzQsMzQ3NjEsMzQ3NTUsMzQ3NTQsMzQ3NjQsMzQ3NDMsMzQ3MzUsMzQ3NTYsMzQ3NjIsMzQ3NDAsMzQ3NDIsMzQ3NTEsMzQ3NDQsMzQ3NDksMzQ3ODIsMzQ3MzgsMzUxMjUsMzUxMjMsMzUxMzIsMzUxMzQsMzUxMzcsMzUxNTQsMzUxMjcsMzUxMzgsMzUyNDUsMzUyNDcsMzUyNDYsMzUzMTQsMzUzMTUsMzU2MTQsMzU2MDgsMzU2MDYsMzU2MDEsMzU1ODksMzU1OTUsMzU2MTgsMzU1OTksMzU2MDIsMzU2MDUsMzU1OTEsMzU1OTcsMzU1OTIsMzU1OTAsMzU2MTIsMzU2MDMsMzU2MTAsMzU5MTksMzU5NTIsMzU5NTQsMzU5NTMsMzU5NTEsMzU5ODksMzU5ODgsMzYwODksMzYyMDcsMzY0MzAsMzY0MjksMzY0MzUsMzY0MzIsMzY0MjgsMzY0MjMsMzY2NzUsMzY2NzIsMzY5OTcsMzY5OTAsMzcxNzYsMzcyNzQsMzcyODIsMzcyNzUsMzcyNzMsMzcyNzksMzcyODEsMzcyNzcsMzcyODAsMzc3OTMsMzc3NjMsMzc4MDcsMzc3MzIsMzc3MTgsMzc3MDMsMzc3NTYsMzc3MjAsMzc3MjQsMzc3NTAsMzc3MDUsMzc3MTIsMzc3MTMsMzc3MjgsMzc3NDEsMzc3NzUsMzc3MDgsMzc3MzgsMzc3NTMsMzc3MTksMzc3MTcsMzc3MTQsMzc3MTEsMzc3NDUsMzc3NTEsMzc3NTUsMzc3MjksMzc3MjYsMzc3MzEsMzc3MzUsMzc3NjAsMzc3MTAsMzc3MjEsMzgzNDMsMzgzMzYsMzgzNDUsMzgzMzksMzgzNDEsMzgzMjcsMzg1NzQsMzg1NzYsMzg1NzIsMzg2ODgsMzg2ODcsMzg2ODAsMzg2ODUsMzg2ODEsMzg4MTAsMzg4MTcsMzg4MTIsMzg4MTQsMzg4MTMsMzg4NjksMzg4NjgsMzg4OTcsMzg5NzcsMzg5ODAsMzg5ODYsMzg5ODUsMzg5ODEsMzg5NzksMzkyMDUsMzkyMTEsMzkyMTIsMzkyMTAsMzkyMTksMzkyMTgsMzkyMTUsMzkyMTMsMzkyMTcsMzkyMTYsMzkzMjAsMzkzMzEsMzkzMjksMzk0MjYsMzk0MTgsMzk0MTIsMzk0MTUsMzk0MTcsMzk0MTYsMzk0MTQsMzk0MTksMzk0MjEsMzk0MjIsMzk0MjAsMzk0MjcsMzk2MTQsMzk2NzgsMzk2NzcsMzk2ODEsMzk2NzYsMzk3NTIsMzk4MzQsMzk4NDgsMzk4MzgsMzk4MzUsMzk4NDYsMzk4NDEsMzk4NDUsMzk4NDQsMzk4MTQsMzk4NDIsMzk4NDAsMzk4NTUsNDAyNDMsNDAyNTcsNDAyOTUsNDAyNDYsNDAyMzgsNDAyMzksNDAyNDEsNDAyNDgsNDAyNDAsNDAyNjEsNDAyNTgsNDAyNTksNDAyNTQsNDAyNDcsNDAyNTYsNDAyNTMsMzI3NTcsNDAyMzcsNDA1ODYsNDA1ODUsNDA1ODksNDA2MjQsNDA2NDgsNDA2NjYsNDA2OTksNDA3MDMsNDA3NDAsNDA3MzksNDA3MzgsNDA3ODgsNDA4NjQsMjA3ODUsMjA3ODEsMjA3ODIsMjIxNjgsMjIxNzIsMjIxNjcsMjIxNzAsMjIxNzMsMjIxNjksMjI4OTYsMjMzNTYsMjM2NTcsMjM2NTgsMjQwMDAsMjQxNzMsMjQxNzQsMjUwNDgsMjUwNTUsMjUwNjksMjUwNzAsMjUwNzMsMjUwNjYsMjUwNzIsMjUwNjcsMjUwNDYsMjUwNjUsMjU4NTUsMjU4NjAsMjU4NTMsMjU4NDgsMjU4NTcsMjU4NTksMjU4NTIsMjYwMDQsMjYwNzUsMjYzMzAsMjYzMzEsMjYzMjgsMjczMzMsMjczMjEsMjczMjUsMjczNjEsMjczMzQsMjczMjIsMjczMTgsMjczMTksMjczMzUsMjczMTYsMjczMDksMjc0ODYsMjc1OTMsMjc2NTksMjg2NzksMjg2ODQsMjg2ODUsMjg2NzMsMjg2NzcsMjg2OTIsMjg2ODYsMjg2NzEsMjg2NzIsMjg2NjcsMjg3MTAsMjg2NjgsMjg2NjMsMjg2ODIsMjkxODUsMjkxODMsMjkxNzcsMjkxODcsMjkxODEsMjk1NTgsMjk4ODAsMjk4ODgsMjk4NzcsMjk4ODksMjk4ODYsMjk4NzgsMjk4ODMsMjk4OTAsMjk5NzIsMjk5NzEsMzAzMDAsMzAzMDgsMzAyOTcsMzAyODgsMzAyOTEsMzAyOTUsMzAyOTgsMzAzNzQsMzAzOTcsMzA0NDQsMzA2NTgsMzA2NTAsMzA5NzUsMzA5ODgsMzA5OTUsMzA5OTYsMzA5ODUsMzA5OTIsMzA5OTQsMzA5OTMsMzExNDksMzExNDgsMzEzMjcsMzE3NzIsMzE3ODUsMzE3NjksMzE3NzYsMzE3NzUsMzE3ODksMzE3NzMsMzE3ODIsMzE3ODQsMzE3NzgsMzE3ODEsMzE3OTIsMzIzNDgsMzIzMzYsMzIzNDIsMzIzNTUsMzIzNDQsMzIzNTQsMzIzNTEsMzIzMzcsMzIzNTIsMzIzNDMsMzIzMzksMzI2OTMsMzI2OTEsMzI3NTksMzI3NjAsMzI4ODUsMzMyMzMsMzMyMzQsMzMyMzIsMzMzNzUsMzMzNzQsMzQyMjgsMzQyNDYsMzQyNDAsMzQyNDMsMzQyNDIsMzQyMjcsMzQyMjksMzQyMzcsMzQyNDcsMzQyNDQsMzQyMzksMzQyNTEsMzQyNTQsMzQyNDgsMzQyNDUsMzQyMjUsMzQyMzAsMzQyNTgsMzQzNDAsMzQyMzIsMzQyMzEsMzQyMzgsMzQ0MDksMzQ3OTEsMzQ3OTAsMzQ3ODYsMzQ3NzksMzQ3OTUsMzQ3OTQsMzQ3ODksMzQ3ODMsMzQ4MDMsMzQ3ODgsMzQ3NzIsMzQ3ODAsMzQ3NzEsMzQ3OTcsMzQ3NzYsMzQ3ODcsMzQ3MjQsMzQ3NzUsMzQ3NzcsMzQ4MTcsMzQ4MDQsMzQ3OTIsMzQ3ODEsMzUxNTUsMzUxNDcsMzUxNTEsMzUxNDgsMzUxNDIsMzUxNTIsMzUxNTMsMzUxNDUsMzU2MjYsMzU2MjMsMzU2MTksMzU2MzUsMzU2MzIsMzU2MzcsMzU2NTUsMzU2MzEsMzU2NDQsMzU2NDYsMzU2MzMsMzU2MjEsMzU2MzksMzU2MjIsMzU2MzgsMzU2MzAsMzU2MjAsMzU2NDMsMzU2NDUsMzU2NDIsMzU5MDYsMzU5NTcsMzU5OTMsMzU5OTIsMzU5OTEsMzYwOTQsMzYxMDAsMzYwOTgsMzYwOTYsMzY0NDQsMzY0NTAsMzY0NDgsMzY0MzksMzY0MzgsMzY0NDYsMzY0NTMsMzY0NTUsMzY0NDMsMzY0NDIsMzY0NDksMzY0NDUsMzY0NTcsMzY0MzYsMzY2NzgsMzY2NzksMzY2ODAsMzY2ODMsMzcxNjAsMzcxNzgsMzcxNzksMzcxODIsMzcyODgsMzcyODUsMzcyODcsMzcyOTUsMzcyOTAsMzc4MTMsMzc3NzIsMzc3NzgsMzc4MTUsMzc3ODcsMzc3ODksMzc3NjksMzc3OTksMzc3NzQsMzc4MDIsMzc3OTAsMzc3OTgsMzc3ODEsMzc3NjgsMzc3ODUsMzc3OTEsMzc3NzMsMzc4MDksMzc3NzcsMzc4MTAsMzc3OTYsMzc4MDAsMzc4MTIsMzc3OTUsMzc3OTcsMzgzNTQsMzgzNTUsMzgzNTMsMzg1NzksMzg2MTUsMzg2MTgsMjQwMDIsMzg2MjMsMzg2MTYsMzg2MjEsMzg2OTEsMzg2OTAsMzg2OTMsMzg4MjgsMzg4MzAsMzg4MjQsMzg4MjcsMzg4MjAsMzg4MjYsMzg4MTgsMzg4MjEsMzg4NzEsMzg4NzMsMzg4NzAsMzg4NzIsMzg5MDYsMzg5OTIsMzg5OTMsMzg5OTQsMzkwOTYsMzkyMzMsMzkyMjgsMzkyMjYsMzk0MzksMzk0MzUsMzk0MzMsMzk0MzcsMzk0MjgsMzk0NDEsMzk0MzQsMzk0MjksMzk0MzEsMzk0MzAsMzk2MTYsMzk2NDQsMzk2ODgsMzk2ODQsMzk2ODUsMzk3MjEsMzk3MzMsMzk3NTQsMzk3NTYsMzk3NTUsMzk4NzksMzk4NzgsMzk4NzUsMzk4NzEsMzk4NzMsMzk4NjEsMzk4NjQsMzk4OTEsMzk4NjIsMzk4NzYsMzk4NjUsMzk4NjksNDAyODQsNDAyNzUsNDAyNzEsNDAyNjYsNDAyODMsNDAyNjcsNDAyODEsNDAyNzgsNDAyNjgsNDAyNzksNDAyNzQsNDAyNzYsNDAyODcsNDAyODAsNDAyODIsNDA1OTAsNDA1ODgsNDA2NzEsNDA3MDUsNDA3MDQsNDA3MjYsNDA3NDEsNDA3NDcsNDA3NDYsNDA3NDUsNDA3NDQsNDA3ODAsNDA3ODksMjA3ODgsMjA3ODksMjExNDIsMjEyMzksMjE0MjgsMjIxODcsMjIxODksMjIxODIsMjIxODMsMjIxODYsMjIxODgsMjI3NDYsMjI3NDksMjI3NDcsMjI4MDIsMjMzNTcsMjMzNTgsMjMzNTksMjQwMDMsMjQxNzYsMjQ1MTEsMjUwODMsMjU4NjMsMjU4NzIsMjU4NjksMjU4NjUsMjU4NjgsMjU4NzAsMjU5ODgsMjYwNzgsMjYwNzcsMjYzMzQsMjczNjcsMjczNjAsMjczNDAsMjczNDUsMjczNTMsMjczMzksMjczNTksMjczNTYsMjczNDQsMjczNzEsMjczNDMsMjczNDEsMjczNTgsMjc0ODgsMjc1NjgsMjc2NjAsMjg2OTcsMjg3MTEsMjg3MDQsMjg2OTQsMjg3MTUsMjg3MDUsMjg3MDYsMjg3MDcsMjg3MTMsMjg2OTUsMjg3MDgsMjg3MDAsMjg3MTQsMjkxOTYsMjkxOTQsMjkxOTEsMjkxODYsMjkxODksMjkzNDksMjkzNTAsMjkzNDgsMjkzNDcsMjkzNDUsMjk4OTksMjk4OTMsMjk4NzksMjk4OTEsMjk5NzQsMzAzMDQsMzA2NjUsMzA2NjYsMzA2NjAsMzA3MDUsMzEwMDUsMzEwMDMsMzEwMDksMzEwMDQsMzA5OTksMzEwMDYsMzExNTIsMzEzMzUsMzEzMzYsMzE3OTUsMzE4MDQsMzE4MDEsMzE3ODgsMzE4MDMsMzE5ODAsMzE5NzgsMzIzNzQsMzIzNzMsMzIzNzYsMzIzNjgsMzIzNzUsMzIzNjcsMzIzNzgsMzIzNzAsMzIzNzIsMzIzNjAsMzI1ODcsMzI1ODYsMzI2NDMsMzI2NDYsMzI2OTUsMzI3NjUsMzI3NjYsMzI4ODgsMzMyMzksMzMyMzcsMzMzODAsMzMzNzcsMzMzNzksMzQyODMsMzQyODksMzQyODUsMzQyNjUsMzQyNzMsMzQyODAsMzQyNjYsMzQyNjMsMzQyODQsMzQyOTAsMzQyOTYsMzQyNjQsMzQyNzEsMzQyNzUsMzQyNjgsMzQyNTcsMzQyODgsMzQyNzgsMzQyODcsMzQyNzAsMzQyNzQsMzQ4MTYsMzQ4MTAsMzQ4MTksMzQ4MDYsMzQ4MDcsMzQ4MjUsMzQ4MjgsMzQ4MjcsMzQ4MjIsMzQ4MTIsMzQ4MjQsMzQ4MTUsMzQ4MjYsMzQ4MTgsMzUxNzAsMzUxNjIsMzUxNjMsMzUxNTksMzUxNjksMzUxNjQsMzUxNjAsMzUxNjUsMzUxNjEsMzUyMDgsMzUyNTUsMzUyNTQsMzUzMTgsMzU2NjQsMzU2NTYsMzU2NTgsMzU2NDgsMzU2NjcsMzU2NzAsMzU2NjgsMzU2NTksMzU2NjksMzU2NjUsMzU2NTAsMzU2NjYsMzU2NzEsMzU5MDcsMzU5NTksMzU5NTgsMzU5OTQsMzYxMDIsMzYxMDMsMzYxMDUsMzYyNjgsMzYyNjYsMzYyNjksMzYyNjcsMzY0NjEsMzY0NzIsMzY0NjcsMzY0NTgsMzY0NjMsMzY0NzUsMzY1NDYsMzY2OTAsMzY2ODksMzY2ODcsMzY2ODgsMzY2OTEsMzY3ODgsMzcxODQsMzcxODMsMzcyOTYsMzcyOTMsMzc4NTQsMzc4MzEsMzc4MzksMzc4MjYsMzc4NTAsMzc4NDAsMzc4ODEsMzc4NjgsMzc4MzYsMzc4NDksMzc4MDEsMzc4NjIsMzc4MzQsMzc4NDQsMzc4NzAsMzc4NTksMzc4NDUsMzc4MjgsMzc4MzgsMzc4MjQsMzc4NDIsMzc4NjMsMzgyNjksMzgzNjIsMzgzNjMsMzg2MjUsMzg2OTcsMzg2OTksMzg3MDAsMzg2OTYsMzg2OTQsMzg4MzUsMzg4MzksMzg4MzgsMzg4NzcsMzg4NzgsMzg4NzksMzkwMDQsMzkwMDEsMzkwMDUsMzg5OTksMzkxMDMsMzkxMDEsMzkwOTksMzkxMDIsMzkyNDAsMzkyMzksMzkyMzUsMzkzMzQsMzkzMzUsMzk0NTAsMzk0NDUsMzk0NjEsMzk0NTMsMzk0NjAsMzk0NTEsMzk0NTgsMzk0NTYsMzk0NjMsMzk0NTksMzk0NTQsMzk0NTIsMzk0NDQsMzk2MTgsMzk2OTEsMzk2OTAsMzk2OTQsMzk2OTIsMzk3MzUsMzk5MTQsMzk5MTUsMzk5MDQsMzk5MDIsMzk5MDgsMzk5MTAsMzk5MDYsMzk5MjAsMzk4OTIsMzk4OTUsMzk5MTYsMzk5MDAsMzk4OTcsMzk5MDksMzk4OTMsMzk5MDUsMzk4OTgsNDAzMTEsNDAzMjEsNDAzMzAsNDAzMjQsNDAzMjgsNDAzMDUsNDAzMjAsNDAzMTIsNDAzMjYsNDAzMzEsNDAzMzIsNDAzMTcsNDAyOTksNDAzMDgsNDAzMDksNDAzMDQsNDAyOTcsNDAzMjUsNDAzMDcsNDAzMTUsNDAzMjIsNDAzMDMsNDAzMTMsNDAzMTksNDAzMjcsNDAyOTYsNDA1OTYsNDA1OTMsNDA2NDAsNDA3MDAsNDA3NDksNDA3NjgsNDA3NjksNDA3ODEsNDA3OTAsNDA3OTEsNDA3OTIsMjEzMDMsMjIxOTQsMjIxOTcsMjIxOTUsMjI3NTUsMjMzNjUsMjQwMDYsMjQwMDcsMjQzMDIsMjQzMDMsMjQ1MTIsMjQ1MTMsMjUwODEsMjU4NzksMjU4NzgsMjU4NzcsMjU4NzUsMjYwNzksMjYzNDQsMjYzMzksMjYzNDAsMjczNzksMjczNzYsMjczNzAsMjczNjgsMjczODUsMjczNzcsMjczNzQsMjczNzUsMjg3MzIsMjg3MjUsMjg3MTksMjg3MjcsMjg3MjQsMjg3MjEsMjg3MzgsMjg3MjgsMjg3MzUsMjg3MzAsMjg3MjksMjg3MzYsMjg3MzEsMjg3MjMsMjg3MzcsMjkyMDMsMjkyMDQsMjkzNTIsMjk1NjUsMjk1NjQsMjk4ODIsMzAzNzksMzAzNzgsMzAzOTgsMzA0NDUsMzA2NjgsMzA2NzAsMzA2NzEsMzA2NjksMzA3MDYsMzEwMTMsMzEwMTEsMzEwMTUsMzEwMTYsMzEwMTIsMzEwMTcsMzExNTQsMzEzNDIsMzEzNDAsMzEzNDEsMzE0NzksMzE4MTcsMzE4MTYsMzE4MTgsMzE4MTUsMzE4MTMsMzE5ODIsMzIzNzksMzIzODIsMzIzODUsMzIzODQsMzI2OTgsMzI3NjcsMzI4ODksMzMyNDMsMzMyNDEsMzMyOTEsMzMzODQsMzMzODUsMzQzMzgsMzQzMDMsMzQzMDUsMzQzMDIsMzQzMzEsMzQzMDQsMzQyOTQsMzQzMDgsMzQzMTMsMzQzMDksMzQzMTYsMzQzMDEsMzQ4NDEsMzQ4MzIsMzQ4MzMsMzQ4MzksMzQ4MzUsMzQ4MzgsMzUxNzEsMzUxNzQsMzUyNTcsMzUzMTksMzU2ODAsMzU2OTAsMzU2NzcsMzU2ODgsMzU2ODMsMzU2ODUsMzU2ODcsMzU2OTMsMzYyNzAsMzY0ODYsMzY0ODgsMzY0ODQsMzY2OTcsMzY2OTQsMzY2OTUsMzY2OTMsMzY2OTYsMzY2OTgsMzcwMDUsMzcxODcsMzcxODUsMzczMDMsMzczMDEsMzcyOTgsMzcyOTksMzc4OTksMzc5MDcsMzc4ODMsMzc5MjAsMzc5MDMsMzc5MDgsMzc4ODYsMzc5MDksMzc5MDQsMzc5MjgsMzc5MTMsMzc5MDEsMzc4NzcsMzc4ODgsMzc4NzksMzc4OTUsMzc5MDIsMzc5MTAsMzc5MDYsMzc4ODIsMzc4OTcsMzc4ODAsMzc4OTgsMzc4ODcsMzc4ODQsMzc5MDAsMzc4NzgsMzc5MDUsMzc4OTQsMzgzNjYsMzgzNjgsMzgzNjcsMzg3MDIsMzg3MDMsMzg4NDEsMzg4NDMsMzg5MDksMzg5MTAsMzkwMDgsMzkwMTAsMzkwMTEsMzkwMDcsMzkxMDUsMzkxMDYsMzkyNDgsMzkyNDYsMzkyNTcsMzkyNDQsMzkyNDMsMzkyNTEsMzk0NzQsMzk0NzYsMzk0NzMsMzk0NjgsMzk0NjYsMzk0NzgsMzk0NjUsMzk0NzAsMzk0ODAsMzk0NjksMzk2MjMsMzk2MjYsMzk2MjIsMzk2OTYsMzk2OTgsMzk2OTcsMzk5NDcsMzk5NDQsMzk5MjcsMzk5NDEsMzk5NTQsMzk5MjgsNDAwMDAsMzk5NDMsMzk5NTAsMzk5NDIsMzk5NTksMzk5NTYsMzk5NDUsNDAzNTEsNDAzNDUsNDAzNTYsNDAzNDksNDAzMzgsNDAzNDQsNDAzMzYsNDAzNDcsNDAzNTIsNDAzNDAsNDAzNDgsNDAzNjIsNDAzNDMsNDAzNTMsNDAzNDYsNDAzNTQsNDAzNjAsNDAzNTAsNDAzNTUsNDAzODMsNDAzNjEsNDAzNDIsNDAzNTgsNDAzNTksNDA2MDEsNDA2MDMsNDA2MDIsNDA2NzcsNDA2NzYsNDA2NzksNDA2NzgsNDA3NTIsNDA3NTAsNDA3OTUsNDA4MDAsNDA3OTgsNDA3OTcsNDA3OTMsNDA4NDksMjA3OTQsMjA3OTMsMjExNDQsMjExNDMsMjIyMTEsMjIyMDUsMjIyMDYsMjMzNjgsMjMzNjcsMjQwMTEsMjQwMTUsMjQzMDUsMjUwODUsMjU4ODMsMjczOTQsMjczODgsMjczOTUsMjczODQsMjczOTIsMjg3MzksMjg3NDAsMjg3NDYsMjg3NDQsMjg3NDUsMjg3NDEsMjg3NDIsMjkyMTMsMjkyMTAsMjkyMDksMjk1NjYsMjk5NzUsMzAzMTQsMzA2NzIsMzEwMjEsMzEwMjUsMzEwMjMsMzE4MjgsMzE4MjcsMzE5ODYsMzIzOTQsMzIzOTEsMzIzOTIsMzIzOTUsMzIzOTAsMzIzOTcsMzI1ODksMzI2OTksMzI4MTYsMzMyNDUsMzQzMjgsMzQzNDYsMzQzNDIsMzQzMzUsMzQzMzksMzQzMzIsMzQzMjksMzQzNDMsMzQzNTAsMzQzMzcsMzQzMzYsMzQzNDUsMzQzMzQsMzQzNDEsMzQ4NTcsMzQ4NDUsMzQ4NDMsMzQ4NDgsMzQ4NTIsMzQ4NDQsMzQ4NTksMzQ4OTAsMzUxODEsMzUxNzcsMzUxODIsMzUxNzksMzUzMjIsMzU3MDUsMzU3MDQsMzU2NTMsMzU3MDYsMzU3MDcsMzYxMTIsMzYxMTYsMzYyNzEsMzY0OTQsMzY0OTIsMzY3MDIsMzY2OTksMzY3MDEsMzcxOTAsMzcxODgsMzcxODksMzczMDUsMzc5NTEsMzc5NDcsMzc5NDIsMzc5MjksMzc5NDksMzc5NDgsMzc5MzYsMzc5NDUsMzc5MzAsMzc5NDMsMzc5MzIsMzc5NTIsMzc5MzcsMzgzNzMsMzgzNzIsMzgzNzEsMzg3MDksMzg3MTQsMzg4NDcsMzg4ODEsMzkwMTIsMzkxMTMsMzkxMTAsMzkxMDQsMzkyNTYsMzkyNTQsMzk0ODEsMzk0ODUsMzk0OTQsMzk0OTIsMzk0OTAsMzk0ODksMzk0ODIsMzk0ODcsMzk2MjksMzk3MDEsMzk3MDMsMzk3MDQsMzk3MDIsMzk3MzgsMzk3NjIsMzk5NzksMzk5NjUsMzk5NjQsMzk5ODAsMzk5NzEsMzk5NzYsMzk5NzcsMzk5NzIsMzk5NjksNDAzNzUsNDAzNzQsNDAzODAsNDAzODUsNDAzOTEsNDAzOTQsNDAzOTksNDAzODIsNDAzODksNDAzODcsNDAzNzksNDAzNzMsNDAzOTgsNDAzNzcsNDAzNzgsNDAzNjQsNDAzOTIsNDAzNjksNDAzNjUsNDAzOTYsNDAzNzEsNDAzOTcsNDAzNzAsNDA1NzAsNDA2MDQsNDA2ODMsNDA2ODYsNDA2ODUsNDA3MzEsNDA3MjgsNDA3MzAsNDA3NTMsNDA3ODIsNDA4MDUsNDA4MDQsNDA4NTAsMjAxNTMsMjIyMTQsMjIyMTMsMjIyMTksMjI4OTcsMjMzNzEsMjMzNzIsMjQwMjEsMjQwMTcsMjQzMDYsMjU4ODksMjU4ODgsMjU4OTQsMjU4OTAsMjc0MDMsMjc0MDAsMjc0MDEsMjc2NjEsMjg3NTcsMjg3NTgsMjg3NTksMjg3NTQsMjkyMTQsMjkyMTUsMjkzNTMsMjk1NjcsMjk5MTIsMjk5MDksMjk5MTMsMjk5MTEsMzAzMTcsMzAzODEsMzEwMjksMzExNTYsMzEzNDQsMzEzNDUsMzE4MzEsMzE4MzYsMzE4MzMsMzE4MzUsMzE4MzQsMzE5ODgsMzE5ODUsMzI0MDEsMzI1OTEsMzI2NDcsMzMyNDYsMzMzODcsMzQzNTYsMzQzNTcsMzQzNTUsMzQzNDgsMzQzNTQsMzQzNTgsMzQ4NjAsMzQ4NTYsMzQ4NTQsMzQ4NTgsMzQ4NTMsMzUxODUsMzUyNjMsMzUyNjIsMzUzMjMsMzU3MTAsMzU3MTYsMzU3MTQsMzU3MTgsMzU3MTcsMzU3MTEsMzYxMTcsMzY1MDEsMzY1MDAsMzY1MDYsMzY0OTgsMzY0OTYsMzY1MDIsMzY1MDMsMzY3MDQsMzY3MDYsMzcxOTEsMzc5NjQsMzc5NjgsMzc5NjIsMzc5NjMsMzc5NjcsMzc5NTksMzc5NTcsMzc5NjAsMzc5NjEsMzc5NTgsMzg3MTksMzg4ODMsMzkwMTgsMzkwMTcsMzkxMTUsMzkyNTIsMzkyNTksMzk1MDIsMzk1MDcsMzk1MDgsMzk1MDAsMzk1MDMsMzk0OTYsMzk0OTgsMzk0OTcsMzk1MDYsMzk1MDQsMzk2MzIsMzk3MDUsMzk3MjMsMzk3MzksMzk3NjYsMzk3NjUsNDAwMDYsNDAwMDgsMzk5OTksNDAwMDQsMzk5OTMsMzk5ODcsNDAwMDEsMzk5OTYsMzk5OTEsMzk5ODgsMzk5ODYsMzk5OTcsMzk5OTAsNDA0MTEsNDA0MDIsNDA0MTQsNDA0MTAsNDAzOTUsNDA0MDAsNDA0MTIsNDA0MDEsNDA0MTUsNDA0MjUsNDA0MDksNDA0MDgsNDA0MDYsNDA0MzcsNDA0MDUsNDA0MTMsNDA2MzAsNDA2ODgsNDA3NTcsNDA3NTUsNDA3NTQsNDA3NzAsNDA4MTEsNDA4NTMsNDA4NjYsMjA3OTcsMjExNDUsMjI3NjAsMjI3NTksMjI4OTgsMjMzNzMsMjQwMjQsMzQ4NjMsMjQzOTksMjUwODksMjUwOTEsMjUwOTIsMjU4OTcsMjU4OTMsMjYwMDYsMjYzNDcsMjc0MDksMjc0MTAsMjc0MDcsMjc1OTQsMjg3NjMsMjg3NjIsMjkyMTgsMjk1NzAsMjk1NjksMjk1NzEsMzAzMjAsMzA2NzYsMzE4NDcsMzE4NDYsMzI0MDUsMzMzODgsMzQzNjIsMzQzNjgsMzQzNjEsMzQzNjQsMzQzNTMsMzQzNjMsMzQzNjYsMzQ4NjQsMzQ4NjYsMzQ4NjIsMzQ4NjcsMzUxOTAsMzUxODgsMzUxODcsMzUzMjYsMzU3MjQsMzU3MjYsMzU3MjMsMzU3MjAsMzU5MDksMzYxMjEsMzY1MDQsMzY3MDgsMzY3MDcsMzczMDgsMzc5ODYsMzc5NzMsMzc5ODEsMzc5NzUsMzc5ODIsMzg4NTIsMzg4NTMsMzg5MTIsMzk1MTAsMzk1MTMsMzk3MTAsMzk3MTEsMzk3MTIsNDAwMTgsNDAwMjQsNDAwMTYsNDAwMTAsNDAwMTMsNDAwMTEsNDAwMjEsNDAwMjUsNDAwMTIsNDAwMTQsNDA0NDMsNDA0MzksNDA0MzEsNDA0MTksNDA0MjcsNDA0NDAsNDA0MjAsNDA0MzgsNDA0MTcsNDA0MzAsNDA0MjIsNDA0MzQsNDA0MzIsNDA0MTgsNDA0MjgsNDA0MzYsNDA0MzUsNDA0MjQsNDA0MjksNDA2NDIsNDA2NTYsNDA2OTAsNDA2OTEsNDA3MTAsNDA3MzIsNDA3NjAsNDA3NTksNDA3NTgsNDA3NzEsNDA3ODMsNDA4MTcsNDA4MTYsNDA4MTQsNDA4MTUsMjIyMjcsMjIyMjEsMjMzNzQsMjM2NjEsMjU5MDEsMjYzNDksMjYzNTAsMjc0MTEsMjg3NjcsMjg3NjksMjg3NjUsMjg3NjgsMjkyMTksMjk5MTUsMjk5MjUsMzA2NzcsMzEwMzIsMzExNTksMzExNTgsMzE4NTAsMzI0MDcsMzI2NDksMzMzODksMzQzNzEsMzQ4NzIsMzQ4NzEsMzQ4NjksMzQ4OTEsMzU3MzIsMzU3MzMsMzY1MTAsMzY1MTEsMzY1MTIsMzY1MDksMzczMTAsMzczMDksMzczMTQsMzc5OTUsMzc5OTIsMzc5OTMsMzg2MjksMzg3MjYsMzg3MjMsMzg3MjcsMzg4NTUsMzg4ODUsMzk1MTgsMzk2MzcsMzk3NjksNDAwMzUsNDAwMzksNDAwMzgsNDAwMzQsNDAwMzAsNDAwMzIsNDA0NTAsNDA0NDYsNDA0NTUsNDA0NTEsNDA0NTQsNDA0NTMsNDA0NDgsNDA0NDksNDA0NTcsNDA0NDcsNDA0NDUsNDA0NTIsNDA2MDgsNDA3MzQsNDA3NzQsNDA4MjAsNDA4MjEsNDA4MjIsMjIyMjgsMjU5MDIsMjYwNDAsMjc0MTYsMjc0MTcsMjc0MTUsMjc0MTgsMjg3NzAsMjkyMjIsMjkzNTQsMzA2ODAsMzA2ODEsMzEwMzMsMzE4NDksMzE4NTEsMzE5OTAsMzI0MTAsMzI0MDgsMzI0MTEsMzI0MDksMzMyNDgsMzMyNDksMzQzNzQsMzQzNzUsMzQzNzYsMzUxOTMsMzUxOTQsMzUxOTYsMzUxOTUsMzUzMjcsMzU3MzYsMzU3MzcsMzY1MTcsMzY1MTYsMzY1MTUsMzc5OTgsMzc5OTcsMzc5OTksMzgwMDEsMzgwMDMsMzg3MjksMzkwMjYsMzkyNjMsNDAwNDAsNDAwNDYsNDAwNDUsNDA0NTksNDA0NjEsNDA0NjQsNDA0NjMsNDA0NjYsNDA0NjUsNDA2MDksNDA2OTMsNDA3MTMsNDA3NzUsNDA4MjQsNDA4MjcsNDA4MjYsNDA4MjUsMjIzMDIsMjg3NzQsMzE4NTUsMzQ4NzYsMzYyNzQsMzY1MTgsMzczMTUsMzgwMDQsMzgwMDgsMzgwMDYsMzgwMDUsMzk1MjAsNDAwNTIsNDAwNTEsNDAwNDksNDAwNTMsNDA0NjgsNDA0NjcsNDA2OTQsNDA3MTQsNDA4NjgsMjg3NzYsMjg3NzMsMzE5OTEsMzQ0MTAsMzQ4NzgsMzQ4NzcsMzQ4NzksMzU3NDIsMzU5OTYsMzY1MjEsMzY1NTMsMzg3MzEsMzkwMjcsMzkwMjgsMzkxMTYsMzkyNjUsMzkzMzksMzk1MjQsMzk1MjYsMzk1MjcsMzk3MTYsNDA0NjksNDA0NzEsNDA3NzYsMjUwOTUsMjc0MjIsMjkyMjMsMzQzODAsMzY1MjAsMzgwMTgsMzgwMTYsMzgwMTcsMzk1MjksMzk1MjgsMzk3MjYsNDA0NzMsMjkyMjUsMzQzNzksMzU3NDMsMzgwMTksNDAwNTcsNDA2MzEsMzAzMjUsMzk1MzEsNDAwNTgsNDA0NzcsMjg3NzcsMjg3NzgsNDA2MTIsNDA4MzAsNDA3NzcsNDA4NTYsMzA4NDksMzc1NjEsMzUwMjMsMjI3MTUsMjQ2NTgsMzE5MTEsMjMyOTAsOTU1Niw5NTc0LDk1NTksOTU2OCw5NTgwLDk1NzEsOTU2Miw5NTc3LDk1NjUsOTU1NCw5NTcyLDk1NTcsOTU2Niw5NTc4LDk1NjksOTU2MCw5NTc1LDk1NjMsOTU1NSw5NTczLDk1NTgsOTU2Nyw5NTc5LDk1NzAsOTU2MSw5NTc2LDk1NjQsOTU1Myw5NTUyLDk1ODEsOTU4Miw5NTg0LDk1ODMsNjU1MTcsMTMyNDIzLDM3NTk1LDEzMjU3NSwxNDczOTcsMzQxMjQsMTcwNzcsMjk2NzksMjA5MTcsMTM4OTcsMTQ5ODI2LDE2NjM3MiwzNzcwMCwxMzc2OTEsMzM1MTgsMTQ2NjMyLDMwNzgwLDI2NDM2LDI1MzExLDE0OTgxMSwxNjYzMTQsMTMxNzQ0LDE1ODY0MywxMzU5NDEsMjAzOTUsMTQwNTI1LDIwNDg4LDE1OTAxNywxNjI0MzYsMTQ0ODk2LDE1MDE5MywxNDA1NjMsMjA1MjEsMTMxOTY2LDI0NDg0LDEzMTk2OCwxMzE5MTEsMjgzNzksMTMyMTI3LDIwNjA1LDIwNzM3LDEzNDM0LDIwNzUwLDM5MDIwLDE0MTQ3LDMzODE0LDE0OTkyNCwxMzIyMzEsMjA4MzIsMTQ0MzA4LDIwODQyLDEzNDE0MywxMzk1MTYsMTMxODEzLDE0MDU5MiwxMzI0OTQsMTQzOTIzLDEzNzYwMywyMzQyNiwzNDY4NSwxMzI1MzEsMTQ2NTg1LDIwOTE0LDIwOTIwLDQwMjQ0LDIwOTM3LDIwOTQzLDIwOTQ1LDE1NTgwLDIwOTQ3LDE1MDE4MiwyMDkxNSwyMDk2MiwyMTMxNCwyMDk3MywzMzc0MSwyNjk0MiwxNDUxOTcsMjQ0NDMsMjEwMDMsMjEwMzAsMjEwNTIsMjExNzMsMjEwNzksMjExNDAsMjExNzcsMjExODksMzE3NjUsMzQxMTQsMjEyMTYsMzQzMTcsMTU4NDgzLDIxMjUzLDE2NjYyMiwyMTgzMywyODM3NywxNDczMjgsMTMzNDYwLDE0NzQzNiwyMTI5OSwyMTMxNiwxMzQxMTQsMjc4NTEsMTM2OTk4LDI2NjUxLDI5NjUzLDI0NjUwLDE2MDQyLDE0NTQwLDEzNjkzNiwyOTE0OSwxNzU3MCwyMTM1NywyMTM2NCwxNjU1NDcsMjEzNzQsMjEzNzUsMTM2NTk4LDEzNjcyMywzMDY5NCwyMTM5NSwxNjY1NTUsMjE0MDgsMjE0MTksMjE0MjIsMjk2MDcsMTUzNDU4LDE2MjE3LDI5NTk2LDIxNDQxLDIxNDQ1LDI3NzIxLDIwMDQxLDIyNTI2LDIxNDY1LDE1MDE5LDEzNDAzMSwyMTQ3MiwxNDc0MzUsMTQyNzU1LDIxNDk0LDEzNDI2MywyMTUyMywyODc5MywyMTgwMywyNjE5OSwyNzk5NSwyMTYxMywxNTg1NDcsMTM0NTE2LDIxODUzLDIxNjQ3LDIxNjY4LDE4MzQyLDEzNjk3MywxMzQ4NzcsMTU3OTYsMTM0NDc3LDE2NjMzMiwxNDA5NTIsMjE4MzEsMTk2OTMsMjE1NTEsMjk3MTksMjE4OTQsMjE5MjksMjIwMjEsMTM3NDMxLDE0NzUxNCwxNzc0NiwxNDg1MzMsMjYyOTEsMTM1MzQ4LDIyMDcxLDI2MzE3LDE0NDAxMCwyNjI3NiwyNjI4NSwyMjA5MywyMjA5NSwzMDk2MSwyMjI1NywzODc5MSwyMTUwMiwyMjI3MiwyMjI1NSwyMjI1MywxNjY3NTgsMTM4NTksMTM1NzU5LDIyMzQyLDE0Nzg3NywyNzc1OCwyODgxMSwyMjMzOCwxNDAwMSwxNTg4NDYsMjI1MDIsMTM2MjE0LDIyNTMxLDEzNjI3NiwxNDgzMjMsMjI1NjYsMTUwNTE3LDIyNjIwLDIyNjk4LDEzNjY1LDIyNzUyLDIyNzQ4LDEzNTc0MCwyMjc3OSwyMzU1MSwyMjMzOSwxNzIzNjgsMTQ4MDg4LDM3ODQzLDEzNzI5LDIyODE1LDI2NzkwLDE0MDE5LDI4MjQ5LDEzNjc2NiwyMzA3NiwyMTg0MywxMzY4NTAsMzQwNTMsMjI5ODUsMTM0NDc4LDE1ODg0OSwxNTkwMTgsMTM3MTgwLDIzMDAxLDEzNzIxMSwxMzcxMzgsMTU5MTQyLDI4MDE3LDEzNzI1NiwxMzY5MTcsMjMwMzMsMTU5MzAxLDIzMjExLDIzMTM5LDE0MDU0LDE0OTkyOSwyMzE1OSwxNDA4OCwyMzE5MCwyOTc5NywyMzI1MSwxNTk2NDksMTQwNjI4LDE1NzQ5LDEzNzQ4OSwxNDEzMCwxMzY4ODgsMjQxOTUsMjEyMDAsMjM0MTQsMjU5OTIsMjM0MjAsMTYyMzE4LDE2Mzg4LDE4NTI1LDEzMTU4OCwyMzUwOSwyNDkyOCwxMzc3ODAsMTU0MDYwLDEzMjUxNywyMzUzOSwyMzQ1MywxOTcyOCwyMzU1NywxMzgwNTIsMjM1NzEsMjk2NDYsMjM1NzIsMTM4NDA1LDE1ODUwNCwyMzYyNSwxODY1MywyMzY4NSwyMzc4NSwyMzc5MSwyMzk0NywxMzg3NDUsMTM4ODA3LDIzODI0LDIzODMyLDIzODc4LDEzODkxNiwyMzczOCwyNDAyMywzMzUzMiwxNDM4MSwxNDk3NjEsMTM5MzM3LDEzOTYzNSwzMzQxNSwxNDM5MCwxNTI5OCwyNDExMCwyNzI3NCwyNDE4MSwyNDE4NiwxNDg2NjgsMTM0MzU1LDIxNDE0LDIwMTUxLDI0MjcyLDIxNDE2LDEzNzA3MywyNDA3MywyNDMwOCwxNjQ5OTQsMjQzMTMsMjQzMTUsMTQ0OTYsMjQzMTYsMjY2ODYsMzc5MTUsMjQzMzMsMTMxNTIxLDE5NDcwOCwxNTA3MCwxODYwNiwxMzU5OTQsMjQzNzgsMTU3ODMyLDE0MDI0MCwyNDQwOCwxNDA0MDEsMjQ0MTksMzg4NDUsMTU5MzQyLDI0NDM0LDM3Njk2LDE2NjQ1NCwyNDQ4NywyMzk5MCwxNTcxMSwxNTIxNDQsMTM5MTE0LDE1OTk5MiwxNDA5MDQsMzczMzQsMTMxNzQyLDE2NjQ0MSwyNDYyNSwyNjI0NSwxMzczMzUsMTQ2OTEsMTU4MTUsMTM4ODEsMjI0MTYsMTQxMjM2LDMxMDg5LDE1OTM2LDI0NzM0LDI0NzQwLDI0NzU1LDE0OTg5MCwxNDk5MDMsMTYyMzg3LDI5ODYwLDIwNzA1LDIzMjAwLDI0OTMyLDMzODI4LDI0ODk4LDE5NDcyNiwxNTk0NDIsMjQ5NjEsMjA5ODAsMTMyNjk0LDI0OTY3LDIzNDY2LDE0NzM4MywxNDE0MDcsMjUwNDMsMTY2ODEzLDE3MDMzMywyNTA0MCwxNDY0MiwxNDE2OTYsMTQxNTA1LDI0NjExLDI0OTI0LDI1ODg2LDI1NDgzLDEzMTM1MiwyNTI4NSwxMzcwNzIsMjUzMDEsMTQyODYxLDI1NDUyLDE0OTk4MywxNDg3MSwyNTY1NiwyNTU5MiwxMzYwNzgsMTM3MjEyLDI1NzQ0LDI4NTU0LDE0MjkwMiwzODkzMiwxNDc1OTYsMTUzMzczLDI1ODI1LDI1ODI5LDM4MDExLDE0OTUwLDI1NjU4LDE0OTM1LDI1OTMzLDI4NDM4LDE1MDA1NiwxNTAwNTEsMjU5ODksMjU5NjUsMjU5NTEsMTQzNDg2LDI2MDM3LDE0OTgyNCwxOTI1NSwyNjA2NSwxNjYwMCwxMzcyNTcsMjYwODAsMjYwODMsMjQ1NDMsMTQ0Mzg0LDI2MTM2LDE0Mzg2MywxNDM4NjQsMjYxODAsMTQzNzgwLDE0Mzc4MSwyNjE4NywxMzQ3NzMsMjYyMTUsMTUyMDM4LDI2MjI3LDI2MjI4LDEzODgxMywxNDM5MjEsMTY1MzY0LDE0MzgxNiwxNTIzMzksMzA2NjEsMTQxNTU5LDM5MzMyLDI2MzcwLDE0ODM4MCwxNTAwNDksMTUxNDcsMjcxMzAsMTQ1MzQ2LDI2NDYyLDI2NDcxLDI2NDY2LDE0NzkxNywxNjgxNzMsMjY1ODMsMTc2NDEsMjY2NTgsMjgyNDAsMzc0MzYsMjY2MjUsMTQ0MzU4LDE1OTEzNiwyNjcxNywxNDQ0OTUsMjcxMDUsMjcxNDcsMTY2NjIzLDI2OTk1LDI2ODE5LDE0NDg0NSwyNjg4MSwyNjg4MCwxNTY2NiwxNDg0OSwxNDQ5NTYsMTUyMzIsMjY1NDAsMjY5NzcsMTY2NDc0LDE3MTQ4LDI2OTM0LDI3MDMyLDE1MjY1LDEzMjA0MSwzMzYzNSwyMDYyNCwyNzEyOSwxNDQ5ODUsMTM5NTYyLDI3MjA1LDE0NTE1NSwyNzI5MywxNTM0NywyNjU0NSwyNzMzNiwxNjgzNDgsMTUzNzMsMjc0MjEsMTMzNDExLDI0Nzk4LDI3NDQ1LDI3NTA4LDE0MTI2MSwyODM0MSwxNDYxMzksMTMyMDIxLDEzNzU2MCwxNDE0NCwyMTUzNywxNDYyNjYsMjc2MTcsMTQ3MTk2LDI3NjEyLDI3NzAzLDE0MDQyNywxNDk3NDUsMTU4NTQ1LDI3NzM4LDMzMzE4LDI3NzY5LDE0Njg3NiwxNzYwNSwxNDY4NzcsMTQ3ODc2LDE0OTc3MiwxNDk3NjAsMTQ2NjMzLDE0MDUzLDE1NTk1LDEzNDQ1MCwzOTgxMSwxNDM4NjUsMTQwNDMzLDMyNjU1LDI2Njc5LDE1OTAxMywxNTkxMzcsMTU5MjExLDI4MDU0LDI3OTk2LDI4Mjg0LDI4NDIwLDE0OTg4NywxNDc1ODksMTU5MzQ2LDM0MDk5LDE1OTYwNCwyMDkzNSwyNzgwNCwyODE4OSwzMzgzOCwxNjY2ODksMjgyMDcsMTQ2OTkxLDI5Nzc5LDE0NzMzMCwzMTE4MCwyODIzOSwyMzE4NSwxNDM0MzUsMjg2NjQsMTQwOTMsMjg1NzMsMTQ2OTkyLDI4NDEwLDEzNjM0MywxNDc1MTcsMTc3NDksMzc4NzIsMjg0ODQsMjg1MDgsMTU2OTQsMjg1MzIsMTY4MzA0LDE1Njc1LDI4NTc1LDE0Nzc4MCwyODYyNywxNDc2MDEsMTQ3Nzk3LDE0NzUxMywxNDc0NDAsMTQ3MzgwLDE0Nzc3NSwyMDk1OSwxNDc3OTgsMTQ3Nzk5LDE0Nzc3NiwxNTYxMjUsMjg3NDcsMjg3OTgsMjg4MzksMjg4MDEsMjg4NzYsMjg4ODUsMjg4ODYsMjg4OTUsMTY2NDQsMTU4NDgsMjkxMDgsMjkwNzgsMTQ4MDg3LDI4OTcxLDI4OTk3LDIzMTc2LDI5MDAyLDI5MDM4LDIzNzA4LDE0ODMyNSwyOTAwNywzNzczMCwxNDgxNjEsMjg5NzIsMTQ4NTcwLDE1MDA1NSwxNTAwNTAsMjkxMTQsMTY2ODg4LDI4ODYxLDI5MTk4LDM3OTU0LDI5MjA1LDIyODAxLDM3OTU1LDI5MjIwLDM3Njk3LDE1MzA5MywyOTIzMCwyOTI0OCwxNDk4NzYsMjY4MTMsMjkyNjksMjkyNzEsMTU5NTcsMTQzNDI4LDI2NjM3LDI4NDc3LDI5MzE0LDI5NDgyLDI5NDgzLDE0OTUzOSwxNjU5MzEsMTg2NjksMTY1ODkyLDI5NDgwLDI5NDg2LDI5NjQ3LDI5NjEwLDEzNDIwMiwxNTgyNTQsMjk2NDEsMjk3NjksMTQ3OTM4LDEzNjkzNSwxNTAwNTIsMjYxNDcsMTQwMjEsMTQ5OTQzLDE0OTkwMSwxNTAwMTEsMjk2ODcsMjk3MTcsMjY4ODMsMTUwMDU0LDI5NzUzLDEzMjU0NywxNjA4NywyOTc4OCwxNDE0ODUsMjk3OTIsMTY3NjAyLDI5NzY3LDI5NjY4LDI5ODE0LDMzNzIxLDI5ODA0LDE0MTI4LDI5ODEyLDM3ODczLDI3MTgwLDI5ODI2LDE4NzcxLDE1MDE1NiwxNDc4MDcsMTUwMTM3LDE2Njc5OSwyMzM2NiwxNjY5MTUsMTM3Mzc0LDI5ODk2LDEzNzYwOCwyOTk2NiwyOTkyOSwyOTk4MiwxNjc2NDEsMTM3ODAzLDIzNTExLDE2NzU5NiwzNzc2NSwzMDAyOSwzMDAyNiwzMDA1NSwzMDA2MiwxNTE0MjYsMTYxMzIsMTUwODAzLDMwMDk0LDI5Nzg5LDMwMTEwLDMwMTMyLDMwMjEwLDMwMjUyLDMwMjg5LDMwMjg3LDMwMzE5LDMwMzI2LDE1NjY2MSwzMDM1MiwzMzI2MywxNDMyOCwxNTc5NjksMTU3OTY2LDMwMzY5LDMwMzczLDMwMzkxLDMwNDEyLDE1OTY0NywzMzg5MCwxNTE3MDksMTUxOTMzLDEzODc4MCwzMDQ5NCwzMDUwMiwzMDUyOCwyNTc3NSwxNTIwOTYsMzA1NTIsMTQ0MDQ0LDMwNjM5LDE2NjI0NCwxNjYyNDgsMTM2ODk3LDMwNzA4LDMwNzI5LDEzNjA1NCwxNTAwMzQsMjY4MjYsMzA4OTUsMzA5MTksMzA5MzEsMzg1NjUsMzEwMjIsMTUzMDU2LDMwOTM1LDMxMDI4LDMwODk3LDE2MTI5MiwzNjc5MiwzNDk0OCwxNjY2OTksMTU1Nzc5LDE0MDgyOCwzMTExMCwzNTA3MiwyNjg4MiwzMTEwNCwxNTM2ODcsMzExMzMsMTYyNjE3LDMxMDM2LDMxMTQ1LDI4MjAyLDE2MDAzOCwxNjA0MCwzMTE3NCwxNjgyMDUsMzExODhdLFxuICBcImV1Yy1rclwiOls0NDAzNCw0NDAzNSw0NDAzNyw0NDAzOCw0NDA0Myw0NDA0NCw0NDA0NSw0NDA0Niw0NDA0Nyw0NDA1Niw0NDA2Miw0NDA2Myw0NDA2NSw0NDA2Niw0NDA2Nyw0NDA2OSw0NDA3MCw0NDA3MSw0NDA3Miw0NDA3Myw0NDA3NCw0NDA3NSw0NDA3OCw0NDA4Miw0NDA4Myw0NDA4NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDA4NSw0NDA4Niw0NDA4Nyw0NDA5MCw0NDA5MSw0NDA5Myw0NDA5NCw0NDA5NSw0NDA5Nyw0NDA5OCw0NDA5OSw0NDEwMCw0NDEwMSw0NDEwMiw0NDEwMyw0NDEwNCw0NDEwNSw0NDEwNiw0NDEwOCw0NDExMCw0NDExMSw0NDExMiw0NDExMyw0NDExNCw0NDExNSw0NDExNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDExOCw0NDExOSw0NDEyMSw0NDEyMiw0NDEyMyw0NDEyNSw0NDEyNiw0NDEyNyw0NDEyOCw0NDEyOSw0NDEzMCw0NDEzMSw0NDEzMiw0NDEzMyw0NDEzNCw0NDEzNSw0NDEzNiw0NDEzNyw0NDEzOCw0NDEzOSw0NDE0MCw0NDE0MSw0NDE0Miw0NDE0Myw0NDE0Niw0NDE0Nyw0NDE0OSw0NDE1MCw0NDE1Myw0NDE1NSw0NDE1Niw0NDE1Nyw0NDE1OCw0NDE1OSw0NDE2Miw0NDE2Nyw0NDE2OCw0NDE3Myw0NDE3NCw0NDE3NSw0NDE3Nyw0NDE3OCw0NDE3OSw0NDE4MSw0NDE4Miw0NDE4Myw0NDE4NCw0NDE4NSw0NDE4Niw0NDE4Nyw0NDE5MCw0NDE5NCw0NDE5NSw0NDE5Niw0NDE5Nyw0NDE5OCw0NDE5OSw0NDIwMyw0NDIwNSw0NDIwNiw0NDIwOSw0NDIxMCw0NDIxMSw0NDIxMiw0NDIxMyw0NDIxNCw0NDIxNSw0NDIxOCw0NDIyMiw0NDIyMyw0NDIyNCw0NDIyNiw0NDIyNyw0NDIyOSw0NDIzMCw0NDIzMSw0NDIzMyw0NDIzNCw0NDIzNSw0NDIzNyw0NDIzOCw0NDIzOSw0NDI0MCw0NDI0MSw0NDI0Miw0NDI0Myw0NDI0NCw0NDI0Niw0NDI0OCw0NDI0OSw0NDI1MCw0NDI1MSw0NDI1Miw0NDI1Myw0NDI1NCw0NDI1NSw0NDI1OCw0NDI1OSw0NDI2MSw0NDI2Miw0NDI2NSw0NDI2Nyw0NDI2OSw0NDI3MCw0NDI3NCw0NDI3Niw0NDI3OSw0NDI4MCw0NDI4MSw0NDI4Miw0NDI4Myw0NDI4Niw0NDI4Nyw0NDI4OSw0NDI5MCw0NDI5MSw0NDI5Myw0NDI5NSw0NDI5Niw0NDI5Nyw0NDI5OCw0NDI5OSw0NDMwMiw0NDMwNCw0NDMwNiw0NDMwNyw0NDMwOCw0NDMwOSw0NDMxMCw0NDMxMSw0NDMxMyw0NDMxNCw0NDMxNSw0NDMxNyw0NDMxOCw0NDMxOSw0NDMyMSw0NDMyMiw0NDMyMyw0NDMyNCw0NDMyNSw0NDMyNiw0NDMyNyw0NDMyOCw0NDMzMCw0NDMzMSw0NDMzNCw0NDMzNSw0NDMzNiw0NDMzNyw0NDMzOCw0NDMzOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDM0Miw0NDM0Myw0NDM0NSw0NDM0Niw0NDM0Nyw0NDM0OSw0NDM1MCw0NDM1MSw0NDM1Miw0NDM1Myw0NDM1NCw0NDM1NSw0NDM1OCw0NDM2MCw0NDM2Miw0NDM2Myw0NDM2NCw0NDM2NSw0NDM2Niw0NDM2Nyw0NDM2OSw0NDM3MCw0NDM3MSw0NDM3Myw0NDM3NCw0NDM3NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDM3Nyw0NDM3OCw0NDM3OSw0NDM4MCw0NDM4MSw0NDM4Miw0NDM4Myw0NDM4NCw0NDM4Niw0NDM4OCw0NDM4OSw0NDM5MCw0NDM5MSw0NDM5Miw0NDM5Myw0NDM5NCw0NDM5NSw0NDM5OCw0NDM5OSw0NDQwMSw0NDQwMiw0NDQwNyw0NDQwOCw0NDQwOSw0NDQxMCw0NDQxNCw0NDQxNiw0NDQxOSw0NDQyMCw0NDQyMSw0NDQyMiw0NDQyMyw0NDQyNiw0NDQyNyw0NDQyOSw0NDQzMCw0NDQzMSw0NDQzMyw0NDQzNCw0NDQzNSw0NDQzNiw0NDQzNyw0NDQzOCw0NDQzOSw0NDQ0MCw0NDQ0MSw0NDQ0Miw0NDQ0Myw0NDQ0Niw0NDQ0Nyw0NDQ0OCw0NDQ0OSw0NDQ1MCw0NDQ1MSw0NDQ1Myw0NDQ1NCw0NDQ1NSw0NDQ1Niw0NDQ1Nyw0NDQ1OCw0NDQ1OSw0NDQ2MCw0NDQ2MSw0NDQ2Miw0NDQ2Myw0NDQ2NCw0NDQ2NSw0NDQ2Niw0NDQ2Nyw0NDQ2OCw0NDQ2OSw0NDQ3MCw0NDQ3Miw0NDQ3Myw0NDQ3NCw0NDQ3NSw0NDQ3Niw0NDQ3Nyw0NDQ3OCw0NDQ3OSw0NDQ4Miw0NDQ4Myw0NDQ4NSw0NDQ4Niw0NDQ4Nyw0NDQ4OSw0NDQ5MCw0NDQ5MSw0NDQ5Miw0NDQ5Myw0NDQ5NCw0NDQ5NSw0NDQ5OCw0NDUwMCw0NDUwMSw0NDUwMiw0NDUwMyw0NDUwNCw0NDUwNSw0NDUwNiw0NDUwNyw0NDUwOSw0NDUxMCw0NDUxMSw0NDUxMyw0NDUxNCw0NDUxNSw0NDUxNyw0NDUxOCw0NDUxOSw0NDUyMCw0NDUyMSw0NDUyMiw0NDUyMyw0NDUyNCw0NDUyNSw0NDUyNiw0NDUyNyw0NDUyOCw0NDUyOSw0NDUzMCw0NDUzMSw0NDUzMiw0NDUzMyw0NDUzNCw0NDUzNSw0NDUzOCw0NDUzOSw0NDU0MSw0NDU0Miw0NDU0Niw0NDU0Nyw0NDU0OCw0NDU0OSw0NDU1MCw0NDU1MSw0NDU1NCw0NDU1Niw0NDU1OCw0NDU1OSw0NDU2MCw0NDU2MSw0NDU2Miw0NDU2Myw0NDU2NSw0NDU2Niw0NDU2Nyw0NDU2OCw0NDU2OSw0NDU3MCw0NDU3MSw0NDU3MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDU3Myw0NDU3NCw0NDU3NSw0NDU3Niw0NDU3Nyw0NDU3OCw0NDU3OSw0NDU4MCw0NDU4MSw0NDU4Miw0NDU4Myw0NDU4NCw0NDU4NSw0NDU4Niw0NDU4Nyw0NDU4OCw0NDU4OSw0NDU5MCw0NDU5MSw0NDU5NCw0NDU5NSw0NDU5Nyw0NDU5OCw0NDYwMSw0NDYwMyw0NDYwNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDYwNSw0NDYwNiw0NDYwNyw0NDYxMCw0NDYxMiw0NDYxNSw0NDYxNiw0NDYxNyw0NDYxOSw0NDYyMyw0NDYyNSw0NDYyNiw0NDYyNyw0NDYyOSw0NDYzMSw0NDYzMiw0NDYzMyw0NDYzNCw0NDYzNSw0NDYzOCw0NDY0Miw0NDY0Myw0NDY0NCw0NDY0Niw0NDY0Nyw0NDY1MCw0NDY1MSw0NDY1Myw0NDY1NCw0NDY1NSw0NDY1Nyw0NDY1OCw0NDY1OSw0NDY2MCw0NDY2MSw0NDY2Miw0NDY2Myw0NDY2Niw0NDY3MCw0NDY3MSw0NDY3Miw0NDY3Myw0NDY3NCw0NDY3NSw0NDY3OCw0NDY3OSw0NDY4MCw0NDY4MSw0NDY4Miw0NDY4Myw0NDY4NSw0NDY4Niw0NDY4Nyw0NDY4OCw0NDY4OSw0NDY5MCw0NDY5MSw0NDY5Miw0NDY5Myw0NDY5NCw0NDY5NSw0NDY5Niw0NDY5Nyw0NDY5OCw0NDY5OSw0NDcwMCw0NDcwMSw0NDcwMiw0NDcwMyw0NDcwNCw0NDcwNSw0NDcwNiw0NDcwNyw0NDcwOCw0NDcwOSw0NDcxMCw0NDcxMSw0NDcxMiw0NDcxMyw0NDcxNCw0NDcxNSw0NDcxNiw0NDcxNyw0NDcxOCw0NDcxOSw0NDcyMCw0NDcyMSw0NDcyMiw0NDcyMyw0NDcyNCw0NDcyNSw0NDcyNiw0NDcyNyw0NDcyOCw0NDcyOSw0NDczMCw0NDczMSw0NDczNSw0NDczNyw0NDczOCw0NDczOSw0NDc0MSw0NDc0Miw0NDc0Myw0NDc0NCw0NDc0NSw0NDc0Niw0NDc0Nyw0NDc1MCw0NDc1NCw0NDc1NSw0NDc1Niw0NDc1Nyw0NDc1OCw0NDc1OSw0NDc2Miw0NDc2Myw0NDc2NSw0NDc2Niw0NDc2Nyw0NDc2OCw0NDc2OSw0NDc3MCw0NDc3MSw0NDc3Miw0NDc3Myw0NDc3NCw0NDc3NSw0NDc3Nyw0NDc3OCw0NDc4MCw0NDc4Miw0NDc4Myw0NDc4NCw0NDc4NSw0NDc4Niw0NDc4Nyw0NDc4OSw0NDc5MCw0NDc5MSw0NDc5Myw0NDc5NCw0NDc5NSw0NDc5Nyw0NDc5OCw0NDc5OSw0NDgwMCw0NDgwMSw0NDgwMiw0NDgwMyw0NDgwNCw0NDgwNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDgwNiw0NDgwOSw0NDgxMCw0NDgxMSw0NDgxMiw0NDgxNCw0NDgxNSw0NDgxNyw0NDgxOCw0NDgxOSw0NDgyMCw0NDgyMSw0NDgyMiw0NDgyMyw0NDgyNCw0NDgyNSw0NDgyNiw0NDgyNyw0NDgyOCw0NDgyOSw0NDgzMCw0NDgzMSw0NDgzMiw0NDgzMyw0NDgzNCw0NDgzNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NDgzNiw0NDgzNyw0NDgzOCw0NDgzOSw0NDg0MCw0NDg0MSw0NDg0Miw0NDg0Myw0NDg0Niw0NDg0Nyw0NDg0OSw0NDg1MSw0NDg1Myw0NDg1NCw0NDg1NSw0NDg1Niw0NDg1Nyw0NDg1OCw0NDg1OSw0NDg2Miw0NDg2NCw0NDg2OCw0NDg2OSw0NDg3MCw0NDg3MSw0NDg3NCw0NDg3NSw0NDg3Niw0NDg3Nyw0NDg3OCw0NDg3OSw0NDg4MSw0NDg4Miw0NDg4Myw0NDg4NCw0NDg4NSw0NDg4Niw0NDg4Nyw0NDg4OCw0NDg4OSw0NDg5MCw0NDg5MSw0NDg5NCw0NDg5NSw0NDg5Niw0NDg5Nyw0NDg5OCw0NDg5OSw0NDkwMiw0NDkwMyw0NDkwNCw0NDkwNSw0NDkwNiw0NDkwNyw0NDkwOCw0NDkwOSw0NDkxMCw0NDkxMSw0NDkxMiw0NDkxMyw0NDkxNCw0NDkxNSw0NDkxNiw0NDkxNyw0NDkxOCw0NDkxOSw0NDkyMCw0NDkyMiw0NDkyMyw0NDkyNCw0NDkyNSw0NDkyNiw0NDkyNyw0NDkyOSw0NDkzMCw0NDkzMSw0NDkzMyw0NDkzNCw0NDkzNSw0NDkzNyw0NDkzOCw0NDkzOSw0NDk0MCw0NDk0MSw0NDk0Miw0NDk0Myw0NDk0Niw0NDk0Nyw0NDk0OCw0NDk1MCw0NDk1MSw0NDk1Miw0NDk1Myw0NDk1NCw0NDk1NSw0NDk1Nyw0NDk1OCw0NDk1OSw0NDk2MCw0NDk2MSw0NDk2Miw0NDk2Myw0NDk2NCw0NDk2NSw0NDk2Niw0NDk2Nyw0NDk2OCw0NDk2OSw0NDk3MCw0NDk3MSw0NDk3Miw0NDk3Myw0NDk3NCw0NDk3NSw0NDk3Niw0NDk3Nyw0NDk3OCw0NDk3OSw0NDk4MCw0NDk4MSw0NDk4Miw0NDk4Myw0NDk4Niw0NDk4Nyw0NDk4OSw0NDk5MCw0NDk5MSw0NDk5Myw0NDk5NCw0NDk5NSw0NDk5Niw0NDk5Nyw0NDk5OCw0NTAwMiw0NTAwNCw0NTAwNyw0NTAwOCw0NTAwOSw0NTAxMCw0NTAxMSw0NTAxMyw0NTAxNCw0NTAxNSw0NTAxNiw0NTAxNyw0NTAxOCw0NTAxOSw0NTAyMSw0NTAyMiw0NTAyMyw0NTAyNCw0NTAyNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTAyNiw0NTAyNyw0NTAyOCw0NTAyOSw0NTAzMCw0NTAzMSw0NTAzNCw0NTAzNSw0NTAzNiw0NTAzNyw0NTAzOCw0NTAzOSw0NTA0Miw0NTA0Myw0NTA0NSw0NTA0Niw0NTA0Nyw0NTA0OSw0NTA1MCw0NTA1MSw0NTA1Miw0NTA1Myw0NTA1NCw0NTA1NSw0NTA1OCw0NTA1OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTA2MSw0NTA2Miw0NTA2Myw0NTA2NCw0NTA2NSw0NTA2Niw0NTA2Nyw0NTA2OSw0NTA3MCw0NTA3MSw0NTA3Myw0NTA3NCw0NTA3NSw0NTA3Nyw0NTA3OCw0NTA3OSw0NTA4MCw0NTA4MSw0NTA4Miw0NTA4Myw0NTA4Niw0NTA4Nyw0NTA4OCw0NTA4OSw0NTA5MCw0NTA5MSw0NTA5Miw0NTA5Myw0NTA5NCw0NTA5NSw0NTA5Nyw0NTA5OCw0NTA5OSw0NTEwMCw0NTEwMSw0NTEwMiw0NTEwMyw0NTEwNCw0NTEwNSw0NTEwNiw0NTEwNyw0NTEwOCw0NTEwOSw0NTExMCw0NTExMSw0NTExMiw0NTExMyw0NTExNCw0NTExNSw0NTExNiw0NTExNyw0NTExOCw0NTExOSw0NTEyMCw0NTEyMSw0NTEyMiw0NTEyMyw0NTEyNiw0NTEyNyw0NTEyOSw0NTEzMSw0NTEzMyw0NTEzNSw0NTEzNiw0NTEzNyw0NTEzOCw0NTE0Miw0NTE0NCw0NTE0Niw0NTE0Nyw0NTE0OCw0NTE1MCw0NTE1MSw0NTE1Miw0NTE1Myw0NTE1NCw0NTE1NSw0NTE1Niw0NTE1Nyw0NTE1OCw0NTE1OSw0NTE2MCw0NTE2MSw0NTE2Miw0NTE2Myw0NTE2NCw0NTE2NSw0NTE2Niw0NTE2Nyw0NTE2OCw0NTE2OSw0NTE3MCw0NTE3MSw0NTE3Miw0NTE3Myw0NTE3NCw0NTE3NSw0NTE3Niw0NTE3Nyw0NTE3OCw0NTE3OSw0NTE4Miw0NTE4Myw0NTE4NSw0NTE4Niw0NTE4Nyw0NTE4OSw0NTE5MCw0NTE5MSw0NTE5Miw0NTE5Myw0NTE5NCw0NTE5NSw0NTE5OCw0NTIwMCw0NTIwMiw0NTIwMyw0NTIwNCw0NTIwNSw0NTIwNiw0NTIwNyw0NTIxMSw0NTIxMyw0NTIxNCw0NTIxOSw0NTIyMCw0NTIyMSw0NTIyMiw0NTIyMyw0NTIyNiw0NTIzMiw0NTIzNCw0NTIzOCw0NTIzOSw0NTI0MSw0NTI0Miw0NTI0Myw0NTI0NSw0NTI0Niw0NTI0Nyw0NTI0OCw0NTI0OSw0NTI1MCw0NTI1MSw0NTI1NCw0NTI1OCw0NTI1OSw0NTI2MCw0NTI2MSw0NTI2Miw0NTI2Myw0NTI2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTI2Nyw0NTI2OSw0NTI3MCw0NTI3MSw0NTI3Myw0NTI3NCw0NTI3NSw0NTI3Niw0NTI3Nyw0NTI3OCw0NTI3OSw0NTI4MSw0NTI4Miw0NTI4Myw0NTI4NCw0NTI4Niw0NTI4Nyw0NTI4OCw0NTI4OSw0NTI5MCw0NTI5MSw0NTI5Miw0NTI5Myw0NTI5NCw0NTI5NSw0NTI5NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTI5Nyw0NTI5OCw0NTI5OSw0NTMwMCw0NTMwMSw0NTMwMiw0NTMwMyw0NTMwNCw0NTMwNSw0NTMwNiw0NTMwNyw0NTMwOCw0NTMwOSw0NTMxMCw0NTMxMSw0NTMxMiw0NTMxMyw0NTMxNCw0NTMxNSw0NTMxNiw0NTMxNyw0NTMxOCw0NTMxOSw0NTMyMiw0NTMyNSw0NTMyNiw0NTMyNyw0NTMyOSw0NTMzMiw0NTMzMyw0NTMzNCw0NTMzNSw0NTMzOCw0NTM0Miw0NTM0Myw0NTM0NCw0NTM0NSw0NTM0Niw0NTM1MCw0NTM1MSw0NTM1Myw0NTM1NCw0NTM1NSw0NTM1Nyw0NTM1OCw0NTM1OSw0NTM2MCw0NTM2MSw0NTM2Miw0NTM2Myw0NTM2Niw0NTM3MCw0NTM3MSw0NTM3Miw0NTM3Myw0NTM3NCw0NTM3NSw0NTM3OCw0NTM3OSw0NTM4MSw0NTM4Miw0NTM4Myw0NTM4NSw0NTM4Niw0NTM4Nyw0NTM4OCw0NTM4OSw0NTM5MCw0NTM5MSw0NTM5NCw0NTM5NSw0NTM5OCw0NTM5OSw0NTQwMSw0NTQwMiw0NTQwMyw0NTQwNSw0NTQwNiw0NTQwNyw0NTQwOSw0NTQxMCw0NTQxMSw0NTQxMiw0NTQxMyw0NTQxNCw0NTQxNSw0NTQxNiw0NTQxNyw0NTQxOCw0NTQxOSw0NTQyMCw0NTQyMSw0NTQyMiw0NTQyMyw0NTQyNCw0NTQyNSw0NTQyNiw0NTQyNyw0NTQyOCw0NTQyOSw0NTQzMCw0NTQzMSw0NTQzNCw0NTQzNSw0NTQzNyw0NTQzOCw0NTQzOSw0NTQ0MSw0NTQ0Myw0NTQ0NCw0NTQ0NSw0NTQ0Niw0NTQ0Nyw0NTQ1MCw0NTQ1Miw0NTQ1NCw0NTQ1NSw0NTQ1Niw0NTQ1Nyw0NTQ2MSw0NTQ2Miw0NTQ2Myw0NTQ2NSw0NTQ2Niw0NTQ2Nyw0NTQ2OSw0NTQ3MCw0NTQ3MSw0NTQ3Miw0NTQ3Myw0NTQ3NCw0NTQ3NSw0NTQ3Niw0NTQ3Nyw0NTQ3OCw0NTQ3OSw0NTQ4MSw0NTQ4Miw0NTQ4Myw0NTQ4NCw0NTQ4NSw0NTQ4Niw0NTQ4Nyw0NTQ4OCw0NTQ4OSw0NTQ5MCw0NTQ5MSw0NTQ5Miw0NTQ5Myw0NTQ5NCw0NTQ5NSw0NTQ5NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTQ5Nyw0NTQ5OCw0NTQ5OSw0NTUwMCw0NTUwMSw0NTUwMiw0NTUwMyw0NTUwNCw0NTUwNSw0NTUwNiw0NTUwNyw0NTUwOCw0NTUwOSw0NTUxMCw0NTUxMSw0NTUxMiw0NTUxMyw0NTUxNCw0NTUxNSw0NTUxNyw0NTUxOCw0NTUxOSw0NTUyMSw0NTUyMiw0NTUyMyw0NTUyNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTUyNiw0NTUyNyw0NTUyOCw0NTUyOSw0NTUzMCw0NTUzMSw0NTUzNCw0NTUzNiw0NTUzNyw0NTUzOCw0NTUzOSw0NTU0MCw0NTU0MSw0NTU0Miw0NTU0Myw0NTU0Niw0NTU0Nyw0NTU0OSw0NTU1MCw0NTU1MSw0NTU1Myw0NTU1NCw0NTU1NSw0NTU1Niw0NTU1Nyw0NTU1OCw0NTU1OSw0NTU2MCw0NTU2Miw0NTU2NCw0NTU2Niw0NTU2Nyw0NTU2OCw0NTU2OSw0NTU3MCw0NTU3MSw0NTU3NCw0NTU3NSw0NTU3Nyw0NTU3OCw0NTU4MSw0NTU4Miw0NTU4Myw0NTU4NCw0NTU4NSw0NTU4Niw0NTU4Nyw0NTU5MCw0NTU5Miw0NTU5NCw0NTU5NSw0NTU5Niw0NTU5Nyw0NTU5OCw0NTU5OSw0NTYwMSw0NTYwMiw0NTYwMyw0NTYwNCw0NTYwNSw0NTYwNiw0NTYwNyw0NTYwOCw0NTYwOSw0NTYxMCw0NTYxMSw0NTYxMiw0NTYxMyw0NTYxNCw0NTYxNSw0NTYxNiw0NTYxNyw0NTYxOCw0NTYxOSw0NTYyMSw0NTYyMiw0NTYyMyw0NTYyNCw0NTYyNSw0NTYyNiw0NTYyNyw0NTYyOSw0NTYzMCw0NTYzMSw0NTYzMiw0NTYzMyw0NTYzNCw0NTYzNSw0NTYzNiw0NTYzNyw0NTYzOCw0NTYzOSw0NTY0MCw0NTY0MSw0NTY0Miw0NTY0Myw0NTY0NCw0NTY0NSw0NTY0Niw0NTY0Nyw0NTY0OCw0NTY0OSw0NTY1MCw0NTY1MSw0NTY1Miw0NTY1Myw0NTY1NCw0NTY1NSw0NTY1Nyw0NTY1OCw0NTY1OSw0NTY2MSw0NTY2Miw0NTY2Myw0NTY2NSw0NTY2Niw0NTY2Nyw0NTY2OCw0NTY2OSw0NTY3MCw0NTY3MSw0NTY3NCw0NTY3NSw0NTY3Niw0NTY3Nyw0NTY3OCw0NTY3OSw0NTY4MCw0NTY4MSw0NTY4Miw0NTY4Myw0NTY4Niw0NTY4Nyw0NTY4OCw0NTY4OSw0NTY5MCw0NTY5MSw0NTY5Myw0NTY5NCw0NTY5NSw0NTY5Niw0NTY5Nyw0NTY5OCw0NTY5OSw0NTcwMiw0NTcwMyw0NTcwNCw0NTcwNiw0NTcwNyw0NTcwOCw0NTcwOSw0NTcxMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTcxMSw0NTcxNCw0NTcxNSw0NTcxNyw0NTcxOCw0NTcxOSw0NTcyMyw0NTcyNCw0NTcyNSw0NTcyNiw0NTcyNyw0NTczMCw0NTczMiw0NTczNSw0NTczNiw0NTczNyw0NTczOSw0NTc0MSw0NTc0Miw0NTc0Myw0NTc0NSw0NTc0Niw0NTc0Nyw0NTc0OSw0NTc1MCw0NTc1MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTc1Miw0NTc1Myw0NTc1NCw0NTc1NSw0NTc1Niw0NTc1Nyw0NTc1OCw0NTc1OSw0NTc2MCw0NTc2MSw0NTc2Miw0NTc2Myw0NTc2NCw0NTc2NSw0NTc2Niw0NTc2Nyw0NTc3MCw0NTc3MSw0NTc3Myw0NTc3NCw0NTc3NSw0NTc3Nyw0NTc3OSw0NTc4MCw0NTc4MSw0NTc4Miw0NTc4Myw0NTc4Niw0NTc4OCw0NTc5MCw0NTc5MSw0NTc5Miw0NTc5Myw0NTc5NSw0NTc5OSw0NTgwMSw0NTgwMiw0NTgwOCw0NTgwOSw0NTgxMCw0NTgxNCw0NTgyMCw0NTgyMSw0NTgyMiw0NTgyNiw0NTgyNyw0NTgyOSw0NTgzMCw0NTgzMSw0NTgzMyw0NTgzNCw0NTgzNSw0NTgzNiw0NTgzNyw0NTgzOCw0NTgzOSw0NTg0Miw0NTg0Niw0NTg0Nyw0NTg0OCw0NTg0OSw0NTg1MCw0NTg1MSw0NTg1Myw0NTg1NCw0NTg1NSw0NTg1Niw0NTg1Nyw0NTg1OCw0NTg1OSw0NTg2MCw0NTg2MSw0NTg2Miw0NTg2Myw0NTg2NCw0NTg2NSw0NTg2Niw0NTg2Nyw0NTg2OCw0NTg2OSw0NTg3MCw0NTg3MSw0NTg3Miw0NTg3Myw0NTg3NCw0NTg3NSw0NTg3Niw0NTg3Nyw0NTg3OCw0NTg3OSw0NTg4MCw0NTg4MSw0NTg4Miw0NTg4Myw0NTg4NCw0NTg4NSw0NTg4Niw0NTg4Nyw0NTg4OCw0NTg4OSw0NTg5MCw0NTg5MSw0NTg5Miw0NTg5Myw0NTg5NCw0NTg5NSw0NTg5Niw0NTg5Nyw0NTg5OCw0NTg5OSw0NTkwMCw0NTkwMSw0NTkwMiw0NTkwMyw0NTkwNCw0NTkwNSw0NTkwNiw0NTkwNyw0NTkxMSw0NTkxMyw0NTkxNCw0NTkxNyw0NTkyMCw0NTkyMSw0NTkyMiw0NTkyMyw0NTkyNiw0NTkyOCw0NTkzMCw0NTkzMiw0NTkzMyw0NTkzNSw0NTkzOCw0NTkzOSw0NTk0MSw0NTk0Miw0NTk0Myw0NTk0NSw0NTk0Niw0NTk0Nyw0NTk0OCw0NTk0OSw0NTk1MCw0NTk1MSw0NTk1NCw0NTk1OCw0NTk1OSw0NTk2MCw0NTk2MSw0NTk2Miw0NTk2Myw0NTk2NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTk2Niw0NTk2Nyw0NTk2OSw0NTk3MCw0NTk3MSw0NTk3Myw0NTk3NCw0NTk3NSw0NTk3Niw0NTk3Nyw0NTk3OCw0NTk3OSw0NTk4MCw0NTk4MSw0NTk4Miw0NTk4Myw0NTk4Niw0NTk4Nyw0NTk4OCw0NTk4OSw0NTk5MCw0NTk5MSw0NTk5Myw0NTk5NCw0NTk5NSw0NTk5NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NTk5OCw0NTk5OSw0NjAwMCw0NjAwMSw0NjAwMiw0NjAwMyw0NjAwNCw0NjAwNSw0NjAwNiw0NjAwNyw0NjAwOCw0NjAwOSw0NjAxMCw0NjAxMSw0NjAxMiw0NjAxMyw0NjAxNCw0NjAxNSw0NjAxNiw0NjAxNyw0NjAxOCw0NjAxOSw0NjAyMiw0NjAyMyw0NjAyNSw0NjAyNiw0NjAyOSw0NjAzMSw0NjAzMyw0NjAzNCw0NjAzNSw0NjAzOCw0NjA0MCw0NjA0Miw0NjA0NCw0NjA0Niw0NjA0Nyw0NjA0OSw0NjA1MCw0NjA1MSw0NjA1Myw0NjA1NCw0NjA1NSw0NjA1Nyw0NjA1OCw0NjA1OSw0NjA2MCw0NjA2MSw0NjA2Miw0NjA2Myw0NjA2NCw0NjA2NSw0NjA2Niw0NjA2Nyw0NjA2OCw0NjA2OSw0NjA3MCw0NjA3MSw0NjA3Miw0NjA3Myw0NjA3NCw0NjA3NSw0NjA3Nyw0NjA3OCw0NjA3OSw0NjA4MCw0NjA4MSw0NjA4Miw0NjA4Myw0NjA4NCw0NjA4NSw0NjA4Niw0NjA4Nyw0NjA4OCw0NjA4OSw0NjA5MCw0NjA5MSw0NjA5Miw0NjA5Myw0NjA5NCw0NjA5NSw0NjA5Nyw0NjA5OCw0NjA5OSw0NjEwMCw0NjEwMSw0NjEwMiw0NjEwMyw0NjEwNSw0NjEwNiw0NjEwNyw0NjEwOSw0NjExMCw0NjExMSw0NjExMyw0NjExNCw0NjExNSw0NjExNiw0NjExNyw0NjExOCw0NjExOSw0NjEyMiw0NjEyNCw0NjEyNSw0NjEyNiw0NjEyNyw0NjEyOCw0NjEyOSw0NjEzMCw0NjEzMSw0NjEzMyw0NjEzNCw0NjEzNSw0NjEzNiw0NjEzNyw0NjEzOCw0NjEzOSw0NjE0MCw0NjE0MSw0NjE0Miw0NjE0Myw0NjE0NCw0NjE0NSw0NjE0Niw0NjE0Nyw0NjE0OCw0NjE0OSw0NjE1MCw0NjE1MSw0NjE1Miw0NjE1Myw0NjE1NCw0NjE1NSw0NjE1Niw0NjE1Nyw0NjE1OCw0NjE1OSw0NjE2Miw0NjE2Myw0NjE2NSw0NjE2Niw0NjE2Nyw0NjE2OSw0NjE3MCw0NjE3MSw0NjE3Miw0NjE3Myw0NjE3NCw0NjE3NSw0NjE3OCw0NjE4MCw0NjE4MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NjE4Myw0NjE4NCw0NjE4NSw0NjE4Niw0NjE4Nyw0NjE4OSw0NjE5MCw0NjE5MSw0NjE5Miw0NjE5Myw0NjE5NCw0NjE5NSw0NjE5Niw0NjE5Nyw0NjE5OCw0NjE5OSw0NjIwMCw0NjIwMSw0NjIwMiw0NjIwMyw0NjIwNCw0NjIwNSw0NjIwNiw0NjIwNyw0NjIwOSw0NjIxMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NjIxMSw0NjIxMiw0NjIxMyw0NjIxNCw0NjIxNSw0NjIxNyw0NjIxOCw0NjIxOSw0NjIyMCw0NjIyMSw0NjIyMiw0NjIyMyw0NjIyNCw0NjIyNSw0NjIyNiw0NjIyNyw0NjIyOCw0NjIyOSw0NjIzMCw0NjIzMSw0NjIzMiw0NjIzMyw0NjIzNCw0NjIzNSw0NjIzNiw0NjIzOCw0NjIzOSw0NjI0MCw0NjI0MSw0NjI0Miw0NjI0Myw0NjI0NSw0NjI0Niw0NjI0Nyw0NjI0OSw0NjI1MCw0NjI1MSw0NjI1Myw0NjI1NCw0NjI1NSw0NjI1Niw0NjI1Nyw0NjI1OCw0NjI1OSw0NjI2MCw0NjI2Miw0NjI2NCw0NjI2Niw0NjI2Nyw0NjI2OCw0NjI2OSw0NjI3MCw0NjI3MSw0NjI3Myw0NjI3NCw0NjI3NSw0NjI3Nyw0NjI3OCw0NjI3OSw0NjI4MSw0NjI4Miw0NjI4Myw0NjI4NCw0NjI4NSw0NjI4Niw0NjI4Nyw0NjI4OSw0NjI5MCw0NjI5MSw0NjI5Miw0NjI5NCw0NjI5NSw0NjI5Niw0NjI5Nyw0NjI5OCw0NjI5OSw0NjMwMiw0NjMwMyw0NjMwNSw0NjMwNiw0NjMwOSw0NjMxMSw0NjMxMiw0NjMxMyw0NjMxNCw0NjMxNSw0NjMxOCw0NjMyMCw0NjMyMiw0NjMyMyw0NjMyNCw0NjMyNSw0NjMyNiw0NjMyNyw0NjMyOSw0NjMzMCw0NjMzMSw0NjMzMiw0NjMzMyw0NjMzNCw0NjMzNSw0NjMzNiw0NjMzNyw0NjMzOCw0NjMzOSw0NjM0MCw0NjM0MSw0NjM0Miw0NjM0Myw0NjM0NCw0NjM0NSw0NjM0Niw0NjM0Nyw0NjM0OCw0NjM0OSw0NjM1MCw0NjM1MSw0NjM1Miw0NjM1Myw0NjM1NCw0NjM1NSw0NjM1OCw0NjM1OSw0NjM2MSw0NjM2Miw0NjM2NSw0NjM2Niw0NjM2Nyw0NjM2OCw0NjM2OSw0NjM3MCw0NjM3MSw0NjM3NCw0NjM3OSw0NjM4MCw0NjM4MSw0NjM4Miw0NjM4Myw0NjM4Niw0NjM4Nyw0NjM4OSw0NjM5MCw0NjM5MSw0NjM5Myw0NjM5NCw0NjM5NSw0NjM5Niw0NjM5Nyw0NjM5OCw0NjM5OSw0NjQwMiw0NjQwNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NjQwNyw0NjQwOCw0NjQwOSw0NjQxMCw0NjQxNCw0NjQxNSw0NjQxNyw0NjQxOCw0NjQxOSw0NjQyMSw0NjQyMiw0NjQyMyw0NjQyNCw0NjQyNSw0NjQyNiw0NjQyNyw0NjQzMCw0NjQzNCw0NjQzNSw0NjQzNiw0NjQzNyw0NjQzOCw0NjQzOSw0NjQ0MCw0NjQ0MSw0NjQ0MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NjQ0Myw0NjQ0NCw0NjQ0NSw0NjQ0Niw0NjQ0Nyw0NjQ0OCw0NjQ0OSw0NjQ1MCw0NjQ1MSw0NjQ1Miw0NjQ1Myw0NjQ1NCw0NjQ1NSw0NjQ1Niw0NjQ1Nyw0NjQ1OCw0NjQ1OSw0NjQ2MCw0NjQ2MSw0NjQ2Miw0NjQ2Myw0NjQ2NCw0NjQ2NSw0NjQ2Niw0NjQ2Nyw0NjQ2OCw0NjQ2OSw0NjQ3MCw0NjQ3MSw0NjQ3Miw0NjQ3Myw0NjQ3NCw0NjQ3NSw0NjQ3Niw0NjQ3Nyw0NjQ3OCw0NjQ3OSw0NjQ4MCw0NjQ4MSw0NjQ4Miw0NjQ4Myw0NjQ4NCw0NjQ4NSw0NjQ4Niw0NjQ4Nyw0NjQ4OCw0NjQ4OSw0NjQ5MCw0NjQ5MSw0NjQ5Miw0NjQ5Myw0NjQ5NCw0NjQ5NSw0NjQ5OCw0NjQ5OSw0NjUwMSw0NjUwMiw0NjUwMyw0NjUwNSw0NjUwOCw0NjUwOSw0NjUxMCw0NjUxMSw0NjUxNCw0NjUxOCw0NjUxOSw0NjUyMCw0NjUyMSw0NjUyMiw0NjUyNiw0NjUyNyw0NjUyOSw0NjUzMCw0NjUzMSw0NjUzMyw0NjUzNCw0NjUzNSw0NjUzNiw0NjUzNyw0NjUzOCw0NjUzOSw0NjU0Miw0NjU0Niw0NjU0Nyw0NjU0OCw0NjU0OSw0NjU1MCw0NjU1MSw0NjU1Myw0NjU1NCw0NjU1NSw0NjU1Niw0NjU1Nyw0NjU1OCw0NjU1OSw0NjU2MCw0NjU2MSw0NjU2Miw0NjU2Myw0NjU2NCw0NjU2NSw0NjU2Niw0NjU2Nyw0NjU2OCw0NjU2OSw0NjU3MCw0NjU3MSw0NjU3Myw0NjU3NCw0NjU3NSw0NjU3Niw0NjU3Nyw0NjU3OCw0NjU3OSw0NjU4MCw0NjU4MSw0NjU4Miw0NjU4Myw0NjU4NCw0NjU4NSw0NjU4Niw0NjU4Nyw0NjU4OCw0NjU4OSw0NjU5MCw0NjU5MSw0NjU5Miw0NjU5Myw0NjU5NCw0NjU5NSw0NjU5Niw0NjU5Nyw0NjU5OCw0NjU5OSw0NjYwMCw0NjYwMSw0NjYwMiw0NjYwMyw0NjYwNCw0NjYwNSw0NjYwNiw0NjYwNyw0NjYxMCw0NjYxMSw0NjYxMyw0NjYxNCw0NjYxNSw0NjYxNyw0NjYxOCw0NjYxOSw0NjYyMCw0NjYyMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NjYyMiw0NjYyMyw0NjYyNCw0NjYyNSw0NjYyNiw0NjYyNyw0NjYyOCw0NjYzMCw0NjYzMSw0NjYzMiw0NjYzMyw0NjYzNCw0NjYzNSw0NjYzNyw0NjYzOCw0NjYzOSw0NjY0MCw0NjY0MSw0NjY0Miw0NjY0Myw0NjY0NSw0NjY0Niw0NjY0Nyw0NjY0OCw0NjY0OSw0NjY1MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NjY1MSw0NjY1Miw0NjY1Myw0NjY1NCw0NjY1NSw0NjY1Niw0NjY1Nyw0NjY1OCw0NjY1OSw0NjY2MCw0NjY2MSw0NjY2Miw0NjY2Myw0NjY2NSw0NjY2Niw0NjY2Nyw0NjY2OCw0NjY2OSw0NjY3MCw0NjY3MSw0NjY3Miw0NjY3Myw0NjY3NCw0NjY3NSw0NjY3Niw0NjY3Nyw0NjY3OCw0NjY3OSw0NjY4MCw0NjY4MSw0NjY4Miw0NjY4Myw0NjY4NCw0NjY4NSw0NjY4Niw0NjY4Nyw0NjY4OCw0NjY4OSw0NjY5MCw0NjY5MSw0NjY5Myw0NjY5NCw0NjY5NSw0NjY5Nyw0NjY5OCw0NjY5OSw0NjcwMCw0NjcwMSw0NjcwMiw0NjcwMyw0NjcwNCw0NjcwNSw0NjcwNiw0NjcwNyw0NjcwOCw0NjcwOSw0NjcxMCw0NjcxMSw0NjcxMiw0NjcxMyw0NjcxNCw0NjcxNSw0NjcxNiw0NjcxNyw0NjcxOCw0NjcxOSw0NjcyMCw0NjcyMSw0NjcyMiw0NjcyMyw0NjcyNCw0NjcyNSw0NjcyNiw0NjcyNyw0NjcyOCw0NjcyOSw0NjczMCw0NjczMSw0NjczMiw0NjczMyw0NjczNCw0NjczNSw0NjczNiw0NjczNyw0NjczOCw0NjczOSw0Njc0MCw0Njc0MSw0Njc0Miw0Njc0Myw0Njc0NCw0Njc0NSw0Njc0Niw0Njc0Nyw0Njc1MCw0Njc1MSw0Njc1Myw0Njc1NCw0Njc1NSw0Njc1Nyw0Njc1OCw0Njc1OSw0Njc2MCw0Njc2MSw0Njc2Miw0Njc2NSw0Njc2Niw0Njc2Nyw0Njc2OCw0Njc3MCw0Njc3MSw0Njc3Miw0Njc3Myw0Njc3NCw0Njc3NSw0Njc3Niw0Njc3Nyw0Njc3OCw0Njc3OSw0Njc4MCw0Njc4MSw0Njc4Miw0Njc4Myw0Njc4NCw0Njc4NSw0Njc4Niw0Njc4Nyw0Njc4OCw0Njc4OSw0Njc5MCw0Njc5MSw0Njc5Miw0Njc5Myw0Njc5NCw0Njc5NSw0Njc5Niw0Njc5Nyw0Njc5OCw0Njc5OSw0NjgwMCw0NjgwMSw0NjgwMiw0NjgwMyw0NjgwNSw0NjgwNiw0NjgwNyw0NjgwOCw0NjgwOSw0NjgxMCw0NjgxMSw0NjgxMiw0NjgxMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NjgxNCw0NjgxNSw0NjgxNiw0NjgxNyw0NjgxOCw0NjgxOSw0NjgyMCw0NjgyMSw0NjgyMiw0NjgyMyw0NjgyNCw0NjgyNSw0NjgyNiw0NjgyNyw0NjgyOCw0NjgyOSw0NjgzMCw0NjgzMSw0NjgzMyw0NjgzNCw0NjgzNSw0NjgzNyw0NjgzOCw0NjgzOSw0Njg0MSw0Njg0MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0Njg0Myw0Njg0NCw0Njg0NSw0Njg0Niw0Njg0Nyw0Njg1MCw0Njg1MSw0Njg1Miw0Njg1NCw0Njg1NSw0Njg1Niw0Njg1Nyw0Njg1OCw0Njg1OSw0Njg2MCw0Njg2MSw0Njg2Miw0Njg2Myw0Njg2NCw0Njg2NSw0Njg2Niw0Njg2Nyw0Njg2OCw0Njg2OSw0Njg3MCw0Njg3MSw0Njg3Miw0Njg3Myw0Njg3NCw0Njg3NSw0Njg3Niw0Njg3Nyw0Njg3OCw0Njg3OSw0Njg4MCw0Njg4MSw0Njg4Miw0Njg4Myw0Njg4NCw0Njg4NSw0Njg4Niw0Njg4Nyw0Njg5MCw0Njg5MSw0Njg5Myw0Njg5NCw0Njg5Nyw0Njg5OCw0Njg5OSw0NjkwMCw0NjkwMSw0NjkwMiw0NjkwMyw0NjkwNiw0NjkwOCw0NjkwOSw0NjkxMCw0NjkxMSw0NjkxMiw0NjkxMyw0NjkxNCw0NjkxNSw0NjkxNyw0NjkxOCw0NjkxOSw0NjkyMSw0NjkyMiw0NjkyMyw0NjkyNSw0NjkyNiw0NjkyNyw0NjkyOCw0NjkyOSw0NjkzMCw0NjkzMSw0NjkzNCw0NjkzNSw0NjkzNiw0NjkzNyw0NjkzOCw0NjkzOSw0Njk0MCw0Njk0MSw0Njk0Miw0Njk0Myw0Njk0NSw0Njk0Niw0Njk0Nyw0Njk0OSw0Njk1MCw0Njk1MSw0Njk1Myw0Njk1NCw0Njk1NSw0Njk1Niw0Njk1Nyw0Njk1OCw0Njk1OSw0Njk2Miw0Njk2NCw0Njk2Niw0Njk2Nyw0Njk2OCw0Njk2OSw0Njk3MCw0Njk3MSw0Njk3NCw0Njk3NSw0Njk3Nyw0Njk3OCw0Njk3OSw0Njk4MSw0Njk4Miw0Njk4Myw0Njk4NCw0Njk4NSw0Njk4Niw0Njk4Nyw0Njk5MCw0Njk5NSw0Njk5Niw0Njk5Nyw0NzAwMiw0NzAwMyw0NzAwNSw0NzAwNiw0NzAwNyw0NzAwOSw0NzAxMCw0NzAxMSw0NzAxMiw0NzAxMyw0NzAxNCw0NzAxNSw0NzAxOCw0NzAyMiw0NzAyMyw0NzAyNCw0NzAyNSw0NzAyNiw0NzAyNyw0NzAzMCw0NzAzMSw0NzAzMyw0NzAzNCw0NzAzNSw0NzAzNiw0NzAzNyw0NzAzOCw0NzAzOSw0NzA0MCw0NzA0MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NzA0Miw0NzA0Myw0NzA0NCw0NzA0NSw0NzA0Niw0NzA0OCw0NzA1MCw0NzA1MSw0NzA1Miw0NzA1Myw0NzA1NCw0NzA1NSw0NzA1Niw0NzA1Nyw0NzA1OCw0NzA1OSw0NzA2MCw0NzA2MSw0NzA2Miw0NzA2Myw0NzA2NCw0NzA2NSw0NzA2Niw0NzA2Nyw0NzA2OCw0NzA2OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NzA3MCw0NzA3MSw0NzA3Miw0NzA3Myw0NzA3NCw0NzA3NSw0NzA3Niw0NzA3Nyw0NzA3OCw0NzA3OSw0NzA4MCw0NzA4MSw0NzA4Miw0NzA4Myw0NzA4Niw0NzA4Nyw0NzA4OSw0NzA5MCw0NzA5MSw0NzA5Myw0NzA5NCw0NzA5NSw0NzA5Niw0NzA5Nyw0NzA5OCw0NzA5OSw0NzEwMiw0NzEwNiw0NzEwNyw0NzEwOCw0NzEwOSw0NzExMCw0NzExNCw0NzExNSw0NzExNyw0NzExOCw0NzExOSw0NzEyMSw0NzEyMiw0NzEyMyw0NzEyNCw0NzEyNSw0NzEyNiw0NzEyNyw0NzEzMCw0NzEzMiw0NzEzNCw0NzEzNSw0NzEzNiw0NzEzNyw0NzEzOCw0NzEzOSw0NzE0Miw0NzE0Myw0NzE0NSw0NzE0Niw0NzE0Nyw0NzE0OSw0NzE1MCw0NzE1MSw0NzE1Miw0NzE1Myw0NzE1NCw0NzE1NSw0NzE1OCw0NzE2Miw0NzE2Myw0NzE2NCw0NzE2NSw0NzE2Niw0NzE2Nyw0NzE2OSw0NzE3MCw0NzE3MSw0NzE3Myw0NzE3NCw0NzE3NSw0NzE3Niw0NzE3Nyw0NzE3OCw0NzE3OSw0NzE4MCw0NzE4MSw0NzE4Miw0NzE4Myw0NzE4NCw0NzE4Niw0NzE4OCw0NzE4OSw0NzE5MCw0NzE5MSw0NzE5Miw0NzE5Myw0NzE5NCw0NzE5NSw0NzE5OCw0NzE5OSw0NzIwMSw0NzIwMiw0NzIwMyw0NzIwNSw0NzIwNiw0NzIwNyw0NzIwOCw0NzIwOSw0NzIxMCw0NzIxMSw0NzIxNCw0NzIxNiw0NzIxOCw0NzIxOSw0NzIyMCw0NzIyMSw0NzIyMiw0NzIyMyw0NzIyNSw0NzIyNiw0NzIyNyw0NzIyOSw0NzIzMCw0NzIzMSw0NzIzMiw0NzIzMyw0NzIzNCw0NzIzNSw0NzIzNiw0NzIzNyw0NzIzOCw0NzIzOSw0NzI0MCw0NzI0MSw0NzI0Miw0NzI0Myw0NzI0NCw0NzI0Niw0NzI0Nyw0NzI0OCw0NzI0OSw0NzI1MCw0NzI1MSw0NzI1Miw0NzI1Myw0NzI1NCw0NzI1NSw0NzI1Niw0NzI1Nyw0NzI1OCw0NzI1OSw0NzI2MCw0NzI2MSw0NzI2Miw0NzI2MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NzI2NCw0NzI2NSw0NzI2Niw0NzI2Nyw0NzI2OCw0NzI2OSw0NzI3MCw0NzI3MSw0NzI3Myw0NzI3NCw0NzI3NSw0NzI3Niw0NzI3Nyw0NzI3OCw0NzI3OSw0NzI4MSw0NzI4Miw0NzI4Myw0NzI4NSw0NzI4Niw0NzI4Nyw0NzI4OSw0NzI5MCw0NzI5MSw0NzI5Miw0NzI5MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NzI5NCw0NzI5NSw0NzI5OCw0NzMwMCw0NzMwMiw0NzMwMyw0NzMwNCw0NzMwNSw0NzMwNiw0NzMwNyw0NzMwOSw0NzMxMCw0NzMxMSw0NzMxMyw0NzMxNCw0NzMxNSw0NzMxNyw0NzMxOCw0NzMxOSw0NzMyMCw0NzMyMSw0NzMyMiw0NzMyMyw0NzMyNCw0NzMyNiw0NzMyOCw0NzMzMCw0NzMzMSw0NzMzMiw0NzMzMyw0NzMzNCw0NzMzNSw0NzMzOCw0NzMzOSw0NzM0MSw0NzM0Miw0NzM0Myw0NzM0NSw0NzM0Niw0NzM0Nyw0NzM0OCw0NzM0OSw0NzM1MCw0NzM1MSw0NzM1NCw0NzM1Niw0NzM1OCw0NzM1OSw0NzM2MCw0NzM2MSw0NzM2Miw0NzM2Myw0NzM2NSw0NzM2Niw0NzM2Nyw0NzM2OCw0NzM2OSw0NzM3MCw0NzM3MSw0NzM3Miw0NzM3Myw0NzM3NCw0NzM3NSw0NzM3Niw0NzM3Nyw0NzM3OCw0NzM3OSw0NzM4MCw0NzM4MSw0NzM4Miw0NzM4Myw0NzM4NSw0NzM4Niw0NzM4Nyw0NzM4OCw0NzM4OSw0NzM5MCw0NzM5MSw0NzM5Myw0NzM5NCw0NzM5NSw0NzM5Niw0NzM5Nyw0NzM5OCw0NzM5OSw0NzQwMCw0NzQwMSw0NzQwMiw0NzQwMyw0NzQwNCw0NzQwNSw0NzQwNiw0NzQwNyw0NzQwOCw0NzQwOSw0NzQxMCw0NzQxMSw0NzQxMiw0NzQxMyw0NzQxNCw0NzQxNSw0NzQxNiw0NzQxNyw0NzQxOCw0NzQxOSw0NzQyMiw0NzQyMyw0NzQyNSw0NzQyNiw0NzQyNyw0NzQyOSw0NzQzMCw0NzQzMSw0NzQzMiw0NzQzMyw0NzQzNCw0NzQzNSw0NzQzNyw0NzQzOCw0NzQ0MCw0NzQ0Miw0NzQ0Myw0NzQ0NCw0NzQ0NSw0NzQ0Niw0NzQ0Nyw0NzQ1MCw0NzQ1MSw0NzQ1Myw0NzQ1NCw0NzQ1NSw0NzQ1Nyw0NzQ1OCw0NzQ1OSw0NzQ2MCw0NzQ2MSw0NzQ2Miw0NzQ2Myw0NzQ2Niw0NzQ2OCw0NzQ3MCw0NzQ3MSw0NzQ3Miw0NzQ3Myw0NzQ3NCw0NzQ3NSw0NzQ3OCw0NzQ3OSw0NzQ4MSw0NzQ4Miw0NzQ4Myw0NzQ4NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NzQ4Niw0NzQ4Nyw0NzQ4OCw0NzQ4OSw0NzQ5MCw0NzQ5MSw0NzQ5NCw0NzQ5Niw0NzQ5OSw0NzUwMCw0NzUwMyw0NzUwNCw0NzUwNSw0NzUwNiw0NzUwNyw0NzUwOCw0NzUwOSw0NzUxMCw0NzUxMSw0NzUxMiw0NzUxMyw0NzUxNCw0NzUxNSw0NzUxNiw0NzUxNyw0NzUxOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NzUxOSw0NzUyMCw0NzUyMSw0NzUyMiw0NzUyMyw0NzUyNCw0NzUyNSw0NzUyNiw0NzUyNyw0NzUyOCw0NzUyOSw0NzUzMCw0NzUzMSw0NzUzNCw0NzUzNSw0NzUzNyw0NzUzOCw0NzUzOSw0NzU0MSw0NzU0Miw0NzU0Myw0NzU0NCw0NzU0NSw0NzU0Niw0NzU0Nyw0NzU1MCw0NzU1Miw0NzU1NCw0NzU1NSw0NzU1Niw0NzU1Nyw0NzU1OCw0NzU1OSw0NzU2Miw0NzU2Myw0NzU2NSw0NzU3MSw0NzU3Miw0NzU3Myw0NzU3NCw0NzU3NSw0NzU3OCw0NzU4MCw0NzU4Myw0NzU4NCw0NzU4Niw0NzU5MCw0NzU5MSw0NzU5Myw0NzU5NCw0NzU5NSw0NzU5Nyw0NzU5OCw0NzU5OSw0NzYwMCw0NzYwMSw0NzYwMiw0NzYwMyw0NzYwNiw0NzYxMSw0NzYxMiw0NzYxMyw0NzYxNCw0NzYxNSw0NzYxOCw0NzYxOSw0NzYyMCw0NzYyMSw0NzYyMiw0NzYyMyw0NzYyNSw0NzYyNiw0NzYyNyw0NzYyOCw0NzYyOSw0NzYzMCw0NzYzMSw0NzYzMiw0NzYzMyw0NzYzNCw0NzYzNSw0NzYzNiw0NzYzOCw0NzYzOSw0NzY0MCw0NzY0MSw0NzY0Miw0NzY0Myw0NzY0NCw0NzY0NSw0NzY0Niw0NzY0Nyw0NzY0OCw0NzY0OSw0NzY1MCw0NzY1MSw0NzY1Miw0NzY1Myw0NzY1NCw0NzY1NSw0NzY1Niw0NzY1Nyw0NzY1OCw0NzY1OSw0NzY2MCw0NzY2MSw0NzY2Miw0NzY2Myw0NzY2NCw0NzY2NSw0NzY2Niw0NzY2Nyw0NzY2OCw0NzY2OSw0NzY3MCw0NzY3MSw0NzY3NCw0NzY3NSw0NzY3Nyw0NzY3OCw0NzY3OSw0NzY4MSw0NzY4Myw0NzY4NCw0NzY4NSw0NzY4Niw0NzY4Nyw0NzY5MCw0NzY5Miw0NzY5NSw0NzY5Niw0NzY5Nyw0NzY5OCw0NzcwMiw0NzcwMyw0NzcwNSw0NzcwNiw0NzcwNyw0NzcwOSw0NzcxMCw0NzcxMSw0NzcxMiw0NzcxMyw0NzcxNCw0NzcxNSw0NzcxOCw0NzcyMiw0NzcyMyw0NzcyNCw0NzcyNSw0NzcyNiw0NzcyNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0NzczMCw0NzczMSw0NzczMyw0NzczNCw0NzczNSw0NzczNyw0NzczOCw0NzczOSw0Nzc0MCw0Nzc0MSw0Nzc0Miw0Nzc0Myw0Nzc0NCw0Nzc0NSw0Nzc0Niw0Nzc1MCw0Nzc1Miw0Nzc1Myw0Nzc1NCw0Nzc1NSw0Nzc1Nyw0Nzc1OCw0Nzc1OSw0Nzc2MCw0Nzc2MSw0Nzc2MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0Nzc2Myw0Nzc2NCw0Nzc2NSw0Nzc2Niw0Nzc2Nyw0Nzc2OCw0Nzc2OSw0Nzc3MCw0Nzc3MSw0Nzc3Miw0Nzc3Myw0Nzc3NCw0Nzc3NSw0Nzc3Niw0Nzc3Nyw0Nzc3OCw0Nzc3OSw0Nzc4MCw0Nzc4MSw0Nzc4Miw0Nzc4Myw0Nzc4Niw0Nzc4OSw0Nzc5MCw0Nzc5MSw0Nzc5Myw0Nzc5NSw0Nzc5Niw0Nzc5Nyw0Nzc5OCw0Nzc5OSw0NzgwMiw0NzgwNCw0NzgwNiw0NzgwNyw0NzgwOCw0NzgwOSw0NzgxMCw0NzgxMSw0NzgxMyw0NzgxNCw0NzgxNSw0NzgxNyw0NzgxOCw0NzgxOSw0NzgyMCw0NzgyMSw0NzgyMiw0NzgyMyw0NzgyNCw0NzgyNSw0NzgyNiw0NzgyNyw0NzgyOCw0NzgyOSw0NzgzMCw0NzgzMSw0NzgzNCw0NzgzNSw0NzgzNiw0NzgzNyw0NzgzOCw0NzgzOSw0Nzg0MCw0Nzg0MSw0Nzg0Miw0Nzg0Myw0Nzg0NCw0Nzg0NSw0Nzg0Niw0Nzg0Nyw0Nzg0OCw0Nzg0OSw0Nzg1MCw0Nzg1MSw0Nzg1Miw0Nzg1Myw0Nzg1NCw0Nzg1NSw0Nzg1Niw0Nzg1Nyw0Nzg1OCw0Nzg1OSw0Nzg2MCw0Nzg2MSw0Nzg2Miw0Nzg2Myw0Nzg2NCw0Nzg2NSw0Nzg2Niw0Nzg2Nyw0Nzg2OSw0Nzg3MCw0Nzg3MSw0Nzg3Myw0Nzg3NCw0Nzg3NSw0Nzg3Nyw0Nzg3OCw0Nzg3OSw0Nzg4MCw0Nzg4MSw0Nzg4Miw0Nzg4Myw0Nzg4NCw0Nzg4Niw0Nzg4OCw0Nzg5MCw0Nzg5MSw0Nzg5Miw0Nzg5Myw0Nzg5NCw0Nzg5NSw0Nzg5Nyw0Nzg5OCw0Nzg5OSw0NzkwMSw0NzkwMiw0NzkwMyw0NzkwNSw0NzkwNiw0NzkwNyw0NzkwOCw0NzkwOSw0NzkxMCw0NzkxMSw0NzkxMiw0NzkxNCw0NzkxNiw0NzkxNyw0NzkxOCw0NzkxOSw0NzkyMCw0NzkyMSw0NzkyMiw0NzkyMyw0NzkyNyw0NzkyOSw0NzkzMCw0NzkzNSw0NzkzNiw0NzkzNyw0NzkzOCw0NzkzOSw0Nzk0Miw0Nzk0NCw0Nzk0Niw0Nzk0Nyw0Nzk0OCw0Nzk1MCw0Nzk1Myw0Nzk1NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0Nzk1NSw0Nzk1Nyw0Nzk1OCw0Nzk1OSw0Nzk2MSw0Nzk2Miw0Nzk2Myw0Nzk2NCw0Nzk2NSw0Nzk2Niw0Nzk2Nyw0Nzk2OCw0Nzk3MCw0Nzk3Miw0Nzk3Myw0Nzk3NCw0Nzk3NSw0Nzk3Niw0Nzk3Nyw0Nzk3OCw0Nzk3OSw0Nzk4MSw0Nzk4Miw0Nzk4Myw0Nzk4NCw0Nzk4NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0Nzk4Niw0Nzk4Nyw0Nzk4OCw0Nzk4OSw0Nzk5MCw0Nzk5MSw0Nzk5Miw0Nzk5Myw0Nzk5NCw0Nzk5NSw0Nzk5Niw0Nzk5Nyw0Nzk5OCw0Nzk5OSw0ODAwMCw0ODAwMSw0ODAwMiw0ODAwMyw0ODAwNCw0ODAwNSw0ODAwNiw0ODAwNyw0ODAwOSw0ODAxMCw0ODAxMSw0ODAxMyw0ODAxNCw0ODAxNSw0ODAxNyw0ODAxOCw0ODAxOSw0ODAyMCw0ODAyMSw0ODAyMiw0ODAyMyw0ODAyNCw0ODAyNSw0ODAyNiw0ODAyNyw0ODAyOCw0ODAyOSw0ODAzMCw0ODAzMSw0ODAzMiw0ODAzMyw0ODAzNCw0ODAzNSw0ODAzNyw0ODAzOCw0ODAzOSw0ODA0MSw0ODA0Miw0ODA0Myw0ODA0NSw0ODA0Niw0ODA0Nyw0ODA0OCw0ODA0OSw0ODA1MCw0ODA1MSw0ODA1Myw0ODA1NCw0ODA1Niw0ODA1Nyw0ODA1OCw0ODA1OSw0ODA2MCw0ODA2MSw0ODA2Miw0ODA2Myw0ODA2NSw0ODA2Niw0ODA2Nyw0ODA2OSw0ODA3MCw0ODA3MSw0ODA3Myw0ODA3NCw0ODA3NSw0ODA3Niw0ODA3Nyw0ODA3OCw0ODA3OSw0ODA4MSw0ODA4Miw0ODA4NCw0ODA4NSw0ODA4Niw0ODA4Nyw0ODA4OCw0ODA4OSw0ODA5MCw0ODA5MSw0ODA5Miw0ODA5Myw0ODA5NCw0ODA5NSw0ODA5Niw0ODA5Nyw0ODA5OCw0ODA5OSw0ODEwMCw0ODEwMSw0ODEwMiw0ODEwMyw0ODEwNCw0ODEwNSw0ODEwNiw0ODEwNyw0ODEwOCw0ODEwOSw0ODExMCw0ODExMSw0ODExMiw0ODExMyw0ODExNCw0ODExNSw0ODExNiw0ODExNyw0ODExOCw0ODExOSw0ODEyMiw0ODEyMyw0ODEyNSw0ODEyNiw0ODEyOSw0ODEzMSw0ODEzMiw0ODEzMyw0ODEzNCw0ODEzNSw0ODEzOCw0ODE0Miw0ODE0NCw0ODE0Niw0ODE0Nyw0ODE1Myw0ODE1NCw0ODE2MCw0ODE2MSw0ODE2Miw0ODE2Myw0ODE2Niw0ODE2OCw0ODE3MCw0ODE3MSw0ODE3Miw0ODE3NCw0ODE3NSw0ODE3OCw0ODE3OSw0ODE4MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODE4Miw0ODE4Myw0ODE4NSw0ODE4Niw0ODE4Nyw0ODE4OCw0ODE4OSw0ODE5MCw0ODE5MSw0ODE5NCw0ODE5OCw0ODE5OSw0ODIwMCw0ODIwMiw0ODIwMyw0ODIwNiw0ODIwNyw0ODIwOSw0ODIxMCw0ODIxMSw0ODIxMiw0ODIxMyw0ODIxNCw0ODIxNSw0ODIxNiw0ODIxNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODIxOCw0ODIxOSw0ODIyMCw0ODIyMiw0ODIyMyw0ODIyNCw0ODIyNSw0ODIyNiw0ODIyNyw0ODIyOCw0ODIyOSw0ODIzMCw0ODIzMSw0ODIzMiw0ODIzMyw0ODIzNCw0ODIzNSw0ODIzNiw0ODIzNyw0ODIzOCw0ODIzOSw0ODI0MCw0ODI0MSw0ODI0Miw0ODI0Myw0ODI0NCw0ODI0NSw0ODI0Niw0ODI0Nyw0ODI0OCw0ODI0OSw0ODI1MCw0ODI1MSw0ODI1Miw0ODI1Myw0ODI1NCw0ODI1NSw0ODI1Niw0ODI1Nyw0ODI1OCw0ODI1OSw0ODI2Miw0ODI2Myw0ODI2NSw0ODI2Niw0ODI2OSw0ODI3MSw0ODI3Miw0ODI3Myw0ODI3NCw0ODI3NSw0ODI3OCw0ODI4MCw0ODI4Myw0ODI4NCw0ODI4NSw0ODI4Niw0ODI4Nyw0ODI5MCw0ODI5MSw0ODI5Myw0ODI5NCw0ODI5Nyw0ODI5OCw0ODI5OSw0ODMwMCw0ODMwMSw0ODMwMiw0ODMwMyw0ODMwNiw0ODMxMCw0ODMxMSw0ODMxMiw0ODMxMyw0ODMxNCw0ODMxNSw0ODMxOCw0ODMxOSw0ODMyMSw0ODMyMiw0ODMyMyw0ODMyNSw0ODMyNiw0ODMyNyw0ODMyOCw0ODMyOSw0ODMzMCw0ODMzMSw0ODMzMiw0ODMzNCw0ODMzOCw0ODMzOSw0ODM0MCw0ODM0Miw0ODM0Myw0ODM0NSw0ODM0Niw0ODM0Nyw0ODM0OSw0ODM1MCw0ODM1MSw0ODM1Miw0ODM1Myw0ODM1NCw0ODM1NSw0ODM1Niw0ODM1Nyw0ODM1OCw0ODM1OSw0ODM2MCw0ODM2MSw0ODM2Miw0ODM2Myw0ODM2NCw0ODM2NSw0ODM2Niw0ODM2Nyw0ODM2OCw0ODM2OSw0ODM3MCw0ODM3MSw0ODM3NSw0ODM3Nyw0ODM3OCw0ODM3OSw0ODM4MSw0ODM4Miw0ODM4Myw0ODM4NCw0ODM4NSw0ODM4Niw0ODM4Nyw0ODM5MCw0ODM5Miw0ODM5NCw0ODM5NSw0ODM5Niw0ODM5Nyw0ODM5OCw0ODM5OSw0ODQwMSw0ODQwMiw0ODQwMyw0ODQwNSw0ODQwNiw0ODQwNyw0ODQwOCw0ODQwOSw0ODQxMCw0ODQxMSw0ODQxMiw0ODQxMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODQxNCw0ODQxNSw0ODQxNiw0ODQxNyw0ODQxOCw0ODQxOSw0ODQyMSw0ODQyMiw0ODQyMyw0ODQyNCw0ODQyNSw0ODQyNiw0ODQyNyw0ODQyOSw0ODQzMCw0ODQzMSw0ODQzMiw0ODQzMyw0ODQzNCw0ODQzNSw0ODQzNiw0ODQzNyw0ODQzOCw0ODQzOSw0ODQ0MCw0ODQ0MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODQ0Miw0ODQ0Myw0ODQ0NCw0ODQ0NSw0ODQ0Niw0ODQ0Nyw0ODQ0OSw0ODQ1MCw0ODQ1MSw0ODQ1Miw0ODQ1Myw0ODQ1NCw0ODQ1NSw0ODQ1OCw0ODQ1OSw0ODQ2MSw0ODQ2Miw0ODQ2Myw0ODQ2NSw0ODQ2Niw0ODQ2Nyw0ODQ2OCw0ODQ2OSw0ODQ3MCw0ODQ3MSw0ODQ3NCw0ODQ3NSw0ODQ3Niw0ODQ3Nyw0ODQ3OCw0ODQ3OSw0ODQ4MCw0ODQ4MSw0ODQ4Miw0ODQ4Myw0ODQ4NSw0ODQ4Niw0ODQ4Nyw0ODQ4OSw0ODQ5MCw0ODQ5MSw0ODQ5Miw0ODQ5Myw0ODQ5NCw0ODQ5NSw0ODQ5Niw0ODQ5Nyw0ODQ5OCw0ODQ5OSw0ODUwMCw0ODUwMSw0ODUwMiw0ODUwMyw0ODUwNCw0ODUwNSw0ODUwNiw0ODUwNyw0ODUwOCw0ODUwOSw0ODUxMCw0ODUxMSw0ODUxNCw0ODUxNSw0ODUxNyw0ODUxOCw0ODUyMyw0ODUyNCw0ODUyNSw0ODUyNiw0ODUyNyw0ODUzMCw0ODUzMiw0ODUzNCw0ODUzNSw0ODUzNiw0ODUzOSw0ODU0MSw0ODU0Miw0ODU0Myw0ODU0NCw0ODU0NSw0ODU0Niw0ODU0Nyw0ODU0OSw0ODU1MCw0ODU1MSw0ODU1Miw0ODU1Myw0ODU1NCw0ODU1NSw0ODU1Niw0ODU1Nyw0ODU1OCw0ODU1OSw0ODU2MSw0ODU2Miw0ODU2Myw0ODU2NCw0ODU2NSw0ODU2Niw0ODU2Nyw0ODU2OSw0ODU3MCw0ODU3MSw0ODU3Miw0ODU3Myw0ODU3NCw0ODU3NSw0ODU3Niw0ODU3Nyw0ODU3OCw0ODU3OSw0ODU4MCw0ODU4MSw0ODU4Miw0ODU4Myw0ODU4NCw0ODU4NSw0ODU4Niw0ODU4Nyw0ODU4OCw0ODU4OSw0ODU5MCw0ODU5MSw0ODU5Miw0ODU5Myw0ODU5NCw0ODU5NSw0ODU5OCw0ODU5OSw0ODYwMSw0ODYwMiw0ODYwMyw0ODYwNSw0ODYwNiw0ODYwNyw0ODYwOCw0ODYwOSw0ODYxMCw0ODYxMSw0ODYxMiw0ODYxMyw0ODYxNCw0ODYxNSw0ODYxNiw0ODYxOCw0ODYxOSw0ODYyMCw0ODYyMSw0ODYyMiw0ODYyMyw0ODYyNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODYyNiw0ODYyNyw0ODYyOSw0ODYzMCw0ODYzMSw0ODYzMyw0ODYzNCw0ODYzNSw0ODYzNiw0ODYzNyw0ODYzOCw0ODYzOSw0ODY0MSw0ODY0Miw0ODY0NCw0ODY0Niw0ODY0Nyw0ODY0OCw0ODY0OSw0ODY1MCw0ODY1MSw0ODY1NCw0ODY1NSw0ODY1Nyw0ODY1OCw0ODY1OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODY2MSw0ODY2Miw0ODY2Myw0ODY2NCw0ODY2NSw0ODY2Niw0ODY2Nyw0ODY3MCw0ODY3Miw0ODY3Myw0ODY3NCw0ODY3NSw0ODY3Niw0ODY3Nyw0ODY3OCw0ODY3OSw0ODY4MCw0ODY4MSw0ODY4Miw0ODY4Myw0ODY4NCw0ODY4NSw0ODY4Niw0ODY4Nyw0ODY4OCw0ODY4OSw0ODY5MCw0ODY5MSw0ODY5Miw0ODY5Myw0ODY5NCw0ODY5NSw0ODY5Niw0ODY5Nyw0ODY5OCw0ODY5OSw0ODcwMCw0ODcwMSw0ODcwMiw0ODcwMyw0ODcwNCw0ODcwNSw0ODcwNiw0ODcwNyw0ODcxMCw0ODcxMSw0ODcxMyw0ODcxNCw0ODcxNSw0ODcxNyw0ODcxOSw0ODcyMCw0ODcyMSw0ODcyMiw0ODcyMyw0ODcyNiw0ODcyOCw0ODczMiw0ODczMyw0ODczNCw0ODczNSw0ODczOCw0ODczOSw0ODc0MSw0ODc0Miw0ODc0Myw0ODc0NSw0ODc0Nyw0ODc0OCw0ODc0OSw0ODc1MCw0ODc1MSw0ODc1NCw0ODc1OCw0ODc1OSw0ODc2MCw0ODc2MSw0ODc2Miw0ODc2Niw0ODc2Nyw0ODc2OSw0ODc3MCw0ODc3MSw0ODc3Myw0ODc3NCw0ODc3NSw0ODc3Niw0ODc3Nyw0ODc3OCw0ODc3OSw0ODc4Miw0ODc4Niw0ODc4Nyw0ODc4OCw0ODc4OSw0ODc5MCw0ODc5MSw0ODc5NCw0ODc5NSw0ODc5Niw0ODc5Nyw0ODc5OCw0ODc5OSw0ODgwMCw0ODgwMSw0ODgwMiw0ODgwMyw0ODgwNCw0ODgwNSw0ODgwNiw0ODgwNyw0ODgwOSw0ODgxMCw0ODgxMSw0ODgxMiw0ODgxMyw0ODgxNCw0ODgxNSw0ODgxNiw0ODgxNyw0ODgxOCw0ODgxOSw0ODgyMCw0ODgyMSw0ODgyMiw0ODgyMyw0ODgyNCw0ODgyNSw0ODgyNiw0ODgyNyw0ODgyOCw0ODgyOSw0ODgzMCw0ODgzMSw0ODgzMiw0ODgzMyw0ODgzNCw0ODgzNSw0ODgzNiw0ODgzNyw0ODgzOCw0ODgzOSw0ODg0MCw0ODg0MSw0ODg0Miw0ODg0Myw0ODg0NCw0ODg0NSw0ODg0Niw0ODg0Nyw0ODg1MCw0ODg1MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODg1Myw0ODg1NCw0ODg1Nyw0ODg1OCw0ODg1OSw0ODg2MCw0ODg2MSw0ODg2Miw0ODg2Myw0ODg2NSw0ODg2Niw0ODg3MCw0ODg3MSw0ODg3Miw0ODg3Myw0ODg3NCw0ODg3NSw0ODg3Nyw0ODg3OCw0ODg3OSw0ODg4MCw0ODg4MSw0ODg4Miw0ODg4Myw0ODg4NCw0ODg4NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0ODg4Niw0ODg4Nyw0ODg4OCw0ODg4OSw0ODg5MCw0ODg5MSw0ODg5Miw0ODg5Myw0ODg5NCw0ODg5NSw0ODg5Niw0ODg5OCw0ODg5OSw0ODkwMCw0ODkwMSw0ODkwMiw0ODkwMyw0ODkwNiw0ODkwNyw0ODkwOCw0ODkwOSw0ODkxMCw0ODkxMSw0ODkxMiw0ODkxMyw0ODkxNCw0ODkxNSw0ODkxNiw0ODkxNyw0ODkxOCw0ODkxOSw0ODkyMiw0ODkyNiw0ODkyNyw0ODkyOCw0ODkyOSw0ODkzMCw0ODkzMSw0ODkzMiw0ODkzMyw0ODkzNCw0ODkzNSw0ODkzNiw0ODkzNyw0ODkzOCw0ODkzOSw0ODk0MCw0ODk0MSw0ODk0Miw0ODk0Myw0ODk0NCw0ODk0NSw0ODk0Niw0ODk0Nyw0ODk0OCw0ODk0OSw0ODk1MCw0ODk1MSw0ODk1Miw0ODk1Myw0ODk1NCw0ODk1NSw0ODk1Niw0ODk1Nyw0ODk1OCw0ODk1OSw0ODk2Miw0ODk2Myw0ODk2NSw0ODk2Niw0ODk2Nyw0ODk2OSw0ODk3MCw0ODk3MSw0ODk3Miw0ODk3Myw0ODk3NCw0ODk3NSw0ODk3OCw0ODk3OSw0ODk4MCw0ODk4Miw0ODk4Myw0ODk4NCw0ODk4NSw0ODk4Niw0ODk4Nyw0ODk4OCw0ODk4OSw0ODk5MCw0ODk5MSw0ODk5Miw0ODk5Myw0ODk5NCw0ODk5NSw0ODk5Niw0ODk5Nyw0ODk5OCw0ODk5OSw0OTAwMCw0OTAwMSw0OTAwMiw0OTAwMyw0OTAwNCw0OTAwNSw0OTAwNiw0OTAwNyw0OTAwOCw0OTAwOSw0OTAxMCw0OTAxMSw0OTAxMiw0OTAxMyw0OTAxNCw0OTAxNSw0OTAxNiw0OTAxNyw0OTAxOCw0OTAxOSw0OTAyMCw0OTAyMSw0OTAyMiw0OTAyMyw0OTAyNCw0OTAyNSw0OTAyNiw0OTAyNyw0OTAyOCw0OTAyOSw0OTAzMCw0OTAzMSw0OTAzMiw0OTAzMyw0OTAzNCw0OTAzNSw0OTAzNiw0OTAzNyw0OTAzOCw0OTAzOSw0OTA0MCw0OTA0MSw0OTA0Miw0OTA0Myw0OTA0NSw0OTA0Niw0OTA0Nyw0OTA0OCw0OTA0OSw0OTA1MCw0OTA1MSw0OTA1Miw0OTA1MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTA1NCw0OTA1NSw0OTA1Niw0OTA1Nyw0OTA1OCw0OTA1OSw0OTA2MCw0OTA2MSw0OTA2Miw0OTA2Myw0OTA2NCw0OTA2NSw0OTA2Niw0OTA2Nyw0OTA2OCw0OTA2OSw0OTA3MCw0OTA3MSw0OTA3Myw0OTA3NCw0OTA3NSw0OTA3Niw0OTA3Nyw0OTA3OCw0OTA3OSw0OTA4MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTA4MSw0OTA4Miw0OTA4Myw0OTA4NCw0OTA4NSw0OTA4Niw0OTA4Nyw0OTA4OCw0OTA4OSw0OTA5MCw0OTA5MSw0OTA5Miw0OTA5NCw0OTA5NSw0OTA5Niw0OTA5Nyw0OTA5OCw0OTA5OSw0OTEwMiw0OTEwMyw0OTEwNSw0OTEwNiw0OTEwNyw0OTEwOSw0OTExMCw0OTExMSw0OTExMiw0OTExMyw0OTExNCw0OTExNSw0OTExNyw0OTExOCw0OTEyMCw0OTEyMiw0OTEyMyw0OTEyNCw0OTEyNSw0OTEyNiw0OTEyNyw0OTEyOCw0OTEyOSw0OTEzMCw0OTEzMSw0OTEzMiw0OTEzMyw0OTEzNCw0OTEzNSw0OTEzNiw0OTEzNyw0OTEzOCw0OTEzOSw0OTE0MCw0OTE0MSw0OTE0Miw0OTE0Myw0OTE0NCw0OTE0NSw0OTE0Niw0OTE0Nyw0OTE0OCw0OTE0OSw0OTE1MCw0OTE1MSw0OTE1Miw0OTE1Myw0OTE1NCw0OTE1NSw0OTE1Niw0OTE1Nyw0OTE1OCw0OTE1OSw0OTE2MCw0OTE2MSw0OTE2Miw0OTE2Myw0OTE2NCw0OTE2NSw0OTE2Niw0OTE2Nyw0OTE2OCw0OTE2OSw0OTE3MCw0OTE3MSw0OTE3Miw0OTE3Myw0OTE3NCw0OTE3NSw0OTE3Niw0OTE3Nyw0OTE3OCw0OTE3OSw0OTE4MCw0OTE4MSw0OTE4Miw0OTE4Myw0OTE4NCw0OTE4NSw0OTE4Niw0OTE4Nyw0OTE4OCw0OTE4OSw0OTE5MCw0OTE5MSw0OTE5Miw0OTE5Myw0OTE5NCw0OTE5NSw0OTE5Niw0OTE5Nyw0OTE5OCw0OTE5OSw0OTIwMCw0OTIwMSw0OTIwMiw0OTIwMyw0OTIwNCw0OTIwNSw0OTIwNiw0OTIwNyw0OTIwOCw0OTIwOSw0OTIxMCw0OTIxMSw0OTIxMyw0OTIxNCw0OTIxNSw0OTIxNiw0OTIxNyw0OTIxOCw0OTIxOSw0OTIyMCw0OTIyMSw0OTIyMiw0OTIyMyw0OTIyNCw0OTIyNSw0OTIyNiw0OTIyNyw0OTIyOCw0OTIyOSw0OTIzMCw0OTIzMSw0OTIzMiw0OTIzNCw0OTIzNSw0OTIzNiw0OTIzNyw0OTIzOCw0OTIzOSw0OTI0MSw0OTI0Miw0OTI0MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTI0NSw0OTI0Niw0OTI0Nyw0OTI0OSw0OTI1MCw0OTI1MSw0OTI1Miw0OTI1Myw0OTI1NCw0OTI1NSw0OTI1OCw0OTI1OSw0OTI2MCw0OTI2MSw0OTI2Miw0OTI2Myw0OTI2NCw0OTI2NSw0OTI2Niw0OTI2Nyw0OTI2OCw0OTI2OSw0OTI3MCw0OTI3MSw0OTI3Miw0OTI3MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTI3NCw0OTI3NSw0OTI3Niw0OTI3Nyw0OTI3OCw0OTI3OSw0OTI4MCw0OTI4MSw0OTI4Miw0OTI4Myw0OTI4NCw0OTI4NSw0OTI4Niw0OTI4Nyw0OTI4OCw0OTI4OSw0OTI5MCw0OTI5MSw0OTI5Miw0OTI5Myw0OTI5NCw0OTI5NSw0OTI5OCw0OTI5OSw0OTMwMSw0OTMwMiw0OTMwMyw0OTMwNSw0OTMwNiw0OTMwNyw0OTMwOCw0OTMwOSw0OTMxMCw0OTMxMSw0OTMxNCw0OTMxNiw0OTMxOCw0OTMxOSw0OTMyMCw0OTMyMSw0OTMyMiw0OTMyMyw0OTMyNiw0OTMyOSw0OTMzMCw0OTMzNSw0OTMzNiw0OTMzNyw0OTMzOCw0OTMzOSw0OTM0Miw0OTM0Niw0OTM0Nyw0OTM0OCw0OTM1MCw0OTM1MSw0OTM1NCw0OTM1NSw0OTM1Nyw0OTM1OCw0OTM1OSw0OTM2MSw0OTM2Miw0OTM2Myw0OTM2NCw0OTM2NSw0OTM2Niw0OTM2Nyw0OTM3MCw0OTM3NCw0OTM3NSw0OTM3Niw0OTM3Nyw0OTM3OCw0OTM3OSw0OTM4Miw0OTM4Myw0OTM4NSw0OTM4Niw0OTM4Nyw0OTM4OSw0OTM5MCw0OTM5MSw0OTM5Miw0OTM5Myw0OTM5NCw0OTM5NSw0OTM5OCw0OTQwMCw0OTQwMiw0OTQwMyw0OTQwNCw0OTQwNSw0OTQwNiw0OTQwNyw0OTQwOSw0OTQxMCw0OTQxMSw0OTQxMyw0OTQxNCw0OTQxNSw0OTQxNyw0OTQxOCw0OTQxOSw0OTQyMCw0OTQyMSw0OTQyMiw0OTQyMyw0OTQyNSw0OTQyNiw0OTQyNyw0OTQyOCw0OTQzMCw0OTQzMSw0OTQzMiw0OTQzMyw0OTQzNCw0OTQzNSw0OTQ0MSw0OTQ0Miw0OTQ0NSw0OTQ0OCw0OTQ0OSw0OTQ1MCw0OTQ1MSw0OTQ1NCw0OTQ1OCw0OTQ1OSw0OTQ2MCw0OTQ2MSw0OTQ2Myw0OTQ2Niw0OTQ2Nyw0OTQ2OSw0OTQ3MCw0OTQ3MSw0OTQ3Myw0OTQ3NCw0OTQ3NSw0OTQ3Niw0OTQ3Nyw0OTQ3OCw0OTQ3OSw0OTQ4Miw0OTQ4Niw0OTQ4Nyw0OTQ4OCw0OTQ4OSw0OTQ5MCw0OTQ5MSw0OTQ5NCw0OTQ5NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTQ5Nyw0OTQ5OCw0OTQ5OSw0OTUwMSw0OTUwMiw0OTUwMyw0OTUwNCw0OTUwNSw0OTUwNiw0OTUwNyw0OTUxMCw0OTUxNCw0OTUxNSw0OTUxNiw0OTUxNyw0OTUxOCw0OTUxOSw0OTUyMSw0OTUyMiw0OTUyMyw0OTUyNSw0OTUyNiw0OTUyNyw0OTUyOSw0OTUzMCw0OTUzMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTUzMiw0OTUzMyw0OTUzNCw0OTUzNSw0OTUzNiw0OTUzNyw0OTUzOCw0OTUzOSw0OTU0MCw0OTU0Miw0OTU0Myw0OTU0NCw0OTU0NSw0OTU0Niw0OTU0Nyw0OTU1MSw0OTU1Myw0OTU1NCw0OTU1NSw0OTU1Nyw0OTU1OSw0OTU2MCw0OTU2MSw0OTU2Miw0OTU2Myw0OTU2Niw0OTU2OCw0OTU3MCw0OTU3MSw0OTU3Miw0OTU3NCw0OTU3NSw0OTU3OCw0OTU3OSw0OTU4MSw0OTU4Miw0OTU4Myw0OTU4NSw0OTU4Niw0OTU4Nyw0OTU4OCw0OTU4OSw0OTU5MCw0OTU5MSw0OTU5Miw0OTU5Myw0OTU5NCw0OTU5NSw0OTU5Niw0OTU5OCw0OTU5OSw0OTYwMCw0OTYwMSw0OTYwMiw0OTYwMyw0OTYwNSw0OTYwNiw0OTYwNyw0OTYwOSw0OTYxMCw0OTYxMSw0OTYxMyw0OTYxNCw0OTYxNSw0OTYxNiw0OTYxNyw0OTYxOCw0OTYxOSw0OTYyMSw0OTYyMiw0OTYyNSw0OTYyNiw0OTYyNyw0OTYyOCw0OTYyOSw0OTYzMCw0OTYzMSw0OTYzMyw0OTYzNCw0OTYzNSw0OTYzNyw0OTYzOCw0OTYzOSw0OTY0MSw0OTY0Miw0OTY0Myw0OTY0NCw0OTY0NSw0OTY0Niw0OTY0Nyw0OTY1MCw0OTY1Miw0OTY1Myw0OTY1NCw0OTY1NSw0OTY1Niw0OTY1Nyw0OTY1OCw0OTY1OSw0OTY2Miw0OTY2Myw0OTY2NSw0OTY2Niw0OTY2Nyw0OTY2OSw0OTY3MCw0OTY3MSw0OTY3Miw0OTY3Myw0OTY3NCw0OTY3NSw0OTY3OCw0OTY4MCw0OTY4Miw0OTY4Myw0OTY4NCw0OTY4NSw0OTY4Niw0OTY4Nyw0OTY5MCw0OTY5MSw0OTY5Myw0OTY5NCw0OTY5Nyw0OTY5OCw0OTY5OSw0OTcwMCw0OTcwMSw0OTcwMiw0OTcwMyw0OTcwNiw0OTcwOCw0OTcxMCw0OTcxMiw0OTcxNSw0OTcxNyw0OTcxOCw0OTcxOSw0OTcyMCw0OTcyMSw0OTcyMiw0OTcyMyw0OTcyNCw0OTcyNSw0OTcyNiw0OTcyNyw0OTcyOCw0OTcyOSw0OTczMCw0OTczMSw0OTczMiw0OTczMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTczNCw0OTczNSw0OTczNyw0OTczOCw0OTczOSw0OTc0MCw0OTc0MSw0OTc0Miw0OTc0Myw0OTc0Niw0OTc0Nyw0OTc0OSw0OTc1MCw0OTc1MSw0OTc1Myw0OTc1NCw0OTc1NSw0OTc1Niw0OTc1Nyw0OTc1OCw0OTc1OSw0OTc2MSw0OTc2Miw0OTc2Myw0OTc2NCw0OTc2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTc2Nyw0OTc2OCw0OTc2OSw0OTc3MCw0OTc3MSw0OTc3NCw0OTc3NSw0OTc3Nyw0OTc3OCw0OTc3OSw0OTc4MSw0OTc4Miw0OTc4Myw0OTc4NCw0OTc4NSw0OTc4Niw0OTc4Nyw0OTc5MCw0OTc5Miw0OTc5NCw0OTc5NSw0OTc5Niw0OTc5Nyw0OTc5OCw0OTc5OSw0OTgwMiw0OTgwMyw0OTgwNCw0OTgwNSw0OTgwNiw0OTgwNyw0OTgwOSw0OTgxMCw0OTgxMSw0OTgxMiw0OTgxMyw0OTgxNCw0OTgxNSw0OTgxNyw0OTgxOCw0OTgyMCw0OTgyMiw0OTgyMyw0OTgyNCw0OTgyNSw0OTgyNiw0OTgyNyw0OTgzMCw0OTgzMSw0OTgzMyw0OTgzNCw0OTgzNSw0OTgzOCw0OTgzOSw0OTg0MCw0OTg0MSw0OTg0Miw0OTg0Myw0OTg0Niw0OTg0OCw0OTg1MCw0OTg1MSw0OTg1Miw0OTg1Myw0OTg1NCw0OTg1NSw0OTg1Niw0OTg1Nyw0OTg1OCw0OTg1OSw0OTg2MCw0OTg2MSw0OTg2Miw0OTg2Myw0OTg2NCw0OTg2NSw0OTg2Niw0OTg2Nyw0OTg2OCw0OTg2OSw0OTg3MCw0OTg3MSw0OTg3Miw0OTg3Myw0OTg3NCw0OTg3NSw0OTg3Niw0OTg3Nyw0OTg3OCw0OTg3OSw0OTg4MCw0OTg4MSw0OTg4Miw0OTg4Myw0OTg4Niw0OTg4Nyw0OTg4OSw0OTg5MCw0OTg5Myw0OTg5NCw0OTg5NSw0OTg5Niw0OTg5Nyw0OTg5OCw0OTkwMiw0OTkwNCw0OTkwNiw0OTkwNyw0OTkwOCw0OTkwOSw0OTkxMSw0OTkxNCw0OTkxNyw0OTkxOCw0OTkxOSw0OTkyMSw0OTkyMiw0OTkyMyw0OTkyNCw0OTkyNSw0OTkyNiw0OTkyNyw0OTkzMCw0OTkzMSw0OTkzNCw0OTkzNSw0OTkzNiw0OTkzNyw0OTkzOCw0OTk0Miw0OTk0Myw0OTk0NSw0OTk0Niw0OTk0Nyw0OTk0OSw0OTk1MCw0OTk1MSw0OTk1Miw0OTk1Myw0OTk1NCw0OTk1NSw0OTk1OCw0OTk1OSw0OTk2Miw0OTk2Myw0OTk2NCw0OTk2NSw0OTk2Niw0OTk2Nyw0OTk2OCw0OTk2OSw0OTk3MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTk3MSw0OTk3Miw0OTk3Myw0OTk3NCw0OTk3NSw0OTk3Niw0OTk3Nyw0OTk3OCw0OTk3OSw0OTk4MCw0OTk4MSw0OTk4Miw0OTk4Myw0OTk4NCw0OTk4NSw0OTk4Niw0OTk4Nyw0OTk4OCw0OTk5MCw0OTk5MSw0OTk5Miw0OTk5Myw0OTk5NCw0OTk5NSw0OTk5Niw0OTk5NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw0OTk5OCw0OTk5OSw1MDAwMCw1MDAwMSw1MDAwMiw1MDAwMyw1MDAwNCw1MDAwNSw1MDAwNiw1MDAwNyw1MDAwOCw1MDAwOSw1MDAxMCw1MDAxMSw1MDAxMiw1MDAxMyw1MDAxNCw1MDAxNSw1MDAxNiw1MDAxNyw1MDAxOCw1MDAxOSw1MDAyMCw1MDAyMSw1MDAyMiw1MDAyMyw1MDAyNiw1MDAyNyw1MDAyOSw1MDAzMCw1MDAzMSw1MDAzMyw1MDAzNSw1MDAzNiw1MDAzNyw1MDAzOCw1MDAzOSw1MDA0Miw1MDA0Myw1MDA0Niw1MDA0Nyw1MDA0OCw1MDA0OSw1MDA1MCw1MDA1MSw1MDA1Myw1MDA1NCw1MDA1NSw1MDA1Nyw1MDA1OCw1MDA1OSw1MDA2MSw1MDA2Miw1MDA2Myw1MDA2NCw1MDA2NSw1MDA2Niw1MDA2Nyw1MDA2OCw1MDA2OSw1MDA3MCw1MDA3MSw1MDA3Miw1MDA3Myw1MDA3NCw1MDA3NSw1MDA3Niw1MDA3Nyw1MDA3OCw1MDA3OSw1MDA4MCw1MDA4MSw1MDA4Miw1MDA4Myw1MDA4NCw1MDA4NSw1MDA4Niw1MDA4Nyw1MDA4OCw1MDA4OSw1MDA5MCw1MDA5MSw1MDA5Miw1MDA5Myw1MDA5NCw1MDA5NSw1MDA5Niw1MDA5Nyw1MDA5OCw1MDA5OSw1MDEwMCw1MDEwMSw1MDEwMiw1MDEwMyw1MDEwNCw1MDEwNSw1MDEwNiw1MDEwNyw1MDEwOCw1MDEwOSw1MDExMCw1MDExMSw1MDExMyw1MDExNCw1MDExNSw1MDExNiw1MDExNyw1MDExOCw1MDExOSw1MDEyMCw1MDEyMSw1MDEyMiw1MDEyMyw1MDEyNCw1MDEyNSw1MDEyNiw1MDEyNyw1MDEyOCw1MDEyOSw1MDEzMCw1MDEzMSw1MDEzMiw1MDEzMyw1MDEzNCw1MDEzNSw1MDEzOCw1MDEzOSw1MDE0MSw1MDE0Miw1MDE0NSw1MDE0Nyw1MDE0OCw1MDE0OSw1MDE1MCw1MDE1MSw1MDE1NCw1MDE1NSw1MDE1Niw1MDE1OCw1MDE1OSw1MDE2MCw1MDE2MSw1MDE2Miw1MDE2Myw1MDE2Niw1MDE2Nyw1MDE2OSw1MDE3MCw1MDE3MSw1MDE3Miw1MDE3Myw1MDE3NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDE3NSw1MDE3Niw1MDE3Nyw1MDE3OCw1MDE3OSw1MDE4MCw1MDE4MSw1MDE4Miw1MDE4Myw1MDE4NSw1MDE4Niw1MDE4Nyw1MDE4OCw1MDE4OSw1MDE5MCw1MDE5MSw1MDE5Myw1MDE5NCw1MDE5NSw1MDE5Niw1MDE5Nyw1MDE5OCw1MDE5OSw1MDIwMCw1MDIwMSw1MDIwMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDIwMyw1MDIwNCw1MDIwNSw1MDIwNiw1MDIwNyw1MDIwOCw1MDIwOSw1MDIxMCw1MDIxMSw1MDIxMyw1MDIxNCw1MDIxNSw1MDIxNiw1MDIxNyw1MDIxOCw1MDIxOSw1MDIyMSw1MDIyMiw1MDIyMyw1MDIyNSw1MDIyNiw1MDIyNyw1MDIyOSw1MDIzMCw1MDIzMSw1MDIzMiw1MDIzMyw1MDIzNCw1MDIzNSw1MDIzOCw1MDIzOSw1MDI0MCw1MDI0MSw1MDI0Miw1MDI0Myw1MDI0NCw1MDI0NSw1MDI0Niw1MDI0Nyw1MDI0OSw1MDI1MCw1MDI1MSw1MDI1Miw1MDI1Myw1MDI1NCw1MDI1NSw1MDI1Niw1MDI1Nyw1MDI1OCw1MDI1OSw1MDI2MCw1MDI2MSw1MDI2Miw1MDI2Myw1MDI2NCw1MDI2NSw1MDI2Niw1MDI2Nyw1MDI2OCw1MDI2OSw1MDI3MCw1MDI3MSw1MDI3Miw1MDI3Myw1MDI3NCw1MDI3NSw1MDI3OCw1MDI3OSw1MDI4MSw1MDI4Miw1MDI4Myw1MDI4NSw1MDI4Niw1MDI4Nyw1MDI4OCw1MDI4OSw1MDI5MCw1MDI5MSw1MDI5NCw1MDI5NSw1MDI5Niw1MDI5OCw1MDI5OSw1MDMwMCw1MDMwMSw1MDMwMiw1MDMwMyw1MDMwNSw1MDMwNiw1MDMwNyw1MDMwOCw1MDMwOSw1MDMxMCw1MDMxMSw1MDMxMiw1MDMxMyw1MDMxNCw1MDMxNSw1MDMxNiw1MDMxNyw1MDMxOCw1MDMxOSw1MDMyMCw1MDMyMSw1MDMyMiw1MDMyMyw1MDMyNSw1MDMyNiw1MDMyNyw1MDMyOCw1MDMyOSw1MDMzMCw1MDMzMSw1MDMzMyw1MDMzNCw1MDMzNSw1MDMzNiw1MDMzNyw1MDMzOCw1MDMzOSw1MDM0MCw1MDM0MSw1MDM0Miw1MDM0Myw1MDM0NCw1MDM0NSw1MDM0Niw1MDM0Nyw1MDM0OCw1MDM0OSw1MDM1MCw1MDM1MSw1MDM1Miw1MDM1Myw1MDM1NCw1MDM1NSw1MDM1Niw1MDM1Nyw1MDM1OCw1MDM1OSw1MDM2MSw1MDM2Miw1MDM2Myw1MDM2NSw1MDM2Niw1MDM2Nyw1MDM2OCw1MDM2OSw1MDM3MCw1MDM3MSw1MDM3Miw1MDM3MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDM3NCw1MDM3NSw1MDM3Niw1MDM3Nyw1MDM3OCw1MDM3OSw1MDM4MCw1MDM4MSw1MDM4Miw1MDM4Myw1MDM4NCw1MDM4NSw1MDM4Niw1MDM4Nyw1MDM4OCw1MDM4OSw1MDM5MCw1MDM5MSw1MDM5Miw1MDM5Myw1MDM5NCw1MDM5NSw1MDM5Niw1MDM5Nyw1MDM5OCw1MDM5OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDQwMCw1MDQwMSw1MDQwMiw1MDQwMyw1MDQwNCw1MDQwNSw1MDQwNiw1MDQwNyw1MDQwOCw1MDQxMCw1MDQxMSw1MDQxMiw1MDQxMyw1MDQxNCw1MDQxNSw1MDQxOCw1MDQxOSw1MDQyMSw1MDQyMiw1MDQyMyw1MDQyNSw1MDQyNyw1MDQyOCw1MDQyOSw1MDQzMCw1MDQzNCw1MDQzNSw1MDQzNiw1MDQzNyw1MDQzOCw1MDQzOSw1MDQ0MCw1MDQ0MSw1MDQ0Miw1MDQ0Myw1MDQ0NSw1MDQ0Niw1MDQ0Nyw1MDQ0OSw1MDQ1MCw1MDQ1MSw1MDQ1Myw1MDQ1NCw1MDQ1NSw1MDQ1Niw1MDQ1Nyw1MDQ1OCw1MDQ1OSw1MDQ2MSw1MDQ2Miw1MDQ2Myw1MDQ2NCw1MDQ2NSw1MDQ2Niw1MDQ2Nyw1MDQ2OCw1MDQ2OSw1MDQ3MCw1MDQ3MSw1MDQ3NCw1MDQ3NSw1MDQ3Nyw1MDQ3OCw1MDQ3OSw1MDQ4MSw1MDQ4Miw1MDQ4Myw1MDQ4NCw1MDQ4NSw1MDQ4Niw1MDQ4Nyw1MDQ5MCw1MDQ5Miw1MDQ5NCw1MDQ5NSw1MDQ5Niw1MDQ5Nyw1MDQ5OCw1MDQ5OSw1MDUwMiw1MDUwMyw1MDUwNyw1MDUxMSw1MDUxMiw1MDUxMyw1MDUxNCw1MDUxOCw1MDUyMiw1MDUyMyw1MDUyNCw1MDUyNyw1MDUzMCw1MDUzMSw1MDUzMyw1MDUzNCw1MDUzNSw1MDUzNyw1MDUzOCw1MDUzOSw1MDU0MCw1MDU0MSw1MDU0Miw1MDU0Myw1MDU0Niw1MDU1MCw1MDU1MSw1MDU1Miw1MDU1Myw1MDU1NCw1MDU1NSw1MDU1OCw1MDU1OSw1MDU2MSw1MDU2Miw1MDU2Myw1MDU2NSw1MDU2Niw1MDU2OCw1MDU2OSw1MDU3MCw1MDU3MSw1MDU3NCw1MDU3Niw1MDU3OCw1MDU3OSw1MDU4MCw1MDU4Miw1MDU4NSw1MDU4Niw1MDU4Nyw1MDU4OSw1MDU5MCw1MDU5MSw1MDU5Myw1MDU5NCw1MDU5NSw1MDU5Niw1MDU5Nyw1MDU5OCw1MDU5OSw1MDYwMCw1MDYwMiw1MDYwMyw1MDYwNCw1MDYwNSw1MDYwNiw1MDYwNyw1MDYwOCw1MDYwOSw1MDYxMCw1MDYxMSw1MDYxNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDYxNSw1MDYxOCw1MDYyMyw1MDYyNCw1MDYyNSw1MDYyNiw1MDYyNyw1MDYzNSw1MDYzNyw1MDYzOSw1MDY0Miw1MDY0Myw1MDY0NSw1MDY0Niw1MDY0Nyw1MDY0OSw1MDY1MCw1MDY1MSw1MDY1Miw1MDY1Myw1MDY1NCw1MDY1NSw1MDY1OCw1MDY2MCw1MDY2Miw1MDY2MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDY2NCw1MDY2NSw1MDY2Niw1MDY2Nyw1MDY3MSw1MDY3Myw1MDY3NCw1MDY3NSw1MDY3Nyw1MDY4MCw1MDY4MSw1MDY4Miw1MDY4Myw1MDY5MCw1MDY5MSw1MDY5Miw1MDY5Nyw1MDY5OCw1MDY5OSw1MDcwMSw1MDcwMiw1MDcwMyw1MDcwNSw1MDcwNiw1MDcwNyw1MDcwOCw1MDcwOSw1MDcxMCw1MDcxMSw1MDcxNCw1MDcxNyw1MDcxOCw1MDcxOSw1MDcyMCw1MDcyMSw1MDcyMiw1MDcyMyw1MDcyNiw1MDcyNyw1MDcyOSw1MDczMCw1MDczMSw1MDczNSw1MDczNyw1MDczOCw1MDc0Miw1MDc0NCw1MDc0Niw1MDc0OCw1MDc0OSw1MDc1MCw1MDc1MSw1MDc1NCw1MDc1NSw1MDc1Nyw1MDc1OCw1MDc1OSw1MDc2MSw1MDc2Miw1MDc2Myw1MDc2NCw1MDc2NSw1MDc2Niw1MDc2Nyw1MDc3MCw1MDc3NCw1MDc3NSw1MDc3Niw1MDc3Nyw1MDc3OCw1MDc3OSw1MDc4Miw1MDc4Myw1MDc4NSw1MDc4Niw1MDc4Nyw1MDc4OCw1MDc4OSw1MDc5MCw1MDc5MSw1MDc5Miw1MDc5Myw1MDc5NCw1MDc5NSw1MDc5Nyw1MDc5OCw1MDgwMCw1MDgwMiw1MDgwMyw1MDgwNCw1MDgwNSw1MDgwNiw1MDgwNyw1MDgxMCw1MDgxMSw1MDgxMyw1MDgxNCw1MDgxNSw1MDgxNyw1MDgxOCw1MDgxOSw1MDgyMCw1MDgyMSw1MDgyMiw1MDgyMyw1MDgyNiw1MDgyOCw1MDgzMCw1MDgzMSw1MDgzMiw1MDgzMyw1MDgzNCw1MDgzNSw1MDgzOCw1MDgzOSw1MDg0MSw1MDg0Miw1MDg0Myw1MDg0NSw1MDg0Niw1MDg0Nyw1MDg0OCw1MDg0OSw1MDg1MCw1MDg1MSw1MDg1NCw1MDg1Niw1MDg1OCw1MDg1OSw1MDg2MCw1MDg2MSw1MDg2Miw1MDg2Myw1MDg2Niw1MDg2Nyw1MDg2OSw1MDg3MCw1MDg3MSw1MDg3NSw1MDg3Niw1MDg3Nyw1MDg3OCw1MDg3OSw1MDg4Miw1MDg4NCw1MDg4Niw1MDg4Nyw1MDg4OCw1MDg4OSw1MDg5MCw1MDg5MSw1MDg5NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDg5NSw1MDg5Nyw1MDg5OCw1MDg5OSw1MDkwMSw1MDkwMiw1MDkwMyw1MDkwNCw1MDkwNSw1MDkwNiw1MDkwNyw1MDkxMCw1MDkxMSw1MDkxNCw1MDkxNSw1MDkxNiw1MDkxNyw1MDkxOCw1MDkxOSw1MDkyMiw1MDkyMyw1MDkyNSw1MDkyNiw1MDkyNyw1MDkyOSw1MDkzMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MDkzMSw1MDkzMiw1MDkzMyw1MDkzNCw1MDkzNSw1MDkzOCw1MDkzOSw1MDk0MCw1MDk0Miw1MDk0Myw1MDk0NCw1MDk0NSw1MDk0Niw1MDk0Nyw1MDk1MCw1MDk1MSw1MDk1Myw1MDk1NCw1MDk1NSw1MDk1Nyw1MDk1OCw1MDk1OSw1MDk2MCw1MDk2MSw1MDk2Miw1MDk2Myw1MDk2Niw1MDk2OCw1MDk3MCw1MDk3MSw1MDk3Miw1MDk3Myw1MDk3NCw1MDk3NSw1MDk3OCw1MDk3OSw1MDk4MSw1MDk4Miw1MDk4Myw1MDk4NSw1MDk4Niw1MDk4Nyw1MDk4OCw1MDk4OSw1MDk5MCw1MDk5MSw1MDk5NCw1MDk5Niw1MDk5OCw1MTAwMCw1MTAwMSw1MTAwMiw1MTAwMyw1MTAwNiw1MTAwNyw1MTAwOSw1MTAxMCw1MTAxMSw1MTAxMyw1MTAxNCw1MTAxNSw1MTAxNiw1MTAxNyw1MTAxOSw1MTAyMiw1MTAyNCw1MTAzMyw1MTAzNCw1MTAzNSw1MTAzNyw1MTAzOCw1MTAzOSw1MTA0MSw1MTA0Miw1MTA0Myw1MTA0NCw1MTA0NSw1MTA0Niw1MTA0Nyw1MTA0OSw1MTA1MCw1MTA1Miw1MTA1Myw1MTA1NCw1MTA1NSw1MTA1Niw1MTA1Nyw1MTA1OCw1MTA1OSw1MTA2Miw1MTA2Myw1MTA2NSw1MTA2Niw1MTA2Nyw1MTA3MSw1MTA3Miw1MTA3Myw1MTA3NCw1MTA3OCw1MTA4Myw1MTA4NCw1MTA4NSw1MTA4Nyw1MTA5MCw1MTA5MSw1MTA5Myw1MTA5Nyw1MTA5OSw1MTEwMCw1MTEwMSw1MTEwMiw1MTEwMyw1MTEwNiw1MTExMSw1MTExMiw1MTExMyw1MTExNCw1MTExNSw1MTExOCw1MTExOSw1MTEyMSw1MTEyMiw1MTEyMyw1MTEyNSw1MTEyNiw1MTEyNyw1MTEyOCw1MTEyOSw1MTEzMCw1MTEzMSw1MTEzNCw1MTEzOCw1MTEzOSw1MTE0MCw1MTE0MSw1MTE0Miw1MTE0Myw1MTE0Niw1MTE0Nyw1MTE0OSw1MTE1MSw1MTE1Myw1MTE1NCw1MTE1NSw1MTE1Niw1MTE1Nyw1MTE1OCw1MTE1OSw1MTE2MSw1MTE2Miw1MTE2Myw1MTE2NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTE2Niw1MTE2Nyw1MTE2OCw1MTE2OSw1MTE3MCw1MTE3MSw1MTE3Myw1MTE3NCw1MTE3NSw1MTE3Nyw1MTE3OCw1MTE3OSw1MTE4MSw1MTE4Miw1MTE4Myw1MTE4NCw1MTE4NSw1MTE4Niw1MTE4Nyw1MTE4OCw1MTE4OSw1MTE5MCw1MTE5MSw1MTE5Miw1MTE5Myw1MTE5NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTE5NSw1MTE5Niw1MTE5Nyw1MTE5OCw1MTE5OSw1MTIwMiw1MTIwMyw1MTIwNSw1MTIwNiw1MTIwNyw1MTIwOSw1MTIxMSw1MTIxMiw1MTIxMyw1MTIxNCw1MTIxNSw1MTIxOCw1MTIyMCw1MTIyMyw1MTIyNCw1MTIyNSw1MTIyNiw1MTIyNyw1MTIzMCw1MTIzMSw1MTIzMyw1MTIzNCw1MTIzNSw1MTIzNyw1MTIzOCw1MTIzOSw1MTI0MCw1MTI0MSw1MTI0Miw1MTI0Myw1MTI0Niw1MTI0OCw1MTI1MCw1MTI1MSw1MTI1Miw1MTI1Myw1MTI1NCw1MTI1NSw1MTI1Nyw1MTI1OCw1MTI1OSw1MTI2MSw1MTI2Miw1MTI2Myw1MTI2NSw1MTI2Niw1MTI2Nyw1MTI2OCw1MTI2OSw1MTI3MCw1MTI3MSw1MTI3NCw1MTI3NSw1MTI3OCw1MTI3OSw1MTI4MCw1MTI4MSw1MTI4Miw1MTI4Myw1MTI4NSw1MTI4Niw1MTI4Nyw1MTI4OCw1MTI4OSw1MTI5MCw1MTI5MSw1MTI5Miw1MTI5Myw1MTI5NCw1MTI5NSw1MTI5Niw1MTI5Nyw1MTI5OCw1MTI5OSw1MTMwMCw1MTMwMSw1MTMwMiw1MTMwMyw1MTMwNCw1MTMwNSw1MTMwNiw1MTMwNyw1MTMwOCw1MTMwOSw1MTMxMCw1MTMxMSw1MTMxNCw1MTMxNSw1MTMxNyw1MTMxOCw1MTMxOSw1MTMyMSw1MTMyMyw1MTMyNCw1MTMyNSw1MTMyNiw1MTMyNyw1MTMzMCw1MTMzMiw1MTMzNiw1MTMzNyw1MTMzOCw1MTM0Miw1MTM0Myw1MTM0NCw1MTM0NSw1MTM0Niw1MTM0Nyw1MTM0OSw1MTM1MCw1MTM1MSw1MTM1Miw1MTM1Myw1MTM1NCw1MTM1NSw1MTM1Niw1MTM1OCw1MTM2MCw1MTM2Miw1MTM2Myw1MTM2NCw1MTM2NSw1MTM2Niw1MTM2Nyw1MTM2OSw1MTM3MCw1MTM3MSw1MTM3Miw1MTM3Myw1MTM3NCw1MTM3NSw1MTM3Niw1MTM3Nyw1MTM3OCw1MTM3OSw1MTM4MCw1MTM4MSw1MTM4Miw1MTM4Myw1MTM4NCw1MTM4NSw1MTM4Niw1MTM4Nyw1MTM5MCw1MTM5MSw1MTM5Miw1MTM5MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTM5NCw1MTM5NSw1MTM5Nyw1MTM5OCw1MTM5OSw1MTQwMSw1MTQwMiw1MTQwMyw1MTQwNSw1MTQwNiw1MTQwNyw1MTQwOCw1MTQwOSw1MTQxMCw1MTQxMSw1MTQxNCw1MTQxNiw1MTQxOCw1MTQxOSw1MTQyMCw1MTQyMSw1MTQyMiw1MTQyMyw1MTQyNiw1MTQyNyw1MTQyOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTQzMCw1MTQzMSw1MTQzMiw1MTQzMyw1MTQzNCw1MTQzNSw1MTQzNiw1MTQzNyw1MTQzOCw1MTQzOSw1MTQ0MCw1MTQ0MSw1MTQ0Miw1MTQ0Myw1MTQ0NCw1MTQ0Niw1MTQ0Nyw1MTQ0OCw1MTQ0OSw1MTQ1MCw1MTQ1MSw1MTQ1NCw1MTQ1NSw1MTQ1Nyw1MTQ1OCw1MTQ1OSw1MTQ2Myw1MTQ2NCw1MTQ2NSw1MTQ2Niw1MTQ2Nyw1MTQ3MCwxMjI4OCwxMjI4OSwxMjI5MCwxODMsODIyOSw4MjMwLDE2OCwxMjI5MSwxNzMsODIxMyw4NzQxLDY1MzQwLDg3NjQsODIxNiw4MjE3LDgyMjAsODIyMSwxMjMwOCwxMjMwOSwxMjI5NiwxMjI5NywxMjI5OCwxMjI5OSwxMjMwMCwxMjMwMSwxMjMwMiwxMjMwMywxMjMwNCwxMjMwNSwxNzcsMjE1LDI0Nyw4ODAwLDg4MDQsODgwNSw4NzM0LDg3NTYsMTc2LDgyNDIsODI0Myw4NDUxLDg0OTEsNjU1MDQsNjU1MDUsNjU1MDksOTc5NCw5NzkyLDg3MzYsODg2OSw4OTc4LDg3MDYsODcxMSw4ODAxLDg3ODYsMTY3LDgyNTEsOTczNCw5NzMzLDk2NzUsOTY3OSw5Njc4LDk2NzEsOTY3MCw5NjMzLDk2MzIsOTY1MSw5NjUwLDk2NjEsOTY2MCw4NTk0LDg1OTIsODU5Myw4NTk1LDg1OTYsMTIzMDcsODgxMCw4ODExLDg3MzAsODc2NSw4NzMzLDg3NTcsODc0Nyw4NzQ4LDg3MTIsODcxNSw4ODM4LDg4MzksODgzNCw4ODM1LDg3NDYsODc0NSw4NzQzLDg3NDQsNjU1MDYsNTE0NzIsNTE0NzQsNTE0NzUsNTE0NzYsNTE0NzcsNTE0NzgsNTE0NzksNTE0ODEsNTE0ODIsNTE0ODMsNTE0ODQsNTE0ODUsNTE0ODYsNTE0ODcsNTE0ODgsNTE0ODksNTE0OTAsNTE0OTEsNTE0OTIsNTE0OTMsNTE0OTQsNTE0OTUsNTE0OTYsNTE0OTcsNTE0OTgsNTE0OTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE1MDEsNTE1MDIsNTE1MDMsNTE1MDQsNTE1MDUsNTE1MDYsNTE1MDcsNTE1MDksNTE1MTAsNTE1MTEsNTE1MTIsNTE1MTMsNTE1MTQsNTE1MTUsNTE1MTYsNTE1MTcsNTE1MTgsNTE1MTksNTE1MjAsNTE1MjEsNTE1MjIsNTE1MjMsNTE1MjQsNTE1MjUsNTE1MjYsNTE1MjcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE1MjgsNTE1MjksNTE1MzAsNTE1MzEsNTE1MzIsNTE1MzMsNTE1MzQsNTE1MzUsNTE1MzgsNTE1MzksNTE1NDEsNTE1NDIsNTE1NDMsNTE1NDUsNTE1NDYsNTE1NDcsNTE1NDgsNTE1NDksNTE1NTAsNTE1NTEsNTE1NTQsNTE1NTYsNTE1NTcsNTE1NTgsNTE1NTksNTE1NjAsNTE1NjEsNTE1NjIsNTE1NjMsNTE1NjUsNTE1NjYsNTE1NjcsODY1OCw4NjYwLDg3MDQsODcwNywxODAsNjUzNzQsNzExLDcyOCw3MzMsNzMwLDcyOSwxODQsNzMxLDE2MSwxOTEsNzIwLDg3NTAsODcyMSw4NzE5LDE2NCw4NDU3LDgyNDAsOTY2NSw5NjY0LDk2NTUsOTY1NCw5ODI4LDk4MjQsOTgyNSw5ODI5LDk4MzEsOTgyNyw4ODU3LDk2NzIsOTYzNSw5NjgwLDk2ODEsOTYxOCw5NjM2LDk2MzcsOTY0MCw5NjM5LDk2MzgsOTY0MSw5ODMyLDk3NDMsOTc0Miw5NzU2LDk3NTgsMTgyLDgyMjQsODIyNSw4NTk3LDg1OTksODYwMSw4NTk4LDg2MDAsOTgzNyw5ODMzLDk4MzQsOTgzNiwxMjkyNywxMjgyOCw4NDcwLDEzMjU1LDg0ODIsMTMyNTAsMTMyNzIsODQ4MSw4MzY0LDE3NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE1NjksNTE1NzAsNTE1NzEsNTE1NzMsNTE1NzQsNTE1NzUsNTE1NzYsNTE1NzcsNTE1NzgsNTE1NzksNTE1ODEsNTE1ODIsNTE1ODMsNTE1ODQsNTE1ODUsNTE1ODYsNTE1ODcsNTE1ODgsNTE1ODksNTE1OTAsNTE1OTEsNTE1OTQsNTE1OTUsNTE1OTcsNTE1OTgsNTE1OTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE2MDEsNTE2MDIsNTE2MDMsNTE2MDQsNTE2MDUsNTE2MDYsNTE2MDcsNTE2MTAsNTE2MTIsNTE2MTQsNTE2MTUsNTE2MTYsNTE2MTcsNTE2MTgsNTE2MTksNTE2MjAsNTE2MjEsNTE2MjIsNTE2MjMsNTE2MjQsNTE2MjUsNTE2MjYsNTE2MjcsNTE2MjgsNTE2MjksNTE2MzAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE2MzEsNTE2MzIsNTE2MzMsNTE2MzQsNTE2MzUsNTE2MzYsNTE2MzcsNTE2MzgsNTE2MzksNTE2NDAsNTE2NDEsNTE2NDIsNTE2NDMsNTE2NDQsNTE2NDUsNTE2NDYsNTE2NDcsNTE2NTAsNTE2NTEsNTE2NTMsNTE2NTQsNTE2NTcsNTE2NTksNTE2NjAsNTE2NjEsNTE2NjIsNTE2NjMsNTE2NjYsNTE2NjgsNTE2NzEsNTE2NzIsNTE2NzUsNjUyODEsNjUyODIsNjUyODMsNjUyODQsNjUyODUsNjUyODYsNjUyODcsNjUyODgsNjUyODksNjUyOTAsNjUyOTEsNjUyOTIsNjUyOTMsNjUyOTQsNjUyOTUsNjUyOTYsNjUyOTcsNjUyOTgsNjUyOTksNjUzMDAsNjUzMDEsNjUzMDIsNjUzMDMsNjUzMDQsNjUzMDUsNjUzMDYsNjUzMDcsNjUzMDgsNjUzMDksNjUzMTAsNjUzMTEsNjUzMTIsNjUzMTMsNjUzMTQsNjUzMTUsNjUzMTYsNjUzMTcsNjUzMTgsNjUzMTksNjUzMjAsNjUzMjEsNjUzMjIsNjUzMjMsNjUzMjQsNjUzMjUsNjUzMjYsNjUzMjcsNjUzMjgsNjUzMjksNjUzMzAsNjUzMzEsNjUzMzIsNjUzMzMsNjUzMzQsNjUzMzUsNjUzMzYsNjUzMzcsNjUzMzgsNjUzMzksNjU1MTAsNjUzNDEsNjUzNDIsNjUzNDMsNjUzNDQsNjUzNDUsNjUzNDYsNjUzNDcsNjUzNDgsNjUzNDksNjUzNTAsNjUzNTEsNjUzNTIsNjUzNTMsNjUzNTQsNjUzNTUsNjUzNTYsNjUzNTcsNjUzNTgsNjUzNTksNjUzNjAsNjUzNjEsNjUzNjIsNjUzNjMsNjUzNjQsNjUzNjUsNjUzNjYsNjUzNjcsNjUzNjgsNjUzNjksNjUzNzAsNjUzNzEsNjUzNzIsNjUzNzMsNjU1MDcsNTE2NzgsNTE2NzksNTE2ODEsNTE2ODMsNTE2ODUsNTE2ODYsNTE2ODgsNTE2ODksNTE2OTAsNTE2OTEsNTE2OTQsNTE2OTgsNTE2OTksNTE3MDAsNTE3MDEsNTE3MDIsNTE3MDMsNTE3MDYsNTE3MDcsNTE3MDksNTE3MTAsNTE3MTEsNTE3MTMsNTE3MTQsNTE3MTUsNTE3MTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE3MTcsNTE3MTgsNTE3MTksNTE3MjIsNTE3MjYsNTE3MjcsNTE3MjgsNTE3MjksNTE3MzAsNTE3MzEsNTE3MzMsNTE3MzQsNTE3MzUsNTE3MzcsNTE3MzgsNTE3MzksNTE3NDAsNTE3NDEsNTE3NDIsNTE3NDMsNTE3NDQsNTE3NDUsNTE3NDYsNTE3NDcsNTE3NDgsNTE3NDksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE3NTAsNTE3NTEsNTE3NTIsNTE3NTQsNTE3NTUsNTE3NTYsNTE3NTcsNTE3NTgsNTE3NTksNTE3NjAsNTE3NjEsNTE3NjIsNTE3NjMsNTE3NjQsNTE3NjUsNTE3NjYsNTE3NjcsNTE3NjgsNTE3NjksNTE3NzAsNTE3NzEsNTE3NzIsNTE3NzMsNTE3NzQsNTE3NzUsNTE3NzYsNTE3NzcsNTE3NzgsNTE3NzksNTE3ODAsNTE3ODEsNTE3ODIsMTI1OTMsMTI1OTQsMTI1OTUsMTI1OTYsMTI1OTcsMTI1OTgsMTI1OTksMTI2MDAsMTI2MDEsMTI2MDIsMTI2MDMsMTI2MDQsMTI2MDUsMTI2MDYsMTI2MDcsMTI2MDgsMTI2MDksMTI2MTAsMTI2MTEsMTI2MTIsMTI2MTMsMTI2MTQsMTI2MTUsMTI2MTYsMTI2MTcsMTI2MTgsMTI2MTksMTI2MjAsMTI2MjEsMTI2MjIsMTI2MjMsMTI2MjQsMTI2MjUsMTI2MjYsMTI2MjcsMTI2MjgsMTI2MjksMTI2MzAsMTI2MzEsMTI2MzIsMTI2MzMsMTI2MzQsMTI2MzUsMTI2MzYsMTI2MzcsMTI2MzgsMTI2MzksMTI2NDAsMTI2NDEsMTI2NDIsMTI2NDMsMTI2NDQsMTI2NDUsMTI2NDYsMTI2NDcsMTI2NDgsMTI2NDksMTI2NTAsMTI2NTEsMTI2NTIsMTI2NTMsMTI2NTQsMTI2NTUsMTI2NTYsMTI2NTcsMTI2NTgsMTI2NTksMTI2NjAsMTI2NjEsMTI2NjIsMTI2NjMsMTI2NjQsMTI2NjUsMTI2NjYsMTI2NjcsMTI2NjgsMTI2NjksMTI2NzAsMTI2NzEsMTI2NzIsMTI2NzMsMTI2NzQsMTI2NzUsMTI2NzYsMTI2NzcsMTI2NzgsMTI2NzksMTI2ODAsMTI2ODEsMTI2ODIsMTI2ODMsMTI2ODQsMTI2ODUsMTI2ODYsNTE3ODMsNTE3ODQsNTE3ODUsNTE3ODYsNTE3ODcsNTE3OTAsNTE3OTEsNTE3OTMsNTE3OTQsNTE3OTUsNTE3OTcsNTE3OTgsNTE3OTksNTE4MDAsNTE4MDEsNTE4MDIsNTE4MDMsNTE4MDYsNTE4MTAsNTE4MTEsNTE4MTIsNTE4MTMsNTE4MTQsNTE4MTUsNTE4MTcsNTE4MTgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE4MTksNTE4MjAsNTE4MjEsNTE4MjIsNTE4MjMsNTE4MjQsNTE4MjUsNTE4MjYsNTE4MjcsNTE4MjgsNTE4MjksNTE4MzAsNTE4MzEsNTE4MzIsNTE4MzMsNTE4MzQsNTE4MzUsNTE4MzYsNTE4MzgsNTE4MzksNTE4NDAsNTE4NDEsNTE4NDIsNTE4NDMsNTE4NDUsNTE4NDYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE4NDcsNTE4NDgsNTE4NDksNTE4NTAsNTE4NTEsNTE4NTIsNTE4NTMsNTE4NTQsNTE4NTUsNTE4NTYsNTE4NTcsNTE4NTgsNTE4NTksNTE4NjAsNTE4NjEsNTE4NjIsNTE4NjMsNTE4NjUsNTE4NjYsNTE4NjcsNTE4NjgsNTE4NjksNTE4NzAsNTE4NzEsNTE4NzIsNTE4NzMsNTE4NzQsNTE4NzUsNTE4NzYsNTE4NzcsNTE4NzgsNTE4NzksODU2MCw4NTYxLDg1NjIsODU2Myw4NTY0LDg1NjUsODU2Niw4NTY3LDg1NjgsODU2OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsODU0NCw4NTQ1LDg1NDYsODU0Nyw4NTQ4LDg1NDksODU1MCw4NTUxLDg1NTIsODU1MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksOTMxLDkzMiw5MzMsOTM0LDkzNSw5MzYsOTM3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTg4MCw1MTg4MSw1MTg4Miw1MTg4Myw1MTg4NCw1MTg4NSw1MTg4Niw1MTg4Nyw1MTg4OCw1MTg4OSw1MTg5MCw1MTg5MSw1MTg5Miw1MTg5Myw1MTg5NCw1MTg5NSw1MTg5Niw1MTg5Nyw1MTg5OCw1MTg5OSw1MTkwMiw1MTkwMyw1MTkwNSw1MTkwNiw1MTkwNyw1MTkwOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTkxMCw1MTkxMSw1MTkxMiw1MTkxMyw1MTkxNCw1MTkxNSw1MTkxOCw1MTkyMCw1MTkyMiw1MTkyNCw1MTkyNSw1MTkyNiw1MTkyNyw1MTkzMCw1MTkzMSw1MTkzMiw1MTkzMyw1MTkzNCw1MTkzNSw1MTkzNyw1MTkzOCw1MTkzOSw1MTk0MCw1MTk0MSw1MTk0Miw1MTk0MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTk0NCw1MTk0NSw1MTk0Niw1MTk0Nyw1MTk0OSw1MTk1MCw1MTk1MSw1MTk1Miw1MTk1Myw1MTk1NCw1MTk1NSw1MTk1Nyw1MTk1OCw1MTk1OSw1MTk2MCw1MTk2MSw1MTk2Miw1MTk2Myw1MTk2NCw1MTk2NSw1MTk2Niw1MTk2Nyw1MTk2OCw1MTk2OSw1MTk3MCw1MTk3MSw1MTk3Miw1MTk3Myw1MTk3NCw1MTk3NSw1MTk3Nyw1MTk3OCw5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTYsOTQ5Miw5NTAwLDk1MTYsOTUwOCw5NTI0LDk1MzIsOTQ3Myw5NDc1LDk0ODcsOTQ5MSw5NDk5LDk0OTUsOTUwNyw5NTIzLDk1MTUsOTUzMSw5NTQ3LDk1MDQsOTUxOSw5NTEyLDk1MjcsOTUzNSw5NTAxLDk1MjAsOTUwOSw5NTI4LDk1MzgsOTQ5MCw5NDg5LDk0OTgsOTQ5Nyw5NDk0LDk0OTMsOTQ4Niw5NDg1LDk1MDIsOTUwMyw5NTA1LDk1MDYsOTUxMCw5NTExLDk1MTMsOTUxNCw5NTE3LDk1MTgsOTUyMSw5NTIyLDk1MjUsOTUyNiw5NTI5LDk1MzAsOTUzMyw5NTM0LDk1MzYsOTUzNyw5NTM5LDk1NDAsOTU0MSw5NTQyLDk1NDMsOTU0NCw5NTQ1LDk1NDYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxOTc5LDUxOTgwLDUxOTgxLDUxOTgyLDUxOTgzLDUxOTg1LDUxOTg2LDUxOTg3LDUxOTg5LDUxOTkwLDUxOTkxLDUxOTkzLDUxOTk0LDUxOTk1LDUxOTk2LDUxOTk3LDUxOTk4LDUxOTk5LDUyMDAyLDUyMDAzLDUyMDA0LDUyMDA1LDUyMDA2LDUyMDA3LDUyMDA4LDUyMDA5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMDEwLDUyMDExLDUyMDEyLDUyMDEzLDUyMDE0LDUyMDE1LDUyMDE2LDUyMDE3LDUyMDE4LDUyMDE5LDUyMDIwLDUyMDIxLDUyMDIyLDUyMDIzLDUyMDI0LDUyMDI1LDUyMDI2LDUyMDI3LDUyMDI4LDUyMDI5LDUyMDMwLDUyMDMxLDUyMDMyLDUyMDM0LDUyMDM1LDUyMDM2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMDM3LDUyMDM4LDUyMDM5LDUyMDQyLDUyMDQzLDUyMDQ1LDUyMDQ2LDUyMDQ3LDUyMDQ5LDUyMDUwLDUyMDUxLDUyMDUyLDUyMDUzLDUyMDU0LDUyMDU1LDUyMDU4LDUyMDU5LDUyMDYwLDUyMDYyLDUyMDYzLDUyMDY0LDUyMDY1LDUyMDY2LDUyMDY3LDUyMDY5LDUyMDcwLDUyMDcxLDUyMDcyLDUyMDczLDUyMDc0LDUyMDc1LDUyMDc2LDEzMjA1LDEzMjA2LDEzMjA3LDg0NjcsMTMyMDgsMTMyNTIsMTMyMTksMTMyMjAsMTMyMjEsMTMyMjIsMTMyMDksMTMyMTAsMTMyMTEsMTMyMTIsMTMyMTMsMTMyMTQsMTMyMTUsMTMyMTYsMTMyMTcsMTMyMTgsMTMyNTgsMTMxOTcsMTMxOTgsMTMxOTksMTMyNjMsMTMxOTIsMTMxOTMsMTMyNTYsMTMyMjMsMTMyMjQsMTMyMzIsMTMyMzMsMTMyMzQsMTMyMzUsMTMyMzYsMTMyMzcsMTMyMzgsMTMyMzksMTMyNDAsMTMyNDEsMTMxODQsMTMxODUsMTMxODYsMTMxODcsMTMxODgsMTMyNDIsMTMyNDMsMTMyNDQsMTMyNDUsMTMyNDYsMTMyNDcsMTMyMDAsMTMyMDEsMTMyMDIsMTMyMDMsMTMyMDQsODQ4NiwxMzI0OCwxMzI0OSwxMzE5NCwxMzE5NSwxMzE5NiwxMzI3MCwxMzI1MywxMzIyOSwxMzIzMCwxMzIzMSwxMzI3NSwxMzIyNSwxMzIyNiwxMzIyNywxMzIyOCwxMzI3NywxMzI2NCwxMzI2NywxMzI1MSwxMzI1NywxMzI3NiwxMzI1NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjA3Nyw1MjA3OCw1MjA3OSw1MjA4MCw1MjA4MSw1MjA4Miw1MjA4Myw1MjA4NCw1MjA4NSw1MjA4Niw1MjA4Nyw1MjA5MCw1MjA5MSw1MjA5Miw1MjA5Myw1MjA5NCw1MjA5NSw1MjA5Niw1MjA5Nyw1MjA5OCw1MjA5OSw1MjEwMCw1MjEwMSw1MjEwMiw1MjEwMyw1MjEwNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjEwNSw1MjEwNiw1MjEwNyw1MjEwOCw1MjEwOSw1MjExMCw1MjExMSw1MjExMiw1MjExMyw1MjExNCw1MjExNSw1MjExNiw1MjExNyw1MjExOCw1MjExOSw1MjEyMCw1MjEyMSw1MjEyMiw1MjEyMyw1MjEyNSw1MjEyNiw1MjEyNyw1MjEyOCw1MjEyOSw1MjEzMCw1MjEzMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjEzMiw1MjEzMyw1MjEzNCw1MjEzNSw1MjEzNiw1MjEzNyw1MjEzOCw1MjEzOSw1MjE0MCw1MjE0MSw1MjE0Miw1MjE0Myw1MjE0NCw1MjE0NSw1MjE0Niw1MjE0Nyw1MjE0OCw1MjE0OSw1MjE1MCw1MjE1MSw1MjE1Myw1MjE1NCw1MjE1NSw1MjE1Niw1MjE1Nyw1MjE1OCw1MjE1OSw1MjE2MCw1MjE2MSw1MjE2Miw1MjE2Myw1MjE2NCwxOTgsMjA4LDE3MCwyOTQsbnVsbCwzMDYsbnVsbCwzMTksMzIxLDIxNiwzMzgsMTg2LDIyMiwzNTgsMzMwLG51bGwsMTI4OTYsMTI4OTcsMTI4OTgsMTI4OTksMTI5MDAsMTI5MDEsMTI5MDIsMTI5MDMsMTI5MDQsMTI5MDUsMTI5MDYsMTI5MDcsMTI5MDgsMTI5MDksMTI5MTAsMTI5MTEsMTI5MTIsMTI5MTMsMTI5MTQsMTI5MTUsMTI5MTYsMTI5MTcsMTI5MTgsMTI5MTksMTI5MjAsMTI5MjEsMTI5MjIsMTI5MjMsOTQyNCw5NDI1LDk0MjYsOTQyNyw5NDI4LDk0MjksOTQzMCw5NDMxLDk0MzIsOTQzMyw5NDM0LDk0MzUsOTQzNiw5NDM3LDk0MzgsOTQzOSw5NDQwLDk0NDEsOTQ0Miw5NDQzLDk0NDQsOTQ0NSw5NDQ2LDk0NDcsOTQ0OCw5NDQ5LDkzMTIsOTMxMyw5MzE0LDkzMTUsOTMxNiw5MzE3LDkzMTgsOTMxOSw5MzIwLDkzMjEsOTMyMiw5MzIzLDkzMjQsOTMyNSw5MzI2LDE4OSw4NTMxLDg1MzIsMTg4LDE5MCw4NTM5LDg1NDAsODU0MSw4NTQyLDUyMTY1LDUyMTY2LDUyMTY3LDUyMTY4LDUyMTY5LDUyMTcwLDUyMTcxLDUyMTcyLDUyMTczLDUyMTc0LDUyMTc1LDUyMTc2LDUyMTc3LDUyMTc4LDUyMTc5LDUyMTgxLDUyMTgyLDUyMTgzLDUyMTg0LDUyMTg1LDUyMTg2LDUyMTg3LDUyMTg4LDUyMTg5LDUyMTkwLDUyMTkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMTkyLDUyMTkzLDUyMTk0LDUyMTk1LDUyMTk3LDUyMTk4LDUyMjAwLDUyMjAyLDUyMjAzLDUyMjA0LDUyMjA1LDUyMjA2LDUyMjA3LDUyMjA4LDUyMjA5LDUyMjEwLDUyMjExLDUyMjEyLDUyMjEzLDUyMjE0LDUyMjE1LDUyMjE2LDUyMjE3LDUyMjE4LDUyMjE5LDUyMjIwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMjIxLDUyMjIyLDUyMjIzLDUyMjI0LDUyMjI1LDUyMjI2LDUyMjI3LDUyMjI4LDUyMjI5LDUyMjMwLDUyMjMxLDUyMjMyLDUyMjMzLDUyMjM0LDUyMjM1LDUyMjM4LDUyMjM5LDUyMjQxLDUyMjQyLDUyMjQzLDUyMjQ1LDUyMjQ2LDUyMjQ3LDUyMjQ4LDUyMjQ5LDUyMjUwLDUyMjUxLDUyMjU0LDUyMjU1LDUyMjU2LDUyMjU5LDUyMjYwLDIzMCwyNzMsMjQwLDI5NSwzMDUsMzA3LDMxMiwzMjAsMzIyLDI0OCwzMzksMjIzLDI1NCwzNTksMzMxLDMyOSwxMjgwMCwxMjgwMSwxMjgwMiwxMjgwMywxMjgwNCwxMjgwNSwxMjgwNiwxMjgwNywxMjgwOCwxMjgwOSwxMjgxMCwxMjgxMSwxMjgxMiwxMjgxMywxMjgxNCwxMjgxNSwxMjgxNiwxMjgxNywxMjgxOCwxMjgxOSwxMjgyMCwxMjgyMSwxMjgyMiwxMjgyMywxMjgyNCwxMjgyNSwxMjgyNiwxMjgyNyw5MzcyLDkzNzMsOTM3NCw5Mzc1LDkzNzYsOTM3Nyw5Mzc4LDkzNzksOTM4MCw5MzgxLDkzODIsOTM4Myw5Mzg0LDkzODUsOTM4Niw5Mzg3LDkzODgsOTM4OSw5MzkwLDkzOTEsOTM5Miw5MzkzLDkzOTQsOTM5NSw5Mzk2LDkzOTcsOTMzMiw5MzMzLDkzMzQsOTMzNSw5MzM2LDkzMzcsOTMzOCw5MzM5LDkzNDAsOTM0MSw5MzQyLDkzNDMsOTM0NCw5MzQ1LDkzNDYsMTg1LDE3OCwxNzksODMwOCw4MzE5LDgzMjEsODMyMiw4MzIzLDgzMjQsNTIyNjEsNTIyNjIsNTIyNjYsNTIyNjcsNTIyNjksNTIyNzEsNTIyNzMsNTIyNzQsNTIyNzUsNTIyNzYsNTIyNzcsNTIyNzgsNTIyNzksNTIyODIsNTIyODcsNTIyODgsNTIyODksNTIyOTAsNTIyOTEsNTIyOTQsNTIyOTUsNTIyOTcsNTIyOTgsNTIyOTksNTIzMDEsNTIzMDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIzMDMsNTIzMDQsNTIzMDUsNTIzMDYsNTIzMDcsNTIzMTAsNTIzMTQsNTIzMTUsNTIzMTYsNTIzMTcsNTIzMTgsNTIzMTksNTIzMjEsNTIzMjIsNTIzMjMsNTIzMjUsNTIzMjcsNTIzMjksNTIzMzAsNTIzMzEsNTIzMzIsNTIzMzMsNTIzMzQsNTIzMzUsNTIzMzcsNTIzMzgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIzMzksNTIzNDAsNTIzNDIsNTIzNDMsNTIzNDQsNTIzNDUsNTIzNDYsNTIzNDcsNTIzNDgsNTIzNDksNTIzNTAsNTIzNTEsNTIzNTIsNTIzNTMsNTIzNTQsNTIzNTUsNTIzNTYsNTIzNTcsNTIzNTgsNTIzNTksNTIzNjAsNTIzNjEsNTIzNjIsNTIzNjMsNTIzNjQsNTIzNjUsNTIzNjYsNTIzNjcsNTIzNjgsNTIzNjksNTIzNzAsNTIzNzEsMTIzNTMsMTIzNTQsMTIzNTUsMTIzNTYsMTIzNTcsMTIzNTgsMTIzNTksMTIzNjAsMTIzNjEsMTIzNjIsMTIzNjMsMTIzNjQsMTIzNjUsMTIzNjYsMTIzNjcsMTIzNjgsMTIzNjksMTIzNzAsMTIzNzEsMTIzNzIsMTIzNzMsMTIzNzQsMTIzNzUsMTIzNzYsMTIzNzcsMTIzNzgsMTIzNzksMTIzODAsMTIzODEsMTIzODIsMTIzODMsMTIzODQsMTIzODUsMTIzODYsMTIzODcsMTIzODgsMTIzODksMTIzOTAsMTIzOTEsMTIzOTIsMTIzOTMsMTIzOTQsMTIzOTUsMTIzOTYsMTIzOTcsMTIzOTgsMTIzOTksMTI0MDAsMTI0MDEsMTI0MDIsMTI0MDMsMTI0MDQsMTI0MDUsMTI0MDYsMTI0MDcsMTI0MDgsMTI0MDksMTI0MTAsMTI0MTEsMTI0MTIsMTI0MTMsMTI0MTQsMTI0MTUsMTI0MTYsMTI0MTcsMTI0MTgsMTI0MTksMTI0MjAsMTI0MjEsMTI0MjIsMTI0MjMsMTI0MjQsMTI0MjUsMTI0MjYsMTI0MjcsMTI0MjgsMTI0MjksMTI0MzAsMTI0MzEsMTI0MzIsMTI0MzMsMTI0MzQsMTI0MzUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMzcyLDUyMzczLDUyMzc0LDUyMzc1LDUyMzc4LDUyMzc5LDUyMzgxLDUyMzgyLDUyMzgzLDUyMzg1LDUyMzg2LDUyMzg3LDUyMzg4LDUyMzg5LDUyMzkwLDUyMzkxLDUyMzk0LDUyMzk4LDUyMzk5LDUyNDAwLDUyNDAxLDUyNDAyLDUyNDAzLDUyNDA2LDUyNDA3LDUyNDA5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNDEwLDUyNDExLDUyNDEzLDUyNDE0LDUyNDE1LDUyNDE2LDUyNDE3LDUyNDE4LDUyNDE5LDUyNDIyLDUyNDI0LDUyNDI2LDUyNDI3LDUyNDI4LDUyNDI5LDUyNDMwLDUyNDMxLDUyNDMzLDUyNDM0LDUyNDM1LDUyNDM3LDUyNDM4LDUyNDM5LDUyNDQwLDUyNDQxLDUyNDQyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNDQzLDUyNDQ0LDUyNDQ1LDUyNDQ2LDUyNDQ3LDUyNDQ4LDUyNDQ5LDUyNDUwLDUyNDUxLDUyNDUzLDUyNDU0LDUyNDU1LDUyNDU2LDUyNDU3LDUyNDU4LDUyNDU5LDUyNDYxLDUyNDYyLDUyNDYzLDUyNDY1LDUyNDY2LDUyNDY3LDUyNDY4LDUyNDY5LDUyNDcwLDUyNDcxLDUyNDcyLDUyNDczLDUyNDc0LDUyNDc1LDUyNDc2LDUyNDc3LDEyNDQ5LDEyNDUwLDEyNDUxLDEyNDUyLDEyNDUzLDEyNDU0LDEyNDU1LDEyNDU2LDEyNDU3LDEyNDU4LDEyNDU5LDEyNDYwLDEyNDYxLDEyNDYyLDEyNDYzLDEyNDY0LDEyNDY1LDEyNDY2LDEyNDY3LDEyNDY4LDEyNDY5LDEyNDcwLDEyNDcxLDEyNDcyLDEyNDczLDEyNDc0LDEyNDc1LDEyNDc2LDEyNDc3LDEyNDc4LDEyNDc5LDEyNDgwLDEyNDgxLDEyNDgyLDEyNDgzLDEyNDg0LDEyNDg1LDEyNDg2LDEyNDg3LDEyNDg4LDEyNDg5LDEyNDkwLDEyNDkxLDEyNDkyLDEyNDkzLDEyNDk0LDEyNDk1LDEyNDk2LDEyNDk3LDEyNDk4LDEyNDk5LDEyNTAwLDEyNTAxLDEyNTAyLDEyNTAzLDEyNTA0LDEyNTA1LDEyNTA2LDEyNTA3LDEyNTA4LDEyNTA5LDEyNTEwLDEyNTExLDEyNTEyLDEyNTEzLDEyNTE0LDEyNTE1LDEyNTE2LDEyNTE3LDEyNTE4LDEyNTE5LDEyNTIwLDEyNTIxLDEyNTIyLDEyNTIzLDEyNTI0LDEyNTI1LDEyNTI2LDEyNTI3LDEyNTI4LDEyNTI5LDEyNTMwLDEyNTMxLDEyNTMyLDEyNTMzLDEyNTM0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjQ3OCw1MjQ3OSw1MjQ4MCw1MjQ4Miw1MjQ4Myw1MjQ4NCw1MjQ4NSw1MjQ4Niw1MjQ4Nyw1MjQ5MCw1MjQ5MSw1MjQ5Myw1MjQ5NCw1MjQ5NSw1MjQ5Nyw1MjQ5OCw1MjQ5OSw1MjUwMCw1MjUwMSw1MjUwMiw1MjUwMyw1MjUwNiw1MjUwOCw1MjUxMCw1MjUxMSw1MjUxMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjUxMyw1MjUxNCw1MjUxNSw1MjUxNyw1MjUxOCw1MjUxOSw1MjUyMSw1MjUyMiw1MjUyMyw1MjUyNSw1MjUyNiw1MjUyNyw1MjUyOCw1MjUyOSw1MjUzMCw1MjUzMSw1MjUzMiw1MjUzMyw1MjUzNCw1MjUzNSw1MjUzNiw1MjUzOCw1MjUzOSw1MjU0MCw1MjU0MSw1MjU0MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjU0Myw1MjU0NCw1MjU0NSw1MjU0Niw1MjU0Nyw1MjU0OCw1MjU0OSw1MjU1MCw1MjU1MSw1MjU1Miw1MjU1Myw1MjU1NCw1MjU1NSw1MjU1Niw1MjU1Nyw1MjU1OCw1MjU1OSw1MjU2MCw1MjU2MSw1MjU2Miw1MjU2Myw1MjU2NCw1MjU2NSw1MjU2Niw1MjU2Nyw1MjU2OCw1MjU2OSw1MjU3MCw1MjU3MSw1MjU3Myw1MjU3NCw1MjU3NSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDI1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMTA1LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNTc3LDUyNTc4LDUyNTc5LDUyNTgxLDUyNTgyLDUyNTgzLDUyNTg0LDUyNTg1LDUyNTg2LDUyNTg3LDUyNTkwLDUyNTkyLDUyNTk0LDUyNTk1LDUyNTk2LDUyNTk3LDUyNTk4LDUyNTk5LDUyNjAxLDUyNjAyLDUyNjAzLDUyNjA0LDUyNjA1LDUyNjA2LDUyNjA3LDUyNjA4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNjA5LDUyNjEwLDUyNjExLDUyNjEyLDUyNjEzLDUyNjE0LDUyNjE1LDUyNjE3LDUyNjE4LDUyNjE5LDUyNjIwLDUyNjIxLDUyNjIyLDUyNjIzLDUyNjI0LDUyNjI1LDUyNjI2LDUyNjI3LDUyNjMwLDUyNjMxLDUyNjMzLDUyNjM0LDUyNjM1LDUyNjM3LDUyNjM4LDUyNjM5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNjQwLDUyNjQxLDUyNjQyLDUyNjQzLDUyNjQ2LDUyNjQ4LDUyNjUwLDUyNjUxLDUyNjUyLDUyNjUzLDUyNjU0LDUyNjU1LDUyNjU3LDUyNjU4LDUyNjU5LDUyNjYwLDUyNjYxLDUyNjYyLDUyNjYzLDUyNjY0LDUyNjY1LDUyNjY2LDUyNjY3LDUyNjY4LDUyNjY5LDUyNjcwLDUyNjcxLDUyNjcyLDUyNjczLDUyNjc0LDUyNjc1LDUyNjc3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI2NzgsNTI2NzksNTI2ODAsNTI2ODEsNTI2ODIsNTI2ODMsNTI2ODUsNTI2ODYsNTI2ODcsNTI2ODksNTI2OTAsNTI2OTEsNTI2OTIsNTI2OTMsNTI2OTQsNTI2OTUsNTI2OTYsNTI2OTcsNTI2OTgsNTI2OTksNTI3MDAsNTI3MDEsNTI3MDIsNTI3MDMsNTI3MDQsNTI3MDUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI3MDYsNTI3MDcsNTI3MDgsNTI3MDksNTI3MTAsNTI3MTEsNTI3MTMsNTI3MTQsNTI3MTUsNTI3MTcsNTI3MTgsNTI3MTksNTI3MjEsNTI3MjIsNTI3MjMsNTI3MjQsNTI3MjUsNTI3MjYsNTI3MjcsNTI3MzAsNTI3MzIsNTI3MzQsNTI3MzUsNTI3MzYsNTI3MzcsNTI3MzgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI3MzksNTI3NDEsNTI3NDIsNTI3NDMsNTI3NDUsNTI3NDYsNTI3NDcsNTI3NDksNTI3NTAsNTI3NTEsNTI3NTIsNTI3NTMsNTI3NTQsNTI3NTUsNTI3NTcsNTI3NTgsNTI3NTksNTI3NjAsNTI3NjIsNTI3NjMsNTI3NjQsNTI3NjUsNTI3NjYsNTI3NjcsNTI3NzAsNTI3NzEsNTI3NzMsNTI3NzQsNTI3NzUsNTI3NzcsNTI3NzgsNTI3NzksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mjc4MCw1Mjc4MSw1Mjc4Miw1Mjc4Myw1Mjc4Niw1Mjc4OCw1Mjc5MCw1Mjc5MSw1Mjc5Miw1Mjc5Myw1Mjc5NCw1Mjc5NSw1Mjc5Niw1Mjc5Nyw1Mjc5OCw1Mjc5OSw1MjgwMCw1MjgwMSw1MjgwMiw1MjgwMyw1MjgwNCw1MjgwNSw1MjgwNiw1MjgwNyw1MjgwOCw1MjgwOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjgxMCw1MjgxMSw1MjgxMiw1MjgxMyw1MjgxNCw1MjgxNSw1MjgxNiw1MjgxNyw1MjgxOCw1MjgxOSw1MjgyMCw1MjgyMSw1MjgyMiw1MjgyMyw1MjgyNiw1MjgyNyw1MjgyOSw1MjgzMCw1MjgzNCw1MjgzNSw1MjgzNiw1MjgzNyw1MjgzOCw1MjgzOSw1Mjg0Miw1Mjg0NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mjg0Niw1Mjg0Nyw1Mjg0OCw1Mjg0OSw1Mjg1MCw1Mjg1MSw1Mjg1NCw1Mjg1NSw1Mjg1Nyw1Mjg1OCw1Mjg1OSw1Mjg2MSw1Mjg2Miw1Mjg2Myw1Mjg2NCw1Mjg2NSw1Mjg2Niw1Mjg2Nyw1Mjg3MCw1Mjg3Miw1Mjg3NCw1Mjg3NSw1Mjg3Niw1Mjg3Nyw1Mjg3OCw1Mjg3OSw1Mjg4Miw1Mjg4Myw1Mjg4NSw1Mjg4Niw1Mjg4Nyw1Mjg4OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyODkwLDUyODkxLDUyODkyLDUyODkzLDUyODk0LDUyODk1LDUyODk4LDUyOTAyLDUyOTAzLDUyOTA0LDUyOTA1LDUyOTA2LDUyOTA3LDUyOTEwLDUyOTExLDUyOTEyLDUyOTEzLDUyOTE0LDUyOTE1LDUyOTE2LDUyOTE3LDUyOTE4LDUyOTE5LDUyOTIwLDUyOTIxLDUyOTIyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyOTIzLDUyOTI0LDUyOTI1LDUyOTI2LDUyOTI3LDUyOTI4LDUyOTMwLDUyOTMxLDUyOTMyLDUyOTMzLDUyOTM0LDUyOTM1LDUyOTM2LDUyOTM3LDUyOTM4LDUyOTM5LDUyOTQwLDUyOTQxLDUyOTQyLDUyOTQzLDUyOTQ0LDUyOTQ1LDUyOTQ2LDUyOTQ3LDUyOTQ4LDUyOTQ5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyOTUwLDUyOTUxLDUyOTUyLDUyOTUzLDUyOTU0LDUyOTU1LDUyOTU2LDUyOTU3LDUyOTU4LDUyOTU5LDUyOTYwLDUyOTYxLDUyOTYyLDUyOTYzLDUyOTY2LDUyOTY3LDUyOTY5LDUyOTcwLDUyOTczLDUyOTc0LDUyOTc1LDUyOTc2LDUyOTc3LDUyOTc4LDUyOTc5LDUyOTgyLDUyOTg2LDUyOTg3LDUyOTg4LDUyOTg5LDUyOTkwLDUyOTkxLDQ0MDMyLDQ0MDMzLDQ0MDM2LDQ0MDM5LDQ0MDQwLDQ0MDQxLDQ0MDQyLDQ0MDQ4LDQ0MDQ5LDQ0MDUwLDQ0MDUxLDQ0MDUyLDQ0MDUzLDQ0MDU0LDQ0MDU1LDQ0MDU3LDQ0MDU4LDQ0MDU5LDQ0MDYwLDQ0MDYxLDQ0MDY0LDQ0MDY4LDQ0MDc2LDQ0MDc3LDQ0MDc5LDQ0MDgwLDQ0MDgxLDQ0MDg4LDQ0MDg5LDQ0MDkyLDQ0MDk2LDQ0MTA3LDQ0MTA5LDQ0MTE2LDQ0MTIwLDQ0MTI0LDQ0MTQ0LDQ0MTQ1LDQ0MTQ4LDQ0MTUxLDQ0MTUyLDQ0MTU0LDQ0MTYwLDQ0MTYxLDQ0MTYzLDQ0MTY0LDQ0MTY1LDQ0MTY2LDQ0MTY5LDQ0MTcwLDQ0MTcxLDQ0MTcyLDQ0MTc2LDQ0MTgwLDQ0MTg4LDQ0MTg5LDQ0MTkxLDQ0MTkyLDQ0MTkzLDQ0MjAwLDQ0MjAxLDQ0MjAyLDQ0MjA0LDQ0MjA3LDQ0MjA4LDQ0MjE2LDQ0MjE3LDQ0MjE5LDQ0MjIwLDQ0MjIxLDQ0MjI1LDQ0MjI4LDQ0MjMyLDQ0MjM2LDQ0MjQ1LDQ0MjQ3LDQ0MjU2LDQ0MjU3LDQ0MjYwLDQ0MjYzLDQ0MjY0LDQ0MjY2LDQ0MjY4LDQ0MjcxLDQ0MjcyLDQ0MjczLDQ0Mjc1LDQ0Mjc3LDQ0Mjc4LDQ0Mjg0LDQ0Mjg1LDQ0Mjg4LDQ0MjkyLDQ0Mjk0LDUyOTk0LDUyOTk1LDUyOTk3LDUyOTk4LDUyOTk5LDUzMDAxLDUzMDAyLDUzMDAzLDUzMDA0LDUzMDA1LDUzMDA2LDUzMDA3LDUzMDEwLDUzMDEyLDUzMDE0LDUzMDE1LDUzMDE2LDUzMDE3LDUzMDE4LDUzMDE5LDUzMDIxLDUzMDIyLDUzMDIzLDUzMDI1LDUzMDI2LDUzMDI3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMDI5LDUzMDMwLDUzMDMxLDUzMDMyLDUzMDMzLDUzMDM0LDUzMDM1LDUzMDM4LDUzMDQyLDUzMDQzLDUzMDQ0LDUzMDQ1LDUzMDQ2LDUzMDQ3LDUzMDQ5LDUzMDUwLDUzMDUxLDUzMDUyLDUzMDUzLDUzMDU0LDUzMDU1LDUzMDU2LDUzMDU3LDUzMDU4LDUzMDU5LDUzMDYwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMDYxLDUzMDYyLDUzMDYzLDUzMDY0LDUzMDY1LDUzMDY2LDUzMDY3LDUzMDY4LDUzMDY5LDUzMDcwLDUzMDcxLDUzMDcyLDUzMDczLDUzMDc0LDUzMDc1LDUzMDc4LDUzMDc5LDUzMDgxLDUzMDgyLDUzMDgzLDUzMDg1LDUzMDg2LDUzMDg3LDUzMDg4LDUzMDg5LDUzMDkwLDUzMDkxLDUzMDk0LDUzMDk2LDUzMDk4LDUzMDk5LDUzMTAwLDQ0MzAwLDQ0MzAxLDQ0MzAzLDQ0MzA1LDQ0MzEyLDQ0MzE2LDQ0MzIwLDQ0MzI5LDQ0MzMyLDQ0MzMzLDQ0MzQwLDQ0MzQxLDQ0MzQ0LDQ0MzQ4LDQ0MzU2LDQ0MzU3LDQ0MzU5LDQ0MzYxLDQ0MzY4LDQ0MzcyLDQ0Mzc2LDQ0Mzg1LDQ0Mzg3LDQ0Mzk2LDQ0Mzk3LDQ0NDAwLDQ0NDAzLDQ0NDA0LDQ0NDA1LDQ0NDA2LDQ0NDExLDQ0NDEyLDQ0NDEzLDQ0NDE1LDQ0NDE3LDQ0NDE4LDQ0NDI0LDQ0NDI1LDQ0NDI4LDQ0NDMyLDQ0NDQ0LDQ0NDQ1LDQ0NDUyLDQ0NDcxLDQ0NDgwLDQ0NDgxLDQ0NDg0LDQ0NDg4LDQ0NDk2LDQ0NDk3LDQ0NDk5LDQ0NTA4LDQ0NTEyLDQ0NTE2LDQ0NTM2LDQ0NTM3LDQ0NTQwLDQ0NTQzLDQ0NTQ0LDQ0NTQ1LDQ0NTUyLDQ0NTUzLDQ0NTU1LDQ0NTU3LDQ0NTY0LDQ0NTkyLDQ0NTkzLDQ0NTk2LDQ0NTk5LDQ0NjAwLDQ0NjAyLDQ0NjA4LDQ0NjA5LDQ0NjExLDQ0NjEzLDQ0NjE0LDQ0NjE4LDQ0NjIwLDQ0NjIxLDQ0NjIyLDQ0NjI0LDQ0NjI4LDQ0NjMwLDQ0NjM2LDQ0NjM3LDQ0NjM5LDQ0NjQwLDQ0NjQxLDQ0NjQ1LDQ0NjQ4LDQ0NjQ5LDQ0NjUyLDQ0NjU2LDQ0NjY0LDUzMTAxLDUzMTAyLDUzMTAzLDUzMTA2LDUzMTA3LDUzMTA5LDUzMTEwLDUzMTExLDUzMTEzLDUzMTE0LDUzMTE1LDUzMTE2LDUzMTE3LDUzMTE4LDUzMTE5LDUzMTIxLDUzMTIyLDUzMTIzLDUzMTI0LDUzMTI2LDUzMTI3LDUzMTI4LDUzMTI5LDUzMTMwLDUzMTMxLDUzMTMzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMTM0LDUzMTM1LDUzMTM2LDUzMTM3LDUzMTM4LDUzMTM5LDUzMTQwLDUzMTQxLDUzMTQyLDUzMTQzLDUzMTQ0LDUzMTQ1LDUzMTQ2LDUzMTQ3LDUzMTQ4LDUzMTQ5LDUzMTUwLDUzMTUxLDUzMTUyLDUzMTU0LDUzMTU1LDUzMTU2LDUzMTU3LDUzMTU4LDUzMTU5LDUzMTYxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMTYyLDUzMTYzLDUzMTY0LDUzMTY1LDUzMTY2LDUzMTY3LDUzMTY5LDUzMTcwLDUzMTcxLDUzMTcyLDUzMTczLDUzMTc0LDUzMTc1LDUzMTc2LDUzMTc3LDUzMTc4LDUzMTc5LDUzMTgwLDUzMTgxLDUzMTgyLDUzMTgzLDUzMTg0LDUzMTg1LDUzMTg2LDUzMTg3LDUzMTg5LDUzMTkwLDUzMTkxLDUzMTkyLDUzMTkzLDUzMTk0LDUzMTk1LDQ0NjY1LDQ0NjY3LDQ0NjY4LDQ0NjY5LDQ0Njc2LDQ0Njc3LDQ0Njg0LDQ0NzMyLDQ0NzMzLDQ0NzM0LDQ0NzM2LDQ0NzQwLDQ0NzQ4LDQ0NzQ5LDQ0NzUxLDQ0NzUyLDQ0NzUzLDQ0NzYwLDQ0NzYxLDQ0NzY0LDQ0Nzc2LDQ0Nzc5LDQ0NzgxLDQ0Nzg4LDQ0NzkyLDQ0Nzk2LDQ0ODA3LDQ0ODA4LDQ0ODEzLDQ0ODE2LDQ0ODQ0LDQ0ODQ1LDQ0ODQ4LDQ0ODUwLDQ0ODUyLDQ0ODYwLDQ0ODYxLDQ0ODYzLDQ0ODY1LDQ0ODY2LDQ0ODY3LDQ0ODcyLDQ0ODczLDQ0ODgwLDQ0ODkyLDQ0ODkzLDQ0OTAwLDQ0OTAxLDQ0OTIxLDQ0OTI4LDQ0OTMyLDQ0OTM2LDQ0OTQ0LDQ0OTQ1LDQ0OTQ5LDQ0OTU2LDQ0OTg0LDQ0OTg1LDQ0OTg4LDQ0OTkyLDQ0OTk5LDQ1MDAwLDQ1MDAxLDQ1MDAzLDQ1MDA1LDQ1MDA2LDQ1MDEyLDQ1MDIwLDQ1MDMyLDQ1MDMzLDQ1MDQwLDQ1MDQxLDQ1MDQ0LDQ1MDQ4LDQ1MDU2LDQ1MDU3LDQ1MDYwLDQ1MDY4LDQ1MDcyLDQ1MDc2LDQ1MDg0LDQ1MDg1LDQ1MDk2LDQ1MTI0LDQ1MTI1LDQ1MTI4LDQ1MTMwLDQ1MTMyLDQ1MTM0LDQ1MTM5LDQ1MTQwLDQ1MTQxLDQ1MTQzLDQ1MTQ1LDUzMTk2LDUzMTk3LDUzMTk4LDUzMTk5LDUzMjAwLDUzMjAxLDUzMjAyLDUzMjAzLDUzMjA0LDUzMjA1LDUzMjA2LDUzMjA3LDUzMjA4LDUzMjA5LDUzMjEwLDUzMjExLDUzMjEyLDUzMjEzLDUzMjE0LDUzMjE1LDUzMjE4LDUzMjE5LDUzMjIxLDUzMjIyLDUzMjIzLDUzMjI1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMjI2LDUzMjI3LDUzMjI4LDUzMjI5LDUzMjMwLDUzMjMxLDUzMjM0LDUzMjM2LDUzMjM4LDUzMjM5LDUzMjQwLDUzMjQxLDUzMjQyLDUzMjQzLDUzMjQ1LDUzMjQ2LDUzMjQ3LDUzMjQ5LDUzMjUwLDUzMjUxLDUzMjUzLDUzMjU0LDUzMjU1LDUzMjU2LDUzMjU3LDUzMjU4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMjU5LDUzMjYwLDUzMjYxLDUzMjYyLDUzMjYzLDUzMjY0LDUzMjY2LDUzMjY3LDUzMjY4LDUzMjY5LDUzMjcwLDUzMjcxLDUzMjczLDUzMjc0LDUzMjc1LDUzMjc2LDUzMjc3LDUzMjc4LDUzMjc5LDUzMjgwLDUzMjgxLDUzMjgyLDUzMjgzLDUzMjg0LDUzMjg1LDUzMjg2LDUzMjg3LDUzMjg4LDUzMjg5LDUzMjkwLDUzMjkxLDUzMjkyLDQ1MTQ5LDQ1MTgwLDQ1MTgxLDQ1MTg0LDQ1MTg4LDQ1MTk2LDQ1MTk3LDQ1MTk5LDQ1MjAxLDQ1MjA4LDQ1MjA5LDQ1MjEwLDQ1MjEyLDQ1MjE1LDQ1MjE2LDQ1MjE3LDQ1MjE4LDQ1MjI0LDQ1MjI1LDQ1MjI3LDQ1MjI4LDQ1MjI5LDQ1MjMwLDQ1MjMxLDQ1MjMzLDQ1MjM1LDQ1MjM2LDQ1MjM3LDQ1MjQwLDQ1MjQ0LDQ1MjUyLDQ1MjUzLDQ1MjU1LDQ1MjU2LDQ1MjU3LDQ1MjY0LDQ1MjY1LDQ1MjY4LDQ1MjcyLDQ1MjgwLDQ1Mjg1LDQ1MzIwLDQ1MzIxLDQ1MzIzLDQ1MzI0LDQ1MzI4LDQ1MzMwLDQ1MzMxLDQ1MzM2LDQ1MzM3LDQ1MzM5LDQ1MzQwLDQ1MzQxLDQ1MzQ3LDQ1MzQ4LDQ1MzQ5LDQ1MzUyLDQ1MzU2LDQ1MzY0LDQ1MzY1LDQ1MzY3LDQ1MzY4LDQ1MzY5LDQ1Mzc2LDQ1Mzc3LDQ1MzgwLDQ1Mzg0LDQ1MzkyLDQ1MzkzLDQ1Mzk2LDQ1Mzk3LDQ1NDAwLDQ1NDA0LDQ1NDA4LDQ1NDMyLDQ1NDMzLDQ1NDM2LDQ1NDQwLDQ1NDQyLDQ1NDQ4LDQ1NDQ5LDQ1NDUxLDQ1NDUzLDQ1NDU4LDQ1NDU5LDQ1NDYwLDQ1NDY0LDQ1NDY4LDQ1NDgwLDQ1NTE2LDQ1NTIwLDQ1NTI0LDQ1NTMyLDQ1NTMzLDUzMjk0LDUzMjk1LDUzMjk2LDUzMjk3LDUzMjk4LDUzMjk5LDUzMzAyLDUzMzAzLDUzMzA1LDUzMzA2LDUzMzA3LDUzMzA5LDUzMzEwLDUzMzExLDUzMzEyLDUzMzEzLDUzMzE0LDUzMzE1LDUzMzE4LDUzMzIwLDUzMzIyLDUzMzIzLDUzMzI0LDUzMzI1LDUzMzI2LDUzMzI3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMzI5LDUzMzMwLDUzMzMxLDUzMzMzLDUzMzM0LDUzMzM1LDUzMzM3LDUzMzM4LDUzMzM5LDUzMzQwLDUzMzQxLDUzMzQyLDUzMzQzLDUzMzQ1LDUzMzQ2LDUzMzQ3LDUzMzQ4LDUzMzQ5LDUzMzUwLDUzMzUxLDUzMzUyLDUzMzUzLDUzMzU0LDUzMzU1LDUzMzU4LDUzMzU5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzMzYxLDUzMzYyLDUzMzYzLDUzMzY1LDUzMzY2LDUzMzY3LDUzMzY4LDUzMzY5LDUzMzcwLDUzMzcxLDUzMzc0LDUzMzc1LDUzMzc2LDUzMzc4LDUzMzc5LDUzMzgwLDUzMzgxLDUzMzgyLDUzMzgzLDUzMzg0LDUzMzg1LDUzMzg2LDUzMzg3LDUzMzg4LDUzMzg5LDUzMzkwLDUzMzkxLDUzMzkyLDUzMzkzLDUzMzk0LDUzMzk1LDUzMzk2LDQ1NTM1LDQ1NTQ0LDQ1NTQ1LDQ1NTQ4LDQ1NTUyLDQ1NTYxLDQ1NTYzLDQ1NTY1LDQ1NTcyLDQ1NTczLDQ1NTc2LDQ1NTc5LDQ1NTgwLDQ1NTg4LDQ1NTg5LDQ1NTkxLDQ1NTkzLDQ1NjAwLDQ1NjIwLDQ1NjI4LDQ1NjU2LDQ1NjYwLDQ1NjY0LDQ1NjcyLDQ1NjczLDQ1Njg0LDQ1Njg1LDQ1NjkyLDQ1NzAwLDQ1NzAxLDQ1NzA1LDQ1NzEyLDQ1NzEzLDQ1NzE2LDQ1NzIwLDQ1NzIxLDQ1NzIyLDQ1NzI4LDQ1NzI5LDQ1NzMxLDQ1NzMzLDQ1NzM0LDQ1NzM4LDQ1NzQwLDQ1NzQ0LDQ1NzQ4LDQ1NzY4LDQ1NzY5LDQ1NzcyLDQ1Nzc2LDQ1Nzc4LDQ1Nzg0LDQ1Nzg1LDQ1Nzg3LDQ1Nzg5LDQ1Nzk0LDQ1Nzk2LDQ1Nzk3LDQ1Nzk4LDQ1ODAwLDQ1ODAzLDQ1ODA0LDQ1ODA1LDQ1ODA2LDQ1ODA3LDQ1ODExLDQ1ODEyLDQ1ODEzLDQ1ODE1LDQ1ODE2LDQ1ODE3LDQ1ODE4LDQ1ODE5LDQ1ODIzLDQ1ODI0LDQ1ODI1LDQ1ODI4LDQ1ODMyLDQ1ODQwLDQ1ODQxLDQ1ODQzLDQ1ODQ0LDQ1ODQ1LDQ1ODUyLDQ1OTA4LDQ1OTA5LDQ1OTEwLDQ1OTEyLDQ1OTE1LDQ1OTE2LDQ1OTE4LDQ1OTE5LDQ1OTI0LDQ1OTI1LDUzMzk3LDUzMzk4LDUzMzk5LDUzNDAwLDUzNDAxLDUzNDAyLDUzNDAzLDUzNDA0LDUzNDA1LDUzNDA2LDUzNDA3LDUzNDA4LDUzNDA5LDUzNDEwLDUzNDExLDUzNDE0LDUzNDE1LDUzNDE3LDUzNDE4LDUzNDE5LDUzNDIxLDUzNDIyLDUzNDIzLDUzNDI0LDUzNDI1LDUzNDI2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNDI3LDUzNDMwLDUzNDMyLDUzNDM0LDUzNDM1LDUzNDM2LDUzNDM3LDUzNDM4LDUzNDM5LDUzNDQyLDUzNDQzLDUzNDQ1LDUzNDQ2LDUzNDQ3LDUzNDUwLDUzNDUxLDUzNDUyLDUzNDUzLDUzNDU0LDUzNDU1LDUzNDU4LDUzNDYyLDUzNDYzLDUzNDY0LDUzNDY1LDUzNDY2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNDY3LDUzNDcwLDUzNDcxLDUzNDczLDUzNDc0LDUzNDc1LDUzNDc3LDUzNDc4LDUzNDc5LDUzNDgwLDUzNDgxLDUzNDgyLDUzNDgzLDUzNDg2LDUzNDkwLDUzNDkxLDUzNDkyLDUzNDkzLDUzNDk0LDUzNDk1LDUzNDk3LDUzNDk4LDUzNDk5LDUzNTAwLDUzNTAxLDUzNTAyLDUzNTAzLDUzNTA0LDUzNTA1LDUzNTA2LDUzNTA3LDUzNTA4LDQ1OTI3LDQ1OTI5LDQ1OTMxLDQ1OTM0LDQ1OTM2LDQ1OTM3LDQ1OTQwLDQ1OTQ0LDQ1OTUyLDQ1OTUzLDQ1OTU1LDQ1OTU2LDQ1OTU3LDQ1OTY0LDQ1OTY4LDQ1OTcyLDQ1OTg0LDQ1OTg1LDQ1OTkyLDQ1OTk2LDQ2MDIwLDQ2MDIxLDQ2MDI0LDQ2MDI3LDQ2MDI4LDQ2MDMwLDQ2MDMyLDQ2MDM2LDQ2MDM3LDQ2MDM5LDQ2MDQxLDQ2MDQzLDQ2MDQ1LDQ2MDQ4LDQ2MDUyLDQ2MDU2LDQ2MDc2LDQ2MDk2LDQ2MTA0LDQ2MTA4LDQ2MTEyLDQ2MTIwLDQ2MTIxLDQ2MTIzLDQ2MTMyLDQ2MTYwLDQ2MTYxLDQ2MTY0LDQ2MTY4LDQ2MTc2LDQ2MTc3LDQ2MTc5LDQ2MTgxLDQ2MTg4LDQ2MjA4LDQ2MjE2LDQ2MjM3LDQ2MjQ0LDQ2MjQ4LDQ2MjUyLDQ2MjYxLDQ2MjYzLDQ2MjY1LDQ2MjcyLDQ2Mjc2LDQ2MjgwLDQ2Mjg4LDQ2MjkzLDQ2MzAwLDQ2MzAxLDQ2MzA0LDQ2MzA3LDQ2MzA4LDQ2MzEwLDQ2MzE2LDQ2MzE3LDQ2MzE5LDQ2MzIxLDQ2MzI4LDQ2MzU2LDQ2MzU3LDQ2MzYwLDQ2MzYzLDQ2MzY0LDQ2MzcyLDQ2MzczLDQ2Mzc1LDQ2Mzc2LDQ2Mzc3LDQ2Mzc4LDQ2Mzg0LDQ2Mzg1LDQ2Mzg4LDQ2MzkyLDUzNTA5LDUzNTEwLDUzNTExLDUzNTEyLDUzNTEzLDUzNTE0LDUzNTE1LDUzNTE2LDUzNTE4LDUzNTE5LDUzNTIwLDUzNTIxLDUzNTIyLDUzNTIzLDUzNTI0LDUzNTI1LDUzNTI2LDUzNTI3LDUzNTI4LDUzNTI5LDUzNTMwLDUzNTMxLDUzNTMyLDUzNTMzLDUzNTM0LDUzNTM1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNTM2LDUzNTM3LDUzNTM4LDUzNTM5LDUzNTQwLDUzNTQxLDUzNTQyLDUzNTQzLDUzNTQ0LDUzNTQ1LDUzNTQ2LDUzNTQ3LDUzNTQ4LDUzNTQ5LDUzNTUwLDUzNTUxLDUzNTU0LDUzNTU1LDUzNTU3LDUzNTU4LDUzNTU5LDUzNTYxLDUzNTYzLDUzNTY0LDUzNTY1LDUzNTY2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNTY3LDUzNTcwLDUzNTc0LDUzNTc1LDUzNTc2LDUzNTc3LDUzNTc4LDUzNTc5LDUzNTgyLDUzNTgzLDUzNTg1LDUzNTg2LDUzNTg3LDUzNTg5LDUzNTkwLDUzNTkxLDUzNTkyLDUzNTkzLDUzNTk0LDUzNTk1LDUzNTk4LDUzNjAwLDUzNjAyLDUzNjAzLDUzNjA0LDUzNjA1LDUzNjA2LDUzNjA3LDUzNjA5LDUzNjEwLDUzNjExLDUzNjEzLDQ2NDAwLDQ2NDAxLDQ2NDAzLDQ2NDA0LDQ2NDA1LDQ2NDExLDQ2NDEyLDQ2NDEzLDQ2NDE2LDQ2NDIwLDQ2NDI4LDQ2NDI5LDQ2NDMxLDQ2NDMyLDQ2NDMzLDQ2NDk2LDQ2NDk3LDQ2NTAwLDQ2NTA0LDQ2NTA2LDQ2NTA3LDQ2NTEyLDQ2NTEzLDQ2NTE1LDQ2NTE2LDQ2NTE3LDQ2NTIzLDQ2NTI0LDQ2NTI1LDQ2NTI4LDQ2NTMyLDQ2NTQwLDQ2NTQxLDQ2NTQzLDQ2NTQ0LDQ2NTQ1LDQ2NTUyLDQ2NTcyLDQ2NjA4LDQ2NjA5LDQ2NjEyLDQ2NjE2LDQ2NjI5LDQ2NjM2LDQ2NjQ0LDQ2NjY0LDQ2NjkyLDQ2Njk2LDQ2NzQ4LDQ2NzQ5LDQ2NzUyLDQ2NzU2LDQ2NzYzLDQ2NzY0LDQ2NzY5LDQ2ODA0LDQ2ODMyLDQ2ODM2LDQ2ODQwLDQ2ODQ4LDQ2ODQ5LDQ2ODUzLDQ2ODg4LDQ2ODg5LDQ2ODkyLDQ2ODk1LDQ2ODk2LDQ2OTA0LDQ2OTA1LDQ2OTA3LDQ2OTE2LDQ2OTIwLDQ2OTI0LDQ2OTMyLDQ2OTMzLDQ2OTQ0LDQ2OTQ4LDQ2OTUyLDQ2OTYwLDQ2OTYxLDQ2OTYzLDQ2OTY1LDQ2OTcyLDQ2OTczLDQ2OTc2LDQ2OTgwLDQ2OTg4LDQ2OTg5LDQ2OTkxLDQ2OTkyLDQ2OTkzLDQ2OTk0LDQ2OTk4LDQ2OTk5LDUzNjE0LDUzNjE1LDUzNjE2LDUzNjE3LDUzNjE4LDUzNjE5LDUzNjIwLDUzNjIxLDUzNjIyLDUzNjIzLDUzNjI0LDUzNjI1LDUzNjI2LDUzNjI3LDUzNjI5LDUzNjMwLDUzNjMxLDUzNjMyLDUzNjMzLDUzNjM0LDUzNjM1LDUzNjM3LDUzNjM4LDUzNjM5LDUzNjQxLDUzNjQyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNjQzLDUzNjQ0LDUzNjQ1LDUzNjQ2LDUzNjQ3LDUzNjQ4LDUzNjQ5LDUzNjUwLDUzNjUxLDUzNjUyLDUzNjUzLDUzNjU0LDUzNjU1LDUzNjU2LDUzNjU3LDUzNjU4LDUzNjU5LDUzNjYwLDUzNjYxLDUzNjYyLDUzNjYzLDUzNjY2LDUzNjY3LDUzNjY5LDUzNjcwLDUzNjcxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNjczLDUzNjc0LDUzNjc1LDUzNjc2LDUzNjc3LDUzNjc4LDUzNjc5LDUzNjgyLDUzNjg0LDUzNjg2LDUzNjg3LDUzNjg4LDUzNjg5LDUzNjkxLDUzNjkzLDUzNjk0LDUzNjk1LDUzNjk3LDUzNjk4LDUzNjk5LDUzNzAwLDUzNzAxLDUzNzAyLDUzNzAzLDUzNzA0LDUzNzA1LDUzNzA2LDUzNzA3LDUzNzA4LDUzNzA5LDUzNzEwLDUzNzExLDQ3MDAwLDQ3MDAxLDQ3MDA0LDQ3MDA4LDQ3MDE2LDQ3MDE3LDQ3MDE5LDQ3MDIwLDQ3MDIxLDQ3MDI4LDQ3MDI5LDQ3MDMyLDQ3MDQ3LDQ3MDQ5LDQ3MDg0LDQ3MDg1LDQ3MDg4LDQ3MDkyLDQ3MTAwLDQ3MTAxLDQ3MTAzLDQ3MTA0LDQ3MTA1LDQ3MTExLDQ3MTEyLDQ3MTEzLDQ3MTE2LDQ3MTIwLDQ3MTI4LDQ3MTI5LDQ3MTMxLDQ3MTMzLDQ3MTQwLDQ3MTQxLDQ3MTQ0LDQ3MTQ4LDQ3MTU2LDQ3MTU3LDQ3MTU5LDQ3MTYwLDQ3MTYxLDQ3MTY4LDQ3MTcyLDQ3MTg1LDQ3MTg3LDQ3MTk2LDQ3MTk3LDQ3MjAwLDQ3MjA0LDQ3MjEyLDQ3MjEzLDQ3MjE1LDQ3MjE3LDQ3MjI0LDQ3MjI4LDQ3MjQ1LDQ3MjcyLDQ3MjgwLDQ3Mjg0LDQ3Mjg4LDQ3Mjk2LDQ3Mjk3LDQ3Mjk5LDQ3MzAxLDQ3MzA4LDQ3MzEyLDQ3MzE2LDQ3MzI1LDQ3MzI3LDQ3MzI5LDQ3MzM2LDQ3MzM3LDQ3MzQwLDQ3MzQ0LDQ3MzUyLDQ3MzUzLDQ3MzU1LDQ3MzU3LDQ3MzY0LDQ3Mzg0LDQ3MzkyLDQ3NDIwLDQ3NDIxLDQ3NDI0LDQ3NDI4LDQ3NDM2LDQ3NDM5LDQ3NDQxLDQ3NDQ4LDQ3NDQ5LDQ3NDUyLDQ3NDU2LDQ3NDY0LDQ3NDY1LDUzNzEyLDUzNzEzLDUzNzE0LDUzNzE1LDUzNzE2LDUzNzE3LDUzNzE4LDUzNzE5LDUzNzIxLDUzNzIyLDUzNzIzLDUzNzI0LDUzNzI1LDUzNzI2LDUzNzI3LDUzNzI4LDUzNzI5LDUzNzMwLDUzNzMxLDUzNzMyLDUzNzMzLDUzNzM0LDUzNzM1LDUzNzM2LDUzNzM3LDUzNzM4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNzM5LDUzNzQwLDUzNzQxLDUzNzQyLDUzNzQzLDUzNzQ0LDUzNzQ1LDUzNzQ2LDUzNzQ3LDUzNzQ5LDUzNzUwLDUzNzUxLDUzNzUzLDUzNzU0LDUzNzU1LDUzNzU2LDUzNzU3LDUzNzU4LDUzNzU5LDUzNzYwLDUzNzYxLDUzNzYyLDUzNzYzLDUzNzY0LDUzNzY1LDUzNzY2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzNzY4LDUzNzcwLDUzNzcxLDUzNzcyLDUzNzczLDUzNzc0LDUzNzc1LDUzNzc3LDUzNzc4LDUzNzc5LDUzNzgwLDUzNzgxLDUzNzgyLDUzNzgzLDUzNzg0LDUzNzg1LDUzNzg2LDUzNzg3LDUzNzg4LDUzNzg5LDUzNzkwLDUzNzkxLDUzNzkyLDUzNzkzLDUzNzk0LDUzNzk1LDUzNzk2LDUzNzk3LDUzNzk4LDUzNzk5LDUzODAwLDUzODAxLDQ3NDY3LDQ3NDY5LDQ3NDc2LDQ3NDc3LDQ3NDgwLDQ3NDg0LDQ3NDkyLDQ3NDkzLDQ3NDk1LDQ3NDk3LDQ3NDk4LDQ3NTAxLDQ3NTAyLDQ3NTMyLDQ3NTMzLDQ3NTM2LDQ3NTQwLDQ3NTQ4LDQ3NTQ5LDQ3NTUxLDQ3NTUzLDQ3NTYwLDQ3NTYxLDQ3NTY0LDQ3NTY2LDQ3NTY3LDQ3NTY4LDQ3NTY5LDQ3NTcwLDQ3NTc2LDQ3NTc3LDQ3NTc5LDQ3NTgxLDQ3NTgyLDQ3NTg1LDQ3NTg3LDQ3NTg4LDQ3NTg5LDQ3NTkyLDQ3NTk2LDQ3NjA0LDQ3NjA1LDQ3NjA3LDQ3NjA4LDQ3NjA5LDQ3NjEwLDQ3NjE2LDQ3NjE3LDQ3NjI0LDQ3NjM3LDQ3NjcyLDQ3NjczLDQ3Njc2LDQ3NjgwLDQ3NjgyLDQ3Njg4LDQ3Njg5LDQ3NjkxLDQ3NjkzLDQ3Njk0LDQ3Njk5LDQ3NzAwLDQ3NzAxLDQ3NzA0LDQ3NzA4LDQ3NzE2LDQ3NzE3LDQ3NzE5LDQ3NzIwLDQ3NzIxLDQ3NzI4LDQ3NzI5LDQ3NzMyLDQ3NzM2LDQ3NzQ3LDQ3NzQ4LDQ3NzQ5LDQ3NzUxLDQ3NzU2LDQ3Nzg0LDQ3Nzg1LDQ3Nzg3LDQ3Nzg4LDQ3NzkyLDQ3Nzk0LDQ3ODAwLDQ3ODAxLDQ3ODAzLDQ3ODA1LDQ3ODEyLDQ3ODE2LDQ3ODMyLDQ3ODMzLDQ3ODY4LDUzODAyLDUzODAzLDUzODA2LDUzODA3LDUzODA5LDUzODEwLDUzODExLDUzODEzLDUzODE0LDUzODE1LDUzODE2LDUzODE3LDUzODE4LDUzODE5LDUzODIyLDUzODI0LDUzODI2LDUzODI3LDUzODI4LDUzODI5LDUzODMwLDUzODMxLDUzODMzLDUzODM0LDUzODM1LDUzODM2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzODM3LDUzODM4LDUzODM5LDUzODQwLDUzODQxLDUzODQyLDUzODQzLDUzODQ0LDUzODQ1LDUzODQ2LDUzODQ3LDUzODQ4LDUzODQ5LDUzODUwLDUzODUxLDUzODUzLDUzODU0LDUzODU1LDUzODU2LDUzODU3LDUzODU4LDUzODU5LDUzODYxLDUzODYyLDUzODYzLDUzODY0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzODY1LDUzODY2LDUzODY3LDUzODY4LDUzODY5LDUzODcwLDUzODcxLDUzODcyLDUzODczLDUzODc0LDUzODc1LDUzODc2LDUzODc3LDUzODc4LDUzODc5LDUzODgwLDUzODgxLDUzODgyLDUzODgzLDUzODg0LDUzODg1LDUzODg2LDUzODg3LDUzODkwLDUzODkxLDUzODkzLDUzODk0LDUzODk1LDUzODk3LDUzODk4LDUzODk5LDUzOTAwLDQ3ODcyLDQ3ODc2LDQ3ODg1LDQ3ODg3LDQ3ODg5LDQ3ODk2LDQ3OTAwLDQ3OTA0LDQ3OTEzLDQ3OTE1LDQ3OTI0LDQ3OTI1LDQ3OTI2LDQ3OTI4LDQ3OTMxLDQ3OTMyLDQ3OTMzLDQ3OTM0LDQ3OTQwLDQ3OTQxLDQ3OTQzLDQ3OTQ1LDQ3OTQ5LDQ3OTUxLDQ3OTUyLDQ3OTU2LDQ3OTYwLDQ3OTY5LDQ3OTcxLDQ3OTgwLDQ4MDA4LDQ4MDEyLDQ4MDE2LDQ4MDM2LDQ4MDQwLDQ4MDQ0LDQ4MDUyLDQ4MDU1LDQ4MDY0LDQ4MDY4LDQ4MDcyLDQ4MDgwLDQ4MDgzLDQ4MTIwLDQ4MTIxLDQ4MTI0LDQ4MTI3LDQ4MTI4LDQ4MTMwLDQ4MTM2LDQ4MTM3LDQ4MTM5LDQ4MTQwLDQ4MTQxLDQ4MTQzLDQ4MTQ1LDQ4MTQ4LDQ4MTQ5LDQ4MTUwLDQ4MTUxLDQ4MTUyLDQ4MTU1LDQ4MTU2LDQ4MTU3LDQ4MTU4LDQ4MTU5LDQ4MTY0LDQ4MTY1LDQ4MTY3LDQ4MTY5LDQ4MTczLDQ4MTc2LDQ4MTc3LDQ4MTgwLDQ4MTg0LDQ4MTkyLDQ4MTkzLDQ4MTk1LDQ4MTk2LDQ4MTk3LDQ4MjAxLDQ4MjA0LDQ4MjA1LDQ4MjA4LDQ4MjIxLDQ4MjYwLDQ4MjYxLDQ4MjY0LDQ4MjY3LDQ4MjY4LDQ4MjcwLDQ4Mjc2LDQ4Mjc3LDQ4Mjc5LDUzOTAxLDUzOTAyLDUzOTAzLDUzOTA2LDUzOTA3LDUzOTA4LDUzOTEwLDUzOTExLDUzOTEyLDUzOTEzLDUzOTE0LDUzOTE1LDUzOTE3LDUzOTE4LDUzOTE5LDUzOTIxLDUzOTIyLDUzOTIzLDUzOTI1LDUzOTI2LDUzOTI3LDUzOTI4LDUzOTI5LDUzOTMwLDUzOTMxLDUzOTMzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzOTM0LDUzOTM1LDUzOTM2LDUzOTM4LDUzOTM5LDUzOTQwLDUzOTQxLDUzOTQyLDUzOTQzLDUzOTQ2LDUzOTQ3LDUzOTQ5LDUzOTUwLDUzOTUzLDUzOTU1LDUzOTU2LDUzOTU3LDUzOTU4LDUzOTU5LDUzOTYyLDUzOTY0LDUzOTY1LDUzOTY2LDUzOTY3LDUzOTY4LDUzOTY5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzOTcwLDUzOTcxLDUzOTczLDUzOTc0LDUzOTc1LDUzOTc3LDUzOTc4LDUzOTc5LDUzOTgxLDUzOTgyLDUzOTgzLDUzOTg0LDUzOTg1LDUzOTg2LDUzOTg3LDUzOTkwLDUzOTkxLDUzOTkyLDUzOTkzLDUzOTk0LDUzOTk1LDUzOTk2LDUzOTk3LDUzOTk4LDUzOTk5LDU0MDAyLDU0MDAzLDU0MDA1LDU0MDA2LDU0MDA3LDU0MDA5LDU0MDEwLDQ4MjgxLDQ4MjgyLDQ4Mjg4LDQ4Mjg5LDQ4MjkyLDQ4Mjk1LDQ4Mjk2LDQ4MzA0LDQ4MzA1LDQ4MzA3LDQ4MzA4LDQ4MzA5LDQ4MzE2LDQ4MzE3LDQ4MzIwLDQ4MzI0LDQ4MzMzLDQ4MzM1LDQ4MzM2LDQ4MzM3LDQ4MzQxLDQ4MzQ0LDQ4MzQ4LDQ4MzcyLDQ4MzczLDQ4Mzc0LDQ4Mzc2LDQ4MzgwLDQ4Mzg4LDQ4Mzg5LDQ4MzkxLDQ4MzkzLDQ4NDAwLDQ4NDA0LDQ4NDIwLDQ4NDI4LDQ4NDQ4LDQ4NDU2LDQ4NDU3LDQ4NDYwLDQ4NDY0LDQ4NDcyLDQ4NDczLDQ4NDg0LDQ4NDg4LDQ4NTEyLDQ4NTEzLDQ4NTE2LDQ4NTE5LDQ4NTIwLDQ4NTIxLDQ4NTIyLDQ4NTI4LDQ4NTI5LDQ4NTMxLDQ4NTMzLDQ4NTM3LDQ4NTM4LDQ4NTQwLDQ4NTQ4LDQ4NTYwLDQ4NTY4LDQ4NTk2LDQ4NTk3LDQ4NjAwLDQ4NjA0LDQ4NjE3LDQ4NjI0LDQ4NjI4LDQ4NjMyLDQ4NjQwLDQ4NjQzLDQ4NjQ1LDQ4NjUyLDQ4NjUzLDQ4NjU2LDQ4NjYwLDQ4NjY4LDQ4NjY5LDQ4NjcxLDQ4NzA4LDQ4NzA5LDQ4NzEyLDQ4NzE2LDQ4NzE4LDQ4NzI0LDQ4NzI1LDQ4NzI3LDQ4NzI5LDQ4NzMwLDQ4NzMxLDQ4NzM2LDQ4NzM3LDQ4NzQwLDU0MDExLDU0MDEyLDU0MDEzLDU0MDE0LDU0MDE1LDU0MDE4LDU0MDIwLDU0MDIyLDU0MDIzLDU0MDI0LDU0MDI1LDU0MDI2LDU0MDI3LDU0MDMxLDU0MDMzLDU0MDM0LDU0MDM1LDU0MDM3LDU0MDM5LDU0MDQwLDU0MDQxLDU0MDQyLDU0MDQzLDU0MDQ2LDU0MDUwLDU0MDUxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0MDUyLDU0MDU0LDU0MDU1LDU0MDU4LDU0MDU5LDU0MDYxLDU0MDYyLDU0MDYzLDU0MDY1LDU0MDY2LDU0MDY3LDU0MDY4LDU0MDY5LDU0MDcwLDU0MDcxLDU0MDc0LDU0MDc4LDU0MDc5LDU0MDgwLDU0MDgxLDU0MDgyLDU0MDgzLDU0MDg2LDU0MDg3LDU0MDg4LDU0MDg5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0MDkwLDU0MDkxLDU0MDkyLDU0MDkzLDU0MDk0LDU0MDk1LDU0MDk2LDU0MDk3LDU0MDk4LDU0MDk5LDU0MTAwLDU0MTAxLDU0MTAyLDU0MTAzLDU0MTA0LDU0MTA1LDU0MTA2LDU0MTA3LDU0MTA4LDU0MTA5LDU0MTEwLDU0MTExLDU0MTEyLDU0MTEzLDU0MTE0LDU0MTE1LDU0MTE2LDU0MTE3LDU0MTE4LDU0MTE5LDU0MTIwLDU0MTIxLDQ4NzQ0LDQ4NzQ2LDQ4NzUyLDQ4NzUzLDQ4NzU1LDQ4NzU2LDQ4NzU3LDQ4NzYzLDQ4NzY0LDQ4NzY1LDQ4NzY4LDQ4NzcyLDQ4NzgwLDQ4NzgxLDQ4NzgzLDQ4Nzg0LDQ4Nzg1LDQ4NzkyLDQ4NzkzLDQ4ODA4LDQ4ODQ4LDQ4ODQ5LDQ4ODUyLDQ4ODU1LDQ4ODU2LDQ4ODY0LDQ4ODY3LDQ4ODY4LDQ4ODY5LDQ4ODc2LDQ4ODk3LDQ4OTA0LDQ4OTA1LDQ4OTIwLDQ4OTIxLDQ4OTIzLDQ4OTI0LDQ4OTI1LDQ4OTYwLDQ4OTYxLDQ4OTY0LDQ4OTY4LDQ4OTc2LDQ4OTc3LDQ4OTgxLDQ5MDQ0LDQ5MDcyLDQ5MDkzLDQ5MTAwLDQ5MTAxLDQ5MTA0LDQ5MTA4LDQ5MTE2LDQ5MTE5LDQ5MTIxLDQ5MjEyLDQ5MjMzLDQ5MjQwLDQ5MjQ0LDQ5MjQ4LDQ5MjU2LDQ5MjU3LDQ5Mjk2LDQ5Mjk3LDQ5MzAwLDQ5MzA0LDQ5MzEyLDQ5MzEzLDQ5MzE1LDQ5MzE3LDQ5MzI0LDQ5MzI1LDQ5MzI3LDQ5MzI4LDQ5MzMxLDQ5MzMyLDQ5MzMzLDQ5MzM0LDQ5MzQwLDQ5MzQxLDQ5MzQzLDQ5MzQ0LDQ5MzQ1LDQ5MzQ5LDQ5MzUyLDQ5MzUzLDQ5MzU2LDQ5MzYwLDQ5MzY4LDQ5MzY5LDQ5MzcxLDQ5MzcyLDQ5MzczLDQ5MzgwLDU0MTIyLDU0MTIzLDU0MTI0LDU0MTI1LDU0MTI2LDU0MTI3LDU0MTI4LDU0MTI5LDU0MTMwLDU0MTMxLDU0MTMyLDU0MTMzLDU0MTM0LDU0MTM1LDU0MTM2LDU0MTM3LDU0MTM4LDU0MTM5LDU0MTQyLDU0MTQzLDU0MTQ1LDU0MTQ2LDU0MTQ3LDU0MTQ5LDU0MTUwLDU0MTUxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0MTUyLDU0MTUzLDU0MTU0LDU0MTU1LDU0MTU4LDU0MTYyLDU0MTYzLDU0MTY0LDU0MTY1LDU0MTY2LDU0MTY3LDU0MTcwLDU0MTcxLDU0MTczLDU0MTc0LDU0MTc1LDU0MTc3LDU0MTc4LDU0MTc5LDU0MTgwLDU0MTgxLDU0MTgyLDU0MTgzLDU0MTg2LDU0MTg4LDU0MTkwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0MTkxLDU0MTkyLDU0MTkzLDU0MTk0LDU0MTk1LDU0MTk3LDU0MTk4LDU0MTk5LDU0MjAxLDU0MjAyLDU0MjAzLDU0MjA1LDU0MjA2LDU0MjA3LDU0MjA4LDU0MjA5LDU0MjEwLDU0MjExLDU0MjE0LDU0MjE1LDU0MjE4LDU0MjE5LDU0MjIwLDU0MjIxLDU0MjIyLDU0MjIzLDU0MjI1LDU0MjI2LDU0MjI3LDU0MjI4LDU0MjI5LDU0MjMwLDQ5MzgxLDQ5Mzg0LDQ5Mzg4LDQ5Mzk2LDQ5Mzk3LDQ5Mzk5LDQ5NDAxLDQ5NDA4LDQ5NDEyLDQ5NDE2LDQ5NDI0LDQ5NDI5LDQ5NDM2LDQ5NDM3LDQ5NDM4LDQ5NDM5LDQ5NDQwLDQ5NDQzLDQ5NDQ0LDQ5NDQ2LDQ5NDQ3LDQ5NDUyLDQ5NDUzLDQ5NDU1LDQ5NDU2LDQ5NDU3LDQ5NDYyLDQ5NDY0LDQ5NDY1LDQ5NDY4LDQ5NDcyLDQ5NDgwLDQ5NDgxLDQ5NDgzLDQ5NDg0LDQ5NDg1LDQ5NDkyLDQ5NDkzLDQ5NDk2LDQ5NTAwLDQ5NTA4LDQ5NTA5LDQ5NTExLDQ5NTEyLDQ5NTEzLDQ5NTIwLDQ5NTI0LDQ5NTI4LDQ5NTQxLDQ5NTQ4LDQ5NTQ5LDQ5NTUwLDQ5NTUyLDQ5NTU2LDQ5NTU4LDQ5NTY0LDQ5NTY1LDQ5NTY3LDQ5NTY5LDQ5NTczLDQ5NTc2LDQ5NTc3LDQ5NTgwLDQ5NTg0LDQ5NTk3LDQ5NjA0LDQ5NjA4LDQ5NjEyLDQ5NjIwLDQ5NjIzLDQ5NjI0LDQ5NjMyLDQ5NjM2LDQ5NjQwLDQ5NjQ4LDQ5NjQ5LDQ5NjUxLDQ5NjYwLDQ5NjYxLDQ5NjY0LDQ5NjY4LDQ5Njc2LDQ5Njc3LDQ5Njc5LDQ5NjgxLDQ5Njg4LDQ5Njg5LDQ5NjkyLDQ5Njk1LDQ5Njk2LDQ5NzA0LDQ5NzA1LDQ5NzA3LDQ5NzA5LDU0MjMxLDU0MjMzLDU0MjM0LDU0MjM1LDU0MjM2LDU0MjM3LDU0MjM4LDU0MjM5LDU0MjQwLDU0MjQyLDU0MjQ0LDU0MjQ1LDU0MjQ2LDU0MjQ3LDU0MjQ4LDU0MjQ5LDU0MjUwLDU0MjUxLDU0MjU0LDU0MjU1LDU0MjU3LDU0MjU4LDU0MjU5LDU0MjYxLDU0MjYyLDU0MjYzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0MjY0LDU0MjY1LDU0MjY2LDU0MjY3LDU0MjcwLDU0MjcyLDU0Mjc0LDU0Mjc1LDU0Mjc2LDU0Mjc3LDU0Mjc4LDU0Mjc5LDU0MjgxLDU0MjgyLDU0MjgzLDU0Mjg0LDU0Mjg1LDU0Mjg2LDU0Mjg3LDU0Mjg4LDU0Mjg5LDU0MjkwLDU0MjkxLDU0MjkyLDU0MjkzLDU0Mjk0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0Mjk1LDU0Mjk2LDU0Mjk3LDU0Mjk4LDU0Mjk5LDU0MzAwLDU0MzAyLDU0MzAzLDU0MzA0LDU0MzA1LDU0MzA2LDU0MzA3LDU0MzA4LDU0MzA5LDU0MzEwLDU0MzExLDU0MzEyLDU0MzEzLDU0MzE0LDU0MzE1LDU0MzE2LDU0MzE3LDU0MzE4LDU0MzE5LDU0MzIwLDU0MzIxLDU0MzIyLDU0MzIzLDU0MzI0LDU0MzI1LDU0MzI2LDU0MzI3LDQ5NzExLDQ5NzEzLDQ5NzE0LDQ5NzE2LDQ5NzM2LDQ5NzQ0LDQ5NzQ1LDQ5NzQ4LDQ5NzUyLDQ5NzYwLDQ5NzY1LDQ5NzcyLDQ5NzczLDQ5Nzc2LDQ5NzgwLDQ5Nzg4LDQ5Nzg5LDQ5NzkxLDQ5NzkzLDQ5ODAwLDQ5ODAxLDQ5ODA4LDQ5ODE2LDQ5ODE5LDQ5ODIxLDQ5ODI4LDQ5ODI5LDQ5ODMyLDQ5ODM2LDQ5ODM3LDQ5ODQ0LDQ5ODQ1LDQ5ODQ3LDQ5ODQ5LDQ5ODg0LDQ5ODg1LDQ5ODg4LDQ5ODkxLDQ5ODkyLDQ5ODk5LDQ5OTAwLDQ5OTAxLDQ5OTAzLDQ5OTA1LDQ5OTEwLDQ5OTEyLDQ5OTEzLDQ5OTE1LDQ5OTE2LDQ5OTIwLDQ5OTI4LDQ5OTI5LDQ5OTMyLDQ5OTMzLDQ5OTM5LDQ5OTQwLDQ5OTQxLDQ5OTQ0LDQ5OTQ4LDQ5OTU2LDQ5OTU3LDQ5OTYwLDQ5OTYxLDQ5OTg5LDUwMDI0LDUwMDI1LDUwMDI4LDUwMDMyLDUwMDM0LDUwMDQwLDUwMDQxLDUwMDQ0LDUwMDQ1LDUwMDUyLDUwMDU2LDUwMDYwLDUwMTEyLDUwMTM2LDUwMTM3LDUwMTQwLDUwMTQzLDUwMTQ0LDUwMTQ2LDUwMTUyLDUwMTUzLDUwMTU3LDUwMTY0LDUwMTY1LDUwMTY4LDUwMTg0LDUwMTkyLDUwMjEyLDUwMjIwLDUwMjI0LDU0MzI4LDU0MzI5LDU0MzMwLDU0MzMxLDU0MzMyLDU0MzMzLDU0MzM0LDU0MzM1LDU0MzM3LDU0MzM4LDU0MzM5LDU0MzQxLDU0MzQyLDU0MzQzLDU0MzQ0LDU0MzQ1LDU0MzQ2LDU0MzQ3LDU0MzQ4LDU0MzQ5LDU0MzUwLDU0MzUxLDU0MzUyLDU0MzUzLDU0MzU0LDU0MzU1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0MzU2LDU0MzU3LDU0MzU4LDU0MzU5LDU0MzYwLDU0MzYxLDU0MzYyLDU0MzYzLDU0MzY1LDU0MzY2LDU0MzY3LDU0MzY5LDU0MzcwLDU0MzcxLDU0MzczLDU0Mzc0LDU0Mzc1LDU0Mzc2LDU0Mzc3LDU0Mzc4LDU0Mzc5LDU0MzgwLDU0MzgyLDU0Mzg0LDU0Mzg1LDU0Mzg2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0Mzg3LDU0Mzg4LDU0Mzg5LDU0MzkwLDU0MzkxLDU0Mzk0LDU0Mzk1LDU0Mzk3LDU0Mzk4LDU0NDAxLDU0NDAzLDU0NDA0LDU0NDA1LDU0NDA2LDU0NDA3LDU0NDEwLDU0NDEyLDU0NDE0LDU0NDE1LDU0NDE2LDU0NDE3LDU0NDE4LDU0NDE5LDU0NDIxLDU0NDIyLDU0NDIzLDU0NDI0LDU0NDI1LDU0NDI2LDU0NDI3LDU0NDI4LDU0NDI5LDUwMjI4LDUwMjM2LDUwMjM3LDUwMjQ4LDUwMjc2LDUwMjc3LDUwMjgwLDUwMjg0LDUwMjkyLDUwMjkzLDUwMjk3LDUwMzA0LDUwMzI0LDUwMzMyLDUwMzYwLDUwMzY0LDUwNDA5LDUwNDE2LDUwNDE3LDUwNDIwLDUwNDI0LDUwNDI2LDUwNDMxLDUwNDMyLDUwNDMzLDUwNDQ0LDUwNDQ4LDUwNDUyLDUwNDYwLDUwNDcyLDUwNDczLDUwNDc2LDUwNDgwLDUwNDg4LDUwNDg5LDUwNDkxLDUwNDkzLDUwNTAwLDUwNTAxLDUwNTA0LDUwNTA1LDUwNTA2LDUwNTA4LDUwNTA5LDUwNTEwLDUwNTE1LDUwNTE2LDUwNTE3LDUwNTE5LDUwNTIwLDUwNTIxLDUwNTI1LDUwNTI2LDUwNTI4LDUwNTI5LDUwNTMyLDUwNTM2LDUwNTQ0LDUwNTQ1LDUwNTQ3LDUwNTQ4LDUwNTQ5LDUwNTU2LDUwNTU3LDUwNTYwLDUwNTY0LDUwNTY3LDUwNTcyLDUwNTczLDUwNTc1LDUwNTc3LDUwNTgxLDUwNTgzLDUwNTg0LDUwNTg4LDUwNTkyLDUwNjAxLDUwNjEyLDUwNjEzLDUwNjE2LDUwNjE3LDUwNjE5LDUwNjIwLDUwNjIxLDUwNjIyLDUwNjI4LDUwNjI5LDUwNjMwLDUwNjMxLDUwNjMyLDUwNjMzLDUwNjM0LDUwNjM2LDUwNjM4LDU0NDMwLDU0NDMxLDU0NDMyLDU0NDMzLDU0NDM0LDU0NDM1LDU0NDM2LDU0NDM3LDU0NDM4LDU0NDM5LDU0NDQwLDU0NDQyLDU0NDQzLDU0NDQ0LDU0NDQ1LDU0NDQ2LDU0NDQ3LDU0NDQ4LDU0NDQ5LDU0NDUwLDU0NDUxLDU0NDUyLDU0NDUzLDU0NDU0LDU0NDU1LDU0NDU2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0NDU3LDU0NDU4LDU0NDU5LDU0NDYwLDU0NDYxLDU0NDYyLDU0NDYzLDU0NDY0LDU0NDY1LDU0NDY2LDU0NDY3LDU0NDY4LDU0NDY5LDU0NDcwLDU0NDcxLDU0NDcyLDU0NDczLDU0NDc0LDU0NDc1LDU0NDc3LDU0NDc4LDU0NDc5LDU0NDgxLDU0NDgyLDU0NDgzLDU0NDg1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0NDg2LDU0NDg3LDU0NDg4LDU0NDg5LDU0NDkwLDU0NDkxLDU0NDkzLDU0NDk0LDU0NDk2LDU0NDk3LDU0NDk4LDU0NDk5LDU0NTAwLDU0NTAxLDU0NTAyLDU0NTAzLDU0NTA1LDU0NTA2LDU0NTA3LDU0NTA5LDU0NTEwLDU0NTExLDU0NTEzLDU0NTE0LDU0NTE1LDU0NTE2LDU0NTE3LDU0NTE4LDU0NTE5LDU0NTIxLDU0NTIyLDU0NTI0LDUwNjQwLDUwNjQxLDUwNjQ0LDUwNjQ4LDUwNjU2LDUwNjU3LDUwNjU5LDUwNjYxLDUwNjY4LDUwNjY5LDUwNjcwLDUwNjcyLDUwNjc2LDUwNjc4LDUwNjc5LDUwNjg0LDUwNjg1LDUwNjg2LDUwNjg3LDUwNjg4LDUwNjg5LDUwNjkzLDUwNjk0LDUwNjk1LDUwNjk2LDUwNzAwLDUwNzA0LDUwNzEyLDUwNzEzLDUwNzE1LDUwNzE2LDUwNzI0LDUwNzI1LDUwNzI4LDUwNzMyLDUwNzMzLDUwNzM0LDUwNzM2LDUwNzM5LDUwNzQwLDUwNzQxLDUwNzQzLDUwNzQ1LDUwNzQ3LDUwNzUyLDUwNzUzLDUwNzU2LDUwNzYwLDUwNzY4LDUwNzY5LDUwNzcxLDUwNzcyLDUwNzczLDUwNzgwLDUwNzgxLDUwNzg0LDUwNzk2LDUwNzk5LDUwODAxLDUwODA4LDUwODA5LDUwODEyLDUwODE2LDUwODI0LDUwODI1LDUwODI3LDUwODI5LDUwODM2LDUwODM3LDUwODQwLDUwODQ0LDUwODUyLDUwODUzLDUwODU1LDUwODU3LDUwODY0LDUwODY1LDUwODY4LDUwODcyLDUwODczLDUwODc0LDUwODgwLDUwODgxLDUwODgzLDUwODg1LDUwODkyLDUwODkzLDUwODk2LDUwOTAwLDUwOTA4LDUwOTA5LDUwOTEyLDUwOTEzLDUwOTIwLDU0NTI2LDU0NTI3LDU0NTI4LDU0NTI5LDU0NTMwLDU0NTMxLDU0NTMzLDU0NTM0LDU0NTM1LDU0NTM3LDU0NTM4LDU0NTM5LDU0NTQxLDU0NTQyLDU0NTQzLDU0NTQ0LDU0NTQ1LDU0NTQ2LDU0NTQ3LDU0NTUwLDU0NTUyLDU0NTUzLDU0NTU0LDU0NTU1LDU0NTU2LDU0NTU3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0NTU4LDU0NTU5LDU0NTYwLDU0NTYxLDU0NTYyLDU0NTYzLDU0NTY0LDU0NTY1LDU0NTY2LDU0NTY3LDU0NTY4LDU0NTY5LDU0NTcwLDU0NTcxLDU0NTcyLDU0NTczLDU0NTc0LDU0NTc1LDU0NTc2LDU0NTc3LDU0NTc4LDU0NTc5LDU0NTgwLDU0NTgxLDU0NTgyLDU0NTgzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0NTg0LDU0NTg1LDU0NTg2LDU0NTg3LDU0NTkwLDU0NTkxLDU0NTkzLDU0NTk0LDU0NTk1LDU0NTk3LDU0NTk4LDU0NTk5LDU0NjAwLDU0NjAxLDU0NjAyLDU0NjAzLDU0NjA2LDU0NjA4LDU0NjEwLDU0NjExLDU0NjEyLDU0NjEzLDU0NjE0LDU0NjE1LDU0NjE4LDU0NjE5LDU0NjIxLDU0NjIyLDU0NjIzLDU0NjI1LDU0NjI2LDU0NjI3LDUwOTIxLDUwOTI0LDUwOTI4LDUwOTM2LDUwOTM3LDUwOTQxLDUwOTQ4LDUwOTQ5LDUwOTUyLDUwOTU2LDUwOTY0LDUwOTY1LDUwOTY3LDUwOTY5LDUwOTc2LDUwOTc3LDUwOTgwLDUwOTg0LDUwOTkyLDUwOTkzLDUwOTk1LDUwOTk3LDUwOTk5LDUxMDA0LDUxMDA1LDUxMDA4LDUxMDEyLDUxMDE4LDUxMDIwLDUxMDIxLDUxMDIzLDUxMDI1LDUxMDI2LDUxMDI3LDUxMDI4LDUxMDI5LDUxMDMwLDUxMDMxLDUxMDMyLDUxMDM2LDUxMDQwLDUxMDQ4LDUxMDUxLDUxMDYwLDUxMDYxLDUxMDY0LDUxMDY4LDUxMDY5LDUxMDcwLDUxMDc1LDUxMDc2LDUxMDc3LDUxMDc5LDUxMDgwLDUxMDgxLDUxMDgyLDUxMDg2LDUxMDg4LDUxMDg5LDUxMDkyLDUxMDk0LDUxMDk1LDUxMDk2LDUxMDk4LDUxMTA0LDUxMTA1LDUxMTA3LDUxMTA4LDUxMTA5LDUxMTEwLDUxMTE2LDUxMTE3LDUxMTIwLDUxMTI0LDUxMTMyLDUxMTMzLDUxMTM1LDUxMTM2LDUxMTM3LDUxMTQ0LDUxMTQ1LDUxMTQ4LDUxMTUwLDUxMTUyLDUxMTYwLDUxMTY1LDUxMTcyLDUxMTc2LDUxMTgwLDUxMjAwLDUxMjAxLDUxMjA0LDUxMjA4LDUxMjEwLDU0NjI4LDU0NjMwLDU0NjMxLDU0NjM0LDU0NjM2LDU0NjM4LDU0NjM5LDU0NjQwLDU0NjQxLDU0NjQyLDU0NjQzLDU0NjQ2LDU0NjQ3LDU0NjQ5LDU0NjUwLDU0NjUxLDU0NjUzLDU0NjU0LDU0NjU1LDU0NjU2LDU0NjU3LDU0NjU4LDU0NjU5LDU0NjYyLDU0NjY2LDU0NjY3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0NjY4LDU0NjY5LDU0NjcwLDU0NjcxLDU0NjczLDU0Njc0LDU0Njc1LDU0Njc2LDU0Njc3LDU0Njc4LDU0Njc5LDU0NjgwLDU0NjgxLDU0NjgyLDU0NjgzLDU0Njg0LDU0Njg1LDU0Njg2LDU0Njg3LDU0Njg4LDU0Njg5LDU0NjkwLDU0NjkxLDU0NjkyLDU0Njk0LDU0Njk1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0Njk2LDU0Njk3LDU0Njk4LDU0Njk5LDU0NzAwLDU0NzAxLDU0NzAyLDU0NzAzLDU0NzA0LDU0NzA1LDU0NzA2LDU0NzA3LDU0NzA4LDU0NzA5LDU0NzEwLDU0NzExLDU0NzEyLDU0NzEzLDU0NzE0LDU0NzE1LDU0NzE2LDU0NzE3LDU0NzE4LDU0NzE5LDU0NzIwLDU0NzIxLDU0NzIyLDU0NzIzLDU0NzI0LDU0NzI1LDU0NzI2LDU0NzI3LDUxMjE2LDUxMjE3LDUxMjE5LDUxMjIxLDUxMjIyLDUxMjI4LDUxMjI5LDUxMjMyLDUxMjM2LDUxMjQ0LDUxMjQ1LDUxMjQ3LDUxMjQ5LDUxMjU2LDUxMjYwLDUxMjY0LDUxMjcyLDUxMjczLDUxMjc2LDUxMjc3LDUxMjg0LDUxMzEyLDUxMzEzLDUxMzE2LDUxMzIwLDUxMzIyLDUxMzI4LDUxMzI5LDUxMzMxLDUxMzMzLDUxMzM0LDUxMzM1LDUxMzM5LDUxMzQwLDUxMzQxLDUxMzQ4LDUxMzU3LDUxMzU5LDUxMzYxLDUxMzY4LDUxMzg4LDUxMzg5LDUxMzk2LDUxNDAwLDUxNDA0LDUxNDEyLDUxNDEzLDUxNDE1LDUxNDE3LDUxNDI0LDUxNDI1LDUxNDI4LDUxNDQ1LDUxNDUyLDUxNDUzLDUxNDU2LDUxNDYwLDUxNDYxLDUxNDYyLDUxNDY4LDUxNDY5LDUxNDcxLDUxNDczLDUxNDgwLDUxNTAwLDUxNTA4LDUxNTM2LDUxNTM3LDUxNTQwLDUxNTQ0LDUxNTUyLDUxNTUzLDUxNTU1LDUxNTY0LDUxNTY4LDUxNTcyLDUxNTgwLDUxNTkyLDUxNTkzLDUxNTk2LDUxNjAwLDUxNjA4LDUxNjA5LDUxNjExLDUxNjEzLDUxNjQ4LDUxNjQ5LDUxNjUyLDUxNjU1LDUxNjU2LDUxNjU4LDUxNjY0LDUxNjY1LDUxNjY3LDU0NzMwLDU0NzMxLDU0NzMzLDU0NzM0LDU0NzM1LDU0NzM3LDU0NzM5LDU0NzQwLDU0NzQxLDU0NzQyLDU0NzQzLDU0NzQ2LDU0NzQ4LDU0NzUwLDU0NzUxLDU0NzUyLDU0NzUzLDU0NzU0LDU0NzU1LDU0NzU4LDU0NzU5LDU0NzYxLDU0NzYyLDU0NzYzLDU0NzY1LDU0NzY2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0NzY3LDU0NzY4LDU0NzY5LDU0NzcwLDU0NzcxLDU0Nzc0LDU0Nzc2LDU0Nzc4LDU0Nzc5LDU0NzgwLDU0NzgxLDU0NzgyLDU0NzgzLDU0Nzg2LDU0Nzg3LDU0Nzg5LDU0NzkwLDU0NzkxLDU0NzkzLDU0Nzk0LDU0Nzk1LDU0Nzk2LDU0Nzk3LDU0Nzk4LDU0Nzk5LDU0ODAyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0ODA2LDU0ODA3LDU0ODA4LDU0ODA5LDU0ODEwLDU0ODExLDU0ODEzLDU0ODE0LDU0ODE1LDU0ODE3LDU0ODE4LDU0ODE5LDU0ODIxLDU0ODIyLDU0ODIzLDU0ODI0LDU0ODI1LDU0ODI2LDU0ODI3LDU0ODI4LDU0ODMwLDU0ODMxLDU0ODMyLDU0ODMzLDU0ODM0LDU0ODM1LDU0ODM2LDU0ODM3LDU0ODM4LDU0ODM5LDU0ODQyLDU0ODQzLDUxNjY5LDUxNjcwLDUxNjczLDUxNjc0LDUxNjc2LDUxNjc3LDUxNjgwLDUxNjgyLDUxNjg0LDUxNjg3LDUxNjkyLDUxNjkzLDUxNjk1LDUxNjk2LDUxNjk3LDUxNzA0LDUxNzA1LDUxNzA4LDUxNzEyLDUxNzIwLDUxNzIxLDUxNzIzLDUxNzI0LDUxNzI1LDUxNzMyLDUxNzM2LDUxNzUzLDUxNzg4LDUxNzg5LDUxNzkyLDUxNzk2LDUxODA0LDUxODA1LDUxODA3LDUxODA4LDUxODA5LDUxODE2LDUxODM3LDUxODQ0LDUxODY0LDUxOTAwLDUxOTAxLDUxOTA0LDUxOTA4LDUxOTE2LDUxOTE3LDUxOTE5LDUxOTIxLDUxOTIzLDUxOTI4LDUxOTI5LDUxOTM2LDUxOTQ4LDUxOTU2LDUxOTc2LDUxOTg0LDUxOTg4LDUxOTkyLDUyMDAwLDUyMDAxLDUyMDMzLDUyMDQwLDUyMDQxLDUyMDQ0LDUyMDQ4LDUyMDU2LDUyMDU3LDUyMDYxLDUyMDY4LDUyMDg4LDUyMDg5LDUyMTI0LDUyMTUyLDUyMTgwLDUyMTk2LDUyMTk5LDUyMjAxLDUyMjM2LDUyMjM3LDUyMjQwLDUyMjQ0LDUyMjUyLDUyMjUzLDUyMjU3LDUyMjU4LDUyMjYzLDUyMjY0LDUyMjY1LDUyMjY4LDUyMjcwLDUyMjcyLDUyMjgwLDUyMjgxLDUyMjgzLDU0ODQ1LDU0ODQ2LDU0ODQ3LDU0ODQ5LDU0ODUwLDU0ODUxLDU0ODUyLDU0ODU0LDU0ODU1LDU0ODU4LDU0ODYwLDU0ODYyLDU0ODYzLDU0ODY0LDU0ODY2LDU0ODY3LDU0ODcwLDU0ODcxLDU0ODczLDU0ODc0LDU0ODc1LDU0ODc3LDU0ODc4LDU0ODc5LDU0ODgwLDU0ODgxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0ODgyLDU0ODgzLDU0ODg0LDU0ODg1LDU0ODg2LDU0ODg4LDU0ODkwLDU0ODkxLDU0ODkyLDU0ODkzLDU0ODk0LDU0ODk1LDU0ODk4LDU0ODk5LDU0OTAxLDU0OTAyLDU0OTAzLDU0OTA0LDU0OTA1LDU0OTA2LDU0OTA3LDU0OTA4LDU0OTA5LDU0OTEwLDU0OTExLDU0OTEyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0OTEzLDU0OTE0LDU0OTE2LDU0OTE4LDU0OTE5LDU0OTIwLDU0OTIxLDU0OTIyLDU0OTIzLDU0OTI2LDU0OTI3LDU0OTI5LDU0OTMwLDU0OTMxLDU0OTMzLDU0OTM0LDU0OTM1LDU0OTM2LDU0OTM3LDU0OTM4LDU0OTM5LDU0OTQwLDU0OTQyLDU0OTQ0LDU0OTQ2LDU0OTQ3LDU0OTQ4LDU0OTQ5LDU0OTUwLDU0OTUxLDU0OTUzLDU0OTU0LDUyMjg0LDUyMjg1LDUyMjg2LDUyMjkyLDUyMjkzLDUyMjk2LDUyMzAwLDUyMzA4LDUyMzA5LDUyMzExLDUyMzEyLDUyMzEzLDUyMzIwLDUyMzI0LDUyMzI2LDUyMzI4LDUyMzM2LDUyMzQxLDUyMzc2LDUyMzc3LDUyMzgwLDUyMzg0LDUyMzkyLDUyMzkzLDUyMzk1LDUyMzk2LDUyMzk3LDUyNDA0LDUyNDA1LDUyNDA4LDUyNDEyLDUyNDIwLDUyNDIxLDUyNDIzLDUyNDI1LDUyNDMyLDUyNDM2LDUyNDUyLDUyNDYwLDUyNDY0LDUyNDgxLDUyNDg4LDUyNDg5LDUyNDkyLDUyNDk2LDUyNTA0LDUyNTA1LDUyNTA3LDUyNTA5LDUyNTE2LDUyNTIwLDUyNTI0LDUyNTM3LDUyNTcyLDUyNTc2LDUyNTgwLDUyNTg4LDUyNTg5LDUyNTkxLDUyNTkzLDUyNjAwLDUyNjE2LDUyNjI4LDUyNjI5LDUyNjMyLDUyNjM2LDUyNjQ0LDUyNjQ1LDUyNjQ3LDUyNjQ5LDUyNjU2LDUyNjc2LDUyNjg0LDUyNjg4LDUyNzEyLDUyNzE2LDUyNzIwLDUyNzI4LDUyNzI5LDUyNzMxLDUyNzMzLDUyNzQwLDUyNzQ0LDUyNzQ4LDUyNzU2LDUyNzYxLDUyNzY4LDUyNzY5LDUyNzcyLDUyNzc2LDUyNzg0LDUyNzg1LDUyNzg3LDUyNzg5LDU0OTU1LDU0OTU3LDU0OTU4LDU0OTU5LDU0OTYxLDU0OTYyLDU0OTYzLDU0OTY0LDU0OTY1LDU0OTY2LDU0OTY3LDU0OTY4LDU0OTcwLDU0OTcyLDU0OTczLDU0OTc0LDU0OTc1LDU0OTc2LDU0OTc3LDU0OTc4LDU0OTc5LDU0OTgyLDU0OTgzLDU0OTg1LDU0OTg2LDU0OTg3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0OTg5LDU0OTkwLDU0OTkxLDU0OTkyLDU0OTk0LDU0OTk1LDU0OTk3LDU0OTk4LDU1MDAwLDU1MDAyLDU1MDAzLDU1MDA0LDU1MDA1LDU1MDA2LDU1MDA3LDU1MDA5LDU1MDEwLDU1MDExLDU1MDEzLDU1MDE0LDU1MDE1LDU1MDE3LDU1MDE4LDU1MDE5LDU1MDIwLDU1MDIxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU1MDIyLDU1MDIzLDU1MDI1LDU1MDI2LDU1MDI3LDU1MDI4LDU1MDMwLDU1MDMxLDU1MDMyLDU1MDMzLDU1MDM0LDU1MDM1LDU1MDM4LDU1MDM5LDU1MDQxLDU1MDQyLDU1MDQzLDU1MDQ1LDU1MDQ2LDU1MDQ3LDU1MDQ4LDU1MDQ5LDU1MDUwLDU1MDUxLDU1MDUyLDU1MDUzLDU1MDU0LDU1MDU1LDU1MDU2LDU1MDU4LDU1MDU5LDU1MDYwLDUyODI0LDUyODI1LDUyODI4LDUyODMxLDUyODMyLDUyODMzLDUyODQwLDUyODQxLDUyODQzLDUyODQ1LDUyODUyLDUyODUzLDUyODU2LDUyODYwLDUyODY4LDUyODY5LDUyODcxLDUyODczLDUyODgwLDUyODgxLDUyODg0LDUyODg4LDUyODk2LDUyODk3LDUyODk5LDUyOTAwLDUyOTAxLDUyOTA4LDUyOTA5LDUyOTI5LDUyOTY0LDUyOTY1LDUyOTY4LDUyOTcxLDUyOTcyLDUyOTgwLDUyOTgxLDUyOTgzLDUyOTg0LDUyOTg1LDUyOTkyLDUyOTkzLDUyOTk2LDUzMDAwLDUzMDA4LDUzMDA5LDUzMDExLDUzMDEzLDUzMDIwLDUzMDI0LDUzMDI4LDUzMDM2LDUzMDM3LDUzMDM5LDUzMDQwLDUzMDQxLDUzMDQ4LDUzMDc2LDUzMDc3LDUzMDgwLDUzMDg0LDUzMDkyLDUzMDkzLDUzMDk1LDUzMDk3LDUzMTA0LDUzMTA1LDUzMTA4LDUzMTEyLDUzMTIwLDUzMTI1LDUzMTMyLDUzMTUzLDUzMTYwLDUzMTY4LDUzMTg4LDUzMjE2LDUzMjE3LDUzMjIwLDUzMjI0LDUzMjMyLDUzMjMzLDUzMjM1LDUzMjM3LDUzMjQ0LDUzMjQ4LDUzMjUyLDUzMjY1LDUzMjcyLDUzMjkzLDUzMzAwLDUzMzAxLDUzMzA0LDUzMzA4LDU1MDYxLDU1MDYyLDU1MDYzLDU1MDY2LDU1MDY3LDU1MDY5LDU1MDcwLDU1MDcxLDU1MDczLDU1MDc0LDU1MDc1LDU1MDc2LDU1MDc3LDU1MDc4LDU1MDc5LDU1MDgyLDU1MDg0LDU1MDg2LDU1MDg3LDU1MDg4LDU1MDg5LDU1MDkwLDU1MDkxLDU1MDk0LDU1MDk1LDU1MDk3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU1MDk4LDU1MDk5LDU1MTAxLDU1MTAyLDU1MTAzLDU1MTA0LDU1MTA1LDU1MTA2LDU1MTA3LDU1MTA5LDU1MTEwLDU1MTEyLDU1MTE0LDU1MTE1LDU1MTE2LDU1MTE3LDU1MTE4LDU1MTE5LDU1MTIyLDU1MTIzLDU1MTI1LDU1MTMwLDU1MTMxLDU1MTMyLDU1MTMzLDU1MTM0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU1MTM1LDU1MTM4LDU1MTQwLDU1MTQyLDU1MTQzLDU1MTQ0LDU1MTQ2LDU1MTQ3LDU1MTQ5LDU1MTUwLDU1MTUxLDU1MTUzLDU1MTU0LDU1MTU1LDU1MTU3LDU1MTU4LDU1MTU5LDU1MTYwLDU1MTYxLDU1MTYyLDU1MTYzLDU1MTY2LDU1MTY3LDU1MTY4LDU1MTcwLDU1MTcxLDU1MTcyLDU1MTczLDU1MTc0LDU1MTc1LDU1MTc4LDU1MTc5LDUzMzE2LDUzMzE3LDUzMzE5LDUzMzIxLDUzMzI4LDUzMzMyLDUzMzM2LDUzMzQ0LDUzMzU2LDUzMzU3LDUzMzYwLDUzMzY0LDUzMzcyLDUzMzczLDUzMzc3LDUzNDEyLDUzNDEzLDUzNDE2LDUzNDIwLDUzNDI4LDUzNDI5LDUzNDMxLDUzNDMzLDUzNDQwLDUzNDQxLDUzNDQ0LDUzNDQ4LDUzNDQ5LDUzNDU2LDUzNDU3LDUzNDU5LDUzNDYwLDUzNDYxLDUzNDY4LDUzNDY5LDUzNDcyLDUzNDc2LDUzNDg0LDUzNDg1LDUzNDg3LDUzNDg4LDUzNDg5LDUzNDk2LDUzNTE3LDUzNTUyLDUzNTUzLDUzNTU2LDUzNTYwLDUzNTYyLDUzNTY4LDUzNTY5LDUzNTcxLDUzNTcyLDUzNTczLDUzNTgwLDUzNTgxLDUzNTg0LDUzNTg4LDUzNTk2LDUzNTk3LDUzNTk5LDUzNjAxLDUzNjA4LDUzNjEyLDUzNjI4LDUzNjM2LDUzNjQwLDUzNjY0LDUzNjY1LDUzNjY4LDUzNjcyLDUzNjgwLDUzNjgxLDUzNjgzLDUzNjg1LDUzNjkwLDUzNjkyLDUzNjk2LDUzNzIwLDUzNzQ4LDUzNzUyLDUzNzY3LDUzNzY5LDUzNzc2LDUzODA0LDUzODA1LDUzODA4LDUzODEyLDUzODIwLDUzODIxLDUzODIzLDUzODI1LDUzODMyLDUzODUyLDU1MTgxLDU1MTgyLDU1MTgzLDU1MTg1LDU1MTg2LDU1MTg3LDU1MTg4LDU1MTg5LDU1MTkwLDU1MTkxLDU1MTk0LDU1MTk2LDU1MTk4LDU1MTk5LDU1MjAwLDU1MjAxLDU1MjAyLDU1MjAzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUzODYwLDUzODg4LDUzODg5LDUzODkyLDUzODk2LDUzOTA0LDUzOTA1LDUzOTA5LDUzOTE2LDUzOTIwLDUzOTI0LDUzOTMyLDUzOTM3LDUzOTQ0LDUzOTQ1LDUzOTQ4LDUzOTUxLDUzOTUyLDUzOTU0LDUzOTYwLDUzOTYxLDUzOTYzLDUzOTcyLDUzOTc2LDUzOTgwLDUzOTg4LDUzOTg5LDU0MDAwLDU0MDAxLDU0MDA0LDU0MDA4LDU0MDE2LDU0MDE3LDU0MDE5LDU0MDIxLDU0MDI4LDU0MDI5LDU0MDMwLDU0MDMyLDU0MDM2LDU0MDM4LDU0MDQ0LDU0MDQ1LDU0MDQ3LDU0MDQ4LDU0MDQ5LDU0MDUzLDU0MDU2LDU0MDU3LDU0MDYwLDU0MDY0LDU0MDcyLDU0MDczLDU0MDc1LDU0MDc2LDU0MDc3LDU0MDg0LDU0MDg1LDU0MTQwLDU0MTQxLDU0MTQ0LDU0MTQ4LDU0MTU2LDU0MTU3LDU0MTU5LDU0MTYwLDU0MTYxLDU0MTY4LDU0MTY5LDU0MTcyLDU0MTc2LDU0MTg0LDU0MTg1LDU0MTg3LDU0MTg5LDU0MTk2LDU0MjAwLDU0MjA0LDU0MjEyLDU0MjEzLDU0MjE2LDU0MjE3LDU0MjI0LDU0MjMyLDU0MjQxLDU0MjQzLDU0MjUyLDU0MjUzLDU0MjU2LDU0MjYwLDU0MjY4LDU0MjY5LDU0MjcxLDU0MjczLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0MjgwLDU0MzAxLDU0MzM2LDU0MzQwLDU0MzY0LDU0MzY4LDU0MzcyLDU0MzgxLDU0MzgzLDU0MzkyLDU0MzkzLDU0Mzk2LDU0Mzk5LDU0NDAwLDU0NDAyLDU0NDA4LDU0NDA5LDU0NDExLDU0NDEzLDU0NDIwLDU0NDQxLDU0NDc2LDU0NDgwLDU0NDg0LDU0NDkyLDU0NDk1LDU0NTA0LDU0NTA4LDU0NTEyLDU0NTIwLDU0NTIzLDU0NTI1LDU0NTMyLDU0NTM2LDU0NTQwLDU0NTQ4LDU0NTQ5LDU0NTUxLDU0NTg4LDU0NTg5LDU0NTkyLDU0NTk2LDU0NjA0LDU0NjA1LDU0NjA3LDU0NjA5LDU0NjE2LDU0NjE3LDU0NjIwLDU0NjI0LDU0NjI5LDU0NjMyLDU0NjMzLDU0NjM1LDU0NjM3LDU0NjQ0LDU0NjQ1LDU0NjQ4LDU0NjUyLDU0NjYwLDU0NjYxLDU0NjYzLDU0NjY0LDU0NjY1LDU0NjcyLDU0NjkzLDU0NzI4LDU0NzI5LDU0NzMyLDU0NzM2LDU0NzM4LDU0NzQ0LDU0NzQ1LDU0NzQ3LDU0NzQ5LDU0NzU2LDU0NzU3LDU0NzYwLDU0NzY0LDU0NzcyLDU0NzczLDU0Nzc1LDU0Nzc3LDU0Nzg0LDU0Nzg1LDU0Nzg4LDU0NzkyLDU0ODAwLDU0ODAxLDU0ODAzLDU0ODA0LDU0ODA1LDU0ODEyLDU0ODE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDU0ODIwLDU0ODI5LDU0ODQwLDU0ODQxLDU0ODQ0LDU0ODQ4LDU0ODUzLDU0ODU2LDU0ODU3LDU0ODU5LDU0ODYxLDU0ODY1LDU0ODY4LDU0ODY5LDU0ODcyLDU0ODc2LDU0ODg3LDU0ODg5LDU0ODk2LDU0ODk3LDU0OTAwLDU0OTE1LDU0OTE3LDU0OTI0LDU0OTI1LDU0OTI4LDU0OTMyLDU0OTQxLDU0OTQzLDU0OTQ1LDU0OTUyLDU0OTU2LDU0OTYwLDU0OTY5LDU0OTcxLDU0OTgwLDU0OTgxLDU0OTg0LDU0OTg4LDU0OTkzLDU0OTk2LDU0OTk5LDU1MDAxLDU1MDA4LDU1MDEyLDU1MDE2LDU1MDI0LDU1MDI5LDU1MDM2LDU1MDM3LDU1MDQwLDU1MDQ0LDU1MDU3LDU1MDY0LDU1MDY1LDU1MDY4LDU1MDcyLDU1MDgwLDU1MDgxLDU1MDgzLDU1MDg1LDU1MDkyLDU1MDkzLDU1MDk2LDU1MTAwLDU1MTA4LDU1MTExLDU1MTEzLDU1MTIwLDU1MTIxLDU1MTI0LDU1MTI2LDU1MTI3LDU1MTI4LDU1MTI5LDU1MTM2LDU1MTM3LDU1MTM5LDU1MTQxLDU1MTQ1LDU1MTQ4LDU1MTUyLDU1MTU2LDU1MTY0LDU1MTY1LDU1MTY5LDU1MTc2LDU1MTc3LDU1MTgwLDU1MTg0LDU1MTkyLDU1MTkzLDU1MTk1LDU1MTk3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjAyODUsMjAzMzksMjA1NTEsMjA3MjksMjExNTIsMjE0ODcsMjE2MjEsMjE3MzMsMjIwMjUsMjMyMzMsMjM0NzgsMjYyNDcsMjY1NTAsMjY1NTEsMjY2MDcsMjc0NjgsMjk2MzQsMzAxNDYsMzEyOTIsMzM0OTksMzM1NDAsMzQ5MDMsMzQ5NTIsMzUzODIsMzYwNDAsMzYzMDMsMzY2MDMsMzY4MzgsMzkzODEsMjEwNTEsMjEzNjQsMjE1MDgsMjQ2ODIsMjQ5MzIsMjc1ODAsMjk2NDcsMzMwNTAsMzUyNTgsMzUyODIsMzgzMDcsMjAzNTUsMjEwMDIsMjI3MTgsMjI5MDQsMjMwMTQsMjQxNzgsMjQxODUsMjUwMzEsMjU1MzYsMjY0MzgsMjY2MDQsMjY3NTEsMjg1NjcsMzAyODYsMzA0NzUsMzA5NjUsMzEyNDAsMzE0ODcsMzE3NzcsMzI5MjUsMzMzOTAsMzMzOTMsMzU1NjMsMzgyOTEsMjAwNzUsMjE5MTcsMjYzNTksMjgyMTIsMzA4ODMsMzE0NjksMzM4ODMsMzUwODgsMzQ2MzgsMzg4MjQsMjEyMDgsMjIzNTAsMjI1NzAsMjM4ODQsMjQ4NjMsMjUwMjIsMjUxMjEsMjU5NTQsMjY1NzcsMjcyMDQsMjgxODcsMjk5NzYsMzAxMzEsMzA0MzUsMzA2NDAsMzIwNTgsMzcwMzksMzc5NjksMzc5NzAsNDA4NTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjEyODMsMjM3MjQsMzAwMDIsMzI5ODcsMzc0NDAsMzgyOTYsMjEwODMsMjI1MzYsMjMwMDQsMjM3MTMsMjM4MzEsMjQyNDcsMjQzNzgsMjQzOTQsMjQ5NTEsMjc3NDMsMzAwNzQsMzAwODYsMzE5NjgsMzIxMTUsMzIxNzcsMzI2NTIsMzMxMDgsMzMzMTMsMzQxOTMsMzUxMzcsMzU2MTEsMzc2MjgsMzg0NzcsNDAwMDcsMjAxNzEsMjAyMTUsMjA0OTEsMjA5NzcsMjI2MDcsMjQ4ODcsMjQ4OTQsMjQ5MzYsMjU5MTMsMjcxMTQsMjg0MzMsMzAxMTcsMzAzNDIsMzA0MjIsMzE2MjMsMzM0NDUsMzM5OTUsNjM3NDQsMzc3OTksMzgyODMsMjE4ODgsMjM0NTgsMjIzNTMsNjM3NDUsMzE5MjMsMzI2OTcsMzczMDEsMjA1MjAsMjE0MzUsMjM2MjEsMjQwNDAsMjUyOTgsMjU0NTQsMjU4MTgsMjU4MzEsMjgxOTIsMjg4NDQsMzEwNjcsMzYzMTcsMzYzODIsNjM3NDYsMzY5ODksMzc0NDUsMzc2MjQsMjAwOTQsMjAyMTQsMjA1ODEsMjQwNjIsMjQzMTQsMjQ4MzgsMjY5NjcsMzMxMzcsMzQzODgsMzY0MjMsMzc3NDksMzk0NjcsMjAwNjIsMjA2MjUsMjY0ODAsMjY2ODgsMjA3NDUsMjExMzMsMjExMzgsMjcyOTgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzA2NTIsMzczOTIsNDA2NjAsMjExNjMsMjQ2MjMsMzY4NTAsMjA1NTIsMjUwMDEsMjU1ODEsMjU4MDIsMjY2ODQsMjcyNjgsMjg2MDgsMzMxNjAsMzUyMzMsMzg1NDgsMjI1MzMsMjkzMDksMjkzNTYsMjk5NTYsMzIxMjEsMzIzNjUsMzI5MzcsMzUyMTEsMzU3MDAsMzY5NjMsNDAyNzMsMjUyMjUsMjc3NzAsMjg1MDAsMzIwODAsMzI1NzAsMzUzNjMsMjA4NjAsMjQ5MDYsMzE2NDUsMzU2MDksMzc0NjMsMzc3NzIsMjAxNDAsMjA0MzUsMjA1MTAsMjA2NzAsMjA3NDIsMjExODUsMjExOTcsMjEzNzUsMjIzODQsMjI2NTksMjQyMTgsMjQ0NjUsMjQ5NTAsMjUwMDQsMjU4MDYsMjU5NjQsMjYyMjMsMjYyOTksMjYzNTYsMjY3NzUsMjgwMzksMjg4MDUsMjg5MTMsMjk4NTUsMjk4NjEsMjk4OTgsMzAxNjksMzA4MjgsMzA5NTYsMzE0NTUsMzE0NzgsMzIwNjksMzIxNDcsMzI3ODksMzI4MzEsMzMwNTEsMzM2ODYsMzU2ODYsMzY2MjksMzY4ODUsMzc4NTcsMzg5MTUsMzg5NjgsMzk1MTQsMzk5MTIsMjA0MTgsMjE4NDMsMjI1ODYsMjI4NjUsMjMzOTUsMjM2MjIsMjQ3NjAsMjUxMDYsMjY2OTAsMjY4MDAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjY4NTYsMjgzMzAsMzAwMjgsMzAzMjgsMzA5MjYsMzEyOTMsMzE5OTUsMzIzNjMsMzIzODAsMzUzMzYsMzU0ODksMzU5MDMsMzg1NDIsNDAzODgsMjE0NzYsMjE0ODEsMjE1NzgsMjE2MTcsMjIyNjYsMjI5OTMsMjMzOTYsMjM2MTEsMjQyMzUsMjUzMzUsMjU5MTEsMjU5MjUsMjU5NzAsMjYyNzIsMjY1NDMsMjcwNzMsMjc4MzcsMzAyMDQsMzAzNTIsMzA1OTAsMzEyOTUsMzI2NjAsMzI3NzEsMzI5MjksMzMxNjcsMzM1MTAsMzM1MzMsMzM3NzYsMzQyNDEsMzQ4NjUsMzQ5OTYsMzU0OTMsNjM3NDcsMzY3NjQsMzc2NzgsMzg1OTksMzkwMTUsMzk2NDAsNDA3MjMsMjE3NDEsMjYwMTEsMjYzNTQsMjY3NjcsMzEyOTYsMzU4OTUsNDAyODgsMjIyNTYsMjIzNzIsMjM4MjUsMjYxMTgsMjY4MDEsMjY4MjksMjg0MTQsMjk3MzYsMzQ5NzQsMzk5MDgsMjc3NTIsNjM3NDgsMzk1OTIsMjAzNzksMjA4NDQsMjA4NDksMjExNTEsMjMzODAsMjQwMzcsMjQ2NTYsMjQ2ODUsMjUzMjksMjU1MTEsMjU5MTUsMjk2NTcsMzEzNTQsMzQ0NjcsMzYwMDIsMzg3OTksMjAwMTgsMjM1MjEsMjUwOTYsMjY1MjQsMjk5MTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzExODUsMzM3NDcsMzU0NjMsMzU1MDYsMzYzMjgsMzY5NDIsMzc3MDcsMzg5ODIsMjQyNzUsMjcxMTIsMzQzMDMsMzcxMDEsNjM3NDksMjA4OTYsMjM0NDgsMjM1MzIsMjQ5MzEsMjY4NzQsMjc0NTQsMjg3NDgsMjk3NDMsMjk5MTIsMzE2NDksMzI1OTIsMzM3MzMsMzUyNjQsMzYwMTEsMzgzNjQsMzkyMDgsMjEwMzgsMjQ2NjksMjUzMjQsMzY4NjYsMjAzNjIsMjA4MDksMjEyODEsMjI3NDUsMjQyOTEsMjYzMzYsMjc5NjAsMjg4MjYsMjkzNzgsMjk2NTQsMzE1NjgsMzMwMDksMzc5NzksMjEzNTAsMjU0OTksMzI2MTksMjAwNTQsMjA2MDgsMjI2MDIsMjI3NTAsMjQ2MTgsMjQ4NzEsMjUyOTYsMjcwODgsMzk3NDUsMjM0MzksMzIwMjQsMzI5NDUsMzY3MDMsMjAxMzIsMjA2ODksMjE2NzYsMjE5MzIsMjMzMDgsMjM5NjgsMjQwMzksMjU4OTgsMjU5MzQsMjY2NTcsMjcyMTEsMjk0MDksMzAzNTAsMzA3MDMsMzIwOTQsMzI3NjEsMzMxODQsMzQxMjYsMzQ1MjcsMzY2MTEsMzY2ODYsMzcwNjYsMzkxNzEsMzk1MDksMzk4NTEsMTk5OTIsMjAwMzcsMjAwNjEsMjAxNjcsMjA0NjUsMjA4NTUsMjEyNDYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjEzMTIsMjE0NzUsMjE0NzcsMjE2NDYsMjIwMzYsMjIzODksMjI0MzQsMjM0OTUsMjM5NDMsMjQyNzIsMjUwODQsMjUzMDQsMjU5MzcsMjY1NTIsMjY2MDEsMjcwODMsMjc0NzIsMjc1OTAsMjc2MjgsMjc3MTQsMjgzMTcsMjg3OTIsMjkzOTksMjk1OTAsMjk2OTksMzA2NTUsMzA2OTcsMzEzNTAsMzIxMjcsMzI3NzcsMzMyNzYsMzMyODUsMzMyOTAsMzM1MDMsMzQ5MTQsMzU2MzUsMzYwOTIsMzY1NDQsMzY4ODEsMzcwNDEsMzc0NzYsMzc1NTgsMzkzNzgsMzk0OTMsNDAxNjksNDA0MDcsNDA4NjAsMjIyODMsMjM2MTYsMzM3MzgsMzg4MTYsMzg4MjcsNDA2MjgsMjE1MzEsMzEzODQsMzI2NzYsMzUwMzMsMzY1NTcsMzcwODksMjI1MjgsMjM2MjQsMjU0OTYsMzEzOTEsMjM0NzAsMjQzMzksMzEzNTMsMzE0MDYsMzM0MjIsMzY1MjQsMjA1MTgsMjEwNDgsMjEyNDAsMjEzNjcsMjIyODAsMjUzMzEsMjU0NTgsMjc0MDIsMjgwOTksMzA1MTksMjE0MTMsMjk1MjcsMzQxNTIsMzY0NzAsMzgzNTcsMjY0MjYsMjczMzEsMjg1MjgsMzU0MzcsMzY1NTYsMzkyNDMsNjM3NTAsMjYyMzEsMjc1MTIsMzYwMjAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzk3NDAsNjM3NTEsMjE0ODMsMjIzMTcsMjI4NjIsMjU1NDIsMjcxMzEsMjk2NzQsMzA3ODksMzE0MTgsMzE0MjksMzE5OTgsMzM5MDksMzUyMTUsMzYyMTEsMzY5MTcsMzgzMTIsMjEyNDMsMjIzNDMsMzAwMjMsMzE1ODQsMzM3NDAsMzc0MDYsNjM3NTIsMjcyMjQsMjA4MTEsMjEwNjcsMjExMjcsMjUxMTksMjY4NDAsMjY5OTcsMzg1NTMsMjA2NzcsMjExNTYsMjEyMjAsMjUwMjcsMjYwMjAsMjY2ODEsMjcxMzUsMjk4MjIsMzE1NjMsMzM0NjUsMzM3NzEsMzUyNTAsMzU2NDEsMzY4MTcsMzkyNDEsNjM3NTMsMjAxNzAsMjI5MzUsMjU4MTAsMjYxMjksMjcyNzgsMjk3NDgsMzExMDUsMzExNjUsMzM0NDksMzQ5NDIsMzQ5NDMsMzUxNjcsNjM3NTQsMzc2NzAsMjAyMzUsMjE0NTAsMjQ2MTMsMjUyMDEsMjc3NjIsMzIwMjYsMzIxMDIsMjAxMjAsMjA4MzQsMzA2ODQsMzI5NDMsMjAyMjUsMjAyMzgsMjA4NTQsMjA4NjQsMjE5ODAsMjIxMjAsMjIzMzEsMjI1MjIsMjI1MjQsMjI4MDQsMjI4NTUsMjI5MzEsMjM0OTIsMjM2OTYsMjM4MjIsMjQwNDksMjQxOTAsMjQ1MjQsMjUyMTYsMjYwNzEsMjYwODMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjYzOTgsMjYzOTksMjY0NjIsMjY4MjcsMjY4MjAsMjcyMzEsMjc0NTAsMjc2ODMsMjc3NzMsMjc3NzgsMjgxMDMsMjk1OTIsMjk3MzQsMjk3MzgsMjk4MjYsMjk4NTksMzAwNzIsMzAwNzksMzA4NDksMzA5NTksMzEwNDEsMzEwNDcsMzEwNDgsMzEwOTgsMzE2MzcsMzIwMDAsMzIxODYsMzI2NDgsMzI3NzQsMzI4MTMsMzI5MDgsMzUzNTIsMzU2NjMsMzU5MTIsMzYyMTUsMzc2NjUsMzc2NjgsMzkxMzgsMzkyNDksMzk0MzgsMzk0MzksMzk1MjUsNDA1OTQsMzIyMDIsMjAzNDIsMjE1MTMsMjUzMjYsMjY3MDgsMzczMjksMjE5MzEsMjA3OTQsNjM3NTUsNjM3NTYsMjMwNjgsMjUwNjIsNjM3NTcsMjUyOTUsMjUzNDMsNjM3NTgsNjM3NTksNjM3NjAsNjM3NjEsNjM3NjIsNjM3NjMsMzcwMjcsNjM3NjQsNjM3NjUsNjM3NjYsNjM3NjcsNjM3NjgsMzU1ODIsNjM3NjksNjM3NzAsNjM3NzEsNjM3NzIsMjYyNjIsNjM3NzMsMjkwMTQsNjM3NzQsNjM3NzUsMzg2MjcsNjM3NzYsMjU0MjMsMjU0NjYsMjEzMzUsNjM3NzcsMjY1MTEsMjY5NzYsMjgyNzUsNjM3NzgsMzAwMDcsNjM3NzksNjM3ODAsNjM3ODEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzIwMTMsNjM3ODIsNjM3ODMsMzQ5MzAsMjIyMTgsMjMwNjQsNjM3ODQsNjM3ODUsNjM3ODYsNjM3ODcsNjM3ODgsMjAwMzUsNjM3ODksMjA4MzksMjI4NTYsMjY2MDgsMzI3ODQsNjM3OTAsMjI4OTksMjQxODAsMjU3NTQsMzExNzgsMjQ1NjUsMjQ2ODQsMjUyODgsMjU0NjcsMjM1MjcsMjM1MTEsMjExNjIsNjM3OTEsMjI5MDAsMjQzNjEsMjQ1OTQsNjM3OTIsNjM3OTMsNjM3OTQsMjk3ODUsNjM3OTUsNjM3OTYsNjM3OTcsNjM3OTgsNjM3OTksNjM4MDAsMzkzNzcsNjM4MDEsNjM4MDIsNjM4MDMsNjM4MDQsNjM4MDUsNjM4MDYsNjM4MDcsNjM4MDgsNjM4MDksNjM4MTAsNjM4MTEsMjg2MTEsNjM4MTIsNjM4MTMsMzMyMTUsMzY3ODYsMjQ4MTcsNjM4MTQsNjM4MTUsMzMxMjYsNjM4MTYsNjM4MTcsMjM2MTUsNjM4MTgsNjM4MTksNjM4MjAsNjM4MjEsNjM4MjIsNjM4MjMsNjM4MjQsNjM4MjUsMjMyNzMsMzUzNjUsMjY0OTEsMzIwMTYsNjM4MjYsNjM4MjcsNjM4MjgsNjM4MjksNjM4MzAsNjM4MzEsMzMwMjEsNjM4MzIsNjM4MzMsMjM2MTIsMjc4NzcsMjEzMTEsMjgzNDYsMjI4MTAsMzM1OTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjAwMjUsMjAxNTAsMjAyOTQsMjE5MzQsMjIyOTYsMjI3MjcsMjQ0MDYsMjYwMzksMjYwODYsMjcyNjQsMjc1NzMsMjgyMzcsMzA3MDEsMzE0NzEsMzE3NzQsMzIyMjIsMzQ1MDcsMzQ5NjIsMzcxNzAsMzc3MjMsMjU3ODcsMjg2MDYsMjk1NjIsMzAxMzYsMzY5NDgsMjE4NDYsMjIzNDksMjUwMTgsMjU4MTIsMjYzMTEsMjgxMjksMjgyNTEsMjg1MjUsMjg2MDEsMzAxOTIsMzI4MzUsMzMyMTMsMzQxMTMsMzUyMDMsMzU1MjcsMzU2NzQsMzc2NjMsMjc3OTUsMzAwMzUsMzE1NzIsMzYzNjcsMzY5NTcsMjE3NzYsMjI1MzAsMjI2MTYsMjQxNjIsMjUwOTUsMjU3NTgsMjY4NDgsMzAwNzAsMzE5NTgsMzQ3MzksNDA2ODAsMjAxOTUsMjI0MDgsMjIzODIsMjI4MjMsMjM1NjUsMjM3MjksMjQxMTgsMjQ0NTMsMjUxNDAsMjU4MjUsMjk2MTksMzMyNzQsMzQ5NTUsMzYwMjQsMzg1MzgsNDA2NjcsMjM0MjksMjQ1MDMsMjQ3NTUsMjA0OTgsMjA5OTIsMjEwNDAsMjIyOTQsMjI1ODEsMjI2MTUsMjM1NjYsMjM2NDgsMjM3OTgsMjM5NDcsMjQyMzAsMjQ0NjYsMjQ3NjQsMjUzNjEsMjU0ODEsMjU2MjMsMjY2OTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjY4NzMsMjczMzAsMjgxMjAsMjgxOTMsMjgzNzIsMjg2NDQsMjkxODIsMzA0MjgsMzA1ODUsMzExNTMsMzEyOTEsMzM3OTYsMzUyNDEsMzYwNzcsMzYzMzksMzY0MjQsMzY4NjcsMzY4ODQsMzY5NDcsMzcxMTcsMzc3MDksMzg1MTgsMzg4NzYsMjc2MDIsMjg2NzgsMjkyNzIsMjkzNDYsMjk1NDQsMzA1NjMsMzExNjcsMzE3MTYsMzI0MTEsMzU3MTIsMjI2OTcsMjQ3NzUsMjU5NTgsMjYxMDksMjYzMDIsMjc3ODgsMjg5NTgsMjkxMjksMzU5MzAsMzg5MzEsMjAwNzcsMzEzNjEsMjAxODksMjA5MDgsMjA5NDEsMjEyMDUsMjE1MTYsMjQ5OTksMjY0ODEsMjY3MDQsMjY4NDcsMjc5MzQsMjg1NDAsMzAxNDAsMzA2NDMsMzE0NjEsMzMwMTIsMzM4OTEsMzc1MDksMjA4MjgsMjYwMDcsMjY0NjAsMjY1MTUsMzAxNjgsMzE0MzEsMzM2NTEsNjM4MzQsMzU5MTAsMzY4ODcsMzg5NTcsMjM2NjMsMzMyMTYsMzM0MzQsMzY5MjksMzY5NzUsMzczODksMjQ0NzEsMjM5NjUsMjcyMjUsMjkxMjgsMzAzMzEsMzE1NjEsMzQyNzYsMzU1ODgsMzcxNTksMzk0NzIsMjE4OTUsMjUwNzgsNjM4MzUsMzAzMTMsMzI2NDUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzQzNjcsMzQ3NDYsMzUwNjQsMzcwMDcsNjM4MzYsMjc5MzEsMjg4ODksMjk2NjIsMzIwOTcsMzM4NTMsNjM4MzcsMzcyMjYsMzk0MDksNjM4MzgsMjAwOTgsMjEzNjUsMjczOTYsMjc0MTAsMjg3MzQsMjkyMTEsMzQzNDksNDA0NzgsMjEwNjgsMzY3NzEsMjM4ODgsMjU4MjksMjU5MDAsMjc0MTQsMjg2NTEsMzE4MTEsMzI0MTIsMzQyNTMsMzUxNzIsMzUyNjEsMjUyODksMzMyNDAsMzQ4NDcsMjQyNjYsMjYzOTEsMjgwMTAsMjk0MzYsMjk3MDEsMjk4MDcsMzQ2OTAsMzcwODYsMjAzNTgsMjM4MjEsMjQ0ODAsMzM4MDIsMjA5MTksMjU1MDQsMzAwNTMsMjAxNDIsMjA0ODYsMjA4NDEsMjA5MzcsMjY3NTMsMjcxNTMsMzE5MTgsMzE5MjEsMzE5NzUsMzMzOTEsMzU1MzgsMzY2MzUsMzczMjcsMjA0MDYsMjA3OTEsMjEyMzcsMjE1NzAsMjQzMDAsMjQ5NDIsMjUxNTAsMjYwNTMsMjczNTQsMjg2NzAsMzEwMTgsMzQyNjgsMzQ4NTEsMzgzMTcsMzk1MjIsMzk1MzAsNDA1OTksNDA2NTQsMjExNDcsMjYzMTAsMjc1MTEsMjg3MDEsMzEwMTksMzY3MDYsMzg3MjIsMjQ5NzYsMjUwODgsMjU4OTEsMjg0NTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjkwMDEsMjk4MzMsMzIyNDQsMzI4NzksMzQwMzAsMzY2NDYsMzY4OTksMzc3MDYsMjA5MjUsMjEwMTUsMjExNTUsMjc5MTYsMjg4NzIsMzUwMTAsMjQyNjUsMjU5ODYsMjc1NjYsMjg2MTAsMzE4MDYsMjk1NTcsMjAxOTYsMjAyNzgsMjIyNjUsNjM4MzksMjM3MzgsMjM5OTQsMjQ2MDQsMjk2MTgsMzE1MzMsMzI2NjYsMzI3MTgsMzI4MzgsMzY4OTQsMzc0MjgsMzg2NDYsMzg3MjgsMzg5MzYsNDA4MDEsMjAzNjMsMjg1ODMsMzExNTAsMzczMDAsMzg1ODMsMjEyMTQsNjM4NDAsMjU3MzYsMjU3OTYsMjczNDcsMjg1MTAsMjg2OTYsMjkyMDAsMzA0MzksMzI3NjksMzQzMTAsMzQzOTYsMzYzMzUsMzY2MTMsMzg3MDYsMzk3OTEsNDA0NDIsNDA1NjUsMzA4NjAsMzExMDMsMzIxNjAsMzM3MzcsMzc2MzYsNDA1NzUsNDA1OTUsMzU1NDIsMjI3NTEsMjQzMjQsMjY0MDcsMjg3MTEsMjk5MDMsMzE4NDAsMzI4OTQsMjA3NjksMjg3MTIsMjkyODIsMzA5MjIsMzYwMzQsMzYwNTgsMzYwODQsMzg2NDcsMjAxMDIsMjA2OTgsMjM1MzQsMjQyNzgsMjYwMDksMjkxMzQsMzAyNzQsMzA2MzcsMzI4NDIsMzQwNDQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzY5ODgsMzk3MTksNDA4NDUsMjI3NDQsMjMxMDUsMjM2NTAsMjcxNTUsMjgxMjIsMjg0MzEsMzAyNjcsMzIwNDcsMzIzMTEsMzQwNzgsMzUxMjgsMzc4NjAsMzg0NzUsMjExMjksMjYwNjYsMjY2MTEsMjcwNjAsMjc5NjksMjgzMTYsMjg2ODcsMjk3MDUsMjk3OTIsMzAwNDEsMzAyNDQsMzA4MjcsMzU2MjgsMzkwMDYsMjA4NDUsMjUxMzQsMzg1MjAsMjAzNzQsMjA1MjMsMjM4MzMsMjgxMzgsMzIxODQsMzY2NTAsMjQ0NTksMjQ5MDAsMjY2NDcsNjM4NDEsMzg1MzQsMjEyMDIsMzI5MDcsMjA5NTYsMjA5NDAsMjY5NzQsMzEyNjAsMzIxOTAsMzM3NzcsMzg1MTcsMjA0NDIsMjEwMzMsMjE0MDAsMjE1MTksMjE3NzQsMjM2NTMsMjQ3NDMsMjY0NDYsMjY3OTIsMjgwMTIsMjkzMTMsMjk0MzIsMjk3MDIsMjk4MjcsNjM4NDIsMzAxNzgsMzE4NTIsMzI2MzMsMzI2OTYsMzM2NzMsMzUwMjMsMzUwNDEsMzczMjQsMzczMjgsMzg2MjYsMzk4ODEsMjE1MzMsMjg1NDIsMjkxMzYsMjk4NDgsMzQyOTgsMzY1MjIsMzg1NjMsNDAwMjMsNDA2MDcsMjY1MTksMjgxMDcsMjk3NDcsMzMyNTYsMzg2NzgsMzA3NjQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzE0MzUsMzE1MjAsMzE4OTAsMjU3MDUsMjk4MDIsMzAxOTQsMzA5MDgsMzA5NTIsMzkzNDAsMzk3NjQsNDA2MzUsMjM1MTgsMjQxNDksMjg0NDgsMzMxODAsMzM3MDcsMzcwMDAsMTk5NzUsMjEzMjUsMjMwODEsMjQwMTgsMjQzOTgsMjQ5MzAsMjU0MDUsMjYyMTcsMjYzNjQsMjg0MTUsMjg0NTksMjg3NzEsMzA2MjIsMzM4MzYsMzQwNjcsMzQ4NzUsMzY2MjcsMzkyMzcsMzk5OTUsMjE3ODgsMjUyNzMsMjY0MTEsMjc4MTksMzM1NDUsMzUxNzgsMzg3NzgsMjAxMjksMjI5MTYsMjQ1MzYsMjQ1MzcsMjYzOTUsMzIxNzgsMzI1OTYsMzM0MjYsMzM1NzksMzM3MjUsMzY2MzgsMzcwMTcsMjI0NzUsMjI5NjksMjMxODYsMjM1MDQsMjYxNTEsMjY1MjIsMjY3NTcsMjc1OTksMjkwMjgsMzI2MjksMzYwMjMsMzYwNjcsMzY5OTMsMzk3NDksMzMwMzIsMzU5NzgsMzg0NzYsMzk0ODgsNDA2MTMsMjMzOTEsMjc2NjcsMjk0NjcsMzA0NTAsMzA0MzEsMzM4MDQsMjA5MDYsMzUyMTksMjA4MTMsMjA4ODUsMjExOTMsMjY4MjUsMjc3OTYsMzA0NjgsMzA0OTYsMzIxOTEsMzIyMzYsMzg3NTQsNDA2MjksMjgzNTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzQwNjUsMjA5MDEsMjE1MTcsMjE2MjksMjYxMjYsMjYyNjksMjY5MTksMjgzMTksMzAzOTksMzA2MDksMzM1NTksMzM5ODYsMzQ3MTksMzcyMjUsMzc1MjgsNDAxODAsMzQ5NDYsMjAzOTgsMjA4ODIsMjEyMTUsMjI5ODIsMjQxMjUsMjQ5MTcsMjU3MjAsMjU3MjEsMjYyODYsMjY1NzYsMjcxNjksMjc1OTcsMjc2MTEsMjkyNzksMjkyODEsMjk3NjEsMzA1MjAsMzA2ODMsMzI3OTEsMzM0NjgsMzM1NDEsMzU1ODQsMzU2MjQsMzU5ODAsMjY0MDgsMjc3OTIsMjkyODcsMzA0NDYsMzA1NjYsMzEzMDIsNDAzNjEsMjc1MTksMjc3OTQsMjI4MTgsMjY0MDYsMzM5NDUsMjEzNTksMjI2NzUsMjI5MzcsMjQyODcsMjU1NTEsMjYxNjQsMjY0ODMsMjgyMTgsMjk0ODMsMzE0NDcsMzM0OTUsMzc2NzIsMjEyMDksMjQwNDMsMjUwMDYsMjUwMzUsMjUwOTgsMjUyODcsMjU3NzEsMjYwODAsMjY5NjksMjc0OTQsMjc1OTUsMjg5NjEsMjk2ODcsMzAwNDUsMzIzMjYsMzMzMTAsMzM1MzgsMzQxNTQsMzU0OTEsMzYwMzEsMzg2OTUsNDAyODksMjI2OTYsNDA2NjQsMjA0OTcsMjEwMDYsMjE1NjMsMjE4MzksMjU5OTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjc3NjYsMzIwMTAsMzIwMTEsMzI4NjIsMzQ0NDIsMzgyNzIsMzg2MzksMjEyNDcsMjc3OTcsMjkyODksMjE2MTksMjMxOTQsMjM2MTQsMjM4ODMsMjQzOTYsMjQ0OTQsMjY0MTAsMjY4MDYsMjY5NzksMjgyMjAsMjgyMjgsMzA0NzMsMzE4NTksMzI2NTQsMzQxODMsMzU1OTgsMzY4NTUsMzg3NTMsNDA2OTIsMjM3MzUsMjQ3NTgsMjQ4NDUsMjUwMDMsMjU5MzUsMjYxMDcsMjYxMDgsMjc2NjUsMjc4ODcsMjk1OTksMjk2NDEsMzIyMjUsMzgyOTIsMjM0OTQsMzQ1ODgsMzU2MDAsMjEwODUsMjEzMzgsMjUyOTMsMjU2MTUsMjU3NzgsMjY0MjAsMjcxOTIsMjc4NTAsMjk2MzIsMjk4NTQsMzE2MzYsMzE4OTMsMzIyODMsMzMxNjIsMzMzMzQsMzQxODAsMzY4NDMsMzg2NDksMzkzNjEsMjAyNzYsMjEzMjIsMjE0NTMsMjE0NjcsMjUyOTIsMjU2NDQsMjU4NTYsMjYwMDEsMjcwNzUsMjc4ODYsMjg1MDQsMjk2NzcsMzAwMzYsMzAyNDIsMzA0MzYsMzA0NjAsMzA5MjgsMzA5NzEsMzEwMjAsMzIwNzAsMzMzMjQsMzQ3ODQsMzY4MjAsMzg5MzAsMzkxNTEsMjExODcsMjUzMDAsMjU3NjUsMjgxOTYsMjg0OTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzAzMzIsMzYyOTksMzcyOTcsMzc0NzQsMzk2NjIsMzk3NDcsMjA1MTUsMjA2MjEsMjIzNDYsMjI5NTIsMjM1OTIsMjQxMzUsMjQ0MzksMjUxNTEsMjU5MTgsMjYwNDEsMjYwNDksMjYxMjEsMjY1MDcsMjcwMzYsMjgzNTQsMzA5MTcsMzIwMzMsMzI5MzgsMzMxNTIsMzMzMjMsMzM0NTksMzM5NTMsMzQ0NDQsMzUzNzAsMzU2MDcsMzcwMzAsMzg0NTAsNDA4NDgsMjA0OTMsMjA0NjcsNjM4NDMsMjI1MjEsMjQ0NzIsMjUzMDgsMjU0OTAsMjY0NzksMjgyMjcsMjg5NTMsMzA0MDMsMzI5NzIsMzI5ODYsMzUwNjAsMzUwNjEsMzUwOTcsMzYwNjQsMzY2NDksMzcxOTcsMzg1MDYsMjAyNzEsMjAzMzYsMjQwOTEsMjY1NzUsMjY2NTgsMzAzMzMsMzAzMzQsMzk3NDgsMjQxNjEsMjcxNDYsMjkwMzMsMjkxNDAsMzAwNTgsNjM4NDQsMzIzMjEsMzQxMTUsMzQyODEsMzkxMzIsMjAyNDAsMzE1NjcsMzI2MjQsMzgzMDksMjA5NjEsMjQwNzAsMjY4MDUsMjc3MTAsMjc3MjYsMjc4NjcsMjkzNTksMzE2ODQsMzM1MzksMjc4NjEsMjk3NTQsMjA3MzEsMjExMjgsMjI3MjEsMjU4MTYsMjcyODcsMjk4NjMsMzAyOTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzA4ODcsMzQzMjcsMzgzNzAsMzg3MTMsNjM4NDUsMjEzNDIsMjQzMjEsMzU3MjIsMzY3NzYsMzY3ODMsMzcwMDIsMjEwMjksMzA2MjksNDAwMDksNDA3MTIsMTk5OTMsMjA0ODIsMjA4NTMsMjM2NDMsMjQxODMsMjYxNDIsMjYxNzAsMjY1NjQsMjY4MjEsMjg4NTEsMjk5NTMsMzAxNDksMzExNzcsMzE0NTMsMzY2NDcsMzkyMDAsMzk0MzIsMjA0NDUsMjI1NjEsMjI1NzcsMjM1NDIsMjYyMjIsMjc0OTMsMjc5MjEsMjgyODIsMjg1NDEsMjk2NjgsMjk5OTUsMzM3NjksMzUwMzYsMzUwOTEsMzU2NzYsMzY2MjgsMjAyMzksMjA2OTMsMjEyNjQsMjEzNDAsMjM0NDMsMjQ0ODksMjYzODEsMzExMTksMzMxNDUsMzM1ODMsMzQwNjgsMzUwNzksMzUyMDYsMzY2NjUsMzY2NjcsMzkzMzMsMzk5NTQsMjY0MTIsMjAwODYsMjA0NzIsMjI4NTcsMjM1NTMsMjM3OTEsMjM3OTIsMjU0NDcsMjY4MzQsMjg5MjUsMjkwOTAsMjk3MzksMzIyOTksMzQwMjgsMzQ1NjIsMzY4OTgsMzc1ODYsNDAxNzksMTk5ODEsMjAxODQsMjA0NjMsMjA2MTMsMjEwNzgsMjExMDMsMjE1NDIsMjE2NDgsMjI0OTYsMjI4MjcsMjMxNDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjMzODYsMjM0MTMsMjM1MDAsMjQyMjAsNjM4NDYsMjUyMDYsMjU5NzUsMjYwMjMsMjgwMTQsMjgzMjUsMjkyMzgsMzE1MjYsMzE4MDcsMzI1NjYsMzMxMDQsMzMxMDUsMzMxNzgsMzMzNDQsMzM0MzMsMzM3MDUsMzUzMzEsMzYwMDAsMzYwNzAsMzYwOTEsMzYyMTIsMzYyODIsMzcwOTYsMzczNDAsMzg0MjgsMzg0NjgsMzkzODUsNDAxNjcsMjEyNzEsMjA5OTgsMjE1NDUsMjIxMzIsMjI3MDcsMjI4NjgsMjI4OTQsMjQ1NzUsMjQ5OTYsMjUxOTgsMjYxMjgsMjc3NzQsMjg5NTQsMzA0MDYsMzE4ODEsMzE5NjYsMzIwMjcsMzM0NTIsMzYwMzMsMzg2NDAsNjM4NDcsMjAzMTUsMjQzNDMsMjQ0NDcsMjUyODIsMjM4NDksMjYzNzksMjY4NDIsMzA4NDQsMzIzMjMsNDAzMDAsMTk5ODksMjA2MzMsMjEyNjksMjEyOTAsMjEzMjksMjI5MTUsMjMxMzgsMjQxOTksMjQ3NTQsMjQ5NzAsMjUxNjEsMjUyMDksMjYwMDAsMjY1MDMsMjcwNDcsMjc2MDQsMjc2MDYsMjc2MDcsMjc2MDgsMjc4MzIsNjM4NDgsMjk3NDksMzAyMDIsMzA3MzgsMzA4NjUsMzExODksMzExOTIsMzE4NzUsMzIyMDMsMzI3MzcsMzI5MzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzMwODYsMzMyMTgsMzM3NzgsMzQ1ODYsMzUwNDgsMzU1MTMsMzU2OTIsMzYwMjcsMzcxNDUsMzg3NTAsMzkxMzEsNDA3NjMsMjIxODgsMjMzMzgsMjQ0MjgsMjU5OTYsMjczMTUsMjc1NjcsMjc5OTYsMjg2NTcsMjg2OTMsMjkyNzcsMjk2MTMsMzYwMDcsMzYwNTEsMzg5NzEsMjQ5NzcsMjc3MDMsMzI4NTYsMzk0MjUsMjAwNDUsMjAxMDcsMjAxMjMsMjAxODEsMjAyODIsMjAyODQsMjAzNTEsMjA0NDcsMjA3MzUsMjE0OTAsMjE0OTYsMjE3NjYsMjE5ODcsMjIyMzUsMjI3NjMsMjI4ODIsMjMwNTcsMjM1MzEsMjM1NDYsMjM1NTYsMjQwNTEsMjQxMDcsMjQ0NzMsMjQ2MDUsMjU0NDgsMjYwMTIsMjYwMzEsMjY2MTQsMjY2MTksMjY3OTcsMjc1MTUsMjc4MDEsMjc4NjMsMjgxOTUsMjg2ODEsMjk1MDksMzA3MjIsMzEwMzgsMzEwNDAsMzEwNzIsMzExNjksMzE3MjEsMzIwMjMsMzIxMTQsMzI5MDIsMzMyOTMsMzM2NzgsMzQwMDEsMzQ1MDMsMzUwMzksMzU0MDgsMzU0MjIsMzU2MTMsMzYwNjAsMzYxOTgsMzY3ODEsMzcwMzQsMzkxNjQsMzkzOTEsNDA2MDUsMjEwNjYsNjM4NDksMjYzODgsNjM4NTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjA2MzIsMjEwMzQsMjM2NjUsMjU5NTUsMjc3MzMsMjk2NDIsMjk5ODcsMzAxMDksMzE2MzksMzM5NDgsMzcyNDAsMzg3MDQsMjAwODcsMjU3NDYsMjc1NzgsMjkwMjIsMzQyMTcsMTk5NzcsNjM4NTEsMjY0NDEsMjY4NjIsMjgxODMsMzM0MzksMzQwNzIsMzQ5MjMsMjU1OTEsMjg1NDUsMzczOTQsMzkwODcsMTk5NzgsMjA2NjMsMjA2ODcsMjA3NjcsMjE4MzAsMjE5MzAsMjIwMzksMjMzNjAsMjM1NzcsMjM3NzYsMjQxMjAsMjQyMDIsMjQyMjQsMjQyNTgsMjQ4MTksMjY3MDUsMjcyMzMsMjgyNDgsMjkyNDUsMjkyNDgsMjkzNzYsMzA0NTYsMzEwNzcsMzE2NjUsMzI3MjQsMzUwNTksMzUzMTYsMzU0NDMsMzU5MzcsMzYwNjIsMzg2ODQsMjI2MjIsMjk4ODUsMzYwOTMsMjE5NTksNjM4NTIsMzEzMjksMzIwMzQsMzMzOTQsMjkyOTgsMjk5ODMsMjk5ODksNjM4NTMsMzE1MTMsMjI2NjEsMjI3NzksMjM5OTYsMjQyMDcsMjQyNDYsMjQ0NjQsMjQ2NjEsMjUyMzQsMjU0NzEsMjU5MzMsMjYyNTcsMjYzMjksMjYzNjAsMjY2NDYsMjY4NjYsMjkzMTIsMjk3OTAsMzE1OTgsMzIxMTAsMzIyMTQsMzI2MjYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzI5OTcsMzMyOTgsMzQyMjMsMzUxOTksMzU0NzUsMzY4OTMsMzc2MDQsNDA2NTMsNDA3MzYsMjI4MDUsMjI4OTMsMjQxMDksMjQ3OTYsMjYxMzIsMjYyMjcsMjY1MTIsMjc3MjgsMjgxMDEsMjg1MTEsMzA3MDcsMzA4ODksMzM5OTAsMzczMjMsMzc2NzUsMjAxODUsMjA2ODIsMjA4MDgsMjE4OTIsMjMzMDcsMjM0NTksMjUxNTksMjU5ODIsMjYwNTksMjgyMTAsMjkwNTMsMjk2OTcsMjk3NjQsMjk4MzEsMjk4ODcsMzAzMTYsMzExNDYsMzIyMTgsMzIzNDEsMzI2ODAsMzMxNDYsMzMyMDMsMzMzMzcsMzQzMzAsMzQ3OTYsMzU0NDUsMzYzMjMsMzY5ODQsMzc1MjEsMzc5MjUsMzkyNDUsMzk4NTQsMjEzNTIsMjM2MzMsMjY5NjQsMjc4NDQsMjc5NDUsMjgyMDMsMzMyOTIsMzQyMDMsMzUxMzEsMzUzNzMsMzU0OTgsMzg2MzQsNDA4MDcsMjEwODksMjYyOTcsMjc1NzAsMzI0MDYsMzQ4MTQsMzYxMDksMzgyNzUsMzg0OTMsMjU4ODUsMjgwNDEsMjkxNjYsNjM4NTQsMjI0NzgsMjI5OTUsMjM0NjgsMjQ2MTUsMjQ4MjYsMjUxMDQsMjYxNDMsMjYyMDcsMjk0ODEsMjk2ODksMzA0MjcsMzA0NjUsMzE1OTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzI4NTQsMzI4ODIsMzMxMjUsMzU0ODgsMzcyNjYsMTk5OTAsMjEyMTgsMjc1MDYsMjc5MjcsMzEyMzcsMzE1NDUsMzIwNDgsNjM4NTUsMzYwMTYsMjE0ODQsMjIwNjMsMjI2MDksMjM0NzcsMjM1NjcsMjM1NjksMjQwMzQsMjUxNTIsMjU0NzUsMjU2MjAsMjYxNTcsMjY4MDMsMjc4MzYsMjgwNDAsMjgzMzUsMjg3MDMsMjg4MzYsMjkxMzgsMjk5OTAsMzAwOTUsMzAwOTQsMzAyMzMsMzE1MDUsMzE3MTIsMzE3ODcsMzIwMzIsMzIwNTcsMzQwOTIsMzQxNTcsMzQzMTEsMzUzODAsMzY4NzcsMzY5NjEsMzcwNDUsMzc1NTksMzg5MDIsMzk0NzksMjA0MzksMjM2NjAsMjY0NjMsMjgwNDksMzE5MDMsMzIzOTYsMzU2MDYsMzYxMTgsMzY4OTUsMjM0MDMsMjQwNjEsMjU2MTMsMzM5ODQsMzY5NTYsMzkxMzcsMjk1NzUsMjM0MzUsMjQ3MzAsMjY0OTQsMjgxMjYsMzUzNTksMzU0OTQsMzY4NjUsMzg5MjQsMjEwNDcsNjM4NTYsMjg3NTMsMzA4NjIsMzc3ODIsMzQ5MjgsMzczMzUsMjA0NjIsMjE0NjMsMjIwMTMsMjIyMzQsMjI0MDIsMjI3ODEsMjMyMzQsMjM0MzIsMjM3MjMsMjM3NDQsMjQxMDEsMjQ4MzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjUxMDEsMjUxNjMsMjU0ODAsMjU2MjgsMjU5MTAsMjU5NzYsMjcxOTMsMjc1MzAsMjc3MDAsMjc5MjksMjg0NjUsMjkxNTksMjk0MTcsMjk1NjAsMjk3MDMsMjk4NzQsMzAyNDYsMzA1NjEsMzExNjgsMzEzMTksMzE0NjYsMzE5MjksMzIxNDMsMzIxNzIsMzIzNTMsMzI2NzAsMzMwNjUsMzM1ODUsMzM5MzYsMzQwMTAsMzQyODIsMzQ5NjYsMzU1MDQsMzU3MjgsMzY2NjQsMzY5MzAsMzY5OTUsMzcyMjgsMzc1MjYsMzc1NjEsMzg1MzksMzg1NjcsMzg1NjgsMzg2MTQsMzg2NTYsMzg5MjAsMzkzMTgsMzk2MzUsMzk3MDYsMjE0NjAsMjI2NTQsMjI4MDksMjM0MDgsMjM0ODcsMjgxMTMsMjg1MDYsMjkwODcsMjk3MjksMjk4ODEsMzI5MDEsMzM3ODksMjQwMzMsMjQ0NTUsMjQ0OTAsMjQ2NDIsMjYwOTIsMjY2NDIsMjY5OTEsMjcyMTksMjc1MjksMjc5NTcsMjgxNDcsMjk2NjcsMzA0NjIsMzA2MzYsMzE1NjUsMzIwMjAsMzMwNTksMzMzMDgsMzM2MDAsMzQwMzYsMzQxNDcsMzU0MjYsMzU1MjQsMzcyNTUsMzc2NjIsMzg5MTgsMzkzNDgsMjUxMDAsMzQ4OTksMzY4NDgsMzc0NzcsMjM4MTUsMjM4NDcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjM5MTMsMjk3OTEsMzMxODEsMzQ2NjQsMjg2MjksMjUzNDIsMzI3MjIsMzUxMjYsMzUxODYsMTk5OTgsMjAwNTYsMjA3MTEsMjEyMTMsMjEzMTksMjUyMTUsMjYxMTksMzIzNjEsMzQ4MjEsMzg0OTQsMjAzNjUsMjEyNzMsMjIwNzAsMjI5ODcsMjMyMDQsMjM2MDgsMjM2MzAsMjM2MjksMjQwNjYsMjQzMzcsMjQ2NDMsMjYwNDUsMjYxNTksMjYxNzgsMjY1NTgsMjY2MTIsMjk0NjgsMzA2OTAsMzEwMzQsMzI3MDksMzM5NDAsMzM5OTcsMzUyMjIsMzU0MzAsMzU0MzMsMzU1NTMsMzU5MjUsMzU5NjIsMjI1MTYsMjM1MDgsMjQzMzUsMjQ2ODcsMjUzMjUsMjY4OTMsMjc1NDIsMjgyNTIsMjkwNjAsMzE2OTgsMzQ2NDUsMzU2NzIsMzY2MDYsMzkxMzUsMzkxNjYsMjAyODAsMjAzNTMsMjA0NDksMjE2MjcsMjMwNzIsMjM0ODAsMjQ4OTIsMjYwMzIsMjYyMTYsMjkxODAsMzAwMDMsMzEwNzAsMzIwNTEsMzMxMDIsMzMyNTEsMzM2ODgsMzQyMTgsMzQyNTQsMzQ1NjMsMzUzMzgsMzY1MjMsMzY3NjMsNjM4NTcsMzY4MDUsMjI4MzMsMjM0NjAsMjM1MjYsMjQ3MTMsMjM1MjksMjM1NjMsMjQ1MTUsMjc3NzcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNjM4NTgsMjgxNDUsMjg2ODMsMjk5NzgsMzM0NTUsMzU1NzQsMjAxNjAsMjEzMTMsNjM4NTksMzg2MTcsMjc2NjMsMjAxMjYsMjA0MjAsMjA4MTgsMjE4NTQsMjMwNzcsMjM3ODQsMjUxMDUsMjkyNzMsMzM0NjksMzM3MDYsMzQ1NTgsMzQ5MDUsMzUzNTcsMzg0NjMsMzg1OTcsMzkxODcsNDAyMDEsNDAyODUsMjI1MzgsMjM3MzEsMjM5OTcsMjQxMzIsMjQ4MDEsMjQ4NTMsMjU1NjksMjcxMzgsMjgxOTcsMzcxMjIsMzc3MTYsMzg5OTAsMzk5NTIsNDA4MjMsMjM0MzMsMjM3MzYsMjUzNTMsMjYxOTEsMjY2OTYsMzA1MjQsMzg1OTMsMzg3OTcsMzg5OTYsMzk4MzksMjYwMTcsMzU1ODUsMzY1NTUsMzgzMzIsMjE4MTMsMjM3MjEsMjQwMjIsMjQyNDUsMjYyNjMsMzAyODQsMzM3ODAsMzgzNDMsMjI3MzksMjUyNzYsMjkzOTAsNDAyMzIsMjAyMDgsMjI4MzAsMjQ1OTEsMjYxNzEsMjc1MjMsMzEyMDcsNDAyMzAsMjEzOTUsMjE2OTYsMjI0NjcsMjM4MzAsMjQ4NTksMjYzMjYsMjgwNzksMzA4NjEsMzM0MDYsMzg1NTIsMzg3MjQsMjEzODAsMjUyMTIsMjU0OTQsMjgwODIsMzIyNjYsMzMwOTksMzg5ODksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjczODcsMzI1ODgsNDAzNjcsNDA0NzQsMjAwNjMsMjA1MzksMjA5MTgsMjI4MTIsMjQ4MjUsMjU1OTAsMjY5MjgsMjkyNDIsMzI4MjIsNjM4NjAsMzczMjYsMjQzNjksNjM4NjEsNjM4NjIsMzIwMDQsMzM1MDksMzM5MDMsMzM5NzksMzQyNzcsMzY0OTMsNjM4NjMsMjAzMzUsNjM4NjQsNjM4NjUsMjI3NTYsMjMzNjMsMjQ2NjUsMjU1NjIsMjU4ODAsMjU5NjUsMjYyNjQsNjM4NjYsMjY5NTQsMjcxNzEsMjc5MTUsMjg2NzMsMjkwMzYsMzAxNjIsMzAyMjEsMzExNTUsMzEzNDQsNjM4NjcsMzI2NTAsNjM4NjgsMzUxNDAsNjM4NjksMzU3MzEsMzczMTIsMzg1MjUsNjM4NzAsMzkxNzgsMjIyNzYsMjQ0ODEsMjYwNDQsMjg0MTcsMzAyMDgsMzExNDIsMzU0ODYsMzkzNDEsMzk3NzAsNDA4MTIsMjA3NDAsMjUwMTQsMjUyMzMsMjcyNzcsMzMyMjIsMjA1NDcsMjI1NzYsMjQ0MjIsMjg5MzcsMzUzMjgsMzU1NzgsMjM0MjAsMzQzMjYsMjA0NzQsMjA3OTYsMjIxOTYsMjI4NTIsMjU1MTMsMjgxNTMsMjM5NzgsMjY5ODksMjA4NzAsMjAxMDQsMjAzMTMsNjM4NzEsNjM4NzIsNjM4NzMsMjI5MTQsNjM4NzQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNjM4NzUsMjc0ODcsMjc3NDEsNjM4NzYsMjk4NzcsMzA5OTgsNjM4NzcsMzMyODcsMzMzNDksMzM1OTMsMzY2NzEsMzY3MDEsNjM4NzgsMzkxOTIsNjM4NzksNjM4ODAsNjM4ODEsMjAxMzQsNjM4ODIsMjI0OTUsMjQ0NDEsMjYxMzEsNjM4ODMsNjM4ODQsMzAxMjMsMzIzNzcsMzU2OTUsNjM4ODUsMzY4NzAsMzk1MTUsMjIxODEsMjI1NjcsMjMwMzIsMjMwNzEsMjM0NzYsNjM4ODYsMjQzMTAsNjM4ODcsNjM4ODgsMjU0MjQsMjU0MDMsNjM4ODksMjY5NDEsMjc3ODMsMjc4MzksMjgwNDYsMjgwNTEsMjgxNDksMjg0MzYsNjM4OTAsMjg4OTUsMjg5ODIsMjkwMTcsNjM4OTEsMjkxMjMsMjkxNDEsNjM4OTIsMzA3OTksMzA4MzEsNjM4OTMsMzE2MDUsMzIyMjcsNjM4OTQsMzIzMDMsNjM4OTUsMzQ4OTMsMzY1NzUsNjM4OTYsNjM4OTcsNjM4OTgsMzc0NjcsNjM4OTksNDAxODIsNjM5MDAsNjM5MDEsNjM5MDIsMjQ3MDksMjgwMzcsNjM5MDMsMjkxMDUsNjM5MDQsNjM5MDUsMzgzMjEsMjE0MjEsNjM5MDYsNjM5MDcsNjM5MDgsMjY1NzksNjM5MDksMjg4MTQsMjg5NzYsMjk3NDQsMzMzOTgsMzM0OTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNjM5MTAsMzgzMzEsMzk2NTMsNDA1NzMsMjYzMDgsNjM5MTEsMjkxMjEsMzM4NjUsNjM5MTIsNjM5MTMsMjI2MDMsNjM5MTQsNjM5MTUsMjM5OTIsMjQ0MzMsNjM5MTYsMjYxNDQsMjYyNTQsMjcwMDEsMjcwNTQsMjc3MDQsMjc4OTEsMjgyMTQsMjg0ODEsMjg2MzQsMjg2OTksMjg3MTksMjkwMDgsMjkxNTEsMjk1NTIsNjM5MTcsMjk3ODcsNjM5MTgsMjk5MDgsMzA0MDgsMzEzMTAsMzI0MDMsNjM5MTksNjM5MjAsMzM1MjEsMzU0MjQsMzY4MTQsNjM5MjEsMzc3MDQsNjM5MjIsMzg2ODEsNjM5MjMsNjM5MjQsMjAwMzQsMjA1MjIsNjM5MjUsMjEwMDAsMjE0NzMsMjYzNTUsMjc3NTcsMjg2MTgsMjk0NTAsMzA1OTEsMzEzMzAsMzM0NTQsMzQyNjksMzQzMDYsNjM5MjYsMzUwMjgsMzU0MjcsMzU3MDksMzU5NDcsNjM5MjcsMzc1NTUsNjM5MjgsMzg2NzUsMzg5MjgsMjAxMTYsMjAyMzcsMjA0MjUsMjA2NTgsMjEzMjAsMjE1NjYsMjE1NTUsMjE5NzgsMjI2MjYsMjI3MTQsMjI4ODcsMjMwNjcsMjM1MjQsMjQ3MzUsNjM5MjksMjUwMzQsMjU5NDIsMjYxMTEsMjYyMTIsMjY3OTEsMjc3MzgsMjg1OTUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjg4NzksMjkxMDAsMjk1MjIsMzE2MTMsMzQ1NjgsMzU0OTIsMzk5ODYsNDA3MTEsMjM2MjcsMjc3NzksMjk1MDgsMjk1NzcsMzc0MzQsMjgzMzEsMjk3OTcsMzAyMzksMzEzMzcsMzIyNzcsMzQzMTQsMjA4MDAsMjI3MjUsMjU3OTMsMjk5MzQsMjk5NzMsMzAzMjAsMzI3MDUsMzcwMTMsMzg2MDUsMzkyNTIsMjgxOTgsMjk5MjYsMzE0MDEsMzE0MDIsMzMyNTMsMzQ1MjEsMzQ2ODAsMzUzNTUsMjMxMTMsMjM0MzYsMjM0NTEsMjY3ODUsMjY4ODAsMjgwMDMsMjk2MDksMjk3MTUsMjk3NDAsMzA4NzEsMzIyMzMsMzI3NDcsMzMwNDgsMzMxMDksMzM2OTQsMzU5MTYsMzg0NDYsMzg5MjksMjYzNTIsMjQ0NDgsMjYxMDYsMjY1MDUsMjc3NTQsMjk1NzksMjA1MjUsMjMwNDMsMjc0OTgsMzA3MDIsMjI4MDYsMjM5MTYsMjQwMTMsMjk0NzcsMzAwMzEsNjM5MzAsNjM5MzEsMjA3MDksMjA5ODUsMjI1NzUsMjI4MjksMjI5MzQsMjMwMDIsMjM1MjUsNjM5MzIsNjM5MzMsMjM5NzAsMjUzMDMsMjU2MjIsMjU3NDcsMjU4NTQsNjM5MzQsMjYzMzIsNjM5MzUsMjcyMDgsNjM5MzYsMjkxODMsMjk3OTYsNjM5MzcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzEzNjgsMzE0MDcsMzIzMjcsMzIzNTAsMzI3NjgsMzMxMzYsNjM5MzgsMzQ3OTksMzUyMDEsMzU2MTYsMzY5NTMsNjM5MzksMzY5OTIsMzkyNTAsMjQ5NTgsMjc0NDIsMjgwMjAsMzIyODcsMzUxMDksMzY3ODUsMjA0MzMsMjA2NTMsMjA4ODcsMjExOTEsMjI0NzEsMjI2NjUsMjM0ODEsMjQyNDgsMjQ4OTgsMjcwMjksMjgwNDQsMjgyNjMsMjgzNDIsMjkwNzYsMjk3OTQsMjk5OTIsMjk5OTYsMzI4ODMsMzM1OTIsMzM5OTMsMzYzNjIsMzc3ODAsMzc4NTQsNjM5NDAsMjAxMTAsMjAzMDUsMjA1OTgsMjA3NzgsMjE0NDgsMjE0NTEsMjE0OTEsMjM0MzEsMjM1MDcsMjM1ODgsMjQ4NTgsMjQ5NjIsMjYxMDAsMjkyNzUsMjk1OTEsMjk3NjAsMzA0MDIsMzEwNTYsMzExMjEsMzExNjEsMzIwMDYsMzI3MDEsMzM0MTksMzQyNjEsMzQzOTgsMzY4MDIsMzY5MzUsMzcxMDksMzczNTQsMzg1MzMsMzg2MzIsMzg2MzMsMjEyMDYsMjQ0MjMsMjYwOTMsMjYxNjEsMjY2NzEsMjkwMjAsMzEyODYsMzcwNTcsMzg5MjIsMjAxMTMsNjM5NDEsMjcyMTgsMjc1NTAsMjg1NjAsMjkwNjUsMzI3OTIsMzM0NjQsMzQxMzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzY5MzksMzg1NDksMzg2NDIsMzg5MDcsMzQwNzQsMzk3MjksMjAxMTIsMjkwNjYsMzg1OTYsMjA4MDMsMjE0MDcsMjE3MjksMjIyOTEsMjIyOTAsMjI0MzUsMjMxOTUsMjMyMzYsMjM0OTEsMjQ2MTYsMjQ4OTUsMjU1ODgsMjc3ODEsMjc5NjEsMjgyNzQsMjgzMDQsMjkyMzIsMjk1MDMsMjk3ODMsMzM0ODksMzQ5NDUsMzY2NzcsMzY5NjAsNjM5NDIsMzg0OTgsMzkwMDAsNDAyMTksMjYzNzYsMzYyMzQsMzc0NzAsMjAzMDEsMjA1NTMsMjA3MDIsMjEzNjEsMjIyODUsMjI5OTYsMjMwNDEsMjM1NjEsMjQ5NDQsMjYyNTYsMjgyMDUsMjkyMzQsMjk3NzEsMzIyMzksMzI5NjMsMzM4MDYsMzM4OTQsMzQxMTEsMzQ2NTUsMzQ5MDcsMzUwOTYsMzU1ODYsMzY5NDksMzg4NTksMzk3NTksMjAwODMsMjAzNjksMjA3NTQsMjA4NDIsNjM5NDMsMjE4MDcsMjE5MjksMjM0MTgsMjM0NjEsMjQxODgsMjQxODksMjQyNTQsMjQ3MzYsMjQ3OTksMjQ4NDAsMjQ4NDEsMjU1NDAsMjU5MTIsMjYzNzcsNjM5NDQsMjY1ODAsMjY1ODYsNjM5NDUsMjY5NzcsMjY5NzgsMjc4MzMsMjc5NDMsNjM5NDYsMjgyMTYsNjM5NDcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjg2NDEsMjk0OTQsMjk0OTUsNjM5NDgsMjk3ODgsMzAwMDEsNjM5NDksMzAyOTAsNjM5NTAsNjM5NTEsMzIxNzMsMzMyNzgsMzM4NDgsMzUwMjksMzU0ODAsMzU1NDcsMzU1NjUsMzY0MDAsMzY0MTgsMzY5MzgsMzY5MjYsMzY5ODYsMzcxOTMsMzczMjEsMzc3NDIsNjM5NTIsNjM5NTMsMjI1MzcsNjM5NTQsMjc2MDMsMzI5MDUsMzI5NDYsNjM5NTUsNjM5NTYsMjA4MDEsMjI4OTEsMjM2MDksNjM5NTcsNjM5NTgsMjg1MTYsMjk2MDcsMzI5OTYsMzYxMDMsNjM5NTksMzczOTksMzgyODcsNjM5NjAsNjM5NjEsNjM5NjIsNjM5NjMsMzI4OTUsMjUxMDIsMjg3MDAsMzIxMDQsMzQ3MDEsNjM5NjQsMjI0MzIsMjQ2ODEsMjQ5MDMsMjc1NzUsMzU1MTgsMzc1MDQsMzg1NzcsMjAwNTcsMjE1MzUsMjgxMzksMzQwOTMsMzg1MTIsMzg4OTksMzkxNTAsMjU1NTgsMjc4NzUsMzcwMDksMjA5NTcsMjUwMzMsMzMyMTAsNDA0NDEsMjAzODEsMjA1MDYsMjA3MzYsMjM0NTIsMjQ4NDcsMjUwODcsMjU4MzYsMjY4ODUsMjc1ODksMzAwOTcsMzA2OTEsMzI2ODEsMzMzODAsMzQxOTEsMzQ4MTEsMzQ5MTUsMzU1MTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzU2OTYsMzcyOTEsMjAxMDgsMjAxOTcsMjAyMzQsNjM5NjUsNjM5NjYsMjI4MzksMjMwMTYsNjM5NjcsMjQwNTAsMjQzNDcsMjQ0MTEsMjQ2MDksNjM5NjgsNjM5NjksNjM5NzAsNjM5NzEsMjkyNDYsMjk2NjksNjM5NzIsMzAwNjQsMzAxNTcsNjM5NzMsMzEyMjcsNjM5NzQsMzI3ODAsMzI4MTksMzI5MDAsMzM1MDUsMzM2MTcsNjM5NzUsNjM5NzYsMzYwMjksMzYwMTksMzY5OTksNjM5NzcsNjM5NzgsMzkxNTYsMzkxODAsNjM5NzksNjM5ODAsMjg3MjcsMzA0MTAsMzI3MTQsMzI3MTYsMzI3NjQsMzU2MTAsMjAxNTQsMjAxNjEsMjA5OTUsMjEzNjAsNjM5ODEsMjE2OTMsMjIyNDAsMjMwMzUsMjM0OTMsMjQzNDEsMjQ1MjUsMjgyNzAsNjM5ODIsNjM5ODMsMzIxMDYsMzM1ODksNjM5ODQsMzQ0NTEsMzU0NjksNjM5ODUsMzg3NjUsMzg3NzUsNjM5ODYsNjM5ODcsMTk5NjgsMjAzMTQsMjAzNTAsMjI3NzcsMjYwODUsMjgzMjIsMzY5MjAsMzc4MDgsMzkzNTMsMjAyMTksMjI3NjQsMjI5MjIsMjMwMDEsMjQ2NDEsNjM5ODgsNjM5ODksMzEyNTIsNjM5OTAsMzM2MTUsMzYwMzUsMjA4MzcsMjEzMTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNjM5OTEsNjM5OTIsNjM5OTMsMjAxNzMsMjEwOTcsMjMzODEsMzM0NzEsMjAxODAsMjEwNTAsMjE2NzIsMjI5ODUsMjMwMzksMjMzNzYsMjMzODMsMjMzODgsMjQ2NzUsMjQ5MDQsMjgzNjMsMjg4MjUsMjkwMzgsMjk1NzQsMjk5NDMsMzAxMzMsMzA5MTMsMzIwNDMsMzI3NzMsMzMyNTgsMzM1NzYsMzQwNzEsMzQyNDksMzU1NjYsMzYwMzksMzg2MDQsMjAzMTYsMjEyNDIsMjIyMDQsMjYwMjcsMjYxNTIsMjg3OTYsMjg4NTYsMjkyMzcsMzIxODksMzM0MjEsMzcxOTYsMzg1OTIsNDAzMDYsMjM0MDksMjY4NTUsMjc1NDQsMjg1MzgsMzA0MzAsMjM2OTcsMjYyODMsMjg1MDcsMzE2NjgsMzE3ODYsMzQ4NzAsMzg2MjAsMTk5NzYsMjAxODMsMjEyODAsMjI1ODAsMjI3MTUsMjI3NjcsMjI4OTIsMjM1NTksMjQxMTUsMjQxOTYsMjQzNzMsMjU0ODQsMjYyOTAsMjY0NTQsMjcxNjcsMjcyOTksMjc0MDQsMjg0NzksMjkyNTQsNjM5OTQsMjk1MjAsMjk4MzUsMzE0NTYsMzE5MTEsMzMxNDQsMzMyNDcsMzMyNTUsMzM2NzQsMzM5MDAsMzQwODMsMzQxOTYsMzQyNTUsMzUwMzcsMzYxMTUsMzcyOTIsMzgyNjMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzg1NTYsMjA4NzcsMjE3MDUsMjIzMTIsMjM0NzIsMjUxNjUsMjY0NDgsMjY2ODUsMjY3NzEsMjgyMjEsMjgzNzEsMjg3OTcsMzIyODksMzUwMDksMzYwMDEsMzY2MTcsNDA3NzksNDA3ODIsMjkyMjksMzE2MzEsMzU1MzMsMzc2NTgsMjAyOTUsMjAzMDIsMjA3ODYsMjE2MzIsMjI5OTIsMjQyMTMsMjUyNjksMjY0ODUsMjY5OTAsMjcxNTksMjc4MjIsMjgxODYsMjk0MDEsMjk0ODIsMzAxNDEsMzE2NzIsMzIwNTMsMzM1MTEsMzM3ODUsMzM4NzksMzQyOTUsMzU0MTksMzYwMTUsMzY0ODcsMzY4ODksMzcwNDgsMzg2MDYsNDA3OTksMjEyMTksMjE1MTQsMjMyNjUsMjM0OTAsMjU2ODgsMjU5NzMsMjg0MDQsMjkzODAsNjM5OTUsMzAzNDAsMzEzMDksMzE1MTUsMzE4MjEsMzIzMTgsMzI3MzUsMzM2NTksMzU2MjcsMzYwNDIsMzYxOTYsMzYzMjEsMzY0NDcsMzY4NDIsMzY4NTcsMzY5NjksMzc4NDEsMjAyOTEsMjAzNDYsMjA2NTksMjA4NDAsMjA4NTYsMjEwNjksMjEwOTgsMjI2MjUsMjI2NTIsMjI4ODAsMjM1NjAsMjM2MzcsMjQyODMsMjQ3MzEsMjUxMzYsMjY2NDMsMjc1ODMsMjc2NTYsMjg1OTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjkwMDYsMjk3MjgsMzAwMDAsMzAwMDgsMzAwMzMsMzAzMjIsMzE1NjQsMzE2MjcsMzE2NjEsMzE2ODYsMzIzOTksMzU0MzgsMzY2NzAsMzY2ODEsMzc0MzksMzc1MjMsMzc2NjYsMzc5MzEsMzg2NTEsMzkwMDIsMzkwMTksMzkxOTgsMjA5OTksMjUxMzAsMjUyNDAsMjc5OTMsMzAzMDgsMzE0MzQsMzE2ODAsMzIxMTgsMjEzNDQsMjM3NDIsMjQyMTUsMjg0NzIsMjg4NTcsMzE4OTYsMzg2NzMsMzk4MjIsNDA2NzAsMjU1MDksMjU3MjIsMzQ2NzgsMTk5NjksMjAxMTcsMjAxNDEsMjA1NzIsMjA1OTcsMjE1NzYsMjI5NzksMjM0NTAsMjQxMjgsMjQyMzcsMjQzMTEsMjQ0NDksMjQ3NzMsMjU0MDIsMjU5MTksMjU5NzIsMjYwNjAsMjYyMzAsMjYyMzIsMjY2MjIsMjY5ODQsMjcyNzMsMjc0OTEsMjc3MTIsMjgwOTYsMjgxMzYsMjgxOTEsMjgyNTQsMjg3MDIsMjg4MzMsMjk1ODIsMjk2OTMsMzAwMTAsMzA1NTUsMzA4NTUsMzExMTgsMzEyNDMsMzEzNTcsMzE5MzQsMzIxNDIsMzMzNTEsMzUzMzAsMzU1NjIsMzU5OTgsMzcxNjUsMzcxOTQsMzczMzYsMzc0NzgsMzc1ODAsMzc2NjQsMzg2NjIsMzg3NDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzg3NDgsMzg5MTQsNDA3MTgsMjEwNDYsMjExMzcsMjE4ODQsMjI1NjQsMjQwOTMsMjQzNTEsMjQ3MTYsMjU1NTIsMjY3OTksMjg2MzksMzEwODUsMzE1MzIsMzMyMjksMzQyMzQsMzUwNjksMzU1NzYsMzY0MjAsMzcyNjEsMzg1MDAsMzg1NTUsMzg3MTcsMzg5ODgsNDA3NzgsMjA0MzAsMjA4MDYsMjA5MzksMjExNjEsMjIwNjYsMjQzNDAsMjQ0MjcsMjU1MTQsMjU4MDUsMjYwODksMjYxNzcsMjYzNjIsMjYzNjEsMjYzOTcsMjY3ODEsMjY4MzksMjcxMzMsMjg0MzcsMjg1MjYsMjkwMzEsMjkxNTcsMjkyMjYsMjk4NjYsMzA1MjIsMzEwNjIsMzEwNjYsMzExOTksMzEyNjQsMzEzODEsMzE4OTUsMzE5NjcsMzIwNjgsMzIzNjgsMzI5MDMsMzQyOTksMzQ0NjgsMzU0MTIsMzU1MTksMzYyNDksMzY0ODEsMzY4OTYsMzY5NzMsMzczNDcsMzg0NTksMzg2MTMsNDAxNjUsMjYwNjMsMzE3NTEsMzYyNzUsMzc4MjcsMjMzODQsMjM1NjIsMjEzMzAsMjUzMDUsMjk0NjksMjA1MTksMjM0NDcsMjQ0NzgsMjQ3NTIsMjQ5MzksMjY4MzcsMjgxMjEsMjk3NDIsMzEyNzgsMzIwNjYsMzIxNTYsMzIzMDUsMzMxMzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzYzOTQsMzY0MDUsMzc3NTgsMzc5MTIsMjAzMDQsMjIzNTIsMjQwMzgsMjQyMzEsMjUzODcsMzI2MTgsMjAwMjcsMjAzMDMsMjAzNjcsMjA1NzAsMjMwMDUsMzI5NjQsMjE2MTAsMjE2MDgsMjIwMTQsMjI4NjMsMjM0NDksMjQwMzAsMjQyODIsMjYyMDUsMjY0MTcsMjY2MDksMjY2NjYsMjc4ODAsMjc5NTQsMjgyMzQsMjg1NTcsMjg4NTUsMjk2NjQsMzAwODcsMzE4MjAsMzIwMDIsMzIwNDQsMzIxNjIsMzMzMTEsMzQ1MjMsMzUzODcsMzU0NjEsMzYyMDgsMzY0OTAsMzY2NTksMzY5MTMsMzcxOTgsMzcyMDIsMzc5NTYsMzkzNzYsMzE0ODEsMzE5MDksMjA0MjYsMjA3MzcsMjA5MzQsMjI0NzIsMjM1MzUsMjM4MDMsMjYyMDEsMjcxOTcsMjc5OTQsMjgzMTAsMjg2NTIsMjg5NDAsMzAwNjMsMzE0NTksMzQ4NTAsMzY4OTcsMzY5ODEsMzg2MDMsMzk0MjMsMzM1MzcsMjAwMTMsMjAyMTAsMzQ4ODYsMzczMjUsMjEzNzMsMjczNTUsMjY5ODcsMjc3MTMsMzM5MTQsMjI2ODYsMjQ5NzQsMjYzNjYsMjUzMjcsMjg4OTMsMjk5NjksMzAxNTEsMzIzMzgsMzM5NzYsMzU2NTcsMzYxMDQsMjAwNDMsMjE0ODIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjE2NzUsMjIzMjAsMjIzMzYsMjQ1MzUsMjUzNDUsMjUzNTEsMjU3MTEsMjU5MDMsMjYwODgsMjYyMzQsMjY1MjUsMjY1NDcsMjc0OTAsMjc3NDQsMjc4MDIsMjg0NjAsMzA2OTMsMzA3NTcsMzEwNDksMzEwNjMsMzIwMjUsMzI5MzAsMzMwMjYsMzMyNjcsMzM0MzcsMzM0NjMsMzQ1ODQsMzU0NjgsNjM5OTYsMzYxMDAsMzYyODYsMzY5NzgsMzA0NTIsMzEyNTcsMzEyODcsMzIzNDAsMzI4ODcsMjE3NjcsMjE5NzIsMjI2NDUsMjUzOTEsMjU2MzQsMjYxODUsMjYxODcsMjY3MzMsMjcwMzUsMjc1MjQsMjc5NDEsMjgzMzcsMjk2NDUsMjk4MDAsMjk4NTcsMzAwNDMsMzAxMzcsMzA0MzMsMzA0OTQsMzA2MDMsMzEyMDYsMzIyNjUsMzIyODUsMzMyNzUsMzQwOTUsMzQ5NjcsMzUzODYsMzYwNDksMzY1ODcsMzY3ODQsMzY5MTQsMzc4MDUsMzg0OTksMzg1MTUsMzg2NjMsMjAzNTYsMjE0ODksMjMwMTgsMjMyNDEsMjQwODksMjY3MDIsMjk4OTQsMzAxNDIsMzEyMDksMzEzNzgsMzMxODcsMzQ1NDEsMzYwNzQsMzYzMDAsMzY4NDUsMjYwMTUsMjYzODksNjM5OTcsMjI1MTksMjg1MDMsMzIyMjEsMzY2NTUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzc4NzgsMzg1OTgsMjQ1MDEsMjUwNzQsMjg1NDgsMTk5ODgsMjAzNzYsMjA1MTEsMjE0NDksMjE5ODMsMjM5MTksMjQwNDYsMjc0MjUsMjc0OTIsMzA5MjMsMzE2NDIsNjM5OTgsMzY0MjUsMzY1NTQsMzY5NzQsMjU0MTcsMjU2NjIsMzA1MjgsMzEzNjQsMzc2NzksMzgwMTUsNDA4MTAsMjU3NzYsMjg1OTEsMjkxNTgsMjk4NjQsMjk5MTQsMzE0MjgsMzE3NjIsMzIzODYsMzE5MjIsMzI0MDgsMzU3MzgsMzYxMDYsMzgwMTMsMzkxODQsMzkyNDQsMjEwNDksMjM1MTksMjU4MzAsMjY0MTMsMzIwNDYsMjA3MTcsMjE0NDMsMjI2NDksMjQ5MjAsMjQ5MjEsMjUwODIsMjYwMjgsMzE0NDksMzU3MzAsMzU3MzQsMjA0ODksMjA1MTMsMjExMDksMjE4MDksMjMxMDAsMjQyODgsMjQ0MzIsMjQ4ODQsMjU5NTAsMjYxMjQsMjYxNjYsMjYyNzQsMjcwODUsMjgzNTYsMjg0NjYsMjk0NjIsMzAyNDEsMzEzNzksMzMwODEsMzMzNjksMzM3NTAsMzM5ODAsMjA2NjEsMjI1MTIsMjM0ODgsMjM1MjgsMjQ0MjUsMjU1MDUsMzA3NTgsMzIxODEsMzM3NTYsMzQwODEsMzczMTksMzczNjUsMjA4NzQsMjY2MTMsMzE1NzQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzYwMTIsMjA5MzIsMjI5NzEsMjQ3NjUsMzQzODksMjA1MDgsNjM5OTksMjEwNzYsMjM2MTAsMjQ5NTcsMjUxMTQsMjUyOTksMjU4NDIsMjYwMjEsMjgzNjQsMzAyNDAsMzMwMzQsMzY0NDgsMzg0OTUsMzg1ODcsMjAxOTEsMjEzMTUsMjE5MTIsMjI4MjUsMjQwMjksMjU3OTcsMjc4NDksMjgxNTQsMjk1ODgsMzEzNTksMzMzMDcsMzQyMTQsMzYwNjgsMzYzNjgsMzY5ODMsMzczNTEsMzgzNjksMzg0MzMsMzg4NTQsMjA5ODQsMjE3NDYsMjE4OTQsMjQ1MDUsMjU3NjQsMjg1NTIsMzIxODAsMzY2MzksMzY2ODUsMzc5NDEsMjA2ODEsMjM1NzQsMjc4MzgsMjgxNTUsMjk5NzksMzA2NTEsMzE4MDUsMzE4NDQsMzU0NDksMzU1MjIsMjI1NTgsMjI5NzQsMjQwODYsMjU0NjMsMjkyNjYsMzAwOTAsMzA1NzEsMzU1NDgsMzYwMjgsMzY2MjYsMjQzMDcsMjYyMjgsMjgxNTIsMzI4OTMsMzM3MjksMzU1MzEsMzg3MzcsMzk4OTQsNjQwMDAsMjEwNTksMjYzNjcsMjgwNTMsMjgzOTksMzIyMjQsMzU1NTgsMzY5MTAsMzY5NTgsMzk2MzYsMjEwMjEsMjExMTksMjE3MzYsMjQ5ODAsMjUyMjAsMjUzMDcsMjY3ODYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjY4OTgsMjY5NzAsMjcxODksMjg4MTgsMjg5NjYsMzA4MTMsMzA5NzcsMzA5OTAsMzExODYsMzEyNDUsMzI5MTgsMzM0MDAsMzM0OTMsMzM2MDksMzQxMjEsMzU5NzAsMzYyMjksMzcyMTgsMzcyNTksMzcyOTQsMjA0MTksMjIyMjUsMjkxNjUsMzA2NzksMzQ1NjAsMzUzMjAsMjM1NDQsMjQ1MzQsMjY0NDksMzcwMzIsMjE0NzQsMjI2MTgsMjM1NDEsMjQ3NDAsMjQ5NjEsMjU2OTYsMzIzMTcsMzI4ODAsMzQwODUsMzc1MDcsMjU3NzQsMjA2NTIsMjM4MjgsMjYzNjgsMjI2ODQsMjUyNzcsMjU1MTIsMjY4OTQsMjcwMDAsMjcxNjYsMjgyNjcsMzAzOTQsMzExNzksMzM0NjcsMzM4MzMsMzU1MzUsMzYyNjQsMzY4NjEsMzcxMzgsMzcxOTUsMzcyNzYsMzc2NDgsMzc2NTYsMzc3ODYsMzg2MTksMzk0NzgsMzk5NDksMTk5ODUsMzAwNDQsMzEwNjksMzE0ODIsMzE1NjksMzE2ODksMzIzMDIsMzM5ODgsMzY0NDEsMzY0NjgsMzY2MDAsMzY4ODAsMjYxNDksMjY5NDMsMjk3NjMsMjA5ODYsMjY0MTQsNDA2NjgsMjA4MDUsMjQ1NDQsMjc3OTgsMzQ4MDIsMzQ5MDksMzQ5MzUsMjQ3NTYsMzMyMDUsMzM3OTUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzYxMDEsMjE0NjIsMjE1NjEsMjIwNjgsMjMwOTQsMjM2MDEsMjg4MTAsMzI3MzYsMzI4NTgsMzMwMzAsMzMyNjEsMzYyNTksMzcyNTcsMzk1MTksNDA0MzQsMjA1OTYsMjAxNjQsMjE0MDgsMjQ4MjcsMjgyMDQsMjM2NTIsMjAzNjAsMjA1MTYsMjE5ODgsMjM3NjksMjQxNTksMjQ2NzcsMjY3NzIsMjc4MzUsMjgxMDAsMjkxMTgsMzAxNjQsMzAxOTYsMzAzMDUsMzEyNTgsMzEzMDUsMzIxOTksMzIyNTEsMzI2MjIsMzMyNjgsMzQ0NzMsMzY2MzYsMzg2MDEsMzkzNDcsNDA3ODYsMjEwNjMsMjExODksMzkxNDksMzUyNDIsMTk5NzEsMjY1NzgsMjg0MjIsMjA0MDUsMjM1MjIsMjY1MTcsMjc3ODQsMjgwMjQsMjk3MjMsMzA3NTksMzczNDEsMzc3NTYsMzQ3NTYsMzEyMDQsMzEyODEsMjQ1NTUsMjAxODIsMjE2NjgsMjE4MjIsMjI3MDIsMjI5NDksMjQ4MTYsMjUxNzEsMjUzMDIsMjY0MjIsMjY5NjUsMzMzMzMsMzg0NjQsMzkzNDUsMzkzODksMjA1MjQsMjEzMzEsMjE4MjgsMjIzOTYsNjQwMDEsMjUxNzYsNjQwMDIsMjU4MjYsMjYyMTksMjY1ODksMjg2MDksMjg2NTUsMjk3MzAsMjk3NTIsMzUzNTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzc5NDQsMjE1ODUsMjIwMjIsMjIzNzQsMjQzOTIsMjQ5ODYsMjc0NzAsMjg3NjAsMjg4NDUsMzIxODcsMzU0NzcsMjI4OTAsMzMwNjcsMjU1MDYsMzA0NzIsMzI4MjksMzYwMTAsMjI2MTIsMjU2NDUsMjcwNjcsMjM0NDUsMjQwODEsMjgyNzEsNjQwMDMsMzQxNTMsMjA4MTIsMjE0ODgsMjI4MjYsMjQ2MDgsMjQ5MDcsMjc1MjYsMjc3NjAsMjc4ODgsMzE1MTgsMzI5NzQsMzM0OTIsMzYyOTQsMzcwNDAsMzkwODksNjQwMDQsMjU3OTksMjg1ODAsMjU3NDUsMjU4NjAsMjA4MTQsMjE1MjAsMjIzMDMsMzUzNDIsMjQ5MjcsMjY3NDIsNjQwMDUsMzAxNzEsMzE1NzAsMzIxMTMsMzY4OTAsMjI1MzQsMjcwODQsMzMxNTEsMzUxMTQsMzY4NjQsMzg5NjksMjA2MDAsMjI4NzEsMjI5NTYsMjUyMzcsMzY4NzksMzk3MjIsMjQ5MjUsMjkzMDUsMzgzNTgsMjIzNjksMjMxMTAsMjQwNTIsMjUyMjYsMjU3NzMsMjU4NTAsMjY0ODcsMjc4NzQsMjc5NjYsMjkyMjgsMjk3NTAsMzA3NzIsMzI2MzEsMzM0NTMsMzYzMTUsMzg5MzUsMjEwMjgsMjIzMzgsMjY0OTUsMjkyNTYsMjk5MjMsMzYwMDksMzY3NzQsMzczOTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzg0NDIsMjA4NDMsMjE0ODUsMjU0MjAsMjAzMjksMjE3NjQsMjQ3MjYsMjU5NDMsMjc4MDMsMjgwMzEsMjkyNjAsMjk0MzcsMzEyNTUsMzUyMDcsMzU5OTcsMjQ0MjksMjg1NTgsMjg5MjEsMzMxOTIsMjQ4NDYsMjA0MTUsMjA1NTksMjUxNTMsMjkyNTUsMzE2ODcsMzIyMzIsMzI3NDUsMzY5NDEsMzg4MjksMzk0NDksMzYwMjIsMjIzNzgsMjQxNzksMjY1NDQsMzM4MDUsMzU0MTMsMjE1MzYsMjMzMTgsMjQxNjMsMjQyOTAsMjQzMzAsMjU5ODcsMzI5NTQsMzQxMDksMzgyODEsMzg0OTEsMjAyOTYsMjEyNTMsMjEyNjEsMjEyNjMsMjE2MzgsMjE3NTQsMjIyNzUsMjQwNjcsMjQ1OTgsMjUyNDMsMjUyNjUsMjU0MjksNjQwMDYsMjc4NzMsMjgwMDYsMzAxMjksMzA3NzAsMzI5OTAsMzMwNzEsMzM1MDIsMzM4ODksMzM5NzAsMzQ5NTcsMzUwOTAsMzY4NzUsMzc2MTAsMzkxNjUsMzk4MjUsMjQxMzMsMjYyOTIsMjYzMzMsMjg2ODksMjkxOTAsNjQwMDcsMjA0NjksMjExMTcsMjQ0MjYsMjQ5MTUsMjY0NTEsMjcxNjEsMjg0MTgsMjk5MjIsMzEwODAsMzQ5MjAsMzU5NjEsMzkxMTEsMzkxMDgsMzk0OTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjE2OTcsMzEyNjMsMjY5NjMsMzU1NzUsMzU5MTQsMzkwODAsMzkzNDIsMjQ0NDQsMjUyNTksMzAxMzAsMzAzODIsMzQ5ODcsMzY5OTEsMzg0NjYsMjEzMDUsMjQzODAsMjQ1MTcsMjc4NTIsMjk2NDQsMzAwNTAsMzAwOTEsMzE1NTgsMzM1MzQsMzkzMjUsMjAwNDcsMzY5MjQsMTk5NzksMjAzMDksMjE0MTQsMjI3OTksMjQyNjQsMjYxNjAsMjc4MjcsMjk3ODEsMzM2NTUsMzQ2NjIsMzYwMzIsMzY5NDQsMzg2ODYsMzk5NTcsMjI3MzcsMjM0MTYsMzQzODQsMzU2MDQsNDAzNzIsMjM1MDYsMjQ2ODAsMjQ3MTcsMjYwOTcsMjc3MzUsMjg0NTAsMjg1NzksMjg2OTgsMzI1OTcsMzI3NTIsMzgyODksMzgyOTAsMzg0ODAsMzg4NjcsMjExMDYsMzY2NzYsMjA5ODksMjE1NDcsMjE2ODgsMjE4NTksMjE4OTgsMjczMjMsMjgwODUsMzIyMTYsMzMzODIsMzc1MzIsMzg1MTksNDA1NjksMjE1MTIsMjE3MDQsMzA0MTgsMzQ1MzIsMzgzMDgsMzgzNTYsMzg0OTIsMjAxMzAsMjAyMzMsMjMwMjIsMjMyNzAsMjQwNTUsMjQ2NTgsMjUyMzksMjY0NzcsMjY2ODksMjc3ODIsMjgyMDcsMzI1NjgsMzI5MjMsMzMzMjIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNjQwMDgsNjQwMDksMzg5MTcsMjAxMzMsMjA1NjUsMjE2ODMsMjI0MTksMjI4NzQsMjM0MDEsMjM0NzUsMjUwMzIsMjY5OTksMjgwMjMsMjg3MDcsMzQ4MDksMzUyOTksMzU0NDIsMzU1NTksMzY5OTQsMzk0MDUsMzk2MDgsMjExODIsMjY2ODAsMjA1MDIsMjQxODQsMjY0NDcsMzM2MDcsMzQ4OTIsMjAxMzksMjE1MjEsMjIxOTAsMjk2NzAsMzcxNDEsMzg5MTEsMzkxNzcsMzkyNTUsMzkzMjEsMjIwOTksMjI2ODcsMzQzOTUsMzUzNzcsMjUwMTAsMjczODIsMjk1NjMsMzY1NjIsMjc0NjMsMzg1NzAsMzk1MTEsMjI4NjksMjkxODQsMzYyMDMsMzg3NjEsMjA0MzYsMjM3OTYsMjQzNTgsMjUwODAsMjYyMDMsMjc4ODMsMjg4NDMsMjk1NzIsMjk2MjUsMjk2OTQsMzA1MDUsMzA1NDEsMzIwNjcsMzIwOTgsMzIyOTEsMzMzMzUsMzQ4OTgsNjQwMTAsMzYwNjYsMzc0NDksMzkwMjMsMjMzNzcsMzEzNDgsMzQ4ODAsMzg5MTMsMjMyNDQsMjA0NDgsMjEzMzIsMjI4NDYsMjM4MDUsMjU0MDYsMjgwMjUsMjk0MzMsMzMwMjksMzMwMzEsMzM2OTgsMzc1ODMsMzg5NjAsMjAxMzYsMjA4MDQsMjEwMDksMjI0MTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjQ0MTgsMjc4NDIsMjgzNjYsMjg2NzcsMjg3NTIsMjg4NDcsMjkwNzQsMjk2NzMsMjk4MDEsMzM2MTAsMzQ3MjIsMzQ5MTMsMzY4NzIsMzcwMjYsMzc3OTUsMzkzMzYsMjA4NDYsMjQ0MDcsMjQ4MDAsMjQ5MzUsMjYyOTEsMzQxMzcsMzY0MjYsMzcyOTUsMzg3OTUsMjAwNDYsMjAxMTQsMjE2MjgsMjI3NDEsMjI3NzgsMjI5MDksMjM3MzMsMjQzNTksMjUxNDIsMjUxNjAsMjYxMjIsMjYyMTUsMjc2MjcsMjgwMDksMjgxMTEsMjgyNDYsMjg0MDgsMjg1NjQsMjg2NDAsMjg2NDksMjg3NjUsMjkzOTIsMjk3MzMsMjk3ODYsMjk5MjAsMzAzNTUsMzEwNjgsMzE5NDYsMzIyODYsMzI5OTMsMzM0NDYsMzM4OTksMzM5ODMsMzQzODIsMzQzOTksMzQ2NzYsMzU3MDMsMzU5NDYsMzc4MDQsMzg5MTIsMzkwMTMsMjQ3ODUsMjUxMTAsMzcyMzksMjMxMzAsMjYxMjcsMjgxNTEsMjgyMjIsMjk3NTksMzk3NDYsMjQ1NzMsMjQ3OTQsMzE1MDMsMjE3MDAsMjQzNDQsMjc3NDIsMjc4NTksMjc5NDYsMjg4ODgsMzIwMDUsMzQ0MjUsMzUzNDAsNDAyNTEsMjEyNzAsMjE2NDQsMjMzMDEsMjcxOTQsMjg3NzksMzAwNjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzExMTcsMzExNjYsMzM0NTcsMzM3NzUsMzU0NDEsMzU2NDksMzYwMDgsMzg3NzIsNjQwMTEsMjU4NDQsMjU4OTksMzA5MDYsMzA5MDcsMzEzMzksMjAwMjQsMjE5MTQsMjI4NjQsMjM0NjIsMjQxODcsMjQ3MzksMjU1NjMsMjc0ODksMjYyMTMsMjY3MDcsMjgxODUsMjkwMjksMjk4NzIsMzIwMDgsMzY5OTYsMzk1MjksMzk5NzMsMjc5NjMsMjgzNjksMjk1MDIsMzU5MDUsMzgzNDYsMjA5NzYsMjQxNDAsMjQ0ODgsMjQ2NTMsMjQ4MjIsMjQ4ODAsMjQ5MDgsMjYxNzksMjYxODAsMjcwNDUsMjc4NDEsMjgyNTUsMjgzNjEsMjg1MTQsMjkwMDQsMjk4NTIsMzAzNDMsMzE2ODEsMzE3ODMsMzM2MTgsMzQ2NDcsMzY5NDUsMzg1NDEsNDA2NDMsMjEyOTUsMjIyMzgsMjQzMTUsMjQ0NTgsMjQ2NzQsMjQ3MjQsMjUwNzksMjYyMTQsMjYzNzEsMjcyOTIsMjgxNDIsMjg1OTAsMjg3ODQsMjk1NDYsMzIzNjIsMzMyMTQsMzM1ODgsMzQ1MTYsMzU0OTYsMzYwMzYsMjExMjMsMjk1NTQsMjM0NDYsMjcyNDMsMzc4OTIsMjE3NDIsMjIxNTAsMjMzODksMjU5MjgsMjU5ODksMjYzMTMsMjY3ODMsMjgwNDUsMjgxMDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjkyNDMsMzI5NDgsMzcyMzcsMzk1MDEsMjAzOTksMjA1MDUsMjE0MDIsMjE1MTgsMjE1NjQsMjE4OTcsMjE5NTcsMjQxMjcsMjQ0NjAsMjY0MjksMjkwMzAsMjk2NjEsMzY4NjksMjEyMTEsMjEyMzUsMjI2MjgsMjI3MzQsMjg5MzIsMjkwNzEsMjkxNzksMzQyMjQsMzUzNDcsMjYyNDgsMzQyMTYsMjE5MjcsMjYyNDQsMjkwMDIsMzM4NDEsMjEzMjEsMjE5MTMsMjc1ODUsMjQ0MDksMjQ1MDksMjU1ODIsMjYyNDksMjg5OTksMzU1NjksMzY2MzcsNDA2MzgsMjAyNDEsMjU2NTgsMjg4NzUsMzAwNTQsMzQ0MDcsMjQ2NzYsMzU2NjIsNDA0NDAsMjA4MDcsMjA5ODIsMjEyNTYsMjc5NTgsMzMwMTYsNDA2NTcsMjYxMzMsMjc0MjcsMjg4MjQsMzAxNjUsMjE1MDcsMjM2NzMsMzIwMDcsMzUzNTAsMjc0MjQsMjc0NTMsMjc0NjIsMjE1NjAsMjQ2ODgsMjc5NjUsMzI3MjUsMzMyODgsMjA2OTQsMjA5NTgsMjE5MTYsMjIxMjMsMjIyMjEsMjMwMjAsMjMzMDUsMjQwNzYsMjQ5ODUsMjQ5ODQsMjUxMzcsMjYyMDYsMjYzNDIsMjkwODEsMjkxMTMsMjkxMTQsMjkzNTEsMzExNDMsMzEyMzIsMzI2OTAsMzU0NDAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sXG4gIFwiZ2IxODAzMFwiOlsxOTk3MCwxOTk3MiwxOTk3MywxOTk3NCwxOTk4MywxOTk4NiwxOTk5MSwxOTk5OSwyMDAwMCwyMDAwMSwyMDAwMywyMDAwNiwyMDAwOSwyMDAxNCwyMDAxNSwyMDAxNywyMDAxOSwyMDAyMSwyMDAyMywyMDAyOCwyMDAzMiwyMDAzMywyMDAzNCwyMDAzNiwyMDAzOCwyMDA0MiwyMDA0OSwyMDA1MywyMDA1NSwyMDA1OCwyMDA1OSwyMDA2NiwyMDA2NywyMDA2OCwyMDA2OSwyMDA3MSwyMDA3MiwyMDA3NCwyMDA3NSwyMDA3NiwyMDA3NywyMDA3OCwyMDA3OSwyMDA4MiwyMDA4NCwyMDA4NSwyMDA4NiwyMDA4NywyMDA4OCwyMDA4OSwyMDA5MCwyMDA5MSwyMDA5MiwyMDA5MywyMDA5NSwyMDA5NiwyMDA5NywyMDA5OCwyMDA5OSwyMDEwMCwyMDEwMSwyMDEwMywyMDEwNiwyMDExMiwyMDExOCwyMDExOSwyMDEyMSwyMDEyNCwyMDEyNSwyMDEyNiwyMDEzMSwyMDEzOCwyMDE0MywyMDE0NCwyMDE0NSwyMDE0OCwyMDE1MCwyMDE1MSwyMDE1MiwyMDE1MywyMDE1NiwyMDE1NywyMDE1OCwyMDE2OCwyMDE3MiwyMDE3NSwyMDE3NiwyMDE3OCwyMDE4NiwyMDE4NywyMDE4OCwyMDE5MiwyMDE5NCwyMDE5OCwyMDE5OSwyMDIwMSwyMDIwNSwyMDIwNiwyMDIwNywyMDIwOSwyMDIxMiwyMDIxNiwyMDIxNywyMDIxOCwyMDIyMCwyMDIyMiwyMDIyNCwyMDIyNiwyMDIyNywyMDIyOCwyMDIyOSwyMDIzMCwyMDIzMSwyMDIzMiwyMDIzNSwyMDIzNiwyMDI0MiwyMDI0MywyMDI0NCwyMDI0NSwyMDI0NiwyMDI1MiwyMDI1MywyMDI1NywyMDI1OSwyMDI2NCwyMDI2NSwyMDI2OCwyMDI2OSwyMDI3MCwyMDI3MywyMDI3NSwyMDI3NywyMDI3OSwyMDI4MSwyMDI4MywyMDI4NiwyMDI4NywyMDI4OCwyMDI4OSwyMDI5MCwyMDI5MiwyMDI5MywyMDI5NSwyMDI5NiwyMDI5NywyMDI5OCwyMDI5OSwyMDMwMCwyMDMwNiwyMDMwOCwyMDMxMCwyMDMyMSwyMDMyMiwyMDMyNiwyMDMyOCwyMDMzMCwyMDMzMSwyMDMzMywyMDMzNCwyMDMzNywyMDMzOCwyMDM0MSwyMDM0MywyMDM0NCwyMDM0NSwyMDM0NiwyMDM0OSwyMDM1MiwyMDM1MywyMDM1NCwyMDM1NywyMDM1OCwyMDM1OSwyMDM2MiwyMDM2NCwyMDM2NiwyMDM2OCwyMDM3MCwyMDM3MSwyMDM3MywyMDM3NCwyMDM3NiwyMDM3NywyMDM3OCwyMDM4MCwyMDM4MiwyMDM4MywyMDM4NSwyMDM4NiwyMDM4OCwyMDM5NSwyMDM5NywyMDQwMCwyMDQwMSwyMDQwMiwyMDQwMywyMDQwNCwyMDQwNiwyMDQwNywyMDQwOCwyMDQwOSwyMDQxMCwyMDQxMSwyMDQxMiwyMDQxMywyMDQxNCwyMDQxNiwyMDQxNywyMDQxOCwyMDQyMiwyMDQyMywyMDQyNCwyMDQyNSwyMDQyNywyMDQyOCwyMDQyOSwyMDQzNCwyMDQzNSwyMDQzNiwyMDQzNywyMDQzOCwyMDQ0MSwyMDQ0MywyMDQ0OCwyMDQ1MCwyMDQ1MiwyMDQ1MywyMDQ1NSwyMDQ1OSwyMDQ2MCwyMDQ2NCwyMDQ2NiwyMDQ2OCwyMDQ2OSwyMDQ3MCwyMDQ3MSwyMDQ3MywyMDQ3NSwyMDQ3NiwyMDQ3NywyMDQ3OSwyMDQ4MCwyMDQ4MSwyMDQ4MiwyMDQ4MywyMDQ4NCwyMDQ4NSwyMDQ4NiwyMDQ4NywyMDQ4OCwyMDQ4OSwyMDQ5MCwyMDQ5MSwyMDQ5NCwyMDQ5NiwyMDQ5NywyMDQ5OSwyMDUwMSwyMDUwMiwyMDUwMywyMDUwNywyMDUwOSwyMDUxMCwyMDUxMiwyMDUxNCwyMDUxNSwyMDUxNiwyMDUxOSwyMDUyMywyMDUyNywyMDUyOCwyMDUyOSwyMDUzMCwyMDUzMSwyMDUzMiwyMDUzMywyMDUzNCwyMDUzNSwyMDUzNiwyMDUzNywyMDUzOSwyMDU0MSwyMDU0MywyMDU0NCwyMDU0NSwyMDU0NiwyMDU0OCwyMDU0OSwyMDU1MCwyMDU1MywyMDU1NCwyMDU1NSwyMDU1NywyMDU2MCwyMDU2MSwyMDU2MiwyMDU2MywyMDU2NCwyMDU2NiwyMDU2NywyMDU2OCwyMDU2OSwyMDU3MSwyMDU3MywyMDU3NCwyMDU3NSwyMDU3NiwyMDU3NywyMDU3OCwyMDU3OSwyMDU4MCwyMDU4MiwyMDU4MywyMDU4NCwyMDU4NSwyMDU4NiwyMDU4NywyMDU4OSwyMDU5MCwyMDU5MSwyMDU5MiwyMDU5MywyMDU5NCwyMDU5NSwyMDU5NiwyMDU5NywyMDYwMCwyMDYwMSwyMDYwMiwyMDYwNCwyMDYwNSwyMDYwOSwyMDYxMCwyMDYxMSwyMDYxMiwyMDYxNCwyMDYxNSwyMDYxNywyMDYxOCwyMDYxOSwyMDYyMCwyMDYyMiwyMDYyMywyMDYyNCwyMDYyNSwyMDYyNiwyMDYyNywyMDYyOCwyMDYyOSwyMDYzMCwyMDYzMSwyMDYzMiwyMDYzMywyMDYzNCwyMDYzNSwyMDYzNiwyMDYzNywyMDYzOCwyMDYzOSwyMDY0MCwyMDY0MSwyMDY0MiwyMDY0NCwyMDY0NiwyMDY1MCwyMDY1MSwyMDY1MywyMDY1NCwyMDY1NSwyMDY1NiwyMDY1NywyMDY1OSwyMDY2MCwyMDY2MSwyMDY2MiwyMDY2MywyMDY2NCwyMDY2NSwyMDY2OCwyMDY2OSwyMDY3MCwyMDY3MSwyMDY3MiwyMDY3MywyMDY3NCwyMDY3NSwyMDY3NiwyMDY3NywyMDY3OCwyMDY3OSwyMDY4MCwyMDY4MSwyMDY4MiwyMDY4MywyMDY4NCwyMDY4NSwyMDY4NiwyMDY4OCwyMDY4OSwyMDY5MCwyMDY5MSwyMDY5MiwyMDY5MywyMDY5NSwyMDY5NiwyMDY5NywyMDY5OSwyMDcwMCwyMDcwMSwyMDcwMiwyMDcwMywyMDcwNCwyMDcwNSwyMDcwNiwyMDcwNywyMDcwOCwyMDcwOSwyMDcxMiwyMDcxMywyMDcxNCwyMDcxNSwyMDcxOSwyMDcyMCwyMDcyMSwyMDcyMiwyMDcyNCwyMDcyNiwyMDcyNywyMDcyOCwyMDcyOSwyMDczMCwyMDczMiwyMDczMywyMDczNCwyMDczNSwyMDczNiwyMDczNywyMDczOCwyMDczOSwyMDc0MCwyMDc0MSwyMDc0NCwyMDc0NSwyMDc0NiwyMDc0OCwyMDc0OSwyMDc1MCwyMDc1MSwyMDc1MiwyMDc1MywyMDc1NSwyMDc1NiwyMDc1NywyMDc1OCwyMDc1OSwyMDc2MCwyMDc2MSwyMDc2MiwyMDc2MywyMDc2NCwyMDc2NSwyMDc2NiwyMDc2NywyMDc2OCwyMDc3MCwyMDc3MSwyMDc3MiwyMDc3MywyMDc3NCwyMDc3NSwyMDc3NiwyMDc3NywyMDc3OCwyMDc3OSwyMDc4MCwyMDc4MSwyMDc4MiwyMDc4MywyMDc4NCwyMDc4NSwyMDc4NiwyMDc4NywyMDc4OCwyMDc4OSwyMDc5MCwyMDc5MSwyMDc5MiwyMDc5MywyMDc5NCwyMDc5NSwyMDc5NiwyMDc5NywyMDc5OCwyMDgwMiwyMDgwNywyMDgxMCwyMDgxMiwyMDgxNCwyMDgxNSwyMDgxNiwyMDgxOCwyMDgxOSwyMDgyMywyMDgyNCwyMDgyNSwyMDgyNywyMDgyOSwyMDgzMCwyMDgzMSwyMDgzMiwyMDgzMywyMDgzNSwyMDgzNiwyMDgzOCwyMDgzOSwyMDg0MSwyMDg0MiwyMDg0NywyMDg1MCwyMDg1OCwyMDg2MiwyMDg2MywyMDg2NywyMDg2OCwyMDg3MCwyMDg3MSwyMDg3NCwyMDg3NSwyMDg3OCwyMDg3OSwyMDg4MCwyMDg4MSwyMDg4MywyMDg4NCwyMDg4OCwyMDg5MCwyMDg5MywyMDg5NCwyMDg5NSwyMDg5NywyMDg5OSwyMDkwMiwyMDkwMywyMDkwNCwyMDkwNSwyMDkwNiwyMDkwOSwyMDkxMCwyMDkxNiwyMDkyMCwyMDkyMSwyMDkyMiwyMDkyNiwyMDkyNywyMDkyOSwyMDkzMCwyMDkzMSwyMDkzMywyMDkzNiwyMDkzOCwyMDk0MSwyMDk0MiwyMDk0NCwyMDk0NiwyMDk0NywyMDk0OCwyMDk0OSwyMDk1MCwyMDk1MSwyMDk1MiwyMDk1MywyMDk1NCwyMDk1NiwyMDk1OCwyMDk1OSwyMDk2MiwyMDk2MywyMDk2NSwyMDk2NiwyMDk2NywyMDk2OCwyMDk2OSwyMDk3MCwyMDk3MiwyMDk3NCwyMDk3NywyMDk3OCwyMDk4MCwyMDk4MywyMDk5MCwyMDk5NiwyMDk5NywyMTAwMSwyMTAwMywyMTAwNCwyMTAwNywyMTAwOCwyMTAxMSwyMTAxMiwyMTAxMywyMTAyMCwyMTAyMiwyMTAyMywyMTAyNSwyMTAyNiwyMTAyNywyMTAyOSwyMTAzMCwyMTAzMSwyMTAzNCwyMTAzNiwyMTAzOSwyMTA0MSwyMTA0MiwyMTA0NCwyMTA0NSwyMTA1MiwyMTA1NCwyMTA2MCwyMTA2MSwyMTA2MiwyMTA2MywyMTA2NCwyMTA2NSwyMTA2NywyMTA3MCwyMTA3MSwyMTA3NCwyMTA3NSwyMTA3NywyMTA3OSwyMTA4MCwyMTA4MSwyMTA4MiwyMTA4MywyMTA4NSwyMTA4NywyMTA4OCwyMTA5MCwyMTA5MSwyMTA5MiwyMTA5NCwyMTA5NiwyMTA5OSwyMTEwMCwyMTEwMSwyMTEwMiwyMTEwNCwyMTEwNSwyMTEwNywyMTEwOCwyMTEwOSwyMTExMCwyMTExMSwyMTExMiwyMTExMywyMTExNCwyMTExNSwyMTExNiwyMTExOCwyMTEyMCwyMTEyMywyMTEyNCwyMTEyNSwyMTEyNiwyMTEyNywyMTEyOSwyMTEzMCwyMTEzMSwyMTEzMiwyMTEzMywyMTEzNCwyMTEzNSwyMTEzNywyMTEzOCwyMTE0MCwyMTE0MSwyMTE0MiwyMTE0MywyMTE0NCwyMTE0NSwyMTE0NiwyMTE0OCwyMTE1NiwyMTE1NywyMTE1OCwyMTE1OSwyMTE2NiwyMTE2NywyMTE2OCwyMTE3MiwyMTE3MywyMTE3NCwyMTE3NSwyMTE3NiwyMTE3NywyMTE3OCwyMTE3OSwyMTE4MCwyMTE4MSwyMTE4NCwyMTE4NSwyMTE4NiwyMTE4OCwyMTE4OSwyMTE5MCwyMTE5MiwyMTE5NCwyMTE5NiwyMTE5NywyMTE5OCwyMTE5OSwyMTIwMSwyMTIwMywyMTIwNCwyMTIwNSwyMTIwNywyMTIwOSwyMTIxMCwyMTIxMSwyMTIxMiwyMTIxMywyMTIxNCwyMTIxNiwyMTIxNywyMTIxOCwyMTIxOSwyMTIyMSwyMTIyMiwyMTIyMywyMTIyNCwyMTIyNSwyMTIyNiwyMTIyNywyMTIyOCwyMTIyOSwyMTIzMCwyMTIzMSwyMTIzMywyMTIzNCwyMTIzNSwyMTIzNiwyMTIzNywyMTIzOCwyMTIzOSwyMTI0MCwyMTI0MywyMTI0NCwyMTI0NSwyMTI0OSwyMTI1MCwyMTI1MSwyMTI1MiwyMTI1NSwyMTI1NywyMTI1OCwyMTI1OSwyMTI2MCwyMTI2MiwyMTI2NSwyMTI2NiwyMTI2NywyMTI2OCwyMTI3MiwyMTI3NSwyMTI3NiwyMTI3OCwyMTI3OSwyMTI4MiwyMTI4NCwyMTI4NSwyMTI4NywyMTI4OCwyMTI4OSwyMTI5MSwyMTI5MiwyMTI5MywyMTI5NSwyMTI5NiwyMTI5NywyMTI5OCwyMTI5OSwyMTMwMCwyMTMwMSwyMTMwMiwyMTMwMywyMTMwNCwyMTMwOCwyMTMwOSwyMTMxMiwyMTMxNCwyMTMxNiwyMTMxOCwyMTMyMywyMTMyNCwyMTMyNSwyMTMyOCwyMTMzMiwyMTMzNiwyMTMzNywyMTMzOSwyMTM0MSwyMTM0OSwyMTM1MiwyMTM1NCwyMTM1NiwyMTM1NywyMTM2MiwyMTM2NiwyMTM2OSwyMTM3MSwyMTM3MiwyMTM3MywyMTM3NCwyMTM3NiwyMTM3NywyMTM3OSwyMTM4MywyMTM4NCwyMTM4NiwyMTM5MCwyMTM5MSwyMTM5MiwyMTM5MywyMTM5NCwyMTM5NSwyMTM5NiwyMTM5OCwyMTM5OSwyMTQwMSwyMTQwMywyMTQwNCwyMTQwNiwyMTQwOCwyMTQwOSwyMTQxMiwyMTQxNSwyMTQxOCwyMTQxOSwyMTQyMCwyMTQyMSwyMTQyMywyMTQyNCwyMTQyNSwyMTQyNiwyMTQyNywyMTQyOCwyMTQyOSwyMTQzMSwyMTQzMiwyMTQzMywyMTQzNCwyMTQzNiwyMTQzNywyMTQzOCwyMTQ0MCwyMTQ0MywyMTQ0NCwyMTQ0NSwyMTQ0NiwyMTQ0NywyMTQ1NCwyMTQ1NSwyMTQ1NiwyMTQ1OCwyMTQ1OSwyMTQ2MSwyMTQ2NiwyMTQ2OCwyMTQ2OSwyMTQ3MCwyMTQ3MywyMTQ3NCwyMTQ3OSwyMTQ5MiwyMTQ5OCwyMTUwMiwyMTUwMywyMTUwNCwyMTUwNiwyMTUwOSwyMTUxMSwyMTUxNSwyMTUyNCwyMTUyOCwyMTUyOSwyMTUzMCwyMTUzMiwyMTUzOCwyMTU0MCwyMTU0MSwyMTU0NiwyMTU1MiwyMTU1NSwyMTU1OCwyMTU1OSwyMTU2MiwyMTU2NSwyMTU2NywyMTU2OSwyMTU3MCwyMTU3MiwyMTU3MywyMTU3NSwyMTU3NywyMTU4MCwyMTU4MSwyMTU4MiwyMTU4MywyMTU4NSwyMTU5NCwyMTU5NywyMTU5OCwyMTU5OSwyMTYwMCwyMTYwMSwyMTYwMywyMTYwNSwyMTYwNywyMTYwOSwyMTYxMCwyMTYxMSwyMTYxMiwyMTYxMywyMTYxNCwyMTYxNSwyMTYxNiwyMTYyMCwyMTYyNSwyMTYyNiwyMTYzMCwyMTYzMSwyMTYzMywyMTYzNSwyMTYzNywyMTYzOSwyMTY0MCwyMTY0MSwyMTY0MiwyMTY0NSwyMTY0OSwyMTY1MSwyMTY1NSwyMTY1NiwyMTY2MCwyMTY2MiwyMTY2MywyMTY2NCwyMTY2NSwyMTY2NiwyMTY2OSwyMTY3OCwyMTY4MCwyMTY4MiwyMTY4NSwyMTY4NiwyMTY4NywyMTY4OSwyMTY5MCwyMTY5MiwyMTY5NCwyMTY5OSwyMTcwMSwyMTcwNiwyMTcwNywyMTcxOCwyMTcyMCwyMTcyMywyMTcyOCwyMTcyOSwyMTczMCwyMTczMSwyMTczMiwyMTczOSwyMTc0MCwyMTc0MywyMTc0NCwyMTc0NSwyMTc0OCwyMTc0OSwyMTc1MCwyMTc1MSwyMTc1MiwyMTc1MywyMTc1NSwyMTc1OCwyMTc2MCwyMTc2MiwyMTc2MywyMTc2NCwyMTc2NSwyMTc2OCwyMTc3MCwyMTc3MSwyMTc3MiwyMTc3MywyMTc3NCwyMTc3OCwyMTc3OSwyMTc4MSwyMTc4MiwyMTc4MywyMTc4NCwyMTc4NSwyMTc4NiwyMTc4OCwyMTc4OSwyMTc5MCwyMTc5MSwyMTc5MywyMTc5NywyMTc5OCwyMTgwMCwyMTgwMSwyMTgwMywyMTgwNSwyMTgxMCwyMTgxMiwyMTgxMywyMTgxNCwyMTgxNiwyMTgxNywyMTgxOCwyMTgxOSwyMTgyMSwyMTgyNCwyMTgyNiwyMTgyOSwyMTgzMSwyMTgzMiwyMTgzNSwyMTgzNiwyMTgzNywyMTgzOCwyMTgzOSwyMTg0MSwyMTg0MiwyMTg0MywyMTg0NCwyMTg0NywyMTg0OCwyMTg0OSwyMTg1MCwyMTg1MSwyMTg1MywyMTg1NCwyMTg1NSwyMTg1NiwyMTg1OCwyMTg1OSwyMTg2NCwyMTg2NSwyMTg2NywyMTg3MSwyMTg3MiwyMTg3MywyMTg3NCwyMTg3NSwyMTg3NiwyMTg4MSwyMTg4MiwyMTg4NSwyMTg4NywyMTg5MywyMTg5NCwyMTkwMCwyMTkwMSwyMTkwMiwyMTkwNCwyMTkwNiwyMTkwNywyMTkwOSwyMTkxMCwyMTkxMSwyMTkxNCwyMTkxNSwyMTkxOCwyMTkyMCwyMTkyMSwyMTkyMiwyMTkyMywyMTkyNCwyMTkyNSwyMTkyNiwyMTkyOCwyMTkyOSwyMTkzMCwyMTkzMSwyMTkzMiwyMTkzMywyMTkzNCwyMTkzNSwyMTkzNiwyMTkzOCwyMTk0MCwyMTk0MiwyMTk0NCwyMTk0NiwyMTk0OCwyMTk1MSwyMTk1MiwyMTk1MywyMTk1NCwyMTk1NSwyMTk1OCwyMTk1OSwyMTk2MCwyMTk2MiwyMTk2MywyMTk2NiwyMTk2NywyMTk2OCwyMTk3MywyMTk3NSwyMTk3NiwyMTk3NywyMTk3OCwyMTk3OSwyMTk4MiwyMTk4NCwyMTk4NiwyMTk5MSwyMTk5MywyMTk5NywyMTk5OCwyMjAwMCwyMjAwMSwyMjAwNCwyMjAwNiwyMjAwOCwyMjAwOSwyMjAxMCwyMjAxMSwyMjAxMiwyMjAxNSwyMjAxOCwyMjAxOSwyMjAyMCwyMjAyMSwyMjAyMiwyMjAyMywyMjAyNiwyMjAyNywyMjAyOSwyMjAzMiwyMjAzMywyMjAzNCwyMjAzNSwyMjAzNiwyMjAzNywyMjAzOCwyMjAzOSwyMjA0MSwyMjA0MiwyMjA0NCwyMjA0NSwyMjA0OCwyMjA0OSwyMjA1MCwyMjA1MywyMjA1NCwyMjA1NiwyMjA1NywyMjA1OCwyMjA1OSwyMjA2MiwyMjA2MywyMjA2NCwyMjA2NywyMjA2OSwyMjA3MSwyMjA3MiwyMjA3NCwyMjA3NiwyMjA3NywyMjA3OCwyMjA4MCwyMjA4MSwyMjA4MiwyMjA4MywyMjA4NCwyMjA4NSwyMjA4NiwyMjA4NywyMjA4OCwyMjA4OSwyMjA5MCwyMjA5MSwyMjA5NSwyMjA5NiwyMjA5NywyMjA5OCwyMjA5OSwyMjEwMSwyMjEwMiwyMjEwNiwyMjEwNywyMjEwOSwyMjExMCwyMjExMSwyMjExMiwyMjExMywyMjExNSwyMjExNywyMjExOCwyMjExOSwyMjEyNSwyMjEyNiwyMjEyNywyMjEyOCwyMjEzMCwyMjEzMSwyMjEzMiwyMjEzMywyMjEzNSwyMjEzNiwyMjEzNywyMjEzOCwyMjE0MSwyMjE0MiwyMjE0MywyMjE0NCwyMjE0NSwyMjE0NiwyMjE0NywyMjE0OCwyMjE1MSwyMjE1MiwyMjE1MywyMjE1NCwyMjE1NSwyMjE1NiwyMjE1NywyMjE2MCwyMjE2MSwyMjE2MiwyMjE2NCwyMjE2NSwyMjE2NiwyMjE2NywyMjE2OCwyMjE2OSwyMjE3MCwyMjE3MSwyMjE3MiwyMjE3MywyMjE3NCwyMjE3NSwyMjE3NiwyMjE3NywyMjE3OCwyMjE4MCwyMjE4MSwyMjE4MiwyMjE4MywyMjE4NCwyMjE4NSwyMjE4NiwyMjE4NywyMjE4OCwyMjE4OSwyMjE5MCwyMjE5MiwyMjE5MywyMjE5NCwyMjE5NSwyMjE5NiwyMjE5NywyMjE5OCwyMjIwMCwyMjIwMSwyMjIwMiwyMjIwMywyMjIwNSwyMjIwNiwyMjIwNywyMjIwOCwyMjIwOSwyMjIxMCwyMjIxMSwyMjIxMiwyMjIxMywyMjIxNCwyMjIxNSwyMjIxNiwyMjIxNywyMjIxOSwyMjIyMCwyMjIyMSwyMjIyMiwyMjIyMywyMjIyNCwyMjIyNSwyMjIyNiwyMjIyNywyMjIyOSwyMjIzMCwyMjIzMiwyMjIzMywyMjIzNiwyMjI0MywyMjI0NSwyMjI0NiwyMjI0NywyMjI0OCwyMjI0OSwyMjI1MCwyMjI1MiwyMjI1NCwyMjI1NSwyMjI1OCwyMjI1OSwyMjI2MiwyMjI2MywyMjI2NCwyMjI2NywyMjI2OCwyMjI3MiwyMjI3MywyMjI3NCwyMjI3NywyMjI3OSwyMjI4MywyMjI4NCwyMjI4NSwyMjI4NiwyMjI4NywyMjI4OCwyMjI4OSwyMjI5MCwyMjI5MSwyMjI5MiwyMjI5MywyMjI5NCwyMjI5NSwyMjI5NiwyMjI5NywyMjI5OCwyMjI5OSwyMjMwMSwyMjMwMiwyMjMwNCwyMjMwNSwyMjMwNiwyMjMwOCwyMjMwOSwyMjMxMCwyMjMxMSwyMjMxNSwyMjMyMSwyMjMyMiwyMjMyNCwyMjMyNSwyMjMyNiwyMjMyNywyMjMyOCwyMjMzMiwyMjMzMywyMjMzNSwyMjMzNywyMjMzOSwyMjM0MCwyMjM0MSwyMjM0MiwyMjM0NCwyMjM0NSwyMjM0NywyMjM1NCwyMjM1NSwyMjM1NiwyMjM1NywyMjM1OCwyMjM2MCwyMjM2MSwyMjM3MCwyMjM3MSwyMjM3MywyMjM3NSwyMjM4MCwyMjM4MiwyMjM4NCwyMjM4NSwyMjM4NiwyMjM4OCwyMjM4OSwyMjM5MiwyMjM5MywyMjM5NCwyMjM5NywyMjM5OCwyMjM5OSwyMjQwMCwyMjQwMSwyMjQwNywyMjQwOCwyMjQwOSwyMjQxMCwyMjQxMywyMjQxNCwyMjQxNSwyMjQxNiwyMjQxNywyMjQyMCwyMjQyMSwyMjQyMiwyMjQyMywyMjQyNCwyMjQyNSwyMjQyNiwyMjQyOCwyMjQyOSwyMjQzMCwyMjQzMSwyMjQzNywyMjQ0MCwyMjQ0MiwyMjQ0NCwyMjQ0NywyMjQ0OCwyMjQ0OSwyMjQ1MSwyMjQ1MywyMjQ1NCwyMjQ1NSwyMjQ1NywyMjQ1OCwyMjQ1OSwyMjQ2MCwyMjQ2MSwyMjQ2MiwyMjQ2MywyMjQ2NCwyMjQ2NSwyMjQ2OCwyMjQ2OSwyMjQ3MCwyMjQ3MSwyMjQ3MiwyMjQ3MywyMjQ3NCwyMjQ3NiwyMjQ3NywyMjQ4MCwyMjQ4MSwyMjQ4MywyMjQ4NiwyMjQ4NywyMjQ5MSwyMjQ5MiwyMjQ5NCwyMjQ5NywyMjQ5OCwyMjQ5OSwyMjUwMSwyMjUwMiwyMjUwMywyMjUwNCwyMjUwNSwyMjUwNiwyMjUwNywyMjUwOCwyMjUxMCwyMjUxMiwyMjUxMywyMjUxNCwyMjUxNSwyMjUxNywyMjUxOCwyMjUxOSwyMjUyMywyMjUyNCwyMjUyNiwyMjUyNywyMjUyOSwyMjUzMSwyMjUzMiwyMjUzMywyMjUzNiwyMjUzNywyMjUzOCwyMjU0MCwyMjU0MiwyMjU0MywyMjU0NCwyMjU0NiwyMjU0NywyMjU0OCwyMjU1MCwyMjU1MSwyMjU1MiwyMjU1NCwyMjU1NSwyMjU1NiwyMjU1NywyMjU1OSwyMjU2MiwyMjU2MywyMjU2NSwyMjU2NiwyMjU2NywyMjU2OCwyMjU2OSwyMjU3MSwyMjU3MiwyMjU3MywyMjU3NCwyMjU3NSwyMjU3NywyMjU3OCwyMjU3OSwyMjU4MCwyMjU4MiwyMjU4MywyMjU4NCwyMjU4NSwyMjU4NiwyMjU4NywyMjU4OCwyMjU4OSwyMjU5MCwyMjU5MSwyMjU5MiwyMjU5MywyMjU5NCwyMjU5NSwyMjU5NywyMjU5OCwyMjU5OSwyMjYwMCwyMjYwMSwyMjYwMiwyMjYwMywyMjYwNiwyMjYwNywyMjYwOCwyMjYxMCwyMjYxMSwyMjYxMywyMjYxNCwyMjYxNSwyMjYxNywyMjYxOCwyMjYxOSwyMjYyMCwyMjYyMSwyMjYyMywyMjYyNCwyMjYyNSwyMjYyNiwyMjYyNywyMjYyOCwyMjYzMCwyMjYzMSwyMjYzMiwyMjYzMywyMjYzNCwyMjYzNywyMjYzOCwyMjYzOSwyMjY0MCwyMjY0MSwyMjY0MiwyMjY0MywyMjY0NCwyMjY0NSwyMjY0NiwyMjY0NywyMjY0OCwyMjY0OSwyMjY1MCwyMjY1MSwyMjY1MiwyMjY1MywyMjY1NSwyMjY1OCwyMjY2MCwyMjY2MiwyMjY2MywyMjY2NCwyMjY2NiwyMjY2NywyMjY2OCwyMjY2OSwyMjY3MCwyMjY3MSwyMjY3MiwyMjY3MywyMjY3NiwyMjY3NywyMjY3OCwyMjY3OSwyMjY4MCwyMjY4MywyMjY4NCwyMjY4NSwyMjY4OCwyMjY4OSwyMjY5MCwyMjY5MSwyMjY5MiwyMjY5MywyMjY5NCwyMjY5NSwyMjY5OCwyMjY5OSwyMjcwMCwyMjcwMSwyMjcwMiwyMjcwMywyMjcwNCwyMjcwNSwyMjcwNiwyMjcwNywyMjcwOCwyMjcwOSwyMjcxMCwyMjcxMSwyMjcxMiwyMjcxMywyMjcxNCwyMjcxNSwyMjcxNywyMjcxOCwyMjcxOSwyMjcyMCwyMjcyMiwyMjcyMywyMjcyNCwyMjcyNiwyMjcyNywyMjcyOCwyMjcyOSwyMjczMCwyMjczMSwyMjczMiwyMjczMywyMjczNCwyMjczNSwyMjczNiwyMjczOCwyMjczOSwyMjc0MCwyMjc0MiwyMjc0MywyMjc0NCwyMjc0NSwyMjc0NiwyMjc0NywyMjc0OCwyMjc0OSwyMjc1MCwyMjc1MSwyMjc1MiwyMjc1MywyMjc1NCwyMjc1NSwyMjc1NywyMjc1OCwyMjc1OSwyMjc2MCwyMjc2MSwyMjc2MiwyMjc2NSwyMjc2NywyMjc2OSwyMjc3MCwyMjc3MiwyMjc3MywyMjc3NSwyMjc3NiwyMjc3OCwyMjc3OSwyMjc4MCwyMjc4MSwyMjc4MiwyMjc4MywyMjc4NCwyMjc4NSwyMjc4NywyMjc4OSwyMjc5MCwyMjc5MiwyMjc5MywyMjc5NCwyMjc5NSwyMjc5NiwyMjc5OCwyMjgwMCwyMjgwMSwyMjgwMiwyMjgwMywyMjgwNywyMjgwOCwyMjgxMSwyMjgxMywyMjgxNCwyMjgxNiwyMjgxNywyMjgxOCwyMjgxOSwyMjgyMiwyMjgyNCwyMjgyOCwyMjgzMiwyMjgzNCwyMjgzNSwyMjgzNywyMjgzOCwyMjg0MywyMjg0NSwyMjg0NiwyMjg0NywyMjg0OCwyMjg1MSwyMjg1MywyMjg1NCwyMjg1OCwyMjg2MCwyMjg2MSwyMjg2NCwyMjg2NiwyMjg2NywyMjg3MywyMjg3NSwyMjg3NiwyMjg3NywyMjg3OCwyMjg3OSwyMjg4MSwyMjg4MywyMjg4NCwyMjg4NiwyMjg4NywyMjg4OCwyMjg4OSwyMjg5MCwyMjg5MSwyMjg5MiwyMjg5MywyMjg5NCwyMjg5NSwyMjg5NiwyMjg5NywyMjg5OCwyMjkwMSwyMjkwMywyMjkwNiwyMjkwNywyMjkwOCwyMjkxMCwyMjkxMSwyMjkxMiwyMjkxNywyMjkyMSwyMjkyMywyMjkyNCwyMjkyNiwyMjkyNywyMjkyOCwyMjkyOSwyMjkzMiwyMjkzMywyMjkzNiwyMjkzOCwyMjkzOSwyMjk0MCwyMjk0MSwyMjk0MywyMjk0NCwyMjk0NSwyMjk0NiwyMjk1MCwyMjk1MSwyMjk1NiwyMjk1NywyMjk2MCwyMjk2MSwyMjk2MywyMjk2NCwyMjk2NSwyMjk2NiwyMjk2NywyMjk2OCwyMjk3MCwyMjk3MiwyMjk3MywyMjk3NSwyMjk3NiwyMjk3NywyMjk3OCwyMjk3OSwyMjk4MCwyMjk4MSwyMjk4MywyMjk4NCwyMjk4NSwyMjk4OCwyMjk4OSwyMjk5MCwyMjk5MSwyMjk5NywyMjk5OCwyMzAwMSwyMzAwMywyMzAwNiwyMzAwNywyMzAwOCwyMzAwOSwyMzAxMCwyMzAxMiwyMzAxNCwyMzAxNSwyMzAxNywyMzAxOCwyMzAxOSwyMzAyMSwyMzAyMiwyMzAyMywyMzAyNCwyMzAyNSwyMzAyNiwyMzAyNywyMzAyOCwyMzAyOSwyMzAzMCwyMzAzMSwyMzAzMiwyMzAzNCwyMzAzNiwyMzAzNywyMzAzOCwyMzA0MCwyMzA0MiwyMzA1MCwyMzA1MSwyMzA1MywyMzA1NCwyMzA1NSwyMzA1NiwyMzA1OCwyMzA2MCwyMzA2MSwyMzA2MiwyMzA2MywyMzA2NSwyMzA2NiwyMzA2NywyMzA2OSwyMzA3MCwyMzA3MywyMzA3NCwyMzA3NiwyMzA3OCwyMzA3OSwyMzA4MCwyMzA4MiwyMzA4MywyMzA4NCwyMzA4NSwyMzA4NiwyMzA4NywyMzA4OCwyMzA5MSwyMzA5MywyMzA5NSwyMzA5NiwyMzA5NywyMzA5OCwyMzA5OSwyMzEwMSwyMzEwMiwyMzEwMywyMzEwNSwyMzEwNiwyMzEwNywyMzEwOCwyMzEwOSwyMzExMSwyMzExMiwyMzExNSwyMzExNiwyMzExNywyMzExOCwyMzExOSwyMzEyMCwyMzEyMSwyMzEyMiwyMzEyMywyMzEyNCwyMzEyNiwyMzEyNywyMzEyOCwyMzEyOSwyMzEzMSwyMzEzMiwyMzEzMywyMzEzNCwyMzEzNSwyMzEzNiwyMzEzNywyMzEzOSwyMzE0MCwyMzE0MSwyMzE0MiwyMzE0NCwyMzE0NSwyMzE0NywyMzE0OCwyMzE0OSwyMzE1MCwyMzE1MSwyMzE1MiwyMzE1MywyMzE1NCwyMzE1NSwyMzE2MCwyMzE2MSwyMzE2MywyMzE2NCwyMzE2NSwyMzE2NiwyMzE2OCwyMzE2OSwyMzE3MCwyMzE3MSwyMzE3MiwyMzE3MywyMzE3NCwyMzE3NSwyMzE3NiwyMzE3NywyMzE3OCwyMzE3OSwyMzE4MCwyMzE4MSwyMzE4MiwyMzE4MywyMzE4NCwyMzE4NSwyMzE4NywyMzE4OCwyMzE4OSwyMzE5MCwyMzE5MSwyMzE5MiwyMzE5MywyMzE5NiwyMzE5NywyMzE5OCwyMzE5OSwyMzIwMCwyMzIwMSwyMzIwMiwyMzIwMywyMzIwNCwyMzIwNSwyMzIwNiwyMzIwNywyMzIwOCwyMzIwOSwyMzIxMSwyMzIxMiwyMzIxMywyMzIxNCwyMzIxNSwyMzIxNiwyMzIxNywyMzIyMCwyMzIyMiwyMzIyMywyMzIyNSwyMzIyNiwyMzIyNywyMzIyOCwyMzIyOSwyMzIzMSwyMzIzMiwyMzIzNSwyMzIzNiwyMzIzNywyMzIzOCwyMzIzOSwyMzI0MCwyMzI0MiwyMzI0MywyMzI0NSwyMzI0NiwyMzI0NywyMzI0OCwyMzI0OSwyMzI1MSwyMzI1MywyMzI1NSwyMzI1NywyMzI1OCwyMzI1OSwyMzI2MSwyMzI2MiwyMzI2MywyMzI2NiwyMzI2OCwyMzI2OSwyMzI3MSwyMzI3MiwyMzI3NCwyMzI3NiwyMzI3NywyMzI3OCwyMzI3OSwyMzI4MCwyMzI4MiwyMzI4MywyMzI4NCwyMzI4NSwyMzI4NiwyMzI4NywyMzI4OCwyMzI4OSwyMzI5MCwyMzI5MSwyMzI5MiwyMzI5MywyMzI5NCwyMzI5NSwyMzI5NiwyMzI5NywyMzI5OCwyMzI5OSwyMzMwMCwyMzMwMSwyMzMwMiwyMzMwMywyMzMwNCwyMzMwNiwyMzMwNywyMzMwOCwyMzMwOSwyMzMxMCwyMzMxMSwyMzMxMiwyMzMxMywyMzMxNCwyMzMxNSwyMzMxNiwyMzMxNywyMzMyMCwyMzMyMSwyMzMyMiwyMzMyMywyMzMyNCwyMzMyNSwyMzMyNiwyMzMyNywyMzMyOCwyMzMyOSwyMzMzMCwyMzMzMSwyMzMzMiwyMzMzMywyMzMzNCwyMzMzNSwyMzMzNiwyMzMzNywyMzMzOCwyMzMzOSwyMzM0MCwyMzM0MSwyMzM0MiwyMzM0MywyMzM0NCwyMzM0NSwyMzM0NywyMzM0OSwyMzM1MCwyMzM1MiwyMzM1MywyMzM1NCwyMzM1NSwyMzM1NiwyMzM1NywyMzM1OCwyMzM1OSwyMzM2MSwyMzM2MiwyMzM2MywyMzM2NCwyMzM2NSwyMzM2NiwyMzM2NywyMzM2OCwyMzM2OSwyMzM3MCwyMzM3MSwyMzM3MiwyMzM3MywyMzM3NCwyMzM3NSwyMzM3OCwyMzM4MiwyMzM5MCwyMzM5MiwyMzM5MywyMzM5OSwyMzQwMCwyMzQwMywyMzQwNSwyMzQwNiwyMzQwNywyMzQxMCwyMzQxMiwyMzQxNCwyMzQxNSwyMzQxNiwyMzQxNywyMzQxOSwyMzQyMCwyMzQyMiwyMzQyMywyMzQyNiwyMzQzMCwyMzQzNCwyMzQzNywyMzQzOCwyMzQ0MCwyMzQ0MSwyMzQ0MiwyMzQ0NCwyMzQ0NiwyMzQ1NSwyMzQ2MywyMzQ2NCwyMzQ2NSwyMzQ2OCwyMzQ2OSwyMzQ3MCwyMzQ3MSwyMzQ3MywyMzQ3NCwyMzQ3OSwyMzQ4MiwyMzQ4MywyMzQ4NCwyMzQ4OCwyMzQ4OSwyMzQ5MSwyMzQ5NiwyMzQ5NywyMzQ5OCwyMzQ5OSwyMzUwMSwyMzUwMiwyMzUwMywyMzUwNSwyMzUwOCwyMzUwOSwyMzUxMCwyMzUxMSwyMzUxMiwyMzUxMywyMzUxNCwyMzUxNSwyMzUxNiwyMzUyMCwyMzUyMiwyMzUyMywyMzUyNiwyMzUyNywyMzUyOSwyMzUzMCwyMzUzMSwyMzUzMiwyMzUzMywyMzUzNSwyMzUzNywyMzUzOCwyMzUzOSwyMzU0MCwyMzU0MSwyMzU0MiwyMzU0MywyMzU0OSwyMzU1MCwyMzU1MiwyMzU1NCwyMzU1NSwyMzU1NywyMzU1OSwyMzU2MCwyMzU2MywyMzU2NCwyMzU2NSwyMzU2NiwyMzU2OCwyMzU3MCwyMzU3MSwyMzU3NSwyMzU3NywyMzU3OSwyMzU4MiwyMzU4MywyMzU4NCwyMzU4NSwyMzU4NywyMzU5MCwyMzU5MiwyMzU5MywyMzU5NCwyMzU5NSwyMzU5NywyMzU5OCwyMzU5OSwyMzYwMCwyMzYwMiwyMzYwMywyMzYwNSwyMzYwNiwyMzYwNywyMzYxOSwyMzYyMCwyMzYyMiwyMzYyMywyMzYyOCwyMzYyOSwyMzYzNCwyMzYzNSwyMzYzNiwyMzYzOCwyMzYzOSwyMzY0MCwyMzY0MiwyMzY0MywyMzY0NCwyMzY0NSwyMzY0NywyMzY1MCwyMzY1MiwyMzY1NSwyMzY1NiwyMzY1NywyMzY1OCwyMzY1OSwyMzY2MCwyMzY2MSwyMzY2NCwyMzY2NiwyMzY2NywyMzY2OCwyMzY2OSwyMzY3MCwyMzY3MSwyMzY3MiwyMzY3NSwyMzY3NiwyMzY3NywyMzY3OCwyMzY4MCwyMzY4MywyMzY4NCwyMzY4NSwyMzY4NiwyMzY4NywyMzY4OSwyMzY5MCwyMzY5MSwyMzY5NCwyMzY5NSwyMzY5OCwyMzY5OSwyMzcwMSwyMzcwOSwyMzcxMCwyMzcxMSwyMzcxMiwyMzcxMywyMzcxNiwyMzcxNywyMzcxOCwyMzcxOSwyMzcyMCwyMzcyMiwyMzcyNiwyMzcyNywyMzcyOCwyMzczMCwyMzczMiwyMzczNCwyMzczNywyMzczOCwyMzczOSwyMzc0MCwyMzc0MiwyMzc0NCwyMzc0NiwyMzc0NywyMzc0OSwyMzc1MCwyMzc1MSwyMzc1MiwyMzc1MywyMzc1NCwyMzc1NiwyMzc1NywyMzc1OCwyMzc1OSwyMzc2MCwyMzc2MSwyMzc2MywyMzc2NCwyMzc2NSwyMzc2NiwyMzc2NywyMzc2OCwyMzc3MCwyMzc3MSwyMzc3MiwyMzc3MywyMzc3NCwyMzc3NSwyMzc3NiwyMzc3OCwyMzc3OSwyMzc4MywyMzc4NSwyMzc4NywyMzc4OCwyMzc5MCwyMzc5MSwyMzc5MywyMzc5NCwyMzc5NSwyMzc5NiwyMzc5NywyMzc5OCwyMzc5OSwyMzgwMCwyMzgwMSwyMzgwMiwyMzgwNCwyMzgwNSwyMzgwNiwyMzgwNywyMzgwOCwyMzgwOSwyMzgxMiwyMzgxMywyMzgxNiwyMzgxNywyMzgxOCwyMzgxOSwyMzgyMCwyMzgyMSwyMzgyMywyMzgyNCwyMzgyNSwyMzgyNiwyMzgyNywyMzgyOSwyMzgzMSwyMzgzMiwyMzgzMywyMzgzNCwyMzgzNiwyMzgzNywyMzgzOSwyMzg0MCwyMzg0MSwyMzg0MiwyMzg0MywyMzg0NSwyMzg0OCwyMzg1MCwyMzg1MSwyMzg1MiwyMzg1NSwyMzg1NiwyMzg1NywyMzg1OCwyMzg1OSwyMzg2MSwyMzg2MiwyMzg2MywyMzg2NCwyMzg2NSwyMzg2NiwyMzg2NywyMzg2OCwyMzg3MSwyMzg3MiwyMzg3MywyMzg3NCwyMzg3NSwyMzg3NiwyMzg3NywyMzg3OCwyMzg4MCwyMzg4MSwyMzg4NSwyMzg4NiwyMzg4NywyMzg4OCwyMzg4OSwyMzg5MCwyMzg5MSwyMzg5MiwyMzg5MywyMzg5NCwyMzg5NSwyMzg5NywyMzg5OCwyMzkwMCwyMzkwMiwyMzkwMywyMzkwNCwyMzkwNSwyMzkwNiwyMzkwNywyMzkwOCwyMzkwOSwyMzkxMCwyMzkxMSwyMzkxMiwyMzkxNCwyMzkxNywyMzkxOCwyMzkyMCwyMzkyMSwyMzkyMiwyMzkyMywyMzkyNSwyMzkyNiwyMzkyNywyMzkyOCwyMzkyOSwyMzkzMCwyMzkzMSwyMzkzMiwyMzkzMywyMzkzNCwyMzkzNSwyMzkzNiwyMzkzNywyMzkzOSwyMzk0MCwyMzk0MSwyMzk0MiwyMzk0MywyMzk0NCwyMzk0NSwyMzk0NiwyMzk0NywyMzk0OCwyMzk0OSwyMzk1MCwyMzk1MSwyMzk1MiwyMzk1MywyMzk1NCwyMzk1NSwyMzk1NiwyMzk1NywyMzk1OCwyMzk1OSwyMzk2MCwyMzk2MiwyMzk2MywyMzk2NCwyMzk2NiwyMzk2NywyMzk2OCwyMzk2OSwyMzk3MCwyMzk3MSwyMzk3MiwyMzk3MywyMzk3NCwyMzk3NSwyMzk3NiwyMzk3NywyMzk3OCwyMzk3OSwyMzk4MCwyMzk4MSwyMzk4MiwyMzk4MywyMzk4NCwyMzk4NSwyMzk4NiwyMzk4NywyMzk4OCwyMzk4OSwyMzk5MCwyMzk5MiwyMzk5MywyMzk5NCwyMzk5NSwyMzk5NiwyMzk5NywyMzk5OCwyMzk5OSwyNDAwMCwyNDAwMSwyNDAwMiwyNDAwMywyNDAwNCwyNDAwNiwyNDAwNywyNDAwOCwyNDAwOSwyNDAxMCwyNDAxMSwyNDAxMiwyNDAxNCwyNDAxNSwyNDAxNiwyNDAxNywyNDAxOCwyNDAxOSwyNDAyMCwyNDAyMSwyNDAyMiwyNDAyMywyNDAyNCwyNDAyNSwyNDAyNiwyNDAyOCwyNDAzMSwyNDAzMiwyNDAzNSwyNDAzNiwyNDA0MiwyNDA0NCwyNDA0NSwyNDA0OCwyNDA1MywyNDA1NCwyNDA1NiwyNDA1NywyNDA1OCwyNDA1OSwyNDA2MCwyNDA2MywyNDA2NCwyNDA2OCwyNDA3MSwyNDA3MywyNDA3NCwyNDA3NSwyNDA3NywyNDA3OCwyNDA4MiwyNDA4MywyNDA4NywyNDA5NCwyNDA5NSwyNDA5NiwyNDA5NywyNDA5OCwyNDA5OSwyNDEwMCwyNDEwMSwyNDEwNCwyNDEwNSwyNDEwNiwyNDEwNywyNDEwOCwyNDExMSwyNDExMiwyNDExNCwyNDExNSwyNDExNiwyNDExNywyNDExOCwyNDEyMSwyNDEyMiwyNDEyNiwyNDEyNywyNDEyOCwyNDEyOSwyNDEzMSwyNDEzNCwyNDEzNSwyNDEzNiwyNDEzNywyNDEzOCwyNDEzOSwyNDE0MSwyNDE0MiwyNDE0MywyNDE0NCwyNDE0NSwyNDE0NiwyNDE0NywyNDE1MCwyNDE1MSwyNDE1MiwyNDE1MywyNDE1NCwyNDE1NiwyNDE1NywyNDE1OSwyNDE2MCwyNDE2MywyNDE2NCwyNDE2NSwyNDE2NiwyNDE2NywyNDE2OCwyNDE2OSwyNDE3MCwyNDE3MSwyNDE3MiwyNDE3MywyNDE3NCwyNDE3NSwyNDE3NiwyNDE3NywyNDE4MSwyNDE4MywyNDE4NSwyNDE5MCwyNDE5MywyNDE5NCwyNDE5NSwyNDE5NywyNDIwMCwyNDIwMSwyNDIwNCwyNDIwNSwyNDIwNiwyNDIxMCwyNDIxNiwyNDIxOSwyNDIyMSwyNDIyNSwyNDIyNiwyNDIyNywyNDIyOCwyNDIzMiwyNDIzMywyNDIzNCwyNDIzNSwyNDIzNiwyNDIzOCwyNDIzOSwyNDI0MCwyNDI0MSwyNDI0MiwyNDI0NCwyNDI1MCwyNDI1MSwyNDI1MiwyNDI1MywyNDI1NSwyNDI1NiwyNDI1NywyNDI1OCwyNDI1OSwyNDI2MCwyNDI2MSwyNDI2MiwyNDI2MywyNDI2NCwyNDI2NywyNDI2OCwyNDI2OSwyNDI3MCwyNDI3MSwyNDI3MiwyNDI3NiwyNDI3NywyNDI3OSwyNDI4MCwyNDI4MSwyNDI4MiwyNDI4NCwyNDI4NSwyNDI4NiwyNDI4NywyNDI4OCwyNDI4OSwyNDI5MCwyNDI5MSwyNDI5MiwyNDI5MywyNDI5NCwyNDI5NSwyNDI5NywyNDI5OSwyNDMwMCwyNDMwMSwyNDMwMiwyNDMwMywyNDMwNCwyNDMwNSwyNDMwNiwyNDMwNywyNDMwOSwyNDMxMiwyNDMxMywyNDMxNSwyNDMxNiwyNDMxNywyNDMyNSwyNDMyNiwyNDMyNywyNDMyOSwyNDMzMiwyNDMzMywyNDMzNCwyNDMzNiwyNDMzOCwyNDM0MCwyNDM0MiwyNDM0NSwyNDM0NiwyNDM0OCwyNDM0OSwyNDM1MCwyNDM1MywyNDM1NCwyNDM1NSwyNDM1NiwyNDM2MCwyNDM2MywyNDM2NCwyNDM2NiwyNDM2OCwyNDM3MCwyNDM3MSwyNDM3MiwyNDM3MywyNDM3NCwyNDM3NSwyNDM3NiwyNDM3OSwyNDM4MSwyNDM4MiwyNDM4MywyNDM4NSwyNDM4NiwyNDM4NywyNDM4OCwyNDM4OSwyNDM5MCwyNDM5MSwyNDM5MiwyNDM5MywyNDM5NCwyNDM5NSwyNDM5NiwyNDM5NywyNDM5OCwyNDM5OSwyNDQwMSwyNDQwNCwyNDQwOSwyNDQxMCwyNDQxMSwyNDQxMiwyNDQxNCwyNDQxNSwyNDQxNiwyNDQxOSwyNDQyMSwyNDQyMywyNDQyNCwyNDQyNywyNDQzMCwyNDQzMSwyNDQzNCwyNDQzNiwyNDQzNywyNDQzOCwyNDQ0MCwyNDQ0MiwyNDQ0NSwyNDQ0NiwyNDQ0NywyNDQ1MSwyNDQ1NCwyNDQ2MSwyNDQ2MiwyNDQ2MywyNDQ2NSwyNDQ2NywyNDQ2OCwyNDQ3MCwyNDQ3NCwyNDQ3NSwyNDQ3NywyNDQ3OCwyNDQ3OSwyNDQ4MCwyNDQ4MiwyNDQ4MywyNDQ4NCwyNDQ4NSwyNDQ4NiwyNDQ4NywyNDQ4OSwyNDQ5MSwyNDQ5MiwyNDQ5NSwyNDQ5NiwyNDQ5NywyNDQ5OCwyNDQ5OSwyNDUwMCwyNDUwMiwyNDUwNCwyNDUwNSwyNDUwNiwyNDUwNywyNDUxMCwyNDUxMSwyNDUxMiwyNDUxMywyNDUxNCwyNDUxOSwyNDUyMCwyNDUyMiwyNDUyMywyNDUyNiwyNDUzMSwyNDUzMiwyNDUzMywyNDUzOCwyNDUzOSwyNDU0MCwyNDU0MiwyNDU0MywyNDU0NiwyNDU0NywyNDU0OSwyNDU1MCwyNDU1MiwyNDU1MywyNDU1NiwyNDU1OSwyNDU2MCwyNDU2MiwyNDU2MywyNDU2NCwyNDU2NiwyNDU2NywyNDU2OSwyNDU3MCwyNDU3MiwyNDU4MywyNDU4NCwyNDU4NSwyNDU4NywyNDU4OCwyNDU5MiwyNDU5MywyNDU5NSwyNDU5OSwyNDYwMCwyNDYwMiwyNDYwNiwyNDYwNywyNDYxMCwyNDYxMSwyNDYxMiwyNDYyMCwyNDYyMSwyNDYyMiwyNDYyNCwyNDYyNSwyNDYyNiwyNDYyNywyNDYyOCwyNDYzMCwyNDYzMSwyNDYzMiwyNDYzMywyNDYzNCwyNDYzNywyNDYzOCwyNDY0MCwyNDY0NCwyNDY0NSwyNDY0NiwyNDY0NywyNDY0OCwyNDY0OSwyNDY1MCwyNDY1MiwyNDY1NCwyNDY1NSwyNDY1NywyNDY1OSwyNDY2MCwyNDY2MiwyNDY2MywyNDY2NCwyNDY2NywyNDY2OCwyNDY3MCwyNDY3MSwyNDY3MiwyNDY3MywyNDY3NywyNDY3OCwyNDY4NiwyNDY4OSwyNDY5MCwyNDY5MiwyNDY5MywyNDY5NSwyNDcwMiwyNDcwNCwyNDcwNSwyNDcwNiwyNDcwOSwyNDcxMCwyNDcxMSwyNDcxMiwyNDcxNCwyNDcxNSwyNDcxOCwyNDcxOSwyNDcyMCwyNDcyMSwyNDcyMywyNDcyNSwyNDcyNywyNDcyOCwyNDcyOSwyNDczMiwyNDczNCwyNDczNywyNDczOCwyNDc0MCwyNDc0MSwyNDc0MywyNDc0NSwyNDc0NiwyNDc1MCwyNDc1MiwyNDc1NSwyNDc1NywyNDc1OCwyNDc1OSwyNDc2MSwyNDc2MiwyNDc2NSwyNDc2NiwyNDc2NywyNDc2OCwyNDc2OSwyNDc3MCwyNDc3MSwyNDc3MiwyNDc3NSwyNDc3NiwyNDc3NywyNDc4MCwyNDc4MSwyNDc4MiwyNDc4MywyNDc4NCwyNDc4NiwyNDc4NywyNDc4OCwyNDc5MCwyNDc5MSwyNDc5MywyNDc5NSwyNDc5OCwyNDgwMSwyNDgwMiwyNDgwMywyNDgwNCwyNDgwNSwyNDgxMCwyNDgxNywyNDgxOCwyNDgyMSwyNDgyMywyNDgyNCwyNDgyNywyNDgyOCwyNDgyOSwyNDgzMCwyNDgzMSwyNDgzNCwyNDgzNSwyNDgzNiwyNDgzNywyNDgzOSwyNDg0MiwyNDg0MywyNDg0NCwyNDg0OCwyNDg0OSwyNDg1MCwyNDg1MSwyNDg1MiwyNDg1NCwyNDg1NSwyNDg1NiwyNDg1NywyNDg1OSwyNDg2MCwyNDg2MSwyNDg2MiwyNDg2NSwyNDg2NiwyNDg2OSwyNDg3MiwyNDg3MywyNDg3NCwyNDg3NiwyNDg3NywyNDg3OCwyNDg3OSwyNDg4MCwyNDg4MSwyNDg4MiwyNDg4MywyNDg4NCwyNDg4NSwyNDg4NiwyNDg4NywyNDg4OCwyNDg4OSwyNDg5MCwyNDg5MSwyNDg5MiwyNDg5MywyNDg5NCwyNDg5NiwyNDg5NywyNDg5OCwyNDg5OSwyNDkwMCwyNDkwMSwyNDkwMiwyNDkwMywyNDkwNSwyNDkwNywyNDkwOSwyNDkxMSwyNDkxMiwyNDkxNCwyNDkxNSwyNDkxNiwyNDkxOCwyNDkxOSwyNDkyMCwyNDkyMSwyNDkyMiwyNDkyMywyNDkyNCwyNDkyNiwyNDkyNywyNDkyOCwyNDkyOSwyNDkzMSwyNDkzMiwyNDkzMywyNDkzNCwyNDkzNywyNDkzOCwyNDkzOSwyNDk0MCwyNDk0MSwyNDk0MiwyNDk0MywyNDk0NSwyNDk0NiwyNDk0NywyNDk0OCwyNDk1MCwyNDk1MiwyNDk1MywyNDk1NCwyNDk1NSwyNDk1NiwyNDk1NywyNDk1OCwyNDk1OSwyNDk2MCwyNDk2MSwyNDk2MiwyNDk2MywyNDk2NCwyNDk2NSwyNDk2NiwyNDk2NywyNDk2OCwyNDk2OSwyNDk3MCwyNDk3MiwyNDk3MywyNDk3NSwyNDk3NiwyNDk3NywyNDk3OCwyNDk3OSwyNDk4MSwyNDk4MiwyNDk4MywyNDk4NCwyNDk4NSwyNDk4NiwyNDk4NywyNDk4OCwyNDk5MCwyNDk5MSwyNDk5MiwyNDk5MywyNDk5NCwyNDk5NSwyNDk5NiwyNDk5NywyNDk5OCwyNTAwMiwyNTAwMywyNTAwNSwyNTAwNiwyNTAwNywyNTAwOCwyNTAwOSwyNTAxMCwyNTAxMSwyNTAxMiwyNTAxMywyNTAxNCwyNTAxNiwyNTAxNywyNTAxOCwyNTAxOSwyNTAyMCwyNTAyMSwyNTAyMywyNTAyNCwyNTAyNSwyNTAyNywyNTAyOCwyNTAyOSwyNTAzMCwyNTAzMSwyNTAzMywyNTAzNiwyNTAzNywyNTAzOCwyNTAzOSwyNTA0MCwyNTA0MywyNTA0NSwyNTA0NiwyNTA0NywyNTA0OCwyNTA0OSwyNTA1MCwyNTA1MSwyNTA1MiwyNTA1MywyNTA1NCwyNTA1NSwyNTA1NiwyNTA1NywyNTA1OCwyNTA1OSwyNTA2MCwyNTA2MSwyNTA2MywyNTA2NCwyNTA2NSwyNTA2NiwyNTA2NywyNTA2OCwyNTA2OSwyNTA3MCwyNTA3MSwyNTA3MiwyNTA3MywyNTA3NCwyNTA3NSwyNTA3NiwyNTA3OCwyNTA3OSwyNTA4MCwyNTA4MSwyNTA4MiwyNTA4MywyNTA4NCwyNTA4NSwyNTA4NiwyNTA4OCwyNTA4OSwyNTA5MCwyNTA5MSwyNTA5MiwyNTA5MywyNTA5NSwyNTA5NywyNTEwNywyNTEwOCwyNTExMywyNTExNiwyNTExNywyNTExOCwyNTEyMCwyNTEyMywyNTEyNiwyNTEyNywyNTEyOCwyNTEyOSwyNTEzMSwyNTEzMywyNTEzNSwyNTEzNiwyNTEzNywyNTEzOCwyNTE0MSwyNTE0MiwyNTE0NCwyNTE0NSwyNTE0NiwyNTE0NywyNTE0OCwyNTE1NCwyNTE1NiwyNTE1NywyNTE1OCwyNTE2MiwyNTE2NywyNTE2OCwyNTE3MywyNTE3NCwyNTE3NSwyNTE3NywyNTE3OCwyNTE4MCwyNTE4MSwyNTE4MiwyNTE4MywyNTE4NCwyNTE4NSwyNTE4NiwyNTE4OCwyNTE4OSwyNTE5MiwyNTIwMSwyNTIwMiwyNTIwNCwyNTIwNSwyNTIwNywyNTIwOCwyNTIxMCwyNTIxMSwyNTIxMywyNTIxNywyNTIxOCwyNTIxOSwyNTIyMSwyNTIyMiwyNTIyMywyNTIyNCwyNTIyNywyNTIyOCwyNTIyOSwyNTIzMCwyNTIzMSwyNTIzMiwyNTIzNiwyNTI0MSwyNTI0NCwyNTI0NSwyNTI0NiwyNTI1MSwyNTI1NCwyNTI1NSwyNTI1NywyNTI1OCwyNTI2MSwyNTI2MiwyNTI2MywyNTI2NCwyNTI2NiwyNTI2NywyNTI2OCwyNTI3MCwyNTI3MSwyNTI3MiwyNTI3NCwyNTI3OCwyNTI4MCwyNTI4MSwyNTI4MywyNTI5MSwyNTI5NSwyNTI5NywyNTMwMSwyNTMwOSwyNTMxMCwyNTMxMiwyNTMxMywyNTMxNiwyNTMyMiwyNTMyMywyNTMyOCwyNTMzMCwyNTMzMywyNTMzNiwyNTMzNywyNTMzOCwyNTMzOSwyNTM0NCwyNTM0NywyNTM0OCwyNTM0OSwyNTM1MCwyNTM1NCwyNTM1NSwyNTM1NiwyNTM1NywyNTM1OSwyNTM2MCwyNTM2MiwyNTM2MywyNTM2NCwyNTM2NSwyNTM2NywyNTM2OCwyNTM2OSwyNTM3MiwyNTM4MiwyNTM4MywyNTM4NSwyNTM4OCwyNTM4OSwyNTM5MCwyNTM5MiwyNTM5MywyNTM5NSwyNTM5NiwyNTM5NywyNTM5OCwyNTM5OSwyNTQwMCwyNTQwMywyNTQwNCwyNTQwNiwyNTQwNywyNTQwOCwyNTQwOSwyNTQxMiwyNTQxNSwyNTQxNiwyNTQxOCwyNTQyNSwyNTQyNiwyNTQyNywyNTQyOCwyNTQzMCwyNTQzMSwyNTQzMiwyNTQzMywyNTQzNCwyNTQzNSwyNTQzNiwyNTQzNywyNTQ0MCwyNTQ0NCwyNTQ0NSwyNTQ0NiwyNTQ0OCwyNTQ1MCwyNTQ1MSwyNTQ1MiwyNTQ1NSwyNTQ1NiwyNTQ1OCwyNTQ1OSwyNTQ2MCwyNTQ2MSwyNTQ2NCwyNTQ2NSwyNTQ2OCwyNTQ2OSwyNTQ3MCwyNTQ3MSwyNTQ3MywyNTQ3NSwyNTQ3NiwyNTQ3NywyNTQ3OCwyNTQ4MywyNTQ4NSwyNTQ4OSwyNTQ5MSwyNTQ5MiwyNTQ5MywyNTQ5NSwyNTQ5NywyNTQ5OCwyNTQ5OSwyNTUwMCwyNTUwMSwyNTUwMiwyNTUwMywyNTUwNSwyNTUwOCwyNTUxMCwyNTUxNSwyNTUxOSwyNTUyMSwyNTUyMiwyNTUyNSwyNTUyNiwyNTUyOSwyNTUzMSwyNTUzMywyNTUzNSwyNTUzNiwyNTUzNywyNTUzOCwyNTUzOSwyNTU0MSwyNTU0MywyNTU0NCwyNTU0NiwyNTU0NywyNTU0OCwyNTU1MywyNTU1NSwyNTU1NiwyNTU1NywyNTU1OSwyNTU2MCwyNTU2MSwyNTU2MiwyNTU2MywyNTU2NCwyNTU2NSwyNTU2NywyNTU3MCwyNTU3MiwyNTU3MywyNTU3NCwyNTU3NSwyNTU3NiwyNTU3OSwyNTU4MCwyNTU4MiwyNTU4MywyNTU4NCwyNTU4NSwyNTU4NywyNTU4OSwyNTU5MSwyNTU5MywyNTU5NCwyNTU5NSwyNTU5NiwyNTU5OCwyNTYwMywyNTYwNCwyNTYwNiwyNTYwNywyNTYwOCwyNTYwOSwyNTYxMCwyNTYxMywyNTYxNCwyNTYxNywyNTYxOCwyNTYyMSwyNTYyMiwyNTYyMywyNTYyNCwyNTYyNSwyNTYyNiwyNTYyOSwyNTYzMSwyNTYzNCwyNTYzNSwyNTYzNiwyNTYzNywyNTYzOSwyNTY0MCwyNTY0MSwyNTY0MywyNTY0NiwyNTY0NywyNTY0OCwyNTY0OSwyNTY1MCwyNTY1MSwyNTY1MywyNTY1NCwyNTY1NSwyNTY1NiwyNTY1NywyNTY1OSwyNTY2MCwyNTY2MiwyNTY2NCwyNTY2NiwyNTY2NywyNTY3MywyNTY3NSwyNTY3NiwyNTY3NywyNTY3OCwyNTY3OSwyNTY4MCwyNTY4MSwyNTY4MywyNTY4NSwyNTY4NiwyNTY4NywyNTY4OSwyNTY5MCwyNTY5MSwyNTY5MiwyNTY5MywyNTY5NSwyNTY5NiwyNTY5NywyNTY5OCwyNTY5OSwyNTcwMCwyNTcwMSwyNTcwMiwyNTcwNCwyNTcwNiwyNTcwNywyNTcwOCwyNTcxMCwyNTcxMSwyNTcxMiwyNTcxMywyNTcxNCwyNTcxNSwyNTcxNiwyNTcxNywyNTcxOCwyNTcxOSwyNTcyMywyNTcyNCwyNTcyNSwyNTcyNiwyNTcyNywyNTcyOCwyNTcyOSwyNTczMSwyNTczNCwyNTczNiwyNTczNywyNTczOCwyNTczOSwyNTc0MCwyNTc0MSwyNTc0MiwyNTc0MywyNTc0NCwyNTc0NywyNTc0OCwyNTc1MSwyNTc1MiwyNTc1NCwyNTc1NSwyNTc1NiwyNTc1NywyNTc1OSwyNTc2MCwyNTc2MSwyNTc2MiwyNTc2MywyNTc2NSwyNTc2NiwyNTc2NywyNTc2OCwyNTc3MCwyNTc3MSwyNTc3NSwyNTc3NywyNTc3OCwyNTc3OSwyNTc4MCwyNTc4MiwyNTc4NSwyNTc4NywyNTc4OSwyNTc5MCwyNTc5MSwyNTc5MywyNTc5NSwyNTc5NiwyNTc5OCwyNTc5OSwyNTgwMCwyNTgwMSwyNTgwMiwyNTgwMywyNTgwNCwyNTgwNywyNTgwOSwyNTgxMSwyNTgxMiwyNTgxMywyNTgxNCwyNTgxNywyNTgxOCwyNTgxOSwyNTgyMCwyNTgyMSwyNTgyMywyNTgyNCwyNTgyNSwyNTgyNywyNTgyOSwyNTgzMSwyNTgzMiwyNTgzMywyNTgzNCwyNTgzNSwyNTgzNiwyNTgzNywyNTgzOCwyNTgzOSwyNTg0MCwyNTg0MSwyNTg0MiwyNTg0MywyNTg0NCwyNTg0NSwyNTg0NiwyNTg0NywyNTg0OCwyNTg0OSwyNTg1MCwyNTg1MSwyNTg1MiwyNTg1MywyNTg1NCwyNTg1NSwyNTg1NywyNTg1OCwyNTg1OSwyNTg2MCwyNTg2MSwyNTg2MiwyNTg2MywyNTg2NCwyNTg2NiwyNTg2NywyNTg2OCwyNTg2OSwyNTg3MCwyNTg3MSwyNTg3MiwyNTg3MywyNTg3NSwyNTg3NiwyNTg3NywyNTg3OCwyNTg3OSwyNTg4MSwyNTg4MiwyNTg4MywyNTg4NCwyNTg4NSwyNTg4NiwyNTg4NywyNTg4OCwyNTg4OSwyNTg5MCwyNTg5MSwyNTg5MiwyNTg5NCwyNTg5NSwyNTg5NiwyNTg5NywyNTg5OCwyNTkwMCwyNTkwMSwyNTkwNCwyNTkwNSwyNTkwNiwyNTkwNywyNTkxMSwyNTkxNCwyNTkxNiwyNTkxNywyNTkyMCwyNTkyMSwyNTkyMiwyNTkyMywyNTkyNCwyNTkyNiwyNTkyNywyNTkzMCwyNTkzMSwyNTkzMywyNTkzNCwyNTkzNiwyNTkzOCwyNTkzOSwyNTk0MCwyNTk0MywyNTk0NCwyNTk0NiwyNTk0OCwyNTk1MSwyNTk1MiwyNTk1MywyNTk1NiwyNTk1NywyNTk1OSwyNTk2MCwyNTk2MSwyNTk2MiwyNTk2NSwyNTk2NiwyNTk2NywyNTk2OSwyNTk3MSwyNTk3MywyNTk3NCwyNTk3NiwyNTk3NywyNTk3OCwyNTk3OSwyNTk4MCwyNTk4MSwyNTk4MiwyNTk4MywyNTk4NCwyNTk4NSwyNTk4NiwyNTk4NywyNTk4OCwyNTk4OSwyNTk5MCwyNTk5MiwyNTk5MywyNTk5NCwyNTk5NywyNTk5OCwyNTk5OSwyNjAwMiwyNjAwNCwyNjAwNSwyNjAwNiwyNjAwOCwyNjAxMCwyNjAxMywyNjAxNCwyNjAxNiwyNjAxOCwyNjAxOSwyNjAyMiwyNjAyNCwyNjAyNiwyNjAyOCwyNjAzMCwyNjAzMywyNjAzNCwyNjAzNSwyNjAzNiwyNjAzNywyNjAzOCwyNjAzOSwyNjA0MCwyNjA0MiwyNjA0MywyNjA0NiwyNjA0NywyNjA0OCwyNjA1MCwyNjA1NSwyNjA1NiwyNjA1NywyNjA1OCwyNjA2MSwyNjA2NCwyNjA2NSwyNjA2NywyNjA2OCwyNjA2OSwyNjA3MiwyNjA3MywyNjA3NCwyNjA3NSwyNjA3NiwyNjA3NywyNjA3OCwyNjA3OSwyNjA4MSwyNjA4MywyNjA4NCwyNjA5MCwyNjA5MSwyNjA5OCwyNjA5OSwyNjEwMCwyNjEwMSwyNjEwNCwyNjEwNSwyNjEwNywyNjEwOCwyNjEwOSwyNjExMCwyNjExMSwyNjExMywyNjExNiwyNjExNywyNjExOSwyNjEyMCwyNjEyMSwyNjEyMywyNjEyNSwyNjEyOCwyNjEyOSwyNjEzMCwyNjEzNCwyNjEzNSwyNjEzNiwyNjEzOCwyNjEzOSwyNjE0MCwyNjE0MiwyNjE0NSwyNjE0NiwyNjE0NywyNjE0OCwyNjE1MCwyNjE1MywyNjE1NCwyNjE1NSwyNjE1NiwyNjE1OCwyNjE2MCwyNjE2MiwyNjE2MywyNjE2NywyNjE2OCwyNjE2OSwyNjE3MCwyNjE3MSwyNjE3MywyNjE3NSwyNjE3NiwyNjE3OCwyNjE4MCwyNjE4MSwyNjE4MiwyNjE4MywyNjE4NCwyNjE4NSwyNjE4NiwyNjE4OSwyNjE5MCwyNjE5MiwyNjE5MywyNjIwMCwyNjIwMSwyNjIwMywyNjIwNCwyNjIwNSwyNjIwNiwyNjIwOCwyNjIxMCwyNjIxMSwyNjIxMywyNjIxNSwyNjIxNywyNjIxOCwyNjIxOSwyNjIyMCwyNjIyMSwyNjIyNSwyNjIyNiwyNjIyNywyNjIyOSwyNjIzMiwyNjIzMywyNjIzNSwyNjIzNiwyNjIzNywyNjIzOSwyNjI0MCwyNjI0MSwyNjI0MywyNjI0NSwyNjI0NiwyNjI0OCwyNjI0OSwyNjI1MCwyNjI1MSwyNjI1MywyNjI1NCwyNjI1NSwyNjI1NiwyNjI1OCwyNjI1OSwyNjI2MCwyNjI2MSwyNjI2NCwyNjI2NSwyNjI2NiwyNjI2NywyNjI2OCwyNjI3MCwyNjI3MSwyNjI3MiwyNjI3MywyNjI3NCwyNjI3NSwyNjI3NiwyNjI3NywyNjI3OCwyNjI4MSwyNjI4MiwyNjI4MywyNjI4NCwyNjI4NSwyNjI4NywyNjI4OCwyNjI4OSwyNjI5MCwyNjI5MSwyNjI5MywyNjI5NCwyNjI5NSwyNjI5NiwyNjI5OCwyNjI5OSwyNjMwMCwyNjMwMSwyNjMwMywyNjMwNCwyNjMwNSwyNjMwNiwyNjMwNywyNjMwOCwyNjMwOSwyNjMxMCwyNjMxMSwyNjMxMiwyNjMxMywyNjMxNCwyNjMxNSwyNjMxNiwyNjMxNywyNjMxOCwyNjMxOSwyNjMyMCwyNjMyMSwyNjMyMiwyNjMyMywyNjMyNCwyNjMyNSwyNjMyNiwyNjMyNywyNjMyOCwyNjMzMCwyNjMzNCwyNjMzNSwyNjMzNiwyNjMzNywyNjMzOCwyNjMzOSwyNjM0MCwyNjM0MSwyNjM0MywyNjM0NCwyNjM0NiwyNjM0NywyNjM0OCwyNjM0OSwyNjM1MCwyNjM1MSwyNjM1MywyNjM1NywyNjM1OCwyNjM2MCwyNjM2MiwyNjM2MywyNjM2NSwyNjM2OSwyNjM3MCwyNjM3MSwyNjM3MiwyNjM3MywyNjM3NCwyNjM3NSwyNjM4MCwyNjM4MiwyNjM4MywyNjM4NSwyNjM4NiwyNjM4NywyNjM5MCwyNjM5MiwyNjM5MywyNjM5NCwyNjM5NiwyNjM5OCwyNjQwMCwyNjQwMSwyNjQwMiwyNjQwMywyNjQwNCwyNjQwNSwyNjQwNywyNjQwOSwyNjQxNCwyNjQxNiwyNjQxOCwyNjQxOSwyNjQyMiwyNjQyMywyNjQyNCwyNjQyNSwyNjQyNywyNjQyOCwyNjQzMCwyNjQzMSwyNjQzMywyNjQzNiwyNjQzNywyNjQzOSwyNjQ0MiwyNjQ0MywyNjQ0NSwyNjQ1MCwyNjQ1MiwyNjQ1MywyNjQ1NSwyNjQ1NiwyNjQ1NywyNjQ1OCwyNjQ1OSwyNjQ2MSwyNjQ2NiwyNjQ2NywyNjQ2OCwyNjQ3MCwyNjQ3MSwyNjQ3NSwyNjQ3NiwyNjQ3OCwyNjQ4MSwyNjQ4NCwyNjQ4NiwyNjQ4OCwyNjQ4OSwyNjQ5MCwyNjQ5MSwyNjQ5MywyNjQ5NiwyNjQ5OCwyNjQ5OSwyNjUwMSwyNjUwMiwyNjUwNCwyNjUwNiwyNjUwOCwyNjUwOSwyNjUxMCwyNjUxMSwyNjUxMywyNjUxNCwyNjUxNSwyNjUxNiwyNjUxOCwyNjUyMSwyNjUyMywyNjUyNywyNjUyOCwyNjUyOSwyNjUzMiwyNjUzNCwyNjUzNywyNjU0MCwyNjU0MiwyNjU0NSwyNjU0NiwyNjU0OCwyNjU1MywyNjU1NCwyNjU1NSwyNjU1NiwyNjU1NywyNjU1OCwyNjU1OSwyNjU2MCwyNjU2MiwyNjU2NSwyNjU2NiwyNjU2NywyNjU2OCwyNjU2OSwyNjU3MCwyNjU3MSwyNjU3MiwyNjU3MywyNjU3NCwyNjU4MSwyNjU4MiwyNjU4MywyNjU4NywyNjU5MSwyNjU5MywyNjU5NSwyNjU5NiwyNjU5OCwyNjU5OSwyNjYwMCwyNjYwMiwyNjYwMywyNjYwNSwyNjYwNiwyNjYxMCwyNjYxMywyNjYxNCwyNjYxNSwyNjYxNiwyNjYxNywyNjYxOCwyNjYxOSwyNjYyMCwyNjYyMiwyNjYyNSwyNjYyNiwyNjYyNywyNjYyOCwyNjYzMCwyNjYzNywyNjY0MCwyNjY0MiwyNjY0NCwyNjY0NSwyNjY0OCwyNjY0OSwyNjY1MCwyNjY1MSwyNjY1MiwyNjY1NCwyNjY1NSwyNjY1NiwyNjY1OCwyNjY1OSwyNjY2MCwyNjY2MSwyNjY2MiwyNjY2MywyNjY2NCwyNjY2NywyNjY2OCwyNjY2OSwyNjY3MCwyNjY3MSwyNjY3MiwyNjY3MywyNjY3NiwyNjY3NywyNjY3OCwyNjY4MiwyNjY4MywyNjY4NywyNjY5NSwyNjY5OSwyNjcwMSwyNjcwMywyNjcwNiwyNjcxMCwyNjcxMSwyNjcxMiwyNjcxMywyNjcxNCwyNjcxNSwyNjcxNiwyNjcxNywyNjcxOCwyNjcxOSwyNjczMCwyNjczMiwyNjczMywyNjczNCwyNjczNSwyNjczNiwyNjczNywyNjczOCwyNjczOSwyNjc0MSwyNjc0NCwyNjc0NSwyNjc0NiwyNjc0NywyNjc0OCwyNjc0OSwyNjc1MCwyNjc1MSwyNjc1MiwyNjc1NCwyNjc1NiwyNjc1OSwyNjc2MCwyNjc2MSwyNjc2MiwyNjc2MywyNjc2NCwyNjc2NSwyNjc2NiwyNjc2OCwyNjc2OSwyNjc3MCwyNjc3MiwyNjc3MywyNjc3NCwyNjc3NiwyNjc3NywyNjc3OCwyNjc3OSwyNjc4MCwyNjc4MSwyNjc4MiwyNjc4MywyNjc4NCwyNjc4NSwyNjc4NywyNjc4OCwyNjc4OSwyNjc5MywyNjc5NCwyNjc5NSwyNjc5NiwyNjc5OCwyNjgwMSwyNjgwMiwyNjgwNCwyNjgwNiwyNjgwNywyNjgwOCwyNjgwOSwyNjgxMCwyNjgxMSwyNjgxMiwyNjgxMywyNjgxNCwyNjgxNSwyNjgxNywyNjgxOSwyNjgyMCwyNjgyMSwyNjgyMiwyNjgyMywyNjgyNCwyNjgyNiwyNjgyOCwyNjgzMCwyNjgzMSwyNjgzMiwyNjgzMywyNjgzNSwyNjgzNiwyNjgzOCwyNjgzOSwyNjg0MSwyNjg0MywyNjg0NCwyNjg0NSwyNjg0NiwyNjg0NywyNjg0OSwyNjg1MCwyNjg1MiwyNjg1MywyNjg1NCwyNjg1NSwyNjg1NiwyNjg1NywyNjg1OCwyNjg1OSwyNjg2MCwyNjg2MSwyNjg2MywyNjg2NiwyNjg2NywyNjg2OCwyNjg3MCwyNjg3MSwyNjg3MiwyNjg3NSwyNjg3NywyNjg3OCwyNjg3OSwyNjg4MCwyNjg4MiwyNjg4MywyNjg4NCwyNjg4NiwyNjg4NywyNjg4OCwyNjg4OSwyNjg5MCwyNjg5MiwyNjg5NSwyNjg5NywyNjg5OSwyNjkwMCwyNjkwMSwyNjkwMiwyNjkwMywyNjkwNCwyNjkwNSwyNjkwNiwyNjkwNywyNjkwOCwyNjkwOSwyNjkxMCwyNjkxMywyNjkxNCwyNjkxNSwyNjkxNywyNjkxOCwyNjkxOSwyNjkyMCwyNjkyMSwyNjkyMiwyNjkyMywyNjkyNCwyNjkyNiwyNjkyNywyNjkyOSwyNjkzMCwyNjkzMSwyNjkzMywyNjkzNCwyNjkzNSwyNjkzNiwyNjkzOCwyNjkzOSwyNjk0MCwyNjk0MiwyNjk0NCwyNjk0NSwyNjk0NywyNjk0OCwyNjk0OSwyNjk1MCwyNjk1MSwyNjk1MiwyNjk1MywyNjk1NCwyNjk1NSwyNjk1NiwyNjk1NywyNjk1OCwyNjk1OSwyNjk2MCwyNjk2MSwyNjk2MiwyNjk2MywyNjk2NSwyNjk2NiwyNjk2OCwyNjk2OSwyNjk3MSwyNjk3MiwyNjk3NSwyNjk3NywyNjk3OCwyNjk4MCwyNjk4MSwyNjk4MywyNjk4NCwyNjk4NSwyNjk4NiwyNjk4OCwyNjk4OSwyNjk5MSwyNjk5MiwyNjk5NCwyNjk5NSwyNjk5NiwyNjk5NywyNjk5OCwyNzAwMiwyNzAwMywyNzAwNSwyNzAwNiwyNzAwNywyNzAwOSwyNzAxMSwyNzAxMywyNzAxOCwyNzAxOSwyNzAyMCwyNzAyMiwyNzAyMywyNzAyNCwyNzAyNSwyNzAyNiwyNzAyNywyNzAzMCwyNzAzMSwyNzAzMywyNzAzNCwyNzAzNywyNzAzOCwyNzAzOSwyNzA0MCwyNzA0MSwyNzA0MiwyNzA0MywyNzA0NCwyNzA0NSwyNzA0NiwyNzA0OSwyNzA1MCwyNzA1MiwyNzA1NCwyNzA1NSwyNzA1NiwyNzA1OCwyNzA1OSwyNzA2MSwyNzA2MiwyNzA2NCwyNzA2NSwyNzA2NiwyNzA2OCwyNzA2OSwyNzA3MCwyNzA3MSwyNzA3MiwyNzA3NCwyNzA3NSwyNzA3NiwyNzA3NywyNzA3OCwyNzA3OSwyNzA4MCwyNzA4MSwyNzA4MywyNzA4NSwyNzA4NywyNzA4OSwyNzA5MCwyNzA5MSwyNzA5MywyNzA5NCwyNzA5NSwyNzA5NiwyNzA5NywyNzA5OCwyNzEwMCwyNzEwMSwyNzEwMiwyNzEwNSwyNzEwNiwyNzEwNywyNzEwOCwyNzEwOSwyNzExMCwyNzExMSwyNzExMiwyNzExMywyNzExNCwyNzExNSwyNzExNiwyNzExOCwyNzExOSwyNzEyMCwyNzEyMSwyNzEyMywyNzEyNCwyNzEyNSwyNzEyNiwyNzEyNywyNzEyOCwyNzEyOSwyNzEzMCwyNzEzMSwyNzEzMiwyNzEzNCwyNzEzNiwyNzEzNywyNzEzOCwyNzEzOSwyNzE0MCwyNzE0MSwyNzE0MiwyNzE0MywyNzE0NCwyNzE0NSwyNzE0NywyNzE0OCwyNzE0OSwyNzE1MCwyNzE1MSwyNzE1MiwyNzE1MywyNzE1NCwyNzE1NSwyNzE1NiwyNzE1NywyNzE1OCwyNzE2MSwyNzE2MiwyNzE2MywyNzE2NCwyNzE2NSwyNzE2NiwyNzE2OCwyNzE3MCwyNzE3MSwyNzE3MiwyNzE3MywyNzE3NCwyNzE3NSwyNzE3NywyNzE3OSwyNzE4MCwyNzE4MSwyNzE4MiwyNzE4NCwyNzE4NiwyNzE4NywyNzE4OCwyNzE5MCwyNzE5MSwyNzE5MiwyNzE5MywyNzE5NCwyNzE5NSwyNzE5NiwyNzE5OSwyNzIwMCwyNzIwMSwyNzIwMiwyNzIwMywyNzIwNSwyNzIwNiwyNzIwOCwyNzIwOSwyNzIxMCwyNzIxMSwyNzIxMiwyNzIxMywyNzIxNCwyNzIxNSwyNzIxNywyNzIxOCwyNzIxOSwyNzIyMCwyNzIyMSwyNzIyMiwyNzIyMywyNzIyNiwyNzIyOCwyNzIyOSwyNzIzMCwyNzIzMSwyNzIzMiwyNzIzNCwyNzIzNSwyNzIzNiwyNzIzOCwyNzIzOSwyNzI0MCwyNzI0MSwyNzI0MiwyNzI0MywyNzI0NCwyNzI0NSwyNzI0NiwyNzI0NywyNzI0OCwyNzI1MCwyNzI1MSwyNzI1MiwyNzI1MywyNzI1NCwyNzI1NSwyNzI1NiwyNzI1OCwyNzI1OSwyNzI2MSwyNzI2MiwyNzI2MywyNzI2NSwyNzI2NiwyNzI2NywyNzI2OSwyNzI3MCwyNzI3MSwyNzI3MiwyNzI3MywyNzI3NCwyNzI3NSwyNzI3NiwyNzI3NywyNzI3OSwyNzI4MiwyNzI4MywyNzI4NCwyNzI4NSwyNzI4NiwyNzI4OCwyNzI4OSwyNzI5MCwyNzI5MSwyNzI5MiwyNzI5MywyNzI5NCwyNzI5NSwyNzI5NywyNzI5OCwyNzI5OSwyNzMwMCwyNzMwMSwyNzMwMiwyNzMwMywyNzMwNCwyNzMwNiwyNzMwOSwyNzMxMCwyNzMxMSwyNzMxMiwyNzMxMywyNzMxNCwyNzMxNSwyNzMxNiwyNzMxNywyNzMxOCwyNzMxOSwyNzMyMCwyNzMyMSwyNzMyMiwyNzMyMywyNzMyNCwyNzMyNSwyNzMyNiwyNzMyNywyNzMyOCwyNzMyOSwyNzMzMCwyNzMzMSwyNzMzMiwyNzMzMywyNzMzNCwyNzMzNSwyNzMzNiwyNzMzNywyNzMzOCwyNzMzOSwyNzM0MCwyNzM0MSwyNzM0MiwyNzM0MywyNzM0NCwyNzM0NSwyNzM0NiwyNzM0NywyNzM0OCwyNzM0OSwyNzM1MCwyNzM1MSwyNzM1MiwyNzM1MywyNzM1NCwyNzM1NSwyNzM1NiwyNzM1NywyNzM1OCwyNzM1OSwyNzM2MCwyNzM2MSwyNzM2MiwyNzM2MywyNzM2NCwyNzM2NSwyNzM2NiwyNzM2NywyNzM2OCwyNzM2OSwyNzM3MCwyNzM3MSwyNzM3MiwyNzM3MywyNzM3NCwyNzM3NSwyNzM3NiwyNzM3NywyNzM3OCwyNzM3OSwyNzM4MCwyNzM4MSwyNzM4MiwyNzM4MywyNzM4NCwyNzM4NSwyNzM4NiwyNzM4NywyNzM4OCwyNzM4OSwyNzM5MCwyNzM5MSwyNzM5MiwyNzM5MywyNzM5NCwyNzM5NSwyNzM5NiwyNzM5NywyNzM5OCwyNzM5OSwyNzQwMCwyNzQwMSwyNzQwMiwyNzQwMywyNzQwNCwyNzQwNSwyNzQwNiwyNzQwNywyNzQwOCwyNzQwOSwyNzQxMCwyNzQxMSwyNzQxMiwyNzQxMywyNzQxNCwyNzQxNSwyNzQxNiwyNzQxNywyNzQxOCwyNzQxOSwyNzQyMCwyNzQyMSwyNzQyMiwyNzQyMywyNzQyOSwyNzQzMCwyNzQzMiwyNzQzMywyNzQzNCwyNzQzNSwyNzQzNiwyNzQzNywyNzQzOCwyNzQzOSwyNzQ0MCwyNzQ0MSwyNzQ0MywyNzQ0NCwyNzQ0NSwyNzQ0NiwyNzQ0OCwyNzQ1MSwyNzQ1MiwyNzQ1MywyNzQ1NSwyNzQ1NiwyNzQ1NywyNzQ1OCwyNzQ2MCwyNzQ2MSwyNzQ2NCwyNzQ2NiwyNzQ2NywyNzQ2OSwyNzQ3MCwyNzQ3MSwyNzQ3MiwyNzQ3MywyNzQ3NCwyNzQ3NSwyNzQ3NiwyNzQ3NywyNzQ3OCwyNzQ3OSwyNzQ4MCwyNzQ4MiwyNzQ4MywyNzQ4NCwyNzQ4NSwyNzQ4NiwyNzQ4NywyNzQ4OCwyNzQ4OSwyNzQ5NiwyNzQ5NywyNzQ5OSwyNzUwMCwyNzUwMSwyNzUwMiwyNzUwMywyNzUwNCwyNzUwNSwyNzUwNiwyNzUwNywyNzUwOCwyNzUwOSwyNzUxMCwyNzUxMSwyNzUxMiwyNzUxNCwyNzUxNywyNzUxOCwyNzUxOSwyNzUyMCwyNzUyNSwyNzUyOCwyNzUzMiwyNzUzNCwyNzUzNSwyNzUzNiwyNzUzNywyNzU0MCwyNzU0MSwyNzU0MywyNzU0NCwyNzU0NSwyNzU0OCwyNzU0OSwyNzU1MCwyNzU1MSwyNzU1MiwyNzU1NCwyNzU1NSwyNzU1NiwyNzU1NywyNzU1OCwyNzU1OSwyNzU2MCwyNzU2MSwyNzU2MywyNzU2NCwyNzU2NSwyNzU2NiwyNzU2NywyNzU2OCwyNzU2OSwyNzU3MCwyNzU3NCwyNzU3NiwyNzU3NywyNzU3OCwyNzU3OSwyNzU4MCwyNzU4MSwyNzU4MiwyNzU4NCwyNzU4NywyNzU4OCwyNzU5MCwyNzU5MSwyNzU5MiwyNzU5MywyNzU5NCwyNzU5NiwyNzU5OCwyNzYwMCwyNzYwMSwyNzYwOCwyNzYxMCwyNzYxMiwyNzYxMywyNzYxNCwyNzYxNSwyNzYxNiwyNzYxOCwyNzYxOSwyNzYyMCwyNzYyMSwyNzYyMiwyNzYyMywyNzYyNCwyNzYyNSwyNzYyOCwyNzYyOSwyNzYzMCwyNzYzMiwyNzYzMywyNzYzNCwyNzYzNiwyNzYzOCwyNzYzOSwyNzY0MCwyNzY0MiwyNzY0MywyNzY0NCwyNzY0NiwyNzY0NywyNzY0OCwyNzY0OSwyNzY1MCwyNzY1MSwyNzY1MiwyNzY1NiwyNzY1NywyNzY1OCwyNzY1OSwyNzY2MCwyNzY2MiwyNzY2NiwyNzY3MSwyNzY3NiwyNzY3NywyNzY3OCwyNzY4MCwyNzY4MywyNzY4NSwyNzY5MSwyNzY5MiwyNzY5MywyNzY5NywyNzY5OSwyNzcwMiwyNzcwMywyNzcwNSwyNzcwNiwyNzcwNywyNzcwOCwyNzcxMCwyNzcxMSwyNzcxNSwyNzcxNiwyNzcxNywyNzcyMCwyNzcyMywyNzcyNCwyNzcyNSwyNzcyNiwyNzcyNywyNzcyOSwyNzczMCwyNzczMSwyNzczNCwyNzczNiwyNzczNywyNzczOCwyNzc0NiwyNzc0NywyNzc0OSwyNzc1MCwyNzc1MSwyNzc1NSwyNzc1NiwyNzc1NywyNzc1OCwyNzc1OSwyNzc2MSwyNzc2MywyNzc2NSwyNzc2NywyNzc2OCwyNzc3MCwyNzc3MSwyNzc3MiwyNzc3NSwyNzc3NiwyNzc4MCwyNzc4MywyNzc4NiwyNzc4NywyNzc4OSwyNzc5MCwyNzc5MywyNzc5NCwyNzc5NywyNzc5OCwyNzc5OSwyNzgwMCwyNzgwMiwyNzgwNCwyNzgwNSwyNzgwNiwyNzgwOCwyNzgxMCwyNzgxNiwyNzgyMCwyNzgyMywyNzgyNCwyNzgyOCwyNzgyOSwyNzgzMCwyNzgzMSwyNzgzNCwyNzg0MCwyNzg0MSwyNzg0MiwyNzg0MywyNzg0NiwyNzg0NywyNzg0OCwyNzg1MSwyNzg1MywyNzg1NCwyNzg1NSwyNzg1NywyNzg1OCwyNzg2NCwyNzg2NSwyNzg2NiwyNzg2OCwyNzg2OSwyNzg3MSwyNzg3NiwyNzg3OCwyNzg3OSwyNzg4MSwyNzg4NCwyNzg4NSwyNzg5MCwyNzg5MiwyNzg5NywyNzkwMywyNzkwNCwyNzkwNiwyNzkwNywyNzkwOSwyNzkxMCwyNzkxMiwyNzkxMywyNzkxNCwyNzkxNywyNzkxOSwyNzkyMCwyNzkyMSwyNzkyMywyNzkyNCwyNzkyNSwyNzkyNiwyNzkyOCwyNzkzMiwyNzkzMywyNzkzNSwyNzkzNiwyNzkzNywyNzkzOCwyNzkzOSwyNzk0MCwyNzk0MiwyNzk0NCwyNzk0NSwyNzk0OCwyNzk0OSwyNzk1MSwyNzk1MiwyNzk1NiwyNzk1OCwyNzk1OSwyNzk2MCwyNzk2MiwyNzk2NywyNzk2OCwyNzk3MCwyNzk3MiwyNzk3NywyNzk4MCwyNzk4NCwyNzk4OSwyNzk5MCwyNzk5MSwyNzk5MiwyNzk5NSwyNzk5NywyNzk5OSwyODAwMSwyODAwMiwyODAwNCwyODAwNSwyODAwNywyODAwOCwyODAxMSwyODAxMiwyODAxMywyODAxNiwyODAxNywyODAxOCwyODAxOSwyODAyMSwyODAyMiwyODAyNSwyODAyNiwyODAyNywyODAyOSwyODAzMCwyODAzMSwyODAzMiwyODAzMywyODAzNSwyODAzNiwyODAzOCwyODAzOSwyODA0MiwyODA0MywyODA0NSwyODA0NywyODA0OCwyODA1MCwyODA1NCwyODA1NSwyODA1NiwyODA1NywyODA1OCwyODA2MCwyODA2NiwyODA2OSwyODA3NiwyODA3NywyODA4MCwyODA4MSwyODA4MywyODA4NCwyODA4NiwyODA4NywyODA4OSwyODA5MCwyODA5MSwyODA5MiwyODA5MywyODA5NCwyODA5NywyODA5OCwyODA5OSwyODEwNCwyODEwNSwyODEwNiwyODEwOSwyODExMCwyODExMSwyODExMiwyODExNCwyODExNSwyODExNiwyODExNywyODExOSwyODEyMiwyODEyMywyODEyNCwyODEyNywyODEzMCwyODEzMSwyODEzMywyODEzNSwyODEzNiwyODEzNywyODEzOCwyODE0MSwyODE0MywyODE0NCwyODE0NiwyODE0OCwyODE0OSwyODE1MCwyODE1MiwyODE1NCwyODE1NywyODE1OCwyODE1OSwyODE2MCwyODE2MSwyODE2MiwyODE2MywyODE2NCwyODE2NiwyODE2NywyODE2OCwyODE2OSwyODE3MSwyODE3NSwyODE3OCwyODE3OSwyODE4MSwyODE4NCwyODE4NSwyODE4NywyODE4OCwyODE5MCwyODE5MSwyODE5NCwyODE5OCwyODE5OSwyODIwMCwyODIwMiwyODIwNCwyODIwNiwyODIwOCwyODIwOSwyODIxMSwyODIxMywyODIxNCwyODIxNSwyODIxNywyODIxOSwyODIyMCwyODIyMSwyODIyMiwyODIyMywyODIyNCwyODIyNSwyODIyNiwyODIyOSwyODIzMCwyODIzMSwyODIzMiwyODIzMywyODIzNCwyODIzNSwyODIzNiwyODIzOSwyODI0MCwyODI0MSwyODI0MiwyODI0NSwyODI0NywyODI0OSwyODI1MCwyODI1MiwyODI1MywyODI1NCwyODI1NiwyODI1NywyODI1OCwyODI1OSwyODI2MCwyODI2MSwyODI2MiwyODI2MywyODI2NCwyODI2NSwyODI2NiwyODI2OCwyODI2OSwyODI3MSwyODI3MiwyODI3MywyODI3NCwyODI3NSwyODI3NiwyODI3NywyODI3OCwyODI3OSwyODI4MCwyODI4MSwyODI4MiwyODI4MywyODI4NCwyODI4NSwyODI4OCwyODI4OSwyODI5MCwyODI5MiwyODI5NSwyODI5NiwyODI5OCwyODI5OSwyODMwMCwyODMwMSwyODMwMiwyODMwNSwyODMwNiwyODMwNywyODMwOCwyODMwOSwyODMxMCwyODMxMSwyODMxMywyODMxNCwyODMxNSwyODMxNywyODMxOCwyODMyMCwyODMyMSwyODMyMywyODMyNCwyODMyNiwyODMyOCwyODMyOSwyODMzMSwyODMzMiwyODMzMywyODMzNCwyODMzNiwyODMzOSwyODM0MSwyODM0NCwyODM0NSwyODM0OCwyODM1MCwyODM1MSwyODM1MiwyODM1NSwyODM1NiwyODM1NywyODM1OCwyODM2MCwyODM2MSwyODM2MiwyODM2NCwyODM2NSwyODM2NiwyODM2OCwyODM3MCwyODM3NCwyODM3NiwyODM3NywyODM3OSwyODM4MCwyODM4MSwyODM4NywyODM5MSwyODM5NCwyODM5NSwyODM5NiwyODM5NywyODM5OCwyODM5OSwyODQwMCwyODQwMSwyODQwMiwyODQwMywyODQwNSwyODQwNiwyODQwNywyODQwOCwyODQxMCwyODQxMSwyODQxMiwyODQxMywyODQxNCwyODQxNSwyODQxNiwyODQxNywyODQxOSwyODQyMCwyODQyMSwyODQyMywyODQyNCwyODQyNiwyODQyNywyODQyOCwyODQyOSwyODQzMCwyODQzMiwyODQzMywyODQzNCwyODQzOCwyODQzOSwyODQ0MCwyODQ0MSwyODQ0MiwyODQ0MywyODQ0NCwyODQ0NSwyODQ0NiwyODQ0NywyODQ0OSwyODQ1MCwyODQ1MSwyODQ1MywyODQ1NCwyODQ1NSwyODQ1NiwyODQ2MCwyODQ2MiwyODQ2NCwyODQ2NiwyODQ2OCwyODQ2OSwyODQ3MSwyODQ3MiwyODQ3MywyODQ3NCwyODQ3NSwyODQ3NiwyODQ3NywyODQ3OSwyODQ4MCwyODQ4MSwyODQ4MiwyODQ4MywyODQ4NCwyODQ4NSwyODQ4OCwyODQ4OSwyODQ5MCwyODQ5MiwyODQ5NCwyODQ5NSwyODQ5NiwyODQ5NywyODQ5OCwyODQ5OSwyODUwMCwyODUwMSwyODUwMiwyODUwMywyODUwNSwyODUwNiwyODUwNywyODUwOSwyODUxMSwyODUxMiwyODUxMywyODUxNSwyODUxNiwyODUxNywyODUxOSwyODUyMCwyODUyMSwyODUyMiwyODUyMywyODUyNCwyODUyNywyODUyOCwyODUyOSwyODUzMSwyODUzMywyODUzNCwyODUzNSwyODUzNywyODUzOSwyODU0MSwyODU0MiwyODU0MywyODU0NCwyODU0NSwyODU0NiwyODU0NywyODU0OSwyODU1MCwyODU1MSwyODU1NCwyODU1NSwyODU1OSwyODU2MCwyODU2MSwyODU2MiwyODU2MywyODU2NCwyODU2NSwyODU2NiwyODU2NywyODU2OCwyODU2OSwyODU3MCwyODU3MSwyODU3MywyODU3NCwyODU3NSwyODU3NiwyODU3OCwyODU3OSwyODU4MCwyODU4MSwyODU4MiwyODU4NCwyODU4NSwyODU4NiwyODU4NywyODU4OCwyODU4OSwyODU5MCwyODU5MSwyODU5MiwyODU5MywyODU5NCwyODU5NiwyODU5NywyODU5OSwyODYwMCwyODYwMiwyODYwMywyODYwNCwyODYwNSwyODYwNiwyODYwNywyODYwOSwyODYxMSwyODYxMiwyODYxMywyODYxNCwyODYxNSwyODYxNiwyODYxOCwyODYxOSwyODYyMCwyODYyMSwyODYyMiwyODYyMywyODYyNCwyODYyNywyODYyOCwyODYyOSwyODYzMCwyODYzMSwyODYzMiwyODYzMywyODYzNCwyODYzNSwyODYzNiwyODYzNywyODYzOSwyODY0MiwyODY0MywyODY0NCwyODY0NSwyODY0NiwyODY0NywyODY0OCwyODY0OSwyODY1MCwyODY1MSwyODY1MiwyODY1MywyODY1NiwyODY1NywyODY1OCwyODY1OSwyODY2MCwyODY2MSwyODY2MiwyODY2MywyODY2NCwyODY2NSwyODY2NiwyODY2NywyODY2OCwyODY2OSwyODY3MCwyODY3MSwyODY3MiwyODY3MywyODY3NCwyODY3NSwyODY3NiwyODY3NywyODY3OCwyODY3OSwyODY4MCwyODY4MSwyODY4MiwyODY4MywyODY4NCwyODY4NSwyODY4NiwyODY4NywyODY4OCwyODY5MCwyODY5MSwyODY5MiwyODY5MywyODY5NCwyODY5NSwyODY5NiwyODY5NywyODcwMCwyODcwMSwyODcwMiwyODcwMywyODcwNCwyODcwNSwyODcwNiwyODcwOCwyODcwOSwyODcxMCwyODcxMSwyODcxMiwyODcxMywyODcxNCwyODcxNSwyODcxNiwyODcxNywyODcxOCwyODcxOSwyODcyMCwyODcyMSwyODcyMiwyODcyMywyODcyNCwyODcyNiwyODcyNywyODcyOCwyODczMCwyODczMSwyODczMiwyODczMywyODczNCwyODczNSwyODczNiwyODczNywyODczOCwyODczOSwyODc0MCwyODc0MSwyODc0MiwyODc0MywyODc0NCwyODc0NSwyODc0NiwyODc0NywyODc0OSwyODc1MCwyODc1MiwyODc1MywyODc1NCwyODc1NSwyODc1NiwyODc1NywyODc1OCwyODc1OSwyODc2MCwyODc2MSwyODc2MiwyODc2MywyODc2NCwyODc2NSwyODc2NywyODc2OCwyODc2OSwyODc3MCwyODc3MSwyODc3MiwyODc3MywyODc3NCwyODc3NSwyODc3NiwyODc3NywyODc3OCwyODc4MiwyODc4NSwyODc4NiwyODc4NywyODc4OCwyODc5MSwyODc5MywyODc5NCwyODc5NSwyODc5NywyODgwMSwyODgwMiwyODgwMywyODgwNCwyODgwNiwyODgwNywyODgwOCwyODgxMSwyODgxMiwyODgxMywyODgxNSwyODgxNiwyODgxNywyODgxOSwyODgyMywyODgyNCwyODgyNiwyODgyNywyODgzMCwyODgzMSwyODgzMiwyODgzMywyODgzNCwyODgzNSwyODgzNiwyODgzNywyODgzOCwyODgzOSwyODg0MCwyODg0MSwyODg0MiwyODg0OCwyODg1MCwyODg1MiwyODg1MywyODg1NCwyODg1OCwyODg2MiwyODg2MywyODg2OCwyODg2OSwyODg3MCwyODg3MSwyODg3MywyODg3NSwyODg3NiwyODg3NywyODg3OCwyODg3OSwyODg4MCwyODg4MSwyODg4MiwyODg4MywyODg4NCwyODg4NSwyODg4NiwyODg4NywyODg5MCwyODg5MiwyODg5MywyODg5NCwyODg5NiwyODg5NywyODg5OCwyODg5OSwyODkwMSwyODkwNiwyODkxMCwyODkxMiwyODkxMywyODkxNCwyODkxNSwyODkxNiwyODkxNywyODkxOCwyODkyMCwyODkyMiwyODkyMywyODkyNCwyODkyNiwyODkyNywyODkyOCwyODkyOSwyODkzMCwyODkzMSwyODkzMiwyODkzMywyODkzNCwyODkzNSwyODkzNiwyODkzOSwyODk0MCwyODk0MSwyODk0MiwyODk0MywyODk0NSwyODk0NiwyODk0OCwyODk1MSwyODk1NSwyODk1NiwyODk1NywyODk1OCwyODk1OSwyODk2MCwyODk2MSwyODk2MiwyODk2MywyODk2NCwyODk2NSwyODk2NywyODk2OCwyODk2OSwyODk3MCwyODk3MSwyODk3MiwyODk3MywyODk3NCwyODk3OCwyODk3OSwyODk4MCwyODk4MSwyODk4MywyODk4NCwyODk4NSwyODk4NiwyODk4NywyODk4OCwyODk4OSwyODk5MCwyODk5MSwyODk5MiwyODk5MywyODk5NCwyODk5NSwyODk5NiwyODk5OCwyODk5OSwyOTAwMCwyOTAwMSwyOTAwMywyOTAwNSwyOTAwNywyOTAwOCwyOTAwOSwyOTAxMCwyOTAxMSwyOTAxMiwyOTAxMywyOTAxNCwyOTAxNSwyOTAxNiwyOTAxNywyOTAxOCwyOTAxOSwyOTAyMSwyOTAyMywyOTAyNCwyOTAyNSwyOTAyNiwyOTAyNywyOTAyOSwyOTAzMywyOTAzNCwyOTAzNSwyOTAzNiwyOTAzNywyOTAzOSwyOTA0MCwyOTA0MSwyOTA0NCwyOTA0NSwyOTA0NiwyOTA0NywyOTA0OSwyOTA1MSwyOTA1MiwyOTA1NCwyOTA1NSwyOTA1NiwyOTA1NywyOTA1OCwyOTA1OSwyOTA2MSwyOTA2MiwyOTA2MywyOTA2NCwyOTA2NSwyOTA2NywyOTA2OCwyOTA2OSwyOTA3MCwyOTA3MiwyOTA3MywyOTA3NCwyOTA3NSwyOTA3NywyOTA3OCwyOTA3OSwyOTA4MiwyOTA4MywyOTA4NCwyOTA4NSwyOTA4NiwyOTA4OSwyOTA5MCwyOTA5MSwyOTA5MiwyOTA5MywyOTA5NCwyOTA5NSwyOTA5NywyOTA5OCwyOTA5OSwyOTEwMSwyOTEwMiwyOTEwMywyOTEwNCwyOTEwNSwyOTEwNiwyOTEwOCwyOTExMCwyOTExMSwyOTExMiwyOTExNCwyOTExNSwyOTExNiwyOTExNywyOTExOCwyOTExOSwyOTEyMCwyOTEyMSwyOTEyMiwyOTEyNCwyOTEyNSwyOTEyNiwyOTEyNywyOTEyOCwyOTEyOSwyOTEzMCwyOTEzMSwyOTEzMiwyOTEzMywyOTEzNSwyOTEzNiwyOTEzNywyOTEzOCwyOTEzOSwyOTE0MiwyOTE0MywyOTE0NCwyOTE0NSwyOTE0NiwyOTE0NywyOTE0OCwyOTE0OSwyOTE1MCwyOTE1MSwyOTE1MywyOTE1NCwyOTE1NSwyOTE1NiwyOTE1OCwyOTE2MCwyOTE2MSwyOTE2MiwyOTE2MywyOTE2NCwyOTE2NSwyOTE2NywyOTE2OCwyOTE2OSwyOTE3MCwyOTE3MSwyOTE3MiwyOTE3MywyOTE3NCwyOTE3NSwyOTE3NiwyOTE3OCwyOTE3OSwyOTE4MCwyOTE4MSwyOTE4MiwyOTE4MywyOTE4NCwyOTE4NSwyOTE4NiwyOTE4NywyOTE4OCwyOTE4OSwyOTE5MSwyOTE5MiwyOTE5MywyOTE5NCwyOTE5NSwyOTE5NiwyOTE5NywyOTE5OCwyOTE5OSwyOTIwMCwyOTIwMSwyOTIwMiwyOTIwMywyOTIwNCwyOTIwNSwyOTIwNiwyOTIwNywyOTIwOCwyOTIwOSwyOTIxMCwyOTIxMSwyOTIxMiwyOTIxNCwyOTIxNSwyOTIxNiwyOTIxNywyOTIxOCwyOTIxOSwyOTIyMCwyOTIyMSwyOTIyMiwyOTIyMywyOTIyNSwyOTIyNywyOTIyOSwyOTIzMCwyOTIzMSwyOTIzNCwyOTIzNSwyOTIzNiwyOTI0MiwyOTI0NCwyOTI0NiwyOTI0OCwyOTI0OSwyOTI1MCwyOTI1MSwyOTI1MiwyOTI1MywyOTI1NCwyOTI1NywyOTI1OCwyOTI1OSwyOTI2MiwyOTI2MywyOTI2NCwyOTI2NSwyOTI2NywyOTI2OCwyOTI2OSwyOTI3MSwyOTI3MiwyOTI3NCwyOTI3NiwyOTI3OCwyOTI4MCwyOTI4MywyOTI4NCwyOTI4NSwyOTI4OCwyOTI5MCwyOTI5MSwyOTI5MiwyOTI5MywyOTI5NiwyOTI5NywyOTI5OSwyOTMwMCwyOTMwMiwyOTMwMywyOTMwNCwyOTMwNywyOTMwOCwyOTMwOSwyOTMxNCwyOTMxNSwyOTMxNywyOTMxOCwyOTMxOSwyOTMyMCwyOTMyMSwyOTMyNCwyOTMyNiwyOTMyOCwyOTMyOSwyOTMzMSwyOTMzMiwyOTMzMywyOTMzNCwyOTMzNSwyOTMzNiwyOTMzNywyOTMzOCwyOTMzOSwyOTM0MCwyOTM0MSwyOTM0MiwyOTM0NCwyOTM0NSwyOTM0NiwyOTM0NywyOTM0OCwyOTM0OSwyOTM1MCwyOTM1MSwyOTM1MiwyOTM1MywyOTM1NCwyOTM1NSwyOTM1OCwyOTM2MSwyOTM2MiwyOTM2MywyOTM2NSwyOTM3MCwyOTM3MSwyOTM3MiwyOTM3MywyOTM3NCwyOTM3NSwyOTM3NiwyOTM4MSwyOTM4MiwyOTM4MywyOTM4NSwyOTM4NiwyOTM4NywyOTM4OCwyOTM5MSwyOTM5MywyOTM5NSwyOTM5NiwyOTM5NywyOTM5OCwyOTQwMCwyOTQwMiwyOTQwMyw1ODU2Niw1ODU2Nyw1ODU2OCw1ODU2OSw1ODU3MCw1ODU3MSw1ODU3Miw1ODU3Myw1ODU3NCw1ODU3NSw1ODU3Niw1ODU3Nyw1ODU3OCw1ODU3OSw1ODU4MCw1ODU4MSw1ODU4Miw1ODU4Myw1ODU4NCw1ODU4NSw1ODU4Niw1ODU4Nyw1ODU4OCw1ODU4OSw1ODU5MCw1ODU5MSw1ODU5Miw1ODU5Myw1ODU5NCw1ODU5NSw1ODU5Niw1ODU5Nyw1ODU5OCw1ODU5OSw1ODYwMCw1ODYwMSw1ODYwMiw1ODYwMyw1ODYwNCw1ODYwNSw1ODYwNiw1ODYwNyw1ODYwOCw1ODYwOSw1ODYxMCw1ODYxMSw1ODYxMiw1ODYxMyw1ODYxNCw1ODYxNSw1ODYxNiw1ODYxNyw1ODYxOCw1ODYxOSw1ODYyMCw1ODYyMSw1ODYyMiw1ODYyMyw1ODYyNCw1ODYyNSw1ODYyNiw1ODYyNyw1ODYyOCw1ODYyOSw1ODYzMCw1ODYzMSw1ODYzMiw1ODYzMyw1ODYzNCw1ODYzNSw1ODYzNiw1ODYzNyw1ODYzOCw1ODYzOSw1ODY0MCw1ODY0MSw1ODY0Miw1ODY0Myw1ODY0NCw1ODY0NSw1ODY0Niw1ODY0Nyw1ODY0OCw1ODY0OSw1ODY1MCw1ODY1MSw1ODY1Miw1ODY1Myw1ODY1NCw1ODY1NSw1ODY1Niw1ODY1Nyw1ODY1OCw1ODY1OSw1ODY2MCw1ODY2MSwxMjI4OCwxMjI4OSwxMjI5MCwxODMsNzEzLDcxMSwxNjgsMTIyOTEsMTIyOTMsODIxMiw2NTM3NCw4MjE0LDgyMzAsODIxNiw4MjE3LDgyMjAsODIyMSwxMjMwOCwxMjMwOSwxMjI5NiwxMjI5NywxMjI5OCwxMjI5OSwxMjMwMCwxMjMwMSwxMjMwMiwxMjMwMywxMjMxMCwxMjMxMSwxMjMwNCwxMjMwNSwxNzcsMjE1LDI0Nyw4NzU4LDg3NDMsODc0NCw4NzIxLDg3MTksODc0Niw4NzQ1LDg3MTIsODc1OSw4NzMwLDg4NjksODc0MSw4NzM2LDg5NzgsODg1Nyw4NzQ3LDg3NTAsODgwMSw4NzgwLDg3NzYsODc2NSw4NzMzLDg4MDAsODgxNCw4ODE1LDg4MDQsODgwNSw4NzM0LDg3NTcsODc1Niw5Nzk0LDk3OTIsMTc2LDgyNDIsODI0Myw4NDUxLDY1Mjg0LDE2NCw2NTUwNCw2NTUwNSw4MjQwLDE2Nyw4NDcwLDk3MzQsOTczMyw5Njc1LDk2NzksOTY3OCw5NjcxLDk2NzAsOTYzMyw5NjMyLDk2NTEsOTY1MCw4MjUxLDg1OTQsODU5Miw4NTkzLDg1OTUsMTIzMDcsNTg2NjIsNTg2NjMsNTg2NjQsNTg2NjUsNTg2NjYsNTg2NjcsNTg2NjgsNTg2NjksNTg2NzAsNTg2NzEsNTg2NzIsNTg2NzMsNTg2NzQsNTg2NzUsNTg2NzYsNTg2NzcsNTg2NzgsNTg2NzksNTg2ODAsNTg2ODEsNTg2ODIsNTg2ODMsNTg2ODQsNTg2ODUsNTg2ODYsNTg2ODcsNTg2ODgsNTg2ODksNTg2OTAsNTg2OTEsNTg2OTIsNTg2OTMsNTg2OTQsNTg2OTUsNTg2OTYsNTg2OTcsNTg2OTgsNTg2OTksNTg3MDAsNTg3MDEsNTg3MDIsNTg3MDMsNTg3MDQsNTg3MDUsNTg3MDYsNTg3MDcsNTg3MDgsNTg3MDksNTg3MTAsNTg3MTEsNTg3MTIsNTg3MTMsNTg3MTQsNTg3MTUsNTg3MTYsNTg3MTcsNTg3MTgsNTg3MTksNTg3MjAsNTg3MjEsNTg3MjIsNTg3MjMsNTg3MjQsNTg3MjUsNTg3MjYsNTg3MjcsNTg3MjgsNTg3MjksNTg3MzAsNTg3MzEsNTg3MzIsNTg3MzMsNTg3MzQsNTg3MzUsNTg3MzYsNTg3MzcsNTg3MzgsNTg3MzksNTg3NDAsNTg3NDEsNTg3NDIsNTg3NDMsNTg3NDQsNTg3NDUsNTg3NDYsNTg3NDcsNTg3NDgsNTg3NDksNTg3NTAsNTg3NTEsNTg3NTIsNTg3NTMsNTg3NTQsNTg3NTUsNTg3NTYsNTg3NTcsODU2MCw4NTYxLDg1NjIsODU2Myw4NTY0LDg1NjUsODU2Niw4NTY3LDg1NjgsODU2OSw1OTIzOCw1OTIzOSw1OTI0MCw1OTI0MSw1OTI0Miw1OTI0Myw5MzUyLDkzNTMsOTM1NCw5MzU1LDkzNTYsOTM1Nyw5MzU4LDkzNTksOTM2MCw5MzYxLDkzNjIsOTM2Myw5MzY0LDkzNjUsOTM2Niw5MzY3LDkzNjgsOTM2OSw5MzcwLDkzNzEsOTMzMiw5MzMzLDkzMzQsOTMzNSw5MzM2LDkzMzcsOTMzOCw5MzM5LDkzNDAsOTM0MSw5MzQyLDkzNDMsOTM0NCw5MzQ1LDkzNDYsOTM0Nyw5MzQ4LDkzNDksOTM1MCw5MzUxLDkzMTIsOTMxMyw5MzE0LDkzMTUsOTMxNiw5MzE3LDkzMTgsOTMxOSw5MzIwLDkzMjEsODM2NCw1OTI0NSwxMjgzMiwxMjgzMywxMjgzNCwxMjgzNSwxMjgzNiwxMjgzNywxMjgzOCwxMjgzOSwxMjg0MCwxMjg0MSw1OTI0Niw1OTI0Nyw4NTQ0LDg1NDUsODU0Niw4NTQ3LDg1NDgsODU0OSw4NTUwLDg1NTEsODU1Miw4NTUzLDg1NTQsODU1NSw1OTI0OCw1OTI0OSw1ODc1OCw1ODc1OSw1ODc2MCw1ODc2MSw1ODc2Miw1ODc2Myw1ODc2NCw1ODc2NSw1ODc2Niw1ODc2Nyw1ODc2OCw1ODc2OSw1ODc3MCw1ODc3MSw1ODc3Miw1ODc3Myw1ODc3NCw1ODc3NSw1ODc3Niw1ODc3Nyw1ODc3OCw1ODc3OSw1ODc4MCw1ODc4MSw1ODc4Miw1ODc4Myw1ODc4NCw1ODc4NSw1ODc4Niw1ODc4Nyw1ODc4OCw1ODc4OSw1ODc5MCw1ODc5MSw1ODc5Miw1ODc5Myw1ODc5NCw1ODc5NSw1ODc5Niw1ODc5Nyw1ODc5OCw1ODc5OSw1ODgwMCw1ODgwMSw1ODgwMiw1ODgwMyw1ODgwNCw1ODgwNSw1ODgwNiw1ODgwNyw1ODgwOCw1ODgwOSw1ODgxMCw1ODgxMSw1ODgxMiw1ODgxMyw1ODgxNCw1ODgxNSw1ODgxNiw1ODgxNyw1ODgxOCw1ODgxOSw1ODgyMCw1ODgyMSw1ODgyMiw1ODgyMyw1ODgyNCw1ODgyNSw1ODgyNiw1ODgyNyw1ODgyOCw1ODgyOSw1ODgzMCw1ODgzMSw1ODgzMiw1ODgzMyw1ODgzNCw1ODgzNSw1ODgzNiw1ODgzNyw1ODgzOCw1ODgzOSw1ODg0MCw1ODg0MSw1ODg0Miw1ODg0Myw1ODg0NCw1ODg0NSw1ODg0Niw1ODg0Nyw1ODg0OCw1ODg0OSw1ODg1MCw1ODg1MSw1ODg1MiwxMjI4OCw2NTI4MSw2NTI4Miw2NTI4Myw2NTUwOSw2NTI4NSw2NTI4Niw2NTI4Nyw2NTI4OCw2NTI4OSw2NTI5MCw2NTI5MSw2NTI5Miw2NTI5Myw2NTI5NCw2NTI5NSw2NTI5Niw2NTI5Nyw2NTI5OCw2NTI5OSw2NTMwMCw2NTMwMSw2NTMwMiw2NTMwMyw2NTMwNCw2NTMwNSw2NTMwNiw2NTMwNyw2NTMwOCw2NTMwOSw2NTMxMCw2NTMxMSw2NTMxMiw2NTMxMyw2NTMxNCw2NTMxNSw2NTMxNiw2NTMxNyw2NTMxOCw2NTMxOSw2NTMyMCw2NTMyMSw2NTMyMiw2NTMyMyw2NTMyNCw2NTMyNSw2NTMyNiw2NTMyNyw2NTMyOCw2NTMyOSw2NTMzMCw2NTMzMSw2NTMzMiw2NTMzMyw2NTMzNCw2NTMzNSw2NTMzNiw2NTMzNyw2NTMzOCw2NTMzOSw2NTM0MCw2NTM0MSw2NTM0Miw2NTM0Myw2NTM0NCw2NTM0NSw2NTM0Niw2NTM0Nyw2NTM0OCw2NTM0OSw2NTM1MCw2NTM1MSw2NTM1Miw2NTM1Myw2NTM1NCw2NTM1NSw2NTM1Niw2NTM1Nyw2NTM1OCw2NTM1OSw2NTM2MCw2NTM2MSw2NTM2Miw2NTM2Myw2NTM2NCw2NTM2NSw2NTM2Niw2NTM2Nyw2NTM2OCw2NTM2OSw2NTM3MCw2NTM3MSw2NTM3Miw2NTM3Myw2NTUwNyw1ODg1NCw1ODg1NSw1ODg1Niw1ODg1Nyw1ODg1OCw1ODg1OSw1ODg2MCw1ODg2MSw1ODg2Miw1ODg2Myw1ODg2NCw1ODg2NSw1ODg2Niw1ODg2Nyw1ODg2OCw1ODg2OSw1ODg3MCw1ODg3MSw1ODg3Miw1ODg3Myw1ODg3NCw1ODg3NSw1ODg3Niw1ODg3Nyw1ODg3OCw1ODg3OSw1ODg4MCw1ODg4MSw1ODg4Miw1ODg4Myw1ODg4NCw1ODg4NSw1ODg4Niw1ODg4Nyw1ODg4OCw1ODg4OSw1ODg5MCw1ODg5MSw1ODg5Miw1ODg5Myw1ODg5NCw1ODg5NSw1ODg5Niw1ODg5Nyw1ODg5OCw1ODg5OSw1ODkwMCw1ODkwMSw1ODkwMiw1ODkwMyw1ODkwNCw1ODkwNSw1ODkwNiw1ODkwNyw1ODkwOCw1ODkwOSw1ODkxMCw1ODkxMSw1ODkxMiw1ODkxMyw1ODkxNCw1ODkxNSw1ODkxNiw1ODkxNyw1ODkxOCw1ODkxOSw1ODkyMCw1ODkyMSw1ODkyMiw1ODkyMyw1ODkyNCw1ODkyNSw1ODkyNiw1ODkyNyw1ODkyOCw1ODkyOSw1ODkzMCw1ODkzMSw1ODkzMiw1ODkzMyw1ODkzNCw1ODkzNSw1ODkzNiw1ODkzNyw1ODkzOCw1ODkzOSw1ODk0MCw1ODk0MSw1ODk0Miw1ODk0Myw1ODk0NCw1ODk0NSw1ODk0Niw1ODk0Nyw1ODk0OCw1ODk0OSwxMjM1MywxMjM1NCwxMjM1NSwxMjM1NiwxMjM1NywxMjM1OCwxMjM1OSwxMjM2MCwxMjM2MSwxMjM2MiwxMjM2MywxMjM2NCwxMjM2NSwxMjM2NiwxMjM2NywxMjM2OCwxMjM2OSwxMjM3MCwxMjM3MSwxMjM3MiwxMjM3MywxMjM3NCwxMjM3NSwxMjM3NiwxMjM3NywxMjM3OCwxMjM3OSwxMjM4MCwxMjM4MSwxMjM4MiwxMjM4MywxMjM4NCwxMjM4NSwxMjM4NiwxMjM4NywxMjM4OCwxMjM4OSwxMjM5MCwxMjM5MSwxMjM5MiwxMjM5MywxMjM5NCwxMjM5NSwxMjM5NiwxMjM5NywxMjM5OCwxMjM5OSwxMjQwMCwxMjQwMSwxMjQwMiwxMjQwMywxMjQwNCwxMjQwNSwxMjQwNiwxMjQwNywxMjQwOCwxMjQwOSwxMjQxMCwxMjQxMSwxMjQxMiwxMjQxMywxMjQxNCwxMjQxNSwxMjQxNiwxMjQxNywxMjQxOCwxMjQxOSwxMjQyMCwxMjQyMSwxMjQyMiwxMjQyMywxMjQyNCwxMjQyNSwxMjQyNiwxMjQyNywxMjQyOCwxMjQyOSwxMjQzMCwxMjQzMSwxMjQzMiwxMjQzMywxMjQzNCwxMjQzNSw1OTI1MCw1OTI1MSw1OTI1Miw1OTI1Myw1OTI1NCw1OTI1NSw1OTI1Niw1OTI1Nyw1OTI1OCw1OTI1OSw1OTI2MCw1ODk1MCw1ODk1MSw1ODk1Miw1ODk1Myw1ODk1NCw1ODk1NSw1ODk1Niw1ODk1Nyw1ODk1OCw1ODk1OSw1ODk2MCw1ODk2MSw1ODk2Miw1ODk2Myw1ODk2NCw1ODk2NSw1ODk2Niw1ODk2Nyw1ODk2OCw1ODk2OSw1ODk3MCw1ODk3MSw1ODk3Miw1ODk3Myw1ODk3NCw1ODk3NSw1ODk3Niw1ODk3Nyw1ODk3OCw1ODk3OSw1ODk4MCw1ODk4MSw1ODk4Miw1ODk4Myw1ODk4NCw1ODk4NSw1ODk4Niw1ODk4Nyw1ODk4OCw1ODk4OSw1ODk5MCw1ODk5MSw1ODk5Miw1ODk5Myw1ODk5NCw1ODk5NSw1ODk5Niw1ODk5Nyw1ODk5OCw1ODk5OSw1OTAwMCw1OTAwMSw1OTAwMiw1OTAwMyw1OTAwNCw1OTAwNSw1OTAwNiw1OTAwNyw1OTAwOCw1OTAwOSw1OTAxMCw1OTAxMSw1OTAxMiw1OTAxMyw1OTAxNCw1OTAxNSw1OTAxNiw1OTAxNyw1OTAxOCw1OTAxOSw1OTAyMCw1OTAyMSw1OTAyMiw1OTAyMyw1OTAyNCw1OTAyNSw1OTAyNiw1OTAyNyw1OTAyOCw1OTAyOSw1OTAzMCw1OTAzMSw1OTAzMiw1OTAzMyw1OTAzNCw1OTAzNSw1OTAzNiw1OTAzNyw1OTAzOCw1OTAzOSw1OTA0MCw1OTA0MSw1OTA0Miw1OTA0Myw1OTA0NCw1OTA0NSwxMjQ0OSwxMjQ1MCwxMjQ1MSwxMjQ1MiwxMjQ1MywxMjQ1NCwxMjQ1NSwxMjQ1NiwxMjQ1NywxMjQ1OCwxMjQ1OSwxMjQ2MCwxMjQ2MSwxMjQ2MiwxMjQ2MywxMjQ2NCwxMjQ2NSwxMjQ2NiwxMjQ2NywxMjQ2OCwxMjQ2OSwxMjQ3MCwxMjQ3MSwxMjQ3MiwxMjQ3MywxMjQ3NCwxMjQ3NSwxMjQ3NiwxMjQ3NywxMjQ3OCwxMjQ3OSwxMjQ4MCwxMjQ4MSwxMjQ4MiwxMjQ4MywxMjQ4NCwxMjQ4NSwxMjQ4NiwxMjQ4NywxMjQ4OCwxMjQ4OSwxMjQ5MCwxMjQ5MSwxMjQ5MiwxMjQ5MywxMjQ5NCwxMjQ5NSwxMjQ5NiwxMjQ5NywxMjQ5OCwxMjQ5OSwxMjUwMCwxMjUwMSwxMjUwMiwxMjUwMywxMjUwNCwxMjUwNSwxMjUwNiwxMjUwNywxMjUwOCwxMjUwOSwxMjUxMCwxMjUxMSwxMjUxMiwxMjUxMywxMjUxNCwxMjUxNSwxMjUxNiwxMjUxNywxMjUxOCwxMjUxOSwxMjUyMCwxMjUyMSwxMjUyMiwxMjUyMywxMjUyNCwxMjUyNSwxMjUyNiwxMjUyNywxMjUyOCwxMjUyOSwxMjUzMCwxMjUzMSwxMjUzMiwxMjUzMywxMjUzNCw1OTI2MSw1OTI2Miw1OTI2Myw1OTI2NCw1OTI2NSw1OTI2Niw1OTI2Nyw1OTI2OCw1OTA0Niw1OTA0Nyw1OTA0OCw1OTA0OSw1OTA1MCw1OTA1MSw1OTA1Miw1OTA1Myw1OTA1NCw1OTA1NSw1OTA1Niw1OTA1Nyw1OTA1OCw1OTA1OSw1OTA2MCw1OTA2MSw1OTA2Miw1OTA2Myw1OTA2NCw1OTA2NSw1OTA2Niw1OTA2Nyw1OTA2OCw1OTA2OSw1OTA3MCw1OTA3MSw1OTA3Miw1OTA3Myw1OTA3NCw1OTA3NSw1OTA3Niw1OTA3Nyw1OTA3OCw1OTA3OSw1OTA4MCw1OTA4MSw1OTA4Miw1OTA4Myw1OTA4NCw1OTA4NSw1OTA4Niw1OTA4Nyw1OTA4OCw1OTA4OSw1OTA5MCw1OTA5MSw1OTA5Miw1OTA5Myw1OTA5NCw1OTA5NSw1OTA5Niw1OTA5Nyw1OTA5OCw1OTA5OSw1OTEwMCw1OTEwMSw1OTEwMiw1OTEwMyw1OTEwNCw1OTEwNSw1OTEwNiw1OTEwNyw1OTEwOCw1OTEwOSw1OTExMCw1OTExMSw1OTExMiw1OTExMyw1OTExNCw1OTExNSw1OTExNiw1OTExNyw1OTExOCw1OTExOSw1OTEyMCw1OTEyMSw1OTEyMiw1OTEyMyw1OTEyNCw1OTEyNSw1OTEyNiw1OTEyNyw1OTEyOCw1OTEyOSw1OTEzMCw1OTEzMSw1OTEzMiw1OTEzMyw1OTEzNCw1OTEzNSw1OTEzNiw1OTEzNyw1OTEzOCw1OTEzOSw1OTE0MCw1OTE0MSw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw1OTI2OSw1OTI3MCw1OTI3MSw1OTI3Miw1OTI3Myw1OTI3NCw1OTI3NSw1OTI3Niw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw1OTI3Nyw1OTI3OCw1OTI3OSw1OTI4MCw1OTI4MSw1OTI4Miw1OTI4Myw2NTA3Nyw2NTA3OCw2NTA4MSw2NTA4Miw2NTA4Nyw2NTA4OCw2NTA4NSw2NTA4Niw2NTA4OSw2NTA5MCw2NTA5MSw2NTA5Miw1OTI4NCw1OTI4NSw2NTA4Myw2NTA4NCw2NTA3OSw2NTA4MCw2NTA3Myw1OTI4Niw2NTA3NSw2NTA3Niw1OTI4Nyw1OTI4OCw1OTI4OSw1OTI5MCw1OTI5MSw1OTI5Miw1OTI5Myw1OTI5NCw1OTI5NSw1OTE0Miw1OTE0Myw1OTE0NCw1OTE0NSw1OTE0Niw1OTE0Nyw1OTE0OCw1OTE0OSw1OTE1MCw1OTE1MSw1OTE1Miw1OTE1Myw1OTE1NCw1OTE1NSw1OTE1Niw1OTE1Nyw1OTE1OCw1OTE1OSw1OTE2MCw1OTE2MSw1OTE2Miw1OTE2Myw1OTE2NCw1OTE2NSw1OTE2Niw1OTE2Nyw1OTE2OCw1OTE2OSw1OTE3MCw1OTE3MSw1OTE3Miw1OTE3Myw1OTE3NCw1OTE3NSw1OTE3Niw1OTE3Nyw1OTE3OCw1OTE3OSw1OTE4MCw1OTE4MSw1OTE4Miw1OTE4Myw1OTE4NCw1OTE4NSw1OTE4Niw1OTE4Nyw1OTE4OCw1OTE4OSw1OTE5MCw1OTE5MSw1OTE5Miw1OTE5Myw1OTE5NCw1OTE5NSw1OTE5Niw1OTE5Nyw1OTE5OCw1OTE5OSw1OTIwMCw1OTIwMSw1OTIwMiw1OTIwMyw1OTIwNCw1OTIwNSw1OTIwNiw1OTIwNyw1OTIwOCw1OTIwOSw1OTIxMCw1OTIxMSw1OTIxMiw1OTIxMyw1OTIxNCw1OTIxNSw1OTIxNiw1OTIxNyw1OTIxOCw1OTIxOSw1OTIyMCw1OTIyMSw1OTIyMiw1OTIyMyw1OTIyNCw1OTIyNSw1OTIyNiw1OTIyNyw1OTIyOCw1OTIyOSw1OTIzMCw1OTIzMSw1OTIzMiw1OTIzMyw1OTIzNCw1OTIzNSw1OTIzNiw1OTIzNywxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDI1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSw1OTI5Niw1OTI5Nyw1OTI5OCw1OTI5OSw1OTMwMCw1OTMwMSw1OTMwMiw1OTMwMyw1OTMwNCw1OTMwNSw1OTMwNiw1OTMwNyw1OTMwOCw1OTMwOSw1OTMxMCwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMTA1LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMyw1OTMxMSw1OTMxMiw1OTMxMyw1OTMxNCw1OTMxNSw1OTMxNiw1OTMxNyw1OTMxOCw1OTMxOSw1OTMyMCw1OTMyMSw1OTMyMiw1OTMyMyw3MTQsNzE1LDcyOSw4MjExLDgyMTMsODIyOSw4MjQ1LDg0NTMsODQ1Nyw4NTk4LDg1OTksODYwMCw4NjAxLDg3MjUsODczNSw4NzM5LDg3ODYsODgwNiw4ODA3LDg4OTUsOTU1Miw5NTUzLDk1NTQsOTU1NSw5NTU2LDk1NTcsOTU1OCw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsOTU2NCw5NTY1LDk1NjYsOTU2Nyw5NTY4LDk1NjksOTU3MCw5NTcxLDk1NzIsOTU3Myw5NTc0LDk1NzUsOTU3Niw5NTc3LDk1NzgsOTU3OSw5NTgwLDk1ODEsOTU4Miw5NTgzLDk1ODQsOTU4NSw5NTg2LDk1ODcsOTYwMSw5NjAyLDk2MDMsOTYwNCw5NjA1LDk2MDYsOTYwNyw5NjA4LDk2MDksOTYxMCw5NjExLDk2MTIsOTYxMyw5NjE0LDk2MTUsOTYxOSw5NjIwLDk2MjEsOTY2MCw5NjYxLDk2OTgsOTY5OSw5NzAwLDk3MDEsOTczNyw4ODUzLDEyMzA2LDEyMzE3LDEyMzE4LDU5MzI0LDU5MzI1LDU5MzI2LDU5MzI3LDU5MzI4LDU5MzI5LDU5MzMwLDU5MzMxLDU5MzMyLDU5MzMzLDU5MzM0LDI1NywyMjUsNDYyLDIyNCwyNzUsMjMzLDI4MywyMzIsMjk5LDIzNyw0NjQsMjM2LDMzMywyNDMsNDY2LDI0MiwzNjMsMjUwLDQ2OCwyNDksNDcwLDQ3Miw0NzQsNDc2LDI1MiwyMzQsNTkzLDc3NDMsMzI0LDMyOCw1MDUsNjA5LDU5MzM3LDU5MzM4LDU5MzM5LDU5MzQwLDEyNTQ5LDEyNTUwLDEyNTUxLDEyNTUyLDEyNTUzLDEyNTU0LDEyNTU1LDEyNTU2LDEyNTU3LDEyNTU4LDEyNTU5LDEyNTYwLDEyNTYxLDEyNTYyLDEyNTYzLDEyNTY0LDEyNTY1LDEyNTY2LDEyNTY3LDEyNTY4LDEyNTY5LDEyNTcwLDEyNTcxLDEyNTcyLDEyNTczLDEyNTc0LDEyNTc1LDEyNTc2LDEyNTc3LDEyNTc4LDEyNTc5LDEyNTgwLDEyNTgxLDEyNTgyLDEyNTgzLDEyNTg0LDEyNTg1LDU5MzQxLDU5MzQyLDU5MzQzLDU5MzQ0LDU5MzQ1LDU5MzQ2LDU5MzQ3LDU5MzQ4LDU5MzQ5LDU5MzUwLDU5MzUxLDU5MzUyLDU5MzUzLDU5MzU0LDU5MzU1LDU5MzU2LDU5MzU3LDU5MzU4LDU5MzU5LDU5MzYwLDU5MzYxLDEyMzIxLDEyMzIyLDEyMzIzLDEyMzI0LDEyMzI1LDEyMzI2LDEyMzI3LDEyMzI4LDEyMzI5LDEyOTYzLDEzMTk4LDEzMTk5LDEzMjEyLDEzMjEzLDEzMjE0LDEzMjE3LDEzMjUyLDEzMjYyLDEzMjY1LDEzMjY2LDEzMjY5LDY1MDcyLDY1NTA2LDY1NTA4LDU5MzYyLDg0ODEsMTI4NDksNTkzNjMsODIwOCw1OTM2NCw1OTM2NSw1OTM2NiwxMjU0MCwxMjQ0MywxMjQ0NCwxMjU0MSwxMjU0MiwxMjI5NCwxMjQ0NSwxMjQ0Niw2NTA5Nyw2NTA5OCw2NTA5OSw2NTEwMCw2NTEwMSw2NTEwMiw2NTEwMyw2NTEwNCw2NTEwNSw2NTEwNiw2NTEwOCw2NTEwOSw2NTExMCw2NTExMSw2NTExMyw2NTExNCw2NTExNSw2NTExNiw2NTExNyw2NTExOCw2NTExOSw2NTEyMCw2NTEyMSw2NTEyMiw2NTEyMyw2NTEyNCw2NTEyNSw2NTEyNiw2NTEyOCw2NTEyOSw2NTEzMCw2NTEzMSwxMjM1MCwxMjI3MiwxMjI3MywxMjI3NCwxMjI3NSwxMjI3NiwxMjI3NywxMjI3OCwxMjI3OSwxMjI4MCwxMjI4MSwxMjI4MiwxMjI4MywxMjI5NSw1OTM4MCw1OTM4MSw1OTM4Miw1OTM4Myw1OTM4NCw1OTM4NSw1OTM4Niw1OTM4Nyw1OTM4OCw1OTM4OSw1OTM5MCw1OTM5MSw1OTM5Miw5NDcyLDk0NzMsOTQ3NCw5NDc1LDk0NzYsOTQ3Nyw5NDc4LDk0NzksOTQ4MCw5NDgxLDk0ODIsOTQ4Myw5NDg0LDk0ODUsOTQ4Niw5NDg3LDk0ODgsOTQ4OSw5NDkwLDk0OTEsOTQ5Miw5NDkzLDk0OTQsOTQ5NSw5NDk2LDk0OTcsOTQ5OCw5NDk5LDk1MDAsOTUwMSw5NTAyLDk1MDMsOTUwNCw5NTA1LDk1MDYsOTUwNyw5NTA4LDk1MDksOTUxMCw5NTExLDk1MTIsOTUxMyw5NTE0LDk1MTUsOTUxNiw5NTE3LDk1MTgsOTUxOSw5NTIwLDk1MjEsOTUyMiw5NTIzLDk1MjQsOTUyNSw5NTI2LDk1MjcsOTUyOCw5NTI5LDk1MzAsOTUzMSw5NTMyLDk1MzMsOTUzNCw5NTM1LDk1MzYsOTUzNyw5NTM4LDk1MzksOTU0MCw5NTQxLDk1NDIsOTU0Myw5NTQ0LDk1NDUsOTU0Niw5NTQ3LDU5MzkzLDU5Mzk0LDU5Mzk1LDU5Mzk2LDU5Mzk3LDU5Mzk4LDU5Mzk5LDU5NDAwLDU5NDAxLDU5NDAyLDU5NDAzLDU5NDA0LDU5NDA1LDU5NDA2LDU5NDA3LDI5NDA0LDI5NDA1LDI5NDA3LDI5NDEwLDI5NDExLDI5NDEyLDI5NDEzLDI5NDE0LDI5NDE1LDI5NDE4LDI5NDE5LDI5NDI5LDI5NDMwLDI5NDMzLDI5NDM3LDI5NDM4LDI5NDM5LDI5NDQwLDI5NDQyLDI5NDQ0LDI5NDQ1LDI5NDQ2LDI5NDQ3LDI5NDQ4LDI5NDQ5LDI5NDUxLDI5NDUyLDI5NDUzLDI5NDU1LDI5NDU2LDI5NDU3LDI5NDU4LDI5NDYwLDI5NDY0LDI5NDY1LDI5NDY2LDI5NDcxLDI5NDcyLDI5NDc1LDI5NDc2LDI5NDc4LDI5NDc5LDI5NDgwLDI5NDg1LDI5NDg3LDI5NDg4LDI5NDkwLDI5NDkxLDI5NDkzLDI5NDk0LDI5NDk4LDI5NDk5LDI5NTAwLDI5NTAxLDI5NTA0LDI5NTA1LDI5NTA2LDI5NTA3LDI5NTA4LDI5NTA5LDI5NTEwLDI5NTExLDI5NTEyLDI5NTEzLDI5NTE0LDI5NTE1LDI5NTE2LDI5NTE4LDI5NTE5LDI5NTIxLDI5NTIzLDI5NTI0LDI5NTI1LDI5NTI2LDI5NTI4LDI5NTI5LDI5NTMwLDI5NTMxLDI5NTMyLDI5NTMzLDI5NTM0LDI5NTM1LDI5NTM3LDI5NTM4LDI5NTM5LDI5NTQwLDI5NTQxLDI5NTQyLDI5NTQzLDI5NTQ0LDI5NTQ1LDI5NTQ2LDI5NTQ3LDI5NTUwLDI5NTUyLDI5NTUzLDU3MzQ0LDU3MzQ1LDU3MzQ2LDU3MzQ3LDU3MzQ4LDU3MzQ5LDU3MzUwLDU3MzUxLDU3MzUyLDU3MzUzLDU3MzU0LDU3MzU1LDU3MzU2LDU3MzU3LDU3MzU4LDU3MzU5LDU3MzYwLDU3MzYxLDU3MzYyLDU3MzYzLDU3MzY0LDU3MzY1LDU3MzY2LDU3MzY3LDU3MzY4LDU3MzY5LDU3MzcwLDU3MzcxLDU3MzcyLDU3MzczLDU3Mzc0LDU3Mzc1LDU3Mzc2LDU3Mzc3LDU3Mzc4LDU3Mzc5LDU3MzgwLDU3MzgxLDU3MzgyLDU3MzgzLDU3Mzg0LDU3Mzg1LDU3Mzg2LDU3Mzg3LDU3Mzg4LDU3Mzg5LDU3MzkwLDU3MzkxLDU3MzkyLDU3MzkzLDU3Mzk0LDU3Mzk1LDU3Mzk2LDU3Mzk3LDU3Mzk4LDU3Mzk5LDU3NDAwLDU3NDAxLDU3NDAyLDU3NDAzLDU3NDA0LDU3NDA1LDU3NDA2LDU3NDA3LDU3NDA4LDU3NDA5LDU3NDEwLDU3NDExLDU3NDEyLDU3NDEzLDU3NDE0LDU3NDE1LDU3NDE2LDU3NDE3LDU3NDE4LDU3NDE5LDU3NDIwLDU3NDIxLDU3NDIyLDU3NDIzLDU3NDI0LDU3NDI1LDU3NDI2LDU3NDI3LDU3NDI4LDU3NDI5LDU3NDMwLDU3NDMxLDU3NDMyLDU3NDMzLDU3NDM0LDU3NDM1LDU3NDM2LDU3NDM3LDI5NTU0LDI5NTU1LDI5NTU2LDI5NTU3LDI5NTU4LDI5NTU5LDI5NTYwLDI5NTYxLDI5NTYyLDI5NTYzLDI5NTY0LDI5NTY1LDI5NTY3LDI5NTY4LDI5NTY5LDI5NTcwLDI5NTcxLDI5NTczLDI5NTc0LDI5NTc2LDI5NTc4LDI5NTgwLDI5NTgxLDI5NTgzLDI5NTg0LDI5NTg2LDI5NTg3LDI5NTg4LDI5NTg5LDI5NTkxLDI5NTkyLDI5NTkzLDI5NTk0LDI5NTk2LDI5NTk3LDI5NTk4LDI5NjAwLDI5NjAxLDI5NjAzLDI5NjA0LDI5NjA1LDI5NjA2LDI5NjA3LDI5NjA4LDI5NjEwLDI5NjEyLDI5NjEzLDI5NjE3LDI5NjIwLDI5NjIxLDI5NjIyLDI5NjI0LDI5NjI1LDI5NjI4LDI5NjI5LDI5NjMwLDI5NjMxLDI5NjMzLDI5NjM1LDI5NjM2LDI5NjM3LDI5NjM4LDI5NjM5LDI5NjQzLDI5NjQ0LDI5NjQ2LDI5NjUwLDI5NjUxLDI5NjUyLDI5NjUzLDI5NjU0LDI5NjU1LDI5NjU2LDI5NjU4LDI5NjU5LDI5NjYwLDI5NjYxLDI5NjYzLDI5NjY1LDI5NjY2LDI5NjY3LDI5NjY4LDI5NjcwLDI5NjcyLDI5Njc0LDI5Njc1LDI5Njc2LDI5Njc4LDI5Njc5LDI5NjgwLDI5NjgxLDI5NjgzLDI5Njg0LDI5Njg1LDI5Njg2LDI5Njg3LDU3NDM4LDU3NDM5LDU3NDQwLDU3NDQxLDU3NDQyLDU3NDQzLDU3NDQ0LDU3NDQ1LDU3NDQ2LDU3NDQ3LDU3NDQ4LDU3NDQ5LDU3NDUwLDU3NDUxLDU3NDUyLDU3NDUzLDU3NDU0LDU3NDU1LDU3NDU2LDU3NDU3LDU3NDU4LDU3NDU5LDU3NDYwLDU3NDYxLDU3NDYyLDU3NDYzLDU3NDY0LDU3NDY1LDU3NDY2LDU3NDY3LDU3NDY4LDU3NDY5LDU3NDcwLDU3NDcxLDU3NDcyLDU3NDczLDU3NDc0LDU3NDc1LDU3NDc2LDU3NDc3LDU3NDc4LDU3NDc5LDU3NDgwLDU3NDgxLDU3NDgyLDU3NDgzLDU3NDg0LDU3NDg1LDU3NDg2LDU3NDg3LDU3NDg4LDU3NDg5LDU3NDkwLDU3NDkxLDU3NDkyLDU3NDkzLDU3NDk0LDU3NDk1LDU3NDk2LDU3NDk3LDU3NDk4LDU3NDk5LDU3NTAwLDU3NTAxLDU3NTAyLDU3NTAzLDU3NTA0LDU3NTA1LDU3NTA2LDU3NTA3LDU3NTA4LDU3NTA5LDU3NTEwLDU3NTExLDU3NTEyLDU3NTEzLDU3NTE0LDU3NTE1LDU3NTE2LDU3NTE3LDU3NTE4LDU3NTE5LDU3NTIwLDU3NTIxLDU3NTIyLDU3NTIzLDU3NTI0LDU3NTI1LDU3NTI2LDU3NTI3LDU3NTI4LDU3NTI5LDU3NTMwLDU3NTMxLDI5Njg4LDI5Njg5LDI5NjkwLDI5NjkxLDI5NjkyLDI5NjkzLDI5Njk0LDI5Njk1LDI5Njk2LDI5Njk3LDI5Njk4LDI5NzAwLDI5NzAzLDI5NzA0LDI5NzA3LDI5NzA4LDI5NzA5LDI5NzEwLDI5NzEzLDI5NzE0LDI5NzE1LDI5NzE2LDI5NzE3LDI5NzE4LDI5NzE5LDI5NzIwLDI5NzIxLDI5NzI0LDI5NzI1LDI5NzI2LDI5NzI3LDI5NzI4LDI5NzI5LDI5NzMxLDI5NzMyLDI5NzM1LDI5NzM3LDI5NzM5LDI5NzQxLDI5NzQzLDI5NzQ1LDI5NzQ2LDI5NzUxLDI5NzUyLDI5NzUzLDI5NzU0LDI5NzU1LDI5NzU3LDI5NzU4LDI5NzU5LDI5NzYwLDI5NzYyLDI5NzYzLDI5NzY0LDI5NzY1LDI5NzY2LDI5NzY3LDI5NzY4LDI5NzY5LDI5NzcwLDI5NzcxLDI5NzcyLDI5NzczLDI5Nzc0LDI5Nzc1LDI5Nzc2LDI5Nzc3LDI5Nzc4LDI5Nzc5LDI5NzgwLDI5NzgyLDI5Nzg0LDI5Nzg5LDI5NzkyLDI5NzkzLDI5Nzk0LDI5Nzk1LDI5Nzk2LDI5Nzk3LDI5Nzk4LDI5Nzk5LDI5ODAwLDI5ODAxLDI5ODAyLDI5ODAzLDI5ODA0LDI5ODA2LDI5ODA3LDI5ODA5LDI5ODEwLDI5ODExLDI5ODEyLDI5ODEzLDI5ODE2LDI5ODE3LDI5ODE4LDU3NTMyLDU3NTMzLDU3NTM0LDU3NTM1LDU3NTM2LDU3NTM3LDU3NTM4LDU3NTM5LDU3NTQwLDU3NTQxLDU3NTQyLDU3NTQzLDU3NTQ0LDU3NTQ1LDU3NTQ2LDU3NTQ3LDU3NTQ4LDU3NTQ5LDU3NTUwLDU3NTUxLDU3NTUyLDU3NTUzLDU3NTU0LDU3NTU1LDU3NTU2LDU3NTU3LDU3NTU4LDU3NTU5LDU3NTYwLDU3NTYxLDU3NTYyLDU3NTYzLDU3NTY0LDU3NTY1LDU3NTY2LDU3NTY3LDU3NTY4LDU3NTY5LDU3NTcwLDU3NTcxLDU3NTcyLDU3NTczLDU3NTc0LDU3NTc1LDU3NTc2LDU3NTc3LDU3NTc4LDU3NTc5LDU3NTgwLDU3NTgxLDU3NTgyLDU3NTgzLDU3NTg0LDU3NTg1LDU3NTg2LDU3NTg3LDU3NTg4LDU3NTg5LDU3NTkwLDU3NTkxLDU3NTkyLDU3NTkzLDU3NTk0LDU3NTk1LDU3NTk2LDU3NTk3LDU3NTk4LDU3NTk5LDU3NjAwLDU3NjAxLDU3NjAyLDU3NjAzLDU3NjA0LDU3NjA1LDU3NjA2LDU3NjA3LDU3NjA4LDU3NjA5LDU3NjEwLDU3NjExLDU3NjEyLDU3NjEzLDU3NjE0LDU3NjE1LDU3NjE2LDU3NjE3LDU3NjE4LDU3NjE5LDU3NjIwLDU3NjIxLDU3NjIyLDU3NjIzLDU3NjI0LDU3NjI1LDI5ODE5LDI5ODIwLDI5ODIxLDI5ODIzLDI5ODI2LDI5ODI4LDI5ODI5LDI5ODMwLDI5ODMyLDI5ODMzLDI5ODM0LDI5ODM2LDI5ODM3LDI5ODM5LDI5ODQxLDI5ODQyLDI5ODQzLDI5ODQ0LDI5ODQ1LDI5ODQ2LDI5ODQ3LDI5ODQ4LDI5ODQ5LDI5ODUwLDI5ODUxLDI5ODUzLDI5ODU1LDI5ODU2LDI5ODU3LDI5ODU4LDI5ODU5LDI5ODYwLDI5ODYxLDI5ODYyLDI5ODY2LDI5ODY3LDI5ODY4LDI5ODY5LDI5ODcwLDI5ODcxLDI5ODcyLDI5ODczLDI5ODc0LDI5ODc1LDI5ODc2LDI5ODc3LDI5ODc4LDI5ODc5LDI5ODgwLDI5ODgxLDI5ODgzLDI5ODg0LDI5ODg1LDI5ODg2LDI5ODg3LDI5ODg4LDI5ODg5LDI5ODkwLDI5ODkxLDI5ODkyLDI5ODkzLDI5ODk0LDI5ODk1LDI5ODk2LDI5ODk3LDI5ODk4LDI5ODk5LDI5OTAwLDI5OTAxLDI5OTAyLDI5OTAzLDI5OTA0LDI5OTA1LDI5OTA3LDI5OTA4LDI5OTA5LDI5OTEwLDI5OTExLDI5OTEyLDI5OTEzLDI5OTE0LDI5OTE1LDI5OTE3LDI5OTE5LDI5OTIxLDI5OTI1LDI5OTI3LDI5OTI4LDI5OTI5LDI5OTMwLDI5OTMxLDI5OTMyLDI5OTMzLDI5OTM2LDI5OTM3LDI5OTM4LDU3NjI2LDU3NjI3LDU3NjI4LDU3NjI5LDU3NjMwLDU3NjMxLDU3NjMyLDU3NjMzLDU3NjM0LDU3NjM1LDU3NjM2LDU3NjM3LDU3NjM4LDU3NjM5LDU3NjQwLDU3NjQxLDU3NjQyLDU3NjQzLDU3NjQ0LDU3NjQ1LDU3NjQ2LDU3NjQ3LDU3NjQ4LDU3NjQ5LDU3NjUwLDU3NjUxLDU3NjUyLDU3NjUzLDU3NjU0LDU3NjU1LDU3NjU2LDU3NjU3LDU3NjU4LDU3NjU5LDU3NjYwLDU3NjYxLDU3NjYyLDU3NjYzLDU3NjY0LDU3NjY1LDU3NjY2LDU3NjY3LDU3NjY4LDU3NjY5LDU3NjcwLDU3NjcxLDU3NjcyLDU3NjczLDU3Njc0LDU3Njc1LDU3Njc2LDU3Njc3LDU3Njc4LDU3Njc5LDU3NjgwLDU3NjgxLDU3NjgyLDU3NjgzLDU3Njg0LDU3Njg1LDU3Njg2LDU3Njg3LDU3Njg4LDU3Njg5LDU3NjkwLDU3NjkxLDU3NjkyLDU3NjkzLDU3Njk0LDU3Njk1LDU3Njk2LDU3Njk3LDU3Njk4LDU3Njk5LDU3NzAwLDU3NzAxLDU3NzAyLDU3NzAzLDU3NzA0LDU3NzA1LDU3NzA2LDU3NzA3LDU3NzA4LDU3NzA5LDU3NzEwLDU3NzExLDU3NzEyLDU3NzEzLDU3NzE0LDU3NzE1LDU3NzE2LDU3NzE3LDU3NzE4LDU3NzE5LDI5OTM5LDI5OTQxLDI5OTQ0LDI5OTQ1LDI5OTQ2LDI5OTQ3LDI5OTQ4LDI5OTQ5LDI5OTUwLDI5OTUyLDI5OTUzLDI5OTU0LDI5OTU1LDI5OTU3LDI5OTU4LDI5OTU5LDI5OTYwLDI5OTYxLDI5OTYyLDI5OTYzLDI5OTY0LDI5OTY2LDI5OTY4LDI5OTcwLDI5OTcyLDI5OTczLDI5OTc0LDI5OTc1LDI5OTc5LDI5OTgxLDI5OTgyLDI5OTg0LDI5OTg1LDI5OTg2LDI5OTg3LDI5OTg4LDI5OTkwLDI5OTkxLDI5OTk0LDI5OTk4LDMwMDA0LDMwMDA2LDMwMDA5LDMwMDEyLDMwMDEzLDMwMDE1LDMwMDE3LDMwMDE4LDMwMDE5LDMwMDIwLDMwMDIyLDMwMDIzLDMwMDI1LDMwMDI2LDMwMDI5LDMwMDMyLDMwMDMzLDMwMDM0LDMwMDM1LDMwMDM3LDMwMDM4LDMwMDM5LDMwMDQwLDMwMDQ1LDMwMDQ2LDMwMDQ3LDMwMDQ4LDMwMDQ5LDMwMDUwLDMwMDUxLDMwMDUyLDMwMDU1LDMwMDU2LDMwMDU3LDMwMDU5LDMwMDYwLDMwMDYxLDMwMDYyLDMwMDYzLDMwMDY0LDMwMDY1LDMwMDY3LDMwMDY5LDMwMDcwLDMwMDcxLDMwMDc0LDMwMDc1LDMwMDc2LDMwMDc3LDMwMDc4LDMwMDgwLDMwMDgxLDMwMDgyLDMwMDg0LDMwMDg1LDMwMDg3LDU3NzIwLDU3NzIxLDU3NzIyLDU3NzIzLDU3NzI0LDU3NzI1LDU3NzI2LDU3NzI3LDU3NzI4LDU3NzI5LDU3NzMwLDU3NzMxLDU3NzMyLDU3NzMzLDU3NzM0LDU3NzM1LDU3NzM2LDU3NzM3LDU3NzM4LDU3NzM5LDU3NzQwLDU3NzQxLDU3NzQyLDU3NzQzLDU3NzQ0LDU3NzQ1LDU3NzQ2LDU3NzQ3LDU3NzQ4LDU3NzQ5LDU3NzUwLDU3NzUxLDU3NzUyLDU3NzUzLDU3NzU0LDU3NzU1LDU3NzU2LDU3NzU3LDU3NzU4LDU3NzU5LDU3NzYwLDU3NzYxLDU3NzYyLDU3NzYzLDU3NzY0LDU3NzY1LDU3NzY2LDU3NzY3LDU3NzY4LDU3NzY5LDU3NzcwLDU3NzcxLDU3NzcyLDU3NzczLDU3Nzc0LDU3Nzc1LDU3Nzc2LDU3Nzc3LDU3Nzc4LDU3Nzc5LDU3NzgwLDU3NzgxLDU3NzgyLDU3NzgzLDU3Nzg0LDU3Nzg1LDU3Nzg2LDU3Nzg3LDU3Nzg4LDU3Nzg5LDU3NzkwLDU3NzkxLDU3NzkyLDU3NzkzLDU3Nzk0LDU3Nzk1LDU3Nzk2LDU3Nzk3LDU3Nzk4LDU3Nzk5LDU3ODAwLDU3ODAxLDU3ODAyLDU3ODAzLDU3ODA0LDU3ODA1LDU3ODA2LDU3ODA3LDU3ODA4LDU3ODA5LDU3ODEwLDU3ODExLDU3ODEyLDU3ODEzLDMwMDg4LDMwMDg5LDMwMDkwLDMwMDkyLDMwMDkzLDMwMDk0LDMwMDk2LDMwMDk5LDMwMTAxLDMwMTA0LDMwMTA3LDMwMTA4LDMwMTEwLDMwMTE0LDMwMTE4LDMwMTE5LDMwMTIwLDMwMTIxLDMwMTIyLDMwMTI1LDMwMTM0LDMwMTM1LDMwMTM4LDMwMTM5LDMwMTQzLDMwMTQ0LDMwMTQ1LDMwMTUwLDMwMTU1LDMwMTU2LDMwMTU4LDMwMTU5LDMwMTYwLDMwMTYxLDMwMTYzLDMwMTY3LDMwMTY5LDMwMTcwLDMwMTcyLDMwMTczLDMwMTc1LDMwMTc2LDMwMTc3LDMwMTgxLDMwMTg1LDMwMTg4LDMwMTg5LDMwMTkwLDMwMTkxLDMwMTk0LDMwMTk1LDMwMTk3LDMwMTk4LDMwMTk5LDMwMjAwLDMwMjAyLDMwMjAzLDMwMjA1LDMwMjA2LDMwMjEwLDMwMjEyLDMwMjE0LDMwMjE1LDMwMjE2LDMwMjE3LDMwMjE5LDMwMjIxLDMwMjIyLDMwMjIzLDMwMjI1LDMwMjI2LDMwMjI3LDMwMjI4LDMwMjMwLDMwMjM0LDMwMjM2LDMwMjM3LDMwMjM4LDMwMjQxLDMwMjQzLDMwMjQ3LDMwMjQ4LDMwMjUyLDMwMjU0LDMwMjU1LDMwMjU3LDMwMjU4LDMwMjYyLDMwMjYzLDMwMjY1LDMwMjY2LDMwMjY3LDMwMjY5LDMwMjczLDMwMjc0LDMwMjc2LDU3ODE0LDU3ODE1LDU3ODE2LDU3ODE3LDU3ODE4LDU3ODE5LDU3ODIwLDU3ODIxLDU3ODIyLDU3ODIzLDU3ODI0LDU3ODI1LDU3ODI2LDU3ODI3LDU3ODI4LDU3ODI5LDU3ODMwLDU3ODMxLDU3ODMyLDU3ODMzLDU3ODM0LDU3ODM1LDU3ODM2LDU3ODM3LDU3ODM4LDU3ODM5LDU3ODQwLDU3ODQxLDU3ODQyLDU3ODQzLDU3ODQ0LDU3ODQ1LDU3ODQ2LDU3ODQ3LDU3ODQ4LDU3ODQ5LDU3ODUwLDU3ODUxLDU3ODUyLDU3ODUzLDU3ODU0LDU3ODU1LDU3ODU2LDU3ODU3LDU3ODU4LDU3ODU5LDU3ODYwLDU3ODYxLDU3ODYyLDU3ODYzLDU3ODY0LDU3ODY1LDU3ODY2LDU3ODY3LDU3ODY4LDU3ODY5LDU3ODcwLDU3ODcxLDU3ODcyLDU3ODczLDU3ODc0LDU3ODc1LDU3ODc2LDU3ODc3LDU3ODc4LDU3ODc5LDU3ODgwLDU3ODgxLDU3ODgyLDU3ODgzLDU3ODg0LDU3ODg1LDU3ODg2LDU3ODg3LDU3ODg4LDU3ODg5LDU3ODkwLDU3ODkxLDU3ODkyLDU3ODkzLDU3ODk0LDU3ODk1LDU3ODk2LDU3ODk3LDU3ODk4LDU3ODk5LDU3OTAwLDU3OTAxLDU3OTAyLDU3OTAzLDU3OTA0LDU3OTA1LDU3OTA2LDU3OTA3LDMwMjc3LDMwMjc4LDMwMjc5LDMwMjgwLDMwMjgxLDMwMjgyLDMwMjgzLDMwMjg2LDMwMjg3LDMwMjg4LDMwMjg5LDMwMjkwLDMwMjkxLDMwMjkzLDMwMjk1LDMwMjk2LDMwMjk3LDMwMjk4LDMwMjk5LDMwMzAxLDMwMzAzLDMwMzA0LDMwMzA1LDMwMzA2LDMwMzA4LDMwMzA5LDMwMzEwLDMwMzExLDMwMzEyLDMwMzEzLDMwMzE0LDMwMzE2LDMwMzE3LDMwMzE4LDMwMzIwLDMwMzIxLDMwMzIyLDMwMzIzLDMwMzI0LDMwMzI1LDMwMzI2LDMwMzI3LDMwMzI5LDMwMzMwLDMwMzMyLDMwMzM1LDMwMzM2LDMwMzM3LDMwMzM5LDMwMzQxLDMwMzQ1LDMwMzQ2LDMwMzQ4LDMwMzQ5LDMwMzUxLDMwMzUyLDMwMzU0LDMwMzU2LDMwMzU3LDMwMzU5LDMwMzYwLDMwMzYyLDMwMzYzLDMwMzY0LDMwMzY1LDMwMzY2LDMwMzY3LDMwMzY4LDMwMzY5LDMwMzcwLDMwMzcxLDMwMzczLDMwMzc0LDMwMzc1LDMwMzc2LDMwMzc3LDMwMzc4LDMwMzc5LDMwMzgwLDMwMzgxLDMwMzgzLDMwMzg0LDMwMzg3LDMwMzg5LDMwMzkwLDMwMzkxLDMwMzkyLDMwMzkzLDMwMzk0LDMwMzk1LDMwMzk2LDMwMzk3LDMwMzk4LDMwNDAwLDMwNDAxLDMwNDAzLDIxODM0LDM4NDYzLDIyNDY3LDI1Mzg0LDIxNzEwLDIxNzY5LDIxNjk2LDMwMzUzLDMwMjg0LDM0MTA4LDMwNzAyLDMzNDA2LDMwODYxLDI5MjMzLDM4NTUyLDM4Nzk3LDI3Njg4LDIzNDMzLDIwNDc0LDI1MzUzLDI2MjYzLDIzNzM2LDMzMDE4LDI2Njk2LDMyOTQyLDI2MTE0LDMwNDE0LDIwOTg1LDI1OTQyLDI5MTAwLDMyNzUzLDM0OTQ4LDIwNjU4LDIyODg1LDI1MDM0LDI4NTk1LDMzNDUzLDI1NDIwLDI1MTcwLDIxNDg1LDIxNTQzLDMxNDk0LDIwODQzLDMwMTE2LDI0MDUyLDI1MzAwLDM2Mjk5LDM4Nzc0LDI1MjI2LDMyNzkzLDIyMzY1LDM4NzEyLDMyNjEwLDI5MjQwLDMwMzMzLDI2NTc1LDMwMzM0LDI1NjcwLDIwMzM2LDM2MTMzLDI1MzA4LDMxMjU1LDI2MDAxLDI5Njc3LDI1NjQ0LDI1MjAzLDMzMzI0LDM5MDQxLDI2NDk1LDI5MjU2LDI1MTk4LDI1MjkyLDIwMjc2LDI5OTIzLDIxMzIyLDIxMTUwLDMyNDU4LDM3MDMwLDI0MTEwLDI2NzU4LDI3MDM2LDMzMTUyLDMyNDY1LDI2ODM0LDMwOTE3LDM0NDQ0LDM4MjI1LDIwNjIxLDM1ODc2LDMzNTAyLDMyOTkwLDIxMjUzLDM1MDkwLDIxMDkzLDMwNDA0LDMwNDA3LDMwNDA5LDMwNDExLDMwNDEyLDMwNDE5LDMwNDIxLDMwNDI1LDMwNDI2LDMwNDI4LDMwNDI5LDMwNDMwLDMwNDMyLDMwNDMzLDMwNDM0LDMwNDM1LDMwNDM2LDMwNDM4LDMwNDM5LDMwNDQwLDMwNDQxLDMwNDQyLDMwNDQzLDMwNDQ0LDMwNDQ1LDMwNDQ4LDMwNDUxLDMwNDUzLDMwNDU0LDMwNDU1LDMwNDU4LDMwNDU5LDMwNDYxLDMwNDYzLDMwNDY0LDMwNDY2LDMwNDY3LDMwNDY5LDMwNDcwLDMwNDc0LDMwNDc2LDMwNDc4LDMwNDc5LDMwNDgwLDMwNDgxLDMwNDgyLDMwNDgzLDMwNDg0LDMwNDg1LDMwNDg2LDMwNDg3LDMwNDg4LDMwNDkxLDMwNDkyLDMwNDkzLDMwNDk0LDMwNDk3LDMwNDk5LDMwNTAwLDMwNTAxLDMwNTAzLDMwNTA2LDMwNTA3LDMwNTA4LDMwNTEwLDMwNTEyLDMwNTEzLDMwNTE0LDMwNTE1LDMwNTE2LDMwNTIxLDMwNTIzLDMwNTI1LDMwNTI2LDMwNTI3LDMwNTMwLDMwNTMyLDMwNTMzLDMwNTM0LDMwNTM2LDMwNTM3LDMwNTM4LDMwNTM5LDMwNTQwLDMwNTQxLDMwNTQyLDMwNTQzLDMwNTQ2LDMwNTQ3LDMwNTQ4LDMwNTQ5LDMwNTUwLDMwNTUxLDMwNTUyLDMwNTUzLDMwNTU2LDM0MTgwLDM4NjQ5LDIwNDQ1LDIyNTYxLDM5MjgxLDIzNDUzLDI1MjY1LDI1MjUzLDI2MjkyLDM1OTYxLDQwMDc3LDI5MTkwLDI2NDc5LDMwODY1LDI0NzU0LDIxMzI5LDIxMjcxLDM2NzQ0LDMyOTcyLDM2MTI1LDM4MDQ5LDIwNDkzLDI5Mzg0LDIyNzkxLDI0ODExLDI4OTUzLDM0OTg3LDIyODY4LDMzNTE5LDI2NDEyLDMxNTI4LDIzODQ5LDMyNTAzLDI5OTk3LDI3ODkzLDM2NDU0LDM2ODU2LDM2OTI0LDQwNzYzLDI3NjA0LDM3MTQ1LDMxNTA4LDI0NDQ0LDMwODg3LDM0MDA2LDM0MTA5LDI3NjA1LDI3NjA5LDI3NjA2LDI0MDY1LDI0MTk5LDMwMjAxLDM4MzgxLDI1OTQ5LDI0MzMwLDI0NTE3LDM2NzY3LDIyNzIxLDMzMjE4LDM2OTkxLDM4NDkxLDM4ODI5LDM2NzkzLDMyNTM0LDM2MTQwLDI1MTUzLDIwNDE1LDIxNDY0LDIxMzQyLDM2Nzc2LDM2Nzc3LDM2Nzc5LDM2OTQxLDI2NjMxLDI0NDI2LDMzMTc2LDM0OTIwLDQwMTUwLDI0OTcxLDIxMDM1LDMwMjUwLDI0NDI4LDI1OTk2LDI4NjI2LDI4MzkyLDIzNDg2LDI1NjcyLDIwODUzLDIwOTEyLDI2NTY0LDE5OTkzLDMxMTc3LDM5MjkyLDI4ODUxLDMwNTU3LDMwNTU4LDMwNTU5LDMwNTYwLDMwNTY0LDMwNTY3LDMwNTY5LDMwNTcwLDMwNTczLDMwNTc0LDMwNTc1LDMwNTc2LDMwNTc3LDMwNTc4LDMwNTc5LDMwNTgwLDMwNTgxLDMwNTgyLDMwNTgzLDMwNTg0LDMwNTg2LDMwNTg3LDMwNTg4LDMwNTkzLDMwNTk0LDMwNTk1LDMwNTk4LDMwNTk5LDMwNjAwLDMwNjAxLDMwNjAyLDMwNjAzLDMwNjA3LDMwNjA4LDMwNjExLDMwNjEyLDMwNjEzLDMwNjE0LDMwNjE1LDMwNjE2LDMwNjE3LDMwNjE4LDMwNjE5LDMwNjIwLDMwNjIxLDMwNjIyLDMwNjI1LDMwNjI3LDMwNjI4LDMwNjMwLDMwNjMyLDMwNjM1LDMwNjM3LDMwNjM4LDMwNjM5LDMwNjQxLDMwNjQyLDMwNjQ0LDMwNjQ2LDMwNjQ3LDMwNjQ4LDMwNjQ5LDMwNjUwLDMwNjUyLDMwNjU0LDMwNjU2LDMwNjU3LDMwNjU4LDMwNjU5LDMwNjYwLDMwNjYxLDMwNjYyLDMwNjYzLDMwNjY0LDMwNjY1LDMwNjY2LDMwNjY3LDMwNjY4LDMwNjcwLDMwNjcxLDMwNjcyLDMwNjczLDMwNjc0LDMwNjc1LDMwNjc2LDMwNjc3LDMwNjc4LDMwNjgwLDMwNjgxLDMwNjgyLDMwNjg1LDMwNjg2LDMwNjg3LDMwNjg4LDMwNjg5LDMwNjkyLDMwMTQ5LDI0MTgyLDI5NjI3LDMzNzYwLDI1NzczLDI1MzIwLDM4MDY5LDI3ODc0LDIxMzM4LDIxMTg3LDI1NjE1LDM4MDgyLDMxNjM2LDIwMjcxLDI0MDkxLDMzMzM0LDMzMDQ2LDMzMTYyLDI4MTk2LDI3ODUwLDM5NTM5LDI1NDI5LDIxMzQwLDIxNzU0LDM0OTE3LDIyNDk2LDE5OTgxLDI0MDY3LDI3NDkzLDMxODA3LDM3MDk2LDI0NTk4LDI1ODMwLDI5NDY4LDM1MDA5LDI2NDQ4LDI1MTY1LDM2MTMwLDMwNTcyLDM2MzkzLDM3MzE5LDI0NDI1LDMzNzU2LDM0MDgxLDM5MTg0LDIxNDQyLDM0NDUzLDI3NTMxLDI0ODEzLDI0ODA4LDI4Nzk5LDMzNDg1LDMzMzI5LDIwMTc5LDI3ODE1LDM0MjU1LDI1ODA1LDMxOTYxLDI3MTMzLDI2MzYxLDMzNjA5LDIxMzk3LDMxNTc0LDIwMzkxLDIwODc2LDI3OTc5LDIzNjE4LDM2NDYxLDI1NTU0LDIxNDQ5LDMzNTgwLDMzNTkwLDI2NTk3LDMwOTAwLDI1NjYxLDIzNTE5LDIzNzAwLDI0MDQ2LDM1ODE1LDI1Mjg2LDI2NjEyLDM1OTYyLDI1NjAwLDI1NTMwLDM0NjMzLDM5MzA3LDM1ODYzLDMyNTQ0LDM4MTMwLDIwMTM1LDM4NDE2LDM5MDc2LDI2MTI0LDI5NDYyLDMwNjk0LDMwNjk2LDMwNjk4LDMwNzAzLDMwNzA0LDMwNzA1LDMwNzA2LDMwNzA4LDMwNzA5LDMwNzExLDMwNzEzLDMwNzE0LDMwNzE1LDMwNzE2LDMwNzIzLDMwNzI0LDMwNzI1LDMwNzI2LDMwNzI3LDMwNzI4LDMwNzMwLDMwNzMxLDMwNzM0LDMwNzM1LDMwNzM2LDMwNzM5LDMwNzQxLDMwNzQ1LDMwNzQ3LDMwNzUwLDMwNzUyLDMwNzUzLDMwNzU0LDMwNzU2LDMwNzYwLDMwNzYyLDMwNzYzLDMwNzY2LDMwNzY3LDMwNzY5LDMwNzcwLDMwNzcxLDMwNzczLDMwNzc0LDMwNzgxLDMwNzgzLDMwNzg1LDMwNzg2LDMwNzg3LDMwNzg4LDMwNzkwLDMwNzkyLDMwNzkzLDMwNzk0LDMwNzk1LDMwNzk3LDMwNzk5LDMwODAxLDMwODAzLDMwODA0LDMwODA4LDMwODA5LDMwODEwLDMwODExLDMwODEyLDMwODE0LDMwODE1LDMwODE2LDMwODE3LDMwODE4LDMwODE5LDMwODIwLDMwODIxLDMwODIyLDMwODIzLDMwODI0LDMwODI1LDMwODMxLDMwODMyLDMwODMzLDMwODM0LDMwODM1LDMwODM2LDMwODM3LDMwODM4LDMwODQwLDMwODQxLDMwODQyLDMwODQzLDMwODQ1LDMwODQ2LDMwODQ3LDMwODQ4LDMwODQ5LDMwODUwLDMwODUxLDIyMzMwLDIzNTgxLDI0MTIwLDM4MjcxLDIwNjA3LDMyOTI4LDIxMzc4LDI1OTUwLDMwMDIxLDIxODA5LDIwNTEzLDM2MjI5LDI1MjIwLDM4MDQ2LDI2Mzk3LDIyMDY2LDI4NTI2LDI0MDM0LDIxNTU3LDI4ODE4LDM2NzEwLDI1MTk5LDI1NzY0LDI1NTA3LDI0NDQzLDI4NTUyLDM3MTA4LDMzMjUxLDM2Nzg0LDIzNTc2LDI2MjE2LDI0NTYxLDI3Nzg1LDM4NDcyLDM2MjI1LDM0OTI0LDI1NzQ1LDMxMjE2LDIyNDc4LDI3MjI1LDI1MTA0LDIxNTc2LDIwMDU2LDMxMjQzLDI0ODA5LDI4NTQ4LDM1ODAyLDI1MjE1LDM2ODk0LDM5NTYzLDMxMjA0LDIxNTA3LDMwMTk2LDI1MzQ1LDIxMjczLDI3NzQ0LDM2ODMxLDI0MzQ3LDM5NTM2LDMyODI3LDQwODMxLDIwMzYwLDIzNjEwLDM2MTk2LDMyNzA5LDI2MDIxLDI4ODYxLDIwODA1LDIwOTE0LDM0NDExLDIzODE1LDIzNDU2LDI1Mjc3LDM3MjI4LDMwMDY4LDM2MzY0LDMxMjY0LDI0ODMzLDMxNjA5LDIwMTY3LDMyNTA0LDMwNTk3LDE5OTg1LDMzMjYxLDIxMDIxLDIwOTg2LDI3MjQ5LDIxNDE2LDM2NDg3LDM4MTQ4LDM4NjA3LDI4MzUzLDM4NTAwLDI2OTcwLDMwODUyLDMwODUzLDMwODU0LDMwODU2LDMwODU4LDMwODU5LDMwODYzLDMwODY0LDMwODY2LDMwODY4LDMwODY5LDMwODcwLDMwODczLDMwODc3LDMwODc4LDMwODgwLDMwODgyLDMwODg0LDMwODg2LDMwODg4LDMwODg5LDMwODkwLDMwODkxLDMwODkyLDMwODkzLDMwODk0LDMwODk1LDMwOTAxLDMwOTAyLDMwOTAzLDMwOTA0LDMwOTA2LDMwOTA3LDMwOTA4LDMwOTA5LDMwOTExLDMwOTEyLDMwOTE0LDMwOTE1LDMwOTE2LDMwOTE4LDMwOTE5LDMwOTIwLDMwOTI0LDMwOTI1LDMwOTI2LDMwOTI3LDMwOTI5LDMwOTMwLDMwOTMxLDMwOTM0LDMwOTM1LDMwOTM2LDMwOTM4LDMwOTM5LDMwOTQwLDMwOTQxLDMwOTQyLDMwOTQzLDMwOTQ0LDMwOTQ1LDMwOTQ2LDMwOTQ3LDMwOTQ4LDMwOTQ5LDMwOTUwLDMwOTUxLDMwOTUzLDMwOTU0LDMwOTU1LDMwOTU3LDMwOTU4LDMwOTU5LDMwOTYwLDMwOTYxLDMwOTYzLDMwOTY1LDMwOTY2LDMwOTY4LDMwOTY5LDMwOTcxLDMwOTcyLDMwOTczLDMwOTc0LDMwOTc1LDMwOTc2LDMwOTc4LDMwOTc5LDMwOTgwLDMwOTgyLDMwOTgzLDMwOTg0LDMwOTg1LDMwOTg2LDMwOTg3LDMwOTg4LDMwNzg0LDIwNjQ4LDMwNjc5LDI1NjE2LDM1MzAyLDIyNzg4LDI1NTcxLDI0MDI5LDMxMzU5LDI2OTQxLDIwMjU2LDMzMzM3LDIxOTEyLDIwMDE4LDMwMTI2LDMxMzgzLDI0MTYyLDI0MjAyLDM4MzgzLDIxMDE5LDIxNTYxLDI4ODEwLDI1NDYyLDM4MTgwLDIyNDAyLDI2MTQ5LDI2OTQzLDM3MjU1LDIxNzY3LDI4MTQ3LDMyNDMxLDM0ODUwLDI1MTM5LDMyNDk2LDMwMTMzLDMzNTc2LDMwOTEzLDM4NjA0LDM2NzY2LDI0OTA0LDI5OTQzLDM1Nzg5LDI3NDkyLDIxMDUwLDM2MTc2LDI3NDI1LDMyODc0LDMzOTA1LDIyMjU3LDIxMjU0LDIwMTc0LDE5OTk1LDIwOTQ1LDMxODk1LDM3MjU5LDMxNzUxLDIwNDE5LDM2NDc5LDMxNzEzLDMxMzg4LDI1NzAzLDIzODI4LDIwNjUyLDMzMDMwLDMwMjA5LDMxOTI5LDI4MTQwLDMyNzM2LDI2NDQ5LDIzMzg0LDIzNTQ0LDMwOTIzLDI1Nzc0LDI1NjE5LDI1NTE0LDI1Mzg3LDM4MTY5LDI1NjQ1LDM2Nzk4LDMxNTcyLDMwMjQ5LDI1MTcxLDIyODIzLDIxNTc0LDI3NTEzLDIwNjQzLDI1MTQwLDI0MTAyLDI3NTI2LDIwMTk1LDM2MTUxLDM0OTU1LDI0NDUzLDM2OTEwLDMwOTg5LDMwOTkwLDMwOTkxLDMwOTkyLDMwOTkzLDMwOTk0LDMwOTk2LDMwOTk3LDMwOTk4LDMwOTk5LDMxMDAwLDMxMDAxLDMxMDAyLDMxMDAzLDMxMDA0LDMxMDA1LDMxMDA3LDMxMDA4LDMxMDA5LDMxMDEwLDMxMDExLDMxMDEzLDMxMDE0LDMxMDE1LDMxMDE2LDMxMDE3LDMxMDE4LDMxMDE5LDMxMDIwLDMxMDIxLDMxMDIyLDMxMDIzLDMxMDI0LDMxMDI1LDMxMDI2LDMxMDI3LDMxMDI5LDMxMDMwLDMxMDMxLDMxMDMyLDMxMDMzLDMxMDM3LDMxMDM5LDMxMDQyLDMxMDQzLDMxMDQ0LDMxMDQ1LDMxMDQ3LDMxMDUwLDMxMDUxLDMxMDUyLDMxMDUzLDMxMDU0LDMxMDU1LDMxMDU2LDMxMDU3LDMxMDU4LDMxMDYwLDMxMDYxLDMxMDY0LDMxMDY1LDMxMDczLDMxMDc1LDMxMDc2LDMxMDc4LDMxMDgxLDMxMDgyLDMxMDgzLDMxMDg0LDMxMDg2LDMxMDg4LDMxMDg5LDMxMDkwLDMxMDkxLDMxMDkyLDMxMDkzLDMxMDk0LDMxMDk3LDMxMDk5LDMxMTAwLDMxMTAxLDMxMTAyLDMxMTAzLDMxMTA2LDMxMTA3LDMxMTEwLDMxMTExLDMxMTEyLDMxMTEzLDMxMTE1LDMxMTE2LDMxMTE3LDMxMTE4LDMxMTIwLDMxMTIxLDMxMTIyLDI0NjA4LDMyODI5LDI1Mjg1LDIwMDI1LDIxMzMzLDM3MTEyLDI1NTI4LDMyOTY2LDI2MDg2LDI3Njk0LDIwMjk0LDI0ODE0LDI4MTI5LDM1ODA2LDI0Mzc3LDM0NTA3LDI0NDAzLDI1Mzc3LDIwODI2LDMzNjMzLDI2NzIzLDIwOTkyLDI1NDQzLDM2NDI0LDIwNDk4LDIzNzA3LDMxMDk1LDIzNTQ4LDIxMDQwLDMxMjkxLDI0NzY0LDM2OTQ3LDMwNDIzLDI0NTAzLDI0NDcxLDMwMzQwLDM2NDYwLDI4NzgzLDMwMzMxLDMxNTYxLDMwNjM0LDIwOTc5LDM3MDExLDIyNTY0LDIwMzAyLDI4NDA0LDM2ODQyLDI1OTMyLDMxNTE1LDI5MzgwLDI4MDY4LDMyNzM1LDIzMjY1LDI1MjY5LDI0MjEzLDIyMzIwLDMzOTIyLDMxNTMyLDI0MDkzLDI0MzUxLDM2ODgyLDMyNTMyLDM5MDcyLDI1NDc0LDI4MzU5LDMwODcyLDI4ODU3LDIwODU2LDM4NzQ3LDIyNDQzLDMwMDA1LDIwMjkxLDMwMDA4LDI0MjE1LDI0ODA2LDIyODgwLDI4MDk2LDI3NTgzLDMwODU3LDIxNTAwLDM4NjEzLDIwOTM5LDIwOTkzLDI1NDgxLDIxNTE0LDM4MDM1LDM1ODQzLDM2MzAwLDI5MjQxLDMwODc5LDM0Njc4LDM2ODQ1LDM1ODUzLDIxNDcyLDMxMTIzLDMxMTI0LDMxMTI1LDMxMTI2LDMxMTI3LDMxMTI4LDMxMTI5LDMxMTMxLDMxMTMyLDMxMTMzLDMxMTM0LDMxMTM1LDMxMTM2LDMxMTM3LDMxMTM4LDMxMTM5LDMxMTQwLDMxMTQxLDMxMTQyLDMxMTQ0LDMxMTQ1LDMxMTQ2LDMxMTQ3LDMxMTQ4LDMxMTQ5LDMxMTUwLDMxMTUxLDMxMTUyLDMxMTUzLDMxMTU0LDMxMTU2LDMxMTU3LDMxMTU4LDMxMTU5LDMxMTYwLDMxMTY0LDMxMTY3LDMxMTcwLDMxMTcyLDMxMTczLDMxMTc1LDMxMTc2LDMxMTc4LDMxMTgwLDMxMTgyLDMxMTgzLDMxMTg0LDMxMTg3LDMxMTg4LDMxMTkwLDMxMTkxLDMxMTkzLDMxMTk0LDMxMTk1LDMxMTk2LDMxMTk3LDMxMTk4LDMxMjAwLDMxMjAxLDMxMjAyLDMxMjA1LDMxMjA4LDMxMjEwLDMxMjEyLDMxMjE0LDMxMjE3LDMxMjE4LDMxMjE5LDMxMjIwLDMxMjIxLDMxMjIyLDMxMjIzLDMxMjI1LDMxMjI2LDMxMjI4LDMxMjMwLDMxMjMxLDMxMjMzLDMxMjM2LDMxMjM3LDMxMjM5LDMxMjQwLDMxMjQxLDMxMjQyLDMxMjQ0LDMxMjQ3LDMxMjQ4LDMxMjQ5LDMxMjUwLDMxMjUxLDMxMjUzLDMxMjU0LDMxMjU2LDMxMjU3LDMxMjU5LDMxMjYwLDE5OTY5LDMwNDQ3LDIxNDg2LDM4MDI1LDM5MDMwLDQwNzE4LDM4MTg5LDIzNDUwLDM1NzQ2LDIwMDAyLDE5OTk2LDIwOTA4LDMzODkxLDI1MDI2LDIxMTYwLDI2NjM1LDIwMzc1LDI0NjgzLDIwOTIzLDI3OTM0LDIwODI4LDI1MjM4LDI2MDA3LDM4NDk3LDM1OTEwLDM2ODg3LDMwMTY4LDM3MTE3LDMwNTYzLDI3NjAyLDI5MzIyLDI5NDIwLDM1ODM1LDIyNTgxLDMwNTg1LDM2MTcyLDI2NDYwLDM4MjA4LDMyOTIyLDI0MjMwLDI4MTkzLDIyOTMwLDMxNDcxLDMwNzAxLDM4MjAzLDI3NTczLDI2MDI5LDMyNTI2LDIyNTM0LDIwODE3LDM4NDMxLDIzNTQ1LDIyNjk3LDIxNTQ0LDM2NDY2LDI1OTU4LDM5MDM5LDIyMjQ0LDM4MDQ1LDMwNDYyLDM2OTI5LDI1NDc5LDIxNzAyLDIyODEwLDIyODQyLDIyNDI3LDM2NTMwLDI2NDIxLDM2MzQ2LDMzMzMzLDIxMDU3LDI0ODE2LDIyNTQ5LDM0NTU4LDIzNzg0LDQwNTE3LDIwNDIwLDM5MDY5LDM1NzY5LDIzMDc3LDI0Njk0LDIxMzgwLDI1MjEyLDM2OTQzLDM3MTIyLDM5Mjk1LDI0NjgxLDMyNzgwLDIwNzk5LDMyODE5LDIzNTcyLDM5Mjg1LDI3OTUzLDIwMTA4LDMxMjYxLDMxMjYzLDMxMjY1LDMxMjY2LDMxMjY4LDMxMjY5LDMxMjcwLDMxMjcxLDMxMjcyLDMxMjczLDMxMjc0LDMxMjc1LDMxMjc2LDMxMjc3LDMxMjc4LDMxMjc5LDMxMjgwLDMxMjgxLDMxMjgyLDMxMjg0LDMxMjg1LDMxMjg2LDMxMjg4LDMxMjkwLDMxMjk0LDMxMjk2LDMxMjk3LDMxMjk4LDMxMjk5LDMxMzAwLDMxMzAxLDMxMzAzLDMxMzA0LDMxMzA1LDMxMzA2LDMxMzA3LDMxMzA4LDMxMzA5LDMxMzEwLDMxMzExLDMxMzEyLDMxMzE0LDMxMzE1LDMxMzE2LDMxMzE3LDMxMzE4LDMxMzIwLDMxMzIxLDMxMzIyLDMxMzIzLDMxMzI0LDMxMzI1LDMxMzI2LDMxMzI3LDMxMzI4LDMxMzI5LDMxMzMwLDMxMzMxLDMxMzMyLDMxMzMzLDMxMzM0LDMxMzM1LDMxMzM2LDMxMzM3LDMxMzM4LDMxMzM5LDMxMzQwLDMxMzQxLDMxMzQyLDMxMzQzLDMxMzQ1LDMxMzQ2LDMxMzQ3LDMxMzQ5LDMxMzU1LDMxMzU2LDMxMzU3LDMxMzU4LDMxMzYyLDMxMzY1LDMxMzY3LDMxMzY5LDMxMzcwLDMxMzcxLDMxMzcyLDMxMzc0LDMxMzc1LDMxMzc2LDMxMzc5LDMxMzgwLDMxMzg1LDMxMzg2LDMxMzg3LDMxMzkwLDMxMzkzLDMxMzk0LDM2MTQ0LDIxNDU3LDMyNjAyLDMxNTY3LDIwMjQwLDIwMDQ3LDM4NDAwLDI3ODYxLDI5NjQ4LDM0MjgxLDI0MDcwLDMwMDU4LDMyNzYzLDI3MTQ2LDMwNzE4LDM4MDM0LDMyMzIxLDIwOTYxLDI4OTAyLDIxNDUzLDM2ODIwLDMzNTM5LDM2MTM3LDI5MzU5LDM5Mjc3LDI3ODY3LDIyMzQ2LDMzNDU5LDI2MDQxLDMyOTM4LDI1MTUxLDM4NDUwLDIyOTUyLDIwMjIzLDM1Nzc1LDMyNDQyLDI1OTE4LDMzNzc4LDM4NzUwLDIxODU3LDM5MTM0LDMyOTMzLDIxMjkwLDM1ODM3LDIxNTM2LDMyOTU0LDI0MjIzLDI3ODMyLDM2MTUzLDMzNDUyLDM3MjEwLDIxNTQ1LDI3Njc1LDIwOTk4LDMyNDM5LDIyMzY3LDI4OTU0LDI3Nzc0LDMxODgxLDIyODU5LDIwMjIxLDI0NTc1LDI0ODY4LDMxOTE0LDIwMDE2LDIzNTUzLDI2NTM5LDM0NTYyLDIzNzkyLDM4MTU1LDM5MTE4LDMwMTI3LDI4OTI1LDM2ODk4LDIwOTExLDMyNTQxLDM1NzczLDIyODU3LDIwOTY0LDIwMzE1LDIxNTQyLDIyODI3LDI1OTc1LDMyOTMyLDIzNDEzLDI1MjA2LDI1MjgyLDM2NzUyLDI0MTMzLDI3Njc5LDMxNTI2LDIwMjM5LDIwNDQwLDI2MzgxLDMxMzk1LDMxMzk2LDMxMzk5LDMxNDAxLDMxNDAyLDMxNDAzLDMxNDA2LDMxNDA3LDMxNDA4LDMxNDA5LDMxNDEwLDMxNDEyLDMxNDEzLDMxNDE0LDMxNDE1LDMxNDE2LDMxNDE3LDMxNDE4LDMxNDE5LDMxNDIwLDMxNDIxLDMxNDIyLDMxNDI0LDMxNDI1LDMxNDI2LDMxNDI3LDMxNDI4LDMxNDI5LDMxNDMwLDMxNDMxLDMxNDMyLDMxNDMzLDMxNDM0LDMxNDM2LDMxNDM3LDMxNDM4LDMxNDM5LDMxNDQwLDMxNDQxLDMxNDQyLDMxNDQzLDMxNDQ0LDMxNDQ1LDMxNDQ3LDMxNDQ4LDMxNDUwLDMxNDUxLDMxNDUyLDMxNDUzLDMxNDU3LDMxNDU4LDMxNDYwLDMxNDYzLDMxNDY0LDMxNDY1LDMxNDY2LDMxNDY3LDMxNDY4LDMxNDcwLDMxNDcyLDMxNDczLDMxNDc0LDMxNDc1LDMxNDc2LDMxNDc3LDMxNDc4LDMxNDc5LDMxNDgwLDMxNDgzLDMxNDg0LDMxNDg2LDMxNDg4LDMxNDg5LDMxNDkwLDMxNDkzLDMxNDk1LDMxNDk3LDMxNTAwLDMxNTAxLDMxNTAyLDMxNTA0LDMxNTA2LDMxNTA3LDMxNTEwLDMxNTExLDMxNTEyLDMxNTE0LDMxNTE2LDMxNTE3LDMxNTE5LDMxNTIxLDMxNTIyLDMxNTIzLDMxNTI3LDMxNTI5LDMxNTMzLDI4MDE0LDI4MDc0LDMxMTE5LDM0OTkzLDI0MzQzLDI5OTk1LDI1MjQyLDM2NzQxLDIwNDYzLDM3MzQwLDI2MDIzLDMzMDcxLDMzMTA1LDI0MjIwLDMzMTA0LDM2MjEyLDIxMTAzLDM1MjA2LDM2MTcxLDIyNzk3LDIwNjEzLDIwMTg0LDM4NDI4LDI5MjM4LDMzMTQ1LDM2MTI3LDIzNTAwLDM1NzQ3LDM4NDY4LDIyOTE5LDMyNTM4LDIxNjQ4LDIyMTM0LDIyMDMwLDM1ODEzLDI1OTEzLDI3MDEwLDM4MDQxLDMwNDIyLDI4Mjk3LDI0MTc4LDI5OTc2LDI2NDM4LDI2NTc3LDMxNDg3LDMyOTI1LDM2MjE0LDI0ODYzLDMxMTc0LDI1OTU0LDM2MTk1LDIwODcyLDIxMDE4LDM4MDUwLDMyNTY4LDMyOTIzLDMyNDM0LDIzNzAzLDI4MjA3LDI2NDY0LDMxNzA1LDMwMzQ3LDM5NjQwLDMzMTY3LDMyNjYwLDMxOTU3LDI1NjMwLDM4MjI0LDMxMjk1LDIxNTc4LDIxNzMzLDI3NDY4LDI1NjAxLDI1MDk2LDQwNTA5LDMzMDExLDMwMTA1LDIxMTA2LDM4NzYxLDMzODgzLDI2Njg0LDM0NTMyLDM4NDAxLDM4NTQ4LDM4MTI0LDIwMDEwLDIxNTA4LDMyNDczLDI2NjgxLDM2MzE5LDMyNzg5LDI2MzU2LDI0MjE4LDMyNjk3LDMxNTM1LDMxNTM2LDMxNTM4LDMxNTQwLDMxNTQxLDMxNTQyLDMxNTQzLDMxNTQ1LDMxNTQ3LDMxNTQ5LDMxNTUxLDMxNTUyLDMxNTUzLDMxNTU0LDMxNTU1LDMxNTU2LDMxNTU4LDMxNTYwLDMxNTYyLDMxNTY1LDMxNTY2LDMxNTcxLDMxNTczLDMxNTc1LDMxNTc3LDMxNTgwLDMxNTgyLDMxNTgzLDMxNTg1LDMxNTg3LDMxNTg4LDMxNTg5LDMxNTkwLDMxNTkxLDMxNTkyLDMxNTkzLDMxNTk0LDMxNTk1LDMxNTk2LDMxNTk3LDMxNTk5LDMxNjAwLDMxNjAzLDMxNjA0LDMxNjA2LDMxNjA4LDMxNjEwLDMxNjEyLDMxNjEzLDMxNjE1LDMxNjE3LDMxNjE4LDMxNjE5LDMxNjIwLDMxNjIyLDMxNjIzLDMxNjI0LDMxNjI1LDMxNjI2LDMxNjI3LDMxNjI4LDMxNjMwLDMxNjMxLDMxNjMzLDMxNjM0LDMxNjM1LDMxNjM4LDMxNjQwLDMxNjQxLDMxNjQyLDMxNjQzLDMxNjQ2LDMxNjQ3LDMxNjQ4LDMxNjUxLDMxNjUyLDMxNjUzLDMxNjYyLDMxNjYzLDMxNjY0LDMxNjY2LDMxNjY3LDMxNjY5LDMxNjcwLDMxNjcxLDMxNjczLDMxNjc0LDMxNjc1LDMxNjc2LDMxNjc3LDMxNjc4LDMxNjc5LDMxNjgwLDMxNjgyLDMxNjgzLDMxNjg0LDIyNDY2LDMyODMxLDI2Nzc1LDI0MDM3LDI1OTE1LDIxMTUxLDI0Njg1LDQwODU4LDIwMzc5LDM2NTI0LDIwODQ0LDIzNDY3LDI0MzM5LDI0MDQxLDI3NzQyLDI1MzI5LDM2MTI5LDIwODQ5LDM4MDU3LDIxMjQ2LDI3ODA3LDMzNTAzLDI5Mzk5LDIyNDM0LDI2NTAwLDM2MTQxLDIyODE1LDM2NzY0LDMzNzM1LDIxNjUzLDMxNjI5LDIwMjcyLDI3ODM3LDIzMzk2LDIyOTkzLDQwNzIzLDIxNDc2LDM0NTA2LDM5NTkyLDM1ODk1LDMyOTI5LDI1OTI1LDM5MDM4LDIyMjY2LDM4NTk5LDIxMDM4LDI5OTE2LDIxMDcyLDIzNTIxLDI1MzQ2LDM1MDc0LDIwMDU0LDI1Mjk2LDI0NjE4LDI2ODc0LDIwODUxLDIzNDQ4LDIwODk2LDM1MjY2LDMxNjQ5LDM5MzAyLDMyNTkyLDI0ODE1LDI4NzQ4LDM2MTQzLDIwODA5LDI0MTkxLDM2ODkxLDI5ODA4LDM1MjY4LDIyMzE3LDMwNzg5LDI0NDAyLDQwODYzLDM4Mzk0LDM2NzEyLDM5NzQwLDM1ODA5LDMwMzI4LDI2NjkwLDI2NTg4LDM2MzMwLDM2MTQ5LDIxMDUzLDM2NzQ2LDI4Mzc4LDI2ODI5LDM4MTQ5LDM3MTAxLDIyMjY5LDI2NTI0LDM1MDY1LDM2ODA3LDIxNzA0LDMxNjg1LDMxNjg4LDMxNjg5LDMxNjkwLDMxNjkxLDMxNjkzLDMxNjk0LDMxNjk1LDMxNjk2LDMxNjk4LDMxNzAwLDMxNzAxLDMxNzAyLDMxNzAzLDMxNzA0LDMxNzA3LDMxNzA4LDMxNzEwLDMxNzExLDMxNzEyLDMxNzE0LDMxNzE1LDMxNzE2LDMxNzE5LDMxNzIwLDMxNzIxLDMxNzIzLDMxNzI0LDMxNzI1LDMxNzI3LDMxNzI4LDMxNzMwLDMxNzMxLDMxNzMyLDMxNzMzLDMxNzM0LDMxNzM2LDMxNzM3LDMxNzM4LDMxNzM5LDMxNzQxLDMxNzQzLDMxNzQ0LDMxNzQ1LDMxNzQ2LDMxNzQ3LDMxNzQ4LDMxNzQ5LDMxNzUwLDMxNzUyLDMxNzUzLDMxNzU0LDMxNzU3LDMxNzU4LDMxNzYwLDMxNzYxLDMxNzYyLDMxNzYzLDMxNzY0LDMxNzY1LDMxNzY3LDMxNzY4LDMxNzY5LDMxNzcwLDMxNzcxLDMxNzcyLDMxNzczLDMxNzc0LDMxNzc2LDMxNzc3LDMxNzc4LDMxNzc5LDMxNzgwLDMxNzgxLDMxNzg0LDMxNzg1LDMxNzg3LDMxNzg4LDMxNzg5LDMxNzkwLDMxNzkxLDMxNzkyLDMxNzkzLDMxNzk0LDMxNzk1LDMxNzk2LDMxNzk3LDMxNzk4LDMxNzk5LDMxODAxLDMxODAyLDMxODAzLDMxODA0LDMxODA1LDMxODA2LDMxODEwLDM5NjA4LDIzNDAxLDI4MDIzLDI3Njg2LDIwMTMzLDIzNDc1LDM5NTU5LDM3MjE5LDI1MDAwLDM3MDM5LDM4ODg5LDIxNTQ3LDI4MDg1LDIzNTA2LDIwOTg5LDIxODk4LDMyNTk3LDMyNzUyLDI1Nzg4LDI1NDIxLDI2MDk3LDI1MDIyLDI0NzE3LDI4OTM4LDI3NzM1LDI3NzIxLDIyODMxLDI2NDc3LDMzMzIyLDIyNzQxLDIyMTU4LDM1OTQ2LDI3NjI3LDM3MDg1LDIyOTA5LDMyNzkxLDIxNDk1LDI4MDA5LDIxNjIxLDIxOTE3LDMzNjU1LDMzNzQzLDI2NjgwLDMxMTY2LDIxNjQ0LDIwMzA5LDIxNTEyLDMwNDE4LDM1OTc3LDM4NDAyLDI3ODI3LDI4MDg4LDM2MjAzLDM1MDg4LDQwNTQ4LDM2MTU0LDIyMDc5LDQwNjU3LDMwMTY1LDI0NDU2LDI5NDA4LDI0NjgwLDIxNzU2LDIwMTM2LDI3MTc4LDM0OTEzLDI0NjU4LDM2NzIwLDIxNzAwLDI4ODg4LDM0NDI1LDQwNTExLDI3OTQ2LDIzNDM5LDI0MzQ0LDMyNDE4LDIxODk3LDIwMzk5LDI5NDkyLDIxNTY0LDIxNDAyLDIwNTA1LDIxNTE4LDIxNjI4LDIwMDQ2LDI0NTczLDI5Nzg2LDIyNzc0LDMzODk5LDMyOTkzLDM0Njc2LDI5MzkyLDMxOTQ2LDI4MjQ2LDMxODExLDMxODEyLDMxODEzLDMxODE0LDMxODE1LDMxODE2LDMxODE3LDMxODE4LDMxODE5LDMxODIwLDMxODIyLDMxODIzLDMxODI0LDMxODI1LDMxODI2LDMxODI3LDMxODI4LDMxODI5LDMxODMwLDMxODMxLDMxODMyLDMxODMzLDMxODM0LDMxODM1LDMxODM2LDMxODM3LDMxODM4LDMxODM5LDMxODQwLDMxODQxLDMxODQyLDMxODQzLDMxODQ0LDMxODQ1LDMxODQ2LDMxODQ3LDMxODQ4LDMxODQ5LDMxODUwLDMxODUxLDMxODUyLDMxODUzLDMxODU0LDMxODU1LDMxODU2LDMxODU3LDMxODU4LDMxODYxLDMxODYyLDMxODYzLDMxODY0LDMxODY1LDMxODY2LDMxODcwLDMxODcxLDMxODcyLDMxODczLDMxODc0LDMxODc1LDMxODc2LDMxODc3LDMxODc4LDMxODc5LDMxODgwLDMxODgyLDMxODgzLDMxODg0LDMxODg1LDMxODg2LDMxODg3LDMxODg4LDMxODkxLDMxODkyLDMxODk0LDMxODk3LDMxODk4LDMxODk5LDMxOTA0LDMxOTA1LDMxOTA3LDMxOTEwLDMxOTExLDMxOTEyLDMxOTEzLDMxOTE1LDMxOTE2LDMxOTE3LDMxOTE5LDMxOTIwLDMxOTI0LDMxOTI1LDMxOTI2LDMxOTI3LDMxOTI4LDMxOTMwLDMxOTMxLDI0MzU5LDM0MzgyLDIxODA0LDI1MjUyLDIwMTE0LDI3ODE4LDI1MTQzLDMzNDU3LDIxNzE5LDIxMzI2LDI5NTAyLDI4MzY5LDMwMDExLDIxMDEwLDIxMjcwLDM1ODA1LDI3MDg4LDI0NDU4LDI0NTc2LDI4MTQyLDIyMzUxLDI3NDI2LDI5NjE1LDI2NzA3LDM2ODI0LDMyNTMxLDI1NDQyLDI0NzM5LDIxNzk2LDMwMTg2LDM1OTM4LDI4OTQ5LDI4MDY3LDIzNDYyLDI0MTg3LDMzNjE4LDI0OTA4LDQwNjQ0LDMwOTcwLDM0NjQ3LDMxNzgzLDMwMzQzLDIwOTc2LDI0ODIyLDI5MDA0LDI2MTc5LDI0MTQwLDI0NjUzLDM1ODU0LDI4Nzg0LDI1MzgxLDM2NzQ1LDI0NTA5LDI0Njc0LDM0NTE2LDIyMjM4LDI3NTg1LDI0NzI0LDI0OTM1LDIxMzIxLDI0ODAwLDI2MjE0LDM2MTU5LDMxMjI5LDIwMjUwLDI4OTA1LDI3NzE5LDM1NzYzLDM1ODI2LDMyNDcyLDMzNjM2LDI2MTI3LDIzMTMwLDM5NzQ2LDI3OTg1LDI4MTUxLDM1OTA1LDI3OTYzLDIwMjQ5LDI4Nzc5LDMzNzE5LDI1MTEwLDI0Nzg1LDM4NjY5LDM2MTM1LDMxMDk2LDIwOTg3LDIyMzM0LDIyNTIyLDI2NDI2LDMwMDcyLDMxMjkzLDMxMjE1LDMxNjM3LDMxOTM1LDMxOTM2LDMxOTM4LDMxOTM5LDMxOTQwLDMxOTQyLDMxOTQ1LDMxOTQ3LDMxOTUwLDMxOTUxLDMxOTUyLDMxOTUzLDMxOTU0LDMxOTU1LDMxOTU2LDMxOTYwLDMxOTYyLDMxOTYzLDMxOTY1LDMxOTY2LDMxOTY5LDMxOTcwLDMxOTcxLDMxOTcyLDMxOTczLDMxOTc0LDMxOTc1LDMxOTc3LDMxOTc4LDMxOTc5LDMxOTgwLDMxOTgxLDMxOTgyLDMxOTg0LDMxOTg1LDMxOTg2LDMxOTg3LDMxOTg4LDMxOTg5LDMxOTkwLDMxOTkxLDMxOTkzLDMxOTk0LDMxOTk2LDMxOTk3LDMxOTk4LDMxOTk5LDMyMDAwLDMyMDAxLDMyMDAyLDMyMDAzLDMyMDA0LDMyMDA1LDMyMDA2LDMyMDA3LDMyMDA4LDMyMDA5LDMyMDExLDMyMDEyLDMyMDEzLDMyMDE0LDMyMDE1LDMyMDE2LDMyMDE3LDMyMDE4LDMyMDE5LDMyMDIwLDMyMDIxLDMyMDIyLDMyMDIzLDMyMDI0LDMyMDI1LDMyMDI2LDMyMDI3LDMyMDI4LDMyMDI5LDMyMDMwLDMyMDMxLDMyMDMzLDMyMDM1LDMyMDM2LDMyMDM3LDMyMDM4LDMyMDQwLDMyMDQxLDMyMDQyLDMyMDQ0LDMyMDQ1LDMyMDQ2LDMyMDQ4LDMyMDQ5LDMyMDUwLDMyMDUxLDMyMDUyLDMyMDUzLDMyMDU0LDMyOTA4LDM5MjY5LDM2ODU3LDI4NjA4LDM1NzQ5LDQwNDgxLDIzMDIwLDMyNDg5LDMyNTIxLDIxNTEzLDI2NDk3LDI2ODQwLDM2NzUzLDMxODIxLDM4NTk4LDIxNDUwLDI0NjEzLDMwMTQyLDI3NzYyLDIxMzYzLDIzMjQxLDMyNDIzLDI1MzgwLDIwOTYwLDMzMDM0LDI0MDQ5LDM0MDE1LDI1MjE2LDIwODY0LDIzMzk1LDIwMjM4LDMxMDg1LDIxMDU4LDI0NzYwLDI3OTgyLDIzNDkyLDIzNDkwLDM1NzQ1LDM1NzYwLDI2MDgyLDI0NTI0LDM4NDY5LDIyOTMxLDMyNDg3LDMyNDI2LDIyMDI1LDI2NTUxLDIyODQxLDIwMzM5LDIzNDc4LDIxMTUyLDMzNjI2LDM5MDUwLDM2MTU4LDMwMDAyLDM4MDc4LDIwNTUxLDMxMjkyLDIwMjE1LDI2NTUwLDM5NTUwLDIzMjMzLDI3NTE2LDMwNDE3LDIyMzYyLDIzNTc0LDMxNTQ2LDM4Mzg4LDI5MDA2LDIwODYwLDMyOTM3LDMzMzkyLDIyOTA0LDMyNTE2LDMzNTc1LDI2ODE2LDI2NjA0LDMwODk3LDMwODM5LDI1MzE1LDI1NDQxLDMxNjE2LDIwNDYxLDIxMDk4LDIwOTQzLDMzNjE2LDI3MDk5LDM3NDkyLDM2MzQxLDM2MTQ1LDM1MjY1LDM4MTkwLDMxNjYxLDIwMjE0LDMyMDU1LDMyMDU2LDMyMDU3LDMyMDU4LDMyMDU5LDMyMDYwLDMyMDYxLDMyMDYyLDMyMDYzLDMyMDY0LDMyMDY1LDMyMDY2LDMyMDY3LDMyMDY4LDMyMDY5LDMyMDcwLDMyMDcxLDMyMDcyLDMyMDczLDMyMDc0LDMyMDc1LDMyMDc2LDMyMDc3LDMyMDc4LDMyMDc5LDMyMDgwLDMyMDgxLDMyMDgyLDMyMDgzLDMyMDg0LDMyMDg1LDMyMDg2LDMyMDg3LDMyMDg4LDMyMDg5LDMyMDkwLDMyMDkxLDMyMDkyLDMyMDkzLDMyMDk0LDMyMDk1LDMyMDk2LDMyMDk3LDMyMDk4LDMyMDk5LDMyMTAwLDMyMTAxLDMyMTAyLDMyMTAzLDMyMTA0LDMyMTA1LDMyMTA2LDMyMTA3LDMyMTA4LDMyMTA5LDMyMTExLDMyMTEyLDMyMTEzLDMyMTE0LDMyMTE1LDMyMTE2LDMyMTE3LDMyMTE4LDMyMTIwLDMyMTIxLDMyMTIyLDMyMTIzLDMyMTI0LDMyMTI1LDMyMTI2LDMyMTI3LDMyMTI4LDMyMTI5LDMyMTMwLDMyMTMxLDMyMTMyLDMyMTMzLDMyMTM0LDMyMTM1LDMyMTM2LDMyMTM3LDMyMTM4LDMyMTM5LDMyMTQwLDMyMTQxLDMyMTQyLDMyMTQzLDMyMTQ0LDMyMTQ1LDMyMTQ2LDMyMTQ3LDMyMTQ4LDMyMTQ5LDMyMTUwLDMyMTUxLDMyMTUyLDIwNTgxLDMzMzI4LDIxMDczLDM5Mjc5LDI4MTc2LDI4MjkzLDI4MDcxLDI0MzE0LDIwNzI1LDIzMDA0LDIzNTU4LDI3OTc0LDI3NzQzLDMwMDg2LDMzOTMxLDI2NzI4LDIyODcwLDM1NzYyLDIxMjgwLDM3MjMzLDM4NDc3LDM0MTIxLDI2ODk4LDMwOTc3LDI4OTY2LDMzMDE0LDIwMTMyLDM3MDY2LDI3OTc1LDM5NTU2LDIzMDQ3LDIyMjA0LDI1NjA1LDM4MTI4LDMwNjk5LDIwMzg5LDMzMDUwLDI5NDA5LDM1MjgyLDM5MjkwLDMyNTY0LDMyNDc4LDIxMTE5LDI1OTQ1LDM3MjM3LDM2NzM1LDM2NzM5LDIxNDgzLDMxMzgyLDI1NTgxLDI1NTA5LDMwMzQyLDMxMjI0LDM0OTAzLDM4NDU0LDI1MTMwLDIxMTYzLDMzNDEwLDI2NzA4LDI2NDgwLDI1NDYzLDMwNTcxLDMxNDY5LDI3OTA1LDMyNDY3LDM1Mjk5LDIyOTkyLDI1MTA2LDM0MjQ5LDMzNDQ1LDMwMDI4LDIwNTExLDIwMTcxLDMwMTE3LDM1ODE5LDIzNjI2LDI0MDYyLDMxNTYzLDI2MDIwLDM3MzI5LDIwMTcwLDI3OTQxLDM1MTY3LDMyMDM5LDM4MTgyLDIwMTY1LDM1ODgwLDM2ODI3LDM4NzcxLDI2MTg3LDMxMTA1LDM2ODE3LDI4OTA4LDI4MDI0LDMyMTUzLDMyMTU0LDMyMTU1LDMyMTU2LDMyMTU3LDMyMTU4LDMyMTU5LDMyMTYwLDMyMTYxLDMyMTYyLDMyMTYzLDMyMTY0LDMyMTY1LDMyMTY3LDMyMTY4LDMyMTY5LDMyMTcwLDMyMTcxLDMyMTcyLDMyMTczLDMyMTc1LDMyMTc2LDMyMTc3LDMyMTc4LDMyMTc5LDMyMTgwLDMyMTgxLDMyMTgyLDMyMTgzLDMyMTg0LDMyMTg1LDMyMTg2LDMyMTg3LDMyMTg4LDMyMTg5LDMyMTkwLDMyMTkxLDMyMTkyLDMyMTkzLDMyMTk0LDMyMTk1LDMyMTk2LDMyMTk3LDMyMTk4LDMyMTk5LDMyMjAwLDMyMjAxLDMyMjAyLDMyMjAzLDMyMjA0LDMyMjA1LDMyMjA2LDMyMjA3LDMyMjA4LDMyMjA5LDMyMjEwLDMyMjExLDMyMjEyLDMyMjEzLDMyMjE0LDMyMjE1LDMyMjE2LDMyMjE3LDMyMjE4LDMyMjE5LDMyMjIwLDMyMjIxLDMyMjIyLDMyMjIzLDMyMjI0LDMyMjI1LDMyMjI2LDMyMjI3LDMyMjI4LDMyMjI5LDMyMjMwLDMyMjMxLDMyMjMyLDMyMjMzLDMyMjM0LDMyMjM1LDMyMjM2LDMyMjM3LDMyMjM4LDMyMjM5LDMyMjQwLDMyMjQxLDMyMjQyLDMyMjQzLDMyMjQ0LDMyMjQ1LDMyMjQ2LDMyMjQ3LDMyMjQ4LDMyMjQ5LDMyMjUwLDIzNjEzLDIxMTcwLDMzNjA2LDIwODM0LDMzNTUwLDMwNTU1LDI2MjMwLDQwMTIwLDIwMTQwLDI0Nzc4LDMxOTM0LDMxOTIzLDMyNDYzLDIwMTE3LDM1Njg2LDI2MjIzLDM5MDQ4LDM4NzQ1LDIyNjU5LDI1OTY0LDM4MjM2LDI0NDUyLDMwMTUzLDM4NzQyLDMxNDU1LDMxNDU0LDIwOTI4LDI4ODQ3LDMxMzg0LDI1NTc4LDMxMzUwLDMyNDE2LDI5NTkwLDM4ODkzLDIwMDM3LDI4NzkyLDIwMDYxLDM3MjAyLDIxNDE3LDI1OTM3LDI2MDg3LDMzMjc2LDMzMjg1LDIxNjQ2LDIzNjAxLDMwMTA2LDM4ODE2LDI1MzA0LDI5NDAxLDMwMTQxLDIzNjIxLDM5NTQ1LDMzNzM4LDIzNjE2LDIxNjMyLDMwNjk3LDIwMDMwLDI3ODIyLDMyODU4LDI1Mjk4LDI1NDU0LDI0MDQwLDIwODU1LDM2MzE3LDM2MzgyLDM4MTkxLDIwNDY1LDIxNDc3LDI0ODA3LDI4ODQ0LDIxMDk1LDI1NDI0LDQwNTE1LDIzMDcxLDIwNTE4LDMwNTE5LDIxMzY3LDMyNDgyLDI1NzMzLDI1ODk5LDI1MjI1LDI1NDk2LDIwNTAwLDI5MjM3LDM1MjczLDIwOTE1LDM1Nzc2LDMyNDc3LDIyMzQzLDMzNzQwLDM4MDU1LDIwODkxLDIxNTMxLDIzODAzLDMyMjUxLDMyMjUyLDMyMjUzLDMyMjU0LDMyMjU1LDMyMjU2LDMyMjU3LDMyMjU4LDMyMjU5LDMyMjYwLDMyMjYxLDMyMjYyLDMyMjYzLDMyMjY0LDMyMjY1LDMyMjY2LDMyMjY3LDMyMjY4LDMyMjY5LDMyMjcwLDMyMjcxLDMyMjcyLDMyMjczLDMyMjc0LDMyMjc1LDMyMjc2LDMyMjc3LDMyMjc4LDMyMjc5LDMyMjgwLDMyMjgxLDMyMjgyLDMyMjgzLDMyMjg0LDMyMjg1LDMyMjg2LDMyMjg3LDMyMjg4LDMyMjg5LDMyMjkwLDMyMjkxLDMyMjkyLDMyMjkzLDMyMjk0LDMyMjk1LDMyMjk2LDMyMjk3LDMyMjk4LDMyMjk5LDMyMzAwLDMyMzAxLDMyMzAyLDMyMzAzLDMyMzA0LDMyMzA1LDMyMzA2LDMyMzA3LDMyMzA4LDMyMzA5LDMyMzEwLDMyMzExLDMyMzEyLDMyMzEzLDMyMzE0LDMyMzE2LDMyMzE3LDMyMzE4LDMyMzE5LDMyMzIwLDMyMzIyLDMyMzIzLDMyMzI0LDMyMzI1LDMyMzI2LDMyMzI4LDMyMzI5LDMyMzMwLDMyMzMxLDMyMzMyLDMyMzMzLDMyMzM0LDMyMzM1LDMyMzM2LDMyMzM3LDMyMzM4LDMyMzM5LDMyMzQwLDMyMzQxLDMyMzQyLDMyMzQzLDMyMzQ0LDMyMzQ1LDMyMzQ2LDMyMzQ3LDMyMzQ4LDMyMzQ5LDIwNDI2LDMxNDU5LDI3OTk0LDM3MDg5LDM5NTY3LDIxODg4LDIxNjU0LDIxMzQ1LDIxNjc5LDI0MzIwLDI1NTc3LDI2OTk5LDIwOTc1LDI0OTM2LDIxMDAyLDIyNTcwLDIxMjA4LDIyMzUwLDMwNzMzLDMwNDc1LDI0MjQ3LDI0OTUxLDMxOTY4LDI1MTc5LDI1MjM5LDIwMTMwLDI4ODIxLDMyNzcxLDI1MzM1LDI4OTAwLDM4NzUyLDIyMzkxLDMzNDk5LDI2NjA3LDI2ODY5LDMwOTMzLDM5MDYzLDMxMTg1LDIyNzcxLDIxNjgzLDIxNDg3LDI4MjEyLDIwODExLDIxMDUxLDIzNDU4LDM1ODM4LDMyOTQzLDIxODI3LDIyNDM4LDI0NjkxLDIyMzUzLDIxNTQ5LDMxMzU0LDI0NjU2LDIzMzgwLDI1NTExLDI1MjQ4LDIxNDc1LDI1MTg3LDIzNDk1LDI2NTQzLDIxNzQxLDMxMzkxLDMzNTEwLDM3MjM5LDI0MjExLDM1MDQ0LDIyODQwLDIyNDQ2LDI1MzU4LDM2MzI4LDMzMDA3LDIyMzU5LDMxNjA3LDIwMzkzLDI0NTU1LDIzNDg1LDI3NDU0LDIxMjgxLDMxNTY4LDI5Mzc4LDI2Njk0LDMwNzE5LDMwNTE4LDI2MTAzLDIwOTE3LDIwMTExLDMwNDIwLDIzNzQzLDMxMzk3LDMzOTA5LDIyODYyLDM5NzQ1LDIwNjA4LDMyMzUwLDMyMzUxLDMyMzUyLDMyMzUzLDMyMzU0LDMyMzU1LDMyMzU2LDMyMzU3LDMyMzU4LDMyMzU5LDMyMzYwLDMyMzYxLDMyMzYyLDMyMzYzLDMyMzY0LDMyMzY1LDMyMzY2LDMyMzY3LDMyMzY4LDMyMzY5LDMyMzcwLDMyMzcxLDMyMzcyLDMyMzczLDMyMzc0LDMyMzc1LDMyMzc2LDMyMzc3LDMyMzc4LDMyMzc5LDMyMzgwLDMyMzgxLDMyMzgyLDMyMzgzLDMyMzg0LDMyMzg1LDMyMzg3LDMyMzg4LDMyMzg5LDMyMzkwLDMyMzkxLDMyMzkyLDMyMzkzLDMyMzk0LDMyMzk1LDMyMzk2LDMyMzk3LDMyMzk4LDMyMzk5LDMyNDAwLDMyNDAxLDMyNDAyLDMyNDAzLDMyNDA0LDMyNDA1LDMyNDA2LDMyNDA3LDMyNDA4LDMyNDA5LDMyNDEwLDMyNDEyLDMyNDEzLDMyNDE0LDMyNDMwLDMyNDM2LDMyNDQzLDMyNDQ0LDMyNDcwLDMyNDg0LDMyNDkyLDMyNTA1LDMyNTIyLDMyNTI4LDMyNTQyLDMyNTY3LDMyNTY5LDMyNTcxLDMyNTcyLDMyNTczLDMyNTc0LDMyNTc1LDMyNTc2LDMyNTc3LDMyNTc5LDMyNTgyLDMyNTgzLDMyNTg0LDMyNTg1LDMyNTg2LDMyNTg3LDMyNTg4LDMyNTg5LDMyNTkwLDMyNTkxLDMyNTk0LDMyNTk1LDM5MzA0LDI0ODcxLDI4MjkxLDIyMzcyLDI2MTE4LDI1NDE0LDIyMjU2LDI1MzI0LDI1MTkzLDI0Mjc1LDM4NDIwLDIyNDAzLDI1Mjg5LDIxODk1LDM0NTkzLDMzMDk4LDM2NzcxLDIxODYyLDMzNzEzLDI2NDY5LDM2MTgyLDM0MDEzLDIzMTQ2LDI2NjM5LDI1MzE4LDMxNzI2LDM4NDE3LDIwODQ4LDI4NTcyLDM1ODg4LDI1NTk3LDM1MjcyLDI1MDQyLDMyNTE4LDI4ODY2LDI4Mzg5LDI5NzAxLDI3MDI4LDI5NDM2LDI0MjY2LDM3MDcwLDI2MzkxLDI4MDEwLDI1NDM4LDIxMTcxLDI5MjgyLDMyNzY5LDIwMzMyLDIzMDEzLDM3MjI2LDI4ODg5LDI4MDYxLDIxMjAyLDIwMDQ4LDM4NjQ3LDM4MjUzLDM0MTc0LDMwOTIyLDMyMDQ3LDIwNzY5LDIyNDE4LDI1Nzk0LDMyOTA3LDMxODY3LDI3ODgyLDI2ODY1LDI2OTc0LDIwOTE5LDIxNDAwLDI2NzkyLDI5MzEzLDQwNjU0LDMxNzI5LDI5NDMyLDMxMTYzLDI4NDM1LDI5NzAyLDI2NDQ2LDM3MzI0LDQwMTAwLDMxMDM2LDMzNjczLDMzNjIwLDIxNTE5LDI2NjQ3LDIwMDI5LDIxMzg1LDIxMTY5LDMwNzgyLDIxMzgyLDIxMDMzLDIwNjE2LDIwMzYzLDIwNDMyLDMyNTk4LDMyNjAxLDMyNjAzLDMyNjA0LDMyNjA1LDMyNjA2LDMyNjA4LDMyNjExLDMyNjEyLDMyNjEzLDMyNjE0LDMyNjE1LDMyNjE5LDMyNjIwLDMyNjIxLDMyNjIzLDMyNjI0LDMyNjI3LDMyNjI5LDMyNjMwLDMyNjMxLDMyNjMyLDMyNjM0LDMyNjM1LDMyNjM2LDMyNjM3LDMyNjM5LDMyNjQwLDMyNjQyLDMyNjQzLDMyNjQ0LDMyNjQ1LDMyNjQ2LDMyNjQ3LDMyNjQ4LDMyNjQ5LDMyNjUxLDMyNjUzLDMyNjU1LDMyNjU2LDMyNjU3LDMyNjU4LDMyNjU5LDMyNjYxLDMyNjYyLDMyNjYzLDMyNjY0LDMyNjY1LDMyNjY3LDMyNjY4LDMyNjcyLDMyNjc0LDMyNjc1LDMyNjc3LDMyNjc4LDMyNjgwLDMyNjgxLDMyNjgyLDMyNjgzLDMyNjg0LDMyNjg1LDMyNjg2LDMyNjg5LDMyNjkxLDMyNjkyLDMyNjkzLDMyNjk0LDMyNjk1LDMyNjk4LDMyNjk5LDMyNzAyLDMyNzA0LDMyNzA2LDMyNzA3LDMyNzA4LDMyNzEwLDMyNzExLDMyNzEyLDMyNzEzLDMyNzE1LDMyNzE3LDMyNzE5LDMyNzIwLDMyNzIxLDMyNzIyLDMyNzIzLDMyNzI2LDMyNzI3LDMyNzI5LDMyNzMwLDMyNzMxLDMyNzMyLDMyNzMzLDMyNzM0LDMyNzM4LDMyNzM5LDMwMTc4LDMxNDM1LDMxODkwLDI3ODEzLDM4NTgyLDIxMTQ3LDI5ODI3LDIxNzM3LDIwNDU3LDMyODUyLDMzNzE0LDM2ODMwLDM4MjU2LDI0MjY1LDI0NjA0LDI4MDYzLDI0MDg4LDI1OTQ3LDMzMDgwLDM4MTQyLDI0NjUxLDI4ODYwLDMyNDUxLDMxOTE4LDIwOTM3LDI2NzUzLDMxOTIxLDMzMzkxLDIwMDA0LDM2NzQyLDM3MzI3LDI2MjM4LDIwMTQyLDM1ODQ1LDI1NzY5LDMyODQyLDIwNjk4LDMwMTAzLDI5MTM0LDIzNTI1LDM2Nzk3LDI4NTE4LDIwMTAyLDI1NzMwLDM4MjQzLDI0Mjc4LDI2MDA5LDIxMDE1LDM1MDEwLDI4ODcyLDIxMTU1LDI5NDU0LDI5NzQ3LDI2NTE5LDMwOTY3LDM4Njc4LDIwMDIwLDM3MDUxLDQwMTU4LDI4MTA3LDIwOTU1LDM2MTYxLDIxNTMzLDI1Mjk0LDI5NjE4LDMzNzc3LDM4NjQ2LDQwODM2LDM4MDgzLDIwMjc4LDMyNjY2LDIwOTQwLDI4Nzg5LDM4NTE3LDIzNzI1LDM5MDQ2LDIxNDc4LDIwMTk2LDI4MzE2LDI5NzA1LDI3MDYwLDMwODI3LDM5MzExLDMwMDQxLDIxMDE2LDMwMjQ0LDI3OTY5LDI2NjExLDIwODQ1LDQwODU3LDMyODQzLDIxNjU3LDMxNTQ4LDMxNDIzLDMyNzQwLDMyNzQzLDMyNzQ0LDMyNzQ2LDMyNzQ3LDMyNzQ4LDMyNzQ5LDMyNzUxLDMyNzU0LDMyNzU2LDMyNzU3LDMyNzU4LDMyNzU5LDMyNzYwLDMyNzYxLDMyNzYyLDMyNzY1LDMyNzY2LDMyNzY3LDMyNzcwLDMyNzc1LDMyNzc2LDMyNzc3LDMyNzc4LDMyNzgyLDMyNzgzLDMyNzg1LDMyNzg3LDMyNzk0LDMyNzk1LDMyNzk3LDMyNzk4LDMyNzk5LDMyODAxLDMyODAzLDMyODA0LDMyODExLDMyODEyLDMyODEzLDMyODE0LDMyODE1LDMyODE2LDMyODE4LDMyODIwLDMyODI1LDMyODI2LDMyODI4LDMyODMwLDMyODMyLDMyODMzLDMyODM2LDMyODM3LDMyODM5LDMyODQwLDMyODQxLDMyODQ2LDMyODQ3LDMyODQ4LDMyODQ5LDMyODUxLDMyODUzLDMyODU0LDMyODU1LDMyODU3LDMyODU5LDMyODYwLDMyODYxLDMyODYyLDMyODYzLDMyODY0LDMyODY1LDMyODY2LDMyODY3LDMyODY4LDMyODY5LDMyODcwLDMyODcxLDMyODcyLDMyODc1LDMyODc2LDMyODc3LDMyODc4LDMyODc5LDMyODgwLDMyODgyLDMyODgzLDMyODg0LDMyODg1LDMyODg2LDMyODg3LDMyODg4LDMyODg5LDMyODkwLDMyODkxLDMyODkyLDMyODkzLDM4NTM0LDIyNDA0LDI1MzE0LDM4NDcxLDI3MDA0LDIzMDQ0LDI1NjAyLDMxNjk5LDI4NDMxLDM4NDc1LDMzNDQ2LDIxMzQ2LDM5MDQ1LDI0MjA4LDI4ODA5LDI1NTIzLDIxMzQ4LDM0MzgzLDQwMDY1LDQwNTk1LDMwODYwLDM4NzA2LDM2MzM1LDM2MTYyLDQwNTc1LDI4NTEwLDMxMTA4LDI0NDA1LDM4NDcwLDI1MTM0LDM5NTQwLDIxNTI1LDM4MTA5LDIwMzg3LDI2MDUzLDIzNjUzLDIzNjQ5LDMyNTMzLDM0Mzg1LDI3Njk1LDI0NDU5LDI5NTc1LDI4Mzg4LDMyNTExLDIzNzgyLDI1MzcxLDIzNDAyLDI4MzkwLDIxMzY1LDIwMDgxLDI1NTA0LDMwMDUzLDI1MjQ5LDM2NzE4LDIwMjYyLDIwMTc3LDI3ODE0LDMyNDM4LDM1NzcwLDMzODIxLDM0NzQ2LDMyNTk5LDM2OTIzLDM4MTc5LDMxNjU3LDM5NTg1LDM1MDY0LDMzODUzLDI3OTMxLDM5NTU4LDMyNDc2LDIyOTIwLDQwNjM1LDI5NTk1LDMwNzIxLDM0NDM0LDM5NTMyLDM5NTU0LDIyMDQzLDIxNTI3LDIyNDc1LDIwMDgwLDQwNjE0LDIxMzM0LDM2ODA4LDMzMDMzLDMwNjEwLDM5MzE0LDM0NTQyLDI4Mzg1LDM0MDY3LDI2MzY0LDI0OTMwLDI4NDU5LDMyODk0LDMyODk3LDMyODk4LDMyOTAxLDMyOTA0LDMyOTA2LDMyOTA5LDMyOTEwLDMyOTExLDMyOTEyLDMyOTEzLDMyOTE0LDMyOTE2LDMyOTE3LDMyOTE5LDMyOTIxLDMyOTI2LDMyOTMxLDMyOTM0LDMyOTM1LDMyOTM2LDMyOTQwLDMyOTQ0LDMyOTQ3LDMyOTQ5LDMyOTUwLDMyOTUyLDMyOTUzLDMyOTU1LDMyOTY1LDMyOTY3LDMyOTY4LDMyOTY5LDMyOTcwLDMyOTcxLDMyOTc1LDMyOTc2LDMyOTc3LDMyOTc4LDMyOTc5LDMyOTgwLDMyOTgxLDMyOTg0LDMyOTkxLDMyOTkyLDMyOTk0LDMyOTk1LDMyOTk4LDMzMDA2LDMzMDEzLDMzMDE1LDMzMDE3LDMzMDE5LDMzMDIyLDMzMDIzLDMzMDI0LDMzMDI1LDMzMDI3LDMzMDI4LDMzMDI5LDMzMDMxLDMzMDMyLDMzMDM1LDMzMDM2LDMzMDQ1LDMzMDQ3LDMzMDQ5LDMzMDUxLDMzMDUyLDMzMDUzLDMzMDU1LDMzMDU2LDMzMDU3LDMzMDU4LDMzMDU5LDMzMDYwLDMzMDYxLDMzMDYyLDMzMDYzLDMzMDY0LDMzMDY1LDMzMDY2LDMzMDY3LDMzMDY5LDMzMDcwLDMzMDcyLDMzMDc1LDMzMDc2LDMzMDc3LDMzMDc5LDMzMDgxLDMzMDgyLDMzMDgzLDMzMDg0LDMzMDg1LDMzMDg3LDM1ODgxLDMzNDI2LDMzNTc5LDMwNDUwLDI3NjY3LDI0NTM3LDMzNzI1LDI5NDgzLDMzNTQxLDM4MTcwLDI3NjExLDMwNjgzLDM4MDg2LDIxMzU5LDMzNTM4LDIwODgyLDI0MTI1LDM1OTgwLDM2MTUyLDIwMDQwLDI5NjExLDI2NTIyLDI2NzU3LDM3MjM4LDM4NjY1LDI5MDI4LDI3ODA5LDMwNDczLDIzMTg2LDM4MjA5LDI3NTk5LDMyNjU0LDI2MTUxLDIzNTA0LDIyOTY5LDIzMTk0LDM4Mzc2LDM4MzkxLDIwMjA0LDMzODA0LDMzOTQ1LDI3MzA4LDMwNDMxLDM4MTkyLDI5NDY3LDI2NzkwLDIzMzkxLDMwNTExLDM3Mjc0LDM4NzUzLDMxOTY0LDM2ODU1LDM1ODY4LDI0MzU3LDMxODU5LDMxMTkyLDM1MjY5LDI3ODUyLDM0NTg4LDIzNDk0LDI0MTMwLDI2ODI1LDMwNDk2LDMyNTAxLDIwODg1LDIwODEzLDIxMTkzLDIzMDgxLDMyNTE3LDM4NzU0LDMzNDk1LDI1NTUxLDMwNTk2LDM0MjU2LDMxMTg2LDI4MjE4LDI0MjE3LDIyOTM3LDM0MDY1LDI4NzgxLDI3NjY1LDI1Mjc5LDMwMzk5LDI1OTM1LDI0NzUxLDM4Mzk3LDI2MTI2LDM0NzE5LDQwNDgzLDM4MTI1LDIxNTE3LDIxNjI5LDM1ODg0LDI1NzIwLDMzMDg4LDMzMDg5LDMzMDkwLDMzMDkxLDMzMDkyLDMzMDkzLDMzMDk1LDMzMDk3LDMzMTAxLDMzMTAyLDMzMTAzLDMzMTA2LDMzMTEwLDMzMTExLDMzMTEyLDMzMTE1LDMzMTE2LDMzMTE3LDMzMTE4LDMzMTE5LDMzMTIxLDMzMTIyLDMzMTIzLDMzMTI0LDMzMTI2LDMzMTI4LDMzMTMwLDMzMTMxLDMzMTMyLDMzMTM1LDMzMTM4LDMzMTM5LDMzMTQxLDMzMTQyLDMzMTQzLDMzMTQ0LDMzMTUzLDMzMTU1LDMzMTU2LDMzMTU3LDMzMTU4LDMzMTU5LDMzMTYxLDMzMTYzLDMzMTY0LDMzMTY1LDMzMTY2LDMzMTY4LDMzMTcwLDMzMTcxLDMzMTcyLDMzMTczLDMzMTc0LDMzMTc1LDMzMTc3LDMzMTc4LDMzMTgyLDMzMTgzLDMzMTg0LDMzMTg1LDMzMTg2LDMzMTg4LDMzMTg5LDMzMTkxLDMzMTkzLDMzMTk1LDMzMTk2LDMzMTk3LDMzMTk4LDMzMTk5LDMzMjAwLDMzMjAxLDMzMjAyLDMzMjA0LDMzMjA1LDMzMjA2LDMzMjA3LDMzMjA4LDMzMjA5LDMzMjEyLDMzMjEzLDMzMjE0LDMzMjE1LDMzMjIwLDMzMjIxLDMzMjIzLDMzMjI0LDMzMjI1LDMzMjI3LDMzMjI5LDMzMjMwLDMzMjMxLDMzMjMyLDMzMjMzLDMzMjM0LDMzMjM1LDI1NzIxLDM0MzIxLDI3MTY5LDMzMTgwLDMwOTUyLDI1NzA1LDM5NzY0LDI1MjczLDI2NDExLDMzNzA3LDIyNjk2LDQwNjY0LDI3ODE5LDI4NDQ4LDIzNTE4LDM4NDc2LDM1ODUxLDI5Mjc5LDI2NTc2LDI1Mjg3LDI5MjgxLDIwMTM3LDIyOTgyLDI3NTk3LDIyNjc1LDI2Mjg2LDI0MTQ5LDIxMjE1LDI0OTE3LDI2NDA4LDMwNDQ2LDMwNTY2LDI5Mjg3LDMxMzAyLDI1MzQzLDIxNzM4LDIxNTg0LDM4MDQ4LDM3MDI3LDIzMDY4LDMyNDM1LDI3NjcwLDIwMDM1LDIyOTAyLDMyNzg0LDIyODU2LDIxMzM1LDMwMDA3LDM4NTkwLDIyMjE4LDI1Mzc2LDMzMDQxLDI0NzAwLDM4MzkzLDI4MTE4LDIxNjAyLDM5Mjk3LDIwODY5LDIzMjczLDMzMDIxLDIyOTU4LDM4Njc1LDIwNTIyLDI3ODc3LDIzNjEyLDI1MzExLDIwMzIwLDIxMzExLDMzMTQ3LDM2ODcwLDI4MzQ2LDM0MDkxLDI1Mjg4LDI0MTgwLDMwOTEwLDI1NzgxLDI1NDY3LDI0NTY1LDIzMDY0LDM3MjQ3LDQwNDc5LDIzNjE1LDI1NDIzLDMyODM0LDIzNDIxLDIxODcwLDM4MjE4LDM4MjIxLDI4MDM3LDI0NzQ0LDI2NTkyLDI5NDA2LDIwOTU3LDIzNDI1LDMzMjM2LDMzMjM3LDMzMjM4LDMzMjM5LDMzMjQwLDMzMjQxLDMzMjQyLDMzMjQzLDMzMjQ0LDMzMjQ1LDMzMjQ2LDMzMjQ3LDMzMjQ4LDMzMjQ5LDMzMjUwLDMzMjUyLDMzMjUzLDMzMjU0LDMzMjU2LDMzMjU3LDMzMjU5LDMzMjYyLDMzMjYzLDMzMjY0LDMzMjY1LDMzMjY2LDMzMjY5LDMzMjcwLDMzMjcxLDMzMjcyLDMzMjczLDMzMjc0LDMzMjc3LDMzMjc5LDMzMjgzLDMzMjg3LDMzMjg4LDMzMjg5LDMzMjkwLDMzMjkxLDMzMjk0LDMzMjk1LDMzMjk3LDMzMjk5LDMzMzAxLDMzMzAyLDMzMzAzLDMzMzA0LDMzMzA1LDMzMzA2LDMzMzA5LDMzMzEyLDMzMzE2LDMzMzE3LDMzMzE4LDMzMzE5LDMzMzIxLDMzMzI2LDMzMzMwLDMzMzM4LDMzMzQwLDMzMzQxLDMzMzQzLDMzMzQ0LDMzMzQ1LDMzMzQ2LDMzMzQ3LDMzMzQ5LDMzMzUwLDMzMzUyLDMzMzU0LDMzMzU2LDMzMzU3LDMzMzU4LDMzMzYwLDMzMzYxLDMzMzYyLDMzMzYzLDMzMzY0LDMzMzY1LDMzMzY2LDMzMzY3LDMzMzY5LDMzMzcxLDMzMzcyLDMzMzczLDMzMzc0LDMzMzc2LDMzMzc3LDMzMzc4LDMzMzc5LDMzMzgwLDMzMzgxLDMzMzgyLDMzMzgzLDMzMzg1LDI1MzE5LDI3ODcwLDI5Mjc1LDI1MTk3LDM4MDYyLDMyNDQ1LDMzMDQzLDI3OTg3LDIwODkyLDI0MzI0LDIyOTAwLDIxMTYyLDI0NTk0LDIyODk5LDI2MjYyLDM0Mzg0LDMwMTExLDI1Mzg2LDI1MDYyLDMxOTgzLDM1ODM0LDIxNzM0LDI3NDMxLDQwNDg1LDI3NTcyLDM0MjYxLDIxNTg5LDIwNTk4LDI3ODEyLDIxODY2LDM2Mjc2LDI5MjI4LDI0MDg1LDI0NTk3LDI5NzUwLDI1MjkzLDI1NDkwLDI5MjYwLDI0NDcyLDI4MjI3LDI3OTY2LDI1ODU2LDI4NTA0LDMwNDI0LDMwOTI4LDMwNDYwLDMwMDM2LDIxMDI4LDIxNDY3LDIwMDUxLDI0MjIyLDI2MDQ5LDMyODEwLDMyOTgyLDI1MjQzLDIxNjM4LDIxMDMyLDI4ODQ2LDM0OTU3LDM2MzA1LDI3ODczLDIxNjI0LDMyOTg2LDIyNTIxLDM1MDYwLDM2MTgwLDM4NTA2LDM3MTk3LDIwMzI5LDI3ODAzLDIxOTQzLDMwNDA2LDMwNzY4LDI1MjU2LDI4OTIxLDI4NTU4LDI0NDI5LDM0MDI4LDI2ODQyLDMwODQ0LDMxNzM1LDMzMTkyLDI2Mzc5LDQwNTI3LDI1NDQ3LDMwODk2LDIyMzgzLDMwNzM4LDM4NzEzLDI1MjA5LDI1MjU5LDIxMTI4LDI5NzQ5LDI3NjA3LDMzMzg2LDMzMzg3LDMzMzg4LDMzMzg5LDMzMzkzLDMzMzk3LDMzMzk4LDMzMzk5LDMzNDAwLDMzNDAzLDMzNDA0LDMzNDA4LDMzNDA5LDMzNDExLDMzNDEzLDMzNDE0LDMzNDE1LDMzNDE3LDMzNDIwLDMzNDI0LDMzNDI3LDMzNDI4LDMzNDI5LDMzNDMwLDMzNDM0LDMzNDM1LDMzNDM4LDMzNDQwLDMzNDQyLDMzNDQzLDMzNDQ3LDMzNDU4LDMzNDYxLDMzNDYyLDMzNDY2LDMzNDY3LDMzNDY4LDMzNDcxLDMzNDcyLDMzNDc0LDMzNDc1LDMzNDc3LDMzNDc4LDMzNDgxLDMzNDg4LDMzNDk0LDMzNDk3LDMzNDk4LDMzNTAxLDMzNTA2LDMzNTExLDMzNTEyLDMzNTEzLDMzNTE0LDMzNTE2LDMzNTE3LDMzNTE4LDMzNTIwLDMzNTIyLDMzNTIzLDMzNTI1LDMzNTI2LDMzNTI4LDMzNTMwLDMzNTMyLDMzNTMzLDMzNTM0LDMzNTM1LDMzNTM2LDMzNTQ2LDMzNTQ3LDMzNTQ5LDMzNTUyLDMzNTU0LDMzNTU1LDMzNTU4LDMzNTYwLDMzNTYxLDMzNTY1LDMzNTY2LDMzNTY3LDMzNTY4LDMzNTY5LDMzNTcwLDMzNTcxLDMzNTcyLDMzNTczLDMzNTc0LDMzNTc3LDMzNTc4LDMzNTgyLDMzNTg0LDMzNTg2LDMzNTkxLDMzNTk1LDMzNTk3LDIxODYwLDMzMDg2LDMwMTMwLDMwMzgyLDIxMzA1LDMwMTc0LDIwNzMxLDIzNjE3LDM1NjkyLDMxNjg3LDIwNTU5LDI5MjU1LDM5NTc1LDM5MTI4LDI4NDE4LDI5OTIyLDMxMDgwLDI1NzM1LDMwNjI5LDI1MzQwLDM5MDU3LDM2MTM5LDIxNjk3LDMyODU2LDIwMDUwLDIyMzc4LDMzNTI5LDMzODA1LDI0MTc5LDIwOTczLDI5OTQyLDM1NzgwLDIzNjMxLDIyMzY5LDI3OTAwLDM5MDQ3LDIzMTEwLDMwNzcyLDM5NzQ4LDM2ODQzLDMxODkzLDIxMDc4LDI1MTY5LDM4MTM4LDIwMTY2LDMzNjcwLDMzODg5LDMzNzY5LDMzOTcwLDIyNDg0LDI2NDIwLDIyMjc1LDI2MjIyLDI4MDA2LDM1ODg5LDI2MzMzLDI4Njg5LDI2Mzk5LDI3NDUwLDI2NjQ2LDI1MTE0LDIyOTcxLDE5OTcxLDIwOTMyLDI4NDIyLDI2NTc4LDI3NzkxLDIwODU0LDI2ODI3LDIyODU1LDI3NDk1LDMwMDU0LDIzODIyLDMzMDQwLDQwNzg0LDI2MDcxLDMxMDQ4LDMxMDQxLDM5NTY5LDM2MjE1LDIzNjgyLDIwMDYyLDIwMjI1LDIxNTUxLDIyODY1LDMwNzMyLDIyMTIwLDI3NjY4LDM2ODA0LDI0MzIzLDI3NzczLDI3ODc1LDM1NzU1LDI1NDg4LDMzNTk4LDMzNTk5LDMzNjAxLDMzNjAyLDMzNjA0LDMzNjA1LDMzNjA4LDMzNjEwLDMzNjExLDMzNjEyLDMzNjEzLDMzNjE0LDMzNjE5LDMzNjIxLDMzNjIyLDMzNjIzLDMzNjI0LDMzNjI1LDMzNjI5LDMzNjM0LDMzNjQ4LDMzNjQ5LDMzNjUwLDMzNjUxLDMzNjUyLDMzNjUzLDMzNjU0LDMzNjU3LDMzNjU4LDMzNjYyLDMzNjYzLDMzNjY0LDMzNjY1LDMzNjY2LDMzNjY3LDMzNjY4LDMzNjcxLDMzNjcyLDMzNjc0LDMzNjc1LDMzNjc2LDMzNjc3LDMzNjc5LDMzNjgwLDMzNjgxLDMzNjg0LDMzNjg1LDMzNjg2LDMzNjg3LDMzNjg5LDMzNjkwLDMzNjkzLDMzNjk1LDMzNjk3LDMzNjk4LDMzNjk5LDMzNzAwLDMzNzAxLDMzNzAyLDMzNzAzLDMzNzA4LDMzNzA5LDMzNzEwLDMzNzExLDMzNzE3LDMzNzIzLDMzNzI2LDMzNzI3LDMzNzMwLDMzNzMxLDMzNzMyLDMzNzM0LDMzNzM2LDMzNzM3LDMzNzM5LDMzNzQxLDMzNzQyLDMzNzQ0LDMzNzQ1LDMzNzQ2LDMzNzQ3LDMzNzQ5LDMzNzUxLDMzNzUzLDMzNzU0LDMzNzU1LDMzNzU4LDMzNzYyLDMzNzYzLDMzNzY0LDMzNzY2LDMzNzY3LDMzNzY4LDMzNzcxLDMzNzcyLDMzNzczLDI0Njg4LDI3OTY1LDI5MzAxLDI1MTkwLDM4MDMwLDM4MDg1LDIxMzE1LDM2ODAxLDMxNjE0LDIwMTkxLDM1ODc4LDIwMDk0LDQwNjYwLDM4MDY1LDM4MDY3LDIxMDY5LDI4NTA4LDM2OTYzLDI3OTczLDM1ODkyLDIyNTQ1LDIzODg0LDI3NDI0LDI3NDY1LDI2NTM4LDIxNTk1LDMzMTA4LDMyNjUyLDIyNjgxLDM0MTAzLDI0Mzc4LDI1MjUwLDI3MjA3LDM4MjAxLDI1OTcwLDI0NzA4LDI2NzI1LDMwNjMxLDIwMDUyLDIwMzkyLDI0MDM5LDM4ODA4LDI1NzcyLDMyNzI4LDIzNzg5LDIwNDMxLDMxMzczLDIwOTk5LDMzNTQwLDE5OTg4LDI0NjIzLDMxMzYzLDM4MDU0LDIwNDA1LDIwMTQ2LDMxMjA2LDI5NzQ4LDIxMjIwLDMzNDY1LDI1ODEwLDMxMTY1LDIzNTE3LDI3Nzc3LDM4NzM4LDM2NzMxLDI3NjgyLDIwNTQyLDIxMzc1LDI4MTY1LDI1ODA2LDI2MjI4LDI3Njk2LDI0NzczLDM5MDMxLDM1ODMxLDI0MTk4LDI5NzU2LDMxMzUxLDMxMTc5LDE5OTkyLDM3MDQxLDI5Njk5LDI3NzE0LDIyMjM0LDM3MTk1LDI3ODQ1LDM2MjM1LDIxMzA2LDM0NTAyLDI2MzU0LDM2NTI3LDIzNjI0LDM5NTM3LDI4MTkyLDMzNzc0LDMzNzc1LDMzNzc5LDMzNzgwLDMzNzgxLDMzNzgyLDMzNzgzLDMzNzg2LDMzNzg3LDMzNzg4LDMzNzkwLDMzNzkxLDMzNzkyLDMzNzk0LDMzNzk3LDMzNzk5LDMzODAwLDMzODAxLDMzODAyLDMzODA4LDMzODEwLDMzODExLDMzODEyLDMzODEzLDMzODE0LDMzODE1LDMzODE3LDMzODE4LDMzODE5LDMzODIyLDMzODIzLDMzODI0LDMzODI1LDMzODI2LDMzODI3LDMzODMzLDMzODM0LDMzODM1LDMzODM2LDMzODM3LDMzODM4LDMzODM5LDMzODQwLDMzODQyLDMzODQzLDMzODQ0LDMzODQ1LDMzODQ2LDMzODQ3LDMzODQ5LDMzODUwLDMzODUxLDMzODU0LDMzODU1LDMzODU2LDMzODU3LDMzODU4LDMzODU5LDMzODYwLDMzODYxLDMzODYzLDMzODY0LDMzODY1LDMzODY2LDMzODY3LDMzODY4LDMzODY5LDMzODcwLDMzODcxLDMzODcyLDMzODc0LDMzODc1LDMzODc2LDMzODc3LDMzODc4LDMzODgwLDMzODg1LDMzODg2LDMzODg3LDMzODg4LDMzODkwLDMzODkyLDMzODkzLDMzODk0LDMzODk1LDMzODk2LDMzODk4LDMzOTAyLDMzOTAzLDMzOTA0LDMzOTA2LDMzOTA4LDMzOTExLDMzOTEzLDMzOTE1LDMzOTE2LDIxNDYyLDIzMDk0LDQwODQzLDM2MjU5LDIxNDM1LDIyMjgwLDM5MDc5LDI2NDM1LDM3Mjc1LDI3ODQ5LDIwODQwLDMwMTU0LDI1MzMxLDI5MzU2LDIxMDQ4LDIxMTQ5LDMyNTcwLDI4ODIwLDMwMjY0LDIxMzY0LDQwNTIyLDI3MDYzLDMwODMwLDM4NTkyLDM1MDMzLDMyNjc2LDI4OTgyLDI5MTIzLDIwODczLDI2NTc5LDI5OTI0LDIyNzU2LDI1ODgwLDIyMTk5LDM1NzUzLDM5Mjg2LDI1MjAwLDMyNDY5LDI0ODI1LDI4OTA5LDIyNzY0LDIwMTYxLDIwMTU0LDI0NTI1LDM4ODg3LDIwMjE5LDM1NzQ4LDIwOTk1LDIyOTIyLDMyNDI3LDI1MTcyLDIwMTczLDI2MDg1LDI1MTAyLDMzNTkyLDMzOTkzLDMzNjM1LDM0NzAxLDI5MDc2LDI4MzQyLDIzNDgxLDMyNDY2LDIwODg3LDI1NTQ1LDI2NTgwLDMyOTA1LDMzNTkzLDM0ODM3LDIwNzU0LDIzNDE4LDIyOTE0LDM2Nzg1LDIwMDgzLDI3NzQxLDIwODM3LDM1MTA5LDM2NzE5LDM4NDQ2LDM0MTIyLDI5NzkwLDM4MTYwLDM4Mzg0LDI4MDcwLDMzNTA5LDI0MzY5LDI1NzQ2LDI3OTIyLDMzODMyLDMzMTM0LDQwMTMxLDIyNjIyLDM2MTg3LDE5OTc3LDIxNDQxLDMzOTE3LDMzOTE4LDMzOTE5LDMzOTIwLDMzOTIxLDMzOTIzLDMzOTI0LDMzOTI1LDMzOTI2LDMzOTMwLDMzOTMzLDMzOTM1LDMzOTM2LDMzOTM3LDMzOTM4LDMzOTM5LDMzOTQwLDMzOTQxLDMzOTQyLDMzOTQ0LDMzOTQ2LDMzOTQ3LDMzOTQ5LDMzOTUwLDMzOTUxLDMzOTUyLDMzOTU0LDMzOTU1LDMzOTU2LDMzOTU3LDMzOTU4LDMzOTU5LDMzOTYwLDMzOTYxLDMzOTYyLDMzOTYzLDMzOTY0LDMzOTY1LDMzOTY2LDMzOTY4LDMzOTY5LDMzOTcxLDMzOTczLDMzOTc0LDMzOTc1LDMzOTc5LDMzOTgwLDMzOTgyLDMzOTg0LDMzOTg2LDMzOTg3LDMzOTg5LDMzOTkwLDMzOTkxLDMzOTkyLDMzOTk1LDMzOTk2LDMzOTk4LDMzOTk5LDM0MDAyLDM0MDA0LDM0MDA1LDM0MDA3LDM0MDA4LDM0MDA5LDM0MDEwLDM0MDExLDM0MDEyLDM0MDE0LDM0MDE3LDM0MDE4LDM0MDIwLDM0MDIzLDM0MDI0LDM0MDI1LDM0MDI2LDM0MDI3LDM0MDI5LDM0MDMwLDM0MDMxLDM0MDMzLDM0MDM0LDM0MDM1LDM0MDM2LDM0MDM3LDM0MDM4LDM0MDM5LDM0MDQwLDM0MDQxLDM0MDQyLDM0MDQzLDM0MDQ1LDM0MDQ2LDM0MDQ4LDM0MDQ5LDM0MDUwLDIwMjU0LDI1OTU1LDI2NzA1LDIxOTcxLDIwMDA3LDI1NjIwLDM5NTc4LDI1MTk1LDIzMjM0LDI5NzkxLDMzMzk0LDI4MDczLDI2ODYyLDIwNzExLDMzNjc4LDMwNzIyLDI2NDMyLDIxMDQ5LDI3ODAxLDMyNDMzLDIwNjY3LDIxODYxLDI5MDIyLDMxNTc5LDI2MTk0LDI5NjQyLDMzNTE1LDI2NDQxLDIzNjY1LDIxMDI0LDI5MDUzLDM0OTIzLDM4Mzc4LDM4NDg1LDI1Nzk3LDM2MTkzLDMzMjAzLDIxODkyLDI3NzMzLDI1MTU5LDMyNTU4LDIyNjc0LDIwMjYwLDIxODMwLDM2MTc1LDI2MTg4LDE5OTc4LDIzNTc4LDM1MDU5LDI2Nzg2LDI1NDIyLDMxMjQ1LDI4OTAzLDMzNDIxLDIxMjQyLDM4OTAyLDIzNTY5LDIxNzM2LDM3MDQ1LDMyNDYxLDIyODgyLDM2MTcwLDM0NTAzLDMzMjkyLDMzMjkzLDM2MTk4LDI1NjY4LDIzNTU2LDI0OTEzLDI4MDQxLDMxMDM4LDM1Nzc0LDMwNzc1LDMwMDAzLDIxNjI3LDIwMjgwLDM2NTIzLDI4MTQ1LDIzMDcyLDMyNDUzLDMxMDcwLDI3Nzg0LDIzNDU3LDIzMTU4LDI5OTc4LDMyOTU4LDI0OTEwLDI4MTgzLDIyNzY4LDI5OTgzLDI5OTg5LDI5Mjk4LDIxMzE5LDMyNDk5LDM0MDUxLDM0MDUyLDM0MDUzLDM0MDU0LDM0MDU1LDM0MDU2LDM0MDU3LDM0MDU4LDM0MDU5LDM0MDYxLDM0MDYyLDM0MDYzLDM0MDY0LDM0MDY2LDM0MDY4LDM0MDY5LDM0MDcwLDM0MDcyLDM0MDczLDM0MDc1LDM0MDc2LDM0MDc3LDM0MDc4LDM0MDgwLDM0MDgyLDM0MDgzLDM0MDg0LDM0MDg1LDM0MDg2LDM0MDg3LDM0MDg4LDM0MDg5LDM0MDkwLDM0MDkzLDM0MDk0LDM0MDk1LDM0MDk2LDM0MDk3LDM0MDk4LDM0MDk5LDM0MTAwLDM0MTAxLDM0MTAyLDM0MTEwLDM0MTExLDM0MTEyLDM0MTEzLDM0MTE0LDM0MTE2LDM0MTE3LDM0MTE4LDM0MTE5LDM0MTIzLDM0MTI0LDM0MTI1LDM0MTI2LDM0MTI3LDM0MTI4LDM0MTI5LDM0MTMwLDM0MTMxLDM0MTMyLDM0MTMzLDM0MTM1LDM0MTM2LDM0MTM4LDM0MTM5LDM0MTQwLDM0MTQxLDM0MTQzLDM0MTQ0LDM0MTQ1LDM0MTQ2LDM0MTQ3LDM0MTQ5LDM0MTUwLDM0MTUxLDM0MTUzLDM0MTU0LDM0MTU1LDM0MTU2LDM0MTU3LDM0MTU4LDM0MTU5LDM0MTYwLDM0MTYxLDM0MTYzLDM0MTY1LDM0MTY2LDM0MTY3LDM0MTY4LDM0MTcyLDM0MTczLDM0MTc1LDM0MTc2LDM0MTc3LDMwNDY1LDMwNDI3LDIxMDk3LDMyOTg4LDIyMzA3LDI0MDcyLDIyODMzLDI5NDIyLDI2MDQ1LDI4Mjg3LDM1Nzk5LDIzNjA4LDM0NDE3LDIxMzEzLDMwNzA3LDI1MzQyLDI2MTAyLDIwMTYwLDM5MTM1LDM0NDMyLDIzNDU0LDM1NzgyLDIxNDkwLDMwNjkwLDIwMzUxLDIzNjMwLDM5NTQyLDIyOTg3LDI0MzM1LDMxMDM0LDIyNzYzLDE5OTkwLDI2NjIzLDIwMTA3LDI1MzI1LDM1NDc1LDM2ODkzLDIxMTgzLDI2MTU5LDIxOTgwLDIyMTI0LDM2ODY2LDIwMTgxLDIwMzY1LDM3MzIyLDM5MjgwLDI3NjYzLDI0MDY2LDI0NjQzLDIzNDYwLDM1MjcwLDM1Nzk3LDI1OTEwLDI1MTYzLDM5MzE4LDIzNDMyLDIzNTUxLDI1NDgwLDIxODA2LDIxNDYzLDMwMjQ2LDIwODYxLDM0MDkyLDI2NTMwLDI2ODAzLDI3NTMwLDI1MjM0LDM2NzU1LDIxNDYwLDMzMjk4LDI4MTEzLDMwMDk1LDIwMDcwLDM2MTc0LDIzNDA4LDI5MDg3LDM0MjIzLDI2MjU3LDI2MzI5LDMyNjI2LDM0NTYwLDQwNjUzLDQwNzM2LDIzNjQ2LDI2NDE1LDM2ODQ4LDI2NjQxLDI2NDYzLDI1MTAxLDMxNDQ2LDIyNjYxLDI0MjQ2LDI1OTY4LDI4NDY1LDM0MTc4LDM0MTc5LDM0MTgyLDM0MTg0LDM0MTg1LDM0MTg2LDM0MTg3LDM0MTg4LDM0MTg5LDM0MTkwLDM0MTkyLDM0MTkzLDM0MTk0LDM0MTk1LDM0MTk2LDM0MTk3LDM0MTk4LDM0MTk5LDM0MjAwLDM0MjAxLDM0MjAyLDM0MjA1LDM0MjA2LDM0MjA3LDM0MjA4LDM0MjA5LDM0MjEwLDM0MjExLDM0MjEzLDM0MjE0LDM0MjE1LDM0MjE3LDM0MjE5LDM0MjIwLDM0MjIxLDM0MjI1LDM0MjI2LDM0MjI3LDM0MjI4LDM0MjI5LDM0MjMwLDM0MjMyLDM0MjM0LDM0MjM1LDM0MjM2LDM0MjM3LDM0MjM4LDM0MjM5LDM0MjQwLDM0MjQyLDM0MjQzLDM0MjQ0LDM0MjQ1LDM0MjQ2LDM0MjQ3LDM0MjQ4LDM0MjUwLDM0MjUxLDM0MjUyLDM0MjUzLDM0MjU0LDM0MjU3LDM0MjU4LDM0MjYwLDM0MjYyLDM0MjYzLDM0MjY0LDM0MjY1LDM0MjY2LDM0MjY3LDM0MjY5LDM0MjcwLDM0MjcxLDM0MjcyLDM0MjczLDM0Mjc0LDM0Mjc1LDM0Mjc3LDM0Mjc4LDM0Mjc5LDM0MjgwLDM0MjgyLDM0MjgzLDM0Mjg0LDM0Mjg1LDM0Mjg2LDM0Mjg3LDM0Mjg4LDM0Mjg5LDM0MjkwLDM0MjkxLDM0MjkyLDM0MjkzLDM0Mjk0LDM0Mjk1LDM0Mjk2LDI0NjYxLDIxMDQ3LDMyNzgxLDI1Njg0LDM0OTI4LDI5OTkzLDI0MDY5LDI2NjQzLDI1MzMyLDM4Njg0LDIxNDUyLDI5MjQ1LDM1ODQxLDI3NzAwLDMwNTYxLDMxMjQ2LDIxNTUwLDMwNjM2LDM5MDM0LDMzMzA4LDM1ODI4LDMwODA1LDI2Mzg4LDI4ODY1LDI2MDMxLDI1NzQ5LDIyMDcwLDI0NjA1LDMxMTY5LDIxNDk2LDE5OTk3LDI3NTE1LDMyOTAyLDIzNTQ2LDIxOTg3LDIyMjM1LDIwMjgyLDIwMjg0LDM5MjgyLDI0MDUxLDI2NDk0LDMyODI0LDI0NTc4LDM5MDQyLDM2ODY1LDIzNDM1LDM1NzcyLDM1ODI5LDI1NjI4LDMzMzY4LDI1ODIyLDIyMDEzLDMzNDg3LDM3MjIxLDIwNDM5LDMyMDMyLDM2ODk1LDMxOTAzLDIwNzIzLDIyNjA5LDI4MzM1LDIzNDg3LDM1Nzg1LDMyODk5LDM3MjQwLDMzOTQ4LDMxNjM5LDM0NDI5LDM4NTM5LDM4NTQzLDMyNDg1LDM5NjM1LDMwODYyLDIzNjgxLDMxMzE5LDM2OTMwLDM4NTY3LDMxMDcxLDIzMzg1LDI1NDM5LDMxNDk5LDM0MDAxLDI2Nzk3LDIxNzY2LDMyNTUzLDI5NzEyLDMyMDM0LDM4MTQ1LDI1MTUyLDIyNjA0LDIwMTgyLDIzNDI3LDIyOTA1LDIyNjEyLDM0Mjk3LDM0Mjk4LDM0MzAwLDM0MzAxLDM0MzAyLDM0MzA0LDM0MzA1LDM0MzA2LDM0MzA3LDM0MzA4LDM0MzEwLDM0MzExLDM0MzEyLDM0MzEzLDM0MzE0LDM0MzE1LDM0MzE2LDM0MzE3LDM0MzE4LDM0MzE5LDM0MzIwLDM0MzIyLDM0MzIzLDM0MzI0LDM0MzI1LDM0MzI3LDM0MzI4LDM0MzI5LDM0MzMwLDM0MzMxLDM0MzMyLDM0MzMzLDM0MzM0LDM0MzM1LDM0MzM2LDM0MzM3LDM0MzM4LDM0MzM5LDM0MzQwLDM0MzQxLDM0MzQyLDM0MzQ0LDM0MzQ2LDM0MzQ3LDM0MzQ4LDM0MzQ5LDM0MzUwLDM0MzUxLDM0MzUyLDM0MzUzLDM0MzU0LDM0MzU1LDM0MzU2LDM0MzU3LDM0MzU4LDM0MzU5LDM0MzYxLDM0MzYyLDM0MzYzLDM0MzY1LDM0MzY2LDM0MzY3LDM0MzY4LDM0MzY5LDM0MzcwLDM0MzcxLDM0MzcyLDM0MzczLDM0Mzc0LDM0Mzc1LDM0Mzc2LDM0Mzc3LDM0Mzc4LDM0Mzc5LDM0MzgwLDM0Mzg2LDM0Mzg3LDM0Mzg5LDM0MzkwLDM0MzkxLDM0MzkyLDM0MzkzLDM0Mzk1LDM0Mzk2LDM0Mzk3LDM0Mzk5LDM0NDAwLDM0NDAxLDM0NDAzLDM0NDA0LDM0NDA1LDM0NDA2LDM0NDA3LDM0NDA4LDM0NDA5LDM0NDEwLDI5NTQ5LDI1Mzc0LDM2NDI3LDM2MzY3LDMyOTc0LDMzNDkyLDI1MjYwLDIxNDg4LDI3ODg4LDM3MjE0LDIyODI2LDI0NTc3LDI3NzYwLDIyMzQ5LDI1Njc0LDM2MTM4LDMwMjUxLDI4MzkzLDIyMzYzLDI3MjY0LDMwMTkyLDI4NTI1LDM1ODg1LDM1ODQ4LDIyMzc0LDI3NjMxLDM0OTYyLDMwODk5LDI1NTA2LDIxNDk3LDI4ODQ1LDI3NzQ4LDIyNjE2LDI1NjQyLDIyNTMwLDI2ODQ4LDMzMTc5LDIxNzc2LDMxOTU4LDIwNTA0LDM2NTM4LDI4MTA4LDM2MjU1LDI4OTA3LDI1NDg3LDI4MDU5LDI4MzcyLDMyNDg2LDMzNzk2LDI2NjkxLDM2ODY3LDI4MTIwLDM4NTE4LDM1NzUyLDIyODcxLDI5MzA1LDM0Mjc2LDMzMTUwLDMwMTQwLDM1NDY2LDI2Nzk5LDIxMDc2LDM2Mzg2LDM4MTYxLDI1NTUyLDM5MDY0LDM2NDIwLDIxODg0LDIwMzA3LDI2MzY3LDIyMTU5LDI0Nzg5LDI4MDUzLDIxMDU5LDIzNjI1LDIyODI1LDI4MTU1LDIyNjM1LDMwMDAwLDI5OTgwLDI0Njg0LDMzMzAwLDMzMDk0LDI1MzYxLDI2NDY1LDM2ODM0LDMwNTIyLDM2MzM5LDM2MTQ4LDM4MDgxLDI0MDg2LDIxMzgxLDIxNTQ4LDI4ODY3LDM0NDEzLDM0NDE1LDM0NDE2LDM0NDE4LDM0NDE5LDM0NDIwLDM0NDIxLDM0NDIyLDM0NDIzLDM0NDI0LDM0NDM1LDM0NDM2LDM0NDM3LDM0NDM4LDM0NDM5LDM0NDQwLDM0NDQxLDM0NDQ2LDM0NDQ3LDM0NDQ4LDM0NDQ5LDM0NDUwLDM0NDUyLDM0NDU0LDM0NDU1LDM0NDU2LDM0NDU3LDM0NDU4LDM0NDU5LDM0NDYyLDM0NDYzLDM0NDY0LDM0NDY1LDM0NDY2LDM0NDY5LDM0NDcwLDM0NDc1LDM0NDc3LDM0NDc4LDM0NDgyLDM0NDgzLDM0NDg3LDM0NDg4LDM0NDg5LDM0NDkxLDM0NDkyLDM0NDkzLDM0NDk0LDM0NDk1LDM0NDk3LDM0NDk4LDM0NDk5LDM0NTAxLDM0NTA0LDM0NTA4LDM0NTA5LDM0NTE0LDM0NTE1LDM0NTE3LDM0NTE4LDM0NTE5LDM0NTIyLDM0NTI0LDM0NTI1LDM0NTI4LDM0NTI5LDM0NTMwLDM0NTMxLDM0NTMzLDM0NTM0LDM0NTM1LDM0NTM2LDM0NTM4LDM0NTM5LDM0NTQwLDM0NTQzLDM0NTQ5LDM0NTUwLDM0NTUxLDM0NTU0LDM0NTU1LDM0NTU2LDM0NTU3LDM0NTU5LDM0NTYxLDM0NTY0LDM0NTY1LDM0NTY2LDM0NTcxLDM0NTcyLDM0NTc0LDM0NTc1LDM0NTc2LDM0NTc3LDM0NTgwLDM0NTgyLDI3NzEyLDI0MzExLDIwNTcyLDIwMTQxLDI0MjM3LDI1NDAyLDMzMzUxLDM2ODkwLDI2NzA0LDM3MjMwLDMwNjQzLDIxNTE2LDM4MTA4LDI0NDIwLDMxNDYxLDI2NzQyLDI1NDEzLDMxNTcwLDMyNDc5LDMwMTcxLDIwNTk5LDI1MjM3LDIyODM2LDM2ODc5LDIwOTg0LDMxMTcxLDMxMzYxLDIyMjcwLDI0NDY2LDM2ODg0LDI4MDM0LDIzNjQ4LDIyMzAzLDIxNTIwLDIwODIwLDI4MjM3LDIyMjQyLDI1NTEyLDM5MDU5LDMzMTUxLDM0NTgxLDM1MTE0LDM2ODY0LDIxNTM0LDIzNjYzLDMzMjE2LDI1MzAyLDI1MTc2LDMzMDczLDQwNTAxLDM4NDY0LDM5NTM0LDM5NTQ4LDI2OTI1LDIyOTQ5LDI1Mjk5LDIxODIyLDI1MzY2LDIxNzAzLDM0NTIxLDI3OTY0LDIzMDQzLDI5OTI2LDM0OTcyLDI3NDk4LDIyODA2LDM1OTE2LDI0MzY3LDI4Mjg2LDI5NjA5LDM5MDM3LDIwMDI0LDI4OTE5LDIzNDM2LDMwODcxLDI1NDA1LDI2MjAyLDMwMzU4LDI0Nzc5LDIzNDUxLDIzMTEzLDE5OTc1LDMzMTA5LDI3NzU0LDI5NTc5LDIwMTI5LDI2NTA1LDMyNTkzLDI0NDQ4LDI2MTA2LDI2Mzk1LDI0NTM2LDIyOTE2LDIzMDQxLDM0NTg1LDM0NTg3LDM0NTg5LDM0NTkxLDM0NTkyLDM0NTk2LDM0NTk4LDM0NTk5LDM0NjAwLDM0NjAyLDM0NjAzLDM0NjA0LDM0NjA1LDM0NjA3LDM0NjA4LDM0NjEwLDM0NjExLDM0NjEzLDM0NjE0LDM0NjE2LDM0NjE3LDM0NjE4LDM0NjIwLDM0NjIxLDM0NjI0LDM0NjI1LDM0NjI2LDM0NjI3LDM0NjI4LDM0NjI5LDM0NjMwLDM0NjM0LDM0NjM1LDM0NjM3LDM0NjM5LDM0NjQwLDM0NjQxLDM0NjQyLDM0NjQ0LDM0NjQ1LDM0NjQ2LDM0NjQ4LDM0NjUwLDM0NjUxLDM0NjUyLDM0NjUzLDM0NjU0LDM0NjU1LDM0NjU3LDM0NjU4LDM0NjYyLDM0NjYzLDM0NjY0LDM0NjY1LDM0NjY2LDM0NjY3LDM0NjY4LDM0NjY5LDM0NjcxLDM0NjczLDM0Njc0LDM0Njc1LDM0Njc3LDM0Njc5LDM0NjgwLDM0NjgxLDM0NjgyLDM0Njg3LDM0Njg4LDM0Njg5LDM0NjkyLDM0Njk0LDM0Njk1LDM0Njk3LDM0Njk4LDM0NzAwLDM0NzAyLDM0NzAzLDM0NzA0LDM0NzA1LDM0NzA2LDM0NzA4LDM0NzA5LDM0NzEwLDM0NzEyLDM0NzEzLDM0NzE0LDM0NzE1LDM0NzE2LDM0NzE3LDM0NzE4LDM0NzIwLDM0NzIxLDM0NzIyLDM0NzIzLDM0NzI0LDI0MDEzLDI0NDk0LDIxMzYxLDM4ODg2LDM2ODI5LDI2NjkzLDIyMjYwLDIxODA3LDI0Nzk5LDIwMDI2LDI4NDkzLDMyNTAwLDMzNDc5LDMzODA2LDIyOTk2LDIwMjU1LDIwMjY2LDIzNjE0LDMyNDI4LDI2NDEwLDM0MDc0LDIxNjE5LDMwMDMxLDMyOTYzLDIxODkwLDM5NzU5LDIwMzAxLDI4MjA1LDM1ODU5LDIzNTYxLDI0OTQ0LDIxMzU1LDMwMjM5LDI4MjAxLDM0NDQyLDI1OTkxLDM4Mzk1LDMyNDQxLDIxNTYzLDMxMjgzLDMyMDEwLDM4MzgyLDIxOTg1LDMyNzA1LDI5OTM0LDI1MzczLDM0NTgzLDI4MDY1LDMxMzg5LDI1MTA1LDI2MDE3LDIxMzUxLDI1NTY5LDI3Nzc5LDI0MDQzLDIxNTk2LDM4MDU2LDIwMDQ0LDI3NzQ1LDM1ODIwLDIzNjI3LDI2MDgwLDMzNDM2LDI2NzkxLDIxNTY2LDIxNTU2LDI3NTk1LDI3NDk0LDIwMTE2LDI1NDEwLDIxMzIwLDMzMzEwLDIwMjM3LDIwMzk4LDIyMzY2LDI1MDk4LDM4NjU0LDI2MjEyLDI5Mjg5LDIxMjQ3LDIxMTUzLDI0NzM1LDM1ODIzLDI2MTMyLDI5MDgxLDI2NTEyLDM1MTk5LDMwODAyLDMwNzE3LDI2MjI0LDIyMDc1LDIxNTYwLDM4MTc3LDI5MzA2LDM0NzI1LDM0NzI2LDM0NzI3LDM0NzI5LDM0NzMwLDM0NzM0LDM0NzM2LDM0NzM3LDM0NzM4LDM0NzQwLDM0NzQyLDM0NzQzLDM0NzQ0LDM0NzQ1LDM0NzQ3LDM0NzQ4LDM0NzUwLDM0NzUxLDM0NzUzLDM0NzU0LDM0NzU1LDM0NzU2LDM0NzU3LDM0NzU5LDM0NzYwLDM0NzYxLDM0NzY0LDM0NzY1LDM0NzY2LDM0NzY3LDM0NzY4LDM0NzcyLDM0NzczLDM0Nzc0LDM0Nzc1LDM0Nzc2LDM0Nzc3LDM0Nzc4LDM0NzgwLDM0NzgxLDM0NzgyLDM0NzgzLDM0Nzg1LDM0Nzg2LDM0Nzg3LDM0Nzg4LDM0NzkwLDM0NzkxLDM0NzkyLDM0NzkzLDM0Nzk1LDM0Nzk2LDM0Nzk3LDM0Nzk5LDM0ODAwLDM0ODAxLDM0ODAyLDM0ODAzLDM0ODA0LDM0ODA1LDM0ODA2LDM0ODA3LDM0ODA4LDM0ODEwLDM0ODExLDM0ODEyLDM0ODEzLDM0ODE1LDM0ODE2LDM0ODE3LDM0ODE4LDM0ODIwLDM0ODIxLDM0ODIyLDM0ODIzLDM0ODI0LDM0ODI1LDM0ODI3LDM0ODI4LDM0ODI5LDM0ODMwLDM0ODMxLDM0ODMyLDM0ODMzLDM0ODM0LDM0ODM2LDM0ODM5LDM0ODQwLDM0ODQxLDM0ODQyLDM0ODQ0LDM0ODQ1LDM0ODQ2LDM0ODQ3LDM0ODQ4LDM0ODUxLDMxMjMyLDI0Njg3LDI0MDc2LDI0NzEzLDMzMTgxLDIyODA1LDI0Nzk2LDI5MDYwLDI4OTExLDI4MzMwLDI3NzI4LDI5MzEyLDI3MjY4LDM0OTg5LDI0MTA5LDIwMDY0LDIzMjE5LDIxOTE2LDM4MTE1LDI3OTI3LDMxOTk1LDM4NTUzLDI1MTAzLDMyNDU0LDMwNjA2LDM0NDMwLDIxMjgzLDM4Njg2LDM2NzU4LDI2MjQ3LDIzNzc3LDIwMzg0LDI5NDIxLDE5OTc5LDIxNDE0LDIyNzk5LDIxNTIzLDI1NDcyLDM4MTg0LDIwODA4LDIwMTg1LDQwMDkyLDMyNDIwLDIxNjg4LDM2MTMyLDM0OTAwLDMzMzM1LDM4Mzg2LDI4MDQ2LDI0MzU4LDIzMjQ0LDI2MTc0LDM4NTA1LDI5NjE2LDI5NDg2LDIxNDM5LDMzMTQ2LDM5MzAxLDMyNjczLDIzNDY2LDM4NTE5LDM4NDgwLDMyNDQ3LDMwNDU2LDIxNDEwLDM4MjYyLDM5MzIxLDMxNjY1LDM1MTQwLDI4MjQ4LDIwMDY1LDMyNzI0LDMxMDc3LDM1ODE0LDI0ODE5LDIxNzA5LDIwMTM5LDM5MDMzLDI0MDU1LDI3MjMzLDIwNjg3LDIxNTIxLDM1OTM3LDMzODMxLDMwODEzLDM4NjYwLDIxMDY2LDIxNzQyLDIyMTc5LDM4MTQ0LDI4MDQwLDIzNDc3LDI4MTAyLDI2MTk1LDM0ODUyLDM0ODUzLDM0ODU0LDM0ODU1LDM0ODU2LDM0ODU3LDM0ODU4LDM0ODU5LDM0ODYwLDM0ODYxLDM0ODYyLDM0ODYzLDM0ODY0LDM0ODY1LDM0ODY3LDM0ODY4LDM0ODY5LDM0ODcwLDM0ODcxLDM0ODcyLDM0ODc0LDM0ODc1LDM0ODc3LDM0ODc4LDM0ODc5LDM0ODgxLDM0ODgyLDM0ODgzLDM0ODg2LDM0ODg3LDM0ODg4LDM0ODg5LDM0ODkwLDM0ODkxLDM0ODk0LDM0ODk1LDM0ODk2LDM0ODk3LDM0ODk4LDM0ODk5LDM0OTAxLDM0OTAyLDM0OTA0LDM0OTA2LDM0OTA3LDM0OTA4LDM0OTA5LDM0OTEwLDM0OTExLDM0OTEyLDM0OTE4LDM0OTE5LDM0OTIyLDM0OTI1LDM0OTI3LDM0OTI5LDM0OTMxLDM0OTMyLDM0OTMzLDM0OTM0LDM0OTM2LDM0OTM3LDM0OTM4LDM0OTM5LDM0OTQwLDM0OTQ0LDM0OTQ3LDM0OTUwLDM0OTUxLDM0OTUzLDM0OTU0LDM0OTU2LDM0OTU4LDM0OTU5LDM0OTYwLDM0OTYxLDM0OTYzLDM0OTY0LDM0OTY1LDM0OTY3LDM0OTY4LDM0OTY5LDM0OTcwLDM0OTcxLDM0OTczLDM0OTc0LDM0OTc1LDM0OTc2LDM0OTc3LDM0OTc5LDM0OTgxLDM0OTgyLDM0OTgzLDM0OTg0LDM0OTg1LDM0OTg2LDIzNTY3LDIzMzg5LDI2NjU3LDMyOTE4LDIxODgwLDMxNTA1LDI1OTI4LDI2OTY0LDIwMTIzLDI3NDYzLDM0NjM4LDM4Nzk1LDIxMzI3LDI1Mzc1LDI1NjU4LDM3MDM0LDI2MDEyLDMyOTYxLDM1ODU2LDIwODg5LDI2ODAwLDIxMzY4LDM0ODA5LDI1MDMyLDI3ODQ0LDI3ODk5LDM1ODc0LDIzNjMzLDM0MjE4LDMzNDU1LDM4MTU2LDI3NDI3LDM2NzYzLDI2MDMyLDI0NTcxLDI0NTE1LDIwNDQ5LDM0ODg1LDI2MTQzLDMzMTI1LDI5NDgxLDI0ODI2LDIwODUyLDIxMDA5LDIyNDExLDI0NDE4LDM3MDI2LDM0ODkyLDM3MjY2LDI0MTg0LDI2NDQ3LDI0NjE1LDIyOTk1LDIwODA0LDIwOTgyLDMzMDE2LDIxMjU2LDI3NzY5LDM4NTk2LDI5MDY2LDIwMjQxLDIwNDYyLDMyNjcwLDI2NDI5LDIxOTU3LDM4MTUyLDMxMTY4LDM0OTY2LDMyNDgzLDIyNjg3LDI1MTAwLDM4NjU2LDM0Mzk0LDIyMDQwLDM5MDM1LDI0NDY0LDM1NzY4LDMzOTg4LDM3MjA3LDIxNDY1LDI2MDkzLDI0MjA3LDMwMDQ0LDI0Njc2LDMyMTEwLDIzMTY3LDMyNDkwLDMyNDkzLDM2NzEzLDIxOTI3LDIzNDU5LDI0NzQ4LDI2MDU5LDI5NTcyLDM0OTg4LDM0OTkwLDM0OTkxLDM0OTkyLDM0OTk0LDM0OTk1LDM0OTk2LDM0OTk3LDM0OTk4LDM1MDAwLDM1MDAxLDM1MDAyLDM1MDAzLDM1MDA1LDM1MDA2LDM1MDA3LDM1MDA4LDM1MDExLDM1MDEyLDM1MDE1LDM1MDE2LDM1MDE4LDM1MDE5LDM1MDIwLDM1MDIxLDM1MDIzLDM1MDI0LDM1MDI1LDM1MDI3LDM1MDMwLDM1MDMxLDM1MDM0LDM1MDM1LDM1MDM2LDM1MDM3LDM1MDM4LDM1MDQwLDM1MDQxLDM1MDQ2LDM1MDQ3LDM1MDQ5LDM1MDUwLDM1MDUxLDM1MDUyLDM1MDUzLDM1MDU0LDM1MDU1LDM1MDU4LDM1MDYxLDM1MDYyLDM1MDYzLDM1MDY2LDM1MDY3LDM1MDY5LDM1MDcxLDM1MDcyLDM1MDczLDM1MDc1LDM1MDc2LDM1MDc3LDM1MDc4LDM1MDc5LDM1MDgwLDM1MDgxLDM1MDgzLDM1MDg0LDM1MDg1LDM1MDg2LDM1MDg3LDM1MDg5LDM1MDkyLDM1MDkzLDM1MDk0LDM1MDk1LDM1MDk2LDM1MTAwLDM1MTAxLDM1MTAyLDM1MTAzLDM1MTA0LDM1MTA2LDM1MTA3LDM1MTA4LDM1MTEwLDM1MTExLDM1MTEyLDM1MTEzLDM1MTE2LDM1MTE3LDM1MTE4LDM1MTE5LDM1MTIxLDM1MTIyLDM1MTIzLDM1MTI1LDM1MTI3LDM2ODczLDMwMzA3LDMwNTA1LDMyNDc0LDM4NzcyLDM0MjAzLDIzMzk4LDMxMzQ4LDM4NjM0LDM0ODgwLDIxMTk1LDI5MDcxLDI0NDkwLDI2MDkyLDM1ODEwLDIzNTQ3LDM5NTM1LDI0MDMzLDI3NTI5LDI3NzM5LDM1NzU3LDM1NzU5LDM2ODc0LDM2ODA1LDIxMzg3LDI1Mjc2LDQwNDg2LDQwNDkzLDIxNTY4LDIwMDExLDMzNDY5LDI5MjczLDM0NDYwLDIzODMwLDM0OTA1LDI4MDc5LDM4NTk3LDIxNzEzLDIwMTIyLDM1NzY2LDI4OTM3LDIxNjkzLDM4NDA5LDI4ODk1LDI4MTUzLDMwNDE2LDIwMDA1LDMwNzQwLDM0NTc4LDIzNzIxLDI0MzEwLDM1MzI4LDM5MDY4LDM4NDE0LDI4ODE0LDI3ODM5LDIyODUyLDI1NTEzLDMwNTI0LDM0ODkzLDI4NDM2LDMzMzk1LDIyNTc2LDI5MTQxLDIxMzg4LDMwNzQ2LDM4NTkzLDIxNzYxLDI0NDIyLDI4OTc2LDIzNDc2LDM1ODY2LDM5NTY0LDI3NTIzLDIyODMwLDQwNDk1LDMxMjA3LDI2NDcyLDI1MTk2LDIwMzM1LDMwMTEzLDMyNjUwLDI3OTE1LDM4NDUxLDI3Njg3LDIwMjA4LDMwMTYyLDIwODU5LDI2Njc5LDI4NDc4LDM2OTkyLDMzMTM2LDIyOTM0LDI5ODE0LDM1MTI4LDM1MTI5LDM1MTMwLDM1MTMxLDM1MTMyLDM1MTMzLDM1MTM0LDM1MTM1LDM1MTM2LDM1MTM4LDM1MTM5LDM1MTQxLDM1MTQyLDM1MTQzLDM1MTQ0LDM1MTQ1LDM1MTQ2LDM1MTQ3LDM1MTQ4LDM1MTQ5LDM1MTUwLDM1MTUxLDM1MTUyLDM1MTUzLDM1MTU0LDM1MTU1LDM1MTU2LDM1MTU3LDM1MTU4LDM1MTU5LDM1MTYwLDM1MTYxLDM1MTYyLDM1MTYzLDM1MTY0LDM1MTY1LDM1MTY4LDM1MTY5LDM1MTcwLDM1MTcxLDM1MTcyLDM1MTczLDM1MTc1LDM1MTc2LDM1MTc3LDM1MTc4LDM1MTc5LDM1MTgwLDM1MTgxLDM1MTgyLDM1MTgzLDM1MTg0LDM1MTg1LDM1MTg2LDM1MTg3LDM1MTg4LDM1MTg5LDM1MTkwLDM1MTkxLDM1MTkyLDM1MTkzLDM1MTk0LDM1MTk2LDM1MTk3LDM1MTk4LDM1MjAwLDM1MjAyLDM1MjA0LDM1MjA1LDM1MjA3LDM1MjA4LDM1MjA5LDM1MjEwLDM1MjExLDM1MjEyLDM1MjEzLDM1MjE0LDM1MjE1LDM1MjE2LDM1MjE3LDM1MjE4LDM1MjE5LDM1MjIwLDM1MjIxLDM1MjIyLDM1MjIzLDM1MjI0LDM1MjI1LDM1MjI2LDM1MjI3LDM1MjI4LDM1MjI5LDM1MjMwLDM1MjMxLDM1MjMyLDM1MjMzLDI1NjcxLDIzNTkxLDM2OTY1LDMxMzc3LDM1ODc1LDIzMDAyLDIxNjc2LDMzMjgwLDMzNjQ3LDM1MjAxLDMyNzY4LDI2OTI4LDIyMDk0LDMyODIyLDI5MjM5LDM3MzI2LDIwOTE4LDIwMDYzLDM5MDI5LDI1NDk0LDE5OTk0LDIxNDk0LDI2MzU1LDMzMDk5LDIyODEyLDI4MDgyLDE5OTY4LDIyNzc3LDIxMzA3LDI1NTU4LDM4MTI5LDIwMzgxLDIwMjM0LDM0OTE1LDM5MDU2LDIyODM5LDM2OTUxLDMxMjI3LDIwMjAyLDMzMDA4LDMwMDk3LDI3Nzc4LDIzNDUyLDIzMDE2LDI0NDEzLDI2ODg1LDM0NDMzLDIwNTA2LDI0MDUwLDIwMDU3LDMwNjkxLDIwMTk3LDMzNDAyLDI1MjMzLDI2MTMxLDM3MDA5LDIzNjczLDIwMTU5LDI0NDQxLDMzMjIyLDM2OTIwLDMyOTAwLDMwMTIzLDIwMTM0LDM1MDI4LDI0ODQ3LDI3NTg5LDI0NTE4LDIwMDQxLDMwNDEwLDI4MzIyLDM1ODExLDM1NzU4LDM1ODUwLDM1NzkzLDI0MzIyLDMyNzY0LDMyNzE2LDMyNDYyLDMzNTg5LDMzNjQzLDIyMjQwLDI3NTc1LDM4ODk5LDM4NDUyLDIzMDM1LDIxNTM1LDM4MTM0LDI4MTM5LDIzNDkzLDM5Mjc4LDIzNjA5LDI0MzQxLDM4NTQ0LDM1MjM0LDM1MjM1LDM1MjM2LDM1MjM3LDM1MjM4LDM1MjM5LDM1MjQwLDM1MjQxLDM1MjQyLDM1MjQzLDM1MjQ0LDM1MjQ1LDM1MjQ2LDM1MjQ3LDM1MjQ4LDM1MjQ5LDM1MjUwLDM1MjUxLDM1MjUyLDM1MjUzLDM1MjU0LDM1MjU1LDM1MjU2LDM1MjU3LDM1MjU4LDM1MjU5LDM1MjYwLDM1MjYxLDM1MjYyLDM1MjYzLDM1MjY0LDM1MjY3LDM1Mjc3LDM1MjgzLDM1Mjg0LDM1Mjg1LDM1Mjg3LDM1Mjg4LDM1Mjg5LDM1MjkxLDM1MjkzLDM1Mjk1LDM1Mjk2LDM1Mjk3LDM1Mjk4LDM1MzAwLDM1MzAzLDM1MzA0LDM1MzA1LDM1MzA2LDM1MzA4LDM1MzA5LDM1MzEwLDM1MzEyLDM1MzEzLDM1MzE0LDM1MzE2LDM1MzE3LDM1MzE4LDM1MzE5LDM1MzIwLDM1MzIxLDM1MzIyLDM1MzIzLDM1MzI0LDM1MzI1LDM1MzI2LDM1MzI3LDM1MzI5LDM1MzMwLDM1MzMxLDM1MzMyLDM1MzMzLDM1MzM0LDM1MzM2LDM1MzM3LDM1MzM4LDM1MzM5LDM1MzQwLDM1MzQxLDM1MzQyLDM1MzQzLDM1MzQ0LDM1MzQ1LDM1MzQ2LDM1MzQ3LDM1MzQ4LDM1MzQ5LDM1MzUwLDM1MzUxLDM1MzUyLDM1MzUzLDM1MzU0LDM1MzU1LDM1MzU2LDM1MzU3LDIxMzYwLDMzNTIxLDI3MTg1LDIzMTU2LDQwNTYwLDI0MjEyLDMyNTUyLDMzNzIxLDMzODI4LDMzODI5LDMzNjM5LDM0NjMxLDM2ODE0LDM2MTk0LDMwNDA4LDI0NDMzLDM5MDYyLDMwODI4LDI2MTQ0LDIxNzI3LDI1MzE3LDIwMzIzLDMzMjE5LDMwMTUyLDI0MjQ4LDM4NjA1LDM2MzYyLDM0NTUzLDIxNjQ3LDI3ODkxLDI4MDQ0LDI3NzA0LDI0NzAzLDIxMTkxLDI5OTkyLDI0MTg5LDIwMjQ4LDI0NzM2LDI0NTUxLDIzNTg4LDMwMDAxLDM3MDM4LDM4MDgwLDI5MzY5LDI3ODMzLDI4MjE2LDM3MTkzLDI2Mzc3LDIxNDUxLDIxNDkxLDIwMzA1LDM3MzIxLDM1ODI1LDIxNDQ4LDI0MTg4LDM2ODAyLDI4MTMyLDIwMTEwLDMwNDAyLDI3MDE0LDM0Mzk4LDI0ODU4LDMzMjg2LDIwMzEzLDIwNDQ2LDM2OTI2LDQwMDYwLDI0ODQxLDI4MTg5LDI4MTgwLDM4NTMzLDIwMTA0LDIzMDg5LDM4NjMyLDE5OTgyLDIzNjc5LDMxMTYxLDIzNDMxLDM1ODIxLDMyNzAxLDI5NTc3LDIyNDk1LDMzNDE5LDM3MDU3LDIxNTA1LDM2OTM1LDIxOTQ3LDIzNzg2LDI0NDgxLDI0ODQwLDI3NDQyLDI5NDI1LDMyOTQ2LDM1NDY1LDM1MzU4LDM1MzU5LDM1MzYwLDM1MzYxLDM1MzYyLDM1MzYzLDM1MzY0LDM1MzY1LDM1MzY2LDM1MzY3LDM1MzY4LDM1MzY5LDM1MzcwLDM1MzcxLDM1MzcyLDM1MzczLDM1Mzc0LDM1Mzc1LDM1Mzc2LDM1Mzc3LDM1Mzc4LDM1Mzc5LDM1MzgwLDM1MzgxLDM1MzgyLDM1MzgzLDM1Mzg0LDM1Mzg1LDM1Mzg2LDM1Mzg3LDM1Mzg4LDM1Mzg5LDM1MzkxLDM1MzkyLDM1MzkzLDM1Mzk0LDM1Mzk1LDM1Mzk2LDM1Mzk3LDM1Mzk4LDM1Mzk5LDM1NDAxLDM1NDAyLDM1NDAzLDM1NDA0LDM1NDA1LDM1NDA2LDM1NDA3LDM1NDA4LDM1NDA5LDM1NDEwLDM1NDExLDM1NDEyLDM1NDEzLDM1NDE0LDM1NDE1LDM1NDE2LDM1NDE3LDM1NDE4LDM1NDE5LDM1NDIwLDM1NDIxLDM1NDIyLDM1NDIzLDM1NDI0LDM1NDI1LDM1NDI2LDM1NDI3LDM1NDI4LDM1NDI5LDM1NDMwLDM1NDMxLDM1NDMyLDM1NDMzLDM1NDM0LDM1NDM1LDM1NDM2LDM1NDM3LDM1NDM4LDM1NDM5LDM1NDQwLDM1NDQxLDM1NDQyLDM1NDQzLDM1NDQ0LDM1NDQ1LDM1NDQ2LDM1NDQ3LDM1NDQ4LDM1NDUwLDM1NDUxLDM1NDUyLDM1NDUzLDM1NDU0LDM1NDU1LDM1NDU2LDI4MDIwLDIzNTA3LDM1MDI5LDM5MDQ0LDM1OTQ3LDM5NTMzLDQwNDk5LDI4MTcwLDIwOTAwLDIwODAzLDIyNDM1LDM0OTQ1LDIxNDA3LDI1NTg4LDM2NzU3LDIyMjUzLDIxNTkyLDIyMjc4LDI5NTAzLDI4MzA0LDMyNTM2LDM2ODI4LDMzNDg5LDI0ODk1LDI0NjE2LDM4NDk4LDI2MzUyLDMyNDIyLDM2MjM0LDM2MjkxLDM4MDUzLDIzNzMxLDMxOTA4LDI2Mzc2LDI0NzQyLDM4NDA1LDMyNzkyLDIwMTEzLDM3MDk1LDIxMjQ4LDM4NTA0LDIwODAxLDM2ODE2LDM0MTY0LDM3MjEzLDI2MTk3LDM4OTAxLDIzMzgxLDIxMjc3LDMwNzc2LDI2NDM0LDI2Njg1LDIxNzA1LDI4Nzk4LDIzNDcyLDM2NzMzLDIwODc3LDIyMzEyLDIxNjgxLDI1ODc0LDI2MjQyLDM2MTkwLDM2MTYzLDMzMDM5LDMzOTAwLDM2OTczLDMxOTY3LDIwOTkxLDM0Mjk5LDI2NTMxLDI2MDg5LDI4NTc3LDM0NDY4LDM2NDgxLDIyMTIyLDM2ODk2LDMwMzM4LDI4NzkwLDI5MTU3LDM2MTMxLDI1MzIxLDIxMDE3LDI3OTAxLDM2MTU2LDI0NTkwLDIyNjg2LDI0OTc0LDI2MzY2LDM2MTkyLDI1MTY2LDIxOTM5LDI4MTk1LDI2NDEzLDM2NzExLDM1NDU3LDM1NDU4LDM1NDU5LDM1NDYwLDM1NDYxLDM1NDYyLDM1NDYzLDM1NDY0LDM1NDY3LDM1NDY4LDM1NDY5LDM1NDcwLDM1NDcxLDM1NDcyLDM1NDczLDM1NDc0LDM1NDc2LDM1NDc3LDM1NDc4LDM1NDc5LDM1NDgwLDM1NDgxLDM1NDgyLDM1NDgzLDM1NDg0LDM1NDg1LDM1NDg2LDM1NDg3LDM1NDg4LDM1NDg5LDM1NDkwLDM1NDkxLDM1NDkyLDM1NDkzLDM1NDk0LDM1NDk1LDM1NDk2LDM1NDk3LDM1NDk4LDM1NDk5LDM1NTAwLDM1NTAxLDM1NTAyLDM1NTAzLDM1NTA0LDM1NTA1LDM1NTA2LDM1NTA3LDM1NTA4LDM1NTA5LDM1NTEwLDM1NTExLDM1NTEyLDM1NTEzLDM1NTE0LDM1NTE1LDM1NTE2LDM1NTE3LDM1NTE4LDM1NTE5LDM1NTIwLDM1NTIxLDM1NTIyLDM1NTIzLDM1NTI0LDM1NTI1LDM1NTI2LDM1NTI3LDM1NTI4LDM1NTI5LDM1NTMwLDM1NTMxLDM1NTMyLDM1NTMzLDM1NTM0LDM1NTM1LDM1NTM2LDM1NTM3LDM1NTM4LDM1NTM5LDM1NTQwLDM1NTQxLDM1NTQyLDM1NTQzLDM1NTQ0LDM1NTQ1LDM1NTQ2LDM1NTQ3LDM1NTQ4LDM1NTQ5LDM1NTUwLDM1NTUxLDM1NTUyLDM1NTUzLDM1NTU0LDM1NTU1LDM4MTEzLDM4MzkyLDMwNTA0LDI2NjI5LDI3MDQ4LDIxNjQzLDIwMDQ1LDI4ODU2LDM1Nzg0LDI1Njg4LDI1OTk1LDIzNDI5LDMxMzY0LDIwNTM4LDIzNTI4LDMwNjUxLDI3NjE3LDM1NDQ5LDMxODk2LDI3ODM4LDMwNDE1LDI2MDI1LDM2NzU5LDIzODUzLDIzNjM3LDM0MzYwLDI2NjMyLDIxMzQ0LDI1MTEyLDMxNDQ5LDI4MjUxLDMyNTA5LDI3MTY3LDMxNDU2LDI0NDMyLDI4NDY3LDI0MzUyLDI1NDg0LDI4MDcyLDI2NDU0LDE5OTc2LDI0MDgwLDM2MTM0LDIwMTgzLDMyOTYwLDMwMjYwLDM4NTU2LDI1MzA3LDI2MTU3LDI1MjE0LDI3ODM2LDM2MjEzLDI5MDMxLDMyNjE3LDIwODA2LDMyOTAzLDIxNDg0LDM2OTc0LDI1MjQwLDIxNzQ2LDM0NTQ0LDM2NzYxLDMyNzczLDM4MTY3LDM0MDcxLDM2ODI1LDI3OTkzLDI5NjQ1LDI2MDE1LDMwNDk1LDI5OTU2LDMwNzU5LDMzMjc1LDM2MTI2LDM4MDI0LDIwMzkwLDI2NTE3LDMwMTM3LDM1Nzg2LDM4NjYzLDI1MzkxLDM4MjE1LDM4NDUzLDMzOTc2LDI1Mzc5LDMwNTI5LDI0NDQ5LDI5NDI0LDIwMTA1LDI0NTk2LDI1OTcyLDI1MzI3LDI3NDkxLDI1OTE5LDM1NTU2LDM1NTU3LDM1NTU4LDM1NTU5LDM1NTYwLDM1NTYxLDM1NTYyLDM1NTYzLDM1NTY0LDM1NTY1LDM1NTY2LDM1NTY3LDM1NTY4LDM1NTY5LDM1NTcwLDM1NTcxLDM1NTcyLDM1NTczLDM1NTc0LDM1NTc1LDM1NTc2LDM1NTc3LDM1NTc4LDM1NTc5LDM1NTgwLDM1NTgxLDM1NTgyLDM1NTgzLDM1NTg0LDM1NTg1LDM1NTg2LDM1NTg3LDM1NTg4LDM1NTg5LDM1NTkwLDM1NTkyLDM1NTkzLDM1NTk0LDM1NTk1LDM1NTk2LDM1NTk3LDM1NTk4LDM1NTk5LDM1NjAwLDM1NjAxLDM1NjAyLDM1NjAzLDM1NjA0LDM1NjA1LDM1NjA2LDM1NjA3LDM1NjA4LDM1NjA5LDM1NjEwLDM1NjExLDM1NjEyLDM1NjEzLDM1NjE0LDM1NjE1LDM1NjE2LDM1NjE3LDM1NjE4LDM1NjE5LDM1NjIwLDM1NjIxLDM1NjIzLDM1NjI0LDM1NjI1LDM1NjI2LDM1NjI3LDM1NjI4LDM1NjI5LDM1NjMwLDM1NjMxLDM1NjMyLDM1NjMzLDM1NjM0LDM1NjM1LDM1NjM2LDM1NjM3LDM1NjM4LDM1NjM5LDM1NjQwLDM1NjQxLDM1NjQyLDM1NjQzLDM1NjQ0LDM1NjQ1LDM1NjQ2LDM1NjQ3LDM1NjQ4LDM1NjQ5LDM1NjUwLDM1NjUxLDM1NjUyLDM1NjUzLDI0MTAzLDMwMTUxLDM3MDczLDM1Nzc3LDMzNDM3LDI2NTI1LDI1OTAzLDIxNTUzLDM0NTg0LDMwNjkzLDMyOTMwLDMzMDI2LDI3NzEzLDIwMDQzLDMyNDU1LDMyODQ0LDMwNDUyLDI2ODkzLDI3NTQyLDI1MTkxLDIwNTQwLDIwMzU2LDIyMzM2LDI1MzUxLDI3NDkwLDM2Mjg2LDIxNDgyLDI2MDg4LDMyNDQwLDI0NTM1LDI1MzcwLDI1NTI3LDMzMjY3LDMzMjY4LDMyNjIyLDI0MDkyLDIzNzY5LDIxMDQ2LDI2MjM0LDMxMjA5LDMxMjU4LDM2MTM2LDI4ODI1LDMwMTY0LDI4MzgyLDI3ODM1LDMxMzc4LDIwMDEzLDMwNDA1LDI0NTQ0LDM4MDQ3LDM0OTM1LDMyNDU2LDMxMTgxLDMyOTU5LDM3MzI1LDIwMjEwLDIwMjQ3LDMzMzExLDIxNjA4LDI0MDMwLDI3OTU0LDM1Nzg4LDMxOTA5LDM2NzI0LDMyOTIwLDI0MDkwLDIxNjUwLDMwMzg1LDIzNDQ5LDI2MTcyLDM5NTg4LDI5NjY0LDI2NjY2LDM0NTIzLDI2NDE3LDI5NDgyLDM1ODMyLDM1ODAzLDM2ODgwLDMxNDgxLDI4ODkxLDI5MDM4LDI1Mjg0LDMwNjMzLDIyMDY1LDIwMDI3LDMzODc5LDI2NjA5LDIxMTYxLDM0NDk2LDM2MTQyLDM4MTM2LDMxNTY5LDM1NjU0LDM1NjU1LDM1NjU2LDM1NjU3LDM1NjU4LDM1NjU5LDM1NjYwLDM1NjYxLDM1NjYyLDM1NjYzLDM1NjY0LDM1NjY1LDM1NjY2LDM1NjY3LDM1NjY4LDM1NjY5LDM1NjcwLDM1NjcxLDM1NjcyLDM1NjczLDM1Njc0LDM1Njc1LDM1Njc2LDM1Njc3LDM1Njc4LDM1Njc5LDM1NjgwLDM1NjgxLDM1NjgyLDM1NjgzLDM1Njg0LDM1Njg1LDM1Njg3LDM1Njg4LDM1Njg5LDM1NjkwLDM1NjkxLDM1NjkzLDM1Njk0LDM1Njk1LDM1Njk2LDM1Njk3LDM1Njk4LDM1Njk5LDM1NzAwLDM1NzAxLDM1NzAyLDM1NzAzLDM1NzA0LDM1NzA1LDM1NzA2LDM1NzA3LDM1NzA4LDM1NzA5LDM1NzEwLDM1NzExLDM1NzEyLDM1NzEzLDM1NzE0LDM1NzE1LDM1NzE2LDM1NzE3LDM1NzE4LDM1NzE5LDM1NzIwLDM1NzIxLDM1NzIyLDM1NzIzLDM1NzI0LDM1NzI1LDM1NzI2LDM1NzI3LDM1NzI4LDM1NzI5LDM1NzMwLDM1NzMxLDM1NzMyLDM1NzMzLDM1NzM0LDM1NzM1LDM1NzM2LDM1NzM3LDM1NzM4LDM1NzM5LDM1NzQwLDM1NzQxLDM1NzQyLDM1NzQzLDM1NzU2LDM1NzYxLDM1NzcxLDM1NzgzLDM1NzkyLDM1ODE4LDM1ODQ5LDM1ODcwLDIwMzAzLDI3ODgwLDMxMDY5LDM5NTQ3LDI1MjM1LDI5MjI2LDI1MzQxLDE5OTg3LDMwNzQyLDM2NzE2LDI1Nzc2LDM2MTg2LDMxNjg2LDI2NzI5LDI0MTk2LDM1MDEzLDIyOTE4LDI1NzU4LDIyNzY2LDI5MzY2LDI2ODk0LDM4MTgxLDM2ODYxLDM2MTg0LDIyMzY4LDMyNTEyLDM1ODQ2LDIwOTM0LDI1NDE3LDI1MzA1LDIxMzMxLDI2NzAwLDI5NzMwLDMzNTM3LDM3MTk2LDIxODI4LDMwNTI4LDI4Nzk2LDI3OTc4LDIwODU3LDIxNjcyLDM2MTY0LDIzMDM5LDI4MzYzLDI4MTAwLDIzMzg4LDMyMDQzLDIwMTgwLDMxODY5LDI4MzcxLDIzMzc2LDMzMjU4LDI4MTczLDIzMzgzLDM5NjgzLDI2ODM3LDM2Mzk0LDIzNDQ3LDMyNTA4LDI0NjM1LDMyNDM3LDM3MDQ5LDM2MjA4LDIyODYzLDI1NTQ5LDMxMTk5LDM2Mjc1LDIxMzMwLDI2MDYzLDMxMDYyLDM1NzgxLDM4NDU5LDMyNDUyLDM4MDc1LDMyMzg2LDIyMDY4LDM3MjU3LDI2MzY4LDMyNjE4LDIzNTYyLDM2OTgxLDI2MTUyLDI0MDM4LDIwMzA0LDI2NTkwLDIwNTcwLDIwMzE2LDIyMzUyLDI0MjMxLDU5NDA4LDU5NDA5LDU5NDEwLDU5NDExLDU5NDEyLDM1ODk2LDM1ODk3LDM1ODk4LDM1ODk5LDM1OTAwLDM1OTAxLDM1OTAyLDM1OTAzLDM1OTA0LDM1OTA2LDM1OTA3LDM1OTA4LDM1OTA5LDM1OTEyLDM1OTE0LDM1OTE1LDM1OTE3LDM1OTE4LDM1OTE5LDM1OTIwLDM1OTIxLDM1OTIyLDM1OTIzLDM1OTI0LDM1OTI2LDM1OTI3LDM1OTI4LDM1OTI5LDM1OTMxLDM1OTMyLDM1OTMzLDM1OTM0LDM1OTM1LDM1OTM2LDM1OTM5LDM1OTQwLDM1OTQxLDM1OTQyLDM1OTQzLDM1OTQ0LDM1OTQ1LDM1OTQ4LDM1OTQ5LDM1OTUwLDM1OTUxLDM1OTUyLDM1OTUzLDM1OTU0LDM1OTU2LDM1OTU3LDM1OTU4LDM1OTU5LDM1OTYzLDM1OTY0LDM1OTY1LDM1OTY2LDM1OTY3LDM1OTY4LDM1OTY5LDM1OTcxLDM1OTcyLDM1OTc0LDM1OTc1LDM1OTc2LDM1OTc5LDM1OTgxLDM1OTgyLDM1OTgzLDM1OTg0LDM1OTg1LDM1OTg2LDM1OTg3LDM1OTg5LDM1OTkwLDM1OTkxLDM1OTkzLDM1OTk0LDM1OTk1LDM1OTk2LDM1OTk3LDM1OTk4LDM1OTk5LDM2MDAwLDM2MDAxLDM2MDAyLDM2MDAzLDM2MDA0LDM2MDA1LDM2MDA2LDM2MDA3LDM2MDA4LDM2MDA5LDM2MDEwLDM2MDExLDM2MDEyLDM2MDEzLDIwMTA5LDE5OTgwLDIwODAwLDE5OTg0LDI0MzE5LDIxMzE3LDE5OTg5LDIwMTIwLDE5OTk4LDM5NzMwLDIzNDA0LDIyMTIxLDIwMDA4LDMxMTYyLDIwMDMxLDIxMjY5LDIwMDM5LDIyODI5LDI5MjQzLDIxMzU4LDI3NjY0LDIyMjM5LDMyOTk2LDM5MzE5LDI3NjAzLDMwNTkwLDQwNzI3LDIwMDIyLDIwMTI3LDQwNzIwLDIwMDYwLDIwMDczLDIwMTE1LDMzNDE2LDIzMzg3LDIxODY4LDIyMDMxLDIwMTY0LDIxMzg5LDIxNDA1LDIxNDExLDIxNDEzLDIxNDIyLDM4NzU3LDM2MTg5LDIxMjc0LDIxNDkzLDIxMjg2LDIxMjk0LDIxMzEwLDM2MTg4LDIxMzUwLDIxMzQ3LDIwOTk0LDIxMDAwLDIxMDA2LDIxMDM3LDIxMDQzLDIxMDU1LDIxMDU2LDIxMDY4LDIxMDg2LDIxMDg5LDIxMDg0LDMzOTY3LDIxMTE3LDIxMTIyLDIxMTIxLDIxMTM2LDIxMTM5LDIwODY2LDMyNTk2LDIwMTU1LDIwMTYzLDIwMTY5LDIwMTYyLDIwMjAwLDIwMTkzLDIwMjAzLDIwMTkwLDIwMjUxLDIwMjExLDIwMjU4LDIwMzI0LDIwMjEzLDIwMjYxLDIwMjYzLDIwMjMzLDIwMjY3LDIwMzE4LDIwMzI3LDI1OTEyLDIwMzE0LDIwMzE3LDM2MDE0LDM2MDE1LDM2MDE2LDM2MDE3LDM2MDE4LDM2MDE5LDM2MDIwLDM2MDIxLDM2MDIyLDM2MDIzLDM2MDI0LDM2MDI1LDM2MDI2LDM2MDI3LDM2MDI4LDM2MDI5LDM2MDMwLDM2MDMxLDM2MDMyLDM2MDMzLDM2MDM0LDM2MDM1LDM2MDM2LDM2MDM3LDM2MDM4LDM2MDM5LDM2MDQwLDM2MDQxLDM2MDQyLDM2MDQzLDM2MDQ0LDM2MDQ1LDM2MDQ2LDM2MDQ3LDM2MDQ4LDM2MDQ5LDM2MDUwLDM2MDUxLDM2MDUyLDM2MDUzLDM2MDU0LDM2MDU1LDM2MDU2LDM2MDU3LDM2MDU4LDM2MDU5LDM2MDYwLDM2MDYxLDM2MDYyLDM2MDYzLDM2MDY0LDM2MDY1LDM2MDY2LDM2MDY3LDM2MDY4LDM2MDY5LDM2MDcwLDM2MDcxLDM2MDcyLDM2MDczLDM2MDc0LDM2MDc1LDM2MDc2LDM2MDc3LDM2MDc4LDM2MDc5LDM2MDgwLDM2MDgxLDM2MDgyLDM2MDgzLDM2MDg0LDM2MDg1LDM2MDg2LDM2MDg3LDM2MDg4LDM2MDg5LDM2MDkwLDM2MDkxLDM2MDkyLDM2MDkzLDM2MDk0LDM2MDk1LDM2MDk2LDM2MDk3LDM2MDk4LDM2MDk5LDM2MTAwLDM2MTAxLDM2MTAyLDM2MTAzLDM2MTA0LDM2MTA1LDM2MTA2LDM2MTA3LDM2MTA4LDM2MTA5LDIwMzE5LDIwMzExLDIwMjc0LDIwMjg1LDIwMzQyLDIwMzQwLDIwMzY5LDIwMzYxLDIwMzU1LDIwMzY3LDIwMzUwLDIwMzQ3LDIwMzk0LDIwMzQ4LDIwMzk2LDIwMzcyLDIwNDU0LDIwNDU2LDIwNDU4LDIwNDIxLDIwNDQyLDIwNDUxLDIwNDQ0LDIwNDMzLDIwNDQ3LDIwNDcyLDIwNTIxLDIwNTU2LDIwNDY3LDIwNTI0LDIwNDk1LDIwNTI2LDIwNTI1LDIwNDc4LDIwNTA4LDIwNDkyLDIwNTE3LDIwNTIwLDIwNjA2LDIwNTQ3LDIwNTY1LDIwNTUyLDIwNTU4LDIwNTg4LDIwNjAzLDIwNjQ1LDIwNjQ3LDIwNjQ5LDIwNjY2LDIwNjk0LDIwNzQyLDIwNzE3LDIwNzE2LDIwNzEwLDIwNzE4LDIwNzQzLDIwNzQ3LDIwMTg5LDI3NzA5LDIwMzEyLDIwMzI1LDIwNDMwLDQwODY0LDI3NzE4LDMxODYwLDIwODQ2LDI0MDYxLDQwNjQ5LDM5MzIwLDIwODY1LDIyODA0LDIxMjQxLDIxMjYxLDM1MzM1LDIxMjY0LDIwOTcxLDIyODA5LDIwODIxLDIwMTI4LDIwODIyLDIwMTQ3LDM0OTI2LDM0OTgwLDIwMTQ5LDMzMDQ0LDM1MDI2LDMxMTA0LDIzMzQ4LDM0ODE5LDMyNjk2LDIwOTA3LDIwOTEzLDIwOTI1LDIwOTI0LDM2MTEwLDM2MTExLDM2MTEyLDM2MTEzLDM2MTE0LDM2MTE1LDM2MTE2LDM2MTE3LDM2MTE4LDM2MTE5LDM2MTIwLDM2MTIxLDM2MTIyLDM2MTIzLDM2MTI0LDM2MTI4LDM2MTc3LDM2MTc4LDM2MTgzLDM2MTkxLDM2MTk3LDM2MjAwLDM2MjAxLDM2MjAyLDM2MjA0LDM2MjA2LDM2MjA3LDM2MjA5LDM2MjEwLDM2MjE2LDM2MjE3LDM2MjE4LDM2MjE5LDM2MjIwLDM2MjIxLDM2MjIyLDM2MjIzLDM2MjI0LDM2MjI2LDM2MjI3LDM2MjMwLDM2MjMxLDM2MjMyLDM2MjMzLDM2MjM2LDM2MjM3LDM2MjM4LDM2MjM5LDM2MjQwLDM2MjQyLDM2MjQzLDM2MjQ1LDM2MjQ2LDM2MjQ3LDM2MjQ4LDM2MjQ5LDM2MjUwLDM2MjUxLDM2MjUyLDM2MjUzLDM2MjU0LDM2MjU2LDM2MjU3LDM2MjU4LDM2MjYwLDM2MjYxLDM2MjYyLDM2MjYzLDM2MjY0LDM2MjY1LDM2MjY2LDM2MjY3LDM2MjY4LDM2MjY5LDM2MjcwLDM2MjcxLDM2MjcyLDM2Mjc0LDM2Mjc4LDM2Mjc5LDM2MjgxLDM2MjgzLDM2Mjg1LDM2Mjg4LDM2Mjg5LDM2MjkwLDM2MjkzLDM2Mjk1LDM2Mjk2LDM2Mjk3LDM2Mjk4LDM2MzAxLDM2MzA0LDM2MzA2LDM2MzA3LDM2MzA4LDIwOTM1LDIwODg2LDIwODk4LDIwOTAxLDM1NzQ0LDM1NzUwLDM1NzUxLDM1NzU0LDM1NzY0LDM1NzY1LDM1NzY3LDM1Nzc4LDM1Nzc5LDM1Nzg3LDM1NzkxLDM1NzkwLDM1Nzk0LDM1Nzk1LDM1Nzk2LDM1Nzk4LDM1ODAwLDM1ODAxLDM1ODA0LDM1ODA3LDM1ODA4LDM1ODEyLDM1ODE2LDM1ODE3LDM1ODIyLDM1ODI0LDM1ODI3LDM1ODMwLDM1ODMzLDM1ODM2LDM1ODM5LDM1ODQwLDM1ODQyLDM1ODQ0LDM1ODQ3LDM1ODUyLDM1ODU1LDM1ODU3LDM1ODU4LDM1ODYwLDM1ODYxLDM1ODYyLDM1ODY1LDM1ODY3LDM1ODY0LDM1ODY5LDM1ODcxLDM1ODcyLDM1ODczLDM1ODc3LDM1ODc5LDM1ODgyLDM1ODgzLDM1ODg2LDM1ODg3LDM1ODkwLDM1ODkxLDM1ODkzLDM1ODk0LDIxMzUzLDIxMzcwLDM4NDI5LDM4NDM0LDM4NDMzLDM4NDQ5LDM4NDQyLDM4NDYxLDM4NDYwLDM4NDY2LDM4NDczLDM4NDg0LDM4NDk1LDM4NTAzLDM4NTA4LDM4NTE0LDM4NTE2LDM4NTM2LDM4NTQxLDM4NTUxLDM4NTc2LDM3MDE1LDM3MDE5LDM3MDIxLDM3MDE3LDM3MDM2LDM3MDI1LDM3MDQ0LDM3MDQzLDM3MDQ2LDM3MDUwLDM2MzA5LDM2MzEyLDM2MzEzLDM2MzE2LDM2MzIwLDM2MzIxLDM2MzIyLDM2MzI1LDM2MzI2LDM2MzI3LDM2MzI5LDM2MzMzLDM2MzM0LDM2MzM2LDM2MzM3LDM2MzM4LDM2MzQwLDM2MzQyLDM2MzQ4LDM2MzUwLDM2MzUxLDM2MzUyLDM2MzUzLDM2MzU0LDM2MzU1LDM2MzU2LDM2MzU4LDM2MzU5LDM2MzYwLDM2MzYzLDM2MzY1LDM2MzY2LDM2MzY4LDM2MzY5LDM2MzcwLDM2MzcxLDM2MzczLDM2Mzc0LDM2Mzc1LDM2Mzc2LDM2Mzc3LDM2Mzc4LDM2Mzc5LDM2MzgwLDM2Mzg0LDM2Mzg1LDM2Mzg4LDM2Mzg5LDM2MzkwLDM2MzkxLDM2MzkyLDM2Mzk1LDM2Mzk3LDM2NDAwLDM2NDAyLDM2NDAzLDM2NDA0LDM2NDA2LDM2NDA3LDM2NDA4LDM2NDExLDM2NDEyLDM2NDE0LDM2NDE1LDM2NDE5LDM2NDIxLDM2NDIyLDM2NDI4LDM2NDI5LDM2NDMwLDM2NDMxLDM2NDMyLDM2NDM1LDM2NDM2LDM2NDM3LDM2NDM4LDM2NDM5LDM2NDQwLDM2NDQyLDM2NDQzLDM2NDQ0LDM2NDQ1LDM2NDQ2LDM2NDQ3LDM2NDQ4LDM2NDQ5LDM2NDUwLDM2NDUxLDM2NDUyLDM2NDUzLDM2NDU1LDM2NDU2LDM2NDU4LDM2NDU5LDM2NDYyLDM2NDY1LDM3MDQ4LDM3MDQwLDM3MDcxLDM3MDYxLDM3MDU0LDM3MDcyLDM3MDYwLDM3MDYzLDM3MDc1LDM3MDk0LDM3MDkwLDM3MDg0LDM3MDc5LDM3MDgzLDM3MDk5LDM3MTAzLDM3MTE4LDM3MTI0LDM3MTU0LDM3MTUwLDM3MTU1LDM3MTY5LDM3MTY3LDM3MTc3LDM3MTg3LDM3MTkwLDIxMDA1LDIyODUwLDIxMTU0LDIxMTY0LDIxMTY1LDIxMTgyLDIxNzU5LDIxMjAwLDIxMjA2LDIxMjMyLDIxNDcxLDI5MTY2LDMwNjY5LDI0MzA4LDIwOTgxLDIwOTg4LDM5NzI3LDIxNDMwLDI0MzIxLDMwMDQyLDI0MDQ3LDIyMzQ4LDIyNDQxLDIyNDMzLDIyNjU0LDIyNzE2LDIyNzI1LDIyNzM3LDIyMzEzLDIyMzE2LDIyMzE0LDIyMzIzLDIyMzI5LDIyMzE4LDIyMzE5LDIyMzY0LDIyMzMxLDIyMzM4LDIyMzc3LDIyNDA1LDIyMzc5LDIyNDA2LDIyMzk2LDIyMzk1LDIyMzc2LDIyMzgxLDIyMzkwLDIyMzg3LDIyNDQ1LDIyNDM2LDIyNDEyLDIyNDUwLDIyNDc5LDIyNDM5LDIyNDUyLDIyNDE5LDIyNDMyLDIyNDg1LDIyNDg4LDIyNDkwLDIyNDg5LDIyNDgyLDIyNDU2LDIyNTE2LDIyNTExLDIyNTIwLDIyNTAwLDIyNDkzLDM2NDY3LDM2NDY5LDM2NDcxLDM2NDcyLDM2NDczLDM2NDc0LDM2NDc1LDM2NDc3LDM2NDc4LDM2NDgwLDM2NDgyLDM2NDgzLDM2NDg0LDM2NDg2LDM2NDg4LDM2NDg5LDM2NDkwLDM2NDkxLDM2NDkyLDM2NDkzLDM2NDk0LDM2NDk3LDM2NDk4LDM2NDk5LDM2NTAxLDM2NTAyLDM2NTAzLDM2NTA0LDM2NTA1LDM2NTA2LDM2NTA3LDM2NTA5LDM2NTExLDM2NTEyLDM2NTEzLDM2NTE0LDM2NTE1LDM2NTE2LDM2NTE3LDM2NTE4LDM2NTE5LDM2NTIwLDM2NTIxLDM2NTIyLDM2NTI1LDM2NTI2LDM2NTI4LDM2NTI5LDM2NTMxLDM2NTMyLDM2NTMzLDM2NTM0LDM2NTM1LDM2NTM2LDM2NTM3LDM2NTM5LDM2NTQwLDM2NTQxLDM2NTQyLDM2NTQzLDM2NTQ0LDM2NTQ1LDM2NTQ2LDM2NTQ3LDM2NTQ4LDM2NTQ5LDM2NTUwLDM2NTUxLDM2NTUyLDM2NTUzLDM2NTU0LDM2NTU1LDM2NTU2LDM2NTU3LDM2NTU5LDM2NTYwLDM2NTYxLDM2NTYyLDM2NTYzLDM2NTY0LDM2NTY1LDM2NTY2LDM2NTY3LDM2NTY4LDM2NTY5LDM2NTcwLDM2NTcxLDM2NTcyLDM2NTczLDM2NTc0LDM2NTc1LDM2NTc2LDM2NTc3LDM2NTc4LDM2NTc5LDM2NTgwLDIyNTM5LDIyNTQxLDIyNTI1LDIyNTA5LDIyNTI4LDIyNTU4LDIyNTUzLDIyNTk2LDIyNTYwLDIyNjI5LDIyNjM2LDIyNjU3LDIyNjY1LDIyNjgyLDIyNjU2LDM5MzM2LDQwNzI5LDI1MDg3LDMzNDAxLDMzNDA1LDMzNDA3LDMzNDIzLDMzNDE4LDMzNDQ4LDMzNDEyLDMzNDIyLDMzNDI1LDMzNDMxLDMzNDMzLDMzNDUxLDMzNDY0LDMzNDcwLDMzNDU2LDMzNDgwLDMzNDgyLDMzNTA3LDMzNDMyLDMzNDYzLDMzNDU0LDMzNDgzLDMzNDg0LDMzNDczLDMzNDQ5LDMzNDYwLDMzNDQxLDMzNDUwLDMzNDM5LDMzNDc2LDMzNDg2LDMzNDQ0LDMzNTA1LDMzNTQ1LDMzNTI3LDMzNTA4LDMzNTUxLDMzNTQzLDMzNTAwLDMzNTI0LDMzNDkwLDMzNDk2LDMzNTQ4LDMzNTMxLDMzNDkxLDMzNTUzLDMzNTYyLDMzNTQyLDMzNTU2LDMzNTU3LDMzNTA0LDMzNDkzLDMzNTY0LDMzNjE3LDMzNjI3LDMzNjI4LDMzNTQ0LDMzNjgyLDMzNTk2LDMzNTg4LDMzNTg1LDMzNjkxLDMzNjMwLDMzNTgzLDMzNjE1LDMzNjA3LDMzNjAzLDMzNjMxLDMzNjAwLDMzNTU5LDMzNjMyLDMzNTgxLDMzNTk0LDMzNTg3LDMzNjM4LDMzNjM3LDM2NTgxLDM2NTgyLDM2NTgzLDM2NTg0LDM2NTg1LDM2NTg2LDM2NTg3LDM2NTg4LDM2NTg5LDM2NTkwLDM2NTkxLDM2NTkyLDM2NTkzLDM2NTk0LDM2NTk1LDM2NTk2LDM2NTk3LDM2NTk4LDM2NTk5LDM2NjAwLDM2NjAxLDM2NjAyLDM2NjAzLDM2NjA0LDM2NjA1LDM2NjA2LDM2NjA3LDM2NjA4LDM2NjA5LDM2NjEwLDM2NjExLDM2NjEyLDM2NjEzLDM2NjE0LDM2NjE1LDM2NjE2LDM2NjE3LDM2NjE4LDM2NjE5LDM2NjIwLDM2NjIxLDM2NjIyLDM2NjIzLDM2NjI0LDM2NjI1LDM2NjI2LDM2NjI3LDM2NjI4LDM2NjI5LDM2NjMwLDM2NjMxLDM2NjMyLDM2NjMzLDM2NjM0LDM2NjM1LDM2NjM2LDM2NjM3LDM2NjM4LDM2NjM5LDM2NjQwLDM2NjQxLDM2NjQyLDM2NjQzLDM2NjQ0LDM2NjQ1LDM2NjQ2LDM2NjQ3LDM2NjQ4LDM2NjQ5LDM2NjUwLDM2NjUxLDM2NjUyLDM2NjUzLDM2NjU0LDM2NjU1LDM2NjU2LDM2NjU3LDM2NjU4LDM2NjU5LDM2NjYwLDM2NjYxLDM2NjYyLDM2NjYzLDM2NjY0LDM2NjY1LDM2NjY2LDM2NjY3LDM2NjY4LDM2NjY5LDM2NjcwLDM2NjcxLDM2NjcyLDM2NjczLDM2Njc0LDM2Njc1LDM2Njc2LDMzNjQwLDMzNTYzLDMzNjQxLDMzNjQ0LDMzNjQyLDMzNjQ1LDMzNjQ2LDMzNzEyLDMzNjU2LDMzNzE1LDMzNzE2LDMzNjk2LDMzNzA2LDMzNjgzLDMzNjkyLDMzNjY5LDMzNjYwLDMzNzE4LDMzNzA1LDMzNjYxLDMzNzIwLDMzNjU5LDMzNjg4LDMzNjk0LDMzNzA0LDMzNzIyLDMzNzI0LDMzNzI5LDMzNzkzLDMzNzY1LDMzNzUyLDIyNTM1LDMzODE2LDMzODAzLDMzNzU3LDMzNzg5LDMzNzUwLDMzODIwLDMzODQ4LDMzODA5LDMzNzk4LDMzNzQ4LDMzNzU5LDMzODA3LDMzNzk1LDMzNzg0LDMzNzg1LDMzNzcwLDMzNzMzLDMzNzI4LDMzODMwLDMzNzc2LDMzNzYxLDMzODg0LDMzODczLDMzODgyLDMzODgxLDMzOTA3LDMzOTI3LDMzOTI4LDMzOTE0LDMzOTI5LDMzOTEyLDMzODUyLDMzODYyLDMzODk3LDMzOTEwLDMzOTMyLDMzOTM0LDMzODQxLDMzOTAxLDMzOTg1LDMzOTk3LDM0MDAwLDM0MDIyLDMzOTgxLDM0MDAzLDMzOTk0LDMzOTgzLDMzOTc4LDM0MDE2LDMzOTUzLDMzOTc3LDMzOTcyLDMzOTQzLDM0MDIxLDM0MDE5LDM0MDYwLDI5OTY1LDM0MTA0LDM0MDMyLDM0MTA1LDM0MDc5LDM0MTA2LDM2Njc3LDM2Njc4LDM2Njc5LDM2NjgwLDM2NjgxLDM2NjgyLDM2NjgzLDM2Njg0LDM2Njg1LDM2Njg2LDM2Njg3LDM2Njg4LDM2Njg5LDM2NjkwLDM2NjkxLDM2NjkyLDM2NjkzLDM2Njk0LDM2Njk1LDM2Njk2LDM2Njk3LDM2Njk4LDM2Njk5LDM2NzAwLDM2NzAxLDM2NzAyLDM2NzAzLDM2NzA0LDM2NzA1LDM2NzA2LDM2NzA3LDM2NzA4LDM2NzA5LDM2NzE0LDM2NzM2LDM2NzQ4LDM2NzU0LDM2NzY1LDM2NzY4LDM2NzY5LDM2NzcwLDM2NzcyLDM2NzczLDM2Nzc0LDM2Nzc1LDM2Nzc4LDM2NzgwLDM2NzgxLDM2NzgyLDM2NzgzLDM2Nzg2LDM2Nzg3LDM2Nzg4LDM2Nzg5LDM2NzkxLDM2NzkyLDM2Nzk0LDM2Nzk1LDM2Nzk2LDM2Nzk5LDM2ODAwLDM2ODAzLDM2ODA2LDM2ODA5LDM2ODEwLDM2ODExLDM2ODEyLDM2ODEzLDM2ODE1LDM2ODE4LDM2ODIyLDM2ODIzLDM2ODI2LDM2ODMyLDM2ODMzLDM2ODM1LDM2ODM5LDM2ODQ0LDM2ODQ3LDM2ODQ5LDM2ODUwLDM2ODUyLDM2ODUzLDM2ODU0LDM2ODU4LDM2ODU5LDM2ODYwLDM2ODYyLDM2ODYzLDM2ODcxLDM2ODcyLDM2ODc2LDM2ODc4LDM2ODgzLDM2ODg1LDM2ODg4LDM0MTM0LDM0MTA3LDM0MDQ3LDM0MDQ0LDM0MTM3LDM0MTIwLDM0MTUyLDM0MTQ4LDM0MTQyLDM0MTcwLDMwNjI2LDM0MTE1LDM0MTYyLDM0MTcxLDM0MjEyLDM0MjE2LDM0MTgzLDM0MTkxLDM0MTY5LDM0MjIyLDM0MjA0LDM0MTgxLDM0MjMzLDM0MjMxLDM0MjI0LDM0MjU5LDM0MjQxLDM0MjY4LDM0MzAzLDM0MzQzLDM0MzA5LDM0MzQ1LDM0MzI2LDM0MzY0LDI0MzE4LDI0MzI4LDIyODQ0LDIyODQ5LDMyODIzLDIyODY5LDIyODc0LDIyODcyLDIxMjYzLDIzNTg2LDIzNTg5LDIzNTk2LDIzNjA0LDI1MTY0LDI1MTk0LDI1MjQ3LDI1Mjc1LDI1MjkwLDI1MzA2LDI1MzAzLDI1MzI2LDI1Mzc4LDI1MzM0LDI1NDAxLDI1NDE5LDI1NDExLDI1NTE3LDI1NTkwLDI1NDU3LDI1NDY2LDI1NDg2LDI1NTI0LDI1NDUzLDI1NTE2LDI1NDgyLDI1NDQ5LDI1NTE4LDI1NTMyLDI1NTg2LDI1NTkyLDI1NTY4LDI1NTk5LDI1NTQwLDI1NTY2LDI1NTUwLDI1NjgyLDI1NTQyLDI1NTM0LDI1NjY5LDI1NjY1LDI1NjExLDI1NjI3LDI1NjMyLDI1NjEyLDI1NjM4LDI1NjMzLDI1Njk0LDI1NzMyLDI1NzA5LDI1NzUwLDM2ODg5LDM2ODkyLDM2ODk5LDM2OTAwLDM2OTAxLDM2OTAzLDM2OTA0LDM2OTA1LDM2OTA2LDM2OTA3LDM2OTA4LDM2OTEyLDM2OTEzLDM2OTE0LDM2OTE1LDM2OTE2LDM2OTE5LDM2OTIxLDM2OTIyLDM2OTI1LDM2OTI3LDM2OTI4LDM2OTMxLDM2OTMzLDM2OTM0LDM2OTM2LDM2OTM3LDM2OTM4LDM2OTM5LDM2OTQwLDM2OTQyLDM2OTQ4LDM2OTQ5LDM2OTUwLDM2OTUzLDM2OTU0LDM2OTU2LDM2OTU3LDM2OTU4LDM2OTU5LDM2OTYwLDM2OTYxLDM2OTY0LDM2OTY2LDM2OTY3LDM2OTY5LDM2OTcwLDM2OTcxLDM2OTcyLDM2OTc1LDM2OTc2LDM2OTc3LDM2OTc4LDM2OTc5LDM2OTgyLDM2OTgzLDM2OTg0LDM2OTg1LDM2OTg2LDM2OTg3LDM2OTg4LDM2OTkwLDM2OTkzLDM2OTk2LDM2OTk3LDM2OTk4LDM2OTk5LDM3MDAxLDM3MDAyLDM3MDA0LDM3MDA1LDM3MDA2LDM3MDA3LDM3MDA4LDM3MDEwLDM3MDEyLDM3MDE0LDM3MDE2LDM3MDE4LDM3MDIwLDM3MDIyLDM3MDIzLDM3MDI0LDM3MDI4LDM3MDI5LDM3MDMxLDM3MDMyLDM3MDMzLDM3MDM1LDM3MDM3LDM3MDQyLDM3MDQ3LDM3MDUyLDM3MDUzLDM3MDU1LDM3MDU2LDI1NzIyLDI1NzgzLDI1Nzg0LDI1NzUzLDI1Nzg2LDI1NzkyLDI1ODA4LDI1ODE1LDI1ODI4LDI1ODI2LDI1ODY1LDI1ODkzLDI1OTAyLDI0MzMxLDI0NTMwLDI5OTc3LDI0MzM3LDIxMzQzLDIxNDg5LDIxNTAxLDIxNDgxLDIxNDgwLDIxNDk5LDIxNTIyLDIxNTI2LDIxNTEwLDIxNTc5LDIxNTg2LDIxNTg3LDIxNTg4LDIxNTkwLDIxNTcxLDIxNTM3LDIxNTkxLDIxNTkzLDIxNTM5LDIxNTU0LDIxNjM0LDIxNjUyLDIxNjIzLDIxNjE3LDIxNjA0LDIxNjU4LDIxNjU5LDIxNjM2LDIxNjIyLDIxNjA2LDIxNjYxLDIxNzEyLDIxNjc3LDIxNjk4LDIxNjg0LDIxNzE0LDIxNjcxLDIxNjcwLDIxNzE1LDIxNzE2LDIxNjE4LDIxNjY3LDIxNzE3LDIxNjkxLDIxNjk1LDIxNzA4LDIxNzIxLDIxNzIyLDIxNzI0LDIxNjczLDIxNjc0LDIxNjY4LDIxNzI1LDIxNzExLDIxNzI2LDIxNzg3LDIxNzM1LDIxNzkyLDIxNzU3LDIxNzgwLDIxNzQ3LDIxNzk0LDIxNzk1LDIxNzc1LDIxNzc3LDIxNzk5LDIxODAyLDIxODYzLDIxOTAzLDIxOTQxLDIxODMzLDIxODY5LDIxODI1LDIxODQ1LDIxODIzLDIxODQwLDIxODIwLDM3MDU4LDM3MDU5LDM3MDYyLDM3MDY0LDM3MDY1LDM3MDY3LDM3MDY4LDM3MDY5LDM3MDc0LDM3MDc2LDM3MDc3LDM3MDc4LDM3MDgwLDM3MDgxLDM3MDgyLDM3MDg2LDM3MDg3LDM3MDg4LDM3MDkxLDM3MDkyLDM3MDkzLDM3MDk3LDM3MDk4LDM3MTAwLDM3MTAyLDM3MTA0LDM3MTA1LDM3MTA2LDM3MTA3LDM3MTA5LDM3MTEwLDM3MTExLDM3MTEzLDM3MTE0LDM3MTE1LDM3MTE2LDM3MTE5LDM3MTIwLDM3MTIxLDM3MTIzLDM3MTI1LDM3MTI2LDM3MTI3LDM3MTI4LDM3MTI5LDM3MTMwLDM3MTMxLDM3MTMyLDM3MTMzLDM3MTM0LDM3MTM1LDM3MTM2LDM3MTM3LDM3MTM4LDM3MTM5LDM3MTQwLDM3MTQxLDM3MTQyLDM3MTQzLDM3MTQ0LDM3MTQ2LDM3MTQ3LDM3MTQ4LDM3MTQ5LDM3MTUxLDM3MTUyLDM3MTUzLDM3MTU2LDM3MTU3LDM3MTU4LDM3MTU5LDM3MTYwLDM3MTYxLDM3MTYyLDM3MTYzLDM3MTY0LDM3MTY1LDM3MTY2LDM3MTY4LDM3MTcwLDM3MTcxLDM3MTcyLDM3MTczLDM3MTc0LDM3MTc1LDM3MTc2LDM3MTc4LDM3MTc5LDM3MTgwLDM3MTgxLDM3MTgyLDM3MTgzLDM3MTg0LDM3MTg1LDM3MTg2LDM3MTg4LDIxODE1LDIxODQ2LDIxODc3LDIxODc4LDIxODc5LDIxODExLDIxODA4LDIxODUyLDIxODk5LDIxOTcwLDIxODkxLDIxOTM3LDIxOTQ1LDIxODk2LDIxODg5LDIxOTE5LDIxODg2LDIxOTc0LDIxOTA1LDIxODgzLDIxOTgzLDIxOTQ5LDIxOTUwLDIxOTA4LDIxOTEzLDIxOTk0LDIyMDA3LDIxOTYxLDIyMDQ3LDIxOTY5LDIxOTk1LDIxOTk2LDIxOTcyLDIxOTkwLDIxOTgxLDIxOTU2LDIxOTk5LDIxOTg5LDIyMDAyLDIyMDAzLDIxOTY0LDIxOTY1LDIxOTkyLDIyMDA1LDIxOTg4LDM2NzU2LDIyMDQ2LDIyMDI0LDIyMDI4LDIyMDE3LDIyMDUyLDIyMDUxLDIyMDE0LDIyMDE2LDIyMDU1LDIyMDYxLDIyMTA0LDIyMDczLDIyMTAzLDIyMDYwLDIyMDkzLDIyMTE0LDIyMTA1LDIyMTA4LDIyMDkyLDIyMTAwLDIyMTUwLDIyMTE2LDIyMTI5LDIyMTIzLDIyMTM5LDIyMTQwLDIyMTQ5LDIyMTYzLDIyMTkxLDIyMjI4LDIyMjMxLDIyMjM3LDIyMjQxLDIyMjYxLDIyMjUxLDIyMjY1LDIyMjcxLDIyMjc2LDIyMjgyLDIyMjgxLDIyMzAwLDI0MDc5LDI0MDg5LDI0MDg0LDI0MDgxLDI0MTEzLDI0MTIzLDI0MTI0LDM3MTg5LDM3MTkxLDM3MTkyLDM3MjAxLDM3MjAzLDM3MjA0LDM3MjA1LDM3MjA2LDM3MjA4LDM3MjA5LDM3MjExLDM3MjEyLDM3MjE1LDM3MjE2LDM3MjIyLDM3MjIzLDM3MjI0LDM3MjI3LDM3MjI5LDM3MjM1LDM3MjQyLDM3MjQzLDM3MjQ0LDM3MjQ4LDM3MjQ5LDM3MjUwLDM3MjUxLDM3MjUyLDM3MjU0LDM3MjU2LDM3MjU4LDM3MjYyLDM3MjYzLDM3MjY3LDM3MjY4LDM3MjY5LDM3MjcwLDM3MjcxLDM3MjcyLDM3MjczLDM3Mjc2LDM3Mjc3LDM3Mjc4LDM3Mjc5LDM3MjgwLDM3MjgxLDM3Mjg0LDM3Mjg1LDM3Mjg2LDM3Mjg3LDM3Mjg4LDM3Mjg5LDM3MjkxLDM3MjkyLDM3Mjk2LDM3Mjk3LDM3Mjk4LDM3Mjk5LDM3MzAyLDM3MzAzLDM3MzA0LDM3MzA1LDM3MzA3LDM3MzA4LDM3MzA5LDM3MzEwLDM3MzExLDM3MzEyLDM3MzEzLDM3MzE0LDM3MzE1LDM3MzE2LDM3MzE3LDM3MzE4LDM3MzIwLDM3MzIzLDM3MzI4LDM3MzMwLDM3MzMxLDM3MzMyLDM3MzMzLDM3MzM0LDM3MzM1LDM3MzM2LDM3MzM3LDM3MzM4LDM3MzM5LDM3MzQxLDM3MzQyLDM3MzQzLDM3MzQ0LDM3MzQ1LDM3MzQ2LDM3MzQ3LDM3MzQ4LDM3MzQ5LDI0MTE5LDI0MTMyLDI0MTQ4LDI0MTU1LDI0MTU4LDI0MTYxLDIzNjkyLDIzNjc0LDIzNjkzLDIzNjk2LDIzNzAyLDIzNjg4LDIzNzA0LDIzNzA1LDIzNjk3LDIzNzA2LDIzNzA4LDIzNzMzLDIzNzE0LDIzNzQxLDIzNzI0LDIzNzIzLDIzNzI5LDIzNzE1LDIzNzQ1LDIzNzM1LDIzNzQ4LDIzNzYyLDIzNzgwLDIzNzU1LDIzNzgxLDIzODEwLDIzODExLDIzODQ3LDIzODQ2LDIzODU0LDIzODQ0LDIzODM4LDIzODE0LDIzODM1LDIzODk2LDIzODcwLDIzODYwLDIzODY5LDIzOTE2LDIzODk5LDIzOTE5LDIzOTAxLDIzOTE1LDIzODgzLDIzODgyLDIzOTEzLDIzOTI0LDIzOTM4LDIzOTYxLDIzOTY1LDM1OTU1LDIzOTkxLDI0MDA1LDI0NDM1LDI0NDM5LDI0NDUwLDI0NDU1LDI0NDU3LDI0NDYwLDI0NDY5LDI0NDczLDI0NDc2LDI0NDg4LDI0NDkzLDI0NTAxLDI0NTA4LDM0OTE0LDI0NDE3LDI5MzU3LDI5MzYwLDI5MzY0LDI5MzY3LDI5MzY4LDI5Mzc5LDI5Mzc3LDI5MzkwLDI5Mzg5LDI5Mzk0LDI5NDE2LDI5NDIzLDI5NDE3LDI5NDI2LDI5NDI4LDI5NDMxLDI5NDQxLDI5NDI3LDI5NDQzLDI5NDM0LDM3MzUwLDM3MzUxLDM3MzUyLDM3MzUzLDM3MzU0LDM3MzU1LDM3MzU2LDM3MzU3LDM3MzU4LDM3MzU5LDM3MzYwLDM3MzYxLDM3MzYyLDM3MzYzLDM3MzY0LDM3MzY1LDM3MzY2LDM3MzY3LDM3MzY4LDM3MzY5LDM3MzcwLDM3MzcxLDM3MzcyLDM3MzczLDM3Mzc0LDM3Mzc1LDM3Mzc2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzg3LDM3Mzg4LDM3Mzg5LDM3MzkwLDM3MzkxLDM3MzkyLDM3MzkzLDM3Mzk0LDM3Mzk1LDM3Mzk2LDM3Mzk3LDM3Mzk4LDM3Mzk5LDM3NDAwLDM3NDAxLDM3NDAyLDM3NDAzLDM3NDA0LDM3NDA1LDM3NDA2LDM3NDA3LDM3NDA4LDM3NDA5LDM3NDEwLDM3NDExLDM3NDEyLDM3NDEzLDM3NDE0LDM3NDE1LDM3NDE2LDM3NDE3LDM3NDE4LDM3NDE5LDM3NDIwLDM3NDIxLDM3NDIyLDM3NDIzLDM3NDI0LDM3NDI1LDM3NDI2LDM3NDI3LDM3NDI4LDM3NDI5LDM3NDMwLDM3NDMxLDM3NDMyLDM3NDMzLDM3NDM0LDM3NDM1LDM3NDM2LDM3NDM3LDM3NDM4LDM3NDM5LDM3NDQwLDM3NDQxLDM3NDQyLDM3NDQzLDM3NDQ0LDM3NDQ1LDI5NDM1LDI5NDYzLDI5NDU5LDI5NDczLDI5NDUwLDI5NDcwLDI5NDY5LDI5NDYxLDI5NDc0LDI5NDk3LDI5NDc3LDI5NDg0LDI5NDk2LDI5NDg5LDI5NTIwLDI5NTE3LDI5NTI3LDI5NTM2LDI5NTQ4LDI5NTUxLDI5NTY2LDMzMzA3LDIyODIxLDM5MTQzLDIyODIwLDIyNzg2LDM5MjY3LDM5MjcxLDM5MjcyLDM5MjczLDM5Mjc0LDM5Mjc1LDM5Mjc2LDM5Mjg0LDM5Mjg3LDM5MjkzLDM5Mjk2LDM5MzAwLDM5MzAzLDM5MzA2LDM5MzA5LDM5MzEyLDM5MzEzLDM5MzE1LDM5MzE2LDM5MzE3LDI0MTkyLDI0MjA5LDI0MjAzLDI0MjE0LDI0MjI5LDI0MjI0LDI0MjQ5LDI0MjQ1LDI0MjU0LDI0MjQzLDM2MTc5LDI0Mjc0LDI0MjczLDI0MjgzLDI0Mjk2LDI0Mjk4LDMzMjEwLDI0NTE2LDI0NTIxLDI0NTM0LDI0NTI3LDI0NTc5LDI0NTU4LDI0NTgwLDI0NTQ1LDI0NTQ4LDI0NTc0LDI0NTgxLDI0NTgyLDI0NTU0LDI0NTU3LDI0NTY4LDI0NjAxLDI0NjI5LDI0NjE0LDI0NjAzLDI0NTkxLDI0NTg5LDI0NjE3LDI0NjE5LDI0NTg2LDI0NjM5LDI0NjA5LDI0Njk2LDI0Njk3LDI0Njk5LDI0Njk4LDI0NjQyLDM3NDQ2LDM3NDQ3LDM3NDQ4LDM3NDQ5LDM3NDUwLDM3NDUxLDM3NDUyLDM3NDUzLDM3NDU0LDM3NDU1LDM3NDU2LDM3NDU3LDM3NDU4LDM3NDU5LDM3NDYwLDM3NDYxLDM3NDYyLDM3NDYzLDM3NDY0LDM3NDY1LDM3NDY2LDM3NDY3LDM3NDY4LDM3NDY5LDM3NDcwLDM3NDcxLDM3NDcyLDM3NDczLDM3NDc0LDM3NDc1LDM3NDc2LDM3NDc3LDM3NDc4LDM3NDc5LDM3NDgwLDM3NDgxLDM3NDgyLDM3NDgzLDM3NDg0LDM3NDg1LDM3NDg2LDM3NDg3LDM3NDg4LDM3NDg5LDM3NDkwLDM3NDkxLDM3NDkzLDM3NDk0LDM3NDk1LDM3NDk2LDM3NDk3LDM3NDk4LDM3NDk5LDM3NTAwLDM3NTAxLDM3NTAyLDM3NTAzLDM3NTA0LDM3NTA1LDM3NTA2LDM3NTA3LDM3NTA4LDM3NTA5LDM3NTEwLDM3NTExLDM3NTEyLDM3NTEzLDM3NTE0LDM3NTE1LDM3NTE2LDM3NTE3LDM3NTE5LDM3NTIwLDM3NTIxLDM3NTIyLDM3NTIzLDM3NTI0LDM3NTI1LDM3NTI2LDM3NTI3LDM3NTI4LDM3NTI5LDM3NTMwLDM3NTMxLDM3NTMyLDM3NTMzLDM3NTM0LDM3NTM1LDM3NTM2LDM3NTM3LDM3NTM4LDM3NTM5LDM3NTQwLDM3NTQxLDM3NTQyLDM3NTQzLDI0NjgyLDI0NzAxLDI0NzI2LDI0NzMwLDI0NzQ5LDI0NzMzLDI0NzA3LDI0NzIyLDI0NzE2LDI0NzMxLDI0ODEyLDI0NzYzLDI0NzUzLDI0Nzk3LDI0NzkyLDI0Nzc0LDI0Nzk0LDI0NzU2LDI0ODY0LDI0ODcwLDI0ODUzLDI0ODY3LDI0ODIwLDI0ODMyLDI0ODQ2LDI0ODc1LDI0OTA2LDI0OTQ5LDI1MDA0LDI0OTgwLDI0OTk5LDI1MDE1LDI1MDQ0LDI1MDc3LDI0NTQxLDM4NTc5LDM4Mzc3LDM4Mzc5LDM4Mzg1LDM4Mzg3LDM4Mzg5LDM4MzkwLDM4Mzk2LDM4Mzk4LDM4NDAzLDM4NDA0LDM4NDA2LDM4NDA4LDM4NDEwLDM4NDExLDM4NDEyLDM4NDEzLDM4NDE1LDM4NDE4LDM4NDIxLDM4NDIyLDM4NDIzLDM4NDI1LDM4NDI2LDIwMDEyLDI5MjQ3LDI1MTA5LDI3NzAxLDI3NzMyLDI3NzQwLDI3NzIyLDI3ODExLDI3NzgxLDI3NzkyLDI3Nzk2LDI3Nzg4LDI3NzUyLDI3NzUzLDI3NzY0LDI3NzY2LDI3NzgyLDI3ODE3LDI3ODU2LDI3ODYwLDI3ODIxLDI3ODk1LDI3ODk2LDI3ODg5LDI3ODYzLDI3ODI2LDI3ODcyLDI3ODYyLDI3ODk4LDI3ODgzLDI3ODg2LDI3ODI1LDI3ODU5LDI3ODg3LDI3OTAyLDM3NTQ0LDM3NTQ1LDM3NTQ2LDM3NTQ3LDM3NTQ4LDM3NTQ5LDM3NTUxLDM3NTUyLDM3NTUzLDM3NTU0LDM3NTU1LDM3NTU2LDM3NTU3LDM3NTU4LDM3NTU5LDM3NTYwLDM3NTYxLDM3NTYyLDM3NTYzLDM3NTY0LDM3NTY1LDM3NTY2LDM3NTY3LDM3NTY4LDM3NTY5LDM3NTcwLDM3NTcxLDM3NTcyLDM3NTczLDM3NTc0LDM3NTc1LDM3NTc3LDM3NTc4LDM3NTc5LDM3NTgwLDM3NTgxLDM3NTgyLDM3NTgzLDM3NTg0LDM3NTg1LDM3NTg2LDM3NTg3LDM3NTg4LDM3NTg5LDM3NTkwLDM3NTkxLDM3NTkyLDM3NTkzLDM3NTk0LDM3NTk1LDM3NTk2LDM3NTk3LDM3NTk4LDM3NTk5LDM3NjAwLDM3NjAxLDM3NjAyLDM3NjAzLDM3NjA0LDM3NjA1LDM3NjA2LDM3NjA3LDM3NjA4LDM3NjA5LDM3NjEwLDM3NjExLDM3NjEyLDM3NjEzLDM3NjE0LDM3NjE1LDM3NjE2LDM3NjE3LDM3NjE4LDM3NjE5LDM3NjIwLDM3NjIxLDM3NjIyLDM3NjIzLDM3NjI0LDM3NjI1LDM3NjI2LDM3NjI3LDM3NjI4LDM3NjI5LDM3NjMwLDM3NjMxLDM3NjMyLDM3NjMzLDM3NjM0LDM3NjM1LDM3NjM2LDM3NjM3LDM3NjM4LDM3NjM5LDM3NjQwLDM3NjQxLDI3OTYxLDI3OTQzLDI3OTE2LDI3OTcxLDI3OTc2LDI3OTExLDI3OTA4LDI3OTI5LDI3OTE4LDI3OTQ3LDI3OTgxLDI3OTUwLDI3OTU3LDI3OTMwLDI3OTgzLDI3OTg2LDI3OTg4LDI3OTU1LDI4MDQ5LDI4MDE1LDI4MDYyLDI4MDY0LDI3OTk4LDI4MDUxLDI4MDUyLDI3OTk2LDI4MDAwLDI4MDI4LDI4MDAzLDI4MTg2LDI4MTAzLDI4MTAxLDI4MTI2LDI4MTc0LDI4MDk1LDI4MTI4LDI4MTc3LDI4MTM0LDI4MTI1LDI4MTIxLDI4MTgyLDI4MDc1LDI4MTcyLDI4MDc4LDI4MjAzLDI4MjcwLDI4MjM4LDI4MjY3LDI4MzM4LDI4MjU1LDI4Mjk0LDI4MjQzLDI4MjQ0LDI4MjEwLDI4MTk3LDI4MjI4LDI4MzgzLDI4MzM3LDI4MzEyLDI4Mzg0LDI4NDYxLDI4Mzg2LDI4MzI1LDI4MzI3LDI4MzQ5LDI4MzQ3LDI4MzQzLDI4Mzc1LDI4MzQwLDI4MzY3LDI4MzAzLDI4MzU0LDI4MzE5LDI4NTE0LDI4NDg2LDI4NDg3LDI4NDUyLDI4NDM3LDI4NDA5LDI4NDYzLDI4NDcwLDI4NDkxLDI4NTMyLDI4NDU4LDI4NDI1LDI4NDU3LDI4NTUzLDI4NTU3LDI4NTU2LDI4NTM2LDI4NTMwLDI4NTQwLDI4NTM4LDI4NjI1LDM3NjQyLDM3NjQzLDM3NjQ0LDM3NjQ1LDM3NjQ2LDM3NjQ3LDM3NjQ4LDM3NjQ5LDM3NjUwLDM3NjUxLDM3NjUyLDM3NjUzLDM3NjU0LDM3NjU1LDM3NjU2LDM3NjU3LDM3NjU4LDM3NjU5LDM3NjYwLDM3NjYxLDM3NjYyLDM3NjYzLDM3NjY0LDM3NjY1LDM3NjY2LDM3NjY3LDM3NjY4LDM3NjY5LDM3NjcwLDM3NjcxLDM3NjcyLDM3NjczLDM3Njc0LDM3Njc1LDM3Njc2LDM3Njc3LDM3Njc4LDM3Njc5LDM3NjgwLDM3NjgxLDM3NjgyLDM3NjgzLDM3Njg0LDM3Njg1LDM3Njg2LDM3Njg3LDM3Njg4LDM3Njg5LDM3NjkwLDM3NjkxLDM3NjkyLDM3NjkzLDM3Njk1LDM3Njk2LDM3Njk3LDM3Njk4LDM3Njk5LDM3NzAwLDM3NzAxLDM3NzAyLDM3NzAzLDM3NzA0LDM3NzA1LDM3NzA2LDM3NzA3LDM3NzA4LDM3NzA5LDM3NzEwLDM3NzExLDM3NzEyLDM3NzEzLDM3NzE0LDM3NzE1LDM3NzE2LDM3NzE3LDM3NzE4LDM3NzE5LDM3NzIwLDM3NzIxLDM3NzIyLDM3NzIzLDM3NzI0LDM3NzI1LDM3NzI2LDM3NzI3LDM3NzI4LDM3NzI5LDM3NzMwLDM3NzMxLDM3NzMyLDM3NzMzLDM3NzM0LDM3NzM1LDM3NzM2LDM3NzM3LDM3NzM5LDI4NjE3LDI4NTgzLDI4NjAxLDI4NTk4LDI4NjEwLDI4NjQxLDI4NjU0LDI4NjM4LDI4NjQwLDI4NjU1LDI4Njk4LDI4NzA3LDI4Njk5LDI4NzI5LDI4NzI1LDI4NzUxLDI4NzY2LDIzNDI0LDIzNDI4LDIzNDQ1LDIzNDQzLDIzNDYxLDIzNDgwLDI5OTk5LDM5NTgyLDI1NjUyLDIzNTI0LDIzNTM0LDM1MTIwLDIzNTM2LDM2NDIzLDM1NTkxLDM2NzkwLDM2ODE5LDM2ODIxLDM2ODM3LDM2ODQ2LDM2ODM2LDM2ODQxLDM2ODM4LDM2ODUxLDM2ODQwLDM2ODY5LDM2ODY4LDM2ODc1LDM2OTAyLDM2ODgxLDM2ODc3LDM2ODg2LDM2ODk3LDM2OTE3LDM2OTE4LDM2OTA5LDM2OTExLDM2OTMyLDM2OTQ1LDM2OTQ2LDM2OTQ0LDM2OTY4LDM2OTUyLDM2OTYyLDM2OTU1LDI2Mjk3LDM2OTgwLDM2OTg5LDM2OTk0LDM3MDAwLDM2OTk1LDM3MDAzLDI0NDAwLDI0NDA3LDI0NDA2LDI0NDA4LDIzNjExLDIxNjc1LDIzNjMyLDIzNjQxLDIzNDA5LDIzNjUxLDIzNjU0LDMyNzAwLDI0MzYyLDI0MzYxLDI0MzY1LDMzMzk2LDI0MzgwLDM5NzM5LDIzNjYyLDIyOTEzLDIyOTE1LDIyOTI1LDIyOTUzLDIyOTU0LDIyOTQ3LDM3NzQwLDM3NzQxLDM3NzQyLDM3NzQzLDM3NzQ0LDM3NzQ1LDM3NzQ2LDM3NzQ3LDM3NzQ4LDM3NzQ5LDM3NzUwLDM3NzUxLDM3NzUyLDM3NzUzLDM3NzU0LDM3NzU1LDM3NzU2LDM3NzU3LDM3NzU4LDM3NzU5LDM3NzYwLDM3NzYxLDM3NzYyLDM3NzYzLDM3NzY0LDM3NzY1LDM3NzY2LDM3NzY3LDM3NzY4LDM3NzY5LDM3NzcwLDM3NzcxLDM3NzcyLDM3NzczLDM3Nzc0LDM3Nzc2LDM3Nzc3LDM3Nzc4LDM3Nzc5LDM3NzgwLDM3NzgxLDM3NzgyLDM3NzgzLDM3Nzg0LDM3Nzg1LDM3Nzg2LDM3Nzg3LDM3Nzg4LDM3Nzg5LDM3NzkwLDM3NzkxLDM3NzkyLDM3NzkzLDM3Nzk0LDM3Nzk1LDM3Nzk2LDM3Nzk3LDM3Nzk4LDM3Nzk5LDM3ODAwLDM3ODAxLDM3ODAyLDM3ODAzLDM3ODA0LDM3ODA1LDM3ODA2LDM3ODA3LDM3ODA4LDM3ODA5LDM3ODEwLDM3ODExLDM3ODEyLDM3ODEzLDM3ODE0LDM3ODE1LDM3ODE2LDM3ODE3LDM3ODE4LDM3ODE5LDM3ODIwLDM3ODIxLDM3ODIyLDM3ODIzLDM3ODI0LDM3ODI1LDM3ODI2LDM3ODI3LDM3ODI4LDM3ODI5LDM3ODMwLDM3ODMxLDM3ODMyLDM3ODMzLDM3ODM1LDM3ODM2LDM3ODM3LDIyOTM1LDIyOTg2LDIyOTU1LDIyOTQyLDIyOTQ4LDIyOTk0LDIyOTYyLDIyOTU5LDIyOTk5LDIyOTc0LDIzMDQ1LDIzMDQ2LDIzMDA1LDIzMDQ4LDIzMDExLDIzMDAwLDIzMDMzLDIzMDUyLDIzMDQ5LDIzMDkwLDIzMDkyLDIzMDU3LDIzMDc1LDIzMDU5LDIzMTA0LDIzMTQzLDIzMTE0LDIzMTI1LDIzMTAwLDIzMTM4LDIzMTU3LDMzMDA0LDIzMjEwLDIzMTk1LDIzMTU5LDIzMTYyLDIzMjMwLDIzMjc1LDIzMjE4LDIzMjUwLDIzMjUyLDIzMjI0LDIzMjY0LDIzMjY3LDIzMjgxLDIzMjU0LDIzMjcwLDIzMjU2LDIzMjYwLDIzMzA1LDIzMzE5LDIzMzE4LDIzMzQ2LDIzMzUxLDIzMzYwLDIzNTczLDIzNTgwLDIzMzg2LDIzMzk3LDIzNDExLDIzMzc3LDIzMzc5LDIzMzk0LDM5NTQxLDM5NTQzLDM5NTQ0LDM5NTQ2LDM5NTUxLDM5NTQ5LDM5NTUyLDM5NTUzLDM5NTU3LDM5NTYwLDM5NTYyLDM5NTY4LDM5NTcwLDM5NTcxLDM5NTc0LDM5NTc2LDM5NTc5LDM5NTgwLDM5NTgxLDM5NTgzLDM5NTg0LDM5NTg2LDM5NTg3LDM5NTg5LDM5NTkxLDMyNDE1LDMyNDE3LDMyNDE5LDMyNDIxLDMyNDI0LDMyNDI1LDM3ODM4LDM3ODM5LDM3ODQwLDM3ODQxLDM3ODQyLDM3ODQzLDM3ODQ0LDM3ODQ1LDM3ODQ3LDM3ODQ4LDM3ODQ5LDM3ODUwLDM3ODUxLDM3ODUyLDM3ODUzLDM3ODU0LDM3ODU1LDM3ODU2LDM3ODU3LDM3ODU4LDM3ODU5LDM3ODYwLDM3ODYxLDM3ODYyLDM3ODYzLDM3ODY0LDM3ODY1LDM3ODY2LDM3ODY3LDM3ODY4LDM3ODY5LDM3ODcwLDM3ODcxLDM3ODcyLDM3ODczLDM3ODc0LDM3ODc1LDM3ODc2LDM3ODc3LDM3ODc4LDM3ODc5LDM3ODgwLDM3ODgxLDM3ODgyLDM3ODgzLDM3ODg0LDM3ODg1LDM3ODg2LDM3ODg3LDM3ODg4LDM3ODg5LDM3ODkwLDM3ODkxLDM3ODkyLDM3ODkzLDM3ODk0LDM3ODk1LDM3ODk2LDM3ODk3LDM3ODk4LDM3ODk5LDM3OTAwLDM3OTAxLDM3OTAyLDM3OTAzLDM3OTA0LDM3OTA1LDM3OTA2LDM3OTA3LDM3OTA4LDM3OTA5LDM3OTEwLDM3OTExLDM3OTEyLDM3OTEzLDM3OTE0LDM3OTE1LDM3OTE2LDM3OTE3LDM3OTE4LDM3OTE5LDM3OTIwLDM3OTIxLDM3OTIyLDM3OTIzLDM3OTI0LDM3OTI1LDM3OTI2LDM3OTI3LDM3OTI4LDM3OTI5LDM3OTMwLDM3OTMxLDM3OTMyLDM3OTMzLDM3OTM0LDMyNDI5LDMyNDMyLDMyNDQ2LDMyNDQ4LDMyNDQ5LDMyNDUwLDMyNDU3LDMyNDU5LDMyNDYwLDMyNDY0LDMyNDY4LDMyNDcxLDMyNDc1LDMyNDgwLDMyNDgxLDMyNDg4LDMyNDkxLDMyNDk0LDMyNDk1LDMyNDk3LDMyNDk4LDMyNTI1LDMyNTAyLDMyNTA2LDMyNTA3LDMyNTEwLDMyNTEzLDMyNTE0LDMyNTE1LDMyNTE5LDMyNTIwLDMyNTIzLDMyNTI0LDMyNTI3LDMyNTI5LDMyNTMwLDMyNTM1LDMyNTM3LDMyNTQwLDMyNTM5LDMyNTQzLDMyNTQ1LDMyNTQ2LDMyNTQ3LDMyNTQ4LDMyNTQ5LDMyNTUwLDMyNTUxLDMyNTU0LDMyNTU1LDMyNTU2LDMyNTU3LDMyNTU5LDMyNTYwLDMyNTYxLDMyNTYyLDMyNTYzLDMyNTY1LDI0MTg2LDMwMDc5LDI0MDI3LDMwMDE0LDM3MDEzLDI5NTgyLDI5NTg1LDI5NjE0LDI5NjAyLDI5NTk5LDI5NjQ3LDI5NjM0LDI5NjQ5LDI5NjIzLDI5NjE5LDI5NjMyLDI5NjQxLDI5NjQwLDI5NjY5LDI5NjU3LDM5MDM2LDI5NzA2LDI5NjczLDI5NjcxLDI5NjYyLDI5NjI2LDI5NjgyLDI5NzExLDI5NzM4LDI5Nzg3LDI5NzM0LDI5NzMzLDI5NzM2LDI5NzQ0LDI5NzQyLDI5NzQwLDM3OTM1LDM3OTM2LDM3OTM3LDM3OTM4LDM3OTM5LDM3OTQwLDM3OTQxLDM3OTQyLDM3OTQzLDM3OTQ0LDM3OTQ1LDM3OTQ2LDM3OTQ3LDM3OTQ4LDM3OTQ5LDM3OTUxLDM3OTUyLDM3OTUzLDM3OTU0LDM3OTU1LDM3OTU2LDM3OTU3LDM3OTU4LDM3OTU5LDM3OTYwLDM3OTYxLDM3OTYyLDM3OTYzLDM3OTY0LDM3OTY1LDM3OTY2LDM3OTY3LDM3OTY4LDM3OTY5LDM3OTcwLDM3OTcxLDM3OTcyLDM3OTczLDM3OTc0LDM3OTc1LDM3OTc2LDM3OTc3LDM3OTc4LDM3OTc5LDM3OTgwLDM3OTgxLDM3OTgyLDM3OTgzLDM3OTg0LDM3OTg1LDM3OTg2LDM3OTg3LDM3OTg4LDM3OTg5LDM3OTkwLDM3OTkxLDM3OTkyLDM3OTkzLDM3OTk0LDM3OTk2LDM3OTk3LDM3OTk4LDM3OTk5LDM4MDAwLDM4MDAxLDM4MDAyLDM4MDAzLDM4MDA0LDM4MDA1LDM4MDA2LDM4MDA3LDM4MDA4LDM4MDA5LDM4MDEwLDM4MDExLDM4MDEyLDM4MDEzLDM4MDE0LDM4MDE1LDM4MDE2LDM4MDE3LDM4MDE4LDM4MDE5LDM4MDIwLDM4MDMzLDM4MDM4LDM4MDQwLDM4MDg3LDM4MDk1LDM4MDk5LDM4MTAwLDM4MTA2LDM4MTE4LDM4MTM5LDM4MTcyLDM4MTc2LDI5NzIzLDI5NzIyLDI5NzYxLDI5Nzg4LDI5NzgzLDI5NzgxLDI5Nzg1LDI5ODE1LDI5ODA1LDI5ODIyLDI5ODUyLDI5ODM4LDI5ODI0LDI5ODI1LDI5ODMxLDI5ODM1LDI5ODU0LDI5ODY0LDI5ODY1LDI5ODQwLDI5ODYzLDI5OTA2LDI5ODgyLDM4ODkwLDM4ODkxLDM4ODkyLDI2NDQ0LDI2NDUxLDI2NDYyLDI2NDQwLDI2NDczLDI2NTMzLDI2NTAzLDI2NDc0LDI2NDgzLDI2NTIwLDI2NTM1LDI2NDg1LDI2NTM2LDI2NTI2LDI2NTQxLDI2NTA3LDI2NDg3LDI2NDkyLDI2NjA4LDI2NjMzLDI2NTg0LDI2NjM0LDI2NjAxLDI2NTQ0LDI2NjM2LDI2NTg1LDI2NTQ5LDI2NTg2LDI2NTQ3LDI2NTg5LDI2NjI0LDI2NTYzLDI2NTUyLDI2NTk0LDI2NjM4LDI2NTYxLDI2NjIxLDI2Njc0LDI2Njc1LDI2NzIwLDI2NzIxLDI2NzAyLDI2NzIyLDI2NjkyLDI2NzI0LDI2NzU1LDI2NjUzLDI2NzA5LDI2NzI2LDI2Njg5LDI2NzI3LDI2Njg4LDI2Njg2LDI2Njk4LDI2Njk3LDI2NjY1LDI2ODA1LDI2NzY3LDI2NzQwLDI2NzQzLDI2NzcxLDI2NzMxLDI2ODE4LDI2OTkwLDI2ODc2LDI2OTExLDI2OTEyLDI2ODczLDM4MTgzLDM4MTk1LDM4MjA1LDM4MjExLDM4MjE2LDM4MjE5LDM4MjI5LDM4MjM0LDM4MjQwLDM4MjU0LDM4MjYwLDM4MjYxLDM4MjYzLDM4MjY0LDM4MjY1LDM4MjY2LDM4MjY3LDM4MjY4LDM4MjY5LDM4MjcwLDM4MjcyLDM4MjczLDM4Mjc0LDM4Mjc1LDM4Mjc2LDM4Mjc3LDM4Mjc4LDM4Mjc5LDM4MjgwLDM4MjgxLDM4MjgyLDM4MjgzLDM4Mjg0LDM4Mjg1LDM4Mjg2LDM4Mjg3LDM4Mjg4LDM4Mjg5LDM4MjkwLDM4MjkxLDM4MjkyLDM4MjkzLDM4Mjk0LDM4Mjk1LDM4Mjk2LDM4Mjk3LDM4Mjk4LDM4Mjk5LDM4MzAwLDM4MzAxLDM4MzAyLDM4MzAzLDM4MzA0LDM4MzA1LDM4MzA2LDM4MzA3LDM4MzA4LDM4MzA5LDM4MzEwLDM4MzExLDM4MzEyLDM4MzEzLDM4MzE0LDM4MzE1LDM4MzE2LDM4MzE3LDM4MzE4LDM4MzE5LDM4MzIwLDM4MzIxLDM4MzIyLDM4MzIzLDM4MzI0LDM4MzI1LDM4MzI2LDM4MzI3LDM4MzI4LDM4MzI5LDM4MzMwLDM4MzMxLDM4MzMyLDM4MzMzLDM4MzM0LDM4MzM1LDM4MzM2LDM4MzM3LDM4MzM4LDM4MzM5LDM4MzQwLDM4MzQxLDM4MzQyLDM4MzQzLDM4MzQ0LDM4MzQ1LDM4MzQ2LDM4MzQ3LDI2OTE2LDI2ODY0LDI2ODkxLDI2ODgxLDI2OTY3LDI2ODUxLDI2ODk2LDI2OTkzLDI2OTM3LDI2OTc2LDI2OTQ2LDI2OTczLDI3MDEyLDI2OTg3LDI3MDA4LDI3MDMyLDI3MDAwLDI2OTMyLDI3MDg0LDI3MDE1LDI3MDE2LDI3MDg2LDI3MDE3LDI2OTgyLDI2OTc5LDI3MDAxLDI3MDM1LDI3MDQ3LDI3MDY3LDI3MDUxLDI3MDUzLDI3MDkyLDI3MDU3LDI3MDczLDI3MDgyLDI3MTAzLDI3MDI5LDI3MTA0LDI3MDIxLDI3MTM1LDI3MTgzLDI3MTE3LDI3MTU5LDI3MTYwLDI3MjM3LDI3MTIyLDI3MjA0LDI3MTk4LDI3Mjk2LDI3MjE2LDI3MjI3LDI3MTg5LDI3Mjc4LDI3MjU3LDI3MTk3LDI3MTc2LDI3MjI0LDI3MjYwLDI3MjgxLDI3MjgwLDI3MzA1LDI3Mjg3LDI3MzA3LDI5NDk1LDI5NTIyLDI3NTIxLDI3NTIyLDI3NTI3LDI3NTI0LDI3NTM4LDI3NTM5LDI3NTMzLDI3NTQ2LDI3NTQ3LDI3NTUzLDI3NTYyLDM2NzE1LDM2NzE3LDM2NzIxLDM2NzIyLDM2NzIzLDM2NzI1LDM2NzI2LDM2NzI4LDM2NzI3LDM2NzI5LDM2NzMwLDM2NzMyLDM2NzM0LDM2NzM3LDM2NzM4LDM2NzQwLDM2NzQzLDM2NzQ3LDM4MzQ4LDM4MzQ5LDM4MzUwLDM4MzUxLDM4MzUyLDM4MzUzLDM4MzU0LDM4MzU1LDM4MzU2LDM4MzU3LDM4MzU4LDM4MzU5LDM4MzYwLDM4MzYxLDM4MzYyLDM4MzYzLDM4MzY0LDM4MzY1LDM4MzY2LDM4MzY3LDM4MzY4LDM4MzY5LDM4MzcwLDM4MzcxLDM4MzcyLDM4MzczLDM4Mzc0LDM4Mzc1LDM4MzgwLDM4Mzk5LDM4NDA3LDM4NDE5LDM4NDI0LDM4NDI3LDM4NDMwLDM4NDMyLDM4NDM1LDM4NDM2LDM4NDM3LDM4NDM4LDM4NDM5LDM4NDQwLDM4NDQxLDM4NDQzLDM4NDQ0LDM4NDQ1LDM4NDQ3LDM4NDQ4LDM4NDU1LDM4NDU2LDM4NDU3LDM4NDU4LDM4NDYyLDM4NDY1LDM4NDY3LDM4NDc0LDM4NDc4LDM4NDc5LDM4NDgxLDM4NDgyLDM4NDgzLDM4NDg2LDM4NDg3LDM4NDg4LDM4NDg5LDM4NDkwLDM4NDkyLDM4NDkzLDM4NDk0LDM4NDk2LDM4NDk5LDM4NTAxLDM4NTAyLDM4NTA3LDM4NTA5LDM4NTEwLDM4NTExLDM4NTEyLDM4NTEzLDM4NTE1LDM4NTIwLDM4NTIxLDM4NTIyLDM4NTIzLDM4NTI0LDM4NTI1LDM4NTI2LDM4NTI3LDM4NTI4LDM4NTI5LDM4NTMwLDM4NTMxLDM4NTMyLDM4NTM1LDM4NTM3LDM4NTM4LDM2NzQ5LDM2NzUwLDM2NzUxLDM2NzYwLDM2NzYyLDM2NTU4LDI1MDk5LDI1MTExLDI1MTE1LDI1MTE5LDI1MTIyLDI1MTIxLDI1MTI1LDI1MTI0LDI1MTMyLDMzMjU1LDI5OTM1LDI5OTQwLDI5OTUxLDI5OTY3LDI5OTY5LDI5OTcxLDI1OTA4LDI2MDk0LDI2MDk1LDI2MDk2LDI2MTIyLDI2MTM3LDI2NDgyLDI2MTE1LDI2MTMzLDI2MTEyLDI4ODA1LDI2MzU5LDI2MTQxLDI2MTY0LDI2MTYxLDI2MTY2LDI2MTY1LDMyNzc0LDI2MjA3LDI2MTk2LDI2MTc3LDI2MTkxLDI2MTk4LDI2MjA5LDI2MTk5LDI2MjMxLDI2MjQ0LDI2MjUyLDI2Mjc5LDI2MjY5LDI2MzAyLDI2MzMxLDI2MzMyLDI2MzQyLDI2MzQ1LDM2MTQ2LDM2MTQ3LDM2MTUwLDM2MTU1LDM2MTU3LDM2MTYwLDM2MTY1LDM2MTY2LDM2MTY4LDM2MTY5LDM2MTY3LDM2MTczLDM2MTgxLDM2MTg1LDM1MjcxLDM1Mjc0LDM1Mjc1LDM1Mjc2LDM1Mjc4LDM1Mjc5LDM1MjgwLDM1MjgxLDI5Mjk0LDI5MzQzLDI5Mjc3LDI5Mjg2LDI5Mjk1LDI5MzEwLDI5MzExLDI5MzE2LDI5MzIzLDI5MzI1LDI5MzI3LDI5MzMwLDI1MzUyLDI1Mzk0LDI1NTIwLDM4NTQwLDM4NTQyLDM4NTQ1LDM4NTQ2LDM4NTQ3LDM4NTQ5LDM4NTUwLDM4NTU0LDM4NTU1LDM4NTU3LDM4NTU4LDM4NTU5LDM4NTYwLDM4NTYxLDM4NTYyLDM4NTYzLDM4NTY0LDM4NTY1LDM4NTY2LDM4NTY4LDM4NTY5LDM4NTcwLDM4NTcxLDM4NTcyLDM4NTczLDM4NTc0LDM4NTc1LDM4NTc3LDM4NTc4LDM4NTgwLDM4NTgxLDM4NTgzLDM4NTg0LDM4NTg2LDM4NTg3LDM4NTkxLDM4NTk0LDM4NTk1LDM4NjAwLDM4NjAyLDM4NjAzLDM4NjA4LDM4NjA5LDM4NjExLDM4NjEyLDM4NjE0LDM4NjE1LDM4NjE2LDM4NjE3LDM4NjE4LDM4NjE5LDM4NjIwLDM4NjIxLDM4NjIyLDM4NjIzLDM4NjI1LDM4NjI2LDM4NjI3LDM4NjI4LDM4NjI5LDM4NjMwLDM4NjMxLDM4NjM1LDM4NjM2LDM4NjM3LDM4NjM4LDM4NjQwLDM4NjQxLDM4NjQyLDM4NjQ0LDM4NjQ1LDM4NjQ4LDM4NjUwLDM4NjUxLDM4NjUyLDM4NjUzLDM4NjU1LDM4NjU4LDM4NjU5LDM4NjYxLDM4NjY2LDM4NjY3LDM4NjY4LDM4NjcyLDM4NjczLDM4Njc0LDM4Njc2LDM4Njc3LDM4Njc5LDM4NjgwLDM4NjgxLDM4NjgyLDM4NjgzLDM4Njg1LDM4Njg3LDM4Njg4LDI1NjYzLDI1ODE2LDMyNzcyLDI3NjI2LDI3NjM1LDI3NjQ1LDI3NjM3LDI3NjQxLDI3NjUzLDI3NjU1LDI3NjU0LDI3NjYxLDI3NjY5LDI3NjcyLDI3NjczLDI3Njc0LDI3NjgxLDI3Njg5LDI3Njg0LDI3NjkwLDI3Njk4LDI1OTA5LDI1OTQxLDI1OTYzLDI5MjYxLDI5MjY2LDI5MjcwLDI5MjMyLDM0NDAyLDIxMDE0LDMyOTI3LDMyOTI0LDMyOTE1LDMyOTU2LDI2Mzc4LDMyOTU3LDMyOTQ1LDMyOTM5LDMyOTQxLDMyOTQ4LDMyOTUxLDMyOTk5LDMzMDAwLDMzMDAxLDMzMDAyLDMyOTg3LDMyOTYyLDMyOTY0LDMyOTg1LDMyOTczLDMyOTgzLDI2Mzg0LDMyOTg5LDMzMDAzLDMzMDA5LDMzMDEyLDMzMDA1LDMzMDM3LDMzMDM4LDMzMDEwLDMzMDIwLDI2Mzg5LDMzMDQyLDM1OTMwLDMzMDc4LDMzMDU0LDMzMDY4LDMzMDQ4LDMzMDc0LDMzMDk2LDMzMTAwLDMzMTA3LDMzMTQwLDMzMTEzLDMzMTE0LDMzMTM3LDMzMTIwLDMzMTI5LDMzMTQ4LDMzMTQ5LDMzMTMzLDMzMTI3LDIyNjA1LDIzMjIxLDMzMTYwLDMzMTU0LDMzMTY5LDI4MzczLDMzMTg3LDMzMTk0LDMzMjI4LDI2NDA2LDMzMjI2LDMzMjExLDM4Njg5LDM4NjkwLDM4NjkxLDM4NjkyLDM4NjkzLDM4Njk0LDM4Njk1LDM4Njk2LDM4Njk3LDM4Njk5LDM4NzAwLDM4NzAyLDM4NzAzLDM4NzA1LDM4NzA3LDM4NzA4LDM4NzA5LDM4NzEwLDM4NzExLDM4NzE0LDM4NzE1LDM4NzE2LDM4NzE3LDM4NzE5LDM4NzIwLDM4NzIxLDM4NzIyLDM4NzIzLDM4NzI0LDM4NzI1LDM4NzI2LDM4NzI3LDM4NzI4LDM4NzI5LDM4NzMwLDM4NzMxLDM4NzMyLDM4NzMzLDM4NzM0LDM4NzM1LDM4NzM2LDM4NzM3LDM4NzQwLDM4NzQxLDM4NzQzLDM4NzQ0LDM4NzQ2LDM4NzQ4LDM4NzQ5LDM4NzUxLDM4NzU1LDM4NzU2LDM4NzU4LDM4NzU5LDM4NzYwLDM4NzYyLDM4NzYzLDM4NzY0LDM4NzY1LDM4NzY2LDM4NzY3LDM4NzY4LDM4NzY5LDM4NzcwLDM4NzczLDM4Nzc1LDM4Nzc2LDM4Nzc3LDM4Nzc4LDM4Nzc5LDM4NzgxLDM4NzgyLDM4NzgzLDM4Nzg0LDM4Nzg1LDM4Nzg2LDM4Nzg3LDM4Nzg4LDM4NzkwLDM4NzkxLDM4NzkyLDM4NzkzLDM4Nzk0LDM4Nzk2LDM4Nzk4LDM4Nzk5LDM4ODAwLDM4ODAzLDM4ODA1LDM4ODA2LDM4ODA3LDM4ODA5LDM4ODEwLDM4ODExLDM4ODEyLDM4ODEzLDMzMjE3LDMzMTkwLDI3NDI4LDI3NDQ3LDI3NDQ5LDI3NDU5LDI3NDYyLDI3NDgxLDM5MTIxLDM5MTIyLDM5MTIzLDM5MTI1LDM5MTI5LDM5MTMwLDI3NTcxLDI0Mzg0LDI3NTg2LDM1MzE1LDI2MDAwLDQwNzg1LDI2MDAzLDI2MDQ0LDI2MDU0LDI2MDUyLDI2MDUxLDI2MDYwLDI2MDYyLDI2MDY2LDI2MDcwLDI4ODAwLDI4ODI4LDI4ODIyLDI4ODI5LDI4ODU5LDI4ODY0LDI4ODU1LDI4ODQzLDI4ODQ5LDI4OTA0LDI4ODc0LDI4OTQ0LDI4OTQ3LDI4OTUwLDI4OTc1LDI4OTc3LDI5MDQzLDI5MDIwLDI5MDMyLDI4OTk3LDI5MDQyLDI5MDAyLDI5MDQ4LDI5MDUwLDI5MDgwLDI5MTA3LDI5MTA5LDI5MDk2LDI5MDg4LDI5MTUyLDI5MTQwLDI5MTU5LDI5MTc3LDI5MjEzLDI5MjI0LDI4NzgwLDI4OTUyLDI5MDMwLDI5MTEzLDI1MTUwLDI1MTQ5LDI1MTU1LDI1MTYwLDI1MTYxLDMxMDM1LDMxMDQwLDMxMDQ2LDMxMDQ5LDMxMDY3LDMxMDY4LDMxMDU5LDMxMDY2LDMxMDc0LDMxMDYzLDMxMDcyLDMxMDg3LDMxMDc5LDMxMDk4LDMxMTA5LDMxMTE0LDMxMTMwLDMxMTQzLDMxMTU1LDI0NTI5LDI0NTI4LDM4ODE0LDM4ODE1LDM4ODE3LDM4ODE4LDM4ODIwLDM4ODIxLDM4ODIyLDM4ODIzLDM4ODI0LDM4ODI1LDM4ODI2LDM4ODI4LDM4ODMwLDM4ODMyLDM4ODMzLDM4ODM1LDM4ODM3LDM4ODM4LDM4ODM5LDM4ODQwLDM4ODQxLDM4ODQyLDM4ODQzLDM4ODQ0LDM4ODQ1LDM4ODQ2LDM4ODQ3LDM4ODQ4LDM4ODQ5LDM4ODUwLDM4ODUxLDM4ODUyLDM4ODUzLDM4ODU0LDM4ODU1LDM4ODU2LDM4ODU3LDM4ODU4LDM4ODU5LDM4ODYwLDM4ODYxLDM4ODYyLDM4ODYzLDM4ODY0LDM4ODY1LDM4ODY2LDM4ODY3LDM4ODY4LDM4ODY5LDM4ODcwLDM4ODcxLDM4ODcyLDM4ODczLDM4ODc0LDM4ODc1LDM4ODc2LDM4ODc3LDM4ODc4LDM4ODc5LDM4ODgwLDM4ODgxLDM4ODgyLDM4ODgzLDM4ODg0LDM4ODg1LDM4ODg4LDM4ODk0LDM4ODk1LDM4ODk2LDM4ODk3LDM4ODk4LDM4OTAwLDM4OTAzLDM4OTA0LDM4OTA1LDM4OTA2LDM4OTA3LDM4OTA4LDM4OTA5LDM4OTEwLDM4OTExLDM4OTEyLDM4OTEzLDM4OTE0LDM4OTE1LDM4OTE2LDM4OTE3LDM4OTE4LDM4OTE5LDM4OTIwLDM4OTIxLDM4OTIyLDM4OTIzLDM4OTI0LDM4OTI1LDM4OTI2LDI0NjM2LDI0NjY5LDI0NjY2LDI0Njc5LDI0NjQxLDI0NjY1LDI0Njc1LDI0NzQ3LDI0ODM4LDI0ODQ1LDI0OTI1LDI1MDAxLDI0OTg5LDI1MDM1LDI1MDQxLDI1MDk0LDMyODk2LDMyODk1LDI3Nzk1LDI3ODk0LDI4MTU2LDMwNzEwLDMwNzEyLDMwNzIwLDMwNzI5LDMwNzQzLDMwNzQ0LDMwNzM3LDI2MDI3LDMwNzY1LDMwNzQ4LDMwNzQ5LDMwNzc3LDMwNzc4LDMwNzc5LDMwNzUxLDMwNzgwLDMwNzU3LDMwNzY0LDMwNzU1LDMwNzYxLDMwNzk4LDMwODI5LDMwODA2LDMwODA3LDMwNzU4LDMwODAwLDMwNzkxLDMwNzk2LDMwODI2LDMwODc1LDMwODY3LDMwODc0LDMwODU1LDMwODc2LDMwODgxLDMwODgzLDMwODk4LDMwOTA1LDMwODg1LDMwOTMyLDMwOTM3LDMwOTIxLDMwOTU2LDMwOTYyLDMwOTgxLDMwOTY0LDMwOTk1LDMxMDEyLDMxMDA2LDMxMDI4LDQwODU5LDQwNjk3LDQwNjk5LDQwNzAwLDMwNDQ5LDMwNDY4LDMwNDc3LDMwNDU3LDMwNDcxLDMwNDcyLDMwNDkwLDMwNDk4LDMwNDg5LDMwNTA5LDMwNTAyLDMwNTE3LDMwNTIwLDMwNTQ0LDMwNTQ1LDMwNTM1LDMwNTMxLDMwNTU0LDMwNTY4LDM4OTI3LDM4OTI4LDM4OTI5LDM4OTMwLDM4OTMxLDM4OTMyLDM4OTMzLDM4OTM0LDM4OTM1LDM4OTM2LDM4OTM3LDM4OTM4LDM4OTM5LDM4OTQwLDM4OTQxLDM4OTQyLDM4OTQzLDM4OTQ0LDM4OTQ1LDM4OTQ2LDM4OTQ3LDM4OTQ4LDM4OTQ5LDM4OTUwLDM4OTUxLDM4OTUyLDM4OTUzLDM4OTU0LDM4OTU1LDM4OTU2LDM4OTU3LDM4OTU4LDM4OTU5LDM4OTYwLDM4OTYxLDM4OTYyLDM4OTYzLDM4OTY0LDM4OTY1LDM4OTY2LDM4OTY3LDM4OTY4LDM4OTY5LDM4OTcwLDM4OTcxLDM4OTcyLDM4OTczLDM4OTc0LDM4OTc1LDM4OTc2LDM4OTc3LDM4OTc4LDM4OTc5LDM4OTgwLDM4OTgxLDM4OTgyLDM4OTgzLDM4OTg0LDM4OTg1LDM4OTg2LDM4OTg3LDM4OTg4LDM4OTg5LDM4OTkwLDM4OTkxLDM4OTkyLDM4OTkzLDM4OTk0LDM4OTk1LDM4OTk2LDM4OTk3LDM4OTk4LDM4OTk5LDM5MDAwLDM5MDAxLDM5MDAyLDM5MDAzLDM5MDA0LDM5MDA1LDM5MDA2LDM5MDA3LDM5MDA4LDM5MDA5LDM5MDEwLDM5MDExLDM5MDEyLDM5MDEzLDM5MDE0LDM5MDE1LDM5MDE2LDM5MDE3LDM5MDE4LDM5MDE5LDM5MDIwLDM5MDIxLDM5MDIyLDMwNTYyLDMwNTY1LDMwNTkxLDMwNjA1LDMwNTg5LDMwNTkyLDMwNjA0LDMwNjA5LDMwNjIzLDMwNjI0LDMwNjQwLDMwNjQ1LDMwNjUzLDMwMDEwLDMwMDE2LDMwMDMwLDMwMDI3LDMwMDI0LDMwMDQzLDMwMDY2LDMwMDczLDMwMDgzLDMyNjAwLDMyNjA5LDMyNjA3LDM1NDAwLDMyNjE2LDMyNjI4LDMyNjI1LDMyNjMzLDMyNjQxLDMyNjM4LDMwNDEzLDMwNDM3LDM0ODY2LDM4MDIxLDM4MDIyLDM4MDIzLDM4MDI3LDM4MDI2LDM4MDI4LDM4MDI5LDM4MDMxLDM4MDMyLDM4MDM2LDM4MDM5LDM4MDM3LDM4MDQyLDM4MDQzLDM4MDQ0LDM4MDUxLDM4MDUyLDM4MDU5LDM4MDU4LDM4MDYxLDM4MDYwLDM4MDYzLDM4MDY0LDM4MDY2LDM4MDY4LDM4MDcwLDM4MDcxLDM4MDcyLDM4MDczLDM4MDc0LDM4MDc2LDM4MDc3LDM4MDc5LDM4MDg0LDM4MDg4LDM4MDg5LDM4MDkwLDM4MDkxLDM4MDkyLDM4MDkzLDM4MDk0LDM4MDk2LDM4MDk3LDM4MDk4LDM4MTAxLDM4MTAyLDM4MTAzLDM4MTA1LDM4MTA0LDM4MTA3LDM4MTEwLDM4MTExLDM4MTEyLDM4MTE0LDM4MTE2LDM4MTE3LDM4MTE5LDM4MTIwLDM4MTIyLDM5MDIzLDM5MDI0LDM5MDI1LDM5MDI2LDM5MDI3LDM5MDI4LDM5MDUxLDM5MDU0LDM5MDU4LDM5MDYxLDM5MDY1LDM5MDc1LDM5MDgwLDM5MDgxLDM5MDgyLDM5MDgzLDM5MDg0LDM5MDg1LDM5MDg2LDM5MDg3LDM5MDg4LDM5MDg5LDM5MDkwLDM5MDkxLDM5MDkyLDM5MDkzLDM5MDk0LDM5MDk1LDM5MDk2LDM5MDk3LDM5MDk4LDM5MDk5LDM5MTAwLDM5MTAxLDM5MTAyLDM5MTAzLDM5MTA0LDM5MTA1LDM5MTA2LDM5MTA3LDM5MTA4LDM5MTA5LDM5MTEwLDM5MTExLDM5MTEyLDM5MTEzLDM5MTE0LDM5MTE1LDM5MTE2LDM5MTE3LDM5MTE5LDM5MTIwLDM5MTI0LDM5MTI2LDM5MTI3LDM5MTMxLDM5MTMyLDM5MTMzLDM5MTM2LDM5MTM3LDM5MTM4LDM5MTM5LDM5MTQwLDM5MTQxLDM5MTQyLDM5MTQ1LDM5MTQ2LDM5MTQ3LDM5MTQ4LDM5MTQ5LDM5MTUwLDM5MTUxLDM5MTUyLDM5MTUzLDM5MTU0LDM5MTU1LDM5MTU2LDM5MTU3LDM5MTU4LDM5MTU5LDM5MTYwLDM5MTYxLDM5MTYyLDM5MTYzLDM5MTY0LDM5MTY1LDM5MTY2LDM5MTY3LDM5MTY4LDM5MTY5LDM5MTcwLDM5MTcxLDM5MTcyLDM5MTczLDM5MTc0LDM5MTc1LDM4MTIxLDM4MTIzLDM4MTI2LDM4MTI3LDM4MTMxLDM4MTMyLDM4MTMzLDM4MTM1LDM4MTM3LDM4MTQwLDM4MTQxLDM4MTQzLDM4MTQ3LDM4MTQ2LDM4MTUwLDM4MTUxLDM4MTUzLDM4MTU0LDM4MTU3LDM4MTU4LDM4MTU5LDM4MTYyLDM4MTYzLDM4MTY0LDM4MTY1LDM4MTY2LDM4MTY4LDM4MTcxLDM4MTczLDM4MTc0LDM4MTc1LDM4MTc4LDM4MTg2LDM4MTg3LDM4MTg1LDM4MTg4LDM4MTkzLDM4MTk0LDM4MTk2LDM4MTk4LDM4MTk5LDM4MjAwLDM4MjA0LDM4MjA2LDM4MjA3LDM4MjEwLDM4MTk3LDM4MjEyLDM4MjEzLDM4MjE0LDM4MjE3LDM4MjIwLDM4MjIyLDM4MjIzLDM4MjI2LDM4MjI3LDM4MjI4LDM4MjMwLDM4MjMxLDM4MjMyLDM4MjMzLDM4MjM1LDM4MjM4LDM4MjM5LDM4MjM3LDM4MjQxLDM4MjQyLDM4MjQ0LDM4MjQ1LDM4MjQ2LDM4MjQ3LDM4MjQ4LDM4MjQ5LDM4MjUwLDM4MjUxLDM4MjUyLDM4MjU1LDM4MjU3LDM4MjU4LDM4MjU5LDM4MjAyLDMwNjk1LDMwNzAwLDM4NjAxLDMxMTg5LDMxMjEzLDMxMjAzLDMxMjExLDMxMjM4LDIzODc5LDMxMjM1LDMxMjM0LDMxMjYyLDMxMjUyLDM5MTc2LDM5MTc3LDM5MTc4LDM5MTc5LDM5MTgwLDM5MTgyLDM5MTgzLDM5MTg1LDM5MTg2LDM5MTg3LDM5MTg4LDM5MTg5LDM5MTkwLDM5MTkxLDM5MTkyLDM5MTkzLDM5MTk0LDM5MTk1LDM5MTk2LDM5MTk3LDM5MTk4LDM5MTk5LDM5MjAwLDM5MjAxLDM5MjAyLDM5MjAzLDM5MjA0LDM5MjA1LDM5MjA2LDM5MjA3LDM5MjA4LDM5MjA5LDM5MjEwLDM5MjExLDM5MjEyLDM5MjEzLDM5MjE1LDM5MjE2LDM5MjE3LDM5MjE4LDM5MjE5LDM5MjIwLDM5MjIxLDM5MjIyLDM5MjIzLDM5MjI0LDM5MjI1LDM5MjI2LDM5MjI3LDM5MjI4LDM5MjI5LDM5MjMwLDM5MjMxLDM5MjMyLDM5MjMzLDM5MjM0LDM5MjM1LDM5MjM2LDM5MjM3LDM5MjM4LDM5MjM5LDM5MjQwLDM5MjQxLDM5MjQyLDM5MjQzLDM5MjQ0LDM5MjQ1LDM5MjQ2LDM5MjQ3LDM5MjQ4LDM5MjQ5LDM5MjUwLDM5MjUxLDM5MjU0LDM5MjU1LDM5MjU2LDM5MjU3LDM5MjU4LDM5MjU5LDM5MjYwLDM5MjYxLDM5MjYyLDM5MjYzLDM5MjY0LDM5MjY1LDM5MjY2LDM5MjY4LDM5MjcwLDM5MjgzLDM5Mjg4LDM5Mjg5LDM5MjkxLDM5Mjk0LDM5Mjk4LDM5Mjk5LDM5MzA1LDMxMjg5LDMxMjg3LDMxMzEzLDQwNjU1LDM5MzMzLDMxMzQ0LDMwMzQ0LDMwMzUwLDMwMzU1LDMwMzYxLDMwMzcyLDI5OTE4LDI5OTIwLDI5OTk2LDQwNDgwLDQwNDgyLDQwNDg4LDQwNDg5LDQwNDkwLDQwNDkxLDQwNDkyLDQwNDk4LDQwNDk3LDQwNTAyLDQwNTA0LDQwNTAzLDQwNTA1LDQwNTA2LDQwNTEwLDQwNTEzLDQwNTE0LDQwNTE2LDQwNTE4LDQwNTE5LDQwNTIwLDQwNTIxLDQwNTIzLDQwNTI0LDQwNTI2LDQwNTI5LDQwNTMzLDQwNTM1LDQwNTM4LDQwNTM5LDQwNTQwLDQwNTQyLDQwNTQ3LDQwNTUwLDQwNTUxLDQwNTUyLDQwNTUzLDQwNTU0LDQwNTU1LDQwNTU2LDQwNTYxLDQwNTU3LDQwNTYzLDMwMDk4LDMwMTAwLDMwMTAyLDMwMTEyLDMwMTA5LDMwMTI0LDMwMTE1LDMwMTMxLDMwMTMyLDMwMTM2LDMwMTQ4LDMwMTI5LDMwMTI4LDMwMTQ3LDMwMTQ2LDMwMTY2LDMwMTU3LDMwMTc5LDMwMTg0LDMwMTgyLDMwMTgwLDMwMTg3LDMwMTgzLDMwMjExLDMwMTkzLDMwMjA0LDMwMjA3LDMwMjI0LDMwMjA4LDMwMjEzLDMwMjIwLDMwMjMxLDMwMjE4LDMwMjQ1LDMwMjMyLDMwMjI5LDMwMjMzLDM5MzA4LDM5MzEwLDM5MzIyLDM5MzIzLDM5MzI0LDM5MzI1LDM5MzI2LDM5MzI3LDM5MzI4LDM5MzI5LDM5MzMwLDM5MzMxLDM5MzMyLDM5MzM0LDM5MzM1LDM5MzM3LDM5MzM4LDM5MzM5LDM5MzQwLDM5MzQxLDM5MzQyLDM5MzQzLDM5MzQ0LDM5MzQ1LDM5MzQ2LDM5MzQ3LDM5MzQ4LDM5MzQ5LDM5MzUwLDM5MzUxLDM5MzUyLDM5MzUzLDM5MzU0LDM5MzU1LDM5MzU2LDM5MzU3LDM5MzU4LDM5MzU5LDM5MzYwLDM5MzYxLDM5MzYyLDM5MzYzLDM5MzY0LDM5MzY1LDM5MzY2LDM5MzY3LDM5MzY4LDM5MzY5LDM5MzcwLDM5MzcxLDM5MzcyLDM5MzczLDM5Mzc0LDM5Mzc1LDM5Mzc2LDM5Mzc3LDM5Mzc4LDM5Mzc5LDM5MzgwLDM5MzgxLDM5MzgyLDM5MzgzLDM5Mzg0LDM5Mzg1LDM5Mzg2LDM5Mzg3LDM5Mzg4LDM5Mzg5LDM5MzkwLDM5MzkxLDM5MzkyLDM5MzkzLDM5Mzk0LDM5Mzk1LDM5Mzk2LDM5Mzk3LDM5Mzk4LDM5Mzk5LDM5NDAwLDM5NDAxLDM5NDAyLDM5NDAzLDM5NDA0LDM5NDA1LDM5NDA2LDM5NDA3LDM5NDA4LDM5NDA5LDM5NDEwLDM5NDExLDM5NDEyLDM5NDEzLDM5NDE0LDM5NDE1LDM5NDE2LDM5NDE3LDMwMjM1LDMwMjY4LDMwMjQyLDMwMjQwLDMwMjcyLDMwMjUzLDMwMjU2LDMwMjcxLDMwMjYxLDMwMjc1LDMwMjcwLDMwMjU5LDMwMjg1LDMwMzAyLDMwMjkyLDMwMzAwLDMwMjk0LDMwMzE1LDMwMzE5LDMyNzE0LDMxNDYyLDMxMzUyLDMxMzUzLDMxMzYwLDMxMzY2LDMxMzY4LDMxMzgxLDMxMzk4LDMxMzkyLDMxNDA0LDMxNDAwLDMxNDA1LDMxNDExLDM0OTE2LDM0OTIxLDM0OTMwLDM0OTQxLDM0OTQzLDM0OTQ2LDM0OTc4LDM1MDE0LDM0OTk5LDM1MDA0LDM1MDE3LDM1MDQyLDM1MDIyLDM1MDQzLDM1MDQ1LDM1MDU3LDM1MDk4LDM1MDY4LDM1MDQ4LDM1MDcwLDM1MDU2LDM1MTA1LDM1MDk3LDM1MDkxLDM1MDk5LDM1MDgyLDM1MTI0LDM1MTE1LDM1MTI2LDM1MTM3LDM1MTc0LDM1MTk1LDMwMDkxLDMyOTk3LDMwMzg2LDMwMzg4LDMwNjg0LDMyNzg2LDMyNzg4LDMyNzkwLDMyNzk2LDMyODAwLDMyODAyLDMyODA1LDMyODA2LDMyODA3LDMyODA5LDMyODA4LDMyODE3LDMyNzc5LDMyODIxLDMyODM1LDMyODM4LDMyODQ1LDMyODUwLDMyODczLDMyODgxLDM1MjAzLDM5MDMyLDM5MDQwLDM5MDQzLDM5NDE4LDM5NDE5LDM5NDIwLDM5NDIxLDM5NDIyLDM5NDIzLDM5NDI0LDM5NDI1LDM5NDI2LDM5NDI3LDM5NDI4LDM5NDI5LDM5NDMwLDM5NDMxLDM5NDMyLDM5NDMzLDM5NDM0LDM5NDM1LDM5NDM2LDM5NDM3LDM5NDM4LDM5NDM5LDM5NDQwLDM5NDQxLDM5NDQyLDM5NDQzLDM5NDQ0LDM5NDQ1LDM5NDQ2LDM5NDQ3LDM5NDQ4LDM5NDQ5LDM5NDUwLDM5NDUxLDM5NDUyLDM5NDUzLDM5NDU0LDM5NDU1LDM5NDU2LDM5NDU3LDM5NDU4LDM5NDU5LDM5NDYwLDM5NDYxLDM5NDYyLDM5NDYzLDM5NDY0LDM5NDY1LDM5NDY2LDM5NDY3LDM5NDY4LDM5NDY5LDM5NDcwLDM5NDcxLDM5NDcyLDM5NDczLDM5NDc0LDM5NDc1LDM5NDc2LDM5NDc3LDM5NDc4LDM5NDc5LDM5NDgwLDM5NDgxLDM5NDgyLDM5NDgzLDM5NDg0LDM5NDg1LDM5NDg2LDM5NDg3LDM5NDg4LDM5NDg5LDM5NDkwLDM5NDkxLDM5NDkyLDM5NDkzLDM5NDk0LDM5NDk1LDM5NDk2LDM5NDk3LDM5NDk4LDM5NDk5LDM5NTAwLDM5NTAxLDM5NTAyLDM5NTAzLDM5NTA0LDM5NTA1LDM5NTA2LDM5NTA3LDM5NTA4LDM5NTA5LDM5NTEwLDM5NTExLDM5NTEyLDM5NTEzLDM5MDQ5LDM5MDUyLDM5MDUzLDM5MDU1LDM5MDYwLDM5MDY2LDM5MDY3LDM5MDcwLDM5MDcxLDM5MDczLDM5MDc0LDM5MDc3LDM5MDc4LDM0MzgxLDM0Mzg4LDM0NDEyLDM0NDE0LDM0NDMxLDM0NDI2LDM0NDI4LDM0NDI3LDM0NDcyLDM0NDQ1LDM0NDQzLDM0NDc2LDM0NDYxLDM0NDcxLDM0NDY3LDM0NDc0LDM0NDUxLDM0NDczLDM0NDg2LDM0NTAwLDM0NDg1LDM0NTEwLDM0NDgwLDM0NDkwLDM0NDgxLDM0NDc5LDM0NTA1LDM0NTExLDM0NDg0LDM0NTM3LDM0NTQ1LDM0NTQ2LDM0NTQxLDM0NTQ3LDM0NTEyLDM0NTc5LDM0NTI2LDM0NTQ4LDM0NTI3LDM0NTIwLDM0NTEzLDM0NTYzLDM0NTY3LDM0NTUyLDM0NTY4LDM0NTcwLDM0NTczLDM0NTY5LDM0NTk1LDM0NjE5LDM0NTkwLDM0NTk3LDM0NjA2LDM0NTg2LDM0NjIyLDM0NjMyLDM0NjEyLDM0NjA5LDM0NjAxLDM0NjE1LDM0NjIzLDM0NjkwLDM0NTk0LDM0Njg1LDM0Njg2LDM0NjgzLDM0NjU2LDM0NjcyLDM0NjM2LDM0NjcwLDM0Njk5LDM0NjQzLDM0NjU5LDM0Njg0LDM0NjYwLDM0NjQ5LDM0NjYxLDM0NzA3LDM0NzM1LDM0NzI4LDM0NzcwLDM5NTE0LDM5NTE1LDM5NTE2LDM5NTE3LDM5NTE4LDM5NTE5LDM5NTIwLDM5NTIxLDM5NTIyLDM5NTIzLDM5NTI0LDM5NTI1LDM5NTI2LDM5NTI3LDM5NTI4LDM5NTI5LDM5NTMwLDM5NTMxLDM5NTM4LDM5NTU1LDM5NTYxLDM5NTY1LDM5NTY2LDM5NTcyLDM5NTczLDM5NTc3LDM5NTkwLDM5NTkzLDM5NTk0LDM5NTk1LDM5NTk2LDM5NTk3LDM5NTk4LDM5NTk5LDM5NjAyLDM5NjAzLDM5NjA0LDM5NjA1LDM5NjA5LDM5NjExLDM5NjEzLDM5NjE0LDM5NjE1LDM5NjE5LDM5NjIwLDM5NjIyLDM5NjIzLDM5NjI0LDM5NjI1LDM5NjI2LDM5NjI5LDM5NjMwLDM5NjMxLDM5NjMyLDM5NjM0LDM5NjM2LDM5NjM3LDM5NjM4LDM5NjM5LDM5NjQxLDM5NjQyLDM5NjQzLDM5NjQ0LDM5NjQ1LDM5NjQ2LDM5NjQ4LDM5NjUwLDM5NjUxLDM5NjUyLDM5NjUzLDM5NjU1LDM5NjU2LDM5NjU3LDM5NjU4LDM5NjYwLDM5NjYyLDM5NjY0LDM5NjY1LDM5NjY2LDM5NjY3LDM5NjY4LDM5NjY5LDM5NjcwLDM5NjcxLDM5NjcyLDM5Njc0LDM5Njc2LDM5Njc3LDM5Njc4LDM5Njc5LDM5NjgwLDM5NjgxLDM5NjgyLDM5Njg0LDM5Njg1LDM5Njg2LDM0NzU4LDM0Njk2LDM0NjkzLDM0NzMzLDM0NzExLDM0NjkxLDM0NzMxLDM0Nzg5LDM0NzMyLDM0NzQxLDM0NzM5LDM0NzYzLDM0NzcxLDM0NzQ5LDM0NzY5LDM0NzUyLDM0NzYyLDM0Nzc5LDM0Nzk0LDM0Nzg0LDM0Nzk4LDM0ODM4LDM0ODM1LDM0ODE0LDM0ODI2LDM0ODQzLDM0ODQ5LDM0ODczLDM0ODc2LDMyNTY2LDMyNTc4LDMyNTgwLDMyNTgxLDMzMjk2LDMxNDgyLDMxNDg1LDMxNDk2LDMxNDkxLDMxNDkyLDMxNTA5LDMxNDk4LDMxNTMxLDMxNTAzLDMxNTU5LDMxNTQ0LDMxNTMwLDMxNTEzLDMxNTM0LDMxNTM3LDMxNTIwLDMxNTI1LDMxNTI0LDMxNTM5LDMxNTUwLDMxNTE4LDMxNTc2LDMxNTc4LDMxNTU3LDMxNjA1LDMxNTY0LDMxNTgxLDMxNTg0LDMxNTk4LDMxNjExLDMxNTg2LDMxNjAyLDMxNjAxLDMxNjMyLDMxNjU0LDMxNjU1LDMxNjcyLDMxNjYwLDMxNjQ1LDMxNjU2LDMxNjIxLDMxNjU4LDMxNjQ0LDMxNjUwLDMxNjU5LDMxNjY4LDMxNjk3LDMxNjgxLDMxNjkyLDMxNzA5LDMxNzA2LDMxNzE3LDMxNzE4LDMxNzIyLDMxNzU2LDMxNzQyLDMxNzQwLDMxNzU5LDMxNzY2LDMxNzU1LDM5Njg3LDM5Njg5LDM5NjkwLDM5NjkxLDM5NjkyLDM5NjkzLDM5Njk0LDM5Njk2LDM5Njk3LDM5Njk4LDM5NzAwLDM5NzAxLDM5NzAyLDM5NzAzLDM5NzA0LDM5NzA1LDM5NzA2LDM5NzA3LDM5NzA4LDM5NzA5LDM5NzEwLDM5NzEyLDM5NzEzLDM5NzE0LDM5NzE2LDM5NzE3LDM5NzE4LDM5NzE5LDM5NzIwLDM5NzIxLDM5NzIyLDM5NzIzLDM5NzI0LDM5NzI1LDM5NzI2LDM5NzI4LDM5NzI5LDM5NzMxLDM5NzMyLDM5NzMzLDM5NzM0LDM5NzM1LDM5NzM2LDM5NzM3LDM5NzM4LDM5NzQxLDM5NzQyLDM5NzQzLDM5NzQ0LDM5NzUwLDM5NzU0LDM5NzU1LDM5NzU2LDM5NzU4LDM5NzYwLDM5NzYyLDM5NzYzLDM5NzY1LDM5NzY2LDM5NzY3LDM5NzY4LDM5NzY5LDM5NzcwLDM5NzcxLDM5NzcyLDM5NzczLDM5Nzc0LDM5Nzc1LDM5Nzc2LDM5Nzc3LDM5Nzc4LDM5Nzc5LDM5NzgwLDM5NzgxLDM5NzgyLDM5NzgzLDM5Nzg0LDM5Nzg1LDM5Nzg2LDM5Nzg3LDM5Nzg4LDM5Nzg5LDM5NzkwLDM5NzkxLDM5NzkyLDM5NzkzLDM5Nzk0LDM5Nzk1LDM5Nzk2LDM5Nzk3LDM5Nzk4LDM5Nzk5LDM5ODAwLDM5ODAxLDM5ODAyLDM5ODAzLDMxNzc1LDMxNzg2LDMxNzgyLDMxODAwLDMxODA5LDMxODA4LDMzMjc4LDMzMjgxLDMzMjgyLDMzMjg0LDMzMjYwLDM0ODg0LDMzMzEzLDMzMzE0LDMzMzE1LDMzMzI1LDMzMzI3LDMzMzIwLDMzMzIzLDMzMzM2LDMzMzM5LDMzMzMxLDMzMzMyLDMzMzQyLDMzMzQ4LDMzMzUzLDMzMzU1LDMzMzU5LDMzMzcwLDMzMzc1LDMzMzg0LDM0OTQyLDM0OTQ5LDM0OTUyLDM1MDMyLDM1MDM5LDM1MTY2LDMyNjY5LDMyNjcxLDMyNjc5LDMyNjg3LDMyNjg4LDMyNjkwLDMxODY4LDI1OTI5LDMxODg5LDMxOTAxLDMxOTAwLDMxOTAyLDMxOTA2LDMxOTIyLDMxOTMyLDMxOTMzLDMxOTM3LDMxOTQzLDMxOTQ4LDMxOTQ5LDMxOTQ0LDMxOTQxLDMxOTU5LDMxOTc2LDMzMzkwLDI2MjgwLDMyNzAzLDMyNzE4LDMyNzI1LDMyNzQxLDMyNzM3LDMyNzQyLDMyNzQ1LDMyNzUwLDMyNzU1LDMxOTkyLDMyMTE5LDMyMTY2LDMyMTc0LDMyMzI3LDMyNDExLDQwNjMyLDQwNjI4LDM2MjExLDM2MjI4LDM2MjQ0LDM2MjQxLDM2MjczLDM2MTk5LDM2MjA1LDM1OTExLDM1OTEzLDM3MTk0LDM3MjAwLDM3MTk4LDM3MTk5LDM3MjIwLDM5ODA0LDM5ODA1LDM5ODA2LDM5ODA3LDM5ODA4LDM5ODA5LDM5ODEwLDM5ODExLDM5ODEyLDM5ODEzLDM5ODE0LDM5ODE1LDM5ODE2LDM5ODE3LDM5ODE4LDM5ODE5LDM5ODIwLDM5ODIxLDM5ODIyLDM5ODIzLDM5ODI0LDM5ODI1LDM5ODI2LDM5ODI3LDM5ODI4LDM5ODI5LDM5ODMwLDM5ODMxLDM5ODMyLDM5ODMzLDM5ODM0LDM5ODM1LDM5ODM2LDM5ODM3LDM5ODM4LDM5ODM5LDM5ODQwLDM5ODQxLDM5ODQyLDM5ODQzLDM5ODQ0LDM5ODQ1LDM5ODQ2LDM5ODQ3LDM5ODQ4LDM5ODQ5LDM5ODUwLDM5ODUxLDM5ODUyLDM5ODUzLDM5ODU0LDM5ODU1LDM5ODU2LDM5ODU3LDM5ODU4LDM5ODU5LDM5ODYwLDM5ODYxLDM5ODYyLDM5ODYzLDM5ODY0LDM5ODY1LDM5ODY2LDM5ODY3LDM5ODY4LDM5ODY5LDM5ODcwLDM5ODcxLDM5ODcyLDM5ODczLDM5ODc0LDM5ODc1LDM5ODc2LDM5ODc3LDM5ODc4LDM5ODc5LDM5ODgwLDM5ODgxLDM5ODgyLDM5ODgzLDM5ODg0LDM5ODg1LDM5ODg2LDM5ODg3LDM5ODg4LDM5ODg5LDM5ODkwLDM5ODkxLDM5ODkyLDM5ODkzLDM5ODk0LDM5ODk1LDM5ODk2LDM5ODk3LDM5ODk4LDM5ODk5LDM3MjE4LDM3MjE3LDM3MjMyLDM3MjI1LDM3MjMxLDM3MjQ1LDM3MjQ2LDM3MjM0LDM3MjM2LDM3MjQxLDM3MjYwLDM3MjUzLDM3MjY0LDM3MjYxLDM3MjY1LDM3MjgyLDM3MjgzLDM3MjkwLDM3MjkzLDM3Mjk0LDM3Mjk1LDM3MzAxLDM3MzAwLDM3MzA2LDM1OTI1LDQwNTc0LDM2MjgwLDM2MzMxLDM2MzU3LDM2NDQxLDM2NDU3LDM2Mjc3LDM2Mjg3LDM2Mjg0LDM2MjgyLDM2MjkyLDM2MzEwLDM2MzExLDM2MzE0LDM2MzE4LDM2MzAyLDM2MzAzLDM2MzE1LDM2Mjk0LDM2MzMyLDM2MzQzLDM2MzQ0LDM2MzIzLDM2MzQ1LDM2MzQ3LDM2MzI0LDM2MzYxLDM2MzQ5LDM2MzcyLDM2MzgxLDM2MzgzLDM2Mzk2LDM2Mzk4LDM2Mzg3LDM2Mzk5LDM2NDEwLDM2NDE2LDM2NDA5LDM2NDA1LDM2NDEzLDM2NDAxLDM2NDI1LDM2NDE3LDM2NDE4LDM2NDMzLDM2NDM0LDM2NDI2LDM2NDY0LDM2NDcwLDM2NDc2LDM2NDYzLDM2NDY4LDM2NDg1LDM2NDk1LDM2NTAwLDM2NDk2LDM2NTA4LDM2NTEwLDM1OTYwLDM1OTcwLDM1OTc4LDM1OTczLDM1OTkyLDM1OTg4LDI2MDExLDM1Mjg2LDM1Mjk0LDM1MjkwLDM1MjkyLDM5OTAwLDM5OTAxLDM5OTAyLDM5OTAzLDM5OTA0LDM5OTA1LDM5OTA2LDM5OTA3LDM5OTA4LDM5OTA5LDM5OTEwLDM5OTExLDM5OTEyLDM5OTEzLDM5OTE0LDM5OTE1LDM5OTE2LDM5OTE3LDM5OTE4LDM5OTE5LDM5OTIwLDM5OTIxLDM5OTIyLDM5OTIzLDM5OTI0LDM5OTI1LDM5OTI2LDM5OTI3LDM5OTI4LDM5OTI5LDM5OTMwLDM5OTMxLDM5OTMyLDM5OTMzLDM5OTM0LDM5OTM1LDM5OTM2LDM5OTM3LDM5OTM4LDM5OTM5LDM5OTQwLDM5OTQxLDM5OTQyLDM5OTQzLDM5OTQ0LDM5OTQ1LDM5OTQ2LDM5OTQ3LDM5OTQ4LDM5OTQ5LDM5OTUwLDM5OTUxLDM5OTUyLDM5OTUzLDM5OTU0LDM5OTU1LDM5OTU2LDM5OTU3LDM5OTU4LDM5OTU5LDM5OTYwLDM5OTYxLDM5OTYyLDM5OTYzLDM5OTY0LDM5OTY1LDM5OTY2LDM5OTY3LDM5OTY4LDM5OTY5LDM5OTcwLDM5OTcxLDM5OTcyLDM5OTczLDM5OTc0LDM5OTc1LDM5OTc2LDM5OTc3LDM5OTc4LDM5OTc5LDM5OTgwLDM5OTgxLDM5OTgyLDM5OTgzLDM5OTg0LDM5OTg1LDM5OTg2LDM5OTg3LDM5OTg4LDM5OTg5LDM5OTkwLDM5OTkxLDM5OTkyLDM5OTkzLDM5OTk0LDM5OTk1LDM1MzAxLDM1MzA3LDM1MzExLDM1MzkwLDM1NjIyLDM4NzM5LDM4NjMzLDM4NjQzLDM4NjM5LDM4NjYyLDM4NjU3LDM4NjY0LDM4NjcxLDM4NjcwLDM4Njk4LDM4NzAxLDM4NzA0LDM4NzE4LDQwODMyLDQwODM1LDQwODM3LDQwODM4LDQwODM5LDQwODQwLDQwODQxLDQwODQyLDQwODQ0LDQwNzAyLDQwNzE1LDQwNzE3LDM4NTg1LDM4NTg4LDM4NTg5LDM4NjA2LDM4NjEwLDMwNjU1LDM4NjI0LDM3NTE4LDM3NTUwLDM3NTc2LDM3Njk0LDM3NzM4LDM3ODM0LDM3Nzc1LDM3OTUwLDM3OTk1LDQwMDYzLDQwMDY2LDQwMDY5LDQwMDcwLDQwMDcxLDQwMDcyLDMxMjY3LDQwMDc1LDQwMDc4LDQwMDgwLDQwMDgxLDQwMDgyLDQwMDg0LDQwMDg1LDQwMDkwLDQwMDkxLDQwMDk0LDQwMDk1LDQwMDk2LDQwMDk3LDQwMDk4LDQwMDk5LDQwMTAxLDQwMTAyLDQwMTAzLDQwMTA0LDQwMTA1LDQwMTA3LDQwMTA5LDQwMTEwLDQwMTEyLDQwMTEzLDQwMTE0LDQwMTE1LDQwMTE2LDQwMTE3LDQwMTE4LDQwMTE5LDQwMTIyLDQwMTIzLDQwMTI0LDQwMTI1LDQwMTMyLDQwMTMzLDQwMTM0LDQwMTM1LDQwMTM4LDQwMTM5LDM5OTk2LDM5OTk3LDM5OTk4LDM5OTk5LDQwMDAwLDQwMDAxLDQwMDAyLDQwMDAzLDQwMDA0LDQwMDA1LDQwMDA2LDQwMDA3LDQwMDA4LDQwMDA5LDQwMDEwLDQwMDExLDQwMDEyLDQwMDEzLDQwMDE0LDQwMDE1LDQwMDE2LDQwMDE3LDQwMDE4LDQwMDE5LDQwMDIwLDQwMDIxLDQwMDIyLDQwMDIzLDQwMDI0LDQwMDI1LDQwMDI2LDQwMDI3LDQwMDI4LDQwMDI5LDQwMDMwLDQwMDMxLDQwMDMyLDQwMDMzLDQwMDM0LDQwMDM1LDQwMDM2LDQwMDM3LDQwMDM4LDQwMDM5LDQwMDQwLDQwMDQxLDQwMDQyLDQwMDQzLDQwMDQ0LDQwMDQ1LDQwMDQ2LDQwMDQ3LDQwMDQ4LDQwMDQ5LDQwMDUwLDQwMDUxLDQwMDUyLDQwMDUzLDQwMDU0LDQwMDU1LDQwMDU2LDQwMDU3LDQwMDU4LDQwMDU5LDQwMDYxLDQwMDYyLDQwMDY0LDQwMDY3LDQwMDY4LDQwMDczLDQwMDc0LDQwMDc2LDQwMDc5LDQwMDgzLDQwMDg2LDQwMDg3LDQwMDg4LDQwMDg5LDQwMDkzLDQwMTA2LDQwMTA4LDQwMTExLDQwMTIxLDQwMTI2LDQwMTI3LDQwMTI4LDQwMTI5LDQwMTMwLDQwMTM2LDQwMTM3LDQwMTQ1LDQwMTQ2LDQwMTU0LDQwMTU1LDQwMTYwLDQwMTYxLDQwMTQwLDQwMTQxLDQwMTQyLDQwMTQzLDQwMTQ0LDQwMTQ3LDQwMTQ4LDQwMTQ5LDQwMTUxLDQwMTUyLDQwMTUzLDQwMTU2LDQwMTU3LDQwMTU5LDQwMTYyLDM4NzgwLDM4Nzg5LDM4ODAxLDM4ODAyLDM4ODA0LDM4ODMxLDM4ODI3LDM4ODE5LDM4ODM0LDM4ODM2LDM5NjAxLDM5NjAwLDM5NjA3LDQwNTM2LDM5NjA2LDM5NjEwLDM5NjEyLDM5NjE3LDM5NjE2LDM5NjIxLDM5NjE4LDM5NjI3LDM5NjI4LDM5NjMzLDM5NzQ5LDM5NzQ3LDM5NzUxLDM5NzUzLDM5NzUyLDM5NzU3LDM5NzYxLDM5MTQ0LDM5MTgxLDM5MjE0LDM5MjUzLDM5MjUyLDM5NjQ3LDM5NjQ5LDM5NjU0LDM5NjYzLDM5NjU5LDM5Njc1LDM5NjYxLDM5NjczLDM5Njg4LDM5Njk1LDM5Njk5LDM5NzExLDM5NzE1LDQwNjM3LDQwNjM4LDMyMzE1LDQwNTc4LDQwNTgzLDQwNTg0LDQwNTg3LDQwNTk0LDM3ODQ2LDQwNjA1LDQwNjA3LDQwNjY3LDQwNjY4LDQwNjY5LDQwNjcyLDQwNjcxLDQwNjc0LDQwNjgxLDQwNjc5LDQwNjc3LDQwNjgyLDQwNjg3LDQwNzM4LDQwNzQ4LDQwNzUxLDQwNzYxLDQwNzU5LDQwNzY1LDQwNzY2LDQwNzcyLDQwMTYzLDQwMTY0LDQwMTY1LDQwMTY2LDQwMTY3LDQwMTY4LDQwMTY5LDQwMTcwLDQwMTcxLDQwMTcyLDQwMTczLDQwMTc0LDQwMTc1LDQwMTc2LDQwMTc3LDQwMTc4LDQwMTc5LDQwMTgwLDQwMTgxLDQwMTgyLDQwMTgzLDQwMTg0LDQwMTg1LDQwMTg2LDQwMTg3LDQwMTg4LDQwMTg5LDQwMTkwLDQwMTkxLDQwMTkyLDQwMTkzLDQwMTk0LDQwMTk1LDQwMTk2LDQwMTk3LDQwMTk4LDQwMTk5LDQwMjAwLDQwMjAxLDQwMjAyLDQwMjAzLDQwMjA0LDQwMjA1LDQwMjA2LDQwMjA3LDQwMjA4LDQwMjA5LDQwMjEwLDQwMjExLDQwMjEyLDQwMjEzLDQwMjE0LDQwMjE1LDQwMjE2LDQwMjE3LDQwMjE4LDQwMjE5LDQwMjIwLDQwMjIxLDQwMjIyLDQwMjIzLDQwMjI0LDQwMjI1LDQwMjI2LDQwMjI3LDQwMjI4LDQwMjI5LDQwMjMwLDQwMjMxLDQwMjMyLDQwMjMzLDQwMjM0LDQwMjM1LDQwMjM2LDQwMjM3LDQwMjM4LDQwMjM5LDQwMjQwLDQwMjQxLDQwMjQyLDQwMjQzLDQwMjQ0LDQwMjQ1LDQwMjQ2LDQwMjQ3LDQwMjQ4LDQwMjQ5LDQwMjUwLDQwMjUxLDQwMjUyLDQwMjUzLDQwMjU0LDQwMjU1LDQwMjU2LDQwMjU3LDQwMjU4LDU3OTA4LDU3OTA5LDU3OTEwLDU3OTExLDU3OTEyLDU3OTEzLDU3OTE0LDU3OTE1LDU3OTE2LDU3OTE3LDU3OTE4LDU3OTE5LDU3OTIwLDU3OTIxLDU3OTIyLDU3OTIzLDU3OTI0LDU3OTI1LDU3OTI2LDU3OTI3LDU3OTI4LDU3OTI5LDU3OTMwLDU3OTMxLDU3OTMyLDU3OTMzLDU3OTM0LDU3OTM1LDU3OTM2LDU3OTM3LDU3OTM4LDU3OTM5LDU3OTQwLDU3OTQxLDU3OTQyLDU3OTQzLDU3OTQ0LDU3OTQ1LDU3OTQ2LDU3OTQ3LDU3OTQ4LDU3OTQ5LDU3OTUwLDU3OTUxLDU3OTUyLDU3OTUzLDU3OTU0LDU3OTU1LDU3OTU2LDU3OTU3LDU3OTU4LDU3OTU5LDU3OTYwLDU3OTYxLDU3OTYyLDU3OTYzLDU3OTY0LDU3OTY1LDU3OTY2LDU3OTY3LDU3OTY4LDU3OTY5LDU3OTcwLDU3OTcxLDU3OTcyLDU3OTczLDU3OTc0LDU3OTc1LDU3OTc2LDU3OTc3LDU3OTc4LDU3OTc5LDU3OTgwLDU3OTgxLDU3OTgyLDU3OTgzLDU3OTg0LDU3OTg1LDU3OTg2LDU3OTg3LDU3OTg4LDU3OTg5LDU3OTkwLDU3OTkxLDU3OTkyLDU3OTkzLDU3OTk0LDU3OTk1LDU3OTk2LDU3OTk3LDU3OTk4LDU3OTk5LDU4MDAwLDU4MDAxLDQwMjU5LDQwMjYwLDQwMjYxLDQwMjYyLDQwMjYzLDQwMjY0LDQwMjY1LDQwMjY2LDQwMjY3LDQwMjY4LDQwMjY5LDQwMjcwLDQwMjcxLDQwMjcyLDQwMjczLDQwMjc0LDQwMjc1LDQwMjc2LDQwMjc3LDQwMjc4LDQwMjc5LDQwMjgwLDQwMjgxLDQwMjgyLDQwMjgzLDQwMjg0LDQwMjg1LDQwMjg2LDQwMjg3LDQwMjg4LDQwMjg5LDQwMjkwLDQwMjkxLDQwMjkyLDQwMjkzLDQwMjk0LDQwMjk1LDQwMjk2LDQwMjk3LDQwMjk4LDQwMjk5LDQwMzAwLDQwMzAxLDQwMzAyLDQwMzAzLDQwMzA0LDQwMzA1LDQwMzA2LDQwMzA3LDQwMzA4LDQwMzA5LDQwMzEwLDQwMzExLDQwMzEyLDQwMzEzLDQwMzE0LDQwMzE1LDQwMzE2LDQwMzE3LDQwMzE4LDQwMzE5LDQwMzIwLDQwMzIxLDQwMzIyLDQwMzIzLDQwMzI0LDQwMzI1LDQwMzI2LDQwMzI3LDQwMzI4LDQwMzI5LDQwMzMwLDQwMzMxLDQwMzMyLDQwMzMzLDQwMzM0LDQwMzM1LDQwMzM2LDQwMzM3LDQwMzM4LDQwMzM5LDQwMzQwLDQwMzQxLDQwMzQyLDQwMzQzLDQwMzQ0LDQwMzQ1LDQwMzQ2LDQwMzQ3LDQwMzQ4LDQwMzQ5LDQwMzUwLDQwMzUxLDQwMzUyLDQwMzUzLDQwMzU0LDU4MDAyLDU4MDAzLDU4MDA0LDU4MDA1LDU4MDA2LDU4MDA3LDU4MDA4LDU4MDA5LDU4MDEwLDU4MDExLDU4MDEyLDU4MDEzLDU4MDE0LDU4MDE1LDU4MDE2LDU4MDE3LDU4MDE4LDU4MDE5LDU4MDIwLDU4MDIxLDU4MDIyLDU4MDIzLDU4MDI0LDU4MDI1LDU4MDI2LDU4MDI3LDU4MDI4LDU4MDI5LDU4MDMwLDU4MDMxLDU4MDMyLDU4MDMzLDU4MDM0LDU4MDM1LDU4MDM2LDU4MDM3LDU4MDM4LDU4MDM5LDU4MDQwLDU4MDQxLDU4MDQyLDU4MDQzLDU4MDQ0LDU4MDQ1LDU4MDQ2LDU4MDQ3LDU4MDQ4LDU4MDQ5LDU4MDUwLDU4MDUxLDU4MDUyLDU4MDUzLDU4MDU0LDU4MDU1LDU4MDU2LDU4MDU3LDU4MDU4LDU4MDU5LDU4MDYwLDU4MDYxLDU4MDYyLDU4MDYzLDU4MDY0LDU4MDY1LDU4MDY2LDU4MDY3LDU4MDY4LDU4MDY5LDU4MDcwLDU4MDcxLDU4MDcyLDU4MDczLDU4MDc0LDU4MDc1LDU4MDc2LDU4MDc3LDU4MDc4LDU4MDc5LDU4MDgwLDU4MDgxLDU4MDgyLDU4MDgzLDU4MDg0LDU4MDg1LDU4MDg2LDU4MDg3LDU4MDg4LDU4MDg5LDU4MDkwLDU4MDkxLDU4MDkyLDU4MDkzLDU4MDk0LDU4MDk1LDQwMzU1LDQwMzU2LDQwMzU3LDQwMzU4LDQwMzU5LDQwMzYwLDQwMzYxLDQwMzYyLDQwMzYzLDQwMzY0LDQwMzY1LDQwMzY2LDQwMzY3LDQwMzY4LDQwMzY5LDQwMzcwLDQwMzcxLDQwMzcyLDQwMzczLDQwMzc0LDQwMzc1LDQwMzc2LDQwMzc3LDQwMzc4LDQwMzc5LDQwMzgwLDQwMzgxLDQwMzgyLDQwMzgzLDQwMzg0LDQwMzg1LDQwMzg2LDQwMzg3LDQwMzg4LDQwMzg5LDQwMzkwLDQwMzkxLDQwMzkyLDQwMzkzLDQwMzk0LDQwMzk1LDQwMzk2LDQwMzk3LDQwMzk4LDQwMzk5LDQwNDAwLDQwNDAxLDQwNDAyLDQwNDAzLDQwNDA0LDQwNDA1LDQwNDA2LDQwNDA3LDQwNDA4LDQwNDA5LDQwNDEwLDQwNDExLDQwNDEyLDQwNDEzLDQwNDE0LDQwNDE1LDQwNDE2LDQwNDE3LDQwNDE4LDQwNDE5LDQwNDIwLDQwNDIxLDQwNDIyLDQwNDIzLDQwNDI0LDQwNDI1LDQwNDI2LDQwNDI3LDQwNDI4LDQwNDI5LDQwNDMwLDQwNDMxLDQwNDMyLDQwNDMzLDQwNDM0LDQwNDM1LDQwNDM2LDQwNDM3LDQwNDM4LDQwNDM5LDQwNDQwLDQwNDQxLDQwNDQyLDQwNDQzLDQwNDQ0LDQwNDQ1LDQwNDQ2LDQwNDQ3LDQwNDQ4LDQwNDQ5LDQwNDUwLDU4MDk2LDU4MDk3LDU4MDk4LDU4MDk5LDU4MTAwLDU4MTAxLDU4MTAyLDU4MTAzLDU4MTA0LDU4MTA1LDU4MTA2LDU4MTA3LDU4MTA4LDU4MTA5LDU4MTEwLDU4MTExLDU4MTEyLDU4MTEzLDU4MTE0LDU4MTE1LDU4MTE2LDU4MTE3LDU4MTE4LDU4MTE5LDU4MTIwLDU4MTIxLDU4MTIyLDU4MTIzLDU4MTI0LDU4MTI1LDU4MTI2LDU4MTI3LDU4MTI4LDU4MTI5LDU4MTMwLDU4MTMxLDU4MTMyLDU4MTMzLDU4MTM0LDU4MTM1LDU4MTM2LDU4MTM3LDU4MTM4LDU4MTM5LDU4MTQwLDU4MTQxLDU4MTQyLDU4MTQzLDU4MTQ0LDU4MTQ1LDU4MTQ2LDU4MTQ3LDU4MTQ4LDU4MTQ5LDU4MTUwLDU4MTUxLDU4MTUyLDU4MTUzLDU4MTU0LDU4MTU1LDU4MTU2LDU4MTU3LDU4MTU4LDU4MTU5LDU4MTYwLDU4MTYxLDU4MTYyLDU4MTYzLDU4MTY0LDU4MTY1LDU4MTY2LDU4MTY3LDU4MTY4LDU4MTY5LDU4MTcwLDU4MTcxLDU4MTcyLDU4MTczLDU4MTc0LDU4MTc1LDU4MTc2LDU4MTc3LDU4MTc4LDU4MTc5LDU4MTgwLDU4MTgxLDU4MTgyLDU4MTgzLDU4MTg0LDU4MTg1LDU4MTg2LDU4MTg3LDU4MTg4LDU4MTg5LDQwNDUxLDQwNDUyLDQwNDUzLDQwNDU0LDQwNDU1LDQwNDU2LDQwNDU3LDQwNDU4LDQwNDU5LDQwNDYwLDQwNDYxLDQwNDYyLDQwNDYzLDQwNDY0LDQwNDY1LDQwNDY2LDQwNDY3LDQwNDY4LDQwNDY5LDQwNDcwLDQwNDcxLDQwNDcyLDQwNDczLDQwNDc0LDQwNDc1LDQwNDc2LDQwNDc3LDQwNDc4LDQwNDg0LDQwNDg3LDQwNDk0LDQwNDk2LDQwNTAwLDQwNTA3LDQwNTA4LDQwNTEyLDQwNTI1LDQwNTI4LDQwNTMwLDQwNTMxLDQwNTMyLDQwNTM0LDQwNTM3LDQwNTQxLDQwNTQzLDQwNTQ0LDQwNTQ1LDQwNTQ2LDQwNTQ5LDQwNTU4LDQwNTU5LDQwNTYyLDQwNTY0LDQwNTY1LDQwNTY2LDQwNTY3LDQwNTY4LDQwNTY5LDQwNTcwLDQwNTcxLDQwNTcyLDQwNTczLDQwNTc2LDQwNTc3LDQwNTc5LDQwNTgwLDQwNTgxLDQwNTgyLDQwNTg1LDQwNTg2LDQwNTg4LDQwNTg5LDQwNTkwLDQwNTkxLDQwNTkyLDQwNTkzLDQwNTk2LDQwNTk3LDQwNTk4LDQwNTk5LDQwNjAwLDQwNjAxLDQwNjAyLDQwNjAzLDQwNjA0LDQwNjA2LDQwNjA4LDQwNjA5LDQwNjEwLDQwNjExLDQwNjEyLDQwNjEzLDQwNjE1LDQwNjE2LDQwNjE3LDQwNjE4LDU4MTkwLDU4MTkxLDU4MTkyLDU4MTkzLDU4MTk0LDU4MTk1LDU4MTk2LDU4MTk3LDU4MTk4LDU4MTk5LDU4MjAwLDU4MjAxLDU4MjAyLDU4MjAzLDU4MjA0LDU4MjA1LDU4MjA2LDU4MjA3LDU4MjA4LDU4MjA5LDU4MjEwLDU4MjExLDU4MjEyLDU4MjEzLDU4MjE0LDU4MjE1LDU4MjE2LDU4MjE3LDU4MjE4LDU4MjE5LDU4MjIwLDU4MjIxLDU4MjIyLDU4MjIzLDU4MjI0LDU4MjI1LDU4MjI2LDU4MjI3LDU4MjI4LDU4MjI5LDU4MjMwLDU4MjMxLDU4MjMyLDU4MjMzLDU4MjM0LDU4MjM1LDU4MjM2LDU4MjM3LDU4MjM4LDU4MjM5LDU4MjQwLDU4MjQxLDU4MjQyLDU4MjQzLDU4MjQ0LDU4MjQ1LDU4MjQ2LDU4MjQ3LDU4MjQ4LDU4MjQ5LDU4MjUwLDU4MjUxLDU4MjUyLDU4MjUzLDU4MjU0LDU4MjU1LDU4MjU2LDU4MjU3LDU4MjU4LDU4MjU5LDU4MjYwLDU4MjYxLDU4MjYyLDU4MjYzLDU4MjY0LDU4MjY1LDU4MjY2LDU4MjY3LDU4MjY4LDU4MjY5LDU4MjcwLDU4MjcxLDU4MjcyLDU4MjczLDU4Mjc0LDU4Mjc1LDU4Mjc2LDU4Mjc3LDU4Mjc4LDU4Mjc5LDU4MjgwLDU4MjgxLDU4MjgyLDU4MjgzLDQwNjE5LDQwNjIwLDQwNjIxLDQwNjIyLDQwNjIzLDQwNjI0LDQwNjI1LDQwNjI2LDQwNjI3LDQwNjI5LDQwNjMwLDQwNjMxLDQwNjMzLDQwNjM0LDQwNjM2LDQwNjM5LDQwNjQwLDQwNjQxLDQwNjQyLDQwNjQzLDQwNjQ1LDQwNjQ2LDQwNjQ3LDQwNjQ4LDQwNjUwLDQwNjUxLDQwNjUyLDQwNjU2LDQwNjU4LDQwNjU5LDQwNjYxLDQwNjYyLDQwNjYzLDQwNjY1LDQwNjY2LDQwNjcwLDQwNjczLDQwNjc1LDQwNjc2LDQwNjc4LDQwNjgwLDQwNjgzLDQwNjg0LDQwNjg1LDQwNjg2LDQwNjg4LDQwNjg5LDQwNjkwLDQwNjkxLDQwNjkyLDQwNjkzLDQwNjk0LDQwNjk1LDQwNjk2LDQwNjk4LDQwNzAxLDQwNzAzLDQwNzA0LDQwNzA1LDQwNzA2LDQwNzA3LDQwNzA4LDQwNzA5LDQwNzEwLDQwNzExLDQwNzEyLDQwNzEzLDQwNzE0LDQwNzE2LDQwNzE5LDQwNzIxLDQwNzIyLDQwNzI0LDQwNzI1LDQwNzI2LDQwNzI4LDQwNzMwLDQwNzMxLDQwNzMyLDQwNzMzLDQwNzM0LDQwNzM1LDQwNzM3LDQwNzM5LDQwNzQwLDQwNzQxLDQwNzQyLDQwNzQzLDQwNzQ0LDQwNzQ1LDQwNzQ2LDQwNzQ3LDQwNzQ5LDQwNzUwLDQwNzUyLDQwNzUzLDU4Mjg0LDU4Mjg1LDU4Mjg2LDU4Mjg3LDU4Mjg4LDU4Mjg5LDU4MjkwLDU4MjkxLDU4MjkyLDU4MjkzLDU4Mjk0LDU4Mjk1LDU4Mjk2LDU4Mjk3LDU4Mjk4LDU4Mjk5LDU4MzAwLDU4MzAxLDU4MzAyLDU4MzAzLDU4MzA0LDU4MzA1LDU4MzA2LDU4MzA3LDU4MzA4LDU4MzA5LDU4MzEwLDU4MzExLDU4MzEyLDU4MzEzLDU4MzE0LDU4MzE1LDU4MzE2LDU4MzE3LDU4MzE4LDU4MzE5LDU4MzIwLDU4MzIxLDU4MzIyLDU4MzIzLDU4MzI0LDU4MzI1LDU4MzI2LDU4MzI3LDU4MzI4LDU4MzI5LDU4MzMwLDU4MzMxLDU4MzMyLDU4MzMzLDU4MzM0LDU4MzM1LDU4MzM2LDU4MzM3LDU4MzM4LDU4MzM5LDU4MzQwLDU4MzQxLDU4MzQyLDU4MzQzLDU4MzQ0LDU4MzQ1LDU4MzQ2LDU4MzQ3LDU4MzQ4LDU4MzQ5LDU4MzUwLDU4MzUxLDU4MzUyLDU4MzUzLDU4MzU0LDU4MzU1LDU4MzU2LDU4MzU3LDU4MzU4LDU4MzU5LDU4MzYwLDU4MzYxLDU4MzYyLDU4MzYzLDU4MzY0LDU4MzY1LDU4MzY2LDU4MzY3LDU4MzY4LDU4MzY5LDU4MzcwLDU4MzcxLDU4MzcyLDU4MzczLDU4Mzc0LDU4Mzc1LDU4Mzc2LDU4Mzc3LDQwNzU0LDQwNzU1LDQwNzU2LDQwNzU3LDQwNzU4LDQwNzYwLDQwNzYyLDQwNzY0LDQwNzY3LDQwNzY4LDQwNzY5LDQwNzcwLDQwNzcxLDQwNzczLDQwNzc0LDQwNzc1LDQwNzc2LDQwNzc3LDQwNzc4LDQwNzc5LDQwNzgwLDQwNzgxLDQwNzgyLDQwNzgzLDQwNzg2LDQwNzg3LDQwNzg4LDQwNzg5LDQwNzkwLDQwNzkxLDQwNzkyLDQwNzkzLDQwNzk0LDQwNzk1LDQwNzk2LDQwNzk3LDQwNzk4LDQwNzk5LDQwODAwLDQwODAxLDQwODAyLDQwODAzLDQwODA0LDQwODA1LDQwODA2LDQwODA3LDQwODA4LDQwODA5LDQwODEwLDQwODExLDQwODEyLDQwODEzLDQwODE0LDQwODE1LDQwODE2LDQwODE3LDQwODE4LDQwODE5LDQwODIwLDQwODIxLDQwODIyLDQwODIzLDQwODI0LDQwODI1LDQwODI2LDQwODI3LDQwODI4LDQwODI5LDQwODMwLDQwODMzLDQwODM0LDQwODQ1LDQwODQ2LDQwODQ3LDQwODQ4LDQwODQ5LDQwODUwLDQwODUxLDQwODUyLDQwODUzLDQwODU0LDQwODU1LDQwODU2LDQwODYwLDQwODYxLDQwODYyLDQwODY1LDQwODY2LDQwODY3LDQwODY4LDQwODY5LDYzNzg4LDYzODY1LDYzODkzLDYzOTc1LDYzOTg1LDU4Mzc4LDU4Mzc5LDU4MzgwLDU4MzgxLDU4MzgyLDU4MzgzLDU4Mzg0LDU4Mzg1LDU4Mzg2LDU4Mzg3LDU4Mzg4LDU4Mzg5LDU4MzkwLDU4MzkxLDU4MzkyLDU4MzkzLDU4Mzk0LDU4Mzk1LDU4Mzk2LDU4Mzk3LDU4Mzk4LDU4Mzk5LDU4NDAwLDU4NDAxLDU4NDAyLDU4NDAzLDU4NDA0LDU4NDA1LDU4NDA2LDU4NDA3LDU4NDA4LDU4NDA5LDU4NDEwLDU4NDExLDU4NDEyLDU4NDEzLDU4NDE0LDU4NDE1LDU4NDE2LDU4NDE3LDU4NDE4LDU4NDE5LDU4NDIwLDU4NDIxLDU4NDIyLDU4NDIzLDU4NDI0LDU4NDI1LDU4NDI2LDU4NDI3LDU4NDI4LDU4NDI5LDU4NDMwLDU4NDMxLDU4NDMyLDU4NDMzLDU4NDM0LDU4NDM1LDU4NDM2LDU4NDM3LDU4NDM4LDU4NDM5LDU4NDQwLDU4NDQxLDU4NDQyLDU4NDQzLDU4NDQ0LDU4NDQ1LDU4NDQ2LDU4NDQ3LDU4NDQ4LDU4NDQ5LDU4NDUwLDU4NDUxLDU4NDUyLDU4NDUzLDU4NDU0LDU4NDU1LDU4NDU2LDU4NDU3LDU4NDU4LDU4NDU5LDU4NDYwLDU4NDYxLDU4NDYyLDU4NDYzLDU4NDY0LDU4NDY1LDU4NDY2LDU4NDY3LDU4NDY4LDU4NDY5LDU4NDcwLDU4NDcxLDY0MDEyLDY0MDEzLDY0MDE0LDY0MDE1LDY0MDE3LDY0MDE5LDY0MDIwLDY0MDI0LDY0MDMxLDY0MDMyLDY0MDMzLDY0MDM1LDY0MDM2LDY0MDM5LDY0MDQwLDY0MDQxLDExOTA1LDU5NDE0LDU5NDE1LDU5NDE2LDExOTA4LDEzNDI3LDEzMzgzLDExOTEyLDExOTE1LDU5NDIyLDEzNzI2LDEzODUwLDEzODM4LDExOTE2LDExOTI3LDE0NzAyLDE0NjE2LDU5NDMwLDE0Nzk5LDE0ODE1LDE0OTYzLDE0ODAwLDU5NDM1LDU5NDM2LDE1MTgyLDE1NDcwLDE1NTg0LDExOTQzLDU5NDQxLDU5NDQyLDExOTQ2LDE2NDcwLDE2NzM1LDExOTUwLDE3MjA3LDExOTU1LDExOTU4LDExOTU5LDU5NDUxLDE3MzI5LDE3MzI0LDExOTYzLDE3MzczLDE3NjIyLDE4MDE3LDE3OTk2LDU5NDU5LDE4MjExLDE4MjE3LDE4MzAwLDE4MzE3LDExOTc4LDE4NzU5LDE4ODEwLDE4ODEzLDE4ODE4LDE4ODE5LDE4ODIxLDE4ODIyLDE4ODQ3LDE4ODQzLDE4ODcxLDE4ODcwLDU5NDc2LDU5NDc3LDE5NjE5LDE5NjE1LDE5NjE2LDE5NjE3LDE5NTc1LDE5NjE4LDE5NzMxLDE5NzMyLDE5NzMzLDE5NzM0LDE5NzM1LDE5NzM2LDE5NzM3LDE5ODg2LDU5NDkyLDU4NDcyLDU4NDczLDU4NDc0LDU4NDc1LDU4NDc2LDU4NDc3LDU4NDc4LDU4NDc5LDU4NDgwLDU4NDgxLDU4NDgyLDU4NDgzLDU4NDg0LDU4NDg1LDU4NDg2LDU4NDg3LDU4NDg4LDU4NDg5LDU4NDkwLDU4NDkxLDU4NDkyLDU4NDkzLDU4NDk0LDU4NDk1LDU4NDk2LDU4NDk3LDU4NDk4LDU4NDk5LDU4NTAwLDU4NTAxLDU4NTAyLDU4NTAzLDU4NTA0LDU4NTA1LDU4NTA2LDU4NTA3LDU4NTA4LDU4NTA5LDU4NTEwLDU4NTExLDU4NTEyLDU4NTEzLDU4NTE0LDU4NTE1LDU4NTE2LDU4NTE3LDU4NTE4LDU4NTE5LDU4NTIwLDU4NTIxLDU4NTIyLDU4NTIzLDU4NTI0LDU4NTI1LDU4NTI2LDU4NTI3LDU4NTI4LDU4NTI5LDU4NTMwLDU4NTMxLDU4NTMyLDU4NTMzLDU4NTM0LDU4NTM1LDU4NTM2LDU4NTM3LDU4NTM4LDU4NTM5LDU4NTQwLDU4NTQxLDU4NTQyLDU4NTQzLDU4NTQ0LDU4NTQ1LDU4NTQ2LDU4NTQ3LDU4NTQ4LDU4NTQ5LDU4NTUwLDU4NTUxLDU4NTUyLDU4NTUzLDU4NTU0LDU4NTU1LDU4NTU2LDU4NTU3LDU4NTU4LDU4NTU5LDU4NTYwLDU4NTYxLDU4NTYyLDU4NTYzLDU4NTY0LDU4NTY1XSxcbiAgXCJnYjE4MDMwLXJhbmdlc1wiOltbMCwxMjhdLFszNiwxNjVdLFszOCwxNjldLFs0NSwxNzhdLFs1MCwxODRdLFs4MSwyMTZdLFs4OSwyMjZdLFs5NSwyMzVdLFs5NiwyMzhdLFsxMDAsMjQ0XSxbMTAzLDI0OF0sWzEwNCwyNTFdLFsxMDUsMjUzXSxbMTA5LDI1OF0sWzEyNiwyNzZdLFsxMzMsMjg0XSxbMTQ4LDMwMF0sWzE3MiwzMjVdLFsxNzUsMzI5XSxbMTc5LDMzNF0sWzIwOCwzNjRdLFszMDYsNDYzXSxbMzA3LDQ2NV0sWzMwOCw0NjddLFszMDksNDY5XSxbMzEwLDQ3MV0sWzMxMSw0NzNdLFszMTIsNDc1XSxbMzEzLDQ3N10sWzM0MSw1MDZdLFs0MjgsNTk0XSxbNDQzLDYxMF0sWzU0NCw3MTJdLFs1NDUsNzE2XSxbNTU4LDczMF0sWzc0MSw5MzBdLFs3NDIsOTM4XSxbNzQ5LDk2Ml0sWzc1MCw5NzBdLFs4MDUsMTAyNl0sWzgxOSwxMTA0XSxbODIwLDExMDZdLFs3OTIyLDgyMDldLFs3OTI0LDgyMTVdLFs3OTI1LDgyMThdLFs3OTI3LDgyMjJdLFs3OTM0LDgyMzFdLFs3OTQzLDgyNDFdLFs3OTQ0LDgyNDRdLFs3OTQ1LDgyNDZdLFs3OTUwLDgyNTJdLFs4MDYyLDgzNjVdLFs4MTQ4LDg0NTJdLFs4MTQ5LDg0NTRdLFs4MTUyLDg0NThdLFs4MTY0LDg0NzFdLFs4MTc0LDg0ODJdLFs4MjM2LDg1NTZdLFs4MjQwLDg1NzBdLFs4MjYyLDg1OTZdLFs4MjY0LDg2MDJdLFs4Mzc0LDg3MTNdLFs4MzgwLDg3MjBdLFs4MzgxLDg3MjJdLFs4Mzg0LDg3MjZdLFs4Mzg4LDg3MzFdLFs4MzkwLDg3MzddLFs4MzkyLDg3NDBdLFs4MzkzLDg3NDJdLFs4Mzk0LDg3NDhdLFs4Mzk2LDg3NTFdLFs4NDAxLDg3NjBdLFs4NDA2LDg3NjZdLFs4NDE2LDg3NzddLFs4NDE5LDg3ODFdLFs4NDI0LDg3ODddLFs4NDM3LDg4MDJdLFs4NDM5LDg4MDhdLFs4NDQ1LDg4MTZdLFs4NDgyLDg4NTRdLFs4NDg1LDg4NThdLFs4NDk2LDg4NzBdLFs4NTIxLDg4OTZdLFs4NjAzLDg5NzldLFs4OTM2LDkzMjJdLFs4OTQ2LDkzNzJdLFs5MDQ2LDk1NDhdLFs5MDUwLDk1ODhdLFs5MDYzLDk2MTZdLFs5MDY2LDk2MjJdLFs5MDc2LDk2MzRdLFs5MDkyLDk2NTJdLFs5MTAwLDk2NjJdLFs5MTA4LDk2NzJdLFs5MTExLDk2NzZdLFs5MTEzLDk2ODBdLFs5MTMxLDk3MDJdLFs5MTYyLDk3MzVdLFs5MTY0LDk3MzhdLFs5MjE4LDk3OTNdLFs5MjE5LDk3OTVdLFsxMTMyOSwxMTkwNl0sWzExMzMxLDExOTA5XSxbMTEzMzQsMTE5MTNdLFsxMTMzNiwxMTkxN10sWzExMzQ2LDExOTI4XSxbMTEzNjEsMTE5NDRdLFsxMTM2MywxMTk0N10sWzExMzY2LDExOTUxXSxbMTEzNzAsMTE5NTZdLFsxMTM3MiwxMTk2MF0sWzExMzc1LDExOTY0XSxbMTEzODksMTE5NzldLFsxMTY4MiwxMjI4NF0sWzExNjg2LDEyMjkyXSxbMTE2ODcsMTIzMTJdLFsxMTY5MiwxMjMxOV0sWzExNjk0LDEyMzMwXSxbMTE3MTQsMTIzNTFdLFsxMTcxNiwxMjQzNl0sWzExNzIzLDEyNDQ3XSxbMTE3MjUsMTI1MzVdLFsxMTczMCwxMjU0M10sWzExNzM2LDEyNTg2XSxbMTE5ODIsMTI4NDJdLFsxMTk4OSwxMjg1MF0sWzEyMTAyLDEyOTY0XSxbMTIzMzYsMTMyMDBdLFsxMjM0OCwxMzIxNV0sWzEyMzUwLDEzMjE4XSxbMTIzODQsMTMyNTNdLFsxMjM5MywxMzI2M10sWzEyMzk1LDEzMjY3XSxbMTIzOTcsMTMyNzBdLFsxMjUxMCwxMzM4NF0sWzEyNTUzLDEzNDI4XSxbMTI4NTEsMTM3MjddLFsxMjk2MiwxMzgzOV0sWzEyOTczLDEzODUxXSxbMTM3MzgsMTQ2MTddLFsxMzgyMywxNDcwM10sWzEzOTE5LDE0ODAxXSxbMTM5MzMsMTQ4MTZdLFsxNDA4MCwxNDk2NF0sWzE0Mjk4LDE1MTgzXSxbMTQ1ODUsMTU0NzFdLFsxNDY5OCwxNTU4NV0sWzE1NTgzLDE2NDcxXSxbMTU4NDcsMTY3MzZdLFsxNjMxOCwxNzIwOF0sWzE2NDM0LDE3MzI1XSxbMTY0MzgsMTczMzBdLFsxNjQ4MSwxNzM3NF0sWzE2NzI5LDE3NjIzXSxbMTcxMDIsMTc5OTddLFsxNzEyMiwxODAxOF0sWzE3MzE1LDE4MjEyXSxbMTczMjAsMTgyMThdLFsxNzQwMiwxODMwMV0sWzE3NDE4LDE4MzE4XSxbMTc4NTksMTg3NjBdLFsxNzkwOSwxODgxMV0sWzE3OTExLDE4ODE0XSxbMTc5MTUsMTg4MjBdLFsxNzkxNiwxODgyM10sWzE3OTM2LDE4ODQ0XSxbMTc5MzksMTg4NDhdLFsxNzk2MSwxODg3Ml0sWzE4NjY0LDE5NTc2XSxbMTg3MDMsMTk2MjBdLFsxODgxNCwxOTczOF0sWzE4OTYyLDE5ODg3XSxbMTkwNDMsNDA4NzBdLFszMzQ2OSw1OTI0NF0sWzMzNDcwLDU5MzM2XSxbMzM0NzEsNTkzNjddLFszMzQ4NCw1OTQxM10sWzMzNDg1LDU5NDE3XSxbMzM0OTAsNTk0MjNdLFszMzQ5Nyw1OTQzMV0sWzMzNTAxLDU5NDM3XSxbMzM1MDUsNTk0NDNdLFszMzUxMyw1OTQ1Ml0sWzMzNTIwLDU5NDYwXSxbMzM1MzYsNTk0NzhdLFszMzU1MCw1OTQ5M10sWzM3ODQ1LDYzNzg5XSxbMzc5MjEsNjM4NjZdLFszNzk0OCw2Mzg5NF0sWzM4MDI5LDYzOTc2XSxbMzgwMzgsNjM5ODZdLFszODA2NCw2NDAxNl0sWzM4MDY1LDY0MDE4XSxbMzgwNjYsNjQwMjFdLFszODA2OSw2NDAyNV0sWzM4MDc1LDY0MDM0XSxbMzgwNzYsNjQwMzddLFszODA3OCw2NDA0Ml0sWzM5MTA4LDY1MDc0XSxbMzkxMDksNjUwOTNdLFszOTExMyw2NTEwN10sWzM5MTE0LDY1MTEyXSxbMzkxMTUsNjUxMjddLFszOTExNiw2NTEzMl0sWzM5MjY1LDY1Mzc1XSxbMzkzOTQsNjU1MTBdLFsxODkwMDAsNjU1MzZdXSxcbiAgXCJqaXMwMjA4XCI6WzEyMjg4LDEyMjg5LDEyMjkwLDY1MjkyLDY1Mjk0LDEyNTM5LDY1MzA2LDY1MzA3LDY1MzExLDY1MjgxLDEyNDQzLDEyNDQ0LDE4MCw2NTM0NCwxNjgsNjUzNDIsNjU1MDcsNjUzNDMsMTI1NDEsMTI1NDIsMTI0NDUsMTI0NDYsMTIyOTEsMjAxODksMTIyOTMsMTIyOTQsMTIyOTUsMTI1NDAsODIxMyw4MjA4LDY1Mjk1LDY1MzQwLDY1Mzc0LDg3NDEsNjUzNzIsODIzMCw4MjI5LDgyMTYsODIxNyw4MjIwLDgyMjEsNjUyODgsNjUyODksMTIzMDgsMTIzMDksNjUzMzksNjUzNDEsNjUzNzEsNjUzNzMsMTIyOTYsMTIyOTcsMTIyOTgsMTIyOTksMTIzMDAsMTIzMDEsMTIzMDIsMTIzMDMsMTIzMDQsMTIzMDUsNjUyOTEsNjUyOTMsMTc3LDIxNSwyNDcsNjUzMDksODgwMCw2NTMwOCw2NTMxMCw4ODA2LDg4MDcsODczNCw4NzU2LDk3OTQsOTc5MiwxNzYsODI0Miw4MjQzLDg0NTEsNjU1MDksNjUyODQsNjU1MDQsNjU1MDUsNjUyODUsNjUyODMsNjUyODYsNjUyOTAsNjUzMTIsMTY3LDk3MzQsOTczMyw5Njc1LDk2NzksOTY3OCw5NjcxLDk2NzAsOTYzMyw5NjMyLDk2NTEsOTY1MCw5NjYxLDk2NjAsODI1MSwxMjMwNiw4NTk0LDg1OTIsODU5Myw4NTk1LDEyMzA3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4NzEyLDg3MTUsODgzOCw4ODM5LDg4MzQsODgzNSw4NzQ2LDg3NDUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDg3NDMsODc0NCw2NTUwNiw4NjU4LDg2NjAsODcwNCw4NzA3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4NzM2LDg4NjksODk3OCw4NzA2LDg3MTEsODgwMSw4Nzg2LDg4MTAsODgxMSw4NzMwLDg3NjUsODczMyw4NzU3LDg3NDcsODc0OCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDg0OTEsODI0MCw5ODM5LDk4MzcsOTgzNCw4MjI0LDgyMjUsMTgyLG51bGwsbnVsbCxudWxsLG51bGwsOTcxMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw2NTI5Niw2NTI5Nyw2NTI5OCw2NTI5OSw2NTMwMCw2NTMwMSw2NTMwMiw2NTMwMyw2NTMwNCw2NTMwNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDY1MzEzLDY1MzE0LDY1MzE1LDY1MzE2LDY1MzE3LDY1MzE4LDY1MzE5LDY1MzIwLDY1MzIxLDY1MzIyLDY1MzIzLDY1MzI0LDY1MzI1LDY1MzI2LDY1MzI3LDY1MzI4LDY1MzI5LDY1MzMwLDY1MzMxLDY1MzMyLDY1MzMzLDY1MzM0LDY1MzM1LDY1MzM2LDY1MzM3LDY1MzM4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDY1MzQ1LDY1MzQ2LDY1MzQ3LDY1MzQ4LDY1MzQ5LDY1MzUwLDY1MzUxLDY1MzUyLDY1MzUzLDY1MzU0LDY1MzU1LDY1MzU2LDY1MzU3LDY1MzU4LDY1MzU5LDY1MzYwLDY1MzYxLDY1MzYyLDY1MzYzLDY1MzY0LDY1MzY1LDY1MzY2LDY1MzY3LDY1MzY4LDY1MzY5LDY1MzcwLG51bGwsbnVsbCxudWxsLG51bGwsMTIzNTMsMTIzNTQsMTIzNTUsMTIzNTYsMTIzNTcsMTIzNTgsMTIzNTksMTIzNjAsMTIzNjEsMTIzNjIsMTIzNjMsMTIzNjQsMTIzNjUsMTIzNjYsMTIzNjcsMTIzNjgsMTIzNjksMTIzNzAsMTIzNzEsMTIzNzIsMTIzNzMsMTIzNzQsMTIzNzUsMTIzNzYsMTIzNzcsMTIzNzgsMTIzNzksMTIzODAsMTIzODEsMTIzODIsMTIzODMsMTIzODQsMTIzODUsMTIzODYsMTIzODcsMTIzODgsMTIzODksMTIzOTAsMTIzOTEsMTIzOTIsMTIzOTMsMTIzOTQsMTIzOTUsMTIzOTYsMTIzOTcsMTIzOTgsMTIzOTksMTI0MDAsMTI0MDEsMTI0MDIsMTI0MDMsMTI0MDQsMTI0MDUsMTI0MDYsMTI0MDcsMTI0MDgsMTI0MDksMTI0MTAsMTI0MTEsMTI0MTIsMTI0MTMsMTI0MTQsMTI0MTUsMTI0MTYsMTI0MTcsMTI0MTgsMTI0MTksMTI0MjAsMTI0MjEsMTI0MjIsMTI0MjMsMTI0MjQsMTI0MjUsMTI0MjYsMTI0MjcsMTI0MjgsMTI0MjksMTI0MzAsMTI0MzEsMTI0MzIsMTI0MzMsMTI0MzQsMTI0MzUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDEyNDQ5LDEyNDUwLDEyNDUxLDEyNDUyLDEyNDUzLDEyNDU0LDEyNDU1LDEyNDU2LDEyNDU3LDEyNDU4LDEyNDU5LDEyNDYwLDEyNDYxLDEyNDYyLDEyNDYzLDEyNDY0LDEyNDY1LDEyNDY2LDEyNDY3LDEyNDY4LDEyNDY5LDEyNDcwLDEyNDcxLDEyNDcyLDEyNDczLDEyNDc0LDEyNDc1LDEyNDc2LDEyNDc3LDEyNDc4LDEyNDc5LDEyNDgwLDEyNDgxLDEyNDgyLDEyNDgzLDEyNDg0LDEyNDg1LDEyNDg2LDEyNDg3LDEyNDg4LDEyNDg5LDEyNDkwLDEyNDkxLDEyNDkyLDEyNDkzLDEyNDk0LDEyNDk1LDEyNDk2LDEyNDk3LDEyNDk4LDEyNDk5LDEyNTAwLDEyNTAxLDEyNTAyLDEyNTAzLDEyNTA0LDEyNTA1LDEyNTA2LDEyNTA3LDEyNTA4LDEyNTA5LDEyNTEwLDEyNTExLDEyNTEyLDEyNTEzLDEyNTE0LDEyNTE1LDEyNTE2LDEyNTE3LDEyNTE4LDEyNTE5LDEyNTIwLDEyNTIxLDEyNTIyLDEyNTIzLDEyNTI0LDEyNTI1LDEyNTI2LDEyNTI3LDEyNTI4LDEyNTI5LDEyNTMwLDEyNTMxLDEyNTMyLDEyNTMzLDEyNTM0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDEwNDAsMTA0MSwxMDQyLDEwNDMsMTA0NCwxMDQ1LDEwMjUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDExMDUsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDk2LDk0OTIsOTUwMCw5NTE2LDk1MDgsOTUyNCw5NTMyLDk0NzMsOTQ3NSw5NDg3LDk0OTEsOTQ5OSw5NDk1LDk1MDcsOTUyMyw5NTE1LDk1MzEsOTU0Nyw5NTA0LDk1MTksOTUxMiw5NTI3LDk1MzUsOTUwMSw5NTIwLDk1MDksOTUyOCw5NTM4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDkzMTIsOTMxMyw5MzE0LDkzMTUsOTMxNiw5MzE3LDkzMTgsOTMxOSw5MzIwLDkzMjEsOTMyMiw5MzIzLDkzMjQsOTMyNSw5MzI2LDkzMjcsOTMyOCw5MzI5LDkzMzAsOTMzMSw4NTQ0LDg1NDUsODU0Niw4NTQ3LDg1NDgsODU0OSw4NTUwLDg1NTEsODU1Miw4NTUzLG51bGwsMTMxMjksMTMwNzYsMTMwOTAsMTMxMzMsMTMwODAsMTMwOTUsMTMwNTksMTMxMTAsMTMxMzcsMTMxNDMsMTMwNjksMTMwOTQsMTMwOTEsMTMwOTksMTMxMzAsMTMxMTUsMTMyMTIsMTMyMTMsMTMyMTQsMTMxOTgsMTMxOTksMTMyNTIsMTMyMTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDEzMTc5LDEyMzE3LDEyMzE5LDg0NzAsMTMyNjEsODQ4MSwxMjk2NCwxMjk2NSwxMjk2NiwxMjk2NywxMjk2OCwxMjg0OSwxMjg1MCwxMjg1NywxMzE4MiwxMzE4MSwxMzE4MCw4Nzg2LDg4MDEsODc0Nyw4NzUwLDg3MjEsODczMCw4ODY5LDg3MzYsODczNSw4ODk1LDg3NTcsODc0NSw4NzQ2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjAxMjQsMjE3ODIsMjMwNDMsMzg0NjMsMjE2OTYsMjQ4NTksMjUzODQsMjMwMzAsMzY4OTgsMzM5MDksMzM1NjQsMzEzMTIsMjQ3NDYsMjU1NjksMjgxOTcsMjYwOTMsMzM4OTQsMzM0NDYsMzk5MjUsMjY3NzEsMjIzMTEsMjYwMTcsMjUyMDEsMjM0NTEsMjI5OTIsMzQ0MjcsMzkxNTYsMzIwOTgsMzIxOTAsMzk4MjIsMjUxMTAsMzE5MDMsMzQ5OTksMjM0MzMsMjQyNDUsMjUzNTMsMjYyNjMsMjY2OTYsMzgzNDMsMzg3OTcsMjY0NDcsMjAxOTcsMjAyMzQsMjAzMDEsMjAzODEsMjA1NTMsMjIyNTgsMjI4MzksMjI5OTYsMjMwNDEsMjM1NjEsMjQ3OTksMjQ4NDcsMjQ5NDQsMjYxMzEsMjY4ODUsMjg4NTgsMzAwMzEsMzAwNjQsMzEyMjcsMzIxNzMsMzIyMzksMzI5NjMsMzM4MDYsMzQ5MTUsMzU1ODYsMzY5NDksMzY5ODYsMjEzMDcsMjAxMTcsMjAxMzMsMjI0OTUsMzI5NDYsMzcwNTcsMzA5NTksMTk5NjgsMjI3NjksMjgzMjIsMzY5MjAsMzEyODIsMzM1NzYsMzM0MTksMzk5ODMsMjA4MDEsMjEzNjAsMjE2OTMsMjE3MjksMjIyNDAsMjMwMzUsMjQzNDEsMzkxNTQsMjgxMzksMzI5OTYsMzQwOTMsMzg0OTgsMzg1MTIsMzg1NjAsMzg5MDcsMjE1MTUsMjE0OTEsMjM0MzEsMjg4NzksMzI3MDEsMzY4MDIsMzg2MzIsMjEzNTksNDAyODQsMzE0MTgsMTk5ODUsMzA4NjcsMzMyNzYsMjgxOTgsMjIwNDAsMjE3NjQsMjc0MjEsMzQwNzQsMzk5OTUsMjMwMTMsMjE0MTcsMjgwMDYsMjk5MTYsMzgyODcsMjIwODIsMjAxMTMsMzY5MzksMzg2NDIsMzM2MTUsMzkxODAsMjE0NzMsMjE5NDIsMjMzNDQsMjQ0MzMsMjYxNDQsMjYzNTUsMjY2MjgsMjc3MDQsMjc4OTEsMjc5NDUsMjk3ODcsMzA0MDgsMzEzMTAsMzg5NjQsMzM1MjEsMzQ5MDcsMzU0MjQsMzc2MTMsMjgwODIsMzAxMjMsMzA0MTAsMzkzNjUsMjQ3NDIsMzU1ODUsMzYyMzQsMzgzMjIsMjcwMjIsMjE0MjEsMjA4NzAsMjIyOTAsMjI1NzYsMjI4NTIsMjM0NzYsMjQzMTAsMjQ2MTYsMjU1MTMsMjU1ODgsMjc4MzksMjg0MzYsMjg4MTQsMjg5NDgsMjkwMTcsMjkxNDEsMjk1MDMsMzIyNTcsMzMzOTgsMzM0ODksMzQxOTksMzY5NjAsMzc0NjcsNDAyMTksMjI2MzMsMjYwNDQsMjc3MzgsMjk5ODksMjA5ODUsMjI4MzAsMjI4ODUsMjQ0NDgsMjQ1NDAsMjUyNzYsMjYxMDYsMjcxNzgsMjc0MzEsMjc1NzIsMjk1NzksMzI3MDUsMzUxNTgsNDAyMzYsNDAyMDYsNDA2NDQsMjM3MTMsMjc3OTgsMzM2NTksMjA3NDAsMjM2MjcsMjUwMTQsMzMyMjIsMjY3NDIsMjkyODEsMjAwNTcsMjA0NzQsMjEzNjgsMjQ2ODEsMjgyMDEsMzEzMTEsMzg4OTksMTk5NzksMjEyNzAsMjAyMDYsMjAzMDksMjAyODUsMjAzODUsMjAzMzksMjExNTIsMjE0ODcsMjIwMjUsMjI3OTksMjMyMzMsMjM0NzgsMjM1MjEsMzExODUsMjYyNDcsMjY1MjQsMjY1NTAsMjc0NjgsMjc4MjcsMjg3NzksMjk2MzQsMzExMTcsMzExNjYsMzEyOTIsMzE2MjMsMzM0NTcsMzM0OTksMzM1NDAsMzM2NTUsMzM3NzUsMzM3NDcsMzQ2NjIsMzU1MDYsMjIwNTcsMzYwMDgsMzY4MzgsMzY5NDIsMzg2ODYsMzQ0NDIsMjA0MjAsMjM3ODQsMjUxMDUsMjkyNzMsMzAwMTEsMzMyNTMsMzM0NjksMzQ1NTgsMzYwMzIsMzg1OTcsMzkxODcsMzkzODEsMjAxNzEsMjAyNTAsMzUyOTksMjIyMzgsMjI2MDIsMjI3MzAsMjQzMTUsMjQ1NTUsMjQ2MTgsMjQ3MjQsMjQ2NzQsMjUwNDAsMjUxMDYsMjUyOTYsMjU5MTMsMzk3NDUsMjYyMTQsMjY4MDAsMjgwMjMsMjg3ODQsMzAwMjgsMzAzNDIsMzIxMTcsMzM0NDUsMzQ4MDksMzgyODMsMzg1NDIsMzU5OTcsMjA5NzcsMjExODIsMjI4MDYsMjE2ODMsMjM0NzUsMjM4MzAsMjQ5MzYsMjcwMTAsMjgwNzksMzA4NjEsMzM5OTUsMzQ5MDMsMzU0NDIsMzc3OTksMzk2MDgsMjgwMTIsMzkzMzYsMzQ1MjEsMjI0MzUsMjY2MjMsMzQ1MTAsMzczOTAsMjExMjMsMjIxNTEsMjE1MDgsMjQyNzUsMjUzMTMsMjU3ODUsMjY2ODQsMjY2ODAsMjc1NzksMjk1NTQsMzA5MDYsMzEzMzksMzUyMjYsMzUyODIsMzYyMDMsMzY2MTEsMzcxMDEsMzgzMDcsMzg1NDgsMzg3NjEsMjMzOTgsMjM3MzEsMjcwMDUsMzg5ODksMzg5OTAsMjU0OTksMzE1MjAsMjcxNzksMjcyNjMsMjY4MDYsMzk5NDksMjg1MTEsMjExMDYsMjE5MTcsMjQ2ODgsMjUzMjQsMjc5NjMsMjgxNjcsMjgzNjksMzM4ODMsMzUwODgsMzY2NzYsMTk5ODgsMzk5OTMsMjE0OTQsMjY5MDcsMjcxOTQsMzg3ODgsMjY2NjYsMjA4MjgsMzE0MjcsMzM5NzAsMzczNDAsMzc3NzIsMjIxMDcsNDAyMzIsMjY2NTgsMzM1NDEsMzM4NDEsMzE5MDksMjEwMDAsMzM0NzcsMjk5MjYsMjAwOTQsMjAzNTUsMjA4OTYsMjM1MDYsMjEwMDIsMjEyMDgsMjEyMjMsMjQwNTksMjE5MTQsMjI1NzAsMjMwMTQsMjM0MzYsMjM0NDgsMjM1MTUsMjQxNzgsMjQxODUsMjQ3MzksMjQ4NjMsMjQ5MzEsMjUwMjIsMjU1NjMsMjU5NTQsMjY1NzcsMjY3MDcsMjY4NzQsMjc0NTQsMjc0NzUsMjc3MzUsMjg0NTAsMjg1NjcsMjg0ODUsMjk4NzIsMjk5NzYsMzA0MzUsMzA0NzUsMzE0ODcsMzE2NDksMzE3NzcsMzIyMzMsMzI1NjYsMzI3NTIsMzI5MjUsMzMzODIsMzM2OTQsMzUyNTEsMzU1MzIsMzYwMTEsMzY5OTYsMzc5NjksMzgyOTEsMzgyODksMzgzMDYsMzg1MDEsMzg4NjcsMzkyMDgsMzMzMDQsMjAwMjQsMjE1NDcsMjM3MzYsMjQwMTIsMjk2MDksMzAyODQsMzA1MjQsMjM3MjEsMzI3NDcsMzYxMDcsMzg1OTMsMzg5MjksMzg5OTYsMzkwMDAsMjAyMjUsMjAyMzgsMjEzNjEsMjE5MTYsMjIxMjAsMjI1MjIsMjI4NTUsMjMzMDUsMjM0OTIsMjM2OTYsMjQwNzYsMjQxOTAsMjQ1MjQsMjU1ODIsMjY0MjYsMjYwNzEsMjYwODIsMjYzOTksMjY4MjcsMjY4MjAsMjcyMzEsMjQxMTIsMjc1ODksMjc2NzEsMjc3NzMsMzAwNzksMzEwNDgsMjMzOTUsMzEyMzIsMzIwMDAsMjQ1MDksMzUyMTUsMzUzNTIsMzYwMjAsMzYyMTUsMzY1NTYsMzY2MzcsMzkxMzgsMzk0MzgsMzk3NDAsMjAwOTYsMjA2MDUsMjA3MzYsMjI5MzEsMjM0NTIsMjUxMzUsMjUyMTYsMjU4MzYsMjc0NTAsMjkzNDQsMzAwOTcsMzEwNDcsMzI2ODEsMzQ4MTEsMzU1MTYsMzU2OTYsMjU1MTYsMzM3MzgsMzg4MTYsMjE1MTMsMjE1MDcsMjE5MzEsMjY3MDgsMjcyMjQsMzU0NDAsMzA3NTksMjY0ODUsNDA2NTMsMjEzNjQsMjM0NTgsMzMwNTAsMzQzODQsMzY4NzAsMTk5OTIsMjAwMzcsMjAxNjcsMjAyNDEsMjE0NTAsMjE1NjAsMjM0NzAsMjQzMzksMjQ2MTMsMjU5MzcsMjY0MjksMjc3MTQsMjc3NjIsMjc4NzUsMjg3OTIsMjk2OTksMzEzNTAsMzE0MDYsMzE0OTYsMzIwMjYsMzE5OTgsMzIxMDIsMjYwODcsMjkyNzUsMjE0MzUsMjM2MjEsMjQwNDAsMjUyOTgsMjUzMTIsMjUzNjksMjgxOTIsMzQzOTQsMzUzNzcsMzYzMTcsMzc2MjQsMjg0MTcsMzExNDIsMzk3NzAsMjAxMzYsMjAxMzksMjAxNDAsMjAzNzksMjAzODQsMjA2ODksMjA4MDcsMzE0NzgsMjA4NDksMjA5ODIsMjEzMzIsMjEyODEsMjEzNzUsMjE0ODMsMjE5MzIsMjI2NTksMjM3NzcsMjQzNzUsMjQzOTQsMjQ2MjMsMjQ2NTYsMjQ2ODUsMjUzNzUsMjU5NDUsMjcyMTEsMjc4NDEsMjkzNzgsMjk0MjEsMzA3MDMsMzMwMTYsMzMwMjksMzMyODgsMzQxMjYsMzcxMTEsMzc4NTcsMzg5MTEsMzkyNTUsMzk1MTQsMjAyMDgsMjA5NTcsMjM1OTcsMjYyNDEsMjY5ODksMjM2MTYsMjYzNTQsMjY5OTcsMjk1NzcsMjY3MDQsMzE4NzMsMjA2NzcsMjEyMjAsMjIzNDMsMjQwNjIsMzc2NzAsMjYwMjAsMjc0MjcsMjc0NTMsMjk3NDgsMzExMDUsMzExNjUsMzE1NjMsMzIyMDIsMzM0NjUsMzM3NDAsMzQ5NDMsMzUxNjcsMzU2NDEsMzY4MTcsMzczMjksMjE1MzUsMzc1MDQsMjAwNjEsMjA1MzQsMjE0NzcsMjEzMDYsMjkzOTksMjk1OTAsMzA2OTcsMzM1MTAsMzY1MjcsMzkzNjYsMzkzNjgsMzkzNzgsMjA4NTUsMjQ4NTgsMzQzOTgsMjE5MzYsMzEzNTQsMjA1OTgsMjM1MDcsMzY5MzUsMzg1MzMsMjAwMTgsMjczNTUsMzczNTEsMjM2MzMsMjM2MjQsMjU0OTYsMzEzOTEsMjc3OTUsMzg3NzIsMzY3MDUsMzE0MDIsMjkwNjYsMzg1MzYsMzE4NzQsMjY2NDcsMzIzNjgsMjY3MDUsMzc3NDAsMjEyMzQsMjE1MzEsMzQyMTksMzUzNDcsMzI2NzYsMzY1NTcsMzcwODksMjEzNTAsMzQ5NTIsMzEwNDEsMjA0MTgsMjA2NzAsMjEwMDksMjA4MDQsMjE4NDMsMjIzMTcsMjk2NzQsMjI0MTEsMjI4NjUsMjQ0MTgsMjQ0NTIsMjQ2OTMsMjQ5NTAsMjQ5MzUsMjUwMDEsMjU1MjIsMjU2NTgsMjU5NjQsMjYyMjMsMjY2OTAsMjgxNzksMzAwNTQsMzEyOTMsMzE5OTUsMzIwNzYsMzIxNTMsMzIzMzEsMzI2MTksMzM1NTAsMzM2MTAsMzQ1MDksMzUzMzYsMzU0MjcsMzU2ODYsMzY2MDUsMzg5MzgsNDAzMzUsMzM0NjQsMzY4MTQsMzk5MTIsMjExMjcsMjUxMTksMjU3MzEsMjg2MDgsMzg1NTMsMjY2ODksMjA2MjUsMjc0MjQsMjc3NzAsMjg1MDAsMzEzNDgsMzIwODAsMzQ4ODAsMzUzNjMsMjYzNzYsMjAyMTQsMjA1MzcsMjA1MTgsMjA1ODEsMjA4NjAsMjEwNDgsMjEwOTEsMjE5MjcsMjIyODcsMjI1MzMsMjMyNDQsMjQzMTQsMjUwMTAsMjUwODAsMjUzMzEsMjU0NTgsMjY5MDgsMjcxNzcsMjkzMDksMjkzNTYsMjk0ODYsMzA3NDAsMzA4MzEsMzIxMjEsMzA0NzYsMzI5MzcsMzUyMTEsMzU2MDksMzYwNjYsMzY1NjIsMzY5NjMsMzc3NDksMzg1MjIsMzg5OTcsMzk0NDMsNDA1NjgsMjA4MDMsMjE0MDcsMjE0MjcsMjQxODcsMjQzNTgsMjgxODcsMjgzMDQsMjk1NzIsMjk2OTQsMzIwNjcsMzMzMzUsMzUzMjgsMzU1NzgsMzg0ODAsMjAwNDYsMjA0OTEsMjE0NzYsMjE2MjgsMjIyNjYsMjI5OTMsMjMzOTYsMjQwNDksMjQyMzUsMjQzNTksMjUxNDQsMjU5MjUsMjY1NDMsMjgyNDYsMjkzOTIsMzE5NDYsMzQ5OTYsMzI5MjksMzI5OTMsMzM3NzYsMzQzODIsMzU0NjMsMzYzMjgsMzc0MzEsMzg1OTksMzkwMTUsNDA3MjMsMjAxMTYsMjAxMTQsMjAyMzcsMjEzMjAsMjE1NzcsMjE1NjYsMjMwODcsMjQ0NjAsMjQ0ODEsMjQ3MzUsMjY3OTEsMjcyNzgsMjk3ODYsMzA4NDksMzU0ODYsMzU0OTIsMzU3MDMsMzcyNjQsMjAwNjIsMzk4ODEsMjAxMzIsMjAzNDgsMjAzOTksMjA1MDUsMjA1MDIsMjA4MDksMjA4NDQsMjExNTEsMjExNzcsMjEyNDYsMjE0MDIsMjE0NzUsMjE1MjEsMjE1MTgsMjE4OTcsMjIzNTMsMjI0MzQsMjI5MDksMjMzODAsMjMzODksMjM0MzksMjQwMzcsMjQwMzksMjQwNTUsMjQxODQsMjQxOTUsMjQyMTgsMjQyNDcsMjQzNDQsMjQ2NTgsMjQ5MDgsMjUyMzksMjUzMDQsMjU1MTEsMjU5MTUsMjYxMTQsMjYxNzksMjYzNTYsMjY0NzcsMjY2NTcsMjY3NzUsMjcwODMsMjc3NDMsMjc5NDYsMjgwMDksMjgyMDcsMjgzMTcsMzAwMDIsMzAzNDMsMzA4MjgsMzEyOTUsMzE5NjgsMzIwMDUsMzIwMjQsMzIwOTQsMzIxNzcsMzI3ODksMzI3NzEsMzI5NDMsMzI5NDUsMzMxMDgsMzMxNjcsMzMzMjIsMzM2MTgsMzQ4OTIsMzQ5MTMsMzU2MTEsMzYwMDIsMzYwOTIsMzcwNjYsMzcyMzcsMzc0ODksMzA3ODMsMzc2MjgsMzgzMDgsMzg0NzcsMzg5MTcsMzkzMjEsMzk2NDAsNDAyNTEsMjEwODMsMjExNjMsMjE0OTUsMjE1MTIsMjI3NDEsMjUzMzUsMjg2NDAsMzU5NDYsMzY3MDMsNDA2MzMsMjA4MTEsMjEwNTEsMjE1NzgsMjIyNjksMzEyOTYsMzcyMzksNDAyODgsNDA2NTgsMjk1MDgsMjg0MjUsMzMxMzYsMjk5NjksMjQ1NzMsMjQ3OTQsMzk1OTIsMjk0MDMsMzY3OTYsMjc0OTIsMzg5MTUsMjAxNzAsMjIyNTYsMjIzNzIsMjI3MTgsMjMxMzAsMjQ2ODAsMjUwMzEsMjYxMjcsMjYxMTgsMjY2ODEsMjY4MDEsMjgxNTEsMzAxNjUsMzIwNTgsMzMzOTAsMzk3NDYsMjAxMjMsMjAzMDQsMjE0NDksMjE3NjYsMjM5MTksMjQwMzgsMjQwNDYsMjY2MTksMjc4MDEsMjk4MTEsMzA3MjIsMzU0MDgsMzc3ODIsMzUwMzksMjIzNTIsMjQyMzEsMjUzODcsMjA2NjEsMjA2NTIsMjA4NzcsMjYzNjgsMjE3MDUsMjI2MjIsMjI5NzEsMjM0NzIsMjQ0MjUsMjUxNjUsMjU1MDUsMjY2ODUsMjc1MDcsMjgxNjgsMjg3OTcsMzczMTksMjkzMTIsMzA3NDEsMzA3NTgsMzEwODUsMjU5OTgsMzIwNDgsMzM3NTYsMzUwMDksMzY2MTcsMzg1NTUsMjEwOTIsMjIzMTIsMjY0NDgsMzI2MTgsMzYwMDEsMjA5MTYsMjIzMzgsMzg0NDIsMjI1ODYsMjcwMTgsMzI5NDgsMjE2ODIsMjM4MjIsMjI1MjQsMzA4NjksNDA0NDIsMjAzMTYsMjEwNjYsMjE2NDMsMjU2NjIsMjYxNTIsMjYzODgsMjY2MTMsMzEzNjQsMzE1NzQsMzIwMzQsMzc2NzksMjY3MTYsMzk4NTMsMzE1NDUsMjEyNzMsMjA4NzQsMjEwNDcsMjM1MTksMjUzMzQsMjU3NzQsMjU4MzAsMjY0MTMsMjc1NzgsMzQyMTcsMzg2MDksMzAzNTIsMzk4OTQsMjU0MjAsMzc2MzgsMzk4NTEsMzAzOTksMjYxOTQsMTk5NzcsMjA2MzIsMjE0NDIsMjM2NjUsMjQ4MDgsMjU3NDYsMjU5NTUsMjY3MTksMjkxNTgsMjk2NDIsMjk5ODcsMzE2MzksMzIzODYsMzQ0NTMsMzU3MTUsMzYwNTksMzcyNDAsMzkxODQsMjYwMjgsMjYyODMsMjc1MzEsMjAxODEsMjAxODAsMjAyODIsMjAzNTEsMjEwNTAsMjE0OTYsMjE0OTAsMjE5ODcsMjIyMzUsMjI3NjMsMjI5ODcsMjI5ODUsMjMwMzksMjMzNzYsMjM2MjksMjQwNjYsMjQxMDcsMjQ1MzUsMjQ2MDUsMjUzNTEsMjU5MDMsMjMzODgsMjYwMzEsMjYwNDUsMjYwODgsMjY1MjUsMjc0OTAsMjc1MTUsMjc2NjMsMjk1MDksMzEwNDksMzExNjksMzE5OTIsMzIwMjUsMzIwNDMsMzI5MzAsMzMwMjYsMzMyNjcsMzUyMjIsMzU0MjIsMzU0MzMsMzU0MzAsMzU0NjgsMzU1NjYsMzYwMzksMzYwNjAsMzg2MDQsMzkxNjQsMjc1MDMsMjAxMDcsMjAyODQsMjAzNjUsMjA4MTYsMjMzODMsMjM1NDYsMjQ5MDQsMjUzNDUsMjYxNzgsMjc0MjUsMjgzNjMsMjc4MzUsMjkyNDYsMjk4ODUsMzAxNjQsMzA5MTMsMzEwMzQsMzI3ODAsMzI4MTksMzMyNTgsMzM5NDAsMzY3NjYsMjc3MjgsNDA1NzUsMjQzMzUsMzU2NzIsNDAyMzUsMzE0ODIsMzY2MDAsMjM0MzcsMzg2MzUsMTk5NzEsMjE0ODksMjI1MTksMjI4MzMsMjMyNDEsMjM0NjAsMjQ3MTMsMjgyODcsMjg0MjIsMzAxNDIsMzYwNzQsMjM0NTUsMzQwNDgsMzE3MTIsMjA1OTQsMjY2MTIsMzM0MzcsMjM2NDksMzQxMjIsMzIyODYsMzMyOTQsMjA4ODksMjM1NTYsMjU0NDgsMzYxOTgsMjYwMTIsMjkwMzgsMzEwMzgsMzIwMjMsMzI3NzMsMzU2MTMsMzY1NTQsMzY5NzQsMzQ1MDMsMzcwMzQsMjA1MTEsMjEyNDIsMjM2MTAsMjY0NTEsMjg3OTYsMjkyMzcsMzcxOTYsMzczMjAsMzc2NzUsMzM1MDksMjM0OTAsMjQzNjksMjQ4MjUsMjAwMjcsMjE0NjIsMjM0MzIsMjUxNjMsMjY0MTcsMjc1MzAsMjk0MTcsMjk2NjQsMzEyNzgsMzMxMzEsMzYyNTksMzcyMDIsMzkzMTgsMjA3NTQsMjE0NjMsMjE2MTAsMjM1NTEsMjU0ODAsMjcxOTMsMzIxNzIsMzg2NTYsMjIyMzQsMjE0NTQsMjE2MDgsMjM0NDcsMjM2MDEsMjQwMzAsMjA0NjIsMjQ4MzMsMjUzNDIsMjc5NTQsMzExNjgsMzExNzksMzIwNjYsMzIzMzMsMzI3MjIsMzMyNjEsMzMzMTEsMzM5MzYsMzQ4ODYsMzUxODYsMzU3MjgsMzY0NjgsMzY2NTUsMzY5MTMsMzcxOTUsMzcyMjgsMzg1OTgsMzcyNzYsMjAxNjAsMjAzMDMsMjA4MDUsMjEzMTMsMjQ0NjcsMjUxMDIsMjY1ODAsMjc3MTMsMjgxNzEsMjk1MzksMzIyOTQsMzczMjUsMzc1MDcsMjE0NjAsMjI4MDksMjM0ODcsMjgxMTMsMzEwNjksMzIzMDIsMzE4OTksMjI2NTQsMjkwODcsMjA5ODYsMzQ4OTksMzY4NDgsMjA0MjYsMjM4MDMsMjYxNDksMzA2MzYsMzE0NTksMzMzMDgsMzk0MjMsMjA5MzQsMjQ0OTAsMjYwOTIsMjY5OTEsMjc1MjksMjgxNDcsMjgzMTAsMjg1MTYsMzA0NjIsMzIwMjAsMjQwMzMsMzY5ODEsMzcyNTUsMzg5MTgsMjA5NjYsMjEwMjEsMjUxNTIsMjYyNTcsMjYzMjksMjgxODYsMjQyNDYsMzIyMTAsMzI2MjYsMjYzNjAsMzQyMjMsMzQyOTUsMzU1NzYsMjExNjEsMjE0NjUsMjI4OTksMjQyMDcsMjQ0NjQsMjQ2NjEsMzc2MDQsMzg1MDAsMjA2NjMsMjA3NjcsMjEyMTMsMjEyODAsMjEzMTksMjE0ODQsMjE3MzYsMjE4MzAsMjE4MDksMjIwMzksMjI4ODgsMjI5NzQsMjMxMDAsMjM0NzcsMjM1NTgsMjM1NjcsMjM1NjksMjM1NzgsMjQxOTYsMjQyMDIsMjQyODgsMjQ0MzIsMjUyMTUsMjUyMjAsMjUzMDcsMjU0ODQsMjU0NjMsMjYxMTksMjYxMjQsMjYxNTcsMjYyMzAsMjY0OTQsMjY3ODYsMjcxNjcsMjcxODksMjc4MzYsMjgwNDAsMjgxNjksMjgyNDgsMjg5ODgsMjg5NjYsMjkwMzEsMzAxNTEsMzA0NjUsMzA4MTMsMzA5NzcsMzEwNzcsMzEyMTYsMzE0NTYsMzE1MDUsMzE5MTEsMzIwNTcsMzI5MTgsMzM3NTAsMzM5MzEsMzQxMjEsMzQ5MDksMzUwNTksMzUzNTksMzUzODgsMzU0MTIsMzU0NDMsMzU5MzcsMzYwNjIsMzcyODQsMzc0NzgsMzc3NTgsMzc5MTIsMzg1NTYsMzg4MDgsMTk5NzgsMTk5NzYsMTk5OTgsMjAwNTUsMjA4ODcsMjExMDQsMjI0NzgsMjI1ODAsMjI3MzIsMjMzMzAsMjQxMjAsMjQ3NzMsMjU4NTQsMjY0NjUsMjY0NTQsMjc5NzIsMjkzNjYsMzAwNjcsMzEzMzEsMzM5NzYsMzU2OTgsMzczMDQsMzc2NjQsMjIwNjUsMjI1MTYsMzkxNjYsMjUzMjUsMjY4OTMsMjc1NDIsMjkxNjUsMzIzNDAsMzI4ODcsMzMzOTQsMzUzMDIsMzkxMzUsMzQ2NDUsMzY3ODUsMjM2MTEsMjAyODAsMjA0NDksMjA0MDUsMjE3NjcsMjMwNzIsMjM1MTcsMjM1MjksMjQ1MTUsMjQ5MTAsMjUzOTEsMjYwMzIsMjYxODcsMjY4NjIsMjcwMzUsMjgwMjQsMjgxNDUsMzAwMDMsMzAxMzcsMzA0OTUsMzEwNzAsMzEyMDYsMzIwNTEsMzMyNTEsMzM0NTUsMzQyMTgsMzUyNDIsMzUzODYsMzY1MjMsMzY3NjMsMzY5MTQsMzczNDEsMzg2NjMsMjAxNTQsMjAxNjEsMjA5OTUsMjI2NDUsMjI3NjQsMjM1NjMsMjk5NzgsMjM2MTMsMzMxMDIsMzUzMzgsMzY4MDUsMzg0OTksMzg3NjUsMzE1MjUsMzU1MzUsMzg5MjAsMzcyMTgsMjIyNTksMjE0MTYsMzY4ODcsMjE1NjEsMjI0MDIsMjQxMDEsMjU1MTIsMjc3MDAsMjg4MTAsMzA1NjEsMzE4ODMsMzI3MzYsMzQ5MjgsMzY5MzAsMzcyMDQsMzc2NDgsMzc2NTYsMzg1NDMsMjk3OTAsMzk2MjAsMjM4MTUsMjM5MTMsMjU5NjgsMjY1MzAsMzYyNjQsMzg2MTksMjU0NTQsMjY0NDEsMjY5MDUsMzM3MzMsMzg5MzUsMzg1OTIsMzUwNzAsMjg1NDgsMjU3MjIsMjM1NDQsMTk5OTAsMjg3MTYsMzAwNDUsMjYxNTksMjA5MzIsMjEwNDYsMjEyMTgsMjI5OTUsMjQ0NDksMjQ2MTUsMjUxMDQsMjU5MTksMjU5NzIsMjYxNDMsMjYyMjgsMjY4NjYsMjY2NDYsMjc0OTEsMjgxNjUsMjkyOTgsMjk5ODMsMzA0MjcsMzE5MzQsMzI4NTQsMjI3NjgsMzUwNjksMzUxOTksMzU0ODgsMzU0NzUsMzU1MzEsMzY4OTMsMzcyNjYsMzg3MzgsMzg3NDUsMjU5OTMsMzEyNDYsMzMwMzAsMzg1ODcsMjQxMDksMjQ3OTYsMjUxMTQsMjYwMjEsMjYxMzIsMjY1MTIsMzA3MDcsMzEzMDksMzE4MjEsMzIzMTgsMzMwMzQsMzYwMTIsMzYxOTYsMzYzMjEsMzY0NDcsMzA4ODksMjA5OTksMjUzMDUsMjU1MDksMjU2NjYsMjUyNDAsMzUzNzMsMzEzNjMsMzE2ODAsMzU1MDAsMzg2MzQsMzIxMTgsMzMyOTIsMzQ2MzMsMjAxODUsMjA4MDgsMjEzMTUsMjEzNDQsMjM0NTksMjM1NTQsMjM1NzQsMjQwMjksMjUxMjYsMjUxNTksMjU3NzYsMjY2NDMsMjY2NzYsMjc4NDksMjc5NzMsMjc5MjcsMjY1NzksMjg1MDgsMjkwMDYsMjkwNTMsMjYwNTksMzEzNTksMzE2NjEsMzIyMTgsMzIzMzAsMzI2ODAsMzMxNDYsMzMzMDcsMzMzMzcsMzQyMTQsMzU0MzgsMzYwNDYsMzYzNDEsMzY5ODQsMzY5ODMsMzc1NDksMzc1MjEsMzgyNzUsMzk4NTQsMjEwNjksMjE4OTIsMjg0NzIsMjg5ODIsMjA4NDAsMzExMDksMzIzNDEsMzMyMDMsMzE5NTAsMjIwOTIsMjI2MDksMjM3MjAsMjU1MTQsMjYzNjYsMjYzNjUsMjY5NzAsMjk0MDEsMzAwOTUsMzAwOTQsMzA5OTAsMzEwNjIsMzExOTksMzE4OTUsMzIwMzIsMzIwNjgsMzQzMTEsMzUzODAsMzg0NTksMzY5NjEsNDA3MzYsMjA3MTEsMjExMDksMjE0NTIsMjE0NzQsMjA0ODksMjE5MzAsMjI3NjYsMjI4NjMsMjkyNDUsMjM0MzUsMjM2NTIsMjEyNzcsMjQ4MDMsMjQ4MTksMjU0MzYsMjU0NzUsMjU0MDcsMjU1MzEsMjU4MDUsMjYwODksMjYzNjEsMjQwMzUsMjcwODUsMjcxMzMsMjg0MzcsMjkxNTcsMjAxMDUsMzAxODUsMzA0NTYsMzEzNzksMzE5NjcsMzIyMDcsMzIxNTYsMzI4NjUsMzM2MDksMzM2MjQsMzM5MDAsMzM5ODAsMzQyOTksMzUwMTMsMzYyMDgsMzY4NjUsMzY5NzMsMzc3ODMsMzg2ODQsMzk0NDIsMjA2ODcsMjI2NzksMjQ5NzQsMzMyMzUsMzQxMDEsMzYxMDQsMzY4OTYsMjA0MTksMjA1OTYsMjEwNjMsMjEzNjMsMjQ2ODcsMjU0MTcsMjY0NjMsMjgyMDQsMzYyNzUsMzY4OTUsMjA0MzksMjM2NDYsMzYwNDIsMjYwNjMsMzIxNTQsMjEzMzAsMzQ5NjYsMjA4NTQsMjU1MzksMjMzODQsMjM0MDMsMjM1NjIsMjU2MTMsMjY0NDksMzY5NTYsMjAxODIsMjI4MTAsMjI4MjYsMjc3NjAsMzU0MDksMjE4MjIsMjI1NDksMjI5NDksMjQ4MTYsMjUxNzEsMjY1NjEsMzMzMzMsMjY5NjUsMzg0NjQsMzkzNjQsMzk0NjQsMjAzMDcsMjI1MzQsMjM1NTAsMzI3ODQsMjM3MjksMjQxMTEsMjQ0NTMsMjQ2MDgsMjQ5MDcsMjUxNDAsMjYzNjcsMjc4ODgsMjgzODIsMzI5NzQsMzMxNTEsMzM0OTIsMzQ5NTUsMzYwMjQsMzY4NjQsMzY5MTAsMzg1MzgsNDA2NjcsMzk4OTksMjAxOTUsMjE0ODgsMjI4MjMsMzE1MzIsMzcyNjEsMzg5ODgsNDA0NDEsMjgzODEsMjg3MTEsMjEzMzEsMjE4MjgsMjM0MjksMjUxNzYsMjUyNDYsMjUyOTksMjc4MTAsMjg2NTUsMjk3MzAsMzUzNTEsMzc5NDQsMjg2MDksMzU1ODIsMzM1OTIsMjA5NjcsMzQ1NTIsMjE0ODIsMjE0ODEsMjAyOTQsMzY5NDgsMzY3ODQsMjI4OTAsMzMwNzMsMjQwNjEsMzE0NjYsMzY3OTksMjY4NDIsMzU4OTUsMjk0MzIsNDAwMDgsMjcxOTcsMzU1MDQsMjAwMjUsMjEzMzYsMjIwMjIsMjIzNzQsMjUyODUsMjU1MDYsMjYwODYsMjc0NzAsMjgxMjksMjgyNTEsMjg4NDUsMzA3MDEsMzE0NzEsMzE2NTgsMzIxODcsMzI4MjksMzI5NjYsMzQ1MDcsMzU0NzcsMzc3MjMsMjIyNDMsMjI3MjcsMjQzODIsMjYwMjksMjYyNjIsMjcyNjQsMjc1NzMsMzAwMDcsMzU1MjcsMjA1MTYsMzA2OTMsMjIzMjAsMjQzNDcsMjQ2NzcsMjYyMzQsMjc3NDQsMzAxOTYsMzEyNTgsMzI2MjIsMzMyNjgsMzQ1ODQsMzY5MzMsMzkzNDcsMzE2ODksMzAwNDQsMzE0ODEsMzE1NjksMzM5ODgsMzY4ODAsMzEyMDksMzEzNzgsMzM1OTAsMjMyNjUsMzA1MjgsMjAwMTMsMjAyMTAsMjM0NDksMjQ1NDQsMjUyNzcsMjYxNzIsMjY2MDksMjc4ODAsMzQ0MTEsMzQ5MzUsMzUzODcsMzcxOTgsMzc2MTksMzkzNzYsMjcxNTksMjg3MTAsMjk0ODIsMzM1MTEsMzM4NzksMzYwMTUsMTk5NjksMjA4MDYsMjA5MzksMjE4OTksMjM1NDEsMjQwODYsMjQxMTUsMjQxOTMsMjQzNDAsMjQzNzMsMjQ0MjcsMjQ1MDAsMjUwNzQsMjUzNjEsMjYyNzQsMjYzOTcsMjg1MjYsMjkyNjYsMzAwMTAsMzA1MjIsMzI4ODQsMzMwODEsMzMxNDQsMzQ2NzgsMzU1MTksMzU1NDgsMzYyMjksMzYzMzksMzc1MzAsMzgyNjMsMzg5MTQsNDAxNjUsMjExODksMjU0MzEsMzA0NTIsMjYzODksMjc3ODQsMjk2NDUsMzYwMzUsMzc4MDYsMzg1MTUsMjc5NDEsMjI2ODQsMjY4OTQsMjcwODQsMzY4NjEsMzc3ODYsMzAxNzEsMzY4OTAsMjI2MTgsMjY2MjYsMjU1MjQsMjcxMzEsMjAyOTEsMjg0NjAsMjY1ODQsMzY3OTUsMzQwODYsMzIxODAsMzc3MTYsMjY5NDMsMjg1MjgsMjIzNzgsMjI3NzUsMjMzNDAsMzIwNDQsMjkyMjYsMjE1MTQsMzczNDcsNDAzNzIsMjAxNDEsMjAzMDIsMjA1NzIsMjA1OTcsMjEwNTksMzU5OTgsMjE1NzYsMjI1NjQsMjM0NTAsMjQwOTMsMjQyMTMsMjQyMzcsMjQzMTEsMjQzNTEsMjQ3MTYsMjUyNjksMjU0MDIsMjU1NTIsMjY3OTksMjc3MTIsMzA4NTUsMzExMTgsMzEyNDMsMzIyMjQsMzMzNTEsMzUzMzAsMzU1NTgsMzY0MjAsMzY4ODMsMzcwNDgsMzcxNjUsMzczMzYsNDA3MTgsMjc4NzcsMjU2ODgsMjU4MjYsMjU5NzMsMjg0MDQsMzAzNDAsMzE1MTUsMzY5NjksMzc4NDEsMjgzNDYsMjE3NDYsMjQ1MDUsMjU3NjQsMzY2ODUsMzY4NDUsMzc0NDQsMjA4NTYsMjI2MzUsMjI4MjUsMjM2MzcsMjQyMTUsMjgxNTUsMzIzOTksMjk5ODAsMzYwMjgsMzY1NzgsMzkwMDMsMjg4NTcsMjAyNTMsMjc1ODMsMjg1OTMsMzAwMDAsMzg2NTEsMjA4MTQsMjE1MjAsMjI1ODEsMjI2MTUsMjI5NTYsMjM2NDgsMjQ0NjYsMjYwMDcsMjY0NjAsMjgxOTMsMzAzMzEsMzM3NTksMzYwNzcsMzY4ODQsMzcxMTcsMzc3MDksMzA3NTcsMzA3NzgsMjExNjIsMjQyMzAsMjIzMDMsMjI5MDAsMjQ1OTQsMjA0OTgsMjA4MjYsMjA5MDgsMjA5NDEsMjA5OTIsMjE3NzYsMjI2MTIsMjI2MTYsMjI4NzEsMjM0NDUsMjM3OTgsMjM5NDcsMjQ3NjQsMjUyMzcsMjU2NDUsMjY0ODEsMjY2OTEsMjY4MTIsMjY4NDcsMzA0MjMsMjgxMjAsMjgyNzEsMjgwNTksMjg3ODMsMjkxMjgsMjQ0MDMsMzAxNjgsMzEwOTUsMzE1NjEsMzE1NzIsMzE1NzAsMzE5NTgsMzIxMTMsMjEwNDAsMzM4OTEsMzQxNTMsMzQyNzYsMzUzNDIsMzU1ODgsMzU5MTAsMzYzNjcsMzY4NjcsMzY4NzksMzc5MTMsMzg1MTgsMzg5NTcsMzk0NzIsMzgzNjAsMjA2ODUsMjEyMDUsMjE1MTYsMjI1MzAsMjM1NjYsMjQ5OTksMjU3NTgsMjc5MzQsMzA2NDMsMzE0NjEsMzMwMTIsMzM3OTYsMzY5NDcsMzc1MDksMjM3NzYsNDAxOTksMjEzMTEsMjQ0NzEsMjQ0OTksMjgwNjAsMjkzMDUsMzA1NjMsMzExNjcsMzE3MTYsMjc2MDIsMjk0MjAsMzU1MDEsMjY2MjcsMjcyMzMsMjA5ODQsMzEzNjEsMjY5MzIsMjM2MjYsNDAxODIsMzM1MTUsMjM0OTMsMzcxOTMsMjg3MDIsMjIxMzYsMjM2NjMsMjQ3NzUsMjU5NTgsMjc3ODgsMzU5MzAsMzY5MjksMzg5MzEsMjE1ODUsMjYzMTEsMzczODksMjI4NTYsMzcwMjcsMjA4NjksMjAwNDUsMjA5NzAsMzQyMDEsMzU1OTgsMjg3NjAsMjU0NjYsMzc3MDcsMjY5NzgsMzkzNDgsMzIyNjAsMzAwNzEsMjEzMzUsMjY5NzYsMzY1NzUsMzg2MjcsMjc3NDEsMjAxMDgsMjM2MTIsMjQzMzYsMzY4NDEsMjEyNTAsMzYwNDksMzI5MDUsMzQ0MjUsMjQzMTksMjYwODUsMjAwODMsMjA4MzcsMjI5MTQsMjM2MTUsMzg4OTQsMjAyMTksMjI5MjIsMjQ1MjUsMzU0NjksMjg2NDEsMzExNTIsMzEwNzQsMjM1MjcsMzM5MDUsMjk0ODMsMjkxMDUsMjQxODAsMjQ1NjUsMjU0NjcsMjU3NTQsMjkxMjMsMzE4OTYsMjAwMzUsMjQzMTYsMjAwNDMsMjI0OTIsMjIxNzgsMjQ3NDUsMjg2MTEsMzIwMTMsMzMwMjEsMzMwNzUsMzMyMTUsMzY3ODYsMzUyMjMsMzQ0NjgsMjQwNTIsMjUyMjYsMjU3NzMsMzUyMDcsMjY0ODcsMjc4NzQsMjc5NjYsMjk3NTAsMzA3NzIsMjMxMTAsMzI2MjksMzM0NTMsMzkzNDAsMjA0NjcsMjQyNTksMjUzMDksMjU0OTAsMjU5NDMsMjY0NzksMzA0MDMsMjkyNjAsMzI5NzIsMzI5NTQsMzY2NDksMzcxOTcsMjA0OTMsMjI1MjEsMjMxODYsMjY3NTcsMjY5OTUsMjkwMjgsMjk0MzcsMzYwMjMsMjI3NzAsMzYwNjQsMzg1MDYsMzY4ODksMzQ2ODcsMzEyMDQsMzA2OTUsMzM4MzMsMjAyNzEsMjEwOTMsMjEzMzgsMjUyOTMsMjY1NzUsMjc4NTAsMzAzMzMsMzE2MzYsMzE4OTMsMzMzMzQsMzQxODAsMzY4NDMsMjYzMzMsMjg0NDgsMjkxOTAsMzIyODMsMzM3MDcsMzkzNjEsNDA2MTQsMjA5ODksMzE2NjUsMzA4MzQsMzE2NzIsMzI5MDMsMzE1NjAsMjczNjgsMjQxNjEsMzI5MDgsMzAwMzMsMzAwNDgsMjA4NDMsMzc0NzQsMjgzMDAsMzAzMzAsMzcyNzEsMzk2NTgsMjAyNDAsMzI2MjQsMjUyNDQsMzE1NjcsMzgzMDksNDAxNjksMjIxMzgsMjI2MTcsMzQ1MzIsMzg1ODgsMjAyNzYsMjEwMjgsMjEzMjIsMjE0NTMsMjE0NjcsMjQwNzAsMjU2NDQsMjYwMDEsMjY0OTUsMjc3MTAsMjc3MjYsMjkyNTYsMjkzNTksMjk2NzcsMzAwMzYsMzIzMjEsMzMzMjQsMzQyODEsMzYwMDksMzE2ODQsMzczMTgsMjkwMzMsMzg5MzAsMzkxNTEsMjU0MDUsMjYyMTcsMzAwNTgsMzA0MzYsMzA5MjgsMzQxMTUsMzQ1NDIsMjEyOTAsMjEzMjksMjE1NDIsMjI5MTUsMjQxOTksMjQ0NDQsMjQ3NTQsMjUxNjEsMjUyMDksMjUyNTksMjYwMDAsMjc2MDQsMjc4NTIsMzAxMzAsMzAzODIsMzA4NjUsMzExOTIsMzIyMDMsMzI2MzEsMzI5MzMsMzQ5ODcsMzU1MTMsMzYwMjcsMzY5OTEsMzg3NTAsMzkxMzEsMjcxNDcsMzE4MDAsMjA2MzMsMjM2MTQsMjQ0OTQsMjY1MDMsMjc2MDgsMjk3NDksMzA0NzMsMzI2NTQsNDA3NjMsMjY1NzAsMzEyNTUsMjEzMDUsMzAwOTEsMzk2NjEsMjQ0MjIsMzMxODEsMzM3NzcsMzI5MjAsMjQzODAsMjQ1MTcsMzAwNTAsMzE1NTgsMzY5MjQsMjY3MjcsMjMwMTksMjMxOTUsMzIwMTYsMzAzMzQsMzU2MjgsMjA0NjksMjQ0MjYsMjcxNjEsMjc3MDMsMjg0MTgsMjk5MjIsMzEwODAsMzQ5MjAsMzU0MTMsMzU5NjEsMjQyODcsMjU1NTEsMzAxNDksMzExODYsMzM0OTUsMzc2NzIsMzc2MTgsMzM5NDgsMzQ1NDEsMzk5ODEsMjE2OTcsMjQ0MjgsMjU5OTYsMjc5OTYsMjg2OTMsMzYwMDcsMzYwNTEsMzg5NzEsMjU5MzUsMjk5NDIsMTk5ODEsMjAxODQsMjI0OTYsMjI4MjcsMjMxNDIsMjM1MDAsMjA5MDQsMjQwNjcsMjQyMjAsMjQ1OTgsMjUyMDYsMjU5NzUsMjYwMjMsMjYyMjIsMjgwMTQsMjkyMzgsMzE1MjYsMzMxMDQsMzMxNzgsMzM0MzMsMzU2NzYsMzYwMDAsMzYwNzAsMzYyMTIsMzg0MjgsMzg0NjgsMjAzOTgsMjU3NzEsMjc0OTQsMzMzMTAsMzM4ODksMzQxNTQsMzcwOTYsMjM1NTMsMjY5NjMsMzkwODAsMzM5MTQsMzQxMzUsMjAyMzksMjExMDMsMjQ0ODksMjQxMzMsMjYzODEsMzExMTksMzMxNDUsMzUwNzksMzUyMDYsMjgxNDksMjQzNDMsMjUxNzMsMjc4MzIsMjAxNzUsMjkyODksMzk4MjYsMjA5OTgsMjE1NjMsMjIxMzIsMjI3MDcsMjQ5OTYsMjUxOTgsMjg5NTQsMjI4OTQsMzE4ODEsMzE5NjYsMzIwMjcsMzg2NDAsMjU5OTEsMzI4NjIsMTk5OTMsMjAzNDEsMjA4NTMsMjI1OTIsMjQxNjMsMjQxNzksMjQzMzAsMjY1NjQsMjAwMDYsMzQxMDksMzgyODEsMzg0OTEsMzE4NTksMzg5MTMsMjA3MzEsMjI3MjEsMzAyOTQsMzA4ODcsMjEwMjksMzA2MjksMzQwNjUsMzE2MjIsMjA1NTksMjI3OTMsMjkyNTUsMzE2ODcsMzIyMzIsMzY3OTQsMzY4MjAsMzY5NDEsMjA0MTUsMjExOTMsMjMwODEsMjQzMjEsMzg4MjksMjA0NDUsMzMzMDMsMzc2MTAsMjIyNzUsMjU0MjksMjc0OTcsMjk5OTUsMzUwMzYsMzY2MjgsMzEyOTgsMjEyMTUsMjI2NzUsMjQ5MTcsMjUwOTgsMjYyODYsMjc1OTcsMzE4MDcsMzM3NjksMjA1MTUsMjA0NzIsMjEyNTMsMjE1NzQsMjI1NzcsMjI4NTcsMjM0NTMsMjM3OTIsMjM3OTEsMjM4NDksMjQyMTQsMjUyNjUsMjU0NDcsMjU5MTgsMjYwNDEsMjYzNzksMjc4NjEsMjc4NzMsMjg5MjEsMzA3NzAsMzIyOTksMzI5OTAsMzM0NTksMzM4MDQsMzQwMjgsMzQ1NjIsMzUwOTAsMzUzNzAsMzU5MTQsMzcwMzAsMzc1ODYsMzkxNjUsNDAxNzksNDAzMDAsMjAwNDcsMjAxMjksMjA2MjEsMjEwNzgsMjIzNDYsMjI5NTIsMjQxMjUsMjQ1MzYsMjQ1MzcsMjUxNTEsMjYyOTIsMjYzOTUsMjY1NzYsMjY4MzQsMjA4ODIsMzIwMzMsMzI5MzgsMzMxOTIsMzU1ODQsMzU5ODAsMzYwMzEsMzc1MDIsMzg0NTAsMjE1MzYsMzg5NTYsMjEyNzEsMjA2OTMsMjEzNDAsMjI2OTYsMjU3NzgsMjY0MjAsMjkyODcsMzA1NjYsMzEzMDIsMzczNTAsMjExODcsMjc4MDksMjc1MjYsMjI1MjgsMjQxNDAsMjI4NjgsMjY0MTIsMzI3NjMsMjA5NjEsMzA0MDYsMjU3MDUsMzA5NTIsMzk3NjQsNDA2MzUsMjI0NzUsMjI5NjksMjYxNTEsMjY1MjIsMjc1OTgsMjE3MzcsMjcwOTcsMjQxNDksMzMxODAsMjY1MTcsMzk4NTAsMjY2MjIsNDAwMTgsMjY3MTcsMjAxMzQsMjA0NTEsMjE0NDgsMjUyNzMsMjY0MTEsMjc4MTksMzY4MDQsMjAzOTcsMzIzNjUsNDA2MzksMTk5NzUsMjQ5MzAsMjgyODgsMjg0NTksMzQwNjcsMjE2MTksMjY0MTAsMzk3NDksMjQwNTEsMzE2MzcsMjM3MjQsMjM0OTQsMzQ1ODgsMjgyMzQsMzQwMDEsMzEyNTIsMzMwMzIsMjI5MzcsMzE4ODUsMjc2NjUsMzA0OTYsMjEyMDksMjI4MTgsMjg5NjEsMjkyNzksMzA2ODMsMzg2OTUsNDAyODksMjY4OTEsMjMxNjcsMjMwNjQsMjA5MDEsMjE1MTcsMjE2MjksMjYxMjYsMzA0MzEsMzY4NTUsMzc1MjgsNDAxODAsMjMwMTgsMjkyNzcsMjgzNTcsMjA4MTMsMjY4MjUsMzIxOTEsMzIyMzYsMzg3NTQsNDA2MzQsMjU3MjAsMjcxNjksMzM1MzgsMjI5MTYsMjMzOTEsMjc2MTEsMjk0NjcsMzA0NTAsMzIxNzgsMzI3OTEsMzM5NDUsMjA3ODYsMjY0MDgsNDA2NjUsMzA0NDYsMjY0NjYsMjEyNDcsMzkxNzMsMjM1ODgsMjUxNDcsMzE4NzAsMzYwMTYsMjE4MzksMjQ3NTgsMzIwMTEsMzgyNzIsMjEyNDksMjAwNjMsMjA5MTgsMjI4MTIsMjkyNDIsMzI4MjIsMzczMjYsMjQzNTcsMzA2OTAsMjEzODAsMjQ0NDEsMzIwMDQsMzQyMjAsMzUzNzksMzY0OTMsMzg3NDIsMjY2MTEsMzQyMjIsMzc5NzEsMjQ4NDEsMjQ4NDAsMjc4MzMsMzAyOTAsMzU1NjUsMzY2NjQsMjE4MDcsMjAzMDUsMjA3NzgsMjExOTEsMjE0NTEsMjM0NjEsMjQxODksMjQ3MzYsMjQ5NjIsMjU1NTgsMjYzNzcsMjY1ODYsMjgyNjMsMjgwNDQsMjk0OTQsMjk0OTUsMzAwMDEsMzEwNTYsMzUwMjksMzU0ODAsMzY5MzgsMzcwMDksMzcxMDksMzg1OTYsMzQ3MDEsMjI4MDUsMjAxMDQsMjAzMTMsMTk5ODIsMzU0NjUsMzY2NzEsMzg5MjgsMjA2NTMsMjQxODgsMjI5MzQsMjM0ODEsMjQyNDgsMjU1NjIsMjU1OTQsMjU3OTMsMjYzMzIsMjY5NTQsMjcwOTYsMjc5MTUsMjgzNDIsMjkwNzYsMjk5OTIsMzE0MDcsMzI2NTAsMzI3NjgsMzM4NjUsMzM5OTMsMzUyMDEsMzU2MTcsMzYzNjIsMzY5NjUsMzg1MjUsMzkxNzgsMjQ5NTgsMjUyMzMsMjc0NDIsMjc3NzksMjgwMjAsMzI3MTYsMzI3NjQsMjgwOTYsMzI2NDUsMzQ3NDYsMzUwNjQsMjY0NjksMzM3MTMsMzg5NzIsMzg2NDcsMjc5MzEsMzIwOTcsMzM4NTMsMzcyMjYsMjAwODEsMjEzNjUsMjM4ODgsMjczOTYsMjg2NTEsMzQyNTMsMzQzNDksMzUyMzksMjEwMzMsMjE1MTksMjM2NTMsMjY0NDYsMjY3OTIsMjk3MDIsMjk4MjcsMzAxNzgsMzUwMjMsMzUwNDEsMzczMjQsMzg2MjYsMzg1MjAsMjQ0NTksMjk1NzUsMzE0MzUsMzM4NzAsMjU1MDQsMzAwNTMsMjExMjksMjc5NjksMjgzMTYsMjk3MDUsMzAwNDEsMzA4MjcsMzE4OTAsMzg1MzQsMzE0NTIsNDA4NDUsMjA0MDYsMjQ5NDIsMjYwNTMsMzQzOTYsMjAxMDIsMjAxNDIsMjA2OTgsMjAwMDEsMjA5NDAsMjM1MzQsMjYwMDksMjY3NTMsMjgwOTIsMjk0NzEsMzAyNzQsMzA2MzcsMzEyNjAsMzE5NzUsMzMzOTEsMzU1MzgsMzY5ODgsMzczMjcsMzg1MTcsMzg5MzYsMjExNDcsMzIyMDksMjA1MjMsMjE0MDAsMjY1MTksMjgxMDcsMjkxMzYsMjk3NDcsMzMyNTYsMzY2NTAsMzg1NjMsNDAwMjMsNDA2MDcsMjk3OTIsMjI1OTMsMjgwNTcsMzIwNDcsMzkwMDYsMjAxOTYsMjAyNzgsMjAzNjMsMjA5MTksMjExNjksMjM5OTQsMjQ2MDQsMjk2MTgsMzEwMzYsMzM0OTEsMzc0MjgsMzg1ODMsMzg2NDYsMzg2NjYsNDA1OTksNDA4MDIsMjYyNzgsMjc1MDgsMjEwMTUsMjExNTUsMjg4NzIsMzUwMTAsMjQyNjUsMjQ2NTEsMjQ5NzYsMjg0NTEsMjkwMDEsMzE4MDYsMzIyNDQsMzI4NzksMzQwMzAsMzY4OTksMzc2NzYsMjE1NzAsMzk3OTEsMjczNDcsMjg4MDksMzYwMzQsMzYzMzUsMzg3MDYsMjExNzIsMjMxMDUsMjQyNjYsMjQzMjQsMjYzOTEsMjcwMDQsMjcwMjgsMjgwMTAsMjg0MzEsMjkyODIsMjk0MzYsMzE3MjUsMzI3NjksMzI4OTQsMzQ2MzUsMzcwNzAsMjA4NDUsNDA1OTUsMzExMDgsMzI5MDcsMzc2ODIsMzU1NDIsMjA1MjUsMjE2NDQsMzU0NDEsMjc0OTgsMzYwMzYsMzMwMzEsMjQ3ODUsMjY1MjgsNDA0MzQsMjAxMjEsMjAxMjAsMzk5NTIsMzU0MzUsMzQyNDEsMzQxNTIsMjY4ODAsMjgyODYsMzA4NzEsMzMxMDksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwyNDMzMiwxOTk4NCwxOTk4OSwyMDAxMCwyMDAxNywyMDAyMiwyMDAyOCwyMDAzMSwyMDAzNCwyMDA1NCwyMDA1NiwyMDA5OCwyMDEwMSwzNTk0NywyMDEwNiwzMzI5OCwyNDMzMywyMDExMCwyMDEyNiwyMDEyNywyMDEyOCwyMDEzMCwyMDE0NCwyMDE0NywyMDE1MCwyMDE3NCwyMDE3MywyMDE2NCwyMDE2NiwyMDE2MiwyMDE4MywyMDE5MCwyMDIwNSwyMDE5MSwyMDIxNSwyMDIzMywyMDMxNCwyMDI3MiwyMDMxNSwyMDMxNywyMDMxMSwyMDI5NSwyMDM0MiwyMDM2MCwyMDM2NywyMDM3NiwyMDM0NywyMDMyOSwyMDMzNiwyMDM2OSwyMDMzNSwyMDM1OCwyMDM3NCwyMDc2MCwyMDQzNiwyMDQ0NywyMDQzMCwyMDQ0MCwyMDQ0MywyMDQzMywyMDQ0MiwyMDQzMiwyMDQ1MiwyMDQ1MywyMDUwNiwyMDUyMCwyMDUwMCwyMDUyMiwyMDUxNywyMDQ4NSwyMDI1MiwyMDQ3MCwyMDUxMywyMDUyMSwyMDUyNCwyMDQ3OCwyMDQ2MywyMDQ5NywyMDQ4NiwyMDU0NywyMDU1MSwyNjM3MSwyMDU2NSwyMDU2MCwyMDU1MiwyMDU3MCwyMDU2NiwyMDU4OCwyMDYwMCwyMDYwOCwyMDYzNCwyMDYxMywyMDY2MCwyMDY1OCwyMDY4MSwyMDY4MiwyMDY1OSwyMDY3NCwyMDY5NCwyMDcwMiwyMDcwOSwyMDcxNywyMDcwNywyMDcxOCwyMDcyOSwyMDcyNSwyMDc0NSwyMDczNywyMDczOCwyMDc1OCwyMDc1NywyMDc1NiwyMDc2MiwyMDc2OSwyMDc5NCwyMDc5MSwyMDc5NiwyMDc5NSwyMDc5OSwyMDgwMCwyMDgxOCwyMDgxMiwyMDgyMCwyMDgzNCwzMTQ4MCwyMDg0MSwyMDg0MiwyMDg0NiwyMDg2NCwyMDg2NiwyMjIzMiwyMDg3NiwyMDg3MywyMDg3OSwyMDg4MSwyMDg4MywyMDg4NSwyMDg4NiwyMDkwMCwyMDkwMiwyMDg5OCwyMDkwNSwyMDkwNiwyMDkwNywyMDkxNSwyMDkxMywyMDkxNCwyMDkxMiwyMDkxNywyMDkyNSwyMDkzMywyMDkzNywyMDk1NSwyMDk2MCwzNDM4OSwyMDk2OSwyMDk3MywyMDk3NiwyMDk4MSwyMDk5MCwyMDk5NiwyMTAwMywyMTAxMiwyMTAwNiwyMTAzMSwyMTAzNCwyMTAzOCwyMTA0MywyMTA0OSwyMTA3MSwyMTA2MCwyMTA2NywyMTA2OCwyMTA4NiwyMTA3NiwyMTA5OCwyMTEwOCwyMTA5NywyMTEwNywyMTExOSwyMTExNywyMTEzMywyMTE0MCwyMTEzOCwyMTEwNSwyMTEyOCwyMTEzNywzNjc3NiwzNjc3NSwyMTE2NCwyMTE2NSwyMTE4MCwyMTE3MywyMTE4NSwyMTE5NywyMTIwNywyMTIxNCwyMTIxOSwyMTIyMiwzOTE0OSwyMTIxNiwyMTIzNSwyMTIzNywyMTI0MCwyMTI0MSwyMTI1NCwyMTI1NiwzMDAwOCwyMTI2MSwyMTI2NCwyMTI2MywyMTI2OSwyMTI3NCwyMTI4MywyMTI5NSwyMTI5NywyMTI5OSwyMTMwNCwyMTMxMiwyMTMxOCwyMTMxNywxOTk5MSwyMTMyMSwyMTMyNSwyMDk1MCwyMTM0MiwyMTM1MywyMTM1OCwyMjgwOCwyMTM3MSwyMTM2NywyMTM3OCwyMTM5OCwyMTQwOCwyMTQxNCwyMTQxMywyMTQyMiwyMTQyNCwyMTQzMCwyMTQ0MywzMTc2MiwzODYxNywyMTQ3MSwyNjM2NCwyOTE2NiwyMTQ4NiwyMTQ4MCwyMTQ4NSwyMTQ5OCwyMTUwNSwyMTU2NSwyMTU2OCwyMTU0OCwyMTU0OSwyMTU2NCwyMTU1MCwyMTU1OCwyMTU0NSwyMTUzMywyMTU4MiwyMTY0NywyMTYyMSwyMTY0NiwyMTU5OSwyMTYxNywyMTYyMywyMTYxNiwyMTY1MCwyMTYyNywyMTYzMiwyMTYyMiwyMTYzNiwyMTY0OCwyMTYzOCwyMTcwMywyMTY2NiwyMTY4OCwyMTY2OSwyMTY3NiwyMTcwMCwyMTcwNCwyMTY3MiwyMTY3NSwyMTY5OCwyMTY2OCwyMTY5NCwyMTY5MiwyMTcyMCwyMTczMywyMTczNCwyMTc3NSwyMTc4MCwyMTc1NywyMTc0MiwyMTc0MSwyMTc1NCwyMTczMCwyMTgxNywyMTgyNCwyMTg1OSwyMTgzNiwyMTgwNiwyMTg1MiwyMTgyOSwyMTg0NiwyMTg0NywyMTgxNiwyMTgxMSwyMTg1MywyMTkxMywyMTg4OCwyMTY3OSwyMTg5OCwyMTkxOSwyMTg4MywyMTg4NiwyMTkxMiwyMTkxOCwyMTkzNCwyMTg4NCwyMTg5MSwyMTkyOSwyMTg5NSwyMTkyOCwyMTk3OCwyMTk1NywyMTk4MywyMTk1NiwyMTk4MCwyMTk4OCwyMTk3MiwyMjAzNiwyMjAwNywyMjAzOCwyMjAxNCwyMjAxMywyMjA0MywyMjAwOSwyMjA5NCwyMjA5NiwyOTE1MSwyMjA2OCwyMjA3MCwyMjA2NiwyMjA3MiwyMjEyMywyMjExNiwyMjA2MywyMjEyNCwyMjEyMiwyMjE1MCwyMjE0NCwyMjE1NCwyMjE3NiwyMjE2NCwyMjE1OSwyMjE4MSwyMjE5MCwyMjE5OCwyMjE5NiwyMjIxMCwyMjIwNCwyMjIwOSwyMjIxMSwyMjIwOCwyMjIxNiwyMjIyMiwyMjIyNSwyMjIyNywyMjIzMSwyMjI1NCwyMjI2NSwyMjI3MiwyMjI3MSwyMjI3NiwyMjI4MSwyMjI4MCwyMjI4MywyMjI4NSwyMjI5MSwyMjI5NiwyMjI5NCwyMTk1OSwyMjMwMCwyMjMxMCwyMjMyNywyMjMyOCwyMjM1MCwyMjMzMSwyMjMzNiwyMjM1MSwyMjM3NywyMjQ2NCwyMjQwOCwyMjM2OSwyMjM5OSwyMjQwOSwyMjQxOSwyMjQzMiwyMjQ1MSwyMjQzNiwyMjQ0MiwyMjQ0OCwyMjQ2NywyMjQ3MCwyMjQ4NCwyMjQ4MiwyMjQ4MywyMjUzOCwyMjQ4NiwyMjQ5OSwyMjUzOSwyMjU1MywyMjU1NywyMjY0MiwyMjU2MSwyMjYyNiwyMjYwMywyMjY0MCwyNzU4NCwyMjYxMCwyMjU4OSwyMjY0OSwyMjY2MSwyMjcxMywyMjY4NywyMjY5OSwyMjcxNCwyMjc1MCwyMjcxNSwyMjcxMiwyMjcwMiwyMjcyNSwyMjczOSwyMjczNywyMjc0MywyMjc0NSwyMjc0NCwyMjc1NywyMjc0OCwyMjc1NiwyMjc1MSwyMjc2NywyMjc3OCwyMjc3NywyMjc3OSwyMjc4MCwyMjc4MSwyMjc4NiwyMjc5NCwyMjgwMCwyMjgxMSwyNjc5MCwyMjgyMSwyMjgyOCwyMjgyOSwyMjgzNCwyMjg0MCwyMjg0NiwzMTQ0MiwyMjg2OSwyMjg2NCwyMjg2MiwyMjg3NCwyMjg3MiwyMjg4MiwyMjg4MCwyMjg4NywyMjg5MiwyMjg4OSwyMjkwNCwyMjkxMywyMjk0MSwyMDMxOCwyMDM5NSwyMjk0NywyMjk2MiwyMjk4MiwyMzAxNiwyMzAwNCwyMjkyNSwyMzAwMSwyMzAwMiwyMzA3NywyMzA3MSwyMzA1NywyMzA2OCwyMzA0OSwyMzA2NiwyMzEwNCwyMzE0OCwyMzExMywyMzA5MywyMzA5NCwyMzEzOCwyMzE0NiwyMzE5NCwyMzIyOCwyMzIzMCwyMzI0MywyMzIzNCwyMzIyOSwyMzI2NywyMzI1NSwyMzI3MCwyMzI3MywyMzI1NCwyMzI5MCwyMzI5MSwyMzMwOCwyMzMwNywyMzMxOCwyMzM0NiwyMzI0OCwyMzMzOCwyMzM1MCwyMzM1OCwyMzM2MywyMzM2NSwyMzM2MCwyMzM3NywyMzM4MSwyMzM4NiwyMzM4NywyMzM5NywyMzQwMSwyMzQwOCwyMzQxMSwyMzQxMywyMzQxNiwyNTk5MiwyMzQxOCwyMzQyNCwyMzQyNywyMzQ2MiwyMzQ4MCwyMzQ5MSwyMzQ5NSwyMzQ5NywyMzUwOCwyMzUwNCwyMzUyNCwyMzUyNiwyMzUyMiwyMzUxOCwyMzUyNSwyMzUzMSwyMzUzNiwyMzU0MiwyMzUzOSwyMzU1NywyMzU1OSwyMzU2MCwyMzU2NSwyMzU3MSwyMzU4NCwyMzU4NiwyMzU5MiwyMzYwOCwyMzYwOSwyMzYxNywyMzYyMiwyMzYzMCwyMzYzNSwyMzYzMiwyMzYzMSwyMzQwOSwyMzY2MCwyMzY2MiwyMDA2NiwyMzY3MCwyMzY3MywyMzY5MiwyMzY5NywyMzcwMCwyMjkzOSwyMzcyMywyMzczOSwyMzczNCwyMzc0MCwyMzczNSwyMzc0OSwyMzc0MiwyMzc1MSwyMzc2OSwyMzc4NSwyMzgwNSwyMzgwMiwyMzc4OSwyMzk0OCwyMzc4NiwyMzgxOSwyMzgyOSwyMzgzMSwyMzkwMCwyMzgzOSwyMzgzNSwyMzgyNSwyMzgyOCwyMzg0MiwyMzgzNCwyMzgzMywyMzgzMiwyMzg4NCwyMzg5MCwyMzg4NiwyMzg4MywyMzkxNiwyMzkyMywyMzkyNiwyMzk0MywyMzk0MCwyMzkzOCwyMzk3MCwyMzk2NSwyMzk4MCwyMzk4MiwyMzk5NywyMzk1MiwyMzk5MSwyMzk5NiwyNDAwOSwyNDAxMywyNDAxOSwyNDAxOCwyNDAyMiwyNDAyNywyNDA0MywyNDA1MCwyNDA1MywyNDA3NSwyNDA5MCwyNDA4OSwyNDA4MSwyNDA5MSwyNDExOCwyNDExOSwyNDEzMiwyNDEzMSwyNDEyOCwyNDE0MiwyNDE1MSwyNDE0OCwyNDE1OSwyNDE2MiwyNDE2NCwyNDEzNSwyNDE4MSwyNDE4MiwyNDE4Niw0MDYzNiwyNDE5MSwyNDIyNCwyNDI1NywyNDI1OCwyNDI2NCwyNDI3MiwyNDI3MSwyNDI3OCwyNDI5MSwyNDI4NSwyNDI4MiwyNDI4MywyNDI5MCwyNDI4OSwyNDI5NiwyNDI5NywyNDMwMCwyNDMwNSwyNDMwNywyNDMwNCwyNDMwOCwyNDMxMiwyNDMxOCwyNDMyMywyNDMyOSwyNDQxMywyNDQxMiwyNDMzMSwyNDMzNywyNDM0MiwyNDM2MSwyNDM2NSwyNDM3NiwyNDM4NSwyNDM5MiwyNDM5NiwyNDM5OCwyNDM2NywyNDQwMSwyNDQwNiwyNDQwNywyNDQwOSwyNDQxNywyNDQyOSwyNDQzNSwyNDQzOSwyNDQ1MSwyNDQ1MCwyNDQ0NywyNDQ1OCwyNDQ1NiwyNDQ2NSwyNDQ1NSwyNDQ3OCwyNDQ3MywyNDQ3MiwyNDQ4MCwyNDQ4OCwyNDQ5MywyNDUwOCwyNDUzNCwyNDU3MSwyNDU0OCwyNDU2OCwyNDU2MSwyNDU0MSwyNDc1NSwyNDU3NSwyNDYwOSwyNDY3MiwyNDYwMSwyNDU5MiwyNDYxNywyNDU5MCwyNDYyNSwyNDYwMywyNDU5NywyNDYxOSwyNDYxNCwyNDU5MSwyNDYzNCwyNDY2NiwyNDY0MSwyNDY4MiwyNDY5NSwyNDY3MSwyNDY1MCwyNDY0NiwyNDY1MywyNDY3NSwyNDY0MywyNDY3NiwyNDY0MiwyNDY4NCwyNDY4MywyNDY2NSwyNDcwNSwyNDcxNywyNDgwNywyNDcwNywyNDczMCwyNDcwOCwyNDczMSwyNDcyNiwyNDcyNywyNDcyMiwyNDc0MywyNDcxNSwyNDgwMSwyNDc2MCwyNDgwMCwyNDc4NywyNDc1NiwyNDU2MCwyNDc2NSwyNDc3NCwyNDc1NywyNDc5MiwyNDkwOSwyNDg1MywyNDgzOCwyNDgyMiwyNDgyMywyNDgzMiwyNDgyMCwyNDgyNiwyNDgzNSwyNDg2NSwyNDgyNywyNDgxNywyNDg0NSwyNDg0NiwyNDkwMywyNDg5NCwyNDg3MiwyNDg3MSwyNDkwNiwyNDg5NSwyNDg5MiwyNDg3NiwyNDg4NCwyNDg5MywyNDg5OCwyNDkwMCwyNDk0NywyNDk1MSwyNDkyMCwyNDkyMSwyNDkyMiwyNDkzOSwyNDk0OCwyNDk0MywyNDkzMywyNDk0NSwyNDkyNywyNDkyNSwyNDkxNSwyNDk0OSwyNDk4NSwyNDk4MiwyNDk2NywyNTAwNCwyNDk4MCwyNDk4NiwyNDk3MCwyNDk3NywyNTAwMywyNTAwNiwyNTAzNiwyNTAzNCwyNTAzMywyNTA3OSwyNTAzMiwyNTAyNywyNTAzMCwyNTAxOCwyNTAzNSwzMjYzMywyNTAzNywyNTA2MiwyNTA1OSwyNTA3OCwyNTA4MiwyNTA3NiwyNTA4NywyNTA4NSwyNTA4NCwyNTA4NiwyNTA4OCwyNTA5NiwyNTA5NywyNTEwMSwyNTEwMCwyNTEwOCwyNTExNSwyNTExOCwyNTEyMSwyNTEzMCwyNTEzNCwyNTEzNiwyNTEzOCwyNTEzOSwyNTE1MywyNTE2NiwyNTE4MiwyNTE4NywyNTE3OSwyNTE4NCwyNTE5MiwyNTIxMiwyNTIxOCwyNTIyNSwyNTIxNCwyNTIzNCwyNTIzNSwyNTIzOCwyNTMwMCwyNTIxOSwyNTIzNiwyNTMwMywyNTI5NywyNTI3NSwyNTI5NSwyNTM0MywyNTI4NiwyNTgxMiwyNTI4OCwyNTMwOCwyNTI5MiwyNTI5MCwyNTI4MiwyNTI4NywyNTI0MywyNTI4OSwyNTM1NiwyNTMyNiwyNTMyOSwyNTM4MywyNTM0NiwyNTM1MiwyNTMyNywyNTMzMywyNTQyNCwyNTQwNiwyNTQyMSwyNTYyOCwyNTQyMywyNTQ5NCwyNTQ4NiwyNTQ3MiwyNTUxNSwyNTQ2MiwyNTUwNywyNTQ4NywyNTQ4MSwyNTUwMywyNTUyNSwyNTQ1MSwyNTQ0OSwyNTUzNCwyNTU3NywyNTUzNiwyNTU0MiwyNTU3MSwyNTU0NSwyNTU1NCwyNTU5MCwyNTU0MCwyNTYyMiwyNTY1MiwyNTYwNiwyNTYxOSwyNTYzOCwyNTY1NCwyNTg4NSwyNTYyMywyNTY0MCwyNTYxNSwyNTcwMywyNTcxMSwyNTcxOCwyNTY3OCwyNTg5OCwyNTc0OSwyNTc0NywyNTc2NSwyNTc2OSwyNTczNiwyNTc4OCwyNTgxOCwyNTgxMCwyNTc5NywyNTc5OSwyNTc4NywyNTgxNiwyNTc5NCwyNTg0MSwyNTgzMSwzMzI4OSwyNTgyNCwyNTgyNSwyNTI2MCwyNTgyNywyNTgzOSwyNTkwMCwyNTg0NiwyNTg0NCwyNTg0MiwyNTg1MCwyNTg1NiwyNTg1MywyNTg4MCwyNTg4NCwyNTg2MSwyNTg5MiwyNTg5MSwyNTg5OSwyNTkwOCwyNTkwOSwyNTkxMSwyNTkxMCwyNTkxMiwzMDAyNywyNTkyOCwyNTk0MiwyNTk0MSwyNTkzMywyNTk0NCwyNTk1MCwyNTk0OSwyNTk3MCwyNTk3NiwyNTk4NiwyNTk4NywzNTcyMiwyNjAxMSwyNjAxNSwyNjAyNywyNjAzOSwyNjA1MSwyNjA1NCwyNjA0OSwyNjA1MiwyNjA2MCwyNjA2NiwyNjA3NSwyNjA3MywyNjA4MCwyNjA4MSwyNjA5NywyNjQ4MiwyNjEyMiwyNjExNSwyNjEwNywyNjQ4MywyNjE2NSwyNjE2NiwyNjE2NCwyNjE0MCwyNjE5MSwyNjE4MCwyNjE4NSwyNjE3NywyNjIwNiwyNjIwNSwyNjIxMiwyNjIxNSwyNjIxNiwyNjIwNywyNjIxMCwyNjIyNCwyNjI0MywyNjI0OCwyNjI1NCwyNjI0OSwyNjI0NCwyNjI2NCwyNjI2OSwyNjMwNSwyNjI5NywyNjMxMywyNjMwMiwyNjMwMCwyNjMwOCwyNjI5NiwyNjMyNiwyNjMzMCwyNjMzNiwyNjE3NSwyNjM0MiwyNjM0NSwyNjM1MiwyNjM1NywyNjM1OSwyNjM4MywyNjM5MCwyNjM5OCwyNjQwNiwyNjQwNywzODcxMiwyNjQxNCwyNjQzMSwyNjQyMiwyNjQzMywyNjQyNCwyNjQyMywyNjQzOCwyNjQ2MiwyNjQ2NCwyNjQ1NywyNjQ2NywyNjQ2OCwyNjUwNSwyNjQ4MCwyNjUzNywyNjQ5MiwyNjQ3NCwyNjUwOCwyNjUwNywyNjUzNCwyNjUyOSwyNjUwMSwyNjU1MSwyNjYwNywyNjU0OCwyNjYwNCwyNjU0NywyNjYwMSwyNjU1MiwyNjU5NiwyNjU5MCwyNjU4OSwyNjU5NCwyNjYwNiwyNjU1MywyNjU3NCwyNjU2NiwyNjU5OSwyNzI5MiwyNjY1NCwyNjY5NCwyNjY2NSwyNjY4OCwyNjcwMSwyNjY3NCwyNjcwMiwyNjgwMywyNjY2NywyNjcxMywyNjcyMywyNjc0MywyNjc1MSwyNjc4MywyNjc2NywyNjc5NywyNjc3MiwyNjc4MSwyNjc3OSwyNjc1NSwyNzMxMCwyNjgwOSwyNjc0MCwyNjgwNSwyNjc4NCwyNjgxMCwyNjg5NSwyNjc2NSwyNjc1MCwyNjg4MSwyNjgyNiwyNjg4OCwyNjg0MCwyNjkxNCwyNjkxOCwyNjg0OSwyNjg5MiwyNjgyOSwyNjgzNiwyNjg1NSwyNjgzNywyNjkzNCwyNjg5OCwyNjg4NCwyNjgzOSwyNjg1MSwyNjkxNywyNjg3MywyNjg0OCwyNjg2MywyNjkyMCwyNjkyMiwyNjkwNiwyNjkxNSwyNjkxMywyNjgyMiwyNzAwMSwyNjk5OSwyNjk3MiwyNzAwMCwyNjk4NywyNjk2NCwyNzAwNiwyNjk5MCwyNjkzNywyNjk5NiwyNjk0MSwyNjk2OSwyNjkyOCwyNjk3NywyNjk3NCwyNjk3MywyNzAwOSwyNjk4NiwyNzA1OCwyNzA1NCwyNzA4OCwyNzA3MSwyNzA3MywyNzA5MSwyNzA3MCwyNzA4NiwyMzUyOCwyNzA4MiwyNzEwMSwyNzA2NywyNzA3NSwyNzA0NywyNzE4MiwyNzAyNSwyNzA0MCwyNzAzNiwyNzAyOSwyNzA2MCwyNzEwMiwyNzExMiwyNzEzOCwyNzE2MywyNzEzNSwyNzQwMiwyNzEyOSwyNzEyMiwyNzExMSwyNzE0MSwyNzA1NywyNzE2NiwyNzExNywyNzE1NiwyNzExNSwyNzE0NiwyNzE1NCwyNzMyOSwyNzE3MSwyNzE1NSwyNzIwNCwyNzE0OCwyNzI1MCwyNzE5MCwyNzI1NiwyNzIwNywyNzIzNCwyNzIyNSwyNzIzOCwyNzIwOCwyNzE5MiwyNzE3MCwyNzI4MCwyNzI3NywyNzI5NiwyNzI2OCwyNzI5OCwyNzI5OSwyNzI4NywzNDMyNywyNzMyMywyNzMzMSwyNzMzMCwyNzMyMCwyNzMxNSwyNzMwOCwyNzM1OCwyNzM0NSwyNzM1OSwyNzMwNiwyNzM1NCwyNzM3MCwyNzM4NywyNzM5NywzNDMyNiwyNzM4NiwyNzQxMCwyNzQxNCwzOTcyOSwyNzQyMywyNzQ0OCwyNzQ0NywzMDQyOCwyNzQ0OSwzOTE1MCwyNzQ2MywyNzQ1OSwyNzQ2NSwyNzQ3MiwyNzQ4MSwyNzQ3NiwyNzQ4MywyNzQ4NywyNzQ4OSwyNzUxMiwyNzUxMywyNzUxOSwyNzUyMCwyNzUyNCwyNzUyMywyNzUzMywyNzU0NCwyNzU0MSwyNzU1MCwyNzU1NiwyNzU2MiwyNzU2MywyNzU2NywyNzU3MCwyNzU2OSwyNzU3MSwyNzU3NSwyNzU4MCwyNzU5MCwyNzU5NSwyNzYwMywyNzYxNSwyNzYyOCwyNzYyNywyNzYzNSwyNzYzMSw0MDYzOCwyNzY1NiwyNzY2NywyNzY2OCwyNzY3NSwyNzY4NCwyNzY4MywyNzc0MiwyNzczMywyNzc0NiwyNzc1NCwyNzc3OCwyNzc4OSwyNzgwMiwyNzc3NywyNzgwMywyNzc3NCwyNzc1MiwyNzc2MywyNzc5NCwyNzc5MiwyNzg0NCwyNzg4OSwyNzg1OSwyNzgzNywyNzg2MywyNzg0NSwyNzg2OSwyNzgyMiwyNzgyNSwyNzgzOCwyNzgzNCwyNzg2NywyNzg4NywyNzg2NSwyNzg4MiwyNzkzNSwzNDg5MywyNzk1OCwyNzk0NywyNzk2NSwyNzk2MCwyNzkyOSwyNzk1NywyNzk1NSwyNzkyMiwyNzkxNiwyODAwMywyODA1MSwyODAwNCwyNzk5NCwyODAyNSwyNzk5MywyODA0NiwyODA1MywyODY0NCwyODAzNywyODE1MywyODE4MSwyODE3MCwyODA4NSwyODEwMywyODEzNCwyODA4OCwyODEwMiwyODE0MCwyODEyNiwyODEwOCwyODEzNiwyODExNCwyODEwMSwyODE1NCwyODEyMSwyODEzMiwyODExNywyODEzOCwyODE0MiwyODIwNSwyODI3MCwyODIwNiwyODE4NSwyODI3NCwyODI1NSwyODIyMiwyODE5NSwyODI2NywyODIwMywyODI3OCwyODIzNywyODE5MSwyODIyNywyODIxOCwyODIzOCwyODE5NiwyODQxNSwyODE4OSwyODIxNiwyODI5MCwyODMzMCwyODMxMiwyODM2MSwyODM0MywyODM3MSwyODM0OSwyODMzNSwyODM1NiwyODMzOCwyODM3MiwyODM3MywyODMwMywyODMyNSwyODM1NCwyODMxOSwyODQ4MSwyODQzMywyODc0OCwyODM5NiwyODQwOCwyODQxNCwyODQ3OSwyODQwMiwyODQ2NSwyODM5OSwyODQ2NiwyODM2NCwyODQ3OCwyODQzNSwyODQwNywyODU1MCwyODUzOCwyODUzNiwyODU0NSwyODU0NCwyODUyNywyODUwNywyODY1OSwyODUyNSwyODU0NiwyODU0MCwyODUwNCwyODU1OCwyODU2MSwyODYxMCwyODUxOCwyODU5NSwyODU3OSwyODU3NywyODU4MCwyODYwMSwyODYxNCwyODU4NiwyODYzOSwyODYyOSwyODY1MiwyODYyOCwyODYzMiwyODY1NywyODY1NCwyODYzNSwyODY4MSwyODY4MywyODY2NiwyODY4OSwyODY3MywyODY4NywyODY3MCwyODY5OSwyODY5OCwyODUzMiwyODcwMSwyODY5NiwyODcwMywyODcyMCwyODczNCwyODcyMiwyODc1MywyODc3MSwyODgyNSwyODgxOCwyODg0NywyODkxMywyODg0NCwyODg1NiwyODg1MSwyODg0NiwyODg5NSwyODg3NSwyODg5MywyODg4OSwyODkzNywyODkyNSwyODk1NiwyODk1MywyOTAyOSwyOTAxMywyOTA2NCwyOTAzMCwyOTAyNiwyOTAwNCwyOTAxNCwyOTAzNiwyOTA3MSwyOTE3OSwyOTA2MCwyOTA3NywyOTA5NiwyOTEwMCwyOTE0MywyOTExMywyOTExOCwyOTEzOCwyOTEyOSwyOTE0MCwyOTEzNCwyOTE1MiwyOTE2NCwyOTE1OSwyOTE3MywyOTE4MCwyOTE3NywyOTE4MywyOTE5NywyOTIwMCwyOTIxMSwyOTIyNCwyOTIyOSwyOTIyOCwyOTIzMiwyOTIzNCwyOTI0MywyOTI0NCwyOTI0NywyOTI0OCwyOTI1NCwyOTI1OSwyOTI3MiwyOTMwMCwyOTMxMCwyOTMxNCwyOTMxMywyOTMxOSwyOTMzMCwyOTMzNCwyOTM0NiwyOTM1MSwyOTM2OSwyOTM2MiwyOTM3OSwyOTM4MiwyOTM4MCwyOTM5MCwyOTM5NCwyOTQxMCwyOTQwOCwyOTQwOSwyOTQzMywyOTQzMSwyMDQ5NSwyOTQ2MywyOTQ1MCwyOTQ2OCwyOTQ2MiwyOTQ2OSwyOTQ5MiwyOTQ4NywyOTQ4MSwyOTQ3NywyOTUwMiwyOTUxOCwyOTUxOSw0MDY2NCwyOTUyNywyOTU0NiwyOTU0NCwyOTU1MiwyOTU2MCwyOTU1NywyOTU2MywyOTU2MiwyOTY0MCwyOTYxOSwyOTY0NiwyOTYyNywyOTYzMiwyOTY2OSwyOTY3OCwyOTY2MiwyOTg1OCwyOTcwMSwyOTgwNywyOTczMywyOTY4OCwyOTc0NiwyOTc1NCwyOTc4MSwyOTc1OSwyOTc5MSwyOTc4NSwyOTc2MSwyOTc4OCwyOTgwMSwyOTgwOCwyOTc5NSwyOTgwMiwyOTgxNCwyOTgyMiwyOTgzNSwyOTg1NCwyOTg2MywyOTg5OCwyOTkwMywyOTkwOCwyOTY4MSwyOTkyMCwyOTkyMywyOTkyNywyOTkyOSwyOTkzNCwyOTkzOCwyOTkzNiwyOTkzNywyOTk0NCwyOTk0MywyOTk1NiwyOTk1NSwyOTk1NywyOTk2NCwyOTk2NiwyOTk2NSwyOTk3MywyOTk3MSwyOTk4MiwyOTk5MCwyOTk5NiwzMDAxMiwzMDAyMCwzMDAyOSwzMDAyNiwzMDAyNSwzMDA0MywzMDAyMiwzMDA0MiwzMDA1NywzMDA1MiwzMDA1NSwzMDA1OSwzMDA2MSwzMDA3MiwzMDA3MCwzMDA4NiwzMDA4NywzMDA2OCwzMDA5MCwzMDA4OSwzMDA4MiwzMDEwMCwzMDEwNiwzMDEwOSwzMDExNywzMDExNSwzMDE0NiwzMDEzMSwzMDE0NywzMDEzMywzMDE0MSwzMDEzNiwzMDE0MCwzMDEyOSwzMDE1NywzMDE1NCwzMDE2MiwzMDE2OSwzMDE3OSwzMDE3NCwzMDIwNiwzMDIwNywzMDIwNCwzMDIwOSwzMDE5MiwzMDIwMiwzMDE5NCwzMDE5NSwzMDIxOSwzMDIyMSwzMDIxNywzMDIzOSwzMDI0NywzMDI0MCwzMDI0MSwzMDI0MiwzMDI0NCwzMDI2MCwzMDI1NiwzMDI2NywzMDI3OSwzMDI4MCwzMDI3OCwzMDMwMCwzMDI5NiwzMDMwNSwzMDMwNiwzMDMxMiwzMDMxMywzMDMxNCwzMDMxMSwzMDMxNiwzMDMyMCwzMDMyMiwzMDMyNiwzMDMyOCwzMDMzMiwzMDMzNiwzMDMzOSwzMDM0NCwzMDM0NywzMDM1MCwzMDM1OCwzMDM1NSwzMDM2MSwzMDM2MiwzMDM4NCwzMDM4OCwzMDM5MiwzMDM5MywzMDM5NCwzMDQwMiwzMDQxMywzMDQyMiwzMDQxOCwzMDQzMCwzMDQzMywzMDQzNywzMDQzOSwzMDQ0MiwzNDM1MSwzMDQ1OSwzMDQ3MiwzMDQ3MSwzMDQ2OCwzMDUwNSwzMDUwMCwzMDQ5NCwzMDUwMSwzMDUwMiwzMDQ5MSwzMDUxOSwzMDUyMCwzMDUzNSwzMDU1NCwzMDU2OCwzMDU3MSwzMDU1NSwzMDU2NSwzMDU5MSwzMDU5MCwzMDU4NSwzMDYwNiwzMDYwMywzMDYwOSwzMDYyNCwzMDYyMiwzMDY0MCwzMDY0NiwzMDY0OSwzMDY1NSwzMDY1MiwzMDY1MywzMDY1MSwzMDY2MywzMDY2OSwzMDY3OSwzMDY4MiwzMDY4NCwzMDY5MSwzMDcwMiwzMDcxNiwzMDczMiwzMDczOCwzMTAxNCwzMDc1MiwzMTAxOCwzMDc4OSwzMDg2MiwzMDgzNiwzMDg1NCwzMDg0NCwzMDg3NCwzMDg2MCwzMDg4MywzMDkwMSwzMDg5MCwzMDg5NSwzMDkyOSwzMDkxOCwzMDkyMywzMDkzMiwzMDkxMCwzMDkwOCwzMDkxNywzMDkyMiwzMDk1NiwzMDk1MSwzMDkzOCwzMDk3MywzMDk2NCwzMDk4MywzMDk5NCwzMDk5MywzMTAwMSwzMTAyMCwzMTAxOSwzMTA0MCwzMTA3MiwzMTA2MywzMTA3MSwzMTA2NiwzMTA2MSwzMTA1OSwzMTA5OCwzMTEwMywzMTExNCwzMTEzMywzMTE0Myw0MDc3OSwzMTE0NiwzMTE1MCwzMTE1NSwzMTE2MSwzMTE2MiwzMTE3NywzMTE4OSwzMTIwNywzMTIxMiwzMTIwMSwzMTIwMywzMTI0MCwzMTI0NSwzMTI1NiwzMTI1NywzMTI2NCwzMTI2MywzMTEwNCwzMTI4MSwzMTI5MSwzMTI5NCwzMTI4NywzMTI5OSwzMTMxOSwzMTMwNSwzMTMyOSwzMTMzMCwzMTMzNyw0MDg2MSwzMTM0NCwzMTM1MywzMTM1NywzMTM2OCwzMTM4MywzMTM4MSwzMTM4NCwzMTM4MiwzMTQwMSwzMTQzMiwzMTQwOCwzMTQxNCwzMTQyOSwzMTQyOCwzMTQyMywzNjk5NSwzMTQzMSwzMTQzNCwzMTQzNywzMTQzOSwzMTQ0NSwzMTQ0MywzMTQ0OSwzMTQ1MCwzMTQ1MywzMTQ1NywzMTQ1OCwzMTQ2MiwzMTQ2OSwzMTQ3MiwzMTQ5MCwzMTUwMywzMTQ5OCwzMTQ5NCwzMTUzOSwzMTUxMiwzMTUxMywzMTUxOCwzMTU0MSwzMTUyOCwzMTU0MiwzMTU2OCwzMTYxMCwzMTQ5MiwzMTU2NSwzMTQ5OSwzMTU2NCwzMTU1NywzMTYwNSwzMTU4OSwzMTYwNCwzMTU5MSwzMTYwMCwzMTYwMSwzMTU5NiwzMTU5OCwzMTY0NSwzMTY0MCwzMTY0NywzMTYyOSwzMTY0NCwzMTY0MiwzMTYyNywzMTYzNCwzMTYzMSwzMTU4MSwzMTY0MSwzMTY5MSwzMTY4MSwzMTY5MiwzMTY5NSwzMTY2OCwzMTY4NiwzMTcwOSwzMTcyMSwzMTc2MSwzMTc2NCwzMTcxOCwzMTcxNywzMTg0MCwzMTc0NCwzMTc1MSwzMTc2MywzMTczMSwzMTczNSwzMTc2NywzMTc1NywzMTczNCwzMTc3OSwzMTc4MywzMTc4NiwzMTc3NSwzMTc5OSwzMTc4NywzMTgwNSwzMTgyMCwzMTgxMSwzMTgyOCwzMTgyMywzMTgwOCwzMTgyNCwzMTgzMiwzMTgzOSwzMTg0NCwzMTgzMCwzMTg0NSwzMTg1MiwzMTg2MSwzMTg3NSwzMTg4OCwzMTkwOCwzMTkxNywzMTkwNiwzMTkxNSwzMTkwNSwzMTkxMiwzMTkyMywzMTkyMiwzMTkyMSwzMTkxOCwzMTkyOSwzMTkzMywzMTkzNiwzMTk0MSwzMTkzOCwzMTk2MCwzMTk1NCwzMTk2NCwzMTk3MCwzOTczOSwzMTk4MywzMTk4NiwzMTk4OCwzMTk5MCwzMTk5NCwzMjAwNiwzMjAwMiwzMjAyOCwzMjAyMSwzMjAxMCwzMjA2OSwzMjA3NSwzMjA0NiwzMjA1MCwzMjA2MywzMjA1MywzMjA3MCwzMjExNSwzMjA4NiwzMjA3OCwzMjExNCwzMjEwNCwzMjExMCwzMjA3OSwzMjA5OSwzMjE0NywzMjEzNywzMjA5MSwzMjE0MywzMjEyNSwzMjE1NSwzMjE4NiwzMjE3NCwzMjE2MywzMjE4MSwzMjE5OSwzMjE4OSwzMjE3MSwzMjMxNywzMjE2MiwzMjE3NSwzMjIyMCwzMjE4NCwzMjE1OSwzMjE3NiwzMjIxNiwzMjIyMSwzMjIyOCwzMjIyMiwzMjI1MSwzMjI0MiwzMjIyNSwzMjI2MSwzMjI2NiwzMjI5MSwzMjI4OSwzMjI3NCwzMjMwNSwzMjI4NywzMjI2NSwzMjI2NywzMjI5MCwzMjMyNiwzMjM1OCwzMjMxNSwzMjMwOSwzMjMxMywzMjMyMywzMjMxMSwzMjMwNiwzMjMxNCwzMjM1OSwzMjM0OSwzMjM0MiwzMjM1MCwzMjM0NSwzMjM0NiwzMjM3NywzMjM2MiwzMjM2MSwzMjM4MCwzMjM3OSwzMjM4NywzMjIxMywzMjM4MSwzNjc4MiwzMjM4MywzMjM5MiwzMjM5MywzMjM5NiwzMjQwMiwzMjQwMCwzMjQwMywzMjQwNCwzMjQwNiwzMjM5OCwzMjQxMSwzMjQxMiwzMjU2OCwzMjU3MCwzMjU4MSwzMjU4OCwzMjU4OSwzMjU5MCwzMjU5MiwzMjU5MywzMjU5NywzMjU5NiwzMjYwMCwzMjYwNywzMjYwOCwzMjYxNiwzMjYxNywzMjYxNSwzMjYzMiwzMjY0MiwzMjY0NiwzMjY0MywzMjY0OCwzMjY0NywzMjY1MiwzMjY2MCwzMjY3MCwzMjY2OSwzMjY2NiwzMjY3NSwzMjY4NywzMjY5MCwzMjY5NywzMjY4NiwzMjY5NCwzMjY5NiwzNTY5NywzMjcwOSwzMjcxMCwzMjcxNCwzMjcyNSwzMjcyNCwzMjczNywzMjc0MiwzMjc0NSwzMjc1NSwzMjc2MSwzOTEzMiwzMjc3NCwzMjc3MiwzMjc3OSwzMjc4NiwzMjc5MiwzMjc5MywzMjc5NiwzMjgwMSwzMjgwOCwzMjgzMSwzMjgyNywzMjg0MiwzMjgzOCwzMjg1MCwzMjg1NiwzMjg1OCwzMjg2MywzMjg2NiwzMjg3MiwzMjg4MywzMjg4MiwzMjg4MCwzMjg4NiwzMjg4OSwzMjg5MywzMjg5NSwzMjkwMCwzMjkwMiwzMjkwMSwzMjkyMywzMjkxNSwzMjkyMiwzMjk0MSwyMDg4MCwzMjk0MCwzMjk4NywzMjk5NywzMjk4NSwzMjk4OSwzMjk2NCwzMjk4NiwzMjk4MiwzMzAzMywzMzAwNywzMzAwOSwzMzA1MSwzMzA2NSwzMzA1OSwzMzA3MSwzMzA5OSwzODUzOSwzMzA5NCwzMzA4NiwzMzEwNywzMzEwNSwzMzAyMCwzMzEzNywzMzEzNCwzMzEyNSwzMzEyNiwzMzE0MCwzMzE1NSwzMzE2MCwzMzE2MiwzMzE1MiwzMzE1NCwzMzE4NCwzMzE3MywzMzE4OCwzMzE4NywzMzExOSwzMzE3MSwzMzE5MywzMzIwMCwzMzIwNSwzMzIxNCwzMzIwOCwzMzIxMywzMzIxNiwzMzIxOCwzMzIxMCwzMzIyNSwzMzIyOSwzMzIzMywzMzI0MSwzMzI0MCwzMzIyNCwzMzI0MiwzMzI0NywzMzI0OCwzMzI1NSwzMzI3NCwzMzI3NSwzMzI3OCwzMzI4MSwzMzI4MiwzMzI4NSwzMzI4NywzMzI5MCwzMzI5MywzMzI5NiwzMzMwMiwzMzMyMSwzMzMyMywzMzMzNiwzMzMzMSwzMzM0NCwzMzM2OSwzMzM2OCwzMzM3MywzMzM3MCwzMzM3NSwzMzM4MCwzMzM3OCwzMzM4NCwzMzM4NiwzMzM4NywzMzMyNiwzMzM5MywzMzM5OSwzMzQwMCwzMzQwNiwzMzQyMSwzMzQyNiwzMzQ1MSwzMzQzOSwzMzQ2NywzMzQ1MiwzMzUwNSwzMzUwNywzMzUwMywzMzQ5MCwzMzUyNCwzMzUyMywzMzUzMCwzMzY4MywzMzUzOSwzMzUzMSwzMzUyOSwzMzUwMiwzMzU0MiwzMzUwMCwzMzU0NSwzMzQ5NywzMzU4OSwzMzU4OCwzMzU1OCwzMzU4NiwzMzU4NSwzMzYwMCwzMzU5MywzMzYxNiwzMzYwNSwzMzU4MywzMzU3OSwzMzU1OSwzMzU2MCwzMzY2OSwzMzY5MCwzMzcwNiwzMzY5NSwzMzY5OCwzMzY4NiwzMzU3MSwzMzY3OCwzMzY3MSwzMzY3NCwzMzY2MCwzMzcxNywzMzY1MSwzMzY1MywzMzY5NiwzMzY3MywzMzcwNCwzMzc4MCwzMzgxMSwzMzc3MSwzMzc0MiwzMzc4OSwzMzc5NSwzMzc1MiwzMzgwMywzMzcyOSwzMzc4MywzMzc5OSwzMzc2MCwzMzc3OCwzMzgwNSwzMzgyNiwzMzgyNCwzMzcyNSwzMzg0OCwzNDA1NCwzMzc4NywzMzkwMSwzMzgzNCwzMzg1MiwzNDEzOCwzMzkyNCwzMzkxMSwzMzg5OSwzMzk2NSwzMzkwMiwzMzkyMiwzMzg5NywzMzg2MiwzMzgzNiwzMzkwMywzMzkxMywzMzg0NSwzMzk5NCwzMzg5MCwzMzk3NywzMzk4MywzMzk1MSwzNDAwOSwzMzk5NywzMzk3OSwzNDAxMCwzNDAwMCwzMzk4NSwzMzk5MCwzNDAwNiwzMzk1MywzNDA4MSwzNDA0NywzNDAzNiwzNDA3MSwzNDA3MiwzNDA5MiwzNDA3OSwzNDA2OSwzNDA2OCwzNDA0NCwzNDExMiwzNDE0NywzNDEzNiwzNDEyMCwzNDExMywzNDMwNiwzNDEyMywzNDEzMywzNDE3NiwzNDIxMiwzNDE4NCwzNDE5MywzNDE4NiwzNDIxNiwzNDE1NywzNDE5NiwzNDIwMywzNDI4MiwzNDE4MywzNDIwNCwzNDE2NywzNDE3NCwzNDE5MiwzNDI0OSwzNDIzNCwzNDI1NSwzNDIzMywzNDI1NiwzNDI2MSwzNDI2OSwzNDI3NywzNDI2OCwzNDI5NywzNDMxNCwzNDMyMywzNDMxNSwzNDMwMiwzNDI5OCwzNDMxMCwzNDMzOCwzNDMzMCwzNDM1MiwzNDM2NywzNDM4MSwyMDA1MywzNDM4OCwzNDM5OSwzNDQwNywzNDQxNywzNDQ1MSwzNDQ2NywzNDQ3MywzNDQ3NCwzNDQ0MywzNDQ0NCwzNDQ4NiwzNDQ3OSwzNDUwMCwzNDUwMiwzNDQ4MCwzNDUwNSwzNDg1MSwzNDQ3NSwzNDUxNiwzNDUyNiwzNDUzNywzNDU0MCwzNDUyNywzNDUyMywzNDU0MywzNDU3OCwzNDU2NiwzNDU2OCwzNDU2MCwzNDU2MywzNDU1NSwzNDU3NywzNDU2OSwzNDU3MywzNDU1MywzNDU3MCwzNDYxMiwzNDYyMywzNDYxNSwzNDYxOSwzNDU5NywzNDYwMSwzNDU4NiwzNDY1NiwzNDY1NSwzNDY4MCwzNDYzNiwzNDYzOCwzNDY3NiwzNDY0NywzNDY2NCwzNDY3MCwzNDY0OSwzNDY0MywzNDY1OSwzNDY2NiwzNDgyMSwzNDcyMiwzNDcxOSwzNDY5MCwzNDczNSwzNDc2MywzNDc0OSwzNDc1MiwzNDc2OCwzODYxNCwzNDczMSwzNDc1NiwzNDczOSwzNDc1OSwzNDc1OCwzNDc0NywzNDc5OSwzNDgwMiwzNDc4NCwzNDgzMSwzNDgyOSwzNDgxNCwzNDgwNiwzNDgwNywzNDgzMCwzNDc3MCwzNDgzMywzNDgzOCwzNDgzNywzNDg1MCwzNDg0OSwzNDg2NSwzNDg3MCwzNDg3MywzNDg1NSwzNDg3NSwzNDg4NCwzNDg4MiwzNDg5OCwzNDkwNSwzNDkxMCwzNDkxNCwzNDkyMywzNDk0NSwzNDk0MiwzNDk3NCwzNDkzMywzNDk0MSwzNDk5NywzNDkzMCwzNDk0NiwzNDk2NywzNDk2MiwzNDk5MCwzNDk2OSwzNDk3OCwzNDk1NywzNDk4MCwzNDk5MiwzNTAwNywzNDk5MywzNTAxMSwzNTAxMiwzNTAyOCwzNTAzMiwzNTAzMywzNTAzNywzNTA2NSwzNTA3NCwzNTA2OCwzNTA2MCwzNTA0OCwzNTA1OCwzNTA3NiwzNTA4NCwzNTA4MiwzNTA5MSwzNTEzOSwzNTEwMiwzNTEwOSwzNTExNCwzNTExNSwzNTEzNywzNTE0MCwzNTEzMSwzNTEyNiwzNTEyOCwzNTE0OCwzNTEwMSwzNTE2OCwzNTE2NiwzNTE3NCwzNTE3MiwzNTE4MSwzNTE3OCwzNTE4MywzNTE4OCwzNTE5MSwzNTE5OCwzNTIwMywzNTIwOCwzNTIxMCwzNTIxOSwzNTIyNCwzNTIzMywzNTI0MSwzNTIzOCwzNTI0NCwzNTI0NywzNTI1MCwzNTI1OCwzNTI2MSwzNTI2MywzNTI2NCwzNTI5MCwzNTI5MiwzNTI5MywzNTMwMywzNTMxNiwzNTMyMCwzNTMzMSwzNTM1MCwzNTM0NCwzNTM0MCwzNTM1NSwzNTM1NywzNTM2NSwzNTM4MiwzNTM5MywzNTQxOSwzNTQxMCwzNTM5OCwzNTQwMCwzNTQ1MiwzNTQzNywzNTQzNiwzNTQyNiwzNTQ2MSwzNTQ1OCwzNTQ2MCwzNTQ5NiwzNTQ4OSwzNTQ3MywzNTQ5MywzNTQ5NCwzNTQ4MiwzNTQ5MSwzNTUyNCwzNTUzMywzNTUyMiwzNTU0NiwzNTU2MywzNTU3MSwzNTU1OSwzNTU1NiwzNTU2OSwzNTYwNCwzNTU1MiwzNTU1NCwzNTU3NSwzNTU1MCwzNTU0NywzNTU5NiwzNTU5MSwzNTYxMCwzNTU1MywzNTYwNiwzNTYwMCwzNTYwNywzNTYxNiwzNTYzNSwzODgyNywzNTYyMiwzNTYyNywzNTY0NiwzNTYyNCwzNTY0OSwzNTY2MCwzNTY2MywzNTY2MiwzNTY1NywzNTY3MCwzNTY3NSwzNTY3NCwzNTY5MSwzNTY3OSwzNTY5MiwzNTY5NSwzNTcwMCwzNTcwOSwzNTcxMiwzNTcyNCwzNTcyNiwzNTczMCwzNTczMSwzNTczNCwzNTczNywzNTczOCwzNTg5OCwzNTkwNSwzNTkwMywzNTkxMiwzNTkxNiwzNTkxOCwzNTkyMCwzNTkyNSwzNTkzOCwzNTk0OCwzNTk2MCwzNTk2MiwzNTk3MCwzNTk3NywzNTk3MywzNTk3OCwzNTk4MSwzNTk4MiwzNTk4OCwzNTk2NCwzNTk5MiwyNTExNywzNjAxMywzNjAxMCwzNjAyOSwzNjAxOCwzNjAxOSwzNjAxNCwzNjAyMiwzNjA0MCwzNjAzMywzNjA2OCwzNjA2NywzNjA1OCwzNjA5MywzNjA5MCwzNjA5MSwzNjEwMCwzNjEwMSwzNjEwNiwzNjEwMywzNjExMSwzNjEwOSwzNjExMiw0MDc4MiwzNjExNSwzNjA0NSwzNjExNiwzNjExOCwzNjE5OSwzNjIwNSwzNjIwOSwzNjIxMSwzNjIyNSwzNjI0OSwzNjI5MCwzNjI4NiwzNjI4MiwzNjMwMywzNjMxNCwzNjMxMCwzNjMwMCwzNjMxNSwzNjI5OSwzNjMzMCwzNjMzMSwzNjMxOSwzNjMyMywzNjM0OCwzNjM2MCwzNjM2MSwzNjM1MSwzNjM4MSwzNjM4MiwzNjM2OCwzNjM4MywzNjQxOCwzNjQwNSwzNjQwMCwzNjQwNCwzNjQyNiwzNjQyMywzNjQyNSwzNjQyOCwzNjQzMiwzNjQyNCwzNjQ0MSwzNjQ1MiwzNjQ0OCwzNjM5NCwzNjQ1MSwzNjQzNywzNjQ3MCwzNjQ2NiwzNjQ3NiwzNjQ4MSwzNjQ4NywzNjQ4NSwzNjQ4NCwzNjQ5MSwzNjQ5MCwzNjQ5OSwzNjQ5NywzNjUwMCwzNjUwNSwzNjUyMiwzNjUxMywzNjUyNCwzNjUyOCwzNjU1MCwzNjUyOSwzNjU0MiwzNjU0OSwzNjU1MiwzNjU1NSwzNjU3MSwzNjU3OSwzNjYwNCwzNjYwMywzNjU4NywzNjYwNiwzNjYxOCwzNjYxMywzNjYyOSwzNjYyNiwzNjYzMywzNjYyNywzNjYzNiwzNjYzOSwzNjYzNSwzNjYyMCwzNjY0NiwzNjY1OSwzNjY2NywzNjY2NSwzNjY3NywzNjY3NCwzNjY3MCwzNjY4NCwzNjY4MSwzNjY3OCwzNjY4NiwzNjY5NSwzNjcwMCwzNjcwNiwzNjcwNywzNjcwOCwzNjc2NCwzNjc2NywzNjc3MSwzNjc4MSwzNjc4MywzNjc5MSwzNjgyNiwzNjgzNywzNjgzNCwzNjg0MiwzNjg0NywzNjk5OSwzNjg1MiwzNjg2OSwzNjg1NywzNjg1OCwzNjg4MSwzNjg4NSwzNjg5NywzNjg3NywzNjg5NCwzNjg4NiwzNjg3NSwzNjkwMywzNjkxOCwzNjkxNywzNjkyMSwzNjg1NiwzNjk0MywzNjk0NCwzNjk0NSwzNjk0NiwzNjg3OCwzNjkzNywzNjkyNiwzNjk1MCwzNjk1MiwzNjk1OCwzNjk2OCwzNjk3NSwzNjk4MiwzODU2OCwzNjk3OCwzNjk5NCwzNjk4OSwzNjk5MywzNjk5MiwzNzAwMiwzNzAwMSwzNzAwNywzNzAzMiwzNzAzOSwzNzA0MSwzNzA0NSwzNzA5MCwzNzA5MiwyNTE2MCwzNzA4MywzNzEyMiwzNzEzOCwzNzE0NSwzNzE3MCwzNzE2OCwzNzE5NCwzNzIwNiwzNzIwOCwzNzIxOSwzNzIyMSwzNzIyNSwzNzIzNSwzNzIzNCwzNzI1OSwzNzI1NywzNzI1MCwzNzI4MiwzNzI5MSwzNzI5NSwzNzI5MCwzNzMwMSwzNzMwMCwzNzMwNiwzNzMxMiwzNzMxMywzNzMyMSwzNzMyMywzNzMyOCwzNzMzNCwzNzM0MywzNzM0NSwzNzMzOSwzNzM3MiwzNzM2NSwzNzM2NiwzNzQwNiwzNzM3NSwzNzM5NiwzNzQyMCwzNzM5NywzNzM5MywzNzQ3MCwzNzQ2MywzNzQ0NSwzNzQ0OSwzNzQ3NiwzNzQ0OCwzNzUyNSwzNzQzOSwzNzQ1MSwzNzQ1NiwzNzUzMiwzNzUyNiwzNzUyMywzNzUzMSwzNzQ2NiwzNzU4MywzNzU2MSwzNzU1OSwzNzYwOSwzNzY0NywzNzYyNiwzNzcwMCwzNzY3OCwzNzY1NywzNzY2NiwzNzY1OCwzNzY2NywzNzY5MCwzNzY4NSwzNzY5MSwzNzcyNCwzNzcyOCwzNzc1NiwzNzc0MiwzNzcxOCwzNzgwOCwzNzgwNCwzNzgwNSwzNzc4MCwzNzgxNywzNzg0NiwzNzg0NywzNzg2NCwzNzg2MSwzNzg0OCwzNzgyNywzNzg1MywzNzg0MCwzNzgzMiwzNzg2MCwzNzkxNCwzNzkwOCwzNzkwNywzNzg5MSwzNzg5NSwzNzkwNCwzNzk0MiwzNzkzMSwzNzk0MSwzNzkyMSwzNzk0NiwzNzk1MywzNzk3MCwzNzk1NiwzNzk3OSwzNzk4NCwzNzk4NiwzNzk4MiwzNzk5NCwzNzQxNywzODAwMCwzODAwNSwzODAwNywzODAxMywzNzk3OCwzODAxMiwzODAxNCwzODAxNywzODAxNSwzODI3NCwzODI3OSwzODI4MiwzODI5MiwzODI5NCwzODI5NiwzODI5NywzODMwNCwzODMxMiwzODMxMSwzODMxNywzODMzMiwzODMzMSwzODMyOSwzODMzNCwzODM0NiwyODY2MiwzODMzOSwzODM0OSwzODM0OCwzODM1NywzODM1NiwzODM1OCwzODM2NCwzODM2OSwzODM3MywzODM3MCwzODQzMywzODQ0MCwzODQ0NiwzODQ0NywzODQ2NiwzODQ3NiwzODQ3OSwzODQ3NSwzODUxOSwzODQ5MiwzODQ5NCwzODQ5MywzODQ5NSwzODUwMiwzODUxNCwzODUwOCwzODU0MSwzODU1MiwzODU0OSwzODU1MSwzODU3MCwzODU2NywzODU3NywzODU3OCwzODU3NiwzODU4MCwzODU4MiwzODU4NCwzODU4NSwzODYwNiwzODYwMywzODYwMSwzODYwNSwzNTE0OSwzODYyMCwzODY2OSwzODYxMywzODY0OSwzODY2MCwzODY2MiwzODY2NCwzODY3NSwzODY3MCwzODY3MywzODY3MSwzODY3OCwzODY4MSwzODY5MiwzODY5OCwzODcwNCwzODcxMywzODcxNywzODcxOCwzODcyNCwzODcyNiwzODcyOCwzODcyMiwzODcyOSwzODc0OCwzODc1MiwzODc1NiwzODc1OCwzODc2MCwyMTIwMiwzODc2MywzODc2OSwzODc3NywzODc4OSwzODc4MCwzODc4NSwzODc3OCwzODc5MCwzODc5NSwzODc5OSwzODgwMCwzODgxMiwzODgyNCwzODgyMiwzODgxOSwzODgzNSwzODgzNiwzODg1MSwzODg1NCwzODg1NiwzODg1OSwzODg3NiwzODg5Myw0MDc4MywzODg5OCwzMTQ1NSwzODkwMiwzODkwMSwzODkyNywzODkyNCwzODk2OCwzODk0OCwzODk0NSwzODk2NywzODk3MywzODk4MiwzODk5MSwzODk4NywzOTAxOSwzOTAyMywzOTAyNCwzOTAyNSwzOTAyOCwzOTAyNywzOTA4MiwzOTA4NywzOTA4OSwzOTA5NCwzOTEwOCwzOTEwNywzOTExMCwzOTE0NSwzOTE0NywzOTE3MSwzOTE3NywzOTE4NiwzOTE4OCwzOTE5MiwzOTIwMSwzOTE5NywzOTE5OCwzOTIwNCwzOTIwMCwzOTIxMiwzOTIxNCwzOTIyOSwzOTIzMCwzOTIzNCwzOTI0MSwzOTIzNywzOTI0OCwzOTI0MywzOTI0OSwzOTI1MCwzOTI0NCwzOTI1MywzOTMxOSwzOTMyMCwzOTMzMywzOTM0MSwzOTM0MiwzOTM1NiwzOTM5MSwzOTM4NywzOTM4OSwzOTM4NCwzOTM3NywzOTQwNSwzOTQwNiwzOTQwOSwzOTQxMCwzOTQxOSwzOTQxNiwzOTQyNSwzOTQzOSwzOTQyOSwzOTM5NCwzOTQ0OSwzOTQ2NywzOTQ3OSwzOTQ5MywzOTQ5MCwzOTQ4OCwzOTQ5MSwzOTQ4NiwzOTUwOSwzOTUwMSwzOTUxNSwzOTUxMSwzOTUxOSwzOTUyMiwzOTUyNSwzOTUyNCwzOTUyOSwzOTUzMSwzOTUzMCwzOTU5NywzOTYwMCwzOTYxMiwzOTYxNiwzOTYzMSwzOTYzMywzOTYzNSwzOTYzNiwzOTY0NiwzOTY0NywzOTY1MCwzOTY1MSwzOTY1NCwzOTY2MywzOTY1OSwzOTY2MiwzOTY2OCwzOTY2NSwzOTY3MSwzOTY3NSwzOTY4NiwzOTcwNCwzOTcwNiwzOTcxMSwzOTcxNCwzOTcxNSwzOTcxNywzOTcxOSwzOTcyMCwzOTcyMSwzOTcyMiwzOTcyNiwzOTcyNywzOTczMCwzOTc0OCwzOTc0NywzOTc1OSwzOTc1NywzOTc1OCwzOTc2MSwzOTc2OCwzOTc5NiwzOTgyNywzOTgxMSwzOTgyNSwzOTgzMCwzOTgzMSwzOTgzOSwzOTg0MCwzOTg0OCwzOTg2MCwzOTg3MiwzOTg4MiwzOTg2NSwzOTg3OCwzOTg4NywzOTg4OSwzOTg5MCwzOTkwNywzOTkwNiwzOTkwOCwzOTg5MiwzOTkwNSwzOTk5NCwzOTkyMiwzOTkyMSwzOTkyMCwzOTk1NywzOTk1NiwzOTk0NSwzOTk1NSwzOTk0OCwzOTk0MiwzOTk0NCwzOTk1NCwzOTk0NiwzOTk0MCwzOTk4MiwzOTk2MywzOTk3MywzOTk3MiwzOTk2OSwzOTk4NCw0MDAwNywzOTk4Niw0MDAwNiwzOTk5OCw0MDAyNiw0MDAzMiw0MDAzOSw0MDA1NCw0MDA1Niw0MDE2Nyw0MDE3Miw0MDE3Niw0MDIwMSw0MDIwMCw0MDE3MSw0MDE5NSw0MDE5OCw0MDIzNCw0MDIzMCw0MDM2Nyw0MDIyNyw0MDIyMyw0MDI2MCw0MDIxMyw0MDIxMCw0MDI1Nyw0MDI1NSw0MDI1NCw0MDI2Miw0MDI2NCw0MDI4NSw0MDI4Niw0MDI5Miw0MDI3Myw0MDI3Miw0MDI4MSw0MDMwNiw0MDMyOSw0MDMyNyw0MDM2Myw0MDMwMyw0MDMxNCw0MDM0Niw0MDM1Niw0MDM2MSw0MDM3MCw0MDM4OCw0MDM4NSw0MDM3OSw0MDM3Niw0MDM3OCw0MDM5MCw0MDM5OSw0MDM4Niw0MDQwOSw0MDQwMyw0MDQ0MCw0MDQyMiw0MDQyOSw0MDQzMSw0MDQ0NSw0MDQ3NCw0MDQ3NSw0MDQ3OCw0MDU2NSw0MDU2OSw0MDU3Myw0MDU3Nyw0MDU4NCw0MDU4Nyw0MDU4OCw0MDU5NCw0MDU5Nyw0MDU5Myw0MDYwNSw0MDYxMyw0MDYxNyw0MDYzMiw0MDYxOCw0MDYyMSwzODc1Myw0MDY1Miw0MDY1NCw0MDY1NSw0MDY1Niw0MDY2MCw0MDY2OCw0MDY3MCw0MDY2OSw0MDY3Miw0MDY3Nyw0MDY4MCw0MDY4Nyw0MDY5Miw0MDY5NCw0MDY5NSw0MDY5Nyw0MDY5OSw0MDcwMCw0MDcwMSw0MDcxMSw0MDcxMiwzMDM5MSw0MDcyNSw0MDczNyw0MDc0OCw0MDc2Niw0MDc3OCw0MDc4Niw0MDc4OCw0MDgwMyw0MDc5OSw0MDgwMCw0MDgwMSw0MDgwNiw0MDgwNyw0MDgxMiw0MDgxMCw0MDgyMyw0MDgxOCw0MDgyMiw0MDg1Myw0MDg2MCw0MDg2NCwyMjU3NSwyNzA3OSwzNjk1MywyOTc5NiwyMDk1NiwyOTA4MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMzIzOTQsMzUxMDAsMzc3MDQsMzc1MTIsMzQwMTIsMjA0MjUsMjg4NTksMjYxNjEsMjY4MjQsMzc2MjUsMjYzNjMsMjQzODksMjAwMDgsMjAxOTMsMjAyMjAsMjAyMjQsMjAyMjcsMjAyODEsMjAzMTAsMjAzNzAsMjAzNjIsMjAzNzgsMjAzNzIsMjA0MjksMjA1NDQsMjA1MTQsMjA0NzksMjA1MTAsMjA1NTAsMjA1OTIsMjA1NDYsMjA2MjgsMjA3MjQsMjA2OTYsMjA4MTAsMjA4MzYsMjA4OTMsMjA5MjYsMjA5NzIsMjEwMTMsMjExNDgsMjExNTgsMjExODQsMjEyMTEsMjEyNDgsMjEyNTUsMjEyODQsMjEzNjIsMjEzOTUsMjE0MjYsMjE0NjksNjQwMTQsMjE2NjAsMjE2NDIsMjE2NzMsMjE3NTksMjE4OTQsMjIzNjEsMjIzNzMsMjI0NDQsMjI0NzIsMjI0NzEsNjQwMTUsNjQwMTYsMjI2ODYsMjI3MDYsMjI3OTUsMjI4NjcsMjI4NzUsMjI4NzcsMjI4ODMsMjI5NDgsMjI5NzAsMjMzODIsMjM0ODgsMjk5OTksMjM1MTIsMjM1MzIsMjM1ODIsMjM3MTgsMjM3MzgsMjM3OTcsMjM4NDcsMjM4OTEsNjQwMTcsMjM4NzQsMjM5MTcsMjM5OTIsMjM5OTMsMjQwMTYsMjQzNTMsMjQzNzIsMjQ0MjMsMjQ1MDMsMjQ1NDIsMjQ2NjksMjQ3MDksMjQ3MTQsMjQ3OTgsMjQ3ODksMjQ4NjQsMjQ4MTgsMjQ4NDksMjQ4ODcsMjQ4ODAsMjQ5ODQsMjUxMDcsMjUyNTQsMjU1ODksMjU2OTYsMjU3NTcsMjU4MDYsMjU5MzQsMjYxMTIsMjYxMzMsMjYxNzEsMjYxMjEsMjYxNTgsMjYxNDIsMjYxNDgsMjYyMTMsMjYxOTksMjYyMDEsNjQwMTgsMjYyMjcsMjYyNjUsMjYyNzIsMjYyOTAsMjYzMDMsMjYzNjIsMjYzODIsNjM3ODUsMjY0NzAsMjY1NTUsMjY3MDYsMjY1NjAsMjY2MjUsMjY2OTIsMjY4MzEsNjQwMTksMjY5ODQsNjQwMjAsMjcwMzIsMjcxMDYsMjcxODQsMjcyNDMsMjcyMDYsMjcyNTEsMjcyNjIsMjczNjIsMjczNjQsMjc2MDYsMjc3MTEsMjc3NDAsMjc3ODIsMjc3NTksMjc4NjYsMjc5MDgsMjgwMzksMjgwMTUsMjgwNTQsMjgwNzYsMjgxMTEsMjgxNTIsMjgxNDYsMjgxNTYsMjgyMTcsMjgyNTIsMjgxOTksMjgyMjAsMjgzNTEsMjg1NTIsMjg1OTcsMjg2NjEsMjg2NzcsMjg2NzksMjg3MTIsMjg4MDUsMjg4NDMsMjg5NDMsMjg5MzIsMjkwMjAsMjg5OTgsMjg5OTksNjQwMjEsMjkxMjEsMjkxODIsMjkzNjEsMjkzNzQsMjk0NzYsNjQwMjIsMjk1NTksMjk2MjksMjk2NDEsMjk2NTQsMjk2NjcsMjk2NTAsMjk3MDMsMjk2ODUsMjk3MzQsMjk3MzgsMjk3MzcsMjk3NDIsMjk3OTQsMjk4MzMsMjk4NTUsMjk5NTMsMzAwNjMsMzAzMzgsMzAzNjQsMzAzNjYsMzAzNjMsMzAzNzQsNjQwMjMsMzA1MzQsMjExNjcsMzA3NTMsMzA3OTgsMzA4MjAsMzA4NDIsMzEwMjQsNjQwMjQsNjQwMjUsNjQwMjYsMzExMjQsNjQwMjcsMzExMzEsMzE0NDEsMzE0NjMsNjQwMjgsMzE0NjcsMzE2NDYsNjQwMjksMzIwNzIsMzIwOTIsMzIxODMsMzIxNjAsMzIyMTQsMzIzMzgsMzI1ODMsMzI2NzMsNjQwMzAsMzM1MzcsMzM2MzQsMzM2NjMsMzM3MzUsMzM3ODIsMzM4NjQsMzM5NzIsMzQxMzEsMzQxMzcsMzQxNTUsNjQwMzEsMzQyMjQsNjQwMzIsNjQwMzMsMzQ4MjMsMzUwNjEsMzUzNDYsMzUzODMsMzU0NDksMzU0OTUsMzU1MTgsMzU1NTEsNjQwMzQsMzU1NzQsMzU2NjcsMzU3MTEsMzYwODAsMzYwODQsMzYxMTQsMzYyMTQsNjQwMzUsMzY1NTksNjQwMzYsNjQwMzcsMzY5NjcsMzcwODYsNjQwMzgsMzcxNDEsMzcxNTksMzczMzgsMzczMzUsMzczNDIsMzczNTcsMzczNTgsMzczNDgsMzczNDksMzczODIsMzczOTIsMzczODYsMzc0MzQsMzc0NDAsMzc0MzYsMzc0NTQsMzc0NjUsMzc0NTcsMzc0MzMsMzc0NzksMzc1NDMsMzc0OTUsMzc0OTYsMzc2MDcsMzc1OTEsMzc1OTMsMzc1ODQsNjQwMzksMzc1ODksMzc2MDAsMzc1ODcsMzc2NjksMzc2NjUsMzc2MjcsNjQwNDAsMzc2NjIsMzc2MzEsMzc2NjEsMzc2MzQsMzc3NDQsMzc3MTksMzc3OTYsMzc4MzAsMzc4NTQsMzc4ODAsMzc5MzcsMzc5NTcsMzc5NjAsMzgyOTAsNjM5NjQsNjQwNDEsMzg1NTcsMzg1NzUsMzg3MDcsMzg3MTUsMzg3MjMsMzg3MzMsMzg3MzUsMzg3MzcsMzg3NDEsMzg5OTksMzkwMTMsNjQwNDIsNjQwNDMsMzkyMDcsNjQwNDQsMzkzMjYsMzk1MDIsMzk2NDEsMzk2NDQsMzk3OTcsMzk3OTQsMzk4MjMsMzk4NTcsMzk4NjcsMzk5MzYsNDAzMDQsNDAyOTksNjQwNDUsNDA0NzMsNDA2NTcsbnVsbCxudWxsLDg1NjAsODU2MSw4NTYyLDg1NjMsODU2NCw4NTY1LDg1NjYsODU2Nyw4NTY4LDg1NjksNjU1MDYsNjU1MDgsNjUyODcsNjUyODIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4NTYwLDg1NjEsODU2Miw4NTYzLDg1NjQsODU2NSw4NTY2LDg1NjcsODU2OCw4NTY5LDg1NDQsODU0NSw4NTQ2LDg1NDcsODU0OCw4NTQ5LDg1NTAsODU1MSw4NTUyLDg1NTMsNjU1MDYsNjU1MDgsNjUyODcsNjUyODIsMTI4NDksODQ3MCw4NDgxLDg3NTcsMzIzOTQsMzUxMDAsMzc3MDQsMzc1MTIsMzQwMTIsMjA0MjUsMjg4NTksMjYxNjEsMjY4MjQsMzc2MjUsMjYzNjMsMjQzODksMjAwMDgsMjAxOTMsMjAyMjAsMjAyMjQsMjAyMjcsMjAyODEsMjAzMTAsMjAzNzAsMjAzNjIsMjAzNzgsMjAzNzIsMjA0MjksMjA1NDQsMjA1MTQsMjA0NzksMjA1MTAsMjA1NTAsMjA1OTIsMjA1NDYsMjA2MjgsMjA3MjQsMjA2OTYsMjA4MTAsMjA4MzYsMjA4OTMsMjA5MjYsMjA5NzIsMjEwMTMsMjExNDgsMjExNTgsMjExODQsMjEyMTEsMjEyNDgsMjEyNTUsMjEyODQsMjEzNjIsMjEzOTUsMjE0MjYsMjE0NjksNjQwMTQsMjE2NjAsMjE2NDIsMjE2NzMsMjE3NTksMjE4OTQsMjIzNjEsMjIzNzMsMjI0NDQsMjI0NzIsMjI0NzEsNjQwMTUsNjQwMTYsMjI2ODYsMjI3MDYsMjI3OTUsMjI4NjcsMjI4NzUsMjI4NzcsMjI4ODMsMjI5NDgsMjI5NzAsMjMzODIsMjM0ODgsMjk5OTksMjM1MTIsMjM1MzIsMjM1ODIsMjM3MTgsMjM3MzgsMjM3OTcsMjM4NDcsMjM4OTEsNjQwMTcsMjM4NzQsMjM5MTcsMjM5OTIsMjM5OTMsMjQwMTYsMjQzNTMsMjQzNzIsMjQ0MjMsMjQ1MDMsMjQ1NDIsMjQ2NjksMjQ3MDksMjQ3MTQsMjQ3OTgsMjQ3ODksMjQ4NjQsMjQ4MTgsMjQ4NDksMjQ4ODcsMjQ4ODAsMjQ5ODQsMjUxMDcsMjUyNTQsMjU1ODksMjU2OTYsMjU3NTcsMjU4MDYsMjU5MzQsMjYxMTIsMjYxMzMsMjYxNzEsMjYxMjEsMjYxNTgsMjYxNDIsMjYxNDgsMjYyMTMsMjYxOTksMjYyMDEsNjQwMTgsMjYyMjcsMjYyNjUsMjYyNzIsMjYyOTAsMjYzMDMsMjYzNjIsMjYzODIsNjM3ODUsMjY0NzAsMjY1NTUsMjY3MDYsMjY1NjAsMjY2MjUsMjY2OTIsMjY4MzEsNjQwMTksMjY5ODQsNjQwMjAsMjcwMzIsMjcxMDYsMjcxODQsMjcyNDMsMjcyMDYsMjcyNTEsMjcyNjIsMjczNjIsMjczNjQsMjc2MDYsMjc3MTEsMjc3NDAsMjc3ODIsMjc3NTksMjc4NjYsMjc5MDgsMjgwMzksMjgwMTUsMjgwNTQsMjgwNzYsMjgxMTEsMjgxNTIsMjgxNDYsMjgxNTYsMjgyMTcsMjgyNTIsMjgxOTksMjgyMjAsMjgzNTEsMjg1NTIsMjg1OTcsMjg2NjEsMjg2NzcsMjg2NzksMjg3MTIsMjg4MDUsMjg4NDMsMjg5NDMsMjg5MzIsMjkwMjAsMjg5OTgsMjg5OTksNjQwMjEsMjkxMjEsMjkxODIsMjkzNjEsMjkzNzQsMjk0NzYsNjQwMjIsMjk1NTksMjk2MjksMjk2NDEsMjk2NTQsMjk2NjcsMjk2NTAsMjk3MDMsMjk2ODUsMjk3MzQsMjk3MzgsMjk3MzcsMjk3NDIsMjk3OTQsMjk4MzMsMjk4NTUsMjk5NTMsMzAwNjMsMzAzMzgsMzAzNjQsMzAzNjYsMzAzNjMsMzAzNzQsNjQwMjMsMzA1MzQsMjExNjcsMzA3NTMsMzA3OTgsMzA4MjAsMzA4NDIsMzEwMjQsNjQwMjQsNjQwMjUsNjQwMjYsMzExMjQsNjQwMjcsMzExMzEsMzE0NDEsMzE0NjMsNjQwMjgsMzE0NjcsMzE2NDYsNjQwMjksMzIwNzIsMzIwOTIsMzIxODMsMzIxNjAsMzIyMTQsMzIzMzgsMzI1ODMsMzI2NzMsNjQwMzAsMzM1MzcsMzM2MzQsMzM2NjMsMzM3MzUsMzM3ODIsMzM4NjQsMzM5NzIsMzQxMzEsMzQxMzcsMzQxNTUsNjQwMzEsMzQyMjQsNjQwMzIsNjQwMzMsMzQ4MjMsMzUwNjEsMzUzNDYsMzUzODMsMzU0NDksMzU0OTUsMzU1MTgsMzU1NTEsNjQwMzQsMzU1NzQsMzU2NjcsMzU3MTEsMzYwODAsMzYwODQsMzYxMTQsMzYyMTQsNjQwMzUsMzY1NTksNjQwMzYsNjQwMzcsMzY5NjcsMzcwODYsNjQwMzgsMzcxNDEsMzcxNTksMzczMzgsMzczMzUsMzczNDIsMzczNTcsMzczNTgsMzczNDgsMzczNDksMzczODIsMzczOTIsMzczODYsMzc0MzQsMzc0NDAsMzc0MzYsMzc0NTQsMzc0NjUsMzc0NTcsMzc0MzMsMzc0NzksMzc1NDMsMzc0OTUsMzc0OTYsMzc2MDcsMzc1OTEsMzc1OTMsMzc1ODQsNjQwMzksMzc1ODksMzc2MDAsMzc1ODcsMzc2NjksMzc2NjUsMzc2MjcsNjQwNDAsMzc2NjIsMzc2MzEsMzc2NjEsMzc2MzQsMzc3NDQsMzc3MTksMzc3OTYsMzc4MzAsMzc4NTQsMzc4ODAsMzc5MzcsMzc5NTcsMzc5NjAsMzgyOTAsNjM5NjQsNjQwNDEsMzg1NTcsMzg1NzUsMzg3MDcsMzg3MTUsMzg3MjMsMzg3MzMsMzg3MzUsMzg3MzcsMzg3NDEsMzg5OTksMzkwMTMsNjQwNDIsNjQwNDMsMzkyMDcsNjQwNDQsMzkzMjYsMzk1MDIsMzk2NDEsMzk2NDQsMzk3OTcsMzk3OTQsMzk4MjMsMzk4NTcsMzk4NjcsMzk5MzYsNDAzMDQsNDAyOTksNjQwNDUsNDA0NzMsNDA2NTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxcbiAgXCJqaXMwMjEyXCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDcyOCw3MTEsMTg0LDcyOSw3MzMsMTc1LDczMSw3MzAsNjUzNzQsOTAwLDkwMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTYxLDE2NiwxOTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE4NiwxNzAsMTY5LDE3NCw4NDgyLDE2NCw4NDcwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw5MDIsOTA0LDkwNSw5MDYsOTM4LG51bGwsOTA4LG51bGwsOTEwLDkzOSxudWxsLDkxMSxudWxsLG51bGwsbnVsbCxudWxsLDk0MCw5NDEsOTQyLDk0Myw5NzAsOTEyLDk3Miw5NjIsOTczLDk3MSw5NDQsOTc0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMDI2LDEwMjcsMTAyOCwxMDI5LDEwMzAsMTAzMSwxMDMyLDEwMzMsMTAzNCwxMDM1LDEwMzYsMTAzOCwxMDM5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMTA2LDExMDcsMTEwOCwxMTA5LDExMTAsMTExMSwxMTEyLDExMTMsMTExNCwxMTE1LDExMTYsMTExOCwxMTE5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTk4LDI3MixudWxsLDI5NCxudWxsLDMwNixudWxsLDMyMSwzMTksbnVsbCwzMzAsMjE2LDMzOCxudWxsLDM1OCwyMjIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwyMzAsMjczLDI0MCwyOTUsMzA1LDMwNywzMTIsMzIyLDMyMCwzMjksMzMxLDI0OCwzMzksMjIzLDM1OSwyNTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxOTMsMTkyLDE5NiwxOTQsMjU4LDQ2MSwyNTYsMjYwLDE5NywxOTUsMjYyLDI2NCwyNjgsMTk5LDI2NiwyNzAsMjAxLDIwMCwyMDMsMjAyLDI4MiwyNzgsMjc0LDI4MCxudWxsLDI4NCwyODYsMjkwLDI4OCwyOTIsMjA1LDIwNCwyMDcsMjA2LDQ2MywzMDQsMjk4LDMwMiwyOTYsMzA4LDMxMCwzMTMsMzE3LDMxNSwzMjMsMzI3LDMyNSwyMDksMjExLDIxMCwyMTQsMjEyLDQ2NSwzMzYsMzMyLDIxMywzNDAsMzQ0LDM0MiwzNDYsMzQ4LDM1MiwzNTAsMzU2LDM1NCwyMTgsMjE3LDIyMCwyMTksMzY0LDQ2NywzNjgsMzYyLDM3MCwzNjYsMzYwLDQ3MSw0NzUsNDczLDQ2OSwzNzIsMjIxLDM3NiwzNzQsMzc3LDM4MSwzNzksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwyMjUsMjI0LDIyOCwyMjYsMjU5LDQ2MiwyNTcsMjYxLDIyOSwyMjcsMjYzLDI2NSwyNjksMjMxLDI2NywyNzEsMjMzLDIzMiwyMzUsMjM0LDI4MywyNzksMjc1LDI4MSw1MDEsMjg1LDI4NyxudWxsLDI4OSwyOTMsMjM3LDIzNiwyMzksMjM4LDQ2NCxudWxsLDI5OSwzMDMsMjk3LDMwOSwzMTEsMzE0LDMxOCwzMTYsMzI0LDMyOCwzMjYsMjQxLDI0MywyNDIsMjQ2LDI0NCw0NjYsMzM3LDMzMywyNDUsMzQxLDM0NSwzNDMsMzQ3LDM0OSwzNTMsMzUxLDM1NywzNTUsMjUwLDI0OSwyNTIsMjUxLDM2NSw0NjgsMzY5LDM2MywzNzEsMzY3LDM2MSw0NzIsNDc2LDQ3NCw0NzAsMzczLDI1MywyNTUsMzc1LDM3OCwzODIsMzgwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxOTk3MCwxOTk3MiwxOTk3MywxOTk4MCwxOTk4NiwxOTk5OSwyMDAwMywyMDAwNCwyMDAwOCwyMDAxMSwyMDAxNCwyMDAxNSwyMDAxNiwyMDAyMSwyMDAzMiwyMDAzMywyMDAzNiwyMDAzOSwyMDA0OSwyMDA1OCwyMDA2MCwyMDA2NywyMDA3MiwyMDA3MywyMDA4NCwyMDA4NSwyMDA4OSwyMDA5NSwyMDEwOSwyMDExOCwyMDExOSwyMDEyNSwyMDE0MywyMDE1MywyMDE2MywyMDE3NiwyMDE4NiwyMDE4NywyMDE5MiwyMDE5MywyMDE5NCwyMDIwMCwyMDIwNywyMDIwOSwyMDIxMSwyMDIxMywyMDIyMSwyMDIyMiwyMDIyMywyMDIyNCwyMDIyNiwyMDIyNywyMDIzMiwyMDIzNSwyMDIzNiwyMDI0MiwyMDI0NSwyMDI0NiwyMDI0NywyMDI0OSwyMDI3MCwyMDI3MywyMDMyMCwyMDI3NSwyMDI3NywyMDI3OSwyMDI4MSwyMDI4MywyMDI4NiwyMDI4OCwyMDI5MCwyMDI5NiwyMDI5NywyMDI5OSwyMDMwMCwyMDMwNiwyMDMwOCwyMDMxMCwyMDMxMiwyMDMxOSwyMDMyMywyMDMzMCwyMDMzMiwyMDMzNCwyMDMzNywyMDM0MywyMDM0NCwyMDM0NSwyMDM0NiwyMDM0OSwyMDM1MCwyMDM1MywyMDM1NCwyMDM1NiwyMDM1NywyMDM2MSwyMDM2MiwyMDM2NCwyMDM2NiwyMDM2OCwyMDM3MCwyMDM3MSwyMDM3MiwyMDM3NSwyMDM3NywyMDM3OCwyMDM4MiwyMDM4MywyMDQwMiwyMDQwNywyMDQwOSwyMDQxMSwyMDQxMiwyMDQxMywyMDQxNCwyMDQxNiwyMDQxNywyMDQyMSwyMDQyMiwyMDQyNCwyMDQyNSwyMDQyNywyMDQyOCwyMDQyOSwyMDQzMSwyMDQzNCwyMDQ0NCwyMDQ0OCwyMDQ1MCwyMDQ2NCwyMDQ2NiwyMDQ3NiwyMDQ3NywyMDQ3OSwyMDQ4MCwyMDQ4MSwyMDQ4NCwyMDQ4NywyMDQ5MCwyMDQ5MiwyMDQ5NCwyMDQ5NiwyMDQ5OSwyMDUwMywyMDUwNCwyMDUwNywyMDUwOCwyMDUwOSwyMDUxMCwyMDUxNCwyMDUxOSwyMDUyNiwyMDUyOCwyMDUzMCwyMDUzMSwyMDUzMywyMDU0NCwyMDU0NSwyMDU0NiwyMDU0OSwyMDU1MCwyMDU1NCwyMDU1NiwyMDU1OCwyMDU2MSwyMDU2MiwyMDU2MywyMDU2NywyMDU2OSwyMDU3NSwyMDU3NiwyMDU3OCwyMDU3OSwyMDU4MiwyMDU4MywyMDU4NiwyMDU4OSwyMDU5MiwyMDU5MywyMDUzOSwyMDYwOSwyMDYxMSwyMDYxMiwyMDYxNCwyMDYxOCwyMDYyMiwyMDYyMywyMDYyNCwyMDYyNiwyMDYyNywyMDYyOCwyMDYzMCwyMDYzNSwyMDYzNiwyMDYzOCwyMDYzOSwyMDY0MCwyMDY0MSwyMDY0MiwyMDY1MCwyMDY1NSwyMDY1NiwyMDY2NSwyMDY2NiwyMDY2OSwyMDY3MiwyMDY3NSwyMDY3NiwyMDY3OSwyMDY4NCwyMDY4NiwyMDY4OCwyMDY5MSwyMDY5MiwyMDY5NiwyMDcwMCwyMDcwMSwyMDcwMywyMDcwNiwyMDcwOCwyMDcxMCwyMDcxMiwyMDcxMywyMDcxOSwyMDcyMSwyMDcyNiwyMDczMCwyMDczNCwyMDczOSwyMDc0MiwyMDc0MywyMDc0NCwyMDc0NywyMDc0OCwyMDc0OSwyMDc1MCwyMDcyMiwyMDc1MiwyMDc1OSwyMDc2MSwyMDc2MywyMDc2NCwyMDc2NSwyMDc2NiwyMDc3MSwyMDc3NSwyMDc3NiwyMDc4MCwyMDc4MSwyMDc4MywyMDc4NSwyMDc4NywyMDc4OCwyMDc4OSwyMDc5MiwyMDc5MywyMDgwMiwyMDgxMCwyMDgxNSwyMDgxOSwyMDgyMSwyMDgyMywyMDgyNCwyMDgzMSwyMDgzNiwyMDgzOCwyMDg2MiwyMDg2NywyMDg2OCwyMDg3NSwyMDg3OCwyMDg4OCwyMDg5MywyMDg5NywyMDg5OSwyMDkwOSwyMDkyMCwyMDkyMiwyMDkyNCwyMDkyNiwyMDkyNywyMDkzMCwyMDkzNiwyMDk0MywyMDk0NSwyMDk0NiwyMDk0NywyMDk0OSwyMDk1MiwyMDk1OCwyMDk2MiwyMDk2NSwyMDk3NCwyMDk3OCwyMDk3OSwyMDk4MCwyMDk4MywyMDk5MywyMDk5NCwyMDk5NywyMTAxMCwyMTAxMSwyMTAxMywyMTAxNCwyMTAxNiwyMTAyNiwyMTAzMiwyMTA0MSwyMTA0MiwyMTA0NSwyMTA1MiwyMTA2MSwyMTA2NSwyMTA3NywyMTA3OSwyMTA4MCwyMTA4MiwyMTA4NCwyMTA4NywyMTA4OCwyMTA4OSwyMTA5NCwyMTEwMiwyMTExMSwyMTExMiwyMTExMywyMTEyMCwyMTEyMiwyMTEyNSwyMTEzMCwyMTEzMiwyMTEzOSwyMTE0MSwyMTE0MiwyMTE0MywyMTE0NCwyMTE0NiwyMTE0OCwyMTE1NiwyMTE1NywyMTE1OCwyMTE1OSwyMTE2NywyMTE2OCwyMTE3NCwyMTE3NSwyMTE3NiwyMTE3OCwyMTE3OSwyMTE4MSwyMTE4NCwyMTE4OCwyMTE5MCwyMTE5MiwyMTE5NiwyMTE5OSwyMTIwMSwyMTIwNCwyMTIwNiwyMTIxMSwyMTIxMiwyMTIxNywyMTIyMSwyMTIyNCwyMTIyNSwyMTIyNiwyMTIyOCwyMTIzMiwyMTIzMywyMTIzNiwyMTIzOCwyMTIzOSwyMTI0OCwyMTI1MSwyMTI1OCwyMTI1OSwyMTI2MCwyMTI2NSwyMTI2NywyMTI3MiwyMTI3NSwyMTI3NiwyMTI3OCwyMTI3OSwyMTI4NSwyMTI4NywyMTI4OCwyMTI4OSwyMTI5MSwyMTI5MiwyMTI5MywyMTI5NiwyMTI5OCwyMTMwMSwyMTMwOCwyMTMwOSwyMTMxMCwyMTMxNCwyMTMyNCwyMTMyMywyMTMzNywyMTMzOSwyMTM0NSwyMTM0NywyMTM0OSwyMTM1NiwyMTM1NywyMTM2MiwyMTM2OSwyMTM3NCwyMTM3OSwyMTM4MywyMTM4NCwyMTM5MCwyMTM5NSwyMTM5NiwyMTQwMSwyMTQwNSwyMTQwOSwyMTQxMiwyMTQxOCwyMTQxOSwyMTQyMywyMTQyNiwyMTQyOCwyMTQyOSwyMTQzMSwyMTQzMiwyMTQzNCwyMTQzNywyMTQ0MCwyMTQ0NSwyMTQ1NSwyMTQ1OCwyMTQ1OSwyMTQ2MSwyMTQ2NiwyMTQ2OSwyMTQ3MCwyMTQ3MiwyMTQ3OCwyMTQ3OSwyMTQ5MywyMTUwNiwyMTUyMywyMTUzMCwyMTUzNywyMTU0MywyMTU0NCwyMTU0NiwyMTU1MSwyMTU1MywyMTU1NiwyMTU1NywyMTU3MSwyMTU3MiwyMTU3NSwyMTU4MSwyMTU4MywyMTU5OCwyMTYwMiwyMTYwNCwyMTYwNiwyMTYwNywyMTYwOSwyMTYxMSwyMTYxMywyMTYxNCwyMTYyMCwyMTYzMSwyMTYzMywyMTYzNSwyMTYzNywyMTY0MCwyMTY0MSwyMTY0NSwyMTY0OSwyMTY1MywyMTY1NCwyMTY2MCwyMTY2MywyMTY2NSwyMTY3MCwyMTY3MSwyMTY3MywyMTY3NCwyMTY3NywyMTY3OCwyMTY4MSwyMTY4NywyMTY4OSwyMTY5MCwyMTY5MSwyMTY5NSwyMTcwMiwyMTcwNiwyMTcwOSwyMTcxMCwyMTcyOCwyMTczOCwyMTc0MCwyMTc0MywyMTc1MCwyMTc1NiwyMTc1OCwyMTc1OSwyMTc2MCwyMTc2MSwyMTc2NSwyMTc2OCwyMTc2OSwyMTc3MiwyMTc3MywyMTc3NCwyMTc4MSwyMTgwMiwyMTgwMywyMTgxMCwyMTgxMywyMTgxNCwyMTgxOSwyMTgyMCwyMTgyMSwyMTgyNSwyMTgzMSwyMTgzMywyMTgzNCwyMTgzNywyMTg0MCwyMTg0MSwyMTg0OCwyMTg1MCwyMTg1MSwyMTg1NCwyMTg1NiwyMTg1NywyMTg2MCwyMTg2MiwyMTg4NywyMTg4OSwyMTg5MCwyMTg5NCwyMTg5NiwyMTkwMiwyMTkwMywyMTkwNSwyMTkwNiwyMTkwNywyMTkwOCwyMTkxMSwyMTkyMywyMTkyNCwyMTkzMywyMTkzOCwyMTk1MSwyMTk1MywyMTk1NSwyMTk1OCwyMTk2MSwyMTk2MywyMTk2NCwyMTk2NiwyMTk2OSwyMTk3MCwyMTk3MSwyMTk3NSwyMTk3NiwyMTk3OSwyMTk4MiwyMTk4NiwyMTk5MywyMjAwNiwyMjAxNSwyMjAyMSwyMjAyNCwyMjAyNiwyMjAyOSwyMjAzMCwyMjAzMSwyMjAzMiwyMjAzMywyMjAzNCwyMjA0MSwyMjA2MCwyMjA2NCwyMjA2NywyMjA2OSwyMjA3MSwyMjA3MywyMjA3NSwyMjA3NiwyMjA3NywyMjA3OSwyMjA4MCwyMjA4MSwyMjA4MywyMjA4NCwyMjA4NiwyMjA4OSwyMjA5MSwyMjA5MywyMjA5NSwyMjEwMCwyMjExMCwyMjExMiwyMjExMywyMjExNCwyMjExNSwyMjExOCwyMjEyMSwyMjEyNSwyMjEyNywyMjEyOSwyMjEzMCwyMjEzMywyMjE0OCwyMjE0OSwyMjE1MiwyMjE1NSwyMjE1NiwyMjE2NSwyMjE2OSwyMjE3MCwyMjE3MywyMjE3NCwyMjE3NSwyMjE4MiwyMjE4MywyMjE4NCwyMjE4NSwyMjE4NywyMjE4OCwyMjE4OSwyMjE5MywyMjE5NSwyMjE5OSwyMjIwNiwyMjIxMywyMjIxNywyMjIxOCwyMjIxOSwyMjIyMywyMjIyNCwyMjIyMCwyMjIyMSwyMjIzMywyMjIzNiwyMjIzNywyMjIzOSwyMjI0MSwyMjI0NCwyMjI0NSwyMjI0NiwyMjI0NywyMjI0OCwyMjI1NywyMjI1MSwyMjI1MywyMjI2MiwyMjI2MywyMjI3MywyMjI3NCwyMjI3OSwyMjI4MiwyMjI4NCwyMjI4OSwyMjI5MywyMjI5OCwyMjI5OSwyMjMwMSwyMjMwNCwyMjMwNiwyMjMwNywyMjMwOCwyMjMwOSwyMjMxMywyMjMxNCwyMjMxNiwyMjMxOCwyMjMxOSwyMjMyMywyMjMyNCwyMjMzMywyMjMzNCwyMjMzNSwyMjM0MSwyMjM0MiwyMjM0OCwyMjM0OSwyMjM1NCwyMjM3MCwyMjM3MywyMjM3NSwyMjM3NiwyMjM3OSwyMjM4MSwyMjM4MiwyMjM4MywyMjM4NCwyMjM4NSwyMjM4NywyMjM4OCwyMjM4OSwyMjM5MSwyMjM5MywyMjM5NCwyMjM5NSwyMjM5NiwyMjM5OCwyMjQwMSwyMjQwMywyMjQxMiwyMjQyMCwyMjQyMywyMjQyNSwyMjQyNiwyMjQyOCwyMjQyOSwyMjQzMCwyMjQzMSwyMjQzMywyMjQyMSwyMjQzOSwyMjQ0MCwyMjQ0MSwyMjQ0NCwyMjQ1NiwyMjQ2MSwyMjQ3MSwyMjQ3MiwyMjQ3NiwyMjQ3OSwyMjQ4NSwyMjQ5MywyMjQ5NCwyMjUwMCwyMjUwMiwyMjUwMywyMjUwNSwyMjUwOSwyMjUxMiwyMjUxNywyMjUxOCwyMjUyMCwyMjUyNSwyMjUyNiwyMjUyNywyMjUzMSwyMjUzMiwyMjUzNiwyMjUzNywyMjQ5NywyMjU0MCwyMjU0MSwyMjU1NSwyMjU1OCwyMjU1OSwyMjU2MCwyMjU2NiwyMjU2NywyMjU3MywyMjU3OCwyMjU4NSwyMjU5MSwyMjYwMSwyMjYwNCwyMjYwNSwyMjYwNywyMjYwOCwyMjYxMywyMjYyMywyMjYyNSwyMjYyOCwyMjYzMSwyMjYzMiwyMjY0OCwyMjY1MiwyMjY1NSwyMjY1NiwyMjY1NywyMjY2MywyMjY2NCwyMjY2NSwyMjY2NiwyMjY2OCwyMjY2OSwyMjY3MSwyMjY3MiwyMjY3NiwyMjY3OCwyMjY4NSwyMjY4OCwyMjY4OSwyMjY5MCwyMjY5NCwyMjY5NywyMjcwNSwyMjcwNiwyMjcyNCwyMjcxNiwyMjcyMiwyMjcyOCwyMjczMywyMjczNCwyMjczNiwyMjczOCwyMjc0MCwyMjc0MiwyMjc0NiwyMjc0OSwyMjc1MywyMjc1NCwyMjc2MSwyMjc3MSwyMjc4OSwyMjc5MCwyMjc5NSwyMjc5NiwyMjgwMiwyMjgwMywyMjgwNCwzNDM2OSwyMjgxMywyMjgxNywyMjgxOSwyMjgyMCwyMjgyNCwyMjgzMSwyMjgzMiwyMjgzNSwyMjgzNywyMjgzOCwyMjg0NywyMjg1MSwyMjg1NCwyMjg2NiwyMjg2NywyMjg3MywyMjg3NSwyMjg3NywyMjg3OCwyMjg3OSwyMjg4MSwyMjg4MywyMjg5MSwyMjg5MywyMjg5NSwyMjg5OCwyMjkwMSwyMjkwMiwyMjkwNSwyMjkwNywyMjkwOCwyMjkyMywyMjkyNCwyMjkyNiwyMjkzMCwyMjkzMywyMjkzNSwyMjk0MywyMjk0OCwyMjk1MSwyMjk1NywyMjk1OCwyMjk1OSwyMjk2MCwyMjk2MywyMjk2NywyMjk3MCwyMjk3MiwyMjk3NywyMjk3OSwyMjk4MCwyMjk4NCwyMjk4NiwyMjk4OSwyMjk5NCwyMzAwNSwyMzAwNiwyMzAwNywyMzAxMSwyMzAxMiwyMzAxNSwyMzAyMiwyMzAyMywyMzAyNSwyMzAyNiwyMzAyOCwyMzAzMSwyMzA0MCwyMzA0NCwyMzA1MiwyMzA1MywyMzA1NCwyMzA1OCwyMzA1OSwyMzA3MCwyMzA3NSwyMzA3NiwyMzA3OSwyMzA4MCwyMzA4MiwyMzA4NSwyMzA4OCwyMzEwOCwyMzEwOSwyMzExMSwyMzExMiwyMzExNiwyMzEyMCwyMzEyNSwyMzEzNCwyMzEzOSwyMzE0MSwyMzE0MywyMzE0OSwyMzE1OSwyMzE2MiwyMzE2MywyMzE2NiwyMzE3OSwyMzE4NCwyMzE4NywyMzE5MCwyMzE5MywyMzE5NiwyMzE5OCwyMzE5OSwyMzIwMCwyMzIwMiwyMzIwNywyMzIxMiwyMzIxNywyMzIxOCwyMzIxOSwyMzIyMSwyMzIyNCwyMzIyNiwyMzIyNywyMzIzMSwyMzIzNiwyMzIzOCwyMzI0MCwyMzI0NywyMzI1OCwyMzI2MCwyMzI2NCwyMzI2OSwyMzI3NCwyMzI3OCwyMzI4NSwyMzI4NiwyMzI5MywyMzI5NiwyMzI5NywyMzMwNCwyMzMxOSwyMzM0OCwyMzMyMSwyMzMyMywyMzMyNSwyMzMyOSwyMzMzMywyMzM0MSwyMzM1MiwyMzM2MSwyMzM3MSwyMzM3MiwyMzM3OCwyMzM4MiwyMzM5MCwyMzQwMCwyMzQwNiwyMzQwNywyMzQyMCwyMzQyMSwyMzQyMiwyMzQyMywyMzQyNSwyMzQyOCwyMzQzMCwyMzQzNCwyMzQzOCwyMzQ0MCwyMzQ0MSwyMzQ0MywyMzQ0NCwyMzQ0NiwyMzQ2NCwyMzQ2NSwyMzQ2OCwyMzQ2OSwyMzQ3MSwyMzQ3MywyMzQ3NCwyMzQ3OSwyMzQ4MiwyMzQ4NCwyMzQ4OCwyMzQ4OSwyMzUwMSwyMzUwMywyMzUxMCwyMzUxMSwyMzUxMiwyMzUxMywyMzUxNCwyMzUyMCwyMzUzNSwyMzUzNywyMzU0MCwyMzU0OSwyMzU2NCwyMzU3NSwyMzU4MiwyMzU4MywyMzU4NywyMzU5MCwyMzU5MywyMzU5NSwyMzU5NiwyMzU5OCwyMzYwMCwyMzYwMiwyMzYwNSwyMzYwNiwyMzY0MSwyMzY0MiwyMzY0NCwyMzY1MCwyMzY1MSwyMzY1NSwyMzY1NiwyMzY1NywyMzY2MSwyMzY2NCwyMzY2OCwyMzY2OSwyMzY3NCwyMzY3NSwyMzY3NiwyMzY3NywyMzY4NywyMzY4OCwyMzY5MCwyMzY5NSwyMzY5OCwyMzcwOSwyMzcxMSwyMzcxMiwyMzcxNCwyMzcxNSwyMzcxOCwyMzcyMiwyMzczMCwyMzczMiwyMzczMywyMzczOCwyMzc1MywyMzc1NSwyMzc2MiwyMzc3MywyMzc2NywyMzc5MCwyMzc5MywyMzc5NCwyMzc5NiwyMzgwOSwyMzgxNCwyMzgyMSwyMzgyNiwyMzg1MSwyMzg0MywyMzg0NCwyMzg0NiwyMzg0NywyMzg1NywyMzg2MCwyMzg2NSwyMzg2OSwyMzg3MSwyMzg3NCwyMzg3NSwyMzg3OCwyMzg4MCwyMzg5MywyMzg4OSwyMzg5NywyMzg4MiwyMzkwMywyMzkwNCwyMzkwNSwyMzkwNiwyMzkwOCwyMzkxNCwyMzkxNywyMzkyMCwyMzkyOSwyMzkzMCwyMzkzNCwyMzkzNSwyMzkzNywyMzkzOSwyMzk0NCwyMzk0NiwyMzk1NCwyMzk1NSwyMzk1NiwyMzk1NywyMzk2MSwyMzk2MywyMzk2NywyMzk2OCwyMzk3NSwyMzk3OSwyMzk4NCwyMzk4OCwyMzk5MiwyMzk5MywyNDAwMywyNDAwNywyNDAxMSwyNDAxNiwyNDAxNCwyNDAyNCwyNDAyNSwyNDAzMiwyNDAzNiwyNDA0MSwyNDA1NiwyNDA1NywyNDA2NCwyNDA3MSwyNDA3NywyNDA4MiwyNDA4NCwyNDA4NSwyNDA4OCwyNDA5NSwyNDA5NiwyNDExMCwyNDEwNCwyNDExNCwyNDExNywyNDEyNiwyNDEzOSwyNDE0NCwyNDEzNywyNDE0NSwyNDE1MCwyNDE1MiwyNDE1NSwyNDE1NiwyNDE1OCwyNDE2OCwyNDE3MCwyNDE3MSwyNDE3MiwyNDE3MywyNDE3NCwyNDE3NiwyNDE5MiwyNDIwMywyNDIwNiwyNDIyNiwyNDIyOCwyNDIyOSwyNDIzMiwyNDIzNCwyNDIzNiwyNDI0MSwyNDI0MywyNDI1MywyNDI1NCwyNDI1NSwyNDI2MiwyNDI2OCwyNDI2NywyNDI3MCwyNDI3MywyNDI3NCwyNDI3NiwyNDI3NywyNDI4NCwyNDI4NiwyNDI5MywyNDI5OSwyNDMyMiwyNDMyNiwyNDMyNywyNDMyOCwyNDMzNCwyNDM0NSwyNDM0OCwyNDM0OSwyNDM1MywyNDM1NCwyNDM1NSwyNDM1NiwyNDM2MCwyNDM2MywyNDM2NCwyNDM2NiwyNDM2OCwyNDM3MiwyNDM3NCwyNDM3OSwyNDM4MSwyNDM4MywyNDM4NCwyNDM4OCwyNDM4OSwyNDM5MSwyNDM5NywyNDQwMCwyNDQwNCwyNDQwOCwyNDQxMSwyNDQxNiwyNDQxOSwyNDQyMCwyNDQyMywyNDQzMSwyNDQzNCwyNDQzNiwyNDQzNywyNDQ0MCwyNDQ0MiwyNDQ0NSwyNDQ0NiwyNDQ1NywyNDQ2MSwyNDQ2MywyNDQ3MCwyNDQ3NiwyNDQ3NywyNDQ4MiwyNDQ4NywyNDQ5MSwyNDQ4NCwyNDQ5MiwyNDQ5NSwyNDQ5NiwyNDQ5NywyNDUwNCwyNDUxNiwyNDUxOSwyNDUyMCwyNDUyMSwyNDUyMywyNDUyOCwyNDUyOSwyNDUzMCwyNDUzMSwyNDUzMiwyNDU0MiwyNDU0NSwyNDU0NiwyNDU1MiwyNDU1MywyNDU1NCwyNDU1NiwyNDU1NywyNDU1OCwyNDU1OSwyNDU2MiwyNDU2MywyNDU2NiwyNDU3MCwyNDU3MiwyNDU4MywyNDU4NiwyNDU4OSwyNDU5NSwyNDU5NiwyNDU5OSwyNDYwMCwyNDYwMiwyNDYwNywyNDYxMiwyNDYyMSwyNDYyNywyNDYyOSwyNDY0MCwyNDY0NywyNDY0OCwyNDY0OSwyNDY1MiwyNDY1NywyNDY2MCwyNDY2MiwyNDY2MywyNDY2OSwyNDY3MywyNDY3OSwyNDY4OSwyNDcwMiwyNDcwMywyNDcwNiwyNDcxMCwyNDcxMiwyNDcxNCwyNDcxOCwyNDcyMSwyNDcyMywyNDcyNSwyNDcyOCwyNDczMywyNDczNCwyNDczOCwyNDc0MCwyNDc0MSwyNDc0NCwyNDc1MiwyNDc1MywyNDc1OSwyNDc2MywyNDc2NiwyNDc3MCwyNDc3MiwyNDc3NiwyNDc3NywyNDc3OCwyNDc3OSwyNDc4MiwyNDc4MywyNDc4OCwyNDc4OSwyNDc5MywyNDc5NSwyNDc5NywyNDc5OCwyNDgwMiwyNDgwNSwyNDgxOCwyNDgyMSwyNDgyNCwyNDgyOCwyNDgyOSwyNDgzNCwyNDgzOSwyNDg0MiwyNDg0NCwyNDg0OCwyNDg0OSwyNDg1MCwyNDg1MSwyNDg1MiwyNDg1NCwyNDg1NSwyNDg1NywyNDg2MCwyNDg2MiwyNDg2NiwyNDg3NCwyNDg3NSwyNDg4MCwyNDg4MSwyNDg4NSwyNDg4NiwyNDg4NywyNDg4OSwyNDg5NywyNDkwMSwyNDkwMiwyNDkwNSwyNDkyNiwyNDkyOCwyNDk0MCwyNDk0NiwyNDk1MiwyNDk1NSwyNDk1NiwyNDk1OSwyNDk2MCwyNDk2MSwyNDk2MywyNDk2NCwyNDk3MSwyNDk3MywyNDk3OCwyNDk3OSwyNDk4MywyNDk4NCwyNDk4OCwyNDk4OSwyNDk5MSwyNDk5MiwyNDk5NywyNTAwMCwyNTAwMiwyNTAwNSwyNTAxNiwyNTAxNywyNTAyMCwyNTAyNCwyNTAyNSwyNTAyNiwyNTAzOCwyNTAzOSwyNTA0NSwyNTA1MiwyNTA1MywyNTA1NCwyNTA1NSwyNTA1NywyNTA1OCwyNTA2MywyNTA2NSwyNTA2MSwyNTA2OCwyNTA2OSwyNTA3MSwyNTA4OSwyNTA5MSwyNTA5MiwyNTA5NSwyNTEwNywyNTEwOSwyNTExNiwyNTEyMCwyNTEyMiwyNTEyMywyNTEyNywyNTEyOSwyNTEzMSwyNTE0NSwyNTE0OSwyNTE1NCwyNTE1NSwyNTE1NiwyNTE1OCwyNTE2NCwyNTE2OCwyNTE2OSwyNTE3MCwyNTE3MiwyNTE3NCwyNTE3OCwyNTE4MCwyNTE4OCwyNTE5NywyNTE5OSwyNTIwMywyNTIxMCwyNTIxMywyNTIyOSwyNTIzMCwyNTIzMSwyNTIzMiwyNTI1NCwyNTI1NiwyNTI2NywyNTI3MCwyNTI3MSwyNTI3NCwyNTI3OCwyNTI3OSwyNTI4NCwyNTI5NCwyNTMwMSwyNTMwMiwyNTMwNiwyNTMyMiwyNTMzMCwyNTMzMiwyNTM0MCwyNTM0MSwyNTM0NywyNTM0OCwyNTM1NCwyNTM1NSwyNTM1NywyNTM2MCwyNTM2MywyNTM2NiwyNTM2OCwyNTM4NSwyNTM4NiwyNTM4OSwyNTM5NywyNTM5OCwyNTQwMSwyNTQwNCwyNTQwOSwyNTQxMCwyNTQxMSwyNTQxMiwyNTQxNCwyNTQxOCwyNTQxOSwyNTQyMiwyNTQyNiwyNTQyNywyNTQyOCwyNTQzMiwyNTQzNSwyNTQ0NSwyNTQ0NiwyNTQ1MiwyNTQ1MywyNTQ1NywyNTQ2MCwyNTQ2MSwyNTQ2NCwyNTQ2OCwyNTQ2OSwyNTQ3MSwyNTQ3NCwyNTQ3NiwyNTQ3OSwyNTQ4MiwyNTQ4OCwyNTQ5MiwyNTQ5MywyNTQ5NywyNTQ5OCwyNTUwMiwyNTUwOCwyNTUxMCwyNTUxNywyNTUxOCwyNTUxOSwyNTUzMywyNTUzNywyNTU0MSwyNTU0NCwyNTU1MCwyNTU1MywyNTU1NSwyNTU1NiwyNTU1NywyNTU2NCwyNTU2OCwyNTU3MywyNTU3OCwyNTU4MCwyNTU4NiwyNTU4NywyNTU4OSwyNTU5MiwyNTU5MywyNTYwOSwyNTYxMCwyNTYxNiwyNTYxOCwyNTYyMCwyNTYyNCwyNTYzMCwyNTYzMiwyNTYzNCwyNTYzNiwyNTYzNywyNTY0MSwyNTY0MiwyNTY0NywyNTY0OCwyNTY1MywyNTY2MSwyNTY2MywyNTY3NSwyNTY3OSwyNTY4MSwyNTY4MiwyNTY4MywyNTY4NCwyNTY5MCwyNTY5MSwyNTY5MiwyNTY5MywyNTY5NSwyNTY5NiwyNTY5NywyNTY5OSwyNTcwOSwyNTcxNSwyNTcxNiwyNTcyMywyNTcyNSwyNTczMywyNTczNSwyNTc0MywyNTc0NCwyNTc0NSwyNTc1MiwyNTc1MywyNTc1NSwyNTc1NywyNTc1OSwyNTc2MSwyNTc2MywyNTc2NiwyNTc2OCwyNTc3MiwyNTc3OSwyNTc4OSwyNTc5MCwyNTc5MSwyNTc5NiwyNTgwMSwyNTgwMiwyNTgwMywyNTgwNCwyNTgwNiwyNTgwOCwyNTgwOSwyNTgxMywyNTgxNSwyNTgyOCwyNTgyOSwyNTgzMywyNTgzNCwyNTgzNywyNTg0MCwyNTg0NSwyNTg0NywyNTg1MSwyNTg1NSwyNTg1NywyNTg2MCwyNTg2NCwyNTg2NSwyNTg2NiwyNTg3MSwyNTg3NSwyNTg3NiwyNTg3OCwyNTg4MSwyNTg4MywyNTg4NiwyNTg4NywyNTg5MCwyNTg5NCwyNTg5NywyNTkwMiwyNTkwNSwyNTkxNCwyNTkxNiwyNTkxNywyNTkyMywyNTkyNywyNTkyOSwyNTkzNiwyNTkzOCwyNTk0MCwyNTk1MSwyNTk1MiwyNTk1OSwyNTk2MywyNTk3OCwyNTk4MSwyNTk4NSwyNTk4OSwyNTk5NCwyNjAwMiwyNjAwNSwyNjAwOCwyNjAxMywyNjAxNiwyNjAxOSwyNjAyMiwyNjAzMCwyNjAzNCwyNjAzNSwyNjAzNiwyNjA0NywyNjA1MCwyNjA1NiwyNjA1NywyNjA2MiwyNjA2NCwyNjA2OCwyNjA3MCwyNjA3MiwyNjA3OSwyNjA5NiwyNjA5OCwyNjEwMCwyNjEwMSwyNjEwNSwyNjExMCwyNjExMSwyNjExMiwyNjExNiwyNjEyMCwyNjEyMSwyNjEyNSwyNjEyOSwyNjEzMCwyNjEzMywyNjEzNCwyNjE0MSwyNjE0MiwyNjE0NSwyNjE0NiwyNjE0NywyNjE0OCwyNjE1MCwyNjE1MywyNjE1NCwyNjE1NSwyNjE1NiwyNjE1OCwyNjE2MCwyNjE2MSwyNjE2MywyNjE2OSwyNjE2NywyNjE3NiwyNjE4MSwyNjE4MiwyNjE4NiwyNjE4OCwyNjE5MywyNjE5MCwyNjE5OSwyNjIwMCwyNjIwMSwyNjIwMywyNjIwNCwyNjIwOCwyNjIwOSwyNjM2MywyNjIxOCwyNjIxOSwyNjIyMCwyNjIzOCwyNjIyNywyNjIyOSwyNjIzOSwyNjIzMSwyNjIzMiwyNjIzMywyNjIzNSwyNjI0MCwyNjIzNiwyNjI1MSwyNjI1MiwyNjI1MywyNjI1NiwyNjI1OCwyNjI2NSwyNjI2NiwyNjI2NywyNjI2OCwyNjI3MSwyNjI3MiwyNjI3NiwyNjI4NSwyNjI4OSwyNjI5MCwyNjI5MywyNjI5OSwyNjMwMywyNjMwNCwyNjMwNiwyNjMwNywyNjMxMiwyNjMxNiwyNjMxOCwyNjMxOSwyNjMyNCwyNjMzMSwyNjMzNSwyNjM0NCwyNjM0NywyNjM0OCwyNjM1MCwyNjM2MiwyNjM3MywyNjM3NSwyNjM4MiwyNjM4NywyNjM5MywyNjM5NiwyNjQwMCwyNjQwMiwyNjQxOSwyNjQzMCwyNjQzNywyNjQzOSwyNjQ0MCwyNjQ0NCwyNjQ1MiwyNjQ1MywyNjQ2MSwyNjQ3MCwyNjQ3NiwyNjQ3OCwyNjQ4NCwyNjQ4NiwyNjQ5MSwyNjQ5NywyNjUwMCwyNjUxMCwyNjUxMSwyNjUxMywyNjUxNSwyNjUxOCwyNjUyMCwyNjUyMSwyNjUyMywyNjU0NCwyNjU0NSwyNjU0NiwyNjU0OSwyNjU1NSwyNjU1NiwyNjU1NywyNjYxNywyNjU2MCwyNjU2MiwyNjU2MywyNjU2NSwyNjU2OCwyNjU2OSwyNjU3OCwyNjU4MywyNjU4NSwyNjU4OCwyNjU5MywyNjU5OCwyNjYwOCwyNjYxMCwyNjYxNCwyNjYxNSwyNjcwNiwyNjY0NCwyNjY0OSwyNjY1MywyNjY1NSwyNjY2NCwyNjY2MywyNjY2OCwyNjY2OSwyNjY3MSwyNjY3MiwyNjY3MywyNjY3NSwyNjY4MywyNjY4NywyNjY5MiwyNjY5MywyNjY5OCwyNjcwMCwyNjcwOSwyNjcxMSwyNjcxMiwyNjcxNSwyNjczMSwyNjczNCwyNjczNSwyNjczNiwyNjczNywyNjczOCwyNjc0MSwyNjc0NSwyNjc0NiwyNjc0NywyNjc0OCwyNjc1NCwyNjc1NiwyNjc1OCwyNjc2MCwyNjc3NCwyNjc3NiwyNjc3OCwyNjc4MCwyNjc4NSwyNjc4NywyNjc4OSwyNjc5MywyNjc5NCwyNjc5OCwyNjgwMiwyNjgxMSwyNjgyMSwyNjgyNCwyNjgyOCwyNjgzMSwyNjgzMiwyNjgzMywyNjgzNSwyNjgzOCwyNjg0MSwyNjg0NCwyNjg0NSwyNjg1MywyNjg1NiwyNjg1OCwyNjg1OSwyNjg2MCwyNjg2MSwyNjg2NCwyNjg2NSwyNjg2OSwyNjg3MCwyNjg3NSwyNjg3NiwyNjg3NywyNjg4NiwyNjg4OSwyNjg5MCwyNjg5NiwyNjg5NywyNjg5OSwyNjkwMiwyNjkwMywyNjkyOSwyNjkzMSwyNjkzMywyNjkzNiwyNjkzOSwyNjk0NiwyNjk0OSwyNjk1MywyNjk1OCwyNjk2NywyNjk3MSwyNjk3OSwyNjk4MCwyNjk4MSwyNjk4MiwyNjk4NCwyNjk4NSwyNjk4OCwyNjk5MiwyNjk5MywyNjk5NCwyNzAwMiwyNzAwMywyNzAwNywyNzAwOCwyNzAyMSwyNzAyNiwyNzAzMCwyNzAzMiwyNzA0MSwyNzA0NSwyNzA0NiwyNzA0OCwyNzA1MSwyNzA1MywyNzA1NSwyNzA2MywyNzA2NCwyNzA2NiwyNzA2OCwyNzA3NywyNzA4MCwyNzA4OSwyNzA5NCwyNzA5NSwyNzEwNiwyNzEwOSwyNzExOCwyNzExOSwyNzEyMSwyNzEyMywyNzEyNSwyNzEzNCwyNzEzNiwyNzEzNywyNzEzOSwyNzE1MSwyNzE1MywyNzE1NywyNzE2MiwyNzE2NSwyNzE2OCwyNzE3MiwyNzE3NiwyNzE4NCwyNzE4NiwyNzE4OCwyNzE5MSwyNzE5NSwyNzE5OCwyNzE5OSwyNzIwNSwyNzIwNiwyNzIwOSwyNzIxMCwyNzIxNCwyNzIxNiwyNzIxNywyNzIxOCwyNzIyMSwyNzIyMiwyNzIyNywyNzIzNiwyNzIzOSwyNzI0MiwyNzI0OSwyNzI1MSwyNzI2MiwyNzI2NSwyNzI2NywyNzI3MCwyNzI3MSwyNzI3MywyNzI3NSwyNzI4MSwyNzI5MSwyNzI5MywyNzI5NCwyNzI5NSwyNzMwMSwyNzMwNywyNzMxMSwyNzMxMiwyNzMxMywyNzMxNiwyNzMyNSwyNzMyNiwyNzMyNywyNzMzNCwyNzMzNywyNzMzNiwyNzM0MCwyNzM0NCwyNzM0OCwyNzM0OSwyNzM1MCwyNzM1NiwyNzM1NywyNzM2NCwyNzM2NywyNzM3MiwyNzM3NiwyNzM3NywyNzM3OCwyNzM4OCwyNzM4OSwyNzM5NCwyNzM5NSwyNzM5OCwyNzM5OSwyNzQwMSwyNzQwNywyNzQwOCwyNzQwOSwyNzQxNSwyNzQxOSwyNzQyMiwyNzQyOCwyNzQzMiwyNzQzNSwyNzQzNiwyNzQzOSwyNzQ0NSwyNzQ0NiwyNzQ1MSwyNzQ1NSwyNzQ2MiwyNzQ2NiwyNzQ2OSwyNzQ3NCwyNzQ3OCwyNzQ4MCwyNzQ4NSwyNzQ4OCwyNzQ5NSwyNzQ5OSwyNzUwMiwyNzUwNCwyNzUwOSwyNzUxNywyNzUxOCwyNzUyMiwyNzUyNSwyNzU0MywyNzU0NywyNzU1MSwyNzU1MiwyNzU1NCwyNzU1NSwyNzU2MCwyNzU2MSwyNzU2NCwyNzU2NSwyNzU2NiwyNzU2OCwyNzU3NiwyNzU3NywyNzU4MSwyNzU4MiwyNzU4NywyNzU4OCwyNzU5MywyNzU5NiwyNzYwNiwyNzYxMCwyNzYxNywyNzYxOSwyNzYyMiwyNzYyMywyNzYzMCwyNzYzMywyNzYzOSwyNzY0MSwyNzY0NywyNzY1MCwyNzY1MiwyNzY1MywyNzY1NywyNzY2MSwyNzY2MiwyNzY2NCwyNzY2NiwyNzY3MywyNzY3OSwyNzY4NiwyNzY4NywyNzY4OCwyNzY5MiwyNzY5NCwyNzY5OSwyNzcwMSwyNzcwMiwyNzcwNiwyNzcwNywyNzcxMSwyNzcyMiwyNzcyMywyNzcyNSwyNzcyNywyNzczMCwyNzczMiwyNzczNywyNzczOSwyNzc0MCwyNzc1NSwyNzc1NywyNzc1OSwyNzc2NCwyNzc2NiwyNzc2OCwyNzc2OSwyNzc3MSwyNzc4MSwyNzc4MiwyNzc4MywyNzc4NSwyNzc5NiwyNzc5NywyNzc5OSwyNzgwMCwyNzgwNCwyNzgwNywyNzgyNCwyNzgyNiwyNzgyOCwyNzg0MiwyNzg0NiwyNzg1MywyNzg1NSwyNzg1NiwyNzg1NywyNzg1OCwyNzg2MCwyNzg2MiwyNzg2NiwyNzg2OCwyNzg3MiwyNzg3OSwyNzg4MSwyNzg4MywyNzg4NCwyNzg4NiwyNzg5MCwyNzg5MiwyNzkwOCwyNzkxMSwyNzkxNCwyNzkxOCwyNzkxOSwyNzkyMSwyNzkyMywyNzkzMCwyNzk0MiwyNzk0MywyNzk0NCwyNzc1MSwyNzk1MCwyNzk1MSwyNzk1MywyNzk2MSwyNzk2NCwyNzk2NywyNzk5MSwyNzk5OCwyNzk5OSwyODAwMSwyODAwNSwyODAwNywyODAxNSwyODAxNiwyODAyOCwyODAzNCwyODAzOSwyODA0OSwyODA1MCwyODA1MiwyODA1NCwyODA1NSwyODA1NiwyODA3NCwyODA3NiwyODA4NCwyODA4NywyODA4OSwyODA5MywyODA5NSwyODEwMCwyODEwNCwyODEwNiwyODExMCwyODExMSwyODExOCwyODEyMywyODEyNSwyODEyNywyODEyOCwyODEzMCwyODEzMywyODEzNywyODE0MywyODE0NCwyODE0OCwyODE1MCwyODE1NiwyODE2MCwyODE2NCwyODE5MCwyODE5NCwyODE5OSwyODIxMCwyODIxNCwyODIxNywyODIxOSwyODIyMCwyODIyOCwyODIyOSwyODIzMiwyODIzMywyODIzNSwyODIzOSwyODI0MSwyODI0MiwyODI0MywyODI0NCwyODI0NywyODI1MiwyODI1MywyODI1NCwyODI1OCwyODI1OSwyODI2NCwyODI3NSwyODI4MywyODI4NSwyODMwMSwyODMwNywyODMxMywyODMyMCwyODMyNywyODMzMywyODMzNCwyODMzNywyODMzOSwyODM0NywyODM1MSwyODM1MiwyODM1MywyODM1NSwyODM1OSwyODM2MCwyODM2MiwyODM2NSwyODM2NiwyODM2NywyODM5NSwyODM5NywyODM5OCwyODQwOSwyODQxMSwyODQxMywyODQyMCwyODQyNCwyODQyNiwyODQyOCwyODQyOSwyODQzOCwyODQ0MCwyODQ0MiwyODQ0MywyODQ1NCwyODQ1NywyODQ1OCwyODQ2MywyODQ2NCwyODQ2NywyODQ3MCwyODQ3NSwyODQ3NiwyODQ2MSwyODQ5NSwyODQ5NywyODQ5OCwyODQ5OSwyODUwMywyODUwNSwyODUwNiwyODUwOSwyODUxMCwyODUxMywyODUxNCwyODUyMCwyODUyNCwyODU0MSwyODU0MiwyODU0NywyODU1MSwyODU1MiwyODU1NSwyODU1NiwyODU1NywyODU2MCwyODU2MiwyODU2MywyODU2NCwyODU2NiwyODU3MCwyODU3NSwyODU3NiwyODU4MSwyODU4MiwyODU4MywyODU4NCwyODU5MCwyODU5MSwyODU5MiwyODU5NywyODU5OCwyODYwNCwyODYxMywyODYxNSwyODYxNiwyODYxOCwyODYzNCwyODYzOCwyODY0OCwyODY0OSwyODY1NiwyODY2MSwyODY2NSwyODY2OCwyODY2OSwyODY3MiwyODY3NywyODY3OCwyODY3OSwyODY4NSwyODY5NSwyODcwNCwyODcwNywyODcxOSwyODcyNCwyODcyNywyODcyOSwyODczMiwyODczOSwyODc0MCwyODc0NCwyODc0NSwyODc0NiwyODc0NywyODc1NiwyODc1NywyODc2NSwyODc2NiwyODc1MCwyODc3MiwyODc3MywyODc4MCwyODc4MiwyODc4OSwyODc5MCwyODc5OCwyODgwMSwyODgwNSwyODgwNiwyODgyMCwyODgyMSwyODgyMiwyODgyMywyODgyNCwyODgyNywyODgzNiwyODg0MywyODg0OCwyODg0OSwyODg1MiwyODg1NSwyODg3NCwyODg4MSwyODg4MywyODg4NCwyODg4NSwyODg4NiwyODg4OCwyODg5MiwyODkwMCwyODkyMiwyODkzMSwyODkzMiwyODkzMywyODkzNCwyODkzNSwyODkzOSwyODk0MCwyODk0MywyODk1OCwyODk2MCwyODk3MSwyODk3MywyODk3NSwyODk3NiwyODk3NywyODk4NCwyODk5MywyODk5NywyODk5OCwyODk5OSwyOTAwMiwyOTAwMywyOTAwOCwyOTAxMCwyOTAxNSwyOTAxOCwyOTAyMCwyOTAyMiwyOTAyNCwyOTAzMiwyOTA0OSwyOTA1NiwyOTA2MSwyOTA2MywyOTA2OCwyOTA3NCwyOTA4MiwyOTA4MywyOTA4OCwyOTA5MCwyOTEwMywyOTEwNCwyOTEwNiwyOTEwNywyOTExNCwyOTExOSwyOTEyMCwyOTEyMSwyOTEyNCwyOTEzMSwyOTEzMiwyOTEzOSwyOTE0MiwyOTE0NSwyOTE0NiwyOTE0OCwyOTE3NiwyOTE4MiwyOTE4NCwyOTE5MSwyOTE5MiwyOTE5MywyOTIwMywyOTIwNywyOTIxMCwyOTIxMywyOTIxNSwyOTIyMCwyOTIyNywyOTIzMSwyOTIzNiwyOTI0MCwyOTI0MSwyOTI0OSwyOTI1MCwyOTI1MSwyOTI1MywyOTI2MiwyOTI2MywyOTI2NCwyOTI2NywyOTI2OSwyOTI3MCwyOTI3NCwyOTI3NiwyOTI3OCwyOTI4MCwyOTI4MywyOTI4OCwyOTI5MSwyOTI5NCwyOTI5NSwyOTI5NywyOTMwMywyOTMwNCwyOTMwNywyOTMwOCwyOTMxMSwyOTMxNiwyOTMyMSwyOTMyNSwyOTMyNiwyOTMzMSwyOTMzOSwyOTM1MiwyOTM1NywyOTM1OCwyOTM2MSwyOTM2NCwyOTM3NCwyOTM3NywyOTM4MywyOTM4NSwyOTM4OCwyOTM5NywyOTM5OCwyOTQwMCwyOTQwNywyOTQxMywyOTQyNywyOTQyOCwyOTQzNCwyOTQzNSwyOTQzOCwyOTQ0MiwyOTQ0NCwyOTQ0NSwyOTQ0NywyOTQ1MSwyOTQ1MywyOTQ1OCwyOTQ1OSwyOTQ2NCwyOTQ2NSwyOTQ3MCwyOTQ3NCwyOTQ3NiwyOTQ3OSwyOTQ4MCwyOTQ4NCwyOTQ4OSwyOTQ5MCwyOTQ5MywyOTQ5OCwyOTQ5OSwyOTUwMSwyOTUwNywyOTUxNywyOTUyMCwyOTUyMiwyOTUyNiwyOTUyOCwyOTUzMywyOTUzNCwyOTUzNSwyOTUzNiwyOTU0MiwyOTU0MywyOTU0NSwyOTU0NywyOTU0OCwyOTU1MCwyOTU1MSwyOTU1MywyOTU1OSwyOTU2MSwyOTU2NCwyOTU2OCwyOTU2OSwyOTU3MSwyOTU3MywyOTU3NCwyOTU4MiwyOTU4NCwyOTU4NywyOTU4OSwyOTU5MSwyOTU5MiwyOTU5NiwyOTU5OCwyOTU5OSwyOTYwMCwyOTYwMiwyOTYwNSwyOTYwNiwyOTYxMCwyOTYxMSwyOTYxMywyOTYyMSwyOTYyMywyOTYyNSwyOTYyOCwyOTYyOSwyOTYzMSwyOTYzNywyOTYzOCwyOTY0MSwyOTY0MywyOTY0NCwyOTY0NywyOTY1MCwyOTY1MSwyOTY1NCwyOTY1NywyOTY2MSwyOTY2NSwyOTY2NywyOTY3MCwyOTY3MSwyOTY3MywyOTY4NCwyOTY4NSwyOTY4NywyOTY4OSwyOTY5MCwyOTY5MSwyOTY5MywyOTY5NSwyOTY5NiwyOTY5NywyOTcwMCwyOTcwMywyOTcwNiwyOTcxMywyOTcyMiwyOTcyMywyOTczMiwyOTczNCwyOTczNiwyOTczNywyOTczOCwyOTczOSwyOTc0MCwyOTc0MSwyOTc0MiwyOTc0MywyOTc0NCwyOTc0NSwyOTc1MywyOTc2MCwyOTc2MywyOTc2NCwyOTc2NiwyOTc2NywyOTc3MSwyOTc3MywyOTc3NywyOTc3OCwyOTc4MywyOTc4OSwyOTc5NCwyOTc5OCwyOTc5OSwyOTgwMCwyOTgwMywyOTgwNSwyOTgwNiwyOTgwOSwyOTgxMCwyOTgyNCwyOTgyNSwyOTgyOSwyOTgzMCwyOTgzMSwyOTgzMywyOTgzOSwyOTg0MCwyOTg0MSwyOTg0MiwyOTg0OCwyOTg0OSwyOTg1MCwyOTg1MiwyOTg1NSwyOTg1NiwyOTg1NywyOTg1OSwyOTg2MiwyOTg2NCwyOTg2NSwyOTg2NiwyOTg2NywyOTg3MCwyOTg3MSwyOTg3MywyOTg3NCwyOTg3NywyOTg4MSwyOTg4MywyOTg4NywyOTg5NiwyOTg5NywyOTkwMCwyOTkwNCwyOTkwNywyOTkxMiwyOTkxNCwyOTkxNSwyOTkxOCwyOTkxOSwyOTkyNCwyOTkyOCwyOTkzMCwyOTkzMSwyOTkzNSwyOTk0MCwyOTk0NiwyOTk0NywyOTk0OCwyOTk1MSwyOTk1OCwyOTk3MCwyOTk3NCwyOTk3NSwyOTk4NCwyOTk4NSwyOTk4OCwyOTk5MSwyOTk5MywyOTk5NCwyOTk5OSwzMDAwNiwzMDAwOSwzMDAxMywzMDAxNCwzMDAxNSwzMDAxNiwzMDAxOSwzMDAyMywzMDAyNCwzMDAzMCwzMDAzMiwzMDAzNCwzMDAzOSwzMDA0NiwzMDA0NywzMDA0OSwzMDA2MywzMDA2NSwzMDA3MywzMDA3NCwzMDA3NSwzMDA3NiwzMDA3NywzMDA3OCwzMDA4MSwzMDA4NSwzMDA5NiwzMDA5OCwzMDA5OSwzMDEwMSwzMDEwNSwzMDEwOCwzMDExNCwzMDExNiwzMDEzMiwzMDEzOCwzMDE0MywzMDE0NCwzMDE0NSwzMDE0OCwzMDE1MCwzMDE1NiwzMDE1OCwzMDE1OSwzMDE2NywzMDE3MiwzMDE3NSwzMDE3NiwzMDE3NywzMDE4MCwzMDE4MywzMDE4OCwzMDE5MCwzMDE5MSwzMDE5MywzMDIwMSwzMDIwOCwzMDIxMCwzMDIxMSwzMDIxMiwzMDIxNSwzMDIxNiwzMDIxOCwzMDIyMCwzMDIyMywzMDIyNiwzMDIyNywzMDIyOSwzMDIzMCwzMDIzMywzMDIzNSwzMDIzNiwzMDIzNywzMDIzOCwzMDI0MywzMDI0NSwzMDI0NiwzMDI0OSwzMDI1MywzMDI1OCwzMDI1OSwzMDI2MSwzMDI2NCwzMDI2NSwzMDI2NiwzMDI2OCwzMDI4MiwzMDI3MiwzMDI3MywzMDI3NSwzMDI3NiwzMDI3NywzMDI4MSwzMDI4MywzMDI5MywzMDI5NywzMDMwMywzMDMwOCwzMDMwOSwzMDMxNywzMDMxOCwzMDMxOSwzMDMyMSwzMDMyNCwzMDMzNywzMDM0MSwzMDM0OCwzMDM0OSwzMDM1NywzMDM2MywzMDM2NCwzMDM2NSwzMDM2NywzMDM2OCwzMDM3MCwzMDM3MSwzMDM3MiwzMDM3MywzMDM3NCwzMDM3NSwzMDM3NiwzMDM3OCwzMDM4MSwzMDM5NywzMDQwMSwzMDQwNSwzMDQwOSwzMDQxMSwzMDQxMiwzMDQxNCwzMDQyMCwzMDQyNSwzMDQzMiwzMDQzOCwzMDQ0MCwzMDQ0NCwzMDQ0OCwzMDQ0OSwzMDQ1NCwzMDQ1NywzMDQ2MCwzMDQ2NCwzMDQ3MCwzMDQ3NCwzMDQ3OCwzMDQ4MiwzMDQ4NCwzMDQ4NSwzMDQ4NywzMDQ4OSwzMDQ5MCwzMDQ5MiwzMDQ5OCwzMDUwNCwzMDUwOSwzMDUxMCwzMDUxMSwzMDUxNiwzMDUxNywzMDUxOCwzMDUyMSwzMDUyNSwzMDUyNiwzMDUzMCwzMDUzMywzMDUzNCwzMDUzOCwzMDU0MSwzMDU0MiwzMDU0MywzMDU0NiwzMDU1MCwzMDU1MSwzMDU1NiwzMDU1OCwzMDU1OSwzMDU2MCwzMDU2MiwzMDU2NCwzMDU2NywzMDU3MCwzMDU3MiwzMDU3NiwzMDU3OCwzMDU3OSwzMDU4MCwzMDU4NiwzMDU4OSwzMDU5MiwzMDU5NiwzMDYwNCwzMDYwNSwzMDYxMiwzMDYxMywzMDYxNCwzMDYxOCwzMDYyMywzMDYyNiwzMDYzMSwzMDYzNCwzMDYzOCwzMDYzOSwzMDY0MSwzMDY0NSwzMDY1NCwzMDY1OSwzMDY2NSwzMDY3MywzMDY3NCwzMDY3NywzMDY4MSwzMDY4NiwzMDY4NywzMDY4OCwzMDY5MiwzMDY5NCwzMDY5OCwzMDcwMCwzMDcwNCwzMDcwNSwzMDcwOCwzMDcxMiwzMDcxNSwzMDcyNSwzMDcyNiwzMDcyOSwzMDczMywzMDczNCwzMDczNywzMDc0OSwzMDc1MywzMDc1NCwzMDc1NSwzMDc2NSwzMDc2NiwzMDc2OCwzMDc3MywzMDc3NSwzMDc4NywzMDc4OCwzMDc5MSwzMDc5MiwzMDc5NiwzMDc5OCwzMDgwMiwzMDgxMiwzMDgxNCwzMDgxNiwzMDgxNywzMDgxOSwzMDgyMCwzMDgyNCwzMDgyNiwzMDgzMCwzMDg0MiwzMDg0NiwzMDg1OCwzMDg2MywzMDg2OCwzMDg3MiwzMDg4MSwzMDg3NywzMDg3OCwzMDg3OSwzMDg4NCwzMDg4OCwzMDg5MiwzMDg5MywzMDg5NiwzMDg5NywzMDg5OCwzMDg5OSwzMDkwNywzMDkwOSwzMDkxMSwzMDkxOSwzMDkyMCwzMDkyMSwzMDkyNCwzMDkyNiwzMDkzMCwzMDkzMSwzMDkzMywzMDkzNCwzMDk0OCwzMDkzOSwzMDk0MywzMDk0NCwzMDk0NSwzMDk1MCwzMDk1NCwzMDk2MiwzMDk2MywzMDk3NiwzMDk2NiwzMDk2NywzMDk3MCwzMDk3MSwzMDk3NSwzMDk4MiwzMDk4OCwzMDk5MiwzMTAwMiwzMTAwNCwzMTAwNiwzMTAwNywzMTAwOCwzMTAxMywzMTAxNSwzMTAxNywzMTAyMSwzMTAyNSwzMTAyOCwzMTAyOSwzMTAzNSwzMTAzNywzMTAzOSwzMTA0NCwzMTA0NSwzMTA0NiwzMTA1MCwzMTA1MSwzMTA1NSwzMTA1NywzMTA2MCwzMTA2NCwzMTA2NywzMTA2OCwzMTA3OSwzMTA4MSwzMTA4MywzMTA5MCwzMTA5NywzMTA5OSwzMTEwMCwzMTEwMiwzMTExNSwzMTExNiwzMTEyMSwzMTEyMywzMTEyNCwzMTEyNSwzMTEyNiwzMTEyOCwzMTEzMSwzMTEzMiwzMTEzNywzMTE0NCwzMTE0NSwzMTE0NywzMTE1MSwzMTE1MywzMTE1NiwzMTE2MCwzMTE2MywzMTE3MCwzMTE3MiwzMTE3NSwzMTE3NiwzMTE3OCwzMTE4MywzMTE4OCwzMTE5MCwzMTE5NCwzMTE5NywzMTE5OCwzMTIwMCwzMTIwMiwzMTIwNSwzMTIxMCwzMTIxMSwzMTIxMywzMTIxNywzMTIyNCwzMTIyOCwzMTIzNCwzMTIzNSwzMTIzOSwzMTI0MSwzMTI0MiwzMTI0NCwzMTI0OSwzMTI1MywzMTI1OSwzMTI2MiwzMTI2NSwzMTI3MSwzMTI3NSwzMTI3NywzMTI3OSwzMTI4MCwzMTI4NCwzMTI4NSwzMTI4OCwzMTI4OSwzMTI5MCwzMTMwMCwzMTMwMSwzMTMwMywzMTMwNCwzMTMwOCwzMTMxNywzMTMxOCwzMTMyMSwzMTMyNCwzMTMyNSwzMTMyNywzMTMyOCwzMTMzMywzMTMzNSwzMTMzOCwzMTM0MSwzMTM0OSwzMTM1MiwzMTM1OCwzMTM2MCwzMTM2MiwzMTM2NSwzMTM2NiwzMTM3MCwzMTM3MSwzMTM3NiwzMTM3NywzMTM4MCwzMTM5MCwzMTM5MiwzMTM5NSwzMTQwNCwzMTQxMSwzMTQxMywzMTQxNywzMTQxOSwzMTQyMCwzMTQzMCwzMTQzMywzMTQzNiwzMTQzOCwzMTQ0MSwzMTQ1MSwzMTQ2NCwzMTQ2NSwzMTQ2NywzMTQ2OCwzMTQ3MywzMTQ3NiwzMTQ4MywzMTQ4NSwzMTQ4NiwzMTQ5NSwzMTUwOCwzMTUxOSwzMTUyMywzMTUyNywzMTUyOSwzMTUzMCwzMTUzMSwzMTUzMywzMTUzNCwzMTUzNSwzMTUzNiwzMTUzNywzMTU0MCwzMTU0OSwzMTU1MSwzMTU1MiwzMTU1MywzMTU1OSwzMTU2NiwzMTU3MywzMTU4NCwzMTU4OCwzMTU5MCwzMTU5MywzMTU5NCwzMTU5NywzMTU5OSwzMTYwMiwzMTYwMywzMTYwNywzMTYyMCwzMTYyNSwzMTYzMCwzMTYzMiwzMTYzMywzMTYzOCwzMTY0MywzMTY0NiwzMTY0OCwzMTY1MywzMTY2MCwzMTY2MywzMTY2NCwzMTY2NiwzMTY2OSwzMTY3MCwzMTY3NCwzMTY3NSwzMTY3NiwzMTY3NywzMTY4MiwzMTY4NSwzMTY4OCwzMTY5MCwzMTcwMCwzMTcwMiwzMTcwMywzMTcwNSwzMTcwNiwzMTcwNywzMTcyMCwzMTcyMiwzMTczMCwzMTczMiwzMTczMywzMTczNiwzMTczNywzMTczOCwzMTc0MCwzMTc0MiwzMTc0NSwzMTc0NiwzMTc0NywzMTc0OCwzMTc1MCwzMTc1MywzMTc1NSwzMTc1NiwzMTc1OCwzMTc1OSwzMTc2OSwzMTc3MSwzMTc3NiwzMTc4MSwzMTc4MiwzMTc4NCwzMTc4OCwzMTc5MywzMTc5NSwzMTc5NiwzMTc5OCwzMTgwMSwzMTgwMiwzMTgxNCwzMTgxOCwzMTgyOSwzMTgyNSwzMTgyNiwzMTgyNywzMTgzMywzMTgzNCwzMTgzNSwzMTgzNiwzMTgzNywzMTgzOCwzMTg0MSwzMTg0MywzMTg0NywzMTg0OSwzMTg1MywzMTg1NCwzMTg1NiwzMTg1OCwzMTg2NSwzMTg2OCwzMTg2OSwzMTg3OCwzMTg3OSwzMTg4NywzMTg5MiwzMTkwMiwzMTkwNCwzMTkxMCwzMTkyMCwzMTkyNiwzMTkyNywzMTkzMCwzMTkzMSwzMTkzMiwzMTkzNSwzMTk0MCwzMTk0MywzMTk0NCwzMTk0NSwzMTk0OSwzMTk1MSwzMTk1NSwzMTk1NiwzMTk1NywzMTk1OSwzMTk2MSwzMTk2MiwzMTk2NSwzMTk3NCwzMTk3NywzMTk3OSwzMTk4OSwzMjAwMywzMjAwNywzMjAwOCwzMjAwOSwzMjAxNSwzMjAxNywzMjAxOCwzMjAxOSwzMjAyMiwzMjAyOSwzMjAzMCwzMjAzNSwzMjAzOCwzMjA0MiwzMjA0NSwzMjA0OSwzMjA2MCwzMjA2MSwzMjA2MiwzMjA2NCwzMjA2NSwzMjA3MSwzMjA3MiwzMjA3NywzMjA4MSwzMjA4MywzMjA4NywzMjA4OSwzMjA5MCwzMjA5MiwzMjA5MywzMjEwMSwzMjEwMywzMjEwNiwzMjExMiwzMjEyMCwzMjEyMiwzMjEyMywzMjEyNywzMjEyOSwzMjEzMCwzMjEzMSwzMjEzMywzMjEzNCwzMjEzNiwzMjEzOSwzMjE0MCwzMjE0MSwzMjE0NSwzMjE1MCwzMjE1MSwzMjE1NywzMjE1OCwzMjE2NiwzMjE2NywzMjE3MCwzMjE3OSwzMjE4MiwzMjE4MywzMjE4NSwzMjE5NCwzMjE5NSwzMjE5NiwzMjE5NywzMjE5OCwzMjIwNCwzMjIwNSwzMjIwNiwzMjIxNSwzMjIxNywzMjI1NiwzMjIyNiwzMjIyOSwzMjIzMCwzMjIzNCwzMjIzNSwzMjIzNywzMjI0MSwzMjI0NSwzMjI0NiwzMjI0OSwzMjI1MCwzMjI2NCwzMjI3MiwzMjI3MywzMjI3NywzMjI3OSwzMjI4NCwzMjI4NSwzMjI4OCwzMjI5NSwzMjI5NiwzMjMwMCwzMjMwMSwzMjMwMywzMjMwNywzMjMxMCwzMjMxOSwzMjMyNCwzMjMyNSwzMjMyNywzMjMzNCwzMjMzNiwzMjMzOCwzMjM0NCwzMjM1MSwzMjM1MywzMjM1NCwzMjM1NywzMjM2MywzMjM2NiwzMjM2NywzMjM3MSwzMjM3NiwzMjM4MiwzMjM4NSwzMjM5MCwzMjM5MSwzMjM5NCwzMjM5NywzMjQwMSwzMjQwNSwzMjQwOCwzMjQxMCwzMjQxMywzMjQxNCwzMjU3MiwzMjU3MSwzMjU3MywzMjU3NCwzMjU3NSwzMjU3OSwzMjU4MCwzMjU4MywzMjU5MSwzMjU5NCwzMjU5NSwzMjYwMywzMjYwNCwzMjYwNSwzMjYwOSwzMjYxMSwzMjYxMiwzMjYxMywzMjYxNCwzMjYyMSwzMjYyNSwzMjYzNywzMjYzOCwzMjYzOSwzMjY0MCwzMjY1MSwzMjY1MywzMjY1NSwzMjY1NiwzMjY1NywzMjY2MiwzMjY2MywzMjY2OCwzMjY3MywzMjY3NCwzMjY3OCwzMjY4MiwzMjY4NSwzMjY5MiwzMjcwMCwzMjcwMywzMjcwNCwzMjcwNywzMjcxMiwzMjcxOCwzMjcxOSwzMjczMSwzMjczNSwzMjczOSwzMjc0MSwzMjc0NCwzMjc0OCwzMjc1MCwzMjc1MSwzMjc1NCwzMjc2MiwzMjc2NSwzMjc2NiwzMjc2NywzMjc3NSwzMjc3NiwzMjc3OCwzMjc4MSwzMjc4MiwzMjc4MywzMjc4NSwzMjc4NywzMjc4OCwzMjc5MCwzMjc5NywzMjc5OCwzMjc5OSwzMjgwMCwzMjgwNCwzMjgwNiwzMjgxMiwzMjgxNCwzMjgxNiwzMjgyMCwzMjgyMSwzMjgyMywzMjgyNSwzMjgyNiwzMjgyOCwzMjgzMCwzMjgzMiwzMjgzNiwzMjg2NCwzMjg2OCwzMjg3MCwzMjg3NywzMjg4MSwzMjg4NSwzMjg5NywzMjkwNCwzMjkxMCwzMjkyNCwzMjkyNiwzMjkzNCwzMjkzNSwzMjkzOSwzMjk1MiwzMjk1MywzMjk2OCwzMjk3MywzMjk3NSwzMjk3OCwzMjk4MCwzMjk4MSwzMjk4MywzMjk4NCwzMjk5MiwzMzAwNSwzMzAwNiwzMzAwOCwzMzAxMCwzMzAxMSwzMzAxNCwzMzAxNywzMzAxOCwzMzAyMiwzMzAyNywzMzAzNSwzMzA0NiwzMzA0NywzMzA0OCwzMzA1MiwzMzA1NCwzMzA1NiwzMzA2MCwzMzA2MywzMzA2OCwzMzA3MiwzMzA3NywzMzA4MiwzMzA4NCwzMzA5MywzMzA5NSwzMzA5OCwzMzEwMCwzMzEwNiwzMzExMSwzMzEyMCwzMzEyMSwzMzEyNywzMzEyOCwzMzEyOSwzMzEzMywzMzEzNSwzMzE0MywzMzE1MywzMzE2OCwzMzE1NiwzMzE1NywzMzE1OCwzMzE2MywzMzE2NiwzMzE3NCwzMzE3NiwzMzE3OSwzMzE4MiwzMzE4NiwzMzE5OCwzMzIwMiwzMzIwNCwzMzIxMSwzMzIyNywzMzIxOSwzMzIyMSwzMzIyNiwzMzIzMCwzMzIzMSwzMzIzNywzMzIzOSwzMzI0MywzMzI0NSwzMzI0NiwzMzI0OSwzMzI1MiwzMzI1OSwzMzI2MCwzMzI2NCwzMzI2NSwzMzI2NiwzMzI2OSwzMzI3MCwzMzI3MiwzMzI3MywzMzI3NywzMzI3OSwzMzI4MCwzMzI4MywzMzI5NSwzMzI5OSwzMzMwMCwzMzMwNSwzMzMwNiwzMzMwOSwzMzMxMywzMzMxNCwzMzMyMCwzMzMzMCwzMzMzMiwzMzMzOCwzMzM0NywzMzM0OCwzMzM0OSwzMzM1MCwzMzM1NSwzMzM1OCwzMzM1OSwzMzM2MSwzMzM2NiwzMzM3MiwzMzM3NiwzMzM3OSwzMzM4MywzMzM4OSwzMzM5NiwzMzQwMywzMzQwNSwzMzQwNywzMzQwOCwzMzQwOSwzMzQxMSwzMzQxMiwzMzQxNSwzMzQxNywzMzQxOCwzMzQyMiwzMzQyNSwzMzQyOCwzMzQzMCwzMzQzMiwzMzQzNCwzMzQzNSwzMzQ0MCwzMzQ0MSwzMzQ0MywzMzQ0NCwzMzQ0NywzMzQ0OCwzMzQ0OSwzMzQ1MCwzMzQ1NCwzMzQ1NiwzMzQ1OCwzMzQ2MCwzMzQ2MywzMzQ2NiwzMzQ2OCwzMzQ3MCwzMzQ3MSwzMzQ3OCwzMzQ4OCwzMzQ5MywzMzQ5OCwzMzUwNCwzMzUwNiwzMzUwOCwzMzUxMiwzMzUxNCwzMzUxNywzMzUxOSwzMzUyNiwzMzUyNywzMzUzMywzMzUzNCwzMzUzNiwzMzUzNywzMzU0MywzMzU0NCwzMzU0NiwzMzU0NywzMzYyMCwzMzU2MywzMzU2NSwzMzU2NiwzMzU2NywzMzU2OSwzMzU3MCwzMzU4MCwzMzU4MSwzMzU4MiwzMzU4NCwzMzU4NywzMzU5MSwzMzU5NCwzMzU5NiwzMzU5NywzMzYwMiwzMzYwMywzMzYwNCwzMzYwNywzMzYxMywzMzYxNCwzMzYxNywzMzYyMSwzMzYyMiwzMzYyMywzMzY0OCwzMzY1NiwzMzY2MSwzMzY2MywzMzY2NCwzMzY2NiwzMzY2OCwzMzY3MCwzMzY3NywzMzY4MiwzMzY4NCwzMzY4NSwzMzY4OCwzMzY4OSwzMzY5MSwzMzY5MiwzMzY5MywzMzcwMiwzMzcwMywzMzcwNSwzMzcwOCwzMzcyNiwzMzcyNywzMzcyOCwzMzczNSwzMzczNywzMzc0MywzMzc0NCwzMzc0NSwzMzc0OCwzMzc1NywzMzYxOSwzMzc2OCwzMzc3MCwzMzc4MiwzMzc4NCwzMzc4NSwzMzc4OCwzMzc5MywzMzc5OCwzMzgwMiwzMzgwNywzMzgwOSwzMzgxMywzMzgxNywzMzcwOSwzMzgzOSwzMzg0OSwzMzg2MSwzMzg2MywzMzg2NCwzMzg2NiwzMzg2OSwzMzg3MSwzMzg3MywzMzg3NCwzMzg3OCwzMzg4MCwzMzg4MSwzMzg4MiwzMzg4NCwzMzg4OCwzMzg5MiwzMzg5MywzMzg5NSwzMzg5OCwzMzkwNCwzMzkwNywzMzkwOCwzMzkxMCwzMzkxMiwzMzkxNiwzMzkxNywzMzkyMSwzMzkyNSwzMzkzOCwzMzkzOSwzMzk0MSwzMzk1MCwzMzk1OCwzMzk2MCwzMzk2MSwzMzk2MiwzMzk2NywzMzk2OSwzMzk3MiwzMzk3OCwzMzk4MSwzMzk4MiwzMzk4NCwzMzk4NiwzMzk5MSwzMzk5MiwzMzk5NiwzMzk5OSwzNDAwMywzNDAxMiwzNDAyMywzNDAyNiwzNDAzMSwzNDAzMiwzNDAzMywzNDAzNCwzNDAzOSwzNDA5OCwzNDA0MiwzNDA0MywzNDA0NSwzNDA1MCwzNDA1MSwzNDA1NSwzNDA2MCwzNDA2MiwzNDA2NCwzNDA3NiwzNDA3OCwzNDA4MiwzNDA4MywzNDA4NCwzNDA4NSwzNDA4NywzNDA5MCwzNDA5MSwzNDA5NSwzNDA5OSwzNDEwMCwzNDEwMiwzNDExMSwzNDExOCwzNDEyNywzNDEyOCwzNDEyOSwzNDEzMCwzNDEzMSwzNDEzNCwzNDEzNywzNDE0MCwzNDE0MSwzNDE0MiwzNDE0MywzNDE0NCwzNDE0NSwzNDE0NiwzNDE0OCwzNDE1NSwzNDE1OSwzNDE2OSwzNDE3MCwzNDE3MSwzNDE3MywzNDE3NSwzNDE3NywzNDE4MSwzNDE4MiwzNDE4NSwzNDE4NywzNDE4OCwzNDE5MSwzNDE5NSwzNDIwMCwzNDIwNSwzNDIwNywzNDIwOCwzNDIxMCwzNDIxMywzNDIxNSwzNDIyOCwzNDIzMCwzNDIzMSwzNDIzMiwzNDIzNiwzNDIzNywzNDIzOCwzNDIzOSwzNDI0MiwzNDI0NywzNDI1MCwzNDI1MSwzNDI1NCwzNDIyMSwzNDI2NCwzNDI2NiwzNDI3MSwzNDI3MiwzNDI3OCwzNDI4MCwzNDI4NSwzNDI5MSwzNDI5NCwzNDMwMCwzNDMwMywzNDMwNCwzNDMwOCwzNDMwOSwzNDMxNywzNDMxOCwzNDMyMCwzNDMyMSwzNDMyMiwzNDMyOCwzNDMyOSwzNDMzMSwzNDMzNCwzNDMzNywzNDM0MywzNDM0NSwzNDM1OCwzNDM2MCwzNDM2MiwzNDM2NCwzNDM2NSwzNDM2OCwzNDM3MCwzNDM3NCwzNDM4NiwzNDM4NywzNDM5MCwzNDM5MSwzNDM5MiwzNDM5MywzNDM5NywzNDQwMCwzNDQwMSwzNDQwMiwzNDQwMywzNDQwNCwzNDQwOSwzNDQxMiwzNDQxNSwzNDQyMSwzNDQyMiwzNDQyMywzNDQyNiwzNDQ0NSwzNDQ0OSwzNDQ1NCwzNDQ1NiwzNDQ1OCwzNDQ2MCwzNDQ2NSwzNDQ3MCwzNDQ3MSwzNDQ3MiwzNDQ3NywzNDQ4MSwzNDQ4MywzNDQ4NCwzNDQ4NSwzNDQ4NywzNDQ4OCwzNDQ4OSwzNDQ5NSwzNDQ5NiwzNDQ5NywzNDQ5OSwzNDUwMSwzNDUxMywzNDUxNCwzNDUxNywzNDUxOSwzNDUyMiwzNDUyNCwzNDUyOCwzNDUzMSwzNDUzMywzNDUzNSwzNDQ0MCwzNDU1NCwzNDU1NiwzNDU1NywzNDU2NCwzNDU2NSwzNDU2NywzNDU3MSwzNDU3NCwzNDU3NSwzNDU3NiwzNDU3OSwzNDU4MCwzNDU4NSwzNDU5MCwzNDU5MSwzNDU5MywzNDU5NSwzNDYwMCwzNDYwNiwzNDYwNywzNDYwOSwzNDYxMCwzNDYxNywzNDYxOCwzNDYyMCwzNDYyMSwzNDYyMiwzNDYyNCwzNDYyNywzNDYyOSwzNDYzNywzNDY0OCwzNDY1MywzNDY1NywzNDY2MCwzNDY2MSwzNDY3MSwzNDY3MywzNDY3NCwzNDY4MywzNDY5MSwzNDY5MiwzNDY5MywzNDY5NCwzNDY5NSwzNDY5NiwzNDY5NywzNDY5OSwzNDcwMCwzNDcwNCwzNDcwNywzNDcwOSwzNDcxMSwzNDcxMiwzNDcxMywzNDcxOCwzNDcyMCwzNDcyMywzNDcyNywzNDczMiwzNDczMywzNDczNCwzNDczNywzNDc0MSwzNDc1MCwzNDc1MSwzNDc1MywzNDc2MCwzNDc2MSwzNDc2MiwzNDc2NiwzNDc3MywzNDc3NCwzNDc3NywzNDc3OCwzNDc4MCwzNDc4MywzNDc4NiwzNDc4NywzNDc4OCwzNDc5NCwzNDc5NSwzNDc5NywzNDgwMSwzNDgwMywzNDgwOCwzNDgxMCwzNDgxNSwzNDgxNywzNDgxOSwzNDgyMiwzNDgyNSwzNDgyNiwzNDgyNywzNDgzMiwzNDg0MSwzNDgzNCwzNDgzNSwzNDgzNiwzNDg0MCwzNDg0MiwzNDg0MywzNDg0NCwzNDg0NiwzNDg0NywzNDg1NiwzNDg2MSwzNDg2MiwzNDg2NCwzNDg2NiwzNDg2OSwzNDg3NCwzNDg3NiwzNDg4MSwzNDg4MywzNDg4NSwzNDg4OCwzNDg4OSwzNDg5MCwzNDg5MSwzNDg5NCwzNDg5NywzNDkwMSwzNDkwMiwzNDkwNCwzNDkwNiwzNDkwOCwzNDkxMSwzNDkxMiwzNDkxNiwzNDkyMSwzNDkyOSwzNDkzNywzNDkzOSwzNDk0NCwzNDk2OCwzNDk3MCwzNDk3MSwzNDk3MiwzNDk3NSwzNDk3NiwzNDk4NCwzNDk4NiwzNTAwMiwzNTAwNSwzNTAwNiwzNTAwOCwzNTAxOCwzNTAxOSwzNTAyMCwzNTAyMSwzNTAyMiwzNTAyNSwzNTAyNiwzNTAyNywzNTAzNSwzNTAzOCwzNTA0NywzNTA1NSwzNTA1NiwzNTA1NywzNTA2MSwzNTA2MywzNTA3MywzNTA3OCwzNTA4NSwzNTA4NiwzNTA4NywzNTA5MywzNTA5NCwzNTA5NiwzNTA5NywzNTA5OCwzNTEwMCwzNTEwNCwzNTExMCwzNTExMSwzNTExMiwzNTEyMCwzNTEyMSwzNTEyMiwzNTEyNSwzNTEyOSwzNTEzMCwzNTEzNCwzNTEzNiwzNTEzOCwzNTE0MSwzNTE0MiwzNTE0NSwzNTE1MSwzNTE1NCwzNTE1OSwzNTE2MiwzNTE2MywzNTE2NCwzNTE2OSwzNTE3MCwzNTE3MSwzNTE3OSwzNTE4MiwzNTE4NCwzNTE4NywzNTE4OSwzNTE5NCwzNTE5NSwzNTE5NiwzNTE5NywzNTIwOSwzNTIxMywzNTIxNiwzNTIyMCwzNTIyMSwzNTIyNywzNTIyOCwzNTIzMSwzNTIzMiwzNTIzNywzNTI0OCwzNTI1MiwzNTI1MywzNTI1NCwzNTI1NSwzNTI2MCwzNTI4NCwzNTI4NSwzNTI4NiwzNTI4NywzNTI4OCwzNTMwMSwzNTMwNSwzNTMwNywzNTMwOSwzNTMxMywzNTMxNSwzNTMxOCwzNTMyMSwzNTMyNSwzNTMyNywzNTMzMiwzNTMzMywzNTMzNSwzNTM0MywzNTM0NSwzNTM0NiwzNTM0OCwzNTM0OSwzNTM1OCwzNTM2MCwzNTM2MiwzNTM2NCwzNTM2NiwzNTM3MSwzNTM3MiwzNTM3NSwzNTM4MSwzNTM4MywzNTM4OSwzNTM5MCwzNTM5MiwzNTM5NSwzNTM5NywzNTM5OSwzNTQwMSwzNTQwNSwzNTQwNiwzNTQxMSwzNTQxNCwzNTQxNSwzNTQxNiwzNTQyMCwzNTQyMSwzNTQyNSwzNTQyOSwzNTQzMSwzNTQ0NSwzNTQ0NiwzNTQ0NywzNTQ0OSwzNTQ1MCwzNTQ1MSwzNTQ1NCwzNTQ1NSwzNTQ1NiwzNTQ1OSwzNTQ2MiwzNTQ2NywzNTQ3MSwzNTQ3MiwzNTQ3NCwzNTQ3OCwzNTQ3OSwzNTQ4MSwzNTQ4NywzNTQ5NSwzNTQ5NywzNTUwMiwzNTUwMywzNTUwNywzNTUxMCwzNTUxMSwzNTUxNSwzNTUxOCwzNTUyMywzNTUyNiwzNTUyOCwzNTUyOSwzNTUzMCwzNTUzNywzNTUzOSwzNTU0MCwzNTU0MSwzNTU0MywzNTU0OSwzNTU1MSwzNTU2NCwzNTU2OCwzNTU3MiwzNTU3MywzNTU3NCwzNTU4MCwzNTU4MywzNTU4OSwzNTU5MCwzNTU5NSwzNTYwMSwzNTYxMiwzNTYxNCwzNTYxNSwzNTU5NCwzNTYyOSwzNTYzMiwzNTYzOSwzNTY0NCwzNTY1MCwzNTY1MSwzNTY1MiwzNTY1MywzNTY1NCwzNTY1NiwzNTY2NiwzNTY2NywzNTY2OCwzNTY3MywzNTY2MSwzNTY3OCwzNTY4MywzNTY5MywzNTcwMiwzNTcwNCwzNTcwNSwzNTcwOCwzNTcxMCwzNTcxMywzNTcxNiwzNTcxNywzNTcyMywzNTcyNSwzNTcyNywzNTczMiwzNTczMywzNTc0MCwzNTc0MiwzNTc0MywzNTg5NiwzNTg5NywzNTkwMSwzNTkwMiwzNTkwOSwzNTkxMSwzNTkxMywzNTkxNSwzNTkxOSwzNTkyMSwzNTkyMywzNTkyNCwzNTkyNywzNTkyOCwzNTkzMSwzNTkzMywzNTkyOSwzNTkzOSwzNTk0MCwzNTk0MiwzNTk0NCwzNTk0NSwzNTk0OSwzNTk1NSwzNTk1NywzNTk1OCwzNTk2MywzNTk2NiwzNTk3NCwzNTk3NSwzNTk3OSwzNTk4NCwzNTk4NiwzNTk4NywzNTk5MywzNTk5NSwzNTk5NiwzNjAwNCwzNjAyNSwzNjAyNiwzNjAzNywzNjAzOCwzNjA0MSwzNjA0MywzNjA0NywzNjA1NCwzNjA1MywzNjA1NywzNjA2MSwzNjA2NSwzNjA3MiwzNjA3NiwzNjA3OSwzNjA4MCwzNjA4MiwzNjA4NSwzNjA4NywzNjA4OCwzNjA5NCwzNjA5NSwzNjA5NywzNjA5OSwzNjEwNSwzNjExNCwzNjExOSwzNjEyMywzNjE5NywzNjIwMSwzNjIwNCwzNjIwNiwzNjIyMywzNjIyNiwzNjIyOCwzNjIzMiwzNjIzNywzNjI0MCwzNjI0MSwzNjI0NSwzNjI1NCwzNjI1NSwzNjI1NiwzNjI2MiwzNjI2NywzNjI2OCwzNjI3MSwzNjI3NCwzNjI3NywzNjI3OSwzNjI4MSwzNjI4MywzNjI4OCwzNjI5MywzNjI5NCwzNjI5NSwzNjI5NiwzNjI5OCwzNjMwMiwzNjMwNSwzNjMwOCwzNjMwOSwzNjMxMSwzNjMxMywzNjMyNCwzNjMyNSwzNjMyNywzNjMzMiwzNjMzNiwzNjI4NCwzNjMzNywzNjMzOCwzNjM0MCwzNjM0OSwzNjM1MywzNjM1NiwzNjM1NywzNjM1OCwzNjM2MywzNjM2OSwzNjM3MiwzNjM3NCwzNjM4NCwzNjM4NSwzNjM4NiwzNjM4NywzNjM5MCwzNjM5MSwzNjQwMSwzNjQwMywzNjQwNiwzNjQwNywzNjQwOCwzNjQwOSwzNjQxMywzNjQxNiwzNjQxNywzNjQyNywzNjQyOSwzNjQzMCwzNjQzMSwzNjQzNiwzNjQ0MywzNjQ0NCwzNjQ0NSwzNjQ0NiwzNjQ0OSwzNjQ1MCwzNjQ1NywzNjQ2MCwzNjQ2MSwzNjQ2MywzNjQ2NCwzNjQ2NSwzNjQ3MywzNjQ3NCwzNjQ3NSwzNjQ4MiwzNjQ4MywzNjQ4OSwzNjQ5NiwzNjQ5OCwzNjUwMSwzNjUwNiwzNjUwNywzNjUwOSwzNjUxMCwzNjUxNCwzNjUxOSwzNjUyMSwzNjUyNSwzNjUyNiwzNjUzMSwzNjUzMywzNjUzOCwzNjUzOSwzNjU0NCwzNjU0NSwzNjU0NywzNjU0OCwzNjU1MSwzNjU1OSwzNjU2MSwzNjU2NCwzNjU3MiwzNjU4NCwzNjU5MCwzNjU5MiwzNjU5MywzNjU5OSwzNjYwMSwzNjYwMiwzNjU4OSwzNjYwOCwzNjYxMCwzNjYxNSwzNjYxNiwzNjYyMywzNjYyNCwzNjYzMCwzNjYzMSwzNjYzMiwzNjYzOCwzNjY0MCwzNjY0MSwzNjY0MywzNjY0NSwzNjY0NywzNjY0OCwzNjY1MiwzNjY1MywzNjY1NCwzNjY2MCwzNjY2MSwzNjY2MiwzNjY2MywzNjY2NiwzNjY3MiwzNjY3MywzNjY3NSwzNjY3OSwzNjY4NywzNjY4OSwzNjY5MCwzNjY5MSwzNjY5MiwzNjY5MywzNjY5NiwzNjcwMSwzNjcwMiwzNjcwOSwzNjc2NSwzNjc2OCwzNjc2OSwzNjc3MiwzNjc3MywzNjc3NCwzNjc4OSwzNjc5MCwzNjc5MiwzNjc5OCwzNjgwMCwzNjgwMSwzNjgwNiwzNjgxMCwzNjgxMSwzNjgxMywzNjgxNiwzNjgxOCwzNjgxOSwzNjgyMSwzNjgzMiwzNjgzNSwzNjgzNiwzNjg0MCwzNjg0NiwzNjg0OSwzNjg1MywzNjg1NCwzNjg1OSwzNjg2MiwzNjg2NiwzNjg2OCwzNjg3MiwzNjg3NiwzNjg4OCwzNjg5MSwzNjkwNCwzNjkwNSwzNjkxMSwzNjkwNiwzNjkwOCwzNjkwOSwzNjkxNSwzNjkxNiwzNjkxOSwzNjkyNywzNjkzMSwzNjkzMiwzNjk0MCwzNjk1NSwzNjk1NywzNjk2MiwzNjk2NiwzNjk2NywzNjk3MiwzNjk3NiwzNjk4MCwzNjk4NSwzNjk5NywzNzAwMCwzNzAwMywzNzAwNCwzNzAwNiwzNzAwOCwzNzAxMywzNzAxNSwzNzAxNiwzNzAxNywzNzAxOSwzNzAyNCwzNzAyNSwzNzAyNiwzNzAyOSwzNzA0MCwzNzA0MiwzNzA0MywzNzA0NCwzNzA0NiwzNzA1MywzNzA2OCwzNzA1NCwzNzA1OSwzNzA2MCwzNzA2MSwzNzA2MywzNzA2NCwzNzA3NywzNzA3OSwzNzA4MCwzNzA4MSwzNzA4NCwzNzA4NSwzNzA4NywzNzA5MywzNzA3NCwzNzExMCwzNzA5OSwzNzEwMywzNzEwNCwzNzEwOCwzNzExOCwzNzExOSwzNzEyMCwzNzEyNCwzNzEyNSwzNzEyNiwzNzEyOCwzNzEzMywzNzEzNiwzNzE0MCwzNzE0MiwzNzE0MywzNzE0NCwzNzE0NiwzNzE0OCwzNzE1MCwzNzE1MiwzNzE1NywzNzE1NCwzNzE1NSwzNzE1OSwzNzE2MSwzNzE2NiwzNzE2NywzNzE2OSwzNzE3MiwzNzE3NCwzNzE3NSwzNzE3NywzNzE3OCwzNzE4MCwzNzE4MSwzNzE4NywzNzE5MSwzNzE5MiwzNzE5OSwzNzIwMywzNzIwNywzNzIwOSwzNzIxMCwzNzIxMSwzNzIxNywzNzIyMCwzNzIyMywzNzIyOSwzNzIzNiwzNzI0MSwzNzI0MiwzNzI0MywzNzI0OSwzNzI1MSwzNzI1MywzNzI1NCwzNzI1OCwzNzI2MiwzNzI2NSwzNzI2NywzNzI2OCwzNzI2OSwzNzI3MiwzNzI3OCwzNzI4MSwzNzI4NiwzNzI4OCwzNzI5MiwzNzI5MywzNzI5NCwzNzI5NiwzNzI5NywzNzI5OCwzNzI5OSwzNzMwMiwzNzMwNywzNzMwOCwzNzMwOSwzNzMxMSwzNzMxNCwzNzMxNSwzNzMxNywzNzMzMSwzNzMzMiwzNzMzNSwzNzMzNywzNzMzOCwzNzM0MiwzNzM0OCwzNzM0OSwzNzM1MywzNzM1NCwzNzM1NiwzNzM1NywzNzM1OCwzNzM1OSwzNzM2MCwzNzM2MSwzNzM2NywzNzM2OSwzNzM3MSwzNzM3MywzNzM3NiwzNzM3NywzNzM4MCwzNzM4MSwzNzM4MiwzNzM4MywzNzM4NSwzNzM4NiwzNzM4OCwzNzM5MiwzNzM5NCwzNzM5NSwzNzM5OCwzNzQwMCwzNzQwNCwzNzQwNSwzNzQxMSwzNzQxMiwzNzQxMywzNzQxNCwzNzQxNiwzNzQyMiwzNzQyMywzNzQyNCwzNzQyNywzNzQyOSwzNzQzMCwzNzQzMiwzNzQzMywzNzQzNCwzNzQzNiwzNzQzOCwzNzQ0MCwzNzQ0MiwzNzQ0MywzNzQ0NiwzNzQ0NywzNzQ1MCwzNzQ1MywzNzQ1NCwzNzQ1NSwzNzQ1NywzNzQ2NCwzNzQ2NSwzNzQ2OCwzNzQ2OSwzNzQ3MiwzNzQ3MywzNzQ3NywzNzQ3OSwzNzQ4MCwzNzQ4MSwzNzQ4NiwzNzQ4NywzNzQ4OCwzNzQ5MywzNzQ5NCwzNzQ5NSwzNzQ5NiwzNzQ5NywzNzQ5OSwzNzUwMCwzNzUwMSwzNzUwMywzNzUxMiwzNzUxMywzNzUxNCwzNzUxNywzNzUxOCwzNzUyMiwzNzUyNywzNzUyOSwzNzUzNSwzNzUzNiwzNzU0MCwzNzU0MSwzNzU0MywzNzU0NCwzNzU0NywzNzU1MSwzNzU1NCwzNzU1OCwzNzU2MCwzNzU2MiwzNzU2MywzNzU2NCwzNzU2NSwzNzU2NywzNzU2OCwzNzU2OSwzNzU3MCwzNzU3MSwzNzU3MywzNzU3NCwzNzU3NSwzNzU3NiwzNzU3OSwzNzU4MCwzNzU4MSwzNzU4MiwzNzU4NCwzNzU4NywzNzU4OSwzNzU5MSwzNzU5MiwzNzU5MywzNzU5NiwzNzU5NywzNzU5OSwzNzYwMCwzNzYwMSwzNzYwMywzNzYwNSwzNzYwNywzNzYwOCwzNzYxMiwzNzYxNCwzNzYxNiwzNzYyNSwzNzYyNywzNzYzMSwzNzYzMiwzNzYzNCwzNzY0MCwzNzY0NSwzNzY0OSwzNzY1MiwzNzY1MywzNzY2MCwzNzY2MSwzNzY2MiwzNzY2MywzNzY2NSwzNzY2OCwzNzY2OSwzNzY3MSwzNzY3MywzNzY3NCwzNzY4MywzNzY4NCwzNzY4NiwzNzY4NywzNzcwMywzNzcwNCwzNzcwNSwzNzcxMiwzNzcxMywzNzcxNCwzNzcxNywzNzcxOSwzNzcyMCwzNzcyMiwzNzcyNiwzNzczMiwzNzczMywzNzczNSwzNzczNywzNzczOCwzNzc0MSwzNzc0MywzNzc0NCwzNzc0NSwzNzc0NywzNzc0OCwzNzc1MCwzNzc1NCwzNzc1NywzNzc1OSwzNzc2MCwzNzc2MSwzNzc2MiwzNzc2OCwzNzc3MCwzNzc3MSwzNzc3MywzNzc3NSwzNzc3OCwzNzc4MSwzNzc4NCwzNzc4NywzNzc5MCwzNzc5MywzNzc5NSwzNzc5NiwzNzc5OCwzNzgwMCwzNzgwMywzNzgxMiwzNzgxMywzNzgxNCwzNzgxOCwzNzgwMSwzNzgyNSwzNzgyOCwzNzgyOSwzNzgzMCwzNzgzMSwzNzgzMywzNzgzNCwzNzgzNSwzNzgzNiwzNzgzNywzNzg0MywzNzg0OSwzNzg1MiwzNzg1NCwzNzg1NSwzNzg1OCwzNzg2MiwzNzg2MywzNzg4MSwzNzg3OSwzNzg4MCwzNzg4MiwzNzg4MywzNzg4NSwzNzg4OSwzNzg5MCwzNzg5MiwzNzg5NiwzNzg5NywzNzkwMSwzNzkwMiwzNzkwMywzNzkwOSwzNzkxMCwzNzkxMSwzNzkxOSwzNzkzNCwzNzkzNSwzNzkzNywzNzkzOCwzNzkzOSwzNzk0MCwzNzk0NywzNzk1MSwzNzk0OSwzNzk1NSwzNzk1NywzNzk2MCwzNzk2MiwzNzk2NCwzNzk3MywzNzk3NywzNzk4MCwzNzk4MywzNzk4NSwzNzk4NywzNzk5MiwzNzk5NSwzNzk5NywzNzk5OCwzNzk5OSwzODAwMSwzODAwMiwzODAyMCwzODAxOSwzODI2NCwzODI2NSwzODI3MCwzODI3NiwzODI4MCwzODI4NCwzODI4NSwzODI4NiwzODMwMSwzODMwMiwzODMwMywzODMwNSwzODMxMCwzODMxMywzODMxNSwzODMxNiwzODMyNCwzODMyNiwzODMzMCwzODMzMywzODMzNSwzODM0MiwzODM0NCwzODM0NSwzODM0NywzODM1MiwzODM1MywzODM1NCwzODM1NSwzODM2MSwzODM2MiwzODM2NSwzODM2NiwzODM2NywzODM2OCwzODM3MiwzODM3NCwzODQyOSwzODQzMCwzODQzNCwzODQzNiwzODQzNywzODQzOCwzODQ0NCwzODQ0OSwzODQ1MSwzODQ1NSwzODQ1NiwzODQ1NywzODQ1OCwzODQ2MCwzODQ2MSwzODQ2NSwzODQ4MiwzODQ4NCwzODQ4NiwzODQ4NywzODQ4OCwzODQ5NywzODUxMCwzODUxNiwzODUyMywzODUyNCwzODUyNiwzODUyNywzODUyOSwzODUzMCwzODUzMSwzODUzMiwzODUzNywzODU0NSwzODU1MCwzODU1NCwzODU1NywzODU1OSwzODU2NCwzODU2NSwzODU2NiwzODU2OSwzODU3NCwzODU3NSwzODU3OSwzODU4NiwzODYwMiwzODYxMCwyMzk4NiwzODYxNiwzODYxOCwzODYyMSwzODYyMiwzODYyMywzODYzMywzODYzOSwzODY0MSwzODY1MCwzODY1OCwzODY1OSwzODY2MSwzODY2NSwzODY4MiwzODY4MywzODY4NSwzODY4OSwzODY5MCwzODY5MSwzODY5NiwzODcwNSwzODcwNywzODcyMSwzODcyMywzODczMCwzODczNCwzODczNSwzODc0MSwzODc0MywzODc0NCwzODc0NiwzODc0NywzODc1NSwzODc1OSwzODc2MiwzODc2NiwzODc3MSwzODc3NCwzODc3NSwzODc3NiwzODc3OSwzODc4MSwzODc4MywzODc4NCwzODc5MywzODgwNSwzODgwNiwzODgwNywzODgwOSwzODgxMCwzODgxNCwzODgxNSwzODgxOCwzODgyOCwzODgzMCwzODgzMywzODgzNCwzODgzNywzODgzOCwzODg0MCwzODg0MSwzODg0MiwzODg0NCwzODg0NiwzODg0NywzODg0OSwzODg1MiwzODg1MywzODg1NSwzODg1NywzODg1OCwzODg2MCwzODg2MSwzODg2MiwzODg2NCwzODg2NSwzODg2OCwzODg3MSwzODg3MiwzODg3MywzODg3NywzODg3OCwzODg4MCwzODg3NSwzODg4MSwzODg4NCwzODg5NSwzODg5NywzODkwMCwzODkwMywzODkwNCwzODkwNiwzODkxOSwzODkyMiwzODkzNywzODkyNSwzODkyNiwzODkzMiwzODkzNCwzODk0MCwzODk0MiwzODk0NCwzODk0NywzODk1MCwzODk1NSwzODk1OCwzODk1OSwzODk2MCwzODk2MiwzODk2MywzODk2NSwzODk0OSwzODk3NCwzODk4MCwzODk4MywzODk4NiwzODk5MywzODk5NCwzODk5NSwzODk5OCwzODk5OSwzOTAwMSwzOTAwMiwzOTAxMCwzOTAxMSwzOTAxMywzOTAxNCwzOTAxOCwzOTAyMCwzOTA4MywzOTA4NSwzOTA4NiwzOTA4OCwzOTA5MiwzOTA5NSwzOTA5NiwzOTA5OCwzOTA5OSwzOTEwMywzOTEwNiwzOTEwOSwzOTExMiwzOTExNiwzOTEzNywzOTEzOSwzOTE0MSwzOTE0MiwzOTE0MywzOTE0NiwzOTE1NSwzOTE1OCwzOTE3MCwzOTE3NSwzOTE3NiwzOTE4NSwzOTE4OSwzOTE5MCwzOTE5MSwzOTE5NCwzOTE5NSwzOTE5NiwzOTE5OSwzOTIwMiwzOTIwNiwzOTIwNywzOTIxMSwzOTIxNywzOTIxOCwzOTIxOSwzOTIyMCwzOTIyMSwzOTIyNSwzOTIyNiwzOTIyNywzOTIyOCwzOTIzMiwzOTIzMywzOTIzOCwzOTIzOSwzOTI0MCwzOTI0NSwzOTI0NiwzOTI1MiwzOTI1NiwzOTI1NywzOTI1OSwzOTI2MCwzOTI2MiwzOTI2MywzOTI2NCwzOTMyMywzOTMyNSwzOTMyNywzOTMzNCwzOTM0NCwzOTM0NSwzOTM0NiwzOTM0OSwzOTM1MywzOTM1NCwzOTM1NywzOTM1OSwzOTM2MywzOTM2OSwzOTM3OSwzOTM4MCwzOTM4NSwzOTM4NiwzOTM4OCwzOTM5MCwzOTM5OSwzOTQwMiwzOTQwMywzOTQwNCwzOTQwOCwzOTQxMiwzOTQxMywzOTQxNywzOTQyMSwzOTQyMiwzOTQyNiwzOTQyNywzOTQyOCwzOTQzNSwzOTQzNiwzOTQ0MCwzOTQ0MSwzOTQ0NiwzOTQ1NCwzOTQ1NiwzOTQ1OCwzOTQ1OSwzOTQ2MCwzOTQ2MywzOTQ2OSwzOTQ3MCwzOTQ3NSwzOTQ3NywzOTQ3OCwzOTQ4MCwzOTQ5NSwzOTQ4OSwzOTQ5MiwzOTQ5OCwzOTQ5OSwzOTUwMCwzOTUwMiwzOTUwNSwzOTUwOCwzOTUxMCwzOTUxNywzOTU5NCwzOTU5NiwzOTU5OCwzOTU5OSwzOTYwMiwzOTYwNCwzOTYwNSwzOTYwNiwzOTYwOSwzOTYxMSwzOTYxNCwzOTYxNSwzOTYxNywzOTYxOSwzOTYyMiwzOTYyNCwzOTYzMCwzOTYzMiwzOTYzNCwzOTYzNywzOTYzOCwzOTYzOSwzOTY0MywzOTY0NCwzOTY0OCwzOTY1MiwzOTY1MywzOTY1NSwzOTY1NywzOTY2MCwzOTY2NiwzOTY2NywzOTY2OSwzOTY3MywzOTY3NCwzOTY3NywzOTY3OSwzOTY4MCwzOTY4MSwzOTY4MiwzOTY4MywzOTY4NCwzOTY4NSwzOTY4OCwzOTY4OSwzOTY5MSwzOTY5MiwzOTY5MywzOTY5NCwzOTY5NiwzOTY5OCwzOTcwMiwzOTcwNSwzOTcwNywzOTcwOCwzOTcxMiwzOTcxOCwzOTcyMywzOTcyNSwzOTczMSwzOTczMiwzOTczMywzOTczNSwzOTczNywzOTczOCwzOTc0MSwzOTc1MiwzOTc1NSwzOTc1NiwzOTc2NSwzOTc2NiwzOTc2NywzOTc3MSwzOTc3NCwzOTc3NywzOTc3OSwzOTc4MSwzOTc4MiwzOTc4NCwzOTc4NiwzOTc4NywzOTc4OCwzOTc4OSwzOTc5MCwzOTc5NSwzOTc5NywzOTc5OSwzOTgwMCwzOTgwMSwzOTgwNywzOTgwOCwzOTgxMiwzOTgxMywzOTgxNCwzOTgxNSwzOTgxNywzOTgxOCwzOTgxOSwzOTgyMSwzOTgyMywzOTgyNCwzOTgyOCwzOTgzNCwzOTgzNywzOTgzOCwzOTg0NiwzOTg0NywzOTg0OSwzOTg1MiwzOTg1NiwzOTg1NywzOTg1OCwzOTg2MywzOTg2NCwzOTg2NywzOTg2OCwzOTg3MCwzOTg3MSwzOTg3MywzOTg3OSwzOTg4MCwzOTg4NiwzOTg4OCwzOTg5NSwzOTg5NiwzOTkwMSwzOTkwMywzOTkwOSwzOTkxMSwzOTkxNCwzOTkxNSwzOTkxOSwzOTkyMywzOTkyNywzOTkyOCwzOTkyOSwzOTkzMCwzOTkzMywzOTkzNSwzOTkzNiwzOTkzOCwzOTk0NywzOTk1MSwzOTk1MywzOTk1OCwzOTk2MCwzOTk2MSwzOTk2MiwzOTk2NCwzOTk2NiwzOTk3MCwzOTk3MSwzOTk3NCwzOTk3NSwzOTk3NiwzOTk3NywzOTk3OCwzOTk4NSwzOTk4OSwzOTk5MCwzOTk5MSwzOTk5Nyw0MDAwMSw0MDAwMyw0MDAwNCw0MDAwNSw0MDAwOSw0MDAxMCw0MDAxNCw0MDAxNSw0MDAxNiw0MDAxOSw0MDAyMCw0MDAyMiw0MDAyNCw0MDAyNyw0MDAyOSw0MDAzMCw0MDAzMSw0MDAzNSw0MDA0MSw0MDA0Miw0MDAyOCw0MDA0Myw0MDA0MCw0MDA0Niw0MDA0OCw0MDA1MCw0MDA1Myw0MDA1NSw0MDA1OSw0MDE2Niw0MDE3OCw0MDE4Myw0MDE4NSw0MDIwMyw0MDE5NCw0MDIwOSw0MDIxNSw0MDIxNiw0MDIyMCw0MDIyMSw0MDIyMiw0MDIzOSw0MDI0MCw0MDI0Miw0MDI0Myw0MDI0NCw0MDI1MCw0MDI1Miw0MDI2MSw0MDI1Myw0MDI1OCw0MDI1OSw0MDI2Myw0MDI2Niw0MDI3NSw0MDI3Niw0MDI4Nyw0MDI5MSw0MDI5MCw0MDI5Myw0MDI5Nyw0MDI5OCw0MDI5OSw0MDMwNCw0MDMxMCw0MDMxMSw0MDMxNSw0MDMxNiw0MDMxOCw0MDMyMyw0MDMyNCw0MDMyNiw0MDMzMCw0MDMzMyw0MDMzNCw0MDMzOCw0MDMzOSw0MDM0MSw0MDM0Miw0MDM0Myw0MDM0NCw0MDM1Myw0MDM2Miw0MDM2NCw0MDM2Niw0MDM2OSw0MDM3Myw0MDM3Nyw0MDM4MCw0MDM4Myw0MDM4Nyw0MDM5MSw0MDM5Myw0MDM5NCw0MDQwNCw0MDQwNSw0MDQwNiw0MDQwNyw0MDQxMCw0MDQxNCw0MDQxNSw0MDQxNiw0MDQyMSw0MDQyMyw0MDQyNSw0MDQyNyw0MDQzMCw0MDQzMiw0MDQzNSw0MDQzNiw0MDQ0Niw0MDQ1OCw0MDQ1MCw0MDQ1NSw0MDQ2Miw0MDQ2NCw0MDQ2NSw0MDQ2Niw0MDQ2OSw0MDQ3MCw0MDQ3Myw0MDQ3Niw0MDQ3Nyw0MDU3MCw0MDU3MSw0MDU3Miw0MDU3Niw0MDU3OCw0MDU3OSw0MDU4MCw0MDU4MSw0MDU4Myw0MDU5MCw0MDU5MSw0MDU5OCw0MDYwMCw0MDYwMyw0MDYwNiw0MDYxMiw0MDYxNiw0MDYyMCw0MDYyMiw0MDYyMyw0MDYyNCw0MDYyNyw0MDYyOCw0MDYyOSw0MDY0Niw0MDY0OCw0MDY1MSw0MDY2MSw0MDY3MSw0MDY3Niw0MDY3OSw0MDY4NCw0MDY4NSw0MDY4Niw0MDY4OCw0MDY4OSw0MDY5MCw0MDY5Myw0MDY5Niw0MDcwMyw0MDcwNiw0MDcwNyw0MDcxMyw0MDcxOSw0MDcyMCw0MDcyMSw0MDcyMiw0MDcyNCw0MDcyNiw0MDcyNyw0MDcyOSw0MDczMCw0MDczMSw0MDczNSw0MDczOCw0MDc0Miw0MDc0Niw0MDc0Nyw0MDc1MSw0MDc1Myw0MDc1NCw0MDc1Niw0MDc1OSw0MDc2MSw0MDc2Miw0MDc2NCw0MDc2NSw0MDc2Nyw0MDc2OSw0MDc3MSw0MDc3Miw0MDc3Myw0MDc3NCw0MDc3NSw0MDc4Nyw0MDc4OSw0MDc5MCw0MDc5MSw0MDc5Miw0MDc5NCw0MDc5Nyw0MDc5OCw0MDgwOCw0MDgwOSw0MDgxMyw0MDgxNCw0MDgxNSw0MDgxNiw0MDgxNyw0MDgxOSw0MDgyMSw0MDgyNiw0MDgyOSw0MDg0Nyw0MDg0OCw0MDg0OSw0MDg1MCw0MDg1Miw0MDg1NCw0MDg1NSw0MDg2Miw0MDg2NSw0MDg2Niw0MDg2Nyw0MDg2OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFxuICBcImlibTg2NlwiOlsxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4Nyw5NjE3LDk2MTgsOTYxOSw5NDc0LDk1MDgsOTU2OSw5NTcwLDk1NTgsOTU1Nyw5NTcxLDk1NTMsOTU1OSw5NTY1LDk1NjQsOTU2Myw5NDg4LDk0OTIsOTUyNCw5NTE2LDk1MDAsOTQ3Miw5NTMyLDk1NjYsOTU2Nyw5NTYyLDk1NTYsOTU3Nyw5NTc0LDk1NjgsOTU1Miw5NTgwLDk1NzUsOTU3Niw5NTcyLDk1NzMsOTU2MSw5NTYwLDk1NTQsOTU1NSw5NTc5LDk1NzgsOTQ5Niw5NDg0LDk2MDgsOTYwNCw5NjEyLDk2MTYsOTYwMCwxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLDEwMjUsMTEwNSwxMDI4LDExMDgsMTAzMSwxMTExLDEwMzgsMTExOCwxNzYsODcyOSwxODMsODczMCw4NDcwLDE2NCw5NjMyLDE2MF0sXG4gIFwiaXNvLTg4NTktMlwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwyNjAsNzI4LDMyMSwxNjQsMzE3LDM0NiwxNjcsMTY4LDM1MiwzNTAsMzU2LDM3NywxNzMsMzgxLDM3OSwxNzYsMjYxLDczMSwzMjIsMTgwLDMxOCwzNDcsNzExLDE4NCwzNTMsMzUxLDM1NywzNzgsNzMzLDM4MiwzODAsMzQwLDE5MywxOTQsMjU4LDE5NiwzMTMsMjYyLDE5OSwyNjgsMjAxLDI4MCwyMDMsMjgyLDIwNSwyMDYsMjcwLDI3MiwzMjMsMzI3LDIxMSwyMTIsMzM2LDIxNCwyMTUsMzQ0LDM2NiwyMTgsMzY4LDIyMCwyMjEsMzU0LDIyMywzNDEsMjI1LDIyNiwyNTksMjI4LDMxNCwyNjMsMjMxLDI2OSwyMzMsMjgxLDIzNSwyODMsMjM3LDIzOCwyNzEsMjczLDMyNCwzMjgsMjQzLDI0NCwzMzcsMjQ2LDI0NywzNDUsMzY3LDI1MCwzNjksMjUyLDI1MywzNTUsNzI5XSxcbiAgXCJpc28tODg1OS0zXCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDI5NCw3MjgsMTYzLDE2NCxudWxsLDI5MiwxNjcsMTY4LDMwNCwzNTAsMjg2LDMwOCwxNzMsbnVsbCwzNzksMTc2LDI5NSwxNzgsMTc5LDE4MCwxODEsMjkzLDE4MywxODQsMzA1LDM1MSwyODcsMzA5LDE4OSxudWxsLDM4MCwxOTIsMTkzLDE5NCxudWxsLDE5NiwyNjYsMjY0LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LG51bGwsMjA5LDIxMCwyMTEsMjEyLDI4OCwyMTQsMjE1LDI4NCwyMTcsMjE4LDIxOSwyMjAsMzY0LDM0OCwyMjMsMjI0LDIyNSwyMjYsbnVsbCwyMjgsMjY3LDI2NSwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSxudWxsLDI0MSwyNDIsMjQzLDI0NCwyODksMjQ2LDI0NywyODUsMjQ5LDI1MCwyNTEsMjUyLDM2NSwzNDksNzI5XSxcbiAgXCJpc28tODg1OS00XCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDI2MCwzMTIsMzQyLDE2NCwyOTYsMzE1LDE2NywxNjgsMzUyLDI3NCwyOTAsMzU4LDE3MywzODEsMTc1LDE3NiwyNjEsNzMxLDM0MywxODAsMjk3LDMxNiw3MTEsMTg0LDM1MywyNzUsMjkxLDM1OSwzMzAsMzgyLDMzMSwyNTYsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMzAyLDI2OCwyMDEsMjgwLDIwMywyNzgsMjA1LDIwNiwyOTgsMjcyLDMyNSwzMzIsMzEwLDIxMiwyMTMsMjE0LDIxNSwyMTYsMzcwLDIxOCwyMTksMjIwLDM2MCwzNjIsMjIzLDI1NywyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwzMDMsMjY5LDIzMywyODEsMjM1LDI3OSwyMzcsMjM4LDI5OSwyNzMsMzI2LDMzMywzMTEsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwzNzEsMjUwLDI1MSwyNTIsMzYxLDM2Myw3MjldLFxuICBcImlzby04ODU5LTVcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTAyNSwxMDI2LDEwMjcsMTAyOCwxMDI5LDEwMzAsMTAzMSwxMDMyLDEwMzMsMTAzNCwxMDM1LDEwMzYsMTczLDEwMzgsMTAzOSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLDg0NzAsMTEwNSwxMTA2LDExMDcsMTEwOCwxMTA5LDExMTAsMTExMSwxMTEyLDExMTMsMTExNCwxMTE1LDExMTYsMTY3LDExMTgsMTExOV0sXG4gIFwiaXNvLTg4NTktNlwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCxudWxsLG51bGwsbnVsbCwxNjQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxNTQ4LDE3MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE1NjMsbnVsbCxudWxsLG51bGwsMTU2NyxudWxsLDE1NjksMTU3MCwxNTcxLDE1NzIsMTU3MywxNTc0LDE1NzUsMTU3NiwxNTc3LDE1NzgsMTU3OSwxNTgwLDE1ODEsMTU4MiwxNTgzLDE1ODQsMTU4NSwxNTg2LDE1ODcsMTU4OCwxNTg5LDE1OTAsMTU5MSwxNTkyLDE1OTMsMTU5NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTYwMCwxNjAxLDE2MDIsMTYwMywxNjA0LDE2MDUsMTYwNiwxNjA3LDE2MDgsMTYwOSwxNjEwLDE2MTEsMTYxMiwxNjEzLDE2MTQsMTYxNSwxNjE2LDE2MTcsMTYxOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxcbiAgXCJpc28tODg1OS03XCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDgyMTYsODIxNywxNjMsODM2NCw4MzY3LDE2NiwxNjcsMTY4LDE2OSw4OTAsMTcxLDE3MiwxNzMsbnVsbCw4MjEzLDE3NiwxNzcsMTc4LDE3OSw5MDAsOTAxLDkwMiwxODMsOTA0LDkwNSw5MDYsMTg3LDkwOCwxODksOTEwLDkxMSw5MTIsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSxudWxsLDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5MzgsOTM5LDk0MCw5NDEsOTQyLDk0Myw5NDQsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjIsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDk3MCw5NzEsOTcyLDk3Myw5NzQsbnVsbF0sXG4gIFwiaXNvLTg4NTktOFwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCxudWxsLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMjE1LDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDI0NywxODcsMTg4LDE4OSwxOTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDgyMTUsMTQ4OCwxNDg5LDE0OTAsMTQ5MSwxNDkyLDE0OTMsMTQ5NCwxNDk1LDE0OTYsMTQ5NywxNDk4LDE0OTksMTUwMCwxNTAxLDE1MDIsMTUwMywxNTA0LDE1MDUsMTUwNiwxNTA3LDE1MDgsMTUwOSwxNTEwLDE1MTEsMTUxMiwxNTEzLDE1MTQsbnVsbCxudWxsLDgyMDYsODIwNyxudWxsXSxcbiAgXCJpc28tODg1OS0xMFwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwyNjAsMjc0LDI5MCwyOTgsMjk2LDMxMCwxNjcsMzE1LDI3MiwzNTIsMzU4LDM4MSwxNzMsMzYyLDMzMCwxNzYsMjYxLDI3NSwyOTEsMjk5LDI5NywzMTEsMTgzLDMxNiwyNzMsMzUzLDM1OSwzODIsODIxMywzNjMsMzMxLDI1NiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwzMDIsMjY4LDIwMSwyODAsMjAzLDI3OCwyMDUsMjA2LDIwNywyMDgsMzI1LDMzMiwyMTEsMjEyLDIxMywyMTQsMzYwLDIxNiwzNzAsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjU3LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDMwMywyNjksMjMzLDI4MSwyMzUsMjc5LDIzNywyMzgsMjM5LDI0MCwzMjYsMzMzLDI0MywyNDQsMjQ1LDI0NiwzNjEsMjQ4LDM3MSwyNTAsMjUxLDI1MiwyNTMsMjU0LDMxMl0sXG4gIFwiaXNvLTg4NTktMTNcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsODIyMSwxNjIsMTYzLDE2NCw4MjIyLDE2NiwxNjcsMjE2LDE2OSwzNDIsMTcxLDE3MiwxNzMsMTc0LDE5OCwxNzYsMTc3LDE3OCwxNzksODIyMCwxODEsMTgyLDE4MywyNDgsMTg1LDM0MywxODcsMTg4LDE4OSwxOTAsMjMwLDI2MCwzMDIsMjU2LDI2MiwxOTYsMTk3LDI4MCwyNzQsMjY4LDIwMSwzNzcsMjc4LDI5MCwzMTAsMjk4LDMxNSwzNTIsMzIzLDMyNSwyMTEsMzMyLDIxMywyMTQsMjE1LDM3MCwzMjEsMzQ2LDM2MiwyMjAsMzc5LDM4MSwyMjMsMjYxLDMwMywyNTcsMjYzLDIyOCwyMjksMjgxLDI3NSwyNjksMjMzLDM3OCwyNzksMjkxLDMxMSwyOTksMzE2LDM1MywzMjQsMzI2LDI0MywzMzMsMjQ1LDI0NiwyNDcsMzcxLDMyMiwzNDcsMzYzLDI1MiwzODAsMzgyLDgyMTddLFxuICBcImlzby04ODU5LTE0XCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDc2ODIsNzY4MywxNjMsMjY2LDI2Nyw3NjkwLDE2Nyw3ODA4LDE2OSw3ODEwLDc2OTEsNzkyMiwxNzMsMTc0LDM3Niw3NzEwLDc3MTEsMjg4LDI4OSw3NzQ0LDc3NDUsMTgyLDc3NjYsNzgwOSw3NzY3LDc4MTEsNzc3Niw3OTIzLDc4MTIsNzgxMyw3Nzc3LDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywzNzIsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsNzc4NiwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwzNzQsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwzNzMsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsNzc4NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywzNzUsMjU1XSxcbiAgXCJpc28tODg1OS0xNVwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2Myw4MzY0LDE2NSwzNTIsMTY3LDM1MywxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDM4MSwxODEsMTgyLDE4MywzODIsMTg1LDE4NiwxODcsMzM4LDMzOSwzNzYsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NV0sXG4gIFwiaXNvLTg4NTktMTZcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMjYwLDI2MSwzMjEsODM2NCw4MjIyLDM1MiwxNjcsMzUzLDE2OSw1MzYsMTcxLDM3NywxNzMsMzc4LDM3OSwxNzYsMTc3LDI2OCwzMjIsMzgxLDgyMjEsMTgyLDE4MywzODIsMjY5LDUzNywxODcsMzM4LDMzOSwzNzYsMzgwLDE5MiwxOTMsMTk0LDI1OCwxOTYsMjYyLDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyNzIsMzIzLDIxMCwyMTEsMjEyLDMzNiwyMTQsMzQ2LDM2OCwyMTcsMjE4LDIxOSwyMjAsMjgwLDUzOCwyMjMsMjI0LDIyNSwyMjYsMjU5LDIyOCwyNjMsMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI3MywzMjQsMjQyLDI0MywyNDQsMzM3LDI0NiwzNDcsMzY5LDI0OSwyNTAsMjUxLDI1MiwyODEsNTM5LDI1NV0sXG4gIFwia29pOC1yXCI6Wzk0NzIsOTQ3NCw5NDg0LDk0ODgsOTQ5Miw5NDk2LDk1MDAsOTUwOCw5NTE2LDk1MjQsOTUzMiw5NjAwLDk2MDQsOTYwOCw5NjEyLDk2MTYsOTYxNyw5NjE4LDk2MTksODk5Miw5NjMyLDg3MjksODczMCw4Nzc2LDg4MDQsODgwNSwxNjAsODk5MywxNzYsMTc4LDE4MywyNDcsOTU1Miw5NTUzLDk1NTQsMTEwNSw5NTU1LDk1NTYsOTU1Nyw5NTU4LDk1NTksOTU2MCw5NTYxLDk1NjIsOTU2Myw5NTY0LDk1NjUsOTU2Niw5NTY3LDk1NjgsOTU2OSwxMDI1LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCwxNjksMTEwMiwxMDcyLDEwNzMsMTA5NCwxMDc2LDEwNzcsMTA5MiwxMDc1LDEwOTMsMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDExMDMsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDc4LDEwNzQsMTEwMCwxMDk5LDEwNzksMTA5NiwxMTAxLDEwOTcsMTA5NSwxMDk4LDEwNzAsMTA0MCwxMDQxLDEwNjIsMTA0NCwxMDQ1LDEwNjAsMTA0MywxMDYxLDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDcxLDEwNTYsMTA1NywxMDU4LDEwNTksMTA0NiwxMDQyLDEwNjgsMTA2NywxMDQ3LDEwNjQsMTA2OSwxMDY1LDEwNjMsMTA2Nl0sXG4gIFwia29pOC11XCI6Wzk0NzIsOTQ3NCw5NDg0LDk0ODgsOTQ5Miw5NDk2LDk1MDAsOTUwOCw5NTE2LDk1MjQsOTUzMiw5NjAwLDk2MDQsOTYwOCw5NjEyLDk2MTYsOTYxNyw5NjE4LDk2MTksODk5Miw5NjMyLDg3MjksODczMCw4Nzc2LDg4MDQsODgwNSwxNjAsODk5MywxNzYsMTc4LDE4MywyNDcsOTU1Miw5NTUzLDk1NTQsMTEwNSwxMTA4LDk1NTYsMTExMCwxMTExLDk1NTksOTU2MCw5NTYxLDk1NjIsOTU2MywxMTY5LDExMTgsOTU2Niw5NTY3LDk1NjgsOTU2OSwxMDI1LDEwMjgsOTU3MSwxMDMwLDEwMzEsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDExNjgsMTAzOCwxNjksMTEwMiwxMDcyLDEwNzMsMTA5NCwxMDc2LDEwNzcsMTA5MiwxMDc1LDEwOTMsMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDExMDMsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDc4LDEwNzQsMTEwMCwxMDk5LDEwNzksMTA5NiwxMTAxLDEwOTcsMTA5NSwxMDk4LDEwNzAsMTA0MCwxMDQxLDEwNjIsMTA0NCwxMDQ1LDEwNjAsMTA0MywxMDYxLDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDcxLDEwNTYsMTA1NywxMDU4LDEwNTksMTA0NiwxMDQyLDEwNjgsMTA2NywxMDQ3LDEwNjQsMTA2OSwxMDY1LDEwNjMsMTA2Nl0sXG4gIFwibWFjaW50b3NoXCI6WzE5NiwxOTcsMTk5LDIwMSwyMDksMjE0LDIyMCwyMjUsMjI0LDIyNiwyMjgsMjI3LDIyOSwyMzEsMjMzLDIzMiwyMzQsMjM1LDIzNywyMzYsMjM4LDIzOSwyNDEsMjQzLDI0MiwyNDQsMjQ2LDI0NSwyNTAsMjQ5LDI1MSwyNTIsODIyNCwxNzYsMTYyLDE2MywxNjcsODIyNiwxODIsMjIzLDE3NCwxNjksODQ4MiwxODAsMTY4LDg4MDAsMTk4LDIxNiw4NzM0LDE3Nyw4ODA0LDg4MDUsMTY1LDE4MSw4NzA2LDg3MjEsODcxOSw5NjAsODc0NywxNzAsMTg2LDkzNywyMzAsMjQ4LDE5MSwxNjEsMTcyLDg3MzAsNDAyLDg3NzYsODcxMCwxNzEsMTg3LDgyMzAsMTYwLDE5MiwxOTUsMjEzLDMzOCwzMzksODIxMSw4MjEyLDgyMjAsODIyMSw4MjE2LDgyMTcsMjQ3LDk2NzQsMjU1LDM3Niw4MjYwLDgzNjQsODI0OSw4MjUwLDY0MjU3LDY0MjU4LDgyMjUsMTgzLDgyMTgsODIyMiw4MjQwLDE5NCwyMDIsMTkzLDIwMywyMDAsMjA1LDIwNiwyMDcsMjA0LDIxMSwyMTIsNjM3NDMsMjEwLDIxOCwyMTksMjE3LDMwNSw3MTAsNzMyLDE3NSw3MjgsNzI5LDczMCwxODQsNzMzLDczMSw3MTFdLFxuICBcIndpbmRvd3MtODc0XCI6WzgzNjQsMTI5LDEzMCwxMzEsMTMyLDgyMzAsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDM1ODUsMzU4NiwzNTg3LDM1ODgsMzU4OSwzNTkwLDM1OTEsMzU5MiwzNTkzLDM1OTQsMzU5NSwzNTk2LDM1OTcsMzU5OCwzNTk5LDM2MDAsMzYwMSwzNjAyLDM2MDMsMzYwNCwzNjA1LDM2MDYsMzYwNywzNjA4LDM2MDksMzYxMCwzNjExLDM2MTIsMzYxMywzNjE0LDM2MTUsMzYxNiwzNjE3LDM2MTgsMzYxOSwzNjIwLDM2MjEsMzYyMiwzNjIzLDM2MjQsMzYyNSwzNjI2LDM2MjcsMzYyOCwzNjI5LDM2MzAsMzYzMSwzNjMyLDM2MzMsMzYzNCwzNjM1LDM2MzYsMzYzNywzNjM4LDM2MzksMzY0MCwzNjQxLDM2NDIsbnVsbCxudWxsLG51bGwsbnVsbCwzNjQ3LDM2NDgsMzY0OSwzNjUwLDM2NTEsMzY1MiwzNjUzLDM2NTQsMzY1NSwzNjU2LDM2NTcsMzY1OCwzNjU5LDM2NjAsMzY2MSwzNjYyLDM2NjMsMzY2NCwzNjY1LDM2NjYsMzY2NywzNjY4LDM2NjksMzY3MCwzNjcxLDM2NzIsMzY3MywzNjc0LDM2NzUsbnVsbCxudWxsLG51bGwsbnVsbF0sXG4gIFwid2luZG93cy0xMjUwXCI6WzgzNjQsMTI5LDgyMTgsMTMxLDgyMjIsODIzMCw4MjI0LDgyMjUsMTM2LDgyNDAsMzUyLDgyNDksMzQ2LDM1NiwzODEsMzc3LDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE1Miw4NDgyLDM1Myw4MjUwLDM0NywzNTcsMzgyLDM3OCwxNjAsNzExLDcyOCwzMjEsMTY0LDI2MCwxNjYsMTY3LDE2OCwxNjksMzUwLDE3MSwxNzIsMTczLDE3NCwzNzksMTc2LDE3Nyw3MzEsMzIyLDE4MCwxODEsMTgyLDE4MywxODQsMjYxLDM1MSwxODcsMzE3LDczMywzMTgsMzgwLDM0MCwxOTMsMTk0LDI1OCwxOTYsMzEzLDI2MiwxOTksMjY4LDIwMSwyODAsMjAzLDI4MiwyMDUsMjA2LDI3MCwyNzIsMzIzLDMyNywyMTEsMjEyLDMzNiwyMTQsMjE1LDM0NCwzNjYsMjE4LDM2OCwyMjAsMjIxLDM1NCwyMjMsMzQxLDIyNSwyMjYsMjU5LDIyOCwzMTQsMjYzLDIzMSwyNjksMjMzLDI4MSwyMzUsMjgzLDIzNywyMzgsMjcxLDI3MywzMjQsMzI4LDI0MywyNDQsMzM3LDI0NiwyNDcsMzQ1LDM2NywyNTAsMzY5LDI1MiwyNTMsMzU1LDcyOV0sXG4gIFwid2luZG93cy0xMjUxXCI6WzEwMjYsMTAyNyw4MjE4LDExMDcsODIyMiw4MjMwLDgyMjQsODIyNSw4MzY0LDgyNDAsMTAzMyw4MjQ5LDEwMzQsMTAzNiwxMDM1LDEwMzksMTEwNiw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE1Miw4NDgyLDExMTMsODI1MCwxMTE0LDExMTYsMTExNSwxMTE5LDE2MCwxMDM4LDExMTgsMTAzMiwxNjQsMTE2OCwxNjYsMTY3LDEwMjUsMTY5LDEwMjgsMTcxLDE3MiwxNzMsMTc0LDEwMzEsMTc2LDE3NywxMDMwLDExMTAsMTE2OSwxODEsMTgyLDE4MywxMTA1LDg0NzAsMTEwOCwxODcsMTExMiwxMDI5LDExMDksMTExMSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzXSxcbiAgXCJ3aW5kb3dzLTEyNTJcIjpbODM2NCwxMjksODIxOCw0MDIsODIyMiw4MjMwLDgyMjQsODIyNSw3MTAsODI0MCwzNTIsODI0OSwzMzgsMTQxLDM4MSwxNDMsMTQ0LDgyMTYsODIxNyw4MjIwLDgyMjEsODIyNiw4MjExLDgyMTIsNzMyLDg0ODIsMzUzLDgyNTAsMzM5LDE1NywzODIsMzc2LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1XSxcbiAgXCJ3aW5kb3dzLTEyNTNcIjpbODM2NCwxMjksODIxOCw0MDIsODIyMiw4MjMwLDgyMjQsODIyNSwxMzYsODI0MCwxMzgsODI0OSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDgyMTYsODIxNyw4MjIwLDgyMjEsODIyNiw4MjExLDgyMTIsMTUyLDg0ODIsMTU0LDgyNTAsMTU2LDE1NywxNTgsMTU5LDE2MCw5MDEsOTAyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSxudWxsLDE3MSwxNzIsMTczLDE3NCw4MjEzLDE3NiwxNzcsMTc4LDE3OSw5MDAsMTgxLDE4MiwxODMsOTA0LDkwNSw5MDYsMTg3LDkwOCwxODksOTEwLDkxMSw5MTIsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSxudWxsLDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5MzgsOTM5LDk0MCw5NDEsOTQyLDk0Myw5NDQsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjIsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDk3MCw5NzEsOTcyLDk3Myw5NzQsbnVsbF0sXG4gIFwid2luZG93cy0xMjU0XCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsNzEwLDgyNDAsMzUyLDgyNDksMzM4LDE0MSwxNDIsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDczMiw4NDgyLDM1Myw4MjUwLDMzOSwxNTcsMTU4LDM3NiwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyODYsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMzA0LDM1MCwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI4NywyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwzMDUsMzUxLDI1NV0sXG4gIFwid2luZG93cy0xMjU1XCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsNzEwLDgyNDAsMTM4LDgyNDksMTQwLDE0MSwxNDIsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDczMiw4NDgyLDE1NCw4MjUwLDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsODM2MiwxNjUsMTY2LDE2NywxNjgsMTY5LDIxNSwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwyNDcsMTg3LDE4OCwxODksMTkwLDE5MSwxNDU2LDE0NTcsMTQ1OCwxNDU5LDE0NjAsMTQ2MSwxNDYyLDE0NjMsMTQ2NCwxNDY1LDE0NjYsMTQ2NywxNDY4LDE0NjksMTQ3MCwxNDcxLDE0NzIsMTQ3MywxNDc0LDE0NzUsMTUyMCwxNTIxLDE1MjIsMTUyMywxNTI0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTQ4OCwxNDg5LDE0OTAsMTQ5MSwxNDkyLDE0OTMsMTQ5NCwxNDk1LDE0OTYsMTQ5NywxNDk4LDE0OTksMTUwMCwxNTAxLDE1MDIsMTUwMywxNTA0LDE1MDUsMTUwNiwxNTA3LDE1MDgsMTUwOSwxNTEwLDE1MTEsMTUxMiwxNTEzLDE1MTQsbnVsbCxudWxsLDgyMDYsODIwNyxudWxsXSxcbiAgXCJ3aW5kb3dzLTEyNTZcIjpbODM2NCwxNjYyLDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsNzEwLDgyNDAsMTY1Nyw4MjQ5LDMzOCwxNjcwLDE2ODgsMTY3MiwxNzExLDgyMTYsODIxNyw4MjIwLDgyMjEsODIyNiw4MjExLDgyMTIsMTcwNSw4NDgyLDE2ODEsODI1MCwzMzksODIwNCw4MjA1LDE3MjIsMTYwLDE1NDgsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzI2LDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE1NjMsMTg3LDE4OCwxODksMTkwLDE1NjcsMTcyOSwxNTY5LDE1NzAsMTU3MSwxNTcyLDE1NzMsMTU3NCwxNTc1LDE1NzYsMTU3NywxNTc4LDE1NzksMTU4MCwxNTgxLDE1ODIsMTU4MywxNTg0LDE1ODUsMTU4NiwxNTg3LDE1ODgsMTU4OSwxNTkwLDIxNSwxNTkxLDE1OTIsMTU5MywxNTk0LDE2MDAsMTYwMSwxNjAyLDE2MDMsMjI0LDE2MDQsMjI2LDE2MDUsMTYwNiwxNjA3LDE2MDgsMjMxLDIzMiwyMzMsMjM0LDIzNSwxNjA5LDE2MTAsMjM4LDIzOSwxNjExLDE2MTIsMTYxMywxNjE0LDI0NCwxNjE1LDE2MTYsMjQ3LDE2MTcsMjQ5LDE2MTgsMjUxLDI1Miw4MjA2LDgyMDcsMTc0Nl0sXG4gIFwid2luZG93cy0xMjU3XCI6WzgzNjQsMTI5LDgyMTgsMTMxLDgyMjIsODIzMCw4MjI0LDgyMjUsMTM2LDgyNDAsMTM4LDgyNDksMTQwLDE2OCw3MTEsMTg0LDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE1Miw4NDgyLDE1NCw4MjUwLDE1NiwxNzUsNzMxLDE1OSwxNjAsbnVsbCwxNjIsMTYzLDE2NCxudWxsLDE2NiwxNjcsMjE2LDE2OSwzNDIsMTcxLDE3MiwxNzMsMTc0LDE5OCwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDI0OCwxODUsMzQzLDE4NywxODgsMTg5LDE5MCwyMzAsMjYwLDMwMiwyNTYsMjYyLDE5NiwxOTcsMjgwLDI3NCwyNjgsMjAxLDM3NywyNzgsMjkwLDMxMCwyOTgsMzE1LDM1MiwzMjMsMzI1LDIxMSwzMzIsMjEzLDIxNCwyMTUsMzcwLDMyMSwzNDYsMzYyLDIyMCwzNzksMzgxLDIyMywyNjEsMzAzLDI1NywyNjMsMjI4LDIyOSwyODEsMjc1LDI2OSwyMzMsMzc4LDI3OSwyOTEsMzExLDI5OSwzMTYsMzUzLDMyNCwzMjYsMjQzLDMzMywyNDUsMjQ2LDI0NywzNzEsMzIyLDM0NywzNjMsMjUyLDM4MCwzODIsNzI5XSxcbiAgXCJ3aW5kb3dzLTEyNThcIjpbODM2NCwxMjksODIxOCw0MDIsODIyMiw4MjMwLDgyMjQsODIyNSw3MTAsODI0MCwxMzgsODI0OSwzMzgsMTQxLDE0MiwxNDMsMTQ0LDgyMTYsODIxNyw4MjIwLDgyMjEsODIyNiw4MjExLDgyMTIsNzMyLDg0ODIsMTU0LDgyNTAsMzM5LDE1NywxNTgsMzc2LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMjU4LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsNzY4LDIwNSwyMDYsMjA3LDI3MiwyMDksNzc3LDIxMSwyMTIsNDE2LDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCw0MzEsNzcxLDIyMywyMjQsMjI1LDIyNiwyNTksMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSw3NjksMjM3LDIzOCwyMzksMjczLDI0MSw4MDMsMjQzLDI0NCw0MTcsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDQzMiw4MzYzLDI1NV0sXG4gIFwieC1tYWMtY3lyaWxsaWNcIjpbMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDgyMjQsMTc2LDExNjgsMTYzLDE2Nyw4MjI2LDE4MiwxMDMwLDE3NCwxNjksODQ4MiwxMDI2LDExMDYsODgwMCwxMDI3LDExMDcsODczNCwxNzcsODgwNCw4ODA1LDExMTAsMTgxLDExNjksMTAzMiwxMDI4LDExMDgsMTAzMSwxMTExLDEwMzMsMTExMywxMDM0LDExMTQsMTExMiwxMDI5LDE3Miw4NzMwLDQwMiw4Nzc2LDg3MTAsMTcxLDE4Nyw4MjMwLDE2MCwxMDM1LDExMTUsMTAzNiwxMTE2LDExMDksODIxMSw4MjEyLDgyMjAsODIyMSw4MjE2LDgyMTcsMjQ3LDgyMjIsMTAzOCwxMTE4LDEwMzksMTExOSw4NDcwLDEwMjUsMTEwNSwxMTAzLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsODM2NF1cbn07XG5cbi8vIEZvciBzdHJpY3QgZW52aXJvbm1lbnRzIHdoZXJlIGB0aGlzYCBpbnNpZGUgdGhlIGdsb2JhbCBzY29wZVxuLy8gaXMgYHVuZGVmaW5lZGAsIHRha2UgYSBwdXJlIG9iamVjdCBpbnN0ZWFkXG59KHRoaXMgfHwge30pKTsiLCIvLyBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuLy8gU2VlIExJQ0VOU0UubWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBHbG9iYWwgfHRoaXN8IHJlcXVpcmVkIGZvciByZXNvbHZpbmcgaW5kZXhlcyBpbiBub2RlLlxuICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfVxuICovXG4oZnVuY3Rpb24oZ2xvYmFsKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBJZiB3ZSdyZSBpbiBub2RlIHJlcXVpcmUgZW5jb2RpbmctaW5kZXhlcyBhbmQgYXR0YWNoIGl0IHRvIHRoZSBnbG9iYWwuXG4gIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZS5leHBvcnRzICYmXG4gICAgIWdsb2JhbFtcImVuY29kaW5nLWluZGV4ZXNcIl0pIHtcbiAgICBnbG9iYWxbXCJlbmNvZGluZy1pbmRleGVzXCJdID1cbiAgICAgIHJlcXVpcmUoXCIuL2VuY29kaW5nLWluZGV4ZXMuanNcIilbXCJlbmNvZGluZy1pbmRleGVzXCJdO1xuICB9XG5cbiAgLy9cbiAgLy8gVXRpbGl0aWVzXG4gIC8vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhIFRoZSBudW1iZXIgdG8gdGVzdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbiBUaGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2UsIGluY2x1c2l2ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2UsIGluY2x1c2l2ZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhID49IG1pbiBhbmQgYSA8PSBtYXguXG4gICAqL1xuICBmdW5jdGlvbiBpblJhbmdlKGEsIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIG1pbiA8PSBhICYmIGEgPD0gbWF4O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7IUFycmF5LjwqPn0gYXJyYXkgVGhlIGFycmF5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0geyp9IGl0ZW0gVGhlIGl0ZW0gdG8gbG9vayBmb3IgaW4gdGhlIGFycmF5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBpdGVtIGFwcGVhcnMgaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5jbHVkZXMoYXJyYXksIGl0ZW0pIHtcbiAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtKSAhPT0gLTE7XG4gIH1cblxuICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gVG9EaWN0aW9uYXJ5KG8pIHtcbiAgICBpZiAobyA9PT0gdW5kZWZpbmVkKSByZXR1cm4ge307XG4gICAgaWYgKG8gPT09IE9iamVjdChvKSkgcmV0dXJuIG87XG4gICAgdGhyb3cgVHlwZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBhcmd1bWVudCB0byBkaWN0aW9uYXJ5Jyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBJbnB1dCBzdHJpbmcgb2YgVVRGLTE2IGNvZGUgdW5pdHMuXG4gICAqIEByZXR1cm4geyFBcnJheS48bnVtYmVyPn0gQ29kZSBwb2ludHMuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0NvZGVQb2ludHMoc3RyaW5nKSB7XG4gICAgLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW9idGFpbi11bmljb2RlXG5cbiAgICAvLyAxLiBMZXQgUyBiZSB0aGUgRE9NU3RyaW5nIHZhbHVlLlxuICAgIHZhciBzID0gU3RyaW5nKHN0cmluZyk7XG5cbiAgICAvLyAyLiBMZXQgbiBiZSB0aGUgbGVuZ3RoIG9mIFMuXG4gICAgdmFyIG4gPSBzLmxlbmd0aDtcblxuICAgIC8vIDMuIEluaXRpYWxpemUgaSB0byAwLlxuICAgIHZhciBpID0gMDtcblxuICAgIC8vIDQuIEluaXRpYWxpemUgVSB0byBiZSBhbiBlbXB0eSBzZXF1ZW5jZSBvZiBVbmljb2RlIGNoYXJhY3RlcnMuXG4gICAgdmFyIHUgPSBbXTtcblxuICAgIC8vIDUuIFdoaWxlIGkgPCBuOlxuICAgIHdoaWxlIChpIDwgbikge1xuXG4gICAgICAvLyAxLiBMZXQgYyBiZSB0aGUgY29kZSB1bml0IGluIFMgYXQgaW5kZXggaS5cbiAgICAgIHZhciBjID0gcy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAvLyAyLiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGM6XG5cbiAgICAgIC8vIGMgPCAweEQ4MDAgb3IgYyA+IDB4REZGRlxuICAgICAgaWYgKGMgPCAweEQ4MDAgfHwgYyA+IDB4REZGRikge1xuICAgICAgICAvLyBBcHBlbmQgdG8gVSB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCBjb2RlIHBvaW50IGMuXG4gICAgICAgIHUucHVzaChjKTtcbiAgICAgIH1cblxuICAgICAgLy8gMHhEQzAwIOKJpCBjIOKJpCAweERGRkZcbiAgICAgIGVsc2UgaWYgKDB4REMwMCA8PSBjICYmIGMgPD0gMHhERkZGKSB7XG4gICAgICAgIC8vIEFwcGVuZCB0byBVIGEgVStGRkZEIFJFUExBQ0VNRU5UIENIQVJBQ1RFUi5cbiAgICAgICAgdS5wdXNoKDB4RkZGRCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDB4RDgwMCDiiaQgYyDiiaQgMHhEQkZGXG4gICAgICBlbHNlIGlmICgweEQ4MDAgPD0gYyAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICAvLyAxLiBJZiBpID0gbuKIkjEsIHRoZW4gYXBwZW5kIHRvIFUgYSBVK0ZGRkQgUkVQTEFDRU1FTlRcbiAgICAgICAgLy8gQ0hBUkFDVEVSLlxuICAgICAgICBpZiAoaSA9PT0gbiAtIDEpIHtcbiAgICAgICAgICB1LnB1c2goMHhGRkZEKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAyLiBPdGhlcndpc2UsIGkgPCBu4oiSMTpcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gMS4gTGV0IGQgYmUgdGhlIGNvZGUgdW5pdCBpbiBTIGF0IGluZGV4IGkrMS5cbiAgICAgICAgICB2YXIgZCA9IHMuY2hhckNvZGVBdChpICsgMSk7XG5cbiAgICAgICAgICAvLyAyLiBJZiAweERDMDAg4omkIGQg4omkIDB4REZGRiwgdGhlbjpcbiAgICAgICAgICBpZiAoMHhEQzAwIDw9IGQgJiYgZCA8PSAweERGRkYpIHtcbiAgICAgICAgICAgIC8vIDEuIExldCBhIGJlIGMgJiAweDNGRi5cbiAgICAgICAgICAgIHZhciBhID0gYyAmIDB4M0ZGO1xuXG4gICAgICAgICAgICAvLyAyLiBMZXQgYiBiZSBkICYgMHgzRkYuXG4gICAgICAgICAgICB2YXIgYiA9IGQgJiAweDNGRjtcblxuICAgICAgICAgICAgLy8gMy4gQXBwZW5kIHRvIFUgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludFxuICAgICAgICAgICAgLy8gMl4xNisyXjEwKmErYi5cbiAgICAgICAgICAgIHUucHVzaCgweDEwMDAwICsgKGEgPDwgMTApICsgYik7XG5cbiAgICAgICAgICAgIC8vIDQuIFNldCBpIHRvIGkrMS5cbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAzLiBPdGhlcndpc2UsIGQgPCAweERDMDAgb3IgZCA+IDB4REZGRi4gQXBwZW5kIHRvIFUgYVxuICAgICAgICAgIC8vIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIuXG4gICAgICAgICAgZWxzZSAge1xuICAgICAgICAgICAgdS5wdXNoKDB4RkZGRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFNldCBpIHRvIGkrMS5cbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICAvLyA2LiBSZXR1cm4gVS5cbiAgICByZXR1cm4gdTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gY29kZV9wb2ludHMgQXJyYXkgb2YgY29kZSBwb2ludHMuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gc3RyaW5nIFN0cmluZyBvZiBVVEYtMTYgY29kZSB1bml0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVQb2ludHNUb1N0cmluZyhjb2RlX3BvaW50cykge1xuICAgIHZhciBzID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlX3BvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGNwID0gY29kZV9wb2ludHNbaV07XG4gICAgICBpZiAoY3AgPD0gMHhGRkZGKSB7XG4gICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjcCAtPSAweDEwMDAwO1xuICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNwID4+IDEwKSArIDB4RDgwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcCAmIDB4M0ZGKSArIDB4REMwMCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9XG5cblxuICAvL1xuICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBFbmNvZGluZyBzcGVjaWZpY2F0aW9uXG4gIC8vIGh0dHBzOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnL1xuICAvL1xuXG4gIC8vXG4gIC8vIDQuIFRlcm1pbm9sb2d5XG4gIC8vXG5cbiAgLyoqXG4gICAqIEFuIEFTQ0lJIGJ5dGUgaXMgYSBieXRlIGluIHRoZSByYW5nZSAweDAwIHRvIDB4N0YsIGluY2x1c2l2ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGEgVGhlIG51bWJlciB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGEgaXMgaW4gdGhlIHJhbmdlIDB4MDAgdG8gMHg3RiwgaW5jbHVzaXZlLlxuICAgKi9cbiAgZnVuY3Rpb24gaXNBU0NJSUJ5dGUoYSkge1xuICAgIHJldHVybiAweDAwIDw9IGEgJiYgYSA8PSAweDdGO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIEFTQ0lJIGNvZGUgcG9pbnQgaXMgYSBjb2RlIHBvaW50IGluIHRoZSByYW5nZSBVKzAwMDAgdG9cbiAgICogVSswMDdGLCBpbmNsdXNpdmUuXG4gICAqL1xuICB2YXIgaXNBU0NJSUNvZGVQb2ludCA9IGlzQVNDSUlCeXRlO1xuXG5cbiAgLyoqXG4gICAqIEVuZC1vZi1zdHJlYW0gaXMgYSBzcGVjaWFsIHRva2VuIHRoYXQgc2lnbmlmaWVzIG5vIG1vcmUgdG9rZW5zXG4gICAqIGFyZSBpbiB0aGUgc3RyZWFtLlxuICAgKiBAY29uc3RcbiAgICovIHZhciBlbmRfb2Zfc3RyZWFtID0gLTE7XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIHJlcHJlc2VudHMgYW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiB0b2tlbnMuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0geyEoQXJyYXkuPG51bWJlcj58VWludDhBcnJheSl9IHRva2VucyBBcnJheSBvZiB0b2tlbnMgdGhhdCBwcm92aWRlXG4gICAqIHRoZSBzdHJlYW0uXG4gICAqL1xuICBmdW5jdGlvbiBTdHJlYW0odG9rZW5zKSB7XG4gICAgLyoqIEB0eXBlIHshQXJyYXkuPG51bWJlcj59ICovXG4gICAgdGhpcy50b2tlbnMgPSBbXS5zbGljZS5jYWxsKHRva2Vucyk7XG4gICAgLy8gUmV2ZXJzZWQgYXMgcHVzaC9wb3AgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBzaGlmdC91bnNoaWZ0LlxuICAgIHRoaXMudG9rZW5zLnJldmVyc2UoKTtcbiAgfVxuXG4gIFN0cmVhbS5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBlbmQtb2Ytc3RyZWFtIGhhcyBiZWVuIGhpdC5cbiAgICAgKi9cbiAgICBlbmRPZlN0cmVhbTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXRoaXMudG9rZW5zLmxlbmd0aDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhIHRva2VuIGlzIHJlYWQgZnJvbSBhIHN0cmVhbSwgdGhlIGZpcnN0IHRva2VuIGluIHRoZVxuICAgICAqIHN0cmVhbSBtdXN0IGJlIHJldHVybmVkIGFuZCBzdWJzZXF1ZW50bHkgcmVtb3ZlZCwgYW5kXG4gICAgICogZW5kLW9mLXN0cmVhbSBtdXN0IGJlIHJldHVybmVkIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gR2V0IHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIHN0cmVhbSwgb3JcbiAgICAgKiBlbmRfb2Zfc3RyZWFtLlxuICAgICAqL1xuICAgICByZWFkOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy50b2tlbnMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZW5kX29mX3N0cmVhbTtcbiAgICAgICByZXR1cm4gdGhpcy50b2tlbnMucG9wKCk7XG4gICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIG9uZSBvciBtb3JlIHRva2VucyBhcmUgcHJlcGVuZGVkIHRvIGEgc3RyZWFtLCB0aG9zZSB0b2tlbnNcbiAgICAgKiBtdXN0IGJlIGluc2VydGVkLCBpbiBnaXZlbiBvcmRlciwgYmVmb3JlIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGVcbiAgICAgKiBzdHJlYW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gdG9rZW4gVGhlIHRva2VuKHMpIHRvIHByZXBlbmQgdG8gdGhlXG4gICAgICogc3RyZWFtLlxuICAgICAqL1xuICAgIHByZXBlbmQ6IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbikpIHtcbiAgICAgICAgdmFyIHRva2VucyA9IC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki8odG9rZW4pO1xuICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aClcbiAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRva2Vucy5wb3AoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHB1c2hlZCB0byBhIHN0cmVhbSwgdGhvc2UgdG9rZW5zXG4gICAgICogbXVzdCBiZSBpbnNlcnRlZCwgaW4gZ2l2ZW4gb3JkZXIsIGFmdGVyIHRoZSBsYXN0IHRva2VuIGluIHRoZVxuICAgICAqIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSB0b2tlbiBUaGUgdG9rZW5zKHMpIHRvIHB1c2ggdG8gdGhlXG4gICAgICogc3RyZWFtLlxuICAgICAqL1xuICAgIHB1c2g6IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbikpIHtcbiAgICAgICAgdmFyIHRva2VucyA9IC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki8odG9rZW4pO1xuICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aClcbiAgICAgICAgICB0aGlzLnRva2Vucy51bnNoaWZ0KHRva2Vucy5zaGlmdCgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9rZW5zLnVuc2hpZnQodG9rZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvL1xuICAvLyA1LiBFbmNvZGluZ3NcbiAgLy9cblxuICAvLyA1LjEgRW5jb2RlcnMgYW5kIGRlY29kZXJzXG5cbiAgLyoqIEBjb25zdCAqL1xuICB2YXIgZmluaXNoZWQgPSAtMTtcblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBmYXRhbCBJZiB0cnVlLCBkZWNvZGluZyBlcnJvcnMgcmFpc2UgYW4gZXhjZXB0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcj19IG9wdF9jb2RlX3BvaW50IE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBmYWxsYmFjayBjb2RlIHBvaW50LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb2RlIHBvaW50IHRvIGluc2VydCBvbiBhIGRlY29kaW5nIGVycm9yLlxuICAgKi9cbiAgZnVuY3Rpb24gZGVjb2RlckVycm9yKGZhdGFsLCBvcHRfY29kZV9wb2ludCkge1xuICAgIGlmIChmYXRhbClcbiAgICAgIHRocm93IFR5cGVFcnJvcignRGVjb2RlciBlcnJvcicpO1xuICAgIHJldHVybiBvcHRfY29kZV9wb2ludCB8fCAweEZGRkQ7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgVGhlIGNvZGUgcG9pbnQgdGhhdCBjb3VsZCBub3QgYmUgZW5jb2RlZC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBBbHdheXMgdGhyb3dzLCBubyB2YWx1ZSBpcyBhY3R1YWxseSByZXR1cm5lZC5cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZXJFcnJvcihjb2RlX3BvaW50KSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdUaGUgY29kZSBwb2ludCAnICsgY29kZV9wb2ludCArICcgY291bGQgbm90IGJlIGVuY29kZWQuJyk7XG4gIH1cblxuICAvKiogQGludGVyZmFjZSAqL1xuICBmdW5jdGlvbiBEZWNvZGVyKCkge31cbiAgRGVjb2Rlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQsIG9yIHxmaW5pc2hlZHwuXG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7fVxuICB9O1xuXG4gIC8qKiBAaW50ZXJmYWNlICovXG4gIGZ1bmN0aW9uIEVuY29kZXIoKSB7fVxuICBFbmNvZGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIFRoZSBzdHJlYW0gb2YgY29kZSBwb2ludHMgYmVpbmcgZW5jb2RlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQsIG9yIHxmaW5pc2hlZHwuXG4gICAgICovXG4gICAgaGFuZGxlcjogZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7fVxuICB9O1xuXG4gIC8vIDUuMiBOYW1lcyBhbmQgbGFiZWxzXG5cbiAgLy8gVE9ETzogRGVmaW5lIEB0eXBlZGVmIGZvciBFbmNvZGluZzoge25hbWU6c3RyaW5nLGxhYmVsczpBcnJheS48c3RyaW5nPn1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8yNDdcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIFRoZSBlbmNvZGluZyBsYWJlbC5cbiAgICogQHJldHVybiB7P3tuYW1lOnN0cmluZyxsYWJlbHM6QXJyYXkuPHN0cmluZz59fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RW5jb2RpbmcobGFiZWwpIHtcbiAgICAvLyAxLiBSZW1vdmUgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UgZnJvbSBsYWJlbC5cbiAgICBsYWJlbCA9IFN0cmluZyhsYWJlbCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyAyLiBJZiBsYWJlbCBpcyBhbiBBU0NJSSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBhbnkgb2YgdGhlXG4gICAgLy8gbGFiZWxzIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3csIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICAgIC8vIGVuY29kaW5nLCBhbmQgZmFpbHVyZSBvdGhlcndpc2UuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsYWJlbF90b19lbmNvZGluZywgbGFiZWwpKSB7XG4gICAgICByZXR1cm4gbGFiZWxfdG9fZW5jb2RpbmdbbGFiZWxdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGluZ3MgdGFibGU6IGh0dHBzOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnL2VuY29kaW5ncy5qc29uXG4gICAqIEBjb25zdFxuICAgKiBAdHlwZSB7IUFycmF5Ljx7XG4gICAqICAgICAgICAgIGhlYWRpbmc6IHN0cmluZyxcbiAgICogICAgICAgICAgZW5jb2RpbmdzOiBBcnJheS48e25hbWU6c3RyaW5nLGxhYmVsczpBcnJheS48c3RyaW5nPn0+XG4gICAqICAgICAgICB9Pn1cbiAgICovXG4gIHZhciBlbmNvZGluZ3MgPSBbXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJ1bmljb2RlLTEtMS11dGYtOFwiLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICAgXCJ1dGY4XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIlVURi04XCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiaGVhZGluZ1wiOiBcIlRoZSBFbmNvZGluZ1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcImVuY29kaW5nc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcIjg2NlwiLFxuICAgICAgICAgICAgXCJjcDg2NlwiLFxuICAgICAgICAgICAgXCJjc2libTg2NlwiLFxuICAgICAgICAgICAgXCJpYm04NjZcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSUJNODY2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjJcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMlwiLFxuICAgICAgICAgICAgXCJpc28taXItMTAxXCIsXG4gICAgICAgICAgICBcImlzbzg4NTktMlwiLFxuICAgICAgICAgICAgXCJpc284ODU5MlwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0yXCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTI6MTk4N1wiLFxuICAgICAgICAgICAgXCJsMlwiLFxuICAgICAgICAgICAgXCJsYXRpbjJcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvbGF0aW4zXCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTNcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEwOVwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTNcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTNcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktM1wiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0zOjE5ODhcIixcbiAgICAgICAgICAgIFwibDNcIixcbiAgICAgICAgICAgIFwibGF0aW4zXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzb2xhdGluNFwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS00XCIsXG4gICAgICAgICAgICBcImlzby1pci0xMTBcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS00XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk0XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTRcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktNDoxOTg4XCIsXG4gICAgICAgICAgICBcImw0XCIsXG4gICAgICAgICAgICBcImxhdGluNFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS00XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbmN5cmlsbGljXCIsXG4gICAgICAgICAgICBcImN5cmlsbGljXCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTVcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTE0NFwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTVcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTVcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktNVwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS01OjE5ODhcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImFyYWJpY1wiLFxuICAgICAgICAgICAgXCJhc21vLTcwOFwiLFxuICAgICAgICAgICAgXCJjc2lzbzg4NTk2ZVwiLFxuICAgICAgICAgICAgXCJjc2lzbzg4NTk2aVwiLFxuICAgICAgICAgICAgXCJjc2lzb2xhdGluYXJhYmljXCIsXG4gICAgICAgICAgICBcImVjbWEtMTE0XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTZcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktNi1lXCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTYtaVwiLFxuICAgICAgICAgICAgXCJpc28taXItMTI3XCIsXG4gICAgICAgICAgICBcImlzbzg4NTktNlwiLFxuICAgICAgICAgICAgXCJpc284ODU5NlwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS02XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTY6MTk4N1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS02XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbmdyZWVrXCIsXG4gICAgICAgICAgICBcImVjbWEtMTE4XCIsXG4gICAgICAgICAgICBcImVsb3RfOTI4XCIsXG4gICAgICAgICAgICBcImdyZWVrXCIsXG4gICAgICAgICAgICBcImdyZWVrOFwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS03XCIsXG4gICAgICAgICAgICBcImlzby1pci0xMjZcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS03XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk3XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTdcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktNzoxOTg3XCIsXG4gICAgICAgICAgICBcInN1bl9ldV9ncmVla1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS03XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc284ODU5OGVcIixcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbmhlYnJld1wiLFxuICAgICAgICAgICAgXCJoZWJyZXdcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktOFwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS04LWVcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEzOFwiLFxuICAgICAgICAgICAgXCJpc284ODU5LThcIixcbiAgICAgICAgICAgIFwiaXNvODg1OThcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktOFwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS04OjE5ODhcIixcbiAgICAgICAgICAgIFwidmlzdWFsXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzbzg4NTk4aVwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS04LWlcIixcbiAgICAgICAgICAgIFwibG9naWNhbFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS04LUlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzb2xhdGluNlwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS0xMFwiLFxuICAgICAgICAgICAgXCJpc28taXItMTU3XCIsXG4gICAgICAgICAgICBcImlzbzg4NTktMTBcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTEwXCIsXG4gICAgICAgICAgICBcImw2XCIsXG4gICAgICAgICAgICBcImxhdGluNlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0xMFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImlzby04ODU5LTEzXCIsXG4gICAgICAgICAgICBcImlzbzg4NTktMTNcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTEzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTEzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMTRcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS0xNFwiLFxuICAgICAgICAgICAgXCJpc284ODU5MTRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktMTRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzb2xhdGluOVwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS0xNVwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTE1XCIsXG4gICAgICAgICAgICBcImlzbzg4NTkxNVwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0xNVwiLFxuICAgICAgICAgICAgXCJsOVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0xNVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImlzby04ODU5LTE2XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTE2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Nrb2k4clwiLFxuICAgICAgICAgICAgXCJrb2lcIixcbiAgICAgICAgICAgIFwia29pOFwiLFxuICAgICAgICAgICAgXCJrb2k4LXJcIixcbiAgICAgICAgICAgIFwia29pOF9yXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIktPSTgtUlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImtvaTgtcnVcIixcbiAgICAgICAgICAgIFwia29pOC11XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIktPSTgtVVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzbWFjaW50b3NoXCIsXG4gICAgICAgICAgICBcIm1hY1wiLFxuICAgICAgICAgICAgXCJtYWNpbnRvc2hcIixcbiAgICAgICAgICAgIFwieC1tYWMtcm9tYW5cIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwibWFjaW50b3NoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiZG9zLTg3NFwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS0xMVwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTExXCIsXG4gICAgICAgICAgICBcImlzbzg4NTkxMVwiLFxuICAgICAgICAgICAgXCJ0aXMtNjIwXCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtODc0XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtODc0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjUwXCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1MFwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1MFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjcDEyNTFcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjUxXCIsXG4gICAgICAgICAgICBcIngtY3AxMjUxXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1MVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImFuc2lfeDMuNC0xOTY4XCIsXG4gICAgICAgICAgICBcImFzY2lpXCIsXG4gICAgICAgICAgICBcImNwMTI1MlwiLFxuICAgICAgICAgICAgXCJjcDgxOVwiLFxuICAgICAgICAgICAgXCJjc2lzb2xhdGluMVwiLFxuICAgICAgICAgICAgXCJpYm04MTlcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMVwiLFxuICAgICAgICAgICAgXCJpc28taXItMTAwXCIsXG4gICAgICAgICAgICBcImlzbzg4NTktMVwiLFxuICAgICAgICAgICAgXCJpc284ODU5MVwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0xXCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTE6MTk4N1wiLFxuICAgICAgICAgICAgXCJsMVwiLFxuICAgICAgICAgICAgXCJsYXRpbjFcIixcbiAgICAgICAgICAgIFwidXMtYXNjaWlcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjUyXCIsXG4gICAgICAgICAgICBcIngtY3AxMjUyXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1M1wiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTNcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjUzXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjU0XCIsXG4gICAgICAgICAgICBcImNzaXNvbGF0aW41XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTlcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTE0OFwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTlcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTlcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktOVwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS05OjE5ODlcIixcbiAgICAgICAgICAgIFwibDVcIixcbiAgICAgICAgICAgIFwibGF0aW41XCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1NFwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1NFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjcDEyNTVcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjU1XCIsXG4gICAgICAgICAgICBcIngtY3AxMjU1XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1NlwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTZcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTZcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjU2XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjU3XCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1N1wiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1N1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTdcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjcDEyNThcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjU4XCIsXG4gICAgICAgICAgICBcIngtY3AxMjU4XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcIngtbWFjLWN5cmlsbGljXCIsXG4gICAgICAgICAgICBcIngtbWFjLXVrcmFpbmlhblwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ4LW1hYy1jeXJpbGxpY1wiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJMZWdhY3kgc2luZ2xlLWJ5dGUgZW5jb2RpbmdzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwiZW5jb2RpbmdzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY2hpbmVzZVwiLFxuICAgICAgICAgICAgXCJjc2diMjMxMlwiLFxuICAgICAgICAgICAgXCJjc2lzbzU4Z2IyMzEyODBcIixcbiAgICAgICAgICAgIFwiZ2IyMzEyXCIsXG4gICAgICAgICAgICBcImdiXzIzMTJcIixcbiAgICAgICAgICAgIFwiZ2JfMjMxMi04MFwiLFxuICAgICAgICAgICAgXCJnYmtcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTU4XCIsXG4gICAgICAgICAgICBcIngtZ2JrXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIkdCS1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImdiMTgwMzBcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiZ2IxODAzMFwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJMZWdhY3kgbXVsdGktYnl0ZSBDaGluZXNlIChzaW1wbGlmaWVkKSBlbmNvZGluZ3NcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJiaWc1XCIsXG4gICAgICAgICAgICBcImJpZzUtaGtzY3NcIixcbiAgICAgICAgICAgIFwiY24tYmlnNVwiLFxuICAgICAgICAgICAgXCJjc2JpZzVcIixcbiAgICAgICAgICAgIFwieC14LWJpZzVcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiQmlnNVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJMZWdhY3kgbXVsdGktYnl0ZSBDaGluZXNlICh0cmFkaXRpb25hbCkgZW5jb2RpbmdzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwiZW5jb2RpbmdzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3NldWNwa2RmbXRqYXBhbmVzZVwiLFxuICAgICAgICAgICAgXCJldWMtanBcIixcbiAgICAgICAgICAgIFwieC1ldWMtanBcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiRVVDLUpQXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc28yMDIyanBcIixcbiAgICAgICAgICAgIFwiaXNvLTIwMjItanBcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTIwMjItSlBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc3NoaWZ0amlzXCIsXG4gICAgICAgICAgICBcIm1zOTMyXCIsXG4gICAgICAgICAgICBcIm1zX2thbmppXCIsXG4gICAgICAgICAgICBcInNoaWZ0LWppc1wiLFxuICAgICAgICAgICAgXCJzaGlmdF9qaXNcIixcbiAgICAgICAgICAgIFwic2ppc1wiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTMxalwiLFxuICAgICAgICAgICAgXCJ4LXNqaXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiU2hpZnRfSklTXCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiaGVhZGluZ1wiOiBcIkxlZ2FjeSBtdWx0aS1ieXRlIEphcGFuZXNlIGVuY29kaW5nc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcImVuY29kaW5nc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzZXVja3JcIixcbiAgICAgICAgICAgIFwiY3Nrc2M1NjAxMTk4N1wiLFxuICAgICAgICAgICAgXCJldWMta3JcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTE0OVwiLFxuICAgICAgICAgICAgXCJrb3JlYW5cIixcbiAgICAgICAgICAgIFwia3NfY181NjAxLTE5ODdcIixcbiAgICAgICAgICAgIFwia3NfY181NjAxLTE5ODlcIixcbiAgICAgICAgICAgIFwia3NjNTYwMVwiLFxuICAgICAgICAgICAgXCJrc2NfNTYwMVwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTk0OVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJFVUMtS1JcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IG11bHRpLWJ5dGUgS29yZWFuIGVuY29kaW5nc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcImVuY29kaW5nc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvMjAyMmtyXCIsXG4gICAgICAgICAgICBcImh6LWdiLTIzMTJcIixcbiAgICAgICAgICAgIFwiaXNvLTIwMjItY25cIixcbiAgICAgICAgICAgIFwiaXNvLTIwMjItY24tZXh0XCIsXG4gICAgICAgICAgICBcImlzby0yMDIyLWtyXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcInJlcGxhY2VtZW50XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwidXRmLTE2YmVcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiVVRGLTE2QkVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJ1dGYtMTZcIixcbiAgICAgICAgICAgIFwidXRmLTE2bGVcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiVVRGLTE2TEVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJ4LXVzZXItZGVmaW5lZFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ4LXVzZXItZGVmaW5lZFwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJMZWdhY3kgbWlzY2VsbGFuZW91cyBlbmNvZGluZ3NcIlxuICAgIH1cbiAgXTtcblxuICAvLyBMYWJlbCB0byBlbmNvZGluZyByZWdpc3RyeS5cbiAgLyoqIEB0eXBlIHtPYmplY3QuPHN0cmluZyx7bmFtZTpzdHJpbmcsbGFiZWxzOkFycmF5LjxzdHJpbmc+fT59ICovXG4gIHZhciBsYWJlbF90b19lbmNvZGluZyA9IHt9O1xuICBlbmNvZGluZ3MuZm9yRWFjaChmdW5jdGlvbihjYXRlZ29yeSkge1xuICAgIGNhdGVnb3J5LmVuY29kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICBlbmNvZGluZy5sYWJlbHMuZm9yRWFjaChmdW5jdGlvbihsYWJlbCkge1xuICAgICAgICBsYWJlbF90b19lbmNvZGluZ1tsYWJlbF0gPSBlbmNvZGluZztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZWdpc3RyeSBvZiBvZiBlbmNvZGVyL2RlY29kZXIgZmFjdG9yaWVzLCBieSBlbmNvZGluZyBuYW1lLlxuICAvKiogQHR5cGUge09iamVjdC48c3RyaW5nLCBmdW5jdGlvbih7ZmF0YWw6Ym9vbGVhbn0pOiBFbmNvZGVyPn0gKi9cbiAgdmFyIGVuY29kZXJzID0ge307XG4gIC8qKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uKHtmYXRhbDpib29sZWFufSk6IERlY29kZXI+fSAqL1xuICB2YXIgZGVjb2RlcnMgPSB7fTtcblxuICAvL1xuICAvLyA2LiBJbmRleGVzXG4gIC8vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb2ludGVyIFRoZSB8cG9pbnRlcnwgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHsoIUFycmF5Ljw/bnVtYmVyPnx1bmRlZmluZWQpfSBpbmRleCBUaGUgfGluZGV4fCB0byBzZWFyY2ggd2l0aGluLlxuICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgY29kZSBwb2ludCBjb3JyZXNwb25kaW5nIHRvIHxwb2ludGVyfCBpbiB8aW5kZXh8LFxuICAgKiAgICAgb3IgbnVsbCBpZiB8Y29kZSBwb2ludHwgaXMgbm90IGluIHxpbmRleHwuXG4gICAqL1xuICBmdW5jdGlvbiBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCkge1xuICAgIGlmICghaW5kZXgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpbmRleFtwb2ludGVyXSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IFRoZSB8Y29kZSBwb2ludHwgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHshQXJyYXkuPD9udW1iZXI+fSBpbmRleCBUaGUgfGluZGV4fCB0byBzZWFyY2ggd2l0aGluLlxuICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgZmlyc3QgcG9pbnRlciBjb3JyZXNwb25kaW5nIHRvIHxjb2RlIHBvaW50fCBpblxuICAgKiAgICAgfGluZGV4fCwgb3IgbnVsbCBpZiB8Y29kZSBwb2ludHwgaXMgbm90IGluIHxpbmRleHwuXG4gICAqL1xuICBmdW5jdGlvbiBpbmRleFBvaW50ZXJGb3IoY29kZV9wb2ludCwgaW5kZXgpIHtcbiAgICB2YXIgcG9pbnRlciA9IGluZGV4LmluZGV4T2YoY29kZV9wb2ludCk7XG4gICAgcmV0dXJuIHBvaW50ZXIgPT09IC0xID8gbnVsbCA6IHBvaW50ZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgaW5kZXguXG4gICAqIEByZXR1cm4geyghQXJyYXkuPG51bWJlcj58IUFycmF5LjxBcnJheS48bnVtYmVyPj4pfVxuICAgKiAgKi9cbiAgZnVuY3Rpb24gaW5kZXgobmFtZSkge1xuICAgIGlmICghKCdlbmNvZGluZy1pbmRleGVzJyBpbiBnbG9iYWwpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcIkluZGV4ZXMgbWlzc2luZy5cIiArXG4gICAgICAgICAgICAgICAgICBcIiBEaWQgeW91IGZvcmdldCB0byBpbmNsdWRlIGVuY29kaW5nLWluZGV4ZXMuanMgZmlyc3Q/XCIpO1xuICAgIH1cbiAgICByZXR1cm4gZ2xvYmFsWydlbmNvZGluZy1pbmRleGVzJ11bbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBvaW50ZXIgVGhlIHxwb2ludGVyfCB0byBzZWFyY2ggZm9yIGluIHRoZSBnYjE4MDMwIGluZGV4LlxuICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgY29kZSBwb2ludCBjb3JyZXNwb25kaW5nIHRvIHxwb2ludGVyfCBpbiB8aW5kZXh8LFxuICAgKiAgICAgb3IgbnVsbCBpZiB8Y29kZSBwb2ludHwgaXMgbm90IGluIHRoZSBnYjE4MDMwIGluZGV4LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhHQjE4MDMwUmFuZ2VzQ29kZVBvaW50Rm9yKHBvaW50ZXIpIHtcbiAgICAvLyAxLiBJZiBwb2ludGVyIGlzIGdyZWF0ZXIgdGhhbiAzOTQxOSBhbmQgbGVzcyB0aGFuIDE4OTAwMCwgb3JcbiAgICAvLyBwb2ludGVyIGlzIGdyZWF0ZXIgdGhhbiAxMjM3NTc1LCByZXR1cm4gbnVsbC5cbiAgICBpZiAoKHBvaW50ZXIgPiAzOTQxOSAmJiBwb2ludGVyIDwgMTg5MDAwKSB8fCAocG9pbnRlciA+IDEyMzc1NzUpKVxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAvLyAyLiBJZiBwb2ludGVyIGlzIDc0NTcsIHJldHVybiBjb2RlIHBvaW50IFUrRTdDNy5cbiAgICBpZiAocG9pbnRlciA9PT0gNzQ1NykgcmV0dXJuIDB4RTdDNztcblxuICAgIC8vIDMuIExldCBvZmZzZXQgYmUgdGhlIGxhc3QgcG9pbnRlciBpbiBpbmRleCBnYjE4MDMwIHJhbmdlcyB0aGF0XG4gICAgLy8gaXMgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIHBvaW50ZXIgYW5kIGxldCBjb2RlIHBvaW50IG9mZnNldCBiZVxuICAgIC8vIGl0cyBjb3JyZXNwb25kaW5nIGNvZGUgcG9pbnQuXG4gICAgdmFyIG9mZnNldCA9IDA7XG4gICAgdmFyIGNvZGVfcG9pbnRfb2Zmc2V0ID0gMDtcbiAgICB2YXIgaWR4ID0gaW5kZXgoJ2diMTgwMzAtcmFuZ2VzJyk7XG4gICAgdmFyIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGlkeC5sZW5ndGg7ICsraSkge1xuICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPG51bWJlcj59ICovXG4gICAgICB2YXIgZW50cnkgPSBpZHhbaV07XG4gICAgICBpZiAoZW50cnlbMF0gPD0gcG9pbnRlcikge1xuICAgICAgICBvZmZzZXQgPSBlbnRyeVswXTtcbiAgICAgICAgY29kZV9wb2ludF9vZmZzZXQgPSBlbnRyeVsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludCBvZmZzZXQgK1xuICAgIC8vIHBvaW50ZXIg4oiSIG9mZnNldC5cbiAgICByZXR1cm4gY29kZV9wb2ludF9vZmZzZXQgKyBwb2ludGVyIC0gb2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IFRoZSB8Y29kZSBwb2ludHwgdG8gbG9jYXRlIGluIHRoZSBnYjE4MDMwIGluZGV4LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBmaXJzdCBwb2ludGVyIGNvcnJlc3BvbmRpbmcgdG8gfGNvZGUgcG9pbnR8IGluIHRoZVxuICAgKiAgICAgZ2IxODAzMCBpbmRleC5cbiAgICovXG4gIGZ1bmN0aW9uIGluZGV4R0IxODAzMFJhbmdlc1BvaW50ZXJGb3IoY29kZV9wb2ludCkge1xuICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgVStFN0M3LCByZXR1cm4gcG9pbnRlciA3NDU3LlxuICAgIGlmIChjb2RlX3BvaW50ID09PSAweEU3QzcpIHJldHVybiA3NDU3O1xuXG4gICAgLy8gMi4gTGV0IG9mZnNldCBiZSB0aGUgbGFzdCBjb2RlIHBvaW50IGluIGluZGV4IGdiMTgwMzAgcmFuZ2VzXG4gICAgLy8gdGhhdCBpcyBlcXVhbCB0byBvciBsZXNzIHRoYW4gY29kZSBwb2ludCBhbmQgbGV0IHBvaW50ZXIgb2Zmc2V0XG4gICAgLy8gYmUgaXRzIGNvcnJlc3BvbmRpbmcgcG9pbnRlci5cbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgcG9pbnRlcl9vZmZzZXQgPSAwO1xuICAgIHZhciBpZHggPSBpbmRleCgnZ2IxODAzMC1yYW5nZXMnKTtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgaWR4Lmxlbmd0aDsgKytpKSB7XG4gICAgICAvKiogQHR5cGUgeyFBcnJheS48bnVtYmVyPn0gKi9cbiAgICAgIHZhciBlbnRyeSA9IGlkeFtpXTtcbiAgICAgIGlmIChlbnRyeVsxXSA8PSBjb2RlX3BvaW50KSB7XG4gICAgICAgIG9mZnNldCA9IGVudHJ5WzFdO1xuICAgICAgICBwb2ludGVyX29mZnNldCA9IGVudHJ5WzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gUmV0dXJuIGEgcG9pbnRlciB3aG9zZSB2YWx1ZSBpcyBwb2ludGVyIG9mZnNldCArIGNvZGUgcG9pbnRcbiAgICAvLyDiiJIgb2Zmc2V0LlxuICAgIHJldHVybiBwb2ludGVyX29mZnNldCArIGNvZGVfcG9pbnQgLSBvZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgVGhlIHxjb2RlX3BvaW50fCB0byBzZWFyY2ggZm9yIGluIHRoZSBTaGlmdF9KSVNcbiAgICogICAgIGluZGV4LlxuICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgY29kZSBwb2ludCBjb3JyZXNwb25kaW5nIHRvIHxwb2ludGVyfCBpbiB8aW5kZXh8LFxuICAgKiAgICAgb3IgbnVsbCBpZiB8Y29kZSBwb2ludHwgaXMgbm90IGluIHRoZSBTaGlmdF9KSVMgaW5kZXguXG4gICAqL1xuICBmdW5jdGlvbiBpbmRleFNoaWZ0SklTUG9pbnRlckZvcihjb2RlX3BvaW50KSB7XG4gICAgLy8gMS4gTGV0IGluZGV4IGJlIGluZGV4IGppczAyMDggZXhjbHVkaW5nIGFsbCBlbnRyaWVzIHdob3NlXG4gICAgLy8gcG9pbnRlciBpcyBpbiB0aGUgcmFuZ2UgODI3MiB0byA4ODM1LCBpbmNsdXNpdmUuXG4gICAgc2hpZnRfamlzX2luZGV4ID0gc2hpZnRfamlzX2luZGV4IHx8XG4gICAgICBpbmRleCgnamlzMDIwOCcpLm1hcChmdW5jdGlvbihjb2RlX3BvaW50LCBwb2ludGVyKSB7XG4gICAgICAgIHJldHVybiBpblJhbmdlKHBvaW50ZXIsIDgyNzIsIDg4MzUpID8gbnVsbCA6IGNvZGVfcG9pbnQ7XG4gICAgICB9KTtcbiAgICB2YXIgaW5kZXhfID0gc2hpZnRfamlzX2luZGV4O1xuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSBpbmRleCBwb2ludGVyIGZvciBjb2RlIHBvaW50IGluIGluZGV4LlxuICAgIHJldHVybiBpbmRleF8uaW5kZXhPZihjb2RlX3BvaW50KTtcbiAgfVxuICB2YXIgc2hpZnRfamlzX2luZGV4O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBUaGUgfGNvZGVfcG9pbnR8IHRvIHNlYXJjaCBmb3IgaW4gdGhlIGJpZzVcbiAgICogICAgIGluZGV4LlxuICAgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgY29kZSBwb2ludCBjb3JyZXNwb25kaW5nIHRvIHxwb2ludGVyfCBpbiB8aW5kZXh8LFxuICAgKiAgICAgb3IgbnVsbCBpZiB8Y29kZSBwb2ludHwgaXMgbm90IGluIHRoZSBiaWc1IGluZGV4LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhCaWc1UG9pbnRlckZvcihjb2RlX3BvaW50KSB7XG4gICAgLy8gMS4gTGV0IGluZGV4IGJlIGluZGV4IEJpZzUgZXhjbHVkaW5nIGFsbCBlbnRyaWVzIHdob3NlIHBvaW50ZXJcbiAgICBiaWc1X2luZGV4X25vX2hrc2NzID0gYmlnNV9pbmRleF9ub19oa3NjcyB8fFxuICAgICAgaW5kZXgoJ2JpZzUnKS5tYXAoZnVuY3Rpb24oY29kZV9wb2ludCwgcG9pbnRlcikge1xuICAgICAgICByZXR1cm4gKHBvaW50ZXIgPCAoMHhBMSAtIDB4ODEpICogMTU3KSA/IG51bGwgOiBjb2RlX3BvaW50O1xuICAgICAgfSk7XG4gICAgdmFyIGluZGV4XyA9IGJpZzVfaW5kZXhfbm9faGtzY3M7XG5cbiAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIFUrMjU1MCwgVSsyNTVFLCBVKzI1NjEsIFUrMjU2QSwgVSs1MzQxLCBvclxuICAgIC8vIFUrNTM0NSwgcmV0dXJuIHRoZSBsYXN0IHBvaW50ZXIgY29ycmVzcG9uZGluZyB0byBjb2RlIHBvaW50IGluXG4gICAgLy8gaW5kZXguXG4gICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjU1MCB8fCBjb2RlX3BvaW50ID09PSAweDI1NUUgfHxcbiAgICAgICAgY29kZV9wb2ludCA9PT0gMHgyNTYxIHx8IGNvZGVfcG9pbnQgPT09IDB4MjU2QSB8fFxuICAgICAgICBjb2RlX3BvaW50ID09PSAweDUzNDEgfHwgY29kZV9wb2ludCA9PT0gMHg1MzQ1KSB7XG4gICAgICByZXR1cm4gaW5kZXhfLmxhc3RJbmRleE9mKGNvZGVfcG9pbnQpO1xuICAgIH1cblxuICAgIC8vIDMuIFJldHVybiB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleC5cbiAgICByZXR1cm4gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4Xyk7XG4gIH1cbiAgdmFyIGJpZzVfaW5kZXhfbm9faGtzY3M7XG5cbiAgLy9cbiAgLy8gOC4gQVBJXG4gIC8vXG5cbiAgLyoqIEBjb25zdCAqLyB2YXIgREVGQVVMVF9FTkNPRElORyA9ICd1dGYtOCc7XG5cbiAgLy8gOC4xIEludGVyZmFjZSBUZXh0RGVjb2RlclxuXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBsYWJlbCBUaGUgbGFiZWwgb2YgdGhlIGVuY29kaW5nO1xuICAgKiAgICAgZGVmYXVsdHMgdG8gJ3V0Zi04Jy5cbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0RGVjb2RlcihsYWJlbCwgb3B0aW9ucykge1xuICAgIC8vIFdlYiBJREwgY29udmVudGlvbnNcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGV4dERlY29kZXIpKVxuICAgICAgdGhyb3cgVHlwZUVycm9yKCdDYWxsZWQgYXMgYSBmdW5jdGlvbi4gRGlkIHlvdSBmb3JnZXQgXFwnbmV3XFwnPycpO1xuICAgIGxhYmVsID0gbGFiZWwgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhsYWJlbCkgOiBERUZBVUxUX0VOQ09ESU5HO1xuICAgIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgICAvLyBBIFRleHREZWNvZGVyIG9iamVjdCBoYXMgYW4gYXNzb2NpYXRlZCBlbmNvZGluZywgZGVjb2RlcixcbiAgICAvLyBzdHJlYW0sIGlnbm9yZSBCT00gZmxhZyAoaW5pdGlhbGx5IHVuc2V0KSwgQk9NIHNlZW4gZmxhZ1xuICAgIC8vIChpbml0aWFsbHkgdW5zZXQpLCBlcnJvciBtb2RlIChpbml0aWFsbHkgcmVwbGFjZW1lbnQpLCBhbmQgZG9cbiAgICAvLyBub3QgZmx1c2ggZmxhZyAoaW5pdGlhbGx5IHVuc2V0KS5cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHRoaXMuX2VuY29kaW5nID0gbnVsbDtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUgez9EZWNvZGVyfSAqL1xuICAgIHRoaXMuX2RlY29kZXIgPSBudWxsO1xuICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9pZ25vcmVCT00gPSBmYWxzZTtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fQk9Nc2VlbiA9IGZhbHNlO1xuICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIHRoaXMuX2Vycm9yX21vZGUgPSAncmVwbGFjZW1lbnQnO1xuICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9kb19ub3RfZmx1c2ggPSBmYWxzZTtcblxuXG4gICAgLy8gMS4gTGV0IGVuY29kaW5nIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tXG4gICAgLy8gbGFiZWwuXG4gICAgdmFyIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcobGFiZWwpO1xuXG4gICAgLy8gMi4gSWYgZW5jb2RpbmcgaXMgZmFpbHVyZSBvciByZXBsYWNlbWVudCwgdGhyb3cgYSBSYW5nZUVycm9yLlxuICAgIGlmIChlbmNvZGluZyA9PT0gbnVsbCB8fCBlbmNvZGluZy5uYW1lID09PSAncmVwbGFjZW1lbnQnKVxuICAgICAgdGhyb3cgUmFuZ2VFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGxhYmVsKTtcbiAgICBpZiAoIWRlY29kZXJzW2VuY29kaW5nLm5hbWVdKSB7XG4gICAgICB0aHJvdyBFcnJvcignRGVjb2RlciBub3QgcHJlc2VudC4nICtcbiAgICAgICAgICAgICAgICAgICcgRGlkIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSBlbmNvZGluZy1pbmRleGVzLmpzIGZpcnN0PycpO1xuICAgIH1cblxuICAgIC8vIDMuIExldCBkZWMgYmUgYSBuZXcgVGV4dERlY29kZXIgb2JqZWN0LlxuICAgIHZhciBkZWMgPSB0aGlzO1xuXG4gICAgLy8gNC4gU2V0IGRlYydzIGVuY29kaW5nIHRvIGVuY29kaW5nLlxuICAgIGRlYy5fZW5jb2RpbmcgPSBlbmNvZGluZztcblxuICAgIC8vIDUuIElmIG9wdGlvbnMncyBmYXRhbCBtZW1iZXIgaXMgdHJ1ZSwgc2V0IGRlYydzIGVycm9yIG1vZGUgdG9cbiAgICAvLyBmYXRhbC5cbiAgICBpZiAoQm9vbGVhbihvcHRpb25zWydmYXRhbCddKSlcbiAgICAgIGRlYy5fZXJyb3JfbW9kZSA9ICdmYXRhbCc7XG5cbiAgICAvLyA2LiBJZiBvcHRpb25zJ3MgaWdub3JlQk9NIG1lbWJlciBpcyB0cnVlLCBzZXQgZGVjJ3MgaWdub3JlIEJPTVxuICAgIC8vIGZsYWcuXG4gICAgaWYgKEJvb2xlYW4ob3B0aW9uc1snaWdub3JlQk9NJ10pKVxuICAgICAgZGVjLl9pZ25vcmVCT00gPSB0cnVlO1xuXG4gICAgLy8gRm9yIHByZS1FUzUgcnVudGltZXM6XG4gICAgaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIHRoaXMuZW5jb2RpbmcgPSBkZWMuX2VuY29kaW5nLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRoaXMuZmF0YWwgPSBkZWMuX2Vycm9yX21vZGUgPT09ICdmYXRhbCc7XG4gICAgICB0aGlzLmlnbm9yZUJPTSA9IGRlYy5faWdub3JlQk9NO1xuICAgIH1cblxuICAgIC8vIDcuIFJldHVybiBkZWMuXG4gICAgcmV0dXJuIGRlYztcbiAgfVxuXG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAvLyBUaGUgZW5jb2RpbmcgYXR0cmlidXRlJ3MgZ2V0dGVyIG11c3QgcmV0dXJuIGVuY29kaW5nJ3MgbmFtZS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dERlY29kZXIucHJvdG90eXBlLCAnZW5jb2RpbmcnLCB7XG4gICAgICAvKiogQHRoaXMge1RleHREZWNvZGVyfSAqL1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2VuY29kaW5nLm5hbWUudG9Mb3dlckNhc2UoKTsgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGZhdGFsIGF0dHJpYnV0ZSdzIGdldHRlciBtdXN0IHJldHVybiB0cnVlIGlmIGVycm9yIG1vZGVcbiAgICAvLyBpcyBmYXRhbCwgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dERlY29kZXIucHJvdG90eXBlLCAnZmF0YWwnLCB7XG4gICAgICAvKiogQHRoaXMge1RleHREZWNvZGVyfSAqL1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2Vycm9yX21vZGUgPT09ICdmYXRhbCc7IH1cbiAgICB9KTtcblxuICAgIC8vIFRoZSBpZ25vcmVCT00gYXR0cmlidXRlJ3MgZ2V0dGVyIG11c3QgcmV0dXJuIHRydWUgaWYgaWdub3JlXG4gICAgLy8gQk9NIGZsYWcgaXMgc2V0LCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZXh0RGVjb2Rlci5wcm90b3R5cGUsICdpZ25vcmVCT00nLCB7XG4gICAgICAvKiogQHRoaXMge1RleHREZWNvZGVyfSAqL1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2lnbm9yZUJPTTsgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyU291cmNlPX0gaW5wdXQgVGhlIGJ1ZmZlciBvZiBieXRlcyB0byBkZWNvZGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHN0cmluZy5cbiAgICovXG4gIFRleHREZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICB2YXIgYnl0ZXM7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmICdidWZmZXInIGluIGlucHV0ICYmXG4gICAgICAgICAgICAgICBpbnB1dC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShpbnB1dC5idWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmJ5dGVMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgICAvLyAxLiBJZiB0aGUgZG8gbm90IGZsdXNoIGZsYWcgaXMgdW5zZXQsIHNldCBkZWNvZGVyIHRvIGEgbmV3XG4gICAgLy8gZW5jb2RpbmcncyBkZWNvZGVyLCBzZXQgc3RyZWFtIHRvIGEgbmV3IHN0cmVhbSwgYW5kIHVuc2V0IHRoZVxuICAgIC8vIEJPTSBzZWVuIGZsYWcuXG4gICAgaWYgKCF0aGlzLl9kb19ub3RfZmx1c2gpIHtcbiAgICAgIHRoaXMuX2RlY29kZXIgPSBkZWNvZGVyc1t0aGlzLl9lbmNvZGluZy5uYW1lXSh7XG4gICAgICAgIGZhdGFsOiB0aGlzLl9lcnJvcl9tb2RlID09PSAnZmF0YWwnfSk7XG4gICAgICB0aGlzLl9CT01zZWVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMi4gSWYgb3B0aW9ucydzIHN0cmVhbSBpcyB0cnVlLCBzZXQgdGhlIGRvIG5vdCBmbHVzaCBmbGFnLCBhbmRcbiAgICAvLyB1bnNldCB0aGUgZG8gbm90IGZsdXNoIGZsYWcgb3RoZXJ3aXNlLlxuICAgIHRoaXMuX2RvX25vdF9mbHVzaCA9IEJvb2xlYW4ob3B0aW9uc1snc3RyZWFtJ10pO1xuXG4gICAgLy8gMy4gSWYgaW5wdXQgaXMgZ2l2ZW4sIHB1c2ggYSBjb3B5IG9mIGlucHV0IHRvIHN0cmVhbS5cbiAgICAvLyBUT0RPOiBBbGlnbiB3aXRoIHNwZWMgYWxnb3JpdGhtIC0gbWFpbnRhaW4gc3RyZWFtIG9uIGluc3RhbmNlLlxuICAgIHZhciBpbnB1dF9zdHJlYW0gPSBuZXcgU3RyZWFtKGJ5dGVzKTtcblxuICAgIC8vIDQuIExldCBvdXRwdXQgYmUgYSBuZXcgc3RyZWFtLlxuICAgIHZhciBvdXRwdXQgPSBbXTtcblxuICAgIC8qKiBAdHlwZSB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gKi9cbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgLy8gNS4gV2hpbGUgdHJ1ZTpcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gMS4gTGV0IHRva2VuIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBmcm9tIHN0cmVhbS5cbiAgICAgIHZhciB0b2tlbiA9IGlucHV0X3N0cmVhbS5yZWFkKCk7XG5cbiAgICAgIC8vIDIuIElmIHRva2VuIGlzIGVuZC1vZi1zdHJlYW0gYW5kIHRoZSBkbyBub3QgZmx1c2ggZmxhZyBpc1xuICAgICAgLy8gc2V0LCByZXR1cm4gb3V0cHV0LCBzZXJpYWxpemVkLlxuICAgICAgLy8gVE9ETzogQWxpZ24gd2l0aCBzcGVjIGFsZ29yaXRobS5cbiAgICAgIGlmICh0b2tlbiA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgcnVuIHRoZXNlIHN1YnN1YnN0ZXBzOlxuXG4gICAgICAvLyAxLiBMZXQgcmVzdWx0IGJlIHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyB0b2tlbiBmb3IgZGVjb2RlcixcbiAgICAgIC8vIHN0cmVhbSwgb3V0cHV0LCBhbmQgZXJyb3IgbW9kZS5cbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZXIuaGFuZGxlcihpbnB1dF9zdHJlYW0sIHRva2VuKTtcblxuICAgICAgLy8gMi4gSWYgcmVzdWx0IGlzIGZpbmlzaGVkLCByZXR1cm4gb3V0cHV0LCBzZXJpYWxpemVkLlxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmluaXNoZWQpXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpXG4gICAgICAgICAgb3V0cHV0LnB1c2guYXBwbHkob3V0cHV0LCAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHJlc3VsdCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiByZXN1bHQgaXMgZXJyb3IsIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgLy8gKFRocm93biBpbiBoYW5kbGVyKVxuXG4gICAgICAvLyA0LiBPdGhlcndpc2UsIGRvIG5vdGhpbmcuXG4gICAgfVxuICAgIC8vIFRPRE86IEFsaWduIHdpdGggc3BlYyBhbGdvcml0aG0uXG4gICAgaWYgKCF0aGlzLl9kb19ub3RfZmx1c2gpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZGVjb2Rlci5oYW5kbGVyKGlucHV0X3N0cmVhbSwgaW5wdXRfc3RyZWFtLnJlYWQoKSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZpbmlzaGVkKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKVxuICAgICAgICAgIG91dHB1dC5wdXNoLmFwcGx5KG91dHB1dCwgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyhyZXN1bHQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdCk7XG4gICAgICB9IHdoaWxlICghaW5wdXRfc3RyZWFtLmVuZE9mU3RyZWFtKCkpO1xuICAgICAgdGhpcy5fZGVjb2RlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQSBUZXh0RGVjb2RlciBvYmplY3QgYWxzbyBoYXMgYW4gYXNzb2NpYXRlZCBzZXJpYWxpemUgc3RyZWFtXG4gICAgLy8gYWxnb3JpdGhtLi4uXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IHN0cmVhbVxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKiBAdGhpcyB7VGV4dERlY29kZXJ9XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2VyaWFsaXplU3RyZWFtKHN0cmVhbSkge1xuICAgICAgLy8gMS4gTGV0IHRva2VuIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBmcm9tIHN0cmVhbS5cbiAgICAgIC8vIChEb25lIGluLXBsYWNlIG9uIGFycmF5LCByYXRoZXIgdGhhbiBhcyBhIHN0cmVhbSlcblxuICAgICAgLy8gMi4gSWYgZW5jb2RpbmcgaXMgVVRGLTgsIFVURi0xNkJFLCBvciBVVEYtMTZMRSwgYW5kIGlnbm9yZVxuICAgICAgLy8gQk9NIGZsYWcgYW5kIEJPTSBzZWVuIGZsYWcgYXJlIHVuc2V0LCBydW4gdGhlc2Ugc3Vic3Vic3RlcHM6XG4gICAgICBpZiAoaW5jbHVkZXMoWydVVEYtOCcsICdVVEYtMTZMRScsICdVVEYtMTZCRSddLCB0aGlzLl9lbmNvZGluZy5uYW1lKSAmJlxuICAgICAgICAgICF0aGlzLl9pZ25vcmVCT00gJiYgIXRoaXMuX0JPTXNlZW4pIHtcbiAgICAgICAgaWYgKHN0cmVhbS5sZW5ndGggPiAwICYmIHN0cmVhbVswXSA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgLy8gMS4gSWYgdG9rZW4gaXMgVStGRUZGLCBzZXQgQk9NIHNlZW4gZmxhZy5cbiAgICAgICAgICB0aGlzLl9CT01zZWVuID0gdHJ1ZTtcbiAgICAgICAgICBzdHJlYW0uc2hpZnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgdG9rZW4gaXMgbm90IGVuZC1vZi1zdHJlYW0sIHNldCBCT00gc2VlblxuICAgICAgICAgIC8vIGZsYWcgYW5kIGFwcGVuZCB0b2tlbiB0byBzdHJlYW0uXG4gICAgICAgICAgdGhpcy5fQk9Nc2VlbiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiB0b2tlbiBpcyBub3QgZW5kLW9mLXN0cmVhbSwgYXBwZW5kIHRva2VuXG4gICAgICAgICAgLy8gdG8gb3V0cHV0LlxuICAgICAgICAgIC8vIChuby1vcClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gNC4gT3RoZXJ3aXNlLCByZXR1cm4gb3V0cHV0LlxuICAgICAgcmV0dXJuIGNvZGVQb2ludHNUb1N0cmluZyhzdHJlYW0pO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVTdHJlYW0uY2FsbCh0aGlzLCBvdXRwdXQpO1xuICB9O1xuXG4gIC8vIDguMiBJbnRlcmZhY2UgVGV4dEVuY29kZXJcblxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSBlbmNvZGluZy4gTk9OU1RBTkRBUkQuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBOT05TVEFOREFSRC5cbiAgICovXG4gIGZ1bmN0aW9uIFRleHRFbmNvZGVyKGxhYmVsLCBvcHRpb25zKSB7XG4gICAgLy8gV2ViIElETCBjb252ZW50aW9uc1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUZXh0RW5jb2RlcikpXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0NhbGxlZCBhcyBhIGZ1bmN0aW9uLiBEaWQgeW91IGZvcmdldCBcXCduZXdcXCc/Jyk7XG4gICAgb3B0aW9ucyA9IFRvRGljdGlvbmFyeShvcHRpb25zKTtcblxuICAgIC8vIEEgVGV4dEVuY29kZXIgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIGVuY29kaW5nIGFuZCBlbmNvZGVyLlxuXG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgdGhpcy5fZW5jb2RpbmcgPSBudWxsO1xuICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7P0VuY29kZXJ9ICovXG4gICAgdGhpcy5fZW5jb2RlciA9IG51bGw7XG5cbiAgICAvLyBOb24tc3RhbmRhcmRcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fZG9fbm90X2ZsdXNoID0gZmFsc2U7XG4gICAgLyoqIEBwcml2YXRlIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgdGhpcy5fZmF0YWwgPSBCb29sZWFuKG9wdGlvbnNbJ2ZhdGFsJ10pID8gJ2ZhdGFsJyA6ICdyZXBsYWNlbWVudCc7XG5cbiAgICAvLyAxLiBMZXQgZW5jIGJlIGEgbmV3IFRleHRFbmNvZGVyIG9iamVjdC5cbiAgICB2YXIgZW5jID0gdGhpcztcblxuICAgIC8vIDIuIFNldCBlbmMncyBlbmNvZGluZyB0byBVVEYtOCdzIGVuY29kZXIuXG4gICAgaWYgKEJvb2xlYW4ob3B0aW9uc1snTk9OU1RBTkRBUkRfYWxsb3dMZWdhY3lFbmNvZGluZyddKSkge1xuICAgICAgLy8gTk9OU1RBTkRBUkQgYmVoYXZpb3IuXG4gICAgICBsYWJlbCA9IGxhYmVsICE9PSB1bmRlZmluZWQgPyBTdHJpbmcobGFiZWwpIDogREVGQVVMVF9FTkNPRElORztcbiAgICAgIHZhciBlbmNvZGluZyA9IGdldEVuY29kaW5nKGxhYmVsKTtcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gbnVsbCB8fCBlbmNvZGluZy5uYW1lID09PSAncmVwbGFjZW1lbnQnKVxuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgbGFiZWwpO1xuICAgICAgaWYgKCFlbmNvZGVyc1tlbmNvZGluZy5uYW1lXSkge1xuICAgICAgICB0aHJvdyBFcnJvcignRW5jb2RlciBub3QgcHJlc2VudC4nICtcbiAgICAgICAgICAgICAgICAgICAgJyBEaWQgeW91IGZvcmdldCB0byBpbmNsdWRlIGVuY29kaW5nLWluZGV4ZXMuanMgZmlyc3Q/Jyk7XG4gICAgICB9XG4gICAgICBlbmMuX2VuY29kaW5nID0gZW5jb2Rpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0YW5kYXJkIGJlaGF2aW9yLlxuICAgICAgZW5jLl9lbmNvZGluZyA9IGdldEVuY29kaW5nKCd1dGYtOCcpO1xuXG4gICAgICBpZiAobGFiZWwgIT09IHVuZGVmaW5lZCAmJiAnY29uc29sZScgaW4gZ2xvYmFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVGV4dEVuY29kZXIgY29uc3RydWN0b3IgY2FsbGVkIHdpdGggZW5jb2RpbmcgbGFiZWwsICdcbiAgICAgICAgICAgICAgICAgICAgICsgJ3doaWNoIGlzIGlnbm9yZWQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHByZS1FUzUgcnVudGltZXM6XG4gICAgaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydHkpXG4gICAgICB0aGlzLmVuY29kaW5nID0gZW5jLl9lbmNvZGluZy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyAzLiBSZXR1cm4gZW5jLlxuICAgIHJldHVybiBlbmM7XG4gIH1cblxuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgLy8gVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSdzIGdldHRlciBtdXN0IHJldHVybiBlbmNvZGluZydzIG5hbWUuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHRFbmNvZGVyLnByb3RvdHlwZSwgJ2VuY29kaW5nJywge1xuICAgICAgLyoqIEB0aGlzIHtUZXh0RW5jb2Rlcn0gKi9cbiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9lbmNvZGluZy5uYW1lLnRvTG93ZXJDYXNlKCk7IH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHJpbmcgVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHshVWludDhBcnJheX0gRW5jb2RlZCBieXRlcywgYXMgYSBVaW50OEFycmF5LlxuICAgKi9cbiAgVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShvcHRfc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgb3B0X3N0cmluZyA9IG9wdF9zdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKG9wdF9zdHJpbmcpO1xuICAgIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgICAvLyBOT1RFOiBUaGlzIG9wdGlvbiBpcyBub25zdGFuZGFyZC4gTm9uZSBvZiB0aGUgZW5jb2RpbmdzXG4gICAgLy8gcGVybWl0dGVkIGZvciBlbmNvZGluZyAoaS5lLiBVVEYtOCwgVVRGLTE2KSBhcmUgc3RhdGVmdWwgd2hlblxuICAgIC8vIHRoZSBpbnB1dCBpcyBhIFVTVlN0cmluZyBzbyBzdHJlYW1pbmcgaXMgbm90IG5lY2Vzc2FyeS5cbiAgICBpZiAoIXRoaXMuX2RvX25vdF9mbHVzaClcbiAgICAgIHRoaXMuX2VuY29kZXIgPSBlbmNvZGVyc1t0aGlzLl9lbmNvZGluZy5uYW1lXSh7XG4gICAgICAgIGZhdGFsOiB0aGlzLl9mYXRhbCA9PT0gJ2ZhdGFsJ30pO1xuICAgIHRoaXMuX2RvX25vdF9mbHVzaCA9IEJvb2xlYW4ob3B0aW9uc1snc3RyZWFtJ10pO1xuXG4gICAgLy8gMS4gQ29udmVydCBpbnB1dCB0byBhIHN0cmVhbS5cbiAgICB2YXIgaW5wdXQgPSBuZXcgU3RyZWFtKHN0cmluZ1RvQ29kZVBvaW50cyhvcHRfc3RyaW5nKSk7XG5cbiAgICAvLyAyLiBMZXQgb3V0cHV0IGJlIGEgbmV3IHN0cmVhbVxuICAgIHZhciBvdXRwdXQgPSBbXTtcblxuICAgIC8qKiBAdHlwZSB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gKi9cbiAgICB2YXIgcmVzdWx0O1xuICAgIC8vIDMuIFdoaWxlIHRydWUsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gMS4gTGV0IHRva2VuIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBmcm9tIGlucHV0LlxuICAgICAgdmFyIHRva2VuID0gaW5wdXQucmVhZCgpO1xuICAgICAgaWYgKHRva2VuID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIDIuIExldCByZXN1bHQgYmUgdGhlIHJlc3VsdCBvZiBwcm9jZXNzaW5nIHRva2VuIGZvciBlbmNvZGVyLFxuICAgICAgLy8gaW5wdXQsIG91dHB1dC5cbiAgICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZXIuaGFuZGxlcihpbnB1dCwgdG9rZW4pO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gZmluaXNoZWQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSlcbiAgICAgICAgb3V0cHV0LnB1c2guYXBwbHkob3V0cHV0LCAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHJlc3VsdCkpO1xuICAgICAgZWxzZVxuICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICAvLyBUT0RPOiBBbGlnbiB3aXRoIHNwZWMgYWxnb3JpdGhtLlxuICAgIGlmICghdGhpcy5fZG9fbm90X2ZsdXNoKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIoaW5wdXQsIGlucHV0LnJlYWQoKSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZpbmlzaGVkKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKVxuICAgICAgICAgIG91dHB1dC5wdXNoLmFwcGx5KG91dHB1dCwgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyhyZXN1bHQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9lbmNvZGVyID0gbnVsbDtcbiAgICB9XG4gICAgLy8gMy4gSWYgcmVzdWx0IGlzIGZpbmlzaGVkLCBjb252ZXJ0IG91dHB1dCBpbnRvIGEgYnl0ZSBzZXF1ZW5jZSxcbiAgICAvLyBhbmQgdGhlbiByZXR1cm4gYSBVaW50OEFycmF5IG9iamVjdCB3cmFwcGluZyBhbiBBcnJheUJ1ZmZlclxuICAgIC8vIGNvbnRhaW5pbmcgb3V0cHV0LlxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShvdXRwdXQpO1xuICB9O1xuXG5cbiAgLy9cbiAgLy8gOS4gVGhlIGVuY29kaW5nXG4gIC8vXG5cbiAgLy8gOS4xIHV0Zi04XG5cbiAgLy8gOS4xLjEgdXRmLTggZGVjb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtEZWNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIFVURjhEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuXG4gICAgLy8gdXRmLTgncyBkZWNvZGVyJ3MgaGFzIGFuIGFzc29jaWF0ZWQgdXRmLTggY29kZSBwb2ludCwgdXRmLThcbiAgICAvLyBieXRlcyBzZWVuLCBhbmQgdXRmLTggYnl0ZXMgbmVlZGVkIChhbGwgaW5pdGlhbGx5IDApLCBhIHV0Zi04XG4gICAgLy8gbG93ZXIgYm91bmRhcnkgKGluaXRpYWxseSAweDgwKSwgYW5kIGEgdXRmLTggdXBwZXIgYm91bmRhcnlcbiAgICAvLyAoaW5pdGlhbGx5IDB4QkYpLlxuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gdXRmOF9jb2RlX3BvaW50ID0gMCxcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIHV0ZjhfYnl0ZXNfc2VlbiA9IDAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X2J5dGVzX25lZWRlZCA9IDAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X2xvd2VyX2JvdW5kYXJ5ID0gMHg4MCxcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIHV0ZjhfdXBwZXJfYm91bmRhcnkgPSAweEJGO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIHV0Zi04IGJ5dGVzIG5lZWRlZCBpcyBub3QgMCxcbiAgICAgIC8vIHNldCB1dGYtOCBieXRlcyBuZWVkZWQgdG8gMCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgdXRmOF9ieXRlc19uZWVkZWQgIT09IDApIHtcbiAgICAgICAgdXRmOF9ieXRlc19uZWVkZWQgPSAwO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAzLiBJZiB1dGYtOCBieXRlcyBuZWVkZWQgaXMgMCwgYmFzZWQgb24gYnl0ZTpcbiAgICAgIGlmICh1dGY4X2J5dGVzX25lZWRlZCA9PT0gMCkge1xuXG4gICAgICAgIC8vIDB4MDAgdG8gMHg3RlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDAwLCAweDdGKSkge1xuICAgICAgICAgIC8vIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgYnl0ZS5cbiAgICAgICAgICByZXR1cm4gYml0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4QzIgdG8gMHhERlxuICAgICAgICBlbHNlIGlmIChpblJhbmdlKGJpdGUsIDB4QzIsIDB4REYpKSB7XG4gICAgICAgICAgLy8gMS4gU2V0IHV0Zi04IGJ5dGVzIG5lZWRlZCB0byAxLlxuICAgICAgICAgIHV0ZjhfYnl0ZXNfbmVlZGVkID0gMTtcblxuICAgICAgICAgIC8vIDIuIFNldCBVVEYtOCBjb2RlIHBvaW50IHRvIGJ5dGUgJiAweDFGLlxuICAgICAgICAgIHV0ZjhfY29kZV9wb2ludCA9IGJpdGUgJiAweDFGO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMHhFMCB0byAweEVGXG4gICAgICAgIGVsc2UgaWYgKGluUmFuZ2UoYml0ZSwgMHhFMCwgMHhFRikpIHtcbiAgICAgICAgICAvLyAxLiBJZiBieXRlIGlzIDB4RTAsIHNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweEEwLlxuICAgICAgICAgIGlmIChiaXRlID09PSAweEUwKVxuICAgICAgICAgICAgdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4QTA7XG4gICAgICAgICAgLy8gMi4gSWYgYnl0ZSBpcyAweEVELCBzZXQgdXRmLTggdXBwZXIgYm91bmRhcnkgdG8gMHg5Ri5cbiAgICAgICAgICBpZiAoYml0ZSA9PT0gMHhFRClcbiAgICAgICAgICAgIHV0ZjhfdXBwZXJfYm91bmRhcnkgPSAweDlGO1xuICAgICAgICAgIC8vIDMuIFNldCB1dGYtOCBieXRlcyBuZWVkZWQgdG8gMi5cbiAgICAgICAgICB1dGY4X2J5dGVzX25lZWRlZCA9IDI7XG4gICAgICAgICAgLy8gNC4gU2V0IFVURi04IGNvZGUgcG9pbnQgdG8gYnl0ZSAmIDB4Ri5cbiAgICAgICAgICB1dGY4X2NvZGVfcG9pbnQgPSBiaXRlICYgMHhGO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMHhGMCB0byAweEY0XG4gICAgICAgIGVsc2UgaWYgKGluUmFuZ2UoYml0ZSwgMHhGMCwgMHhGNCkpIHtcbiAgICAgICAgICAvLyAxLiBJZiBieXRlIGlzIDB4RjAsIHNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweDkwLlxuICAgICAgICAgIGlmIChiaXRlID09PSAweEYwKVxuICAgICAgICAgICAgdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4OTA7XG4gICAgICAgICAgLy8gMi4gSWYgYnl0ZSBpcyAweEY0LCBzZXQgdXRmLTggdXBwZXIgYm91bmRhcnkgdG8gMHg4Ri5cbiAgICAgICAgICBpZiAoYml0ZSA9PT0gMHhGNClcbiAgICAgICAgICAgIHV0ZjhfdXBwZXJfYm91bmRhcnkgPSAweDhGO1xuICAgICAgICAgIC8vIDMuIFNldCB1dGYtOCBieXRlcyBuZWVkZWQgdG8gMy5cbiAgICAgICAgICB1dGY4X2J5dGVzX25lZWRlZCA9IDM7XG4gICAgICAgICAgLy8gNC4gU2V0IFVURi04IGNvZGUgcG9pbnQgdG8gYnl0ZSAmIDB4Ny5cbiAgICAgICAgICB1dGY4X2NvZGVfcG9pbnQgPSBiaXRlICYgMHg3O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIFJldHVybiBlcnJvci5cbiAgICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBjb250aW51ZS5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGJ5dGUgaXMgbm90IGluIHRoZSByYW5nZSB1dGYtOCBsb3dlciBib3VuZGFyeSB0byB1dGYtOFxuICAgICAgLy8gdXBwZXIgYm91bmRhcnksIGluY2x1c2l2ZSwgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKCFpblJhbmdlKGJpdGUsIHV0ZjhfbG93ZXJfYm91bmRhcnksIHV0ZjhfdXBwZXJfYm91bmRhcnkpKSB7XG5cbiAgICAgICAgLy8gMS4gU2V0IHV0Zi04IGNvZGUgcG9pbnQsIHV0Zi04IGJ5dGVzIG5lZWRlZCwgYW5kIHV0Zi04XG4gICAgICAgIC8vIGJ5dGVzIHNlZW4gdG8gMCwgc2V0IHV0Zi04IGxvd2VyIGJvdW5kYXJ5IHRvIDB4ODAsIGFuZCBzZXRcbiAgICAgICAgLy8gdXRmLTggdXBwZXIgYm91bmRhcnkgdG8gMHhCRi5cbiAgICAgICAgdXRmOF9jb2RlX3BvaW50ID0gdXRmOF9ieXRlc19uZWVkZWQgPSB1dGY4X2J5dGVzX3NlZW4gPSAwO1xuICAgICAgICB1dGY4X2xvd2VyX2JvdW5kYXJ5ID0gMHg4MDtcbiAgICAgICAgdXRmOF91cHBlcl9ib3VuZGFyeSA9IDB4QkY7XG5cbiAgICAgICAgLy8gMi4gUHJlcGVuZCBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gMy4gUmV0dXJuIGVycm9yLlxuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gU2V0IHV0Zi04IGxvd2VyIGJvdW5kYXJ5IHRvIDB4ODAgYW5kIHV0Zi04IHVwcGVyIGJvdW5kYXJ5XG4gICAgICAvLyB0byAweEJGLlxuICAgICAgdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4ODA7XG4gICAgICB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHhCRjtcblxuICAgICAgLy8gNi4gU2V0IFVURi04IGNvZGUgcG9pbnQgdG8gKFVURi04IGNvZGUgcG9pbnQgPDwgNikgfCAoYnl0ZSAmXG4gICAgICAvLyAweDNGKVxuICAgICAgdXRmOF9jb2RlX3BvaW50ID0gKHV0ZjhfY29kZV9wb2ludCA8PCA2KSB8IChiaXRlICYgMHgzRik7XG5cbiAgICAgIC8vIDcuIEluY3JlYXNlIHV0Zi04IGJ5dGVzIHNlZW4gYnkgb25lLlxuICAgICAgdXRmOF9ieXRlc19zZWVuICs9IDE7XG5cbiAgICAgIC8vIDguIElmIHV0Zi04IGJ5dGVzIHNlZW4gaXMgbm90IGVxdWFsIHRvIHV0Zi04IGJ5dGVzIG5lZWRlZCxcbiAgICAgIC8vIGNvbnRpbnVlLlxuICAgICAgaWYgKHV0ZjhfYnl0ZXNfc2VlbiAhPT0gdXRmOF9ieXRlc19uZWVkZWQpXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAvLyA5LiBMZXQgY29kZSBwb2ludCBiZSB1dGYtOCBjb2RlIHBvaW50LlxuICAgICAgdmFyIGNvZGVfcG9pbnQgPSB1dGY4X2NvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDEwLiBTZXQgdXRmLTggY29kZSBwb2ludCwgdXRmLTggYnl0ZXMgbmVlZGVkLCBhbmQgdXRmLTggYnl0ZXNcbiAgICAgIC8vIHNlZW4gdG8gMC5cbiAgICAgIHV0ZjhfY29kZV9wb2ludCA9IHV0ZjhfYnl0ZXNfbmVlZGVkID0gdXRmOF9ieXRlc19zZWVuID0gMDtcblxuICAgICAgLy8gMTEuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuICAgIH07XG4gIH1cblxuICAvLyA5LjEuMiB1dGYtOCBlbmNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0VuY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gVVRGOEVuY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBJbnB1dCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge1xuICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIHJldHVybiBhIGJ5dGUgd2hvc2VcbiAgICAgIC8vIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDMuIFNldCBjb3VudCBhbmQgb2Zmc2V0IGJhc2VkIG9uIHRoZSByYW5nZSBjb2RlIHBvaW50IGlzIGluOlxuICAgICAgdmFyIGNvdW50LCBvZmZzZXQ7XG4gICAgICAvLyBVKzAwODAgdG8gVSswN0ZGLCBpbmNsdXNpdmU6XG4gICAgICBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweDAwODAsIDB4MDdGRikpIHtcbiAgICAgICAgLy8gMSBhbmQgMHhDMFxuICAgICAgICBjb3VudCA9IDE7XG4gICAgICAgIG9mZnNldCA9IDB4QzA7XG4gICAgICB9XG4gICAgICAvLyBVKzA4MDAgdG8gVStGRkZGLCBpbmNsdXNpdmU6XG4gICAgICBlbHNlIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4MDgwMCwgMHhGRkZGKSkge1xuICAgICAgICAvLyAyIGFuZCAweEUwXG4gICAgICAgIGNvdW50ID0gMjtcbiAgICAgICAgb2Zmc2V0ID0gMHhFMDtcbiAgICAgIH1cbiAgICAgIC8vIFUrMTAwMDAgdG8gVSsxMEZGRkYsIGluY2x1c2l2ZTpcbiAgICAgIGVsc2UgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHgxMDAwMCwgMHgxMEZGRkYpKSB7XG4gICAgICAgIC8vIDMgYW5kIDB4RjBcbiAgICAgICAgY291bnQgPSAzO1xuICAgICAgICBvZmZzZXQgPSAweEYwO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBMZXQgYnl0ZXMgYmUgYSBieXRlIHNlcXVlbmNlIHdob3NlIGZpcnN0IGJ5dGUgaXMgKGNvZGVcbiAgICAgIC8vIHBvaW50ID4+ICg2IMOXIGNvdW50KSkgKyBvZmZzZXQuXG4gICAgICB2YXIgYnl0ZXMgPSBbKGNvZGVfcG9pbnQgPj4gKDYgKiBjb3VudCkpICsgb2Zmc2V0XTtcblxuICAgICAgLy8gNS4gUnVuIHRoZXNlIHN1YnN0ZXBzIHdoaWxlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiAwOlxuICAgICAgd2hpbGUgKGNvdW50ID4gMCkge1xuXG4gICAgICAgIC8vIDEuIFNldCB0ZW1wIHRvIGNvZGUgcG9pbnQgPj4gKDYgw5cgKGNvdW50IOKIkiAxKSkuXG4gICAgICAgIHZhciB0ZW1wID0gY29kZV9wb2ludCA+PiAoNiAqIChjb3VudCAtIDEpKTtcblxuICAgICAgICAvLyAyLiBBcHBlbmQgdG8gYnl0ZXMgMHg4MCB8ICh0ZW1wICYgMHgzRikuXG4gICAgICAgIGJ5dGVzLnB1c2goMHg4MCB8ICh0ZW1wICYgMHgzRikpO1xuXG4gICAgICAgIC8vIDMuIERlY3JlYXNlIGNvdW50IGJ5IG9uZS5cbiAgICAgICAgY291bnQgLT0gMTtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gUmV0dXJuIGJ5dGVzIGJ5dGVzLCBpbiBvcmRlci5cbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snVVRGLTgnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjhFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydVVEYtOCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVVRGOERlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cbiAgLy9cbiAgLy8gMTAuIExlZ2FjeSBzaW5nbGUtYnl0ZSBlbmNvZGluZ3NcbiAgLy9cblxuICAvLyAxMC4xIHNpbmdsZS1ieXRlIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGluZGV4IFRoZSBlbmNvZGluZyBpbmRleC5cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBTaW5nbGVCeXRlRGVjb2RlcihpbmRleCwgb3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDMuIExldCBjb2RlIHBvaW50IGJlIHRoZSBpbmRleCBjb2RlIHBvaW50IGZvciBieXRlIOKIkiAweDgwIGluXG4gICAgICAvLyBpbmRleCBzaW5nbGUtYnl0ZS5cbiAgICAgIHZhciBjb2RlX3BvaW50ID0gaW5kZXhbYml0ZSAtIDB4ODBdO1xuXG4gICAgICAvLyA0LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgLy8gNS4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDEwLjIgc2luZ2xlLWJ5dGUgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0geyFBcnJheS48P251bWJlcj59IGluZGV4IFRoZSBlbmNvZGluZyBpbmRleC5cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBTaW5nbGVCeXRlRW5jb2RlcihpbmRleCwgb3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBJbnB1dCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge1xuICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIHJldHVybiBhIGJ5dGUgd2hvc2VcbiAgICAgIC8vIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDMuIExldCBwb2ludGVyIGJlIHRoZSBpbmRleCBwb2ludGVyIGZvciBjb2RlIHBvaW50IGluIGluZGV4XG4gICAgICAvLyBzaW5nbGUtYnl0ZS5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KTtcblxuICAgICAgLy8gNC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIGVuY29kZXJFcnJvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gNS4gUmV0dXJuIGEgYnl0ZSB3aG9zZSB2YWx1ZSBpcyBwb2ludGVyICsgMHg4MC5cbiAgICAgIHJldHVybiBwb2ludGVyICsgMHg4MDtcbiAgICB9O1xuICB9XG5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIGlmICghKCdlbmNvZGluZy1pbmRleGVzJyBpbiBnbG9iYWwpKVxuICAgICAgcmV0dXJuO1xuICAgIGVuY29kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uKGNhdGVnb3J5KSB7XG4gICAgICBpZiAoY2F0ZWdvcnkuaGVhZGluZyAhPT0gJ0xlZ2FjeSBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MnKVxuICAgICAgICByZXR1cm47XG4gICAgICBjYXRlZ29yeS5lbmNvZGluZ3MuZm9yRWFjaChmdW5jdGlvbihlbmNvZGluZykge1xuICAgICAgICB2YXIgbmFtZSA9IGVuY29kaW5nLm5hbWU7XG4gICAgICAgIHZhciBpZHggPSBpbmRleChuYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gICAgICAgIGRlY29kZXJzW25hbWVdID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBuZXcgU2luZ2xlQnl0ZURlY29kZXIoaWR4LCBvcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICAgICAgICBlbmNvZGVyc1tuYW1lXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZUJ5dGVFbmNvZGVyKGlkeCwgb3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSgpKTtcblxuICAvL1xuICAvLyAxMS4gTGVnYWN5IG11bHRpLWJ5dGUgQ2hpbmVzZSAoc2ltcGxpZmllZCkgZW5jb2RpbmdzXG4gIC8vXG5cbiAgLy8gMTEuMSBnYmtcblxuICAvLyAxMS4xLjEgZ2JrIGRlY29kZXJcbiAgLy8gZ2JrJ3MgZGVjb2RlciBpcyBnYjE4MDMwJ3MgZGVjb2Rlci5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snR0JLJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHQjE4MDMwRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuICAvLyAxMS4xLjIgZ2JrIGVuY29kZXJcbiAgLy8gZ2JrJ3MgZW5jb2RlciBpcyBnYjE4MDMwJ3MgZW5jb2RlciB3aXRoIGl0cyBnYmsgZmxhZyBzZXQuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ0dCSyddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR0IxODAzMEVuY29kZXIob3B0aW9ucywgdHJ1ZSk7XG4gIH07XG5cbiAgLy8gMTEuMiBnYjE4MDMwXG5cbiAgLy8gMTEuMi4xIGdiMTgwMzAgZGVjb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtEZWNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIEdCMTgwMzBEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8vIGdiMTgwMzAncyBkZWNvZGVyIGhhcyBhbiBhc3NvY2lhdGVkIGdiMTgwMzAgZmlyc3QsIGdiMTgwMzBcbiAgICAvLyBzZWNvbmQsIGFuZCBnYjE4MDMwIHRoaXJkIChhbGwgaW5pdGlhbGx5IDB4MDApLlxuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gZ2IxODAzMF9maXJzdCA9IDB4MDAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBnYjE4MDMwX3NlY29uZCA9IDB4MDAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBnYjE4MDMwX3RoaXJkID0gMHgwMDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIFRoZSBzdHJlYW0gb2YgYnl0ZXMgYmVpbmcgZGVjb2RlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0ZSBUaGUgbmV4dCBieXRlIHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4gez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9IFRoZSBuZXh0IGNvZGUgcG9pbnQocylcbiAgICAgKiAgICAgZGVjb2RlZCwgb3IgbnVsbCBpZiBub3QgZW5vdWdoIGRhdGEgZXhpc3RzIGluIHRoZSBpbnB1dFxuICAgICAqICAgICBzdHJlYW0gdG8gZGVjb2RlIGEgY29tcGxldGUgY29kZSBwb2ludC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGJpdGUpIHtcbiAgICAgIC8vIDEuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgZ2IxODAzMCBmaXJzdCwgZ2IxODAzMFxuICAgICAgLy8gc2Vjb25kLCBhbmQgZ2IxODAzMCB0aGlyZCBhcmUgMHgwMCwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgZ2IxODAzMF9maXJzdCA9PT0gMHgwMCAmJlxuICAgICAgICAgIGdiMTgwMzBfc2Vjb25kID09PSAweDAwICYmIGdiMTgwMzBfdGhpcmQgPT09IDB4MDApIHtcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgICAgfVxuICAgICAgLy8gMi4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtLCBhbmQgZ2IxODAzMCBmaXJzdCwgZ2IxODAzMFxuICAgICAgLy8gc2Vjb25kLCBvciBnYjE4MDMwIHRoaXJkIGlzIG5vdCAweDAwLCBzZXQgZ2IxODAzMCBmaXJzdCxcbiAgICAgIC8vIGdiMTgwMzAgc2Vjb25kLCBhbmQgZ2IxODAzMCB0aGlyZCB0byAweDAwLCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiZcbiAgICAgICAgICAoZ2IxODAzMF9maXJzdCAhPT0gMHgwMCB8fCBnYjE4MDMwX3NlY29uZCAhPT0gMHgwMCB8fFxuICAgICAgICAgICBnYjE4MDMwX3RoaXJkICE9PSAweDAwKSkge1xuICAgICAgICBnYjE4MDMwX2ZpcnN0ID0gMHgwMDtcbiAgICAgICAgZ2IxODAzMF9zZWNvbmQgPSAweDAwO1xuICAgICAgICBnYjE4MDMwX3RoaXJkID0gMHgwMDtcbiAgICAgICAgZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgIH1cbiAgICAgIHZhciBjb2RlX3BvaW50O1xuICAgICAgLy8gMy4gSWYgZ2IxODAzMCB0aGlyZCBpcyBub3QgMHgwMCwgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKGdiMTgwMzBfdGhpcmQgIT09IDB4MDApIHtcbiAgICAgICAgLy8gMS4gTGV0IGNvZGUgcG9pbnQgYmUgbnVsbC5cbiAgICAgICAgY29kZV9wb2ludCA9IG51bGw7XG4gICAgICAgIC8vIDIuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4MzAgdG8gMHgzOSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgICAgLy8gY29kZSBwb2ludCB0byB0aGUgaW5kZXggZ2IxODAzMCByYW5nZXMgY29kZSBwb2ludCBmb3JcbiAgICAgICAgLy8gKCgoZ2IxODAzMCBmaXJzdCDiiJIgMHg4MSkgw5cgMTAgKyBnYjE4MDMwIHNlY29uZCDiiJIgMHgzMCkgw5dcbiAgICAgICAgLy8gMTI2ICsgZ2IxODAzMCB0aGlyZCDiiJIgMHg4MSkgw5cgMTAgKyBieXRlIOKIkiAweDMwLlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDMwLCAweDM5KSkge1xuICAgICAgICAgIGNvZGVfcG9pbnQgPSBpbmRleEdCMTgwMzBSYW5nZXNDb2RlUG9pbnRGb3IoXG4gICAgICAgICAgICAgICgoKGdiMTgwMzBfZmlyc3QgLSAweDgxKSAqIDEwICsgZ2IxODAzMF9zZWNvbmQgLSAweDMwKSAqIDEyNiArXG4gICAgICAgICAgICAgICBnYjE4MDMwX3RoaXJkIC0gMHg4MSkgKiAxMCArIGJpdGUgLSAweDMwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIExldCBidWZmZXIgYmUgYSBieXRlIHNlcXVlbmNlIGNvbnNpc3Rpbmcgb2YgZ2IxODAzMFxuICAgICAgICAvLyBzZWNvbmQsIGdiMTgwMzAgdGhpcmQsIGFuZCBieXRlLCBpbiBvcmRlci5cbiAgICAgICAgdmFyIGJ1ZmZlciA9IFtnYjE4MDMwX3NlY29uZCwgZ2IxODAzMF90aGlyZCwgYml0ZV07XG5cbiAgICAgICAgLy8gNC4gU2V0IGdiMTgwMzAgZmlyc3QsIGdiMTgwMzAgc2Vjb25kLCBhbmQgZ2IxODAzMCB0aGlyZCB0b1xuICAgICAgICAvLyAweDAwLlxuICAgICAgICBnYjE4MDMwX2ZpcnN0ID0gMHgwMDtcbiAgICAgICAgZ2IxODAzMF9zZWNvbmQgPSAweDAwO1xuICAgICAgICBnYjE4MDMwX3RoaXJkID0gMHgwMDtcblxuICAgICAgICAvLyA1LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHByZXBlbmQgYnVmZmVyIHRvIHN0cmVhbSBhbmRcbiAgICAgICAgLy8gcmV0dXJuIGVycm9yLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gbnVsbCkge1xuICAgICAgICAgIHN0cmVhbS5wcmVwZW5kKGJ1ZmZlcik7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA2LiBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiBnYjE4MDMwIHNlY29uZCBpcyBub3QgMHgwMCwgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKGdiMTgwMzBfc2Vjb25kICE9PSAweDAwKSB7XG5cbiAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg4MSB0byAweEZFLCBpbmNsdXNpdmUsIHNldFxuICAgICAgICAvLyBnYjE4MDMwIHRoaXJkIHRvIGJ5dGUgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg4MSwgMHhGRSkpIHtcbiAgICAgICAgICBnYjE4MDMwX3RoaXJkID0gYml0ZTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFByZXBlbmQgZ2IxODAzMCBzZWNvbmQgZm9sbG93ZWQgYnkgYnl0ZSB0byBzdHJlYW0sIHNldFxuICAgICAgICAvLyBnYjE4MDMwIGZpcnN0IGFuZCBnYjE4MDMwIHNlY29uZCB0byAweDAwLCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgICBzdHJlYW0ucHJlcGVuZChbZ2IxODAzMF9zZWNvbmQsIGJpdGVdKTtcbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IDB4MDA7XG4gICAgICAgIGdiMTgwMzBfc2Vjb25kID0gMHgwMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIElmIGdiMTgwMzAgZmlyc3QgaXMgbm90IDB4MDAsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChnYjE4MDMwX2ZpcnN0ICE9PSAweDAwKSB7XG5cbiAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHgzMCB0byAweDM5LCBpbmNsdXNpdmUsIHNldFxuICAgICAgICAvLyBnYjE4MDMwIHNlY29uZCB0byBieXRlIGFuZCByZXR1cm4gY29udGludWUuXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4MzAsIDB4MzkpKSB7XG4gICAgICAgICAgZ2IxODAzMF9zZWNvbmQgPSBiaXRlO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gTGV0IGxlYWQgYmUgZ2IxODAzMCBmaXJzdCwgbGV0IHBvaW50ZXIgYmUgbnVsbCwgYW5kIHNldFxuICAgICAgICAvLyBnYjE4MDMwIGZpcnN0IHRvIDB4MDAuXG4gICAgICAgIHZhciBsZWFkID0gZ2IxODAzMF9maXJzdDtcbiAgICAgICAgdmFyIHBvaW50ZXIgPSBudWxsO1xuICAgICAgICBnYjE4MDMwX2ZpcnN0ID0gMHgwMDtcblxuICAgICAgICAvLyAzLiBMZXQgb2Zmc2V0IGJlIDB4NDAgaWYgYnl0ZSBpcyBsZXNzIHRoYW4gMHg3RiBhbmQgMHg0MVxuICAgICAgICAvLyBvdGhlcndpc2UuXG4gICAgICAgIHZhciBvZmZzZXQgPSBiaXRlIDwgMHg3RiA/IDB4NDAgOiAweDQxO1xuXG4gICAgICAgIC8vIDQuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4NDAgdG8gMHg3RSwgaW5jbHVzaXZlLCBvciAweDgwXG4gICAgICAgIC8vIHRvIDB4RkUsIGluY2x1c2l2ZSwgc2V0IHBvaW50ZXIgdG8gKGxlYWQg4oiSIDB4ODEpIMOXIDE5MCArXG4gICAgICAgIC8vIChieXRlIOKIkiBvZmZzZXQpLlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDQwLCAweDdFKSB8fCBpblJhbmdlKGJpdGUsIDB4ODAsIDB4RkUpKVxuICAgICAgICAgIHBvaW50ZXIgPSAobGVhZCAtIDB4ODEpICogMTkwICsgKGJpdGUgLSBvZmZzZXQpO1xuXG4gICAgICAgIC8vIDUuIExldCBjb2RlIHBvaW50IGJlIG51bGwgaWYgcG9pbnRlciBpcyBudWxsIGFuZCB0aGUgaW5kZXhcbiAgICAgICAgLy8gY29kZSBwb2ludCBmb3IgcG9pbnRlciBpbiBpbmRleCBnYjE4MDMwIG90aGVyd2lzZS5cbiAgICAgICAgY29kZV9wb2ludCA9IHBvaW50ZXIgPT09IG51bGwgPyBudWxsIDpcbiAgICAgICAgICAgIGluZGV4Q29kZVBvaW50Rm9yKHBvaW50ZXIsIGluZGV4KCdnYjE4MDMwJykpO1xuXG4gICAgICAgIC8vIDYuIElmIGNvZGUgcG9pbnQgaXMgbnVsbCBhbmQgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCBwcmVwZW5kXG4gICAgICAgIC8vIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gbnVsbCAmJiBpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChiaXRlKTtcblxuICAgICAgICAvLyA3LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHJldHVybiBlcnJvci5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgICAgLy8gOC4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCByZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlXG4gICAgICAvLyBpcyBieXRlLlxuICAgICAgaWYgKGlzQVNDSUlCeXRlKGJpdGUpKVxuICAgICAgICByZXR1cm4gYml0ZTtcblxuICAgICAgLy8gNy4gSWYgYnl0ZSBpcyAweDgwLCByZXR1cm4gY29kZSBwb2ludCBVKzIwQUMuXG4gICAgICBpZiAoYml0ZSA9PT0gMHg4MClcbiAgICAgICAgcmV0dXJuIDB4MjBBQztcblxuICAgICAgLy8gOC4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg4MSB0byAweEZFLCBpbmNsdXNpdmUsIHNldFxuICAgICAgLy8gZ2IxODAzMCBmaXJzdCB0byBieXRlIGFuZCByZXR1cm4gY29udGludWUuXG4gICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDgxLCAweEZFKSkge1xuICAgICAgICBnYjE4MDMwX2ZpcnN0ID0gYml0ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIDkuIFJldHVybiBlcnJvci5cbiAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgIH07XG4gIH1cblxuICAvLyAxMS4yLjIgZ2IxODAzMCBlbmNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0VuY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnYmtfZmxhZ1xuICAgKi9cbiAgZnVuY3Rpb24gR0IxODAzMEVuY29kZXIob3B0aW9ucywgZ2JrX2ZsYWcpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8vIGdiMTgwMzAncyBkZWNvZGVyIGhhcyBhbiBhc3NvY2lhdGVkIGdiayBmbGFnIChpbml0aWFsbHkgdW5zZXQpLlxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBJZiBjb2RlIHBvaW50IGlzIFUrRTVFNSwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSAweEU1RTUpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDQuIElmIHRoZSBnYmsgZmxhZyBpcyBzZXQgYW5kIGNvZGUgcG9pbnQgaXMgVSsyMEFDLCByZXR1cm5cbiAgICAgIC8vIGJ5dGUgMHg4MC5cbiAgICAgIGlmIChnYmtfZmxhZyAmJiBjb2RlX3BvaW50ID09PSAweDIwQUMpXG4gICAgICAgIHJldHVybiAweDgwO1xuXG4gICAgICAvLyA1LiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleFxuICAgICAgLy8gZ2IxODAzMC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KCdnYjE4MDMwJykpO1xuXG4gICAgICAvLyA2LiBJZiBwb2ludGVyIGlzIG5vdCBudWxsLCBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgICBpZiAocG9pbnRlciAhPT0gbnVsbCkge1xuXG4gICAgICAgIC8vIDEuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyAxOTApICsgMHg4MS5cbiAgICAgICAgdmFyIGxlYWQgPSBmbG9vcihwb2ludGVyIC8gMTkwKSArIDB4ODE7XG5cbiAgICAgICAgLy8gMi4gTGV0IHRyYWlsIGJlIHBvaW50ZXIgJSAxOTAuXG4gICAgICAgIHZhciB0cmFpbCA9IHBvaW50ZXIgJSAxOTA7XG5cbiAgICAgICAgLy8gMy4gTGV0IG9mZnNldCBiZSAweDQwIGlmIHRyYWlsIGlzIGxlc3MgdGhhbiAweDNGIGFuZCAweDQxIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIG9mZnNldCA9IHRyYWlsIDwgMHgzRiA/IDB4NDAgOiAweDQxO1xuXG4gICAgICAgIC8vIDQuIFJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBsZWFkIGFuZCB0cmFpbCArIG9mZnNldC5cbiAgICAgICAgcmV0dXJuIFtsZWFkLCB0cmFpbCArIG9mZnNldF07XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIElmIGdiayBmbGFnIGlzIHNldCwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChnYmtfZmxhZylcbiAgICAgICAgcmV0dXJuIGVuY29kZXJFcnJvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gOC4gU2V0IHBvaW50ZXIgdG8gdGhlIGluZGV4IGdiMTgwMzAgcmFuZ2VzIHBvaW50ZXIgZm9yIGNvZGVcbiAgICAgIC8vIHBvaW50LlxuICAgICAgcG9pbnRlciA9IGluZGV4R0IxODAzMFJhbmdlc1BvaW50ZXJGb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDkuIExldCBieXRlMSBiZSBmbG9vcihwb2ludGVyIC8gMTAgLyAxMjYgLyAxMCkuXG4gICAgICB2YXIgYnl0ZTEgPSBmbG9vcihwb2ludGVyIC8gMTAgLyAxMjYgLyAxMCk7XG5cbiAgICAgIC8vIDEwLiBTZXQgcG9pbnRlciB0byBwb2ludGVyIOKIkiBieXRlMSDDlyAxMCDDlyAxMjYgw5cgMTAuXG4gICAgICBwb2ludGVyID0gcG9pbnRlciAtIGJ5dGUxICogMTAgKiAxMjYgKiAxMDtcblxuICAgICAgLy8gMTEuIExldCBieXRlMiBiZSBmbG9vcihwb2ludGVyIC8gMTAgLyAxMjYpLlxuICAgICAgdmFyIGJ5dGUyID0gZmxvb3IocG9pbnRlciAvIDEwIC8gMTI2KTtcblxuICAgICAgLy8gMTIuIFNldCBwb2ludGVyIHRvIHBvaW50ZXIg4oiSIGJ5dGUyIMOXIDEwIMOXIDEyNi5cbiAgICAgIHBvaW50ZXIgPSBwb2ludGVyIC0gYnl0ZTIgKiAxMCAqIDEyNjtcblxuICAgICAgLy8gMTMuIExldCBieXRlMyBiZSBmbG9vcihwb2ludGVyIC8gMTApLlxuICAgICAgdmFyIGJ5dGUzID0gZmxvb3IocG9pbnRlciAvIDEwKTtcblxuICAgICAgLy8gMTQuIExldCBieXRlNCBiZSBwb2ludGVyIOKIkiBieXRlMyDDlyAxMC5cbiAgICAgIHZhciBieXRlNCA9IHBvaW50ZXIgLSBieXRlMyAqIDEwO1xuXG4gICAgICAvLyAxNS4gUmV0dXJuIGZvdXIgYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBieXRlMSArIDB4ODEsIGJ5dGUyICtcbiAgICAgIC8vIDB4MzAsIGJ5dGUzICsgMHg4MSwgYnl0ZTQgKyAweDMwLlxuICAgICAgcmV0dXJuIFtieXRlMSArIDB4ODEsXG4gICAgICAgICAgICAgIGJ5dGUyICsgMHgzMCxcbiAgICAgICAgICAgICAgYnl0ZTMgKyAweDgxLFxuICAgICAgICAgICAgICBieXRlNCArIDB4MzBdO1xuICAgIH07XG4gIH1cblxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydnYjE4MDMwJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHQjE4MDMwRW5jb2RlcihvcHRpb25zKTtcbiAgfTtcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snZ2IxODAzMCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR0IxODAzMERlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cblxuICAvL1xuICAvLyAxMi4gTGVnYWN5IG11bHRpLWJ5dGUgQ2hpbmVzZSAodHJhZGl0aW9uYWwpIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDEyLjEgQmlnNVxuXG4gIC8vIDEyLjEuMSBCaWc1IGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBCaWc1RGVjb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvLyBCaWc1J3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBCaWc1IGxlYWQgKGluaXRpYWxseSAweDAwKS5cbiAgICB2YXIgLyoqIEB0eXBlIHtudW1iZXJ9ICovIEJpZzVfbGVhZCA9IDB4MDA7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIFRoZSBzdHJlYW0gb2YgYnl0ZXMgYmVpbmcgZGVjb2RlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0ZSBUaGUgbmV4dCBieXRlIHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4gez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9IFRoZSBuZXh0IGNvZGUgcG9pbnQocylcbiAgICAgKiAgICAgZGVjb2RlZCwgb3IgbnVsbCBpZiBub3QgZW5vdWdoIGRhdGEgZXhpc3RzIGluIHRoZSBpbnB1dFxuICAgICAqICAgICBzdHJlYW0gdG8gZGVjb2RlIGEgY29tcGxldGUgY29kZSBwb2ludC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGJpdGUpIHtcbiAgICAgIC8vIDEuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgQmlnNSBsZWFkIGlzIG5vdCAweDAwLCBzZXRcbiAgICAgIC8vIEJpZzUgbGVhZCB0byAweDAwIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBCaWc1X2xlYWQgIT09IDB4MDApIHtcbiAgICAgICAgQmlnNV9sZWFkID0gMHgwMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgQmlnNSBsZWFkIGlzIDB4MDAsIHJldHVyblxuICAgICAgLy8gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBCaWc1X2xlYWQgPT09IDB4MDApXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMy4gSWYgQmlnNSBsZWFkIGlzIG5vdCAweDAwLCBsZXQgbGVhZCBiZSBCaWc1IGxlYWQsIGxldFxuICAgICAgLy8gcG9pbnRlciBiZSBudWxsLCBzZXQgQmlnNSBsZWFkIHRvIDB4MDAsIGFuZCB0aGVuIHJ1biB0aGVzZVxuICAgICAgLy8gc3Vic3RlcHM6XG4gICAgICBpZiAoQmlnNV9sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIHZhciBsZWFkID0gQmlnNV9sZWFkO1xuICAgICAgICB2YXIgcG9pbnRlciA9IG51bGw7XG4gICAgICAgIEJpZzVfbGVhZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMS4gTGV0IG9mZnNldCBiZSAweDQwIGlmIGJ5dGUgaXMgbGVzcyB0aGFuIDB4N0YgYW5kIDB4NjJcbiAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgb2Zmc2V0ID0gYml0ZSA8IDB4N0YgPyAweDQwIDogMHg2MjtcblxuICAgICAgICAvLyAyLiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweDQwIHRvIDB4N0UsIGluY2x1c2l2ZSwgb3IgMHhBMVxuICAgICAgICAvLyB0byAweEZFLCBpbmNsdXNpdmUsIHNldCBwb2ludGVyIHRvIChsZWFkIOKIkiAweDgxKSDDlyAxNTcgK1xuICAgICAgICAvLyAoYnl0ZSDiiJIgb2Zmc2V0KS5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg0MCwgMHg3RSkgfHwgaW5SYW5nZShiaXRlLCAweEExLCAweEZFKSlcbiAgICAgICAgICBwb2ludGVyID0gKGxlYWQgLSAweDgxKSAqIDE1NyArIChiaXRlIC0gb2Zmc2V0KTtcblxuICAgICAgICAvLyAzLiBJZiB0aGVyZSBpcyBhIHJvdyBpbiB0aGUgdGFibGUgYmVsb3cgd2hvc2UgZmlyc3QgY29sdW1uXG4gICAgICAgIC8vIGlzIHBvaW50ZXIsIHJldHVybiB0aGUgdHdvIGNvZGUgcG9pbnRzIGxpc3RlZCBpbiBpdHMgc2Vjb25kXG4gICAgICAgIC8vIGNvbHVtblxuICAgICAgICAvLyBQb2ludGVyIHwgQ29kZSBwb2ludHNcbiAgICAgICAgLy8gLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gMTEzMyAgICB8IFUrMDBDQSBVKzAzMDRcbiAgICAgICAgLy8gMTEzNSAgICB8IFUrMDBDQSBVKzAzMENcbiAgICAgICAgLy8gMTE2NCAgICB8IFUrMDBFQSBVKzAzMDRcbiAgICAgICAgLy8gMTE2NiAgICB8IFUrMDBFQSBVKzAzMENcbiAgICAgICAgc3dpdGNoIChwb2ludGVyKSB7XG4gICAgICAgICAgY2FzZSAxMTMzOiByZXR1cm4gWzB4MDBDQSwgMHgwMzA0XTtcbiAgICAgICAgICBjYXNlIDExMzU6IHJldHVybiBbMHgwMENBLCAweDAzMENdO1xuICAgICAgICAgIGNhc2UgMTE2NDogcmV0dXJuIFsweDAwRUEsIDB4MDMwNF07XG4gICAgICAgICAgY2FzZSAxMTY2OiByZXR1cm4gWzB4MDBFQSwgMHgwMzBDXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIExldCBjb2RlIHBvaW50IGJlIG51bGwgaWYgcG9pbnRlciBpcyBudWxsIGFuZCB0aGUgaW5kZXhcbiAgICAgICAgLy8gY29kZSBwb2ludCBmb3IgcG9pbnRlciBpbiBpbmRleCBCaWc1IG90aGVyd2lzZS5cbiAgICAgICAgdmFyIGNvZGVfcG9pbnQgPSAocG9pbnRlciA9PT0gbnVsbCkgPyBudWxsIDpcbiAgICAgICAgICAgIGluZGV4Q29kZVBvaW50Rm9yKHBvaW50ZXIsIGluZGV4KCdiaWc1JykpO1xuXG4gICAgICAgIC8vIDUuIElmIGNvZGUgcG9pbnQgaXMgbnVsbCBhbmQgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCBwcmVwZW5kXG4gICAgICAgIC8vIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gbnVsbCAmJiBpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChiaXRlKTtcblxuICAgICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHJldHVybiBlcnJvci5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgICAgLy8gNy4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCByZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlXG4gICAgICAvLyBpcyBieXRlLlxuICAgICAgaWYgKGlzQVNDSUlCeXRlKGJpdGUpKVxuICAgICAgICByZXR1cm4gYml0ZTtcblxuICAgICAgLy8gNS4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg4MSB0byAweEZFLCBpbmNsdXNpdmUsIHNldCBCaWc1XG4gICAgICAvLyBsZWFkIHRvIGJ5dGUgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4ODEsIDB4RkUpKSB7XG4gICAgICAgIEJpZzVfbGVhZCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA2LiBSZXR1cm4gZXJyb3IuXG4gICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTIuMS4yIEJpZzUgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIEJpZzVFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggQmlnNSBwb2ludGVyIGZvciBjb2RlIHBvaW50LlxuICAgICAgdmFyIHBvaW50ZXIgPSBpbmRleEJpZzVQb2ludGVyRm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA0LiBJZiBwb2ludGVyIGlzIG51bGwsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAocG9pbnRlciA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGVuY29kZXJFcnJvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gNS4gTGV0IGxlYWQgYmUgZmxvb3IocG9pbnRlciAvIDE1NykgKyAweDgxLlxuICAgICAgdmFyIGxlYWQgPSBmbG9vcihwb2ludGVyIC8gMTU3KSArIDB4ODE7XG5cbiAgICAgIC8vIDYuIElmIGxlYWQgaXMgbGVzcyB0aGFuIDB4QTEsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAobGVhZCA8IDB4QTEpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDcuIExldCB0cmFpbCBiZSBwb2ludGVyICUgMTU3LlxuICAgICAgdmFyIHRyYWlsID0gcG9pbnRlciAlIDE1NztcblxuICAgICAgLy8gOC4gTGV0IG9mZnNldCBiZSAweDQwIGlmIHRyYWlsIGlzIGxlc3MgdGhhbiAweDNGIGFuZCAweDYyXG4gICAgICAvLyBvdGhlcndpc2UuXG4gICAgICB2YXIgb2Zmc2V0ID0gdHJhaWwgPCAweDNGID8gMHg0MCA6IDB4NjI7XG5cbiAgICAgIC8vIFJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBsZWFkIGFuZCB0cmFpbCArIG9mZnNldC5cbiAgICAgIHJldHVybiBbbGVhZCwgdHJhaWwgKyBvZmZzZXRdO1xuICAgIH07XG4gIH1cblxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydCaWc1J10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBCaWc1RW5jb2RlcihvcHRpb25zKTtcbiAgfTtcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snQmlnNSddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgQmlnNURlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cblxuICAvL1xuICAvLyAxMy4gTGVnYWN5IG11bHRpLWJ5dGUgSmFwYW5lc2UgZW5jb2RpbmdzXG4gIC8vXG5cbiAgLy8gMTMuMSBldWMtanBcblxuICAvLyAxMy4xLjEgZXVjLWpwIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBFVUNKUERlY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG5cbiAgICAvLyBldWMtanAncyBkZWNvZGVyIGhhcyBhbiBhc3NvY2lhdGVkIGV1Yy1qcCBqaXMwMjEyIGZsYWdcbiAgICAvLyAoaW5pdGlhbGx5IHVuc2V0KSBhbmQgZXVjLWpwIGxlYWQgKGluaXRpYWxseSAweDAwKS5cbiAgICB2YXIgLyoqIEB0eXBlIHtib29sZWFufSAqLyBldWNqcF9qaXMwMjEyX2ZsYWcgPSBmYWxzZSxcbiAgICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIGV1Y2pwX2xlYWQgPSAweDAwO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIGV1Yy1qcCBsZWFkIGlzIG5vdCAweDAwLCBzZXRcbiAgICAgIC8vIGV1Yy1qcCBsZWFkIHRvIDB4MDAsIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBldWNqcF9sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIGV1Y2pwX2xlYWQgPSAweDAwO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCBldWMtanAgbGVhZCBpcyAweDAwLCByZXR1cm5cbiAgICAgIC8vIGZpbmlzaGVkLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgZXVjanBfbGVhZCA9PT0gMHgwMClcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAzLiBJZiBldWMtanAgbGVhZCBpcyAweDhFIGFuZCBieXRlIGlzIGluIHRoZSByYW5nZSAweEExIHRvXG4gICAgICAvLyAweERGLCBpbmNsdXNpdmUsIHNldCBldWMtanAgbGVhZCB0byAweDAwIGFuZCByZXR1cm4gYSBjb2RlXG4gICAgICAvLyBwb2ludCB3aG9zZSB2YWx1ZSBpcyAweEZGNjEg4oiSIDB4QTEgKyBieXRlLlxuICAgICAgaWYgKGV1Y2pwX2xlYWQgPT09IDB4OEUgJiYgaW5SYW5nZShiaXRlLCAweEExLCAweERGKSkge1xuICAgICAgICBldWNqcF9sZWFkID0gMHgwMDtcbiAgICAgICAgcmV0dXJuIDB4RkY2MSAtIDB4QTEgKyBiaXRlO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiBldWMtanAgbGVhZCBpcyAweDhGIGFuZCBieXRlIGlzIGluIHRoZSByYW5nZSAweEExIHRvXG4gICAgICAvLyAweEZFLCBpbmNsdXNpdmUsIHNldCB0aGUgZXVjLWpwIGppczAyMTIgZmxhZywgc2V0IGV1Yy1qcCBsZWFkXG4gICAgICAvLyB0byBieXRlLCBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKGV1Y2pwX2xlYWQgPT09IDB4OEYgJiYgaW5SYW5nZShiaXRlLCAweEExLCAweEZFKSkge1xuICAgICAgICBldWNqcF9qaXMwMjEyX2ZsYWcgPSB0cnVlO1xuICAgICAgICBldWNqcF9sZWFkID0gYml0ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIElmIGV1Yy1qcCBsZWFkIGlzIG5vdCAweDAwLCBsZXQgbGVhZCBiZSBldWMtanAgbGVhZCwgc2V0XG4gICAgICAvLyBldWMtanAgbGVhZCB0byAweDAwLCBhbmQgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKGV1Y2pwX2xlYWQgIT09IDB4MDApIHtcbiAgICAgICAgdmFyIGxlYWQgPSBldWNqcF9sZWFkO1xuICAgICAgICBldWNqcF9sZWFkID0gMHgwMDtcblxuICAgICAgICAvLyAxLiBMZXQgY29kZSBwb2ludCBiZSBudWxsLlxuICAgICAgICB2YXIgY29kZV9wb2ludCA9IG51bGw7XG5cbiAgICAgICAgLy8gMi4gSWYgbGVhZCBhbmQgYnl0ZSBhcmUgYm90aCBpbiB0aGUgcmFuZ2UgMHhBMSB0byAweEZFLFxuICAgICAgICAvLyBpbmNsdXNpdmUsIHNldCBjb2RlIHBvaW50IHRvIHRoZSBpbmRleCBjb2RlIHBvaW50IGZvciAobGVhZFxuICAgICAgICAvLyDiiJIgMHhBMSkgw5cgOTQgKyBieXRlIOKIkiAweEExIGluIGluZGV4IGppczAyMDggaWYgdGhlIGV1Yy1qcFxuICAgICAgICAvLyBqaXMwMjEyIGZsYWcgaXMgdW5zZXQgYW5kIGluIGluZGV4IGppczAyMTIgb3RoZXJ3aXNlLlxuICAgICAgICBpZiAoaW5SYW5nZShsZWFkLCAweEExLCAweEZFKSAmJiBpblJhbmdlKGJpdGUsIDB4QTEsIDB4RkUpKSB7XG4gICAgICAgICAgY29kZV9wb2ludCA9IGluZGV4Q29kZVBvaW50Rm9yKFxuICAgICAgICAgICAgKGxlYWQgLSAweEExKSAqIDk0ICsgKGJpdGUgLSAweEExKSxcbiAgICAgICAgICAgIGluZGV4KCFldWNqcF9qaXMwMjEyX2ZsYWcgPyAnamlzMDIwOCcgOiAnamlzMDIxMicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIFVuc2V0IHRoZSBldWMtanAgamlzMDIxMiBmbGFnLlxuICAgICAgICBldWNqcF9qaXMwMjEyX2ZsYWcgPSBmYWxzZTtcblxuICAgICAgICAvLyA0LiBJZiBieXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2UgMHhBMSB0byAweEZFLCBpbmNsdXNpdmUsXG4gICAgICAgIC8vIHByZXBlbmQgYnl0ZSB0byBzdHJlYW0uXG4gICAgICAgIGlmICghaW5SYW5nZShiaXRlLCAweEExLCAweEZFKSlcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChiaXRlKTtcblxuICAgICAgICAvLyA1LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHJldHVybiBlcnJvci5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgICAgLy8gNi4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCByZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlXG4gICAgICAvLyBpcyBieXRlLlxuICAgICAgaWYgKGlzQVNDSUlCeXRlKGJpdGUpKVxuICAgICAgICByZXR1cm4gYml0ZTtcblxuICAgICAgLy8gNy4gSWYgYnl0ZSBpcyAweDhFLCAweDhGLCBvciBpbiB0aGUgcmFuZ2UgMHhBMSB0byAweEZFLFxuICAgICAgLy8gaW5jbHVzaXZlLCBzZXQgZXVjLWpwIGxlYWQgdG8gYnl0ZSBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKGJpdGUgPT09IDB4OEUgfHwgYml0ZSA9PT0gMHg4RiB8fCBpblJhbmdlKGJpdGUsIDB4QTEsIDB4RkUpKSB7XG4gICAgICAgIGV1Y2pwX2xlYWQgPSBiaXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gOC4gUmV0dXJuIGVycm9yLlxuICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDEzLjEuMiBldWMtanAgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIEVVQ0pQRW5jb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZVxuICAgICAgLy8gdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gSWYgY29kZSBwb2ludCBpcyBVKzAwQTUsIHJldHVybiBieXRlIDB4NUMuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgwMEE1KVxuICAgICAgICByZXR1cm4gMHg1QztcblxuICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBVKzIwM0UsIHJldHVybiBieXRlIDB4N0UuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgyMDNFKVxuICAgICAgICByZXR1cm4gMHg3RTtcblxuICAgICAgLy8gNS4gSWYgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVStGRjYxIHRvIFUrRkY5RiwgaW5jbHVzaXZlLFxuICAgICAgLy8gcmV0dXJuIHR3byBieXRlcyB3aG9zZSB2YWx1ZXMgYXJlIDB4OEUgYW5kIGNvZGUgcG9pbnQg4oiSXG4gICAgICAvLyAweEZGNjEgKyAweEExLlxuICAgICAgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHhGRjYxLCAweEZGOUYpKVxuICAgICAgICByZXR1cm4gWzB4OEUsIGNvZGVfcG9pbnQgLSAweEZGNjEgKyAweEExXTtcblxuICAgICAgLy8gNi4gSWYgY29kZSBwb2ludCBpcyBVKzIyMTIsIHNldCBpdCB0byBVK0ZGMEQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgyMjEyKVxuICAgICAgICBjb2RlX3BvaW50ID0gMHhGRjBEO1xuXG4gICAgICAvLyA3LiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleFxuICAgICAgLy8gamlzMDIwOC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KCdqaXMwMjA4JykpO1xuXG4gICAgICAvLyA4LiBJZiBwb2ludGVyIGlzIG51bGwsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAocG9pbnRlciA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGVuY29kZXJFcnJvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gOS4gTGV0IGxlYWQgYmUgZmxvb3IocG9pbnRlciAvIDk0KSArIDB4QTEuXG4gICAgICB2YXIgbGVhZCA9IGZsb29yKHBvaW50ZXIgLyA5NCkgKyAweEExO1xuXG4gICAgICAvLyAxMC4gTGV0IHRyYWlsIGJlIHBvaW50ZXIgJSA5NCArIDB4QTEuXG4gICAgICB2YXIgdHJhaWwgPSBwb2ludGVyICUgOTQgKyAweEExO1xuXG4gICAgICAvLyAxMS4gUmV0dXJuIHR3byBieXRlcyB3aG9zZSB2YWx1ZXMgYXJlIGxlYWQgYW5kIHRyYWlsLlxuICAgICAgcmV0dXJuIFtsZWFkLCB0cmFpbF07XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ0VVQy1KUCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRVVDSlBFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydFVUMtSlAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEVVQ0pQRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuICAvLyAxMy4yIGlzby0yMDIyLWpwXG5cbiAgLy8gMTMuMi4xIGlzby0yMDIyLWpwIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBJU08yMDIySlBEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKiBAZW51bSAqL1xuICAgIHZhciBzdGF0ZXMgPSB7XG4gICAgICBBU0NJSTogMCxcbiAgICAgIFJvbWFuOiAxLFxuICAgICAgS2F0YWthbmE6IDIsXG4gICAgICBMZWFkQnl0ZTogMyxcbiAgICAgIFRyYWlsQnl0ZTogNCxcbiAgICAgIEVzY2FwZVN0YXJ0OiA1LFxuICAgICAgRXNjYXBlOiA2XG4gICAgfTtcbiAgICAvLyBpc28tMjAyMi1qcCdzIGRlY29kZXIgaGFzIGFuIGFzc29jaWF0ZWQgaXNvLTIwMjItanAgZGVjb2RlclxuICAgIC8vIHN0YXRlIChpbml0aWFsbHkgQVNDSUkpLCBpc28tMjAyMi1qcCBkZWNvZGVyIG91dHB1dCBzdGF0ZVxuICAgIC8vIChpbml0aWFsbHkgQVNDSUkpLCBpc28tMjAyMi1qcCBsZWFkIChpbml0aWFsbHkgMHgwMCksIGFuZFxuICAgIC8vIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIChpbml0aWFsbHkgdW5zZXQpLlxuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuQVNDSUksXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBpc28yMDIyanBfZGVjb2Rlcl9vdXRwdXRfc3RhdGUgPSBzdGF0ZXMuQVNDSUksXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBpc28yMDIyanBfbGVhZCA9IDB4MDAsXG4gICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8gaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyBzd2l0Y2hpbmcgb24gaXNvLTIwMjItanAgZGVjb2RlciBzdGF0ZTpcbiAgICAgIHN3aXRjaCAoaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlIHN0YXRlcy5BU0NJSTpcbiAgICAgICAgLy8gQVNDSUlcbiAgICAgICAgLy8gQmFzZWQgb24gYnl0ZTpcblxuICAgICAgICAvLyAweDFCXG4gICAgICAgIGlmIChiaXRlID09PSAweDFCKSB7XG4gICAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gZXNjYXBlIHN0YXJ0IGFuZCByZXR1cm5cbiAgICAgICAgICAvLyBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5Fc2NhcGVTdGFydDtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4MDAgdG8gMHg3RiwgZXhjbHVkaW5nIDB4MEUsIDB4MEYsIGFuZCAweDFCXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4MDAsIDB4N0YpICYmIGJpdGUgIT09IDB4MEVcbiAgICAgICAgICAgICYmIGJpdGUgIT09IDB4MEYgJiYgYml0ZSAhPT0gMHgxQikge1xuICAgICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyBhbmQgcmV0dXJuIGEgY29kZSBwb2ludFxuICAgICAgICAgIC8vIHdob3NlIHZhbHVlIGlzIGJ5dGUuXG4gICAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGJpdGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmQtb2Ytc3RyZWFtXG4gICAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGZpbmlzaGVkLlxuICAgICAgICAgIHJldHVybiBmaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICBjYXNlIHN0YXRlcy5Sb21hbjpcbiAgICAgICAgLy8gUm9tYW5cbiAgICAgICAgLy8gQmFzZWQgb24gYnl0ZTpcblxuICAgICAgICAvLyAweDFCXG4gICAgICAgIGlmIChiaXRlID09PSAweDFCKSB7XG4gICAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gZXNjYXBlIHN0YXJ0IGFuZCByZXR1cm5cbiAgICAgICAgICAvLyBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5Fc2NhcGVTdGFydDtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4NUNcbiAgICAgICAgaWYgKGJpdGUgPT09IDB4NUMpIHtcbiAgICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBjb2RlIHBvaW50XG4gICAgICAgICAgLy8gVSswMEE1LlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiAweDAwQTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDdFXG4gICAgICAgIGlmIChiaXRlID09PSAweDdFKSB7XG4gICAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gY29kZSBwb2ludFxuICAgICAgICAgIC8vIFUrMjAzRS5cbiAgICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gMHgyMDNFO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMHgwMCB0byAweDdGLCBleGNsdWRpbmcgMHgwRSwgMHgwRiwgMHgxQiwgMHg1QywgYW5kIDB4N0VcbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgwMCwgMHg3RikgJiYgYml0ZSAhPT0gMHgwRSAmJiBiaXRlICE9PSAweDBGXG4gICAgICAgICAgICAmJiBiaXRlICE9PSAweDFCICYmIGJpdGUgIT09IDB4NUMgJiYgYml0ZSAhPT0gMHg3RSkge1xuICAgICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyBhbmQgcmV0dXJuIGEgY29kZSBwb2ludFxuICAgICAgICAgIC8vIHdob3NlIHZhbHVlIGlzIGJ5dGUuXG4gICAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGJpdGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmQtb2Ytc3RyZWFtXG4gICAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGZpbmlzaGVkLlxuICAgICAgICAgIHJldHVybiBmaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICBjYXNlIHN0YXRlcy5LYXRha2FuYTpcbiAgICAgICAgLy8gS2F0YWthbmFcbiAgICAgICAgLy8gQmFzZWQgb24gYnl0ZTpcblxuICAgICAgICAvLyAweDFCXG4gICAgICAgIGlmIChiaXRlID09PSAweDFCKSB7XG4gICAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gZXNjYXBlIHN0YXJ0IGFuZCByZXR1cm5cbiAgICAgICAgICAvLyBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5Fc2NhcGVTdGFydDtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4MjEgdG8gMHg1RlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDIxLCAweDVGKSkge1xuICAgICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyBhbmQgcmV0dXJuIGEgY29kZSBwb2ludFxuICAgICAgICAgIC8vIHdob3NlIHZhbHVlIGlzIDB4RkY2MSDiiJIgMHgyMSArIGJ5dGUuXG4gICAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIDB4RkY2MSAtIDB4MjEgKyBiaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFJldHVybiBmaW5pc2hlZC5cbiAgICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuTGVhZEJ5dGU6XG4gICAgICAgIC8vIExlYWQgYnl0ZVxuICAgICAgICAvLyBCYXNlZCBvbiBieXRlOlxuXG4gICAgICAgIC8vIDB4MUJcbiAgICAgICAgaWYgKGJpdGUgPT09IDB4MUIpIHtcbiAgICAgICAgICAvLyBTZXQgaXNvLTIwMjItanAgZGVjb2RlciBzdGF0ZSB0byBlc2NhcGUgc3RhcnQgYW5kIHJldHVyblxuICAgICAgICAgIC8vIGNvbnRpbnVlLlxuICAgICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGVzLkVzY2FwZVN0YXJ0O1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMHgyMSB0byAweDdFXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4MjEsIDB4N0UpKSB7XG4gICAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnLCBzZXQgaXNvLTIwMjItanAgbGVhZFxuICAgICAgICAgIC8vIHRvIGJ5dGUsIGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gdHJhaWwgYnl0ZSwgYW5kXG4gICAgICAgICAgLy8gcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIGlzbzIwMjJqcF9sZWFkID0gYml0ZTtcbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5UcmFpbEJ5dGU7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmQtb2Ytc3RyZWFtXG4gICAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGZpbmlzaGVkLlxuICAgICAgICAgIHJldHVybiBmaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICBjYXNlIHN0YXRlcy5UcmFpbEJ5dGU6XG4gICAgICAgIC8vIFRyYWlsIGJ5dGVcbiAgICAgICAgLy8gQmFzZWQgb24gYnl0ZTpcblxuICAgICAgICAvLyAweDFCXG4gICAgICAgIGlmIChiaXRlID09PSAweDFCKSB7XG4gICAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gZXNjYXBlIHN0YXJ0IGFuZCByZXR1cm5cbiAgICAgICAgICAvLyBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5Fc2NhcGVTdGFydDtcbiAgICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4MjEgdG8gMHg3RVxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDIxLCAweDdFKSkge1xuICAgICAgICAgIC8vIDEuIFNldCB0aGUgaXNvLTIwMjItanAgZGVjb2RlciBzdGF0ZSB0byBsZWFkIGJ5dGUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuTGVhZEJ5dGU7XG5cbiAgICAgICAgICAvLyAyLiBMZXQgcG9pbnRlciBiZSAoaXNvLTIwMjItanAgbGVhZCDiiJIgMHgyMSkgw5cgOTQgKyBieXRlIOKIkiAweDIxLlxuICAgICAgICAgIHZhciBwb2ludGVyID0gKGlzbzIwMjJqcF9sZWFkIC0gMHgyMSkgKiA5NCArIGJpdGUgLSAweDIxO1xuXG4gICAgICAgICAgLy8gMy4gTGV0IGNvZGUgcG9pbnQgYmUgdGhlIGluZGV4IGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW5cbiAgICAgICAgICAvLyBpbmRleCBqaXMwMjA4LlxuICAgICAgICAgIHZhciBjb2RlX3BvaW50ID0gaW5kZXhDb2RlUG9pbnRGb3IocG9pbnRlciwgaW5kZXgoJ2ppczAyMDgnKSk7XG5cbiAgICAgICAgICAvLyA0LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHJldHVybiBlcnJvci5cbiAgICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgICAgLy8gNS4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFNldCB0aGUgaXNvLTIwMjItanAgZGVjb2RlciBzdGF0ZSB0byBsZWFkIGJ5dGUsIHByZXBlbmRcbiAgICAgICAgICAvLyBieXRlIHRvIHN0cmVhbSwgYW5kIHJldHVybiBlcnJvci5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5MZWFkQnl0ZTtcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChiaXRlKTtcbiAgICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgICAvLyBTZXQgaXNvLTIwMjItanAgZGVjb2RlciBzdGF0ZSB0byBsZWFkIGJ5dGUgYW5kIHJldHVyblxuICAgICAgICAvLyBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuTGVhZEJ5dGU7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICBjYXNlIHN0YXRlcy5Fc2NhcGVTdGFydDpcbiAgICAgICAgLy8gRXNjYXBlIHN0YXJ0XG5cbiAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlaXRoZXIgMHgyNCBvciAweDI4LCBzZXQgaXNvLTIwMjItanAgbGVhZCB0b1xuICAgICAgICAvLyBieXRlLCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSwgYW5kIHJldHVyblxuICAgICAgICAvLyBjb250aW51ZS5cbiAgICAgICAgaWYgKGJpdGUgPT09IDB4MjQgfHwgYml0ZSA9PT0gMHgyOCkge1xuICAgICAgICAgIGlzbzIwMjJqcF9sZWFkID0gYml0ZTtcbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5Fc2NhcGU7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBQcmVwZW5kIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBzdHJlYW0ucHJlcGVuZChiaXRlKTtcblxuICAgICAgICAvLyAzLiBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcsIHNldCBpc28tMjAyMi1qcFxuICAgICAgICAvLyBkZWNvZGVyIHN0YXRlIHRvIGlzby0yMDIyLWpwIGRlY29kZXIgb3V0cHV0IHN0YXRlLCBhbmRcbiAgICAgICAgLy8gcmV0dXJuIGVycm9yLlxuICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBpc28yMDIyanBfZGVjb2Rlcl9vdXRwdXRfc3RhdGU7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICBjYXNlIHN0YXRlcy5Fc2NhcGU6XG4gICAgICAgIC8vIEVzY2FwZVxuXG4gICAgICAgIC8vIDEuIExldCBsZWFkIGJlIGlzby0yMDIyLWpwIGxlYWQgYW5kIHNldCBpc28tMjAyMi1qcCBsZWFkIHRvXG4gICAgICAgIC8vIDB4MDAuXG4gICAgICAgIHZhciBsZWFkID0gaXNvMjAyMmpwX2xlYWQ7XG4gICAgICAgIGlzbzIwMjJqcF9sZWFkID0gMHgwMDtcblxuICAgICAgICAvLyAyLiBMZXQgc3RhdGUgYmUgbnVsbC5cbiAgICAgICAgdmFyIHN0YXRlID0gbnVsbDtcblxuICAgICAgICAvLyAzLiBJZiBsZWFkIGlzIDB4MjggYW5kIGJ5dGUgaXMgMHg0Miwgc2V0IHN0YXRlIHRvIEFTQ0lJLlxuICAgICAgICBpZiAobGVhZCA9PT0gMHgyOCAmJiBiaXRlID09PSAweDQyKVxuICAgICAgICAgIHN0YXRlID0gc3RhdGVzLkFTQ0lJO1xuXG4gICAgICAgIC8vIDQuIElmIGxlYWQgaXMgMHgyOCBhbmQgYnl0ZSBpcyAweDRBLCBzZXQgc3RhdGUgdG8gUm9tYW4uXG4gICAgICAgIGlmIChsZWFkID09PSAweDI4ICYmIGJpdGUgPT09IDB4NEEpXG4gICAgICAgICAgc3RhdGUgPSBzdGF0ZXMuUm9tYW47XG5cbiAgICAgICAgLy8gNS4gSWYgbGVhZCBpcyAweDI4IGFuZCBieXRlIGlzIDB4NDksIHNldCBzdGF0ZSB0byBLYXRha2FuYS5cbiAgICAgICAgaWYgKGxlYWQgPT09IDB4MjggJiYgYml0ZSA9PT0gMHg0OSlcbiAgICAgICAgICBzdGF0ZSA9IHN0YXRlcy5LYXRha2FuYTtcblxuICAgICAgICAvLyA2LiBJZiBsZWFkIGlzIDB4MjQgYW5kIGJ5dGUgaXMgZWl0aGVyIDB4NDAgb3IgMHg0Miwgc2V0XG4gICAgICAgIC8vIHN0YXRlIHRvIGxlYWQgYnl0ZS5cbiAgICAgICAgaWYgKGxlYWQgPT09IDB4MjQgJiYgKGJpdGUgPT09IDB4NDAgfHwgYml0ZSA9PT0gMHg0MikpXG4gICAgICAgICAgc3RhdGUgPSBzdGF0ZXMuTGVhZEJ5dGU7XG5cbiAgICAgICAgLy8gNy4gSWYgc3RhdGUgaXMgbm9uLW51bGwsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gMS4gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgYW5kIGlzby0yMDIyLWpwIGRlY29kZXJcbiAgICAgICAgICAvLyBvdXRwdXQgc3RhdGUgdG8gc3RhdGVzLlxuICAgICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZTtcblxuICAgICAgICAgIC8vIDIuIExldCBvdXRwdXQgZmxhZyBiZSB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcuXG4gICAgICAgICAgdmFyIG91dHB1dF9mbGFnID0gaXNvMjAyMmpwX291dHB1dF9mbGFnO1xuXG4gICAgICAgICAgLy8gMy4gU2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZy5cbiAgICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gNC4gUmV0dXJuIGNvbnRpbnVlLCBpZiBvdXRwdXQgZmxhZyBpcyB1bnNldCwgYW5kIGVycm9yXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICAgIHJldHVybiAhb3V0cHV0X2ZsYWcgPyBudWxsIDogZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDguIFByZXBlbmQgbGVhZCBhbmQgYnl0ZSB0byBzdHJlYW0uXG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKFtsZWFkLCBiaXRlXSk7XG5cbiAgICAgICAgLy8gOS4gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnLCBzZXQgaXNvLTIwMjItanBcbiAgICAgICAgLy8gZGVjb2RlciBzdGF0ZSB0byBpc28tMjAyMi1qcCBkZWNvZGVyIG91dHB1dCBzdGF0ZSBhbmRcbiAgICAgICAgLy8gcmV0dXJuIGVycm9yLlxuICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBpc28yMDIyanBfZGVjb2Rlcl9vdXRwdXRfc3RhdGU7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyAxMy4yLjIgaXNvLTIwMjItanAgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIElTTzIwMjJKUEVuY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLy8gaXNvLTIwMjItanAncyBlbmNvZGVyIGhhcyBhbiBhc3NvY2lhdGVkIGlzby0yMDIyLWpwIGVuY29kZXJcbiAgICAvLyBzdGF0ZSB3aGljaCBpcyBvbmUgb2YgQVNDSUksIFJvbWFuLCBhbmQgamlzMDIwOCAoaW5pdGlhbGx5XG4gICAgLy8gQVNDSUkpLlxuICAgIC8qKiBAZW51bSAqL1xuICAgIHZhciBzdGF0ZXMgPSB7XG4gICAgICBBU0NJSTogMCxcbiAgICAgIFJvbWFuOiAxLFxuICAgICAgamlzMDIwODogMlxuICAgIH07XG4gICAgdmFyIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBpc28yMDIyanBfc3RhdGUgPSBzdGF0ZXMuQVNDSUk7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBJbnB1dCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge1xuICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtIGFuZCBpc28tMjAyMi1qcCBlbmNvZGVyXG4gICAgICAvLyBzdGF0ZSBpcyBub3QgQVNDSUksIHByZXBlbmQgY29kZSBwb2ludCB0byBzdHJlYW0sIHNldFxuICAgICAgLy8gaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSB0byBBU0NJSSwgYW5kIHJldHVybiB0aHJlZSBieXRlc1xuICAgICAgLy8gMHgxQiAweDI4IDB4NDIuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSAmJlxuICAgICAgICAgIGlzbzIwMjJqcF9zdGF0ZSAhPT0gc3RhdGVzLkFTQ0lJKSB7XG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKGNvZGVfcG9pbnQpO1xuICAgICAgICBpc28yMDIyanBfc3RhdGUgPSBzdGF0ZXMuQVNDSUk7XG4gICAgICAgIHJldHVybiBbMHgxQiwgMHgyOCwgMHg0Ml07XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSBhbmQgaXNvLTIwMjItanAgZW5jb2RlclxuICAgICAgLy8gc3RhdGUgaXMgQVNDSUksIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtICYmIGlzbzIwMjJqcF9zdGF0ZSA9PT0gc3RhdGVzLkFTQ0lJKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDMuIElmIElTTy0yMDIyLUpQIGVuY29kZXIgc3RhdGUgaXMgQVNDSUkgb3IgUm9tYW4sIGFuZCBjb2RlXG4gICAgICAvLyBwb2ludCBpcyBVKzAwMEUsIFUrMDAwRiwgb3IgVSswMDFCLCByZXR1cm4gZXJyb3Igd2l0aCBVK0ZGRkQuXG4gICAgICBpZiAoKGlzbzIwMjJqcF9zdGF0ZSA9PT0gc3RhdGVzLkFTQ0lJIHx8XG4gICAgICAgICAgIGlzbzIwMjJqcF9zdGF0ZSA9PT0gc3RhdGVzLlJvbWFuKSAmJlxuICAgICAgICAgIChjb2RlX3BvaW50ID09PSAweDAwMEUgfHwgY29kZV9wb2ludCA9PT0gMHgwMDBGIHx8XG4gICAgICAgICAgIGNvZGVfcG9pbnQgPT09IDB4MDAxQikpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZXJFcnJvcigweEZGRkQpO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiBpc28tMjAyMi1qcCBlbmNvZGVyIHN0YXRlIGlzIEFTQ0lJIGFuZCBjb2RlIHBvaW50IGlzIGFuXG4gICAgICAvLyBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoaXNvMjAyMmpwX3N0YXRlID09PSBzdGF0ZXMuQVNDSUkgJiZcbiAgICAgICAgICBpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gNS4gSWYgaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSBpcyBSb21hbiBhbmQgY29kZSBwb2ludCBpcyBhblxuICAgICAgLy8gQVNDSUkgY29kZSBwb2ludCwgZXhjbHVkaW5nIFUrMDA1QyBhbmQgVSswMDdFLCBvciBpcyBVKzAwQTVcbiAgICAgIC8vIG9yIFUrMjAzRSwgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKGlzbzIwMjJqcF9zdGF0ZSA9PT0gc3RhdGVzLlJvbWFuICYmXG4gICAgICAgICAgKChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpICYmXG4gICAgICAgICAgIGNvZGVfcG9pbnQgIT09IDB4MDA1QyAmJiBjb2RlX3BvaW50ICE9PSAweDAwN0UpIHx8XG4gICAgICAgICAgKGNvZGVfcG9pbnQgPT0gMHgwMEE1IHx8IGNvZGVfcG9pbnQgPT0gMHgyMDNFKSkpIHtcblxuICAgICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIHJldHVybiBhIGJ5dGVcbiAgICAgICAgLy8gd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBVKzAwQTUsIHJldHVybiBieXRlIDB4NUMuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSAweDAwQTUpXG4gICAgICAgICAgcmV0dXJuIDB4NUM7XG5cbiAgICAgICAgLy8gMy4gSWYgY29kZSBwb2ludCBpcyBVKzIwM0UsIHJldHVybiBieXRlIDB4N0UuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSAweDIwM0UpXG4gICAgICAgICAgcmV0dXJuIDB4N0U7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgYW5kIGlzby0yMDIyLWpwXG4gICAgICAvLyBlbmNvZGVyIHN0YXRlIGlzIG5vdCBBU0NJSSwgcHJlcGVuZCBjb2RlIHBvaW50IHRvIHN0cmVhbSwgc2V0XG4gICAgICAvLyBpc28tMjAyMi1qcCBlbmNvZGVyIHN0YXRlIHRvIEFTQ0lJLCBhbmQgcmV0dXJuIHRocmVlIGJ5dGVzXG4gICAgICAvLyAweDFCIDB4MjggMHg0Mi5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpICYmXG4gICAgICAgICAgaXNvMjAyMmpwX3N0YXRlICE9PSBzdGF0ZXMuQVNDSUkpIHtcbiAgICAgICAgc3RyZWFtLnByZXBlbmQoY29kZV9wb2ludCk7XG4gICAgICAgIGlzbzIwMjJqcF9zdGF0ZSA9IHN0YXRlcy5BU0NJSTtcbiAgICAgICAgcmV0dXJuIFsweDFCLCAweDI4LCAweDQyXTtcbiAgICAgIH1cblxuICAgICAgLy8gNy4gSWYgY29kZSBwb2ludCBpcyBlaXRoZXIgVSswMEE1IG9yIFUrMjAzRSwgYW5kIGlzby0yMDIyLWpwXG4gICAgICAvLyBlbmNvZGVyIHN0YXRlIGlzIG5vdCBSb21hbiwgcHJlcGVuZCBjb2RlIHBvaW50IHRvIHN0cmVhbSwgc2V0XG4gICAgICAvLyBpc28tMjAyMi1qcCBlbmNvZGVyIHN0YXRlIHRvIFJvbWFuLCBhbmQgcmV0dXJuIHRocmVlIGJ5dGVzXG4gICAgICAvLyAweDFCIDB4MjggMHg0QS5cbiAgICAgIGlmICgoY29kZV9wb2ludCA9PT0gMHgwMEE1IHx8IGNvZGVfcG9pbnQgPT09IDB4MjAzRSkgJiZcbiAgICAgICAgICBpc28yMDIyanBfc3RhdGUgIT09IHN0YXRlcy5Sb21hbikge1xuICAgICAgICBzdHJlYW0ucHJlcGVuZChjb2RlX3BvaW50KTtcbiAgICAgICAgaXNvMjAyMmpwX3N0YXRlID0gc3RhdGVzLlJvbWFuO1xuICAgICAgICByZXR1cm4gWzB4MUIsIDB4MjgsIDB4NEFdO1xuICAgICAgfVxuXG4gICAgICAvLyA4LiBJZiBjb2RlIHBvaW50IGlzIFUrMjIxMiwgc2V0IGl0IHRvIFUrRkYwRC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSAweDIyMTIpXG4gICAgICAgIGNvZGVfcG9pbnQgPSAweEZGMEQ7XG5cbiAgICAgIC8vIDkuIExldCBwb2ludGVyIGJlIHRoZSBpbmRleCBwb2ludGVyIGZvciBjb2RlIHBvaW50IGluIGluZGV4XG4gICAgICAvLyBqaXMwMjA4LlxuICAgICAgdmFyIHBvaW50ZXIgPSBpbmRleFBvaW50ZXJGb3IoY29kZV9wb2ludCwgaW5kZXgoJ2ppczAyMDgnKSk7XG5cbiAgICAgIC8vIDEwLiBJZiBwb2ludGVyIGlzIG51bGwsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAocG9pbnRlciA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGVuY29kZXJFcnJvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gMTEuIElmIGlzby0yMDIyLWpwIGVuY29kZXIgc3RhdGUgaXMgbm90IGppczAyMDgsIHByZXBlbmQgY29kZVxuICAgICAgLy8gcG9pbnQgdG8gc3RyZWFtLCBzZXQgaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSB0byBqaXMwMjA4LFxuICAgICAgLy8gYW5kIHJldHVybiB0aHJlZSBieXRlcyAweDFCIDB4MjQgMHg0Mi5cbiAgICAgIGlmIChpc28yMDIyanBfc3RhdGUgIT09IHN0YXRlcy5qaXMwMjA4KSB7XG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKGNvZGVfcG9pbnQpO1xuICAgICAgICBpc28yMDIyanBfc3RhdGUgPSBzdGF0ZXMuamlzMDIwODtcbiAgICAgICAgcmV0dXJuIFsweDFCLCAweDI0LCAweDQyXTtcbiAgICAgIH1cblxuICAgICAgLy8gMTIuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyA5NCkgKyAweDIxLlxuICAgICAgdmFyIGxlYWQgPSBmbG9vcihwb2ludGVyIC8gOTQpICsgMHgyMTtcblxuICAgICAgLy8gMTMuIExldCB0cmFpbCBiZSBwb2ludGVyICUgOTQgKyAweDIxLlxuICAgICAgdmFyIHRyYWlsID0gcG9pbnRlciAlIDk0ICsgMHgyMTtcblxuICAgICAgLy8gMTQuIFJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBsZWFkIGFuZCB0cmFpbC5cbiAgICAgIHJldHVybiBbbGVhZCwgdHJhaWxdO1xuICAgIH07XG4gIH1cblxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydJU08tMjAyMi1KUCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgSVNPMjAyMkpQRW5jb2RlcihvcHRpb25zKTtcbiAgfTtcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snSVNPLTIwMjItSlAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IElTTzIwMjJKUERlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cbiAgLy8gMTMuMyBTaGlmdF9KSVNcblxuICAvLyAxMy4zLjEgU2hpZnRfSklTIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBTaGlmdEpJU0RlY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLy8gU2hpZnRfSklTJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBTaGlmdF9KSVMgbGVhZCAoaW5pdGlhbGx5XG4gICAgLy8gMHgwMCkuXG4gICAgdmFyIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBTaGlmdF9KSVNfbGVhZCA9IDB4MDA7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIFNoaWZ0X0pJUyBsZWFkIGlzIG5vdCAweDAwLFxuICAgICAgLy8gc2V0IFNoaWZ0X0pJUyBsZWFkIHRvIDB4MDAgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIFNoaWZ0X0pJU19sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIFNoaWZ0X0pJU19sZWFkID0gMHgwMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgU2hpZnRfSklTIGxlYWQgaXMgMHgwMCxcbiAgICAgIC8vIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIFNoaWZ0X0pJU19sZWFkID09PSAweDAwKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDMuIElmIFNoaWZ0X0pJUyBsZWFkIGlzIG5vdCAweDAwLCBsZXQgbGVhZCBiZSBTaGlmdF9KSVMgbGVhZCxcbiAgICAgIC8vIGxldCBwb2ludGVyIGJlIG51bGwsIHNldCBTaGlmdF9KSVMgbGVhZCB0byAweDAwLCBhbmQgdGhlbiBydW5cbiAgICAgIC8vIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKFNoaWZ0X0pJU19sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIHZhciBsZWFkID0gU2hpZnRfSklTX2xlYWQ7XG4gICAgICAgIHZhciBwb2ludGVyID0gbnVsbDtcbiAgICAgICAgU2hpZnRfSklTX2xlYWQgPSAweDAwO1xuXG4gICAgICAgIC8vIDEuIExldCBvZmZzZXQgYmUgMHg0MCwgaWYgYnl0ZSBpcyBsZXNzIHRoYW4gMHg3RiwgYW5kIDB4NDFcbiAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgb2Zmc2V0ID0gKGJpdGUgPCAweDdGKSA/IDB4NDAgOiAweDQxO1xuXG4gICAgICAgIC8vIDIuIExldCBsZWFkIG9mZnNldCBiZSAweDgxLCBpZiBsZWFkIGlzIGxlc3MgdGhhbiAweEEwLCBhbmRcbiAgICAgICAgLy8gMHhDMSBvdGhlcndpc2UuXG4gICAgICAgIHZhciBsZWFkX29mZnNldCA9IChsZWFkIDwgMHhBMCkgPyAweDgxIDogMHhDMTtcblxuICAgICAgICAvLyAzLiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweDQwIHRvIDB4N0UsIGluY2x1c2l2ZSwgb3IgMHg4MFxuICAgICAgICAvLyB0byAweEZDLCBpbmNsdXNpdmUsIHNldCBwb2ludGVyIHRvIChsZWFkIOKIkiBsZWFkIG9mZnNldCkgw5dcbiAgICAgICAgLy8gMTg4ICsgYnl0ZSDiiJIgb2Zmc2V0LlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDQwLCAweDdFKSB8fCBpblJhbmdlKGJpdGUsIDB4ODAsIDB4RkMpKVxuICAgICAgICAgIHBvaW50ZXIgPSAobGVhZCAtIGxlYWRfb2Zmc2V0KSAqIDE4OCArIGJpdGUgLSBvZmZzZXQ7XG5cbiAgICAgICAgLy8gNC4gSWYgcG9pbnRlciBpcyBpbiB0aGUgcmFuZ2UgODgzNiB0byAxMDcxNSwgaW5jbHVzaXZlLFxuICAgICAgICAvLyByZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIDB4RTAwMCDiiJIgODgzNiArIHBvaW50ZXIuXG4gICAgICAgIGlmIChpblJhbmdlKHBvaW50ZXIsIDg4MzYsIDEwNzE1KSlcbiAgICAgICAgICByZXR1cm4gMHhFMDAwIC0gODgzNiArIHBvaW50ZXI7XG5cbiAgICAgICAgLy8gNS4gTGV0IGNvZGUgcG9pbnQgYmUgbnVsbCwgaWYgcG9pbnRlciBpcyBudWxsLCBhbmQgdGhlXG4gICAgICAgIC8vIGluZGV4IGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW4gaW5kZXggamlzMDIwOCBvdGhlcndpc2UuXG4gICAgICAgIHZhciBjb2RlX3BvaW50ID0gKHBvaW50ZXIgPT09IG51bGwpID8gbnVsbCA6XG4gICAgICAgICAgICAgIGluZGV4Q29kZVBvaW50Rm9yKHBvaW50ZXIsIGluZGV4KCdqaXMwMjA4JykpO1xuXG4gICAgICAgIC8vIDYuIElmIGNvZGUgcG9pbnQgaXMgbnVsbCBhbmQgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCBwcmVwZW5kXG4gICAgICAgIC8vIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gbnVsbCAmJiBpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChiaXRlKTtcblxuICAgICAgICAvLyA3LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHJldHVybiBlcnJvci5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgICAgLy8gOC4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgYnl0ZSBpcyBhbiBBU0NJSSBieXRlIG9yIDB4ODAsIHJldHVybiBhIGNvZGUgcG9pbnRcbiAgICAgIC8vIHdob3NlIHZhbHVlIGlzIGJ5dGUuXG4gICAgICBpZiAoaXNBU0NJSUJ5dGUoYml0ZSkgfHwgYml0ZSA9PT0gMHg4MClcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDUuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4QTEgdG8gMHhERiwgaW5jbHVzaXZlLCByZXR1cm4gYVxuICAgICAgLy8gY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyAweEZGNjEg4oiSIDB4QTEgKyBieXRlLlxuICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHhBMSwgMHhERikpXG4gICAgICAgIHJldHVybiAweEZGNjEgLSAweEExICsgYml0ZTtcblxuICAgICAgLy8gNi4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg4MSB0byAweDlGLCBpbmNsdXNpdmUsIG9yIDB4RTBcbiAgICAgIC8vIHRvIDB4RkMsIGluY2x1c2l2ZSwgc2V0IFNoaWZ0X0pJUyBsZWFkIHRvIGJ5dGUgYW5kIHJldHVyblxuICAgICAgLy8gY29udGludWUuXG4gICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDgxLCAweDlGKSB8fCBpblJhbmdlKGJpdGUsIDB4RTAsIDB4RkMpKSB7XG4gICAgICAgIFNoaWZ0X0pJU19sZWFkID0gYml0ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIFJldHVybiBlcnJvci5cbiAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgIH07XG4gIH1cblxuICAvLyAxMy4zLjIgU2hpZnRfSklTIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBTaGlmdEpJU0VuY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBJbnB1dCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge1xuICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQgb3IgVSswMDgwLCByZXR1cm4gYVxuICAgICAgLy8gYnl0ZSB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkgfHwgY29kZV9wb2ludCA9PT0gMHgwMDgwKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gSWYgY29kZSBwb2ludCBpcyBVKzAwQTUsIHJldHVybiBieXRlIDB4NUMuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgwMEE1KVxuICAgICAgICByZXR1cm4gMHg1QztcblxuICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBVKzIwM0UsIHJldHVybiBieXRlIDB4N0UuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgyMDNFKVxuICAgICAgICByZXR1cm4gMHg3RTtcblxuICAgICAgLy8gNS4gSWYgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVStGRjYxIHRvIFUrRkY5RiwgaW5jbHVzaXZlLFxuICAgICAgLy8gcmV0dXJuIGEgYnl0ZSB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50IOKIkiAweEZGNjEgKyAweEExLlxuICAgICAgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHhGRjYxLCAweEZGOUYpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludCAtIDB4RkY2MSArIDB4QTE7XG5cbiAgICAgIC8vIDYuIElmIGNvZGUgcG9pbnQgaXMgVSsyMjEyLCBzZXQgaXQgdG8gVStGRjBELlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjIxMilcbiAgICAgICAgY29kZV9wb2ludCA9IDB4RkYwRDtcblxuICAgICAgLy8gNy4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IFNoaWZ0X0pJUyBwb2ludGVyIGZvciBjb2RlIHBvaW50LlxuICAgICAgdmFyIHBvaW50ZXIgPSBpbmRleFNoaWZ0SklTUG9pbnRlckZvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gOC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDkuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyAxODgpLlxuICAgICAgdmFyIGxlYWQgPSBmbG9vcihwb2ludGVyIC8gMTg4KTtcblxuICAgICAgLy8gMTAuIExldCBsZWFkIG9mZnNldCBiZSAweDgxLCBpZiBsZWFkIGlzIGxlc3MgdGhhbiAweDFGLCBhbmRcbiAgICAgIC8vIDB4QzEgb3RoZXJ3aXNlLlxuICAgICAgdmFyIGxlYWRfb2Zmc2V0ID0gKGxlYWQgPCAweDFGKSA/IDB4ODEgOiAweEMxO1xuXG4gICAgICAvLyAxMS4gTGV0IHRyYWlsIGJlIHBvaW50ZXIgJSAxODguXG4gICAgICB2YXIgdHJhaWwgPSBwb2ludGVyICUgMTg4O1xuXG4gICAgICAvLyAxMi4gTGV0IG9mZnNldCBiZSAweDQwLCBpZiB0cmFpbCBpcyBsZXNzIHRoYW4gMHgzRiwgYW5kIDB4NDFcbiAgICAgIC8vIG90aGVyd2lzZS5cbiAgICAgIHZhciBvZmZzZXQgPSAodHJhaWwgPCAweDNGKSA/IDB4NDAgOiAweDQxO1xuXG4gICAgICAvLyAxMy4gUmV0dXJuIHR3byBieXRlcyB3aG9zZSB2YWx1ZXMgYXJlIGxlYWQgKyBsZWFkIG9mZnNldCBhbmRcbiAgICAgIC8vIHRyYWlsICsgb2Zmc2V0LlxuICAgICAgcmV0dXJuIFtsZWFkICsgbGVhZF9vZmZzZXQsIHRyYWlsICsgb2Zmc2V0XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snU2hpZnRfSklTJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBTaGlmdEpJU0VuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ1NoaWZ0X0pJUyddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgU2hpZnRKSVNEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vXG4gIC8vIDE0LiBMZWdhY3kgbXVsdGktYnl0ZSBLb3JlYW4gZW5jb2RpbmdzXG4gIC8vXG5cbiAgLy8gMTQuMSBldWMta3JcblxuICAvLyAxNC4xLjEgZXVjLWtyIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBFVUNLUkRlY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG5cbiAgICAvLyBldWMta3IncyBkZWNvZGVyIGhhcyBhbiBhc3NvY2lhdGVkIGV1Yy1rciBsZWFkIChpbml0aWFsbHkgMHgwMCkuXG4gICAgdmFyIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBldWNrcl9sZWFkID0gMHgwMDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIFRoZSBzdHJlYW0gb2YgYnl0ZXMgYmVpbmcgZGVjb2RlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0ZSBUaGUgbmV4dCBieXRlIHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4gez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9IFRoZSBuZXh0IGNvZGUgcG9pbnQocylcbiAgICAgKiAgICAgZGVjb2RlZCwgb3IgbnVsbCBpZiBub3QgZW5vdWdoIGRhdGEgZXhpc3RzIGluIHRoZSBpbnB1dFxuICAgICAqICAgICBzdHJlYW0gdG8gZGVjb2RlIGEgY29tcGxldGUgY29kZSBwb2ludC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGJpdGUpIHtcbiAgICAgIC8vIDEuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgZXVjLWtyIGxlYWQgaXMgbm90IDB4MDAsIHNldFxuICAgICAgLy8gZXVjLWtyIGxlYWQgdG8gMHgwMCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgZXVja3JfbGVhZCAhPT0gMCkge1xuICAgICAgICBldWNrcl9sZWFkID0gMHgwMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgZXVjLWtyIGxlYWQgaXMgMHgwMCwgcmV0dXJuXG4gICAgICAvLyBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIGV1Y2tyX2xlYWQgPT09IDApXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMy4gSWYgZXVjLWtyIGxlYWQgaXMgbm90IDB4MDAsIGxldCBsZWFkIGJlIGV1Yy1rciBsZWFkLCBsZXRcbiAgICAgIC8vIHBvaW50ZXIgYmUgbnVsbCwgc2V0IGV1Yy1rciBsZWFkIHRvIDB4MDAsIGFuZCB0aGVuIHJ1biB0aGVzZVxuICAgICAgLy8gc3Vic3RlcHM6XG4gICAgICBpZiAoZXVja3JfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICB2YXIgbGVhZCA9IGV1Y2tyX2xlYWQ7XG4gICAgICAgIHZhciBwb2ludGVyID0gbnVsbDtcbiAgICAgICAgZXVja3JfbGVhZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg0MSB0byAweEZFLCBpbmNsdXNpdmUsIHNldFxuICAgICAgICAvLyBwb2ludGVyIHRvIChsZWFkIOKIkiAweDgxKSDDlyAxOTAgKyAoYnl0ZSDiiJIgMHg0MSkuXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4NDEsIDB4RkUpKVxuICAgICAgICAgIHBvaW50ZXIgPSAobGVhZCAtIDB4ODEpICogMTkwICsgKGJpdGUgLSAweDQxKTtcblxuICAgICAgICAvLyAyLiBMZXQgY29kZSBwb2ludCBiZSBudWxsLCBpZiBwb2ludGVyIGlzIG51bGwsIGFuZCB0aGVcbiAgICAgICAgLy8gaW5kZXggY29kZSBwb2ludCBmb3IgcG9pbnRlciBpbiBpbmRleCBldWMta3Igb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgY29kZV9wb2ludCA9IChwb2ludGVyID09PSBudWxsKVxuICAgICAgICAgICAgICA/IG51bGwgOiBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCgnZXVjLWtyJykpO1xuXG4gICAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgbnVsbCBhbmQgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCBwcmVwZW5kXG4gICAgICAgIC8vIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBpZiAocG9pbnRlciA9PT0gbnVsbCAmJiBpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChiaXRlKTtcblxuICAgICAgICAvLyA0LiBJZiBjb2RlIHBvaW50IGlzIG51bGwsIHJldHVybiBlcnJvci5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgICAgLy8gNS4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgYnl0ZSBpcyBhbiBBU0NJSSBieXRlLCByZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlXG4gICAgICAvLyBpcyBieXRlLlxuICAgICAgaWYgKGlzQVNDSUlCeXRlKGJpdGUpKVxuICAgICAgICByZXR1cm4gYml0ZTtcblxuICAgICAgLy8gNS4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg4MSB0byAweEZFLCBpbmNsdXNpdmUsIHNldFxuICAgICAgLy8gZXVjLWtyIGxlYWQgdG8gYnl0ZSBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg4MSwgMHhGRSkpIHtcbiAgICAgICAgZXVja3JfbGVhZCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA2LiBSZXR1cm4gZXJyb3IuXG4gICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTQuMS4yIGV1Yy1rciBlbmNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0VuY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gRVVDS1JFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleFxuICAgICAgLy8gZXVjLWtyLlxuICAgICAgdmFyIHBvaW50ZXIgPSBpbmRleFBvaW50ZXJGb3IoY29kZV9wb2ludCwgaW5kZXgoJ2V1Yy1rcicpKTtcblxuICAgICAgLy8gNC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDUuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyAxOTApICsgMHg4MS5cbiAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDE5MCkgKyAweDgxO1xuXG4gICAgICAvLyA2LiBMZXQgdHJhaWwgYmUgcG9pbnRlciAlIDE5MCArIDB4NDEuXG4gICAgICB2YXIgdHJhaWwgPSAocG9pbnRlciAlIDE5MCkgKyAweDQxO1xuXG4gICAgICAvLyA3LiBSZXR1cm4gdHdvIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgbGVhZCBhbmQgdHJhaWwuXG4gICAgICByZXR1cm4gW2xlYWQsIHRyYWlsXTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snRVVDLUtSJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBFVUNLUkVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ0VVQy1LUiddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRVVDS1JEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG5cbiAgLy9cbiAgLy8gMTUuIExlZ2FjeSBtaXNjZWxsYW5lb3VzIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDE1LjEgcmVwbGFjZW1lbnRcblxuICAvLyBOb3QgbmVlZGVkIC0gQVBJIHRocm93cyBSYW5nZUVycm9yXG5cbiAgLy8gMTUuMiBDb21tb24gaW5mcmFzdHJ1Y3R1cmUgZm9yIHV0Zi0xNmJlIGFuZCB1dGYtMTZsZVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV91bml0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXRmMTZiZVxuICAgKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzXG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0Q29kZVVuaXRUb0J5dGVzKGNvZGVfdW5pdCwgdXRmMTZiZSkge1xuICAgIC8vIDEuIExldCBieXRlMSBiZSBjb2RlIHVuaXQgPj4gOC5cbiAgICB2YXIgYnl0ZTEgPSBjb2RlX3VuaXQgPj4gODtcblxuICAgIC8vIDIuIExldCBieXRlMiBiZSBjb2RlIHVuaXQgJiAweDAwRkYuXG4gICAgdmFyIGJ5dGUyID0gY29kZV91bml0ICYgMHgwMEZGO1xuXG4gICAgLy8gMy4gVGhlbiByZXR1cm4gdGhlIGJ5dGVzIGluIG9yZGVyOlxuICAgICAgICAvLyB1dGYtMTZiZSBmbGFnIGlzIHNldDogYnl0ZTEsIHRoZW4gYnl0ZTIuXG4gICAgaWYgKHV0ZjE2YmUpXG4gICAgICByZXR1cm4gW2J5dGUxLCBieXRlMl07XG4gICAgLy8gdXRmLTE2YmUgZmxhZyBpcyB1bnNldDogYnl0ZTIsIHRoZW4gYnl0ZTEuXG4gICAgcmV0dXJuIFtieXRlMiwgYnl0ZTFdO1xuICB9XG5cbiAgLy8gMTUuMi4xIHNoYXJlZCB1dGYtMTYgZGVjb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtEZWNvZGVyfVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHV0ZjE2X2JlIFRydWUgaWYgYmlnLWVuZGlhbiwgZmFsc2UgaWYgbGl0dGxlLWVuZGlhbi5cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBVVEYxNkRlY29kZXIodXRmMTZfYmUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIHZhciAvKiogQHR5cGUgez9udW1iZXJ9ICovIHV0ZjE2X2xlYWRfYnl0ZSA9IG51bGwsXG4gICAgICAgIC8qKiBAdHlwZSB7P251bWJlcn0gKi8gdXRmMTZfbGVhZF9zdXJyb2dhdGUgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCBlaXRoZXIgdXRmLTE2IGxlYWQgYnl0ZSBvclxuICAgICAgLy8gdXRmLTE2IGxlYWQgc3Vycm9nYXRlIGlzIG5vdCBudWxsLCBzZXQgdXRmLTE2IGxlYWQgYnl0ZSBhbmRcbiAgICAgIC8vIHV0Zi0xNiBsZWFkIHN1cnJvZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgKHV0ZjE2X2xlYWRfYnl0ZSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGYxNl9sZWFkX3N1cnJvZ2F0ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgdXRmLTE2IGxlYWQgYnl0ZSBhbmQgdXRmLTE2XG4gICAgICAvLyBsZWFkIHN1cnJvZ2F0ZSBhcmUgbnVsbCwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgdXRmMTZfbGVhZF9ieXRlID09PSBudWxsICYmXG4gICAgICAgICAgdXRmMTZfbGVhZF9zdXJyb2dhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBJZiB1dGYtMTYgbGVhZCBieXRlIGlzIG51bGwsIHNldCB1dGYtMTYgbGVhZCBieXRlIHRvIGJ5dGVcbiAgICAgIC8vIGFuZCByZXR1cm4gY29udGludWUuXG4gICAgICBpZiAodXRmMTZfbGVhZF9ieXRlID09PSBudWxsKSB7XG4gICAgICAgIHV0ZjE2X2xlYWRfYnl0ZSA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBMZXQgY29kZSB1bml0IGJlIHRoZSByZXN1bHQgb2Y6XG4gICAgICB2YXIgY29kZV91bml0O1xuICAgICAgaWYgKHV0ZjE2X2JlKSB7XG4gICAgICAgIC8vIHV0Zi0xNmJlIGRlY29kZXIgZmxhZyBpcyBzZXRcbiAgICAgICAgLy8gICAodXRmLTE2IGxlYWQgYnl0ZSA8PCA4KSArIGJ5dGUuXG4gICAgICAgIGNvZGVfdW5pdCA9ICh1dGYxNl9sZWFkX2J5dGUgPDwgOCkgKyBiaXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXRmLTE2YmUgZGVjb2RlciBmbGFnIGlzIHVuc2V0XG4gICAgICAgIC8vICAgKGJ5dGUgPDwgOCkgKyB1dGYtMTYgbGVhZCBieXRlLlxuICAgICAgICBjb2RlX3VuaXQgPSAoYml0ZSA8PCA4KSArIHV0ZjE2X2xlYWRfYnl0ZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZW4gc2V0IHV0Zi0xNiBsZWFkIGJ5dGUgdG8gbnVsbC5cbiAgICAgIHV0ZjE2X2xlYWRfYnl0ZSA9IG51bGw7XG5cbiAgICAgIC8vIDUuIElmIHV0Zi0xNiBsZWFkIHN1cnJvZ2F0ZSBpcyBub3QgbnVsbCwgbGV0IGxlYWQgc3Vycm9nYXRlXG4gICAgICAvLyBiZSB1dGYtMTYgbGVhZCBzdXJyb2dhdGUsIHNldCB1dGYtMTYgbGVhZCBzdXJyb2dhdGUgdG8gbnVsbCxcbiAgICAgIC8vIGFuZCB0aGVuIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmICh1dGYxNl9sZWFkX3N1cnJvZ2F0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbGVhZF9zdXJyb2dhdGUgPSB1dGYxNl9sZWFkX3N1cnJvZ2F0ZTtcbiAgICAgICAgdXRmMTZfbGVhZF9zdXJyb2dhdGUgPSBudWxsO1xuXG4gICAgICAgIC8vIDEuIElmIGNvZGUgdW5pdCBpcyBpbiB0aGUgcmFuZ2UgVStEQzAwIHRvIFUrREZGRixcbiAgICAgICAgLy8gaW5jbHVzaXZlLCByZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIDB4MTAwMDAgK1xuICAgICAgICAvLyAoKGxlYWQgc3Vycm9nYXRlIOKIkiAweEQ4MDApIDw8IDEwKSArIChjb2RlIHVuaXQg4oiSIDB4REMwMCkuXG4gICAgICAgIGlmIChpblJhbmdlKGNvZGVfdW5pdCwgMHhEQzAwLCAweERGRkYpKSB7XG4gICAgICAgICAgcmV0dXJuIDB4MTAwMDAgKyAobGVhZF9zdXJyb2dhdGUgLSAweEQ4MDApICogMHg0MDAgK1xuICAgICAgICAgICAgICAoY29kZV91bml0IC0gMHhEQzAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFByZXBlbmQgdGhlIHNlcXVlbmNlIHJlc3VsdGluZyBvZiBjb252ZXJ0aW5nIGNvZGUgdW5pdFxuICAgICAgICAvLyB0byBieXRlcyB1c2luZyB1dGYtMTZiZSBkZWNvZGVyIGZsYWcgdG8gc3RyZWFtIGFuZCByZXR1cm5cbiAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKGNvbnZlcnRDb2RlVW5pdFRvQnl0ZXMoY29kZV91bml0LCB1dGYxNl9iZSkpO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgY29kZSB1bml0IGlzIGluIHRoZSByYW5nZSBVK0Q4MDAgdG8gVStEQkZGLCBpbmNsdXNpdmUsXG4gICAgICAvLyBzZXQgdXRmLTE2IGxlYWQgc3Vycm9nYXRlIHRvIGNvZGUgdW5pdCBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKGluUmFuZ2UoY29kZV91bml0LCAweEQ4MDAsIDB4REJGRikpIHtcbiAgICAgICAgdXRmMTZfbGVhZF9zdXJyb2dhdGUgPSBjb2RlX3VuaXQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA3LiBJZiBjb2RlIHVuaXQgaXMgaW4gdGhlIHJhbmdlIFUrREMwMCB0byBVK0RGRkYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfdW5pdCwgMHhEQzAwLCAweERGRkYpKVxuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgLy8gOC4gUmV0dXJuIGNvZGUgcG9pbnQgY29kZSB1bml0LlxuICAgICAgcmV0dXJuIGNvZGVfdW5pdDtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTUuMi4yIHNoYXJlZCB1dGYtMTYgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHV0ZjE2X2JlIFRydWUgaWYgYmlnLWVuZGlhbiwgZmFsc2UgaWYgbGl0dGxlLWVuZGlhbi5cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBVVEYxNkVuY29kZXIodXRmMTZfYmUsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswMDAwIHRvIFUrRkZGRiwgaW5jbHVzaXZlLFxuICAgICAgLy8gcmV0dXJuIHRoZSBzZXF1ZW5jZSByZXN1bHRpbmcgb2YgY29udmVydGluZyBjb2RlIHBvaW50IHRvXG4gICAgICAvLyBieXRlcyB1c2luZyB1dGYtMTZiZSBlbmNvZGVyIGZsYWcuXG4gICAgICBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweDAwMDAsIDB4RkZGRikpXG4gICAgICAgIHJldHVybiBjb252ZXJ0Q29kZVVuaXRUb0J5dGVzKGNvZGVfcG9pbnQsIHV0ZjE2X2JlKTtcblxuICAgICAgLy8gMy4gTGV0IGxlYWQgYmUgKChjb2RlIHBvaW50IOKIkiAweDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsXG4gICAgICAvLyBjb252ZXJ0ZWQgdG8gYnl0ZXMgdXNpbmcgdXRmLTE2YmUgZW5jb2RlciBmbGFnLlxuICAgICAgdmFyIGxlYWQgPSBjb252ZXJ0Q29kZVVuaXRUb0J5dGVzKFxuICAgICAgICAoKGNvZGVfcG9pbnQgLSAweDEwMDAwKSA+PiAxMCkgKyAweEQ4MDAsIHV0ZjE2X2JlKTtcblxuICAgICAgLy8gNC4gTGV0IHRyYWlsIGJlICgoY29kZSBwb2ludCDiiJIgMHgxMDAwMCkgJiAweDNGRikgKyAweERDMDAsXG4gICAgICAvLyBjb252ZXJ0ZWQgdG8gYnl0ZXMgdXNpbmcgdXRmLTE2YmUgZW5jb2RlciBmbGFnLlxuICAgICAgdmFyIHRyYWlsID0gY29udmVydENvZGVVbml0VG9CeXRlcyhcbiAgICAgICAgKChjb2RlX3BvaW50IC0gMHgxMDAwMCkgJiAweDNGRikgKyAweERDMDAsIHV0ZjE2X2JlKTtcblxuICAgICAgLy8gNS4gUmV0dXJuIGEgYnl0ZSBzZXF1ZW5jZSBvZiBsZWFkIGZvbGxvd2VkIGJ5IHRyYWlsLlxuICAgICAgcmV0dXJuIGxlYWQuY29uY2F0KHRyYWlsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTUuMyB1dGYtMTZiZVxuICAvLyAxNS4zLjEgdXRmLTE2YmUgZGVjb2RlclxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydVVEYtMTZCRSddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVVRGMTZFbmNvZGVyKHRydWUsIG9wdGlvbnMpO1xuICB9O1xuICAvLyAxNS4zLjIgdXRmLTE2YmUgZW5jb2RlclxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydVVEYtMTZCRSddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVVRGMTZEZWNvZGVyKHRydWUsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vIDE1LjQgdXRmLTE2bGVcbiAgLy8gMTUuNC4xIHV0Zi0xNmxlIGRlY29kZXJcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snVVRGLTE2TEUnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjE2RW5jb2RlcihmYWxzZSwgb3B0aW9ucyk7XG4gIH07XG4gIC8vIDE1LjQuMiB1dGYtMTZsZSBlbmNvZGVyXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ1VURi0xNkxFJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBVVEYxNkRlY29kZXIoZmFsc2UsIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vIDE1LjUgeC11c2VyLWRlZmluZWRcblxuICAvLyAxNS41LjEgeC11c2VyLWRlZmluZWQgZGVjb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtEZWNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIFhVc2VyRGVmaW5lZERlY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDMuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgMHhGNzgwICsgYnl0ZSDiiJIgMHg4MC5cbiAgICAgIHJldHVybiAweEY3ODAgKyBiaXRlIC0gMHg4MDtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTUuNS4yIHgtdXNlci1kZWZpbmVkIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBYVXNlckRlZmluZWRFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIHJldHVybiBhIGJ5dGUgd2hvc2VcbiAgICAgIC8vIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrRjc4MCB0byBVK0Y3RkYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiBhIGJ5dGUgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludCDiiJIgMHhGNzgwICsgMHg4MC5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4Rjc4MCwgMHhGN0ZGKSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQgLSAweEY3ODAgKyAweDgwO1xuXG4gICAgICAvLyA0LiBSZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgcmV0dXJuIGVuY29kZXJFcnJvcihjb2RlX3BvaW50KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1sneC11c2VyLWRlZmluZWQnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFhVc2VyRGVmaW5lZEVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ3gtdXNlci1kZWZpbmVkJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBYVXNlckRlZmluZWREZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIGlmICghZ2xvYmFsWydUZXh0RW5jb2RlciddKVxuICAgIGdsb2JhbFsnVGV4dEVuY29kZXInXSA9IFRleHRFbmNvZGVyO1xuICBpZiAoIWdsb2JhbFsnVGV4dERlY29kZXInXSlcbiAgICBnbG9iYWxbJ1RleHREZWNvZGVyJ10gPSBUZXh0RGVjb2RlcjtcblxuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgVGV4dEVuY29kZXI6IGdsb2JhbFsnVGV4dEVuY29kZXInXSxcbiAgICAgIFRleHREZWNvZGVyOiBnbG9iYWxbJ1RleHREZWNvZGVyJ10sXG4gICAgICBFbmNvZGluZ0luZGV4ZXM6IGdsb2JhbFtcImVuY29kaW5nLWluZGV4ZXNcIl1cbiAgICB9O1xuICB9XG5cbi8vIEZvciBzdHJpY3QgZW52aXJvbm1lbnRzIHdoZXJlIGB0aGlzYCBpbnNpZGUgdGhlIGdsb2JhbCBzY29wZVxuLy8gaXMgYHVuZGVmaW5lZGAsIHRha2UgYSBwdXJlIG9iamVjdCBpbnN0ZWFkXG59KHRoaXMgfHwge30pKTsiLCIndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIHR5cGUtZGV0ZWN0XG4gKiBDb3B5cmlnaHQoYykgMjAxMyBqYWtlIGx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG52YXIgcHJvbWlzZUV4aXN0cyA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nO1xudmFyIGdsb2JhbE9iamVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBzZWxmOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG52YXIgaXNEb20gPSAnbG9jYXRpb24nIGluIGdsb2JhbE9iamVjdCAmJiAnZG9jdW1lbnQnIGluIGdsb2JhbE9iamVjdDtcbnZhciBzeW1ib2xFeGlzdHMgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbnZhciBtYXBFeGlzdHMgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJztcbnZhciBzZXRFeGlzdHMgPSB0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJztcbnZhciB3ZWFrTWFwRXhpc3RzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnO1xudmFyIHdlYWtTZXRFeGlzdHMgPSB0eXBlb2YgV2Vha1NldCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgZGF0YVZpZXdFeGlzdHMgPSB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbEl0ZXJhdG9yRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgIT09ICd1bmRlZmluZWQnO1xudmFyIHNldEVudHJpZXNFeGlzdHMgPSBzZXRFeGlzdHMgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbnZhciBtYXBFbnRyaWVzRXhpc3RzID0gbWFwRXhpc3RzICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG52YXIgc2V0SXRlcmF0b3JQcm90b3R5cGUgPSBzZXRFbnRyaWVzRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgU2V0KCkuZW50cmllcygpKTtcbnZhciBtYXBJdGVyYXRvclByb3RvdHlwZSA9IG1hcEVudHJpZXNFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBNYXAoKS5lbnRyaWVzKCkpO1xudmFyIGFycmF5SXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG52YXIgYXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgc3RyaW5nSXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xudmFyIHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlID0gc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgdG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGggPSA4O1xudmFyIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCA9IC0xO1xuLyoqXG4gKiAjIyMgdHlwZU9mIChvYmopXG4gKlxuICogVXNlcyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIG9iamVjdCxcbiAqIG5vcm1hbGlzaW5nIGJlaGF2aW91ciBhY3Jvc3MgZW5naW5lIHZlcnNpb25zICYgd2VsbCBvcHRpbWlzZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IG9iamVjdCB0eXBlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHR5cGVEZXRlY3Qob2JqKSB7XG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBzdHJpbmcgbGl0ZXJhbCAgICAgeCAzLDAzOSwwMzUgb3BzL3NlYyDCsTEuNjIlICg3OCBydW5zIHNhbXBsZWQpXG4gICAqICAgYm9vbGVhbiBsaXRlcmFsICAgIHggMSw0MjQsMTM4IG9wcy9zZWMgwrE0LjU0JSAoNzUgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDEsNjUzLDE1MyBvcHMvc2VjIMKxMS45MSUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogICB1bmRlZmluZWQgICAgICAgICAgeCA5LDk3OCw2NjAgb3BzL3NlYyDCsTEuOTIlICg3NSBydW5zIHNhbXBsZWQpXG4gICAqICAgZnVuY3Rpb24gICAgICAgICAgIHggMiw1NTYsNzY5IG9wcy9zZWMgwrExLjczJSAoNzcgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIHN0cmluZyBsaXRlcmFsICAgICB4IDM4LDU2NCw3OTYgb3BzL3NlYyDCsTEuMTUlICg3OSBydW5zIHNhbXBsZWQpXG4gICAqICAgYm9vbGVhbiBsaXRlcmFsICAgIHggMzEsMTQ4LDk0MCBvcHMvc2VjIMKxMS4xMCUgKDc5IHJ1bnMgc2FtcGxlZClcbiAgICogICBudW1iZXIgbGl0ZXJhbCAgICAgeCAzMiw2NzksMzMwIG9wcy9zZWMgwrExLjkwJSAoNzggcnVucyBzYW1wbGVkKVxuICAgKiAgIHVuZGVmaW5lZCAgICAgICAgICB4IDMyLDM2MywzNjggb3BzL3NlYyDCsTEuMDclICg4MiBydW5zIHNhbXBsZWQpXG4gICAqICAgZnVuY3Rpb24gICAgICAgICAgIHggMzEsMjk2LDg3MCBvcHMvc2VjIMKxMC45NiUgKDgzIHJ1bnMgc2FtcGxlZClcbiAgICovXG4gIHZhciB0eXBlb2ZPYmogPSB0eXBlb2Ygb2JqO1xuICBpZiAodHlwZW9mT2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB0eXBlb2ZPYmo7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgbnVsbCAgICAgICAgICAgICAgIHggMjgsNjQ1LDc2NSBvcHMvc2VjIMKxMS4xNyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogUG9zdDpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAzNiw0MjgsOTYyIG9wcy9zZWMgwrExLjM3JSAoODQgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cpYGBcbiAgICogIC0gTm9kZSA9PT0gXCJbb2JqZWN0IGdsb2JhbF1cIlxuICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBnbG9iYWxdXCJcbiAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBQaGFudG9tSlMgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIElFIDExID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIElFIEVkZ2UgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKWBgXG4gICAqICAtIENocm9tZSBXb3JrZXIgPT09IFwiW29iamVjdCBnbG9iYWxdXCJcbiAgICogIC0gRmlyZWZveCBXb3JrZXIgPT09IFwiW29iamVjdCBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKiAgLSBTYWZhcmkgV29ya2VyID09PSBcIltvYmplY3QgRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICogIC0gSUUgMTEgV29ya2VyID09PSBcIltvYmplY3QgV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICogIC0gSUUgRWRnZSBXb3JrZXIgPT09IFwiW29iamVjdCBXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKi9cbiAgaWYgKG9iaiA9PT0gZ2xvYmFsT2JqZWN0KSB7XG4gICAgcmV0dXJuICdnbG9iYWwnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgICogUHJlOlxuICAgKiAgIGFycmF5IGxpdGVyYWwgICAgICB4IDIsODg4LDM1MiBvcHMvc2VjIMKxMC42NyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogUG9zdDpcbiAgICogICBhcnJheSBsaXRlcmFsICAgICAgeCAyMiw0NzksNjUwIG9wcy9zZWMgwrEwLjk2JSAoODEgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkob2JqKSAmJlxuICAgIChzeW1ib2xUb1N0cmluZ1RhZ0V4aXN0cyA9PT0gZmFsc2UgfHwgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gb2JqKSlcbiAgKSB7XG4gICAgcmV0dXJuICdBcnJheSc7XG4gIH1cblxuICBpZiAoaXNEb20pIHtcbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvYnJvd3NlcnMuaHRtbCNsb2NhdGlvbilcbiAgICAgKiBXaGF0V0cgSFRNTCQ3LjcuMyAtIFRoZSBgTG9jYXRpb25gIGludGVyZmFjZVxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93LmxvY2F0aW9uKWBgXG4gICAgICogIC0gSUUgPD0xMSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqICAtIElFIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAqL1xuICAgIGlmIChvYmogPT09IGdsb2JhbE9iamVjdC5sb2NhdGlvbikge1xuICAgICAgcmV0dXJuICdMb2NhdGlvbic7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvY3VtZW50KVxuICAgICAqIFdoYXRXRyBIVE1MJDMuMS4xIC0gVGhlIGBEb2N1bWVudGAgb2JqZWN0XG4gICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICogICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCNJRC0yNjgwOTI2OClcbiAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICogICAgICAgV2hhdFdHIEhUTUwgc3RhdGVzOlxuICAgICAqICAgICAgICAgPiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBXaW5kb3cgb2JqZWN0cyBtdXN0IGFsc28gaGF2ZSBhXG4gICAgICogICAgICAgICA+IHdyaXRhYmxlLCBjb25maWd1cmFibGUsIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVkXG4gICAgICogICAgICAgICA+IEhUTUxEb2N1bWVudCB3aG9zZSB2YWx1ZSBpcyB0aGUgRG9jdW1lbnQgaW50ZXJmYWNlIG9iamVjdC5cbiAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50KWBgXG4gICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBEb2N1bWVudF1cIlxuICAgICAqICAtIElFIDExID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgRWRnZSA8PTEzID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICovXG4gICAgaWYgKG9iaiA9PT0gZ2xvYmFsT2JqZWN0LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gJ0RvY3VtZW50JztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI21pbWV0eXBlYXJyYXkpXG4gICAgICogV2hhdFdHIEhUTUwkOC42LjEuNSAtIFBsdWdpbnMgLSBJbnRlcmZhY2UgTWltZVR5cGVBcnJheVxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLm1pbWVUeXBlcylgYFxuICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBNU01pbWVUeXBlc0NvbGxlY3Rpb25dXCJcbiAgICAgKi9cbiAgICBpZiAob2JqID09PSAoZ2xvYmFsT2JqZWN0Lm5hdmlnYXRvciB8fCB7fSkubWltZVR5cGVzKSB7XG4gICAgICByZXR1cm4gJ01pbWVUeXBlQXJyYXknO1xuICAgIH1cblxuICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjcGx1Z2luYXJyYXkpXG4gICAgICogV2hhdFdHIEhUTUwkOC42LjEuNSAtIFBsdWdpbnMgLSBJbnRlcmZhY2UgUGx1Z2luQXJyYXlcbiAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5hdmlnYXRvci5wbHVnaW5zKWBgXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IE1TUGx1Z2luc0NvbGxlY3Rpb25dXCJcbiAgICAgKi9cbiAgICBpZiAob2JqID09PSAoZ2xvYmFsT2JqZWN0Lm5hdmlnYXRvciB8fCB7fSkucGx1Z2lucykge1xuICAgICAgcmV0dXJuICdQbHVnaW5BcnJheSc7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheSlcbiAgICAgKiBXaGF0V0cgSFRNTCQ0LjQuNCAtIFRoZSBgYmxvY2txdW90ZWAgZWxlbWVudCAtIEludGVyZmFjZSBgSFRNTFF1b3RlRWxlbWVudGBcbiAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jsb2NrcXVvdGUnKSlgYFxuICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBIVE1MQmxvY2tFbGVtZW50XVwiXG4gICAgICovXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIG9iai50YWdOYW1lID09PSAnQkxPQ0tRVU9URScpIHtcbiAgICAgIHJldHVybiAnSFRNTFF1b3RlRWxlbWVudCc7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2h0bWx0YWJsZWRhdGFjZWxsZWxlbWVudClcbiAgICAgKiBXaGF0V0cgSFRNTCQ0LjkuOSAtIFRoZSBgdGRgIGVsZW1lbnQgLSBJbnRlcmZhY2UgYEhUTUxUYWJsZURhdGFDZWxsRWxlbWVudGBcbiAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTgyOTE1MDc1KVxuICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgKiBUZXN0OiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKSlcbiAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICovXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIG9iai50YWdOYW1lID09PSAnVEQnKSB7XG4gICAgICByZXR1cm4gJ0hUTUxUYWJsZURhdGFDZWxsRWxlbWVudCc7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2h0bWx0YWJsZWhlYWRlcmNlbGxlbGVtZW50KVxuICAgICAqIFdoYXRXRyBIVE1MJDQuOS45IC0gVGhlIGB0ZGAgZWxlbWVudCAtIEludGVyZmFjZSBgSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnRgXG4gICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICogICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCNJRC04MjkxNTA3NSlcbiAgICAgKiAgICAgICB3aGljaCBzdWdnZXN0cyB0aGF0IGJyb3dzZXJzIHNob3VsZCB1c2UgSFRNTFRhYmxlQ2VsbEVsZW1lbnQgZm9yXG4gICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICogVGVzdDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJykpXG4gICAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgKiAgLSBTYWZhcmkgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAqL1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBvYmoudGFnTmFtZSA9PT0gJ1RIJykge1xuICAgICAgcmV0dXJuICdIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudCc7XG4gICAgfVxuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBGbG9hdDY0QXJyYXkgICAgICAgeCA2MjUsNjQ0IG9wcy9zZWMgwrExLjU4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggMSwyNzksODUyIG9wcy9zZWMgwrEyLjkxJSAoNzcgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDMyQXJyYXkgICAgICAgIHggMSwxNzgsMTg1IG9wcy9zZWMgwrExLjk1JSAoODMgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDE2QXJyYXkgICAgICAgIHggMSwwMDgsMzgwIG9wcy9zZWMgwrEyLjI1JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggMSwxMjgsMDQwIG9wcy9zZWMgwrEyLjExJSAoODEgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MzJBcnJheSAgICAgICAgIHggMSwxNzAsMTE5IG9wcy9zZWMgwrEyLjg4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MTZBcnJheSAgICAgICAgIHggMSwxNzYsMzQ4IG9wcy9zZWMgwrE1Ljc5JSAoODYgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggMSwwNTgsNzA3IG9wcy9zZWMgwrE0Ljk0JSAoNzcgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhDbGFtcGVkQXJyYXkgIHggMSwxMTAsNjMzIG9wcy9zZWMgwrE0LjIwJSAoODAgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBGbG9hdDY0QXJyYXkgICAgICAgeCA3LDEwNSw2NzEgb3BzL3NlYyDCsTEzLjQ3JSAoNjQgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggNSw4ODcsOTEyIG9wcy9zZWMgwrExLjQ2JSAoODIgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDMyQXJyYXkgICAgICAgIHggNiw0OTEsNjYxIG9wcy9zZWMgwrExLjc2JSAoNzkgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDE2QXJyYXkgICAgICAgIHggNiw1NTksNzk1IG9wcy9zZWMgwrExLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggNiw0NjMsOTY2IG9wcy9zZWMgwrExLjQzJSAoODUgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MzJBcnJheSAgICAgICAgIHggNSw2NDEsODQxIG9wcy9zZWMgwrEzLjQ5JSAoODEgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MTZBcnJheSAgICAgICAgIHggNiw1ODMsNTExIG9wcy9zZWMgwrExLjk4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggNiw2MDYsMDc4IG9wcy9zZWMgwrExLjc0JSAoODEgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhDbGFtcGVkQXJyYXkgIHggNiw2MDIsMjI0IG9wcy9zZWMgwrExLjc3JSAoODMgcnVucyBzYW1wbGVkKVxuICAqL1xuICB2YXIgc3RyaW5nVGFnID0gKHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzICYmIG9ialtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgaWYgKHR5cGVvZiBzdHJpbmdUYWcgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuXG4gIHZhciBvYmpQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICByZWdleCBsaXRlcmFsICAgICAgeCAxLDc3MiwzODUgb3BzL3NlYyDCsTEuODUlICg3NyBydW5zIHNhbXBsZWQpXG4gICogICByZWdleCBjb25zdHJ1Y3RvciAgeCAyLDE0Myw2MzQgb3BzL3NlYyDCsTIuNDYlICg3OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHJlZ2V4IGxpdGVyYWwgICAgICB4IDMsOTI4LDAwOSBvcHMvc2VjIMKxMC42NSUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgKiAgIHJlZ2V4IGNvbnN0cnVjdG9yICB4IDMsOTMxLDEwOCBvcHMvc2VjIMKxMC41OCUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gUmVnRXhwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUmVnRXhwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMiwxMzAsMDc0IG9wcy9zZWMgwrE0LjQyJSAoNjggcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBkYXRlICAgICAgICAgICAgICAgeCAzLDk1Myw3Nzkgb3BzL3NlYyDCsTEuMzUlICg3NyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IERhdGUucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdEYXRlJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1wcm9taXNlLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjUuNC41LjQgLSBQcm9taXNlLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJQcm9taXNlXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUHJvbWlzZS5yZXNvbHZlKCkpYGBcbiAgICogIC0gQ2hyb21lIDw9NDcgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICogIC0gRWRnZSA8PTIwID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqICAtIEZpcmVmb3ggMjktTGF0ZXN0ID09PSBcIltvYmplY3QgUHJvbWlzZV1cIlxuICAgKiAgLSBTYWZhcmkgNy4xLUxhdGVzdCA9PT0gXCJbb2JqZWN0IFByb21pc2VdXCJcbiAgICovXG4gIGlmIChwcm9taXNlRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gUHJvbWlzZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1Byb21pc2UnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBzZXQgICAgICAgICAgICAgICAgeCAyLDIyMiwxODYgb3BzL3NlYyDCsTEuMzElICg4MiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDQsNTQ1LDg3OSBvcHMvc2VjIMKxMS4xMyUgKDgzIHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHNldEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IFNldC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1NldCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIG1hcCAgICAgICAgICAgICAgICB4IDIsMzk2LDg0MiBvcHMvc2VjIMKxMS41OSUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgbWFwICAgICAgICAgICAgICAgIHggNCwxODMsOTQ1IG9wcy9zZWMgwrE2LjU5JSAoODIgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAobWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gTWFwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnTWFwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggMSwzMjMsMjIwIG9wcy9zZWMgwrEyLjE3JSAoNzYgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICB3ZWFrc2V0ICAgICAgICAgICAgeCA0LDIzNyw1MTAgb3BzL3NlYyDCsTIuMDElICg3NyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmICh3ZWFrU2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gV2Vha1NldC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1dlYWtTZXQnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICB3ZWFrbWFwICAgICAgICAgICAgeCAxLDUwMCwyNjAgb3BzL3NlYyDCsTIuMDIlICg3OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDMsODgxLDM4NCBvcHMvc2VjIMKxMS40NSUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHdlYWtNYXBFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrTWFwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnV2Vha01hcCc7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtZGF0YXZpZXcucHJvdG90eXBlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyNC4yLjQuMjEgLSBEYXRhVmlldy5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiRGF0YVZpZXdcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChkYXRhVmlld0V4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IERhdGFWaWV3LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnRGF0YVZpZXcnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVtYXBpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIzLjEuNS4yLjIgLSAlTWFwSXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIk1hcCBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBNYXAoKS5lbnRyaWVzKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAobWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gbWFwSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ01hcCBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJXNldGl0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjMuMi41LjIuMiAtICVTZXRJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiU2V0IEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IFNldCgpLmVudHJpZXMoKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChzZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBzZXRJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnU2V0IEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIyLjEuNS4yLjIgLSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiQXJyYXkgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChbXVtTeW1ib2wuaXRlcmF0b3JdKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoYXJyYXlJdGVyYXRvckV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IGFycmF5SXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0FycmF5IEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMS4xLjUuMi4yIC0gJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJTdHJpbmcgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBzdHJpbmdJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnU3RyaW5nIEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgb2JqZWN0IGZyb20gbnVsbCAgIHggMiw0MjQsMzIwIG9wcy9zZWMgwrExLjY3JSAoNzYgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBvYmplY3QgZnJvbSBudWxsICAgeCA1LDgzOCwwMDAgb3BzL3NlYyDCsTAuOTklICg4NCBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0XG4gICAgLnByb3RvdHlwZVxuICAgIC50b1N0cmluZ1xuICAgIC5jYWxsKG9iailcbiAgICAuc2xpY2UodG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGgsIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy50eXBlRGV0ZWN0ID0gbW9kdWxlLmV4cG9ydHM7XG4iXX0=\n"
  },
  {
    "path": "common/Tests/External/sinon-7.3.1.js",
    "content": "/* Sinon.JS 7.3.1, 2019-03-27, @license BSD-3 */(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.sinon = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n\"use strict\";\n\nvar behavior = require(\"./sinon/behavior\");\nvar createSandbox = require(\"./sinon/create-sandbox\");\nvar deprecated = require(\"@sinonjs/commons\").deprecated;\nvar extend = require(\"./sinon/util/core/extend\");\nvar fakeTimers = require(\"./sinon/util/fake-timers\");\nvar format = require(\"./sinon/util/core/format\");\nvar nise = require(\"nise\");\nvar Sandbox = require(\"./sinon/sandbox\");\nvar stub = require(\"./sinon/stub\");\n\nvar apiMethods = {\n    createSandbox: createSandbox,\n    assert: require(\"./sinon/assert\"),\n    match: require(\"@sinonjs/samsam\").createMatcher,\n    spyCall: require(\"./sinon/call\"),\n\n    expectation: require(\"./sinon/mock-expectation\"),\n    createStubInstance: require(\"./sinon/stub\").createStubInstance,\n    defaultConfig: require(\"./sinon/util/core/default-config\"),\n\n    setFormatter: format.setFormatter,\n\n    // fake timers\n    timers: fakeTimers.timers,\n\n    // fake XHR\n    xhr: nise.fakeXhr.xhr,\n    FakeXMLHttpRequest: nise.fakeXhr.FakeXMLHttpRequest,\n\n    // fake server\n    fakeServer: nise.fakeServer,\n    fakeServerWithClock: nise.fakeServerWithClock,\n    createFakeServer: nise.fakeServer.create.bind(nise.fakeServer),\n    createFakeServerWithClock: nise.fakeServerWithClock.create.bind(nise.fakeServerWithClock),\n\n    addBehavior: function(name, fn) {\n        behavior.addBehavior(stub, name, fn);\n    }\n};\n\nvar legacySandboxAPI = {\n    sandbox: {\n        create: deprecated.wrap(\n            createSandbox,\n            // eslint-disable-next-line max-len\n            \"`sandbox.create()` is deprecated. Use default sandbox at `sinon.sandbox` or create new sandboxes with `sinon.createSandbox()`\"\n        )\n    }\n};\n\nvar sandbox = new Sandbox();\n\nvar api = extend(sandbox, legacySandboxAPI, apiMethods);\n\nmodule.exports = api;\n\n},{\"./sinon/assert\":2,\"./sinon/behavior\":3,\"./sinon/call\":4,\"./sinon/create-sandbox\":7,\"./sinon/mock-expectation\":10,\"./sinon/sandbox\":12,\"./sinon/stub\":16,\"./sinon/util/core/default-config\":18,\"./sinon/util/core/extend\":20,\"./sinon/util/core/format\":21,\"./sinon/util/fake-timers\":33,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65,\"nise\":85}],2:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar calledInOrder = require(\"@sinonjs/commons\").calledInOrder;\nvar createMatcher = require(\"@sinonjs/samsam\").createMatcher;\nvar orderByFirstCall = require(\"@sinonjs/commons\").orderByFirstCall;\nvar timesInWords = require(\"./util/core/times-in-words\");\nvar format = require(\"./util/core/format\");\nvar stringSlice = require(\"@sinonjs/commons\").prototypes.string.slice;\n\nvar arraySlice = arrayProto.slice;\nvar concat = arrayProto.concat;\nvar forEach = arrayProto.forEach;\nvar join = arrayProto.join;\nvar splice = arrayProto.splice;\n\nvar assert;\n\nfunction verifyIsStub() {\n    var args = arraySlice(arguments);\n\n    forEach(args, function(method) {\n        if (!method) {\n            assert.fail(\"fake is not a spy\");\n        }\n\n        if (method.proxy && method.proxy.isSinonProxy) {\n            verifyIsStub(method.proxy);\n        } else {\n            if (typeof method !== \"function\") {\n                assert.fail(method + \" is not a function\");\n            }\n\n            if (typeof method.getCall !== \"function\") {\n                assert.fail(method + \" is not stubbed\");\n            }\n        }\n    });\n}\n\nfunction verifyIsValidAssertion(assertionMethod, assertionArgs) {\n    switch (assertionMethod) {\n        case \"notCalled\":\n        case \"called\":\n        case \"calledOnce\":\n        case \"calledTwice\":\n        case \"calledThrice\":\n            if (assertionArgs.length !== 0) {\n                assert.fail(\n                    assertionMethod +\n                        \" takes 1 argument but was called with \" +\n                        (assertionArgs.length + 1) +\n                        \" arguments\"\n                );\n            }\n            break;\n        default:\n            break;\n    }\n}\n\nfunction failAssertion(object, msg) {\n    var obj = object || global;\n    var failMethod = obj.fail || assert.fail;\n    failMethod.call(obj, msg);\n}\n\nfunction mirrorPropAsAssertion(name, method, message) {\n    var msg = message;\n    var meth = method;\n    if (arguments.length === 2) {\n        msg = method;\n        meth = name;\n    }\n\n    assert[name] = function(fake) {\n        verifyIsStub(fake);\n\n        var args = arraySlice(arguments, 1);\n        var failed = false;\n\n        verifyIsValidAssertion(name, args);\n\n        if (typeof meth === \"function\") {\n            failed = !meth(fake);\n        } else {\n            failed = typeof fake[meth] === \"function\" ? !fake[meth].apply(fake, args) : !fake[meth];\n        }\n\n        if (failed) {\n            failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, concat([msg], args)));\n        } else {\n            assert.pass(name);\n        }\n    };\n}\n\nfunction exposedName(prefix, prop) {\n    return !prefix || /^fail/.test(prop) ? prop : prefix + stringSlice(prop, 0, 1).toUpperCase() + stringSlice(prop, 1);\n}\n\nassert = {\n    failException: \"AssertError\",\n\n    fail: function fail(message) {\n        var error = new Error(message);\n        error.name = this.failException || assert.failException;\n\n        throw error;\n    },\n\n    pass: function pass() {\n        return;\n    },\n\n    callOrder: function assertCallOrder() {\n        verifyIsStub.apply(null, arguments);\n        var expected = \"\";\n        var actual = \"\";\n\n        if (!calledInOrder(arguments)) {\n            try {\n                expected = join(arguments, \", \");\n                var calls = arraySlice(arguments);\n                var i = calls.length;\n                while (i) {\n                    if (!calls[--i].called) {\n                        splice(calls, i, 1);\n                    }\n                }\n                actual = join(orderByFirstCall(calls), \", \");\n            } catch (e) {\n                // If this fails, we'll just fall back to the blank string\n            }\n\n            failAssertion(this, \"expected \" + expected + \" to be called in order but were called as \" + actual);\n        } else {\n            assert.pass(\"callOrder\");\n        }\n    },\n\n    callCount: function assertCallCount(method, count) {\n        verifyIsStub(method);\n\n        if (method.callCount !== count) {\n            var msg = \"expected %n to be called \" + timesInWords(count) + \" but was called %c%C\";\n            failAssertion(this, method.printf(msg));\n        } else {\n            assert.pass(\"callCount\");\n        }\n    },\n\n    expose: function expose(target, options) {\n        if (!target) {\n            throw new TypeError(\"target is null or undefined\");\n        }\n\n        var o = options || {};\n        var prefix = (typeof o.prefix === \"undefined\" && \"assert\") || o.prefix;\n        var includeFail = typeof o.includeFail === \"undefined\" || Boolean(o.includeFail);\n        var instance = this;\n\n        forEach(Object.keys(instance), function(method) {\n            if (method !== \"expose\" && (includeFail || !/^(fail)/.test(method))) {\n                target[exposedName(prefix, method)] = instance[method];\n            }\n        });\n\n        return target;\n    },\n\n    match: function match(actual, expectation) {\n        var matcher = createMatcher(expectation);\n        if (matcher.test(actual)) {\n            assert.pass(\"match\");\n        } else {\n            var formatted = [\n                \"expected value to match\",\n                \"    expected = \" + format(expectation),\n                \"    actual = \" + format(actual)\n            ];\n\n            failAssertion(this, join(formatted, \"\\n\"));\n        }\n    }\n};\n\nmirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\nmirrorPropAsAssertion(\n    \"notCalled\",\n    function(spy) {\n        return !spy.called;\n    },\n    \"expected %n to not have been called but was called %c%C\"\n);\nmirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\nmirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\nmirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\nmirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\nmirrorPropAsAssertion(\"alwaysCalledOn\", \"expected %n to always be called with %1 as this but was called with %t\");\nmirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\nmirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\nmirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %D\");\nmirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %D\");\nmirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %D\");\nmirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %D\");\nmirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %D\");\nmirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %D\");\nmirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\nmirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\nmirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\nmirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\nmodule.exports = assert;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./util/core/format\":21,\"./util/core/times-in-words\":29,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65}],3:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar extend = require(\"./util/core/extend\");\nvar functionName = require(\"@sinonjs/commons\").functionName;\nvar nextTick = require(\"./util/core/next-tick\");\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\nvar exportAsyncBehaviors = require(\"./util/core/export-async-behaviors\");\n\nvar concat = arrayProto.concat;\nvar join = arrayProto.join;\nvar reverse = arrayProto.reverse;\nvar slice = arrayProto.slice;\n\nvar useLeftMostCallback = -1;\nvar useRightMostCallback = -2;\n\nfunction getCallback(behavior, args) {\n    var callArgAt = behavior.callArgAt;\n\n    if (callArgAt >= 0) {\n        return args[callArgAt];\n    }\n\n    var argumentList;\n\n    if (callArgAt === useLeftMostCallback) {\n        argumentList = args;\n    }\n\n    if (callArgAt === useRightMostCallback) {\n        argumentList = reverse(slice(args));\n    }\n\n    var callArgProp = behavior.callArgProp;\n\n    for (var i = 0, l = argumentList.length; i < l; ++i) {\n        if (!callArgProp && typeof argumentList[i] === \"function\") {\n            return argumentList[i];\n        }\n\n        if (callArgProp && argumentList[i] && typeof argumentList[i][callArgProp] === \"function\") {\n            return argumentList[i][callArgProp];\n        }\n    }\n\n    return null;\n}\n\nfunction getCallbackError(behavior, func, args) {\n    if (behavior.callArgAt < 0) {\n        var msg;\n\n        if (behavior.callArgProp) {\n            msg =\n                functionName(behavior.stub) +\n                \" expected to yield to '\" +\n                valueToString(behavior.callArgProp) +\n                \"', but no object with such a property was passed.\";\n        } else {\n            msg = functionName(behavior.stub) + \" expected to yield, but no callback was passed.\";\n        }\n\n        if (args.length > 0) {\n            msg += \" Received [\" + join(args, \", \") + \"]\";\n        }\n\n        return msg;\n    }\n\n    return \"argument at index \" + behavior.callArgAt + \" is not a function: \" + func;\n}\n\nfunction ensureArgs(name, behavior, args) {\n    // map function name to internal property\n    //   callsArg => callArgAt\n    var property = name.replace(/sArg/, \"ArgAt\");\n    var index = behavior[property];\n\n    if (index >= args.length) {\n        throw new TypeError(\n            name + \" failed: \" + (index + 1) + \" arguments required but only \" + args.length + \" present\"\n        );\n    }\n}\n\nfunction callCallback(behavior, args) {\n    if (typeof behavior.callArgAt === \"number\") {\n        ensureArgs(\"callsArg\", behavior, args);\n        var func = getCallback(behavior, args);\n\n        if (typeof func !== \"function\") {\n            throw new TypeError(getCallbackError(behavior, func, args));\n        }\n\n        if (behavior.callbackAsync) {\n            nextTick(function() {\n                func.apply(behavior.callbackContext, behavior.callbackArguments);\n            });\n        } else {\n            return func.apply(behavior.callbackContext, behavior.callbackArguments);\n        }\n    }\n\n    return undefined;\n}\n\nvar proto = {\n    create: function create(stub) {\n        var behavior = extend({}, proto);\n        delete behavior.create;\n        delete behavior.addBehavior;\n        delete behavior.createBehavior;\n        behavior.stub = stub;\n\n        if (stub.defaultBehavior && stub.defaultBehavior.promiseLibrary) {\n            behavior.promiseLibrary = stub.defaultBehavior.promiseLibrary;\n        }\n\n        return behavior;\n    },\n\n    isPresent: function isPresent() {\n        return (\n            typeof this.callArgAt === \"number\" ||\n            this.exception ||\n            this.exceptionCreator ||\n            typeof this.returnArgAt === \"number\" ||\n            this.returnThis ||\n            typeof this.resolveArgAt === \"number\" ||\n            this.resolveThis ||\n            typeof this.throwArgAt === \"number\" ||\n            this.fakeFn ||\n            this.returnValueDefined\n        );\n    },\n\n    invoke: function invoke(context, args) {\n        /*\n         * callCallback (conditionally) calls ensureArgs\n         *\n         * Note: callCallback intentionally happens before\n         * everything else and cannot be moved lower\n         */\n        var returnValue = callCallback(this, args);\n\n        if (this.exception) {\n            throw this.exception;\n        } else if (this.exceptionCreator) {\n            this.exception = this.exceptionCreator();\n            this.exceptionCreator = undefined;\n            throw this.exception;\n        } else if (typeof this.returnArgAt === \"number\") {\n            ensureArgs(\"returnsArg\", this, args);\n            return args[this.returnArgAt];\n        } else if (this.returnThis) {\n            return context;\n        } else if (typeof this.throwArgAt === \"number\") {\n            ensureArgs(\"throwsArg\", this, args);\n            throw args[this.throwArgAt];\n        } else if (this.fakeFn) {\n            return this.fakeFn.apply(context, args);\n        } else if (typeof this.resolveArgAt === \"number\") {\n            ensureArgs(\"resolvesArg\", this, args);\n            return (this.promiseLibrary || Promise).resolve(args[this.resolveArgAt]);\n        } else if (this.resolveThis) {\n            return (this.promiseLibrary || Promise).resolve(context);\n        } else if (this.resolve) {\n            return (this.promiseLibrary || Promise).resolve(this.returnValue);\n        } else if (this.reject) {\n            return (this.promiseLibrary || Promise).reject(this.returnValue);\n        } else if (this.callsThrough) {\n            return this.stub.wrappedMethod.apply(context, args);\n        } else if (typeof this.returnValue !== \"undefined\") {\n            return this.returnValue;\n        } else if (typeof this.callArgAt === \"number\") {\n            return returnValue;\n        }\n\n        return this.returnValue;\n    },\n\n    onCall: function onCall(index) {\n        return this.stub.onCall(index);\n    },\n\n    onFirstCall: function onFirstCall() {\n        return this.stub.onFirstCall();\n    },\n\n    onSecondCall: function onSecondCall() {\n        return this.stub.onSecondCall();\n    },\n\n    onThirdCall: function onThirdCall() {\n        return this.stub.onThirdCall();\n    },\n\n    withArgs: function withArgs(/* arguments */) {\n        throw new Error(\n            'Defining a stub by invoking \"stub.onCall(...).withArgs(...)\" ' +\n                'is not supported. Use \"stub.withArgs(...).onCall(...)\" ' +\n                \"to define sequential behavior for calls with certain arguments.\"\n        );\n    }\n};\n\nfunction createBehavior(behaviorMethod) {\n    return function() {\n        this.defaultBehavior = this.defaultBehavior || proto.create(this);\n        this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);\n        return this;\n    };\n}\n\nfunction addBehavior(stub, name, fn) {\n    proto[name] = function() {\n        fn.apply(this, concat([this], slice(arguments)));\n        return this.stub || this;\n    };\n\n    stub[name] = createBehavior(name);\n}\n\nproto.addBehavior = addBehavior;\nproto.createBehavior = createBehavior;\n\nvar asyncBehaviors = exportAsyncBehaviors(proto);\n\nmodule.exports = extend.nonEnum({}, proto, asyncBehaviors);\n\n},{\"./util/core/export-async-behaviors\":19,\"./util/core/extend\":20,\"./util/core/next-tick\":28,\"@sinonjs/commons\":39}],4:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar match = require(\"@sinonjs/samsam\").createMatcher;\nvar deepEqual = require(\"@sinonjs/samsam\").deepEqual;\nvar functionName = require(\"@sinonjs/commons\").functionName;\nvar sinonFormat = require(\"./util/core/format\");\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nvar concat = arrayProto.concat;\nvar filter = arrayProto.filter;\nvar join = arrayProto.join;\nvar map = arrayProto.map;\nvar reduce = arrayProto.reduce;\nvar slice = arrayProto.slice;\n\nfunction throwYieldError(proxy, text, args) {\n    var msg = functionName(proxy) + text;\n    if (args.length) {\n        msg += \" Received [\" + join(slice(args), \", \") + \"]\";\n    }\n    throw new Error(msg);\n}\n\nvar callProto = {\n    calledOn: function calledOn(thisValue) {\n        if (match.isMatcher(thisValue)) {\n            return thisValue.test(this.thisValue);\n        }\n        return this.thisValue === thisValue;\n    },\n\n    calledWith: function calledWith() {\n        var self = this;\n        var calledWithArgs = slice(arguments);\n\n        if (calledWithArgs.length > self.args.length) {\n            return false;\n        }\n\n        return reduce(\n            calledWithArgs,\n            function(prev, arg, i) {\n                return prev && deepEqual(self.args[i], arg);\n            },\n            true\n        );\n    },\n\n    calledWithMatch: function calledWithMatch() {\n        var self = this;\n        var calledWithMatchArgs = slice(arguments);\n\n        if (calledWithMatchArgs.length > self.args.length) {\n            return false;\n        }\n\n        return reduce(\n            calledWithMatchArgs,\n            function(prev, expectation, i) {\n                var actual = self.args[i];\n\n                return prev && match(expectation).test(actual);\n            },\n            true\n        );\n    },\n\n    calledWithExactly: function calledWithExactly() {\n        return arguments.length === this.args.length && this.calledWith.apply(this, arguments);\n    },\n\n    notCalledWith: function notCalledWith() {\n        return !this.calledWith.apply(this, arguments);\n    },\n\n    notCalledWithMatch: function notCalledWithMatch() {\n        return !this.calledWithMatch.apply(this, arguments);\n    },\n\n    returned: function returned(value) {\n        return deepEqual(this.returnValue, value);\n    },\n\n    threw: function threw(error) {\n        if (typeof error === \"undefined\" || !this.exception) {\n            return Boolean(this.exception);\n        }\n\n        return this.exception === error || this.exception.name === error;\n    },\n\n    calledWithNew: function calledWithNew() {\n        return this.proxy.prototype && this.thisValue instanceof this.proxy;\n    },\n\n    calledBefore: function(other) {\n        return this.callId < other.callId;\n    },\n\n    calledAfter: function(other) {\n        return this.callId > other.callId;\n    },\n\n    calledImmediatelyBefore: function(other) {\n        return this.callId === other.callId - 1;\n    },\n\n    calledImmediatelyAfter: function(other) {\n        return this.callId === other.callId + 1;\n    },\n\n    callArg: function(pos) {\n        this.ensureArgIsAFunction(pos);\n        return this.args[pos]();\n    },\n\n    callArgOn: function(pos, thisValue) {\n        this.ensureArgIsAFunction(pos);\n        return this.args[pos].apply(thisValue);\n    },\n\n    callArgWith: function(pos) {\n        return this.callArgOnWith.apply(this, concat([pos, null], slice(arguments, 1)));\n    },\n\n    callArgOnWith: function(pos, thisValue) {\n        this.ensureArgIsAFunction(pos);\n        var args = slice(arguments, 2);\n        return this.args[pos].apply(thisValue, args);\n    },\n\n    throwArg: function(pos) {\n        if (pos > this.args.length) {\n            throw new TypeError(\"Not enough arguments: \" + pos + \" required but only \" + this.args.length + \" present\");\n        }\n\n        throw this.args[pos];\n    },\n\n    yield: function() {\n        return this.yieldOn.apply(this, concat([null], slice(arguments, 0)));\n    },\n\n    yieldOn: function(thisValue) {\n        var args = slice(this.args);\n        var yieldFn = filter(args, function(arg) {\n            return typeof arg === \"function\";\n        })[0];\n\n        if (!yieldFn) {\n            throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n        }\n\n        return yieldFn.apply(thisValue, slice(arguments, 1));\n    },\n\n    yieldTo: function(prop) {\n        return this.yieldToOn.apply(this, concat([prop, null], slice(arguments, 1)));\n    },\n\n    yieldToOn: function(prop, thisValue) {\n        var args = slice(this.args);\n        var yieldArg = filter(args, function(arg) {\n            return arg && typeof arg[prop] === \"function\";\n        })[0];\n        var yieldFn = yieldArg && yieldArg[prop];\n\n        if (!yieldFn) {\n            throwYieldError(\n                this.proxy,\n                \" cannot yield to '\" + valueToString(prop) + \"' since no callback was passed.\",\n                args\n            );\n        }\n\n        return yieldFn.apply(thisValue, slice(arguments, 2));\n    },\n\n    toString: function() {\n        var callStr = this.proxy ? String(this.proxy) + \"(\" : \"\";\n        var formattedArgs;\n\n        if (!this.args) {\n            return \":(\";\n        }\n\n        formattedArgs = map(this.args, function(arg) {\n            return sinonFormat(arg);\n        });\n\n        callStr = callStr + join(formattedArgs, \", \") + \")\";\n\n        if (typeof this.returnValue !== \"undefined\") {\n            callStr += \" => \" + sinonFormat(this.returnValue);\n        }\n\n        if (this.exception) {\n            callStr += \" !\" + this.exception.name;\n\n            if (this.exception.message) {\n                callStr += \"(\" + this.exception.message + \")\";\n            }\n        }\n        if (this.stack) {\n            // Omit the error message and the two top stack frames in sinon itself:\n            callStr += (this.stack.split(\"\\n\")[3] || \"unknown\").replace(/^\\s*(?:at\\s+|@)?/, \" at \");\n        }\n\n        return callStr;\n    },\n\n    ensureArgIsAFunction: function(pos) {\n        if (typeof this.args[pos] !== \"function\") {\n            throw new TypeError(\n                \"Expected argument at position \" + pos + \" to be a Function, but was \" + typeof this.args[pos]\n            );\n        }\n    }\n};\nObject.defineProperty(callProto, \"stack\", {\n    enumerable: true,\n    configurable: true,\n    get: function() {\n        return (this.errorWithCallStack && this.errorWithCallStack.stack) || \"\";\n    }\n});\n\ncallProto.invokeCallback = callProto.yield;\n\nfunction createSpyCall(spy, thisValue, args, returnValue, exception, id, errorWithCallStack) {\n    if (typeof id !== \"number\") {\n        throw new TypeError(\"Call id is not a number\");\n    }\n\n    var proxyCall = Object.create(callProto);\n    var lastArg = (args.length > 0 && args[args.length - 1]) || undefined;\n    var callback = lastArg && typeof lastArg === \"function\" ? lastArg : undefined;\n\n    proxyCall.proxy = spy;\n    proxyCall.thisValue = thisValue;\n    proxyCall.args = args;\n    proxyCall.lastArg = lastArg;\n    proxyCall.callback = callback;\n    proxyCall.returnValue = returnValue;\n    proxyCall.exception = exception;\n    proxyCall.callId = id;\n    proxyCall.errorWithCallStack = errorWithCallStack;\n\n    return proxyCall;\n}\ncreateSpyCall.toString = callProto.toString; // used by mocks\n\nmodule.exports = createSpyCall;\n\n},{\"./util/core/format\":21,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65}],5:[function(require,module,exports){\n\"use strict\";\n\nvar walk = require(\"./util/core/walk\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar hasOwnProperty = require(\"@sinonjs/commons\").prototypes.object.hasOwnProperty;\nvar push = require(\"@sinonjs/commons\").prototypes.array.push;\n\nfunction collectMethod(methods, object, prop, propOwner) {\n    if (typeof getPropertyDescriptor(propOwner, prop).value === \"function\" && hasOwnProperty(object, prop)) {\n        push(methods, object[prop]);\n    }\n}\n\n// This function returns an array of all the own methods on the passed object\nfunction collectOwnMethods(object) {\n    var methods = [];\n\n    walk(object, collectMethod.bind(null, methods, object));\n\n    return methods;\n}\n\nmodule.exports = collectOwnMethods;\n\n},{\"./util/core/get-property-descriptor\":24,\"./util/core/walk\":31,\"@sinonjs/commons\":39}],6:[function(require,module,exports){\n\"use strict\";\n\nvar supportsColor = require(\"supports-color\");\n\nfunction colorize(str, color) {\n    if (supportsColor.stdout === false) {\n        return str;\n    }\n\n    return \"\\x1b[\" + color + \"m\" + str + \"\\x1b[0m\";\n}\n\nexports.red = function(str) {\n    return colorize(str, 31);\n};\n\nexports.green = function(str) {\n    return colorize(str, 32);\n};\n\nexports.cyan = function(str) {\n    return colorize(str, 96);\n};\n\nexports.white = function(str) {\n    return colorize(str, 39);\n};\n\nexports.bold = function(str) {\n    return colorize(str, 1);\n};\n\n},{\"supports-color\":88}],7:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar Sandbox = require(\"./sandbox\");\n\nvar forEach = arrayProto.forEach;\nvar push = arrayProto.push;\n\nfunction prepareSandboxFromConfig(config) {\n    var sandbox = new Sandbox();\n\n    if (config.useFakeServer) {\n        if (typeof config.useFakeServer === \"object\") {\n            sandbox.serverPrototype = config.useFakeServer;\n        }\n\n        sandbox.useFakeServer();\n    }\n\n    if (config.useFakeTimers) {\n        if (typeof config.useFakeTimers === \"object\") {\n            sandbox.useFakeTimers(config.useFakeTimers);\n        } else {\n            sandbox.useFakeTimers();\n        }\n    }\n\n    return sandbox;\n}\n\nfunction exposeValue(sandbox, config, key, value) {\n    if (!value) {\n        return;\n    }\n\n    if (config.injectInto && !(key in config.injectInto)) {\n        config.injectInto[key] = value;\n        push(sandbox.injectedKeys, key);\n    } else {\n        push(sandbox.args, value);\n    }\n}\n\nfunction createSandbox(config) {\n    if (!config) {\n        return new Sandbox();\n    }\n\n    var configuredSandbox = prepareSandboxFromConfig(config);\n    configuredSandbox.args = configuredSandbox.args || [];\n    configuredSandbox.injectedKeys = [];\n    configuredSandbox.injectInto = config.injectInto;\n    var exposed = configuredSandbox.inject({});\n\n    if (config.properties) {\n        forEach(config.properties, function(prop) {\n            var value = exposed[prop] || (prop === \"sandbox\" && configuredSandbox);\n            exposeValue(configuredSandbox, config, prop, value);\n        });\n    } else {\n        exposeValue(configuredSandbox, config, \"sandbox\");\n    }\n\n    return configuredSandbox;\n}\n\nmodule.exports = createSandbox;\n\n},{\"./sandbox\":12,\"@sinonjs/commons\":39}],8:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar isPropertyConfigurable = require(\"./util/core/is-property-configurable\");\nvar exportAsyncBehaviors = require(\"./util/core/export-async-behaviors\");\nvar extend = require(\"./util/core/extend\");\n\nvar slice = arrayProto.slice;\n\nvar useLeftMostCallback = -1;\nvar useRightMostCallback = -2;\n\nfunction throwsException(fake, error, message) {\n    if (typeof error === \"function\") {\n        fake.exceptionCreator = error;\n    } else if (typeof error === \"string\") {\n        fake.exceptionCreator = function() {\n            var newException = new Error(message || \"\");\n            newException.name = error;\n            return newException;\n        };\n    } else if (!error) {\n        fake.exceptionCreator = function() {\n            return new Error(\"Error\");\n        };\n    } else {\n        fake.exception = error;\n    }\n}\n\nvar defaultBehaviors = {\n    callsFake: function callsFake(fake, fn) {\n        fake.fakeFn = fn;\n    },\n\n    callsArg: function callsArg(fake, index) {\n        if (typeof index !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = index;\n        fake.callbackArguments = [];\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    callsArgOn: function callsArgOn(fake, index, context) {\n        if (typeof index !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = index;\n        fake.callbackArguments = [];\n        fake.callbackContext = context;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    callsArgWith: function callsArgWith(fake, index) {\n        if (typeof index !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = index;\n        fake.callbackArguments = slice(arguments, 2);\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    callsArgOnWith: function callsArgWith(fake, index, context) {\n        if (typeof index !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.callArgAt = index;\n        fake.callbackArguments = slice(arguments, 3);\n        fake.callbackContext = context;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    usingPromise: function usingPromise(fake, promiseLibrary) {\n        fake.promiseLibrary = promiseLibrary;\n    },\n\n    yields: function(fake) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice(arguments, 1);\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    yieldsRight: function(fake) {\n        fake.callArgAt = useRightMostCallback;\n        fake.callbackArguments = slice(arguments, 1);\n        fake.callbackContext = undefined;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    yieldsOn: function(fake, context) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice(arguments, 2);\n        fake.callbackContext = context;\n        fake.callArgProp = undefined;\n        fake.callbackAsync = false;\n    },\n\n    yieldsTo: function(fake, prop) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice(arguments, 2);\n        fake.callbackContext = undefined;\n        fake.callArgProp = prop;\n        fake.callbackAsync = false;\n    },\n\n    yieldsToOn: function(fake, prop, context) {\n        fake.callArgAt = useLeftMostCallback;\n        fake.callbackArguments = slice(arguments, 3);\n        fake.callbackContext = context;\n        fake.callArgProp = prop;\n        fake.callbackAsync = false;\n    },\n\n    throws: throwsException,\n    throwsException: throwsException,\n\n    returns: function returns(fake, value) {\n        fake.returnValue = value;\n        fake.resolve = false;\n        fake.reject = false;\n        fake.returnValueDefined = true;\n        fake.exception = undefined;\n        fake.exceptionCreator = undefined;\n        fake.fakeFn = undefined;\n    },\n\n    returnsArg: function returnsArg(fake, index) {\n        if (typeof index !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.returnArgAt = index;\n    },\n\n    throwsArg: function throwsArg(fake, index) {\n        if (typeof index !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n\n        fake.throwArgAt = index;\n    },\n\n    returnsThis: function returnsThis(fake) {\n        fake.returnThis = true;\n    },\n\n    resolves: function resolves(fake, value) {\n        fake.returnValue = value;\n        fake.resolve = true;\n        fake.resolveThis = false;\n        fake.reject = false;\n        fake.returnValueDefined = true;\n        fake.exception = undefined;\n        fake.exceptionCreator = undefined;\n        fake.fakeFn = undefined;\n    },\n\n    resolvesArg: function resolvesArg(fake, index) {\n        if (typeof index !== \"number\") {\n            throw new TypeError(\"argument index is not number\");\n        }\n        fake.resolveArgAt = index;\n        fake.returnValue = undefined;\n        fake.resolve = true;\n        fake.resolveThis = false;\n        fake.reject = false;\n        fake.returnValueDefined = false;\n        fake.exception = undefined;\n        fake.exceptionCreator = undefined;\n        fake.fakeFn = undefined;\n    },\n\n    rejects: function rejects(fake, error, message) {\n        var reason;\n        if (typeof error === \"string\") {\n            reason = new Error(message || \"\");\n            reason.name = error;\n        } else if (!error) {\n            reason = new Error(\"Error\");\n        } else {\n            reason = error;\n        }\n        fake.returnValue = reason;\n        fake.resolve = false;\n        fake.resolveThis = false;\n        fake.reject = true;\n        fake.returnValueDefined = true;\n        fake.exception = undefined;\n        fake.exceptionCreator = undefined;\n        fake.fakeFn = undefined;\n\n        return fake;\n    },\n\n    resolvesThis: function resolvesThis(fake) {\n        fake.returnValue = undefined;\n        fake.resolve = false;\n        fake.resolveThis = true;\n        fake.reject = false;\n        fake.returnValueDefined = false;\n        fake.exception = undefined;\n        fake.exceptionCreator = undefined;\n        fake.fakeFn = undefined;\n    },\n\n    callThrough: function callThrough(fake) {\n        fake.callsThrough = true;\n    },\n\n    get: function get(fake, getterFunction) {\n        var rootStub = fake.stub || fake;\n\n        Object.defineProperty(rootStub.rootObj, rootStub.propName, {\n            get: getterFunction,\n            configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)\n        });\n\n        return fake;\n    },\n\n    set: function set(fake, setterFunction) {\n        var rootStub = fake.stub || fake;\n\n        Object.defineProperty(\n            rootStub.rootObj,\n            rootStub.propName,\n            // eslint-disable-next-line accessor-pairs\n            {\n                set: setterFunction,\n                configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)\n            }\n        );\n\n        return fake;\n    },\n\n    value: function value(fake, newVal) {\n        var rootStub = fake.stub || fake;\n\n        Object.defineProperty(rootStub.rootObj, rootStub.propName, {\n            value: newVal,\n            enumerable: true,\n            configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)\n        });\n\n        return fake;\n    }\n};\n\nvar asyncBehaviors = exportAsyncBehaviors(defaultBehaviors);\n\nmodule.exports = extend({}, defaultBehaviors, asyncBehaviors);\n\n},{\"./util/core/export-async-behaviors\":19,\"./util/core/extend\":20,\"./util/core/is-property-configurable\":27,\"@sinonjs/commons\":39}],9:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar spy = require(\"./spy\");\nvar nextTick = require(\"./util/core/next-tick\");\n\nvar forEach = arrayProto.forEach;\nvar slice = arrayProto.slice;\n\nfunction getError(value) {\n    return value instanceof Error ? value : new Error(value);\n}\n\nfunction cleanProxy(f) {\n    var undesirableProperties = [\n        \"instantiateFake\",\n        \"callArg\",\n        \"callArgOn\",\n        \"callArgOnWith\",\n        \"callArgWith\",\n        \"invokeCallback\",\n        \"throwArg\",\n        \"withArgs\",\n        \"yield\",\n        \"yieldOn\",\n        \"yieldTo\",\n        \"yieldToOn\"\n    ];\n\n    forEach(undesirableProperties, function(key) {\n        delete f[key];\n    });\n\n    return f;\n}\n\nvar uuid = 0;\nfunction wrapFunc(f) {\n    var fakeInstance = function() {\n        var lastArg = arguments.length > 0 ? arguments[arguments.length - 1] : undefined;\n        var callback = lastArg && typeof lastArg === \"function\" ? lastArg : undefined;\n\n        /* eslint-disable no-use-before-define */\n        p.lastArg = lastArg;\n        p.callback = callback;\n        /* eslint-enable no-use-before-define */\n\n        return f && f.apply(this, arguments);\n    };\n    var p = cleanProxy(spy(fakeInstance));\n\n    p.displayName = \"fake\";\n    p.id = \"fake#\" + uuid++;\n\n    return p;\n}\n\nfunction fake(f) {\n    if (arguments.length > 0 && typeof f !== \"function\") {\n        throw new TypeError(\"Expected f argument to be a Function\");\n    }\n\n    return wrapFunc(f);\n}\n\nfake.returns = function returns(value) {\n    function f() {\n        return value;\n    }\n\n    return wrapFunc(f);\n};\n\nfake.throws = function throws(value) {\n    function f() {\n        throw getError(value);\n    }\n\n    return wrapFunc(f);\n};\n\nfake.resolves = function resolves(value) {\n    function f() {\n        return Promise.resolve(value);\n    }\n\n    return wrapFunc(f);\n};\n\nfake.rejects = function rejects(value) {\n    function f() {\n        return Promise.reject(getError(value));\n    }\n\n    return wrapFunc(f);\n};\n\nfunction yieldInternal(async, values) {\n    function f() {\n        var callback = arguments[arguments.length - 1];\n        if (typeof callback !== \"function\") {\n            throw new TypeError(\"Expected last argument to be a function\");\n        }\n        if (async) {\n            nextTick(function() {\n                callback.apply(null, values);\n            });\n        } else {\n            callback.apply(null, values);\n        }\n    }\n\n    return wrapFunc(f);\n}\n\nfake.yields = function yields() {\n    return yieldInternal(false, slice(arguments));\n};\n\nfake.yieldsAsync = function yieldsAsync() {\n    return yieldInternal(true, slice(arguments));\n};\n\nmodule.exports = fake;\n\n},{\"./spy\":14,\"./util/core/next-tick\":28,\"@sinonjs/commons\":39}],10:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar spyInvoke = require(\"./spy\").invoke;\nvar spyCallToString = require(\"./call\").toString;\nvar timesInWords = require(\"./util/core/times-in-words\");\nvar extend = require(\"./util/core/extend\");\nvar match = require(\"@sinonjs/samsam\").createMatcher;\nvar stub = require(\"./stub\");\nvar assert = require(\"./assert\");\nvar deepEqual = require(\"@sinonjs/samsam\").deepEqual;\nvar format = require(\"./util/core/format\");\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nvar every = arrayProto.every;\nvar forEach = arrayProto.forEach;\nvar push = arrayProto.push;\nvar slice = arrayProto.slice;\n\nfunction callCountInWords(callCount) {\n    if (callCount === 0) {\n        return \"never called\";\n    }\n\n    return \"called \" + timesInWords(callCount);\n}\n\nfunction expectedCallCountInWords(expectation) {\n    var min = expectation.minCalls;\n    var max = expectation.maxCalls;\n\n    if (typeof min === \"number\" && typeof max === \"number\") {\n        var str = timesInWords(min);\n\n        if (min !== max) {\n            str = \"at least \" + str + \" and at most \" + timesInWords(max);\n        }\n\n        return str;\n    }\n\n    if (typeof min === \"number\") {\n        return \"at least \" + timesInWords(min);\n    }\n\n    return \"at most \" + timesInWords(max);\n}\n\nfunction receivedMinCalls(expectation) {\n    var hasMinLimit = typeof expectation.minCalls === \"number\";\n    return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n}\n\nfunction receivedMaxCalls(expectation) {\n    if (typeof expectation.maxCalls !== \"number\") {\n        return false;\n    }\n\n    return expectation.callCount === expectation.maxCalls;\n}\n\nfunction verifyMatcher(possibleMatcher, arg) {\n    var isMatcher = match.isMatcher(possibleMatcher);\n\n    return (isMatcher && possibleMatcher.test(arg)) || true;\n}\n\nvar mockExpectation = {\n    minCalls: 1,\n    maxCalls: 1,\n\n    create: function create(methodName) {\n        var expectation = extend.nonEnum(stub.create(), mockExpectation);\n        delete expectation.create;\n        expectation.method = methodName;\n\n        return expectation;\n    },\n\n    invoke: function invoke(func, thisValue, args) {\n        this.verifyCallAllowed(thisValue, args);\n\n        return spyInvoke.apply(this, arguments);\n    },\n\n    atLeast: function atLeast(num) {\n        if (typeof num !== \"number\") {\n            throw new TypeError(\"'\" + valueToString(num) + \"' is not number\");\n        }\n\n        if (!this.limitsSet) {\n            this.maxCalls = null;\n            this.limitsSet = true;\n        }\n\n        this.minCalls = num;\n\n        return this;\n    },\n\n    atMost: function atMost(num) {\n        if (typeof num !== \"number\") {\n            throw new TypeError(\"'\" + valueToString(num) + \"' is not number\");\n        }\n\n        if (!this.limitsSet) {\n            this.minCalls = null;\n            this.limitsSet = true;\n        }\n\n        this.maxCalls = num;\n\n        return this;\n    },\n\n    never: function never() {\n        return this.exactly(0);\n    },\n\n    once: function once() {\n        return this.exactly(1);\n    },\n\n    twice: function twice() {\n        return this.exactly(2);\n    },\n\n    thrice: function thrice() {\n        return this.exactly(3);\n    },\n\n    exactly: function exactly(num) {\n        if (typeof num !== \"number\") {\n            throw new TypeError(\"'\" + valueToString(num) + \"' is not a number\");\n        }\n\n        this.atLeast(num);\n        return this.atMost(num);\n    },\n\n    met: function met() {\n        return !this.failed && receivedMinCalls(this);\n    },\n\n    verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n        var expectedArguments = this.expectedArguments;\n\n        if (receivedMaxCalls(this)) {\n            this.failed = true;\n            mockExpectation.fail(this.method + \" already called \" + timesInWords(this.maxCalls));\n        }\n\n        if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n            mockExpectation.fail(\n                this.method +\n                    \" called with \" +\n                    valueToString(thisValue) +\n                    \" as thisValue, expected \" +\n                    valueToString(this.expectedThis)\n            );\n        }\n\n        if (!(\"expectedArguments\" in this)) {\n            return;\n        }\n\n        if (!args) {\n            mockExpectation.fail(this.method + \" received no arguments, expected \" + format(expectedArguments));\n        }\n\n        if (args.length < expectedArguments.length) {\n            mockExpectation.fail(\n                this.method +\n                    \" received too few arguments (\" +\n                    format(args) +\n                    \"), expected \" +\n                    format(expectedArguments)\n            );\n        }\n\n        if (this.expectsExactArgCount && args.length !== expectedArguments.length) {\n            mockExpectation.fail(\n                this.method +\n                    \" received too many arguments (\" +\n                    format(args) +\n                    \"), expected \" +\n                    format(expectedArguments)\n            );\n        }\n\n        forEach(\n            expectedArguments,\n            function(expectedArgument, i) {\n                if (!verifyMatcher(expectedArgument, args[i])) {\n                    mockExpectation.fail(\n                        this.method +\n                            \" received wrong arguments \" +\n                            format(args) +\n                            \", didn't match \" +\n                            String(expectedArguments)\n                    );\n                }\n\n                if (!deepEqual(args[i], expectedArgument)) {\n                    mockExpectation.fail(\n                        this.method +\n                            \" received wrong arguments \" +\n                            format(args) +\n                            \", expected \" +\n                            format(expectedArguments)\n                    );\n                }\n            },\n            this\n        );\n    },\n\n    allowsCall: function allowsCall(thisValue, args) {\n        var expectedArguments = this.expectedArguments;\n\n        if (this.met() && receivedMaxCalls(this)) {\n            return false;\n        }\n\n        if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n            return false;\n        }\n\n        if (!(\"expectedArguments\" in this)) {\n            return true;\n        }\n\n        // eslint-disable-next-line no-underscore-dangle\n        var _args = args || [];\n\n        if (_args.length < expectedArguments.length) {\n            return false;\n        }\n\n        if (this.expectsExactArgCount && _args.length !== expectedArguments.length) {\n            return false;\n        }\n\n        return every(expectedArguments, function(expectedArgument, i) {\n            if (!verifyMatcher(expectedArgument, _args[i])) {\n                return false;\n            }\n\n            if (!deepEqual(_args[i], expectedArgument)) {\n                return false;\n            }\n\n            return true;\n        });\n    },\n\n    withArgs: function withArgs() {\n        this.expectedArguments = slice(arguments);\n        return this;\n    },\n\n    withExactArgs: function withExactArgs() {\n        this.withArgs.apply(this, arguments);\n        this.expectsExactArgCount = true;\n        return this;\n    },\n\n    on: function on(thisValue) {\n        this.expectedThis = thisValue;\n        return this;\n    },\n\n    toString: function() {\n        var args = slice(this.expectedArguments || []);\n\n        if (!this.expectsExactArgCount) {\n            push(args, \"[...]\");\n        }\n\n        var callStr = spyCallToString.call({\n            proxy: this.method || \"anonymous mock expectation\",\n            args: args\n        });\n\n        var message = callStr.replace(\", [...\", \"[, ...\") + \" \" + expectedCallCountInWords(this);\n\n        if (this.met()) {\n            return \"Expectation met: \" + message;\n        }\n\n        return \"Expected \" + message + \" (\" + callCountInWords(this.callCount) + \")\";\n    },\n\n    verify: function verify() {\n        if (!this.met()) {\n            mockExpectation.fail(String(this));\n        } else {\n            mockExpectation.pass(String(this));\n        }\n\n        return true;\n    },\n\n    pass: function pass(message) {\n        assert.pass(message);\n    },\n\n    fail: function fail(message) {\n        var exception = new Error(message);\n        exception.name = \"ExpectationError\";\n\n        throw exception;\n    }\n};\n\nmodule.exports = mockExpectation;\n\n},{\"./assert\":2,\"./call\":4,\"./spy\":14,\"./stub\":16,\"./util/core/extend\":20,\"./util/core/format\":21,\"./util/core/times-in-words\":29,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65}],11:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar mockExpectation = require(\"./mock-expectation\");\nvar spyCallToString = require(\"./call\").toString;\nvar extend = require(\"./util/core/extend\");\nvar deepEqual = require(\"@sinonjs/samsam\").deepEqual;\nvar wrapMethod = require(\"./util/core/wrap-method\");\nvar usePromiseLibrary = require(\"./util/core/use-promise-library\");\n\nvar concat = arrayProto.concat;\nvar filter = arrayProto.filter;\nvar forEach = arrayProto.forEach;\nvar every = arrayProto.every;\nvar join = arrayProto.join;\nvar push = arrayProto.push;\nvar slice = arrayProto.slice;\nvar unshift = arrayProto.unshift;\n\nfunction mock(object) {\n    if (!object || typeof object === \"string\") {\n        return mockExpectation.create(object ? object : \"Anonymous mock\");\n    }\n\n    return mock.create(object);\n}\n\nfunction each(collection, callback) {\n    var col = collection || [];\n\n    forEach(col, callback);\n}\n\nfunction arrayEquals(arr1, arr2, compareLength) {\n    if (compareLength && arr1.length !== arr2.length) {\n        return false;\n    }\n\n    return every(arr1, function(element, i) {\n        return deepEqual(arr2[i], element);\n    });\n}\n\nextend(mock, {\n    create: function create(object) {\n        if (!object) {\n            throw new TypeError(\"object is null\");\n        }\n\n        var mockObject = extend.nonEnum({}, mock, { object: object });\n        delete mockObject.create;\n\n        return mockObject;\n    },\n\n    expects: function expects(method) {\n        if (!method) {\n            throw new TypeError(\"method is falsy\");\n        }\n\n        if (!this.expectations) {\n            this.expectations = {};\n            this.proxies = [];\n            this.failures = [];\n        }\n\n        if (!this.expectations[method]) {\n            this.expectations[method] = [];\n            var mockObject = this;\n\n            wrapMethod(this.object, method, function() {\n                return mockObject.invokeMethod(method, this, arguments);\n            });\n\n            push(this.proxies, method);\n        }\n\n        var expectation = mockExpectation.create(method);\n        extend.nonEnum(expectation, this.object[method]);\n        push(this.expectations[method], expectation);\n        usePromiseLibrary(this.promiseLibrary, expectation);\n\n        return expectation;\n    },\n\n    restore: function restore() {\n        var object = this.object;\n\n        each(this.proxies, function(proxy) {\n            if (typeof object[proxy].restore === \"function\") {\n                object[proxy].restore();\n            }\n        });\n    },\n\n    verify: function verify() {\n        var expectations = this.expectations || {};\n        var messages = this.failures ? slice(this.failures) : [];\n        var met = [];\n\n        each(this.proxies, function(proxy) {\n            each(expectations[proxy], function(expectation) {\n                if (!expectation.met()) {\n                    push(messages, String(expectation));\n                } else {\n                    push(met, String(expectation));\n                }\n            });\n        });\n\n        this.restore();\n\n        if (messages.length > 0) {\n            mockExpectation.fail(join(concat(messages, met), \"\\n\"));\n        } else if (met.length > 0) {\n            mockExpectation.pass(join(concat(messages, met), \"\\n\"));\n        }\n\n        return true;\n    },\n\n    usingPromise: function usingPromise(promiseLibrary) {\n        this.promiseLibrary = promiseLibrary;\n\n        return this;\n    },\n\n    invokeMethod: function invokeMethod(method, thisValue, args) {\n        /* if we cannot find any matching files we will explicitly call mockExpection#fail with error messages */\n        /* eslint consistent-return: \"off\" */\n        var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : [];\n        var currentArgs = args || [];\n        var available;\n\n        var expectationsWithMatchingArgs = filter(expectations, function(expectation) {\n            var expectedArgs = expectation.expectedArguments || [];\n\n            return arrayEquals(expectedArgs, currentArgs, expectation.expectsExactArgCount);\n        });\n\n        var expectationsToApply = filter(expectationsWithMatchingArgs, function(expectation) {\n            return !expectation.met() && expectation.allowsCall(thisValue, args);\n        });\n\n        if (expectationsToApply.length > 0) {\n            return expectationsToApply[0].apply(thisValue, args);\n        }\n\n        var messages = [];\n        var exhausted = 0;\n\n        forEach(expectationsWithMatchingArgs, function(expectation) {\n            if (expectation.allowsCall(thisValue, args)) {\n                available = available || expectation;\n            } else {\n                exhausted += 1;\n            }\n        });\n\n        if (available && exhausted === 0) {\n            return available.apply(thisValue, args);\n        }\n\n        forEach(expectations, function(expectation) {\n            push(messages, \"    \" + String(expectation));\n        });\n\n        unshift(\n            messages,\n            \"Unexpected call: \" +\n                spyCallToString.call({\n                    proxy: method,\n                    args: args\n                })\n        );\n\n        var err = new Error();\n        if (!err.stack) {\n            // PhantomJS does not serialize the stack trace until the error has been thrown\n            try {\n                throw err;\n            } catch (e) {\n                /* empty */\n            }\n        }\n        push(\n            this.failures,\n            \"Unexpected call: \" +\n                spyCallToString.call({\n                    proxy: method,\n                    args: args,\n                    stack: err.stack\n                })\n        );\n\n        mockExpectation.fail(join(messages, \"\\n\"));\n    }\n});\n\nmodule.exports = mock;\n\n},{\"./call\":4,\"./mock-expectation\":10,\"./util/core/extend\":20,\"./util/core/use-promise-library\":30,\"./util/core/wrap-method\":32,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65}],12:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar collectOwnMethods = require(\"./collect-own-methods\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar isEsModule = require(\"./util/core/is-es-module\");\nvar isPropertyConfigurable = require(\"./util/core/is-property-configurable\");\nvar isNonExistentOwnProperty = require(\"./util/core/is-non-existent-own-property\");\nvar match = require(\"@sinonjs/samsam\").createMatcher;\nvar sinonAssert = require(\"./assert\");\nvar sinonClock = require(\"./util/fake-timers\");\nvar sinonMock = require(\"./mock\");\nvar sinonSpy = require(\"./spy\");\nvar sinonStub = require(\"./stub\");\nvar sinonFake = require(\"./fake\");\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\nvar fakeServer = require(\"nise\").fakeServer;\nvar fakeXhr = require(\"nise\").fakeXhr;\nvar usePromiseLibrary = require(\"./util/core/use-promise-library\");\n\nvar filter = arrayProto.filter;\nvar forEach = arrayProto.filter;\nvar push = arrayProto.push;\nvar reverse = arrayProto.reverse;\n\nfunction applyOnEach(fakes, method) {\n    var matchingFakes = filter(fakes, function(fake) {\n        return typeof fake[method] === \"function\";\n    });\n\n    forEach(matchingFakes, function(fake) {\n        fake[method]();\n    });\n}\n\nfunction Sandbox() {\n    var sandbox = this;\n    var collection = [];\n    var fakeRestorers = [];\n    var promiseLib;\n\n    sandbox.serverPrototype = fakeServer;\n\n    // this is for testing only\n    sandbox.getFakes = function getFakes() {\n        return collection;\n    };\n\n    // this is for testing only\n    sandbox.getRestorers = function() {\n        return fakeRestorers;\n    };\n\n    sandbox.createStubInstance = function createStubInstance(constructor) {\n        if (typeof constructor !== \"function\") {\n            throw new TypeError(\"The constructor should be a function.\");\n        }\n        return this.stub(Object.create(constructor.prototype));\n    };\n\n    sandbox.inject = function inject(obj) {\n        obj.spy = function() {\n            return sandbox.spy.apply(null, arguments);\n        };\n\n        obj.stub = function() {\n            return sandbox.stub.apply(null, arguments);\n        };\n\n        obj.mock = function() {\n            return sandbox.mock.apply(null, arguments);\n        };\n\n        obj.createStubInstance = function() {\n            return sandbox.createStubInstance.apply(sandbox, arguments);\n        };\n\n        obj.fake = function() {\n            return sandbox.fake.apply(null, arguments);\n        };\n\n        obj.replace = function() {\n            return sandbox.replace.apply(null, arguments);\n        };\n\n        obj.replaceSetter = function() {\n            return sandbox.replaceSetter.apply(null, arguments);\n        };\n\n        obj.replaceGetter = function() {\n            return sandbox.replaceGetter.apply(null, arguments);\n        };\n\n        if (sandbox.clock) {\n            obj.clock = sandbox.clock;\n        }\n\n        if (sandbox.server) {\n            obj.server = sandbox.server;\n            obj.requests = sandbox.server.requests;\n        }\n\n        obj.match = match;\n\n        return obj;\n    };\n\n    sandbox.mock = function mock() {\n        var m = sinonMock.apply(null, arguments);\n\n        push(collection, m);\n        usePromiseLibrary(promiseLib, m);\n\n        return m;\n    };\n\n    sandbox.reset = function reset() {\n        applyOnEach(collection, \"reset\");\n        applyOnEach(collection, \"resetHistory\");\n    };\n\n    sandbox.resetBehavior = function resetBehavior() {\n        applyOnEach(collection, \"resetBehavior\");\n    };\n\n    sandbox.resetHistory = function resetHistory() {\n        function privateResetHistory(f) {\n            var method = f.resetHistory || f.reset;\n            if (method) {\n                method.call(f);\n            }\n        }\n\n        forEach(collection, function(fake) {\n            if (typeof fake === \"function\") {\n                privateResetHistory(fake);\n                return;\n            }\n\n            var methods = [];\n            if (fake.get) {\n                push(methods, fake.get);\n            }\n\n            if (fake.set) {\n                push(methods, fake.set);\n            }\n\n            forEach(methods, privateResetHistory);\n        });\n    };\n\n    sandbox.restore = function restore() {\n        if (arguments.length) {\n            throw new Error(\"sandbox.restore() does not take any parameters. Perhaps you meant stub.restore()\");\n        }\n\n        reverse(collection);\n        applyOnEach(collection, \"restore\");\n        collection = [];\n\n        forEach(fakeRestorers, function(restorer) {\n            restorer();\n        });\n        fakeRestorers = [];\n\n        sandbox.restoreContext();\n    };\n\n    sandbox.restoreContext = function restoreContext() {\n        var injectedKeys = sandbox.injectedKeys;\n        var injectInto = sandbox.injectInto;\n\n        if (!injectedKeys) {\n            return;\n        }\n\n        forEach(injectedKeys, function(injectedKey) {\n            delete injectInto[injectedKey];\n        });\n\n        injectedKeys = [];\n    };\n\n    function getFakeRestorer(object, property) {\n        var descriptor = getPropertyDescriptor(object, property);\n\n        function restorer() {\n            Object.defineProperty(object, property, descriptor);\n        }\n        restorer.object = object;\n        restorer.property = property;\n        return restorer;\n    }\n\n    function verifyNotReplaced(object, property) {\n        forEach(fakeRestorers, function(fakeRestorer) {\n            if (fakeRestorer.object === object && fakeRestorer.property === property) {\n                throw new TypeError(\"Attempted to replace \" + property + \" which is already replaced\");\n            }\n        });\n    }\n\n    sandbox.replace = function replace(object, property, replacement) {\n        var descriptor = getPropertyDescriptor(object, property);\n\n        if (typeof descriptor === \"undefined\") {\n            throw new TypeError(\"Cannot replace non-existent own property \" + valueToString(property));\n        }\n\n        if (typeof replacement === \"undefined\") {\n            throw new TypeError(\"Expected replacement argument to be defined\");\n        }\n\n        if (typeof descriptor.get === \"function\") {\n            throw new Error(\"Use sandbox.replaceGetter for replacing getters\");\n        }\n\n        if (typeof descriptor.set === \"function\") {\n            throw new Error(\"Use sandbox.replaceSetter for replacing setters\");\n        }\n\n        if (typeof object[property] !== typeof replacement) {\n            throw new TypeError(\"Cannot replace \" + typeof object[property] + \" with \" + typeof replacement);\n        }\n\n        verifyNotReplaced(object, property);\n\n        // store a function for restoring the replaced property\n        push(fakeRestorers, getFakeRestorer(object, property));\n\n        object[property] = replacement;\n\n        return replacement;\n    };\n\n    sandbox.replaceGetter = function replaceGetter(object, property, replacement) {\n        var descriptor = getPropertyDescriptor(object, property);\n\n        if (typeof descriptor === \"undefined\") {\n            throw new TypeError(\"Cannot replace non-existent own property \" + valueToString(property));\n        }\n\n        if (typeof replacement !== \"function\") {\n            throw new TypeError(\"Expected replacement argument to be a function\");\n        }\n\n        if (typeof descriptor.get !== \"function\") {\n            throw new Error(\"`object.property` is not a getter\");\n        }\n\n        verifyNotReplaced(object, property);\n\n        // store a function for restoring the replaced property\n        push(fakeRestorers, getFakeRestorer(object, property));\n\n        Object.defineProperty(object, property, {\n            get: replacement,\n            configurable: isPropertyConfigurable(object, property)\n        });\n\n        return replacement;\n    };\n\n    sandbox.replaceSetter = function replaceSetter(object, property, replacement) {\n        var descriptor = getPropertyDescriptor(object, property);\n\n        if (typeof descriptor === \"undefined\") {\n            throw new TypeError(\"Cannot replace non-existent own property \" + valueToString(property));\n        }\n\n        if (typeof replacement !== \"function\") {\n            throw new TypeError(\"Expected replacement argument to be a function\");\n        }\n\n        if (typeof descriptor.set !== \"function\") {\n            throw new Error(\"`object.property` is not a setter\");\n        }\n\n        verifyNotReplaced(object, property);\n\n        // store a function for restoring the replaced property\n        push(fakeRestorers, getFakeRestorer(object, property));\n\n        // eslint-disable-next-line accessor-pairs\n        Object.defineProperty(object, property, {\n            set: replacement,\n            configurable: isPropertyConfigurable(object, property)\n        });\n\n        return replacement;\n    };\n\n    sandbox.spy = function spy() {\n        var s = sinonSpy.apply(sinonSpy, arguments);\n\n        push(collection, s);\n\n        return s;\n    };\n\n    sandbox.stub = function stub(object, property) {\n        if (isEsModule(object)) {\n            throw new TypeError(\"ES Modules cannot be stubbed\");\n        }\n\n        if (isNonExistentOwnProperty(object, property)) {\n            throw new TypeError(\"Cannot stub non-existent own property \" + valueToString(property));\n        }\n\n        var stubbed = sinonStub.apply(null, arguments);\n        var isStubbingEntireObject = typeof property === \"undefined\" && typeof object === \"object\";\n\n        if (isStubbingEntireObject) {\n            var ownMethods = collectOwnMethods(stubbed);\n\n            forEach(ownMethods, function(method) {\n                push(collection, method);\n            });\n\n            usePromiseLibrary(promiseLib, ownMethods);\n        } else {\n            push(collection, stubbed);\n            usePromiseLibrary(promiseLib, stubbed);\n        }\n\n        return stubbed;\n    };\n\n    // eslint-disable-next-line no-unused-vars\n    sandbox.fake = function fake(f) {\n        var s = sinonFake.apply(sinonFake, arguments);\n\n        push(collection, s);\n\n        return s;\n    };\n\n    forEach(Object.keys(sinonFake), function(key) {\n        var fakeBehavior = sinonFake[key];\n        if (typeof fakeBehavior === \"function\") {\n            sandbox.fake[key] = function() {\n                var s = fakeBehavior.apply(fakeBehavior, arguments);\n\n                push(collection, s);\n\n                return s;\n            };\n        }\n    });\n\n    sandbox.useFakeTimers = function useFakeTimers(args) {\n        var clock = sinonClock.useFakeTimers.call(null, args);\n\n        sandbox.clock = clock;\n        push(collection, clock);\n\n        return clock;\n    };\n\n    sandbox.verify = function verify() {\n        applyOnEach(collection, \"verify\");\n    };\n\n    sandbox.verifyAndRestore = function verifyAndRestore() {\n        var exception;\n\n        try {\n            sandbox.verify();\n        } catch (e) {\n            exception = e;\n        }\n\n        sandbox.restore();\n\n        if (exception) {\n            throw exception;\n        }\n    };\n\n    sandbox.useFakeServer = function useFakeServer() {\n        var proto = sandbox.serverPrototype || fakeServer;\n\n        if (!proto || !proto.create) {\n            return null;\n        }\n\n        sandbox.server = proto.create();\n        push(collection, sandbox.server);\n\n        return sandbox.server;\n    };\n\n    sandbox.useFakeXMLHttpRequest = function useFakeXMLHttpRequest() {\n        var xhr = fakeXhr.useFakeXMLHttpRequest();\n        push(collection, xhr);\n        return xhr;\n    };\n\n    sandbox.usingPromise = function usingPromise(promiseLibrary) {\n        promiseLib = promiseLibrary;\n        collection.promiseLibrary = promiseLibrary;\n\n        return sandbox;\n    };\n}\n\nSandbox.prototype.assert = sinonAssert;\nSandbox.prototype.match = match;\n\nmodule.exports = Sandbox;\n\n},{\"./assert\":2,\"./collect-own-methods\":5,\"./fake\":9,\"./mock\":11,\"./spy\":14,\"./stub\":16,\"./util/core/get-property-descriptor\":24,\"./util/core/is-es-module\":25,\"./util/core/is-non-existent-own-property\":26,\"./util/core/is-property-configurable\":27,\"./util/core/use-promise-library\":30,\"./util/fake-timers\":33,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65,\"nise\":85}],13:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar color = require(\"./color\");\nvar match = require(\"@sinonjs/samsam\").createMatcher;\nvar timesInWords = require(\"./util/core/times-in-words\");\nvar sinonFormat = require(\"./util/core/format\");\nvar jsDiff = require(\"diff\");\n\nvar join = arrayProto.join;\nvar map = arrayProto.map;\nvar push = arrayProto.push;\n\nfunction colorSinonMatchText(matcher, calledArg, calledArgMessage) {\n    var calledArgumentMessage = calledArgMessage;\n    if (!matcher.test(calledArg)) {\n        matcher.message = color.red(matcher.message);\n        if (calledArgumentMessage) {\n            calledArgumentMessage = color.green(calledArgumentMessage);\n        }\n    }\n    return calledArgumentMessage + \" \" + matcher.message;\n}\n\nfunction colorDiffText(diff) {\n    var objects = map(diff, function(part) {\n        var text = part.value;\n        if (part.added) {\n            text = color.green(text);\n        } else if (part.removed) {\n            text = color.red(text);\n        }\n        if (diff.length === 2) {\n            text += \" \"; // format simple diffs\n        }\n        return text;\n    });\n    return join(objects, \"\");\n}\n\nmodule.exports = {\n    c: function(spyInstance) {\n        return timesInWords(spyInstance.callCount);\n    },\n\n    n: function(spyInstance) {\n        // eslint-disable-next-line local-rules/no-prototype-methods\n        return spyInstance.toString();\n    },\n\n    D: function(spyInstance, args) {\n        var message = \"\";\n\n        for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n            // describe multiple calls\n            if (l > 1) {\n                message += \"\\nCall \" + (i + 1) + \":\";\n            }\n            var calledArgs = spyInstance.getCall(i).args;\n            for (var j = 0; j < calledArgs.length || j < args.length; ++j) {\n                message += \"\\n\";\n                var calledArgMessage = j < calledArgs.length ? sinonFormat(calledArgs[j]) : \"\";\n                if (match.isMatcher(args[j])) {\n                    message += colorSinonMatchText(args[j], calledArgs[j], calledArgMessage);\n                } else {\n                    var expectedArgMessage = j < args.length ? sinonFormat(args[j]) : \"\";\n                    var diff = jsDiff.diffJson(calledArgMessage, expectedArgMessage);\n                    message += colorDiffText(diff);\n                }\n            }\n        }\n\n        return message;\n    },\n\n    C: function(spyInstance) {\n        var calls = [];\n\n        for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n            // eslint-disable-next-line local-rules/no-prototype-methods\n            var stringifiedCall = \"    \" + spyInstance.getCall(i).toString();\n            if (/\\n/.test(calls[i - 1])) {\n                stringifiedCall = \"\\n\" + stringifiedCall;\n            }\n            push(calls, stringifiedCall);\n        }\n\n        return calls.length > 0 ? \"\\n\" + join(calls, \"\\n\") : \"\";\n    },\n\n    t: function(spyInstance) {\n        var objects = [];\n\n        for (var i = 0, l = spyInstance.callCount; i < l; ++i) {\n            push(objects, sinonFormat(spyInstance.thisValues[i]));\n        }\n\n        return join(objects, \", \");\n    },\n\n    \"*\": function(spyInstance, args) {\n        return join(\n            map(args, function(arg) {\n                return sinonFormat(arg);\n            }),\n            \", \"\n        );\n    }\n};\n\n},{\"./color\":6,\"./util/core/format\":21,\"./util/core/times-in-words\":29,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65,\"diff\":69}],14:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar createBehavior = require(\"./behavior\").create;\nvar extend = require(\"./util/core/extend\");\nvar functionName = require(\"@sinonjs/commons\").functionName;\nvar functionToString = require(\"./util/core/function-to-string\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar deepEqual = require(\"@sinonjs/samsam\").deepEqual;\nvar isEsModule = require(\"./util/core/is-es-module\");\nvar spyCall = require(\"./call\");\nvar wrapMethod = require(\"./util/core/wrap-method\");\nvar sinonFormat = require(\"./util/core/format\");\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\n/* cache references to library methods so that they also can be stubbed without problems */\nvar concat = arrayProto.concat;\nvar forEach = arrayProto.forEach;\nvar pop = arrayProto.pop;\nvar push = arrayProto.push;\nvar slice = arrayProto.slice;\nvar filter = Array.prototype.filter;\nvar ErrorConstructor = Error.prototype.constructor;\nvar bind = Function.prototype.bind;\n\nvar callId = 0;\n\nfunction spy(object, property, types) {\n    var descriptor, methodDesc;\n\n    if (isEsModule(object)) {\n        throw new TypeError(\"ES Modules cannot be spied\");\n    }\n\n    if (!property && typeof object === \"function\") {\n        return spy.create(object);\n    }\n\n    if (!object && !property) {\n        return spy.create(function() {\n            return;\n        });\n    }\n\n    if (!types) {\n        return wrapMethod(object, property, spy.create(object[property]));\n    }\n\n    descriptor = {};\n    methodDesc = getPropertyDescriptor(object, property);\n\n    forEach(types, function(type) {\n        descriptor[type] = spy.create(methodDesc[type]);\n    });\n\n    return wrapMethod(object, property, descriptor);\n}\n\nfunction incrementCallCount() {\n    this.called = true;\n    this.callCount += 1;\n    this.notCalled = false;\n    this.calledOnce = this.callCount === 1;\n    this.calledTwice = this.callCount === 2;\n    this.calledThrice = this.callCount === 3;\n}\n\nfunction createCallProperties() {\n    this.firstCall = this.getCall(0);\n    this.secondCall = this.getCall(1);\n    this.thirdCall = this.getCall(2);\n    this.lastCall = this.getCall(this.callCount - 1);\n}\n\nfunction createProxy(func, proxyLength) {\n    // Retain the function length:\n    var p;\n    if (proxyLength) {\n        // Do not change this to use an eval. Projects that depend on sinon block the use of eval.\n        // ref: https://github.com/sinonjs/sinon/issues/710\n        switch (proxyLength) {\n            /*eslint-disable no-unused-vars, max-len*/\n            case 1:\n                p = function proxy(a) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 2:\n                p = function proxy(a, b) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 3:\n                p = function proxy(a, b, c) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 4:\n                p = function proxy(a, b, c, d) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 5:\n                p = function proxy(a, b, c, d, e) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 6:\n                p = function proxy(a, b, c, d, e, f) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 7:\n                p = function proxy(a, b, c, d, e, f, g) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 8:\n                p = function proxy(a, b, c, d, e, f, g, h) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 9:\n                p = function proxy(a, b, c, d, e, f, g, h, i) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 10:\n                p = function proxy(a, b, c, d, e, f, g, h, i, j) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 11:\n                p = function proxy(a, b, c, d, e, f, g, h, i, j, k) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            case 12:\n                p = function proxy(a, b, c, d, e, f, g, h, i, j, k, l) {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            default:\n                p = function proxy() {\n                    return p.invoke(func, this, slice(arguments));\n                };\n                break;\n            /*eslint-enable*/\n        }\n    } else {\n        p = function proxy() {\n            return p.invoke(func, this, slice(arguments));\n        };\n    }\n    var nameDescriptor = Object.getOwnPropertyDescriptor(func, \"name\");\n    if (nameDescriptor && nameDescriptor.configurable) {\n        // IE 11 functions don't have a name.\n        // Safari 9 has names that are not configurable.\n        Object.defineProperty(p, \"name\", nameDescriptor);\n    }\n    extend.nonEnum(p, {\n        isSinonProxy: true,\n\n        called: false,\n        notCalled: true,\n        calledOnce: false,\n        calledTwice: false,\n        calledThrice: false,\n        callCount: 0,\n        firstCall: null,\n        secondCall: null,\n        thirdCall: null,\n        lastCall: null,\n        args: [],\n        returnValues: [],\n        thisValues: [],\n        exceptions: [],\n        callIds: [],\n        errorsWithCallStack: []\n    });\n    return p;\n}\n\nvar uuid = 0;\n\n// Public API\nvar spyApi = {\n    formatters: require(\"./spy-formatters\"),\n\n    resetHistory: function() {\n        if (this.invoking) {\n            var err = new Error(\n                \"Cannot reset Sinon function while invoking it. \" +\n                    \"Move the call to .resetHistory outside of the callback.\"\n            );\n            err.name = \"InvalidResetException\";\n            throw err;\n        }\n\n        this.called = false;\n        this.notCalled = true;\n        this.calledOnce = false;\n        this.calledTwice = false;\n        this.calledThrice = false;\n        this.callCount = 0;\n        this.firstCall = null;\n        this.secondCall = null;\n        this.thirdCall = null;\n        this.lastCall = null;\n        this.args = [];\n        this.returnValues = [];\n        this.thisValues = [];\n        this.exceptions = [];\n        this.callIds = [];\n        this.errorsWithCallStack = [];\n\n        if (this.fakes) {\n            forEach(this.fakes, function(fake) {\n                if (fake.resetHistory) {\n                    fake.resetHistory();\n                } else {\n                    fake.reset();\n                }\n            });\n        }\n\n        return this;\n    },\n\n    create: function create(func, spyLength) {\n        var name;\n        var funk = func;\n\n        if (typeof funk !== \"function\") {\n            funk = function() {\n                return;\n            };\n        } else {\n            name = functionName(funk);\n        }\n\n        var length = spyLength || funk.length;\n        var proxy = createProxy(funk, length);\n\n        extend.nonEnum(proxy, spy);\n        delete proxy.create;\n        extend(proxy, funk);\n\n        proxy.resetHistory();\n        proxy.prototype = funk.prototype;\n\n        extend.nonEnum(proxy, {\n            displayName: name || \"spy\",\n            toString: functionToString,\n            instantiateFake: spy.create,\n            id: \"spy#\" + uuid++\n        });\n\n        return proxy;\n    },\n\n    invoke: function invoke(func, thisValue, args) {\n        var matchings = this.matchingFakes(args);\n        var currentCallId = callId++;\n        var exception, returnValue;\n\n        incrementCallCount.call(this);\n        push(this.thisValues, thisValue);\n        push(this.args, args);\n        push(this.callIds, currentCallId);\n        forEach(matchings, function(matching) {\n            incrementCallCount.call(matching);\n            push(matching.thisValues, thisValue);\n            push(matching.args, args);\n            push(matching.callIds, currentCallId);\n        });\n\n        // Make call properties available from within the spied function:\n        createCallProperties.call(this);\n        forEach(matchings, function(matching) {\n            createCallProperties.call(matching);\n        });\n\n        try {\n            this.invoking = true;\n\n            var thisCall = this.getCall(this.callCount - 1);\n\n            if (thisCall.calledWithNew()) {\n                // Call through with `new`\n                returnValue = new (bind.apply(this.func || func, concat([thisValue], args)))();\n\n                if (typeof returnValue !== \"object\") {\n                    returnValue = thisValue;\n                }\n            } else {\n                returnValue = (this.func || func).apply(thisValue, args);\n            }\n        } catch (e) {\n            exception = e;\n        } finally {\n            delete this.invoking;\n        }\n\n        push(this.exceptions, exception);\n        push(this.returnValues, returnValue);\n        forEach(matchings, function(matching) {\n            push(matching.exceptions, exception);\n            push(matching.returnValues, returnValue);\n        });\n\n        var err = new ErrorConstructor();\n        // 1. Please do not get stack at this point. It may be so very slow, and not actually used\n        // 2. PhantomJS does not serialize the stack trace until the error has been thrown:\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack\n        try {\n            throw err;\n        } catch (e) {\n            /* empty */\n        }\n        push(this.errorsWithCallStack, err);\n        forEach(matchings, function(matching) {\n            push(matching.errorsWithCallStack, err);\n        });\n\n        // Make return value and exception available in the calls:\n        createCallProperties.call(this);\n        forEach(matchings, function(matching) {\n            createCallProperties.call(matching);\n        });\n\n        if (exception !== undefined) {\n            throw exception;\n        }\n\n        return returnValue;\n    },\n\n    named: function named(name) {\n        this.displayName = name;\n        var nameDescriptor = Object.getOwnPropertyDescriptor(this, \"name\");\n        if (nameDescriptor && nameDescriptor.configurable) {\n            // IE 11 functions don't have a name.\n            // Safari 9 has names that are not configurable.\n            nameDescriptor.value = name;\n            Object.defineProperty(this, \"name\", nameDescriptor);\n        }\n        return this;\n    },\n\n    getCall: function getCall(i) {\n        if (i < 0 || i >= this.callCount) {\n            return null;\n        }\n\n        return spyCall(\n            this,\n            this.thisValues[i],\n            this.args[i],\n            this.returnValues[i],\n            this.exceptions[i],\n            this.callIds[i],\n            this.errorsWithCallStack[i]\n        );\n    },\n\n    getCalls: function() {\n        var calls = [];\n        var i;\n\n        for (i = 0; i < this.callCount; i++) {\n            push(calls, this.getCall(i));\n        }\n\n        return calls;\n    },\n\n    calledBefore: function calledBefore(spyFn) {\n        if (!this.called) {\n            return false;\n        }\n\n        if (!spyFn.called) {\n            return true;\n        }\n\n        return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n    },\n\n    calledAfter: function calledAfter(spyFn) {\n        if (!this.called || !spyFn.called) {\n            return false;\n        }\n\n        return this.callIds[this.callCount - 1] > spyFn.callIds[0];\n    },\n\n    calledImmediatelyBefore: function calledImmediatelyBefore(spyFn) {\n        if (!this.called || !spyFn.called) {\n            return false;\n        }\n\n        return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] - 1;\n    },\n\n    calledImmediatelyAfter: function calledImmediatelyAfter(spyFn) {\n        if (!this.called || !spyFn.called) {\n            return false;\n        }\n\n        return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] + 1;\n    },\n\n    withArgs: function() {\n        var args = slice(arguments);\n\n        if (this.fakes) {\n            var matching = pop(this.matchingFakes(args, true));\n\n            if (matching) {\n                return matching;\n            }\n        } else {\n            extend.nonEnum(this, { fakes: [] });\n        }\n\n        var original = this;\n        var fake = this.instantiateFake();\n        fake.matchingArguments = args;\n        fake.parent = this;\n        push(this.fakes, fake);\n\n        if (original.defaultBehavior && original.defaultBehavior.promiseLibrary) {\n            fake.defaultBehavior = fake.defaultBehavior || createBehavior(fake);\n            fake.defaultBehavior.promiseLibrary = original.defaultBehavior.promiseLibrary;\n        }\n\n        fake.withArgs = function() {\n            return original.withArgs.apply(original, arguments);\n        };\n\n        forEach(original.args, function(arg, i) {\n            if (!fake.matches(arg)) {\n                return;\n            }\n\n            incrementCallCount.call(fake);\n            push(fake.thisValues, original.thisValues[i]);\n            push(fake.args, arg);\n            push(fake.returnValues, original.returnValues[i]);\n            push(fake.exceptions, original.exceptions[i]);\n            push(fake.callIds, original.callIds[i]);\n        });\n\n        createCallProperties.call(fake);\n\n        return fake;\n    },\n\n    matchingFakes: function(args, strict) {\n        return filter.call(this.fakes || [], function(fake) {\n            return fake.matches(args, strict);\n        });\n    },\n\n    matches: function(args, strict) {\n        var margs = this.matchingArguments;\n\n        if (margs.length <= args.length && deepEqual(slice(args, 0, margs.length), margs)) {\n            return !strict || margs.length === args.length;\n        }\n\n        return undefined;\n    },\n\n    printf: function(format) {\n        var spyInstance = this;\n        var args = slice(arguments, 1);\n        var formatter;\n\n        return (format || \"\").replace(/%(.)/g, function(match, specifyer) {\n            formatter = spyApi.formatters[specifyer];\n\n            if (typeof formatter === \"function\") {\n                return String(formatter(spyInstance, args));\n            } else if (!isNaN(parseInt(specifyer, 10))) {\n                return sinonFormat(args[specifyer - 1]);\n            }\n\n            return \"%\" + specifyer;\n        });\n    }\n};\n\nfunction delegateToCalls(method, matchAny, actual, returnsValues, notCalled, totalCallCount) {\n    spyApi[method] = function() {\n        if (!this.called) {\n            if (notCalled) {\n                return notCalled.apply(this, arguments);\n            }\n            return false;\n        }\n\n        if (totalCallCount !== undefined && this.callCount !== totalCallCount) {\n            return false;\n        }\n\n        var currentCall;\n        var matches = 0;\n        var returnValues = [];\n\n        for (var i = 0, l = this.callCount; i < l; i += 1) {\n            currentCall = this.getCall(i);\n            var returnValue = currentCall[actual || method].apply(currentCall, arguments);\n            push(returnValues, returnValue);\n            if (returnValue) {\n                matches += 1;\n\n                if (matchAny) {\n                    return true;\n                }\n            }\n        }\n\n        if (returnsValues) {\n            return returnValues;\n        }\n        return matches === this.callCount;\n    };\n}\n\ndelegateToCalls(\"calledOn\", true);\ndelegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\ndelegateToCalls(\"calledWith\", true);\ndelegateToCalls(\"calledOnceWith\", true, \"calledWith\", false, undefined, 1);\ndelegateToCalls(\"calledWithMatch\", true);\ndelegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\ndelegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\ndelegateToCalls(\"calledWithExactly\", true);\ndelegateToCalls(\"calledOnceWithExactly\", true, \"calledWithExactly\", false, undefined, 1);\ndelegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\ndelegateToCalls(\"neverCalledWith\", false, \"notCalledWith\", false, function() {\n    return true;\n});\ndelegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\", false, function() {\n    return true;\n});\ndelegateToCalls(\"threw\", true);\ndelegateToCalls(\"alwaysThrew\", false, \"threw\");\ndelegateToCalls(\"returned\", true);\ndelegateToCalls(\"alwaysReturned\", false, \"returned\");\ndelegateToCalls(\"calledWithNew\", true);\ndelegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n/* eslint-disable local-rules/no-prototype-methods */\ndelegateToCalls(\"callArg\", false, \"callArgWith\", true, function() {\n    throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n});\nspyApi.callArgWith = spyApi.callArg;\ndelegateToCalls(\"callArgOn\", false, \"callArgOnWith\", true, function() {\n    throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n});\nspyApi.callArgOnWith = spyApi.callArgOn;\ndelegateToCalls(\"throwArg\", false, \"throwArg\", false, function() {\n    throw new Error(this.toString() + \" cannot throw arg since it was not yet invoked.\");\n});\ndelegateToCalls(\"yield\", false, \"yield\", true, function() {\n    throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n});\n// \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\nspyApi.invokeCallback = spyApi.yield;\ndelegateToCalls(\"yieldOn\", false, \"yieldOn\", true, function() {\n    throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n});\ndelegateToCalls(\"yieldTo\", false, \"yieldTo\", true, function(property) {\n    throw new Error(\n        this.toString() + \" cannot yield to '\" + valueToString(property) + \"' since it was not yet invoked.\"\n    );\n});\ndelegateToCalls(\"yieldToOn\", false, \"yieldToOn\", true, function(property) {\n    throw new Error(\n        this.toString() + \" cannot yield to '\" + valueToString(property) + \"' since it was not yet invoked.\"\n    );\n});\n/* eslint-enable local-rules/no-prototype-methods */\n\nextend(spy, spyApi);\nspy.spyCall = spyCall;\nmodule.exports = spy;\n\n},{\"./behavior\":3,\"./call\":4,\"./spy-formatters\":13,\"./util/core/extend\":20,\"./util/core/format\":21,\"./util/core/function-to-string\":22,\"./util/core/get-property-descriptor\":24,\"./util/core/is-es-module\":25,\"./util/core/wrap-method\":32,\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65}],15:[function(require,module,exports){\n\"use strict\";\n\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar walk = require(\"./util/core/walk\");\n\nfunction stubEntireObject(stub, object) {\n    walk(object || {}, function(prop, propOwner) {\n        // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object\n        // is not Object.prototype\n        if (\n            propOwner !== Object.prototype &&\n            prop !== \"constructor\" &&\n            typeof getPropertyDescriptor(propOwner, prop).value === \"function\"\n        ) {\n            stub(object, prop);\n        }\n    });\n\n    return object;\n}\n\nmodule.exports = stubEntireObject;\n\n},{\"./util/core/get-property-descriptor\":24,\"./util/core/walk\":31}],16:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar behavior = require(\"./behavior\");\nvar behaviors = require(\"./default-behaviors\");\nvar hasOwnProperty = require(\"@sinonjs/commons\").prototypes.object.hasOwnProperty;\nvar isNonExistentOwnProperty = require(\"./util/core/is-non-existent-own-property\");\nvar spy = require(\"./spy\");\nvar extend = require(\"./util/core/extend\");\nvar functionToString = require(\"./util/core/function-to-string\");\nvar getPropertyDescriptor = require(\"./util/core/get-property-descriptor\");\nvar isEsModule = require(\"./util/core/is-es-module\");\nvar wrapMethod = require(\"./util/core/wrap-method\");\nvar stubEntireObject = require(\"./stub-entire-object\");\nvar throwOnFalsyObject = require(\"./throw-on-falsy-object\");\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nvar forEach = arrayProto.forEach;\nvar pop = arrayProto.pop;\nvar slice = arrayProto.slice;\nvar sort = arrayProto.sort;\n\nfunction stub(object, property) {\n    if (arguments.length > 2) {\n        throw new TypeError(\"stub(obj, 'meth', fn) has been removed, see documentation\");\n    }\n\n    if (isEsModule(object)) {\n        throw new TypeError(\"ES Modules cannot be stubbed\");\n    }\n\n    throwOnFalsyObject.apply(null, arguments);\n\n    if (isNonExistentOwnProperty(object, property)) {\n        throw new TypeError(\"Cannot stub non-existent own property \" + valueToString(property));\n    }\n\n    var actualDescriptor = getPropertyDescriptor(object, property);\n    var isObject = typeof object === \"object\" || typeof object === \"function\";\n    var isStubbingEntireObject = typeof property === \"undefined\" && isObject;\n    var isCreatingNewStub = !object && typeof property === \"undefined\";\n    var isStubbingNonFuncProperty =\n        isObject &&\n        typeof property !== \"undefined\" &&\n        (typeof actualDescriptor === \"undefined\" || typeof actualDescriptor.value !== \"function\") &&\n        typeof descriptor === \"undefined\";\n    var isStubbingExistingMethod =\n        typeof object === \"object\" &&\n        typeof actualDescriptor !== \"undefined\" &&\n        typeof actualDescriptor.value === \"function\";\n    var arity = isStubbingExistingMethod ? object[property].length : 0;\n\n    if (isStubbingEntireObject) {\n        return stubEntireObject(stub, object);\n    }\n\n    if (isCreatingNewStub) {\n        return stub.create();\n    }\n\n    var s = stub.create(arity);\n\n    extend.nonEnum(s, {\n        rootObj: object,\n        propName: property,\n        restore: function restore() {\n            if (actualDescriptor !== undefined) {\n                Object.defineProperty(object, property, actualDescriptor);\n                return;\n            }\n\n            delete object[property];\n        }\n    });\n\n    return isStubbingNonFuncProperty ? s : wrapMethod(object, property, s);\n}\n\nstub.createStubInstance = function(constructor, overrides) {\n    if (typeof constructor !== \"function\") {\n        throw new TypeError(\"The constructor should be a function.\");\n    }\n\n    var stubbedObject = stub(Object.create(constructor.prototype));\n\n    forEach(Object.keys(overrides || {}), function(propertyName) {\n        if (propertyName in stubbedObject) {\n            var value = overrides[propertyName];\n            if (value && value.createStubInstance) {\n                stubbedObject[propertyName] = value;\n            } else {\n                stubbedObject[propertyName].returns(value);\n            }\n        } else {\n            throw new Error(\"Cannot stub \" + propertyName + \". Property does not exist!\");\n        }\n    });\n    return stubbedObject;\n};\n\n/*eslint-disable no-use-before-define*/\nfunction getParentBehaviour(stubInstance) {\n    return stubInstance.parent && getCurrentBehavior(stubInstance.parent);\n}\n\nfunction getDefaultBehavior(stubInstance) {\n    return stubInstance.defaultBehavior || getParentBehaviour(stubInstance) || behavior.create(stubInstance);\n}\n\nfunction getCurrentBehavior(stubInstance) {\n    var currentBehavior = stubInstance.behaviors[stubInstance.callCount - 1];\n    return currentBehavior && currentBehavior.isPresent() ? currentBehavior : getDefaultBehavior(stubInstance);\n}\n/*eslint-enable no-use-before-define*/\n\nvar uuid = 0;\n\nvar proto = {\n    create: function create(stubLength) {\n        var functionStub = function() {\n            var args = slice(arguments);\n            var matchings = functionStub.matchingFakes(args);\n\n            var fnStub =\n                pop(\n                    sort(matchings, function(a, b) {\n                        return a.matchingArguments.length - b.matchingArguments.length;\n                    })\n                ) || functionStub;\n            return getCurrentBehavior(fnStub).invoke(this, arguments);\n        };\n\n        var orig = functionStub;\n        functionStub = spy.create(functionStub, stubLength);\n\n        extend.nonEnum(functionStub, {\n            id: \"stub#\" + uuid++,\n            func: orig\n        });\n\n        extend(functionStub, stub);\n\n        extend.nonEnum(functionStub, {\n            instantiateFake: stub.create,\n            displayName: \"stub\",\n            toString: functionToString,\n\n            defaultBehavior: null,\n            behaviors: []\n        });\n\n        return functionStub;\n    },\n\n    resetBehavior: function() {\n        var fakes = this.fakes || [];\n\n        this.defaultBehavior = null;\n        this.behaviors = [];\n\n        delete this.returnValue;\n        delete this.returnArgAt;\n        delete this.throwArgAt;\n        delete this.resolveArgAt;\n        delete this.fakeFn;\n        this.returnThis = false;\n        this.resolveThis = false;\n\n        forEach(fakes, function(fake) {\n            fake.resetBehavior();\n        });\n    },\n\n    resetHistory: spy.resetHistory,\n\n    reset: function() {\n        this.resetHistory();\n        this.resetBehavior();\n    },\n\n    onCall: function onCall(index) {\n        if (!this.behaviors[index]) {\n            this.behaviors[index] = behavior.create(this);\n        }\n\n        return this.behaviors[index];\n    },\n\n    onFirstCall: function onFirstCall() {\n        return this.onCall(0);\n    },\n\n    onSecondCall: function onSecondCall() {\n        return this.onCall(1);\n    },\n\n    onThirdCall: function onThirdCall() {\n        return this.onCall(2);\n    }\n};\n\nforEach(Object.keys(behavior), function(method) {\n    if (\n        hasOwnProperty(behavior, method) &&\n        !hasOwnProperty(proto, method) &&\n        method !== \"create\" &&\n        method !== \"withArgs\" &&\n        method !== \"invoke\"\n    ) {\n        proto[method] = behavior.createBehavior(method);\n    }\n});\n\nforEach(Object.keys(behaviors), function(method) {\n    if (hasOwnProperty(behaviors, method) && !hasOwnProperty(proto, method)) {\n        behavior.addBehavior(stub, method, behaviors[method]);\n    }\n});\n\nextend(stub, proto);\nmodule.exports = stub;\n\n},{\"./behavior\":3,\"./default-behaviors\":8,\"./spy\":14,\"./stub-entire-object\":15,\"./throw-on-falsy-object\":17,\"./util/core/extend\":20,\"./util/core/function-to-string\":22,\"./util/core/get-property-descriptor\":24,\"./util/core/is-es-module\":25,\"./util/core/is-non-existent-own-property\":26,\"./util/core/wrap-method\":32,\"@sinonjs/commons\":39}],17:[function(require,module,exports){\n\"use strict\";\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nfunction throwOnFalsyObject(object, property) {\n    if (property && !object) {\n        var type = object === null ? \"null\" : \"undefined\";\n        throw new Error(\"Trying to stub property '\" + valueToString(property) + \"' of \" + type);\n    }\n}\n\nmodule.exports = throwOnFalsyObject;\n\n},{\"@sinonjs/commons\":39}],18:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {\n    injectInto: null,\n    properties: [\n        \"spy\",\n        \"stub\",\n        \"mock\",\n        \"clock\",\n        \"server\",\n        \"requests\",\n        \"fake\",\n        \"replace\",\n        \"replaceSetter\",\n        \"replaceGetter\",\n        \"createStubInstance\"\n    ],\n    useFakeTimers: true,\n    useFakeServer: true\n};\n\n},{}],19:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar reduce = arrayProto.reduce;\n\nmodule.exports = function exportAsyncBehaviors(behaviorMethods) {\n    return reduce(\n        Object.keys(behaviorMethods),\n        function(acc, method) {\n            // need to avoid creating another async versions of the newly added async methods\n            if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) {\n                acc[method + \"Async\"] = function() {\n                    var result = behaviorMethods[method].apply(this, arguments);\n                    this.callbackAsync = true;\n                    return result;\n                };\n            }\n            return acc;\n        },\n        {}\n    );\n};\n\n},{\"@sinonjs/commons\":39}],20:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar hasOwnProperty = require(\"@sinonjs/commons\").prototypes.object.hasOwnProperty;\n\nvar join = arrayProto.join;\nvar push = arrayProto.push;\nvar slice = arrayProto.slice;\n\n// Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\nvar hasDontEnumBug = (function() {\n    var obj = {\n        constructor: function() {\n            return \"0\";\n        },\n        toString: function() {\n            return \"1\";\n        },\n        valueOf: function() {\n            return \"2\";\n        },\n        toLocaleString: function() {\n            return \"3\";\n        },\n        prototype: function() {\n            return \"4\";\n        },\n        isPrototypeOf: function() {\n            return \"5\";\n        },\n        propertyIsEnumerable: function() {\n            return \"6\";\n        },\n        hasOwnProperty: function() {\n            return \"7\";\n        },\n        length: function() {\n            return \"8\";\n        },\n        unique: function() {\n            return \"9\";\n        }\n    };\n\n    var result = [];\n    for (var prop in obj) {\n        if (hasOwnProperty(obj, prop)) {\n            push(result, obj[prop]());\n        }\n    }\n    return join(result, \"\") !== \"0123456789\";\n})();\n\nfunction extendCommon(target, sources, doCopy) {\n    var source, i, prop;\n\n    for (i = 0; i < sources.length; i++) {\n        source = sources[i];\n\n        for (prop in source) {\n            if (hasOwnProperty(source, prop)) {\n                doCopy(target, source, prop);\n            }\n        }\n\n        // Make sure we copy (own) toString method even when in JScript with DontEnum bug\n        // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug\n        if (hasDontEnumBug && hasOwnProperty(source, \"toString\") && source.toString !== target.toString) {\n            target.toString = source.toString;\n        }\n    }\n\n    return target;\n}\n\n/** Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will\n *         override properties in previous sources.\n *\n * @arg {Object} target - The Object to extend\n * @arg {Object[]} sources - Objects to copy properties from.\n *\n * @returns {Object} the extended target\n */\nmodule.exports = function extend(target /*, sources */) {\n    var sources = slice(arguments, 1);\n\n    return extendCommon(target, sources, function copyValue(dest, source, prop) {\n        dest[prop] = source[prop];\n    });\n};\n\n/** Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will\n *         override properties in previous sources. Define the properties as non enumerable.\n *\n * @arg {Object} target - The Object to extend\n * @arg {Object[]} sources - Objects to copy properties from.\n *\n * @returns {Object} the extended target\n */\nmodule.exports.nonEnum = function extendNonEnum(target /*, sources */) {\n    var sources = slice(arguments, 1);\n\n    return extendCommon(target, sources, function copyProperty(dest, source, prop) {\n        Object.defineProperty(dest, prop, {\n            value: source[prop],\n            enumerable: false,\n            configurable: true,\n            writable: true\n        });\n    });\n};\n\n},{\"@sinonjs/commons\":39}],21:[function(require,module,exports){\n\"use strict\";\n\nvar formatio = require(\"@sinonjs/formatio\");\n\nvar formatter = formatio.configure({\n    quoteStrings: false,\n    limitChildrenCount: 250\n});\n\nvar customFormatter;\n\nfunction format() {\n    if (customFormatter) {\n        return customFormatter.apply(null, arguments);\n    }\n\n    return formatter.ascii.apply(formatter, arguments);\n}\n\nformat.setFormatter = function(aCustomFormatter) {\n    if (typeof aCustomFormatter !== \"function\") {\n        throw new Error(\"format.setFormatter must be called with a function\");\n    }\n\n    customFormatter = aCustomFormatter;\n};\n\nmodule.exports = format;\n\n},{\"@sinonjs/formatio\":49}],22:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function toString() {\n    var i, prop, thisValue;\n    if (this.getCall && this.callCount) {\n        i = this.callCount;\n\n        while (i--) {\n            thisValue = this.getCall(i).thisValue;\n\n            for (prop in thisValue) {\n                if (thisValue[prop] === this) {\n                    return prop;\n                }\n            }\n        }\n    }\n\n    return this.displayName || \"sinon fake\";\n};\n\n},{}],23:[function(require,module,exports){\n\"use strict\";\n\n/* istanbul ignore next : not testing that setTimeout works */\nfunction nextTick(callback) {\n    setTimeout(callback, 0);\n}\n\nmodule.exports = function getNextTick(process, setImmediate) {\n    if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n        return process.nextTick;\n    }\n\n    if (typeof setImmediate === \"function\") {\n        return setImmediate;\n    }\n\n    return nextTick;\n};\n\n},{}],24:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function getPropertyDescriptor(object, property) {\n    var proto = object;\n    var descriptor;\n\n    while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) {\n        proto = Object.getPrototypeOf(proto);\n    }\n    return descriptor;\n};\n\n},{}],25:[function(require,module,exports){\n\"use strict\";\n\n/**\n * Verify if an object is a ECMAScript Module\n *\n * As the exports from a module is immutable we cannot alter the exports\n * using spies or stubs. Let the consumer know this to avoid bug reports\n * on weird error messages.\n *\n * @param {Object} object The object to examine\n *\n * @returns {Boolean} true when the object is a module\n */\nmodule.exports = function(object) {\n    return (\n        object && typeof Symbol !== \"undefined\" && object[Symbol.toStringTag] === \"Module\" && Object.isSealed(object)\n    );\n};\n\n},{}],26:[function(require,module,exports){\n\"use strict\";\n\nfunction isNonExistentOwnProperty(object, property) {\n    return object && typeof property !== \"undefined\" && !(property in object);\n}\n\nmodule.exports = isNonExistentOwnProperty;\n\n},{}],27:[function(require,module,exports){\n\"use strict\";\n\nvar getPropertyDescriptor = require(\"./get-property-descriptor\");\n\nfunction isPropertyConfigurable(obj, propName) {\n    var propertyDescriptor = getPropertyDescriptor(obj, propName);\n\n    return propertyDescriptor ? propertyDescriptor.configurable : true;\n}\n\nmodule.exports = isPropertyConfigurable;\n\n},{\"./get-property-descriptor\":24}],28:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar getNextTick = require(\"./get-next-tick\");\n\n/* istanbul ignore next */\nvar root = typeof window !== \"undefined\" ? window : global;\n\nmodule.exports = getNextTick(root.process, root.setImmediate);\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./get-next-tick\":23}],29:[function(require,module,exports){\n\"use strict\";\n\nvar array = [null, \"once\", \"twice\", \"thrice\"];\n\nmodule.exports = function timesInWords(count) {\n    return array[count] || (count || 0) + \" times\";\n};\n\n},{}],30:[function(require,module,exports){\n\"use strict\";\n\nvar forEach = Array.prototype.forEach;\n\nfunction usePromiseLibrary(library, fakes) {\n    if (typeof library === \"undefined\") {\n        return;\n    }\n\n    if (Array.isArray(fakes)) {\n        forEach.call(fakes, usePromiseLibrary.bind(null, library));\n\n        return;\n    }\n\n    if (typeof fakes.usingPromise === \"function\") {\n        fakes.usingPromise(library);\n    }\n}\n\nmodule.exports = usePromiseLibrary;\n\n},{}],31:[function(require,module,exports){\n\"use strict\";\n\nvar forEach = require(\"@sinonjs/commons\").prototypes.array.forEach;\n\nfunction walkInternal(obj, iterator, context, originalObj, seen) {\n    var proto, prop;\n\n    if (typeof Object.getOwnPropertyNames !== \"function\") {\n        // We explicitly want to enumerate through all of the prototype's properties\n        // in this case, therefore we deliberately leave out an own property check.\n        /* eslint-disable-next-line guard-for-in */\n        for (prop in obj) {\n            iterator.call(context, obj[prop], prop, obj);\n        }\n\n        return;\n    }\n\n    forEach(Object.getOwnPropertyNames(obj), function(k) {\n        if (seen[k] !== true) {\n            seen[k] = true;\n            var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === \"function\" ? originalObj : obj;\n            iterator.call(context, k, target);\n        }\n    });\n\n    proto = Object.getPrototypeOf(obj);\n    if (proto) {\n        walkInternal(proto, iterator, context, originalObj, seen);\n    }\n}\n\n/* Walks the prototype chain of an object and iterates over every own property\n * name encountered. The iterator is called in the same fashion that Array.prototype.forEach\n * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional\n * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will\n * default to using a simple for..in loop.\n *\n * obj - The object to walk the prototype chain for.\n * iterator - The function to be called on each pass of the walk.\n * context - (Optional) When given, the iterator will be called with this object as the receiver.\n */\nmodule.exports = function walk(obj, iterator, context) {\n    return walkInternal(obj, iterator, context, obj, {});\n};\n\n},{\"@sinonjs/commons\":39}],32:[function(require,module,exports){\n\"use strict\";\n\nvar getPropertyDescriptor = require(\"./get-property-descriptor\");\nvar extend = require(\"./extend\");\nvar hasOwnProperty = require(\"@sinonjs/commons\").prototypes.object.hasOwnProperty;\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nfunction isFunction(obj) {\n    return typeof obj === \"function\" || Boolean(obj && obj.constructor && obj.call && obj.apply);\n}\n\nfunction mirrorProperties(target, source) {\n    for (var prop in source) {\n        if (!hasOwnProperty(target, prop)) {\n            target[prop] = source[prop];\n        }\n    }\n}\n\n// Cheap way to detect if we have ES5 support.\nvar hasES5Support = \"keys\" in Object;\n\nmodule.exports = function wrapMethod(object, property, method) {\n    if (!object) {\n        throw new TypeError(\"Should wrap property of object\");\n    }\n\n    if (typeof method !== \"function\" && typeof method !== \"object\") {\n        throw new TypeError(\"Method wrapper should be a function or a property descriptor\");\n    }\n\n    function checkWrappedMethod(wrappedMethod) {\n        var error;\n\n        if (!isFunction(wrappedMethod)) {\n            error = new TypeError(\n                \"Attempted to wrap \" + typeof wrappedMethod + \" property \" + valueToString(property) + \" as function\"\n            );\n        } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n            error = new TypeError(\"Attempted to wrap \" + valueToString(property) + \" which is already wrapped\");\n        } else if (wrappedMethod.calledBefore) {\n            var verb = wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n            error = new TypeError(\"Attempted to wrap \" + valueToString(property) + \" which is already \" + verb);\n        }\n\n        if (error) {\n            if (wrappedMethod && wrappedMethod.stackTraceError) {\n                error.stack += \"\\n--------------\\n\" + wrappedMethod.stackTraceError.stack;\n            }\n            throw error;\n        }\n    }\n\n    var error, wrappedMethod, i, wrappedMethodDesc;\n\n    function simplePropertyAssignment() {\n        wrappedMethod = object[property];\n        checkWrappedMethod(wrappedMethod);\n        object[property] = method;\n        method.displayName = property;\n    }\n\n    // Firefox has a problem when using hasOwn.call on objects from other frames.\n    /* eslint-disable-next-line local-rules/no-prototype-methods */\n    var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwnProperty(object, property);\n\n    if (hasES5Support) {\n        var methodDesc = typeof method === \"function\" ? { value: method } : method;\n        wrappedMethodDesc = getPropertyDescriptor(object, property);\n\n        if (!wrappedMethodDesc) {\n            error = new TypeError(\n                \"Attempted to wrap \" + typeof wrappedMethod + \" property \" + property + \" as function\"\n            );\n        } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) {\n            error = new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n        }\n        if (error) {\n            if (wrappedMethodDesc && wrappedMethodDesc.stackTraceError) {\n                error.stack += \"\\n--------------\\n\" + wrappedMethodDesc.stackTraceError.stack;\n            }\n            throw error;\n        }\n\n        var types = Object.keys(methodDesc);\n        for (i = 0; i < types.length; i++) {\n            wrappedMethod = wrappedMethodDesc[types[i]];\n            checkWrappedMethod(wrappedMethod);\n        }\n\n        mirrorProperties(methodDesc, wrappedMethodDesc);\n        for (i = 0; i < types.length; i++) {\n            mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]);\n        }\n        Object.defineProperty(object, property, methodDesc);\n\n        // catch failing assignment\n        // this is the converse of the check in `.restore` below\n        if (typeof method === \"function\" && object[property] !== method) {\n            // correct any wrongdoings caused by the defineProperty call above,\n            // such as adding new items (if object was a Storage object)\n            delete object[property];\n            simplePropertyAssignment();\n        }\n    } else {\n        simplePropertyAssignment();\n    }\n\n    extend.nonEnum(method, {\n        displayName: property,\n\n        // Set up an Error object for a stack trace which can be used later to find what line of\n        // code the original method was created on.\n        stackTraceError: new Error(\"Stack Trace for original\"),\n\n        restore: function() {\n            // For prototype properties try to reset by delete first.\n            // If this fails (ex: localStorage on mobile safari) then force a reset\n            // via direct assignment.\n            if (!owned) {\n                // In some cases `delete` may throw an error\n                try {\n                    delete object[property];\n                } catch (e) {} // eslint-disable-line no-empty\n                // For native code functions `delete` fails without throwing an error\n                // on Chrome < 43, PhantomJS, etc.\n            } else if (hasES5Support) {\n                Object.defineProperty(object, property, wrappedMethodDesc);\n            }\n\n            if (hasES5Support) {\n                var descriptor = getPropertyDescriptor(object, property);\n                if (descriptor && descriptor.value === method) {\n                    object[property] = wrappedMethod;\n                }\n            } else {\n                // Use strict equality comparison to check failures then force a reset\n                // via direct assignment.\n                if (object[property] === method) {\n                    object[property] = wrappedMethod;\n                }\n            }\n        }\n    });\n\n    method.wrappedMethod = wrappedMethod;\n\n    method.restore.sinon = true;\n\n    if (!hasES5Support) {\n        mirrorProperties(method, wrappedMethod);\n    }\n\n    return method;\n};\n\n},{\"./extend\":20,\"./get-property-descriptor\":24,\"@sinonjs/commons\":39}],33:[function(require,module,exports){\n\"use strict\";\n\nvar extend = require(\"./core/extend\");\nvar llx = require(\"lolex\");\n\nfunction createClock(config, globalCtx) {\n    var llxCtx = llx;\n    if (globalCtx !== null && typeof globalCtx === \"object\") {\n        llxCtx = llx.withGlobal(globalCtx);\n    }\n    var clock = llxCtx.install(config);\n    clock.restore = clock.uninstall;\n    return clock;\n}\n\n/**\n * @param {number|Date|Object} dateOrConfig The unix epoch value to install with (default 0)\n * @returns {Object} Returns a lolex clock instance\n */\nexports.useFakeTimers = function(dateOrConfig) {\n    var hasArguments = typeof dateOrConfig !== \"undefined\";\n    var argumentIsDateLike =\n        (typeof dateOrConfig === \"number\" || dateOrConfig instanceof Date) && arguments.length === 1;\n    var argumentIsObject = dateOrConfig !== null && typeof dateOrConfig === \"object\" && arguments.length === 1;\n\n    if (!hasArguments) {\n        return createClock({\n            now: 0\n        });\n    }\n\n    if (argumentIsDateLike) {\n        return createClock({\n            now: dateOrConfig\n        });\n    }\n\n    if (argumentIsObject) {\n        var config = extend.nonEnum({}, dateOrConfig);\n        var globalCtx = config.global;\n        delete config.global;\n        return createClock(config, globalCtx);\n    }\n\n    throw new TypeError(\"useFakeTimers expected epoch or config object. See https://github.com/sinonjs/sinon\");\n};\n\nexports.clock = {\n    create: function(now) {\n        return llx.createClock(now);\n    }\n};\n\nexports.timers = {\n    setTimeout: setTimeout,\n    clearTimeout: clearTimeout,\n    setImmediate: typeof setImmediate !== \"undefined\" ? setImmediate : undefined,\n    clearImmediate: typeof clearImmediate !== \"undefined\" ? clearImmediate : undefined,\n    setInterval: setInterval,\n    clearInterval: clearInterval,\n    Date: Date\n};\n\n},{\"./core/extend\":20,\"lolex\":73}],34:[function(require,module,exports){\n\"use strict\";\n\nvar every = require(\"./prototypes/array\").every;\n\nfunction hasCallsLeft(callMap, spy) {\n    if (callMap[spy.id] === undefined) {\n        callMap[spy.id] = 0;\n    }\n\n    return callMap[spy.id] < spy.callCount;\n}\n\nfunction checkAdjacentCalls(callMap, spy, index, spies) {\n    var calledBeforeNext = true;\n\n    if (index !== spies.length - 1) {\n        calledBeforeNext = spy.calledBefore(spies[index + 1]);\n    }\n\n    if (hasCallsLeft(callMap, spy) && calledBeforeNext) {\n        callMap[spy.id] += 1;\n        return true;\n    }\n\n    return false;\n}\n\nmodule.exports = function calledInOrder(spies) {\n    var callMap = {};\n    // eslint-disable-next-line no-underscore-dangle\n    var _spies = arguments.length > 1 ? arguments : spies;\n\n    return every(_spies, checkAdjacentCalls.bind(null, callMap));\n};\n\n},{\"./prototypes/array\":41}],35:[function(require,module,exports){\n\"use strict\";\n\nvar functionName = require(\"./function-name\");\n\nmodule.exports = function className(value) {\n    return (\n        (value.constructor && value.constructor.name) ||\n        // The next branch is for IE11 support only:\n        // Because the name property is not set on the prototype\n        // of the Function object, we finally try to grab the\n        // name from its definition. This will never be reached\n        // in node, so we are not able to test this properly.\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n        (typeof value.constructor === \"function\" &&\n            /* istanbul ignore next */\n            functionName(value.constructor)) ||\n        null\n    );\n};\n\n},{\"./function-name\":38}],36:[function(require,module,exports){\n/* eslint-disable no-console */\n\"use strict\";\n\n// wrap returns a function that will invoke the supplied function and print a deprecation warning to the console each\n// time it is called.\nexports.wrap = function(func, msg) {\n    var wrapped = function() {\n        exports.printWarning(msg);\n        return func.apply(this, arguments);\n    };\n    if (func.prototype) {\n        wrapped.prototype = func.prototype;\n    }\n    return wrapped;\n};\n\n// defaultMsg returns a string which can be supplied to `wrap()` to notify the user that a particular part of the\n// sinon API has been deprecated.\nexports.defaultMsg = function(packageName, funcName) {\n    return (\n        packageName +\n        \".\" +\n        funcName +\n        \" is deprecated and will be removed from the public API in a future version of \" +\n        packageName +\n        \".\"\n    );\n};\n\nexports.printWarning = function(msg) {\n    // Watch out for IE7 and below! :(\n    /* istanbul ignore next */\n    if (typeof console !== \"undefined\") {\n        if (console.info) {\n            console.info(msg);\n        } else {\n            console.log(msg);\n        }\n    }\n};\n\n},{}],37:[function(require,module,exports){\n\"use strict\";\n\n// This is an `every` implementation that works for all iterables\nmodule.exports = function every(obj, fn) {\n    var pass = true;\n\n    try {\n        /* eslint-disable-next-line local-rules/no-prototype-methods */\n        obj.forEach(function() {\n            if (!fn.apply(this, arguments)) {\n                // Throwing an error is the only way to break `forEach`\n                throw new Error();\n            }\n        });\n    } catch (e) {\n        pass = false;\n    }\n\n    return pass;\n};\n\n},{}],38:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function functionName(func) {\n    if (!func) {\n        return \"\";\n    }\n\n    return (\n        func.displayName ||\n        func.name ||\n        // Use function decomposition as a last resort to get function\n        // name. Does not rely on function decomposition to work - if it\n        // doesn't debugging will be slightly less informative\n        // (i.e. toString will say 'spy' rather than 'myFunc').\n        (String(func).match(/function ([^\\s(]+)/) || [])[1]\n    );\n};\n\n},{}],39:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {\n    calledInOrder: require(\"./called-in-order\"),\n    className: require(\"./class-name\"),\n    deprecated: require(\"./deprecated\"),\n    every: require(\"./every\"),\n    functionName: require(\"./function-name\"),\n    orderByFirstCall: require(\"./order-by-first-call\"),\n    prototypes: require(\"./prototypes\"),\n    typeOf: require(\"./type-of\"),\n    valueToString: require(\"./value-to-string\")\n};\n\n},{\"./called-in-order\":34,\"./class-name\":35,\"./deprecated\":36,\"./every\":37,\"./function-name\":38,\"./order-by-first-call\":40,\"./prototypes\":44,\"./type-of\":47,\"./value-to-string\":48}],40:[function(require,module,exports){\n\"use strict\";\n\nvar sort = require(\"./prototypes/array\").sort;\nvar slice = require(\"./prototypes/array\").slice;\n\nfunction comparator(a, b) {\n    // uuid, won't ever be equal\n    var aCall = a.getCall(0);\n    var bCall = b.getCall(0);\n    var aId = (aCall && aCall.callId) || -1;\n    var bId = (bCall && bCall.callId) || -1;\n\n    return aId < bId ? -1 : 1;\n}\n\nmodule.exports = function orderByFirstCall(spies) {\n    return sort(slice(spies), comparator);\n};\n\n},{\"./prototypes/array\":41}],41:[function(require,module,exports){\n\"use strict\";\n\nvar copyPrototype = require(\"./copy-prototype\");\n\nmodule.exports = copyPrototype(Array.prototype);\n\n},{\"./copy-prototype\":42}],42:[function(require,module,exports){\n\"use strict\";\n\nvar call = Function.call;\n\nmodule.exports = function copyPrototypeMethods(prototype) {\n    /* eslint-disable local-rules/no-prototype-methods */\n    return Object.getOwnPropertyNames(prototype).reduce(function(result, name) {\n        // ignore size because it throws from Map\n        if (\n            name !== \"size\" &&\n            name !== \"caller\" &&\n            name !== \"callee\" &&\n            name !== \"arguments\" &&\n            typeof prototype[name] === \"function\"\n        ) {\n            result[name] = call.bind(prototype[name]);\n        }\n\n        return result;\n    }, Object.create(null));\n};\n\n},{}],43:[function(require,module,exports){\n\"use strict\";\n\nvar copyPrototype = require(\"./copy-prototype\");\n\nmodule.exports = copyPrototype(Function.prototype);\n\n},{\"./copy-prototype\":42}],44:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {\n    array: require(\"./array\"),\n    function: require(\"./function\"),\n    object: require(\"./object\"),\n    string: require(\"./string\")\n};\n\n},{\"./array\":41,\"./function\":43,\"./object\":45,\"./string\":46}],45:[function(require,module,exports){\n\"use strict\";\n\nvar copyPrototype = require(\"./copy-prototype\");\n\nmodule.exports = copyPrototype(Object.prototype);\n\n},{\"./copy-prototype\":42}],46:[function(require,module,exports){\n\"use strict\";\n\nvar copyPrototype = require(\"./copy-prototype\");\n\nmodule.exports = copyPrototype(String.prototype);\n\n},{\"./copy-prototype\":42}],47:[function(require,module,exports){\n\"use strict\";\n\nvar type = require(\"type-detect\");\n\nmodule.exports = function typeOf(value) {\n    return type(value).toLowerCase();\n};\n\n},{\"type-detect\":89}],48:[function(require,module,exports){\n\"use strict\";\n\nfunction valueToString(value) {\n    if (value && value.toString) {\n        /* eslint-disable-next-line local-rules/no-prototype-methods */\n        return value.toString();\n    }\n    return String(value);\n}\n\nmodule.exports = valueToString;\n\n},{}],49:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar samsam = require(\"@sinonjs/samsam\");\nvar functionName = require(\"@sinonjs/commons\").functionName;\nvar typeOf = require(\"@sinonjs/commons\").typeOf;\n\nvar formatio = {\n    excludeConstructors: [\"Object\", /^.$/],\n    quoteStrings: true,\n    limitChildrenCount: 0\n};\n\nvar specialObjects = [];\nif (typeof global !== \"undefined\") {\n    specialObjects.push({ object: global, value: \"[object global]\" });\n}\nif (typeof document !== \"undefined\") {\n    specialObjects.push({\n        object: document,\n        value: \"[object HTMLDocument]\"\n    });\n}\nif (typeof window !== \"undefined\") {\n    specialObjects.push({ object: window, value: \"[object Window]\" });\n}\n\nfunction constructorName(f, object) {\n    var name = functionName(object && object.constructor);\n    var excludes = f.excludeConstructors ||\n            formatio.excludeConstructors || [];\n\n    var i, l;\n    for (i = 0, l = excludes.length; i < l; ++i) {\n        if (typeof excludes[i] === \"string\" && excludes[i] === name) {\n            return \"\";\n        } else if (excludes[i].test && excludes[i].test(name)) {\n            return \"\";\n        }\n    }\n\n    return name;\n}\n\nfunction isCircular(object, objects) {\n    if (typeof object !== \"object\") { return false; }\n    var i, l;\n    for (i = 0, l = objects.length; i < l; ++i) {\n        if (objects[i] === object) { return true; }\n    }\n    return false;\n}\n\nfunction ascii(f, object, processed, indent) {\n    if (typeof object === \"string\") {\n        if (object.length === 0) { return \"(empty string)\"; }\n        var qs = f.quoteStrings;\n        var quote = typeof qs !== \"boolean\" || qs;\n        return processed || quote ? \"\\\"\" + object + \"\\\"\" : object;\n    }\n\n    if (typeof object === \"symbol\") {\n        return object.toString();\n    }\n\n    if (typeof object === \"function\" && !(object instanceof RegExp)) {\n        return ascii.func(object);\n    }\n\n    processed = processed || [];\n\n    if (isCircular(object, processed)) { return \"[Circular]\"; }\n\n    if (typeOf(object) === \"array\") {\n        return ascii.array.call(f, object, processed);\n    }\n\n    if (!object) { return String((1 / object) === -Infinity ? \"-0\" : object); }\n    if (samsam.isElement(object)) { return ascii.element(object); }\n\n    if (typeof object.toString === \"function\" &&\n            object.toString !== Object.prototype.toString) {\n        return object.toString();\n    }\n\n    var i, l;\n    for (i = 0, l = specialObjects.length; i < l; i++) {\n        if (object === specialObjects[i].object) {\n            return specialObjects[i].value;\n        }\n    }\n\n    if (samsam.isSet(object)) {\n        return ascii.set.call(f, object, processed);\n    }\n\n    return ascii.object.call(f, object, processed, indent);\n}\n\nascii.func = function (func) {\n    var funcName = functionName(func) || \"\";\n    return \"function \" + funcName + \"() {}\";\n};\n\nfunction delimit(str, delimiters) {\n    delimiters = delimiters || [\"[\", \"]\"];\n    return delimiters[0] + str + delimiters[1];\n}\n\nascii.array = function (array, processed, delimiters) {\n    processed = processed || [];\n    processed.push(array);\n    var pieces = [];\n    var i, l;\n    l = (this.limitChildrenCount > 0) ?\n        Math.min(this.limitChildrenCount, array.length) : array.length;\n\n    for (i = 0; i < l; ++i) {\n        pieces.push(ascii(this, array[i], processed));\n    }\n\n    if (l < array.length) {\n        pieces.push(\"[... \" + (array.length - l) + \" more elements]\");\n    }\n\n    return delimit(pieces.join(\", \"), delimiters);\n};\n\nascii.set = function (set, processed) {\n    return ascii.array.call(this, Array.from(set), processed, [\"Set {\", \"}\"]);\n};\n\nascii.object = function (object, processed, indent) {\n    processed = processed || [];\n    processed.push(object);\n    indent = indent || 0;\n    var pieces = [];\n    var symbols = typeof Object.getOwnPropertySymbols === \"function\"\n        ? Object.getOwnPropertySymbols(object)\n        : [];\n    var properties = Object.keys(object).sort().concat(symbols);\n    var length = 3;\n    var prop, str, obj, i, k, l;\n    l = (this.limitChildrenCount > 0) ?\n        Math.min(this.limitChildrenCount, properties.length) : properties.length;\n\n    for (i = 0; i < l; ++i) {\n        prop = properties[i];\n        obj = object[prop];\n\n        if (isCircular(obj, processed)) {\n            str = \"[Circular]\";\n        } else {\n            str = ascii(this, obj, processed, indent + 2);\n        }\n\n        str = (\n            typeof prop === \"string\" && /\\s/.test(prop) ?\n                \"\\\"\" + prop + \"\\\"\" : prop.toString()\n        ) + \": \" + str;\n        length += str.length;\n        pieces.push(str);\n    }\n\n    var cons = constructorName(this, object);\n    var prefix = cons ? \"[\" + cons + \"] \" : \"\";\n    var is = \"\";\n    for (i = 0, k = indent; i < k; ++i) { is += \" \"; }\n\n    if (l < properties.length)\n    {pieces.push(\"[... \" + (properties.length - l) + \" more elements]\");}\n\n    if (length + indent > 80) {\n        return prefix + \"{\\n  \" + is + pieces.join(\",\\n  \" + is) + \"\\n\" +\n            is + \"}\";\n    }\n    return prefix + \"{ \" + pieces.join(\", \") + \" }\";\n};\n\nascii.element = function (element) {\n    var tagName = element.tagName.toLowerCase();\n    var attrs = element.attributes;\n    var pairs = [];\n    var attr, attrName, i, l, val;\n\n    for (i = 0, l = attrs.length; i < l; ++i) {\n        attr = attrs.item(i);\n        attrName = attr.nodeName.toLowerCase().replace(\"html:\", \"\");\n        val = attr.nodeValue;\n        if (attrName !== \"contenteditable\" || val !== \"inherit\") {\n            if (val) { pairs.push(attrName + \"=\\\"\" + val + \"\\\"\"); }\n        }\n    }\n\n    var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n    // SVG elements have undefined innerHTML\n    var content = element.innerHTML || \"\";\n\n    if (content.length > 20) {\n        content = content.substr(0, 20) + \"[...]\";\n    }\n\n    var res = formatted + pairs.join(\" \") + \">\" + content +\n            \"</\" + tagName + \">\";\n\n    return res.replace(/ contentEditable=\"inherit\"/, \"\");\n};\n\nfunction Formatio(options) {\n    // eslint-disable-next-line guard-for-in\n    for (var opt in options) {\n        this[opt] = options[opt];\n    }\n}\n\nFormatio.prototype = {\n    functionName: functionName,\n\n    configure: function (options) {\n        return new Formatio(options);\n    },\n\n    constructorName: function (object) {\n        return constructorName(this, object);\n    },\n\n    ascii: function (object, processed, indent) {\n        return ascii(this, object, processed, indent);\n    }\n};\n\nmodule.exports = Formatio.prototype;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"@sinonjs/commons\":39,\"@sinonjs/samsam\":65}],50:[function(require,module,exports){\n\"use strict\";\n\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nvar getClass = require(\"./get-class\");\nvar identical = require(\"./identical\");\nvar isArguments = require(\"./is-arguments\");\nvar isDate = require(\"./is-date\");\nvar isElement = require(\"./is-element\");\nvar isNaN = require(\"./is-nan\");\nvar isObject = require(\"./is-object\");\nvar isSet = require(\"./is-set\");\nvar isSubset = require(\"./is-subset\");\nvar getClassName = require(\"./get-class-name\");\n\nvar every = Array.prototype.every;\nvar getTime = Date.prototype.getTime;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar indexOf = Array.prototype.indexOf;\nvar keys = Object.keys;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\n\n/**\n * @name samsam.deepEqual\n * @param Object actual\n * @param Object expectation\n *\n * Deep equal comparison. Two values are \"deep equal\" if:\n *\n *   - They are equal, according to samsam.identical\n *   - They are both date objects representing the same time\n *   - They are both arrays containing elements that are all deepEqual\n *   - They are objects with the same set of properties, and each property\n *     in ``actual`` is deepEqual to the corresponding property in ``expectation``\n *\n * Supports cyclic objects.\n */\nfunction deepEqualCyclic(actual, expectation, match) {\n    // used for cyclic comparison\n    // contain already visited objects\n    var actualObjects = [];\n    var expectationObjects = [];\n    // contain pathes (position in the object structure)\n    // of the already visited objects\n    // indexes same as in objects arrays\n    var actualPaths = [];\n    var expectationPaths = [];\n    // contains combinations of already compared objects\n    // in the manner: { \"$1['ref']$2['ref']\": true }\n    var compared = {};\n\n    // does the recursion for the deep equal check\n    return (function deepEqual(\n        actualObj,\n        expectationObj,\n        actualPath,\n        expectationPath\n    ) {\n        // If both are matchers they must be the same instance in order to be\n        // considered equal If we didn't do that we would end up running one\n        // matcher against the other\n        if (match && match.isMatcher(expectationObj)) {\n            if (match.isMatcher(actualObj)) {\n                return actualObj === expectationObj;\n            }\n            return expectationObj.test(actualObj);\n        }\n\n        var actualType = typeof actualObj;\n        var expectationType = typeof expectationObj;\n\n        // == null also matches undefined\n        if (\n            actualObj === expectationObj ||\n            isNaN(actualObj) ||\n            isNaN(expectationObj) ||\n            actualObj == null ||\n            expectationObj == null ||\n            actualType !== \"object\" ||\n            expectationType !== \"object\"\n        ) {\n            return identical(actualObj, expectationObj);\n        }\n\n        // Elements are only equal if identical(expected, actual)\n        if (isElement(actualObj) || isElement(expectationObj)) {\n            return false;\n        }\n\n        var isActualDate = isDate(actualObj);\n        var isExpectationDate = isDate(expectationObj);\n        if (isActualDate || isExpectationDate) {\n            if (\n                !isActualDate ||\n                !isExpectationDate ||\n                getTime.call(actualObj) !== getTime.call(expectationObj)\n            ) {\n                return false;\n            }\n        }\n\n        if (actualObj instanceof RegExp && expectationObj instanceof RegExp) {\n            if (valueToString(actualObj) !== valueToString(expectationObj)) {\n                return false;\n            }\n        }\n\n        if (actualObj instanceof Error && expectationObj instanceof Error) {\n            return actualObj === expectationObj;\n        }\n\n        var actualClass = getClass(actualObj);\n        var expectationClass = getClass(expectationObj);\n        var actualKeys = keys(actualObj);\n        var expectationKeys = keys(expectationObj);\n        var actualName = getClassName(actualObj);\n        var expectationName = getClassName(expectationObj);\n        var expectationSymbols =\n            typeof getOwnPropertySymbols === \"function\"\n                ? getOwnPropertySymbols(expectationObj)\n                : [];\n        var expectationKeysAndSymbols = expectationKeys.concat(\n            expectationSymbols\n        );\n\n        if (isArguments(actualObj) || isArguments(expectationObj)) {\n            if (actualObj.length !== expectationObj.length) {\n                return false;\n            }\n        } else {\n            if (\n                actualType !== expectationType ||\n                actualClass !== expectationClass ||\n                actualKeys.length !== expectationKeys.length ||\n                (actualName &&\n                    expectationName &&\n                    actualName !== expectationName)\n            ) {\n                return false;\n            }\n        }\n\n        if (isSet(actualObj) || isSet(expectationObj)) {\n            if (\n                !isSet(actualObj) ||\n                !isSet(expectationObj) ||\n                actualObj.size !== expectationObj.size\n            ) {\n                return false;\n            }\n\n            return isSubset(actualObj, expectationObj, deepEqual);\n        }\n\n        return every.call(expectationKeysAndSymbols, function(key) {\n            if (!hasOwnProperty.call(actualObj, key)) {\n                return false;\n            }\n\n            var actualValue = actualObj[key];\n            var expectationValue = expectationObj[key];\n            var actualObject = isObject(actualValue);\n            var expectationObject = isObject(expectationValue);\n            // determines, if the objects were already visited\n            // (it's faster to check for isObject first, than to\n            // get -1 from getIndex for non objects)\n            var actualIndex = actualObject\n                ? indexOf.call(actualObjects, actualValue)\n                : -1;\n            var expectationIndex = expectationObject\n                ? indexOf.call(expectationObjects, expectationValue)\n                : -1;\n            // determines the new paths of the objects\n            // - for non cyclic objects the current path will be extended\n            //   by current property name\n            // - for cyclic objects the stored path is taken\n            var newActualPath =\n                actualIndex !== -1\n                    ? actualPaths[actualIndex]\n                    : actualPath + \"[\" + JSON.stringify(key) + \"]\";\n            var newExpectationPath =\n                expectationIndex !== -1\n                    ? expectationPaths[expectationIndex]\n                    : expectationPath + \"[\" + JSON.stringify(key) + \"]\";\n            var combinedPath = newActualPath + newExpectationPath;\n\n            // stop recursion if current objects are already compared\n            if (compared[combinedPath]) {\n                return true;\n            }\n\n            // remember the current objects and their paths\n            if (actualIndex === -1 && actualObject) {\n                actualObjects.push(actualValue);\n                actualPaths.push(newActualPath);\n            }\n            if (expectationIndex === -1 && expectationObject) {\n                expectationObjects.push(expectationValue);\n                expectationPaths.push(newExpectationPath);\n            }\n\n            // remember that the current objects are already compared\n            if (actualObject && expectationObject) {\n                compared[combinedPath] = true;\n            }\n\n            // End of cyclic logic\n\n            // neither actualValue nor expectationValue is a cycle\n            // continue with next level\n            return deepEqual(\n                actualValue,\n                expectationValue,\n                newActualPath,\n                newExpectationPath\n            );\n        });\n    })(actual, expectation, \"$1\", \"$2\");\n}\n\ndeepEqualCyclic.use = function(match) {\n    return function(a, b) {\n        return deepEqualCyclic(a, b, match);\n    };\n};\n\nmodule.exports = deepEqualCyclic;\n\n},{\"./get-class\":52,\"./get-class-name\":51,\"./identical\":53,\"./is-arguments\":54,\"./is-date\":55,\"./is-element\":56,\"./is-nan\":57,\"./is-object\":59,\"./is-set\":60,\"./is-subset\":61,\"@sinonjs/commons\":39}],51:[function(require,module,exports){\n\"use strict\";\n\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nvar re = /function (\\w+)\\s*\\(/;\n\nfunction getClassName(value) {\n    if (value.constructor && \"name\" in value.constructor) {\n        return value.constructor.name;\n    }\n\n    if (typeof value.constructor === \"function\") {\n        var match = valueToString(value.constructor).match(re);\n        if (match.length > 1) {\n            return match[1];\n        }\n    }\n\n    return null;\n}\n\nmodule.exports = getClassName;\n\n},{\"@sinonjs/commons\":39}],52:[function(require,module,exports){\n\"use strict\";\n\nvar o = Object.prototype;\n\nfunction getClass(value) {\n    // Returns the internal [[Class]] by calling Object.prototype.toString\n    // with the provided value as this. Return value is a string, naming the\n    // internal class, e.g. \"Array\"\n    return o.toString.call(value).split(/[ \\]]/)[1];\n}\n\nmodule.exports = getClass;\n\n},{}],53:[function(require,module,exports){\n\"use strict\";\n\nvar isNaN = require(\"./is-nan\");\nvar isNegZero = require(\"./is-neg-zero\");\n\n/**\n * @name samsam.equal\n * @param Object obj1\n * @param Object obj2\n *\n * Returns ``true`` if two objects are strictly equal. Compared to\n * ``===`` there are two exceptions:\n *\n *   - NaN is considered equal to NaN\n *   - -0 and +0 are not considered equal\n */\nfunction identical(obj1, obj2) {\n    if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {\n        return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);\n    }\n\n    return false;\n}\n\nmodule.exports = identical;\n\n},{\"./is-nan\":57,\"./is-neg-zero\":58}],54:[function(require,module,exports){\n\"use strict\";\n\nvar getClass = require(\"./get-class\");\n\n/**\n * @name samsam.isArguments\n * @param Object object\n *\n * Returns ``true`` if ``object`` is an ``arguments`` object,\n * ``false`` otherwise.\n */\nfunction isArguments(object) {\n    if (getClass(object) === \"Arguments\") {\n        return true;\n    }\n    if (\n        typeof object !== \"object\" ||\n        typeof object.length !== \"number\" ||\n        getClass(object) === \"Array\"\n    ) {\n        return false;\n    }\n    if (typeof object.callee === \"function\") {\n        return true;\n    }\n    try {\n        object[object.length] = 6;\n        delete object[object.length];\n    } catch (e) {\n        return true;\n    }\n    return false;\n}\n\nmodule.exports = isArguments;\n\n},{\"./get-class\":52}],55:[function(require,module,exports){\n\"use strict\";\n\nfunction isDate(value) {\n    return value instanceof Date;\n}\n\nmodule.exports = isDate;\n\n},{}],56:[function(require,module,exports){\n\"use strict\";\n\nvar div = typeof document !== \"undefined\" && document.createElement(\"div\");\n\n/**\n * @name samsam.isElement\n * @param Object object\n *\n * Returns ``true`` if ``object`` is a DOM element node. Unlike\n * Underscore.js/lodash, this function will return ``false`` if ``object``\n * is an *element-like* object, i.e. a regular object with a ``nodeType``\n * property that holds the value ``1``.\n */\nfunction isElement(object) {\n    if (!object || object.nodeType !== 1 || !div) {\n        return false;\n    }\n    try {\n        object.appendChild(div);\n        object.removeChild(div);\n    } catch (e) {\n        return false;\n    }\n    return true;\n}\n\nmodule.exports = isElement;\n\n},{}],57:[function(require,module,exports){\n\"use strict\";\n\nfunction isNaN(value) {\n    // Unlike global isNaN, this avoids type coercion\n    // typeof check avoids IE host object issues, hat tip to\n    // lodash\n    var val = value; // JsLint thinks value !== value is \"weird\"\n    return typeof value === \"number\" && value !== val;\n}\n\nmodule.exports = isNaN;\n\n},{}],58:[function(require,module,exports){\n\"use strict\";\n\n/**\n * @name samsam.isNegZero\n * @param Object value\n *\n * Returns ``true`` if ``value`` is ``-0``.\n */\nfunction isNegZero(value) {\n    return value === 0 && 1 / value === -Infinity;\n}\n\nmodule.exports = isNegZero;\n\n},{}],59:[function(require,module,exports){\n\"use strict\";\n\n// Returns true when the value is a regular Object and not a specialized Object\n//\n// This helps speeding up deepEqual cyclic checks\n// The premise is that only Objects are stored in the visited array.\n// So if this function returns false, we don't have to do the\n// expensive operation of searching for the value in the the array of already\n// visited objects\nfunction isObject(value) {\n    return (\n        typeof value === \"object\" &&\n        value !== null &&\n        // none of these are collection objects, so we can return false\n        !(value instanceof Boolean) &&\n        !(value instanceof Date) &&\n        !(value instanceof Error) &&\n        !(value instanceof Number) &&\n        !(value instanceof RegExp) &&\n        !(value instanceof String)\n    );\n}\n\nmodule.exports = isObject;\n\n},{}],60:[function(require,module,exports){\n\"use strict\";\n\nfunction isSet(val) {\n    return (typeof Set !== \"undefined\" && val instanceof Set) || false;\n}\n\nmodule.exports = isSet;\n\n},{}],61:[function(require,module,exports){\n\"use strict\";\n\nfunction isSubset(s1, s2, compare) {\n    var allContained = true;\n    s1.forEach(function(v1) {\n        var includes = false;\n        s2.forEach(function(v2) {\n            if (compare(v2, v1)) {\n                includes = true;\n            }\n        });\n        allContained = allContained && includes;\n    });\n\n    return allContained;\n}\n\nmodule.exports = isSubset;\n\n},{}],62:[function(require,module,exports){\n\"use strict\";\n\nvar slice = require(\"@sinonjs/commons\").prototypes.string.slice;\nvar typeOf = require(\"@sinonjs/commons\").typeOf;\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nmodule.exports = function iterableToString(obj) {\n    var representation = \"\";\n\n    function stringify(item) {\n        return typeof item === \"string\"\n            ? \"'\" + item + \"'\"\n            : valueToString(item);\n    }\n\n    function mapToString(map) {\n        /* eslint-disable-next-line local-rules/no-prototype-methods */\n        map.forEach(function(value, key) {\n            representation +=\n                \"[\" + stringify(key) + \",\" + stringify(value) + \"],\";\n        });\n\n        representation = slice(representation, 0, -1);\n        return representation;\n    }\n\n    function genericIterableToString(iterable) {\n        /* eslint-disable-next-line local-rules/no-prototype-methods */\n        iterable.forEach(function(value) {\n            representation += stringify(value) + \",\";\n        });\n\n        representation = slice(representation, 0, -1);\n        return representation;\n    }\n\n    if (typeOf(obj) === \"map\") {\n        return mapToString(obj);\n    }\n\n    return genericIterableToString(obj);\n};\n\n},{\"@sinonjs/commons\":39}],63:[function(require,module,exports){\n\"use strict\";\n\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nvar deepEqual = require(\"./deep-equal\").use(match); // eslint-disable-line no-use-before-define\nvar getClass = require(\"./get-class\");\nvar isDate = require(\"./is-date\");\nvar isSet = require(\"./is-set\");\nvar isSubset = require(\"./is-subset\");\nvar createMatcher = require(\"./matcher\");\n\nfunction arrayContains(array, subset, compare) {\n    if (subset.length === 0) {\n        return true;\n    }\n    var i, l, j, k;\n    for (i = 0, l = array.length; i < l; ++i) {\n        if (compare(array[i], subset[0])) {\n            for (j = 0, k = subset.length; j < k; ++j) {\n                if (i + j >= l) {\n                    return false;\n                }\n                if (!compare(array[i + j], subset[j])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n    return false;\n}\n\n/**\n * @name samsam.match\n * @param Object object\n * @param Object matcher\n *\n * Compare arbitrary value ``object`` with matcher.\n */\nfunction match(object, matcher) {\n    if (matcher && typeof matcher.test === \"function\") {\n        return matcher.test(object);\n    }\n\n    if (typeof matcher === \"function\") {\n        return matcher(object) === true;\n    }\n\n    if (typeof matcher === \"string\") {\n        matcher = matcher.toLowerCase();\n        var notNull = typeof object === \"string\" || !!object;\n        return (\n            notNull &&\n            valueToString(object)\n                .toLowerCase()\n                .indexOf(matcher) >= 0\n        );\n    }\n\n    if (typeof matcher === \"number\") {\n        return matcher === object;\n    }\n\n    if (typeof matcher === \"boolean\") {\n        return matcher === object;\n    }\n\n    if (typeof matcher === \"undefined\") {\n        return typeof object === \"undefined\";\n    }\n\n    if (matcher === null) {\n        return object === null;\n    }\n\n    if (object === null) {\n        return false;\n    }\n\n    if (isSet(object)) {\n        return isSubset(matcher, object, match);\n    }\n\n    if (getClass(object) === \"Array\" && getClass(matcher) === \"Array\") {\n        return arrayContains(object, matcher, match);\n    }\n\n    if (isDate(matcher)) {\n        return isDate(object) && object.getTime() === matcher.getTime();\n    }\n\n    if (matcher && typeof matcher === \"object\") {\n        if (matcher === object) {\n            return true;\n        }\n        if (typeof object !== \"object\") {\n            return false;\n        }\n        var prop;\n        // eslint-disable-next-line guard-for-in\n        for (prop in matcher) {\n            var value = object[prop];\n            if (\n                typeof value === \"undefined\" &&\n                typeof object.getAttribute === \"function\"\n            ) {\n                value = object.getAttribute(prop);\n            }\n            if (\n                matcher[prop] === null ||\n                typeof matcher[prop] === \"undefined\"\n            ) {\n                if (value !== matcher[prop]) {\n                    return false;\n                }\n            } else if (\n                typeof value === \"undefined\" ||\n                !deepEqual(value, matcher[prop])\n            ) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    throw new Error(\n        \"Matcher was not a string, a number, a \" +\n            \"function, a boolean or an object\"\n    );\n}\n\nObject.keys(createMatcher).forEach(function(key) {\n    match[key] = createMatcher[key];\n});\n\nmodule.exports = match;\n\n},{\"./deep-equal\":50,\"./get-class\":52,\"./is-date\":55,\"./is-set\":60,\"./is-subset\":61,\"./matcher\":64,\"@sinonjs/commons\":39}],64:[function(require,module,exports){\n\"use strict\";\n\nvar arrayProto = require(\"@sinonjs/commons\").prototypes.array;\nvar deepEqual = require(\"./deep-equal\").use(match); // eslint-disable-line no-use-before-define\nvar every = require(\"@sinonjs/commons\").every;\nvar functionName = require(\"@sinonjs/commons\").functionName;\nvar get = require(\"lodash\").get;\nvar iterableToString = require(\"./iterable-to-string\");\nvar objectProto = require(\"@sinonjs/commons\").prototypes.object;\nvar stringProto = require(\"@sinonjs/commons\").prototypes.string;\nvar typeOf = require(\"@sinonjs/commons\").typeOf;\nvar valueToString = require(\"@sinonjs/commons\").valueToString;\n\nvar arrayIndexOf = arrayProto.indexOf;\nvar arrayEvery = arrayProto.every;\nvar join = arrayProto.join;\nvar map = arrayProto.map;\nvar some = arrayProto.some;\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\nvar isPrototypeOf = objectProto.isPrototypeOf;\n\nvar stringIndexOf = stringProto.indexOf;\n\nfunction assertType(value, type, name) {\n    var actual = typeOf(value);\n    if (actual !== type) {\n        throw new TypeError(\n            \"Expected type of \" +\n                name +\n                \" to be \" +\n                type +\n                \", but was \" +\n                actual\n        );\n    }\n}\n\nfunction assertMethodExists(value, method, name, methodPath) {\n    if (value[method] == null) {\n        throw new TypeError(\n            \"Expected \" + name + \" to have method \" + methodPath\n        );\n    }\n}\n\nvar matcher = {\n    toString: function() {\n        return this.message;\n    }\n};\n\nfunction isMatcher(object) {\n    return isPrototypeOf(matcher, object);\n}\n\nfunction matchObject(actual, expectation) {\n    if (actual === null || actual === undefined) {\n        return false;\n    }\n\n    return arrayEvery(Object.keys(expectation), function(key) {\n        var exp = expectation[key];\n        var act = actual[key];\n\n        if (isMatcher(exp)) {\n            if (!exp.test(act)) {\n                return false;\n            }\n        } else if (typeOf(exp) === \"object\") {\n            if (!matchObject(act, exp)) {\n                return false;\n            }\n        } else if (!deepEqual(act, exp)) {\n            return false;\n        }\n\n        return true;\n    });\n}\n\nvar TYPE_MAP = {\n    function: function(m, expectation, message) {\n        m.test = expectation;\n        m.message = message || \"match(\" + functionName(expectation) + \")\";\n    },\n    number: function(m, expectation) {\n        m.test = function(actual) {\n            // we need type coercion here\n            return expectation == actual; // eslint-disable-line eqeqeq\n        };\n    },\n    object: function(m, expectation) {\n        var array = [];\n\n        if (typeof expectation.test === \"function\") {\n            m.test = function(actual) {\n                return expectation.test(actual) === true;\n            };\n            m.message = \"match(\" + functionName(expectation.test) + \")\";\n            return m;\n        }\n\n        array = map(Object.keys(expectation), function(key) {\n            return key + \": \" + valueToString(expectation[key]);\n        });\n\n        m.test = function(actual) {\n            return matchObject(actual, expectation);\n        };\n        m.message = \"match(\" + join(array, \", \") + \")\";\n\n        return m;\n    },\n    regexp: function(m, expectation) {\n        m.test = function(actual) {\n            return typeof actual === \"string\" && expectation.test(actual);\n        };\n    },\n    string: function(m, expectation) {\n        m.test = function(actual) {\n            return (\n                typeof actual === \"string\" &&\n                stringIndexOf(actual, expectation) !== -1\n            );\n        };\n        m.message = 'match(\"' + expectation + '\")';\n    }\n};\n\nfunction match(expectation, message) {\n    var m = Object.create(matcher);\n    var type = typeOf(expectation);\n\n    if (message !== undefined && typeof message !== \"string\") {\n        throw new TypeError(\"Message should be a string\");\n    }\n\n    if (arguments.length > 2) {\n        throw new TypeError(\n            \"Expected 1 or 2 arguments, received \" + arguments.length\n        );\n    }\n\n    if (type in TYPE_MAP) {\n        TYPE_MAP[type](m, expectation, message);\n    } else {\n        m.test = function(actual) {\n            return deepEqual(actual, expectation);\n        };\n    }\n\n    if (!m.message) {\n        m.message = \"match(\" + valueToString(expectation) + \")\";\n    }\n\n    return m;\n}\n\nmatcher.or = function(m2) {\n    if (!arguments.length) {\n        throw new TypeError(\"Matcher expected\");\n    } else if (!isMatcher(m2)) {\n        m2 = match(m2);\n    }\n    var m1 = this;\n    var or = Object.create(matcher);\n    or.test = function(actual) {\n        return m1.test(actual) || m2.test(actual);\n    };\n    or.message = m1.message + \".or(\" + m2.message + \")\";\n    return or;\n};\n\nmatcher.and = function(m2) {\n    if (!arguments.length) {\n        throw new TypeError(\"Matcher expected\");\n    } else if (!isMatcher(m2)) {\n        m2 = match(m2);\n    }\n    var m1 = this;\n    var and = Object.create(matcher);\n    and.test = function(actual) {\n        return m1.test(actual) && m2.test(actual);\n    };\n    and.message = m1.message + \".and(\" + m2.message + \")\";\n    return and;\n};\n\nmatch.isMatcher = isMatcher;\n\nmatch.any = match(function() {\n    return true;\n}, \"any\");\n\nmatch.defined = match(function(actual) {\n    return actual !== null && actual !== undefined;\n}, \"defined\");\n\nmatch.truthy = match(function(actual) {\n    return !!actual;\n}, \"truthy\");\n\nmatch.falsy = match(function(actual) {\n    return !actual;\n}, \"falsy\");\n\nmatch.same = function(expectation) {\n    return match(function(actual) {\n        return expectation === actual;\n    }, \"same(\" + valueToString(expectation) + \")\");\n};\n\nmatch.in = function(arrayOfExpectations) {\n    if (typeOf(arrayOfExpectations) !== \"array\") {\n        throw new TypeError(\"array expected\");\n    }\n\n    return match(function(actual) {\n        return some(arrayOfExpectations, function(expectation) {\n            return expectation === actual;\n        });\n    }, \"in(\" + valueToString(arrayOfExpectations) + \")\");\n};\n\nmatch.typeOf = function(type) {\n    assertType(type, \"string\", \"type\");\n    return match(function(actual) {\n        return typeOf(actual) === type;\n    }, 'typeOf(\"' + type + '\")');\n};\n\nmatch.instanceOf = function(type) {\n    if (\n        typeof Symbol === \"undefined\" ||\n        typeof Symbol.hasInstance === \"undefined\"\n    ) {\n        assertType(type, \"function\", \"type\");\n    } else {\n        assertMethodExists(\n            type,\n            Symbol.hasInstance,\n            \"type\",\n            \"[Symbol.hasInstance]\"\n        );\n    }\n    return match(function(actual) {\n        return actual instanceof type;\n    }, \"instanceOf(\" +\n        (functionName(type) || Object.prototype.toString.call(type)) +\n        \")\");\n};\n\nfunction createPropertyMatcher(propertyTest, messagePrefix) {\n    return function(property, value) {\n        assertType(property, \"string\", \"property\");\n        var onlyProperty = arguments.length === 1;\n        var message = messagePrefix + '(\"' + property + '\"';\n        if (!onlyProperty) {\n            message += \", \" + valueToString(value);\n        }\n        message += \")\";\n        return match(function(actual) {\n            if (\n                actual === undefined ||\n                actual === null ||\n                !propertyTest(actual, property)\n            ) {\n                return false;\n            }\n            return onlyProperty || deepEqual(actual[property], value);\n        }, message);\n    };\n}\n\nmatch.has = createPropertyMatcher(function(actual, property) {\n    if (typeof actual === \"object\") {\n        return property in actual;\n    }\n    return actual[property] !== undefined;\n}, \"has\");\n\nmatch.hasOwn = createPropertyMatcher(function(actual, property) {\n    return hasOwnProperty(actual, property);\n}, \"hasOwn\");\n\nmatch.hasNested = function(property, value) {\n    assertType(property, \"string\", \"property\");\n    var onlyProperty = arguments.length === 1;\n    var message = 'hasNested(\"' + property + '\"';\n    if (!onlyProperty) {\n        message += \", \" + valueToString(value);\n    }\n    message += \")\";\n    return match(function(actual) {\n        if (\n            actual === undefined ||\n            actual === null ||\n            get(actual, property) === undefined\n        ) {\n            return false;\n        }\n        return onlyProperty || deepEqual(get(actual, property), value);\n    }, message);\n};\n\nmatch.every = function(predicate) {\n    if (!isMatcher(predicate)) {\n        throw new TypeError(\"Matcher expected\");\n    }\n\n    return match(function(actual) {\n        if (typeOf(actual) === \"object\") {\n            return every(Object.keys(actual), function(key) {\n                return predicate.test(actual[key]);\n            });\n        }\n\n        return (\n            !!actual &&\n            typeOf(actual.forEach) === \"function\" &&\n            every(actual, function(element) {\n                return predicate.test(element);\n            })\n        );\n    }, \"every(\" + predicate.message + \")\");\n};\n\nmatch.some = function(predicate) {\n    if (!isMatcher(predicate)) {\n        throw new TypeError(\"Matcher expected\");\n    }\n\n    return match(function(actual) {\n        if (typeOf(actual) === \"object\") {\n            return !every(Object.keys(actual), function(key) {\n                return !predicate.test(actual[key]);\n            });\n        }\n\n        return (\n            !!actual &&\n            typeOf(actual.forEach) === \"function\" &&\n            !every(actual, function(element) {\n                return !predicate.test(element);\n            })\n        );\n    }, \"some(\" + predicate.message + \")\");\n};\n\nmatch.array = match.typeOf(\"array\");\n\nmatch.array.deepEquals = function(expectation) {\n    return match(function(actual) {\n        // Comparing lengths is the fastest way to spot a difference before iterating through every item\n        var sameLength = actual.length === expectation.length;\n        return (\n            typeOf(actual) === \"array\" &&\n            sameLength &&\n            every(actual, function(element, index) {\n                var expected = expectation[index];\n                return typeOf(expected) === \"array\" &&\n                    typeOf(element) === \"array\"\n                    ? match.array.deepEquals(expected).test(element)\n                    : deepEqual(expected, element);\n            })\n        );\n    }, \"deepEquals([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.array.startsWith = function(expectation) {\n    return match(function(actual) {\n        return (\n            typeOf(actual) === \"array\" &&\n            every(expectation, function(expectedElement, index) {\n                return actual[index] === expectedElement;\n            })\n        );\n    }, \"startsWith([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.array.endsWith = function(expectation) {\n    return match(function(actual) {\n        // This indicates the index in which we should start matching\n        var offset = actual.length - expectation.length;\n\n        return (\n            typeOf(actual) === \"array\" &&\n            every(expectation, function(expectedElement, index) {\n                return actual[offset + index] === expectedElement;\n            })\n        );\n    }, \"endsWith([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.array.contains = function(expectation) {\n    return match(function(actual) {\n        return (\n            typeOf(actual) === \"array\" &&\n            every(expectation, function(expectedElement) {\n                return arrayIndexOf(actual, expectedElement) !== -1;\n            })\n        );\n    }, \"contains([\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.map = match.typeOf(\"map\");\n\nmatch.map.deepEquals = function mapDeepEquals(expectation) {\n    return match(function(actual) {\n        // Comparing lengths is the fastest way to spot a difference before iterating through every item\n        var sameLength = actual.size === expectation.size;\n        return (\n            typeOf(actual) === \"map\" &&\n            sameLength &&\n            every(actual, function(element, key) {\n                return expectation.has(key) && expectation.get(key) === element;\n            })\n        );\n    }, \"deepEquals(Map[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.map.contains = function mapContains(expectation) {\n    return match(function(actual) {\n        return (\n            typeOf(actual) === \"map\" &&\n            every(expectation, function(element, key) {\n                return actual.has(key) && actual.get(key) === element;\n            })\n        );\n    }, \"contains(Map[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.set = match.typeOf(\"set\");\n\nmatch.set.deepEquals = function setDeepEquals(expectation) {\n    return match(function(actual) {\n        // Comparing lengths is the fastest way to spot a difference before iterating through every item\n        var sameLength = actual.size === expectation.size;\n        return (\n            typeOf(actual) === \"set\" &&\n            sameLength &&\n            every(actual, function(element) {\n                return expectation.has(element);\n            })\n        );\n    }, \"deepEquals(Set[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.set.contains = function setContains(expectation) {\n    return match(function(actual) {\n        return (\n            typeOf(actual) === \"set\" &&\n            every(expectation, function(element) {\n                return actual.has(element);\n            })\n        );\n    }, \"contains(Set[\" + iterableToString(expectation) + \"])\");\n};\n\nmatch.bool = match.typeOf(\"boolean\");\nmatch.number = match.typeOf(\"number\");\nmatch.string = match.typeOf(\"string\");\nmatch.object = match.typeOf(\"object\");\nmatch.func = match.typeOf(\"function\");\nmatch.regexp = match.typeOf(\"regexp\");\nmatch.date = match.typeOf(\"date\");\nmatch.symbol = match.typeOf(\"symbol\");\n\nmodule.exports = match;\n\n},{\"./deep-equal\":50,\"./iterable-to-string\":62,\"@sinonjs/commons\":39,\"lodash\":72}],65:[function(require,module,exports){\n\"use strict\";\n\nvar identical = require(\"./identical\");\nvar isArguments = require(\"./is-arguments\");\nvar isElement = require(\"./is-element\");\nvar isNegZero = require(\"./is-neg-zero\");\nvar isSet = require(\"./is-set\");\nvar match = require(\"./match\");\nvar deepEqualCyclic = require(\"./deep-equal\").use(match);\nvar createMatcher = require(\"./matcher\");\n\nmodule.exports = {\n    createMatcher: createMatcher,\n    deepEqual: deepEqualCyclic,\n    identical: identical,\n    isArguments: isArguments,\n    isElement: isElement,\n    isNegZero: isNegZero,\n    isSet: isSet,\n    match: match\n};\n\n},{\"./deep-equal\":50,\"./identical\":53,\"./is-arguments\":54,\"./is-element\":56,\"./is-neg-zero\":58,\"./is-set\":60,\"./match\":63,\"./matcher\":64}],66:[function(require,module,exports){\n// This is free and unencumbered software released into the public domain.\n// See LICENSE.md for more information.\n\nvar encoding = require(\"./lib/encoding.js\");\n\nmodule.exports = {\n  TextEncoder: encoding.TextEncoder,\n  TextDecoder: encoding.TextDecoder,\n};\n\n},{\"./lib/encoding.js\":68}],67:[function(require,module,exports){\n(function(global) {\n  'use strict';\n\n  if (typeof module !== \"undefined\" && module.exports) {\n    module.exports = global;\n  }\n\n  global[\"encoding-indexes\"] =\n{\n  \"big5\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188],\n  \"euc-kr\":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"gb18030\":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565],\n  \"gb18030-ranges\":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]],\n  \"jis0208\":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"jis0212\":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"ibm866\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160],\n  \"iso-8859-2\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n  \"iso-8859-3\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729],\n  \"iso-8859-4\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729],\n  \"iso-8859-5\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119],\n  \"iso-8859-6\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null],\n  \"iso-8859-7\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n  \"iso-8859-8\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n  \"iso-8859-10\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312],\n  \"iso-8859-13\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217],\n  \"iso-8859-14\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255],\n  \"iso-8859-15\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n  \"iso-8859-16\":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255],\n  \"koi8-r\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n  \"koi8-u\":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],\n  \"macintosh\":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711],\n  \"windows-874\":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null],\n  \"windows-1250\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],\n  \"windows-1251\":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103],\n  \"windows-1252\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],\n  \"windows-1253\":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],\n  \"windows-1254\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255],\n  \"windows-1255\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],\n  \"windows-1256\":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746],\n  \"windows-1257\":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729],\n  \"windows-1258\":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255],\n  \"x-mac-cyrillic\":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364]\n};\n\n// For strict environments where `this` inside the global scope\n// is `undefined`, take a pure object instead\n}(this || {}));\n},{}],68:[function(require,module,exports){\n// This is free and unencumbered software released into the public domain.\n// See LICENSE.md for more information.\n\n/**\n * @fileoverview Global |this| required for resolving indexes in node.\n * @suppress {globalThis}\n */\n(function(global) {\n  'use strict';\n\n  // If we're in node require encoding-indexes and attach it to the global.\n  if (typeof module !== \"undefined\" && module.exports &&\n    !global[\"encoding-indexes\"]) {\n    global[\"encoding-indexes\"] =\n      require(\"./encoding-indexes.js\")[\"encoding-indexes\"];\n  }\n\n  //\n  // Utilities\n  //\n\n  /**\n   * @param {number} a The number to test.\n   * @param {number} min The minimum value in the range, inclusive.\n   * @param {number} max The maximum value in the range, inclusive.\n   * @return {boolean} True if a >= min and a <= max.\n   */\n  function inRange(a, min, max) {\n    return min <= a && a <= max;\n  }\n\n  /**\n   * @param {!Array.<*>} array The array to check.\n   * @param {*} item The item to look for in the array.\n   * @return {boolean} True if the item appears in the array.\n   */\n  function includes(array, item) {\n    return array.indexOf(item) !== -1;\n  }\n\n  var floor = Math.floor;\n\n  /**\n   * @param {*} o\n   * @return {Object}\n   */\n  function ToDictionary(o) {\n    if (o === undefined) return {};\n    if (o === Object(o)) return o;\n    throw TypeError('Could not convert argument to dictionary');\n  }\n\n  /**\n   * @param {string} string Input string of UTF-16 code units.\n   * @return {!Array.<number>} Code points.\n   */\n  function stringToCodePoints(string) {\n    // https://heycam.github.io/webidl/#dfn-obtain-unicode\n\n    // 1. Let S be the DOMString value.\n    var s = String(string);\n\n    // 2. Let n be the length of S.\n    var n = s.length;\n\n    // 3. Initialize i to 0.\n    var i = 0;\n\n    // 4. Initialize U to be an empty sequence of Unicode characters.\n    var u = [];\n\n    // 5. While i < n:\n    while (i < n) {\n\n      // 1. Let c be the code unit in S at index i.\n      var c = s.charCodeAt(i);\n\n      // 2. Depending on the value of c:\n\n      // c < 0xD800 or c > 0xDFFF\n      if (c < 0xD800 || c > 0xDFFF) {\n        // Append to U the Unicode character with code point c.\n        u.push(c);\n      }\n\n      // 0xDC00 ≤ c ≤ 0xDFFF\n      else if (0xDC00 <= c && c <= 0xDFFF) {\n        // Append to U a U+FFFD REPLACEMENT CHARACTER.\n        u.push(0xFFFD);\n      }\n\n      // 0xD800 ≤ c ≤ 0xDBFF\n      else if (0xD800 <= c && c <= 0xDBFF) {\n        // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT\n        // CHARACTER.\n        if (i === n - 1) {\n          u.push(0xFFFD);\n        }\n        // 2. Otherwise, i < n−1:\n        else {\n          // 1. Let d be the code unit in S at index i+1.\n          var d = s.charCodeAt(i + 1);\n\n          // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then:\n          if (0xDC00 <= d && d <= 0xDFFF) {\n            // 1. Let a be c & 0x3FF.\n            var a = c & 0x3FF;\n\n            // 2. Let b be d & 0x3FF.\n            var b = d & 0x3FF;\n\n            // 3. Append to U the Unicode character with code point\n            // 2^16+2^10*a+b.\n            u.push(0x10000 + (a << 10) + b);\n\n            // 4. Set i to i+1.\n            i += 1;\n          }\n\n          // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a\n          // U+FFFD REPLACEMENT CHARACTER.\n          else  {\n            u.push(0xFFFD);\n          }\n        }\n      }\n\n      // 3. Set i to i+1.\n      i += 1;\n    }\n\n    // 6. Return U.\n    return u;\n  }\n\n  /**\n   * @param {!Array.<number>} code_points Array of code points.\n   * @return {string} string String of UTF-16 code units.\n   */\n  function codePointsToString(code_points) {\n    var s = '';\n    for (var i = 0; i < code_points.length; ++i) {\n      var cp = code_points[i];\n      if (cp <= 0xFFFF) {\n        s += String.fromCharCode(cp);\n      } else {\n        cp -= 0x10000;\n        s += String.fromCharCode((cp >> 10) + 0xD800,\n                                 (cp & 0x3FF) + 0xDC00);\n      }\n    }\n    return s;\n  }\n\n\n  //\n  // Implementation of Encoding specification\n  // https://encoding.spec.whatwg.org/\n  //\n\n  //\n  // 4. Terminology\n  //\n\n  /**\n   * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive.\n   * @param {number} a The number to test.\n   * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive.\n   */\n  function isASCIIByte(a) {\n    return 0x00 <= a && a <= 0x7F;\n  }\n\n  /**\n   * An ASCII code point is a code point in the range U+0000 to\n   * U+007F, inclusive.\n   */\n  var isASCIICodePoint = isASCIIByte;\n\n\n  /**\n   * End-of-stream is a special token that signifies no more tokens\n   * are in the stream.\n   * @const\n   */ var end_of_stream = -1;\n\n  /**\n   * A stream represents an ordered sequence of tokens.\n   *\n   * @constructor\n   * @param {!(Array.<number>|Uint8Array)} tokens Array of tokens that provide\n   * the stream.\n   */\n  function Stream(tokens) {\n    /** @type {!Array.<number>} */\n    this.tokens = [].slice.call(tokens);\n    // Reversed as push/pop is more efficient than shift/unshift.\n    this.tokens.reverse();\n  }\n\n  Stream.prototype = {\n    /**\n     * @return {boolean} True if end-of-stream has been hit.\n     */\n    endOfStream: function() {\n      return !this.tokens.length;\n    },\n\n    /**\n     * When a token is read from a stream, the first token in the\n     * stream must be returned and subsequently removed, and\n     * end-of-stream must be returned otherwise.\n     *\n     * @return {number} Get the next token from the stream, or\n     * end_of_stream.\n     */\n     read: function() {\n      if (!this.tokens.length)\n        return end_of_stream;\n       return this.tokens.pop();\n     },\n\n    /**\n     * When one or more tokens are prepended to a stream, those tokens\n     * must be inserted, in given order, before the first token in the\n     * stream.\n     *\n     * @param {(number|!Array.<number>)} token The token(s) to prepend to the\n     * stream.\n     */\n    prepend: function(token) {\n      if (Array.isArray(token)) {\n        var tokens = /**@type {!Array.<number>}*/(token);\n        while (tokens.length)\n          this.tokens.push(tokens.pop());\n      } else {\n        this.tokens.push(token);\n      }\n    },\n\n    /**\n     * When one or more tokens are pushed to a stream, those tokens\n     * must be inserted, in given order, after the last token in the\n     * stream.\n     *\n     * @param {(number|!Array.<number>)} token The tokens(s) to push to the\n     * stream.\n     */\n    push: function(token) {\n      if (Array.isArray(token)) {\n        var tokens = /**@type {!Array.<number>}*/(token);\n        while (tokens.length)\n          this.tokens.unshift(tokens.shift());\n      } else {\n        this.tokens.unshift(token);\n      }\n    }\n  };\n\n  //\n  // 5. Encodings\n  //\n\n  // 5.1 Encoders and decoders\n\n  /** @const */\n  var finished = -1;\n\n  /**\n   * @param {boolean} fatal If true, decoding errors raise an exception.\n   * @param {number=} opt_code_point Override the standard fallback code point.\n   * @return {number} The code point to insert on a decoding error.\n   */\n  function decoderError(fatal, opt_code_point) {\n    if (fatal)\n      throw TypeError('Decoder error');\n    return opt_code_point || 0xFFFD;\n  }\n\n  /**\n   * @param {number} code_point The code point that could not be encoded.\n   * @return {number} Always throws, no value is actually returned.\n   */\n  function encoderError(code_point) {\n    throw TypeError('The code point ' + code_point + ' could not be encoded.');\n  }\n\n  /** @interface */\n  function Decoder() {}\n  Decoder.prototype = {\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point, or |finished|.\n     */\n    handler: function(stream, bite) {}\n  };\n\n  /** @interface */\n  function Encoder() {}\n  Encoder.prototype = {\n    /**\n     * @param {Stream} stream The stream of code points being encoded.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit, or |finished|.\n     */\n    handler: function(stream, code_point) {}\n  };\n\n  // 5.2 Names and labels\n\n  // TODO: Define @typedef for Encoding: {name:string,labels:Array.<string>}\n  // https://github.com/google/closure-compiler/issues/247\n\n  /**\n   * @param {string} label The encoding label.\n   * @return {?{name:string,labels:Array.<string>}}\n   */\n  function getEncoding(label) {\n    // 1. Remove any leading and trailing ASCII whitespace from label.\n    label = String(label).trim().toLowerCase();\n\n    // 2. If label is an ASCII case-insensitive match for any of the\n    // labels listed in the table below, return the corresponding\n    // encoding, and failure otherwise.\n    if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {\n      return label_to_encoding[label];\n    }\n    return null;\n  }\n\n  /**\n   * Encodings table: https://encoding.spec.whatwg.org/encodings.json\n   * @const\n   * @type {!Array.<{\n   *          heading: string,\n   *          encodings: Array.<{name:string,labels:Array.<string>}>\n   *        }>}\n   */\n  var encodings = [\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"unicode-1-1-utf-8\",\n            \"utf-8\",\n            \"utf8\"\n          ],\n          \"name\": \"UTF-8\"\n        }\n      ],\n      \"heading\": \"The Encoding\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"866\",\n            \"cp866\",\n            \"csibm866\",\n            \"ibm866\"\n          ],\n          \"name\": \"IBM866\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin2\",\n            \"iso-8859-2\",\n            \"iso-ir-101\",\n            \"iso8859-2\",\n            \"iso88592\",\n            \"iso_8859-2\",\n            \"iso_8859-2:1987\",\n            \"l2\",\n            \"latin2\"\n          ],\n          \"name\": \"ISO-8859-2\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin3\",\n            \"iso-8859-3\",\n            \"iso-ir-109\",\n            \"iso8859-3\",\n            \"iso88593\",\n            \"iso_8859-3\",\n            \"iso_8859-3:1988\",\n            \"l3\",\n            \"latin3\"\n          ],\n          \"name\": \"ISO-8859-3\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin4\",\n            \"iso-8859-4\",\n            \"iso-ir-110\",\n            \"iso8859-4\",\n            \"iso88594\",\n            \"iso_8859-4\",\n            \"iso_8859-4:1988\",\n            \"l4\",\n            \"latin4\"\n          ],\n          \"name\": \"ISO-8859-4\"\n        },\n        {\n          \"labels\": [\n            \"csisolatincyrillic\",\n            \"cyrillic\",\n            \"iso-8859-5\",\n            \"iso-ir-144\",\n            \"iso8859-5\",\n            \"iso88595\",\n            \"iso_8859-5\",\n            \"iso_8859-5:1988\"\n          ],\n          \"name\": \"ISO-8859-5\"\n        },\n        {\n          \"labels\": [\n            \"arabic\",\n            \"asmo-708\",\n            \"csiso88596e\",\n            \"csiso88596i\",\n            \"csisolatinarabic\",\n            \"ecma-114\",\n            \"iso-8859-6\",\n            \"iso-8859-6-e\",\n            \"iso-8859-6-i\",\n            \"iso-ir-127\",\n            \"iso8859-6\",\n            \"iso88596\",\n            \"iso_8859-6\",\n            \"iso_8859-6:1987\"\n          ],\n          \"name\": \"ISO-8859-6\"\n        },\n        {\n          \"labels\": [\n            \"csisolatingreek\",\n            \"ecma-118\",\n            \"elot_928\",\n            \"greek\",\n            \"greek8\",\n            \"iso-8859-7\",\n            \"iso-ir-126\",\n            \"iso8859-7\",\n            \"iso88597\",\n            \"iso_8859-7\",\n            \"iso_8859-7:1987\",\n            \"sun_eu_greek\"\n          ],\n          \"name\": \"ISO-8859-7\"\n        },\n        {\n          \"labels\": [\n            \"csiso88598e\",\n            \"csisolatinhebrew\",\n            \"hebrew\",\n            \"iso-8859-8\",\n            \"iso-8859-8-e\",\n            \"iso-ir-138\",\n            \"iso8859-8\",\n            \"iso88598\",\n            \"iso_8859-8\",\n            \"iso_8859-8:1988\",\n            \"visual\"\n          ],\n          \"name\": \"ISO-8859-8\"\n        },\n        {\n          \"labels\": [\n            \"csiso88598i\",\n            \"iso-8859-8-i\",\n            \"logical\"\n          ],\n          \"name\": \"ISO-8859-8-I\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin6\",\n            \"iso-8859-10\",\n            \"iso-ir-157\",\n            \"iso8859-10\",\n            \"iso885910\",\n            \"l6\",\n            \"latin6\"\n          ],\n          \"name\": \"ISO-8859-10\"\n        },\n        {\n          \"labels\": [\n            \"iso-8859-13\",\n            \"iso8859-13\",\n            \"iso885913\"\n          ],\n          \"name\": \"ISO-8859-13\"\n        },\n        {\n          \"labels\": [\n            \"iso-8859-14\",\n            \"iso8859-14\",\n            \"iso885914\"\n          ],\n          \"name\": \"ISO-8859-14\"\n        },\n        {\n          \"labels\": [\n            \"csisolatin9\",\n            \"iso-8859-15\",\n            \"iso8859-15\",\n            \"iso885915\",\n            \"iso_8859-15\",\n            \"l9\"\n          ],\n          \"name\": \"ISO-8859-15\"\n        },\n        {\n          \"labels\": [\n            \"iso-8859-16\"\n          ],\n          \"name\": \"ISO-8859-16\"\n        },\n        {\n          \"labels\": [\n            \"cskoi8r\",\n            \"koi\",\n            \"koi8\",\n            \"koi8-r\",\n            \"koi8_r\"\n          ],\n          \"name\": \"KOI8-R\"\n        },\n        {\n          \"labels\": [\n            \"koi8-ru\",\n            \"koi8-u\"\n          ],\n          \"name\": \"KOI8-U\"\n        },\n        {\n          \"labels\": [\n            \"csmacintosh\",\n            \"mac\",\n            \"macintosh\",\n            \"x-mac-roman\"\n          ],\n          \"name\": \"macintosh\"\n        },\n        {\n          \"labels\": [\n            \"dos-874\",\n            \"iso-8859-11\",\n            \"iso8859-11\",\n            \"iso885911\",\n            \"tis-620\",\n            \"windows-874\"\n          ],\n          \"name\": \"windows-874\"\n        },\n        {\n          \"labels\": [\n            \"cp1250\",\n            \"windows-1250\",\n            \"x-cp1250\"\n          ],\n          \"name\": \"windows-1250\"\n        },\n        {\n          \"labels\": [\n            \"cp1251\",\n            \"windows-1251\",\n            \"x-cp1251\"\n          ],\n          \"name\": \"windows-1251\"\n        },\n        {\n          \"labels\": [\n            \"ansi_x3.4-1968\",\n            \"ascii\",\n            \"cp1252\",\n            \"cp819\",\n            \"csisolatin1\",\n            \"ibm819\",\n            \"iso-8859-1\",\n            \"iso-ir-100\",\n            \"iso8859-1\",\n            \"iso88591\",\n            \"iso_8859-1\",\n            \"iso_8859-1:1987\",\n            \"l1\",\n            \"latin1\",\n            \"us-ascii\",\n            \"windows-1252\",\n            \"x-cp1252\"\n          ],\n          \"name\": \"windows-1252\"\n        },\n        {\n          \"labels\": [\n            \"cp1253\",\n            \"windows-1253\",\n            \"x-cp1253\"\n          ],\n          \"name\": \"windows-1253\"\n        },\n        {\n          \"labels\": [\n            \"cp1254\",\n            \"csisolatin5\",\n            \"iso-8859-9\",\n            \"iso-ir-148\",\n            \"iso8859-9\",\n            \"iso88599\",\n            \"iso_8859-9\",\n            \"iso_8859-9:1989\",\n            \"l5\",\n            \"latin5\",\n            \"windows-1254\",\n            \"x-cp1254\"\n          ],\n          \"name\": \"windows-1254\"\n        },\n        {\n          \"labels\": [\n            \"cp1255\",\n            \"windows-1255\",\n            \"x-cp1255\"\n          ],\n          \"name\": \"windows-1255\"\n        },\n        {\n          \"labels\": [\n            \"cp1256\",\n            \"windows-1256\",\n            \"x-cp1256\"\n          ],\n          \"name\": \"windows-1256\"\n        },\n        {\n          \"labels\": [\n            \"cp1257\",\n            \"windows-1257\",\n            \"x-cp1257\"\n          ],\n          \"name\": \"windows-1257\"\n        },\n        {\n          \"labels\": [\n            \"cp1258\",\n            \"windows-1258\",\n            \"x-cp1258\"\n          ],\n          \"name\": \"windows-1258\"\n        },\n        {\n          \"labels\": [\n            \"x-mac-cyrillic\",\n            \"x-mac-ukrainian\"\n          ],\n          \"name\": \"x-mac-cyrillic\"\n        }\n      ],\n      \"heading\": \"Legacy single-byte encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"chinese\",\n            \"csgb2312\",\n            \"csiso58gb231280\",\n            \"gb2312\",\n            \"gb_2312\",\n            \"gb_2312-80\",\n            \"gbk\",\n            \"iso-ir-58\",\n            \"x-gbk\"\n          ],\n          \"name\": \"GBK\"\n        },\n        {\n          \"labels\": [\n            \"gb18030\"\n          ],\n          \"name\": \"gb18030\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Chinese (simplified) encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"big5\",\n            \"big5-hkscs\",\n            \"cn-big5\",\n            \"csbig5\",\n            \"x-x-big5\"\n          ],\n          \"name\": \"Big5\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Chinese (traditional) encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"cseucpkdfmtjapanese\",\n            \"euc-jp\",\n            \"x-euc-jp\"\n          ],\n          \"name\": \"EUC-JP\"\n        },\n        {\n          \"labels\": [\n            \"csiso2022jp\",\n            \"iso-2022-jp\"\n          ],\n          \"name\": \"ISO-2022-JP\"\n        },\n        {\n          \"labels\": [\n            \"csshiftjis\",\n            \"ms932\",\n            \"ms_kanji\",\n            \"shift-jis\",\n            \"shift_jis\",\n            \"sjis\",\n            \"windows-31j\",\n            \"x-sjis\"\n          ],\n          \"name\": \"Shift_JIS\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Japanese encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"cseuckr\",\n            \"csksc56011987\",\n            \"euc-kr\",\n            \"iso-ir-149\",\n            \"korean\",\n            \"ks_c_5601-1987\",\n            \"ks_c_5601-1989\",\n            \"ksc5601\",\n            \"ksc_5601\",\n            \"windows-949\"\n          ],\n          \"name\": \"EUC-KR\"\n        }\n      ],\n      \"heading\": \"Legacy multi-byte Korean encodings\"\n    },\n    {\n      \"encodings\": [\n        {\n          \"labels\": [\n            \"csiso2022kr\",\n            \"hz-gb-2312\",\n            \"iso-2022-cn\",\n            \"iso-2022-cn-ext\",\n            \"iso-2022-kr\"\n          ],\n          \"name\": \"replacement\"\n        },\n        {\n          \"labels\": [\n            \"utf-16be\"\n          ],\n          \"name\": \"UTF-16BE\"\n        },\n        {\n          \"labels\": [\n            \"utf-16\",\n            \"utf-16le\"\n          ],\n          \"name\": \"UTF-16LE\"\n        },\n        {\n          \"labels\": [\n            \"x-user-defined\"\n          ],\n          \"name\": \"x-user-defined\"\n        }\n      ],\n      \"heading\": \"Legacy miscellaneous encodings\"\n    }\n  ];\n\n  // Label to encoding registry.\n  /** @type {Object.<string,{name:string,labels:Array.<string>}>} */\n  var label_to_encoding = {};\n  encodings.forEach(function(category) {\n    category.encodings.forEach(function(encoding) {\n      encoding.labels.forEach(function(label) {\n        label_to_encoding[label] = encoding;\n      });\n    });\n  });\n\n  // Registry of of encoder/decoder factories, by encoding name.\n  /** @type {Object.<string, function({fatal:boolean}): Encoder>} */\n  var encoders = {};\n  /** @type {Object.<string, function({fatal:boolean}): Decoder>} */\n  var decoders = {};\n\n  //\n  // 6. Indexes\n  //\n\n  /**\n   * @param {number} pointer The |pointer| to search for.\n   * @param {(!Array.<?number>|undefined)} index The |index| to search within.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in |index|.\n   */\n  function indexCodePointFor(pointer, index) {\n    if (!index) return null;\n    return index[pointer] || null;\n  }\n\n  /**\n   * @param {number} code_point The |code point| to search for.\n   * @param {!Array.<?number>} index The |index| to search within.\n   * @return {?number} The first pointer corresponding to |code point| in\n   *     |index|, or null if |code point| is not in |index|.\n   */\n  function indexPointerFor(code_point, index) {\n    var pointer = index.indexOf(code_point);\n    return pointer === -1 ? null : pointer;\n  }\n\n  /**\n   * @param {string} name Name of the index.\n   * @return {(!Array.<number>|!Array.<Array.<number>>)}\n   *  */\n  function index(name) {\n    if (!('encoding-indexes' in global)) {\n      throw Error(\"Indexes missing.\" +\n                  \" Did you forget to include encoding-indexes.js first?\");\n    }\n    return global['encoding-indexes'][name];\n  }\n\n  /**\n   * @param {number} pointer The |pointer| to search for in the gb18030 index.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in the gb18030 index.\n   */\n  function indexGB18030RangesCodePointFor(pointer) {\n    // 1. If pointer is greater than 39419 and less than 189000, or\n    // pointer is greater than 1237575, return null.\n    if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))\n      return null;\n\n    // 2. If pointer is 7457, return code point U+E7C7.\n    if (pointer === 7457) return 0xE7C7;\n\n    // 3. Let offset be the last pointer in index gb18030 ranges that\n    // is equal to or less than pointer and let code point offset be\n    // its corresponding code point.\n    var offset = 0;\n    var code_point_offset = 0;\n    var idx = index('gb18030-ranges');\n    var i;\n    for (i = 0; i < idx.length; ++i) {\n      /** @type {!Array.<number>} */\n      var entry = idx[i];\n      if (entry[0] <= pointer) {\n        offset = entry[0];\n        code_point_offset = entry[1];\n      } else {\n        break;\n      }\n    }\n\n    // 4. Return a code point whose value is code point offset +\n    // pointer − offset.\n    return code_point_offset + pointer - offset;\n  }\n\n  /**\n   * @param {number} code_point The |code point| to locate in the gb18030 index.\n   * @return {number} The first pointer corresponding to |code point| in the\n   *     gb18030 index.\n   */\n  function indexGB18030RangesPointerFor(code_point) {\n    // 1. If code point is U+E7C7, return pointer 7457.\n    if (code_point === 0xE7C7) return 7457;\n\n    // 2. Let offset be the last code point in index gb18030 ranges\n    // that is equal to or less than code point and let pointer offset\n    // be its corresponding pointer.\n    var offset = 0;\n    var pointer_offset = 0;\n    var idx = index('gb18030-ranges');\n    var i;\n    for (i = 0; i < idx.length; ++i) {\n      /** @type {!Array.<number>} */\n      var entry = idx[i];\n      if (entry[1] <= code_point) {\n        offset = entry[1];\n        pointer_offset = entry[0];\n      } else {\n        break;\n      }\n    }\n\n    // 3. Return a pointer whose value is pointer offset + code point\n    // − offset.\n    return pointer_offset + code_point - offset;\n  }\n\n  /**\n   * @param {number} code_point The |code_point| to search for in the Shift_JIS\n   *     index.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in the Shift_JIS index.\n   */\n  function indexShiftJISPointerFor(code_point) {\n    // 1. Let index be index jis0208 excluding all entries whose\n    // pointer is in the range 8272 to 8835, inclusive.\n    shift_jis_index = shift_jis_index ||\n      index('jis0208').map(function(code_point, pointer) {\n        return inRange(pointer, 8272, 8835) ? null : code_point;\n      });\n    var index_ = shift_jis_index;\n\n    // 2. Return the index pointer for code point in index.\n    return index_.indexOf(code_point);\n  }\n  var shift_jis_index;\n\n  /**\n   * @param {number} code_point The |code_point| to search for in the big5\n   *     index.\n   * @return {?number} The code point corresponding to |pointer| in |index|,\n   *     or null if |code point| is not in the big5 index.\n   */\n  function indexBig5PointerFor(code_point) {\n    // 1. Let index be index Big5 excluding all entries whose pointer\n    big5_index_no_hkscs = big5_index_no_hkscs ||\n      index('big5').map(function(code_point, pointer) {\n        return (pointer < (0xA1 - 0x81) * 157) ? null : code_point;\n      });\n    var index_ = big5_index_no_hkscs;\n\n    // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or\n    // U+5345, return the last pointer corresponding to code point in\n    // index.\n    if (code_point === 0x2550 || code_point === 0x255E ||\n        code_point === 0x2561 || code_point === 0x256A ||\n        code_point === 0x5341 || code_point === 0x5345) {\n      return index_.lastIndexOf(code_point);\n    }\n\n    // 3. Return the index pointer for code point in index.\n    return indexPointerFor(code_point, index_);\n  }\n  var big5_index_no_hkscs;\n\n  //\n  // 8. API\n  //\n\n  /** @const */ var DEFAULT_ENCODING = 'utf-8';\n\n  // 8.1 Interface TextDecoder\n\n  /**\n   * @constructor\n   * @param {string=} label The label of the encoding;\n   *     defaults to 'utf-8'.\n   * @param {Object=} options\n   */\n  function TextDecoder(label, options) {\n    // Web IDL conventions\n    if (!(this instanceof TextDecoder))\n      throw TypeError('Called as a function. Did you forget \\'new\\'?');\n    label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n    options = ToDictionary(options);\n\n    // A TextDecoder object has an associated encoding, decoder,\n    // stream, ignore BOM flag (initially unset), BOM seen flag\n    // (initially unset), error mode (initially replacement), and do\n    // not flush flag (initially unset).\n\n    /** @private */\n    this._encoding = null;\n    /** @private @type {?Decoder} */\n    this._decoder = null;\n    /** @private @type {boolean} */\n    this._ignoreBOM = false;\n    /** @private @type {boolean} */\n    this._BOMseen = false;\n    /** @private @type {string} */\n    this._error_mode = 'replacement';\n    /** @private @type {boolean} */\n    this._do_not_flush = false;\n\n\n    // 1. Let encoding be the result of getting an encoding from\n    // label.\n    var encoding = getEncoding(label);\n\n    // 2. If encoding is failure or replacement, throw a RangeError.\n    if (encoding === null || encoding.name === 'replacement')\n      throw RangeError('Unknown encoding: ' + label);\n    if (!decoders[encoding.name]) {\n      throw Error('Decoder not present.' +\n                  ' Did you forget to include encoding-indexes.js first?');\n    }\n\n    // 3. Let dec be a new TextDecoder object.\n    var dec = this;\n\n    // 4. Set dec's encoding to encoding.\n    dec._encoding = encoding;\n\n    // 5. If options's fatal member is true, set dec's error mode to\n    // fatal.\n    if (Boolean(options['fatal']))\n      dec._error_mode = 'fatal';\n\n    // 6. If options's ignoreBOM member is true, set dec's ignore BOM\n    // flag.\n    if (Boolean(options['ignoreBOM']))\n      dec._ignoreBOM = true;\n\n    // For pre-ES5 runtimes:\n    if (!Object.defineProperty) {\n      this.encoding = dec._encoding.name.toLowerCase();\n      this.fatal = dec._error_mode === 'fatal';\n      this.ignoreBOM = dec._ignoreBOM;\n    }\n\n    // 7. Return dec.\n    return dec;\n  }\n\n  if (Object.defineProperty) {\n    // The encoding attribute's getter must return encoding's name.\n    Object.defineProperty(TextDecoder.prototype, 'encoding', {\n      /** @this {TextDecoder} */\n      get: function() { return this._encoding.name.toLowerCase(); }\n    });\n\n    // The fatal attribute's getter must return true if error mode\n    // is fatal, and false otherwise.\n    Object.defineProperty(TextDecoder.prototype, 'fatal', {\n      /** @this {TextDecoder} */\n      get: function() { return this._error_mode === 'fatal'; }\n    });\n\n    // The ignoreBOM attribute's getter must return true if ignore\n    // BOM flag is set, and false otherwise.\n    Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', {\n      /** @this {TextDecoder} */\n      get: function() { return this._ignoreBOM; }\n    });\n  }\n\n  /**\n   * @param {BufferSource=} input The buffer of bytes to decode.\n   * @param {Object=} options\n   * @return {string} The decoded string.\n   */\n  TextDecoder.prototype.decode = function decode(input, options) {\n    var bytes;\n    if (typeof input === 'object' && input instanceof ArrayBuffer) {\n      bytes = new Uint8Array(input);\n    } else if (typeof input === 'object' && 'buffer' in input &&\n               input.buffer instanceof ArrayBuffer) {\n      bytes = new Uint8Array(input.buffer,\n                             input.byteOffset,\n                             input.byteLength);\n    } else {\n      bytes = new Uint8Array(0);\n    }\n\n    options = ToDictionary(options);\n\n    // 1. If the do not flush flag is unset, set decoder to a new\n    // encoding's decoder, set stream to a new stream, and unset the\n    // BOM seen flag.\n    if (!this._do_not_flush) {\n      this._decoder = decoders[this._encoding.name]({\n        fatal: this._error_mode === 'fatal'});\n      this._BOMseen = false;\n    }\n\n    // 2. If options's stream is true, set the do not flush flag, and\n    // unset the do not flush flag otherwise.\n    this._do_not_flush = Boolean(options['stream']);\n\n    // 3. If input is given, push a copy of input to stream.\n    // TODO: Align with spec algorithm - maintain stream on instance.\n    var input_stream = new Stream(bytes);\n\n    // 4. Let output be a new stream.\n    var output = [];\n\n    /** @type {?(number|!Array.<number>)} */\n    var result;\n\n    // 5. While true:\n    while (true) {\n      // 1. Let token be the result of reading from stream.\n      var token = input_stream.read();\n\n      // 2. If token is end-of-stream and the do not flush flag is\n      // set, return output, serialized.\n      // TODO: Align with spec algorithm.\n      if (token === end_of_stream)\n        break;\n\n      // 3. Otherwise, run these subsubsteps:\n\n      // 1. Let result be the result of processing token for decoder,\n      // stream, output, and error mode.\n      result = this._decoder.handler(input_stream, token);\n\n      // 2. If result is finished, return output, serialized.\n      if (result === finished)\n        break;\n\n      if (result !== null) {\n        if (Array.isArray(result))\n          output.push.apply(output, /**@type {!Array.<number>}*/(result));\n        else\n          output.push(result);\n      }\n\n      // 3. Otherwise, if result is error, throw a TypeError.\n      // (Thrown in handler)\n\n      // 4. Otherwise, do nothing.\n    }\n    // TODO: Align with spec algorithm.\n    if (!this._do_not_flush) {\n      do {\n        result = this._decoder.handler(input_stream, input_stream.read());\n        if (result === finished)\n          break;\n        if (result === null)\n          continue;\n        if (Array.isArray(result))\n          output.push.apply(output, /**@type {!Array.<number>}*/(result));\n        else\n          output.push(result);\n      } while (!input_stream.endOfStream());\n      this._decoder = null;\n    }\n\n    // A TextDecoder object also has an associated serialize stream\n    // algorithm...\n    /**\n     * @param {!Array.<number>} stream\n     * @return {string}\n     * @this {TextDecoder}\n     */\n    function serializeStream(stream) {\n      // 1. Let token be the result of reading from stream.\n      // (Done in-place on array, rather than as a stream)\n\n      // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore\n      // BOM flag and BOM seen flag are unset, run these subsubsteps:\n      if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) &&\n          !this._ignoreBOM && !this._BOMseen) {\n        if (stream.length > 0 && stream[0] === 0xFEFF) {\n          // 1. If token is U+FEFF, set BOM seen flag.\n          this._BOMseen = true;\n          stream.shift();\n        } else if (stream.length > 0) {\n          // 2. Otherwise, if token is not end-of-stream, set BOM seen\n          // flag and append token to stream.\n          this._BOMseen = true;\n        } else {\n          // 3. Otherwise, if token is not end-of-stream, append token\n          // to output.\n          // (no-op)\n        }\n      }\n      // 4. Otherwise, return output.\n      return codePointsToString(stream);\n    }\n\n    return serializeStream.call(this, output);\n  };\n\n  // 8.2 Interface TextEncoder\n\n  /**\n   * @constructor\n   * @param {string=} label The label of the encoding. NONSTANDARD.\n   * @param {Object=} options NONSTANDARD.\n   */\n  function TextEncoder(label, options) {\n    // Web IDL conventions\n    if (!(this instanceof TextEncoder))\n      throw TypeError('Called as a function. Did you forget \\'new\\'?');\n    options = ToDictionary(options);\n\n    // A TextEncoder object has an associated encoding and encoder.\n\n    /** @private */\n    this._encoding = null;\n    /** @private @type {?Encoder} */\n    this._encoder = null;\n\n    // Non-standard\n    /** @private @type {boolean} */\n    this._do_not_flush = false;\n    /** @private @type {string} */\n    this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement';\n\n    // 1. Let enc be a new TextEncoder object.\n    var enc = this;\n\n    // 2. Set enc's encoding to UTF-8's encoder.\n    if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {\n      // NONSTANDARD behavior.\n      label = label !== undefined ? String(label) : DEFAULT_ENCODING;\n      var encoding = getEncoding(label);\n      if (encoding === null || encoding.name === 'replacement')\n        throw RangeError('Unknown encoding: ' + label);\n      if (!encoders[encoding.name]) {\n        throw Error('Encoder not present.' +\n                    ' Did you forget to include encoding-indexes.js first?');\n      }\n      enc._encoding = encoding;\n    } else {\n      // Standard behavior.\n      enc._encoding = getEncoding('utf-8');\n\n      if (label !== undefined && 'console' in global) {\n        console.warn('TextEncoder constructor called with encoding label, '\n                     + 'which is ignored.');\n      }\n    }\n\n    // For pre-ES5 runtimes:\n    if (!Object.defineProperty)\n      this.encoding = enc._encoding.name.toLowerCase();\n\n    // 3. Return enc.\n    return enc;\n  }\n\n  if (Object.defineProperty) {\n    // The encoding attribute's getter must return encoding's name.\n    Object.defineProperty(TextEncoder.prototype, 'encoding', {\n      /** @this {TextEncoder} */\n      get: function() { return this._encoding.name.toLowerCase(); }\n    });\n  }\n\n  /**\n   * @param {string=} opt_string The string to encode.\n   * @param {Object=} options\n   * @return {!Uint8Array} Encoded bytes, as a Uint8Array.\n   */\n  TextEncoder.prototype.encode = function encode(opt_string, options) {\n    opt_string = opt_string === undefined ? '' : String(opt_string);\n    options = ToDictionary(options);\n\n    // NOTE: This option is nonstandard. None of the encodings\n    // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when\n    // the input is a USVString so streaming is not necessary.\n    if (!this._do_not_flush)\n      this._encoder = encoders[this._encoding.name]({\n        fatal: this._fatal === 'fatal'});\n    this._do_not_flush = Boolean(options['stream']);\n\n    // 1. Convert input to a stream.\n    var input = new Stream(stringToCodePoints(opt_string));\n\n    // 2. Let output be a new stream\n    var output = [];\n\n    /** @type {?(number|!Array.<number>)} */\n    var result;\n    // 3. While true, run these substeps:\n    while (true) {\n      // 1. Let token be the result of reading from input.\n      var token = input.read();\n      if (token === end_of_stream)\n        break;\n      // 2. Let result be the result of processing token for encoder,\n      // input, output.\n      result = this._encoder.handler(input, token);\n      if (result === finished)\n        break;\n      if (Array.isArray(result))\n        output.push.apply(output, /**@type {!Array.<number>}*/(result));\n      else\n        output.push(result);\n    }\n    // TODO: Align with spec algorithm.\n    if (!this._do_not_flush) {\n      while (true) {\n        result = this._encoder.handler(input, input.read());\n        if (result === finished)\n          break;\n        if (Array.isArray(result))\n          output.push.apply(output, /**@type {!Array.<number>}*/(result));\n        else\n          output.push(result);\n      }\n      this._encoder = null;\n    }\n    // 3. If result is finished, convert output into a byte sequence,\n    // and then return a Uint8Array object wrapping an ArrayBuffer\n    // containing output.\n    return new Uint8Array(output);\n  };\n\n\n  //\n  // 9. The encoding\n  //\n\n  // 9.1 utf-8\n\n  // 9.1.1 utf-8 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function UTF8Decoder(options) {\n    var fatal = options.fatal;\n\n    // utf-8's decoder's has an associated utf-8 code point, utf-8\n    // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8\n    // lower boundary (initially 0x80), and a utf-8 upper boundary\n    // (initially 0xBF).\n    var /** @type {number} */ utf8_code_point = 0,\n        /** @type {number} */ utf8_bytes_seen = 0,\n        /** @type {number} */ utf8_bytes_needed = 0,\n        /** @type {number} */ utf8_lower_boundary = 0x80,\n        /** @type {number} */ utf8_upper_boundary = 0xBF;\n\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and utf-8 bytes needed is not 0,\n      // set utf-8 bytes needed to 0 and return error.\n      if (bite === end_of_stream && utf8_bytes_needed !== 0) {\n        utf8_bytes_needed = 0;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream, return finished.\n      if (bite === end_of_stream)\n        return finished;\n\n      // 3. If utf-8 bytes needed is 0, based on byte:\n      if (utf8_bytes_needed === 0) {\n\n        // 0x00 to 0x7F\n        if (inRange(bite, 0x00, 0x7F)) {\n          // Return a code point whose value is byte.\n          return bite;\n        }\n\n        // 0xC2 to 0xDF\n        else if (inRange(bite, 0xC2, 0xDF)) {\n          // 1. Set utf-8 bytes needed to 1.\n          utf8_bytes_needed = 1;\n\n          // 2. Set UTF-8 code point to byte & 0x1F.\n          utf8_code_point = bite & 0x1F;\n        }\n\n        // 0xE0 to 0xEF\n        else if (inRange(bite, 0xE0, 0xEF)) {\n          // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0.\n          if (bite === 0xE0)\n            utf8_lower_boundary = 0xA0;\n          // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F.\n          if (bite === 0xED)\n            utf8_upper_boundary = 0x9F;\n          // 3. Set utf-8 bytes needed to 2.\n          utf8_bytes_needed = 2;\n          // 4. Set UTF-8 code point to byte & 0xF.\n          utf8_code_point = bite & 0xF;\n        }\n\n        // 0xF0 to 0xF4\n        else if (inRange(bite, 0xF0, 0xF4)) {\n          // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90.\n          if (bite === 0xF0)\n            utf8_lower_boundary = 0x90;\n          // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F.\n          if (bite === 0xF4)\n            utf8_upper_boundary = 0x8F;\n          // 3. Set utf-8 bytes needed to 3.\n          utf8_bytes_needed = 3;\n          // 4. Set UTF-8 code point to byte & 0x7.\n          utf8_code_point = bite & 0x7;\n        }\n\n        // Otherwise\n        else {\n          // Return error.\n          return decoderError(fatal);\n        }\n\n        // Return continue.\n        return null;\n      }\n\n      // 4. If byte is not in the range utf-8 lower boundary to utf-8\n      // upper boundary, inclusive, run these substeps:\n      if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) {\n\n        // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8\n        // bytes seen to 0, set utf-8 lower boundary to 0x80, and set\n        // utf-8 upper boundary to 0xBF.\n        utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n        utf8_lower_boundary = 0x80;\n        utf8_upper_boundary = 0xBF;\n\n        // 2. Prepend byte to stream.\n        stream.prepend(bite);\n\n        // 3. Return error.\n        return decoderError(fatal);\n      }\n\n      // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary\n      // to 0xBF.\n      utf8_lower_boundary = 0x80;\n      utf8_upper_boundary = 0xBF;\n\n      // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte &\n      // 0x3F)\n      utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F);\n\n      // 7. Increase utf-8 bytes seen by one.\n      utf8_bytes_seen += 1;\n\n      // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed,\n      // continue.\n      if (utf8_bytes_seen !== utf8_bytes_needed)\n        return null;\n\n      // 9. Let code point be utf-8 code point.\n      var code_point = utf8_code_point;\n\n      // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes\n      // seen to 0.\n      utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n\n      // 11. Return a code point whose value is code point.\n      return code_point;\n    };\n  }\n\n  // 9.1.2 utf-8 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function UTF8Encoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Set count and offset based on the range code point is in:\n      var count, offset;\n      // U+0080 to U+07FF, inclusive:\n      if (inRange(code_point, 0x0080, 0x07FF)) {\n        // 1 and 0xC0\n        count = 1;\n        offset = 0xC0;\n      }\n      // U+0800 to U+FFFF, inclusive:\n      else if (inRange(code_point, 0x0800, 0xFFFF)) {\n        // 2 and 0xE0\n        count = 2;\n        offset = 0xE0;\n      }\n      // U+10000 to U+10FFFF, inclusive:\n      else if (inRange(code_point, 0x10000, 0x10FFFF)) {\n        // 3 and 0xF0\n        count = 3;\n        offset = 0xF0;\n      }\n\n      // 4. Let bytes be a byte sequence whose first byte is (code\n      // point >> (6 × count)) + offset.\n      var bytes = [(code_point >> (6 * count)) + offset];\n\n      // 5. Run these substeps while count is greater than 0:\n      while (count > 0) {\n\n        // 1. Set temp to code point >> (6 × (count − 1)).\n        var temp = code_point >> (6 * (count - 1));\n\n        // 2. Append to bytes 0x80 | (temp & 0x3F).\n        bytes.push(0x80 | (temp & 0x3F));\n\n        // 3. Decrease count by one.\n        count -= 1;\n      }\n\n      // 6. Return bytes bytes, in order.\n      return bytes;\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['UTF-8'] = function(options) {\n    return new UTF8Encoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['UTF-8'] = function(options) {\n    return new UTF8Decoder(options);\n  };\n\n  //\n  // 10. Legacy single-byte encodings\n  //\n\n  // 10.1 single-byte decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {!Array.<number>} index The encoding index.\n   * @param {{fatal: boolean}} options\n   */\n  function SingleByteDecoder(index, options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream, return finished.\n      if (bite === end_of_stream)\n        return finished;\n\n      // 2. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 3. Let code point be the index code point for byte − 0x80 in\n      // index single-byte.\n      var code_point = index[bite - 0x80];\n\n      // 4. If code point is null, return error.\n      if (code_point === null)\n        return decoderError(fatal);\n\n      // 5. Return a code point whose value is code point.\n      return code_point;\n    };\n  }\n\n  // 10.2 single-byte encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {!Array.<?number>} index The encoding index.\n   * @param {{fatal: boolean}} options\n   */\n  function SingleByteEncoder(index, options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Let pointer be the index pointer for code point in index\n      // single-byte.\n      var pointer = indexPointerFor(code_point, index);\n\n      // 4. If pointer is null, return error with code point.\n      if (pointer === null)\n        encoderError(code_point);\n\n      // 5. Return a byte whose value is pointer + 0x80.\n      return pointer + 0x80;\n    };\n  }\n\n  (function() {\n    if (!('encoding-indexes' in global))\n      return;\n    encodings.forEach(function(category) {\n      if (category.heading !== 'Legacy single-byte encodings')\n        return;\n      category.encodings.forEach(function(encoding) {\n        var name = encoding.name;\n        var idx = index(name.toLowerCase());\n        /** @param {{fatal: boolean}} options */\n        decoders[name] = function(options) {\n          return new SingleByteDecoder(idx, options);\n        };\n        /** @param {{fatal: boolean}} options */\n        encoders[name] = function(options) {\n          return new SingleByteEncoder(idx, options);\n        };\n      });\n    });\n  }());\n\n  //\n  // 11. Legacy multi-byte Chinese (simplified) encodings\n  //\n\n  // 11.1 gbk\n\n  // 11.1.1 gbk decoder\n  // gbk's decoder is gb18030's decoder.\n  /** @param {{fatal: boolean}} options */\n  decoders['GBK'] = function(options) {\n    return new GB18030Decoder(options);\n  };\n\n  // 11.1.2 gbk encoder\n  // gbk's encoder is gb18030's encoder with its gbk flag set.\n  /** @param {{fatal: boolean}} options */\n  encoders['GBK'] = function(options) {\n    return new GB18030Encoder(options, true);\n  };\n\n  // 11.2 gb18030\n\n  // 11.2.1 gb18030 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function GB18030Decoder(options) {\n    var fatal = options.fatal;\n    // gb18030's decoder has an associated gb18030 first, gb18030\n    // second, and gb18030 third (all initially 0x00).\n    var /** @type {number} */ gb18030_first = 0x00,\n        /** @type {number} */ gb18030_second = 0x00,\n        /** @type {number} */ gb18030_third = 0x00;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and gb18030 first, gb18030\n      // second, and gb18030 third are 0x00, return finished.\n      if (bite === end_of_stream && gb18030_first === 0x00 &&\n          gb18030_second === 0x00 && gb18030_third === 0x00) {\n        return finished;\n      }\n      // 2. If byte is end-of-stream, and gb18030 first, gb18030\n      // second, or gb18030 third is not 0x00, set gb18030 first,\n      // gb18030 second, and gb18030 third to 0x00, and return error.\n      if (bite === end_of_stream &&\n          (gb18030_first !== 0x00 || gb18030_second !== 0x00 ||\n           gb18030_third !== 0x00)) {\n        gb18030_first = 0x00;\n        gb18030_second = 0x00;\n        gb18030_third = 0x00;\n        decoderError(fatal);\n      }\n      var code_point;\n      // 3. If gb18030 third is not 0x00, run these substeps:\n      if (gb18030_third !== 0x00) {\n        // 1. Let code point be null.\n        code_point = null;\n        // 2. If byte is in the range 0x30 to 0x39, inclusive, set\n        // code point to the index gb18030 ranges code point for\n        // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) ×\n        // 126 + gb18030 third − 0x81) × 10 + byte − 0x30.\n        if (inRange(bite, 0x30, 0x39)) {\n          code_point = indexGB18030RangesCodePointFor(\n              (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 +\n               gb18030_third - 0x81) * 10 + bite - 0x30);\n        }\n\n        // 3. Let buffer be a byte sequence consisting of gb18030\n        // second, gb18030 third, and byte, in order.\n        var buffer = [gb18030_second, gb18030_third, bite];\n\n        // 4. Set gb18030 first, gb18030 second, and gb18030 third to\n        // 0x00.\n        gb18030_first = 0x00;\n        gb18030_second = 0x00;\n        gb18030_third = 0x00;\n\n        // 5. If code point is null, prepend buffer to stream and\n        // return error.\n        if (code_point === null) {\n          stream.prepend(buffer);\n          return decoderError(fatal);\n        }\n\n        // 6. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If gb18030 second is not 0x00, run these substeps:\n      if (gb18030_second !== 0x00) {\n\n        // 1. If byte is in the range 0x81 to 0xFE, inclusive, set\n        // gb18030 third to byte and return continue.\n        if (inRange(bite, 0x81, 0xFE)) {\n          gb18030_third = bite;\n          return null;\n        }\n\n        // 2. Prepend gb18030 second followed by byte to stream, set\n        // gb18030 first and gb18030 second to 0x00, and return error.\n        stream.prepend([gb18030_second, bite]);\n        gb18030_first = 0x00;\n        gb18030_second = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 5. If gb18030 first is not 0x00, run these substeps:\n      if (gb18030_first !== 0x00) {\n\n        // 1. If byte is in the range 0x30 to 0x39, inclusive, set\n        // gb18030 second to byte and return continue.\n        if (inRange(bite, 0x30, 0x39)) {\n          gb18030_second = bite;\n          return null;\n        }\n\n        // 2. Let lead be gb18030 first, let pointer be null, and set\n        // gb18030 first to 0x00.\n        var lead = gb18030_first;\n        var pointer = null;\n        gb18030_first = 0x00;\n\n        // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41\n        // otherwise.\n        var offset = bite < 0x7F ? 0x40 : 0x41;\n\n        // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80\n        // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 +\n        // (byte − offset).\n        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE))\n          pointer = (lead - 0x81) * 190 + (bite - offset);\n\n        // 5. Let code point be null if pointer is null and the index\n        // code point for pointer in index gb18030 otherwise.\n        code_point = pointer === null ? null :\n            indexCodePointFor(pointer, index('gb18030'));\n\n        // 6. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (code_point === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 7. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 8. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 6. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 7. If byte is 0x80, return code point U+20AC.\n      if (bite === 0x80)\n        return 0x20AC;\n\n      // 8. If byte is in the range 0x81 to 0xFE, inclusive, set\n      // gb18030 first to byte and return continue.\n      if (inRange(bite, 0x81, 0xFE)) {\n        gb18030_first = bite;\n        return null;\n      }\n\n      // 9. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 11.2.2 gb18030 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   * @param {boolean=} gbk_flag\n   */\n  function GB18030Encoder(options, gbk_flag) {\n    var fatal = options.fatal;\n    // gb18030's decoder has an associated gbk flag (initially unset).\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. If code point is U+E5E5, return error with code point.\n      if (code_point === 0xE5E5)\n        return encoderError(code_point);\n\n      // 4. If the gbk flag is set and code point is U+20AC, return\n      // byte 0x80.\n      if (gbk_flag && code_point === 0x20AC)\n        return 0x80;\n\n      // 5. Let pointer be the index pointer for code point in index\n      // gb18030.\n      var pointer = indexPointerFor(code_point, index('gb18030'));\n\n      // 6. If pointer is not null, run these substeps:\n      if (pointer !== null) {\n\n        // 1. Let lead be floor(pointer / 190) + 0x81.\n        var lead = floor(pointer / 190) + 0x81;\n\n        // 2. Let trail be pointer % 190.\n        var trail = pointer % 190;\n\n        // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise.\n        var offset = trail < 0x3F ? 0x40 : 0x41;\n\n        // 4. Return two bytes whose values are lead and trail + offset.\n        return [lead, trail + offset];\n      }\n\n      // 7. If gbk flag is set, return error with code point.\n      if (gbk_flag)\n        return encoderError(code_point);\n\n      // 8. Set pointer to the index gb18030 ranges pointer for code\n      // point.\n      pointer = indexGB18030RangesPointerFor(code_point);\n\n      // 9. Let byte1 be floor(pointer / 10 / 126 / 10).\n      var byte1 = floor(pointer / 10 / 126 / 10);\n\n      // 10. Set pointer to pointer − byte1 × 10 × 126 × 10.\n      pointer = pointer - byte1 * 10 * 126 * 10;\n\n      // 11. Let byte2 be floor(pointer / 10 / 126).\n      var byte2 = floor(pointer / 10 / 126);\n\n      // 12. Set pointer to pointer − byte2 × 10 × 126.\n      pointer = pointer - byte2 * 10 * 126;\n\n      // 13. Let byte3 be floor(pointer / 10).\n      var byte3 = floor(pointer / 10);\n\n      // 14. Let byte4 be pointer − byte3 × 10.\n      var byte4 = pointer - byte3 * 10;\n\n      // 15. Return four bytes whose values are byte1 + 0x81, byte2 +\n      // 0x30, byte3 + 0x81, byte4 + 0x30.\n      return [byte1 + 0x81,\n              byte2 + 0x30,\n              byte3 + 0x81,\n              byte4 + 0x30];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['gb18030'] = function(options) {\n    return new GB18030Encoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['gb18030'] = function(options) {\n    return new GB18030Decoder(options);\n  };\n\n\n  //\n  // 12. Legacy multi-byte Chinese (traditional) encodings\n  //\n\n  // 12.1 Big5\n\n  // 12.1.1 Big5 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function Big5Decoder(options) {\n    var fatal = options.fatal;\n    // Big5's decoder has an associated Big5 lead (initially 0x00).\n    var /** @type {number} */ Big5_lead = 0x00;\n\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and Big5 lead is not 0x00, set\n      // Big5 lead to 0x00 and return error.\n      if (bite === end_of_stream && Big5_lead !== 0x00) {\n        Big5_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and Big5 lead is 0x00, return\n      // finished.\n      if (bite === end_of_stream && Big5_lead === 0x00)\n        return finished;\n\n      // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let\n      // pointer be null, set Big5 lead to 0x00, and then run these\n      // substeps:\n      if (Big5_lead !== 0x00) {\n        var lead = Big5_lead;\n        var pointer = null;\n        Big5_lead = 0x00;\n\n        // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62\n        // otherwise.\n        var offset = bite < 0x7F ? 0x40 : 0x62;\n\n        // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1\n        // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 +\n        // (byte − offset).\n        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE))\n          pointer = (lead - 0x81) * 157 + (bite - offset);\n\n        // 3. If there is a row in the table below whose first column\n        // is pointer, return the two code points listed in its second\n        // column\n        // Pointer | Code points\n        // --------+--------------\n        // 1133    | U+00CA U+0304\n        // 1135    | U+00CA U+030C\n        // 1164    | U+00EA U+0304\n        // 1166    | U+00EA U+030C\n        switch (pointer) {\n          case 1133: return [0x00CA, 0x0304];\n          case 1135: return [0x00CA, 0x030C];\n          case 1164: return [0x00EA, 0x0304];\n          case 1166: return [0x00EA, 0x030C];\n        }\n\n        // 4. Let code point be null if pointer is null and the index\n        // code point for pointer in index Big5 otherwise.\n        var code_point = (pointer === null) ? null :\n            indexCodePointFor(pointer, index('big5'));\n\n        // 5. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (code_point === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 6. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 7. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5\n      // lead to byte and return continue.\n      if (inRange(bite, 0x81, 0xFE)) {\n        Big5_lead = bite;\n        return null;\n      }\n\n      // 6. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 12.1.2 Big5 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function Big5Encoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Let pointer be the index Big5 pointer for code point.\n      var pointer = indexBig5PointerFor(code_point);\n\n      // 4. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 5. Let lead be floor(pointer / 157) + 0x81.\n      var lead = floor(pointer / 157) + 0x81;\n\n      // 6. If lead is less than 0xA1, return error with code point.\n      if (lead < 0xA1)\n        return encoderError(code_point);\n\n      // 7. Let trail be pointer % 157.\n      var trail = pointer % 157;\n\n      // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62\n      // otherwise.\n      var offset = trail < 0x3F ? 0x40 : 0x62;\n\n      // Return two bytes whose values are lead and trail + offset.\n      return [lead, trail + offset];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['Big5'] = function(options) {\n    return new Big5Encoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['Big5'] = function(options) {\n    return new Big5Decoder(options);\n  };\n\n\n  //\n  // 13. Legacy multi-byte Japanese encodings\n  //\n\n  // 13.1 euc-jp\n\n  // 13.1.1 euc-jp decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCJPDecoder(options) {\n    var fatal = options.fatal;\n\n    // euc-jp's decoder has an associated euc-jp jis0212 flag\n    // (initially unset) and euc-jp lead (initially 0x00).\n    var /** @type {boolean} */ eucjp_jis0212_flag = false,\n        /** @type {number} */ eucjp_lead = 0x00;\n\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set\n      // euc-jp lead to 0x00, and return error.\n      if (bite === end_of_stream && eucjp_lead !== 0x00) {\n        eucjp_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and euc-jp lead is 0x00, return\n      // finished.\n      if (bite === end_of_stream && eucjp_lead === 0x00)\n        return finished;\n\n      // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to\n      // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code\n      // point whose value is 0xFF61 − 0xA1 + byte.\n      if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) {\n        eucjp_lead = 0x00;\n        return 0xFF61 - 0xA1 + bite;\n      }\n\n      // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to\n      // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead\n      // to byte, and return continue.\n      if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) {\n        eucjp_jis0212_flag = true;\n        eucjp_lead = bite;\n        return null;\n      }\n\n      // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set\n      // euc-jp lead to 0x00, and run these substeps:\n      if (eucjp_lead !== 0x00) {\n        var lead = eucjp_lead;\n        eucjp_lead = 0x00;\n\n        // 1. Let code point be null.\n        var code_point = null;\n\n        // 2. If lead and byte are both in the range 0xA1 to 0xFE,\n        // inclusive, set code point to the index code point for (lead\n        // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp\n        // jis0212 flag is unset and in index jis0212 otherwise.\n        if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {\n          code_point = indexCodePointFor(\n            (lead - 0xA1) * 94 + (bite - 0xA1),\n            index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212'));\n        }\n\n        // 3. Unset the euc-jp jis0212 flag.\n        eucjp_jis0212_flag = false;\n\n        // 4. If byte is not in the range 0xA1 to 0xFE, inclusive,\n        // prepend byte to stream.\n        if (!inRange(bite, 0xA1, 0xFE))\n          stream.prepend(bite);\n\n        // 5. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 6. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 6. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE,\n      // inclusive, set euc-jp lead to byte and return continue.\n      if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) {\n        eucjp_lead = bite;\n        return null;\n      }\n\n      // 8. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 13.1.2 euc-jp encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCJPEncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. If code point is U+00A5, return byte 0x5C.\n      if (code_point === 0x00A5)\n        return 0x5C;\n\n      // 4. If code point is U+203E, return byte 0x7E.\n      if (code_point === 0x203E)\n        return 0x7E;\n\n      // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,\n      // return two bytes whose values are 0x8E and code point −\n      // 0xFF61 + 0xA1.\n      if (inRange(code_point, 0xFF61, 0xFF9F))\n        return [0x8E, code_point - 0xFF61 + 0xA1];\n\n      // 6. If code point is U+2212, set it to U+FF0D.\n      if (code_point === 0x2212)\n        code_point = 0xFF0D;\n\n      // 7. Let pointer be the index pointer for code point in index\n      // jis0208.\n      var pointer = indexPointerFor(code_point, index('jis0208'));\n\n      // 8. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 9. Let lead be floor(pointer / 94) + 0xA1.\n      var lead = floor(pointer / 94) + 0xA1;\n\n      // 10. Let trail be pointer % 94 + 0xA1.\n      var trail = pointer % 94 + 0xA1;\n\n      // 11. Return two bytes whose values are lead and trail.\n      return [lead, trail];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['EUC-JP'] = function(options) {\n    return new EUCJPEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['EUC-JP'] = function(options) {\n    return new EUCJPDecoder(options);\n  };\n\n  // 13.2 iso-2022-jp\n\n  // 13.2.1 iso-2022-jp decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ISO2022JPDecoder(options) {\n    var fatal = options.fatal;\n    /** @enum */\n    var states = {\n      ASCII: 0,\n      Roman: 1,\n      Katakana: 2,\n      LeadByte: 3,\n      TrailByte: 4,\n      EscapeStart: 5,\n      Escape: 6\n    };\n    // iso-2022-jp's decoder has an associated iso-2022-jp decoder\n    // state (initially ASCII), iso-2022-jp decoder output state\n    // (initially ASCII), iso-2022-jp lead (initially 0x00), and\n    // iso-2022-jp output flag (initially unset).\n    var /** @type {number} */ iso2022jp_decoder_state = states.ASCII,\n        /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII,\n        /** @type {number} */ iso2022jp_lead = 0x00,\n        /** @type {boolean} */ iso2022jp_output_flag = false;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // switching on iso-2022-jp decoder state:\n      switch (iso2022jp_decoder_state) {\n      default:\n      case states.ASCII:\n        // ASCII\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B\n        if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E\n            && bite !== 0x0F && bite !== 0x1B) {\n          // Unset the iso-2022-jp output flag and return a code point\n          // whose value is byte.\n          iso2022jp_output_flag = false;\n          return bite;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.Roman:\n        // Roman\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x5C\n        if (bite === 0x5C) {\n          // Unset the iso-2022-jp output flag and return code point\n          // U+00A5.\n          iso2022jp_output_flag = false;\n          return 0x00A5;\n        }\n\n        // 0x7E\n        if (bite === 0x7E) {\n          // Unset the iso-2022-jp output flag and return code point\n          // U+203E.\n          iso2022jp_output_flag = false;\n          return 0x203E;\n        }\n\n        // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E\n        if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F\n            && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) {\n          // Unset the iso-2022-jp output flag and return a code point\n          // whose value is byte.\n          iso2022jp_output_flag = false;\n          return bite;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.Katakana:\n        // Katakana\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x21 to 0x5F\n        if (inRange(bite, 0x21, 0x5F)) {\n          // Unset the iso-2022-jp output flag and return a code point\n          // whose value is 0xFF61 − 0x21 + byte.\n          iso2022jp_output_flag = false;\n          return 0xFF61 - 0x21 + bite;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.LeadByte:\n        // Lead byte\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return null;\n        }\n\n        // 0x21 to 0x7E\n        if (inRange(bite, 0x21, 0x7E)) {\n          // Unset the iso-2022-jp output flag, set iso-2022-jp lead\n          // to byte, iso-2022-jp decoder state to trail byte, and\n          // return continue.\n          iso2022jp_output_flag = false;\n          iso2022jp_lead = bite;\n          iso2022jp_decoder_state = states.TrailByte;\n          return null;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Return finished.\n          return finished;\n        }\n\n        // Otherwise\n        // Unset the iso-2022-jp output flag and return error.\n        iso2022jp_output_flag = false;\n        return decoderError(fatal);\n\n      case states.TrailByte:\n        // Trail byte\n        // Based on byte:\n\n        // 0x1B\n        if (bite === 0x1B) {\n          // Set iso-2022-jp decoder state to escape start and return\n          // continue.\n          iso2022jp_decoder_state = states.EscapeStart;\n          return decoderError(fatal);\n        }\n\n        // 0x21 to 0x7E\n        if (inRange(bite, 0x21, 0x7E)) {\n          // 1. Set the iso-2022-jp decoder state to lead byte.\n          iso2022jp_decoder_state = states.LeadByte;\n\n          // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21.\n          var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;\n\n          // 3. Let code point be the index code point for pointer in\n          // index jis0208.\n          var code_point = indexCodePointFor(pointer, index('jis0208'));\n\n          // 4. If code point is null, return error.\n          if (code_point === null)\n            return decoderError(fatal);\n\n          // 5. Return a code point whose value is code point.\n          return code_point;\n        }\n\n        // end-of-stream\n        if (bite === end_of_stream) {\n          // Set the iso-2022-jp decoder state to lead byte, prepend\n          // byte to stream, and return error.\n          iso2022jp_decoder_state = states.LeadByte;\n          stream.prepend(bite);\n          return decoderError(fatal);\n        }\n\n        // Otherwise\n        // Set iso-2022-jp decoder state to lead byte and return\n        // error.\n        iso2022jp_decoder_state = states.LeadByte;\n        return decoderError(fatal);\n\n      case states.EscapeStart:\n        // Escape start\n\n        // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to\n        // byte, iso-2022-jp decoder state to escape, and return\n        // continue.\n        if (bite === 0x24 || bite === 0x28) {\n          iso2022jp_lead = bite;\n          iso2022jp_decoder_state = states.Escape;\n          return null;\n        }\n\n        // 2. Prepend byte to stream.\n        stream.prepend(bite);\n\n        // 3. Unset the iso-2022-jp output flag, set iso-2022-jp\n        // decoder state to iso-2022-jp decoder output state, and\n        // return error.\n        iso2022jp_output_flag = false;\n        iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n        return decoderError(fatal);\n\n      case states.Escape:\n        // Escape\n\n        // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to\n        // 0x00.\n        var lead = iso2022jp_lead;\n        iso2022jp_lead = 0x00;\n\n        // 2. Let state be null.\n        var state = null;\n\n        // 3. If lead is 0x28 and byte is 0x42, set state to ASCII.\n        if (lead === 0x28 && bite === 0x42)\n          state = states.ASCII;\n\n        // 4. If lead is 0x28 and byte is 0x4A, set state to Roman.\n        if (lead === 0x28 && bite === 0x4A)\n          state = states.Roman;\n\n        // 5. If lead is 0x28 and byte is 0x49, set state to Katakana.\n        if (lead === 0x28 && bite === 0x49)\n          state = states.Katakana;\n\n        // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set\n        // state to lead byte.\n        if (lead === 0x24 && (bite === 0x40 || bite === 0x42))\n          state = states.LeadByte;\n\n        // 7. If state is non-null, run these substeps:\n        if (state !== null) {\n          // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder\n          // output state to states.\n          iso2022jp_decoder_state = iso2022jp_decoder_state = state;\n\n          // 2. Let output flag be the iso-2022-jp output flag.\n          var output_flag = iso2022jp_output_flag;\n\n          // 3. Set the iso-2022-jp output flag.\n          iso2022jp_output_flag = true;\n\n          // 4. Return continue, if output flag is unset, and error\n          // otherwise.\n          return !output_flag ? null : decoderError(fatal);\n        }\n\n        // 8. Prepend lead and byte to stream.\n        stream.prepend([lead, bite]);\n\n        // 9. Unset the iso-2022-jp output flag, set iso-2022-jp\n        // decoder state to iso-2022-jp decoder output state and\n        // return error.\n        iso2022jp_output_flag = false;\n        iso2022jp_decoder_state = iso2022jp_decoder_output_state;\n        return decoderError(fatal);\n      }\n    };\n  }\n\n  // 13.2.2 iso-2022-jp encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ISO2022JPEncoder(options) {\n    var fatal = options.fatal;\n    // iso-2022-jp's encoder has an associated iso-2022-jp encoder\n    // state which is one of ASCII, Roman, and jis0208 (initially\n    // ASCII).\n    /** @enum */\n    var states = {\n      ASCII: 0,\n      Roman: 1,\n      jis0208: 2\n    };\n    var /** @type {number} */ iso2022jp_state = states.ASCII;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream and iso-2022-jp encoder\n      // state is not ASCII, prepend code point to stream, set\n      // iso-2022-jp encoder state to ASCII, and return three bytes\n      // 0x1B 0x28 0x42.\n      if (code_point === end_of_stream &&\n          iso2022jp_state !== states.ASCII) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.ASCII;\n        return [0x1B, 0x28, 0x42];\n      }\n\n      // 2. If code point is end-of-stream and iso-2022-jp encoder\n      // state is ASCII, return finished.\n      if (code_point === end_of_stream && iso2022jp_state === states.ASCII)\n        return finished;\n\n      // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code\n      // point is U+000E, U+000F, or U+001B, return error with U+FFFD.\n      if ((iso2022jp_state === states.ASCII ||\n           iso2022jp_state === states.Roman) &&\n          (code_point === 0x000E || code_point === 0x000F ||\n           code_point === 0x001B)) {\n        return encoderError(0xFFFD);\n      }\n\n      // 4. If iso-2022-jp encoder state is ASCII and code point is an\n      // ASCII code point, return a byte whose value is code point.\n      if (iso2022jp_state === states.ASCII &&\n          isASCIICodePoint(code_point))\n        return code_point;\n\n      // 5. If iso-2022-jp encoder state is Roman and code point is an\n      // ASCII code point, excluding U+005C and U+007E, or is U+00A5\n      // or U+203E, run these substeps:\n      if (iso2022jp_state === states.Roman &&\n          ((isASCIICodePoint(code_point) &&\n           code_point !== 0x005C && code_point !== 0x007E) ||\n          (code_point == 0x00A5 || code_point == 0x203E))) {\n\n        // 1. If code point is an ASCII code point, return a byte\n        // whose value is code point.\n        if (isASCIICodePoint(code_point))\n          return code_point;\n\n        // 2. If code point is U+00A5, return byte 0x5C.\n        if (code_point === 0x00A5)\n          return 0x5C;\n\n        // 3. If code point is U+203E, return byte 0x7E.\n        if (code_point === 0x203E)\n          return 0x7E;\n      }\n\n      // 6. If code point is an ASCII code point, and iso-2022-jp\n      // encoder state is not ASCII, prepend code point to stream, set\n      // iso-2022-jp encoder state to ASCII, and return three bytes\n      // 0x1B 0x28 0x42.\n      if (isASCIICodePoint(code_point) &&\n          iso2022jp_state !== states.ASCII) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.ASCII;\n        return [0x1B, 0x28, 0x42];\n      }\n\n      // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp\n      // encoder state is not Roman, prepend code point to stream, set\n      // iso-2022-jp encoder state to Roman, and return three bytes\n      // 0x1B 0x28 0x4A.\n      if ((code_point === 0x00A5 || code_point === 0x203E) &&\n          iso2022jp_state !== states.Roman) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.Roman;\n        return [0x1B, 0x28, 0x4A];\n      }\n\n      // 8. If code point is U+2212, set it to U+FF0D.\n      if (code_point === 0x2212)\n        code_point = 0xFF0D;\n\n      // 9. Let pointer be the index pointer for code point in index\n      // jis0208.\n      var pointer = indexPointerFor(code_point, index('jis0208'));\n\n      // 10. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 11. If iso-2022-jp encoder state is not jis0208, prepend code\n      // point to stream, set iso-2022-jp encoder state to jis0208,\n      // and return three bytes 0x1B 0x24 0x42.\n      if (iso2022jp_state !== states.jis0208) {\n        stream.prepend(code_point);\n        iso2022jp_state = states.jis0208;\n        return [0x1B, 0x24, 0x42];\n      }\n\n      // 12. Let lead be floor(pointer / 94) + 0x21.\n      var lead = floor(pointer / 94) + 0x21;\n\n      // 13. Let trail be pointer % 94 + 0x21.\n      var trail = pointer % 94 + 0x21;\n\n      // 14. Return two bytes whose values are lead and trail.\n      return [lead, trail];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['ISO-2022-JP'] = function(options) {\n    return new ISO2022JPEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['ISO-2022-JP'] = function(options) {\n    return new ISO2022JPDecoder(options);\n  };\n\n  // 13.3 Shift_JIS\n\n  // 13.3.1 Shift_JIS decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ShiftJISDecoder(options) {\n    var fatal = options.fatal;\n    // Shift_JIS's decoder has an associated Shift_JIS lead (initially\n    // 0x00).\n    var /** @type {number} */ Shift_JIS_lead = 0x00;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00,\n      // set Shift_JIS lead to 0x00 and return error.\n      if (bite === end_of_stream && Shift_JIS_lead !== 0x00) {\n        Shift_JIS_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and Shift_JIS lead is 0x00,\n      // return finished.\n      if (bite === end_of_stream && Shift_JIS_lead === 0x00)\n        return finished;\n\n      // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead,\n      // let pointer be null, set Shift_JIS lead to 0x00, and then run\n      // these substeps:\n      if (Shift_JIS_lead !== 0x00) {\n        var lead = Shift_JIS_lead;\n        var pointer = null;\n        Shift_JIS_lead = 0x00;\n\n        // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41\n        // otherwise.\n        var offset = (bite < 0x7F) ? 0x40 : 0x41;\n\n        // 2. Let lead offset be 0x81, if lead is less than 0xA0, and\n        // 0xC1 otherwise.\n        var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;\n\n        // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80\n        // to 0xFC, inclusive, set pointer to (lead − lead offset) ×\n        // 188 + byte − offset.\n        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC))\n          pointer = (lead - lead_offset) * 188 + bite - offset;\n\n        // 4. If pointer is in the range 8836 to 10715, inclusive,\n        // return a code point whose value is 0xE000 − 8836 + pointer.\n        if (inRange(pointer, 8836, 10715))\n          return 0xE000 - 8836 + pointer;\n\n        // 5. Let code point be null, if pointer is null, and the\n        // index code point for pointer in index jis0208 otherwise.\n        var code_point = (pointer === null) ? null :\n              indexCodePointFor(pointer, index('jis0208'));\n\n        // 6. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (code_point === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 7. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 8. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If byte is an ASCII byte or 0x80, return a code point\n      // whose value is byte.\n      if (isASCIIByte(bite) || bite === 0x80)\n        return bite;\n\n      // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a\n      // code point whose value is 0xFF61 − 0xA1 + byte.\n      if (inRange(bite, 0xA1, 0xDF))\n        return 0xFF61 - 0xA1 + bite;\n\n      // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0\n      // to 0xFC, inclusive, set Shift_JIS lead to byte and return\n      // continue.\n      if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {\n        Shift_JIS_lead = bite;\n        return null;\n      }\n\n      // 7. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 13.3.2 Shift_JIS encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function ShiftJISEncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point or U+0080, return a\n      // byte whose value is code point.\n      if (isASCIICodePoint(code_point) || code_point === 0x0080)\n        return code_point;\n\n      // 3. If code point is U+00A5, return byte 0x5C.\n      if (code_point === 0x00A5)\n        return 0x5C;\n\n      // 4. If code point is U+203E, return byte 0x7E.\n      if (code_point === 0x203E)\n        return 0x7E;\n\n      // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,\n      // return a byte whose value is code point − 0xFF61 + 0xA1.\n      if (inRange(code_point, 0xFF61, 0xFF9F))\n        return code_point - 0xFF61 + 0xA1;\n\n      // 6. If code point is U+2212, set it to U+FF0D.\n      if (code_point === 0x2212)\n        code_point = 0xFF0D;\n\n      // 7. Let pointer be the index Shift_JIS pointer for code point.\n      var pointer = indexShiftJISPointerFor(code_point);\n\n      // 8. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 9. Let lead be floor(pointer / 188).\n      var lead = floor(pointer / 188);\n\n      // 10. Let lead offset be 0x81, if lead is less than 0x1F, and\n      // 0xC1 otherwise.\n      var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1;\n\n      // 11. Let trail be pointer % 188.\n      var trail = pointer % 188;\n\n      // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41\n      // otherwise.\n      var offset = (trail < 0x3F) ? 0x40 : 0x41;\n\n      // 13. Return two bytes whose values are lead + lead offset and\n      // trail + offset.\n      return [lead + lead_offset, trail + offset];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['Shift_JIS'] = function(options) {\n    return new ShiftJISEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['Shift_JIS'] = function(options) {\n    return new ShiftJISDecoder(options);\n  };\n\n  //\n  // 14. Legacy multi-byte Korean encodings\n  //\n\n  // 14.1 euc-kr\n\n  // 14.1.1 euc-kr decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCKRDecoder(options) {\n    var fatal = options.fatal;\n\n    // euc-kr's decoder has an associated euc-kr lead (initially 0x00).\n    var /** @type {number} */ euckr_lead = 0x00;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set\n      // euc-kr lead to 0x00 and return error.\n      if (bite === end_of_stream && euckr_lead !== 0) {\n        euckr_lead = 0x00;\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and euc-kr lead is 0x00, return\n      // finished.\n      if (bite === end_of_stream && euckr_lead === 0)\n        return finished;\n\n      // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let\n      // pointer be null, set euc-kr lead to 0x00, and then run these\n      // substeps:\n      if (euckr_lead !== 0x00) {\n        var lead = euckr_lead;\n        var pointer = null;\n        euckr_lead = 0x00;\n\n        // 1. If byte is in the range 0x41 to 0xFE, inclusive, set\n        // pointer to (lead − 0x81) × 190 + (byte − 0x41).\n        if (inRange(bite, 0x41, 0xFE))\n          pointer = (lead - 0x81) * 190 + (bite - 0x41);\n\n        // 2. Let code point be null, if pointer is null, and the\n        // index code point for pointer in index euc-kr otherwise.\n        var code_point = (pointer === null)\n              ? null : indexCodePointFor(pointer, index('euc-kr'));\n\n        // 3. If code point is null and byte is an ASCII byte, prepend\n        // byte to stream.\n        if (pointer === null && isASCIIByte(bite))\n          stream.prepend(bite);\n\n        // 4. If code point is null, return error.\n        if (code_point === null)\n          return decoderError(fatal);\n\n        // 5. Return a code point whose value is code point.\n        return code_point;\n      }\n\n      // 4. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 5. If byte is in the range 0x81 to 0xFE, inclusive, set\n      // euc-kr lead to byte and return continue.\n      if (inRange(bite, 0x81, 0xFE)) {\n        euckr_lead = bite;\n        return null;\n      }\n\n      // 6. Return error.\n      return decoderError(fatal);\n    };\n  }\n\n  // 14.1.2 euc-kr encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function EUCKREncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. Let pointer be the index pointer for code point in index\n      // euc-kr.\n      var pointer = indexPointerFor(code_point, index('euc-kr'));\n\n      // 4. If pointer is null, return error with code point.\n      if (pointer === null)\n        return encoderError(code_point);\n\n      // 5. Let lead be floor(pointer / 190) + 0x81.\n      var lead = floor(pointer / 190) + 0x81;\n\n      // 6. Let trail be pointer % 190 + 0x41.\n      var trail = (pointer % 190) + 0x41;\n\n      // 7. Return two bytes whose values are lead and trail.\n      return [lead, trail];\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['EUC-KR'] = function(options) {\n    return new EUCKREncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['EUC-KR'] = function(options) {\n    return new EUCKRDecoder(options);\n  };\n\n\n  //\n  // 15. Legacy miscellaneous encodings\n  //\n\n  // 15.1 replacement\n\n  // Not needed - API throws RangeError\n\n  // 15.2 Common infrastructure for utf-16be and utf-16le\n\n  /**\n   * @param {number} code_unit\n   * @param {boolean} utf16be\n   * @return {!Array.<number>} bytes\n   */\n  function convertCodeUnitToBytes(code_unit, utf16be) {\n    // 1. Let byte1 be code unit >> 8.\n    var byte1 = code_unit >> 8;\n\n    // 2. Let byte2 be code unit & 0x00FF.\n    var byte2 = code_unit & 0x00FF;\n\n    // 3. Then return the bytes in order:\n        // utf-16be flag is set: byte1, then byte2.\n    if (utf16be)\n      return [byte1, byte2];\n    // utf-16be flag is unset: byte2, then byte1.\n    return [byte2, byte1];\n  }\n\n  // 15.2.1 shared utf-16 decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {boolean} utf16_be True if big-endian, false if little-endian.\n   * @param {{fatal: boolean}} options\n   */\n  function UTF16Decoder(utf16_be, options) {\n    var fatal = options.fatal;\n    var /** @type {?number} */ utf16_lead_byte = null,\n        /** @type {?number} */ utf16_lead_surrogate = null;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream and either utf-16 lead byte or\n      // utf-16 lead surrogate is not null, set utf-16 lead byte and\n      // utf-16 lead surrogate to null, and return error.\n      if (bite === end_of_stream && (utf16_lead_byte !== null ||\n                                utf16_lead_surrogate !== null)) {\n        return decoderError(fatal);\n      }\n\n      // 2. If byte is end-of-stream and utf-16 lead byte and utf-16\n      // lead surrogate are null, return finished.\n      if (bite === end_of_stream && utf16_lead_byte === null &&\n          utf16_lead_surrogate === null) {\n        return finished;\n      }\n\n      // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte\n      // and return continue.\n      if (utf16_lead_byte === null) {\n        utf16_lead_byte = bite;\n        return null;\n      }\n\n      // 4. Let code unit be the result of:\n      var code_unit;\n      if (utf16_be) {\n        // utf-16be decoder flag is set\n        //   (utf-16 lead byte << 8) + byte.\n        code_unit = (utf16_lead_byte << 8) + bite;\n      } else {\n        // utf-16be decoder flag is unset\n        //   (byte << 8) + utf-16 lead byte.\n        code_unit = (bite << 8) + utf16_lead_byte;\n      }\n      // Then set utf-16 lead byte to null.\n      utf16_lead_byte = null;\n\n      // 5. If utf-16 lead surrogate is not null, let lead surrogate\n      // be utf-16 lead surrogate, set utf-16 lead surrogate to null,\n      // and then run these substeps:\n      if (utf16_lead_surrogate !== null) {\n        var lead_surrogate = utf16_lead_surrogate;\n        utf16_lead_surrogate = null;\n\n        // 1. If code unit is in the range U+DC00 to U+DFFF,\n        // inclusive, return a code point whose value is 0x10000 +\n        // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00).\n        if (inRange(code_unit, 0xDC00, 0xDFFF)) {\n          return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +\n              (code_unit - 0xDC00);\n        }\n\n        // 2. Prepend the sequence resulting of converting code unit\n        // to bytes using utf-16be decoder flag to stream and return\n        // error.\n        stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be));\n        return decoderError(fatal);\n      }\n\n      // 6. If code unit is in the range U+D800 to U+DBFF, inclusive,\n      // set utf-16 lead surrogate to code unit and return continue.\n      if (inRange(code_unit, 0xD800, 0xDBFF)) {\n        utf16_lead_surrogate = code_unit;\n        return null;\n      }\n\n      // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive,\n      // return error.\n      if (inRange(code_unit, 0xDC00, 0xDFFF))\n        return decoderError(fatal);\n\n      // 8. Return code point code unit.\n      return code_unit;\n    };\n  }\n\n  // 15.2.2 shared utf-16 encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {boolean} utf16_be True if big-endian, false if little-endian.\n   * @param {{fatal: boolean}} options\n   */\n  function UTF16Encoder(utf16_be, options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1. If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is in the range U+0000 to U+FFFF, inclusive,\n      // return the sequence resulting of converting code point to\n      // bytes using utf-16be encoder flag.\n      if (inRange(code_point, 0x0000, 0xFFFF))\n        return convertCodeUnitToBytes(code_point, utf16_be);\n\n      // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800,\n      // converted to bytes using utf-16be encoder flag.\n      var lead = convertCodeUnitToBytes(\n        ((code_point - 0x10000) >> 10) + 0xD800, utf16_be);\n\n      // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00,\n      // converted to bytes using utf-16be encoder flag.\n      var trail = convertCodeUnitToBytes(\n        ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be);\n\n      // 5. Return a byte sequence of lead followed by trail.\n      return lead.concat(trail);\n    };\n  }\n\n  // 15.3 utf-16be\n  // 15.3.1 utf-16be decoder\n  /** @param {{fatal: boolean}} options */\n  encoders['UTF-16BE'] = function(options) {\n    return new UTF16Encoder(true, options);\n  };\n  // 15.3.2 utf-16be encoder\n  /** @param {{fatal: boolean}} options */\n  decoders['UTF-16BE'] = function(options) {\n    return new UTF16Decoder(true, options);\n  };\n\n  // 15.4 utf-16le\n  // 15.4.1 utf-16le decoder\n  /** @param {{fatal: boolean}} options */\n  encoders['UTF-16LE'] = function(options) {\n    return new UTF16Encoder(false, options);\n  };\n  // 15.4.2 utf-16le encoder\n  /** @param {{fatal: boolean}} options */\n  decoders['UTF-16LE'] = function(options) {\n    return new UTF16Decoder(false, options);\n  };\n\n  // 15.5 x-user-defined\n\n  // 15.5.1 x-user-defined decoder\n  /**\n   * @constructor\n   * @implements {Decoder}\n   * @param {{fatal: boolean}} options\n   */\n  function XUserDefinedDecoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream The stream of bytes being decoded.\n     * @param {number} bite The next byte read from the stream.\n     * @return {?(number|!Array.<number>)} The next code point(s)\n     *     decoded, or null if not enough data exists in the input\n     *     stream to decode a complete code point.\n     */\n    this.handler = function(stream, bite) {\n      // 1. If byte is end-of-stream, return finished.\n      if (bite === end_of_stream)\n        return finished;\n\n      // 2. If byte is an ASCII byte, return a code point whose value\n      // is byte.\n      if (isASCIIByte(bite))\n        return bite;\n\n      // 3. Return a code point whose value is 0xF780 + byte − 0x80.\n      return 0xF780 + bite - 0x80;\n    };\n  }\n\n  // 15.5.2 x-user-defined encoder\n  /**\n   * @constructor\n   * @implements {Encoder}\n   * @param {{fatal: boolean}} options\n   */\n  function XUserDefinedEncoder(options) {\n    var fatal = options.fatal;\n    /**\n     * @param {Stream} stream Input stream.\n     * @param {number} code_point Next code point read from the stream.\n     * @return {(number|!Array.<number>)} Byte(s) to emit.\n     */\n    this.handler = function(stream, code_point) {\n      // 1.If code point is end-of-stream, return finished.\n      if (code_point === end_of_stream)\n        return finished;\n\n      // 2. If code point is an ASCII code point, return a byte whose\n      // value is code point.\n      if (isASCIICodePoint(code_point))\n        return code_point;\n\n      // 3. If code point is in the range U+F780 to U+F7FF, inclusive,\n      // return a byte whose value is code point − 0xF780 + 0x80.\n      if (inRange(code_point, 0xF780, 0xF7FF))\n        return code_point - 0xF780 + 0x80;\n\n      // 4. Return error with code point.\n      return encoderError(code_point);\n    };\n  }\n\n  /** @param {{fatal: boolean}} options */\n  encoders['x-user-defined'] = function(options) {\n    return new XUserDefinedEncoder(options);\n  };\n  /** @param {{fatal: boolean}} options */\n  decoders['x-user-defined'] = function(options) {\n    return new XUserDefinedDecoder(options);\n  };\n\n  if (!global['TextEncoder'])\n    global['TextEncoder'] = TextEncoder;\n  if (!global['TextDecoder'])\n    global['TextDecoder'] = TextDecoder;\n\n  if (typeof module !== \"undefined\" && module.exports) {\n    module.exports = {\n      TextEncoder: global['TextEncoder'],\n      TextDecoder: global['TextDecoder'],\n      EncodingIndexes: global[\"encoding-indexes\"]\n    };\n  }\n\n// For strict environments where `this` inside the global scope\n// is `undefined`, take a pure object instead\n}(this || {}));\n},{\"./encoding-indexes.js\":67}],69:[function(require,module,exports){\n/*!\n\n diff v3.5.0\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com>\n\nAll rights reserved.\n\nRedistribution and use of this software in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above\n  copyright notice, this list of conditions and the\n  following disclaimer.\n\n* Redistributions in binary form must reproduce the above\n  copyright notice, this list of conditions and the\n  following disclaimer in the documentation and/or other\n  materials provided with the distribution.\n\n* Neither the name of Kevin Decker nor the names of its\n  contributors may be used to endorse or promote products\n  derived from this software without specific prior\n  written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\nOF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n@license\n*/\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JsDiff\"] = factory();\n\telse\n\t\troot[\"JsDiff\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined;\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_character = __webpack_require__(2) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_word = __webpack_require__(3) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_sentence = __webpack_require__(6) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_css = __webpack_require__(7) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_json = __webpack_require__(8) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_array = __webpack_require__(9) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_apply = __webpack_require__(10) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_merge = __webpack_require__(13) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_dmp = __webpack_require__(16) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_xml = __webpack_require__(17) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/* See LICENSE file for terms of use */\n\n\t/*\n\t * Text diff implementation.\n\t *\n\t * This library supports the following APIS:\n\t * JsDiff.diffChars: Character by character diff\n\t * JsDiff.diffWords: Word (as defined by \\b regex) diff which ignores whitespace\n\t * JsDiff.diffLines: Line based diff\n\t *\n\t * JsDiff.diffCss: Diff targeted at CSS content\n\t *\n\t * These methods are based on the implementation proposed in\n\t * \"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986).\n\t * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927\n\t */\n\texports. /*istanbul ignore end*/Diff = _base2['default'];\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = _character.diffChars;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = _word.diffWords;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = _word.diffWordsWithSpace;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = _line.diffLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = _line.diffTrimmedLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = _sentence.diffSentences;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = _css.diffCss;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = _json.diffJson;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = _array.diffArrays;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = _create.structuredPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = _create.createTwoFilesPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = _create.createPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = _apply.applyPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = _apply.applyPatches;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = _parse.parsePatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = _merge.merge;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = _dmp.convertChangesToDMP;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = _xml.convertChangesToXML;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = _json.canonicalize;\n\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports['default'] = /*istanbul ignore end*/Diff;\n\tfunction Diff() {}\n\n\tDiff.prototype = {\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/diff: function diff(oldString, newString) {\n\t    /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t    var callback = options.callback;\n\t    if (typeof options === 'function') {\n\t      callback = options;\n\t      options = {};\n\t    }\n\t    this.options = options;\n\n\t    var self = this;\n\n\t    function done(value) {\n\t      if (callback) {\n\t        setTimeout(function () {\n\t          callback(undefined, value);\n\t        }, 0);\n\t        return true;\n\t      } else {\n\t        return value;\n\t      }\n\t    }\n\n\t    // Allow subclasses to massage the input prior to running\n\t    oldString = this.castInput(oldString);\n\t    newString = this.castInput(newString);\n\n\t    oldString = this.removeEmpty(this.tokenize(oldString));\n\t    newString = this.removeEmpty(this.tokenize(newString));\n\n\t    var newLen = newString.length,\n\t        oldLen = oldString.length;\n\t    var editLength = 1;\n\t    var maxEditLength = newLen + oldLen;\n\t    var bestPath = [{ newPos: -1, components: [] }];\n\n\t    // Seed editLength = 0, i.e. the content starts with the same values\n\t    var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n\t    if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n\t      // Identity per the equality and tokenizer\n\t      return done([{ value: this.join(newString), count: newString.length }]);\n\t    }\n\n\t    // Main worker method. checks all permutations of a given edit length for acceptance.\n\t    function execEditLength() {\n\t      for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n\t        var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t        var addPath = bestPath[diagonalPath - 1],\n\t            removePath = bestPath[diagonalPath + 1],\n\t            _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n\t        if (addPath) {\n\t          // No one else is going to attempt to use this value, clear it\n\t          bestPath[diagonalPath - 1] = undefined;\n\t        }\n\n\t        var canAdd = addPath && addPath.newPos + 1 < newLen,\n\t            canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;\n\t        if (!canAdd && !canRemove) {\n\t          // If this path is a terminal then prune\n\t          bestPath[diagonalPath] = undefined;\n\t          continue;\n\t        }\n\n\t        // Select the diagonal that we want to branch from. We select the prior\n\t        // path whose position in the new string is the farthest from the origin\n\t        // and does not pass the bounds of the diff graph\n\t        if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {\n\t          basePath = clonePath(removePath);\n\t          self.pushComponent(basePath.components, undefined, true);\n\t        } else {\n\t          basePath = addPath; // No need to clone, we've pulled it from the list\n\t          basePath.newPos++;\n\t          self.pushComponent(basePath.components, true, undefined);\n\t        }\n\n\t        _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);\n\n\t        // If we have hit the end of both strings, then we are done\n\t        if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {\n\t          return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));\n\t        } else {\n\t          // Otherwise track this path as a potential candidate and continue.\n\t          bestPath[diagonalPath] = basePath;\n\t        }\n\t      }\n\n\t      editLength++;\n\t    }\n\n\t    // Performs the length of edit iteration. Is a bit fugly as this has to support the\n\t    // sync and async mode which is never fun. Loops over execEditLength until a value\n\t    // is produced.\n\t    if (callback) {\n\t      (function exec() {\n\t        setTimeout(function () {\n\t          // This should not happen, but we want to be safe.\n\t          /* istanbul ignore next */\n\t          if (editLength > maxEditLength) {\n\t            return callback();\n\t          }\n\n\t          if (!execEditLength()) {\n\t            exec();\n\t          }\n\t        }, 0);\n\t      })();\n\t    } else {\n\t      while (editLength <= maxEditLength) {\n\t        var ret = execEditLength();\n\t        if (ret) {\n\t          return ret;\n\t        }\n\t      }\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) {\n\t    var last = components[components.length - 1];\n\t    if (last && last.added === added && last.removed === removed) {\n\t      // We need to clone here as the component clone operation is just\n\t      // as shallow array clone\n\t      components[components.length - 1] = { count: last.count + 1, added: added, removed: removed };\n\t    } else {\n\t      components.push({ count: 1, added: added, removed: removed });\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {\n\t    var newLen = newString.length,\n\t        oldLen = oldString.length,\n\t        newPos = basePath.newPos,\n\t        oldPos = newPos - diagonalPath,\n\t        commonCount = 0;\n\t    while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n\t      newPos++;\n\t      oldPos++;\n\t      commonCount++;\n\t    }\n\n\t    if (commonCount) {\n\t      basePath.components.push({ count: commonCount });\n\t    }\n\n\t    basePath.newPos = newPos;\n\t    return oldPos;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) {\n\t    if (this.options.comparator) {\n\t      return this.options.comparator(left, right);\n\t    } else {\n\t      return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();\n\t    }\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) {\n\t    var ret = [];\n\t    for (var i = 0; i < array.length; i++) {\n\t      if (array[i]) {\n\t        ret.push(array[i]);\n\t      }\n\t    }\n\t    return ret;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) {\n\t    return value;\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) {\n\t    return value.split('');\n\t  },\n\t  /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) {\n\t    return chars.join('');\n\t  }\n\t};\n\n\tfunction buildValues(diff, components, newString, oldString, useLongestToken) {\n\t  var componentPos = 0,\n\t      componentLen = components.length,\n\t      newPos = 0,\n\t      oldPos = 0;\n\n\t  for (; componentPos < componentLen; componentPos++) {\n\t    var component = components[componentPos];\n\t    if (!component.removed) {\n\t      if (!component.added && useLongestToken) {\n\t        var value = newString.slice(newPos, newPos + component.count);\n\t        value = value.map(function (value, i) {\n\t          var oldValue = oldString[oldPos + i];\n\t          return oldValue.length > value.length ? oldValue : value;\n\t        });\n\n\t        component.value = diff.join(value);\n\t      } else {\n\t        component.value = diff.join(newString.slice(newPos, newPos + component.count));\n\t      }\n\t      newPos += component.count;\n\n\t      // Common case\n\t      if (!component.added) {\n\t        oldPos += component.count;\n\t      }\n\t    } else {\n\t      component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));\n\t      oldPos += component.count;\n\n\t      // Reverse add and remove so removes are output first to match common convention\n\t      // The diffing algorithm is tied to add then remove output and this is the simplest\n\t      // route to get the desired output with minimal overhead.\n\t      if (componentPos && components[componentPos - 1].added) {\n\t        var tmp = components[componentPos - 1];\n\t        components[componentPos - 1] = components[componentPos];\n\t        components[componentPos] = tmp;\n\t      }\n\t    }\n\t  }\n\n\t  // Special case handle for when one terminal is ignored (i.e. whitespace).\n\t  // For this case we merge the terminal into the prior string and drop the change.\n\t  // This is only available for string mode.\n\t  var lastComponent = components[componentLen - 1];\n\t  if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {\n\t    components[componentLen - 2].value += lastComponent.value;\n\t    components.pop();\n\t  }\n\n\t  return components;\n\t}\n\n\tfunction clonePath(path) {\n\t  return { newPos: path.newPos, components: path.components.slice(0) };\n\t}\n\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.characterDiff = undefined;\n\texports. /*istanbul ignore end*/diffChars = diffChars;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tfunction diffChars(oldStr, newStr, options) {\n\t  return characterDiff.diff(oldStr, newStr, options);\n\t}\n\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.wordDiff = undefined;\n\texports. /*istanbul ignore end*/diffWords = diffWords;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/ // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode\n\t//\n\t// Ranges and exceptions:\n\t// Latin-1 Supplement, 0080–00FF\n\t//  - U+00D7  × Multiplication sign\n\t//  - U+00F7  ÷ Division sign\n\t// Latin Extended-A, 0100–017F\n\t// Latin Extended-B, 0180–024F\n\t// IPA Extensions, 0250–02AF\n\t// Spacing Modifier Letters, 02B0–02FF\n\t//  - U+02C7  ˇ &#711;  Caron\n\t//  - U+02D8  ˘ &#728;  Breve\n\t//  - U+02D9  ˙ &#729;  Dot Above\n\t//  - U+02DA  ˚ &#730;  Ring Above\n\t//  - U+02DB  ˛ &#731;  Ogonek\n\t//  - U+02DC  ˜ &#732;  Small Tilde\n\t//  - U+02DD  ˝ &#733;  Double Acute Accent\n\t// Latin Extended Additional, 1E00–1EFF\n\tvar extendedWordChars = /^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/;\n\n\tvar reWhitespace = /\\S/;\n\n\tvar wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\twordDiff.equals = function (left, right) {\n\t  if (this.options.ignoreCase) {\n\t    left = left.toLowerCase();\n\t    right = right.toLowerCase();\n\t  }\n\t  return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);\n\t};\n\twordDiff.tokenize = function (value) {\n\t  var tokens = value.split(/(\\s+|\\b)/);\n\n\t  // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.\n\t  for (var i = 0; i < tokens.length - 1; i++) {\n\t    // If we have an empty string in the next field and we have only word chars before and after, merge\n\t    if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {\n\t      tokens[i] += tokens[i + 2];\n\t      tokens.splice(i + 1, 2);\n\t      i--;\n\t    }\n\t  }\n\n\t  return tokens;\n\t};\n\n\tfunction diffWords(oldStr, newStr, options) {\n\t  options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true });\n\t  return wordDiff.diff(oldStr, newStr, options);\n\t}\n\n\tfunction diffWordsWithSpace(oldStr, newStr, options) {\n\t  return wordDiff.diff(oldStr, newStr, options);\n\t}\n\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/generateOptions = generateOptions;\n\tfunction generateOptions(options, defaults) {\n\t  if (typeof options === 'function') {\n\t    defaults.callback = options;\n\t  } else if (options) {\n\t    for (var name in options) {\n\t      /* istanbul ignore else */\n\t      if (options.hasOwnProperty(name)) {\n\t        defaults[name] = options[name];\n\t      }\n\t    }\n\t  }\n\t  return defaults;\n\t}\n\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.lineDiff = undefined;\n\texports. /*istanbul ignore end*/diffLines = diffLines;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tlineDiff.tokenize = function (value) {\n\t  var retLines = [],\n\t      linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n\n\t  // Ignore the final empty token that occurs if the string ends with a new line\n\t  if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n\t    linesAndNewlines.pop();\n\t  }\n\n\t  // Merge the content and line separators into single tokens\n\t  for (var i = 0; i < linesAndNewlines.length; i++) {\n\t    var line = linesAndNewlines[i];\n\n\t    if (i % 2 && !this.options.newlineIsToken) {\n\t      retLines[retLines.length - 1] += line;\n\t    } else {\n\t      if (this.options.ignoreWhitespace) {\n\t        line = line.trim();\n\t      }\n\t      retLines.push(line);\n\t    }\n\t  }\n\n\t  return retLines;\n\t};\n\n\tfunction diffLines(oldStr, newStr, callback) {\n\t  return lineDiff.diff(oldStr, newStr, callback);\n\t}\n\tfunction diffTrimmedLines(oldStr, newStr, callback) {\n\t  var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true });\n\t  return lineDiff.diff(oldStr, newStr, options);\n\t}\n\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.sentenceDiff = undefined;\n\texports. /*istanbul ignore end*/diffSentences = diffSentences;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tsentenceDiff.tokenize = function (value) {\n\t  return value.split(/(\\S.+?[.!?])(?=\\s+|$)/);\n\t};\n\n\tfunction diffSentences(oldStr, newStr, callback) {\n\t  return sentenceDiff.diff(oldStr, newStr, callback);\n\t}\n\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.cssDiff = undefined;\n\texports. /*istanbul ignore end*/diffCss = diffCss;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tcssDiff.tokenize = function (value) {\n\t  return value.split(/([{}:;,]|\\s+)/);\n\t};\n\n\tfunction diffCss(oldStr, newStr, callback) {\n\t  return cssDiff.diff(oldStr, newStr, callback);\n\t}\n\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.jsonDiff = undefined;\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\texports. /*istanbul ignore end*/diffJson = diffJson;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\t/*istanbul ignore end*/var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var objectPrototypeToString = Object.prototype.toString;\n\n\tvar jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\t// Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n\t// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n\tjsonDiff.useLongestToken = true;\n\n\tjsonDiff.tokenize = /*istanbul ignore start*/_line.lineDiff /*istanbul ignore end*/.tokenize;\n\tjsonDiff.castInput = function (value) {\n\t  /*istanbul ignore start*/var _options = /*istanbul ignore end*/this.options,\n\t      undefinedReplacement = _options.undefinedReplacement,\n\t      _options$stringifyRep = _options.stringifyReplacer,\n\t      stringifyReplacer = _options$stringifyRep === undefined ? function (k, v) /*istanbul ignore start*/{\n\t    return (/*istanbul ignore end*/typeof v === 'undefined' ? undefinedReplacement : v\n\t    );\n\t  } : _options$stringifyRep;\n\n\n\t  return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, '  ');\n\t};\n\tjsonDiff.equals = function (left, right) {\n\t  return (/*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/.prototype.equals.call(jsonDiff, left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'))\n\t  );\n\t};\n\n\tfunction diffJson(oldObj, newObj, options) {\n\t  return jsonDiff.diff(oldObj, newObj, options);\n\t}\n\n\t// This function handles the presence of circular references by bailing out when encountering an\n\t// object that is already on the \"stack\" of items being processed. Accepts an optional replacer\n\tfunction canonicalize(obj, stack, replacementStack, replacer, key) {\n\t  stack = stack || [];\n\t  replacementStack = replacementStack || [];\n\n\t  if (replacer) {\n\t    obj = replacer(key, obj);\n\t  }\n\n\t  var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  for (i = 0; i < stack.length; i += 1) {\n\t    if (stack[i] === obj) {\n\t      return replacementStack[i];\n\t    }\n\t  }\n\n\t  var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  if ('[object Array]' === objectPrototypeToString.call(obj)) {\n\t    stack.push(obj);\n\t    canonicalizedObj = new Array(obj.length);\n\t    replacementStack.push(canonicalizedObj);\n\t    for (i = 0; i < obj.length; i += 1) {\n\t      canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);\n\t    }\n\t    stack.pop();\n\t    replacementStack.pop();\n\t    return canonicalizedObj;\n\t  }\n\n\t  if (obj && obj.toJSON) {\n\t    obj = obj.toJSON();\n\t  }\n\n\t  if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) {\n\t    stack.push(obj);\n\t    canonicalizedObj = {};\n\t    replacementStack.push(canonicalizedObj);\n\t    var sortedKeys = [],\n\t        _key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t    for (_key in obj) {\n\t      /* istanbul ignore else */\n\t      if (obj.hasOwnProperty(_key)) {\n\t        sortedKeys.push(_key);\n\t      }\n\t    }\n\t    sortedKeys.sort();\n\t    for (i = 0; i < sortedKeys.length; i += 1) {\n\t      _key = sortedKeys[i];\n\t      canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);\n\t    }\n\t    stack.pop();\n\t    replacementStack.pop();\n\t  } else {\n\t    canonicalizedObj = obj;\n\t  }\n\t  return canonicalizedObj;\n\t}\n\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports.arrayDiff = undefined;\n\texports. /*istanbul ignore end*/diffArrays = diffArrays;\n\n\tvar /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();\n\tarrayDiff.tokenize = function (value) {\n\t  return value.slice();\n\t};\n\tarrayDiff.join = arrayDiff.removeEmpty = function (value) {\n\t  return value;\n\t};\n\n\tfunction diffArrays(oldArr, newArr, callback) {\n\t  return arrayDiff.diff(oldArr, newArr, callback);\n\t}\n\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/applyPatch = applyPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_distanceIterator = __webpack_require__(12) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/var _distanceIterator2 = _interopRequireDefault(_distanceIterator);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n\t/*istanbul ignore end*/function applyPatch(source, uniDiff) {\n\t  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t  if (typeof uniDiff === 'string') {\n\t    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);\n\t  }\n\n\t  if (Array.isArray(uniDiff)) {\n\t    if (uniDiff.length > 1) {\n\t      throw new Error('applyPatch only works with a single input.');\n\t    }\n\n\t    uniDiff = uniDiff[0];\n\t  }\n\n\t  // Apply the diff to the input\n\t  var lines = source.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n\t      delimiters = source.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n\t      hunks = uniDiff.hunks,\n\t      compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{\n\t    return (/*istanbul ignore end*/line === patchContent\n\t    );\n\t  },\n\t      errorCount = 0,\n\t      fuzzFactor = options.fuzzFactor || 0,\n\t      minLine = 0,\n\t      offset = 0,\n\t      removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,\n\t      addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\n\t  /**\n\t   * Checks if the hunk exactly fits on the provided location\n\t   */\n\t  function hunkFits(hunk, toPos) {\n\t    for (var j = 0; j < hunk.lines.length; j++) {\n\t      var line = hunk.lines[j],\n\t          operation = line.length > 0 ? line[0] : ' ',\n\t          content = line.length > 0 ? line.substr(1) : line;\n\n\t      if (operation === ' ' || operation === '-') {\n\t        // Context sanity check\n\t        if (!compareLine(toPos + 1, lines[toPos], operation, content)) {\n\t          errorCount++;\n\n\t          if (errorCount > fuzzFactor) {\n\t            return false;\n\t          }\n\t        }\n\t        toPos++;\n\t      }\n\t    }\n\n\t    return true;\n\t  }\n\n\t  // Search best fit offsets for each hunk based on the previous ones\n\t  for (var i = 0; i < hunks.length; i++) {\n\t    var hunk = hunks[i],\n\t        maxLine = lines.length - hunk.oldLines,\n\t        localOffset = 0,\n\t        toPos = offset + hunk.oldStart - 1;\n\n\t    var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine);\n\n\t    for (; localOffset !== undefined; localOffset = iterator()) {\n\t      if (hunkFits(hunk, toPos + localOffset)) {\n\t        hunk.offset = offset += localOffset;\n\t        break;\n\t      }\n\t    }\n\n\t    if (localOffset === undefined) {\n\t      return false;\n\t    }\n\n\t    // Set lower text limit to end of the current hunk, so next ones don't try\n\t    // to fit over already patched text\n\t    minLine = hunk.offset + hunk.oldStart + hunk.oldLines;\n\t  }\n\n\t  // Apply patch hunks\n\t  var diffOffset = 0;\n\t  for (var _i = 0; _i < hunks.length; _i++) {\n\t    var _hunk = hunks[_i],\n\t        _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;\n\t    diffOffset += _hunk.newLines - _hunk.oldLines;\n\n\t    if (_toPos < 0) {\n\t      // Creating a new file\n\t      _toPos = 0;\n\t    }\n\n\t    for (var j = 0; j < _hunk.lines.length; j++) {\n\t      var line = _hunk.lines[j],\n\t          operation = line.length > 0 ? line[0] : ' ',\n\t          content = line.length > 0 ? line.substr(1) : line,\n\t          delimiter = _hunk.linedelimiters[j];\n\n\t      if (operation === ' ') {\n\t        _toPos++;\n\t      } else if (operation === '-') {\n\t        lines.splice(_toPos, 1);\n\t        delimiters.splice(_toPos, 1);\n\t        /* istanbul ignore else */\n\t      } else if (operation === '+') {\n\t        lines.splice(_toPos, 0, content);\n\t        delimiters.splice(_toPos, 0, delimiter);\n\t        _toPos++;\n\t      } else if (operation === '\\\\') {\n\t        var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;\n\t        if (previousOperation === '+') {\n\t          removeEOFNL = true;\n\t        } else if (previousOperation === '-') {\n\t          addEOFNL = true;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  // Handle EOFNL insertion/removal\n\t  if (removeEOFNL) {\n\t    while (!lines[lines.length - 1]) {\n\t      lines.pop();\n\t      delimiters.pop();\n\t    }\n\t  } else if (addEOFNL) {\n\t    lines.push('');\n\t    delimiters.push('\\n');\n\t  }\n\t  for (var _k = 0; _k < lines.length - 1; _k++) {\n\t    lines[_k] = lines[_k] + delimiters[_k];\n\t  }\n\t  return lines.join('');\n\t}\n\n\t// Wrapper that supports multiple file patches via callbacks.\n\tfunction applyPatches(uniDiff, options) {\n\t  if (typeof uniDiff === 'string') {\n\t    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);\n\t  }\n\n\t  var currentIndex = 0;\n\t  function processIndex() {\n\t    var index = uniDiff[currentIndex++];\n\t    if (!index) {\n\t      return options.complete();\n\t    }\n\n\t    options.loadFile(index, function (err, data) {\n\t      if (err) {\n\t        return options.complete(err);\n\t      }\n\n\t      var updatedContent = applyPatch(data, index, options);\n\t      options.patched(index, updatedContent, function (err) {\n\t        if (err) {\n\t          return options.complete(err);\n\t        }\n\n\t        processIndex();\n\t      });\n\t    });\n\t  }\n\t  processIndex();\n\t}\n\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/parsePatch = parsePatch;\n\tfunction parsePatch(uniDiff) {\n\t  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t  var diffstr = uniDiff.split(/\\r\\n|[\\n\\v\\f\\r\\x85]/),\n\t      delimiters = uniDiff.match(/\\r\\n|[\\n\\v\\f\\r\\x85]/g) || [],\n\t      list = [],\n\t      i = 0;\n\n\t  function parseIndex() {\n\t    var index = {};\n\t    list.push(index);\n\n\t    // Parse diff metadata\n\t    while (i < diffstr.length) {\n\t      var line = diffstr[i];\n\n\t      // File header found, end parsing diff metadata\n\t      if (/^(\\-\\-\\-|\\+\\+\\+|@@)\\s/.test(line)) {\n\t        break;\n\t      }\n\n\t      // Diff index\n\t      var header = /^(?:Index:|diff(?: -r \\w+)+)\\s+(.+?)\\s*$/.exec(line);\n\t      if (header) {\n\t        index.index = header[1];\n\t      }\n\n\t      i++;\n\t    }\n\n\t    // Parse file headers if they are defined. Unified diff requires them, but\n\t    // there's no technical issues to have an isolated hunk without file header\n\t    parseFileHeader(index);\n\t    parseFileHeader(index);\n\n\t    // Parse hunks\n\t    index.hunks = [];\n\n\t    while (i < diffstr.length) {\n\t      var _line = diffstr[i];\n\n\t      if (/^(Index:|diff|\\-\\-\\-|\\+\\+\\+)\\s/.test(_line)) {\n\t        break;\n\t      } else if (/^@@/.test(_line)) {\n\t        index.hunks.push(parseHunk());\n\t      } else if (_line && options.strict) {\n\t        // Ignore unexpected content unless in strict mode\n\t        throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));\n\t      } else {\n\t        i++;\n\t      }\n\t    }\n\t  }\n\n\t  // Parses the --- and +++ headers, if none are found, no lines\n\t  // are consumed.\n\t  function parseFileHeader(index) {\n\t    var fileHeader = /^(---|\\+\\+\\+)\\s+(.*)$/.exec(diffstr[i]);\n\t    if (fileHeader) {\n\t      var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';\n\t      var data = fileHeader[2].split('\\t', 2);\n\t      var fileName = data[0].replace(/\\\\\\\\/g, '\\\\');\n\t      if (/^\".*\"$/.test(fileName)) {\n\t        fileName = fileName.substr(1, fileName.length - 2);\n\t      }\n\t      index[keyPrefix + 'FileName'] = fileName;\n\t      index[keyPrefix + 'Header'] = (data[1] || '').trim();\n\n\t      i++;\n\t    }\n\t  }\n\n\t  // Parses a hunk\n\t  // This assumes that we are at the start of a hunk.\n\t  function parseHunk() {\n\t    var chunkHeaderIndex = i,\n\t        chunkHeaderLine = diffstr[i++],\n\t        chunkHeader = chunkHeaderLine.split(/@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\n\n\t    var hunk = {\n\t      oldStart: +chunkHeader[1],\n\t      oldLines: +chunkHeader[2] || 1,\n\t      newStart: +chunkHeader[3],\n\t      newLines: +chunkHeader[4] || 1,\n\t      lines: [],\n\t      linedelimiters: []\n\t    };\n\n\t    var addCount = 0,\n\t        removeCount = 0;\n\t    for (; i < diffstr.length; i++) {\n\t      // Lines starting with '---' could be mistaken for the \"remove line\" operation\n\t      // But they could be the header for the next file. Therefore prune such cases out.\n\t      if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {\n\t        break;\n\t      }\n\t      var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];\n\n\t      if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\\\') {\n\t        hunk.lines.push(diffstr[i]);\n\t        hunk.linedelimiters.push(delimiters[i] || '\\n');\n\n\t        if (operation === '+') {\n\t          addCount++;\n\t        } else if (operation === '-') {\n\t          removeCount++;\n\t        } else if (operation === ' ') {\n\t          addCount++;\n\t          removeCount++;\n\t        }\n\t      } else {\n\t        break;\n\t      }\n\t    }\n\n\t    // Handle the empty block count case\n\t    if (!addCount && hunk.newLines === 1) {\n\t      hunk.newLines = 0;\n\t    }\n\t    if (!removeCount && hunk.oldLines === 1) {\n\t      hunk.oldLines = 0;\n\t    }\n\n\t    // Perform optional sanity checking\n\t    if (options.strict) {\n\t      if (addCount !== hunk.newLines) {\n\t        throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n\t      }\n\t      if (removeCount !== hunk.oldLines) {\n\t        throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));\n\t      }\n\t    }\n\n\t    return hunk;\n\t  }\n\n\t  while (i < diffstr.length) {\n\t    parseIndex();\n\t  }\n\n\t  return list;\n\t}\n\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\n\texports[\"default\"] = /*istanbul ignore end*/function (start, minLine, maxLine) {\n\t  var wantForward = true,\n\t      backwardExhausted = false,\n\t      forwardExhausted = false,\n\t      localOffset = 1;\n\n\t  return function iterator() {\n\t    if (wantForward && !forwardExhausted) {\n\t      if (backwardExhausted) {\n\t        localOffset++;\n\t      } else {\n\t        wantForward = false;\n\t      }\n\n\t      // Check if trying to fit beyond text length, and if not, check it fits\n\t      // after offset location (or desired location on first iteration)\n\t      if (start + localOffset <= maxLine) {\n\t        return localOffset;\n\t      }\n\n\t      forwardExhausted = true;\n\t    }\n\n\t    if (!backwardExhausted) {\n\t      if (!forwardExhausted) {\n\t        wantForward = true;\n\t      }\n\n\t      // Check if trying to fit before text beginning, and if not, check it fits\n\t      // before offset location\n\t      if (minLine <= start - localOffset) {\n\t        return -localOffset++;\n\t      }\n\n\t      backwardExhausted = true;\n\t      return iterator();\n\t    }\n\n\t    // We tried to fit hunk before text beginning and beyond text length, then\n\t    // hunk can't fit on the text. Return undefined\n\t  };\n\t};\n\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/calcLineCount = calcLineCount;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge;\n\n\tvar /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;\n\n\tvar /*istanbul ignore start*/_array = __webpack_require__(15) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\t/*istanbul ignore end*/function calcLineCount(hunk) {\n\t  /*istanbul ignore start*/var _calcOldNewLineCount = /*istanbul ignore end*/calcOldNewLineCount(hunk.lines),\n\t      oldLines = _calcOldNewLineCount.oldLines,\n\t      newLines = _calcOldNewLineCount.newLines;\n\n\t  if (oldLines !== undefined) {\n\t    hunk.oldLines = oldLines;\n\t  } else {\n\t    delete hunk.oldLines;\n\t  }\n\n\t  if (newLines !== undefined) {\n\t    hunk.newLines = newLines;\n\t  } else {\n\t    delete hunk.newLines;\n\t  }\n\t}\n\n\tfunction merge(mine, theirs, base) {\n\t  mine = loadPatch(mine, base);\n\t  theirs = loadPatch(theirs, base);\n\n\t  var ret = {};\n\n\t  // For index we just let it pass through as it doesn't have any necessary meaning.\n\t  // Leaving sanity checks on this to the API consumer that may know more about the\n\t  // meaning in their own context.\n\t  if (mine.index || theirs.index) {\n\t    ret.index = mine.index || theirs.index;\n\t  }\n\n\t  if (mine.newFileName || theirs.newFileName) {\n\t    if (!fileNameChanged(mine)) {\n\t      // No header or no change in ours, use theirs (and ours if theirs does not exist)\n\t      ret.oldFileName = theirs.oldFileName || mine.oldFileName;\n\t      ret.newFileName = theirs.newFileName || mine.newFileName;\n\t      ret.oldHeader = theirs.oldHeader || mine.oldHeader;\n\t      ret.newHeader = theirs.newHeader || mine.newHeader;\n\t    } else if (!fileNameChanged(theirs)) {\n\t      // No header or no change in theirs, use ours\n\t      ret.oldFileName = mine.oldFileName;\n\t      ret.newFileName = mine.newFileName;\n\t      ret.oldHeader = mine.oldHeader;\n\t      ret.newHeader = mine.newHeader;\n\t    } else {\n\t      // Both changed... figure it out\n\t      ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);\n\t      ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);\n\t      ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);\n\t      ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);\n\t    }\n\t  }\n\n\t  ret.hunks = [];\n\n\t  var mineIndex = 0,\n\t      theirsIndex = 0,\n\t      mineOffset = 0,\n\t      theirsOffset = 0;\n\n\t  while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {\n\t    var mineCurrent = mine.hunks[mineIndex] || { oldStart: Infinity },\n\t        theirsCurrent = theirs.hunks[theirsIndex] || { oldStart: Infinity };\n\n\t    if (hunkBefore(mineCurrent, theirsCurrent)) {\n\t      // This patch does not overlap with any of the others, yay.\n\t      ret.hunks.push(cloneHunk(mineCurrent, mineOffset));\n\t      mineIndex++;\n\t      theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;\n\t    } else if (hunkBefore(theirsCurrent, mineCurrent)) {\n\t      // This patch does not overlap with any of the others, yay.\n\t      ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));\n\t      theirsIndex++;\n\t      mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;\n\t    } else {\n\t      // Overlap, merge as best we can\n\t      var mergedHunk = {\n\t        oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),\n\t        oldLines: 0,\n\t        newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),\n\t        newLines: 0,\n\t        lines: []\n\t      };\n\t      mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);\n\t      theirsIndex++;\n\t      mineIndex++;\n\n\t      ret.hunks.push(mergedHunk);\n\t    }\n\t  }\n\n\t  return ret;\n\t}\n\n\tfunction loadPatch(param, base) {\n\t  if (typeof param === 'string') {\n\t    if (/^@@/m.test(param) || /^Index:/m.test(param)) {\n\t      return (/*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(param)[0]\n\t      );\n\t    }\n\n\t    if (!base) {\n\t      throw new Error('Must provide a base reference or pass in a patch');\n\t    }\n\t    return (/*istanbul ignore start*/(0, _create.structuredPatch) /*istanbul ignore end*/(undefined, undefined, base, param)\n\t    );\n\t  }\n\n\t  return param;\n\t}\n\n\tfunction fileNameChanged(patch) {\n\t  return patch.newFileName && patch.newFileName !== patch.oldFileName;\n\t}\n\n\tfunction selectField(index, mine, theirs) {\n\t  if (mine === theirs) {\n\t    return mine;\n\t  } else {\n\t    index.conflict = true;\n\t    return { mine: mine, theirs: theirs };\n\t  }\n\t}\n\n\tfunction hunkBefore(test, check) {\n\t  return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;\n\t}\n\n\tfunction cloneHunk(hunk, offset) {\n\t  return {\n\t    oldStart: hunk.oldStart, oldLines: hunk.oldLines,\n\t    newStart: hunk.newStart + offset, newLines: hunk.newLines,\n\t    lines: hunk.lines\n\t  };\n\t}\n\n\tfunction mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {\n\t  // This will generally result in a conflicted hunk, but there are cases where the context\n\t  // is the only overlap where we can successfully merge the content here.\n\t  var mine = { offset: mineOffset, lines: mineLines, index: 0 },\n\t      their = { offset: theirOffset, lines: theirLines, index: 0 };\n\n\t  // Handle any leading content\n\t  insertLeading(hunk, mine, their);\n\t  insertLeading(hunk, their, mine);\n\n\t  // Now in the overlap content. Scan through and select the best changes from each.\n\t  while (mine.index < mine.lines.length && their.index < their.lines.length) {\n\t    var mineCurrent = mine.lines[mine.index],\n\t        theirCurrent = their.lines[their.index];\n\n\t    if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {\n\t      // Both modified ...\n\t      mutualChange(hunk, mine, their);\n\t    } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {\n\t      /*istanbul ignore start*/var _hunk$lines;\n\n\t      /*istanbul ignore end*/ // Mine inserted\n\t      /*istanbul ignore start*/(_hunk$lines = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(mine)));\n\t    } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {\n\t      /*istanbul ignore start*/var _hunk$lines2;\n\n\t      /*istanbul ignore end*/ // Theirs inserted\n\t      /*istanbul ignore start*/(_hunk$lines2 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(their)));\n\t    } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {\n\t      // Mine removed or edited\n\t      removal(hunk, mine, their);\n\t    } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {\n\t      // Their removed or edited\n\t      removal(hunk, their, mine, true);\n\t    } else if (mineCurrent === theirCurrent) {\n\t      // Context identity\n\t      hunk.lines.push(mineCurrent);\n\t      mine.index++;\n\t      their.index++;\n\t    } else {\n\t      // Context mismatch\n\t      conflict(hunk, collectChange(mine), collectChange(their));\n\t    }\n\t  }\n\n\t  // Now push anything that may be remaining\n\t  insertTrailing(hunk, mine);\n\t  insertTrailing(hunk, their);\n\n\t  calcLineCount(hunk);\n\t}\n\n\tfunction mutualChange(hunk, mine, their) {\n\t  var myChanges = collectChange(mine),\n\t      theirChanges = collectChange(their);\n\n\t  if (allRemoves(myChanges) && allRemoves(theirChanges)) {\n\t    // Special case for remove changes that are supersets of one another\n\t    if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {\n\t      /*istanbul ignore start*/var _hunk$lines3;\n\n\t      /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines3 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges));\n\t      return;\n\t    } else if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {\n\t      /*istanbul ignore start*/var _hunk$lines4;\n\n\t      /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines4 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines4 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges));\n\t      return;\n\t    }\n\t  } else if ( /*istanbul ignore start*/(0, _array.arrayEqual) /*istanbul ignore end*/(myChanges, theirChanges)) {\n\t    /*istanbul ignore start*/var _hunk$lines5;\n\n\t    /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines5 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines5 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges));\n\t    return;\n\t  }\n\n\t  conflict(hunk, myChanges, theirChanges);\n\t}\n\n\tfunction removal(hunk, mine, their, swap) {\n\t  var myChanges = collectChange(mine),\n\t      theirChanges = collectContext(their, myChanges);\n\t  if (theirChanges.merged) {\n\t    /*istanbul ignore start*/var _hunk$lines6;\n\n\t    /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines6 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines6 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges.merged));\n\t  } else {\n\t    conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);\n\t  }\n\t}\n\n\tfunction conflict(hunk, mine, their) {\n\t  hunk.conflict = true;\n\t  hunk.lines.push({\n\t    conflict: true,\n\t    mine: mine,\n\t    theirs: their\n\t  });\n\t}\n\n\tfunction insertLeading(hunk, insert, their) {\n\t  while (insert.offset < their.offset && insert.index < insert.lines.length) {\n\t    var line = insert.lines[insert.index++];\n\t    hunk.lines.push(line);\n\t    insert.offset++;\n\t  }\n\t}\n\tfunction insertTrailing(hunk, insert) {\n\t  while (insert.index < insert.lines.length) {\n\t    var line = insert.lines[insert.index++];\n\t    hunk.lines.push(line);\n\t  }\n\t}\n\n\tfunction collectChange(state) {\n\t  var ret = [],\n\t      operation = state.lines[state.index][0];\n\t  while (state.index < state.lines.length) {\n\t    var line = state.lines[state.index];\n\n\t    // Group additions that are immediately after subtractions and treat them as one \"atomic\" modify change.\n\t    if (operation === '-' && line[0] === '+') {\n\t      operation = '+';\n\t    }\n\n\t    if (operation === line[0]) {\n\t      ret.push(line);\n\t      state.index++;\n\t    } else {\n\t      break;\n\t    }\n\t  }\n\n\t  return ret;\n\t}\n\tfunction collectContext(state, matchChanges) {\n\t  var changes = [],\n\t      merged = [],\n\t      matchIndex = 0,\n\t      contextChanges = false,\n\t      conflicted = false;\n\t  while (matchIndex < matchChanges.length && state.index < state.lines.length) {\n\t    var change = state.lines[state.index],\n\t        match = matchChanges[matchIndex];\n\n\t    // Once we've hit our add, then we are done\n\t    if (match[0] === '+') {\n\t      break;\n\t    }\n\n\t    contextChanges = contextChanges || change[0] !== ' ';\n\n\t    merged.push(match);\n\t    matchIndex++;\n\n\t    // Consume any additions in the other block as a conflict to attempt\n\t    // to pull in the remaining context after this\n\t    if (change[0] === '+') {\n\t      conflicted = true;\n\n\t      while (change[0] === '+') {\n\t        changes.push(change);\n\t        change = state.lines[++state.index];\n\t      }\n\t    }\n\n\t    if (match.substr(1) === change.substr(1)) {\n\t      changes.push(change);\n\t      state.index++;\n\t    } else {\n\t      conflicted = true;\n\t    }\n\t  }\n\n\t  if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {\n\t    conflicted = true;\n\t  }\n\n\t  if (conflicted) {\n\t    return changes;\n\t  }\n\n\t  while (matchIndex < matchChanges.length) {\n\t    merged.push(matchChanges[matchIndex++]);\n\t  }\n\n\t  return {\n\t    merged: merged,\n\t    changes: changes\n\t  };\n\t}\n\n\tfunction allRemoves(changes) {\n\t  return changes.reduce(function (prev, change) {\n\t    return prev && change[0] === '-';\n\t  }, true);\n\t}\n\tfunction skipRemoveSuperset(state, removeChanges, delta) {\n\t  for (var i = 0; i < delta; i++) {\n\t    var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);\n\t    if (state.lines[state.index + i] !== ' ' + changeContent) {\n\t      return false;\n\t    }\n\t  }\n\n\t  state.index += delta;\n\t  return true;\n\t}\n\n\tfunction calcOldNewLineCount(lines) {\n\t  var oldLines = 0;\n\t  var newLines = 0;\n\n\t  lines.forEach(function (line) {\n\t    if (typeof line !== 'string') {\n\t      var myCount = calcOldNewLineCount(line.mine);\n\t      var theirCount = calcOldNewLineCount(line.theirs);\n\n\t      if (oldLines !== undefined) {\n\t        if (myCount.oldLines === theirCount.oldLines) {\n\t          oldLines += myCount.oldLines;\n\t        } else {\n\t          oldLines = undefined;\n\t        }\n\t      }\n\n\t      if (newLines !== undefined) {\n\t        if (myCount.newLines === theirCount.newLines) {\n\t          newLines += myCount.newLines;\n\t        } else {\n\t          newLines = undefined;\n\t        }\n\t      }\n\t    } else {\n\t      if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {\n\t        newLines++;\n\t      }\n\t      if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {\n\t        oldLines++;\n\t      }\n\t    }\n\t  });\n\n\t  return { oldLines: oldLines, newLines: newLines };\n\t}\n\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/structuredPatch = structuredPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch;\n\n\tvar /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;\n\n\t/*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\t/*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  if (!options) {\n\t    options = {};\n\t  }\n\t  if (typeof options.context === 'undefined') {\n\t    options.context = 4;\n\t  }\n\n\t  var diff = /*istanbul ignore start*/(0, _line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options);\n\t  diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier\n\n\t  function contextLines(lines) {\n\t    return lines.map(function (entry) {\n\t      return ' ' + entry;\n\t    });\n\t  }\n\n\t  var hunks = [];\n\t  var oldRangeStart = 0,\n\t      newRangeStart = 0,\n\t      curRange = [],\n\t      oldLine = 1,\n\t      newLine = 1;\n\n\t  /*istanbul ignore start*/var _loop = function _loop( /*istanbul ignore end*/i) {\n\t    var current = diff[i],\n\t        lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\n\t    current.lines = lines;\n\n\t    if (current.added || current.removed) {\n\t      /*istanbul ignore start*/var _curRange;\n\n\t      /*istanbul ignore end*/ // If we have previous context, start with that\n\t      if (!oldRangeStart) {\n\t        var prev = diff[i - 1];\n\t        oldRangeStart = oldLine;\n\t        newRangeStart = newLine;\n\n\t        if (prev) {\n\t          curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];\n\t          oldRangeStart -= curRange.length;\n\t          newRangeStart -= curRange.length;\n\t        }\n\t      }\n\n\t      // Output our changes\n\t      /*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) {\n\t        return (current.added ? '+' : '-') + entry;\n\t      })));\n\n\t      // Track the updated file position\n\t      if (current.added) {\n\t        newLine += lines.length;\n\t      } else {\n\t        oldLine += lines.length;\n\t      }\n\t    } else {\n\t      // Identical context lines. Track line changes\n\t      if (oldRangeStart) {\n\t        // Close out any changes that have been output (or join overlapping)\n\t        if (lines.length <= options.context * 2 && i < diff.length - 2) {\n\t          /*istanbul ignore start*/var _curRange2;\n\n\t          /*istanbul ignore end*/ // Overlapping\n\t          /*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines)));\n\t        } else {\n\t          /*istanbul ignore start*/var _curRange3;\n\n\t          /*istanbul ignore end*/ // end the range and output\n\t          var contextSize = Math.min(lines.length, options.context);\n\t          /*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize))));\n\n\t          var hunk = {\n\t            oldStart: oldRangeStart,\n\t            oldLines: oldLine - oldRangeStart + contextSize,\n\t            newStart: newRangeStart,\n\t            newLines: newLine - newRangeStart + contextSize,\n\t            lines: curRange\n\t          };\n\t          if (i >= diff.length - 2 && lines.length <= options.context) {\n\t            // EOF is inside this hunk\n\t            var oldEOFNewline = /\\n$/.test(oldStr);\n\t            var newEOFNewline = /\\n$/.test(newStr);\n\t            if (lines.length == 0 && !oldEOFNewline) {\n\t              // special case: old has no eol and no trailing context; no-nl can end up before adds\n\t              curRange.splice(hunk.oldLines, 0, '\\\\ No newline at end of file');\n\t            } else if (!oldEOFNewline || !newEOFNewline) {\n\t              curRange.push('\\\\ No newline at end of file');\n\t            }\n\t          }\n\t          hunks.push(hunk);\n\n\t          oldRangeStart = 0;\n\t          newRangeStart = 0;\n\t          curRange = [];\n\t        }\n\t      }\n\t      oldLine += lines.length;\n\t      newLine += lines.length;\n\t    }\n\t  };\n\n\t  for (var i = 0; i < diff.length; i++) {\n\t    /*istanbul ignore start*/_loop( /*istanbul ignore end*/i);\n\t  }\n\n\t  return {\n\t    oldFileName: oldFileName, newFileName: newFileName,\n\t    oldHeader: oldHeader, newHeader: newHeader,\n\t    hunks: hunks\n\t  };\n\t}\n\n\tfunction createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options);\n\n\t  var ret = [];\n\t  if (oldFileName == newFileName) {\n\t    ret.push('Index: ' + oldFileName);\n\t  }\n\t  ret.push('===================================================================');\n\t  ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\\t' + diff.oldHeader));\n\t  ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\\t' + diff.newHeader));\n\n\t  for (var i = 0; i < diff.hunks.length; i++) {\n\t    var hunk = diff.hunks[i];\n\t    ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');\n\t    ret.push.apply(ret, hunk.lines);\n\t  }\n\n\t  return ret.join('\\n') + '\\n';\n\t}\n\n\tfunction createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {\n\t  return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);\n\t}\n\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/arrayEqual = arrayEqual;\n\t/*istanbul ignore start*/exports. /*istanbul ignore end*/arrayStartsWith = arrayStartsWith;\n\tfunction arrayEqual(a, b) {\n\t  if (a.length !== b.length) {\n\t    return false;\n\t  }\n\n\t  return arrayStartsWith(a, b);\n\t}\n\n\tfunction arrayStartsWith(array, start) {\n\t  if (start.length > array.length) {\n\t    return false;\n\t  }\n\n\t  for (var i = 0; i < start.length; i++) {\n\t    if (start[i] !== array[i]) {\n\t      return false;\n\t    }\n\t  }\n\n\t  return true;\n\t}\n\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/\"use strict\";\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP;\n\t// See: http://code.google.com/p/google-diff-match-patch/wiki/API\n\tfunction convertChangesToDMP(changes) {\n\t  var ret = [],\n\t      change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,\n\t      operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;\n\t  for (var i = 0; i < changes.length; i++) {\n\t    change = changes[i];\n\t    if (change.added) {\n\t      operation = 1;\n\t    } else if (change.removed) {\n\t      operation = -1;\n\t    } else {\n\t      operation = 0;\n\t    }\n\n\t    ret.push([operation, change.value]);\n\t  }\n\t  return ret;\n\t}\n\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\n\t/*istanbul ignore start*/'use strict';\n\n\texports.__esModule = true;\n\texports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML;\n\tfunction convertChangesToXML(changes) {\n\t  var ret = [];\n\t  for (var i = 0; i < changes.length; i++) {\n\t    var change = changes[i];\n\t    if (change.added) {\n\t      ret.push('<ins>');\n\t    } else if (change.removed) {\n\t      ret.push('<del>');\n\t    }\n\n\t    ret.push(escapeHTML(change.value));\n\n\t    if (change.added) {\n\t      ret.push('</ins>');\n\t    } else if (change.removed) {\n\t      ret.push('</del>');\n\t    }\n\t  }\n\t  return ret.join('');\n\t}\n\n\tfunction escapeHTML(s) {\n\t  var n = s;\n\t  n = n.replace(/&/g, '&amp;');\n\t  n = n.replace(/</g, '&lt;');\n\t  n = n.replace(/>/g, '&gt;');\n\t  n = n.replace(/\"/g, '&quot;');\n\n\t  return n;\n\t}\n\n\n\n/***/ })\n/******/ ])\n});\n;\n},{}],70:[function(require,module,exports){\nmodule.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n},{}],71:[function(require,module,exports){\nmodule.exports = extend;\n\n/*\n  var obj = {a: 3, b: 5};\n  extend(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}\n  obj; // {a: 4, b: 5, c: 8}\n\n  var obj = {a: 3, b: 5};\n  extend({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8}\n  obj; // {a: 3, b: 5}\n\n  var arr = [1, 2, 3];\n  var obj = {a: 3, b: 5};\n  extend(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}\n  arr.push(4);\n  obj; // {a: 3, b: 5, c: [1, 2, 3, 4]}\n\n  var arr = [1, 2, 3];\n  var obj = {a: 3, b: 5};\n  extend(true, obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]}\n  arr.push(4);\n  obj; // {a: 3, b: 5, c: [1, 2, 3]}\n\n  extend({a: 4, b: 5}); // {a: 4, b: 5}\n  extend({a: 4, b: 5}, 3); {a: 4, b: 5}\n  extend({a: 4, b: 5}, true); {a: 4, b: 5}\n  extend('hello', {a: 4, b: 5}); // throws\n  extend(3, {a: 4, b: 5}); // throws\n*/\n\nfunction extend(/* [deep], obj1, obj2, [objn] */) {\n  var args = [].slice.call(arguments);\n  var deep = false;\n  if (typeof args[0] == 'boolean') {\n    deep = args.shift();\n  }\n  var result = args[0];\n  if (!result || (typeof result != 'object' && typeof result != 'function')) {\n    throw new Error('extendee must be an object');\n  }\n  var extenders = args.slice(1);\n  var len = extenders.length;\n  for (var i = 0; i < len; i++) {\n    var extender = extenders[i];\n    for (var key in extender) {\n      if (extender.hasOwnProperty(key)) {\n        var value = extender[key];\n        if (deep && isCloneable(value)) {\n          var base = Array.isArray(value) ? [] : {};\n          result[key] = extend(true, result.hasOwnProperty(key) ? result[key] : base, value);\n        } else {\n          result[key] = value;\n        }\n      }\n    }\n  }\n  return result;\n}\n\nfunction isCloneable(obj) {\n  return Array.isArray(obj) || {}.toString.call(obj) == '[object Object]';\n}\n\n},{}],72:[function(require,module,exports){\n(function (global){\n/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.11';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim = /^\\s+|\\s+$/g,\n      reTrimStart = /^\\s+/,\n      reTrimEnd = /\\s+$/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n\n        return result;\n      }\n\n      if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n\n        return result;\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        if (isObject(srcValue)) {\n          stack || (stack = new Stack);\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      var index = -1;\n      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array == null ? 0 : array.length,\n          valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(array);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = value.replace(reTrim, '');\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      var sourceURL = '//# sourceURL=' +\n        ('sourceURL' in options\n          ? options.sourceURL\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrim, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimEnd, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = (lodashFunc.name + ''),\n            names = realNames[key] || (realNames[key] = []);\n\n        names.push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],73:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nfunction withGlobal(_global) {\n    var userAgent = _global.navigator && _global.navigator.userAgent;\n    var isRunningInIE = userAgent && userAgent.indexOf(\"MSIE \") > -1;\n    var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint\n\n    // Make properties writable in IE, as per\n    // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html\n    if (isRunningInIE) {\n        _global.setTimeout = _global.setTimeout;\n        _global.clearTimeout = _global.clearTimeout;\n        _global.setInterval = _global.setInterval;\n        _global.clearInterval = _global.clearInterval;\n        _global.Date = _global.Date;\n    }\n\n    // setImmediate is not a standard function\n    // avoid adding the prop to the window object if not present\n    if (_global.setImmediate !== undefined) {\n        _global.setImmediate = _global.setImmediate;\n        _global.clearImmediate = _global.clearImmediate;\n    }\n\n    // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()\n    // browsers, a number.\n    // see https://github.com/cjohansen/Sinon.JS/pull/436\n\n    var NOOP = function () { return undefined; };\n    var timeoutResult = _global.setTimeout(NOOP, 0);\n    var addTimerReturnsObject = typeof timeoutResult === \"object\";\n    var hrtimePresent = (_global.process && typeof _global.process.hrtime === \"function\");\n    var nextTickPresent = (_global.process && typeof _global.process.nextTick === \"function\");\n    var performancePresent = (_global.performance && typeof _global.performance.now === \"function\");\n    var hasPerformancePrototype = (_global.Performance && (typeof _global.Performance).match(/^(function|object)$/));\n    var queueMicrotaskPresent = (typeof _global.queueMicrotask === \"function\");\n    var requestAnimationFramePresent = (\n        _global.requestAnimationFrame && typeof _global.requestAnimationFrame === \"function\"\n    );\n    var cancelAnimationFramePresent = (\n        _global.cancelAnimationFrame && typeof _global.cancelAnimationFrame === \"function\"\n    );\n    var requestIdleCallbackPresent = (\n        _global.requestIdleCallback && typeof _global.requestIdleCallback === \"function\"\n    );\n    var cancelIdleCallbackPresent = (\n        _global.cancelIdleCallback && typeof _global.cancelIdleCallback === \"function\"\n    );\n\n    _global.clearTimeout(timeoutResult);\n\n    var NativeDate = _global.Date;\n    var uniqueTimerId = 1;\n\n    function isNumberFinite(num) {\n        if (Number.isFinite) {\n            return Number.isFinite(num);\n        }\n\n        if (typeof num !== \"number\") {\n            return false;\n        }\n\n        return isFinite(num);\n    }\n\n    /**\n     * Parse strings like \"01:10:00\" (meaning 1 hour, 10 minutes, 0 seconds) into\n     * number of milliseconds. This is used to support human-readable strings passed\n     * to clock.tick()\n     */\n    function parseTime(str) {\n        if (!str) {\n            return 0;\n        }\n\n        var strings = str.split(\":\");\n        var l = strings.length;\n        var i = l;\n        var ms = 0;\n        var parsed;\n\n        if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n            throw new Error(\"tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits\");\n        }\n\n        while (i--) {\n            parsed = parseInt(strings[i], 10);\n\n            if (parsed >= 60) {\n                throw new Error(\"Invalid time \" + str);\n            }\n\n            ms += parsed * Math.pow(60, (l - i - 1));\n        }\n\n        return ms * 1000;\n    }\n\n    /**\n     * Get the decimal part of the millisecond value as nanoseconds\n     *\n     * @param {Number} msFloat the number of milliseconds\n     * @returns {Number} an integer number of nanoseconds in the range [0,1e6)\n     *\n     * Example: nanoRemainer(123.456789) -> 456789\n     */\n    function nanoRemainder(msFloat) {\n        var modulo = 1e6;\n        var remainder = (msFloat * 1e6) % modulo;\n        var positiveRemainder = remainder < 0 ? remainder + modulo : remainder;\n\n        return Math.floor(positiveRemainder);\n    }\n\n    /**\n     * Used to grok the `now` parameter to createClock.\n     * @param epoch {Date|number} the system time\n     */\n    function getEpoch(epoch) {\n        if (!epoch) { return 0; }\n        if (typeof epoch.getTime === \"function\") { return epoch.getTime(); }\n        if (typeof epoch === \"number\") { return epoch; }\n        throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n    }\n\n    function inRange(from, to, timer) {\n        return timer && timer.callAt >= from && timer.callAt <= to;\n    }\n\n    function mirrorDateProperties(target, source) {\n        var prop;\n        for (prop in source) {\n            if (source.hasOwnProperty(prop)) {\n                target[prop] = source[prop];\n            }\n        }\n\n        // set special now implementation\n        if (source.now) {\n            target.now = function now() {\n                return target.clock.now;\n            };\n        } else {\n            delete target.now;\n        }\n\n        // set special toSource implementation\n        if (source.toSource) {\n            target.toSource = function toSource() {\n                return source.toSource();\n            };\n        } else {\n            delete target.toSource;\n        }\n\n        // set special toString implementation\n        target.toString = function toString() {\n            return source.toString();\n        };\n\n        target.prototype = source.prototype;\n        target.parse = source.parse;\n        target.UTC = source.UTC;\n        target.prototype.toUTCString = source.prototype.toUTCString;\n\n        return target;\n    }\n\n    function createDate() {\n        function ClockDate(year, month, date, hour, minute, second, ms) {\n            // Defensive and verbose to avoid potential harm in passing\n            // explicit undefined when user does not pass argument\n            switch (arguments.length) {\n                case 0:\n                    return new NativeDate(ClockDate.clock.now);\n                case 1:\n                    return new NativeDate(year);\n                case 2:\n                    return new NativeDate(year, month);\n                case 3:\n                    return new NativeDate(year, month, date);\n                case 4:\n                    return new NativeDate(year, month, date, hour);\n                case 5:\n                    return new NativeDate(year, month, date, hour, minute);\n                case 6:\n                    return new NativeDate(year, month, date, hour, minute, second);\n                default:\n                    return new NativeDate(year, month, date, hour, minute, second, ms);\n            }\n        }\n\n        return mirrorDateProperties(ClockDate, NativeDate);\n    }\n\n    function enqueueJob(clock, job) {\n        // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob\n        if (!clock.jobs) {\n            clock.jobs = [];\n        }\n        clock.jobs.push(job);\n    }\n\n    function runJobs(clock) {\n        // runs all microtick-deferred tasks - ecma262/#sec-runjobs\n        if (!clock.jobs) {\n            return;\n        }\n        for (var i = 0; i < clock.jobs.length; i++) {\n            var job = clock.jobs[i];\n            job.func.apply(null, job.args);\n            if (clock.loopLimit && i > clock.loopLimit) {\n                throw new Error(\"Aborting after running \" + clock.loopLimit + \" timers, assuming an infinite loop!\");\n            }\n        }\n        clock.jobs = [];\n    }\n\n    function addTimer(clock, timer) {\n        if (timer.func === undefined) {\n            throw new Error(\"Callback must be provided to timer calls\");\n        }\n\n        timer.type = timer.immediate ? \"Immediate\" : \"Timeout\";\n\n        if (timer.hasOwnProperty(\"delay\")) {\n            if (!isNumberFinite(timer.delay)) {\n                timer.delay = 0;\n            }\n            timer.delay = timer.delay > maxTimeout ? 1 : timer.delay;\n            timer.delay = Math.max(0, timer.delay);\n        }\n\n        if (timer.hasOwnProperty(\"interval\")) {\n            timer.type = \"Interval\";\n            timer.interval = timer.interval > maxTimeout ? 1 : timer.interval;\n        }\n\n        if (timer.hasOwnProperty(\"animation\")) {\n            timer.type = \"AnimationFrame\";\n            timer.animation = true;\n        }\n\n        if (!clock.timers) {\n            clock.timers = {};\n        }\n\n        timer.id = uniqueTimerId++;\n        timer.createdAt = clock.now;\n        timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0));\n\n        clock.timers[timer.id] = timer;\n\n        if (addTimerReturnsObject) {\n            var res = {\n                id: timer.id,\n                ref: function () { return res; },\n                unref: function () { return res; },\n                refresh: function () { return res; }\n            };\n            return res;\n        }\n\n        return timer.id;\n    }\n\n    /* eslint consistent-return: \"off\" */\n    function compareTimers(a, b) {\n        // Sort first by absolute timing\n        if (a.callAt < b.callAt) {\n            return -1;\n        }\n        if (a.callAt > b.callAt) {\n            return 1;\n        }\n\n        // Sort next by immediate, immediate timers take precedence\n        if (a.immediate && !b.immediate) {\n            return -1;\n        }\n        if (!a.immediate && b.immediate) {\n            return 1;\n        }\n\n        // Sort next by creation time, earlier-created timers take precedence\n        if (a.createdAt < b.createdAt) {\n            return -1;\n        }\n        if (a.createdAt > b.createdAt) {\n            return 1;\n        }\n\n        // Sort next by id, lower-id timers take precedence\n        if (a.id < b.id) {\n            return -1;\n        }\n        if (a.id > b.id) {\n            return 1;\n        }\n\n        // As timer ids are unique, no fallback `0` is necessary\n    }\n\n    function firstTimerInRange(clock, from, to) {\n        var timers = clock.timers;\n        var timer = null;\n        var id, isInRange;\n\n        for (id in timers) {\n            if (timers.hasOwnProperty(id)) {\n                isInRange = inRange(from, to, timers[id]);\n\n                if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) {\n                    timer = timers[id];\n                }\n            }\n        }\n\n        return timer;\n    }\n\n    function firstTimer(clock) {\n        var timers = clock.timers;\n        var timer = null;\n        var id;\n\n        for (id in timers) {\n            if (timers.hasOwnProperty(id)) {\n                if (!timer || compareTimers(timer, timers[id]) === 1) {\n                    timer = timers[id];\n                }\n            }\n        }\n\n        return timer;\n    }\n\n    function lastTimer(clock) {\n        var timers = clock.timers;\n        var timer = null;\n        var id;\n\n        for (id in timers) {\n            if (timers.hasOwnProperty(id)) {\n                if (!timer || compareTimers(timer, timers[id]) === -1) {\n                    timer = timers[id];\n                }\n            }\n        }\n\n        return timer;\n    }\n\n    function callTimer(clock, timer) {\n        if (typeof timer.interval === \"number\") {\n            clock.timers[timer.id].callAt += timer.interval;\n        } else {\n            delete clock.timers[timer.id];\n        }\n\n        if (typeof timer.func === \"function\") {\n            timer.func.apply(null, timer.args);\n        } else {\n            /* eslint no-eval: \"off\" */\n            eval(timer.func);\n        }\n    }\n\n    function clearTimer(clock, timerId, ttype) {\n        if (!timerId) {\n            // null appears to be allowed in most browsers, and appears to be\n            // relied upon by some libraries, like Bootstrap carousel\n            return;\n        }\n\n        if (!clock.timers) {\n            clock.timers = {};\n        }\n\n        // in Node, timerId is an object with .ref()/.unref(), and\n        // its .id field is the actual timer id.\n        if (typeof timerId === \"object\") {\n            timerId = timerId.id;\n        }\n\n        if (clock.timers.hasOwnProperty(timerId)) {\n            // check that the ID matches a timer of the correct type\n            var timer = clock.timers[timerId];\n            if (timer.type === ttype) {\n                delete clock.timers[timerId];\n            } else {\n                var clear = ttype === \"AnimationFrame\" ? \"cancelAnimationFrame\" : \"clear\" + ttype;\n                var schedule = timer.type === \"AnimationFrame\" ? \"requestAnimationFrame\" : \"set\" + timer.type;\n                throw new Error(\"Cannot clear timer: timer created with \" + schedule\n                    + \"() but cleared with \" + clear + \"()\");\n            }\n        }\n    }\n\n    function uninstall(clock, target, config) {\n        var method,\n            i,\n            l;\n        var installedHrTime = \"_hrtime\";\n        var installedNextTick = \"_nextTick\";\n\n        for (i = 0, l = clock.methods.length; i < l; i++) {\n            method = clock.methods[i];\n            if (method === \"hrtime\" && target.process) {\n                target.process.hrtime = clock[installedHrTime];\n            } else if (method === \"nextTick\" && target.process) {\n                target.process.nextTick = clock[installedNextTick];\n            } else if (method === \"performance\") {\n                target[method] = clock[\"_\" + method];\n            } else {\n                if (target[method] && target[method].hadOwnProperty) {\n                    target[method] = clock[\"_\" + method];\n                    if (method === \"clearInterval\" && config.shouldAdvanceTime === true) {\n                        target[method](clock.attachedInterval);\n                    }\n                } else {\n                    try {\n                        delete target[method];\n                    } catch (ignore) { /* eslint empty-block: \"off\" */ }\n                }\n            }\n        }\n\n        // Prevent multiple executions which will completely remove these props\n        clock.methods = [];\n\n        // return pending timers, to enable checking what timers remained on uninstall\n        if (!clock.timers) {\n            return [];\n        }\n        return Object.keys(clock.timers).map(function mapper(key) {\n            return clock.timers[key];\n        });\n    }\n\n    function hijackMethod(target, method, clock) {\n        var prop;\n        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);\n        clock[\"_\" + method] = target[method];\n\n        if (method === \"Date\") {\n            var date = mirrorDateProperties(clock[method], target[method]);\n            target[method] = date;\n        } else if (method === \"performance\") {\n            target[method] = clock[method];\n        } else {\n            target[method] = function () {\n                return clock[method].apply(clock, arguments);\n            };\n\n            for (prop in clock[method]) {\n                if (clock[method].hasOwnProperty(prop)) {\n                    target[method][prop] = clock[method][prop];\n                }\n            }\n        }\n\n        target[method].clock = clock;\n    }\n\n    function doIntervalTick(clock, advanceTimeDelta) {\n        clock.tick(advanceTimeDelta);\n    }\n\n    var timers = {\n        setTimeout: _global.setTimeout,\n        clearTimeout: _global.clearTimeout,\n        setImmediate: _global.setImmediate,\n        clearImmediate: _global.clearImmediate,\n        setInterval: _global.setInterval,\n        clearInterval: _global.clearInterval,\n        Date: _global.Date\n    };\n\n    if (hrtimePresent) {\n        timers.hrtime = _global.process.hrtime;\n    }\n\n    if (nextTickPresent) {\n        timers.nextTick = _global.process.nextTick;\n    }\n\n    if (performancePresent) {\n        timers.performance = _global.performance;\n    }\n\n    if (requestAnimationFramePresent) {\n        timers.requestAnimationFrame = _global.requestAnimationFrame;\n    }\n    if (queueMicrotaskPresent) {\n        timers.queueMicrotask = _global.queueMicrotask;\n    }\n\n    if (cancelAnimationFramePresent) {\n        timers.cancelAnimationFrame = _global.cancelAnimationFrame;\n    }\n\n    if (requestIdleCallbackPresent) {\n        timers.requestIdleCallback = _global.requestIdleCallback;\n    }\n\n    if (cancelIdleCallbackPresent) {\n        timers.cancelIdleCallback = _global.cancelIdleCallback;\n    }\n\n    var keys = Object.keys || function (obj) {\n        var ks = [];\n        var key;\n\n        for (key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                ks.push(key);\n            }\n        }\n\n        return ks;\n    };\n\n    /**\n     * @param start {Date|number} the system time - non-integer values are floored\n     * @param loopLimit {number}  maximum number of timers that will be run when calling runAll()\n     */\n    function createClock(start, loopLimit) {\n        start = Math.floor(getEpoch(start));\n        loopLimit = loopLimit || 1000;\n        var nanos = 0;\n        var adjustedSystemTime = [0, 0]; // [millis, nanoremainder]\n\n        if (NativeDate === undefined) {\n            throw new Error(\"The global scope doesn't have a `Date` object\"\n                + \" (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)\");\n        }\n\n        var clock = {\n            now: start,\n            timeouts: {},\n            Date: createDate(),\n            loopLimit: loopLimit\n        };\n\n        clock.Date.clock = clock;\n\n        function getTimeToNextFrame() {\n            return 16 - ((clock.now - start) % 16);\n        }\n\n        function hrtime(prev) {\n            var millisSinceStart = clock.now - adjustedSystemTime[0] - start;\n            var secsSinceStart = Math.floor( millisSinceStart / 1000);\n            var remainderInNanos = (millisSinceStart - secsSinceStart * 1e3 ) * 1e6 + nanos - adjustedSystemTime[1];\n\n            if (Array.isArray(prev)) {\n                if ( prev[1] > 1e9 ) {\n                    throw new TypeError(\"Number of nanoseconds can't exceed a billion\");\n                }\n\n                var oldSecs = prev[0];\n                var nanoDiff = remainderInNanos - prev[1];\n                var secDiff = secsSinceStart - oldSecs;\n\n                if (nanoDiff < 0) {\n                    nanoDiff += 1e9;\n                    secDiff -= 1;\n                }\n\n                return [secDiff, nanoDiff];\n            }\n            return [secsSinceStart, remainderInNanos];\n        }\n\n        clock.requestIdleCallback = function requestIdleCallback(func, timeout) {\n            var timeToNextIdlePeriod = 0;\n\n            if (clock.countTimers() > 0) {\n                timeToNextIdlePeriod = 50; // const for now\n            }\n\n            var result = addTimer(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 2),\n                delay: typeof timeout === \"undefined\" ? timeToNextIdlePeriod : Math.min(timeout, timeToNextIdlePeriod)\n            });\n\n            return result.id || result;\n        };\n\n        clock.cancelIdleCallback = function cancelIdleCallback(timerId) {\n            return clearTimer(clock, timerId, \"Timeout\");\n        };\n\n        clock.setTimeout = function setTimeout(func, timeout) {\n            return addTimer(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 2),\n                delay: timeout\n            });\n        };\n\n        clock.clearTimeout = function clearTimeout(timerId) {\n            return clearTimer(clock, timerId, \"Timeout\");\n        };\n\n        clock.nextTick = function nextTick(func) {\n            return enqueueJob(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 1)\n            });\n        };\n\n        clock.queueMicrotask = function queueMicrotask(func) {\n            return clock.nextTick(func); // explicitly drop additional arguments\n        };\n\n        clock.setInterval = function setInterval(func, timeout) {\n            timeout = parseInt(timeout, 10);\n            return addTimer(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 2),\n                delay: timeout,\n                interval: timeout\n            });\n        };\n\n        clock.clearInterval = function clearInterval(timerId) {\n            return clearTimer(clock, timerId, \"Interval\");\n        };\n\n        clock.setImmediate = function setImmediate(func) {\n            return addTimer(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 1),\n                immediate: true\n            });\n        };\n\n        clock.clearImmediate = function clearImmediate(timerId) {\n            return clearTimer(clock, timerId, \"Immediate\");\n        };\n\n        clock.countTimers = function countTimers() {\n            return Object.keys(clock.timers || {}).length;\n        };\n\n        clock.requestAnimationFrame = function requestAnimationFrame(func) {\n            var result = addTimer(clock, {\n                func: func,\n                delay: getTimeToNextFrame(),\n                args: [clock.now + getTimeToNextFrame()],\n                animation: true\n            });\n\n            return result.id || result;\n        };\n\n        clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) {\n            return clearTimer(clock, timerId, \"AnimationFrame\");\n        };\n\n        clock.runMicrotasks = function runMicrotasks() {\n            runJobs(clock);\n        };\n\n        /**\n         * @param {tickValue} {String|Number} number of milliseconds or a human-readable value like \"01:11:15\"\n        */\n        clock.tick = function tick(tickValue) {\n            var msFloat = typeof tickValue === \"number\" ? tickValue : parseTime(tickValue);\n            var ms = Math.floor(msFloat);\n            var remainder = nanoRemainder(msFloat);\n            var nanosTotal = nanos + remainder;\n            var tickTo = clock.now + ms;\n\n            if (msFloat < 0) {\n                throw new TypeError(\"Negative ticks are not supported\");\n            }\n\n            // adjust for positive overflow\n            if (nanosTotal >= 1e6) {\n                tickTo += 1;\n                nanosTotal -= 1e6;\n            }\n\n            nanos = nanosTotal;\n            var tickFrom = clock.now;\n            var previous = clock.now;\n            var timer, firstException, oldNow;\n\n            clock.duringTick = true;\n\n            // perform microtasks\n            oldNow = clock.now;\n            runJobs(clock);\n            if (oldNow !== clock.now) {\n                // compensate for any setSystemTime() call during microtask callback\n                tickFrom += clock.now - oldNow;\n                tickTo += clock.now - oldNow;\n            }\n\n            // perform each timer in the requested range\n            timer = firstTimerInRange(clock, tickFrom, tickTo);\n            while (timer && tickFrom <= tickTo) {\n                if (clock.timers[timer.id]) {\n                    tickFrom = timer.callAt;\n                    clock.now = timer.callAt;\n                    oldNow = clock.now;\n                    try {\n                        runJobs(clock);\n                        callTimer(clock, timer);\n                    } catch (e) {\n                        firstException = firstException || e;\n                    }\n\n                    // compensate for any setSystemTime() call during timer callback\n                    if (oldNow !== clock.now) {\n                        tickFrom += clock.now - oldNow;\n                        tickTo += clock.now - oldNow;\n                        previous += clock.now - oldNow;\n                    }\n                }\n\n                timer = firstTimerInRange(clock, previous, tickTo);\n                previous = tickFrom;\n            }\n\n            // perform process.nextTick()s again\n            oldNow = clock.now;\n            runJobs(clock);\n            if (oldNow !== clock.now) {\n                // compensate for any setSystemTime() call during process.nextTick() callback\n                tickFrom += clock.now - oldNow;\n                tickTo += clock.now - oldNow;\n            }\n            clock.duringTick = false;\n\n            // corner case: during runJobs, new timers were scheduled which could be in the range [clock.now, tickTo]\n            timer = firstTimerInRange(clock, tickFrom, tickTo);\n            if (timer) {\n                try {\n                    clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range\n                } catch (e) {\n                    firstException = firstException || e;\n                }\n            } else {\n                // no timers remaining in the requested range: move the clock all the way to the end\n                clock.now = tickTo;\n\n                // update nanos\n                nanos = nanosTotal;\n            }\n            if (firstException) {\n                throw firstException;\n            }\n            return clock.now;\n        };\n\n        clock.next = function next() {\n            runJobs(clock);\n            var timer = firstTimer(clock);\n            if (!timer) {\n                return clock.now;\n            }\n\n            clock.duringTick = true;\n            try {\n                clock.now = timer.callAt;\n                callTimer(clock, timer);\n                runJobs(clock);\n                return clock.now;\n            } finally {\n                clock.duringTick = false;\n            }\n        };\n\n        clock.runAll = function runAll() {\n            var numTimers, i;\n            runJobs(clock);\n            for (i = 0; i < clock.loopLimit; i++) {\n                if (!clock.timers) {\n                    return clock.now;\n                }\n\n                numTimers = keys(clock.timers).length;\n                if (numTimers === 0) {\n                    return clock.now;\n                }\n\n                clock.next();\n            }\n\n            throw new Error(\"Aborting after running \" + clock.loopLimit + \" timers, assuming an infinite loop!\");\n        };\n\n        clock.runToFrame = function runToFrame() {\n            return clock.tick(getTimeToNextFrame());\n        };\n\n        clock.runToLast = function runToLast() {\n            var timer = lastTimer(clock);\n            if (!timer) {\n                runJobs(clock);\n                return clock.now;\n            }\n\n            return clock.tick(timer.callAt - clock.now);\n        };\n\n        clock.reset = function reset() {\n            nanos = 0;\n            clock.timers = {};\n            clock.jobs = [];\n            clock.now = start;\n        };\n\n        clock.setSystemTime = function setSystemTime(systemTime) {\n            // determine time difference\n            var newNow = getEpoch(systemTime);\n            var difference = newNow - clock.now;\n            var id, timer;\n\n            adjustedSystemTime[0] = difference;\n            adjustedSystemTime[1] = nanos;\n            // update 'system clock'\n            clock.now = newNow;\n            nanos = 0;\n\n            // update timers and intervals to keep them stable\n            for (id in clock.timers) {\n                if (clock.timers.hasOwnProperty(id)) {\n                    timer = clock.timers[id];\n                    timer.createdAt += difference;\n                    timer.callAt += difference;\n                }\n            }\n        };\n\n        if (performancePresent) {\n            clock.performance = Object.create(null);\n\n            if (hasPerformancePrototype) {\n                var proto = _global.Performance.prototype;\n\n                Object\n                    .getOwnPropertyNames(proto)\n                    .forEach(function (name) {\n                        clock.performance[name] = NOOP;\n                    });\n            }\n\n            clock.performance.now = function lolexNow() {\n                var hrt = hrtime();\n                var millis = (hrt[0] * 1000 + hrt[1] / 1e6);\n                return millis;\n            };\n        }\n\n\n        if (hrtimePresent) {\n            clock.hrtime = hrtime;\n        }\n\n        return clock;\n    }\n\n    /**\n     * @param config {Object} optional config\n     * @param config.target {Object} the target to install timers in (default `window`)\n     * @param config.now {number|Date}  a number (in milliseconds) or a Date object (default epoch)\n     * @param config.toFake {string[]} names of the methods that should be faked.\n     * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll()\n     * @param config.shouldAdvanceTime {Boolean} tells lolex to increment mocked time automatically (default false)\n     * @param config.advanceTimeDelta {Number} increment mocked time every <<advanceTimeDelta>> ms (default: 20ms)\n     */\n    function install(config) {\n        if ( arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === \"number\") {\n            throw new TypeError(\"lolex.install called with \" + String(config) +\n                \" lolex 2.0+ requires an object parameter - see https://github.com/sinonjs/lolex\");\n        }\n        config = typeof config !== \"undefined\" ? config : {};\n        config.shouldAdvanceTime = config.shouldAdvanceTime || false;\n        config.advanceTimeDelta = config.advanceTimeDelta || 20;\n\n        var i, l;\n        var target = config.target || _global;\n        var clock = createClock(config.now, config.loopLimit);\n\n        clock.uninstall = function () {\n            return uninstall(clock, target, config);\n        };\n\n        clock.methods = config.toFake || [];\n\n        if (clock.methods.length === 0) {\n            // do not fake nextTick by default - GitHub#126\n            clock.methods = keys(timers).filter(function (key) {return key !== \"nextTick\";});\n        }\n\n        for (i = 0, l = clock.methods.length; i < l; i++) {\n            if (clock.methods[i] === \"hrtime\") {\n                if (target.process && typeof target.process.hrtime === \"function\") {\n                    hijackMethod(target.process, clock.methods[i], clock);\n                }\n            } else if (clock.methods[i] === \"nextTick\") {\n                if (target.process && typeof target.process.nextTick === \"function\") {\n                    hijackMethod(target.process, clock.methods[i], clock);\n                }\n            } else {\n                if (clock.methods[i] === \"setInterval\" && config.shouldAdvanceTime === true) {\n                    var intervalTick = doIntervalTick.bind(null, clock, config.advanceTimeDelta);\n                    var intervalId = target[clock.methods[i]](\n                        intervalTick,\n                        config.advanceTimeDelta);\n                    clock.attachedInterval = intervalId;\n                }\n                hijackMethod(target, clock.methods[i], clock);\n            }\n        }\n\n        return clock;\n    }\n\n    return {\n        timers: timers,\n        createClock: createClock,\n        install: install,\n        withGlobal: withGlobal\n    };\n}\n\nvar defaultImplementation = withGlobal(global || window);\n\nexports.timers = defaultImplementation.timers;\nexports.createClock = defaultImplementation.createClock;\nexports.install = defaultImplementation.install;\nexports.withGlobal = withGlobal;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],74:[function(require,module,exports){\n\"use strict\";\n\n// cache a reference to setTimeout, so that our reference won't be stubbed out\n// when using fake timers and errors will still get logged\n// https://github.com/cjohansen/Sinon.JS/issues/381\nvar realSetTimeout = setTimeout;\n\nfunction configureLogger(config) {\n    config = config || {};\n    // Function which prints errors.\n    if (!config.hasOwnProperty(\"logger\")) {\n        config.logger = function () { };\n    }\n    // When set to true, any errors logged will be thrown immediately;\n    // If set to false, the errors will be thrown in separate execution frame.\n    if (!config.hasOwnProperty(\"useImmediateExceptions\")) {\n        config.useImmediateExceptions = true;\n    }\n    // wrap realSetTimeout with something we can stub in tests\n    if (!config.hasOwnProperty(\"setTimeout\")) {\n        config.setTimeout = realSetTimeout;\n    }\n\n    return function logError(label, e) {\n        var msg = label + \" threw exception: \";\n        var err = { name: e.name || label, message: e.message || e.toString(), stack: e.stack };\n\n        function throwLoggedError() {\n            err.message = msg + err.message;\n            throw err;\n        }\n\n        config.logger(msg + \"[\" + err.name + \"] \" + err.message);\n\n        if (err.stack) {\n            config.logger(err.stack);\n        }\n\n        if (config.useImmediateExceptions) {\n            throwLoggedError();\n        } else {\n            config.setTimeout(throwLoggedError, 0);\n        }\n    };\n}\n\nmodule.exports = configureLogger;\n\n},{}],75:[function(require,module,exports){\n\"use strict\";\n\nvar Event = require(\"./event\");\n\nfunction CustomEvent(type, customData, target) {\n    this.initEvent(type, false, false, target);\n    this.detail = customData.detail || null;\n}\n\nCustomEvent.prototype = new Event();\n\nCustomEvent.prototype.constructor = CustomEvent;\n\nmodule.exports = CustomEvent;\n\n},{\"./event\":77}],76:[function(require,module,exports){\n\"use strict\";\n\nfunction flattenOptions(options) {\n    if (options !== Object(options)) {\n        return {\n            capture: Boolean(options),\n            once: false,\n            passive: false\n        };\n    }\n    return {\n        capture: Boolean(options.capture),\n        once: Boolean(options.once),\n        passive: Boolean(options.passive)\n    };\n}\nfunction not(fn) {\n    return function () {\n        return !fn.apply(this, arguments);\n    };\n}\nfunction hasListenerFilter(listener, capture) {\n    return function (listenerSpec) {\n        return listenerSpec.capture === capture\n            && listenerSpec.listener === listener;\n    };\n}\n\nvar EventTarget = {\n    // https://dom.spec.whatwg.org/#dom-eventtarget-addeventlistener\n    addEventListener: function addEventListener(event, listener, providedOptions) {\n        // 3. Let capture, passive, and once be the result of flattening more options.\n        // Flatten property before executing step 2,\n        // feture detection is usually based on registering handler with options object,\n        // that has getter defined\n        // addEventListener(\"load\", () => {}, {\n        //    get once() { supportsOnce = true; }\n        // });\n        var options = flattenOptions(providedOptions);\n\n        // 2. If callback is null, then return.\n        if (listener == null) {\n            return;\n        }\n\n        this.eventListeners = this.eventListeners || {};\n        this.eventListeners[event] = this.eventListeners[event] || [];\n\n        // 4. If context object’s associated list of event listener\n        //    does not contain an event listener whose type is type,\n        //    callback is callback, and capture is capture, then append\n        //    a new event listener to it, whose type is type, callback is\n        //    callback, capture is capture, passive is passive, and once is once.\n        if (!this.eventListeners[event].some(hasListenerFilter(listener, options.capture))) {\n            this.eventListeners[event].push({\n                listener: listener,\n                capture: options.capture,\n                once: options.once\n            });\n        }\n    },\n\n    // https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener\n    removeEventListener: function removeEventListener(event, listener, providedOptions) {\n        if (!this.eventListeners || !this.eventListeners[event]) {\n            return;\n        }\n\n        // 2. Let capture be the result of flattening options.\n        var options = flattenOptions(providedOptions);\n\n        // 3. If there is an event listener in the associated list of\n        //    event listeners whose type is type, callback is callback,\n        //    and capture is capture, then set that event listener’s\n        //    removed to true and remove it from the associated list of event listeners.\n        this.eventListeners[event] = this.eventListeners[event]\n            .filter(not(hasListenerFilter(listener, options.capture)));\n    },\n\n    dispatchEvent: function dispatchEvent(event) {\n        if (!this.eventListeners || !this.eventListeners[event.type]) {\n            return Boolean(event.defaultPrevented);\n        }\n\n        var self = this;\n        var type = event.type;\n        var listeners = self.eventListeners[type];\n\n        // Remove listeners, that should be dispatched once\n        // before running dispatch loop to avoid nested dispatch issues\n        self.eventListeners[type] = listeners.filter(function (listenerSpec) {\n            return !listenerSpec.once;\n        });\n        listeners.forEach(function (listenerSpec) {\n            var listener = listenerSpec.listener;\n            if (typeof listener === \"function\") {\n                listener.call(self, event);\n            } else {\n                listener.handleEvent(event);\n            }\n        });\n\n        return Boolean(event.defaultPrevented);\n    }\n};\n\nmodule.exports = EventTarget;\n\n},{}],77:[function(require,module,exports){\n\"use strict\";\n\nfunction Event(type, bubbles, cancelable, target) {\n    this.initEvent(type, bubbles, cancelable, target);\n}\n\nEvent.prototype = {\n    initEvent: function (type, bubbles, cancelable, target) {\n        this.type = type;\n        this.bubbles = bubbles;\n        this.cancelable = cancelable;\n        this.target = target;\n        this.currentTarget = target;\n    },\n\n    stopPropagation: function () {},\n\n    preventDefault: function () {\n        this.defaultPrevented = true;\n    }\n};\n\nmodule.exports = Event;\n\n},{}],78:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {\n    Event: require(\"./event\"),\n    ProgressEvent: require(\"./progress-event\"),\n    CustomEvent: require(\"./custom-event\"),\n    EventTarget: require(\"./event-target\")\n};\n\n},{\"./custom-event\":75,\"./event\":77,\"./event-target\":76,\"./progress-event\":79}],79:[function(require,module,exports){\n\"use strict\";\n\nvar Event = require(\"./event\");\n\nfunction ProgressEvent(type, progressEventRaw, target) {\n    this.initEvent(type, false, false, target);\n    this.loaded = typeof progressEventRaw.loaded === \"number\" ? progressEventRaw.loaded : null;\n    this.total = typeof progressEventRaw.total === \"number\" ? progressEventRaw.total : null;\n    this.lengthComputable = !!progressEventRaw.total;\n}\n\nProgressEvent.prototype = new Event();\n\nProgressEvent.prototype.constructor = ProgressEvent;\n\nmodule.exports = ProgressEvent;\n\n},{\"./event\":77}],80:[function(require,module,exports){\n\"use strict\";\n\nvar lolex = require(\"lolex\");\nvar fakeServer = require(\"./index\");\n\nfunction Server() {}\nServer.prototype = fakeServer;\n\nvar fakeServerWithClock = new Server();\n\nfakeServerWithClock.addRequest = function addRequest(xhr) {\n    if (xhr.async) {\n        if (typeof setTimeout.clock === \"object\") {\n            this.clock = setTimeout.clock;\n        } else {\n            this.clock = lolex.install();\n            this.resetClock = true;\n        }\n\n        if (!this.longestTimeout) {\n            var clockSetTimeout = this.clock.setTimeout;\n            var clockSetInterval = this.clock.setInterval;\n            var server = this;\n\n            this.clock.setTimeout = function (fn, timeout) {\n                server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                return clockSetTimeout.apply(this, arguments);\n            };\n\n            this.clock.setInterval = function (fn, timeout) {\n                server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                return clockSetInterval.apply(this, arguments);\n            };\n        }\n    }\n\n    return fakeServer.addRequest.call(this, xhr);\n};\n\nfakeServerWithClock.respond = function respond() {\n    var returnVal = fakeServer.respond.apply(this, arguments);\n\n    if (this.clock) {\n        this.clock.tick(this.longestTimeout || 0);\n        this.longestTimeout = 0;\n\n        if (this.resetClock) {\n            this.clock.uninstall();\n            this.resetClock = false;\n        }\n    }\n\n    return returnVal;\n};\n\nfakeServerWithClock.restore = function restore() {\n    if (this.clock) {\n        this.clock.uninstall();\n    }\n\n    return fakeServer.restore.apply(this, arguments);\n};\n\nmodule.exports = fakeServerWithClock;\n\n},{\"./index\":82,\"lolex\":86}],81:[function(require,module,exports){\n\"use strict\";\n\nvar formatio = require(\"@sinonjs/formatio\");\n\nvar formatter = formatio.configure({\n    quoteStrings: false,\n    limitChildrenCount: 250\n});\n\nmodule.exports = function format() {\n    return formatter.ascii.apply(formatter, arguments);\n};\n\n},{\"@sinonjs/formatio\":49}],82:[function(require,module,exports){\n\"use strict\";\n\nvar fakeXhr = require(\"../fake-xhr\");\nvar push = [].push;\nvar format = require(\"./format\");\nvar configureLogError = require(\"../configure-logger\");\nvar pathToRegexp = require(\"path-to-regexp\");\n\nvar supportsArrayBuffer = typeof ArrayBuffer !== \"undefined\";\n\nfunction responseArray(handler) {\n    var response = handler;\n\n    if (Object.prototype.toString.call(handler) !== \"[object Array]\") {\n        response = [200, {}, handler];\n    }\n\n    if (typeof response[2] !== \"string\") {\n        if (!supportsArrayBuffer) {\n            throw new TypeError(\"Fake server response body should be a string, but was \" +\n                                typeof response[2]);\n        }\n        else if (!(response[2] instanceof ArrayBuffer)) {\n            throw new TypeError(\"Fake server response body should be a string or ArrayBuffer, but was \" +\n                                typeof response[2]);\n        }\n    }\n\n    return response;\n}\n\nfunction getDefaultWindowLocation() {\n    return { \"host\": \"localhost\", \"protocol\": \"http\" };\n}\n\nfunction getWindowLocation() {\n    if (typeof window === \"undefined\") {\n        // Fallback\n        return getDefaultWindowLocation();\n    }\n\n    if (typeof window.location !== \"undefined\") {\n        // Browsers place location on window\n        return window.location;\n    }\n\n    if ((typeof window.window !== \"undefined\") && (typeof window.window.location !== \"undefined\")) {\n        // React Native on Android places location on window.window\n        return window.window.location;\n    }\n\n    return getDefaultWindowLocation();\n}\n\nfunction matchOne(response, reqMethod, reqUrl) {\n    var rmeth = response.method;\n    var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase();\n    var url = response.url;\n    var matchUrl = !url || url === reqUrl || (typeof url.test === \"function\" && url.test(reqUrl));\n\n    return matchMethod && matchUrl;\n}\n\nfunction match(response, request) {\n    var wloc = getWindowLocation();\n\n    var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\n    var requestUrl = request.url;\n\n    if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n        requestUrl = requestUrl.replace(rCurrLoc, \"\");\n    }\n\n    if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n        if (typeof response.response === \"function\") {\n            var ru = response.url;\n            var args = [request].concat(ru && typeof ru.exec === \"function\" ? ru.exec(requestUrl).slice(1) : []);\n            return response.response.apply(response, args);\n        }\n\n        return true;\n    }\n\n    return false;\n}\n\nfunction incrementRequestCount() {\n    var count = ++this.requestCount;\n\n    this.requested = true;\n\n    this.requestedOnce = count === 1;\n    this.requestedTwice = count === 2;\n    this.requestedThrice = count === 3;\n\n    this.firstRequest = this.getRequest(0);\n    this.secondRequest = this.getRequest(1);\n    this.thirdRequest = this.getRequest(2);\n\n    this.lastRequest = this.getRequest(count - 1);\n}\n\nvar fakeServer = {\n    create: function (config) {\n        var server = Object.create(this);\n        server.configure(config);\n        this.xhr = fakeXhr.useFakeXMLHttpRequest();\n        server.requests = [];\n        server.requestCount = 0;\n        server.queue = [];\n        server.responses = [];\n\n\n        this.xhr.onCreate = function (xhrObj) {\n            xhrObj.unsafeHeadersEnabled = function () {\n                return !(server.unsafeHeadersEnabled === false);\n            };\n            server.addRequest(xhrObj);\n        };\n\n        return server;\n    },\n\n    configure: function (config) {\n        var self = this;\n        var whitelist = {\n            \"autoRespond\": true,\n            \"autoRespondAfter\": true,\n            \"respondImmediately\": true,\n            \"fakeHTTPMethods\": true,\n            \"logger\": true,\n            \"unsafeHeadersEnabled\": true\n        };\n\n        config = config || {};\n\n        Object.keys(config).forEach(function (setting) {\n            if (setting in whitelist) {\n                self[setting] = config[setting];\n            }\n        });\n\n        self.logError = configureLogError(config);\n    },\n\n    addRequest: function addRequest(xhrObj) {\n        var server = this;\n        push.call(this.requests, xhrObj);\n\n        incrementRequestCount.call(this);\n\n        xhrObj.onSend = function () {\n            server.handleRequest(this);\n\n            if (server.respondImmediately) {\n                server.respond();\n            } else if (server.autoRespond && !server.responding) {\n                setTimeout(function () {\n                    server.responding = false;\n                    server.respond();\n                }, server.autoRespondAfter || 10);\n\n                server.responding = true;\n            }\n        };\n    },\n\n    getHTTPMethod: function getHTTPMethod(request) {\n        if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n            var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n            return matches ? matches[1] : request.method;\n        }\n\n        return request.method;\n    },\n\n    handleRequest: function handleRequest(xhr) {\n        if (xhr.async) {\n            push.call(this.queue, xhr);\n        } else {\n            this.processRequest(xhr);\n        }\n    },\n\n    logger: function () {\n        // no-op; override via configure()\n    },\n\n    logError: configureLogError({}),\n\n    log: function log(response, request) {\n        var str;\n\n        str = \"Request:\\n\" + format(request) + \"\\n\\n\";\n        str += \"Response:\\n\" + format(response) + \"\\n\\n\";\n\n        if (typeof this.logger === \"function\") {\n            this.logger(str);\n        }\n    },\n\n    respondWith: function respondWith(method, url, body) {\n        if (arguments.length === 1 && typeof method !== \"function\") {\n            this.response = responseArray(method);\n            return;\n        }\n\n        if (arguments.length === 1) {\n            body = method;\n            url = method = null;\n        }\n\n        if (arguments.length === 2) {\n            body = url;\n            url = method;\n            method = null;\n        }\n\n        push.call(this.responses, {\n            method: method,\n            url: typeof url === \"string\" && url !== \"\" ? pathToRegexp(url) : url,\n            response: typeof body === \"function\" ? body : responseArray(body)\n        });\n    },\n\n    respond: function respond() {\n        if (arguments.length > 0) {\n            this.respondWith.apply(this, arguments);\n        }\n\n        var queue = this.queue || [];\n        var requests = queue.splice(0, queue.length);\n        var self = this;\n\n        requests.forEach(function (request) {\n            self.processRequest(request);\n        });\n    },\n\n    processRequest: function processRequest(request) {\n        try {\n            if (request.aborted) {\n                return;\n            }\n\n            var response = this.response || [404, {}, \"\"];\n\n            if (this.responses) {\n                for (var l = this.responses.length, i = l - 1; i >= 0; i--) {\n                    if (match.call(this, this.responses[i], request)) {\n                        response = this.responses[i].response;\n                        break;\n                    }\n                }\n            }\n\n            if (request.readyState !== 4) {\n                this.log(response, request);\n\n                request.respond(response[0], response[1], response[2]);\n            }\n        } catch (e) {\n            this.logError(\"Fake server request processing\", e);\n        }\n    },\n\n    restore: function restore() {\n        return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n    },\n\n    getRequest: function getRequest(index) {\n        return this.requests[index] || null;\n    },\n\n    reset: function reset() {\n        this.resetBehavior();\n        this.resetHistory();\n    },\n\n    resetBehavior: function resetBehavior() {\n        this.responses.length = this.queue.length = 0;\n    },\n\n    resetHistory: function resetHistory() {\n        this.requests.length = this.requestCount = 0;\n\n        this.requestedOnce = this.requestedTwice = this.requestedThrice = this.requested = false;\n\n        this.firstRequest = this.secondRequest = this.thirdRequest = this.lastRequest = null;\n    }\n};\n\nmodule.exports = fakeServer;\n\n},{\"../configure-logger\":74,\"../fake-xhr\":84,\"./format\":81,\"path-to-regexp\":87}],83:[function(require,module,exports){\n/*global Blob */\n\"use strict\";\n\nexports.isSupported = (function () {\n    try {\n        return !!new Blob();\n    } catch (e) {\n        return false;\n    }\n}());\n\n},{}],84:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar TextEncoder = require(\"@sinonjs/text-encoding\").TextEncoder;\n\nvar configureLogError = require(\"../configure-logger\");\nvar sinonEvent = require(\"../event\");\nvar extend = require(\"just-extend\");\n\nfunction getWorkingXHR(globalScope) {\n    var supportsXHR = typeof globalScope.XMLHttpRequest !== \"undefined\";\n    if (supportsXHR) {\n        return globalScope.XMLHttpRequest;\n    }\n\n    var supportsActiveX = typeof globalScope.ActiveXObject !== \"undefined\";\n    if (supportsActiveX) {\n        return function () {\n            return new globalScope.ActiveXObject(\"MSXML2.XMLHTTP.3.0\");\n        };\n    }\n\n    return false;\n}\n\nvar supportsProgress = typeof ProgressEvent !== \"undefined\";\nvar supportsCustomEvent = typeof CustomEvent !== \"undefined\";\nvar supportsFormData = typeof FormData !== \"undefined\";\nvar supportsArrayBuffer = typeof ArrayBuffer !== \"undefined\";\nvar supportsBlob = require(\"./blob\").isSupported;\nvar isReactNative = global.navigator && global.navigator.product === \"ReactNative\";\nvar sinonXhr = { XMLHttpRequest: global.XMLHttpRequest };\nsinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\nsinonXhr.GlobalActiveXObject = global.ActiveXObject;\nsinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject !== \"undefined\";\nsinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== \"undefined\";\nsinonXhr.workingXHR = getWorkingXHR(global);\nsinonXhr.supportsTimeout =\n    (sinonXhr.supportsXHR && \"timeout\" in (new sinonXhr.GlobalXMLHttpRequest()));\nsinonXhr.supportsCORS = isReactNative ||\n    (sinonXhr.supportsXHR && \"withCredentials\" in (new sinonXhr.GlobalXMLHttpRequest()));\n\n// Ref: https://fetch.spec.whatwg.org/#forbidden-header-name\nvar unsafeHeaders = {\n    \"Accept-Charset\": true,\n    \"Access-Control-Request-Headers\": true,\n    \"Access-Control-Request-Method\": true,\n    \"Accept-Encoding\": true,\n    \"Connection\": true,\n    \"Content-Length\": true,\n    \"Cookie\": true,\n    \"Cookie2\": true,\n    \"Content-Transfer-Encoding\": true,\n    \"Date\": true,\n    \"DNT\": true,\n    \"Expect\": true,\n    \"Host\": true,\n    \"Keep-Alive\": true,\n    \"Origin\": true,\n    \"Referer\": true,\n    \"TE\": true,\n    \"Trailer\": true,\n    \"Transfer-Encoding\": true,\n    \"Upgrade\": true,\n    \"User-Agent\": true,\n    \"Via\": true\n};\n\n\nfunction EventTargetHandler() {\n    var self = this;\n    var events = [\"loadstart\", \"progress\", \"abort\", \"error\", \"load\", \"timeout\", \"loadend\"];\n\n    function addEventListener(eventName) {\n        self.addEventListener(eventName, function (event) {\n            var listener = self[\"on\" + eventName];\n\n            if (listener && typeof listener === \"function\") {\n                listener.call(this, event);\n            }\n        });\n    }\n\n    events.forEach(addEventListener);\n}\n\nEventTargetHandler.prototype = sinonEvent.EventTarget;\n\n// Note that for FakeXMLHttpRequest to work pre ES5\n// we lose some of the alignment with the spec.\n// To ensure as close a match as possible,\n// set responseType before calling open, send or respond;\nfunction FakeXMLHttpRequest(config) {\n    EventTargetHandler.call(this);\n    this.readyState = FakeXMLHttpRequest.UNSENT;\n    this.requestHeaders = {};\n    this.requestBody = null;\n    this.status = 0;\n    this.statusText = \"\";\n    this.upload = new EventTargetHandler();\n    this.responseType = \"\";\n    this.response = \"\";\n    this.logError = configureLogError(config);\n\n    if (sinonXhr.supportsTimeout) {\n        this.timeout = 0;\n    }\n\n    if (sinonXhr.supportsCORS) {\n        this.withCredentials = false;\n    }\n\n    if (typeof FakeXMLHttpRequest.onCreate === \"function\") {\n        FakeXMLHttpRequest.onCreate(this);\n    }\n}\n\nfunction verifyState(xhr) {\n    if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n        throw new Error(\"INVALID_STATE_ERR\");\n    }\n\n    if (xhr.sendFlag) {\n        throw new Error(\"INVALID_STATE_ERR\");\n    }\n}\n\nfunction normalizeHeaderValue(value) {\n    // Ref: https://fetch.spec.whatwg.org/#http-whitespace-bytes\n    /*eslint no-control-regex: \"off\"*/\n    return value.replace(/^[\\x09\\x0A\\x0D\\x20]+|[\\x09\\x0A\\x0D\\x20]+$/g, \"\");\n}\n\nfunction getHeader(headers, header) {\n    var foundHeader = Object.keys(headers).filter(function (h) {\n        return h.toLowerCase() === header.toLowerCase();\n    });\n\n    return foundHeader[0] || null;\n}\n\nfunction excludeSetCookie2Header(header) {\n    return !/^Set-Cookie2?$/i.test(header);\n}\n\n// largest arity in XHR is 5 - XHR#open\nvar apply = function (obj, method, args) {\n    switch (args.length) {\n        case 0: return obj[method]();\n        case 1: return obj[method](args[0]);\n        case 2: return obj[method](args[0], args[1]);\n        case 3: return obj[method](args[0], args[1], args[2]);\n        case 4: return obj[method](args[0], args[1], args[2], args[3]);\n        case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]);\n        default: throw new Error(\"Unhandled case\");\n    }\n};\n\nFakeXMLHttpRequest.filters = [];\nFakeXMLHttpRequest.addFilter = function addFilter(fn) {\n    this.filters.push(fn);\n};\nFakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) {\n    var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap\n\n    [\n        \"open\",\n        \"setRequestHeader\",\n        \"abort\",\n        \"getResponseHeader\",\n        \"getAllResponseHeaders\",\n        \"addEventListener\",\n        \"overrideMimeType\",\n        \"removeEventListener\"\n    ].forEach(function (method) {\n        fakeXhr[method] = function () {\n            return apply(xhr, method, arguments);\n        };\n    });\n\n    fakeXhr.send = function () {\n        // Ref: https://xhr.spec.whatwg.org/#the-responsetype-attribute\n        if (xhr.responseType !== fakeXhr.responseType) {\n            xhr.responseType = fakeXhr.responseType;\n        }\n        return apply(xhr, \"send\", arguments);\n    };\n\n    var copyAttrs = function (args) {\n        args.forEach(function (attr) {\n            fakeXhr[attr] = xhr[attr];\n        });\n    };\n\n    var stateChangeStart = function () {\n        fakeXhr.readyState = xhr.readyState;\n        if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            copyAttrs([\"status\", \"statusText\"]);\n        }\n        if (xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n            copyAttrs([\"response\"]);\n            if (xhr.responseType === \"\" || xhr.responseType === \"text\") {\n                copyAttrs([\"responseText\"]);\n            }\n        }\n        if (\n            xhr.readyState === FakeXMLHttpRequest.DONE &&\n            (xhr.responseType === \"\" || xhr.responseType === \"document\")\n        ) {\n            copyAttrs([\"responseXML\"]);\n        }\n    };\n\n    var stateChangeEnd = function () {\n        if (fakeXhr.onreadystatechange) {\n            fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr, currentTarget: fakeXhr });\n        }\n    };\n\n    var stateChange = function stateChange() {\n        stateChangeStart();\n        stateChangeEnd();\n    };\n\n    if (xhr.addEventListener) {\n        xhr.addEventListener(\"readystatechange\", stateChangeStart);\n\n        Object.keys(fakeXhr.eventListeners).forEach(function (event) {\n            /*eslint-disable no-loop-func*/\n            fakeXhr.eventListeners[event].forEach(function (handler) {\n                xhr.addEventListener(event, handler.listener, {\n                    capture: handler.capture,\n                    once: handler.once\n                });\n            });\n            /*eslint-enable no-loop-func*/\n        });\n\n        xhr.addEventListener(\"readystatechange\", stateChangeEnd);\n    } else {\n        xhr.onreadystatechange = stateChange;\n    }\n    apply(xhr, \"open\", xhrArgs);\n};\nFakeXMLHttpRequest.useFilters = false;\n\nfunction verifyRequestOpened(xhr) {\n    if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n        throw new Error(\"INVALID_STATE_ERR - \" + xhr.readyState);\n    }\n}\n\nfunction verifyRequestSent(xhr) {\n    if (xhr.readyState === FakeXMLHttpRequest.DONE) {\n        throw new Error(\"Request done\");\n    }\n}\n\nfunction verifyHeadersReceived(xhr) {\n    if (xhr.async && xhr.readyState !== FakeXMLHttpRequest.HEADERS_RECEIVED) {\n        throw new Error(\"No headers received\");\n    }\n}\n\nfunction verifyResponseBodyType(body, responseType) {\n    var error = null;\n    var isString = typeof body === \"string\";\n\n    if (responseType === \"arraybuffer\") {\n\n        if (!isString && !(body instanceof ArrayBuffer)) {\n            error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n                               body + \", which is not a string or ArrayBuffer.\");\n            error.name = \"InvalidBodyException\";\n        }\n    }\n    else if (!isString) {\n        error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n                           body + \", which is not a string.\");\n        error.name = \"InvalidBodyException\";\n    }\n\n    if (error) {\n        throw error;\n    }\n}\n\nfunction convertToArrayBuffer(body, encoding) {\n    if (body instanceof ArrayBuffer) {\n        return body;\n    }\n\n    return new TextEncoder(encoding || \"utf-8\").encode(body).buffer;\n}\n\nfunction isXmlContentType(contentType) {\n    return !contentType || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(contentType);\n}\n\nfunction convertResponseBody(responseType, contentType, body) {\n    if (responseType === \"\" || responseType === \"text\") {\n        return body;\n    } else if (supportsArrayBuffer && responseType === \"arraybuffer\") {\n        return convertToArrayBuffer(body);\n    } else if (responseType === \"json\") {\n        try {\n            return JSON.parse(body);\n        } catch (e) {\n            // Return parsing failure as null\n            return null;\n        }\n    } else if (supportsBlob && responseType === \"blob\") {\n        var blobOptions = {};\n        if (contentType) {\n            blobOptions.type = contentType;\n        }\n        return new Blob([convertToArrayBuffer(body)], blobOptions);\n    } else if (responseType === \"document\") {\n        if (isXmlContentType(contentType)) {\n            return FakeXMLHttpRequest.parseXML(body);\n        }\n        return null;\n    }\n    throw new Error(\"Invalid responseType \" + responseType);\n}\n\nfunction clearResponse(xhr) {\n    if (xhr.responseType === \"\" || xhr.responseType === \"text\") {\n        xhr.response = xhr.responseText = \"\";\n    } else {\n        xhr.response = xhr.responseText = null;\n    }\n    xhr.responseXML = null;\n}\n\n/**\n * Steps to follow when there is an error, according to:\n * https://xhr.spec.whatwg.org/#request-error-steps\n */\nfunction requestErrorSteps(xhr) {\n    clearResponse(xhr);\n    xhr.errorFlag = true;\n    xhr.requestHeaders = {};\n    xhr.responseHeaders = {};\n\n    if (xhr.readyState !== FakeXMLHttpRequest.UNSENT && xhr.sendFlag\n        && xhr.readyState !== FakeXMLHttpRequest.DONE) {\n        xhr.readyStateChange(FakeXMLHttpRequest.DONE);\n        xhr.sendFlag = false;\n    }\n}\n\nFakeXMLHttpRequest.parseXML = function parseXML(text) {\n    // Treat empty string as parsing failure\n    if (text !== \"\") {\n        try {\n            if (typeof DOMParser !== \"undefined\") {\n                var parser = new DOMParser();\n                var parsererrorNS = \"\";\n\n                try {\n                    var parsererrors = parser\n                        .parseFromString(\"INVALID\", \"text/xml\")\n                        .getElementsByTagName(\"parsererror\");\n                    if (parsererrors.length) {\n                        parsererrorNS = parsererrors[0].namespaceURI;\n                    }\n                } catch (e) {\n                    // passing invalid XML makes IE11 throw\n                    // so no namespace needs to be determined\n                }\n\n                var result;\n                try {\n                    result = parser.parseFromString(text, \"text/xml\");\n                } catch (err) {\n                    return null;\n                }\n\n                return result.getElementsByTagNameNS(parsererrorNS, \"parsererror\").length\n                    ? null : result;\n            }\n            var xmlDoc = new window.ActiveXObject(\"Microsoft.XMLDOM\");\n            xmlDoc.async = \"false\";\n            xmlDoc.loadXML(text);\n            return xmlDoc.parseError.errorCode !== 0\n                ? null : xmlDoc;\n        } catch (e) {\n            // Unable to parse XML - no biggie\n        }\n    }\n\n    return null;\n};\n\nFakeXMLHttpRequest.statusCodes = {\n    100: \"Continue\",\n    101: \"Switching Protocols\",\n    200: \"OK\",\n    201: \"Created\",\n    202: \"Accepted\",\n    203: \"Non-Authoritative Information\",\n    204: \"No Content\",\n    205: \"Reset Content\",\n    206: \"Partial Content\",\n    207: \"Multi-Status\",\n    300: \"Multiple Choice\",\n    301: \"Moved Permanently\",\n    302: \"Found\",\n    303: \"See Other\",\n    304: \"Not Modified\",\n    305: \"Use Proxy\",\n    307: \"Temporary Redirect\",\n    400: \"Bad Request\",\n    401: \"Unauthorized\",\n    402: \"Payment Required\",\n    403: \"Forbidden\",\n    404: \"Not Found\",\n    405: \"Method Not Allowed\",\n    406: \"Not Acceptable\",\n    407: \"Proxy Authentication Required\",\n    408: \"Request Timeout\",\n    409: \"Conflict\",\n    410: \"Gone\",\n    411: \"Length Required\",\n    412: \"Precondition Failed\",\n    413: \"Request Entity Too Large\",\n    414: \"Request-URI Too Long\",\n    415: \"Unsupported Media Type\",\n    416: \"Requested Range Not Satisfiable\",\n    417: \"Expectation Failed\",\n    422: \"Unprocessable Entity\",\n    500: \"Internal Server Error\",\n    501: \"Not Implemented\",\n    502: \"Bad Gateway\",\n    503: \"Service Unavailable\",\n    504: \"Gateway Timeout\",\n    505: \"HTTP Version Not Supported\"\n};\n\nextend(FakeXMLHttpRequest.prototype, sinonEvent.EventTarget, {\n    async: true,\n\n    open: function open(method, url, async, username, password) {\n        this.method = method;\n        this.url = url;\n        this.async = typeof async === \"boolean\" ? async : true;\n        this.username = username;\n        this.password = password;\n        clearResponse(this);\n        this.requestHeaders = {};\n        this.sendFlag = false;\n\n        if (FakeXMLHttpRequest.useFilters === true) {\n            var xhrArgs = arguments;\n            var defake = FakeXMLHttpRequest.filters.some(function (filter) {\n                return filter.apply(this, xhrArgs);\n            });\n            if (defake) {\n                FakeXMLHttpRequest.defake(this, arguments);\n                return;\n            }\n        }\n        this.readyStateChange(FakeXMLHttpRequest.OPENED);\n    },\n\n    readyStateChange: function readyStateChange(state) {\n        this.readyState = state;\n\n        var readyStateChangeEvent = new sinonEvent.Event(\"readystatechange\", false, false, this);\n        var event, progress;\n\n        if (typeof this.onreadystatechange === \"function\") {\n            try {\n                this.onreadystatechange(readyStateChangeEvent);\n            } catch (e) {\n                this.logError(\"Fake XHR onreadystatechange handler\", e);\n            }\n        }\n\n        if (this.readyState === FakeXMLHttpRequest.DONE) {\n            if (this.timedOut || this.aborted || this.status === 0) {\n                progress = {loaded: 0, total: 0};\n                event = (this.timedOut && \"timeout\") || (this.aborted && \"abort\") || \"error\";\n            } else {\n                progress = {loaded: 100, total: 100};\n                event = \"load\";\n            }\n\n            if (supportsProgress) {\n                this.upload.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progress, this));\n                this.upload.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this));\n                this.upload.dispatchEvent(new sinonEvent.ProgressEvent(\"loadend\", progress, this));\n            }\n\n            this.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progress, this));\n            this.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this));\n            this.dispatchEvent(new sinonEvent.ProgressEvent(\"loadend\", progress, this));\n        }\n\n        this.dispatchEvent(readyStateChangeEvent);\n    },\n\n    // Ref https://xhr.spec.whatwg.org/#the-setrequestheader()-method\n    setRequestHeader: function setRequestHeader(header, value) {\n        if (typeof value !== \"string\") {\n            throw new TypeError(\"By RFC7230, section 3.2.4, header values should be strings. Got \" + typeof value);\n        }\n        verifyState(this);\n\n        var checkUnsafeHeaders = true;\n        if (typeof this.unsafeHeadersEnabled === \"function\") {\n            checkUnsafeHeaders = this.unsafeHeadersEnabled();\n        }\n\n        if (checkUnsafeHeaders && (getHeader(unsafeHeaders, header) !== null || /^(Sec-|Proxy-)/i.test(header))) {\n            throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n        }\n\n        value = normalizeHeaderValue(value);\n\n        var existingHeader = getHeader(this.requestHeaders, header);\n        if (existingHeader) {\n            this.requestHeaders[existingHeader] += \", \" + value;\n        } else {\n            this.requestHeaders[header] = value;\n        }\n    },\n\n    setStatus: function setStatus(status) {\n        var sanitizedStatus = typeof status === \"number\" ? status : 200;\n\n        verifyRequestOpened(this);\n        this.status = sanitizedStatus;\n        this.statusText = FakeXMLHttpRequest.statusCodes[sanitizedStatus];\n    },\n\n    // Helps testing\n    setResponseHeaders: function setResponseHeaders(headers) {\n        verifyRequestOpened(this);\n\n        var responseHeaders = this.responseHeaders = {};\n\n        Object.keys(headers).forEach(function (header) {\n            responseHeaders[header] = headers[header];\n        });\n\n        if (this.async) {\n            this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n        } else {\n            this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n        }\n    },\n\n    // Currently treats ALL data as a DOMString (i.e. no Document)\n    send: function send(data) {\n        verifyState(this);\n\n        if (!/^(head)$/i.test(this.method)) {\n            var contentType = getHeader(this.requestHeaders, \"Content-Type\");\n            if (this.requestHeaders[contentType]) {\n                var value = this.requestHeaders[contentType].split(\";\");\n                this.requestHeaders[contentType] = value[0] + \";charset=utf-8\";\n            } else if (supportsFormData && !(data instanceof FormData)) {\n                this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n            }\n\n            this.requestBody = data;\n        }\n\n        this.errorFlag = false;\n        this.sendFlag = this.async;\n        clearResponse(this);\n        this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\n        if (typeof this.onSend === \"function\") {\n            this.onSend(this);\n        }\n\n        // Only listen if setInterval and Date are a stubbed.\n        if (sinonXhr.supportsTimeout && typeof setInterval.clock === \"object\" && typeof Date.clock === \"object\") {\n            var initiatedTime = Date.now();\n            var self = this;\n\n            // Listen to any possible tick by fake timers and check to see if timeout has\n            // been exceeded. It's important to note that timeout can be changed while a request\n            // is in flight, so we must check anytime the end user forces a clock tick to make\n            // sure timeout hasn't changed.\n            // https://xhr.spec.whatwg.org/#dfnReturnLink-2\n            var clearIntervalId = setInterval(function () {\n                // Check if the readyState has been reset or is done. If this is the case, there\n                // should be no timeout. This will also prevent aborted requests and\n                // fakeServerWithClock from triggering unnecessary responses.\n                if (self.readyState === FakeXMLHttpRequest.UNSENT\n                  || self.readyState === FakeXMLHttpRequest.DONE) {\n                    clearInterval(clearIntervalId);\n                } else if (typeof self.timeout === \"number\" && self.timeout > 0) {\n                    if (Date.now() >= (initiatedTime + self.timeout)) {\n                        self.triggerTimeout();\n                        clearInterval(clearIntervalId);\n                    }\n                }\n            }, 1);\n        }\n\n        this.dispatchEvent(new sinonEvent.Event(\"loadstart\", false, false, this));\n    },\n\n    abort: function abort() {\n        this.aborted = true;\n        requestErrorSteps(this);\n        this.readyState = FakeXMLHttpRequest.UNSENT;\n    },\n\n    error: function () {\n        clearResponse(this);\n        this.errorFlag = true;\n        this.requestHeaders = {};\n        this.responseHeaders = {};\n\n        this.readyStateChange(FakeXMLHttpRequest.DONE);\n    },\n\n    triggerTimeout: function triggerTimeout() {\n        if (sinonXhr.supportsTimeout) {\n            this.timedOut = true;\n            requestErrorSteps(this);\n        }\n    },\n\n    getResponseHeader: function getResponseHeader(header) {\n        if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            return null;\n        }\n\n        if (/^Set-Cookie2?$/i.test(header)) {\n            return null;\n        }\n\n        header = getHeader(this.responseHeaders, header);\n\n        return this.responseHeaders[header] || null;\n    },\n\n    getAllResponseHeaders: function getAllResponseHeaders() {\n        if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            return \"\";\n        }\n\n        var responseHeaders = this.responseHeaders;\n        var headers = Object.keys(responseHeaders)\n            .filter(excludeSetCookie2Header)\n            .reduce(function (prev, header) {\n                var value = responseHeaders[header];\n\n                return prev + (header + \": \" + value + \"\\r\\n\");\n            }, \"\");\n\n        return headers;\n    },\n\n    setResponseBody: function setResponseBody(body) {\n        verifyRequestSent(this);\n        verifyHeadersReceived(this);\n        verifyResponseBodyType(body, this.responseType);\n        var contentType = this.overriddenMimeType || this.getResponseHeader(\"Content-Type\");\n\n        var isTextResponse = this.responseType === \"\" || this.responseType === \"text\";\n        clearResponse(this);\n        if (this.async) {\n            var chunkSize = this.chunkSize || 10;\n            var index = 0;\n\n            do {\n                this.readyStateChange(FakeXMLHttpRequest.LOADING);\n\n                if (isTextResponse) {\n                    this.responseText = this.response += body.substring(index, index + chunkSize);\n                }\n                index += chunkSize;\n            } while (index < body.length);\n        }\n\n        this.response = convertResponseBody(this.responseType, contentType, body);\n        if (isTextResponse) {\n            this.responseText = this.response;\n        }\n\n        if (this.responseType === \"document\") {\n            this.responseXML = this.response;\n        } else if (this.responseType === \"\" && isXmlContentType(contentType)) {\n            this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n        }\n        this.readyStateChange(FakeXMLHttpRequest.DONE);\n    },\n\n    respond: function respond(status, headers, body) {\n        this.setStatus(status);\n        this.setResponseHeaders(headers || {});\n        this.setResponseBody(body || \"\");\n    },\n\n    uploadProgress: function uploadProgress(progressEventRaw) {\n        if (supportsProgress) {\n            this.upload.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progressEventRaw, this.upload));\n        }\n    },\n\n    downloadProgress: function downloadProgress(progressEventRaw) {\n        if (supportsProgress) {\n            this.dispatchEvent(new sinonEvent.ProgressEvent(\"progress\", progressEventRaw, this));\n        }\n    },\n\n    uploadError: function uploadError(error) {\n        if (supportsCustomEvent) {\n            this.upload.dispatchEvent(new sinonEvent.CustomEvent(\"error\", {detail: error}));\n        }\n    },\n\n    overrideMimeType: function overrideMimeType(type) {\n        if (this.readyState >= FakeXMLHttpRequest.LOADING) {\n            throw new Error(\"INVALID_STATE_ERR\");\n        }\n        this.overriddenMimeType = type;\n    }\n});\n\nvar states = {\n    UNSENT: 0,\n    OPENED: 1,\n    HEADERS_RECEIVED: 2,\n    LOADING: 3,\n    DONE: 4\n};\n\nextend(FakeXMLHttpRequest, states);\nextend(FakeXMLHttpRequest.prototype, states);\n\nfunction useFakeXMLHttpRequest() {\n    FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n        if (sinonXhr.supportsXHR) {\n            global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest;\n        }\n\n        if (sinonXhr.supportsActiveX) {\n            global.ActiveXObject = sinonXhr.GlobalActiveXObject;\n        }\n\n        delete FakeXMLHttpRequest.restore;\n\n        if (keepOnCreate !== true) {\n            delete FakeXMLHttpRequest.onCreate;\n        }\n    };\n    if (sinonXhr.supportsXHR) {\n        global.XMLHttpRequest = FakeXMLHttpRequest;\n    }\n\n    if (sinonXhr.supportsActiveX) {\n        global.ActiveXObject = function ActiveXObject(objId) {\n            if (objId === \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\n                return new FakeXMLHttpRequest();\n            }\n\n            return new sinonXhr.GlobalActiveXObject(objId);\n        };\n    }\n\n    return FakeXMLHttpRequest;\n}\n\nmodule.exports = {\n    xhr: sinonXhr,\n    FakeXMLHttpRequest: FakeXMLHttpRequest,\n    useFakeXMLHttpRequest: useFakeXMLHttpRequest\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../configure-logger\":74,\"../event\":78,\"./blob\":83,\"@sinonjs/text-encoding\":66,\"just-extend\":71}],85:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {\n    fakeServer: require(\"./fake-server\"),\n    fakeServerWithClock: require(\"./fake-server/fake-server-with-clock\"),\n    fakeXhr: require(\"./fake-xhr\")\n};\n\n},{\"./fake-server\":82,\"./fake-server/fake-server-with-clock\":80,\"./fake-xhr\":84}],86:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nfunction withGlobal(_global) {\n    var userAgent = _global.navigator && _global.navigator.userAgent;\n    var isRunningInIE = userAgent && userAgent.indexOf(\"MSIE \") > -1;\n    var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint\n\n    // Make properties writable in IE, as per\n    // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html\n    if (isRunningInIE) {\n        _global.setTimeout = _global.setTimeout;\n        _global.clearTimeout = _global.clearTimeout;\n        _global.setInterval = _global.setInterval;\n        _global.clearInterval = _global.clearInterval;\n        _global.Date = _global.Date;\n    }\n\n    // setImmediate is not a standard function\n    // avoid adding the prop to the window object if not present\n    if (_global.setImmediate !== undefined) {\n        _global.setImmediate = _global.setImmediate;\n        _global.clearImmediate = _global.clearImmediate;\n    }\n\n    // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()\n    // browsers, a number.\n    // see https://github.com/cjohansen/Sinon.JS/pull/436\n\n    var NOOP = function () { return undefined; };\n    var timeoutResult = _global.setTimeout(NOOP, 0);\n    var addTimerReturnsObject = typeof timeoutResult === \"object\";\n    var hrtimePresent = (_global.process && typeof _global.process.hrtime === \"function\");\n    var nextTickPresent = (_global.process && typeof _global.process.nextTick === \"function\");\n    var performancePresent = (_global.performance && typeof _global.performance.now === \"function\");\n    var hasPerformancePrototype = (_global.Performance && (typeof _global.Performance).match(/^(function|object)$/));\n    var requestAnimationFramePresent = (\n        _global.requestAnimationFrame && typeof _global.requestAnimationFrame === \"function\"\n    );\n    var cancelAnimationFramePresent = (\n        _global.cancelAnimationFrame && typeof _global.cancelAnimationFrame === \"function\"\n    );\n\n    _global.clearTimeout(timeoutResult);\n\n    var NativeDate = _global.Date;\n    var uniqueTimerId = 1;\n\n    function isNumberFinite(num) {\n        if (Number.isFinite) {\n            return Number.isFinite(num);\n        }\n\n        if (typeof num !== \"number\") {\n            return false;\n        }\n\n        return isFinite(num);\n    }\n\n    /**\n     * Parse strings like \"01:10:00\" (meaning 1 hour, 10 minutes, 0 seconds) into\n     * number of milliseconds. This is used to support human-readable strings passed\n     * to clock.tick()\n     */\n    function parseTime(str) {\n        if (!str) {\n            return 0;\n        }\n\n        var strings = str.split(\":\");\n        var l = strings.length;\n        var i = l;\n        var ms = 0;\n        var parsed;\n\n        if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n            throw new Error(\"tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits\");\n        }\n\n        while (i--) {\n            parsed = parseInt(strings[i], 10);\n\n            if (parsed >= 60) {\n                throw new Error(\"Invalid time \" + str);\n            }\n\n            ms += parsed * Math.pow(60, (l - i - 1));\n        }\n\n        return ms * 1000;\n    }\n\n    /**\n     * Floor function that also works for negative numbers\n     */\n    function fixedFloor(n) {\n        return (n >= 0 ? Math.floor(n) : Math.ceil(n));\n    }\n\n    /**\n     * % operator that also works for negative numbers\n     */\n    function fixedModulo(n, m) {\n        return Math.round(((n % m) + m) % m);\n    }\n\n    /**\n     * Used to grok the `now` parameter to createClock.\n     * @param epoch {Date|number} the system time\n     */\n    function getEpoch(epoch) {\n        if (!epoch) { return 0; }\n        if (typeof epoch.getTime === \"function\") { return epoch.getTime(); }\n        if (typeof epoch === \"number\") { return epoch; }\n        throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n    }\n\n    function inRange(from, to, timer) {\n        return timer && timer.callAt >= from && timer.callAt <= to;\n    }\n\n    function mirrorDateProperties(target, source) {\n        var prop;\n        for (prop in source) {\n            if (source.hasOwnProperty(prop)) {\n                target[prop] = source[prop];\n            }\n        }\n\n        // set special now implementation\n        if (source.now) {\n            target.now = function now() {\n                return target.clock.now;\n            };\n        } else {\n            delete target.now;\n        }\n\n        // set special toSource implementation\n        if (source.toSource) {\n            target.toSource = function toSource() {\n                return source.toSource();\n            };\n        } else {\n            delete target.toSource;\n        }\n\n        // set special toString implementation\n        target.toString = function toString() {\n            return source.toString();\n        };\n\n        target.prototype = source.prototype;\n        target.parse = source.parse;\n        target.UTC = source.UTC;\n        target.prototype.toUTCString = source.prototype.toUTCString;\n\n        return target;\n    }\n\n    function createDate() {\n        function ClockDate(year, month, date, hour, minute, second, ms) {\n            // Defensive and verbose to avoid potential harm in passing\n            // explicit undefined when user does not pass argument\n            switch (arguments.length) {\n                case 0:\n                    return new NativeDate(ClockDate.clock.now);\n                case 1:\n                    return new NativeDate(year);\n                case 2:\n                    return new NativeDate(year, month);\n                case 3:\n                    return new NativeDate(year, month, date);\n                case 4:\n                    return new NativeDate(year, month, date, hour);\n                case 5:\n                    return new NativeDate(year, month, date, hour, minute);\n                case 6:\n                    return new NativeDate(year, month, date, hour, minute, second);\n                default:\n                    return new NativeDate(year, month, date, hour, minute, second, ms);\n            }\n        }\n\n        return mirrorDateProperties(ClockDate, NativeDate);\n    }\n\n\n    function enqueueJob(clock, job) {\n        // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob\n        if (!clock.jobs) {\n            clock.jobs = [];\n        }\n        clock.jobs.push(job);\n    }\n\n    function runJobs(clock) {\n        // runs all microtick-deferred tasks - ecma262/#sec-runjobs\n        if (!clock.jobs) {\n            return;\n        }\n        for (var i = 0; i < clock.jobs.length; i++) {\n            var job = clock.jobs[i];\n            job.func.apply(null, job.args);\n            if (clock.loopLimit && i > clock.loopLimit) {\n                throw new Error(\"Aborting after running \" + clock.loopLimit + \" timers, assuming an infinite loop!\");\n            }\n        }\n        clock.jobs = [];\n    }\n\n    function addTimer(clock, timer) {\n        if (timer.func === undefined) {\n            throw new Error(\"Callback must be provided to timer calls\");\n        }\n\n        timer.type = timer.immediate ? \"Immediate\" : \"Timeout\";\n\n        if (timer.hasOwnProperty(\"delay\")) {\n            if (!isNumberFinite(timer.delay)) {\n                timer.delay = 0;\n            }\n            timer.delay = timer.delay > maxTimeout ? 1 : timer.delay;\n            timer.delay = Math.max(0, timer.delay);\n        }\n\n        if (timer.hasOwnProperty(\"interval\")) {\n            timer.type = \"Interval\";\n            timer.interval = timer.interval > maxTimeout ? 1 : timer.interval;\n        }\n\n        if (timer.hasOwnProperty(\"animation\")) {\n            timer.type = \"AnimationFrame\";\n            timer.animation = true;\n        }\n\n        if (!clock.timers) {\n            clock.timers = {};\n        }\n\n        timer.id = uniqueTimerId++;\n        timer.createdAt = clock.now;\n        timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0));\n\n        clock.timers[timer.id] = timer;\n\n        if (addTimerReturnsObject) {\n            var res = {\n                id: timer.id,\n                ref: function () { return res; },\n                unref: function () { return res; },\n                refresh: function () { return res; }\n            };\n            return res;\n        }\n\n        return timer.id;\n    }\n\n\n    /* eslint consistent-return: \"off\" */\n    function compareTimers(a, b) {\n        // Sort first by absolute timing\n        if (a.callAt < b.callAt) {\n            return -1;\n        }\n        if (a.callAt > b.callAt) {\n            return 1;\n        }\n\n        // Sort next by immediate, immediate timers take precedence\n        if (a.immediate && !b.immediate) {\n            return -1;\n        }\n        if (!a.immediate && b.immediate) {\n            return 1;\n        }\n\n        // Sort next by creation time, earlier-created timers take precedence\n        if (a.createdAt < b.createdAt) {\n            return -1;\n        }\n        if (a.createdAt > b.createdAt) {\n            return 1;\n        }\n\n        // Sort next by id, lower-id timers take precedence\n        if (a.id < b.id) {\n            return -1;\n        }\n        if (a.id > b.id) {\n            return 1;\n        }\n\n        // As timer ids are unique, no fallback `0` is necessary\n    }\n\n    function firstTimerInRange(clock, from, to) {\n        var timers = clock.timers;\n        var timer = null;\n        var id, isInRange;\n\n        for (id in timers) {\n            if (timers.hasOwnProperty(id)) {\n                isInRange = inRange(from, to, timers[id]);\n\n                if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) {\n                    timer = timers[id];\n                }\n            }\n        }\n\n        return timer;\n    }\n\n    function firstTimer(clock) {\n        var timers = clock.timers;\n        var timer = null;\n        var id;\n\n        for (id in timers) {\n            if (timers.hasOwnProperty(id)) {\n                if (!timer || compareTimers(timer, timers[id]) === 1) {\n                    timer = timers[id];\n                }\n            }\n        }\n\n        return timer;\n    }\n\n    function lastTimer(clock) {\n        var timers = clock.timers;\n        var timer = null;\n        var id;\n\n        for (id in timers) {\n            if (timers.hasOwnProperty(id)) {\n                if (!timer || compareTimers(timer, timers[id]) === -1) {\n                    timer = timers[id];\n                }\n            }\n        }\n\n        return timer;\n    }\n\n    function callTimer(clock, timer) {\n        if (typeof timer.interval === \"number\") {\n            clock.timers[timer.id].callAt += timer.interval;\n        } else {\n            delete clock.timers[timer.id];\n        }\n\n        if (typeof timer.func === \"function\") {\n            timer.func.apply(null, timer.args);\n        } else {\n            /* eslint no-eval: \"off\" */\n            eval(timer.func);\n        }\n    }\n\n    function clearTimer(clock, timerId, ttype) {\n        if (!timerId) {\n            // null appears to be allowed in most browsers, and appears to be\n            // relied upon by some libraries, like Bootstrap carousel\n            return;\n        }\n\n        if (!clock.timers) {\n            clock.timers = {};\n        }\n\n        // in Node, timerId is an object with .ref()/.unref(), and\n        // its .id field is the actual timer id.\n        if (typeof timerId === \"object\") {\n            timerId = timerId.id;\n        }\n\n        if (clock.timers.hasOwnProperty(timerId)) {\n            // check that the ID matches a timer of the correct type\n            var timer = clock.timers[timerId];\n            if (timer.type === ttype) {\n                delete clock.timers[timerId];\n            } else {\n                var clear = ttype === \"AnimationFrame\" ? \"cancelAnimationFrame\" : \"clear\" + ttype;\n                var schedule = timer.type === \"AnimationFrame\" ? \"requestAnimationFrame\" : \"set\" + timer.type;\n                throw new Error(\"Cannot clear timer: timer created with \" + schedule\n                    + \"() but cleared with \" + clear + \"()\");\n            }\n        }\n    }\n\n    function uninstall(clock, target, config) {\n        var method,\n            i,\n            l;\n        var installedHrTime = \"_hrtime\";\n        var installedNextTick = \"_nextTick\";\n\n        for (i = 0, l = clock.methods.length; i < l; i++) {\n            method = clock.methods[i];\n            if (method === \"hrtime\" && target.process) {\n                target.process.hrtime = clock[installedHrTime];\n            } else if (method === \"nextTick\" && target.process) {\n                target.process.nextTick = clock[installedNextTick];\n            } else if (method === \"performance\") {\n                target[method] = clock[\"_\" + method];\n            } else {\n                if (target[method] && target[method].hadOwnProperty) {\n                    target[method] = clock[\"_\" + method];\n                    if (method === \"clearInterval\" && config.shouldAdvanceTime === true) {\n                        target[method](clock.attachedInterval);\n                    }\n                } else {\n                    try {\n                        delete target[method];\n                    } catch (ignore) { /* eslint empty-block: \"off\" */ }\n                }\n            }\n        }\n\n        // Prevent multiple executions which will completely remove these props\n        clock.methods = [];\n\n        // return pending timers, to enable checking what timers remained on uninstall\n        if (!clock.timers) {\n            return [];\n        }\n        return Object.keys(clock.timers).map(function mapper(key) {\n            return clock.timers[key];\n        });\n    }\n\n    function hijackMethod(target, method, clock) {\n        var prop;\n        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);\n        clock[\"_\" + method] = target[method];\n\n        if (method === \"Date\") {\n            var date = mirrorDateProperties(clock[method], target[method]);\n            target[method] = date;\n        } else if (method === \"performance\") {\n            target[method] = clock[method];\n        } else {\n            target[method] = function () {\n                return clock[method].apply(clock, arguments);\n            };\n\n            for (prop in clock[method]) {\n                if (clock[method].hasOwnProperty(prop)) {\n                    target[method][prop] = clock[method][prop];\n                }\n            }\n        }\n\n        target[method].clock = clock;\n    }\n\n    function doIntervalTick(clock, advanceTimeDelta) {\n        clock.tick(advanceTimeDelta);\n    }\n\n    var timers = {\n        setTimeout: _global.setTimeout,\n        clearTimeout: _global.clearTimeout,\n        setImmediate: _global.setImmediate,\n        clearImmediate: _global.clearImmediate,\n        setInterval: _global.setInterval,\n        clearInterval: _global.clearInterval,\n        Date: _global.Date\n    };\n\n    if (hrtimePresent) {\n        timers.hrtime = _global.process.hrtime;\n    }\n\n    if (nextTickPresent) {\n        timers.nextTick = _global.process.nextTick;\n    }\n\n    if (performancePresent) {\n        timers.performance = _global.performance;\n    }\n\n    if (requestAnimationFramePresent) {\n        timers.requestAnimationFrame = _global.requestAnimationFrame;\n    }\n\n    if (cancelAnimationFramePresent) {\n        timers.cancelAnimationFrame = _global.cancelAnimationFrame;\n    }\n\n    var keys = Object.keys || function (obj) {\n        var ks = [];\n        var key;\n\n        for (key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                ks.push(key);\n            }\n        }\n\n        return ks;\n    };\n\n    /**\n     * @param start {Date|number} the system time\n     * @param loopLimit {number}  maximum number of timers that will be run when calling runAll()\n     */\n    function createClock(start, loopLimit) {\n        start = start || 0;\n        loopLimit = loopLimit || 1000;\n\n        if (NativeDate === undefined) {\n            throw new Error(\"The global scope doesn't have a `Date` object\"\n                + \" (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)\");\n        }\n\n        var clock = {\n            now: getEpoch(start),\n            hrNow: 0,\n            timeouts: {},\n            Date: createDate(),\n            loopLimit: loopLimit\n        };\n\n        clock.Date.clock = clock;\n\n        function getTimeToNextFrame() {\n            return 16 - ((clock.now - start) % 16);\n        }\n\n        clock.setTimeout = function setTimeout(func, timeout) {\n            return addTimer(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 2),\n                delay: timeout\n            });\n        };\n\n        clock.clearTimeout = function clearTimeout(timerId) {\n            return clearTimer(clock, timerId, \"Timeout\");\n        };\n        clock.nextTick = function nextTick(func) {\n            return enqueueJob(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 1)\n            });\n        };\n        clock.setInterval = function setInterval(func, timeout) {\n            timeout = parseInt(timeout, 10);\n            return addTimer(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 2),\n                delay: timeout,\n                interval: timeout\n            });\n        };\n\n        clock.clearInterval = function clearInterval(timerId) {\n            return clearTimer(clock, timerId, \"Interval\");\n        };\n\n        clock.setImmediate = function setImmediate(func) {\n            return addTimer(clock, {\n                func: func,\n                args: Array.prototype.slice.call(arguments, 1),\n                immediate: true\n            });\n        };\n\n        clock.clearImmediate = function clearImmediate(timerId) {\n            return clearTimer(clock, timerId, \"Immediate\");\n        };\n\n        clock.requestAnimationFrame = function requestAnimationFrame(func) {\n            var result = addTimer(clock, {\n                func: func,\n                delay: getTimeToNextFrame(),\n                args: [clock.now + getTimeToNextFrame()],\n                animation: true\n            });\n\n            return result.id || result;\n        };\n\n        clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) {\n            return clearTimer(clock, timerId, \"AnimationFrame\");\n        };\n\n        function updateHrTime(newNow) {\n            clock.hrNow += (newNow - clock.now);\n        }\n\n        clock.runMicrotasks = function runMicrotasks() {\n            runJobs(clock);\n        };\n\n        clock.tick = function tick(ms) {\n            ms = typeof ms === \"number\" ? ms : parseTime(ms);\n            var tickFrom = clock.now;\n            var tickTo = clock.now + ms;\n            var previous = clock.now;\n            var timer, firstException, oldNow;\n\n            clock.duringTick = true;\n\n            // perform process.nextTick()s\n            oldNow = clock.now;\n            runJobs(clock);\n            if (oldNow !== clock.now) {\n                // compensate for any setSystemTime() call during process.nextTick() callback\n                tickFrom += clock.now - oldNow;\n                tickTo += clock.now - oldNow;\n            }\n\n            // perform each timer in the requested range\n            timer = firstTimerInRange(clock, tickFrom, tickTo);\n            while (timer && tickFrom <= tickTo) {\n                if (clock.timers[timer.id]) {\n                    updateHrTime(timer.callAt);\n                    tickFrom = timer.callAt;\n                    clock.now = timer.callAt;\n                    oldNow = clock.now;\n                    try {\n                        runJobs(clock);\n                        callTimer(clock, timer);\n                    } catch (e) {\n                        firstException = firstException || e;\n                    }\n\n                    // compensate for any setSystemTime() call during timer callback\n                    if (oldNow !== clock.now) {\n                        tickFrom += clock.now - oldNow;\n                        tickTo += clock.now - oldNow;\n                        previous += clock.now - oldNow;\n                    }\n                }\n\n                timer = firstTimerInRange(clock, previous, tickTo);\n                previous = tickFrom;\n            }\n\n            // perform process.nextTick()s again\n            oldNow = clock.now;\n            runJobs(clock);\n            if (oldNow !== clock.now) {\n                // compensate for any setSystemTime() call during process.nextTick() callback\n                tickFrom += clock.now - oldNow;\n                tickTo += clock.now - oldNow;\n            }\n            clock.duringTick = false;\n\n            // corner case: during runJobs, new timers were scheduled which could be in the range [clock.now, tickTo]\n            timer = firstTimerInRange(clock, tickFrom, tickTo);\n            if (timer) {\n                try {\n                    clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range\n                } catch (e) {\n                    firstException = firstException || e;\n                }\n            } else {\n                // no timers remaining in the requested range: move the clock all the way to the end\n                updateHrTime(tickTo);\n                clock.now = tickTo;\n            }\n            if (firstException) {\n                throw firstException;\n            }\n            return clock.now;\n        };\n\n        clock.next = function next() {\n            runJobs(clock);\n            var timer = firstTimer(clock);\n            if (!timer) {\n                return clock.now;\n            }\n\n            clock.duringTick = true;\n            try {\n                updateHrTime(timer.callAt);\n                clock.now = timer.callAt;\n                callTimer(clock, timer);\n                runJobs(clock);\n                return clock.now;\n            } finally {\n                clock.duringTick = false;\n            }\n        };\n\n        clock.runAll = function runAll() {\n            var numTimers, i;\n            runJobs(clock);\n            for (i = 0; i < clock.loopLimit; i++) {\n                if (!clock.timers) {\n                    return clock.now;\n                }\n\n                numTimers = keys(clock.timers).length;\n                if (numTimers === 0) {\n                    return clock.now;\n                }\n\n                clock.next();\n            }\n\n            throw new Error(\"Aborting after running \" + clock.loopLimit + \" timers, assuming an infinite loop!\");\n        };\n\n        clock.runToFrame = function runToFrame() {\n            return clock.tick(getTimeToNextFrame());\n        };\n\n        clock.runToLast = function runToLast() {\n            var timer = lastTimer(clock);\n            if (!timer) {\n                runJobs(clock);\n                return clock.now;\n            }\n\n            return clock.tick(timer.callAt - clock.now);\n        };\n\n        clock.reset = function reset() {\n            clock.timers = {};\n            clock.jobs = [];\n            clock.now = getEpoch(start);\n            clock.hrNow = 0;\n        };\n\n        clock.setSystemTime = function setSystemTime(systemTime) {\n            // determine time difference\n            var newNow = getEpoch(systemTime);\n            var difference = newNow - clock.now;\n            var id, timer;\n\n            // update 'system clock'\n            clock.now = newNow;\n\n            // update timers and intervals to keep them stable\n            for (id in clock.timers) {\n                if (clock.timers.hasOwnProperty(id)) {\n                    timer = clock.timers[id];\n                    timer.createdAt += difference;\n                    timer.callAt += difference;\n                }\n            }\n        };\n\n        if (performancePresent) {\n            clock.performance = Object.create(null);\n\n            if (hasPerformancePrototype) {\n                var proto = _global.Performance.prototype;\n\n                Object\n                    .getOwnPropertyNames(proto)\n                    .forEach(function (name) {\n                        clock.performance[name] = NOOP;\n                    });\n            }\n\n            clock.performance.now = function lolexNow() {\n                return clock.hrNow;\n            };\n        }\n\n        if (hrtimePresent) {\n            clock.hrtime = function (prev) {\n                if (Array.isArray(prev)) {\n                    var oldSecs = (prev[0] + prev[1] / 1e9);\n                    var newSecs = (clock.hrNow / 1000);\n                    var difference = (newSecs - oldSecs);\n                    var secs = fixedFloor(difference);\n                    var nanosecs = fixedModulo(difference * 1e9, 1e9);\n                    return [\n                        secs,\n                        nanosecs\n                    ];\n                }\n                return [\n                    fixedFloor(clock.hrNow / 1000),\n                    fixedModulo(clock.hrNow * 1e6, 1e9)\n                ];\n            };\n        }\n\n        return clock;\n    }\n\n    /**\n     * @param config {Object} optional config\n     * @param config.target {Object} the target to install timers in (default `window`)\n     * @param config.now {number|Date}  a number (in milliseconds) or a Date object (default epoch)\n     * @param config.toFake {string[]} names of the methods that should be faked.\n     * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll()\n     * @param config.shouldAdvanceTime {Boolean} tells lolex to increment mocked time automatically (default false)\n     * @param config.advanceTimeDelta {Number} increment mocked time every <<advanceTimeDelta>> ms (default: 20ms)\n     */\n    function install(config) {\n        if ( arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === \"number\") {\n            throw new TypeError(\"lolex.install called with \" + String(config) +\n                \" lolex 2.0+ requires an object parameter - see https://github.com/sinonjs/lolex\");\n        }\n        config = typeof config !== \"undefined\" ? config : {};\n        config.shouldAdvanceTime = config.shouldAdvanceTime || false;\n        config.advanceTimeDelta = config.advanceTimeDelta || 20;\n\n        var i, l;\n        var target = config.target || _global;\n        var clock = createClock(config.now, config.loopLimit);\n\n        clock.uninstall = function () {\n            return uninstall(clock, target, config);\n        };\n\n        clock.methods = config.toFake || [];\n\n        if (clock.methods.length === 0) {\n            // do not fake nextTick by default - GitHub#126\n            clock.methods = keys(timers).filter(function (key) {return key !== \"nextTick\";});\n        }\n\n        for (i = 0, l = clock.methods.length; i < l; i++) {\n            if (clock.methods[i] === \"hrtime\") {\n                if (target.process && typeof target.process.hrtime === \"function\") {\n                    hijackMethod(target.process, clock.methods[i], clock);\n                }\n            } else if (clock.methods[i] === \"nextTick\") {\n                if (target.process && typeof target.process.nextTick === \"function\") {\n                    hijackMethod(target.process, clock.methods[i], clock);\n                }\n            } else {\n                if (clock.methods[i] === \"setInterval\" && config.shouldAdvanceTime === true) {\n                    var intervalTick = doIntervalTick.bind(null, clock, config.advanceTimeDelta);\n                    var intervalId = target[clock.methods[i]](\n                        intervalTick,\n                        config.advanceTimeDelta);\n                    clock.attachedInterval = intervalId;\n                }\n                hijackMethod(target, clock.methods[i], clock);\n            }\n        }\n\n        return clock;\n    }\n\n    return {\n        timers: timers,\n        createClock: createClock,\n        install: install,\n        withGlobal: withGlobal\n    };\n}\n\nvar defaultImplementation = withGlobal(global || window);\n\nexports.timers = defaultImplementation.timers;\nexports.createClock = defaultImplementation.createClock;\nexports.install = defaultImplementation.install;\nexports.withGlobal = withGlobal;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],87:[function(require,module,exports){\nvar isarray = require('isarray')\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n  // Match escaped characters that would otherwise appear in future matches.\n  // This allows the user to escape special characters that won't transform.\n  '(\\\\\\\\.)',\n  // Match Express-style parameters and un-named parameters with a prefix\n  // and optional suffixes. Matches appear as:\n  //\n  // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n  // \"/route(\\\\d+)\"  => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n  // \"/*\"            => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n  '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param  {string}  str\n * @param  {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n  var tokens = []\n  var key = 0\n  var index = 0\n  var path = ''\n  var defaultDelimiter = options && options.delimiter || '/'\n  var res\n\n  while ((res = PATH_REGEXP.exec(str)) != null) {\n    var m = res[0]\n    var escaped = res[1]\n    var offset = res.index\n    path += str.slice(index, offset)\n    index = offset + m.length\n\n    // Ignore already escaped sequences.\n    if (escaped) {\n      path += escaped[1]\n      continue\n    }\n\n    var next = str[index]\n    var prefix = res[2]\n    var name = res[3]\n    var capture = res[4]\n    var group = res[5]\n    var modifier = res[6]\n    var asterisk = res[7]\n\n    // Push the current path onto the tokens.\n    if (path) {\n      tokens.push(path)\n      path = ''\n    }\n\n    var partial = prefix != null && next != null && next !== prefix\n    var repeat = modifier === '+' || modifier === '*'\n    var optional = modifier === '?' || modifier === '*'\n    var delimiter = res[2] || defaultDelimiter\n    var pattern = capture || group\n\n    tokens.push({\n      name: name || key++,\n      prefix: prefix || '',\n      delimiter: delimiter,\n      optional: optional,\n      repeat: repeat,\n      partial: partial,\n      asterisk: !!asterisk,\n      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n    })\n  }\n\n  // Match any characters still remaining.\n  if (index < str.length) {\n    path += str.substr(index)\n  }\n\n  // If the path exists, push it onto the end.\n  if (path) {\n    tokens.push(path)\n  }\n\n  return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param  {string}             str\n * @param  {Object=}            options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n  return tokensToFunction(parse(str, options))\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n  return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n  return encodeURI(str).replace(/[?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n  // Compile all the tokens into regexps.\n  var matches = new Array(tokens.length)\n\n  // Compile all the patterns before compilation.\n  for (var i = 0; i < tokens.length; i++) {\n    if (typeof tokens[i] === 'object') {\n      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$')\n    }\n  }\n\n  return function (obj, opts) {\n    var path = ''\n    var data = obj || {}\n    var options = opts || {}\n    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n    for (var i = 0; i < tokens.length; i++) {\n      var token = tokens[i]\n\n      if (typeof token === 'string') {\n        path += token\n\n        continue\n      }\n\n      var value = data[token.name]\n      var segment\n\n      if (value == null) {\n        if (token.optional) {\n          // Prepend partial segment prefixes.\n          if (token.partial) {\n            path += token.prefix\n          }\n\n          continue\n        } else {\n          throw new TypeError('Expected \"' + token.name + '\" to be defined')\n        }\n      }\n\n      if (isarray(value)) {\n        if (!token.repeat) {\n          throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n        }\n\n        if (value.length === 0) {\n          if (token.optional) {\n            continue\n          } else {\n            throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n          }\n        }\n\n        for (var j = 0; j < value.length; j++) {\n          segment = encode(value[j])\n\n          if (!matches[i].test(segment)) {\n            throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n          }\n\n          path += (j === 0 ? token.prefix : token.delimiter) + segment\n        }\n\n        continue\n      }\n\n      segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n      if (!matches[i].test(segment)) {\n        throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n      }\n\n      path += token.prefix + segment\n    }\n\n    return path\n  }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param  {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n  return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param  {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n  return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param  {!RegExp} re\n * @param  {Array}   keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n  re.keys = keys\n  return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param  {Object} options\n * @return {string}\n */\nfunction flags (options) {\n  return options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param  {!RegExp} path\n * @param  {!Array}  keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n  // Use a negative lookahead to match only capturing groups.\n  var groups = path.source.match(/\\((?!\\?)/g)\n\n  if (groups) {\n    for (var i = 0; i < groups.length; i++) {\n      keys.push({\n        name: i,\n        prefix: null,\n        delimiter: null,\n        optional: false,\n        repeat: false,\n        partial: false,\n        asterisk: false,\n        pattern: null\n      })\n    }\n  }\n\n  return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param  {!Array}  path\n * @param  {Array}   keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n  var parts = []\n\n  for (var i = 0; i < path.length; i++) {\n    parts.push(pathToRegexp(path[i], keys, options).source)\n  }\n\n  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n  return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param  {string}  path\n * @param  {!Array}  keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n  return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param  {!Array}          tokens\n * @param  {(Array|Object)=} keys\n * @param  {Object=}         options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  var strict = options.strict\n  var end = options.end !== false\n  var route = ''\n\n  // Iterate over the tokens and create our regexp string.\n  for (var i = 0; i < tokens.length; i++) {\n    var token = tokens[i]\n\n    if (typeof token === 'string') {\n      route += escapeString(token)\n    } else {\n      var prefix = escapeString(token.prefix)\n      var capture = '(?:' + token.pattern + ')'\n\n      keys.push(token)\n\n      if (token.repeat) {\n        capture += '(?:' + prefix + capture + ')*'\n      }\n\n      if (token.optional) {\n        if (!token.partial) {\n          capture = '(?:' + prefix + '(' + capture + '))?'\n        } else {\n          capture = prefix + '(' + capture + ')?'\n        }\n      } else {\n        capture = prefix + '(' + capture + ')'\n      }\n\n      route += capture\n    }\n  }\n\n  var delimiter = escapeString(options.delimiter || '/')\n  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n  // In non-strict mode we allow a slash at the end of match. If the path to\n  // match already ends with a slash, we remove it for consistency. The slash\n  // is valid at the end of a path match, not in the middle. This is important\n  // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n  if (!strict) {\n    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n  }\n\n  if (end) {\n    route += '$'\n  } else {\n    // In non-ending mode, we need the capturing groups to match as much as\n    // possible by using a positive lookahead to the end or next path segment.\n    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n  }\n\n  return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param  {(string|RegExp|Array)} path\n * @param  {(Array|Object)=}       keys\n * @param  {Object=}               options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  if (path instanceof RegExp) {\n    return regexpToRegexp(path, /** @type {!Array} */ (keys))\n  }\n\n  if (isarray(path)) {\n    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n  }\n\n  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n\n},{\"isarray\":70}],88:[function(require,module,exports){\n'use strict';\nmodule.exports = {\n\tstdout: false,\n\tstderr: false\n};\n\n},{}],89:[function(require,module,exports){\n(function (global){\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.typeDetect = factory());\n}(this, (function () { 'use strict';\n\n/* !\n * type-detect\n * Copyright(c) 2013 jake luer <jake@alogicalparadox.com>\n * MIT Licensed\n */\nvar promiseExists = typeof Promise === 'function';\n\n/* eslint-disable no-undef */\nvar globalObject = typeof self === 'object' ? self : global; // eslint-disable-line id-blacklist\n\nvar symbolExists = typeof Symbol !== 'undefined';\nvar mapExists = typeof Map !== 'undefined';\nvar setExists = typeof Set !== 'undefined';\nvar weakMapExists = typeof WeakMap !== 'undefined';\nvar weakSetExists = typeof WeakSet !== 'undefined';\nvar dataViewExists = typeof DataView !== 'undefined';\nvar symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined';\nvar symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined';\nvar setEntriesExists = setExists && typeof Set.prototype.entries === 'function';\nvar mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function';\nvar setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries());\nvar mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries());\nvar arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function';\nvar arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());\nvar stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function';\nvar stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]());\nvar toStringLeftSliceLength = 8;\nvar toStringRightSliceLength = -1;\n/**\n * ### typeOf (obj)\n *\n * Uses `Object.prototype.toString` to determine the type of an object,\n * normalising behaviour across engine versions & well optimised.\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\nfunction typeDetect(obj) {\n  /* ! Speed optimisation\n   * Pre:\n   *   string literal     x 3,039,035 ops/sec ±1.62% (78 runs sampled)\n   *   boolean literal    x 1,424,138 ops/sec ±4.54% (75 runs sampled)\n   *   number literal     x 1,653,153 ops/sec ±1.91% (82 runs sampled)\n   *   undefined          x 9,978,660 ops/sec ±1.92% (75 runs sampled)\n   *   function           x 2,556,769 ops/sec ±1.73% (77 runs sampled)\n   * Post:\n   *   string literal     x 38,564,796 ops/sec ±1.15% (79 runs sampled)\n   *   boolean literal    x 31,148,940 ops/sec ±1.10% (79 runs sampled)\n   *   number literal     x 32,679,330 ops/sec ±1.90% (78 runs sampled)\n   *   undefined          x 32,363,368 ops/sec ±1.07% (82 runs sampled)\n   *   function           x 31,296,870 ops/sec ±0.96% (83 runs sampled)\n   */\n  var typeofObj = typeof obj;\n  if (typeofObj !== 'object') {\n    return typeofObj;\n  }\n\n  /* ! Speed optimisation\n   * Pre:\n   *   null               x 28,645,765 ops/sec ±1.17% (82 runs sampled)\n   * Post:\n   *   null               x 36,428,962 ops/sec ±1.37% (84 runs sampled)\n   */\n  if (obj === null) {\n    return 'null';\n  }\n\n  /* ! Spec Conformance\n   * Test: `Object.prototype.toString.call(window)``\n   *  - Node === \"[object global]\"\n   *  - Chrome === \"[object global]\"\n   *  - Firefox === \"[object Window]\"\n   *  - PhantomJS === \"[object Window]\"\n   *  - Safari === \"[object Window]\"\n   *  - IE 11 === \"[object Window]\"\n   *  - IE Edge === \"[object Window]\"\n   * Test: `Object.prototype.toString.call(this)``\n   *  - Chrome Worker === \"[object global]\"\n   *  - Firefox Worker === \"[object DedicatedWorkerGlobalScope]\"\n   *  - Safari Worker === \"[object DedicatedWorkerGlobalScope]\"\n   *  - IE 11 Worker === \"[object WorkerGlobalScope]\"\n   *  - IE Edge Worker === \"[object WorkerGlobalScope]\"\n   */\n  if (obj === globalObject) {\n    return 'global';\n  }\n\n  /* ! Speed optimisation\n   * Pre:\n   *   array literal      x 2,888,352 ops/sec ±0.67% (82 runs sampled)\n   * Post:\n   *   array literal      x 22,479,650 ops/sec ±0.96% (81 runs sampled)\n   */\n  if (\n    Array.isArray(obj) &&\n    (symbolToStringTagExists === false || !(Symbol.toStringTag in obj))\n  ) {\n    return 'Array';\n  }\n\n  // Not caching existence of `window` and related properties due to potential\n  // for `window` to be unset before tests in quasi-browser environments.\n  if (typeof window === 'object' && window !== null) {\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/multipage/browsers.html#location)\n     * WhatWG HTML$7.7.3 - The `Location` interface\n     * Test: `Object.prototype.toString.call(window.location)``\n     *  - IE <=11 === \"[object Object]\"\n     *  - IE Edge <=13 === \"[object Object]\"\n     */\n    if (typeof window.location === 'object' && obj === window.location) {\n      return 'Location';\n    }\n\n    /* ! Spec Conformance\n     * (https://html.spec.whatwg.org/#document)\n     * WhatWG HTML$3.1.1 - The `Document` object\n     * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n     *       (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268)\n     *       which suggests that browsers should use HTMLTableCellElement for\n     *       both TD and TH elements. WhatWG separates these.\n     *       WhatWG HTML states:\n     *         > For historical reasons, Window objects must also have a\n     *         > writable, configurable, non-enumerable property named\n     *         > HTMLDocument whose value is the Document interface object.\n     * Test: `Object.prototype.toString.call(document)``\n     *  - Chrome === \"[object HTMLDocument]\"\n     *  - Firefox === \"[object HTMLDocument]\"\n     *  - Safari === \"[object HTMLDocument]\"\n     *  - IE <=10 === \"[object Document]\"\n     *  - IE 11 === \"[object HTMLDocument]\"\n     *  - IE Edge <=13 === \"[object HTMLDocument]\"\n     */\n    if (typeof window.document === 'object' && obj === window.document) {\n      return 'Document';\n    }\n\n    if (typeof window.navigator === 'object') {\n      /* ! Spec Conformance\n       * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray)\n       * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray\n       * Test: `Object.prototype.toString.call(navigator.mimeTypes)``\n       *  - IE <=10 === \"[object MSMimeTypesCollection]\"\n       */\n      if (typeof window.navigator.mimeTypes === 'object' &&\n          obj === window.navigator.mimeTypes) {\n        return 'MimeTypeArray';\n      }\n\n      /* ! Spec Conformance\n       * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)\n       * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray\n       * Test: `Object.prototype.toString.call(navigator.plugins)``\n       *  - IE <=10 === \"[object MSPluginsCollection]\"\n       */\n      if (typeof window.navigator.plugins === 'object' &&\n          obj === window.navigator.plugins) {\n        return 'PluginArray';\n      }\n    }\n\n    if ((typeof window.HTMLElement === 'function' ||\n        typeof window.HTMLElement === 'object') &&\n        obj instanceof window.HTMLElement) {\n      /* ! Spec Conformance\n      * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)\n      * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement`\n      * Test: `Object.prototype.toString.call(document.createElement('blockquote'))``\n      *  - IE <=10 === \"[object HTMLBlockElement]\"\n      */\n      if (obj.tagName === 'BLOCKQUOTE') {\n        return 'HTMLQuoteElement';\n      }\n\n      /* ! Spec Conformance\n       * (https://html.spec.whatwg.org/#htmltabledatacellelement)\n       * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement`\n       * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n       *       (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)\n       *       which suggests that browsers should use HTMLTableCellElement for\n       *       both TD and TH elements. WhatWG separates these.\n       * Test: Object.prototype.toString.call(document.createElement('td'))\n       *  - Chrome === \"[object HTMLTableCellElement]\"\n       *  - Firefox === \"[object HTMLTableCellElement]\"\n       *  - Safari === \"[object HTMLTableCellElement]\"\n       */\n      if (obj.tagName === 'TD') {\n        return 'HTMLTableDataCellElement';\n      }\n\n      /* ! Spec Conformance\n       * (https://html.spec.whatwg.org/#htmltableheadercellelement)\n       * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement`\n       * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n       *       (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)\n       *       which suggests that browsers should use HTMLTableCellElement for\n       *       both TD and TH elements. WhatWG separates these.\n       * Test: Object.prototype.toString.call(document.createElement('th'))\n       *  - Chrome === \"[object HTMLTableCellElement]\"\n       *  - Firefox === \"[object HTMLTableCellElement]\"\n       *  - Safari === \"[object HTMLTableCellElement]\"\n       */\n      if (obj.tagName === 'TH') {\n        return 'HTMLTableHeaderCellElement';\n      }\n    }\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   Float64Array       x 625,644 ops/sec ±1.58% (80 runs sampled)\n  *   Float32Array       x 1,279,852 ops/sec ±2.91% (77 runs sampled)\n  *   Uint32Array        x 1,178,185 ops/sec ±1.95% (83 runs sampled)\n  *   Uint16Array        x 1,008,380 ops/sec ±2.25% (80 runs sampled)\n  *   Uint8Array         x 1,128,040 ops/sec ±2.11% (81 runs sampled)\n  *   Int32Array         x 1,170,119 ops/sec ±2.88% (80 runs sampled)\n  *   Int16Array         x 1,176,348 ops/sec ±5.79% (86 runs sampled)\n  *   Int8Array          x 1,058,707 ops/sec ±4.94% (77 runs sampled)\n  *   Uint8ClampedArray  x 1,110,633 ops/sec ±4.20% (80 runs sampled)\n  * Post:\n  *   Float64Array       x 7,105,671 ops/sec ±13.47% (64 runs sampled)\n  *   Float32Array       x 5,887,912 ops/sec ±1.46% (82 runs sampled)\n  *   Uint32Array        x 6,491,661 ops/sec ±1.76% (79 runs sampled)\n  *   Uint16Array        x 6,559,795 ops/sec ±1.67% (82 runs sampled)\n  *   Uint8Array         x 6,463,966 ops/sec ±1.43% (85 runs sampled)\n  *   Int32Array         x 5,641,841 ops/sec ±3.49% (81 runs sampled)\n  *   Int16Array         x 6,583,511 ops/sec ±1.98% (80 runs sampled)\n  *   Int8Array          x 6,606,078 ops/sec ±1.74% (81 runs sampled)\n  *   Uint8ClampedArray  x 6,602,224 ops/sec ±1.77% (83 runs sampled)\n  */\n  var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]);\n  if (typeof stringTag === 'string') {\n    return stringTag;\n  }\n\n  var objPrototype = Object.getPrototypeOf(obj);\n  /* ! Speed optimisation\n  * Pre:\n  *   regex literal      x 1,772,385 ops/sec ±1.85% (77 runs sampled)\n  *   regex constructor  x 2,143,634 ops/sec ±2.46% (78 runs sampled)\n  * Post:\n  *   regex literal      x 3,928,009 ops/sec ±0.65% (78 runs sampled)\n  *   regex constructor  x 3,931,108 ops/sec ±0.58% (84 runs sampled)\n  */\n  if (objPrototype === RegExp.prototype) {\n    return 'RegExp';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   date               x 2,130,074 ops/sec ±4.42% (68 runs sampled)\n  * Post:\n  *   date               x 3,953,779 ops/sec ±1.35% (77 runs sampled)\n  */\n  if (objPrototype === Date.prototype) {\n    return 'Date';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag)\n   * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be \"Promise\":\n   * Test: `Object.prototype.toString.call(Promise.resolve())``\n   *  - Chrome <=47 === \"[object Object]\"\n   *  - Edge <=20 === \"[object Object]\"\n   *  - Firefox 29-Latest === \"[object Promise]\"\n   *  - Safari 7.1-Latest === \"[object Promise]\"\n   */\n  if (promiseExists && objPrototype === Promise.prototype) {\n    return 'Promise';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   set                x 2,222,186 ops/sec ±1.31% (82 runs sampled)\n  * Post:\n  *   set                x 4,545,879 ops/sec ±1.13% (83 runs sampled)\n  */\n  if (setExists && objPrototype === Set.prototype) {\n    return 'Set';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   map                x 2,396,842 ops/sec ±1.59% (81 runs sampled)\n  * Post:\n  *   map                x 4,183,945 ops/sec ±6.59% (82 runs sampled)\n  */\n  if (mapExists && objPrototype === Map.prototype) {\n    return 'Map';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   weakset            x 1,323,220 ops/sec ±2.17% (76 runs sampled)\n  * Post:\n  *   weakset            x 4,237,510 ops/sec ±2.01% (77 runs sampled)\n  */\n  if (weakSetExists && objPrototype === WeakSet.prototype) {\n    return 'WeakSet';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   weakmap            x 1,500,260 ops/sec ±2.02% (78 runs sampled)\n  * Post:\n  *   weakmap            x 3,881,384 ops/sec ±1.45% (82 runs sampled)\n  */\n  if (weakMapExists && objPrototype === WeakMap.prototype) {\n    return 'WeakMap';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag)\n   * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be \"DataView\":\n   * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (dataViewExists && objPrototype === DataView.prototype) {\n    return 'DataView';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag)\n   * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be \"Map Iterator\":\n   * Test: `Object.prototype.toString.call(new Map().entries())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (mapExists && objPrototype === mapIteratorPrototype) {\n    return 'Map Iterator';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag)\n   * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be \"Set Iterator\":\n   * Test: `Object.prototype.toString.call(new Set().entries())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (setExists && objPrototype === setIteratorPrototype) {\n    return 'Set Iterator';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag)\n   * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be \"Array Iterator\":\n   * Test: `Object.prototype.toString.call([][Symbol.iterator]())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {\n    return 'Array Iterator';\n  }\n\n  /* ! Spec Conformance\n   * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag)\n   * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be \"String Iterator\":\n   * Test: `Object.prototype.toString.call(''[Symbol.iterator]())``\n   *  - Edge <=13 === \"[object Object]\"\n   */\n  if (stringIteratorExists && objPrototype === stringIteratorPrototype) {\n    return 'String Iterator';\n  }\n\n  /* ! Speed optimisation\n  * Pre:\n  *   object from null   x 2,424,320 ops/sec ±1.67% (76 runs sampled)\n  * Post:\n  *   object from null   x 5,838,000 ops/sec ±0.99% (84 runs sampled)\n  */\n  if (objPrototype === null) {\n    return 'Object';\n  }\n\n  return Object\n    .prototype\n    .toString\n    .call(obj)\n    .slice(toStringLeftSliceLength, toStringRightSliceLength);\n}\n\nreturn typeDetect;\n\n})));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}]},{},[1])(1)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvc2lub24uanMiLCJsaWIvc2lub24vYXNzZXJ0LmpzIiwibGliL3Npbm9uL2JlaGF2aW9yLmpzIiwibGliL3Npbm9uL2NhbGwuanMiLCJsaWIvc2lub24vY29sbGVjdC1vd24tbWV0aG9kcy5qcyIsImxpYi9zaW5vbi9jb2xvci5qcyIsImxpYi9zaW5vbi9jcmVhdGUtc2FuZGJveC5qcyIsImxpYi9zaW5vbi9kZWZhdWx0LWJlaGF2aW9ycy5qcyIsImxpYi9zaW5vbi9mYWtlLmpzIiwibGliL3Npbm9uL21vY2stZXhwZWN0YXRpb24uanMiLCJsaWIvc2lub24vbW9jay5qcyIsImxpYi9zaW5vbi9zYW5kYm94LmpzIiwibGliL3Npbm9uL3NweS1mb3JtYXR0ZXJzLmpzIiwibGliL3Npbm9uL3NweS5qcyIsImxpYi9zaW5vbi9zdHViLWVudGlyZS1vYmplY3QuanMiLCJsaWIvc2lub24vc3R1Yi5qcyIsImxpYi9zaW5vbi90aHJvdy1vbi1mYWxzeS1vYmplY3QuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2RlZmF1bHQtY29uZmlnLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9leHBvcnQtYXN5bmMtYmVoYXZpb3JzLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9leHRlbmQuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL2Zvcm1hdC5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvZnVuY3Rpb24tdG8tc3RyaW5nLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9nZXQtbmV4dC10aWNrLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9nZXQtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvaXMtZXMtbW9kdWxlLmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9pcy1ub24tZXhpc3RlbnQtb3duLXByb3BlcnR5LmpzIiwibGliL3Npbm9uL3V0aWwvY29yZS9pcy1wcm9wZXJ0eS1jb25maWd1cmFibGUuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL25leHQtdGljay5qcyIsImxpYi9zaW5vbi91dGlsL2NvcmUvdGltZXMtaW4td29yZHMuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL3VzZS1wcm9taXNlLWxpYnJhcnkuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL3dhbGsuanMiLCJsaWIvc2lub24vdXRpbC9jb3JlL3dyYXAtbWV0aG9kLmpzIiwibGliL3Npbm9uL3V0aWwvZmFrZS10aW1lcnMuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvY2FsbGVkLWluLW9yZGVyLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL2NsYXNzLW5hbWUuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvZGVwcmVjYXRlZC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9ldmVyeS5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9mdW5jdGlvbi1uYW1lLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL29yZGVyLWJ5LWZpcnN0LWNhbGwuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy9hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9wcm90b3R5cGVzL2NvcHktcHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3Byb3RvdHlwZXMvZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvY29tbW9ucy9saWIvcHJvdG90eXBlcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9wcm90b3R5cGVzL29iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi9wcm90b3R5cGVzL3N0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9jb21tb25zL2xpYi90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL2NvbW1vbnMvbGliL3ZhbHVlLXRvLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9mb3JtYXRpby9saWIvZm9ybWF0aW8uanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9kZWVwLWVxdWFsLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvZ2V0LWNsYXNzLW5hbWUuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9nZXQtY2xhc3MuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pZGVudGljYWwuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1hcmd1bWVudHMuanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9pcy1kYXRlLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvaXMtZWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLW5hbi5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy9zYW1zYW0vbGliL2lzLW5lZy16ZXJvLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvaXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvaXMtc2V0LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvaXMtc3Vic2V0LmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvaXRlcmFibGUtdG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvbWF0Y2guanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvc2Ftc2FtL2xpYi9tYXRjaGVyLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3NhbXNhbS9saWIvc2Ftc2FtLmpzIiwibm9kZV9tb2R1bGVzL0BzaW5vbmpzL3RleHQtZW5jb2RpbmcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHNpbm9uanMvdGV4dC1lbmNvZGluZy9saWIvZW5jb2RpbmctaW5kZXhlcy5qcyIsIm5vZGVfbW9kdWxlcy9Ac2lub25qcy90ZXh0LWVuY29kaW5nL2xpYi9lbmNvZGluZy5qcyIsIm5vZGVfbW9kdWxlcy9zcmMvY29udmVydC94bWwuanMiLCJub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qdXN0LWV4dGVuZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbG9kYXNoLmpzIiwibm9kZV9tb2R1bGVzL2xvbGV4L3NyYy9sb2xleC1zcmMuanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvY29uZmlndXJlLWxvZ2dlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9uaXNlL2xpYi9ldmVudC9jdXN0b20tZXZlbnQuanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvZXZlbnQvZXZlbnQtdGFyZ2V0LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2V2ZW50L2V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2V2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2V2ZW50L3Byb2dyZXNzLWV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2Zha2Utc2VydmVyL2Zha2Utc2VydmVyLXdpdGgtY2xvY2suanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvZmFrZS1zZXJ2ZXIvZm9ybWF0LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2Zha2Utc2VydmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL25pc2UvbGliL2Zha2UteGhyL2Jsb2IuanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvZmFrZS14aHIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbmlzZS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbmlzZS9ub2RlX21vZHVsZXMvbG9sZXgvc3JjL2xvbGV4LXNyYy5qcyIsIm5vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3R5cGUtZGV0ZWN0L3R5cGUtZGV0ZWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25PQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dDQ2h2R2dCLG1CLEdBQUEsbUI7QUFBVCxTQUFTLG1CQUFULENBQTZCLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUksTUFBTSxFQUFWO0FBQ0EsT0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFFBQVEsTUFBNUIsRUFBb0MsR0FBcEMsRUFBeUM7QUFDdkMsUUFBSSxTQUFTLFFBQVEsQ0FBUixDQUFiO0FBQ0EsUUFBSSxPQUFPLEtBQVgsRUFBa0I7QUFDaEIsVUFBSSxJQUFKLENBQVMsT0FBVDtBQUNELEtBRkQsTUFFTyxJQUFJLE9BQU8sT0FBWCxFQUFvQjtBQUN6QixVQUFJLElBQUosQ0FBUyxPQUFUO0FBQ0Q7O0FBRUQsUUFBSSxJQUFKLENBQVMsV0FBVyxPQUFPLEtBQWxCLENBQVQ7O0FBRUEsUUFBSSxPQUFPLEtBQVgsRUFBa0I7QUFDaEIsVUFBSSxJQUFKLENBQVMsUUFBVDtBQUNELEtBRkQsTUFFTyxJQUFJLE9BQU8sT0FBWCxFQUFvQjtBQUN6QixVQUFJLElBQUosQ0FBUyxRQUFUO0FBQ0Q7QUFDRjtBQUNELFNBQU8sSUFBSSxJQUFKLENBQVMsRUFBVCxDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxVQUFULENBQW9CLENBQXBCLEVBQXVCO0FBQ3JCLE1BQUksSUFBSSxDQUFSO0FBQ0EsTUFBSSxFQUFFLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLE9BQWhCLENBQUo7QUFDQSxNQUFJLEVBQUUsT0FBRixDQUFVLElBQVYsRUFBZ0IsTUFBaEIsQ0FBSjtBQUNBLE1BQUksRUFBRSxPQUFGLENBQVUsSUFBVixFQUFnQixNQUFoQixDQUFKO0FBQ0EsTUFBSSxFQUFFLE9BQUYsQ0FBVSxJQUFWLEVBQWdCLFFBQWhCLENBQUo7O0FBRUEsU0FBTyxDQUFQO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0JEO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbnRoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzU2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDendCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBiZWhhdmlvciA9IHJlcXVpcmUoXCIuL3Npbm9uL2JlaGF2aW9yXCIpO1xudmFyIGNyZWF0ZVNhbmRib3ggPSByZXF1aXJlKFwiLi9zaW5vbi9jcmVhdGUtc2FuZGJveFwiKTtcbnZhciBkZXByZWNhdGVkID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZGVwcmVjYXRlZDtcbnZhciBleHRlbmQgPSByZXF1aXJlKFwiLi9zaW5vbi91dGlsL2NvcmUvZXh0ZW5kXCIpO1xudmFyIGZha2VUaW1lcnMgPSByZXF1aXJlKFwiLi9zaW5vbi91dGlsL2Zha2UtdGltZXJzXCIpO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoXCIuL3Npbm9uL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgbmlzZSA9IHJlcXVpcmUoXCJuaXNlXCIpO1xudmFyIFNhbmRib3ggPSByZXF1aXJlKFwiLi9zaW5vbi9zYW5kYm94XCIpO1xudmFyIHN0dWIgPSByZXF1aXJlKFwiLi9zaW5vbi9zdHViXCIpO1xuXG52YXIgYXBpTWV0aG9kcyA9IHtcbiAgICBjcmVhdGVTYW5kYm94OiBjcmVhdGVTYW5kYm94LFxuICAgIGFzc2VydDogcmVxdWlyZShcIi4vc2lub24vYXNzZXJ0XCIpLFxuICAgIG1hdGNoOiByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXIsXG4gICAgc3B5Q2FsbDogcmVxdWlyZShcIi4vc2lub24vY2FsbFwiKSxcblxuICAgIGV4cGVjdGF0aW9uOiByZXF1aXJlKFwiLi9zaW5vbi9tb2NrLWV4cGVjdGF0aW9uXCIpLFxuICAgIGNyZWF0ZVN0dWJJbnN0YW5jZTogcmVxdWlyZShcIi4vc2lub24vc3R1YlwiKS5jcmVhdGVTdHViSW5zdGFuY2UsXG4gICAgZGVmYXVsdENvbmZpZzogcmVxdWlyZShcIi4vc2lub24vdXRpbC9jb3JlL2RlZmF1bHQtY29uZmlnXCIpLFxuXG4gICAgc2V0Rm9ybWF0dGVyOiBmb3JtYXQuc2V0Rm9ybWF0dGVyLFxuXG4gICAgLy8gZmFrZSB0aW1lcnNcbiAgICB0aW1lcnM6IGZha2VUaW1lcnMudGltZXJzLFxuXG4gICAgLy8gZmFrZSBYSFJcbiAgICB4aHI6IG5pc2UuZmFrZVhoci54aHIsXG4gICAgRmFrZVhNTEh0dHBSZXF1ZXN0OiBuaXNlLmZha2VYaHIuRmFrZVhNTEh0dHBSZXF1ZXN0LFxuXG4gICAgLy8gZmFrZSBzZXJ2ZXJcbiAgICBmYWtlU2VydmVyOiBuaXNlLmZha2VTZXJ2ZXIsXG4gICAgZmFrZVNlcnZlcldpdGhDbG9jazogbmlzZS5mYWtlU2VydmVyV2l0aENsb2NrLFxuICAgIGNyZWF0ZUZha2VTZXJ2ZXI6IG5pc2UuZmFrZVNlcnZlci5jcmVhdGUuYmluZChuaXNlLmZha2VTZXJ2ZXIpLFxuICAgIGNyZWF0ZUZha2VTZXJ2ZXJXaXRoQ2xvY2s6IG5pc2UuZmFrZVNlcnZlcldpdGhDbG9jay5jcmVhdGUuYmluZChuaXNlLmZha2VTZXJ2ZXJXaXRoQ2xvY2spLFxuXG4gICAgYWRkQmVoYXZpb3I6IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgICAgIGJlaGF2aW9yLmFkZEJlaGF2aW9yKHN0dWIsIG5hbWUsIGZuKTtcbiAgICB9XG59O1xuXG52YXIgbGVnYWN5U2FuZGJveEFQSSA9IHtcbiAgICBzYW5kYm94OiB7XG4gICAgICAgIGNyZWF0ZTogZGVwcmVjYXRlZC53cmFwKFxuICAgICAgICAgICAgY3JlYXRlU2FuZGJveCxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgICBcImBzYW5kYm94LmNyZWF0ZSgpYCBpcyBkZXByZWNhdGVkLiBVc2UgZGVmYXVsdCBzYW5kYm94IGF0IGBzaW5vbi5zYW5kYm94YCBvciBjcmVhdGUgbmV3IHNhbmRib3hlcyB3aXRoIGBzaW5vbi5jcmVhdGVTYW5kYm94KClgXCJcbiAgICAgICAgKVxuICAgIH1cbn07XG5cbnZhciBzYW5kYm94ID0gbmV3IFNhbmRib3goKTtcblxudmFyIGFwaSA9IGV4dGVuZChzYW5kYm94LCBsZWdhY3lTYW5kYm94QVBJLCBhcGlNZXRob2RzKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhcGk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGNhbGxlZEluT3JkZXIgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5jYWxsZWRJbk9yZGVyO1xudmFyIGNyZWF0ZU1hdGNoZXIgPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXI7XG52YXIgb3JkZXJCeUZpcnN0Q2FsbCA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLm9yZGVyQnlGaXJzdENhbGw7XG52YXIgdGltZXNJbldvcmRzID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3RpbWVzLWluLXdvcmRzXCIpO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgc3RyaW5nU2xpY2UgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLnN0cmluZy5zbGljZTtcblxudmFyIGFycmF5U2xpY2UgPSBhcnJheVByb3RvLnNsaWNlO1xudmFyIGNvbmNhdCA9IGFycmF5UHJvdG8uY29uY2F0O1xudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZvckVhY2g7XG52YXIgam9pbiA9IGFycmF5UHJvdG8uam9pbjtcbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxudmFyIGFzc2VydDtcblxuZnVuY3Rpb24gdmVyaWZ5SXNTdHViKCkge1xuICAgIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuXG4gICAgZm9yRWFjaChhcmdzLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKFwiZmFrZSBpcyBub3QgYSBzcHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLnByb3h5ICYmIG1ldGhvZC5wcm94eS5pc1Npbm9uUHJveHkpIHtcbiAgICAgICAgICAgIHZlcmlmeUlzU3R1YihtZXRob2QucHJveHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKG1ldGhvZCArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5nZXRDYWxsICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbChtZXRob2QgKyBcIiBpcyBub3Qgc3R1YmJlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlJc1ZhbGlkQXNzZXJ0aW9uKGFzc2VydGlvbk1ldGhvZCwgYXNzZXJ0aW9uQXJncykge1xuICAgIHN3aXRjaCAoYXNzZXJ0aW9uTWV0aG9kKSB7XG4gICAgICAgIGNhc2UgXCJub3RDYWxsZWRcIjpcbiAgICAgICAgY2FzZSBcImNhbGxlZFwiOlxuICAgICAgICBjYXNlIFwiY2FsbGVkT25jZVwiOlxuICAgICAgICBjYXNlIFwiY2FsbGVkVHdpY2VcIjpcbiAgICAgICAgY2FzZSBcImNhbGxlZFRocmljZVwiOlxuICAgICAgICAgICAgaWYgKGFzc2VydGlvbkFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbk1ldGhvZCArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiB0YWtlcyAxIGFyZ3VtZW50IGJ1dCB3YXMgY2FsbGVkIHdpdGggXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGFzc2VydGlvbkFyZ3MubGVuZ3RoICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgYXJndW1lbnRzXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZhaWxBc3NlcnRpb24ob2JqZWN0LCBtc2cpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0IHx8IGdsb2JhbDtcbiAgICB2YXIgZmFpbE1ldGhvZCA9IG9iai5mYWlsIHx8IGFzc2VydC5mYWlsO1xuICAgIGZhaWxNZXRob2QuY2FsbChvYmosIG1zZyk7XG59XG5cbmZ1bmN0aW9uIG1pcnJvclByb3BBc0Fzc2VydGlvbihuYW1lLCBtZXRob2QsIG1lc3NhZ2UpIHtcbiAgICB2YXIgbXNnID0gbWVzc2FnZTtcbiAgICB2YXIgbWV0aCA9IG1ldGhvZDtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBtc2cgPSBtZXRob2Q7XG4gICAgICAgIG1ldGggPSBuYW1lO1xuICAgIH1cblxuICAgIGFzc2VydFtuYW1lXSA9IGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgdmVyaWZ5SXNTdHViKGZha2UpO1xuXG4gICAgICAgIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDEpO1xuICAgICAgICB2YXIgZmFpbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdmVyaWZ5SXNWYWxpZEFzc2VydGlvbihuYW1lLCBhcmdzKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1ldGggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZmFpbGVkID0gIW1ldGgoZmFrZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmYWlsZWQgPSB0eXBlb2YgZmFrZVttZXRoXSA9PT0gXCJmdW5jdGlvblwiID8gIWZha2VbbWV0aF0uYXBwbHkoZmFrZSwgYXJncykgOiAhZmFrZVttZXRoXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICAgIGZhaWxBc3NlcnRpb24odGhpcywgKGZha2UucHJpbnRmIHx8IGZha2UucHJveHkucHJpbnRmKS5hcHBseShmYWtlLCBjb25jYXQoW21zZ10sIGFyZ3MpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQucGFzcyhuYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9zZWROYW1lKHByZWZpeCwgcHJvcCkge1xuICAgIHJldHVybiAhcHJlZml4IHx8IC9eZmFpbC8udGVzdChwcm9wKSA/IHByb3AgOiBwcmVmaXggKyBzdHJpbmdTbGljZShwcm9wLCAwLCAxKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nU2xpY2UocHJvcCwgMSk7XG59XG5cbmFzc2VydCA9IHtcbiAgICBmYWlsRXhjZXB0aW9uOiBcIkFzc2VydEVycm9yXCIsXG5cbiAgICBmYWlsOiBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5uYW1lID0gdGhpcy5mYWlsRXhjZXB0aW9uIHx8IGFzc2VydC5mYWlsRXhjZXB0aW9uO1xuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH0sXG5cbiAgICBwYXNzOiBmdW5jdGlvbiBwYXNzKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfSxcblxuICAgIGNhbGxPcmRlcjogZnVuY3Rpb24gYXNzZXJ0Q2FsbE9yZGVyKCkge1xuICAgICAgICB2ZXJpZnlJc1N0dWIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgdmFyIGV4cGVjdGVkID0gXCJcIjtcbiAgICAgICAgdmFyIGFjdHVhbCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCFjYWxsZWRJbk9yZGVyKGFyZ3VtZW50cykpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBqb2luKGFyZ3VtZW50cywgXCIsIFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbHMgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBjYWxscy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsc1stLWldLmNhbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlKGNhbGxzLCBpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhY3R1YWwgPSBqb2luKG9yZGVyQnlGaXJzdENhbGwoY2FsbHMpLCBcIiwgXCIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZmFpbHMsIHdlJ2xsIGp1c3QgZmFsbCBiYWNrIHRvIHRoZSBibGFuayBzdHJpbmdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmFpbEFzc2VydGlvbih0aGlzLCBcImV4cGVjdGVkIFwiICsgZXhwZWN0ZWQgKyBcIiB0byBiZSBjYWxsZWQgaW4gb3JkZXIgYnV0IHdlcmUgY2FsbGVkIGFzIFwiICsgYWN0dWFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydC5wYXNzKFwiY2FsbE9yZGVyXCIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNhbGxDb3VudDogZnVuY3Rpb24gYXNzZXJ0Q2FsbENvdW50KG1ldGhvZCwgY291bnQpIHtcbiAgICAgICAgdmVyaWZ5SXNTdHViKG1ldGhvZCk7XG5cbiAgICAgICAgaWYgKG1ldGhvZC5jYWxsQ291bnQgIT09IGNvdW50KSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgXCIgKyB0aW1lc0luV29yZHMoY291bnQpICsgXCIgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiO1xuICAgICAgICAgICAgZmFpbEFzc2VydGlvbih0aGlzLCBtZXRob2QucHJpbnRmKG1zZykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0LnBhc3MoXCJjYWxsQ291bnRcIik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZXhwb3NlOiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidGFyZ2V0IGlzIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG8gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB2YXIgcHJlZml4ID0gKHR5cGVvZiBvLnByZWZpeCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBcImFzc2VydFwiKSB8fCBvLnByZWZpeDtcbiAgICAgICAgdmFyIGluY2x1ZGVGYWlsID0gdHlwZW9mIG8uaW5jbHVkZUZhaWwgPT09IFwidW5kZWZpbmVkXCIgfHwgQm9vbGVhbihvLmluY2x1ZGVGYWlsKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcztcblxuICAgICAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGluc3RhbmNlKSwgZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kICE9PSBcImV4cG9zZVwiICYmIChpbmNsdWRlRmFpbCB8fCAhL14oZmFpbCkvLnRlc3QobWV0aG9kKSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbZXhwb3NlZE5hbWUocHJlZml4LCBtZXRob2QpXSA9IGluc3RhbmNlW21ldGhvZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG1hdGNoOiBmdW5jdGlvbiBtYXRjaChhY3R1YWwsIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgIHZhciBtYXRjaGVyID0gY3JlYXRlTWF0Y2hlcihleHBlY3RhdGlvbik7XG4gICAgICAgIGlmIChtYXRjaGVyLnRlc3QoYWN0dWFsKSkge1xuICAgICAgICAgICAgYXNzZXJ0LnBhc3MoXCJtYXRjaFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWQgPSBbXG4gICAgICAgICAgICAgICAgXCJleHBlY3RlZCB2YWx1ZSB0byBtYXRjaFwiLFxuICAgICAgICAgICAgICAgIFwiICAgIGV4cGVjdGVkID0gXCIgKyBmb3JtYXQoZXhwZWN0YXRpb24pLFxuICAgICAgICAgICAgICAgIFwiICAgIGFjdHVhbCA9IFwiICsgZm9ybWF0KGFjdHVhbClcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGZhaWxBc3NlcnRpb24odGhpcywgam9pbihmb3JtYXR0ZWQsIFwiXFxuXCIpKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFwiLCBcImV4cGVjdGVkICVuIHRvIGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBidXQgd2FzIG5ldmVyIGNhbGxlZFwiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcbiAgICBcIm5vdENhbGxlZFwiLFxuICAgIGZ1bmN0aW9uKHNweSkge1xuICAgICAgICByZXR1cm4gIXNweS5jYWxsZWQ7XG4gICAgfSxcbiAgICBcImV4cGVjdGVkICVuIHRvIG5vdCBoYXZlIGJlZW4gY2FsbGVkIGJ1dCB3YXMgY2FsbGVkICVjJUNcIlxuKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZE9uY2VcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgb25jZSBidXQgd2FzIGNhbGxlZCAlYyVDXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkVHdpY2VcIiwgXCJleHBlY3RlZCAlbiB0byBiZSBjYWxsZWQgdHdpY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFRocmljZVwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB0aHJpY2UgYnV0IHdhcyBjYWxsZWQgJWMlQ1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZE9uXCIsIFwiZXhwZWN0ZWQgJW4gdG8gYmUgY2FsbGVkIHdpdGggJTEgYXMgdGhpcyBidXQgd2FzIGNhbGxlZCB3aXRoICV0XCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiYWx3YXlzQ2FsbGVkT25cIiwgXCJleHBlY3RlZCAlbiB0byBhbHdheXMgYmUgY2FsbGVkIHdpdGggJTEgYXMgdGhpcyBidXQgd2FzIGNhbGxlZCB3aXRoICV0XCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkV2l0aE5ld1wiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoIG5ld1wiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c0NhbGxlZFdpdGhOZXdcIiwgXCJleHBlY3RlZCAlbiB0byBhbHdheXMgYmUgY2FsbGVkIHdpdGggbmV3XCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiY2FsbGVkV2l0aFwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyAlRFwiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImNhbGxlZFdpdGhNYXRjaFwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoIG1hdGNoICVEXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiYWx3YXlzQ2FsbGVkV2l0aFwiLCBcImV4cGVjdGVkICVuIHRvIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgJURcIik7XG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJhbHdheXNDYWxsZWRXaXRoTWF0Y2hcIiwgXCJleHBlY3RlZCAlbiB0byBhbHdheXMgYmUgY2FsbGVkIHdpdGggbWF0Y2ggJURcIik7XG5taXJyb3JQcm9wQXNBc3NlcnRpb24oXCJjYWxsZWRXaXRoRXhhY3RseVwiLCBcImV4cGVjdGVkICVuIHRvIGJlIGNhbGxlZCB3aXRoIGV4YWN0IGFyZ3VtZW50cyAlRFwiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcImFsd2F5c0NhbGxlZFdpdGhFeGFjdGx5XCIsIFwiZXhwZWN0ZWQgJW4gdG8gYWx3YXlzIGJlIGNhbGxlZCB3aXRoIGV4YWN0IGFyZ3VtZW50cyAlRFwiKTtcbm1pcnJvclByb3BBc0Fzc2VydGlvbihcIm5ldmVyQ2FsbGVkV2l0aFwiLCBcImV4cGVjdGVkICVuIHRvIG5ldmVyIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyAlKiVDXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwibmV2ZXJDYWxsZWRXaXRoTWF0Y2hcIiwgXCJleHBlY3RlZCAlbiB0byBuZXZlciBiZSBjYWxsZWQgd2l0aCBtYXRjaCAlKiVDXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwidGhyZXdcIiwgXCIlbiBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiVDXCIpO1xubWlycm9yUHJvcEFzQXNzZXJ0aW9uKFwiYWx3YXlzVGhyZXdcIiwgXCIlbiBkaWQgbm90IGFsd2F5cyB0aHJvdyBleGNlcHRpb24lQ1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3NlcnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZnVuY3Rpb25OYW1lO1xudmFyIG5leHRUaWNrID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL25leHQtdGlja1wiKTtcbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcbnZhciBleHBvcnRBc3luY0JlaGF2aW9ycyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHBvcnQtYXN5bmMtYmVoYXZpb3JzXCIpO1xuXG52YXIgY29uY2F0ID0gYXJyYXlQcm90by5jb25jYXQ7XG52YXIgam9pbiA9IGFycmF5UHJvdG8uam9pbjtcbnZhciByZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xudmFyIHNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcblxudmFyIHVzZUxlZnRNb3N0Q2FsbGJhY2sgPSAtMTtcbnZhciB1c2VSaWdodE1vc3RDYWxsYmFjayA9IC0yO1xuXG5mdW5jdGlvbiBnZXRDYWxsYmFjayhiZWhhdmlvciwgYXJncykge1xuICAgIHZhciBjYWxsQXJnQXQgPSBiZWhhdmlvci5jYWxsQXJnQXQ7XG5cbiAgICBpZiAoY2FsbEFyZ0F0ID49IDApIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbY2FsbEFyZ0F0XTtcbiAgICB9XG5cbiAgICB2YXIgYXJndW1lbnRMaXN0O1xuXG4gICAgaWYgKGNhbGxBcmdBdCA9PT0gdXNlTGVmdE1vc3RDYWxsYmFjaykge1xuICAgICAgICBhcmd1bWVudExpc3QgPSBhcmdzO1xuICAgIH1cblxuICAgIGlmIChjYWxsQXJnQXQgPT09IHVzZVJpZ2h0TW9zdENhbGxiYWNrKSB7XG4gICAgICAgIGFyZ3VtZW50TGlzdCA9IHJldmVyc2Uoc2xpY2UoYXJncykpO1xuICAgIH1cblxuICAgIHZhciBjYWxsQXJnUHJvcCA9IGJlaGF2aW9yLmNhbGxBcmdQcm9wO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudExpc3QubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmICghY2FsbEFyZ1Byb3AgJiYgdHlwZW9mIGFyZ3VtZW50TGlzdFtpXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRMaXN0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbGxBcmdQcm9wICYmIGFyZ3VtZW50TGlzdFtpXSAmJiB0eXBlb2YgYXJndW1lbnRMaXN0W2ldW2NhbGxBcmdQcm9wXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRMaXN0W2ldW2NhbGxBcmdQcm9wXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDYWxsYmFja0Vycm9yKGJlaGF2aW9yLCBmdW5jLCBhcmdzKSB7XG4gICAgaWYgKGJlaGF2aW9yLmNhbGxBcmdBdCA8IDApIHtcbiAgICAgICAgdmFyIG1zZztcblxuICAgICAgICBpZiAoYmVoYXZpb3IuY2FsbEFyZ1Byb3ApIHtcbiAgICAgICAgICAgIG1zZyA9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lKGJlaGF2aW9yLnN0dWIpICtcbiAgICAgICAgICAgICAgICBcIiBleHBlY3RlZCB0byB5aWVsZCB0byAnXCIgK1xuICAgICAgICAgICAgICAgIHZhbHVlVG9TdHJpbmcoYmVoYXZpb3IuY2FsbEFyZ1Byb3ApICtcbiAgICAgICAgICAgICAgICBcIicsIGJ1dCBubyBvYmplY3Qgd2l0aCBzdWNoIGEgcHJvcGVydHkgd2FzIHBhc3NlZC5cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1zZyA9IGZ1bmN0aW9uTmFtZShiZWhhdmlvci5zdHViKSArIFwiIGV4cGVjdGVkIHRvIHlpZWxkLCBidXQgbm8gY2FsbGJhY2sgd2FzIHBhc3NlZC5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1zZyArPSBcIiBSZWNlaXZlZCBbXCIgKyBqb2luKGFyZ3MsIFwiLCBcIikgKyBcIl1cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiYXJndW1lbnQgYXQgaW5kZXggXCIgKyBiZWhhdmlvci5jYWxsQXJnQXQgKyBcIiBpcyBub3QgYSBmdW5jdGlvbjogXCIgKyBmdW5jO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVBcmdzKG5hbWUsIGJlaGF2aW9yLCBhcmdzKSB7XG4gICAgLy8gbWFwIGZ1bmN0aW9uIG5hbWUgdG8gaW50ZXJuYWwgcHJvcGVydHlcbiAgICAvLyAgIGNhbGxzQXJnID0+IGNhbGxBcmdBdFxuICAgIHZhciBwcm9wZXJ0eSA9IG5hbWUucmVwbGFjZSgvc0FyZy8sIFwiQXJnQXRcIik7XG4gICAgdmFyIGluZGV4ID0gYmVoYXZpb3JbcHJvcGVydHldO1xuXG4gICAgaWYgKGluZGV4ID49IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBuYW1lICsgXCIgZmFpbGVkOiBcIiArIChpbmRleCArIDEpICsgXCIgYXJndW1lbnRzIHJlcXVpcmVkIGJ1dCBvbmx5IFwiICsgYXJncy5sZW5ndGggKyBcIiBwcmVzZW50XCJcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDYWxsYmFjayhiZWhhdmlvciwgYXJncykge1xuICAgIGlmICh0eXBlb2YgYmVoYXZpb3IuY2FsbEFyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGVuc3VyZUFyZ3MoXCJjYWxsc0FyZ1wiLCBiZWhhdmlvciwgYXJncyk7XG4gICAgICAgIHZhciBmdW5jID0gZ2V0Q2FsbGJhY2soYmVoYXZpb3IsIGFyZ3MpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGdldENhbGxiYWNrRXJyb3IoYmVoYXZpb3IsIGZ1bmMsIGFyZ3MpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWhhdmlvci5jYWxsYmFja0FzeW5jKSB7XG4gICAgICAgICAgICBuZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KGJlaGF2aW9yLmNhbGxiYWNrQ29udGV4dCwgYmVoYXZpb3IuY2FsbGJhY2tBcmd1bWVudHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShiZWhhdmlvci5jYWxsYmFja0NvbnRleHQsIGJlaGF2aW9yLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbnZhciBwcm90byA9IHtcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZShzdHViKSB7XG4gICAgICAgIHZhciBiZWhhdmlvciA9IGV4dGVuZCh7fSwgcHJvdG8pO1xuICAgICAgICBkZWxldGUgYmVoYXZpb3IuY3JlYXRlO1xuICAgICAgICBkZWxldGUgYmVoYXZpb3IuYWRkQmVoYXZpb3I7XG4gICAgICAgIGRlbGV0ZSBiZWhhdmlvci5jcmVhdGVCZWhhdmlvcjtcbiAgICAgICAgYmVoYXZpb3Iuc3R1YiA9IHN0dWI7XG5cbiAgICAgICAgaWYgKHN0dWIuZGVmYXVsdEJlaGF2aW9yICYmIHN0dWIuZGVmYXVsdEJlaGF2aW9yLnByb21pc2VMaWJyYXJ5KSB7XG4gICAgICAgICAgICBiZWhhdmlvci5wcm9taXNlTGlicmFyeSA9IHN0dWIuZGVmYXVsdEJlaGF2aW9yLnByb21pc2VMaWJyYXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlaGF2aW9yO1xuICAgIH0sXG5cbiAgICBpc1ByZXNlbnQ6IGZ1bmN0aW9uIGlzUHJlc2VudCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNhbGxBcmdBdCA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gfHxcbiAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uQ3JlYXRvciB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucmV0dXJuQXJnQXQgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgIHRoaXMucmV0dXJuVGhpcyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucmVzb2x2ZUFyZ0F0ID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVUaGlzIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy50aHJvd0FyZ0F0ID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0aGlzLmZha2VGbiB8fFxuICAgICAgICAgICAgdGhpcy5yZXR1cm5WYWx1ZURlZmluZWRcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgaW52b2tlOiBmdW5jdGlvbiBpbnZva2UoY29udGV4dCwgYXJncykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBjYWxsQ2FsbGJhY2sgKGNvbmRpdGlvbmFsbHkpIGNhbGxzIGVuc3VyZUFyZ3NcbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZTogY2FsbENhbGxiYWNrIGludGVudGlvbmFsbHkgaGFwcGVucyBiZWZvcmVcbiAgICAgICAgICogZXZlcnl0aGluZyBlbHNlIGFuZCBjYW5ub3QgYmUgbW92ZWQgbG93ZXJcbiAgICAgICAgICovXG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGNhbGxDYWxsYmFjayh0aGlzLCBhcmdzKTtcblxuICAgICAgICBpZiAodGhpcy5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IHRoaXMuZXhjZXB0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXhjZXB0aW9uQ3JlYXRvcikge1xuICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gPSB0aGlzLmV4Y2VwdGlvbkNyZWF0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uQ3JlYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuZXhjZXB0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJldHVybkFyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBlbnN1cmVBcmdzKFwicmV0dXJuc0FyZ1wiLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBhcmdzW3RoaXMucmV0dXJuQXJnQXRdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmV0dXJuVGhpcykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMudGhyb3dBcmdBdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZW5zdXJlQXJncyhcInRocm93c0FyZ1wiLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHRocm93IGFyZ3NbdGhpcy50aHJvd0FyZ0F0XTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZha2VGbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFrZUZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlc29sdmVBcmdBdCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZW5zdXJlQXJncyhcInJlc29sdmVzQXJnXCIsIHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnByb21pc2VMaWJyYXJ5IHx8IFByb21pc2UpLnJlc29sdmUoYXJnc1t0aGlzLnJlc29sdmVBcmdBdF0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb2x2ZVRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5wcm9taXNlTGlicmFyeSB8fCBQcm9taXNlKS5yZXNvbHZlKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzb2x2ZSkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnByb21pc2VMaWJyYXJ5IHx8IFByb21pc2UpLnJlc29sdmUodGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5wcm9taXNlTGlicmFyeSB8fCBQcm9taXNlKS5yZWplY3QodGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsc1Rocm91Z2gpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0dWIud3JhcHBlZE1ldGhvZC5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZXR1cm5WYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY2FsbEFyZ0F0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5WYWx1ZTtcbiAgICB9LFxuXG4gICAgb25DYWxsOiBmdW5jdGlvbiBvbkNhbGwoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vbkNhbGwoaW5kZXgpO1xuICAgIH0sXG5cbiAgICBvbkZpcnN0Q2FsbDogZnVuY3Rpb24gb25GaXJzdENhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0dWIub25GaXJzdENhbGwoKTtcbiAgICB9LFxuXG4gICAgb25TZWNvbmRDYWxsOiBmdW5jdGlvbiBvblNlY29uZENhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0dWIub25TZWNvbmRDYWxsKCk7XG4gICAgfSxcblxuICAgIG9uVGhpcmRDYWxsOiBmdW5jdGlvbiBvblRoaXJkQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1Yi5vblRoaXJkQ2FsbCgpO1xuICAgIH0sXG5cbiAgICB3aXRoQXJnczogZnVuY3Rpb24gd2l0aEFyZ3MoLyogYXJndW1lbnRzICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdEZWZpbmluZyBhIHN0dWIgYnkgaW52b2tpbmcgXCJzdHViLm9uQ2FsbCguLi4pLndpdGhBcmdzKC4uLilcIiAnICtcbiAgICAgICAgICAgICAgICAnaXMgbm90IHN1cHBvcnRlZC4gVXNlIFwic3R1Yi53aXRoQXJncyguLi4pLm9uQ2FsbCguLi4pXCIgJyArXG4gICAgICAgICAgICAgICAgXCJ0byBkZWZpbmUgc2VxdWVudGlhbCBiZWhhdmlvciBmb3IgY2FsbHMgd2l0aCBjZXJ0YWluIGFyZ3VtZW50cy5cIlxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJlaGF2aW9yKGJlaGF2aW9yTWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvciA9IHRoaXMuZGVmYXVsdEJlaGF2aW9yIHx8IHByb3RvLmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QmVoYXZpb3JbYmVoYXZpb3JNZXRob2RdLmFwcGx5KHRoaXMuZGVmYXVsdEJlaGF2aW9yLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRCZWhhdmlvcihzdHViLCBuYW1lLCBmbikge1xuICAgIHByb3RvW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGNvbmNhdChbdGhpc10sIHNsaWNlKGFyZ3VtZW50cykpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R1YiB8fCB0aGlzO1xuICAgIH07XG5cbiAgICBzdHViW25hbWVdID0gY3JlYXRlQmVoYXZpb3IobmFtZSk7XG59XG5cbnByb3RvLmFkZEJlaGF2aW9yID0gYWRkQmVoYXZpb3I7XG5wcm90by5jcmVhdGVCZWhhdmlvciA9IGNyZWF0ZUJlaGF2aW9yO1xuXG52YXIgYXN5bmNCZWhhdmlvcnMgPSBleHBvcnRBc3luY0JlaGF2aW9ycyhwcm90byk7XG5cbm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kLm5vbkVudW0oe30sIHByb3RvLCBhc3luY0JlaGF2aW9ycyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIG1hdGNoID0gcmVxdWlyZShcIkBzaW5vbmpzL3NhbXNhbVwiKS5jcmVhdGVNYXRjaGVyO1xudmFyIGRlZXBFcXVhbCA9IHJlcXVpcmUoXCJAc2lub25qcy9zYW1zYW1cIikuZGVlcEVxdWFsO1xudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmZ1bmN0aW9uTmFtZTtcbnZhciBzaW5vbkZvcm1hdCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mb3JtYXRcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbnZhciBjb25jYXQgPSBhcnJheVByb3RvLmNvbmNhdDtcbnZhciBmaWx0ZXIgPSBhcnJheVByb3RvLmZpbHRlcjtcbnZhciBqb2luID0gYXJyYXlQcm90by5qb2luO1xudmFyIG1hcCA9IGFycmF5UHJvdG8ubWFwO1xudmFyIHJlZHVjZSA9IGFycmF5UHJvdG8ucmVkdWNlO1xudmFyIHNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcblxuZnVuY3Rpb24gdGhyb3dZaWVsZEVycm9yKHByb3h5LCB0ZXh0LCBhcmdzKSB7XG4gICAgdmFyIG1zZyA9IGZ1bmN0aW9uTmFtZShwcm94eSkgKyB0ZXh0O1xuICAgIGlmIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBtc2cgKz0gXCIgUmVjZWl2ZWQgW1wiICsgam9pbihzbGljZShhcmdzKSwgXCIsIFwiKSArIFwiXVwiO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cblxudmFyIGNhbGxQcm90byA9IHtcbiAgICBjYWxsZWRPbjogZnVuY3Rpb24gY2FsbGVkT24odGhpc1ZhbHVlKSB7XG4gICAgICAgIGlmIChtYXRjaC5pc01hdGNoZXIodGhpc1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNWYWx1ZS50ZXN0KHRoaXMudGhpc1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50aGlzVmFsdWUgPT09IHRoaXNWYWx1ZTtcbiAgICB9LFxuXG4gICAgY2FsbGVkV2l0aDogZnVuY3Rpb24gY2FsbGVkV2l0aCgpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgY2FsbGVkV2l0aEFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChjYWxsZWRXaXRoQXJncy5sZW5ndGggPiBzZWxmLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgICAgICAgY2FsbGVkV2l0aEFyZ3MsXG4gICAgICAgICAgICBmdW5jdGlvbihwcmV2LCBhcmcsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiAmJiBkZWVwRXF1YWwoc2VsZi5hcmdzW2ldLCBhcmcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2FsbGVkV2l0aE1hdGNoOiBmdW5jdGlvbiBjYWxsZWRXaXRoTWF0Y2goKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGNhbGxlZFdpdGhNYXRjaEFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChjYWxsZWRXaXRoTWF0Y2hBcmdzLmxlbmd0aCA+IHNlbGYuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWR1Y2UoXG4gICAgICAgICAgICBjYWxsZWRXaXRoTWF0Y2hBcmdzLFxuICAgICAgICAgICAgZnVuY3Rpb24ocHJldiwgZXhwZWN0YXRpb24sIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gc2VsZi5hcmdzW2ldO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgJiYgbWF0Y2goZXhwZWN0YXRpb24pLnRlc3QoYWN0dWFsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGNhbGxlZFdpdGhFeGFjdGx5OiBmdW5jdGlvbiBjYWxsZWRXaXRoRXhhY3RseSgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IHRoaXMuYXJncy5sZW5ndGggJiYgdGhpcy5jYWxsZWRXaXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIG5vdENhbGxlZFdpdGg6IGZ1bmN0aW9uIG5vdENhbGxlZFdpdGgoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jYWxsZWRXaXRoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIG5vdENhbGxlZFdpdGhNYXRjaDogZnVuY3Rpb24gbm90Q2FsbGVkV2l0aE1hdGNoKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2FsbGVkV2l0aE1hdGNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIHJldHVybmVkOiBmdW5jdGlvbiByZXR1cm5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKHRoaXMucmV0dXJuVmFsdWUsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgdGhyZXc6IGZ1bmN0aW9uIHRocmV3KGVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09IFwidW5kZWZpbmVkXCIgfHwgIXRoaXMuZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmV4Y2VwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5leGNlcHRpb24gPT09IGVycm9yIHx8IHRoaXMuZXhjZXB0aW9uLm5hbWUgPT09IGVycm9yO1xuICAgIH0sXG5cbiAgICBjYWxsZWRXaXRoTmV3OiBmdW5jdGlvbiBjYWxsZWRXaXRoTmV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5wcm90b3R5cGUgJiYgdGhpcy50aGlzVmFsdWUgaW5zdGFuY2VvZiB0aGlzLnByb3h5O1xuICAgIH0sXG5cbiAgICBjYWxsZWRCZWZvcmU6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA8IG90aGVyLmNhbGxJZDtcbiAgICB9LFxuXG4gICAgY2FsbGVkQWZ0ZXI6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA+IG90aGVyLmNhbGxJZDtcbiAgICB9LFxuXG4gICAgY2FsbGVkSW1tZWRpYXRlbHlCZWZvcmU6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJZCA9PT0gb3RoZXIuY2FsbElkIC0gMTtcbiAgICB9LFxuXG4gICAgY2FsbGVkSW1tZWRpYXRlbHlBZnRlcjogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbElkID09PSBvdGhlci5jYWxsSWQgKyAxO1xuICAgIH0sXG5cbiAgICBjYWxsQXJnOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVBcmdJc0FGdW5jdGlvbihwb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzW3Bvc10oKTtcbiAgICB9LFxuXG4gICAgY2FsbEFyZ09uOiBmdW5jdGlvbihwb3MsIHRoaXNWYWx1ZSkge1xuICAgICAgICB0aGlzLmVuc3VyZUFyZ0lzQUZ1bmN0aW9uKHBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3NbcG9zXS5hcHBseSh0aGlzVmFsdWUpO1xuICAgIH0sXG5cbiAgICBjYWxsQXJnV2l0aDogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcmdPbldpdGguYXBwbHkodGhpcywgY29uY2F0KFtwb3MsIG51bGxdLCBzbGljZShhcmd1bWVudHMsIDEpKSk7XG4gICAgfSxcblxuICAgIGNhbGxBcmdPbldpdGg6IGZ1bmN0aW9uKHBvcywgdGhpc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlQXJnSXNBRnVuY3Rpb24ocG9zKTtcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzW3Bvc10uYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICB9LFxuXG4gICAgdGhyb3dBcmc6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICBpZiAocG9zID4gdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vdCBlbm91Z2ggYXJndW1lbnRzOiBcIiArIHBvcyArIFwiIHJlcXVpcmVkIGJ1dCBvbmx5IFwiICsgdGhpcy5hcmdzLmxlbmd0aCArIFwiIHByZXNlbnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyB0aGlzLmFyZ3NbcG9zXTtcbiAgICB9LFxuXG4gICAgeWllbGQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZE9uLmFwcGx5KHRoaXMsIGNvbmNhdChbbnVsbF0sIHNsaWNlKGFyZ3VtZW50cywgMCkpKTtcbiAgICB9LFxuXG4gICAgeWllbGRPbjogZnVuY3Rpb24odGhpc1ZhbHVlKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UodGhpcy5hcmdzKTtcbiAgICAgICAgdmFyIHlpZWxkRm4gPSBmaWx0ZXIoYXJncywgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9KVswXTtcblxuICAgICAgICBpZiAoIXlpZWxkRm4pIHtcbiAgICAgICAgICAgIHRocm93WWllbGRFcnJvcih0aGlzLnByb3h5LCBcIiBjYW5ub3QgeWllbGQgc2luY2Ugbm8gY2FsbGJhY2sgd2FzIHBhc3NlZC5cIiwgYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geWllbGRGbi5hcHBseSh0aGlzVmFsdWUsIHNsaWNlKGFyZ3VtZW50cywgMSkpO1xuICAgIH0sXG5cbiAgICB5aWVsZFRvOiBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkVG9Pbi5hcHBseSh0aGlzLCBjb25jYXQoW3Byb3AsIG51bGxdLCBzbGljZShhcmd1bWVudHMsIDEpKSk7XG4gICAgfSxcblxuICAgIHlpZWxkVG9PbjogZnVuY3Rpb24ocHJvcCwgdGhpc1ZhbHVlKSB7XG4gICAgICAgIHZhciBhcmdzID0gc2xpY2UodGhpcy5hcmdzKTtcbiAgICAgICAgdmFyIHlpZWxkQXJnID0gZmlsdGVyKGFyZ3MsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnW3Byb3BdID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH0pWzBdO1xuICAgICAgICB2YXIgeWllbGRGbiA9IHlpZWxkQXJnICYmIHlpZWxkQXJnW3Byb3BdO1xuXG4gICAgICAgIGlmICgheWllbGRGbikge1xuICAgICAgICAgICAgdGhyb3dZaWVsZEVycm9yKFxuICAgICAgICAgICAgICAgIHRoaXMucHJveHksXG4gICAgICAgICAgICAgICAgXCIgY2Fubm90IHlpZWxkIHRvICdcIiArIHZhbHVlVG9TdHJpbmcocHJvcCkgKyBcIicgc2luY2Ugbm8gY2FsbGJhY2sgd2FzIHBhc3NlZC5cIixcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHlpZWxkRm4uYXBwbHkodGhpc1ZhbHVlLCBzbGljZShhcmd1bWVudHMsIDIpKTtcbiAgICB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgY2FsbFN0ciA9IHRoaXMucHJveHkgPyBTdHJpbmcodGhpcy5wcm94eSkgKyBcIihcIiA6IFwiXCI7XG4gICAgICAgIHZhciBmb3JtYXR0ZWRBcmdzO1xuXG4gICAgICAgIGlmICghdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI6KFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0dGVkQXJncyA9IG1hcCh0aGlzLmFyZ3MsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIHNpbm9uRm9ybWF0KGFyZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxTdHIgPSBjYWxsU3RyICsgam9pbihmb3JtYXR0ZWRBcmdzLCBcIiwgXCIpICsgXCIpXCI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJldHVyblZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjYWxsU3RyICs9IFwiID0+IFwiICsgc2lub25Gb3JtYXQodGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIGNhbGxTdHIgKz0gXCIgIVwiICsgdGhpcy5leGNlcHRpb24ubmFtZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjYWxsU3RyICs9IFwiKFwiICsgdGhpcy5leGNlcHRpb24ubWVzc2FnZSArIFwiKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YWNrKSB7XG4gICAgICAgICAgICAvLyBPbWl0IHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgdHdvIHRvcCBzdGFjayBmcmFtZXMgaW4gc2lub24gaXRzZWxmOlxuICAgICAgICAgICAgY2FsbFN0ciArPSAodGhpcy5zdGFjay5zcGxpdChcIlxcblwiKVszXSB8fCBcInVua25vd25cIikucmVwbGFjZSgvXlxccyooPzphdFxccyt8QCk/LywgXCIgYXQgXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxTdHI7XG4gICAgfSxcblxuICAgIGVuc3VyZUFyZ0lzQUZ1bmN0aW9uOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFyZ3NbcG9zXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiRXhwZWN0ZWQgYXJndW1lbnQgYXQgcG9zaXRpb24gXCIgKyBwb3MgKyBcIiB0byBiZSBhIEZ1bmN0aW9uLCBidXQgd2FzIFwiICsgdHlwZW9mIHRoaXMuYXJnc1twb3NdXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYWxsUHJvdG8sIFwic3RhY2tcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5lcnJvcldpdGhDYWxsU3RhY2sgJiYgdGhpcy5lcnJvcldpdGhDYWxsU3RhY2suc3RhY2spIHx8IFwiXCI7XG4gICAgfVxufSk7XG5cbmNhbGxQcm90by5pbnZva2VDYWxsYmFjayA9IGNhbGxQcm90by55aWVsZDtcblxuZnVuY3Rpb24gY3JlYXRlU3B5Q2FsbChzcHksIHRoaXNWYWx1ZSwgYXJncywgcmV0dXJuVmFsdWUsIGV4Y2VwdGlvbiwgaWQsIGVycm9yV2l0aENhbGxTdGFjaykge1xuICAgIGlmICh0eXBlb2YgaWQgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbGwgaWQgaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgIH1cblxuICAgIHZhciBwcm94eUNhbGwgPSBPYmplY3QuY3JlYXRlKGNhbGxQcm90byk7XG4gICAgdmFyIGxhc3RBcmcgPSAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbYXJncy5sZW5ndGggLSAxXSkgfHwgdW5kZWZpbmVkO1xuICAgIHZhciBjYWxsYmFjayA9IGxhc3RBcmcgJiYgdHlwZW9mIGxhc3RBcmcgPT09IFwiZnVuY3Rpb25cIiA/IGxhc3RBcmcgOiB1bmRlZmluZWQ7XG5cbiAgICBwcm94eUNhbGwucHJveHkgPSBzcHk7XG4gICAgcHJveHlDYWxsLnRoaXNWYWx1ZSA9IHRoaXNWYWx1ZTtcbiAgICBwcm94eUNhbGwuYXJncyA9IGFyZ3M7XG4gICAgcHJveHlDYWxsLmxhc3RBcmcgPSBsYXN0QXJnO1xuICAgIHByb3h5Q2FsbC5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHByb3h5Q2FsbC5yZXR1cm5WYWx1ZSA9IHJldHVyblZhbHVlO1xuICAgIHByb3h5Q2FsbC5leGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgcHJveHlDYWxsLmNhbGxJZCA9IGlkO1xuICAgIHByb3h5Q2FsbC5lcnJvcldpdGhDYWxsU3RhY2sgPSBlcnJvcldpdGhDYWxsU3RhY2s7XG5cbiAgICByZXR1cm4gcHJveHlDYWxsO1xufVxuY3JlYXRlU3B5Q2FsbC50b1N0cmluZyA9IGNhbGxQcm90by50b1N0cmluZzsgLy8gdXNlZCBieSBtb2Nrc1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVNweUNhbGw7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHdhbGsgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvd2Fsa1wiKTtcbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLm9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwdXNoID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheS5wdXNoO1xuXG5mdW5jdGlvbiBjb2xsZWN0TWV0aG9kKG1ldGhvZHMsIG9iamVjdCwgcHJvcCwgcHJvcE93bmVyKSB7XG4gICAgaWYgKHR5cGVvZiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcE93bmVyLCBwcm9wKS52YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIGhhc093blByb3BlcnR5KG9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgcHVzaChtZXRob2RzLCBvYmplY3RbcHJvcF0pO1xuICAgIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgb3duIG1ldGhvZHMgb24gdGhlIHBhc3NlZCBvYmplY3RcbmZ1bmN0aW9uIGNvbGxlY3RPd25NZXRob2RzKG9iamVjdCkge1xuICAgIHZhciBtZXRob2RzID0gW107XG5cbiAgICB3YWxrKG9iamVjdCwgY29sbGVjdE1ldGhvZC5iaW5kKG51bGwsIG1ldGhvZHMsIG9iamVjdCkpO1xuXG4gICAgcmV0dXJuIG1ldGhvZHM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGVjdE93bk1ldGhvZHM7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKFwic3VwcG9ydHMtY29sb3JcIik7XG5cbmZ1bmN0aW9uIGNvbG9yaXplKHN0ciwgY29sb3IpIHtcbiAgICBpZiAoc3VwcG9ydHNDb2xvci5zdGRvdXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXFx4MWJbXCIgKyBjb2xvciArIFwibVwiICsgc3RyICsgXCJcXHgxYlswbVwiO1xufVxuXG5leHBvcnRzLnJlZCA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHJldHVybiBjb2xvcml6ZShzdHIsIDMxKTtcbn07XG5cbmV4cG9ydHMuZ3JlZW4gPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gY29sb3JpemUoc3RyLCAzMik7XG59O1xuXG5leHBvcnRzLmN5YW4gPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gY29sb3JpemUoc3RyLCA5Nik7XG59O1xuXG5leHBvcnRzLndoaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIGNvbG9yaXplKHN0ciwgMzkpO1xufTtcblxuZXhwb3J0cy5ib2xkID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIGNvbG9yaXplKHN0ciwgMSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBTYW5kYm94ID0gcmVxdWlyZShcIi4vc2FuZGJveFwiKTtcblxudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZvckVhY2g7XG52YXIgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcblxuZnVuY3Rpb24gcHJlcGFyZVNhbmRib3hGcm9tQ29uZmlnKGNvbmZpZykge1xuICAgIHZhciBzYW5kYm94ID0gbmV3IFNhbmRib3goKTtcblxuICAgIGlmIChjb25maWcudXNlRmFrZVNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy51c2VGYWtlU2VydmVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBzYW5kYm94LnNlcnZlclByb3RvdHlwZSA9IGNvbmZpZy51c2VGYWtlU2VydmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgc2FuZGJveC51c2VGYWtlU2VydmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy51c2VGYWtlVGltZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnVzZUZha2VUaW1lcnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHNhbmRib3gudXNlRmFrZVRpbWVycyhjb25maWcudXNlRmFrZVRpbWVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzYW5kYm94LnVzZUZha2VUaW1lcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzYW5kYm94O1xufVxuXG5mdW5jdGlvbiBleHBvc2VWYWx1ZShzYW5kYm94LCBjb25maWcsIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmluamVjdEludG8gJiYgIShrZXkgaW4gY29uZmlnLmluamVjdEludG8pKSB7XG4gICAgICAgIGNvbmZpZy5pbmplY3RJbnRvW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcHVzaChzYW5kYm94LmluamVjdGVkS2V5cywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoKHNhbmRib3guYXJncywgdmFsdWUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU2FuZGJveChjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICByZXR1cm4gbmV3IFNhbmRib3goKTtcbiAgICB9XG5cbiAgICB2YXIgY29uZmlndXJlZFNhbmRib3ggPSBwcmVwYXJlU2FuZGJveEZyb21Db25maWcoY29uZmlnKTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5hcmdzID0gY29uZmlndXJlZFNhbmRib3guYXJncyB8fCBbXTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5pbmplY3RlZEtleXMgPSBbXTtcbiAgICBjb25maWd1cmVkU2FuZGJveC5pbmplY3RJbnRvID0gY29uZmlnLmluamVjdEludG87XG4gICAgdmFyIGV4cG9zZWQgPSBjb25maWd1cmVkU2FuZGJveC5pbmplY3Qoe30pO1xuXG4gICAgaWYgKGNvbmZpZy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvckVhY2goY29uZmlnLnByb3BlcnRpZXMsIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGV4cG9zZWRbcHJvcF0gfHwgKHByb3AgPT09IFwic2FuZGJveFwiICYmIGNvbmZpZ3VyZWRTYW5kYm94KTtcbiAgICAgICAgICAgIGV4cG9zZVZhbHVlKGNvbmZpZ3VyZWRTYW5kYm94LCBjb25maWcsIHByb3AsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXhwb3NlVmFsdWUoY29uZmlndXJlZFNhbmRib3gsIGNvbmZpZywgXCJzYW5kYm94XCIpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWd1cmVkU2FuZGJveDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVTYW5kYm94O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBpc1Byb3BlcnR5Q29uZmlndXJhYmxlID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2lzLXByb3BlcnR5LWNvbmZpZ3VyYWJsZVwiKTtcbnZhciBleHBvcnRBc3luY0JlaGF2aW9ycyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHBvcnQtYXN5bmMtYmVoYXZpb3JzXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG5cbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbnZhciB1c2VMZWZ0TW9zdENhbGxiYWNrID0gLTE7XG52YXIgdXNlUmlnaHRNb3N0Q2FsbGJhY2sgPSAtMjtcblxuZnVuY3Rpb24gdGhyb3dzRXhjZXB0aW9uKGZha2UsIGVycm9yLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IGVycm9yO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG5ld0V4Y2VwdGlvbiA9IG5ldyBFcnJvcihtZXNzYWdlIHx8IFwiXCIpO1xuICAgICAgICAgICAgbmV3RXhjZXB0aW9uLm5hbWUgPSBlcnJvcjtcbiAgICAgICAgICAgIHJldHVybiBuZXdFeGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICghZXJyb3IpIHtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFwiRXJyb3JcIik7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmFrZS5leGNlcHRpb24gPSBlcnJvcjtcbiAgICB9XG59XG5cbnZhciBkZWZhdWx0QmVoYXZpb3JzID0ge1xuICAgIGNhbGxzRmFrZTogZnVuY3Rpb24gY2FsbHNGYWtlKGZha2UsIGZuKSB7XG4gICAgICAgIGZha2UuZmFrZUZuID0gZm47XG4gICAgfSxcblxuICAgIGNhbGxzQXJnOiBmdW5jdGlvbiBjYWxsc0FyZyhmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gaW5kZXg7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjYWxsc0FyZ09uOiBmdW5jdGlvbiBjYWxsc0FyZ09uKGZha2UsIGluZGV4LCBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBpbmRleCBpcyBub3QgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSBpbmRleDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IFtdO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICBjYWxsc0FyZ1dpdGg6IGZ1bmN0aW9uIGNhbGxzQXJnV2l0aChmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gaW5kZXg7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsYmFja0FzeW5jID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNhbGxzQXJnT25XaXRoOiBmdW5jdGlvbiBjYWxsc0FyZ1dpdGgoZmFrZSwgaW5kZXgsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IGluZGV4O1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzLCAzKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBmYWtlLmNhbGxBcmdQcm9wID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXN5bmMgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgdXNpbmdQcm9taXNlOiBmdW5jdGlvbiB1c2luZ1Byb21pc2UoZmFrZSwgcHJvbWlzZUxpYnJhcnkpIHtcbiAgICAgICAgZmFrZS5wcm9taXNlTGlicmFyeSA9IHByb21pc2VMaWJyYXJ5O1xuICAgIH0sXG5cbiAgICB5aWVsZHM6IGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgZmFrZS5jYWxsQXJnQXQgPSB1c2VMZWZ0TW9zdENhbGxiYWNrO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNSaWdodDogZnVuY3Rpb24oZmFrZSkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZVJpZ2h0TW9zdENhbGxiYWNrO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgZmFrZS5jYWxsYmFja0NvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNPbjogZnVuY3Rpb24oZmFrZSwgY29udGV4dCkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGZha2UuY2FsbEFyZ1Byb3AgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNUbzogZnVuY3Rpb24oZmFrZSwgcHJvcCkge1xuICAgICAgICBmYWtlLmNhbGxBcmdBdCA9IHVzZUxlZnRNb3N0Q2FsbGJhY2s7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBcmd1bWVudHMgPSBzbGljZShhcmd1bWVudHMsIDIpO1xuICAgICAgICBmYWtlLmNhbGxiYWNrQ29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHByb3A7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB5aWVsZHNUb09uOiBmdW5jdGlvbihmYWtlLCBwcm9wLCBjb250ZXh0KSB7XG4gICAgICAgIGZha2UuY2FsbEFyZ0F0ID0gdXNlTGVmdE1vc3RDYWxsYmFjaztcbiAgICAgICAgZmFrZS5jYWxsYmFja0FyZ3VtZW50cyA9IHNsaWNlKGFyZ3VtZW50cywgMyk7XG4gICAgICAgIGZha2UuY2FsbGJhY2tDb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgZmFrZS5jYWxsQXJnUHJvcCA9IHByb3A7XG4gICAgICAgIGZha2UuY2FsbGJhY2tBc3luYyA9IGZhbHNlO1xuICAgIH0sXG5cbiAgICB0aHJvd3M6IHRocm93c0V4Y2VwdGlvbixcbiAgICB0aHJvd3NFeGNlcHRpb246IHRocm93c0V4Y2VwdGlvbixcblxuICAgIHJldHVybnM6IGZ1bmN0aW9uIHJldHVybnMoZmFrZSwgdmFsdWUpIHtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZWplY3QgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSB0cnVlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmZha2VGbiA9IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgcmV0dXJuc0FyZzogZnVuY3Rpb24gcmV0dXJuc0FyZyhmYWtlLCBpbmRleCkge1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgaW5kZXggaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZha2UucmV0dXJuQXJnQXQgPSBpbmRleDtcbiAgICB9LFxuXG4gICAgdGhyb3dzQXJnOiBmdW5jdGlvbiB0aHJvd3NBcmcoZmFrZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmYWtlLnRocm93QXJnQXQgPSBpbmRleDtcbiAgICB9LFxuXG4gICAgcmV0dXJuc1RoaXM6IGZ1bmN0aW9uIHJldHVybnNUaGlzKGZha2UpIHtcbiAgICAgICAgZmFrZS5yZXR1cm5UaGlzID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgcmVzb2x2ZXM6IGZ1bmN0aW9uIHJlc29sdmVzKGZha2UsIHZhbHVlKSB7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlVGhpcyA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlamVjdCA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlRGVmaW5lZCA9IHRydWU7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICByZXNvbHZlc0FyZzogZnVuY3Rpb24gcmVzb2x2ZXNBcmcoZmFrZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IGluZGV4IGlzIG5vdCBudW1iZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZmFrZS5yZXNvbHZlQXJnQXQgPSBpbmRleDtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5yZXNvbHZlID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlVGhpcyA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlamVjdCA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlRGVmaW5lZCA9IGZhbHNlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmZha2VGbiA9IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgcmVqZWN0czogZnVuY3Rpb24gcmVqZWN0cyhmYWtlLCBlcnJvciwgbWVzc2FnZSkge1xuICAgICAgICB2YXIgcmVhc29uO1xuICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZWFzb24gPSBuZXcgRXJyb3IobWVzc2FnZSB8fCBcIlwiKTtcbiAgICAgICAgICAgIHJlYXNvbi5uYW1lID0gZXJyb3I7XG4gICAgICAgIH0gZWxzZSBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZWFzb24gPSBuZXcgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYXNvbiA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWUgPSByZWFzb247XG4gICAgICAgIGZha2UucmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICBmYWtlLnJlc29sdmVUaGlzID0gZmFsc2U7XG4gICAgICAgIGZha2UucmVqZWN0ID0gdHJ1ZTtcbiAgICAgICAgZmFrZS5yZXR1cm5WYWx1ZURlZmluZWQgPSB0cnVlO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgZmFrZS5leGNlcHRpb25DcmVhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmZha2VGbiA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxuXG4gICAgcmVzb2x2ZXNUaGlzOiBmdW5jdGlvbiByZXNvbHZlc1RoaXMoZmFrZSkge1xuICAgICAgICBmYWtlLnJldHVyblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLnJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgZmFrZS5yZXNvbHZlVGhpcyA9IHRydWU7XG4gICAgICAgIGZha2UucmVqZWN0ID0gZmFsc2U7XG4gICAgICAgIGZha2UucmV0dXJuVmFsdWVEZWZpbmVkID0gZmFsc2U7XG4gICAgICAgIGZha2UuZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBmYWtlLmV4Y2VwdGlvbkNyZWF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZha2UuZmFrZUZuID0gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBjYWxsVGhyb3VnaDogZnVuY3Rpb24gY2FsbFRocm91Z2goZmFrZSkge1xuICAgICAgICBmYWtlLmNhbGxzVGhyb3VnaCA9IHRydWU7XG4gICAgfSxcblxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGZha2UsIGdldHRlckZ1bmN0aW9uKSB7XG4gICAgICAgIHZhciByb290U3R1YiA9IGZha2Uuc3R1YiB8fCBmYWtlO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyb290U3R1Yi5yb290T2JqLCByb290U3R1Yi5wcm9wTmFtZSwge1xuICAgICAgICAgICAgZ2V0OiBnZXR0ZXJGdW5jdGlvbixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZShyb290U3R1Yi5yb290T2JqLCByb290U3R1Yi5wcm9wTmFtZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZha2U7XG4gICAgfSxcblxuICAgIHNldDogZnVuY3Rpb24gc2V0KGZha2UsIHNldHRlckZ1bmN0aW9uKSB7XG4gICAgICAgIHZhciByb290U3R1YiA9IGZha2Uuc3R1YiB8fCBmYWtlO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgIHJvb3RTdHViLnJvb3RPYmosXG4gICAgICAgICAgICByb290U3R1Yi5wcm9wTmFtZSxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhY2Nlc3Nvci1wYWlyc1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNldDogc2V0dGVyRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKHJvb3RTdHViLnJvb3RPYmosIHJvb3RTdHViLnByb3BOYW1lKVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBmYWtlO1xuICAgIH0sXG5cbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoZmFrZSwgbmV3VmFsKSB7XG4gICAgICAgIHZhciByb290U3R1YiA9IGZha2Uuc3R1YiB8fCBmYWtlO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyb290U3R1Yi5yb290T2JqLCByb290U3R1Yi5wcm9wTmFtZSwge1xuICAgICAgICAgICAgdmFsdWU6IG5ld1ZhbCxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGlzUHJvcGVydHlDb25maWd1cmFibGUocm9vdFN0dWIucm9vdE9iaiwgcm9vdFN0dWIucHJvcE5hbWUpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWtlO1xuICAgIH1cbn07XG5cbnZhciBhc3luY0JlaGF2aW9ycyA9IGV4cG9ydEFzeW5jQmVoYXZpb3JzKGRlZmF1bHRCZWhhdmlvcnMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4dGVuZCh7fSwgZGVmYXVsdEJlaGF2aW9ycywgYXN5bmNCZWhhdmlvcnMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBzcHkgPSByZXF1aXJlKFwiLi9zcHlcIik7XG52YXIgbmV4dFRpY2sgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvbmV4dC10aWNrXCIpO1xuXG52YXIgZm9yRWFjaCA9IGFycmF5UHJvdG8uZm9yRWFjaDtcbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG5cbmZ1bmN0aW9uIGdldEVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgPyB2YWx1ZSA6IG5ldyBFcnJvcih2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFuUHJveHkoZikge1xuICAgIHZhciB1bmRlc2lyYWJsZVByb3BlcnRpZXMgPSBbXG4gICAgICAgIFwiaW5zdGFudGlhdGVGYWtlXCIsXG4gICAgICAgIFwiY2FsbEFyZ1wiLFxuICAgICAgICBcImNhbGxBcmdPblwiLFxuICAgICAgICBcImNhbGxBcmdPbldpdGhcIixcbiAgICAgICAgXCJjYWxsQXJnV2l0aFwiLFxuICAgICAgICBcImludm9rZUNhbGxiYWNrXCIsXG4gICAgICAgIFwidGhyb3dBcmdcIixcbiAgICAgICAgXCJ3aXRoQXJnc1wiLFxuICAgICAgICBcInlpZWxkXCIsXG4gICAgICAgIFwieWllbGRPblwiLFxuICAgICAgICBcInlpZWxkVG9cIixcbiAgICAgICAgXCJ5aWVsZFRvT25cIlxuICAgIF07XG5cbiAgICBmb3JFYWNoKHVuZGVzaXJhYmxlUHJvcGVydGllcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGRlbGV0ZSBmW2tleV07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZjtcbn1cblxudmFyIHV1aWQgPSAwO1xuZnVuY3Rpb24gd3JhcEZ1bmMoZikge1xuICAgIHZhciBmYWtlSW5zdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGxhc3RBcmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGxhc3RBcmcgJiYgdHlwZW9mIGxhc3RBcmcgPT09IFwiZnVuY3Rpb25cIiA/IGxhc3RBcmcgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbiAgICAgICAgcC5sYXN0QXJnID0gbGFzdEFyZztcbiAgICAgICAgcC5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5cbiAgICAgICAgcmV0dXJuIGYgJiYgZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgdmFyIHAgPSBjbGVhblByb3h5KHNweShmYWtlSW5zdGFuY2UpKTtcblxuICAgIHAuZGlzcGxheU5hbWUgPSBcImZha2VcIjtcbiAgICBwLmlkID0gXCJmYWtlI1wiICsgdXVpZCsrO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIGZha2UoZikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBmIGFyZ3VtZW50IHRvIGJlIGEgRnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xufVxuXG5mYWtlLnJldHVybnMgPSBmdW5jdGlvbiByZXR1cm5zKHZhbHVlKSB7XG4gICAgZnVuY3Rpb24gZigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwRnVuYyhmKTtcbn07XG5cbmZha2UudGhyb3dzID0gZnVuY3Rpb24gdGhyb3dzKHZhbHVlKSB7XG4gICAgZnVuY3Rpb24gZigpIHtcbiAgICAgICAgdGhyb3cgZ2V0RXJyb3IodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwRnVuYyhmKTtcbn07XG5cbmZha2UucmVzb2x2ZXMgPSBmdW5jdGlvbiByZXNvbHZlcyh2YWx1ZSkge1xuICAgIGZ1bmN0aW9uIGYoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwRnVuYyhmKTtcbn07XG5cbmZha2UucmVqZWN0cyA9IGZ1bmN0aW9uIHJlamVjdHModmFsdWUpIHtcbiAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZ2V0RXJyb3IodmFsdWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcEZ1bmMoZik7XG59O1xuXG5mdW5jdGlvbiB5aWVsZEludGVybmFsKGFzeW5jLCB2YWx1ZXMpIHtcbiAgICBmdW5jdGlvbiBmKCkge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBsYXN0IGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBuZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCB2YWx1ZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBGdW5jKGYpO1xufVxuXG5mYWtlLnlpZWxkcyA9IGZ1bmN0aW9uIHlpZWxkcygpIHtcbiAgICByZXR1cm4geWllbGRJbnRlcm5hbChmYWxzZSwgc2xpY2UoYXJndW1lbnRzKSk7XG59O1xuXG5mYWtlLnlpZWxkc0FzeW5jID0gZnVuY3Rpb24geWllbGRzQXN5bmMoKSB7XG4gICAgcmV0dXJuIHlpZWxkSW50ZXJuYWwodHJ1ZSwgc2xpY2UoYXJndW1lbnRzKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZha2U7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIHNweUludm9rZSA9IHJlcXVpcmUoXCIuL3NweVwiKS5pbnZva2U7XG52YXIgc3B5Q2FsbFRvU3RyaW5nID0gcmVxdWlyZShcIi4vY2FsbFwiKS50b1N0cmluZztcbnZhciB0aW1lc0luV29yZHMgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdGltZXMtaW4td29yZHNcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2V4dGVuZFwiKTtcbnZhciBtYXRjaCA9IHJlcXVpcmUoXCJAc2lub25qcy9zYW1zYW1cIikuY3JlYXRlTWF0Y2hlcjtcbnZhciBzdHViID0gcmVxdWlyZShcIi4vc3R1YlwiKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKFwiLi9hc3NlcnRcIik7XG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZShcIkBzaW5vbmpzL3NhbXNhbVwiKS5kZWVwRXF1YWw7XG52YXIgZm9ybWF0ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2Zvcm1hdFwiKTtcbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcblxudmFyIGV2ZXJ5ID0gYXJyYXlQcm90by5ldmVyeTtcbnZhciBmb3JFYWNoID0gYXJyYXlQcm90by5mb3JFYWNoO1xudmFyIHB1c2ggPSBhcnJheVByb3RvLnB1c2g7XG52YXIgc2xpY2UgPSBhcnJheVByb3RvLnNsaWNlO1xuXG5mdW5jdGlvbiBjYWxsQ291bnRJbldvcmRzKGNhbGxDb3VudCkge1xuICAgIGlmIChjYWxsQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwibmV2ZXIgY2FsbGVkXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiY2FsbGVkIFwiICsgdGltZXNJbldvcmRzKGNhbGxDb3VudCk7XG59XG5cbmZ1bmN0aW9uIGV4cGVjdGVkQ2FsbENvdW50SW5Xb3JkcyhleHBlY3RhdGlvbikge1xuICAgIHZhciBtaW4gPSBleHBlY3RhdGlvbi5taW5DYWxscztcbiAgICB2YXIgbWF4ID0gZXhwZWN0YXRpb24ubWF4Q2FsbHM7XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHZhciBzdHIgPSB0aW1lc0luV29yZHMobWluKTtcblxuICAgICAgICBpZiAobWluICE9PSBtYXgpIHtcbiAgICAgICAgICAgIHN0ciA9IFwiYXQgbGVhc3QgXCIgKyBzdHIgKyBcIiBhbmQgYXQgbW9zdCBcIiArIHRpbWVzSW5Xb3JkcyhtYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gXCJhdCBsZWFzdCBcIiArIHRpbWVzSW5Xb3JkcyhtaW4pO1xuICAgIH1cblxuICAgIHJldHVybiBcImF0IG1vc3QgXCIgKyB0aW1lc0luV29yZHMobWF4KTtcbn1cblxuZnVuY3Rpb24gcmVjZWl2ZWRNaW5DYWxscyhleHBlY3RhdGlvbikge1xuICAgIHZhciBoYXNNaW5MaW1pdCA9IHR5cGVvZiBleHBlY3RhdGlvbi5taW5DYWxscyA9PT0gXCJudW1iZXJcIjtcbiAgICByZXR1cm4gIWhhc01pbkxpbWl0IHx8IGV4cGVjdGF0aW9uLmNhbGxDb3VudCA+PSBleHBlY3RhdGlvbi5taW5DYWxscztcbn1cblxuZnVuY3Rpb24gcmVjZWl2ZWRNYXhDYWxscyhleHBlY3RhdGlvbikge1xuICAgIGlmICh0eXBlb2YgZXhwZWN0YXRpb24ubWF4Q2FsbHMgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RhdGlvbi5jYWxsQ291bnQgPT09IGV4cGVjdGF0aW9uLm1heENhbGxzO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlNYXRjaGVyKHBvc3NpYmxlTWF0Y2hlciwgYXJnKSB7XG4gICAgdmFyIGlzTWF0Y2hlciA9IG1hdGNoLmlzTWF0Y2hlcihwb3NzaWJsZU1hdGNoZXIpO1xuXG4gICAgcmV0dXJuIChpc01hdGNoZXIgJiYgcG9zc2libGVNYXRjaGVyLnRlc3QoYXJnKSkgfHwgdHJ1ZTtcbn1cblxudmFyIG1vY2tFeHBlY3RhdGlvbiA9IHtcbiAgICBtaW5DYWxsczogMSxcbiAgICBtYXhDYWxsczogMSxcblxuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uID0gZXh0ZW5kLm5vbkVudW0oc3R1Yi5jcmVhdGUoKSwgbW9ja0V4cGVjdGF0aW9uKTtcbiAgICAgICAgZGVsZXRlIGV4cGVjdGF0aW9uLmNyZWF0ZTtcbiAgICAgICAgZXhwZWN0YXRpb24ubWV0aG9kID0gbWV0aG9kTmFtZTtcblxuICAgICAgICByZXR1cm4gZXhwZWN0YXRpb247XG4gICAgfSxcblxuICAgIGludm9rZTogZnVuY3Rpb24gaW52b2tlKGZ1bmMsIHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgICB0aGlzLnZlcmlmeUNhbGxBbGxvd2VkKHRoaXNWYWx1ZSwgYXJncyk7XG5cbiAgICAgICAgcmV0dXJuIHNweUludm9rZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBhdExlYXN0OiBmdW5jdGlvbiBhdExlYXN0KG51bSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidcIiArIHZhbHVlVG9TdHJpbmcobnVtKSArIFwiJyBpcyBub3QgbnVtYmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxpbWl0c1NldCkge1xuICAgICAgICAgICAgdGhpcy5tYXhDYWxscyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxpbWl0c1NldCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1pbkNhbGxzID0gbnVtO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBhdE1vc3Q6IGZ1bmN0aW9uIGF0TW9zdChudW0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBudW0gIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCInXCIgKyB2YWx1ZVRvU3RyaW5nKG51bSkgKyBcIicgaXMgbm90IG51bWJlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5saW1pdHNTZXQpIHtcbiAgICAgICAgICAgIHRoaXMubWluQ2FsbHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5saW1pdHNTZXQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYXhDYWxscyA9IG51bTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgbmV2ZXI6IGZ1bmN0aW9uIG5ldmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGFjdGx5KDApO1xuICAgIH0sXG5cbiAgICBvbmNlOiBmdW5jdGlvbiBvbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGFjdGx5KDEpO1xuICAgIH0sXG5cbiAgICB0d2ljZTogZnVuY3Rpb24gdHdpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4YWN0bHkoMik7XG4gICAgfSxcblxuICAgIHRocmljZTogZnVuY3Rpb24gdGhyaWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5leGFjdGx5KDMpO1xuICAgIH0sXG5cbiAgICBleGFjdGx5OiBmdW5jdGlvbiBleGFjdGx5KG51bSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIidcIiArIHZhbHVlVG9TdHJpbmcobnVtKSArIFwiJyBpcyBub3QgYSBudW1iZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF0TGVhc3QobnVtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXRNb3N0KG51bSk7XG4gICAgfSxcblxuICAgIG1ldDogZnVuY3Rpb24gbWV0KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZmFpbGVkICYmIHJlY2VpdmVkTWluQ2FsbHModGhpcyk7XG4gICAgfSxcblxuICAgIHZlcmlmeUNhbGxBbGxvd2VkOiBmdW5jdGlvbiB2ZXJpZnlDYWxsQWxsb3dlZCh0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQXJndW1lbnRzID0gdGhpcy5leHBlY3RlZEFyZ3VtZW50cztcblxuICAgICAgICBpZiAocmVjZWl2ZWRNYXhDYWxscyh0aGlzKSkge1xuICAgICAgICAgICAgdGhpcy5mYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwodGhpcy5tZXRob2QgKyBcIiBhbHJlYWR5IGNhbGxlZCBcIiArIHRpbWVzSW5Xb3Jkcyh0aGlzLm1heENhbGxzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXCJleHBlY3RlZFRoaXNcIiBpbiB0aGlzICYmIHRoaXMuZXhwZWN0ZWRUaGlzICE9PSB0aGlzVmFsdWUpIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKFxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kICtcbiAgICAgICAgICAgICAgICAgICAgXCIgY2FsbGVkIHdpdGggXCIgK1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVRvU3RyaW5nKHRoaXNWYWx1ZSkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBhcyB0aGlzVmFsdWUsIGV4cGVjdGVkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUb1N0cmluZyh0aGlzLmV4cGVjdGVkVGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShcImV4cGVjdGVkQXJndW1lbnRzXCIgaW4gdGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYXJncykge1xuICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwodGhpcy5tZXRob2QgKyBcIiByZWNlaXZlZCBubyBhcmd1bWVudHMsIGV4cGVjdGVkIFwiICsgZm9ybWF0KGV4cGVjdGVkQXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCBleHBlY3RlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKFxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kICtcbiAgICAgICAgICAgICAgICAgICAgXCIgcmVjZWl2ZWQgdG9vIGZldyBhcmd1bWVudHMgKFwiICtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0KGFyZ3MpICtcbiAgICAgICAgICAgICAgICAgICAgXCIpLCBleHBlY3RlZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdChleHBlY3RlZEFyZ3VtZW50cylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCAmJiBhcmdzLmxlbmd0aCAhPT0gZXhwZWN0ZWRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZCArXG4gICAgICAgICAgICAgICAgICAgIFwiIHJlY2VpdmVkIHRvbyBtYW55IGFyZ3VtZW50cyAoXCIgK1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQoYXJncykgK1xuICAgICAgICAgICAgICAgICAgICBcIiksIGV4cGVjdGVkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0KGV4cGVjdGVkQXJndW1lbnRzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBleHBlY3RlZEFyZ3VtZW50cyxcbiAgICAgICAgICAgIGZ1bmN0aW9uKGV4cGVjdGVkQXJndW1lbnQsIGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZlcmlmeU1hdGNoZXIoZXhwZWN0ZWRBcmd1bWVudCwgYXJnc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgcmVjZWl2ZWQgd3JvbmcgYXJndW1lbnRzIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoYXJncykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLCBkaWRuJ3QgbWF0Y2ggXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyhleHBlY3RlZEFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhcmdzW2ldLCBleHBlY3RlZEFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiByZWNlaXZlZCB3cm9uZyBhcmd1bWVudHMgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdChhcmdzKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIsIGV4cGVjdGVkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoZXhwZWN0ZWRBcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXNcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgYWxsb3dzQ2FsbDogZnVuY3Rpb24gYWxsb3dzQ2FsbCh0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQXJndW1lbnRzID0gdGhpcy5leHBlY3RlZEFyZ3VtZW50cztcblxuICAgICAgICBpZiAodGhpcy5tZXQoKSAmJiByZWNlaXZlZE1heENhbGxzKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXCJleHBlY3RlZFRoaXNcIiBpbiB0aGlzICYmIHRoaXMuZXhwZWN0ZWRUaGlzICE9PSB0aGlzVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKFwiZXhwZWN0ZWRBcmd1bWVudHNcIiBpbiB0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGVcbiAgICAgICAgdmFyIF9hcmdzID0gYXJncyB8fCBbXTtcblxuICAgICAgICBpZiAoX2FyZ3MubGVuZ3RoIDwgZXhwZWN0ZWRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCAmJiBfYXJncy5sZW5ndGggIT09IGV4cGVjdGVkQXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV2ZXJ5KGV4cGVjdGVkQXJndW1lbnRzLCBmdW5jdGlvbihleHBlY3RlZEFyZ3VtZW50LCBpKSB7XG4gICAgICAgICAgICBpZiAoIXZlcmlmeU1hdGNoZXIoZXhwZWN0ZWRBcmd1bWVudCwgX2FyZ3NbaV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChfYXJnc1tpXSwgZXhwZWN0ZWRBcmd1bWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgd2l0aEFyZ3M6IGZ1bmN0aW9uIHdpdGhBcmdzKCkge1xuICAgICAgICB0aGlzLmV4cGVjdGVkQXJndW1lbnRzID0gc2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHdpdGhFeGFjdEFyZ3M6IGZ1bmN0aW9uIHdpdGhFeGFjdEFyZ3MoKSB7XG4gICAgICAgIHRoaXMud2l0aEFyZ3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gb24odGhpc1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuZXhwZWN0ZWRUaGlzID0gdGhpc1ZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IHNsaWNlKHRoaXMuZXhwZWN0ZWRBcmd1bWVudHMgfHwgW10pO1xuXG4gICAgICAgIGlmICghdGhpcy5leHBlY3RzRXhhY3RBcmdDb3VudCkge1xuICAgICAgICAgICAgcHVzaChhcmdzLCBcIlsuLi5dXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbGxTdHIgPSBzcHlDYWxsVG9TdHJpbmcuY2FsbCh7XG4gICAgICAgICAgICBwcm94eTogdGhpcy5tZXRob2QgfHwgXCJhbm9ueW1vdXMgbW9jayBleHBlY3RhdGlvblwiLFxuICAgICAgICAgICAgYXJnczogYXJnc1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgbWVzc2FnZSA9IGNhbGxTdHIucmVwbGFjZShcIiwgWy4uLlwiLCBcIlssIC4uLlwiKSArIFwiIFwiICsgZXhwZWN0ZWRDYWxsQ291bnRJbldvcmRzKHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLm1ldCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJFeHBlY3RhdGlvbiBtZXQ6IFwiICsgbWVzc2FnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIkV4cGVjdGVkIFwiICsgbWVzc2FnZSArIFwiIChcIiArIGNhbGxDb3VudEluV29yZHModGhpcy5jYWxsQ291bnQpICsgXCIpXCI7XG4gICAgfSxcblxuICAgIHZlcmlmeTogZnVuY3Rpb24gdmVyaWZ5KCkge1xuICAgICAgICBpZiAoIXRoaXMubWV0KCkpIHtcbiAgICAgICAgICAgIG1vY2tFeHBlY3RhdGlvbi5mYWlsKFN0cmluZyh0aGlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24ucGFzcyhTdHJpbmcodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIHBhc3M6IGZ1bmN0aW9uIHBhc3MobWVzc2FnZSkge1xuICAgICAgICBhc3NlcnQucGFzcyhtZXNzYWdlKTtcbiAgICB9LFxuXG4gICAgZmFpbDogZnVuY3Rpb24gZmFpbChtZXNzYWdlKSB7XG4gICAgICAgIHZhciBleGNlcHRpb24gPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gXCJFeHBlY3RhdGlvbkVycm9yXCI7XG5cbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbW9ja0V4cGVjdGF0aW9uO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBtb2NrRXhwZWN0YXRpb24gPSByZXF1aXJlKFwiLi9tb2NrLWV4cGVjdGF0aW9uXCIpO1xudmFyIHNweUNhbGxUb1N0cmluZyA9IHJlcXVpcmUoXCIuL2NhbGxcIikudG9TdHJpbmc7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2V4dGVuZFwiKTtcbnZhciBkZWVwRXF1YWwgPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmRlZXBFcXVhbDtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dyYXAtbWV0aG9kXCIpO1xudmFyIHVzZVByb21pc2VMaWJyYXJ5ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3VzZS1wcm9taXNlLWxpYnJhcnlcIik7XG5cbnZhciBjb25jYXQgPSBhcnJheVByb3RvLmNvbmNhdDtcbnZhciBmaWx0ZXIgPSBhcnJheVByb3RvLmZpbHRlcjtcbnZhciBmb3JFYWNoID0gYXJyYXlQcm90by5mb3JFYWNoO1xudmFyIGV2ZXJ5ID0gYXJyYXlQcm90by5ldmVyeTtcbnZhciBqb2luID0gYXJyYXlQcm90by5qb2luO1xudmFyIHB1c2ggPSBhcnJheVByb3RvLnB1c2g7XG52YXIgc2xpY2UgPSBhcnJheVByb3RvLnNsaWNlO1xudmFyIHVuc2hpZnQgPSBhcnJheVByb3RvLnVuc2hpZnQ7XG5cbmZ1bmN0aW9uIG1vY2sob2JqZWN0KSB7XG4gICAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gbW9ja0V4cGVjdGF0aW9uLmNyZWF0ZShvYmplY3QgPyBvYmplY3QgOiBcIkFub255bW91cyBtb2NrXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBtb2NrLmNyZWF0ZShvYmplY3QpO1xufVxuXG5mdW5jdGlvbiBlYWNoKGNvbGxlY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgdmFyIGNvbCA9IGNvbGxlY3Rpb24gfHwgW107XG5cbiAgICBmb3JFYWNoKGNvbCwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBhcnJheUVxdWFscyhhcnIxLCBhcnIyLCBjb21wYXJlTGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmVMZW5ndGggJiYgYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlcnkoYXJyMSwgZnVuY3Rpb24oZWxlbWVudCwgaSkge1xuICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGFycjJbaV0sIGVsZW1lbnQpO1xuICAgIH0pO1xufVxuXG5leHRlbmQobW9jaywge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKG9iamVjdCkge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9iamVjdCBpcyBudWxsXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1vY2tPYmplY3QgPSBleHRlbmQubm9uRW51bSh7fSwgbW9jaywgeyBvYmplY3Q6IG9iamVjdCB9KTtcbiAgICAgICAgZGVsZXRlIG1vY2tPYmplY3QuY3JlYXRlO1xuXG4gICAgICAgIHJldHVybiBtb2NrT2JqZWN0O1xuICAgIH0sXG5cbiAgICBleHBlY3RzOiBmdW5jdGlvbiBleHBlY3RzKG1ldGhvZCkge1xuICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm1ldGhvZCBpcyBmYWxzeVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5leHBlY3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0YXRpb25zID0ge307XG4gICAgICAgICAgICB0aGlzLnByb3hpZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZmFpbHVyZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSkge1xuICAgICAgICAgICAgdGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSA9IFtdO1xuICAgICAgICAgICAgdmFyIG1vY2tPYmplY3QgPSB0aGlzO1xuXG4gICAgICAgICAgICB3cmFwTWV0aG9kKHRoaXMub2JqZWN0LCBtZXRob2QsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2NrT2JqZWN0Lmludm9rZU1ldGhvZChtZXRob2QsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcHVzaCh0aGlzLnByb3hpZXMsIG1ldGhvZCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXhwZWN0YXRpb24gPSBtb2NrRXhwZWN0YXRpb24uY3JlYXRlKG1ldGhvZCk7XG4gICAgICAgIGV4dGVuZC5ub25FbnVtKGV4cGVjdGF0aW9uLCB0aGlzLm9iamVjdFttZXRob2RdKTtcbiAgICAgICAgcHVzaCh0aGlzLmV4cGVjdGF0aW9uc1ttZXRob2RdLCBleHBlY3RhdGlvbik7XG4gICAgICAgIHVzZVByb21pc2VMaWJyYXJ5KHRoaXMucHJvbWlzZUxpYnJhcnksIGV4cGVjdGF0aW9uKTtcblxuICAgICAgICByZXR1cm4gZXhwZWN0YXRpb247XG4gICAgfSxcblxuICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgIHZhciBvYmplY3QgPSB0aGlzLm9iamVjdDtcblxuICAgICAgICBlYWNoKHRoaXMucHJveGllcywgZnVuY3Rpb24ocHJveHkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3h5XS5yZXN0b3JlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBvYmplY3RbcHJveHldLnJlc3RvcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHZlcmlmeTogZnVuY3Rpb24gdmVyaWZ5KCkge1xuICAgICAgICB2YXIgZXhwZWN0YXRpb25zID0gdGhpcy5leHBlY3RhdGlvbnMgfHwge307XG4gICAgICAgIHZhciBtZXNzYWdlcyA9IHRoaXMuZmFpbHVyZXMgPyBzbGljZSh0aGlzLmZhaWx1cmVzKSA6IFtdO1xuICAgICAgICB2YXIgbWV0ID0gW107XG5cbiAgICAgICAgZWFjaCh0aGlzLnByb3hpZXMsIGZ1bmN0aW9uKHByb3h5KSB7XG4gICAgICAgICAgICBlYWNoKGV4cGVjdGF0aW9uc1twcm94eV0sIGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RhdGlvbi5tZXQoKSkge1xuICAgICAgICAgICAgICAgICAgICBwdXNoKG1lc3NhZ2VzLCBTdHJpbmcoZXhwZWN0YXRpb24pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwdXNoKG1ldCwgU3RyaW5nKGV4cGVjdGF0aW9uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzdG9yZSgpO1xuXG4gICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24uZmFpbChqb2luKGNvbmNhdChtZXNzYWdlcywgbWV0KSwgXCJcXG5cIikpO1xuICAgICAgICB9IGVsc2UgaWYgKG1ldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtb2NrRXhwZWN0YXRpb24ucGFzcyhqb2luKGNvbmNhdChtZXNzYWdlcywgbWV0KSwgXCJcXG5cIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIHVzaW5nUHJvbWlzZTogZnVuY3Rpb24gdXNpbmdQcm9taXNlKHByb21pc2VMaWJyYXJ5KSB7XG4gICAgICAgIHRoaXMucHJvbWlzZUxpYnJhcnkgPSBwcm9taXNlTGlicmFyeTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgaW52b2tlTWV0aG9kOiBmdW5jdGlvbiBpbnZva2VNZXRob2QobWV0aG9kLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgICAgLyogaWYgd2UgY2Fubm90IGZpbmQgYW55IG1hdGNoaW5nIGZpbGVzIHdlIHdpbGwgZXhwbGljaXRseSBjYWxsIG1vY2tFeHBlY3Rpb24jZmFpbCB3aXRoIGVycm9yIG1lc3NhZ2VzICovXG4gICAgICAgIC8qIGVzbGludCBjb25zaXN0ZW50LXJldHVybjogXCJvZmZcIiAqL1xuICAgICAgICB2YXIgZXhwZWN0YXRpb25zID0gdGhpcy5leHBlY3RhdGlvbnMgJiYgdGhpcy5leHBlY3RhdGlvbnNbbWV0aG9kXSA/IHRoaXMuZXhwZWN0YXRpb25zW21ldGhvZF0gOiBbXTtcbiAgICAgICAgdmFyIGN1cnJlbnRBcmdzID0gYXJncyB8fCBbXTtcbiAgICAgICAgdmFyIGF2YWlsYWJsZTtcblxuICAgICAgICB2YXIgZXhwZWN0YXRpb25zV2l0aE1hdGNoaW5nQXJncyA9IGZpbHRlcihleHBlY3RhdGlvbnMsIGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgZXhwZWN0ZWRBcmdzID0gZXhwZWN0YXRpb24uZXhwZWN0ZWRBcmd1bWVudHMgfHwgW107XG5cbiAgICAgICAgICAgIHJldHVybiBhcnJheUVxdWFscyhleHBlY3RlZEFyZ3MsIGN1cnJlbnRBcmdzLCBleHBlY3RhdGlvbi5leHBlY3RzRXhhY3RBcmdDb3VudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBleHBlY3RhdGlvbnNUb0FwcGx5ID0gZmlsdGVyKGV4cGVjdGF0aW9uc1dpdGhNYXRjaGluZ0FyZ3MsIGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gIWV4cGVjdGF0aW9uLm1ldCgpICYmIGV4cGVjdGF0aW9uLmFsbG93c0NhbGwodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGV4cGVjdGF0aW9uc1RvQXBwbHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uc1RvQXBwbHlbMF0uYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtZXNzYWdlcyA9IFtdO1xuICAgICAgICB2YXIgZXhoYXVzdGVkID0gMDtcblxuICAgICAgICBmb3JFYWNoKGV4cGVjdGF0aW9uc1dpdGhNYXRjaGluZ0FyZ3MsIGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhwZWN0YXRpb24uYWxsb3dzQ2FsbCh0aGlzVmFsdWUsIGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gYXZhaWxhYmxlIHx8IGV4cGVjdGF0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleGhhdXN0ZWQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZSAmJiBleGhhdXN0ZWQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGUuYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2goZXhwZWN0YXRpb25zLCBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgICAgcHVzaChtZXNzYWdlcywgXCIgICAgXCIgKyBTdHJpbmcoZXhwZWN0YXRpb24pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdW5zaGlmdChcbiAgICAgICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICAgICAgXCJVbmV4cGVjdGVkIGNhbGw6IFwiICtcbiAgICAgICAgICAgICAgICBzcHlDYWxsVG9TdHJpbmcuY2FsbCh7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5OiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIC8vIFBoYW50b21KUyBkb2VzIG5vdCBzZXJpYWxpemUgdGhlIHN0YWNrIHRyYWNlIHVudGlsIHRoZSBlcnJvciBoYXMgYmVlbiB0aHJvd25cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8qIGVtcHR5ICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHVzaChcbiAgICAgICAgICAgIHRoaXMuZmFpbHVyZXMsXG4gICAgICAgICAgICBcIlVuZXhwZWN0ZWQgY2FsbDogXCIgK1xuICAgICAgICAgICAgICAgIHNweUNhbGxUb1N0cmluZy5jYWxsKHtcbiAgICAgICAgICAgICAgICAgICAgcHJveHk6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgICAgICAgICAgc3RhY2s6IGVyci5zdGFja1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgbW9ja0V4cGVjdGF0aW9uLmZhaWwoam9pbihtZXNzYWdlcywgXCJcXG5cIikpO1xuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vY2s7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGNvbGxlY3RPd25NZXRob2RzID0gcmVxdWlyZShcIi4vY29sbGVjdC1vd24tbWV0aG9kc1wiKTtcbnZhciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgaXNFc01vZHVsZSA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9pcy1lcy1tb2R1bGVcIik7XG52YXIgaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZSA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9pcy1wcm9wZXJ0eS1jb25maWd1cmFibGVcIik7XG52YXIgaXNOb25FeGlzdGVudE93blByb3BlcnR5ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2lzLW5vbi1leGlzdGVudC1vd24tcHJvcGVydHlcIik7XG52YXIgbWF0Y2ggPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmNyZWF0ZU1hdGNoZXI7XG52YXIgc2lub25Bc3NlcnQgPSByZXF1aXJlKFwiLi9hc3NlcnRcIik7XG52YXIgc2lub25DbG9jayA9IHJlcXVpcmUoXCIuL3V0aWwvZmFrZS10aW1lcnNcIik7XG52YXIgc2lub25Nb2NrID0gcmVxdWlyZShcIi4vbW9ja1wiKTtcbnZhciBzaW5vblNweSA9IHJlcXVpcmUoXCIuL3NweVwiKTtcbnZhciBzaW5vblN0dWIgPSByZXF1aXJlKFwiLi9zdHViXCIpO1xudmFyIHNpbm9uRmFrZSA9IHJlcXVpcmUoXCIuL2Zha2VcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG52YXIgZmFrZVNlcnZlciA9IHJlcXVpcmUoXCJuaXNlXCIpLmZha2VTZXJ2ZXI7XG52YXIgZmFrZVhociA9IHJlcXVpcmUoXCJuaXNlXCIpLmZha2VYaHI7XG52YXIgdXNlUHJvbWlzZUxpYnJhcnkgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdXNlLXByb21pc2UtbGlicmFyeVwiKTtcblxudmFyIGZpbHRlciA9IGFycmF5UHJvdG8uZmlsdGVyO1xudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZpbHRlcjtcbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xudmFyIHJldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7XG5cbmZ1bmN0aW9uIGFwcGx5T25FYWNoKGZha2VzLCBtZXRob2QpIHtcbiAgICB2YXIgbWF0Y2hpbmdGYWtlcyA9IGZpbHRlcihmYWtlcywgZnVuY3Rpb24oZmFrZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGZha2VbbWV0aG9kXSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIH0pO1xuXG4gICAgZm9yRWFjaChtYXRjaGluZ0Zha2VzLCBmdW5jdGlvbihmYWtlKSB7XG4gICAgICAgIGZha2VbbWV0aG9kXSgpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBTYW5kYm94KCkge1xuICAgIHZhciBzYW5kYm94ID0gdGhpcztcbiAgICB2YXIgY29sbGVjdGlvbiA9IFtdO1xuICAgIHZhciBmYWtlUmVzdG9yZXJzID0gW107XG4gICAgdmFyIHByb21pc2VMaWI7XG5cbiAgICBzYW5kYm94LnNlcnZlclByb3RvdHlwZSA9IGZha2VTZXJ2ZXI7XG5cbiAgICAvLyB0aGlzIGlzIGZvciB0ZXN0aW5nIG9ubHlcbiAgICBzYW5kYm94LmdldEZha2VzID0gZnVuY3Rpb24gZ2V0RmFrZXMoKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH07XG5cbiAgICAvLyB0aGlzIGlzIGZvciB0ZXN0aW5nIG9ubHlcbiAgICBzYW5kYm94LmdldFJlc3RvcmVycyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFrZVJlc3RvcmVycztcbiAgICB9O1xuXG4gICAgc2FuZGJveC5jcmVhdGVTdHViSW5zdGFuY2UgPSBmdW5jdGlvbiBjcmVhdGVTdHViSW5zdGFuY2UoY29uc3RydWN0b3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhIGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHViKE9iamVjdC5jcmVhdGUoY29uc3RydWN0b3IucHJvdG90eXBlKSk7XG4gICAgfTtcblxuICAgIHNhbmRib3guaW5qZWN0ID0gZnVuY3Rpb24gaW5qZWN0KG9iaikge1xuICAgICAgICBvYmouc3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5zcHkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmouc3R1YiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbmRib3guc3R1Yi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9iai5tb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5tb2NrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLmNyZWF0ZVN0dWJJbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbmRib3guY3JlYXRlU3R1Ykluc3RhbmNlLmFwcGx5KHNhbmRib3gsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLmZha2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LmZha2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvYmoucmVwbGFjZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbmRib3gucmVwbGFjZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9iai5yZXBsYWNlU2V0dGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuZGJveC5yZXBsYWNlU2V0dGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgb2JqLnJlcGxhY2VHZXR0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5kYm94LnJlcGxhY2VHZXR0ZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoc2FuZGJveC5jbG9jaykge1xuICAgICAgICAgICAgb2JqLmNsb2NrID0gc2FuZGJveC5jbG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzYW5kYm94LnNlcnZlcikge1xuICAgICAgICAgICAgb2JqLnNlcnZlciA9IHNhbmRib3guc2VydmVyO1xuICAgICAgICAgICAgb2JqLnJlcXVlc3RzID0gc2FuZGJveC5zZXJ2ZXIucmVxdWVzdHM7XG4gICAgICAgIH1cblxuICAgICAgICBvYmoubWF0Y2ggPSBtYXRjaDtcblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG5cbiAgICBzYW5kYm94Lm1vY2sgPSBmdW5jdGlvbiBtb2NrKCkge1xuICAgICAgICB2YXIgbSA9IHNpbm9uTW9jay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHB1c2goY29sbGVjdGlvbiwgbSk7XG4gICAgICAgIHVzZVByb21pc2VMaWJyYXJ5KHByb21pc2VMaWIsIG0pO1xuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIGFwcGx5T25FYWNoKGNvbGxlY3Rpb24sIFwicmVzZXRcIik7XG4gICAgICAgIGFwcGx5T25FYWNoKGNvbGxlY3Rpb24sIFwicmVzZXRIaXN0b3J5XCIpO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnJlc2V0QmVoYXZpb3IgPSBmdW5jdGlvbiByZXNldEJlaGF2aW9yKCkge1xuICAgICAgICBhcHBseU9uRWFjaChjb2xsZWN0aW9uLCBcInJlc2V0QmVoYXZpb3JcIik7XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVzZXRIaXN0b3J5ID0gZnVuY3Rpb24gcmVzZXRIaXN0b3J5KCkge1xuICAgICAgICBmdW5jdGlvbiBwcml2YXRlUmVzZXRIaXN0b3J5KGYpIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBmLnJlc2V0SGlzdG9yeSB8fCBmLnJlc2V0O1xuICAgICAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbihmYWtlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZha2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHByaXZhdGVSZXNldEhpc3RvcnkoZmFrZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbWV0aG9kcyA9IFtdO1xuICAgICAgICAgICAgaWYgKGZha2UuZ2V0KSB7XG4gICAgICAgICAgICAgICAgcHVzaChtZXRob2RzLCBmYWtlLmdldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmYWtlLnNldCkge1xuICAgICAgICAgICAgICAgIHB1c2gobWV0aG9kcywgZmFrZS5zZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JFYWNoKG1ldGhvZHMsIHByaXZhdGVSZXNldEhpc3RvcnkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZSgpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNhbmRib3gucmVzdG9yZSgpIGRvZXMgbm90IHRha2UgYW55IHBhcmFtZXRlcnMuIFBlcmhhcHMgeW91IG1lYW50IHN0dWIucmVzdG9yZSgpXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV2ZXJzZShjb2xsZWN0aW9uKTtcbiAgICAgICAgYXBwbHlPbkVhY2goY29sbGVjdGlvbiwgXCJyZXN0b3JlXCIpO1xuICAgICAgICBjb2xsZWN0aW9uID0gW107XG5cbiAgICAgICAgZm9yRWFjaChmYWtlUmVzdG9yZXJzLCBmdW5jdGlvbihyZXN0b3Jlcikge1xuICAgICAgICAgICAgcmVzdG9yZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZha2VSZXN0b3JlcnMgPSBbXTtcblxuICAgICAgICBzYW5kYm94LnJlc3RvcmVDb250ZXh0KCk7XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVzdG9yZUNvbnRleHQgPSBmdW5jdGlvbiByZXN0b3JlQ29udGV4dCgpIHtcbiAgICAgICAgdmFyIGluamVjdGVkS2V5cyA9IHNhbmRib3guaW5qZWN0ZWRLZXlzO1xuICAgICAgICB2YXIgaW5qZWN0SW50byA9IHNhbmRib3guaW5qZWN0SW50bztcblxuICAgICAgICBpZiAoIWluamVjdGVkS2V5cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaChpbmplY3RlZEtleXMsIGZ1bmN0aW9uKGluamVjdGVkS2V5KSB7XG4gICAgICAgICAgICBkZWxldGUgaW5qZWN0SW50b1tpbmplY3RlZEtleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGluamVjdGVkS2V5cyA9IFtdO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRGYWtlUmVzdG9yZXIob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBmdW5jdGlvbiByZXN0b3JlcigpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXN0b3Jlci5vYmplY3QgPSBvYmplY3Q7XG4gICAgICAgIHJlc3RvcmVyLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiByZXN0b3JlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2ZXJpZnlOb3RSZXBsYWNlZChvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgICAgIGZvckVhY2goZmFrZVJlc3RvcmVycywgZnVuY3Rpb24oZmFrZVJlc3RvcmVyKSB7XG4gICAgICAgICAgICBpZiAoZmFrZVJlc3RvcmVyLm9iamVjdCA9PT0gb2JqZWN0ICYmIGZha2VSZXN0b3Jlci5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXR0ZW1wdGVkIHRvIHJlcGxhY2UgXCIgKyBwcm9wZXJ0eSArIFwiIHdoaWNoIGlzIGFscmVhZHkgcmVwbGFjZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNhbmRib3gucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2Uob2JqZWN0LCBwcm9wZXJ0eSwgcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlcGxhY2Ugbm9uLWV4aXN0ZW50IG93biBwcm9wZXJ0eSBcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCByZXBsYWNlbWVudCBhcmd1bWVudCB0byBiZSBkZWZpbmVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2Ugc2FuZGJveC5yZXBsYWNlR2V0dGVyIGZvciByZXBsYWNpbmcgZ2V0dGVyc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5zZXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIHNhbmRib3gucmVwbGFjZVNldHRlciBmb3IgcmVwbGFjaW5nIHNldHRlcnNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9iamVjdFtwcm9wZXJ0eV0gIT09IHR5cGVvZiByZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZXBsYWNlIFwiICsgdHlwZW9mIG9iamVjdFtwcm9wZXJ0eV0gKyBcIiB3aXRoIFwiICsgdHlwZW9mIHJlcGxhY2VtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlcmlmeU5vdFJlcGxhY2VkKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIC8vIHN0b3JlIGEgZnVuY3Rpb24gZm9yIHJlc3RvcmluZyB0aGUgcmVwbGFjZWQgcHJvcGVydHlcbiAgICAgICAgcHVzaChmYWtlUmVzdG9yZXJzLCBnZXRGYWtlUmVzdG9yZXIob2JqZWN0LCBwcm9wZXJ0eSkpO1xuXG4gICAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSByZXBsYWNlbWVudDtcblxuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgfTtcblxuICAgIHNhbmRib3gucmVwbGFjZUdldHRlciA9IGZ1bmN0aW9uIHJlcGxhY2VHZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlcGxhY2Ugbm9uLWV4aXN0ZW50IG93biBwcm9wZXJ0eSBcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIHJlcGxhY2VtZW50IGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImBvYmplY3QucHJvcGVydHlgIGlzIG5vdCBhIGdldHRlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlcmlmeU5vdFJlcGxhY2VkKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIC8vIHN0b3JlIGEgZnVuY3Rpb24gZm9yIHJlc3RvcmluZyB0aGUgcmVwbGFjZWQgcHJvcGVydHlcbiAgICAgICAgcHVzaChmYWtlUmVzdG9yZXJzLCBnZXRGYWtlUmVzdG9yZXIob2JqZWN0LCBwcm9wZXJ0eSkpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG4gICAgICAgICAgICBnZXQ6IHJlcGxhY2VtZW50LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5yZXBsYWNlU2V0dGVyID0gZnVuY3Rpb24gcmVwbGFjZVNldHRlcihvYmplY3QsIHByb3BlcnR5LCByZXBsYWNlbWVudCkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVwbGFjZSBub24tZXhpc3RlbnQgb3duIHByb3BlcnR5IFwiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlbWVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgcmVwbGFjZW1lbnQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci5zZXQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYG9iamVjdC5wcm9wZXJ0eWAgaXMgbm90IGEgc2V0dGVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmVyaWZ5Tm90UmVwbGFjZWQob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgLy8gc3RvcmUgYSBmdW5jdGlvbiBmb3IgcmVzdG9yaW5nIHRoZSByZXBsYWNlZCBwcm9wZXJ0eVxuICAgICAgICBwdXNoKGZha2VSZXN0b3JlcnMsIGdldEZha2VSZXN0b3JlcihvYmplY3QsIHByb3BlcnR5KSk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFjY2Vzc29yLXBhaXJzXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG4gICAgICAgICAgICBzZXQ6IHJlcGxhY2VtZW50LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBpc1Byb3BlcnR5Q29uZmlndXJhYmxlKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICB9O1xuXG4gICAgc2FuZGJveC5zcHkgPSBmdW5jdGlvbiBzcHkoKSB7XG4gICAgICAgIHZhciBzID0gc2lub25TcHkuYXBwbHkoc2lub25TcHksIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgcHVzaChjb2xsZWN0aW9uLCBzKTtcblxuICAgICAgICByZXR1cm4gcztcbiAgICB9O1xuXG4gICAgc2FuZGJveC5zdHViID0gZnVuY3Rpb24gc3R1YihvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgICAgIGlmIChpc0VzTW9kdWxlKG9iamVjdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUyBNb2R1bGVzIGNhbm5vdCBiZSBzdHViYmVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTm9uRXhpc3RlbnRPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBzdHViIG5vbi1leGlzdGVudCBvd24gcHJvcGVydHkgXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3R1YmJlZCA9IHNpbm9uU3R1Yi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICB2YXIgaXNTdHViYmluZ0VudGlyZU9iamVjdCA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiO1xuXG4gICAgICAgIGlmIChpc1N0dWJiaW5nRW50aXJlT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgb3duTWV0aG9kcyA9IGNvbGxlY3RPd25NZXRob2RzKHN0dWJiZWQpO1xuXG4gICAgICAgICAgICBmb3JFYWNoKG93bk1ldGhvZHMsIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHB1c2goY29sbGVjdGlvbiwgbWV0aG9kKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB1c2VQcm9taXNlTGlicmFyeShwcm9taXNlTGliLCBvd25NZXRob2RzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHB1c2goY29sbGVjdGlvbiwgc3R1YmJlZCk7XG4gICAgICAgICAgICB1c2VQcm9taXNlTGlicmFyeShwcm9taXNlTGliLCBzdHViYmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHViYmVkO1xuICAgIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBzYW5kYm94LmZha2UgPSBmdW5jdGlvbiBmYWtlKGYpIHtcbiAgICAgICAgdmFyIHMgPSBzaW5vbkZha2UuYXBwbHkoc2lub25GYWtlLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHB1c2goY29sbGVjdGlvbiwgcyk7XG5cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfTtcblxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoc2lub25GYWtlKSwgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHZhciBmYWtlQmVoYXZpb3IgPSBzaW5vbkZha2Vba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBmYWtlQmVoYXZpb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgc2FuZGJveC5mYWtlW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IGZha2VCZWhhdmlvci5hcHBseShmYWtlQmVoYXZpb3IsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICBwdXNoKGNvbGxlY3Rpb24sIHMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBzYW5kYm94LnVzZUZha2VUaW1lcnMgPSBmdW5jdGlvbiB1c2VGYWtlVGltZXJzKGFyZ3MpIHtcbiAgICAgICAgdmFyIGNsb2NrID0gc2lub25DbG9jay51c2VGYWtlVGltZXJzLmNhbGwobnVsbCwgYXJncyk7XG5cbiAgICAgICAgc2FuZGJveC5jbG9jayA9IGNsb2NrO1xuICAgICAgICBwdXNoKGNvbGxlY3Rpb24sIGNsb2NrKTtcblxuICAgICAgICByZXR1cm4gY2xvY2s7XG4gICAgfTtcblxuICAgIHNhbmRib3gudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KCkge1xuICAgICAgICBhcHBseU9uRWFjaChjb2xsZWN0aW9uLCBcInZlcmlmeVwiKTtcbiAgICB9O1xuXG4gICAgc2FuZGJveC52ZXJpZnlBbmRSZXN0b3JlID0gZnVuY3Rpb24gdmVyaWZ5QW5kUmVzdG9yZSgpIHtcbiAgICAgICAgdmFyIGV4Y2VwdGlvbjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2FuZGJveC52ZXJpZnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXhjZXB0aW9uID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhbmRib3gucmVzdG9yZSgpO1xuXG4gICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzYW5kYm94LnVzZUZha2VTZXJ2ZXIgPSBmdW5jdGlvbiB1c2VGYWtlU2VydmVyKCkge1xuICAgICAgICB2YXIgcHJvdG8gPSBzYW5kYm94LnNlcnZlclByb3RvdHlwZSB8fCBmYWtlU2VydmVyO1xuXG4gICAgICAgIGlmICghcHJvdG8gfHwgIXByb3RvLmNyZWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzYW5kYm94LnNlcnZlciA9IHByb3RvLmNyZWF0ZSgpO1xuICAgICAgICBwdXNoKGNvbGxlY3Rpb24sIHNhbmRib3guc2VydmVyKTtcblxuICAgICAgICByZXR1cm4gc2FuZGJveC5zZXJ2ZXI7XG4gICAgfTtcblxuICAgIHNhbmRib3gudXNlRmFrZVhNTEh0dHBSZXF1ZXN0ID0gZnVuY3Rpb24gdXNlRmFrZVhNTEh0dHBSZXF1ZXN0KCkge1xuICAgICAgICB2YXIgeGhyID0gZmFrZVhoci51c2VGYWtlWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgcHVzaChjb2xsZWN0aW9uLCB4aHIpO1xuICAgICAgICByZXR1cm4geGhyO1xuICAgIH07XG5cbiAgICBzYW5kYm94LnVzaW5nUHJvbWlzZSA9IGZ1bmN0aW9uIHVzaW5nUHJvbWlzZShwcm9taXNlTGlicmFyeSkge1xuICAgICAgICBwcm9taXNlTGliID0gcHJvbWlzZUxpYnJhcnk7XG4gICAgICAgIGNvbGxlY3Rpb24ucHJvbWlzZUxpYnJhcnkgPSBwcm9taXNlTGlicmFyeTtcblxuICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICB9O1xufVxuXG5TYW5kYm94LnByb3RvdHlwZS5hc3NlcnQgPSBzaW5vbkFzc2VydDtcblNhbmRib3gucHJvdG90eXBlLm1hdGNoID0gbWF0Y2g7XG5cbm1vZHVsZS5leHBvcnRzID0gU2FuZGJveDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyYXlQcm90byA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXk7XG52YXIgY29sb3IgPSByZXF1aXJlKFwiLi9jb2xvclwiKTtcbnZhciBtYXRjaCA9IHJlcXVpcmUoXCJAc2lub25qcy9zYW1zYW1cIikuY3JlYXRlTWF0Y2hlcjtcbnZhciB0aW1lc0luV29yZHMgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvdGltZXMtaW4td29yZHNcIik7XG52YXIgc2lub25Gb3JtYXQgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZm9ybWF0XCIpO1xudmFyIGpzRGlmZiA9IHJlcXVpcmUoXCJkaWZmXCIpO1xuXG52YXIgam9pbiA9IGFycmF5UHJvdG8uam9pbjtcbnZhciBtYXAgPSBhcnJheVByb3RvLm1hcDtcbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xuXG5mdW5jdGlvbiBjb2xvclNpbm9uTWF0Y2hUZXh0KG1hdGNoZXIsIGNhbGxlZEFyZywgY2FsbGVkQXJnTWVzc2FnZSkge1xuICAgIHZhciBjYWxsZWRBcmd1bWVudE1lc3NhZ2UgPSBjYWxsZWRBcmdNZXNzYWdlO1xuICAgIGlmICghbWF0Y2hlci50ZXN0KGNhbGxlZEFyZykpIHtcbiAgICAgICAgbWF0Y2hlci5tZXNzYWdlID0gY29sb3IucmVkKG1hdGNoZXIubWVzc2FnZSk7XG4gICAgICAgIGlmIChjYWxsZWRBcmd1bWVudE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNhbGxlZEFyZ3VtZW50TWVzc2FnZSA9IGNvbG9yLmdyZWVuKGNhbGxlZEFyZ3VtZW50TWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhbGxlZEFyZ3VtZW50TWVzc2FnZSArIFwiIFwiICsgbWF0Y2hlci5tZXNzYWdlO1xufVxuXG5mdW5jdGlvbiBjb2xvckRpZmZUZXh0KGRpZmYpIHtcbiAgICB2YXIgb2JqZWN0cyA9IG1hcChkaWZmLCBmdW5jdGlvbihwYXJ0KSB7XG4gICAgICAgIHZhciB0ZXh0ID0gcGFydC52YWx1ZTtcbiAgICAgICAgaWYgKHBhcnQuYWRkZWQpIHtcbiAgICAgICAgICAgIHRleHQgPSBjb2xvci5ncmVlbih0ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRleHQgPSBjb2xvci5yZWQodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpZmYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IFwiIFwiOyAvLyBmb3JtYXQgc2ltcGxlIGRpZmZzXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpvaW4ob2JqZWN0cywgXCJcIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGM6IGZ1bmN0aW9uKHNweUluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiB0aW1lc0luV29yZHMoc3B5SW5zdGFuY2UuY2FsbENvdW50KTtcbiAgICB9LFxuXG4gICAgbjogZnVuY3Rpb24oc3B5SW5zdGFuY2UpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGxvY2FsLXJ1bGVzL25vLXByb3RvdHlwZS1tZXRob2RzXG4gICAgICAgIHJldHVybiBzcHlJbnN0YW5jZS50b1N0cmluZygpO1xuICAgIH0sXG5cbiAgICBEOiBmdW5jdGlvbihzcHlJbnN0YW5jZSwgYXJncykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9IFwiXCI7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBzcHlJbnN0YW5jZS5jYWxsQ291bnQ7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGRlc2NyaWJlIG11bHRpcGxlIGNhbGxzXG4gICAgICAgICAgICBpZiAobCA+IDEpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9IFwiXFxuQ2FsbCBcIiArIChpICsgMSkgKyBcIjpcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjYWxsZWRBcmdzID0gc3B5SW5zdGFuY2UuZ2V0Q2FsbChpKS5hcmdzO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjYWxsZWRBcmdzLmxlbmd0aCB8fCBqIDwgYXJncy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gXCJcXG5cIjtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGVkQXJnTWVzc2FnZSA9IGogPCBjYWxsZWRBcmdzLmxlbmd0aCA/IHNpbm9uRm9ybWF0KGNhbGxlZEFyZ3Nbal0pIDogXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2guaXNNYXRjaGVyKGFyZ3Nbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gY29sb3JTaW5vbk1hdGNoVGV4dChhcmdzW2pdLCBjYWxsZWRBcmdzW2pdLCBjYWxsZWRBcmdNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhwZWN0ZWRBcmdNZXNzYWdlID0gaiA8IGFyZ3MubGVuZ3RoID8gc2lub25Gb3JtYXQoYXJnc1tqXSkgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGpzRGlmZi5kaWZmSnNvbihjYWxsZWRBcmdNZXNzYWdlLCBleHBlY3RlZEFyZ01lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGNvbG9yRGlmZlRleHQoZGlmZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfSxcblxuICAgIEM6IGZ1bmN0aW9uKHNweUluc3RhbmNlKSB7XG4gICAgICAgIHZhciBjYWxscyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gc3B5SW5zdGFuY2UuY2FsbENvdW50OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbG9jYWwtcnVsZXMvbm8tcHJvdG90eXBlLW1ldGhvZHNcbiAgICAgICAgICAgIHZhciBzdHJpbmdpZmllZENhbGwgPSBcIiAgICBcIiArIHNweUluc3RhbmNlLmdldENhbGwoaSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmICgvXFxuLy50ZXN0KGNhbGxzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgICAgICBzdHJpbmdpZmllZENhbGwgPSBcIlxcblwiICsgc3RyaW5naWZpZWRDYWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHVzaChjYWxscywgc3RyaW5naWZpZWRDYWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxscy5sZW5ndGggPiAwID8gXCJcXG5cIiArIGpvaW4oY2FsbHMsIFwiXFxuXCIpIDogXCJcIjtcbiAgICB9LFxuXG4gICAgdDogZnVuY3Rpb24oc3B5SW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHNweUluc3RhbmNlLmNhbGxDb3VudDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgcHVzaChvYmplY3RzLCBzaW5vbkZvcm1hdChzcHlJbnN0YW5jZS50aGlzVmFsdWVzW2ldKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gam9pbihvYmplY3RzLCBcIiwgXCIpO1xuICAgIH0sXG5cbiAgICBcIipcIjogZnVuY3Rpb24oc3B5SW5zdGFuY2UsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGpvaW4oXG4gICAgICAgICAgICBtYXAoYXJncywgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpbm9uRm9ybWF0KGFyZyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFwiLCBcIlxuICAgICAgICApO1xuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGFycmF5UHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLmFycmF5O1xudmFyIGNyZWF0ZUJlaGF2aW9yID0gcmVxdWlyZShcIi4vYmVoYXZpb3JcIikuY3JlYXRlO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikuZnVuY3Rpb25OYW1lO1xudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvZnVuY3Rpb24tdG8tc3RyaW5nXCIpO1xudmFyIGdldFByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9nZXQtcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciBkZWVwRXF1YWwgPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpLmRlZXBFcXVhbDtcbnZhciBpc0VzTW9kdWxlID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2lzLWVzLW1vZHVsZVwiKTtcbnZhciBzcHlDYWxsID0gcmVxdWlyZShcIi4vY2FsbFwiKTtcbnZhciB3cmFwTWV0aG9kID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dyYXAtbWV0aG9kXCIpO1xudmFyIHNpbm9uRm9ybWF0ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2Zvcm1hdFwiKTtcbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcblxuLyogY2FjaGUgcmVmZXJlbmNlcyB0byBsaWJyYXJ5IG1ldGhvZHMgc28gdGhhdCB0aGV5IGFsc28gY2FuIGJlIHN0dWJiZWQgd2l0aG91dCBwcm9ibGVtcyAqL1xudmFyIGNvbmNhdCA9IGFycmF5UHJvdG8uY29uY2F0O1xudmFyIGZvckVhY2ggPSBhcnJheVByb3RvLmZvckVhY2g7XG52YXIgcG9wID0gYXJyYXlQcm90by5wb3A7XG52YXIgcHVzaCA9IGFycmF5UHJvdG8ucHVzaDtcbnZhciBzbGljZSA9IGFycmF5UHJvdG8uc2xpY2U7XG52YXIgZmlsdGVyID0gQXJyYXkucHJvdG90eXBlLmZpbHRlcjtcbnZhciBFcnJvckNvbnN0cnVjdG9yID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xudmFyIGJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcblxudmFyIGNhbGxJZCA9IDA7XG5cbmZ1bmN0aW9uIHNweShvYmplY3QsIHByb3BlcnR5LCB0eXBlcykge1xuICAgIHZhciBkZXNjcmlwdG9yLCBtZXRob2REZXNjO1xuXG4gICAgaWYgKGlzRXNNb2R1bGUob2JqZWN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRVMgTW9kdWxlcyBjYW5ub3QgYmUgc3BpZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wZXJ0eSAmJiB0eXBlb2Ygb2JqZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHNweS5jcmVhdGUob2JqZWN0KTtcbiAgICB9XG5cbiAgICBpZiAoIW9iamVjdCAmJiAhcHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHNweS5jcmVhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghdHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBNZXRob2Qob2JqZWN0LCBwcm9wZXJ0eSwgc3B5LmNyZWF0ZShvYmplY3RbcHJvcGVydHldKSk7XG4gICAgfVxuXG4gICAgZGVzY3JpcHRvciA9IHt9O1xuICAgIG1ldGhvZERlc2MgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7XG5cbiAgICBmb3JFYWNoKHR5cGVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIGRlc2NyaXB0b3JbdHlwZV0gPSBzcHkuY3JlYXRlKG1ldGhvZERlc2NbdHlwZV0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdyYXBNZXRob2Qob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7XG59XG5cbmZ1bmN0aW9uIGluY3JlbWVudENhbGxDb3VudCgpIHtcbiAgICB0aGlzLmNhbGxlZCA9IHRydWU7XG4gICAgdGhpcy5jYWxsQ291bnQgKz0gMTtcbiAgICB0aGlzLm5vdENhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2FsbGVkT25jZSA9IHRoaXMuY2FsbENvdW50ID09PSAxO1xuICAgIHRoaXMuY2FsbGVkVHdpY2UgPSB0aGlzLmNhbGxDb3VudCA9PT0gMjtcbiAgICB0aGlzLmNhbGxlZFRocmljZSA9IHRoaXMuY2FsbENvdW50ID09PSAzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYWxsUHJvcGVydGllcygpIHtcbiAgICB0aGlzLmZpcnN0Q2FsbCA9IHRoaXMuZ2V0Q2FsbCgwKTtcbiAgICB0aGlzLnNlY29uZENhbGwgPSB0aGlzLmdldENhbGwoMSk7XG4gICAgdGhpcy50aGlyZENhbGwgPSB0aGlzLmdldENhbGwoMik7XG4gICAgdGhpcy5sYXN0Q2FsbCA9IHRoaXMuZ2V0Q2FsbCh0aGlzLmNhbGxDb3VudCAtIDEpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQcm94eShmdW5jLCBwcm94eUxlbmd0aCkge1xuICAgIC8vIFJldGFpbiB0aGUgZnVuY3Rpb24gbGVuZ3RoOlxuICAgIHZhciBwO1xuICAgIGlmIChwcm94eUxlbmd0aCkge1xuICAgICAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgdG8gdXNlIGFuIGV2YWwuIFByb2plY3RzIHRoYXQgZGVwZW5kIG9uIHNpbm9uIGJsb2NrIHRoZSB1c2Ugb2YgZXZhbC5cbiAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vc2lub25qcy9zaW5vbi9pc3N1ZXMvNzEwXG4gICAgICAgIHN3aXRjaCAocHJveHlMZW5ndGgpIHtcbiAgICAgICAgICAgIC8qZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMsIG1heC1sZW4qL1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcC5pbnZva2UoZnVuYywgdGhpcywgc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgcCA9IGZ1bmN0aW9uIHByb3h5KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAuaW52b2tlKGZ1bmMsIHRoaXMsIHNsaWNlKGFyZ3VtZW50cykpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBwID0gZnVuY3Rpb24gcHJveHkoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLyplc2xpbnQtZW5hYmxlKi9cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAgPSBmdW5jdGlvbiBwcm94eSgpIHtcbiAgICAgICAgICAgIHJldHVybiBwLmludm9rZShmdW5jLCB0aGlzLCBzbGljZShhcmd1bWVudHMpKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmFyIG5hbWVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmdW5jLCBcIm5hbWVcIik7XG4gICAgaWYgKG5hbWVEZXNjcmlwdG9yICYmIG5hbWVEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAvLyBJRSAxMSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBhIG5hbWUuXG4gICAgICAgIC8vIFNhZmFyaSA5IGhhcyBuYW1lcyB0aGF0IGFyZSBub3QgY29uZmlndXJhYmxlLlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocCwgXCJuYW1lXCIsIG5hbWVEZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgZXh0ZW5kLm5vbkVudW0ocCwge1xuICAgICAgICBpc1Npbm9uUHJveHk6IHRydWUsXG5cbiAgICAgICAgY2FsbGVkOiBmYWxzZSxcbiAgICAgICAgbm90Q2FsbGVkOiB0cnVlLFxuICAgICAgICBjYWxsZWRPbmNlOiBmYWxzZSxcbiAgICAgICAgY2FsbGVkVHdpY2U6IGZhbHNlLFxuICAgICAgICBjYWxsZWRUaHJpY2U6IGZhbHNlLFxuICAgICAgICBjYWxsQ291bnQ6IDAsXG4gICAgICAgIGZpcnN0Q2FsbDogbnVsbCxcbiAgICAgICAgc2Vjb25kQ2FsbDogbnVsbCxcbiAgICAgICAgdGhpcmRDYWxsOiBudWxsLFxuICAgICAgICBsYXN0Q2FsbDogbnVsbCxcbiAgICAgICAgYXJnczogW10sXG4gICAgICAgIHJldHVyblZhbHVlczogW10sXG4gICAgICAgIHRoaXNWYWx1ZXM6IFtdLFxuICAgICAgICBleGNlcHRpb25zOiBbXSxcbiAgICAgICAgY2FsbElkczogW10sXG4gICAgICAgIGVycm9yc1dpdGhDYWxsU3RhY2s6IFtdXG4gICAgfSk7XG4gICAgcmV0dXJuIHA7XG59XG5cbnZhciB1dWlkID0gMDtcblxuLy8gUHVibGljIEFQSVxudmFyIHNweUFwaSA9IHtcbiAgICBmb3JtYXR0ZXJzOiByZXF1aXJlKFwiLi9zcHktZm9ybWF0dGVyc1wiKSxcblxuICAgIHJlc2V0SGlzdG9yeTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmludm9raW5nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2Fubm90IHJlc2V0IFNpbm9uIGZ1bmN0aW9uIHdoaWxlIGludm9raW5nIGl0LiBcIiArXG4gICAgICAgICAgICAgICAgICAgIFwiTW92ZSB0aGUgY2FsbCB0byAucmVzZXRIaXN0b3J5IG91dHNpZGUgb2YgdGhlIGNhbGxiYWNrLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSBcIkludmFsaWRSZXNldEV4Y2VwdGlvblwiO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RDYWxsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNhbGxlZE9uY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsZWRUd2ljZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbGxlZFRocmljZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbGxDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZmlyc3RDYWxsID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWNvbmRDYWxsID0gbnVsbDtcbiAgICAgICAgdGhpcy50aGlyZENhbGwgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RDYWxsID0gbnVsbDtcbiAgICAgICAgdGhpcy5hcmdzID0gW107XG4gICAgICAgIHRoaXMucmV0dXJuVmFsdWVzID0gW107XG4gICAgICAgIHRoaXMudGhpc1ZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLmV4Y2VwdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5jYWxsSWRzID0gW107XG4gICAgICAgIHRoaXMuZXJyb3JzV2l0aENhbGxTdGFjayA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLmZha2VzKSB7XG4gICAgICAgICAgICBmb3JFYWNoKHRoaXMuZmFrZXMsIGZ1bmN0aW9uKGZha2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmFrZS5yZXNldEhpc3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFrZS5yZXNldEhpc3RvcnkoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmYWtlLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUoZnVuYywgc3B5TGVuZ3RoKSB7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICB2YXIgZnVuayA9IGZ1bmM7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5rICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGZ1bmsgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFtZSA9IGZ1bmN0aW9uTmFtZShmdW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsZW5ndGggPSBzcHlMZW5ndGggfHwgZnVuay5sZW5ndGg7XG4gICAgICAgIHZhciBwcm94eSA9IGNyZWF0ZVByb3h5KGZ1bmssIGxlbmd0aCk7XG5cbiAgICAgICAgZXh0ZW5kLm5vbkVudW0ocHJveHksIHNweSk7XG4gICAgICAgIGRlbGV0ZSBwcm94eS5jcmVhdGU7XG4gICAgICAgIGV4dGVuZChwcm94eSwgZnVuayk7XG5cbiAgICAgICAgcHJveHkucmVzZXRIaXN0b3J5KCk7XG4gICAgICAgIHByb3h5LnByb3RvdHlwZSA9IGZ1bmsucHJvdG90eXBlO1xuXG4gICAgICAgIGV4dGVuZC5ub25FbnVtKHByb3h5LCB7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogbmFtZSB8fCBcInNweVwiLFxuICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uVG9TdHJpbmcsXG4gICAgICAgICAgICBpbnN0YW50aWF0ZUZha2U6IHNweS5jcmVhdGUsXG4gICAgICAgICAgICBpZDogXCJzcHkjXCIgKyB1dWlkKytcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH0sXG5cbiAgICBpbnZva2U6IGZ1bmN0aW9uIGludm9rZShmdW5jLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIG1hdGNoaW5ncyA9IHRoaXMubWF0Y2hpbmdGYWtlcyhhcmdzKTtcbiAgICAgICAgdmFyIGN1cnJlbnRDYWxsSWQgPSBjYWxsSWQrKztcbiAgICAgICAgdmFyIGV4Y2VwdGlvbiwgcmV0dXJuVmFsdWU7XG5cbiAgICAgICAgaW5jcmVtZW50Q2FsbENvdW50LmNhbGwodGhpcyk7XG4gICAgICAgIHB1c2godGhpcy50aGlzVmFsdWVzLCB0aGlzVmFsdWUpO1xuICAgICAgICBwdXNoKHRoaXMuYXJncywgYXJncyk7XG4gICAgICAgIHB1c2godGhpcy5jYWxsSWRzLCBjdXJyZW50Q2FsbElkKTtcbiAgICAgICAgZm9yRWFjaChtYXRjaGluZ3MsIGZ1bmN0aW9uKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICBpbmNyZW1lbnRDYWxsQ291bnQuY2FsbChtYXRjaGluZyk7XG4gICAgICAgICAgICBwdXNoKG1hdGNoaW5nLnRoaXNWYWx1ZXMsIHRoaXNWYWx1ZSk7XG4gICAgICAgICAgICBwdXNoKG1hdGNoaW5nLmFyZ3MsIGFyZ3MpO1xuICAgICAgICAgICAgcHVzaChtYXRjaGluZy5jYWxsSWRzLCBjdXJyZW50Q2FsbElkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFrZSBjYWxsIHByb3BlcnRpZXMgYXZhaWxhYmxlIGZyb20gd2l0aGluIHRoZSBzcGllZCBmdW5jdGlvbjpcbiAgICAgICAgY3JlYXRlQ2FsbFByb3BlcnRpZXMuY2FsbCh0aGlzKTtcbiAgICAgICAgZm9yRWFjaChtYXRjaGluZ3MsIGZ1bmN0aW9uKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICBjcmVhdGVDYWxsUHJvcGVydGllcy5jYWxsKG1hdGNoaW5nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICB2YXIgdGhpc0NhbGwgPSB0aGlzLmdldENhbGwodGhpcy5jYWxsQ291bnQgLSAxKTtcblxuICAgICAgICAgICAgaWYgKHRoaXNDYWxsLmNhbGxlZFdpdGhOZXcoKSkge1xuICAgICAgICAgICAgICAgIC8vIENhbGwgdGhyb3VnaCB3aXRoIGBuZXdgXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBuZXcgKGJpbmQuYXBwbHkodGhpcy5mdW5jIHx8IGZ1bmMsIGNvbmNhdChbdGhpc1ZhbHVlXSwgYXJncykpKSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXR1cm5WYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRoaXNWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gKHRoaXMuZnVuYyB8fCBmdW5jKS5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleGNlcHRpb24gPSBlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW52b2tpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHRoaXMuZXhjZXB0aW9ucywgZXhjZXB0aW9uKTtcbiAgICAgICAgcHVzaCh0aGlzLnJldHVyblZhbHVlcywgcmV0dXJuVmFsdWUpO1xuICAgICAgICBmb3JFYWNoKG1hdGNoaW5ncywgZnVuY3Rpb24obWF0Y2hpbmcpIHtcbiAgICAgICAgICAgIHB1c2gobWF0Y2hpbmcuZXhjZXB0aW9ucywgZXhjZXB0aW9uKTtcbiAgICAgICAgICAgIHB1c2gobWF0Y2hpbmcucmV0dXJuVmFsdWVzLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3JDb25zdHJ1Y3RvcigpO1xuICAgICAgICAvLyAxLiBQbGVhc2UgZG8gbm90IGdldCBzdGFjayBhdCB0aGlzIHBvaW50LiBJdCBtYXkgYmUgc28gdmVyeSBzbG93LCBhbmQgbm90IGFjdHVhbGx5IHVzZWRcbiAgICAgICAgLy8gMi4gUGhhbnRvbUpTIGRvZXMgbm90IHNlcmlhbGl6ZSB0aGUgc3RhY2sgdHJhY2UgdW50aWwgdGhlIGVycm9yIGhhcyBiZWVuIHRocm93bjpcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IvU3RhY2tcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogZW1wdHkgKi9cbiAgICAgICAgfVxuICAgICAgICBwdXNoKHRoaXMuZXJyb3JzV2l0aENhbGxTdGFjaywgZXJyKTtcbiAgICAgICAgZm9yRWFjaChtYXRjaGluZ3MsIGZ1bmN0aW9uKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICBwdXNoKG1hdGNoaW5nLmVycm9yc1dpdGhDYWxsU3RhY2ssIGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1ha2UgcmV0dXJuIHZhbHVlIGFuZCBleGNlcHRpb24gYXZhaWxhYmxlIGluIHRoZSBjYWxsczpcbiAgICAgICAgY3JlYXRlQ2FsbFByb3BlcnRpZXMuY2FsbCh0aGlzKTtcbiAgICAgICAgZm9yRWFjaChtYXRjaGluZ3MsIGZ1bmN0aW9uKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICBjcmVhdGVDYWxsUHJvcGVydGllcy5jYWxsKG1hdGNoaW5nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSxcblxuICAgIG5hbWVkOiBmdW5jdGlvbiBuYW1lZChuYW1lKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB2YXIgbmFtZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFwibmFtZVwiKTtcbiAgICAgICAgaWYgKG5hbWVEZXNjcmlwdG9yICYmIG5hbWVEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgICAgLy8gSUUgMTEgZnVuY3Rpb25zIGRvbid0IGhhdmUgYSBuYW1lLlxuICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIG5hbWVzIHRoYXQgYXJlIG5vdCBjb25maWd1cmFibGUuXG4gICAgICAgICAgICBuYW1lRGVzY3JpcHRvci52YWx1ZSA9IG5hbWU7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIG5hbWVEZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgZ2V0Q2FsbDogZnVuY3Rpb24gZ2V0Q2FsbChpKSB7XG4gICAgICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuY2FsbENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcHlDYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMudGhpc1ZhbHVlc1tpXSxcbiAgICAgICAgICAgIHRoaXMuYXJnc1tpXSxcbiAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWVzW2ldLFxuICAgICAgICAgICAgdGhpcy5leGNlcHRpb25zW2ldLFxuICAgICAgICAgICAgdGhpcy5jYWxsSWRzW2ldLFxuICAgICAgICAgICAgdGhpcy5lcnJvcnNXaXRoQ2FsbFN0YWNrW2ldXG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGdldENhbGxzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNhbGxzID0gW107XG4gICAgICAgIHZhciBpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNhbGxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBwdXNoKGNhbGxzLCB0aGlzLmdldENhbGwoaSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxzO1xuICAgIH0sXG5cbiAgICBjYWxsZWRCZWZvcmU6IGZ1bmN0aW9uIGNhbGxlZEJlZm9yZShzcHlGbikge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNweUZuLmNhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWRzWzBdIDwgc3B5Rm4uY2FsbElkc1tzcHlGbi5jYWxsSWRzLmxlbmd0aCAtIDFdO1xuICAgIH0sXG5cbiAgICBjYWxsZWRBZnRlcjogZnVuY3Rpb24gY2FsbGVkQWZ0ZXIoc3B5Rm4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCB8fCAhc3B5Rm4uY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWRzW3RoaXMuY2FsbENvdW50IC0gMV0gPiBzcHlGbi5jYWxsSWRzWzBdO1xuICAgIH0sXG5cbiAgICBjYWxsZWRJbW1lZGlhdGVseUJlZm9yZTogZnVuY3Rpb24gY2FsbGVkSW1tZWRpYXRlbHlCZWZvcmUoc3B5Rm4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCB8fCAhc3B5Rm4uY2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSWRzW3RoaXMuY2FsbENvdW50IC0gMV0gPT09IHNweUZuLmNhbGxJZHNbc3B5Rm4uY2FsbENvdW50IC0gMV0gLSAxO1xuICAgIH0sXG5cbiAgICBjYWxsZWRJbW1lZGlhdGVseUFmdGVyOiBmdW5jdGlvbiBjYWxsZWRJbW1lZGlhdGVseUFmdGVyKHNweUZuKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWxsZWQgfHwgIXNweUZuLmNhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbElkc1t0aGlzLmNhbGxDb3VudCAtIDFdID09PSBzcHlGbi5jYWxsSWRzW3NweUZuLmNhbGxDb3VudCAtIDFdICsgMTtcbiAgICB9LFxuXG4gICAgd2l0aEFyZ3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmFrZXMpIHtcbiAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IHBvcCh0aGlzLm1hdGNoaW5nRmFrZXMoYXJncywgdHJ1ZSkpO1xuXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHRlbmQubm9uRW51bSh0aGlzLCB7IGZha2VzOiBbXSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcmlnaW5hbCA9IHRoaXM7XG4gICAgICAgIHZhciBmYWtlID0gdGhpcy5pbnN0YW50aWF0ZUZha2UoKTtcbiAgICAgICAgZmFrZS5tYXRjaGluZ0FyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIGZha2UucGFyZW50ID0gdGhpcztcbiAgICAgICAgcHVzaCh0aGlzLmZha2VzLCBmYWtlKTtcblxuICAgICAgICBpZiAob3JpZ2luYWwuZGVmYXVsdEJlaGF2aW9yICYmIG9yaWdpbmFsLmRlZmF1bHRCZWhhdmlvci5wcm9taXNlTGlicmFyeSkge1xuICAgICAgICAgICAgZmFrZS5kZWZhdWx0QmVoYXZpb3IgPSBmYWtlLmRlZmF1bHRCZWhhdmlvciB8fCBjcmVhdGVCZWhhdmlvcihmYWtlKTtcbiAgICAgICAgICAgIGZha2UuZGVmYXVsdEJlaGF2aW9yLnByb21pc2VMaWJyYXJ5ID0gb3JpZ2luYWwuZGVmYXVsdEJlaGF2aW9yLnByb21pc2VMaWJyYXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgZmFrZS53aXRoQXJncyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLndpdGhBcmdzLmFwcGx5KG9yaWdpbmFsLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvckVhY2gob3JpZ2luYWwuYXJncywgZnVuY3Rpb24oYXJnLCBpKSB7XG4gICAgICAgICAgICBpZiAoIWZha2UubWF0Y2hlcyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmNyZW1lbnRDYWxsQ291bnQuY2FsbChmYWtlKTtcbiAgICAgICAgICAgIHB1c2goZmFrZS50aGlzVmFsdWVzLCBvcmlnaW5hbC50aGlzVmFsdWVzW2ldKTtcbiAgICAgICAgICAgIHB1c2goZmFrZS5hcmdzLCBhcmcpO1xuICAgICAgICAgICAgcHVzaChmYWtlLnJldHVyblZhbHVlcywgb3JpZ2luYWwucmV0dXJuVmFsdWVzW2ldKTtcbiAgICAgICAgICAgIHB1c2goZmFrZS5leGNlcHRpb25zLCBvcmlnaW5hbC5leGNlcHRpb25zW2ldKTtcbiAgICAgICAgICAgIHB1c2goZmFrZS5jYWxsSWRzLCBvcmlnaW5hbC5jYWxsSWRzW2ldKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3JlYXRlQ2FsbFByb3BlcnRpZXMuY2FsbChmYWtlKTtcblxuICAgICAgICByZXR1cm4gZmFrZTtcbiAgICB9LFxuXG4gICAgbWF0Y2hpbmdGYWtlczogZnVuY3Rpb24oYXJncywgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmZha2VzIHx8IFtdLCBmdW5jdGlvbihmYWtlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFrZS5tYXRjaGVzKGFyZ3MsIHN0cmljdCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBtYXRjaGVzOiBmdW5jdGlvbihhcmdzLCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIG1hcmdzID0gdGhpcy5tYXRjaGluZ0FyZ3VtZW50cztcblxuICAgICAgICBpZiAobWFyZ3MubGVuZ3RoIDw9IGFyZ3MubGVuZ3RoICYmIGRlZXBFcXVhbChzbGljZShhcmdzLCAwLCBtYXJncy5sZW5ndGgpLCBtYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiAhc3RyaWN0IHx8IG1hcmdzLmxlbmd0aCA9PT0gYXJncy5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBwcmludGY6IGZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgc3B5SW5zdGFuY2UgPSB0aGlzO1xuICAgICAgICB2YXIgYXJncyA9IHNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHZhciBmb3JtYXR0ZXI7XG5cbiAgICAgICAgcmV0dXJuIChmb3JtYXQgfHwgXCJcIikucmVwbGFjZSgvJSguKS9nLCBmdW5jdGlvbihtYXRjaCwgc3BlY2lmeWVyKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBzcHlBcGkuZm9ybWF0dGVyc1tzcGVjaWZ5ZXJdO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhmb3JtYXR0ZXIoc3B5SW5zdGFuY2UsIGFyZ3MpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKHBhcnNlSW50KHNwZWNpZnllciwgMTApKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzaW5vbkZvcm1hdChhcmdzW3NwZWNpZnllciAtIDFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFwiJVwiICsgc3BlY2lmeWVyO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBkZWxlZ2F0ZVRvQ2FsbHMobWV0aG9kLCBtYXRjaEFueSwgYWN0dWFsLCByZXR1cm5zVmFsdWVzLCBub3RDYWxsZWQsIHRvdGFsQ2FsbENvdW50KSB7XG4gICAgc3B5QXBpW21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxlZCkge1xuICAgICAgICAgICAgaWYgKG5vdENhbGxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3RDYWxsZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b3RhbENhbGxDb3VudCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY2FsbENvdW50ICE9PSB0b3RhbENhbGxDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1cnJlbnRDYWxsO1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IDA7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuY2FsbENvdW50OyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjdXJyZW50Q2FsbCA9IHRoaXMuZ2V0Q2FsbChpKTtcbiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGN1cnJlbnRDYWxsW2FjdHVhbCB8fCBtZXRob2RdLmFwcGx5KGN1cnJlbnRDYWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcHVzaChyZXR1cm5WYWx1ZXMsIHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMgKz0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaEFueSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0dXJuc1ZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcyA9PT0gdGhpcy5jYWxsQ291bnQ7XG4gICAgfTtcbn1cblxuZGVsZWdhdGVUb0NhbGxzKFwiY2FsbGVkT25cIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJhbHdheXNDYWxsZWRPblwiLCBmYWxzZSwgXCJjYWxsZWRPblwiKTtcbmRlbGVnYXRlVG9DYWxscyhcImNhbGxlZFdpdGhcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJjYWxsZWRPbmNlV2l0aFwiLCB0cnVlLCBcImNhbGxlZFdpdGhcIiwgZmFsc2UsIHVuZGVmaW5lZCwgMSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJjYWxsZWRXaXRoTWF0Y2hcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJhbHdheXNDYWxsZWRXaXRoXCIsIGZhbHNlLCBcImNhbGxlZFdpdGhcIik7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJhbHdheXNDYWxsZWRXaXRoTWF0Y2hcIiwgZmFsc2UsIFwiY2FsbGVkV2l0aE1hdGNoXCIpO1xuZGVsZWdhdGVUb0NhbGxzKFwiY2FsbGVkV2l0aEV4YWN0bHlcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJjYWxsZWRPbmNlV2l0aEV4YWN0bHlcIiwgdHJ1ZSwgXCJjYWxsZWRXaXRoRXhhY3RseVwiLCBmYWxzZSwgdW5kZWZpbmVkLCAxKTtcbmRlbGVnYXRlVG9DYWxscyhcImFsd2F5c0NhbGxlZFdpdGhFeGFjdGx5XCIsIGZhbHNlLCBcImNhbGxlZFdpdGhFeGFjdGx5XCIpO1xuZGVsZWdhdGVUb0NhbGxzKFwibmV2ZXJDYWxsZWRXaXRoXCIsIGZhbHNlLCBcIm5vdENhbGxlZFdpdGhcIiwgZmFsc2UsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJuZXZlckNhbGxlZFdpdGhNYXRjaFwiLCBmYWxzZSwgXCJub3RDYWxsZWRXaXRoTWF0Y2hcIiwgZmFsc2UsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xufSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJ0aHJld1wiLCB0cnVlKTtcbmRlbGVnYXRlVG9DYWxscyhcImFsd2F5c1RocmV3XCIsIGZhbHNlLCBcInRocmV3XCIpO1xuZGVsZWdhdGVUb0NhbGxzKFwicmV0dXJuZWRcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJhbHdheXNSZXR1cm5lZFwiLCBmYWxzZSwgXCJyZXR1cm5lZFwiKTtcbmRlbGVnYXRlVG9DYWxscyhcImNhbGxlZFdpdGhOZXdcIiwgdHJ1ZSk7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJhbHdheXNDYWxsZWRXaXRoTmV3XCIsIGZhbHNlLCBcImNhbGxlZFdpdGhOZXdcIik7XG4vKiBlc2xpbnQtZGlzYWJsZSBsb2NhbC1ydWxlcy9uby1wcm90b3R5cGUtbWV0aG9kcyAqL1xuZGVsZWdhdGVUb0NhbGxzKFwiY2FsbEFyZ1wiLCBmYWxzZSwgXCJjYWxsQXJnV2l0aFwiLCB0cnVlLCBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50b1N0cmluZygpICsgXCIgY2Fubm90IGNhbGwgYXJnIHNpbmNlIGl0IHdhcyBub3QgeWV0IGludm9rZWQuXCIpO1xufSk7XG5zcHlBcGkuY2FsbEFyZ1dpdGggPSBzcHlBcGkuY2FsbEFyZztcbmRlbGVnYXRlVG9DYWxscyhcImNhbGxBcmdPblwiLCBmYWxzZSwgXCJjYWxsQXJnT25XaXRoXCIsIHRydWUsIGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcih0aGlzLnRvU3RyaW5nKCkgKyBcIiBjYW5ub3QgY2FsbCBhcmcgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5cIik7XG59KTtcbnNweUFwaS5jYWxsQXJnT25XaXRoID0gc3B5QXBpLmNhbGxBcmdPbjtcbmRlbGVnYXRlVG9DYWxscyhcInRocm93QXJnXCIsIGZhbHNlLCBcInRocm93QXJnXCIsIGZhbHNlLCBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50b1N0cmluZygpICsgXCIgY2Fubm90IHRocm93IGFyZyBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiKTtcbn0pO1xuZGVsZWdhdGVUb0NhbGxzKFwieWllbGRcIiwgZmFsc2UsIFwieWllbGRcIiwgdHJ1ZSwgZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB5aWVsZCBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiKTtcbn0pO1xuLy8gXCJpbnZva2VDYWxsYmFja1wiIGlzIGFuIGFsaWFzIGZvciBcInlpZWxkXCIgc2luY2UgXCJ5aWVsZFwiIGlzIGludmFsaWQgaW4gc3RyaWN0IG1vZGUuXG5zcHlBcGkuaW52b2tlQ2FsbGJhY2sgPSBzcHlBcGkueWllbGQ7XG5kZWxlZ2F0ZVRvQ2FsbHMoXCJ5aWVsZE9uXCIsIGZhbHNlLCBcInlpZWxkT25cIiwgdHJ1ZSwgZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB5aWVsZCBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiKTtcbn0pO1xuZGVsZWdhdGVUb0NhbGxzKFwieWllbGRUb1wiLCBmYWxzZSwgXCJ5aWVsZFRvXCIsIHRydWUsIGZ1bmN0aW9uKHByb3BlcnR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICB0aGlzLnRvU3RyaW5nKCkgKyBcIiBjYW5ub3QgeWllbGQgdG8gJ1wiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkgKyBcIicgc2luY2UgaXQgd2FzIG5vdCB5ZXQgaW52b2tlZC5cIlxuICAgICk7XG59KTtcbmRlbGVnYXRlVG9DYWxscyhcInlpZWxkVG9PblwiLCBmYWxzZSwgXCJ5aWVsZFRvT25cIiwgdHJ1ZSwgZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHRoaXMudG9TdHJpbmcoKSArIFwiIGNhbm5vdCB5aWVsZCB0byAnXCIgKyB2YWx1ZVRvU3RyaW5nKHByb3BlcnR5KSArIFwiJyBzaW5jZSBpdCB3YXMgbm90IHlldCBpbnZva2VkLlwiXG4gICAgKTtcbn0pO1xuLyogZXNsaW50LWVuYWJsZSBsb2NhbC1ydWxlcy9uby1wcm90b3R5cGUtbWV0aG9kcyAqL1xuXG5leHRlbmQoc3B5LCBzcHlBcGkpO1xuc3B5LnNweUNhbGwgPSBzcHlDYWxsO1xubW9kdWxlLmV4cG9ydHMgPSBzcHk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGdldFByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9nZXQtcHJvcGVydHktZGVzY3JpcHRvclwiKTtcbnZhciB3YWxrID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL3dhbGtcIik7XG5cbmZ1bmN0aW9uIHN0dWJFbnRpcmVPYmplY3Qoc3R1Yiwgb2JqZWN0KSB7XG4gICAgd2FsayhvYmplY3QgfHwge30sIGZ1bmN0aW9uKHByb3AsIHByb3BPd25lcikge1xuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHN0dWIgdGhpbmdzIGxpa2UgdG9TdHJpbmcoKSwgdmFsdWVPZigpLCBldGMuIHNvIHdlIG9ubHkgc3R1YiBpZiB0aGUgb2JqZWN0XG4gICAgICAgIC8vIGlzIG5vdCBPYmplY3QucHJvdG90eXBlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BPd25lciAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJlxuICAgICAgICAgICAgcHJvcCAhPT0gXCJjb25zdHJ1Y3RvclwiICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BPd25lciwgcHJvcCkudmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHN0dWIob2JqZWN0LCBwcm9wKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRW50aXJlT2JqZWN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBiZWhhdmlvciA9IHJlcXVpcmUoXCIuL2JlaGF2aW9yXCIpO1xudmFyIGJlaGF2aW9ycyA9IHJlcXVpcmUoXCIuL2RlZmF1bHQtYmVoYXZpb3JzXCIpO1xudmFyIGhhc093blByb3BlcnR5ID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5vYmplY3QuaGFzT3duUHJvcGVydHk7XG52YXIgaXNOb25FeGlzdGVudE93blByb3BlcnR5ID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2lzLW5vbi1leGlzdGVudC1vd24tcHJvcGVydHlcIik7XG52YXIgc3B5ID0gcmVxdWlyZShcIi4vc3B5XCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9leHRlbmRcIik7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoXCIuL3V0aWwvY29yZS9mdW5jdGlvbi10by1zdHJpbmdcIik7XG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vdXRpbC9jb3JlL2dldC1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIGlzRXNNb2R1bGUgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvaXMtZXMtbW9kdWxlXCIpO1xudmFyIHdyYXBNZXRob2QgPSByZXF1aXJlKFwiLi91dGlsL2NvcmUvd3JhcC1tZXRob2RcIik7XG52YXIgc3R1YkVudGlyZU9iamVjdCA9IHJlcXVpcmUoXCIuL3N0dWItZW50aXJlLW9iamVjdFwiKTtcbnZhciB0aHJvd09uRmFsc3lPYmplY3QgPSByZXF1aXJlKFwiLi90aHJvdy1vbi1mYWxzeS1vYmplY3RcIik7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbnZhciBmb3JFYWNoID0gYXJyYXlQcm90by5mb3JFYWNoO1xudmFyIHBvcCA9IGFycmF5UHJvdG8ucG9wO1xudmFyIHNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcbnZhciBzb3J0ID0gYXJyYXlQcm90by5zb3J0O1xuXG5mdW5jdGlvbiBzdHViKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInN0dWIob2JqLCAnbWV0aCcsIGZuKSBoYXMgYmVlbiByZW1vdmVkLCBzZWUgZG9jdW1lbnRhdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAoaXNFc01vZHVsZShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFUyBNb2R1bGVzIGNhbm5vdCBiZSBzdHViYmVkXCIpO1xuICAgIH1cblxuICAgIHRocm93T25GYWxzeU9iamVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKGlzTm9uRXhpc3RlbnRPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHN0dWIgbm9uLWV4aXN0ZW50IG93biBwcm9wZXJ0eSBcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpKTtcbiAgICB9XG5cbiAgICB2YXIgYWN0dWFsRGVzY3JpcHRvciA9IGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICB2YXIgaXNPYmplY3QgPSB0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmplY3QgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB2YXIgaXNTdHViYmluZ0VudGlyZU9iamVjdCA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBpc09iamVjdDtcbiAgICB2YXIgaXNDcmVhdGluZ05ld1N0dWIgPSAhb2JqZWN0ICYmIHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJ1bmRlZmluZWRcIjtcbiAgICB2YXIgaXNTdHViYmluZ05vbkZ1bmNQcm9wZXJ0eSA9XG4gICAgICAgIGlzT2JqZWN0ICYmXG4gICAgICAgIHR5cGVvZiBwcm9wZXJ0eSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAodHlwZW9mIGFjdHVhbERlc2NyaXB0b3IgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIGFjdHVhbERlc2NyaXB0b3IudmFsdWUgIT09IFwiZnVuY3Rpb25cIikgJiZcbiAgICAgICAgdHlwZW9mIGRlc2NyaXB0b3IgPT09IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzU3R1YmJpbmdFeGlzdGluZ01ldGhvZCA9XG4gICAgICAgIHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdHlwZW9mIGFjdHVhbERlc2NyaXB0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIGFjdHVhbERlc2NyaXB0b3IudmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB2YXIgYXJpdHkgPSBpc1N0dWJiaW5nRXhpc3RpbmdNZXRob2QgPyBvYmplY3RbcHJvcGVydHldLmxlbmd0aCA6IDA7XG5cbiAgICBpZiAoaXNTdHViYmluZ0VudGlyZU9iamVjdCkge1xuICAgICAgICByZXR1cm4gc3R1YkVudGlyZU9iamVjdChzdHViLCBvYmplY3QpO1xuICAgIH1cblxuICAgIGlmIChpc0NyZWF0aW5nTmV3U3R1Yikge1xuICAgICAgICByZXR1cm4gc3R1Yi5jcmVhdGUoKTtcbiAgICB9XG5cbiAgICB2YXIgcyA9IHN0dWIuY3JlYXRlKGFyaXR5KTtcblxuICAgIGV4dGVuZC5ub25FbnVtKHMsIHtcbiAgICAgICAgcm9vdE9iajogb2JqZWN0LFxuICAgICAgICBwcm9wTmFtZTogcHJvcGVydHksXG4gICAgICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgICAgICBpZiAoYWN0dWFsRGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIGFjdHVhbERlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpc1N0dWJiaW5nTm9uRnVuY1Byb3BlcnR5ID8gcyA6IHdyYXBNZXRob2Qob2JqZWN0LCBwcm9wZXJ0eSwgcyk7XG59XG5cbnN0dWIuY3JlYXRlU3R1Ykluc3RhbmNlID0gZnVuY3Rpb24oY29uc3RydWN0b3IsIG92ZXJyaWRlcykge1xuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgc3R1YmJlZE9iamVjdCA9IHN0dWIoT2JqZWN0LmNyZWF0ZShjb25zdHJ1Y3Rvci5wcm90b3R5cGUpKTtcblxuICAgIGZvckVhY2goT2JqZWN0LmtleXMob3ZlcnJpZGVzIHx8IHt9KSwgZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgaW4gc3R1YmJlZE9iamVjdCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gb3ZlcnJpZGVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuY3JlYXRlU3R1Ykluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgc3R1YmJlZE9iamVjdFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0dWJiZWRPYmplY3RbcHJvcGVydHlOYW1lXS5yZXR1cm5zKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzdHViIFwiICsgcHJvcGVydHlOYW1lICsgXCIuIFByb3BlcnR5IGRvZXMgbm90IGV4aXN0IVwiKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdHViYmVkT2JqZWN0O1xufTtcblxuLyplc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5mdW5jdGlvbiBnZXRQYXJlbnRCZWhhdmlvdXIoc3R1Ykluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN0dWJJbnN0YW5jZS5wYXJlbnQgJiYgZ2V0Q3VycmVudEJlaGF2aW9yKHN0dWJJbnN0YW5jZS5wYXJlbnQpO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0QmVoYXZpb3Ioc3R1Ykluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN0dWJJbnN0YW5jZS5kZWZhdWx0QmVoYXZpb3IgfHwgZ2V0UGFyZW50QmVoYXZpb3VyKHN0dWJJbnN0YW5jZSkgfHwgYmVoYXZpb3IuY3JlYXRlKHN0dWJJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRCZWhhdmlvcihzdHViSW5zdGFuY2UpIHtcbiAgICB2YXIgY3VycmVudEJlaGF2aW9yID0gc3R1Ykluc3RhbmNlLmJlaGF2aW9yc1tzdHViSW5zdGFuY2UuY2FsbENvdW50IC0gMV07XG4gICAgcmV0dXJuIGN1cnJlbnRCZWhhdmlvciAmJiBjdXJyZW50QmVoYXZpb3IuaXNQcmVzZW50KCkgPyBjdXJyZW50QmVoYXZpb3IgOiBnZXREZWZhdWx0QmVoYXZpb3Ioc3R1Ykluc3RhbmNlKTtcbn1cbi8qZXNsaW50LWVuYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciB1dWlkID0gMDtcblxudmFyIHByb3RvID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKHN0dWJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGZ1bmN0aW9uU3R1YiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBzbGljZShhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIG1hdGNoaW5ncyA9IGZ1bmN0aW9uU3R1Yi5tYXRjaGluZ0Zha2VzKGFyZ3MpO1xuXG4gICAgICAgICAgICB2YXIgZm5TdHViID1cbiAgICAgICAgICAgICAgICBwb3AoXG4gICAgICAgICAgICAgICAgICAgIHNvcnQobWF0Y2hpbmdzLCBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5tYXRjaGluZ0FyZ3VtZW50cy5sZW5ndGggLSBiLm1hdGNoaW5nQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApIHx8IGZ1bmN0aW9uU3R1YjtcbiAgICAgICAgICAgIHJldHVybiBnZXRDdXJyZW50QmVoYXZpb3IoZm5TdHViKS5pbnZva2UodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgb3JpZyA9IGZ1bmN0aW9uU3R1YjtcbiAgICAgICAgZnVuY3Rpb25TdHViID0gc3B5LmNyZWF0ZShmdW5jdGlvblN0dWIsIHN0dWJMZW5ndGgpO1xuXG4gICAgICAgIGV4dGVuZC5ub25FbnVtKGZ1bmN0aW9uU3R1Yiwge1xuICAgICAgICAgICAgaWQ6IFwic3R1YiNcIiArIHV1aWQrKyxcbiAgICAgICAgICAgIGZ1bmM6IG9yaWdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXh0ZW5kKGZ1bmN0aW9uU3R1Yiwgc3R1Yik7XG5cbiAgICAgICAgZXh0ZW5kLm5vbkVudW0oZnVuY3Rpb25TdHViLCB7XG4gICAgICAgICAgICBpbnN0YW50aWF0ZUZha2U6IHN0dWIuY3JlYXRlLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IFwic3R1YlwiLFxuICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uVG9TdHJpbmcsXG5cbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjogbnVsbCxcbiAgICAgICAgICAgIGJlaGF2aW9yczogW11cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uU3R1YjtcbiAgICB9LFxuXG4gICAgcmVzZXRCZWhhdmlvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmYWtlcyA9IHRoaXMuZmFrZXMgfHwgW107XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0QmVoYXZpb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmJlaGF2aW9ycyA9IFtdO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnJldHVyblZhbHVlO1xuICAgICAgICBkZWxldGUgdGhpcy5yZXR1cm5BcmdBdDtcbiAgICAgICAgZGVsZXRlIHRoaXMudGhyb3dBcmdBdDtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVzb2x2ZUFyZ0F0O1xuICAgICAgICBkZWxldGUgdGhpcy5mYWtlRm47XG4gICAgICAgIHRoaXMucmV0dXJuVGhpcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc29sdmVUaGlzID0gZmFsc2U7XG5cbiAgICAgICAgZm9yRWFjaChmYWtlcywgZnVuY3Rpb24oZmFrZSkge1xuICAgICAgICAgICAgZmFrZS5yZXNldEJlaGF2aW9yKCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICByZXNldEhpc3Rvcnk6IHNweS5yZXNldEhpc3RvcnksXG5cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgICAgIHRoaXMucmVzZXRCZWhhdmlvcigpO1xuICAgIH0sXG5cbiAgICBvbkNhbGw6IGZ1bmN0aW9uIG9uQ2FsbChpbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMuYmVoYXZpb3JzW2luZGV4XSkge1xuICAgICAgICAgICAgdGhpcy5iZWhhdmlvcnNbaW5kZXhdID0gYmVoYXZpb3IuY3JlYXRlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYmVoYXZpb3JzW2luZGV4XTtcbiAgICB9LFxuXG4gICAgb25GaXJzdENhbGw6IGZ1bmN0aW9uIG9uRmlyc3RDYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbkNhbGwoMCk7XG4gICAgfSxcblxuICAgIG9uU2Vjb25kQ2FsbDogZnVuY3Rpb24gb25TZWNvbmRDYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vbkNhbGwoMSk7XG4gICAgfSxcblxuICAgIG9uVGhpcmRDYWxsOiBmdW5jdGlvbiBvblRoaXJkQ2FsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25DYWxsKDIpO1xuICAgIH1cbn07XG5cbmZvckVhY2goT2JqZWN0LmtleXMoYmVoYXZpb3IpLCBmdW5jdGlvbihtZXRob2QpIHtcbiAgICBpZiAoXG4gICAgICAgIGhhc093blByb3BlcnR5KGJlaGF2aW9yLCBtZXRob2QpICYmXG4gICAgICAgICFoYXNPd25Qcm9wZXJ0eShwcm90bywgbWV0aG9kKSAmJlxuICAgICAgICBtZXRob2QgIT09IFwiY3JlYXRlXCIgJiZcbiAgICAgICAgbWV0aG9kICE9PSBcIndpdGhBcmdzXCIgJiZcbiAgICAgICAgbWV0aG9kICE9PSBcImludm9rZVwiXG4gICAgKSB7XG4gICAgICAgIHByb3RvW21ldGhvZF0gPSBiZWhhdmlvci5jcmVhdGVCZWhhdmlvcihtZXRob2QpO1xuICAgIH1cbn0pO1xuXG5mb3JFYWNoKE9iamVjdC5rZXlzKGJlaGF2aW9ycyksIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShiZWhhdmlvcnMsIG1ldGhvZCkgJiYgIWhhc093blByb3BlcnR5KHByb3RvLCBtZXRob2QpKSB7XG4gICAgICAgIGJlaGF2aW9yLmFkZEJlaGF2aW9yKHN0dWIsIG1ldGhvZCwgYmVoYXZpb3JzW21ldGhvZF0pO1xuICAgIH1cbn0pO1xuXG5leHRlbmQoc3R1YiwgcHJvdG8pO1xubW9kdWxlLmV4cG9ydHMgPSBzdHViO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHRocm93T25GYWxzeU9iamVjdChvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgaWYgKHByb3BlcnR5ICYmICFvYmplY3QpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QgPT09IG51bGwgPyBcIm51bGxcIiA6IFwidW5kZWZpbmVkXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzdHViIHByb3BlcnR5ICdcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpICsgXCInIG9mIFwiICsgdHlwZSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm93T25GYWxzeU9iamVjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbmplY3RJbnRvOiBudWxsLFxuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgXCJzcHlcIixcbiAgICAgICAgXCJzdHViXCIsXG4gICAgICAgIFwibW9ja1wiLFxuICAgICAgICBcImNsb2NrXCIsXG4gICAgICAgIFwic2VydmVyXCIsXG4gICAgICAgIFwicmVxdWVzdHNcIixcbiAgICAgICAgXCJmYWtlXCIsXG4gICAgICAgIFwicmVwbGFjZVwiLFxuICAgICAgICBcInJlcGxhY2VTZXR0ZXJcIixcbiAgICAgICAgXCJyZXBsYWNlR2V0dGVyXCIsXG4gICAgICAgIFwiY3JlYXRlU3R1Ykluc3RhbmNlXCJcbiAgICBdLFxuICAgIHVzZUZha2VUaW1lcnM6IHRydWUsXG4gICAgdXNlRmFrZVNlcnZlcjogdHJ1ZVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyYXlQcm90byA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMuYXJyYXk7XG52YXIgcmVkdWNlID0gYXJyYXlQcm90by5yZWR1Y2U7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXhwb3J0QXN5bmNCZWhhdmlvcnMoYmVoYXZpb3JNZXRob2RzKSB7XG4gICAgcmV0dXJuIHJlZHVjZShcbiAgICAgICAgT2JqZWN0LmtleXMoYmVoYXZpb3JNZXRob2RzKSxcbiAgICAgICAgZnVuY3Rpb24oYWNjLCBtZXRob2QpIHtcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gYXZvaWQgY3JlYXRpbmcgYW5vdGhlciBhc3luYyB2ZXJzaW9ucyBvZiB0aGUgbmV3bHkgYWRkZWQgYXN5bmMgbWV0aG9kc1xuICAgICAgICAgICAgaWYgKG1ldGhvZC5tYXRjaCgvXihjYWxsc0FyZ3x5aWVsZHMpLykgJiYgIW1ldGhvZC5tYXRjaCgvQXN5bmMvKSkge1xuICAgICAgICAgICAgICAgIGFjY1ttZXRob2QgKyBcIkFzeW5jXCJdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBiZWhhdmlvck1ldGhvZHNbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrQXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnByb3RvdHlwZXMub2JqZWN0Lmhhc093blByb3BlcnR5O1xuXG52YXIgam9pbiA9IGFycmF5UHJvdG8uam9pbjtcbnZhciBwdXNoID0gYXJyYXlQcm90by5wdXNoO1xudmFyIHNsaWNlID0gYXJyYXlQcm90by5zbGljZTtcblxuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvRUNNQVNjcmlwdF9Eb250RW51bV9hdHRyaWJ1dGUjSlNjcmlwdF9Eb250RW51bV9CdWdcbnZhciBoYXNEb250RW51bUJ1ZyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIwXCI7XG4gICAgICAgIH0sXG4gICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjFcIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWVPZjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIyXCI7XG4gICAgICAgIH0sXG4gICAgICAgIHRvTG9jYWxlU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjNcIjtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdG90eXBlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjRcIjtcbiAgICAgICAgfSxcbiAgICAgICAgaXNQcm90b3R5cGVPZjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI1XCI7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjZcIjtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzT3duUHJvcGVydHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiN1wiO1xuICAgICAgICB9LFxuICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiOFwiO1xuICAgICAgICB9LFxuICAgICAgICB1bmlxdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiOVwiO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSkge1xuICAgICAgICAgICAgcHVzaChyZXN1bHQsIG9ialtwcm9wXSgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gam9pbihyZXN1bHQsIFwiXCIpICE9PSBcIjAxMjM0NTY3ODlcIjtcbn0pKCk7XG5cbmZ1bmN0aW9uIGV4dGVuZENvbW1vbih0YXJnZXQsIHNvdXJjZXMsIGRvQ29weSkge1xuICAgIHZhciBzb3VyY2UsIGksIHByb3A7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzb3VyY2UgPSBzb3VyY2VzW2ldO1xuXG4gICAgICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShzb3VyY2UsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgZG9Db3B5KHRhcmdldCwgc291cmNlLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjb3B5IChvd24pIHRvU3RyaW5nIG1ldGhvZCBldmVuIHdoZW4gaW4gSlNjcmlwdCB3aXRoIERvbnRFbnVtIGJ1Z1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9FQ01BU2NyaXB0X0RvbnRFbnVtX2F0dHJpYnV0ZSNKU2NyaXB0X0RvbnRFbnVtX0J1Z1xuICAgICAgICBpZiAoaGFzRG9udEVudW1CdWcgJiYgaGFzT3duUHJvcGVydHkoc291cmNlLCBcInRvU3RyaW5nXCIpICYmIHNvdXJjZS50b1N0cmluZyAhPT0gdGFyZ2V0LnRvU3RyaW5nKSB7XG4gICAgICAgICAgICB0YXJnZXQudG9TdHJpbmcgPSBzb3VyY2UudG9TdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogUHVibGljOiBFeHRlbmQgdGFyZ2V0IGluIHBsYWNlIHdpdGggYWxsIChvd24pIHByb3BlcnRpZXMgZnJvbSBzb3VyY2VzIGluLW9yZGVyLiBUaHVzLCBsYXN0IHNvdXJjZSB3aWxsXG4gKiAgICAgICAgIG92ZXJyaWRlIHByb3BlcnRpZXMgaW4gcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiBAYXJnIHtPYmplY3R9IHRhcmdldCAtIFRoZSBPYmplY3QgdG8gZXh0ZW5kXG4gKiBAYXJnIHtPYmplY3RbXX0gc291cmNlcyAtIE9iamVjdHMgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gKlxuICogQHJldHVybnMge09iamVjdH0gdGhlIGV4dGVuZGVkIHRhcmdldFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQgLyosIHNvdXJjZXMgKi8pIHtcbiAgICB2YXIgc291cmNlcyA9IHNsaWNlKGFyZ3VtZW50cywgMSk7XG5cbiAgICByZXR1cm4gZXh0ZW5kQ29tbW9uKHRhcmdldCwgc291cmNlcywgZnVuY3Rpb24gY29weVZhbHVlKGRlc3QsIHNvdXJjZSwgcHJvcCkge1xuICAgICAgICBkZXN0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgIH0pO1xufTtcblxuLyoqIFB1YmxpYzogRXh0ZW5kIHRhcmdldCBpbiBwbGFjZSB3aXRoIGFsbCAob3duKSBwcm9wZXJ0aWVzIGZyb20gc291cmNlcyBpbi1vcmRlci4gVGh1cywgbGFzdCBzb3VyY2Ugd2lsbFxuICogICAgICAgICBvdmVycmlkZSBwcm9wZXJ0aWVzIGluIHByZXZpb3VzIHNvdXJjZXMuIERlZmluZSB0aGUgcHJvcGVydGllcyBhcyBub24gZW51bWVyYWJsZS5cbiAqXG4gKiBAYXJnIHtPYmplY3R9IHRhcmdldCAtIFRoZSBPYmplY3QgdG8gZXh0ZW5kXG4gKiBAYXJnIHtPYmplY3RbXX0gc291cmNlcyAtIE9iamVjdHMgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gKlxuICogQHJldHVybnMge09iamVjdH0gdGhlIGV4dGVuZGVkIHRhcmdldFxuICovXG5tb2R1bGUuZXhwb3J0cy5ub25FbnVtID0gZnVuY3Rpb24gZXh0ZW5kTm9uRW51bSh0YXJnZXQgLyosIHNvdXJjZXMgKi8pIHtcbiAgICB2YXIgc291cmNlcyA9IHNsaWNlKGFyZ3VtZW50cywgMSk7XG5cbiAgICByZXR1cm4gZXh0ZW5kQ29tbW9uKHRhcmdldCwgc291cmNlcywgZnVuY3Rpb24gY29weVByb3BlcnR5KGRlc3QsIHNvdXJjZSwgcHJvcCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzdCwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IHNvdXJjZVtwcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBmb3JtYXRpbyA9IHJlcXVpcmUoXCJAc2lub25qcy9mb3JtYXRpb1wiKTtcblxudmFyIGZvcm1hdHRlciA9IGZvcm1hdGlvLmNvbmZpZ3VyZSh7XG4gICAgcXVvdGVTdHJpbmdzOiBmYWxzZSxcbiAgICBsaW1pdENoaWxkcmVuQ291bnQ6IDI1MFxufSk7XG5cbnZhciBjdXN0b21Gb3JtYXR0ZXI7XG5cbmZ1bmN0aW9uIGZvcm1hdCgpIHtcbiAgICBpZiAoY3VzdG9tRm9ybWF0dGVyKSB7XG4gICAgICAgIHJldHVybiBjdXN0b21Gb3JtYXR0ZXIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVyLmFzY2lpLmFwcGx5KGZvcm1hdHRlciwgYXJndW1lbnRzKTtcbn1cblxuZm9ybWF0LnNldEZvcm1hdHRlciA9IGZ1bmN0aW9uKGFDdXN0b21Gb3JtYXR0ZXIpIHtcbiAgICBpZiAodHlwZW9mIGFDdXN0b21Gb3JtYXR0ZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtYXQuc2V0Rm9ybWF0dGVyIG11c3QgYmUgY2FsbGVkIHdpdGggYSBmdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICBjdXN0b21Gb3JtYXR0ZXIgPSBhQ3VzdG9tRm9ybWF0dGVyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JtYXQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgaSwgcHJvcCwgdGhpc1ZhbHVlO1xuICAgIGlmICh0aGlzLmdldENhbGwgJiYgdGhpcy5jYWxsQ291bnQpIHtcbiAgICAgICAgaSA9IHRoaXMuY2FsbENvdW50O1xuXG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIHRoaXNWYWx1ZSA9IHRoaXMuZ2V0Q2FsbChpKS50aGlzVmFsdWU7XG5cbiAgICAgICAgICAgIGZvciAocHJvcCBpbiB0aGlzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1ZhbHVlW3Byb3BdID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lIHx8IFwic2lub24gZmFrZVwiO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCA6IG5vdCB0ZXN0aW5nIHRoYXQgc2V0VGltZW91dCB3b3JrcyAqL1xuZnVuY3Rpb24gbmV4dFRpY2soY2FsbGJhY2spIHtcbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXROZXh0VGljayhwcm9jZXNzLCBzZXRJbW1lZGlhdGUpIHtcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHByb2Nlc3MubmV4dFRpY2sgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljaztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRUaWNrO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgdmFyIHByb3RvID0gb2JqZWN0O1xuICAgIHZhciBkZXNjcmlwdG9yO1xuXG4gICAgd2hpbGUgKHByb3RvICYmICEoZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3BlcnR5KSkpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBWZXJpZnkgaWYgYW4gb2JqZWN0IGlzIGEgRUNNQVNjcmlwdCBNb2R1bGVcbiAqXG4gKiBBcyB0aGUgZXhwb3J0cyBmcm9tIGEgbW9kdWxlIGlzIGltbXV0YWJsZSB3ZSBjYW5ub3QgYWx0ZXIgdGhlIGV4cG9ydHNcbiAqIHVzaW5nIHNwaWVzIG9yIHN0dWJzLiBMZXQgdGhlIGNvbnN1bWVyIGtub3cgdGhpcyB0byBhdm9pZCBidWcgcmVwb3J0c1xuICogb24gd2VpcmQgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGV4YW1pbmVcbiAqXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSB3aGVuIHRoZSBvYmplY3QgaXMgYSBtb2R1bGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3QgJiYgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gXCJNb2R1bGVcIiAmJiBPYmplY3QuaXNTZWFsZWQob2JqZWN0KVxuICAgICk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIGlzTm9uRXhpc3RlbnRPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIG9iamVjdCAmJiB0eXBlb2YgcHJvcGVydHkgIT09IFwidW5kZWZpbmVkXCIgJiYgIShwcm9wZXJ0eSBpbiBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTm9uRXhpc3RlbnRPd25Qcm9wZXJ0eTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG5cbmZ1bmN0aW9uIGlzUHJvcGVydHlDb25maWd1cmFibGUob2JqLCBwcm9wTmFtZSkge1xuICAgIHZhciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wTmFtZSk7XG5cbiAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yID8gcHJvcGVydHlEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA6IHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm9wZXJ0eUNvbmZpZ3VyYWJsZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2V0TmV4dFRpY2sgPSByZXF1aXJlKFwiLi9nZXQtbmV4dC10aWNrXCIpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIHJvb3QgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5leHRUaWNrKHJvb3QucHJvY2Vzcywgcm9vdC5zZXRJbW1lZGlhdGUpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheSA9IFtudWxsLCBcIm9uY2VcIiwgXCJ0d2ljZVwiLCBcInRocmljZVwiXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0aW1lc0luV29yZHMoY291bnQpIHtcbiAgICByZXR1cm4gYXJyYXlbY291bnRdIHx8IChjb3VudCB8fCAwKSArIFwiIHRpbWVzXCI7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBmb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2g7XG5cbmZ1bmN0aW9uIHVzZVByb21pc2VMaWJyYXJ5KGxpYnJhcnksIGZha2VzKSB7XG4gICAgaWYgKHR5cGVvZiBsaWJyYXJ5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmYWtlcykpIHtcbiAgICAgICAgZm9yRWFjaC5jYWxsKGZha2VzLCB1c2VQcm9taXNlTGlicmFyeS5iaW5kKG51bGwsIGxpYnJhcnkpKTtcblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmYWtlcy51c2luZ1Byb21pc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBmYWtlcy51c2luZ1Byb21pc2UobGlicmFyeSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVzZVByb21pc2VMaWJyYXJ5O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBmb3JFYWNoID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheS5mb3JFYWNoO1xuXG5mdW5jdGlvbiB3YWxrSW50ZXJuYWwob2JqLCBpdGVyYXRvciwgY29udGV4dCwgb3JpZ2luYWxPYmosIHNlZW4pIHtcbiAgICB2YXIgcHJvdG8sIHByb3A7XG5cbiAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGVudW1lcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcHJvdG90eXBlJ3MgcHJvcGVydGllc1xuICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHRoZXJlZm9yZSB3ZSBkZWxpYmVyYXRlbHkgbGVhdmUgb3V0IGFuIG93biBwcm9wZXJ0eSBjaGVjay5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pbiAqL1xuICAgICAgICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtwcm9wXSwgcHJvcCwgb2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3JFYWNoKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgICAgaWYgKHNlZW5ba10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIHNlZW5ba10gPSB0cnVlO1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgaykuZ2V0ID09PSBcImZ1bmN0aW9uXCIgPyBvcmlnaW5hbE9iaiA6IG9iajtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgaywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICBpZiAocHJvdG8pIHtcbiAgICAgICAgd2Fsa0ludGVybmFsKHByb3RvLCBpdGVyYXRvciwgY29udGV4dCwgb3JpZ2luYWxPYmosIHNlZW4pO1xuICAgIH1cbn1cblxuLyogV2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgYW5kIGl0ZXJhdGVzIG92ZXIgZXZlcnkgb3duIHByb3BlcnR5XG4gKiBuYW1lIGVuY291bnRlcmVkLiBUaGUgaXRlcmF0b3IgaXMgY2FsbGVkIGluIHRoZSBzYW1lIGZhc2hpb24gdGhhdCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICogd29ya3MsIHdoZXJlIGl0IGlzIHBhc3NlZCB0aGUgdmFsdWUsIGtleSwgYW5kIG93biBvYmplY3QgYXMgdGhlIDFzdCwgMm5kLCBhbmQgM3JkIHBvc2l0aW9uYWxcbiAqIGFyZ3VtZW50LCByZXNwZWN0aXZlbHkuIEluIGNhc2VzIHdoZXJlIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIGlzIG5vdCBhdmFpbGFibGUsIHdhbGsgd2lsbFxuICogZGVmYXVsdCB0byB1c2luZyBhIHNpbXBsZSBmb3IuLmluIGxvb3AuXG4gKlxuICogb2JqIC0gVGhlIG9iamVjdCB0byB3YWxrIHRoZSBwcm90b3R5cGUgY2hhaW4gZm9yLlxuICogaXRlcmF0b3IgLSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggcGFzcyBvZiB0aGUgd2Fsay5cbiAqIGNvbnRleHQgLSAoT3B0aW9uYWwpIFdoZW4gZ2l2ZW4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoaXMgb2JqZWN0IGFzIHRoZSByZWNlaXZlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3YWxrKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gd2Fsa0ludGVybmFsKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQsIG9iaiwge30pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZ2V0UHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4vZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcIi4vZXh0ZW5kXCIpO1xudmFyIGhhc093blByb3BlcnR5ID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5vYmplY3QuaGFzT3duUHJvcGVydHk7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiB8fCBCb29sZWFuKG9iaiAmJiBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNhbGwgJiYgb2JqLmFwcGx5KTtcbn1cblxuZnVuY3Rpb24gbWlycm9yUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkodGFyZ2V0LCBwcm9wKSkge1xuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBDaGVhcCB3YXkgdG8gZGV0ZWN0IGlmIHdlIGhhdmUgRVM1IHN1cHBvcnQuXG52YXIgaGFzRVM1U3VwcG9ydCA9IFwia2V5c1wiIGluIE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3cmFwTWV0aG9kKG9iamVjdCwgcHJvcGVydHksIG1ldGhvZCkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTaG91bGQgd3JhcCBwcm9wZXJ0eSBvZiBvYmplY3RcIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgbWV0aG9kICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXRob2Qgd3JhcHBlciBzaG91bGQgYmUgYSBmdW5jdGlvbiBvciBhIHByb3BlcnR5IGRlc2NyaXB0b3JcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXcmFwcGVkTWV0aG9kKHdyYXBwZWRNZXRob2QpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuXG4gICAgICAgIGlmICghaXNGdW5jdGlvbih3cmFwcGVkTWV0aG9kKSkge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiQXR0ZW1wdGVkIHRvIHdyYXAgXCIgKyB0eXBlb2Ygd3JhcHBlZE1ldGhvZCArIFwiIHByb3BlcnR5IFwiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkgKyBcIiBhcyBmdW5jdGlvblwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHdyYXBwZWRNZXRob2QucmVzdG9yZSAmJiB3cmFwcGVkTWV0aG9kLnJlc3RvcmUuc2lub24pIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcIkF0dGVtcHRlZCB0byB3cmFwIFwiICsgdmFsdWVUb1N0cmluZyhwcm9wZXJ0eSkgKyBcIiB3aGljaCBpcyBhbHJlYWR5IHdyYXBwZWRcIik7XG4gICAgICAgIH0gZWxzZSBpZiAod3JhcHBlZE1ldGhvZC5jYWxsZWRCZWZvcmUpIHtcbiAgICAgICAgICAgIHZhciB2ZXJiID0gd3JhcHBlZE1ldGhvZC5yZXR1cm5zID8gXCJzdHViYmVkXCIgOiBcInNwaWVkIG9uXCI7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBUeXBlRXJyb3IoXCJBdHRlbXB0ZWQgdG8gd3JhcCBcIiArIHZhbHVlVG9TdHJpbmcocHJvcGVydHkpICsgXCIgd2hpY2ggaXMgYWxyZWFkeSBcIiArIHZlcmIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAod3JhcHBlZE1ldGhvZCAmJiB3cmFwcGVkTWV0aG9kLnN0YWNrVHJhY2VFcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yLnN0YWNrICs9IFwiXFxuLS0tLS0tLS0tLS0tLS1cXG5cIiArIHdyYXBwZWRNZXRob2Quc3RhY2tUcmFjZUVycm9yLnN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZXJyb3IsIHdyYXBwZWRNZXRob2QsIGksIHdyYXBwZWRNZXRob2REZXNjO1xuXG4gICAgZnVuY3Rpb24gc2ltcGxlUHJvcGVydHlBc3NpZ25tZW50KCkge1xuICAgICAgICB3cmFwcGVkTWV0aG9kID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgY2hlY2tXcmFwcGVkTWV0aG9kKHdyYXBwZWRNZXRob2QpO1xuICAgICAgICBvYmplY3RbcHJvcGVydHldID0gbWV0aG9kO1xuICAgICAgICBtZXRob2QuZGlzcGxheU5hbWUgPSBwcm9wZXJ0eTtcbiAgICB9XG5cbiAgICAvLyBGaXJlZm94IGhhcyBhIHByb2JsZW0gd2hlbiB1c2luZyBoYXNPd24uY2FsbCBvbiBvYmplY3RzIGZyb20gb3RoZXIgZnJhbWVzLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBsb2NhbC1ydWxlcy9uby1wcm90b3R5cGUtbWV0aG9kcyAqL1xuICAgIHZhciBvd25lZCA9IG9iamVjdC5oYXNPd25Qcm9wZXJ0eSA/IG9iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkgOiBoYXNPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTtcblxuICAgIGlmIChoYXNFUzVTdXBwb3J0KSB7XG4gICAgICAgIHZhciBtZXRob2REZXNjID0gdHlwZW9mIG1ldGhvZCA9PT0gXCJmdW5jdGlvblwiID8geyB2YWx1ZTogbWV0aG9kIH0gOiBtZXRob2Q7XG4gICAgICAgIHdyYXBwZWRNZXRob2REZXNjID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmICghd3JhcHBlZE1ldGhvZERlc2MpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICBcIkF0dGVtcHRlZCB0byB3cmFwIFwiICsgdHlwZW9mIHdyYXBwZWRNZXRob2QgKyBcIiBwcm9wZXJ0eSBcIiArIHByb3BlcnR5ICsgXCIgYXMgZnVuY3Rpb25cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh3cmFwcGVkTWV0aG9kRGVzYy5yZXN0b3JlICYmIHdyYXBwZWRNZXRob2REZXNjLnJlc3RvcmUuc2lub24pIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihcIkF0dGVtcHRlZCB0byB3cmFwIFwiICsgcHJvcGVydHkgKyBcIiB3aGljaCBpcyBhbHJlYWR5IHdyYXBwZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAod3JhcHBlZE1ldGhvZERlc2MgJiYgd3JhcHBlZE1ldGhvZERlc2Muc3RhY2tUcmFjZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3Iuc3RhY2sgKz0gXCJcXG4tLS0tLS0tLS0tLS0tLVxcblwiICsgd3JhcHBlZE1ldGhvZERlc2Muc3RhY2tUcmFjZUVycm9yLnN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdHlwZXMgPSBPYmplY3Qua2V5cyhtZXRob2REZXNjKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB3cmFwcGVkTWV0aG9kID0gd3JhcHBlZE1ldGhvZERlc2NbdHlwZXNbaV1dO1xuICAgICAgICAgICAgY2hlY2tXcmFwcGVkTWV0aG9kKHdyYXBwZWRNZXRob2QpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWlycm9yUHJvcGVydGllcyhtZXRob2REZXNjLCB3cmFwcGVkTWV0aG9kRGVzYyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbWlycm9yUHJvcGVydGllcyhtZXRob2REZXNjW3R5cGVzW2ldXSwgd3JhcHBlZE1ldGhvZERlc2NbdHlwZXNbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgbWV0aG9kRGVzYyk7XG5cbiAgICAgICAgLy8gY2F0Y2ggZmFpbGluZyBhc3NpZ25tZW50XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGNvbnZlcnNlIG9mIHRoZSBjaGVjayBpbiBgLnJlc3RvcmVgIGJlbG93XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqZWN0W3Byb3BlcnR5XSAhPT0gbWV0aG9kKSB7XG4gICAgICAgICAgICAvLyBjb3JyZWN0IGFueSB3cm9uZ2RvaW5ncyBjYXVzZWQgYnkgdGhlIGRlZmluZVByb3BlcnR5IGNhbGwgYWJvdmUsXG4gICAgICAgICAgICAvLyBzdWNoIGFzIGFkZGluZyBuZXcgaXRlbXMgKGlmIG9iamVjdCB3YXMgYSBTdG9yYWdlIG9iamVjdClcbiAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgc2ltcGxlUHJvcGVydHlBc3NpZ25tZW50KCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBzaW1wbGVQcm9wZXJ0eUFzc2lnbm1lbnQoKTtcbiAgICB9XG5cbiAgICBleHRlbmQubm9uRW51bShtZXRob2QsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IHByb3BlcnR5LFxuXG4gICAgICAgIC8vIFNldCB1cCBhbiBFcnJvciBvYmplY3QgZm9yIGEgc3RhY2sgdHJhY2Ugd2hpY2ggY2FuIGJlIHVzZWQgbGF0ZXIgdG8gZmluZCB3aGF0IGxpbmUgb2ZcbiAgICAgICAgLy8gY29kZSB0aGUgb3JpZ2luYWwgbWV0aG9kIHdhcyBjcmVhdGVkIG9uLlxuICAgICAgICBzdGFja1RyYWNlRXJyb3I6IG5ldyBFcnJvcihcIlN0YWNrIFRyYWNlIGZvciBvcmlnaW5hbFwiKSxcblxuICAgICAgICByZXN0b3JlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIEZvciBwcm90b3R5cGUgcHJvcGVydGllcyB0cnkgdG8gcmVzZXQgYnkgZGVsZXRlIGZpcnN0LlxuICAgICAgICAgICAgLy8gSWYgdGhpcyBmYWlscyAoZXg6IGxvY2FsU3RvcmFnZSBvbiBtb2JpbGUgc2FmYXJpKSB0aGVuIGZvcmNlIGEgcmVzZXRcbiAgICAgICAgICAgIC8vIHZpYSBkaXJlY3QgYXNzaWdubWVudC5cbiAgICAgICAgICAgIGlmICghb3duZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBzb21lIGNhc2VzIGBkZWxldGVgIG1heSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICAgICAgICAvLyBGb3IgbmF0aXZlIGNvZGUgZnVuY3Rpb25zIGBkZWxldGVgIGZhaWxzIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAvLyBvbiBDaHJvbWUgPCA0MywgUGhhbnRvbUpTLCBldGMuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0VTNVN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgd3JhcHBlZE1ldGhvZERlc2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzRVM1U3VwcG9ydCkge1xuICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWUgPT09IG1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gd3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbiB0byBjaGVjayBmYWlsdXJlcyB0aGVuIGZvcmNlIGEgcmVzZXRcbiAgICAgICAgICAgICAgICAvLyB2aWEgZGlyZWN0IGFzc2lnbm1lbnQuXG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdFtwcm9wZXJ0eV0gPT09IG1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gd3JhcHBlZE1ldGhvZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG1ldGhvZC53cmFwcGVkTWV0aG9kID0gd3JhcHBlZE1ldGhvZDtcblxuICAgIG1ldGhvZC5yZXN0b3JlLnNpbm9uID0gdHJ1ZTtcblxuICAgIGlmICghaGFzRVM1U3VwcG9ydCkge1xuICAgICAgICBtaXJyb3JQcm9wZXJ0aWVzKG1ldGhvZCwgd3JhcHBlZE1ldGhvZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGhvZDtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCIuL2NvcmUvZXh0ZW5kXCIpO1xudmFyIGxseCA9IHJlcXVpcmUoXCJsb2xleFwiKTtcblxuZnVuY3Rpb24gY3JlYXRlQ2xvY2soY29uZmlnLCBnbG9iYWxDdHgpIHtcbiAgICB2YXIgbGx4Q3R4ID0gbGx4O1xuICAgIGlmIChnbG9iYWxDdHggIT09IG51bGwgJiYgdHlwZW9mIGdsb2JhbEN0eCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBsbHhDdHggPSBsbHgud2l0aEdsb2JhbChnbG9iYWxDdHgpO1xuICAgIH1cbiAgICB2YXIgY2xvY2sgPSBsbHhDdHguaW5zdGFsbChjb25maWcpO1xuICAgIGNsb2NrLnJlc3RvcmUgPSBjbG9jay51bmluc3RhbGw7XG4gICAgcmV0dXJuIGNsb2NrO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfERhdGV8T2JqZWN0fSBkYXRlT3JDb25maWcgVGhlIHVuaXggZXBvY2ggdmFsdWUgdG8gaW5zdGFsbCB3aXRoIChkZWZhdWx0IDApXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGEgbG9sZXggY2xvY2sgaW5zdGFuY2VcbiAqL1xuZXhwb3J0cy51c2VGYWtlVGltZXJzID0gZnVuY3Rpb24oZGF0ZU9yQ29uZmlnKSB7XG4gICAgdmFyIGhhc0FyZ3VtZW50cyA9IHR5cGVvZiBkYXRlT3JDb25maWcgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGFyZ3VtZW50SXNEYXRlTGlrZSA9XG4gICAgICAgICh0eXBlb2YgZGF0ZU9yQ29uZmlnID09PSBcIm51bWJlclwiIHx8IGRhdGVPckNvbmZpZyBpbnN0YW5jZW9mIERhdGUpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDE7XG4gICAgdmFyIGFyZ3VtZW50SXNPYmplY3QgPSBkYXRlT3JDb25maWcgIT09IG51bGwgJiYgdHlwZW9mIGRhdGVPckNvbmZpZyA9PT0gXCJvYmplY3RcIiAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAxO1xuXG4gICAgaWYgKCFoYXNBcmd1bWVudHMpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNsb2NrKHtcbiAgICAgICAgICAgIG5vdzogMFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRJc0RhdGVMaWtlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVDbG9jayh7XG4gICAgICAgICAgICBub3c6IGRhdGVPckNvbmZpZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRJc09iamVjdCkge1xuICAgICAgICB2YXIgY29uZmlnID0gZXh0ZW5kLm5vbkVudW0oe30sIGRhdGVPckNvbmZpZyk7XG4gICAgICAgIHZhciBnbG9iYWxDdHggPSBjb25maWcuZ2xvYmFsO1xuICAgICAgICBkZWxldGUgY29uZmlnLmdsb2JhbDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNsb2NrKGNvbmZpZywgZ2xvYmFsQ3R4KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidXNlRmFrZVRpbWVycyBleHBlY3RlZCBlcG9jaCBvciBjb25maWcgb2JqZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Npbm9uanMvc2lub25cIik7XG59O1xuXG5leHBvcnRzLmNsb2NrID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24obm93KSB7XG4gICAgICAgIHJldHVybiBsbHguY3JlYXRlQ2xvY2sobm93KTtcbiAgICB9XG59O1xuXG5leHBvcnRzLnRpbWVycyA9IHtcbiAgICBzZXRUaW1lb3V0OiBzZXRUaW1lb3V0LFxuICAgIGNsZWFyVGltZW91dDogY2xlYXJUaW1lb3V0LFxuICAgIHNldEltbWVkaWF0ZTogdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IHNldEltbWVkaWF0ZSA6IHVuZGVmaW5lZCxcbiAgICBjbGVhckltbWVkaWF0ZTogdHlwZW9mIGNsZWFySW1tZWRpYXRlICE9PSBcInVuZGVmaW5lZFwiID8gY2xlYXJJbW1lZGlhdGUgOiB1bmRlZmluZWQsXG4gICAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsLFxuICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgRGF0ZTogRGF0ZVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZXZlcnkgPSByZXF1aXJlKFwiLi9wcm90b3R5cGVzL2FycmF5XCIpLmV2ZXJ5O1xuXG5mdW5jdGlvbiBoYXNDYWxsc0xlZnQoY2FsbE1hcCwgc3B5KSB7XG4gICAgaWYgKGNhbGxNYXBbc3B5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbGxNYXBbc3B5LmlkXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbGxNYXBbc3B5LmlkXSA8IHNweS5jYWxsQ291bnQ7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQWRqYWNlbnRDYWxscyhjYWxsTWFwLCBzcHksIGluZGV4LCBzcGllcykge1xuICAgIHZhciBjYWxsZWRCZWZvcmVOZXh0ID0gdHJ1ZTtcblxuICAgIGlmIChpbmRleCAhPT0gc3BpZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjYWxsZWRCZWZvcmVOZXh0ID0gc3B5LmNhbGxlZEJlZm9yZShzcGllc1tpbmRleCArIDFdKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzQ2FsbHNMZWZ0KGNhbGxNYXAsIHNweSkgJiYgY2FsbGVkQmVmb3JlTmV4dCkge1xuICAgICAgICBjYWxsTWFwW3NweS5pZF0gKz0gMTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxlZEluT3JkZXIoc3BpZXMpIHtcbiAgICB2YXIgY2FsbE1hcCA9IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICAgIHZhciBfc3BpZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50cyA6IHNwaWVzO1xuXG4gICAgcmV0dXJuIGV2ZXJ5KF9zcGllcywgY2hlY2tBZGphY2VudENhbGxzLmJpbmQobnVsbCwgY2FsbE1hcCkpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZnVuY3Rpb25OYW1lID0gcmVxdWlyZShcIi4vZnVuY3Rpb24tbmFtZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjbGFzc05hbWUodmFsdWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IubmFtZSkgfHxcbiAgICAgICAgLy8gVGhlIG5leHQgYnJhbmNoIGlzIGZvciBJRTExIHN1cHBvcnQgb25seTpcbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgbmFtZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9uIHRoZSBwcm90b3R5cGVcbiAgICAgICAgLy8gb2YgdGhlIEZ1bmN0aW9uIG9iamVjdCwgd2UgZmluYWxseSB0cnkgdG8gZ3JhYiB0aGVcbiAgICAgICAgLy8gbmFtZSBmcm9tIGl0cyBkZWZpbml0aW9uLiBUaGlzIHdpbGwgbmV2ZXIgYmUgcmVhY2hlZFxuICAgICAgICAvLyBpbiBub2RlLCBzbyB3ZSBhcmUgbm90IGFibGUgdG8gdGVzdCB0aGlzIHByb3Blcmx5LlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9uYW1lXG4gICAgICAgICh0eXBlb2YgdmFsdWUuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSh2YWx1ZS5jb25zdHJ1Y3RvcikpIHx8XG4gICAgICAgIG51bGxcbiAgICApO1xufTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblwidXNlIHN0cmljdFwiO1xuXG4vLyB3cmFwIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgaW52b2tlIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBhbmQgcHJpbnQgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHRvIHRoZSBjb25zb2xlIGVhY2hcbi8vIHRpbWUgaXQgaXMgY2FsbGVkLlxuZXhwb3J0cy53cmFwID0gZnVuY3Rpb24oZnVuYywgbXNnKSB7XG4gICAgdmFyIHdyYXBwZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZXhwb3J0cy5wcmludFdhcm5pbmcobXNnKTtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIGlmIChmdW5jLnByb3RvdHlwZSkge1xuICAgICAgICB3cmFwcGVkLnByb3RvdHlwZSA9IGZ1bmMucHJvdG90eXBlO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbi8vIGRlZmF1bHRNc2cgcmV0dXJucyBhIHN0cmluZyB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gYHdyYXAoKWAgdG8gbm90aWZ5IHRoZSB1c2VyIHRoYXQgYSBwYXJ0aWN1bGFyIHBhcnQgb2YgdGhlXG4vLyBzaW5vbiBBUEkgaGFzIGJlZW4gZGVwcmVjYXRlZC5cbmV4cG9ydHMuZGVmYXVsdE1zZyA9IGZ1bmN0aW9uKHBhY2thZ2VOYW1lLCBmdW5jTmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIHBhY2thZ2VOYW1lICtcbiAgICAgICAgXCIuXCIgK1xuICAgICAgICBmdW5jTmFtZSArXG4gICAgICAgIFwiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBwdWJsaWMgQVBJIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgXCIgK1xuICAgICAgICBwYWNrYWdlTmFtZSArXG4gICAgICAgIFwiLlwiXG4gICAgKTtcbn07XG5cbmV4cG9ydHMucHJpbnRXYXJuaW5nID0gZnVuY3Rpb24obXNnKSB7XG4gICAgLy8gV2F0Y2ggb3V0IGZvciBJRTcgYW5kIGJlbG93ISA6KFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmluZm8pIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhtc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBpcyBhbiBgZXZlcnlgIGltcGxlbWVudGF0aW9uIHRoYXQgd29ya3MgZm9yIGFsbCBpdGVyYWJsZXNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXZlcnkob2JqLCBmbikge1xuICAgIHZhciBwYXNzID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBsb2NhbC1ydWxlcy9uby1wcm90b3R5cGUtbWV0aG9kcyAqL1xuICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIFRocm93aW5nIGFuIGVycm9yIGlzIHRoZSBvbmx5IHdheSB0byBicmVhayBgZm9yRWFjaGBcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhc3M7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnVuY3Rpb25OYW1lKGZ1bmMpIHtcbiAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgZnVuYy5kaXNwbGF5TmFtZSB8fFxuICAgICAgICBmdW5jLm5hbWUgfHxcbiAgICAgICAgLy8gVXNlIGZ1bmN0aW9uIGRlY29tcG9zaXRpb24gYXMgYSBsYXN0IHJlc29ydCB0byBnZXQgZnVuY3Rpb25cbiAgICAgICAgLy8gbmFtZS4gRG9lcyBub3QgcmVseSBvbiBmdW5jdGlvbiBkZWNvbXBvc2l0aW9uIHRvIHdvcmsgLSBpZiBpdFxuICAgICAgICAvLyBkb2Vzbid0IGRlYnVnZ2luZyB3aWxsIGJlIHNsaWdodGx5IGxlc3MgaW5mb3JtYXRpdmVcbiAgICAgICAgLy8gKGkuZS4gdG9TdHJpbmcgd2lsbCBzYXkgJ3NweScgcmF0aGVyIHRoYW4gJ215RnVuYycpLlxuICAgICAgICAoU3RyaW5nKGZ1bmMpLm1hdGNoKC9mdW5jdGlvbiAoW15cXHMoXSspLykgfHwgW10pWzFdXG4gICAgKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgY2FsbGVkSW5PcmRlcjogcmVxdWlyZShcIi4vY2FsbGVkLWluLW9yZGVyXCIpLFxuICAgIGNsYXNzTmFtZTogcmVxdWlyZShcIi4vY2xhc3MtbmFtZVwiKSxcbiAgICBkZXByZWNhdGVkOiByZXF1aXJlKFwiLi9kZXByZWNhdGVkXCIpLFxuICAgIGV2ZXJ5OiByZXF1aXJlKFwiLi9ldmVyeVwiKSxcbiAgICBmdW5jdGlvbk5hbWU6IHJlcXVpcmUoXCIuL2Z1bmN0aW9uLW5hbWVcIiksXG4gICAgb3JkZXJCeUZpcnN0Q2FsbDogcmVxdWlyZShcIi4vb3JkZXItYnktZmlyc3QtY2FsbFwiKSxcbiAgICBwcm90b3R5cGVzOiByZXF1aXJlKFwiLi9wcm90b3R5cGVzXCIpLFxuICAgIHR5cGVPZjogcmVxdWlyZShcIi4vdHlwZS1vZlwiKSxcbiAgICB2YWx1ZVRvU3RyaW5nOiByZXF1aXJlKFwiLi92YWx1ZS10by1zdHJpbmdcIilcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHNvcnQgPSByZXF1aXJlKFwiLi9wcm90b3R5cGVzL2FycmF5XCIpLnNvcnQ7XG52YXIgc2xpY2UgPSByZXF1aXJlKFwiLi9wcm90b3R5cGVzL2FycmF5XCIpLnNsaWNlO1xuXG5mdW5jdGlvbiBjb21wYXJhdG9yKGEsIGIpIHtcbiAgICAvLyB1dWlkLCB3b24ndCBldmVyIGJlIGVxdWFsXG4gICAgdmFyIGFDYWxsID0gYS5nZXRDYWxsKDApO1xuICAgIHZhciBiQ2FsbCA9IGIuZ2V0Q2FsbCgwKTtcbiAgICB2YXIgYUlkID0gKGFDYWxsICYmIGFDYWxsLmNhbGxJZCkgfHwgLTE7XG4gICAgdmFyIGJJZCA9IChiQ2FsbCAmJiBiQ2FsbC5jYWxsSWQpIHx8IC0xO1xuXG4gICAgcmV0dXJuIGFJZCA8IGJJZCA/IC0xIDogMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvcmRlckJ5Rmlyc3RDYWxsKHNwaWVzKSB7XG4gICAgcmV0dXJuIHNvcnQoc2xpY2Uoc3BpZXMpLCBjb21wYXJhdG9yKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNvcHlQcm90b3R5cGUgPSByZXF1aXJlKFwiLi9jb3B5LXByb3RvdHlwZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5UHJvdG90eXBlKEFycmF5LnByb3RvdHlwZSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvcHlQcm90b3R5cGVNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIGxvY2FsLXJ1bGVzL25vLXByb3RvdHlwZS1tZXRob2RzICovXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSkucmVkdWNlKGZ1bmN0aW9uKHJlc3VsdCwgbmFtZSkge1xuICAgICAgICAvLyBpZ25vcmUgc2l6ZSBiZWNhdXNlIGl0IHRocm93cyBmcm9tIE1hcFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBuYW1lICE9PSBcInNpemVcIiAmJlxuICAgICAgICAgICAgbmFtZSAhPT0gXCJjYWxsZXJcIiAmJlxuICAgICAgICAgICAgbmFtZSAhPT0gXCJjYWxsZWVcIiAmJlxuICAgICAgICAgICAgbmFtZSAhPT0gXCJhcmd1bWVudHNcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHByb3RvdHlwZVtuYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gY2FsbC5iaW5kKHByb3RvdHlwZVtuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY29weVByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NvcHktcHJvdG90eXBlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlQcm90b3R5cGUoRnVuY3Rpb24ucHJvdG90eXBlKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheTogcmVxdWlyZShcIi4vYXJyYXlcIiksXG4gICAgZnVuY3Rpb246IHJlcXVpcmUoXCIuL2Z1bmN0aW9uXCIpLFxuICAgIG9iamVjdDogcmVxdWlyZShcIi4vb2JqZWN0XCIpLFxuICAgIHN0cmluZzogcmVxdWlyZShcIi4vc3RyaW5nXCIpXG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBjb3B5UHJvdG90eXBlID0gcmVxdWlyZShcIi4vY29weS1wcm90b3R5cGVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVByb3RvdHlwZShPYmplY3QucHJvdG90eXBlKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgY29weVByb3RvdHlwZSA9IHJlcXVpcmUoXCIuL2NvcHktcHJvdG90eXBlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlQcm90b3R5cGUoU3RyaW5nLnByb3RvdHlwZSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHR5cGUgPSByZXF1aXJlKFwidHlwZS1kZXRlY3RcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHlwZU9mKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGUodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIHZhbHVlVG9TdHJpbmcodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUudG9TdHJpbmcpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGxvY2FsLXJ1bGVzL25vLXByb3RvdHlwZS1tZXRob2RzICovXG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWx1ZVRvU3RyaW5nO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzYW1zYW0gPSByZXF1aXJlKFwiQHNpbm9uanMvc2Ftc2FtXCIpO1xudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmZ1bmN0aW9uTmFtZTtcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS50eXBlT2Y7XG5cbnZhciBmb3JtYXRpbyA9IHtcbiAgICBleGNsdWRlQ29uc3RydWN0b3JzOiBbXCJPYmplY3RcIiwgL14uJC9dLFxuICAgIHF1b3RlU3RyaW5nczogdHJ1ZSxcbiAgICBsaW1pdENoaWxkcmVuQ291bnQ6IDBcbn07XG5cbnZhciBzcGVjaWFsT2JqZWN0cyA9IFtdO1xuaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBzcGVjaWFsT2JqZWN0cy5wdXNoKHsgb2JqZWN0OiBnbG9iYWwsIHZhbHVlOiBcIltvYmplY3QgZ2xvYmFsXVwiIH0pO1xufVxuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHNwZWNpYWxPYmplY3RzLnB1c2goe1xuICAgICAgICBvYmplY3Q6IGRvY3VtZW50LFxuICAgICAgICB2YWx1ZTogXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgIH0pO1xufVxuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBzcGVjaWFsT2JqZWN0cy5wdXNoKHsgb2JqZWN0OiB3aW5kb3csIHZhbHVlOiBcIltvYmplY3QgV2luZG93XVwiIH0pO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3Rvck5hbWUoZiwgb2JqZWN0KSB7XG4gICAgdmFyIG5hbWUgPSBmdW5jdGlvbk5hbWUob2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3Rvcik7XG4gICAgdmFyIGV4Y2x1ZGVzID0gZi5leGNsdWRlQ29uc3RydWN0b3JzIHx8XG4gICAgICAgICAgICBmb3JtYXRpby5leGNsdWRlQ29uc3RydWN0b3JzIHx8IFtdO1xuXG4gICAgdmFyIGksIGw7XG4gICAgZm9yIChpID0gMCwgbCA9IGV4Y2x1ZGVzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2x1ZGVzW2ldID09PSBcInN0cmluZ1wiICYmIGV4Y2x1ZGVzW2ldID09PSBuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfSBlbHNlIGlmIChleGNsdWRlc1tpXS50ZXN0ICYmIGV4Y2x1ZGVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWU7XG59XG5cbmZ1bmN0aW9uIGlzQ2lyY3VsYXIob2JqZWN0LCBvYmplY3RzKSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgdmFyIGksIGw7XG4gICAgZm9yIChpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmIChvYmplY3RzW2ldID09PSBvYmplY3QpIHsgcmV0dXJuIHRydWU7IH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhc2NpaShmLCBvYmplY3QsIHByb2Nlc3NlZCwgaW5kZW50KSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKG9iamVjdC5sZW5ndGggPT09IDApIHsgcmV0dXJuIFwiKGVtcHR5IHN0cmluZylcIjsgfVxuICAgICAgICB2YXIgcXMgPSBmLnF1b3RlU3RyaW5ncztcbiAgICAgICAgdmFyIHF1b3RlID0gdHlwZW9mIHFzICE9PSBcImJvb2xlYW5cIiB8fCBxcztcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZCB8fCBxdW90ZSA/IFwiXFxcIlwiICsgb2JqZWN0ICsgXCJcXFwiXCIgOiBvYmplY3Q7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSBcImZ1bmN0aW9uXCIgJiYgIShvYmplY3QgaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgICAgIHJldHVybiBhc2NpaS5mdW5jKG9iamVjdCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc2VkID0gcHJvY2Vzc2VkIHx8IFtdO1xuXG4gICAgaWYgKGlzQ2lyY3VsYXIob2JqZWN0LCBwcm9jZXNzZWQpKSB7IHJldHVybiBcIltDaXJjdWxhcl1cIjsgfVxuXG4gICAgaWYgKHR5cGVPZihvYmplY3QpID09PSBcImFycmF5XCIpIHtcbiAgICAgICAgcmV0dXJuIGFzY2lpLmFycmF5LmNhbGwoZiwgb2JqZWN0LCBwcm9jZXNzZWQpO1xuICAgIH1cblxuICAgIGlmICghb2JqZWN0KSB7IHJldHVybiBTdHJpbmcoKDEgLyBvYmplY3QpID09PSAtSW5maW5pdHkgPyBcIi0wXCIgOiBvYmplY3QpOyB9XG4gICAgaWYgKHNhbXNhbS5pc0VsZW1lbnQob2JqZWN0KSkgeyByZXR1cm4gYXNjaWkuZWxlbWVudChvYmplY3QpOyB9XG5cbiAgICBpZiAodHlwZW9mIG9iamVjdC50b1N0cmluZyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBvYmplY3QudG9TdHJpbmcgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHZhciBpLCBsO1xuICAgIGZvciAoaSA9IDAsIGwgPSBzcGVjaWFsT2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKG9iamVjdCA9PT0gc3BlY2lhbE9iamVjdHNbaV0ub2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gc3BlY2lhbE9iamVjdHNbaV0udmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Ftc2FtLmlzU2V0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGFzY2lpLnNldC5jYWxsKGYsIG9iamVjdCwgcHJvY2Vzc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNjaWkub2JqZWN0LmNhbGwoZiwgb2JqZWN0LCBwcm9jZXNzZWQsIGluZGVudCk7XG59XG5cbmFzY2lpLmZ1bmMgPSBmdW5jdGlvbiAoZnVuYykge1xuICAgIHZhciBmdW5jTmFtZSA9IGZ1bmN0aW9uTmFtZShmdW5jKSB8fCBcIlwiO1xuICAgIHJldHVybiBcImZ1bmN0aW9uIFwiICsgZnVuY05hbWUgKyBcIigpIHt9XCI7XG59O1xuXG5mdW5jdGlvbiBkZWxpbWl0KHN0ciwgZGVsaW1pdGVycykge1xuICAgIGRlbGltaXRlcnMgPSBkZWxpbWl0ZXJzIHx8IFtcIltcIiwgXCJdXCJdO1xuICAgIHJldHVybiBkZWxpbWl0ZXJzWzBdICsgc3RyICsgZGVsaW1pdGVyc1sxXTtcbn1cblxuYXNjaWkuYXJyYXkgPSBmdW5jdGlvbiAoYXJyYXksIHByb2Nlc3NlZCwgZGVsaW1pdGVycykge1xuICAgIHByb2Nlc3NlZCA9IHByb2Nlc3NlZCB8fCBbXTtcbiAgICBwcm9jZXNzZWQucHVzaChhcnJheSk7XG4gICAgdmFyIHBpZWNlcyA9IFtdO1xuICAgIHZhciBpLCBsO1xuICAgIGwgPSAodGhpcy5saW1pdENoaWxkcmVuQ291bnQgPiAwKSA/XG4gICAgICAgIE1hdGgubWluKHRoaXMubGltaXRDaGlsZHJlbkNvdW50LCBhcnJheS5sZW5ndGgpIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgICBwaWVjZXMucHVzaChhc2NpaSh0aGlzLCBhcnJheVtpXSwgcHJvY2Vzc2VkKSk7XG4gICAgfVxuXG4gICAgaWYgKGwgPCBhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgcGllY2VzLnB1c2goXCJbLi4uIFwiICsgKGFycmF5Lmxlbmd0aCAtIGwpICsgXCIgbW9yZSBlbGVtZW50c11cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGltaXQocGllY2VzLmpvaW4oXCIsIFwiKSwgZGVsaW1pdGVycyk7XG59O1xuXG5hc2NpaS5zZXQgPSBmdW5jdGlvbiAoc2V0LCBwcm9jZXNzZWQpIHtcbiAgICByZXR1cm4gYXNjaWkuYXJyYXkuY2FsbCh0aGlzLCBBcnJheS5mcm9tKHNldCksIHByb2Nlc3NlZCwgW1wiU2V0IHtcIiwgXCJ9XCJdKTtcbn07XG5cbmFzY2lpLm9iamVjdCA9IGZ1bmN0aW9uIChvYmplY3QsIHByb2Nlc3NlZCwgaW5kZW50KSB7XG4gICAgcHJvY2Vzc2VkID0gcHJvY2Vzc2VkIHx8IFtdO1xuICAgIHByb2Nlc3NlZC5wdXNoKG9iamVjdCk7XG4gICAgaW5kZW50ID0gaW5kZW50IHx8IDA7XG4gICAgdmFyIHBpZWNlcyA9IFtdO1xuICAgIHZhciBzeW1ib2xzID0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KVxuICAgICAgICA6IFtdO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KCkuY29uY2F0KHN5bWJvbHMpO1xuICAgIHZhciBsZW5ndGggPSAzO1xuICAgIHZhciBwcm9wLCBzdHIsIG9iaiwgaSwgaywgbDtcbiAgICBsID0gKHRoaXMubGltaXRDaGlsZHJlbkNvdW50ID4gMCkgP1xuICAgICAgICBNYXRoLm1pbih0aGlzLmxpbWl0Q2hpbGRyZW5Db3VudCwgcHJvcGVydGllcy5sZW5ndGgpIDogcHJvcGVydGllcy5sZW5ndGg7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICBvYmogPSBvYmplY3RbcHJvcF07XG5cbiAgICAgICAgaWYgKGlzQ2lyY3VsYXIob2JqLCBwcm9jZXNzZWQpKSB7XG4gICAgICAgICAgICBzdHIgPSBcIltDaXJjdWxhcl1cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IGFzY2lpKHRoaXMsIG9iaiwgcHJvY2Vzc2VkLCBpbmRlbnQgKyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciA9IChcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiICYmIC9cXHMvLnRlc3QocHJvcCkgP1xuICAgICAgICAgICAgICAgIFwiXFxcIlwiICsgcHJvcCArIFwiXFxcIlwiIDogcHJvcC50b1N0cmluZygpXG4gICAgICAgICkgKyBcIjogXCIgKyBzdHI7XG4gICAgICAgIGxlbmd0aCArPSBzdHIubGVuZ3RoO1xuICAgICAgICBwaWVjZXMucHVzaChzdHIpO1xuICAgIH1cblxuICAgIHZhciBjb25zID0gY29uc3RydWN0b3JOYW1lKHRoaXMsIG9iamVjdCk7XG4gICAgdmFyIHByZWZpeCA9IGNvbnMgPyBcIltcIiArIGNvbnMgKyBcIl0gXCIgOiBcIlwiO1xuICAgIHZhciBpcyA9IFwiXCI7XG4gICAgZm9yIChpID0gMCwgayA9IGluZGVudDsgaSA8IGs7ICsraSkgeyBpcyArPSBcIiBcIjsgfVxuXG4gICAgaWYgKGwgPCBwcm9wZXJ0aWVzLmxlbmd0aClcbiAgICB7cGllY2VzLnB1c2goXCJbLi4uIFwiICsgKHByb3BlcnRpZXMubGVuZ3RoIC0gbCkgKyBcIiBtb3JlIGVsZW1lbnRzXVwiKTt9XG5cbiAgICBpZiAobGVuZ3RoICsgaW5kZW50ID4gODApIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIFwie1xcbiAgXCIgKyBpcyArIHBpZWNlcy5qb2luKFwiLFxcbiAgXCIgKyBpcykgKyBcIlxcblwiICtcbiAgICAgICAgICAgIGlzICsgXCJ9XCI7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXggKyBcInsgXCIgKyBwaWVjZXMuam9pbihcIiwgXCIpICsgXCIgfVwiO1xufTtcblxuYXNjaWkuZWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgdmFyIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgYXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgdmFyIHBhaXJzID0gW107XG4gICAgdmFyIGF0dHIsIGF0dHJOYW1lLCBpLCBsLCB2YWw7XG5cbiAgICBmb3IgKGkgPSAwLCBsID0gYXR0cnMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGF0dHIgPSBhdHRycy5pdGVtKGkpO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwiaHRtbDpcIiwgXCJcIik7XG4gICAgICAgIHZhbCA9IGF0dHIubm9kZVZhbHVlO1xuICAgICAgICBpZiAoYXR0ck5hbWUgIT09IFwiY29udGVudGVkaXRhYmxlXCIgfHwgdmFsICE9PSBcImluaGVyaXRcIikge1xuICAgICAgICAgICAgaWYgKHZhbCkgeyBwYWlycy5wdXNoKGF0dHJOYW1lICsgXCI9XFxcIlwiICsgdmFsICsgXCJcXFwiXCIpOyB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0dGVkID0gXCI8XCIgKyB0YWdOYW1lICsgKHBhaXJzLmxlbmd0aCA+IDAgPyBcIiBcIiA6IFwiXCIpO1xuICAgIC8vIFNWRyBlbGVtZW50cyBoYXZlIHVuZGVmaW5lZCBpbm5lckhUTUxcbiAgICB2YXIgY29udGVudCA9IGVsZW1lbnQuaW5uZXJIVE1MIHx8IFwiXCI7XG5cbiAgICBpZiAoY29udGVudC5sZW5ndGggPiAyMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHIoMCwgMjApICsgXCJbLi4uXVwiO1xuICAgIH1cblxuICAgIHZhciByZXMgPSBmb3JtYXR0ZWQgKyBwYWlycy5qb2luKFwiIFwiKSArIFwiPlwiICsgY29udGVudCArXG4gICAgICAgICAgICBcIjwvXCIgKyB0YWdOYW1lICsgXCI+XCI7XG5cbiAgICByZXR1cm4gcmVzLnJlcGxhY2UoLyBjb250ZW50RWRpdGFibGU9XCJpbmhlcml0XCIvLCBcIlwiKTtcbn07XG5cbmZ1bmN0aW9uIEZvcm1hdGlvKG9wdGlvbnMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpc1tvcHRdID0gb3B0aW9uc1tvcHRdO1xuICAgIH1cbn1cblxuRm9ybWF0aW8ucHJvdG90eXBlID0ge1xuICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuXG4gICAgY29uZmlndXJlOiBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdGlvKG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBjb25zdHJ1Y3Rvck5hbWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZSh0aGlzLCBvYmplY3QpO1xuICAgIH0sXG5cbiAgICBhc2NpaTogZnVuY3Rpb24gKG9iamVjdCwgcHJvY2Vzc2VkLCBpbmRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGFzY2lpKHRoaXMsIG9iamVjdCwgcHJvY2Vzc2VkLCBpbmRlbnQpO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRm9ybWF0aW8ucHJvdG90eXBlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcblxudmFyIGdldENsYXNzID0gcmVxdWlyZShcIi4vZ2V0LWNsYXNzXCIpO1xudmFyIGlkZW50aWNhbCA9IHJlcXVpcmUoXCIuL2lkZW50aWNhbFwiKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoXCIuL2lzLWFyZ3VtZW50c1wiKTtcbnZhciBpc0RhdGUgPSByZXF1aXJlKFwiLi9pcy1kYXRlXCIpO1xudmFyIGlzRWxlbWVudCA9IHJlcXVpcmUoXCIuL2lzLWVsZW1lbnRcIik7XG52YXIgaXNOYU4gPSByZXF1aXJlKFwiLi9pcy1uYW5cIik7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKFwiLi9pcy1vYmplY3RcIik7XG52YXIgaXNTZXQgPSByZXF1aXJlKFwiLi9pcy1zZXRcIik7XG52YXIgaXNTdWJzZXQgPSByZXF1aXJlKFwiLi9pcy1zdWJzZXRcIik7XG52YXIgZ2V0Q2xhc3NOYW1lID0gcmVxdWlyZShcIi4vZ2V0LWNsYXNzLW5hbWVcIik7XG5cbnZhciBldmVyeSA9IEFycmF5LnByb3RvdHlwZS5ldmVyeTtcbnZhciBnZXRUaW1lID0gRGF0ZS5wcm90b3R5cGUuZ2V0VGltZTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xudmFyIGtleXMgPSBPYmplY3Qua2V5cztcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIEBuYW1lIHNhbXNhbS5kZWVwRXF1YWxcbiAqIEBwYXJhbSBPYmplY3QgYWN0dWFsXG4gKiBAcGFyYW0gT2JqZWN0IGV4cGVjdGF0aW9uXG4gKlxuICogRGVlcCBlcXVhbCBjb21wYXJpc29uLiBUd28gdmFsdWVzIGFyZSBcImRlZXAgZXF1YWxcIiBpZjpcbiAqXG4gKiAgIC0gVGhleSBhcmUgZXF1YWwsIGFjY29yZGluZyB0byBzYW1zYW0uaWRlbnRpY2FsXG4gKiAgIC0gVGhleSBhcmUgYm90aCBkYXRlIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBzYW1lIHRpbWVcbiAqICAgLSBUaGV5IGFyZSBib3RoIGFycmF5cyBjb250YWluaW5nIGVsZW1lbnRzIHRoYXQgYXJlIGFsbCBkZWVwRXF1YWxcbiAqICAgLSBUaGV5IGFyZSBvYmplY3RzIHdpdGggdGhlIHNhbWUgc2V0IG9mIHByb3BlcnRpZXMsIGFuZCBlYWNoIHByb3BlcnR5XG4gKiAgICAgaW4gYGBhY3R1YWxgYCBpcyBkZWVwRXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaW4gYGBleHBlY3RhdGlvbmBgXG4gKlxuICogU3VwcG9ydHMgY3ljbGljIG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbEN5Y2xpYyhhY3R1YWwsIGV4cGVjdGF0aW9uLCBtYXRjaCkge1xuICAgIC8vIHVzZWQgZm9yIGN5Y2xpYyBjb21wYXJpc29uXG4gICAgLy8gY29udGFpbiBhbHJlYWR5IHZpc2l0ZWQgb2JqZWN0c1xuICAgIHZhciBhY3R1YWxPYmplY3RzID0gW107XG4gICAgdmFyIGV4cGVjdGF0aW9uT2JqZWN0cyA9IFtdO1xuICAgIC8vIGNvbnRhaW4gcGF0aGVzIChwb3NpdGlvbiBpbiB0aGUgb2JqZWN0IHN0cnVjdHVyZSlcbiAgICAvLyBvZiB0aGUgYWxyZWFkeSB2aXNpdGVkIG9iamVjdHNcbiAgICAvLyBpbmRleGVzIHNhbWUgYXMgaW4gb2JqZWN0cyBhcnJheXNcbiAgICB2YXIgYWN0dWFsUGF0aHMgPSBbXTtcbiAgICB2YXIgZXhwZWN0YXRpb25QYXRocyA9IFtdO1xuICAgIC8vIGNvbnRhaW5zIGNvbWJpbmF0aW9ucyBvZiBhbHJlYWR5IGNvbXBhcmVkIG9iamVjdHNcbiAgICAvLyBpbiB0aGUgbWFubmVyOiB7IFwiJDFbJ3JlZiddJDJbJ3JlZiddXCI6IHRydWUgfVxuICAgIHZhciBjb21wYXJlZCA9IHt9O1xuXG4gICAgLy8gZG9lcyB0aGUgcmVjdXJzaW9uIGZvciB0aGUgZGVlcCBlcXVhbCBjaGVja1xuICAgIHJldHVybiAoZnVuY3Rpb24gZGVlcEVxdWFsKFxuICAgICAgICBhY3R1YWxPYmosXG4gICAgICAgIGV4cGVjdGF0aW9uT2JqLFxuICAgICAgICBhY3R1YWxQYXRoLFxuICAgICAgICBleHBlY3RhdGlvblBhdGhcbiAgICApIHtcbiAgICAgICAgLy8gSWYgYm90aCBhcmUgbWF0Y2hlcnMgdGhleSBtdXN0IGJlIHRoZSBzYW1lIGluc3RhbmNlIGluIG9yZGVyIHRvIGJlXG4gICAgICAgIC8vIGNvbnNpZGVyZWQgZXF1YWwgSWYgd2UgZGlkbid0IGRvIHRoYXQgd2Ugd291bGQgZW5kIHVwIHJ1bm5pbmcgb25lXG4gICAgICAgIC8vIG1hdGNoZXIgYWdhaW5zdCB0aGUgb3RoZXJcbiAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmlzTWF0Y2hlcihleHBlY3RhdGlvbk9iaikpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaC5pc01hdGNoZXIoYWN0dWFsT2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxPYmogPT09IGV4cGVjdGF0aW9uT2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uT2JqLnRlc3QoYWN0dWFsT2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3R1YWxUeXBlID0gdHlwZW9mIGFjdHVhbE9iajtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uVHlwZSA9IHR5cGVvZiBleHBlY3RhdGlvbk9iajtcblxuICAgICAgICAvLyA9PSBudWxsIGFsc28gbWF0Y2hlcyB1bmRlZmluZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWN0dWFsT2JqID09PSBleHBlY3RhdGlvbk9iaiB8fFxuICAgICAgICAgICAgaXNOYU4oYWN0dWFsT2JqKSB8fFxuICAgICAgICAgICAgaXNOYU4oZXhwZWN0YXRpb25PYmopIHx8XG4gICAgICAgICAgICBhY3R1YWxPYmogPT0gbnVsbCB8fFxuICAgICAgICAgICAgZXhwZWN0YXRpb25PYmogPT0gbnVsbCB8fFxuICAgICAgICAgICAgYWN0dWFsVHlwZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAgICAgZXhwZWN0YXRpb25UeXBlICE9PSBcIm9iamVjdFwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGlkZW50aWNhbChhY3R1YWxPYmosIGV4cGVjdGF0aW9uT2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVsZW1lbnRzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbChleHBlY3RlZCwgYWN0dWFsKVxuICAgICAgICBpZiAoaXNFbGVtZW50KGFjdHVhbE9iaikgfHwgaXNFbGVtZW50KGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlzQWN0dWFsRGF0ZSA9IGlzRGF0ZShhY3R1YWxPYmopO1xuICAgICAgICB2YXIgaXNFeHBlY3RhdGlvbkRhdGUgPSBpc0RhdGUoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICBpZiAoaXNBY3R1YWxEYXRlIHx8IGlzRXhwZWN0YXRpb25EYXRlKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWlzQWN0dWFsRGF0ZSB8fFxuICAgICAgICAgICAgICAgICFpc0V4cGVjdGF0aW9uRGF0ZSB8fFxuICAgICAgICAgICAgICAgIGdldFRpbWUuY2FsbChhY3R1YWxPYmopICE9PSBnZXRUaW1lLmNhbGwoZXhwZWN0YXRpb25PYmopXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0dWFsT2JqIGluc3RhbmNlb2YgUmVnRXhwICYmIGV4cGVjdGF0aW9uT2JqIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVUb1N0cmluZyhhY3R1YWxPYmopICE9PSB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uT2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxPYmogaW5zdGFuY2VvZiBFcnJvciAmJiBleHBlY3RhdGlvbk9iaiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0dWFsT2JqID09PSBleHBlY3RhdGlvbk9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhY3R1YWxDbGFzcyA9IGdldENsYXNzKGFjdHVhbE9iaik7XG4gICAgICAgIHZhciBleHBlY3RhdGlvbkNsYXNzID0gZ2V0Q2xhc3MoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICB2YXIgYWN0dWFsS2V5cyA9IGtleXMoYWN0dWFsT2JqKTtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uS2V5cyA9IGtleXMoZXhwZWN0YXRpb25PYmopO1xuICAgICAgICB2YXIgYWN0dWFsTmFtZSA9IGdldENsYXNzTmFtZShhY3R1YWxPYmopO1xuICAgICAgICB2YXIgZXhwZWN0YXRpb25OYW1lID0gZ2V0Q2xhc3NOYW1lKGV4cGVjdGF0aW9uT2JqKTtcbiAgICAgICAgdmFyIGV4cGVjdGF0aW9uU3ltYm9scyA9XG4gICAgICAgICAgICB0eXBlb2YgZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICA/IGdldE93blByb3BlcnR5U3ltYm9scyhleHBlY3RhdGlvbk9iailcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICB2YXIgZXhwZWN0YXRpb25LZXlzQW5kU3ltYm9scyA9IGV4cGVjdGF0aW9uS2V5cy5jb25jYXQoXG4gICAgICAgICAgICBleHBlY3RhdGlvblN5bWJvbHNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaXNBcmd1bWVudHMoYWN0dWFsT2JqKSB8fCBpc0FyZ3VtZW50cyhleHBlY3RhdGlvbk9iaikpIHtcbiAgICAgICAgICAgIGlmIChhY3R1YWxPYmoubGVuZ3RoICE9PSBleHBlY3RhdGlvbk9iai5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgYWN0dWFsVHlwZSAhPT0gZXhwZWN0YXRpb25UeXBlIHx8XG4gICAgICAgICAgICAgICAgYWN0dWFsQ2xhc3MgIT09IGV4cGVjdGF0aW9uQ2xhc3MgfHxcbiAgICAgICAgICAgICAgICBhY3R1YWxLZXlzLmxlbmd0aCAhPT0gZXhwZWN0YXRpb25LZXlzLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIChhY3R1YWxOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9uTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxOYW1lICE9PSBleHBlY3RhdGlvbk5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTZXQoYWN0dWFsT2JqKSB8fCBpc1NldChleHBlY3RhdGlvbk9iaikpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhaXNTZXQoYWN0dWFsT2JqKSB8fFxuICAgICAgICAgICAgICAgICFpc1NldChleHBlY3RhdGlvbk9iaikgfHxcbiAgICAgICAgICAgICAgICBhY3R1YWxPYmouc2l6ZSAhPT0gZXhwZWN0YXRpb25PYmouc2l6ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaXNTdWJzZXQoYWN0dWFsT2JqLCBleHBlY3RhdGlvbk9iaiwgZGVlcEVxdWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBldmVyeS5jYWxsKGV4cGVjdGF0aW9uS2V5c0FuZFN5bWJvbHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGFjdHVhbE9iaiwga2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFjdHVhbFZhbHVlID0gYWN0dWFsT2JqW2tleV07XG4gICAgICAgICAgICB2YXIgZXhwZWN0YXRpb25WYWx1ZSA9IGV4cGVjdGF0aW9uT2JqW2tleV07XG4gICAgICAgICAgICB2YXIgYWN0dWFsT2JqZWN0ID0gaXNPYmplY3QoYWN0dWFsVmFsdWUpO1xuICAgICAgICAgICAgdmFyIGV4cGVjdGF0aW9uT2JqZWN0ID0gaXNPYmplY3QoZXhwZWN0YXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmVzLCBpZiB0aGUgb2JqZWN0cyB3ZXJlIGFscmVhZHkgdmlzaXRlZFxuICAgICAgICAgICAgLy8gKGl0J3MgZmFzdGVyIHRvIGNoZWNrIGZvciBpc09iamVjdCBmaXJzdCwgdGhhbiB0b1xuICAgICAgICAgICAgLy8gZ2V0IC0xIGZyb20gZ2V0SW5kZXggZm9yIG5vbiBvYmplY3RzKVxuICAgICAgICAgICAgdmFyIGFjdHVhbEluZGV4ID0gYWN0dWFsT2JqZWN0XG4gICAgICAgICAgICAgICAgPyBpbmRleE9mLmNhbGwoYWN0dWFsT2JqZWN0cywgYWN0dWFsVmFsdWUpXG4gICAgICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgICAgIHZhciBleHBlY3RhdGlvbkluZGV4ID0gZXhwZWN0YXRpb25PYmplY3RcbiAgICAgICAgICAgICAgICA/IGluZGV4T2YuY2FsbChleHBlY3RhdGlvbk9iamVjdHMsIGV4cGVjdGF0aW9uVmFsdWUpXG4gICAgICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgICAgIC8vIGRldGVybWluZXMgdGhlIG5ldyBwYXRocyBvZiB0aGUgb2JqZWN0c1xuICAgICAgICAgICAgLy8gLSBmb3Igbm9uIGN5Y2xpYyBvYmplY3RzIHRoZSBjdXJyZW50IHBhdGggd2lsbCBiZSBleHRlbmRlZFxuICAgICAgICAgICAgLy8gICBieSBjdXJyZW50IHByb3BlcnR5IG5hbWVcbiAgICAgICAgICAgIC8vIC0gZm9yIGN5Y2xpYyBvYmplY3RzIHRoZSBzdG9yZWQgcGF0aCBpcyB0YWtlblxuICAgICAgICAgICAgdmFyIG5ld0FjdHVhbFBhdGggPVxuICAgICAgICAgICAgICAgIGFjdHVhbEluZGV4ICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IGFjdHVhbFBhdGhzW2FjdHVhbEluZGV4XVxuICAgICAgICAgICAgICAgICAgICA6IGFjdHVhbFBhdGggKyBcIltcIiArIEpTT04uc3RyaW5naWZ5KGtleSkgKyBcIl1cIjtcbiAgICAgICAgICAgIHZhciBuZXdFeHBlY3RhdGlvblBhdGggPVxuICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9uSW5kZXggIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gZXhwZWN0YXRpb25QYXRoc1tleHBlY3RhdGlvbkluZGV4XVxuICAgICAgICAgICAgICAgICAgICA6IGV4cGVjdGF0aW9uUGF0aCArIFwiW1wiICsgSlNPTi5zdHJpbmdpZnkoa2V5KSArIFwiXVwiO1xuICAgICAgICAgICAgdmFyIGNvbWJpbmVkUGF0aCA9IG5ld0FjdHVhbFBhdGggKyBuZXdFeHBlY3RhdGlvblBhdGg7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgcmVjdXJzaW9uIGlmIGN1cnJlbnQgb2JqZWN0cyBhcmUgYWxyZWFkeSBjb21wYXJlZFxuICAgICAgICAgICAgaWYgKGNvbXBhcmVkW2NvbWJpbmVkUGF0aF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIGN1cnJlbnQgb2JqZWN0cyBhbmQgdGhlaXIgcGF0aHNcbiAgICAgICAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gLTEgJiYgYWN0dWFsT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgYWN0dWFsT2JqZWN0cy5wdXNoKGFjdHVhbFZhbHVlKTtcbiAgICAgICAgICAgICAgICBhY3R1YWxQYXRocy5wdXNoKG5ld0FjdHVhbFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cGVjdGF0aW9uSW5kZXggPT09IC0xICYmIGV4cGVjdGF0aW9uT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0YXRpb25PYmplY3RzLnB1c2goZXhwZWN0YXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgZXhwZWN0YXRpb25QYXRocy5wdXNoKG5ld0V4cGVjdGF0aW9uUGF0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoYXQgdGhlIGN1cnJlbnQgb2JqZWN0cyBhcmUgYWxyZWFkeSBjb21wYXJlZFxuICAgICAgICAgICAgaWYgKGFjdHVhbE9iamVjdCAmJiBleHBlY3RhdGlvbk9iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBhcmVkW2NvbWJpbmVkUGF0aF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbmQgb2YgY3ljbGljIGxvZ2ljXG5cbiAgICAgICAgICAgIC8vIG5laXRoZXIgYWN0dWFsVmFsdWUgbm9yIGV4cGVjdGF0aW9uVmFsdWUgaXMgYSBjeWNsZVxuICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCBuZXh0IGxldmVsXG4gICAgICAgICAgICByZXR1cm4gZGVlcEVxdWFsKFxuICAgICAgICAgICAgICAgIGFjdHVhbFZhbHVlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgbmV3QWN0dWFsUGF0aCxcbiAgICAgICAgICAgICAgICBuZXdFeHBlY3RhdGlvblBhdGhcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH0pKGFjdHVhbCwgZXhwZWN0YXRpb24sIFwiJDFcIiwgXCIkMlwiKTtcbn1cblxuZGVlcEVxdWFsQ3ljbGljLnVzZSA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBFcXVhbEN5Y2xpYyhhLCBiLCBtYXRjaCk7XG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcEVxdWFsQ3ljbGljO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB2YWx1ZVRvU3RyaW5nID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikudmFsdWVUb1N0cmluZztcblxudmFyIHJlID0gL2Z1bmN0aW9uIChcXHcrKVxccypcXCgvO1xuXG5mdW5jdGlvbiBnZXRDbGFzc05hbWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgJiYgXCJuYW1lXCIgaW4gdmFsdWUuY29uc3RydWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHZhbHVlVG9TdHJpbmcodmFsdWUuY29uc3RydWN0b3IpLm1hdGNoKHJlKTtcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldENsYXNzTmFtZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbyA9IE9iamVjdC5wcm90b3R5cGU7XG5cbmZ1bmN0aW9uIGdldENsYXNzKHZhbHVlKSB7XG4gICAgLy8gUmV0dXJucyB0aGUgaW50ZXJuYWwgW1tDbGFzc11dIGJ5IGNhbGxpbmcgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgIC8vIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlIGFzIHRoaXMuIFJldHVybiB2YWx1ZSBpcyBhIHN0cmluZywgbmFtaW5nIHRoZVxuICAgIC8vIGludGVybmFsIGNsYXNzLCBlLmcuIFwiQXJyYXlcIlxuICAgIHJldHVybiBvLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNwbGl0KC9bIFxcXV0vKVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRDbGFzcztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgaXNOYU4gPSByZXF1aXJlKFwiLi9pcy1uYW5cIik7XG52YXIgaXNOZWdaZXJvID0gcmVxdWlyZShcIi4vaXMtbmVnLXplcm9cIik7XG5cbi8qKlxuICogQG5hbWUgc2Ftc2FtLmVxdWFsXG4gKiBAcGFyYW0gT2JqZWN0IG9iajFcbiAqIEBwYXJhbSBPYmplY3Qgb2JqMlxuICpcbiAqIFJldHVybnMgYGB0cnVlYGAgaWYgdHdvIG9iamVjdHMgYXJlIHN0cmljdGx5IGVxdWFsLiBDb21wYXJlZCB0b1xuICogYGA9PT1gYCB0aGVyZSBhcmUgdHdvIGV4Y2VwdGlvbnM6XG4gKlxuICogICAtIE5hTiBpcyBjb25zaWRlcmVkIGVxdWFsIHRvIE5hTlxuICogICAtIC0wIGFuZCArMCBhcmUgbm90IGNvbnNpZGVyZWQgZXF1YWxcbiAqL1xuZnVuY3Rpb24gaWRlbnRpY2FsKG9iajEsIG9iajIpIHtcbiAgICBpZiAob2JqMSA9PT0gb2JqMiB8fCAoaXNOYU4ob2JqMSkgJiYgaXNOYU4ob2JqMikpKSB7XG4gICAgICAgIHJldHVybiBvYmoxICE9PSAwIHx8IGlzTmVnWmVybyhvYmoxKSA9PT0gaXNOZWdaZXJvKG9iajIpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGljYWw7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGdldENsYXNzID0gcmVxdWlyZShcIi4vZ2V0LWNsYXNzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNhbXNhbS5pc0FyZ3VtZW50c1xuICogQHBhcmFtIE9iamVjdCBvYmplY3RcbiAqXG4gKiBSZXR1cm5zIGBgdHJ1ZWBgIGlmIGBgb2JqZWN0YGAgaXMgYW4gYGBhcmd1bWVudHNgYCBvYmplY3QsXG4gKiBgYGZhbHNlYGAgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgICBpZiAoZ2V0Q2xhc3Mob2JqZWN0KSA9PT0gXCJBcmd1bWVudHNcIikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICB0eXBlb2Ygb2JqZWN0ICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgIHR5cGVvZiBvYmplY3QubGVuZ3RoICE9PSBcIm51bWJlclwiIHx8XG4gICAgICAgIGdldENsYXNzKG9iamVjdCkgPT09IFwiQXJyYXlcIlxuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqZWN0LmNhbGxlZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBvYmplY3Rbb2JqZWN0Lmxlbmd0aF0gPSA2O1xuICAgICAgICBkZWxldGUgb2JqZWN0W29iamVjdC5sZW5ndGhdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRGF0ZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZGl2ID0gdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbi8qKlxuICogQG5hbWUgc2Ftc2FtLmlzRWxlbWVudFxuICogQHBhcmFtIE9iamVjdCBvYmplY3RcbiAqXG4gKiBSZXR1cm5zIGBgdHJ1ZWBgIGlmIGBgb2JqZWN0YGAgaXMgYSBET00gZWxlbWVudCBub2RlLiBVbmxpa2VcbiAqIFVuZGVyc2NvcmUuanMvbG9kYXNoLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGBgZmFsc2VgYCBpZiBgYG9iamVjdGBgXG4gKiBpcyBhbiAqZWxlbWVudC1saWtlKiBvYmplY3QsIGkuZS4gYSByZWd1bGFyIG9iamVjdCB3aXRoIGEgYGBub2RlVHlwZWBgXG4gKiBwcm9wZXJ0eSB0aGF0IGhvbGRzIHRoZSB2YWx1ZSBgYDFgYC5cbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICAgIGlmICghb2JqZWN0IHx8IG9iamVjdC5ub2RlVHlwZSAhPT0gMSB8fCAhZGl2KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIG9iamVjdC5yZW1vdmVDaGlsZChkaXYpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VsZW1lbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAvLyBVbmxpa2UgZ2xvYmFsIGlzTmFOLCB0aGlzIGF2b2lkcyB0eXBlIGNvZXJjaW9uXG4gICAgLy8gdHlwZW9mIGNoZWNrIGF2b2lkcyBJRSBob3N0IG9iamVjdCBpc3N1ZXMsIGhhdCB0aXAgdG9cbiAgICAvLyBsb2Rhc2hcbiAgICB2YXIgdmFsID0gdmFsdWU7IC8vIEpzTGludCB0aGlua3MgdmFsdWUgIT09IHZhbHVlIGlzIFwid2VpcmRcIlxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdmFsdWUgIT09IHZhbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc05hTjtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIEBuYW1lIHNhbXNhbS5pc05lZ1plcm9cbiAqIEBwYXJhbSBPYmplY3QgdmFsdWVcbiAqXG4gKiBSZXR1cm5zIGBgdHJ1ZWBgIGlmIGBgdmFsdWVgYCBpcyBgYC0wYGAuXG4gKi9cbmZ1bmN0aW9uIGlzTmVnWmVybyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPT09IC1JbmZpbml0eTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc05lZ1plcm87XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlIGlzIGEgcmVndWxhciBPYmplY3QgYW5kIG5vdCBhIHNwZWNpYWxpemVkIE9iamVjdFxuLy9cbi8vIFRoaXMgaGVscHMgc3BlZWRpbmcgdXAgZGVlcEVxdWFsIGN5Y2xpYyBjaGVja3Ncbi8vIFRoZSBwcmVtaXNlIGlzIHRoYXQgb25seSBPYmplY3RzIGFyZSBzdG9yZWQgaW4gdGhlIHZpc2l0ZWQgYXJyYXkuXG4vLyBTbyBpZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHdlIGRvbid0IGhhdmUgdG8gZG8gdGhlXG4vLyBleHBlbnNpdmUgb3BlcmF0aW9uIG9mIHNlYXJjaGluZyBmb3IgdGhlIHZhbHVlIGluIHRoZSB0aGUgYXJyYXkgb2YgYWxyZWFkeVxuLy8gdmlzaXRlZCBvYmplY3RzXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAvLyBub25lIG9mIHRoZXNlIGFyZSBjb2xsZWN0aW9uIG9iamVjdHMsIHNvIHdlIGNhbiByZXR1cm4gZmFsc2VcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pICYmXG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpICYmXG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpICYmXG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpXG4gICAgKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBpc1NldCh2YWwpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBTZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsIGluc3RhbmNlb2YgU2V0KSB8fCBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1NldDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBpc1N1YnNldChzMSwgczIsIGNvbXBhcmUpIHtcbiAgICB2YXIgYWxsQ29udGFpbmVkID0gdHJ1ZTtcbiAgICBzMS5mb3JFYWNoKGZ1bmN0aW9uKHYxKSB7XG4gICAgICAgIHZhciBpbmNsdWRlcyA9IGZhbHNlO1xuICAgICAgICBzMi5mb3JFYWNoKGZ1bmN0aW9uKHYyKSB7XG4gICAgICAgICAgICBpZiAoY29tcGFyZSh2MiwgdjEpKSB7XG4gICAgICAgICAgICAgICAgaW5jbHVkZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYWxsQ29udGFpbmVkID0gYWxsQ29udGFpbmVkICYmIGluY2x1ZGVzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFsbENvbnRhaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N1YnNldDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc2xpY2UgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLnN0cmluZy5zbGljZTtcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS50eXBlT2Y7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXRlcmFibGVUb1N0cmluZyhvYmopIHtcbiAgICB2YXIgcmVwcmVzZW50YXRpb24gPSBcIlwiO1xuXG4gICAgZnVuY3Rpb24gc3RyaW5naWZ5KGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IFwiJ1wiICsgaXRlbSArIFwiJ1wiXG4gICAgICAgICAgICA6IHZhbHVlVG9TdHJpbmcoaXRlbSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwVG9TdHJpbmcobWFwKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBsb2NhbC1ydWxlcy9uby1wcm90b3R5cGUtbWV0aG9kcyAqL1xuICAgICAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiArPVxuICAgICAgICAgICAgICAgIFwiW1wiICsgc3RyaW5naWZ5KGtleSkgKyBcIixcIiArIHN0cmluZ2lmeSh2YWx1ZSkgKyBcIl0sXCI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlcHJlc2VudGF0aW9uID0gc2xpY2UocmVwcmVzZW50YXRpb24sIDAsIC0xKTtcbiAgICAgICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyaWNJdGVyYWJsZVRvU3RyaW5nKGl0ZXJhYmxlKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBsb2NhbC1ydWxlcy9uby1wcm90b3R5cGUtbWV0aG9kcyAqL1xuICAgICAgICBpdGVyYWJsZS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICByZXByZXNlbnRhdGlvbiArPSBzdHJpbmdpZnkodmFsdWUpICsgXCIsXCI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlcHJlc2VudGF0aW9uID0gc2xpY2UocmVwcmVzZW50YXRpb24sIDAsIC0xKTtcbiAgICAgICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uO1xuICAgIH1cblxuICAgIGlmICh0eXBlT2Yob2JqKSA9PT0gXCJtYXBcIikge1xuICAgICAgICByZXR1cm4gbWFwVG9TdHJpbmcob2JqKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2VuZXJpY0l0ZXJhYmxlVG9TdHJpbmcob2JqKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHZhbHVlVG9TdHJpbmcgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS52YWx1ZVRvU3RyaW5nO1xuXG52YXIgZGVlcEVxdWFsID0gcmVxdWlyZShcIi4vZGVlcC1lcXVhbFwiKS51c2UobWF0Y2gpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG52YXIgZ2V0Q2xhc3MgPSByZXF1aXJlKFwiLi9nZXQtY2xhc3NcIik7XG52YXIgaXNEYXRlID0gcmVxdWlyZShcIi4vaXMtZGF0ZVwiKTtcbnZhciBpc1NldCA9IHJlcXVpcmUoXCIuL2lzLXNldFwiKTtcbnZhciBpc1N1YnNldCA9IHJlcXVpcmUoXCIuL2lzLXN1YnNldFwiKTtcbnZhciBjcmVhdGVNYXRjaGVyID0gcmVxdWlyZShcIi4vbWF0Y2hlclwiKTtcblxuZnVuY3Rpb24gYXJyYXlDb250YWlucyhhcnJheSwgc3Vic2V0LCBjb21wYXJlKSB7XG4gICAgaWYgKHN1YnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBpLCBsLCBqLCBrO1xuICAgIGZvciAoaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbaV0sIHN1YnNldFswXSkpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGsgPSBzdWJzZXQubGVuZ3RoOyBqIDwgazsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBhcmUoYXJyYXlbaSArIGpdLCBzdWJzZXRbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQG5hbWUgc2Ftc2FtLm1hdGNoXG4gKiBAcGFyYW0gT2JqZWN0IG9iamVjdFxuICogQHBhcmFtIE9iamVjdCBtYXRjaGVyXG4gKlxuICogQ29tcGFyZSBhcmJpdHJhcnkgdmFsdWUgYGBvYmplY3RgYCB3aXRoIG1hdGNoZXIuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoKG9iamVjdCwgbWF0Y2hlcikge1xuICAgIGlmIChtYXRjaGVyICYmIHR5cGVvZiBtYXRjaGVyLnRlc3QgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gbWF0Y2hlci50ZXN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXIob2JqZWN0KSA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbWF0Y2hlciA9IG1hdGNoZXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIG5vdE51bGwgPSB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiIHx8ICEhb2JqZWN0O1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbm90TnVsbCAmJlxuICAgICAgICAgICAgdmFsdWVUb1N0cmluZyhvYmplY3QpXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAuaW5kZXhPZihtYXRjaGVyKSA+PSAwXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVyID09PSBvYmplY3Q7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gbWF0Y2hlciA9PT0gb2JqZWN0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWF0Y2hlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBudWxsO1xuICAgIH1cblxuICAgIGlmIChvYmplY3QgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBpc1N1YnNldChtYXRjaGVyLCBvYmplY3QsIG1hdGNoKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q2xhc3Mob2JqZWN0KSA9PT0gXCJBcnJheVwiICYmIGdldENsYXNzKG1hdGNoZXIpID09PSBcIkFycmF5XCIpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5Q29udGFpbnMob2JqZWN0LCBtYXRjaGVyLCBtYXRjaCk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGF0ZShtYXRjaGVyKSkge1xuICAgICAgICByZXR1cm4gaXNEYXRlKG9iamVjdCkgJiYgb2JqZWN0LmdldFRpbWUoKSA9PT0gbWF0Y2hlci5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZXIgJiYgdHlwZW9mIG1hdGNoZXIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKG1hdGNoZXIgPT09IG9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgICBmb3IgKHByb3AgaW4gbWF0Y2hlcikge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W3Byb3BdO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBvYmplY3QuZ2V0QXR0cmlidXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0LmdldEF0dHJpYnV0ZShwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtYXRjaGVyW3Byb3BdID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIG1hdGNoZXJbcHJvcF0gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbWF0Y2hlcltwcm9wXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgICAgICAgICAhZGVlcEVxdWFsKHZhbHVlLCBtYXRjaGVyW3Byb3BdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNYXRjaGVyIHdhcyBub3QgYSBzdHJpbmcsIGEgbnVtYmVyLCBhIFwiICtcbiAgICAgICAgICAgIFwiZnVuY3Rpb24sIGEgYm9vbGVhbiBvciBhbiBvYmplY3RcIlxuICAgICk7XG59XG5cbk9iamVjdC5rZXlzKGNyZWF0ZU1hdGNoZXIpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgbWF0Y2hba2V5XSA9IGNyZWF0ZU1hdGNoZXJba2V5XTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdGNoO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnJheVByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5hcnJheTtcbnZhciBkZWVwRXF1YWwgPSByZXF1aXJlKFwiLi9kZWVwLWVxdWFsXCIpLnVzZShtYXRjaCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbnZhciBldmVyeSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmV2ZXJ5O1xudmFyIGZ1bmN0aW9uTmFtZSA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLmZ1bmN0aW9uTmFtZTtcbnZhciBnZXQgPSByZXF1aXJlKFwibG9kYXNoXCIpLmdldDtcbnZhciBpdGVyYWJsZVRvU3RyaW5nID0gcmVxdWlyZShcIi4vaXRlcmFibGUtdG8tc3RyaW5nXCIpO1xudmFyIG9iamVjdFByb3RvID0gcmVxdWlyZShcIkBzaW5vbmpzL2NvbW1vbnNcIikucHJvdG90eXBlcy5vYmplY3Q7XG52YXIgc3RyaW5nUHJvdG8gPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS5wcm90b3R5cGVzLnN0cmluZztcbnZhciB0eXBlT2YgPSByZXF1aXJlKFwiQHNpbm9uanMvY29tbW9uc1wiKS50eXBlT2Y7XG52YXIgdmFsdWVUb1N0cmluZyA9IHJlcXVpcmUoXCJAc2lub25qcy9jb21tb25zXCIpLnZhbHVlVG9TdHJpbmc7XG5cbnZhciBhcnJheUluZGV4T2YgPSBhcnJheVByb3RvLmluZGV4T2Y7XG52YXIgYXJyYXlFdmVyeSA9IGFycmF5UHJvdG8uZXZlcnk7XG52YXIgam9pbiA9IGFycmF5UHJvdG8uam9pbjtcbnZhciBtYXAgPSBhcnJheVByb3RvLm1hcDtcbnZhciBzb21lID0gYXJyYXlQcm90by5zb21lO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc1Byb3RvdHlwZU9mID0gb2JqZWN0UHJvdG8uaXNQcm90b3R5cGVPZjtcblxudmFyIHN0cmluZ0luZGV4T2YgPSBzdHJpbmdQcm90by5pbmRleE9mO1xuXG5mdW5jdGlvbiBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlLCBuYW1lKSB7XG4gICAgdmFyIGFjdHVhbCA9IHR5cGVPZih2YWx1ZSk7XG4gICAgaWYgKGFjdHVhbCAhPT0gdHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCB0eXBlIG9mIFwiICtcbiAgICAgICAgICAgICAgICBuYW1lICtcbiAgICAgICAgICAgICAgICBcIiB0byBiZSBcIiArXG4gICAgICAgICAgICAgICAgdHlwZSArXG4gICAgICAgICAgICAgICAgXCIsIGJ1dCB3YXMgXCIgK1xuICAgICAgICAgICAgICAgIGFjdHVhbFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0TWV0aG9kRXhpc3RzKHZhbHVlLCBtZXRob2QsIG5hbWUsIG1ldGhvZFBhdGgpIHtcbiAgICBpZiAodmFsdWVbbWV0aG9kXSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIFwiICsgbmFtZSArIFwiIHRvIGhhdmUgbWV0aG9kIFwiICsgbWV0aG9kUGF0aFxuICAgICAgICApO1xuICAgIH1cbn1cblxudmFyIG1hdGNoZXIgPSB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGlzTWF0Y2hlcihvYmplY3QpIHtcbiAgICByZXR1cm4gaXNQcm90b3R5cGVPZihtYXRjaGVyLCBvYmplY3QpO1xufVxuXG5mdW5jdGlvbiBtYXRjaE9iamVjdChhY3R1YWwsIGV4cGVjdGF0aW9uKSB7XG4gICAgaWYgKGFjdHVhbCA9PT0gbnVsbCB8fCBhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5RXZlcnkoT2JqZWN0LmtleXMoZXhwZWN0YXRpb24pLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdmFyIGV4cCA9IGV4cGVjdGF0aW9uW2tleV07XG4gICAgICAgIHZhciBhY3QgPSBhY3R1YWxba2V5XTtcblxuICAgICAgICBpZiAoaXNNYXRjaGVyKGV4cCkpIHtcbiAgICAgICAgICAgIGlmICghZXhwLnRlc3QoYWN0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlT2YoZXhwKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKCFtYXRjaE9iamVjdChhY3QsIGV4cCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWRlZXBFcXVhbChhY3QsIGV4cCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuXG52YXIgVFlQRV9NQVAgPSB7XG4gICAgZnVuY3Rpb246IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIG0udGVzdCA9IGV4cGVjdGF0aW9uO1xuICAgICAgICBtLm1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwibWF0Y2goXCIgKyBmdW5jdGlvbk5hbWUoZXhwZWN0YXRpb24pICsgXCIpXCI7XG4gICAgfSxcbiAgICBudW1iZXI6IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgIG0udGVzdCA9IGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0eXBlIGNvZXJjaW9uIGhlcmVcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbiA9PSBhY3R1YWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBvYmplY3Q6IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZXhwZWN0YXRpb24udGVzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24udGVzdChhY3R1YWwpID09PSB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG0ubWVzc2FnZSA9IFwibWF0Y2goXCIgKyBmdW5jdGlvbk5hbWUoZXhwZWN0YXRpb24udGVzdCkgKyBcIilcIjtcbiAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXkgPSBtYXAoT2JqZWN0LmtleXMoZXhwZWN0YXRpb24pLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgKyBcIjogXCIgKyB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uW2tleV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBtLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaE9iamVjdChhY3R1YWwsIGV4cGVjdGF0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgbS5tZXNzYWdlID0gXCJtYXRjaChcIiArIGpvaW4oYXJyYXksIFwiLCBcIikgKyBcIilcIjtcblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9LFxuICAgIHJlZ2V4cDogZnVuY3Rpb24obSwgZXhwZWN0YXRpb24pIHtcbiAgICAgICAgbS50ZXN0ID0gZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gXCJzdHJpbmdcIiAmJiBleHBlY3RhdGlvbi50ZXN0KGFjdHVhbCk7XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBzdHJpbmc6IGZ1bmN0aW9uKG0sIGV4cGVjdGF0aW9uKSB7XG4gICAgICAgIG0udGVzdCA9IGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgYWN0dWFsID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgc3RyaW5nSW5kZXhPZihhY3R1YWwsIGV4cGVjdGF0aW9uKSAhPT0gLTFcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIG0ubWVzc2FnZSA9ICdtYXRjaChcIicgKyBleHBlY3RhdGlvbiArICdcIiknO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIG1hdGNoKGV4cGVjdGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgdmFyIG0gPSBPYmplY3QuY3JlYXRlKG1hdGNoZXIpO1xuICAgIHZhciB0eXBlID0gdHlwZU9mKGV4cGVjdGF0aW9uKTtcblxuICAgIGlmIChtZXNzYWdlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1lc3NhZ2UgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lc3NhZ2Ugc2hvdWxkIGJlIGEgc3RyaW5nXCIpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCAxIG9yIDIgYXJndW1lbnRzLCByZWNlaXZlZCBcIiArIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSBpbiBUWVBFX01BUCkge1xuICAgICAgICBUWVBFX01BUFt0eXBlXShtLCBleHBlY3RhdGlvbiwgbWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbS50ZXN0ID0gZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0YXRpb24pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmICghbS5tZXNzYWdlKSB7XG4gICAgICAgIG0ubWVzc2FnZSA9IFwibWF0Y2goXCIgKyB2YWx1ZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiKVwiO1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG5tYXRjaGVyLm9yID0gZnVuY3Rpb24obTIpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hdGNoZXIgZXhwZWN0ZWRcIik7XG4gICAgfSBlbHNlIGlmICghaXNNYXRjaGVyKG0yKSkge1xuICAgICAgICBtMiA9IG1hdGNoKG0yKTtcbiAgICB9XG4gICAgdmFyIG0xID0gdGhpcztcbiAgICB2YXIgb3IgPSBPYmplY3QuY3JlYXRlKG1hdGNoZXIpO1xuICAgIG9yLnRlc3QgPSBmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIG0xLnRlc3QoYWN0dWFsKSB8fCBtMi50ZXN0KGFjdHVhbCk7XG4gICAgfTtcbiAgICBvci5tZXNzYWdlID0gbTEubWVzc2FnZSArIFwiLm9yKFwiICsgbTIubWVzc2FnZSArIFwiKVwiO1xuICAgIHJldHVybiBvcjtcbn07XG5cbm1hdGNoZXIuYW5kID0gZnVuY3Rpb24obTIpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1hdGNoZXIgZXhwZWN0ZWRcIik7XG4gICAgfSBlbHNlIGlmICghaXNNYXRjaGVyKG0yKSkge1xuICAgICAgICBtMiA9IG1hdGNoKG0yKTtcbiAgICB9XG4gICAgdmFyIG0xID0gdGhpcztcbiAgICB2YXIgYW5kID0gT2JqZWN0LmNyZWF0ZShtYXRjaGVyKTtcbiAgICBhbmQudGVzdCA9IGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gbTEudGVzdChhY3R1YWwpICYmIG0yLnRlc3QoYWN0dWFsKTtcbiAgICB9O1xuICAgIGFuZC5tZXNzYWdlID0gbTEubWVzc2FnZSArIFwiLmFuZChcIiArIG0yLm1lc3NhZ2UgKyBcIilcIjtcbiAgICByZXR1cm4gYW5kO1xufTtcblxubWF0Y2guaXNNYXRjaGVyID0gaXNNYXRjaGVyO1xuXG5tYXRjaC5hbnkgPSBtYXRjaChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbn0sIFwiYW55XCIpO1xuXG5tYXRjaC5kZWZpbmVkID0gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgcmV0dXJuIGFjdHVhbCAhPT0gbnVsbCAmJiBhY3R1YWwgIT09IHVuZGVmaW5lZDtcbn0sIFwiZGVmaW5lZFwiKTtcblxubWF0Y2gudHJ1dGh5ID0gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgcmV0dXJuICEhYWN0dWFsO1xufSwgXCJ0cnV0aHlcIik7XG5cbm1hdGNoLmZhbHN5ID0gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgcmV0dXJuICFhY3R1YWw7XG59LCBcImZhbHN5XCIpO1xuXG5tYXRjaC5zYW1lID0gZnVuY3Rpb24oZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIHJldHVybiBleHBlY3RhdGlvbiA9PT0gYWN0dWFsO1xuICAgIH0sIFwic2FtZShcIiArIHZhbHVlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCIpXCIpO1xufTtcblxubWF0Y2guaW4gPSBmdW5jdGlvbihhcnJheU9mRXhwZWN0YXRpb25zKSB7XG4gICAgaWYgKHR5cGVPZihhcnJheU9mRXhwZWN0YXRpb25zKSAhPT0gXCJhcnJheVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcnJheSBleHBlY3RlZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIHJldHVybiBzb21lKGFycmF5T2ZFeHBlY3RhdGlvbnMsIGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24gPT09IGFjdHVhbDtcbiAgICAgICAgfSk7XG4gICAgfSwgXCJpbihcIiArIHZhbHVlVG9TdHJpbmcoYXJyYXlPZkV4cGVjdGF0aW9ucykgKyBcIilcIik7XG59O1xuXG5tYXRjaC50eXBlT2YgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgYXNzZXJ0VHlwZSh0eXBlLCBcInN0cmluZ1wiLCBcInR5cGVcIik7XG4gICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gdHlwZU9mKGFjdHVhbCkgPT09IHR5cGU7XG4gICAgfSwgJ3R5cGVPZihcIicgKyB0eXBlICsgJ1wiKScpO1xufTtcblxubWF0Y2guaW5zdGFuY2VPZiA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICAgdHlwZW9mIFN5bWJvbC5oYXNJbnN0YW5jZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgICBhc3NlcnRUeXBlKHR5cGUsIFwiZnVuY3Rpb25cIiwgXCJ0eXBlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydE1ldGhvZEV4aXN0cyhcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBTeW1ib2wuaGFzSW5zdGFuY2UsXG4gICAgICAgICAgICBcInR5cGVcIixcbiAgICAgICAgICAgIFwiW1N5bWJvbC5oYXNJbnN0YW5jZV1cIlxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIHJldHVybiBhY3R1YWwgaW5zdGFuY2VvZiB0eXBlO1xuICAgIH0sIFwiaW5zdGFuY2VPZihcIiArXG4gICAgICAgIChmdW5jdGlvbk5hbWUodHlwZSkgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHR5cGUpKSArXG4gICAgICAgIFwiKVwiKTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5TWF0Y2hlcihwcm9wZXJ0eVRlc3QsIG1lc3NhZ2VQcmVmaXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKSB7XG4gICAgICAgIGFzc2VydFR5cGUocHJvcGVydHksIFwic3RyaW5nXCIsIFwicHJvcGVydHlcIik7XG4gICAgICAgIHZhciBvbmx5UHJvcGVydHkgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxO1xuICAgICAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VQcmVmaXggKyAnKFwiJyArIHByb3BlcnR5ICsgJ1wiJztcbiAgICAgICAgaWYgKCFvbmx5UHJvcGVydHkpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gXCIsIFwiICsgdmFsdWVUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSBcIilcIjtcbiAgICAgICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFjdHVhbCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgYWN0dWFsID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgIXByb3BlcnR5VGVzdChhY3R1YWwsIHByb3BlcnR5KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9ubHlQcm9wZXJ0eSB8fCBkZWVwRXF1YWwoYWN0dWFsW3Byb3BlcnR5XSwgdmFsdWUpO1xuICAgICAgICB9LCBtZXNzYWdlKTtcbiAgICB9O1xufVxuXG5tYXRjaC5oYXMgPSBjcmVhdGVQcm9wZXJ0eU1hdGNoZXIoZnVuY3Rpb24oYWN0dWFsLCBwcm9wZXJ0eSkge1xuICAgIGlmICh0eXBlb2YgYWN0dWFsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiBhY3R1YWw7XG4gICAgfVxuICAgIHJldHVybiBhY3R1YWxbcHJvcGVydHldICE9PSB1bmRlZmluZWQ7XG59LCBcImhhc1wiKTtcblxubWF0Y2guaGFzT3duID0gY3JlYXRlUHJvcGVydHlNYXRjaGVyKGZ1bmN0aW9uKGFjdHVhbCwgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gaGFzT3duUHJvcGVydHkoYWN0dWFsLCBwcm9wZXJ0eSk7XG59LCBcImhhc093blwiKTtcblxubWF0Y2guaGFzTmVzdGVkID0gZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKSB7XG4gICAgYXNzZXJ0VHlwZShwcm9wZXJ0eSwgXCJzdHJpbmdcIiwgXCJwcm9wZXJ0eVwiKTtcbiAgICB2YXIgb25seVByb3BlcnR5ID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMTtcbiAgICB2YXIgbWVzc2FnZSA9ICdoYXNOZXN0ZWQoXCInICsgcHJvcGVydHkgKyAnXCInO1xuICAgIGlmICghb25seVByb3BlcnR5KSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gXCIsIFwiICsgdmFsdWVUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIG1lc3NhZ2UgKz0gXCIpXCI7XG4gICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBhY3R1YWwgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgYWN0dWFsID09PSBudWxsIHx8XG4gICAgICAgICAgICBnZXQoYWN0dWFsLCBwcm9wZXJ0eSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25seVByb3BlcnR5IHx8IGRlZXBFcXVhbChnZXQoYWN0dWFsLCBwcm9wZXJ0eSksIHZhbHVlKTtcbiAgICB9LCBtZXNzYWdlKTtcbn07XG5cbm1hdGNoLmV2ZXJ5ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgaWYgKCFpc01hdGNoZXIocHJlZGljYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWF0Y2hlciBleHBlY3RlZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIGlmICh0eXBlT2YoYWN0dWFsKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZXJ5KE9iamVjdC5rZXlzKGFjdHVhbCksIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUudGVzdChhY3R1YWxba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIWFjdHVhbCAmJlxuICAgICAgICAgICAgdHlwZU9mKGFjdHVhbC5mb3JFYWNoKSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBldmVyeShhY3R1YWwsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlLnRlc3QoZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwiZXZlcnkoXCIgKyBwcmVkaWNhdGUubWVzc2FnZSArIFwiKVwiKTtcbn07XG5cbm1hdGNoLnNvbWUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICBpZiAoIWlzTWF0Y2hlcihwcmVkaWNhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYXRjaGVyIGV4cGVjdGVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgaWYgKHR5cGVPZihhY3R1YWwpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gIWV2ZXJ5KE9iamVjdC5rZXlzKGFjdHVhbCksIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhcHJlZGljYXRlLnRlc3QoYWN0dWFsW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISFhY3R1YWwgJiZcbiAgICAgICAgICAgIHR5cGVPZihhY3R1YWwuZm9yRWFjaCkgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgIWV2ZXJ5KGFjdHVhbCwgZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhcHJlZGljYXRlLnRlc3QoZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwic29tZShcIiArIHByZWRpY2F0ZS5tZXNzYWdlICsgXCIpXCIpO1xufTtcblxubWF0Y2guYXJyYXkgPSBtYXRjaC50eXBlT2YoXCJhcnJheVwiKTtcblxubWF0Y2guYXJyYXkuZGVlcEVxdWFscyA9IGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICAvLyBDb21wYXJpbmcgbGVuZ3RocyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gc3BvdCBhIGRpZmZlcmVuY2UgYmVmb3JlIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IGl0ZW1cbiAgICAgICAgdmFyIHNhbWVMZW5ndGggPSBhY3R1YWwubGVuZ3RoID09PSBleHBlY3RhdGlvbi5sZW5ndGg7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlT2YoYWN0dWFsKSA9PT0gXCJhcnJheVwiICYmXG4gICAgICAgICAgICBzYW1lTGVuZ3RoICYmXG4gICAgICAgICAgICBldmVyeShhY3R1YWwsIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gZXhwZWN0YXRpb25baW5kZXhdO1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlT2YoZXhwZWN0ZWQpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZU9mKGVsZW1lbnQpID09PSBcImFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgPyBtYXRjaC5hcnJheS5kZWVwRXF1YWxzKGV4cGVjdGVkKS50ZXN0KGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIDogZGVlcEVxdWFsKGV4cGVjdGVkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgXCJkZWVwRXF1YWxzKFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbm1hdGNoLmFycmF5LnN0YXJ0c1dpdGggPSBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgIGV2ZXJ5KGV4cGVjdGF0aW9uLCBmdW5jdGlvbihleHBlY3RlZEVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFtpbmRleF0gPT09IGV4cGVjdGVkRWxlbWVudDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgXCJzdGFydHNXaXRoKFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbm1hdGNoLmFycmF5LmVuZHNXaXRoID0gZnVuY3Rpb24oZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoZSBpbmRleCBpbiB3aGljaCB3ZSBzaG91bGQgc3RhcnQgbWF0Y2hpbmdcbiAgICAgICAgdmFyIG9mZnNldCA9IGFjdHVhbC5sZW5ndGggLSBleHBlY3RhdGlvbi5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcImFycmF5XCIgJiZcbiAgICAgICAgICAgIGV2ZXJ5KGV4cGVjdGF0aW9uLCBmdW5jdGlvbihleHBlY3RlZEVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFtvZmZzZXQgKyBpbmRleF0gPT09IGV4cGVjdGVkRWxlbWVudDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgXCJlbmRzV2l0aChbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5hcnJheS5jb250YWlucyA9IGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgcmV0dXJuIG1hdGNoKGZ1bmN0aW9uKGFjdHVhbCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwiYXJyYXlcIiAmJlxuICAgICAgICAgICAgZXZlcnkoZXhwZWN0YXRpb24sIGZ1bmN0aW9uKGV4cGVjdGVkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUluZGV4T2YoYWN0dWFsLCBleHBlY3RlZEVsZW1lbnQpICE9PSAtMTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfSwgXCJjb250YWlucyhbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5tYXAgPSBtYXRjaC50eXBlT2YoXCJtYXBcIik7XG5cbm1hdGNoLm1hcC5kZWVwRXF1YWxzID0gZnVuY3Rpb24gbWFwRGVlcEVxdWFscyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgLy8gQ29tcGFyaW5nIGxlbmd0aHMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIHNwb3QgYSBkaWZmZXJlbmNlIGJlZm9yZSBpdGVyYXRpbmcgdGhyb3VnaCBldmVyeSBpdGVtXG4gICAgICAgIHZhciBzYW1lTGVuZ3RoID0gYWN0dWFsLnNpemUgPT09IGV4cGVjdGF0aW9uLnNpemU7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlT2YoYWN0dWFsKSA9PT0gXCJtYXBcIiAmJlxuICAgICAgICAgICAgc2FtZUxlbmd0aCAmJlxuICAgICAgICAgICAgZXZlcnkoYWN0dWFsLCBmdW5jdGlvbihlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0YXRpb24uaGFzKGtleSkgJiYgZXhwZWN0YXRpb24uZ2V0KGtleSkgPT09IGVsZW1lbnQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwiZGVlcEVxdWFscyhNYXBbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5tYXAuY29udGFpbnMgPSBmdW5jdGlvbiBtYXBDb250YWlucyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcIm1hcFwiICYmXG4gICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24oZWxlbWVudCwga2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC5oYXMoa2V5KSAmJiBhY3R1YWwuZ2V0KGtleSkgPT09IGVsZW1lbnQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwiY29udGFpbnMoTWFwW1wiICsgaXRlcmFibGVUb1N0cmluZyhleHBlY3RhdGlvbikgKyBcIl0pXCIpO1xufTtcblxubWF0Y2guc2V0ID0gbWF0Y2gudHlwZU9mKFwic2V0XCIpO1xuXG5tYXRjaC5zZXQuZGVlcEVxdWFscyA9IGZ1bmN0aW9uIHNldERlZXBFcXVhbHMoZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gbWF0Y2goZnVuY3Rpb24oYWN0dWFsKSB7XG4gICAgICAgIC8vIENvbXBhcmluZyBsZW5ndGhzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBzcG90IGEgZGlmZmVyZW5jZSBiZWZvcmUgaXRlcmF0aW5nIHRocm91Z2ggZXZlcnkgaXRlbVxuICAgICAgICB2YXIgc2FtZUxlbmd0aCA9IGFjdHVhbC5zaXplID09PSBleHBlY3RhdGlvbi5zaXplO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZU9mKGFjdHVhbCkgPT09IFwic2V0XCIgJiZcbiAgICAgICAgICAgIHNhbWVMZW5ndGggJiZcbiAgICAgICAgICAgIGV2ZXJ5KGFjdHVhbCwgZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbi5oYXMoZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sIFwiZGVlcEVxdWFscyhTZXRbXCIgKyBpdGVyYWJsZVRvU3RyaW5nKGV4cGVjdGF0aW9uKSArIFwiXSlcIik7XG59O1xuXG5tYXRjaC5zZXQuY29udGFpbnMgPSBmdW5jdGlvbiBzZXRDb250YWlucyhleHBlY3RhdGlvbikge1xuICAgIHJldHVybiBtYXRjaChmdW5jdGlvbihhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHR5cGVPZihhY3R1YWwpID09PSBcInNldFwiICYmXG4gICAgICAgICAgICBldmVyeShleHBlY3RhdGlvbiwgZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWwuaGFzKGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9LCBcImNvbnRhaW5zKFNldFtcIiArIGl0ZXJhYmxlVG9TdHJpbmcoZXhwZWN0YXRpb24pICsgXCJdKVwiKTtcbn07XG5cbm1hdGNoLmJvb2wgPSBtYXRjaC50eXBlT2YoXCJib29sZWFuXCIpO1xubWF0Y2gubnVtYmVyID0gbWF0Y2gudHlwZU9mKFwibnVtYmVyXCIpO1xubWF0Y2guc3RyaW5nID0gbWF0Y2gudHlwZU9mKFwic3RyaW5nXCIpO1xubWF0Y2gub2JqZWN0ID0gbWF0Y2gudHlwZU9mKFwib2JqZWN0XCIpO1xubWF0Y2guZnVuYyA9IG1hdGNoLnR5cGVPZihcImZ1bmN0aW9uXCIpO1xubWF0Y2gucmVnZXhwID0gbWF0Y2gudHlwZU9mKFwicmVnZXhwXCIpO1xubWF0Y2guZGF0ZSA9IG1hdGNoLnR5cGVPZihcImRhdGVcIik7XG5tYXRjaC5zeW1ib2wgPSBtYXRjaC50eXBlT2YoXCJzeW1ib2xcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2g7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGlkZW50aWNhbCA9IHJlcXVpcmUoXCIuL2lkZW50aWNhbFwiKTtcbnZhciBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoXCIuL2lzLWFyZ3VtZW50c1wiKTtcbnZhciBpc0VsZW1lbnQgPSByZXF1aXJlKFwiLi9pcy1lbGVtZW50XCIpO1xudmFyIGlzTmVnWmVybyA9IHJlcXVpcmUoXCIuL2lzLW5lZy16ZXJvXCIpO1xudmFyIGlzU2V0ID0gcmVxdWlyZShcIi4vaXMtc2V0XCIpO1xudmFyIG1hdGNoID0gcmVxdWlyZShcIi4vbWF0Y2hcIik7XG52YXIgZGVlcEVxdWFsQ3ljbGljID0gcmVxdWlyZShcIi4vZGVlcC1lcXVhbFwiKS51c2UobWF0Y2gpO1xudmFyIGNyZWF0ZU1hdGNoZXIgPSByZXF1aXJlKFwiLi9tYXRjaGVyXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjcmVhdGVNYXRjaGVyOiBjcmVhdGVNYXRjaGVyLFxuICAgIGRlZXBFcXVhbDogZGVlcEVxdWFsQ3ljbGljLFxuICAgIGlkZW50aWNhbDogaWRlbnRpY2FsLFxuICAgIGlzQXJndW1lbnRzOiBpc0FyZ3VtZW50cyxcbiAgICBpc0VsZW1lbnQ6IGlzRWxlbWVudCxcbiAgICBpc05lZ1plcm86IGlzTmVnWmVybyxcbiAgICBpc1NldDogaXNTZXQsXG4gICAgbWF0Y2g6IG1hdGNoXG59O1xuIiwiLy8gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbi8vIFNlZSBMSUNFTlNFLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG52YXIgZW5jb2RpbmcgPSByZXF1aXJlKFwiLi9saWIvZW5jb2RpbmcuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBUZXh0RW5jb2RlcjogZW5jb2RpbmcuVGV4dEVuY29kZXIsXG4gIFRleHREZWNvZGVyOiBlbmNvZGluZy5UZXh0RGVjb2Rlcixcbn07XG4iLCIoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xuICB9XG5cbiAgZ2xvYmFsW1wiZW5jb2RpbmctaW5kZXhlc1wiXSA9XG57XG4gIFwiYmlnNVwiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxNzM5MiwxOTUwNiwxNzkyMywxNzgzMCwxNzc4NCwxNjAzNTksMTk4MzEsMTc4NDMsMTYyOTkzLDE5NjgyLDE2MzAxMywxNTI1MywxODIzMCwxODI0NCwxOTUyNywxOTUyMCwxNDgxNTksMTQ0OTE5LDE2MDU5NCwxNTkzNzEsMTU5OTU0LDE5NTQzLDE3Mjg4MSwxODI1NSwxNzg4MiwxOTU4OSwxNjI5MjQsMTk3MTksMTkxMDgsMTgwODEsMTU4NDk5LDI5MjIxLDE1NDE5NiwxMzc4MjcsMTQ2OTUwLDE0NzI5NywyNjE4OSwyMjI2NyxudWxsLDMyMTQ5LDIyODEzLDE2Njg0MSwxNTg2MCwzODcwOCwxNjI3OTksMjM1MTUsMTM4NTkwLDIzMjA0LDEzODYxLDE3MTY5NiwyMzI0OSwyMzQ3OSwyMzgwNCwyNjQ3OCwzNDE5NSwxNzAzMDksMjk3OTMsMjk4NTMsMTQ0NTMsMTM4NTc5LDE0NTA1NCwxNTU2ODEsMTYxMDgsMTUzODIyLDE1MDkzLDMxNDg0LDQwODU1LDE0NzgwOSwxNjYxNTcsMTQzODUwLDEzMzc3MCwxNDM5NjYsMTcxNjIsMzM5MjQsNDA4NTQsMzc5MzUsMTg3MzYsMzQzMjMsMjI2NzgsMzg3MzAsMzc0MDAsMzExODQsMzEyODIsMjYyMDgsMjcxNzcsMzQ5NzMsMjk3NzIsMzE2ODUsMjY0OTgsMzEyNzYsMjEwNzEsMzY5MzQsMTM1NDIsMjk2MzYsMTU1MDY1LDI5ODk0LDQwOTAzLDIyNDUxLDE4NzM1LDIxNTgwLDE2Njg5LDE0NTAzOCwyMjU1MiwzMTM0NiwxNjI2NjEsMzU3MjcsMTgwOTQsMTU5MzY4LDE2NzY5LDE1NTAzMywzMTY2MiwxNDA0NzYsNDA5MDQsMTQwNDgxLDE0MDQ4OSwxNDA0OTIsNDA5MDUsMzQwNTIsMTQ0ODI3LDE2NTY0LDQwOTA2LDE3NjMzLDE3NTYxNSwyNTI4MSwyODc4Miw0MDkwNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDEyNzM2LDEyNzM3LDEyNzM4LDEyNzM5LDEyNzQwLDEzMTM0MCwxMjc0MSwxMzEyODEsMTMxMjc3LDEyNzQyLDEyNzQzLDEzMTI3NSwxMzkyNDAsMTI3NDQsMTMxMjc0LDEyNzQ1LDEyNzQ2LDEyNzQ3LDEyNzQ4LDEzMTM0MiwxMjc0OSwxMjc1MCwyNTYsMTkzLDQ2MSwxOTIsMjc0LDIwMSwyODIsMjAwLDMzMiwyMTEsNDY1LDIxMCxudWxsLDc4NzAsbnVsbCw3ODcyLDIwMiwyNTcsMjI1LDQ2MiwyMjQsNTkzLDI3NSwyMzMsMjgzLDIzMiwyOTksMjM3LDQ2NCwyMzYsMzMzLDI0Myw0NjYsMjQyLDM2MywyNTAsNDY4LDI0OSw0NzAsNDcyLDQ3NCw0NzYsMjUyLG51bGwsNzg3MSxudWxsLDc4NzMsMjM0LDYwOSw5MTc4LDkxNzksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTcyOTY5LDEzNTQ5MyxudWxsLDI1ODY2LG51bGwsbnVsbCwyMDAyOSwyODM4MSw0MDI3MCwzNzM0MyxudWxsLG51bGwsMTYxNTg5LDI1NzQ1LDIwMjUwLDIwMjY0LDIwMzkyLDIwODIyLDIwODUyLDIwODkyLDIwOTY0LDIxMTUzLDIxMTYwLDIxMzA3LDIxMzI2LDIxNDU3LDIxNDY0LDIyMjQyLDIyNzY4LDIyNzg4LDIyNzkxLDIyODM0LDIyODM2LDIzMzk4LDIzNDU0LDIzNDU1LDIzNzA2LDI0MTk4LDI0NjM1LDI1OTkzLDI2NjIyLDI2NjI4LDI2NzI1LDI3OTgyLDI4ODYwLDMwMDA1LDMyNDIwLDMyNDI4LDMyNDQyLDMyNDU1LDMyNDYzLDMyNDc5LDMyNTE4LDMyNTY3LDMzNDAyLDMzNDg3LDMzNjQ3LDM1MjcwLDM1Nzc0LDM1ODEwLDM2NzEwLDM2NzExLDM2NzE4LDI5NzEzLDMxOTk2LDMyMjA1LDI2OTUwLDMxNDMzLDIxMDMxLG51bGwsbnVsbCxudWxsLG51bGwsMzcyNjAsMzA5MDQsMzcyMTQsMzI5NTYsbnVsbCwzNjEwNywzMzAxNCwxMzM2MDcsbnVsbCxudWxsLDMyOTI3LDQwNjQ3LDE5NjYxLDQwMzkzLDQwNDYwLDE5NTE4LDE3MTUxMCwxNTk3NTgsNDA0NTgsMTcyMzM5LDEzNzYxLG51bGwsMjgzMTQsMzMzNDIsMjk5NzcsbnVsbCwxODcwNSwzOTUzMiwzOTU2Nyw0MDg1NywzMTExMSwxNjQ5NzIsMTM4Njk4LDEzMjU2MCwxNDIwNTQsMjAwMDQsMjAwOTcsMjAwOTYsMjAxMDMsMjAxNTksMjAyMDMsMjAyNzksMTMzODgsMjA0MTMsMTU5NDQsMjA0ODMsMjA2MTYsMTM0MzcsMTM0NTksMTM0NzcsMjA4NzAsMjI3ODksMjA5NTUsMjA5ODgsMjA5OTcsMjAxMDUsMjExMTMsMjExMzYsMjEyODcsMTM3NjcsMjE0MTcsMTM2NDksMjE0MjQsMTM2NTEsMjE0NDIsMjE1MzksMTM2NzcsMTM2ODIsMTM5NTMsMjE2NTEsMjE2NjcsMjE2ODQsMjE2ODksMjE3MTIsMjE3NDMsMjE3ODQsMjE3OTUsMjE4MDAsMTM3MjAsMjE4MjMsMTM3MzMsMTM3NTksMjE5NzUsMTM3NjUsMTYzMjA0LDIxNzk3LG51bGwsMTM0MjEwLDEzNDQyMSwxNTE4NTEsMjE5MDQsMTQyNTM0LDE0ODI4LDEzMTkwNSwzNjQyMiwxNTA5NjgsMTY5MTg5LDE2NDY3LDE2NDAzMCwzMDU4NiwxNDIzOTIsMTQ5MDAsMTgzODksMTY0MTg5LDE1ODE5NCwxNTEwMTgsMjU4MjEsMTM0NTI0LDEzNTA5MiwxMzQzNTcsMTM1NDEyLDI1NzQxLDM2NDc4LDEzNDgwNiwxMzQxNTUsMTM1MDEyLDE0MjUwNSwxNjQ0MzgsMTQ4NjkxLG51bGwsMTM0NDcwLDE3MDU3MywxNjQwNzMsMTg0MjAsMTUxMjA3LDE0MjUzMCwzOTYwMiwxNDk1MSwxNjk0NjAsMTYzNjUsMTM1NzQsMTUyMjYzLDE2OTk0MCwxNjE5OTIsMTQyNjYwLDQwMzAyLDM4OTMzLG51bGwsMTczNjksMTU1ODEzLDI1NzgwLDIxNzMxLDE0MjY2OCwxNDIyODIsMTM1Mjg3LDE0ODQzLDEzNTI3OSwxNTc0MDIsMTU3NDYyLDE2MjIwOCwyNTgzNCwxNTE2MzQsMTM0MjExLDM2NDU2LDEzOTY4MSwxNjY3MzIsMTMyOTEzLG51bGwsMTg0NDMsMTMxNDk3LDE2Mzc4LDIyNjQzLDE0MjczMyxudWxsLDE0ODkzNiwxMzIzNDgsMTU1Nzk5LDEzNDk4OCwxMzQ1NTAsMjE4ODEsMTY1NzEsMTczMzgsbnVsbCwxOTEyNCwxNDE5MjYsMTM1MzI1LDMzMTk0LDM5MTU3LDEzNDU1NiwyNTQ2NSwxNDg0NiwxNDExNzMsMzYyODgsMjIxNzcsMjU3MjQsMTU5MzksbnVsbCwxNzM1NjksMTM0NjY1LDE0MjAzMSwxNDI1MzcsbnVsbCwxMzUzNjgsMTQ1ODU4LDE0NzM4LDE0ODU0LDE2NDUwNywxMzY4OCwxNTUyMDksMTM5NDYzLDIyMDk4LDEzNDk2MSwxNDI1MTQsMTY5NzYwLDEzNTAwLDI3NzA5LDE1MTA5OSxudWxsLG51bGwsMTYxMTQwLDE0Mjk4NywxMzk3ODQsMTczNjU5LDE2NzExNywxMzQ3NzgsMTM0MTk2LDE1NzcyNCwzMjY1OSwxMzUzNzUsMTQxMzE1LDE0MTYyNSwxMzgxOSwxNTIwMzUsMTM0Nzk2LDEzNTA1MywxMzQ4MjYsMTYyNzUsMTM0OTYwLDEzNDQ3MSwxMzU1MDMsMTM0NzMyLG51bGwsMTM0ODI3LDEzNDA1NywxMzQ0NzIsMTM1MzYwLDEzNTQ4NSwxNjM3NywxNDA5NTAsMjU2NTAsMTM1MDg1LDE0NDM3MiwxNjEzMzcsMTQyMjg2LDEzNDUyNiwxMzQ1MjcsMTQyNDE3LDE0MjQyMSwxNDg3MiwxMzQ4MDgsMTM1MzY3LDEzNDk1OCwxNzM2MTgsMTU4NTQ0LDE2NzEyMiwxNjczMjEsMTY3MTE0LDM4MzE0LDIxNzA4LDMzNDc2LDIxOTQ1LG51bGwsMTcxNzE1LDM5OTc0LDM5NjA2LDE2MTYzMCwxNDI4MzAsMjg5OTIsMzMxMzMsMzMwMDQsMjM1ODAsMTU3MDQyLDMzMDc2LDE0MjMxLDIxMzQzLDE2NDAyOSwzNzMwMiwxMzQ5MDYsMTM0NjcxLDEzNDc3NSwxMzQ5MDcsMTM3ODksMTUxMDE5LDEzODMzLDEzNDM1OCwyMjE5MSwxNDEyMzcsMTM1MzY5LDEzNDY3MiwxMzQ3NzYsMTM1Mjg4LDEzNTQ5NiwxNjQzNTksMTM2Mjc3LDEzNDc3NywxNTExMjAsMTQyNzU2LDIzMTI0LDEzNTE5NywxMzUxOTgsMTM1NDEzLDEzNTQxNCwyMjQyOCwxMzQ2NzMsMTYxNDI4LDE2NDU1NywxMzUwOTMsMTM0Nzc5LDE1MTkzNCwxNDA4MywxMzUwOTQsMTM1NTUyLDE1MjI4MCwxNzI3MzMsMTQ5OTc4LDEzNzI3NCwxNDc4MzEsMTY0NDc2LDIyNjgxLDIxMDk2LDEzODUwLDE1MzQwNSwzMTY2NiwyMzQwMCwxODQzMiwxOTI0NCw0MDc0MywxODkxOSwzOTk2NywzOTgyMSwxNTQ0ODQsMTQzNjc3LDIyMDExLDEzODEwLDIyMTUzLDIwMDA4LDIyNzg2LDEzODE3NywxOTQ2ODAsMzg3MzcsMTMxMjA2LDIwMDU5LDIwMTU1LDEzNjMwLDIzNTg3LDI0NDAxLDI0NTE2LDE0NTg2LDI1MTY0LDI1OTA5LDI3NTE0LDI3NzAxLDI3NzA2LDI4NzgwLDI5MjI3LDIwMDEyLDI5MzU3LDE0OTczNywzMjU5NCwzMTAzNSwzMTk5MywzMjU5NSwxNTYyNjYsMTM1MDUsbnVsbCwxNTY0OTEsMzI3NzAsMzI4OTYsMTU3MjAyLDE1ODAzMywyMTM0MSwzNDkxNiwzNTI2NSwxNjE5NzAsMzU3NDQsMzYxMjUsMzgwMjEsMzgyNjQsMzgyNzEsMzgzNzYsMTY3NDM5LDM4ODg2LDM5MDI5LDM5MTE4LDM5MTM0LDM5MjY3LDE3MDAwMCw0MDA2MCw0MDQ3OSw0MDY0NCwyNzUwMyw2Mzc1MSwyMDAyMywxMzEyMDcsMzg0MjksMjUxNDMsMzgwNTAsbnVsbCwyMDUzOSwyODE1OCwxNzExMjMsNDA4NzAsMTU4MTcsMzQ5NTksMTQ3NzkwLDI4NzkxLDIzNzk3LDE5MjMyLDE1MjAxMywxMzY1NywxNTQ5MjgsMjQ4NjYsMTY2NDUwLDM2Nzc1LDM3MzY2LDI5MDczLDI2MzkzLDI5NjI2LDE0NDAwMSwxNzIyOTUsMTU0OTksMTM3NjAwLDE5MjE2LDMwOTQ4LDI5Njk4LDIwOTEwLDE2NTY0NywxNjM5MywyNzIzNSwxNzI3MzAsMTY5MzEsMzQzMTksMTMzNzQzLDMxMjc0LDE3MDMxMSwxNjY2MzQsMzg3NDEsMjg3NDksMjEyODQsMTM5MzkwLDM3ODc2LDMwNDI1LDE2NjM3MSw0MDg3MSwzMDY4NSwyMDEzMSwyMDQ2NCwyMDY2OCwyMDAxNSwyMDI0Nyw0MDg3MiwyMTU1NiwzMjEzOSwyMjY3NCwyMjczNiwxMzg2NzgsMjQyMTAsMjQyMTcsMjQ1MTQsMTQxMDc0LDI1OTk1LDE0NDM3NywyNjkwNSwyNzIwMywxNDY1MzEsMjc5MDMsbnVsbCwyOTE4NCwxNDg3NDEsMjk1ODAsMTYwOTEsMTUwMDM1LDIzMzE3LDI5ODgxLDM1NzE1LDE1NDc4OCwxNTMyMzcsMzEzNzksMzE3MjQsMzE5MzksMzIzNjQsMzM1MjgsMzQxOTksNDA4NzMsMzQ5NjAsNDA4NzQsMzY1MzcsNDA4NzUsMzY4MTUsMzQxNDMsMzkzOTIsMzc0MDksNDA4NzYsMTY3MzUzLDEzNjI1NSwxNjQ5NywxNzA1OCwyMzA2NixudWxsLG51bGwsbnVsbCwzOTAxNiwyNjQ3NSwxNzAxNCwyMjMzMyxudWxsLDM0MjYyLDE0OTg4MywzMzQ3MSwxNjAwMTMsMTk1ODUsMTU5MDkyLDIzOTMxLDE1ODQ4NSwxNTk2NzgsNDA4NzcsNDA4NzgsMjM0NDYsNDA4NzksMjYzNDMsMzIzNDcsMjgyNDcsMzExNzgsMTU3NTIsMTc2MDMsMTQzOTU4LDE0MTIwNiwxNzMwNiwxNzcxOCxudWxsLDIzNzY1LDE0NjIwMiwzNTU3NywyMzY3MiwxNTYzNCwxNDQ3MjEsMjM5MjgsNDA4ODIsMjkwMTUsMTc3NTIsMTQ3NjkyLDEzODc4NywxOTU3NSwxNDcxMiwxMzM4NiwxMzE0OTIsMTU4Nzg1LDM1NTMyLDIwNDA0LDEzMTY0MSwyMjk3NSwzMzEzMiwzODk5OCwxNzAyMzQsMjQzNzksMTM0MDQ3LG51bGwsMTM5NzEzLDE2NjI1MywxNjY0MiwxODEwNywxNjgwNTcsMTYxMzUsNDA4ODMsMTcyNDY5LDE2NjMyLDE0Mjk0LDE4MTY3LDE1ODc5MCwxNjc2NCwxNjU1NTQsMTYwNzY3LDE3NzczLDE0NTQ4LDE1MjczMCwxNzc2MSwxNzY5MSwxOTg0OSwxOTU3OSwxOTgzMCwxNzg5OCwxNjMyOCwxNTAyODcsMTM5MjEsMTc2MzAsMTc1OTcsMTY4NzcsMjM4NzAsMjM4ODAsMjM4OTQsMTU4NjgsMTQzNTEsMjM5NzIsMjM5OTMsMTQzNjgsMTQzOTIsMjQxMzAsMjQyNTMsMjQzNTcsMjQ0NTEsMTQ2MDAsMTQ2MTIsMTQ2NTUsMTQ2NjksMjQ3OTEsMjQ4OTMsMjM3ODEsMTQ3MjksMjUwMTUsMjUwMTcsMjUwMzksMTQ3NzYsMjUxMzIsMjUyMzIsMjUzMTcsMjUzNjgsMTQ4NDAsMjIxOTMsMTQ4NTEsMjU1NzAsMjU1OTUsMjU2MDcsMjU2OTAsMTQ5MjMsMjU3OTIsMjM4MjksMjIwNDksNDA4NjMsMTQ5OTksMjU5OTAsMTUwMzcsMjYxMTEsMjYxOTUsMTUwOTAsMjYyNTgsMTUxMzgsMjYzOTAsMTUxNzAsMjY1MzIsMjY2MjQsMTUxOTIsMjY2OTgsMjY3NTYsMTUyMTgsMTUyMTcsMTUyMjcsMjY4ODksMjY5NDcsMjkyNzYsMjY5ODAsMjcwMzksMjcwMTMsMTUyOTIsMjcwOTQsMTUzMjUsMjcyMzcsMjcyNTIsMjcyNDksMjcyNjYsMTUzNDAsMjcyODksMTUzNDYsMjczMDcsMjczMTcsMjczNDgsMjczODIsMjc1MjEsMjc1ODUsMjc2MjYsMjc3NjUsMjc4MTgsMTU1NjMsMjc5MDYsMjc5MTAsMjc5NDIsMjgwMzMsMTU1OTksMjgwNjgsMjgwODEsMjgxODEsMjgxODQsMjgyMDEsMjgyOTQsMTY2MzM2LDI4MzQ3LDI4Mzg2LDI4Mzc4LDQwODMxLDI4MzkyLDI4MzkzLDI4NDUyLDI4NDY4LDE1Njg2LDE0NzI2NSwyODU0NSwyODYwNiwxNTcyMiwxNTczMywyOTExMSwyMzcwNSwxNTc1NCwyODcxNiwxNTc2MSwyODc1MiwyODc1NiwyODc4MywyODc5OSwyODgwOSwxMzE4NzcsMTczNDUsMTM4MDksMTM0ODcyLDE0NzE1OSwyMjQ2MiwxNTk0NDMsMjg5OTAsMTUzNTY4LDEzOTAyLDI3MDQyLDE2Njg4OSwyMzQxMiwzMTMwNSwxNTM4MjUsMTY5MTc3LDMxMzMzLDMxMzU3LDE1NDAyOCwzMTQxOSwzMTQwOCwzMTQyNiwzMTQyNywyOTEzNywxNTY4MTMsMTY4NDIsMzE0NTAsMzE0NTMsMzE0NjYsMTY4NzksMjE2ODIsMTU0NjI1LDMxNDk5LDMxNTczLDMxNTI5LDE1MjMzNCwxNTQ4NzgsMzE2NTAsMzE1OTksMzM2OTIsMTU0NTQ4LDE1ODg0NywzMTY5NiwzMzgyNSwzMTYzNCwzMTY3MiwxNTQ5MTIsMTU3ODksMTU0NzI1LDMzOTM4LDMxNzM4LDMxNzUwLDMxNzk3LDE1NDgxNywzMTgxMiwzMTg3NSwxNDk2MzQsMzE5MTAsMjYyMzcsMTQ4ODU2LDMxOTQ1LDMxOTQzLDMxOTc0LDMxODYwLDMxOTg3LDMxOTg5LDMxOTUwLDMyMzU5LDE3NjkzLDE1OTMwMCwzMjA5MywxNTk0NDYsMjk4MzcsMzIxMzcsMzIxNzEsMjg5ODEsMzIxNzksMzIyMTAsMTQ3NTQzLDE1NTY4OSwzMjIyOCwxNTYzNSwzMjI0NSwxMzcyMDksMzIyMjksMTY0NzE3LDMyMjg1LDE1NTkzNywxNTU5OTQsMzIzNjYsMzI0MDIsMTcxOTUsMzc5OTYsMzIyOTUsMzI1NzYsMzI1NzcsMzI1ODMsMzEwMzAsMTU2MzY4LDM5MzkzLDMyNjYzLDE1NjQ5NywzMjY3NSwxMzY4MDEsMTMxMTc2LDE3NzU2LDE0NTI1NCwxNzY2NywxNjQ2NjYsMzI3NjIsMTU2ODA5LDMyNzczLDMyNzc2LDMyNzk3LDMyODA4LDMyODE1LDE3MjE2NywxNTg5MTUsMzI4MjcsMzI4MjgsMzI4NjUsMTQxMDc2LDE4ODI1LDE1NzIyMiwxNDY5MTUsMTU3NDE2LDI2NDA1LDMyOTM1LDE2NjQ3MiwzMzAzMSwzMzA1MCwyMjcwNCwxNDEwNDYsMjc3NzUsMTU2ODI0LDE1MTQ4MCwyNTgzMSwxMzYzMzAsMzMzMDQsMTM3MzEwLDI3MjE5LDE1MDExNywxNTAxNjUsMTc1MzAsMzMzMjEsMTMzOTAxLDE1ODI5MCwxNDY4MTQsMjA0NzMsMTM2NDQ1LDM0MDE4LDMzNjM0LDE1ODQ3NCwxNDk5MjcsMTQ0Njg4LDEzNzA3NSwxNDY5MzYsMzM0NTAsMjY5MDcsMTk0OTY0LDE2ODU5LDM0MTIzLDMzNDg4LDMzNTYyLDEzNDY3OCwxMzcxNDAsMTQwMTcsMTQzNzQxLDE0NDczMCwzMzQwMywzMzUwNiwzMzU2MCwxNDcwODMsMTU5MTM5LDE1ODQ2OSwxNTg2MTUsMTQ0ODQ2LDE1ODA3LDMzNTY1LDIxOTk2LDMzNjY5LDE3Njc1LDE1OTE0MSwzMzcwOCwzMzcyOSwzMzc0NywxMzQzOCwxNTk0NDQsMjcyMjMsMzQxMzgsMTM0NjIsMTU5Mjk4LDE0MzA4NywzMzg4MCwxNTQ1OTYsMzM5MDUsMTU4MjcsMTc2MzYsMjczMDMsMzM4NjYsMTQ2NjEzLDMxMDY0LDMzOTYwLDE1ODYxNCwxNTkzNTEsMTU5Mjk5LDM0MDE0LDMzODA3LDMzNjgxLDE3NTY4LDMzOTM5LDM0MDIwLDE1NDc2OSwxNjk2MCwxNTQ4MTYsMTc3MzEsMzQxMDAsMjMyODIsMTU5Mzg1LDE3NzAzLDM0MTYzLDE3Njg2LDI2NTU5LDM0MzI2LDE2NTQxMywxNjU0MzUsMzQyNDEsMTU5ODgwLDM0MzA2LDEzNjU3OCwxNTk5NDksMTk0OTk0LDE3NzcwLDM0MzQ0LDEzODk2LDEzNzM3OCwyMTQ5NSwxNjA2NjYsMzQ0MzAsMzQ2NzMsMTcyMjgwLDM0Nzk4LDE0MjM3NSwzNDczNywzNDc3OCwzNDgzMSwyMjExMywzNDQxMiwyNjcxMCwxNzkzNSwzNDg4NSwzNDg4NiwxNjEyNDgsMTQ2ODczLDE2MTI1MiwzNDkxMCwzNDk3MiwxODAxMSwzNDk5NiwzNDk5NywyNTUzNywzNTAxMywzMDU4MywxNjE1NTEsMzUyMDcsMzUyMTAsMzUyMzgsMzUyNDEsMzUyMzksMzUyNjAsMTY2NDM3LDM1MzAzLDE2MjA4NCwxNjI0OTMsMzU0ODQsMzA2MTEsMzczNzQsMzU0NzIsMTYyMzkzLDMxNDY1LDE2MjYxOCwxNDczNDMsMTgxOTUsMTYyNjE2LDI5MDUyLDM1NTk2LDM1NjE1LDE1MjYyNCwxNTI5MzMsMzU2NDcsMzU2NjAsMzU2NjEsMzU0OTcsMTUwMTM4LDM1NzI4LDM1NzM5LDM1NTAzLDEzNjkyNywxNzk0MSwzNDg5NSwzNTk5NSwxNjMxNTYsMTYzMjE1LDE5NTAyOCwxNDExNywxNjMxNTUsMzYwNTQsMTYzMjI0LDE2MzI2MSwzNjExNCwzNjA5OSwxMzc0ODgsMzYwNTksMjg3NjQsMzYxMTMsMTUwNzI5LDE2MDgwLDM2MjE1LDM2MjY1LDE2Mzg0MiwxMzUxODgsMTQ5ODk4LDE1MjI4LDE2NDI4NCwxNjAwMTIsMzE0NjMsMzY1MjUsMzY1MzQsMzY1NDcsMzc1ODgsMzY2MzMsMzY2NTMsMTY0NzA5LDE2NDg4MiwzNjc3MywzNzYzNSwxNzI3MDMsMTMzNzEyLDM2Nzg3LDE4NzMwLDE2NjM2NiwxNjUxODEsMTQ2ODc1LDI0MzEyLDE0Mzk3MCwzNjg1NywxNzIwNTIsMTY1NTY0LDE2NTEyMSwxNDAwNjksMTQ3MjAsMTU5NDQ3LDM2OTE5LDE2NTE4MCwxNjI0OTQsMzY5NjEsMTY1MjI4LDE2NTM4NywzNzAzMiwxNjU2NTEsMzcwNjAsMTY1NjA2LDM3MDM4LDM3MTE3LDM3MjIzLDE1MDg4LDM3Mjg5LDM3MzE2LDMxOTE2LDE2NjE5NSwxMzg4ODksMzczOTAsMjc4MDcsMzc0NDEsMzc0NzQsMTUzMDE3LDM3NTYxLDE2NjU5OCwxNDY1ODcsMTY2NjY4LDE1MzA1MSwxMzQ0NDksMzc2NzYsMzc3MzksMTY2NjI1LDE2Njg5MSwyODgxNSwyMzIzNSwxNjY2MjYsMTY2NjI5LDE4Nzg5LDM3NDQ0LDE2Njg5MiwxNjY5NjksMTY2OTExLDM3NzQ3LDM3OTc5LDM2NTQwLDM4Mjc3LDM4MzEwLDM3OTI2LDM4MzA0LDI4NjYyLDE3MDgxLDE0MDkyMiwxNjU1OTIsMTM1ODA0LDE0Njk5MCwxODkxMSwyNzY3NiwzODUyMywzODU1MCwxNjc0OCwzODU2MywxNTk0NDUsMjUwNTAsMzg1ODIsMzA5NjUsMTY2NjI0LDM4NTg5LDIxNDUyLDE4ODQ5LDE1ODkwNCwxMzE3MDAsMTU2Njg4LDE2ODExMSwxNjgxNjUsMTUwMjI1LDEzNzQ5MywxNDQxMzgsMzg3MDUsMzQzNzAsMzg3MTAsMTg5NTksMTc3MjUsMTc3OTcsMTUwMjQ5LDI4Nzg5LDIzMzYxLDM4NjgzLDM4NzQ4LDE2ODQwNSwzODc0MywyMzM3MCwxNjg0MjcsMzg3NTEsMzc5MjUsMjA2ODgsMTQzNTQzLDE0MzU0OCwzODc5MywzODgxNSwzODgzMywzODg0NiwzODg0OCwzODg2NiwzODg4MCwxNTI2ODQsMzg4OTQsMjk3MjQsMTY5MDExLDM4OTExLDM4OTAxLDE2ODk4OSwxNjIxNzAsMTkxNTMsMzg5NjQsMzg5NjMsMzg5ODcsMzkwMTQsMTUxMTgsMTYwMTE3LDE1Njk3LDEzMjY1NiwxNDc4MDQsMTUzMzUwLDM5MTE0LDM5MDk1LDM5MTEyLDM5MTExLDE5MTk5LDE1OTAxNSwxMzY5MTUsMjE5MzYsMzkxMzcsMzkxNDIsMzkxNDgsMzc3NTIsMzkyMjUsMTUwMDU3LDE5MzE0LDE3MDA3MSwxNzAyNDUsMzk0MTMsMzk0MzYsMzk0ODMsMzk0NDAsMzk1MTIsMTUzMzgxLDE0MDIwLDE2ODExMywxNzA5NjUsMzk2NDgsMzk2NTAsMTcwNzU3LDM5NjY4LDE5NDcwLDM5NzAwLDM5NzI1LDE2NTM3NiwyMDUzMiwzOTczMiwxNTgxMjAsMTQ1MzEsMTQzNDg1LDM5NzYwLDM5NzQ0LDE3MTMyNiwyMzEwOSwxMzczMTUsMzk4MjIsMTQ4MDQzLDM5OTM4LDM5OTM1LDM5OTQ4LDE3MTYyNCw0MDQwNCwxNzE5NTksMTcyNDM0LDE3MjQ1OSwxNzIyNTcsMTcyMzIzLDE3MjUxMSw0MDMxOCw0MDMyMywxNzIzNDAsNDA0NjIsMjY3NjAsNDAzODgsMTM5NjExLDE3MjQzNSwxNzI1NzYsMTM3NTMxLDE3MjU5NSw0MDI0OSwxNzIyMTcsMTcyNzI0LDQwNTkyLDQwNTk3LDQwNjA2LDQwNjEwLDE5NzY0LDQwNjE4LDQwNjIzLDE0ODMyNCw0MDY0MSwxNTIwMCwxNDgyMSwxNTY0NSwyMDI3NCwxNDI3MCwxNjY5NTUsNDA3MDYsNDA3MTIsMTkzNTAsMzc5MjQsMTU5MTM4LDQwNzI3LDQwNzI2LDQwNzYxLDIyMTc1LDIyMTU0LDQwNzczLDM5MzUyLDE2ODA3NSwzODg5OCwzMzkxOSw0MDgwMiw0MDgwOSwzMTQ1Miw0MDg0NiwyOTIwNiwxOTM5MCwxNDk4NzcsMTQ5OTQ3LDI5MDQ3LDE1MDAwOCwxNDgyOTYsMTUwMDk3LDI5NTk4LDE2Njg3NCwxMzc0NjYsMzExMzUsMTY2MjcwLDE2NzQ3OCwzNzczNywzNzg3NSwxNjY0NjgsMzc2MTIsMzc3NjEsMzc4MzUsMTY2MjUyLDE0ODY2NSwyOTIwNywxNjEwNywzMDU3OCwzMTI5OSwyODg4MCwxNDg1OTUsMTQ4NDcyLDI5MDU0LDEzNzE5OSwyODgzNSwxMzc0MDYsMTQ0NzkzLDE2MDcxLDEzNzM0OSwxNTI2MjMsMTM3MjA4LDE0MTE0LDEzNjk1NSwxMzcyNzMsMTQwNDksMTM3MDc2LDEzNzQyNSwxNTU0NjcsMTQxMTUsMTM2ODk2LDIyMzYzLDE1MDA1MywxMzYxOTAsMTM1ODQ4LDEzNjEzNCwxMzYzNzQsMzQwNTEsMTQ1MDYyLDM0MDUxLDMzODc3LDE0OTkwOCwxNjAxMDEsMTQ2OTkzLDE1MjkyNCwxNDcxOTUsMTU5ODI2LDE3NjUyLDE0NTEzNCwxNzAzOTcsMTU5NTI2LDI2NjE3LDE0MTMxLDE1MzgxLDE1ODQ3LDIyNjM2LDEzNzUwNiwyNjY0MCwxNjQ3MSwxNDUyMTUsMTQ3NjgxLDE0NzU5NSwxNDc3MjcsMTU4NzUzLDIxNzA3LDIyMTc0LDE1NzM2MSwyMjE2MiwxMzUxMzUsMTM0MDU2LDEzNDY2OSwzNzgzMCwxNjY2NzUsMzc3ODgsMjAyMTYsMjA3NzksMTQzNjEsMTQ4NTM0LDIwMTU2LDEzMjE5NywxMzE5NjcsMjAyOTksMjAzNjIsMTUzMTY5LDIzMTQ0LDEzMTQ5OSwxMzIwNDMsMTQ3NDUsMTMxODUwLDEzMjExNiwxMzM2NSwyMDI2NSwxMzE3NzYsMTY3NjAzLDEzMTcwMSwzNTU0NiwxMzE1OTYsMjAxMjAsMjA2ODUsMjA3NDksMjAzODYsMjAyMjcsMTUwMDMwLDE0NzA4MiwyMDI5MCwyMDUyNiwyMDU4OCwyMDYwOSwyMDQyOCwyMDQ1MywyMDU2OCwyMDczMiwyMDgyNSwyMDgyNywyMDgyOSwyMDgzMCwyODI3OCwxNDQ3ODksMTQ3MDAxLDE0NzEzNSwyODAxOCwxMzczNDgsMTQ3MDgxLDIwOTA0LDIwOTMxLDEzMjU3NiwxNzYyOSwxMzIyNTksMTMyMjQyLDEzMjI0MSwzNjIxOCwxNjY1NTYsMTMyODc4LDIxMDgxLDIxMTU2LDEzMzIzNSwyMTIxNywzNzc0MiwxODA0MiwyOTA2OCwxNDgzNjQsMTM0MTc2LDE0OTkzMiwxMzUzOTYsMjcwODksMTM0Njg1LDI5ODE3LDE2MDk0LDI5ODQ5LDI5NzE2LDI5NzgyLDI5NTkyLDE5MzQyLDE1MDIwNCwxNDc1OTcsMjE0NTYsMTM3MDAsMjkxOTksMTQ3NjU3LDIxOTQwLDEzMTkwOSwyMTcwOSwxMzQwODYsMjIzMDEsMzc0NjksMzg2NDQsMzc3MzQsMjI0OTMsMjI0MTMsMjIzOTksMTM4ODYsMjI3MzEsMjMxOTMsMTY2NDcwLDEzNjk1NCwxMzcwNzEsMTM2OTc2LDIzMDg0LDIyOTY4LDM3NTE5LDIzMTY2LDIzMjQ3LDIzMDU4LDE1MzkyNiwxMzc3MTUsMTM3MzEzLDE0ODExNywxNDA2OSwyNzkwOSwyOTc2MywyMzA3MywxNTUyNjcsMjMxNjksMTY2ODcxLDEzMjExNSwzNzg1NiwyOTgzNiwxMzU5MzksMjg5MzMsMTg4MDIsMzc4OTYsMTY2Mzk1LDM3ODIxLDE0MjQwLDIzNTgyLDIzNzEwLDI0MTU4LDI0MTM2LDEzNzYyMiwxMzc1OTYsMTQ2MTU4LDI0MjY5LDIzMzc1LDEzNzQ3NSwxMzc0NzYsMTQwODEsMTM3Mzc2LDE0MDQ1LDEzNjk1OCwxNDAzNSwzMzA2NiwxNjY0NzEsMTM4NjgyLDE0NDQ5OCwxNjYzMTIsMjQzMzIsMjQzMzQsMTM3NTExLDEzNzEzMSwyMzE0NywxMzcwMTksMjMzNjQsMzQzMjQsMTYxMjc3LDM0OTEyLDI0NzAyLDE0MTQwOCwxNDA4NDMsMjQ1MzksMTYwNTYsMTQwNzE5LDE0MDczNCwxNjgwNzIsMTU5NjAzLDI1MDI0LDEzMTEzNCwxMzExNDIsMTQwODI3LDI0OTg1LDI0OTg0LDI0NjkzLDE0MjQ5MSwxNDI1OTksMTQ5MjA0LDE2ODI2OSwyNTcxMywxNDkwOTMsMTQyMTg2LDE0ODg5LDE0MjExNCwxNDQ0NjQsMTcwMjE4LDE0Mjk2OCwyNTM5OSwxNzMxNDcsMjU3ODIsMjUzOTMsMjU1NTMsMTQ5OTg3LDE0MjY5NSwyNTI1MiwxNDI0OTcsMjU2NTksMjU5NjMsMjY5OTQsMTUzNDgsMTQzNTAyLDE0NDA0NSwxNDk4OTcsMTQ0MDQzLDIxNzczLDE0NDA5NiwxMzc0MzMsMTY5MDIzLDI2MzE4LDE0NDAwOSwxNDM3OTUsMTUwNzIsMTY3ODQsMTUyOTY0LDE2NjY5MCwxNTI5NzUsMTM2OTU2LDE1MjkyMywxNTI2MTMsMzA5NTgsMTQzNjE5LDEzNzI1OCwxNDM5MjQsMTM0MTIsMTQzODg3LDE0Mzc0NiwxNDgxNjksMjYyNTQsMTU5MDEyLDI2MjE5LDE5MzQ3LDI2MTYwLDE2MTkwNCwxMzg3MzEsMjYyMTEsMTQ0MDgyLDE0NDA5NywyNjE0MiwxNTM3MTQsMTQ1NDUsMTQ1NDY2LDE0NTM0MCwxNTI1NywxNDUzMTQsMTQ0MzgyLDI5OTA0LDE1MjU0LDI2NTExLDE0OTAzNCwyNjgwNiwyNjY1NCwxNTMwMCwyNzMyNiwxNDQzNSwxNDUzNjUsMTQ4NjE1LDI3MTg3LDI3MjE4LDI3MzM3LDI3Mzk3LDEzNzQ5MCwyNTg3MywyNjc3NiwyNzIxMiwxNTMxOSwyNzI1OCwyNzQ3OSwxNDczOTIsMTQ2NTg2LDM3NzkyLDM3NjE4LDE2Njg5MCwxNjY2MDMsMzc1MTMsMTYzODcwLDE2NjM2NCwzNzk5MSwyODA2OSwyODQyNywxNDk5OTYsMjgwMDcsMTQ3MzI3LDE1NzU5LDI4MTY0LDE0NzUxNiwyMzEwMSwyODE3MCwyMjU5OSwyNzk0MCwzMDc4NiwyODk4NywxNDgyNTAsMTQ4MDg2LDI4OTEzLDI5MjY0LDI5MzE5LDI5MzMyLDE0OTM5MSwxNDkyODUsMjA4NTcsMTUwMTgwLDEzMjU4NywyOTgxOCwxNDcxOTIsMTQ0OTkxLDE1MDA5MCwxNDk3ODMsMTU1NjE3LDE2MTM0LDE2MDQ5LDE1MDIzOSwxNjY5NDcsMTQ3MjUzLDI0NzQzLDE2MTE1LDI5OTAwLDI5NzU2LDM3NzY3LDI5NzUxLDE3NTY3LDE1OTIxMCwxNzc0NSwzMDA4MywxNjIyNywxNTA3NDUsMTUwNzkwLDE2MjE2LDMwMDM3LDMwMzIzLDE3MzUxMCwxNTEyOSwyOTgwMCwxNjY2MDQsMTQ5OTMxLDE0OTkwMiwxNTA5OSwxNTgyMSwxNTAwOTQsMTYxMjcsMTQ5OTU3LDE0OTc0NywzNzM3MCwyMjMyMiwzNzY5OCwxNjY2MjcsMTM3MzE2LDIwNzAzLDE1MjA5NywxNTIwMzksMzA1ODQsMTQzOTIyLDMwNDc4LDMwNDc5LDMwNTg3LDE0OTE0MywxNDUyODEsMTQ5NDIsMTQ5NzQ0LDI5NzUyLDI5ODUxLDE2MDYzLDE1MDIwMiwxNTAyMTUsMTY1ODQsMTUwMTY2LDE1NjA3OCwzNzYzOSwxNTI5NjEsMzA3NTAsMzA4NjEsMzA4NTYsMzA5MzAsMjk2NDgsMzEwNjUsMTYxNjAxLDE1MzMxNSwxNjY1NCwzMTEzMSwzMzk0MiwzMTE0MSwyNzE4MSwxNDcxOTQsMzEyOTAsMzEyMjAsMTY3NTAsMTM2OTM0LDE2NjkwLDM3NDI5LDMxMjE3LDEzNDQ3NiwxNDk5MDAsMTMxNzM3LDE0Njg3NCwxMzcwNzAsMTM3MTksMjE4NjcsMTM2ODAsMTM5OTQsMTMxNTQwLDEzNDE1NywzMTQ1OCwyMzEyOSwxNDEwNDUsMTU0Mjg3LDE1NDI2OCwyMzA1MywxMzE2NzUsMzA5NjAsMjMwODIsMTU0NTY2LDMxNDg2LDE2ODg5LDMxODM3LDMxODUzLDE2OTEzLDE1NDU0NywxNTUzMjQsMTU1MzAyLDMxOTQ5LDE1MDAwOSwxMzcxMzYsMzE4ODYsMzE4NjgsMzE5MTgsMjczMTQsMzIyMjAsMzIyNjMsMzIyMTEsMzI1OTAsMTU2MjU3LDE1NTk5NiwxNjI2MzIsMzIxNTEsMTU1MjY2LDE3MDAyLDE1ODU4MSwxMzMzOTgsMjY1ODIsMTMxMTUwLDE0NDg0NywyMjQ2OCwxNTY2OTAsMTU2NjY0LDE0OTg1OCwzMjczMywzMTUyNywxMzMxNjQsMTU0MzQ1LDE1NDk0NywzMTUwMCwxNTUxNTAsMzkzOTgsMzQzNzMsMzk1MjMsMjcxNjQsMTQ0NDQ3LDE0ODE4LDE1MDAwNywxNTcxMDEsMzk0NTUsMTU3MDg4LDMzOTIwLDE2MDAzOSwxNTg5MjksMTc2NDIsMzMwNzksMTc0MTAsMzI5NjYsMzMwMzMsMzMwOTAsMTU3NjIwLDM5MTA3LDE1ODI3NCwzMzM3OCwzMzM4MSwxNTgyODksMzM4NzUsMTU5MTQzLDM0MzIwLDE2MDI4MywyMzE3NCwxNjc2NywxMzcyODAsMjMzMzksMTM3Mzc3LDIzMjY4LDEzNzQzMiwzNDQ2NCwxOTUwMDQsMTQ2ODMxLDM0ODYxLDE2MDgwMiwyMzA0MiwzNDkyNiwyMDI5MywzNDk1MSwzNTAwNywzNTA0NiwzNTE3MywzNTE0OSwxNTMyMTksMzUxNTYsMTYxNjY5LDE2MTY2OCwxNjY5MDEsMTY2ODczLDE2NjgxMiwxNjYzOTMsMTYwNDUsMzM5NTUsMTgxNjUsMTgxMjcsMTQzMjIsMzUzODksMzUzNTYsMTY5MDMyLDI0Mzk3LDM3NDE5LDE0ODEwMCwyNjA2OCwyODk2OSwyODg2OCwxMzcyODUsNDAzMDEsMzU5OTksMzYwNzMsMTYzMjkyLDIyOTM4LDMwNjU5LDIzMDI0LDE3MjYyLDE0MDM2LDM2Mzk0LDM2NTE5LDE1MDUzNywzNjY1NiwzNjY4MiwxNzE0MCwyNzczNiwyODYwMywxNDAwNjUsMTg1ODcsMjg1MzcsMjgyOTksMTM3MTc4LDM5OTEzLDE0MDA1LDE0OTgwNywzNzA1MSwzNzAxNSwyMTg3MywxODY5NCwzNzMwNywzNzg5MiwxNjY0NzUsMTY0ODIsMTY2NjUyLDM3OTI3LDE2Njk0MSwxNjY5NzEsMzQwMjEsMzUzNzEsMzgyOTcsMzgzMTEsMzgyOTUsMzgyOTQsMTY3MjIwLDI5NzY1LDE2MDY2LDE0OTc1OSwxNTAwODIsMTQ4NDU4LDE2MTAzLDE0MzkwOSwzODU0MywxNjc2NTUsMTY3NTI2LDE2NzUyNSwxNjA3NiwxNDk5OTcsMTUwMTM2LDE0NzQzOCwyOTcxNCwyOTgwMywxNjEyNCwzODcyMSwxNjgxMTIsMjY2OTUsMTg5NzMsMTY4MDgzLDE1MzU2NywzODc0OSwzNzczNiwxNjYyODEsMTY2OTUwLDE2NjcwMywxNTY2MDYsMzc1NjIsMjMzMTMsMzU2ODksMTg3NDgsMjk2ODksMTQ3OTk1LDM4ODExLDM4NzY5LDM5MjI0LDEzNDk1MCwyNDAwMSwxNjY4NTMsMTUwMTk0LDM4OTQzLDE2OTE3OCwzNzYyMiwxNjk0MzEsMzczNDksMTc2MDAsMTY2NzM2LDE1MDExOSwxNjY3NTYsMzkxMzIsMTY2NDY5LDE2MTI4LDM3NDE4LDE4NzI1LDMzODEyLDM5MjI3LDM5MjQ1LDE2MjU2NiwxNTg2OSwzOTMyMywxOTMxMSwzOTMzOCwzOTUxNiwxNjY3NTcsMTUzODAwLDI3Mjc5LDM5NDU3LDIzMjk0LDM5NDcxLDE3MDIyNSwxOTM0NCwxNzAzMTIsMzkzNTYsMTkzODksMTkzNTEsMzc3NTcsMjI2NDIsMTM1OTM4LDIyNTYyLDE0OTk0NCwxMzY0MjQsMzA3ODgsMTQxMDg3LDE0Njg3MiwyNjgyMSwxNTc0MSwzNzk3NiwxNDYzMSwyNDkxMiwxNDExODUsMTQxNjc1LDI0ODM5LDQwMDE1LDQwMDE5LDQwMDU5LDM5OTg5LDM5OTUyLDM5ODA3LDM5ODg3LDE3MTU2NSwzOTgzOSwxNzI1MzMsMTcyMjg2LDQwMjI1LDE5NjMwLDE0NzcxNiw0MDQ3MiwxOTYzMiw0MDIwNCwxNzI0NjgsMTcyMjY5LDE3MjI3NSwxNzAyODcsNDAzNTcsMzM5ODEsMTU5MjUwLDE1OTcxMSwxNTg1OTQsMzQzMDAsMTc3MTUsMTU5MTQwLDE1OTM2NCwxNTkyMTYsMzM4MjQsMzQyODYsMTU5MjMyLDE0NTM2NywxNTU3NDgsMzEyMDIsMTQ0Nzk2LDE0NDk2MCwxODczMywxNDk5ODIsMTU3MTQsMzc4NTEsMzc1NjYsMzc3MDQsMTMxNzc1LDMwOTA1LDM3NDk1LDM3OTY1LDIwNDUyLDEzMzc2LDM2OTY0LDE1MjkyNSwzMDc4MSwzMDgwNCwzMDkwMiwzMDc5NSwxMzcwNDcsMTQzODE3LDE0OTgyNSwxMzk3OCwyMDMzOCwyODYzNCwyODYzMywyODcwMiwyODcwMiwyMTUyNCwxNDc4OTMsMjI0NTksMjI3NzEsMjI0MTAsNDAyMTQsMjI0ODcsMjg5ODAsMTM0ODcsMTQ3ODg0LDI5MTYzLDE1ODc4NCwxNTE0NDcsMjMzMzYsMTM3MTQxLDE2NjQ3MywyNDg0NCwyMzI0NiwyMzA1MSwxNzA4NCwxNDg2MTYsMTQxMjQsMTkzMjMsMTY2Mzk2LDM3ODE5LDM3ODE2LDEzNzQzMCwxMzQ5NDEsMzM5MDYsMTU4OTEyLDEzNjIxMSwxNDgyMTgsMTQyMzc0LDE0ODQxNywyMjkzMiwxNDY4NzEsMTU3NTA1LDMyMTY4LDE1NTk5NSwxNTU4MTIsMTQ5OTQ1LDE0OTg5OSwxNjYzOTQsMzc2MDUsMjk2NjYsMTYxMDUsMjk4NzYsMTY2NzU1LDEzNzM3NSwxNjA5NywxNTAxOTUsMjczNTIsMjk2ODMsMjk2OTEsMTYwODYsMTUwMDc4LDE1MDE2NCwxMzcxNzcsMTUwMTE4LDEzMjAwNywxMzYyMjgsMTQ5OTg5LDI5NzY4LDE0OTc4MiwyODgzNywxNDk4NzgsMzc1MDgsMjk2NzAsMzc3MjcsMTMyMzUwLDM3NjgxLDE2NjYwNiwxNjY0MjIsMzc3NjYsMTY2ODg3LDE1MzA0NSwxODc0MSwxNjY1MzAsMjkwMzUsMTQ5ODI3LDEzNDM5OSwyMjE4MCwxMzI2MzQsMTM0MTIzLDEzNDMyOCwyMTc2MiwzMTE3MiwxMzcyMTAsMzIyNTQsMTM2ODk4LDE1MDA5NiwxMzcyOTgsMTc3MTAsMzc4ODksMTQwOTAsMTY2NTkyLDE0OTkzMywyMjk2MCwxMzc0MDcsMTM3MzQ3LDE2MDkwMCwyMzIwMSwxNDA1MCwxNDY3NzksMTQwMDAsMzc0NzEsMjMxNjEsMTY2NTI5LDEzNzMxNCwzNzc0OCwxNTU2NSwxMzM4MTIsMTkwOTQsMTQ3MzAsMjA3MjQsMTU3MjEsMTU2OTIsMTM2MDkyLDI5MDQ1LDE3MTQ3LDE2NDM3NiwyODE3NSwxNjgxNjQsMTc2NDMsMjc5OTEsMTYzNDA3LDI4Nzc1LDI3ODIzLDE1NTc0LDE0NzQzNywxNDY5ODksMjgxNjIsMjg0MjgsMTU3MjcsMTMyMDg1LDMwMDMzLDE0MDEyLDEzNTEyLDE4MDQ4LDE2MDkwLDE4NTQ1LDIyOTgwLDM3NDg2LDE4NzUwLDM2NjczLDE2Njk0MCwxNTg2NTYsMjI1NDYsMjI0NzIsMTQwMzgsMTM2Mjc0LDI4OTI2LDE0ODMyMiwxNTAxMjksMTQzMzMxLDEzNTg1NiwxNDAyMjEsMjY4MDksMjY5ODMsMTM2MDg4LDE0NDYxMywxNjI4MDQsMTQ1MTE5LDE2NjUzMSwxNDUzNjYsMTQ0Mzc4LDE1MDY4NywyNzE2MiwxNDUwNjksMTU4OTAzLDMzODU0LDE3NjMxLDE3NjE0LDE1OTAxNCwxNTkwNTcsMTU4ODUwLDE1OTcxMCwyODQzOSwxNjAwMDksMzM1OTcsMTM3MDE4LDMzNzczLDE1ODg0OCwxNTk4MjcsMTM3MTc5LDIyOTIxLDIzMTcwLDEzNzEzOSwyMzEzNywyMzE1MywxMzc0NzcsMTQ3OTY0LDE0MTI1LDIzMDIzLDEzNzAyMCwxNDAyMywyOTA3MCwzNzc3NiwyNjI2NiwxNDgxMzMsMjMxNTAsMjMwODMsMTQ4MTE1LDI3MTc5LDE0NzE5MywxNjE1OTAsMTQ4NTcxLDE0ODE3MCwyODk1NywxNDgwNTcsMTY2MzY5LDIwNDAwLDE1OTAxNiwyMzc0NiwxNDg2ODYsMTYzNDA1LDE0ODQxMywyNzE0OCwxNDgwNTQsMTM1OTQwLDI4ODM4LDI4OTc5LDE0ODQ1NywxNTc4MSwyNzg3MSwxOTQ1OTcsMTUwMDk1LDMyMzU3LDIzMDE5LDIzODU1LDE1ODU5LDI0NDEyLDE1MDEwOSwxMzcxODMsMzIxNjQsMzM4MzAsMjE2MzcsMTQ2MTcwLDE0NDEyOCwxMzE2MDQsMjIzOTgsMTMzMzMzLDEzMjYzMywxNjM1NywxMzkxNjYsMTcyNzI2LDI4Njc1LDE2ODI4MywyMzkyMCwyOTU4MywzMTk1NSwxNjY0ODksMTY4OTkyLDIwNDI0LDMyNzQzLDI5Mzg5LDI5NDU2LDE2MjU0OCwyOTQ5NiwyOTQ5NywxNTMzMzQsMjk1MDUsMjk1MTIsMTYwNDEsMTYyNTg0LDM2OTcyLDI5MTczLDE0OTc0NiwyOTY2NSwzMzI3MCwxNjA3NCwzMDQ3NiwxNjA4MSwyNzgxMCwyMjI2OSwyOTcyMSwyOTcyNiwyOTcyNywxNjA5OCwxNjExMiwxNjExNiwxNjEyMiwyOTkwNywxNjE0MiwxNjIxMSwzMDAxOCwzMDA2MSwzMDA2NiwzMDA5MywxNjI1MiwzMDE1MiwzMDE3MiwxNjMyMCwzMDI4NSwxNjM0MywzMDMyNCwxNjM0OCwzMDMzMCwxNTEzODgsMjkwNjQsMjIwNTEsMzUyMDAsMjI2MzMsMTY0MTMsMzA1MzEsMTY0NDEsMjY0NjUsMTY0NTMsMTM3ODcsMzA2MTYsMTY0OTAsMTY0OTUsMjM2NDYsMzA2NTQsMzA2NjcsMjI3NzAsMzA3NDQsMjg4NTcsMzA3NDgsMTY1NTIsMzA3NzcsMzA3OTEsMzA4MDEsMzA4MjIsMzM4NjQsMTUyODg1LDMxMDI3LDI2NjI3LDMxMDI2LDE2NjQzLDE2NjQ5LDMxMTIxLDMxMTI5LDM2Nzk1LDMxMjM4LDM2Nzk2LDE2NzQzLDMxMzc3LDE2ODE4LDMxNDIwLDMzNDAxLDE2ODM2LDMxNDM5LDMxNDUxLDE2ODQ3LDIwMDAxLDMxNTg2LDMxNTk2LDMxNjExLDMxNzYyLDMxNzcxLDE2OTkyLDE3MDE4LDMxODY3LDMxOTAwLDE3MDM2LDMxOTI4LDE3MDQ0LDMxOTgxLDM2NzU1LDI4ODY0LDEzNDM1MSwzMjIwNywzMjIxMiwzMjIwOCwzMjI1MywzMjY4NiwzMjY5MiwyOTM0MywxNzMwMywzMjgwMCwzMjgwNSwzMTU0NSwzMjgxNCwzMjgxNywzMjg1MiwxNTgyMCwyMjQ1MiwyODgzMiwzMjk1MSwzMzAwMSwxNzM4OSwzMzAzNiwyOTQ4MiwzMzAzOCwzMzA0MiwzMDA0OCwzMzA0NCwxNzQwOSwxNTE2MSwzMzExMCwzMzExMywzMzExNCwxNzQyNywyMjU4NiwzMzE0OCwzMzE1NiwxNzQ0NSwzMzE3MSwxNzQ1MywzMzE4OSwyMjUxMSwzMzIxNywzMzI1MiwzMzM2NCwxNzU1MSwzMzQ0NiwzMzM5OCwzMzQ4MiwzMzQ5NiwzMzUzNSwxNzU4NCwzMzYyMywzODUwNSwyNzAxOCwzMzc5NywyODkxNywzMzg5MiwyNDgwMywzMzkyOCwxNzY2OCwzMzk4MiwzNDAxNywzNDA0MCwzNDA2NCwzNDEwNCwzNDEzMCwxNzcyMywzNDE1OSwzNDE2MCwzNDI3MiwxNzc4MywzNDQxOCwzNDQ1MCwzNDQ4MiwzNDU0MywzODQ2OSwzNDY5OSwxNzkyNiwxNzk0MywzNDk5MCwzNTA3MSwzNTEwOCwzNTE0MywzNTIxNywxNjIxNTEsMzUzNjksMzUzODQsMzU0NzYsMzU1MDgsMzU5MjEsMzYwNTIsMzYwODIsMzYxMjQsMTgzMjgsMjI2MjMsMzYyOTEsMTg0MTMsMjAyMDYsMzY0MTAsMjE5NzYsMjIzNTYsMzY0NjUsMjIwMDUsMzY1MjgsMTg0ODcsMzY1NTgsMzY1NzgsMzY1ODAsMzY1ODksMzY1OTQsMzY3OTEsMzY4MDEsMzY4MTAsMzY4MTIsMzY5MTUsMzkzNjQsMTg2MDUsMzkxMzYsMzczOTUsMTg3MTgsMzc0MTYsMzc0NjQsMzc0ODMsMzc1NTMsMzc1NTAsMzc1NjcsMzc2MDMsMzc2MTEsMzc2MTksMzc2MjAsMzc2MjksMzc2OTksMzc3NjQsMzc4MDUsMTg3NTcsMTg3NjksNDA2MzksMzc5MTEsMjEyNDksMzc5MTcsMzc5MzMsMzc5NTAsMTg3OTQsMzc5NzIsMzgwMDksMzgxODksMzgzMDYsMTg4NTUsMzgzODgsMzg0NTEsMTg5MTcsMjY1MjgsMTg5ODAsMzg3MjAsMTg5OTcsMzg4MzQsMzg4NTAsMjIxMDAsMTkxNzIsMjQ4MDgsMzkwOTcsMTkyMjUsMzkxNTMsMjI1OTYsMzkxODIsMzkxOTMsMjA5MTYsMzkxOTYsMzkyMjMsMzkyMzQsMzkyNjEsMzkyNjYsMTkzMTIsMzkzNjUsMTkzNTcsMzk0ODQsMzk2OTUsMzEzNjMsMzk3ODUsMzk4MDksMzk5MDEsMzk5MjEsMzk5MjQsMTk1NjUsMzk5NjgsMTQxOTEsMTM4MTc4LDQwMjY1LDM5OTk0LDQwNzAyLDIyMDk2LDQwMzM5LDQwMzgxLDQwMzg0LDQwNDQ0LDM4MTM0LDM2NzkwLDQwNTcxLDQwNjIwLDQwNjI1LDQwNjM3LDQwNjQ2LDM4MTA4LDQwNjc0LDQwNjg5LDQwNjk2LDMxNDMyLDQwNzcyLDEzMTIyMCwxMzE3NjcsMTMyMDAwLDI2OTA2LDM4MDgzLDIyOTU2LDEzMjMxMSwyMjU5MiwzODA4MSwxNDI2NSwxMzI1NjUsMTMyNjI5LDEzMjcyNiwxMzY4OTAsMjIzNTksMjkwNDMsMTMzODI2LDEzMzgzNywxMzQwNzksMjE2MTAsMTk0NjE5LDEzNDA5MSwyMTY2MiwxMzQxMzksMTM0MjAzLDEzNDIyNywxMzQyNDUsMTM0MjY4LDI0ODA3LDEzNDI4NSwyMjEzOCwxMzQzMjUsMTM0MzY1LDEzNDM4MSwxMzQ1MTEsMTM0NTc4LDEzNDYwMCwyNjk2NSwzOTk4MywzNDcyNSwxMzQ2NjAsMTM0NjcwLDEzNDg3MSwxMzUwNTYsMTM0OTU3LDEzNDc3MSwyMzU4NCwxMzUxMDAsMjQwNzUsMTM1MjYwLDEzNTI0NywxMzUyODYsMjYzOTgsMTM1MjkxLDEzNTMwNCwxMzUzMTgsMTM4OTUsMTM1MzU5LDEzNTM3OSwxMzU0NzEsMTM1NDgzLDIxMzQ4LDMzOTY1LDEzNTkwNywxMzYwNTMsMTM1OTkwLDM1NzEzLDEzNjU2NywxMzY3MjksMTM3MTU1LDEzNzE1OSwyMDA4OCwyODg1OSwxMzcyNjEsMTM3NTc4LDEzNzc3MywxMzc3OTcsMTM4MjgyLDEzODM1MiwxMzg0MTIsMTM4OTUyLDI1MjgzLDEzODk2NSwxMzkwMjksMjkwODAsMjY3MDksMTM5MzMzLDI3MTEzLDE0MDI0LDEzOTkwMCwxNDAyNDcsMTQwMjgyLDE0MTA5OCwxNDE0MjUsMTQxNjQ3LDMzNTMzLDE0MTY3MSwxNDE3MTUsMTQyMDM3LDM1MjM3LDE0MjA1NiwzNjc2OCwxNDIwOTQsMzg4NDAsMTQyMTQzLDM4OTgzLDM5NjEzLDE0MjQxMixudWxsLDE0MjQ3MiwxNDI1MTksMTU0NjAwLDE0MjYwMCwxNDI2MTAsMTQyNzc1LDE0Mjc0MSwxNDI5MTQsMTQzMjIwLDE0MzMwOCwxNDM0MTEsMTQzNDYyLDE0NDE1OSwxNDQzNTAsMjQ0OTcsMjYxODQsMjYzMDMsMTYyNDI1LDE0NDc0MywxNDQ4ODMsMjkxODUsMTQ5OTQ2LDMwNjc5LDE0NDkyMiwxNDUxNzQsMzIzOTEsMTMxOTEwLDIyNzA5LDI2MzgyLDI2OTA0LDE0NjA4NywxNjEzNjcsMTU1NjE4LDE0Njk2MSwxNDcxMjksMTYxMjc4LDEzOTQxOCwxODY0MCwxOTEyOCwxNDc3MzcsMTY2NTU0LDE0ODIwNiwxNDgyMzcsMTQ3NTE1LDE0ODI3NiwxNDgzNzQsMTUwMDg1LDEzMjU1NCwyMDk0NiwxMzI2MjUsMjI5NDMsMTM4OTIwLDE1Mjk0LDE0NjY4NywxNDg0ODQsMTQ4Njk0LDIyNDA4LDE0OTEwOCwxNDc0NywxNDkyOTUsMTY1MzUyLDE3MDQ0MSwxNDE3OCwxMzk3MTUsMzU2NzgsMTY2NzM0LDM5MzgyLDE0OTUyMiwxNDk3NTUsMTUwMDM3LDI5MTkzLDE1MDIwOCwxMzQyNjQsMjI4ODUsMTUxMjA1LDE1MTQzMCwxMzI5ODUsMzY1NzAsMTUxNTk2LDIxMTM1LDIyMzM1LDI5MDQxLDE1MjIxNywxNTI2MDEsMTQ3Mjc0LDE1MDE4MywyMTk0OCwxNTI2NDYsMTUyNjg2LDE1ODU0NiwzNzMzMiwxMzQyNywxNTI4OTUsMTYxMzMwLDE1MjkyNiwxODIwMCwxNTI5MzAsMTUyOTM0LDE1MzU0MywxNDk4MjMsMTUzNjkzLDIwNTgyLDEzNTYzLDE0NDMzMiwyNDc5OCwxNTM4NTksMTgzMDAsMTY2MjE2LDE1NDI4NiwxNTQ1MDUsMTU0NjMwLDEzODY0MCwyMjQzMywyOTAwOSwyODU5OCwxNTU5MDYsMTYyODM0LDM2OTUwLDE1NjA4MiwxNTE0NTAsMzU2ODIsMTU2Njc0LDE1Njc0NiwyMzg5OSwxNTg3MTEsMzY2NjIsMTU2ODA0LDEzNzUwMCwzNTU2MiwxNTAwMDYsMTU2ODA4LDE0NzQzOSwxNTY5NDYsMTkzOTIsMTU3MTE5LDE1NzM2NSwxNDEwODMsMzc5ODksMTUzNTY5LDI0OTgxLDIzMDc5LDE5NDc2NSwyMDQxMSwyMjIwMSwxNDg3NjksMTU3NDM2LDIwMDc0LDE0OTgxMiwzODQ4NiwyODA0NywxNTg5MDksMTM4NDgsMzUxOTEsMTU3NTkzLDE1NzgwNiwxNTY2ODksMTU3NzkwLDI5MTUxLDE1Nzg5NSwzMTU1NCwxNjgxMjgsMTMzNjQ5LDE1Nzk5MCwzNzEyNCwxNTgwMDksMzEzMDEsNDA0MzIsMTU4MjAyLDM5NDYyLDE1ODI1MywxMzkxOSwxNTY3NzcsMTMxMTA1LDMxMTA3LDE1ODI2MCwxNTg1NTUsMjM4NTIsMTQ0NjY1LDMzNzQzLDE1ODYyMSwxODEyOCwxNTg4ODQsMzAwMTEsMzQ5MTcsMTU5MTUwLDIyNzEwLDE0MTA4LDE0MDY4NSwxNTk4MTksMTYwMjA1LDE1NDQ0LDE2MDM4NCwxNjAzODksMzc1MDUsMTM5NjQyLDE2MDM5NSwzNzY4MCwxNjA0ODYsMTQ5OTY4LDI3NzA1LDM4MDQ3LDE2MDg0OCwxMzQ5MDQsMzQ4NTUsMzUwNjEsMTQxNjA2LDE2NDk3OSwxMzcxMzcsMjgzNDQsMTUwMDU4LDEzNzI0OCwxNDc1NiwxNDAwOSwyMzU2OCwzMTIwMywxNzcyNywyNjI5NCwxNzExODEsMTcwMTQ4LDM1MTM5LDE2MTc0MCwxNjE4ODAsMjIyMzAsMTY2MDcsMTM2NzE0LDE0NzUzLDE0NTE5OSwxNjQwNzIsMTM2MTMzLDI5MTAxLDMzNjM4LDE2MjI2OSwxNjgzNjAsMjMxNDMsMTk2MzksMTU5OTE5LDE2NjMxNSwxNjIzMDEsMTYyMzE0LDE2MjU3MSwxNjMxNzQsMTQ3ODM0LDMxNTU1LDMxMTAyLDE2Mzg0OSwyODU5NywxNzI3NjcsMjcxMzksMTY0NjMyLDIxNDEwLDE1OTIzOSwzNzgyMywyNjY3OCwzODc0OSwxNjQyMDcsMTYzODc1LDE1ODEzMywxMzYxNzMsMTQzOTE5LDE2MzkxMiwyMzk0MSwxNjY5NjAsMTYzOTcxLDIyMjkzLDM4OTQ3LDE2NjIxNywyMzk3OSwxNDk4OTYsMjYwNDYsMjcwOTMsMjE0NTgsMTUwMTgxLDE0NzMyOSwxNTM3NywyNjQyMiwxNjM5ODQsMTY0MDg0LDE2NDE0MiwxMzkxNjksMTY0MTc1LDE2NDIzMywxNjQyNzEsMTY0Mzc4LDE2NDYxNCwxNjQ2NTUsMTY0NzQ2LDEzNzcwLDE2NDk2OCwxNjU1NDYsMTg2ODIsMjU1NzQsMTY2MjMwLDMwNzI4LDM3NDYxLDE2NjMyOCwxNzM5NCwxNjYzNzUsMTczNzUsMTY2Mzc2LDE2NjcyNiwxNjY4NjgsMjMwMzIsMTY2OTIxLDM2NjE5LDE2Nzg3NywxNjgxNzIsMzE1NjksMTY4MjA4LDE2ODI1MiwxNTg2MywxNjgyODYsMTUwMjE4LDM2ODE2LDI5MzI3LDIyMTU1LDE2OTE5MSwxNjk0NDksMTY5MzkyLDE2OTQwMCwxNjk3NzgsMTcwMTkzLDE3MDMxMywxNzAzNDYsMTcwNDM1LDE3MDUzNiwxNzA3NjYsMTcxMzU0LDE3MTQxOSwzMjQxNSwxNzE3NjgsMTcxODExLDE5NjIwLDM4MjE1LDE3MjY5MSwyOTA5MCwxNzI3OTksMTk4NTcsMzY4ODIsMTczNTE1LDE5ODY4LDEzNDMwMCwzNjc5OCwyMTk1MywzNjc5NCwxNDA0NjQsMzY3OTMsMTUwMTYzLDE3NjczLDMyMzgzLDI4NTAyLDI3MzEzLDIwMjAyLDEzNTQwLDE2NjcwMCwxNjE5NDksMTQxMzgsMzY0ODAsMTM3MjA1LDE2Mzg3NiwxNjY3NjQsMTY2ODA5LDE2MjM2NiwxNTczNTksMTU4NTEsMTYxMzY1LDE0NjYxNSwxNTMxNDEsMTUzOTQyLDIwMTIyLDE1NTI2NSwxNTYyNDgsMjIyMDcsMTM0NzY1LDM2MzY2LDIzNDA1LDE0NzA4MCwxNTA2ODYsMjU1NjYsMjUyOTYsMTM3MjA2LDEzNzMzOSwyNTkwNCwyMjA2MSwxNTQ2OTgsMjE1MzAsMTUyMzM3LDE1ODE0LDE3MTQxNiwxOTU4MSwyMjA1MCwyMjA0NiwzMjU4NSwxNTUzNTIsMjI5MDEsMTQ2NzUyLDM0NjcyLDE5OTk2LDEzNTE0NiwxMzQ0NzMsMTQ1MDgyLDMzMDQ3LDQwMjg2LDM2MTIwLDMwMjY3LDQwMDA1LDMwMjg2LDMwNjQ5LDM3NzAxLDIxNTU0LDMzMDk2LDMzNTI3LDIyMDUzLDMzMDc0LDMzODE2LDMyOTU3LDIxOTk0LDMxMDc0LDIyMDgzLDIxNTI2LDEzNDgxMywxMzc3NCwyMjAyMSwyMjAwMSwyNjM1MywxNjQ1NzgsMTM4NjksMzAwMDQsMjIwMDAsMjE5NDYsMjE2NTUsMjE4NzQsMTM0MjA5LDEzNDI5NCwyNDI3MiwxNTE4ODAsMTM0Nzc0LDE0MjQzNCwxMzQ4MTgsNDA2MTksMzIwOTAsMjE5ODIsMTM1Mjg1LDI1MjQ1LDM4NzY1LDIxNjUyLDM2MDQ1LDI5MTc0LDM3MjM4LDI1NTk2LDI1NTI5LDI1NTk4LDIxODY1LDE0MjE0Nyw0MDA1MCwxNDMwMjcsMjA4OTAsMTM1MzUsMTM0NTY3LDIwOTAzLDIxNTgxLDIxNzkwLDIxNzc5LDMwMzEwLDM2Mzk3LDE1NzgzNCwzMDEyOSwzMjk1MCwzNDgyMCwzNDY5NCwzNTAxNSwzMzIwNiwzMzgyMCwxMzUzNjEsMTc2NDQsMjk0NDQsMTQ5MjU0LDIzNDQwLDMzNTQ3LDE1Nzg0MywyMjEzOSwxNDEwNDQsMTYzMTE5LDE0Nzg3NSwxNjMxODcsMTU5NDQwLDE2MDQzOCwzNzIzMiwxMzU2NDEsMzczODQsMTQ2Njg0LDE3MzczNywxMzQ4MjgsMTM0OTA1LDI5Mjg2LDEzODQwMiwxODI1NCwxNTE0OTAsMTYzODMzLDEzNTE0NywxNjYzNCw0MDAyOSwyNTg4NywxNDI3NTIsMTg2NzUsMTQ5NDcyLDE3MTM4OCwxMzUxNDgsMTM0NjY2LDI0Njc0LDE2MTE4NywxMzUxNDksbnVsbCwxNTU3MjAsMTM1NTU5LDI5MDkxLDMyMzk4LDQwMjcyLDE5OTk0LDE5OTcyLDEzNjg3LDIzMzA5LDI3ODI2LDIxMzUxLDEzOTk2LDE0ODEyLDIxMzczLDEzOTg5LDE0OTAxNiwyMjY4MiwxNTAzODIsMzMzMjUsMjE1NzksMjI0NDIsMTU0MjYxLDEzMzQ5NyxudWxsLDE0OTMwLDE0MDM4OSwyOTU1NiwxNzE2OTIsMTk3MjEsMzk5MTcsMTQ2Njg2LDE3MTgyNCwxOTU0NywxNTE0NjUsMTY5Mzc0LDE3MTk5OCwzMzg4NCwxNDY4NzAsMTYwNDM0LDE1NzYxOSwxNDUxODQsMjUzOTAsMzIwMzcsMTQ3MTkxLDE0Njk4OCwxNDg5MCwzNjg3MiwyMTE5NiwxNTk4OCwxMzk0NiwxNzg5NywxMzIyMzgsMzAyNzIsMjMyODAsMTM0ODM4LDMwODQyLDE2MzYzMCwyMjY5NSwxNjU3NSwyMjE0MCwzOTgxOSwyMzkyNCwzMDI5MiwxNzMxMDgsNDA1ODEsMTk2ODEsMzAyMDEsMTQzMzEsMjQ4NTcsMTQzNTc4LDE0ODQ2NixudWxsLDIyMTA5LDEzNTg0OSwyMjQzOSwxNDk4NTksMTcxNTI2LDIxMDQ0LDE1OTkxOCwxMzc0MSwyNzcyMiw0MDMxNiwzMTgzMCwzOTczNywyMjQ5NCwxMzcwNjgsMjM2MzUsMjU4MTEsMTY5MTY4LDE1NjQ2OSwxNjAxMDAsMzQ0NzcsMTM0NDQwLDE1OTAxMCwxNTAyNDIsMTM0NTEzLG51bGwsMjA5OTAsMTM5MDIzLDIzOTUwLDM4NjU5LDEzODcwNSw0MDU3NywzNjk0MCwzMTUxOSwzOTY4MiwyMzc2MSwzMTY1MSwyNTE5MiwyNTM5NywzOTY3OSwzMTY5NSwzOTcyMiwzMTg3MCwzOTcyNiwzMTgxMCwzMTg3OCwzOTk1NywzMTc0MCwzOTY4OSw0MDcyNywzOTk2MywxNDk4MjIsNDA3OTQsMjE4NzUsMjM0OTEsMjA0NzcsNDA2MDAsMjA0NjYsMjEwODgsMTU4NzgsMjEyMDEsMjIzNzUsMjA1NjYsMjI5NjcsMjQwODIsMzg4NTYsNDAzNjMsMzY3MDAsMjE2MDksMzg4MzYsMzkyMzIsMzg4NDIsMjEyOTIsMjQ4ODAsMjY5MjQsMjE0NjYsMzk5NDYsNDAxOTQsMTk1MTUsMzg0NjUsMjcwMDgsMjA2NDYsMzAwMjIsMTM3MDY5LDM5Mzg2LDIxMTA3LG51bGwsMzcyMDksMzg1MjksMzcyMTIsbnVsbCwzNzIwMSwxNjc1NzUsMjU0NzEsMTU5MDExLDI3MzM4LDIyMDMzLDM3MjYyLDMwMDc0LDI1MjIxLDEzMjA5MiwyOTUxOSwzMTg1NiwxNTQ2NTcsMTQ2Njg1LG51bGwsMTQ5Nzg1LDMwNDIyLDM5ODM3LDIwMDEwLDEzNDM1NiwzMzcyNiwzNDg4MixudWxsLDIzNjI2LDI3MDcyLDIwNzE3LDIyMzk0LDIxMDIzLDI0MDUzLDIwMTc0LDI3Njk3LDEzMTU3MCwyMDI4MSwyMTY2MCwyMTcyMiwyMTE0NiwzNjIyNiwxMzgyMiwyNDMzMiwxMzgxMSxudWxsLDI3NDc0LDM3MjQ0LDQwODY5LDM5ODMxLDM4OTU4LDM5MDkyLDM5NjEwLDQwNjE2LDQwNTgwLDI5MDUwLDMxNTA4LG51bGwsMjc2NDIsMzQ4NDAsMzI2MzIsbnVsbCwyMjA0OCwxNzM2NDIsMzY0NzEsNDA3ODcsbnVsbCwzNjMwOCwzNjQzMSw0MDQ3NiwzNjM1MywyNTIxOCwxNjQ3MzMsMzYzOTIsMzY0NjksMzE0NDMsMTUwMTM1LDMxMjk0LDMwOTM2LDI3ODgyLDM1NDMxLDMwMjE1LDE2NjQ5MCw0MDc0MiwyNzg1NCwzNDc3NCwzMDE0NywxNzI3MjIsMzA4MDMsMTk0NjI0LDM2MTA4LDI5NDEwLDI5NTUzLDM1NjI5LDI5NDQyLDI5OTM3LDM2MDc1LDE1MDIwMywzNDM1MSwyNDUwNiwzNDk3NiwxNzU5MSxudWxsLDEzNzI3NSwxNTkyMzcsbnVsbCwzNTQ1NCwxNDA1NzEsbnVsbCwyNDgyOSwzMDMxMSwzOTYzOSw0MDI2MCwzNzc0MiwzOTgyMywzNDgwNSxudWxsLDM0ODMxLDM2MDg3LDI5NDg0LDM4Njg5LDM5ODU2LDEzNzgyLDI5MzYyLDE5NDYzLDMxODI1LDM5MjQyLDE1NTk5MywyNDkyMSwxOTQ2MCw0MDU5OCwyNDk1NyxudWxsLDIyMzY3LDI0OTQzLDI1MjU0LDI1MTQ1LDI1Mjk0LDE0OTQwLDI1MDU4LDIxNDE4LDE0NDM3MywyNTQ0NCwyNjYyNiwxMzc3OCwyMzg5NSwxNjY4NTAsMzY4MjYsMTY3NDgxLG51bGwsMjA2OTcsMTM4NTY2LDMwOTgyLDIxMjk4LDM4NDU2LDEzNDk3MSwxNjQ4NSxudWxsLDMwNzE4LG51bGwsMzE5MzgsMTU1NDE4LDMxOTYyLDMxMjc3LDMyODcwLDMyODY3LDMyMDc3LDI5OTU3LDI5OTM4LDM1MjIwLDMzMzA2LDI2MzgwLDMyODY2LDE2MDkwMiwzMjg1OSwyOTkzNiwzMzAyNywzMDUwMCwzNTIwOSwxNTc2NDQsMzAwMzUsMTU5NDQxLDM0NzI5LDM0NzY2LDMzMjI0LDM0NzAwLDM1NDAxLDM2MDEzLDM1NjUxLDMwNTA3LDI5OTQ0LDM0MDEwLDEzODc3LDI3MDU4LDM2MjYyLG51bGwsMzUyNDEsMjk4MDAsMjgwODksMzQ3NTMsMTQ3NDczLDI5OTI3LDE1ODM1LDI5MDQ2LDI0NzQwLDI0OTg4LDE1NTY5LDI5MDI2LDI0Njk1LG51bGwsMzI2MjUsMTY2NzAxLDI5MjY0LDI0ODA5LDE5MzI2LDIxMDI0LDE1Mzg0LDE0NjYzMSwxNTUzNTEsMTYxMzY2LDE1Mjg4MSwxMzc1NDAsMTM1OTM0LDE3MDI0MywxNTkxOTYsMTU5OTE3LDIzNzQ1LDE1NjA3NywxNjY0MTUsMTQ1MDE1LDEzMTMxMCwxNTc3NjYsMTUxMzEwLDE3NzYyLDIzMzI3LDE1NjQ5Miw0MDc4NCw0MDYxNCwxNTYyNjcsMTIyODgsNjUyOTIsMTIyODksMTIyOTAsNjUyOTQsODIzMSw2NTMwNyw2NTMwNiw2NTMxMSw2NTI4MSw2NTA3Miw4MjMwLDgyMjksNjUxMDQsNjUxMDUsNjUxMDYsMTgzLDY1MTA4LDY1MTA5LDY1MTEwLDY1MTExLDY1MzcyLDgyMTEsNjUwNzMsODIxMiw2NTA3NSw5NTg4LDY1MDc2LDY1MTAzLDY1Mjg4LDY1Mjg5LDY1MDc3LDY1MDc4LDY1MzcxLDY1MzczLDY1MDc5LDY1MDgwLDEyMzA4LDEyMzA5LDY1MDgxLDY1MDgyLDEyMzA0LDEyMzA1LDY1MDgzLDY1MDg0LDEyMjk4LDEyMjk5LDY1MDg1LDY1MDg2LDEyMjk2LDEyMjk3LDY1MDg3LDY1MDg4LDEyMzAwLDEyMzAxLDY1MDg5LDY1MDkwLDEyMzAyLDEyMzAzLDY1MDkxLDY1MDkyLDY1MTEzLDY1MTE0LDY1MTE1LDY1MTE2LDY1MTE3LDY1MTE4LDgyMTYsODIxNyw4MjIwLDgyMjEsMTIzMTcsMTIzMTgsODI0NSw4MjQyLDY1MjgzLDY1Mjg2LDY1MjkwLDgyNTEsMTY3LDEyMjkxLDk2NzUsOTY3OSw5NjUxLDk2NTAsOTY3OCw5NzM0LDk3MzMsOTY3MSw5NjcwLDk2MzMsOTYzMiw5NjYxLDk2NjAsMTI5NjMsODQ1MywxNzUsNjU1MDcsNjUzNDMsNzE3LDY1MDk3LDY1MDk4LDY1MTAxLDY1MTAyLDY1MDk5LDY1MTAwLDY1MTE5LDY1MTIwLDY1MTIxLDY1MjkxLDY1MjkzLDIxNSwyNDcsMTc3LDg3MzAsNjUzMDgsNjUzMTAsNjUzMDksODgwNiw4ODA3LDg4MDAsODczNCw4Nzg2LDg4MDEsNjUxMjIsNjUxMjMsNjUxMjQsNjUxMjUsNjUxMjYsNjUzNzQsODc0NSw4NzQ2LDg4NjksODczNiw4NzM1LDg4OTUsMTMyNjYsMTMyNjUsODc0Nyw4NzUwLDg3NTcsODc1Niw5NzkyLDk3OTQsODg1Myw4ODU3LDg1OTMsODU5NSw4NTkyLDg1OTQsODU5OCw4NTk5LDg2MDEsODYwMCw4NzQxLDg3MzksNjUyOTUsNjUzNDAsODcyNSw2NTEyOCw2NTI4NCw2NTUwOSwxMjMwNiw2NTUwNCw2NTUwNSw2NTI4NSw2NTMxMiw4NDUxLDg0NTcsNjUxMjksNjUxMzAsNjUxMzEsMTMyNjksMTMyMTIsMTMyMTMsMTMyMTQsMTMyNjIsMTMyMTcsMTMxOTgsMTMxOTksMTMyNTIsMTc2LDIwODI1LDIwODI3LDIwODMwLDIwODI5LDIwODMzLDIwODM1LDIxOTkxLDI5OTI5LDMxOTUwLDk2MDEsOTYwMiw5NjAzLDk2MDQsOTYwNSw5NjA2LDk2MDcsOTYwOCw5NjE1LDk2MTQsOTYxMyw5NjEyLDk2MTEsOTYxMCw5NjA5LDk1MzIsOTUyNCw5NTE2LDk1MDgsOTUwMCw5NjIwLDk0NzIsOTQ3NCw5NjIxLDk0ODQsOTQ4OCw5NDkyLDk0OTYsOTU4MSw5NTgyLDk1ODQsOTU4Myw5NTUyLDk1NjYsOTU3OCw5NTY5LDk2OTgsOTY5OSw5NzAxLDk3MDAsOTU4NSw5NTg2LDk1ODcsNjUyOTYsNjUyOTcsNjUyOTgsNjUyOTksNjUzMDAsNjUzMDEsNjUzMDIsNjUzMDMsNjUzMDQsNjUzMDUsODU0NCw4NTQ1LDg1NDYsODU0Nyw4NTQ4LDg1NDksODU1MCw4NTUxLDg1NTIsODU1MywxMjMyMSwxMjMyMiwxMjMyMywxMjMyNCwxMjMyNSwxMjMyNiwxMjMyNywxMjMyOCwxMjMyOSwyMTMxMywyMTMxNiwyMTMxNyw2NTMxMyw2NTMxNCw2NTMxNSw2NTMxNiw2NTMxNyw2NTMxOCw2NTMxOSw2NTMyMCw2NTMyMSw2NTMyMiw2NTMyMyw2NTMyNCw2NTMyNSw2NTMyNiw2NTMyNyw2NTMyOCw2NTMyOSw2NTMzMCw2NTMzMSw2NTMzMiw2NTMzMyw2NTMzNCw2NTMzNSw2NTMzNiw2NTMzNyw2NTMzOCw2NTM0NSw2NTM0Niw2NTM0Nyw2NTM0OCw2NTM0OSw2NTM1MCw2NTM1MSw2NTM1Miw2NTM1Myw2NTM1NCw2NTM1NSw2NTM1Niw2NTM1Nyw2NTM1OCw2NTM1OSw2NTM2MCw2NTM2MSw2NTM2Miw2NTM2Myw2NTM2NCw2NTM2NSw2NTM2Niw2NTM2Nyw2NTM2OCw2NTM2OSw2NTM3MCw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSwxMjU0OSwxMjU1MCwxMjU1MSwxMjU1MiwxMjU1MywxMjU1NCwxMjU1NSwxMjU1NiwxMjU1NywxMjU1OCwxMjU1OSwxMjU2MCwxMjU2MSwxMjU2MiwxMjU2MywxMjU2NCwxMjU2NSwxMjU2NiwxMjU2NywxMjU2OCwxMjU2OSwxMjU3MCwxMjU3MSwxMjU3MiwxMjU3MywxMjU3NCwxMjU3NSwxMjU3NiwxMjU3NywxMjU3OCwxMjU3OSwxMjU4MCwxMjU4MSwxMjU4MiwxMjU4MywxMjU4NCwxMjU4NSw3MjksNzEzLDcxNCw3MTEsNzE1LDkyMTYsOTIxNyw5MjE4LDkyMTksOTIyMCw5MjIxLDkyMjIsOTIyMyw5MjI0LDkyMjUsOTIyNiw5MjI3LDkyMjgsOTIyOSw5MjMwLDkyMzEsOTIzMiw5MjMzLDkyMzQsOTIzNSw5MjM2LDkyMzcsOTIzOCw5MjM5LDkyNDAsOTI0MSw5MjQyLDkyNDMsOTI0NCw5MjQ1LDkyNDYsOTI0Nyw5MjQ5LDgzNjQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE5OTY4LDIwMDU3LDE5OTY5LDE5OTcxLDIwMDM1LDIwMDYxLDIwMTAyLDIwMTA4LDIwMTU0LDIwNzk5LDIwODM3LDIwODQzLDIwOTYwLDIwOTkyLDIwOTkzLDIxMTQ3LDIxMjY5LDIxMzEzLDIxMzQwLDIxNDQ4LDE5OTc3LDE5OTc5LDE5OTc2LDE5OTc4LDIwMDExLDIwMDI0LDIwOTYxLDIwMDM3LDIwMDQwLDIwMDYzLDIwMDYyLDIwMTEwLDIwMTI5LDIwODAwLDIwOTk1LDIxMjQyLDIxMzE1LDIxNDQ5LDIxNDc1LDIyMzAzLDIyNzYzLDIyODA1LDIyODIzLDIyODk5LDIzMzc2LDIzMzc3LDIzMzc5LDIzNTQ0LDIzNTY3LDIzNTg2LDIzNjA4LDIzNjY1LDI0MDI5LDI0MDM3LDI0MDQ5LDI0MDUwLDI0MDUxLDI0MDYyLDI0MTc4LDI0MzE4LDI0MzMxLDI0MzM5LDI1MTY1LDE5OTg1LDE5OTg0LDE5OTgxLDIwMDEzLDIwMDE2LDIwMDI1LDIwMDQzLDIzNjA5LDIwMTA0LDIwMTEzLDIwMTE3LDIwMTE0LDIwMTE2LDIwMTMwLDIwMTYxLDIwMTYwLDIwMTYzLDIwMTY2LDIwMTY3LDIwMTczLDIwMTcwLDIwMTcxLDIwMTY0LDIwODAzLDIwODAxLDIwODM5LDIwODQ1LDIwODQ2LDIwODQ0LDIwODg3LDIwOTgyLDIwOTk4LDIwOTk5LDIxMDAwLDIxMjQzLDIxMjQ2LDIxMjQ3LDIxMjcwLDIxMzA1LDIxMzIwLDIxMzE5LDIxMzE3LDIxMzQyLDIxMzgwLDIxNDUxLDIxNDUwLDIxNDUzLDIyNzY0LDIyODI1LDIyODI3LDIyODI2LDIyODI5LDIzMzgwLDIzNTY5LDIzNTg4LDIzNjEwLDIzNjYzLDI0MDUyLDI0MTg3LDI0MzE5LDI0MzQwLDI0MzQxLDI0NTE1LDI1MDk2LDI1MTQyLDI1MTYzLDI1MTY2LDI1OTAzLDI1OTkxLDI2MDA3LDI2MDIwLDI2MDQxLDI2MDg1LDI2MzUyLDI2Mzc2LDI2NDA4LDI3NDI0LDI3NDkwLDI3NTEzLDI3NTk1LDI3NjA0LDI3NjExLDI3NjYzLDI3NzAwLDI4Nzc5LDI5MjI2LDI5MjM4LDI5MjQzLDI5MjU1LDI5MjczLDI5Mjc1LDI5MzU2LDI5NTc5LDE5OTkzLDE5OTkwLDE5OTg5LDE5OTg4LDE5OTkyLDIwMDI3LDIwMDQ1LDIwMDQ3LDIwMDQ2LDIwMTk3LDIwMTg0LDIwMTgwLDIwMTgxLDIwMTgyLDIwMTgzLDIwMTk1LDIwMTk2LDIwMTg1LDIwMTkwLDIwODA1LDIwODA0LDIwODczLDIwODc0LDIwOTA4LDIwOTg1LDIwOTg2LDIwOTg0LDIxMDAyLDIxMTUyLDIxMTUxLDIxMjUzLDIxMjU0LDIxMjcxLDIxMjc3LDIwMTkxLDIxMzIyLDIxMzIxLDIxMzQ1LDIxMzQ0LDIxMzU5LDIxMzU4LDIxNDM1LDIxNDg3LDIxNDc2LDIxNDkxLDIxNDg0LDIxNDg2LDIxNDgxLDIxNDgwLDIxNTAwLDIxNDk2LDIxNDkzLDIxNDgzLDIxNDc4LDIxNDgyLDIxNDkwLDIxNDg5LDIxNDg4LDIxNDc3LDIxNDg1LDIxNDk5LDIyMjM1LDIyMjM0LDIyODA2LDIyODMwLDIyODMzLDIyOTAwLDIyOTAyLDIzMzgxLDIzNDI3LDIzNjEyLDI0MDQwLDI0MDM5LDI0MDM4LDI0MDY2LDI0MDY3LDI0MTc5LDI0MTg4LDI0MzIxLDI0MzQ0LDI0MzQzLDI0NTE3LDI1MDk4LDI1MTcxLDI1MTcyLDI1MTcwLDI1MTY5LDI2MDIxLDI2MDg2LDI2NDE0LDI2NDEyLDI2NDEwLDI2NDExLDI2NDEzLDI3NDkxLDI3NTk3LDI3NjY1LDI3NjY0LDI3NzA0LDI3NzEzLDI3NzEyLDI3NzEwLDI5MzU5LDI5NTcyLDI5NTc3LDI5OTE2LDI5OTI2LDI5OTc2LDI5OTgzLDI5OTkyLDI5OTkzLDMwMDAwLDMwMDAxLDMwMDAyLDMwMDAzLDMwMDkxLDMwMzMzLDMwMzgyLDMwMzk5LDMwNDQ2LDMwNjgzLDMwNjkwLDMwNzA3LDMxMDM0LDMxMTY2LDMxMzQ4LDMxNDM1LDE5OTk4LDE5OTk5LDIwMDUwLDIwMDUxLDIwMDczLDIwMTIxLDIwMTMyLDIwMTM0LDIwMTMzLDIwMjIzLDIwMjMzLDIwMjQ5LDIwMjM0LDIwMjQ1LDIwMjM3LDIwMjQwLDIwMjQxLDIwMjM5LDIwMjEwLDIwMjE0LDIwMjE5LDIwMjA4LDIwMjExLDIwMjIxLDIwMjI1LDIwMjM1LDIwODA5LDIwODA3LDIwODA2LDIwODA4LDIwODQwLDIwODQ5LDIwODc3LDIwOTEyLDIxMDE1LDIxMDA5LDIxMDEwLDIxMDA2LDIxMDE0LDIxMTU1LDIxMjU2LDIxMjgxLDIxMjgwLDIxMzYwLDIxMzYxLDIxNTEzLDIxNTE5LDIxNTE2LDIxNTE0LDIxNTIwLDIxNTA1LDIxNTE1LDIxNTA4LDIxNTIxLDIxNTE3LDIxNTEyLDIxNTA3LDIxNTE4LDIxNTEwLDIxNTIyLDIyMjQwLDIyMjM4LDIyMjM3LDIyMzIzLDIyMzIwLDIyMzEyLDIyMzE3LDIyMzE2LDIyMzE5LDIyMzEzLDIyODA5LDIyODEwLDIyODM5LDIyODQwLDIyOTE2LDIyOTA0LDIyOTE1LDIyOTA5LDIyOTA1LDIyOTE0LDIyOTEzLDIzMzgzLDIzMzg0LDIzNDMxLDIzNDMyLDIzNDI5LDIzNDMzLDIzNTQ2LDIzNTc0LDIzNjczLDI0MDMwLDI0MDcwLDI0MTgyLDI0MTgwLDI0MzM1LDI0MzQ3LDI0NTM3LDI0NTM0LDI1MTAyLDI1MTAwLDI1MTAxLDI1MTA0LDI1MTg3LDI1MTc5LDI1MTc2LDI1OTEwLDI2MDg5LDI2MDg4LDI2MDkyLDI2MDkzLDI2MzU0LDI2MzU1LDI2Mzc3LDI2NDI5LDI2NDIwLDI2NDE3LDI2NDIxLDI3NDI1LDI3NDkyLDI3NTE1LDI3NjcwLDI3NzQxLDI3NzM1LDI3NzM3LDI3NzQzLDI3NzQ0LDI3NzI4LDI3NzMzLDI3NzQ1LDI3NzM5LDI3NzI1LDI3NzI2LDI4Nzg0LDI5Mjc5LDI5Mjc3LDMwMzM0LDMxNDgxLDMxODU5LDMxOTkyLDMyNTY2LDMyNjUwLDMyNzAxLDMyNzY5LDMyNzcxLDMyNzgwLDMyNzg2LDMyODE5LDMyODk1LDMyOTA1LDMyOTA3LDMyOTA4LDMzMjUxLDMzMjU4LDMzMjY3LDMzMjc2LDMzMjkyLDMzMzA3LDMzMzExLDMzMzkwLDMzMzk0LDMzNDA2LDM0NDExLDM0ODgwLDM0ODkyLDM0OTE1LDM1MTk5LDM4NDMzLDIwMDE4LDIwMTM2LDIwMzAxLDIwMzAzLDIwMjk1LDIwMzExLDIwMzE4LDIwMjc2LDIwMzE1LDIwMzA5LDIwMjcyLDIwMzA0LDIwMzA1LDIwMjg1LDIwMjgyLDIwMjgwLDIwMjkxLDIwMzA4LDIwMjg0LDIwMjk0LDIwMzIzLDIwMzE2LDIwMzIwLDIwMjcxLDIwMzAyLDIwMjc4LDIwMzEzLDIwMzE3LDIwMjk2LDIwMzE0LDIwODEyLDIwODExLDIwODEzLDIwODUzLDIwOTE4LDIwOTE5LDIxMDI5LDIxMDI4LDIxMDMzLDIxMDM0LDIxMDMyLDIxMTYzLDIxMTYxLDIxMTYyLDIxMTY0LDIxMjgzLDIxMzYzLDIxMzY1LDIxNTMzLDIxNTQ5LDIxNTM0LDIxNTY2LDIxNTQyLDIxNTgyLDIxNTQzLDIxNTc0LDIxNTcxLDIxNTU1LDIxNTc2LDIxNTcwLDIxNTMxLDIxNTQ1LDIxNTc4LDIxNTYxLDIxNTYzLDIxNTYwLDIxNTUwLDIxNTU3LDIxNTU4LDIxNTM2LDIxNTY0LDIxNTY4LDIxNTUzLDIxNTQ3LDIxNTM1LDIxNTQ4LDIyMjUwLDIyMjU2LDIyMjQ0LDIyMjUxLDIyMzQ2LDIyMzUzLDIyMzM2LDIyMzQ5LDIyMzQzLDIyMzUwLDIyMzM0LDIyMzUyLDIyMzUxLDIyMzMxLDIyNzY3LDIyODQ2LDIyOTQxLDIyOTMwLDIyOTUyLDIyOTQyLDIyOTQ3LDIyOTM3LDIyOTM0LDIyOTI1LDIyOTQ4LDIyOTMxLDIyOTIyLDIyOTQ5LDIzMzg5LDIzMzg4LDIzMzg2LDIzMzg3LDIzNDM2LDIzNDM1LDIzNDM5LDIzNTk2LDIzNjE2LDIzNjE3LDIzNjE1LDIzNjE0LDIzNjk2LDIzNjk3LDIzNzAwLDIzNjkyLDI0MDQzLDI0MDc2LDI0MjA3LDI0MTk5LDI0MjAyLDI0MzExLDI0MzI0LDI0MzUxLDI0NDIwLDI0NDE4LDI0NDM5LDI0NDQxLDI0NTM2LDI0NTI0LDI0NTM1LDI0NTI1LDI0NTYxLDI0NTU1LDI0NTY4LDI0NTU0LDI1MTA2LDI1MTA1LDI1MjIwLDI1MjM5LDI1MjM4LDI1MjE2LDI1MjA2LDI1MjI1LDI1MTk3LDI1MjI2LDI1MjEyLDI1MjE0LDI1MjA5LDI1MjAzLDI1MjM0LDI1MTk5LDI1MjQwLDI1MTk4LDI1MjM3LDI1MjM1LDI1MjMzLDI1MjIyLDI1OTEzLDI1OTE1LDI1OTEyLDI2MDk3LDI2MzU2LDI2NDYzLDI2NDQ2LDI2NDQ3LDI2NDQ4LDI2NDQ5LDI2NDYwLDI2NDU0LDI2NDYyLDI2NDQxLDI2NDM4LDI2NDY0LDI2NDUxLDI2NDU1LDI3NDkzLDI3NTk5LDI3NzE0LDI3NzQyLDI3ODAxLDI3Nzc3LDI3Nzg0LDI3Nzg1LDI3NzgxLDI3ODAzLDI3NzU0LDI3NzcwLDI3NzkyLDI3NzYwLDI3Nzg4LDI3NzUyLDI3Nzk4LDI3Nzk0LDI3NzczLDI3Nzc5LDI3NzYyLDI3Nzc0LDI3NzY0LDI3NzgyLDI3NzY2LDI3Nzg5LDI3Nzk2LDI3ODAwLDI3Nzc4LDI4NzkwLDI4Nzk2LDI4Nzk3LDI4NzkyLDI5MjgyLDI5MjgxLDI5MjgwLDI5MzgwLDI5Mzc4LDI5NTkwLDI5OTk2LDI5OTk1LDMwMDA3LDMwMDA4LDMwMzM4LDMwNDQ3LDMwNjkxLDMxMTY5LDMxMTY4LDMxMTY3LDMxMzUwLDMxOTk1LDMyNTk3LDMyOTE4LDMyOTE1LDMyOTI1LDMyOTIwLDMyOTIzLDMyOTIyLDMyOTQ2LDMzMzkxLDMzNDI2LDMzNDE5LDMzNDIxLDM1MjExLDM1MjgyLDM1MzI4LDM1ODk1LDM1OTEwLDM1OTI1LDM1OTk3LDM2MTk2LDM2MjA4LDM2Mjc1LDM2NTIzLDM2NTU0LDM2NzYzLDM2Nzg0LDM2ODAyLDM2ODA2LDM2ODA1LDM2ODA0LDI0MDMzLDM3MDA5LDM3MDI2LDM3MDM0LDM3MDMwLDM3MDI3LDM3MTkzLDM3MzE4LDM3MzI0LDM4NDUwLDM4NDQ2LDM4NDQ5LDM4NDQyLDM4NDQ0LDIwMDA2LDIwMDU0LDIwMDgzLDIwMTA3LDIwMTIzLDIwMTI2LDIwMTM5LDIwMTQwLDIwMzM1LDIwMzgxLDIwMzY1LDIwMzM5LDIwMzUxLDIwMzMyLDIwMzc5LDIwMzYzLDIwMzU4LDIwMzU1LDIwMzM2LDIwMzQxLDIwMzYwLDIwMzI5LDIwMzQ3LDIwMzc0LDIwMzUwLDIwMzY3LDIwMzY5LDIwMzQ2LDIwODIwLDIwODE4LDIwODIxLDIwODQxLDIwODU1LDIwODU0LDIwODU2LDIwOTI1LDIwOTg5LDIxMDUxLDIxMDQ4LDIxMDQ3LDIxMDUwLDIxMDQwLDIxMDM4LDIxMDQ2LDIxMDU3LDIxMTgyLDIxMTc5LDIxMzMwLDIxMzMyLDIxMzMxLDIxMzI5LDIxMzUwLDIxMzY3LDIxMzY4LDIxMzY5LDIxNDYyLDIxNDYwLDIxNDYzLDIxNjE5LDIxNjIxLDIxNjU0LDIxNjI0LDIxNjUzLDIxNjMyLDIxNjI3LDIxNjIzLDIxNjM2LDIxNjUwLDIxNjM4LDIxNjI4LDIxNjQ4LDIxNjE3LDIxNjIyLDIxNjQ0LDIxNjU4LDIxNjAyLDIxNjA4LDIxNjQzLDIxNjI5LDIxNjQ2LDIyMjY2LDIyNDAzLDIyMzkxLDIyMzc4LDIyMzc3LDIyMzY5LDIyMzc0LDIyMzcyLDIyMzk2LDIyODEyLDIyODU3LDIyODU1LDIyODU2LDIyODUyLDIyODY4LDIyOTc0LDIyOTcxLDIyOTk2LDIyOTY5LDIyOTU4LDIyOTkzLDIyOTgyLDIyOTkyLDIyOTg5LDIyOTg3LDIyOTk1LDIyOTg2LDIyOTU5LDIyOTYzLDIyOTk0LDIyOTgxLDIzMzkxLDIzMzk2LDIzMzk1LDIzNDQ3LDIzNDUwLDIzNDQ4LDIzNDUyLDIzNDQ5LDIzNDUxLDIzNTc4LDIzNjI0LDIzNjIxLDIzNjIyLDIzNzM1LDIzNzEzLDIzNzM2LDIzNzIxLDIzNzIzLDIzNzI5LDIzNzMxLDI0MDg4LDI0MDkwLDI0MDg2LDI0MDg1LDI0MDkxLDI0MDgxLDI0MTg0LDI0MjE4LDI0MjE1LDI0MjIwLDI0MjEzLDI0MjE0LDI0MzEwLDI0MzU4LDI0MzU5LDI0MzYxLDI0NDQ4LDI0NDQ5LDI0NDQ3LDI0NDQ0LDI0NTQxLDI0NTQ0LDI0NTczLDI0NTY1LDI0NTc1LDI0NTkxLDI0NTk2LDI0NjIzLDI0NjI5LDI0NTk4LDI0NjE4LDI0NTk3LDI0NjA5LDI0NjE1LDI0NjE3LDI0NjE5LDI0NjAzLDI1MTEwLDI1MTA5LDI1MTUxLDI1MTUwLDI1MTUyLDI1MjE1LDI1Mjg5LDI1MjkyLDI1Mjg0LDI1Mjc5LDI1MjgyLDI1MjczLDI1Mjk4LDI1MzA3LDI1MjU5LDI1Mjk5LDI1MzAwLDI1MjkxLDI1Mjg4LDI1MjU2LDI1Mjc3LDI1Mjc2LDI1Mjk2LDI1MzA1LDI1Mjg3LDI1MjkzLDI1MjY5LDI1MzA2LDI1MjY1LDI1MzA0LDI1MzAyLDI1MzAzLDI1Mjg2LDI1MjYwLDI1Mjk0LDI1OTE4LDI2MDIzLDI2MDQ0LDI2MTA2LDI2MTMyLDI2MTMxLDI2MTI0LDI2MTE4LDI2MTE0LDI2MTI2LDI2MTEyLDI2MTI3LDI2MTMzLDI2MTIyLDI2MTE5LDI2MzgxLDI2Mzc5LDI2NDc3LDI2NTA3LDI2NTE3LDI2NDgxLDI2NTI0LDI2NDgzLDI2NDg3LDI2NTAzLDI2NTI1LDI2NTE5LDI2NDc5LDI2NDgwLDI2NDk1LDI2NTA1LDI2NDk0LDI2NTEyLDI2NDg1LDI2NTIyLDI2NTE1LDI2NDkyLDI2NDc0LDI2NDgyLDI3NDI3LDI3NDk0LDI3NDk1LDI3NTE5LDI3NjY3LDI3Njc1LDI3ODc1LDI3ODgwLDI3ODkxLDI3ODI1LDI3ODUyLDI3ODc3LDI3ODI3LDI3ODM3LDI3ODM4LDI3ODM2LDI3ODc0LDI3ODE5LDI3ODYxLDI3ODU5LDI3ODMyLDI3ODQ0LDI3ODMzLDI3ODQxLDI3ODIyLDI3ODYzLDI3ODQ1LDI3ODg5LDI3ODM5LDI3ODM1LDI3ODczLDI3ODY3LDI3ODUwLDI3ODIwLDI3ODg3LDI3ODY4LDI3ODYyLDI3ODcyLDI4ODIxLDI4ODE0LDI4ODE4LDI4ODEwLDI4ODI1LDI5MjI4LDI5MjI5LDI5MjQwLDI5MjU2LDI5Mjg3LDI5Mjg5LDI5Mzc2LDI5MzkwLDI5NDAxLDI5Mzk5LDI5MzkyLDI5NjA5LDI5NjA4LDI5NTk5LDI5NjExLDI5NjA1LDMwMDEzLDMwMTA5LDMwMTA1LDMwMTA2LDMwMzQwLDMwNDAyLDMwNDUwLDMwNDUyLDMwNjkzLDMwNzE3LDMxMDM4LDMxMDQwLDMxMDQxLDMxMTc3LDMxMTc2LDMxMzU0LDMxMzUzLDMxNDgyLDMxOTk4LDMyNTk2LDMyNjUyLDMyNjUxLDMyNzczLDMyOTU0LDMyOTMzLDMyOTMwLDMyOTQ1LDMyOTI5LDMyOTM5LDMyOTM3LDMyOTQ4LDMyOTM4LDMyOTQzLDMzMjUzLDMzMjc4LDMzMjkzLDMzNDU5LDMzNDM3LDMzNDMzLDMzNDUzLDMzNDY5LDMzNDM5LDMzNDY1LDMzNDU3LDMzNDUyLDMzNDQ1LDMzNDU1LDMzNDY0LDMzNDQzLDMzNDU2LDMzNDcwLDMzNDYzLDM0MzgyLDM0NDE3LDIxMDIxLDM0OTIwLDM2NTU1LDM2ODE0LDM2ODIwLDM2ODE3LDM3MDQ1LDM3MDQ4LDM3MDQxLDM3MDQ2LDM3MzE5LDM3MzI5LDM4MjYzLDM4MjcyLDM4NDI4LDM4NDY0LDM4NDYzLDM4NDU5LDM4NDY4LDM4NDY2LDM4NTg1LDM4NjMyLDM4NzM4LDM4NzUwLDIwMTI3LDIwMTQxLDIwMTQyLDIwNDQ5LDIwNDA1LDIwMzk5LDIwNDE1LDIwNDQ4LDIwNDMzLDIwNDMxLDIwNDQ1LDIwNDE5LDIwNDA2LDIwNDQwLDIwNDQ3LDIwNDI2LDIwNDM5LDIwMzk4LDIwNDMyLDIwNDIwLDIwNDE4LDIwNDQyLDIwNDMwLDIwNDQ2LDIwNDA3LDIwODIzLDIwODgyLDIwODgxLDIwODk2LDIxMDcwLDIxMDU5LDIxMDY2LDIxMDY5LDIxMDY4LDIxMDY3LDIxMDYzLDIxMTkxLDIxMTkzLDIxMTg3LDIxMTg1LDIxMjYxLDIxMzM1LDIxMzcxLDIxNDAyLDIxNDY3LDIxNjc2LDIxNjk2LDIxNjcyLDIxNzEwLDIxNzA1LDIxNjg4LDIxNjcwLDIxNjgzLDIxNzAzLDIxNjk4LDIxNjkzLDIxNjc0LDIxNjk3LDIxNzAwLDIxNzA0LDIxNjc5LDIxNjc1LDIxNjgxLDIxNjkxLDIxNjczLDIxNjcxLDIxNjk1LDIyMjcxLDIyNDAyLDIyNDExLDIyNDMyLDIyNDM1LDIyNDM0LDIyNDc4LDIyNDQ2LDIyNDE5LDIyODY5LDIyODY1LDIyODYzLDIyODYyLDIyODY0LDIzMDA0LDIzMDAwLDIzMDM5LDIzMDExLDIzMDE2LDIzMDQzLDIzMDEzLDIzMDE4LDIzMDAyLDIzMDE0LDIzMDQxLDIzMDM1LDIzNDAxLDIzNDU5LDIzNDYyLDIzNDYwLDIzNDU4LDIzNDYxLDIzNTUzLDIzNjMwLDIzNjMxLDIzNjI5LDIzNjI3LDIzNzY5LDIzNzYyLDI0MDU1LDI0MDkzLDI0MTAxLDI0MDk1LDI0MTg5LDI0MjI0LDI0MjMwLDI0MzE0LDI0MzI4LDI0MzY1LDI0NDIxLDI0NDU2LDI0NDUzLDI0NDU4LDI0NDU5LDI0NDU1LDI0NDYwLDI0NDU3LDI0NTk0LDI0NjA1LDI0NjA4LDI0NjEzLDI0NTkwLDI0NjE2LDI0NjUzLDI0Njg4LDI0NjgwLDI0Njc0LDI0NjQ2LDI0NjQzLDI0Njg0LDI0NjgzLDI0NjgyLDI0Njc2LDI1MTUzLDI1MzA4LDI1MzY2LDI1MzUzLDI1MzQwLDI1MzI1LDI1MzQ1LDI1MzI2LDI1MzQxLDI1MzUxLDI1MzI5LDI1MzM1LDI1MzI3LDI1MzI0LDI1MzQyLDI1MzMyLDI1MzYxLDI1MzQ2LDI1OTE5LDI1OTI1LDI2MDI3LDI2MDQ1LDI2MDgyLDI2MTQ5LDI2MTU3LDI2MTQ0LDI2MTUxLDI2MTU5LDI2MTQzLDI2MTUyLDI2MTYxLDI2MTQ4LDI2MzU5LDI2NjIzLDI2NTc5LDI2NjA5LDI2NTgwLDI2NTc2LDI2NjA0LDI2NTUwLDI2NTQzLDI2NjEzLDI2NjAxLDI2NjA3LDI2NTY0LDI2NTc3LDI2NTQ4LDI2NTg2LDI2NTk3LDI2NTUyLDI2NTc1LDI2NTkwLDI2NjExLDI2NTQ0LDI2NTg1LDI2NTk0LDI2NTg5LDI2NTc4LDI3NDk4LDI3NTIzLDI3NTI2LDI3NTczLDI3NjAyLDI3NjA3LDI3Njc5LDI3ODQ5LDI3OTE1LDI3OTU0LDI3OTQ2LDI3OTY5LDI3OTQxLDI3OTE2LDI3OTUzLDI3OTM0LDI3OTI3LDI3OTYzLDI3OTY1LDI3OTY2LDI3OTU4LDI3OTMxLDI3ODkzLDI3OTYxLDI3OTQzLDI3OTYwLDI3OTQ1LDI3OTUwLDI3OTU3LDI3OTE4LDI3OTQ3LDI4ODQzLDI4ODU4LDI4ODUxLDI4ODQ0LDI4ODQ3LDI4ODQ1LDI4ODU2LDI4ODQ2LDI4ODM2LDI5MjMyLDI5Mjk4LDI5Mjk1LDI5MzAwLDI5NDE3LDI5NDA4LDI5NDA5LDI5NjIzLDI5NjQyLDI5NjI3LDI5NjE4LDI5NjQ1LDI5NjMyLDI5NjE5LDI5OTc4LDI5OTk3LDMwMDMxLDMwMDI4LDMwMDMwLDMwMDI3LDMwMTIzLDMwMTE2LDMwMTE3LDMwMTE0LDMwMTE1LDMwMzI4LDMwMzQyLDMwMzQzLDMwMzQ0LDMwNDA4LDMwNDA2LDMwNDAzLDMwNDA1LDMwNDY1LDMwNDU3LDMwNDU2LDMwNDczLDMwNDc1LDMwNDYyLDMwNDYwLDMwNDcxLDMwNjg0LDMwNzIyLDMwNzQwLDMwNzMyLDMwNzMzLDMxMDQ2LDMxMDQ5LDMxMDQ4LDMxMDQ3LDMxMTYxLDMxMTYyLDMxMTg1LDMxMTg2LDMxMTc5LDMxMzU5LDMxMzYxLDMxNDg3LDMxNDg1LDMxODY5LDMyMDAyLDMyMDA1LDMyMDAwLDMyMDA5LDMyMDA3LDMyMDA0LDMyMDA2LDMyNTY4LDMyNjU0LDMyNzAzLDMyNzcyLDMyNzg0LDMyNzgxLDMyNzg1LDMyODIyLDMyOTgyLDMyOTk3LDMyOTg2LDMyOTYzLDMyOTY0LDMyOTcyLDMyOTkzLDMyOTg3LDMyOTc0LDMyOTkwLDMyOTk2LDMyOTg5LDMzMjY4LDMzMzE0LDMzNTExLDMzNTM5LDMzNTQxLDMzNTA3LDMzNDk5LDMzNTEwLDMzNTQwLDMzNTA5LDMzNTM4LDMzNTQ1LDMzNDkwLDMzNDk1LDMzNTIxLDMzNTM3LDMzNTAwLDMzNDkyLDMzNDg5LDMzNTAyLDMzNDkxLDMzNTAzLDMzNTE5LDMzNTQyLDM0Mzg0LDM0NDI1LDM0NDI3LDM0NDI2LDM0ODkzLDM0OTIzLDM1MjAxLDM1Mjg0LDM1MzM2LDM1MzMwLDM1MzMxLDM1OTk4LDM2MDAwLDM2MjEyLDM2MjExLDM2Mjc2LDM2NTU3LDM2NTU2LDM2ODQ4LDM2ODM4LDM2ODM0LDM2ODQyLDM2ODM3LDM2ODQ1LDM2ODQzLDM2ODM2LDM2ODQwLDM3MDY2LDM3MDcwLDM3MDU3LDM3MDU5LDM3MTk1LDM3MTk0LDM3MzI1LDM4Mjc0LDM4NDgwLDM4NDc1LDM4NDc2LDM4NDc3LDM4NzU0LDM4NzYxLDM4ODU5LDM4ODkzLDM4ODk5LDM4OTEzLDM5MDgwLDM5MTMxLDM5MTM1LDM5MzE4LDM5MzIxLDIwMDU2LDIwMTQ3LDIwNDkyLDIwNDkzLDIwNTE1LDIwNDYzLDIwNTE4LDIwNTE3LDIwNDcyLDIwNTIxLDIwNTAyLDIwNDg2LDIwNTQwLDIwNTExLDIwNTA2LDIwNDk4LDIwNDk3LDIwNDc0LDIwNDgwLDIwNTAwLDIwNTIwLDIwNDY1LDIwNTEzLDIwNDkxLDIwNTA1LDIwNTA0LDIwNDY3LDIwNDYyLDIwNTI1LDIwNTIyLDIwNDc4LDIwNTIzLDIwNDg5LDIwODYwLDIwOTAwLDIwOTAxLDIwODk4LDIwOTQxLDIwOTQwLDIwOTM0LDIwOTM5LDIxMDc4LDIxMDg0LDIxMDc2LDIxMDgzLDIxMDg1LDIxMjkwLDIxMzc1LDIxNDA3LDIxNDA1LDIxNDcxLDIxNzM2LDIxNzc2LDIxNzYxLDIxODE1LDIxNzU2LDIxNzMzLDIxNzQ2LDIxNzY2LDIxNzU0LDIxNzgwLDIxNzM3LDIxNzQxLDIxNzI5LDIxNzY5LDIxNzQyLDIxNzM4LDIxNzM0LDIxNzk5LDIxNzY3LDIxNzU3LDIxNzc1LDIyMjc1LDIyMjc2LDIyNDY2LDIyNDg0LDIyNDc1LDIyNDY3LDIyNTM3LDIyNzk5LDIyODcxLDIyODcyLDIyODc0LDIzMDU3LDIzMDY0LDIzMDY4LDIzMDcxLDIzMDY3LDIzMDU5LDIzMDIwLDIzMDcyLDIzMDc1LDIzMDgxLDIzMDc3LDIzMDUyLDIzMDQ5LDIzNDAzLDIzNjQwLDIzNDcyLDIzNDc1LDIzNDc4LDIzNDc2LDIzNDcwLDIzNDc3LDIzNDgxLDIzNDgwLDIzNTU2LDIzNjMzLDIzNjM3LDIzNjMyLDIzNzg5LDIzODA1LDIzODAzLDIzNzg2LDIzNzg0LDIzNzkyLDIzNzk4LDIzODA5LDIzNzk2LDI0MDQ2LDI0MTA5LDI0MTA3LDI0MjM1LDI0MjM3LDI0MjMxLDI0MzY5LDI0NDY2LDI0NDY1LDI0NDY0LDI0NjY1LDI0Njc1LDI0Njc3LDI0NjU2LDI0NjYxLDI0Njg1LDI0NjgxLDI0Njg3LDI0NzA4LDI0NzM1LDI0NzMwLDI0NzE3LDI0NzI0LDI0NzE2LDI0NzA5LDI0NzI2LDI1MTU5LDI1MzMxLDI1MzUyLDI1MzQzLDI1NDIyLDI1NDA2LDI1MzkxLDI1NDI5LDI1NDEwLDI1NDE0LDI1NDIzLDI1NDE3LDI1NDAyLDI1NDI0LDI1NDA1LDI1Mzg2LDI1Mzg3LDI1Mzg0LDI1NDIxLDI1NDIwLDI1OTI4LDI1OTI5LDI2MDA5LDI2MDQ5LDI2MDUzLDI2MTc4LDI2MTg1LDI2MTkxLDI2MTc5LDI2MTk0LDI2MTg4LDI2MTgxLDI2MTc3LDI2MzYwLDI2Mzg4LDI2Mzg5LDI2MzkxLDI2NjU3LDI2NjgwLDI2Njk2LDI2Njk0LDI2NzA3LDI2NjgxLDI2NjkwLDI2NzA4LDI2NjY1LDI2ODAzLDI2NjQ3LDI2NzAwLDI2NzA1LDI2Njg1LDI2NjEyLDI2NzA0LDI2Njg4LDI2Njg0LDI2NjkxLDI2NjY2LDI2NjkzLDI2NjQzLDI2NjQ4LDI2Njg5LDI3NTMwLDI3NTI5LDI3NTc1LDI3NjgzLDI3Njg3LDI3Njg4LDI3Njg2LDI3Njg0LDI3ODg4LDI4MDEwLDI4MDUzLDI4MDQwLDI4MDM5LDI4MDA2LDI4MDI0LDI4MDIzLDI3OTkzLDI4MDUxLDI4MDEyLDI4MDQxLDI4MDE0LDI3OTk0LDI4MDIwLDI4MDA5LDI4MDQ0LDI4MDQyLDI4MDI1LDI4MDM3LDI4MDA1LDI4MDUyLDI4ODc0LDI4ODg4LDI4OTAwLDI4ODg5LDI4ODcyLDI4ODc5LDI5MjQxLDI5MzA1LDI5NDM2LDI5NDMzLDI5NDM3LDI5NDMyLDI5NDMxLDI5NTc0LDI5Njc3LDI5NzA1LDI5Njc4LDI5NjY0LDI5Njc0LDI5NjYyLDMwMDM2LDMwMDQ1LDMwMDQ0LDMwMDQyLDMwMDQxLDMwMTQyLDMwMTQ5LDMwMTUxLDMwMTMwLDMwMTMxLDMwMTQxLDMwMTQwLDMwMTM3LDMwMTQ2LDMwMTM2LDMwMzQ3LDMwMzg0LDMwNDEwLDMwNDEzLDMwNDE0LDMwNTA1LDMwNDk1LDMwNDk2LDMwNTA0LDMwNjk3LDMwNzY4LDMwNzU5LDMwNzc2LDMwNzQ5LDMwNzcyLDMwNzc1LDMwNzU3LDMwNzY1LDMwNzUyLDMwNzUxLDMwNzcwLDMxMDYxLDMxMDU2LDMxMDcyLDMxMDcxLDMxMDYyLDMxMDcwLDMxMDY5LDMxMDYzLDMxMDY2LDMxMjA0LDMxMjAzLDMxMjA3LDMxMTk5LDMxMjA2LDMxMjA5LDMxMTkyLDMxMzY0LDMxMzY4LDMxNDQ5LDMxNDk0LDMxNTA1LDMxODgxLDMyMDMzLDMyMDIzLDMyMDExLDMyMDEwLDMyMDMyLDMyMDM0LDMyMDIwLDMyMDE2LDMyMDIxLDMyMDI2LDMyMDI4LDMyMDEzLDMyMDI1LDMyMDI3LDMyNTcwLDMyNjA3LDMyNjYwLDMyNzA5LDMyNzA1LDMyNzc0LDMyNzkyLDMyNzg5LDMyNzkzLDMyNzkxLDMyODI5LDMyODMxLDMzMDA5LDMzMDI2LDMzMDA4LDMzMDI5LDMzMDA1LDMzMDEyLDMzMDMwLDMzMDE2LDMzMDExLDMzMDMyLDMzMDIxLDMzMDM0LDMzMDIwLDMzMDA3LDMzMjYxLDMzMjYwLDMzMjgwLDMzMjk2LDMzMzIyLDMzMzIzLDMzMzIwLDMzMzI0LDMzNDY3LDMzNTc5LDMzNjE4LDMzNjIwLDMzNjEwLDMzNTkyLDMzNjE2LDMzNjA5LDMzNTg5LDMzNTg4LDMzNjE1LDMzNTg2LDMzNTkzLDMzNTkwLDMzNTU5LDMzNjAwLDMzNTg1LDMzNTc2LDMzNjAzLDM0Mzg4LDM0NDQyLDM0NDc0LDM0NDUxLDM0NDY4LDM0NDczLDM0NDQ0LDM0NDY3LDM0NDYwLDM0OTI4LDM0OTM1LDM0OTQ1LDM0OTQ2LDM0OTQxLDM0OTM3LDM1MzUyLDM1MzQ0LDM1MzQyLDM1MzQwLDM1MzQ5LDM1MzM4LDM1MzUxLDM1MzQ3LDM1MzUwLDM1MzQzLDM1MzQ1LDM1OTEyLDM1OTYyLDM1OTYxLDM2MDAxLDM2MDAyLDM2MjE1LDM2NTI0LDM2NTYyLDM2NTY0LDM2NTU5LDM2Nzg1LDM2ODY1LDM2ODcwLDM2ODU1LDM2ODY0LDM2ODU4LDM2ODUyLDM2ODY3LDM2ODYxLDM2ODY5LDM2ODU2LDM3MDEzLDM3MDg5LDM3MDg1LDM3MDkwLDM3MjAyLDM3MTk3LDM3MTk2LDM3MzM2LDM3MzQxLDM3MzM1LDM3MzQwLDM3MzM3LDM4Mjc1LDM4NDk4LDM4NDk5LDM4NDk3LDM4NDkxLDM4NDkzLDM4NTAwLDM4NDg4LDM4NDk0LDM4NTg3LDM5MTM4LDM5MzQwLDM5NTkyLDM5NjQwLDM5NzE3LDM5NzMwLDM5NzQwLDIwMDk0LDIwNjAyLDIwNjA1LDIwNTcyLDIwNTUxLDIwNTQ3LDIwNTU2LDIwNTcwLDIwNTUzLDIwNTgxLDIwNTk4LDIwNTU4LDIwNTY1LDIwNTk3LDIwNTk2LDIwNTk5LDIwNTU5LDIwNDk1LDIwNTkxLDIwNTg5LDIwODI4LDIwODg1LDIwOTc2LDIxMDk4LDIxMTAzLDIxMjAyLDIxMjA5LDIxMjA4LDIxMjA1LDIxMjY0LDIxMjYzLDIxMjczLDIxMzExLDIxMzEyLDIxMzEwLDIxNDQzLDI2MzY0LDIxODMwLDIxODY2LDIxODYyLDIxODI4LDIxODU0LDIxODU3LDIxODI3LDIxODM0LDIxODA5LDIxODQ2LDIxODM5LDIxODQ1LDIxODA3LDIxODYwLDIxODE2LDIxODA2LDIxODUyLDIxODA0LDIxODU5LDIxODExLDIxODI1LDIxODQ3LDIyMjgwLDIyMjgzLDIyMjgxLDIyNDk1LDIyNTMzLDIyNTM4LDIyNTM0LDIyNDk2LDIyNTAwLDIyNTIyLDIyNTMwLDIyNTgxLDIyNTE5LDIyNTIxLDIyODE2LDIyODgyLDIzMDk0LDIzMTA1LDIzMTEzLDIzMTQyLDIzMTQ2LDIzMTA0LDIzMTAwLDIzMTM4LDIzMTMwLDIzMTEwLDIzMTE0LDIzNDA4LDIzNDk1LDIzNDkzLDIzNDkyLDIzNDkwLDIzNDg3LDIzNDk0LDIzNTYxLDIzNTYwLDIzNTU5LDIzNjQ4LDIzNjQ0LDIzNjQ1LDIzODE1LDIzODE0LDIzODIyLDIzODM1LDIzODMwLDIzODQyLDIzODI1LDIzODQ5LDIzODI4LDIzODMzLDIzODQ0LDIzODQ3LDIzODMxLDI0MDM0LDI0MTIwLDI0MTE4LDI0MTE1LDI0MTE5LDI0MjQ3LDI0MjQ4LDI0MjQ2LDI0MjQ1LDI0MjU0LDI0MzczLDI0Mzc1LDI0NDA3LDI0NDI4LDI0NDI1LDI0NDI3LDI0NDcxLDI0NDczLDI0NDc4LDI0NDcyLDI0NDgxLDI0NDgwLDI0NDc2LDI0NzAzLDI0NzM5LDI0NzEzLDI0NzM2LDI0NzQ0LDI0Nzc5LDI0NzU2LDI0ODA2LDI0NzY1LDI0NzczLDI0NzYzLDI0NzU3LDI0Nzk2LDI0NzY0LDI0NzkyLDI0Nzg5LDI0Nzc0LDI0Nzk5LDI0NzYwLDI0Nzk0LDI0Nzc1LDI1MTE0LDI1MTE1LDI1MTYwLDI1NTA0LDI1NTExLDI1NDU4LDI1NDk0LDI1NTA2LDI1NTA5LDI1NDYzLDI1NDQ3LDI1NDk2LDI1NTE0LDI1NDU3LDI1NTEzLDI1NDgxLDI1NDc1LDI1NDk5LDI1NDUxLDI1NTEyLDI1NDc2LDI1NDgwLDI1NDk3LDI1NTA1LDI1NTE2LDI1NDkwLDI1NDg3LDI1NDcyLDI1NDY3LDI1NDQ5LDI1NDQ4LDI1NDY2LDI1OTQ5LDI1OTQyLDI1OTM3LDI1OTQ1LDI1OTQzLDIxODU1LDI1OTM1LDI1OTQ0LDI1OTQxLDI1OTQwLDI2MDEyLDI2MDExLDI2MDI4LDI2MDYzLDI2MDU5LDI2MDYwLDI2MDYyLDI2MjA1LDI2MjAyLDI2MjEyLDI2MjE2LDI2MjE0LDI2MjA2LDI2MzYxLDIxMjA3LDI2Mzk1LDI2NzUzLDI2Nzk5LDI2Nzg2LDI2NzcxLDI2ODA1LDI2NzUxLDI2NzQyLDI2ODAxLDI2NzkxLDI2Nzc1LDI2ODAwLDI2NzU1LDI2ODIwLDI2Nzk3LDI2NzU4LDI2NzU3LDI2NzcyLDI2NzgxLDI2NzkyLDI2NzgzLDI2Nzg1LDI2NzU0LDI3NDQyLDI3NTc4LDI3NjI3LDI3NjI4LDI3NjkxLDI4MDQ2LDI4MDkyLDI4MTQ3LDI4MTIxLDI4MDgyLDI4MTI5LDI4MTA4LDI4MTMyLDI4MTU1LDI4MTU0LDI4MTY1LDI4MTAzLDI4MTA3LDI4MDc5LDI4MTEzLDI4MDc4LDI4MTI2LDI4MTUzLDI4MDg4LDI4MTUxLDI4MTQ5LDI4MTAxLDI4MTE0LDI4MTg2LDI4MDg1LDI4MTIyLDI4MTM5LDI4MTIwLDI4MTM4LDI4MTQ1LDI4MTQyLDI4MTM2LDI4MTAyLDI4MTAwLDI4MDc0LDI4MTQwLDI4MDk1LDI4MTM0LDI4OTIxLDI4OTM3LDI4OTM4LDI4OTI1LDI4OTExLDI5MjQ1LDI5MzA5LDI5MzEzLDI5NDY4LDI5NDY3LDI5NDYyLDI5NDU5LDI5NDY1LDI5NTc1LDI5NzAxLDI5NzA2LDI5Njk5LDI5NzAyLDI5Njk0LDI5NzA5LDI5OTIwLDI5OTQyLDI5OTQzLDI5OTgwLDI5OTg2LDMwMDUzLDMwMDU0LDMwMDUwLDMwMDY0LDMwMDk1LDMwMTY0LDMwMTY1LDMwMTMzLDMwMTU0LDMwMTU3LDMwMzUwLDMwNDIwLDMwNDE4LDMwNDI3LDMwNTE5LDMwNTI2LDMwNTI0LDMwNTE4LDMwNTIwLDMwNTIyLDMwODI3LDMwNzg3LDMwNzk4LDMxMDc3LDMxMDgwLDMxMDg1LDMxMjI3LDMxMzc4LDMxMzgxLDMxNTIwLDMxNTI4LDMxNTE1LDMxNTMyLDMxNTI2LDMxNTEzLDMxNTE4LDMxNTM0LDMxODkwLDMxODk1LDMxODkzLDMyMDcwLDMyMDY3LDMyMTEzLDMyMDQ2LDMyMDU3LDMyMDYwLDMyMDY0LDMyMDQ4LDMyMDUxLDMyMDY4LDMyMDQ3LDMyMDY2LDMyMDUwLDMyMDQ5LDMyNTczLDMyNjcwLDMyNjY2LDMyNzE2LDMyNzE4LDMyNzIyLDMyNzk2LDMyODQyLDMyODM4LDMzMDcxLDMzMDQ2LDMzMDU5LDMzMDY3LDMzMDY1LDMzMDcyLDMzMDYwLDMzMjgyLDMzMzMzLDMzMzM1LDMzMzM0LDMzMzM3LDMzNjc4LDMzNjk0LDMzNjg4LDMzNjU2LDMzNjk4LDMzNjg2LDMzNzI1LDMzNzA3LDMzNjgyLDMzNjc0LDMzNjgzLDMzNjczLDMzNjk2LDMzNjU1LDMzNjU5LDMzNjYwLDMzNjcwLDMzNzAzLDM0Mzg5LDI0NDI2LDM0NTAzLDM0NDk2LDM0NDg2LDM0NTAwLDM0NDg1LDM0NTAyLDM0NTA3LDM0NDgxLDM0NDc5LDM0NTA1LDM0ODk5LDM0OTc0LDM0OTUyLDM0OTg3LDM0OTYyLDM0OTY2LDM0OTU3LDM0OTU1LDM1MjE5LDM1MjE1LDM1MzcwLDM1MzU3LDM1MzYzLDM1MzY1LDM1Mzc3LDM1MzczLDM1MzU5LDM1MzU1LDM1MzYyLDM1OTEzLDM1OTMwLDM2MDA5LDM2MDEyLDM2MDExLDM2MDA4LDM2MDEwLDM2MDA3LDM2MTk5LDM2MTk4LDM2Mjg2LDM2MjgyLDM2NTcxLDM2NTc1LDM2ODg5LDM2ODc3LDM2ODkwLDM2ODg3LDM2ODk5LDM2ODk1LDM2ODkzLDM2ODgwLDM2ODg1LDM2ODk0LDM2ODk2LDM2ODc5LDM2ODk4LDM2ODg2LDM2ODkxLDM2ODg0LDM3MDk2LDM3MTAxLDM3MTE3LDM3MjA3LDM3MzI2LDM3MzY1LDM3MzUwLDM3MzQ3LDM3MzUxLDM3MzU3LDM3MzUzLDM4MjgxLDM4NTA2LDM4NTE3LDM4NTE1LDM4NTIwLDM4NTEyLDM4NTE2LDM4NTE4LDM4NTE5LDM4NTA4LDM4NTkyLDM4NjM0LDM4NjMzLDMxNDU2LDMxNDU1LDM4OTE0LDM4OTE1LDM5NzcwLDQwMTY1LDQwNTY1LDQwNTc1LDQwNjEzLDQwNjM1LDIwNjQyLDIwNjIxLDIwNjEzLDIwNjMzLDIwNjI1LDIwNjA4LDIwNjMwLDIwNjMyLDIwNjM0LDI2MzY4LDIwOTc3LDIxMTA2LDIxMTA4LDIxMTA5LDIxMDk3LDIxMjE0LDIxMjEzLDIxMjExLDIxMzM4LDIxNDEzLDIxODgzLDIxODg4LDIxOTI3LDIxODg0LDIxODk4LDIxOTE3LDIxOTEyLDIxODkwLDIxOTE2LDIxOTMwLDIxOTA4LDIxODk1LDIxODk5LDIxODkxLDIxOTM5LDIxOTM0LDIxOTE5LDIxODIyLDIxOTM4LDIxOTE0LDIxOTQ3LDIxOTMyLDIxOTM3LDIxODg2LDIxODk3LDIxOTMxLDIxOTEzLDIyMjg1LDIyNTc1LDIyNTcwLDIyNTgwLDIyNTY0LDIyNTc2LDIyNTc3LDIyNTYxLDIyNTU3LDIyNTYwLDIyNzc3LDIyNzc4LDIyODgwLDIzMTU5LDIzMTk0LDIzMTY3LDIzMTg2LDIzMTk1LDIzMjA3LDIzNDExLDIzNDA5LDIzNTA2LDIzNTAwLDIzNTA3LDIzNTA0LDIzNTYyLDIzNTYzLDIzNjAxLDIzODg0LDIzODg4LDIzODYwLDIzODc5LDI0MDYxLDI0MTMzLDI0MTI1LDI0MTI4LDI0MTMxLDI0MTkwLDI0MjY2LDI0MjU3LDI0MjU4LDI0MjYwLDI0MzgwLDI0NDI5LDI0NDg5LDI0NDkwLDI0NDg4LDI0Nzg1LDI0ODAxLDI0NzU0LDI0NzU4LDI0ODAwLDI0ODYwLDI0ODY3LDI0ODI2LDI0ODUzLDI0ODE2LDI0ODI3LDI0ODIwLDI0OTM2LDI0ODE3LDI0ODQ2LDI0ODIyLDI0ODQxLDI0ODMyLDI0ODUwLDI1MTE5LDI1MTYxLDI1NTA3LDI1NDg0LDI1NTUxLDI1NTM2LDI1NTc3LDI1NTQ1LDI1NTQyLDI1NTQ5LDI1NTU0LDI1NTcxLDI1NTUyLDI1NTY5LDI1NTU4LDI1NTgxLDI1NTgyLDI1NDYyLDI1NTg4LDI1NTc4LDI1NTYzLDI1NjgyLDI1NTYyLDI1NTkzLDI1OTUwLDI1OTU4LDI1OTU0LDI1OTU1LDI2MDAxLDI2MDAwLDI2MDMxLDI2MjIyLDI2MjI0LDI2MjI4LDI2MjMwLDI2MjIzLDI2MjU3LDI2MjM0LDI2MjM4LDI2MjMxLDI2MzY2LDI2MzY3LDI2Mzk5LDI2Mzk3LDI2ODc0LDI2ODM3LDI2ODQ4LDI2ODQwLDI2ODM5LDI2ODg1LDI2ODQ3LDI2ODY5LDI2ODYyLDI2ODU1LDI2ODczLDI2ODM0LDI2ODY2LDI2ODUxLDI2ODI3LDI2ODI5LDI2ODkzLDI2ODk4LDI2ODk0LDI2ODI1LDI2ODQyLDI2OTkwLDI2ODc1LDI3NDU0LDI3NDUwLDI3NDUzLDI3NTQ0LDI3NTQyLDI3NTgwLDI3NjMxLDI3Njk0LDI3Njk1LDI3NjkyLDI4MjA3LDI4MjE2LDI4MjQ0LDI4MTkzLDI4MjEwLDI4MjYzLDI4MjM0LDI4MTkyLDI4MTk3LDI4MTk1LDI4MTg3LDI4MjUxLDI4MjQ4LDI4MTk2LDI4MjQ2LDI4MjcwLDI4MjA1LDI4MTk4LDI4MjcxLDI4MjEyLDI4MjM3LDI4MjE4LDI4MjA0LDI4MjI3LDI4MTg5LDI4MjIyLDI4MzYzLDI4Mjk3LDI4MTg1LDI4MjM4LDI4MjU5LDI4MjI4LDI4Mjc0LDI4MjY1LDI4MjU1LDI4OTUzLDI4OTU0LDI4OTY2LDI4OTc2LDI4OTYxLDI4OTgyLDI5MDM4LDI4OTU2LDI5MjYwLDI5MzE2LDI5MzEyLDI5NDk0LDI5NDc3LDI5NDkyLDI5NDgxLDI5NzU0LDI5NzM4LDI5NzQ3LDI5NzMwLDI5NzMzLDI5NzQ5LDI5NzUwLDI5NzQ4LDI5NzQzLDI5NzIzLDI5NzM0LDI5NzM2LDI5OTg5LDI5OTkwLDMwMDU5LDMwMDU4LDMwMTc4LDMwMTcxLDMwMTc5LDMwMTY5LDMwMTY4LDMwMTc0LDMwMTc2LDMwMzMxLDMwMzMyLDMwMzU4LDMwMzU1LDMwMzg4LDMwNDI4LDMwNTQzLDMwNzAxLDMwODEzLDMwODI4LDMwODMxLDMxMjQ1LDMxMjQwLDMxMjQzLDMxMjM3LDMxMjMyLDMxMzg0LDMxMzgzLDMxMzgyLDMxNDYxLDMxNDU5LDMxNTYxLDMxNTc0LDMxNTU4LDMxNTY4LDMxNTcwLDMxNTcyLDMxNTY1LDMxNTYzLDMxNTY3LDMxNTY5LDMxOTAzLDMxOTA5LDMyMDk0LDMyMDgwLDMyMTA0LDMyMDg1LDMyMDQzLDMyMTEwLDMyMTE0LDMyMDk3LDMyMTAyLDMyMDk4LDMyMTEyLDMyMTE1LDIxODkyLDMyNzI0LDMyNzI1LDMyNzc5LDMyODUwLDMyOTAxLDMzMTA5LDMzMTA4LDMzMDk5LDMzMTA1LDMzMTAyLDMzMDgxLDMzMDk0LDMzMDg2LDMzMTAwLDMzMTA3LDMzMTQwLDMzMjk4LDMzMzA4LDMzNzY5LDMzNzk1LDMzNzg0LDMzODA1LDMzNzYwLDMzNzMzLDMzODAzLDMzNzI5LDMzNzc1LDMzNzc3LDMzNzgwLDMzODc5LDMzODAyLDMzNzc2LDMzODA0LDMzNzQwLDMzNzg5LDMzNzc4LDMzNzM4LDMzODQ4LDMzODA2LDMzNzk2LDMzNzU2LDMzNzk5LDMzNzQ4LDMzNzU5LDM0Mzk1LDM0NTI3LDM0NTIxLDM0NTQxLDM0NTE2LDM0NTIzLDM0NTMyLDM0NTEyLDM0NTI2LDM0OTAzLDM1MDA5LDM1MDEwLDM0OTkzLDM1MjAzLDM1MjIyLDM1Mzg3LDM1NDI0LDM1NDEzLDM1NDIyLDM1Mzg4LDM1MzkzLDM1NDEyLDM1NDE5LDM1NDA4LDM1Mzk4LDM1MzgwLDM1Mzg2LDM1MzgyLDM1NDE0LDM1OTM3LDM1OTcwLDM2MDE1LDM2MDI4LDM2MDE5LDM2MDI5LDM2MDMzLDM2MDI3LDM2MDMyLDM2MDIwLDM2MDIzLDM2MDIyLDM2MDMxLDM2MDI0LDM2MjM0LDM2MjI5LDM2MjI1LDM2MzAyLDM2MzE3LDM2Mjk5LDM2MzE0LDM2MzA1LDM2MzAwLDM2MzE1LDM2Mjk0LDM2NjAzLDM2NjAwLDM2NjA0LDM2NzY0LDM2OTEwLDM2OTE3LDM2OTEzLDM2OTIwLDM2OTE0LDM2OTE4LDM3MTIyLDM3MTA5LDM3MTI5LDM3MTE4LDM3MjE5LDM3MjIxLDM3MzI3LDM3Mzk2LDM3Mzk3LDM3NDExLDM3Mzg1LDM3NDA2LDM3Mzg5LDM3MzkyLDM3MzgzLDM3MzkzLDM4MjkyLDM4Mjg3LDM4MjgzLDM4Mjg5LDM4MjkxLDM4MjkwLDM4Mjg2LDM4NTM4LDM4NTQyLDM4NTM5LDM4NTI1LDM4NTMzLDM4NTM0LDM4NTQxLDM4NTE0LDM4NTMyLDM4NTkzLDM4NTk3LDM4NTk2LDM4NTk4LDM4NTk5LDM4NjM5LDM4NjQyLDM4ODYwLDM4OTE3LDM4OTE4LDM4OTIwLDM5MTQzLDM5MTQ2LDM5MTUxLDM5MTQ1LDM5MTU0LDM5MTQ5LDM5MzQyLDM5MzQxLDQwNjQzLDQwNjUzLDQwNjU3LDIwMDk4LDIwNjUzLDIwNjYxLDIwNjU4LDIwNjU5LDIwNjc3LDIwNjcwLDIwNjUyLDIwNjYzLDIwNjY3LDIwNjU1LDIwNjc5LDIxMTE5LDIxMTExLDIxMTE3LDIxMjE1LDIxMjIyLDIxMjIwLDIxMjE4LDIxMjE5LDIxMjk1LDIxOTgzLDIxOTkyLDIxOTcxLDIxOTkwLDIxOTY2LDIxOTgwLDIxOTU5LDIxOTY5LDIxOTg3LDIxOTg4LDIxOTk5LDIxOTc4LDIxOTg1LDIxOTU3LDIxOTU4LDIxOTg5LDIxOTYxLDIyMjkwLDIyMjkxLDIyNjIyLDIyNjA5LDIyNjE2LDIyNjE1LDIyNjE4LDIyNjEyLDIyNjM1LDIyNjA0LDIyNjM3LDIyNjAyLDIyNjI2LDIyNjEwLDIyNjAzLDIyODg3LDIzMjMzLDIzMjQxLDIzMjQ0LDIzMjMwLDIzMjI5LDIzMjI4LDIzMjE5LDIzMjM0LDIzMjE4LDIzOTEzLDIzOTE5LDI0MTQwLDI0MTg1LDI0MjY1LDI0MjY0LDI0MzM4LDI0NDA5LDI0NDkyLDI0NDk0LDI0ODU4LDI0ODQ3LDI0OTA0LDI0ODYzLDI0ODE5LDI0ODU5LDI0ODI1LDI0ODMzLDI0ODQwLDI0OTEwLDI0OTA4LDI0OTAwLDI0OTA5LDI0ODk0LDI0ODg0LDI0ODcxLDI0ODQ1LDI0ODM4LDI0ODg3LDI1MTIxLDI1MTIyLDI1NjE5LDI1NjYyLDI1NjMwLDI1NjQyLDI1NjQ1LDI1NjYxLDI1NjQ0LDI1NjE1LDI1NjI4LDI1NjIwLDI1NjEzLDI1NjU0LDI1NjIyLDI1NjIzLDI1NjA2LDI1OTY0LDI2MDE1LDI2MDMyLDI2MjYzLDI2MjQ5LDI2MjQ3LDI2MjQ4LDI2MjYyLDI2MjQ0LDI2MjY0LDI2MjUzLDI2MzcxLDI3MDI4LDI2OTg5LDI2OTcwLDI2OTk5LDI2OTc2LDI2OTY0LDI2OTk3LDI2OTI4LDI3MDEwLDI2OTU0LDI2OTg0LDI2OTg3LDI2OTc0LDI2OTYzLDI3MDAxLDI3MDE0LDI2OTczLDI2OTc5LDI2OTcxLDI3NDYzLDI3NTA2LDI3NTg0LDI3NTgzLDI3NjAzLDI3NjQ1LDI4MzIyLDI4MzM1LDI4MzcxLDI4MzQyLDI4MzU0LDI4MzA0LDI4MzE3LDI4MzU5LDI4MzU3LDI4MzI1LDI4MzEyLDI4MzQ4LDI4MzQ2LDI4MzMxLDI4MzY5LDI4MzEwLDI4MzE2LDI4MzU2LDI4MzcyLDI4MzMwLDI4MzI3LDI4MzQwLDI5MDA2LDI5MDE3LDI5MDMzLDI5MDI4LDI5MDAxLDI5MDMxLDI5MDIwLDI5MDM2LDI5MDMwLDI5MDA0LDI5MDI5LDI5MDIyLDI4OTk4LDI5MDMyLDI5MDE0LDI5MjQyLDI5MjY2LDI5NDk1LDI5NTA5LDI5NTAzLDI5NTAyLDI5ODA3LDI5Nzg2LDI5NzgxLDI5NzkxLDI5NzkwLDI5NzYxLDI5NzU5LDI5Nzg1LDI5Nzg3LDI5Nzg4LDMwMDcwLDMwMDcyLDMwMjA4LDMwMTkyLDMwMjA5LDMwMTk0LDMwMTkzLDMwMjAyLDMwMjA3LDMwMTk2LDMwMTk1LDMwNDMwLDMwNDMxLDMwNTU1LDMwNTcxLDMwNTY2LDMwNTU4LDMwNTYzLDMwNTg1LDMwNTcwLDMwNTcyLDMwNTU2LDMwNTY1LDMwNTY4LDMwNTYyLDMwNzAyLDMwODYyLDMwODk2LDMwODcxLDMwODcyLDMwODYwLDMwODU3LDMwODQ0LDMwODY1LDMwODY3LDMwODQ3LDMxMDk4LDMxMTAzLDMxMTA1LDMzODM2LDMxMTY1LDMxMjYwLDMxMjU4LDMxMjY0LDMxMjUyLDMxMjYzLDMxMjYyLDMxMzkxLDMxMzkyLDMxNjA3LDMxNjgwLDMxNTg0LDMxNTk4LDMxNTkxLDMxOTIxLDMxOTIzLDMxOTI1LDMyMTQ3LDMyMTIxLDMyMTQ1LDMyMTI5LDMyMTQzLDMyMDkxLDMyNjIyLDMyNjE3LDMyNjE4LDMyNjI2LDMyNjgxLDMyNjgwLDMyNjc2LDMyODU0LDMyODU2LDMyOTAyLDMyOTAwLDMzMTM3LDMzMTM2LDMzMTQ0LDMzMTI1LDMzMTM0LDMzMTM5LDMzMTMxLDMzMTQ1LDMzMTQ2LDMzMTI2LDMzMjg1LDMzMzUxLDMzOTIyLDMzOTExLDMzODUzLDMzODQxLDMzOTA5LDMzODk0LDMzODk5LDMzODY1LDMzOTAwLDMzODgzLDMzODUyLDMzODQ1LDMzODg5LDMzODkxLDMzODk3LDMzOTAxLDMzODYyLDM0Mzk4LDM0Mzk2LDM0Mzk5LDM0NTUzLDM0NTc5LDM0NTY4LDM0NTY3LDM0NTYwLDM0NTU4LDM0NTU1LDM0NTYyLDM0NTYzLDM0NTY2LDM0NTcwLDM0OTA1LDM1MDM5LDM1MDI4LDM1MDMzLDM1MDM2LDM1MDMyLDM1MDM3LDM1MDQxLDM1MDE4LDM1MDI5LDM1MDI2LDM1MjI4LDM1Mjk5LDM1NDM1LDM1NDQyLDM1NDQzLDM1NDMwLDM1NDMzLDM1NDQwLDM1NDYzLDM1NDUyLDM1NDI3LDM1NDg4LDM1NDQxLDM1NDYxLDM1NDM3LDM1NDI2LDM1NDM4LDM1NDM2LDM1NDQ5LDM1NDUxLDM1MzkwLDM1NDMyLDM1OTM4LDM1OTc4LDM1OTc3LDM2MDQyLDM2MDM5LDM2MDQwLDM2MDM2LDM2MDE4LDM2MDM1LDM2MDM0LDM2MDM3LDM2MzIxLDM2MzE5LDM2MzI4LDM2MzM1LDM2MzM5LDM2MzQ2LDM2MzMwLDM2MzI0LDM2MzI2LDM2NTMwLDM2NjExLDM2NjE3LDM2NjA2LDM2NjE4LDM2NzY3LDM2Nzg2LDM2OTM5LDM2OTM4LDM2OTQ3LDM2OTMwLDM2OTQ4LDM2OTI0LDM2OTQ5LDM2OTQ0LDM2OTM1LDM2OTQzLDM2OTQyLDM2OTQxLDM2OTQ1LDM2OTI2LDM2OTI5LDM3MTM4LDM3MTQzLDM3MjI4LDM3MjI2LDM3MjI1LDM3MzIxLDM3NDMxLDM3NDYzLDM3NDMyLDM3NDM3LDM3NDQwLDM3NDM4LDM3NDY3LDM3NDUxLDM3NDc2LDM3NDU3LDM3NDI4LDM3NDQ5LDM3NDUzLDM3NDQ1LDM3NDMzLDM3NDM5LDM3NDY2LDM4Mjk2LDM4NTUyLDM4NTQ4LDM4NTQ5LDM4NjA1LDM4NjAzLDM4NjAxLDM4NjAyLDM4NjQ3LDM4NjUxLDM4NjQ5LDM4NjQ2LDM4NzQyLDM4NzcyLDM4Nzc0LDM4OTI4LDM4OTI5LDM4OTMxLDM4OTIyLDM4OTMwLDM4OTI0LDM5MTY0LDM5MTU2LDM5MTY1LDM5MTY2LDM5MzQ3LDM5MzQ1LDM5MzQ4LDM5NjQ5LDQwMTY5LDQwNTc4LDQwNzE4LDQwNzIzLDQwNzM2LDIwNzExLDIwNzE4LDIwNzA5LDIwNjk0LDIwNzE3LDIwNjk4LDIwNjkzLDIwNjg3LDIwNjg5LDIwNzIxLDIwNjg2LDIwNzEzLDIwODM0LDIwOTc5LDIxMTIzLDIxMTIyLDIxMjk3LDIxNDIxLDIyMDE0LDIyMDE2LDIyMDQzLDIyMDM5LDIyMDEzLDIyMDM2LDIyMDIyLDIyMDI1LDIyMDI5LDIyMDMwLDIyMDA3LDIyMDM4LDIyMDQ3LDIyMDI0LDIyMDMyLDIyMDA2LDIyMjk2LDIyMjk0LDIyNjQ1LDIyNjU0LDIyNjU5LDIyNjc1LDIyNjY2LDIyNjQ5LDIyNjYxLDIyNjUzLDIyNzgxLDIyODIxLDIyODE4LDIyODIwLDIyODkwLDIyODg5LDIzMjY1LDIzMjcwLDIzMjczLDIzMjU1LDIzMjU0LDIzMjU2LDIzMjY3LDIzNDEzLDIzNTE4LDIzNTI3LDIzNTIxLDIzNTI1LDIzNTI2LDIzNTI4LDIzNTIyLDIzNTI0LDIzNTE5LDIzNTY1LDIzNjUwLDIzOTQwLDIzOTQzLDI0MTU1LDI0MTYzLDI0MTQ5LDI0MTUxLDI0MTQ4LDI0Mjc1LDI0Mjc4LDI0MzMwLDI0MzkwLDI0NDMyLDI0NTA1LDI0OTAzLDI0ODk1LDI0OTA3LDI0OTUxLDI0OTMwLDI0OTMxLDI0OTI3LDI0OTIyLDI0OTIwLDI0OTQ5LDI1MTMwLDI1NzM1LDI1Njg4LDI1Njg0LDI1NzY0LDI1NzIwLDI1Njk1LDI1NzIyLDI1NjgxLDI1NzAzLDI1NjUyLDI1NzA5LDI1NzIzLDI1OTcwLDI2MDE3LDI2MDcxLDI2MDcwLDI2Mjc0LDI2MjgwLDI2MjY5LDI3MDM2LDI3MDQ4LDI3MDI5LDI3MDczLDI3MDU0LDI3MDkxLDI3MDgzLDI3MDM1LDI3MDYzLDI3MDY3LDI3MDUxLDI3MDYwLDI3MDg4LDI3MDg1LDI3MDUzLDI3MDg0LDI3MDQ2LDI3MDc1LDI3MDQzLDI3NDY1LDI3NDY4LDI3Njk5LDI4NDY3LDI4NDM2LDI4NDE0LDI4NDM1LDI4NDA0LDI4NDU3LDI4NDc4LDI4NDQ4LDI4NDYwLDI4NDMxLDI4NDE4LDI4NDUwLDI4NDE1LDI4Mzk5LDI4NDIyLDI4NDY1LDI4NDcyLDI4NDY2LDI4NDUxLDI4NDM3LDI4NDU5LDI4NDYzLDI4NTUyLDI4NDU4LDI4Mzk2LDI4NDE3LDI4NDAyLDI4MzY0LDI4NDA3LDI5MDc2LDI5MDgxLDI5MDUzLDI5MDY2LDI5MDYwLDI5MDc0LDI5MjQ2LDI5MzMwLDI5MzM0LDI5NTA4LDI5NTIwLDI5Nzk2LDI5Nzk1LDI5ODAyLDI5ODA4LDI5ODA1LDI5OTU2LDMwMDk3LDMwMjQ3LDMwMjIxLDMwMjE5LDMwMjE3LDMwMjI3LDMwNDMzLDMwNDM1LDMwNTk2LDMwNTg5LDMwNTkxLDMwNTYxLDMwOTEzLDMwODc5LDMwODg3LDMwODk5LDMwODg5LDMwODgzLDMxMTE4LDMxMTE5LDMxMTE3LDMxMjc4LDMxMjgxLDMxNDAyLDMxNDAxLDMxNDY5LDMxNDcxLDMxNjQ5LDMxNjM3LDMxNjI3LDMxNjA1LDMxNjM5LDMxNjQ1LDMxNjM2LDMxNjMxLDMxNjcyLDMxNjIzLDMxNjIwLDMxOTI5LDMxOTMzLDMxOTM0LDMyMTg3LDMyMTc2LDMyMTU2LDMyMTg5LDMyMTkwLDMyMTYwLDMyMjAyLDMyMTgwLDMyMTc4LDMyMTc3LDMyMTg2LDMyMTYyLDMyMTkxLDMyMTgxLDMyMTg0LDMyMTczLDMyMjEwLDMyMTk5LDMyMTcyLDMyNjI0LDMyNzM2LDMyNzM3LDMyNzM1LDMyODYyLDMyODU4LDMyOTAzLDMzMTA0LDMzMTUyLDMzMTY3LDMzMTYwLDMzMTYyLDMzMTUxLDMzMTU0LDMzMjU1LDMzMjc0LDMzMjg3LDMzMzAwLDMzMzEwLDMzMzU1LDMzOTkzLDMzOTgzLDMzOTkwLDMzOTg4LDMzOTQ1LDMzOTUwLDMzOTcwLDMzOTQ4LDMzOTk1LDMzOTc2LDMzOTg0LDM0MDAzLDMzOTM2LDMzOTgwLDM0MDAxLDMzOTk0LDM0NjIzLDM0NTg4LDM0NjE5LDM0NTk0LDM0NTk3LDM0NjEyLDM0NTg0LDM0NjQ1LDM0NjE1LDM0NjAxLDM1MDU5LDM1MDc0LDM1MDYwLDM1MDY1LDM1MDY0LDM1MDY5LDM1MDQ4LDM1MDk4LDM1MDU1LDM1NDk0LDM1NDY4LDM1NDg2LDM1NDkxLDM1NDY5LDM1NDg5LDM1NDc1LDM1NDkyLDM1NDk4LDM1NDkzLDM1NDk2LDM1NDgwLDM1NDczLDM1NDgyLDM1NDk1LDM1OTQ2LDM1OTgxLDM1OTgwLDM2MDUxLDM2MDQ5LDM2MDUwLDM2MjAzLDM2MjQ5LDM2MjQ1LDM2MzQ4LDM2NjI4LDM2NjI2LDM2NjI5LDM2NjI3LDM2NzcxLDM2OTYwLDM2OTUyLDM2OTU2LDM2OTYzLDM2OTUzLDM2OTU4LDM2OTYyLDM2OTU3LDM2OTU1LDM3MTQ1LDM3MTQ0LDM3MTUwLDM3MjM3LDM3MjQwLDM3MjM5LDM3MjM2LDM3NDk2LDM3NTA0LDM3NTA5LDM3NTI4LDM3NTI2LDM3NDk5LDM3NTIzLDM3NTMyLDM3NTQ0LDM3NTAwLDM3NTIxLDM4MzA1LDM4MzEyLDM4MzEzLDM4MzA3LDM4MzA5LDM4MzA4LDM4NTUzLDM4NTU2LDM4NTU1LDM4NjA0LDM4NjEwLDM4NjU2LDM4NzgwLDM4Nzg5LDM4OTAyLDM4OTM1LDM4OTM2LDM5MDg3LDM5MDg5LDM5MTcxLDM5MTczLDM5MTgwLDM5MTc3LDM5MzYxLDM5NTk5LDM5NjAwLDM5NjU0LDM5NzQ1LDM5NzQ2LDQwMTgwLDQwMTgyLDQwMTc5LDQwNjM2LDQwNzYzLDQwNzc4LDIwNzQwLDIwNzM2LDIwNzMxLDIwNzI1LDIwNzI5LDIwNzM4LDIwNzQ0LDIwNzQ1LDIwNzQxLDIwOTU2LDIxMTI3LDIxMTI4LDIxMTI5LDIxMTMzLDIxMTMwLDIxMjMyLDIxNDI2LDIyMDYyLDIyMDc1LDIyMDczLDIyMDY2LDIyMDc5LDIyMDY4LDIyMDU3LDIyMDk5LDIyMDk0LDIyMTAzLDIyMTMyLDIyMDcwLDIyMDYzLDIyMDY0LDIyNjU2LDIyNjg3LDIyNjg2LDIyNzA3LDIyNjg0LDIyNzAyLDIyNjk3LDIyNjk0LDIyODkzLDIzMzA1LDIzMjkxLDIzMzA3LDIzMjg1LDIzMzA4LDIzMzA0LDIzNTM0LDIzNTMyLDIzNTI5LDIzNTMxLDIzNjUyLDIzNjUzLDIzOTY1LDIzOTU2LDI0MTYyLDI0MTU5LDI0MTYxLDI0MjkwLDI0MjgyLDI0Mjg3LDI0Mjg1LDI0MjkxLDI0Mjg4LDI0MzkyLDI0NDMzLDI0NTAzLDI0NTAxLDI0OTUwLDI0OTM1LDI0OTQyLDI0OTI1LDI0OTE3LDI0OTYyLDI0OTU2LDI0OTQ0LDI0OTM5LDI0OTU4LDI0OTk5LDI0OTc2LDI1MDAzLDI0OTc0LDI1MDA0LDI0OTg2LDI0OTk2LDI0OTgwLDI1MDA2LDI1MTM0LDI1NzA1LDI1NzExLDI1NzIxLDI1NzU4LDI1Nzc4LDI1NzM2LDI1NzQ0LDI1Nzc2LDI1NzY1LDI1NzQ3LDI1NzQ5LDI1NzY5LDI1NzQ2LDI1Nzc0LDI1NzczLDI1NzcxLDI1NzU0LDI1NzcyLDI1NzUzLDI1NzYyLDI1Nzc5LDI1OTczLDI1OTc1LDI1OTc2LDI2Mjg2LDI2MjgzLDI2MjkyLDI2Mjg5LDI3MTcxLDI3MTY3LDI3MTEyLDI3MTM3LDI3MTY2LDI3MTYxLDI3MTMzLDI3MTY5LDI3MTU1LDI3MTQ2LDI3MTIzLDI3MTM4LDI3MTQxLDI3MTE3LDI3MTUzLDI3NDcyLDI3NDcwLDI3NTU2LDI3NTg5LDI3NTkwLDI4NDc5LDI4NTQwLDI4NTQ4LDI4NDk3LDI4NTE4LDI4NTAwLDI4NTUwLDI4NTI1LDI4NTA3LDI4NTM2LDI4NTI2LDI4NTU4LDI4NTM4LDI4NTI4LDI4NTE2LDI4NTY3LDI4NTA0LDI4MzczLDI4NTI3LDI4NTEyLDI4NTExLDI5MDg3LDI5MTAwLDI5MTA1LDI5MDk2LDI5MjcwLDI5MzM5LDI5NTE4LDI5NTI3LDI5ODAxLDI5ODM1LDI5ODI3LDI5ODIyLDI5ODI0LDMwMDc5LDMwMjQwLDMwMjQ5LDMwMjM5LDMwMjQ0LDMwMjQ2LDMwMjQxLDMwMjQyLDMwMzYyLDMwMzk0LDMwNDM2LDMwNjA2LDMwNTk5LDMwNjA0LDMwNjA5LDMwNjAzLDMwOTIzLDMwOTE3LDMwOTA2LDMwOTIyLDMwOTEwLDMwOTMzLDMwOTA4LDMwOTI4LDMxMjk1LDMxMjkyLDMxMjk2LDMxMjkzLDMxMjg3LDMxMjkxLDMxNDA3LDMxNDA2LDMxNjYxLDMxNjY1LDMxNjg0LDMxNjY4LDMxNjg2LDMxNjg3LDMxNjgxLDMxNjQ4LDMxNjkyLDMxOTQ2LDMyMjI0LDMyMjQ0LDMyMjM5LDMyMjUxLDMyMjE2LDMyMjM2LDMyMjIxLDMyMjMyLDMyMjI3LDMyMjE4LDMyMjIyLDMyMjMzLDMyMTU4LDMyMjE3LDMyMjQyLDMyMjQ5LDMyNjI5LDMyNjMxLDMyNjg3LDMyNzQ1LDMyODA2LDMzMTc5LDMzMTgwLDMzMTgxLDMzMTg0LDMzMTc4LDMzMTc2LDM0MDcxLDM0MTA5LDM0MDc0LDM0MDMwLDM0MDkyLDM0MDkzLDM0MDY3LDM0MDY1LDM0MDgzLDM0MDgxLDM0MDY4LDM0MDI4LDM0MDg1LDM0MDQ3LDM0MDU0LDM0NjkwLDM0Njc2LDM0Njc4LDM0NjU2LDM0NjYyLDM0NjgwLDM0NjY0LDM0NjQ5LDM0NjQ3LDM0NjM2LDM0NjQzLDM0OTA3LDM0OTA5LDM1MDg4LDM1MDc5LDM1MDkwLDM1MDkxLDM1MDkzLDM1MDgyLDM1NTE2LDM1NTM4LDM1NTI3LDM1NTI0LDM1NDc3LDM1NTMxLDM1NTc2LDM1NTA2LDM1NTI5LDM1NTIyLDM1NTE5LDM1NTA0LDM1NTQyLDM1NTMzLDM1NTEwLDM1NTEzLDM1NTQ3LDM1OTE2LDM1OTE4LDM1OTQ4LDM2MDY0LDM2MDYyLDM2MDcwLDM2MDY4LDM2MDc2LDM2MDc3LDM2MDY2LDM2MDY3LDM2MDYwLDM2MDc0LDM2MDY1LDM2MjA1LDM2MjU1LDM2MjU5LDM2Mzk1LDM2MzY4LDM2MzgxLDM2Mzg2LDM2MzY3LDM2MzkzLDM2MzgzLDM2Mzg1LDM2MzgyLDM2NTM4LDM2NjM3LDM2NjM1LDM2NjM5LDM2NjQ5LDM2NjQ2LDM2NjUwLDM2NjM2LDM2NjM4LDM2NjQ1LDM2OTY5LDM2OTc0LDM2OTY4LDM2OTczLDM2OTgzLDM3MTY4LDM3MTY1LDM3MTU5LDM3MTY5LDM3MjU1LDM3MjU3LDM3MjU5LDM3MjUxLDM3NTczLDM3NTYzLDM3NTU5LDM3NjEwLDM3NTQ4LDM3NjA0LDM3NTY5LDM3NTU1LDM3NTY0LDM3NTg2LDM3NTc1LDM3NjE2LDM3NTU0LDM4MzE3LDM4MzIxLDM4NjYwLDM4NjYyLDM4NjYzLDM4NjY1LDM4NzUyLDM4Nzk3LDM4Nzk1LDM4Nzk5LDM4OTQ1LDM4OTU1LDM4OTQwLDM5MDkxLDM5MTc4LDM5MTg3LDM5MTg2LDM5MTkyLDM5Mzg5LDM5Mzc2LDM5MzkxLDM5Mzg3LDM5Mzc3LDM5MzgxLDM5Mzc4LDM5Mzg1LDM5NjA3LDM5NjYyLDM5NjYzLDM5NzE5LDM5NzQ5LDM5NzQ4LDM5Nzk5LDM5NzkxLDQwMTk4LDQwMjAxLDQwMTk1LDQwNjE3LDQwNjM4LDQwNjU0LDIyNjk2LDQwNzg2LDIwNzU0LDIwNzYwLDIwNzU2LDIwNzUyLDIwNzU3LDIwODY0LDIwOTA2LDIwOTU3LDIxMTM3LDIxMTM5LDIxMjM1LDIyMTA1LDIyMTIzLDIyMTM3LDIyMTIxLDIyMTE2LDIyMTM2LDIyMTIyLDIyMTIwLDIyMTE3LDIyMTI5LDIyMTI3LDIyMTI0LDIyMTE0LDIyMTM0LDIyNzIxLDIyNzE4LDIyNzI3LDIyNzI1LDIyODk0LDIzMzI1LDIzMzQ4LDIzNDE2LDIzNTM2LDIzNTY2LDI0Mzk0LDI1MDEwLDI0OTc3LDI1MDAxLDI0OTcwLDI1MDM3LDI1MDE0LDI1MDIyLDI1MDM0LDI1MDMyLDI1MTM2LDI1Nzk3LDI1NzkzLDI1ODAzLDI1Nzg3LDI1Nzg4LDI1ODE4LDI1Nzk2LDI1Nzk5LDI1Nzk0LDI1ODA1LDI1NzkxLDI1ODEwLDI1ODEyLDI1NzkwLDI1OTcyLDI2MzEwLDI2MzEzLDI2Mjk3LDI2MzA4LDI2MzExLDI2Mjk2LDI3MTk3LDI3MTkyLDI3MTk0LDI3MjI1LDI3MjQzLDI3MjI0LDI3MTkzLDI3MjA0LDI3MjM0LDI3MjMzLDI3MjExLDI3MjA3LDI3MTg5LDI3MjMxLDI3MjA4LDI3NDgxLDI3NTExLDI3NjUzLDI4NjEwLDI4NTkzLDI4NTc3LDI4NjExLDI4NTgwLDI4NjA5LDI4NTgzLDI4NTk1LDI4NjA4LDI4NjAxLDI4NTk4LDI4NTgyLDI4NTc2LDI4NTk2LDI5MTE4LDI5MTI5LDI5MTM2LDI5MTM4LDI5MTI4LDI5MTQxLDI5MTEzLDI5MTM0LDI5MTQ1LDI5MTQ4LDI5MTIzLDI5MTI0LDI5NTQ0LDI5ODUyLDI5ODU5LDI5ODQ4LDI5ODU1LDI5ODU0LDI5OTIyLDI5OTY0LDI5OTY1LDMwMjYwLDMwMjY0LDMwMjY2LDMwNDM5LDMwNDM3LDMwNjI0LDMwNjIyLDMwNjIzLDMwNjI5LDMwOTUyLDMwOTM4LDMwOTU2LDMwOTUxLDMxMTQyLDMxMzA5LDMxMzEwLDMxMzAyLDMxMzA4LDMxMzA3LDMxNDE4LDMxNzA1LDMxNzYxLDMxNjg5LDMxNzE2LDMxNzA3LDMxNzEzLDMxNzIxLDMxNzE4LDMxOTU3LDMxOTU4LDMyMjY2LDMyMjczLDMyMjY0LDMyMjgzLDMyMjkxLDMyMjg2LDMyMjg1LDMyMjY1LDMyMjcyLDMyNjMzLDMyNjkwLDMyNzUyLDMyNzUzLDMyNzUwLDMyODA4LDMzMjAzLDMzMTkzLDMzMTkyLDMzMjc1LDMzMjg4LDMzMzY4LDMzMzY5LDM0MTIyLDM0MTM3LDM0MTIwLDM0MTUyLDM0MTUzLDM0MTE1LDM0MTIxLDM0MTU3LDM0MTU0LDM0MTQyLDM0NjkxLDM0NzE5LDM0NzE4LDM0NzIyLDM0NzAxLDM0OTEzLDM1MTE0LDM1MTIyLDM1MTA5LDM1MTE1LDM1MTA1LDM1MjQyLDM1MjM4LDM1NTU4LDM1NTc4LDM1NTYzLDM1NTY5LDM1NTg0LDM1NTQ4LDM1NTU5LDM1NTY2LDM1NTgyLDM1NTg1LDM1NTg2LDM1NTc1LDM1NTY1LDM1NTcxLDM1NTc0LDM1NTgwLDM1OTQ3LDM1OTQ5LDM1OTg3LDM2MDg0LDM2NDIwLDM2NDAxLDM2NDA0LDM2NDE4LDM2NDA5LDM2NDA1LDM2NjY3LDM2NjU1LDM2NjY0LDM2NjU5LDM2Nzc2LDM2Nzc0LDM2OTgxLDM2OTgwLDM2OTg0LDM2OTc4LDM2OTg4LDM2OTg2LDM3MTcyLDM3MjY2LDM3NjY0LDM3Njg2LDM3NjI0LDM3NjgzLDM3Njc5LDM3NjY2LDM3NjI4LDM3Njc1LDM3NjM2LDM3NjU4LDM3NjQ4LDM3NjcwLDM3NjY1LDM3NjUzLDM3Njc4LDM3NjU3LDM4MzMxLDM4NTY3LDM4NTY4LDM4NTcwLDM4NjEzLDM4NjcwLDM4NjczLDM4Njc4LDM4NjY5LDM4Njc1LDM4NjcxLDM4NzQ3LDM4NzQ4LDM4NzU4LDM4ODA4LDM4OTYwLDM4OTY4LDM4OTcxLDM4OTY3LDM4OTU3LDM4OTY5LDM4OTQ4LDM5MTg0LDM5MjA4LDM5MTk4LDM5MTk1LDM5MjAxLDM5MTk0LDM5NDA1LDM5Mzk0LDM5NDA5LDM5NjA4LDM5NjEyLDM5Njc1LDM5NjYxLDM5NzIwLDM5ODI1LDQwMjEzLDQwMjI3LDQwMjMwLDQwMjMyLDQwMjEwLDQwMjE5LDQwNjY0LDQwNjYwLDQwODQ1LDQwODYwLDIwNzc4LDIwNzY3LDIwNzY5LDIwNzg2LDIxMjM3LDIyMTU4LDIyMTQ0LDIyMTYwLDIyMTQ5LDIyMTUxLDIyMTU5LDIyNzQxLDIyNzM5LDIyNzM3LDIyNzM0LDIzMzQ0LDIzMzM4LDIzMzMyLDIzNDE4LDIzNjA3LDIzNjU2LDIzOTk2LDIzOTk0LDIzOTk3LDIzOTkyLDI0MTcxLDI0Mzk2LDI0NTA5LDI1MDMzLDI1MDI2LDI1MDMxLDI1MDYyLDI1MDM1LDI1MTM4LDI1MTQwLDI1ODA2LDI1ODAyLDI1ODE2LDI1ODI0LDI1ODQwLDI1ODMwLDI1ODM2LDI1ODQxLDI1ODI2LDI1ODM3LDI1OTg2LDI1OTg3LDI2MzI5LDI2MzI2LDI3MjY0LDI3Mjg0LDI3MjY4LDI3Mjk4LDI3MjkyLDI3MzU1LDI3Mjk5LDI3MjYyLDI3Mjg3LDI3MjgwLDI3Mjk2LDI3NDg0LDI3NTY2LDI3NjEwLDI3NjU2LDI4NjMyLDI4NjU3LDI4NjM5LDI4NjQwLDI4NjM1LDI4NjQ0LDI4NjUxLDI4NjU1LDI4NTQ0LDI4NjUyLDI4NjQxLDI4NjQ5LDI4NjI5LDI4NjU0LDI4NjU2LDI5MTU5LDI5MTUxLDI5MTY2LDI5MTU4LDI5MTU3LDI5MTY1LDI5MTY0LDI5MTcyLDI5MTUyLDI5MjM3LDI5MjU0LDI5NTUyLDI5NTU0LDI5ODY1LDI5ODcyLDI5ODYyLDI5ODY0LDMwMjc4LDMwMjc0LDMwMjg0LDMwNDQyLDMwNjQzLDMwNjM0LDMwNjQwLDMwNjM2LDMwNjMxLDMwNjM3LDMwNzAzLDMwOTY3LDMwOTcwLDMwOTY0LDMwOTU5LDMwOTc3LDMxMTQzLDMxMTQ2LDMxMzE5LDMxNDIzLDMxNzUxLDMxNzU3LDMxNzQyLDMxNzM1LDMxNzU2LDMxNzEyLDMxOTY4LDMxOTY0LDMxOTY2LDMxOTcwLDMxOTY3LDMxOTYxLDMxOTY1LDMyMzAyLDMyMzE4LDMyMzI2LDMyMzExLDMyMzA2LDMyMzIzLDMyMjk5LDMyMzE3LDMyMzA1LDMyMzI1LDMyMzIxLDMyMzA4LDMyMzEzLDMyMzI4LDMyMzA5LDMyMzE5LDMyMzAzLDMyNTgwLDMyNzU1LDMyNzY0LDMyODgxLDMyODgyLDMyODgwLDMyODc5LDMyODgzLDMzMjIyLDMzMjE5LDMzMjEwLDMzMjE4LDMzMjE2LDMzMjE1LDMzMjEzLDMzMjI1LDMzMjE0LDMzMjU2LDMzMjg5LDMzMzkzLDM0MjE4LDM0MTgwLDM0MTc0LDM0MjA0LDM0MTkzLDM0MTk2LDM0MjIzLDM0MjAzLDM0MTgzLDM0MjE2LDM0MTg2LDM0NDA3LDM0NzUyLDM0NzY5LDM0NzM5LDM0NzcwLDM0NzU4LDM0NzMxLDM0NzQ3LDM0NzQ2LDM0NzYwLDM0NzYzLDM1MTMxLDM1MTI2LDM1MTQwLDM1MTI4LDM1MTMzLDM1MjQ0LDM1NTk4LDM1NjA3LDM1NjA5LDM1NjExLDM1NTk0LDM1NjE2LDM1NjEzLDM1NTg4LDM1NjAwLDM1OTA1LDM1OTAzLDM1OTU1LDM2MDkwLDM2MDkzLDM2MDkyLDM2MDg4LDM2MDkxLDM2MjY0LDM2NDI1LDM2NDI3LDM2NDI0LDM2NDI2LDM2Njc2LDM2NjcwLDM2Njc0LDM2Njc3LDM2NjcxLDM2OTkxLDM2OTg5LDM2OTk2LDM2OTkzLDM2OTk0LDM2OTkyLDM3MTc3LDM3MjgzLDM3Mjc4LDM3Mjc2LDM3NzA5LDM3NzYyLDM3NjcyLDM3NzQ5LDM3NzA2LDM3NzMzLDM3NzA3LDM3NjU2LDM3NzU4LDM3NzQwLDM3NzIzLDM3NzQ0LDM3NzIyLDM3NzE2LDM4MzQ2LDM4MzQ3LDM4MzQ4LDM4MzQ0LDM4MzQyLDM4NTc3LDM4NTg0LDM4NjE0LDM4Njg0LDM4Njg2LDM4ODE2LDM4ODY3LDM4OTgyLDM5MDk0LDM5MjIxLDM5NDI1LDM5NDIzLDM5ODU0LDM5ODUxLDM5ODUwLDM5ODUzLDQwMjUxLDQwMjU1LDQwNTg3LDQwNjU1LDQwNjcwLDQwNjY4LDQwNjY5LDQwNjY3LDQwNzY2LDQwNzc5LDIxNDc0LDIyMTY1LDIyMTkwLDIyNzQ1LDIyNzQ0LDIzMzUyLDI0NDEzLDI1MDU5LDI1MTM5LDI1ODQ0LDI1ODQyLDI1ODU0LDI1ODYyLDI1ODUwLDI1ODUxLDI1ODQ3LDI2MDM5LDI2MzMyLDI2NDA2LDI3MzE1LDI3MzA4LDI3MzMxLDI3MzIzLDI3MzIwLDI3MzMwLDI3MzEwLDI3MzExLDI3NDg3LDI3NTEyLDI3NTY3LDI4NjgxLDI4NjgzLDI4NjcwLDI4Njc4LDI4NjY2LDI4Njg5LDI4Njg3LDI5MTc5LDI5MTgwLDI5MTgyLDI5MTc2LDI5NTU5LDI5NTU3LDI5ODYzLDI5ODg3LDI5OTczLDMwMjk0LDMwMjk2LDMwMjkwLDMwNjUzLDMwNjU1LDMwNjUxLDMwNjUyLDMwOTkwLDMxMTUwLDMxMzI5LDMxMzMwLDMxMzI4LDMxNDI4LDMxNDI5LDMxNzg3LDMxNzgzLDMxNzg2LDMxNzc0LDMxNzc5LDMxNzc3LDMxOTc1LDMyMzQwLDMyMzQxLDMyMzUwLDMyMzQ2LDMyMzUzLDMyMzM4LDMyMzQ1LDMyNTg0LDMyNzYxLDMyNzYzLDMyODg3LDMyODg2LDMzMjI5LDMzMjMxLDMzMjkwLDM0MjU1LDM0MjE3LDM0MjUzLDM0MjU2LDM0MjQ5LDM0MjI0LDM0MjM0LDM0MjMzLDM0MjE0LDM0Nzk5LDM0Nzk2LDM0ODAyLDM0Nzg0LDM1MjA2LDM1MjUwLDM1MzE2LDM1NjI0LDM1NjQxLDM1NjI4LDM1NjI3LDM1OTIwLDM2MTAxLDM2NDQxLDM2NDUxLDM2NDU0LDM2NDUyLDM2NDQ3LDM2NDM3LDM2NTQ0LDM2NjgxLDM2Njg1LDM2OTk5LDM2OTk1LDM3MDAwLDM3MjkxLDM3MjkyLDM3MzI4LDM3NzgwLDM3NzcwLDM3NzgyLDM3Nzk0LDM3ODExLDM3ODA2LDM3ODA0LDM3ODA4LDM3Nzg0LDM3Nzg2LDM3NzgzLDM4MzU2LDM4MzU4LDM4MzUyLDM4MzU3LDM4NjI2LDM4NjIwLDM4NjE3LDM4NjE5LDM4NjIyLDM4NjkyLDM4ODE5LDM4ODIyLDM4ODI5LDM4OTA1LDM4OTg5LDM4OTkxLDM4OTg4LDM4OTkwLDM4OTk1LDM5MDk4LDM5MjMwLDM5MjMxLDM5MjI5LDM5MjE0LDM5MzMzLDM5NDM4LDM5NjE3LDM5NjgzLDM5Njg2LDM5NzU5LDM5NzU4LDM5NzU3LDM5ODgyLDM5ODgxLDM5OTMzLDM5ODgwLDM5ODcyLDQwMjczLDQwMjg1LDQwMjg4LDQwNjcyLDQwNzI1LDQwNzQ4LDIwNzg3LDIyMTgxLDIyNzUwLDIyNzUxLDIyNzU0LDIzNTQxLDQwODQ4LDI0MzAwLDI1MDc0LDI1MDc5LDI1MDc4LDI1MDc3LDI1ODU2LDI1ODcxLDI2MzM2LDI2MzMzLDI3MzY1LDI3MzU3LDI3MzU0LDI3MzQ3LDI4Njk5LDI4NzAzLDI4NzEyLDI4Njk4LDI4NzAxLDI4NjkzLDI4Njk2LDI5MTkwLDI5MTk3LDI5MjcyLDI5MzQ2LDI5NTYwLDI5NTYyLDI5ODg1LDI5ODk4LDI5OTIzLDMwMDg3LDMwMDg2LDMwMzAzLDMwMzA1LDMwNjYzLDMxMDAxLDMxMTUzLDMxMzM5LDMxMzM3LDMxODA2LDMxODA3LDMxODAwLDMxODA1LDMxNzk5LDMxODA4LDMyMzYzLDMyMzY1LDMyMzc3LDMyMzYxLDMyMzYyLDMyNjQ1LDMyMzcxLDMyNjk0LDMyNjk3LDMyNjk2LDMzMjQwLDM0MjgxLDM0MjY5LDM0MjgyLDM0MjYxLDM0Mjc2LDM0Mjc3LDM0Mjk1LDM0ODExLDM0ODIxLDM0ODI5LDM0ODA5LDM0ODE0LDM1MTY4LDM1MTY3LDM1MTU4LDM1MTY2LDM1NjQ5LDM1Njc2LDM1NjcyLDM1NjU3LDM1Njc0LDM1NjYyLDM1NjYzLDM1NjU0LDM1NjczLDM2MTA0LDM2MTA2LDM2NDc2LDM2NDY2LDM2NDg3LDM2NDcwLDM2NDYwLDM2NDc0LDM2NDY4LDM2NjkyLDM2Njg2LDM2NzgxLDM3MDAyLDM3MDAzLDM3Mjk3LDM3Mjk0LDM3ODU3LDM3ODQxLDM3ODU1LDM3ODI3LDM3ODMyLDM3ODUyLDM3ODUzLDM3ODQ2LDM3ODU4LDM3ODM3LDM3ODQ4LDM3ODYwLDM3ODQ3LDM3ODY0LDM4MzY0LDM4NTgwLDM4NjI3LDM4Njk4LDM4Njk1LDM4NzUzLDM4ODc2LDM4OTA3LDM5MDA2LDM5MDAwLDM5MDAzLDM5MTAwLDM5MjM3LDM5MjQxLDM5NDQ2LDM5NDQ5LDM5NjkzLDM5OTEyLDM5OTExLDM5ODk0LDM5ODk5LDQwMzI5LDQwMjg5LDQwMzA2LDQwMjk4LDQwMzAwLDQwNTk0LDQwNTk5LDQwNTk1LDQwNjI4LDIxMjQwLDIyMTg0LDIyMTk5LDIyMTk4LDIyMTk2LDIyMjA0LDIyNzU2LDIzMzYwLDIzMzYzLDIzNDIxLDIzNTQyLDI0MDA5LDI1MDgwLDI1MDgyLDI1ODgwLDI1ODc2LDI1ODgxLDI2MzQyLDI2NDA3LDI3MzcyLDI4NzM0LDI4NzIwLDI4NzIyLDI5MjAwLDI5NTYzLDI5OTAzLDMwMzA2LDMwMzA5LDMxMDE0LDMxMDE4LDMxMDIwLDMxMDE5LDMxNDMxLDMxNDc4LDMxODIwLDMxODExLDMxODIxLDMxOTgzLDMxOTg0LDM2NzgyLDMyMzgxLDMyMzgwLDMyMzg2LDMyNTg4LDMyNzY4LDMzMjQyLDMzMzgyLDM0Mjk5LDM0Mjk3LDM0MzIxLDM0Mjk4LDM0MzEwLDM0MzE1LDM0MzExLDM0MzE0LDM0ODM2LDM0ODM3LDM1MTcyLDM1MjU4LDM1MzIwLDM1Njk2LDM1NjkyLDM1Njg2LDM1Njk1LDM1Njc5LDM1NjkxLDM2MTExLDM2MTA5LDM2NDg5LDM2NDgxLDM2NDg1LDM2NDgyLDM3MzAwLDM3MzIzLDM3OTEyLDM3ODkxLDM3ODg1LDM4MzY5LDM4NzA0LDM5MTA4LDM5MjUwLDM5MjQ5LDM5MzM2LDM5NDY3LDM5NDcyLDM5NDc5LDM5NDc3LDM5OTU1LDM5OTQ5LDQwNTY5LDQwNjI5LDQwNjgwLDQwNzUxLDQwNzk5LDQwODAzLDQwODAxLDIwNzkxLDIwNzkyLDIyMjA5LDIyMjA4LDIyMjEwLDIyODA0LDIzNjYwLDI0MDEzLDI1MDg0LDI1MDg2LDI1ODg1LDI1ODg0LDI2MDA1LDI2MzQ1LDI3Mzg3LDI3Mzk2LDI3Mzg2LDI3NTcwLDI4NzQ4LDI5MjExLDI5MzUxLDI5OTEwLDI5OTA4LDMwMzEzLDMwNjc1LDMxODI0LDMyMzk5LDMyMzk2LDMyNzAwLDM0MzI3LDM0MzQ5LDM0MzMwLDM0ODUxLDM0ODUwLDM0ODQ5LDM0ODQ3LDM1MTc4LDM1MTgwLDM1MjYxLDM1NzAwLDM1NzAzLDM1NzA5LDM2MTE1LDM2NDkwLDM2NDkzLDM2NDkxLDM2NzAzLDM2NzgzLDM3MzA2LDM3OTM0LDM3OTM5LDM3OTQxLDM3OTQ2LDM3OTQ0LDM3OTM4LDM3OTMxLDM4MzcwLDM4NzEyLDM4NzEzLDM4NzA2LDM4OTExLDM5MDE1LDM5MDEzLDM5MjU1LDM5NDkzLDM5NDkxLDM5NDg4LDM5NDg2LDM5NjMxLDM5NzY0LDM5NzYxLDM5OTgxLDM5OTczLDQwMzY3LDQwMzcyLDQwMzg2LDQwMzc2LDQwNjA1LDQwNjg3LDQwNzI5LDQwNzk2LDQwODA2LDQwODA3LDIwNzk2LDIwNzk1LDIyMjE2LDIyMjE4LDIyMjE3LDIzNDIzLDI0MDIwLDI0MDE4LDI0Mzk4LDI1MDg3LDI1ODkyLDI3NDAyLDI3NDg5LDI4NzUzLDI4NzYwLDI5NTY4LDI5OTI0LDMwMDkwLDMwMzE4LDMwMzE2LDMxMTU1LDMxODQwLDMxODM5LDMyODk0LDMyODkzLDMzMjQ3LDM1MTg2LDM1MTgzLDM1MzI0LDM1NzEyLDM2MTE4LDM2MTE5LDM2NDk3LDM2NDk5LDM2NzA1LDM3MTkyLDM3OTU2LDM3OTY5LDM3OTcwLDM4NzE3LDM4NzE4LDM4ODUxLDM4ODQ5LDM5MDE5LDM5MjUzLDM5NTA5LDM5NTAxLDM5NjM0LDM5NzA2LDQwMDA5LDM5OTg1LDM5OTk4LDM5OTk1LDQwNDAzLDQwNDA3LDQwNzU2LDQwODEyLDQwODEwLDQwODUyLDIyMjIwLDI0MDIyLDI1MDg4LDI1ODkxLDI1ODk5LDI1ODk4LDI2MzQ4LDI3NDA4LDI5OTE0LDMxNDM0LDMxODQ0LDMxODQzLDMxODQ1LDMyNDAzLDMyNDA2LDMyNDA0LDMzMjUwLDM0MzYwLDM0MzY3LDM0ODY1LDM1NzIyLDM3MDA4LDM3MDA3LDM3OTg3LDM3OTg0LDM3OTg4LDM4NzYwLDM5MDIzLDM5MjYwLDM5NTE0LDM5NTE1LDM5NTExLDM5NjM1LDM5NjM2LDM5NjMzLDQwMDIwLDQwMDIzLDQwMDIyLDQwNDIxLDQwNjA3LDQwNjkyLDIyMjI1LDIyNzYxLDI1OTAwLDI4NzY2LDMwMzIxLDMwMzIyLDMwNjc5LDMyNTkyLDMyNjQ4LDM0ODcwLDM0ODczLDM0OTE0LDM1NzMxLDM1NzMwLDM1NzM0LDMzMzk5LDM2MTIzLDM3MzEyLDM3OTk0LDM4NzIyLDM4NzI4LDM4NzI0LDM4ODU0LDM5MDI0LDM5NTE5LDM5NzE0LDM5NzY4LDQwMDMxLDQwNDQxLDQwNDQyLDQwNTcyLDQwNTczLDQwNzExLDQwODIzLDQwODE4LDI0MzA3LDI3NDE0LDI4NzcxLDMxODUyLDMxODU0LDM0ODc1LDM1MjY0LDM2NTEzLDM3MzEzLDM4MDAyLDM4MDAwLDM5MDI1LDM5MjYyLDM5NjM4LDM5NzE1LDQwNjUyLDI4NzcyLDMwNjgyLDM1NzM4LDM4MDA3LDM4ODU3LDM5NTIyLDM5NTI1LDMyNDEyLDM1NzQwLDM2NTIyLDM3MzE3LDM4MDEzLDM4MDE0LDM4MDEyLDQwMDU1LDQwMDU2LDQwNjk1LDM1OTI0LDM4MDE1LDQwNDc0LDI5MjI0LDM5NTMwLDM5NzI5LDQwNDc1LDQwNDc4LDMxODU4LDkzMTIsOTMxMyw5MzE0LDkzMTUsOTMxNiw5MzE3LDkzMTgsOTMxOSw5MzIwLDkzMjEsOTMzMiw5MzMzLDkzMzQsOTMzNSw5MzM2LDkzMzcsOTMzOCw5MzM5LDkzNDAsOTM0MSw4NTYwLDg1NjEsODU2Miw4NTYzLDg1NjQsODU2NSw4NTY2LDg1NjcsODU2OCw4NTY5LDIwMDIyLDIwMDMxLDIwMTAxLDIwMTI4LDIwODY2LDIwODg2LDIwOTA3LDIxMjQxLDIxMzA0LDIxMzUzLDIxNDMwLDIyNzk0LDIzNDI0LDI0MDI3LDEyMDgzLDI0MTkxLDI0MzA4LDI0NDAwLDI0NDE3LDI1OTA4LDI2MDgwLDMwMDk4LDMwMzI2LDM2Nzg5LDM4NTgyLDE2OCw3MTAsMTI1NDEsMTI1NDIsMTI0NDUsMTI0NDYsMTIyOTEsMjAxODksMTIyOTMsMTIyOTQsMTIyOTUsMTI1NDAsNjUzMzksNjUzNDEsMTAwNDUsMTIzNTMsMTIzNTQsMTIzNTUsMTIzNTYsMTIzNTcsMTIzNTgsMTIzNTksMTIzNjAsMTIzNjEsMTIzNjIsMTIzNjMsMTIzNjQsMTIzNjUsMTIzNjYsMTIzNjcsMTIzNjgsMTIzNjksMTIzNzAsMTIzNzEsMTIzNzIsMTIzNzMsMTIzNzQsMTIzNzUsMTIzNzYsMTIzNzcsMTIzNzgsMTIzNzksMTIzODAsMTIzODEsMTIzODIsMTIzODMsMTIzODQsMTIzODUsMTIzODYsMTIzODcsMTIzODgsMTIzODksMTIzOTAsMTIzOTEsMTIzOTIsMTIzOTMsMTIzOTQsMTIzOTUsMTIzOTYsMTIzOTcsMTIzOTgsMTIzOTksMTI0MDAsMTI0MDEsMTI0MDIsMTI0MDMsMTI0MDQsMTI0MDUsMTI0MDYsMTI0MDcsMTI0MDgsMTI0MDksMTI0MTAsMTI0MTEsMTI0MTIsMTI0MTMsMTI0MTQsMTI0MTUsMTI0MTYsMTI0MTcsMTI0MTgsMTI0MTksMTI0MjAsMTI0MjEsMTI0MjIsMTI0MjMsMTI0MjQsMTI0MjUsMTI0MjYsMTI0MjcsMTI0MjgsMTI0MjksMTI0MzAsMTI0MzEsMTI0MzIsMTI0MzMsMTI0MzQsMTI0MzUsMTI0NDksMTI0NTAsMTI0NTEsMTI0NTIsMTI0NTMsMTI0NTQsMTI0NTUsMTI0NTYsMTI0NTcsMTI0NTgsMTI0NTksMTI0NjAsMTI0NjEsMTI0NjIsMTI0NjMsMTI0NjQsMTI0NjUsMTI0NjYsMTI0NjcsMTI0NjgsMTI0NjksMTI0NzAsMTI0NzEsMTI0NzIsMTI0NzMsMTI0NzQsMTI0NzUsMTI0NzYsMTI0NzcsMTI0NzgsMTI0NzksMTI0ODAsMTI0ODEsMTI0ODIsMTI0ODMsMTI0ODQsMTI0ODUsMTI0ODYsMTI0ODcsMTI0ODgsMTI0ODksMTI0OTAsMTI0OTEsMTI0OTIsMTI0OTMsMTI0OTQsMTI0OTUsMTI0OTYsMTI0OTcsMTI0OTgsMTI0OTksMTI1MDAsMTI1MDEsMTI1MDIsMTI1MDMsMTI1MDQsMTI1MDUsMTI1MDYsMTI1MDcsMTI1MDgsMTI1MDksMTI1MTAsMTI1MTEsMTI1MTIsMTI1MTMsMTI1MTQsMTI1MTUsMTI1MTYsMTI1MTcsMTI1MTgsMTI1MTksMTI1MjAsMTI1MjEsMTI1MjIsMTI1MjMsMTI1MjQsMTI1MjUsMTI1MjYsMTI1MjcsMTI1MjgsMTI1MjksMTI1MzAsMTI1MzEsMTI1MzIsMTI1MzMsMTI1MzQsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTAyNSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTEwNSwxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsODY3OSw4NjMyLDg2MzMsMTI3NTEsMTMxMjc2LDIwMDU4LDEzMTIxMCwyMDk5NCwxNzU1Myw0MDg4MCwyMDg3Miw0MDg4MSwxNjEyODcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw2NTUwNiw2NTUwOCw2NTI4Nyw2NTI4MiwxMjg0OSw4NDcwLDg0ODEsMTI0NDMsMTI0NDQsMTE5MDQsMTE5MDgsMTE5MTAsMTE5MTEsMTE5MTIsMTE5MTQsMTE5MTYsMTE5MTcsMTE5MjUsMTE5MzIsMTE5MzMsMTE5NDEsMTE5NDMsMTE5NDYsMTE5NDgsMTE5NTAsMTE5NTgsMTE5NjQsMTE5NjYsMTE5NzQsMTE5NzgsMTE5ODAsMTE5ODEsMTE5ODMsMTE5OTAsMTE5OTEsMTE5OTgsMTIwMDMsbnVsbCxudWxsLG51bGwsNjQzLDU5Miw2MDMsNTk2LDYyOSwzMzksMjQ4LDMzMSw2NTAsNjE4LDIwMDM0LDIwMDYwLDIwOTgxLDIxMjc0LDIxMzc4LDE5OTc1LDE5OTgwLDIwMDM5LDIwMTA5LDIyMjMxLDY0MDEyLDIzNjYyLDI0NDM1LDE5OTgzLDIwODcxLDE5OTgyLDIwMDE0LDIwMTE1LDIwMTYyLDIwMTY5LDIwMTY4LDIwODg4LDIxMjQ0LDIxMzU2LDIxNDMzLDIyMzA0LDIyNzg3LDIyODI4LDIzNTY4LDI0MDYzLDI2MDgxLDI3NTcxLDI3NTk2LDI3NjY4LDI5MjQ3LDIwMDE3LDIwMDI4LDIwMjAwLDIwMTg4LDIwMjAxLDIwMTkzLDIwMTg5LDIwMTg2LDIxMDA0LDIxMjc2LDIxMzI0LDIyMzA2LDIyMzA3LDIyODA3LDIyODMxLDIzNDI1LDIzNDI4LDIzNTcwLDIzNjExLDIzNjY4LDIzNjY3LDI0MDY4LDI0MTkyLDI0MTk0LDI0NTIxLDI1MDk3LDI1MTY4LDI3NjY5LDI3NzAyLDI3NzE1LDI3NzExLDI3NzA3LDI5MzU4LDI5MzYwLDI5NTc4LDMxMTYwLDMyOTA2LDM4NDMwLDIwMjM4LDIwMjQ4LDIwMjY4LDIwMjEzLDIwMjQ0LDIwMjA5LDIwMjI0LDIwMjE1LDIwMjMyLDIwMjUzLDIwMjI2LDIwMjI5LDIwMjU4LDIwMjQzLDIwMjI4LDIwMjEyLDIwMjQyLDIwOTEzLDIxMDExLDIxMDAxLDIxMDA4LDIxMTU4LDIxMjgyLDIxMjc5LDIxMzI1LDIxMzg2LDIxNTExLDIyMjQxLDIyMjM5LDIyMzE4LDIyMzE0LDIyMzI0LDIyODQ0LDIyOTEyLDIyOTA4LDIyOTE3LDIyOTA3LDIyOTEwLDIyOTAzLDIyOTExLDIzMzgyLDIzNTczLDIzNTg5LDIzNjc2LDIzNjc0LDIzNjc1LDIzNjc4LDI0MDMxLDI0MTgxLDI0MTk2LDI0MzIyLDI0MzQ2LDI0NDM2LDI0NTMzLDI0NTMyLDI0NTI3LDI1MTgwLDI1MTgyLDI1MTg4LDI1MTg1LDI1MTkwLDI1MTg2LDI1MTc3LDI1MTg0LDI1MTc4LDI1MTg5LDI2MDk1LDI2MDk0LDI2NDMwLDI2NDI1LDI2NDI0LDI2NDI3LDI2NDI2LDI2NDMxLDI2NDI4LDI2NDE5LDI3NjcyLDI3NzE4LDI3NzMwLDI3NzQwLDI3NzI3LDI3NzIyLDI3NzMyLDI3NzIzLDI3NzI0LDI4Nzg1LDI5Mjc4LDI5MzY0LDI5MzY1LDI5NTgyLDI5OTk0LDMwMzM1LDMxMzQ5LDMyNTkzLDMzNDAwLDMzNDA0LDMzNDA4LDMzNDA1LDMzNDA3LDM0MzgxLDM1MTk4LDM3MDE3LDM3MDE1LDM3MDE2LDM3MDE5LDM3MDEyLDM4NDM0LDM4NDM2LDM4NDMyLDM4NDM1LDIwMzEwLDIwMjgzLDIwMzIyLDIwMjk3LDIwMzA3LDIwMzI0LDIwMjg2LDIwMzI3LDIwMzA2LDIwMzE5LDIwMjg5LDIwMzEyLDIwMjY5LDIwMjc1LDIwMjg3LDIwMzIxLDIwODc5LDIwOTIxLDIxMDIwLDIxMDIyLDIxMDI1LDIxMTY1LDIxMTY2LDIxMjU3LDIxMzQ3LDIxMzYyLDIxMzkwLDIxMzkxLDIxNTUyLDIxNTU5LDIxNTQ2LDIxNTg4LDIxNTczLDIxNTI5LDIxNTMyLDIxNTQxLDIxNTI4LDIxNTY1LDIxNTgzLDIxNTY5LDIxNTQ0LDIxNTQwLDIxNTc1LDIyMjU0LDIyMjQ3LDIyMjQ1LDIyMzM3LDIyMzQxLDIyMzQ4LDIyMzQ1LDIyMzQ3LDIyMzU0LDIyNzkwLDIyODQ4LDIyOTUwLDIyOTM2LDIyOTQ0LDIyOTM1LDIyOTI2LDIyOTQ2LDIyOTI4LDIyOTI3LDIyOTUxLDIyOTQ1LDIzNDM4LDIzNDQyLDIzNTkyLDIzNTk0LDIzNjkzLDIzNjk1LDIzNjg4LDIzNjkxLDIzNjg5LDIzNjk4LDIzNjkwLDIzNjg2LDIzNjk5LDIzNzAxLDI0MDMyLDI0MDc0LDI0MDc4LDI0MjAzLDI0MjAxLDI0MjA0LDI0MjAwLDI0MjA1LDI0MzI1LDI0MzQ5LDI0NDQwLDI0NDM4LDI0NTMwLDI0NTI5LDI0NTI4LDI0NTU3LDI0NTUyLDI0NTU4LDI0NTYzLDI0NTQ1LDI0NTQ4LDI0NTQ3LDI0NTcwLDI0NTU5LDI0NTY3LDI0NTcxLDI0NTc2LDI0NTY0LDI1MTQ2LDI1MjE5LDI1MjI4LDI1MjMwLDI1MjMxLDI1MjM2LDI1MjIzLDI1MjAxLDI1MjExLDI1MjEwLDI1MjAwLDI1MjE3LDI1MjI0LDI1MjA3LDI1MjEzLDI1MjAyLDI1MjA0LDI1OTExLDI2MDk2LDI2MTAwLDI2MDk5LDI2MDk4LDI2MTAxLDI2NDM3LDI2NDM5LDI2NDU3LDI2NDUzLDI2NDQ0LDI2NDQwLDI2NDYxLDI2NDQ1LDI2NDU4LDI2NDQzLDI3NjAwLDI3NjczLDI3Njc0LDI3NzY4LDI3NzUxLDI3NzU1LDI3NzgwLDI3Nzg3LDI3NzkxLDI3NzYxLDI3NzU5LDI3NzUzLDI3ODAyLDI3NzU3LDI3NzgzLDI3Nzk3LDI3ODA0LDI3NzUwLDI3NzYzLDI3NzQ5LDI3NzcxLDI3NzkwLDI4Nzg4LDI4Nzk0LDI5MjgzLDI5Mzc1LDI5MzczLDI5Mzc5LDI5MzgyLDI5Mzc3LDI5MzcwLDI5MzgxLDI5NTg5LDI5NTkxLDI5NTg3LDI5NTg4LDI5NTg2LDMwMDEwLDMwMDA5LDMwMTAwLDMwMTAxLDMwMzM3LDMxMDM3LDMyODIwLDMyOTE3LDMyOTIxLDMyOTEyLDMyOTE0LDMyOTI0LDMzNDI0LDMzNDIzLDMzNDEzLDMzNDIyLDMzNDI1LDMzNDI3LDMzNDE4LDMzNDExLDMzNDEyLDM1OTYwLDM2ODA5LDM2Nzk5LDM3MDIzLDM3MDI1LDM3MDI5LDM3MDIyLDM3MDMxLDM3MDI0LDM4NDQ4LDM4NDQwLDM4NDQ3LDM4NDQ1LDIwMDE5LDIwMzc2LDIwMzQ4LDIwMzU3LDIwMzQ5LDIwMzUyLDIwMzU5LDIwMzQyLDIwMzQwLDIwMzYxLDIwMzU2LDIwMzQzLDIwMzAwLDIwMzc1LDIwMzMwLDIwMzc4LDIwMzQ1LDIwMzUzLDIwMzQ0LDIwMzY4LDIwMzgwLDIwMzcyLDIwMzgyLDIwMzcwLDIwMzU0LDIwMzczLDIwMzMxLDIwMzM0LDIwODk0LDIwOTI0LDIwOTI2LDIxMDQ1LDIxMDQyLDIxMDQzLDIxMDYyLDIxMDQxLDIxMTgwLDIxMjU4LDIxMjU5LDIxMzA4LDIxMzk0LDIxMzk2LDIxNjM5LDIxNjMxLDIxNjMzLDIxNjQ5LDIxNjM0LDIxNjQwLDIxNjExLDIxNjI2LDIxNjMwLDIxNjA1LDIxNjEyLDIxNjIwLDIxNjA2LDIxNjQ1LDIxNjE1LDIxNjAxLDIxNjAwLDIxNjU2LDIxNjAzLDIxNjA3LDIxNjA0LDIyMjYzLDIyMjY1LDIyMzgzLDIyMzg2LDIyMzgxLDIyMzc5LDIyMzg1LDIyMzg0LDIyMzkwLDIyNDAwLDIyMzg5LDIyMzk1LDIyMzg3LDIyMzg4LDIyMzcwLDIyMzc2LDIyMzk3LDIyNzk2LDIyODUzLDIyOTY1LDIyOTcwLDIyOTkxLDIyOTkwLDIyOTYyLDIyOTg4LDIyOTc3LDIyOTY2LDIyOTcyLDIyOTc5LDIyOTk4LDIyOTYxLDIyOTczLDIyOTc2LDIyOTg0LDIyOTY0LDIyOTgzLDIzMzk0LDIzMzk3LDIzNDQzLDIzNDQ1LDIzNjIwLDIzNjIzLDIzNzI2LDIzNzE2LDIzNzEyLDIzNzMzLDIzNzI3LDIzNzIwLDIzNzI0LDIzNzExLDIzNzE1LDIzNzI1LDIzNzE0LDIzNzIyLDIzNzE5LDIzNzA5LDIzNzE3LDIzNzM0LDIzNzI4LDIzNzE4LDI0MDg3LDI0MDg0LDI0MDg5LDI0MzYwLDI0MzU0LDI0MzU1LDI0MzU2LDI0NDA0LDI0NDUwLDI0NDQ2LDI0NDQ1LDI0NTQyLDI0NTQ5LDI0NjIxLDI0NjE0LDI0NjAxLDI0NjI2LDI0NTg3LDI0NjI4LDI0NTg2LDI0NTk5LDI0NjI3LDI0NjAyLDI0NjA2LDI0NjIwLDI0NjEwLDI0NTg5LDI0NTkyLDI0NjIyLDI0NTk1LDI0NTkzLDI0NTg4LDI0NTg1LDI0NjA0LDI1MTA4LDI1MTQ5LDI1MjYxLDI1MjY4LDI1Mjk3LDI1Mjc4LDI1MjU4LDI1MjcwLDI1MjkwLDI1MjYyLDI1MjY3LDI1MjYzLDI1Mjc1LDI1MjU3LDI1MjY0LDI1MjcyLDI1OTE3LDI2MDI0LDI2MDQzLDI2MTIxLDI2MTA4LDI2MTE2LDI2MTMwLDI2MTIwLDI2MTA3LDI2MTE1LDI2MTIzLDI2MTI1LDI2MTE3LDI2MTA5LDI2MTI5LDI2MTI4LDI2MzU4LDI2Mzc4LDI2NTAxLDI2NDc2LDI2NTEwLDI2NTE0LDI2NDg2LDI2NDkxLDI2NTIwLDI2NTAyLDI2NTAwLDI2NDg0LDI2NTA5LDI2NTA4LDI2NDkwLDI2NTI3LDI2NTEzLDI2NTIxLDI2NDk5LDI2NDkzLDI2NDk3LDI2NDg4LDI2NDg5LDI2NTE2LDI3NDI5LDI3NTIwLDI3NTE4LDI3NjE0LDI3Njc3LDI3Nzk1LDI3ODg0LDI3ODgzLDI3ODg2LDI3ODY1LDI3ODMwLDI3ODYwLDI3ODIxLDI3ODc5LDI3ODMxLDI3ODU2LDI3ODQyLDI3ODM0LDI3ODQzLDI3ODQ2LDI3ODg1LDI3ODkwLDI3ODU4LDI3ODY5LDI3ODI4LDI3Nzg2LDI3ODA1LDI3Nzc2LDI3ODcwLDI3ODQwLDI3OTUyLDI3ODUzLDI3ODQ3LDI3ODI0LDI3ODk3LDI3ODU1LDI3ODgxLDI3ODU3LDI4ODIwLDI4ODI0LDI4ODA1LDI4ODE5LDI4ODA2LDI4ODA0LDI4ODE3LDI4ODIyLDI4ODAyLDI4ODI2LDI4ODAzLDI5MjkwLDI5Mzk4LDI5Mzg3LDI5NDAwLDI5Mzg1LDI5NDA0LDI5Mzk0LDI5Mzk2LDI5NDAyLDI5Mzg4LDI5MzkzLDI5NjA0LDI5NjAxLDI5NjEzLDI5NjA2LDI5NjAyLDI5NjAwLDI5NjEyLDI5NTk3LDI5OTE3LDI5OTI4LDMwMDE1LDMwMDE2LDMwMDE0LDMwMDkyLDMwMTA0LDMwMzgzLDMwNDUxLDMwNDQ5LDMwNDQ4LDMwNDUzLDMwNzEyLDMwNzE2LDMwNzEzLDMwNzE1LDMwNzE0LDMwNzExLDMxMDQyLDMxMDM5LDMxMTczLDMxMzUyLDMxMzU1LDMxNDgzLDMxODYxLDMxOTk3LDMyODIxLDMyOTExLDMyOTQyLDMyOTMxLDMyOTUyLDMyOTQ5LDMyOTQxLDMzMzEyLDMzNDQwLDMzNDcyLDMzNDUxLDMzNDM0LDMzNDMyLDMzNDM1LDMzNDYxLDMzNDQ3LDMzNDU0LDMzNDY4LDMzNDM4LDMzNDY2LDMzNDYwLDMzNDQ4LDMzNDQxLDMzNDQ5LDMzNDc0LDMzNDQ0LDMzNDc1LDMzNDYyLDMzNDQyLDM0NDE2LDM0NDE1LDM0NDEzLDM0NDE0LDM1OTI2LDM2ODE4LDM2ODExLDM2ODE5LDM2ODEzLDM2ODIyLDM2ODIxLDM2ODIzLDM3MDQyLDM3MDQ0LDM3MDM5LDM3MDQzLDM3MDQwLDM4NDU3LDM4NDYxLDM4NDYwLDM4NDU4LDM4NDY3LDIwNDI5LDIwNDIxLDIwNDM1LDIwNDAyLDIwNDI1LDIwNDI3LDIwNDE3LDIwNDM2LDIwNDQ0LDIwNDQxLDIwNDExLDIwNDAzLDIwNDQzLDIwNDIzLDIwNDM4LDIwNDEwLDIwNDE2LDIwNDA5LDIwNDYwLDIxMDYwLDIxMDY1LDIxMTg0LDIxMTg2LDIxMzA5LDIxMzcyLDIxMzk5LDIxMzk4LDIxNDAxLDIxNDAwLDIxNjkwLDIxNjY1LDIxNjc3LDIxNjY5LDIxNzExLDIxNjk5LDMzNTQ5LDIxNjg3LDIxNjc4LDIxNzE4LDIxNjg2LDIxNzAxLDIxNzAyLDIxNjY0LDIxNjE2LDIxNjkyLDIxNjY2LDIxNjk0LDIxNjE4LDIxNzI2LDIxNjgwLDIyNDUzLDIyNDMwLDIyNDMxLDIyNDM2LDIyNDEyLDIyNDIzLDIyNDI5LDIyNDI3LDIyNDIwLDIyNDI0LDIyNDE1LDIyNDI1LDIyNDM3LDIyNDI2LDIyNDIxLDIyNzcyLDIyNzk3LDIyODY3LDIzMDA5LDIzMDA2LDIzMDIyLDIzMDQwLDIzMDI1LDIzMDA1LDIzMDM0LDIzMDM3LDIzMDM2LDIzMDMwLDIzMDEyLDIzMDI2LDIzMDMxLDIzMDAzLDIzMDE3LDIzMDI3LDIzMDI5LDIzMDA4LDIzMDM4LDIzMDI4LDIzMDIxLDIzNDY0LDIzNjI4LDIzNzYwLDIzNzY4LDIzNzU2LDIzNzY3LDIzNzU1LDIzNzcxLDIzNzc0LDIzNzcwLDIzNzUzLDIzNzUxLDIzNzU0LDIzNzY2LDIzNzYzLDIzNzY0LDIzNzU5LDIzNzUyLDIzNzUwLDIzNzU4LDIzNzc1LDIzODAwLDI0MDU3LDI0MDk3LDI0MDk4LDI0MDk5LDI0MDk2LDI0MTAwLDI0MjQwLDI0MjI4LDI0MjI2LDI0MjE5LDI0MjI3LDI0MjI5LDI0MzI3LDI0MzY2LDI0NDA2LDI0NDU0LDI0NjMxLDI0NjMzLDI0NjYwLDI0NjkwLDI0NjcwLDI0NjQ1LDI0NjU5LDI0NjQ3LDI0NjQ5LDI0NjY3LDI0NjUyLDI0NjQwLDI0NjQyLDI0NjcxLDI0NjEyLDI0NjQ0LDI0NjY0LDI0Njc4LDI0Njg2LDI1MTU0LDI1MTU1LDI1Mjk1LDI1MzU3LDI1MzU1LDI1MzMzLDI1MzU4LDI1MzQ3LDI1MzIzLDI1MzM3LDI1MzU5LDI1MzU2LDI1MzM2LDI1MzM0LDI1MzQ0LDI1MzYzLDI1MzY0LDI1MzM4LDI1MzY1LDI1MzM5LDI1MzI4LDI1OTIxLDI1OTIzLDI2MDI2LDI2MDQ3LDI2MTY2LDI2MTQ1LDI2MTYyLDI2MTY1LDI2MTQwLDI2MTUwLDI2MTQ2LDI2MTYzLDI2MTU1LDI2MTcwLDI2MTQxLDI2MTY0LDI2MTY5LDI2MTU4LDI2MzgzLDI2Mzg0LDI2NTYxLDI2NjEwLDI2NTY4LDI2NTU0LDI2NTg4LDI2NTU1LDI2NjE2LDI2NTg0LDI2NTYwLDI2NTUxLDI2NTY1LDI2NjAzLDI2NTk2LDI2NTkxLDI2NTQ5LDI2NTczLDI2NTQ3LDI2NjE1LDI2NjE0LDI2NjA2LDI2NTk1LDI2NTYyLDI2NTUzLDI2NTc0LDI2NTk5LDI2NjA4LDI2NTQ2LDI2NjIwLDI2NTY2LDI2NjA1LDI2NTcyLDI2NTQyLDI2NTk4LDI2NTg3LDI2NjE4LDI2NTY5LDI2NTcwLDI2NTYzLDI2NjAyLDI2NTcxLDI3NDMyLDI3NTIyLDI3NTI0LDI3NTc0LDI3NjA2LDI3NjA4LDI3NjE2LDI3NjgwLDI3NjgxLDI3OTQ0LDI3OTU2LDI3OTQ5LDI3OTM1LDI3OTY0LDI3OTY3LDI3OTIyLDI3OTE0LDI3ODY2LDI3OTU1LDI3OTA4LDI3OTI5LDI3OTYyLDI3OTMwLDI3OTIxLDI3OTA0LDI3OTMzLDI3OTcwLDI3OTA1LDI3OTI4LDI3OTU5LDI3OTA3LDI3OTE5LDI3OTY4LDI3OTExLDI3OTM2LDI3OTQ4LDI3OTEyLDI3OTM4LDI3OTEzLDI3OTIwLDI4ODU1LDI4ODMxLDI4ODYyLDI4ODQ5LDI4ODQ4LDI4ODMzLDI4ODUyLDI4ODUzLDI4ODQxLDI5MjQ5LDI5MjU3LDI5MjU4LDI5MjkyLDI5Mjk2LDI5Mjk5LDI5Mjk0LDI5Mzg2LDI5NDEyLDI5NDE2LDI5NDE5LDI5NDA3LDI5NDE4LDI5NDE0LDI5NDExLDI5NTczLDI5NjQ0LDI5NjM0LDI5NjQwLDI5NjM3LDI5NjI1LDI5NjIyLDI5NjIxLDI5NjIwLDI5Njc1LDI5NjMxLDI5NjM5LDI5NjMwLDI5NjM1LDI5NjM4LDI5NjI0LDI5NjQzLDI5OTMyLDI5OTM0LDI5OTk4LDMwMDIzLDMwMDI0LDMwMTE5LDMwMTIyLDMwMzI5LDMwNDA0LDMwNDcyLDMwNDY3LDMwNDY4LDMwNDY5LDMwNDc0LDMwNDU1LDMwNDU5LDMwNDU4LDMwNjk1LDMwNjk2LDMwNzI2LDMwNzM3LDMwNzM4LDMwNzI1LDMwNzM2LDMwNzM1LDMwNzM0LDMwNzI5LDMwNzIzLDMwNzM5LDMxMDUwLDMxMDUyLDMxMDUxLDMxMDQ1LDMxMDQ0LDMxMTg5LDMxMTgxLDMxMTgzLDMxMTkwLDMxMTgyLDMxMzYwLDMxMzU4LDMxNDQxLDMxNDg4LDMxNDg5LDMxODY2LDMxODY0LDMxODY1LDMxODcxLDMxODcyLDMxODczLDMyMDAzLDMyMDA4LDMyMDAxLDMyNjAwLDMyNjU3LDMyNjUzLDMyNzAyLDMyNzc1LDMyNzgyLDMyNzgzLDMyNzg4LDMyODIzLDMyOTg0LDMyOTY3LDMyOTkyLDMyOTc3LDMyOTY4LDMyOTYyLDMyOTc2LDMyOTY1LDMyOTk1LDMyOTg1LDMyOTg4LDMyOTcwLDMyOTgxLDMyOTY5LDMyOTc1LDMyOTgzLDMyOTk4LDMyOTczLDMzMjc5LDMzMzEzLDMzNDI4LDMzNDk3LDMzNTM0LDMzNTI5LDMzNTQzLDMzNTEyLDMzNTM2LDMzNDkzLDMzNTk0LDMzNTE1LDMzNDk0LDMzNTI0LDMzNTE2LDMzNTA1LDMzNTIyLDMzNTI1LDMzNTQ4LDMzNTMxLDMzNTI2LDMzNTIwLDMzNTE0LDMzNTA4LDMzNTA0LDMzNTMwLDMzNTIzLDMzNTE3LDM0NDIzLDM0NDIwLDM0NDI4LDM0NDE5LDM0ODgxLDM0ODk0LDM0OTE5LDM0OTIyLDM0OTIxLDM1MjgzLDM1MzMyLDM1MzM1LDM2MjEwLDM2ODM1LDM2ODMzLDM2ODQ2LDM2ODMyLDM3MTA1LDM3MDUzLDM3MDU1LDM3MDc3LDM3MDYxLDM3MDU0LDM3MDYzLDM3MDY3LDM3MDY0LDM3MzMyLDM3MzMxLDM4NDg0LDM4NDc5LDM4NDgxLDM4NDgzLDM4NDc0LDM4NDc4LDIwNTEwLDIwNDg1LDIwNDg3LDIwNDk5LDIwNTE0LDIwNTI4LDIwNTA3LDIwNDY5LDIwNDY4LDIwNTMxLDIwNTM1LDIwNTI0LDIwNDcwLDIwNDcxLDIwNTAzLDIwNTA4LDIwNTEyLDIwNTE5LDIwNTMzLDIwNTI3LDIwNTI5LDIwNDk0LDIwODI2LDIwODg0LDIwODgzLDIwOTM4LDIwOTMyLDIwOTMzLDIwOTM2LDIwOTQyLDIxMDg5LDIxMDgyLDIxMDc0LDIxMDg2LDIxMDg3LDIxMDc3LDIxMDkwLDIxMTk3LDIxMjYyLDIxNDA2LDIxNzk4LDIxNzMwLDIxNzgzLDIxNzc4LDIxNzM1LDIxNzQ3LDIxNzMyLDIxNzg2LDIxNzU5LDIxNzY0LDIxNzY4LDIxNzM5LDIxNzc3LDIxNzY1LDIxNzQ1LDIxNzcwLDIxNzU1LDIxNzUxLDIxNzUyLDIxNzI4LDIxNzc0LDIxNzYzLDIxNzcxLDIyMjczLDIyMjc0LDIyNDc2LDIyNTc4LDIyNDg1LDIyNDgyLDIyNDU4LDIyNDcwLDIyNDYxLDIyNDYwLDIyNDU2LDIyNDU0LDIyNDYzLDIyNDcxLDIyNDgwLDIyNDU3LDIyNDY1LDIyNzk4LDIyODU4LDIzMDY1LDIzMDYyLDIzMDg1LDIzMDg2LDIzMDYxLDIzMDU1LDIzMDYzLDIzMDUwLDIzMDcwLDIzMDkxLDIzNDA0LDIzNDYzLDIzNDY5LDIzNDY4LDIzNTU1LDIzNjM4LDIzNjM2LDIzNzg4LDIzODA3LDIzNzkwLDIzNzkzLDIzNzk5LDIzODA4LDIzODAxLDI0MTA1LDI0MTA0LDI0MjMyLDI0MjM4LDI0MjM0LDI0MjM2LDI0MzcxLDI0MzY4LDI0NDIzLDI0NjY5LDI0NjY2LDI0Njc5LDI0NjQxLDI0NzM4LDI0NzEyLDI0NzA0LDI0NzIyLDI0NzA1LDI0NzMzLDI0NzA3LDI0NzI1LDI0NzMxLDI0NzI3LDI0NzExLDI0NzMyLDI0NzE4LDI1MTEzLDI1MTU4LDI1MzMwLDI1MzYwLDI1NDMwLDI1Mzg4LDI1NDEyLDI1NDEzLDI1Mzk4LDI1NDExLDI1NTcyLDI1NDAxLDI1NDE5LDI1NDE4LDI1NDA0LDI1Mzg1LDI1NDA5LDI1Mzk2LDI1NDMyLDI1NDI4LDI1NDMzLDI1Mzg5LDI1NDE1LDI1Mzk1LDI1NDM0LDI1NDI1LDI1NDAwLDI1NDMxLDI1NDA4LDI1NDE2LDI1OTMwLDI1OTI2LDI2MDU0LDI2MDUxLDI2MDUyLDI2MDUwLDI2MTg2LDI2MjA3LDI2MTgzLDI2MTkzLDI2Mzg2LDI2Mzg3LDI2NjU1LDI2NjUwLDI2Njk3LDI2Njc0LDI2Njc1LDI2NjgzLDI2Njk5LDI2NzAzLDI2NjQ2LDI2NjczLDI2NjUyLDI2Njc3LDI2NjY3LDI2NjY5LDI2NjcxLDI2NzAyLDI2NjkyLDI2Njc2LDI2NjUzLDI2NjQyLDI2NjQ0LDI2NjYyLDI2NjY0LDI2NjcwLDI2NzAxLDI2NjgyLDI2NjYxLDI2NjU2LDI3NDM2LDI3NDM5LDI3NDM3LDI3NDQxLDI3NDQ0LDI3NTAxLDMyODk4LDI3NTI4LDI3NjIyLDI3NjIwLDI3NjI0LDI3NjE5LDI3NjE4LDI3NjIzLDI3Njg1LDI4MDI2LDI4MDAzLDI4MDA0LDI4MDIyLDI3OTE3LDI4MDAxLDI4MDUwLDI3OTkyLDI4MDAyLDI4MDEzLDI4MDE1LDI4MDQ5LDI4MDQ1LDI4MTQzLDI4MDMxLDI4MDM4LDI3OTk4LDI4MDA3LDI4MDAwLDI4MDU1LDI4MDE2LDI4MDI4LDI3OTk5LDI4MDM0LDI4MDU2LDI3OTUxLDI4MDA4LDI4MDQzLDI4MDMwLDI4MDMyLDI4MDM2LDI3OTI2LDI4MDM1LDI4MDI3LDI4MDI5LDI4MDIxLDI4MDQ4LDI4ODkyLDI4ODgzLDI4ODgxLDI4ODkzLDI4ODc1LDMyNTY5LDI4ODk4LDI4ODg3LDI4ODgyLDI4ODk0LDI4ODk2LDI4ODg0LDI4ODc3LDI4ODY5LDI4ODcwLDI4ODcxLDI4ODkwLDI4ODc4LDI4ODk3LDI5MjUwLDI5MzA0LDI5MzAzLDI5MzAyLDI5NDQwLDI5NDM0LDI5NDI4LDI5NDM4LDI5NDMwLDI5NDI3LDI5NDM1LDI5NDQxLDI5NjUxLDI5NjU3LDI5NjY5LDI5NjU0LDI5NjI4LDI5NjcxLDI5NjY3LDI5NjczLDI5NjYwLDI5NjUwLDI5NjU5LDI5NjUyLDI5NjYxLDI5NjU4LDI5NjU1LDI5NjU2LDI5NjcyLDI5OTE4LDI5OTE5LDI5OTQwLDI5OTQxLDI5OTg1LDMwMDQzLDMwMDQ3LDMwMTI4LDMwMTQ1LDMwMTM5LDMwMTQ4LDMwMTQ0LDMwMTQzLDMwMTM0LDMwMTM4LDMwMzQ2LDMwNDA5LDMwNDkzLDMwNDkxLDMwNDgwLDMwNDgzLDMwNDgyLDMwNDk5LDMwNDgxLDMwNDg1LDMwNDg5LDMwNDkwLDMwNDk4LDMwNTAzLDMwNzU1LDMwNzY0LDMwNzU0LDMwNzczLDMwNzY3LDMwNzYwLDMwNzY2LDMwNzYzLDMwNzUzLDMwNzYxLDMwNzcxLDMwNzYyLDMwNzY5LDMxMDYwLDMxMDY3LDMxMDU1LDMxMDY4LDMxMDU5LDMxMDU4LDMxMDU3LDMxMjExLDMxMjEyLDMxMjAwLDMxMjE0LDMxMjEzLDMxMjEwLDMxMTk2LDMxMTk4LDMxMTk3LDMxMzY2LDMxMzY5LDMxMzY1LDMxMzcxLDMxMzcyLDMxMzcwLDMxMzY3LDMxNDQ4LDMxNTA0LDMxNDkyLDMxNTA3LDMxNDkzLDMxNTAzLDMxNDk2LDMxNDk4LDMxNTAyLDMxNDk3LDMxNTA2LDMxODc2LDMxODg5LDMxODgyLDMxODg0LDMxODgwLDMxODg1LDMxODc3LDMyMDMwLDMyMDI5LDMyMDE3LDMyMDE0LDMyMDI0LDMyMDIyLDMyMDE5LDMyMDMxLDMyMDE4LDMyMDE1LDMyMDEyLDMyNjA0LDMyNjA5LDMyNjA2LDMyNjA4LDMyNjA1LDMyNjAzLDMyNjYyLDMyNjU4LDMyNzA3LDMyNzA2LDMyNzA0LDMyNzkwLDMyODMwLDMyODI1LDMzMDE4LDMzMDEwLDMzMDE3LDMzMDEzLDMzMDI1LDMzMDE5LDMzMDI0LDMzMjgxLDMzMzI3LDMzMzE3LDMzNTg3LDMzNTgxLDMzNjA0LDMzNTYxLDMzNjE3LDMzNTczLDMzNjIyLDMzNTk5LDMzNjAxLDMzNTc0LDMzNTY0LDMzNTcwLDMzNjAyLDMzNjE0LDMzNTYzLDMzNTc4LDMzNTQ0LDMzNTk2LDMzNjEzLDMzNTU4LDMzNTcyLDMzNTY4LDMzNTkxLDMzNTgzLDMzNTc3LDMzNjA3LDMzNjA1LDMzNjEyLDMzNjE5LDMzNTY2LDMzNTgwLDMzNjExLDMzNTc1LDMzNjA4LDM0Mzg3LDM0Mzg2LDM0NDY2LDM0NDcyLDM0NDU0LDM0NDQ1LDM0NDQ5LDM0NDYyLDM0NDM5LDM0NDU1LDM0NDM4LDM0NDQzLDM0NDU4LDM0NDM3LDM0NDY5LDM0NDU3LDM0NDY1LDM0NDcxLDM0NDUzLDM0NDU2LDM0NDQ2LDM0NDYxLDM0NDQ4LDM0NDUyLDM0ODgzLDM0ODg0LDM0OTI1LDM0OTMzLDM0OTM0LDM0OTMwLDM0OTQ0LDM0OTI5LDM0OTQzLDM0OTI3LDM0OTQ3LDM0OTQyLDM0OTMyLDM0OTQwLDM1MzQ2LDM1OTExLDM1OTI3LDM1OTYzLDM2MDA0LDM2MDAzLDM2MjE0LDM2MjE2LDM2Mjc3LDM2Mjc5LDM2Mjc4LDM2NTYxLDM2NTYzLDM2ODYyLDM2ODUzLDM2ODY2LDM2ODYzLDM2ODU5LDM2ODY4LDM2ODYwLDM2ODU0LDM3MDc4LDM3MDg4LDM3MDgxLDM3MDgyLDM3MDkxLDM3MDg3LDM3MDkzLDM3MDgwLDM3MDgzLDM3MDc5LDM3MDg0LDM3MDkyLDM3MjAwLDM3MTk4LDM3MTk5LDM3MzMzLDM3MzQ2LDM3MzM4LDM4NDkyLDM4NDk1LDM4NTg4LDM5MTM5LDM5NjQ3LDM5NzI3LDIwMDk1LDIwNTkyLDIwNTg2LDIwNTc3LDIwNTc0LDIwNTc2LDIwNTYzLDIwNTU1LDIwNTczLDIwNTk0LDIwNTUyLDIwNTU3LDIwNTQ1LDIwNTcxLDIwNTU0LDIwNTc4LDIwNTAxLDIwNTQ5LDIwNTc1LDIwNTg1LDIwNTg3LDIwNTc5LDIwNTgwLDIwNTUwLDIwNTQ0LDIwNTkwLDIwNTk1LDIwNTY3LDIwNTYxLDIwOTQ0LDIxMDk5LDIxMTAxLDIxMTAwLDIxMTAyLDIxMjA2LDIxMjAzLDIxMjkzLDIxNDA0LDIxODc3LDIxODc4LDIxODIwLDIxODM3LDIxODQwLDIxODEyLDIxODAyLDIxODQxLDIxODU4LDIxODE0LDIxODEzLDIxODA4LDIxODQyLDIxODI5LDIxNzcyLDIxODEwLDIxODYxLDIxODM4LDIxODE3LDIxODMyLDIxODA1LDIxODE5LDIxODI0LDIxODM1LDIyMjgyLDIyMjc5LDIyNTIzLDIyNTQ4LDIyNDk4LDIyNTE4LDIyNDkyLDIyNTE2LDIyNTI4LDIyNTA5LDIyNTI1LDIyNTM2LDIyNTIwLDIyNTM5LDIyNTE1LDIyNDc5LDIyNTM1LDIyNTEwLDIyNDk5LDIyNTE0LDIyNTAxLDIyNTA4LDIyNDk3LDIyNTQyLDIyNTI0LDIyNTQ0LDIyNTAzLDIyNTI5LDIyNTQwLDIyNTEzLDIyNTA1LDIyNTEyLDIyNTQxLDIyNTMyLDIyODc2LDIzMTM2LDIzMTI4LDIzMTI1LDIzMTQzLDIzMTM0LDIzMDk2LDIzMDkzLDIzMTQ5LDIzMTIwLDIzMTM1LDIzMTQxLDIzMTQ4LDIzMTIzLDIzMTQwLDIzMTI3LDIzMTA3LDIzMTMzLDIzMTIyLDIzMTA4LDIzMTMxLDIzMTEyLDIzMTgyLDIzMTAyLDIzMTE3LDIzMDk3LDIzMTE2LDIzMTUyLDIzMTQ1LDIzMTExLDIzMTIxLDIzMTI2LDIzMTA2LDIzMTMyLDIzNDEwLDIzNDA2LDIzNDg5LDIzNDg4LDIzNjQxLDIzODM4LDIzODE5LDIzODM3LDIzODM0LDIzODQwLDIzODIwLDIzODQ4LDIzODIxLDIzODQ2LDIzODQ1LDIzODIzLDIzODU2LDIzODI2LDIzODQzLDIzODM5LDIzODU0LDI0MTI2LDI0MTE2LDI0MjQxLDI0MjQ0LDI0MjQ5LDI0MjQyLDI0MjQzLDI0Mzc0LDI0Mzc2LDI0NDc1LDI0NDcwLDI0NDc5LDI0NzE0LDI0NzIwLDI0NzEwLDI0NzY2LDI0NzUyLDI0NzYyLDI0Nzg3LDI0Nzg4LDI0NzgzLDI0ODA0LDI0NzkzLDI0Nzk3LDI0Nzc2LDI0NzUzLDI0Nzk1LDI0NzU5LDI0Nzc4LDI0NzY3LDI0NzcxLDI0NzgxLDI0NzY4LDI1Mzk0LDI1NDQ1LDI1NDgyLDI1NDc0LDI1NDY5LDI1NTMzLDI1NTAyLDI1NTE3LDI1NTAxLDI1NDk1LDI1NTE1LDI1NDg2LDI1NDU1LDI1NDc5LDI1NDg4LDI1NDU0LDI1NTE5LDI1NDYxLDI1NTAwLDI1NDUzLDI1NTE4LDI1NDY4LDI1NTA4LDI1NDAzLDI1NTAzLDI1NDY0LDI1NDc3LDI1NDczLDI1NDg5LDI1NDg1LDI1NDU2LDI1OTM5LDI2MDYxLDI2MjEzLDI2MjA5LDI2MjAzLDI2MjAxLDI2MjA0LDI2MjEwLDI2MzkyLDI2NzQ1LDI2NzU5LDI2NzY4LDI2NzgwLDI2NzMzLDI2NzM0LDI2Nzk4LDI2Nzk1LDI2OTY2LDI2NzM1LDI2Nzg3LDI2Nzk2LDI2NzkzLDI2NzQxLDI2NzQwLDI2ODAyLDI2NzY3LDI2NzQzLDI2NzcwLDI2NzQ4LDI2NzMxLDI2NzM4LDI2Nzk0LDI2NzUyLDI2NzM3LDI2NzUwLDI2Nzc5LDI2Nzc0LDI2NzYzLDI2Nzg0LDI2NzYxLDI2Nzg4LDI2NzQ0LDI2NzQ3LDI2NzY5LDI2NzY0LDI2NzYyLDI2NzQ5LDI3NDQ2LDI3NDQzLDI3NDQ3LDI3NDQ4LDI3NTM3LDI3NTM1LDI3NTMzLDI3NTM0LDI3NTMyLDI3NjkwLDI4MDk2LDI4MDc1LDI4MDg0LDI4MDgzLDI4Mjc2LDI4MDc2LDI4MTM3LDI4MTMwLDI4MDg3LDI4MTUwLDI4MTE2LDI4MTYwLDI4MTA0LDI4MTI4LDI4MTI3LDI4MTE4LDI4MDk0LDI4MTMzLDI4MTI0LDI4MTI1LDI4MTIzLDI4MTQ4LDI4MTA2LDI4MDkzLDI4MTQxLDI4MTQ0LDI4MDkwLDI4MTE3LDI4MDk4LDI4MTExLDI4MTA1LDI4MTEyLDI4MTQ2LDI4MTE1LDI4MTU3LDI4MTE5LDI4MTA5LDI4MTMxLDI4MDkxLDI4OTIyLDI4OTQxLDI4OTE5LDI4OTUxLDI4OTE2LDI4OTQwLDI4OTEyLDI4OTMyLDI4OTE1LDI4OTQ0LDI4OTI0LDI4OTI3LDI4OTM0LDI4OTQ3LDI4OTI4LDI4OTIwLDI4OTE4LDI4OTM5LDI4OTMwLDI4OTQyLDI5MzEwLDI5MzA3LDI5MzA4LDI5MzExLDI5NDY5LDI5NDYzLDI5NDQ3LDI5NDU3LDI5NDY0LDI5NDUwLDI5NDQ4LDI5NDM5LDI5NDU1LDI5NDcwLDI5NTc2LDI5Njg2LDI5Njg4LDI5Njg1LDI5NzAwLDI5Njk3LDI5NjkzLDI5NzAzLDI5Njk2LDI5NjkwLDI5NjkyLDI5Njk1LDI5NzA4LDI5NzA3LDI5Njg0LDI5NzA0LDMwMDUyLDMwMDUxLDMwMTU4LDMwMTYyLDMwMTU5LDMwMTU1LDMwMTU2LDMwMTYxLDMwMTYwLDMwMzUxLDMwMzQ1LDMwNDE5LDMwNTIxLDMwNTExLDMwNTA5LDMwNTEzLDMwNTE0LDMwNTE2LDMwNTE1LDMwNTI1LDMwNTAxLDMwNTIzLDMwNTE3LDMwNzkyLDMwODAyLDMwNzkzLDMwNzk3LDMwNzk0LDMwNzk2LDMwNzU4LDMwNzg5LDMwODAwLDMxMDc2LDMxMDc5LDMxMDgxLDMxMDgyLDMxMDc1LDMxMDgzLDMxMDczLDMxMTYzLDMxMjI2LDMxMjI0LDMxMjIyLDMxMjIzLDMxMzc1LDMxMzgwLDMxMzc2LDMxNTQxLDMxNTU5LDMxNTQwLDMxNTI1LDMxNTM2LDMxNTIyLDMxNTI0LDMxNTM5LDMxNTEyLDMxNTMwLDMxNTE3LDMxNTM3LDMxNTMxLDMxNTMzLDMxNTM1LDMxNTM4LDMxNTQ0LDMxNTE0LDMxNTIzLDMxODkyLDMxODk2LDMxODk0LDMxOTA3LDMyMDUzLDMyMDYxLDMyMDU2LDMyMDU0LDMyMDU4LDMyMDY5LDMyMDQ0LDMyMDQxLDMyMDY1LDMyMDcxLDMyMDYyLDMyMDYzLDMyMDc0LDMyMDU5LDMyMDQwLDMyNjExLDMyNjYxLDMyNjY4LDMyNjY5LDMyNjY3LDMyNzE0LDMyNzE1LDMyNzE3LDMyNzIwLDMyNzIxLDMyNzExLDMyNzE5LDMyNzEzLDMyNzk5LDMyNzk4LDMyNzk1LDMyODM5LDMyODM1LDMyODQwLDMzMDQ4LDMzMDYxLDMzMDQ5LDMzMDUxLDMzMDY5LDMzMDU1LDMzMDY4LDMzMDU0LDMzMDU3LDMzMDQ1LDMzMDYzLDMzMDUzLDMzMDU4LDMzMjk3LDMzMzM2LDMzMzMxLDMzMzM4LDMzMzMyLDMzMzMwLDMzMzk2LDMzNjgwLDMzNjk5LDMzNzA0LDMzNjc3LDMzNjU4LDMzNjUxLDMzNzAwLDMzNjUyLDMzNjc5LDMzNjY1LDMzNjg1LDMzNjg5LDMzNjUzLDMzNjg0LDMzNzA1LDMzNjYxLDMzNjY3LDMzNjc2LDMzNjkzLDMzNjkxLDMzNzA2LDMzNjc1LDMzNjYyLDMzNzAxLDMzNzExLDMzNjcyLDMzNjg3LDMzNzEyLDMzNjYzLDMzNzAyLDMzNjcxLDMzNzEwLDMzNjU0LDMzNjkwLDM0MzkzLDM0MzkwLDM0NDk1LDM0NDg3LDM0NDk4LDM0NDk3LDM0NTAxLDM0NDkwLDM0NDgwLDM0NTA0LDM0NDg5LDM0NDgzLDM0NDg4LDM0NTA4LDM0NDg0LDM0NDkxLDM0NDkyLDM0NDk5LDM0NDkzLDM0NDk0LDM0ODk4LDM0OTUzLDM0OTY1LDM0OTg0LDM0OTc4LDM0OTg2LDM0OTcwLDM0OTYxLDM0OTc3LDM0OTc1LDM0OTY4LDM0OTgzLDM0OTY5LDM0OTcxLDM0OTY3LDM0OTgwLDM0OTg4LDM0OTU2LDM0OTYzLDM0OTU4LDM1MjAyLDM1Mjg2LDM1Mjg5LDM1Mjg1LDM1Mzc2LDM1MzY3LDM1MzcyLDM1MzU4LDM1ODk3LDM1ODk5LDM1OTMyLDM1OTMzLDM1OTY1LDM2MDA1LDM2MjIxLDM2MjE5LDM2MjE3LDM2Mjg0LDM2MjkwLDM2MjgxLDM2Mjg3LDM2Mjg5LDM2NTY4LDM2NTc0LDM2NTczLDM2NTcyLDM2NTY3LDM2NTc2LDM2NTc3LDM2OTAwLDM2ODc1LDM2ODgxLDM2ODkyLDM2ODc2LDM2ODk3LDM3MTAzLDM3MDk4LDM3MTA0LDM3MTA4LDM3MTA2LDM3MTA3LDM3MDc2LDM3MDk5LDM3MTAwLDM3MDk3LDM3MjA2LDM3MjA4LDM3MjEwLDM3MjAzLDM3MjA1LDM3MzU2LDM3MzY0LDM3MzYxLDM3MzYzLDM3MzY4LDM3MzQ4LDM3MzY5LDM3MzU0LDM3MzU1LDM3MzY3LDM3MzUyLDM3MzU4LDM4MjY2LDM4Mjc4LDM4MjgwLDM4NTI0LDM4NTA5LDM4NTA3LDM4NTEzLDM4NTExLDM4NTkxLDM4NzYyLDM4OTE2LDM5MTQxLDM5MzE5LDIwNjM1LDIwNjI5LDIwNjI4LDIwNjM4LDIwNjE5LDIwNjQzLDIwNjExLDIwNjIwLDIwNjIyLDIwNjM3LDIwNTg0LDIwNjM2LDIwNjI2LDIwNjEwLDIwNjE1LDIwODMxLDIwOTQ4LDIxMjY2LDIxMjY1LDIxNDEyLDIxNDE1LDIxOTA1LDIxOTI4LDIxOTI1LDIxOTMzLDIxODc5LDIyMDg1LDIxOTIyLDIxOTA3LDIxODk2LDIxOTAzLDIxOTQxLDIxODg5LDIxOTIzLDIxOTA2LDIxOTI0LDIxODg1LDIxOTAwLDIxOTI2LDIxODg3LDIxOTA5LDIxOTIxLDIxOTAyLDIyMjg0LDIyNTY5LDIyNTgzLDIyNTUzLDIyNTU4LDIyNTY3LDIyNTYzLDIyNTY4LDIyNTE3LDIyNjAwLDIyNTY1LDIyNTU2LDIyNTU1LDIyNTc5LDIyNTkxLDIyNTgyLDIyNTc0LDIyNTg1LDIyNTg0LDIyNTczLDIyNTcyLDIyNTg3LDIyODgxLDIzMjE1LDIzMTg4LDIzMTk5LDIzMTYyLDIzMjAyLDIzMTk4LDIzMTYwLDIzMjA2LDIzMTY0LDIzMjA1LDIzMjEyLDIzMTg5LDIzMjE0LDIzMDk1LDIzMTcyLDIzMTc4LDIzMTkxLDIzMTcxLDIzMTc5LDIzMjA5LDIzMTYzLDIzMTY1LDIzMTgwLDIzMTk2LDIzMTgzLDIzMTg3LDIzMTk3LDIzNTMwLDIzNTAxLDIzNDk5LDIzNTA4LDIzNTA1LDIzNDk4LDIzNTAyLDIzNTY0LDIzNjAwLDIzODYzLDIzODc1LDIzOTE1LDIzODczLDIzODgzLDIzODcxLDIzODYxLDIzODg5LDIzODg2LDIzODkzLDIzODU5LDIzODY2LDIzODkwLDIzODY5LDIzODU3LDIzODk3LDIzODc0LDIzODY1LDIzODgxLDIzODY0LDIzODY4LDIzODU4LDIzODYyLDIzODcyLDIzODc3LDI0MTMyLDI0MTI5LDI0NDA4LDI0NDg2LDI0NDg1LDI0NDkxLDI0Nzc3LDI0NzYxLDI0NzgwLDI0ODAyLDI0NzgyLDI0NzcyLDI0ODUyLDI0ODE4LDI0ODQyLDI0ODU0LDI0ODM3LDI0ODIxLDI0ODUxLDI0ODI0LDI0ODI4LDI0ODMwLDI0NzY5LDI0ODM1LDI0ODU2LDI0ODYxLDI0ODQ4LDI0ODMxLDI0ODM2LDI0ODQzLDI1MTYyLDI1NDkyLDI1NTIxLDI1NTIwLDI1NTUwLDI1NTczLDI1NTc2LDI1NTgzLDI1NTM5LDI1NzU3LDI1NTg3LDI1NTQ2LDI1NTY4LDI1NTkwLDI1NTU3LDI1NTg2LDI1NTg5LDI1Njk3LDI1NTY3LDI1NTM0LDI1NTY1LDI1NTY0LDI1NTQwLDI1NTYwLDI1NTU1LDI1NTM4LDI1NTQzLDI1NTQ4LDI1NTQ3LDI1NTQ0LDI1NTg0LDI1NTU5LDI1NTYxLDI1OTA2LDI1OTU5LDI1OTYyLDI1OTU2LDI1OTQ4LDI1OTYwLDI1OTU3LDI1OTk2LDI2MDEzLDI2MDE0LDI2MDMwLDI2MDY0LDI2MDY2LDI2MjM2LDI2MjIwLDI2MjM1LDI2MjQwLDI2MjI1LDI2MjMzLDI2MjE4LDI2MjI2LDI2MzY5LDI2ODkyLDI2ODM1LDI2ODg0LDI2ODQ0LDI2OTIyLDI2ODYwLDI2ODU4LDI2ODY1LDI2ODk1LDI2ODM4LDI2ODcxLDI2ODU5LDI2ODUyLDI2ODcwLDI2ODk5LDI2ODk2LDI2ODY3LDI2ODQ5LDI2ODg3LDI2ODI4LDI2ODg4LDI2OTkyLDI2ODA0LDI2ODk3LDI2ODYzLDI2ODIyLDI2OTAwLDI2ODcyLDI2ODMyLDI2ODc3LDI2ODc2LDI2ODU2LDI2ODkxLDI2ODkwLDI2OTAzLDI2ODMwLDI2ODI0LDI2ODQ1LDI2ODQ2LDI2ODU0LDI2ODY4LDI2ODMzLDI2ODg2LDI2ODM2LDI2ODU3LDI2OTAxLDI2OTE3LDI2ODIzLDI3NDQ5LDI3NDUxLDI3NDU1LDI3NDUyLDI3NTQwLDI3NTQzLDI3NTQ1LDI3NTQxLDI3NTgxLDI3NjMyLDI3NjM0LDI3NjM1LDI3Njk2LDI4MTU2LDI4MjMwLDI4MjMxLDI4MTkxLDI4MjMzLDI4Mjk2LDI4MjIwLDI4MjIxLDI4MjI5LDI4MjU4LDI4MjAzLDI4MjIzLDI4MjI1LDI4MjUzLDI4Mjc1LDI4MTg4LDI4MjExLDI4MjM1LDI4MjI0LDI4MjQxLDI4MjE5LDI4MTYzLDI4MjA2LDI4MjU0LDI4MjY0LDI4MjUyLDI4MjU3LDI4MjA5LDI4MjAwLDI4MjU2LDI4MjczLDI4MjY3LDI4MjE3LDI4MTk0LDI4MjA4LDI4MjQzLDI4MjYxLDI4MTk5LDI4MjgwLDI4MjYwLDI4Mjc5LDI4MjQ1LDI4MjgxLDI4MjQyLDI4MjYyLDI4MjEzLDI4MjE0LDI4MjUwLDI4OTYwLDI4OTU4LDI4OTc1LDI4OTIzLDI4OTc0LDI4OTc3LDI4OTYzLDI4OTY1LDI4OTYyLDI4OTc4LDI4OTU5LDI4OTY4LDI4OTg2LDI4OTU1LDI5MjU5LDI5Mjc0LDI5MzIwLDI5MzIxLDI5MzE4LDI5MzE3LDI5MzIzLDI5NDU4LDI5NDUxLDI5NDg4LDI5NDc0LDI5NDg5LDI5NDkxLDI5NDc5LDI5NDkwLDI5NDg1LDI5NDc4LDI5NDc1LDI5NDkzLDI5NDUyLDI5NzQyLDI5NzQwLDI5NzQ0LDI5NzM5LDI5NzE4LDI5NzIyLDI5NzI5LDI5NzQxLDI5NzQ1LDI5NzMyLDI5NzMxLDI5NzI1LDI5NzM3LDI5NzI4LDI5NzQ2LDI5OTQ3LDI5OTk5LDMwMDYzLDMwMDYwLDMwMTgzLDMwMTcwLDMwMTc3LDMwMTgyLDMwMTczLDMwMTc1LDMwMTgwLDMwMTY3LDMwMzU3LDMwMzU0LDMwNDI2LDMwNTM0LDMwNTM1LDMwNTMyLDMwNTQxLDMwNTMzLDMwNTM4LDMwNTQyLDMwNTM5LDMwNTQwLDMwNjg2LDMwNzAwLDMwODE2LDMwODIwLDMwODIxLDMwODEyLDMwODI5LDMwODMzLDMwODI2LDMwODMwLDMwODMyLDMwODI1LDMwODI0LDMwODE0LDMwODE4LDMxMDkyLDMxMDkxLDMxMDkwLDMxMDg4LDMxMjM0LDMxMjQyLDMxMjM1LDMxMjQ0LDMxMjM2LDMxMzg1LDMxNDYyLDMxNDYwLDMxNTYyLDMxNTQ3LDMxNTU2LDMxNTYwLDMxNTY0LDMxNTY2LDMxNTUyLDMxNTc2LDMxNTU3LDMxOTA2LDMxOTAyLDMxOTEyLDMxOTA1LDMyMDg4LDMyMTExLDMyMDk5LDMyMDgzLDMyMDg2LDMyMTAzLDMyMTA2LDMyMDc5LDMyMTA5LDMyMDkyLDMyMTA3LDMyMDgyLDMyMDg0LDMyMTA1LDMyMDgxLDMyMDk1LDMyMDc4LDMyNTc0LDMyNTc1LDMyNjEzLDMyNjE0LDMyNjc0LDMyNjcyLDMyNjczLDMyNzI3LDMyODQ5LDMyODQ3LDMyODQ4LDMzMDIyLDMyOTgwLDMzMDkxLDMzMDk4LDMzMTA2LDMzMTAzLDMzMDk1LDMzMDg1LDMzMTAxLDMzMDgyLDMzMjU0LDMzMjYyLDMzMjcxLDMzMjcyLDMzMjczLDMzMjg0LDMzMzQwLDMzMzQxLDMzMzQzLDMzMzk3LDMzNTk1LDMzNzQzLDMzNzg1LDMzODI3LDMzNzI4LDMzNzY4LDMzODEwLDMzNzY3LDMzNzY0LDMzNzg4LDMzNzgyLDMzODA4LDMzNzM0LDMzNzM2LDMzNzcxLDMzNzYzLDMzNzI3LDMzNzkzLDMzNzU3LDMzNzY1LDMzNzUyLDMzNzkxLDMzNzYxLDMzNzM5LDMzNzQyLDMzNzUwLDMzNzgxLDMzNzM3LDMzODAxLDMzODA3LDMzNzU4LDMzODA5LDMzNzk4LDMzNzMwLDMzNzc5LDMzNzQ5LDMzNzg2LDMzNzM1LDMzNzQ1LDMzNzcwLDMzODExLDMzNzMxLDMzNzcyLDMzNzc0LDMzNzMyLDMzNzg3LDMzNzUxLDMzNzYyLDMzODE5LDMzNzU1LDMzNzkwLDM0NTIwLDM0NTMwLDM0NTM0LDM0NTE1LDM0NTMxLDM0NTIyLDM0NTM4LDM0NTI1LDM0NTM5LDM0NTI0LDM0NTQwLDM0NTM3LDM0NTE5LDM0NTM2LDM0NTEzLDM0ODg4LDM0OTAyLDM0OTAxLDM1MDAyLDM1MDMxLDM1MDAxLDM1MDAwLDM1MDA4LDM1MDA2LDM0OTk4LDM1MDA0LDM0OTk5LDM1MDA1LDM0OTk0LDM1MDczLDM1MDE3LDM1MjIxLDM1MjI0LDM1MjIzLDM1MjkzLDM1MjkwLDM1MjkxLDM1NDA2LDM1NDA1LDM1Mzg1LDM1NDE3LDM1MzkyLDM1NDE1LDM1NDE2LDM1Mzk2LDM1Mzk3LDM1NDEwLDM1NDAwLDM1NDA5LDM1NDAyLDM1NDA0LDM1NDA3LDM1OTM1LDM1OTY5LDM1OTY4LDM2MDI2LDM2MDMwLDM2MDE2LDM2MDI1LDM2MDIxLDM2MjI4LDM2MjI0LDM2MjMzLDM2MzEyLDM2MzA3LDM2MzAxLDM2Mjk1LDM2MzEwLDM2MzE2LDM2MzAzLDM2MzA5LDM2MzEzLDM2Mjk2LDM2MzExLDM2MjkzLDM2NTkxLDM2NTk5LDM2NjAyLDM2NjAxLDM2NTgyLDM2NTkwLDM2NTgxLDM2NTk3LDM2NTgzLDM2NTg0LDM2NTk4LDM2NTg3LDM2NTkzLDM2NTg4LDM2NTk2LDM2NTg1LDM2OTA5LDM2OTE2LDM2OTExLDM3MTI2LDM3MTY0LDM3MTI0LDM3MTE5LDM3MTE2LDM3MTI4LDM3MTEzLDM3MTE1LDM3MTIxLDM3MTIwLDM3MTI3LDM3MTI1LDM3MTIzLDM3MjE3LDM3MjIwLDM3MjE1LDM3MjE4LDM3MjE2LDM3Mzc3LDM3Mzg2LDM3NDEzLDM3Mzc5LDM3NDAyLDM3NDE0LDM3MzkxLDM3Mzg4LDM3Mzc2LDM3Mzk0LDM3Mzc1LDM3MzczLDM3MzgyLDM3MzgwLDM3NDE1LDM3Mzc4LDM3NDA0LDM3NDEyLDM3NDAxLDM3Mzk5LDM3MzgxLDM3Mzk4LDM4MjY3LDM4Mjg1LDM4Mjg0LDM4Mjg4LDM4NTM1LDM4NTI2LDM4NTM2LDM4NTM3LDM4NTMxLDM4NTI4LDM4NTk0LDM4NjAwLDM4NTk1LDM4NjQxLDM4NjQwLDM4NzY0LDM4NzY4LDM4NzY2LDM4OTE5LDM5MDgxLDM5MTQ3LDQwMTY2LDQwNjk3LDIwMDk5LDIwMTAwLDIwMTUwLDIwNjY5LDIwNjcxLDIwNjc4LDIwNjU0LDIwNjc2LDIwNjgyLDIwNjYwLDIwNjgwLDIwNjc0LDIwNjU2LDIwNjczLDIwNjY2LDIwNjU3LDIwNjgzLDIwNjgxLDIwNjYyLDIwNjY0LDIwOTUxLDIxMTE0LDIxMTEyLDIxMTE1LDIxMTE2LDIxOTU1LDIxOTc5LDIxOTY0LDIxOTY4LDIxOTYzLDIxOTYyLDIxOTgxLDIxOTUyLDIxOTcyLDIxOTU2LDIxOTkzLDIxOTUxLDIxOTcwLDIxOTAxLDIxOTY3LDIxOTczLDIxOTg2LDIxOTc0LDIxOTYwLDIyMDAyLDIxOTY1LDIxOTc3LDIxOTU0LDIyMjkyLDIyNjExLDIyNjMyLDIyNjI4LDIyNjA3LDIyNjA1LDIyNjAxLDIyNjM5LDIyNjEzLDIyNjA2LDIyNjIxLDIyNjE3LDIyNjI5LDIyNjE5LDIyNTg5LDIyNjI3LDIyNjQxLDIyNzgwLDIzMjM5LDIzMjM2LDIzMjQzLDIzMjI2LDIzMjI0LDIzMjE3LDIzMjIxLDIzMjE2LDIzMjMxLDIzMjQwLDIzMjI3LDIzMjM4LDIzMjIzLDIzMjMyLDIzMjQyLDIzMjIwLDIzMjIyLDIzMjQ1LDIzMjI1LDIzMTg0LDIzNTEwLDIzNTEyLDIzNTEzLDIzNTgzLDIzNjAzLDIzOTIxLDIzOTA3LDIzODgyLDIzOTA5LDIzOTIyLDIzOTE2LDIzOTAyLDIzOTEyLDIzOTExLDIzOTA2LDI0MDQ4LDI0MTQzLDI0MTQyLDI0MTM4LDI0MTQxLDI0MTM5LDI0MjYxLDI0MjY4LDI0MjYyLDI0MjY3LDI0MjYzLDI0Mzg0LDI0NDk1LDI0NDkzLDI0ODIzLDI0OTA1LDI0OTA2LDI0ODc1LDI0OTAxLDI0ODg2LDI0ODgyLDI0ODc4LDI0OTAyLDI0ODc5LDI0OTExLDI0ODczLDI0ODk2LDI1MTIwLDM3MjI0LDI1MTIzLDI1MTI1LDI1MTI0LDI1NTQxLDI1NTg1LDI1NTc5LDI1NjE2LDI1NjE4LDI1NjA5LDI1NjMyLDI1NjM2LDI1NjUxLDI1NjY3LDI1NjMxLDI1NjIxLDI1NjI0LDI1NjU3LDI1NjU1LDI1NjM0LDI1NjM1LDI1NjEyLDI1NjM4LDI1NjQ4LDI1NjQwLDI1NjY1LDI1NjUzLDI1NjQ3LDI1NjEwLDI1NjI2LDI1NjY0LDI1NjM3LDI1NjM5LDI1NjExLDI1NTc1LDI1NjI3LDI1NjQ2LDI1NjMzLDI1NjE0LDI1OTY3LDI2MDAyLDI2MDY3LDI2MjQ2LDI2MjUyLDI2MjYxLDI2MjU2LDI2MjUxLDI2MjUwLDI2MjY1LDI2MjYwLDI2MjMyLDI2NDAwLDI2OTgyLDI2OTc1LDI2OTM2LDI2OTU4LDI2OTc4LDI2OTkzLDI2OTQzLDI2OTQ5LDI2OTg2LDI2OTM3LDI2OTQ2LDI2OTY3LDI2OTY5LDI3MDAyLDI2OTUyLDI2OTUzLDI2OTMzLDI2OTg4LDI2OTMxLDI2OTQxLDI2OTgxLDI2ODY0LDI3MDAwLDI2OTMyLDI2OTg1LDI2OTQ0LDI2OTkxLDI2OTQ4LDI2OTk4LDI2OTY4LDI2OTQ1LDI2OTk2LDI2OTU2LDI2OTM5LDI2OTU1LDI2OTM1LDI2OTcyLDI2OTU5LDI2OTYxLDI2OTMwLDI2OTYyLDI2OTI3LDI3MDAzLDI2OTQwLDI3NDYyLDI3NDYxLDI3NDU5LDI3NDU4LDI3NDY0LDI3NDU3LDI3NTQ3LDY0MDEzLDI3NjQzLDI3NjQ0LDI3NjQxLDI3NjM5LDI3NjQwLDI4MzE1LDI4Mzc0LDI4MzYwLDI4MzAzLDI4MzUyLDI4MzE5LDI4MzA3LDI4MzA4LDI4MzIwLDI4MzM3LDI4MzQ1LDI4MzU4LDI4MzcwLDI4MzQ5LDI4MzUzLDI4MzE4LDI4MzYxLDI4MzQzLDI4MzM2LDI4MzY1LDI4MzI2LDI4MzY3LDI4MzM4LDI4MzUwLDI4MzU1LDI4MzgwLDI4Mzc2LDI4MzEzLDI4MzA2LDI4MzAyLDI4MzAxLDI4MzI0LDI4MzIxLDI4MzUxLDI4MzM5LDI4MzY4LDI4MzYyLDI4MzExLDI4MzM0LDI4MzIzLDI4OTk5LDI5MDEyLDI5MDEwLDI5MDI3LDI5MDI0LDI4OTkzLDI5MDIxLDI5MDI2LDI5MDQyLDI5MDQ4LDI5MDM0LDI5MDI1LDI4OTk0LDI5MDE2LDI4OTk1LDI5MDAzLDI5MDQwLDI5MDIzLDI5MDA4LDI5MDExLDI4OTk2LDI5MDA1LDI5MDE4LDI5MjYzLDI5MzI1LDI5MzI0LDI5MzI5LDI5MzI4LDI5MzI2LDI5NTAwLDI5NTA2LDI5NDk5LDI5NDk4LDI5NTA0LDI5NTE0LDI5NTEzLDI5NzY0LDI5NzcwLDI5NzcxLDI5Nzc4LDI5Nzc3LDI5NzgzLDI5NzYwLDI5Nzc1LDI5Nzc2LDI5Nzc0LDI5NzYyLDI5NzY2LDI5NzczLDI5NzgwLDI5OTIxLDI5OTUxLDI5OTUwLDI5OTQ5LDI5OTgxLDMwMDczLDMwMDcxLDI3MDExLDMwMTkxLDMwMjIzLDMwMjExLDMwMTk5LDMwMjA2LDMwMjA0LDMwMjAxLDMwMjAwLDMwMjI0LDMwMjAzLDMwMTk4LDMwMTg5LDMwMTk3LDMwMjA1LDMwMzYxLDMwMzg5LDMwNDI5LDMwNTQ5LDMwNTU5LDMwNTYwLDMwNTQ2LDMwNTUwLDMwNTU0LDMwNTY5LDMwNTY3LDMwNTQ4LDMwNTUzLDMwNTczLDMwNjg4LDMwODU1LDMwODc0LDMwODY4LDMwODYzLDMwODUyLDMwODY5LDMwODUzLDMwODU0LDMwODgxLDMwODUxLDMwODQxLDMwODczLDMwODQ4LDMwODcwLDMwODQzLDMxMTAwLDMxMTA2LDMxMTAxLDMxMDk3LDMxMjQ5LDMxMjU2LDMxMjU3LDMxMjUwLDMxMjU1LDMxMjUzLDMxMjY2LDMxMjUxLDMxMjU5LDMxMjQ4LDMxMzk1LDMxMzk0LDMxMzkwLDMxNDY3LDMxNTkwLDMxNTg4LDMxNTk3LDMxNjA0LDMxNTkzLDMxNjAyLDMxNTg5LDMxNjAzLDMxNjAxLDMxNjAwLDMxNTg1LDMxNjA4LDMxNjA2LDMxNTg3LDMxOTIyLDMxOTI0LDMxOTE5LDMyMTM2LDMyMTM0LDMyMTI4LDMyMTQxLDMyMTI3LDMyMTMzLDMyMTIyLDMyMTQyLDMyMTIzLDMyMTMxLDMyMTI0LDMyMTQwLDMyMTQ4LDMyMTMyLDMyMTI1LDMyMTQ2LDMyNjIxLDMyNjE5LDMyNjE1LDMyNjE2LDMyNjIwLDMyNjc4LDMyNjc3LDMyNjc5LDMyNzMxLDMyNzMyLDMyODAxLDMzMTI0LDMzMTIwLDMzMTQzLDMzMTE2LDMzMTI5LDMzMTE1LDMzMTIyLDMzMTM4LDI2NDAxLDMzMTE4LDMzMTQyLDMzMTI3LDMzMTM1LDMzMDkyLDMzMTIxLDMzMzA5LDMzMzUzLDMzMzQ4LDMzMzQ0LDMzMzQ2LDMzMzQ5LDM0MDMzLDMzODU1LDMzODc4LDMzOTEwLDMzOTEzLDMzOTM1LDMzOTMzLDMzODkzLDMzODczLDMzODU2LDMzOTI2LDMzODk1LDMzODQwLDMzODY5LDMzOTE3LDMzODgyLDMzODgxLDMzOTA4LDMzOTA3LDMzODg1LDM0MDU1LDMzODg2LDMzODQ3LDMzODUwLDMzODQ0LDMzOTE0LDMzODU5LDMzOTEyLDMzODQyLDMzODYxLDMzODMzLDMzNzUzLDMzODY3LDMzODM5LDMzODU4LDMzODM3LDMzODg3LDMzOTA0LDMzODQ5LDMzODcwLDMzODY4LDMzODc0LDMzOTAzLDMzOTg5LDMzOTM0LDMzODUxLDMzODYzLDMzODQ2LDMzODQzLDMzODk2LDMzOTE4LDMzODYwLDMzODM1LDMzODg4LDMzODc2LDMzOTAyLDMzODcyLDM0NTcxLDM0NTY0LDM0NTUxLDM0NTcyLDM0NTU0LDM0NTE4LDM0NTQ5LDM0NjM3LDM0NTUyLDM0NTc0LDM0NTY5LDM0NTYxLDM0NTUwLDM0NTczLDM0NTY1LDM1MDMwLDM1MDE5LDM1MDIxLDM1MDIyLDM1MDM4LDM1MDM1LDM1MDM0LDM1MDIwLDM1MDI0LDM1MjA1LDM1MjI3LDM1Mjk1LDM1MzAxLDM1MzAwLDM1Mjk3LDM1Mjk2LDM1Mjk4LDM1MjkyLDM1MzAyLDM1NDQ2LDM1NDYyLDM1NDU1LDM1NDI1LDM1MzkxLDM1NDQ3LDM1NDU4LDM1NDYwLDM1NDQ1LDM1NDU5LDM1NDU3LDM1NDQ0LDM1NDUwLDM1OTAwLDM1OTE1LDM1OTE0LDM1OTQxLDM1OTQwLDM1OTQyLDM1OTc0LDM1OTcyLDM1OTczLDM2MDQ0LDM2MjAwLDM2MjAxLDM2MjQxLDM2MjM2LDM2MjM4LDM2MjM5LDM2MjM3LDM2MjQzLDM2MjQ0LDM2MjQwLDM2MjQyLDM2MzM2LDM2MzIwLDM2MzMyLDM2MzM3LDM2MzM0LDM2MzA0LDM2MzI5LDM2MzIzLDM2MzIyLDM2MzI3LDM2MzM4LDM2MzMxLDM2MzQwLDM2NjE0LDM2NjA3LDM2NjA5LDM2NjA4LDM2NjEzLDM2NjE1LDM2NjE2LDM2NjEwLDM2NjE5LDM2OTQ2LDM2OTI3LDM2OTMyLDM2OTM3LDM2OTI1LDM3MTM2LDM3MTMzLDM3MTM1LDM3MTM3LDM3MTQyLDM3MTQwLDM3MTMxLDM3MTM0LDM3MjMwLDM3MjMxLDM3NDQ4LDM3NDU4LDM3NDI0LDM3NDM0LDM3NDc4LDM3NDI3LDM3NDc3LDM3NDcwLDM3NTA3LDM3NDIyLDM3NDUwLDM3NDQ2LDM3NDg1LDM3NDg0LDM3NDU1LDM3NDcyLDM3NDc5LDM3NDg3LDM3NDMwLDM3NDczLDM3NDg4LDM3NDI1LDM3NDYwLDM3NDc1LDM3NDU2LDM3NDkwLDM3NDU0LDM3NDU5LDM3NDUyLDM3NDYyLDM3NDI2LDM4MzAzLDM4MzAwLDM4MzAyLDM4Mjk5LDM4NTQ2LDM4NTQ3LDM4NTQ1LDM4NTUxLDM4NjA2LDM4NjUwLDM4NjUzLDM4NjQ4LDM4NjQ1LDM4NzcxLDM4Nzc1LDM4Nzc2LDM4NzcwLDM4OTI3LDM4OTI1LDM4OTI2LDM5MDg0LDM5MTU4LDM5MTYxLDM5MzQzLDM5MzQ2LDM5MzQ0LDM5MzQ5LDM5NTk3LDM5NTk1LDM5NzcxLDQwMTcwLDQwMTczLDQwMTY3LDQwNTc2LDQwNzAxLDIwNzEwLDIwNjkyLDIwNjk1LDIwNzEyLDIwNzIzLDIwNjk5LDIwNzE0LDIwNzAxLDIwNzA4LDIwNjkxLDIwNzE2LDIwNzIwLDIwNzE5LDIwNzA3LDIwNzA0LDIwOTUyLDIxMTIwLDIxMTIxLDIxMjI1LDIxMjI3LDIxMjk2LDIxNDIwLDIyMDU1LDIyMDM3LDIyMDI4LDIyMDM0LDIyMDEyLDIyMDMxLDIyMDQ0LDIyMDE3LDIyMDM1LDIyMDE4LDIyMDEwLDIyMDQ1LDIyMDIwLDIyMDE1LDIyMDA5LDIyNjY1LDIyNjUyLDIyNjcyLDIyNjgwLDIyNjYyLDIyNjU3LDIyNjU1LDIyNjQ0LDIyNjY3LDIyNjUwLDIyNjYzLDIyNjczLDIyNjcwLDIyNjQ2LDIyNjU4LDIyNjY0LDIyNjUxLDIyNjc2LDIyNjcxLDIyNzgyLDIyODkxLDIzMjYwLDIzMjc4LDIzMjY5LDIzMjUzLDIzMjc0LDIzMjU4LDIzMjc3LDIzMjc1LDIzMjgzLDIzMjY2LDIzMjY0LDIzMjU5LDIzMjc2LDIzMjYyLDIzMjYxLDIzMjU3LDIzMjcyLDIzMjYzLDIzNDE1LDIzNTIwLDIzNTIzLDIzNjUxLDIzOTM4LDIzOTM2LDIzOTMzLDIzOTQyLDIzOTMwLDIzOTM3LDIzOTI3LDIzOTQ2LDIzOTQ1LDIzOTQ0LDIzOTM0LDIzOTMyLDIzOTQ5LDIzOTI5LDIzOTM1LDI0MTUyLDI0MTUzLDI0MTQ3LDI0MjgwLDI0MjczLDI0Mjc5LDI0MjcwLDI0Mjg0LDI0Mjc3LDI0MjgxLDI0Mjc0LDI0Mjc2LDI0Mzg4LDI0Mzg3LDI0NDMxLDI0NTAyLDI0ODc2LDI0ODcyLDI0ODk3LDI0OTI2LDI0OTQ1LDI0OTQ3LDI0OTE0LDI0OTE1LDI0OTQ2LDI0OTQwLDI0OTYwLDI0OTQ4LDI0OTE2LDI0OTU0LDI0OTIzLDI0OTMzLDI0ODkxLDI0OTM4LDI0OTI5LDI0OTE4LDI1MTI5LDI1MTI3LDI1MTMxLDI1NjQzLDI1Njc3LDI1NjkxLDI1NjkzLDI1NzE2LDI1NzE4LDI1NzE0LDI1NzE1LDI1NzI1LDI1NzE3LDI1NzAyLDI1NzY2LDI1Njc4LDI1NzMwLDI1Njk0LDI1NjkyLDI1Njc1LDI1NjgzLDI1Njk2LDI1NjgwLDI1NzI3LDI1NjYzLDI1NzA4LDI1NzA3LDI1Njg5LDI1NzAxLDI1NzE5LDI1OTcxLDI2MDE2LDI2MjczLDI2MjcyLDI2MjcxLDI2MzczLDI2MzcyLDI2NDAyLDI3MDU3LDI3MDYyLDI3MDgxLDI3MDQwLDI3MDg2LDI3MDMwLDI3MDU2LDI3MDUyLDI3MDY4LDI3MDI1LDI3MDMzLDI3MDIyLDI3MDQ3LDI3MDIxLDI3MDQ5LDI3MDcwLDI3MDU1LDI3MDcxLDI3MDc2LDI3MDY5LDI3MDQ0LDI3MDkyLDI3MDY1LDI3MDgyLDI3MDM0LDI3MDg3LDI3MDU5LDI3MDI3LDI3MDUwLDI3MDQxLDI3MDM4LDI3MDk3LDI3MDMxLDI3MDI0LDI3MDc0LDI3MDYxLDI3MDQ1LDI3MDc4LDI3NDY2LDI3NDY5LDI3NDY3LDI3NTUwLDI3NTUxLDI3NTUyLDI3NTg3LDI3NTg4LDI3NjQ2LDI4MzY2LDI4NDA1LDI4NDAxLDI4NDE5LDI4NDUzLDI4NDA4LDI4NDcxLDI4NDExLDI4NDYyLDI4NDI1LDI4NDk0LDI4NDQxLDI4NDQyLDI4NDU1LDI4NDQwLDI4NDc1LDI4NDM0LDI4Mzk3LDI4NDI2LDI4NDcwLDI4NTMxLDI4NDA5LDI4Mzk4LDI4NDYxLDI4NDgwLDI4NDY0LDI4NDc2LDI4NDY5LDI4Mzk1LDI4NDIzLDI4NDMwLDI4NDgzLDI4NDIxLDI4NDEzLDI4NDA2LDI4NDczLDI4NDQ0LDI4NDEyLDI4NDc0LDI4NDQ3LDI4NDI5LDI4NDQ2LDI4NDI0LDI4NDQ5LDI5MDYzLDI5MDcyLDI5MDY1LDI5MDU2LDI5MDYxLDI5MDU4LDI5MDcxLDI5MDUxLDI5MDYyLDI5MDU3LDI5MDc5LDI5MjUyLDI5MjY3LDI5MzM1LDI5MzMzLDI5MzMxLDI5NTA3LDI5NTE3LDI5NTIxLDI5NTE2LDI5Nzk0LDI5ODExLDI5ODA5LDI5ODEzLDI5ODEwLDI5Nzk5LDI5ODA2LDI5OTUyLDI5OTU0LDI5OTU1LDMwMDc3LDMwMDk2LDMwMjMwLDMwMjE2LDMwMjIwLDMwMjI5LDMwMjI1LDMwMjE4LDMwMjI4LDMwMzkyLDMwNTkzLDMwNTg4LDMwNTk3LDMwNTk0LDMwNTc0LDMwNTkyLDMwNTc1LDMwNTkwLDMwNTk1LDMwODk4LDMwODkwLDMwOTAwLDMwODkzLDMwODg4LDMwODQ2LDMwODkxLDMwODc4LDMwODg1LDMwODgwLDMwODkyLDMwODgyLDMwODg0LDMxMTI4LDMxMTE0LDMxMTE1LDMxMTI2LDMxMTI1LDMxMTI0LDMxMTIzLDMxMTI3LDMxMTEyLDMxMTIyLDMxMTIwLDMxMjc1LDMxMzA2LDMxMjgwLDMxMjc5LDMxMjcyLDMxMjcwLDMxNDAwLDMxNDAzLDMxNDA0LDMxNDcwLDMxNjI0LDMxNjQ0LDMxNjI2LDMxNjMzLDMxNjMyLDMxNjM4LDMxNjI5LDMxNjI4LDMxNjQzLDMxNjMwLDMxNjIxLDMxNjQwLDIxMTI0LDMxNjQxLDMxNjUyLDMxNjE4LDMxOTMxLDMxOTM1LDMxOTMyLDMxOTMwLDMyMTY3LDMyMTgzLDMyMTk0LDMyMTYzLDMyMTcwLDMyMTkzLDMyMTkyLDMyMTk3LDMyMTU3LDMyMjA2LDMyMTk2LDMyMTk4LDMyMjAzLDMyMjA0LDMyMTc1LDMyMTg1LDMyMTUwLDMyMTg4LDMyMTU5LDMyMTY2LDMyMTc0LDMyMTY5LDMyMTYxLDMyMjAxLDMyNjI3LDMyNzM4LDMyNzM5LDMyNzQxLDMyNzM0LDMyODA0LDMyODYxLDMyODYwLDMzMTYxLDMzMTU4LDMzMTU1LDMzMTU5LDMzMTY1LDMzMTY0LDMzMTYzLDMzMzAxLDMzOTQzLDMzOTU2LDMzOTUzLDMzOTUxLDMzOTc4LDMzOTk4LDMzOTg2LDMzOTY0LDMzOTY2LDMzOTYzLDMzOTc3LDMzOTcyLDMzOTg1LDMzOTk3LDMzOTYyLDMzOTQ2LDMzOTY5LDM0MDAwLDMzOTQ5LDMzOTU5LDMzOTc5LDMzOTU0LDMzOTQwLDMzOTkxLDMzOTk2LDMzOTQ3LDMzOTYxLDMzOTY3LDMzOTYwLDM0MDA2LDMzOTQ0LDMzOTc0LDMzOTk5LDMzOTUyLDM0MDA3LDM0MDA0LDM0MDAyLDM0MDExLDMzOTY4LDMzOTM3LDM0NDAxLDM0NjExLDM0NTk1LDM0NjAwLDM0NjY3LDM0NjI0LDM0NjA2LDM0NTkwLDM0NTkzLDM0NTg1LDM0NTg3LDM0NjI3LDM0NjA0LDM0NjI1LDM0NjIyLDM0NjMwLDM0NTkyLDM0NjEwLDM0NjAyLDM0NjA1LDM0NjIwLDM0NTc4LDM0NjE4LDM0NjA5LDM0NjEzLDM0NjI2LDM0NTk4LDM0NTk5LDM0NjE2LDM0NTk2LDM0NTg2LDM0NjA4LDM0NTc3LDM1MDYzLDM1MDQ3LDM1MDU3LDM1MDU4LDM1MDY2LDM1MDcwLDM1MDU0LDM1MDY4LDM1MDYyLDM1MDY3LDM1MDU2LDM1MDUyLDM1MDUxLDM1MjI5LDM1MjMzLDM1MjMxLDM1MjMwLDM1MzA1LDM1MzA3LDM1MzA0LDM1NDk5LDM1NDgxLDM1NDY3LDM1NDc0LDM1NDcxLDM1NDc4LDM1OTAxLDM1OTQ0LDM1OTQ1LDM2MDUzLDM2MDQ3LDM2MDU1LDM2MjQ2LDM2MzYxLDM2MzU0LDM2MzUxLDM2MzY1LDM2MzQ5LDM2MzYyLDM2MzU1LDM2MzU5LDM2MzU4LDM2MzU3LDM2MzUwLDM2MzUyLDM2MzU2LDM2NjI0LDM2NjI1LDM2NjIyLDM2NjIxLDM3MTU1LDM3MTQ4LDM3MTUyLDM3MTU0LDM3MTUxLDM3MTQ5LDM3MTQ2LDM3MTU2LDM3MTUzLDM3MTQ3LDM3MjQyLDM3MjM0LDM3MjQxLDM3MjM1LDM3NTQxLDM3NTQwLDM3NDk0LDM3NTMxLDM3NDk4LDM3NTM2LDM3NTI0LDM3NTQ2LDM3NTE3LDM3NTQyLDM3NTMwLDM3NTQ3LDM3NDk3LDM3NTI3LDM3NTAzLDM3NTM5LDM3NjE0LDM3NTE4LDM3NTA2LDM3NTI1LDM3NTM4LDM3NTAxLDM3NTEyLDM3NTM3LDM3NTE0LDM3NTEwLDM3NTE2LDM3NTI5LDM3NTQzLDM3NTAyLDM3NTExLDM3NTQ1LDM3NTMzLDM3NTE1LDM3NDIxLDM4NTU4LDM4NTYxLDM4NjU1LDM4NzQ0LDM4NzgxLDM4Nzc4LDM4NzgyLDM4Nzg3LDM4Nzg0LDM4Nzg2LDM4Nzc5LDM4Nzg4LDM4Nzg1LDM4NzgzLDM4ODYyLDM4ODYxLDM4OTM0LDM5MDg1LDM5MDg2LDM5MTcwLDM5MTY4LDM5MTc1LDM5MzI1LDM5MzI0LDM5MzYzLDM5MzUzLDM5MzU1LDM5MzU0LDM5MzYyLDM5MzU3LDM5MzY3LDM5NjAxLDM5NjUxLDM5NjU1LDM5NzQyLDM5NzQzLDM5Nzc2LDM5Nzc3LDM5Nzc1LDQwMTc3LDQwMTc4LDQwMTgxLDQwNjE1LDIwNzM1LDIwNzM5LDIwNzg0LDIwNzI4LDIwNzQyLDIwNzQzLDIwNzI2LDIwNzM0LDIwNzQ3LDIwNzQ4LDIwNzMzLDIwNzQ2LDIxMTMxLDIxMTMyLDIxMjMzLDIxMjMxLDIyMDg4LDIyMDgyLDIyMDkyLDIyMDY5LDIyMDgxLDIyMDkwLDIyMDg5LDIyMDg2LDIyMTA0LDIyMTA2LDIyMDgwLDIyMDY3LDIyMDc3LDIyMDYwLDIyMDc4LDIyMDcyLDIyMDU4LDIyMDc0LDIyMjk4LDIyNjk5LDIyNjg1LDIyNzA1LDIyNjg4LDIyNjkxLDIyNzAzLDIyNzAwLDIyNjkzLDIyNjg5LDIyNzgzLDIzMjk1LDIzMjg0LDIzMjkzLDIzMjg3LDIzMjg2LDIzMjk5LDIzMjg4LDIzMjk4LDIzMjg5LDIzMjk3LDIzMzAzLDIzMzAxLDIzMzExLDIzNjU1LDIzOTYxLDIzOTU5LDIzOTY3LDIzOTU0LDIzOTcwLDIzOTU1LDIzOTU3LDIzOTY4LDIzOTY0LDIzOTY5LDIzOTYyLDIzOTY2LDI0MTY5LDI0MTU3LDI0MTYwLDI0MTU2LDMyMjQzLDI0MjgzLDI0Mjg2LDI0Mjg5LDI0MzkzLDI0NDk4LDI0OTcxLDI0OTYzLDI0OTUzLDI1MDA5LDI1MDA4LDI0OTk0LDI0OTY5LDI0OTg3LDI0OTc5LDI1MDA3LDI1MDA1LDI0OTkxLDI0OTc4LDI1MDAyLDI0OTkzLDI0OTczLDI0OTM0LDI1MDExLDI1MTMzLDI1NzEwLDI1NzEyLDI1NzUwLDI1NzYwLDI1NzMzLDI1NzUxLDI1NzU2LDI1NzQzLDI1NzM5LDI1NzM4LDI1NzQwLDI1NzYzLDI1NzU5LDI1NzA0LDI1Nzc3LDI1NzUyLDI1OTc0LDI1OTc4LDI1OTc3LDI1OTc5LDI2MDM0LDI2MDM1LDI2MjkzLDI2Mjg4LDI2MjgxLDI2MjkwLDI2Mjk1LDI2MjgyLDI2Mjg3LDI3MTM2LDI3MTQyLDI3MTU5LDI3MTA5LDI3MTI4LDI3MTU3LDI3MTIxLDI3MTA4LDI3MTY4LDI3MTM1LDI3MTE2LDI3MTA2LDI3MTYzLDI3MTY1LDI3MTM0LDI3MTc1LDI3MTIyLDI3MTE4LDI3MTU2LDI3MTI3LDI3MTExLDI3MjAwLDI3MTQ0LDI3MTEwLDI3MTMxLDI3MTQ5LDI3MTMyLDI3MTE1LDI3MTQ1LDI3MTQwLDI3MTYwLDI3MTczLDI3MTUxLDI3MTI2LDI3MTc0LDI3MTQzLDI3MTI0LDI3MTU4LDI3NDczLDI3NTU3LDI3NTU1LDI3NTU0LDI3NTU4LDI3NjQ5LDI3NjQ4LDI3NjQ3LDI3NjUwLDI4NDgxLDI4NDU0LDI4NTQyLDI4NTUxLDI4NjE0LDI4NTYyLDI4NTU3LDI4NTUzLDI4NTU2LDI4NTE0LDI4NDk1LDI4NTQ5LDI4NTA2LDI4NTY2LDI4NTM0LDI4NTI0LDI4NTQ2LDI4NTAxLDI4NTMwLDI4NDk4LDI4NDk2LDI4NTAzLDI4NTY0LDI4NTYzLDI4NTA5LDI4NDE2LDI4NTEzLDI4NTIzLDI4NTQxLDI4NTE5LDI4NTYwLDI4NDk5LDI4NTU1LDI4NTIxLDI4NTQzLDI4NTY1LDI4NTE1LDI4NTM1LDI4NTIyLDI4NTM5LDI5MTA2LDI5MTAzLDI5MDgzLDI5MTA0LDI5MDg4LDI5MDgyLDI5MDk3LDI5MTA5LDI5MDg1LDI5MDkzLDI5MDg2LDI5MDkyLDI5MDg5LDI5MDk4LDI5MDg0LDI5MDk1LDI5MTA3LDI5MzM2LDI5MzM4LDI5NTI4LDI5NTIyLDI5NTM0LDI5NTM1LDI5NTM2LDI5NTMzLDI5NTMxLDI5NTM3LDI5NTMwLDI5NTI5LDI5NTM4LDI5ODMxLDI5ODMzLDI5ODM0LDI5ODMwLDI5ODI1LDI5ODIxLDI5ODI5LDI5ODMyLDI5ODIwLDI5ODE3LDI5OTYwLDI5OTU5LDMwMDc4LDMwMjQ1LDMwMjM4LDMwMjMzLDMwMjM3LDMwMjM2LDMwMjQzLDMwMjM0LDMwMjQ4LDMwMjM1LDMwMzY0LDMwMzY1LDMwMzY2LDMwMzYzLDMwNjA1LDMwNjA3LDMwNjAxLDMwNjAwLDMwOTI1LDMwOTA3LDMwOTI3LDMwOTI0LDMwOTI5LDMwOTI2LDMwOTMyLDMwOTIwLDMwOTE1LDMwOTE2LDMwOTIxLDMxMTMwLDMxMTM3LDMxMTM2LDMxMTMyLDMxMTM4LDMxMTMxLDI3NTEwLDMxMjg5LDMxNDEwLDMxNDEyLDMxNDExLDMxNjcxLDMxNjkxLDMxNjc4LDMxNjYwLDMxNjk0LDMxNjYzLDMxNjczLDMxNjkwLDMxNjY5LDMxOTQxLDMxOTQ0LDMxOTQ4LDMxOTQ3LDMyMjQ3LDMyMjE5LDMyMjM0LDMyMjMxLDMyMjE1LDMyMjI1LDMyMjU5LDMyMjUwLDMyMjMwLDMyMjQ2LDMyMjQxLDMyMjQwLDMyMjM4LDMyMjIzLDMyNjMwLDMyNjg0LDMyNjg4LDMyNjg1LDMyNzQ5LDMyNzQ3LDMyNzQ2LDMyNzQ4LDMyNzQyLDMyNzQ0LDMyODY4LDMyODcxLDMzMTg3LDMzMTgzLDMzMTgyLDMzMTczLDMzMTg2LDMzMTc3LDMzMTc1LDMzMzAyLDMzMzU5LDMzMzYzLDMzMzYyLDMzMzYwLDMzMzU4LDMzMzYxLDM0MDg0LDM0MTA3LDM0MDYzLDM0MDQ4LDM0MDg5LDM0MDYyLDM0MDU3LDM0MDYxLDM0MDc5LDM0MDU4LDM0MDg3LDM0MDc2LDM0MDQzLDM0MDkxLDM0MDQyLDM0MDU2LDM0MDYwLDM0MDM2LDM0MDkwLDM0MDM0LDM0MDY5LDM0MDM5LDM0MDI3LDM0MDM1LDM0MDQ0LDM0MDY2LDM0MDI2LDM0MDI1LDM0MDcwLDM0MDQ2LDM0MDg4LDM0MDc3LDM0MDk0LDM0MDUwLDM0MDQ1LDM0MDc4LDM0MDM4LDM0MDk3LDM0MDg2LDM0MDIzLDM0MDI0LDM0MDMyLDM0MDMxLDM0MDQxLDM0MDcyLDM0MDgwLDM0MDk2LDM0MDU5LDM0MDczLDM0MDk1LDM0NDAyLDM0NjQ2LDM0NjU5LDM0NjYwLDM0Njc5LDM0Nzg1LDM0Njc1LDM0NjQ4LDM0NjQ0LDM0NjUxLDM0NjQyLDM0NjU3LDM0NjUwLDM0NjQxLDM0NjU0LDM0NjY5LDM0NjY2LDM0NjQwLDM0NjM4LDM0NjU1LDM0NjUzLDM0NjcxLDM0NjY4LDM0NjgyLDM0NjcwLDM0NjUyLDM0NjYxLDM0NjM5LDM0NjgzLDM0Njc3LDM0NjU4LDM0NjYzLDM0NjY1LDM0OTA2LDM1MDc3LDM1MDg0LDM1MDkyLDM1MDgzLDM1MDk1LDM1MDk2LDM1MDk3LDM1MDc4LDM1MDk0LDM1MDg5LDM1MDg2LDM1MDgxLDM1MjM0LDM1MjM2LDM1MjM1LDM1MzA5LDM1MzEyLDM1MzA4LDM1NTM1LDM1NTI2LDM1NTEyLDM1NTM5LDM1NTM3LDM1NTQwLDM1NTQxLDM1NTE1LDM1NTQzLDM1NTE4LDM1NTIwLDM1NTI1LDM1NTQ0LDM1NTIzLDM1NTE0LDM1NTE3LDM1NTQ1LDM1OTAyLDM1OTE3LDM1OTgzLDM2MDY5LDM2MDYzLDM2MDU3LDM2MDcyLDM2MDU4LDM2MDYxLDM2MDcxLDM2MjU2LDM2MjUyLDM2MjU3LDM2MjUxLDM2Mzg0LDM2Mzg3LDM2Mzg5LDM2Mzg4LDM2Mzk4LDM2MzczLDM2Mzc5LDM2Mzc0LDM2MzY5LDM2Mzc3LDM2MzkwLDM2MzkxLDM2MzcyLDM2MzcwLDM2Mzc2LDM2MzcxLDM2MzgwLDM2Mzc1LDM2Mzc4LDM2NjUyLDM2NjQ0LDM2NjMyLDM2NjM0LDM2NjQwLDM2NjQzLDM2NjMwLDM2NjMxLDM2OTc5LDM2OTc2LDM2OTc1LDM2OTY3LDM2OTcxLDM3MTY3LDM3MTYzLDM3MTYxLDM3MTYyLDM3MTcwLDM3MTU4LDM3MTY2LDM3MjUzLDM3MjU0LDM3MjU4LDM3MjQ5LDM3MjUwLDM3MjUyLDM3MjQ4LDM3NTg0LDM3NTcxLDM3NTcyLDM3NTY4LDM3NTkzLDM3NTU4LDM3NTgzLDM3NjE3LDM3NTk5LDM3NTkyLDM3NjA5LDM3NTkxLDM3NTk3LDM3NTgwLDM3NjE1LDM3NTcwLDM3NjA4LDM3NTc4LDM3NTc2LDM3NTgyLDM3NjA2LDM3NTgxLDM3NTg5LDM3NTc3LDM3NjAwLDM3NTk4LDM3NjA3LDM3NTg1LDM3NTg3LDM3NTU3LDM3NjAxLDM3NTc0LDM3NTU2LDM4MjY4LDM4MzE2LDM4MzE1LDM4MzE4LDM4MzIwLDM4NTY0LDM4NTYyLDM4NjExLDM4NjYxLDM4NjY0LDM4NjU4LDM4NzQ2LDM4Nzk0LDM4Nzk4LDM4NzkyLDM4ODY0LDM4ODYzLDM4OTQyLDM4OTQxLDM4OTUwLDM4OTUzLDM4OTUyLDM4OTQ0LDM4OTM5LDM4OTUxLDM5MDkwLDM5MTc2LDM5MTYyLDM5MTg1LDM5MTg4LDM5MTkwLDM5MTkxLDM5MTg5LDM5Mzg4LDM5MzczLDM5Mzc1LDM5Mzc5LDM5MzgwLDM5Mzc0LDM5MzY5LDM5MzgyLDM5Mzg0LDM5MzcxLDM5MzgzLDM5MzcyLDM5NjAzLDM5NjYwLDM5NjU5LDM5NjY3LDM5NjY2LDM5NjY1LDM5NzUwLDM5NzQ3LDM5NzgzLDM5Nzk2LDM5NzkzLDM5NzgyLDM5Nzk4LDM5Nzk3LDM5NzkyLDM5Nzg0LDM5NzgwLDM5Nzg4LDQwMTg4LDQwMTg2LDQwMTg5LDQwMTkxLDQwMTgzLDQwMTk5LDQwMTkyLDQwMTg1LDQwMTg3LDQwMjAwLDQwMTk3LDQwMTk2LDQwNTc5LDQwNjU5LDQwNzE5LDQwNzIwLDIwNzY0LDIwNzU1LDIwNzU5LDIwNzYyLDIwNzUzLDIwOTU4LDIxMzAwLDIxNDczLDIyMTI4LDIyMTEyLDIyMTI2LDIyMTMxLDIyMTE4LDIyMTE1LDIyMTI1LDIyMTMwLDIyMTEwLDIyMTM1LDIyMzAwLDIyMjk5LDIyNzI4LDIyNzE3LDIyNzI5LDIyNzE5LDIyNzE0LDIyNzIyLDIyNzE2LDIyNzI2LDIzMzE5LDIzMzIxLDIzMzIzLDIzMzI5LDIzMzE2LDIzMzE1LDIzMzEyLDIzMzE4LDIzMzM2LDIzMzIyLDIzMzI4LDIzMzI2LDIzNTM1LDIzOTgwLDIzOTg1LDIzOTc3LDIzOTc1LDIzOTg5LDIzOTg0LDIzOTgyLDIzOTc4LDIzOTc2LDIzOTg2LDIzOTgxLDIzOTgzLDIzOTg4LDI0MTY3LDI0MTY4LDI0MTY2LDI0MTc1LDI0Mjk3LDI0Mjk1LDI0Mjk0LDI0Mjk2LDI0MjkzLDI0Mzk1LDI0NTA4LDI0OTg5LDI1MDAwLDI0OTgyLDI1MDI5LDI1MDEyLDI1MDMwLDI1MDI1LDI1MDM2LDI1MDE4LDI1MDIzLDI1MDE2LDI0OTcyLDI1ODE1LDI1ODE0LDI1ODA4LDI1ODA3LDI1ODAxLDI1Nzg5LDI1NzM3LDI1Nzk1LDI1ODE5LDI1ODQzLDI1ODE3LDI1OTA3LDI1OTgzLDI1OTgwLDI2MDE4LDI2MzEyLDI2MzAyLDI2MzA0LDI2MzE0LDI2MzE1LDI2MzE5LDI2MzAxLDI2Mjk5LDI2Mjk4LDI2MzE2LDI2NDAzLDI3MTg4LDI3MjM4LDI3MjA5LDI3MjM5LDI3MTg2LDI3MjQwLDI3MTk4LDI3MjI5LDI3MjQ1LDI3MjU0LDI3MjI3LDI3MjE3LDI3MTc2LDI3MjI2LDI3MTk1LDI3MTk5LDI3MjAxLDI3MjQyLDI3MjM2LDI3MjE2LDI3MjE1LDI3MjIwLDI3MjQ3LDI3MjQxLDI3MjMyLDI3MTk2LDI3MjMwLDI3MjIyLDI3MjIxLDI3MjEzLDI3MjE0LDI3MjA2LDI3NDc3LDI3NDc2LDI3NDc4LDI3NTU5LDI3NTYyLDI3NTYzLDI3NTkyLDI3NTkxLDI3NjUyLDI3NjUxLDI3NjU0LDI4NTg5LDI4NjE5LDI4NTc5LDI4NjE1LDI4NjA0LDI4NjIyLDI4NjE2LDI4NTEwLDI4NjEyLDI4NjA1LDI4NTc0LDI4NjE4LDI4NTg0LDI4Njc2LDI4NTgxLDI4NTkwLDI4NjAyLDI4NTg4LDI4NTg2LDI4NjIzLDI4NjA3LDI4NjAwLDI4NTc4LDI4NjE3LDI4NTg3LDI4NjIxLDI4NTkxLDI4NTk0LDI4NTkyLDI5MTI1LDI5MTIyLDI5MTE5LDI5MTEyLDI5MTQyLDI5MTIwLDI5MTIxLDI5MTMxLDI5MTQwLDI5MTMwLDI5MTI3LDI5MTM1LDI5MTE3LDI5MTQ0LDI5MTE2LDI5MTI2LDI5MTQ2LDI5MTQ3LDI5MzQxLDI5MzQyLDI5NTQ1LDI5NTQyLDI5NTQzLDI5NTQ4LDI5NTQxLDI5NTQ3LDI5NTQ2LDI5ODIzLDI5ODUwLDI5ODU2LDI5ODQ0LDI5ODQyLDI5ODQ1LDI5ODU3LDI5OTYzLDMwMDgwLDMwMjU1LDMwMjUzLDMwMjU3LDMwMjY5LDMwMjU5LDMwMjY4LDMwMjYxLDMwMjU4LDMwMjU2LDMwMzk1LDMwNDM4LDMwNjE4LDMwNjIxLDMwNjI1LDMwNjIwLDMwNjE5LDMwNjI2LDMwNjI3LDMwNjEzLDMwNjE3LDMwNjE1LDMwOTQxLDMwOTUzLDMwOTQ5LDMwOTU0LDMwOTQyLDMwOTQ3LDMwOTM5LDMwOTQ1LDMwOTQ2LDMwOTU3LDMwOTQzLDMwOTQ0LDMxMTQwLDMxMzAwLDMxMzA0LDMxMzAzLDMxNDE0LDMxNDE2LDMxNDEzLDMxNDA5LDMxNDE1LDMxNzEwLDMxNzE1LDMxNzE5LDMxNzA5LDMxNzAxLDMxNzE3LDMxNzA2LDMxNzIwLDMxNzM3LDMxNzAwLDMxNzIyLDMxNzE0LDMxNzA4LDMxNzIzLDMxNzA0LDMxNzExLDMxOTU0LDMxOTU2LDMxOTU5LDMxOTUyLDMxOTUzLDMyMjc0LDMyMjg5LDMyMjc5LDMyMjY4LDMyMjg3LDMyMjg4LDMyMjc1LDMyMjcwLDMyMjg0LDMyMjc3LDMyMjgyLDMyMjkwLDMyMjY3LDMyMjcxLDMyMjc4LDMyMjY5LDMyMjc2LDMyMjkzLDMyMjkyLDMyNTc5LDMyNjM1LDMyNjM2LDMyNjM0LDMyNjg5LDMyNzUxLDMyODEwLDMyODA5LDMyODc2LDMzMjAxLDMzMTkwLDMzMTk4LDMzMjA5LDMzMjA1LDMzMTk1LDMzMjAwLDMzMTk2LDMzMjA0LDMzMjAyLDMzMjA3LDMzMTkxLDMzMjY2LDMzMzY1LDMzMzY2LDMzMzY3LDM0MTM0LDM0MTE3LDM0MTU1LDM0MTI1LDM0MTMxLDM0MTQ1LDM0MTM2LDM0MTEyLDM0MTE4LDM0MTQ4LDM0MTEzLDM0MTQ2LDM0MTE2LDM0MTI5LDM0MTE5LDM0MTQ3LDM0MTEwLDM0MTM5LDM0MTYxLDM0MTI2LDM0MTU4LDM0MTY1LDM0MTMzLDM0MTUxLDM0MTQ0LDM0MTg4LDM0MTUwLDM0MTQxLDM0MTMyLDM0MTQ5LDM0MTU2LDM0NDAzLDM0NDA1LDM0NDA0LDM0NzE1LDM0NzAzLDM0NzExLDM0NzA3LDM0NzA2LDM0Njk2LDM0Njg5LDM0NzEwLDM0NzEyLDM0NjgxLDM0Njk1LDM0NzIzLDM0NjkzLDM0NzA0LDM0NzA1LDM0NzE3LDM0NjkyLDM0NzA4LDM0NzE2LDM0NzE0LDM0Njk3LDM1MTAyLDM1MTEwLDM1MTIwLDM1MTE3LDM1MTE4LDM1MTExLDM1MTIxLDM1MTA2LDM1MTEzLDM1MTA3LDM1MTE5LDM1MTE2LDM1MTAzLDM1MzEzLDM1NTUyLDM1NTU0LDM1NTcwLDM1NTcyLDM1NTczLDM1NTQ5LDM1NjA0LDM1NTU2LDM1NTUxLDM1NTY4LDM1NTI4LDM1NTUwLDM1NTUzLDM1NTYwLDM1NTgzLDM1NTY3LDM1NTc5LDM1OTg1LDM1OTg2LDM1OTg0LDM2MDg1LDM2MDc4LDM2MDgxLDM2MDgwLDM2MDgzLDM2MjA0LDM2MjA2LDM2MjYxLDM2MjYzLDM2NDAzLDM2NDE0LDM2NDA4LDM2NDE2LDM2NDIxLDM2NDA2LDM2NDEyLDM2NDEzLDM2NDE3LDM2NDAwLDM2NDE1LDM2NTQxLDM2NjYyLDM2NjU0LDM2NjYxLDM2NjU4LDM2NjY1LDM2NjYzLDM2NjYwLDM2OTgyLDM2OTg1LDM2OTg3LDM2OTk4LDM3MTE0LDM3MTcxLDM3MTczLDM3MTc0LDM3MjY3LDM3MjY0LDM3MjY1LDM3MjYxLDM3MjYzLDM3NjcxLDM3NjYyLDM3NjQwLDM3NjYzLDM3NjM4LDM3NjQ3LDM3NzU0LDM3Njg4LDM3NjkyLDM3NjU5LDM3NjY3LDM3NjUwLDM3NjMzLDM3NzAyLDM3Njc3LDM3NjQ2LDM3NjQ1LDM3NTc5LDM3NjYxLDM3NjI2LDM3NjY5LDM3NjUxLDM3NjI1LDM3NjIzLDM3Njg0LDM3NjM0LDM3NjY4LDM3NjMxLDM3NjczLDM3Njg5LDM3Njg1LDM3Njc0LDM3NjUyLDM3NjQ0LDM3NjQzLDM3NjMwLDM3NjQxLDM3NjMyLDM3NjI3LDM3NjU0LDM4MzMyLDM4MzQ5LDM4MzM0LDM4MzI5LDM4MzMwLDM4MzI2LDM4MzM1LDM4MzI1LDM4MzMzLDM4NTY5LDM4NjEyLDM4NjY3LDM4Njc0LDM4NjcyLDM4ODA5LDM4ODA3LDM4ODA0LDM4ODk2LDM4OTA0LDM4OTY1LDM4OTU5LDM4OTYyLDM5MjA0LDM5MTk5LDM5MjA3LDM5MjA5LDM5MzI2LDM5NDA2LDM5NDA0LDM5Mzk3LDM5Mzk2LDM5NDA4LDM5Mzk1LDM5NDAyLDM5NDAxLDM5Mzk5LDM5NjA5LDM5NjE1LDM5NjA0LDM5NjExLDM5NjcwLDM5Njc0LDM5NjczLDM5NjcxLDM5NzMxLDM5ODA4LDM5ODEzLDM5ODE1LDM5ODA0LDM5ODA2LDM5ODAzLDM5ODEwLDM5ODI3LDM5ODI2LDM5ODI0LDM5ODAyLDM5ODI5LDM5ODA1LDM5ODE2LDQwMjI5LDQwMjE1LDQwMjI0LDQwMjIyLDQwMjEyLDQwMjMzLDQwMjIxLDQwMjE2LDQwMjI2LDQwMjA4LDQwMjE3LDQwMjIzLDQwNTg0LDQwNTgyLDQwNTgzLDQwNjIyLDQwNjIxLDQwNjYxLDQwNjYyLDQwNjk4LDQwNzIyLDQwNzY1LDIwNzc0LDIwNzczLDIwNzcwLDIwNzcyLDIwNzY4LDIwNzc3LDIxMjM2LDIyMTYzLDIyMTU2LDIyMTU3LDIyMTUwLDIyMTQ4LDIyMTQ3LDIyMTQyLDIyMTQ2LDIyMTQzLDIyMTQ1LDIyNzQyLDIyNzQwLDIyNzM1LDIyNzM4LDIzMzQxLDIzMzMzLDIzMzQ2LDIzMzMxLDIzMzQwLDIzMzM1LDIzMzM0LDIzMzQzLDIzMzQyLDIzNDE5LDIzNTM3LDIzNTM4LDIzOTkxLDI0MTcyLDI0MTcwLDI0NTEwLDI0NTA3LDI1MDI3LDI1MDEzLDI1MDIwLDI1MDYzLDI1MDU2LDI1MDYxLDI1MDYwLDI1MDY0LDI1MDU0LDI1ODM5LDI1ODMzLDI1ODI3LDI1ODM1LDI1ODI4LDI1ODMyLDI1OTg1LDI1OTg0LDI2MDM4LDI2MDc0LDI2MzIyLDI3Mjc3LDI3Mjg2LDI3MjY1LDI3MzAxLDI3MjczLDI3Mjk1LDI3MjkxLDI3Mjk3LDI3Mjk0LDI3MjcxLDI3MjgzLDI3Mjc4LDI3Mjg1LDI3MjY3LDI3MzA0LDI3MzAwLDI3MjgxLDI3MjYzLDI3MzAyLDI3MjkwLDI3MjY5LDI3Mjc2LDI3MjgyLDI3NDgzLDI3NTY1LDI3NjU3LDI4NjIwLDI4NTg1LDI4NjYwLDI4NjI4LDI4NjQzLDI4NjM2LDI4NjUzLDI4NjQ3LDI4NjQ2LDI4NjM4LDI4NjU4LDI4NjM3LDI4NjQyLDI4NjQ4LDI5MTUzLDI5MTY5LDI5MTYwLDI5MTcwLDI5MTU2LDI5MTY4LDI5MTU0LDI5NTU1LDI5NTUwLDI5NTUxLDI5ODQ3LDI5ODc0LDI5ODY3LDI5ODQwLDI5ODY2LDI5ODY5LDI5ODczLDI5ODYxLDI5ODcxLDI5OTY4LDI5OTY5LDI5OTcwLDI5OTY3LDMwMDg0LDMwMjc1LDMwMjgwLDMwMjgxLDMwMjc5LDMwMzcyLDMwNDQxLDMwNjQ1LDMwNjM1LDMwNjQyLDMwNjQ3LDMwNjQ2LDMwNjQ0LDMwNjQxLDMwNjMyLDMwNzA0LDMwOTYzLDMwOTczLDMwOTc4LDMwOTcxLDMwOTcyLDMwOTYyLDMwOTgxLDMwOTY5LDMwOTc0LDMwOTgwLDMxMTQ3LDMxMTQ0LDMxMzI0LDMxMzIzLDMxMzE4LDMxMzIwLDMxMzE2LDMxMzIyLDMxNDIyLDMxNDI0LDMxNDI1LDMxNzQ5LDMxNzU5LDMxNzMwLDMxNzQ0LDMxNzQzLDMxNzM5LDMxNzU4LDMxNzMyLDMxNzU1LDMxNzMxLDMxNzQ2LDMxNzUzLDMxNzQ3LDMxNzQ1LDMxNzM2LDMxNzQxLDMxNzUwLDMxNzI4LDMxNzI5LDMxNzYwLDMxNzU0LDMxOTc2LDMyMzAxLDMyMzE2LDMyMzIyLDMyMzA3LDM4OTg0LDMyMzEyLDMyMjk4LDMyMzI5LDMyMzIwLDMyMzI3LDMyMjk3LDMyMzMyLDMyMzA0LDMyMzE1LDMyMzEwLDMyMzI0LDMyMzE0LDMyNTgxLDMyNjM5LDMyNjM4LDMyNjM3LDMyNzU2LDMyNzU0LDMyODEyLDMzMjExLDMzMjIwLDMzMjI4LDMzMjI2LDMzMjIxLDMzMjIzLDMzMjEyLDMzMjU3LDMzMzcxLDMzMzcwLDMzMzcyLDM0MTc5LDM0MTc2LDM0MTkxLDM0MjE1LDM0MTk3LDM0MjA4LDM0MTg3LDM0MjExLDM0MTcxLDM0MjEyLDM0MjAyLDM0MjA2LDM0MTY3LDM0MTcyLDM0MTg1LDM0MjA5LDM0MTcwLDM0MTY4LDM0MTM1LDM0MTkwLDM0MTk4LDM0MTgyLDM0MTg5LDM0MjAxLDM0MjA1LDM0MTc3LDM0MjEwLDM0MTc4LDM0MTg0LDM0MTgxLDM0MTY5LDM0MTY2LDM0MjAwLDM0MTkyLDM0MjA3LDM0NDA4LDM0NzUwLDM0NzMwLDM0NzMzLDM0NzU3LDM0NzM2LDM0NzMyLDM0NzQ1LDM0NzQxLDM0NzQ4LDM0NzM0LDM0NzYxLDM0NzU1LDM0NzU0LDM0NzY0LDM0NzQzLDM0NzM1LDM0NzU2LDM0NzYyLDM0NzQwLDM0NzQyLDM0NzUxLDM0NzQ0LDM0NzQ5LDM0NzgyLDM0NzM4LDM1MTI1LDM1MTIzLDM1MTMyLDM1MTM0LDM1MTM3LDM1MTU0LDM1MTI3LDM1MTM4LDM1MjQ1LDM1MjQ3LDM1MjQ2LDM1MzE0LDM1MzE1LDM1NjE0LDM1NjA4LDM1NjA2LDM1NjAxLDM1NTg5LDM1NTk1LDM1NjE4LDM1NTk5LDM1NjAyLDM1NjA1LDM1NTkxLDM1NTk3LDM1NTkyLDM1NTkwLDM1NjEyLDM1NjAzLDM1NjEwLDM1OTE5LDM1OTUyLDM1OTU0LDM1OTUzLDM1OTUxLDM1OTg5LDM1OTg4LDM2MDg5LDM2MjA3LDM2NDMwLDM2NDI5LDM2NDM1LDM2NDMyLDM2NDI4LDM2NDIzLDM2Njc1LDM2NjcyLDM2OTk3LDM2OTkwLDM3MTc2LDM3Mjc0LDM3MjgyLDM3Mjc1LDM3MjczLDM3Mjc5LDM3MjgxLDM3Mjc3LDM3MjgwLDM3NzkzLDM3NzYzLDM3ODA3LDM3NzMyLDM3NzE4LDM3NzAzLDM3NzU2LDM3NzIwLDM3NzI0LDM3NzUwLDM3NzA1LDM3NzEyLDM3NzEzLDM3NzI4LDM3NzQxLDM3Nzc1LDM3NzA4LDM3NzM4LDM3NzUzLDM3NzE5LDM3NzE3LDM3NzE0LDM3NzExLDM3NzQ1LDM3NzUxLDM3NzU1LDM3NzI5LDM3NzI2LDM3NzMxLDM3NzM1LDM3NzYwLDM3NzEwLDM3NzIxLDM4MzQzLDM4MzM2LDM4MzQ1LDM4MzM5LDM4MzQxLDM4MzI3LDM4NTc0LDM4NTc2LDM4NTcyLDM4Njg4LDM4Njg3LDM4NjgwLDM4Njg1LDM4NjgxLDM4ODEwLDM4ODE3LDM4ODEyLDM4ODE0LDM4ODEzLDM4ODY5LDM4ODY4LDM4ODk3LDM4OTc3LDM4OTgwLDM4OTg2LDM4OTg1LDM4OTgxLDM4OTc5LDM5MjA1LDM5MjExLDM5MjEyLDM5MjEwLDM5MjE5LDM5MjE4LDM5MjE1LDM5MjEzLDM5MjE3LDM5MjE2LDM5MzIwLDM5MzMxLDM5MzI5LDM5NDI2LDM5NDE4LDM5NDEyLDM5NDE1LDM5NDE3LDM5NDE2LDM5NDE0LDM5NDE5LDM5NDIxLDM5NDIyLDM5NDIwLDM5NDI3LDM5NjE0LDM5Njc4LDM5Njc3LDM5NjgxLDM5Njc2LDM5NzUyLDM5ODM0LDM5ODQ4LDM5ODM4LDM5ODM1LDM5ODQ2LDM5ODQxLDM5ODQ1LDM5ODQ0LDM5ODE0LDM5ODQyLDM5ODQwLDM5ODU1LDQwMjQzLDQwMjU3LDQwMjk1LDQwMjQ2LDQwMjM4LDQwMjM5LDQwMjQxLDQwMjQ4LDQwMjQwLDQwMjYxLDQwMjU4LDQwMjU5LDQwMjU0LDQwMjQ3LDQwMjU2LDQwMjUzLDMyNzU3LDQwMjM3LDQwNTg2LDQwNTg1LDQwNTg5LDQwNjI0LDQwNjQ4LDQwNjY2LDQwNjk5LDQwNzAzLDQwNzQwLDQwNzM5LDQwNzM4LDQwNzg4LDQwODY0LDIwNzg1LDIwNzgxLDIwNzgyLDIyMTY4LDIyMTcyLDIyMTY3LDIyMTcwLDIyMTczLDIyMTY5LDIyODk2LDIzMzU2LDIzNjU3LDIzNjU4LDI0MDAwLDI0MTczLDI0MTc0LDI1MDQ4LDI1MDU1LDI1MDY5LDI1MDcwLDI1MDczLDI1MDY2LDI1MDcyLDI1MDY3LDI1MDQ2LDI1MDY1LDI1ODU1LDI1ODYwLDI1ODUzLDI1ODQ4LDI1ODU3LDI1ODU5LDI1ODUyLDI2MDA0LDI2MDc1LDI2MzMwLDI2MzMxLDI2MzI4LDI3MzMzLDI3MzIxLDI3MzI1LDI3MzYxLDI3MzM0LDI3MzIyLDI3MzE4LDI3MzE5LDI3MzM1LDI3MzE2LDI3MzA5LDI3NDg2LDI3NTkzLDI3NjU5LDI4Njc5LDI4Njg0LDI4Njg1LDI4NjczLDI4Njc3LDI4NjkyLDI4Njg2LDI4NjcxLDI4NjcyLDI4NjY3LDI4NzEwLDI4NjY4LDI4NjYzLDI4NjgyLDI5MTg1LDI5MTgzLDI5MTc3LDI5MTg3LDI5MTgxLDI5NTU4LDI5ODgwLDI5ODg4LDI5ODc3LDI5ODg5LDI5ODg2LDI5ODc4LDI5ODgzLDI5ODkwLDI5OTcyLDI5OTcxLDMwMzAwLDMwMzA4LDMwMjk3LDMwMjg4LDMwMjkxLDMwMjk1LDMwMjk4LDMwMzc0LDMwMzk3LDMwNDQ0LDMwNjU4LDMwNjUwLDMwOTc1LDMwOTg4LDMwOTk1LDMwOTk2LDMwOTg1LDMwOTkyLDMwOTk0LDMwOTkzLDMxMTQ5LDMxMTQ4LDMxMzI3LDMxNzcyLDMxNzg1LDMxNzY5LDMxNzc2LDMxNzc1LDMxNzg5LDMxNzczLDMxNzgyLDMxNzg0LDMxNzc4LDMxNzgxLDMxNzkyLDMyMzQ4LDMyMzM2LDMyMzQyLDMyMzU1LDMyMzQ0LDMyMzU0LDMyMzUxLDMyMzM3LDMyMzUyLDMyMzQzLDMyMzM5LDMyNjkzLDMyNjkxLDMyNzU5LDMyNzYwLDMyODg1LDMzMjMzLDMzMjM0LDMzMjMyLDMzMzc1LDMzMzc0LDM0MjI4LDM0MjQ2LDM0MjQwLDM0MjQzLDM0MjQyLDM0MjI3LDM0MjI5LDM0MjM3LDM0MjQ3LDM0MjQ0LDM0MjM5LDM0MjUxLDM0MjU0LDM0MjQ4LDM0MjQ1LDM0MjI1LDM0MjMwLDM0MjU4LDM0MzQwLDM0MjMyLDM0MjMxLDM0MjM4LDM0NDA5LDM0NzkxLDM0NzkwLDM0Nzg2LDM0Nzc5LDM0Nzk1LDM0Nzk0LDM0Nzg5LDM0NzgzLDM0ODAzLDM0Nzg4LDM0NzcyLDM0NzgwLDM0NzcxLDM0Nzk3LDM0Nzc2LDM0Nzg3LDM0NzI0LDM0Nzc1LDM0Nzc3LDM0ODE3LDM0ODA0LDM0NzkyLDM0NzgxLDM1MTU1LDM1MTQ3LDM1MTUxLDM1MTQ4LDM1MTQyLDM1MTUyLDM1MTUzLDM1MTQ1LDM1NjI2LDM1NjIzLDM1NjE5LDM1NjM1LDM1NjMyLDM1NjM3LDM1NjU1LDM1NjMxLDM1NjQ0LDM1NjQ2LDM1NjMzLDM1NjIxLDM1NjM5LDM1NjIyLDM1NjM4LDM1NjMwLDM1NjIwLDM1NjQzLDM1NjQ1LDM1NjQyLDM1OTA2LDM1OTU3LDM1OTkzLDM1OTkyLDM1OTkxLDM2MDk0LDM2MTAwLDM2MDk4LDM2MDk2LDM2NDQ0LDM2NDUwLDM2NDQ4LDM2NDM5LDM2NDM4LDM2NDQ2LDM2NDUzLDM2NDU1LDM2NDQzLDM2NDQyLDM2NDQ5LDM2NDQ1LDM2NDU3LDM2NDM2LDM2Njc4LDM2Njc5LDM2NjgwLDM2NjgzLDM3MTYwLDM3MTc4LDM3MTc5LDM3MTgyLDM3Mjg4LDM3Mjg1LDM3Mjg3LDM3Mjk1LDM3MjkwLDM3ODEzLDM3NzcyLDM3Nzc4LDM3ODE1LDM3Nzg3LDM3Nzg5LDM3NzY5LDM3Nzk5LDM3Nzc0LDM3ODAyLDM3NzkwLDM3Nzk4LDM3NzgxLDM3NzY4LDM3Nzg1LDM3NzkxLDM3NzczLDM3ODA5LDM3Nzc3LDM3ODEwLDM3Nzk2LDM3ODAwLDM3ODEyLDM3Nzk1LDM3Nzk3LDM4MzU0LDM4MzU1LDM4MzUzLDM4NTc5LDM4NjE1LDM4NjE4LDI0MDAyLDM4NjIzLDM4NjE2LDM4NjIxLDM4NjkxLDM4NjkwLDM4NjkzLDM4ODI4LDM4ODMwLDM4ODI0LDM4ODI3LDM4ODIwLDM4ODI2LDM4ODE4LDM4ODIxLDM4ODcxLDM4ODczLDM4ODcwLDM4ODcyLDM4OTA2LDM4OTkyLDM4OTkzLDM4OTk0LDM5MDk2LDM5MjMzLDM5MjI4LDM5MjI2LDM5NDM5LDM5NDM1LDM5NDMzLDM5NDM3LDM5NDI4LDM5NDQxLDM5NDM0LDM5NDI5LDM5NDMxLDM5NDMwLDM5NjE2LDM5NjQ0LDM5Njg4LDM5Njg0LDM5Njg1LDM5NzIxLDM5NzMzLDM5NzU0LDM5NzU2LDM5NzU1LDM5ODc5LDM5ODc4LDM5ODc1LDM5ODcxLDM5ODczLDM5ODYxLDM5ODY0LDM5ODkxLDM5ODYyLDM5ODc2LDM5ODY1LDM5ODY5LDQwMjg0LDQwMjc1LDQwMjcxLDQwMjY2LDQwMjgzLDQwMjY3LDQwMjgxLDQwMjc4LDQwMjY4LDQwMjc5LDQwMjc0LDQwMjc2LDQwMjg3LDQwMjgwLDQwMjgyLDQwNTkwLDQwNTg4LDQwNjcxLDQwNzA1LDQwNzA0LDQwNzI2LDQwNzQxLDQwNzQ3LDQwNzQ2LDQwNzQ1LDQwNzQ0LDQwNzgwLDQwNzg5LDIwNzg4LDIwNzg5LDIxMTQyLDIxMjM5LDIxNDI4LDIyMTg3LDIyMTg5LDIyMTgyLDIyMTgzLDIyMTg2LDIyMTg4LDIyNzQ2LDIyNzQ5LDIyNzQ3LDIyODAyLDIzMzU3LDIzMzU4LDIzMzU5LDI0MDAzLDI0MTc2LDI0NTExLDI1MDgzLDI1ODYzLDI1ODcyLDI1ODY5LDI1ODY1LDI1ODY4LDI1ODcwLDI1OTg4LDI2MDc4LDI2MDc3LDI2MzM0LDI3MzY3LDI3MzYwLDI3MzQwLDI3MzQ1LDI3MzUzLDI3MzM5LDI3MzU5LDI3MzU2LDI3MzQ0LDI3MzcxLDI3MzQzLDI3MzQxLDI3MzU4LDI3NDg4LDI3NTY4LDI3NjYwLDI4Njk3LDI4NzExLDI4NzA0LDI4Njk0LDI4NzE1LDI4NzA1LDI4NzA2LDI4NzA3LDI4NzEzLDI4Njk1LDI4NzA4LDI4NzAwLDI4NzE0LDI5MTk2LDI5MTk0LDI5MTkxLDI5MTg2LDI5MTg5LDI5MzQ5LDI5MzUwLDI5MzQ4LDI5MzQ3LDI5MzQ1LDI5ODk5LDI5ODkzLDI5ODc5LDI5ODkxLDI5OTc0LDMwMzA0LDMwNjY1LDMwNjY2LDMwNjYwLDMwNzA1LDMxMDA1LDMxMDAzLDMxMDA5LDMxMDA0LDMwOTk5LDMxMDA2LDMxMTUyLDMxMzM1LDMxMzM2LDMxNzk1LDMxODA0LDMxODAxLDMxNzg4LDMxODAzLDMxOTgwLDMxOTc4LDMyMzc0LDMyMzczLDMyMzc2LDMyMzY4LDMyMzc1LDMyMzY3LDMyMzc4LDMyMzcwLDMyMzcyLDMyMzYwLDMyNTg3LDMyNTg2LDMyNjQzLDMyNjQ2LDMyNjk1LDMyNzY1LDMyNzY2LDMyODg4LDMzMjM5LDMzMjM3LDMzMzgwLDMzMzc3LDMzMzc5LDM0MjgzLDM0Mjg5LDM0Mjg1LDM0MjY1LDM0MjczLDM0MjgwLDM0MjY2LDM0MjYzLDM0Mjg0LDM0MjkwLDM0Mjk2LDM0MjY0LDM0MjcxLDM0Mjc1LDM0MjY4LDM0MjU3LDM0Mjg4LDM0Mjc4LDM0Mjg3LDM0MjcwLDM0Mjc0LDM0ODE2LDM0ODEwLDM0ODE5LDM0ODA2LDM0ODA3LDM0ODI1LDM0ODI4LDM0ODI3LDM0ODIyLDM0ODEyLDM0ODI0LDM0ODE1LDM0ODI2LDM0ODE4LDM1MTcwLDM1MTYyLDM1MTYzLDM1MTU5LDM1MTY5LDM1MTY0LDM1MTYwLDM1MTY1LDM1MTYxLDM1MjA4LDM1MjU1LDM1MjU0LDM1MzE4LDM1NjY0LDM1NjU2LDM1NjU4LDM1NjQ4LDM1NjY3LDM1NjcwLDM1NjY4LDM1NjU5LDM1NjY5LDM1NjY1LDM1NjUwLDM1NjY2LDM1NjcxLDM1OTA3LDM1OTU5LDM1OTU4LDM1OTk0LDM2MTAyLDM2MTAzLDM2MTA1LDM2MjY4LDM2MjY2LDM2MjY5LDM2MjY3LDM2NDYxLDM2NDcyLDM2NDY3LDM2NDU4LDM2NDYzLDM2NDc1LDM2NTQ2LDM2NjkwLDM2Njg5LDM2Njg3LDM2Njg4LDM2NjkxLDM2Nzg4LDM3MTg0LDM3MTgzLDM3Mjk2LDM3MjkzLDM3ODU0LDM3ODMxLDM3ODM5LDM3ODI2LDM3ODUwLDM3ODQwLDM3ODgxLDM3ODY4LDM3ODM2LDM3ODQ5LDM3ODAxLDM3ODYyLDM3ODM0LDM3ODQ0LDM3ODcwLDM3ODU5LDM3ODQ1LDM3ODI4LDM3ODM4LDM3ODI0LDM3ODQyLDM3ODYzLDM4MjY5LDM4MzYyLDM4MzYzLDM4NjI1LDM4Njk3LDM4Njk5LDM4NzAwLDM4Njk2LDM4Njk0LDM4ODM1LDM4ODM5LDM4ODM4LDM4ODc3LDM4ODc4LDM4ODc5LDM5MDA0LDM5MDAxLDM5MDA1LDM4OTk5LDM5MTAzLDM5MTAxLDM5MDk5LDM5MTAyLDM5MjQwLDM5MjM5LDM5MjM1LDM5MzM0LDM5MzM1LDM5NDUwLDM5NDQ1LDM5NDYxLDM5NDUzLDM5NDYwLDM5NDUxLDM5NDU4LDM5NDU2LDM5NDYzLDM5NDU5LDM5NDU0LDM5NDUyLDM5NDQ0LDM5NjE4LDM5NjkxLDM5NjkwLDM5Njk0LDM5NjkyLDM5NzM1LDM5OTE0LDM5OTE1LDM5OTA0LDM5OTAyLDM5OTA4LDM5OTEwLDM5OTA2LDM5OTIwLDM5ODkyLDM5ODk1LDM5OTE2LDM5OTAwLDM5ODk3LDM5OTA5LDM5ODkzLDM5OTA1LDM5ODk4LDQwMzExLDQwMzIxLDQwMzMwLDQwMzI0LDQwMzI4LDQwMzA1LDQwMzIwLDQwMzEyLDQwMzI2LDQwMzMxLDQwMzMyLDQwMzE3LDQwMjk5LDQwMzA4LDQwMzA5LDQwMzA0LDQwMjk3LDQwMzI1LDQwMzA3LDQwMzE1LDQwMzIyLDQwMzAzLDQwMzEzLDQwMzE5LDQwMzI3LDQwMjk2LDQwNTk2LDQwNTkzLDQwNjQwLDQwNzAwLDQwNzQ5LDQwNzY4LDQwNzY5LDQwNzgxLDQwNzkwLDQwNzkxLDQwNzkyLDIxMzAzLDIyMTk0LDIyMTk3LDIyMTk1LDIyNzU1LDIzMzY1LDI0MDA2LDI0MDA3LDI0MzAyLDI0MzAzLDI0NTEyLDI0NTEzLDI1MDgxLDI1ODc5LDI1ODc4LDI1ODc3LDI1ODc1LDI2MDc5LDI2MzQ0LDI2MzM5LDI2MzQwLDI3Mzc5LDI3Mzc2LDI3MzcwLDI3MzY4LDI3Mzg1LDI3Mzc3LDI3Mzc0LDI3Mzc1LDI4NzMyLDI4NzI1LDI4NzE5LDI4NzI3LDI4NzI0LDI4NzIxLDI4NzM4LDI4NzI4LDI4NzM1LDI4NzMwLDI4NzI5LDI4NzM2LDI4NzMxLDI4NzIzLDI4NzM3LDI5MjAzLDI5MjA0LDI5MzUyLDI5NTY1LDI5NTY0LDI5ODgyLDMwMzc5LDMwMzc4LDMwMzk4LDMwNDQ1LDMwNjY4LDMwNjcwLDMwNjcxLDMwNjY5LDMwNzA2LDMxMDEzLDMxMDExLDMxMDE1LDMxMDE2LDMxMDEyLDMxMDE3LDMxMTU0LDMxMzQyLDMxMzQwLDMxMzQxLDMxNDc5LDMxODE3LDMxODE2LDMxODE4LDMxODE1LDMxODEzLDMxOTgyLDMyMzc5LDMyMzgyLDMyMzg1LDMyMzg0LDMyNjk4LDMyNzY3LDMyODg5LDMzMjQzLDMzMjQxLDMzMjkxLDMzMzg0LDMzMzg1LDM0MzM4LDM0MzAzLDM0MzA1LDM0MzAyLDM0MzMxLDM0MzA0LDM0Mjk0LDM0MzA4LDM0MzEzLDM0MzA5LDM0MzE2LDM0MzAxLDM0ODQxLDM0ODMyLDM0ODMzLDM0ODM5LDM0ODM1LDM0ODM4LDM1MTcxLDM1MTc0LDM1MjU3LDM1MzE5LDM1NjgwLDM1NjkwLDM1Njc3LDM1Njg4LDM1NjgzLDM1Njg1LDM1Njg3LDM1NjkzLDM2MjcwLDM2NDg2LDM2NDg4LDM2NDg0LDM2Njk3LDM2Njk0LDM2Njk1LDM2NjkzLDM2Njk2LDM2Njk4LDM3MDA1LDM3MTg3LDM3MTg1LDM3MzAzLDM3MzAxLDM3Mjk4LDM3Mjk5LDM3ODk5LDM3OTA3LDM3ODgzLDM3OTIwLDM3OTAzLDM3OTA4LDM3ODg2LDM3OTA5LDM3OTA0LDM3OTI4LDM3OTEzLDM3OTAxLDM3ODc3LDM3ODg4LDM3ODc5LDM3ODk1LDM3OTAyLDM3OTEwLDM3OTA2LDM3ODgyLDM3ODk3LDM3ODgwLDM3ODk4LDM3ODg3LDM3ODg0LDM3OTAwLDM3ODc4LDM3OTA1LDM3ODk0LDM4MzY2LDM4MzY4LDM4MzY3LDM4NzAyLDM4NzAzLDM4ODQxLDM4ODQzLDM4OTA5LDM4OTEwLDM5MDA4LDM5MDEwLDM5MDExLDM5MDA3LDM5MTA1LDM5MTA2LDM5MjQ4LDM5MjQ2LDM5MjU3LDM5MjQ0LDM5MjQzLDM5MjUxLDM5NDc0LDM5NDc2LDM5NDczLDM5NDY4LDM5NDY2LDM5NDc4LDM5NDY1LDM5NDcwLDM5NDgwLDM5NDY5LDM5NjIzLDM5NjI2LDM5NjIyLDM5Njk2LDM5Njk4LDM5Njk3LDM5OTQ3LDM5OTQ0LDM5OTI3LDM5OTQxLDM5OTU0LDM5OTI4LDQwMDAwLDM5OTQzLDM5OTUwLDM5OTQyLDM5OTU5LDM5OTU2LDM5OTQ1LDQwMzUxLDQwMzQ1LDQwMzU2LDQwMzQ5LDQwMzM4LDQwMzQ0LDQwMzM2LDQwMzQ3LDQwMzUyLDQwMzQwLDQwMzQ4LDQwMzYyLDQwMzQzLDQwMzUzLDQwMzQ2LDQwMzU0LDQwMzYwLDQwMzUwLDQwMzU1LDQwMzgzLDQwMzYxLDQwMzQyLDQwMzU4LDQwMzU5LDQwNjAxLDQwNjAzLDQwNjAyLDQwNjc3LDQwNjc2LDQwNjc5LDQwNjc4LDQwNzUyLDQwNzUwLDQwNzk1LDQwODAwLDQwNzk4LDQwNzk3LDQwNzkzLDQwODQ5LDIwNzk0LDIwNzkzLDIxMTQ0LDIxMTQzLDIyMjExLDIyMjA1LDIyMjA2LDIzMzY4LDIzMzY3LDI0MDExLDI0MDE1LDI0MzA1LDI1MDg1LDI1ODgzLDI3Mzk0LDI3Mzg4LDI3Mzk1LDI3Mzg0LDI3MzkyLDI4NzM5LDI4NzQwLDI4NzQ2LDI4NzQ0LDI4NzQ1LDI4NzQxLDI4NzQyLDI5MjEzLDI5MjEwLDI5MjA5LDI5NTY2LDI5OTc1LDMwMzE0LDMwNjcyLDMxMDIxLDMxMDI1LDMxMDIzLDMxODI4LDMxODI3LDMxOTg2LDMyMzk0LDMyMzkxLDMyMzkyLDMyMzk1LDMyMzkwLDMyMzk3LDMyNTg5LDMyNjk5LDMyODE2LDMzMjQ1LDM0MzI4LDM0MzQ2LDM0MzQyLDM0MzM1LDM0MzM5LDM0MzMyLDM0MzI5LDM0MzQzLDM0MzUwLDM0MzM3LDM0MzM2LDM0MzQ1LDM0MzM0LDM0MzQxLDM0ODU3LDM0ODQ1LDM0ODQzLDM0ODQ4LDM0ODUyLDM0ODQ0LDM0ODU5LDM0ODkwLDM1MTgxLDM1MTc3LDM1MTgyLDM1MTc5LDM1MzIyLDM1NzA1LDM1NzA0LDM1NjUzLDM1NzA2LDM1NzA3LDM2MTEyLDM2MTE2LDM2MjcxLDM2NDk0LDM2NDkyLDM2NzAyLDM2Njk5LDM2NzAxLDM3MTkwLDM3MTg4LDM3MTg5LDM3MzA1LDM3OTUxLDM3OTQ3LDM3OTQyLDM3OTI5LDM3OTQ5LDM3OTQ4LDM3OTM2LDM3OTQ1LDM3OTMwLDM3OTQzLDM3OTMyLDM3OTUyLDM3OTM3LDM4MzczLDM4MzcyLDM4MzcxLDM4NzA5LDM4NzE0LDM4ODQ3LDM4ODgxLDM5MDEyLDM5MTEzLDM5MTEwLDM5MTA0LDM5MjU2LDM5MjU0LDM5NDgxLDM5NDg1LDM5NDk0LDM5NDkyLDM5NDkwLDM5NDg5LDM5NDgyLDM5NDg3LDM5NjI5LDM5NzAxLDM5NzAzLDM5NzA0LDM5NzAyLDM5NzM4LDM5NzYyLDM5OTc5LDM5OTY1LDM5OTY0LDM5OTgwLDM5OTcxLDM5OTc2LDM5OTc3LDM5OTcyLDM5OTY5LDQwMzc1LDQwMzc0LDQwMzgwLDQwMzg1LDQwMzkxLDQwMzk0LDQwMzk5LDQwMzgyLDQwMzg5LDQwMzg3LDQwMzc5LDQwMzczLDQwMzk4LDQwMzc3LDQwMzc4LDQwMzY0LDQwMzkyLDQwMzY5LDQwMzY1LDQwMzk2LDQwMzcxLDQwMzk3LDQwMzcwLDQwNTcwLDQwNjA0LDQwNjgzLDQwNjg2LDQwNjg1LDQwNzMxLDQwNzI4LDQwNzMwLDQwNzUzLDQwNzgyLDQwODA1LDQwODA0LDQwODUwLDIwMTUzLDIyMjE0LDIyMjEzLDIyMjE5LDIyODk3LDIzMzcxLDIzMzcyLDI0MDIxLDI0MDE3LDI0MzA2LDI1ODg5LDI1ODg4LDI1ODk0LDI1ODkwLDI3NDAzLDI3NDAwLDI3NDAxLDI3NjYxLDI4NzU3LDI4NzU4LDI4NzU5LDI4NzU0LDI5MjE0LDI5MjE1LDI5MzUzLDI5NTY3LDI5OTEyLDI5OTA5LDI5OTEzLDI5OTExLDMwMzE3LDMwMzgxLDMxMDI5LDMxMTU2LDMxMzQ0LDMxMzQ1LDMxODMxLDMxODM2LDMxODMzLDMxODM1LDMxODM0LDMxOTg4LDMxOTg1LDMyNDAxLDMyNTkxLDMyNjQ3LDMzMjQ2LDMzMzg3LDM0MzU2LDM0MzU3LDM0MzU1LDM0MzQ4LDM0MzU0LDM0MzU4LDM0ODYwLDM0ODU2LDM0ODU0LDM0ODU4LDM0ODUzLDM1MTg1LDM1MjYzLDM1MjYyLDM1MzIzLDM1NzEwLDM1NzE2LDM1NzE0LDM1NzE4LDM1NzE3LDM1NzExLDM2MTE3LDM2NTAxLDM2NTAwLDM2NTA2LDM2NDk4LDM2NDk2LDM2NTAyLDM2NTAzLDM2NzA0LDM2NzA2LDM3MTkxLDM3OTY0LDM3OTY4LDM3OTYyLDM3OTYzLDM3OTY3LDM3OTU5LDM3OTU3LDM3OTYwLDM3OTYxLDM3OTU4LDM4NzE5LDM4ODgzLDM5MDE4LDM5MDE3LDM5MTE1LDM5MjUyLDM5MjU5LDM5NTAyLDM5NTA3LDM5NTA4LDM5NTAwLDM5NTAzLDM5NDk2LDM5NDk4LDM5NDk3LDM5NTA2LDM5NTA0LDM5NjMyLDM5NzA1LDM5NzIzLDM5NzM5LDM5NzY2LDM5NzY1LDQwMDA2LDQwMDA4LDM5OTk5LDQwMDA0LDM5OTkzLDM5OTg3LDQwMDAxLDM5OTk2LDM5OTkxLDM5OTg4LDM5OTg2LDM5OTk3LDM5OTkwLDQwNDExLDQwNDAyLDQwNDE0LDQwNDEwLDQwMzk1LDQwNDAwLDQwNDEyLDQwNDAxLDQwNDE1LDQwNDI1LDQwNDA5LDQwNDA4LDQwNDA2LDQwNDM3LDQwNDA1LDQwNDEzLDQwNjMwLDQwNjg4LDQwNzU3LDQwNzU1LDQwNzU0LDQwNzcwLDQwODExLDQwODUzLDQwODY2LDIwNzk3LDIxMTQ1LDIyNzYwLDIyNzU5LDIyODk4LDIzMzczLDI0MDI0LDM0ODYzLDI0Mzk5LDI1MDg5LDI1MDkxLDI1MDkyLDI1ODk3LDI1ODkzLDI2MDA2LDI2MzQ3LDI3NDA5LDI3NDEwLDI3NDA3LDI3NTk0LDI4NzYzLDI4NzYyLDI5MjE4LDI5NTcwLDI5NTY5LDI5NTcxLDMwMzIwLDMwNjc2LDMxODQ3LDMxODQ2LDMyNDA1LDMzMzg4LDM0MzYyLDM0MzY4LDM0MzYxLDM0MzY0LDM0MzUzLDM0MzYzLDM0MzY2LDM0ODY0LDM0ODY2LDM0ODYyLDM0ODY3LDM1MTkwLDM1MTg4LDM1MTg3LDM1MzI2LDM1NzI0LDM1NzI2LDM1NzIzLDM1NzIwLDM1OTA5LDM2MTIxLDM2NTA0LDM2NzA4LDM2NzA3LDM3MzA4LDM3OTg2LDM3OTczLDM3OTgxLDM3OTc1LDM3OTgyLDM4ODUyLDM4ODUzLDM4OTEyLDM5NTEwLDM5NTEzLDM5NzEwLDM5NzExLDM5NzEyLDQwMDE4LDQwMDI0LDQwMDE2LDQwMDEwLDQwMDEzLDQwMDExLDQwMDIxLDQwMDI1LDQwMDEyLDQwMDE0LDQwNDQzLDQwNDM5LDQwNDMxLDQwNDE5LDQwNDI3LDQwNDQwLDQwNDIwLDQwNDM4LDQwNDE3LDQwNDMwLDQwNDIyLDQwNDM0LDQwNDMyLDQwNDE4LDQwNDI4LDQwNDM2LDQwNDM1LDQwNDI0LDQwNDI5LDQwNjQyLDQwNjU2LDQwNjkwLDQwNjkxLDQwNzEwLDQwNzMyLDQwNzYwLDQwNzU5LDQwNzU4LDQwNzcxLDQwNzgzLDQwODE3LDQwODE2LDQwODE0LDQwODE1LDIyMjI3LDIyMjIxLDIzMzc0LDIzNjYxLDI1OTAxLDI2MzQ5LDI2MzUwLDI3NDExLDI4NzY3LDI4NzY5LDI4NzY1LDI4NzY4LDI5MjE5LDI5OTE1LDI5OTI1LDMwNjc3LDMxMDMyLDMxMTU5LDMxMTU4LDMxODUwLDMyNDA3LDMyNjQ5LDMzMzg5LDM0MzcxLDM0ODcyLDM0ODcxLDM0ODY5LDM0ODkxLDM1NzMyLDM1NzMzLDM2NTEwLDM2NTExLDM2NTEyLDM2NTA5LDM3MzEwLDM3MzA5LDM3MzE0LDM3OTk1LDM3OTkyLDM3OTkzLDM4NjI5LDM4NzI2LDM4NzIzLDM4NzI3LDM4ODU1LDM4ODg1LDM5NTE4LDM5NjM3LDM5NzY5LDQwMDM1LDQwMDM5LDQwMDM4LDQwMDM0LDQwMDMwLDQwMDMyLDQwNDUwLDQwNDQ2LDQwNDU1LDQwNDUxLDQwNDU0LDQwNDUzLDQwNDQ4LDQwNDQ5LDQwNDU3LDQwNDQ3LDQwNDQ1LDQwNDUyLDQwNjA4LDQwNzM0LDQwNzc0LDQwODIwLDQwODIxLDQwODIyLDIyMjI4LDI1OTAyLDI2MDQwLDI3NDE2LDI3NDE3LDI3NDE1LDI3NDE4LDI4NzcwLDI5MjIyLDI5MzU0LDMwNjgwLDMwNjgxLDMxMDMzLDMxODQ5LDMxODUxLDMxOTkwLDMyNDEwLDMyNDA4LDMyNDExLDMyNDA5LDMzMjQ4LDMzMjQ5LDM0Mzc0LDM0Mzc1LDM0Mzc2LDM1MTkzLDM1MTk0LDM1MTk2LDM1MTk1LDM1MzI3LDM1NzM2LDM1NzM3LDM2NTE3LDM2NTE2LDM2NTE1LDM3OTk4LDM3OTk3LDM3OTk5LDM4MDAxLDM4MDAzLDM4NzI5LDM5MDI2LDM5MjYzLDQwMDQwLDQwMDQ2LDQwMDQ1LDQwNDU5LDQwNDYxLDQwNDY0LDQwNDYzLDQwNDY2LDQwNDY1LDQwNjA5LDQwNjkzLDQwNzEzLDQwNzc1LDQwODI0LDQwODI3LDQwODI2LDQwODI1LDIyMzAyLDI4Nzc0LDMxODU1LDM0ODc2LDM2Mjc0LDM2NTE4LDM3MzE1LDM4MDA0LDM4MDA4LDM4MDA2LDM4MDA1LDM5NTIwLDQwMDUyLDQwMDUxLDQwMDQ5LDQwMDUzLDQwNDY4LDQwNDY3LDQwNjk0LDQwNzE0LDQwODY4LDI4Nzc2LDI4NzczLDMxOTkxLDM0NDEwLDM0ODc4LDM0ODc3LDM0ODc5LDM1NzQyLDM1OTk2LDM2NTIxLDM2NTUzLDM4NzMxLDM5MDI3LDM5MDI4LDM5MTE2LDM5MjY1LDM5MzM5LDM5NTI0LDM5NTI2LDM5NTI3LDM5NzE2LDQwNDY5LDQwNDcxLDQwNzc2LDI1MDk1LDI3NDIyLDI5MjIzLDM0MzgwLDM2NTIwLDM4MDE4LDM4MDE2LDM4MDE3LDM5NTI5LDM5NTI4LDM5NzI2LDQwNDczLDI5MjI1LDM0Mzc5LDM1NzQzLDM4MDE5LDQwMDU3LDQwNjMxLDMwMzI1LDM5NTMxLDQwMDU4LDQwNDc3LDI4Nzc3LDI4Nzc4LDQwNjEyLDQwODMwLDQwNzc3LDQwODU2LDMwODQ5LDM3NTYxLDM1MDIzLDIyNzE1LDI0NjU4LDMxOTExLDIzMjkwLDk1NTYsOTU3NCw5NTU5LDk1NjgsOTU4MCw5NTcxLDk1NjIsOTU3Nyw5NTY1LDk1NTQsOTU3Miw5NTU3LDk1NjYsOTU3OCw5NTY5LDk1NjAsOTU3NSw5NTYzLDk1NTUsOTU3Myw5NTU4LDk1NjcsOTU3OSw5NTcwLDk1NjEsOTU3Niw5NTY0LDk1NTMsOTU1Miw5NTgxLDk1ODIsOTU4NCw5NTgzLDY1NTE3LDEzMjQyMywzNzU5NSwxMzI1NzUsMTQ3Mzk3LDM0MTI0LDE3MDc3LDI5Njc5LDIwOTE3LDEzODk3LDE0OTgyNiwxNjYzNzIsMzc3MDAsMTM3NjkxLDMzNTE4LDE0NjYzMiwzMDc4MCwyNjQzNiwyNTMxMSwxNDk4MTEsMTY2MzE0LDEzMTc0NCwxNTg2NDMsMTM1OTQxLDIwMzk1LDE0MDUyNSwyMDQ4OCwxNTkwMTcsMTYyNDM2LDE0NDg5NiwxNTAxOTMsMTQwNTYzLDIwNTIxLDEzMTk2NiwyNDQ4NCwxMzE5NjgsMTMxOTExLDI4Mzc5LDEzMjEyNywyMDYwNSwyMDczNywxMzQzNCwyMDc1MCwzOTAyMCwxNDE0NywzMzgxNCwxNDk5MjQsMTMyMjMxLDIwODMyLDE0NDMwOCwyMDg0MiwxMzQxNDMsMTM5NTE2LDEzMTgxMywxNDA1OTIsMTMyNDk0LDE0MzkyMywxMzc2MDMsMjM0MjYsMzQ2ODUsMTMyNTMxLDE0NjU4NSwyMDkxNCwyMDkyMCw0MDI0NCwyMDkzNywyMDk0MywyMDk0NSwxNTU4MCwyMDk0NywxNTAxODIsMjA5MTUsMjA5NjIsMjEzMTQsMjA5NzMsMzM3NDEsMjY5NDIsMTQ1MTk3LDI0NDQzLDIxMDAzLDIxMDMwLDIxMDUyLDIxMTczLDIxMDc5LDIxMTQwLDIxMTc3LDIxMTg5LDMxNzY1LDM0MTE0LDIxMjE2LDM0MzE3LDE1ODQ4MywyMTI1MywxNjY2MjIsMjE4MzMsMjgzNzcsMTQ3MzI4LDEzMzQ2MCwxNDc0MzYsMjEyOTksMjEzMTYsMTM0MTE0LDI3ODUxLDEzNjk5OCwyNjY1MSwyOTY1MywyNDY1MCwxNjA0MiwxNDU0MCwxMzY5MzYsMjkxNDksMTc1NzAsMjEzNTcsMjEzNjQsMTY1NTQ3LDIxMzc0LDIxMzc1LDEzNjU5OCwxMzY3MjMsMzA2OTQsMjEzOTUsMTY2NTU1LDIxNDA4LDIxNDE5LDIxNDIyLDI5NjA3LDE1MzQ1OCwxNjIxNywyOTU5NiwyMTQ0MSwyMTQ0NSwyNzcyMSwyMDA0MSwyMjUyNiwyMTQ2NSwxNTAxOSwxMzQwMzEsMjE0NzIsMTQ3NDM1LDE0Mjc1NSwyMTQ5NCwxMzQyNjMsMjE1MjMsMjg3OTMsMjE4MDMsMjYxOTksMjc5OTUsMjE2MTMsMTU4NTQ3LDEzNDUxNiwyMTg1MywyMTY0NywyMTY2OCwxODM0MiwxMzY5NzMsMTM0ODc3LDE1Nzk2LDEzNDQ3NywxNjYzMzIsMTQwOTUyLDIxODMxLDE5NjkzLDIxNTUxLDI5NzE5LDIxODk0LDIxOTI5LDIyMDIxLDEzNzQzMSwxNDc1MTQsMTc3NDYsMTQ4NTMzLDI2MjkxLDEzNTM0OCwyMjA3MSwyNjMxNywxNDQwMTAsMjYyNzYsMjYyODUsMjIwOTMsMjIwOTUsMzA5NjEsMjIyNTcsMzg3OTEsMjE1MDIsMjIyNzIsMjIyNTUsMjIyNTMsMTY2NzU4LDEzODU5LDEzNTc1OSwyMjM0MiwxNDc4NzcsMjc3NTgsMjg4MTEsMjIzMzgsMTQwMDEsMTU4ODQ2LDIyNTAyLDEzNjIxNCwyMjUzMSwxMzYyNzYsMTQ4MzIzLDIyNTY2LDE1MDUxNywyMjYyMCwyMjY5OCwxMzY2NSwyMjc1MiwyMjc0OCwxMzU3NDAsMjI3NzksMjM1NTEsMjIzMzksMTcyMzY4LDE0ODA4OCwzNzg0MywxMzcyOSwyMjgxNSwyNjc5MCwxNDAxOSwyODI0OSwxMzY3NjYsMjMwNzYsMjE4NDMsMTM2ODUwLDM0MDUzLDIyOTg1LDEzNDQ3OCwxNTg4NDksMTU5MDE4LDEzNzE4MCwyMzAwMSwxMzcyMTEsMTM3MTM4LDE1OTE0MiwyODAxNywxMzcyNTYsMTM2OTE3LDIzMDMzLDE1OTMwMSwyMzIxMSwyMzEzOSwxNDA1NCwxNDk5MjksMjMxNTksMTQwODgsMjMxOTAsMjk3OTcsMjMyNTEsMTU5NjQ5LDE0MDYyOCwxNTc0OSwxMzc0ODksMTQxMzAsMTM2ODg4LDI0MTk1LDIxMjAwLDIzNDE0LDI1OTkyLDIzNDIwLDE2MjMxOCwxNjM4OCwxODUyNSwxMzE1ODgsMjM1MDksMjQ5MjgsMTM3NzgwLDE1NDA2MCwxMzI1MTcsMjM1MzksMjM0NTMsMTk3MjgsMjM1NTcsMTM4MDUyLDIzNTcxLDI5NjQ2LDIzNTcyLDEzODQwNSwxNTg1MDQsMjM2MjUsMTg2NTMsMjM2ODUsMjM3ODUsMjM3OTEsMjM5NDcsMTM4NzQ1LDEzODgwNywyMzgyNCwyMzgzMiwyMzg3OCwxMzg5MTYsMjM3MzgsMjQwMjMsMzM1MzIsMTQzODEsMTQ5NzYxLDEzOTMzNywxMzk2MzUsMzM0MTUsMTQzOTAsMTUyOTgsMjQxMTAsMjcyNzQsMjQxODEsMjQxODYsMTQ4NjY4LDEzNDM1NSwyMTQxNCwyMDE1MSwyNDI3MiwyMTQxNiwxMzcwNzMsMjQwNzMsMjQzMDgsMTY0OTk0LDI0MzEzLDI0MzE1LDE0NDk2LDI0MzE2LDI2Njg2LDM3OTE1LDI0MzMzLDEzMTUyMSwxOTQ3MDgsMTUwNzAsMTg2MDYsMTM1OTk0LDI0Mzc4LDE1NzgzMiwxNDAyNDAsMjQ0MDgsMTQwNDAxLDI0NDE5LDM4ODQ1LDE1OTM0MiwyNDQzNCwzNzY5NiwxNjY0NTQsMjQ0ODcsMjM5OTAsMTU3MTEsMTUyMTQ0LDEzOTExNCwxNTk5OTIsMTQwOTA0LDM3MzM0LDEzMTc0MiwxNjY0NDEsMjQ2MjUsMjYyNDUsMTM3MzM1LDE0NjkxLDE1ODE1LDEzODgxLDIyNDE2LDE0MTIzNiwzMTA4OSwxNTkzNiwyNDczNCwyNDc0MCwyNDc1NSwxNDk4OTAsMTQ5OTAzLDE2MjM4NywyOTg2MCwyMDcwNSwyMzIwMCwyNDkzMiwzMzgyOCwyNDg5OCwxOTQ3MjYsMTU5NDQyLDI0OTYxLDIwOTgwLDEzMjY5NCwyNDk2NywyMzQ2NiwxNDczODMsMTQxNDA3LDI1MDQzLDE2NjgxMywxNzAzMzMsMjUwNDAsMTQ2NDIsMTQxNjk2LDE0MTUwNSwyNDYxMSwyNDkyNCwyNTg4NiwyNTQ4MywxMzEzNTIsMjUyODUsMTM3MDcyLDI1MzAxLDE0Mjg2MSwyNTQ1MiwxNDk5ODMsMTQ4NzEsMjU2NTYsMjU1OTIsMTM2MDc4LDEzNzIxMiwyNTc0NCwyODU1NCwxNDI5MDIsMzg5MzIsMTQ3NTk2LDE1MzM3MywyNTgyNSwyNTgyOSwzODAxMSwxNDk1MCwyNTY1OCwxNDkzNSwyNTkzMywyODQzOCwxNTAwNTYsMTUwMDUxLDI1OTg5LDI1OTY1LDI1OTUxLDE0MzQ4NiwyNjAzNywxNDk4MjQsMTkyNTUsMjYwNjUsMTY2MDAsMTM3MjU3LDI2MDgwLDI2MDgzLDI0NTQzLDE0NDM4NCwyNjEzNiwxNDM4NjMsMTQzODY0LDI2MTgwLDE0Mzc4MCwxNDM3ODEsMjYxODcsMTM0NzczLDI2MjE1LDE1MjAzOCwyNjIyNywyNjIyOCwxMzg4MTMsMTQzOTIxLDE2NTM2NCwxNDM4MTYsMTUyMzM5LDMwNjYxLDE0MTU1OSwzOTMzMiwyNjM3MCwxNDgzODAsMTUwMDQ5LDE1MTQ3LDI3MTMwLDE0NTM0NiwyNjQ2MiwyNjQ3MSwyNjQ2NiwxNDc5MTcsMTY4MTczLDI2NTgzLDE3NjQxLDI2NjU4LDI4MjQwLDM3NDM2LDI2NjI1LDE0NDM1OCwxNTkxMzYsMjY3MTcsMTQ0NDk1LDI3MTA1LDI3MTQ3LDE2NjYyMywyNjk5NSwyNjgxOSwxNDQ4NDUsMjY4ODEsMjY4ODAsMTU2NjYsMTQ4NDksMTQ0OTU2LDE1MjMyLDI2NTQwLDI2OTc3LDE2NjQ3NCwxNzE0OCwyNjkzNCwyNzAzMiwxNTI2NSwxMzIwNDEsMzM2MzUsMjA2MjQsMjcxMjksMTQ0OTg1LDEzOTU2MiwyNzIwNSwxNDUxNTUsMjcyOTMsMTUzNDcsMjY1NDUsMjczMzYsMTY4MzQ4LDE1MzczLDI3NDIxLDEzMzQxMSwyNDc5OCwyNzQ0NSwyNzUwOCwxNDEyNjEsMjgzNDEsMTQ2MTM5LDEzMjAyMSwxMzc1NjAsMTQxNDQsMjE1MzcsMTQ2MjY2LDI3NjE3LDE0NzE5NiwyNzYxMiwyNzcwMywxNDA0MjcsMTQ5NzQ1LDE1ODU0NSwyNzczOCwzMzMxOCwyNzc2OSwxNDY4NzYsMTc2MDUsMTQ2ODc3LDE0Nzg3NiwxNDk3NzIsMTQ5NzYwLDE0NjYzMywxNDA1MywxNTU5NSwxMzQ0NTAsMzk4MTEsMTQzODY1LDE0MDQzMywzMjY1NSwyNjY3OSwxNTkwMTMsMTU5MTM3LDE1OTIxMSwyODA1NCwyNzk5NiwyODI4NCwyODQyMCwxNDk4ODcsMTQ3NTg5LDE1OTM0NiwzNDA5OSwxNTk2MDQsMjA5MzUsMjc4MDQsMjgxODksMzM4MzgsMTY2Njg5LDI4MjA3LDE0Njk5MSwyOTc3OSwxNDczMzAsMzExODAsMjgyMzksMjMxODUsMTQzNDM1LDI4NjY0LDE0MDkzLDI4NTczLDE0Njk5MiwyODQxMCwxMzYzNDMsMTQ3NTE3LDE3NzQ5LDM3ODcyLDI4NDg0LDI4NTA4LDE1Njk0LDI4NTMyLDE2ODMwNCwxNTY3NSwyODU3NSwxNDc3ODAsMjg2MjcsMTQ3NjAxLDE0Nzc5NywxNDc1MTMsMTQ3NDQwLDE0NzM4MCwxNDc3NzUsMjA5NTksMTQ3Nzk4LDE0Nzc5OSwxNDc3NzYsMTU2MTI1LDI4NzQ3LDI4Nzk4LDI4ODM5LDI4ODAxLDI4ODc2LDI4ODg1LDI4ODg2LDI4ODk1LDE2NjQ0LDE1ODQ4LDI5MTA4LDI5MDc4LDE0ODA4NywyODk3MSwyODk5NywyMzE3NiwyOTAwMiwyOTAzOCwyMzcwOCwxNDgzMjUsMjkwMDcsMzc3MzAsMTQ4MTYxLDI4OTcyLDE0ODU3MCwxNTAwNTUsMTUwMDUwLDI5MTE0LDE2Njg4OCwyODg2MSwyOTE5OCwzNzk1NCwyOTIwNSwyMjgwMSwzNzk1NSwyOTIyMCwzNzY5NywxNTMwOTMsMjkyMzAsMjkyNDgsMTQ5ODc2LDI2ODEzLDI5MjY5LDI5MjcxLDE1OTU3LDE0MzQyOCwyNjYzNywyODQ3NywyOTMxNCwyOTQ4MiwyOTQ4MywxNDk1MzksMTY1OTMxLDE4NjY5LDE2NTg5MiwyOTQ4MCwyOTQ4NiwyOTY0NywyOTYxMCwxMzQyMDIsMTU4MjU0LDI5NjQxLDI5NzY5LDE0NzkzOCwxMzY5MzUsMTUwMDUyLDI2MTQ3LDE0MDIxLDE0OTk0MywxNDk5MDEsMTUwMDExLDI5Njg3LDI5NzE3LDI2ODgzLDE1MDA1NCwyOTc1MywxMzI1NDcsMTYwODcsMjk3ODgsMTQxNDg1LDI5NzkyLDE2NzYwMiwyOTc2NywyOTY2OCwyOTgxNCwzMzcyMSwyOTgwNCwxNDEyOCwyOTgxMiwzNzg3MywyNzE4MCwyOTgyNiwxODc3MSwxNTAxNTYsMTQ3ODA3LDE1MDEzNywxNjY3OTksMjMzNjYsMTY2OTE1LDEzNzM3NCwyOTg5NiwxMzc2MDgsMjk5NjYsMjk5MjksMjk5ODIsMTY3NjQxLDEzNzgwMywyMzUxMSwxNjc1OTYsMzc3NjUsMzAwMjksMzAwMjYsMzAwNTUsMzAwNjIsMTUxNDI2LDE2MTMyLDE1MDgwMywzMDA5NCwyOTc4OSwzMDExMCwzMDEzMiwzMDIxMCwzMDI1MiwzMDI4OSwzMDI4NywzMDMxOSwzMDMyNiwxNTY2NjEsMzAzNTIsMzMyNjMsMTQzMjgsMTU3OTY5LDE1Nzk2NiwzMDM2OSwzMDM3MywzMDM5MSwzMDQxMiwxNTk2NDcsMzM4OTAsMTUxNzA5LDE1MTkzMywxMzg3ODAsMzA0OTQsMzA1MDIsMzA1MjgsMjU3NzUsMTUyMDk2LDMwNTUyLDE0NDA0NCwzMDYzOSwxNjYyNDQsMTY2MjQ4LDEzNjg5NywzMDcwOCwzMDcyOSwxMzYwNTQsMTUwMDM0LDI2ODI2LDMwODk1LDMwOTE5LDMwOTMxLDM4NTY1LDMxMDIyLDE1MzA1NiwzMDkzNSwzMTAyOCwzMDg5NywxNjEyOTIsMzY3OTIsMzQ5NDgsMTY2Njk5LDE1NTc3OSwxNDA4MjgsMzExMTAsMzUwNzIsMjY4ODIsMzExMDQsMTUzNjg3LDMxMTMzLDE2MjYxNywzMTAzNiwzMTE0NSwyODIwMiwxNjAwMzgsMTYwNDAsMzExNzQsMTY4MjA1LDMxMTg4XSxcbiAgXCJldWMta3JcIjpbNDQwMzQsNDQwMzUsNDQwMzcsNDQwMzgsNDQwNDMsNDQwNDQsNDQwNDUsNDQwNDYsNDQwNDcsNDQwNTYsNDQwNjIsNDQwNjMsNDQwNjUsNDQwNjYsNDQwNjcsNDQwNjksNDQwNzAsNDQwNzEsNDQwNzIsNDQwNzMsNDQwNzQsNDQwNzUsNDQwNzgsNDQwODIsNDQwODMsNDQwODQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQwODUsNDQwODYsNDQwODcsNDQwOTAsNDQwOTEsNDQwOTMsNDQwOTQsNDQwOTUsNDQwOTcsNDQwOTgsNDQwOTksNDQxMDAsNDQxMDEsNDQxMDIsNDQxMDMsNDQxMDQsNDQxMDUsNDQxMDYsNDQxMDgsNDQxMTAsNDQxMTEsNDQxMTIsNDQxMTMsNDQxMTQsNDQxMTUsNDQxMTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQxMTgsNDQxMTksNDQxMjEsNDQxMjIsNDQxMjMsNDQxMjUsNDQxMjYsNDQxMjcsNDQxMjgsNDQxMjksNDQxMzAsNDQxMzEsNDQxMzIsNDQxMzMsNDQxMzQsNDQxMzUsNDQxMzYsNDQxMzcsNDQxMzgsNDQxMzksNDQxNDAsNDQxNDEsNDQxNDIsNDQxNDMsNDQxNDYsNDQxNDcsNDQxNDksNDQxNTAsNDQxNTMsNDQxNTUsNDQxNTYsNDQxNTcsNDQxNTgsNDQxNTksNDQxNjIsNDQxNjcsNDQxNjgsNDQxNzMsNDQxNzQsNDQxNzUsNDQxNzcsNDQxNzgsNDQxNzksNDQxODEsNDQxODIsNDQxODMsNDQxODQsNDQxODUsNDQxODYsNDQxODcsNDQxOTAsNDQxOTQsNDQxOTUsNDQxOTYsNDQxOTcsNDQxOTgsNDQxOTksNDQyMDMsNDQyMDUsNDQyMDYsNDQyMDksNDQyMTAsNDQyMTEsNDQyMTIsNDQyMTMsNDQyMTQsNDQyMTUsNDQyMTgsNDQyMjIsNDQyMjMsNDQyMjQsNDQyMjYsNDQyMjcsNDQyMjksNDQyMzAsNDQyMzEsNDQyMzMsNDQyMzQsNDQyMzUsNDQyMzcsNDQyMzgsNDQyMzksNDQyNDAsNDQyNDEsNDQyNDIsNDQyNDMsNDQyNDQsNDQyNDYsNDQyNDgsNDQyNDksNDQyNTAsNDQyNTEsNDQyNTIsNDQyNTMsNDQyNTQsNDQyNTUsNDQyNTgsNDQyNTksNDQyNjEsNDQyNjIsNDQyNjUsNDQyNjcsNDQyNjksNDQyNzAsNDQyNzQsNDQyNzYsNDQyNzksNDQyODAsNDQyODEsNDQyODIsNDQyODMsNDQyODYsNDQyODcsNDQyODksNDQyOTAsNDQyOTEsNDQyOTMsNDQyOTUsNDQyOTYsNDQyOTcsNDQyOTgsNDQyOTksNDQzMDIsNDQzMDQsNDQzMDYsNDQzMDcsNDQzMDgsNDQzMDksNDQzMTAsNDQzMTEsNDQzMTMsNDQzMTQsNDQzMTUsNDQzMTcsNDQzMTgsNDQzMTksNDQzMjEsNDQzMjIsNDQzMjMsNDQzMjQsNDQzMjUsNDQzMjYsNDQzMjcsNDQzMjgsNDQzMzAsNDQzMzEsNDQzMzQsNDQzMzUsNDQzMzYsNDQzMzcsNDQzMzgsNDQzMzksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQzNDIsNDQzNDMsNDQzNDUsNDQzNDYsNDQzNDcsNDQzNDksNDQzNTAsNDQzNTEsNDQzNTIsNDQzNTMsNDQzNTQsNDQzNTUsNDQzNTgsNDQzNjAsNDQzNjIsNDQzNjMsNDQzNjQsNDQzNjUsNDQzNjYsNDQzNjcsNDQzNjksNDQzNzAsNDQzNzEsNDQzNzMsNDQzNzQsNDQzNzUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQzNzcsNDQzNzgsNDQzNzksNDQzODAsNDQzODEsNDQzODIsNDQzODMsNDQzODQsNDQzODYsNDQzODgsNDQzODksNDQzOTAsNDQzOTEsNDQzOTIsNDQzOTMsNDQzOTQsNDQzOTUsNDQzOTgsNDQzOTksNDQ0MDEsNDQ0MDIsNDQ0MDcsNDQ0MDgsNDQ0MDksNDQ0MTAsNDQ0MTQsNDQ0MTYsNDQ0MTksNDQ0MjAsNDQ0MjEsNDQ0MjIsNDQ0MjMsNDQ0MjYsNDQ0MjcsNDQ0MjksNDQ0MzAsNDQ0MzEsNDQ0MzMsNDQ0MzQsNDQ0MzUsNDQ0MzYsNDQ0MzcsNDQ0MzgsNDQ0MzksNDQ0NDAsNDQ0NDEsNDQ0NDIsNDQ0NDMsNDQ0NDYsNDQ0NDcsNDQ0NDgsNDQ0NDksNDQ0NTAsNDQ0NTEsNDQ0NTMsNDQ0NTQsNDQ0NTUsNDQ0NTYsNDQ0NTcsNDQ0NTgsNDQ0NTksNDQ0NjAsNDQ0NjEsNDQ0NjIsNDQ0NjMsNDQ0NjQsNDQ0NjUsNDQ0NjYsNDQ0NjcsNDQ0NjgsNDQ0NjksNDQ0NzAsNDQ0NzIsNDQ0NzMsNDQ0NzQsNDQ0NzUsNDQ0NzYsNDQ0NzcsNDQ0NzgsNDQ0NzksNDQ0ODIsNDQ0ODMsNDQ0ODUsNDQ0ODYsNDQ0ODcsNDQ0ODksNDQ0OTAsNDQ0OTEsNDQ0OTIsNDQ0OTMsNDQ0OTQsNDQ0OTUsNDQ0OTgsNDQ1MDAsNDQ1MDEsNDQ1MDIsNDQ1MDMsNDQ1MDQsNDQ1MDUsNDQ1MDYsNDQ1MDcsNDQ1MDksNDQ1MTAsNDQ1MTEsNDQ1MTMsNDQ1MTQsNDQ1MTUsNDQ1MTcsNDQ1MTgsNDQ1MTksNDQ1MjAsNDQ1MjEsNDQ1MjIsNDQ1MjMsNDQ1MjQsNDQ1MjUsNDQ1MjYsNDQ1MjcsNDQ1MjgsNDQ1MjksNDQ1MzAsNDQ1MzEsNDQ1MzIsNDQ1MzMsNDQ1MzQsNDQ1MzUsNDQ1MzgsNDQ1MzksNDQ1NDEsNDQ1NDIsNDQ1NDYsNDQ1NDcsNDQ1NDgsNDQ1NDksNDQ1NTAsNDQ1NTEsNDQ1NTQsNDQ1NTYsNDQ1NTgsNDQ1NTksNDQ1NjAsNDQ1NjEsNDQ1NjIsNDQ1NjMsNDQ1NjUsNDQ1NjYsNDQ1NjcsNDQ1NjgsNDQ1NjksNDQ1NzAsNDQ1NzEsNDQ1NzIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ1NzMsNDQ1NzQsNDQ1NzUsNDQ1NzYsNDQ1NzcsNDQ1NzgsNDQ1NzksNDQ1ODAsNDQ1ODEsNDQ1ODIsNDQ1ODMsNDQ1ODQsNDQ1ODUsNDQ1ODYsNDQ1ODcsNDQ1ODgsNDQ1ODksNDQ1OTAsNDQ1OTEsNDQ1OTQsNDQ1OTUsNDQ1OTcsNDQ1OTgsNDQ2MDEsNDQ2MDMsNDQ2MDQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ2MDUsNDQ2MDYsNDQ2MDcsNDQ2MTAsNDQ2MTIsNDQ2MTUsNDQ2MTYsNDQ2MTcsNDQ2MTksNDQ2MjMsNDQ2MjUsNDQ2MjYsNDQ2MjcsNDQ2MjksNDQ2MzEsNDQ2MzIsNDQ2MzMsNDQ2MzQsNDQ2MzUsNDQ2MzgsNDQ2NDIsNDQ2NDMsNDQ2NDQsNDQ2NDYsNDQ2NDcsNDQ2NTAsNDQ2NTEsNDQ2NTMsNDQ2NTQsNDQ2NTUsNDQ2NTcsNDQ2NTgsNDQ2NTksNDQ2NjAsNDQ2NjEsNDQ2NjIsNDQ2NjMsNDQ2NjYsNDQ2NzAsNDQ2NzEsNDQ2NzIsNDQ2NzMsNDQ2NzQsNDQ2NzUsNDQ2NzgsNDQ2NzksNDQ2ODAsNDQ2ODEsNDQ2ODIsNDQ2ODMsNDQ2ODUsNDQ2ODYsNDQ2ODcsNDQ2ODgsNDQ2ODksNDQ2OTAsNDQ2OTEsNDQ2OTIsNDQ2OTMsNDQ2OTQsNDQ2OTUsNDQ2OTYsNDQ2OTcsNDQ2OTgsNDQ2OTksNDQ3MDAsNDQ3MDEsNDQ3MDIsNDQ3MDMsNDQ3MDQsNDQ3MDUsNDQ3MDYsNDQ3MDcsNDQ3MDgsNDQ3MDksNDQ3MTAsNDQ3MTEsNDQ3MTIsNDQ3MTMsNDQ3MTQsNDQ3MTUsNDQ3MTYsNDQ3MTcsNDQ3MTgsNDQ3MTksNDQ3MjAsNDQ3MjEsNDQ3MjIsNDQ3MjMsNDQ3MjQsNDQ3MjUsNDQ3MjYsNDQ3MjcsNDQ3MjgsNDQ3MjksNDQ3MzAsNDQ3MzEsNDQ3MzUsNDQ3MzcsNDQ3MzgsNDQ3MzksNDQ3NDEsNDQ3NDIsNDQ3NDMsNDQ3NDQsNDQ3NDUsNDQ3NDYsNDQ3NDcsNDQ3NTAsNDQ3NTQsNDQ3NTUsNDQ3NTYsNDQ3NTcsNDQ3NTgsNDQ3NTksNDQ3NjIsNDQ3NjMsNDQ3NjUsNDQ3NjYsNDQ3NjcsNDQ3NjgsNDQ3NjksNDQ3NzAsNDQ3NzEsNDQ3NzIsNDQ3NzMsNDQ3NzQsNDQ3NzUsNDQ3NzcsNDQ3NzgsNDQ3ODAsNDQ3ODIsNDQ3ODMsNDQ3ODQsNDQ3ODUsNDQ3ODYsNDQ3ODcsNDQ3ODksNDQ3OTAsNDQ3OTEsNDQ3OTMsNDQ3OTQsNDQ3OTUsNDQ3OTcsNDQ3OTgsNDQ3OTksNDQ4MDAsNDQ4MDEsNDQ4MDIsNDQ4MDMsNDQ4MDQsNDQ4MDUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ4MDYsNDQ4MDksNDQ4MTAsNDQ4MTEsNDQ4MTIsNDQ4MTQsNDQ4MTUsNDQ4MTcsNDQ4MTgsNDQ4MTksNDQ4MjAsNDQ4MjEsNDQ4MjIsNDQ4MjMsNDQ4MjQsNDQ4MjUsNDQ4MjYsNDQ4MjcsNDQ4MjgsNDQ4MjksNDQ4MzAsNDQ4MzEsNDQ4MzIsNDQ4MzMsNDQ4MzQsNDQ4MzUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDQ4MzYsNDQ4MzcsNDQ4MzgsNDQ4MzksNDQ4NDAsNDQ4NDEsNDQ4NDIsNDQ4NDMsNDQ4NDYsNDQ4NDcsNDQ4NDksNDQ4NTEsNDQ4NTMsNDQ4NTQsNDQ4NTUsNDQ4NTYsNDQ4NTcsNDQ4NTgsNDQ4NTksNDQ4NjIsNDQ4NjQsNDQ4NjgsNDQ4NjksNDQ4NzAsNDQ4NzEsNDQ4NzQsNDQ4NzUsNDQ4NzYsNDQ4NzcsNDQ4NzgsNDQ4NzksNDQ4ODEsNDQ4ODIsNDQ4ODMsNDQ4ODQsNDQ4ODUsNDQ4ODYsNDQ4ODcsNDQ4ODgsNDQ4ODksNDQ4OTAsNDQ4OTEsNDQ4OTQsNDQ4OTUsNDQ4OTYsNDQ4OTcsNDQ4OTgsNDQ4OTksNDQ5MDIsNDQ5MDMsNDQ5MDQsNDQ5MDUsNDQ5MDYsNDQ5MDcsNDQ5MDgsNDQ5MDksNDQ5MTAsNDQ5MTEsNDQ5MTIsNDQ5MTMsNDQ5MTQsNDQ5MTUsNDQ5MTYsNDQ5MTcsNDQ5MTgsNDQ5MTksNDQ5MjAsNDQ5MjIsNDQ5MjMsNDQ5MjQsNDQ5MjUsNDQ5MjYsNDQ5MjcsNDQ5MjksNDQ5MzAsNDQ5MzEsNDQ5MzMsNDQ5MzQsNDQ5MzUsNDQ5MzcsNDQ5MzgsNDQ5MzksNDQ5NDAsNDQ5NDEsNDQ5NDIsNDQ5NDMsNDQ5NDYsNDQ5NDcsNDQ5NDgsNDQ5NTAsNDQ5NTEsNDQ5NTIsNDQ5NTMsNDQ5NTQsNDQ5NTUsNDQ5NTcsNDQ5NTgsNDQ5NTksNDQ5NjAsNDQ5NjEsNDQ5NjIsNDQ5NjMsNDQ5NjQsNDQ5NjUsNDQ5NjYsNDQ5NjcsNDQ5NjgsNDQ5NjksNDQ5NzAsNDQ5NzEsNDQ5NzIsNDQ5NzMsNDQ5NzQsNDQ5NzUsNDQ5NzYsNDQ5NzcsNDQ5NzgsNDQ5NzksNDQ5ODAsNDQ5ODEsNDQ5ODIsNDQ5ODMsNDQ5ODYsNDQ5ODcsNDQ5ODksNDQ5OTAsNDQ5OTEsNDQ5OTMsNDQ5OTQsNDQ5OTUsNDQ5OTYsNDQ5OTcsNDQ5OTgsNDUwMDIsNDUwMDQsNDUwMDcsNDUwMDgsNDUwMDksNDUwMTAsNDUwMTEsNDUwMTMsNDUwMTQsNDUwMTUsNDUwMTYsNDUwMTcsNDUwMTgsNDUwMTksNDUwMjEsNDUwMjIsNDUwMjMsNDUwMjQsNDUwMjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUwMjYsNDUwMjcsNDUwMjgsNDUwMjksNDUwMzAsNDUwMzEsNDUwMzQsNDUwMzUsNDUwMzYsNDUwMzcsNDUwMzgsNDUwMzksNDUwNDIsNDUwNDMsNDUwNDUsNDUwNDYsNDUwNDcsNDUwNDksNDUwNTAsNDUwNTEsNDUwNTIsNDUwNTMsNDUwNTQsNDUwNTUsNDUwNTgsNDUwNTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUwNjEsNDUwNjIsNDUwNjMsNDUwNjQsNDUwNjUsNDUwNjYsNDUwNjcsNDUwNjksNDUwNzAsNDUwNzEsNDUwNzMsNDUwNzQsNDUwNzUsNDUwNzcsNDUwNzgsNDUwNzksNDUwODAsNDUwODEsNDUwODIsNDUwODMsNDUwODYsNDUwODcsNDUwODgsNDUwODksNDUwOTAsNDUwOTEsNDUwOTIsNDUwOTMsNDUwOTQsNDUwOTUsNDUwOTcsNDUwOTgsNDUwOTksNDUxMDAsNDUxMDEsNDUxMDIsNDUxMDMsNDUxMDQsNDUxMDUsNDUxMDYsNDUxMDcsNDUxMDgsNDUxMDksNDUxMTAsNDUxMTEsNDUxMTIsNDUxMTMsNDUxMTQsNDUxMTUsNDUxMTYsNDUxMTcsNDUxMTgsNDUxMTksNDUxMjAsNDUxMjEsNDUxMjIsNDUxMjMsNDUxMjYsNDUxMjcsNDUxMjksNDUxMzEsNDUxMzMsNDUxMzUsNDUxMzYsNDUxMzcsNDUxMzgsNDUxNDIsNDUxNDQsNDUxNDYsNDUxNDcsNDUxNDgsNDUxNTAsNDUxNTEsNDUxNTIsNDUxNTMsNDUxNTQsNDUxNTUsNDUxNTYsNDUxNTcsNDUxNTgsNDUxNTksNDUxNjAsNDUxNjEsNDUxNjIsNDUxNjMsNDUxNjQsNDUxNjUsNDUxNjYsNDUxNjcsNDUxNjgsNDUxNjksNDUxNzAsNDUxNzEsNDUxNzIsNDUxNzMsNDUxNzQsNDUxNzUsNDUxNzYsNDUxNzcsNDUxNzgsNDUxNzksNDUxODIsNDUxODMsNDUxODUsNDUxODYsNDUxODcsNDUxODksNDUxOTAsNDUxOTEsNDUxOTIsNDUxOTMsNDUxOTQsNDUxOTUsNDUxOTgsNDUyMDAsNDUyMDIsNDUyMDMsNDUyMDQsNDUyMDUsNDUyMDYsNDUyMDcsNDUyMTEsNDUyMTMsNDUyMTQsNDUyMTksNDUyMjAsNDUyMjEsNDUyMjIsNDUyMjMsNDUyMjYsNDUyMzIsNDUyMzQsNDUyMzgsNDUyMzksNDUyNDEsNDUyNDIsNDUyNDMsNDUyNDUsNDUyNDYsNDUyNDcsNDUyNDgsNDUyNDksNDUyNTAsNDUyNTEsNDUyNTQsNDUyNTgsNDUyNTksNDUyNjAsNDUyNjEsNDUyNjIsNDUyNjMsNDUyNjYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUyNjcsNDUyNjksNDUyNzAsNDUyNzEsNDUyNzMsNDUyNzQsNDUyNzUsNDUyNzYsNDUyNzcsNDUyNzgsNDUyNzksNDUyODEsNDUyODIsNDUyODMsNDUyODQsNDUyODYsNDUyODcsNDUyODgsNDUyODksNDUyOTAsNDUyOTEsNDUyOTIsNDUyOTMsNDUyOTQsNDUyOTUsNDUyOTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDUyOTcsNDUyOTgsNDUyOTksNDUzMDAsNDUzMDEsNDUzMDIsNDUzMDMsNDUzMDQsNDUzMDUsNDUzMDYsNDUzMDcsNDUzMDgsNDUzMDksNDUzMTAsNDUzMTEsNDUzMTIsNDUzMTMsNDUzMTQsNDUzMTUsNDUzMTYsNDUzMTcsNDUzMTgsNDUzMTksNDUzMjIsNDUzMjUsNDUzMjYsNDUzMjcsNDUzMjksNDUzMzIsNDUzMzMsNDUzMzQsNDUzMzUsNDUzMzgsNDUzNDIsNDUzNDMsNDUzNDQsNDUzNDUsNDUzNDYsNDUzNTAsNDUzNTEsNDUzNTMsNDUzNTQsNDUzNTUsNDUzNTcsNDUzNTgsNDUzNTksNDUzNjAsNDUzNjEsNDUzNjIsNDUzNjMsNDUzNjYsNDUzNzAsNDUzNzEsNDUzNzIsNDUzNzMsNDUzNzQsNDUzNzUsNDUzNzgsNDUzNzksNDUzODEsNDUzODIsNDUzODMsNDUzODUsNDUzODYsNDUzODcsNDUzODgsNDUzODksNDUzOTAsNDUzOTEsNDUzOTQsNDUzOTUsNDUzOTgsNDUzOTksNDU0MDEsNDU0MDIsNDU0MDMsNDU0MDUsNDU0MDYsNDU0MDcsNDU0MDksNDU0MTAsNDU0MTEsNDU0MTIsNDU0MTMsNDU0MTQsNDU0MTUsNDU0MTYsNDU0MTcsNDU0MTgsNDU0MTksNDU0MjAsNDU0MjEsNDU0MjIsNDU0MjMsNDU0MjQsNDU0MjUsNDU0MjYsNDU0MjcsNDU0MjgsNDU0MjksNDU0MzAsNDU0MzEsNDU0MzQsNDU0MzUsNDU0MzcsNDU0MzgsNDU0MzksNDU0NDEsNDU0NDMsNDU0NDQsNDU0NDUsNDU0NDYsNDU0NDcsNDU0NTAsNDU0NTIsNDU0NTQsNDU0NTUsNDU0NTYsNDU0NTcsNDU0NjEsNDU0NjIsNDU0NjMsNDU0NjUsNDU0NjYsNDU0NjcsNDU0NjksNDU0NzAsNDU0NzEsNDU0NzIsNDU0NzMsNDU0NzQsNDU0NzUsNDU0NzYsNDU0NzcsNDU0NzgsNDU0NzksNDU0ODEsNDU0ODIsNDU0ODMsNDU0ODQsNDU0ODUsNDU0ODYsNDU0ODcsNDU0ODgsNDU0ODksNDU0OTAsNDU0OTEsNDU0OTIsNDU0OTMsNDU0OTQsNDU0OTUsNDU0OTYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU0OTcsNDU0OTgsNDU0OTksNDU1MDAsNDU1MDEsNDU1MDIsNDU1MDMsNDU1MDQsNDU1MDUsNDU1MDYsNDU1MDcsNDU1MDgsNDU1MDksNDU1MTAsNDU1MTEsNDU1MTIsNDU1MTMsNDU1MTQsNDU1MTUsNDU1MTcsNDU1MTgsNDU1MTksNDU1MjEsNDU1MjIsNDU1MjMsNDU1MjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU1MjYsNDU1MjcsNDU1MjgsNDU1MjksNDU1MzAsNDU1MzEsNDU1MzQsNDU1MzYsNDU1MzcsNDU1MzgsNDU1MzksNDU1NDAsNDU1NDEsNDU1NDIsNDU1NDMsNDU1NDYsNDU1NDcsNDU1NDksNDU1NTAsNDU1NTEsNDU1NTMsNDU1NTQsNDU1NTUsNDU1NTYsNDU1NTcsNDU1NTgsNDU1NTksNDU1NjAsNDU1NjIsNDU1NjQsNDU1NjYsNDU1NjcsNDU1NjgsNDU1NjksNDU1NzAsNDU1NzEsNDU1NzQsNDU1NzUsNDU1NzcsNDU1NzgsNDU1ODEsNDU1ODIsNDU1ODMsNDU1ODQsNDU1ODUsNDU1ODYsNDU1ODcsNDU1OTAsNDU1OTIsNDU1OTQsNDU1OTUsNDU1OTYsNDU1OTcsNDU1OTgsNDU1OTksNDU2MDEsNDU2MDIsNDU2MDMsNDU2MDQsNDU2MDUsNDU2MDYsNDU2MDcsNDU2MDgsNDU2MDksNDU2MTAsNDU2MTEsNDU2MTIsNDU2MTMsNDU2MTQsNDU2MTUsNDU2MTYsNDU2MTcsNDU2MTgsNDU2MTksNDU2MjEsNDU2MjIsNDU2MjMsNDU2MjQsNDU2MjUsNDU2MjYsNDU2MjcsNDU2MjksNDU2MzAsNDU2MzEsNDU2MzIsNDU2MzMsNDU2MzQsNDU2MzUsNDU2MzYsNDU2MzcsNDU2MzgsNDU2MzksNDU2NDAsNDU2NDEsNDU2NDIsNDU2NDMsNDU2NDQsNDU2NDUsNDU2NDYsNDU2NDcsNDU2NDgsNDU2NDksNDU2NTAsNDU2NTEsNDU2NTIsNDU2NTMsNDU2NTQsNDU2NTUsNDU2NTcsNDU2NTgsNDU2NTksNDU2NjEsNDU2NjIsNDU2NjMsNDU2NjUsNDU2NjYsNDU2NjcsNDU2NjgsNDU2NjksNDU2NzAsNDU2NzEsNDU2NzQsNDU2NzUsNDU2NzYsNDU2NzcsNDU2NzgsNDU2NzksNDU2ODAsNDU2ODEsNDU2ODIsNDU2ODMsNDU2ODYsNDU2ODcsNDU2ODgsNDU2ODksNDU2OTAsNDU2OTEsNDU2OTMsNDU2OTQsNDU2OTUsNDU2OTYsNDU2OTcsNDU2OTgsNDU2OTksNDU3MDIsNDU3MDMsNDU3MDQsNDU3MDYsNDU3MDcsNDU3MDgsNDU3MDksNDU3MTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU3MTEsNDU3MTQsNDU3MTUsNDU3MTcsNDU3MTgsNDU3MTksNDU3MjMsNDU3MjQsNDU3MjUsNDU3MjYsNDU3MjcsNDU3MzAsNDU3MzIsNDU3MzUsNDU3MzYsNDU3MzcsNDU3MzksNDU3NDEsNDU3NDIsNDU3NDMsNDU3NDUsNDU3NDYsNDU3NDcsNDU3NDksNDU3NTAsNDU3NTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU3NTIsNDU3NTMsNDU3NTQsNDU3NTUsNDU3NTYsNDU3NTcsNDU3NTgsNDU3NTksNDU3NjAsNDU3NjEsNDU3NjIsNDU3NjMsNDU3NjQsNDU3NjUsNDU3NjYsNDU3NjcsNDU3NzAsNDU3NzEsNDU3NzMsNDU3NzQsNDU3NzUsNDU3NzcsNDU3NzksNDU3ODAsNDU3ODEsNDU3ODIsNDU3ODMsNDU3ODYsNDU3ODgsNDU3OTAsNDU3OTEsNDU3OTIsNDU3OTMsNDU3OTUsNDU3OTksNDU4MDEsNDU4MDIsNDU4MDgsNDU4MDksNDU4MTAsNDU4MTQsNDU4MjAsNDU4MjEsNDU4MjIsNDU4MjYsNDU4MjcsNDU4MjksNDU4MzAsNDU4MzEsNDU4MzMsNDU4MzQsNDU4MzUsNDU4MzYsNDU4MzcsNDU4MzgsNDU4MzksNDU4NDIsNDU4NDYsNDU4NDcsNDU4NDgsNDU4NDksNDU4NTAsNDU4NTEsNDU4NTMsNDU4NTQsNDU4NTUsNDU4NTYsNDU4NTcsNDU4NTgsNDU4NTksNDU4NjAsNDU4NjEsNDU4NjIsNDU4NjMsNDU4NjQsNDU4NjUsNDU4NjYsNDU4NjcsNDU4NjgsNDU4NjksNDU4NzAsNDU4NzEsNDU4NzIsNDU4NzMsNDU4NzQsNDU4NzUsNDU4NzYsNDU4NzcsNDU4NzgsNDU4NzksNDU4ODAsNDU4ODEsNDU4ODIsNDU4ODMsNDU4ODQsNDU4ODUsNDU4ODYsNDU4ODcsNDU4ODgsNDU4ODksNDU4OTAsNDU4OTEsNDU4OTIsNDU4OTMsNDU4OTQsNDU4OTUsNDU4OTYsNDU4OTcsNDU4OTgsNDU4OTksNDU5MDAsNDU5MDEsNDU5MDIsNDU5MDMsNDU5MDQsNDU5MDUsNDU5MDYsNDU5MDcsNDU5MTEsNDU5MTMsNDU5MTQsNDU5MTcsNDU5MjAsNDU5MjEsNDU5MjIsNDU5MjMsNDU5MjYsNDU5MjgsNDU5MzAsNDU5MzIsNDU5MzMsNDU5MzUsNDU5MzgsNDU5MzksNDU5NDEsNDU5NDIsNDU5NDMsNDU5NDUsNDU5NDYsNDU5NDcsNDU5NDgsNDU5NDksNDU5NTAsNDU5NTEsNDU5NTQsNDU5NTgsNDU5NTksNDU5NjAsNDU5NjEsNDU5NjIsNDU5NjMsNDU5NjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU5NjYsNDU5NjcsNDU5NjksNDU5NzAsNDU5NzEsNDU5NzMsNDU5NzQsNDU5NzUsNDU5NzYsNDU5NzcsNDU5NzgsNDU5NzksNDU5ODAsNDU5ODEsNDU5ODIsNDU5ODMsNDU5ODYsNDU5ODcsNDU5ODgsNDU5ODksNDU5OTAsNDU5OTEsNDU5OTMsNDU5OTQsNDU5OTUsNDU5OTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDU5OTgsNDU5OTksNDYwMDAsNDYwMDEsNDYwMDIsNDYwMDMsNDYwMDQsNDYwMDUsNDYwMDYsNDYwMDcsNDYwMDgsNDYwMDksNDYwMTAsNDYwMTEsNDYwMTIsNDYwMTMsNDYwMTQsNDYwMTUsNDYwMTYsNDYwMTcsNDYwMTgsNDYwMTksNDYwMjIsNDYwMjMsNDYwMjUsNDYwMjYsNDYwMjksNDYwMzEsNDYwMzMsNDYwMzQsNDYwMzUsNDYwMzgsNDYwNDAsNDYwNDIsNDYwNDQsNDYwNDYsNDYwNDcsNDYwNDksNDYwNTAsNDYwNTEsNDYwNTMsNDYwNTQsNDYwNTUsNDYwNTcsNDYwNTgsNDYwNTksNDYwNjAsNDYwNjEsNDYwNjIsNDYwNjMsNDYwNjQsNDYwNjUsNDYwNjYsNDYwNjcsNDYwNjgsNDYwNjksNDYwNzAsNDYwNzEsNDYwNzIsNDYwNzMsNDYwNzQsNDYwNzUsNDYwNzcsNDYwNzgsNDYwNzksNDYwODAsNDYwODEsNDYwODIsNDYwODMsNDYwODQsNDYwODUsNDYwODYsNDYwODcsNDYwODgsNDYwODksNDYwOTAsNDYwOTEsNDYwOTIsNDYwOTMsNDYwOTQsNDYwOTUsNDYwOTcsNDYwOTgsNDYwOTksNDYxMDAsNDYxMDEsNDYxMDIsNDYxMDMsNDYxMDUsNDYxMDYsNDYxMDcsNDYxMDksNDYxMTAsNDYxMTEsNDYxMTMsNDYxMTQsNDYxMTUsNDYxMTYsNDYxMTcsNDYxMTgsNDYxMTksNDYxMjIsNDYxMjQsNDYxMjUsNDYxMjYsNDYxMjcsNDYxMjgsNDYxMjksNDYxMzAsNDYxMzEsNDYxMzMsNDYxMzQsNDYxMzUsNDYxMzYsNDYxMzcsNDYxMzgsNDYxMzksNDYxNDAsNDYxNDEsNDYxNDIsNDYxNDMsNDYxNDQsNDYxNDUsNDYxNDYsNDYxNDcsNDYxNDgsNDYxNDksNDYxNTAsNDYxNTEsNDYxNTIsNDYxNTMsNDYxNTQsNDYxNTUsNDYxNTYsNDYxNTcsNDYxNTgsNDYxNTksNDYxNjIsNDYxNjMsNDYxNjUsNDYxNjYsNDYxNjcsNDYxNjksNDYxNzAsNDYxNzEsNDYxNzIsNDYxNzMsNDYxNzQsNDYxNzUsNDYxNzgsNDYxODAsNDYxODIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDYxODMsNDYxODQsNDYxODUsNDYxODYsNDYxODcsNDYxODksNDYxOTAsNDYxOTEsNDYxOTIsNDYxOTMsNDYxOTQsNDYxOTUsNDYxOTYsNDYxOTcsNDYxOTgsNDYxOTksNDYyMDAsNDYyMDEsNDYyMDIsNDYyMDMsNDYyMDQsNDYyMDUsNDYyMDYsNDYyMDcsNDYyMDksNDYyMTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDYyMTEsNDYyMTIsNDYyMTMsNDYyMTQsNDYyMTUsNDYyMTcsNDYyMTgsNDYyMTksNDYyMjAsNDYyMjEsNDYyMjIsNDYyMjMsNDYyMjQsNDYyMjUsNDYyMjYsNDYyMjcsNDYyMjgsNDYyMjksNDYyMzAsNDYyMzEsNDYyMzIsNDYyMzMsNDYyMzQsNDYyMzUsNDYyMzYsNDYyMzgsNDYyMzksNDYyNDAsNDYyNDEsNDYyNDIsNDYyNDMsNDYyNDUsNDYyNDYsNDYyNDcsNDYyNDksNDYyNTAsNDYyNTEsNDYyNTMsNDYyNTQsNDYyNTUsNDYyNTYsNDYyNTcsNDYyNTgsNDYyNTksNDYyNjAsNDYyNjIsNDYyNjQsNDYyNjYsNDYyNjcsNDYyNjgsNDYyNjksNDYyNzAsNDYyNzEsNDYyNzMsNDYyNzQsNDYyNzUsNDYyNzcsNDYyNzgsNDYyNzksNDYyODEsNDYyODIsNDYyODMsNDYyODQsNDYyODUsNDYyODYsNDYyODcsNDYyODksNDYyOTAsNDYyOTEsNDYyOTIsNDYyOTQsNDYyOTUsNDYyOTYsNDYyOTcsNDYyOTgsNDYyOTksNDYzMDIsNDYzMDMsNDYzMDUsNDYzMDYsNDYzMDksNDYzMTEsNDYzMTIsNDYzMTMsNDYzMTQsNDYzMTUsNDYzMTgsNDYzMjAsNDYzMjIsNDYzMjMsNDYzMjQsNDYzMjUsNDYzMjYsNDYzMjcsNDYzMjksNDYzMzAsNDYzMzEsNDYzMzIsNDYzMzMsNDYzMzQsNDYzMzUsNDYzMzYsNDYzMzcsNDYzMzgsNDYzMzksNDYzNDAsNDYzNDEsNDYzNDIsNDYzNDMsNDYzNDQsNDYzNDUsNDYzNDYsNDYzNDcsNDYzNDgsNDYzNDksNDYzNTAsNDYzNTEsNDYzNTIsNDYzNTMsNDYzNTQsNDYzNTUsNDYzNTgsNDYzNTksNDYzNjEsNDYzNjIsNDYzNjUsNDYzNjYsNDYzNjcsNDYzNjgsNDYzNjksNDYzNzAsNDYzNzEsNDYzNzQsNDYzNzksNDYzODAsNDYzODEsNDYzODIsNDYzODMsNDYzODYsNDYzODcsNDYzODksNDYzOTAsNDYzOTEsNDYzOTMsNDYzOTQsNDYzOTUsNDYzOTYsNDYzOTcsNDYzOTgsNDYzOTksNDY0MDIsNDY0MDYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY0MDcsNDY0MDgsNDY0MDksNDY0MTAsNDY0MTQsNDY0MTUsNDY0MTcsNDY0MTgsNDY0MTksNDY0MjEsNDY0MjIsNDY0MjMsNDY0MjQsNDY0MjUsNDY0MjYsNDY0MjcsNDY0MzAsNDY0MzQsNDY0MzUsNDY0MzYsNDY0MzcsNDY0MzgsNDY0MzksNDY0NDAsNDY0NDEsNDY0NDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY0NDMsNDY0NDQsNDY0NDUsNDY0NDYsNDY0NDcsNDY0NDgsNDY0NDksNDY0NTAsNDY0NTEsNDY0NTIsNDY0NTMsNDY0NTQsNDY0NTUsNDY0NTYsNDY0NTcsNDY0NTgsNDY0NTksNDY0NjAsNDY0NjEsNDY0NjIsNDY0NjMsNDY0NjQsNDY0NjUsNDY0NjYsNDY0NjcsNDY0NjgsNDY0NjksNDY0NzAsNDY0NzEsNDY0NzIsNDY0NzMsNDY0NzQsNDY0NzUsNDY0NzYsNDY0NzcsNDY0NzgsNDY0NzksNDY0ODAsNDY0ODEsNDY0ODIsNDY0ODMsNDY0ODQsNDY0ODUsNDY0ODYsNDY0ODcsNDY0ODgsNDY0ODksNDY0OTAsNDY0OTEsNDY0OTIsNDY0OTMsNDY0OTQsNDY0OTUsNDY0OTgsNDY0OTksNDY1MDEsNDY1MDIsNDY1MDMsNDY1MDUsNDY1MDgsNDY1MDksNDY1MTAsNDY1MTEsNDY1MTQsNDY1MTgsNDY1MTksNDY1MjAsNDY1MjEsNDY1MjIsNDY1MjYsNDY1MjcsNDY1MjksNDY1MzAsNDY1MzEsNDY1MzMsNDY1MzQsNDY1MzUsNDY1MzYsNDY1MzcsNDY1MzgsNDY1MzksNDY1NDIsNDY1NDYsNDY1NDcsNDY1NDgsNDY1NDksNDY1NTAsNDY1NTEsNDY1NTMsNDY1NTQsNDY1NTUsNDY1NTYsNDY1NTcsNDY1NTgsNDY1NTksNDY1NjAsNDY1NjEsNDY1NjIsNDY1NjMsNDY1NjQsNDY1NjUsNDY1NjYsNDY1NjcsNDY1NjgsNDY1NjksNDY1NzAsNDY1NzEsNDY1NzMsNDY1NzQsNDY1NzUsNDY1NzYsNDY1NzcsNDY1NzgsNDY1NzksNDY1ODAsNDY1ODEsNDY1ODIsNDY1ODMsNDY1ODQsNDY1ODUsNDY1ODYsNDY1ODcsNDY1ODgsNDY1ODksNDY1OTAsNDY1OTEsNDY1OTIsNDY1OTMsNDY1OTQsNDY1OTUsNDY1OTYsNDY1OTcsNDY1OTgsNDY1OTksNDY2MDAsNDY2MDEsNDY2MDIsNDY2MDMsNDY2MDQsNDY2MDUsNDY2MDYsNDY2MDcsNDY2MTAsNDY2MTEsNDY2MTMsNDY2MTQsNDY2MTUsNDY2MTcsNDY2MTgsNDY2MTksNDY2MjAsNDY2MjEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY2MjIsNDY2MjMsNDY2MjQsNDY2MjUsNDY2MjYsNDY2MjcsNDY2MjgsNDY2MzAsNDY2MzEsNDY2MzIsNDY2MzMsNDY2MzQsNDY2MzUsNDY2MzcsNDY2MzgsNDY2MzksNDY2NDAsNDY2NDEsNDY2NDIsNDY2NDMsNDY2NDUsNDY2NDYsNDY2NDcsNDY2NDgsNDY2NDksNDY2NTAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY2NTEsNDY2NTIsNDY2NTMsNDY2NTQsNDY2NTUsNDY2NTYsNDY2NTcsNDY2NTgsNDY2NTksNDY2NjAsNDY2NjEsNDY2NjIsNDY2NjMsNDY2NjUsNDY2NjYsNDY2NjcsNDY2NjgsNDY2NjksNDY2NzAsNDY2NzEsNDY2NzIsNDY2NzMsNDY2NzQsNDY2NzUsNDY2NzYsNDY2NzcsNDY2NzgsNDY2NzksNDY2ODAsNDY2ODEsNDY2ODIsNDY2ODMsNDY2ODQsNDY2ODUsNDY2ODYsNDY2ODcsNDY2ODgsNDY2ODksNDY2OTAsNDY2OTEsNDY2OTMsNDY2OTQsNDY2OTUsNDY2OTcsNDY2OTgsNDY2OTksNDY3MDAsNDY3MDEsNDY3MDIsNDY3MDMsNDY3MDQsNDY3MDUsNDY3MDYsNDY3MDcsNDY3MDgsNDY3MDksNDY3MTAsNDY3MTEsNDY3MTIsNDY3MTMsNDY3MTQsNDY3MTUsNDY3MTYsNDY3MTcsNDY3MTgsNDY3MTksNDY3MjAsNDY3MjEsNDY3MjIsNDY3MjMsNDY3MjQsNDY3MjUsNDY3MjYsNDY3MjcsNDY3MjgsNDY3MjksNDY3MzAsNDY3MzEsNDY3MzIsNDY3MzMsNDY3MzQsNDY3MzUsNDY3MzYsNDY3MzcsNDY3MzgsNDY3MzksNDY3NDAsNDY3NDEsNDY3NDIsNDY3NDMsNDY3NDQsNDY3NDUsNDY3NDYsNDY3NDcsNDY3NTAsNDY3NTEsNDY3NTMsNDY3NTQsNDY3NTUsNDY3NTcsNDY3NTgsNDY3NTksNDY3NjAsNDY3NjEsNDY3NjIsNDY3NjUsNDY3NjYsNDY3NjcsNDY3NjgsNDY3NzAsNDY3NzEsNDY3NzIsNDY3NzMsNDY3NzQsNDY3NzUsNDY3NzYsNDY3NzcsNDY3NzgsNDY3NzksNDY3ODAsNDY3ODEsNDY3ODIsNDY3ODMsNDY3ODQsNDY3ODUsNDY3ODYsNDY3ODcsNDY3ODgsNDY3ODksNDY3OTAsNDY3OTEsNDY3OTIsNDY3OTMsNDY3OTQsNDY3OTUsNDY3OTYsNDY3OTcsNDY3OTgsNDY3OTksNDY4MDAsNDY4MDEsNDY4MDIsNDY4MDMsNDY4MDUsNDY4MDYsNDY4MDcsNDY4MDgsNDY4MDksNDY4MTAsNDY4MTEsNDY4MTIsNDY4MTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY4MTQsNDY4MTUsNDY4MTYsNDY4MTcsNDY4MTgsNDY4MTksNDY4MjAsNDY4MjEsNDY4MjIsNDY4MjMsNDY4MjQsNDY4MjUsNDY4MjYsNDY4MjcsNDY4MjgsNDY4MjksNDY4MzAsNDY4MzEsNDY4MzMsNDY4MzQsNDY4MzUsNDY4MzcsNDY4MzgsNDY4MzksNDY4NDEsNDY4NDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDY4NDMsNDY4NDQsNDY4NDUsNDY4NDYsNDY4NDcsNDY4NTAsNDY4NTEsNDY4NTIsNDY4NTQsNDY4NTUsNDY4NTYsNDY4NTcsNDY4NTgsNDY4NTksNDY4NjAsNDY4NjEsNDY4NjIsNDY4NjMsNDY4NjQsNDY4NjUsNDY4NjYsNDY4NjcsNDY4NjgsNDY4NjksNDY4NzAsNDY4NzEsNDY4NzIsNDY4NzMsNDY4NzQsNDY4NzUsNDY4NzYsNDY4NzcsNDY4NzgsNDY4NzksNDY4ODAsNDY4ODEsNDY4ODIsNDY4ODMsNDY4ODQsNDY4ODUsNDY4ODYsNDY4ODcsNDY4OTAsNDY4OTEsNDY4OTMsNDY4OTQsNDY4OTcsNDY4OTgsNDY4OTksNDY5MDAsNDY5MDEsNDY5MDIsNDY5MDMsNDY5MDYsNDY5MDgsNDY5MDksNDY5MTAsNDY5MTEsNDY5MTIsNDY5MTMsNDY5MTQsNDY5MTUsNDY5MTcsNDY5MTgsNDY5MTksNDY5MjEsNDY5MjIsNDY5MjMsNDY5MjUsNDY5MjYsNDY5MjcsNDY5MjgsNDY5MjksNDY5MzAsNDY5MzEsNDY5MzQsNDY5MzUsNDY5MzYsNDY5MzcsNDY5MzgsNDY5MzksNDY5NDAsNDY5NDEsNDY5NDIsNDY5NDMsNDY5NDUsNDY5NDYsNDY5NDcsNDY5NDksNDY5NTAsNDY5NTEsNDY5NTMsNDY5NTQsNDY5NTUsNDY5NTYsNDY5NTcsNDY5NTgsNDY5NTksNDY5NjIsNDY5NjQsNDY5NjYsNDY5NjcsNDY5NjgsNDY5NjksNDY5NzAsNDY5NzEsNDY5NzQsNDY5NzUsNDY5NzcsNDY5NzgsNDY5NzksNDY5ODEsNDY5ODIsNDY5ODMsNDY5ODQsNDY5ODUsNDY5ODYsNDY5ODcsNDY5OTAsNDY5OTUsNDY5OTYsNDY5OTcsNDcwMDIsNDcwMDMsNDcwMDUsNDcwMDYsNDcwMDcsNDcwMDksNDcwMTAsNDcwMTEsNDcwMTIsNDcwMTMsNDcwMTQsNDcwMTUsNDcwMTgsNDcwMjIsNDcwMjMsNDcwMjQsNDcwMjUsNDcwMjYsNDcwMjcsNDcwMzAsNDcwMzEsNDcwMzMsNDcwMzQsNDcwMzUsNDcwMzYsNDcwMzcsNDcwMzgsNDcwMzksNDcwNDAsNDcwNDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcwNDIsNDcwNDMsNDcwNDQsNDcwNDUsNDcwNDYsNDcwNDgsNDcwNTAsNDcwNTEsNDcwNTIsNDcwNTMsNDcwNTQsNDcwNTUsNDcwNTYsNDcwNTcsNDcwNTgsNDcwNTksNDcwNjAsNDcwNjEsNDcwNjIsNDcwNjMsNDcwNjQsNDcwNjUsNDcwNjYsNDcwNjcsNDcwNjgsNDcwNjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcwNzAsNDcwNzEsNDcwNzIsNDcwNzMsNDcwNzQsNDcwNzUsNDcwNzYsNDcwNzcsNDcwNzgsNDcwNzksNDcwODAsNDcwODEsNDcwODIsNDcwODMsNDcwODYsNDcwODcsNDcwODksNDcwOTAsNDcwOTEsNDcwOTMsNDcwOTQsNDcwOTUsNDcwOTYsNDcwOTcsNDcwOTgsNDcwOTksNDcxMDIsNDcxMDYsNDcxMDcsNDcxMDgsNDcxMDksNDcxMTAsNDcxMTQsNDcxMTUsNDcxMTcsNDcxMTgsNDcxMTksNDcxMjEsNDcxMjIsNDcxMjMsNDcxMjQsNDcxMjUsNDcxMjYsNDcxMjcsNDcxMzAsNDcxMzIsNDcxMzQsNDcxMzUsNDcxMzYsNDcxMzcsNDcxMzgsNDcxMzksNDcxNDIsNDcxNDMsNDcxNDUsNDcxNDYsNDcxNDcsNDcxNDksNDcxNTAsNDcxNTEsNDcxNTIsNDcxNTMsNDcxNTQsNDcxNTUsNDcxNTgsNDcxNjIsNDcxNjMsNDcxNjQsNDcxNjUsNDcxNjYsNDcxNjcsNDcxNjksNDcxNzAsNDcxNzEsNDcxNzMsNDcxNzQsNDcxNzUsNDcxNzYsNDcxNzcsNDcxNzgsNDcxNzksNDcxODAsNDcxODEsNDcxODIsNDcxODMsNDcxODQsNDcxODYsNDcxODgsNDcxODksNDcxOTAsNDcxOTEsNDcxOTIsNDcxOTMsNDcxOTQsNDcxOTUsNDcxOTgsNDcxOTksNDcyMDEsNDcyMDIsNDcyMDMsNDcyMDUsNDcyMDYsNDcyMDcsNDcyMDgsNDcyMDksNDcyMTAsNDcyMTEsNDcyMTQsNDcyMTYsNDcyMTgsNDcyMTksNDcyMjAsNDcyMjEsNDcyMjIsNDcyMjMsNDcyMjUsNDcyMjYsNDcyMjcsNDcyMjksNDcyMzAsNDcyMzEsNDcyMzIsNDcyMzMsNDcyMzQsNDcyMzUsNDcyMzYsNDcyMzcsNDcyMzgsNDcyMzksNDcyNDAsNDcyNDEsNDcyNDIsNDcyNDMsNDcyNDQsNDcyNDYsNDcyNDcsNDcyNDgsNDcyNDksNDcyNTAsNDcyNTEsNDcyNTIsNDcyNTMsNDcyNTQsNDcyNTUsNDcyNTYsNDcyNTcsNDcyNTgsNDcyNTksNDcyNjAsNDcyNjEsNDcyNjIsNDcyNjMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcyNjQsNDcyNjUsNDcyNjYsNDcyNjcsNDcyNjgsNDcyNjksNDcyNzAsNDcyNzEsNDcyNzMsNDcyNzQsNDcyNzUsNDcyNzYsNDcyNzcsNDcyNzgsNDcyNzksNDcyODEsNDcyODIsNDcyODMsNDcyODUsNDcyODYsNDcyODcsNDcyODksNDcyOTAsNDcyOTEsNDcyOTIsNDcyOTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDcyOTQsNDcyOTUsNDcyOTgsNDczMDAsNDczMDIsNDczMDMsNDczMDQsNDczMDUsNDczMDYsNDczMDcsNDczMDksNDczMTAsNDczMTEsNDczMTMsNDczMTQsNDczMTUsNDczMTcsNDczMTgsNDczMTksNDczMjAsNDczMjEsNDczMjIsNDczMjMsNDczMjQsNDczMjYsNDczMjgsNDczMzAsNDczMzEsNDczMzIsNDczMzMsNDczMzQsNDczMzUsNDczMzgsNDczMzksNDczNDEsNDczNDIsNDczNDMsNDczNDUsNDczNDYsNDczNDcsNDczNDgsNDczNDksNDczNTAsNDczNTEsNDczNTQsNDczNTYsNDczNTgsNDczNTksNDczNjAsNDczNjEsNDczNjIsNDczNjMsNDczNjUsNDczNjYsNDczNjcsNDczNjgsNDczNjksNDczNzAsNDczNzEsNDczNzIsNDczNzMsNDczNzQsNDczNzUsNDczNzYsNDczNzcsNDczNzgsNDczNzksNDczODAsNDczODEsNDczODIsNDczODMsNDczODUsNDczODYsNDczODcsNDczODgsNDczODksNDczOTAsNDczOTEsNDczOTMsNDczOTQsNDczOTUsNDczOTYsNDczOTcsNDczOTgsNDczOTksNDc0MDAsNDc0MDEsNDc0MDIsNDc0MDMsNDc0MDQsNDc0MDUsNDc0MDYsNDc0MDcsNDc0MDgsNDc0MDksNDc0MTAsNDc0MTEsNDc0MTIsNDc0MTMsNDc0MTQsNDc0MTUsNDc0MTYsNDc0MTcsNDc0MTgsNDc0MTksNDc0MjIsNDc0MjMsNDc0MjUsNDc0MjYsNDc0MjcsNDc0MjksNDc0MzAsNDc0MzEsNDc0MzIsNDc0MzMsNDc0MzQsNDc0MzUsNDc0MzcsNDc0MzgsNDc0NDAsNDc0NDIsNDc0NDMsNDc0NDQsNDc0NDUsNDc0NDYsNDc0NDcsNDc0NTAsNDc0NTEsNDc0NTMsNDc0NTQsNDc0NTUsNDc0NTcsNDc0NTgsNDc0NTksNDc0NjAsNDc0NjEsNDc0NjIsNDc0NjMsNDc0NjYsNDc0NjgsNDc0NzAsNDc0NzEsNDc0NzIsNDc0NzMsNDc0NzQsNDc0NzUsNDc0NzgsNDc0NzksNDc0ODEsNDc0ODIsNDc0ODMsNDc0ODUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc0ODYsNDc0ODcsNDc0ODgsNDc0ODksNDc0OTAsNDc0OTEsNDc0OTQsNDc0OTYsNDc0OTksNDc1MDAsNDc1MDMsNDc1MDQsNDc1MDUsNDc1MDYsNDc1MDcsNDc1MDgsNDc1MDksNDc1MTAsNDc1MTEsNDc1MTIsNDc1MTMsNDc1MTQsNDc1MTUsNDc1MTYsNDc1MTcsNDc1MTgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc1MTksNDc1MjAsNDc1MjEsNDc1MjIsNDc1MjMsNDc1MjQsNDc1MjUsNDc1MjYsNDc1MjcsNDc1MjgsNDc1MjksNDc1MzAsNDc1MzEsNDc1MzQsNDc1MzUsNDc1MzcsNDc1MzgsNDc1MzksNDc1NDEsNDc1NDIsNDc1NDMsNDc1NDQsNDc1NDUsNDc1NDYsNDc1NDcsNDc1NTAsNDc1NTIsNDc1NTQsNDc1NTUsNDc1NTYsNDc1NTcsNDc1NTgsNDc1NTksNDc1NjIsNDc1NjMsNDc1NjUsNDc1NzEsNDc1NzIsNDc1NzMsNDc1NzQsNDc1NzUsNDc1NzgsNDc1ODAsNDc1ODMsNDc1ODQsNDc1ODYsNDc1OTAsNDc1OTEsNDc1OTMsNDc1OTQsNDc1OTUsNDc1OTcsNDc1OTgsNDc1OTksNDc2MDAsNDc2MDEsNDc2MDIsNDc2MDMsNDc2MDYsNDc2MTEsNDc2MTIsNDc2MTMsNDc2MTQsNDc2MTUsNDc2MTgsNDc2MTksNDc2MjAsNDc2MjEsNDc2MjIsNDc2MjMsNDc2MjUsNDc2MjYsNDc2MjcsNDc2MjgsNDc2MjksNDc2MzAsNDc2MzEsNDc2MzIsNDc2MzMsNDc2MzQsNDc2MzUsNDc2MzYsNDc2MzgsNDc2MzksNDc2NDAsNDc2NDEsNDc2NDIsNDc2NDMsNDc2NDQsNDc2NDUsNDc2NDYsNDc2NDcsNDc2NDgsNDc2NDksNDc2NTAsNDc2NTEsNDc2NTIsNDc2NTMsNDc2NTQsNDc2NTUsNDc2NTYsNDc2NTcsNDc2NTgsNDc2NTksNDc2NjAsNDc2NjEsNDc2NjIsNDc2NjMsNDc2NjQsNDc2NjUsNDc2NjYsNDc2NjcsNDc2NjgsNDc2NjksNDc2NzAsNDc2NzEsNDc2NzQsNDc2NzUsNDc2NzcsNDc2NzgsNDc2NzksNDc2ODEsNDc2ODMsNDc2ODQsNDc2ODUsNDc2ODYsNDc2ODcsNDc2OTAsNDc2OTIsNDc2OTUsNDc2OTYsNDc2OTcsNDc2OTgsNDc3MDIsNDc3MDMsNDc3MDUsNDc3MDYsNDc3MDcsNDc3MDksNDc3MTAsNDc3MTEsNDc3MTIsNDc3MTMsNDc3MTQsNDc3MTUsNDc3MTgsNDc3MjIsNDc3MjMsNDc3MjQsNDc3MjUsNDc3MjYsNDc3MjcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc3MzAsNDc3MzEsNDc3MzMsNDc3MzQsNDc3MzUsNDc3MzcsNDc3MzgsNDc3MzksNDc3NDAsNDc3NDEsNDc3NDIsNDc3NDMsNDc3NDQsNDc3NDUsNDc3NDYsNDc3NTAsNDc3NTIsNDc3NTMsNDc3NTQsNDc3NTUsNDc3NTcsNDc3NTgsNDc3NTksNDc3NjAsNDc3NjEsNDc3NjIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc3NjMsNDc3NjQsNDc3NjUsNDc3NjYsNDc3NjcsNDc3NjgsNDc3NjksNDc3NzAsNDc3NzEsNDc3NzIsNDc3NzMsNDc3NzQsNDc3NzUsNDc3NzYsNDc3NzcsNDc3NzgsNDc3NzksNDc3ODAsNDc3ODEsNDc3ODIsNDc3ODMsNDc3ODYsNDc3ODksNDc3OTAsNDc3OTEsNDc3OTMsNDc3OTUsNDc3OTYsNDc3OTcsNDc3OTgsNDc3OTksNDc4MDIsNDc4MDQsNDc4MDYsNDc4MDcsNDc4MDgsNDc4MDksNDc4MTAsNDc4MTEsNDc4MTMsNDc4MTQsNDc4MTUsNDc4MTcsNDc4MTgsNDc4MTksNDc4MjAsNDc4MjEsNDc4MjIsNDc4MjMsNDc4MjQsNDc4MjUsNDc4MjYsNDc4MjcsNDc4MjgsNDc4MjksNDc4MzAsNDc4MzEsNDc4MzQsNDc4MzUsNDc4MzYsNDc4MzcsNDc4MzgsNDc4MzksNDc4NDAsNDc4NDEsNDc4NDIsNDc4NDMsNDc4NDQsNDc4NDUsNDc4NDYsNDc4NDcsNDc4NDgsNDc4NDksNDc4NTAsNDc4NTEsNDc4NTIsNDc4NTMsNDc4NTQsNDc4NTUsNDc4NTYsNDc4NTcsNDc4NTgsNDc4NTksNDc4NjAsNDc4NjEsNDc4NjIsNDc4NjMsNDc4NjQsNDc4NjUsNDc4NjYsNDc4NjcsNDc4NjksNDc4NzAsNDc4NzEsNDc4NzMsNDc4NzQsNDc4NzUsNDc4NzcsNDc4NzgsNDc4NzksNDc4ODAsNDc4ODEsNDc4ODIsNDc4ODMsNDc4ODQsNDc4ODYsNDc4ODgsNDc4OTAsNDc4OTEsNDc4OTIsNDc4OTMsNDc4OTQsNDc4OTUsNDc4OTcsNDc4OTgsNDc4OTksNDc5MDEsNDc5MDIsNDc5MDMsNDc5MDUsNDc5MDYsNDc5MDcsNDc5MDgsNDc5MDksNDc5MTAsNDc5MTEsNDc5MTIsNDc5MTQsNDc5MTYsNDc5MTcsNDc5MTgsNDc5MTksNDc5MjAsNDc5MjEsNDc5MjIsNDc5MjMsNDc5MjcsNDc5MjksNDc5MzAsNDc5MzUsNDc5MzYsNDc5MzcsNDc5MzgsNDc5MzksNDc5NDIsNDc5NDQsNDc5NDYsNDc5NDcsNDc5NDgsNDc5NTAsNDc5NTMsNDc5NTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc5NTUsNDc5NTcsNDc5NTgsNDc5NTksNDc5NjEsNDc5NjIsNDc5NjMsNDc5NjQsNDc5NjUsNDc5NjYsNDc5NjcsNDc5NjgsNDc5NzAsNDc5NzIsNDc5NzMsNDc5NzQsNDc5NzUsNDc5NzYsNDc5NzcsNDc5NzgsNDc5NzksNDc5ODEsNDc5ODIsNDc5ODMsNDc5ODQsNDc5ODUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDc5ODYsNDc5ODcsNDc5ODgsNDc5ODksNDc5OTAsNDc5OTEsNDc5OTIsNDc5OTMsNDc5OTQsNDc5OTUsNDc5OTYsNDc5OTcsNDc5OTgsNDc5OTksNDgwMDAsNDgwMDEsNDgwMDIsNDgwMDMsNDgwMDQsNDgwMDUsNDgwMDYsNDgwMDcsNDgwMDksNDgwMTAsNDgwMTEsNDgwMTMsNDgwMTQsNDgwMTUsNDgwMTcsNDgwMTgsNDgwMTksNDgwMjAsNDgwMjEsNDgwMjIsNDgwMjMsNDgwMjQsNDgwMjUsNDgwMjYsNDgwMjcsNDgwMjgsNDgwMjksNDgwMzAsNDgwMzEsNDgwMzIsNDgwMzMsNDgwMzQsNDgwMzUsNDgwMzcsNDgwMzgsNDgwMzksNDgwNDEsNDgwNDIsNDgwNDMsNDgwNDUsNDgwNDYsNDgwNDcsNDgwNDgsNDgwNDksNDgwNTAsNDgwNTEsNDgwNTMsNDgwNTQsNDgwNTYsNDgwNTcsNDgwNTgsNDgwNTksNDgwNjAsNDgwNjEsNDgwNjIsNDgwNjMsNDgwNjUsNDgwNjYsNDgwNjcsNDgwNjksNDgwNzAsNDgwNzEsNDgwNzMsNDgwNzQsNDgwNzUsNDgwNzYsNDgwNzcsNDgwNzgsNDgwNzksNDgwODEsNDgwODIsNDgwODQsNDgwODUsNDgwODYsNDgwODcsNDgwODgsNDgwODksNDgwOTAsNDgwOTEsNDgwOTIsNDgwOTMsNDgwOTQsNDgwOTUsNDgwOTYsNDgwOTcsNDgwOTgsNDgwOTksNDgxMDAsNDgxMDEsNDgxMDIsNDgxMDMsNDgxMDQsNDgxMDUsNDgxMDYsNDgxMDcsNDgxMDgsNDgxMDksNDgxMTAsNDgxMTEsNDgxMTIsNDgxMTMsNDgxMTQsNDgxMTUsNDgxMTYsNDgxMTcsNDgxMTgsNDgxMTksNDgxMjIsNDgxMjMsNDgxMjUsNDgxMjYsNDgxMjksNDgxMzEsNDgxMzIsNDgxMzMsNDgxMzQsNDgxMzUsNDgxMzgsNDgxNDIsNDgxNDQsNDgxNDYsNDgxNDcsNDgxNTMsNDgxNTQsNDgxNjAsNDgxNjEsNDgxNjIsNDgxNjMsNDgxNjYsNDgxNjgsNDgxNzAsNDgxNzEsNDgxNzIsNDgxNzQsNDgxNzUsNDgxNzgsNDgxNzksNDgxODEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDgxODIsNDgxODMsNDgxODUsNDgxODYsNDgxODcsNDgxODgsNDgxODksNDgxOTAsNDgxOTEsNDgxOTQsNDgxOTgsNDgxOTksNDgyMDAsNDgyMDIsNDgyMDMsNDgyMDYsNDgyMDcsNDgyMDksNDgyMTAsNDgyMTEsNDgyMTIsNDgyMTMsNDgyMTQsNDgyMTUsNDgyMTYsNDgyMTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDgyMTgsNDgyMTksNDgyMjAsNDgyMjIsNDgyMjMsNDgyMjQsNDgyMjUsNDgyMjYsNDgyMjcsNDgyMjgsNDgyMjksNDgyMzAsNDgyMzEsNDgyMzIsNDgyMzMsNDgyMzQsNDgyMzUsNDgyMzYsNDgyMzcsNDgyMzgsNDgyMzksNDgyNDAsNDgyNDEsNDgyNDIsNDgyNDMsNDgyNDQsNDgyNDUsNDgyNDYsNDgyNDcsNDgyNDgsNDgyNDksNDgyNTAsNDgyNTEsNDgyNTIsNDgyNTMsNDgyNTQsNDgyNTUsNDgyNTYsNDgyNTcsNDgyNTgsNDgyNTksNDgyNjIsNDgyNjMsNDgyNjUsNDgyNjYsNDgyNjksNDgyNzEsNDgyNzIsNDgyNzMsNDgyNzQsNDgyNzUsNDgyNzgsNDgyODAsNDgyODMsNDgyODQsNDgyODUsNDgyODYsNDgyODcsNDgyOTAsNDgyOTEsNDgyOTMsNDgyOTQsNDgyOTcsNDgyOTgsNDgyOTksNDgzMDAsNDgzMDEsNDgzMDIsNDgzMDMsNDgzMDYsNDgzMTAsNDgzMTEsNDgzMTIsNDgzMTMsNDgzMTQsNDgzMTUsNDgzMTgsNDgzMTksNDgzMjEsNDgzMjIsNDgzMjMsNDgzMjUsNDgzMjYsNDgzMjcsNDgzMjgsNDgzMjksNDgzMzAsNDgzMzEsNDgzMzIsNDgzMzQsNDgzMzgsNDgzMzksNDgzNDAsNDgzNDIsNDgzNDMsNDgzNDUsNDgzNDYsNDgzNDcsNDgzNDksNDgzNTAsNDgzNTEsNDgzNTIsNDgzNTMsNDgzNTQsNDgzNTUsNDgzNTYsNDgzNTcsNDgzNTgsNDgzNTksNDgzNjAsNDgzNjEsNDgzNjIsNDgzNjMsNDgzNjQsNDgzNjUsNDgzNjYsNDgzNjcsNDgzNjgsNDgzNjksNDgzNzAsNDgzNzEsNDgzNzUsNDgzNzcsNDgzNzgsNDgzNzksNDgzODEsNDgzODIsNDgzODMsNDgzODQsNDgzODUsNDgzODYsNDgzODcsNDgzOTAsNDgzOTIsNDgzOTQsNDgzOTUsNDgzOTYsNDgzOTcsNDgzOTgsNDgzOTksNDg0MDEsNDg0MDIsNDg0MDMsNDg0MDUsNDg0MDYsNDg0MDcsNDg0MDgsNDg0MDksNDg0MTAsNDg0MTEsNDg0MTIsNDg0MTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg0MTQsNDg0MTUsNDg0MTYsNDg0MTcsNDg0MTgsNDg0MTksNDg0MjEsNDg0MjIsNDg0MjMsNDg0MjQsNDg0MjUsNDg0MjYsNDg0MjcsNDg0MjksNDg0MzAsNDg0MzEsNDg0MzIsNDg0MzMsNDg0MzQsNDg0MzUsNDg0MzYsNDg0MzcsNDg0MzgsNDg0MzksNDg0NDAsNDg0NDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg0NDIsNDg0NDMsNDg0NDQsNDg0NDUsNDg0NDYsNDg0NDcsNDg0NDksNDg0NTAsNDg0NTEsNDg0NTIsNDg0NTMsNDg0NTQsNDg0NTUsNDg0NTgsNDg0NTksNDg0NjEsNDg0NjIsNDg0NjMsNDg0NjUsNDg0NjYsNDg0NjcsNDg0NjgsNDg0NjksNDg0NzAsNDg0NzEsNDg0NzQsNDg0NzUsNDg0NzYsNDg0NzcsNDg0NzgsNDg0NzksNDg0ODAsNDg0ODEsNDg0ODIsNDg0ODMsNDg0ODUsNDg0ODYsNDg0ODcsNDg0ODksNDg0OTAsNDg0OTEsNDg0OTIsNDg0OTMsNDg0OTQsNDg0OTUsNDg0OTYsNDg0OTcsNDg0OTgsNDg0OTksNDg1MDAsNDg1MDEsNDg1MDIsNDg1MDMsNDg1MDQsNDg1MDUsNDg1MDYsNDg1MDcsNDg1MDgsNDg1MDksNDg1MTAsNDg1MTEsNDg1MTQsNDg1MTUsNDg1MTcsNDg1MTgsNDg1MjMsNDg1MjQsNDg1MjUsNDg1MjYsNDg1MjcsNDg1MzAsNDg1MzIsNDg1MzQsNDg1MzUsNDg1MzYsNDg1MzksNDg1NDEsNDg1NDIsNDg1NDMsNDg1NDQsNDg1NDUsNDg1NDYsNDg1NDcsNDg1NDksNDg1NTAsNDg1NTEsNDg1NTIsNDg1NTMsNDg1NTQsNDg1NTUsNDg1NTYsNDg1NTcsNDg1NTgsNDg1NTksNDg1NjEsNDg1NjIsNDg1NjMsNDg1NjQsNDg1NjUsNDg1NjYsNDg1NjcsNDg1NjksNDg1NzAsNDg1NzEsNDg1NzIsNDg1NzMsNDg1NzQsNDg1NzUsNDg1NzYsNDg1NzcsNDg1NzgsNDg1NzksNDg1ODAsNDg1ODEsNDg1ODIsNDg1ODMsNDg1ODQsNDg1ODUsNDg1ODYsNDg1ODcsNDg1ODgsNDg1ODksNDg1OTAsNDg1OTEsNDg1OTIsNDg1OTMsNDg1OTQsNDg1OTUsNDg1OTgsNDg1OTksNDg2MDEsNDg2MDIsNDg2MDMsNDg2MDUsNDg2MDYsNDg2MDcsNDg2MDgsNDg2MDksNDg2MTAsNDg2MTEsNDg2MTIsNDg2MTMsNDg2MTQsNDg2MTUsNDg2MTYsNDg2MTgsNDg2MTksNDg2MjAsNDg2MjEsNDg2MjIsNDg2MjMsNDg2MjUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg2MjYsNDg2MjcsNDg2MjksNDg2MzAsNDg2MzEsNDg2MzMsNDg2MzQsNDg2MzUsNDg2MzYsNDg2MzcsNDg2MzgsNDg2MzksNDg2NDEsNDg2NDIsNDg2NDQsNDg2NDYsNDg2NDcsNDg2NDgsNDg2NDksNDg2NTAsNDg2NTEsNDg2NTQsNDg2NTUsNDg2NTcsNDg2NTgsNDg2NTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg2NjEsNDg2NjIsNDg2NjMsNDg2NjQsNDg2NjUsNDg2NjYsNDg2NjcsNDg2NzAsNDg2NzIsNDg2NzMsNDg2NzQsNDg2NzUsNDg2NzYsNDg2NzcsNDg2NzgsNDg2NzksNDg2ODAsNDg2ODEsNDg2ODIsNDg2ODMsNDg2ODQsNDg2ODUsNDg2ODYsNDg2ODcsNDg2ODgsNDg2ODksNDg2OTAsNDg2OTEsNDg2OTIsNDg2OTMsNDg2OTQsNDg2OTUsNDg2OTYsNDg2OTcsNDg2OTgsNDg2OTksNDg3MDAsNDg3MDEsNDg3MDIsNDg3MDMsNDg3MDQsNDg3MDUsNDg3MDYsNDg3MDcsNDg3MTAsNDg3MTEsNDg3MTMsNDg3MTQsNDg3MTUsNDg3MTcsNDg3MTksNDg3MjAsNDg3MjEsNDg3MjIsNDg3MjMsNDg3MjYsNDg3MjgsNDg3MzIsNDg3MzMsNDg3MzQsNDg3MzUsNDg3MzgsNDg3MzksNDg3NDEsNDg3NDIsNDg3NDMsNDg3NDUsNDg3NDcsNDg3NDgsNDg3NDksNDg3NTAsNDg3NTEsNDg3NTQsNDg3NTgsNDg3NTksNDg3NjAsNDg3NjEsNDg3NjIsNDg3NjYsNDg3NjcsNDg3NjksNDg3NzAsNDg3NzEsNDg3NzMsNDg3NzQsNDg3NzUsNDg3NzYsNDg3NzcsNDg3NzgsNDg3NzksNDg3ODIsNDg3ODYsNDg3ODcsNDg3ODgsNDg3ODksNDg3OTAsNDg3OTEsNDg3OTQsNDg3OTUsNDg3OTYsNDg3OTcsNDg3OTgsNDg3OTksNDg4MDAsNDg4MDEsNDg4MDIsNDg4MDMsNDg4MDQsNDg4MDUsNDg4MDYsNDg4MDcsNDg4MDksNDg4MTAsNDg4MTEsNDg4MTIsNDg4MTMsNDg4MTQsNDg4MTUsNDg4MTYsNDg4MTcsNDg4MTgsNDg4MTksNDg4MjAsNDg4MjEsNDg4MjIsNDg4MjMsNDg4MjQsNDg4MjUsNDg4MjYsNDg4MjcsNDg4MjgsNDg4MjksNDg4MzAsNDg4MzEsNDg4MzIsNDg4MzMsNDg4MzQsNDg4MzUsNDg4MzYsNDg4MzcsNDg4MzgsNDg4MzksNDg4NDAsNDg4NDEsNDg4NDIsNDg4NDMsNDg4NDQsNDg4NDUsNDg4NDYsNDg4NDcsNDg4NTAsNDg4NTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg4NTMsNDg4NTQsNDg4NTcsNDg4NTgsNDg4NTksNDg4NjAsNDg4NjEsNDg4NjIsNDg4NjMsNDg4NjUsNDg4NjYsNDg4NzAsNDg4NzEsNDg4NzIsNDg4NzMsNDg4NzQsNDg4NzUsNDg4NzcsNDg4NzgsNDg4NzksNDg4ODAsNDg4ODEsNDg4ODIsNDg4ODMsNDg4ODQsNDg4ODUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDg4ODYsNDg4ODcsNDg4ODgsNDg4ODksNDg4OTAsNDg4OTEsNDg4OTIsNDg4OTMsNDg4OTQsNDg4OTUsNDg4OTYsNDg4OTgsNDg4OTksNDg5MDAsNDg5MDEsNDg5MDIsNDg5MDMsNDg5MDYsNDg5MDcsNDg5MDgsNDg5MDksNDg5MTAsNDg5MTEsNDg5MTIsNDg5MTMsNDg5MTQsNDg5MTUsNDg5MTYsNDg5MTcsNDg5MTgsNDg5MTksNDg5MjIsNDg5MjYsNDg5MjcsNDg5MjgsNDg5MjksNDg5MzAsNDg5MzEsNDg5MzIsNDg5MzMsNDg5MzQsNDg5MzUsNDg5MzYsNDg5MzcsNDg5MzgsNDg5MzksNDg5NDAsNDg5NDEsNDg5NDIsNDg5NDMsNDg5NDQsNDg5NDUsNDg5NDYsNDg5NDcsNDg5NDgsNDg5NDksNDg5NTAsNDg5NTEsNDg5NTIsNDg5NTMsNDg5NTQsNDg5NTUsNDg5NTYsNDg5NTcsNDg5NTgsNDg5NTksNDg5NjIsNDg5NjMsNDg5NjUsNDg5NjYsNDg5NjcsNDg5NjksNDg5NzAsNDg5NzEsNDg5NzIsNDg5NzMsNDg5NzQsNDg5NzUsNDg5NzgsNDg5NzksNDg5ODAsNDg5ODIsNDg5ODMsNDg5ODQsNDg5ODUsNDg5ODYsNDg5ODcsNDg5ODgsNDg5ODksNDg5OTAsNDg5OTEsNDg5OTIsNDg5OTMsNDg5OTQsNDg5OTUsNDg5OTYsNDg5OTcsNDg5OTgsNDg5OTksNDkwMDAsNDkwMDEsNDkwMDIsNDkwMDMsNDkwMDQsNDkwMDUsNDkwMDYsNDkwMDcsNDkwMDgsNDkwMDksNDkwMTAsNDkwMTEsNDkwMTIsNDkwMTMsNDkwMTQsNDkwMTUsNDkwMTYsNDkwMTcsNDkwMTgsNDkwMTksNDkwMjAsNDkwMjEsNDkwMjIsNDkwMjMsNDkwMjQsNDkwMjUsNDkwMjYsNDkwMjcsNDkwMjgsNDkwMjksNDkwMzAsNDkwMzEsNDkwMzIsNDkwMzMsNDkwMzQsNDkwMzUsNDkwMzYsNDkwMzcsNDkwMzgsNDkwMzksNDkwNDAsNDkwNDEsNDkwNDIsNDkwNDMsNDkwNDUsNDkwNDYsNDkwNDcsNDkwNDgsNDkwNDksNDkwNTAsNDkwNTEsNDkwNTIsNDkwNTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkwNTQsNDkwNTUsNDkwNTYsNDkwNTcsNDkwNTgsNDkwNTksNDkwNjAsNDkwNjEsNDkwNjIsNDkwNjMsNDkwNjQsNDkwNjUsNDkwNjYsNDkwNjcsNDkwNjgsNDkwNjksNDkwNzAsNDkwNzEsNDkwNzMsNDkwNzQsNDkwNzUsNDkwNzYsNDkwNzcsNDkwNzgsNDkwNzksNDkwODAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkwODEsNDkwODIsNDkwODMsNDkwODQsNDkwODUsNDkwODYsNDkwODcsNDkwODgsNDkwODksNDkwOTAsNDkwOTEsNDkwOTIsNDkwOTQsNDkwOTUsNDkwOTYsNDkwOTcsNDkwOTgsNDkwOTksNDkxMDIsNDkxMDMsNDkxMDUsNDkxMDYsNDkxMDcsNDkxMDksNDkxMTAsNDkxMTEsNDkxMTIsNDkxMTMsNDkxMTQsNDkxMTUsNDkxMTcsNDkxMTgsNDkxMjAsNDkxMjIsNDkxMjMsNDkxMjQsNDkxMjUsNDkxMjYsNDkxMjcsNDkxMjgsNDkxMjksNDkxMzAsNDkxMzEsNDkxMzIsNDkxMzMsNDkxMzQsNDkxMzUsNDkxMzYsNDkxMzcsNDkxMzgsNDkxMzksNDkxNDAsNDkxNDEsNDkxNDIsNDkxNDMsNDkxNDQsNDkxNDUsNDkxNDYsNDkxNDcsNDkxNDgsNDkxNDksNDkxNTAsNDkxNTEsNDkxNTIsNDkxNTMsNDkxNTQsNDkxNTUsNDkxNTYsNDkxNTcsNDkxNTgsNDkxNTksNDkxNjAsNDkxNjEsNDkxNjIsNDkxNjMsNDkxNjQsNDkxNjUsNDkxNjYsNDkxNjcsNDkxNjgsNDkxNjksNDkxNzAsNDkxNzEsNDkxNzIsNDkxNzMsNDkxNzQsNDkxNzUsNDkxNzYsNDkxNzcsNDkxNzgsNDkxNzksNDkxODAsNDkxODEsNDkxODIsNDkxODMsNDkxODQsNDkxODUsNDkxODYsNDkxODcsNDkxODgsNDkxODksNDkxOTAsNDkxOTEsNDkxOTIsNDkxOTMsNDkxOTQsNDkxOTUsNDkxOTYsNDkxOTcsNDkxOTgsNDkxOTksNDkyMDAsNDkyMDEsNDkyMDIsNDkyMDMsNDkyMDQsNDkyMDUsNDkyMDYsNDkyMDcsNDkyMDgsNDkyMDksNDkyMTAsNDkyMTEsNDkyMTMsNDkyMTQsNDkyMTUsNDkyMTYsNDkyMTcsNDkyMTgsNDkyMTksNDkyMjAsNDkyMjEsNDkyMjIsNDkyMjMsNDkyMjQsNDkyMjUsNDkyMjYsNDkyMjcsNDkyMjgsNDkyMjksNDkyMzAsNDkyMzEsNDkyMzIsNDkyMzQsNDkyMzUsNDkyMzYsNDkyMzcsNDkyMzgsNDkyMzksNDkyNDEsNDkyNDIsNDkyNDMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkyNDUsNDkyNDYsNDkyNDcsNDkyNDksNDkyNTAsNDkyNTEsNDkyNTIsNDkyNTMsNDkyNTQsNDkyNTUsNDkyNTgsNDkyNTksNDkyNjAsNDkyNjEsNDkyNjIsNDkyNjMsNDkyNjQsNDkyNjUsNDkyNjYsNDkyNjcsNDkyNjgsNDkyNjksNDkyNzAsNDkyNzEsNDkyNzIsNDkyNzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDkyNzQsNDkyNzUsNDkyNzYsNDkyNzcsNDkyNzgsNDkyNzksNDkyODAsNDkyODEsNDkyODIsNDkyODMsNDkyODQsNDkyODUsNDkyODYsNDkyODcsNDkyODgsNDkyODksNDkyOTAsNDkyOTEsNDkyOTIsNDkyOTMsNDkyOTQsNDkyOTUsNDkyOTgsNDkyOTksNDkzMDEsNDkzMDIsNDkzMDMsNDkzMDUsNDkzMDYsNDkzMDcsNDkzMDgsNDkzMDksNDkzMTAsNDkzMTEsNDkzMTQsNDkzMTYsNDkzMTgsNDkzMTksNDkzMjAsNDkzMjEsNDkzMjIsNDkzMjMsNDkzMjYsNDkzMjksNDkzMzAsNDkzMzUsNDkzMzYsNDkzMzcsNDkzMzgsNDkzMzksNDkzNDIsNDkzNDYsNDkzNDcsNDkzNDgsNDkzNTAsNDkzNTEsNDkzNTQsNDkzNTUsNDkzNTcsNDkzNTgsNDkzNTksNDkzNjEsNDkzNjIsNDkzNjMsNDkzNjQsNDkzNjUsNDkzNjYsNDkzNjcsNDkzNzAsNDkzNzQsNDkzNzUsNDkzNzYsNDkzNzcsNDkzNzgsNDkzNzksNDkzODIsNDkzODMsNDkzODUsNDkzODYsNDkzODcsNDkzODksNDkzOTAsNDkzOTEsNDkzOTIsNDkzOTMsNDkzOTQsNDkzOTUsNDkzOTgsNDk0MDAsNDk0MDIsNDk0MDMsNDk0MDQsNDk0MDUsNDk0MDYsNDk0MDcsNDk0MDksNDk0MTAsNDk0MTEsNDk0MTMsNDk0MTQsNDk0MTUsNDk0MTcsNDk0MTgsNDk0MTksNDk0MjAsNDk0MjEsNDk0MjIsNDk0MjMsNDk0MjUsNDk0MjYsNDk0MjcsNDk0MjgsNDk0MzAsNDk0MzEsNDk0MzIsNDk0MzMsNDk0MzQsNDk0MzUsNDk0NDEsNDk0NDIsNDk0NDUsNDk0NDgsNDk0NDksNDk0NTAsNDk0NTEsNDk0NTQsNDk0NTgsNDk0NTksNDk0NjAsNDk0NjEsNDk0NjMsNDk0NjYsNDk0NjcsNDk0NjksNDk0NzAsNDk0NzEsNDk0NzMsNDk0NzQsNDk0NzUsNDk0NzYsNDk0NzcsNDk0NzgsNDk0NzksNDk0ODIsNDk0ODYsNDk0ODcsNDk0ODgsNDk0ODksNDk0OTAsNDk0OTEsNDk0OTQsNDk0OTUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk0OTcsNDk0OTgsNDk0OTksNDk1MDEsNDk1MDIsNDk1MDMsNDk1MDQsNDk1MDUsNDk1MDYsNDk1MDcsNDk1MTAsNDk1MTQsNDk1MTUsNDk1MTYsNDk1MTcsNDk1MTgsNDk1MTksNDk1MjEsNDk1MjIsNDk1MjMsNDk1MjUsNDk1MjYsNDk1MjcsNDk1MjksNDk1MzAsNDk1MzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk1MzIsNDk1MzMsNDk1MzQsNDk1MzUsNDk1MzYsNDk1MzcsNDk1MzgsNDk1MzksNDk1NDAsNDk1NDIsNDk1NDMsNDk1NDQsNDk1NDUsNDk1NDYsNDk1NDcsNDk1NTEsNDk1NTMsNDk1NTQsNDk1NTUsNDk1NTcsNDk1NTksNDk1NjAsNDk1NjEsNDk1NjIsNDk1NjMsNDk1NjYsNDk1NjgsNDk1NzAsNDk1NzEsNDk1NzIsNDk1NzQsNDk1NzUsNDk1NzgsNDk1NzksNDk1ODEsNDk1ODIsNDk1ODMsNDk1ODUsNDk1ODYsNDk1ODcsNDk1ODgsNDk1ODksNDk1OTAsNDk1OTEsNDk1OTIsNDk1OTMsNDk1OTQsNDk1OTUsNDk1OTYsNDk1OTgsNDk1OTksNDk2MDAsNDk2MDEsNDk2MDIsNDk2MDMsNDk2MDUsNDk2MDYsNDk2MDcsNDk2MDksNDk2MTAsNDk2MTEsNDk2MTMsNDk2MTQsNDk2MTUsNDk2MTYsNDk2MTcsNDk2MTgsNDk2MTksNDk2MjEsNDk2MjIsNDk2MjUsNDk2MjYsNDk2MjcsNDk2MjgsNDk2MjksNDk2MzAsNDk2MzEsNDk2MzMsNDk2MzQsNDk2MzUsNDk2MzcsNDk2MzgsNDk2MzksNDk2NDEsNDk2NDIsNDk2NDMsNDk2NDQsNDk2NDUsNDk2NDYsNDk2NDcsNDk2NTAsNDk2NTIsNDk2NTMsNDk2NTQsNDk2NTUsNDk2NTYsNDk2NTcsNDk2NTgsNDk2NTksNDk2NjIsNDk2NjMsNDk2NjUsNDk2NjYsNDk2NjcsNDk2NjksNDk2NzAsNDk2NzEsNDk2NzIsNDk2NzMsNDk2NzQsNDk2NzUsNDk2NzgsNDk2ODAsNDk2ODIsNDk2ODMsNDk2ODQsNDk2ODUsNDk2ODYsNDk2ODcsNDk2OTAsNDk2OTEsNDk2OTMsNDk2OTQsNDk2OTcsNDk2OTgsNDk2OTksNDk3MDAsNDk3MDEsNDk3MDIsNDk3MDMsNDk3MDYsNDk3MDgsNDk3MTAsNDk3MTIsNDk3MTUsNDk3MTcsNDk3MTgsNDk3MTksNDk3MjAsNDk3MjEsNDk3MjIsNDk3MjMsNDk3MjQsNDk3MjUsNDk3MjYsNDk3MjcsNDk3MjgsNDk3MjksNDk3MzAsNDk3MzEsNDk3MzIsNDk3MzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk3MzQsNDk3MzUsNDk3MzcsNDk3MzgsNDk3MzksNDk3NDAsNDk3NDEsNDk3NDIsNDk3NDMsNDk3NDYsNDk3NDcsNDk3NDksNDk3NTAsNDk3NTEsNDk3NTMsNDk3NTQsNDk3NTUsNDk3NTYsNDk3NTcsNDk3NTgsNDk3NTksNDk3NjEsNDk3NjIsNDk3NjMsNDk3NjQsNDk3NjYsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk3NjcsNDk3NjgsNDk3NjksNDk3NzAsNDk3NzEsNDk3NzQsNDk3NzUsNDk3NzcsNDk3NzgsNDk3NzksNDk3ODEsNDk3ODIsNDk3ODMsNDk3ODQsNDk3ODUsNDk3ODYsNDk3ODcsNDk3OTAsNDk3OTIsNDk3OTQsNDk3OTUsNDk3OTYsNDk3OTcsNDk3OTgsNDk3OTksNDk4MDIsNDk4MDMsNDk4MDQsNDk4MDUsNDk4MDYsNDk4MDcsNDk4MDksNDk4MTAsNDk4MTEsNDk4MTIsNDk4MTMsNDk4MTQsNDk4MTUsNDk4MTcsNDk4MTgsNDk4MjAsNDk4MjIsNDk4MjMsNDk4MjQsNDk4MjUsNDk4MjYsNDk4MjcsNDk4MzAsNDk4MzEsNDk4MzMsNDk4MzQsNDk4MzUsNDk4MzgsNDk4MzksNDk4NDAsNDk4NDEsNDk4NDIsNDk4NDMsNDk4NDYsNDk4NDgsNDk4NTAsNDk4NTEsNDk4NTIsNDk4NTMsNDk4NTQsNDk4NTUsNDk4NTYsNDk4NTcsNDk4NTgsNDk4NTksNDk4NjAsNDk4NjEsNDk4NjIsNDk4NjMsNDk4NjQsNDk4NjUsNDk4NjYsNDk4NjcsNDk4NjgsNDk4NjksNDk4NzAsNDk4NzEsNDk4NzIsNDk4NzMsNDk4NzQsNDk4NzUsNDk4NzYsNDk4NzcsNDk4NzgsNDk4NzksNDk4ODAsNDk4ODEsNDk4ODIsNDk4ODMsNDk4ODYsNDk4ODcsNDk4ODksNDk4OTAsNDk4OTMsNDk4OTQsNDk4OTUsNDk4OTYsNDk4OTcsNDk4OTgsNDk5MDIsNDk5MDQsNDk5MDYsNDk5MDcsNDk5MDgsNDk5MDksNDk5MTEsNDk5MTQsNDk5MTcsNDk5MTgsNDk5MTksNDk5MjEsNDk5MjIsNDk5MjMsNDk5MjQsNDk5MjUsNDk5MjYsNDk5MjcsNDk5MzAsNDk5MzEsNDk5MzQsNDk5MzUsNDk5MzYsNDk5MzcsNDk5MzgsNDk5NDIsNDk5NDMsNDk5NDUsNDk5NDYsNDk5NDcsNDk5NDksNDk5NTAsNDk5NTEsNDk5NTIsNDk5NTMsNDk5NTQsNDk5NTUsNDk5NTgsNDk5NTksNDk5NjIsNDk5NjMsNDk5NjQsNDk5NjUsNDk5NjYsNDk5NjcsNDk5NjgsNDk5NjksNDk5NzAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk5NzEsNDk5NzIsNDk5NzMsNDk5NzQsNDk5NzUsNDk5NzYsNDk5NzcsNDk5NzgsNDk5NzksNDk5ODAsNDk5ODEsNDk5ODIsNDk5ODMsNDk5ODQsNDk5ODUsNDk5ODYsNDk5ODcsNDk5ODgsNDk5OTAsNDk5OTEsNDk5OTIsNDk5OTMsNDk5OTQsNDk5OTUsNDk5OTYsNDk5OTcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNDk5OTgsNDk5OTksNTAwMDAsNTAwMDEsNTAwMDIsNTAwMDMsNTAwMDQsNTAwMDUsNTAwMDYsNTAwMDcsNTAwMDgsNTAwMDksNTAwMTAsNTAwMTEsNTAwMTIsNTAwMTMsNTAwMTQsNTAwMTUsNTAwMTYsNTAwMTcsNTAwMTgsNTAwMTksNTAwMjAsNTAwMjEsNTAwMjIsNTAwMjMsNTAwMjYsNTAwMjcsNTAwMjksNTAwMzAsNTAwMzEsNTAwMzMsNTAwMzUsNTAwMzYsNTAwMzcsNTAwMzgsNTAwMzksNTAwNDIsNTAwNDMsNTAwNDYsNTAwNDcsNTAwNDgsNTAwNDksNTAwNTAsNTAwNTEsNTAwNTMsNTAwNTQsNTAwNTUsNTAwNTcsNTAwNTgsNTAwNTksNTAwNjEsNTAwNjIsNTAwNjMsNTAwNjQsNTAwNjUsNTAwNjYsNTAwNjcsNTAwNjgsNTAwNjksNTAwNzAsNTAwNzEsNTAwNzIsNTAwNzMsNTAwNzQsNTAwNzUsNTAwNzYsNTAwNzcsNTAwNzgsNTAwNzksNTAwODAsNTAwODEsNTAwODIsNTAwODMsNTAwODQsNTAwODUsNTAwODYsNTAwODcsNTAwODgsNTAwODksNTAwOTAsNTAwOTEsNTAwOTIsNTAwOTMsNTAwOTQsNTAwOTUsNTAwOTYsNTAwOTcsNTAwOTgsNTAwOTksNTAxMDAsNTAxMDEsNTAxMDIsNTAxMDMsNTAxMDQsNTAxMDUsNTAxMDYsNTAxMDcsNTAxMDgsNTAxMDksNTAxMTAsNTAxMTEsNTAxMTMsNTAxMTQsNTAxMTUsNTAxMTYsNTAxMTcsNTAxMTgsNTAxMTksNTAxMjAsNTAxMjEsNTAxMjIsNTAxMjMsNTAxMjQsNTAxMjUsNTAxMjYsNTAxMjcsNTAxMjgsNTAxMjksNTAxMzAsNTAxMzEsNTAxMzIsNTAxMzMsNTAxMzQsNTAxMzUsNTAxMzgsNTAxMzksNTAxNDEsNTAxNDIsNTAxNDUsNTAxNDcsNTAxNDgsNTAxNDksNTAxNTAsNTAxNTEsNTAxNTQsNTAxNTUsNTAxNTYsNTAxNTgsNTAxNTksNTAxNjAsNTAxNjEsNTAxNjIsNTAxNjMsNTAxNjYsNTAxNjcsNTAxNjksNTAxNzAsNTAxNzEsNTAxNzIsNTAxNzMsNTAxNzQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTAxNzUsNTAxNzYsNTAxNzcsNTAxNzgsNTAxNzksNTAxODAsNTAxODEsNTAxODIsNTAxODMsNTAxODUsNTAxODYsNTAxODcsNTAxODgsNTAxODksNTAxOTAsNTAxOTEsNTAxOTMsNTAxOTQsNTAxOTUsNTAxOTYsNTAxOTcsNTAxOTgsNTAxOTksNTAyMDAsNTAyMDEsNTAyMDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTAyMDMsNTAyMDQsNTAyMDUsNTAyMDYsNTAyMDcsNTAyMDgsNTAyMDksNTAyMTAsNTAyMTEsNTAyMTMsNTAyMTQsNTAyMTUsNTAyMTYsNTAyMTcsNTAyMTgsNTAyMTksNTAyMjEsNTAyMjIsNTAyMjMsNTAyMjUsNTAyMjYsNTAyMjcsNTAyMjksNTAyMzAsNTAyMzEsNTAyMzIsNTAyMzMsNTAyMzQsNTAyMzUsNTAyMzgsNTAyMzksNTAyNDAsNTAyNDEsNTAyNDIsNTAyNDMsNTAyNDQsNTAyNDUsNTAyNDYsNTAyNDcsNTAyNDksNTAyNTAsNTAyNTEsNTAyNTIsNTAyNTMsNTAyNTQsNTAyNTUsNTAyNTYsNTAyNTcsNTAyNTgsNTAyNTksNTAyNjAsNTAyNjEsNTAyNjIsNTAyNjMsNTAyNjQsNTAyNjUsNTAyNjYsNTAyNjcsNTAyNjgsNTAyNjksNTAyNzAsNTAyNzEsNTAyNzIsNTAyNzMsNTAyNzQsNTAyNzUsNTAyNzgsNTAyNzksNTAyODEsNTAyODIsNTAyODMsNTAyODUsNTAyODYsNTAyODcsNTAyODgsNTAyODksNTAyOTAsNTAyOTEsNTAyOTQsNTAyOTUsNTAyOTYsNTAyOTgsNTAyOTksNTAzMDAsNTAzMDEsNTAzMDIsNTAzMDMsNTAzMDUsNTAzMDYsNTAzMDcsNTAzMDgsNTAzMDksNTAzMTAsNTAzMTEsNTAzMTIsNTAzMTMsNTAzMTQsNTAzMTUsNTAzMTYsNTAzMTcsNTAzMTgsNTAzMTksNTAzMjAsNTAzMjEsNTAzMjIsNTAzMjMsNTAzMjUsNTAzMjYsNTAzMjcsNTAzMjgsNTAzMjksNTAzMzAsNTAzMzEsNTAzMzMsNTAzMzQsNTAzMzUsNTAzMzYsNTAzMzcsNTAzMzgsNTAzMzksNTAzNDAsNTAzNDEsNTAzNDIsNTAzNDMsNTAzNDQsNTAzNDUsNTAzNDYsNTAzNDcsNTAzNDgsNTAzNDksNTAzNTAsNTAzNTEsNTAzNTIsNTAzNTMsNTAzNTQsNTAzNTUsNTAzNTYsNTAzNTcsNTAzNTgsNTAzNTksNTAzNjEsNTAzNjIsNTAzNjMsNTAzNjUsNTAzNjYsNTAzNjcsNTAzNjgsNTAzNjksNTAzNzAsNTAzNzEsNTAzNzIsNTAzNzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTAzNzQsNTAzNzUsNTAzNzYsNTAzNzcsNTAzNzgsNTAzNzksNTAzODAsNTAzODEsNTAzODIsNTAzODMsNTAzODQsNTAzODUsNTAzODYsNTAzODcsNTAzODgsNTAzODksNTAzOTAsNTAzOTEsNTAzOTIsNTAzOTMsNTAzOTQsNTAzOTUsNTAzOTYsNTAzOTcsNTAzOTgsNTAzOTksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA0MDAsNTA0MDEsNTA0MDIsNTA0MDMsNTA0MDQsNTA0MDUsNTA0MDYsNTA0MDcsNTA0MDgsNTA0MTAsNTA0MTEsNTA0MTIsNTA0MTMsNTA0MTQsNTA0MTUsNTA0MTgsNTA0MTksNTA0MjEsNTA0MjIsNTA0MjMsNTA0MjUsNTA0MjcsNTA0MjgsNTA0MjksNTA0MzAsNTA0MzQsNTA0MzUsNTA0MzYsNTA0MzcsNTA0MzgsNTA0MzksNTA0NDAsNTA0NDEsNTA0NDIsNTA0NDMsNTA0NDUsNTA0NDYsNTA0NDcsNTA0NDksNTA0NTAsNTA0NTEsNTA0NTMsNTA0NTQsNTA0NTUsNTA0NTYsNTA0NTcsNTA0NTgsNTA0NTksNTA0NjEsNTA0NjIsNTA0NjMsNTA0NjQsNTA0NjUsNTA0NjYsNTA0NjcsNTA0NjgsNTA0NjksNTA0NzAsNTA0NzEsNTA0NzQsNTA0NzUsNTA0NzcsNTA0NzgsNTA0NzksNTA0ODEsNTA0ODIsNTA0ODMsNTA0ODQsNTA0ODUsNTA0ODYsNTA0ODcsNTA0OTAsNTA0OTIsNTA0OTQsNTA0OTUsNTA0OTYsNTA0OTcsNTA0OTgsNTA0OTksNTA1MDIsNTA1MDMsNTA1MDcsNTA1MTEsNTA1MTIsNTA1MTMsNTA1MTQsNTA1MTgsNTA1MjIsNTA1MjMsNTA1MjQsNTA1MjcsNTA1MzAsNTA1MzEsNTA1MzMsNTA1MzQsNTA1MzUsNTA1MzcsNTA1MzgsNTA1MzksNTA1NDAsNTA1NDEsNTA1NDIsNTA1NDMsNTA1NDYsNTA1NTAsNTA1NTEsNTA1NTIsNTA1NTMsNTA1NTQsNTA1NTUsNTA1NTgsNTA1NTksNTA1NjEsNTA1NjIsNTA1NjMsNTA1NjUsNTA1NjYsNTA1NjgsNTA1NjksNTA1NzAsNTA1NzEsNTA1NzQsNTA1NzYsNTA1NzgsNTA1NzksNTA1ODAsNTA1ODIsNTA1ODUsNTA1ODYsNTA1ODcsNTA1ODksNTA1OTAsNTA1OTEsNTA1OTMsNTA1OTQsNTA1OTUsNTA1OTYsNTA1OTcsNTA1OTgsNTA1OTksNTA2MDAsNTA2MDIsNTA2MDMsNTA2MDQsNTA2MDUsNTA2MDYsNTA2MDcsNTA2MDgsNTA2MDksNTA2MTAsNTA2MTEsNTA2MTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA2MTUsNTA2MTgsNTA2MjMsNTA2MjQsNTA2MjUsNTA2MjYsNTA2MjcsNTA2MzUsNTA2MzcsNTA2MzksNTA2NDIsNTA2NDMsNTA2NDUsNTA2NDYsNTA2NDcsNTA2NDksNTA2NTAsNTA2NTEsNTA2NTIsNTA2NTMsNTA2NTQsNTA2NTUsNTA2NTgsNTA2NjAsNTA2NjIsNTA2NjMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA2NjQsNTA2NjUsNTA2NjYsNTA2NjcsNTA2NzEsNTA2NzMsNTA2NzQsNTA2NzUsNTA2NzcsNTA2ODAsNTA2ODEsNTA2ODIsNTA2ODMsNTA2OTAsNTA2OTEsNTA2OTIsNTA2OTcsNTA2OTgsNTA2OTksNTA3MDEsNTA3MDIsNTA3MDMsNTA3MDUsNTA3MDYsNTA3MDcsNTA3MDgsNTA3MDksNTA3MTAsNTA3MTEsNTA3MTQsNTA3MTcsNTA3MTgsNTA3MTksNTA3MjAsNTA3MjEsNTA3MjIsNTA3MjMsNTA3MjYsNTA3MjcsNTA3MjksNTA3MzAsNTA3MzEsNTA3MzUsNTA3MzcsNTA3MzgsNTA3NDIsNTA3NDQsNTA3NDYsNTA3NDgsNTA3NDksNTA3NTAsNTA3NTEsNTA3NTQsNTA3NTUsNTA3NTcsNTA3NTgsNTA3NTksNTA3NjEsNTA3NjIsNTA3NjMsNTA3NjQsNTA3NjUsNTA3NjYsNTA3NjcsNTA3NzAsNTA3NzQsNTA3NzUsNTA3NzYsNTA3NzcsNTA3NzgsNTA3NzksNTA3ODIsNTA3ODMsNTA3ODUsNTA3ODYsNTA3ODcsNTA3ODgsNTA3ODksNTA3OTAsNTA3OTEsNTA3OTIsNTA3OTMsNTA3OTQsNTA3OTUsNTA3OTcsNTA3OTgsNTA4MDAsNTA4MDIsNTA4MDMsNTA4MDQsNTA4MDUsNTA4MDYsNTA4MDcsNTA4MTAsNTA4MTEsNTA4MTMsNTA4MTQsNTA4MTUsNTA4MTcsNTA4MTgsNTA4MTksNTA4MjAsNTA4MjEsNTA4MjIsNTA4MjMsNTA4MjYsNTA4MjgsNTA4MzAsNTA4MzEsNTA4MzIsNTA4MzMsNTA4MzQsNTA4MzUsNTA4MzgsNTA4MzksNTA4NDEsNTA4NDIsNTA4NDMsNTA4NDUsNTA4NDYsNTA4NDcsNTA4NDgsNTA4NDksNTA4NTAsNTA4NTEsNTA4NTQsNTA4NTYsNTA4NTgsNTA4NTksNTA4NjAsNTA4NjEsNTA4NjIsNTA4NjMsNTA4NjYsNTA4NjcsNTA4NjksNTA4NzAsNTA4NzEsNTA4NzUsNTA4NzYsNTA4NzcsNTA4NzgsNTA4NzksNTA4ODIsNTA4ODQsNTA4ODYsNTA4ODcsNTA4ODgsNTA4ODksNTA4OTAsNTA4OTEsNTA4OTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA4OTUsNTA4OTcsNTA4OTgsNTA4OTksNTA5MDEsNTA5MDIsNTA5MDMsNTA5MDQsNTA5MDUsNTA5MDYsNTA5MDcsNTA5MTAsNTA5MTEsNTA5MTQsNTA5MTUsNTA5MTYsNTA5MTcsNTA5MTgsNTA5MTksNTA5MjIsNTA5MjMsNTA5MjUsNTA5MjYsNTA5MjcsNTA5MjksNTA5MzAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTA5MzEsNTA5MzIsNTA5MzMsNTA5MzQsNTA5MzUsNTA5MzgsNTA5MzksNTA5NDAsNTA5NDIsNTA5NDMsNTA5NDQsNTA5NDUsNTA5NDYsNTA5NDcsNTA5NTAsNTA5NTEsNTA5NTMsNTA5NTQsNTA5NTUsNTA5NTcsNTA5NTgsNTA5NTksNTA5NjAsNTA5NjEsNTA5NjIsNTA5NjMsNTA5NjYsNTA5NjgsNTA5NzAsNTA5NzEsNTA5NzIsNTA5NzMsNTA5NzQsNTA5NzUsNTA5NzgsNTA5NzksNTA5ODEsNTA5ODIsNTA5ODMsNTA5ODUsNTA5ODYsNTA5ODcsNTA5ODgsNTA5ODksNTA5OTAsNTA5OTEsNTA5OTQsNTA5OTYsNTA5OTgsNTEwMDAsNTEwMDEsNTEwMDIsNTEwMDMsNTEwMDYsNTEwMDcsNTEwMDksNTEwMTAsNTEwMTEsNTEwMTMsNTEwMTQsNTEwMTUsNTEwMTYsNTEwMTcsNTEwMTksNTEwMjIsNTEwMjQsNTEwMzMsNTEwMzQsNTEwMzUsNTEwMzcsNTEwMzgsNTEwMzksNTEwNDEsNTEwNDIsNTEwNDMsNTEwNDQsNTEwNDUsNTEwNDYsNTEwNDcsNTEwNDksNTEwNTAsNTEwNTIsNTEwNTMsNTEwNTQsNTEwNTUsNTEwNTYsNTEwNTcsNTEwNTgsNTEwNTksNTEwNjIsNTEwNjMsNTEwNjUsNTEwNjYsNTEwNjcsNTEwNzEsNTEwNzIsNTEwNzMsNTEwNzQsNTEwNzgsNTEwODMsNTEwODQsNTEwODUsNTEwODcsNTEwOTAsNTEwOTEsNTEwOTMsNTEwOTcsNTEwOTksNTExMDAsNTExMDEsNTExMDIsNTExMDMsNTExMDYsNTExMTEsNTExMTIsNTExMTMsNTExMTQsNTExMTUsNTExMTgsNTExMTksNTExMjEsNTExMjIsNTExMjMsNTExMjUsNTExMjYsNTExMjcsNTExMjgsNTExMjksNTExMzAsNTExMzEsNTExMzQsNTExMzgsNTExMzksNTExNDAsNTExNDEsNTExNDIsNTExNDMsNTExNDYsNTExNDcsNTExNDksNTExNTEsNTExNTMsNTExNTQsNTExNTUsNTExNTYsNTExNTcsNTExNTgsNTExNTksNTExNjEsNTExNjIsNTExNjMsNTExNjQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTExNjYsNTExNjcsNTExNjgsNTExNjksNTExNzAsNTExNzEsNTExNzMsNTExNzQsNTExNzUsNTExNzcsNTExNzgsNTExNzksNTExODEsNTExODIsNTExODMsNTExODQsNTExODUsNTExODYsNTExODcsNTExODgsNTExODksNTExOTAsNTExOTEsNTExOTIsNTExOTMsNTExOTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTExOTUsNTExOTYsNTExOTcsNTExOTgsNTExOTksNTEyMDIsNTEyMDMsNTEyMDUsNTEyMDYsNTEyMDcsNTEyMDksNTEyMTEsNTEyMTIsNTEyMTMsNTEyMTQsNTEyMTUsNTEyMTgsNTEyMjAsNTEyMjMsNTEyMjQsNTEyMjUsNTEyMjYsNTEyMjcsNTEyMzAsNTEyMzEsNTEyMzMsNTEyMzQsNTEyMzUsNTEyMzcsNTEyMzgsNTEyMzksNTEyNDAsNTEyNDEsNTEyNDIsNTEyNDMsNTEyNDYsNTEyNDgsNTEyNTAsNTEyNTEsNTEyNTIsNTEyNTMsNTEyNTQsNTEyNTUsNTEyNTcsNTEyNTgsNTEyNTksNTEyNjEsNTEyNjIsNTEyNjMsNTEyNjUsNTEyNjYsNTEyNjcsNTEyNjgsNTEyNjksNTEyNzAsNTEyNzEsNTEyNzQsNTEyNzUsNTEyNzgsNTEyNzksNTEyODAsNTEyODEsNTEyODIsNTEyODMsNTEyODUsNTEyODYsNTEyODcsNTEyODgsNTEyODksNTEyOTAsNTEyOTEsNTEyOTIsNTEyOTMsNTEyOTQsNTEyOTUsNTEyOTYsNTEyOTcsNTEyOTgsNTEyOTksNTEzMDAsNTEzMDEsNTEzMDIsNTEzMDMsNTEzMDQsNTEzMDUsNTEzMDYsNTEzMDcsNTEzMDgsNTEzMDksNTEzMTAsNTEzMTEsNTEzMTQsNTEzMTUsNTEzMTcsNTEzMTgsNTEzMTksNTEzMjEsNTEzMjMsNTEzMjQsNTEzMjUsNTEzMjYsNTEzMjcsNTEzMzAsNTEzMzIsNTEzMzYsNTEzMzcsNTEzMzgsNTEzNDIsNTEzNDMsNTEzNDQsNTEzNDUsNTEzNDYsNTEzNDcsNTEzNDksNTEzNTAsNTEzNTEsNTEzNTIsNTEzNTMsNTEzNTQsNTEzNTUsNTEzNTYsNTEzNTgsNTEzNjAsNTEzNjIsNTEzNjMsNTEzNjQsNTEzNjUsNTEzNjYsNTEzNjcsNTEzNjksNTEzNzAsNTEzNzEsNTEzNzIsNTEzNzMsNTEzNzQsNTEzNzUsNTEzNzYsNTEzNzcsNTEzNzgsNTEzNzksNTEzODAsNTEzODEsNTEzODIsNTEzODMsNTEzODQsNTEzODUsNTEzODYsNTEzODcsNTEzOTAsNTEzOTEsNTEzOTIsNTEzOTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTEzOTQsNTEzOTUsNTEzOTcsNTEzOTgsNTEzOTksNTE0MDEsNTE0MDIsNTE0MDMsNTE0MDUsNTE0MDYsNTE0MDcsNTE0MDgsNTE0MDksNTE0MTAsNTE0MTEsNTE0MTQsNTE0MTYsNTE0MTgsNTE0MTksNTE0MjAsNTE0MjEsNTE0MjIsNTE0MjMsNTE0MjYsNTE0MjcsNTE0MjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE0MzAsNTE0MzEsNTE0MzIsNTE0MzMsNTE0MzQsNTE0MzUsNTE0MzYsNTE0MzcsNTE0MzgsNTE0MzksNTE0NDAsNTE0NDEsNTE0NDIsNTE0NDMsNTE0NDQsNTE0NDYsNTE0NDcsNTE0NDgsNTE0NDksNTE0NTAsNTE0NTEsNTE0NTQsNTE0NTUsNTE0NTcsNTE0NTgsNTE0NTksNTE0NjMsNTE0NjQsNTE0NjUsNTE0NjYsNTE0NjcsNTE0NzAsMTIyODgsMTIyODksMTIyOTAsMTgzLDgyMjksODIzMCwxNjgsMTIyOTEsMTczLDgyMTMsODc0MSw2NTM0MCw4NzY0LDgyMTYsODIxNyw4MjIwLDgyMjEsMTIzMDgsMTIzMDksMTIyOTYsMTIyOTcsMTIyOTgsMTIyOTksMTIzMDAsMTIzMDEsMTIzMDIsMTIzMDMsMTIzMDQsMTIzMDUsMTc3LDIxNSwyNDcsODgwMCw4ODA0LDg4MDUsODczNCw4NzU2LDE3Niw4MjQyLDgyNDMsODQ1MSw4NDkxLDY1NTA0LDY1NTA1LDY1NTA5LDk3OTQsOTc5Miw4NzM2LDg4NjksODk3OCw4NzA2LDg3MTEsODgwMSw4Nzg2LDE2Nyw4MjUxLDk3MzQsOTczMyw5Njc1LDk2NzksOTY3OCw5NjcxLDk2NzAsOTYzMyw5NjMyLDk2NTEsOTY1MCw5NjYxLDk2NjAsODU5NCw4NTkyLDg1OTMsODU5NSw4NTk2LDEyMzA3LDg4MTAsODgxMSw4NzMwLDg3NjUsODczMyw4NzU3LDg3NDcsODc0OCw4NzEyLDg3MTUsODgzOCw4ODM5LDg4MzQsODgzNSw4NzQ2LDg3NDUsODc0Myw4NzQ0LDY1NTA2LDUxNDcyLDUxNDc0LDUxNDc1LDUxNDc2LDUxNDc3LDUxNDc4LDUxNDc5LDUxNDgxLDUxNDgyLDUxNDgzLDUxNDg0LDUxNDg1LDUxNDg2LDUxNDg3LDUxNDg4LDUxNDg5LDUxNDkwLDUxNDkxLDUxNDkyLDUxNDkzLDUxNDk0LDUxNDk1LDUxNDk2LDUxNDk3LDUxNDk4LDUxNDk5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNTAxLDUxNTAyLDUxNTAzLDUxNTA0LDUxNTA1LDUxNTA2LDUxNTA3LDUxNTA5LDUxNTEwLDUxNTExLDUxNTEyLDUxNTEzLDUxNTE0LDUxNTE1LDUxNTE2LDUxNTE3LDUxNTE4LDUxNTE5LDUxNTIwLDUxNTIxLDUxNTIyLDUxNTIzLDUxNTI0LDUxNTI1LDUxNTI2LDUxNTI3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNTI4LDUxNTI5LDUxNTMwLDUxNTMxLDUxNTMyLDUxNTMzLDUxNTM0LDUxNTM1LDUxNTM4LDUxNTM5LDUxNTQxLDUxNTQyLDUxNTQzLDUxNTQ1LDUxNTQ2LDUxNTQ3LDUxNTQ4LDUxNTQ5LDUxNTUwLDUxNTUxLDUxNTU0LDUxNTU2LDUxNTU3LDUxNTU4LDUxNTU5LDUxNTYwLDUxNTYxLDUxNTYyLDUxNTYzLDUxNTY1LDUxNTY2LDUxNTY3LDg2NTgsODY2MCw4NzA0LDg3MDcsMTgwLDY1Mzc0LDcxMSw3MjgsNzMzLDczMCw3MjksMTg0LDczMSwxNjEsMTkxLDcyMCw4NzUwLDg3MjEsODcxOSwxNjQsODQ1Nyw4MjQwLDk2NjUsOTY2NCw5NjU1LDk2NTQsOTgyOCw5ODI0LDk4MjUsOTgyOSw5ODMxLDk4MjcsODg1Nyw5NjcyLDk2MzUsOTY4MCw5NjgxLDk2MTgsOTYzNiw5NjM3LDk2NDAsOTYzOSw5NjM4LDk2NDEsOTgzMiw5NzQzLDk3NDIsOTc1Niw5NzU4LDE4Miw4MjI0LDgyMjUsODU5Nyw4NTk5LDg2MDEsODU5OCw4NjAwLDk4MzcsOTgzMyw5ODM0LDk4MzYsMTI5MjcsMTI4MjgsODQ3MCwxMzI1NSw4NDgyLDEzMjUwLDEzMjcyLDg0ODEsODM2NCwxNzQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNTY5LDUxNTcwLDUxNTcxLDUxNTczLDUxNTc0LDUxNTc1LDUxNTc2LDUxNTc3LDUxNTc4LDUxNTc5LDUxNTgxLDUxNTgyLDUxNTgzLDUxNTg0LDUxNTg1LDUxNTg2LDUxNTg3LDUxNTg4LDUxNTg5LDUxNTkwLDUxNTkxLDUxNTk0LDUxNTk1LDUxNTk3LDUxNTk4LDUxNTk5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNjAxLDUxNjAyLDUxNjAzLDUxNjA0LDUxNjA1LDUxNjA2LDUxNjA3LDUxNjEwLDUxNjEyLDUxNjE0LDUxNjE1LDUxNjE2LDUxNjE3LDUxNjE4LDUxNjE5LDUxNjIwLDUxNjIxLDUxNjIyLDUxNjIzLDUxNjI0LDUxNjI1LDUxNjI2LDUxNjI3LDUxNjI4LDUxNjI5LDUxNjMwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNjMxLDUxNjMyLDUxNjMzLDUxNjM0LDUxNjM1LDUxNjM2LDUxNjM3LDUxNjM4LDUxNjM5LDUxNjQwLDUxNjQxLDUxNjQyLDUxNjQzLDUxNjQ0LDUxNjQ1LDUxNjQ2LDUxNjQ3LDUxNjUwLDUxNjUxLDUxNjUzLDUxNjU0LDUxNjU3LDUxNjU5LDUxNjYwLDUxNjYxLDUxNjYyLDUxNjYzLDUxNjY2LDUxNjY4LDUxNjcxLDUxNjcyLDUxNjc1LDY1MjgxLDY1MjgyLDY1MjgzLDY1Mjg0LDY1Mjg1LDY1Mjg2LDY1Mjg3LDY1Mjg4LDY1Mjg5LDY1MjkwLDY1MjkxLDY1MjkyLDY1MjkzLDY1Mjk0LDY1Mjk1LDY1Mjk2LDY1Mjk3LDY1Mjk4LDY1Mjk5LDY1MzAwLDY1MzAxLDY1MzAyLDY1MzAzLDY1MzA0LDY1MzA1LDY1MzA2LDY1MzA3LDY1MzA4LDY1MzA5LDY1MzEwLDY1MzExLDY1MzEyLDY1MzEzLDY1MzE0LDY1MzE1LDY1MzE2LDY1MzE3LDY1MzE4LDY1MzE5LDY1MzIwLDY1MzIxLDY1MzIyLDY1MzIzLDY1MzI0LDY1MzI1LDY1MzI2LDY1MzI3LDY1MzI4LDY1MzI5LDY1MzMwLDY1MzMxLDY1MzMyLDY1MzMzLDY1MzM0LDY1MzM1LDY1MzM2LDY1MzM3LDY1MzM4LDY1MzM5LDY1NTEwLDY1MzQxLDY1MzQyLDY1MzQzLDY1MzQ0LDY1MzQ1LDY1MzQ2LDY1MzQ3LDY1MzQ4LDY1MzQ5LDY1MzUwLDY1MzUxLDY1MzUyLDY1MzUzLDY1MzU0LDY1MzU1LDY1MzU2LDY1MzU3LDY1MzU4LDY1MzU5LDY1MzYwLDY1MzYxLDY1MzYyLDY1MzYzLDY1MzY0LDY1MzY1LDY1MzY2LDY1MzY3LDY1MzY4LDY1MzY5LDY1MzcwLDY1MzcxLDY1MzcyLDY1MzczLDY1NTA3LDUxNjc4LDUxNjc5LDUxNjgxLDUxNjgzLDUxNjg1LDUxNjg2LDUxNjg4LDUxNjg5LDUxNjkwLDUxNjkxLDUxNjk0LDUxNjk4LDUxNjk5LDUxNzAwLDUxNzAxLDUxNzAyLDUxNzAzLDUxNzA2LDUxNzA3LDUxNzA5LDUxNzEwLDUxNzExLDUxNzEzLDUxNzE0LDUxNzE1LDUxNzE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNzE3LDUxNzE4LDUxNzE5LDUxNzIyLDUxNzI2LDUxNzI3LDUxNzI4LDUxNzI5LDUxNzMwLDUxNzMxLDUxNzMzLDUxNzM0LDUxNzM1LDUxNzM3LDUxNzM4LDUxNzM5LDUxNzQwLDUxNzQxLDUxNzQyLDUxNzQzLDUxNzQ0LDUxNzQ1LDUxNzQ2LDUxNzQ3LDUxNzQ4LDUxNzQ5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxNzUwLDUxNzUxLDUxNzUyLDUxNzU0LDUxNzU1LDUxNzU2LDUxNzU3LDUxNzU4LDUxNzU5LDUxNzYwLDUxNzYxLDUxNzYyLDUxNzYzLDUxNzY0LDUxNzY1LDUxNzY2LDUxNzY3LDUxNzY4LDUxNzY5LDUxNzcwLDUxNzcxLDUxNzcyLDUxNzczLDUxNzc0LDUxNzc1LDUxNzc2LDUxNzc3LDUxNzc4LDUxNzc5LDUxNzgwLDUxNzgxLDUxNzgyLDEyNTkzLDEyNTk0LDEyNTk1LDEyNTk2LDEyNTk3LDEyNTk4LDEyNTk5LDEyNjAwLDEyNjAxLDEyNjAyLDEyNjAzLDEyNjA0LDEyNjA1LDEyNjA2LDEyNjA3LDEyNjA4LDEyNjA5LDEyNjEwLDEyNjExLDEyNjEyLDEyNjEzLDEyNjE0LDEyNjE1LDEyNjE2LDEyNjE3LDEyNjE4LDEyNjE5LDEyNjIwLDEyNjIxLDEyNjIyLDEyNjIzLDEyNjI0LDEyNjI1LDEyNjI2LDEyNjI3LDEyNjI4LDEyNjI5LDEyNjMwLDEyNjMxLDEyNjMyLDEyNjMzLDEyNjM0LDEyNjM1LDEyNjM2LDEyNjM3LDEyNjM4LDEyNjM5LDEyNjQwLDEyNjQxLDEyNjQyLDEyNjQzLDEyNjQ0LDEyNjQ1LDEyNjQ2LDEyNjQ3LDEyNjQ4LDEyNjQ5LDEyNjUwLDEyNjUxLDEyNjUyLDEyNjUzLDEyNjU0LDEyNjU1LDEyNjU2LDEyNjU3LDEyNjU4LDEyNjU5LDEyNjYwLDEyNjYxLDEyNjYyLDEyNjYzLDEyNjY0LDEyNjY1LDEyNjY2LDEyNjY3LDEyNjY4LDEyNjY5LDEyNjcwLDEyNjcxLDEyNjcyLDEyNjczLDEyNjc0LDEyNjc1LDEyNjc2LDEyNjc3LDEyNjc4LDEyNjc5LDEyNjgwLDEyNjgxLDEyNjgyLDEyNjgzLDEyNjg0LDEyNjg1LDEyNjg2LDUxNzgzLDUxNzg0LDUxNzg1LDUxNzg2LDUxNzg3LDUxNzkwLDUxNzkxLDUxNzkzLDUxNzk0LDUxNzk1LDUxNzk3LDUxNzk4LDUxNzk5LDUxODAwLDUxODAxLDUxODAyLDUxODAzLDUxODA2LDUxODEwLDUxODExLDUxODEyLDUxODEzLDUxODE0LDUxODE1LDUxODE3LDUxODE4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxODE5LDUxODIwLDUxODIxLDUxODIyLDUxODIzLDUxODI0LDUxODI1LDUxODI2LDUxODI3LDUxODI4LDUxODI5LDUxODMwLDUxODMxLDUxODMyLDUxODMzLDUxODM0LDUxODM1LDUxODM2LDUxODM4LDUxODM5LDUxODQwLDUxODQxLDUxODQyLDUxODQzLDUxODQ1LDUxODQ2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUxODQ3LDUxODQ4LDUxODQ5LDUxODUwLDUxODUxLDUxODUyLDUxODUzLDUxODU0LDUxODU1LDUxODU2LDUxODU3LDUxODU4LDUxODU5LDUxODYwLDUxODYxLDUxODYyLDUxODYzLDUxODY1LDUxODY2LDUxODY3LDUxODY4LDUxODY5LDUxODcwLDUxODcxLDUxODcyLDUxODczLDUxODc0LDUxODc1LDUxODc2LDUxODc3LDUxODc4LDUxODc5LDg1NjAsODU2MSw4NTYyLDg1NjMsODU2NCw4NTY1LDg1NjYsODU2Nyw4NTY4LDg1NjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDg1NDQsODU0NSw4NTQ2LDg1NDcsODU0OCw4NTQ5LDg1NTAsODU1MSw4NTUyLDg1NTMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE4ODAsNTE4ODEsNTE4ODIsNTE4ODMsNTE4ODQsNTE4ODUsNTE4ODYsNTE4ODcsNTE4ODgsNTE4ODksNTE4OTAsNTE4OTEsNTE4OTIsNTE4OTMsNTE4OTQsNTE4OTUsNTE4OTYsNTE4OTcsNTE4OTgsNTE4OTksNTE5MDIsNTE5MDMsNTE5MDUsNTE5MDYsNTE5MDcsNTE5MDksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE5MTAsNTE5MTEsNTE5MTIsNTE5MTMsNTE5MTQsNTE5MTUsNTE5MTgsNTE5MjAsNTE5MjIsNTE5MjQsNTE5MjUsNTE5MjYsNTE5MjcsNTE5MzAsNTE5MzEsNTE5MzIsNTE5MzMsNTE5MzQsNTE5MzUsNTE5MzcsNTE5MzgsNTE5MzksNTE5NDAsNTE5NDEsNTE5NDIsNTE5NDMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTE5NDQsNTE5NDUsNTE5NDYsNTE5NDcsNTE5NDksNTE5NTAsNTE5NTEsNTE5NTIsNTE5NTMsNTE5NTQsNTE5NTUsNTE5NTcsNTE5NTgsNTE5NTksNTE5NjAsNTE5NjEsNTE5NjIsNTE5NjMsNTE5NjQsNTE5NjUsNTE5NjYsNTE5NjcsNTE5NjgsNTE5NjksNTE5NzAsNTE5NzEsNTE5NzIsNTE5NzMsNTE5NzQsNTE5NzUsNTE5NzcsNTE5NzgsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDk2LDk0OTIsOTUwMCw5NTE2LDk1MDgsOTUyNCw5NTMyLDk0NzMsOTQ3NSw5NDg3LDk0OTEsOTQ5OSw5NDk1LDk1MDcsOTUyMyw5NTE1LDk1MzEsOTU0Nyw5NTA0LDk1MTksOTUxMiw5NTI3LDk1MzUsOTUwMSw5NTIwLDk1MDksOTUyOCw5NTM4LDk0OTAsOTQ4OSw5NDk4LDk0OTcsOTQ5NCw5NDkzLDk0ODYsOTQ4NSw5NTAyLDk1MDMsOTUwNSw5NTA2LDk1MTAsOTUxMSw5NTEzLDk1MTQsOTUxNyw5NTE4LDk1MjEsOTUyMiw5NTI1LDk1MjYsOTUyOSw5NTMwLDk1MzMsOTUzNCw5NTM2LDk1MzcsOTUzOSw5NTQwLDk1NDEsOTU0Miw5NTQzLDk1NDQsOTU0NSw5NTQ2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MTk3OSw1MTk4MCw1MTk4MSw1MTk4Miw1MTk4Myw1MTk4NSw1MTk4Niw1MTk4Nyw1MTk4OSw1MTk5MCw1MTk5MSw1MTk5Myw1MTk5NCw1MTk5NSw1MTk5Niw1MTk5Nyw1MTk5OCw1MTk5OSw1MjAwMiw1MjAwMyw1MjAwNCw1MjAwNSw1MjAwNiw1MjAwNyw1MjAwOCw1MjAwOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjAxMCw1MjAxMSw1MjAxMiw1MjAxMyw1MjAxNCw1MjAxNSw1MjAxNiw1MjAxNyw1MjAxOCw1MjAxOSw1MjAyMCw1MjAyMSw1MjAyMiw1MjAyMyw1MjAyNCw1MjAyNSw1MjAyNiw1MjAyNyw1MjAyOCw1MjAyOSw1MjAzMCw1MjAzMSw1MjAzMiw1MjAzNCw1MjAzNSw1MjAzNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjAzNyw1MjAzOCw1MjAzOSw1MjA0Miw1MjA0Myw1MjA0NSw1MjA0Niw1MjA0Nyw1MjA0OSw1MjA1MCw1MjA1MSw1MjA1Miw1MjA1Myw1MjA1NCw1MjA1NSw1MjA1OCw1MjA1OSw1MjA2MCw1MjA2Miw1MjA2Myw1MjA2NCw1MjA2NSw1MjA2Niw1MjA2Nyw1MjA2OSw1MjA3MCw1MjA3MSw1MjA3Miw1MjA3Myw1MjA3NCw1MjA3NSw1MjA3NiwxMzIwNSwxMzIwNiwxMzIwNyw4NDY3LDEzMjA4LDEzMjUyLDEzMjE5LDEzMjIwLDEzMjIxLDEzMjIyLDEzMjA5LDEzMjEwLDEzMjExLDEzMjEyLDEzMjEzLDEzMjE0LDEzMjE1LDEzMjE2LDEzMjE3LDEzMjE4LDEzMjU4LDEzMTk3LDEzMTk4LDEzMTk5LDEzMjYzLDEzMTkyLDEzMTkzLDEzMjU2LDEzMjIzLDEzMjI0LDEzMjMyLDEzMjMzLDEzMjM0LDEzMjM1LDEzMjM2LDEzMjM3LDEzMjM4LDEzMjM5LDEzMjQwLDEzMjQxLDEzMTg0LDEzMTg1LDEzMTg2LDEzMTg3LDEzMTg4LDEzMjQyLDEzMjQzLDEzMjQ0LDEzMjQ1LDEzMjQ2LDEzMjQ3LDEzMjAwLDEzMjAxLDEzMjAyLDEzMjAzLDEzMjA0LDg0ODYsMTMyNDgsMTMyNDksMTMxOTQsMTMxOTUsMTMxOTYsMTMyNzAsMTMyNTMsMTMyMjksMTMyMzAsMTMyMzEsMTMyNzUsMTMyMjUsMTMyMjYsMTMyMjcsMTMyMjgsMTMyNzcsMTMyNjQsMTMyNjcsMTMyNTEsMTMyNTcsMTMyNzYsMTMyNTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIwNzcsNTIwNzgsNTIwNzksNTIwODAsNTIwODEsNTIwODIsNTIwODMsNTIwODQsNTIwODUsNTIwODYsNTIwODcsNTIwOTAsNTIwOTEsNTIwOTIsNTIwOTMsNTIwOTQsNTIwOTUsNTIwOTYsNTIwOTcsNTIwOTgsNTIwOTksNTIxMDAsNTIxMDEsNTIxMDIsNTIxMDMsNTIxMDQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIxMDUsNTIxMDYsNTIxMDcsNTIxMDgsNTIxMDksNTIxMTAsNTIxMTEsNTIxMTIsNTIxMTMsNTIxMTQsNTIxMTUsNTIxMTYsNTIxMTcsNTIxMTgsNTIxMTksNTIxMjAsNTIxMjEsNTIxMjIsNTIxMjMsNTIxMjUsNTIxMjYsNTIxMjcsNTIxMjgsNTIxMjksNTIxMzAsNTIxMzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTIxMzIsNTIxMzMsNTIxMzQsNTIxMzUsNTIxMzYsNTIxMzcsNTIxMzgsNTIxMzksNTIxNDAsNTIxNDEsNTIxNDIsNTIxNDMsNTIxNDQsNTIxNDUsNTIxNDYsNTIxNDcsNTIxNDgsNTIxNDksNTIxNTAsNTIxNTEsNTIxNTMsNTIxNTQsNTIxNTUsNTIxNTYsNTIxNTcsNTIxNTgsNTIxNTksNTIxNjAsNTIxNjEsNTIxNjIsNTIxNjMsNTIxNjQsMTk4LDIwOCwxNzAsMjk0LG51bGwsMzA2LG51bGwsMzE5LDMyMSwyMTYsMzM4LDE4NiwyMjIsMzU4LDMzMCxudWxsLDEyODk2LDEyODk3LDEyODk4LDEyODk5LDEyOTAwLDEyOTAxLDEyOTAyLDEyOTAzLDEyOTA0LDEyOTA1LDEyOTA2LDEyOTA3LDEyOTA4LDEyOTA5LDEyOTEwLDEyOTExLDEyOTEyLDEyOTEzLDEyOTE0LDEyOTE1LDEyOTE2LDEyOTE3LDEyOTE4LDEyOTE5LDEyOTIwLDEyOTIxLDEyOTIyLDEyOTIzLDk0MjQsOTQyNSw5NDI2LDk0MjcsOTQyOCw5NDI5LDk0MzAsOTQzMSw5NDMyLDk0MzMsOTQzNCw5NDM1LDk0MzYsOTQzNyw5NDM4LDk0MzksOTQ0MCw5NDQxLDk0NDIsOTQ0Myw5NDQ0LDk0NDUsOTQ0Niw5NDQ3LDk0NDgsOTQ0OSw5MzEyLDkzMTMsOTMxNCw5MzE1LDkzMTYsOTMxNyw5MzE4LDkzMTksOTMyMCw5MzIxLDkzMjIsOTMyMyw5MzI0LDkzMjUsOTMyNiwxODksODUzMSw4NTMyLDE4OCwxOTAsODUzOSw4NTQwLDg1NDEsODU0Miw1MjE2NSw1MjE2Niw1MjE2Nyw1MjE2OCw1MjE2OSw1MjE3MCw1MjE3MSw1MjE3Miw1MjE3Myw1MjE3NCw1MjE3NSw1MjE3Niw1MjE3Nyw1MjE3OCw1MjE3OSw1MjE4MSw1MjE4Miw1MjE4Myw1MjE4NCw1MjE4NSw1MjE4Niw1MjE4Nyw1MjE4OCw1MjE4OSw1MjE5MCw1MjE5MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjE5Miw1MjE5Myw1MjE5NCw1MjE5NSw1MjE5Nyw1MjE5OCw1MjIwMCw1MjIwMiw1MjIwMyw1MjIwNCw1MjIwNSw1MjIwNiw1MjIwNyw1MjIwOCw1MjIwOSw1MjIxMCw1MjIxMSw1MjIxMiw1MjIxMyw1MjIxNCw1MjIxNSw1MjIxNiw1MjIxNyw1MjIxOCw1MjIxOSw1MjIyMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjIyMSw1MjIyMiw1MjIyMyw1MjIyNCw1MjIyNSw1MjIyNiw1MjIyNyw1MjIyOCw1MjIyOSw1MjIzMCw1MjIzMSw1MjIzMiw1MjIzMyw1MjIzNCw1MjIzNSw1MjIzOCw1MjIzOSw1MjI0MSw1MjI0Miw1MjI0Myw1MjI0NSw1MjI0Niw1MjI0Nyw1MjI0OCw1MjI0OSw1MjI1MCw1MjI1MSw1MjI1NCw1MjI1NSw1MjI1Niw1MjI1OSw1MjI2MCwyMzAsMjczLDI0MCwyOTUsMzA1LDMwNywzMTIsMzIwLDMyMiwyNDgsMzM5LDIyMywyNTQsMzU5LDMzMSwzMjksMTI4MDAsMTI4MDEsMTI4MDIsMTI4MDMsMTI4MDQsMTI4MDUsMTI4MDYsMTI4MDcsMTI4MDgsMTI4MDksMTI4MTAsMTI4MTEsMTI4MTIsMTI4MTMsMTI4MTQsMTI4MTUsMTI4MTYsMTI4MTcsMTI4MTgsMTI4MTksMTI4MjAsMTI4MjEsMTI4MjIsMTI4MjMsMTI4MjQsMTI4MjUsMTI4MjYsMTI4MjcsOTM3Miw5MzczLDkzNzQsOTM3NSw5Mzc2LDkzNzcsOTM3OCw5Mzc5LDkzODAsOTM4MSw5MzgyLDkzODMsOTM4NCw5Mzg1LDkzODYsOTM4Nyw5Mzg4LDkzODksOTM5MCw5MzkxLDkzOTIsOTM5Myw5Mzk0LDkzOTUsOTM5Niw5Mzk3LDkzMzIsOTMzMyw5MzM0LDkzMzUsOTMzNiw5MzM3LDkzMzgsOTMzOSw5MzQwLDkzNDEsOTM0Miw5MzQzLDkzNDQsOTM0NSw5MzQ2LDE4NSwxNzgsMTc5LDgzMDgsODMxOSw4MzIxLDgzMjIsODMyMyw4MzI0LDUyMjYxLDUyMjYyLDUyMjY2LDUyMjY3LDUyMjY5LDUyMjcxLDUyMjczLDUyMjc0LDUyMjc1LDUyMjc2LDUyMjc3LDUyMjc4LDUyMjc5LDUyMjgyLDUyMjg3LDUyMjg4LDUyMjg5LDUyMjkwLDUyMjkxLDUyMjk0LDUyMjk1LDUyMjk3LDUyMjk4LDUyMjk5LDUyMzAxLDUyMzAyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMzAzLDUyMzA0LDUyMzA1LDUyMzA2LDUyMzA3LDUyMzEwLDUyMzE0LDUyMzE1LDUyMzE2LDUyMzE3LDUyMzE4LDUyMzE5LDUyMzIxLDUyMzIyLDUyMzIzLDUyMzI1LDUyMzI3LDUyMzI5LDUyMzMwLDUyMzMxLDUyMzMyLDUyMzMzLDUyMzM0LDUyMzM1LDUyMzM3LDUyMzM4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyMzM5LDUyMzQwLDUyMzQyLDUyMzQzLDUyMzQ0LDUyMzQ1LDUyMzQ2LDUyMzQ3LDUyMzQ4LDUyMzQ5LDUyMzUwLDUyMzUxLDUyMzUyLDUyMzUzLDUyMzU0LDUyMzU1LDUyMzU2LDUyMzU3LDUyMzU4LDUyMzU5LDUyMzYwLDUyMzYxLDUyMzYyLDUyMzYzLDUyMzY0LDUyMzY1LDUyMzY2LDUyMzY3LDUyMzY4LDUyMzY5LDUyMzcwLDUyMzcxLDEyMzUzLDEyMzU0LDEyMzU1LDEyMzU2LDEyMzU3LDEyMzU4LDEyMzU5LDEyMzYwLDEyMzYxLDEyMzYyLDEyMzYzLDEyMzY0LDEyMzY1LDEyMzY2LDEyMzY3LDEyMzY4LDEyMzY5LDEyMzcwLDEyMzcxLDEyMzcyLDEyMzczLDEyMzc0LDEyMzc1LDEyMzc2LDEyMzc3LDEyMzc4LDEyMzc5LDEyMzgwLDEyMzgxLDEyMzgyLDEyMzgzLDEyMzg0LDEyMzg1LDEyMzg2LDEyMzg3LDEyMzg4LDEyMzg5LDEyMzkwLDEyMzkxLDEyMzkyLDEyMzkzLDEyMzk0LDEyMzk1LDEyMzk2LDEyMzk3LDEyMzk4LDEyMzk5LDEyNDAwLDEyNDAxLDEyNDAyLDEyNDAzLDEyNDA0LDEyNDA1LDEyNDA2LDEyNDA3LDEyNDA4LDEyNDA5LDEyNDEwLDEyNDExLDEyNDEyLDEyNDEzLDEyNDE0LDEyNDE1LDEyNDE2LDEyNDE3LDEyNDE4LDEyNDE5LDEyNDIwLDEyNDIxLDEyNDIyLDEyNDIzLDEyNDI0LDEyNDI1LDEyNDI2LDEyNDI3LDEyNDI4LDEyNDI5LDEyNDMwLDEyNDMxLDEyNDMyLDEyNDMzLDEyNDM0LDEyNDM1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjM3Miw1MjM3Myw1MjM3NCw1MjM3NSw1MjM3OCw1MjM3OSw1MjM4MSw1MjM4Miw1MjM4Myw1MjM4NSw1MjM4Niw1MjM4Nyw1MjM4OCw1MjM4OSw1MjM5MCw1MjM5MSw1MjM5NCw1MjM5OCw1MjM5OSw1MjQwMCw1MjQwMSw1MjQwMiw1MjQwMyw1MjQwNiw1MjQwNyw1MjQwOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjQxMCw1MjQxMSw1MjQxMyw1MjQxNCw1MjQxNSw1MjQxNiw1MjQxNyw1MjQxOCw1MjQxOSw1MjQyMiw1MjQyNCw1MjQyNiw1MjQyNyw1MjQyOCw1MjQyOSw1MjQzMCw1MjQzMSw1MjQzMyw1MjQzNCw1MjQzNSw1MjQzNyw1MjQzOCw1MjQzOSw1MjQ0MCw1MjQ0MSw1MjQ0MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjQ0Myw1MjQ0NCw1MjQ0NSw1MjQ0Niw1MjQ0Nyw1MjQ0OCw1MjQ0OSw1MjQ1MCw1MjQ1MSw1MjQ1Myw1MjQ1NCw1MjQ1NSw1MjQ1Niw1MjQ1Nyw1MjQ1OCw1MjQ1OSw1MjQ2MSw1MjQ2Miw1MjQ2Myw1MjQ2NSw1MjQ2Niw1MjQ2Nyw1MjQ2OCw1MjQ2OSw1MjQ3MCw1MjQ3MSw1MjQ3Miw1MjQ3Myw1MjQ3NCw1MjQ3NSw1MjQ3Niw1MjQ3NywxMjQ0OSwxMjQ1MCwxMjQ1MSwxMjQ1MiwxMjQ1MywxMjQ1NCwxMjQ1NSwxMjQ1NiwxMjQ1NywxMjQ1OCwxMjQ1OSwxMjQ2MCwxMjQ2MSwxMjQ2MiwxMjQ2MywxMjQ2NCwxMjQ2NSwxMjQ2NiwxMjQ2NywxMjQ2OCwxMjQ2OSwxMjQ3MCwxMjQ3MSwxMjQ3MiwxMjQ3MywxMjQ3NCwxMjQ3NSwxMjQ3NiwxMjQ3NywxMjQ3OCwxMjQ3OSwxMjQ4MCwxMjQ4MSwxMjQ4MiwxMjQ4MywxMjQ4NCwxMjQ4NSwxMjQ4NiwxMjQ4NywxMjQ4OCwxMjQ4OSwxMjQ5MCwxMjQ5MSwxMjQ5MiwxMjQ5MywxMjQ5NCwxMjQ5NSwxMjQ5NiwxMjQ5NywxMjQ5OCwxMjQ5OSwxMjUwMCwxMjUwMSwxMjUwMiwxMjUwMywxMjUwNCwxMjUwNSwxMjUwNiwxMjUwNywxMjUwOCwxMjUwOSwxMjUxMCwxMjUxMSwxMjUxMiwxMjUxMywxMjUxNCwxMjUxNSwxMjUxNiwxMjUxNywxMjUxOCwxMjUxOSwxMjUyMCwxMjUyMSwxMjUyMiwxMjUyMywxMjUyNCwxMjUyNSwxMjUyNiwxMjUyNywxMjUyOCwxMjUyOSwxMjUzMCwxMjUzMSwxMjUzMiwxMjUzMywxMjUzNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI0NzgsNTI0NzksNTI0ODAsNTI0ODIsNTI0ODMsNTI0ODQsNTI0ODUsNTI0ODYsNTI0ODcsNTI0OTAsNTI0OTEsNTI0OTMsNTI0OTQsNTI0OTUsNTI0OTcsNTI0OTgsNTI0OTksNTI1MDAsNTI1MDEsNTI1MDIsNTI1MDMsNTI1MDYsNTI1MDgsNTI1MTAsNTI1MTEsNTI1MTIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI1MTMsNTI1MTQsNTI1MTUsNTI1MTcsNTI1MTgsNTI1MTksNTI1MjEsNTI1MjIsNTI1MjMsNTI1MjUsNTI1MjYsNTI1MjcsNTI1MjgsNTI1MjksNTI1MzAsNTI1MzEsNTI1MzIsNTI1MzMsNTI1MzQsNTI1MzUsNTI1MzYsNTI1MzgsNTI1MzksNTI1NDAsNTI1NDEsNTI1NDIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI1NDMsNTI1NDQsNTI1NDUsNTI1NDYsNTI1NDcsNTI1NDgsNTI1NDksNTI1NTAsNTI1NTEsNTI1NTIsNTI1NTMsNTI1NTQsNTI1NTUsNTI1NTYsNTI1NTcsNTI1NTgsNTI1NTksNTI1NjAsNTI1NjEsNTI1NjIsNTI1NjMsNTI1NjQsNTI1NjUsNTI1NjYsNTI1NjcsNTI1NjgsNTI1NjksNTI1NzAsNTI1NzEsNTI1NzMsNTI1NzQsNTI1NzUsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTAyNSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTEwNSwxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjU3Nyw1MjU3OCw1MjU3OSw1MjU4MSw1MjU4Miw1MjU4Myw1MjU4NCw1MjU4NSw1MjU4Niw1MjU4Nyw1MjU5MCw1MjU5Miw1MjU5NCw1MjU5NSw1MjU5Niw1MjU5Nyw1MjU5OCw1MjU5OSw1MjYwMSw1MjYwMiw1MjYwMyw1MjYwNCw1MjYwNSw1MjYwNiw1MjYwNyw1MjYwOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjYwOSw1MjYxMCw1MjYxMSw1MjYxMiw1MjYxMyw1MjYxNCw1MjYxNSw1MjYxNyw1MjYxOCw1MjYxOSw1MjYyMCw1MjYyMSw1MjYyMiw1MjYyMyw1MjYyNCw1MjYyNSw1MjYyNiw1MjYyNyw1MjYzMCw1MjYzMSw1MjYzMyw1MjYzNCw1MjYzNSw1MjYzNyw1MjYzOCw1MjYzOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjY0MCw1MjY0MSw1MjY0Miw1MjY0Myw1MjY0Niw1MjY0OCw1MjY1MCw1MjY1MSw1MjY1Miw1MjY1Myw1MjY1NCw1MjY1NSw1MjY1Nyw1MjY1OCw1MjY1OSw1MjY2MCw1MjY2MSw1MjY2Miw1MjY2Myw1MjY2NCw1MjY2NSw1MjY2Niw1MjY2Nyw1MjY2OCw1MjY2OSw1MjY3MCw1MjY3MSw1MjY3Miw1MjY3Myw1MjY3NCw1MjY3NSw1MjY3NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNjc4LDUyNjc5LDUyNjgwLDUyNjgxLDUyNjgyLDUyNjgzLDUyNjg1LDUyNjg2LDUyNjg3LDUyNjg5LDUyNjkwLDUyNjkxLDUyNjkyLDUyNjkzLDUyNjk0LDUyNjk1LDUyNjk2LDUyNjk3LDUyNjk4LDUyNjk5LDUyNzAwLDUyNzAxLDUyNzAyLDUyNzAzLDUyNzA0LDUyNzA1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNzA2LDUyNzA3LDUyNzA4LDUyNzA5LDUyNzEwLDUyNzExLDUyNzEzLDUyNzE0LDUyNzE1LDUyNzE3LDUyNzE4LDUyNzE5LDUyNzIxLDUyNzIyLDUyNzIzLDUyNzI0LDUyNzI1LDUyNzI2LDUyNzI3LDUyNzMwLDUyNzMyLDUyNzM0LDUyNzM1LDUyNzM2LDUyNzM3LDUyNzM4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDUyNzM5LDUyNzQxLDUyNzQyLDUyNzQzLDUyNzQ1LDUyNzQ2LDUyNzQ3LDUyNzQ5LDUyNzUwLDUyNzUxLDUyNzUyLDUyNzUzLDUyNzU0LDUyNzU1LDUyNzU3LDUyNzU4LDUyNzU5LDUyNzYwLDUyNzYyLDUyNzYzLDUyNzY0LDUyNzY1LDUyNzY2LDUyNzY3LDUyNzcwLDUyNzcxLDUyNzczLDUyNzc0LDUyNzc1LDUyNzc3LDUyNzc4LDUyNzc5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI3ODAsNTI3ODEsNTI3ODIsNTI3ODMsNTI3ODYsNTI3ODgsNTI3OTAsNTI3OTEsNTI3OTIsNTI3OTMsNTI3OTQsNTI3OTUsNTI3OTYsNTI3OTcsNTI3OTgsNTI3OTksNTI4MDAsNTI4MDEsNTI4MDIsNTI4MDMsNTI4MDQsNTI4MDUsNTI4MDYsNTI4MDcsNTI4MDgsNTI4MDksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI4MTAsNTI4MTEsNTI4MTIsNTI4MTMsNTI4MTQsNTI4MTUsNTI4MTYsNTI4MTcsNTI4MTgsNTI4MTksNTI4MjAsNTI4MjEsNTI4MjIsNTI4MjMsNTI4MjYsNTI4MjcsNTI4MjksNTI4MzAsNTI4MzQsNTI4MzUsNTI4MzYsNTI4MzcsNTI4MzgsNTI4MzksNTI4NDIsNTI4NDQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNTI4NDYsNTI4NDcsNTI4NDgsNTI4NDksNTI4NTAsNTI4NTEsNTI4NTQsNTI4NTUsNTI4NTcsNTI4NTgsNTI4NTksNTI4NjEsNTI4NjIsNTI4NjMsNTI4NjQsNTI4NjUsNTI4NjYsNTI4NjcsNTI4NzAsNTI4NzIsNTI4NzQsNTI4NzUsNTI4NzYsNTI4NzcsNTI4NzgsNTI4NzksNTI4ODIsNTI4ODMsNTI4ODUsNTI4ODYsNTI4ODcsNTI4ODksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mjg5MCw1Mjg5MSw1Mjg5Miw1Mjg5Myw1Mjg5NCw1Mjg5NSw1Mjg5OCw1MjkwMiw1MjkwMyw1MjkwNCw1MjkwNSw1MjkwNiw1MjkwNyw1MjkxMCw1MjkxMSw1MjkxMiw1MjkxMyw1MjkxNCw1MjkxNSw1MjkxNiw1MjkxNyw1MjkxOCw1MjkxOSw1MjkyMCw1MjkyMSw1MjkyMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MjkyMyw1MjkyNCw1MjkyNSw1MjkyNiw1MjkyNyw1MjkyOCw1MjkzMCw1MjkzMSw1MjkzMiw1MjkzMyw1MjkzNCw1MjkzNSw1MjkzNiw1MjkzNyw1MjkzOCw1MjkzOSw1Mjk0MCw1Mjk0MSw1Mjk0Miw1Mjk0Myw1Mjk0NCw1Mjk0NSw1Mjk0Niw1Mjk0Nyw1Mjk0OCw1Mjk0OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mjk1MCw1Mjk1MSw1Mjk1Miw1Mjk1Myw1Mjk1NCw1Mjk1NSw1Mjk1Niw1Mjk1Nyw1Mjk1OCw1Mjk1OSw1Mjk2MCw1Mjk2MSw1Mjk2Miw1Mjk2Myw1Mjk2Niw1Mjk2Nyw1Mjk2OSw1Mjk3MCw1Mjk3Myw1Mjk3NCw1Mjk3NSw1Mjk3Niw1Mjk3Nyw1Mjk3OCw1Mjk3OSw1Mjk4Miw1Mjk4Niw1Mjk4Nyw1Mjk4OCw1Mjk4OSw1Mjk5MCw1Mjk5MSw0NDAzMiw0NDAzMyw0NDAzNiw0NDAzOSw0NDA0MCw0NDA0MSw0NDA0Miw0NDA0OCw0NDA0OSw0NDA1MCw0NDA1MSw0NDA1Miw0NDA1Myw0NDA1NCw0NDA1NSw0NDA1Nyw0NDA1OCw0NDA1OSw0NDA2MCw0NDA2MSw0NDA2NCw0NDA2OCw0NDA3Niw0NDA3Nyw0NDA3OSw0NDA4MCw0NDA4MSw0NDA4OCw0NDA4OSw0NDA5Miw0NDA5Niw0NDEwNyw0NDEwOSw0NDExNiw0NDEyMCw0NDEyNCw0NDE0NCw0NDE0NSw0NDE0OCw0NDE1MSw0NDE1Miw0NDE1NCw0NDE2MCw0NDE2MSw0NDE2Myw0NDE2NCw0NDE2NSw0NDE2Niw0NDE2OSw0NDE3MCw0NDE3MSw0NDE3Miw0NDE3Niw0NDE4MCw0NDE4OCw0NDE4OSw0NDE5MSw0NDE5Miw0NDE5Myw0NDIwMCw0NDIwMSw0NDIwMiw0NDIwNCw0NDIwNyw0NDIwOCw0NDIxNiw0NDIxNyw0NDIxOSw0NDIyMCw0NDIyMSw0NDIyNSw0NDIyOCw0NDIzMiw0NDIzNiw0NDI0NSw0NDI0Nyw0NDI1Niw0NDI1Nyw0NDI2MCw0NDI2Myw0NDI2NCw0NDI2Niw0NDI2OCw0NDI3MSw0NDI3Miw0NDI3Myw0NDI3NSw0NDI3Nyw0NDI3OCw0NDI4NCw0NDI4NSw0NDI4OCw0NDI5Miw0NDI5NCw1Mjk5NCw1Mjk5NSw1Mjk5Nyw1Mjk5OCw1Mjk5OSw1MzAwMSw1MzAwMiw1MzAwMyw1MzAwNCw1MzAwNSw1MzAwNiw1MzAwNyw1MzAxMCw1MzAxMiw1MzAxNCw1MzAxNSw1MzAxNiw1MzAxNyw1MzAxOCw1MzAxOSw1MzAyMSw1MzAyMiw1MzAyMyw1MzAyNSw1MzAyNiw1MzAyNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzAyOSw1MzAzMCw1MzAzMSw1MzAzMiw1MzAzMyw1MzAzNCw1MzAzNSw1MzAzOCw1MzA0Miw1MzA0Myw1MzA0NCw1MzA0NSw1MzA0Niw1MzA0Nyw1MzA0OSw1MzA1MCw1MzA1MSw1MzA1Miw1MzA1Myw1MzA1NCw1MzA1NSw1MzA1Niw1MzA1Nyw1MzA1OCw1MzA1OSw1MzA2MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzA2MSw1MzA2Miw1MzA2Myw1MzA2NCw1MzA2NSw1MzA2Niw1MzA2Nyw1MzA2OCw1MzA2OSw1MzA3MCw1MzA3MSw1MzA3Miw1MzA3Myw1MzA3NCw1MzA3NSw1MzA3OCw1MzA3OSw1MzA4MSw1MzA4Miw1MzA4Myw1MzA4NSw1MzA4Niw1MzA4Nyw1MzA4OCw1MzA4OSw1MzA5MCw1MzA5MSw1MzA5NCw1MzA5Niw1MzA5OCw1MzA5OSw1MzEwMCw0NDMwMCw0NDMwMSw0NDMwMyw0NDMwNSw0NDMxMiw0NDMxNiw0NDMyMCw0NDMyOSw0NDMzMiw0NDMzMyw0NDM0MCw0NDM0MSw0NDM0NCw0NDM0OCw0NDM1Niw0NDM1Nyw0NDM1OSw0NDM2MSw0NDM2OCw0NDM3Miw0NDM3Niw0NDM4NSw0NDM4Nyw0NDM5Niw0NDM5Nyw0NDQwMCw0NDQwMyw0NDQwNCw0NDQwNSw0NDQwNiw0NDQxMSw0NDQxMiw0NDQxMyw0NDQxNSw0NDQxNyw0NDQxOCw0NDQyNCw0NDQyNSw0NDQyOCw0NDQzMiw0NDQ0NCw0NDQ0NSw0NDQ1Miw0NDQ3MSw0NDQ4MCw0NDQ4MSw0NDQ4NCw0NDQ4OCw0NDQ5Niw0NDQ5Nyw0NDQ5OSw0NDUwOCw0NDUxMiw0NDUxNiw0NDUzNiw0NDUzNyw0NDU0MCw0NDU0Myw0NDU0NCw0NDU0NSw0NDU1Miw0NDU1Myw0NDU1NSw0NDU1Nyw0NDU2NCw0NDU5Miw0NDU5Myw0NDU5Niw0NDU5OSw0NDYwMCw0NDYwMiw0NDYwOCw0NDYwOSw0NDYxMSw0NDYxMyw0NDYxNCw0NDYxOCw0NDYyMCw0NDYyMSw0NDYyMiw0NDYyNCw0NDYyOCw0NDYzMCw0NDYzNiw0NDYzNyw0NDYzOSw0NDY0MCw0NDY0MSw0NDY0NSw0NDY0OCw0NDY0OSw0NDY1Miw0NDY1Niw0NDY2NCw1MzEwMSw1MzEwMiw1MzEwMyw1MzEwNiw1MzEwNyw1MzEwOSw1MzExMCw1MzExMSw1MzExMyw1MzExNCw1MzExNSw1MzExNiw1MzExNyw1MzExOCw1MzExOSw1MzEyMSw1MzEyMiw1MzEyMyw1MzEyNCw1MzEyNiw1MzEyNyw1MzEyOCw1MzEyOSw1MzEzMCw1MzEzMSw1MzEzMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzEzNCw1MzEzNSw1MzEzNiw1MzEzNyw1MzEzOCw1MzEzOSw1MzE0MCw1MzE0MSw1MzE0Miw1MzE0Myw1MzE0NCw1MzE0NSw1MzE0Niw1MzE0Nyw1MzE0OCw1MzE0OSw1MzE1MCw1MzE1MSw1MzE1Miw1MzE1NCw1MzE1NSw1MzE1Niw1MzE1Nyw1MzE1OCw1MzE1OSw1MzE2MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzE2Miw1MzE2Myw1MzE2NCw1MzE2NSw1MzE2Niw1MzE2Nyw1MzE2OSw1MzE3MCw1MzE3MSw1MzE3Miw1MzE3Myw1MzE3NCw1MzE3NSw1MzE3Niw1MzE3Nyw1MzE3OCw1MzE3OSw1MzE4MCw1MzE4MSw1MzE4Miw1MzE4Myw1MzE4NCw1MzE4NSw1MzE4Niw1MzE4Nyw1MzE4OSw1MzE5MCw1MzE5MSw1MzE5Miw1MzE5Myw1MzE5NCw1MzE5NSw0NDY2NSw0NDY2Nyw0NDY2OCw0NDY2OSw0NDY3Niw0NDY3Nyw0NDY4NCw0NDczMiw0NDczMyw0NDczNCw0NDczNiw0NDc0MCw0NDc0OCw0NDc0OSw0NDc1MSw0NDc1Miw0NDc1Myw0NDc2MCw0NDc2MSw0NDc2NCw0NDc3Niw0NDc3OSw0NDc4MSw0NDc4OCw0NDc5Miw0NDc5Niw0NDgwNyw0NDgwOCw0NDgxMyw0NDgxNiw0NDg0NCw0NDg0NSw0NDg0OCw0NDg1MCw0NDg1Miw0NDg2MCw0NDg2MSw0NDg2Myw0NDg2NSw0NDg2Niw0NDg2Nyw0NDg3Miw0NDg3Myw0NDg4MCw0NDg5Miw0NDg5Myw0NDkwMCw0NDkwMSw0NDkyMSw0NDkyOCw0NDkzMiw0NDkzNiw0NDk0NCw0NDk0NSw0NDk0OSw0NDk1Niw0NDk4NCw0NDk4NSw0NDk4OCw0NDk5Miw0NDk5OSw0NTAwMCw0NTAwMSw0NTAwMyw0NTAwNSw0NTAwNiw0NTAxMiw0NTAyMCw0NTAzMiw0NTAzMyw0NTA0MCw0NTA0MSw0NTA0NCw0NTA0OCw0NTA1Niw0NTA1Nyw0NTA2MCw0NTA2OCw0NTA3Miw0NTA3Niw0NTA4NCw0NTA4NSw0NTA5Niw0NTEyNCw0NTEyNSw0NTEyOCw0NTEzMCw0NTEzMiw0NTEzNCw0NTEzOSw0NTE0MCw0NTE0MSw0NTE0Myw0NTE0NSw1MzE5Niw1MzE5Nyw1MzE5OCw1MzE5OSw1MzIwMCw1MzIwMSw1MzIwMiw1MzIwMyw1MzIwNCw1MzIwNSw1MzIwNiw1MzIwNyw1MzIwOCw1MzIwOSw1MzIxMCw1MzIxMSw1MzIxMiw1MzIxMyw1MzIxNCw1MzIxNSw1MzIxOCw1MzIxOSw1MzIyMSw1MzIyMiw1MzIyMyw1MzIyNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzIyNiw1MzIyNyw1MzIyOCw1MzIyOSw1MzIzMCw1MzIzMSw1MzIzNCw1MzIzNiw1MzIzOCw1MzIzOSw1MzI0MCw1MzI0MSw1MzI0Miw1MzI0Myw1MzI0NSw1MzI0Niw1MzI0Nyw1MzI0OSw1MzI1MCw1MzI1MSw1MzI1Myw1MzI1NCw1MzI1NSw1MzI1Niw1MzI1Nyw1MzI1OCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzI1OSw1MzI2MCw1MzI2MSw1MzI2Miw1MzI2Myw1MzI2NCw1MzI2Niw1MzI2Nyw1MzI2OCw1MzI2OSw1MzI3MCw1MzI3MSw1MzI3Myw1MzI3NCw1MzI3NSw1MzI3Niw1MzI3Nyw1MzI3OCw1MzI3OSw1MzI4MCw1MzI4MSw1MzI4Miw1MzI4Myw1MzI4NCw1MzI4NSw1MzI4Niw1MzI4Nyw1MzI4OCw1MzI4OSw1MzI5MCw1MzI5MSw1MzI5Miw0NTE0OSw0NTE4MCw0NTE4MSw0NTE4NCw0NTE4OCw0NTE5Niw0NTE5Nyw0NTE5OSw0NTIwMSw0NTIwOCw0NTIwOSw0NTIxMCw0NTIxMiw0NTIxNSw0NTIxNiw0NTIxNyw0NTIxOCw0NTIyNCw0NTIyNSw0NTIyNyw0NTIyOCw0NTIyOSw0NTIzMCw0NTIzMSw0NTIzMyw0NTIzNSw0NTIzNiw0NTIzNyw0NTI0MCw0NTI0NCw0NTI1Miw0NTI1Myw0NTI1NSw0NTI1Niw0NTI1Nyw0NTI2NCw0NTI2NSw0NTI2OCw0NTI3Miw0NTI4MCw0NTI4NSw0NTMyMCw0NTMyMSw0NTMyMyw0NTMyNCw0NTMyOCw0NTMzMCw0NTMzMSw0NTMzNiw0NTMzNyw0NTMzOSw0NTM0MCw0NTM0MSw0NTM0Nyw0NTM0OCw0NTM0OSw0NTM1Miw0NTM1Niw0NTM2NCw0NTM2NSw0NTM2Nyw0NTM2OCw0NTM2OSw0NTM3Niw0NTM3Nyw0NTM4MCw0NTM4NCw0NTM5Miw0NTM5Myw0NTM5Niw0NTM5Nyw0NTQwMCw0NTQwNCw0NTQwOCw0NTQzMiw0NTQzMyw0NTQzNiw0NTQ0MCw0NTQ0Miw0NTQ0OCw0NTQ0OSw0NTQ1MSw0NTQ1Myw0NTQ1OCw0NTQ1OSw0NTQ2MCw0NTQ2NCw0NTQ2OCw0NTQ4MCw0NTUxNiw0NTUyMCw0NTUyNCw0NTUzMiw0NTUzMyw1MzI5NCw1MzI5NSw1MzI5Niw1MzI5Nyw1MzI5OCw1MzI5OSw1MzMwMiw1MzMwMyw1MzMwNSw1MzMwNiw1MzMwNyw1MzMwOSw1MzMxMCw1MzMxMSw1MzMxMiw1MzMxMyw1MzMxNCw1MzMxNSw1MzMxOCw1MzMyMCw1MzMyMiw1MzMyMyw1MzMyNCw1MzMyNSw1MzMyNiw1MzMyNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzMyOSw1MzMzMCw1MzMzMSw1MzMzMyw1MzMzNCw1MzMzNSw1MzMzNyw1MzMzOCw1MzMzOSw1MzM0MCw1MzM0MSw1MzM0Miw1MzM0Myw1MzM0NSw1MzM0Niw1MzM0Nyw1MzM0OCw1MzM0OSw1MzM1MCw1MzM1MSw1MzM1Miw1MzM1Myw1MzM1NCw1MzM1NSw1MzM1OCw1MzM1OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzM2MSw1MzM2Miw1MzM2Myw1MzM2NSw1MzM2Niw1MzM2Nyw1MzM2OCw1MzM2OSw1MzM3MCw1MzM3MSw1MzM3NCw1MzM3NSw1MzM3Niw1MzM3OCw1MzM3OSw1MzM4MCw1MzM4MSw1MzM4Miw1MzM4Myw1MzM4NCw1MzM4NSw1MzM4Niw1MzM4Nyw1MzM4OCw1MzM4OSw1MzM5MCw1MzM5MSw1MzM5Miw1MzM5Myw1MzM5NCw1MzM5NSw1MzM5Niw0NTUzNSw0NTU0NCw0NTU0NSw0NTU0OCw0NTU1Miw0NTU2MSw0NTU2Myw0NTU2NSw0NTU3Miw0NTU3Myw0NTU3Niw0NTU3OSw0NTU4MCw0NTU4OCw0NTU4OSw0NTU5MSw0NTU5Myw0NTYwMCw0NTYyMCw0NTYyOCw0NTY1Niw0NTY2MCw0NTY2NCw0NTY3Miw0NTY3Myw0NTY4NCw0NTY4NSw0NTY5Miw0NTcwMCw0NTcwMSw0NTcwNSw0NTcxMiw0NTcxMyw0NTcxNiw0NTcyMCw0NTcyMSw0NTcyMiw0NTcyOCw0NTcyOSw0NTczMSw0NTczMyw0NTczNCw0NTczOCw0NTc0MCw0NTc0NCw0NTc0OCw0NTc2OCw0NTc2OSw0NTc3Miw0NTc3Niw0NTc3OCw0NTc4NCw0NTc4NSw0NTc4Nyw0NTc4OSw0NTc5NCw0NTc5Niw0NTc5Nyw0NTc5OCw0NTgwMCw0NTgwMyw0NTgwNCw0NTgwNSw0NTgwNiw0NTgwNyw0NTgxMSw0NTgxMiw0NTgxMyw0NTgxNSw0NTgxNiw0NTgxNyw0NTgxOCw0NTgxOSw0NTgyMyw0NTgyNCw0NTgyNSw0NTgyOCw0NTgzMiw0NTg0MCw0NTg0MSw0NTg0Myw0NTg0NCw0NTg0NSw0NTg1Miw0NTkwOCw0NTkwOSw0NTkxMCw0NTkxMiw0NTkxNSw0NTkxNiw0NTkxOCw0NTkxOSw0NTkyNCw0NTkyNSw1MzM5Nyw1MzM5OCw1MzM5OSw1MzQwMCw1MzQwMSw1MzQwMiw1MzQwMyw1MzQwNCw1MzQwNSw1MzQwNiw1MzQwNyw1MzQwOCw1MzQwOSw1MzQxMCw1MzQxMSw1MzQxNCw1MzQxNSw1MzQxNyw1MzQxOCw1MzQxOSw1MzQyMSw1MzQyMiw1MzQyMyw1MzQyNCw1MzQyNSw1MzQyNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzQyNyw1MzQzMCw1MzQzMiw1MzQzNCw1MzQzNSw1MzQzNiw1MzQzNyw1MzQzOCw1MzQzOSw1MzQ0Miw1MzQ0Myw1MzQ0NSw1MzQ0Niw1MzQ0Nyw1MzQ1MCw1MzQ1MSw1MzQ1Miw1MzQ1Myw1MzQ1NCw1MzQ1NSw1MzQ1OCw1MzQ2Miw1MzQ2Myw1MzQ2NCw1MzQ2NSw1MzQ2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzQ2Nyw1MzQ3MCw1MzQ3MSw1MzQ3Myw1MzQ3NCw1MzQ3NSw1MzQ3Nyw1MzQ3OCw1MzQ3OSw1MzQ4MCw1MzQ4MSw1MzQ4Miw1MzQ4Myw1MzQ4Niw1MzQ5MCw1MzQ5MSw1MzQ5Miw1MzQ5Myw1MzQ5NCw1MzQ5NSw1MzQ5Nyw1MzQ5OCw1MzQ5OSw1MzUwMCw1MzUwMSw1MzUwMiw1MzUwMyw1MzUwNCw1MzUwNSw1MzUwNiw1MzUwNyw1MzUwOCw0NTkyNyw0NTkyOSw0NTkzMSw0NTkzNCw0NTkzNiw0NTkzNyw0NTk0MCw0NTk0NCw0NTk1Miw0NTk1Myw0NTk1NSw0NTk1Niw0NTk1Nyw0NTk2NCw0NTk2OCw0NTk3Miw0NTk4NCw0NTk4NSw0NTk5Miw0NTk5Niw0NjAyMCw0NjAyMSw0NjAyNCw0NjAyNyw0NjAyOCw0NjAzMCw0NjAzMiw0NjAzNiw0NjAzNyw0NjAzOSw0NjA0MSw0NjA0Myw0NjA0NSw0NjA0OCw0NjA1Miw0NjA1Niw0NjA3Niw0NjA5Niw0NjEwNCw0NjEwOCw0NjExMiw0NjEyMCw0NjEyMSw0NjEyMyw0NjEzMiw0NjE2MCw0NjE2MSw0NjE2NCw0NjE2OCw0NjE3Niw0NjE3Nyw0NjE3OSw0NjE4MSw0NjE4OCw0NjIwOCw0NjIxNiw0NjIzNyw0NjI0NCw0NjI0OCw0NjI1Miw0NjI2MSw0NjI2Myw0NjI2NSw0NjI3Miw0NjI3Niw0NjI4MCw0NjI4OCw0NjI5Myw0NjMwMCw0NjMwMSw0NjMwNCw0NjMwNyw0NjMwOCw0NjMxMCw0NjMxNiw0NjMxNyw0NjMxOSw0NjMyMSw0NjMyOCw0NjM1Niw0NjM1Nyw0NjM2MCw0NjM2Myw0NjM2NCw0NjM3Miw0NjM3Myw0NjM3NSw0NjM3Niw0NjM3Nyw0NjM3OCw0NjM4NCw0NjM4NSw0NjM4OCw0NjM5Miw1MzUwOSw1MzUxMCw1MzUxMSw1MzUxMiw1MzUxMyw1MzUxNCw1MzUxNSw1MzUxNiw1MzUxOCw1MzUxOSw1MzUyMCw1MzUyMSw1MzUyMiw1MzUyMyw1MzUyNCw1MzUyNSw1MzUyNiw1MzUyNyw1MzUyOCw1MzUyOSw1MzUzMCw1MzUzMSw1MzUzMiw1MzUzMyw1MzUzNCw1MzUzNSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzUzNiw1MzUzNyw1MzUzOCw1MzUzOSw1MzU0MCw1MzU0MSw1MzU0Miw1MzU0Myw1MzU0NCw1MzU0NSw1MzU0Niw1MzU0Nyw1MzU0OCw1MzU0OSw1MzU1MCw1MzU1MSw1MzU1NCw1MzU1NSw1MzU1Nyw1MzU1OCw1MzU1OSw1MzU2MSw1MzU2Myw1MzU2NCw1MzU2NSw1MzU2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzU2Nyw1MzU3MCw1MzU3NCw1MzU3NSw1MzU3Niw1MzU3Nyw1MzU3OCw1MzU3OSw1MzU4Miw1MzU4Myw1MzU4NSw1MzU4Niw1MzU4Nyw1MzU4OSw1MzU5MCw1MzU5MSw1MzU5Miw1MzU5Myw1MzU5NCw1MzU5NSw1MzU5OCw1MzYwMCw1MzYwMiw1MzYwMyw1MzYwNCw1MzYwNSw1MzYwNiw1MzYwNyw1MzYwOSw1MzYxMCw1MzYxMSw1MzYxMyw0NjQwMCw0NjQwMSw0NjQwMyw0NjQwNCw0NjQwNSw0NjQxMSw0NjQxMiw0NjQxMyw0NjQxNiw0NjQyMCw0NjQyOCw0NjQyOSw0NjQzMSw0NjQzMiw0NjQzMyw0NjQ5Niw0NjQ5Nyw0NjUwMCw0NjUwNCw0NjUwNiw0NjUwNyw0NjUxMiw0NjUxMyw0NjUxNSw0NjUxNiw0NjUxNyw0NjUyMyw0NjUyNCw0NjUyNSw0NjUyOCw0NjUzMiw0NjU0MCw0NjU0MSw0NjU0Myw0NjU0NCw0NjU0NSw0NjU1Miw0NjU3Miw0NjYwOCw0NjYwOSw0NjYxMiw0NjYxNiw0NjYyOSw0NjYzNiw0NjY0NCw0NjY2NCw0NjY5Miw0NjY5Niw0Njc0OCw0Njc0OSw0Njc1Miw0Njc1Niw0Njc2Myw0Njc2NCw0Njc2OSw0NjgwNCw0NjgzMiw0NjgzNiw0Njg0MCw0Njg0OCw0Njg0OSw0Njg1Myw0Njg4OCw0Njg4OSw0Njg5Miw0Njg5NSw0Njg5Niw0NjkwNCw0NjkwNSw0NjkwNyw0NjkxNiw0NjkyMCw0NjkyNCw0NjkzMiw0NjkzMyw0Njk0NCw0Njk0OCw0Njk1Miw0Njk2MCw0Njk2MSw0Njk2Myw0Njk2NSw0Njk3Miw0Njk3Myw0Njk3Niw0Njk4MCw0Njk4OCw0Njk4OSw0Njk5MSw0Njk5Miw0Njk5Myw0Njk5NCw0Njk5OCw0Njk5OSw1MzYxNCw1MzYxNSw1MzYxNiw1MzYxNyw1MzYxOCw1MzYxOSw1MzYyMCw1MzYyMSw1MzYyMiw1MzYyMyw1MzYyNCw1MzYyNSw1MzYyNiw1MzYyNyw1MzYyOSw1MzYzMCw1MzYzMSw1MzYzMiw1MzYzMyw1MzYzNCw1MzYzNSw1MzYzNyw1MzYzOCw1MzYzOSw1MzY0MSw1MzY0MixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzY0Myw1MzY0NCw1MzY0NSw1MzY0Niw1MzY0Nyw1MzY0OCw1MzY0OSw1MzY1MCw1MzY1MSw1MzY1Miw1MzY1Myw1MzY1NCw1MzY1NSw1MzY1Niw1MzY1Nyw1MzY1OCw1MzY1OSw1MzY2MCw1MzY2MSw1MzY2Miw1MzY2Myw1MzY2Niw1MzY2Nyw1MzY2OSw1MzY3MCw1MzY3MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzY3Myw1MzY3NCw1MzY3NSw1MzY3Niw1MzY3Nyw1MzY3OCw1MzY3OSw1MzY4Miw1MzY4NCw1MzY4Niw1MzY4Nyw1MzY4OCw1MzY4OSw1MzY5MSw1MzY5Myw1MzY5NCw1MzY5NSw1MzY5Nyw1MzY5OCw1MzY5OSw1MzcwMCw1MzcwMSw1MzcwMiw1MzcwMyw1MzcwNCw1MzcwNSw1MzcwNiw1MzcwNyw1MzcwOCw1MzcwOSw1MzcxMCw1MzcxMSw0NzAwMCw0NzAwMSw0NzAwNCw0NzAwOCw0NzAxNiw0NzAxNyw0NzAxOSw0NzAyMCw0NzAyMSw0NzAyOCw0NzAyOSw0NzAzMiw0NzA0Nyw0NzA0OSw0NzA4NCw0NzA4NSw0NzA4OCw0NzA5Miw0NzEwMCw0NzEwMSw0NzEwMyw0NzEwNCw0NzEwNSw0NzExMSw0NzExMiw0NzExMyw0NzExNiw0NzEyMCw0NzEyOCw0NzEyOSw0NzEzMSw0NzEzMyw0NzE0MCw0NzE0MSw0NzE0NCw0NzE0OCw0NzE1Niw0NzE1Nyw0NzE1OSw0NzE2MCw0NzE2MSw0NzE2OCw0NzE3Miw0NzE4NSw0NzE4Nyw0NzE5Niw0NzE5Nyw0NzIwMCw0NzIwNCw0NzIxMiw0NzIxMyw0NzIxNSw0NzIxNyw0NzIyNCw0NzIyOCw0NzI0NSw0NzI3Miw0NzI4MCw0NzI4NCw0NzI4OCw0NzI5Niw0NzI5Nyw0NzI5OSw0NzMwMSw0NzMwOCw0NzMxMiw0NzMxNiw0NzMyNSw0NzMyNyw0NzMyOSw0NzMzNiw0NzMzNyw0NzM0MCw0NzM0NCw0NzM1Miw0NzM1Myw0NzM1NSw0NzM1Nyw0NzM2NCw0NzM4NCw0NzM5Miw0NzQyMCw0NzQyMSw0NzQyNCw0NzQyOCw0NzQzNiw0NzQzOSw0NzQ0MSw0NzQ0OCw0NzQ0OSw0NzQ1Miw0NzQ1Niw0NzQ2NCw0NzQ2NSw1MzcxMiw1MzcxMyw1MzcxNCw1MzcxNSw1MzcxNiw1MzcxNyw1MzcxOCw1MzcxOSw1MzcyMSw1MzcyMiw1MzcyMyw1MzcyNCw1MzcyNSw1MzcyNiw1MzcyNyw1MzcyOCw1MzcyOSw1MzczMCw1MzczMSw1MzczMiw1MzczMyw1MzczNCw1MzczNSw1MzczNiw1MzczNyw1MzczOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzczOSw1Mzc0MCw1Mzc0MSw1Mzc0Miw1Mzc0Myw1Mzc0NCw1Mzc0NSw1Mzc0Niw1Mzc0Nyw1Mzc0OSw1Mzc1MCw1Mzc1MSw1Mzc1Myw1Mzc1NCw1Mzc1NSw1Mzc1Niw1Mzc1Nyw1Mzc1OCw1Mzc1OSw1Mzc2MCw1Mzc2MSw1Mzc2Miw1Mzc2Myw1Mzc2NCw1Mzc2NSw1Mzc2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzc2OCw1Mzc3MCw1Mzc3MSw1Mzc3Miw1Mzc3Myw1Mzc3NCw1Mzc3NSw1Mzc3Nyw1Mzc3OCw1Mzc3OSw1Mzc4MCw1Mzc4MSw1Mzc4Miw1Mzc4Myw1Mzc4NCw1Mzc4NSw1Mzc4Niw1Mzc4Nyw1Mzc4OCw1Mzc4OSw1Mzc5MCw1Mzc5MSw1Mzc5Miw1Mzc5Myw1Mzc5NCw1Mzc5NSw1Mzc5Niw1Mzc5Nyw1Mzc5OCw1Mzc5OSw1MzgwMCw1MzgwMSw0NzQ2Nyw0NzQ2OSw0NzQ3Niw0NzQ3Nyw0NzQ4MCw0NzQ4NCw0NzQ5Miw0NzQ5Myw0NzQ5NSw0NzQ5Nyw0NzQ5OCw0NzUwMSw0NzUwMiw0NzUzMiw0NzUzMyw0NzUzNiw0NzU0MCw0NzU0OCw0NzU0OSw0NzU1MSw0NzU1Myw0NzU2MCw0NzU2MSw0NzU2NCw0NzU2Niw0NzU2Nyw0NzU2OCw0NzU2OSw0NzU3MCw0NzU3Niw0NzU3Nyw0NzU3OSw0NzU4MSw0NzU4Miw0NzU4NSw0NzU4Nyw0NzU4OCw0NzU4OSw0NzU5Miw0NzU5Niw0NzYwNCw0NzYwNSw0NzYwNyw0NzYwOCw0NzYwOSw0NzYxMCw0NzYxNiw0NzYxNyw0NzYyNCw0NzYzNyw0NzY3Miw0NzY3Myw0NzY3Niw0NzY4MCw0NzY4Miw0NzY4OCw0NzY4OSw0NzY5MSw0NzY5Myw0NzY5NCw0NzY5OSw0NzcwMCw0NzcwMSw0NzcwNCw0NzcwOCw0NzcxNiw0NzcxNyw0NzcxOSw0NzcyMCw0NzcyMSw0NzcyOCw0NzcyOSw0NzczMiw0NzczNiw0Nzc0Nyw0Nzc0OCw0Nzc0OSw0Nzc1MSw0Nzc1Niw0Nzc4NCw0Nzc4NSw0Nzc4Nyw0Nzc4OCw0Nzc5Miw0Nzc5NCw0NzgwMCw0NzgwMSw0NzgwMyw0NzgwNSw0NzgxMiw0NzgxNiw0NzgzMiw0NzgzMyw0Nzg2OCw1MzgwMiw1MzgwMyw1MzgwNiw1MzgwNyw1MzgwOSw1MzgxMCw1MzgxMSw1MzgxMyw1MzgxNCw1MzgxNSw1MzgxNiw1MzgxNyw1MzgxOCw1MzgxOSw1MzgyMiw1MzgyNCw1MzgyNiw1MzgyNyw1MzgyOCw1MzgyOSw1MzgzMCw1MzgzMSw1MzgzMyw1MzgzNCw1MzgzNSw1MzgzNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzgzNyw1MzgzOCw1MzgzOSw1Mzg0MCw1Mzg0MSw1Mzg0Miw1Mzg0Myw1Mzg0NCw1Mzg0NSw1Mzg0Niw1Mzg0Nyw1Mzg0OCw1Mzg0OSw1Mzg1MCw1Mzg1MSw1Mzg1Myw1Mzg1NCw1Mzg1NSw1Mzg1Niw1Mzg1Nyw1Mzg1OCw1Mzg1OSw1Mzg2MSw1Mzg2Miw1Mzg2Myw1Mzg2NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzg2NSw1Mzg2Niw1Mzg2Nyw1Mzg2OCw1Mzg2OSw1Mzg3MCw1Mzg3MSw1Mzg3Miw1Mzg3Myw1Mzg3NCw1Mzg3NSw1Mzg3Niw1Mzg3Nyw1Mzg3OCw1Mzg3OSw1Mzg4MCw1Mzg4MSw1Mzg4Miw1Mzg4Myw1Mzg4NCw1Mzg4NSw1Mzg4Niw1Mzg4Nyw1Mzg5MCw1Mzg5MSw1Mzg5Myw1Mzg5NCw1Mzg5NSw1Mzg5Nyw1Mzg5OCw1Mzg5OSw1MzkwMCw0Nzg3Miw0Nzg3Niw0Nzg4NSw0Nzg4Nyw0Nzg4OSw0Nzg5Niw0NzkwMCw0NzkwNCw0NzkxMyw0NzkxNSw0NzkyNCw0NzkyNSw0NzkyNiw0NzkyOCw0NzkzMSw0NzkzMiw0NzkzMyw0NzkzNCw0Nzk0MCw0Nzk0MSw0Nzk0Myw0Nzk0NSw0Nzk0OSw0Nzk1MSw0Nzk1Miw0Nzk1Niw0Nzk2MCw0Nzk2OSw0Nzk3MSw0Nzk4MCw0ODAwOCw0ODAxMiw0ODAxNiw0ODAzNiw0ODA0MCw0ODA0NCw0ODA1Miw0ODA1NSw0ODA2NCw0ODA2OCw0ODA3Miw0ODA4MCw0ODA4Myw0ODEyMCw0ODEyMSw0ODEyNCw0ODEyNyw0ODEyOCw0ODEzMCw0ODEzNiw0ODEzNyw0ODEzOSw0ODE0MCw0ODE0MSw0ODE0Myw0ODE0NSw0ODE0OCw0ODE0OSw0ODE1MCw0ODE1MSw0ODE1Miw0ODE1NSw0ODE1Niw0ODE1Nyw0ODE1OCw0ODE1OSw0ODE2NCw0ODE2NSw0ODE2Nyw0ODE2OSw0ODE3Myw0ODE3Niw0ODE3Nyw0ODE4MCw0ODE4NCw0ODE5Miw0ODE5Myw0ODE5NSw0ODE5Niw0ODE5Nyw0ODIwMSw0ODIwNCw0ODIwNSw0ODIwOCw0ODIyMSw0ODI2MCw0ODI2MSw0ODI2NCw0ODI2Nyw0ODI2OCw0ODI3MCw0ODI3Niw0ODI3Nyw0ODI3OSw1MzkwMSw1MzkwMiw1MzkwMyw1MzkwNiw1MzkwNyw1MzkwOCw1MzkxMCw1MzkxMSw1MzkxMiw1MzkxMyw1MzkxNCw1MzkxNSw1MzkxNyw1MzkxOCw1MzkxOSw1MzkyMSw1MzkyMiw1MzkyMyw1MzkyNSw1MzkyNiw1MzkyNyw1MzkyOCw1MzkyOSw1MzkzMCw1MzkzMSw1MzkzMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1MzkzNCw1MzkzNSw1MzkzNiw1MzkzOCw1MzkzOSw1Mzk0MCw1Mzk0MSw1Mzk0Miw1Mzk0Myw1Mzk0Niw1Mzk0Nyw1Mzk0OSw1Mzk1MCw1Mzk1Myw1Mzk1NSw1Mzk1Niw1Mzk1Nyw1Mzk1OCw1Mzk1OSw1Mzk2Miw1Mzk2NCw1Mzk2NSw1Mzk2Niw1Mzk2Nyw1Mzk2OCw1Mzk2OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzk3MCw1Mzk3MSw1Mzk3Myw1Mzk3NCw1Mzk3NSw1Mzk3Nyw1Mzk3OCw1Mzk3OSw1Mzk4MSw1Mzk4Miw1Mzk4Myw1Mzk4NCw1Mzk4NSw1Mzk4Niw1Mzk4Nyw1Mzk5MCw1Mzk5MSw1Mzk5Miw1Mzk5Myw1Mzk5NCw1Mzk5NSw1Mzk5Niw1Mzk5Nyw1Mzk5OCw1Mzk5OSw1NDAwMiw1NDAwMyw1NDAwNSw1NDAwNiw1NDAwNyw1NDAwOSw1NDAxMCw0ODI4MSw0ODI4Miw0ODI4OCw0ODI4OSw0ODI5Miw0ODI5NSw0ODI5Niw0ODMwNCw0ODMwNSw0ODMwNyw0ODMwOCw0ODMwOSw0ODMxNiw0ODMxNyw0ODMyMCw0ODMyNCw0ODMzMyw0ODMzNSw0ODMzNiw0ODMzNyw0ODM0MSw0ODM0NCw0ODM0OCw0ODM3Miw0ODM3Myw0ODM3NCw0ODM3Niw0ODM4MCw0ODM4OCw0ODM4OSw0ODM5MSw0ODM5Myw0ODQwMCw0ODQwNCw0ODQyMCw0ODQyOCw0ODQ0OCw0ODQ1Niw0ODQ1Nyw0ODQ2MCw0ODQ2NCw0ODQ3Miw0ODQ3Myw0ODQ4NCw0ODQ4OCw0ODUxMiw0ODUxMyw0ODUxNiw0ODUxOSw0ODUyMCw0ODUyMSw0ODUyMiw0ODUyOCw0ODUyOSw0ODUzMSw0ODUzMyw0ODUzNyw0ODUzOCw0ODU0MCw0ODU0OCw0ODU2MCw0ODU2OCw0ODU5Niw0ODU5Nyw0ODYwMCw0ODYwNCw0ODYxNyw0ODYyNCw0ODYyOCw0ODYzMiw0ODY0MCw0ODY0Myw0ODY0NSw0ODY1Miw0ODY1Myw0ODY1Niw0ODY2MCw0ODY2OCw0ODY2OSw0ODY3MSw0ODcwOCw0ODcwOSw0ODcxMiw0ODcxNiw0ODcxOCw0ODcyNCw0ODcyNSw0ODcyNyw0ODcyOSw0ODczMCw0ODczMSw0ODczNiw0ODczNyw0ODc0MCw1NDAxMSw1NDAxMiw1NDAxMyw1NDAxNCw1NDAxNSw1NDAxOCw1NDAyMCw1NDAyMiw1NDAyMyw1NDAyNCw1NDAyNSw1NDAyNiw1NDAyNyw1NDAzMSw1NDAzMyw1NDAzNCw1NDAzNSw1NDAzNyw1NDAzOSw1NDA0MCw1NDA0MSw1NDA0Miw1NDA0Myw1NDA0Niw1NDA1MCw1NDA1MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDA1Miw1NDA1NCw1NDA1NSw1NDA1OCw1NDA1OSw1NDA2MSw1NDA2Miw1NDA2Myw1NDA2NSw1NDA2Niw1NDA2Nyw1NDA2OCw1NDA2OSw1NDA3MCw1NDA3MSw1NDA3NCw1NDA3OCw1NDA3OSw1NDA4MCw1NDA4MSw1NDA4Miw1NDA4Myw1NDA4Niw1NDA4Nyw1NDA4OCw1NDA4OSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDA5MCw1NDA5MSw1NDA5Miw1NDA5Myw1NDA5NCw1NDA5NSw1NDA5Niw1NDA5Nyw1NDA5OCw1NDA5OSw1NDEwMCw1NDEwMSw1NDEwMiw1NDEwMyw1NDEwNCw1NDEwNSw1NDEwNiw1NDEwNyw1NDEwOCw1NDEwOSw1NDExMCw1NDExMSw1NDExMiw1NDExMyw1NDExNCw1NDExNSw1NDExNiw1NDExNyw1NDExOCw1NDExOSw1NDEyMCw1NDEyMSw0ODc0NCw0ODc0Niw0ODc1Miw0ODc1Myw0ODc1NSw0ODc1Niw0ODc1Nyw0ODc2Myw0ODc2NCw0ODc2NSw0ODc2OCw0ODc3Miw0ODc4MCw0ODc4MSw0ODc4Myw0ODc4NCw0ODc4NSw0ODc5Miw0ODc5Myw0ODgwOCw0ODg0OCw0ODg0OSw0ODg1Miw0ODg1NSw0ODg1Niw0ODg2NCw0ODg2Nyw0ODg2OCw0ODg2OSw0ODg3Niw0ODg5Nyw0ODkwNCw0ODkwNSw0ODkyMCw0ODkyMSw0ODkyMyw0ODkyNCw0ODkyNSw0ODk2MCw0ODk2MSw0ODk2NCw0ODk2OCw0ODk3Niw0ODk3Nyw0ODk4MSw0OTA0NCw0OTA3Miw0OTA5Myw0OTEwMCw0OTEwMSw0OTEwNCw0OTEwOCw0OTExNiw0OTExOSw0OTEyMSw0OTIxMiw0OTIzMyw0OTI0MCw0OTI0NCw0OTI0OCw0OTI1Niw0OTI1Nyw0OTI5Niw0OTI5Nyw0OTMwMCw0OTMwNCw0OTMxMiw0OTMxMyw0OTMxNSw0OTMxNyw0OTMyNCw0OTMyNSw0OTMyNyw0OTMyOCw0OTMzMSw0OTMzMiw0OTMzMyw0OTMzNCw0OTM0MCw0OTM0MSw0OTM0Myw0OTM0NCw0OTM0NSw0OTM0OSw0OTM1Miw0OTM1Myw0OTM1Niw0OTM2MCw0OTM2OCw0OTM2OSw0OTM3MSw0OTM3Miw0OTM3Myw0OTM4MCw1NDEyMiw1NDEyMyw1NDEyNCw1NDEyNSw1NDEyNiw1NDEyNyw1NDEyOCw1NDEyOSw1NDEzMCw1NDEzMSw1NDEzMiw1NDEzMyw1NDEzNCw1NDEzNSw1NDEzNiw1NDEzNyw1NDEzOCw1NDEzOSw1NDE0Miw1NDE0Myw1NDE0NSw1NDE0Niw1NDE0Nyw1NDE0OSw1NDE1MCw1NDE1MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDE1Miw1NDE1Myw1NDE1NCw1NDE1NSw1NDE1OCw1NDE2Miw1NDE2Myw1NDE2NCw1NDE2NSw1NDE2Niw1NDE2Nyw1NDE3MCw1NDE3MSw1NDE3Myw1NDE3NCw1NDE3NSw1NDE3Nyw1NDE3OCw1NDE3OSw1NDE4MCw1NDE4MSw1NDE4Miw1NDE4Myw1NDE4Niw1NDE4OCw1NDE5MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDE5MSw1NDE5Miw1NDE5Myw1NDE5NCw1NDE5NSw1NDE5Nyw1NDE5OCw1NDE5OSw1NDIwMSw1NDIwMiw1NDIwMyw1NDIwNSw1NDIwNiw1NDIwNyw1NDIwOCw1NDIwOSw1NDIxMCw1NDIxMSw1NDIxNCw1NDIxNSw1NDIxOCw1NDIxOSw1NDIyMCw1NDIyMSw1NDIyMiw1NDIyMyw1NDIyNSw1NDIyNiw1NDIyNyw1NDIyOCw1NDIyOSw1NDIzMCw0OTM4MSw0OTM4NCw0OTM4OCw0OTM5Niw0OTM5Nyw0OTM5OSw0OTQwMSw0OTQwOCw0OTQxMiw0OTQxNiw0OTQyNCw0OTQyOSw0OTQzNiw0OTQzNyw0OTQzOCw0OTQzOSw0OTQ0MCw0OTQ0Myw0OTQ0NCw0OTQ0Niw0OTQ0Nyw0OTQ1Miw0OTQ1Myw0OTQ1NSw0OTQ1Niw0OTQ1Nyw0OTQ2Miw0OTQ2NCw0OTQ2NSw0OTQ2OCw0OTQ3Miw0OTQ4MCw0OTQ4MSw0OTQ4Myw0OTQ4NCw0OTQ4NSw0OTQ5Miw0OTQ5Myw0OTQ5Niw0OTUwMCw0OTUwOCw0OTUwOSw0OTUxMSw0OTUxMiw0OTUxMyw0OTUyMCw0OTUyNCw0OTUyOCw0OTU0MSw0OTU0OCw0OTU0OSw0OTU1MCw0OTU1Miw0OTU1Niw0OTU1OCw0OTU2NCw0OTU2NSw0OTU2Nyw0OTU2OSw0OTU3Myw0OTU3Niw0OTU3Nyw0OTU4MCw0OTU4NCw0OTU5Nyw0OTYwNCw0OTYwOCw0OTYxMiw0OTYyMCw0OTYyMyw0OTYyNCw0OTYzMiw0OTYzNiw0OTY0MCw0OTY0OCw0OTY0OSw0OTY1MSw0OTY2MCw0OTY2MSw0OTY2NCw0OTY2OCw0OTY3Niw0OTY3Nyw0OTY3OSw0OTY4MSw0OTY4OCw0OTY4OSw0OTY5Miw0OTY5NSw0OTY5Niw0OTcwNCw0OTcwNSw0OTcwNyw0OTcwOSw1NDIzMSw1NDIzMyw1NDIzNCw1NDIzNSw1NDIzNiw1NDIzNyw1NDIzOCw1NDIzOSw1NDI0MCw1NDI0Miw1NDI0NCw1NDI0NSw1NDI0Niw1NDI0Nyw1NDI0OCw1NDI0OSw1NDI1MCw1NDI1MSw1NDI1NCw1NDI1NSw1NDI1Nyw1NDI1OCw1NDI1OSw1NDI2MSw1NDI2Miw1NDI2MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDI2NCw1NDI2NSw1NDI2Niw1NDI2Nyw1NDI3MCw1NDI3Miw1NDI3NCw1NDI3NSw1NDI3Niw1NDI3Nyw1NDI3OCw1NDI3OSw1NDI4MSw1NDI4Miw1NDI4Myw1NDI4NCw1NDI4NSw1NDI4Niw1NDI4Nyw1NDI4OCw1NDI4OSw1NDI5MCw1NDI5MSw1NDI5Miw1NDI5Myw1NDI5NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDI5NSw1NDI5Niw1NDI5Nyw1NDI5OCw1NDI5OSw1NDMwMCw1NDMwMiw1NDMwMyw1NDMwNCw1NDMwNSw1NDMwNiw1NDMwNyw1NDMwOCw1NDMwOSw1NDMxMCw1NDMxMSw1NDMxMiw1NDMxMyw1NDMxNCw1NDMxNSw1NDMxNiw1NDMxNyw1NDMxOCw1NDMxOSw1NDMyMCw1NDMyMSw1NDMyMiw1NDMyMyw1NDMyNCw1NDMyNSw1NDMyNiw1NDMyNyw0OTcxMSw0OTcxMyw0OTcxNCw0OTcxNiw0OTczNiw0OTc0NCw0OTc0NSw0OTc0OCw0OTc1Miw0OTc2MCw0OTc2NSw0OTc3Miw0OTc3Myw0OTc3Niw0OTc4MCw0OTc4OCw0OTc4OSw0OTc5MSw0OTc5Myw0OTgwMCw0OTgwMSw0OTgwOCw0OTgxNiw0OTgxOSw0OTgyMSw0OTgyOCw0OTgyOSw0OTgzMiw0OTgzNiw0OTgzNyw0OTg0NCw0OTg0NSw0OTg0Nyw0OTg0OSw0OTg4NCw0OTg4NSw0OTg4OCw0OTg5MSw0OTg5Miw0OTg5OSw0OTkwMCw0OTkwMSw0OTkwMyw0OTkwNSw0OTkxMCw0OTkxMiw0OTkxMyw0OTkxNSw0OTkxNiw0OTkyMCw0OTkyOCw0OTkyOSw0OTkzMiw0OTkzMyw0OTkzOSw0OTk0MCw0OTk0MSw0OTk0NCw0OTk0OCw0OTk1Niw0OTk1Nyw0OTk2MCw0OTk2MSw0OTk4OSw1MDAyNCw1MDAyNSw1MDAyOCw1MDAzMiw1MDAzNCw1MDA0MCw1MDA0MSw1MDA0NCw1MDA0NSw1MDA1Miw1MDA1Niw1MDA2MCw1MDExMiw1MDEzNiw1MDEzNyw1MDE0MCw1MDE0Myw1MDE0NCw1MDE0Niw1MDE1Miw1MDE1Myw1MDE1Nyw1MDE2NCw1MDE2NSw1MDE2OCw1MDE4NCw1MDE5Miw1MDIxMiw1MDIyMCw1MDIyNCw1NDMyOCw1NDMyOSw1NDMzMCw1NDMzMSw1NDMzMiw1NDMzMyw1NDMzNCw1NDMzNSw1NDMzNyw1NDMzOCw1NDMzOSw1NDM0MSw1NDM0Miw1NDM0Myw1NDM0NCw1NDM0NSw1NDM0Niw1NDM0Nyw1NDM0OCw1NDM0OSw1NDM1MCw1NDM1MSw1NDM1Miw1NDM1Myw1NDM1NCw1NDM1NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDM1Niw1NDM1Nyw1NDM1OCw1NDM1OSw1NDM2MCw1NDM2MSw1NDM2Miw1NDM2Myw1NDM2NSw1NDM2Niw1NDM2Nyw1NDM2OSw1NDM3MCw1NDM3MSw1NDM3Myw1NDM3NCw1NDM3NSw1NDM3Niw1NDM3Nyw1NDM3OCw1NDM3OSw1NDM4MCw1NDM4Miw1NDM4NCw1NDM4NSw1NDM4NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDM4Nyw1NDM4OCw1NDM4OSw1NDM5MCw1NDM5MSw1NDM5NCw1NDM5NSw1NDM5Nyw1NDM5OCw1NDQwMSw1NDQwMyw1NDQwNCw1NDQwNSw1NDQwNiw1NDQwNyw1NDQxMCw1NDQxMiw1NDQxNCw1NDQxNSw1NDQxNiw1NDQxNyw1NDQxOCw1NDQxOSw1NDQyMSw1NDQyMiw1NDQyMyw1NDQyNCw1NDQyNSw1NDQyNiw1NDQyNyw1NDQyOCw1NDQyOSw1MDIyOCw1MDIzNiw1MDIzNyw1MDI0OCw1MDI3Niw1MDI3Nyw1MDI4MCw1MDI4NCw1MDI5Miw1MDI5Myw1MDI5Nyw1MDMwNCw1MDMyNCw1MDMzMiw1MDM2MCw1MDM2NCw1MDQwOSw1MDQxNiw1MDQxNyw1MDQyMCw1MDQyNCw1MDQyNiw1MDQzMSw1MDQzMiw1MDQzMyw1MDQ0NCw1MDQ0OCw1MDQ1Miw1MDQ2MCw1MDQ3Miw1MDQ3Myw1MDQ3Niw1MDQ4MCw1MDQ4OCw1MDQ4OSw1MDQ5MSw1MDQ5Myw1MDUwMCw1MDUwMSw1MDUwNCw1MDUwNSw1MDUwNiw1MDUwOCw1MDUwOSw1MDUxMCw1MDUxNSw1MDUxNiw1MDUxNyw1MDUxOSw1MDUyMCw1MDUyMSw1MDUyNSw1MDUyNiw1MDUyOCw1MDUyOSw1MDUzMiw1MDUzNiw1MDU0NCw1MDU0NSw1MDU0Nyw1MDU0OCw1MDU0OSw1MDU1Niw1MDU1Nyw1MDU2MCw1MDU2NCw1MDU2Nyw1MDU3Miw1MDU3Myw1MDU3NSw1MDU3Nyw1MDU4MSw1MDU4Myw1MDU4NCw1MDU4OCw1MDU5Miw1MDYwMSw1MDYxMiw1MDYxMyw1MDYxNiw1MDYxNyw1MDYxOSw1MDYyMCw1MDYyMSw1MDYyMiw1MDYyOCw1MDYyOSw1MDYzMCw1MDYzMSw1MDYzMiw1MDYzMyw1MDYzNCw1MDYzNiw1MDYzOCw1NDQzMCw1NDQzMSw1NDQzMiw1NDQzMyw1NDQzNCw1NDQzNSw1NDQzNiw1NDQzNyw1NDQzOCw1NDQzOSw1NDQ0MCw1NDQ0Miw1NDQ0Myw1NDQ0NCw1NDQ0NSw1NDQ0Niw1NDQ0Nyw1NDQ0OCw1NDQ0OSw1NDQ1MCw1NDQ1MSw1NDQ1Miw1NDQ1Myw1NDQ1NCw1NDQ1NSw1NDQ1NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDQ1Nyw1NDQ1OCw1NDQ1OSw1NDQ2MCw1NDQ2MSw1NDQ2Miw1NDQ2Myw1NDQ2NCw1NDQ2NSw1NDQ2Niw1NDQ2Nyw1NDQ2OCw1NDQ2OSw1NDQ3MCw1NDQ3MSw1NDQ3Miw1NDQ3Myw1NDQ3NCw1NDQ3NSw1NDQ3Nyw1NDQ3OCw1NDQ3OSw1NDQ4MSw1NDQ4Miw1NDQ4Myw1NDQ4NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDQ4Niw1NDQ4Nyw1NDQ4OCw1NDQ4OSw1NDQ5MCw1NDQ5MSw1NDQ5Myw1NDQ5NCw1NDQ5Niw1NDQ5Nyw1NDQ5OCw1NDQ5OSw1NDUwMCw1NDUwMSw1NDUwMiw1NDUwMyw1NDUwNSw1NDUwNiw1NDUwNyw1NDUwOSw1NDUxMCw1NDUxMSw1NDUxMyw1NDUxNCw1NDUxNSw1NDUxNiw1NDUxNyw1NDUxOCw1NDUxOSw1NDUyMSw1NDUyMiw1NDUyNCw1MDY0MCw1MDY0MSw1MDY0NCw1MDY0OCw1MDY1Niw1MDY1Nyw1MDY1OSw1MDY2MSw1MDY2OCw1MDY2OSw1MDY3MCw1MDY3Miw1MDY3Niw1MDY3OCw1MDY3OSw1MDY4NCw1MDY4NSw1MDY4Niw1MDY4Nyw1MDY4OCw1MDY4OSw1MDY5Myw1MDY5NCw1MDY5NSw1MDY5Niw1MDcwMCw1MDcwNCw1MDcxMiw1MDcxMyw1MDcxNSw1MDcxNiw1MDcyNCw1MDcyNSw1MDcyOCw1MDczMiw1MDczMyw1MDczNCw1MDczNiw1MDczOSw1MDc0MCw1MDc0MSw1MDc0Myw1MDc0NSw1MDc0Nyw1MDc1Miw1MDc1Myw1MDc1Niw1MDc2MCw1MDc2OCw1MDc2OSw1MDc3MSw1MDc3Miw1MDc3Myw1MDc4MCw1MDc4MSw1MDc4NCw1MDc5Niw1MDc5OSw1MDgwMSw1MDgwOCw1MDgwOSw1MDgxMiw1MDgxNiw1MDgyNCw1MDgyNSw1MDgyNyw1MDgyOSw1MDgzNiw1MDgzNyw1MDg0MCw1MDg0NCw1MDg1Miw1MDg1Myw1MDg1NSw1MDg1Nyw1MDg2NCw1MDg2NSw1MDg2OCw1MDg3Miw1MDg3Myw1MDg3NCw1MDg4MCw1MDg4MSw1MDg4Myw1MDg4NSw1MDg5Miw1MDg5Myw1MDg5Niw1MDkwMCw1MDkwOCw1MDkwOSw1MDkxMiw1MDkxMyw1MDkyMCw1NDUyNiw1NDUyNyw1NDUyOCw1NDUyOSw1NDUzMCw1NDUzMSw1NDUzMyw1NDUzNCw1NDUzNSw1NDUzNyw1NDUzOCw1NDUzOSw1NDU0MSw1NDU0Miw1NDU0Myw1NDU0NCw1NDU0NSw1NDU0Niw1NDU0Nyw1NDU1MCw1NDU1Miw1NDU1Myw1NDU1NCw1NDU1NSw1NDU1Niw1NDU1NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDU1OCw1NDU1OSw1NDU2MCw1NDU2MSw1NDU2Miw1NDU2Myw1NDU2NCw1NDU2NSw1NDU2Niw1NDU2Nyw1NDU2OCw1NDU2OSw1NDU3MCw1NDU3MSw1NDU3Miw1NDU3Myw1NDU3NCw1NDU3NSw1NDU3Niw1NDU3Nyw1NDU3OCw1NDU3OSw1NDU4MCw1NDU4MSw1NDU4Miw1NDU4MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDU4NCw1NDU4NSw1NDU4Niw1NDU4Nyw1NDU5MCw1NDU5MSw1NDU5Myw1NDU5NCw1NDU5NSw1NDU5Nyw1NDU5OCw1NDU5OSw1NDYwMCw1NDYwMSw1NDYwMiw1NDYwMyw1NDYwNiw1NDYwOCw1NDYxMCw1NDYxMSw1NDYxMiw1NDYxMyw1NDYxNCw1NDYxNSw1NDYxOCw1NDYxOSw1NDYyMSw1NDYyMiw1NDYyMyw1NDYyNSw1NDYyNiw1NDYyNyw1MDkyMSw1MDkyNCw1MDkyOCw1MDkzNiw1MDkzNyw1MDk0MSw1MDk0OCw1MDk0OSw1MDk1Miw1MDk1Niw1MDk2NCw1MDk2NSw1MDk2Nyw1MDk2OSw1MDk3Niw1MDk3Nyw1MDk4MCw1MDk4NCw1MDk5Miw1MDk5Myw1MDk5NSw1MDk5Nyw1MDk5OSw1MTAwNCw1MTAwNSw1MTAwOCw1MTAxMiw1MTAxOCw1MTAyMCw1MTAyMSw1MTAyMyw1MTAyNSw1MTAyNiw1MTAyNyw1MTAyOCw1MTAyOSw1MTAzMCw1MTAzMSw1MTAzMiw1MTAzNiw1MTA0MCw1MTA0OCw1MTA1MSw1MTA2MCw1MTA2MSw1MTA2NCw1MTA2OCw1MTA2OSw1MTA3MCw1MTA3NSw1MTA3Niw1MTA3Nyw1MTA3OSw1MTA4MCw1MTA4MSw1MTA4Miw1MTA4Niw1MTA4OCw1MTA4OSw1MTA5Miw1MTA5NCw1MTA5NSw1MTA5Niw1MTA5OCw1MTEwNCw1MTEwNSw1MTEwNyw1MTEwOCw1MTEwOSw1MTExMCw1MTExNiw1MTExNyw1MTEyMCw1MTEyNCw1MTEzMiw1MTEzMyw1MTEzNSw1MTEzNiw1MTEzNyw1MTE0NCw1MTE0NSw1MTE0OCw1MTE1MCw1MTE1Miw1MTE2MCw1MTE2NSw1MTE3Miw1MTE3Niw1MTE4MCw1MTIwMCw1MTIwMSw1MTIwNCw1MTIwOCw1MTIxMCw1NDYyOCw1NDYzMCw1NDYzMSw1NDYzNCw1NDYzNiw1NDYzOCw1NDYzOSw1NDY0MCw1NDY0MSw1NDY0Miw1NDY0Myw1NDY0Niw1NDY0Nyw1NDY0OSw1NDY1MCw1NDY1MSw1NDY1Myw1NDY1NCw1NDY1NSw1NDY1Niw1NDY1Nyw1NDY1OCw1NDY1OSw1NDY2Miw1NDY2Niw1NDY2NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDY2OCw1NDY2OSw1NDY3MCw1NDY3MSw1NDY3Myw1NDY3NCw1NDY3NSw1NDY3Niw1NDY3Nyw1NDY3OCw1NDY3OSw1NDY4MCw1NDY4MSw1NDY4Miw1NDY4Myw1NDY4NCw1NDY4NSw1NDY4Niw1NDY4Nyw1NDY4OCw1NDY4OSw1NDY5MCw1NDY5MSw1NDY5Miw1NDY5NCw1NDY5NSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDY5Niw1NDY5Nyw1NDY5OCw1NDY5OSw1NDcwMCw1NDcwMSw1NDcwMiw1NDcwMyw1NDcwNCw1NDcwNSw1NDcwNiw1NDcwNyw1NDcwOCw1NDcwOSw1NDcxMCw1NDcxMSw1NDcxMiw1NDcxMyw1NDcxNCw1NDcxNSw1NDcxNiw1NDcxNyw1NDcxOCw1NDcxOSw1NDcyMCw1NDcyMSw1NDcyMiw1NDcyMyw1NDcyNCw1NDcyNSw1NDcyNiw1NDcyNyw1MTIxNiw1MTIxNyw1MTIxOSw1MTIyMSw1MTIyMiw1MTIyOCw1MTIyOSw1MTIzMiw1MTIzNiw1MTI0NCw1MTI0NSw1MTI0Nyw1MTI0OSw1MTI1Niw1MTI2MCw1MTI2NCw1MTI3Miw1MTI3Myw1MTI3Niw1MTI3Nyw1MTI4NCw1MTMxMiw1MTMxMyw1MTMxNiw1MTMyMCw1MTMyMiw1MTMyOCw1MTMyOSw1MTMzMSw1MTMzMyw1MTMzNCw1MTMzNSw1MTMzOSw1MTM0MCw1MTM0MSw1MTM0OCw1MTM1Nyw1MTM1OSw1MTM2MSw1MTM2OCw1MTM4OCw1MTM4OSw1MTM5Niw1MTQwMCw1MTQwNCw1MTQxMiw1MTQxMyw1MTQxNSw1MTQxNyw1MTQyNCw1MTQyNSw1MTQyOCw1MTQ0NSw1MTQ1Miw1MTQ1Myw1MTQ1Niw1MTQ2MCw1MTQ2MSw1MTQ2Miw1MTQ2OCw1MTQ2OSw1MTQ3MSw1MTQ3Myw1MTQ4MCw1MTUwMCw1MTUwOCw1MTUzNiw1MTUzNyw1MTU0MCw1MTU0NCw1MTU1Miw1MTU1Myw1MTU1NSw1MTU2NCw1MTU2OCw1MTU3Miw1MTU4MCw1MTU5Miw1MTU5Myw1MTU5Niw1MTYwMCw1MTYwOCw1MTYwOSw1MTYxMSw1MTYxMyw1MTY0OCw1MTY0OSw1MTY1Miw1MTY1NSw1MTY1Niw1MTY1OCw1MTY2NCw1MTY2NSw1MTY2Nyw1NDczMCw1NDczMSw1NDczMyw1NDczNCw1NDczNSw1NDczNyw1NDczOSw1NDc0MCw1NDc0MSw1NDc0Miw1NDc0Myw1NDc0Niw1NDc0OCw1NDc1MCw1NDc1MSw1NDc1Miw1NDc1Myw1NDc1NCw1NDc1NSw1NDc1OCw1NDc1OSw1NDc2MSw1NDc2Miw1NDc2Myw1NDc2NSw1NDc2NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDc2Nyw1NDc2OCw1NDc2OSw1NDc3MCw1NDc3MSw1NDc3NCw1NDc3Niw1NDc3OCw1NDc3OSw1NDc4MCw1NDc4MSw1NDc4Miw1NDc4Myw1NDc4Niw1NDc4Nyw1NDc4OSw1NDc5MCw1NDc5MSw1NDc5Myw1NDc5NCw1NDc5NSw1NDc5Niw1NDc5Nyw1NDc5OCw1NDc5OSw1NDgwMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDgwNiw1NDgwNyw1NDgwOCw1NDgwOSw1NDgxMCw1NDgxMSw1NDgxMyw1NDgxNCw1NDgxNSw1NDgxNyw1NDgxOCw1NDgxOSw1NDgyMSw1NDgyMiw1NDgyMyw1NDgyNCw1NDgyNSw1NDgyNiw1NDgyNyw1NDgyOCw1NDgzMCw1NDgzMSw1NDgzMiw1NDgzMyw1NDgzNCw1NDgzNSw1NDgzNiw1NDgzNyw1NDgzOCw1NDgzOSw1NDg0Miw1NDg0Myw1MTY2OSw1MTY3MCw1MTY3Myw1MTY3NCw1MTY3Niw1MTY3Nyw1MTY4MCw1MTY4Miw1MTY4NCw1MTY4Nyw1MTY5Miw1MTY5Myw1MTY5NSw1MTY5Niw1MTY5Nyw1MTcwNCw1MTcwNSw1MTcwOCw1MTcxMiw1MTcyMCw1MTcyMSw1MTcyMyw1MTcyNCw1MTcyNSw1MTczMiw1MTczNiw1MTc1Myw1MTc4OCw1MTc4OSw1MTc5Miw1MTc5Niw1MTgwNCw1MTgwNSw1MTgwNyw1MTgwOCw1MTgwOSw1MTgxNiw1MTgzNyw1MTg0NCw1MTg2NCw1MTkwMCw1MTkwMSw1MTkwNCw1MTkwOCw1MTkxNiw1MTkxNyw1MTkxOSw1MTkyMSw1MTkyMyw1MTkyOCw1MTkyOSw1MTkzNiw1MTk0OCw1MTk1Niw1MTk3Niw1MTk4NCw1MTk4OCw1MTk5Miw1MjAwMCw1MjAwMSw1MjAzMyw1MjA0MCw1MjA0MSw1MjA0NCw1MjA0OCw1MjA1Niw1MjA1Nyw1MjA2MSw1MjA2OCw1MjA4OCw1MjA4OSw1MjEyNCw1MjE1Miw1MjE4MCw1MjE5Niw1MjE5OSw1MjIwMSw1MjIzNiw1MjIzNyw1MjI0MCw1MjI0NCw1MjI1Miw1MjI1Myw1MjI1Nyw1MjI1OCw1MjI2Myw1MjI2NCw1MjI2NSw1MjI2OCw1MjI3MCw1MjI3Miw1MjI4MCw1MjI4MSw1MjI4Myw1NDg0NSw1NDg0Niw1NDg0Nyw1NDg0OSw1NDg1MCw1NDg1MSw1NDg1Miw1NDg1NCw1NDg1NSw1NDg1OCw1NDg2MCw1NDg2Miw1NDg2Myw1NDg2NCw1NDg2Niw1NDg2Nyw1NDg3MCw1NDg3MSw1NDg3Myw1NDg3NCw1NDg3NSw1NDg3Nyw1NDg3OCw1NDg3OSw1NDg4MCw1NDg4MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDg4Miw1NDg4Myw1NDg4NCw1NDg4NSw1NDg4Niw1NDg4OCw1NDg5MCw1NDg5MSw1NDg5Miw1NDg5Myw1NDg5NCw1NDg5NSw1NDg5OCw1NDg5OSw1NDkwMSw1NDkwMiw1NDkwMyw1NDkwNCw1NDkwNSw1NDkwNiw1NDkwNyw1NDkwOCw1NDkwOSw1NDkxMCw1NDkxMSw1NDkxMixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDkxMyw1NDkxNCw1NDkxNiw1NDkxOCw1NDkxOSw1NDkyMCw1NDkyMSw1NDkyMiw1NDkyMyw1NDkyNiw1NDkyNyw1NDkyOSw1NDkzMCw1NDkzMSw1NDkzMyw1NDkzNCw1NDkzNSw1NDkzNiw1NDkzNyw1NDkzOCw1NDkzOSw1NDk0MCw1NDk0Miw1NDk0NCw1NDk0Niw1NDk0Nyw1NDk0OCw1NDk0OSw1NDk1MCw1NDk1MSw1NDk1Myw1NDk1NCw1MjI4NCw1MjI4NSw1MjI4Niw1MjI5Miw1MjI5Myw1MjI5Niw1MjMwMCw1MjMwOCw1MjMwOSw1MjMxMSw1MjMxMiw1MjMxMyw1MjMyMCw1MjMyNCw1MjMyNiw1MjMyOCw1MjMzNiw1MjM0MSw1MjM3Niw1MjM3Nyw1MjM4MCw1MjM4NCw1MjM5Miw1MjM5Myw1MjM5NSw1MjM5Niw1MjM5Nyw1MjQwNCw1MjQwNSw1MjQwOCw1MjQxMiw1MjQyMCw1MjQyMSw1MjQyMyw1MjQyNSw1MjQzMiw1MjQzNiw1MjQ1Miw1MjQ2MCw1MjQ2NCw1MjQ4MSw1MjQ4OCw1MjQ4OSw1MjQ5Miw1MjQ5Niw1MjUwNCw1MjUwNSw1MjUwNyw1MjUwOSw1MjUxNiw1MjUyMCw1MjUyNCw1MjUzNyw1MjU3Miw1MjU3Niw1MjU4MCw1MjU4OCw1MjU4OSw1MjU5MSw1MjU5Myw1MjYwMCw1MjYxNiw1MjYyOCw1MjYyOSw1MjYzMiw1MjYzNiw1MjY0NCw1MjY0NSw1MjY0Nyw1MjY0OSw1MjY1Niw1MjY3Niw1MjY4NCw1MjY4OCw1MjcxMiw1MjcxNiw1MjcyMCw1MjcyOCw1MjcyOSw1MjczMSw1MjczMyw1Mjc0MCw1Mjc0NCw1Mjc0OCw1Mjc1Niw1Mjc2MSw1Mjc2OCw1Mjc2OSw1Mjc3Miw1Mjc3Niw1Mjc4NCw1Mjc4NSw1Mjc4Nyw1Mjc4OSw1NDk1NSw1NDk1Nyw1NDk1OCw1NDk1OSw1NDk2MSw1NDk2Miw1NDk2Myw1NDk2NCw1NDk2NSw1NDk2Niw1NDk2Nyw1NDk2OCw1NDk3MCw1NDk3Miw1NDk3Myw1NDk3NCw1NDk3NSw1NDk3Niw1NDk3Nyw1NDk3OCw1NDk3OSw1NDk4Miw1NDk4Myw1NDk4NSw1NDk4Niw1NDk4NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDk4OSw1NDk5MCw1NDk5MSw1NDk5Miw1NDk5NCw1NDk5NSw1NDk5Nyw1NDk5OCw1NTAwMCw1NTAwMiw1NTAwMyw1NTAwNCw1NTAwNSw1NTAwNiw1NTAwNyw1NTAwOSw1NTAxMCw1NTAxMSw1NTAxMyw1NTAxNCw1NTAxNSw1NTAxNyw1NTAxOCw1NTAxOSw1NTAyMCw1NTAyMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NTAyMiw1NTAyMyw1NTAyNSw1NTAyNiw1NTAyNyw1NTAyOCw1NTAzMCw1NTAzMSw1NTAzMiw1NTAzMyw1NTAzNCw1NTAzNSw1NTAzOCw1NTAzOSw1NTA0MSw1NTA0Miw1NTA0Myw1NTA0NSw1NTA0Niw1NTA0Nyw1NTA0OCw1NTA0OSw1NTA1MCw1NTA1MSw1NTA1Miw1NTA1Myw1NTA1NCw1NTA1NSw1NTA1Niw1NTA1OCw1NTA1OSw1NTA2MCw1MjgyNCw1MjgyNSw1MjgyOCw1MjgzMSw1MjgzMiw1MjgzMyw1Mjg0MCw1Mjg0MSw1Mjg0Myw1Mjg0NSw1Mjg1Miw1Mjg1Myw1Mjg1Niw1Mjg2MCw1Mjg2OCw1Mjg2OSw1Mjg3MSw1Mjg3Myw1Mjg4MCw1Mjg4MSw1Mjg4NCw1Mjg4OCw1Mjg5Niw1Mjg5Nyw1Mjg5OSw1MjkwMCw1MjkwMSw1MjkwOCw1MjkwOSw1MjkyOSw1Mjk2NCw1Mjk2NSw1Mjk2OCw1Mjk3MSw1Mjk3Miw1Mjk4MCw1Mjk4MSw1Mjk4Myw1Mjk4NCw1Mjk4NSw1Mjk5Miw1Mjk5Myw1Mjk5Niw1MzAwMCw1MzAwOCw1MzAwOSw1MzAxMSw1MzAxMyw1MzAyMCw1MzAyNCw1MzAyOCw1MzAzNiw1MzAzNyw1MzAzOSw1MzA0MCw1MzA0MSw1MzA0OCw1MzA3Niw1MzA3Nyw1MzA4MCw1MzA4NCw1MzA5Miw1MzA5Myw1MzA5NSw1MzA5Nyw1MzEwNCw1MzEwNSw1MzEwOCw1MzExMiw1MzEyMCw1MzEyNSw1MzEzMiw1MzE1Myw1MzE2MCw1MzE2OCw1MzE4OCw1MzIxNiw1MzIxNyw1MzIyMCw1MzIyNCw1MzIzMiw1MzIzMyw1MzIzNSw1MzIzNyw1MzI0NCw1MzI0OCw1MzI1Miw1MzI2NSw1MzI3Miw1MzI5Myw1MzMwMCw1MzMwMSw1MzMwNCw1MzMwOCw1NTA2MSw1NTA2Miw1NTA2Myw1NTA2Niw1NTA2Nyw1NTA2OSw1NTA3MCw1NTA3MSw1NTA3Myw1NTA3NCw1NTA3NSw1NTA3Niw1NTA3Nyw1NTA3OCw1NTA3OSw1NTA4Miw1NTA4NCw1NTA4Niw1NTA4Nyw1NTA4OCw1NTA4OSw1NTA5MCw1NTA5MSw1NTA5NCw1NTA5NSw1NTA5NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NTA5OCw1NTA5OSw1NTEwMSw1NTEwMiw1NTEwMyw1NTEwNCw1NTEwNSw1NTEwNiw1NTEwNyw1NTEwOSw1NTExMCw1NTExMiw1NTExNCw1NTExNSw1NTExNiw1NTExNyw1NTExOCw1NTExOSw1NTEyMiw1NTEyMyw1NTEyNSw1NTEzMCw1NTEzMSw1NTEzMiw1NTEzMyw1NTEzNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NTEzNSw1NTEzOCw1NTE0MCw1NTE0Miw1NTE0Myw1NTE0NCw1NTE0Niw1NTE0Nyw1NTE0OSw1NTE1MCw1NTE1MSw1NTE1Myw1NTE1NCw1NTE1NSw1NTE1Nyw1NTE1OCw1NTE1OSw1NTE2MCw1NTE2MSw1NTE2Miw1NTE2Myw1NTE2Niw1NTE2Nyw1NTE2OCw1NTE3MCw1NTE3MSw1NTE3Miw1NTE3Myw1NTE3NCw1NTE3NSw1NTE3OCw1NTE3OSw1MzMxNiw1MzMxNyw1MzMxOSw1MzMyMSw1MzMyOCw1MzMzMiw1MzMzNiw1MzM0NCw1MzM1Niw1MzM1Nyw1MzM2MCw1MzM2NCw1MzM3Miw1MzM3Myw1MzM3Nyw1MzQxMiw1MzQxMyw1MzQxNiw1MzQyMCw1MzQyOCw1MzQyOSw1MzQzMSw1MzQzMyw1MzQ0MCw1MzQ0MSw1MzQ0NCw1MzQ0OCw1MzQ0OSw1MzQ1Niw1MzQ1Nyw1MzQ1OSw1MzQ2MCw1MzQ2MSw1MzQ2OCw1MzQ2OSw1MzQ3Miw1MzQ3Niw1MzQ4NCw1MzQ4NSw1MzQ4Nyw1MzQ4OCw1MzQ4OSw1MzQ5Niw1MzUxNyw1MzU1Miw1MzU1Myw1MzU1Niw1MzU2MCw1MzU2Miw1MzU2OCw1MzU2OSw1MzU3MSw1MzU3Miw1MzU3Myw1MzU4MCw1MzU4MSw1MzU4NCw1MzU4OCw1MzU5Niw1MzU5Nyw1MzU5OSw1MzYwMSw1MzYwOCw1MzYxMiw1MzYyOCw1MzYzNiw1MzY0MCw1MzY2NCw1MzY2NSw1MzY2OCw1MzY3Miw1MzY4MCw1MzY4MSw1MzY4Myw1MzY4NSw1MzY5MCw1MzY5Miw1MzY5Niw1MzcyMCw1Mzc0OCw1Mzc1Miw1Mzc2Nyw1Mzc2OSw1Mzc3Niw1MzgwNCw1MzgwNSw1MzgwOCw1MzgxMiw1MzgyMCw1MzgyMSw1MzgyMyw1MzgyNSw1MzgzMiw1Mzg1Miw1NTE4MSw1NTE4Miw1NTE4Myw1NTE4NSw1NTE4Niw1NTE4Nyw1NTE4OCw1NTE4OSw1NTE5MCw1NTE5MSw1NTE5NCw1NTE5Niw1NTE5OCw1NTE5OSw1NTIwMCw1NTIwMSw1NTIwMiw1NTIwMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1Mzg2MCw1Mzg4OCw1Mzg4OSw1Mzg5Miw1Mzg5Niw1MzkwNCw1MzkwNSw1MzkwOSw1MzkxNiw1MzkyMCw1MzkyNCw1MzkzMiw1MzkzNyw1Mzk0NCw1Mzk0NSw1Mzk0OCw1Mzk1MSw1Mzk1Miw1Mzk1NCw1Mzk2MCw1Mzk2MSw1Mzk2Myw1Mzk3Miw1Mzk3Niw1Mzk4MCw1Mzk4OCw1Mzk4OSw1NDAwMCw1NDAwMSw1NDAwNCw1NDAwOCw1NDAxNiw1NDAxNyw1NDAxOSw1NDAyMSw1NDAyOCw1NDAyOSw1NDAzMCw1NDAzMiw1NDAzNiw1NDAzOCw1NDA0NCw1NDA0NSw1NDA0Nyw1NDA0OCw1NDA0OSw1NDA1Myw1NDA1Niw1NDA1Nyw1NDA2MCw1NDA2NCw1NDA3Miw1NDA3Myw1NDA3NSw1NDA3Niw1NDA3Nyw1NDA4NCw1NDA4NSw1NDE0MCw1NDE0MSw1NDE0NCw1NDE0OCw1NDE1Niw1NDE1Nyw1NDE1OSw1NDE2MCw1NDE2MSw1NDE2OCw1NDE2OSw1NDE3Miw1NDE3Niw1NDE4NCw1NDE4NSw1NDE4Nyw1NDE4OSw1NDE5Niw1NDIwMCw1NDIwNCw1NDIxMiw1NDIxMyw1NDIxNiw1NDIxNyw1NDIyNCw1NDIzMiw1NDI0MSw1NDI0Myw1NDI1Miw1NDI1Myw1NDI1Niw1NDI2MCw1NDI2OCw1NDI2OSw1NDI3MSw1NDI3MyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDI4MCw1NDMwMSw1NDMzNiw1NDM0MCw1NDM2NCw1NDM2OCw1NDM3Miw1NDM4MSw1NDM4Myw1NDM5Miw1NDM5Myw1NDM5Niw1NDM5OSw1NDQwMCw1NDQwMiw1NDQwOCw1NDQwOSw1NDQxMSw1NDQxMyw1NDQyMCw1NDQ0MSw1NDQ3Niw1NDQ4MCw1NDQ4NCw1NDQ5Miw1NDQ5NSw1NDUwNCw1NDUwOCw1NDUxMiw1NDUyMCw1NDUyMyw1NDUyNSw1NDUzMiw1NDUzNiw1NDU0MCw1NDU0OCw1NDU0OSw1NDU1MSw1NDU4OCw1NDU4OSw1NDU5Miw1NDU5Niw1NDYwNCw1NDYwNSw1NDYwNyw1NDYwOSw1NDYxNiw1NDYxNyw1NDYyMCw1NDYyNCw1NDYyOSw1NDYzMiw1NDYzMyw1NDYzNSw1NDYzNyw1NDY0NCw1NDY0NSw1NDY0OCw1NDY1Miw1NDY2MCw1NDY2MSw1NDY2Myw1NDY2NCw1NDY2NSw1NDY3Miw1NDY5Myw1NDcyOCw1NDcyOSw1NDczMiw1NDczNiw1NDczOCw1NDc0NCw1NDc0NSw1NDc0Nyw1NDc0OSw1NDc1Niw1NDc1Nyw1NDc2MCw1NDc2NCw1NDc3Miw1NDc3Myw1NDc3NSw1NDc3Nyw1NDc4NCw1NDc4NSw1NDc4OCw1NDc5Miw1NDgwMCw1NDgwMSw1NDgwMyw1NDgwNCw1NDgwNSw1NDgxMiw1NDgxNixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw1NDgyMCw1NDgyOSw1NDg0MCw1NDg0MSw1NDg0NCw1NDg0OCw1NDg1Myw1NDg1Niw1NDg1Nyw1NDg1OSw1NDg2MSw1NDg2NSw1NDg2OCw1NDg2OSw1NDg3Miw1NDg3Niw1NDg4Nyw1NDg4OSw1NDg5Niw1NDg5Nyw1NDkwMCw1NDkxNSw1NDkxNyw1NDkyNCw1NDkyNSw1NDkyOCw1NDkzMiw1NDk0MSw1NDk0Myw1NDk0NSw1NDk1Miw1NDk1Niw1NDk2MCw1NDk2OSw1NDk3MSw1NDk4MCw1NDk4MSw1NDk4NCw1NDk4OCw1NDk5Myw1NDk5Niw1NDk5OSw1NTAwMSw1NTAwOCw1NTAxMiw1NTAxNiw1NTAyNCw1NTAyOSw1NTAzNiw1NTAzNyw1NTA0MCw1NTA0NCw1NTA1Nyw1NTA2NCw1NTA2NSw1NTA2OCw1NTA3Miw1NTA4MCw1NTA4MSw1NTA4Myw1NTA4NSw1NTA5Miw1NTA5Myw1NTA5Niw1NTEwMCw1NTEwOCw1NTExMSw1NTExMyw1NTEyMCw1NTEyMSw1NTEyNCw1NTEyNiw1NTEyNyw1NTEyOCw1NTEyOSw1NTEzNiw1NTEzNyw1NTEzOSw1NTE0MSw1NTE0NSw1NTE0OCw1NTE1Miw1NTE1Niw1NTE2NCw1NTE2NSw1NTE2OSw1NTE3Niw1NTE3Nyw1NTE4MCw1NTE4NCw1NTE5Miw1NTE5Myw1NTE5NSw1NTE5NyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwMjg1LDIwMzM5LDIwNTUxLDIwNzI5LDIxMTUyLDIxNDg3LDIxNjIxLDIxNzMzLDIyMDI1LDIzMjMzLDIzNDc4LDI2MjQ3LDI2NTUwLDI2NTUxLDI2NjA3LDI3NDY4LDI5NjM0LDMwMTQ2LDMxMjkyLDMzNDk5LDMzNTQwLDM0OTAzLDM0OTUyLDM1MzgyLDM2MDQwLDM2MzAzLDM2NjAzLDM2ODM4LDM5MzgxLDIxMDUxLDIxMzY0LDIxNTA4LDI0NjgyLDI0OTMyLDI3NTgwLDI5NjQ3LDMzMDUwLDM1MjU4LDM1MjgyLDM4MzA3LDIwMzU1LDIxMDAyLDIyNzE4LDIyOTA0LDIzMDE0LDI0MTc4LDI0MTg1LDI1MDMxLDI1NTM2LDI2NDM4LDI2NjA0LDI2NzUxLDI4NTY3LDMwMjg2LDMwNDc1LDMwOTY1LDMxMjQwLDMxNDg3LDMxNzc3LDMyOTI1LDMzMzkwLDMzMzkzLDM1NTYzLDM4MjkxLDIwMDc1LDIxOTE3LDI2MzU5LDI4MjEyLDMwODgzLDMxNDY5LDMzODgzLDM1MDg4LDM0NjM4LDM4ODI0LDIxMjA4LDIyMzUwLDIyNTcwLDIzODg0LDI0ODYzLDI1MDIyLDI1MTIxLDI1OTU0LDI2NTc3LDI3MjA0LDI4MTg3LDI5OTc2LDMwMTMxLDMwNDM1LDMwNjQwLDMyMDU4LDM3MDM5LDM3OTY5LDM3OTcwLDQwODUzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxMjgzLDIzNzI0LDMwMDAyLDMyOTg3LDM3NDQwLDM4Mjk2LDIxMDgzLDIyNTM2LDIzMDA0LDIzNzEzLDIzODMxLDI0MjQ3LDI0Mzc4LDI0Mzk0LDI0OTUxLDI3NzQzLDMwMDc0LDMwMDg2LDMxOTY4LDMyMTE1LDMyMTc3LDMyNjUyLDMzMTA4LDMzMzEzLDM0MTkzLDM1MTM3LDM1NjExLDM3NjI4LDM4NDc3LDQwMDA3LDIwMTcxLDIwMjE1LDIwNDkxLDIwOTc3LDIyNjA3LDI0ODg3LDI0ODk0LDI0OTM2LDI1OTEzLDI3MTE0LDI4NDMzLDMwMTE3LDMwMzQyLDMwNDIyLDMxNjIzLDMzNDQ1LDMzOTk1LDYzNzQ0LDM3Nzk5LDM4MjgzLDIxODg4LDIzNDU4LDIyMzUzLDYzNzQ1LDMxOTIzLDMyNjk3LDM3MzAxLDIwNTIwLDIxNDM1LDIzNjIxLDI0MDQwLDI1Mjk4LDI1NDU0LDI1ODE4LDI1ODMxLDI4MTkyLDI4ODQ0LDMxMDY3LDM2MzE3LDM2MzgyLDYzNzQ2LDM2OTg5LDM3NDQ1LDM3NjI0LDIwMDk0LDIwMjE0LDIwNTgxLDI0MDYyLDI0MzE0LDI0ODM4LDI2OTY3LDMzMTM3LDM0Mzg4LDM2NDIzLDM3NzQ5LDM5NDY3LDIwMDYyLDIwNjI1LDI2NDgwLDI2Njg4LDIwNzQ1LDIxMTMzLDIxMTM4LDI3Mjk4LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMwNjUyLDM3MzkyLDQwNjYwLDIxMTYzLDI0NjIzLDM2ODUwLDIwNTUyLDI1MDAxLDI1NTgxLDI1ODAyLDI2Njg0LDI3MjY4LDI4NjA4LDMzMTYwLDM1MjMzLDM4NTQ4LDIyNTMzLDI5MzA5LDI5MzU2LDI5OTU2LDMyMTIxLDMyMzY1LDMyOTM3LDM1MjExLDM1NzAwLDM2OTYzLDQwMjczLDI1MjI1LDI3NzcwLDI4NTAwLDMyMDgwLDMyNTcwLDM1MzYzLDIwODYwLDI0OTA2LDMxNjQ1LDM1NjA5LDM3NDYzLDM3NzcyLDIwMTQwLDIwNDM1LDIwNTEwLDIwNjcwLDIwNzQyLDIxMTg1LDIxMTk3LDIxMzc1LDIyMzg0LDIyNjU5LDI0MjE4LDI0NDY1LDI0OTUwLDI1MDA0LDI1ODA2LDI1OTY0LDI2MjIzLDI2Mjk5LDI2MzU2LDI2Nzc1LDI4MDM5LDI4ODA1LDI4OTEzLDI5ODU1LDI5ODYxLDI5ODk4LDMwMTY5LDMwODI4LDMwOTU2LDMxNDU1LDMxNDc4LDMyMDY5LDMyMTQ3LDMyNzg5LDMyODMxLDMzMDUxLDMzNjg2LDM1Njg2LDM2NjI5LDM2ODg1LDM3ODU3LDM4OTE1LDM4OTY4LDM5NTE0LDM5OTEyLDIwNDE4LDIxODQzLDIyNTg2LDIyODY1LDIzMzk1LDIzNjIyLDI0NzYwLDI1MTA2LDI2NjkwLDI2ODAwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2ODU2LDI4MzMwLDMwMDI4LDMwMzI4LDMwOTI2LDMxMjkzLDMxOTk1LDMyMzYzLDMyMzgwLDM1MzM2LDM1NDg5LDM1OTAzLDM4NTQyLDQwMzg4LDIxNDc2LDIxNDgxLDIxNTc4LDIxNjE3LDIyMjY2LDIyOTkzLDIzMzk2LDIzNjExLDI0MjM1LDI1MzM1LDI1OTExLDI1OTI1LDI1OTcwLDI2MjcyLDI2NTQzLDI3MDczLDI3ODM3LDMwMjA0LDMwMzUyLDMwNTkwLDMxMjk1LDMyNjYwLDMyNzcxLDMyOTI5LDMzMTY3LDMzNTEwLDMzNTMzLDMzNzc2LDM0MjQxLDM0ODY1LDM0OTk2LDM1NDkzLDYzNzQ3LDM2NzY0LDM3Njc4LDM4NTk5LDM5MDE1LDM5NjQwLDQwNzIzLDIxNzQxLDI2MDExLDI2MzU0LDI2NzY3LDMxMjk2LDM1ODk1LDQwMjg4LDIyMjU2LDIyMzcyLDIzODI1LDI2MTE4LDI2ODAxLDI2ODI5LDI4NDE0LDI5NzM2LDM0OTc0LDM5OTA4LDI3NzUyLDYzNzQ4LDM5NTkyLDIwMzc5LDIwODQ0LDIwODQ5LDIxMTUxLDIzMzgwLDI0MDM3LDI0NjU2LDI0Njg1LDI1MzI5LDI1NTExLDI1OTE1LDI5NjU3LDMxMzU0LDM0NDY3LDM2MDAyLDM4Nzk5LDIwMDE4LDIzNTIxLDI1MDk2LDI2NTI0LDI5OTE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxMTg1LDMzNzQ3LDM1NDYzLDM1NTA2LDM2MzI4LDM2OTQyLDM3NzA3LDM4OTgyLDI0Mjc1LDI3MTEyLDM0MzAzLDM3MTAxLDYzNzQ5LDIwODk2LDIzNDQ4LDIzNTMyLDI0OTMxLDI2ODc0LDI3NDU0LDI4NzQ4LDI5NzQzLDI5OTEyLDMxNjQ5LDMyNTkyLDMzNzMzLDM1MjY0LDM2MDExLDM4MzY0LDM5MjA4LDIxMDM4LDI0NjY5LDI1MzI0LDM2ODY2LDIwMzYyLDIwODA5LDIxMjgxLDIyNzQ1LDI0MjkxLDI2MzM2LDI3OTYwLDI4ODI2LDI5Mzc4LDI5NjU0LDMxNTY4LDMzMDA5LDM3OTc5LDIxMzUwLDI1NDk5LDMyNjE5LDIwMDU0LDIwNjA4LDIyNjAyLDIyNzUwLDI0NjE4LDI0ODcxLDI1Mjk2LDI3MDg4LDM5NzQ1LDIzNDM5LDMyMDI0LDMyOTQ1LDM2NzAzLDIwMTMyLDIwNjg5LDIxNjc2LDIxOTMyLDIzMzA4LDIzOTY4LDI0MDM5LDI1ODk4LDI1OTM0LDI2NjU3LDI3MjExLDI5NDA5LDMwMzUwLDMwNzAzLDMyMDk0LDMyNzYxLDMzMTg0LDM0MTI2LDM0NTI3LDM2NjExLDM2Njg2LDM3MDY2LDM5MTcxLDM5NTA5LDM5ODUxLDE5OTkyLDIwMDM3LDIwMDYxLDIwMTY3LDIwNDY1LDIwODU1LDIxMjQ2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxMzEyLDIxNDc1LDIxNDc3LDIxNjQ2LDIyMDM2LDIyMzg5LDIyNDM0LDIzNDk1LDIzOTQzLDI0MjcyLDI1MDg0LDI1MzA0LDI1OTM3LDI2NTUyLDI2NjAxLDI3MDgzLDI3NDcyLDI3NTkwLDI3NjI4LDI3NzE0LDI4MzE3LDI4NzkyLDI5Mzk5LDI5NTkwLDI5Njk5LDMwNjU1LDMwNjk3LDMxMzUwLDMyMTI3LDMyNzc3LDMzMjc2LDMzMjg1LDMzMjkwLDMzNTAzLDM0OTE0LDM1NjM1LDM2MDkyLDM2NTQ0LDM2ODgxLDM3MDQxLDM3NDc2LDM3NTU4LDM5Mzc4LDM5NDkzLDQwMTY5LDQwNDA3LDQwODYwLDIyMjgzLDIzNjE2LDMzNzM4LDM4ODE2LDM4ODI3LDQwNjI4LDIxNTMxLDMxMzg0LDMyNjc2LDM1MDMzLDM2NTU3LDM3MDg5LDIyNTI4LDIzNjI0LDI1NDk2LDMxMzkxLDIzNDcwLDI0MzM5LDMxMzUzLDMxNDA2LDMzNDIyLDM2NTI0LDIwNTE4LDIxMDQ4LDIxMjQwLDIxMzY3LDIyMjgwLDI1MzMxLDI1NDU4LDI3NDAyLDI4MDk5LDMwNTE5LDIxNDEzLDI5NTI3LDM0MTUyLDM2NDcwLDM4MzU3LDI2NDI2LDI3MzMxLDI4NTI4LDM1NDM3LDM2NTU2LDM5MjQzLDYzNzUwLDI2MjMxLDI3NTEyLDM2MDIwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM5NzQwLDYzNzUxLDIxNDgzLDIyMzE3LDIyODYyLDI1NTQyLDI3MTMxLDI5Njc0LDMwNzg5LDMxNDE4LDMxNDI5LDMxOTk4LDMzOTA5LDM1MjE1LDM2MjExLDM2OTE3LDM4MzEyLDIxMjQzLDIyMzQzLDMwMDIzLDMxNTg0LDMzNzQwLDM3NDA2LDYzNzUyLDI3MjI0LDIwODExLDIxMDY3LDIxMTI3LDI1MTE5LDI2ODQwLDI2OTk3LDM4NTUzLDIwNjc3LDIxMTU2LDIxMjIwLDI1MDI3LDI2MDIwLDI2NjgxLDI3MTM1LDI5ODIyLDMxNTYzLDMzNDY1LDMzNzcxLDM1MjUwLDM1NjQxLDM2ODE3LDM5MjQxLDYzNzUzLDIwMTcwLDIyOTM1LDI1ODEwLDI2MTI5LDI3Mjc4LDI5NzQ4LDMxMTA1LDMxMTY1LDMzNDQ5LDM0OTQyLDM0OTQzLDM1MTY3LDYzNzU0LDM3NjcwLDIwMjM1LDIxNDUwLDI0NjEzLDI1MjAxLDI3NzYyLDMyMDI2LDMyMTAyLDIwMTIwLDIwODM0LDMwNjg0LDMyOTQzLDIwMjI1LDIwMjM4LDIwODU0LDIwODY0LDIxOTgwLDIyMTIwLDIyMzMxLDIyNTIyLDIyNTI0LDIyODA0LDIyODU1LDIyOTMxLDIzNDkyLDIzNjk2LDIzODIyLDI0MDQ5LDI0MTkwLDI0NTI0LDI1MjE2LDI2MDcxLDI2MDgzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2Mzk4LDI2Mzk5LDI2NDYyLDI2ODI3LDI2ODIwLDI3MjMxLDI3NDUwLDI3NjgzLDI3NzczLDI3Nzc4LDI4MTAzLDI5NTkyLDI5NzM0LDI5NzM4LDI5ODI2LDI5ODU5LDMwMDcyLDMwMDc5LDMwODQ5LDMwOTU5LDMxMDQxLDMxMDQ3LDMxMDQ4LDMxMDk4LDMxNjM3LDMyMDAwLDMyMTg2LDMyNjQ4LDMyNzc0LDMyODEzLDMyOTA4LDM1MzUyLDM1NjYzLDM1OTEyLDM2MjE1LDM3NjY1LDM3NjY4LDM5MTM4LDM5MjQ5LDM5NDM4LDM5NDM5LDM5NTI1LDQwNTk0LDMyMjAyLDIwMzQyLDIxNTEzLDI1MzI2LDI2NzA4LDM3MzI5LDIxOTMxLDIwNzk0LDYzNzU1LDYzNzU2LDIzMDY4LDI1MDYyLDYzNzU3LDI1Mjk1LDI1MzQzLDYzNzU4LDYzNzU5LDYzNzYwLDYzNzYxLDYzNzYyLDYzNzYzLDM3MDI3LDYzNzY0LDYzNzY1LDYzNzY2LDYzNzY3LDYzNzY4LDM1NTgyLDYzNzY5LDYzNzcwLDYzNzcxLDYzNzcyLDI2MjYyLDYzNzczLDI5MDE0LDYzNzc0LDYzNzc1LDM4NjI3LDYzNzc2LDI1NDIzLDI1NDY2LDIxMzM1LDYzNzc3LDI2NTExLDI2OTc2LDI4Mjc1LDYzNzc4LDMwMDA3LDYzNzc5LDYzNzgwLDYzNzgxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyMDEzLDYzNzgyLDYzNzgzLDM0OTMwLDIyMjE4LDIzMDY0LDYzNzg0LDYzNzg1LDYzNzg2LDYzNzg3LDYzNzg4LDIwMDM1LDYzNzg5LDIwODM5LDIyODU2LDI2NjA4LDMyNzg0LDYzNzkwLDIyODk5LDI0MTgwLDI1NzU0LDMxMTc4LDI0NTY1LDI0Njg0LDI1Mjg4LDI1NDY3LDIzNTI3LDIzNTExLDIxMTYyLDYzNzkxLDIyOTAwLDI0MzYxLDI0NTk0LDYzNzkyLDYzNzkzLDYzNzk0LDI5Nzg1LDYzNzk1LDYzNzk2LDYzNzk3LDYzNzk4LDYzNzk5LDYzODAwLDM5Mzc3LDYzODAxLDYzODAyLDYzODAzLDYzODA0LDYzODA1LDYzODA2LDYzODA3LDYzODA4LDYzODA5LDYzODEwLDYzODExLDI4NjExLDYzODEyLDYzODEzLDMzMjE1LDM2Nzg2LDI0ODE3LDYzODE0LDYzODE1LDMzMTI2LDYzODE2LDYzODE3LDIzNjE1LDYzODE4LDYzODE5LDYzODIwLDYzODIxLDYzODIyLDYzODIzLDYzODI0LDYzODI1LDIzMjczLDM1MzY1LDI2NDkxLDMyMDE2LDYzODI2LDYzODI3LDYzODI4LDYzODI5LDYzODMwLDYzODMxLDMzMDIxLDYzODMyLDYzODMzLDIzNjEyLDI3ODc3LDIxMzExLDI4MzQ2LDIyODEwLDMzNTkwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwMDI1LDIwMTUwLDIwMjk0LDIxOTM0LDIyMjk2LDIyNzI3LDI0NDA2LDI2MDM5LDI2MDg2LDI3MjY0LDI3NTczLDI4MjM3LDMwNzAxLDMxNDcxLDMxNzc0LDMyMjIyLDM0NTA3LDM0OTYyLDM3MTcwLDM3NzIzLDI1Nzg3LDI4NjA2LDI5NTYyLDMwMTM2LDM2OTQ4LDIxODQ2LDIyMzQ5LDI1MDE4LDI1ODEyLDI2MzExLDI4MTI5LDI4MjUxLDI4NTI1LDI4NjAxLDMwMTkyLDMyODM1LDMzMjEzLDM0MTEzLDM1MjAzLDM1NTI3LDM1Njc0LDM3NjYzLDI3Nzk1LDMwMDM1LDMxNTcyLDM2MzY3LDM2OTU3LDIxNzc2LDIyNTMwLDIyNjE2LDI0MTYyLDI1MDk1LDI1NzU4LDI2ODQ4LDMwMDcwLDMxOTU4LDM0NzM5LDQwNjgwLDIwMTk1LDIyNDA4LDIyMzgyLDIyODIzLDIzNTY1LDIzNzI5LDI0MTE4LDI0NDUzLDI1MTQwLDI1ODI1LDI5NjE5LDMzMjc0LDM0OTU1LDM2MDI0LDM4NTM4LDQwNjY3LDIzNDI5LDI0NTAzLDI0NzU1LDIwNDk4LDIwOTkyLDIxMDQwLDIyMjk0LDIyNTgxLDIyNjE1LDIzNTY2LDIzNjQ4LDIzNzk4LDIzOTQ3LDI0MjMwLDI0NDY2LDI0NzY0LDI1MzYxLDI1NDgxLDI1NjIzLDI2NjkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2ODczLDI3MzMwLDI4MTIwLDI4MTkzLDI4MzcyLDI4NjQ0LDI5MTgyLDMwNDI4LDMwNTg1LDMxMTUzLDMxMjkxLDMzNzk2LDM1MjQxLDM2MDc3LDM2MzM5LDM2NDI0LDM2ODY3LDM2ODg0LDM2OTQ3LDM3MTE3LDM3NzA5LDM4NTE4LDM4ODc2LDI3NjAyLDI4Njc4LDI5MjcyLDI5MzQ2LDI5NTQ0LDMwNTYzLDMxMTY3LDMxNzE2LDMyNDExLDM1NzEyLDIyNjk3LDI0Nzc1LDI1OTU4LDI2MTA5LDI2MzAyLDI3Nzg4LDI4OTU4LDI5MTI5LDM1OTMwLDM4OTMxLDIwMDc3LDMxMzYxLDIwMTg5LDIwOTA4LDIwOTQxLDIxMjA1LDIxNTE2LDI0OTk5LDI2NDgxLDI2NzA0LDI2ODQ3LDI3OTM0LDI4NTQwLDMwMTQwLDMwNjQzLDMxNDYxLDMzMDEyLDMzODkxLDM3NTA5LDIwODI4LDI2MDA3LDI2NDYwLDI2NTE1LDMwMTY4LDMxNDMxLDMzNjUxLDYzODM0LDM1OTEwLDM2ODg3LDM4OTU3LDIzNjYzLDMzMjE2LDMzNDM0LDM2OTI5LDM2OTc1LDM3Mzg5LDI0NDcxLDIzOTY1LDI3MjI1LDI5MTI4LDMwMzMxLDMxNTYxLDM0Mjc2LDM1NTg4LDM3MTU5LDM5NDcyLDIxODk1LDI1MDc4LDYzODM1LDMwMzEzLDMyNjQ1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM0MzY3LDM0NzQ2LDM1MDY0LDM3MDA3LDYzODM2LDI3OTMxLDI4ODg5LDI5NjYyLDMyMDk3LDMzODUzLDYzODM3LDM3MjI2LDM5NDA5LDYzODM4LDIwMDk4LDIxMzY1LDI3Mzk2LDI3NDEwLDI4NzM0LDI5MjExLDM0MzQ5LDQwNDc4LDIxMDY4LDM2NzcxLDIzODg4LDI1ODI5LDI1OTAwLDI3NDE0LDI4NjUxLDMxODExLDMyNDEyLDM0MjUzLDM1MTcyLDM1MjYxLDI1Mjg5LDMzMjQwLDM0ODQ3LDI0MjY2LDI2MzkxLDI4MDEwLDI5NDM2LDI5NzAxLDI5ODA3LDM0NjkwLDM3MDg2LDIwMzU4LDIzODIxLDI0NDgwLDMzODAyLDIwOTE5LDI1NTA0LDMwMDUzLDIwMTQyLDIwNDg2LDIwODQxLDIwOTM3LDI2NzUzLDI3MTUzLDMxOTE4LDMxOTIxLDMxOTc1LDMzMzkxLDM1NTM4LDM2NjM1LDM3MzI3LDIwNDA2LDIwNzkxLDIxMjM3LDIxNTcwLDI0MzAwLDI0OTQyLDI1MTUwLDI2MDUzLDI3MzU0LDI4NjcwLDMxMDE4LDM0MjY4LDM0ODUxLDM4MzE3LDM5NTIyLDM5NTMwLDQwNTk5LDQwNjU0LDIxMTQ3LDI2MzEwLDI3NTExLDI4NzAxLDMxMDE5LDM2NzA2LDM4NzIyLDI0OTc2LDI1MDg4LDI1ODkxLDI4NDUxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI5MDAxLDI5ODMzLDMyMjQ0LDMyODc5LDM0MDMwLDM2NjQ2LDM2ODk5LDM3NzA2LDIwOTI1LDIxMDE1LDIxMTU1LDI3OTE2LDI4ODcyLDM1MDEwLDI0MjY1LDI1OTg2LDI3NTY2LDI4NjEwLDMxODA2LDI5NTU3LDIwMTk2LDIwMjc4LDIyMjY1LDYzODM5LDIzNzM4LDIzOTk0LDI0NjA0LDI5NjE4LDMxNTMzLDMyNjY2LDMyNzE4LDMyODM4LDM2ODk0LDM3NDI4LDM4NjQ2LDM4NzI4LDM4OTM2LDQwODAxLDIwMzYzLDI4NTgzLDMxMTUwLDM3MzAwLDM4NTgzLDIxMjE0LDYzODQwLDI1NzM2LDI1Nzk2LDI3MzQ3LDI4NTEwLDI4Njk2LDI5MjAwLDMwNDM5LDMyNzY5LDM0MzEwLDM0Mzk2LDM2MzM1LDM2NjEzLDM4NzA2LDM5NzkxLDQwNDQyLDQwNTY1LDMwODYwLDMxMTAzLDMyMTYwLDMzNzM3LDM3NjM2LDQwNTc1LDQwNTk1LDM1NTQyLDIyNzUxLDI0MzI0LDI2NDA3LDI4NzExLDI5OTAzLDMxODQwLDMyODk0LDIwNzY5LDI4NzEyLDI5MjgyLDMwOTIyLDM2MDM0LDM2MDU4LDM2MDg0LDM4NjQ3LDIwMTAyLDIwNjk4LDIzNTM0LDI0Mjc4LDI2MDA5LDI5MTM0LDMwMjc0LDMwNjM3LDMyODQyLDM0MDQ0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2OTg4LDM5NzE5LDQwODQ1LDIyNzQ0LDIzMTA1LDIzNjUwLDI3MTU1LDI4MTIyLDI4NDMxLDMwMjY3LDMyMDQ3LDMyMzExLDM0MDc4LDM1MTI4LDM3ODYwLDM4NDc1LDIxMTI5LDI2MDY2LDI2NjExLDI3MDYwLDI3OTY5LDI4MzE2LDI4Njg3LDI5NzA1LDI5NzkyLDMwMDQxLDMwMjQ0LDMwODI3LDM1NjI4LDM5MDA2LDIwODQ1LDI1MTM0LDM4NTIwLDIwMzc0LDIwNTIzLDIzODMzLDI4MTM4LDMyMTg0LDM2NjUwLDI0NDU5LDI0OTAwLDI2NjQ3LDYzODQxLDM4NTM0LDIxMjAyLDMyOTA3LDIwOTU2LDIwOTQwLDI2OTc0LDMxMjYwLDMyMTkwLDMzNzc3LDM4NTE3LDIwNDQyLDIxMDMzLDIxNDAwLDIxNTE5LDIxNzc0LDIzNjUzLDI0NzQzLDI2NDQ2LDI2NzkyLDI4MDEyLDI5MzEzLDI5NDMyLDI5NzAyLDI5ODI3LDYzODQyLDMwMTc4LDMxODUyLDMyNjMzLDMyNjk2LDMzNjczLDM1MDIzLDM1MDQxLDM3MzI0LDM3MzI4LDM4NjI2LDM5ODgxLDIxNTMzLDI4NTQyLDI5MTM2LDI5ODQ4LDM0Mjk4LDM2NTIyLDM4NTYzLDQwMDIzLDQwNjA3LDI2NTE5LDI4MTA3LDI5NzQ3LDMzMjU2LDM4Njc4LDMwNzY0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxNDM1LDMxNTIwLDMxODkwLDI1NzA1LDI5ODAyLDMwMTk0LDMwOTA4LDMwOTUyLDM5MzQwLDM5NzY0LDQwNjM1LDIzNTE4LDI0MTQ5LDI4NDQ4LDMzMTgwLDMzNzA3LDM3MDAwLDE5OTc1LDIxMzI1LDIzMDgxLDI0MDE4LDI0Mzk4LDI0OTMwLDI1NDA1LDI2MjE3LDI2MzY0LDI4NDE1LDI4NDU5LDI4NzcxLDMwNjIyLDMzODM2LDM0MDY3LDM0ODc1LDM2NjI3LDM5MjM3LDM5OTk1LDIxNzg4LDI1MjczLDI2NDExLDI3ODE5LDMzNTQ1LDM1MTc4LDM4Nzc4LDIwMTI5LDIyOTE2LDI0NTM2LDI0NTM3LDI2Mzk1LDMyMTc4LDMyNTk2LDMzNDI2LDMzNTc5LDMzNzI1LDM2NjM4LDM3MDE3LDIyNDc1LDIyOTY5LDIzMTg2LDIzNTA0LDI2MTUxLDI2NTIyLDI2NzU3LDI3NTk5LDI5MDI4LDMyNjI5LDM2MDIzLDM2MDY3LDM2OTkzLDM5NzQ5LDMzMDMyLDM1OTc4LDM4NDc2LDM5NDg4LDQwNjEzLDIzMzkxLDI3NjY3LDI5NDY3LDMwNDUwLDMwNDMxLDMzODA0LDIwOTA2LDM1MjE5LDIwODEzLDIwODg1LDIxMTkzLDI2ODI1LDI3Nzk2LDMwNDY4LDMwNDk2LDMyMTkxLDMyMjM2LDM4NzU0LDQwNjI5LDI4MzU3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM0MDY1LDIwOTAxLDIxNTE3LDIxNjI5LDI2MTI2LDI2MjY5LDI2OTE5LDI4MzE5LDMwMzk5LDMwNjA5LDMzNTU5LDMzOTg2LDM0NzE5LDM3MjI1LDM3NTI4LDQwMTgwLDM0OTQ2LDIwMzk4LDIwODgyLDIxMjE1LDIyOTgyLDI0MTI1LDI0OTE3LDI1NzIwLDI1NzIxLDI2Mjg2LDI2NTc2LDI3MTY5LDI3NTk3LDI3NjExLDI5Mjc5LDI5MjgxLDI5NzYxLDMwNTIwLDMwNjgzLDMyNzkxLDMzNDY4LDMzNTQxLDM1NTg0LDM1NjI0LDM1OTgwLDI2NDA4LDI3NzkyLDI5Mjg3LDMwNDQ2LDMwNTY2LDMxMzAyLDQwMzYxLDI3NTE5LDI3Nzk0LDIyODE4LDI2NDA2LDMzOTQ1LDIxMzU5LDIyNjc1LDIyOTM3LDI0Mjg3LDI1NTUxLDI2MTY0LDI2NDgzLDI4MjE4LDI5NDgzLDMxNDQ3LDMzNDk1LDM3NjcyLDIxMjA5LDI0MDQzLDI1MDA2LDI1MDM1LDI1MDk4LDI1Mjg3LDI1NzcxLDI2MDgwLDI2OTY5LDI3NDk0LDI3NTk1LDI4OTYxLDI5Njg3LDMwMDQ1LDMyMzI2LDMzMzEwLDMzNTM4LDM0MTU0LDM1NDkxLDM2MDMxLDM4Njk1LDQwMjg5LDIyNjk2LDQwNjY0LDIwNDk3LDIxMDA2LDIxNTYzLDIxODM5LDI1OTkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI3NzY2LDMyMDEwLDMyMDExLDMyODYyLDM0NDQyLDM4MjcyLDM4NjM5LDIxMjQ3LDI3Nzk3LDI5Mjg5LDIxNjE5LDIzMTk0LDIzNjE0LDIzODgzLDI0Mzk2LDI0NDk0LDI2NDEwLDI2ODA2LDI2OTc5LDI4MjIwLDI4MjI4LDMwNDczLDMxODU5LDMyNjU0LDM0MTgzLDM1NTk4LDM2ODU1LDM4NzUzLDQwNjkyLDIzNzM1LDI0NzU4LDI0ODQ1LDI1MDAzLDI1OTM1LDI2MTA3LDI2MTA4LDI3NjY1LDI3ODg3LDI5NTk5LDI5NjQxLDMyMjI1LDM4MjkyLDIzNDk0LDM0NTg4LDM1NjAwLDIxMDg1LDIxMzM4LDI1MjkzLDI1NjE1LDI1Nzc4LDI2NDIwLDI3MTkyLDI3ODUwLDI5NjMyLDI5ODU0LDMxNjM2LDMxODkzLDMyMjgzLDMzMTYyLDMzMzM0LDM0MTgwLDM2ODQzLDM4NjQ5LDM5MzYxLDIwMjc2LDIxMzIyLDIxNDUzLDIxNDY3LDI1MjkyLDI1NjQ0LDI1ODU2LDI2MDAxLDI3MDc1LDI3ODg2LDI4NTA0LDI5Njc3LDMwMDM2LDMwMjQyLDMwNDM2LDMwNDYwLDMwOTI4LDMwOTcxLDMxMDIwLDMyMDcwLDMzMzI0LDM0Nzg0LDM2ODIwLDM4OTMwLDM5MTUxLDIxMTg3LDI1MzAwLDI1NzY1LDI4MTk2LDI4NDk3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMwMzMyLDM2Mjk5LDM3Mjk3LDM3NDc0LDM5NjYyLDM5NzQ3LDIwNTE1LDIwNjIxLDIyMzQ2LDIyOTUyLDIzNTkyLDI0MTM1LDI0NDM5LDI1MTUxLDI1OTE4LDI2MDQxLDI2MDQ5LDI2MTIxLDI2NTA3LDI3MDM2LDI4MzU0LDMwOTE3LDMyMDMzLDMyOTM4LDMzMTUyLDMzMzIzLDMzNDU5LDMzOTUzLDM0NDQ0LDM1MzcwLDM1NjA3LDM3MDMwLDM4NDUwLDQwODQ4LDIwNDkzLDIwNDY3LDYzODQzLDIyNTIxLDI0NDcyLDI1MzA4LDI1NDkwLDI2NDc5LDI4MjI3LDI4OTUzLDMwNDAzLDMyOTcyLDMyOTg2LDM1MDYwLDM1MDYxLDM1MDk3LDM2MDY0LDM2NjQ5LDM3MTk3LDM4NTA2LDIwMjcxLDIwMzM2LDI0MDkxLDI2NTc1LDI2NjU4LDMwMzMzLDMwMzM0LDM5NzQ4LDI0MTYxLDI3MTQ2LDI5MDMzLDI5MTQwLDMwMDU4LDYzODQ0LDMyMzIxLDM0MTE1LDM0MjgxLDM5MTMyLDIwMjQwLDMxNTY3LDMyNjI0LDM4MzA5LDIwOTYxLDI0MDcwLDI2ODA1LDI3NzEwLDI3NzI2LDI3ODY3LDI5MzU5LDMxNjg0LDMzNTM5LDI3ODYxLDI5NzU0LDIwNzMxLDIxMTI4LDIyNzIxLDI1ODE2LDI3Mjg3LDI5ODYzLDMwMjk0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMwODg3LDM0MzI3LDM4MzcwLDM4NzEzLDYzODQ1LDIxMzQyLDI0MzIxLDM1NzIyLDM2Nzc2LDM2NzgzLDM3MDAyLDIxMDI5LDMwNjI5LDQwMDA5LDQwNzEyLDE5OTkzLDIwNDgyLDIwODUzLDIzNjQzLDI0MTgzLDI2MTQyLDI2MTcwLDI2NTY0LDI2ODIxLDI4ODUxLDI5OTUzLDMwMTQ5LDMxMTc3LDMxNDUzLDM2NjQ3LDM5MjAwLDM5NDMyLDIwNDQ1LDIyNTYxLDIyNTc3LDIzNTQyLDI2MjIyLDI3NDkzLDI3OTIxLDI4MjgyLDI4NTQxLDI5NjY4LDI5OTk1LDMzNzY5LDM1MDM2LDM1MDkxLDM1Njc2LDM2NjI4LDIwMjM5LDIwNjkzLDIxMjY0LDIxMzQwLDIzNDQzLDI0NDg5LDI2MzgxLDMxMTE5LDMzMTQ1LDMzNTgzLDM0MDY4LDM1MDc5LDM1MjA2LDM2NjY1LDM2NjY3LDM5MzMzLDM5OTU0LDI2NDEyLDIwMDg2LDIwNDcyLDIyODU3LDIzNTUzLDIzNzkxLDIzNzkyLDI1NDQ3LDI2ODM0LDI4OTI1LDI5MDkwLDI5NzM5LDMyMjk5LDM0MDI4LDM0NTYyLDM2ODk4LDM3NTg2LDQwMTc5LDE5OTgxLDIwMTg0LDIwNDYzLDIwNjEzLDIxMDc4LDIxMTAzLDIxNTQyLDIxNjQ4LDIyNDk2LDIyODI3LDIzMTQyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIzMzg2LDIzNDEzLDIzNTAwLDI0MjIwLDYzODQ2LDI1MjA2LDI1OTc1LDI2MDIzLDI4MDE0LDI4MzI1LDI5MjM4LDMxNTI2LDMxODA3LDMyNTY2LDMzMTA0LDMzMTA1LDMzMTc4LDMzMzQ0LDMzNDMzLDMzNzA1LDM1MzMxLDM2MDAwLDM2MDcwLDM2MDkxLDM2MjEyLDM2MjgyLDM3MDk2LDM3MzQwLDM4NDI4LDM4NDY4LDM5Mzg1LDQwMTY3LDIxMjcxLDIwOTk4LDIxNTQ1LDIyMTMyLDIyNzA3LDIyODY4LDIyODk0LDI0NTc1LDI0OTk2LDI1MTk4LDI2MTI4LDI3Nzc0LDI4OTU0LDMwNDA2LDMxODgxLDMxOTY2LDMyMDI3LDMzNDUyLDM2MDMzLDM4NjQwLDYzODQ3LDIwMzE1LDI0MzQzLDI0NDQ3LDI1MjgyLDIzODQ5LDI2Mzc5LDI2ODQyLDMwODQ0LDMyMzIzLDQwMzAwLDE5OTg5LDIwNjMzLDIxMjY5LDIxMjkwLDIxMzI5LDIyOTE1LDIzMTM4LDI0MTk5LDI0NzU0LDI0OTcwLDI1MTYxLDI1MjA5LDI2MDAwLDI2NTAzLDI3MDQ3LDI3NjA0LDI3NjA2LDI3NjA3LDI3NjA4LDI3ODMyLDYzODQ4LDI5NzQ5LDMwMjAyLDMwNzM4LDMwODY1LDMxMTg5LDMxMTkyLDMxODc1LDMyMjAzLDMyNzM3LDMyOTMzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMzMDg2LDMzMjE4LDMzNzc4LDM0NTg2LDM1MDQ4LDM1NTEzLDM1NjkyLDM2MDI3LDM3MTQ1LDM4NzUwLDM5MTMxLDQwNzYzLDIyMTg4LDIzMzM4LDI0NDI4LDI1OTk2LDI3MzE1LDI3NTY3LDI3OTk2LDI4NjU3LDI4NjkzLDI5Mjc3LDI5NjEzLDM2MDA3LDM2MDUxLDM4OTcxLDI0OTc3LDI3NzAzLDMyODU2LDM5NDI1LDIwMDQ1LDIwMTA3LDIwMTIzLDIwMTgxLDIwMjgyLDIwMjg0LDIwMzUxLDIwNDQ3LDIwNzM1LDIxNDkwLDIxNDk2LDIxNzY2LDIxOTg3LDIyMjM1LDIyNzYzLDIyODgyLDIzMDU3LDIzNTMxLDIzNTQ2LDIzNTU2LDI0MDUxLDI0MTA3LDI0NDczLDI0NjA1LDI1NDQ4LDI2MDEyLDI2MDMxLDI2NjE0LDI2NjE5LDI2Nzk3LDI3NTE1LDI3ODAxLDI3ODYzLDI4MTk1LDI4NjgxLDI5NTA5LDMwNzIyLDMxMDM4LDMxMDQwLDMxMDcyLDMxMTY5LDMxNzIxLDMyMDIzLDMyMTE0LDMyOTAyLDMzMjkzLDMzNjc4LDM0MDAxLDM0NTAzLDM1MDM5LDM1NDA4LDM1NDIyLDM1NjEzLDM2MDYwLDM2MTk4LDM2NzgxLDM3MDM0LDM5MTY0LDM5MzkxLDQwNjA1LDIxMDY2LDYzODQ5LDI2Mzg4LDYzODUwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwNjMyLDIxMDM0LDIzNjY1LDI1OTU1LDI3NzMzLDI5NjQyLDI5OTg3LDMwMTA5LDMxNjM5LDMzOTQ4LDM3MjQwLDM4NzA0LDIwMDg3LDI1NzQ2LDI3NTc4LDI5MDIyLDM0MjE3LDE5OTc3LDYzODUxLDI2NDQxLDI2ODYyLDI4MTgzLDMzNDM5LDM0MDcyLDM0OTIzLDI1NTkxLDI4NTQ1LDM3Mzk0LDM5MDg3LDE5OTc4LDIwNjYzLDIwNjg3LDIwNzY3LDIxODMwLDIxOTMwLDIyMDM5LDIzMzYwLDIzNTc3LDIzNzc2LDI0MTIwLDI0MjAyLDI0MjI0LDI0MjU4LDI0ODE5LDI2NzA1LDI3MjMzLDI4MjQ4LDI5MjQ1LDI5MjQ4LDI5Mzc2LDMwNDU2LDMxMDc3LDMxNjY1LDMyNzI0LDM1MDU5LDM1MzE2LDM1NDQzLDM1OTM3LDM2MDYyLDM4Njg0LDIyNjIyLDI5ODg1LDM2MDkzLDIxOTU5LDYzODUyLDMxMzI5LDMyMDM0LDMzMzk0LDI5Mjk4LDI5OTgzLDI5OTg5LDYzODUzLDMxNTEzLDIyNjYxLDIyNzc5LDIzOTk2LDI0MjA3LDI0MjQ2LDI0NDY0LDI0NjYxLDI1MjM0LDI1NDcxLDI1OTMzLDI2MjU3LDI2MzI5LDI2MzYwLDI2NjQ2LDI2ODY2LDI5MzEyLDI5NzkwLDMxNTk4LDMyMTEwLDMyMjE0LDMyNjI2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyOTk3LDMzMjk4LDM0MjIzLDM1MTk5LDM1NDc1LDM2ODkzLDM3NjA0LDQwNjUzLDQwNzM2LDIyODA1LDIyODkzLDI0MTA5LDI0Nzk2LDI2MTMyLDI2MjI3LDI2NTEyLDI3NzI4LDI4MTAxLDI4NTExLDMwNzA3LDMwODg5LDMzOTkwLDM3MzIzLDM3Njc1LDIwMTg1LDIwNjgyLDIwODA4LDIxODkyLDIzMzA3LDIzNDU5LDI1MTU5LDI1OTgyLDI2MDU5LDI4MjEwLDI5MDUzLDI5Njk3LDI5NzY0LDI5ODMxLDI5ODg3LDMwMzE2LDMxMTQ2LDMyMjE4LDMyMzQxLDMyNjgwLDMzMTQ2LDMzMjAzLDMzMzM3LDM0MzMwLDM0Nzk2LDM1NDQ1LDM2MzIzLDM2OTg0LDM3NTIxLDM3OTI1LDM5MjQ1LDM5ODU0LDIxMzUyLDIzNjMzLDI2OTY0LDI3ODQ0LDI3OTQ1LDI4MjAzLDMzMjkyLDM0MjAzLDM1MTMxLDM1MzczLDM1NDk4LDM4NjM0LDQwODA3LDIxMDg5LDI2Mjk3LDI3NTcwLDMyNDA2LDM0ODE0LDM2MTA5LDM4Mjc1LDM4NDkzLDI1ODg1LDI4MDQxLDI5MTY2LDYzODU0LDIyNDc4LDIyOTk1LDIzNDY4LDI0NjE1LDI0ODI2LDI1MTA0LDI2MTQzLDI2MjA3LDI5NDgxLDI5Njg5LDMwNDI3LDMwNDY1LDMxNTk2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyODU0LDMyODgyLDMzMTI1LDM1NDg4LDM3MjY2LDE5OTkwLDIxMjE4LDI3NTA2LDI3OTI3LDMxMjM3LDMxNTQ1LDMyMDQ4LDYzODU1LDM2MDE2LDIxNDg0LDIyMDYzLDIyNjA5LDIzNDc3LDIzNTY3LDIzNTY5LDI0MDM0LDI1MTUyLDI1NDc1LDI1NjIwLDI2MTU3LDI2ODAzLDI3ODM2LDI4MDQwLDI4MzM1LDI4NzAzLDI4ODM2LDI5MTM4LDI5OTkwLDMwMDk1LDMwMDk0LDMwMjMzLDMxNTA1LDMxNzEyLDMxNzg3LDMyMDMyLDMyMDU3LDM0MDkyLDM0MTU3LDM0MzExLDM1MzgwLDM2ODc3LDM2OTYxLDM3MDQ1LDM3NTU5LDM4OTAyLDM5NDc5LDIwNDM5LDIzNjYwLDI2NDYzLDI4MDQ5LDMxOTAzLDMyMzk2LDM1NjA2LDM2MTE4LDM2ODk1LDIzNDAzLDI0MDYxLDI1NjEzLDMzOTg0LDM2OTU2LDM5MTM3LDI5NTc1LDIzNDM1LDI0NzMwLDI2NDk0LDI4MTI2LDM1MzU5LDM1NDk0LDM2ODY1LDM4OTI0LDIxMDQ3LDYzODU2LDI4NzUzLDMwODYyLDM3NzgyLDM0OTI4LDM3MzM1LDIwNDYyLDIxNDYzLDIyMDEzLDIyMjM0LDIyNDAyLDIyNzgxLDIzMjM0LDIzNDMyLDIzNzIzLDIzNzQ0LDI0MTAxLDI0ODMzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI1MTAxLDI1MTYzLDI1NDgwLDI1NjI4LDI1OTEwLDI1OTc2LDI3MTkzLDI3NTMwLDI3NzAwLDI3OTI5LDI4NDY1LDI5MTU5LDI5NDE3LDI5NTYwLDI5NzAzLDI5ODc0LDMwMjQ2LDMwNTYxLDMxMTY4LDMxMzE5LDMxNDY2LDMxOTI5LDMyMTQzLDMyMTcyLDMyMzUzLDMyNjcwLDMzMDY1LDMzNTg1LDMzOTM2LDM0MDEwLDM0MjgyLDM0OTY2LDM1NTA0LDM1NzI4LDM2NjY0LDM2OTMwLDM2OTk1LDM3MjI4LDM3NTI2LDM3NTYxLDM4NTM5LDM4NTY3LDM4NTY4LDM4NjE0LDM4NjU2LDM4OTIwLDM5MzE4LDM5NjM1LDM5NzA2LDIxNDYwLDIyNjU0LDIyODA5LDIzNDA4LDIzNDg3LDI4MTEzLDI4NTA2LDI5MDg3LDI5NzI5LDI5ODgxLDMyOTAxLDMzNzg5LDI0MDMzLDI0NDU1LDI0NDkwLDI0NjQyLDI2MDkyLDI2NjQyLDI2OTkxLDI3MjE5LDI3NTI5LDI3OTU3LDI4MTQ3LDI5NjY3LDMwNDYyLDMwNjM2LDMxNTY1LDMyMDIwLDMzMDU5LDMzMzA4LDMzNjAwLDM0MDM2LDM0MTQ3LDM1NDI2LDM1NTI0LDM3MjU1LDM3NjYyLDM4OTE4LDM5MzQ4LDI1MTAwLDM0ODk5LDM2ODQ4LDM3NDc3LDIzODE1LDIzODQ3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIzOTEzLDI5NzkxLDMzMTgxLDM0NjY0LDI4NjI5LDI1MzQyLDMyNzIyLDM1MTI2LDM1MTg2LDE5OTk4LDIwMDU2LDIwNzExLDIxMjEzLDIxMzE5LDI1MjE1LDI2MTE5LDMyMzYxLDM0ODIxLDM4NDk0LDIwMzY1LDIxMjczLDIyMDcwLDIyOTg3LDIzMjA0LDIzNjA4LDIzNjMwLDIzNjI5LDI0MDY2LDI0MzM3LDI0NjQzLDI2MDQ1LDI2MTU5LDI2MTc4LDI2NTU4LDI2NjEyLDI5NDY4LDMwNjkwLDMxMDM0LDMyNzA5LDMzOTQwLDMzOTk3LDM1MjIyLDM1NDMwLDM1NDMzLDM1NTUzLDM1OTI1LDM1OTYyLDIyNTE2LDIzNTA4LDI0MzM1LDI0Njg3LDI1MzI1LDI2ODkzLDI3NTQyLDI4MjUyLDI5MDYwLDMxNjk4LDM0NjQ1LDM1NjcyLDM2NjA2LDM5MTM1LDM5MTY2LDIwMjgwLDIwMzUzLDIwNDQ5LDIxNjI3LDIzMDcyLDIzNDgwLDI0ODkyLDI2MDMyLDI2MjE2LDI5MTgwLDMwMDAzLDMxMDcwLDMyMDUxLDMzMTAyLDMzMjUxLDMzNjg4LDM0MjE4LDM0MjU0LDM0NTYzLDM1MzM4LDM2NTIzLDM2NzYzLDYzODU3LDM2ODA1LDIyODMzLDIzNDYwLDIzNTI2LDI0NzEzLDIzNTI5LDIzNTYzLDI0NTE1LDI3Nzc3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzODU4LDI4MTQ1LDI4NjgzLDI5OTc4LDMzNDU1LDM1NTc0LDIwMTYwLDIxMzEzLDYzODU5LDM4NjE3LDI3NjYzLDIwMTI2LDIwNDIwLDIwODE4LDIxODU0LDIzMDc3LDIzNzg0LDI1MTA1LDI5MjczLDMzNDY5LDMzNzA2LDM0NTU4LDM0OTA1LDM1MzU3LDM4NDYzLDM4NTk3LDM5MTg3LDQwMjAxLDQwMjg1LDIyNTM4LDIzNzMxLDIzOTk3LDI0MTMyLDI0ODAxLDI0ODUzLDI1NTY5LDI3MTM4LDI4MTk3LDM3MTIyLDM3NzE2LDM4OTkwLDM5OTUyLDQwODIzLDIzNDMzLDIzNzM2LDI1MzUzLDI2MTkxLDI2Njk2LDMwNTI0LDM4NTkzLDM4Nzk3LDM4OTk2LDM5ODM5LDI2MDE3LDM1NTg1LDM2NTU1LDM4MzMyLDIxODEzLDIzNzIxLDI0MDIyLDI0MjQ1LDI2MjYzLDMwMjg0LDMzNzgwLDM4MzQzLDIyNzM5LDI1Mjc2LDI5MzkwLDQwMjMyLDIwMjA4LDIyODMwLDI0NTkxLDI2MTcxLDI3NTIzLDMxMjA3LDQwMjMwLDIxMzk1LDIxNjk2LDIyNDY3LDIzODMwLDI0ODU5LDI2MzI2LDI4MDc5LDMwODYxLDMzNDA2LDM4NTUyLDM4NzI0LDIxMzgwLDI1MjEyLDI1NDk0LDI4MDgyLDMyMjY2LDMzMDk5LDM4OTg5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI3Mzg3LDMyNTg4LDQwMzY3LDQwNDc0LDIwMDYzLDIwNTM5LDIwOTE4LDIyODEyLDI0ODI1LDI1NTkwLDI2OTI4LDI5MjQyLDMyODIyLDYzODYwLDM3MzI2LDI0MzY5LDYzODYxLDYzODYyLDMyMDA0LDMzNTA5LDMzOTAzLDMzOTc5LDM0Mjc3LDM2NDkzLDYzODYzLDIwMzM1LDYzODY0LDYzODY1LDIyNzU2LDIzMzYzLDI0NjY1LDI1NTYyLDI1ODgwLDI1OTY1LDI2MjY0LDYzODY2LDI2OTU0LDI3MTcxLDI3OTE1LDI4NjczLDI5MDM2LDMwMTYyLDMwMjIxLDMxMTU1LDMxMzQ0LDYzODY3LDMyNjUwLDYzODY4LDM1MTQwLDYzODY5LDM1NzMxLDM3MzEyLDM4NTI1LDYzODcwLDM5MTc4LDIyMjc2LDI0NDgxLDI2MDQ0LDI4NDE3LDMwMjA4LDMxMTQyLDM1NDg2LDM5MzQxLDM5NzcwLDQwODEyLDIwNzQwLDI1MDE0LDI1MjMzLDI3Mjc3LDMzMjIyLDIwNTQ3LDIyNTc2LDI0NDIyLDI4OTM3LDM1MzI4LDM1NTc4LDIzNDIwLDM0MzI2LDIwNDc0LDIwNzk2LDIyMTk2LDIyODUyLDI1NTEzLDI4MTUzLDIzOTc4LDI2OTg5LDIwODcwLDIwMTA0LDIwMzEzLDYzODcxLDYzODcyLDYzODczLDIyOTE0LDYzODc0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzODc1LDI3NDg3LDI3NzQxLDYzODc2LDI5ODc3LDMwOTk4LDYzODc3LDMzMjg3LDMzMzQ5LDMzNTkzLDM2NjcxLDM2NzAxLDYzODc4LDM5MTkyLDYzODc5LDYzODgwLDYzODgxLDIwMTM0LDYzODgyLDIyNDk1LDI0NDQxLDI2MTMxLDYzODgzLDYzODg0LDMwMTIzLDMyMzc3LDM1Njk1LDYzODg1LDM2ODcwLDM5NTE1LDIyMTgxLDIyNTY3LDIzMDMyLDIzMDcxLDIzNDc2LDYzODg2LDI0MzEwLDYzODg3LDYzODg4LDI1NDI0LDI1NDAzLDYzODg5LDI2OTQxLDI3NzgzLDI3ODM5LDI4MDQ2LDI4MDUxLDI4MTQ5LDI4NDM2LDYzODkwLDI4ODk1LDI4OTgyLDI5MDE3LDYzODkxLDI5MTIzLDI5MTQxLDYzODkyLDMwNzk5LDMwODMxLDYzODkzLDMxNjA1LDMyMjI3LDYzODk0LDMyMzAzLDYzODk1LDM0ODkzLDM2NTc1LDYzODk2LDYzODk3LDYzODk4LDM3NDY3LDYzODk5LDQwMTgyLDYzOTAwLDYzOTAxLDYzOTAyLDI0NzA5LDI4MDM3LDYzOTAzLDI5MTA1LDYzOTA0LDYzOTA1LDM4MzIxLDIxNDIxLDYzOTA2LDYzOTA3LDYzOTA4LDI2NTc5LDYzOTA5LDI4ODE0LDI4OTc2LDI5NzQ0LDMzMzk4LDMzNDkwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzOTEwLDM4MzMxLDM5NjUzLDQwNTczLDI2MzA4LDYzOTExLDI5MTIxLDMzODY1LDYzOTEyLDYzOTEzLDIyNjAzLDYzOTE0LDYzOTE1LDIzOTkyLDI0NDMzLDYzOTE2LDI2MTQ0LDI2MjU0LDI3MDAxLDI3MDU0LDI3NzA0LDI3ODkxLDI4MjE0LDI4NDgxLDI4NjM0LDI4Njk5LDI4NzE5LDI5MDA4LDI5MTUxLDI5NTUyLDYzOTE3LDI5Nzg3LDYzOTE4LDI5OTA4LDMwNDA4LDMxMzEwLDMyNDAzLDYzOTE5LDYzOTIwLDMzNTIxLDM1NDI0LDM2ODE0LDYzOTIxLDM3NzA0LDYzOTIyLDM4NjgxLDYzOTIzLDYzOTI0LDIwMDM0LDIwNTIyLDYzOTI1LDIxMDAwLDIxNDczLDI2MzU1LDI3NzU3LDI4NjE4LDI5NDUwLDMwNTkxLDMxMzMwLDMzNDU0LDM0MjY5LDM0MzA2LDYzOTI2LDM1MDI4LDM1NDI3LDM1NzA5LDM1OTQ3LDYzOTI3LDM3NTU1LDYzOTI4LDM4Njc1LDM4OTI4LDIwMTE2LDIwMjM3LDIwNDI1LDIwNjU4LDIxMzIwLDIxNTY2LDIxNTU1LDIxOTc4LDIyNjI2LDIyNzE0LDIyODg3LDIzMDY3LDIzNTI0LDI0NzM1LDYzOTI5LDI1MDM0LDI1OTQyLDI2MTExLDI2MjEyLDI2NzkxLDI3NzM4LDI4NTk1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI4ODc5LDI5MTAwLDI5NTIyLDMxNjEzLDM0NTY4LDM1NDkyLDM5OTg2LDQwNzExLDIzNjI3LDI3Nzc5LDI5NTA4LDI5NTc3LDM3NDM0LDI4MzMxLDI5Nzk3LDMwMjM5LDMxMzM3LDMyMjc3LDM0MzE0LDIwODAwLDIyNzI1LDI1NzkzLDI5OTM0LDI5OTczLDMwMzIwLDMyNzA1LDM3MDEzLDM4NjA1LDM5MjUyLDI4MTk4LDI5OTI2LDMxNDAxLDMxNDAyLDMzMjUzLDM0NTIxLDM0NjgwLDM1MzU1LDIzMTEzLDIzNDM2LDIzNDUxLDI2Nzg1LDI2ODgwLDI4MDAzLDI5NjA5LDI5NzE1LDI5NzQwLDMwODcxLDMyMjMzLDMyNzQ3LDMzMDQ4LDMzMTA5LDMzNjk0LDM1OTE2LDM4NDQ2LDM4OTI5LDI2MzUyLDI0NDQ4LDI2MTA2LDI2NTA1LDI3NzU0LDI5NTc5LDIwNTI1LDIzMDQzLDI3NDk4LDMwNzAyLDIyODA2LDIzOTE2LDI0MDEzLDI5NDc3LDMwMDMxLDYzOTMwLDYzOTMxLDIwNzA5LDIwOTg1LDIyNTc1LDIyODI5LDIyOTM0LDIzMDAyLDIzNTI1LDYzOTMyLDYzOTMzLDIzOTcwLDI1MzAzLDI1NjIyLDI1NzQ3LDI1ODU0LDYzOTM0LDI2MzMyLDYzOTM1LDI3MjA4LDYzOTM2LDI5MTgzLDI5Nzk2LDYzOTM3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxMzY4LDMxNDA3LDMyMzI3LDMyMzUwLDMyNzY4LDMzMTM2LDYzOTM4LDM0Nzk5LDM1MjAxLDM1NjE2LDM2OTUzLDYzOTM5LDM2OTkyLDM5MjUwLDI0OTU4LDI3NDQyLDI4MDIwLDMyMjg3LDM1MTA5LDM2Nzg1LDIwNDMzLDIwNjUzLDIwODg3LDIxMTkxLDIyNDcxLDIyNjY1LDIzNDgxLDI0MjQ4LDI0ODk4LDI3MDI5LDI4MDQ0LDI4MjYzLDI4MzQyLDI5MDc2LDI5Nzk0LDI5OTkyLDI5OTk2LDMyODgzLDMzNTkyLDMzOTkzLDM2MzYyLDM3NzgwLDM3ODU0LDYzOTQwLDIwMTEwLDIwMzA1LDIwNTk4LDIwNzc4LDIxNDQ4LDIxNDUxLDIxNDkxLDIzNDMxLDIzNTA3LDIzNTg4LDI0ODU4LDI0OTYyLDI2MTAwLDI5Mjc1LDI5NTkxLDI5NzYwLDMwNDAyLDMxMDU2LDMxMTIxLDMxMTYxLDMyMDA2LDMyNzAxLDMzNDE5LDM0MjYxLDM0Mzk4LDM2ODAyLDM2OTM1LDM3MTA5LDM3MzU0LDM4NTMzLDM4NjMyLDM4NjMzLDIxMjA2LDI0NDIzLDI2MDkzLDI2MTYxLDI2NjcxLDI5MDIwLDMxMjg2LDM3MDU3LDM4OTIyLDIwMTEzLDYzOTQxLDI3MjE4LDI3NTUwLDI4NTYwLDI5MDY1LDMyNzkyLDMzNDY0LDM0MTMxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2OTM5LDM4NTQ5LDM4NjQyLDM4OTA3LDM0MDc0LDM5NzI5LDIwMTEyLDI5MDY2LDM4NTk2LDIwODAzLDIxNDA3LDIxNzI5LDIyMjkxLDIyMjkwLDIyNDM1LDIzMTk1LDIzMjM2LDIzNDkxLDI0NjE2LDI0ODk1LDI1NTg4LDI3NzgxLDI3OTYxLDI4Mjc0LDI4MzA0LDI5MjMyLDI5NTAzLDI5NzgzLDMzNDg5LDM0OTQ1LDM2Njc3LDM2OTYwLDYzOTQyLDM4NDk4LDM5MDAwLDQwMjE5LDI2Mzc2LDM2MjM0LDM3NDcwLDIwMzAxLDIwNTUzLDIwNzAyLDIxMzYxLDIyMjg1LDIyOTk2LDIzMDQxLDIzNTYxLDI0OTQ0LDI2MjU2LDI4MjA1LDI5MjM0LDI5NzcxLDMyMjM5LDMyOTYzLDMzODA2LDMzODk0LDM0MTExLDM0NjU1LDM0OTA3LDM1MDk2LDM1NTg2LDM2OTQ5LDM4ODU5LDM5NzU5LDIwMDgzLDIwMzY5LDIwNzU0LDIwODQyLDYzOTQzLDIxODA3LDIxOTI5LDIzNDE4LDIzNDYxLDI0MTg4LDI0MTg5LDI0MjU0LDI0NzM2LDI0Nzk5LDI0ODQwLDI0ODQxLDI1NTQwLDI1OTEyLDI2Mzc3LDYzOTQ0LDI2NTgwLDI2NTg2LDYzOTQ1LDI2OTc3LDI2OTc4LDI3ODMzLDI3OTQzLDYzOTQ2LDI4MjE2LDYzOTQ3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI4NjQxLDI5NDk0LDI5NDk1LDYzOTQ4LDI5Nzg4LDMwMDAxLDYzOTQ5LDMwMjkwLDYzOTUwLDYzOTUxLDMyMTczLDMzMjc4LDMzODQ4LDM1MDI5LDM1NDgwLDM1NTQ3LDM1NTY1LDM2NDAwLDM2NDE4LDM2OTM4LDM2OTI2LDM2OTg2LDM3MTkzLDM3MzIxLDM3NzQyLDYzOTUyLDYzOTUzLDIyNTM3LDYzOTU0LDI3NjAzLDMyOTA1LDMyOTQ2LDYzOTU1LDYzOTU2LDIwODAxLDIyODkxLDIzNjA5LDYzOTU3LDYzOTU4LDI4NTE2LDI5NjA3LDMyOTk2LDM2MTAzLDYzOTU5LDM3Mzk5LDM4Mjg3LDYzOTYwLDYzOTYxLDYzOTYyLDYzOTYzLDMyODk1LDI1MTAyLDI4NzAwLDMyMTA0LDM0NzAxLDYzOTY0LDIyNDMyLDI0NjgxLDI0OTAzLDI3NTc1LDM1NTE4LDM3NTA0LDM4NTc3LDIwMDU3LDIxNTM1LDI4MTM5LDM0MDkzLDM4NTEyLDM4ODk5LDM5MTUwLDI1NTU4LDI3ODc1LDM3MDA5LDIwOTU3LDI1MDMzLDMzMjEwLDQwNDQxLDIwMzgxLDIwNTA2LDIwNzM2LDIzNDUyLDI0ODQ3LDI1MDg3LDI1ODM2LDI2ODg1LDI3NTg5LDMwMDk3LDMwNjkxLDMyNjgxLDMzMzgwLDM0MTkxLDM0ODExLDM0OTE1LDM1NTE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM1Njk2LDM3MjkxLDIwMTA4LDIwMTk3LDIwMjM0LDYzOTY1LDYzOTY2LDIyODM5LDIzMDE2LDYzOTY3LDI0MDUwLDI0MzQ3LDI0NDExLDI0NjA5LDYzOTY4LDYzOTY5LDYzOTcwLDYzOTcxLDI5MjQ2LDI5NjY5LDYzOTcyLDMwMDY0LDMwMTU3LDYzOTczLDMxMjI3LDYzOTc0LDMyNzgwLDMyODE5LDMyOTAwLDMzNTA1LDMzNjE3LDYzOTc1LDYzOTc2LDM2MDI5LDM2MDE5LDM2OTk5LDYzOTc3LDYzOTc4LDM5MTU2LDM5MTgwLDYzOTc5LDYzOTgwLDI4NzI3LDMwNDEwLDMyNzE0LDMyNzE2LDMyNzY0LDM1NjEwLDIwMTU0LDIwMTYxLDIwOTk1LDIxMzYwLDYzOTgxLDIxNjkzLDIyMjQwLDIzMDM1LDIzNDkzLDI0MzQxLDI0NTI1LDI4MjcwLDYzOTgyLDYzOTgzLDMyMTA2LDMzNTg5LDYzOTg0LDM0NDUxLDM1NDY5LDYzOTg1LDM4NzY1LDM4Nzc1LDYzOTg2LDYzOTg3LDE5OTY4LDIwMzE0LDIwMzUwLDIyNzc3LDI2MDg1LDI4MzIyLDM2OTIwLDM3ODA4LDM5MzUzLDIwMjE5LDIyNzY0LDIyOTIyLDIzMDAxLDI0NjQxLDYzOTg4LDYzOTg5LDMxMjUyLDYzOTkwLDMzNjE1LDM2MDM1LDIwODM3LDIxMzE2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDYzOTkxLDYzOTkyLDYzOTkzLDIwMTczLDIxMDk3LDIzMzgxLDMzNDcxLDIwMTgwLDIxMDUwLDIxNjcyLDIyOTg1LDIzMDM5LDIzMzc2LDIzMzgzLDIzMzg4LDI0Njc1LDI0OTA0LDI4MzYzLDI4ODI1LDI5MDM4LDI5NTc0LDI5OTQzLDMwMTMzLDMwOTEzLDMyMDQzLDMyNzczLDMzMjU4LDMzNTc2LDM0MDcxLDM0MjQ5LDM1NTY2LDM2MDM5LDM4NjA0LDIwMzE2LDIxMjQyLDIyMjA0LDI2MDI3LDI2MTUyLDI4Nzk2LDI4ODU2LDI5MjM3LDMyMTg5LDMzNDIxLDM3MTk2LDM4NTkyLDQwMzA2LDIzNDA5LDI2ODU1LDI3NTQ0LDI4NTM4LDMwNDMwLDIzNjk3LDI2MjgzLDI4NTA3LDMxNjY4LDMxNzg2LDM0ODcwLDM4NjIwLDE5OTc2LDIwMTgzLDIxMjgwLDIyNTgwLDIyNzE1LDIyNzY3LDIyODkyLDIzNTU5LDI0MTE1LDI0MTk2LDI0MzczLDI1NDg0LDI2MjkwLDI2NDU0LDI3MTY3LDI3Mjk5LDI3NDA0LDI4NDc5LDI5MjU0LDYzOTk0LDI5NTIwLDI5ODM1LDMxNDU2LDMxOTExLDMzMTQ0LDMzMjQ3LDMzMjU1LDMzNjc0LDMzOTAwLDM0MDgzLDM0MTk2LDM0MjU1LDM1MDM3LDM2MTE1LDM3MjkyLDM4MjYzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM4NTU2LDIwODc3LDIxNzA1LDIyMzEyLDIzNDcyLDI1MTY1LDI2NDQ4LDI2Njg1LDI2NzcxLDI4MjIxLDI4MzcxLDI4Nzk3LDMyMjg5LDM1MDA5LDM2MDAxLDM2NjE3LDQwNzc5LDQwNzgyLDI5MjI5LDMxNjMxLDM1NTMzLDM3NjU4LDIwMjk1LDIwMzAyLDIwNzg2LDIxNjMyLDIyOTkyLDI0MjEzLDI1MjY5LDI2NDg1LDI2OTkwLDI3MTU5LDI3ODIyLDI4MTg2LDI5NDAxLDI5NDgyLDMwMTQxLDMxNjcyLDMyMDUzLDMzNTExLDMzNzg1LDMzODc5LDM0Mjk1LDM1NDE5LDM2MDE1LDM2NDg3LDM2ODg5LDM3MDQ4LDM4NjA2LDQwNzk5LDIxMjE5LDIxNTE0LDIzMjY1LDIzNDkwLDI1Njg4LDI1OTczLDI4NDA0LDI5MzgwLDYzOTk1LDMwMzQwLDMxMzA5LDMxNTE1LDMxODIxLDMyMzE4LDMyNzM1LDMzNjU5LDM1NjI3LDM2MDQyLDM2MTk2LDM2MzIxLDM2NDQ3LDM2ODQyLDM2ODU3LDM2OTY5LDM3ODQxLDIwMjkxLDIwMzQ2LDIwNjU5LDIwODQwLDIwODU2LDIxMDY5LDIxMDk4LDIyNjI1LDIyNjUyLDIyODgwLDIzNTYwLDIzNjM3LDI0MjgzLDI0NzMxLDI1MTM2LDI2NjQzLDI3NTgzLDI3NjU2LDI4NTkzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI5MDA2LDI5NzI4LDMwMDAwLDMwMDA4LDMwMDMzLDMwMzIyLDMxNTY0LDMxNjI3LDMxNjYxLDMxNjg2LDMyMzk5LDM1NDM4LDM2NjcwLDM2NjgxLDM3NDM5LDM3NTIzLDM3NjY2LDM3OTMxLDM4NjUxLDM5MDAyLDM5MDE5LDM5MTk4LDIwOTk5LDI1MTMwLDI1MjQwLDI3OTkzLDMwMzA4LDMxNDM0LDMxNjgwLDMyMTE4LDIxMzQ0LDIzNzQyLDI0MjE1LDI4NDcyLDI4ODU3LDMxODk2LDM4NjczLDM5ODIyLDQwNjcwLDI1NTA5LDI1NzIyLDM0Njc4LDE5OTY5LDIwMTE3LDIwMTQxLDIwNTcyLDIwNTk3LDIxNTc2LDIyOTc5LDIzNDUwLDI0MTI4LDI0MjM3LDI0MzExLDI0NDQ5LDI0NzczLDI1NDAyLDI1OTE5LDI1OTcyLDI2MDYwLDI2MjMwLDI2MjMyLDI2NjIyLDI2OTg0LDI3MjczLDI3NDkxLDI3NzEyLDI4MDk2LDI4MTM2LDI4MTkxLDI4MjU0LDI4NzAyLDI4ODMzLDI5NTgyLDI5NjkzLDMwMDEwLDMwNTU1LDMwODU1LDMxMTE4LDMxMjQzLDMxMzU3LDMxOTM0LDMyMTQyLDMzMzUxLDM1MzMwLDM1NTYyLDM1OTk4LDM3MTY1LDM3MTk0LDM3MzM2LDM3NDc4LDM3NTgwLDM3NjY0LDM4NjYyLDM4NzQyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM4NzQ4LDM4OTE0LDQwNzE4LDIxMDQ2LDIxMTM3LDIxODg0LDIyNTY0LDI0MDkzLDI0MzUxLDI0NzE2LDI1NTUyLDI2Nzk5LDI4NjM5LDMxMDg1LDMxNTMyLDMzMjI5LDM0MjM0LDM1MDY5LDM1NTc2LDM2NDIwLDM3MjYxLDM4NTAwLDM4NTU1LDM4NzE3LDM4OTg4LDQwNzc4LDIwNDMwLDIwODA2LDIwOTM5LDIxMTYxLDIyMDY2LDI0MzQwLDI0NDI3LDI1NTE0LDI1ODA1LDI2MDg5LDI2MTc3LDI2MzYyLDI2MzYxLDI2Mzk3LDI2NzgxLDI2ODM5LDI3MTMzLDI4NDM3LDI4NTI2LDI5MDMxLDI5MTU3LDI5MjI2LDI5ODY2LDMwNTIyLDMxMDYyLDMxMDY2LDMxMTk5LDMxMjY0LDMxMzgxLDMxODk1LDMxOTY3LDMyMDY4LDMyMzY4LDMyOTAzLDM0Mjk5LDM0NDY4LDM1NDEyLDM1NTE5LDM2MjQ5LDM2NDgxLDM2ODk2LDM2OTczLDM3MzQ3LDM4NDU5LDM4NjEzLDQwMTY1LDI2MDYzLDMxNzUxLDM2Mjc1LDM3ODI3LDIzMzg0LDIzNTYyLDIxMzMwLDI1MzA1LDI5NDY5LDIwNTE5LDIzNDQ3LDI0NDc4LDI0NzUyLDI0OTM5LDI2ODM3LDI4MTIxLDI5NzQyLDMxMjc4LDMyMDY2LDMyMTU2LDMyMzA1LDMzMTMxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2Mzk0LDM2NDA1LDM3NzU4LDM3OTEyLDIwMzA0LDIyMzUyLDI0MDM4LDI0MjMxLDI1Mzg3LDMyNjE4LDIwMDI3LDIwMzAzLDIwMzY3LDIwNTcwLDIzMDA1LDMyOTY0LDIxNjEwLDIxNjA4LDIyMDE0LDIyODYzLDIzNDQ5LDI0MDMwLDI0MjgyLDI2MjA1LDI2NDE3LDI2NjA5LDI2NjY2LDI3ODgwLDI3OTU0LDI4MjM0LDI4NTU3LDI4ODU1LDI5NjY0LDMwMDg3LDMxODIwLDMyMDAyLDMyMDQ0LDMyMTYyLDMzMzExLDM0NTIzLDM1Mzg3LDM1NDYxLDM2MjA4LDM2NDkwLDM2NjU5LDM2OTEzLDM3MTk4LDM3MjAyLDM3OTU2LDM5Mzc2LDMxNDgxLDMxOTA5LDIwNDI2LDIwNzM3LDIwOTM0LDIyNDcyLDIzNTM1LDIzODAzLDI2MjAxLDI3MTk3LDI3OTk0LDI4MzEwLDI4NjUyLDI4OTQwLDMwMDYzLDMxNDU5LDM0ODUwLDM2ODk3LDM2OTgxLDM4NjAzLDM5NDIzLDMzNTM3LDIwMDEzLDIwMjEwLDM0ODg2LDM3MzI1LDIxMzczLDI3MzU1LDI2OTg3LDI3NzEzLDMzOTE0LDIyNjg2LDI0OTc0LDI2MzY2LDI1MzI3LDI4ODkzLDI5OTY5LDMwMTUxLDMyMzM4LDMzOTc2LDM1NjU3LDM2MTA0LDIwMDQzLDIxNDgyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxNjc1LDIyMzIwLDIyMzM2LDI0NTM1LDI1MzQ1LDI1MzUxLDI1NzExLDI1OTAzLDI2MDg4LDI2MjM0LDI2NTI1LDI2NTQ3LDI3NDkwLDI3NzQ0LDI3ODAyLDI4NDYwLDMwNjkzLDMwNzU3LDMxMDQ5LDMxMDYzLDMyMDI1LDMyOTMwLDMzMDI2LDMzMjY3LDMzNDM3LDMzNDYzLDM0NTg0LDM1NDY4LDYzOTk2LDM2MTAwLDM2Mjg2LDM2OTc4LDMwNDUyLDMxMjU3LDMxMjg3LDMyMzQwLDMyODg3LDIxNzY3LDIxOTcyLDIyNjQ1LDI1MzkxLDI1NjM0LDI2MTg1LDI2MTg3LDI2NzMzLDI3MDM1LDI3NTI0LDI3OTQxLDI4MzM3LDI5NjQ1LDI5ODAwLDI5ODU3LDMwMDQzLDMwMTM3LDMwNDMzLDMwNDk0LDMwNjAzLDMxMjA2LDMyMjY1LDMyMjg1LDMzMjc1LDM0MDk1LDM0OTY3LDM1Mzg2LDM2MDQ5LDM2NTg3LDM2Nzg0LDM2OTE0LDM3ODA1LDM4NDk5LDM4NTE1LDM4NjYzLDIwMzU2LDIxNDg5LDIzMDE4LDIzMjQxLDI0MDg5LDI2NzAyLDI5ODk0LDMwMTQyLDMxMjA5LDMxMzc4LDMzMTg3LDM0NTQxLDM2MDc0LDM2MzAwLDM2ODQ1LDI2MDE1LDI2Mzg5LDYzOTk3LDIyNTE5LDI4NTAzLDMyMjIxLDM2NjU1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM3ODc4LDM4NTk4LDI0NTAxLDI1MDc0LDI4NTQ4LDE5OTg4LDIwMzc2LDIwNTExLDIxNDQ5LDIxOTgzLDIzOTE5LDI0MDQ2LDI3NDI1LDI3NDkyLDMwOTIzLDMxNjQyLDYzOTk4LDM2NDI1LDM2NTU0LDM2OTc0LDI1NDE3LDI1NjYyLDMwNTI4LDMxMzY0LDM3Njc5LDM4MDE1LDQwODEwLDI1Nzc2LDI4NTkxLDI5MTU4LDI5ODY0LDI5OTE0LDMxNDI4LDMxNzYyLDMyMzg2LDMxOTIyLDMyNDA4LDM1NzM4LDM2MTA2LDM4MDEzLDM5MTg0LDM5MjQ0LDIxMDQ5LDIzNTE5LDI1ODMwLDI2NDEzLDMyMDQ2LDIwNzE3LDIxNDQzLDIyNjQ5LDI0OTIwLDI0OTIxLDI1MDgyLDI2MDI4LDMxNDQ5LDM1NzMwLDM1NzM0LDIwNDg5LDIwNTEzLDIxMTA5LDIxODA5LDIzMTAwLDI0Mjg4LDI0NDMyLDI0ODg0LDI1OTUwLDI2MTI0LDI2MTY2LDI2Mjc0LDI3MDg1LDI4MzU2LDI4NDY2LDI5NDYyLDMwMjQxLDMxMzc5LDMzMDgxLDMzMzY5LDMzNzUwLDMzOTgwLDIwNjYxLDIyNTEyLDIzNDg4LDIzNTI4LDI0NDI1LDI1NTA1LDMwNzU4LDMyMTgxLDMzNzU2LDM0MDgxLDM3MzE5LDM3MzY1LDIwODc0LDI2NjEzLDMxNTc0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2MDEyLDIwOTMyLDIyOTcxLDI0NzY1LDM0Mzg5LDIwNTA4LDYzOTk5LDIxMDc2LDIzNjEwLDI0OTU3LDI1MTE0LDI1Mjk5LDI1ODQyLDI2MDIxLDI4MzY0LDMwMjQwLDMzMDM0LDM2NDQ4LDM4NDk1LDM4NTg3LDIwMTkxLDIxMzE1LDIxOTEyLDIyODI1LDI0MDI5LDI1Nzk3LDI3ODQ5LDI4MTU0LDI5NTg4LDMxMzU5LDMzMzA3LDM0MjE0LDM2MDY4LDM2MzY4LDM2OTgzLDM3MzUxLDM4MzY5LDM4NDMzLDM4ODU0LDIwOTg0LDIxNzQ2LDIxODk0LDI0NTA1LDI1NzY0LDI4NTUyLDMyMTgwLDM2NjM5LDM2Njg1LDM3OTQxLDIwNjgxLDIzNTc0LDI3ODM4LDI4MTU1LDI5OTc5LDMwNjUxLDMxODA1LDMxODQ0LDM1NDQ5LDM1NTIyLDIyNTU4LDIyOTc0LDI0MDg2LDI1NDYzLDI5MjY2LDMwMDkwLDMwNTcxLDM1NTQ4LDM2MDI4LDM2NjI2LDI0MzA3LDI2MjI4LDI4MTUyLDMyODkzLDMzNzI5LDM1NTMxLDM4NzM3LDM5ODk0LDY0MDAwLDIxMDU5LDI2MzY3LDI4MDUzLDI4Mzk5LDMyMjI0LDM1NTU4LDM2OTEwLDM2OTU4LDM5NjM2LDIxMDIxLDIxMTE5LDIxNzM2LDI0OTgwLDI1MjIwLDI1MzA3LDI2Nzg2LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI2ODk4LDI2OTcwLDI3MTg5LDI4ODE4LDI4OTY2LDMwODEzLDMwOTc3LDMwOTkwLDMxMTg2LDMxMjQ1LDMyOTE4LDMzNDAwLDMzNDkzLDMzNjA5LDM0MTIxLDM1OTcwLDM2MjI5LDM3MjE4LDM3MjU5LDM3Mjk0LDIwNDE5LDIyMjI1LDI5MTY1LDMwNjc5LDM0NTYwLDM1MzIwLDIzNTQ0LDI0NTM0LDI2NDQ5LDM3MDMyLDIxNDc0LDIyNjE4LDIzNTQxLDI0NzQwLDI0OTYxLDI1Njk2LDMyMzE3LDMyODgwLDM0MDg1LDM3NTA3LDI1Nzc0LDIwNjUyLDIzODI4LDI2MzY4LDIyNjg0LDI1Mjc3LDI1NTEyLDI2ODk0LDI3MDAwLDI3MTY2LDI4MjY3LDMwMzk0LDMxMTc5LDMzNDY3LDMzODMzLDM1NTM1LDM2MjY0LDM2ODYxLDM3MTM4LDM3MTk1LDM3Mjc2LDM3NjQ4LDM3NjU2LDM3Nzg2LDM4NjE5LDM5NDc4LDM5OTQ5LDE5OTg1LDMwMDQ0LDMxMDY5LDMxNDgyLDMxNTY5LDMxNjg5LDMyMzAyLDMzOTg4LDM2NDQxLDM2NDY4LDM2NjAwLDM2ODgwLDI2MTQ5LDI2OTQzLDI5NzYzLDIwOTg2LDI2NDE0LDQwNjY4LDIwODA1LDI0NTQ0LDI3Nzk4LDM0ODAyLDM0OTA5LDM0OTM1LDI0NzU2LDMzMjA1LDMzNzk1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM2MTAxLDIxNDYyLDIxNTYxLDIyMDY4LDIzMDk0LDIzNjAxLDI4ODEwLDMyNzM2LDMyODU4LDMzMDMwLDMzMjYxLDM2MjU5LDM3MjU3LDM5NTE5LDQwNDM0LDIwNTk2LDIwMTY0LDIxNDA4LDI0ODI3LDI4MjA0LDIzNjUyLDIwMzYwLDIwNTE2LDIxOTg4LDIzNzY5LDI0MTU5LDI0Njc3LDI2NzcyLDI3ODM1LDI4MTAwLDI5MTE4LDMwMTY0LDMwMTk2LDMwMzA1LDMxMjU4LDMxMzA1LDMyMTk5LDMyMjUxLDMyNjIyLDMzMjY4LDM0NDczLDM2NjM2LDM4NjAxLDM5MzQ3LDQwNzg2LDIxMDYzLDIxMTg5LDM5MTQ5LDM1MjQyLDE5OTcxLDI2NTc4LDI4NDIyLDIwNDA1LDIzNTIyLDI2NTE3LDI3Nzg0LDI4MDI0LDI5NzIzLDMwNzU5LDM3MzQxLDM3NzU2LDM0NzU2LDMxMjA0LDMxMjgxLDI0NTU1LDIwMTgyLDIxNjY4LDIxODIyLDIyNzAyLDIyOTQ5LDI0ODE2LDI1MTcxLDI1MzAyLDI2NDIyLDI2OTY1LDMzMzMzLDM4NDY0LDM5MzQ1LDM5Mzg5LDIwNTI0LDIxMzMxLDIxODI4LDIyMzk2LDY0MDAxLDI1MTc2LDY0MDAyLDI1ODI2LDI2MjE5LDI2NTg5LDI4NjA5LDI4NjU1LDI5NzMwLDI5NzUyLDM1MzUxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM3OTQ0LDIxNTg1LDIyMDIyLDIyMzc0LDI0MzkyLDI0OTg2LDI3NDcwLDI4NzYwLDI4ODQ1LDMyMTg3LDM1NDc3LDIyODkwLDMzMDY3LDI1NTA2LDMwNDcyLDMyODI5LDM2MDEwLDIyNjEyLDI1NjQ1LDI3MDY3LDIzNDQ1LDI0MDgxLDI4MjcxLDY0MDAzLDM0MTUzLDIwODEyLDIxNDg4LDIyODI2LDI0NjA4LDI0OTA3LDI3NTI2LDI3NzYwLDI3ODg4LDMxNTE4LDMyOTc0LDMzNDkyLDM2Mjk0LDM3MDQwLDM5MDg5LDY0MDA0LDI1Nzk5LDI4NTgwLDI1NzQ1LDI1ODYwLDIwODE0LDIxNTIwLDIyMzAzLDM1MzQyLDI0OTI3LDI2NzQyLDY0MDA1LDMwMTcxLDMxNTcwLDMyMTEzLDM2ODkwLDIyNTM0LDI3MDg0LDMzMTUxLDM1MTE0LDM2ODY0LDM4OTY5LDIwNjAwLDIyODcxLDIyOTU2LDI1MjM3LDM2ODc5LDM5NzIyLDI0OTI1LDI5MzA1LDM4MzU4LDIyMzY5LDIzMTEwLDI0MDUyLDI1MjI2LDI1NzczLDI1ODUwLDI2NDg3LDI3ODc0LDI3OTY2LDI5MjI4LDI5NzUwLDMwNzcyLDMyNjMxLDMzNDUzLDM2MzE1LDM4OTM1LDIxMDI4LDIyMzM4LDI2NDk1LDI5MjU2LDI5OTIzLDM2MDA5LDM2Nzc0LDM3MzkzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDM4NDQyLDIwODQzLDIxNDg1LDI1NDIwLDIwMzI5LDIxNzY0LDI0NzI2LDI1OTQzLDI3ODAzLDI4MDMxLDI5MjYwLDI5NDM3LDMxMjU1LDM1MjA3LDM1OTk3LDI0NDI5LDI4NTU4LDI4OTIxLDMzMTkyLDI0ODQ2LDIwNDE1LDIwNTU5LDI1MTUzLDI5MjU1LDMxNjg3LDMyMjMyLDMyNzQ1LDM2OTQxLDM4ODI5LDM5NDQ5LDM2MDIyLDIyMzc4LDI0MTc5LDI2NTQ0LDMzODA1LDM1NDEzLDIxNTM2LDIzMzE4LDI0MTYzLDI0MjkwLDI0MzMwLDI1OTg3LDMyOTU0LDM0MTA5LDM4MjgxLDM4NDkxLDIwMjk2LDIxMjUzLDIxMjYxLDIxMjYzLDIxNjM4LDIxNzU0LDIyMjc1LDI0MDY3LDI0NTk4LDI1MjQzLDI1MjY1LDI1NDI5LDY0MDA2LDI3ODczLDI4MDA2LDMwMTI5LDMwNzcwLDMyOTkwLDMzMDcxLDMzNTAyLDMzODg5LDMzOTcwLDM0OTU3LDM1MDkwLDM2ODc1LDM3NjEwLDM5MTY1LDM5ODI1LDI0MTMzLDI2MjkyLDI2MzMzLDI4Njg5LDI5MTkwLDY0MDA3LDIwNDY5LDIxMTE3LDI0NDI2LDI0OTE1LDI2NDUxLDI3MTYxLDI4NDE4LDI5OTIyLDMxMDgwLDM0OTIwLDM1OTYxLDM5MTExLDM5MTA4LDM5NDkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIxNjk3LDMxMjYzLDI2OTYzLDM1NTc1LDM1OTE0LDM5MDgwLDM5MzQyLDI0NDQ0LDI1MjU5LDMwMTMwLDMwMzgyLDM0OTg3LDM2OTkxLDM4NDY2LDIxMzA1LDI0MzgwLDI0NTE3LDI3ODUyLDI5NjQ0LDMwMDUwLDMwMDkxLDMxNTU4LDMzNTM0LDM5MzI1LDIwMDQ3LDM2OTI0LDE5OTc5LDIwMzA5LDIxNDE0LDIyNzk5LDI0MjY0LDI2MTYwLDI3ODI3LDI5NzgxLDMzNjU1LDM0NjYyLDM2MDMyLDM2OTQ0LDM4Njg2LDM5OTU3LDIyNzM3LDIzNDE2LDM0Mzg0LDM1NjA0LDQwMzcyLDIzNTA2LDI0NjgwLDI0NzE3LDI2MDk3LDI3NzM1LDI4NDUwLDI4NTc5LDI4Njk4LDMyNTk3LDMyNzUyLDM4Mjg5LDM4MjkwLDM4NDgwLDM4ODY3LDIxMTA2LDM2Njc2LDIwOTg5LDIxNTQ3LDIxNjg4LDIxODU5LDIxODk4LDI3MzIzLDI4MDg1LDMyMjE2LDMzMzgyLDM3NTMyLDM4NTE5LDQwNTY5LDIxNTEyLDIxNzA0LDMwNDE4LDM0NTMyLDM4MzA4LDM4MzU2LDM4NDkyLDIwMTMwLDIwMjMzLDIzMDIyLDIzMjcwLDI0MDU1LDI0NjU4LDI1MjM5LDI2NDc3LDI2Njg5LDI3NzgyLDI4MjA3LDMyNTY4LDMyOTIzLDMzMzIyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDY0MDA4LDY0MDA5LDM4OTE3LDIwMTMzLDIwNTY1LDIxNjgzLDIyNDE5LDIyODc0LDIzNDAxLDIzNDc1LDI1MDMyLDI2OTk5LDI4MDIzLDI4NzA3LDM0ODA5LDM1Mjk5LDM1NDQyLDM1NTU5LDM2OTk0LDM5NDA1LDM5NjA4LDIxMTgyLDI2NjgwLDIwNTAyLDI0MTg0LDI2NDQ3LDMzNjA3LDM0ODkyLDIwMTM5LDIxNTIxLDIyMTkwLDI5NjcwLDM3MTQxLDM4OTExLDM5MTc3LDM5MjU1LDM5MzIxLDIyMDk5LDIyNjg3LDM0Mzk1LDM1Mzc3LDI1MDEwLDI3MzgyLDI5NTYzLDM2NTYyLDI3NDYzLDM4NTcwLDM5NTExLDIyODY5LDI5MTg0LDM2MjAzLDM4NzYxLDIwNDM2LDIzNzk2LDI0MzU4LDI1MDgwLDI2MjAzLDI3ODgzLDI4ODQzLDI5NTcyLDI5NjI1LDI5Njk0LDMwNTA1LDMwNTQxLDMyMDY3LDMyMDk4LDMyMjkxLDMzMzM1LDM0ODk4LDY0MDEwLDM2MDY2LDM3NDQ5LDM5MDIzLDIzMzc3LDMxMzQ4LDM0ODgwLDM4OTEzLDIzMjQ0LDIwNDQ4LDIxMzMyLDIyODQ2LDIzODA1LDI1NDA2LDI4MDI1LDI5NDMzLDMzMDI5LDMzMDMxLDMzNjk4LDM3NTgzLDM4OTYwLDIwMTM2LDIwODA0LDIxMDA5LDIyNDExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI0NDE4LDI3ODQyLDI4MzY2LDI4Njc3LDI4NzUyLDI4ODQ3LDI5MDc0LDI5NjczLDI5ODAxLDMzNjEwLDM0NzIyLDM0OTEzLDM2ODcyLDM3MDI2LDM3Nzk1LDM5MzM2LDIwODQ2LDI0NDA3LDI0ODAwLDI0OTM1LDI2MjkxLDM0MTM3LDM2NDI2LDM3Mjk1LDM4Nzk1LDIwMDQ2LDIwMTE0LDIxNjI4LDIyNzQxLDIyNzc4LDIyOTA5LDIzNzMzLDI0MzU5LDI1MTQyLDI1MTYwLDI2MTIyLDI2MjE1LDI3NjI3LDI4MDA5LDI4MTExLDI4MjQ2LDI4NDA4LDI4NTY0LDI4NjQwLDI4NjQ5LDI4NzY1LDI5MzkyLDI5NzMzLDI5Nzg2LDI5OTIwLDMwMzU1LDMxMDY4LDMxOTQ2LDMyMjg2LDMyOTkzLDMzNDQ2LDMzODk5LDMzOTgzLDM0MzgyLDM0Mzk5LDM0Njc2LDM1NzAzLDM1OTQ2LDM3ODA0LDM4OTEyLDM5MDEzLDI0Nzg1LDI1MTEwLDM3MjM5LDIzMTMwLDI2MTI3LDI4MTUxLDI4MjIyLDI5NzU5LDM5NzQ2LDI0NTczLDI0Nzk0LDMxNTAzLDIxNzAwLDI0MzQ0LDI3NzQyLDI3ODU5LDI3OTQ2LDI4ODg4LDMyMDA1LDM0NDI1LDM1MzQwLDQwMjUxLDIxMjcwLDIxNjQ0LDIzMzAxLDI3MTk0LDI4Nzc5LDMwMDY5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMxMTE3LDMxMTY2LDMzNDU3LDMzNzc1LDM1NDQxLDM1NjQ5LDM2MDA4LDM4NzcyLDY0MDExLDI1ODQ0LDI1ODk5LDMwOTA2LDMwOTA3LDMxMzM5LDIwMDI0LDIxOTE0LDIyODY0LDIzNDYyLDI0MTg3LDI0NzM5LDI1NTYzLDI3NDg5LDI2MjEzLDI2NzA3LDI4MTg1LDI5MDI5LDI5ODcyLDMyMDA4LDM2OTk2LDM5NTI5LDM5OTczLDI3OTYzLDI4MzY5LDI5NTAyLDM1OTA1LDM4MzQ2LDIwOTc2LDI0MTQwLDI0NDg4LDI0NjUzLDI0ODIyLDI0ODgwLDI0OTA4LDI2MTc5LDI2MTgwLDI3MDQ1LDI3ODQxLDI4MjU1LDI4MzYxLDI4NTE0LDI5MDA0LDI5ODUyLDMwMzQzLDMxNjgxLDMxNzgzLDMzNjE4LDM0NjQ3LDM2OTQ1LDM4NTQxLDQwNjQzLDIxMjk1LDIyMjM4LDI0MzE1LDI0NDU4LDI0Njc0LDI0NzI0LDI1MDc5LDI2MjE0LDI2MzcxLDI3MjkyLDI4MTQyLDI4NTkwLDI4Nzg0LDI5NTQ2LDMyMzYyLDMzMjE0LDMzNTg4LDM0NTE2LDM1NDk2LDM2MDM2LDIxMTIzLDI5NTU0LDIzNDQ2LDI3MjQzLDM3ODkyLDIxNzQyLDIyMTUwLDIzMzg5LDI1OTI4LDI1OTg5LDI2MzEzLDI2NzgzLDI4MDQ1LDI4MTAyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDI5MjQzLDMyOTQ4LDM3MjM3LDM5NTAxLDIwMzk5LDIwNTA1LDIxNDAyLDIxNTE4LDIxNTY0LDIxODk3LDIxOTU3LDI0MTI3LDI0NDYwLDI2NDI5LDI5MDMwLDI5NjYxLDM2ODY5LDIxMjExLDIxMjM1LDIyNjI4LDIyNzM0LDI4OTMyLDI5MDcxLDI5MTc5LDM0MjI0LDM1MzQ3LDI2MjQ4LDM0MjE2LDIxOTI3LDI2MjQ0LDI5MDAyLDMzODQxLDIxMzIxLDIxOTEzLDI3NTg1LDI0NDA5LDI0NTA5LDI1NTgyLDI2MjQ5LDI4OTk5LDM1NTY5LDM2NjM3LDQwNjM4LDIwMjQxLDI1NjU4LDI4ODc1LDMwMDU0LDM0NDA3LDI0Njc2LDM1NjYyLDQwNDQwLDIwODA3LDIwOTgyLDIxMjU2LDI3OTU4LDMzMDE2LDQwNjU3LDI2MTMzLDI3NDI3LDI4ODI0LDMwMTY1LDIxNTA3LDIzNjczLDMyMDA3LDM1MzUwLDI3NDI0LDI3NDUzLDI3NDYyLDIxNTYwLDI0Njg4LDI3OTY1LDMyNzI1LDMzMjg4LDIwNjk0LDIwOTU4LDIxOTE2LDIyMTIzLDIyMjIxLDIzMDIwLDIzMzA1LDI0MDc2LDI0OTg1LDI0OTg0LDI1MTM3LDI2MjA2LDI2MzQyLDI5MDgxLDI5MTEzLDI5MTE0LDI5MzUxLDMxMTQzLDMxMjMyLDMyNjkwLDM1NDQwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLFxuICBcImdiMTgwMzBcIjpbMTk5NzAsMTk5NzIsMTk5NzMsMTk5NzQsMTk5ODMsMTk5ODYsMTk5OTEsMTk5OTksMjAwMDAsMjAwMDEsMjAwMDMsMjAwMDYsMjAwMDksMjAwMTQsMjAwMTUsMjAwMTcsMjAwMTksMjAwMjEsMjAwMjMsMjAwMjgsMjAwMzIsMjAwMzMsMjAwMzQsMjAwMzYsMjAwMzgsMjAwNDIsMjAwNDksMjAwNTMsMjAwNTUsMjAwNTgsMjAwNTksMjAwNjYsMjAwNjcsMjAwNjgsMjAwNjksMjAwNzEsMjAwNzIsMjAwNzQsMjAwNzUsMjAwNzYsMjAwNzcsMjAwNzgsMjAwNzksMjAwODIsMjAwODQsMjAwODUsMjAwODYsMjAwODcsMjAwODgsMjAwODksMjAwOTAsMjAwOTEsMjAwOTIsMjAwOTMsMjAwOTUsMjAwOTYsMjAwOTcsMjAwOTgsMjAwOTksMjAxMDAsMjAxMDEsMjAxMDMsMjAxMDYsMjAxMTIsMjAxMTgsMjAxMTksMjAxMjEsMjAxMjQsMjAxMjUsMjAxMjYsMjAxMzEsMjAxMzgsMjAxNDMsMjAxNDQsMjAxNDUsMjAxNDgsMjAxNTAsMjAxNTEsMjAxNTIsMjAxNTMsMjAxNTYsMjAxNTcsMjAxNTgsMjAxNjgsMjAxNzIsMjAxNzUsMjAxNzYsMjAxNzgsMjAxODYsMjAxODcsMjAxODgsMjAxOTIsMjAxOTQsMjAxOTgsMjAxOTksMjAyMDEsMjAyMDUsMjAyMDYsMjAyMDcsMjAyMDksMjAyMTIsMjAyMTYsMjAyMTcsMjAyMTgsMjAyMjAsMjAyMjIsMjAyMjQsMjAyMjYsMjAyMjcsMjAyMjgsMjAyMjksMjAyMzAsMjAyMzEsMjAyMzIsMjAyMzUsMjAyMzYsMjAyNDIsMjAyNDMsMjAyNDQsMjAyNDUsMjAyNDYsMjAyNTIsMjAyNTMsMjAyNTcsMjAyNTksMjAyNjQsMjAyNjUsMjAyNjgsMjAyNjksMjAyNzAsMjAyNzMsMjAyNzUsMjAyNzcsMjAyNzksMjAyODEsMjAyODMsMjAyODYsMjAyODcsMjAyODgsMjAyODksMjAyOTAsMjAyOTIsMjAyOTMsMjAyOTUsMjAyOTYsMjAyOTcsMjAyOTgsMjAyOTksMjAzMDAsMjAzMDYsMjAzMDgsMjAzMTAsMjAzMjEsMjAzMjIsMjAzMjYsMjAzMjgsMjAzMzAsMjAzMzEsMjAzMzMsMjAzMzQsMjAzMzcsMjAzMzgsMjAzNDEsMjAzNDMsMjAzNDQsMjAzNDUsMjAzNDYsMjAzNDksMjAzNTIsMjAzNTMsMjAzNTQsMjAzNTcsMjAzNTgsMjAzNTksMjAzNjIsMjAzNjQsMjAzNjYsMjAzNjgsMjAzNzAsMjAzNzEsMjAzNzMsMjAzNzQsMjAzNzYsMjAzNzcsMjAzNzgsMjAzODAsMjAzODIsMjAzODMsMjAzODUsMjAzODYsMjAzODgsMjAzOTUsMjAzOTcsMjA0MDAsMjA0MDEsMjA0MDIsMjA0MDMsMjA0MDQsMjA0MDYsMjA0MDcsMjA0MDgsMjA0MDksMjA0MTAsMjA0MTEsMjA0MTIsMjA0MTMsMjA0MTQsMjA0MTYsMjA0MTcsMjA0MTgsMjA0MjIsMjA0MjMsMjA0MjQsMjA0MjUsMjA0MjcsMjA0MjgsMjA0MjksMjA0MzQsMjA0MzUsMjA0MzYsMjA0MzcsMjA0MzgsMjA0NDEsMjA0NDMsMjA0NDgsMjA0NTAsMjA0NTIsMjA0NTMsMjA0NTUsMjA0NTksMjA0NjAsMjA0NjQsMjA0NjYsMjA0NjgsMjA0NjksMjA0NzAsMjA0NzEsMjA0NzMsMjA0NzUsMjA0NzYsMjA0NzcsMjA0NzksMjA0ODAsMjA0ODEsMjA0ODIsMjA0ODMsMjA0ODQsMjA0ODUsMjA0ODYsMjA0ODcsMjA0ODgsMjA0ODksMjA0OTAsMjA0OTEsMjA0OTQsMjA0OTYsMjA0OTcsMjA0OTksMjA1MDEsMjA1MDIsMjA1MDMsMjA1MDcsMjA1MDksMjA1MTAsMjA1MTIsMjA1MTQsMjA1MTUsMjA1MTYsMjA1MTksMjA1MjMsMjA1MjcsMjA1MjgsMjA1MjksMjA1MzAsMjA1MzEsMjA1MzIsMjA1MzMsMjA1MzQsMjA1MzUsMjA1MzYsMjA1MzcsMjA1MzksMjA1NDEsMjA1NDMsMjA1NDQsMjA1NDUsMjA1NDYsMjA1NDgsMjA1NDksMjA1NTAsMjA1NTMsMjA1NTQsMjA1NTUsMjA1NTcsMjA1NjAsMjA1NjEsMjA1NjIsMjA1NjMsMjA1NjQsMjA1NjYsMjA1NjcsMjA1NjgsMjA1NjksMjA1NzEsMjA1NzMsMjA1NzQsMjA1NzUsMjA1NzYsMjA1NzcsMjA1NzgsMjA1NzksMjA1ODAsMjA1ODIsMjA1ODMsMjA1ODQsMjA1ODUsMjA1ODYsMjA1ODcsMjA1ODksMjA1OTAsMjA1OTEsMjA1OTIsMjA1OTMsMjA1OTQsMjA1OTUsMjA1OTYsMjA1OTcsMjA2MDAsMjA2MDEsMjA2MDIsMjA2MDQsMjA2MDUsMjA2MDksMjA2MTAsMjA2MTEsMjA2MTIsMjA2MTQsMjA2MTUsMjA2MTcsMjA2MTgsMjA2MTksMjA2MjAsMjA2MjIsMjA2MjMsMjA2MjQsMjA2MjUsMjA2MjYsMjA2MjcsMjA2MjgsMjA2MjksMjA2MzAsMjA2MzEsMjA2MzIsMjA2MzMsMjA2MzQsMjA2MzUsMjA2MzYsMjA2MzcsMjA2MzgsMjA2MzksMjA2NDAsMjA2NDEsMjA2NDIsMjA2NDQsMjA2NDYsMjA2NTAsMjA2NTEsMjA2NTMsMjA2NTQsMjA2NTUsMjA2NTYsMjA2NTcsMjA2NTksMjA2NjAsMjA2NjEsMjA2NjIsMjA2NjMsMjA2NjQsMjA2NjUsMjA2NjgsMjA2NjksMjA2NzAsMjA2NzEsMjA2NzIsMjA2NzMsMjA2NzQsMjA2NzUsMjA2NzYsMjA2NzcsMjA2NzgsMjA2NzksMjA2ODAsMjA2ODEsMjA2ODIsMjA2ODMsMjA2ODQsMjA2ODUsMjA2ODYsMjA2ODgsMjA2ODksMjA2OTAsMjA2OTEsMjA2OTIsMjA2OTMsMjA2OTUsMjA2OTYsMjA2OTcsMjA2OTksMjA3MDAsMjA3MDEsMjA3MDIsMjA3MDMsMjA3MDQsMjA3MDUsMjA3MDYsMjA3MDcsMjA3MDgsMjA3MDksMjA3MTIsMjA3MTMsMjA3MTQsMjA3MTUsMjA3MTksMjA3MjAsMjA3MjEsMjA3MjIsMjA3MjQsMjA3MjYsMjA3MjcsMjA3MjgsMjA3MjksMjA3MzAsMjA3MzIsMjA3MzMsMjA3MzQsMjA3MzUsMjA3MzYsMjA3MzcsMjA3MzgsMjA3MzksMjA3NDAsMjA3NDEsMjA3NDQsMjA3NDUsMjA3NDYsMjA3NDgsMjA3NDksMjA3NTAsMjA3NTEsMjA3NTIsMjA3NTMsMjA3NTUsMjA3NTYsMjA3NTcsMjA3NTgsMjA3NTksMjA3NjAsMjA3NjEsMjA3NjIsMjA3NjMsMjA3NjQsMjA3NjUsMjA3NjYsMjA3NjcsMjA3NjgsMjA3NzAsMjA3NzEsMjA3NzIsMjA3NzMsMjA3NzQsMjA3NzUsMjA3NzYsMjA3NzcsMjA3NzgsMjA3NzksMjA3ODAsMjA3ODEsMjA3ODIsMjA3ODMsMjA3ODQsMjA3ODUsMjA3ODYsMjA3ODcsMjA3ODgsMjA3ODksMjA3OTAsMjA3OTEsMjA3OTIsMjA3OTMsMjA3OTQsMjA3OTUsMjA3OTYsMjA3OTcsMjA3OTgsMjA4MDIsMjA4MDcsMjA4MTAsMjA4MTIsMjA4MTQsMjA4MTUsMjA4MTYsMjA4MTgsMjA4MTksMjA4MjMsMjA4MjQsMjA4MjUsMjA4MjcsMjA4MjksMjA4MzAsMjA4MzEsMjA4MzIsMjA4MzMsMjA4MzUsMjA4MzYsMjA4MzgsMjA4MzksMjA4NDEsMjA4NDIsMjA4NDcsMjA4NTAsMjA4NTgsMjA4NjIsMjA4NjMsMjA4NjcsMjA4NjgsMjA4NzAsMjA4NzEsMjA4NzQsMjA4NzUsMjA4NzgsMjA4NzksMjA4ODAsMjA4ODEsMjA4ODMsMjA4ODQsMjA4ODgsMjA4OTAsMjA4OTMsMjA4OTQsMjA4OTUsMjA4OTcsMjA4OTksMjA5MDIsMjA5MDMsMjA5MDQsMjA5MDUsMjA5MDYsMjA5MDksMjA5MTAsMjA5MTYsMjA5MjAsMjA5MjEsMjA5MjIsMjA5MjYsMjA5MjcsMjA5MjksMjA5MzAsMjA5MzEsMjA5MzMsMjA5MzYsMjA5MzgsMjA5NDEsMjA5NDIsMjA5NDQsMjA5NDYsMjA5NDcsMjA5NDgsMjA5NDksMjA5NTAsMjA5NTEsMjA5NTIsMjA5NTMsMjA5NTQsMjA5NTYsMjA5NTgsMjA5NTksMjA5NjIsMjA5NjMsMjA5NjUsMjA5NjYsMjA5NjcsMjA5NjgsMjA5NjksMjA5NzAsMjA5NzIsMjA5NzQsMjA5NzcsMjA5NzgsMjA5ODAsMjA5ODMsMjA5OTAsMjA5OTYsMjA5OTcsMjEwMDEsMjEwMDMsMjEwMDQsMjEwMDcsMjEwMDgsMjEwMTEsMjEwMTIsMjEwMTMsMjEwMjAsMjEwMjIsMjEwMjMsMjEwMjUsMjEwMjYsMjEwMjcsMjEwMjksMjEwMzAsMjEwMzEsMjEwMzQsMjEwMzYsMjEwMzksMjEwNDEsMjEwNDIsMjEwNDQsMjEwNDUsMjEwNTIsMjEwNTQsMjEwNjAsMjEwNjEsMjEwNjIsMjEwNjMsMjEwNjQsMjEwNjUsMjEwNjcsMjEwNzAsMjEwNzEsMjEwNzQsMjEwNzUsMjEwNzcsMjEwNzksMjEwODAsMjEwODEsMjEwODIsMjEwODMsMjEwODUsMjEwODcsMjEwODgsMjEwOTAsMjEwOTEsMjEwOTIsMjEwOTQsMjEwOTYsMjEwOTksMjExMDAsMjExMDEsMjExMDIsMjExMDQsMjExMDUsMjExMDcsMjExMDgsMjExMDksMjExMTAsMjExMTEsMjExMTIsMjExMTMsMjExMTQsMjExMTUsMjExMTYsMjExMTgsMjExMjAsMjExMjMsMjExMjQsMjExMjUsMjExMjYsMjExMjcsMjExMjksMjExMzAsMjExMzEsMjExMzIsMjExMzMsMjExMzQsMjExMzUsMjExMzcsMjExMzgsMjExNDAsMjExNDEsMjExNDIsMjExNDMsMjExNDQsMjExNDUsMjExNDYsMjExNDgsMjExNTYsMjExNTcsMjExNTgsMjExNTksMjExNjYsMjExNjcsMjExNjgsMjExNzIsMjExNzMsMjExNzQsMjExNzUsMjExNzYsMjExNzcsMjExNzgsMjExNzksMjExODAsMjExODEsMjExODQsMjExODUsMjExODYsMjExODgsMjExODksMjExOTAsMjExOTIsMjExOTQsMjExOTYsMjExOTcsMjExOTgsMjExOTksMjEyMDEsMjEyMDMsMjEyMDQsMjEyMDUsMjEyMDcsMjEyMDksMjEyMTAsMjEyMTEsMjEyMTIsMjEyMTMsMjEyMTQsMjEyMTYsMjEyMTcsMjEyMTgsMjEyMTksMjEyMjEsMjEyMjIsMjEyMjMsMjEyMjQsMjEyMjUsMjEyMjYsMjEyMjcsMjEyMjgsMjEyMjksMjEyMzAsMjEyMzEsMjEyMzMsMjEyMzQsMjEyMzUsMjEyMzYsMjEyMzcsMjEyMzgsMjEyMzksMjEyNDAsMjEyNDMsMjEyNDQsMjEyNDUsMjEyNDksMjEyNTAsMjEyNTEsMjEyNTIsMjEyNTUsMjEyNTcsMjEyNTgsMjEyNTksMjEyNjAsMjEyNjIsMjEyNjUsMjEyNjYsMjEyNjcsMjEyNjgsMjEyNzIsMjEyNzUsMjEyNzYsMjEyNzgsMjEyNzksMjEyODIsMjEyODQsMjEyODUsMjEyODcsMjEyODgsMjEyODksMjEyOTEsMjEyOTIsMjEyOTMsMjEyOTUsMjEyOTYsMjEyOTcsMjEyOTgsMjEyOTksMjEzMDAsMjEzMDEsMjEzMDIsMjEzMDMsMjEzMDQsMjEzMDgsMjEzMDksMjEzMTIsMjEzMTQsMjEzMTYsMjEzMTgsMjEzMjMsMjEzMjQsMjEzMjUsMjEzMjgsMjEzMzIsMjEzMzYsMjEzMzcsMjEzMzksMjEzNDEsMjEzNDksMjEzNTIsMjEzNTQsMjEzNTYsMjEzNTcsMjEzNjIsMjEzNjYsMjEzNjksMjEzNzEsMjEzNzIsMjEzNzMsMjEzNzQsMjEzNzYsMjEzNzcsMjEzNzksMjEzODMsMjEzODQsMjEzODYsMjEzOTAsMjEzOTEsMjEzOTIsMjEzOTMsMjEzOTQsMjEzOTUsMjEzOTYsMjEzOTgsMjEzOTksMjE0MDEsMjE0MDMsMjE0MDQsMjE0MDYsMjE0MDgsMjE0MDksMjE0MTIsMjE0MTUsMjE0MTgsMjE0MTksMjE0MjAsMjE0MjEsMjE0MjMsMjE0MjQsMjE0MjUsMjE0MjYsMjE0MjcsMjE0MjgsMjE0MjksMjE0MzEsMjE0MzIsMjE0MzMsMjE0MzQsMjE0MzYsMjE0MzcsMjE0MzgsMjE0NDAsMjE0NDMsMjE0NDQsMjE0NDUsMjE0NDYsMjE0NDcsMjE0NTQsMjE0NTUsMjE0NTYsMjE0NTgsMjE0NTksMjE0NjEsMjE0NjYsMjE0NjgsMjE0NjksMjE0NzAsMjE0NzMsMjE0NzQsMjE0NzksMjE0OTIsMjE0OTgsMjE1MDIsMjE1MDMsMjE1MDQsMjE1MDYsMjE1MDksMjE1MTEsMjE1MTUsMjE1MjQsMjE1MjgsMjE1MjksMjE1MzAsMjE1MzIsMjE1MzgsMjE1NDAsMjE1NDEsMjE1NDYsMjE1NTIsMjE1NTUsMjE1NTgsMjE1NTksMjE1NjIsMjE1NjUsMjE1NjcsMjE1NjksMjE1NzAsMjE1NzIsMjE1NzMsMjE1NzUsMjE1NzcsMjE1ODAsMjE1ODEsMjE1ODIsMjE1ODMsMjE1ODUsMjE1OTQsMjE1OTcsMjE1OTgsMjE1OTksMjE2MDAsMjE2MDEsMjE2MDMsMjE2MDUsMjE2MDcsMjE2MDksMjE2MTAsMjE2MTEsMjE2MTIsMjE2MTMsMjE2MTQsMjE2MTUsMjE2MTYsMjE2MjAsMjE2MjUsMjE2MjYsMjE2MzAsMjE2MzEsMjE2MzMsMjE2MzUsMjE2MzcsMjE2MzksMjE2NDAsMjE2NDEsMjE2NDIsMjE2NDUsMjE2NDksMjE2NTEsMjE2NTUsMjE2NTYsMjE2NjAsMjE2NjIsMjE2NjMsMjE2NjQsMjE2NjUsMjE2NjYsMjE2NjksMjE2NzgsMjE2ODAsMjE2ODIsMjE2ODUsMjE2ODYsMjE2ODcsMjE2ODksMjE2OTAsMjE2OTIsMjE2OTQsMjE2OTksMjE3MDEsMjE3MDYsMjE3MDcsMjE3MTgsMjE3MjAsMjE3MjMsMjE3MjgsMjE3MjksMjE3MzAsMjE3MzEsMjE3MzIsMjE3MzksMjE3NDAsMjE3NDMsMjE3NDQsMjE3NDUsMjE3NDgsMjE3NDksMjE3NTAsMjE3NTEsMjE3NTIsMjE3NTMsMjE3NTUsMjE3NTgsMjE3NjAsMjE3NjIsMjE3NjMsMjE3NjQsMjE3NjUsMjE3NjgsMjE3NzAsMjE3NzEsMjE3NzIsMjE3NzMsMjE3NzQsMjE3NzgsMjE3NzksMjE3ODEsMjE3ODIsMjE3ODMsMjE3ODQsMjE3ODUsMjE3ODYsMjE3ODgsMjE3ODksMjE3OTAsMjE3OTEsMjE3OTMsMjE3OTcsMjE3OTgsMjE4MDAsMjE4MDEsMjE4MDMsMjE4MDUsMjE4MTAsMjE4MTIsMjE4MTMsMjE4MTQsMjE4MTYsMjE4MTcsMjE4MTgsMjE4MTksMjE4MjEsMjE4MjQsMjE4MjYsMjE4MjksMjE4MzEsMjE4MzIsMjE4MzUsMjE4MzYsMjE4MzcsMjE4MzgsMjE4MzksMjE4NDEsMjE4NDIsMjE4NDMsMjE4NDQsMjE4NDcsMjE4NDgsMjE4NDksMjE4NTAsMjE4NTEsMjE4NTMsMjE4NTQsMjE4NTUsMjE4NTYsMjE4NTgsMjE4NTksMjE4NjQsMjE4NjUsMjE4NjcsMjE4NzEsMjE4NzIsMjE4NzMsMjE4NzQsMjE4NzUsMjE4NzYsMjE4ODEsMjE4ODIsMjE4ODUsMjE4ODcsMjE4OTMsMjE4OTQsMjE5MDAsMjE5MDEsMjE5MDIsMjE5MDQsMjE5MDYsMjE5MDcsMjE5MDksMjE5MTAsMjE5MTEsMjE5MTQsMjE5MTUsMjE5MTgsMjE5MjAsMjE5MjEsMjE5MjIsMjE5MjMsMjE5MjQsMjE5MjUsMjE5MjYsMjE5MjgsMjE5MjksMjE5MzAsMjE5MzEsMjE5MzIsMjE5MzMsMjE5MzQsMjE5MzUsMjE5MzYsMjE5MzgsMjE5NDAsMjE5NDIsMjE5NDQsMjE5NDYsMjE5NDgsMjE5NTEsMjE5NTIsMjE5NTMsMjE5NTQsMjE5NTUsMjE5NTgsMjE5NTksMjE5NjAsMjE5NjIsMjE5NjMsMjE5NjYsMjE5NjcsMjE5NjgsMjE5NzMsMjE5NzUsMjE5NzYsMjE5NzcsMjE5NzgsMjE5NzksMjE5ODIsMjE5ODQsMjE5ODYsMjE5OTEsMjE5OTMsMjE5OTcsMjE5OTgsMjIwMDAsMjIwMDEsMjIwMDQsMjIwMDYsMjIwMDgsMjIwMDksMjIwMTAsMjIwMTEsMjIwMTIsMjIwMTUsMjIwMTgsMjIwMTksMjIwMjAsMjIwMjEsMjIwMjIsMjIwMjMsMjIwMjYsMjIwMjcsMjIwMjksMjIwMzIsMjIwMzMsMjIwMzQsMjIwMzUsMjIwMzYsMjIwMzcsMjIwMzgsMjIwMzksMjIwNDEsMjIwNDIsMjIwNDQsMjIwNDUsMjIwNDgsMjIwNDksMjIwNTAsMjIwNTMsMjIwNTQsMjIwNTYsMjIwNTcsMjIwNTgsMjIwNTksMjIwNjIsMjIwNjMsMjIwNjQsMjIwNjcsMjIwNjksMjIwNzEsMjIwNzIsMjIwNzQsMjIwNzYsMjIwNzcsMjIwNzgsMjIwODAsMjIwODEsMjIwODIsMjIwODMsMjIwODQsMjIwODUsMjIwODYsMjIwODcsMjIwODgsMjIwODksMjIwOTAsMjIwOTEsMjIwOTUsMjIwOTYsMjIwOTcsMjIwOTgsMjIwOTksMjIxMDEsMjIxMDIsMjIxMDYsMjIxMDcsMjIxMDksMjIxMTAsMjIxMTEsMjIxMTIsMjIxMTMsMjIxMTUsMjIxMTcsMjIxMTgsMjIxMTksMjIxMjUsMjIxMjYsMjIxMjcsMjIxMjgsMjIxMzAsMjIxMzEsMjIxMzIsMjIxMzMsMjIxMzUsMjIxMzYsMjIxMzcsMjIxMzgsMjIxNDEsMjIxNDIsMjIxNDMsMjIxNDQsMjIxNDUsMjIxNDYsMjIxNDcsMjIxNDgsMjIxNTEsMjIxNTIsMjIxNTMsMjIxNTQsMjIxNTUsMjIxNTYsMjIxNTcsMjIxNjAsMjIxNjEsMjIxNjIsMjIxNjQsMjIxNjUsMjIxNjYsMjIxNjcsMjIxNjgsMjIxNjksMjIxNzAsMjIxNzEsMjIxNzIsMjIxNzMsMjIxNzQsMjIxNzUsMjIxNzYsMjIxNzcsMjIxNzgsMjIxODAsMjIxODEsMjIxODIsMjIxODMsMjIxODQsMjIxODUsMjIxODYsMjIxODcsMjIxODgsMjIxODksMjIxOTAsMjIxOTIsMjIxOTMsMjIxOTQsMjIxOTUsMjIxOTYsMjIxOTcsMjIxOTgsMjIyMDAsMjIyMDEsMjIyMDIsMjIyMDMsMjIyMDUsMjIyMDYsMjIyMDcsMjIyMDgsMjIyMDksMjIyMTAsMjIyMTEsMjIyMTIsMjIyMTMsMjIyMTQsMjIyMTUsMjIyMTYsMjIyMTcsMjIyMTksMjIyMjAsMjIyMjEsMjIyMjIsMjIyMjMsMjIyMjQsMjIyMjUsMjIyMjYsMjIyMjcsMjIyMjksMjIyMzAsMjIyMzIsMjIyMzMsMjIyMzYsMjIyNDMsMjIyNDUsMjIyNDYsMjIyNDcsMjIyNDgsMjIyNDksMjIyNTAsMjIyNTIsMjIyNTQsMjIyNTUsMjIyNTgsMjIyNTksMjIyNjIsMjIyNjMsMjIyNjQsMjIyNjcsMjIyNjgsMjIyNzIsMjIyNzMsMjIyNzQsMjIyNzcsMjIyNzksMjIyODMsMjIyODQsMjIyODUsMjIyODYsMjIyODcsMjIyODgsMjIyODksMjIyOTAsMjIyOTEsMjIyOTIsMjIyOTMsMjIyOTQsMjIyOTUsMjIyOTYsMjIyOTcsMjIyOTgsMjIyOTksMjIzMDEsMjIzMDIsMjIzMDQsMjIzMDUsMjIzMDYsMjIzMDgsMjIzMDksMjIzMTAsMjIzMTEsMjIzMTUsMjIzMjEsMjIzMjIsMjIzMjQsMjIzMjUsMjIzMjYsMjIzMjcsMjIzMjgsMjIzMzIsMjIzMzMsMjIzMzUsMjIzMzcsMjIzMzksMjIzNDAsMjIzNDEsMjIzNDIsMjIzNDQsMjIzNDUsMjIzNDcsMjIzNTQsMjIzNTUsMjIzNTYsMjIzNTcsMjIzNTgsMjIzNjAsMjIzNjEsMjIzNzAsMjIzNzEsMjIzNzMsMjIzNzUsMjIzODAsMjIzODIsMjIzODQsMjIzODUsMjIzODYsMjIzODgsMjIzODksMjIzOTIsMjIzOTMsMjIzOTQsMjIzOTcsMjIzOTgsMjIzOTksMjI0MDAsMjI0MDEsMjI0MDcsMjI0MDgsMjI0MDksMjI0MTAsMjI0MTMsMjI0MTQsMjI0MTUsMjI0MTYsMjI0MTcsMjI0MjAsMjI0MjEsMjI0MjIsMjI0MjMsMjI0MjQsMjI0MjUsMjI0MjYsMjI0MjgsMjI0MjksMjI0MzAsMjI0MzEsMjI0MzcsMjI0NDAsMjI0NDIsMjI0NDQsMjI0NDcsMjI0NDgsMjI0NDksMjI0NTEsMjI0NTMsMjI0NTQsMjI0NTUsMjI0NTcsMjI0NTgsMjI0NTksMjI0NjAsMjI0NjEsMjI0NjIsMjI0NjMsMjI0NjQsMjI0NjUsMjI0NjgsMjI0NjksMjI0NzAsMjI0NzEsMjI0NzIsMjI0NzMsMjI0NzQsMjI0NzYsMjI0NzcsMjI0ODAsMjI0ODEsMjI0ODMsMjI0ODYsMjI0ODcsMjI0OTEsMjI0OTIsMjI0OTQsMjI0OTcsMjI0OTgsMjI0OTksMjI1MDEsMjI1MDIsMjI1MDMsMjI1MDQsMjI1MDUsMjI1MDYsMjI1MDcsMjI1MDgsMjI1MTAsMjI1MTIsMjI1MTMsMjI1MTQsMjI1MTUsMjI1MTcsMjI1MTgsMjI1MTksMjI1MjMsMjI1MjQsMjI1MjYsMjI1MjcsMjI1MjksMjI1MzEsMjI1MzIsMjI1MzMsMjI1MzYsMjI1MzcsMjI1MzgsMjI1NDAsMjI1NDIsMjI1NDMsMjI1NDQsMjI1NDYsMjI1NDcsMjI1NDgsMjI1NTAsMjI1NTEsMjI1NTIsMjI1NTQsMjI1NTUsMjI1NTYsMjI1NTcsMjI1NTksMjI1NjIsMjI1NjMsMjI1NjUsMjI1NjYsMjI1NjcsMjI1NjgsMjI1NjksMjI1NzEsMjI1NzIsMjI1NzMsMjI1NzQsMjI1NzUsMjI1NzcsMjI1NzgsMjI1NzksMjI1ODAsMjI1ODIsMjI1ODMsMjI1ODQsMjI1ODUsMjI1ODYsMjI1ODcsMjI1ODgsMjI1ODksMjI1OTAsMjI1OTEsMjI1OTIsMjI1OTMsMjI1OTQsMjI1OTUsMjI1OTcsMjI1OTgsMjI1OTksMjI2MDAsMjI2MDEsMjI2MDIsMjI2MDMsMjI2MDYsMjI2MDcsMjI2MDgsMjI2MTAsMjI2MTEsMjI2MTMsMjI2MTQsMjI2MTUsMjI2MTcsMjI2MTgsMjI2MTksMjI2MjAsMjI2MjEsMjI2MjMsMjI2MjQsMjI2MjUsMjI2MjYsMjI2MjcsMjI2MjgsMjI2MzAsMjI2MzEsMjI2MzIsMjI2MzMsMjI2MzQsMjI2MzcsMjI2MzgsMjI2MzksMjI2NDAsMjI2NDEsMjI2NDIsMjI2NDMsMjI2NDQsMjI2NDUsMjI2NDYsMjI2NDcsMjI2NDgsMjI2NDksMjI2NTAsMjI2NTEsMjI2NTIsMjI2NTMsMjI2NTUsMjI2NTgsMjI2NjAsMjI2NjIsMjI2NjMsMjI2NjQsMjI2NjYsMjI2NjcsMjI2NjgsMjI2NjksMjI2NzAsMjI2NzEsMjI2NzIsMjI2NzMsMjI2NzYsMjI2NzcsMjI2NzgsMjI2NzksMjI2ODAsMjI2ODMsMjI2ODQsMjI2ODUsMjI2ODgsMjI2ODksMjI2OTAsMjI2OTEsMjI2OTIsMjI2OTMsMjI2OTQsMjI2OTUsMjI2OTgsMjI2OTksMjI3MDAsMjI3MDEsMjI3MDIsMjI3MDMsMjI3MDQsMjI3MDUsMjI3MDYsMjI3MDcsMjI3MDgsMjI3MDksMjI3MTAsMjI3MTEsMjI3MTIsMjI3MTMsMjI3MTQsMjI3MTUsMjI3MTcsMjI3MTgsMjI3MTksMjI3MjAsMjI3MjIsMjI3MjMsMjI3MjQsMjI3MjYsMjI3MjcsMjI3MjgsMjI3MjksMjI3MzAsMjI3MzEsMjI3MzIsMjI3MzMsMjI3MzQsMjI3MzUsMjI3MzYsMjI3MzgsMjI3MzksMjI3NDAsMjI3NDIsMjI3NDMsMjI3NDQsMjI3NDUsMjI3NDYsMjI3NDcsMjI3NDgsMjI3NDksMjI3NTAsMjI3NTEsMjI3NTIsMjI3NTMsMjI3NTQsMjI3NTUsMjI3NTcsMjI3NTgsMjI3NTksMjI3NjAsMjI3NjEsMjI3NjIsMjI3NjUsMjI3NjcsMjI3NjksMjI3NzAsMjI3NzIsMjI3NzMsMjI3NzUsMjI3NzYsMjI3NzgsMjI3NzksMjI3ODAsMjI3ODEsMjI3ODIsMjI3ODMsMjI3ODQsMjI3ODUsMjI3ODcsMjI3ODksMjI3OTAsMjI3OTIsMjI3OTMsMjI3OTQsMjI3OTUsMjI3OTYsMjI3OTgsMjI4MDAsMjI4MDEsMjI4MDIsMjI4MDMsMjI4MDcsMjI4MDgsMjI4MTEsMjI4MTMsMjI4MTQsMjI4MTYsMjI4MTcsMjI4MTgsMjI4MTksMjI4MjIsMjI4MjQsMjI4MjgsMjI4MzIsMjI4MzQsMjI4MzUsMjI4MzcsMjI4MzgsMjI4NDMsMjI4NDUsMjI4NDYsMjI4NDcsMjI4NDgsMjI4NTEsMjI4NTMsMjI4NTQsMjI4NTgsMjI4NjAsMjI4NjEsMjI4NjQsMjI4NjYsMjI4NjcsMjI4NzMsMjI4NzUsMjI4NzYsMjI4NzcsMjI4NzgsMjI4NzksMjI4ODEsMjI4ODMsMjI4ODQsMjI4ODYsMjI4ODcsMjI4ODgsMjI4ODksMjI4OTAsMjI4OTEsMjI4OTIsMjI4OTMsMjI4OTQsMjI4OTUsMjI4OTYsMjI4OTcsMjI4OTgsMjI5MDEsMjI5MDMsMjI5MDYsMjI5MDcsMjI5MDgsMjI5MTAsMjI5MTEsMjI5MTIsMjI5MTcsMjI5MjEsMjI5MjMsMjI5MjQsMjI5MjYsMjI5MjcsMjI5MjgsMjI5MjksMjI5MzIsMjI5MzMsMjI5MzYsMjI5MzgsMjI5MzksMjI5NDAsMjI5NDEsMjI5NDMsMjI5NDQsMjI5NDUsMjI5NDYsMjI5NTAsMjI5NTEsMjI5NTYsMjI5NTcsMjI5NjAsMjI5NjEsMjI5NjMsMjI5NjQsMjI5NjUsMjI5NjYsMjI5NjcsMjI5NjgsMjI5NzAsMjI5NzIsMjI5NzMsMjI5NzUsMjI5NzYsMjI5NzcsMjI5NzgsMjI5NzksMjI5ODAsMjI5ODEsMjI5ODMsMjI5ODQsMjI5ODUsMjI5ODgsMjI5ODksMjI5OTAsMjI5OTEsMjI5OTcsMjI5OTgsMjMwMDEsMjMwMDMsMjMwMDYsMjMwMDcsMjMwMDgsMjMwMDksMjMwMTAsMjMwMTIsMjMwMTQsMjMwMTUsMjMwMTcsMjMwMTgsMjMwMTksMjMwMjEsMjMwMjIsMjMwMjMsMjMwMjQsMjMwMjUsMjMwMjYsMjMwMjcsMjMwMjgsMjMwMjksMjMwMzAsMjMwMzEsMjMwMzIsMjMwMzQsMjMwMzYsMjMwMzcsMjMwMzgsMjMwNDAsMjMwNDIsMjMwNTAsMjMwNTEsMjMwNTMsMjMwNTQsMjMwNTUsMjMwNTYsMjMwNTgsMjMwNjAsMjMwNjEsMjMwNjIsMjMwNjMsMjMwNjUsMjMwNjYsMjMwNjcsMjMwNjksMjMwNzAsMjMwNzMsMjMwNzQsMjMwNzYsMjMwNzgsMjMwNzksMjMwODAsMjMwODIsMjMwODMsMjMwODQsMjMwODUsMjMwODYsMjMwODcsMjMwODgsMjMwOTEsMjMwOTMsMjMwOTUsMjMwOTYsMjMwOTcsMjMwOTgsMjMwOTksMjMxMDEsMjMxMDIsMjMxMDMsMjMxMDUsMjMxMDYsMjMxMDcsMjMxMDgsMjMxMDksMjMxMTEsMjMxMTIsMjMxMTUsMjMxMTYsMjMxMTcsMjMxMTgsMjMxMTksMjMxMjAsMjMxMjEsMjMxMjIsMjMxMjMsMjMxMjQsMjMxMjYsMjMxMjcsMjMxMjgsMjMxMjksMjMxMzEsMjMxMzIsMjMxMzMsMjMxMzQsMjMxMzUsMjMxMzYsMjMxMzcsMjMxMzksMjMxNDAsMjMxNDEsMjMxNDIsMjMxNDQsMjMxNDUsMjMxNDcsMjMxNDgsMjMxNDksMjMxNTAsMjMxNTEsMjMxNTIsMjMxNTMsMjMxNTQsMjMxNTUsMjMxNjAsMjMxNjEsMjMxNjMsMjMxNjQsMjMxNjUsMjMxNjYsMjMxNjgsMjMxNjksMjMxNzAsMjMxNzEsMjMxNzIsMjMxNzMsMjMxNzQsMjMxNzUsMjMxNzYsMjMxNzcsMjMxNzgsMjMxNzksMjMxODAsMjMxODEsMjMxODIsMjMxODMsMjMxODQsMjMxODUsMjMxODcsMjMxODgsMjMxODksMjMxOTAsMjMxOTEsMjMxOTIsMjMxOTMsMjMxOTYsMjMxOTcsMjMxOTgsMjMxOTksMjMyMDAsMjMyMDEsMjMyMDIsMjMyMDMsMjMyMDQsMjMyMDUsMjMyMDYsMjMyMDcsMjMyMDgsMjMyMDksMjMyMTEsMjMyMTIsMjMyMTMsMjMyMTQsMjMyMTUsMjMyMTYsMjMyMTcsMjMyMjAsMjMyMjIsMjMyMjMsMjMyMjUsMjMyMjYsMjMyMjcsMjMyMjgsMjMyMjksMjMyMzEsMjMyMzIsMjMyMzUsMjMyMzYsMjMyMzcsMjMyMzgsMjMyMzksMjMyNDAsMjMyNDIsMjMyNDMsMjMyNDUsMjMyNDYsMjMyNDcsMjMyNDgsMjMyNDksMjMyNTEsMjMyNTMsMjMyNTUsMjMyNTcsMjMyNTgsMjMyNTksMjMyNjEsMjMyNjIsMjMyNjMsMjMyNjYsMjMyNjgsMjMyNjksMjMyNzEsMjMyNzIsMjMyNzQsMjMyNzYsMjMyNzcsMjMyNzgsMjMyNzksMjMyODAsMjMyODIsMjMyODMsMjMyODQsMjMyODUsMjMyODYsMjMyODcsMjMyODgsMjMyODksMjMyOTAsMjMyOTEsMjMyOTIsMjMyOTMsMjMyOTQsMjMyOTUsMjMyOTYsMjMyOTcsMjMyOTgsMjMyOTksMjMzMDAsMjMzMDEsMjMzMDIsMjMzMDMsMjMzMDQsMjMzMDYsMjMzMDcsMjMzMDgsMjMzMDksMjMzMTAsMjMzMTEsMjMzMTIsMjMzMTMsMjMzMTQsMjMzMTUsMjMzMTYsMjMzMTcsMjMzMjAsMjMzMjEsMjMzMjIsMjMzMjMsMjMzMjQsMjMzMjUsMjMzMjYsMjMzMjcsMjMzMjgsMjMzMjksMjMzMzAsMjMzMzEsMjMzMzIsMjMzMzMsMjMzMzQsMjMzMzUsMjMzMzYsMjMzMzcsMjMzMzgsMjMzMzksMjMzNDAsMjMzNDEsMjMzNDIsMjMzNDMsMjMzNDQsMjMzNDUsMjMzNDcsMjMzNDksMjMzNTAsMjMzNTIsMjMzNTMsMjMzNTQsMjMzNTUsMjMzNTYsMjMzNTcsMjMzNTgsMjMzNTksMjMzNjEsMjMzNjIsMjMzNjMsMjMzNjQsMjMzNjUsMjMzNjYsMjMzNjcsMjMzNjgsMjMzNjksMjMzNzAsMjMzNzEsMjMzNzIsMjMzNzMsMjMzNzQsMjMzNzUsMjMzNzgsMjMzODIsMjMzOTAsMjMzOTIsMjMzOTMsMjMzOTksMjM0MDAsMjM0MDMsMjM0MDUsMjM0MDYsMjM0MDcsMjM0MTAsMjM0MTIsMjM0MTQsMjM0MTUsMjM0MTYsMjM0MTcsMjM0MTksMjM0MjAsMjM0MjIsMjM0MjMsMjM0MjYsMjM0MzAsMjM0MzQsMjM0MzcsMjM0MzgsMjM0NDAsMjM0NDEsMjM0NDIsMjM0NDQsMjM0NDYsMjM0NTUsMjM0NjMsMjM0NjQsMjM0NjUsMjM0NjgsMjM0NjksMjM0NzAsMjM0NzEsMjM0NzMsMjM0NzQsMjM0NzksMjM0ODIsMjM0ODMsMjM0ODQsMjM0ODgsMjM0ODksMjM0OTEsMjM0OTYsMjM0OTcsMjM0OTgsMjM0OTksMjM1MDEsMjM1MDIsMjM1MDMsMjM1MDUsMjM1MDgsMjM1MDksMjM1MTAsMjM1MTEsMjM1MTIsMjM1MTMsMjM1MTQsMjM1MTUsMjM1MTYsMjM1MjAsMjM1MjIsMjM1MjMsMjM1MjYsMjM1MjcsMjM1MjksMjM1MzAsMjM1MzEsMjM1MzIsMjM1MzMsMjM1MzUsMjM1MzcsMjM1MzgsMjM1MzksMjM1NDAsMjM1NDEsMjM1NDIsMjM1NDMsMjM1NDksMjM1NTAsMjM1NTIsMjM1NTQsMjM1NTUsMjM1NTcsMjM1NTksMjM1NjAsMjM1NjMsMjM1NjQsMjM1NjUsMjM1NjYsMjM1NjgsMjM1NzAsMjM1NzEsMjM1NzUsMjM1NzcsMjM1NzksMjM1ODIsMjM1ODMsMjM1ODQsMjM1ODUsMjM1ODcsMjM1OTAsMjM1OTIsMjM1OTMsMjM1OTQsMjM1OTUsMjM1OTcsMjM1OTgsMjM1OTksMjM2MDAsMjM2MDIsMjM2MDMsMjM2MDUsMjM2MDYsMjM2MDcsMjM2MTksMjM2MjAsMjM2MjIsMjM2MjMsMjM2MjgsMjM2MjksMjM2MzQsMjM2MzUsMjM2MzYsMjM2MzgsMjM2MzksMjM2NDAsMjM2NDIsMjM2NDMsMjM2NDQsMjM2NDUsMjM2NDcsMjM2NTAsMjM2NTIsMjM2NTUsMjM2NTYsMjM2NTcsMjM2NTgsMjM2NTksMjM2NjAsMjM2NjEsMjM2NjQsMjM2NjYsMjM2NjcsMjM2NjgsMjM2NjksMjM2NzAsMjM2NzEsMjM2NzIsMjM2NzUsMjM2NzYsMjM2NzcsMjM2NzgsMjM2ODAsMjM2ODMsMjM2ODQsMjM2ODUsMjM2ODYsMjM2ODcsMjM2ODksMjM2OTAsMjM2OTEsMjM2OTQsMjM2OTUsMjM2OTgsMjM2OTksMjM3MDEsMjM3MDksMjM3MTAsMjM3MTEsMjM3MTIsMjM3MTMsMjM3MTYsMjM3MTcsMjM3MTgsMjM3MTksMjM3MjAsMjM3MjIsMjM3MjYsMjM3MjcsMjM3MjgsMjM3MzAsMjM3MzIsMjM3MzQsMjM3MzcsMjM3MzgsMjM3MzksMjM3NDAsMjM3NDIsMjM3NDQsMjM3NDYsMjM3NDcsMjM3NDksMjM3NTAsMjM3NTEsMjM3NTIsMjM3NTMsMjM3NTQsMjM3NTYsMjM3NTcsMjM3NTgsMjM3NTksMjM3NjAsMjM3NjEsMjM3NjMsMjM3NjQsMjM3NjUsMjM3NjYsMjM3NjcsMjM3NjgsMjM3NzAsMjM3NzEsMjM3NzIsMjM3NzMsMjM3NzQsMjM3NzUsMjM3NzYsMjM3NzgsMjM3NzksMjM3ODMsMjM3ODUsMjM3ODcsMjM3ODgsMjM3OTAsMjM3OTEsMjM3OTMsMjM3OTQsMjM3OTUsMjM3OTYsMjM3OTcsMjM3OTgsMjM3OTksMjM4MDAsMjM4MDEsMjM4MDIsMjM4MDQsMjM4MDUsMjM4MDYsMjM4MDcsMjM4MDgsMjM4MDksMjM4MTIsMjM4MTMsMjM4MTYsMjM4MTcsMjM4MTgsMjM4MTksMjM4MjAsMjM4MjEsMjM4MjMsMjM4MjQsMjM4MjUsMjM4MjYsMjM4MjcsMjM4MjksMjM4MzEsMjM4MzIsMjM4MzMsMjM4MzQsMjM4MzYsMjM4MzcsMjM4MzksMjM4NDAsMjM4NDEsMjM4NDIsMjM4NDMsMjM4NDUsMjM4NDgsMjM4NTAsMjM4NTEsMjM4NTIsMjM4NTUsMjM4NTYsMjM4NTcsMjM4NTgsMjM4NTksMjM4NjEsMjM4NjIsMjM4NjMsMjM4NjQsMjM4NjUsMjM4NjYsMjM4NjcsMjM4NjgsMjM4NzEsMjM4NzIsMjM4NzMsMjM4NzQsMjM4NzUsMjM4NzYsMjM4NzcsMjM4NzgsMjM4ODAsMjM4ODEsMjM4ODUsMjM4ODYsMjM4ODcsMjM4ODgsMjM4ODksMjM4OTAsMjM4OTEsMjM4OTIsMjM4OTMsMjM4OTQsMjM4OTUsMjM4OTcsMjM4OTgsMjM5MDAsMjM5MDIsMjM5MDMsMjM5MDQsMjM5MDUsMjM5MDYsMjM5MDcsMjM5MDgsMjM5MDksMjM5MTAsMjM5MTEsMjM5MTIsMjM5MTQsMjM5MTcsMjM5MTgsMjM5MjAsMjM5MjEsMjM5MjIsMjM5MjMsMjM5MjUsMjM5MjYsMjM5MjcsMjM5MjgsMjM5MjksMjM5MzAsMjM5MzEsMjM5MzIsMjM5MzMsMjM5MzQsMjM5MzUsMjM5MzYsMjM5MzcsMjM5MzksMjM5NDAsMjM5NDEsMjM5NDIsMjM5NDMsMjM5NDQsMjM5NDUsMjM5NDYsMjM5NDcsMjM5NDgsMjM5NDksMjM5NTAsMjM5NTEsMjM5NTIsMjM5NTMsMjM5NTQsMjM5NTUsMjM5NTYsMjM5NTcsMjM5NTgsMjM5NTksMjM5NjAsMjM5NjIsMjM5NjMsMjM5NjQsMjM5NjYsMjM5NjcsMjM5NjgsMjM5NjksMjM5NzAsMjM5NzEsMjM5NzIsMjM5NzMsMjM5NzQsMjM5NzUsMjM5NzYsMjM5NzcsMjM5NzgsMjM5NzksMjM5ODAsMjM5ODEsMjM5ODIsMjM5ODMsMjM5ODQsMjM5ODUsMjM5ODYsMjM5ODcsMjM5ODgsMjM5ODksMjM5OTAsMjM5OTIsMjM5OTMsMjM5OTQsMjM5OTUsMjM5OTYsMjM5OTcsMjM5OTgsMjM5OTksMjQwMDAsMjQwMDEsMjQwMDIsMjQwMDMsMjQwMDQsMjQwMDYsMjQwMDcsMjQwMDgsMjQwMDksMjQwMTAsMjQwMTEsMjQwMTIsMjQwMTQsMjQwMTUsMjQwMTYsMjQwMTcsMjQwMTgsMjQwMTksMjQwMjAsMjQwMjEsMjQwMjIsMjQwMjMsMjQwMjQsMjQwMjUsMjQwMjYsMjQwMjgsMjQwMzEsMjQwMzIsMjQwMzUsMjQwMzYsMjQwNDIsMjQwNDQsMjQwNDUsMjQwNDgsMjQwNTMsMjQwNTQsMjQwNTYsMjQwNTcsMjQwNTgsMjQwNTksMjQwNjAsMjQwNjMsMjQwNjQsMjQwNjgsMjQwNzEsMjQwNzMsMjQwNzQsMjQwNzUsMjQwNzcsMjQwNzgsMjQwODIsMjQwODMsMjQwODcsMjQwOTQsMjQwOTUsMjQwOTYsMjQwOTcsMjQwOTgsMjQwOTksMjQxMDAsMjQxMDEsMjQxMDQsMjQxMDUsMjQxMDYsMjQxMDcsMjQxMDgsMjQxMTEsMjQxMTIsMjQxMTQsMjQxMTUsMjQxMTYsMjQxMTcsMjQxMTgsMjQxMjEsMjQxMjIsMjQxMjYsMjQxMjcsMjQxMjgsMjQxMjksMjQxMzEsMjQxMzQsMjQxMzUsMjQxMzYsMjQxMzcsMjQxMzgsMjQxMzksMjQxNDEsMjQxNDIsMjQxNDMsMjQxNDQsMjQxNDUsMjQxNDYsMjQxNDcsMjQxNTAsMjQxNTEsMjQxNTIsMjQxNTMsMjQxNTQsMjQxNTYsMjQxNTcsMjQxNTksMjQxNjAsMjQxNjMsMjQxNjQsMjQxNjUsMjQxNjYsMjQxNjcsMjQxNjgsMjQxNjksMjQxNzAsMjQxNzEsMjQxNzIsMjQxNzMsMjQxNzQsMjQxNzUsMjQxNzYsMjQxNzcsMjQxODEsMjQxODMsMjQxODUsMjQxOTAsMjQxOTMsMjQxOTQsMjQxOTUsMjQxOTcsMjQyMDAsMjQyMDEsMjQyMDQsMjQyMDUsMjQyMDYsMjQyMTAsMjQyMTYsMjQyMTksMjQyMjEsMjQyMjUsMjQyMjYsMjQyMjcsMjQyMjgsMjQyMzIsMjQyMzMsMjQyMzQsMjQyMzUsMjQyMzYsMjQyMzgsMjQyMzksMjQyNDAsMjQyNDEsMjQyNDIsMjQyNDQsMjQyNTAsMjQyNTEsMjQyNTIsMjQyNTMsMjQyNTUsMjQyNTYsMjQyNTcsMjQyNTgsMjQyNTksMjQyNjAsMjQyNjEsMjQyNjIsMjQyNjMsMjQyNjQsMjQyNjcsMjQyNjgsMjQyNjksMjQyNzAsMjQyNzEsMjQyNzIsMjQyNzYsMjQyNzcsMjQyNzksMjQyODAsMjQyODEsMjQyODIsMjQyODQsMjQyODUsMjQyODYsMjQyODcsMjQyODgsMjQyODksMjQyOTAsMjQyOTEsMjQyOTIsMjQyOTMsMjQyOTQsMjQyOTUsMjQyOTcsMjQyOTksMjQzMDAsMjQzMDEsMjQzMDIsMjQzMDMsMjQzMDQsMjQzMDUsMjQzMDYsMjQzMDcsMjQzMDksMjQzMTIsMjQzMTMsMjQzMTUsMjQzMTYsMjQzMTcsMjQzMjUsMjQzMjYsMjQzMjcsMjQzMjksMjQzMzIsMjQzMzMsMjQzMzQsMjQzMzYsMjQzMzgsMjQzNDAsMjQzNDIsMjQzNDUsMjQzNDYsMjQzNDgsMjQzNDksMjQzNTAsMjQzNTMsMjQzNTQsMjQzNTUsMjQzNTYsMjQzNjAsMjQzNjMsMjQzNjQsMjQzNjYsMjQzNjgsMjQzNzAsMjQzNzEsMjQzNzIsMjQzNzMsMjQzNzQsMjQzNzUsMjQzNzYsMjQzNzksMjQzODEsMjQzODIsMjQzODMsMjQzODUsMjQzODYsMjQzODcsMjQzODgsMjQzODksMjQzOTAsMjQzOTEsMjQzOTIsMjQzOTMsMjQzOTQsMjQzOTUsMjQzOTYsMjQzOTcsMjQzOTgsMjQzOTksMjQ0MDEsMjQ0MDQsMjQ0MDksMjQ0MTAsMjQ0MTEsMjQ0MTIsMjQ0MTQsMjQ0MTUsMjQ0MTYsMjQ0MTksMjQ0MjEsMjQ0MjMsMjQ0MjQsMjQ0MjcsMjQ0MzAsMjQ0MzEsMjQ0MzQsMjQ0MzYsMjQ0MzcsMjQ0MzgsMjQ0NDAsMjQ0NDIsMjQ0NDUsMjQ0NDYsMjQ0NDcsMjQ0NTEsMjQ0NTQsMjQ0NjEsMjQ0NjIsMjQ0NjMsMjQ0NjUsMjQ0NjcsMjQ0NjgsMjQ0NzAsMjQ0NzQsMjQ0NzUsMjQ0NzcsMjQ0NzgsMjQ0NzksMjQ0ODAsMjQ0ODIsMjQ0ODMsMjQ0ODQsMjQ0ODUsMjQ0ODYsMjQ0ODcsMjQ0ODksMjQ0OTEsMjQ0OTIsMjQ0OTUsMjQ0OTYsMjQ0OTcsMjQ0OTgsMjQ0OTksMjQ1MDAsMjQ1MDIsMjQ1MDQsMjQ1MDUsMjQ1MDYsMjQ1MDcsMjQ1MTAsMjQ1MTEsMjQ1MTIsMjQ1MTMsMjQ1MTQsMjQ1MTksMjQ1MjAsMjQ1MjIsMjQ1MjMsMjQ1MjYsMjQ1MzEsMjQ1MzIsMjQ1MzMsMjQ1MzgsMjQ1MzksMjQ1NDAsMjQ1NDIsMjQ1NDMsMjQ1NDYsMjQ1NDcsMjQ1NDksMjQ1NTAsMjQ1NTIsMjQ1NTMsMjQ1NTYsMjQ1NTksMjQ1NjAsMjQ1NjIsMjQ1NjMsMjQ1NjQsMjQ1NjYsMjQ1NjcsMjQ1NjksMjQ1NzAsMjQ1NzIsMjQ1ODMsMjQ1ODQsMjQ1ODUsMjQ1ODcsMjQ1ODgsMjQ1OTIsMjQ1OTMsMjQ1OTUsMjQ1OTksMjQ2MDAsMjQ2MDIsMjQ2MDYsMjQ2MDcsMjQ2MTAsMjQ2MTEsMjQ2MTIsMjQ2MjAsMjQ2MjEsMjQ2MjIsMjQ2MjQsMjQ2MjUsMjQ2MjYsMjQ2MjcsMjQ2MjgsMjQ2MzAsMjQ2MzEsMjQ2MzIsMjQ2MzMsMjQ2MzQsMjQ2MzcsMjQ2MzgsMjQ2NDAsMjQ2NDQsMjQ2NDUsMjQ2NDYsMjQ2NDcsMjQ2NDgsMjQ2NDksMjQ2NTAsMjQ2NTIsMjQ2NTQsMjQ2NTUsMjQ2NTcsMjQ2NTksMjQ2NjAsMjQ2NjIsMjQ2NjMsMjQ2NjQsMjQ2NjcsMjQ2NjgsMjQ2NzAsMjQ2NzEsMjQ2NzIsMjQ2NzMsMjQ2NzcsMjQ2NzgsMjQ2ODYsMjQ2ODksMjQ2OTAsMjQ2OTIsMjQ2OTMsMjQ2OTUsMjQ3MDIsMjQ3MDQsMjQ3MDUsMjQ3MDYsMjQ3MDksMjQ3MTAsMjQ3MTEsMjQ3MTIsMjQ3MTQsMjQ3MTUsMjQ3MTgsMjQ3MTksMjQ3MjAsMjQ3MjEsMjQ3MjMsMjQ3MjUsMjQ3MjcsMjQ3MjgsMjQ3MjksMjQ3MzIsMjQ3MzQsMjQ3MzcsMjQ3MzgsMjQ3NDAsMjQ3NDEsMjQ3NDMsMjQ3NDUsMjQ3NDYsMjQ3NTAsMjQ3NTIsMjQ3NTUsMjQ3NTcsMjQ3NTgsMjQ3NTksMjQ3NjEsMjQ3NjIsMjQ3NjUsMjQ3NjYsMjQ3NjcsMjQ3NjgsMjQ3NjksMjQ3NzAsMjQ3NzEsMjQ3NzIsMjQ3NzUsMjQ3NzYsMjQ3NzcsMjQ3ODAsMjQ3ODEsMjQ3ODIsMjQ3ODMsMjQ3ODQsMjQ3ODYsMjQ3ODcsMjQ3ODgsMjQ3OTAsMjQ3OTEsMjQ3OTMsMjQ3OTUsMjQ3OTgsMjQ4MDEsMjQ4MDIsMjQ4MDMsMjQ4MDQsMjQ4MDUsMjQ4MTAsMjQ4MTcsMjQ4MTgsMjQ4MjEsMjQ4MjMsMjQ4MjQsMjQ4MjcsMjQ4MjgsMjQ4MjksMjQ4MzAsMjQ4MzEsMjQ4MzQsMjQ4MzUsMjQ4MzYsMjQ4MzcsMjQ4MzksMjQ4NDIsMjQ4NDMsMjQ4NDQsMjQ4NDgsMjQ4NDksMjQ4NTAsMjQ4NTEsMjQ4NTIsMjQ4NTQsMjQ4NTUsMjQ4NTYsMjQ4NTcsMjQ4NTksMjQ4NjAsMjQ4NjEsMjQ4NjIsMjQ4NjUsMjQ4NjYsMjQ4NjksMjQ4NzIsMjQ4NzMsMjQ4NzQsMjQ4NzYsMjQ4NzcsMjQ4NzgsMjQ4NzksMjQ4ODAsMjQ4ODEsMjQ4ODIsMjQ4ODMsMjQ4ODQsMjQ4ODUsMjQ4ODYsMjQ4ODcsMjQ4ODgsMjQ4ODksMjQ4OTAsMjQ4OTEsMjQ4OTIsMjQ4OTMsMjQ4OTQsMjQ4OTYsMjQ4OTcsMjQ4OTgsMjQ4OTksMjQ5MDAsMjQ5MDEsMjQ5MDIsMjQ5MDMsMjQ5MDUsMjQ5MDcsMjQ5MDksMjQ5MTEsMjQ5MTIsMjQ5MTQsMjQ5MTUsMjQ5MTYsMjQ5MTgsMjQ5MTksMjQ5MjAsMjQ5MjEsMjQ5MjIsMjQ5MjMsMjQ5MjQsMjQ5MjYsMjQ5MjcsMjQ5MjgsMjQ5MjksMjQ5MzEsMjQ5MzIsMjQ5MzMsMjQ5MzQsMjQ5MzcsMjQ5MzgsMjQ5MzksMjQ5NDAsMjQ5NDEsMjQ5NDIsMjQ5NDMsMjQ5NDUsMjQ5NDYsMjQ5NDcsMjQ5NDgsMjQ5NTAsMjQ5NTIsMjQ5NTMsMjQ5NTQsMjQ5NTUsMjQ5NTYsMjQ5NTcsMjQ5NTgsMjQ5NTksMjQ5NjAsMjQ5NjEsMjQ5NjIsMjQ5NjMsMjQ5NjQsMjQ5NjUsMjQ5NjYsMjQ5NjcsMjQ5NjgsMjQ5NjksMjQ5NzAsMjQ5NzIsMjQ5NzMsMjQ5NzUsMjQ5NzYsMjQ5NzcsMjQ5NzgsMjQ5NzksMjQ5ODEsMjQ5ODIsMjQ5ODMsMjQ5ODQsMjQ5ODUsMjQ5ODYsMjQ5ODcsMjQ5ODgsMjQ5OTAsMjQ5OTEsMjQ5OTIsMjQ5OTMsMjQ5OTQsMjQ5OTUsMjQ5OTYsMjQ5OTcsMjQ5OTgsMjUwMDIsMjUwMDMsMjUwMDUsMjUwMDYsMjUwMDcsMjUwMDgsMjUwMDksMjUwMTAsMjUwMTEsMjUwMTIsMjUwMTMsMjUwMTQsMjUwMTYsMjUwMTcsMjUwMTgsMjUwMTksMjUwMjAsMjUwMjEsMjUwMjMsMjUwMjQsMjUwMjUsMjUwMjcsMjUwMjgsMjUwMjksMjUwMzAsMjUwMzEsMjUwMzMsMjUwMzYsMjUwMzcsMjUwMzgsMjUwMzksMjUwNDAsMjUwNDMsMjUwNDUsMjUwNDYsMjUwNDcsMjUwNDgsMjUwNDksMjUwNTAsMjUwNTEsMjUwNTIsMjUwNTMsMjUwNTQsMjUwNTUsMjUwNTYsMjUwNTcsMjUwNTgsMjUwNTksMjUwNjAsMjUwNjEsMjUwNjMsMjUwNjQsMjUwNjUsMjUwNjYsMjUwNjcsMjUwNjgsMjUwNjksMjUwNzAsMjUwNzEsMjUwNzIsMjUwNzMsMjUwNzQsMjUwNzUsMjUwNzYsMjUwNzgsMjUwNzksMjUwODAsMjUwODEsMjUwODIsMjUwODMsMjUwODQsMjUwODUsMjUwODYsMjUwODgsMjUwODksMjUwOTAsMjUwOTEsMjUwOTIsMjUwOTMsMjUwOTUsMjUwOTcsMjUxMDcsMjUxMDgsMjUxMTMsMjUxMTYsMjUxMTcsMjUxMTgsMjUxMjAsMjUxMjMsMjUxMjYsMjUxMjcsMjUxMjgsMjUxMjksMjUxMzEsMjUxMzMsMjUxMzUsMjUxMzYsMjUxMzcsMjUxMzgsMjUxNDEsMjUxNDIsMjUxNDQsMjUxNDUsMjUxNDYsMjUxNDcsMjUxNDgsMjUxNTQsMjUxNTYsMjUxNTcsMjUxNTgsMjUxNjIsMjUxNjcsMjUxNjgsMjUxNzMsMjUxNzQsMjUxNzUsMjUxNzcsMjUxNzgsMjUxODAsMjUxODEsMjUxODIsMjUxODMsMjUxODQsMjUxODUsMjUxODYsMjUxODgsMjUxODksMjUxOTIsMjUyMDEsMjUyMDIsMjUyMDQsMjUyMDUsMjUyMDcsMjUyMDgsMjUyMTAsMjUyMTEsMjUyMTMsMjUyMTcsMjUyMTgsMjUyMTksMjUyMjEsMjUyMjIsMjUyMjMsMjUyMjQsMjUyMjcsMjUyMjgsMjUyMjksMjUyMzAsMjUyMzEsMjUyMzIsMjUyMzYsMjUyNDEsMjUyNDQsMjUyNDUsMjUyNDYsMjUyNTEsMjUyNTQsMjUyNTUsMjUyNTcsMjUyNTgsMjUyNjEsMjUyNjIsMjUyNjMsMjUyNjQsMjUyNjYsMjUyNjcsMjUyNjgsMjUyNzAsMjUyNzEsMjUyNzIsMjUyNzQsMjUyNzgsMjUyODAsMjUyODEsMjUyODMsMjUyOTEsMjUyOTUsMjUyOTcsMjUzMDEsMjUzMDksMjUzMTAsMjUzMTIsMjUzMTMsMjUzMTYsMjUzMjIsMjUzMjMsMjUzMjgsMjUzMzAsMjUzMzMsMjUzMzYsMjUzMzcsMjUzMzgsMjUzMzksMjUzNDQsMjUzNDcsMjUzNDgsMjUzNDksMjUzNTAsMjUzNTQsMjUzNTUsMjUzNTYsMjUzNTcsMjUzNTksMjUzNjAsMjUzNjIsMjUzNjMsMjUzNjQsMjUzNjUsMjUzNjcsMjUzNjgsMjUzNjksMjUzNzIsMjUzODIsMjUzODMsMjUzODUsMjUzODgsMjUzODksMjUzOTAsMjUzOTIsMjUzOTMsMjUzOTUsMjUzOTYsMjUzOTcsMjUzOTgsMjUzOTksMjU0MDAsMjU0MDMsMjU0MDQsMjU0MDYsMjU0MDcsMjU0MDgsMjU0MDksMjU0MTIsMjU0MTUsMjU0MTYsMjU0MTgsMjU0MjUsMjU0MjYsMjU0MjcsMjU0MjgsMjU0MzAsMjU0MzEsMjU0MzIsMjU0MzMsMjU0MzQsMjU0MzUsMjU0MzYsMjU0MzcsMjU0NDAsMjU0NDQsMjU0NDUsMjU0NDYsMjU0NDgsMjU0NTAsMjU0NTEsMjU0NTIsMjU0NTUsMjU0NTYsMjU0NTgsMjU0NTksMjU0NjAsMjU0NjEsMjU0NjQsMjU0NjUsMjU0NjgsMjU0NjksMjU0NzAsMjU0NzEsMjU0NzMsMjU0NzUsMjU0NzYsMjU0NzcsMjU0NzgsMjU0ODMsMjU0ODUsMjU0ODksMjU0OTEsMjU0OTIsMjU0OTMsMjU0OTUsMjU0OTcsMjU0OTgsMjU0OTksMjU1MDAsMjU1MDEsMjU1MDIsMjU1MDMsMjU1MDUsMjU1MDgsMjU1MTAsMjU1MTUsMjU1MTksMjU1MjEsMjU1MjIsMjU1MjUsMjU1MjYsMjU1MjksMjU1MzEsMjU1MzMsMjU1MzUsMjU1MzYsMjU1MzcsMjU1MzgsMjU1MzksMjU1NDEsMjU1NDMsMjU1NDQsMjU1NDYsMjU1NDcsMjU1NDgsMjU1NTMsMjU1NTUsMjU1NTYsMjU1NTcsMjU1NTksMjU1NjAsMjU1NjEsMjU1NjIsMjU1NjMsMjU1NjQsMjU1NjUsMjU1NjcsMjU1NzAsMjU1NzIsMjU1NzMsMjU1NzQsMjU1NzUsMjU1NzYsMjU1NzksMjU1ODAsMjU1ODIsMjU1ODMsMjU1ODQsMjU1ODUsMjU1ODcsMjU1ODksMjU1OTEsMjU1OTMsMjU1OTQsMjU1OTUsMjU1OTYsMjU1OTgsMjU2MDMsMjU2MDQsMjU2MDYsMjU2MDcsMjU2MDgsMjU2MDksMjU2MTAsMjU2MTMsMjU2MTQsMjU2MTcsMjU2MTgsMjU2MjEsMjU2MjIsMjU2MjMsMjU2MjQsMjU2MjUsMjU2MjYsMjU2MjksMjU2MzEsMjU2MzQsMjU2MzUsMjU2MzYsMjU2MzcsMjU2MzksMjU2NDAsMjU2NDEsMjU2NDMsMjU2NDYsMjU2NDcsMjU2NDgsMjU2NDksMjU2NTAsMjU2NTEsMjU2NTMsMjU2NTQsMjU2NTUsMjU2NTYsMjU2NTcsMjU2NTksMjU2NjAsMjU2NjIsMjU2NjQsMjU2NjYsMjU2NjcsMjU2NzMsMjU2NzUsMjU2NzYsMjU2NzcsMjU2NzgsMjU2NzksMjU2ODAsMjU2ODEsMjU2ODMsMjU2ODUsMjU2ODYsMjU2ODcsMjU2ODksMjU2OTAsMjU2OTEsMjU2OTIsMjU2OTMsMjU2OTUsMjU2OTYsMjU2OTcsMjU2OTgsMjU2OTksMjU3MDAsMjU3MDEsMjU3MDIsMjU3MDQsMjU3MDYsMjU3MDcsMjU3MDgsMjU3MTAsMjU3MTEsMjU3MTIsMjU3MTMsMjU3MTQsMjU3MTUsMjU3MTYsMjU3MTcsMjU3MTgsMjU3MTksMjU3MjMsMjU3MjQsMjU3MjUsMjU3MjYsMjU3MjcsMjU3MjgsMjU3MjksMjU3MzEsMjU3MzQsMjU3MzYsMjU3MzcsMjU3MzgsMjU3MzksMjU3NDAsMjU3NDEsMjU3NDIsMjU3NDMsMjU3NDQsMjU3NDcsMjU3NDgsMjU3NTEsMjU3NTIsMjU3NTQsMjU3NTUsMjU3NTYsMjU3NTcsMjU3NTksMjU3NjAsMjU3NjEsMjU3NjIsMjU3NjMsMjU3NjUsMjU3NjYsMjU3NjcsMjU3NjgsMjU3NzAsMjU3NzEsMjU3NzUsMjU3NzcsMjU3NzgsMjU3NzksMjU3ODAsMjU3ODIsMjU3ODUsMjU3ODcsMjU3ODksMjU3OTAsMjU3OTEsMjU3OTMsMjU3OTUsMjU3OTYsMjU3OTgsMjU3OTksMjU4MDAsMjU4MDEsMjU4MDIsMjU4MDMsMjU4MDQsMjU4MDcsMjU4MDksMjU4MTEsMjU4MTIsMjU4MTMsMjU4MTQsMjU4MTcsMjU4MTgsMjU4MTksMjU4MjAsMjU4MjEsMjU4MjMsMjU4MjQsMjU4MjUsMjU4MjcsMjU4MjksMjU4MzEsMjU4MzIsMjU4MzMsMjU4MzQsMjU4MzUsMjU4MzYsMjU4MzcsMjU4MzgsMjU4MzksMjU4NDAsMjU4NDEsMjU4NDIsMjU4NDMsMjU4NDQsMjU4NDUsMjU4NDYsMjU4NDcsMjU4NDgsMjU4NDksMjU4NTAsMjU4NTEsMjU4NTIsMjU4NTMsMjU4NTQsMjU4NTUsMjU4NTcsMjU4NTgsMjU4NTksMjU4NjAsMjU4NjEsMjU4NjIsMjU4NjMsMjU4NjQsMjU4NjYsMjU4NjcsMjU4NjgsMjU4NjksMjU4NzAsMjU4NzEsMjU4NzIsMjU4NzMsMjU4NzUsMjU4NzYsMjU4NzcsMjU4NzgsMjU4NzksMjU4ODEsMjU4ODIsMjU4ODMsMjU4ODQsMjU4ODUsMjU4ODYsMjU4ODcsMjU4ODgsMjU4ODksMjU4OTAsMjU4OTEsMjU4OTIsMjU4OTQsMjU4OTUsMjU4OTYsMjU4OTcsMjU4OTgsMjU5MDAsMjU5MDEsMjU5MDQsMjU5MDUsMjU5MDYsMjU5MDcsMjU5MTEsMjU5MTQsMjU5MTYsMjU5MTcsMjU5MjAsMjU5MjEsMjU5MjIsMjU5MjMsMjU5MjQsMjU5MjYsMjU5MjcsMjU5MzAsMjU5MzEsMjU5MzMsMjU5MzQsMjU5MzYsMjU5MzgsMjU5MzksMjU5NDAsMjU5NDMsMjU5NDQsMjU5NDYsMjU5NDgsMjU5NTEsMjU5NTIsMjU5NTMsMjU5NTYsMjU5NTcsMjU5NTksMjU5NjAsMjU5NjEsMjU5NjIsMjU5NjUsMjU5NjYsMjU5NjcsMjU5NjksMjU5NzEsMjU5NzMsMjU5NzQsMjU5NzYsMjU5NzcsMjU5NzgsMjU5NzksMjU5ODAsMjU5ODEsMjU5ODIsMjU5ODMsMjU5ODQsMjU5ODUsMjU5ODYsMjU5ODcsMjU5ODgsMjU5ODksMjU5OTAsMjU5OTIsMjU5OTMsMjU5OTQsMjU5OTcsMjU5OTgsMjU5OTksMjYwMDIsMjYwMDQsMjYwMDUsMjYwMDYsMjYwMDgsMjYwMTAsMjYwMTMsMjYwMTQsMjYwMTYsMjYwMTgsMjYwMTksMjYwMjIsMjYwMjQsMjYwMjYsMjYwMjgsMjYwMzAsMjYwMzMsMjYwMzQsMjYwMzUsMjYwMzYsMjYwMzcsMjYwMzgsMjYwMzksMjYwNDAsMjYwNDIsMjYwNDMsMjYwNDYsMjYwNDcsMjYwNDgsMjYwNTAsMjYwNTUsMjYwNTYsMjYwNTcsMjYwNTgsMjYwNjEsMjYwNjQsMjYwNjUsMjYwNjcsMjYwNjgsMjYwNjksMjYwNzIsMjYwNzMsMjYwNzQsMjYwNzUsMjYwNzYsMjYwNzcsMjYwNzgsMjYwNzksMjYwODEsMjYwODMsMjYwODQsMjYwOTAsMjYwOTEsMjYwOTgsMjYwOTksMjYxMDAsMjYxMDEsMjYxMDQsMjYxMDUsMjYxMDcsMjYxMDgsMjYxMDksMjYxMTAsMjYxMTEsMjYxMTMsMjYxMTYsMjYxMTcsMjYxMTksMjYxMjAsMjYxMjEsMjYxMjMsMjYxMjUsMjYxMjgsMjYxMjksMjYxMzAsMjYxMzQsMjYxMzUsMjYxMzYsMjYxMzgsMjYxMzksMjYxNDAsMjYxNDIsMjYxNDUsMjYxNDYsMjYxNDcsMjYxNDgsMjYxNTAsMjYxNTMsMjYxNTQsMjYxNTUsMjYxNTYsMjYxNTgsMjYxNjAsMjYxNjIsMjYxNjMsMjYxNjcsMjYxNjgsMjYxNjksMjYxNzAsMjYxNzEsMjYxNzMsMjYxNzUsMjYxNzYsMjYxNzgsMjYxODAsMjYxODEsMjYxODIsMjYxODMsMjYxODQsMjYxODUsMjYxODYsMjYxODksMjYxOTAsMjYxOTIsMjYxOTMsMjYyMDAsMjYyMDEsMjYyMDMsMjYyMDQsMjYyMDUsMjYyMDYsMjYyMDgsMjYyMTAsMjYyMTEsMjYyMTMsMjYyMTUsMjYyMTcsMjYyMTgsMjYyMTksMjYyMjAsMjYyMjEsMjYyMjUsMjYyMjYsMjYyMjcsMjYyMjksMjYyMzIsMjYyMzMsMjYyMzUsMjYyMzYsMjYyMzcsMjYyMzksMjYyNDAsMjYyNDEsMjYyNDMsMjYyNDUsMjYyNDYsMjYyNDgsMjYyNDksMjYyNTAsMjYyNTEsMjYyNTMsMjYyNTQsMjYyNTUsMjYyNTYsMjYyNTgsMjYyNTksMjYyNjAsMjYyNjEsMjYyNjQsMjYyNjUsMjYyNjYsMjYyNjcsMjYyNjgsMjYyNzAsMjYyNzEsMjYyNzIsMjYyNzMsMjYyNzQsMjYyNzUsMjYyNzYsMjYyNzcsMjYyNzgsMjYyODEsMjYyODIsMjYyODMsMjYyODQsMjYyODUsMjYyODcsMjYyODgsMjYyODksMjYyOTAsMjYyOTEsMjYyOTMsMjYyOTQsMjYyOTUsMjYyOTYsMjYyOTgsMjYyOTksMjYzMDAsMjYzMDEsMjYzMDMsMjYzMDQsMjYzMDUsMjYzMDYsMjYzMDcsMjYzMDgsMjYzMDksMjYzMTAsMjYzMTEsMjYzMTIsMjYzMTMsMjYzMTQsMjYzMTUsMjYzMTYsMjYzMTcsMjYzMTgsMjYzMTksMjYzMjAsMjYzMjEsMjYzMjIsMjYzMjMsMjYzMjQsMjYzMjUsMjYzMjYsMjYzMjcsMjYzMjgsMjYzMzAsMjYzMzQsMjYzMzUsMjYzMzYsMjYzMzcsMjYzMzgsMjYzMzksMjYzNDAsMjYzNDEsMjYzNDMsMjYzNDQsMjYzNDYsMjYzNDcsMjYzNDgsMjYzNDksMjYzNTAsMjYzNTEsMjYzNTMsMjYzNTcsMjYzNTgsMjYzNjAsMjYzNjIsMjYzNjMsMjYzNjUsMjYzNjksMjYzNzAsMjYzNzEsMjYzNzIsMjYzNzMsMjYzNzQsMjYzNzUsMjYzODAsMjYzODIsMjYzODMsMjYzODUsMjYzODYsMjYzODcsMjYzOTAsMjYzOTIsMjYzOTMsMjYzOTQsMjYzOTYsMjYzOTgsMjY0MDAsMjY0MDEsMjY0MDIsMjY0MDMsMjY0MDQsMjY0MDUsMjY0MDcsMjY0MDksMjY0MTQsMjY0MTYsMjY0MTgsMjY0MTksMjY0MjIsMjY0MjMsMjY0MjQsMjY0MjUsMjY0MjcsMjY0MjgsMjY0MzAsMjY0MzEsMjY0MzMsMjY0MzYsMjY0MzcsMjY0MzksMjY0NDIsMjY0NDMsMjY0NDUsMjY0NTAsMjY0NTIsMjY0NTMsMjY0NTUsMjY0NTYsMjY0NTcsMjY0NTgsMjY0NTksMjY0NjEsMjY0NjYsMjY0NjcsMjY0NjgsMjY0NzAsMjY0NzEsMjY0NzUsMjY0NzYsMjY0NzgsMjY0ODEsMjY0ODQsMjY0ODYsMjY0ODgsMjY0ODksMjY0OTAsMjY0OTEsMjY0OTMsMjY0OTYsMjY0OTgsMjY0OTksMjY1MDEsMjY1MDIsMjY1MDQsMjY1MDYsMjY1MDgsMjY1MDksMjY1MTAsMjY1MTEsMjY1MTMsMjY1MTQsMjY1MTUsMjY1MTYsMjY1MTgsMjY1MjEsMjY1MjMsMjY1MjcsMjY1MjgsMjY1MjksMjY1MzIsMjY1MzQsMjY1MzcsMjY1NDAsMjY1NDIsMjY1NDUsMjY1NDYsMjY1NDgsMjY1NTMsMjY1NTQsMjY1NTUsMjY1NTYsMjY1NTcsMjY1NTgsMjY1NTksMjY1NjAsMjY1NjIsMjY1NjUsMjY1NjYsMjY1NjcsMjY1NjgsMjY1NjksMjY1NzAsMjY1NzEsMjY1NzIsMjY1NzMsMjY1NzQsMjY1ODEsMjY1ODIsMjY1ODMsMjY1ODcsMjY1OTEsMjY1OTMsMjY1OTUsMjY1OTYsMjY1OTgsMjY1OTksMjY2MDAsMjY2MDIsMjY2MDMsMjY2MDUsMjY2MDYsMjY2MTAsMjY2MTMsMjY2MTQsMjY2MTUsMjY2MTYsMjY2MTcsMjY2MTgsMjY2MTksMjY2MjAsMjY2MjIsMjY2MjUsMjY2MjYsMjY2MjcsMjY2MjgsMjY2MzAsMjY2MzcsMjY2NDAsMjY2NDIsMjY2NDQsMjY2NDUsMjY2NDgsMjY2NDksMjY2NTAsMjY2NTEsMjY2NTIsMjY2NTQsMjY2NTUsMjY2NTYsMjY2NTgsMjY2NTksMjY2NjAsMjY2NjEsMjY2NjIsMjY2NjMsMjY2NjQsMjY2NjcsMjY2NjgsMjY2NjksMjY2NzAsMjY2NzEsMjY2NzIsMjY2NzMsMjY2NzYsMjY2NzcsMjY2NzgsMjY2ODIsMjY2ODMsMjY2ODcsMjY2OTUsMjY2OTksMjY3MDEsMjY3MDMsMjY3MDYsMjY3MTAsMjY3MTEsMjY3MTIsMjY3MTMsMjY3MTQsMjY3MTUsMjY3MTYsMjY3MTcsMjY3MTgsMjY3MTksMjY3MzAsMjY3MzIsMjY3MzMsMjY3MzQsMjY3MzUsMjY3MzYsMjY3MzcsMjY3MzgsMjY3MzksMjY3NDEsMjY3NDQsMjY3NDUsMjY3NDYsMjY3NDcsMjY3NDgsMjY3NDksMjY3NTAsMjY3NTEsMjY3NTIsMjY3NTQsMjY3NTYsMjY3NTksMjY3NjAsMjY3NjEsMjY3NjIsMjY3NjMsMjY3NjQsMjY3NjUsMjY3NjYsMjY3NjgsMjY3NjksMjY3NzAsMjY3NzIsMjY3NzMsMjY3NzQsMjY3NzYsMjY3NzcsMjY3NzgsMjY3NzksMjY3ODAsMjY3ODEsMjY3ODIsMjY3ODMsMjY3ODQsMjY3ODUsMjY3ODcsMjY3ODgsMjY3ODksMjY3OTMsMjY3OTQsMjY3OTUsMjY3OTYsMjY3OTgsMjY4MDEsMjY4MDIsMjY4MDQsMjY4MDYsMjY4MDcsMjY4MDgsMjY4MDksMjY4MTAsMjY4MTEsMjY4MTIsMjY4MTMsMjY4MTQsMjY4MTUsMjY4MTcsMjY4MTksMjY4MjAsMjY4MjEsMjY4MjIsMjY4MjMsMjY4MjQsMjY4MjYsMjY4MjgsMjY4MzAsMjY4MzEsMjY4MzIsMjY4MzMsMjY4MzUsMjY4MzYsMjY4MzgsMjY4MzksMjY4NDEsMjY4NDMsMjY4NDQsMjY4NDUsMjY4NDYsMjY4NDcsMjY4NDksMjY4NTAsMjY4NTIsMjY4NTMsMjY4NTQsMjY4NTUsMjY4NTYsMjY4NTcsMjY4NTgsMjY4NTksMjY4NjAsMjY4NjEsMjY4NjMsMjY4NjYsMjY4NjcsMjY4NjgsMjY4NzAsMjY4NzEsMjY4NzIsMjY4NzUsMjY4NzcsMjY4NzgsMjY4NzksMjY4ODAsMjY4ODIsMjY4ODMsMjY4ODQsMjY4ODYsMjY4ODcsMjY4ODgsMjY4ODksMjY4OTAsMjY4OTIsMjY4OTUsMjY4OTcsMjY4OTksMjY5MDAsMjY5MDEsMjY5MDIsMjY5MDMsMjY5MDQsMjY5MDUsMjY5MDYsMjY5MDcsMjY5MDgsMjY5MDksMjY5MTAsMjY5MTMsMjY5MTQsMjY5MTUsMjY5MTcsMjY5MTgsMjY5MTksMjY5MjAsMjY5MjEsMjY5MjIsMjY5MjMsMjY5MjQsMjY5MjYsMjY5MjcsMjY5MjksMjY5MzAsMjY5MzEsMjY5MzMsMjY5MzQsMjY5MzUsMjY5MzYsMjY5MzgsMjY5MzksMjY5NDAsMjY5NDIsMjY5NDQsMjY5NDUsMjY5NDcsMjY5NDgsMjY5NDksMjY5NTAsMjY5NTEsMjY5NTIsMjY5NTMsMjY5NTQsMjY5NTUsMjY5NTYsMjY5NTcsMjY5NTgsMjY5NTksMjY5NjAsMjY5NjEsMjY5NjIsMjY5NjMsMjY5NjUsMjY5NjYsMjY5NjgsMjY5NjksMjY5NzEsMjY5NzIsMjY5NzUsMjY5NzcsMjY5NzgsMjY5ODAsMjY5ODEsMjY5ODMsMjY5ODQsMjY5ODUsMjY5ODYsMjY5ODgsMjY5ODksMjY5OTEsMjY5OTIsMjY5OTQsMjY5OTUsMjY5OTYsMjY5OTcsMjY5OTgsMjcwMDIsMjcwMDMsMjcwMDUsMjcwMDYsMjcwMDcsMjcwMDksMjcwMTEsMjcwMTMsMjcwMTgsMjcwMTksMjcwMjAsMjcwMjIsMjcwMjMsMjcwMjQsMjcwMjUsMjcwMjYsMjcwMjcsMjcwMzAsMjcwMzEsMjcwMzMsMjcwMzQsMjcwMzcsMjcwMzgsMjcwMzksMjcwNDAsMjcwNDEsMjcwNDIsMjcwNDMsMjcwNDQsMjcwNDUsMjcwNDYsMjcwNDksMjcwNTAsMjcwNTIsMjcwNTQsMjcwNTUsMjcwNTYsMjcwNTgsMjcwNTksMjcwNjEsMjcwNjIsMjcwNjQsMjcwNjUsMjcwNjYsMjcwNjgsMjcwNjksMjcwNzAsMjcwNzEsMjcwNzIsMjcwNzQsMjcwNzUsMjcwNzYsMjcwNzcsMjcwNzgsMjcwNzksMjcwODAsMjcwODEsMjcwODMsMjcwODUsMjcwODcsMjcwODksMjcwOTAsMjcwOTEsMjcwOTMsMjcwOTQsMjcwOTUsMjcwOTYsMjcwOTcsMjcwOTgsMjcxMDAsMjcxMDEsMjcxMDIsMjcxMDUsMjcxMDYsMjcxMDcsMjcxMDgsMjcxMDksMjcxMTAsMjcxMTEsMjcxMTIsMjcxMTMsMjcxMTQsMjcxMTUsMjcxMTYsMjcxMTgsMjcxMTksMjcxMjAsMjcxMjEsMjcxMjMsMjcxMjQsMjcxMjUsMjcxMjYsMjcxMjcsMjcxMjgsMjcxMjksMjcxMzAsMjcxMzEsMjcxMzIsMjcxMzQsMjcxMzYsMjcxMzcsMjcxMzgsMjcxMzksMjcxNDAsMjcxNDEsMjcxNDIsMjcxNDMsMjcxNDQsMjcxNDUsMjcxNDcsMjcxNDgsMjcxNDksMjcxNTAsMjcxNTEsMjcxNTIsMjcxNTMsMjcxNTQsMjcxNTUsMjcxNTYsMjcxNTcsMjcxNTgsMjcxNjEsMjcxNjIsMjcxNjMsMjcxNjQsMjcxNjUsMjcxNjYsMjcxNjgsMjcxNzAsMjcxNzEsMjcxNzIsMjcxNzMsMjcxNzQsMjcxNzUsMjcxNzcsMjcxNzksMjcxODAsMjcxODEsMjcxODIsMjcxODQsMjcxODYsMjcxODcsMjcxODgsMjcxOTAsMjcxOTEsMjcxOTIsMjcxOTMsMjcxOTQsMjcxOTUsMjcxOTYsMjcxOTksMjcyMDAsMjcyMDEsMjcyMDIsMjcyMDMsMjcyMDUsMjcyMDYsMjcyMDgsMjcyMDksMjcyMTAsMjcyMTEsMjcyMTIsMjcyMTMsMjcyMTQsMjcyMTUsMjcyMTcsMjcyMTgsMjcyMTksMjcyMjAsMjcyMjEsMjcyMjIsMjcyMjMsMjcyMjYsMjcyMjgsMjcyMjksMjcyMzAsMjcyMzEsMjcyMzIsMjcyMzQsMjcyMzUsMjcyMzYsMjcyMzgsMjcyMzksMjcyNDAsMjcyNDEsMjcyNDIsMjcyNDMsMjcyNDQsMjcyNDUsMjcyNDYsMjcyNDcsMjcyNDgsMjcyNTAsMjcyNTEsMjcyNTIsMjcyNTMsMjcyNTQsMjcyNTUsMjcyNTYsMjcyNTgsMjcyNTksMjcyNjEsMjcyNjIsMjcyNjMsMjcyNjUsMjcyNjYsMjcyNjcsMjcyNjksMjcyNzAsMjcyNzEsMjcyNzIsMjcyNzMsMjcyNzQsMjcyNzUsMjcyNzYsMjcyNzcsMjcyNzksMjcyODIsMjcyODMsMjcyODQsMjcyODUsMjcyODYsMjcyODgsMjcyODksMjcyOTAsMjcyOTEsMjcyOTIsMjcyOTMsMjcyOTQsMjcyOTUsMjcyOTcsMjcyOTgsMjcyOTksMjczMDAsMjczMDEsMjczMDIsMjczMDMsMjczMDQsMjczMDYsMjczMDksMjczMTAsMjczMTEsMjczMTIsMjczMTMsMjczMTQsMjczMTUsMjczMTYsMjczMTcsMjczMTgsMjczMTksMjczMjAsMjczMjEsMjczMjIsMjczMjMsMjczMjQsMjczMjUsMjczMjYsMjczMjcsMjczMjgsMjczMjksMjczMzAsMjczMzEsMjczMzIsMjczMzMsMjczMzQsMjczMzUsMjczMzYsMjczMzcsMjczMzgsMjczMzksMjczNDAsMjczNDEsMjczNDIsMjczNDMsMjczNDQsMjczNDUsMjczNDYsMjczNDcsMjczNDgsMjczNDksMjczNTAsMjczNTEsMjczNTIsMjczNTMsMjczNTQsMjczNTUsMjczNTYsMjczNTcsMjczNTgsMjczNTksMjczNjAsMjczNjEsMjczNjIsMjczNjMsMjczNjQsMjczNjUsMjczNjYsMjczNjcsMjczNjgsMjczNjksMjczNzAsMjczNzEsMjczNzIsMjczNzMsMjczNzQsMjczNzUsMjczNzYsMjczNzcsMjczNzgsMjczNzksMjczODAsMjczODEsMjczODIsMjczODMsMjczODQsMjczODUsMjczODYsMjczODcsMjczODgsMjczODksMjczOTAsMjczOTEsMjczOTIsMjczOTMsMjczOTQsMjczOTUsMjczOTYsMjczOTcsMjczOTgsMjczOTksMjc0MDAsMjc0MDEsMjc0MDIsMjc0MDMsMjc0MDQsMjc0MDUsMjc0MDYsMjc0MDcsMjc0MDgsMjc0MDksMjc0MTAsMjc0MTEsMjc0MTIsMjc0MTMsMjc0MTQsMjc0MTUsMjc0MTYsMjc0MTcsMjc0MTgsMjc0MTksMjc0MjAsMjc0MjEsMjc0MjIsMjc0MjMsMjc0MjksMjc0MzAsMjc0MzIsMjc0MzMsMjc0MzQsMjc0MzUsMjc0MzYsMjc0MzcsMjc0MzgsMjc0MzksMjc0NDAsMjc0NDEsMjc0NDMsMjc0NDQsMjc0NDUsMjc0NDYsMjc0NDgsMjc0NTEsMjc0NTIsMjc0NTMsMjc0NTUsMjc0NTYsMjc0NTcsMjc0NTgsMjc0NjAsMjc0NjEsMjc0NjQsMjc0NjYsMjc0NjcsMjc0NjksMjc0NzAsMjc0NzEsMjc0NzIsMjc0NzMsMjc0NzQsMjc0NzUsMjc0NzYsMjc0NzcsMjc0NzgsMjc0NzksMjc0ODAsMjc0ODIsMjc0ODMsMjc0ODQsMjc0ODUsMjc0ODYsMjc0ODcsMjc0ODgsMjc0ODksMjc0OTYsMjc0OTcsMjc0OTksMjc1MDAsMjc1MDEsMjc1MDIsMjc1MDMsMjc1MDQsMjc1MDUsMjc1MDYsMjc1MDcsMjc1MDgsMjc1MDksMjc1MTAsMjc1MTEsMjc1MTIsMjc1MTQsMjc1MTcsMjc1MTgsMjc1MTksMjc1MjAsMjc1MjUsMjc1MjgsMjc1MzIsMjc1MzQsMjc1MzUsMjc1MzYsMjc1MzcsMjc1NDAsMjc1NDEsMjc1NDMsMjc1NDQsMjc1NDUsMjc1NDgsMjc1NDksMjc1NTAsMjc1NTEsMjc1NTIsMjc1NTQsMjc1NTUsMjc1NTYsMjc1NTcsMjc1NTgsMjc1NTksMjc1NjAsMjc1NjEsMjc1NjMsMjc1NjQsMjc1NjUsMjc1NjYsMjc1NjcsMjc1NjgsMjc1NjksMjc1NzAsMjc1NzQsMjc1NzYsMjc1NzcsMjc1NzgsMjc1NzksMjc1ODAsMjc1ODEsMjc1ODIsMjc1ODQsMjc1ODcsMjc1ODgsMjc1OTAsMjc1OTEsMjc1OTIsMjc1OTMsMjc1OTQsMjc1OTYsMjc1OTgsMjc2MDAsMjc2MDEsMjc2MDgsMjc2MTAsMjc2MTIsMjc2MTMsMjc2MTQsMjc2MTUsMjc2MTYsMjc2MTgsMjc2MTksMjc2MjAsMjc2MjEsMjc2MjIsMjc2MjMsMjc2MjQsMjc2MjUsMjc2MjgsMjc2MjksMjc2MzAsMjc2MzIsMjc2MzMsMjc2MzQsMjc2MzYsMjc2MzgsMjc2MzksMjc2NDAsMjc2NDIsMjc2NDMsMjc2NDQsMjc2NDYsMjc2NDcsMjc2NDgsMjc2NDksMjc2NTAsMjc2NTEsMjc2NTIsMjc2NTYsMjc2NTcsMjc2NTgsMjc2NTksMjc2NjAsMjc2NjIsMjc2NjYsMjc2NzEsMjc2NzYsMjc2NzcsMjc2NzgsMjc2ODAsMjc2ODMsMjc2ODUsMjc2OTEsMjc2OTIsMjc2OTMsMjc2OTcsMjc2OTksMjc3MDIsMjc3MDMsMjc3MDUsMjc3MDYsMjc3MDcsMjc3MDgsMjc3MTAsMjc3MTEsMjc3MTUsMjc3MTYsMjc3MTcsMjc3MjAsMjc3MjMsMjc3MjQsMjc3MjUsMjc3MjYsMjc3MjcsMjc3MjksMjc3MzAsMjc3MzEsMjc3MzQsMjc3MzYsMjc3MzcsMjc3MzgsMjc3NDYsMjc3NDcsMjc3NDksMjc3NTAsMjc3NTEsMjc3NTUsMjc3NTYsMjc3NTcsMjc3NTgsMjc3NTksMjc3NjEsMjc3NjMsMjc3NjUsMjc3NjcsMjc3NjgsMjc3NzAsMjc3NzEsMjc3NzIsMjc3NzUsMjc3NzYsMjc3ODAsMjc3ODMsMjc3ODYsMjc3ODcsMjc3ODksMjc3OTAsMjc3OTMsMjc3OTQsMjc3OTcsMjc3OTgsMjc3OTksMjc4MDAsMjc4MDIsMjc4MDQsMjc4MDUsMjc4MDYsMjc4MDgsMjc4MTAsMjc4MTYsMjc4MjAsMjc4MjMsMjc4MjQsMjc4MjgsMjc4MjksMjc4MzAsMjc4MzEsMjc4MzQsMjc4NDAsMjc4NDEsMjc4NDIsMjc4NDMsMjc4NDYsMjc4NDcsMjc4NDgsMjc4NTEsMjc4NTMsMjc4NTQsMjc4NTUsMjc4NTcsMjc4NTgsMjc4NjQsMjc4NjUsMjc4NjYsMjc4NjgsMjc4NjksMjc4NzEsMjc4NzYsMjc4NzgsMjc4NzksMjc4ODEsMjc4ODQsMjc4ODUsMjc4OTAsMjc4OTIsMjc4OTcsMjc5MDMsMjc5MDQsMjc5MDYsMjc5MDcsMjc5MDksMjc5MTAsMjc5MTIsMjc5MTMsMjc5MTQsMjc5MTcsMjc5MTksMjc5MjAsMjc5MjEsMjc5MjMsMjc5MjQsMjc5MjUsMjc5MjYsMjc5MjgsMjc5MzIsMjc5MzMsMjc5MzUsMjc5MzYsMjc5MzcsMjc5MzgsMjc5MzksMjc5NDAsMjc5NDIsMjc5NDQsMjc5NDUsMjc5NDgsMjc5NDksMjc5NTEsMjc5NTIsMjc5NTYsMjc5NTgsMjc5NTksMjc5NjAsMjc5NjIsMjc5NjcsMjc5NjgsMjc5NzAsMjc5NzIsMjc5NzcsMjc5ODAsMjc5ODQsMjc5ODksMjc5OTAsMjc5OTEsMjc5OTIsMjc5OTUsMjc5OTcsMjc5OTksMjgwMDEsMjgwMDIsMjgwMDQsMjgwMDUsMjgwMDcsMjgwMDgsMjgwMTEsMjgwMTIsMjgwMTMsMjgwMTYsMjgwMTcsMjgwMTgsMjgwMTksMjgwMjEsMjgwMjIsMjgwMjUsMjgwMjYsMjgwMjcsMjgwMjksMjgwMzAsMjgwMzEsMjgwMzIsMjgwMzMsMjgwMzUsMjgwMzYsMjgwMzgsMjgwMzksMjgwNDIsMjgwNDMsMjgwNDUsMjgwNDcsMjgwNDgsMjgwNTAsMjgwNTQsMjgwNTUsMjgwNTYsMjgwNTcsMjgwNTgsMjgwNjAsMjgwNjYsMjgwNjksMjgwNzYsMjgwNzcsMjgwODAsMjgwODEsMjgwODMsMjgwODQsMjgwODYsMjgwODcsMjgwODksMjgwOTAsMjgwOTEsMjgwOTIsMjgwOTMsMjgwOTQsMjgwOTcsMjgwOTgsMjgwOTksMjgxMDQsMjgxMDUsMjgxMDYsMjgxMDksMjgxMTAsMjgxMTEsMjgxMTIsMjgxMTQsMjgxMTUsMjgxMTYsMjgxMTcsMjgxMTksMjgxMjIsMjgxMjMsMjgxMjQsMjgxMjcsMjgxMzAsMjgxMzEsMjgxMzMsMjgxMzUsMjgxMzYsMjgxMzcsMjgxMzgsMjgxNDEsMjgxNDMsMjgxNDQsMjgxNDYsMjgxNDgsMjgxNDksMjgxNTAsMjgxNTIsMjgxNTQsMjgxNTcsMjgxNTgsMjgxNTksMjgxNjAsMjgxNjEsMjgxNjIsMjgxNjMsMjgxNjQsMjgxNjYsMjgxNjcsMjgxNjgsMjgxNjksMjgxNzEsMjgxNzUsMjgxNzgsMjgxNzksMjgxODEsMjgxODQsMjgxODUsMjgxODcsMjgxODgsMjgxOTAsMjgxOTEsMjgxOTQsMjgxOTgsMjgxOTksMjgyMDAsMjgyMDIsMjgyMDQsMjgyMDYsMjgyMDgsMjgyMDksMjgyMTEsMjgyMTMsMjgyMTQsMjgyMTUsMjgyMTcsMjgyMTksMjgyMjAsMjgyMjEsMjgyMjIsMjgyMjMsMjgyMjQsMjgyMjUsMjgyMjYsMjgyMjksMjgyMzAsMjgyMzEsMjgyMzIsMjgyMzMsMjgyMzQsMjgyMzUsMjgyMzYsMjgyMzksMjgyNDAsMjgyNDEsMjgyNDIsMjgyNDUsMjgyNDcsMjgyNDksMjgyNTAsMjgyNTIsMjgyNTMsMjgyNTQsMjgyNTYsMjgyNTcsMjgyNTgsMjgyNTksMjgyNjAsMjgyNjEsMjgyNjIsMjgyNjMsMjgyNjQsMjgyNjUsMjgyNjYsMjgyNjgsMjgyNjksMjgyNzEsMjgyNzIsMjgyNzMsMjgyNzQsMjgyNzUsMjgyNzYsMjgyNzcsMjgyNzgsMjgyNzksMjgyODAsMjgyODEsMjgyODIsMjgyODMsMjgyODQsMjgyODUsMjgyODgsMjgyODksMjgyOTAsMjgyOTIsMjgyOTUsMjgyOTYsMjgyOTgsMjgyOTksMjgzMDAsMjgzMDEsMjgzMDIsMjgzMDUsMjgzMDYsMjgzMDcsMjgzMDgsMjgzMDksMjgzMTAsMjgzMTEsMjgzMTMsMjgzMTQsMjgzMTUsMjgzMTcsMjgzMTgsMjgzMjAsMjgzMjEsMjgzMjMsMjgzMjQsMjgzMjYsMjgzMjgsMjgzMjksMjgzMzEsMjgzMzIsMjgzMzMsMjgzMzQsMjgzMzYsMjgzMzksMjgzNDEsMjgzNDQsMjgzNDUsMjgzNDgsMjgzNTAsMjgzNTEsMjgzNTIsMjgzNTUsMjgzNTYsMjgzNTcsMjgzNTgsMjgzNjAsMjgzNjEsMjgzNjIsMjgzNjQsMjgzNjUsMjgzNjYsMjgzNjgsMjgzNzAsMjgzNzQsMjgzNzYsMjgzNzcsMjgzNzksMjgzODAsMjgzODEsMjgzODcsMjgzOTEsMjgzOTQsMjgzOTUsMjgzOTYsMjgzOTcsMjgzOTgsMjgzOTksMjg0MDAsMjg0MDEsMjg0MDIsMjg0MDMsMjg0MDUsMjg0MDYsMjg0MDcsMjg0MDgsMjg0MTAsMjg0MTEsMjg0MTIsMjg0MTMsMjg0MTQsMjg0MTUsMjg0MTYsMjg0MTcsMjg0MTksMjg0MjAsMjg0MjEsMjg0MjMsMjg0MjQsMjg0MjYsMjg0MjcsMjg0MjgsMjg0MjksMjg0MzAsMjg0MzIsMjg0MzMsMjg0MzQsMjg0MzgsMjg0MzksMjg0NDAsMjg0NDEsMjg0NDIsMjg0NDMsMjg0NDQsMjg0NDUsMjg0NDYsMjg0NDcsMjg0NDksMjg0NTAsMjg0NTEsMjg0NTMsMjg0NTQsMjg0NTUsMjg0NTYsMjg0NjAsMjg0NjIsMjg0NjQsMjg0NjYsMjg0NjgsMjg0NjksMjg0NzEsMjg0NzIsMjg0NzMsMjg0NzQsMjg0NzUsMjg0NzYsMjg0NzcsMjg0NzksMjg0ODAsMjg0ODEsMjg0ODIsMjg0ODMsMjg0ODQsMjg0ODUsMjg0ODgsMjg0ODksMjg0OTAsMjg0OTIsMjg0OTQsMjg0OTUsMjg0OTYsMjg0OTcsMjg0OTgsMjg0OTksMjg1MDAsMjg1MDEsMjg1MDIsMjg1MDMsMjg1MDUsMjg1MDYsMjg1MDcsMjg1MDksMjg1MTEsMjg1MTIsMjg1MTMsMjg1MTUsMjg1MTYsMjg1MTcsMjg1MTksMjg1MjAsMjg1MjEsMjg1MjIsMjg1MjMsMjg1MjQsMjg1MjcsMjg1MjgsMjg1MjksMjg1MzEsMjg1MzMsMjg1MzQsMjg1MzUsMjg1MzcsMjg1MzksMjg1NDEsMjg1NDIsMjg1NDMsMjg1NDQsMjg1NDUsMjg1NDYsMjg1NDcsMjg1NDksMjg1NTAsMjg1NTEsMjg1NTQsMjg1NTUsMjg1NTksMjg1NjAsMjg1NjEsMjg1NjIsMjg1NjMsMjg1NjQsMjg1NjUsMjg1NjYsMjg1NjcsMjg1NjgsMjg1NjksMjg1NzAsMjg1NzEsMjg1NzMsMjg1NzQsMjg1NzUsMjg1NzYsMjg1NzgsMjg1NzksMjg1ODAsMjg1ODEsMjg1ODIsMjg1ODQsMjg1ODUsMjg1ODYsMjg1ODcsMjg1ODgsMjg1ODksMjg1OTAsMjg1OTEsMjg1OTIsMjg1OTMsMjg1OTQsMjg1OTYsMjg1OTcsMjg1OTksMjg2MDAsMjg2MDIsMjg2MDMsMjg2MDQsMjg2MDUsMjg2MDYsMjg2MDcsMjg2MDksMjg2MTEsMjg2MTIsMjg2MTMsMjg2MTQsMjg2MTUsMjg2MTYsMjg2MTgsMjg2MTksMjg2MjAsMjg2MjEsMjg2MjIsMjg2MjMsMjg2MjQsMjg2MjcsMjg2MjgsMjg2MjksMjg2MzAsMjg2MzEsMjg2MzIsMjg2MzMsMjg2MzQsMjg2MzUsMjg2MzYsMjg2MzcsMjg2MzksMjg2NDIsMjg2NDMsMjg2NDQsMjg2NDUsMjg2NDYsMjg2NDcsMjg2NDgsMjg2NDksMjg2NTAsMjg2NTEsMjg2NTIsMjg2NTMsMjg2NTYsMjg2NTcsMjg2NTgsMjg2NTksMjg2NjAsMjg2NjEsMjg2NjIsMjg2NjMsMjg2NjQsMjg2NjUsMjg2NjYsMjg2NjcsMjg2NjgsMjg2NjksMjg2NzAsMjg2NzEsMjg2NzIsMjg2NzMsMjg2NzQsMjg2NzUsMjg2NzYsMjg2NzcsMjg2NzgsMjg2NzksMjg2ODAsMjg2ODEsMjg2ODIsMjg2ODMsMjg2ODQsMjg2ODUsMjg2ODYsMjg2ODcsMjg2ODgsMjg2OTAsMjg2OTEsMjg2OTIsMjg2OTMsMjg2OTQsMjg2OTUsMjg2OTYsMjg2OTcsMjg3MDAsMjg3MDEsMjg3MDIsMjg3MDMsMjg3MDQsMjg3MDUsMjg3MDYsMjg3MDgsMjg3MDksMjg3MTAsMjg3MTEsMjg3MTIsMjg3MTMsMjg3MTQsMjg3MTUsMjg3MTYsMjg3MTcsMjg3MTgsMjg3MTksMjg3MjAsMjg3MjEsMjg3MjIsMjg3MjMsMjg3MjQsMjg3MjYsMjg3MjcsMjg3MjgsMjg3MzAsMjg3MzEsMjg3MzIsMjg3MzMsMjg3MzQsMjg3MzUsMjg3MzYsMjg3MzcsMjg3MzgsMjg3MzksMjg3NDAsMjg3NDEsMjg3NDIsMjg3NDMsMjg3NDQsMjg3NDUsMjg3NDYsMjg3NDcsMjg3NDksMjg3NTAsMjg3NTIsMjg3NTMsMjg3NTQsMjg3NTUsMjg3NTYsMjg3NTcsMjg3NTgsMjg3NTksMjg3NjAsMjg3NjEsMjg3NjIsMjg3NjMsMjg3NjQsMjg3NjUsMjg3NjcsMjg3NjgsMjg3NjksMjg3NzAsMjg3NzEsMjg3NzIsMjg3NzMsMjg3NzQsMjg3NzUsMjg3NzYsMjg3NzcsMjg3NzgsMjg3ODIsMjg3ODUsMjg3ODYsMjg3ODcsMjg3ODgsMjg3OTEsMjg3OTMsMjg3OTQsMjg3OTUsMjg3OTcsMjg4MDEsMjg4MDIsMjg4MDMsMjg4MDQsMjg4MDYsMjg4MDcsMjg4MDgsMjg4MTEsMjg4MTIsMjg4MTMsMjg4MTUsMjg4MTYsMjg4MTcsMjg4MTksMjg4MjMsMjg4MjQsMjg4MjYsMjg4MjcsMjg4MzAsMjg4MzEsMjg4MzIsMjg4MzMsMjg4MzQsMjg4MzUsMjg4MzYsMjg4MzcsMjg4MzgsMjg4MzksMjg4NDAsMjg4NDEsMjg4NDIsMjg4NDgsMjg4NTAsMjg4NTIsMjg4NTMsMjg4NTQsMjg4NTgsMjg4NjIsMjg4NjMsMjg4NjgsMjg4NjksMjg4NzAsMjg4NzEsMjg4NzMsMjg4NzUsMjg4NzYsMjg4NzcsMjg4NzgsMjg4NzksMjg4ODAsMjg4ODEsMjg4ODIsMjg4ODMsMjg4ODQsMjg4ODUsMjg4ODYsMjg4ODcsMjg4OTAsMjg4OTIsMjg4OTMsMjg4OTQsMjg4OTYsMjg4OTcsMjg4OTgsMjg4OTksMjg5MDEsMjg5MDYsMjg5MTAsMjg5MTIsMjg5MTMsMjg5MTQsMjg5MTUsMjg5MTYsMjg5MTcsMjg5MTgsMjg5MjAsMjg5MjIsMjg5MjMsMjg5MjQsMjg5MjYsMjg5MjcsMjg5MjgsMjg5MjksMjg5MzAsMjg5MzEsMjg5MzIsMjg5MzMsMjg5MzQsMjg5MzUsMjg5MzYsMjg5MzksMjg5NDAsMjg5NDEsMjg5NDIsMjg5NDMsMjg5NDUsMjg5NDYsMjg5NDgsMjg5NTEsMjg5NTUsMjg5NTYsMjg5NTcsMjg5NTgsMjg5NTksMjg5NjAsMjg5NjEsMjg5NjIsMjg5NjMsMjg5NjQsMjg5NjUsMjg5NjcsMjg5NjgsMjg5NjksMjg5NzAsMjg5NzEsMjg5NzIsMjg5NzMsMjg5NzQsMjg5NzgsMjg5NzksMjg5ODAsMjg5ODEsMjg5ODMsMjg5ODQsMjg5ODUsMjg5ODYsMjg5ODcsMjg5ODgsMjg5ODksMjg5OTAsMjg5OTEsMjg5OTIsMjg5OTMsMjg5OTQsMjg5OTUsMjg5OTYsMjg5OTgsMjg5OTksMjkwMDAsMjkwMDEsMjkwMDMsMjkwMDUsMjkwMDcsMjkwMDgsMjkwMDksMjkwMTAsMjkwMTEsMjkwMTIsMjkwMTMsMjkwMTQsMjkwMTUsMjkwMTYsMjkwMTcsMjkwMTgsMjkwMTksMjkwMjEsMjkwMjMsMjkwMjQsMjkwMjUsMjkwMjYsMjkwMjcsMjkwMjksMjkwMzMsMjkwMzQsMjkwMzUsMjkwMzYsMjkwMzcsMjkwMzksMjkwNDAsMjkwNDEsMjkwNDQsMjkwNDUsMjkwNDYsMjkwNDcsMjkwNDksMjkwNTEsMjkwNTIsMjkwNTQsMjkwNTUsMjkwNTYsMjkwNTcsMjkwNTgsMjkwNTksMjkwNjEsMjkwNjIsMjkwNjMsMjkwNjQsMjkwNjUsMjkwNjcsMjkwNjgsMjkwNjksMjkwNzAsMjkwNzIsMjkwNzMsMjkwNzQsMjkwNzUsMjkwNzcsMjkwNzgsMjkwNzksMjkwODIsMjkwODMsMjkwODQsMjkwODUsMjkwODYsMjkwODksMjkwOTAsMjkwOTEsMjkwOTIsMjkwOTMsMjkwOTQsMjkwOTUsMjkwOTcsMjkwOTgsMjkwOTksMjkxMDEsMjkxMDIsMjkxMDMsMjkxMDQsMjkxMDUsMjkxMDYsMjkxMDgsMjkxMTAsMjkxMTEsMjkxMTIsMjkxMTQsMjkxMTUsMjkxMTYsMjkxMTcsMjkxMTgsMjkxMTksMjkxMjAsMjkxMjEsMjkxMjIsMjkxMjQsMjkxMjUsMjkxMjYsMjkxMjcsMjkxMjgsMjkxMjksMjkxMzAsMjkxMzEsMjkxMzIsMjkxMzMsMjkxMzUsMjkxMzYsMjkxMzcsMjkxMzgsMjkxMzksMjkxNDIsMjkxNDMsMjkxNDQsMjkxNDUsMjkxNDYsMjkxNDcsMjkxNDgsMjkxNDksMjkxNTAsMjkxNTEsMjkxNTMsMjkxNTQsMjkxNTUsMjkxNTYsMjkxNTgsMjkxNjAsMjkxNjEsMjkxNjIsMjkxNjMsMjkxNjQsMjkxNjUsMjkxNjcsMjkxNjgsMjkxNjksMjkxNzAsMjkxNzEsMjkxNzIsMjkxNzMsMjkxNzQsMjkxNzUsMjkxNzYsMjkxNzgsMjkxNzksMjkxODAsMjkxODEsMjkxODIsMjkxODMsMjkxODQsMjkxODUsMjkxODYsMjkxODcsMjkxODgsMjkxODksMjkxOTEsMjkxOTIsMjkxOTMsMjkxOTQsMjkxOTUsMjkxOTYsMjkxOTcsMjkxOTgsMjkxOTksMjkyMDAsMjkyMDEsMjkyMDIsMjkyMDMsMjkyMDQsMjkyMDUsMjkyMDYsMjkyMDcsMjkyMDgsMjkyMDksMjkyMTAsMjkyMTEsMjkyMTIsMjkyMTQsMjkyMTUsMjkyMTYsMjkyMTcsMjkyMTgsMjkyMTksMjkyMjAsMjkyMjEsMjkyMjIsMjkyMjMsMjkyMjUsMjkyMjcsMjkyMjksMjkyMzAsMjkyMzEsMjkyMzQsMjkyMzUsMjkyMzYsMjkyNDIsMjkyNDQsMjkyNDYsMjkyNDgsMjkyNDksMjkyNTAsMjkyNTEsMjkyNTIsMjkyNTMsMjkyNTQsMjkyNTcsMjkyNTgsMjkyNTksMjkyNjIsMjkyNjMsMjkyNjQsMjkyNjUsMjkyNjcsMjkyNjgsMjkyNjksMjkyNzEsMjkyNzIsMjkyNzQsMjkyNzYsMjkyNzgsMjkyODAsMjkyODMsMjkyODQsMjkyODUsMjkyODgsMjkyOTAsMjkyOTEsMjkyOTIsMjkyOTMsMjkyOTYsMjkyOTcsMjkyOTksMjkzMDAsMjkzMDIsMjkzMDMsMjkzMDQsMjkzMDcsMjkzMDgsMjkzMDksMjkzMTQsMjkzMTUsMjkzMTcsMjkzMTgsMjkzMTksMjkzMjAsMjkzMjEsMjkzMjQsMjkzMjYsMjkzMjgsMjkzMjksMjkzMzEsMjkzMzIsMjkzMzMsMjkzMzQsMjkzMzUsMjkzMzYsMjkzMzcsMjkzMzgsMjkzMzksMjkzNDAsMjkzNDEsMjkzNDIsMjkzNDQsMjkzNDUsMjkzNDYsMjkzNDcsMjkzNDgsMjkzNDksMjkzNTAsMjkzNTEsMjkzNTIsMjkzNTMsMjkzNTQsMjkzNTUsMjkzNTgsMjkzNjEsMjkzNjIsMjkzNjMsMjkzNjUsMjkzNzAsMjkzNzEsMjkzNzIsMjkzNzMsMjkzNzQsMjkzNzUsMjkzNzYsMjkzODEsMjkzODIsMjkzODMsMjkzODUsMjkzODYsMjkzODcsMjkzODgsMjkzOTEsMjkzOTMsMjkzOTUsMjkzOTYsMjkzOTcsMjkzOTgsMjk0MDAsMjk0MDIsMjk0MDMsNTg1NjYsNTg1NjcsNTg1NjgsNTg1NjksNTg1NzAsNTg1NzEsNTg1NzIsNTg1NzMsNTg1NzQsNTg1NzUsNTg1NzYsNTg1NzcsNTg1NzgsNTg1NzksNTg1ODAsNTg1ODEsNTg1ODIsNTg1ODMsNTg1ODQsNTg1ODUsNTg1ODYsNTg1ODcsNTg1ODgsNTg1ODksNTg1OTAsNTg1OTEsNTg1OTIsNTg1OTMsNTg1OTQsNTg1OTUsNTg1OTYsNTg1OTcsNTg1OTgsNTg1OTksNTg2MDAsNTg2MDEsNTg2MDIsNTg2MDMsNTg2MDQsNTg2MDUsNTg2MDYsNTg2MDcsNTg2MDgsNTg2MDksNTg2MTAsNTg2MTEsNTg2MTIsNTg2MTMsNTg2MTQsNTg2MTUsNTg2MTYsNTg2MTcsNTg2MTgsNTg2MTksNTg2MjAsNTg2MjEsNTg2MjIsNTg2MjMsNTg2MjQsNTg2MjUsNTg2MjYsNTg2MjcsNTg2MjgsNTg2MjksNTg2MzAsNTg2MzEsNTg2MzIsNTg2MzMsNTg2MzQsNTg2MzUsNTg2MzYsNTg2MzcsNTg2MzgsNTg2MzksNTg2NDAsNTg2NDEsNTg2NDIsNTg2NDMsNTg2NDQsNTg2NDUsNTg2NDYsNTg2NDcsNTg2NDgsNTg2NDksNTg2NTAsNTg2NTEsNTg2NTIsNTg2NTMsNTg2NTQsNTg2NTUsNTg2NTYsNTg2NTcsNTg2NTgsNTg2NTksNTg2NjAsNTg2NjEsMTIyODgsMTIyODksMTIyOTAsMTgzLDcxMyw3MTEsMTY4LDEyMjkxLDEyMjkzLDgyMTIsNjUzNzQsODIxNCw4MjMwLDgyMTYsODIxNyw4MjIwLDgyMjEsMTIzMDgsMTIzMDksMTIyOTYsMTIyOTcsMTIyOTgsMTIyOTksMTIzMDAsMTIzMDEsMTIzMDIsMTIzMDMsMTIzMTAsMTIzMTEsMTIzMDQsMTIzMDUsMTc3LDIxNSwyNDcsODc1OCw4NzQzLDg3NDQsODcyMSw4NzE5LDg3NDYsODc0NSw4NzEyLDg3NTksODczMCw4ODY5LDg3NDEsODczNiw4OTc4LDg4NTcsODc0Nyw4NzUwLDg4MDEsODc4MCw4Nzc2LDg3NjUsODczMyw4ODAwLDg4MTQsODgxNSw4ODA0LDg4MDUsODczNCw4NzU3LDg3NTYsOTc5NCw5NzkyLDE3Niw4MjQyLDgyNDMsODQ1MSw2NTI4NCwxNjQsNjU1MDQsNjU1MDUsODI0MCwxNjcsODQ3MCw5NzM0LDk3MzMsOTY3NSw5Njc5LDk2NzgsOTY3MSw5NjcwLDk2MzMsOTYzMiw5NjUxLDk2NTAsODI1MSw4NTk0LDg1OTIsODU5Myw4NTk1LDEyMzA3LDU4NjYyLDU4NjYzLDU4NjY0LDU4NjY1LDU4NjY2LDU4NjY3LDU4NjY4LDU4NjY5LDU4NjcwLDU4NjcxLDU4NjcyLDU4NjczLDU4Njc0LDU4Njc1LDU4Njc2LDU4Njc3LDU4Njc4LDU4Njc5LDU4NjgwLDU4NjgxLDU4NjgyLDU4NjgzLDU4Njg0LDU4Njg1LDU4Njg2LDU4Njg3LDU4Njg4LDU4Njg5LDU4NjkwLDU4NjkxLDU4NjkyLDU4NjkzLDU4Njk0LDU4Njk1LDU4Njk2LDU4Njk3LDU4Njk4LDU4Njk5LDU4NzAwLDU4NzAxLDU4NzAyLDU4NzAzLDU4NzA0LDU4NzA1LDU4NzA2LDU4NzA3LDU4NzA4LDU4NzA5LDU4NzEwLDU4NzExLDU4NzEyLDU4NzEzLDU4NzE0LDU4NzE1LDU4NzE2LDU4NzE3LDU4NzE4LDU4NzE5LDU4NzIwLDU4NzIxLDU4NzIyLDU4NzIzLDU4NzI0LDU4NzI1LDU4NzI2LDU4NzI3LDU4NzI4LDU4NzI5LDU4NzMwLDU4NzMxLDU4NzMyLDU4NzMzLDU4NzM0LDU4NzM1LDU4NzM2LDU4NzM3LDU4NzM4LDU4NzM5LDU4NzQwLDU4NzQxLDU4NzQyLDU4NzQzLDU4NzQ0LDU4NzQ1LDU4NzQ2LDU4NzQ3LDU4NzQ4LDU4NzQ5LDU4NzUwLDU4NzUxLDU4NzUyLDU4NzUzLDU4NzU0LDU4NzU1LDU4NzU2LDU4NzU3LDg1NjAsODU2MSw4NTYyLDg1NjMsODU2NCw4NTY1LDg1NjYsODU2Nyw4NTY4LDg1NjksNTkyMzgsNTkyMzksNTkyNDAsNTkyNDEsNTkyNDIsNTkyNDMsOTM1Miw5MzUzLDkzNTQsOTM1NSw5MzU2LDkzNTcsOTM1OCw5MzU5LDkzNjAsOTM2MSw5MzYyLDkzNjMsOTM2NCw5MzY1LDkzNjYsOTM2Nyw5MzY4LDkzNjksOTM3MCw5MzcxLDkzMzIsOTMzMyw5MzM0LDkzMzUsOTMzNiw5MzM3LDkzMzgsOTMzOSw5MzQwLDkzNDEsOTM0Miw5MzQzLDkzNDQsOTM0NSw5MzQ2LDkzNDcsOTM0OCw5MzQ5LDkzNTAsOTM1MSw5MzEyLDkzMTMsOTMxNCw5MzE1LDkzMTYsOTMxNyw5MzE4LDkzMTksOTMyMCw5MzIxLDgzNjQsNTkyNDUsMTI4MzIsMTI4MzMsMTI4MzQsMTI4MzUsMTI4MzYsMTI4MzcsMTI4MzgsMTI4MzksMTI4NDAsMTI4NDEsNTkyNDYsNTkyNDcsODU0NCw4NTQ1LDg1NDYsODU0Nyw4NTQ4LDg1NDksODU1MCw4NTUxLDg1NTIsODU1Myw4NTU0LDg1NTUsNTkyNDgsNTkyNDksNTg3NTgsNTg3NTksNTg3NjAsNTg3NjEsNTg3NjIsNTg3NjMsNTg3NjQsNTg3NjUsNTg3NjYsNTg3NjcsNTg3NjgsNTg3NjksNTg3NzAsNTg3NzEsNTg3NzIsNTg3NzMsNTg3NzQsNTg3NzUsNTg3NzYsNTg3NzcsNTg3NzgsNTg3NzksNTg3ODAsNTg3ODEsNTg3ODIsNTg3ODMsNTg3ODQsNTg3ODUsNTg3ODYsNTg3ODcsNTg3ODgsNTg3ODksNTg3OTAsNTg3OTEsNTg3OTIsNTg3OTMsNTg3OTQsNTg3OTUsNTg3OTYsNTg3OTcsNTg3OTgsNTg3OTksNTg4MDAsNTg4MDEsNTg4MDIsNTg4MDMsNTg4MDQsNTg4MDUsNTg4MDYsNTg4MDcsNTg4MDgsNTg4MDksNTg4MTAsNTg4MTEsNTg4MTIsNTg4MTMsNTg4MTQsNTg4MTUsNTg4MTYsNTg4MTcsNTg4MTgsNTg4MTksNTg4MjAsNTg4MjEsNTg4MjIsNTg4MjMsNTg4MjQsNTg4MjUsNTg4MjYsNTg4MjcsNTg4MjgsNTg4MjksNTg4MzAsNTg4MzEsNTg4MzIsNTg4MzMsNTg4MzQsNTg4MzUsNTg4MzYsNTg4MzcsNTg4MzgsNTg4MzksNTg4NDAsNTg4NDEsNTg4NDIsNTg4NDMsNTg4NDQsNTg4NDUsNTg4NDYsNTg4NDcsNTg4NDgsNTg4NDksNTg4NTAsNTg4NTEsNTg4NTIsMTIyODgsNjUyODEsNjUyODIsNjUyODMsNjU1MDksNjUyODUsNjUyODYsNjUyODcsNjUyODgsNjUyODksNjUyOTAsNjUyOTEsNjUyOTIsNjUyOTMsNjUyOTQsNjUyOTUsNjUyOTYsNjUyOTcsNjUyOTgsNjUyOTksNjUzMDAsNjUzMDEsNjUzMDIsNjUzMDMsNjUzMDQsNjUzMDUsNjUzMDYsNjUzMDcsNjUzMDgsNjUzMDksNjUzMTAsNjUzMTEsNjUzMTIsNjUzMTMsNjUzMTQsNjUzMTUsNjUzMTYsNjUzMTcsNjUzMTgsNjUzMTksNjUzMjAsNjUzMjEsNjUzMjIsNjUzMjMsNjUzMjQsNjUzMjUsNjUzMjYsNjUzMjcsNjUzMjgsNjUzMjksNjUzMzAsNjUzMzEsNjUzMzIsNjUzMzMsNjUzMzQsNjUzMzUsNjUzMzYsNjUzMzcsNjUzMzgsNjUzMzksNjUzNDAsNjUzNDEsNjUzNDIsNjUzNDMsNjUzNDQsNjUzNDUsNjUzNDYsNjUzNDcsNjUzNDgsNjUzNDksNjUzNTAsNjUzNTEsNjUzNTIsNjUzNTMsNjUzNTQsNjUzNTUsNjUzNTYsNjUzNTcsNjUzNTgsNjUzNTksNjUzNjAsNjUzNjEsNjUzNjIsNjUzNjMsNjUzNjQsNjUzNjUsNjUzNjYsNjUzNjcsNjUzNjgsNjUzNjksNjUzNzAsNjUzNzEsNjUzNzIsNjUzNzMsNjU1MDcsNTg4NTQsNTg4NTUsNTg4NTYsNTg4NTcsNTg4NTgsNTg4NTksNTg4NjAsNTg4NjEsNTg4NjIsNTg4NjMsNTg4NjQsNTg4NjUsNTg4NjYsNTg4NjcsNTg4NjgsNTg4NjksNTg4NzAsNTg4NzEsNTg4NzIsNTg4NzMsNTg4NzQsNTg4NzUsNTg4NzYsNTg4NzcsNTg4NzgsNTg4NzksNTg4ODAsNTg4ODEsNTg4ODIsNTg4ODMsNTg4ODQsNTg4ODUsNTg4ODYsNTg4ODcsNTg4ODgsNTg4ODksNTg4OTAsNTg4OTEsNTg4OTIsNTg4OTMsNTg4OTQsNTg4OTUsNTg4OTYsNTg4OTcsNTg4OTgsNTg4OTksNTg5MDAsNTg5MDEsNTg5MDIsNTg5MDMsNTg5MDQsNTg5MDUsNTg5MDYsNTg5MDcsNTg5MDgsNTg5MDksNTg5MTAsNTg5MTEsNTg5MTIsNTg5MTMsNTg5MTQsNTg5MTUsNTg5MTYsNTg5MTcsNTg5MTgsNTg5MTksNTg5MjAsNTg5MjEsNTg5MjIsNTg5MjMsNTg5MjQsNTg5MjUsNTg5MjYsNTg5MjcsNTg5MjgsNTg5MjksNTg5MzAsNTg5MzEsNTg5MzIsNTg5MzMsNTg5MzQsNTg5MzUsNTg5MzYsNTg5MzcsNTg5MzgsNTg5MzksNTg5NDAsNTg5NDEsNTg5NDIsNTg5NDMsNTg5NDQsNTg5NDUsNTg5NDYsNTg5NDcsNTg5NDgsNTg5NDksMTIzNTMsMTIzNTQsMTIzNTUsMTIzNTYsMTIzNTcsMTIzNTgsMTIzNTksMTIzNjAsMTIzNjEsMTIzNjIsMTIzNjMsMTIzNjQsMTIzNjUsMTIzNjYsMTIzNjcsMTIzNjgsMTIzNjksMTIzNzAsMTIzNzEsMTIzNzIsMTIzNzMsMTIzNzQsMTIzNzUsMTIzNzYsMTIzNzcsMTIzNzgsMTIzNzksMTIzODAsMTIzODEsMTIzODIsMTIzODMsMTIzODQsMTIzODUsMTIzODYsMTIzODcsMTIzODgsMTIzODksMTIzOTAsMTIzOTEsMTIzOTIsMTIzOTMsMTIzOTQsMTIzOTUsMTIzOTYsMTIzOTcsMTIzOTgsMTIzOTksMTI0MDAsMTI0MDEsMTI0MDIsMTI0MDMsMTI0MDQsMTI0MDUsMTI0MDYsMTI0MDcsMTI0MDgsMTI0MDksMTI0MTAsMTI0MTEsMTI0MTIsMTI0MTMsMTI0MTQsMTI0MTUsMTI0MTYsMTI0MTcsMTI0MTgsMTI0MTksMTI0MjAsMTI0MjEsMTI0MjIsMTI0MjMsMTI0MjQsMTI0MjUsMTI0MjYsMTI0MjcsMTI0MjgsMTI0MjksMTI0MzAsMTI0MzEsMTI0MzIsMTI0MzMsMTI0MzQsMTI0MzUsNTkyNTAsNTkyNTEsNTkyNTIsNTkyNTMsNTkyNTQsNTkyNTUsNTkyNTYsNTkyNTcsNTkyNTgsNTkyNTksNTkyNjAsNTg5NTAsNTg5NTEsNTg5NTIsNTg5NTMsNTg5NTQsNTg5NTUsNTg5NTYsNTg5NTcsNTg5NTgsNTg5NTksNTg5NjAsNTg5NjEsNTg5NjIsNTg5NjMsNTg5NjQsNTg5NjUsNTg5NjYsNTg5NjcsNTg5NjgsNTg5NjksNTg5NzAsNTg5NzEsNTg5NzIsNTg5NzMsNTg5NzQsNTg5NzUsNTg5NzYsNTg5NzcsNTg5NzgsNTg5NzksNTg5ODAsNTg5ODEsNTg5ODIsNTg5ODMsNTg5ODQsNTg5ODUsNTg5ODYsNTg5ODcsNTg5ODgsNTg5ODksNTg5OTAsNTg5OTEsNTg5OTIsNTg5OTMsNTg5OTQsNTg5OTUsNTg5OTYsNTg5OTcsNTg5OTgsNTg5OTksNTkwMDAsNTkwMDEsNTkwMDIsNTkwMDMsNTkwMDQsNTkwMDUsNTkwMDYsNTkwMDcsNTkwMDgsNTkwMDksNTkwMTAsNTkwMTEsNTkwMTIsNTkwMTMsNTkwMTQsNTkwMTUsNTkwMTYsNTkwMTcsNTkwMTgsNTkwMTksNTkwMjAsNTkwMjEsNTkwMjIsNTkwMjMsNTkwMjQsNTkwMjUsNTkwMjYsNTkwMjcsNTkwMjgsNTkwMjksNTkwMzAsNTkwMzEsNTkwMzIsNTkwMzMsNTkwMzQsNTkwMzUsNTkwMzYsNTkwMzcsNTkwMzgsNTkwMzksNTkwNDAsNTkwNDEsNTkwNDIsNTkwNDMsNTkwNDQsNTkwNDUsMTI0NDksMTI0NTAsMTI0NTEsMTI0NTIsMTI0NTMsMTI0NTQsMTI0NTUsMTI0NTYsMTI0NTcsMTI0NTgsMTI0NTksMTI0NjAsMTI0NjEsMTI0NjIsMTI0NjMsMTI0NjQsMTI0NjUsMTI0NjYsMTI0NjcsMTI0NjgsMTI0NjksMTI0NzAsMTI0NzEsMTI0NzIsMTI0NzMsMTI0NzQsMTI0NzUsMTI0NzYsMTI0NzcsMTI0NzgsMTI0NzksMTI0ODAsMTI0ODEsMTI0ODIsMTI0ODMsMTI0ODQsMTI0ODUsMTI0ODYsMTI0ODcsMTI0ODgsMTI0ODksMTI0OTAsMTI0OTEsMTI0OTIsMTI0OTMsMTI0OTQsMTI0OTUsMTI0OTYsMTI0OTcsMTI0OTgsMTI0OTksMTI1MDAsMTI1MDEsMTI1MDIsMTI1MDMsMTI1MDQsMTI1MDUsMTI1MDYsMTI1MDcsMTI1MDgsMTI1MDksMTI1MTAsMTI1MTEsMTI1MTIsMTI1MTMsMTI1MTQsMTI1MTUsMTI1MTYsMTI1MTcsMTI1MTgsMTI1MTksMTI1MjAsMTI1MjEsMTI1MjIsMTI1MjMsMTI1MjQsMTI1MjUsMTI1MjYsMTI1MjcsMTI1MjgsMTI1MjksMTI1MzAsMTI1MzEsMTI1MzIsMTI1MzMsMTI1MzQsNTkyNjEsNTkyNjIsNTkyNjMsNTkyNjQsNTkyNjUsNTkyNjYsNTkyNjcsNTkyNjgsNTkwNDYsNTkwNDcsNTkwNDgsNTkwNDksNTkwNTAsNTkwNTEsNTkwNTIsNTkwNTMsNTkwNTQsNTkwNTUsNTkwNTYsNTkwNTcsNTkwNTgsNTkwNTksNTkwNjAsNTkwNjEsNTkwNjIsNTkwNjMsNTkwNjQsNTkwNjUsNTkwNjYsNTkwNjcsNTkwNjgsNTkwNjksNTkwNzAsNTkwNzEsNTkwNzIsNTkwNzMsNTkwNzQsNTkwNzUsNTkwNzYsNTkwNzcsNTkwNzgsNTkwNzksNTkwODAsNTkwODEsNTkwODIsNTkwODMsNTkwODQsNTkwODUsNTkwODYsNTkwODcsNTkwODgsNTkwODksNTkwOTAsNTkwOTEsNTkwOTIsNTkwOTMsNTkwOTQsNTkwOTUsNTkwOTYsNTkwOTcsNTkwOTgsNTkwOTksNTkxMDAsNTkxMDEsNTkxMDIsNTkxMDMsNTkxMDQsNTkxMDUsNTkxMDYsNTkxMDcsNTkxMDgsNTkxMDksNTkxMTAsNTkxMTEsNTkxMTIsNTkxMTMsNTkxMTQsNTkxMTUsNTkxMTYsNTkxMTcsNTkxMTgsNTkxMTksNTkxMjAsNTkxMjEsNTkxMjIsNTkxMjMsNTkxMjQsNTkxMjUsNTkxMjYsNTkxMjcsNTkxMjgsNTkxMjksNTkxMzAsNTkxMzEsNTkxMzIsNTkxMzMsNTkxMzQsNTkxMzUsNTkxMzYsNTkxMzcsNTkxMzgsNTkxMzksNTkxNDAsNTkxNDEsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsNTkyNjksNTkyNzAsNTkyNzEsNTkyNzIsNTkyNzMsNTkyNzQsNTkyNzUsNTkyNzYsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksNTkyNzcsNTkyNzgsNTkyNzksNTkyODAsNTkyODEsNTkyODIsNTkyODMsNjUwNzcsNjUwNzgsNjUwODEsNjUwODIsNjUwODcsNjUwODgsNjUwODUsNjUwODYsNjUwODksNjUwOTAsNjUwOTEsNjUwOTIsNTkyODQsNTkyODUsNjUwODMsNjUwODQsNjUwNzksNjUwODAsNjUwNzMsNTkyODYsNjUwNzUsNjUwNzYsNTkyODcsNTkyODgsNTkyODksNTkyOTAsNTkyOTEsNTkyOTIsNTkyOTMsNTkyOTQsNTkyOTUsNTkxNDIsNTkxNDMsNTkxNDQsNTkxNDUsNTkxNDYsNTkxNDcsNTkxNDgsNTkxNDksNTkxNTAsNTkxNTEsNTkxNTIsNTkxNTMsNTkxNTQsNTkxNTUsNTkxNTYsNTkxNTcsNTkxNTgsNTkxNTksNTkxNjAsNTkxNjEsNTkxNjIsNTkxNjMsNTkxNjQsNTkxNjUsNTkxNjYsNTkxNjcsNTkxNjgsNTkxNjksNTkxNzAsNTkxNzEsNTkxNzIsNTkxNzMsNTkxNzQsNTkxNzUsNTkxNzYsNTkxNzcsNTkxNzgsNTkxNzksNTkxODAsNTkxODEsNTkxODIsNTkxODMsNTkxODQsNTkxODUsNTkxODYsNTkxODcsNTkxODgsNTkxODksNTkxOTAsNTkxOTEsNTkxOTIsNTkxOTMsNTkxOTQsNTkxOTUsNTkxOTYsNTkxOTcsNTkxOTgsNTkxOTksNTkyMDAsNTkyMDEsNTkyMDIsNTkyMDMsNTkyMDQsNTkyMDUsNTkyMDYsNTkyMDcsNTkyMDgsNTkyMDksNTkyMTAsNTkyMTEsNTkyMTIsNTkyMTMsNTkyMTQsNTkyMTUsNTkyMTYsNTkyMTcsNTkyMTgsNTkyMTksNTkyMjAsNTkyMjEsNTkyMjIsNTkyMjMsNTkyMjQsNTkyMjUsNTkyMjYsNTkyMjcsNTkyMjgsNTkyMjksNTkyMzAsNTkyMzEsNTkyMzIsNTkyMzMsNTkyMzQsNTkyMzUsNTkyMzYsNTkyMzcsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTAyNSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsNTkyOTYsNTkyOTcsNTkyOTgsNTkyOTksNTkzMDAsNTkzMDEsNTkzMDIsNTkzMDMsNTkzMDQsNTkzMDUsNTkzMDYsNTkzMDcsNTkzMDgsNTkzMDksNTkzMTAsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTEwNSwxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsNTkzMTEsNTkzMTIsNTkzMTMsNTkzMTQsNTkzMTUsNTkzMTYsNTkzMTcsNTkzMTgsNTkzMTksNTkzMjAsNTkzMjEsNTkzMjIsNTkzMjMsNzE0LDcxNSw3MjksODIxMSw4MjEzLDgyMjksODI0NSw4NDUzLDg0NTcsODU5OCw4NTk5LDg2MDAsODYwMSw4NzI1LDg3MzUsODczOSw4Nzg2LDg4MDYsODgwNyw4ODk1LDk1NTIsOTU1Myw5NTU0LDk1NTUsOTU1Niw5NTU3LDk1NTgsOTU1OSw5NTYwLDk1NjEsOTU2Miw5NTYzLDk1NjQsOTU2NSw5NTY2LDk1NjcsOTU2OCw5NTY5LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCw5NTgxLDk1ODIsOTU4Myw5NTg0LDk1ODUsOTU4Niw5NTg3LDk2MDEsOTYwMiw5NjAzLDk2MDQsOTYwNSw5NjA2LDk2MDcsOTYwOCw5NjA5LDk2MTAsOTYxMSw5NjEyLDk2MTMsOTYxNCw5NjE1LDk2MTksOTYyMCw5NjIxLDk2NjAsOTY2MSw5Njk4LDk2OTksOTcwMCw5NzAxLDk3MzcsODg1MywxMjMwNiwxMjMxNywxMjMxOCw1OTMyNCw1OTMyNSw1OTMyNiw1OTMyNyw1OTMyOCw1OTMyOSw1OTMzMCw1OTMzMSw1OTMzMiw1OTMzMyw1OTMzNCwyNTcsMjI1LDQ2MiwyMjQsMjc1LDIzMywyODMsMjMyLDI5OSwyMzcsNDY0LDIzNiwzMzMsMjQzLDQ2NiwyNDIsMzYzLDI1MCw0NjgsMjQ5LDQ3MCw0NzIsNDc0LDQ3NiwyNTIsMjM0LDU5Myw3NzQzLDMyNCwzMjgsNTA1LDYwOSw1OTMzNyw1OTMzOCw1OTMzOSw1OTM0MCwxMjU0OSwxMjU1MCwxMjU1MSwxMjU1MiwxMjU1MywxMjU1NCwxMjU1NSwxMjU1NiwxMjU1NywxMjU1OCwxMjU1OSwxMjU2MCwxMjU2MSwxMjU2MiwxMjU2MywxMjU2NCwxMjU2NSwxMjU2NiwxMjU2NywxMjU2OCwxMjU2OSwxMjU3MCwxMjU3MSwxMjU3MiwxMjU3MywxMjU3NCwxMjU3NSwxMjU3NiwxMjU3NywxMjU3OCwxMjU3OSwxMjU4MCwxMjU4MSwxMjU4MiwxMjU4MywxMjU4NCwxMjU4NSw1OTM0MSw1OTM0Miw1OTM0Myw1OTM0NCw1OTM0NSw1OTM0Niw1OTM0Nyw1OTM0OCw1OTM0OSw1OTM1MCw1OTM1MSw1OTM1Miw1OTM1Myw1OTM1NCw1OTM1NSw1OTM1Niw1OTM1Nyw1OTM1OCw1OTM1OSw1OTM2MCw1OTM2MSwxMjMyMSwxMjMyMiwxMjMyMywxMjMyNCwxMjMyNSwxMjMyNiwxMjMyNywxMjMyOCwxMjMyOSwxMjk2MywxMzE5OCwxMzE5OSwxMzIxMiwxMzIxMywxMzIxNCwxMzIxNywxMzI1MiwxMzI2MiwxMzI2NSwxMzI2NiwxMzI2OSw2NTA3Miw2NTUwNiw2NTUwOCw1OTM2Miw4NDgxLDEyODQ5LDU5MzYzLDgyMDgsNTkzNjQsNTkzNjUsNTkzNjYsMTI1NDAsMTI0NDMsMTI0NDQsMTI1NDEsMTI1NDIsMTIyOTQsMTI0NDUsMTI0NDYsNjUwOTcsNjUwOTgsNjUwOTksNjUxMDAsNjUxMDEsNjUxMDIsNjUxMDMsNjUxMDQsNjUxMDUsNjUxMDYsNjUxMDgsNjUxMDksNjUxMTAsNjUxMTEsNjUxMTMsNjUxMTQsNjUxMTUsNjUxMTYsNjUxMTcsNjUxMTgsNjUxMTksNjUxMjAsNjUxMjEsNjUxMjIsNjUxMjMsNjUxMjQsNjUxMjUsNjUxMjYsNjUxMjgsNjUxMjksNjUxMzAsNjUxMzEsMTIzNTAsMTIyNzIsMTIyNzMsMTIyNzQsMTIyNzUsMTIyNzYsMTIyNzcsMTIyNzgsMTIyNzksMTIyODAsMTIyODEsMTIyODIsMTIyODMsMTIyOTUsNTkzODAsNTkzODEsNTkzODIsNTkzODMsNTkzODQsNTkzODUsNTkzODYsNTkzODcsNTkzODgsNTkzODksNTkzOTAsNTkzOTEsNTkzOTIsOTQ3Miw5NDczLDk0NzQsOTQ3NSw5NDc2LDk0NzcsOTQ3OCw5NDc5LDk0ODAsOTQ4MSw5NDgyLDk0ODMsOTQ4NCw5NDg1LDk0ODYsOTQ4Nyw5NDg4LDk0ODksOTQ5MCw5NDkxLDk0OTIsOTQ5Myw5NDk0LDk0OTUsOTQ5Niw5NDk3LDk0OTgsOTQ5OSw5NTAwLDk1MDEsOTUwMiw5NTAzLDk1MDQsOTUwNSw5NTA2LDk1MDcsOTUwOCw5NTA5LDk1MTAsOTUxMSw5NTEyLDk1MTMsOTUxNCw5NTE1LDk1MTYsOTUxNyw5NTE4LDk1MTksOTUyMCw5NTIxLDk1MjIsOTUyMyw5NTI0LDk1MjUsOTUyNiw5NTI3LDk1MjgsOTUyOSw5NTMwLDk1MzEsOTUzMiw5NTMzLDk1MzQsOTUzNSw5NTM2LDk1MzcsOTUzOCw5NTM5LDk1NDAsOTU0MSw5NTQyLDk1NDMsOTU0NCw5NTQ1LDk1NDYsOTU0Nyw1OTM5Myw1OTM5NCw1OTM5NSw1OTM5Niw1OTM5Nyw1OTM5OCw1OTM5OSw1OTQwMCw1OTQwMSw1OTQwMiw1OTQwMyw1OTQwNCw1OTQwNSw1OTQwNiw1OTQwNywyOTQwNCwyOTQwNSwyOTQwNywyOTQxMCwyOTQxMSwyOTQxMiwyOTQxMywyOTQxNCwyOTQxNSwyOTQxOCwyOTQxOSwyOTQyOSwyOTQzMCwyOTQzMywyOTQzNywyOTQzOCwyOTQzOSwyOTQ0MCwyOTQ0MiwyOTQ0NCwyOTQ0NSwyOTQ0NiwyOTQ0NywyOTQ0OCwyOTQ0OSwyOTQ1MSwyOTQ1MiwyOTQ1MywyOTQ1NSwyOTQ1NiwyOTQ1NywyOTQ1OCwyOTQ2MCwyOTQ2NCwyOTQ2NSwyOTQ2NiwyOTQ3MSwyOTQ3MiwyOTQ3NSwyOTQ3NiwyOTQ3OCwyOTQ3OSwyOTQ4MCwyOTQ4NSwyOTQ4NywyOTQ4OCwyOTQ5MCwyOTQ5MSwyOTQ5MywyOTQ5NCwyOTQ5OCwyOTQ5OSwyOTUwMCwyOTUwMSwyOTUwNCwyOTUwNSwyOTUwNiwyOTUwNywyOTUwOCwyOTUwOSwyOTUxMCwyOTUxMSwyOTUxMiwyOTUxMywyOTUxNCwyOTUxNSwyOTUxNiwyOTUxOCwyOTUxOSwyOTUyMSwyOTUyMywyOTUyNCwyOTUyNSwyOTUyNiwyOTUyOCwyOTUyOSwyOTUzMCwyOTUzMSwyOTUzMiwyOTUzMywyOTUzNCwyOTUzNSwyOTUzNywyOTUzOCwyOTUzOSwyOTU0MCwyOTU0MSwyOTU0MiwyOTU0MywyOTU0NCwyOTU0NSwyOTU0NiwyOTU0NywyOTU1MCwyOTU1MiwyOTU1Myw1NzM0NCw1NzM0NSw1NzM0Niw1NzM0Nyw1NzM0OCw1NzM0OSw1NzM1MCw1NzM1MSw1NzM1Miw1NzM1Myw1NzM1NCw1NzM1NSw1NzM1Niw1NzM1Nyw1NzM1OCw1NzM1OSw1NzM2MCw1NzM2MSw1NzM2Miw1NzM2Myw1NzM2NCw1NzM2NSw1NzM2Niw1NzM2Nyw1NzM2OCw1NzM2OSw1NzM3MCw1NzM3MSw1NzM3Miw1NzM3Myw1NzM3NCw1NzM3NSw1NzM3Niw1NzM3Nyw1NzM3OCw1NzM3OSw1NzM4MCw1NzM4MSw1NzM4Miw1NzM4Myw1NzM4NCw1NzM4NSw1NzM4Niw1NzM4Nyw1NzM4OCw1NzM4OSw1NzM5MCw1NzM5MSw1NzM5Miw1NzM5Myw1NzM5NCw1NzM5NSw1NzM5Niw1NzM5Nyw1NzM5OCw1NzM5OSw1NzQwMCw1NzQwMSw1NzQwMiw1NzQwMyw1NzQwNCw1NzQwNSw1NzQwNiw1NzQwNyw1NzQwOCw1NzQwOSw1NzQxMCw1NzQxMSw1NzQxMiw1NzQxMyw1NzQxNCw1NzQxNSw1NzQxNiw1NzQxNyw1NzQxOCw1NzQxOSw1NzQyMCw1NzQyMSw1NzQyMiw1NzQyMyw1NzQyNCw1NzQyNSw1NzQyNiw1NzQyNyw1NzQyOCw1NzQyOSw1NzQzMCw1NzQzMSw1NzQzMiw1NzQzMyw1NzQzNCw1NzQzNSw1NzQzNiw1NzQzNywyOTU1NCwyOTU1NSwyOTU1NiwyOTU1NywyOTU1OCwyOTU1OSwyOTU2MCwyOTU2MSwyOTU2MiwyOTU2MywyOTU2NCwyOTU2NSwyOTU2NywyOTU2OCwyOTU2OSwyOTU3MCwyOTU3MSwyOTU3MywyOTU3NCwyOTU3NiwyOTU3OCwyOTU4MCwyOTU4MSwyOTU4MywyOTU4NCwyOTU4NiwyOTU4NywyOTU4OCwyOTU4OSwyOTU5MSwyOTU5MiwyOTU5MywyOTU5NCwyOTU5NiwyOTU5NywyOTU5OCwyOTYwMCwyOTYwMSwyOTYwMywyOTYwNCwyOTYwNSwyOTYwNiwyOTYwNywyOTYwOCwyOTYxMCwyOTYxMiwyOTYxMywyOTYxNywyOTYyMCwyOTYyMSwyOTYyMiwyOTYyNCwyOTYyNSwyOTYyOCwyOTYyOSwyOTYzMCwyOTYzMSwyOTYzMywyOTYzNSwyOTYzNiwyOTYzNywyOTYzOCwyOTYzOSwyOTY0MywyOTY0NCwyOTY0NiwyOTY1MCwyOTY1MSwyOTY1MiwyOTY1MywyOTY1NCwyOTY1NSwyOTY1NiwyOTY1OCwyOTY1OSwyOTY2MCwyOTY2MSwyOTY2MywyOTY2NSwyOTY2NiwyOTY2NywyOTY2OCwyOTY3MCwyOTY3MiwyOTY3NCwyOTY3NSwyOTY3NiwyOTY3OCwyOTY3OSwyOTY4MCwyOTY4MSwyOTY4MywyOTY4NCwyOTY4NSwyOTY4NiwyOTY4Nyw1NzQzOCw1NzQzOSw1NzQ0MCw1NzQ0MSw1NzQ0Miw1NzQ0Myw1NzQ0NCw1NzQ0NSw1NzQ0Niw1NzQ0Nyw1NzQ0OCw1NzQ0OSw1NzQ1MCw1NzQ1MSw1NzQ1Miw1NzQ1Myw1NzQ1NCw1NzQ1NSw1NzQ1Niw1NzQ1Nyw1NzQ1OCw1NzQ1OSw1NzQ2MCw1NzQ2MSw1NzQ2Miw1NzQ2Myw1NzQ2NCw1NzQ2NSw1NzQ2Niw1NzQ2Nyw1NzQ2OCw1NzQ2OSw1NzQ3MCw1NzQ3MSw1NzQ3Miw1NzQ3Myw1NzQ3NCw1NzQ3NSw1NzQ3Niw1NzQ3Nyw1NzQ3OCw1NzQ3OSw1NzQ4MCw1NzQ4MSw1NzQ4Miw1NzQ4Myw1NzQ4NCw1NzQ4NSw1NzQ4Niw1NzQ4Nyw1NzQ4OCw1NzQ4OSw1NzQ5MCw1NzQ5MSw1NzQ5Miw1NzQ5Myw1NzQ5NCw1NzQ5NSw1NzQ5Niw1NzQ5Nyw1NzQ5OCw1NzQ5OSw1NzUwMCw1NzUwMSw1NzUwMiw1NzUwMyw1NzUwNCw1NzUwNSw1NzUwNiw1NzUwNyw1NzUwOCw1NzUwOSw1NzUxMCw1NzUxMSw1NzUxMiw1NzUxMyw1NzUxNCw1NzUxNSw1NzUxNiw1NzUxNyw1NzUxOCw1NzUxOSw1NzUyMCw1NzUyMSw1NzUyMiw1NzUyMyw1NzUyNCw1NzUyNSw1NzUyNiw1NzUyNyw1NzUyOCw1NzUyOSw1NzUzMCw1NzUzMSwyOTY4OCwyOTY4OSwyOTY5MCwyOTY5MSwyOTY5MiwyOTY5MywyOTY5NCwyOTY5NSwyOTY5NiwyOTY5NywyOTY5OCwyOTcwMCwyOTcwMywyOTcwNCwyOTcwNywyOTcwOCwyOTcwOSwyOTcxMCwyOTcxMywyOTcxNCwyOTcxNSwyOTcxNiwyOTcxNywyOTcxOCwyOTcxOSwyOTcyMCwyOTcyMSwyOTcyNCwyOTcyNSwyOTcyNiwyOTcyNywyOTcyOCwyOTcyOSwyOTczMSwyOTczMiwyOTczNSwyOTczNywyOTczOSwyOTc0MSwyOTc0MywyOTc0NSwyOTc0NiwyOTc1MSwyOTc1MiwyOTc1MywyOTc1NCwyOTc1NSwyOTc1NywyOTc1OCwyOTc1OSwyOTc2MCwyOTc2MiwyOTc2MywyOTc2NCwyOTc2NSwyOTc2NiwyOTc2NywyOTc2OCwyOTc2OSwyOTc3MCwyOTc3MSwyOTc3MiwyOTc3MywyOTc3NCwyOTc3NSwyOTc3NiwyOTc3NywyOTc3OCwyOTc3OSwyOTc4MCwyOTc4MiwyOTc4NCwyOTc4OSwyOTc5MiwyOTc5MywyOTc5NCwyOTc5NSwyOTc5NiwyOTc5NywyOTc5OCwyOTc5OSwyOTgwMCwyOTgwMSwyOTgwMiwyOTgwMywyOTgwNCwyOTgwNiwyOTgwNywyOTgwOSwyOTgxMCwyOTgxMSwyOTgxMiwyOTgxMywyOTgxNiwyOTgxNywyOTgxOCw1NzUzMiw1NzUzMyw1NzUzNCw1NzUzNSw1NzUzNiw1NzUzNyw1NzUzOCw1NzUzOSw1NzU0MCw1NzU0MSw1NzU0Miw1NzU0Myw1NzU0NCw1NzU0NSw1NzU0Niw1NzU0Nyw1NzU0OCw1NzU0OSw1NzU1MCw1NzU1MSw1NzU1Miw1NzU1Myw1NzU1NCw1NzU1NSw1NzU1Niw1NzU1Nyw1NzU1OCw1NzU1OSw1NzU2MCw1NzU2MSw1NzU2Miw1NzU2Myw1NzU2NCw1NzU2NSw1NzU2Niw1NzU2Nyw1NzU2OCw1NzU2OSw1NzU3MCw1NzU3MSw1NzU3Miw1NzU3Myw1NzU3NCw1NzU3NSw1NzU3Niw1NzU3Nyw1NzU3OCw1NzU3OSw1NzU4MCw1NzU4MSw1NzU4Miw1NzU4Myw1NzU4NCw1NzU4NSw1NzU4Niw1NzU4Nyw1NzU4OCw1NzU4OSw1NzU5MCw1NzU5MSw1NzU5Miw1NzU5Myw1NzU5NCw1NzU5NSw1NzU5Niw1NzU5Nyw1NzU5OCw1NzU5OSw1NzYwMCw1NzYwMSw1NzYwMiw1NzYwMyw1NzYwNCw1NzYwNSw1NzYwNiw1NzYwNyw1NzYwOCw1NzYwOSw1NzYxMCw1NzYxMSw1NzYxMiw1NzYxMyw1NzYxNCw1NzYxNSw1NzYxNiw1NzYxNyw1NzYxOCw1NzYxOSw1NzYyMCw1NzYyMSw1NzYyMiw1NzYyMyw1NzYyNCw1NzYyNSwyOTgxOSwyOTgyMCwyOTgyMSwyOTgyMywyOTgyNiwyOTgyOCwyOTgyOSwyOTgzMCwyOTgzMiwyOTgzMywyOTgzNCwyOTgzNiwyOTgzNywyOTgzOSwyOTg0MSwyOTg0MiwyOTg0MywyOTg0NCwyOTg0NSwyOTg0NiwyOTg0NywyOTg0OCwyOTg0OSwyOTg1MCwyOTg1MSwyOTg1MywyOTg1NSwyOTg1NiwyOTg1NywyOTg1OCwyOTg1OSwyOTg2MCwyOTg2MSwyOTg2MiwyOTg2NiwyOTg2NywyOTg2OCwyOTg2OSwyOTg3MCwyOTg3MSwyOTg3MiwyOTg3MywyOTg3NCwyOTg3NSwyOTg3NiwyOTg3NywyOTg3OCwyOTg3OSwyOTg4MCwyOTg4MSwyOTg4MywyOTg4NCwyOTg4NSwyOTg4NiwyOTg4NywyOTg4OCwyOTg4OSwyOTg5MCwyOTg5MSwyOTg5MiwyOTg5MywyOTg5NCwyOTg5NSwyOTg5NiwyOTg5NywyOTg5OCwyOTg5OSwyOTkwMCwyOTkwMSwyOTkwMiwyOTkwMywyOTkwNCwyOTkwNSwyOTkwNywyOTkwOCwyOTkwOSwyOTkxMCwyOTkxMSwyOTkxMiwyOTkxMywyOTkxNCwyOTkxNSwyOTkxNywyOTkxOSwyOTkyMSwyOTkyNSwyOTkyNywyOTkyOCwyOTkyOSwyOTkzMCwyOTkzMSwyOTkzMiwyOTkzMywyOTkzNiwyOTkzNywyOTkzOCw1NzYyNiw1NzYyNyw1NzYyOCw1NzYyOSw1NzYzMCw1NzYzMSw1NzYzMiw1NzYzMyw1NzYzNCw1NzYzNSw1NzYzNiw1NzYzNyw1NzYzOCw1NzYzOSw1NzY0MCw1NzY0MSw1NzY0Miw1NzY0Myw1NzY0NCw1NzY0NSw1NzY0Niw1NzY0Nyw1NzY0OCw1NzY0OSw1NzY1MCw1NzY1MSw1NzY1Miw1NzY1Myw1NzY1NCw1NzY1NSw1NzY1Niw1NzY1Nyw1NzY1OCw1NzY1OSw1NzY2MCw1NzY2MSw1NzY2Miw1NzY2Myw1NzY2NCw1NzY2NSw1NzY2Niw1NzY2Nyw1NzY2OCw1NzY2OSw1NzY3MCw1NzY3MSw1NzY3Miw1NzY3Myw1NzY3NCw1NzY3NSw1NzY3Niw1NzY3Nyw1NzY3OCw1NzY3OSw1NzY4MCw1NzY4MSw1NzY4Miw1NzY4Myw1NzY4NCw1NzY4NSw1NzY4Niw1NzY4Nyw1NzY4OCw1NzY4OSw1NzY5MCw1NzY5MSw1NzY5Miw1NzY5Myw1NzY5NCw1NzY5NSw1NzY5Niw1NzY5Nyw1NzY5OCw1NzY5OSw1NzcwMCw1NzcwMSw1NzcwMiw1NzcwMyw1NzcwNCw1NzcwNSw1NzcwNiw1NzcwNyw1NzcwOCw1NzcwOSw1NzcxMCw1NzcxMSw1NzcxMiw1NzcxMyw1NzcxNCw1NzcxNSw1NzcxNiw1NzcxNyw1NzcxOCw1NzcxOSwyOTkzOSwyOTk0MSwyOTk0NCwyOTk0NSwyOTk0NiwyOTk0NywyOTk0OCwyOTk0OSwyOTk1MCwyOTk1MiwyOTk1MywyOTk1NCwyOTk1NSwyOTk1NywyOTk1OCwyOTk1OSwyOTk2MCwyOTk2MSwyOTk2MiwyOTk2MywyOTk2NCwyOTk2NiwyOTk2OCwyOTk3MCwyOTk3MiwyOTk3MywyOTk3NCwyOTk3NSwyOTk3OSwyOTk4MSwyOTk4MiwyOTk4NCwyOTk4NSwyOTk4NiwyOTk4NywyOTk4OCwyOTk5MCwyOTk5MSwyOTk5NCwyOTk5OCwzMDAwNCwzMDAwNiwzMDAwOSwzMDAxMiwzMDAxMywzMDAxNSwzMDAxNywzMDAxOCwzMDAxOSwzMDAyMCwzMDAyMiwzMDAyMywzMDAyNSwzMDAyNiwzMDAyOSwzMDAzMiwzMDAzMywzMDAzNCwzMDAzNSwzMDAzNywzMDAzOCwzMDAzOSwzMDA0MCwzMDA0NSwzMDA0NiwzMDA0NywzMDA0OCwzMDA0OSwzMDA1MCwzMDA1MSwzMDA1MiwzMDA1NSwzMDA1NiwzMDA1NywzMDA1OSwzMDA2MCwzMDA2MSwzMDA2MiwzMDA2MywzMDA2NCwzMDA2NSwzMDA2NywzMDA2OSwzMDA3MCwzMDA3MSwzMDA3NCwzMDA3NSwzMDA3NiwzMDA3NywzMDA3OCwzMDA4MCwzMDA4MSwzMDA4MiwzMDA4NCwzMDA4NSwzMDA4Nyw1NzcyMCw1NzcyMSw1NzcyMiw1NzcyMyw1NzcyNCw1NzcyNSw1NzcyNiw1NzcyNyw1NzcyOCw1NzcyOSw1NzczMCw1NzczMSw1NzczMiw1NzczMyw1NzczNCw1NzczNSw1NzczNiw1NzczNyw1NzczOCw1NzczOSw1Nzc0MCw1Nzc0MSw1Nzc0Miw1Nzc0Myw1Nzc0NCw1Nzc0NSw1Nzc0Niw1Nzc0Nyw1Nzc0OCw1Nzc0OSw1Nzc1MCw1Nzc1MSw1Nzc1Miw1Nzc1Myw1Nzc1NCw1Nzc1NSw1Nzc1Niw1Nzc1Nyw1Nzc1OCw1Nzc1OSw1Nzc2MCw1Nzc2MSw1Nzc2Miw1Nzc2Myw1Nzc2NCw1Nzc2NSw1Nzc2Niw1Nzc2Nyw1Nzc2OCw1Nzc2OSw1Nzc3MCw1Nzc3MSw1Nzc3Miw1Nzc3Myw1Nzc3NCw1Nzc3NSw1Nzc3Niw1Nzc3Nyw1Nzc3OCw1Nzc3OSw1Nzc4MCw1Nzc4MSw1Nzc4Miw1Nzc4Myw1Nzc4NCw1Nzc4NSw1Nzc4Niw1Nzc4Nyw1Nzc4OCw1Nzc4OSw1Nzc5MCw1Nzc5MSw1Nzc5Miw1Nzc5Myw1Nzc5NCw1Nzc5NSw1Nzc5Niw1Nzc5Nyw1Nzc5OCw1Nzc5OSw1NzgwMCw1NzgwMSw1NzgwMiw1NzgwMyw1NzgwNCw1NzgwNSw1NzgwNiw1NzgwNyw1NzgwOCw1NzgwOSw1NzgxMCw1NzgxMSw1NzgxMiw1NzgxMywzMDA4OCwzMDA4OSwzMDA5MCwzMDA5MiwzMDA5MywzMDA5NCwzMDA5NiwzMDA5OSwzMDEwMSwzMDEwNCwzMDEwNywzMDEwOCwzMDExMCwzMDExNCwzMDExOCwzMDExOSwzMDEyMCwzMDEyMSwzMDEyMiwzMDEyNSwzMDEzNCwzMDEzNSwzMDEzOCwzMDEzOSwzMDE0MywzMDE0NCwzMDE0NSwzMDE1MCwzMDE1NSwzMDE1NiwzMDE1OCwzMDE1OSwzMDE2MCwzMDE2MSwzMDE2MywzMDE2NywzMDE2OSwzMDE3MCwzMDE3MiwzMDE3MywzMDE3NSwzMDE3NiwzMDE3NywzMDE4MSwzMDE4NSwzMDE4OCwzMDE4OSwzMDE5MCwzMDE5MSwzMDE5NCwzMDE5NSwzMDE5NywzMDE5OCwzMDE5OSwzMDIwMCwzMDIwMiwzMDIwMywzMDIwNSwzMDIwNiwzMDIxMCwzMDIxMiwzMDIxNCwzMDIxNSwzMDIxNiwzMDIxNywzMDIxOSwzMDIyMSwzMDIyMiwzMDIyMywzMDIyNSwzMDIyNiwzMDIyNywzMDIyOCwzMDIzMCwzMDIzNCwzMDIzNiwzMDIzNywzMDIzOCwzMDI0MSwzMDI0MywzMDI0NywzMDI0OCwzMDI1MiwzMDI1NCwzMDI1NSwzMDI1NywzMDI1OCwzMDI2MiwzMDI2MywzMDI2NSwzMDI2NiwzMDI2NywzMDI2OSwzMDI3MywzMDI3NCwzMDI3Niw1NzgxNCw1NzgxNSw1NzgxNiw1NzgxNyw1NzgxOCw1NzgxOSw1NzgyMCw1NzgyMSw1NzgyMiw1NzgyMyw1NzgyNCw1NzgyNSw1NzgyNiw1NzgyNyw1NzgyOCw1NzgyOSw1NzgzMCw1NzgzMSw1NzgzMiw1NzgzMyw1NzgzNCw1NzgzNSw1NzgzNiw1NzgzNyw1NzgzOCw1NzgzOSw1Nzg0MCw1Nzg0MSw1Nzg0Miw1Nzg0Myw1Nzg0NCw1Nzg0NSw1Nzg0Niw1Nzg0Nyw1Nzg0OCw1Nzg0OSw1Nzg1MCw1Nzg1MSw1Nzg1Miw1Nzg1Myw1Nzg1NCw1Nzg1NSw1Nzg1Niw1Nzg1Nyw1Nzg1OCw1Nzg1OSw1Nzg2MCw1Nzg2MSw1Nzg2Miw1Nzg2Myw1Nzg2NCw1Nzg2NSw1Nzg2Niw1Nzg2Nyw1Nzg2OCw1Nzg2OSw1Nzg3MCw1Nzg3MSw1Nzg3Miw1Nzg3Myw1Nzg3NCw1Nzg3NSw1Nzg3Niw1Nzg3Nyw1Nzg3OCw1Nzg3OSw1Nzg4MCw1Nzg4MSw1Nzg4Miw1Nzg4Myw1Nzg4NCw1Nzg4NSw1Nzg4Niw1Nzg4Nyw1Nzg4OCw1Nzg4OSw1Nzg5MCw1Nzg5MSw1Nzg5Miw1Nzg5Myw1Nzg5NCw1Nzg5NSw1Nzg5Niw1Nzg5Nyw1Nzg5OCw1Nzg5OSw1NzkwMCw1NzkwMSw1NzkwMiw1NzkwMyw1NzkwNCw1NzkwNSw1NzkwNiw1NzkwNywzMDI3NywzMDI3OCwzMDI3OSwzMDI4MCwzMDI4MSwzMDI4MiwzMDI4MywzMDI4NiwzMDI4NywzMDI4OCwzMDI4OSwzMDI5MCwzMDI5MSwzMDI5MywzMDI5NSwzMDI5NiwzMDI5NywzMDI5OCwzMDI5OSwzMDMwMSwzMDMwMywzMDMwNCwzMDMwNSwzMDMwNiwzMDMwOCwzMDMwOSwzMDMxMCwzMDMxMSwzMDMxMiwzMDMxMywzMDMxNCwzMDMxNiwzMDMxNywzMDMxOCwzMDMyMCwzMDMyMSwzMDMyMiwzMDMyMywzMDMyNCwzMDMyNSwzMDMyNiwzMDMyNywzMDMyOSwzMDMzMCwzMDMzMiwzMDMzNSwzMDMzNiwzMDMzNywzMDMzOSwzMDM0MSwzMDM0NSwzMDM0NiwzMDM0OCwzMDM0OSwzMDM1MSwzMDM1MiwzMDM1NCwzMDM1NiwzMDM1NywzMDM1OSwzMDM2MCwzMDM2MiwzMDM2MywzMDM2NCwzMDM2NSwzMDM2NiwzMDM2NywzMDM2OCwzMDM2OSwzMDM3MCwzMDM3MSwzMDM3MywzMDM3NCwzMDM3NSwzMDM3NiwzMDM3NywzMDM3OCwzMDM3OSwzMDM4MCwzMDM4MSwzMDM4MywzMDM4NCwzMDM4NywzMDM4OSwzMDM5MCwzMDM5MSwzMDM5MiwzMDM5MywzMDM5NCwzMDM5NSwzMDM5NiwzMDM5NywzMDM5OCwzMDQwMCwzMDQwMSwzMDQwMywyMTgzNCwzODQ2MywyMjQ2NywyNTM4NCwyMTcxMCwyMTc2OSwyMTY5NiwzMDM1MywzMDI4NCwzNDEwOCwzMDcwMiwzMzQwNiwzMDg2MSwyOTIzMywzODU1MiwzODc5NywyNzY4OCwyMzQzMywyMDQ3NCwyNTM1MywyNjI2MywyMzczNiwzMzAxOCwyNjY5NiwzMjk0MiwyNjExNCwzMDQxNCwyMDk4NSwyNTk0MiwyOTEwMCwzMjc1MywzNDk0OCwyMDY1OCwyMjg4NSwyNTAzNCwyODU5NSwzMzQ1MywyNTQyMCwyNTE3MCwyMTQ4NSwyMTU0MywzMTQ5NCwyMDg0MywzMDExNiwyNDA1MiwyNTMwMCwzNjI5OSwzODc3NCwyNTIyNiwzMjc5MywyMjM2NSwzODcxMiwzMjYxMCwyOTI0MCwzMDMzMywyNjU3NSwzMDMzNCwyNTY3MCwyMDMzNiwzNjEzMywyNTMwOCwzMTI1NSwyNjAwMSwyOTY3NywyNTY0NCwyNTIwMywzMzMyNCwzOTA0MSwyNjQ5NSwyOTI1NiwyNTE5OCwyNTI5MiwyMDI3NiwyOTkyMywyMTMyMiwyMTE1MCwzMjQ1OCwzNzAzMCwyNDExMCwyNjc1OCwyNzAzNiwzMzE1MiwzMjQ2NSwyNjgzNCwzMDkxNywzNDQ0NCwzODIyNSwyMDYyMSwzNTg3NiwzMzUwMiwzMjk5MCwyMTI1MywzNTA5MCwyMTA5MywzMDQwNCwzMDQwNywzMDQwOSwzMDQxMSwzMDQxMiwzMDQxOSwzMDQyMSwzMDQyNSwzMDQyNiwzMDQyOCwzMDQyOSwzMDQzMCwzMDQzMiwzMDQzMywzMDQzNCwzMDQzNSwzMDQzNiwzMDQzOCwzMDQzOSwzMDQ0MCwzMDQ0MSwzMDQ0MiwzMDQ0MywzMDQ0NCwzMDQ0NSwzMDQ0OCwzMDQ1MSwzMDQ1MywzMDQ1NCwzMDQ1NSwzMDQ1OCwzMDQ1OSwzMDQ2MSwzMDQ2MywzMDQ2NCwzMDQ2NiwzMDQ2NywzMDQ2OSwzMDQ3MCwzMDQ3NCwzMDQ3NiwzMDQ3OCwzMDQ3OSwzMDQ4MCwzMDQ4MSwzMDQ4MiwzMDQ4MywzMDQ4NCwzMDQ4NSwzMDQ4NiwzMDQ4NywzMDQ4OCwzMDQ5MSwzMDQ5MiwzMDQ5MywzMDQ5NCwzMDQ5NywzMDQ5OSwzMDUwMCwzMDUwMSwzMDUwMywzMDUwNiwzMDUwNywzMDUwOCwzMDUxMCwzMDUxMiwzMDUxMywzMDUxNCwzMDUxNSwzMDUxNiwzMDUyMSwzMDUyMywzMDUyNSwzMDUyNiwzMDUyNywzMDUzMCwzMDUzMiwzMDUzMywzMDUzNCwzMDUzNiwzMDUzNywzMDUzOCwzMDUzOSwzMDU0MCwzMDU0MSwzMDU0MiwzMDU0MywzMDU0NiwzMDU0NywzMDU0OCwzMDU0OSwzMDU1MCwzMDU1MSwzMDU1MiwzMDU1MywzMDU1NiwzNDE4MCwzODY0OSwyMDQ0NSwyMjU2MSwzOTI4MSwyMzQ1MywyNTI2NSwyNTI1MywyNjI5MiwzNTk2MSw0MDA3NywyOTE5MCwyNjQ3OSwzMDg2NSwyNDc1NCwyMTMyOSwyMTI3MSwzNjc0NCwzMjk3MiwzNjEyNSwzODA0OSwyMDQ5MywyOTM4NCwyMjc5MSwyNDgxMSwyODk1MywzNDk4NywyMjg2OCwzMzUxOSwyNjQxMiwzMTUyOCwyMzg0OSwzMjUwMywyOTk5NywyNzg5MywzNjQ1NCwzNjg1NiwzNjkyNCw0MDc2MywyNzYwNCwzNzE0NSwzMTUwOCwyNDQ0NCwzMDg4NywzNDAwNiwzNDEwOSwyNzYwNSwyNzYwOSwyNzYwNiwyNDA2NSwyNDE5OSwzMDIwMSwzODM4MSwyNTk0OSwyNDMzMCwyNDUxNywzNjc2NywyMjcyMSwzMzIxOCwzNjk5MSwzODQ5MSwzODgyOSwzNjc5MywzMjUzNCwzNjE0MCwyNTE1MywyMDQxNSwyMTQ2NCwyMTM0MiwzNjc3NiwzNjc3NywzNjc3OSwzNjk0MSwyNjYzMSwyNDQyNiwzMzE3NiwzNDkyMCw0MDE1MCwyNDk3MSwyMTAzNSwzMDI1MCwyNDQyOCwyNTk5NiwyODYyNiwyODM5MiwyMzQ4NiwyNTY3MiwyMDg1MywyMDkxMiwyNjU2NCwxOTk5MywzMTE3NywzOTI5MiwyODg1MSwzMDU1NywzMDU1OCwzMDU1OSwzMDU2MCwzMDU2NCwzMDU2NywzMDU2OSwzMDU3MCwzMDU3MywzMDU3NCwzMDU3NSwzMDU3NiwzMDU3NywzMDU3OCwzMDU3OSwzMDU4MCwzMDU4MSwzMDU4MiwzMDU4MywzMDU4NCwzMDU4NiwzMDU4NywzMDU4OCwzMDU5MywzMDU5NCwzMDU5NSwzMDU5OCwzMDU5OSwzMDYwMCwzMDYwMSwzMDYwMiwzMDYwMywzMDYwNywzMDYwOCwzMDYxMSwzMDYxMiwzMDYxMywzMDYxNCwzMDYxNSwzMDYxNiwzMDYxNywzMDYxOCwzMDYxOSwzMDYyMCwzMDYyMSwzMDYyMiwzMDYyNSwzMDYyNywzMDYyOCwzMDYzMCwzMDYzMiwzMDYzNSwzMDYzNywzMDYzOCwzMDYzOSwzMDY0MSwzMDY0MiwzMDY0NCwzMDY0NiwzMDY0NywzMDY0OCwzMDY0OSwzMDY1MCwzMDY1MiwzMDY1NCwzMDY1NiwzMDY1NywzMDY1OCwzMDY1OSwzMDY2MCwzMDY2MSwzMDY2MiwzMDY2MywzMDY2NCwzMDY2NSwzMDY2NiwzMDY2NywzMDY2OCwzMDY3MCwzMDY3MSwzMDY3MiwzMDY3MywzMDY3NCwzMDY3NSwzMDY3NiwzMDY3NywzMDY3OCwzMDY4MCwzMDY4MSwzMDY4MiwzMDY4NSwzMDY4NiwzMDY4NywzMDY4OCwzMDY4OSwzMDY5MiwzMDE0OSwyNDE4MiwyOTYyNywzMzc2MCwyNTc3MywyNTMyMCwzODA2OSwyNzg3NCwyMTMzOCwyMTE4NywyNTYxNSwzODA4MiwzMTYzNiwyMDI3MSwyNDA5MSwzMzMzNCwzMzA0NiwzMzE2MiwyODE5NiwyNzg1MCwzOTUzOSwyNTQyOSwyMTM0MCwyMTc1NCwzNDkxNywyMjQ5NiwxOTk4MSwyNDA2NywyNzQ5MywzMTgwNywzNzA5NiwyNDU5OCwyNTgzMCwyOTQ2OCwzNTAwOSwyNjQ0OCwyNTE2NSwzNjEzMCwzMDU3MiwzNjM5MywzNzMxOSwyNDQyNSwzMzc1NiwzNDA4MSwzOTE4NCwyMTQ0MiwzNDQ1MywyNzUzMSwyNDgxMywyNDgwOCwyODc5OSwzMzQ4NSwzMzMyOSwyMDE3OSwyNzgxNSwzNDI1NSwyNTgwNSwzMTk2MSwyNzEzMywyNjM2MSwzMzYwOSwyMTM5NywzMTU3NCwyMDM5MSwyMDg3NiwyNzk3OSwyMzYxOCwzNjQ2MSwyNTU1NCwyMTQ0OSwzMzU4MCwzMzU5MCwyNjU5NywzMDkwMCwyNTY2MSwyMzUxOSwyMzcwMCwyNDA0NiwzNTgxNSwyNTI4NiwyNjYxMiwzNTk2MiwyNTYwMCwyNTUzMCwzNDYzMywzOTMwNywzNTg2MywzMjU0NCwzODEzMCwyMDEzNSwzODQxNiwzOTA3NiwyNjEyNCwyOTQ2MiwzMDY5NCwzMDY5NiwzMDY5OCwzMDcwMywzMDcwNCwzMDcwNSwzMDcwNiwzMDcwOCwzMDcwOSwzMDcxMSwzMDcxMywzMDcxNCwzMDcxNSwzMDcxNiwzMDcyMywzMDcyNCwzMDcyNSwzMDcyNiwzMDcyNywzMDcyOCwzMDczMCwzMDczMSwzMDczNCwzMDczNSwzMDczNiwzMDczOSwzMDc0MSwzMDc0NSwzMDc0NywzMDc1MCwzMDc1MiwzMDc1MywzMDc1NCwzMDc1NiwzMDc2MCwzMDc2MiwzMDc2MywzMDc2NiwzMDc2NywzMDc2OSwzMDc3MCwzMDc3MSwzMDc3MywzMDc3NCwzMDc4MSwzMDc4MywzMDc4NSwzMDc4NiwzMDc4NywzMDc4OCwzMDc5MCwzMDc5MiwzMDc5MywzMDc5NCwzMDc5NSwzMDc5NywzMDc5OSwzMDgwMSwzMDgwMywzMDgwNCwzMDgwOCwzMDgwOSwzMDgxMCwzMDgxMSwzMDgxMiwzMDgxNCwzMDgxNSwzMDgxNiwzMDgxNywzMDgxOCwzMDgxOSwzMDgyMCwzMDgyMSwzMDgyMiwzMDgyMywzMDgyNCwzMDgyNSwzMDgzMSwzMDgzMiwzMDgzMywzMDgzNCwzMDgzNSwzMDgzNiwzMDgzNywzMDgzOCwzMDg0MCwzMDg0MSwzMDg0MiwzMDg0MywzMDg0NSwzMDg0NiwzMDg0NywzMDg0OCwzMDg0OSwzMDg1MCwzMDg1MSwyMjMzMCwyMzU4MSwyNDEyMCwzODI3MSwyMDYwNywzMjkyOCwyMTM3OCwyNTk1MCwzMDAyMSwyMTgwOSwyMDUxMywzNjIyOSwyNTIyMCwzODA0NiwyNjM5NywyMjA2NiwyODUyNiwyNDAzNCwyMTU1NywyODgxOCwzNjcxMCwyNTE5OSwyNTc2NCwyNTUwNywyNDQ0MywyODU1MiwzNzEwOCwzMzI1MSwzNjc4NCwyMzU3NiwyNjIxNiwyNDU2MSwyNzc4NSwzODQ3MiwzNjIyNSwzNDkyNCwyNTc0NSwzMTIxNiwyMjQ3OCwyNzIyNSwyNTEwNCwyMTU3NiwyMDA1NiwzMTI0MywyNDgwOSwyODU0OCwzNTgwMiwyNTIxNSwzNjg5NCwzOTU2MywzMTIwNCwyMTUwNywzMDE5NiwyNTM0NSwyMTI3MywyNzc0NCwzNjgzMSwyNDM0NywzOTUzNiwzMjgyNyw0MDgzMSwyMDM2MCwyMzYxMCwzNjE5NiwzMjcwOSwyNjAyMSwyODg2MSwyMDgwNSwyMDkxNCwzNDQxMSwyMzgxNSwyMzQ1NiwyNTI3NywzNzIyOCwzMDA2OCwzNjM2NCwzMTI2NCwyNDgzMywzMTYwOSwyMDE2NywzMjUwNCwzMDU5NywxOTk4NSwzMzI2MSwyMTAyMSwyMDk4NiwyNzI0OSwyMTQxNiwzNjQ4NywzODE0OCwzODYwNywyODM1MywzODUwMCwyNjk3MCwzMDg1MiwzMDg1MywzMDg1NCwzMDg1NiwzMDg1OCwzMDg1OSwzMDg2MywzMDg2NCwzMDg2NiwzMDg2OCwzMDg2OSwzMDg3MCwzMDg3MywzMDg3NywzMDg3OCwzMDg4MCwzMDg4MiwzMDg4NCwzMDg4NiwzMDg4OCwzMDg4OSwzMDg5MCwzMDg5MSwzMDg5MiwzMDg5MywzMDg5NCwzMDg5NSwzMDkwMSwzMDkwMiwzMDkwMywzMDkwNCwzMDkwNiwzMDkwNywzMDkwOCwzMDkwOSwzMDkxMSwzMDkxMiwzMDkxNCwzMDkxNSwzMDkxNiwzMDkxOCwzMDkxOSwzMDkyMCwzMDkyNCwzMDkyNSwzMDkyNiwzMDkyNywzMDkyOSwzMDkzMCwzMDkzMSwzMDkzNCwzMDkzNSwzMDkzNiwzMDkzOCwzMDkzOSwzMDk0MCwzMDk0MSwzMDk0MiwzMDk0MywzMDk0NCwzMDk0NSwzMDk0NiwzMDk0NywzMDk0OCwzMDk0OSwzMDk1MCwzMDk1MSwzMDk1MywzMDk1NCwzMDk1NSwzMDk1NywzMDk1OCwzMDk1OSwzMDk2MCwzMDk2MSwzMDk2MywzMDk2NSwzMDk2NiwzMDk2OCwzMDk2OSwzMDk3MSwzMDk3MiwzMDk3MywzMDk3NCwzMDk3NSwzMDk3NiwzMDk3OCwzMDk3OSwzMDk4MCwzMDk4MiwzMDk4MywzMDk4NCwzMDk4NSwzMDk4NiwzMDk4NywzMDk4OCwzMDc4NCwyMDY0OCwzMDY3OSwyNTYxNiwzNTMwMiwyMjc4OCwyNTU3MSwyNDAyOSwzMTM1OSwyNjk0MSwyMDI1NiwzMzMzNywyMTkxMiwyMDAxOCwzMDEyNiwzMTM4MywyNDE2MiwyNDIwMiwzODM4MywyMTAxOSwyMTU2MSwyODgxMCwyNTQ2MiwzODE4MCwyMjQwMiwyNjE0OSwyNjk0MywzNzI1NSwyMTc2NywyODE0NywzMjQzMSwzNDg1MCwyNTEzOSwzMjQ5NiwzMDEzMywzMzU3NiwzMDkxMywzODYwNCwzNjc2NiwyNDkwNCwyOTk0MywzNTc4OSwyNzQ5MiwyMTA1MCwzNjE3NiwyNzQyNSwzMjg3NCwzMzkwNSwyMjI1NywyMTI1NCwyMDE3NCwxOTk5NSwyMDk0NSwzMTg5NSwzNzI1OSwzMTc1MSwyMDQxOSwzNjQ3OSwzMTcxMywzMTM4OCwyNTcwMywyMzgyOCwyMDY1MiwzMzAzMCwzMDIwOSwzMTkyOSwyODE0MCwzMjczNiwyNjQ0OSwyMzM4NCwyMzU0NCwzMDkyMywyNTc3NCwyNTYxOSwyNTUxNCwyNTM4NywzODE2OSwyNTY0NSwzNjc5OCwzMTU3MiwzMDI0OSwyNTE3MSwyMjgyMywyMTU3NCwyNzUxMywyMDY0MywyNTE0MCwyNDEwMiwyNzUyNiwyMDE5NSwzNjE1MSwzNDk1NSwyNDQ1MywzNjkxMCwzMDk4OSwzMDk5MCwzMDk5MSwzMDk5MiwzMDk5MywzMDk5NCwzMDk5NiwzMDk5NywzMDk5OCwzMDk5OSwzMTAwMCwzMTAwMSwzMTAwMiwzMTAwMywzMTAwNCwzMTAwNSwzMTAwNywzMTAwOCwzMTAwOSwzMTAxMCwzMTAxMSwzMTAxMywzMTAxNCwzMTAxNSwzMTAxNiwzMTAxNywzMTAxOCwzMTAxOSwzMTAyMCwzMTAyMSwzMTAyMiwzMTAyMywzMTAyNCwzMTAyNSwzMTAyNiwzMTAyNywzMTAyOSwzMTAzMCwzMTAzMSwzMTAzMiwzMTAzMywzMTAzNywzMTAzOSwzMTA0MiwzMTA0MywzMTA0NCwzMTA0NSwzMTA0NywzMTA1MCwzMTA1MSwzMTA1MiwzMTA1MywzMTA1NCwzMTA1NSwzMTA1NiwzMTA1NywzMTA1OCwzMTA2MCwzMTA2MSwzMTA2NCwzMTA2NSwzMTA3MywzMTA3NSwzMTA3NiwzMTA3OCwzMTA4MSwzMTA4MiwzMTA4MywzMTA4NCwzMTA4NiwzMTA4OCwzMTA4OSwzMTA5MCwzMTA5MSwzMTA5MiwzMTA5MywzMTA5NCwzMTA5NywzMTA5OSwzMTEwMCwzMTEwMSwzMTEwMiwzMTEwMywzMTEwNiwzMTEwNywzMTExMCwzMTExMSwzMTExMiwzMTExMywzMTExNSwzMTExNiwzMTExNywzMTExOCwzMTEyMCwzMTEyMSwzMTEyMiwyNDYwOCwzMjgyOSwyNTI4NSwyMDAyNSwyMTMzMywzNzExMiwyNTUyOCwzMjk2NiwyNjA4NiwyNzY5NCwyMDI5NCwyNDgxNCwyODEyOSwzNTgwNiwyNDM3NywzNDUwNywyNDQwMywyNTM3NywyMDgyNiwzMzYzMywyNjcyMywyMDk5MiwyNTQ0MywzNjQyNCwyMDQ5OCwyMzcwNywzMTA5NSwyMzU0OCwyMTA0MCwzMTI5MSwyNDc2NCwzNjk0NywzMDQyMywyNDUwMywyNDQ3MSwzMDM0MCwzNjQ2MCwyODc4MywzMDMzMSwzMTU2MSwzMDYzNCwyMDk3OSwzNzAxMSwyMjU2NCwyMDMwMiwyODQwNCwzNjg0MiwyNTkzMiwzMTUxNSwyOTM4MCwyODA2OCwzMjczNSwyMzI2NSwyNTI2OSwyNDIxMywyMjMyMCwzMzkyMiwzMTUzMiwyNDA5MywyNDM1MSwzNjg4MiwzMjUzMiwzOTA3MiwyNTQ3NCwyODM1OSwzMDg3MiwyODg1NywyMDg1NiwzODc0NywyMjQ0MywzMDAwNSwyMDI5MSwzMDAwOCwyNDIxNSwyNDgwNiwyMjg4MCwyODA5NiwyNzU4MywzMDg1NywyMTUwMCwzODYxMywyMDkzOSwyMDk5MywyNTQ4MSwyMTUxNCwzODAzNSwzNTg0MywzNjMwMCwyOTI0MSwzMDg3OSwzNDY3OCwzNjg0NSwzNTg1MywyMTQ3MiwzMTEyMywzMTEyNCwzMTEyNSwzMTEyNiwzMTEyNywzMTEyOCwzMTEyOSwzMTEzMSwzMTEzMiwzMTEzMywzMTEzNCwzMTEzNSwzMTEzNiwzMTEzNywzMTEzOCwzMTEzOSwzMTE0MCwzMTE0MSwzMTE0MiwzMTE0NCwzMTE0NSwzMTE0NiwzMTE0NywzMTE0OCwzMTE0OSwzMTE1MCwzMTE1MSwzMTE1MiwzMTE1MywzMTE1NCwzMTE1NiwzMTE1NywzMTE1OCwzMTE1OSwzMTE2MCwzMTE2NCwzMTE2NywzMTE3MCwzMTE3MiwzMTE3MywzMTE3NSwzMTE3NiwzMTE3OCwzMTE4MCwzMTE4MiwzMTE4MywzMTE4NCwzMTE4NywzMTE4OCwzMTE5MCwzMTE5MSwzMTE5MywzMTE5NCwzMTE5NSwzMTE5NiwzMTE5NywzMTE5OCwzMTIwMCwzMTIwMSwzMTIwMiwzMTIwNSwzMTIwOCwzMTIxMCwzMTIxMiwzMTIxNCwzMTIxNywzMTIxOCwzMTIxOSwzMTIyMCwzMTIyMSwzMTIyMiwzMTIyMywzMTIyNSwzMTIyNiwzMTIyOCwzMTIzMCwzMTIzMSwzMTIzMywzMTIzNiwzMTIzNywzMTIzOSwzMTI0MCwzMTI0MSwzMTI0MiwzMTI0NCwzMTI0NywzMTI0OCwzMTI0OSwzMTI1MCwzMTI1MSwzMTI1MywzMTI1NCwzMTI1NiwzMTI1NywzMTI1OSwzMTI2MCwxOTk2OSwzMDQ0NywyMTQ4NiwzODAyNSwzOTAzMCw0MDcxOCwzODE4OSwyMzQ1MCwzNTc0NiwyMDAwMiwxOTk5NiwyMDkwOCwzMzg5MSwyNTAyNiwyMTE2MCwyNjYzNSwyMDM3NSwyNDY4MywyMDkyMywyNzkzNCwyMDgyOCwyNTIzOCwyNjAwNywzODQ5NywzNTkxMCwzNjg4NywzMDE2OCwzNzExNywzMDU2MywyNzYwMiwyOTMyMiwyOTQyMCwzNTgzNSwyMjU4MSwzMDU4NSwzNjE3MiwyNjQ2MCwzODIwOCwzMjkyMiwyNDIzMCwyODE5MywyMjkzMCwzMTQ3MSwzMDcwMSwzODIwMywyNzU3MywyNjAyOSwzMjUyNiwyMjUzNCwyMDgxNywzODQzMSwyMzU0NSwyMjY5NywyMTU0NCwzNjQ2NiwyNTk1OCwzOTAzOSwyMjI0NCwzODA0NSwzMDQ2MiwzNjkyOSwyNTQ3OSwyMTcwMiwyMjgxMCwyMjg0MiwyMjQyNywzNjUzMCwyNjQyMSwzNjM0NiwzMzMzMywyMTA1NywyNDgxNiwyMjU0OSwzNDU1OCwyMzc4NCw0MDUxNywyMDQyMCwzOTA2OSwzNTc2OSwyMzA3NywyNDY5NCwyMTM4MCwyNTIxMiwzNjk0MywzNzEyMiwzOTI5NSwyNDY4MSwzMjc4MCwyMDc5OSwzMjgxOSwyMzU3MiwzOTI4NSwyNzk1MywyMDEwOCwzMTI2MSwzMTI2MywzMTI2NSwzMTI2NiwzMTI2OCwzMTI2OSwzMTI3MCwzMTI3MSwzMTI3MiwzMTI3MywzMTI3NCwzMTI3NSwzMTI3NiwzMTI3NywzMTI3OCwzMTI3OSwzMTI4MCwzMTI4MSwzMTI4MiwzMTI4NCwzMTI4NSwzMTI4NiwzMTI4OCwzMTI5MCwzMTI5NCwzMTI5NiwzMTI5NywzMTI5OCwzMTI5OSwzMTMwMCwzMTMwMSwzMTMwMywzMTMwNCwzMTMwNSwzMTMwNiwzMTMwNywzMTMwOCwzMTMwOSwzMTMxMCwzMTMxMSwzMTMxMiwzMTMxNCwzMTMxNSwzMTMxNiwzMTMxNywzMTMxOCwzMTMyMCwzMTMyMSwzMTMyMiwzMTMyMywzMTMyNCwzMTMyNSwzMTMyNiwzMTMyNywzMTMyOCwzMTMyOSwzMTMzMCwzMTMzMSwzMTMzMiwzMTMzMywzMTMzNCwzMTMzNSwzMTMzNiwzMTMzNywzMTMzOCwzMTMzOSwzMTM0MCwzMTM0MSwzMTM0MiwzMTM0MywzMTM0NSwzMTM0NiwzMTM0NywzMTM0OSwzMTM1NSwzMTM1NiwzMTM1NywzMTM1OCwzMTM2MiwzMTM2NSwzMTM2NywzMTM2OSwzMTM3MCwzMTM3MSwzMTM3MiwzMTM3NCwzMTM3NSwzMTM3NiwzMTM3OSwzMTM4MCwzMTM4NSwzMTM4NiwzMTM4NywzMTM5MCwzMTM5MywzMTM5NCwzNjE0NCwyMTQ1NywzMjYwMiwzMTU2NywyMDI0MCwyMDA0NywzODQwMCwyNzg2MSwyOTY0OCwzNDI4MSwyNDA3MCwzMDA1OCwzMjc2MywyNzE0NiwzMDcxOCwzODAzNCwzMjMyMSwyMDk2MSwyODkwMiwyMTQ1MywzNjgyMCwzMzUzOSwzNjEzNywyOTM1OSwzOTI3NywyNzg2NywyMjM0NiwzMzQ1OSwyNjA0MSwzMjkzOCwyNTE1MSwzODQ1MCwyMjk1MiwyMDIyMywzNTc3NSwzMjQ0MiwyNTkxOCwzMzc3OCwzODc1MCwyMTg1NywzOTEzNCwzMjkzMywyMTI5MCwzNTgzNywyMTUzNiwzMjk1NCwyNDIyMywyNzgzMiwzNjE1MywzMzQ1MiwzNzIxMCwyMTU0NSwyNzY3NSwyMDk5OCwzMjQzOSwyMjM2NywyODk1NCwyNzc3NCwzMTg4MSwyMjg1OSwyMDIyMSwyNDU3NSwyNDg2OCwzMTkxNCwyMDAxNiwyMzU1MywyNjUzOSwzNDU2MiwyMzc5MiwzODE1NSwzOTExOCwzMDEyNywyODkyNSwzNjg5OCwyMDkxMSwzMjU0MSwzNTc3MywyMjg1NywyMDk2NCwyMDMxNSwyMTU0MiwyMjgyNywyNTk3NSwzMjkzMiwyMzQxMywyNTIwNiwyNTI4MiwzNjc1MiwyNDEzMywyNzY3OSwzMTUyNiwyMDIzOSwyMDQ0MCwyNjM4MSwzMTM5NSwzMTM5NiwzMTM5OSwzMTQwMSwzMTQwMiwzMTQwMywzMTQwNiwzMTQwNywzMTQwOCwzMTQwOSwzMTQxMCwzMTQxMiwzMTQxMywzMTQxNCwzMTQxNSwzMTQxNiwzMTQxNywzMTQxOCwzMTQxOSwzMTQyMCwzMTQyMSwzMTQyMiwzMTQyNCwzMTQyNSwzMTQyNiwzMTQyNywzMTQyOCwzMTQyOSwzMTQzMCwzMTQzMSwzMTQzMiwzMTQzMywzMTQzNCwzMTQzNiwzMTQzNywzMTQzOCwzMTQzOSwzMTQ0MCwzMTQ0MSwzMTQ0MiwzMTQ0MywzMTQ0NCwzMTQ0NSwzMTQ0NywzMTQ0OCwzMTQ1MCwzMTQ1MSwzMTQ1MiwzMTQ1MywzMTQ1NywzMTQ1OCwzMTQ2MCwzMTQ2MywzMTQ2NCwzMTQ2NSwzMTQ2NiwzMTQ2NywzMTQ2OCwzMTQ3MCwzMTQ3MiwzMTQ3MywzMTQ3NCwzMTQ3NSwzMTQ3NiwzMTQ3NywzMTQ3OCwzMTQ3OSwzMTQ4MCwzMTQ4MywzMTQ4NCwzMTQ4NiwzMTQ4OCwzMTQ4OSwzMTQ5MCwzMTQ5MywzMTQ5NSwzMTQ5NywzMTUwMCwzMTUwMSwzMTUwMiwzMTUwNCwzMTUwNiwzMTUwNywzMTUxMCwzMTUxMSwzMTUxMiwzMTUxNCwzMTUxNiwzMTUxNywzMTUxOSwzMTUyMSwzMTUyMiwzMTUyMywzMTUyNywzMTUyOSwzMTUzMywyODAxNCwyODA3NCwzMTExOSwzNDk5MywyNDM0MywyOTk5NSwyNTI0MiwzNjc0MSwyMDQ2MywzNzM0MCwyNjAyMywzMzA3MSwzMzEwNSwyNDIyMCwzMzEwNCwzNjIxMiwyMTEwMywzNTIwNiwzNjE3MSwyMjc5NywyMDYxMywyMDE4NCwzODQyOCwyOTIzOCwzMzE0NSwzNjEyNywyMzUwMCwzNTc0NywzODQ2OCwyMjkxOSwzMjUzOCwyMTY0OCwyMjEzNCwyMjAzMCwzNTgxMywyNTkxMywyNzAxMCwzODA0MSwzMDQyMiwyODI5NywyNDE3OCwyOTk3NiwyNjQzOCwyNjU3NywzMTQ4NywzMjkyNSwzNjIxNCwyNDg2MywzMTE3NCwyNTk1NCwzNjE5NSwyMDg3MiwyMTAxOCwzODA1MCwzMjU2OCwzMjkyMywzMjQzNCwyMzcwMywyODIwNywyNjQ2NCwzMTcwNSwzMDM0NywzOTY0MCwzMzE2NywzMjY2MCwzMTk1NywyNTYzMCwzODIyNCwzMTI5NSwyMTU3OCwyMTczMywyNzQ2OCwyNTYwMSwyNTA5Niw0MDUwOSwzMzAxMSwzMDEwNSwyMTEwNiwzODc2MSwzMzg4MywyNjY4NCwzNDUzMiwzODQwMSwzODU0OCwzODEyNCwyMDAxMCwyMTUwOCwzMjQ3MywyNjY4MSwzNjMxOSwzMjc4OSwyNjM1NiwyNDIxOCwzMjY5NywzMTUzNSwzMTUzNiwzMTUzOCwzMTU0MCwzMTU0MSwzMTU0MiwzMTU0MywzMTU0NSwzMTU0NywzMTU0OSwzMTU1MSwzMTU1MiwzMTU1MywzMTU1NCwzMTU1NSwzMTU1NiwzMTU1OCwzMTU2MCwzMTU2MiwzMTU2NSwzMTU2NiwzMTU3MSwzMTU3MywzMTU3NSwzMTU3NywzMTU4MCwzMTU4MiwzMTU4MywzMTU4NSwzMTU4NywzMTU4OCwzMTU4OSwzMTU5MCwzMTU5MSwzMTU5MiwzMTU5MywzMTU5NCwzMTU5NSwzMTU5NiwzMTU5NywzMTU5OSwzMTYwMCwzMTYwMywzMTYwNCwzMTYwNiwzMTYwOCwzMTYxMCwzMTYxMiwzMTYxMywzMTYxNSwzMTYxNywzMTYxOCwzMTYxOSwzMTYyMCwzMTYyMiwzMTYyMywzMTYyNCwzMTYyNSwzMTYyNiwzMTYyNywzMTYyOCwzMTYzMCwzMTYzMSwzMTYzMywzMTYzNCwzMTYzNSwzMTYzOCwzMTY0MCwzMTY0MSwzMTY0MiwzMTY0MywzMTY0NiwzMTY0NywzMTY0OCwzMTY1MSwzMTY1MiwzMTY1MywzMTY2MiwzMTY2MywzMTY2NCwzMTY2NiwzMTY2NywzMTY2OSwzMTY3MCwzMTY3MSwzMTY3MywzMTY3NCwzMTY3NSwzMTY3NiwzMTY3NywzMTY3OCwzMTY3OSwzMTY4MCwzMTY4MiwzMTY4MywzMTY4NCwyMjQ2NiwzMjgzMSwyNjc3NSwyNDAzNywyNTkxNSwyMTE1MSwyNDY4NSw0MDg1OCwyMDM3OSwzNjUyNCwyMDg0NCwyMzQ2NywyNDMzOSwyNDA0MSwyNzc0MiwyNTMyOSwzNjEyOSwyMDg0OSwzODA1NywyMTI0NiwyNzgwNywzMzUwMywyOTM5OSwyMjQzNCwyNjUwMCwzNjE0MSwyMjgxNSwzNjc2NCwzMzczNSwyMTY1MywzMTYyOSwyMDI3MiwyNzgzNywyMzM5NiwyMjk5Myw0MDcyMywyMTQ3NiwzNDUwNiwzOTU5MiwzNTg5NSwzMjkyOSwyNTkyNSwzOTAzOCwyMjI2NiwzODU5OSwyMTAzOCwyOTkxNiwyMTA3MiwyMzUyMSwyNTM0NiwzNTA3NCwyMDA1NCwyNTI5NiwyNDYxOCwyNjg3NCwyMDg1MSwyMzQ0OCwyMDg5NiwzNTI2NiwzMTY0OSwzOTMwMiwzMjU5MiwyNDgxNSwyODc0OCwzNjE0MywyMDgwOSwyNDE5MSwzNjg5MSwyOTgwOCwzNTI2OCwyMjMxNywzMDc4OSwyNDQwMiw0MDg2MywzODM5NCwzNjcxMiwzOTc0MCwzNTgwOSwzMDMyOCwyNjY5MCwyNjU4OCwzNjMzMCwzNjE0OSwyMTA1MywzNjc0NiwyODM3OCwyNjgyOSwzODE0OSwzNzEwMSwyMjI2OSwyNjUyNCwzNTA2NSwzNjgwNywyMTcwNCwzMTY4NSwzMTY4OCwzMTY4OSwzMTY5MCwzMTY5MSwzMTY5MywzMTY5NCwzMTY5NSwzMTY5NiwzMTY5OCwzMTcwMCwzMTcwMSwzMTcwMiwzMTcwMywzMTcwNCwzMTcwNywzMTcwOCwzMTcxMCwzMTcxMSwzMTcxMiwzMTcxNCwzMTcxNSwzMTcxNiwzMTcxOSwzMTcyMCwzMTcyMSwzMTcyMywzMTcyNCwzMTcyNSwzMTcyNywzMTcyOCwzMTczMCwzMTczMSwzMTczMiwzMTczMywzMTczNCwzMTczNiwzMTczNywzMTczOCwzMTczOSwzMTc0MSwzMTc0MywzMTc0NCwzMTc0NSwzMTc0NiwzMTc0NywzMTc0OCwzMTc0OSwzMTc1MCwzMTc1MiwzMTc1MywzMTc1NCwzMTc1NywzMTc1OCwzMTc2MCwzMTc2MSwzMTc2MiwzMTc2MywzMTc2NCwzMTc2NSwzMTc2NywzMTc2OCwzMTc2OSwzMTc3MCwzMTc3MSwzMTc3MiwzMTc3MywzMTc3NCwzMTc3NiwzMTc3NywzMTc3OCwzMTc3OSwzMTc4MCwzMTc4MSwzMTc4NCwzMTc4NSwzMTc4NywzMTc4OCwzMTc4OSwzMTc5MCwzMTc5MSwzMTc5MiwzMTc5MywzMTc5NCwzMTc5NSwzMTc5NiwzMTc5NywzMTc5OCwzMTc5OSwzMTgwMSwzMTgwMiwzMTgwMywzMTgwNCwzMTgwNSwzMTgwNiwzMTgxMCwzOTYwOCwyMzQwMSwyODAyMywyNzY4NiwyMDEzMywyMzQ3NSwzOTU1OSwzNzIxOSwyNTAwMCwzNzAzOSwzODg4OSwyMTU0NywyODA4NSwyMzUwNiwyMDk4OSwyMTg5OCwzMjU5NywzMjc1MiwyNTc4OCwyNTQyMSwyNjA5NywyNTAyMiwyNDcxNywyODkzOCwyNzczNSwyNzcyMSwyMjgzMSwyNjQ3NywzMzMyMiwyMjc0MSwyMjE1OCwzNTk0NiwyNzYyNywzNzA4NSwyMjkwOSwzMjc5MSwyMTQ5NSwyODAwOSwyMTYyMSwyMTkxNywzMzY1NSwzMzc0MywyNjY4MCwzMTE2NiwyMTY0NCwyMDMwOSwyMTUxMiwzMDQxOCwzNTk3NywzODQwMiwyNzgyNywyODA4OCwzNjIwMywzNTA4OCw0MDU0OCwzNjE1NCwyMjA3OSw0MDY1NywzMDE2NSwyNDQ1NiwyOTQwOCwyNDY4MCwyMTc1NiwyMDEzNiwyNzE3OCwzNDkxMywyNDY1OCwzNjcyMCwyMTcwMCwyODg4OCwzNDQyNSw0MDUxMSwyNzk0NiwyMzQzOSwyNDM0NCwzMjQxOCwyMTg5NywyMDM5OSwyOTQ5MiwyMTU2NCwyMTQwMiwyMDUwNSwyMTUxOCwyMTYyOCwyMDA0NiwyNDU3MywyOTc4NiwyMjc3NCwzMzg5OSwzMjk5MywzNDY3NiwyOTM5MiwzMTk0NiwyODI0NiwzMTgxMSwzMTgxMiwzMTgxMywzMTgxNCwzMTgxNSwzMTgxNiwzMTgxNywzMTgxOCwzMTgxOSwzMTgyMCwzMTgyMiwzMTgyMywzMTgyNCwzMTgyNSwzMTgyNiwzMTgyNywzMTgyOCwzMTgyOSwzMTgzMCwzMTgzMSwzMTgzMiwzMTgzMywzMTgzNCwzMTgzNSwzMTgzNiwzMTgzNywzMTgzOCwzMTgzOSwzMTg0MCwzMTg0MSwzMTg0MiwzMTg0MywzMTg0NCwzMTg0NSwzMTg0NiwzMTg0NywzMTg0OCwzMTg0OSwzMTg1MCwzMTg1MSwzMTg1MiwzMTg1MywzMTg1NCwzMTg1NSwzMTg1NiwzMTg1NywzMTg1OCwzMTg2MSwzMTg2MiwzMTg2MywzMTg2NCwzMTg2NSwzMTg2NiwzMTg3MCwzMTg3MSwzMTg3MiwzMTg3MywzMTg3NCwzMTg3NSwzMTg3NiwzMTg3NywzMTg3OCwzMTg3OSwzMTg4MCwzMTg4MiwzMTg4MywzMTg4NCwzMTg4NSwzMTg4NiwzMTg4NywzMTg4OCwzMTg5MSwzMTg5MiwzMTg5NCwzMTg5NywzMTg5OCwzMTg5OSwzMTkwNCwzMTkwNSwzMTkwNywzMTkxMCwzMTkxMSwzMTkxMiwzMTkxMywzMTkxNSwzMTkxNiwzMTkxNywzMTkxOSwzMTkyMCwzMTkyNCwzMTkyNSwzMTkyNiwzMTkyNywzMTkyOCwzMTkzMCwzMTkzMSwyNDM1OSwzNDM4MiwyMTgwNCwyNTI1MiwyMDExNCwyNzgxOCwyNTE0MywzMzQ1NywyMTcxOSwyMTMyNiwyOTUwMiwyODM2OSwzMDAxMSwyMTAxMCwyMTI3MCwzNTgwNSwyNzA4OCwyNDQ1OCwyNDU3NiwyODE0MiwyMjM1MSwyNzQyNiwyOTYxNSwyNjcwNywzNjgyNCwzMjUzMSwyNTQ0MiwyNDczOSwyMTc5NiwzMDE4NiwzNTkzOCwyODk0OSwyODA2NywyMzQ2MiwyNDE4NywzMzYxOCwyNDkwOCw0MDY0NCwzMDk3MCwzNDY0NywzMTc4MywzMDM0MywyMDk3NiwyNDgyMiwyOTAwNCwyNjE3OSwyNDE0MCwyNDY1MywzNTg1NCwyODc4NCwyNTM4MSwzNjc0NSwyNDUwOSwyNDY3NCwzNDUxNiwyMjIzOCwyNzU4NSwyNDcyNCwyNDkzNSwyMTMyMSwyNDgwMCwyNjIxNCwzNjE1OSwzMTIyOSwyMDI1MCwyODkwNSwyNzcxOSwzNTc2MywzNTgyNiwzMjQ3MiwzMzYzNiwyNjEyNywyMzEzMCwzOTc0NiwyNzk4NSwyODE1MSwzNTkwNSwyNzk2MywyMDI0OSwyODc3OSwzMzcxOSwyNTExMCwyNDc4NSwzODY2OSwzNjEzNSwzMTA5NiwyMDk4NywyMjMzNCwyMjUyMiwyNjQyNiwzMDA3MiwzMTI5MywzMTIxNSwzMTYzNywzMTkzNSwzMTkzNiwzMTkzOCwzMTkzOSwzMTk0MCwzMTk0MiwzMTk0NSwzMTk0NywzMTk1MCwzMTk1MSwzMTk1MiwzMTk1MywzMTk1NCwzMTk1NSwzMTk1NiwzMTk2MCwzMTk2MiwzMTk2MywzMTk2NSwzMTk2NiwzMTk2OSwzMTk3MCwzMTk3MSwzMTk3MiwzMTk3MywzMTk3NCwzMTk3NSwzMTk3NywzMTk3OCwzMTk3OSwzMTk4MCwzMTk4MSwzMTk4MiwzMTk4NCwzMTk4NSwzMTk4NiwzMTk4NywzMTk4OCwzMTk4OSwzMTk5MCwzMTk5MSwzMTk5MywzMTk5NCwzMTk5NiwzMTk5NywzMTk5OCwzMTk5OSwzMjAwMCwzMjAwMSwzMjAwMiwzMjAwMywzMjAwNCwzMjAwNSwzMjAwNiwzMjAwNywzMjAwOCwzMjAwOSwzMjAxMSwzMjAxMiwzMjAxMywzMjAxNCwzMjAxNSwzMjAxNiwzMjAxNywzMjAxOCwzMjAxOSwzMjAyMCwzMjAyMSwzMjAyMiwzMjAyMywzMjAyNCwzMjAyNSwzMjAyNiwzMjAyNywzMjAyOCwzMjAyOSwzMjAzMCwzMjAzMSwzMjAzMywzMjAzNSwzMjAzNiwzMjAzNywzMjAzOCwzMjA0MCwzMjA0MSwzMjA0MiwzMjA0NCwzMjA0NSwzMjA0NiwzMjA0OCwzMjA0OSwzMjA1MCwzMjA1MSwzMjA1MiwzMjA1MywzMjA1NCwzMjkwOCwzOTI2OSwzNjg1NywyODYwOCwzNTc0OSw0MDQ4MSwyMzAyMCwzMjQ4OSwzMjUyMSwyMTUxMywyNjQ5NywyNjg0MCwzNjc1MywzMTgyMSwzODU5OCwyMTQ1MCwyNDYxMywzMDE0MiwyNzc2MiwyMTM2MywyMzI0MSwzMjQyMywyNTM4MCwyMDk2MCwzMzAzNCwyNDA0OSwzNDAxNSwyNTIxNiwyMDg2NCwyMzM5NSwyMDIzOCwzMTA4NSwyMTA1OCwyNDc2MCwyNzk4MiwyMzQ5MiwyMzQ5MCwzNTc0NSwzNTc2MCwyNjA4MiwyNDUyNCwzODQ2OSwyMjkzMSwzMjQ4NywzMjQyNiwyMjAyNSwyNjU1MSwyMjg0MSwyMDMzOSwyMzQ3OCwyMTE1MiwzMzYyNiwzOTA1MCwzNjE1OCwzMDAwMiwzODA3OCwyMDU1MSwzMTI5MiwyMDIxNSwyNjU1MCwzOTU1MCwyMzIzMywyNzUxNiwzMDQxNywyMjM2MiwyMzU3NCwzMTU0NiwzODM4OCwyOTAwNiwyMDg2MCwzMjkzNywzMzM5MiwyMjkwNCwzMjUxNiwzMzU3NSwyNjgxNiwyNjYwNCwzMDg5NywzMDgzOSwyNTMxNSwyNTQ0MSwzMTYxNiwyMDQ2MSwyMTA5OCwyMDk0MywzMzYxNiwyNzA5OSwzNzQ5MiwzNjM0MSwzNjE0NSwzNTI2NSwzODE5MCwzMTY2MSwyMDIxNCwzMjA1NSwzMjA1NiwzMjA1NywzMjA1OCwzMjA1OSwzMjA2MCwzMjA2MSwzMjA2MiwzMjA2MywzMjA2NCwzMjA2NSwzMjA2NiwzMjA2NywzMjA2OCwzMjA2OSwzMjA3MCwzMjA3MSwzMjA3MiwzMjA3MywzMjA3NCwzMjA3NSwzMjA3NiwzMjA3NywzMjA3OCwzMjA3OSwzMjA4MCwzMjA4MSwzMjA4MiwzMjA4MywzMjA4NCwzMjA4NSwzMjA4NiwzMjA4NywzMjA4OCwzMjA4OSwzMjA5MCwzMjA5MSwzMjA5MiwzMjA5MywzMjA5NCwzMjA5NSwzMjA5NiwzMjA5NywzMjA5OCwzMjA5OSwzMjEwMCwzMjEwMSwzMjEwMiwzMjEwMywzMjEwNCwzMjEwNSwzMjEwNiwzMjEwNywzMjEwOCwzMjEwOSwzMjExMSwzMjExMiwzMjExMywzMjExNCwzMjExNSwzMjExNiwzMjExNywzMjExOCwzMjEyMCwzMjEyMSwzMjEyMiwzMjEyMywzMjEyNCwzMjEyNSwzMjEyNiwzMjEyNywzMjEyOCwzMjEyOSwzMjEzMCwzMjEzMSwzMjEzMiwzMjEzMywzMjEzNCwzMjEzNSwzMjEzNiwzMjEzNywzMjEzOCwzMjEzOSwzMjE0MCwzMjE0MSwzMjE0MiwzMjE0MywzMjE0NCwzMjE0NSwzMjE0NiwzMjE0NywzMjE0OCwzMjE0OSwzMjE1MCwzMjE1MSwzMjE1MiwyMDU4MSwzMzMyOCwyMTA3MywzOTI3OSwyODE3NiwyODI5MywyODA3MSwyNDMxNCwyMDcyNSwyMzAwNCwyMzU1OCwyNzk3NCwyNzc0MywzMDA4NiwzMzkzMSwyNjcyOCwyMjg3MCwzNTc2MiwyMTI4MCwzNzIzMywzODQ3NywzNDEyMSwyNjg5OCwzMDk3NywyODk2NiwzMzAxNCwyMDEzMiwzNzA2NiwyNzk3NSwzOTU1NiwyMzA0NywyMjIwNCwyNTYwNSwzODEyOCwzMDY5OSwyMDM4OSwzMzA1MCwyOTQwOSwzNTI4MiwzOTI5MCwzMjU2NCwzMjQ3OCwyMTExOSwyNTk0NSwzNzIzNywzNjczNSwzNjczOSwyMTQ4MywzMTM4MiwyNTU4MSwyNTUwOSwzMDM0MiwzMTIyNCwzNDkwMywzODQ1NCwyNTEzMCwyMTE2MywzMzQxMCwyNjcwOCwyNjQ4MCwyNTQ2MywzMDU3MSwzMTQ2OSwyNzkwNSwzMjQ2NywzNTI5OSwyMjk5MiwyNTEwNiwzNDI0OSwzMzQ0NSwzMDAyOCwyMDUxMSwyMDE3MSwzMDExNywzNTgxOSwyMzYyNiwyNDA2MiwzMTU2MywyNjAyMCwzNzMyOSwyMDE3MCwyNzk0MSwzNTE2NywzMjAzOSwzODE4MiwyMDE2NSwzNTg4MCwzNjgyNywzODc3MSwyNjE4NywzMTEwNSwzNjgxNywyODkwOCwyODAyNCwzMjE1MywzMjE1NCwzMjE1NSwzMjE1NiwzMjE1NywzMjE1OCwzMjE1OSwzMjE2MCwzMjE2MSwzMjE2MiwzMjE2MywzMjE2NCwzMjE2NSwzMjE2NywzMjE2OCwzMjE2OSwzMjE3MCwzMjE3MSwzMjE3MiwzMjE3MywzMjE3NSwzMjE3NiwzMjE3NywzMjE3OCwzMjE3OSwzMjE4MCwzMjE4MSwzMjE4MiwzMjE4MywzMjE4NCwzMjE4NSwzMjE4NiwzMjE4NywzMjE4OCwzMjE4OSwzMjE5MCwzMjE5MSwzMjE5MiwzMjE5MywzMjE5NCwzMjE5NSwzMjE5NiwzMjE5NywzMjE5OCwzMjE5OSwzMjIwMCwzMjIwMSwzMjIwMiwzMjIwMywzMjIwNCwzMjIwNSwzMjIwNiwzMjIwNywzMjIwOCwzMjIwOSwzMjIxMCwzMjIxMSwzMjIxMiwzMjIxMywzMjIxNCwzMjIxNSwzMjIxNiwzMjIxNywzMjIxOCwzMjIxOSwzMjIyMCwzMjIyMSwzMjIyMiwzMjIyMywzMjIyNCwzMjIyNSwzMjIyNiwzMjIyNywzMjIyOCwzMjIyOSwzMjIzMCwzMjIzMSwzMjIzMiwzMjIzMywzMjIzNCwzMjIzNSwzMjIzNiwzMjIzNywzMjIzOCwzMjIzOSwzMjI0MCwzMjI0MSwzMjI0MiwzMjI0MywzMjI0NCwzMjI0NSwzMjI0NiwzMjI0NywzMjI0OCwzMjI0OSwzMjI1MCwyMzYxMywyMTE3MCwzMzYwNiwyMDgzNCwzMzU1MCwzMDU1NSwyNjIzMCw0MDEyMCwyMDE0MCwyNDc3OCwzMTkzNCwzMTkyMywzMjQ2MywyMDExNywzNTY4NiwyNjIyMywzOTA0OCwzODc0NSwyMjY1OSwyNTk2NCwzODIzNiwyNDQ1MiwzMDE1MywzODc0MiwzMTQ1NSwzMTQ1NCwyMDkyOCwyODg0NywzMTM4NCwyNTU3OCwzMTM1MCwzMjQxNiwyOTU5MCwzODg5MywyMDAzNywyODc5MiwyMDA2MSwzNzIwMiwyMTQxNywyNTkzNywyNjA4NywzMzI3NiwzMzI4NSwyMTY0NiwyMzYwMSwzMDEwNiwzODgxNiwyNTMwNCwyOTQwMSwzMDE0MSwyMzYyMSwzOTU0NSwzMzczOCwyMzYxNiwyMTYzMiwzMDY5NywyMDAzMCwyNzgyMiwzMjg1OCwyNTI5OCwyNTQ1NCwyNDA0MCwyMDg1NSwzNjMxNywzNjM4MiwzODE5MSwyMDQ2NSwyMTQ3NywyNDgwNywyODg0NCwyMTA5NSwyNTQyNCw0MDUxNSwyMzA3MSwyMDUxOCwzMDUxOSwyMTM2NywzMjQ4MiwyNTczMywyNTg5OSwyNTIyNSwyNTQ5NiwyMDUwMCwyOTIzNywzNTI3MywyMDkxNSwzNTc3NiwzMjQ3NywyMjM0MywzMzc0MCwzODA1NSwyMDg5MSwyMTUzMSwyMzgwMywzMjI1MSwzMjI1MiwzMjI1MywzMjI1NCwzMjI1NSwzMjI1NiwzMjI1NywzMjI1OCwzMjI1OSwzMjI2MCwzMjI2MSwzMjI2MiwzMjI2MywzMjI2NCwzMjI2NSwzMjI2NiwzMjI2NywzMjI2OCwzMjI2OSwzMjI3MCwzMjI3MSwzMjI3MiwzMjI3MywzMjI3NCwzMjI3NSwzMjI3NiwzMjI3NywzMjI3OCwzMjI3OSwzMjI4MCwzMjI4MSwzMjI4MiwzMjI4MywzMjI4NCwzMjI4NSwzMjI4NiwzMjI4NywzMjI4OCwzMjI4OSwzMjI5MCwzMjI5MSwzMjI5MiwzMjI5MywzMjI5NCwzMjI5NSwzMjI5NiwzMjI5NywzMjI5OCwzMjI5OSwzMjMwMCwzMjMwMSwzMjMwMiwzMjMwMywzMjMwNCwzMjMwNSwzMjMwNiwzMjMwNywzMjMwOCwzMjMwOSwzMjMxMCwzMjMxMSwzMjMxMiwzMjMxMywzMjMxNCwzMjMxNiwzMjMxNywzMjMxOCwzMjMxOSwzMjMyMCwzMjMyMiwzMjMyMywzMjMyNCwzMjMyNSwzMjMyNiwzMjMyOCwzMjMyOSwzMjMzMCwzMjMzMSwzMjMzMiwzMjMzMywzMjMzNCwzMjMzNSwzMjMzNiwzMjMzNywzMjMzOCwzMjMzOSwzMjM0MCwzMjM0MSwzMjM0MiwzMjM0MywzMjM0NCwzMjM0NSwzMjM0NiwzMjM0NywzMjM0OCwzMjM0OSwyMDQyNiwzMTQ1OSwyNzk5NCwzNzA4OSwzOTU2NywyMTg4OCwyMTY1NCwyMTM0NSwyMTY3OSwyNDMyMCwyNTU3NywyNjk5OSwyMDk3NSwyNDkzNiwyMTAwMiwyMjU3MCwyMTIwOCwyMjM1MCwzMDczMywzMDQ3NSwyNDI0NywyNDk1MSwzMTk2OCwyNTE3OSwyNTIzOSwyMDEzMCwyODgyMSwzMjc3MSwyNTMzNSwyODkwMCwzODc1MiwyMjM5MSwzMzQ5OSwyNjYwNywyNjg2OSwzMDkzMywzOTA2MywzMTE4NSwyMjc3MSwyMTY4MywyMTQ4NywyODIxMiwyMDgxMSwyMTA1MSwyMzQ1OCwzNTgzOCwzMjk0MywyMTgyNywyMjQzOCwyNDY5MSwyMjM1MywyMTU0OSwzMTM1NCwyNDY1NiwyMzM4MCwyNTUxMSwyNTI0OCwyMTQ3NSwyNTE4NywyMzQ5NSwyNjU0MywyMTc0MSwzMTM5MSwzMzUxMCwzNzIzOSwyNDIxMSwzNTA0NCwyMjg0MCwyMjQ0NiwyNTM1OCwzNjMyOCwzMzAwNywyMjM1OSwzMTYwNywyMDM5MywyNDU1NSwyMzQ4NSwyNzQ1NCwyMTI4MSwzMTU2OCwyOTM3OCwyNjY5NCwzMDcxOSwzMDUxOCwyNjEwMywyMDkxNywyMDExMSwzMDQyMCwyMzc0MywzMTM5NywzMzkwOSwyMjg2MiwzOTc0NSwyMDYwOCwzMjM1MCwzMjM1MSwzMjM1MiwzMjM1MywzMjM1NCwzMjM1NSwzMjM1NiwzMjM1NywzMjM1OCwzMjM1OSwzMjM2MCwzMjM2MSwzMjM2MiwzMjM2MywzMjM2NCwzMjM2NSwzMjM2NiwzMjM2NywzMjM2OCwzMjM2OSwzMjM3MCwzMjM3MSwzMjM3MiwzMjM3MywzMjM3NCwzMjM3NSwzMjM3NiwzMjM3NywzMjM3OCwzMjM3OSwzMjM4MCwzMjM4MSwzMjM4MiwzMjM4MywzMjM4NCwzMjM4NSwzMjM4NywzMjM4OCwzMjM4OSwzMjM5MCwzMjM5MSwzMjM5MiwzMjM5MywzMjM5NCwzMjM5NSwzMjM5NiwzMjM5NywzMjM5OCwzMjM5OSwzMjQwMCwzMjQwMSwzMjQwMiwzMjQwMywzMjQwNCwzMjQwNSwzMjQwNiwzMjQwNywzMjQwOCwzMjQwOSwzMjQxMCwzMjQxMiwzMjQxMywzMjQxNCwzMjQzMCwzMjQzNiwzMjQ0MywzMjQ0NCwzMjQ3MCwzMjQ4NCwzMjQ5MiwzMjUwNSwzMjUyMiwzMjUyOCwzMjU0MiwzMjU2NywzMjU2OSwzMjU3MSwzMjU3MiwzMjU3MywzMjU3NCwzMjU3NSwzMjU3NiwzMjU3NywzMjU3OSwzMjU4MiwzMjU4MywzMjU4NCwzMjU4NSwzMjU4NiwzMjU4NywzMjU4OCwzMjU4OSwzMjU5MCwzMjU5MSwzMjU5NCwzMjU5NSwzOTMwNCwyNDg3MSwyODI5MSwyMjM3MiwyNjExOCwyNTQxNCwyMjI1NiwyNTMyNCwyNTE5MywyNDI3NSwzODQyMCwyMjQwMywyNTI4OSwyMTg5NSwzNDU5MywzMzA5OCwzNjc3MSwyMTg2MiwzMzcxMywyNjQ2OSwzNjE4MiwzNDAxMywyMzE0NiwyNjYzOSwyNTMxOCwzMTcyNiwzODQxNywyMDg0OCwyODU3MiwzNTg4OCwyNTU5NywzNTI3MiwyNTA0MiwzMjUxOCwyODg2NiwyODM4OSwyOTcwMSwyNzAyOCwyOTQzNiwyNDI2NiwzNzA3MCwyNjM5MSwyODAxMCwyNTQzOCwyMTE3MSwyOTI4MiwzMjc2OSwyMDMzMiwyMzAxMywzNzIyNiwyODg4OSwyODA2MSwyMTIwMiwyMDA0OCwzODY0NywzODI1MywzNDE3NCwzMDkyMiwzMjA0NywyMDc2OSwyMjQxOCwyNTc5NCwzMjkwNywzMTg2NywyNzg4MiwyNjg2NSwyNjk3NCwyMDkxOSwyMTQwMCwyNjc5MiwyOTMxMyw0MDY1NCwzMTcyOSwyOTQzMiwzMTE2MywyODQzNSwyOTcwMiwyNjQ0NiwzNzMyNCw0MDEwMCwzMTAzNiwzMzY3MywzMzYyMCwyMTUxOSwyNjY0NywyMDAyOSwyMTM4NSwyMTE2OSwzMDc4MiwyMTM4MiwyMTAzMywyMDYxNiwyMDM2MywyMDQzMiwzMjU5OCwzMjYwMSwzMjYwMywzMjYwNCwzMjYwNSwzMjYwNiwzMjYwOCwzMjYxMSwzMjYxMiwzMjYxMywzMjYxNCwzMjYxNSwzMjYxOSwzMjYyMCwzMjYyMSwzMjYyMywzMjYyNCwzMjYyNywzMjYyOSwzMjYzMCwzMjYzMSwzMjYzMiwzMjYzNCwzMjYzNSwzMjYzNiwzMjYzNywzMjYzOSwzMjY0MCwzMjY0MiwzMjY0MywzMjY0NCwzMjY0NSwzMjY0NiwzMjY0NywzMjY0OCwzMjY0OSwzMjY1MSwzMjY1MywzMjY1NSwzMjY1NiwzMjY1NywzMjY1OCwzMjY1OSwzMjY2MSwzMjY2MiwzMjY2MywzMjY2NCwzMjY2NSwzMjY2NywzMjY2OCwzMjY3MiwzMjY3NCwzMjY3NSwzMjY3NywzMjY3OCwzMjY4MCwzMjY4MSwzMjY4MiwzMjY4MywzMjY4NCwzMjY4NSwzMjY4NiwzMjY4OSwzMjY5MSwzMjY5MiwzMjY5MywzMjY5NCwzMjY5NSwzMjY5OCwzMjY5OSwzMjcwMiwzMjcwNCwzMjcwNiwzMjcwNywzMjcwOCwzMjcxMCwzMjcxMSwzMjcxMiwzMjcxMywzMjcxNSwzMjcxNywzMjcxOSwzMjcyMCwzMjcyMSwzMjcyMiwzMjcyMywzMjcyNiwzMjcyNywzMjcyOSwzMjczMCwzMjczMSwzMjczMiwzMjczMywzMjczNCwzMjczOCwzMjczOSwzMDE3OCwzMTQzNSwzMTg5MCwyNzgxMywzODU4MiwyMTE0NywyOTgyNywyMTczNywyMDQ1NywzMjg1MiwzMzcxNCwzNjgzMCwzODI1NiwyNDI2NSwyNDYwNCwyODA2MywyNDA4OCwyNTk0NywzMzA4MCwzODE0MiwyNDY1MSwyODg2MCwzMjQ1MSwzMTkxOCwyMDkzNywyNjc1MywzMTkyMSwzMzM5MSwyMDAwNCwzNjc0MiwzNzMyNywyNjIzOCwyMDE0MiwzNTg0NSwyNTc2OSwzMjg0MiwyMDY5OCwzMDEwMywyOTEzNCwyMzUyNSwzNjc5NywyODUxOCwyMDEwMiwyNTczMCwzODI0MywyNDI3OCwyNjAwOSwyMTAxNSwzNTAxMCwyODg3MiwyMTE1NSwyOTQ1NCwyOTc0NywyNjUxOSwzMDk2NywzODY3OCwyMDAyMCwzNzA1MSw0MDE1OCwyODEwNywyMDk1NSwzNjE2MSwyMTUzMywyNTI5NCwyOTYxOCwzMzc3NywzODY0Niw0MDgzNiwzODA4MywyMDI3OCwzMjY2NiwyMDk0MCwyODc4OSwzODUxNywyMzcyNSwzOTA0NiwyMTQ3OCwyMDE5NiwyODMxNiwyOTcwNSwyNzA2MCwzMDgyNywzOTMxMSwzMDA0MSwyMTAxNiwzMDI0NCwyNzk2OSwyNjYxMSwyMDg0NSw0MDg1NywzMjg0MywyMTY1NywzMTU0OCwzMTQyMywzMjc0MCwzMjc0MywzMjc0NCwzMjc0NiwzMjc0NywzMjc0OCwzMjc0OSwzMjc1MSwzMjc1NCwzMjc1NiwzMjc1NywzMjc1OCwzMjc1OSwzMjc2MCwzMjc2MSwzMjc2MiwzMjc2NSwzMjc2NiwzMjc2NywzMjc3MCwzMjc3NSwzMjc3NiwzMjc3NywzMjc3OCwzMjc4MiwzMjc4MywzMjc4NSwzMjc4NywzMjc5NCwzMjc5NSwzMjc5NywzMjc5OCwzMjc5OSwzMjgwMSwzMjgwMywzMjgwNCwzMjgxMSwzMjgxMiwzMjgxMywzMjgxNCwzMjgxNSwzMjgxNiwzMjgxOCwzMjgyMCwzMjgyNSwzMjgyNiwzMjgyOCwzMjgzMCwzMjgzMiwzMjgzMywzMjgzNiwzMjgzNywzMjgzOSwzMjg0MCwzMjg0MSwzMjg0NiwzMjg0NywzMjg0OCwzMjg0OSwzMjg1MSwzMjg1MywzMjg1NCwzMjg1NSwzMjg1NywzMjg1OSwzMjg2MCwzMjg2MSwzMjg2MiwzMjg2MywzMjg2NCwzMjg2NSwzMjg2NiwzMjg2NywzMjg2OCwzMjg2OSwzMjg3MCwzMjg3MSwzMjg3MiwzMjg3NSwzMjg3NiwzMjg3NywzMjg3OCwzMjg3OSwzMjg4MCwzMjg4MiwzMjg4MywzMjg4NCwzMjg4NSwzMjg4NiwzMjg4NywzMjg4OCwzMjg4OSwzMjg5MCwzMjg5MSwzMjg5MiwzMjg5MywzODUzNCwyMjQwNCwyNTMxNCwzODQ3MSwyNzAwNCwyMzA0NCwyNTYwMiwzMTY5OSwyODQzMSwzODQ3NSwzMzQ0NiwyMTM0NiwzOTA0NSwyNDIwOCwyODgwOSwyNTUyMywyMTM0OCwzNDM4Myw0MDA2NSw0MDU5NSwzMDg2MCwzODcwNiwzNjMzNSwzNjE2Miw0MDU3NSwyODUxMCwzMTEwOCwyNDQwNSwzODQ3MCwyNTEzNCwzOTU0MCwyMTUyNSwzODEwOSwyMDM4NywyNjA1MywyMzY1MywyMzY0OSwzMjUzMywzNDM4NSwyNzY5NSwyNDQ1OSwyOTU3NSwyODM4OCwzMjUxMSwyMzc4MiwyNTM3MSwyMzQwMiwyODM5MCwyMTM2NSwyMDA4MSwyNTUwNCwzMDA1MywyNTI0OSwzNjcxOCwyMDI2MiwyMDE3NywyNzgxNCwzMjQzOCwzNTc3MCwzMzgyMSwzNDc0NiwzMjU5OSwzNjkyMywzODE3OSwzMTY1NywzOTU4NSwzNTA2NCwzMzg1MywyNzkzMSwzOTU1OCwzMjQ3NiwyMjkyMCw0MDYzNSwyOTU5NSwzMDcyMSwzNDQzNCwzOTUzMiwzOTU1NCwyMjA0MywyMTUyNywyMjQ3NSwyMDA4MCw0MDYxNCwyMTMzNCwzNjgwOCwzMzAzMywzMDYxMCwzOTMxNCwzNDU0MiwyODM4NSwzNDA2NywyNjM2NCwyNDkzMCwyODQ1OSwzMjg5NCwzMjg5NywzMjg5OCwzMjkwMSwzMjkwNCwzMjkwNiwzMjkwOSwzMjkxMCwzMjkxMSwzMjkxMiwzMjkxMywzMjkxNCwzMjkxNiwzMjkxNywzMjkxOSwzMjkyMSwzMjkyNiwzMjkzMSwzMjkzNCwzMjkzNSwzMjkzNiwzMjk0MCwzMjk0NCwzMjk0NywzMjk0OSwzMjk1MCwzMjk1MiwzMjk1MywzMjk1NSwzMjk2NSwzMjk2NywzMjk2OCwzMjk2OSwzMjk3MCwzMjk3MSwzMjk3NSwzMjk3NiwzMjk3NywzMjk3OCwzMjk3OSwzMjk4MCwzMjk4MSwzMjk4NCwzMjk5MSwzMjk5MiwzMjk5NCwzMjk5NSwzMjk5OCwzMzAwNiwzMzAxMywzMzAxNSwzMzAxNywzMzAxOSwzMzAyMiwzMzAyMywzMzAyNCwzMzAyNSwzMzAyNywzMzAyOCwzMzAyOSwzMzAzMSwzMzAzMiwzMzAzNSwzMzAzNiwzMzA0NSwzMzA0NywzMzA0OSwzMzA1MSwzMzA1MiwzMzA1MywzMzA1NSwzMzA1NiwzMzA1NywzMzA1OCwzMzA1OSwzMzA2MCwzMzA2MSwzMzA2MiwzMzA2MywzMzA2NCwzMzA2NSwzMzA2NiwzMzA2NywzMzA2OSwzMzA3MCwzMzA3MiwzMzA3NSwzMzA3NiwzMzA3NywzMzA3OSwzMzA4MSwzMzA4MiwzMzA4MywzMzA4NCwzMzA4NSwzMzA4NywzNTg4MSwzMzQyNiwzMzU3OSwzMDQ1MCwyNzY2NywyNDUzNywzMzcyNSwyOTQ4MywzMzU0MSwzODE3MCwyNzYxMSwzMDY4MywzODA4NiwyMTM1OSwzMzUzOCwyMDg4MiwyNDEyNSwzNTk4MCwzNjE1MiwyMDA0MCwyOTYxMSwyNjUyMiwyNjc1NywzNzIzOCwzODY2NSwyOTAyOCwyNzgwOSwzMDQ3MywyMzE4NiwzODIwOSwyNzU5OSwzMjY1NCwyNjE1MSwyMzUwNCwyMjk2OSwyMzE5NCwzODM3NiwzODM5MSwyMDIwNCwzMzgwNCwzMzk0NSwyNzMwOCwzMDQzMSwzODE5MiwyOTQ2NywyNjc5MCwyMzM5MSwzMDUxMSwzNzI3NCwzODc1MywzMTk2NCwzNjg1NSwzNTg2OCwyNDM1NywzMTg1OSwzMTE5MiwzNTI2OSwyNzg1MiwzNDU4OCwyMzQ5NCwyNDEzMCwyNjgyNSwzMDQ5NiwzMjUwMSwyMDg4NSwyMDgxMywyMTE5MywyMzA4MSwzMjUxNywzODc1NCwzMzQ5NSwyNTU1MSwzMDU5NiwzNDI1NiwzMTE4NiwyODIxOCwyNDIxNywyMjkzNywzNDA2NSwyODc4MSwyNzY2NSwyNTI3OSwzMDM5OSwyNTkzNSwyNDc1MSwzODM5NywyNjEyNiwzNDcxOSw0MDQ4MywzODEyNSwyMTUxNywyMTYyOSwzNTg4NCwyNTcyMCwzMzA4OCwzMzA4OSwzMzA5MCwzMzA5MSwzMzA5MiwzMzA5MywzMzA5NSwzMzA5NywzMzEwMSwzMzEwMiwzMzEwMywzMzEwNiwzMzExMCwzMzExMSwzMzExMiwzMzExNSwzMzExNiwzMzExNywzMzExOCwzMzExOSwzMzEyMSwzMzEyMiwzMzEyMywzMzEyNCwzMzEyNiwzMzEyOCwzMzEzMCwzMzEzMSwzMzEzMiwzMzEzNSwzMzEzOCwzMzEzOSwzMzE0MSwzMzE0MiwzMzE0MywzMzE0NCwzMzE1MywzMzE1NSwzMzE1NiwzMzE1NywzMzE1OCwzMzE1OSwzMzE2MSwzMzE2MywzMzE2NCwzMzE2NSwzMzE2NiwzMzE2OCwzMzE3MCwzMzE3MSwzMzE3MiwzMzE3MywzMzE3NCwzMzE3NSwzMzE3NywzMzE3OCwzMzE4MiwzMzE4MywzMzE4NCwzMzE4NSwzMzE4NiwzMzE4OCwzMzE4OSwzMzE5MSwzMzE5MywzMzE5NSwzMzE5NiwzMzE5NywzMzE5OCwzMzE5OSwzMzIwMCwzMzIwMSwzMzIwMiwzMzIwNCwzMzIwNSwzMzIwNiwzMzIwNywzMzIwOCwzMzIwOSwzMzIxMiwzMzIxMywzMzIxNCwzMzIxNSwzMzIyMCwzMzIyMSwzMzIyMywzMzIyNCwzMzIyNSwzMzIyNywzMzIyOSwzMzIzMCwzMzIzMSwzMzIzMiwzMzIzMywzMzIzNCwzMzIzNSwyNTcyMSwzNDMyMSwyNzE2OSwzMzE4MCwzMDk1MiwyNTcwNSwzOTc2NCwyNTI3MywyNjQxMSwzMzcwNywyMjY5Niw0MDY2NCwyNzgxOSwyODQ0OCwyMzUxOCwzODQ3NiwzNTg1MSwyOTI3OSwyNjU3NiwyNTI4NywyOTI4MSwyMDEzNywyMjk4MiwyNzU5NywyMjY3NSwyNjI4NiwyNDE0OSwyMTIxNSwyNDkxNywyNjQwOCwzMDQ0NiwzMDU2NiwyOTI4NywzMTMwMiwyNTM0MywyMTczOCwyMTU4NCwzODA0OCwzNzAyNywyMzA2OCwzMjQzNSwyNzY3MCwyMDAzNSwyMjkwMiwzMjc4NCwyMjg1NiwyMTMzNSwzMDAwNywzODU5MCwyMjIxOCwyNTM3NiwzMzA0MSwyNDcwMCwzODM5MywyODExOCwyMTYwMiwzOTI5NywyMDg2OSwyMzI3MywzMzAyMSwyMjk1OCwzODY3NSwyMDUyMiwyNzg3NywyMzYxMiwyNTMxMSwyMDMyMCwyMTMxMSwzMzE0NywzNjg3MCwyODM0NiwzNDA5MSwyNTI4OCwyNDE4MCwzMDkxMCwyNTc4MSwyNTQ2NywyNDU2NSwyMzA2NCwzNzI0Nyw0MDQ3OSwyMzYxNSwyNTQyMywzMjgzNCwyMzQyMSwyMTg3MCwzODIxOCwzODIyMSwyODAzNywyNDc0NCwyNjU5MiwyOTQwNiwyMDk1NywyMzQyNSwzMzIzNiwzMzIzNywzMzIzOCwzMzIzOSwzMzI0MCwzMzI0MSwzMzI0MiwzMzI0MywzMzI0NCwzMzI0NSwzMzI0NiwzMzI0NywzMzI0OCwzMzI0OSwzMzI1MCwzMzI1MiwzMzI1MywzMzI1NCwzMzI1NiwzMzI1NywzMzI1OSwzMzI2MiwzMzI2MywzMzI2NCwzMzI2NSwzMzI2NiwzMzI2OSwzMzI3MCwzMzI3MSwzMzI3MiwzMzI3MywzMzI3NCwzMzI3NywzMzI3OSwzMzI4MywzMzI4NywzMzI4OCwzMzI4OSwzMzI5MCwzMzI5MSwzMzI5NCwzMzI5NSwzMzI5NywzMzI5OSwzMzMwMSwzMzMwMiwzMzMwMywzMzMwNCwzMzMwNSwzMzMwNiwzMzMwOSwzMzMxMiwzMzMxNiwzMzMxNywzMzMxOCwzMzMxOSwzMzMyMSwzMzMyNiwzMzMzMCwzMzMzOCwzMzM0MCwzMzM0MSwzMzM0MywzMzM0NCwzMzM0NSwzMzM0NiwzMzM0NywzMzM0OSwzMzM1MCwzMzM1MiwzMzM1NCwzMzM1NiwzMzM1NywzMzM1OCwzMzM2MCwzMzM2MSwzMzM2MiwzMzM2MywzMzM2NCwzMzM2NSwzMzM2NiwzMzM2NywzMzM2OSwzMzM3MSwzMzM3MiwzMzM3MywzMzM3NCwzMzM3NiwzMzM3NywzMzM3OCwzMzM3OSwzMzM4MCwzMzM4MSwzMzM4MiwzMzM4MywzMzM4NSwyNTMxOSwyNzg3MCwyOTI3NSwyNTE5NywzODA2MiwzMjQ0NSwzMzA0MywyNzk4NywyMDg5MiwyNDMyNCwyMjkwMCwyMTE2MiwyNDU5NCwyMjg5OSwyNjI2MiwzNDM4NCwzMDExMSwyNTM4NiwyNTA2MiwzMTk4MywzNTgzNCwyMTczNCwyNzQzMSw0MDQ4NSwyNzU3MiwzNDI2MSwyMTU4OSwyMDU5OCwyNzgxMiwyMTg2NiwzNjI3NiwyOTIyOCwyNDA4NSwyNDU5NywyOTc1MCwyNTI5MywyNTQ5MCwyOTI2MCwyNDQ3MiwyODIyNywyNzk2NiwyNTg1NiwyODUwNCwzMDQyNCwzMDkyOCwzMDQ2MCwzMDAzNiwyMTAyOCwyMTQ2NywyMDA1MSwyNDIyMiwyNjA0OSwzMjgxMCwzMjk4MiwyNTI0MywyMTYzOCwyMTAzMiwyODg0NiwzNDk1NywzNjMwNSwyNzg3MywyMTYyNCwzMjk4NiwyMjUyMSwzNTA2MCwzNjE4MCwzODUwNiwzNzE5NywyMDMyOSwyNzgwMywyMTk0MywzMDQwNiwzMDc2OCwyNTI1NiwyODkyMSwyODU1OCwyNDQyOSwzNDAyOCwyNjg0MiwzMDg0NCwzMTczNSwzMzE5MiwyNjM3OSw0MDUyNywyNTQ0NywzMDg5NiwyMjM4MywzMDczOCwzODcxMywyNTIwOSwyNTI1OSwyMTEyOCwyOTc0OSwyNzYwNywzMzM4NiwzMzM4NywzMzM4OCwzMzM4OSwzMzM5MywzMzM5NywzMzM5OCwzMzM5OSwzMzQwMCwzMzQwMywzMzQwNCwzMzQwOCwzMzQwOSwzMzQxMSwzMzQxMywzMzQxNCwzMzQxNSwzMzQxNywzMzQyMCwzMzQyNCwzMzQyNywzMzQyOCwzMzQyOSwzMzQzMCwzMzQzNCwzMzQzNSwzMzQzOCwzMzQ0MCwzMzQ0MiwzMzQ0MywzMzQ0NywzMzQ1OCwzMzQ2MSwzMzQ2MiwzMzQ2NiwzMzQ2NywzMzQ2OCwzMzQ3MSwzMzQ3MiwzMzQ3NCwzMzQ3NSwzMzQ3NywzMzQ3OCwzMzQ4MSwzMzQ4OCwzMzQ5NCwzMzQ5NywzMzQ5OCwzMzUwMSwzMzUwNiwzMzUxMSwzMzUxMiwzMzUxMywzMzUxNCwzMzUxNiwzMzUxNywzMzUxOCwzMzUyMCwzMzUyMiwzMzUyMywzMzUyNSwzMzUyNiwzMzUyOCwzMzUzMCwzMzUzMiwzMzUzMywzMzUzNCwzMzUzNSwzMzUzNiwzMzU0NiwzMzU0NywzMzU0OSwzMzU1MiwzMzU1NCwzMzU1NSwzMzU1OCwzMzU2MCwzMzU2MSwzMzU2NSwzMzU2NiwzMzU2NywzMzU2OCwzMzU2OSwzMzU3MCwzMzU3MSwzMzU3MiwzMzU3MywzMzU3NCwzMzU3NywzMzU3OCwzMzU4MiwzMzU4NCwzMzU4NiwzMzU5MSwzMzU5NSwzMzU5NywyMTg2MCwzMzA4NiwzMDEzMCwzMDM4MiwyMTMwNSwzMDE3NCwyMDczMSwyMzYxNywzNTY5MiwzMTY4NywyMDU1OSwyOTI1NSwzOTU3NSwzOTEyOCwyODQxOCwyOTkyMiwzMTA4MCwyNTczNSwzMDYyOSwyNTM0MCwzOTA1NywzNjEzOSwyMTY5NywzMjg1NiwyMDA1MCwyMjM3OCwzMzUyOSwzMzgwNSwyNDE3OSwyMDk3MywyOTk0MiwzNTc4MCwyMzYzMSwyMjM2OSwyNzkwMCwzOTA0NywyMzExMCwzMDc3MiwzOTc0OCwzNjg0MywzMTg5MywyMTA3OCwyNTE2OSwzODEzOCwyMDE2NiwzMzY3MCwzMzg4OSwzMzc2OSwzMzk3MCwyMjQ4NCwyNjQyMCwyMjI3NSwyNjIyMiwyODAwNiwzNTg4OSwyNjMzMywyODY4OSwyNjM5OSwyNzQ1MCwyNjY0NiwyNTExNCwyMjk3MSwxOTk3MSwyMDkzMiwyODQyMiwyNjU3OCwyNzc5MSwyMDg1NCwyNjgyNywyMjg1NSwyNzQ5NSwzMDA1NCwyMzgyMiwzMzA0MCw0MDc4NCwyNjA3MSwzMTA0OCwzMTA0MSwzOTU2OSwzNjIxNSwyMzY4MiwyMDA2MiwyMDIyNSwyMTU1MSwyMjg2NSwzMDczMiwyMjEyMCwyNzY2OCwzNjgwNCwyNDMyMywyNzc3MywyNzg3NSwzNTc1NSwyNTQ4OCwzMzU5OCwzMzU5OSwzMzYwMSwzMzYwMiwzMzYwNCwzMzYwNSwzMzYwOCwzMzYxMCwzMzYxMSwzMzYxMiwzMzYxMywzMzYxNCwzMzYxOSwzMzYyMSwzMzYyMiwzMzYyMywzMzYyNCwzMzYyNSwzMzYyOSwzMzYzNCwzMzY0OCwzMzY0OSwzMzY1MCwzMzY1MSwzMzY1MiwzMzY1MywzMzY1NCwzMzY1NywzMzY1OCwzMzY2MiwzMzY2MywzMzY2NCwzMzY2NSwzMzY2NiwzMzY2NywzMzY2OCwzMzY3MSwzMzY3MiwzMzY3NCwzMzY3NSwzMzY3NiwzMzY3NywzMzY3OSwzMzY4MCwzMzY4MSwzMzY4NCwzMzY4NSwzMzY4NiwzMzY4NywzMzY4OSwzMzY5MCwzMzY5MywzMzY5NSwzMzY5NywzMzY5OCwzMzY5OSwzMzcwMCwzMzcwMSwzMzcwMiwzMzcwMywzMzcwOCwzMzcwOSwzMzcxMCwzMzcxMSwzMzcxNywzMzcyMywzMzcyNiwzMzcyNywzMzczMCwzMzczMSwzMzczMiwzMzczNCwzMzczNiwzMzczNywzMzczOSwzMzc0MSwzMzc0MiwzMzc0NCwzMzc0NSwzMzc0NiwzMzc0NywzMzc0OSwzMzc1MSwzMzc1MywzMzc1NCwzMzc1NSwzMzc1OCwzMzc2MiwzMzc2MywzMzc2NCwzMzc2NiwzMzc2NywzMzc2OCwzMzc3MSwzMzc3MiwzMzc3MywyNDY4OCwyNzk2NSwyOTMwMSwyNTE5MCwzODAzMCwzODA4NSwyMTMxNSwzNjgwMSwzMTYxNCwyMDE5MSwzNTg3OCwyMDA5NCw0MDY2MCwzODA2NSwzODA2NywyMTA2OSwyODUwOCwzNjk2MywyNzk3MywzNTg5MiwyMjU0NSwyMzg4NCwyNzQyNCwyNzQ2NSwyNjUzOCwyMTU5NSwzMzEwOCwzMjY1MiwyMjY4MSwzNDEwMywyNDM3OCwyNTI1MCwyNzIwNywzODIwMSwyNTk3MCwyNDcwOCwyNjcyNSwzMDYzMSwyMDA1MiwyMDM5MiwyNDAzOSwzODgwOCwyNTc3MiwzMjcyOCwyMzc4OSwyMDQzMSwzMTM3MywyMDk5OSwzMzU0MCwxOTk4OCwyNDYyMywzMTM2MywzODA1NCwyMDQwNSwyMDE0NiwzMTIwNiwyOTc0OCwyMTIyMCwzMzQ2NSwyNTgxMCwzMTE2NSwyMzUxNywyNzc3NywzODczOCwzNjczMSwyNzY4MiwyMDU0MiwyMTM3NSwyODE2NSwyNTgwNiwyNjIyOCwyNzY5NiwyNDc3MywzOTAzMSwzNTgzMSwyNDE5OCwyOTc1NiwzMTM1MSwzMTE3OSwxOTk5MiwzNzA0MSwyOTY5OSwyNzcxNCwyMjIzNCwzNzE5NSwyNzg0NSwzNjIzNSwyMTMwNiwzNDUwMiwyNjM1NCwzNjUyNywyMzYyNCwzOTUzNywyODE5MiwzMzc3NCwzMzc3NSwzMzc3OSwzMzc4MCwzMzc4MSwzMzc4MiwzMzc4MywzMzc4NiwzMzc4NywzMzc4OCwzMzc5MCwzMzc5MSwzMzc5MiwzMzc5NCwzMzc5NywzMzc5OSwzMzgwMCwzMzgwMSwzMzgwMiwzMzgwOCwzMzgxMCwzMzgxMSwzMzgxMiwzMzgxMywzMzgxNCwzMzgxNSwzMzgxNywzMzgxOCwzMzgxOSwzMzgyMiwzMzgyMywzMzgyNCwzMzgyNSwzMzgyNiwzMzgyNywzMzgzMywzMzgzNCwzMzgzNSwzMzgzNiwzMzgzNywzMzgzOCwzMzgzOSwzMzg0MCwzMzg0MiwzMzg0MywzMzg0NCwzMzg0NSwzMzg0NiwzMzg0NywzMzg0OSwzMzg1MCwzMzg1MSwzMzg1NCwzMzg1NSwzMzg1NiwzMzg1NywzMzg1OCwzMzg1OSwzMzg2MCwzMzg2MSwzMzg2MywzMzg2NCwzMzg2NSwzMzg2NiwzMzg2NywzMzg2OCwzMzg2OSwzMzg3MCwzMzg3MSwzMzg3MiwzMzg3NCwzMzg3NSwzMzg3NiwzMzg3NywzMzg3OCwzMzg4MCwzMzg4NSwzMzg4NiwzMzg4NywzMzg4OCwzMzg5MCwzMzg5MiwzMzg5MywzMzg5NCwzMzg5NSwzMzg5NiwzMzg5OCwzMzkwMiwzMzkwMywzMzkwNCwzMzkwNiwzMzkwOCwzMzkxMSwzMzkxMywzMzkxNSwzMzkxNiwyMTQ2MiwyMzA5NCw0MDg0MywzNjI1OSwyMTQzNSwyMjI4MCwzOTA3OSwyNjQzNSwzNzI3NSwyNzg0OSwyMDg0MCwzMDE1NCwyNTMzMSwyOTM1NiwyMTA0OCwyMTE0OSwzMjU3MCwyODgyMCwzMDI2NCwyMTM2NCw0MDUyMiwyNzA2MywzMDgzMCwzODU5MiwzNTAzMywzMjY3NiwyODk4MiwyOTEyMywyMDg3MywyNjU3OSwyOTkyNCwyMjc1NiwyNTg4MCwyMjE5OSwzNTc1MywzOTI4NiwyNTIwMCwzMjQ2OSwyNDgyNSwyODkwOSwyMjc2NCwyMDE2MSwyMDE1NCwyNDUyNSwzODg4NywyMDIxOSwzNTc0OCwyMDk5NSwyMjkyMiwzMjQyNywyNTE3MiwyMDE3MywyNjA4NSwyNTEwMiwzMzU5MiwzMzk5MywzMzYzNSwzNDcwMSwyOTA3NiwyODM0MiwyMzQ4MSwzMjQ2NiwyMDg4NywyNTU0NSwyNjU4MCwzMjkwNSwzMzU5MywzNDgzNywyMDc1NCwyMzQxOCwyMjkxNCwzNjc4NSwyMDA4MywyNzc0MSwyMDgzNywzNTEwOSwzNjcxOSwzODQ0NiwzNDEyMiwyOTc5MCwzODE2MCwzODM4NCwyODA3MCwzMzUwOSwyNDM2OSwyNTc0NiwyNzkyMiwzMzgzMiwzMzEzNCw0MDEzMSwyMjYyMiwzNjE4NywxOTk3NywyMTQ0MSwzMzkxNywzMzkxOCwzMzkxOSwzMzkyMCwzMzkyMSwzMzkyMywzMzkyNCwzMzkyNSwzMzkyNiwzMzkzMCwzMzkzMywzMzkzNSwzMzkzNiwzMzkzNywzMzkzOCwzMzkzOSwzMzk0MCwzMzk0MSwzMzk0MiwzMzk0NCwzMzk0NiwzMzk0NywzMzk0OSwzMzk1MCwzMzk1MSwzMzk1MiwzMzk1NCwzMzk1NSwzMzk1NiwzMzk1NywzMzk1OCwzMzk1OSwzMzk2MCwzMzk2MSwzMzk2MiwzMzk2MywzMzk2NCwzMzk2NSwzMzk2NiwzMzk2OCwzMzk2OSwzMzk3MSwzMzk3MywzMzk3NCwzMzk3NSwzMzk3OSwzMzk4MCwzMzk4MiwzMzk4NCwzMzk4NiwzMzk4NywzMzk4OSwzMzk5MCwzMzk5MSwzMzk5MiwzMzk5NSwzMzk5NiwzMzk5OCwzMzk5OSwzNDAwMiwzNDAwNCwzNDAwNSwzNDAwNywzNDAwOCwzNDAwOSwzNDAxMCwzNDAxMSwzNDAxMiwzNDAxNCwzNDAxNywzNDAxOCwzNDAyMCwzNDAyMywzNDAyNCwzNDAyNSwzNDAyNiwzNDAyNywzNDAyOSwzNDAzMCwzNDAzMSwzNDAzMywzNDAzNCwzNDAzNSwzNDAzNiwzNDAzNywzNDAzOCwzNDAzOSwzNDA0MCwzNDA0MSwzNDA0MiwzNDA0MywzNDA0NSwzNDA0NiwzNDA0OCwzNDA0OSwzNDA1MCwyMDI1NCwyNTk1NSwyNjcwNSwyMTk3MSwyMDAwNywyNTYyMCwzOTU3OCwyNTE5NSwyMzIzNCwyOTc5MSwzMzM5NCwyODA3MywyNjg2MiwyMDcxMSwzMzY3OCwzMDcyMiwyNjQzMiwyMTA0OSwyNzgwMSwzMjQzMywyMDY2NywyMTg2MSwyOTAyMiwzMTU3OSwyNjE5NCwyOTY0MiwzMzUxNSwyNjQ0MSwyMzY2NSwyMTAyNCwyOTA1MywzNDkyMywzODM3OCwzODQ4NSwyNTc5NywzNjE5MywzMzIwMywyMTg5MiwyNzczMywyNTE1OSwzMjU1OCwyMjY3NCwyMDI2MCwyMTgzMCwzNjE3NSwyNjE4OCwxOTk3OCwyMzU3OCwzNTA1OSwyNjc4NiwyNTQyMiwzMTI0NSwyODkwMywzMzQyMSwyMTI0MiwzODkwMiwyMzU2OSwyMTczNiwzNzA0NSwzMjQ2MSwyMjg4MiwzNjE3MCwzNDUwMywzMzI5MiwzMzI5MywzNjE5OCwyNTY2OCwyMzU1NiwyNDkxMywyODA0MSwzMTAzOCwzNTc3NCwzMDc3NSwzMDAwMywyMTYyNywyMDI4MCwzNjUyMywyODE0NSwyMzA3MiwzMjQ1MywzMTA3MCwyNzc4NCwyMzQ1NywyMzE1OCwyOTk3OCwzMjk1OCwyNDkxMCwyODE4MywyMjc2OCwyOTk4MywyOTk4OSwyOTI5OCwyMTMxOSwzMjQ5OSwzNDA1MSwzNDA1MiwzNDA1MywzNDA1NCwzNDA1NSwzNDA1NiwzNDA1NywzNDA1OCwzNDA1OSwzNDA2MSwzNDA2MiwzNDA2MywzNDA2NCwzNDA2NiwzNDA2OCwzNDA2OSwzNDA3MCwzNDA3MiwzNDA3MywzNDA3NSwzNDA3NiwzNDA3NywzNDA3OCwzNDA4MCwzNDA4MiwzNDA4MywzNDA4NCwzNDA4NSwzNDA4NiwzNDA4NywzNDA4OCwzNDA4OSwzNDA5MCwzNDA5MywzNDA5NCwzNDA5NSwzNDA5NiwzNDA5NywzNDA5OCwzNDA5OSwzNDEwMCwzNDEwMSwzNDEwMiwzNDExMCwzNDExMSwzNDExMiwzNDExMywzNDExNCwzNDExNiwzNDExNywzNDExOCwzNDExOSwzNDEyMywzNDEyNCwzNDEyNSwzNDEyNiwzNDEyNywzNDEyOCwzNDEyOSwzNDEzMCwzNDEzMSwzNDEzMiwzNDEzMywzNDEzNSwzNDEzNiwzNDEzOCwzNDEzOSwzNDE0MCwzNDE0MSwzNDE0MywzNDE0NCwzNDE0NSwzNDE0NiwzNDE0NywzNDE0OSwzNDE1MCwzNDE1MSwzNDE1MywzNDE1NCwzNDE1NSwzNDE1NiwzNDE1NywzNDE1OCwzNDE1OSwzNDE2MCwzNDE2MSwzNDE2MywzNDE2NSwzNDE2NiwzNDE2NywzNDE2OCwzNDE3MiwzNDE3MywzNDE3NSwzNDE3NiwzNDE3NywzMDQ2NSwzMDQyNywyMTA5NywzMjk4OCwyMjMwNywyNDA3MiwyMjgzMywyOTQyMiwyNjA0NSwyODI4NywzNTc5OSwyMzYwOCwzNDQxNywyMTMxMywzMDcwNywyNTM0MiwyNjEwMiwyMDE2MCwzOTEzNSwzNDQzMiwyMzQ1NCwzNTc4MiwyMTQ5MCwzMDY5MCwyMDM1MSwyMzYzMCwzOTU0MiwyMjk4NywyNDMzNSwzMTAzNCwyMjc2MywxOTk5MCwyNjYyMywyMDEwNywyNTMyNSwzNTQ3NSwzNjg5MywyMTE4MywyNjE1OSwyMTk4MCwyMjEyNCwzNjg2NiwyMDE4MSwyMDM2NSwzNzMyMiwzOTI4MCwyNzY2MywyNDA2NiwyNDY0MywyMzQ2MCwzNTI3MCwzNTc5NywyNTkxMCwyNTE2MywzOTMxOCwyMzQzMiwyMzU1MSwyNTQ4MCwyMTgwNiwyMTQ2MywzMDI0NiwyMDg2MSwzNDA5MiwyNjUzMCwyNjgwMywyNzUzMCwyNTIzNCwzNjc1NSwyMTQ2MCwzMzI5OCwyODExMywzMDA5NSwyMDA3MCwzNjE3NCwyMzQwOCwyOTA4NywzNDIyMywyNjI1NywyNjMyOSwzMjYyNiwzNDU2MCw0MDY1Myw0MDczNiwyMzY0NiwyNjQxNSwzNjg0OCwyNjY0MSwyNjQ2MywyNTEwMSwzMTQ0NiwyMjY2MSwyNDI0NiwyNTk2OCwyODQ2NSwzNDE3OCwzNDE3OSwzNDE4MiwzNDE4NCwzNDE4NSwzNDE4NiwzNDE4NywzNDE4OCwzNDE4OSwzNDE5MCwzNDE5MiwzNDE5MywzNDE5NCwzNDE5NSwzNDE5NiwzNDE5NywzNDE5OCwzNDE5OSwzNDIwMCwzNDIwMSwzNDIwMiwzNDIwNSwzNDIwNiwzNDIwNywzNDIwOCwzNDIwOSwzNDIxMCwzNDIxMSwzNDIxMywzNDIxNCwzNDIxNSwzNDIxNywzNDIxOSwzNDIyMCwzNDIyMSwzNDIyNSwzNDIyNiwzNDIyNywzNDIyOCwzNDIyOSwzNDIzMCwzNDIzMiwzNDIzNCwzNDIzNSwzNDIzNiwzNDIzNywzNDIzOCwzNDIzOSwzNDI0MCwzNDI0MiwzNDI0MywzNDI0NCwzNDI0NSwzNDI0NiwzNDI0NywzNDI0OCwzNDI1MCwzNDI1MSwzNDI1MiwzNDI1MywzNDI1NCwzNDI1NywzNDI1OCwzNDI2MCwzNDI2MiwzNDI2MywzNDI2NCwzNDI2NSwzNDI2NiwzNDI2NywzNDI2OSwzNDI3MCwzNDI3MSwzNDI3MiwzNDI3MywzNDI3NCwzNDI3NSwzNDI3NywzNDI3OCwzNDI3OSwzNDI4MCwzNDI4MiwzNDI4MywzNDI4NCwzNDI4NSwzNDI4NiwzNDI4NywzNDI4OCwzNDI4OSwzNDI5MCwzNDI5MSwzNDI5MiwzNDI5MywzNDI5NCwzNDI5NSwzNDI5NiwyNDY2MSwyMTA0NywzMjc4MSwyNTY4NCwzNDkyOCwyOTk5MywyNDA2OSwyNjY0MywyNTMzMiwzODY4NCwyMTQ1MiwyOTI0NSwzNTg0MSwyNzcwMCwzMDU2MSwzMTI0NiwyMTU1MCwzMDYzNiwzOTAzNCwzMzMwOCwzNTgyOCwzMDgwNSwyNjM4OCwyODg2NSwyNjAzMSwyNTc0OSwyMjA3MCwyNDYwNSwzMTE2OSwyMTQ5NiwxOTk5NywyNzUxNSwzMjkwMiwyMzU0NiwyMTk4NywyMjIzNSwyMDI4MiwyMDI4NCwzOTI4MiwyNDA1MSwyNjQ5NCwzMjgyNCwyNDU3OCwzOTA0MiwzNjg2NSwyMzQzNSwzNTc3MiwzNTgyOSwyNTYyOCwzMzM2OCwyNTgyMiwyMjAxMywzMzQ4NywzNzIyMSwyMDQzOSwzMjAzMiwzNjg5NSwzMTkwMywyMDcyMywyMjYwOSwyODMzNSwyMzQ4NywzNTc4NSwzMjg5OSwzNzI0MCwzMzk0OCwzMTYzOSwzNDQyOSwzODUzOSwzODU0MywzMjQ4NSwzOTYzNSwzMDg2MiwyMzY4MSwzMTMxOSwzNjkzMCwzODU2NywzMTA3MSwyMzM4NSwyNTQzOSwzMTQ5OSwzNDAwMSwyNjc5NywyMTc2NiwzMjU1MywyOTcxMiwzMjAzNCwzODE0NSwyNTE1MiwyMjYwNCwyMDE4MiwyMzQyNywyMjkwNSwyMjYxMiwzNDI5NywzNDI5OCwzNDMwMCwzNDMwMSwzNDMwMiwzNDMwNCwzNDMwNSwzNDMwNiwzNDMwNywzNDMwOCwzNDMxMCwzNDMxMSwzNDMxMiwzNDMxMywzNDMxNCwzNDMxNSwzNDMxNiwzNDMxNywzNDMxOCwzNDMxOSwzNDMyMCwzNDMyMiwzNDMyMywzNDMyNCwzNDMyNSwzNDMyNywzNDMyOCwzNDMyOSwzNDMzMCwzNDMzMSwzNDMzMiwzNDMzMywzNDMzNCwzNDMzNSwzNDMzNiwzNDMzNywzNDMzOCwzNDMzOSwzNDM0MCwzNDM0MSwzNDM0MiwzNDM0NCwzNDM0NiwzNDM0NywzNDM0OCwzNDM0OSwzNDM1MCwzNDM1MSwzNDM1MiwzNDM1MywzNDM1NCwzNDM1NSwzNDM1NiwzNDM1NywzNDM1OCwzNDM1OSwzNDM2MSwzNDM2MiwzNDM2MywzNDM2NSwzNDM2NiwzNDM2NywzNDM2OCwzNDM2OSwzNDM3MCwzNDM3MSwzNDM3MiwzNDM3MywzNDM3NCwzNDM3NSwzNDM3NiwzNDM3NywzNDM3OCwzNDM3OSwzNDM4MCwzNDM4NiwzNDM4NywzNDM4OSwzNDM5MCwzNDM5MSwzNDM5MiwzNDM5MywzNDM5NSwzNDM5NiwzNDM5NywzNDM5OSwzNDQwMCwzNDQwMSwzNDQwMywzNDQwNCwzNDQwNSwzNDQwNiwzNDQwNywzNDQwOCwzNDQwOSwzNDQxMCwyOTU0OSwyNTM3NCwzNjQyNywzNjM2NywzMjk3NCwzMzQ5MiwyNTI2MCwyMTQ4OCwyNzg4OCwzNzIxNCwyMjgyNiwyNDU3NywyNzc2MCwyMjM0OSwyNTY3NCwzNjEzOCwzMDI1MSwyODM5MywyMjM2MywyNzI2NCwzMDE5MiwyODUyNSwzNTg4NSwzNTg0OCwyMjM3NCwyNzYzMSwzNDk2MiwzMDg5OSwyNTUwNiwyMTQ5NywyODg0NSwyNzc0OCwyMjYxNiwyNTY0MiwyMjUzMCwyNjg0OCwzMzE3OSwyMTc3NiwzMTk1OCwyMDUwNCwzNjUzOCwyODEwOCwzNjI1NSwyODkwNywyNTQ4NywyODA1OSwyODM3MiwzMjQ4NiwzMzc5NiwyNjY5MSwzNjg2NywyODEyMCwzODUxOCwzNTc1MiwyMjg3MSwyOTMwNSwzNDI3NiwzMzE1MCwzMDE0MCwzNTQ2NiwyNjc5OSwyMTA3NiwzNjM4NiwzODE2MSwyNTU1MiwzOTA2NCwzNjQyMCwyMTg4NCwyMDMwNywyNjM2NywyMjE1OSwyNDc4OSwyODA1MywyMTA1OSwyMzYyNSwyMjgyNSwyODE1NSwyMjYzNSwzMDAwMCwyOTk4MCwyNDY4NCwzMzMwMCwzMzA5NCwyNTM2MSwyNjQ2NSwzNjgzNCwzMDUyMiwzNjMzOSwzNjE0OCwzODA4MSwyNDA4NiwyMTM4MSwyMTU0OCwyODg2NywzNDQxMywzNDQxNSwzNDQxNiwzNDQxOCwzNDQxOSwzNDQyMCwzNDQyMSwzNDQyMiwzNDQyMywzNDQyNCwzNDQzNSwzNDQzNiwzNDQzNywzNDQzOCwzNDQzOSwzNDQ0MCwzNDQ0MSwzNDQ0NiwzNDQ0NywzNDQ0OCwzNDQ0OSwzNDQ1MCwzNDQ1MiwzNDQ1NCwzNDQ1NSwzNDQ1NiwzNDQ1NywzNDQ1OCwzNDQ1OSwzNDQ2MiwzNDQ2MywzNDQ2NCwzNDQ2NSwzNDQ2NiwzNDQ2OSwzNDQ3MCwzNDQ3NSwzNDQ3NywzNDQ3OCwzNDQ4MiwzNDQ4MywzNDQ4NywzNDQ4OCwzNDQ4OSwzNDQ5MSwzNDQ5MiwzNDQ5MywzNDQ5NCwzNDQ5NSwzNDQ5NywzNDQ5OCwzNDQ5OSwzNDUwMSwzNDUwNCwzNDUwOCwzNDUwOSwzNDUxNCwzNDUxNSwzNDUxNywzNDUxOCwzNDUxOSwzNDUyMiwzNDUyNCwzNDUyNSwzNDUyOCwzNDUyOSwzNDUzMCwzNDUzMSwzNDUzMywzNDUzNCwzNDUzNSwzNDUzNiwzNDUzOCwzNDUzOSwzNDU0MCwzNDU0MywzNDU0OSwzNDU1MCwzNDU1MSwzNDU1NCwzNDU1NSwzNDU1NiwzNDU1NywzNDU1OSwzNDU2MSwzNDU2NCwzNDU2NSwzNDU2NiwzNDU3MSwzNDU3MiwzNDU3NCwzNDU3NSwzNDU3NiwzNDU3NywzNDU4MCwzNDU4MiwyNzcxMiwyNDMxMSwyMDU3MiwyMDE0MSwyNDIzNywyNTQwMiwzMzM1MSwzNjg5MCwyNjcwNCwzNzIzMCwzMDY0MywyMTUxNiwzODEwOCwyNDQyMCwzMTQ2MSwyNjc0MiwyNTQxMywzMTU3MCwzMjQ3OSwzMDE3MSwyMDU5OSwyNTIzNywyMjgzNiwzNjg3OSwyMDk4NCwzMTE3MSwzMTM2MSwyMjI3MCwyNDQ2NiwzNjg4NCwyODAzNCwyMzY0OCwyMjMwMywyMTUyMCwyMDgyMCwyODIzNywyMjI0MiwyNTUxMiwzOTA1OSwzMzE1MSwzNDU4MSwzNTExNCwzNjg2NCwyMTUzNCwyMzY2MywzMzIxNiwyNTMwMiwyNTE3NiwzMzA3Myw0MDUwMSwzODQ2NCwzOTUzNCwzOTU0OCwyNjkyNSwyMjk0OSwyNTI5OSwyMTgyMiwyNTM2NiwyMTcwMywzNDUyMSwyNzk2NCwyMzA0MywyOTkyNiwzNDk3MiwyNzQ5OCwyMjgwNiwzNTkxNiwyNDM2NywyODI4NiwyOTYwOSwzOTAzNywyMDAyNCwyODkxOSwyMzQzNiwzMDg3MSwyNTQwNSwyNjIwMiwzMDM1OCwyNDc3OSwyMzQ1MSwyMzExMywxOTk3NSwzMzEwOSwyNzc1NCwyOTU3OSwyMDEyOSwyNjUwNSwzMjU5MywyNDQ0OCwyNjEwNiwyNjM5NSwyNDUzNiwyMjkxNiwyMzA0MSwzNDU4NSwzNDU4NywzNDU4OSwzNDU5MSwzNDU5MiwzNDU5NiwzNDU5OCwzNDU5OSwzNDYwMCwzNDYwMiwzNDYwMywzNDYwNCwzNDYwNSwzNDYwNywzNDYwOCwzNDYxMCwzNDYxMSwzNDYxMywzNDYxNCwzNDYxNiwzNDYxNywzNDYxOCwzNDYyMCwzNDYyMSwzNDYyNCwzNDYyNSwzNDYyNiwzNDYyNywzNDYyOCwzNDYyOSwzNDYzMCwzNDYzNCwzNDYzNSwzNDYzNywzNDYzOSwzNDY0MCwzNDY0MSwzNDY0MiwzNDY0NCwzNDY0NSwzNDY0NiwzNDY0OCwzNDY1MCwzNDY1MSwzNDY1MiwzNDY1MywzNDY1NCwzNDY1NSwzNDY1NywzNDY1OCwzNDY2MiwzNDY2MywzNDY2NCwzNDY2NSwzNDY2NiwzNDY2NywzNDY2OCwzNDY2OSwzNDY3MSwzNDY3MywzNDY3NCwzNDY3NSwzNDY3NywzNDY3OSwzNDY4MCwzNDY4MSwzNDY4MiwzNDY4NywzNDY4OCwzNDY4OSwzNDY5MiwzNDY5NCwzNDY5NSwzNDY5NywzNDY5OCwzNDcwMCwzNDcwMiwzNDcwMywzNDcwNCwzNDcwNSwzNDcwNiwzNDcwOCwzNDcwOSwzNDcxMCwzNDcxMiwzNDcxMywzNDcxNCwzNDcxNSwzNDcxNiwzNDcxNywzNDcxOCwzNDcyMCwzNDcyMSwzNDcyMiwzNDcyMywzNDcyNCwyNDAxMywyNDQ5NCwyMTM2MSwzODg4NiwzNjgyOSwyNjY5MywyMjI2MCwyMTgwNywyNDc5OSwyMDAyNiwyODQ5MywzMjUwMCwzMzQ3OSwzMzgwNiwyMjk5NiwyMDI1NSwyMDI2NiwyMzYxNCwzMjQyOCwyNjQxMCwzNDA3NCwyMTYxOSwzMDAzMSwzMjk2MywyMTg5MCwzOTc1OSwyMDMwMSwyODIwNSwzNTg1OSwyMzU2MSwyNDk0NCwyMTM1NSwzMDIzOSwyODIwMSwzNDQ0MiwyNTk5MSwzODM5NSwzMjQ0MSwyMTU2MywzMTI4MywzMjAxMCwzODM4MiwyMTk4NSwzMjcwNSwyOTkzNCwyNTM3MywzNDU4MywyODA2NSwzMTM4OSwyNTEwNSwyNjAxNywyMTM1MSwyNTU2OSwyNzc3OSwyNDA0MywyMTU5NiwzODA1NiwyMDA0NCwyNzc0NSwzNTgyMCwyMzYyNywyNjA4MCwzMzQzNiwyNjc5MSwyMTU2NiwyMTU1NiwyNzU5NSwyNzQ5NCwyMDExNiwyNTQxMCwyMTMyMCwzMzMxMCwyMDIzNywyMDM5OCwyMjM2NiwyNTA5OCwzODY1NCwyNjIxMiwyOTI4OSwyMTI0NywyMTE1MywyNDczNSwzNTgyMywyNjEzMiwyOTA4MSwyNjUxMiwzNTE5OSwzMDgwMiwzMDcxNywyNjIyNCwyMjA3NSwyMTU2MCwzODE3NywyOTMwNiwzNDcyNSwzNDcyNiwzNDcyNywzNDcyOSwzNDczMCwzNDczNCwzNDczNiwzNDczNywzNDczOCwzNDc0MCwzNDc0MiwzNDc0MywzNDc0NCwzNDc0NSwzNDc0NywzNDc0OCwzNDc1MCwzNDc1MSwzNDc1MywzNDc1NCwzNDc1NSwzNDc1NiwzNDc1NywzNDc1OSwzNDc2MCwzNDc2MSwzNDc2NCwzNDc2NSwzNDc2NiwzNDc2NywzNDc2OCwzNDc3MiwzNDc3MywzNDc3NCwzNDc3NSwzNDc3NiwzNDc3NywzNDc3OCwzNDc4MCwzNDc4MSwzNDc4MiwzNDc4MywzNDc4NSwzNDc4NiwzNDc4NywzNDc4OCwzNDc5MCwzNDc5MSwzNDc5MiwzNDc5MywzNDc5NSwzNDc5NiwzNDc5NywzNDc5OSwzNDgwMCwzNDgwMSwzNDgwMiwzNDgwMywzNDgwNCwzNDgwNSwzNDgwNiwzNDgwNywzNDgwOCwzNDgxMCwzNDgxMSwzNDgxMiwzNDgxMywzNDgxNSwzNDgxNiwzNDgxNywzNDgxOCwzNDgyMCwzNDgyMSwzNDgyMiwzNDgyMywzNDgyNCwzNDgyNSwzNDgyNywzNDgyOCwzNDgyOSwzNDgzMCwzNDgzMSwzNDgzMiwzNDgzMywzNDgzNCwzNDgzNiwzNDgzOSwzNDg0MCwzNDg0MSwzNDg0MiwzNDg0NCwzNDg0NSwzNDg0NiwzNDg0NywzNDg0OCwzNDg1MSwzMTIzMiwyNDY4NywyNDA3NiwyNDcxMywzMzE4MSwyMjgwNSwyNDc5NiwyOTA2MCwyODkxMSwyODMzMCwyNzcyOCwyOTMxMiwyNzI2OCwzNDk4OSwyNDEwOSwyMDA2NCwyMzIxOSwyMTkxNiwzODExNSwyNzkyNywzMTk5NSwzODU1MywyNTEwMywzMjQ1NCwzMDYwNiwzNDQzMCwyMTI4MywzODY4NiwzNjc1OCwyNjI0NywyMzc3NywyMDM4NCwyOTQyMSwxOTk3OSwyMTQxNCwyMjc5OSwyMTUyMywyNTQ3MiwzODE4NCwyMDgwOCwyMDE4NSw0MDA5MiwzMjQyMCwyMTY4OCwzNjEzMiwzNDkwMCwzMzMzNSwzODM4NiwyODA0NiwyNDM1OCwyMzI0NCwyNjE3NCwzODUwNSwyOTYxNiwyOTQ4NiwyMTQzOSwzMzE0NiwzOTMwMSwzMjY3MywyMzQ2NiwzODUxOSwzODQ4MCwzMjQ0NywzMDQ1NiwyMTQxMCwzODI2MiwzOTMyMSwzMTY2NSwzNTE0MCwyODI0OCwyMDA2NSwzMjcyNCwzMTA3NywzNTgxNCwyNDgxOSwyMTcwOSwyMDEzOSwzOTAzMywyNDA1NSwyNzIzMywyMDY4NywyMTUyMSwzNTkzNywzMzgzMSwzMDgxMywzODY2MCwyMTA2NiwyMTc0MiwyMjE3OSwzODE0NCwyODA0MCwyMzQ3NywyODEwMiwyNjE5NSwzNDg1MiwzNDg1MywzNDg1NCwzNDg1NSwzNDg1NiwzNDg1NywzNDg1OCwzNDg1OSwzNDg2MCwzNDg2MSwzNDg2MiwzNDg2MywzNDg2NCwzNDg2NSwzNDg2NywzNDg2OCwzNDg2OSwzNDg3MCwzNDg3MSwzNDg3MiwzNDg3NCwzNDg3NSwzNDg3NywzNDg3OCwzNDg3OSwzNDg4MSwzNDg4MiwzNDg4MywzNDg4NiwzNDg4NywzNDg4OCwzNDg4OSwzNDg5MCwzNDg5MSwzNDg5NCwzNDg5NSwzNDg5NiwzNDg5NywzNDg5OCwzNDg5OSwzNDkwMSwzNDkwMiwzNDkwNCwzNDkwNiwzNDkwNywzNDkwOCwzNDkwOSwzNDkxMCwzNDkxMSwzNDkxMiwzNDkxOCwzNDkxOSwzNDkyMiwzNDkyNSwzNDkyNywzNDkyOSwzNDkzMSwzNDkzMiwzNDkzMywzNDkzNCwzNDkzNiwzNDkzNywzNDkzOCwzNDkzOSwzNDk0MCwzNDk0NCwzNDk0NywzNDk1MCwzNDk1MSwzNDk1MywzNDk1NCwzNDk1NiwzNDk1OCwzNDk1OSwzNDk2MCwzNDk2MSwzNDk2MywzNDk2NCwzNDk2NSwzNDk2NywzNDk2OCwzNDk2OSwzNDk3MCwzNDk3MSwzNDk3MywzNDk3NCwzNDk3NSwzNDk3NiwzNDk3NywzNDk3OSwzNDk4MSwzNDk4MiwzNDk4MywzNDk4NCwzNDk4NSwzNDk4NiwyMzU2NywyMzM4OSwyNjY1NywzMjkxOCwyMTg4MCwzMTUwNSwyNTkyOCwyNjk2NCwyMDEyMywyNzQ2MywzNDYzOCwzODc5NSwyMTMyNywyNTM3NSwyNTY1OCwzNzAzNCwyNjAxMiwzMjk2MSwzNTg1NiwyMDg4OSwyNjgwMCwyMTM2OCwzNDgwOSwyNTAzMiwyNzg0NCwyNzg5OSwzNTg3NCwyMzYzMywzNDIxOCwzMzQ1NSwzODE1NiwyNzQyNywzNjc2MywyNjAzMiwyNDU3MSwyNDUxNSwyMDQ0OSwzNDg4NSwyNjE0MywzMzEyNSwyOTQ4MSwyNDgyNiwyMDg1MiwyMTAwOSwyMjQxMSwyNDQxOCwzNzAyNiwzNDg5MiwzNzI2NiwyNDE4NCwyNjQ0NywyNDYxNSwyMjk5NSwyMDgwNCwyMDk4MiwzMzAxNiwyMTI1NiwyNzc2OSwzODU5NiwyOTA2NiwyMDI0MSwyMDQ2MiwzMjY3MCwyNjQyOSwyMTk1NywzODE1MiwzMTE2OCwzNDk2NiwzMjQ4MywyMjY4NywyNTEwMCwzODY1NiwzNDM5NCwyMjA0MCwzOTAzNSwyNDQ2NCwzNTc2OCwzMzk4OCwzNzIwNywyMTQ2NSwyNjA5MywyNDIwNywzMDA0NCwyNDY3NiwzMjExMCwyMzE2NywzMjQ5MCwzMjQ5MywzNjcxMywyMTkyNywyMzQ1OSwyNDc0OCwyNjA1OSwyOTU3MiwzNDk4OCwzNDk5MCwzNDk5MSwzNDk5MiwzNDk5NCwzNDk5NSwzNDk5NiwzNDk5NywzNDk5OCwzNTAwMCwzNTAwMSwzNTAwMiwzNTAwMywzNTAwNSwzNTAwNiwzNTAwNywzNTAwOCwzNTAxMSwzNTAxMiwzNTAxNSwzNTAxNiwzNTAxOCwzNTAxOSwzNTAyMCwzNTAyMSwzNTAyMywzNTAyNCwzNTAyNSwzNTAyNywzNTAzMCwzNTAzMSwzNTAzNCwzNTAzNSwzNTAzNiwzNTAzNywzNTAzOCwzNTA0MCwzNTA0MSwzNTA0NiwzNTA0NywzNTA0OSwzNTA1MCwzNTA1MSwzNTA1MiwzNTA1MywzNTA1NCwzNTA1NSwzNTA1OCwzNTA2MSwzNTA2MiwzNTA2MywzNTA2NiwzNTA2NywzNTA2OSwzNTA3MSwzNTA3MiwzNTA3MywzNTA3NSwzNTA3NiwzNTA3NywzNTA3OCwzNTA3OSwzNTA4MCwzNTA4MSwzNTA4MywzNTA4NCwzNTA4NSwzNTA4NiwzNTA4NywzNTA4OSwzNTA5MiwzNTA5MywzNTA5NCwzNTA5NSwzNTA5NiwzNTEwMCwzNTEwMSwzNTEwMiwzNTEwMywzNTEwNCwzNTEwNiwzNTEwNywzNTEwOCwzNTExMCwzNTExMSwzNTExMiwzNTExMywzNTExNiwzNTExNywzNTExOCwzNTExOSwzNTEyMSwzNTEyMiwzNTEyMywzNTEyNSwzNTEyNywzNjg3MywzMDMwNywzMDUwNSwzMjQ3NCwzODc3MiwzNDIwMywyMzM5OCwzMTM0OCwzODYzNCwzNDg4MCwyMTE5NSwyOTA3MSwyNDQ5MCwyNjA5MiwzNTgxMCwyMzU0NywzOTUzNSwyNDAzMywyNzUyOSwyNzczOSwzNTc1NywzNTc1OSwzNjg3NCwzNjgwNSwyMTM4NywyNTI3Niw0MDQ4Niw0MDQ5MywyMTU2OCwyMDAxMSwzMzQ2OSwyOTI3MywzNDQ2MCwyMzgzMCwzNDkwNSwyODA3OSwzODU5NywyMTcxMywyMDEyMiwzNTc2NiwyODkzNywyMTY5MywzODQwOSwyODg5NSwyODE1MywzMDQxNiwyMDAwNSwzMDc0MCwzNDU3OCwyMzcyMSwyNDMxMCwzNTMyOCwzOTA2OCwzODQxNCwyODgxNCwyNzgzOSwyMjg1MiwyNTUxMywzMDUyNCwzNDg5MywyODQzNiwzMzM5NSwyMjU3NiwyOTE0MSwyMTM4OCwzMDc0NiwzODU5MywyMTc2MSwyNDQyMiwyODk3NiwyMzQ3NiwzNTg2NiwzOTU2NCwyNzUyMywyMjgzMCw0MDQ5NSwzMTIwNywyNjQ3MiwyNTE5NiwyMDMzNSwzMDExMywzMjY1MCwyNzkxNSwzODQ1MSwyNzY4NywyMDIwOCwzMDE2MiwyMDg1OSwyNjY3OSwyODQ3OCwzNjk5MiwzMzEzNiwyMjkzNCwyOTgxNCwzNTEyOCwzNTEyOSwzNTEzMCwzNTEzMSwzNTEzMiwzNTEzMywzNTEzNCwzNTEzNSwzNTEzNiwzNTEzOCwzNTEzOSwzNTE0MSwzNTE0MiwzNTE0MywzNTE0NCwzNTE0NSwzNTE0NiwzNTE0NywzNTE0OCwzNTE0OSwzNTE1MCwzNTE1MSwzNTE1MiwzNTE1MywzNTE1NCwzNTE1NSwzNTE1NiwzNTE1NywzNTE1OCwzNTE1OSwzNTE2MCwzNTE2MSwzNTE2MiwzNTE2MywzNTE2NCwzNTE2NSwzNTE2OCwzNTE2OSwzNTE3MCwzNTE3MSwzNTE3MiwzNTE3MywzNTE3NSwzNTE3NiwzNTE3NywzNTE3OCwzNTE3OSwzNTE4MCwzNTE4MSwzNTE4MiwzNTE4MywzNTE4NCwzNTE4NSwzNTE4NiwzNTE4NywzNTE4OCwzNTE4OSwzNTE5MCwzNTE5MSwzNTE5MiwzNTE5MywzNTE5NCwzNTE5NiwzNTE5NywzNTE5OCwzNTIwMCwzNTIwMiwzNTIwNCwzNTIwNSwzNTIwNywzNTIwOCwzNTIwOSwzNTIxMCwzNTIxMSwzNTIxMiwzNTIxMywzNTIxNCwzNTIxNSwzNTIxNiwzNTIxNywzNTIxOCwzNTIxOSwzNTIyMCwzNTIyMSwzNTIyMiwzNTIyMywzNTIyNCwzNTIyNSwzNTIyNiwzNTIyNywzNTIyOCwzNTIyOSwzNTIzMCwzNTIzMSwzNTIzMiwzNTIzMywyNTY3MSwyMzU5MSwzNjk2NSwzMTM3NywzNTg3NSwyMzAwMiwyMTY3NiwzMzI4MCwzMzY0NywzNTIwMSwzMjc2OCwyNjkyOCwyMjA5NCwzMjgyMiwyOTIzOSwzNzMyNiwyMDkxOCwyMDA2MywzOTAyOSwyNTQ5NCwxOTk5NCwyMTQ5NCwyNjM1NSwzMzA5OSwyMjgxMiwyODA4MiwxOTk2OCwyMjc3NywyMTMwNywyNTU1OCwzODEyOSwyMDM4MSwyMDIzNCwzNDkxNSwzOTA1NiwyMjgzOSwzNjk1MSwzMTIyNywyMDIwMiwzMzAwOCwzMDA5NywyNzc3OCwyMzQ1MiwyMzAxNiwyNDQxMywyNjg4NSwzNDQzMywyMDUwNiwyNDA1MCwyMDA1NywzMDY5MSwyMDE5NywzMzQwMiwyNTIzMywyNjEzMSwzNzAwOSwyMzY3MywyMDE1OSwyNDQ0MSwzMzIyMiwzNjkyMCwzMjkwMCwzMDEyMywyMDEzNCwzNTAyOCwyNDg0NywyNzU4OSwyNDUxOCwyMDA0MSwzMDQxMCwyODMyMiwzNTgxMSwzNTc1OCwzNTg1MCwzNTc5MywyNDMyMiwzMjc2NCwzMjcxNiwzMjQ2MiwzMzU4OSwzMzY0MywyMjI0MCwyNzU3NSwzODg5OSwzODQ1MiwyMzAzNSwyMTUzNSwzODEzNCwyODEzOSwyMzQ5MywzOTI3OCwyMzYwOSwyNDM0MSwzODU0NCwzNTIzNCwzNTIzNSwzNTIzNiwzNTIzNywzNTIzOCwzNTIzOSwzNTI0MCwzNTI0MSwzNTI0MiwzNTI0MywzNTI0NCwzNTI0NSwzNTI0NiwzNTI0NywzNTI0OCwzNTI0OSwzNTI1MCwzNTI1MSwzNTI1MiwzNTI1MywzNTI1NCwzNTI1NSwzNTI1NiwzNTI1NywzNTI1OCwzNTI1OSwzNTI2MCwzNTI2MSwzNTI2MiwzNTI2MywzNTI2NCwzNTI2NywzNTI3NywzNTI4MywzNTI4NCwzNTI4NSwzNTI4NywzNTI4OCwzNTI4OSwzNTI5MSwzNTI5MywzNTI5NSwzNTI5NiwzNTI5NywzNTI5OCwzNTMwMCwzNTMwMywzNTMwNCwzNTMwNSwzNTMwNiwzNTMwOCwzNTMwOSwzNTMxMCwzNTMxMiwzNTMxMywzNTMxNCwzNTMxNiwzNTMxNywzNTMxOCwzNTMxOSwzNTMyMCwzNTMyMSwzNTMyMiwzNTMyMywzNTMyNCwzNTMyNSwzNTMyNiwzNTMyNywzNTMyOSwzNTMzMCwzNTMzMSwzNTMzMiwzNTMzMywzNTMzNCwzNTMzNiwzNTMzNywzNTMzOCwzNTMzOSwzNTM0MCwzNTM0MSwzNTM0MiwzNTM0MywzNTM0NCwzNTM0NSwzNTM0NiwzNTM0NywzNTM0OCwzNTM0OSwzNTM1MCwzNTM1MSwzNTM1MiwzNTM1MywzNTM1NCwzNTM1NSwzNTM1NiwzNTM1NywyMTM2MCwzMzUyMSwyNzE4NSwyMzE1Niw0MDU2MCwyNDIxMiwzMjU1MiwzMzcyMSwzMzgyOCwzMzgyOSwzMzYzOSwzNDYzMSwzNjgxNCwzNjE5NCwzMDQwOCwyNDQzMywzOTA2MiwzMDgyOCwyNjE0NCwyMTcyNywyNTMxNywyMDMyMywzMzIxOSwzMDE1MiwyNDI0OCwzODYwNSwzNjM2MiwzNDU1MywyMTY0NywyNzg5MSwyODA0NCwyNzcwNCwyNDcwMywyMTE5MSwyOTk5MiwyNDE4OSwyMDI0OCwyNDczNiwyNDU1MSwyMzU4OCwzMDAwMSwzNzAzOCwzODA4MCwyOTM2OSwyNzgzMywyODIxNiwzNzE5MywyNjM3NywyMTQ1MSwyMTQ5MSwyMDMwNSwzNzMyMSwzNTgyNSwyMTQ0OCwyNDE4OCwzNjgwMiwyODEzMiwyMDExMCwzMDQwMiwyNzAxNCwzNDM5OCwyNDg1OCwzMzI4NiwyMDMxMywyMDQ0NiwzNjkyNiw0MDA2MCwyNDg0MSwyODE4OSwyODE4MCwzODUzMywyMDEwNCwyMzA4OSwzODYzMiwxOTk4MiwyMzY3OSwzMTE2MSwyMzQzMSwzNTgyMSwzMjcwMSwyOTU3NywyMjQ5NSwzMzQxOSwzNzA1NywyMTUwNSwzNjkzNSwyMTk0NywyMzc4NiwyNDQ4MSwyNDg0MCwyNzQ0MiwyOTQyNSwzMjk0NiwzNTQ2NSwzNTM1OCwzNTM1OSwzNTM2MCwzNTM2MSwzNTM2MiwzNTM2MywzNTM2NCwzNTM2NSwzNTM2NiwzNTM2NywzNTM2OCwzNTM2OSwzNTM3MCwzNTM3MSwzNTM3MiwzNTM3MywzNTM3NCwzNTM3NSwzNTM3NiwzNTM3NywzNTM3OCwzNTM3OSwzNTM4MCwzNTM4MSwzNTM4MiwzNTM4MywzNTM4NCwzNTM4NSwzNTM4NiwzNTM4NywzNTM4OCwzNTM4OSwzNTM5MSwzNTM5MiwzNTM5MywzNTM5NCwzNTM5NSwzNTM5NiwzNTM5NywzNTM5OCwzNTM5OSwzNTQwMSwzNTQwMiwzNTQwMywzNTQwNCwzNTQwNSwzNTQwNiwzNTQwNywzNTQwOCwzNTQwOSwzNTQxMCwzNTQxMSwzNTQxMiwzNTQxMywzNTQxNCwzNTQxNSwzNTQxNiwzNTQxNywzNTQxOCwzNTQxOSwzNTQyMCwzNTQyMSwzNTQyMiwzNTQyMywzNTQyNCwzNTQyNSwzNTQyNiwzNTQyNywzNTQyOCwzNTQyOSwzNTQzMCwzNTQzMSwzNTQzMiwzNTQzMywzNTQzNCwzNTQzNSwzNTQzNiwzNTQzNywzNTQzOCwzNTQzOSwzNTQ0MCwzNTQ0MSwzNTQ0MiwzNTQ0MywzNTQ0NCwzNTQ0NSwzNTQ0NiwzNTQ0NywzNTQ0OCwzNTQ1MCwzNTQ1MSwzNTQ1MiwzNTQ1MywzNTQ1NCwzNTQ1NSwzNTQ1NiwyODAyMCwyMzUwNywzNTAyOSwzOTA0NCwzNTk0NywzOTUzMyw0MDQ5OSwyODE3MCwyMDkwMCwyMDgwMywyMjQzNSwzNDk0NSwyMTQwNywyNTU4OCwzNjc1NywyMjI1MywyMTU5MiwyMjI3OCwyOTUwMywyODMwNCwzMjUzNiwzNjgyOCwzMzQ4OSwyNDg5NSwyNDYxNiwzODQ5OCwyNjM1MiwzMjQyMiwzNjIzNCwzNjI5MSwzODA1MywyMzczMSwzMTkwOCwyNjM3NiwyNDc0MiwzODQwNSwzMjc5MiwyMDExMywzNzA5NSwyMTI0OCwzODUwNCwyMDgwMSwzNjgxNiwzNDE2NCwzNzIxMywyNjE5NywzODkwMSwyMzM4MSwyMTI3NywzMDc3NiwyNjQzNCwyNjY4NSwyMTcwNSwyODc5OCwyMzQ3MiwzNjczMywyMDg3NywyMjMxMiwyMTY4MSwyNTg3NCwyNjI0MiwzNjE5MCwzNjE2MywzMzAzOSwzMzkwMCwzNjk3MywzMTk2NywyMDk5MSwzNDI5OSwyNjUzMSwyNjA4OSwyODU3NywzNDQ2OCwzNjQ4MSwyMjEyMiwzNjg5NiwzMDMzOCwyODc5MCwyOTE1NywzNjEzMSwyNTMyMSwyMTAxNywyNzkwMSwzNjE1NiwyNDU5MCwyMjY4NiwyNDk3NCwyNjM2NiwzNjE5MiwyNTE2NiwyMTkzOSwyODE5NSwyNjQxMywzNjcxMSwzNTQ1NywzNTQ1OCwzNTQ1OSwzNTQ2MCwzNTQ2MSwzNTQ2MiwzNTQ2MywzNTQ2NCwzNTQ2NywzNTQ2OCwzNTQ2OSwzNTQ3MCwzNTQ3MSwzNTQ3MiwzNTQ3MywzNTQ3NCwzNTQ3NiwzNTQ3NywzNTQ3OCwzNTQ3OSwzNTQ4MCwzNTQ4MSwzNTQ4MiwzNTQ4MywzNTQ4NCwzNTQ4NSwzNTQ4NiwzNTQ4NywzNTQ4OCwzNTQ4OSwzNTQ5MCwzNTQ5MSwzNTQ5MiwzNTQ5MywzNTQ5NCwzNTQ5NSwzNTQ5NiwzNTQ5NywzNTQ5OCwzNTQ5OSwzNTUwMCwzNTUwMSwzNTUwMiwzNTUwMywzNTUwNCwzNTUwNSwzNTUwNiwzNTUwNywzNTUwOCwzNTUwOSwzNTUxMCwzNTUxMSwzNTUxMiwzNTUxMywzNTUxNCwzNTUxNSwzNTUxNiwzNTUxNywzNTUxOCwzNTUxOSwzNTUyMCwzNTUyMSwzNTUyMiwzNTUyMywzNTUyNCwzNTUyNSwzNTUyNiwzNTUyNywzNTUyOCwzNTUyOSwzNTUzMCwzNTUzMSwzNTUzMiwzNTUzMywzNTUzNCwzNTUzNSwzNTUzNiwzNTUzNywzNTUzOCwzNTUzOSwzNTU0MCwzNTU0MSwzNTU0MiwzNTU0MywzNTU0NCwzNTU0NSwzNTU0NiwzNTU0NywzNTU0OCwzNTU0OSwzNTU1MCwzNTU1MSwzNTU1MiwzNTU1MywzNTU1NCwzNTU1NSwzODExMywzODM5MiwzMDUwNCwyNjYyOSwyNzA0OCwyMTY0MywyMDA0NSwyODg1NiwzNTc4NCwyNTY4OCwyNTk5NSwyMzQyOSwzMTM2NCwyMDUzOCwyMzUyOCwzMDY1MSwyNzYxNywzNTQ0OSwzMTg5NiwyNzgzOCwzMDQxNSwyNjAyNSwzNjc1OSwyMzg1MywyMzYzNywzNDM2MCwyNjYzMiwyMTM0NCwyNTExMiwzMTQ0OSwyODI1MSwzMjUwOSwyNzE2NywzMTQ1NiwyNDQzMiwyODQ2NywyNDM1MiwyNTQ4NCwyODA3MiwyNjQ1NCwxOTk3NiwyNDA4MCwzNjEzNCwyMDE4MywzMjk2MCwzMDI2MCwzODU1NiwyNTMwNywyNjE1NywyNTIxNCwyNzgzNiwzNjIxMywyOTAzMSwzMjYxNywyMDgwNiwzMjkwMywyMTQ4NCwzNjk3NCwyNTI0MCwyMTc0NiwzNDU0NCwzNjc2MSwzMjc3MywzODE2NywzNDA3MSwzNjgyNSwyNzk5MywyOTY0NSwyNjAxNSwzMDQ5NSwyOTk1NiwzMDc1OSwzMzI3NSwzNjEyNiwzODAyNCwyMDM5MCwyNjUxNywzMDEzNywzNTc4NiwzODY2MywyNTM5MSwzODIxNSwzODQ1MywzMzk3NiwyNTM3OSwzMDUyOSwyNDQ0OSwyOTQyNCwyMDEwNSwyNDU5NiwyNTk3MiwyNTMyNywyNzQ5MSwyNTkxOSwzNTU1NiwzNTU1NywzNTU1OCwzNTU1OSwzNTU2MCwzNTU2MSwzNTU2MiwzNTU2MywzNTU2NCwzNTU2NSwzNTU2NiwzNTU2NywzNTU2OCwzNTU2OSwzNTU3MCwzNTU3MSwzNTU3MiwzNTU3MywzNTU3NCwzNTU3NSwzNTU3NiwzNTU3NywzNTU3OCwzNTU3OSwzNTU4MCwzNTU4MSwzNTU4MiwzNTU4MywzNTU4NCwzNTU4NSwzNTU4NiwzNTU4NywzNTU4OCwzNTU4OSwzNTU5MCwzNTU5MiwzNTU5MywzNTU5NCwzNTU5NSwzNTU5NiwzNTU5NywzNTU5OCwzNTU5OSwzNTYwMCwzNTYwMSwzNTYwMiwzNTYwMywzNTYwNCwzNTYwNSwzNTYwNiwzNTYwNywzNTYwOCwzNTYwOSwzNTYxMCwzNTYxMSwzNTYxMiwzNTYxMywzNTYxNCwzNTYxNSwzNTYxNiwzNTYxNywzNTYxOCwzNTYxOSwzNTYyMCwzNTYyMSwzNTYyMywzNTYyNCwzNTYyNSwzNTYyNiwzNTYyNywzNTYyOCwzNTYyOSwzNTYzMCwzNTYzMSwzNTYzMiwzNTYzMywzNTYzNCwzNTYzNSwzNTYzNiwzNTYzNywzNTYzOCwzNTYzOSwzNTY0MCwzNTY0MSwzNTY0MiwzNTY0MywzNTY0NCwzNTY0NSwzNTY0NiwzNTY0NywzNTY0OCwzNTY0OSwzNTY1MCwzNTY1MSwzNTY1MiwzNTY1MywyNDEwMywzMDE1MSwzNzA3MywzNTc3NywzMzQzNywyNjUyNSwyNTkwMywyMTU1MywzNDU4NCwzMDY5MywzMjkzMCwzMzAyNiwyNzcxMywyMDA0MywzMjQ1NSwzMjg0NCwzMDQ1MiwyNjg5MywyNzU0MiwyNTE5MSwyMDU0MCwyMDM1NiwyMjMzNiwyNTM1MSwyNzQ5MCwzNjI4NiwyMTQ4MiwyNjA4OCwzMjQ0MCwyNDUzNSwyNTM3MCwyNTUyNywzMzI2NywzMzI2OCwzMjYyMiwyNDA5MiwyMzc2OSwyMTA0NiwyNjIzNCwzMTIwOSwzMTI1OCwzNjEzNiwyODgyNSwzMDE2NCwyODM4MiwyNzgzNSwzMTM3OCwyMDAxMywzMDQwNSwyNDU0NCwzODA0NywzNDkzNSwzMjQ1NiwzMTE4MSwzMjk1OSwzNzMyNSwyMDIxMCwyMDI0NywzMzMxMSwyMTYwOCwyNDAzMCwyNzk1NCwzNTc4OCwzMTkwOSwzNjcyNCwzMjkyMCwyNDA5MCwyMTY1MCwzMDM4NSwyMzQ0OSwyNjE3MiwzOTU4OCwyOTY2NCwyNjY2NiwzNDUyMywyNjQxNywyOTQ4MiwzNTgzMiwzNTgwMywzNjg4MCwzMTQ4MSwyODg5MSwyOTAzOCwyNTI4NCwzMDYzMywyMjA2NSwyMDAyNywzMzg3OSwyNjYwOSwyMTE2MSwzNDQ5NiwzNjE0MiwzODEzNiwzMTU2OSwzNTY1NCwzNTY1NSwzNTY1NiwzNTY1NywzNTY1OCwzNTY1OSwzNTY2MCwzNTY2MSwzNTY2MiwzNTY2MywzNTY2NCwzNTY2NSwzNTY2NiwzNTY2NywzNTY2OCwzNTY2OSwzNTY3MCwzNTY3MSwzNTY3MiwzNTY3MywzNTY3NCwzNTY3NSwzNTY3NiwzNTY3NywzNTY3OCwzNTY3OSwzNTY4MCwzNTY4MSwzNTY4MiwzNTY4MywzNTY4NCwzNTY4NSwzNTY4NywzNTY4OCwzNTY4OSwzNTY5MCwzNTY5MSwzNTY5MywzNTY5NCwzNTY5NSwzNTY5NiwzNTY5NywzNTY5OCwzNTY5OSwzNTcwMCwzNTcwMSwzNTcwMiwzNTcwMywzNTcwNCwzNTcwNSwzNTcwNiwzNTcwNywzNTcwOCwzNTcwOSwzNTcxMCwzNTcxMSwzNTcxMiwzNTcxMywzNTcxNCwzNTcxNSwzNTcxNiwzNTcxNywzNTcxOCwzNTcxOSwzNTcyMCwzNTcyMSwzNTcyMiwzNTcyMywzNTcyNCwzNTcyNSwzNTcyNiwzNTcyNywzNTcyOCwzNTcyOSwzNTczMCwzNTczMSwzNTczMiwzNTczMywzNTczNCwzNTczNSwzNTczNiwzNTczNywzNTczOCwzNTczOSwzNTc0MCwzNTc0MSwzNTc0MiwzNTc0MywzNTc1NiwzNTc2MSwzNTc3MSwzNTc4MywzNTc5MiwzNTgxOCwzNTg0OSwzNTg3MCwyMDMwMywyNzg4MCwzMTA2OSwzOTU0NywyNTIzNSwyOTIyNiwyNTM0MSwxOTk4NywzMDc0MiwzNjcxNiwyNTc3NiwzNjE4NiwzMTY4NiwyNjcyOSwyNDE5NiwzNTAxMywyMjkxOCwyNTc1OCwyMjc2NiwyOTM2NiwyNjg5NCwzODE4MSwzNjg2MSwzNjE4NCwyMjM2OCwzMjUxMiwzNTg0NiwyMDkzNCwyNTQxNywyNTMwNSwyMTMzMSwyNjcwMCwyOTczMCwzMzUzNywzNzE5NiwyMTgyOCwzMDUyOCwyODc5NiwyNzk3OCwyMDg1NywyMTY3MiwzNjE2NCwyMzAzOSwyODM2MywyODEwMCwyMzM4OCwzMjA0MywyMDE4MCwzMTg2OSwyODM3MSwyMzM3NiwzMzI1OCwyODE3MywyMzM4MywzOTY4MywyNjgzNywzNjM5NCwyMzQ0NywzMjUwOCwyNDYzNSwzMjQzNywzNzA0OSwzNjIwOCwyMjg2MywyNTU0OSwzMTE5OSwzNjI3NSwyMTMzMCwyNjA2MywzMTA2MiwzNTc4MSwzODQ1OSwzMjQ1MiwzODA3NSwzMjM4NiwyMjA2OCwzNzI1NywyNjM2OCwzMjYxOCwyMzU2MiwzNjk4MSwyNjE1MiwyNDAzOCwyMDMwNCwyNjU5MCwyMDU3MCwyMDMxNiwyMjM1MiwyNDIzMSw1OTQwOCw1OTQwOSw1OTQxMCw1OTQxMSw1OTQxMiwzNTg5NiwzNTg5NywzNTg5OCwzNTg5OSwzNTkwMCwzNTkwMSwzNTkwMiwzNTkwMywzNTkwNCwzNTkwNiwzNTkwNywzNTkwOCwzNTkwOSwzNTkxMiwzNTkxNCwzNTkxNSwzNTkxNywzNTkxOCwzNTkxOSwzNTkyMCwzNTkyMSwzNTkyMiwzNTkyMywzNTkyNCwzNTkyNiwzNTkyNywzNTkyOCwzNTkyOSwzNTkzMSwzNTkzMiwzNTkzMywzNTkzNCwzNTkzNSwzNTkzNiwzNTkzOSwzNTk0MCwzNTk0MSwzNTk0MiwzNTk0MywzNTk0NCwzNTk0NSwzNTk0OCwzNTk0OSwzNTk1MCwzNTk1MSwzNTk1MiwzNTk1MywzNTk1NCwzNTk1NiwzNTk1NywzNTk1OCwzNTk1OSwzNTk2MywzNTk2NCwzNTk2NSwzNTk2NiwzNTk2NywzNTk2OCwzNTk2OSwzNTk3MSwzNTk3MiwzNTk3NCwzNTk3NSwzNTk3NiwzNTk3OSwzNTk4MSwzNTk4MiwzNTk4MywzNTk4NCwzNTk4NSwzNTk4NiwzNTk4NywzNTk4OSwzNTk5MCwzNTk5MSwzNTk5MywzNTk5NCwzNTk5NSwzNTk5NiwzNTk5NywzNTk5OCwzNTk5OSwzNjAwMCwzNjAwMSwzNjAwMiwzNjAwMywzNjAwNCwzNjAwNSwzNjAwNiwzNjAwNywzNjAwOCwzNjAwOSwzNjAxMCwzNjAxMSwzNjAxMiwzNjAxMywyMDEwOSwxOTk4MCwyMDgwMCwxOTk4NCwyNDMxOSwyMTMxNywxOTk4OSwyMDEyMCwxOTk5OCwzOTczMCwyMzQwNCwyMjEyMSwyMDAwOCwzMTE2MiwyMDAzMSwyMTI2OSwyMDAzOSwyMjgyOSwyOTI0MywyMTM1OCwyNzY2NCwyMjIzOSwzMjk5NiwzOTMxOSwyNzYwMywzMDU5MCw0MDcyNywyMDAyMiwyMDEyNyw0MDcyMCwyMDA2MCwyMDA3MywyMDExNSwzMzQxNiwyMzM4NywyMTg2OCwyMjAzMSwyMDE2NCwyMTM4OSwyMTQwNSwyMTQxMSwyMTQxMywyMTQyMiwzODc1NywzNjE4OSwyMTI3NCwyMTQ5MywyMTI4NiwyMTI5NCwyMTMxMCwzNjE4OCwyMTM1MCwyMTM0NywyMDk5NCwyMTAwMCwyMTAwNiwyMTAzNywyMTA0MywyMTA1NSwyMTA1NiwyMTA2OCwyMTA4NiwyMTA4OSwyMTA4NCwzMzk2NywyMTExNywyMTEyMiwyMTEyMSwyMTEzNiwyMTEzOSwyMDg2NiwzMjU5NiwyMDE1NSwyMDE2MywyMDE2OSwyMDE2MiwyMDIwMCwyMDE5MywyMDIwMywyMDE5MCwyMDI1MSwyMDIxMSwyMDI1OCwyMDMyNCwyMDIxMywyMDI2MSwyMDI2MywyMDIzMywyMDI2NywyMDMxOCwyMDMyNywyNTkxMiwyMDMxNCwyMDMxNywzNjAxNCwzNjAxNSwzNjAxNiwzNjAxNywzNjAxOCwzNjAxOSwzNjAyMCwzNjAyMSwzNjAyMiwzNjAyMywzNjAyNCwzNjAyNSwzNjAyNiwzNjAyNywzNjAyOCwzNjAyOSwzNjAzMCwzNjAzMSwzNjAzMiwzNjAzMywzNjAzNCwzNjAzNSwzNjAzNiwzNjAzNywzNjAzOCwzNjAzOSwzNjA0MCwzNjA0MSwzNjA0MiwzNjA0MywzNjA0NCwzNjA0NSwzNjA0NiwzNjA0NywzNjA0OCwzNjA0OSwzNjA1MCwzNjA1MSwzNjA1MiwzNjA1MywzNjA1NCwzNjA1NSwzNjA1NiwzNjA1NywzNjA1OCwzNjA1OSwzNjA2MCwzNjA2MSwzNjA2MiwzNjA2MywzNjA2NCwzNjA2NSwzNjA2NiwzNjA2NywzNjA2OCwzNjA2OSwzNjA3MCwzNjA3MSwzNjA3MiwzNjA3MywzNjA3NCwzNjA3NSwzNjA3NiwzNjA3NywzNjA3OCwzNjA3OSwzNjA4MCwzNjA4MSwzNjA4MiwzNjA4MywzNjA4NCwzNjA4NSwzNjA4NiwzNjA4NywzNjA4OCwzNjA4OSwzNjA5MCwzNjA5MSwzNjA5MiwzNjA5MywzNjA5NCwzNjA5NSwzNjA5NiwzNjA5NywzNjA5OCwzNjA5OSwzNjEwMCwzNjEwMSwzNjEwMiwzNjEwMywzNjEwNCwzNjEwNSwzNjEwNiwzNjEwNywzNjEwOCwzNjEwOSwyMDMxOSwyMDMxMSwyMDI3NCwyMDI4NSwyMDM0MiwyMDM0MCwyMDM2OSwyMDM2MSwyMDM1NSwyMDM2NywyMDM1MCwyMDM0NywyMDM5NCwyMDM0OCwyMDM5NiwyMDM3MiwyMDQ1NCwyMDQ1NiwyMDQ1OCwyMDQyMSwyMDQ0MiwyMDQ1MSwyMDQ0NCwyMDQzMywyMDQ0NywyMDQ3MiwyMDUyMSwyMDU1NiwyMDQ2NywyMDUyNCwyMDQ5NSwyMDUyNiwyMDUyNSwyMDQ3OCwyMDUwOCwyMDQ5MiwyMDUxNywyMDUyMCwyMDYwNiwyMDU0NywyMDU2NSwyMDU1MiwyMDU1OCwyMDU4OCwyMDYwMywyMDY0NSwyMDY0NywyMDY0OSwyMDY2NiwyMDY5NCwyMDc0MiwyMDcxNywyMDcxNiwyMDcxMCwyMDcxOCwyMDc0MywyMDc0NywyMDE4OSwyNzcwOSwyMDMxMiwyMDMyNSwyMDQzMCw0MDg2NCwyNzcxOCwzMTg2MCwyMDg0NiwyNDA2MSw0MDY0OSwzOTMyMCwyMDg2NSwyMjgwNCwyMTI0MSwyMTI2MSwzNTMzNSwyMTI2NCwyMDk3MSwyMjgwOSwyMDgyMSwyMDEyOCwyMDgyMiwyMDE0NywzNDkyNiwzNDk4MCwyMDE0OSwzMzA0NCwzNTAyNiwzMTEwNCwyMzM0OCwzNDgxOSwzMjY5NiwyMDkwNywyMDkxMywyMDkyNSwyMDkyNCwzNjExMCwzNjExMSwzNjExMiwzNjExMywzNjExNCwzNjExNSwzNjExNiwzNjExNywzNjExOCwzNjExOSwzNjEyMCwzNjEyMSwzNjEyMiwzNjEyMywzNjEyNCwzNjEyOCwzNjE3NywzNjE3OCwzNjE4MywzNjE5MSwzNjE5NywzNjIwMCwzNjIwMSwzNjIwMiwzNjIwNCwzNjIwNiwzNjIwNywzNjIwOSwzNjIxMCwzNjIxNiwzNjIxNywzNjIxOCwzNjIxOSwzNjIyMCwzNjIyMSwzNjIyMiwzNjIyMywzNjIyNCwzNjIyNiwzNjIyNywzNjIzMCwzNjIzMSwzNjIzMiwzNjIzMywzNjIzNiwzNjIzNywzNjIzOCwzNjIzOSwzNjI0MCwzNjI0MiwzNjI0MywzNjI0NSwzNjI0NiwzNjI0NywzNjI0OCwzNjI0OSwzNjI1MCwzNjI1MSwzNjI1MiwzNjI1MywzNjI1NCwzNjI1NiwzNjI1NywzNjI1OCwzNjI2MCwzNjI2MSwzNjI2MiwzNjI2MywzNjI2NCwzNjI2NSwzNjI2NiwzNjI2NywzNjI2OCwzNjI2OSwzNjI3MCwzNjI3MSwzNjI3MiwzNjI3NCwzNjI3OCwzNjI3OSwzNjI4MSwzNjI4MywzNjI4NSwzNjI4OCwzNjI4OSwzNjI5MCwzNjI5MywzNjI5NSwzNjI5NiwzNjI5NywzNjI5OCwzNjMwMSwzNjMwNCwzNjMwNiwzNjMwNywzNjMwOCwyMDkzNSwyMDg4NiwyMDg5OCwyMDkwMSwzNTc0NCwzNTc1MCwzNTc1MSwzNTc1NCwzNTc2NCwzNTc2NSwzNTc2NywzNTc3OCwzNTc3OSwzNTc4NywzNTc5MSwzNTc5MCwzNTc5NCwzNTc5NSwzNTc5NiwzNTc5OCwzNTgwMCwzNTgwMSwzNTgwNCwzNTgwNywzNTgwOCwzNTgxMiwzNTgxNiwzNTgxNywzNTgyMiwzNTgyNCwzNTgyNywzNTgzMCwzNTgzMywzNTgzNiwzNTgzOSwzNTg0MCwzNTg0MiwzNTg0NCwzNTg0NywzNTg1MiwzNTg1NSwzNTg1NywzNTg1OCwzNTg2MCwzNTg2MSwzNTg2MiwzNTg2NSwzNTg2NywzNTg2NCwzNTg2OSwzNTg3MSwzNTg3MiwzNTg3MywzNTg3NywzNTg3OSwzNTg4MiwzNTg4MywzNTg4NiwzNTg4NywzNTg5MCwzNTg5MSwzNTg5MywzNTg5NCwyMTM1MywyMTM3MCwzODQyOSwzODQzNCwzODQzMywzODQ0OSwzODQ0MiwzODQ2MSwzODQ2MCwzODQ2NiwzODQ3MywzODQ4NCwzODQ5NSwzODUwMywzODUwOCwzODUxNCwzODUxNiwzODUzNiwzODU0MSwzODU1MSwzODU3NiwzNzAxNSwzNzAxOSwzNzAyMSwzNzAxNywzNzAzNiwzNzAyNSwzNzA0NCwzNzA0MywzNzA0NiwzNzA1MCwzNjMwOSwzNjMxMiwzNjMxMywzNjMxNiwzNjMyMCwzNjMyMSwzNjMyMiwzNjMyNSwzNjMyNiwzNjMyNywzNjMyOSwzNjMzMywzNjMzNCwzNjMzNiwzNjMzNywzNjMzOCwzNjM0MCwzNjM0MiwzNjM0OCwzNjM1MCwzNjM1MSwzNjM1MiwzNjM1MywzNjM1NCwzNjM1NSwzNjM1NiwzNjM1OCwzNjM1OSwzNjM2MCwzNjM2MywzNjM2NSwzNjM2NiwzNjM2OCwzNjM2OSwzNjM3MCwzNjM3MSwzNjM3MywzNjM3NCwzNjM3NSwzNjM3NiwzNjM3NywzNjM3OCwzNjM3OSwzNjM4MCwzNjM4NCwzNjM4NSwzNjM4OCwzNjM4OSwzNjM5MCwzNjM5MSwzNjM5MiwzNjM5NSwzNjM5NywzNjQwMCwzNjQwMiwzNjQwMywzNjQwNCwzNjQwNiwzNjQwNywzNjQwOCwzNjQxMSwzNjQxMiwzNjQxNCwzNjQxNSwzNjQxOSwzNjQyMSwzNjQyMiwzNjQyOCwzNjQyOSwzNjQzMCwzNjQzMSwzNjQzMiwzNjQzNSwzNjQzNiwzNjQzNywzNjQzOCwzNjQzOSwzNjQ0MCwzNjQ0MiwzNjQ0MywzNjQ0NCwzNjQ0NSwzNjQ0NiwzNjQ0NywzNjQ0OCwzNjQ0OSwzNjQ1MCwzNjQ1MSwzNjQ1MiwzNjQ1MywzNjQ1NSwzNjQ1NiwzNjQ1OCwzNjQ1OSwzNjQ2MiwzNjQ2NSwzNzA0OCwzNzA0MCwzNzA3MSwzNzA2MSwzNzA1NCwzNzA3MiwzNzA2MCwzNzA2MywzNzA3NSwzNzA5NCwzNzA5MCwzNzA4NCwzNzA3OSwzNzA4MywzNzA5OSwzNzEwMywzNzExOCwzNzEyNCwzNzE1NCwzNzE1MCwzNzE1NSwzNzE2OSwzNzE2NywzNzE3NywzNzE4NywzNzE5MCwyMTAwNSwyMjg1MCwyMTE1NCwyMTE2NCwyMTE2NSwyMTE4MiwyMTc1OSwyMTIwMCwyMTIwNiwyMTIzMiwyMTQ3MSwyOTE2NiwzMDY2OSwyNDMwOCwyMDk4MSwyMDk4OCwzOTcyNywyMTQzMCwyNDMyMSwzMDA0MiwyNDA0NywyMjM0OCwyMjQ0MSwyMjQzMywyMjY1NCwyMjcxNiwyMjcyNSwyMjczNywyMjMxMywyMjMxNiwyMjMxNCwyMjMyMywyMjMyOSwyMjMxOCwyMjMxOSwyMjM2NCwyMjMzMSwyMjMzOCwyMjM3NywyMjQwNSwyMjM3OSwyMjQwNiwyMjM5NiwyMjM5NSwyMjM3NiwyMjM4MSwyMjM5MCwyMjM4NywyMjQ0NSwyMjQzNiwyMjQxMiwyMjQ1MCwyMjQ3OSwyMjQzOSwyMjQ1MiwyMjQxOSwyMjQzMiwyMjQ4NSwyMjQ4OCwyMjQ5MCwyMjQ4OSwyMjQ4MiwyMjQ1NiwyMjUxNiwyMjUxMSwyMjUyMCwyMjUwMCwyMjQ5MywzNjQ2NywzNjQ2OSwzNjQ3MSwzNjQ3MiwzNjQ3MywzNjQ3NCwzNjQ3NSwzNjQ3NywzNjQ3OCwzNjQ4MCwzNjQ4MiwzNjQ4MywzNjQ4NCwzNjQ4NiwzNjQ4OCwzNjQ4OSwzNjQ5MCwzNjQ5MSwzNjQ5MiwzNjQ5MywzNjQ5NCwzNjQ5NywzNjQ5OCwzNjQ5OSwzNjUwMSwzNjUwMiwzNjUwMywzNjUwNCwzNjUwNSwzNjUwNiwzNjUwNywzNjUwOSwzNjUxMSwzNjUxMiwzNjUxMywzNjUxNCwzNjUxNSwzNjUxNiwzNjUxNywzNjUxOCwzNjUxOSwzNjUyMCwzNjUyMSwzNjUyMiwzNjUyNSwzNjUyNiwzNjUyOCwzNjUyOSwzNjUzMSwzNjUzMiwzNjUzMywzNjUzNCwzNjUzNSwzNjUzNiwzNjUzNywzNjUzOSwzNjU0MCwzNjU0MSwzNjU0MiwzNjU0MywzNjU0NCwzNjU0NSwzNjU0NiwzNjU0NywzNjU0OCwzNjU0OSwzNjU1MCwzNjU1MSwzNjU1MiwzNjU1MywzNjU1NCwzNjU1NSwzNjU1NiwzNjU1NywzNjU1OSwzNjU2MCwzNjU2MSwzNjU2MiwzNjU2MywzNjU2NCwzNjU2NSwzNjU2NiwzNjU2NywzNjU2OCwzNjU2OSwzNjU3MCwzNjU3MSwzNjU3MiwzNjU3MywzNjU3NCwzNjU3NSwzNjU3NiwzNjU3NywzNjU3OCwzNjU3OSwzNjU4MCwyMjUzOSwyMjU0MSwyMjUyNSwyMjUwOSwyMjUyOCwyMjU1OCwyMjU1MywyMjU5NiwyMjU2MCwyMjYyOSwyMjYzNiwyMjY1NywyMjY2NSwyMjY4MiwyMjY1NiwzOTMzNiw0MDcyOSwyNTA4NywzMzQwMSwzMzQwNSwzMzQwNywzMzQyMywzMzQxOCwzMzQ0OCwzMzQxMiwzMzQyMiwzMzQyNSwzMzQzMSwzMzQzMywzMzQ1MSwzMzQ2NCwzMzQ3MCwzMzQ1NiwzMzQ4MCwzMzQ4MiwzMzUwNywzMzQzMiwzMzQ2MywzMzQ1NCwzMzQ4MywzMzQ4NCwzMzQ3MywzMzQ0OSwzMzQ2MCwzMzQ0MSwzMzQ1MCwzMzQzOSwzMzQ3NiwzMzQ4NiwzMzQ0NCwzMzUwNSwzMzU0NSwzMzUyNywzMzUwOCwzMzU1MSwzMzU0MywzMzUwMCwzMzUyNCwzMzQ5MCwzMzQ5NiwzMzU0OCwzMzUzMSwzMzQ5MSwzMzU1MywzMzU2MiwzMzU0MiwzMzU1NiwzMzU1NywzMzUwNCwzMzQ5MywzMzU2NCwzMzYxNywzMzYyNywzMzYyOCwzMzU0NCwzMzY4MiwzMzU5NiwzMzU4OCwzMzU4NSwzMzY5MSwzMzYzMCwzMzU4MywzMzYxNSwzMzYwNywzMzYwMywzMzYzMSwzMzYwMCwzMzU1OSwzMzYzMiwzMzU4MSwzMzU5NCwzMzU4NywzMzYzOCwzMzYzNywzNjU4MSwzNjU4MiwzNjU4MywzNjU4NCwzNjU4NSwzNjU4NiwzNjU4NywzNjU4OCwzNjU4OSwzNjU5MCwzNjU5MSwzNjU5MiwzNjU5MywzNjU5NCwzNjU5NSwzNjU5NiwzNjU5NywzNjU5OCwzNjU5OSwzNjYwMCwzNjYwMSwzNjYwMiwzNjYwMywzNjYwNCwzNjYwNSwzNjYwNiwzNjYwNywzNjYwOCwzNjYwOSwzNjYxMCwzNjYxMSwzNjYxMiwzNjYxMywzNjYxNCwzNjYxNSwzNjYxNiwzNjYxNywzNjYxOCwzNjYxOSwzNjYyMCwzNjYyMSwzNjYyMiwzNjYyMywzNjYyNCwzNjYyNSwzNjYyNiwzNjYyNywzNjYyOCwzNjYyOSwzNjYzMCwzNjYzMSwzNjYzMiwzNjYzMywzNjYzNCwzNjYzNSwzNjYzNiwzNjYzNywzNjYzOCwzNjYzOSwzNjY0MCwzNjY0MSwzNjY0MiwzNjY0MywzNjY0NCwzNjY0NSwzNjY0NiwzNjY0NywzNjY0OCwzNjY0OSwzNjY1MCwzNjY1MSwzNjY1MiwzNjY1MywzNjY1NCwzNjY1NSwzNjY1NiwzNjY1NywzNjY1OCwzNjY1OSwzNjY2MCwzNjY2MSwzNjY2MiwzNjY2MywzNjY2NCwzNjY2NSwzNjY2NiwzNjY2NywzNjY2OCwzNjY2OSwzNjY3MCwzNjY3MSwzNjY3MiwzNjY3MywzNjY3NCwzNjY3NSwzNjY3NiwzMzY0MCwzMzU2MywzMzY0MSwzMzY0NCwzMzY0MiwzMzY0NSwzMzY0NiwzMzcxMiwzMzY1NiwzMzcxNSwzMzcxNiwzMzY5NiwzMzcwNiwzMzY4MywzMzY5MiwzMzY2OSwzMzY2MCwzMzcxOCwzMzcwNSwzMzY2MSwzMzcyMCwzMzY1OSwzMzY4OCwzMzY5NCwzMzcwNCwzMzcyMiwzMzcyNCwzMzcyOSwzMzc5MywzMzc2NSwzMzc1MiwyMjUzNSwzMzgxNiwzMzgwMywzMzc1NywzMzc4OSwzMzc1MCwzMzgyMCwzMzg0OCwzMzgwOSwzMzc5OCwzMzc0OCwzMzc1OSwzMzgwNywzMzc5NSwzMzc4NCwzMzc4NSwzMzc3MCwzMzczMywzMzcyOCwzMzgzMCwzMzc3NiwzMzc2MSwzMzg4NCwzMzg3MywzMzg4MiwzMzg4MSwzMzkwNywzMzkyNywzMzkyOCwzMzkxNCwzMzkyOSwzMzkxMiwzMzg1MiwzMzg2MiwzMzg5NywzMzkxMCwzMzkzMiwzMzkzNCwzMzg0MSwzMzkwMSwzMzk4NSwzMzk5NywzNDAwMCwzNDAyMiwzMzk4MSwzNDAwMywzMzk5NCwzMzk4MywzMzk3OCwzNDAxNiwzMzk1MywzMzk3NywzMzk3MiwzMzk0MywzNDAyMSwzNDAxOSwzNDA2MCwyOTk2NSwzNDEwNCwzNDAzMiwzNDEwNSwzNDA3OSwzNDEwNiwzNjY3NywzNjY3OCwzNjY3OSwzNjY4MCwzNjY4MSwzNjY4MiwzNjY4MywzNjY4NCwzNjY4NSwzNjY4NiwzNjY4NywzNjY4OCwzNjY4OSwzNjY5MCwzNjY5MSwzNjY5MiwzNjY5MywzNjY5NCwzNjY5NSwzNjY5NiwzNjY5NywzNjY5OCwzNjY5OSwzNjcwMCwzNjcwMSwzNjcwMiwzNjcwMywzNjcwNCwzNjcwNSwzNjcwNiwzNjcwNywzNjcwOCwzNjcwOSwzNjcxNCwzNjczNiwzNjc0OCwzNjc1NCwzNjc2NSwzNjc2OCwzNjc2OSwzNjc3MCwzNjc3MiwzNjc3MywzNjc3NCwzNjc3NSwzNjc3OCwzNjc4MCwzNjc4MSwzNjc4MiwzNjc4MywzNjc4NiwzNjc4NywzNjc4OCwzNjc4OSwzNjc5MSwzNjc5MiwzNjc5NCwzNjc5NSwzNjc5NiwzNjc5OSwzNjgwMCwzNjgwMywzNjgwNiwzNjgwOSwzNjgxMCwzNjgxMSwzNjgxMiwzNjgxMywzNjgxNSwzNjgxOCwzNjgyMiwzNjgyMywzNjgyNiwzNjgzMiwzNjgzMywzNjgzNSwzNjgzOSwzNjg0NCwzNjg0NywzNjg0OSwzNjg1MCwzNjg1MiwzNjg1MywzNjg1NCwzNjg1OCwzNjg1OSwzNjg2MCwzNjg2MiwzNjg2MywzNjg3MSwzNjg3MiwzNjg3NiwzNjg3OCwzNjg4MywzNjg4NSwzNjg4OCwzNDEzNCwzNDEwNywzNDA0NywzNDA0NCwzNDEzNywzNDEyMCwzNDE1MiwzNDE0OCwzNDE0MiwzNDE3MCwzMDYyNiwzNDExNSwzNDE2MiwzNDE3MSwzNDIxMiwzNDIxNiwzNDE4MywzNDE5MSwzNDE2OSwzNDIyMiwzNDIwNCwzNDE4MSwzNDIzMywzNDIzMSwzNDIyNCwzNDI1OSwzNDI0MSwzNDI2OCwzNDMwMywzNDM0MywzNDMwOSwzNDM0NSwzNDMyNiwzNDM2NCwyNDMxOCwyNDMyOCwyMjg0NCwyMjg0OSwzMjgyMywyMjg2OSwyMjg3NCwyMjg3MiwyMTI2MywyMzU4NiwyMzU4OSwyMzU5NiwyMzYwNCwyNTE2NCwyNTE5NCwyNTI0NywyNTI3NSwyNTI5MCwyNTMwNiwyNTMwMywyNTMyNiwyNTM3OCwyNTMzNCwyNTQwMSwyNTQxOSwyNTQxMSwyNTUxNywyNTU5MCwyNTQ1NywyNTQ2NiwyNTQ4NiwyNTUyNCwyNTQ1MywyNTUxNiwyNTQ4MiwyNTQ0OSwyNTUxOCwyNTUzMiwyNTU4NiwyNTU5MiwyNTU2OCwyNTU5OSwyNTU0MCwyNTU2NiwyNTU1MCwyNTY4MiwyNTU0MiwyNTUzNCwyNTY2OSwyNTY2NSwyNTYxMSwyNTYyNywyNTYzMiwyNTYxMiwyNTYzOCwyNTYzMywyNTY5NCwyNTczMiwyNTcwOSwyNTc1MCwzNjg4OSwzNjg5MiwzNjg5OSwzNjkwMCwzNjkwMSwzNjkwMywzNjkwNCwzNjkwNSwzNjkwNiwzNjkwNywzNjkwOCwzNjkxMiwzNjkxMywzNjkxNCwzNjkxNSwzNjkxNiwzNjkxOSwzNjkyMSwzNjkyMiwzNjkyNSwzNjkyNywzNjkyOCwzNjkzMSwzNjkzMywzNjkzNCwzNjkzNiwzNjkzNywzNjkzOCwzNjkzOSwzNjk0MCwzNjk0MiwzNjk0OCwzNjk0OSwzNjk1MCwzNjk1MywzNjk1NCwzNjk1NiwzNjk1NywzNjk1OCwzNjk1OSwzNjk2MCwzNjk2MSwzNjk2NCwzNjk2NiwzNjk2NywzNjk2OSwzNjk3MCwzNjk3MSwzNjk3MiwzNjk3NSwzNjk3NiwzNjk3NywzNjk3OCwzNjk3OSwzNjk4MiwzNjk4MywzNjk4NCwzNjk4NSwzNjk4NiwzNjk4NywzNjk4OCwzNjk5MCwzNjk5MywzNjk5NiwzNjk5NywzNjk5OCwzNjk5OSwzNzAwMSwzNzAwMiwzNzAwNCwzNzAwNSwzNzAwNiwzNzAwNywzNzAwOCwzNzAxMCwzNzAxMiwzNzAxNCwzNzAxNiwzNzAxOCwzNzAyMCwzNzAyMiwzNzAyMywzNzAyNCwzNzAyOCwzNzAyOSwzNzAzMSwzNzAzMiwzNzAzMywzNzAzNSwzNzAzNywzNzA0MiwzNzA0NywzNzA1MiwzNzA1MywzNzA1NSwzNzA1NiwyNTcyMiwyNTc4MywyNTc4NCwyNTc1MywyNTc4NiwyNTc5MiwyNTgwOCwyNTgxNSwyNTgyOCwyNTgyNiwyNTg2NSwyNTg5MywyNTkwMiwyNDMzMSwyNDUzMCwyOTk3NywyNDMzNywyMTM0MywyMTQ4OSwyMTUwMSwyMTQ4MSwyMTQ4MCwyMTQ5OSwyMTUyMiwyMTUyNiwyMTUxMCwyMTU3OSwyMTU4NiwyMTU4NywyMTU4OCwyMTU5MCwyMTU3MSwyMTUzNywyMTU5MSwyMTU5MywyMTUzOSwyMTU1NCwyMTYzNCwyMTY1MiwyMTYyMywyMTYxNywyMTYwNCwyMTY1OCwyMTY1OSwyMTYzNiwyMTYyMiwyMTYwNiwyMTY2MSwyMTcxMiwyMTY3NywyMTY5OCwyMTY4NCwyMTcxNCwyMTY3MSwyMTY3MCwyMTcxNSwyMTcxNiwyMTYxOCwyMTY2NywyMTcxNywyMTY5MSwyMTY5NSwyMTcwOCwyMTcyMSwyMTcyMiwyMTcyNCwyMTY3MywyMTY3NCwyMTY2OCwyMTcyNSwyMTcxMSwyMTcyNiwyMTc4NywyMTczNSwyMTc5MiwyMTc1NywyMTc4MCwyMTc0NywyMTc5NCwyMTc5NSwyMTc3NSwyMTc3NywyMTc5OSwyMTgwMiwyMTg2MywyMTkwMywyMTk0MSwyMTgzMywyMTg2OSwyMTgyNSwyMTg0NSwyMTgyMywyMTg0MCwyMTgyMCwzNzA1OCwzNzA1OSwzNzA2MiwzNzA2NCwzNzA2NSwzNzA2NywzNzA2OCwzNzA2OSwzNzA3NCwzNzA3NiwzNzA3NywzNzA3OCwzNzA4MCwzNzA4MSwzNzA4MiwzNzA4NiwzNzA4NywzNzA4OCwzNzA5MSwzNzA5MiwzNzA5MywzNzA5NywzNzA5OCwzNzEwMCwzNzEwMiwzNzEwNCwzNzEwNSwzNzEwNiwzNzEwNywzNzEwOSwzNzExMCwzNzExMSwzNzExMywzNzExNCwzNzExNSwzNzExNiwzNzExOSwzNzEyMCwzNzEyMSwzNzEyMywzNzEyNSwzNzEyNiwzNzEyNywzNzEyOCwzNzEyOSwzNzEzMCwzNzEzMSwzNzEzMiwzNzEzMywzNzEzNCwzNzEzNSwzNzEzNiwzNzEzNywzNzEzOCwzNzEzOSwzNzE0MCwzNzE0MSwzNzE0MiwzNzE0MywzNzE0NCwzNzE0NiwzNzE0NywzNzE0OCwzNzE0OSwzNzE1MSwzNzE1MiwzNzE1MywzNzE1NiwzNzE1NywzNzE1OCwzNzE1OSwzNzE2MCwzNzE2MSwzNzE2MiwzNzE2MywzNzE2NCwzNzE2NSwzNzE2NiwzNzE2OCwzNzE3MCwzNzE3MSwzNzE3MiwzNzE3MywzNzE3NCwzNzE3NSwzNzE3NiwzNzE3OCwzNzE3OSwzNzE4MCwzNzE4MSwzNzE4MiwzNzE4MywzNzE4NCwzNzE4NSwzNzE4NiwzNzE4OCwyMTgxNSwyMTg0NiwyMTg3NywyMTg3OCwyMTg3OSwyMTgxMSwyMTgwOCwyMTg1MiwyMTg5OSwyMTk3MCwyMTg5MSwyMTkzNywyMTk0NSwyMTg5NiwyMTg4OSwyMTkxOSwyMTg4NiwyMTk3NCwyMTkwNSwyMTg4MywyMTk4MywyMTk0OSwyMTk1MCwyMTkwOCwyMTkxMywyMTk5NCwyMjAwNywyMTk2MSwyMjA0NywyMTk2OSwyMTk5NSwyMTk5NiwyMTk3MiwyMTk5MCwyMTk4MSwyMTk1NiwyMTk5OSwyMTk4OSwyMjAwMiwyMjAwMywyMTk2NCwyMTk2NSwyMTk5MiwyMjAwNSwyMTk4OCwzNjc1NiwyMjA0NiwyMjAyNCwyMjAyOCwyMjAxNywyMjA1MiwyMjA1MSwyMjAxNCwyMjAxNiwyMjA1NSwyMjA2MSwyMjEwNCwyMjA3MywyMjEwMywyMjA2MCwyMjA5MywyMjExNCwyMjEwNSwyMjEwOCwyMjA5MiwyMjEwMCwyMjE1MCwyMjExNiwyMjEyOSwyMjEyMywyMjEzOSwyMjE0MCwyMjE0OSwyMjE2MywyMjE5MSwyMjIyOCwyMjIzMSwyMjIzNywyMjI0MSwyMjI2MSwyMjI1MSwyMjI2NSwyMjI3MSwyMjI3NiwyMjI4MiwyMjI4MSwyMjMwMCwyNDA3OSwyNDA4OSwyNDA4NCwyNDA4MSwyNDExMywyNDEyMywyNDEyNCwzNzE4OSwzNzE5MSwzNzE5MiwzNzIwMSwzNzIwMywzNzIwNCwzNzIwNSwzNzIwNiwzNzIwOCwzNzIwOSwzNzIxMSwzNzIxMiwzNzIxNSwzNzIxNiwzNzIyMiwzNzIyMywzNzIyNCwzNzIyNywzNzIyOSwzNzIzNSwzNzI0MiwzNzI0MywzNzI0NCwzNzI0OCwzNzI0OSwzNzI1MCwzNzI1MSwzNzI1MiwzNzI1NCwzNzI1NiwzNzI1OCwzNzI2MiwzNzI2MywzNzI2NywzNzI2OCwzNzI2OSwzNzI3MCwzNzI3MSwzNzI3MiwzNzI3MywzNzI3NiwzNzI3NywzNzI3OCwzNzI3OSwzNzI4MCwzNzI4MSwzNzI4NCwzNzI4NSwzNzI4NiwzNzI4NywzNzI4OCwzNzI4OSwzNzI5MSwzNzI5MiwzNzI5NiwzNzI5NywzNzI5OCwzNzI5OSwzNzMwMiwzNzMwMywzNzMwNCwzNzMwNSwzNzMwNywzNzMwOCwzNzMwOSwzNzMxMCwzNzMxMSwzNzMxMiwzNzMxMywzNzMxNCwzNzMxNSwzNzMxNiwzNzMxNywzNzMxOCwzNzMyMCwzNzMyMywzNzMyOCwzNzMzMCwzNzMzMSwzNzMzMiwzNzMzMywzNzMzNCwzNzMzNSwzNzMzNiwzNzMzNywzNzMzOCwzNzMzOSwzNzM0MSwzNzM0MiwzNzM0MywzNzM0NCwzNzM0NSwzNzM0NiwzNzM0NywzNzM0OCwzNzM0OSwyNDExOSwyNDEzMiwyNDE0OCwyNDE1NSwyNDE1OCwyNDE2MSwyMzY5MiwyMzY3NCwyMzY5MywyMzY5NiwyMzcwMiwyMzY4OCwyMzcwNCwyMzcwNSwyMzY5NywyMzcwNiwyMzcwOCwyMzczMywyMzcxNCwyMzc0MSwyMzcyNCwyMzcyMywyMzcyOSwyMzcxNSwyMzc0NSwyMzczNSwyMzc0OCwyMzc2MiwyMzc4MCwyMzc1NSwyMzc4MSwyMzgxMCwyMzgxMSwyMzg0NywyMzg0NiwyMzg1NCwyMzg0NCwyMzgzOCwyMzgxNCwyMzgzNSwyMzg5NiwyMzg3MCwyMzg2MCwyMzg2OSwyMzkxNiwyMzg5OSwyMzkxOSwyMzkwMSwyMzkxNSwyMzg4MywyMzg4MiwyMzkxMywyMzkyNCwyMzkzOCwyMzk2MSwyMzk2NSwzNTk1NSwyMzk5MSwyNDAwNSwyNDQzNSwyNDQzOSwyNDQ1MCwyNDQ1NSwyNDQ1NywyNDQ2MCwyNDQ2OSwyNDQ3MywyNDQ3NiwyNDQ4OCwyNDQ5MywyNDUwMSwyNDUwOCwzNDkxNCwyNDQxNywyOTM1NywyOTM2MCwyOTM2NCwyOTM2NywyOTM2OCwyOTM3OSwyOTM3NywyOTM5MCwyOTM4OSwyOTM5NCwyOTQxNiwyOTQyMywyOTQxNywyOTQyNiwyOTQyOCwyOTQzMSwyOTQ0MSwyOTQyNywyOTQ0MywyOTQzNCwzNzM1MCwzNzM1MSwzNzM1MiwzNzM1MywzNzM1NCwzNzM1NSwzNzM1NiwzNzM1NywzNzM1OCwzNzM1OSwzNzM2MCwzNzM2MSwzNzM2MiwzNzM2MywzNzM2NCwzNzM2NSwzNzM2NiwzNzM2NywzNzM2OCwzNzM2OSwzNzM3MCwzNzM3MSwzNzM3MiwzNzM3MywzNzM3NCwzNzM3NSwzNzM3NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4MywzNzM4NCwzNzM4NSwzNzM4NiwzNzM4NywzNzM4OCwzNzM4OSwzNzM5MCwzNzM5MSwzNzM5MiwzNzM5MywzNzM5NCwzNzM5NSwzNzM5NiwzNzM5NywzNzM5OCwzNzM5OSwzNzQwMCwzNzQwMSwzNzQwMiwzNzQwMywzNzQwNCwzNzQwNSwzNzQwNiwzNzQwNywzNzQwOCwzNzQwOSwzNzQxMCwzNzQxMSwzNzQxMiwzNzQxMywzNzQxNCwzNzQxNSwzNzQxNiwzNzQxNywzNzQxOCwzNzQxOSwzNzQyMCwzNzQyMSwzNzQyMiwzNzQyMywzNzQyNCwzNzQyNSwzNzQyNiwzNzQyNywzNzQyOCwzNzQyOSwzNzQzMCwzNzQzMSwzNzQzMiwzNzQzMywzNzQzNCwzNzQzNSwzNzQzNiwzNzQzNywzNzQzOCwzNzQzOSwzNzQ0MCwzNzQ0MSwzNzQ0MiwzNzQ0MywzNzQ0NCwzNzQ0NSwyOTQzNSwyOTQ2MywyOTQ1OSwyOTQ3MywyOTQ1MCwyOTQ3MCwyOTQ2OSwyOTQ2MSwyOTQ3NCwyOTQ5NywyOTQ3NywyOTQ4NCwyOTQ5NiwyOTQ4OSwyOTUyMCwyOTUxNywyOTUyNywyOTUzNiwyOTU0OCwyOTU1MSwyOTU2NiwzMzMwNywyMjgyMSwzOTE0MywyMjgyMCwyMjc4NiwzOTI2NywzOTI3MSwzOTI3MiwzOTI3MywzOTI3NCwzOTI3NSwzOTI3NiwzOTI4NCwzOTI4NywzOTI5MywzOTI5NiwzOTMwMCwzOTMwMywzOTMwNiwzOTMwOSwzOTMxMiwzOTMxMywzOTMxNSwzOTMxNiwzOTMxNywyNDE5MiwyNDIwOSwyNDIwMywyNDIxNCwyNDIyOSwyNDIyNCwyNDI0OSwyNDI0NSwyNDI1NCwyNDI0MywzNjE3OSwyNDI3NCwyNDI3MywyNDI4MywyNDI5NiwyNDI5OCwzMzIxMCwyNDUxNiwyNDUyMSwyNDUzNCwyNDUyNywyNDU3OSwyNDU1OCwyNDU4MCwyNDU0NSwyNDU0OCwyNDU3NCwyNDU4MSwyNDU4MiwyNDU1NCwyNDU1NywyNDU2OCwyNDYwMSwyNDYyOSwyNDYxNCwyNDYwMywyNDU5MSwyNDU4OSwyNDYxNywyNDYxOSwyNDU4NiwyNDYzOSwyNDYwOSwyNDY5NiwyNDY5NywyNDY5OSwyNDY5OCwyNDY0MiwzNzQ0NiwzNzQ0NywzNzQ0OCwzNzQ0OSwzNzQ1MCwzNzQ1MSwzNzQ1MiwzNzQ1MywzNzQ1NCwzNzQ1NSwzNzQ1NiwzNzQ1NywzNzQ1OCwzNzQ1OSwzNzQ2MCwzNzQ2MSwzNzQ2MiwzNzQ2MywzNzQ2NCwzNzQ2NSwzNzQ2NiwzNzQ2NywzNzQ2OCwzNzQ2OSwzNzQ3MCwzNzQ3MSwzNzQ3MiwzNzQ3MywzNzQ3NCwzNzQ3NSwzNzQ3NiwzNzQ3NywzNzQ3OCwzNzQ3OSwzNzQ4MCwzNzQ4MSwzNzQ4MiwzNzQ4MywzNzQ4NCwzNzQ4NSwzNzQ4NiwzNzQ4NywzNzQ4OCwzNzQ4OSwzNzQ5MCwzNzQ5MSwzNzQ5MywzNzQ5NCwzNzQ5NSwzNzQ5NiwzNzQ5NywzNzQ5OCwzNzQ5OSwzNzUwMCwzNzUwMSwzNzUwMiwzNzUwMywzNzUwNCwzNzUwNSwzNzUwNiwzNzUwNywzNzUwOCwzNzUwOSwzNzUxMCwzNzUxMSwzNzUxMiwzNzUxMywzNzUxNCwzNzUxNSwzNzUxNiwzNzUxNywzNzUxOSwzNzUyMCwzNzUyMSwzNzUyMiwzNzUyMywzNzUyNCwzNzUyNSwzNzUyNiwzNzUyNywzNzUyOCwzNzUyOSwzNzUzMCwzNzUzMSwzNzUzMiwzNzUzMywzNzUzNCwzNzUzNSwzNzUzNiwzNzUzNywzNzUzOCwzNzUzOSwzNzU0MCwzNzU0MSwzNzU0MiwzNzU0MywyNDY4MiwyNDcwMSwyNDcyNiwyNDczMCwyNDc0OSwyNDczMywyNDcwNywyNDcyMiwyNDcxNiwyNDczMSwyNDgxMiwyNDc2MywyNDc1MywyNDc5NywyNDc5MiwyNDc3NCwyNDc5NCwyNDc1NiwyNDg2NCwyNDg3MCwyNDg1MywyNDg2NywyNDgyMCwyNDgzMiwyNDg0NiwyNDg3NSwyNDkwNiwyNDk0OSwyNTAwNCwyNDk4MCwyNDk5OSwyNTAxNSwyNTA0NCwyNTA3NywyNDU0MSwzODU3OSwzODM3NywzODM3OSwzODM4NSwzODM4NywzODM4OSwzODM5MCwzODM5NiwzODM5OCwzODQwMywzODQwNCwzODQwNiwzODQwOCwzODQxMCwzODQxMSwzODQxMiwzODQxMywzODQxNSwzODQxOCwzODQyMSwzODQyMiwzODQyMywzODQyNSwzODQyNiwyMDAxMiwyOTI0NywyNTEwOSwyNzcwMSwyNzczMiwyNzc0MCwyNzcyMiwyNzgxMSwyNzc4MSwyNzc5MiwyNzc5NiwyNzc4OCwyNzc1MiwyNzc1MywyNzc2NCwyNzc2NiwyNzc4MiwyNzgxNywyNzg1NiwyNzg2MCwyNzgyMSwyNzg5NSwyNzg5NiwyNzg4OSwyNzg2MywyNzgyNiwyNzg3MiwyNzg2MiwyNzg5OCwyNzg4MywyNzg4NiwyNzgyNSwyNzg1OSwyNzg4NywyNzkwMiwzNzU0NCwzNzU0NSwzNzU0NiwzNzU0NywzNzU0OCwzNzU0OSwzNzU1MSwzNzU1MiwzNzU1MywzNzU1NCwzNzU1NSwzNzU1NiwzNzU1NywzNzU1OCwzNzU1OSwzNzU2MCwzNzU2MSwzNzU2MiwzNzU2MywzNzU2NCwzNzU2NSwzNzU2NiwzNzU2NywzNzU2OCwzNzU2OSwzNzU3MCwzNzU3MSwzNzU3MiwzNzU3MywzNzU3NCwzNzU3NSwzNzU3NywzNzU3OCwzNzU3OSwzNzU4MCwzNzU4MSwzNzU4MiwzNzU4MywzNzU4NCwzNzU4NSwzNzU4NiwzNzU4NywzNzU4OCwzNzU4OSwzNzU5MCwzNzU5MSwzNzU5MiwzNzU5MywzNzU5NCwzNzU5NSwzNzU5NiwzNzU5NywzNzU5OCwzNzU5OSwzNzYwMCwzNzYwMSwzNzYwMiwzNzYwMywzNzYwNCwzNzYwNSwzNzYwNiwzNzYwNywzNzYwOCwzNzYwOSwzNzYxMCwzNzYxMSwzNzYxMiwzNzYxMywzNzYxNCwzNzYxNSwzNzYxNiwzNzYxNywzNzYxOCwzNzYxOSwzNzYyMCwzNzYyMSwzNzYyMiwzNzYyMywzNzYyNCwzNzYyNSwzNzYyNiwzNzYyNywzNzYyOCwzNzYyOSwzNzYzMCwzNzYzMSwzNzYzMiwzNzYzMywzNzYzNCwzNzYzNSwzNzYzNiwzNzYzNywzNzYzOCwzNzYzOSwzNzY0MCwzNzY0MSwyNzk2MSwyNzk0MywyNzkxNiwyNzk3MSwyNzk3NiwyNzkxMSwyNzkwOCwyNzkyOSwyNzkxOCwyNzk0NywyNzk4MSwyNzk1MCwyNzk1NywyNzkzMCwyNzk4MywyNzk4NiwyNzk4OCwyNzk1NSwyODA0OSwyODAxNSwyODA2MiwyODA2NCwyNzk5OCwyODA1MSwyODA1MiwyNzk5NiwyODAwMCwyODAyOCwyODAwMywyODE4NiwyODEwMywyODEwMSwyODEyNiwyODE3NCwyODA5NSwyODEyOCwyODE3NywyODEzNCwyODEyNSwyODEyMSwyODE4MiwyODA3NSwyODE3MiwyODA3OCwyODIwMywyODI3MCwyODIzOCwyODI2NywyODMzOCwyODI1NSwyODI5NCwyODI0MywyODI0NCwyODIxMCwyODE5NywyODIyOCwyODM4MywyODMzNywyODMxMiwyODM4NCwyODQ2MSwyODM4NiwyODMyNSwyODMyNywyODM0OSwyODM0NywyODM0MywyODM3NSwyODM0MCwyODM2NywyODMwMywyODM1NCwyODMxOSwyODUxNCwyODQ4NiwyODQ4NywyODQ1MiwyODQzNywyODQwOSwyODQ2MywyODQ3MCwyODQ5MSwyODUzMiwyODQ1OCwyODQyNSwyODQ1NywyODU1MywyODU1NywyODU1NiwyODUzNiwyODUzMCwyODU0MCwyODUzOCwyODYyNSwzNzY0MiwzNzY0MywzNzY0NCwzNzY0NSwzNzY0NiwzNzY0NywzNzY0OCwzNzY0OSwzNzY1MCwzNzY1MSwzNzY1MiwzNzY1MywzNzY1NCwzNzY1NSwzNzY1NiwzNzY1NywzNzY1OCwzNzY1OSwzNzY2MCwzNzY2MSwzNzY2MiwzNzY2MywzNzY2NCwzNzY2NSwzNzY2NiwzNzY2NywzNzY2OCwzNzY2OSwzNzY3MCwzNzY3MSwzNzY3MiwzNzY3MywzNzY3NCwzNzY3NSwzNzY3NiwzNzY3NywzNzY3OCwzNzY3OSwzNzY4MCwzNzY4MSwzNzY4MiwzNzY4MywzNzY4NCwzNzY4NSwzNzY4NiwzNzY4NywzNzY4OCwzNzY4OSwzNzY5MCwzNzY5MSwzNzY5MiwzNzY5MywzNzY5NSwzNzY5NiwzNzY5NywzNzY5OCwzNzY5OSwzNzcwMCwzNzcwMSwzNzcwMiwzNzcwMywzNzcwNCwzNzcwNSwzNzcwNiwzNzcwNywzNzcwOCwzNzcwOSwzNzcxMCwzNzcxMSwzNzcxMiwzNzcxMywzNzcxNCwzNzcxNSwzNzcxNiwzNzcxNywzNzcxOCwzNzcxOSwzNzcyMCwzNzcyMSwzNzcyMiwzNzcyMywzNzcyNCwzNzcyNSwzNzcyNiwzNzcyNywzNzcyOCwzNzcyOSwzNzczMCwzNzczMSwzNzczMiwzNzczMywzNzczNCwzNzczNSwzNzczNiwzNzczNywzNzczOSwyODYxNywyODU4MywyODYwMSwyODU5OCwyODYxMCwyODY0MSwyODY1NCwyODYzOCwyODY0MCwyODY1NSwyODY5OCwyODcwNywyODY5OSwyODcyOSwyODcyNSwyODc1MSwyODc2NiwyMzQyNCwyMzQyOCwyMzQ0NSwyMzQ0MywyMzQ2MSwyMzQ4MCwyOTk5OSwzOTU4MiwyNTY1MiwyMzUyNCwyMzUzNCwzNTEyMCwyMzUzNiwzNjQyMywzNTU5MSwzNjc5MCwzNjgxOSwzNjgyMSwzNjgzNywzNjg0NiwzNjgzNiwzNjg0MSwzNjgzOCwzNjg1MSwzNjg0MCwzNjg2OSwzNjg2OCwzNjg3NSwzNjkwMiwzNjg4MSwzNjg3NywzNjg4NiwzNjg5NywzNjkxNywzNjkxOCwzNjkwOSwzNjkxMSwzNjkzMiwzNjk0NSwzNjk0NiwzNjk0NCwzNjk2OCwzNjk1MiwzNjk2MiwzNjk1NSwyNjI5NywzNjk4MCwzNjk4OSwzNjk5NCwzNzAwMCwzNjk5NSwzNzAwMywyNDQwMCwyNDQwNywyNDQwNiwyNDQwOCwyMzYxMSwyMTY3NSwyMzYzMiwyMzY0MSwyMzQwOSwyMzY1MSwyMzY1NCwzMjcwMCwyNDM2MiwyNDM2MSwyNDM2NSwzMzM5NiwyNDM4MCwzOTczOSwyMzY2MiwyMjkxMywyMjkxNSwyMjkyNSwyMjk1MywyMjk1NCwyMjk0NywzNzc0MCwzNzc0MSwzNzc0MiwzNzc0MywzNzc0NCwzNzc0NSwzNzc0NiwzNzc0NywzNzc0OCwzNzc0OSwzNzc1MCwzNzc1MSwzNzc1MiwzNzc1MywzNzc1NCwzNzc1NSwzNzc1NiwzNzc1NywzNzc1OCwzNzc1OSwzNzc2MCwzNzc2MSwzNzc2MiwzNzc2MywzNzc2NCwzNzc2NSwzNzc2NiwzNzc2NywzNzc2OCwzNzc2OSwzNzc3MCwzNzc3MSwzNzc3MiwzNzc3MywzNzc3NCwzNzc3NiwzNzc3NywzNzc3OCwzNzc3OSwzNzc4MCwzNzc4MSwzNzc4MiwzNzc4MywzNzc4NCwzNzc4NSwzNzc4NiwzNzc4NywzNzc4OCwzNzc4OSwzNzc5MCwzNzc5MSwzNzc5MiwzNzc5MywzNzc5NCwzNzc5NSwzNzc5NiwzNzc5NywzNzc5OCwzNzc5OSwzNzgwMCwzNzgwMSwzNzgwMiwzNzgwMywzNzgwNCwzNzgwNSwzNzgwNiwzNzgwNywzNzgwOCwzNzgwOSwzNzgxMCwzNzgxMSwzNzgxMiwzNzgxMywzNzgxNCwzNzgxNSwzNzgxNiwzNzgxNywzNzgxOCwzNzgxOSwzNzgyMCwzNzgyMSwzNzgyMiwzNzgyMywzNzgyNCwzNzgyNSwzNzgyNiwzNzgyNywzNzgyOCwzNzgyOSwzNzgzMCwzNzgzMSwzNzgzMiwzNzgzMywzNzgzNSwzNzgzNiwzNzgzNywyMjkzNSwyMjk4NiwyMjk1NSwyMjk0MiwyMjk0OCwyMjk5NCwyMjk2MiwyMjk1OSwyMjk5OSwyMjk3NCwyMzA0NSwyMzA0NiwyMzAwNSwyMzA0OCwyMzAxMSwyMzAwMCwyMzAzMywyMzA1MiwyMzA0OSwyMzA5MCwyMzA5MiwyMzA1NywyMzA3NSwyMzA1OSwyMzEwNCwyMzE0MywyMzExNCwyMzEyNSwyMzEwMCwyMzEzOCwyMzE1NywzMzAwNCwyMzIxMCwyMzE5NSwyMzE1OSwyMzE2MiwyMzIzMCwyMzI3NSwyMzIxOCwyMzI1MCwyMzI1MiwyMzIyNCwyMzI2NCwyMzI2NywyMzI4MSwyMzI1NCwyMzI3MCwyMzI1NiwyMzI2MCwyMzMwNSwyMzMxOSwyMzMxOCwyMzM0NiwyMzM1MSwyMzM2MCwyMzU3MywyMzU4MCwyMzM4NiwyMzM5NywyMzQxMSwyMzM3NywyMzM3OSwyMzM5NCwzOTU0MSwzOTU0MywzOTU0NCwzOTU0NiwzOTU1MSwzOTU0OSwzOTU1MiwzOTU1MywzOTU1NywzOTU2MCwzOTU2MiwzOTU2OCwzOTU3MCwzOTU3MSwzOTU3NCwzOTU3NiwzOTU3OSwzOTU4MCwzOTU4MSwzOTU4MywzOTU4NCwzOTU4NiwzOTU4NywzOTU4OSwzOTU5MSwzMjQxNSwzMjQxNywzMjQxOSwzMjQyMSwzMjQyNCwzMjQyNSwzNzgzOCwzNzgzOSwzNzg0MCwzNzg0MSwzNzg0MiwzNzg0MywzNzg0NCwzNzg0NSwzNzg0NywzNzg0OCwzNzg0OSwzNzg1MCwzNzg1MSwzNzg1MiwzNzg1MywzNzg1NCwzNzg1NSwzNzg1NiwzNzg1NywzNzg1OCwzNzg1OSwzNzg2MCwzNzg2MSwzNzg2MiwzNzg2MywzNzg2NCwzNzg2NSwzNzg2NiwzNzg2NywzNzg2OCwzNzg2OSwzNzg3MCwzNzg3MSwzNzg3MiwzNzg3MywzNzg3NCwzNzg3NSwzNzg3NiwzNzg3NywzNzg3OCwzNzg3OSwzNzg4MCwzNzg4MSwzNzg4MiwzNzg4MywzNzg4NCwzNzg4NSwzNzg4NiwzNzg4NywzNzg4OCwzNzg4OSwzNzg5MCwzNzg5MSwzNzg5MiwzNzg5MywzNzg5NCwzNzg5NSwzNzg5NiwzNzg5NywzNzg5OCwzNzg5OSwzNzkwMCwzNzkwMSwzNzkwMiwzNzkwMywzNzkwNCwzNzkwNSwzNzkwNiwzNzkwNywzNzkwOCwzNzkwOSwzNzkxMCwzNzkxMSwzNzkxMiwzNzkxMywzNzkxNCwzNzkxNSwzNzkxNiwzNzkxNywzNzkxOCwzNzkxOSwzNzkyMCwzNzkyMSwzNzkyMiwzNzkyMywzNzkyNCwzNzkyNSwzNzkyNiwzNzkyNywzNzkyOCwzNzkyOSwzNzkzMCwzNzkzMSwzNzkzMiwzNzkzMywzNzkzNCwzMjQyOSwzMjQzMiwzMjQ0NiwzMjQ0OCwzMjQ0OSwzMjQ1MCwzMjQ1NywzMjQ1OSwzMjQ2MCwzMjQ2NCwzMjQ2OCwzMjQ3MSwzMjQ3NSwzMjQ4MCwzMjQ4MSwzMjQ4OCwzMjQ5MSwzMjQ5NCwzMjQ5NSwzMjQ5NywzMjQ5OCwzMjUyNSwzMjUwMiwzMjUwNiwzMjUwNywzMjUxMCwzMjUxMywzMjUxNCwzMjUxNSwzMjUxOSwzMjUyMCwzMjUyMywzMjUyNCwzMjUyNywzMjUyOSwzMjUzMCwzMjUzNSwzMjUzNywzMjU0MCwzMjUzOSwzMjU0MywzMjU0NSwzMjU0NiwzMjU0NywzMjU0OCwzMjU0OSwzMjU1MCwzMjU1MSwzMjU1NCwzMjU1NSwzMjU1NiwzMjU1NywzMjU1OSwzMjU2MCwzMjU2MSwzMjU2MiwzMjU2MywzMjU2NSwyNDE4NiwzMDA3OSwyNDAyNywzMDAxNCwzNzAxMywyOTU4MiwyOTU4NSwyOTYxNCwyOTYwMiwyOTU5OSwyOTY0NywyOTYzNCwyOTY0OSwyOTYyMywyOTYxOSwyOTYzMiwyOTY0MSwyOTY0MCwyOTY2OSwyOTY1NywzOTAzNiwyOTcwNiwyOTY3MywyOTY3MSwyOTY2MiwyOTYyNiwyOTY4MiwyOTcxMSwyOTczOCwyOTc4NywyOTczNCwyOTczMywyOTczNiwyOTc0NCwyOTc0MiwyOTc0MCwzNzkzNSwzNzkzNiwzNzkzNywzNzkzOCwzNzkzOSwzNzk0MCwzNzk0MSwzNzk0MiwzNzk0MywzNzk0NCwzNzk0NSwzNzk0NiwzNzk0NywzNzk0OCwzNzk0OSwzNzk1MSwzNzk1MiwzNzk1MywzNzk1NCwzNzk1NSwzNzk1NiwzNzk1NywzNzk1OCwzNzk1OSwzNzk2MCwzNzk2MSwzNzk2MiwzNzk2MywzNzk2NCwzNzk2NSwzNzk2NiwzNzk2NywzNzk2OCwzNzk2OSwzNzk3MCwzNzk3MSwzNzk3MiwzNzk3MywzNzk3NCwzNzk3NSwzNzk3NiwzNzk3NywzNzk3OCwzNzk3OSwzNzk4MCwzNzk4MSwzNzk4MiwzNzk4MywzNzk4NCwzNzk4NSwzNzk4NiwzNzk4NywzNzk4OCwzNzk4OSwzNzk5MCwzNzk5MSwzNzk5MiwzNzk5MywzNzk5NCwzNzk5NiwzNzk5NywzNzk5OCwzNzk5OSwzODAwMCwzODAwMSwzODAwMiwzODAwMywzODAwNCwzODAwNSwzODAwNiwzODAwNywzODAwOCwzODAwOSwzODAxMCwzODAxMSwzODAxMiwzODAxMywzODAxNCwzODAxNSwzODAxNiwzODAxNywzODAxOCwzODAxOSwzODAyMCwzODAzMywzODAzOCwzODA0MCwzODA4NywzODA5NSwzODA5OSwzODEwMCwzODEwNiwzODExOCwzODEzOSwzODE3MiwzODE3NiwyOTcyMywyOTcyMiwyOTc2MSwyOTc4OCwyOTc4MywyOTc4MSwyOTc4NSwyOTgxNSwyOTgwNSwyOTgyMiwyOTg1MiwyOTgzOCwyOTgyNCwyOTgyNSwyOTgzMSwyOTgzNSwyOTg1NCwyOTg2NCwyOTg2NSwyOTg0MCwyOTg2MywyOTkwNiwyOTg4MiwzODg5MCwzODg5MSwzODg5MiwyNjQ0NCwyNjQ1MSwyNjQ2MiwyNjQ0MCwyNjQ3MywyNjUzMywyNjUwMywyNjQ3NCwyNjQ4MywyNjUyMCwyNjUzNSwyNjQ4NSwyNjUzNiwyNjUyNiwyNjU0MSwyNjUwNywyNjQ4NywyNjQ5MiwyNjYwOCwyNjYzMywyNjU4NCwyNjYzNCwyNjYwMSwyNjU0NCwyNjYzNiwyNjU4NSwyNjU0OSwyNjU4NiwyNjU0NywyNjU4OSwyNjYyNCwyNjU2MywyNjU1MiwyNjU5NCwyNjYzOCwyNjU2MSwyNjYyMSwyNjY3NCwyNjY3NSwyNjcyMCwyNjcyMSwyNjcwMiwyNjcyMiwyNjY5MiwyNjcyNCwyNjc1NSwyNjY1MywyNjcwOSwyNjcyNiwyNjY4OSwyNjcyNywyNjY4OCwyNjY4NiwyNjY5OCwyNjY5NywyNjY2NSwyNjgwNSwyNjc2NywyNjc0MCwyNjc0MywyNjc3MSwyNjczMSwyNjgxOCwyNjk5MCwyNjg3NiwyNjkxMSwyNjkxMiwyNjg3MywzODE4MywzODE5NSwzODIwNSwzODIxMSwzODIxNiwzODIxOSwzODIyOSwzODIzNCwzODI0MCwzODI1NCwzODI2MCwzODI2MSwzODI2MywzODI2NCwzODI2NSwzODI2NiwzODI2NywzODI2OCwzODI2OSwzODI3MCwzODI3MiwzODI3MywzODI3NCwzODI3NSwzODI3NiwzODI3NywzODI3OCwzODI3OSwzODI4MCwzODI4MSwzODI4MiwzODI4MywzODI4NCwzODI4NSwzODI4NiwzODI4NywzODI4OCwzODI4OSwzODI5MCwzODI5MSwzODI5MiwzODI5MywzODI5NCwzODI5NSwzODI5NiwzODI5NywzODI5OCwzODI5OSwzODMwMCwzODMwMSwzODMwMiwzODMwMywzODMwNCwzODMwNSwzODMwNiwzODMwNywzODMwOCwzODMwOSwzODMxMCwzODMxMSwzODMxMiwzODMxMywzODMxNCwzODMxNSwzODMxNiwzODMxNywzODMxOCwzODMxOSwzODMyMCwzODMyMSwzODMyMiwzODMyMywzODMyNCwzODMyNSwzODMyNiwzODMyNywzODMyOCwzODMyOSwzODMzMCwzODMzMSwzODMzMiwzODMzMywzODMzNCwzODMzNSwzODMzNiwzODMzNywzODMzOCwzODMzOSwzODM0MCwzODM0MSwzODM0MiwzODM0MywzODM0NCwzODM0NSwzODM0NiwzODM0NywyNjkxNiwyNjg2NCwyNjg5MSwyNjg4MSwyNjk2NywyNjg1MSwyNjg5NiwyNjk5MywyNjkzNywyNjk3NiwyNjk0NiwyNjk3MywyNzAxMiwyNjk4NywyNzAwOCwyNzAzMiwyNzAwMCwyNjkzMiwyNzA4NCwyNzAxNSwyNzAxNiwyNzA4NiwyNzAxNywyNjk4MiwyNjk3OSwyNzAwMSwyNzAzNSwyNzA0NywyNzA2NywyNzA1MSwyNzA1MywyNzA5MiwyNzA1NywyNzA3MywyNzA4MiwyNzEwMywyNzAyOSwyNzEwNCwyNzAyMSwyNzEzNSwyNzE4MywyNzExNywyNzE1OSwyNzE2MCwyNzIzNywyNzEyMiwyNzIwNCwyNzE5OCwyNzI5NiwyNzIxNiwyNzIyNywyNzE4OSwyNzI3OCwyNzI1NywyNzE5NywyNzE3NiwyNzIyNCwyNzI2MCwyNzI4MSwyNzI4MCwyNzMwNSwyNzI4NywyNzMwNywyOTQ5NSwyOTUyMiwyNzUyMSwyNzUyMiwyNzUyNywyNzUyNCwyNzUzOCwyNzUzOSwyNzUzMywyNzU0NiwyNzU0NywyNzU1MywyNzU2MiwzNjcxNSwzNjcxNywzNjcyMSwzNjcyMiwzNjcyMywzNjcyNSwzNjcyNiwzNjcyOCwzNjcyNywzNjcyOSwzNjczMCwzNjczMiwzNjczNCwzNjczNywzNjczOCwzNjc0MCwzNjc0MywzNjc0NywzODM0OCwzODM0OSwzODM1MCwzODM1MSwzODM1MiwzODM1MywzODM1NCwzODM1NSwzODM1NiwzODM1NywzODM1OCwzODM1OSwzODM2MCwzODM2MSwzODM2MiwzODM2MywzODM2NCwzODM2NSwzODM2NiwzODM2NywzODM2OCwzODM2OSwzODM3MCwzODM3MSwzODM3MiwzODM3MywzODM3NCwzODM3NSwzODM4MCwzODM5OSwzODQwNywzODQxOSwzODQyNCwzODQyNywzODQzMCwzODQzMiwzODQzNSwzODQzNiwzODQzNywzODQzOCwzODQzOSwzODQ0MCwzODQ0MSwzODQ0MywzODQ0NCwzODQ0NSwzODQ0NywzODQ0OCwzODQ1NSwzODQ1NiwzODQ1NywzODQ1OCwzODQ2MiwzODQ2NSwzODQ2NywzODQ3NCwzODQ3OCwzODQ3OSwzODQ4MSwzODQ4MiwzODQ4MywzODQ4NiwzODQ4NywzODQ4OCwzODQ4OSwzODQ5MCwzODQ5MiwzODQ5MywzODQ5NCwzODQ5NiwzODQ5OSwzODUwMSwzODUwMiwzODUwNywzODUwOSwzODUxMCwzODUxMSwzODUxMiwzODUxMywzODUxNSwzODUyMCwzODUyMSwzODUyMiwzODUyMywzODUyNCwzODUyNSwzODUyNiwzODUyNywzODUyOCwzODUyOSwzODUzMCwzODUzMSwzODUzMiwzODUzNSwzODUzNywzODUzOCwzNjc0OSwzNjc1MCwzNjc1MSwzNjc2MCwzNjc2MiwzNjU1OCwyNTA5OSwyNTExMSwyNTExNSwyNTExOSwyNTEyMiwyNTEyMSwyNTEyNSwyNTEyNCwyNTEzMiwzMzI1NSwyOTkzNSwyOTk0MCwyOTk1MSwyOTk2NywyOTk2OSwyOTk3MSwyNTkwOCwyNjA5NCwyNjA5NSwyNjA5NiwyNjEyMiwyNjEzNywyNjQ4MiwyNjExNSwyNjEzMywyNjExMiwyODgwNSwyNjM1OSwyNjE0MSwyNjE2NCwyNjE2MSwyNjE2NiwyNjE2NSwzMjc3NCwyNjIwNywyNjE5NiwyNjE3NywyNjE5MSwyNjE5OCwyNjIwOSwyNjE5OSwyNjIzMSwyNjI0NCwyNjI1MiwyNjI3OSwyNjI2OSwyNjMwMiwyNjMzMSwyNjMzMiwyNjM0MiwyNjM0NSwzNjE0NiwzNjE0NywzNjE1MCwzNjE1NSwzNjE1NywzNjE2MCwzNjE2NSwzNjE2NiwzNjE2OCwzNjE2OSwzNjE2NywzNjE3MywzNjE4MSwzNjE4NSwzNTI3MSwzNTI3NCwzNTI3NSwzNTI3NiwzNTI3OCwzNTI3OSwzNTI4MCwzNTI4MSwyOTI5NCwyOTM0MywyOTI3NywyOTI4NiwyOTI5NSwyOTMxMCwyOTMxMSwyOTMxNiwyOTMyMywyOTMyNSwyOTMyNywyOTMzMCwyNTM1MiwyNTM5NCwyNTUyMCwzODU0MCwzODU0MiwzODU0NSwzODU0NiwzODU0NywzODU0OSwzODU1MCwzODU1NCwzODU1NSwzODU1NywzODU1OCwzODU1OSwzODU2MCwzODU2MSwzODU2MiwzODU2MywzODU2NCwzODU2NSwzODU2NiwzODU2OCwzODU2OSwzODU3MCwzODU3MSwzODU3MiwzODU3MywzODU3NCwzODU3NSwzODU3NywzODU3OCwzODU4MCwzODU4MSwzODU4MywzODU4NCwzODU4NiwzODU4NywzODU5MSwzODU5NCwzODU5NSwzODYwMCwzODYwMiwzODYwMywzODYwOCwzODYwOSwzODYxMSwzODYxMiwzODYxNCwzODYxNSwzODYxNiwzODYxNywzODYxOCwzODYxOSwzODYyMCwzODYyMSwzODYyMiwzODYyMywzODYyNSwzODYyNiwzODYyNywzODYyOCwzODYyOSwzODYzMCwzODYzMSwzODYzNSwzODYzNiwzODYzNywzODYzOCwzODY0MCwzODY0MSwzODY0MiwzODY0NCwzODY0NSwzODY0OCwzODY1MCwzODY1MSwzODY1MiwzODY1MywzODY1NSwzODY1OCwzODY1OSwzODY2MSwzODY2NiwzODY2NywzODY2OCwzODY3MiwzODY3MywzODY3NCwzODY3NiwzODY3NywzODY3OSwzODY4MCwzODY4MSwzODY4MiwzODY4MywzODY4NSwzODY4NywzODY4OCwyNTY2MywyNTgxNiwzMjc3MiwyNzYyNiwyNzYzNSwyNzY0NSwyNzYzNywyNzY0MSwyNzY1MywyNzY1NSwyNzY1NCwyNzY2MSwyNzY2OSwyNzY3MiwyNzY3MywyNzY3NCwyNzY4MSwyNzY4OSwyNzY4NCwyNzY5MCwyNzY5OCwyNTkwOSwyNTk0MSwyNTk2MywyOTI2MSwyOTI2NiwyOTI3MCwyOTIzMiwzNDQwMiwyMTAxNCwzMjkyNywzMjkyNCwzMjkxNSwzMjk1NiwyNjM3OCwzMjk1NywzMjk0NSwzMjkzOSwzMjk0MSwzMjk0OCwzMjk1MSwzMjk5OSwzMzAwMCwzMzAwMSwzMzAwMiwzMjk4NywzMjk2MiwzMjk2NCwzMjk4NSwzMjk3MywzMjk4MywyNjM4NCwzMjk4OSwzMzAwMywzMzAwOSwzMzAxMiwzMzAwNSwzMzAzNywzMzAzOCwzMzAxMCwzMzAyMCwyNjM4OSwzMzA0MiwzNTkzMCwzMzA3OCwzMzA1NCwzMzA2OCwzMzA0OCwzMzA3NCwzMzA5NiwzMzEwMCwzMzEwNywzMzE0MCwzMzExMywzMzExNCwzMzEzNywzMzEyMCwzMzEyOSwzMzE0OCwzMzE0OSwzMzEzMywzMzEyNywyMjYwNSwyMzIyMSwzMzE2MCwzMzE1NCwzMzE2OSwyODM3MywzMzE4NywzMzE5NCwzMzIyOCwyNjQwNiwzMzIyNiwzMzIxMSwzODY4OSwzODY5MCwzODY5MSwzODY5MiwzODY5MywzODY5NCwzODY5NSwzODY5NiwzODY5NywzODY5OSwzODcwMCwzODcwMiwzODcwMywzODcwNSwzODcwNywzODcwOCwzODcwOSwzODcxMCwzODcxMSwzODcxNCwzODcxNSwzODcxNiwzODcxNywzODcxOSwzODcyMCwzODcyMSwzODcyMiwzODcyMywzODcyNCwzODcyNSwzODcyNiwzODcyNywzODcyOCwzODcyOSwzODczMCwzODczMSwzODczMiwzODczMywzODczNCwzODczNSwzODczNiwzODczNywzODc0MCwzODc0MSwzODc0MywzODc0NCwzODc0NiwzODc0OCwzODc0OSwzODc1MSwzODc1NSwzODc1NiwzODc1OCwzODc1OSwzODc2MCwzODc2MiwzODc2MywzODc2NCwzODc2NSwzODc2NiwzODc2NywzODc2OCwzODc2OSwzODc3MCwzODc3MywzODc3NSwzODc3NiwzODc3NywzODc3OCwzODc3OSwzODc4MSwzODc4MiwzODc4MywzODc4NCwzODc4NSwzODc4NiwzODc4NywzODc4OCwzODc5MCwzODc5MSwzODc5MiwzODc5MywzODc5NCwzODc5NiwzODc5OCwzODc5OSwzODgwMCwzODgwMywzODgwNSwzODgwNiwzODgwNywzODgwOSwzODgxMCwzODgxMSwzODgxMiwzODgxMywzMzIxNywzMzE5MCwyNzQyOCwyNzQ0NywyNzQ0OSwyNzQ1OSwyNzQ2MiwyNzQ4MSwzOTEyMSwzOTEyMiwzOTEyMywzOTEyNSwzOTEyOSwzOTEzMCwyNzU3MSwyNDM4NCwyNzU4NiwzNTMxNSwyNjAwMCw0MDc4NSwyNjAwMywyNjA0NCwyNjA1NCwyNjA1MiwyNjA1MSwyNjA2MCwyNjA2MiwyNjA2NiwyNjA3MCwyODgwMCwyODgyOCwyODgyMiwyODgyOSwyODg1OSwyODg2NCwyODg1NSwyODg0MywyODg0OSwyODkwNCwyODg3NCwyODk0NCwyODk0NywyODk1MCwyODk3NSwyODk3NywyOTA0MywyOTAyMCwyOTAzMiwyODk5NywyOTA0MiwyOTAwMiwyOTA0OCwyOTA1MCwyOTA4MCwyOTEwNywyOTEwOSwyOTA5NiwyOTA4OCwyOTE1MiwyOTE0MCwyOTE1OSwyOTE3NywyOTIxMywyOTIyNCwyODc4MCwyODk1MiwyOTAzMCwyOTExMywyNTE1MCwyNTE0OSwyNTE1NSwyNTE2MCwyNTE2MSwzMTAzNSwzMTA0MCwzMTA0NiwzMTA0OSwzMTA2NywzMTA2OCwzMTA1OSwzMTA2NiwzMTA3NCwzMTA2MywzMTA3MiwzMTA4NywzMTA3OSwzMTA5OCwzMTEwOSwzMTExNCwzMTEzMCwzMTE0MywzMTE1NSwyNDUyOSwyNDUyOCwzODgxNCwzODgxNSwzODgxNywzODgxOCwzODgyMCwzODgyMSwzODgyMiwzODgyMywzODgyNCwzODgyNSwzODgyNiwzODgyOCwzODgzMCwzODgzMiwzODgzMywzODgzNSwzODgzNywzODgzOCwzODgzOSwzODg0MCwzODg0MSwzODg0MiwzODg0MywzODg0NCwzODg0NSwzODg0NiwzODg0NywzODg0OCwzODg0OSwzODg1MCwzODg1MSwzODg1MiwzODg1MywzODg1NCwzODg1NSwzODg1NiwzODg1NywzODg1OCwzODg1OSwzODg2MCwzODg2MSwzODg2MiwzODg2MywzODg2NCwzODg2NSwzODg2NiwzODg2NywzODg2OCwzODg2OSwzODg3MCwzODg3MSwzODg3MiwzODg3MywzODg3NCwzODg3NSwzODg3NiwzODg3NywzODg3OCwzODg3OSwzODg4MCwzODg4MSwzODg4MiwzODg4MywzODg4NCwzODg4NSwzODg4OCwzODg5NCwzODg5NSwzODg5NiwzODg5NywzODg5OCwzODkwMCwzODkwMywzODkwNCwzODkwNSwzODkwNiwzODkwNywzODkwOCwzODkwOSwzODkxMCwzODkxMSwzODkxMiwzODkxMywzODkxNCwzODkxNSwzODkxNiwzODkxNywzODkxOCwzODkxOSwzODkyMCwzODkyMSwzODkyMiwzODkyMywzODkyNCwzODkyNSwzODkyNiwyNDYzNiwyNDY2OSwyNDY2NiwyNDY3OSwyNDY0MSwyNDY2NSwyNDY3NSwyNDc0NywyNDgzOCwyNDg0NSwyNDkyNSwyNTAwMSwyNDk4OSwyNTAzNSwyNTA0MSwyNTA5NCwzMjg5NiwzMjg5NSwyNzc5NSwyNzg5NCwyODE1NiwzMDcxMCwzMDcxMiwzMDcyMCwzMDcyOSwzMDc0MywzMDc0NCwzMDczNywyNjAyNywzMDc2NSwzMDc0OCwzMDc0OSwzMDc3NywzMDc3OCwzMDc3OSwzMDc1MSwzMDc4MCwzMDc1NywzMDc2NCwzMDc1NSwzMDc2MSwzMDc5OCwzMDgyOSwzMDgwNiwzMDgwNywzMDc1OCwzMDgwMCwzMDc5MSwzMDc5NiwzMDgyNiwzMDg3NSwzMDg2NywzMDg3NCwzMDg1NSwzMDg3NiwzMDg4MSwzMDg4MywzMDg5OCwzMDkwNSwzMDg4NSwzMDkzMiwzMDkzNywzMDkyMSwzMDk1NiwzMDk2MiwzMDk4MSwzMDk2NCwzMDk5NSwzMTAxMiwzMTAwNiwzMTAyOCw0MDg1OSw0MDY5Nyw0MDY5OSw0MDcwMCwzMDQ0OSwzMDQ2OCwzMDQ3NywzMDQ1NywzMDQ3MSwzMDQ3MiwzMDQ5MCwzMDQ5OCwzMDQ4OSwzMDUwOSwzMDUwMiwzMDUxNywzMDUyMCwzMDU0NCwzMDU0NSwzMDUzNSwzMDUzMSwzMDU1NCwzMDU2OCwzODkyNywzODkyOCwzODkyOSwzODkzMCwzODkzMSwzODkzMiwzODkzMywzODkzNCwzODkzNSwzODkzNiwzODkzNywzODkzOCwzODkzOSwzODk0MCwzODk0MSwzODk0MiwzODk0MywzODk0NCwzODk0NSwzODk0NiwzODk0NywzODk0OCwzODk0OSwzODk1MCwzODk1MSwzODk1MiwzODk1MywzODk1NCwzODk1NSwzODk1NiwzODk1NywzODk1OCwzODk1OSwzODk2MCwzODk2MSwzODk2MiwzODk2MywzODk2NCwzODk2NSwzODk2NiwzODk2NywzODk2OCwzODk2OSwzODk3MCwzODk3MSwzODk3MiwzODk3MywzODk3NCwzODk3NSwzODk3NiwzODk3NywzODk3OCwzODk3OSwzODk4MCwzODk4MSwzODk4MiwzODk4MywzODk4NCwzODk4NSwzODk4NiwzODk4NywzODk4OCwzODk4OSwzODk5MCwzODk5MSwzODk5MiwzODk5MywzODk5NCwzODk5NSwzODk5NiwzODk5NywzODk5OCwzODk5OSwzOTAwMCwzOTAwMSwzOTAwMiwzOTAwMywzOTAwNCwzOTAwNSwzOTAwNiwzOTAwNywzOTAwOCwzOTAwOSwzOTAxMCwzOTAxMSwzOTAxMiwzOTAxMywzOTAxNCwzOTAxNSwzOTAxNiwzOTAxNywzOTAxOCwzOTAxOSwzOTAyMCwzOTAyMSwzOTAyMiwzMDU2MiwzMDU2NSwzMDU5MSwzMDYwNSwzMDU4OSwzMDU5MiwzMDYwNCwzMDYwOSwzMDYyMywzMDYyNCwzMDY0MCwzMDY0NSwzMDY1MywzMDAxMCwzMDAxNiwzMDAzMCwzMDAyNywzMDAyNCwzMDA0MywzMDA2NiwzMDA3MywzMDA4MywzMjYwMCwzMjYwOSwzMjYwNywzNTQwMCwzMjYxNiwzMjYyOCwzMjYyNSwzMjYzMywzMjY0MSwzMjYzOCwzMDQxMywzMDQzNywzNDg2NiwzODAyMSwzODAyMiwzODAyMywzODAyNywzODAyNiwzODAyOCwzODAyOSwzODAzMSwzODAzMiwzODAzNiwzODAzOSwzODAzNywzODA0MiwzODA0MywzODA0NCwzODA1MSwzODA1MiwzODA1OSwzODA1OCwzODA2MSwzODA2MCwzODA2MywzODA2NCwzODA2NiwzODA2OCwzODA3MCwzODA3MSwzODA3MiwzODA3MywzODA3NCwzODA3NiwzODA3NywzODA3OSwzODA4NCwzODA4OCwzODA4OSwzODA5MCwzODA5MSwzODA5MiwzODA5MywzODA5NCwzODA5NiwzODA5NywzODA5OCwzODEwMSwzODEwMiwzODEwMywzODEwNSwzODEwNCwzODEwNywzODExMCwzODExMSwzODExMiwzODExNCwzODExNiwzODExNywzODExOSwzODEyMCwzODEyMiwzOTAyMywzOTAyNCwzOTAyNSwzOTAyNiwzOTAyNywzOTAyOCwzOTA1MSwzOTA1NCwzOTA1OCwzOTA2MSwzOTA2NSwzOTA3NSwzOTA4MCwzOTA4MSwzOTA4MiwzOTA4MywzOTA4NCwzOTA4NSwzOTA4NiwzOTA4NywzOTA4OCwzOTA4OSwzOTA5MCwzOTA5MSwzOTA5MiwzOTA5MywzOTA5NCwzOTA5NSwzOTA5NiwzOTA5NywzOTA5OCwzOTA5OSwzOTEwMCwzOTEwMSwzOTEwMiwzOTEwMywzOTEwNCwzOTEwNSwzOTEwNiwzOTEwNywzOTEwOCwzOTEwOSwzOTExMCwzOTExMSwzOTExMiwzOTExMywzOTExNCwzOTExNSwzOTExNiwzOTExNywzOTExOSwzOTEyMCwzOTEyNCwzOTEyNiwzOTEyNywzOTEzMSwzOTEzMiwzOTEzMywzOTEzNiwzOTEzNywzOTEzOCwzOTEzOSwzOTE0MCwzOTE0MSwzOTE0MiwzOTE0NSwzOTE0NiwzOTE0NywzOTE0OCwzOTE0OSwzOTE1MCwzOTE1MSwzOTE1MiwzOTE1MywzOTE1NCwzOTE1NSwzOTE1NiwzOTE1NywzOTE1OCwzOTE1OSwzOTE2MCwzOTE2MSwzOTE2MiwzOTE2MywzOTE2NCwzOTE2NSwzOTE2NiwzOTE2NywzOTE2OCwzOTE2OSwzOTE3MCwzOTE3MSwzOTE3MiwzOTE3MywzOTE3NCwzOTE3NSwzODEyMSwzODEyMywzODEyNiwzODEyNywzODEzMSwzODEzMiwzODEzMywzODEzNSwzODEzNywzODE0MCwzODE0MSwzODE0MywzODE0NywzODE0NiwzODE1MCwzODE1MSwzODE1MywzODE1NCwzODE1NywzODE1OCwzODE1OSwzODE2MiwzODE2MywzODE2NCwzODE2NSwzODE2NiwzODE2OCwzODE3MSwzODE3MywzODE3NCwzODE3NSwzODE3OCwzODE4NiwzODE4NywzODE4NSwzODE4OCwzODE5MywzODE5NCwzODE5NiwzODE5OCwzODE5OSwzODIwMCwzODIwNCwzODIwNiwzODIwNywzODIxMCwzODE5NywzODIxMiwzODIxMywzODIxNCwzODIxNywzODIyMCwzODIyMiwzODIyMywzODIyNiwzODIyNywzODIyOCwzODIzMCwzODIzMSwzODIzMiwzODIzMywzODIzNSwzODIzOCwzODIzOSwzODIzNywzODI0MSwzODI0MiwzODI0NCwzODI0NSwzODI0NiwzODI0NywzODI0OCwzODI0OSwzODI1MCwzODI1MSwzODI1MiwzODI1NSwzODI1NywzODI1OCwzODI1OSwzODIwMiwzMDY5NSwzMDcwMCwzODYwMSwzMTE4OSwzMTIxMywzMTIwMywzMTIxMSwzMTIzOCwyMzg3OSwzMTIzNSwzMTIzNCwzMTI2MiwzMTI1MiwzOTE3NiwzOTE3NywzOTE3OCwzOTE3OSwzOTE4MCwzOTE4MiwzOTE4MywzOTE4NSwzOTE4NiwzOTE4NywzOTE4OCwzOTE4OSwzOTE5MCwzOTE5MSwzOTE5MiwzOTE5MywzOTE5NCwzOTE5NSwzOTE5NiwzOTE5NywzOTE5OCwzOTE5OSwzOTIwMCwzOTIwMSwzOTIwMiwzOTIwMywzOTIwNCwzOTIwNSwzOTIwNiwzOTIwNywzOTIwOCwzOTIwOSwzOTIxMCwzOTIxMSwzOTIxMiwzOTIxMywzOTIxNSwzOTIxNiwzOTIxNywzOTIxOCwzOTIxOSwzOTIyMCwzOTIyMSwzOTIyMiwzOTIyMywzOTIyNCwzOTIyNSwzOTIyNiwzOTIyNywzOTIyOCwzOTIyOSwzOTIzMCwzOTIzMSwzOTIzMiwzOTIzMywzOTIzNCwzOTIzNSwzOTIzNiwzOTIzNywzOTIzOCwzOTIzOSwzOTI0MCwzOTI0MSwzOTI0MiwzOTI0MywzOTI0NCwzOTI0NSwzOTI0NiwzOTI0NywzOTI0OCwzOTI0OSwzOTI1MCwzOTI1MSwzOTI1NCwzOTI1NSwzOTI1NiwzOTI1NywzOTI1OCwzOTI1OSwzOTI2MCwzOTI2MSwzOTI2MiwzOTI2MywzOTI2NCwzOTI2NSwzOTI2NiwzOTI2OCwzOTI3MCwzOTI4MywzOTI4OCwzOTI4OSwzOTI5MSwzOTI5NCwzOTI5OCwzOTI5OSwzOTMwNSwzMTI4OSwzMTI4NywzMTMxMyw0MDY1NSwzOTMzMywzMTM0NCwzMDM0NCwzMDM1MCwzMDM1NSwzMDM2MSwzMDM3MiwyOTkxOCwyOTkyMCwyOTk5Niw0MDQ4MCw0MDQ4Miw0MDQ4OCw0MDQ4OSw0MDQ5MCw0MDQ5MSw0MDQ5Miw0MDQ5OCw0MDQ5Nyw0MDUwMiw0MDUwNCw0MDUwMyw0MDUwNSw0MDUwNiw0MDUxMCw0MDUxMyw0MDUxNCw0MDUxNiw0MDUxOCw0MDUxOSw0MDUyMCw0MDUyMSw0MDUyMyw0MDUyNCw0MDUyNiw0MDUyOSw0MDUzMyw0MDUzNSw0MDUzOCw0MDUzOSw0MDU0MCw0MDU0Miw0MDU0Nyw0MDU1MCw0MDU1MSw0MDU1Miw0MDU1Myw0MDU1NCw0MDU1NSw0MDU1Niw0MDU2MSw0MDU1Nyw0MDU2MywzMDA5OCwzMDEwMCwzMDEwMiwzMDExMiwzMDEwOSwzMDEyNCwzMDExNSwzMDEzMSwzMDEzMiwzMDEzNiwzMDE0OCwzMDEyOSwzMDEyOCwzMDE0NywzMDE0NiwzMDE2NiwzMDE1NywzMDE3OSwzMDE4NCwzMDE4MiwzMDE4MCwzMDE4NywzMDE4MywzMDIxMSwzMDE5MywzMDIwNCwzMDIwNywzMDIyNCwzMDIwOCwzMDIxMywzMDIyMCwzMDIzMSwzMDIxOCwzMDI0NSwzMDIzMiwzMDIyOSwzMDIzMywzOTMwOCwzOTMxMCwzOTMyMiwzOTMyMywzOTMyNCwzOTMyNSwzOTMyNiwzOTMyNywzOTMyOCwzOTMyOSwzOTMzMCwzOTMzMSwzOTMzMiwzOTMzNCwzOTMzNSwzOTMzNywzOTMzOCwzOTMzOSwzOTM0MCwzOTM0MSwzOTM0MiwzOTM0MywzOTM0NCwzOTM0NSwzOTM0NiwzOTM0NywzOTM0OCwzOTM0OSwzOTM1MCwzOTM1MSwzOTM1MiwzOTM1MywzOTM1NCwzOTM1NSwzOTM1NiwzOTM1NywzOTM1OCwzOTM1OSwzOTM2MCwzOTM2MSwzOTM2MiwzOTM2MywzOTM2NCwzOTM2NSwzOTM2NiwzOTM2NywzOTM2OCwzOTM2OSwzOTM3MCwzOTM3MSwzOTM3MiwzOTM3MywzOTM3NCwzOTM3NSwzOTM3NiwzOTM3NywzOTM3OCwzOTM3OSwzOTM4MCwzOTM4MSwzOTM4MiwzOTM4MywzOTM4NCwzOTM4NSwzOTM4NiwzOTM4NywzOTM4OCwzOTM4OSwzOTM5MCwzOTM5MSwzOTM5MiwzOTM5MywzOTM5NCwzOTM5NSwzOTM5NiwzOTM5NywzOTM5OCwzOTM5OSwzOTQwMCwzOTQwMSwzOTQwMiwzOTQwMywzOTQwNCwzOTQwNSwzOTQwNiwzOTQwNywzOTQwOCwzOTQwOSwzOTQxMCwzOTQxMSwzOTQxMiwzOTQxMywzOTQxNCwzOTQxNSwzOTQxNiwzOTQxNywzMDIzNSwzMDI2OCwzMDI0MiwzMDI0MCwzMDI3MiwzMDI1MywzMDI1NiwzMDI3MSwzMDI2MSwzMDI3NSwzMDI3MCwzMDI1OSwzMDI4NSwzMDMwMiwzMDI5MiwzMDMwMCwzMDI5NCwzMDMxNSwzMDMxOSwzMjcxNCwzMTQ2MiwzMTM1MiwzMTM1MywzMTM2MCwzMTM2NiwzMTM2OCwzMTM4MSwzMTM5OCwzMTM5MiwzMTQwNCwzMTQwMCwzMTQwNSwzMTQxMSwzNDkxNiwzNDkyMSwzNDkzMCwzNDk0MSwzNDk0MywzNDk0NiwzNDk3OCwzNTAxNCwzNDk5OSwzNTAwNCwzNTAxNywzNTA0MiwzNTAyMiwzNTA0MywzNTA0NSwzNTA1NywzNTA5OCwzNTA2OCwzNTA0OCwzNTA3MCwzNTA1NiwzNTEwNSwzNTA5NywzNTA5MSwzNTA5OSwzNTA4MiwzNTEyNCwzNTExNSwzNTEyNiwzNTEzNywzNTE3NCwzNTE5NSwzMDA5MSwzMjk5NywzMDM4NiwzMDM4OCwzMDY4NCwzMjc4NiwzMjc4OCwzMjc5MCwzMjc5NiwzMjgwMCwzMjgwMiwzMjgwNSwzMjgwNiwzMjgwNywzMjgwOSwzMjgwOCwzMjgxNywzMjc3OSwzMjgyMSwzMjgzNSwzMjgzOCwzMjg0NSwzMjg1MCwzMjg3MywzMjg4MSwzNTIwMywzOTAzMiwzOTA0MCwzOTA0MywzOTQxOCwzOTQxOSwzOTQyMCwzOTQyMSwzOTQyMiwzOTQyMywzOTQyNCwzOTQyNSwzOTQyNiwzOTQyNywzOTQyOCwzOTQyOSwzOTQzMCwzOTQzMSwzOTQzMiwzOTQzMywzOTQzNCwzOTQzNSwzOTQzNiwzOTQzNywzOTQzOCwzOTQzOSwzOTQ0MCwzOTQ0MSwzOTQ0MiwzOTQ0MywzOTQ0NCwzOTQ0NSwzOTQ0NiwzOTQ0NywzOTQ0OCwzOTQ0OSwzOTQ1MCwzOTQ1MSwzOTQ1MiwzOTQ1MywzOTQ1NCwzOTQ1NSwzOTQ1NiwzOTQ1NywzOTQ1OCwzOTQ1OSwzOTQ2MCwzOTQ2MSwzOTQ2MiwzOTQ2MywzOTQ2NCwzOTQ2NSwzOTQ2NiwzOTQ2NywzOTQ2OCwzOTQ2OSwzOTQ3MCwzOTQ3MSwzOTQ3MiwzOTQ3MywzOTQ3NCwzOTQ3NSwzOTQ3NiwzOTQ3NywzOTQ3OCwzOTQ3OSwzOTQ4MCwzOTQ4MSwzOTQ4MiwzOTQ4MywzOTQ4NCwzOTQ4NSwzOTQ4NiwzOTQ4NywzOTQ4OCwzOTQ4OSwzOTQ5MCwzOTQ5MSwzOTQ5MiwzOTQ5MywzOTQ5NCwzOTQ5NSwzOTQ5NiwzOTQ5NywzOTQ5OCwzOTQ5OSwzOTUwMCwzOTUwMSwzOTUwMiwzOTUwMywzOTUwNCwzOTUwNSwzOTUwNiwzOTUwNywzOTUwOCwzOTUwOSwzOTUxMCwzOTUxMSwzOTUxMiwzOTUxMywzOTA0OSwzOTA1MiwzOTA1MywzOTA1NSwzOTA2MCwzOTA2NiwzOTA2NywzOTA3MCwzOTA3MSwzOTA3MywzOTA3NCwzOTA3NywzOTA3OCwzNDM4MSwzNDM4OCwzNDQxMiwzNDQxNCwzNDQzMSwzNDQyNiwzNDQyOCwzNDQyNywzNDQ3MiwzNDQ0NSwzNDQ0MywzNDQ3NiwzNDQ2MSwzNDQ3MSwzNDQ2NywzNDQ3NCwzNDQ1MSwzNDQ3MywzNDQ4NiwzNDUwMCwzNDQ4NSwzNDUxMCwzNDQ4MCwzNDQ5MCwzNDQ4MSwzNDQ3OSwzNDUwNSwzNDUxMSwzNDQ4NCwzNDUzNywzNDU0NSwzNDU0NiwzNDU0MSwzNDU0NywzNDUxMiwzNDU3OSwzNDUyNiwzNDU0OCwzNDUyNywzNDUyMCwzNDUxMywzNDU2MywzNDU2NywzNDU1MiwzNDU2OCwzNDU3MCwzNDU3MywzNDU2OSwzNDU5NSwzNDYxOSwzNDU5MCwzNDU5NywzNDYwNiwzNDU4NiwzNDYyMiwzNDYzMiwzNDYxMiwzNDYwOSwzNDYwMSwzNDYxNSwzNDYyMywzNDY5MCwzNDU5NCwzNDY4NSwzNDY4NiwzNDY4MywzNDY1NiwzNDY3MiwzNDYzNiwzNDY3MCwzNDY5OSwzNDY0MywzNDY1OSwzNDY4NCwzNDY2MCwzNDY0OSwzNDY2MSwzNDcwNywzNDczNSwzNDcyOCwzNDc3MCwzOTUxNCwzOTUxNSwzOTUxNiwzOTUxNywzOTUxOCwzOTUxOSwzOTUyMCwzOTUyMSwzOTUyMiwzOTUyMywzOTUyNCwzOTUyNSwzOTUyNiwzOTUyNywzOTUyOCwzOTUyOSwzOTUzMCwzOTUzMSwzOTUzOCwzOTU1NSwzOTU2MSwzOTU2NSwzOTU2NiwzOTU3MiwzOTU3MywzOTU3NywzOTU5MCwzOTU5MywzOTU5NCwzOTU5NSwzOTU5NiwzOTU5NywzOTU5OCwzOTU5OSwzOTYwMiwzOTYwMywzOTYwNCwzOTYwNSwzOTYwOSwzOTYxMSwzOTYxMywzOTYxNCwzOTYxNSwzOTYxOSwzOTYyMCwzOTYyMiwzOTYyMywzOTYyNCwzOTYyNSwzOTYyNiwzOTYyOSwzOTYzMCwzOTYzMSwzOTYzMiwzOTYzNCwzOTYzNiwzOTYzNywzOTYzOCwzOTYzOSwzOTY0MSwzOTY0MiwzOTY0MywzOTY0NCwzOTY0NSwzOTY0NiwzOTY0OCwzOTY1MCwzOTY1MSwzOTY1MiwzOTY1MywzOTY1NSwzOTY1NiwzOTY1NywzOTY1OCwzOTY2MCwzOTY2MiwzOTY2NCwzOTY2NSwzOTY2NiwzOTY2NywzOTY2OCwzOTY2OSwzOTY3MCwzOTY3MSwzOTY3MiwzOTY3NCwzOTY3NiwzOTY3NywzOTY3OCwzOTY3OSwzOTY4MCwzOTY4MSwzOTY4MiwzOTY4NCwzOTY4NSwzOTY4NiwzNDc1OCwzNDY5NiwzNDY5MywzNDczMywzNDcxMSwzNDY5MSwzNDczMSwzNDc4OSwzNDczMiwzNDc0MSwzNDczOSwzNDc2MywzNDc3MSwzNDc0OSwzNDc2OSwzNDc1MiwzNDc2MiwzNDc3OSwzNDc5NCwzNDc4NCwzNDc5OCwzNDgzOCwzNDgzNSwzNDgxNCwzNDgyNiwzNDg0MywzNDg0OSwzNDg3MywzNDg3NiwzMjU2NiwzMjU3OCwzMjU4MCwzMjU4MSwzMzI5NiwzMTQ4MiwzMTQ4NSwzMTQ5NiwzMTQ5MSwzMTQ5MiwzMTUwOSwzMTQ5OCwzMTUzMSwzMTUwMywzMTU1OSwzMTU0NCwzMTUzMCwzMTUxMywzMTUzNCwzMTUzNywzMTUyMCwzMTUyNSwzMTUyNCwzMTUzOSwzMTU1MCwzMTUxOCwzMTU3NiwzMTU3OCwzMTU1NywzMTYwNSwzMTU2NCwzMTU4MSwzMTU4NCwzMTU5OCwzMTYxMSwzMTU4NiwzMTYwMiwzMTYwMSwzMTYzMiwzMTY1NCwzMTY1NSwzMTY3MiwzMTY2MCwzMTY0NSwzMTY1NiwzMTYyMSwzMTY1OCwzMTY0NCwzMTY1MCwzMTY1OSwzMTY2OCwzMTY5NywzMTY4MSwzMTY5MiwzMTcwOSwzMTcwNiwzMTcxNywzMTcxOCwzMTcyMiwzMTc1NiwzMTc0MiwzMTc0MCwzMTc1OSwzMTc2NiwzMTc1NSwzOTY4NywzOTY4OSwzOTY5MCwzOTY5MSwzOTY5MiwzOTY5MywzOTY5NCwzOTY5NiwzOTY5NywzOTY5OCwzOTcwMCwzOTcwMSwzOTcwMiwzOTcwMywzOTcwNCwzOTcwNSwzOTcwNiwzOTcwNywzOTcwOCwzOTcwOSwzOTcxMCwzOTcxMiwzOTcxMywzOTcxNCwzOTcxNiwzOTcxNywzOTcxOCwzOTcxOSwzOTcyMCwzOTcyMSwzOTcyMiwzOTcyMywzOTcyNCwzOTcyNSwzOTcyNiwzOTcyOCwzOTcyOSwzOTczMSwzOTczMiwzOTczMywzOTczNCwzOTczNSwzOTczNiwzOTczNywzOTczOCwzOTc0MSwzOTc0MiwzOTc0MywzOTc0NCwzOTc1MCwzOTc1NCwzOTc1NSwzOTc1NiwzOTc1OCwzOTc2MCwzOTc2MiwzOTc2MywzOTc2NSwzOTc2NiwzOTc2NywzOTc2OCwzOTc2OSwzOTc3MCwzOTc3MSwzOTc3MiwzOTc3MywzOTc3NCwzOTc3NSwzOTc3NiwzOTc3NywzOTc3OCwzOTc3OSwzOTc4MCwzOTc4MSwzOTc4MiwzOTc4MywzOTc4NCwzOTc4NSwzOTc4NiwzOTc4NywzOTc4OCwzOTc4OSwzOTc5MCwzOTc5MSwzOTc5MiwzOTc5MywzOTc5NCwzOTc5NSwzOTc5NiwzOTc5NywzOTc5OCwzOTc5OSwzOTgwMCwzOTgwMSwzOTgwMiwzOTgwMywzMTc3NSwzMTc4NiwzMTc4MiwzMTgwMCwzMTgwOSwzMTgwOCwzMzI3OCwzMzI4MSwzMzI4MiwzMzI4NCwzMzI2MCwzNDg4NCwzMzMxMywzMzMxNCwzMzMxNSwzMzMyNSwzMzMyNywzMzMyMCwzMzMyMywzMzMzNiwzMzMzOSwzMzMzMSwzMzMzMiwzMzM0MiwzMzM0OCwzMzM1MywzMzM1NSwzMzM1OSwzMzM3MCwzMzM3NSwzMzM4NCwzNDk0MiwzNDk0OSwzNDk1MiwzNTAzMiwzNTAzOSwzNTE2NiwzMjY2OSwzMjY3MSwzMjY3OSwzMjY4NywzMjY4OCwzMjY5MCwzMTg2OCwyNTkyOSwzMTg4OSwzMTkwMSwzMTkwMCwzMTkwMiwzMTkwNiwzMTkyMiwzMTkzMiwzMTkzMywzMTkzNywzMTk0MywzMTk0OCwzMTk0OSwzMTk0NCwzMTk0MSwzMTk1OSwzMTk3NiwzMzM5MCwyNjI4MCwzMjcwMywzMjcxOCwzMjcyNSwzMjc0MSwzMjczNywzMjc0MiwzMjc0NSwzMjc1MCwzMjc1NSwzMTk5MiwzMjExOSwzMjE2NiwzMjE3NCwzMjMyNywzMjQxMSw0MDYzMiw0MDYyOCwzNjIxMSwzNjIyOCwzNjI0NCwzNjI0MSwzNjI3MywzNjE5OSwzNjIwNSwzNTkxMSwzNTkxMywzNzE5NCwzNzIwMCwzNzE5OCwzNzE5OSwzNzIyMCwzOTgwNCwzOTgwNSwzOTgwNiwzOTgwNywzOTgwOCwzOTgwOSwzOTgxMCwzOTgxMSwzOTgxMiwzOTgxMywzOTgxNCwzOTgxNSwzOTgxNiwzOTgxNywzOTgxOCwzOTgxOSwzOTgyMCwzOTgyMSwzOTgyMiwzOTgyMywzOTgyNCwzOTgyNSwzOTgyNiwzOTgyNywzOTgyOCwzOTgyOSwzOTgzMCwzOTgzMSwzOTgzMiwzOTgzMywzOTgzNCwzOTgzNSwzOTgzNiwzOTgzNywzOTgzOCwzOTgzOSwzOTg0MCwzOTg0MSwzOTg0MiwzOTg0MywzOTg0NCwzOTg0NSwzOTg0NiwzOTg0NywzOTg0OCwzOTg0OSwzOTg1MCwzOTg1MSwzOTg1MiwzOTg1MywzOTg1NCwzOTg1NSwzOTg1NiwzOTg1NywzOTg1OCwzOTg1OSwzOTg2MCwzOTg2MSwzOTg2MiwzOTg2MywzOTg2NCwzOTg2NSwzOTg2NiwzOTg2NywzOTg2OCwzOTg2OSwzOTg3MCwzOTg3MSwzOTg3MiwzOTg3MywzOTg3NCwzOTg3NSwzOTg3NiwzOTg3NywzOTg3OCwzOTg3OSwzOTg4MCwzOTg4MSwzOTg4MiwzOTg4MywzOTg4NCwzOTg4NSwzOTg4NiwzOTg4NywzOTg4OCwzOTg4OSwzOTg5MCwzOTg5MSwzOTg5MiwzOTg5MywzOTg5NCwzOTg5NSwzOTg5NiwzOTg5NywzOTg5OCwzOTg5OSwzNzIxOCwzNzIxNywzNzIzMiwzNzIyNSwzNzIzMSwzNzI0NSwzNzI0NiwzNzIzNCwzNzIzNiwzNzI0MSwzNzI2MCwzNzI1MywzNzI2NCwzNzI2MSwzNzI2NSwzNzI4MiwzNzI4MywzNzI5MCwzNzI5MywzNzI5NCwzNzI5NSwzNzMwMSwzNzMwMCwzNzMwNiwzNTkyNSw0MDU3NCwzNjI4MCwzNjMzMSwzNjM1NywzNjQ0MSwzNjQ1NywzNjI3NywzNjI4NywzNjI4NCwzNjI4MiwzNjI5MiwzNjMxMCwzNjMxMSwzNjMxNCwzNjMxOCwzNjMwMiwzNjMwMywzNjMxNSwzNjI5NCwzNjMzMiwzNjM0MywzNjM0NCwzNjMyMywzNjM0NSwzNjM0NywzNjMyNCwzNjM2MSwzNjM0OSwzNjM3MiwzNjM4MSwzNjM4MywzNjM5NiwzNjM5OCwzNjM4NywzNjM5OSwzNjQxMCwzNjQxNiwzNjQwOSwzNjQwNSwzNjQxMywzNjQwMSwzNjQyNSwzNjQxNywzNjQxOCwzNjQzMywzNjQzNCwzNjQyNiwzNjQ2NCwzNjQ3MCwzNjQ3NiwzNjQ2MywzNjQ2OCwzNjQ4NSwzNjQ5NSwzNjUwMCwzNjQ5NiwzNjUwOCwzNjUxMCwzNTk2MCwzNTk3MCwzNTk3OCwzNTk3MywzNTk5MiwzNTk4OCwyNjAxMSwzNTI4NiwzNTI5NCwzNTI5MCwzNTI5MiwzOTkwMCwzOTkwMSwzOTkwMiwzOTkwMywzOTkwNCwzOTkwNSwzOTkwNiwzOTkwNywzOTkwOCwzOTkwOSwzOTkxMCwzOTkxMSwzOTkxMiwzOTkxMywzOTkxNCwzOTkxNSwzOTkxNiwzOTkxNywzOTkxOCwzOTkxOSwzOTkyMCwzOTkyMSwzOTkyMiwzOTkyMywzOTkyNCwzOTkyNSwzOTkyNiwzOTkyNywzOTkyOCwzOTkyOSwzOTkzMCwzOTkzMSwzOTkzMiwzOTkzMywzOTkzNCwzOTkzNSwzOTkzNiwzOTkzNywzOTkzOCwzOTkzOSwzOTk0MCwzOTk0MSwzOTk0MiwzOTk0MywzOTk0NCwzOTk0NSwzOTk0NiwzOTk0NywzOTk0OCwzOTk0OSwzOTk1MCwzOTk1MSwzOTk1MiwzOTk1MywzOTk1NCwzOTk1NSwzOTk1NiwzOTk1NywzOTk1OCwzOTk1OSwzOTk2MCwzOTk2MSwzOTk2MiwzOTk2MywzOTk2NCwzOTk2NSwzOTk2NiwzOTk2NywzOTk2OCwzOTk2OSwzOTk3MCwzOTk3MSwzOTk3MiwzOTk3MywzOTk3NCwzOTk3NSwzOTk3NiwzOTk3NywzOTk3OCwzOTk3OSwzOTk4MCwzOTk4MSwzOTk4MiwzOTk4MywzOTk4NCwzOTk4NSwzOTk4NiwzOTk4NywzOTk4OCwzOTk4OSwzOTk5MCwzOTk5MSwzOTk5MiwzOTk5MywzOTk5NCwzOTk5NSwzNTMwMSwzNTMwNywzNTMxMSwzNTM5MCwzNTYyMiwzODczOSwzODYzMywzODY0MywzODYzOSwzODY2MiwzODY1NywzODY2NCwzODY3MSwzODY3MCwzODY5OCwzODcwMSwzODcwNCwzODcxOCw0MDgzMiw0MDgzNSw0MDgzNyw0MDgzOCw0MDgzOSw0MDg0MCw0MDg0MSw0MDg0Miw0MDg0NCw0MDcwMiw0MDcxNSw0MDcxNywzODU4NSwzODU4OCwzODU4OSwzODYwNiwzODYxMCwzMDY1NSwzODYyNCwzNzUxOCwzNzU1MCwzNzU3NiwzNzY5NCwzNzczOCwzNzgzNCwzNzc3NSwzNzk1MCwzNzk5NSw0MDA2Myw0MDA2Niw0MDA2OSw0MDA3MCw0MDA3MSw0MDA3MiwzMTI2Nyw0MDA3NSw0MDA3OCw0MDA4MCw0MDA4MSw0MDA4Miw0MDA4NCw0MDA4NSw0MDA5MCw0MDA5MSw0MDA5NCw0MDA5NSw0MDA5Niw0MDA5Nyw0MDA5OCw0MDA5OSw0MDEwMSw0MDEwMiw0MDEwMyw0MDEwNCw0MDEwNSw0MDEwNyw0MDEwOSw0MDExMCw0MDExMiw0MDExMyw0MDExNCw0MDExNSw0MDExNiw0MDExNyw0MDExOCw0MDExOSw0MDEyMiw0MDEyMyw0MDEyNCw0MDEyNSw0MDEzMiw0MDEzMyw0MDEzNCw0MDEzNSw0MDEzOCw0MDEzOSwzOTk5NiwzOTk5NywzOTk5OCwzOTk5OSw0MDAwMCw0MDAwMSw0MDAwMiw0MDAwMyw0MDAwNCw0MDAwNSw0MDAwNiw0MDAwNyw0MDAwOCw0MDAwOSw0MDAxMCw0MDAxMSw0MDAxMiw0MDAxMyw0MDAxNCw0MDAxNSw0MDAxNiw0MDAxNyw0MDAxOCw0MDAxOSw0MDAyMCw0MDAyMSw0MDAyMiw0MDAyMyw0MDAyNCw0MDAyNSw0MDAyNiw0MDAyNyw0MDAyOCw0MDAyOSw0MDAzMCw0MDAzMSw0MDAzMiw0MDAzMyw0MDAzNCw0MDAzNSw0MDAzNiw0MDAzNyw0MDAzOCw0MDAzOSw0MDA0MCw0MDA0MSw0MDA0Miw0MDA0Myw0MDA0NCw0MDA0NSw0MDA0Niw0MDA0Nyw0MDA0OCw0MDA0OSw0MDA1MCw0MDA1MSw0MDA1Miw0MDA1Myw0MDA1NCw0MDA1NSw0MDA1Niw0MDA1Nyw0MDA1OCw0MDA1OSw0MDA2MSw0MDA2Miw0MDA2NCw0MDA2Nyw0MDA2OCw0MDA3Myw0MDA3NCw0MDA3Niw0MDA3OSw0MDA4Myw0MDA4Niw0MDA4Nyw0MDA4OCw0MDA4OSw0MDA5Myw0MDEwNiw0MDEwOCw0MDExMSw0MDEyMSw0MDEyNiw0MDEyNyw0MDEyOCw0MDEyOSw0MDEzMCw0MDEzNiw0MDEzNyw0MDE0NSw0MDE0Niw0MDE1NCw0MDE1NSw0MDE2MCw0MDE2MSw0MDE0MCw0MDE0MSw0MDE0Miw0MDE0Myw0MDE0NCw0MDE0Nyw0MDE0OCw0MDE0OSw0MDE1MSw0MDE1Miw0MDE1Myw0MDE1Niw0MDE1Nyw0MDE1OSw0MDE2MiwzODc4MCwzODc4OSwzODgwMSwzODgwMiwzODgwNCwzODgzMSwzODgyNywzODgxOSwzODgzNCwzODgzNiwzOTYwMSwzOTYwMCwzOTYwNyw0MDUzNiwzOTYwNiwzOTYxMCwzOTYxMiwzOTYxNywzOTYxNiwzOTYyMSwzOTYxOCwzOTYyNywzOTYyOCwzOTYzMywzOTc0OSwzOTc0NywzOTc1MSwzOTc1MywzOTc1MiwzOTc1NywzOTc2MSwzOTE0NCwzOTE4MSwzOTIxNCwzOTI1MywzOTI1MiwzOTY0NywzOTY0OSwzOTY1NCwzOTY2MywzOTY1OSwzOTY3NSwzOTY2MSwzOTY3MywzOTY4OCwzOTY5NSwzOTY5OSwzOTcxMSwzOTcxNSw0MDYzNyw0MDYzOCwzMjMxNSw0MDU3OCw0MDU4Myw0MDU4NCw0MDU4Nyw0MDU5NCwzNzg0Niw0MDYwNSw0MDYwNyw0MDY2Nyw0MDY2OCw0MDY2OSw0MDY3Miw0MDY3MSw0MDY3NCw0MDY4MSw0MDY3OSw0MDY3Nyw0MDY4Miw0MDY4Nyw0MDczOCw0MDc0OCw0MDc1MSw0MDc2MSw0MDc1OSw0MDc2NSw0MDc2Niw0MDc3Miw0MDE2Myw0MDE2NCw0MDE2NSw0MDE2Niw0MDE2Nyw0MDE2OCw0MDE2OSw0MDE3MCw0MDE3MSw0MDE3Miw0MDE3Myw0MDE3NCw0MDE3NSw0MDE3Niw0MDE3Nyw0MDE3OCw0MDE3OSw0MDE4MCw0MDE4MSw0MDE4Miw0MDE4Myw0MDE4NCw0MDE4NSw0MDE4Niw0MDE4Nyw0MDE4OCw0MDE4OSw0MDE5MCw0MDE5MSw0MDE5Miw0MDE5Myw0MDE5NCw0MDE5NSw0MDE5Niw0MDE5Nyw0MDE5OCw0MDE5OSw0MDIwMCw0MDIwMSw0MDIwMiw0MDIwMyw0MDIwNCw0MDIwNSw0MDIwNiw0MDIwNyw0MDIwOCw0MDIwOSw0MDIxMCw0MDIxMSw0MDIxMiw0MDIxMyw0MDIxNCw0MDIxNSw0MDIxNiw0MDIxNyw0MDIxOCw0MDIxOSw0MDIyMCw0MDIyMSw0MDIyMiw0MDIyMyw0MDIyNCw0MDIyNSw0MDIyNiw0MDIyNyw0MDIyOCw0MDIyOSw0MDIzMCw0MDIzMSw0MDIzMiw0MDIzMyw0MDIzNCw0MDIzNSw0MDIzNiw0MDIzNyw0MDIzOCw0MDIzOSw0MDI0MCw0MDI0MSw0MDI0Miw0MDI0Myw0MDI0NCw0MDI0NSw0MDI0Niw0MDI0Nyw0MDI0OCw0MDI0OSw0MDI1MCw0MDI1MSw0MDI1Miw0MDI1Myw0MDI1NCw0MDI1NSw0MDI1Niw0MDI1Nyw0MDI1OCw1NzkwOCw1NzkwOSw1NzkxMCw1NzkxMSw1NzkxMiw1NzkxMyw1NzkxNCw1NzkxNSw1NzkxNiw1NzkxNyw1NzkxOCw1NzkxOSw1NzkyMCw1NzkyMSw1NzkyMiw1NzkyMyw1NzkyNCw1NzkyNSw1NzkyNiw1NzkyNyw1NzkyOCw1NzkyOSw1NzkzMCw1NzkzMSw1NzkzMiw1NzkzMyw1NzkzNCw1NzkzNSw1NzkzNiw1NzkzNyw1NzkzOCw1NzkzOSw1Nzk0MCw1Nzk0MSw1Nzk0Miw1Nzk0Myw1Nzk0NCw1Nzk0NSw1Nzk0Niw1Nzk0Nyw1Nzk0OCw1Nzk0OSw1Nzk1MCw1Nzk1MSw1Nzk1Miw1Nzk1Myw1Nzk1NCw1Nzk1NSw1Nzk1Niw1Nzk1Nyw1Nzk1OCw1Nzk1OSw1Nzk2MCw1Nzk2MSw1Nzk2Miw1Nzk2Myw1Nzk2NCw1Nzk2NSw1Nzk2Niw1Nzk2Nyw1Nzk2OCw1Nzk2OSw1Nzk3MCw1Nzk3MSw1Nzk3Miw1Nzk3Myw1Nzk3NCw1Nzk3NSw1Nzk3Niw1Nzk3Nyw1Nzk3OCw1Nzk3OSw1Nzk4MCw1Nzk4MSw1Nzk4Miw1Nzk4Myw1Nzk4NCw1Nzk4NSw1Nzk4Niw1Nzk4Nyw1Nzk4OCw1Nzk4OSw1Nzk5MCw1Nzk5MSw1Nzk5Miw1Nzk5Myw1Nzk5NCw1Nzk5NSw1Nzk5Niw1Nzk5Nyw1Nzk5OCw1Nzk5OSw1ODAwMCw1ODAwMSw0MDI1OSw0MDI2MCw0MDI2MSw0MDI2Miw0MDI2Myw0MDI2NCw0MDI2NSw0MDI2Niw0MDI2Nyw0MDI2OCw0MDI2OSw0MDI3MCw0MDI3MSw0MDI3Miw0MDI3Myw0MDI3NCw0MDI3NSw0MDI3Niw0MDI3Nyw0MDI3OCw0MDI3OSw0MDI4MCw0MDI4MSw0MDI4Miw0MDI4Myw0MDI4NCw0MDI4NSw0MDI4Niw0MDI4Nyw0MDI4OCw0MDI4OSw0MDI5MCw0MDI5MSw0MDI5Miw0MDI5Myw0MDI5NCw0MDI5NSw0MDI5Niw0MDI5Nyw0MDI5OCw0MDI5OSw0MDMwMCw0MDMwMSw0MDMwMiw0MDMwMyw0MDMwNCw0MDMwNSw0MDMwNiw0MDMwNyw0MDMwOCw0MDMwOSw0MDMxMCw0MDMxMSw0MDMxMiw0MDMxMyw0MDMxNCw0MDMxNSw0MDMxNiw0MDMxNyw0MDMxOCw0MDMxOSw0MDMyMCw0MDMyMSw0MDMyMiw0MDMyMyw0MDMyNCw0MDMyNSw0MDMyNiw0MDMyNyw0MDMyOCw0MDMyOSw0MDMzMCw0MDMzMSw0MDMzMiw0MDMzMyw0MDMzNCw0MDMzNSw0MDMzNiw0MDMzNyw0MDMzOCw0MDMzOSw0MDM0MCw0MDM0MSw0MDM0Miw0MDM0Myw0MDM0NCw0MDM0NSw0MDM0Niw0MDM0Nyw0MDM0OCw0MDM0OSw0MDM1MCw0MDM1MSw0MDM1Miw0MDM1Myw0MDM1NCw1ODAwMiw1ODAwMyw1ODAwNCw1ODAwNSw1ODAwNiw1ODAwNyw1ODAwOCw1ODAwOSw1ODAxMCw1ODAxMSw1ODAxMiw1ODAxMyw1ODAxNCw1ODAxNSw1ODAxNiw1ODAxNyw1ODAxOCw1ODAxOSw1ODAyMCw1ODAyMSw1ODAyMiw1ODAyMyw1ODAyNCw1ODAyNSw1ODAyNiw1ODAyNyw1ODAyOCw1ODAyOSw1ODAzMCw1ODAzMSw1ODAzMiw1ODAzMyw1ODAzNCw1ODAzNSw1ODAzNiw1ODAzNyw1ODAzOCw1ODAzOSw1ODA0MCw1ODA0MSw1ODA0Miw1ODA0Myw1ODA0NCw1ODA0NSw1ODA0Niw1ODA0Nyw1ODA0OCw1ODA0OSw1ODA1MCw1ODA1MSw1ODA1Miw1ODA1Myw1ODA1NCw1ODA1NSw1ODA1Niw1ODA1Nyw1ODA1OCw1ODA1OSw1ODA2MCw1ODA2MSw1ODA2Miw1ODA2Myw1ODA2NCw1ODA2NSw1ODA2Niw1ODA2Nyw1ODA2OCw1ODA2OSw1ODA3MCw1ODA3MSw1ODA3Miw1ODA3Myw1ODA3NCw1ODA3NSw1ODA3Niw1ODA3Nyw1ODA3OCw1ODA3OSw1ODA4MCw1ODA4MSw1ODA4Miw1ODA4Myw1ODA4NCw1ODA4NSw1ODA4Niw1ODA4Nyw1ODA4OCw1ODA4OSw1ODA5MCw1ODA5MSw1ODA5Miw1ODA5Myw1ODA5NCw1ODA5NSw0MDM1NSw0MDM1Niw0MDM1Nyw0MDM1OCw0MDM1OSw0MDM2MCw0MDM2MSw0MDM2Miw0MDM2Myw0MDM2NCw0MDM2NSw0MDM2Niw0MDM2Nyw0MDM2OCw0MDM2OSw0MDM3MCw0MDM3MSw0MDM3Miw0MDM3Myw0MDM3NCw0MDM3NSw0MDM3Niw0MDM3Nyw0MDM3OCw0MDM3OSw0MDM4MCw0MDM4MSw0MDM4Miw0MDM4Myw0MDM4NCw0MDM4NSw0MDM4Niw0MDM4Nyw0MDM4OCw0MDM4OSw0MDM5MCw0MDM5MSw0MDM5Miw0MDM5Myw0MDM5NCw0MDM5NSw0MDM5Niw0MDM5Nyw0MDM5OCw0MDM5OSw0MDQwMCw0MDQwMSw0MDQwMiw0MDQwMyw0MDQwNCw0MDQwNSw0MDQwNiw0MDQwNyw0MDQwOCw0MDQwOSw0MDQxMCw0MDQxMSw0MDQxMiw0MDQxMyw0MDQxNCw0MDQxNSw0MDQxNiw0MDQxNyw0MDQxOCw0MDQxOSw0MDQyMCw0MDQyMSw0MDQyMiw0MDQyMyw0MDQyNCw0MDQyNSw0MDQyNiw0MDQyNyw0MDQyOCw0MDQyOSw0MDQzMCw0MDQzMSw0MDQzMiw0MDQzMyw0MDQzNCw0MDQzNSw0MDQzNiw0MDQzNyw0MDQzOCw0MDQzOSw0MDQ0MCw0MDQ0MSw0MDQ0Miw0MDQ0Myw0MDQ0NCw0MDQ0NSw0MDQ0Niw0MDQ0Nyw0MDQ0OCw0MDQ0OSw0MDQ1MCw1ODA5Niw1ODA5Nyw1ODA5OCw1ODA5OSw1ODEwMCw1ODEwMSw1ODEwMiw1ODEwMyw1ODEwNCw1ODEwNSw1ODEwNiw1ODEwNyw1ODEwOCw1ODEwOSw1ODExMCw1ODExMSw1ODExMiw1ODExMyw1ODExNCw1ODExNSw1ODExNiw1ODExNyw1ODExOCw1ODExOSw1ODEyMCw1ODEyMSw1ODEyMiw1ODEyMyw1ODEyNCw1ODEyNSw1ODEyNiw1ODEyNyw1ODEyOCw1ODEyOSw1ODEzMCw1ODEzMSw1ODEzMiw1ODEzMyw1ODEzNCw1ODEzNSw1ODEzNiw1ODEzNyw1ODEzOCw1ODEzOSw1ODE0MCw1ODE0MSw1ODE0Miw1ODE0Myw1ODE0NCw1ODE0NSw1ODE0Niw1ODE0Nyw1ODE0OCw1ODE0OSw1ODE1MCw1ODE1MSw1ODE1Miw1ODE1Myw1ODE1NCw1ODE1NSw1ODE1Niw1ODE1Nyw1ODE1OCw1ODE1OSw1ODE2MCw1ODE2MSw1ODE2Miw1ODE2Myw1ODE2NCw1ODE2NSw1ODE2Niw1ODE2Nyw1ODE2OCw1ODE2OSw1ODE3MCw1ODE3MSw1ODE3Miw1ODE3Myw1ODE3NCw1ODE3NSw1ODE3Niw1ODE3Nyw1ODE3OCw1ODE3OSw1ODE4MCw1ODE4MSw1ODE4Miw1ODE4Myw1ODE4NCw1ODE4NSw1ODE4Niw1ODE4Nyw1ODE4OCw1ODE4OSw0MDQ1MSw0MDQ1Miw0MDQ1Myw0MDQ1NCw0MDQ1NSw0MDQ1Niw0MDQ1Nyw0MDQ1OCw0MDQ1OSw0MDQ2MCw0MDQ2MSw0MDQ2Miw0MDQ2Myw0MDQ2NCw0MDQ2NSw0MDQ2Niw0MDQ2Nyw0MDQ2OCw0MDQ2OSw0MDQ3MCw0MDQ3MSw0MDQ3Miw0MDQ3Myw0MDQ3NCw0MDQ3NSw0MDQ3Niw0MDQ3Nyw0MDQ3OCw0MDQ4NCw0MDQ4Nyw0MDQ5NCw0MDQ5Niw0MDUwMCw0MDUwNyw0MDUwOCw0MDUxMiw0MDUyNSw0MDUyOCw0MDUzMCw0MDUzMSw0MDUzMiw0MDUzNCw0MDUzNyw0MDU0MSw0MDU0Myw0MDU0NCw0MDU0NSw0MDU0Niw0MDU0OSw0MDU1OCw0MDU1OSw0MDU2Miw0MDU2NCw0MDU2NSw0MDU2Niw0MDU2Nyw0MDU2OCw0MDU2OSw0MDU3MCw0MDU3MSw0MDU3Miw0MDU3Myw0MDU3Niw0MDU3Nyw0MDU3OSw0MDU4MCw0MDU4MSw0MDU4Miw0MDU4NSw0MDU4Niw0MDU4OCw0MDU4OSw0MDU5MCw0MDU5MSw0MDU5Miw0MDU5Myw0MDU5Niw0MDU5Nyw0MDU5OCw0MDU5OSw0MDYwMCw0MDYwMSw0MDYwMiw0MDYwMyw0MDYwNCw0MDYwNiw0MDYwOCw0MDYwOSw0MDYxMCw0MDYxMSw0MDYxMiw0MDYxMyw0MDYxNSw0MDYxNiw0MDYxNyw0MDYxOCw1ODE5MCw1ODE5MSw1ODE5Miw1ODE5Myw1ODE5NCw1ODE5NSw1ODE5Niw1ODE5Nyw1ODE5OCw1ODE5OSw1ODIwMCw1ODIwMSw1ODIwMiw1ODIwMyw1ODIwNCw1ODIwNSw1ODIwNiw1ODIwNyw1ODIwOCw1ODIwOSw1ODIxMCw1ODIxMSw1ODIxMiw1ODIxMyw1ODIxNCw1ODIxNSw1ODIxNiw1ODIxNyw1ODIxOCw1ODIxOSw1ODIyMCw1ODIyMSw1ODIyMiw1ODIyMyw1ODIyNCw1ODIyNSw1ODIyNiw1ODIyNyw1ODIyOCw1ODIyOSw1ODIzMCw1ODIzMSw1ODIzMiw1ODIzMyw1ODIzNCw1ODIzNSw1ODIzNiw1ODIzNyw1ODIzOCw1ODIzOSw1ODI0MCw1ODI0MSw1ODI0Miw1ODI0Myw1ODI0NCw1ODI0NSw1ODI0Niw1ODI0Nyw1ODI0OCw1ODI0OSw1ODI1MCw1ODI1MSw1ODI1Miw1ODI1Myw1ODI1NCw1ODI1NSw1ODI1Niw1ODI1Nyw1ODI1OCw1ODI1OSw1ODI2MCw1ODI2MSw1ODI2Miw1ODI2Myw1ODI2NCw1ODI2NSw1ODI2Niw1ODI2Nyw1ODI2OCw1ODI2OSw1ODI3MCw1ODI3MSw1ODI3Miw1ODI3Myw1ODI3NCw1ODI3NSw1ODI3Niw1ODI3Nyw1ODI3OCw1ODI3OSw1ODI4MCw1ODI4MSw1ODI4Miw1ODI4Myw0MDYxOSw0MDYyMCw0MDYyMSw0MDYyMiw0MDYyMyw0MDYyNCw0MDYyNSw0MDYyNiw0MDYyNyw0MDYyOSw0MDYzMCw0MDYzMSw0MDYzMyw0MDYzNCw0MDYzNiw0MDYzOSw0MDY0MCw0MDY0MSw0MDY0Miw0MDY0Myw0MDY0NSw0MDY0Niw0MDY0Nyw0MDY0OCw0MDY1MCw0MDY1MSw0MDY1Miw0MDY1Niw0MDY1OCw0MDY1OSw0MDY2MSw0MDY2Miw0MDY2Myw0MDY2NSw0MDY2Niw0MDY3MCw0MDY3Myw0MDY3NSw0MDY3Niw0MDY3OCw0MDY4MCw0MDY4Myw0MDY4NCw0MDY4NSw0MDY4Niw0MDY4OCw0MDY4OSw0MDY5MCw0MDY5MSw0MDY5Miw0MDY5Myw0MDY5NCw0MDY5NSw0MDY5Niw0MDY5OCw0MDcwMSw0MDcwMyw0MDcwNCw0MDcwNSw0MDcwNiw0MDcwNyw0MDcwOCw0MDcwOSw0MDcxMCw0MDcxMSw0MDcxMiw0MDcxMyw0MDcxNCw0MDcxNiw0MDcxOSw0MDcyMSw0MDcyMiw0MDcyNCw0MDcyNSw0MDcyNiw0MDcyOCw0MDczMCw0MDczMSw0MDczMiw0MDczMyw0MDczNCw0MDczNSw0MDczNyw0MDczOSw0MDc0MCw0MDc0MSw0MDc0Miw0MDc0Myw0MDc0NCw0MDc0NSw0MDc0Niw0MDc0Nyw0MDc0OSw0MDc1MCw0MDc1Miw0MDc1Myw1ODI4NCw1ODI4NSw1ODI4Niw1ODI4Nyw1ODI4OCw1ODI4OSw1ODI5MCw1ODI5MSw1ODI5Miw1ODI5Myw1ODI5NCw1ODI5NSw1ODI5Niw1ODI5Nyw1ODI5OCw1ODI5OSw1ODMwMCw1ODMwMSw1ODMwMiw1ODMwMyw1ODMwNCw1ODMwNSw1ODMwNiw1ODMwNyw1ODMwOCw1ODMwOSw1ODMxMCw1ODMxMSw1ODMxMiw1ODMxMyw1ODMxNCw1ODMxNSw1ODMxNiw1ODMxNyw1ODMxOCw1ODMxOSw1ODMyMCw1ODMyMSw1ODMyMiw1ODMyMyw1ODMyNCw1ODMyNSw1ODMyNiw1ODMyNyw1ODMyOCw1ODMyOSw1ODMzMCw1ODMzMSw1ODMzMiw1ODMzMyw1ODMzNCw1ODMzNSw1ODMzNiw1ODMzNyw1ODMzOCw1ODMzOSw1ODM0MCw1ODM0MSw1ODM0Miw1ODM0Myw1ODM0NCw1ODM0NSw1ODM0Niw1ODM0Nyw1ODM0OCw1ODM0OSw1ODM1MCw1ODM1MSw1ODM1Miw1ODM1Myw1ODM1NCw1ODM1NSw1ODM1Niw1ODM1Nyw1ODM1OCw1ODM1OSw1ODM2MCw1ODM2MSw1ODM2Miw1ODM2Myw1ODM2NCw1ODM2NSw1ODM2Niw1ODM2Nyw1ODM2OCw1ODM2OSw1ODM3MCw1ODM3MSw1ODM3Miw1ODM3Myw1ODM3NCw1ODM3NSw1ODM3Niw1ODM3Nyw0MDc1NCw0MDc1NSw0MDc1Niw0MDc1Nyw0MDc1OCw0MDc2MCw0MDc2Miw0MDc2NCw0MDc2Nyw0MDc2OCw0MDc2OSw0MDc3MCw0MDc3MSw0MDc3Myw0MDc3NCw0MDc3NSw0MDc3Niw0MDc3Nyw0MDc3OCw0MDc3OSw0MDc4MCw0MDc4MSw0MDc4Miw0MDc4Myw0MDc4Niw0MDc4Nyw0MDc4OCw0MDc4OSw0MDc5MCw0MDc5MSw0MDc5Miw0MDc5Myw0MDc5NCw0MDc5NSw0MDc5Niw0MDc5Nyw0MDc5OCw0MDc5OSw0MDgwMCw0MDgwMSw0MDgwMiw0MDgwMyw0MDgwNCw0MDgwNSw0MDgwNiw0MDgwNyw0MDgwOCw0MDgwOSw0MDgxMCw0MDgxMSw0MDgxMiw0MDgxMyw0MDgxNCw0MDgxNSw0MDgxNiw0MDgxNyw0MDgxOCw0MDgxOSw0MDgyMCw0MDgyMSw0MDgyMiw0MDgyMyw0MDgyNCw0MDgyNSw0MDgyNiw0MDgyNyw0MDgyOCw0MDgyOSw0MDgzMCw0MDgzMyw0MDgzNCw0MDg0NSw0MDg0Niw0MDg0Nyw0MDg0OCw0MDg0OSw0MDg1MCw0MDg1MSw0MDg1Miw0MDg1Myw0MDg1NCw0MDg1NSw0MDg1Niw0MDg2MCw0MDg2MSw0MDg2Miw0MDg2NSw0MDg2Niw0MDg2Nyw0MDg2OCw0MDg2OSw2Mzc4OCw2Mzg2NSw2Mzg5Myw2Mzk3NSw2Mzk4NSw1ODM3OCw1ODM3OSw1ODM4MCw1ODM4MSw1ODM4Miw1ODM4Myw1ODM4NCw1ODM4NSw1ODM4Niw1ODM4Nyw1ODM4OCw1ODM4OSw1ODM5MCw1ODM5MSw1ODM5Miw1ODM5Myw1ODM5NCw1ODM5NSw1ODM5Niw1ODM5Nyw1ODM5OCw1ODM5OSw1ODQwMCw1ODQwMSw1ODQwMiw1ODQwMyw1ODQwNCw1ODQwNSw1ODQwNiw1ODQwNyw1ODQwOCw1ODQwOSw1ODQxMCw1ODQxMSw1ODQxMiw1ODQxMyw1ODQxNCw1ODQxNSw1ODQxNiw1ODQxNyw1ODQxOCw1ODQxOSw1ODQyMCw1ODQyMSw1ODQyMiw1ODQyMyw1ODQyNCw1ODQyNSw1ODQyNiw1ODQyNyw1ODQyOCw1ODQyOSw1ODQzMCw1ODQzMSw1ODQzMiw1ODQzMyw1ODQzNCw1ODQzNSw1ODQzNiw1ODQzNyw1ODQzOCw1ODQzOSw1ODQ0MCw1ODQ0MSw1ODQ0Miw1ODQ0Myw1ODQ0NCw1ODQ0NSw1ODQ0Niw1ODQ0Nyw1ODQ0OCw1ODQ0OSw1ODQ1MCw1ODQ1MSw1ODQ1Miw1ODQ1Myw1ODQ1NCw1ODQ1NSw1ODQ1Niw1ODQ1Nyw1ODQ1OCw1ODQ1OSw1ODQ2MCw1ODQ2MSw1ODQ2Miw1ODQ2Myw1ODQ2NCw1ODQ2NSw1ODQ2Niw1ODQ2Nyw1ODQ2OCw1ODQ2OSw1ODQ3MCw1ODQ3MSw2NDAxMiw2NDAxMyw2NDAxNCw2NDAxNSw2NDAxNyw2NDAxOSw2NDAyMCw2NDAyNCw2NDAzMSw2NDAzMiw2NDAzMyw2NDAzNSw2NDAzNiw2NDAzOSw2NDA0MCw2NDA0MSwxMTkwNSw1OTQxNCw1OTQxNSw1OTQxNiwxMTkwOCwxMzQyNywxMzM4MywxMTkxMiwxMTkxNSw1OTQyMiwxMzcyNiwxMzg1MCwxMzgzOCwxMTkxNiwxMTkyNywxNDcwMiwxNDYxNiw1OTQzMCwxNDc5OSwxNDgxNSwxNDk2MywxNDgwMCw1OTQzNSw1OTQzNiwxNTE4MiwxNTQ3MCwxNTU4NCwxMTk0Myw1OTQ0MSw1OTQ0MiwxMTk0NiwxNjQ3MCwxNjczNSwxMTk1MCwxNzIwNywxMTk1NSwxMTk1OCwxMTk1OSw1OTQ1MSwxNzMyOSwxNzMyNCwxMTk2MywxNzM3MywxNzYyMiwxODAxNywxNzk5Niw1OTQ1OSwxODIxMSwxODIxNywxODMwMCwxODMxNywxMTk3OCwxODc1OSwxODgxMCwxODgxMywxODgxOCwxODgxOSwxODgyMSwxODgyMiwxODg0NywxODg0MywxODg3MSwxODg3MCw1OTQ3Niw1OTQ3NywxOTYxOSwxOTYxNSwxOTYxNiwxOTYxNywxOTU3NSwxOTYxOCwxOTczMSwxOTczMiwxOTczMywxOTczNCwxOTczNSwxOTczNiwxOTczNywxOTg4Niw1OTQ5Miw1ODQ3Miw1ODQ3Myw1ODQ3NCw1ODQ3NSw1ODQ3Niw1ODQ3Nyw1ODQ3OCw1ODQ3OSw1ODQ4MCw1ODQ4MSw1ODQ4Miw1ODQ4Myw1ODQ4NCw1ODQ4NSw1ODQ4Niw1ODQ4Nyw1ODQ4OCw1ODQ4OSw1ODQ5MCw1ODQ5MSw1ODQ5Miw1ODQ5Myw1ODQ5NCw1ODQ5NSw1ODQ5Niw1ODQ5Nyw1ODQ5OCw1ODQ5OSw1ODUwMCw1ODUwMSw1ODUwMiw1ODUwMyw1ODUwNCw1ODUwNSw1ODUwNiw1ODUwNyw1ODUwOCw1ODUwOSw1ODUxMCw1ODUxMSw1ODUxMiw1ODUxMyw1ODUxNCw1ODUxNSw1ODUxNiw1ODUxNyw1ODUxOCw1ODUxOSw1ODUyMCw1ODUyMSw1ODUyMiw1ODUyMyw1ODUyNCw1ODUyNSw1ODUyNiw1ODUyNyw1ODUyOCw1ODUyOSw1ODUzMCw1ODUzMSw1ODUzMiw1ODUzMyw1ODUzNCw1ODUzNSw1ODUzNiw1ODUzNyw1ODUzOCw1ODUzOSw1ODU0MCw1ODU0MSw1ODU0Miw1ODU0Myw1ODU0NCw1ODU0NSw1ODU0Niw1ODU0Nyw1ODU0OCw1ODU0OSw1ODU1MCw1ODU1MSw1ODU1Miw1ODU1Myw1ODU1NCw1ODU1NSw1ODU1Niw1ODU1Nyw1ODU1OCw1ODU1OSw1ODU2MCw1ODU2MSw1ODU2Miw1ODU2Myw1ODU2NCw1ODU2NV0sXG4gIFwiZ2IxODAzMC1yYW5nZXNcIjpbWzAsMTI4XSxbMzYsMTY1XSxbMzgsMTY5XSxbNDUsMTc4XSxbNTAsMTg0XSxbODEsMjE2XSxbODksMjI2XSxbOTUsMjM1XSxbOTYsMjM4XSxbMTAwLDI0NF0sWzEwMywyNDhdLFsxMDQsMjUxXSxbMTA1LDI1M10sWzEwOSwyNThdLFsxMjYsMjc2XSxbMTMzLDI4NF0sWzE0OCwzMDBdLFsxNzIsMzI1XSxbMTc1LDMyOV0sWzE3OSwzMzRdLFsyMDgsMzY0XSxbMzA2LDQ2M10sWzMwNyw0NjVdLFszMDgsNDY3XSxbMzA5LDQ2OV0sWzMxMCw0NzFdLFszMTEsNDczXSxbMzEyLDQ3NV0sWzMxMyw0NzddLFszNDEsNTA2XSxbNDI4LDU5NF0sWzQ0Myw2MTBdLFs1NDQsNzEyXSxbNTQ1LDcxNl0sWzU1OCw3MzBdLFs3NDEsOTMwXSxbNzQyLDkzOF0sWzc0OSw5NjJdLFs3NTAsOTcwXSxbODA1LDEwMjZdLFs4MTksMTEwNF0sWzgyMCwxMTA2XSxbNzkyMiw4MjA5XSxbNzkyNCw4MjE1XSxbNzkyNSw4MjE4XSxbNzkyNyw4MjIyXSxbNzkzNCw4MjMxXSxbNzk0Myw4MjQxXSxbNzk0NCw4MjQ0XSxbNzk0NSw4MjQ2XSxbNzk1MCw4MjUyXSxbODA2Miw4MzY1XSxbODE0OCw4NDUyXSxbODE0OSw4NDU0XSxbODE1Miw4NDU4XSxbODE2NCw4NDcxXSxbODE3NCw4NDgyXSxbODIzNiw4NTU2XSxbODI0MCw4NTcwXSxbODI2Miw4NTk2XSxbODI2NCw4NjAyXSxbODM3NCw4NzEzXSxbODM4MCw4NzIwXSxbODM4MSw4NzIyXSxbODM4NCw4NzI2XSxbODM4OCw4NzMxXSxbODM5MCw4NzM3XSxbODM5Miw4NzQwXSxbODM5Myw4NzQyXSxbODM5NCw4NzQ4XSxbODM5Niw4NzUxXSxbODQwMSw4NzYwXSxbODQwNiw4NzY2XSxbODQxNiw4Nzc3XSxbODQxOSw4NzgxXSxbODQyNCw4Nzg3XSxbODQzNyw4ODAyXSxbODQzOSw4ODA4XSxbODQ0NSw4ODE2XSxbODQ4Miw4ODU0XSxbODQ4NSw4ODU4XSxbODQ5Niw4ODcwXSxbODUyMSw4ODk2XSxbODYwMyw4OTc5XSxbODkzNiw5MzIyXSxbODk0Niw5MzcyXSxbOTA0Niw5NTQ4XSxbOTA1MCw5NTg4XSxbOTA2Myw5NjE2XSxbOTA2Niw5NjIyXSxbOTA3Niw5NjM0XSxbOTA5Miw5NjUyXSxbOTEwMCw5NjYyXSxbOTEwOCw5NjcyXSxbOTExMSw5Njc2XSxbOTExMyw5NjgwXSxbOTEzMSw5NzAyXSxbOTE2Miw5NzM1XSxbOTE2NCw5NzM4XSxbOTIxOCw5NzkzXSxbOTIxOSw5Nzk1XSxbMTEzMjksMTE5MDZdLFsxMTMzMSwxMTkwOV0sWzExMzM0LDExOTEzXSxbMTEzMzYsMTE5MTddLFsxMTM0NiwxMTkyOF0sWzExMzYxLDExOTQ0XSxbMTEzNjMsMTE5NDddLFsxMTM2NiwxMTk1MV0sWzExMzcwLDExOTU2XSxbMTEzNzIsMTE5NjBdLFsxMTM3NSwxMTk2NF0sWzExMzg5LDExOTc5XSxbMTE2ODIsMTIyODRdLFsxMTY4NiwxMjI5Ml0sWzExNjg3LDEyMzEyXSxbMTE2OTIsMTIzMTldLFsxMTY5NCwxMjMzMF0sWzExNzE0LDEyMzUxXSxbMTE3MTYsMTI0MzZdLFsxMTcyMywxMjQ0N10sWzExNzI1LDEyNTM1XSxbMTE3MzAsMTI1NDNdLFsxMTczNiwxMjU4Nl0sWzExOTgyLDEyODQyXSxbMTE5ODksMTI4NTBdLFsxMjEwMiwxMjk2NF0sWzEyMzM2LDEzMjAwXSxbMTIzNDgsMTMyMTVdLFsxMjM1MCwxMzIxOF0sWzEyMzg0LDEzMjUzXSxbMTIzOTMsMTMyNjNdLFsxMjM5NSwxMzI2N10sWzEyMzk3LDEzMjcwXSxbMTI1MTAsMTMzODRdLFsxMjU1MywxMzQyOF0sWzEyODUxLDEzNzI3XSxbMTI5NjIsMTM4MzldLFsxMjk3MywxMzg1MV0sWzEzNzM4LDE0NjE3XSxbMTM4MjMsMTQ3MDNdLFsxMzkxOSwxNDgwMV0sWzEzOTMzLDE0ODE2XSxbMTQwODAsMTQ5NjRdLFsxNDI5OCwxNTE4M10sWzE0NTg1LDE1NDcxXSxbMTQ2OTgsMTU1ODVdLFsxNTU4MywxNjQ3MV0sWzE1ODQ3LDE2NzM2XSxbMTYzMTgsMTcyMDhdLFsxNjQzNCwxNzMyNV0sWzE2NDM4LDE3MzMwXSxbMTY0ODEsMTczNzRdLFsxNjcyOSwxNzYyM10sWzE3MTAyLDE3OTk3XSxbMTcxMjIsMTgwMThdLFsxNzMxNSwxODIxMl0sWzE3MzIwLDE4MjE4XSxbMTc0MDIsMTgzMDFdLFsxNzQxOCwxODMxOF0sWzE3ODU5LDE4NzYwXSxbMTc5MDksMTg4MTFdLFsxNzkxMSwxODgxNF0sWzE3OTE1LDE4ODIwXSxbMTc5MTYsMTg4MjNdLFsxNzkzNiwxODg0NF0sWzE3OTM5LDE4ODQ4XSxbMTc5NjEsMTg4NzJdLFsxODY2NCwxOTU3Nl0sWzE4NzAzLDE5NjIwXSxbMTg4MTQsMTk3MzhdLFsxODk2MiwxOTg4N10sWzE5MDQzLDQwODcwXSxbMzM0NjksNTkyNDRdLFszMzQ3MCw1OTMzNl0sWzMzNDcxLDU5MzY3XSxbMzM0ODQsNTk0MTNdLFszMzQ4NSw1OTQxN10sWzMzNDkwLDU5NDIzXSxbMzM0OTcsNTk0MzFdLFszMzUwMSw1OTQzN10sWzMzNTA1LDU5NDQzXSxbMzM1MTMsNTk0NTJdLFszMzUyMCw1OTQ2MF0sWzMzNTM2LDU5NDc4XSxbMzM1NTAsNTk0OTNdLFszNzg0NSw2Mzc4OV0sWzM3OTIxLDYzODY2XSxbMzc5NDgsNjM4OTRdLFszODAyOSw2Mzk3Nl0sWzM4MDM4LDYzOTg2XSxbMzgwNjQsNjQwMTZdLFszODA2NSw2NDAxOF0sWzM4MDY2LDY0MDIxXSxbMzgwNjksNjQwMjVdLFszODA3NSw2NDAzNF0sWzM4MDc2LDY0MDM3XSxbMzgwNzgsNjQwNDJdLFszOTEwOCw2NTA3NF0sWzM5MTA5LDY1MDkzXSxbMzkxMTMsNjUxMDddLFszOTExNCw2NTExMl0sWzM5MTE1LDY1MTI3XSxbMzkxMTYsNjUxMzJdLFszOTI2NSw2NTM3NV0sWzM5Mzk0LDY1NTEwXSxbMTg5MDAwLDY1NTM2XV0sXG4gIFwiamlzMDIwOFwiOlsxMjI4OCwxMjI4OSwxMjI5MCw2NTI5Miw2NTI5NCwxMjUzOSw2NTMwNiw2NTMwNyw2NTMxMSw2NTI4MSwxMjQ0MywxMjQ0NCwxODAsNjUzNDQsMTY4LDY1MzQyLDY1NTA3LDY1MzQzLDEyNTQxLDEyNTQyLDEyNDQ1LDEyNDQ2LDEyMjkxLDIwMTg5LDEyMjkzLDEyMjk0LDEyMjk1LDEyNTQwLDgyMTMsODIwOCw2NTI5NSw2NTM0MCw2NTM3NCw4NzQxLDY1MzcyLDgyMzAsODIyOSw4MjE2LDgyMTcsODIyMCw4MjIxLDY1Mjg4LDY1Mjg5LDEyMzA4LDEyMzA5LDY1MzM5LDY1MzQxLDY1MzcxLDY1MzczLDEyMjk2LDEyMjk3LDEyMjk4LDEyMjk5LDEyMzAwLDEyMzAxLDEyMzAyLDEyMzAzLDEyMzA0LDEyMzA1LDY1MjkxLDY1MjkzLDE3NywyMTUsMjQ3LDY1MzA5LDg4MDAsNjUzMDgsNjUzMTAsODgwNiw4ODA3LDg3MzQsODc1Niw5Nzk0LDk3OTIsMTc2LDgyNDIsODI0Myw4NDUxLDY1NTA5LDY1Mjg0LDY1NTA0LDY1NTA1LDY1Mjg1LDY1MjgzLDY1Mjg2LDY1MjkwLDY1MzEyLDE2Nyw5NzM0LDk3MzMsOTY3NSw5Njc5LDk2NzgsOTY3MSw5NjcwLDk2MzMsOTYzMiw5NjUxLDk2NTAsOTY2MSw5NjYwLDgyNTEsMTIzMDYsODU5NCw4NTkyLDg1OTMsODU5NSwxMjMwNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsODcxMiw4NzE1LDg4MzgsODgzOSw4ODM0LDg4MzUsODc0Niw4NzQ1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4NzQzLDg3NDQsNjU1MDYsODY1OCw4NjYwLDg3MDQsODcwNyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsODczNiw4ODY5LDg5NzgsODcwNiw4NzExLDg4MDEsODc4Niw4ODEwLDg4MTEsODczMCw4NzY1LDg3MzMsODc1Nyw4NzQ3LDg3NDgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4NDkxLDgyNDAsOTgzOSw5ODM3LDk4MzQsODIyNCw4MjI1LDE4MixudWxsLG51bGwsbnVsbCxudWxsLDk3MTEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsNjUyOTYsNjUyOTcsNjUyOTgsNjUyOTksNjUzMDAsNjUzMDEsNjUzMDIsNjUzMDMsNjUzMDQsNjUzMDUsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw2NTMxMyw2NTMxNCw2NTMxNSw2NTMxNiw2NTMxNyw2NTMxOCw2NTMxOSw2NTMyMCw2NTMyMSw2NTMyMiw2NTMyMyw2NTMyNCw2NTMyNSw2NTMyNiw2NTMyNyw2NTMyOCw2NTMyOSw2NTMzMCw2NTMzMSw2NTMzMiw2NTMzMyw2NTMzNCw2NTMzNSw2NTMzNiw2NTMzNyw2NTMzOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw2NTM0NSw2NTM0Niw2NTM0Nyw2NTM0OCw2NTM0OSw2NTM1MCw2NTM1MSw2NTM1Miw2NTM1Myw2NTM1NCw2NTM1NSw2NTM1Niw2NTM1Nyw2NTM1OCw2NTM1OSw2NTM2MCw2NTM2MSw2NTM2Miw2NTM2Myw2NTM2NCw2NTM2NSw2NTM2Niw2NTM2Nyw2NTM2OCw2NTM2OSw2NTM3MCxudWxsLG51bGwsbnVsbCxudWxsLDEyMzUzLDEyMzU0LDEyMzU1LDEyMzU2LDEyMzU3LDEyMzU4LDEyMzU5LDEyMzYwLDEyMzYxLDEyMzYyLDEyMzYzLDEyMzY0LDEyMzY1LDEyMzY2LDEyMzY3LDEyMzY4LDEyMzY5LDEyMzcwLDEyMzcxLDEyMzcyLDEyMzczLDEyMzc0LDEyMzc1LDEyMzc2LDEyMzc3LDEyMzc4LDEyMzc5LDEyMzgwLDEyMzgxLDEyMzgyLDEyMzgzLDEyMzg0LDEyMzg1LDEyMzg2LDEyMzg3LDEyMzg4LDEyMzg5LDEyMzkwLDEyMzkxLDEyMzkyLDEyMzkzLDEyMzk0LDEyMzk1LDEyMzk2LDEyMzk3LDEyMzk4LDEyMzk5LDEyNDAwLDEyNDAxLDEyNDAyLDEyNDAzLDEyNDA0LDEyNDA1LDEyNDA2LDEyNDA3LDEyNDA4LDEyNDA5LDEyNDEwLDEyNDExLDEyNDEyLDEyNDEzLDEyNDE0LDEyNDE1LDEyNDE2LDEyNDE3LDEyNDE4LDEyNDE5LDEyNDIwLDEyNDIxLDEyNDIyLDEyNDIzLDEyNDI0LDEyNDI1LDEyNDI2LDEyNDI3LDEyNDI4LDEyNDI5LDEyNDMwLDEyNDMxLDEyNDMyLDEyNDMzLDEyNDM0LDEyNDM1LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMjQ0OSwxMjQ1MCwxMjQ1MSwxMjQ1MiwxMjQ1MywxMjQ1NCwxMjQ1NSwxMjQ1NiwxMjQ1NywxMjQ1OCwxMjQ1OSwxMjQ2MCwxMjQ2MSwxMjQ2MiwxMjQ2MywxMjQ2NCwxMjQ2NSwxMjQ2NiwxMjQ2NywxMjQ2OCwxMjQ2OSwxMjQ3MCwxMjQ3MSwxMjQ3MiwxMjQ3MywxMjQ3NCwxMjQ3NSwxMjQ3NiwxMjQ3NywxMjQ3OCwxMjQ3OSwxMjQ4MCwxMjQ4MSwxMjQ4MiwxMjQ4MywxMjQ4NCwxMjQ4NSwxMjQ4NiwxMjQ4NywxMjQ4OCwxMjQ4OSwxMjQ5MCwxMjQ5MSwxMjQ5MiwxMjQ5MywxMjQ5NCwxMjQ5NSwxMjQ5NiwxMjQ5NywxMjQ5OCwxMjQ5OSwxMjUwMCwxMjUwMSwxMjUwMiwxMjUwMywxMjUwNCwxMjUwNSwxMjUwNiwxMjUwNywxMjUwOCwxMjUwOSwxMjUxMCwxMjUxMSwxMjUxMiwxMjUxMywxMjUxNCwxMjUxNSwxMjUxNiwxMjUxNywxMjUxOCwxMjUxOSwxMjUyMCwxMjUyMSwxMjUyMiwxMjUyMywxMjUyNCwxMjUyNSwxMjUyNiwxMjUyNywxMjUyOCwxMjUyOSwxMjUzMCwxMjUzMSwxMjUzMiwxMjUzMywxMjUzNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDI1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMTA1LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDk0NzIsOTQ3NCw5NDg0LDk0ODgsOTQ5Niw5NDkyLDk1MDAsOTUxNiw5NTA4LDk1MjQsOTUzMiw5NDczLDk0NzUsOTQ4Nyw5NDkxLDk0OTksOTQ5NSw5NTA3LDk1MjMsOTUxNSw5NTMxLDk1NDcsOTUwNCw5NTE5LDk1MTIsOTUyNyw5NTM1LDk1MDEsOTUyMCw5NTA5LDk1MjgsOTUzOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw5MzEyLDkzMTMsOTMxNCw5MzE1LDkzMTYsOTMxNyw5MzE4LDkzMTksOTMyMCw5MzIxLDkzMjIsOTMyMyw5MzI0LDkzMjUsOTMyNiw5MzI3LDkzMjgsOTMyOSw5MzMwLDkzMzEsODU0NCw4NTQ1LDg1NDYsODU0Nyw4NTQ4LDg1NDksODU1MCw4NTUxLDg1NTIsODU1MyxudWxsLDEzMTI5LDEzMDc2LDEzMDkwLDEzMTMzLDEzMDgwLDEzMDk1LDEzMDU5LDEzMTEwLDEzMTM3LDEzMTQzLDEzMDY5LDEzMDk0LDEzMDkxLDEzMDk5LDEzMTMwLDEzMTE1LDEzMjEyLDEzMjEzLDEzMjE0LDEzMTk4LDEzMTk5LDEzMjUyLDEzMjE3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxMzE3OSwxMjMxNywxMjMxOSw4NDcwLDEzMjYxLDg0ODEsMTI5NjQsMTI5NjUsMTI5NjYsMTI5NjcsMTI5NjgsMTI4NDksMTI4NTAsMTI4NTcsMTMxODIsMTMxODEsMTMxODAsODc4Niw4ODAxLDg3NDcsODc1MCw4NzIxLDg3MzAsODg2OSw4NzM2LDg3MzUsODg5NSw4NzU3LDg3NDUsODc0NixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDIwMTI0LDIxNzgyLDIzMDQzLDM4NDYzLDIxNjk2LDI0ODU5LDI1Mzg0LDIzMDMwLDM2ODk4LDMzOTA5LDMzNTY0LDMxMzEyLDI0NzQ2LDI1NTY5LDI4MTk3LDI2MDkzLDMzODk0LDMzNDQ2LDM5OTI1LDI2NzcxLDIyMzExLDI2MDE3LDI1MjAxLDIzNDUxLDIyOTkyLDM0NDI3LDM5MTU2LDMyMDk4LDMyMTkwLDM5ODIyLDI1MTEwLDMxOTAzLDM0OTk5LDIzNDMzLDI0MjQ1LDI1MzUzLDI2MjYzLDI2Njk2LDM4MzQzLDM4Nzk3LDI2NDQ3LDIwMTk3LDIwMjM0LDIwMzAxLDIwMzgxLDIwNTUzLDIyMjU4LDIyODM5LDIyOTk2LDIzMDQxLDIzNTYxLDI0Nzk5LDI0ODQ3LDI0OTQ0LDI2MTMxLDI2ODg1LDI4ODU4LDMwMDMxLDMwMDY0LDMxMjI3LDMyMTczLDMyMjM5LDMyOTYzLDMzODA2LDM0OTE1LDM1NTg2LDM2OTQ5LDM2OTg2LDIxMzA3LDIwMTE3LDIwMTMzLDIyNDk1LDMyOTQ2LDM3MDU3LDMwOTU5LDE5OTY4LDIyNzY5LDI4MzIyLDM2OTIwLDMxMjgyLDMzNTc2LDMzNDE5LDM5OTgzLDIwODAxLDIxMzYwLDIxNjkzLDIxNzI5LDIyMjQwLDIzMDM1LDI0MzQxLDM5MTU0LDI4MTM5LDMyOTk2LDM0MDkzLDM4NDk4LDM4NTEyLDM4NTYwLDM4OTA3LDIxNTE1LDIxNDkxLDIzNDMxLDI4ODc5LDMyNzAxLDM2ODAyLDM4NjMyLDIxMzU5LDQwMjg0LDMxNDE4LDE5OTg1LDMwODY3LDMzMjc2LDI4MTk4LDIyMDQwLDIxNzY0LDI3NDIxLDM0MDc0LDM5OTk1LDIzMDEzLDIxNDE3LDI4MDA2LDI5OTE2LDM4Mjg3LDIyMDgyLDIwMTEzLDM2OTM5LDM4NjQyLDMzNjE1LDM5MTgwLDIxNDczLDIxOTQyLDIzMzQ0LDI0NDMzLDI2MTQ0LDI2MzU1LDI2NjI4LDI3NzA0LDI3ODkxLDI3OTQ1LDI5Nzg3LDMwNDA4LDMxMzEwLDM4OTY0LDMzNTIxLDM0OTA3LDM1NDI0LDM3NjEzLDI4MDgyLDMwMTIzLDMwNDEwLDM5MzY1LDI0NzQyLDM1NTg1LDM2MjM0LDM4MzIyLDI3MDIyLDIxNDIxLDIwODcwLDIyMjkwLDIyNTc2LDIyODUyLDIzNDc2LDI0MzEwLDI0NjE2LDI1NTEzLDI1NTg4LDI3ODM5LDI4NDM2LDI4ODE0LDI4OTQ4LDI5MDE3LDI5MTQxLDI5NTAzLDMyMjU3LDMzMzk4LDMzNDg5LDM0MTk5LDM2OTYwLDM3NDY3LDQwMjE5LDIyNjMzLDI2MDQ0LDI3NzM4LDI5OTg5LDIwOTg1LDIyODMwLDIyODg1LDI0NDQ4LDI0NTQwLDI1Mjc2LDI2MTA2LDI3MTc4LDI3NDMxLDI3NTcyLDI5NTc5LDMyNzA1LDM1MTU4LDQwMjM2LDQwMjA2LDQwNjQ0LDIzNzEzLDI3Nzk4LDMzNjU5LDIwNzQwLDIzNjI3LDI1MDE0LDMzMjIyLDI2NzQyLDI5MjgxLDIwMDU3LDIwNDc0LDIxMzY4LDI0NjgxLDI4MjAxLDMxMzExLDM4ODk5LDE5OTc5LDIxMjcwLDIwMjA2LDIwMzA5LDIwMjg1LDIwMzg1LDIwMzM5LDIxMTUyLDIxNDg3LDIyMDI1LDIyNzk5LDIzMjMzLDIzNDc4LDIzNTIxLDMxMTg1LDI2MjQ3LDI2NTI0LDI2NTUwLDI3NDY4LDI3ODI3LDI4Nzc5LDI5NjM0LDMxMTE3LDMxMTY2LDMxMjkyLDMxNjIzLDMzNDU3LDMzNDk5LDMzNTQwLDMzNjU1LDMzNzc1LDMzNzQ3LDM0NjYyLDM1NTA2LDIyMDU3LDM2MDA4LDM2ODM4LDM2OTQyLDM4Njg2LDM0NDQyLDIwNDIwLDIzNzg0LDI1MTA1LDI5MjczLDMwMDExLDMzMjUzLDMzNDY5LDM0NTU4LDM2MDMyLDM4NTk3LDM5MTg3LDM5MzgxLDIwMTcxLDIwMjUwLDM1Mjk5LDIyMjM4LDIyNjAyLDIyNzMwLDI0MzE1LDI0NTU1LDI0NjE4LDI0NzI0LDI0Njc0LDI1MDQwLDI1MTA2LDI1Mjk2LDI1OTEzLDM5NzQ1LDI2MjE0LDI2ODAwLDI4MDIzLDI4Nzg0LDMwMDI4LDMwMzQyLDMyMTE3LDMzNDQ1LDM0ODA5LDM4MjgzLDM4NTQyLDM1OTk3LDIwOTc3LDIxMTgyLDIyODA2LDIxNjgzLDIzNDc1LDIzODMwLDI0OTM2LDI3MDEwLDI4MDc5LDMwODYxLDMzOTk1LDM0OTAzLDM1NDQyLDM3Nzk5LDM5NjA4LDI4MDEyLDM5MzM2LDM0NTIxLDIyNDM1LDI2NjIzLDM0NTEwLDM3MzkwLDIxMTIzLDIyMTUxLDIxNTA4LDI0Mjc1LDI1MzEzLDI1Nzg1LDI2Njg0LDI2NjgwLDI3NTc5LDI5NTU0LDMwOTA2LDMxMzM5LDM1MjI2LDM1MjgyLDM2MjAzLDM2NjExLDM3MTAxLDM4MzA3LDM4NTQ4LDM4NzYxLDIzMzk4LDIzNzMxLDI3MDA1LDM4OTg5LDM4OTkwLDI1NDk5LDMxNTIwLDI3MTc5LDI3MjYzLDI2ODA2LDM5OTQ5LDI4NTExLDIxMTA2LDIxOTE3LDI0Njg4LDI1MzI0LDI3OTYzLDI4MTY3LDI4MzY5LDMzODgzLDM1MDg4LDM2Njc2LDE5OTg4LDM5OTkzLDIxNDk0LDI2OTA3LDI3MTk0LDM4Nzg4LDI2NjY2LDIwODI4LDMxNDI3LDMzOTcwLDM3MzQwLDM3NzcyLDIyMTA3LDQwMjMyLDI2NjU4LDMzNTQxLDMzODQxLDMxOTA5LDIxMDAwLDMzNDc3LDI5OTI2LDIwMDk0LDIwMzU1LDIwODk2LDIzNTA2LDIxMDAyLDIxMjA4LDIxMjIzLDI0MDU5LDIxOTE0LDIyNTcwLDIzMDE0LDIzNDM2LDIzNDQ4LDIzNTE1LDI0MTc4LDI0MTg1LDI0NzM5LDI0ODYzLDI0OTMxLDI1MDIyLDI1NTYzLDI1OTU0LDI2NTc3LDI2NzA3LDI2ODc0LDI3NDU0LDI3NDc1LDI3NzM1LDI4NDUwLDI4NTY3LDI4NDg1LDI5ODcyLDI5OTc2LDMwNDM1LDMwNDc1LDMxNDg3LDMxNjQ5LDMxNzc3LDMyMjMzLDMyNTY2LDMyNzUyLDMyOTI1LDMzMzgyLDMzNjk0LDM1MjUxLDM1NTMyLDM2MDExLDM2OTk2LDM3OTY5LDM4MjkxLDM4Mjg5LDM4MzA2LDM4NTAxLDM4ODY3LDM5MjA4LDMzMzA0LDIwMDI0LDIxNTQ3LDIzNzM2LDI0MDEyLDI5NjA5LDMwMjg0LDMwNTI0LDIzNzIxLDMyNzQ3LDM2MTA3LDM4NTkzLDM4OTI5LDM4OTk2LDM5MDAwLDIwMjI1LDIwMjM4LDIxMzYxLDIxOTE2LDIyMTIwLDIyNTIyLDIyODU1LDIzMzA1LDIzNDkyLDIzNjk2LDI0MDc2LDI0MTkwLDI0NTI0LDI1NTgyLDI2NDI2LDI2MDcxLDI2MDgyLDI2Mzk5LDI2ODI3LDI2ODIwLDI3MjMxLDI0MTEyLDI3NTg5LDI3NjcxLDI3NzczLDMwMDc5LDMxMDQ4LDIzMzk1LDMxMjMyLDMyMDAwLDI0NTA5LDM1MjE1LDM1MzUyLDM2MDIwLDM2MjE1LDM2NTU2LDM2NjM3LDM5MTM4LDM5NDM4LDM5NzQwLDIwMDk2LDIwNjA1LDIwNzM2LDIyOTMxLDIzNDUyLDI1MTM1LDI1MjE2LDI1ODM2LDI3NDUwLDI5MzQ0LDMwMDk3LDMxMDQ3LDMyNjgxLDM0ODExLDM1NTE2LDM1Njk2LDI1NTE2LDMzNzM4LDM4ODE2LDIxNTEzLDIxNTA3LDIxOTMxLDI2NzA4LDI3MjI0LDM1NDQwLDMwNzU5LDI2NDg1LDQwNjUzLDIxMzY0LDIzNDU4LDMzMDUwLDM0Mzg0LDM2ODcwLDE5OTkyLDIwMDM3LDIwMTY3LDIwMjQxLDIxNDUwLDIxNTYwLDIzNDcwLDI0MzM5LDI0NjEzLDI1OTM3LDI2NDI5LDI3NzE0LDI3NzYyLDI3ODc1LDI4NzkyLDI5Njk5LDMxMzUwLDMxNDA2LDMxNDk2LDMyMDI2LDMxOTk4LDMyMTAyLDI2MDg3LDI5Mjc1LDIxNDM1LDIzNjIxLDI0MDQwLDI1Mjk4LDI1MzEyLDI1MzY5LDI4MTkyLDM0Mzk0LDM1Mzc3LDM2MzE3LDM3NjI0LDI4NDE3LDMxMTQyLDM5NzcwLDIwMTM2LDIwMTM5LDIwMTQwLDIwMzc5LDIwMzg0LDIwNjg5LDIwODA3LDMxNDc4LDIwODQ5LDIwOTgyLDIxMzMyLDIxMjgxLDIxMzc1LDIxNDgzLDIxOTMyLDIyNjU5LDIzNzc3LDI0Mzc1LDI0Mzk0LDI0NjIzLDI0NjU2LDI0Njg1LDI1Mzc1LDI1OTQ1LDI3MjExLDI3ODQxLDI5Mzc4LDI5NDIxLDMwNzAzLDMzMDE2LDMzMDI5LDMzMjg4LDM0MTI2LDM3MTExLDM3ODU3LDM4OTExLDM5MjU1LDM5NTE0LDIwMjA4LDIwOTU3LDIzNTk3LDI2MjQxLDI2OTg5LDIzNjE2LDI2MzU0LDI2OTk3LDI5NTc3LDI2NzA0LDMxODczLDIwNjc3LDIxMjIwLDIyMzQzLDI0MDYyLDM3NjcwLDI2MDIwLDI3NDI3LDI3NDUzLDI5NzQ4LDMxMTA1LDMxMTY1LDMxNTYzLDMyMjAyLDMzNDY1LDMzNzQwLDM0OTQzLDM1MTY3LDM1NjQxLDM2ODE3LDM3MzI5LDIxNTM1LDM3NTA0LDIwMDYxLDIwNTM0LDIxNDc3LDIxMzA2LDI5Mzk5LDI5NTkwLDMwNjk3LDMzNTEwLDM2NTI3LDM5MzY2LDM5MzY4LDM5Mzc4LDIwODU1LDI0ODU4LDM0Mzk4LDIxOTM2LDMxMzU0LDIwNTk4LDIzNTA3LDM2OTM1LDM4NTMzLDIwMDE4LDI3MzU1LDM3MzUxLDIzNjMzLDIzNjI0LDI1NDk2LDMxMzkxLDI3Nzk1LDM4NzcyLDM2NzA1LDMxNDAyLDI5MDY2LDM4NTM2LDMxODc0LDI2NjQ3LDMyMzY4LDI2NzA1LDM3NzQwLDIxMjM0LDIxNTMxLDM0MjE5LDM1MzQ3LDMyNjc2LDM2NTU3LDM3MDg5LDIxMzUwLDM0OTUyLDMxMDQxLDIwNDE4LDIwNjcwLDIxMDA5LDIwODA0LDIxODQzLDIyMzE3LDI5Njc0LDIyNDExLDIyODY1LDI0NDE4LDI0NDUyLDI0NjkzLDI0OTUwLDI0OTM1LDI1MDAxLDI1NTIyLDI1NjU4LDI1OTY0LDI2MjIzLDI2NjkwLDI4MTc5LDMwMDU0LDMxMjkzLDMxOTk1LDMyMDc2LDMyMTUzLDMyMzMxLDMyNjE5LDMzNTUwLDMzNjEwLDM0NTA5LDM1MzM2LDM1NDI3LDM1Njg2LDM2NjA1LDM4OTM4LDQwMzM1LDMzNDY0LDM2ODE0LDM5OTEyLDIxMTI3LDI1MTE5LDI1NzMxLDI4NjA4LDM4NTUzLDI2Njg5LDIwNjI1LDI3NDI0LDI3NzcwLDI4NTAwLDMxMzQ4LDMyMDgwLDM0ODgwLDM1MzYzLDI2Mzc2LDIwMjE0LDIwNTM3LDIwNTE4LDIwNTgxLDIwODYwLDIxMDQ4LDIxMDkxLDIxOTI3LDIyMjg3LDIyNTMzLDIzMjQ0LDI0MzE0LDI1MDEwLDI1MDgwLDI1MzMxLDI1NDU4LDI2OTA4LDI3MTc3LDI5MzA5LDI5MzU2LDI5NDg2LDMwNzQwLDMwODMxLDMyMTIxLDMwNDc2LDMyOTM3LDM1MjExLDM1NjA5LDM2MDY2LDM2NTYyLDM2OTYzLDM3NzQ5LDM4NTIyLDM4OTk3LDM5NDQzLDQwNTY4LDIwODAzLDIxNDA3LDIxNDI3LDI0MTg3LDI0MzU4LDI4MTg3LDI4MzA0LDI5NTcyLDI5Njk0LDMyMDY3LDMzMzM1LDM1MzI4LDM1NTc4LDM4NDgwLDIwMDQ2LDIwNDkxLDIxNDc2LDIxNjI4LDIyMjY2LDIyOTkzLDIzMzk2LDI0MDQ5LDI0MjM1LDI0MzU5LDI1MTQ0LDI1OTI1LDI2NTQzLDI4MjQ2LDI5MzkyLDMxOTQ2LDM0OTk2LDMyOTI5LDMyOTkzLDMzNzc2LDM0MzgyLDM1NDYzLDM2MzI4LDM3NDMxLDM4NTk5LDM5MDE1LDQwNzIzLDIwMTE2LDIwMTE0LDIwMjM3LDIxMzIwLDIxNTc3LDIxNTY2LDIzMDg3LDI0NDYwLDI0NDgxLDI0NzM1LDI2NzkxLDI3Mjc4LDI5Nzg2LDMwODQ5LDM1NDg2LDM1NDkyLDM1NzAzLDM3MjY0LDIwMDYyLDM5ODgxLDIwMTMyLDIwMzQ4LDIwMzk5LDIwNTA1LDIwNTAyLDIwODA5LDIwODQ0LDIxMTUxLDIxMTc3LDIxMjQ2LDIxNDAyLDIxNDc1LDIxNTIxLDIxNTE4LDIxODk3LDIyMzUzLDIyNDM0LDIyOTA5LDIzMzgwLDIzMzg5LDIzNDM5LDI0MDM3LDI0MDM5LDI0MDU1LDI0MTg0LDI0MTk1LDI0MjE4LDI0MjQ3LDI0MzQ0LDI0NjU4LDI0OTA4LDI1MjM5LDI1MzA0LDI1NTExLDI1OTE1LDI2MTE0LDI2MTc5LDI2MzU2LDI2NDc3LDI2NjU3LDI2Nzc1LDI3MDgzLDI3NzQzLDI3OTQ2LDI4MDA5LDI4MjA3LDI4MzE3LDMwMDAyLDMwMzQzLDMwODI4LDMxMjk1LDMxOTY4LDMyMDA1LDMyMDI0LDMyMDk0LDMyMTc3LDMyNzg5LDMyNzcxLDMyOTQzLDMyOTQ1LDMzMTA4LDMzMTY3LDMzMzIyLDMzNjE4LDM0ODkyLDM0OTEzLDM1NjExLDM2MDAyLDM2MDkyLDM3MDY2LDM3MjM3LDM3NDg5LDMwNzgzLDM3NjI4LDM4MzA4LDM4NDc3LDM4OTE3LDM5MzIxLDM5NjQwLDQwMjUxLDIxMDgzLDIxMTYzLDIxNDk1LDIxNTEyLDIyNzQxLDI1MzM1LDI4NjQwLDM1OTQ2LDM2NzAzLDQwNjMzLDIwODExLDIxMDUxLDIxNTc4LDIyMjY5LDMxMjk2LDM3MjM5LDQwMjg4LDQwNjU4LDI5NTA4LDI4NDI1LDMzMTM2LDI5OTY5LDI0NTczLDI0Nzk0LDM5NTkyLDI5NDAzLDM2Nzk2LDI3NDkyLDM4OTE1LDIwMTcwLDIyMjU2LDIyMzcyLDIyNzE4LDIzMTMwLDI0NjgwLDI1MDMxLDI2MTI3LDI2MTE4LDI2NjgxLDI2ODAxLDI4MTUxLDMwMTY1LDMyMDU4LDMzMzkwLDM5NzQ2LDIwMTIzLDIwMzA0LDIxNDQ5LDIxNzY2LDIzOTE5LDI0MDM4LDI0MDQ2LDI2NjE5LDI3ODAxLDI5ODExLDMwNzIyLDM1NDA4LDM3NzgyLDM1MDM5LDIyMzUyLDI0MjMxLDI1Mzg3LDIwNjYxLDIwNjUyLDIwODc3LDI2MzY4LDIxNzA1LDIyNjIyLDIyOTcxLDIzNDcyLDI0NDI1LDI1MTY1LDI1NTA1LDI2Njg1LDI3NTA3LDI4MTY4LDI4Nzk3LDM3MzE5LDI5MzEyLDMwNzQxLDMwNzU4LDMxMDg1LDI1OTk4LDMyMDQ4LDMzNzU2LDM1MDA5LDM2NjE3LDM4NTU1LDIxMDkyLDIyMzEyLDI2NDQ4LDMyNjE4LDM2MDAxLDIwOTE2LDIyMzM4LDM4NDQyLDIyNTg2LDI3MDE4LDMyOTQ4LDIxNjgyLDIzODIyLDIyNTI0LDMwODY5LDQwNDQyLDIwMzE2LDIxMDY2LDIxNjQzLDI1NjYyLDI2MTUyLDI2Mzg4LDI2NjEzLDMxMzY0LDMxNTc0LDMyMDM0LDM3Njc5LDI2NzE2LDM5ODUzLDMxNTQ1LDIxMjczLDIwODc0LDIxMDQ3LDIzNTE5LDI1MzM0LDI1Nzc0LDI1ODMwLDI2NDEzLDI3NTc4LDM0MjE3LDM4NjA5LDMwMzUyLDM5ODk0LDI1NDIwLDM3NjM4LDM5ODUxLDMwMzk5LDI2MTk0LDE5OTc3LDIwNjMyLDIxNDQyLDIzNjY1LDI0ODA4LDI1NzQ2LDI1OTU1LDI2NzE5LDI5MTU4LDI5NjQyLDI5OTg3LDMxNjM5LDMyMzg2LDM0NDUzLDM1NzE1LDM2MDU5LDM3MjQwLDM5MTg0LDI2MDI4LDI2MjgzLDI3NTMxLDIwMTgxLDIwMTgwLDIwMjgyLDIwMzUxLDIxMDUwLDIxNDk2LDIxNDkwLDIxOTg3LDIyMjM1LDIyNzYzLDIyOTg3LDIyOTg1LDIzMDM5LDIzMzc2LDIzNjI5LDI0MDY2LDI0MTA3LDI0NTM1LDI0NjA1LDI1MzUxLDI1OTAzLDIzMzg4LDI2MDMxLDI2MDQ1LDI2MDg4LDI2NTI1LDI3NDkwLDI3NTE1LDI3NjYzLDI5NTA5LDMxMDQ5LDMxMTY5LDMxOTkyLDMyMDI1LDMyMDQzLDMyOTMwLDMzMDI2LDMzMjY3LDM1MjIyLDM1NDIyLDM1NDMzLDM1NDMwLDM1NDY4LDM1NTY2LDM2MDM5LDM2MDYwLDM4NjA0LDM5MTY0LDI3NTAzLDIwMTA3LDIwMjg0LDIwMzY1LDIwODE2LDIzMzgzLDIzNTQ2LDI0OTA0LDI1MzQ1LDI2MTc4LDI3NDI1LDI4MzYzLDI3ODM1LDI5MjQ2LDI5ODg1LDMwMTY0LDMwOTEzLDMxMDM0LDMyNzgwLDMyODE5LDMzMjU4LDMzOTQwLDM2NzY2LDI3NzI4LDQwNTc1LDI0MzM1LDM1NjcyLDQwMjM1LDMxNDgyLDM2NjAwLDIzNDM3LDM4NjM1LDE5OTcxLDIxNDg5LDIyNTE5LDIyODMzLDIzMjQxLDIzNDYwLDI0NzEzLDI4Mjg3LDI4NDIyLDMwMTQyLDM2MDc0LDIzNDU1LDM0MDQ4LDMxNzEyLDIwNTk0LDI2NjEyLDMzNDM3LDIzNjQ5LDM0MTIyLDMyMjg2LDMzMjk0LDIwODg5LDIzNTU2LDI1NDQ4LDM2MTk4LDI2MDEyLDI5MDM4LDMxMDM4LDMyMDIzLDMyNzczLDM1NjEzLDM2NTU0LDM2OTc0LDM0NTAzLDM3MDM0LDIwNTExLDIxMjQyLDIzNjEwLDI2NDUxLDI4Nzk2LDI5MjM3LDM3MTk2LDM3MzIwLDM3Njc1LDMzNTA5LDIzNDkwLDI0MzY5LDI0ODI1LDIwMDI3LDIxNDYyLDIzNDMyLDI1MTYzLDI2NDE3LDI3NTMwLDI5NDE3LDI5NjY0LDMxMjc4LDMzMTMxLDM2MjU5LDM3MjAyLDM5MzE4LDIwNzU0LDIxNDYzLDIxNjEwLDIzNTUxLDI1NDgwLDI3MTkzLDMyMTcyLDM4NjU2LDIyMjM0LDIxNDU0LDIxNjA4LDIzNDQ3LDIzNjAxLDI0MDMwLDIwNDYyLDI0ODMzLDI1MzQyLDI3OTU0LDMxMTY4LDMxMTc5LDMyMDY2LDMyMzMzLDMyNzIyLDMzMjYxLDMzMzExLDMzOTM2LDM0ODg2LDM1MTg2LDM1NzI4LDM2NDY4LDM2NjU1LDM2OTEzLDM3MTk1LDM3MjI4LDM4NTk4LDM3Mjc2LDIwMTYwLDIwMzAzLDIwODA1LDIxMzEzLDI0NDY3LDI1MTAyLDI2NTgwLDI3NzEzLDI4MTcxLDI5NTM5LDMyMjk0LDM3MzI1LDM3NTA3LDIxNDYwLDIyODA5LDIzNDg3LDI4MTEzLDMxMDY5LDMyMzAyLDMxODk5LDIyNjU0LDI5MDg3LDIwOTg2LDM0ODk5LDM2ODQ4LDIwNDI2LDIzODAzLDI2MTQ5LDMwNjM2LDMxNDU5LDMzMzA4LDM5NDIzLDIwOTM0LDI0NDkwLDI2MDkyLDI2OTkxLDI3NTI5LDI4MTQ3LDI4MzEwLDI4NTE2LDMwNDYyLDMyMDIwLDI0MDMzLDM2OTgxLDM3MjU1LDM4OTE4LDIwOTY2LDIxMDIxLDI1MTUyLDI2MjU3LDI2MzI5LDI4MTg2LDI0MjQ2LDMyMjEwLDMyNjI2LDI2MzYwLDM0MjIzLDM0Mjk1LDM1NTc2LDIxMTYxLDIxNDY1LDIyODk5LDI0MjA3LDI0NDY0LDI0NjYxLDM3NjA0LDM4NTAwLDIwNjYzLDIwNzY3LDIxMjEzLDIxMjgwLDIxMzE5LDIxNDg0LDIxNzM2LDIxODMwLDIxODA5LDIyMDM5LDIyODg4LDIyOTc0LDIzMTAwLDIzNDc3LDIzNTU4LDIzNTY3LDIzNTY5LDIzNTc4LDI0MTk2LDI0MjAyLDI0Mjg4LDI0NDMyLDI1MjE1LDI1MjIwLDI1MzA3LDI1NDg0LDI1NDYzLDI2MTE5LDI2MTI0LDI2MTU3LDI2MjMwLDI2NDk0LDI2Nzg2LDI3MTY3LDI3MTg5LDI3ODM2LDI4MDQwLDI4MTY5LDI4MjQ4LDI4OTg4LDI4OTY2LDI5MDMxLDMwMTUxLDMwNDY1LDMwODEzLDMwOTc3LDMxMDc3LDMxMjE2LDMxNDU2LDMxNTA1LDMxOTExLDMyMDU3LDMyOTE4LDMzNzUwLDMzOTMxLDM0MTIxLDM0OTA5LDM1MDU5LDM1MzU5LDM1Mzg4LDM1NDEyLDM1NDQzLDM1OTM3LDM2MDYyLDM3Mjg0LDM3NDc4LDM3NzU4LDM3OTEyLDM4NTU2LDM4ODA4LDE5OTc4LDE5OTc2LDE5OTk4LDIwMDU1LDIwODg3LDIxMTA0LDIyNDc4LDIyNTgwLDIyNzMyLDIzMzMwLDI0MTIwLDI0NzczLDI1ODU0LDI2NDY1LDI2NDU0LDI3OTcyLDI5MzY2LDMwMDY3LDMxMzMxLDMzOTc2LDM1Njk4LDM3MzA0LDM3NjY0LDIyMDY1LDIyNTE2LDM5MTY2LDI1MzI1LDI2ODkzLDI3NTQyLDI5MTY1LDMyMzQwLDMyODg3LDMzMzk0LDM1MzAyLDM5MTM1LDM0NjQ1LDM2Nzg1LDIzNjExLDIwMjgwLDIwNDQ5LDIwNDA1LDIxNzY3LDIzMDcyLDIzNTE3LDIzNTI5LDI0NTE1LDI0OTEwLDI1MzkxLDI2MDMyLDI2MTg3LDI2ODYyLDI3MDM1LDI4MDI0LDI4MTQ1LDMwMDAzLDMwMTM3LDMwNDk1LDMxMDcwLDMxMjA2LDMyMDUxLDMzMjUxLDMzNDU1LDM0MjE4LDM1MjQyLDM1Mzg2LDM2NTIzLDM2NzYzLDM2OTE0LDM3MzQxLDM4NjYzLDIwMTU0LDIwMTYxLDIwOTk1LDIyNjQ1LDIyNzY0LDIzNTYzLDI5OTc4LDIzNjEzLDMzMTAyLDM1MzM4LDM2ODA1LDM4NDk5LDM4NzY1LDMxNTI1LDM1NTM1LDM4OTIwLDM3MjE4LDIyMjU5LDIxNDE2LDM2ODg3LDIxNTYxLDIyNDAyLDI0MTAxLDI1NTEyLDI3NzAwLDI4ODEwLDMwNTYxLDMxODgzLDMyNzM2LDM0OTI4LDM2OTMwLDM3MjA0LDM3NjQ4LDM3NjU2LDM4NTQzLDI5NzkwLDM5NjIwLDIzODE1LDIzOTEzLDI1OTY4LDI2NTMwLDM2MjY0LDM4NjE5LDI1NDU0LDI2NDQxLDI2OTA1LDMzNzMzLDM4OTM1LDM4NTkyLDM1MDcwLDI4NTQ4LDI1NzIyLDIzNTQ0LDE5OTkwLDI4NzE2LDMwMDQ1LDI2MTU5LDIwOTMyLDIxMDQ2LDIxMjE4LDIyOTk1LDI0NDQ5LDI0NjE1LDI1MTA0LDI1OTE5LDI1OTcyLDI2MTQzLDI2MjI4LDI2ODY2LDI2NjQ2LDI3NDkxLDI4MTY1LDI5Mjk4LDI5OTgzLDMwNDI3LDMxOTM0LDMyODU0LDIyNzY4LDM1MDY5LDM1MTk5LDM1NDg4LDM1NDc1LDM1NTMxLDM2ODkzLDM3MjY2LDM4NzM4LDM4NzQ1LDI1OTkzLDMxMjQ2LDMzMDMwLDM4NTg3LDI0MTA5LDI0Nzk2LDI1MTE0LDI2MDIxLDI2MTMyLDI2NTEyLDMwNzA3LDMxMzA5LDMxODIxLDMyMzE4LDMzMDM0LDM2MDEyLDM2MTk2LDM2MzIxLDM2NDQ3LDMwODg5LDIwOTk5LDI1MzA1LDI1NTA5LDI1NjY2LDI1MjQwLDM1MzczLDMxMzYzLDMxNjgwLDM1NTAwLDM4NjM0LDMyMTE4LDMzMjkyLDM0NjMzLDIwMTg1LDIwODA4LDIxMzE1LDIxMzQ0LDIzNDU5LDIzNTU0LDIzNTc0LDI0MDI5LDI1MTI2LDI1MTU5LDI1Nzc2LDI2NjQzLDI2Njc2LDI3ODQ5LDI3OTczLDI3OTI3LDI2NTc5LDI4NTA4LDI5MDA2LDI5MDUzLDI2MDU5LDMxMzU5LDMxNjYxLDMyMjE4LDMyMzMwLDMyNjgwLDMzMTQ2LDMzMzA3LDMzMzM3LDM0MjE0LDM1NDM4LDM2MDQ2LDM2MzQxLDM2OTg0LDM2OTgzLDM3NTQ5LDM3NTIxLDM4Mjc1LDM5ODU0LDIxMDY5LDIxODkyLDI4NDcyLDI4OTgyLDIwODQwLDMxMTA5LDMyMzQxLDMzMjAzLDMxOTUwLDIyMDkyLDIyNjA5LDIzNzIwLDI1NTE0LDI2MzY2LDI2MzY1LDI2OTcwLDI5NDAxLDMwMDk1LDMwMDk0LDMwOTkwLDMxMDYyLDMxMTk5LDMxODk1LDMyMDMyLDMyMDY4LDM0MzExLDM1MzgwLDM4NDU5LDM2OTYxLDQwNzM2LDIwNzExLDIxMTA5LDIxNDUyLDIxNDc0LDIwNDg5LDIxOTMwLDIyNzY2LDIyODYzLDI5MjQ1LDIzNDM1LDIzNjUyLDIxMjc3LDI0ODAzLDI0ODE5LDI1NDM2LDI1NDc1LDI1NDA3LDI1NTMxLDI1ODA1LDI2MDg5LDI2MzYxLDI0MDM1LDI3MDg1LDI3MTMzLDI4NDM3LDI5MTU3LDIwMTA1LDMwMTg1LDMwNDU2LDMxMzc5LDMxOTY3LDMyMjA3LDMyMTU2LDMyODY1LDMzNjA5LDMzNjI0LDMzOTAwLDMzOTgwLDM0Mjk5LDM1MDEzLDM2MjA4LDM2ODY1LDM2OTczLDM3NzgzLDM4Njg0LDM5NDQyLDIwNjg3LDIyNjc5LDI0OTc0LDMzMjM1LDM0MTAxLDM2MTA0LDM2ODk2LDIwNDE5LDIwNTk2LDIxMDYzLDIxMzYzLDI0Njg3LDI1NDE3LDI2NDYzLDI4MjA0LDM2Mjc1LDM2ODk1LDIwNDM5LDIzNjQ2LDM2MDQyLDI2MDYzLDMyMTU0LDIxMzMwLDM0OTY2LDIwODU0LDI1NTM5LDIzMzg0LDIzNDAzLDIzNTYyLDI1NjEzLDI2NDQ5LDM2OTU2LDIwMTgyLDIyODEwLDIyODI2LDI3NzYwLDM1NDA5LDIxODIyLDIyNTQ5LDIyOTQ5LDI0ODE2LDI1MTcxLDI2NTYxLDMzMzMzLDI2OTY1LDM4NDY0LDM5MzY0LDM5NDY0LDIwMzA3LDIyNTM0LDIzNTUwLDMyNzg0LDIzNzI5LDI0MTExLDI0NDUzLDI0NjA4LDI0OTA3LDI1MTQwLDI2MzY3LDI3ODg4LDI4MzgyLDMyOTc0LDMzMTUxLDMzNDkyLDM0OTU1LDM2MDI0LDM2ODY0LDM2OTEwLDM4NTM4LDQwNjY3LDM5ODk5LDIwMTk1LDIxNDg4LDIyODIzLDMxNTMyLDM3MjYxLDM4OTg4LDQwNDQxLDI4MzgxLDI4NzExLDIxMzMxLDIxODI4LDIzNDI5LDI1MTc2LDI1MjQ2LDI1Mjk5LDI3ODEwLDI4NjU1LDI5NzMwLDM1MzUxLDM3OTQ0LDI4NjA5LDM1NTgyLDMzNTkyLDIwOTY3LDM0NTUyLDIxNDgyLDIxNDgxLDIwMjk0LDM2OTQ4LDM2Nzg0LDIyODkwLDMzMDczLDI0MDYxLDMxNDY2LDM2Nzk5LDI2ODQyLDM1ODk1LDI5NDMyLDQwMDA4LDI3MTk3LDM1NTA0LDIwMDI1LDIxMzM2LDIyMDIyLDIyMzc0LDI1Mjg1LDI1NTA2LDI2MDg2LDI3NDcwLDI4MTI5LDI4MjUxLDI4ODQ1LDMwNzAxLDMxNDcxLDMxNjU4LDMyMTg3LDMyODI5LDMyOTY2LDM0NTA3LDM1NDc3LDM3NzIzLDIyMjQzLDIyNzI3LDI0MzgyLDI2MDI5LDI2MjYyLDI3MjY0LDI3NTczLDMwMDA3LDM1NTI3LDIwNTE2LDMwNjkzLDIyMzIwLDI0MzQ3LDI0Njc3LDI2MjM0LDI3NzQ0LDMwMTk2LDMxMjU4LDMyNjIyLDMzMjY4LDM0NTg0LDM2OTMzLDM5MzQ3LDMxNjg5LDMwMDQ0LDMxNDgxLDMxNTY5LDMzOTg4LDM2ODgwLDMxMjA5LDMxMzc4LDMzNTkwLDIzMjY1LDMwNTI4LDIwMDEzLDIwMjEwLDIzNDQ5LDI0NTQ0LDI1Mjc3LDI2MTcyLDI2NjA5LDI3ODgwLDM0NDExLDM0OTM1LDM1Mzg3LDM3MTk4LDM3NjE5LDM5Mzc2LDI3MTU5LDI4NzEwLDI5NDgyLDMzNTExLDMzODc5LDM2MDE1LDE5OTY5LDIwODA2LDIwOTM5LDIxODk5LDIzNTQxLDI0MDg2LDI0MTE1LDI0MTkzLDI0MzQwLDI0MzczLDI0NDI3LDI0NTAwLDI1MDc0LDI1MzYxLDI2Mjc0LDI2Mzk3LDI4NTI2LDI5MjY2LDMwMDEwLDMwNTIyLDMyODg0LDMzMDgxLDMzMTQ0LDM0Njc4LDM1NTE5LDM1NTQ4LDM2MjI5LDM2MzM5LDM3NTMwLDM4MjYzLDM4OTE0LDQwMTY1LDIxMTg5LDI1NDMxLDMwNDUyLDI2Mzg5LDI3Nzg0LDI5NjQ1LDM2MDM1LDM3ODA2LDM4NTE1LDI3OTQxLDIyNjg0LDI2ODk0LDI3MDg0LDM2ODYxLDM3Nzg2LDMwMTcxLDM2ODkwLDIyNjE4LDI2NjI2LDI1NTI0LDI3MTMxLDIwMjkxLDI4NDYwLDI2NTg0LDM2Nzk1LDM0MDg2LDMyMTgwLDM3NzE2LDI2OTQzLDI4NTI4LDIyMzc4LDIyNzc1LDIzMzQwLDMyMDQ0LDI5MjI2LDIxNTE0LDM3MzQ3LDQwMzcyLDIwMTQxLDIwMzAyLDIwNTcyLDIwNTk3LDIxMDU5LDM1OTk4LDIxNTc2LDIyNTY0LDIzNDUwLDI0MDkzLDI0MjEzLDI0MjM3LDI0MzExLDI0MzUxLDI0NzE2LDI1MjY5LDI1NDAyLDI1NTUyLDI2Nzk5LDI3NzEyLDMwODU1LDMxMTE4LDMxMjQzLDMyMjI0LDMzMzUxLDM1MzMwLDM1NTU4LDM2NDIwLDM2ODgzLDM3MDQ4LDM3MTY1LDM3MzM2LDQwNzE4LDI3ODc3LDI1Njg4LDI1ODI2LDI1OTczLDI4NDA0LDMwMzQwLDMxNTE1LDM2OTY5LDM3ODQxLDI4MzQ2LDIxNzQ2LDI0NTA1LDI1NzY0LDM2Njg1LDM2ODQ1LDM3NDQ0LDIwODU2LDIyNjM1LDIyODI1LDIzNjM3LDI0MjE1LDI4MTU1LDMyMzk5LDI5OTgwLDM2MDI4LDM2NTc4LDM5MDAzLDI4ODU3LDIwMjUzLDI3NTgzLDI4NTkzLDMwMDAwLDM4NjUxLDIwODE0LDIxNTIwLDIyNTgxLDIyNjE1LDIyOTU2LDIzNjQ4LDI0NDY2LDI2MDA3LDI2NDYwLDI4MTkzLDMwMzMxLDMzNzU5LDM2MDc3LDM2ODg0LDM3MTE3LDM3NzA5LDMwNzU3LDMwNzc4LDIxMTYyLDI0MjMwLDIyMzAzLDIyOTAwLDI0NTk0LDIwNDk4LDIwODI2LDIwOTA4LDIwOTQxLDIwOTkyLDIxNzc2LDIyNjEyLDIyNjE2LDIyODcxLDIzNDQ1LDIzNzk4LDIzOTQ3LDI0NzY0LDI1MjM3LDI1NjQ1LDI2NDgxLDI2NjkxLDI2ODEyLDI2ODQ3LDMwNDIzLDI4MTIwLDI4MjcxLDI4MDU5LDI4NzgzLDI5MTI4LDI0NDAzLDMwMTY4LDMxMDk1LDMxNTYxLDMxNTcyLDMxNTcwLDMxOTU4LDMyMTEzLDIxMDQwLDMzODkxLDM0MTUzLDM0Mjc2LDM1MzQyLDM1NTg4LDM1OTEwLDM2MzY3LDM2ODY3LDM2ODc5LDM3OTEzLDM4NTE4LDM4OTU3LDM5NDcyLDM4MzYwLDIwNjg1LDIxMjA1LDIxNTE2LDIyNTMwLDIzNTY2LDI0OTk5LDI1NzU4LDI3OTM0LDMwNjQzLDMxNDYxLDMzMDEyLDMzNzk2LDM2OTQ3LDM3NTA5LDIzNzc2LDQwMTk5LDIxMzExLDI0NDcxLDI0NDk5LDI4MDYwLDI5MzA1LDMwNTYzLDMxMTY3LDMxNzE2LDI3NjAyLDI5NDIwLDM1NTAxLDI2NjI3LDI3MjMzLDIwOTg0LDMxMzYxLDI2OTMyLDIzNjI2LDQwMTgyLDMzNTE1LDIzNDkzLDM3MTkzLDI4NzAyLDIyMTM2LDIzNjYzLDI0Nzc1LDI1OTU4LDI3Nzg4LDM1OTMwLDM2OTI5LDM4OTMxLDIxNTg1LDI2MzExLDM3Mzg5LDIyODU2LDM3MDI3LDIwODY5LDIwMDQ1LDIwOTcwLDM0MjAxLDM1NTk4LDI4NzYwLDI1NDY2LDM3NzA3LDI2OTc4LDM5MzQ4LDMyMjYwLDMwMDcxLDIxMzM1LDI2OTc2LDM2NTc1LDM4NjI3LDI3NzQxLDIwMTA4LDIzNjEyLDI0MzM2LDM2ODQxLDIxMjUwLDM2MDQ5LDMyOTA1LDM0NDI1LDI0MzE5LDI2MDg1LDIwMDgzLDIwODM3LDIyOTE0LDIzNjE1LDM4ODk0LDIwMjE5LDIyOTIyLDI0NTI1LDM1NDY5LDI4NjQxLDMxMTUyLDMxMDc0LDIzNTI3LDMzOTA1LDI5NDgzLDI5MTA1LDI0MTgwLDI0NTY1LDI1NDY3LDI1NzU0LDI5MTIzLDMxODk2LDIwMDM1LDI0MzE2LDIwMDQzLDIyNDkyLDIyMTc4LDI0NzQ1LDI4NjExLDMyMDEzLDMzMDIxLDMzMDc1LDMzMjE1LDM2Nzg2LDM1MjIzLDM0NDY4LDI0MDUyLDI1MjI2LDI1NzczLDM1MjA3LDI2NDg3LDI3ODc0LDI3OTY2LDI5NzUwLDMwNzcyLDIzMTEwLDMyNjI5LDMzNDUzLDM5MzQwLDIwNDY3LDI0MjU5LDI1MzA5LDI1NDkwLDI1OTQzLDI2NDc5LDMwNDAzLDI5MjYwLDMyOTcyLDMyOTU0LDM2NjQ5LDM3MTk3LDIwNDkzLDIyNTIxLDIzMTg2LDI2NzU3LDI2OTk1LDI5MDI4LDI5NDM3LDM2MDIzLDIyNzcwLDM2MDY0LDM4NTA2LDM2ODg5LDM0Njg3LDMxMjA0LDMwNjk1LDMzODMzLDIwMjcxLDIxMDkzLDIxMzM4LDI1MjkzLDI2NTc1LDI3ODUwLDMwMzMzLDMxNjM2LDMxODkzLDMzMzM0LDM0MTgwLDM2ODQzLDI2MzMzLDI4NDQ4LDI5MTkwLDMyMjgzLDMzNzA3LDM5MzYxLDQwNjE0LDIwOTg5LDMxNjY1LDMwODM0LDMxNjcyLDMyOTAzLDMxNTYwLDI3MzY4LDI0MTYxLDMyOTA4LDMwMDMzLDMwMDQ4LDIwODQzLDM3NDc0LDI4MzAwLDMwMzMwLDM3MjcxLDM5NjU4LDIwMjQwLDMyNjI0LDI1MjQ0LDMxNTY3LDM4MzA5LDQwMTY5LDIyMTM4LDIyNjE3LDM0NTMyLDM4NTg4LDIwMjc2LDIxMDI4LDIxMzIyLDIxNDUzLDIxNDY3LDI0MDcwLDI1NjQ0LDI2MDAxLDI2NDk1LDI3NzEwLDI3NzI2LDI5MjU2LDI5MzU5LDI5Njc3LDMwMDM2LDMyMzIxLDMzMzI0LDM0MjgxLDM2MDA5LDMxNjg0LDM3MzE4LDI5MDMzLDM4OTMwLDM5MTUxLDI1NDA1LDI2MjE3LDMwMDU4LDMwNDM2LDMwOTI4LDM0MTE1LDM0NTQyLDIxMjkwLDIxMzI5LDIxNTQyLDIyOTE1LDI0MTk5LDI0NDQ0LDI0NzU0LDI1MTYxLDI1MjA5LDI1MjU5LDI2MDAwLDI3NjA0LDI3ODUyLDMwMTMwLDMwMzgyLDMwODY1LDMxMTkyLDMyMjAzLDMyNjMxLDMyOTMzLDM0OTg3LDM1NTEzLDM2MDI3LDM2OTkxLDM4NzUwLDM5MTMxLDI3MTQ3LDMxODAwLDIwNjMzLDIzNjE0LDI0NDk0LDI2NTAzLDI3NjA4LDI5NzQ5LDMwNDczLDMyNjU0LDQwNzYzLDI2NTcwLDMxMjU1LDIxMzA1LDMwMDkxLDM5NjYxLDI0NDIyLDMzMTgxLDMzNzc3LDMyOTIwLDI0MzgwLDI0NTE3LDMwMDUwLDMxNTU4LDM2OTI0LDI2NzI3LDIzMDE5LDIzMTk1LDMyMDE2LDMwMzM0LDM1NjI4LDIwNDY5LDI0NDI2LDI3MTYxLDI3NzAzLDI4NDE4LDI5OTIyLDMxMDgwLDM0OTIwLDM1NDEzLDM1OTYxLDI0Mjg3LDI1NTUxLDMwMTQ5LDMxMTg2LDMzNDk1LDM3NjcyLDM3NjE4LDMzOTQ4LDM0NTQxLDM5OTgxLDIxNjk3LDI0NDI4LDI1OTk2LDI3OTk2LDI4NjkzLDM2MDA3LDM2MDUxLDM4OTcxLDI1OTM1LDI5OTQyLDE5OTgxLDIwMTg0LDIyNDk2LDIyODI3LDIzMTQyLDIzNTAwLDIwOTA0LDI0MDY3LDI0MjIwLDI0NTk4LDI1MjA2LDI1OTc1LDI2MDIzLDI2MjIyLDI4MDE0LDI5MjM4LDMxNTI2LDMzMTA0LDMzMTc4LDMzNDMzLDM1Njc2LDM2MDAwLDM2MDcwLDM2MjEyLDM4NDI4LDM4NDY4LDIwMzk4LDI1NzcxLDI3NDk0LDMzMzEwLDMzODg5LDM0MTU0LDM3MDk2LDIzNTUzLDI2OTYzLDM5MDgwLDMzOTE0LDM0MTM1LDIwMjM5LDIxMTAzLDI0NDg5LDI0MTMzLDI2MzgxLDMxMTE5LDMzMTQ1LDM1MDc5LDM1MjA2LDI4MTQ5LDI0MzQzLDI1MTczLDI3ODMyLDIwMTc1LDI5Mjg5LDM5ODI2LDIwOTk4LDIxNTYzLDIyMTMyLDIyNzA3LDI0OTk2LDI1MTk4LDI4OTU0LDIyODk0LDMxODgxLDMxOTY2LDMyMDI3LDM4NjQwLDI1OTkxLDMyODYyLDE5OTkzLDIwMzQxLDIwODUzLDIyNTkyLDI0MTYzLDI0MTc5LDI0MzMwLDI2NTY0LDIwMDA2LDM0MTA5LDM4MjgxLDM4NDkxLDMxODU5LDM4OTEzLDIwNzMxLDIyNzIxLDMwMjk0LDMwODg3LDIxMDI5LDMwNjI5LDM0MDY1LDMxNjIyLDIwNTU5LDIyNzkzLDI5MjU1LDMxNjg3LDMyMjMyLDM2Nzk0LDM2ODIwLDM2OTQxLDIwNDE1LDIxMTkzLDIzMDgxLDI0MzIxLDM4ODI5LDIwNDQ1LDMzMzAzLDM3NjEwLDIyMjc1LDI1NDI5LDI3NDk3LDI5OTk1LDM1MDM2LDM2NjI4LDMxMjk4LDIxMjE1LDIyNjc1LDI0OTE3LDI1MDk4LDI2Mjg2LDI3NTk3LDMxODA3LDMzNzY5LDIwNTE1LDIwNDcyLDIxMjUzLDIxNTc0LDIyNTc3LDIyODU3LDIzNDUzLDIzNzkyLDIzNzkxLDIzODQ5LDI0MjE0LDI1MjY1LDI1NDQ3LDI1OTE4LDI2MDQxLDI2Mzc5LDI3ODYxLDI3ODczLDI4OTIxLDMwNzcwLDMyMjk5LDMyOTkwLDMzNDU5LDMzODA0LDM0MDI4LDM0NTYyLDM1MDkwLDM1MzcwLDM1OTE0LDM3MDMwLDM3NTg2LDM5MTY1LDQwMTc5LDQwMzAwLDIwMDQ3LDIwMTI5LDIwNjIxLDIxMDc4LDIyMzQ2LDIyOTUyLDI0MTI1LDI0NTM2LDI0NTM3LDI1MTUxLDI2MjkyLDI2Mzk1LDI2NTc2LDI2ODM0LDIwODgyLDMyMDMzLDMyOTM4LDMzMTkyLDM1NTg0LDM1OTgwLDM2MDMxLDM3NTAyLDM4NDUwLDIxNTM2LDM4OTU2LDIxMjcxLDIwNjkzLDIxMzQwLDIyNjk2LDI1Nzc4LDI2NDIwLDI5Mjg3LDMwNTY2LDMxMzAyLDM3MzUwLDIxMTg3LDI3ODA5LDI3NTI2LDIyNTI4LDI0MTQwLDIyODY4LDI2NDEyLDMyNzYzLDIwOTYxLDMwNDA2LDI1NzA1LDMwOTUyLDM5NzY0LDQwNjM1LDIyNDc1LDIyOTY5LDI2MTUxLDI2NTIyLDI3NTk4LDIxNzM3LDI3MDk3LDI0MTQ5LDMzMTgwLDI2NTE3LDM5ODUwLDI2NjIyLDQwMDE4LDI2NzE3LDIwMTM0LDIwNDUxLDIxNDQ4LDI1MjczLDI2NDExLDI3ODE5LDM2ODA0LDIwMzk3LDMyMzY1LDQwNjM5LDE5OTc1LDI0OTMwLDI4Mjg4LDI4NDU5LDM0MDY3LDIxNjE5LDI2NDEwLDM5NzQ5LDI0MDUxLDMxNjM3LDIzNzI0LDIzNDk0LDM0NTg4LDI4MjM0LDM0MDAxLDMxMjUyLDMzMDMyLDIyOTM3LDMxODg1LDI3NjY1LDMwNDk2LDIxMjA5LDIyODE4LDI4OTYxLDI5Mjc5LDMwNjgzLDM4Njk1LDQwMjg5LDI2ODkxLDIzMTY3LDIzMDY0LDIwOTAxLDIxNTE3LDIxNjI5LDI2MTI2LDMwNDMxLDM2ODU1LDM3NTI4LDQwMTgwLDIzMDE4LDI5Mjc3LDI4MzU3LDIwODEzLDI2ODI1LDMyMTkxLDMyMjM2LDM4NzU0LDQwNjM0LDI1NzIwLDI3MTY5LDMzNTM4LDIyOTE2LDIzMzkxLDI3NjExLDI5NDY3LDMwNDUwLDMyMTc4LDMyNzkxLDMzOTQ1LDIwNzg2LDI2NDA4LDQwNjY1LDMwNDQ2LDI2NDY2LDIxMjQ3LDM5MTczLDIzNTg4LDI1MTQ3LDMxODcwLDM2MDE2LDIxODM5LDI0NzU4LDMyMDExLDM4MjcyLDIxMjQ5LDIwMDYzLDIwOTE4LDIyODEyLDI5MjQyLDMyODIyLDM3MzI2LDI0MzU3LDMwNjkwLDIxMzgwLDI0NDQxLDMyMDA0LDM0MjIwLDM1Mzc5LDM2NDkzLDM4NzQyLDI2NjExLDM0MjIyLDM3OTcxLDI0ODQxLDI0ODQwLDI3ODMzLDMwMjkwLDM1NTY1LDM2NjY0LDIxODA3LDIwMzA1LDIwNzc4LDIxMTkxLDIxNDUxLDIzNDYxLDI0MTg5LDI0NzM2LDI0OTYyLDI1NTU4LDI2Mzc3LDI2NTg2LDI4MjYzLDI4MDQ0LDI5NDk0LDI5NDk1LDMwMDAxLDMxMDU2LDM1MDI5LDM1NDgwLDM2OTM4LDM3MDA5LDM3MTA5LDM4NTk2LDM0NzAxLDIyODA1LDIwMTA0LDIwMzEzLDE5OTgyLDM1NDY1LDM2NjcxLDM4OTI4LDIwNjUzLDI0MTg4LDIyOTM0LDIzNDgxLDI0MjQ4LDI1NTYyLDI1NTk0LDI1NzkzLDI2MzMyLDI2OTU0LDI3MDk2LDI3OTE1LDI4MzQyLDI5MDc2LDI5OTkyLDMxNDA3LDMyNjUwLDMyNzY4LDMzODY1LDMzOTkzLDM1MjAxLDM1NjE3LDM2MzYyLDM2OTY1LDM4NTI1LDM5MTc4LDI0OTU4LDI1MjMzLDI3NDQyLDI3Nzc5LDI4MDIwLDMyNzE2LDMyNzY0LDI4MDk2LDMyNjQ1LDM0NzQ2LDM1MDY0LDI2NDY5LDMzNzEzLDM4OTcyLDM4NjQ3LDI3OTMxLDMyMDk3LDMzODUzLDM3MjI2LDIwMDgxLDIxMzY1LDIzODg4LDI3Mzk2LDI4NjUxLDM0MjUzLDM0MzQ5LDM1MjM5LDIxMDMzLDIxNTE5LDIzNjUzLDI2NDQ2LDI2NzkyLDI5NzAyLDI5ODI3LDMwMTc4LDM1MDIzLDM1MDQxLDM3MzI0LDM4NjI2LDM4NTIwLDI0NDU5LDI5NTc1LDMxNDM1LDMzODcwLDI1NTA0LDMwMDUzLDIxMTI5LDI3OTY5LDI4MzE2LDI5NzA1LDMwMDQxLDMwODI3LDMxODkwLDM4NTM0LDMxNDUyLDQwODQ1LDIwNDA2LDI0OTQyLDI2MDUzLDM0Mzk2LDIwMTAyLDIwMTQyLDIwNjk4LDIwMDAxLDIwOTQwLDIzNTM0LDI2MDA5LDI2NzUzLDI4MDkyLDI5NDcxLDMwMjc0LDMwNjM3LDMxMjYwLDMxOTc1LDMzMzkxLDM1NTM4LDM2OTg4LDM3MzI3LDM4NTE3LDM4OTM2LDIxMTQ3LDMyMjA5LDIwNTIzLDIxNDAwLDI2NTE5LDI4MTA3LDI5MTM2LDI5NzQ3LDMzMjU2LDM2NjUwLDM4NTYzLDQwMDIzLDQwNjA3LDI5NzkyLDIyNTkzLDI4MDU3LDMyMDQ3LDM5MDA2LDIwMTk2LDIwMjc4LDIwMzYzLDIwOTE5LDIxMTY5LDIzOTk0LDI0NjA0LDI5NjE4LDMxMDM2LDMzNDkxLDM3NDI4LDM4NTgzLDM4NjQ2LDM4NjY2LDQwNTk5LDQwODAyLDI2Mjc4LDI3NTA4LDIxMDE1LDIxMTU1LDI4ODcyLDM1MDEwLDI0MjY1LDI0NjUxLDI0OTc2LDI4NDUxLDI5MDAxLDMxODA2LDMyMjQ0LDMyODc5LDM0MDMwLDM2ODk5LDM3Njc2LDIxNTcwLDM5NzkxLDI3MzQ3LDI4ODA5LDM2MDM0LDM2MzM1LDM4NzA2LDIxMTcyLDIzMTA1LDI0MjY2LDI0MzI0LDI2MzkxLDI3MDA0LDI3MDI4LDI4MDEwLDI4NDMxLDI5MjgyLDI5NDM2LDMxNzI1LDMyNzY5LDMyODk0LDM0NjM1LDM3MDcwLDIwODQ1LDQwNTk1LDMxMTA4LDMyOTA3LDM3NjgyLDM1NTQyLDIwNTI1LDIxNjQ0LDM1NDQxLDI3NDk4LDM2MDM2LDMzMDMxLDI0Nzg1LDI2NTI4LDQwNDM0LDIwMTIxLDIwMTIwLDM5OTUyLDM1NDM1LDM0MjQxLDM0MTUyLDI2ODgwLDI4Mjg2LDMwODcxLDMzMTA5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjQzMzIsMTk5ODQsMTk5ODksMjAwMTAsMjAwMTcsMjAwMjIsMjAwMjgsMjAwMzEsMjAwMzQsMjAwNTQsMjAwNTYsMjAwOTgsMjAxMDEsMzU5NDcsMjAxMDYsMzMyOTgsMjQzMzMsMjAxMTAsMjAxMjYsMjAxMjcsMjAxMjgsMjAxMzAsMjAxNDQsMjAxNDcsMjAxNTAsMjAxNzQsMjAxNzMsMjAxNjQsMjAxNjYsMjAxNjIsMjAxODMsMjAxOTAsMjAyMDUsMjAxOTEsMjAyMTUsMjAyMzMsMjAzMTQsMjAyNzIsMjAzMTUsMjAzMTcsMjAzMTEsMjAyOTUsMjAzNDIsMjAzNjAsMjAzNjcsMjAzNzYsMjAzNDcsMjAzMjksMjAzMzYsMjAzNjksMjAzMzUsMjAzNTgsMjAzNzQsMjA3NjAsMjA0MzYsMjA0NDcsMjA0MzAsMjA0NDAsMjA0NDMsMjA0MzMsMjA0NDIsMjA0MzIsMjA0NTIsMjA0NTMsMjA1MDYsMjA1MjAsMjA1MDAsMjA1MjIsMjA1MTcsMjA0ODUsMjAyNTIsMjA0NzAsMjA1MTMsMjA1MjEsMjA1MjQsMjA0NzgsMjA0NjMsMjA0OTcsMjA0ODYsMjA1NDcsMjA1NTEsMjYzNzEsMjA1NjUsMjA1NjAsMjA1NTIsMjA1NzAsMjA1NjYsMjA1ODgsMjA2MDAsMjA2MDgsMjA2MzQsMjA2MTMsMjA2NjAsMjA2NTgsMjA2ODEsMjA2ODIsMjA2NTksMjA2NzQsMjA2OTQsMjA3MDIsMjA3MDksMjA3MTcsMjA3MDcsMjA3MTgsMjA3MjksMjA3MjUsMjA3NDUsMjA3MzcsMjA3MzgsMjA3NTgsMjA3NTcsMjA3NTYsMjA3NjIsMjA3NjksMjA3OTQsMjA3OTEsMjA3OTYsMjA3OTUsMjA3OTksMjA4MDAsMjA4MTgsMjA4MTIsMjA4MjAsMjA4MzQsMzE0ODAsMjA4NDEsMjA4NDIsMjA4NDYsMjA4NjQsMjA4NjYsMjIyMzIsMjA4NzYsMjA4NzMsMjA4NzksMjA4ODEsMjA4ODMsMjA4ODUsMjA4ODYsMjA5MDAsMjA5MDIsMjA4OTgsMjA5MDUsMjA5MDYsMjA5MDcsMjA5MTUsMjA5MTMsMjA5MTQsMjA5MTIsMjA5MTcsMjA5MjUsMjA5MzMsMjA5MzcsMjA5NTUsMjA5NjAsMzQzODksMjA5NjksMjA5NzMsMjA5NzYsMjA5ODEsMjA5OTAsMjA5OTYsMjEwMDMsMjEwMTIsMjEwMDYsMjEwMzEsMjEwMzQsMjEwMzgsMjEwNDMsMjEwNDksMjEwNzEsMjEwNjAsMjEwNjcsMjEwNjgsMjEwODYsMjEwNzYsMjEwOTgsMjExMDgsMjEwOTcsMjExMDcsMjExMTksMjExMTcsMjExMzMsMjExNDAsMjExMzgsMjExMDUsMjExMjgsMjExMzcsMzY3NzYsMzY3NzUsMjExNjQsMjExNjUsMjExODAsMjExNzMsMjExODUsMjExOTcsMjEyMDcsMjEyMTQsMjEyMTksMjEyMjIsMzkxNDksMjEyMTYsMjEyMzUsMjEyMzcsMjEyNDAsMjEyNDEsMjEyNTQsMjEyNTYsMzAwMDgsMjEyNjEsMjEyNjQsMjEyNjMsMjEyNjksMjEyNzQsMjEyODMsMjEyOTUsMjEyOTcsMjEyOTksMjEzMDQsMjEzMTIsMjEzMTgsMjEzMTcsMTk5OTEsMjEzMjEsMjEzMjUsMjA5NTAsMjEzNDIsMjEzNTMsMjEzNTgsMjI4MDgsMjEzNzEsMjEzNjcsMjEzNzgsMjEzOTgsMjE0MDgsMjE0MTQsMjE0MTMsMjE0MjIsMjE0MjQsMjE0MzAsMjE0NDMsMzE3NjIsMzg2MTcsMjE0NzEsMjYzNjQsMjkxNjYsMjE0ODYsMjE0ODAsMjE0ODUsMjE0OTgsMjE1MDUsMjE1NjUsMjE1NjgsMjE1NDgsMjE1NDksMjE1NjQsMjE1NTAsMjE1NTgsMjE1NDUsMjE1MzMsMjE1ODIsMjE2NDcsMjE2MjEsMjE2NDYsMjE1OTksMjE2MTcsMjE2MjMsMjE2MTYsMjE2NTAsMjE2MjcsMjE2MzIsMjE2MjIsMjE2MzYsMjE2NDgsMjE2MzgsMjE3MDMsMjE2NjYsMjE2ODgsMjE2NjksMjE2NzYsMjE3MDAsMjE3MDQsMjE2NzIsMjE2NzUsMjE2OTgsMjE2NjgsMjE2OTQsMjE2OTIsMjE3MjAsMjE3MzMsMjE3MzQsMjE3NzUsMjE3ODAsMjE3NTcsMjE3NDIsMjE3NDEsMjE3NTQsMjE3MzAsMjE4MTcsMjE4MjQsMjE4NTksMjE4MzYsMjE4MDYsMjE4NTIsMjE4MjksMjE4NDYsMjE4NDcsMjE4MTYsMjE4MTEsMjE4NTMsMjE5MTMsMjE4ODgsMjE2NzksMjE4OTgsMjE5MTksMjE4ODMsMjE4ODYsMjE5MTIsMjE5MTgsMjE5MzQsMjE4ODQsMjE4OTEsMjE5MjksMjE4OTUsMjE5MjgsMjE5NzgsMjE5NTcsMjE5ODMsMjE5NTYsMjE5ODAsMjE5ODgsMjE5NzIsMjIwMzYsMjIwMDcsMjIwMzgsMjIwMTQsMjIwMTMsMjIwNDMsMjIwMDksMjIwOTQsMjIwOTYsMjkxNTEsMjIwNjgsMjIwNzAsMjIwNjYsMjIwNzIsMjIxMjMsMjIxMTYsMjIwNjMsMjIxMjQsMjIxMjIsMjIxNTAsMjIxNDQsMjIxNTQsMjIxNzYsMjIxNjQsMjIxNTksMjIxODEsMjIxOTAsMjIxOTgsMjIxOTYsMjIyMTAsMjIyMDQsMjIyMDksMjIyMTEsMjIyMDgsMjIyMTYsMjIyMjIsMjIyMjUsMjIyMjcsMjIyMzEsMjIyNTQsMjIyNjUsMjIyNzIsMjIyNzEsMjIyNzYsMjIyODEsMjIyODAsMjIyODMsMjIyODUsMjIyOTEsMjIyOTYsMjIyOTQsMjE5NTksMjIzMDAsMjIzMTAsMjIzMjcsMjIzMjgsMjIzNTAsMjIzMzEsMjIzMzYsMjIzNTEsMjIzNzcsMjI0NjQsMjI0MDgsMjIzNjksMjIzOTksMjI0MDksMjI0MTksMjI0MzIsMjI0NTEsMjI0MzYsMjI0NDIsMjI0NDgsMjI0NjcsMjI0NzAsMjI0ODQsMjI0ODIsMjI0ODMsMjI1MzgsMjI0ODYsMjI0OTksMjI1MzksMjI1NTMsMjI1NTcsMjI2NDIsMjI1NjEsMjI2MjYsMjI2MDMsMjI2NDAsMjc1ODQsMjI2MTAsMjI1ODksMjI2NDksMjI2NjEsMjI3MTMsMjI2ODcsMjI2OTksMjI3MTQsMjI3NTAsMjI3MTUsMjI3MTIsMjI3MDIsMjI3MjUsMjI3MzksMjI3MzcsMjI3NDMsMjI3NDUsMjI3NDQsMjI3NTcsMjI3NDgsMjI3NTYsMjI3NTEsMjI3NjcsMjI3NzgsMjI3NzcsMjI3NzksMjI3ODAsMjI3ODEsMjI3ODYsMjI3OTQsMjI4MDAsMjI4MTEsMjY3OTAsMjI4MjEsMjI4MjgsMjI4MjksMjI4MzQsMjI4NDAsMjI4NDYsMzE0NDIsMjI4NjksMjI4NjQsMjI4NjIsMjI4NzQsMjI4NzIsMjI4ODIsMjI4ODAsMjI4ODcsMjI4OTIsMjI4ODksMjI5MDQsMjI5MTMsMjI5NDEsMjAzMTgsMjAzOTUsMjI5NDcsMjI5NjIsMjI5ODIsMjMwMTYsMjMwMDQsMjI5MjUsMjMwMDEsMjMwMDIsMjMwNzcsMjMwNzEsMjMwNTcsMjMwNjgsMjMwNDksMjMwNjYsMjMxMDQsMjMxNDgsMjMxMTMsMjMwOTMsMjMwOTQsMjMxMzgsMjMxNDYsMjMxOTQsMjMyMjgsMjMyMzAsMjMyNDMsMjMyMzQsMjMyMjksMjMyNjcsMjMyNTUsMjMyNzAsMjMyNzMsMjMyNTQsMjMyOTAsMjMyOTEsMjMzMDgsMjMzMDcsMjMzMTgsMjMzNDYsMjMyNDgsMjMzMzgsMjMzNTAsMjMzNTgsMjMzNjMsMjMzNjUsMjMzNjAsMjMzNzcsMjMzODEsMjMzODYsMjMzODcsMjMzOTcsMjM0MDEsMjM0MDgsMjM0MTEsMjM0MTMsMjM0MTYsMjU5OTIsMjM0MTgsMjM0MjQsMjM0MjcsMjM0NjIsMjM0ODAsMjM0OTEsMjM0OTUsMjM0OTcsMjM1MDgsMjM1MDQsMjM1MjQsMjM1MjYsMjM1MjIsMjM1MTgsMjM1MjUsMjM1MzEsMjM1MzYsMjM1NDIsMjM1MzksMjM1NTcsMjM1NTksMjM1NjAsMjM1NjUsMjM1NzEsMjM1ODQsMjM1ODYsMjM1OTIsMjM2MDgsMjM2MDksMjM2MTcsMjM2MjIsMjM2MzAsMjM2MzUsMjM2MzIsMjM2MzEsMjM0MDksMjM2NjAsMjM2NjIsMjAwNjYsMjM2NzAsMjM2NzMsMjM2OTIsMjM2OTcsMjM3MDAsMjI5MzksMjM3MjMsMjM3MzksMjM3MzQsMjM3NDAsMjM3MzUsMjM3NDksMjM3NDIsMjM3NTEsMjM3NjksMjM3ODUsMjM4MDUsMjM4MDIsMjM3ODksMjM5NDgsMjM3ODYsMjM4MTksMjM4MjksMjM4MzEsMjM5MDAsMjM4MzksMjM4MzUsMjM4MjUsMjM4MjgsMjM4NDIsMjM4MzQsMjM4MzMsMjM4MzIsMjM4ODQsMjM4OTAsMjM4ODYsMjM4ODMsMjM5MTYsMjM5MjMsMjM5MjYsMjM5NDMsMjM5NDAsMjM5MzgsMjM5NzAsMjM5NjUsMjM5ODAsMjM5ODIsMjM5OTcsMjM5NTIsMjM5OTEsMjM5OTYsMjQwMDksMjQwMTMsMjQwMTksMjQwMTgsMjQwMjIsMjQwMjcsMjQwNDMsMjQwNTAsMjQwNTMsMjQwNzUsMjQwOTAsMjQwODksMjQwODEsMjQwOTEsMjQxMTgsMjQxMTksMjQxMzIsMjQxMzEsMjQxMjgsMjQxNDIsMjQxNTEsMjQxNDgsMjQxNTksMjQxNjIsMjQxNjQsMjQxMzUsMjQxODEsMjQxODIsMjQxODYsNDA2MzYsMjQxOTEsMjQyMjQsMjQyNTcsMjQyNTgsMjQyNjQsMjQyNzIsMjQyNzEsMjQyNzgsMjQyOTEsMjQyODUsMjQyODIsMjQyODMsMjQyOTAsMjQyODksMjQyOTYsMjQyOTcsMjQzMDAsMjQzMDUsMjQzMDcsMjQzMDQsMjQzMDgsMjQzMTIsMjQzMTgsMjQzMjMsMjQzMjksMjQ0MTMsMjQ0MTIsMjQzMzEsMjQzMzcsMjQzNDIsMjQzNjEsMjQzNjUsMjQzNzYsMjQzODUsMjQzOTIsMjQzOTYsMjQzOTgsMjQzNjcsMjQ0MDEsMjQ0MDYsMjQ0MDcsMjQ0MDksMjQ0MTcsMjQ0MjksMjQ0MzUsMjQ0MzksMjQ0NTEsMjQ0NTAsMjQ0NDcsMjQ0NTgsMjQ0NTYsMjQ0NjUsMjQ0NTUsMjQ0NzgsMjQ0NzMsMjQ0NzIsMjQ0ODAsMjQ0ODgsMjQ0OTMsMjQ1MDgsMjQ1MzQsMjQ1NzEsMjQ1NDgsMjQ1NjgsMjQ1NjEsMjQ1NDEsMjQ3NTUsMjQ1NzUsMjQ2MDksMjQ2NzIsMjQ2MDEsMjQ1OTIsMjQ2MTcsMjQ1OTAsMjQ2MjUsMjQ2MDMsMjQ1OTcsMjQ2MTksMjQ2MTQsMjQ1OTEsMjQ2MzQsMjQ2NjYsMjQ2NDEsMjQ2ODIsMjQ2OTUsMjQ2NzEsMjQ2NTAsMjQ2NDYsMjQ2NTMsMjQ2NzUsMjQ2NDMsMjQ2NzYsMjQ2NDIsMjQ2ODQsMjQ2ODMsMjQ2NjUsMjQ3MDUsMjQ3MTcsMjQ4MDcsMjQ3MDcsMjQ3MzAsMjQ3MDgsMjQ3MzEsMjQ3MjYsMjQ3MjcsMjQ3MjIsMjQ3NDMsMjQ3MTUsMjQ4MDEsMjQ3NjAsMjQ4MDAsMjQ3ODcsMjQ3NTYsMjQ1NjAsMjQ3NjUsMjQ3NzQsMjQ3NTcsMjQ3OTIsMjQ5MDksMjQ4NTMsMjQ4MzgsMjQ4MjIsMjQ4MjMsMjQ4MzIsMjQ4MjAsMjQ4MjYsMjQ4MzUsMjQ4NjUsMjQ4MjcsMjQ4MTcsMjQ4NDUsMjQ4NDYsMjQ5MDMsMjQ4OTQsMjQ4NzIsMjQ4NzEsMjQ5MDYsMjQ4OTUsMjQ4OTIsMjQ4NzYsMjQ4ODQsMjQ4OTMsMjQ4OTgsMjQ5MDAsMjQ5NDcsMjQ5NTEsMjQ5MjAsMjQ5MjEsMjQ5MjIsMjQ5MzksMjQ5NDgsMjQ5NDMsMjQ5MzMsMjQ5NDUsMjQ5MjcsMjQ5MjUsMjQ5MTUsMjQ5NDksMjQ5ODUsMjQ5ODIsMjQ5NjcsMjUwMDQsMjQ5ODAsMjQ5ODYsMjQ5NzAsMjQ5NzcsMjUwMDMsMjUwMDYsMjUwMzYsMjUwMzQsMjUwMzMsMjUwNzksMjUwMzIsMjUwMjcsMjUwMzAsMjUwMTgsMjUwMzUsMzI2MzMsMjUwMzcsMjUwNjIsMjUwNTksMjUwNzgsMjUwODIsMjUwNzYsMjUwODcsMjUwODUsMjUwODQsMjUwODYsMjUwODgsMjUwOTYsMjUwOTcsMjUxMDEsMjUxMDAsMjUxMDgsMjUxMTUsMjUxMTgsMjUxMjEsMjUxMzAsMjUxMzQsMjUxMzYsMjUxMzgsMjUxMzksMjUxNTMsMjUxNjYsMjUxODIsMjUxODcsMjUxNzksMjUxODQsMjUxOTIsMjUyMTIsMjUyMTgsMjUyMjUsMjUyMTQsMjUyMzQsMjUyMzUsMjUyMzgsMjUzMDAsMjUyMTksMjUyMzYsMjUzMDMsMjUyOTcsMjUyNzUsMjUyOTUsMjUzNDMsMjUyODYsMjU4MTIsMjUyODgsMjUzMDgsMjUyOTIsMjUyOTAsMjUyODIsMjUyODcsMjUyNDMsMjUyODksMjUzNTYsMjUzMjYsMjUzMjksMjUzODMsMjUzNDYsMjUzNTIsMjUzMjcsMjUzMzMsMjU0MjQsMjU0MDYsMjU0MjEsMjU2MjgsMjU0MjMsMjU0OTQsMjU0ODYsMjU0NzIsMjU1MTUsMjU0NjIsMjU1MDcsMjU0ODcsMjU0ODEsMjU1MDMsMjU1MjUsMjU0NTEsMjU0NDksMjU1MzQsMjU1NzcsMjU1MzYsMjU1NDIsMjU1NzEsMjU1NDUsMjU1NTQsMjU1OTAsMjU1NDAsMjU2MjIsMjU2NTIsMjU2MDYsMjU2MTksMjU2MzgsMjU2NTQsMjU4ODUsMjU2MjMsMjU2NDAsMjU2MTUsMjU3MDMsMjU3MTEsMjU3MTgsMjU2NzgsMjU4OTgsMjU3NDksMjU3NDcsMjU3NjUsMjU3NjksMjU3MzYsMjU3ODgsMjU4MTgsMjU4MTAsMjU3OTcsMjU3OTksMjU3ODcsMjU4MTYsMjU3OTQsMjU4NDEsMjU4MzEsMzMyODksMjU4MjQsMjU4MjUsMjUyNjAsMjU4MjcsMjU4MzksMjU5MDAsMjU4NDYsMjU4NDQsMjU4NDIsMjU4NTAsMjU4NTYsMjU4NTMsMjU4ODAsMjU4ODQsMjU4NjEsMjU4OTIsMjU4OTEsMjU4OTksMjU5MDgsMjU5MDksMjU5MTEsMjU5MTAsMjU5MTIsMzAwMjcsMjU5MjgsMjU5NDIsMjU5NDEsMjU5MzMsMjU5NDQsMjU5NTAsMjU5NDksMjU5NzAsMjU5NzYsMjU5ODYsMjU5ODcsMzU3MjIsMjYwMTEsMjYwMTUsMjYwMjcsMjYwMzksMjYwNTEsMjYwNTQsMjYwNDksMjYwNTIsMjYwNjAsMjYwNjYsMjYwNzUsMjYwNzMsMjYwODAsMjYwODEsMjYwOTcsMjY0ODIsMjYxMjIsMjYxMTUsMjYxMDcsMjY0ODMsMjYxNjUsMjYxNjYsMjYxNjQsMjYxNDAsMjYxOTEsMjYxODAsMjYxODUsMjYxNzcsMjYyMDYsMjYyMDUsMjYyMTIsMjYyMTUsMjYyMTYsMjYyMDcsMjYyMTAsMjYyMjQsMjYyNDMsMjYyNDgsMjYyNTQsMjYyNDksMjYyNDQsMjYyNjQsMjYyNjksMjYzMDUsMjYyOTcsMjYzMTMsMjYzMDIsMjYzMDAsMjYzMDgsMjYyOTYsMjYzMjYsMjYzMzAsMjYzMzYsMjYxNzUsMjYzNDIsMjYzNDUsMjYzNTIsMjYzNTcsMjYzNTksMjYzODMsMjYzOTAsMjYzOTgsMjY0MDYsMjY0MDcsMzg3MTIsMjY0MTQsMjY0MzEsMjY0MjIsMjY0MzMsMjY0MjQsMjY0MjMsMjY0MzgsMjY0NjIsMjY0NjQsMjY0NTcsMjY0NjcsMjY0NjgsMjY1MDUsMjY0ODAsMjY1MzcsMjY0OTIsMjY0NzQsMjY1MDgsMjY1MDcsMjY1MzQsMjY1MjksMjY1MDEsMjY1NTEsMjY2MDcsMjY1NDgsMjY2MDQsMjY1NDcsMjY2MDEsMjY1NTIsMjY1OTYsMjY1OTAsMjY1ODksMjY1OTQsMjY2MDYsMjY1NTMsMjY1NzQsMjY1NjYsMjY1OTksMjcyOTIsMjY2NTQsMjY2OTQsMjY2NjUsMjY2ODgsMjY3MDEsMjY2NzQsMjY3MDIsMjY4MDMsMjY2NjcsMjY3MTMsMjY3MjMsMjY3NDMsMjY3NTEsMjY3ODMsMjY3NjcsMjY3OTcsMjY3NzIsMjY3ODEsMjY3NzksMjY3NTUsMjczMTAsMjY4MDksMjY3NDAsMjY4MDUsMjY3ODQsMjY4MTAsMjY4OTUsMjY3NjUsMjY3NTAsMjY4ODEsMjY4MjYsMjY4ODgsMjY4NDAsMjY5MTQsMjY5MTgsMjY4NDksMjY4OTIsMjY4MjksMjY4MzYsMjY4NTUsMjY4MzcsMjY5MzQsMjY4OTgsMjY4ODQsMjY4MzksMjY4NTEsMjY5MTcsMjY4NzMsMjY4NDgsMjY4NjMsMjY5MjAsMjY5MjIsMjY5MDYsMjY5MTUsMjY5MTMsMjY4MjIsMjcwMDEsMjY5OTksMjY5NzIsMjcwMDAsMjY5ODcsMjY5NjQsMjcwMDYsMjY5OTAsMjY5MzcsMjY5OTYsMjY5NDEsMjY5NjksMjY5MjgsMjY5NzcsMjY5NzQsMjY5NzMsMjcwMDksMjY5ODYsMjcwNTgsMjcwNTQsMjcwODgsMjcwNzEsMjcwNzMsMjcwOTEsMjcwNzAsMjcwODYsMjM1MjgsMjcwODIsMjcxMDEsMjcwNjcsMjcwNzUsMjcwNDcsMjcxODIsMjcwMjUsMjcwNDAsMjcwMzYsMjcwMjksMjcwNjAsMjcxMDIsMjcxMTIsMjcxMzgsMjcxNjMsMjcxMzUsMjc0MDIsMjcxMjksMjcxMjIsMjcxMTEsMjcxNDEsMjcwNTcsMjcxNjYsMjcxMTcsMjcxNTYsMjcxMTUsMjcxNDYsMjcxNTQsMjczMjksMjcxNzEsMjcxNTUsMjcyMDQsMjcxNDgsMjcyNTAsMjcxOTAsMjcyNTYsMjcyMDcsMjcyMzQsMjcyMjUsMjcyMzgsMjcyMDgsMjcxOTIsMjcxNzAsMjcyODAsMjcyNzcsMjcyOTYsMjcyNjgsMjcyOTgsMjcyOTksMjcyODcsMzQzMjcsMjczMjMsMjczMzEsMjczMzAsMjczMjAsMjczMTUsMjczMDgsMjczNTgsMjczNDUsMjczNTksMjczMDYsMjczNTQsMjczNzAsMjczODcsMjczOTcsMzQzMjYsMjczODYsMjc0MTAsMjc0MTQsMzk3MjksMjc0MjMsMjc0NDgsMjc0NDcsMzA0MjgsMjc0NDksMzkxNTAsMjc0NjMsMjc0NTksMjc0NjUsMjc0NzIsMjc0ODEsMjc0NzYsMjc0ODMsMjc0ODcsMjc0ODksMjc1MTIsMjc1MTMsMjc1MTksMjc1MjAsMjc1MjQsMjc1MjMsMjc1MzMsMjc1NDQsMjc1NDEsMjc1NTAsMjc1NTYsMjc1NjIsMjc1NjMsMjc1NjcsMjc1NzAsMjc1NjksMjc1NzEsMjc1NzUsMjc1ODAsMjc1OTAsMjc1OTUsMjc2MDMsMjc2MTUsMjc2MjgsMjc2MjcsMjc2MzUsMjc2MzEsNDA2MzgsMjc2NTYsMjc2NjcsMjc2NjgsMjc2NzUsMjc2ODQsMjc2ODMsMjc3NDIsMjc3MzMsMjc3NDYsMjc3NTQsMjc3NzgsMjc3ODksMjc4MDIsMjc3NzcsMjc4MDMsMjc3NzQsMjc3NTIsMjc3NjMsMjc3OTQsMjc3OTIsMjc4NDQsMjc4ODksMjc4NTksMjc4MzcsMjc4NjMsMjc4NDUsMjc4NjksMjc4MjIsMjc4MjUsMjc4MzgsMjc4MzQsMjc4NjcsMjc4ODcsMjc4NjUsMjc4ODIsMjc5MzUsMzQ4OTMsMjc5NTgsMjc5NDcsMjc5NjUsMjc5NjAsMjc5MjksMjc5NTcsMjc5NTUsMjc5MjIsMjc5MTYsMjgwMDMsMjgwNTEsMjgwMDQsMjc5OTQsMjgwMjUsMjc5OTMsMjgwNDYsMjgwNTMsMjg2NDQsMjgwMzcsMjgxNTMsMjgxODEsMjgxNzAsMjgwODUsMjgxMDMsMjgxMzQsMjgwODgsMjgxMDIsMjgxNDAsMjgxMjYsMjgxMDgsMjgxMzYsMjgxMTQsMjgxMDEsMjgxNTQsMjgxMjEsMjgxMzIsMjgxMTcsMjgxMzgsMjgxNDIsMjgyMDUsMjgyNzAsMjgyMDYsMjgxODUsMjgyNzQsMjgyNTUsMjgyMjIsMjgxOTUsMjgyNjcsMjgyMDMsMjgyNzgsMjgyMzcsMjgxOTEsMjgyMjcsMjgyMTgsMjgyMzgsMjgxOTYsMjg0MTUsMjgxODksMjgyMTYsMjgyOTAsMjgzMzAsMjgzMTIsMjgzNjEsMjgzNDMsMjgzNzEsMjgzNDksMjgzMzUsMjgzNTYsMjgzMzgsMjgzNzIsMjgzNzMsMjgzMDMsMjgzMjUsMjgzNTQsMjgzMTksMjg0ODEsMjg0MzMsMjg3NDgsMjgzOTYsMjg0MDgsMjg0MTQsMjg0NzksMjg0MDIsMjg0NjUsMjgzOTksMjg0NjYsMjgzNjQsMjg0NzgsMjg0MzUsMjg0MDcsMjg1NTAsMjg1MzgsMjg1MzYsMjg1NDUsMjg1NDQsMjg1MjcsMjg1MDcsMjg2NTksMjg1MjUsMjg1NDYsMjg1NDAsMjg1MDQsMjg1NTgsMjg1NjEsMjg2MTAsMjg1MTgsMjg1OTUsMjg1NzksMjg1NzcsMjg1ODAsMjg2MDEsMjg2MTQsMjg1ODYsMjg2MzksMjg2MjksMjg2NTIsMjg2MjgsMjg2MzIsMjg2NTcsMjg2NTQsMjg2MzUsMjg2ODEsMjg2ODMsMjg2NjYsMjg2ODksMjg2NzMsMjg2ODcsMjg2NzAsMjg2OTksMjg2OTgsMjg1MzIsMjg3MDEsMjg2OTYsMjg3MDMsMjg3MjAsMjg3MzQsMjg3MjIsMjg3NTMsMjg3NzEsMjg4MjUsMjg4MTgsMjg4NDcsMjg5MTMsMjg4NDQsMjg4NTYsMjg4NTEsMjg4NDYsMjg4OTUsMjg4NzUsMjg4OTMsMjg4ODksMjg5MzcsMjg5MjUsMjg5NTYsMjg5NTMsMjkwMjksMjkwMTMsMjkwNjQsMjkwMzAsMjkwMjYsMjkwMDQsMjkwMTQsMjkwMzYsMjkwNzEsMjkxNzksMjkwNjAsMjkwNzcsMjkwOTYsMjkxMDAsMjkxNDMsMjkxMTMsMjkxMTgsMjkxMzgsMjkxMjksMjkxNDAsMjkxMzQsMjkxNTIsMjkxNjQsMjkxNTksMjkxNzMsMjkxODAsMjkxNzcsMjkxODMsMjkxOTcsMjkyMDAsMjkyMTEsMjkyMjQsMjkyMjksMjkyMjgsMjkyMzIsMjkyMzQsMjkyNDMsMjkyNDQsMjkyNDcsMjkyNDgsMjkyNTQsMjkyNTksMjkyNzIsMjkzMDAsMjkzMTAsMjkzMTQsMjkzMTMsMjkzMTksMjkzMzAsMjkzMzQsMjkzNDYsMjkzNTEsMjkzNjksMjkzNjIsMjkzNzksMjkzODIsMjkzODAsMjkzOTAsMjkzOTQsMjk0MTAsMjk0MDgsMjk0MDksMjk0MzMsMjk0MzEsMjA0OTUsMjk0NjMsMjk0NTAsMjk0NjgsMjk0NjIsMjk0NjksMjk0OTIsMjk0ODcsMjk0ODEsMjk0NzcsMjk1MDIsMjk1MTgsMjk1MTksNDA2NjQsMjk1MjcsMjk1NDYsMjk1NDQsMjk1NTIsMjk1NjAsMjk1NTcsMjk1NjMsMjk1NjIsMjk2NDAsMjk2MTksMjk2NDYsMjk2MjcsMjk2MzIsMjk2NjksMjk2NzgsMjk2NjIsMjk4NTgsMjk3MDEsMjk4MDcsMjk3MzMsMjk2ODgsMjk3NDYsMjk3NTQsMjk3ODEsMjk3NTksMjk3OTEsMjk3ODUsMjk3NjEsMjk3ODgsMjk4MDEsMjk4MDgsMjk3OTUsMjk4MDIsMjk4MTQsMjk4MjIsMjk4MzUsMjk4NTQsMjk4NjMsMjk4OTgsMjk5MDMsMjk5MDgsMjk2ODEsMjk5MjAsMjk5MjMsMjk5MjcsMjk5MjksMjk5MzQsMjk5MzgsMjk5MzYsMjk5MzcsMjk5NDQsMjk5NDMsMjk5NTYsMjk5NTUsMjk5NTcsMjk5NjQsMjk5NjYsMjk5NjUsMjk5NzMsMjk5NzEsMjk5ODIsMjk5OTAsMjk5OTYsMzAwMTIsMzAwMjAsMzAwMjksMzAwMjYsMzAwMjUsMzAwNDMsMzAwMjIsMzAwNDIsMzAwNTcsMzAwNTIsMzAwNTUsMzAwNTksMzAwNjEsMzAwNzIsMzAwNzAsMzAwODYsMzAwODcsMzAwNjgsMzAwOTAsMzAwODksMzAwODIsMzAxMDAsMzAxMDYsMzAxMDksMzAxMTcsMzAxMTUsMzAxNDYsMzAxMzEsMzAxNDcsMzAxMzMsMzAxNDEsMzAxMzYsMzAxNDAsMzAxMjksMzAxNTcsMzAxNTQsMzAxNjIsMzAxNjksMzAxNzksMzAxNzQsMzAyMDYsMzAyMDcsMzAyMDQsMzAyMDksMzAxOTIsMzAyMDIsMzAxOTQsMzAxOTUsMzAyMTksMzAyMjEsMzAyMTcsMzAyMzksMzAyNDcsMzAyNDAsMzAyNDEsMzAyNDIsMzAyNDQsMzAyNjAsMzAyNTYsMzAyNjcsMzAyNzksMzAyODAsMzAyNzgsMzAzMDAsMzAyOTYsMzAzMDUsMzAzMDYsMzAzMTIsMzAzMTMsMzAzMTQsMzAzMTEsMzAzMTYsMzAzMjAsMzAzMjIsMzAzMjYsMzAzMjgsMzAzMzIsMzAzMzYsMzAzMzksMzAzNDQsMzAzNDcsMzAzNTAsMzAzNTgsMzAzNTUsMzAzNjEsMzAzNjIsMzAzODQsMzAzODgsMzAzOTIsMzAzOTMsMzAzOTQsMzA0MDIsMzA0MTMsMzA0MjIsMzA0MTgsMzA0MzAsMzA0MzMsMzA0MzcsMzA0MzksMzA0NDIsMzQzNTEsMzA0NTksMzA0NzIsMzA0NzEsMzA0NjgsMzA1MDUsMzA1MDAsMzA0OTQsMzA1MDEsMzA1MDIsMzA0OTEsMzA1MTksMzA1MjAsMzA1MzUsMzA1NTQsMzA1NjgsMzA1NzEsMzA1NTUsMzA1NjUsMzA1OTEsMzA1OTAsMzA1ODUsMzA2MDYsMzA2MDMsMzA2MDksMzA2MjQsMzA2MjIsMzA2NDAsMzA2NDYsMzA2NDksMzA2NTUsMzA2NTIsMzA2NTMsMzA2NTEsMzA2NjMsMzA2NjksMzA2NzksMzA2ODIsMzA2ODQsMzA2OTEsMzA3MDIsMzA3MTYsMzA3MzIsMzA3MzgsMzEwMTQsMzA3NTIsMzEwMTgsMzA3ODksMzA4NjIsMzA4MzYsMzA4NTQsMzA4NDQsMzA4NzQsMzA4NjAsMzA4ODMsMzA5MDEsMzA4OTAsMzA4OTUsMzA5MjksMzA5MTgsMzA5MjMsMzA5MzIsMzA5MTAsMzA5MDgsMzA5MTcsMzA5MjIsMzA5NTYsMzA5NTEsMzA5MzgsMzA5NzMsMzA5NjQsMzA5ODMsMzA5OTQsMzA5OTMsMzEwMDEsMzEwMjAsMzEwMTksMzEwNDAsMzEwNzIsMzEwNjMsMzEwNzEsMzEwNjYsMzEwNjEsMzEwNTksMzEwOTgsMzExMDMsMzExMTQsMzExMzMsMzExNDMsNDA3NzksMzExNDYsMzExNTAsMzExNTUsMzExNjEsMzExNjIsMzExNzcsMzExODksMzEyMDcsMzEyMTIsMzEyMDEsMzEyMDMsMzEyNDAsMzEyNDUsMzEyNTYsMzEyNTcsMzEyNjQsMzEyNjMsMzExMDQsMzEyODEsMzEyOTEsMzEyOTQsMzEyODcsMzEyOTksMzEzMTksMzEzMDUsMzEzMjksMzEzMzAsMzEzMzcsNDA4NjEsMzEzNDQsMzEzNTMsMzEzNTcsMzEzNjgsMzEzODMsMzEzODEsMzEzODQsMzEzODIsMzE0MDEsMzE0MzIsMzE0MDgsMzE0MTQsMzE0MjksMzE0MjgsMzE0MjMsMzY5OTUsMzE0MzEsMzE0MzQsMzE0MzcsMzE0MzksMzE0NDUsMzE0NDMsMzE0NDksMzE0NTAsMzE0NTMsMzE0NTcsMzE0NTgsMzE0NjIsMzE0NjksMzE0NzIsMzE0OTAsMzE1MDMsMzE0OTgsMzE0OTQsMzE1MzksMzE1MTIsMzE1MTMsMzE1MTgsMzE1NDEsMzE1MjgsMzE1NDIsMzE1NjgsMzE2MTAsMzE0OTIsMzE1NjUsMzE0OTksMzE1NjQsMzE1NTcsMzE2MDUsMzE1ODksMzE2MDQsMzE1OTEsMzE2MDAsMzE2MDEsMzE1OTYsMzE1OTgsMzE2NDUsMzE2NDAsMzE2NDcsMzE2MjksMzE2NDQsMzE2NDIsMzE2MjcsMzE2MzQsMzE2MzEsMzE1ODEsMzE2NDEsMzE2OTEsMzE2ODEsMzE2OTIsMzE2OTUsMzE2NjgsMzE2ODYsMzE3MDksMzE3MjEsMzE3NjEsMzE3NjQsMzE3MTgsMzE3MTcsMzE4NDAsMzE3NDQsMzE3NTEsMzE3NjMsMzE3MzEsMzE3MzUsMzE3NjcsMzE3NTcsMzE3MzQsMzE3NzksMzE3ODMsMzE3ODYsMzE3NzUsMzE3OTksMzE3ODcsMzE4MDUsMzE4MjAsMzE4MTEsMzE4MjgsMzE4MjMsMzE4MDgsMzE4MjQsMzE4MzIsMzE4MzksMzE4NDQsMzE4MzAsMzE4NDUsMzE4NTIsMzE4NjEsMzE4NzUsMzE4ODgsMzE5MDgsMzE5MTcsMzE5MDYsMzE5MTUsMzE5MDUsMzE5MTIsMzE5MjMsMzE5MjIsMzE5MjEsMzE5MTgsMzE5MjksMzE5MzMsMzE5MzYsMzE5NDEsMzE5MzgsMzE5NjAsMzE5NTQsMzE5NjQsMzE5NzAsMzk3MzksMzE5ODMsMzE5ODYsMzE5ODgsMzE5OTAsMzE5OTQsMzIwMDYsMzIwMDIsMzIwMjgsMzIwMjEsMzIwMTAsMzIwNjksMzIwNzUsMzIwNDYsMzIwNTAsMzIwNjMsMzIwNTMsMzIwNzAsMzIxMTUsMzIwODYsMzIwNzgsMzIxMTQsMzIxMDQsMzIxMTAsMzIwNzksMzIwOTksMzIxNDcsMzIxMzcsMzIwOTEsMzIxNDMsMzIxMjUsMzIxNTUsMzIxODYsMzIxNzQsMzIxNjMsMzIxODEsMzIxOTksMzIxODksMzIxNzEsMzIzMTcsMzIxNjIsMzIxNzUsMzIyMjAsMzIxODQsMzIxNTksMzIxNzYsMzIyMTYsMzIyMjEsMzIyMjgsMzIyMjIsMzIyNTEsMzIyNDIsMzIyMjUsMzIyNjEsMzIyNjYsMzIyOTEsMzIyODksMzIyNzQsMzIzMDUsMzIyODcsMzIyNjUsMzIyNjcsMzIyOTAsMzIzMjYsMzIzNTgsMzIzMTUsMzIzMDksMzIzMTMsMzIzMjMsMzIzMTEsMzIzMDYsMzIzMTQsMzIzNTksMzIzNDksMzIzNDIsMzIzNTAsMzIzNDUsMzIzNDYsMzIzNzcsMzIzNjIsMzIzNjEsMzIzODAsMzIzNzksMzIzODcsMzIyMTMsMzIzODEsMzY3ODIsMzIzODMsMzIzOTIsMzIzOTMsMzIzOTYsMzI0MDIsMzI0MDAsMzI0MDMsMzI0MDQsMzI0MDYsMzIzOTgsMzI0MTEsMzI0MTIsMzI1NjgsMzI1NzAsMzI1ODEsMzI1ODgsMzI1ODksMzI1OTAsMzI1OTIsMzI1OTMsMzI1OTcsMzI1OTYsMzI2MDAsMzI2MDcsMzI2MDgsMzI2MTYsMzI2MTcsMzI2MTUsMzI2MzIsMzI2NDIsMzI2NDYsMzI2NDMsMzI2NDgsMzI2NDcsMzI2NTIsMzI2NjAsMzI2NzAsMzI2NjksMzI2NjYsMzI2NzUsMzI2ODcsMzI2OTAsMzI2OTcsMzI2ODYsMzI2OTQsMzI2OTYsMzU2OTcsMzI3MDksMzI3MTAsMzI3MTQsMzI3MjUsMzI3MjQsMzI3MzcsMzI3NDIsMzI3NDUsMzI3NTUsMzI3NjEsMzkxMzIsMzI3NzQsMzI3NzIsMzI3NzksMzI3ODYsMzI3OTIsMzI3OTMsMzI3OTYsMzI4MDEsMzI4MDgsMzI4MzEsMzI4MjcsMzI4NDIsMzI4MzgsMzI4NTAsMzI4NTYsMzI4NTgsMzI4NjMsMzI4NjYsMzI4NzIsMzI4ODMsMzI4ODIsMzI4ODAsMzI4ODYsMzI4ODksMzI4OTMsMzI4OTUsMzI5MDAsMzI5MDIsMzI5MDEsMzI5MjMsMzI5MTUsMzI5MjIsMzI5NDEsMjA4ODAsMzI5NDAsMzI5ODcsMzI5OTcsMzI5ODUsMzI5ODksMzI5NjQsMzI5ODYsMzI5ODIsMzMwMzMsMzMwMDcsMzMwMDksMzMwNTEsMzMwNjUsMzMwNTksMzMwNzEsMzMwOTksMzg1MzksMzMwOTQsMzMwODYsMzMxMDcsMzMxMDUsMzMwMjAsMzMxMzcsMzMxMzQsMzMxMjUsMzMxMjYsMzMxNDAsMzMxNTUsMzMxNjAsMzMxNjIsMzMxNTIsMzMxNTQsMzMxODQsMzMxNzMsMzMxODgsMzMxODcsMzMxMTksMzMxNzEsMzMxOTMsMzMyMDAsMzMyMDUsMzMyMTQsMzMyMDgsMzMyMTMsMzMyMTYsMzMyMTgsMzMyMTAsMzMyMjUsMzMyMjksMzMyMzMsMzMyNDEsMzMyNDAsMzMyMjQsMzMyNDIsMzMyNDcsMzMyNDgsMzMyNTUsMzMyNzQsMzMyNzUsMzMyNzgsMzMyODEsMzMyODIsMzMyODUsMzMyODcsMzMyOTAsMzMyOTMsMzMyOTYsMzMzMDIsMzMzMjEsMzMzMjMsMzMzMzYsMzMzMzEsMzMzNDQsMzMzNjksMzMzNjgsMzMzNzMsMzMzNzAsMzMzNzUsMzMzODAsMzMzNzgsMzMzODQsMzMzODYsMzMzODcsMzMzMjYsMzMzOTMsMzMzOTksMzM0MDAsMzM0MDYsMzM0MjEsMzM0MjYsMzM0NTEsMzM0MzksMzM0NjcsMzM0NTIsMzM1MDUsMzM1MDcsMzM1MDMsMzM0OTAsMzM1MjQsMzM1MjMsMzM1MzAsMzM2ODMsMzM1MzksMzM1MzEsMzM1MjksMzM1MDIsMzM1NDIsMzM1MDAsMzM1NDUsMzM0OTcsMzM1ODksMzM1ODgsMzM1NTgsMzM1ODYsMzM1ODUsMzM2MDAsMzM1OTMsMzM2MTYsMzM2MDUsMzM1ODMsMzM1NzksMzM1NTksMzM1NjAsMzM2NjksMzM2OTAsMzM3MDYsMzM2OTUsMzM2OTgsMzM2ODYsMzM1NzEsMzM2NzgsMzM2NzEsMzM2NzQsMzM2NjAsMzM3MTcsMzM2NTEsMzM2NTMsMzM2OTYsMzM2NzMsMzM3MDQsMzM3ODAsMzM4MTEsMzM3NzEsMzM3NDIsMzM3ODksMzM3OTUsMzM3NTIsMzM4MDMsMzM3MjksMzM3ODMsMzM3OTksMzM3NjAsMzM3NzgsMzM4MDUsMzM4MjYsMzM4MjQsMzM3MjUsMzM4NDgsMzQwNTQsMzM3ODcsMzM5MDEsMzM4MzQsMzM4NTIsMzQxMzgsMzM5MjQsMzM5MTEsMzM4OTksMzM5NjUsMzM5MDIsMzM5MjIsMzM4OTcsMzM4NjIsMzM4MzYsMzM5MDMsMzM5MTMsMzM4NDUsMzM5OTQsMzM4OTAsMzM5NzcsMzM5ODMsMzM5NTEsMzQwMDksMzM5OTcsMzM5NzksMzQwMTAsMzQwMDAsMzM5ODUsMzM5OTAsMzQwMDYsMzM5NTMsMzQwODEsMzQwNDcsMzQwMzYsMzQwNzEsMzQwNzIsMzQwOTIsMzQwNzksMzQwNjksMzQwNjgsMzQwNDQsMzQxMTIsMzQxNDcsMzQxMzYsMzQxMjAsMzQxMTMsMzQzMDYsMzQxMjMsMzQxMzMsMzQxNzYsMzQyMTIsMzQxODQsMzQxOTMsMzQxODYsMzQyMTYsMzQxNTcsMzQxOTYsMzQyMDMsMzQyODIsMzQxODMsMzQyMDQsMzQxNjcsMzQxNzQsMzQxOTIsMzQyNDksMzQyMzQsMzQyNTUsMzQyMzMsMzQyNTYsMzQyNjEsMzQyNjksMzQyNzcsMzQyNjgsMzQyOTcsMzQzMTQsMzQzMjMsMzQzMTUsMzQzMDIsMzQyOTgsMzQzMTAsMzQzMzgsMzQzMzAsMzQzNTIsMzQzNjcsMzQzODEsMjAwNTMsMzQzODgsMzQzOTksMzQ0MDcsMzQ0MTcsMzQ0NTEsMzQ0NjcsMzQ0NzMsMzQ0NzQsMzQ0NDMsMzQ0NDQsMzQ0ODYsMzQ0NzksMzQ1MDAsMzQ1MDIsMzQ0ODAsMzQ1MDUsMzQ4NTEsMzQ0NzUsMzQ1MTYsMzQ1MjYsMzQ1MzcsMzQ1NDAsMzQ1MjcsMzQ1MjMsMzQ1NDMsMzQ1NzgsMzQ1NjYsMzQ1NjgsMzQ1NjAsMzQ1NjMsMzQ1NTUsMzQ1NzcsMzQ1NjksMzQ1NzMsMzQ1NTMsMzQ1NzAsMzQ2MTIsMzQ2MjMsMzQ2MTUsMzQ2MTksMzQ1OTcsMzQ2MDEsMzQ1ODYsMzQ2NTYsMzQ2NTUsMzQ2ODAsMzQ2MzYsMzQ2MzgsMzQ2NzYsMzQ2NDcsMzQ2NjQsMzQ2NzAsMzQ2NDksMzQ2NDMsMzQ2NTksMzQ2NjYsMzQ4MjEsMzQ3MjIsMzQ3MTksMzQ2OTAsMzQ3MzUsMzQ3NjMsMzQ3NDksMzQ3NTIsMzQ3NjgsMzg2MTQsMzQ3MzEsMzQ3NTYsMzQ3MzksMzQ3NTksMzQ3NTgsMzQ3NDcsMzQ3OTksMzQ4MDIsMzQ3ODQsMzQ4MzEsMzQ4MjksMzQ4MTQsMzQ4MDYsMzQ4MDcsMzQ4MzAsMzQ3NzAsMzQ4MzMsMzQ4MzgsMzQ4MzcsMzQ4NTAsMzQ4NDksMzQ4NjUsMzQ4NzAsMzQ4NzMsMzQ4NTUsMzQ4NzUsMzQ4ODQsMzQ4ODIsMzQ4OTgsMzQ5MDUsMzQ5MTAsMzQ5MTQsMzQ5MjMsMzQ5NDUsMzQ5NDIsMzQ5NzQsMzQ5MzMsMzQ5NDEsMzQ5OTcsMzQ5MzAsMzQ5NDYsMzQ5NjcsMzQ5NjIsMzQ5OTAsMzQ5NjksMzQ5NzgsMzQ5NTcsMzQ5ODAsMzQ5OTIsMzUwMDcsMzQ5OTMsMzUwMTEsMzUwMTIsMzUwMjgsMzUwMzIsMzUwMzMsMzUwMzcsMzUwNjUsMzUwNzQsMzUwNjgsMzUwNjAsMzUwNDgsMzUwNTgsMzUwNzYsMzUwODQsMzUwODIsMzUwOTEsMzUxMzksMzUxMDIsMzUxMDksMzUxMTQsMzUxMTUsMzUxMzcsMzUxNDAsMzUxMzEsMzUxMjYsMzUxMjgsMzUxNDgsMzUxMDEsMzUxNjgsMzUxNjYsMzUxNzQsMzUxNzIsMzUxODEsMzUxNzgsMzUxODMsMzUxODgsMzUxOTEsMzUxOTgsMzUyMDMsMzUyMDgsMzUyMTAsMzUyMTksMzUyMjQsMzUyMzMsMzUyNDEsMzUyMzgsMzUyNDQsMzUyNDcsMzUyNTAsMzUyNTgsMzUyNjEsMzUyNjMsMzUyNjQsMzUyOTAsMzUyOTIsMzUyOTMsMzUzMDMsMzUzMTYsMzUzMjAsMzUzMzEsMzUzNTAsMzUzNDQsMzUzNDAsMzUzNTUsMzUzNTcsMzUzNjUsMzUzODIsMzUzOTMsMzU0MTksMzU0MTAsMzUzOTgsMzU0MDAsMzU0NTIsMzU0MzcsMzU0MzYsMzU0MjYsMzU0NjEsMzU0NTgsMzU0NjAsMzU0OTYsMzU0ODksMzU0NzMsMzU0OTMsMzU0OTQsMzU0ODIsMzU0OTEsMzU1MjQsMzU1MzMsMzU1MjIsMzU1NDYsMzU1NjMsMzU1NzEsMzU1NTksMzU1NTYsMzU1NjksMzU2MDQsMzU1NTIsMzU1NTQsMzU1NzUsMzU1NTAsMzU1NDcsMzU1OTYsMzU1OTEsMzU2MTAsMzU1NTMsMzU2MDYsMzU2MDAsMzU2MDcsMzU2MTYsMzU2MzUsMzg4MjcsMzU2MjIsMzU2MjcsMzU2NDYsMzU2MjQsMzU2NDksMzU2NjAsMzU2NjMsMzU2NjIsMzU2NTcsMzU2NzAsMzU2NzUsMzU2NzQsMzU2OTEsMzU2NzksMzU2OTIsMzU2OTUsMzU3MDAsMzU3MDksMzU3MTIsMzU3MjQsMzU3MjYsMzU3MzAsMzU3MzEsMzU3MzQsMzU3MzcsMzU3MzgsMzU4OTgsMzU5MDUsMzU5MDMsMzU5MTIsMzU5MTYsMzU5MTgsMzU5MjAsMzU5MjUsMzU5MzgsMzU5NDgsMzU5NjAsMzU5NjIsMzU5NzAsMzU5NzcsMzU5NzMsMzU5NzgsMzU5ODEsMzU5ODIsMzU5ODgsMzU5NjQsMzU5OTIsMjUxMTcsMzYwMTMsMzYwMTAsMzYwMjksMzYwMTgsMzYwMTksMzYwMTQsMzYwMjIsMzYwNDAsMzYwMzMsMzYwNjgsMzYwNjcsMzYwNTgsMzYwOTMsMzYwOTAsMzYwOTEsMzYxMDAsMzYxMDEsMzYxMDYsMzYxMDMsMzYxMTEsMzYxMDksMzYxMTIsNDA3ODIsMzYxMTUsMzYwNDUsMzYxMTYsMzYxMTgsMzYxOTksMzYyMDUsMzYyMDksMzYyMTEsMzYyMjUsMzYyNDksMzYyOTAsMzYyODYsMzYyODIsMzYzMDMsMzYzMTQsMzYzMTAsMzYzMDAsMzYzMTUsMzYyOTksMzYzMzAsMzYzMzEsMzYzMTksMzYzMjMsMzYzNDgsMzYzNjAsMzYzNjEsMzYzNTEsMzYzODEsMzYzODIsMzYzNjgsMzYzODMsMzY0MTgsMzY0MDUsMzY0MDAsMzY0MDQsMzY0MjYsMzY0MjMsMzY0MjUsMzY0MjgsMzY0MzIsMzY0MjQsMzY0NDEsMzY0NTIsMzY0NDgsMzYzOTQsMzY0NTEsMzY0MzcsMzY0NzAsMzY0NjYsMzY0NzYsMzY0ODEsMzY0ODcsMzY0ODUsMzY0ODQsMzY0OTEsMzY0OTAsMzY0OTksMzY0OTcsMzY1MDAsMzY1MDUsMzY1MjIsMzY1MTMsMzY1MjQsMzY1MjgsMzY1NTAsMzY1MjksMzY1NDIsMzY1NDksMzY1NTIsMzY1NTUsMzY1NzEsMzY1NzksMzY2MDQsMzY2MDMsMzY1ODcsMzY2MDYsMzY2MTgsMzY2MTMsMzY2MjksMzY2MjYsMzY2MzMsMzY2MjcsMzY2MzYsMzY2MzksMzY2MzUsMzY2MjAsMzY2NDYsMzY2NTksMzY2NjcsMzY2NjUsMzY2NzcsMzY2NzQsMzY2NzAsMzY2ODQsMzY2ODEsMzY2NzgsMzY2ODYsMzY2OTUsMzY3MDAsMzY3MDYsMzY3MDcsMzY3MDgsMzY3NjQsMzY3NjcsMzY3NzEsMzY3ODEsMzY3ODMsMzY3OTEsMzY4MjYsMzY4MzcsMzY4MzQsMzY4NDIsMzY4NDcsMzY5OTksMzY4NTIsMzY4NjksMzY4NTcsMzY4NTgsMzY4ODEsMzY4ODUsMzY4OTcsMzY4NzcsMzY4OTQsMzY4ODYsMzY4NzUsMzY5MDMsMzY5MTgsMzY5MTcsMzY5MjEsMzY4NTYsMzY5NDMsMzY5NDQsMzY5NDUsMzY5NDYsMzY4NzgsMzY5MzcsMzY5MjYsMzY5NTAsMzY5NTIsMzY5NTgsMzY5NjgsMzY5NzUsMzY5ODIsMzg1NjgsMzY5NzgsMzY5OTQsMzY5ODksMzY5OTMsMzY5OTIsMzcwMDIsMzcwMDEsMzcwMDcsMzcwMzIsMzcwMzksMzcwNDEsMzcwNDUsMzcwOTAsMzcwOTIsMjUxNjAsMzcwODMsMzcxMjIsMzcxMzgsMzcxNDUsMzcxNzAsMzcxNjgsMzcxOTQsMzcyMDYsMzcyMDgsMzcyMTksMzcyMjEsMzcyMjUsMzcyMzUsMzcyMzQsMzcyNTksMzcyNTcsMzcyNTAsMzcyODIsMzcyOTEsMzcyOTUsMzcyOTAsMzczMDEsMzczMDAsMzczMDYsMzczMTIsMzczMTMsMzczMjEsMzczMjMsMzczMjgsMzczMzQsMzczNDMsMzczNDUsMzczMzksMzczNzIsMzczNjUsMzczNjYsMzc0MDYsMzczNzUsMzczOTYsMzc0MjAsMzczOTcsMzczOTMsMzc0NzAsMzc0NjMsMzc0NDUsMzc0NDksMzc0NzYsMzc0NDgsMzc1MjUsMzc0MzksMzc0NTEsMzc0NTYsMzc1MzIsMzc1MjYsMzc1MjMsMzc1MzEsMzc0NjYsMzc1ODMsMzc1NjEsMzc1NTksMzc2MDksMzc2NDcsMzc2MjYsMzc3MDAsMzc2NzgsMzc2NTcsMzc2NjYsMzc2NTgsMzc2NjcsMzc2OTAsMzc2ODUsMzc2OTEsMzc3MjQsMzc3MjgsMzc3NTYsMzc3NDIsMzc3MTgsMzc4MDgsMzc4MDQsMzc4MDUsMzc3ODAsMzc4MTcsMzc4NDYsMzc4NDcsMzc4NjQsMzc4NjEsMzc4NDgsMzc4MjcsMzc4NTMsMzc4NDAsMzc4MzIsMzc4NjAsMzc5MTQsMzc5MDgsMzc5MDcsMzc4OTEsMzc4OTUsMzc5MDQsMzc5NDIsMzc5MzEsMzc5NDEsMzc5MjEsMzc5NDYsMzc5NTMsMzc5NzAsMzc5NTYsMzc5NzksMzc5ODQsMzc5ODYsMzc5ODIsMzc5OTQsMzc0MTcsMzgwMDAsMzgwMDUsMzgwMDcsMzgwMTMsMzc5NzgsMzgwMTIsMzgwMTQsMzgwMTcsMzgwMTUsMzgyNzQsMzgyNzksMzgyODIsMzgyOTIsMzgyOTQsMzgyOTYsMzgyOTcsMzgzMDQsMzgzMTIsMzgzMTEsMzgzMTcsMzgzMzIsMzgzMzEsMzgzMjksMzgzMzQsMzgzNDYsMjg2NjIsMzgzMzksMzgzNDksMzgzNDgsMzgzNTcsMzgzNTYsMzgzNTgsMzgzNjQsMzgzNjksMzgzNzMsMzgzNzAsMzg0MzMsMzg0NDAsMzg0NDYsMzg0NDcsMzg0NjYsMzg0NzYsMzg0NzksMzg0NzUsMzg1MTksMzg0OTIsMzg0OTQsMzg0OTMsMzg0OTUsMzg1MDIsMzg1MTQsMzg1MDgsMzg1NDEsMzg1NTIsMzg1NDksMzg1NTEsMzg1NzAsMzg1NjcsMzg1NzcsMzg1NzgsMzg1NzYsMzg1ODAsMzg1ODIsMzg1ODQsMzg1ODUsMzg2MDYsMzg2MDMsMzg2MDEsMzg2MDUsMzUxNDksMzg2MjAsMzg2NjksMzg2MTMsMzg2NDksMzg2NjAsMzg2NjIsMzg2NjQsMzg2NzUsMzg2NzAsMzg2NzMsMzg2NzEsMzg2NzgsMzg2ODEsMzg2OTIsMzg2OTgsMzg3MDQsMzg3MTMsMzg3MTcsMzg3MTgsMzg3MjQsMzg3MjYsMzg3MjgsMzg3MjIsMzg3MjksMzg3NDgsMzg3NTIsMzg3NTYsMzg3NTgsMzg3NjAsMjEyMDIsMzg3NjMsMzg3NjksMzg3NzcsMzg3ODksMzg3ODAsMzg3ODUsMzg3NzgsMzg3OTAsMzg3OTUsMzg3OTksMzg4MDAsMzg4MTIsMzg4MjQsMzg4MjIsMzg4MTksMzg4MzUsMzg4MzYsMzg4NTEsMzg4NTQsMzg4NTYsMzg4NTksMzg4NzYsMzg4OTMsNDA3ODMsMzg4OTgsMzE0NTUsMzg5MDIsMzg5MDEsMzg5MjcsMzg5MjQsMzg5NjgsMzg5NDgsMzg5NDUsMzg5NjcsMzg5NzMsMzg5ODIsMzg5OTEsMzg5ODcsMzkwMTksMzkwMjMsMzkwMjQsMzkwMjUsMzkwMjgsMzkwMjcsMzkwODIsMzkwODcsMzkwODksMzkwOTQsMzkxMDgsMzkxMDcsMzkxMTAsMzkxNDUsMzkxNDcsMzkxNzEsMzkxNzcsMzkxODYsMzkxODgsMzkxOTIsMzkyMDEsMzkxOTcsMzkxOTgsMzkyMDQsMzkyMDAsMzkyMTIsMzkyMTQsMzkyMjksMzkyMzAsMzkyMzQsMzkyNDEsMzkyMzcsMzkyNDgsMzkyNDMsMzkyNDksMzkyNTAsMzkyNDQsMzkyNTMsMzkzMTksMzkzMjAsMzkzMzMsMzkzNDEsMzkzNDIsMzkzNTYsMzkzOTEsMzkzODcsMzkzODksMzkzODQsMzkzNzcsMzk0MDUsMzk0MDYsMzk0MDksMzk0MTAsMzk0MTksMzk0MTYsMzk0MjUsMzk0MzksMzk0MjksMzkzOTQsMzk0NDksMzk0NjcsMzk0NzksMzk0OTMsMzk0OTAsMzk0ODgsMzk0OTEsMzk0ODYsMzk1MDksMzk1MDEsMzk1MTUsMzk1MTEsMzk1MTksMzk1MjIsMzk1MjUsMzk1MjQsMzk1MjksMzk1MzEsMzk1MzAsMzk1OTcsMzk2MDAsMzk2MTIsMzk2MTYsMzk2MzEsMzk2MzMsMzk2MzUsMzk2MzYsMzk2NDYsMzk2NDcsMzk2NTAsMzk2NTEsMzk2NTQsMzk2NjMsMzk2NTksMzk2NjIsMzk2NjgsMzk2NjUsMzk2NzEsMzk2NzUsMzk2ODYsMzk3MDQsMzk3MDYsMzk3MTEsMzk3MTQsMzk3MTUsMzk3MTcsMzk3MTksMzk3MjAsMzk3MjEsMzk3MjIsMzk3MjYsMzk3MjcsMzk3MzAsMzk3NDgsMzk3NDcsMzk3NTksMzk3NTcsMzk3NTgsMzk3NjEsMzk3NjgsMzk3OTYsMzk4MjcsMzk4MTEsMzk4MjUsMzk4MzAsMzk4MzEsMzk4MzksMzk4NDAsMzk4NDgsMzk4NjAsMzk4NzIsMzk4ODIsMzk4NjUsMzk4NzgsMzk4ODcsMzk4ODksMzk4OTAsMzk5MDcsMzk5MDYsMzk5MDgsMzk4OTIsMzk5MDUsMzk5OTQsMzk5MjIsMzk5MjEsMzk5MjAsMzk5NTcsMzk5NTYsMzk5NDUsMzk5NTUsMzk5NDgsMzk5NDIsMzk5NDQsMzk5NTQsMzk5NDYsMzk5NDAsMzk5ODIsMzk5NjMsMzk5NzMsMzk5NzIsMzk5NjksMzk5ODQsNDAwMDcsMzk5ODYsNDAwMDYsMzk5OTgsNDAwMjYsNDAwMzIsNDAwMzksNDAwNTQsNDAwNTYsNDAxNjcsNDAxNzIsNDAxNzYsNDAyMDEsNDAyMDAsNDAxNzEsNDAxOTUsNDAxOTgsNDAyMzQsNDAyMzAsNDAzNjcsNDAyMjcsNDAyMjMsNDAyNjAsNDAyMTMsNDAyMTAsNDAyNTcsNDAyNTUsNDAyNTQsNDAyNjIsNDAyNjQsNDAyODUsNDAyODYsNDAyOTIsNDAyNzMsNDAyNzIsNDAyODEsNDAzMDYsNDAzMjksNDAzMjcsNDAzNjMsNDAzMDMsNDAzMTQsNDAzNDYsNDAzNTYsNDAzNjEsNDAzNzAsNDAzODgsNDAzODUsNDAzNzksNDAzNzYsNDAzNzgsNDAzOTAsNDAzOTksNDAzODYsNDA0MDksNDA0MDMsNDA0NDAsNDA0MjIsNDA0MjksNDA0MzEsNDA0NDUsNDA0NzQsNDA0NzUsNDA0NzgsNDA1NjUsNDA1NjksNDA1NzMsNDA1NzcsNDA1ODQsNDA1ODcsNDA1ODgsNDA1OTQsNDA1OTcsNDA1OTMsNDA2MDUsNDA2MTMsNDA2MTcsNDA2MzIsNDA2MTgsNDA2MjEsMzg3NTMsNDA2NTIsNDA2NTQsNDA2NTUsNDA2NTYsNDA2NjAsNDA2NjgsNDA2NzAsNDA2NjksNDA2NzIsNDA2NzcsNDA2ODAsNDA2ODcsNDA2OTIsNDA2OTQsNDA2OTUsNDA2OTcsNDA2OTksNDA3MDAsNDA3MDEsNDA3MTEsNDA3MTIsMzAzOTEsNDA3MjUsNDA3MzcsNDA3NDgsNDA3NjYsNDA3NzgsNDA3ODYsNDA3ODgsNDA4MDMsNDA3OTksNDA4MDAsNDA4MDEsNDA4MDYsNDA4MDcsNDA4MTIsNDA4MTAsNDA4MjMsNDA4MTgsNDA4MjIsNDA4NTMsNDA4NjAsNDA4NjQsMjI1NzUsMjcwNzksMzY5NTMsMjk3OTYsMjA5NTYsMjkwODEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDMyMzk0LDM1MTAwLDM3NzA0LDM3NTEyLDM0MDEyLDIwNDI1LDI4ODU5LDI2MTYxLDI2ODI0LDM3NjI1LDI2MzYzLDI0Mzg5LDIwMDA4LDIwMTkzLDIwMjIwLDIwMjI0LDIwMjI3LDIwMjgxLDIwMzEwLDIwMzcwLDIwMzYyLDIwMzc4LDIwMzcyLDIwNDI5LDIwNTQ0LDIwNTE0LDIwNDc5LDIwNTEwLDIwNTUwLDIwNTkyLDIwNTQ2LDIwNjI4LDIwNzI0LDIwNjk2LDIwODEwLDIwODM2LDIwODkzLDIwOTI2LDIwOTcyLDIxMDEzLDIxMTQ4LDIxMTU4LDIxMTg0LDIxMjExLDIxMjQ4LDIxMjU1LDIxMjg0LDIxMzYyLDIxMzk1LDIxNDI2LDIxNDY5LDY0MDE0LDIxNjYwLDIxNjQyLDIxNjczLDIxNzU5LDIxODk0LDIyMzYxLDIyMzczLDIyNDQ0LDIyNDcyLDIyNDcxLDY0MDE1LDY0MDE2LDIyNjg2LDIyNzA2LDIyNzk1LDIyODY3LDIyODc1LDIyODc3LDIyODgzLDIyOTQ4LDIyOTcwLDIzMzgyLDIzNDg4LDI5OTk5LDIzNTEyLDIzNTMyLDIzNTgyLDIzNzE4LDIzNzM4LDIzNzk3LDIzODQ3LDIzODkxLDY0MDE3LDIzODc0LDIzOTE3LDIzOTkyLDIzOTkzLDI0MDE2LDI0MzUzLDI0MzcyLDI0NDIzLDI0NTAzLDI0NTQyLDI0NjY5LDI0NzA5LDI0NzE0LDI0Nzk4LDI0Nzg5LDI0ODY0LDI0ODE4LDI0ODQ5LDI0ODg3LDI0ODgwLDI0OTg0LDI1MTA3LDI1MjU0LDI1NTg5LDI1Njk2LDI1NzU3LDI1ODA2LDI1OTM0LDI2MTEyLDI2MTMzLDI2MTcxLDI2MTIxLDI2MTU4LDI2MTQyLDI2MTQ4LDI2MjEzLDI2MTk5LDI2MjAxLDY0MDE4LDI2MjI3LDI2MjY1LDI2MjcyLDI2MjkwLDI2MzAzLDI2MzYyLDI2MzgyLDYzNzg1LDI2NDcwLDI2NTU1LDI2NzA2LDI2NTYwLDI2NjI1LDI2NjkyLDI2ODMxLDY0MDE5LDI2OTg0LDY0MDIwLDI3MDMyLDI3MTA2LDI3MTg0LDI3MjQzLDI3MjA2LDI3MjUxLDI3MjYyLDI3MzYyLDI3MzY0LDI3NjA2LDI3NzExLDI3NzQwLDI3NzgyLDI3NzU5LDI3ODY2LDI3OTA4LDI4MDM5LDI4MDE1LDI4MDU0LDI4MDc2LDI4MTExLDI4MTUyLDI4MTQ2LDI4MTU2LDI4MjE3LDI4MjUyLDI4MTk5LDI4MjIwLDI4MzUxLDI4NTUyLDI4NTk3LDI4NjYxLDI4Njc3LDI4Njc5LDI4NzEyLDI4ODA1LDI4ODQzLDI4OTQzLDI4OTMyLDI5MDIwLDI4OTk4LDI4OTk5LDY0MDIxLDI5MTIxLDI5MTgyLDI5MzYxLDI5Mzc0LDI5NDc2LDY0MDIyLDI5NTU5LDI5NjI5LDI5NjQxLDI5NjU0LDI5NjY3LDI5NjUwLDI5NzAzLDI5Njg1LDI5NzM0LDI5NzM4LDI5NzM3LDI5NzQyLDI5Nzk0LDI5ODMzLDI5ODU1LDI5OTUzLDMwMDYzLDMwMzM4LDMwMzY0LDMwMzY2LDMwMzYzLDMwMzc0LDY0MDIzLDMwNTM0LDIxMTY3LDMwNzUzLDMwNzk4LDMwODIwLDMwODQyLDMxMDI0LDY0MDI0LDY0MDI1LDY0MDI2LDMxMTI0LDY0MDI3LDMxMTMxLDMxNDQxLDMxNDYzLDY0MDI4LDMxNDY3LDMxNjQ2LDY0MDI5LDMyMDcyLDMyMDkyLDMyMTgzLDMyMTYwLDMyMjE0LDMyMzM4LDMyNTgzLDMyNjczLDY0MDMwLDMzNTM3LDMzNjM0LDMzNjYzLDMzNzM1LDMzNzgyLDMzODY0LDMzOTcyLDM0MTMxLDM0MTM3LDM0MTU1LDY0MDMxLDM0MjI0LDY0MDMyLDY0MDMzLDM0ODIzLDM1MDYxLDM1MzQ2LDM1MzgzLDM1NDQ5LDM1NDk1LDM1NTE4LDM1NTUxLDY0MDM0LDM1NTc0LDM1NjY3LDM1NzExLDM2MDgwLDM2MDg0LDM2MTE0LDM2MjE0LDY0MDM1LDM2NTU5LDY0MDM2LDY0MDM3LDM2OTY3LDM3MDg2LDY0MDM4LDM3MTQxLDM3MTU5LDM3MzM4LDM3MzM1LDM3MzQyLDM3MzU3LDM3MzU4LDM3MzQ4LDM3MzQ5LDM3MzgyLDM3MzkyLDM3Mzg2LDM3NDM0LDM3NDQwLDM3NDM2LDM3NDU0LDM3NDY1LDM3NDU3LDM3NDMzLDM3NDc5LDM3NTQzLDM3NDk1LDM3NDk2LDM3NjA3LDM3NTkxLDM3NTkzLDM3NTg0LDY0MDM5LDM3NTg5LDM3NjAwLDM3NTg3LDM3NjY5LDM3NjY1LDM3NjI3LDY0MDQwLDM3NjYyLDM3NjMxLDM3NjYxLDM3NjM0LDM3NzQ0LDM3NzE5LDM3Nzk2LDM3ODMwLDM3ODU0LDM3ODgwLDM3OTM3LDM3OTU3LDM3OTYwLDM4MjkwLDYzOTY0LDY0MDQxLDM4NTU3LDM4NTc1LDM4NzA3LDM4NzE1LDM4NzIzLDM4NzMzLDM4NzM1LDM4NzM3LDM4NzQxLDM4OTk5LDM5MDEzLDY0MDQyLDY0MDQzLDM5MjA3LDY0MDQ0LDM5MzI2LDM5NTAyLDM5NjQxLDM5NjQ0LDM5Nzk3LDM5Nzk0LDM5ODIzLDM5ODU3LDM5ODY3LDM5OTM2LDQwMzA0LDQwMjk5LDY0MDQ1LDQwNDczLDQwNjU3LG51bGwsbnVsbCw4NTYwLDg1NjEsODU2Miw4NTYzLDg1NjQsODU2NSw4NTY2LDg1NjcsODU2OCw4NTY5LDY1NTA2LDY1NTA4LDY1Mjg3LDY1MjgyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsODU2MCw4NTYxLDg1NjIsODU2Myw4NTY0LDg1NjUsODU2Niw4NTY3LDg1NjgsODU2OSw4NTQ0LDg1NDUsODU0Niw4NTQ3LDg1NDgsODU0OSw4NTUwLDg1NTEsODU1Miw4NTUzLDY1NTA2LDY1NTA4LDY1Mjg3LDY1MjgyLDEyODQ5LDg0NzAsODQ4MSw4NzU3LDMyMzk0LDM1MTAwLDM3NzA0LDM3NTEyLDM0MDEyLDIwNDI1LDI4ODU5LDI2MTYxLDI2ODI0LDM3NjI1LDI2MzYzLDI0Mzg5LDIwMDA4LDIwMTkzLDIwMjIwLDIwMjI0LDIwMjI3LDIwMjgxLDIwMzEwLDIwMzcwLDIwMzYyLDIwMzc4LDIwMzcyLDIwNDI5LDIwNTQ0LDIwNTE0LDIwNDc5LDIwNTEwLDIwNTUwLDIwNTkyLDIwNTQ2LDIwNjI4LDIwNzI0LDIwNjk2LDIwODEwLDIwODM2LDIwODkzLDIwOTI2LDIwOTcyLDIxMDEzLDIxMTQ4LDIxMTU4LDIxMTg0LDIxMjExLDIxMjQ4LDIxMjU1LDIxMjg0LDIxMzYyLDIxMzk1LDIxNDI2LDIxNDY5LDY0MDE0LDIxNjYwLDIxNjQyLDIxNjczLDIxNzU5LDIxODk0LDIyMzYxLDIyMzczLDIyNDQ0LDIyNDcyLDIyNDcxLDY0MDE1LDY0MDE2LDIyNjg2LDIyNzA2LDIyNzk1LDIyODY3LDIyODc1LDIyODc3LDIyODgzLDIyOTQ4LDIyOTcwLDIzMzgyLDIzNDg4LDI5OTk5LDIzNTEyLDIzNTMyLDIzNTgyLDIzNzE4LDIzNzM4LDIzNzk3LDIzODQ3LDIzODkxLDY0MDE3LDIzODc0LDIzOTE3LDIzOTkyLDIzOTkzLDI0MDE2LDI0MzUzLDI0MzcyLDI0NDIzLDI0NTAzLDI0NTQyLDI0NjY5LDI0NzA5LDI0NzE0LDI0Nzk4LDI0Nzg5LDI0ODY0LDI0ODE4LDI0ODQ5LDI0ODg3LDI0ODgwLDI0OTg0LDI1MTA3LDI1MjU0LDI1NTg5LDI1Njk2LDI1NzU3LDI1ODA2LDI1OTM0LDI2MTEyLDI2MTMzLDI2MTcxLDI2MTIxLDI2MTU4LDI2MTQyLDI2MTQ4LDI2MjEzLDI2MTk5LDI2MjAxLDY0MDE4LDI2MjI3LDI2MjY1LDI2MjcyLDI2MjkwLDI2MzAzLDI2MzYyLDI2MzgyLDYzNzg1LDI2NDcwLDI2NTU1LDI2NzA2LDI2NTYwLDI2NjI1LDI2NjkyLDI2ODMxLDY0MDE5LDI2OTg0LDY0MDIwLDI3MDMyLDI3MTA2LDI3MTg0LDI3MjQzLDI3MjA2LDI3MjUxLDI3MjYyLDI3MzYyLDI3MzY0LDI3NjA2LDI3NzExLDI3NzQwLDI3NzgyLDI3NzU5LDI3ODY2LDI3OTA4LDI4MDM5LDI4MDE1LDI4MDU0LDI4MDc2LDI4MTExLDI4MTUyLDI4MTQ2LDI4MTU2LDI4MjE3LDI4MjUyLDI4MTk5LDI4MjIwLDI4MzUxLDI4NTUyLDI4NTk3LDI4NjYxLDI4Njc3LDI4Njc5LDI4NzEyLDI4ODA1LDI4ODQzLDI4OTQzLDI4OTMyLDI5MDIwLDI4OTk4LDI4OTk5LDY0MDIxLDI5MTIxLDI5MTgyLDI5MzYxLDI5Mzc0LDI5NDc2LDY0MDIyLDI5NTU5LDI5NjI5LDI5NjQxLDI5NjU0LDI5NjY3LDI5NjUwLDI5NzAzLDI5Njg1LDI5NzM0LDI5NzM4LDI5NzM3LDI5NzQyLDI5Nzk0LDI5ODMzLDI5ODU1LDI5OTUzLDMwMDYzLDMwMzM4LDMwMzY0LDMwMzY2LDMwMzYzLDMwMzc0LDY0MDIzLDMwNTM0LDIxMTY3LDMwNzUzLDMwNzk4LDMwODIwLDMwODQyLDMxMDI0LDY0MDI0LDY0MDI1LDY0MDI2LDMxMTI0LDY0MDI3LDMxMTMxLDMxNDQxLDMxNDYzLDY0MDI4LDMxNDY3LDMxNjQ2LDY0MDI5LDMyMDcyLDMyMDkyLDMyMTgzLDMyMTYwLDMyMjE0LDMyMzM4LDMyNTgzLDMyNjczLDY0MDMwLDMzNTM3LDMzNjM0LDMzNjYzLDMzNzM1LDMzNzgyLDMzODY0LDMzOTcyLDM0MTMxLDM0MTM3LDM0MTU1LDY0MDMxLDM0MjI0LDY0MDMyLDY0MDMzLDM0ODIzLDM1MDYxLDM1MzQ2LDM1MzgzLDM1NDQ5LDM1NDk1LDM1NTE4LDM1NTUxLDY0MDM0LDM1NTc0LDM1NjY3LDM1NzExLDM2MDgwLDM2MDg0LDM2MTE0LDM2MjE0LDY0MDM1LDM2NTU5LDY0MDM2LDY0MDM3LDM2OTY3LDM3MDg2LDY0MDM4LDM3MTQxLDM3MTU5LDM3MzM4LDM3MzM1LDM3MzQyLDM3MzU3LDM3MzU4LDM3MzQ4LDM3MzQ5LDM3MzgyLDM3MzkyLDM3Mzg2LDM3NDM0LDM3NDQwLDM3NDM2LDM3NDU0LDM3NDY1LDM3NDU3LDM3NDMzLDM3NDc5LDM3NTQzLDM3NDk1LDM3NDk2LDM3NjA3LDM3NTkxLDM3NTkzLDM3NTg0LDY0MDM5LDM3NTg5LDM3NjAwLDM3NTg3LDM3NjY5LDM3NjY1LDM3NjI3LDY0MDQwLDM3NjYyLDM3NjMxLDM3NjYxLDM3NjM0LDM3NzQ0LDM3NzE5LDM3Nzk2LDM3ODMwLDM3ODU0LDM3ODgwLDM3OTM3LDM3OTU3LDM3OTYwLDM4MjkwLDYzOTY0LDY0MDQxLDM4NTU3LDM4NTc1LDM4NzA3LDM4NzE1LDM4NzIzLDM4NzMzLDM4NzM1LDM4NzM3LDM4NzQxLDM4OTk5LDM5MDEzLDY0MDQyLDY0MDQzLDM5MjA3LDY0MDQ0LDM5MzI2LDM5NTAyLDM5NjQxLDM5NjQ0LDM5Nzk3LDM5Nzk0LDM5ODIzLDM5ODU3LDM5ODY3LDM5OTM2LDQwMzA0LDQwMjk5LDY0MDQ1LDQwNDczLDQwNjU3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sXG4gIFwiamlzMDIxMlwiOltudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw3MjgsNzExLDE4NCw3MjksNzMzLDE3NSw3MzEsNzMwLDY1Mzc0LDkwMCw5MDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE2MSwxNjYsMTkxLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxODYsMTcwLDE2OSwxNzQsODQ4MiwxNjQsODQ3MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsOTAyLDkwNCw5MDUsOTA2LDkzOCxudWxsLDkwOCxudWxsLDkxMCw5MzksbnVsbCw5MTEsbnVsbCxudWxsLG51bGwsbnVsbCw5NDAsOTQxLDk0Miw5NDMsOTcwLDkxMiw5NzIsOTYyLDk3Myw5NzEsOTQ0LDk3NCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDEwMzgsMTAzOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTEwNiwxMTA3LDExMDgsMTEwOSwxMTEwLDExMTEsMTExMiwxMTEzLDExMTQsMTExNSwxMTE2LDExMTgsMTExOSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE5OCwyNzIsbnVsbCwyOTQsbnVsbCwzMDYsbnVsbCwzMjEsMzE5LG51bGwsMzMwLDIxNiwzMzgsbnVsbCwzNTgsMjIyLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjMwLDI3MywyNDAsMjk1LDMwNSwzMDcsMzEyLDMyMiwzMjAsMzI5LDMzMSwyNDgsMzM5LDIyMywzNTksMjU0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTkzLDE5MiwxOTYsMTk0LDI1OCw0NjEsMjU2LDI2MCwxOTcsMTk1LDI2MiwyNjQsMjY4LDE5OSwyNjYsMjcwLDIwMSwyMDAsMjAzLDIwMiwyODIsMjc4LDI3NCwyODAsbnVsbCwyODQsMjg2LDI5MCwyODgsMjkyLDIwNSwyMDQsMjA3LDIwNiw0NjMsMzA0LDI5OCwzMDIsMjk2LDMwOCwzMTAsMzEzLDMxNywzMTUsMzIzLDMyNywzMjUsMjA5LDIxMSwyMTAsMjE0LDIxMiw0NjUsMzM2LDMzMiwyMTMsMzQwLDM0NCwzNDIsMzQ2LDM0OCwzNTIsMzUwLDM1NiwzNTQsMjE4LDIxNywyMjAsMjE5LDM2NCw0NjcsMzY4LDM2MiwzNzAsMzY2LDM2MCw0NzEsNDc1LDQ3Myw0NjksMzcyLDIyMSwzNzYsMzc0LDM3NywzODEsMzc5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMjI1LDIyNCwyMjgsMjI2LDI1OSw0NjIsMjU3LDI2MSwyMjksMjI3LDI2MywyNjUsMjY5LDIzMSwyNjcsMjcxLDIzMywyMzIsMjM1LDIzNCwyODMsMjc5LDI3NSwyODEsNTAxLDI4NSwyODcsbnVsbCwyODksMjkzLDIzNywyMzYsMjM5LDIzOCw0NjQsbnVsbCwyOTksMzAzLDI5NywzMDksMzExLDMxNCwzMTgsMzE2LDMyNCwzMjgsMzI2LDI0MSwyNDMsMjQyLDI0NiwyNDQsNDY2LDMzNywzMzMsMjQ1LDM0MSwzNDUsMzQzLDM0NywzNDksMzUzLDM1MSwzNTcsMzU1LDI1MCwyNDksMjUyLDI1MSwzNjUsNDY4LDM2OSwzNjMsMzcxLDM2NywzNjEsNDcyLDQ3Niw0NzQsNDcwLDM3MywyNTMsMjU1LDM3NSwzNzgsMzgyLDM4MCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTk5NzAsMTk5NzIsMTk5NzMsMTk5ODAsMTk5ODYsMTk5OTksMjAwMDMsMjAwMDQsMjAwMDgsMjAwMTEsMjAwMTQsMjAwMTUsMjAwMTYsMjAwMjEsMjAwMzIsMjAwMzMsMjAwMzYsMjAwMzksMjAwNDksMjAwNTgsMjAwNjAsMjAwNjcsMjAwNzIsMjAwNzMsMjAwODQsMjAwODUsMjAwODksMjAwOTUsMjAxMDksMjAxMTgsMjAxMTksMjAxMjUsMjAxNDMsMjAxNTMsMjAxNjMsMjAxNzYsMjAxODYsMjAxODcsMjAxOTIsMjAxOTMsMjAxOTQsMjAyMDAsMjAyMDcsMjAyMDksMjAyMTEsMjAyMTMsMjAyMjEsMjAyMjIsMjAyMjMsMjAyMjQsMjAyMjYsMjAyMjcsMjAyMzIsMjAyMzUsMjAyMzYsMjAyNDIsMjAyNDUsMjAyNDYsMjAyNDcsMjAyNDksMjAyNzAsMjAyNzMsMjAzMjAsMjAyNzUsMjAyNzcsMjAyNzksMjAyODEsMjAyODMsMjAyODYsMjAyODgsMjAyOTAsMjAyOTYsMjAyOTcsMjAyOTksMjAzMDAsMjAzMDYsMjAzMDgsMjAzMTAsMjAzMTIsMjAzMTksMjAzMjMsMjAzMzAsMjAzMzIsMjAzMzQsMjAzMzcsMjAzNDMsMjAzNDQsMjAzNDUsMjAzNDYsMjAzNDksMjAzNTAsMjAzNTMsMjAzNTQsMjAzNTYsMjAzNTcsMjAzNjEsMjAzNjIsMjAzNjQsMjAzNjYsMjAzNjgsMjAzNzAsMjAzNzEsMjAzNzIsMjAzNzUsMjAzNzcsMjAzNzgsMjAzODIsMjAzODMsMjA0MDIsMjA0MDcsMjA0MDksMjA0MTEsMjA0MTIsMjA0MTMsMjA0MTQsMjA0MTYsMjA0MTcsMjA0MjEsMjA0MjIsMjA0MjQsMjA0MjUsMjA0MjcsMjA0MjgsMjA0MjksMjA0MzEsMjA0MzQsMjA0NDQsMjA0NDgsMjA0NTAsMjA0NjQsMjA0NjYsMjA0NzYsMjA0NzcsMjA0NzksMjA0ODAsMjA0ODEsMjA0ODQsMjA0ODcsMjA0OTAsMjA0OTIsMjA0OTQsMjA0OTYsMjA0OTksMjA1MDMsMjA1MDQsMjA1MDcsMjA1MDgsMjA1MDksMjA1MTAsMjA1MTQsMjA1MTksMjA1MjYsMjA1MjgsMjA1MzAsMjA1MzEsMjA1MzMsMjA1NDQsMjA1NDUsMjA1NDYsMjA1NDksMjA1NTAsMjA1NTQsMjA1NTYsMjA1NTgsMjA1NjEsMjA1NjIsMjA1NjMsMjA1NjcsMjA1NjksMjA1NzUsMjA1NzYsMjA1NzgsMjA1NzksMjA1ODIsMjA1ODMsMjA1ODYsMjA1ODksMjA1OTIsMjA1OTMsMjA1MzksMjA2MDksMjA2MTEsMjA2MTIsMjA2MTQsMjA2MTgsMjA2MjIsMjA2MjMsMjA2MjQsMjA2MjYsMjA2MjcsMjA2MjgsMjA2MzAsMjA2MzUsMjA2MzYsMjA2MzgsMjA2MzksMjA2NDAsMjA2NDEsMjA2NDIsMjA2NTAsMjA2NTUsMjA2NTYsMjA2NjUsMjA2NjYsMjA2NjksMjA2NzIsMjA2NzUsMjA2NzYsMjA2NzksMjA2ODQsMjA2ODYsMjA2ODgsMjA2OTEsMjA2OTIsMjA2OTYsMjA3MDAsMjA3MDEsMjA3MDMsMjA3MDYsMjA3MDgsMjA3MTAsMjA3MTIsMjA3MTMsMjA3MTksMjA3MjEsMjA3MjYsMjA3MzAsMjA3MzQsMjA3MzksMjA3NDIsMjA3NDMsMjA3NDQsMjA3NDcsMjA3NDgsMjA3NDksMjA3NTAsMjA3MjIsMjA3NTIsMjA3NTksMjA3NjEsMjA3NjMsMjA3NjQsMjA3NjUsMjA3NjYsMjA3NzEsMjA3NzUsMjA3NzYsMjA3ODAsMjA3ODEsMjA3ODMsMjA3ODUsMjA3ODcsMjA3ODgsMjA3ODksMjA3OTIsMjA3OTMsMjA4MDIsMjA4MTAsMjA4MTUsMjA4MTksMjA4MjEsMjA4MjMsMjA4MjQsMjA4MzEsMjA4MzYsMjA4MzgsMjA4NjIsMjA4NjcsMjA4NjgsMjA4NzUsMjA4NzgsMjA4ODgsMjA4OTMsMjA4OTcsMjA4OTksMjA5MDksMjA5MjAsMjA5MjIsMjA5MjQsMjA5MjYsMjA5MjcsMjA5MzAsMjA5MzYsMjA5NDMsMjA5NDUsMjA5NDYsMjA5NDcsMjA5NDksMjA5NTIsMjA5NTgsMjA5NjIsMjA5NjUsMjA5NzQsMjA5NzgsMjA5NzksMjA5ODAsMjA5ODMsMjA5OTMsMjA5OTQsMjA5OTcsMjEwMTAsMjEwMTEsMjEwMTMsMjEwMTQsMjEwMTYsMjEwMjYsMjEwMzIsMjEwNDEsMjEwNDIsMjEwNDUsMjEwNTIsMjEwNjEsMjEwNjUsMjEwNzcsMjEwNzksMjEwODAsMjEwODIsMjEwODQsMjEwODcsMjEwODgsMjEwODksMjEwOTQsMjExMDIsMjExMTEsMjExMTIsMjExMTMsMjExMjAsMjExMjIsMjExMjUsMjExMzAsMjExMzIsMjExMzksMjExNDEsMjExNDIsMjExNDMsMjExNDQsMjExNDYsMjExNDgsMjExNTYsMjExNTcsMjExNTgsMjExNTksMjExNjcsMjExNjgsMjExNzQsMjExNzUsMjExNzYsMjExNzgsMjExNzksMjExODEsMjExODQsMjExODgsMjExOTAsMjExOTIsMjExOTYsMjExOTksMjEyMDEsMjEyMDQsMjEyMDYsMjEyMTEsMjEyMTIsMjEyMTcsMjEyMjEsMjEyMjQsMjEyMjUsMjEyMjYsMjEyMjgsMjEyMzIsMjEyMzMsMjEyMzYsMjEyMzgsMjEyMzksMjEyNDgsMjEyNTEsMjEyNTgsMjEyNTksMjEyNjAsMjEyNjUsMjEyNjcsMjEyNzIsMjEyNzUsMjEyNzYsMjEyNzgsMjEyNzksMjEyODUsMjEyODcsMjEyODgsMjEyODksMjEyOTEsMjEyOTIsMjEyOTMsMjEyOTYsMjEyOTgsMjEzMDEsMjEzMDgsMjEzMDksMjEzMTAsMjEzMTQsMjEzMjQsMjEzMjMsMjEzMzcsMjEzMzksMjEzNDUsMjEzNDcsMjEzNDksMjEzNTYsMjEzNTcsMjEzNjIsMjEzNjksMjEzNzQsMjEzNzksMjEzODMsMjEzODQsMjEzOTAsMjEzOTUsMjEzOTYsMjE0MDEsMjE0MDUsMjE0MDksMjE0MTIsMjE0MTgsMjE0MTksMjE0MjMsMjE0MjYsMjE0MjgsMjE0MjksMjE0MzEsMjE0MzIsMjE0MzQsMjE0MzcsMjE0NDAsMjE0NDUsMjE0NTUsMjE0NTgsMjE0NTksMjE0NjEsMjE0NjYsMjE0NjksMjE0NzAsMjE0NzIsMjE0NzgsMjE0NzksMjE0OTMsMjE1MDYsMjE1MjMsMjE1MzAsMjE1MzcsMjE1NDMsMjE1NDQsMjE1NDYsMjE1NTEsMjE1NTMsMjE1NTYsMjE1NTcsMjE1NzEsMjE1NzIsMjE1NzUsMjE1ODEsMjE1ODMsMjE1OTgsMjE2MDIsMjE2MDQsMjE2MDYsMjE2MDcsMjE2MDksMjE2MTEsMjE2MTMsMjE2MTQsMjE2MjAsMjE2MzEsMjE2MzMsMjE2MzUsMjE2MzcsMjE2NDAsMjE2NDEsMjE2NDUsMjE2NDksMjE2NTMsMjE2NTQsMjE2NjAsMjE2NjMsMjE2NjUsMjE2NzAsMjE2NzEsMjE2NzMsMjE2NzQsMjE2NzcsMjE2NzgsMjE2ODEsMjE2ODcsMjE2ODksMjE2OTAsMjE2OTEsMjE2OTUsMjE3MDIsMjE3MDYsMjE3MDksMjE3MTAsMjE3MjgsMjE3MzgsMjE3NDAsMjE3NDMsMjE3NTAsMjE3NTYsMjE3NTgsMjE3NTksMjE3NjAsMjE3NjEsMjE3NjUsMjE3NjgsMjE3NjksMjE3NzIsMjE3NzMsMjE3NzQsMjE3ODEsMjE4MDIsMjE4MDMsMjE4MTAsMjE4MTMsMjE4MTQsMjE4MTksMjE4MjAsMjE4MjEsMjE4MjUsMjE4MzEsMjE4MzMsMjE4MzQsMjE4MzcsMjE4NDAsMjE4NDEsMjE4NDgsMjE4NTAsMjE4NTEsMjE4NTQsMjE4NTYsMjE4NTcsMjE4NjAsMjE4NjIsMjE4ODcsMjE4ODksMjE4OTAsMjE4OTQsMjE4OTYsMjE5MDIsMjE5MDMsMjE5MDUsMjE5MDYsMjE5MDcsMjE5MDgsMjE5MTEsMjE5MjMsMjE5MjQsMjE5MzMsMjE5MzgsMjE5NTEsMjE5NTMsMjE5NTUsMjE5NTgsMjE5NjEsMjE5NjMsMjE5NjQsMjE5NjYsMjE5NjksMjE5NzAsMjE5NzEsMjE5NzUsMjE5NzYsMjE5NzksMjE5ODIsMjE5ODYsMjE5OTMsMjIwMDYsMjIwMTUsMjIwMjEsMjIwMjQsMjIwMjYsMjIwMjksMjIwMzAsMjIwMzEsMjIwMzIsMjIwMzMsMjIwMzQsMjIwNDEsMjIwNjAsMjIwNjQsMjIwNjcsMjIwNjksMjIwNzEsMjIwNzMsMjIwNzUsMjIwNzYsMjIwNzcsMjIwNzksMjIwODAsMjIwODEsMjIwODMsMjIwODQsMjIwODYsMjIwODksMjIwOTEsMjIwOTMsMjIwOTUsMjIxMDAsMjIxMTAsMjIxMTIsMjIxMTMsMjIxMTQsMjIxMTUsMjIxMTgsMjIxMjEsMjIxMjUsMjIxMjcsMjIxMjksMjIxMzAsMjIxMzMsMjIxNDgsMjIxNDksMjIxNTIsMjIxNTUsMjIxNTYsMjIxNjUsMjIxNjksMjIxNzAsMjIxNzMsMjIxNzQsMjIxNzUsMjIxODIsMjIxODMsMjIxODQsMjIxODUsMjIxODcsMjIxODgsMjIxODksMjIxOTMsMjIxOTUsMjIxOTksMjIyMDYsMjIyMTMsMjIyMTcsMjIyMTgsMjIyMTksMjIyMjMsMjIyMjQsMjIyMjAsMjIyMjEsMjIyMzMsMjIyMzYsMjIyMzcsMjIyMzksMjIyNDEsMjIyNDQsMjIyNDUsMjIyNDYsMjIyNDcsMjIyNDgsMjIyNTcsMjIyNTEsMjIyNTMsMjIyNjIsMjIyNjMsMjIyNzMsMjIyNzQsMjIyNzksMjIyODIsMjIyODQsMjIyODksMjIyOTMsMjIyOTgsMjIyOTksMjIzMDEsMjIzMDQsMjIzMDYsMjIzMDcsMjIzMDgsMjIzMDksMjIzMTMsMjIzMTQsMjIzMTYsMjIzMTgsMjIzMTksMjIzMjMsMjIzMjQsMjIzMzMsMjIzMzQsMjIzMzUsMjIzNDEsMjIzNDIsMjIzNDgsMjIzNDksMjIzNTQsMjIzNzAsMjIzNzMsMjIzNzUsMjIzNzYsMjIzNzksMjIzODEsMjIzODIsMjIzODMsMjIzODQsMjIzODUsMjIzODcsMjIzODgsMjIzODksMjIzOTEsMjIzOTMsMjIzOTQsMjIzOTUsMjIzOTYsMjIzOTgsMjI0MDEsMjI0MDMsMjI0MTIsMjI0MjAsMjI0MjMsMjI0MjUsMjI0MjYsMjI0MjgsMjI0MjksMjI0MzAsMjI0MzEsMjI0MzMsMjI0MjEsMjI0MzksMjI0NDAsMjI0NDEsMjI0NDQsMjI0NTYsMjI0NjEsMjI0NzEsMjI0NzIsMjI0NzYsMjI0NzksMjI0ODUsMjI0OTMsMjI0OTQsMjI1MDAsMjI1MDIsMjI1MDMsMjI1MDUsMjI1MDksMjI1MTIsMjI1MTcsMjI1MTgsMjI1MjAsMjI1MjUsMjI1MjYsMjI1MjcsMjI1MzEsMjI1MzIsMjI1MzYsMjI1MzcsMjI0OTcsMjI1NDAsMjI1NDEsMjI1NTUsMjI1NTgsMjI1NTksMjI1NjAsMjI1NjYsMjI1NjcsMjI1NzMsMjI1NzgsMjI1ODUsMjI1OTEsMjI2MDEsMjI2MDQsMjI2MDUsMjI2MDcsMjI2MDgsMjI2MTMsMjI2MjMsMjI2MjUsMjI2MjgsMjI2MzEsMjI2MzIsMjI2NDgsMjI2NTIsMjI2NTUsMjI2NTYsMjI2NTcsMjI2NjMsMjI2NjQsMjI2NjUsMjI2NjYsMjI2NjgsMjI2NjksMjI2NzEsMjI2NzIsMjI2NzYsMjI2NzgsMjI2ODUsMjI2ODgsMjI2ODksMjI2OTAsMjI2OTQsMjI2OTcsMjI3MDUsMjI3MDYsMjI3MjQsMjI3MTYsMjI3MjIsMjI3MjgsMjI3MzMsMjI3MzQsMjI3MzYsMjI3MzgsMjI3NDAsMjI3NDIsMjI3NDYsMjI3NDksMjI3NTMsMjI3NTQsMjI3NjEsMjI3NzEsMjI3ODksMjI3OTAsMjI3OTUsMjI3OTYsMjI4MDIsMjI4MDMsMjI4MDQsMzQzNjksMjI4MTMsMjI4MTcsMjI4MTksMjI4MjAsMjI4MjQsMjI4MzEsMjI4MzIsMjI4MzUsMjI4MzcsMjI4MzgsMjI4NDcsMjI4NTEsMjI4NTQsMjI4NjYsMjI4NjcsMjI4NzMsMjI4NzUsMjI4NzcsMjI4NzgsMjI4NzksMjI4ODEsMjI4ODMsMjI4OTEsMjI4OTMsMjI4OTUsMjI4OTgsMjI5MDEsMjI5MDIsMjI5MDUsMjI5MDcsMjI5MDgsMjI5MjMsMjI5MjQsMjI5MjYsMjI5MzAsMjI5MzMsMjI5MzUsMjI5NDMsMjI5NDgsMjI5NTEsMjI5NTcsMjI5NTgsMjI5NTksMjI5NjAsMjI5NjMsMjI5NjcsMjI5NzAsMjI5NzIsMjI5NzcsMjI5NzksMjI5ODAsMjI5ODQsMjI5ODYsMjI5ODksMjI5OTQsMjMwMDUsMjMwMDYsMjMwMDcsMjMwMTEsMjMwMTIsMjMwMTUsMjMwMjIsMjMwMjMsMjMwMjUsMjMwMjYsMjMwMjgsMjMwMzEsMjMwNDAsMjMwNDQsMjMwNTIsMjMwNTMsMjMwNTQsMjMwNTgsMjMwNTksMjMwNzAsMjMwNzUsMjMwNzYsMjMwNzksMjMwODAsMjMwODIsMjMwODUsMjMwODgsMjMxMDgsMjMxMDksMjMxMTEsMjMxMTIsMjMxMTYsMjMxMjAsMjMxMjUsMjMxMzQsMjMxMzksMjMxNDEsMjMxNDMsMjMxNDksMjMxNTksMjMxNjIsMjMxNjMsMjMxNjYsMjMxNzksMjMxODQsMjMxODcsMjMxOTAsMjMxOTMsMjMxOTYsMjMxOTgsMjMxOTksMjMyMDAsMjMyMDIsMjMyMDcsMjMyMTIsMjMyMTcsMjMyMTgsMjMyMTksMjMyMjEsMjMyMjQsMjMyMjYsMjMyMjcsMjMyMzEsMjMyMzYsMjMyMzgsMjMyNDAsMjMyNDcsMjMyNTgsMjMyNjAsMjMyNjQsMjMyNjksMjMyNzQsMjMyNzgsMjMyODUsMjMyODYsMjMyOTMsMjMyOTYsMjMyOTcsMjMzMDQsMjMzMTksMjMzNDgsMjMzMjEsMjMzMjMsMjMzMjUsMjMzMjksMjMzMzMsMjMzNDEsMjMzNTIsMjMzNjEsMjMzNzEsMjMzNzIsMjMzNzgsMjMzODIsMjMzOTAsMjM0MDAsMjM0MDYsMjM0MDcsMjM0MjAsMjM0MjEsMjM0MjIsMjM0MjMsMjM0MjUsMjM0MjgsMjM0MzAsMjM0MzQsMjM0MzgsMjM0NDAsMjM0NDEsMjM0NDMsMjM0NDQsMjM0NDYsMjM0NjQsMjM0NjUsMjM0NjgsMjM0NjksMjM0NzEsMjM0NzMsMjM0NzQsMjM0NzksMjM0ODIsMjM0ODQsMjM0ODgsMjM0ODksMjM1MDEsMjM1MDMsMjM1MTAsMjM1MTEsMjM1MTIsMjM1MTMsMjM1MTQsMjM1MjAsMjM1MzUsMjM1MzcsMjM1NDAsMjM1NDksMjM1NjQsMjM1NzUsMjM1ODIsMjM1ODMsMjM1ODcsMjM1OTAsMjM1OTMsMjM1OTUsMjM1OTYsMjM1OTgsMjM2MDAsMjM2MDIsMjM2MDUsMjM2MDYsMjM2NDEsMjM2NDIsMjM2NDQsMjM2NTAsMjM2NTEsMjM2NTUsMjM2NTYsMjM2NTcsMjM2NjEsMjM2NjQsMjM2NjgsMjM2NjksMjM2NzQsMjM2NzUsMjM2NzYsMjM2NzcsMjM2ODcsMjM2ODgsMjM2OTAsMjM2OTUsMjM2OTgsMjM3MDksMjM3MTEsMjM3MTIsMjM3MTQsMjM3MTUsMjM3MTgsMjM3MjIsMjM3MzAsMjM3MzIsMjM3MzMsMjM3MzgsMjM3NTMsMjM3NTUsMjM3NjIsMjM3NzMsMjM3NjcsMjM3OTAsMjM3OTMsMjM3OTQsMjM3OTYsMjM4MDksMjM4MTQsMjM4MjEsMjM4MjYsMjM4NTEsMjM4NDMsMjM4NDQsMjM4NDYsMjM4NDcsMjM4NTcsMjM4NjAsMjM4NjUsMjM4NjksMjM4NzEsMjM4NzQsMjM4NzUsMjM4NzgsMjM4ODAsMjM4OTMsMjM4ODksMjM4OTcsMjM4ODIsMjM5MDMsMjM5MDQsMjM5MDUsMjM5MDYsMjM5MDgsMjM5MTQsMjM5MTcsMjM5MjAsMjM5MjksMjM5MzAsMjM5MzQsMjM5MzUsMjM5MzcsMjM5MzksMjM5NDQsMjM5NDYsMjM5NTQsMjM5NTUsMjM5NTYsMjM5NTcsMjM5NjEsMjM5NjMsMjM5NjcsMjM5NjgsMjM5NzUsMjM5NzksMjM5ODQsMjM5ODgsMjM5OTIsMjM5OTMsMjQwMDMsMjQwMDcsMjQwMTEsMjQwMTYsMjQwMTQsMjQwMjQsMjQwMjUsMjQwMzIsMjQwMzYsMjQwNDEsMjQwNTYsMjQwNTcsMjQwNjQsMjQwNzEsMjQwNzcsMjQwODIsMjQwODQsMjQwODUsMjQwODgsMjQwOTUsMjQwOTYsMjQxMTAsMjQxMDQsMjQxMTQsMjQxMTcsMjQxMjYsMjQxMzksMjQxNDQsMjQxMzcsMjQxNDUsMjQxNTAsMjQxNTIsMjQxNTUsMjQxNTYsMjQxNTgsMjQxNjgsMjQxNzAsMjQxNzEsMjQxNzIsMjQxNzMsMjQxNzQsMjQxNzYsMjQxOTIsMjQyMDMsMjQyMDYsMjQyMjYsMjQyMjgsMjQyMjksMjQyMzIsMjQyMzQsMjQyMzYsMjQyNDEsMjQyNDMsMjQyNTMsMjQyNTQsMjQyNTUsMjQyNjIsMjQyNjgsMjQyNjcsMjQyNzAsMjQyNzMsMjQyNzQsMjQyNzYsMjQyNzcsMjQyODQsMjQyODYsMjQyOTMsMjQyOTksMjQzMjIsMjQzMjYsMjQzMjcsMjQzMjgsMjQzMzQsMjQzNDUsMjQzNDgsMjQzNDksMjQzNTMsMjQzNTQsMjQzNTUsMjQzNTYsMjQzNjAsMjQzNjMsMjQzNjQsMjQzNjYsMjQzNjgsMjQzNzIsMjQzNzQsMjQzNzksMjQzODEsMjQzODMsMjQzODQsMjQzODgsMjQzODksMjQzOTEsMjQzOTcsMjQ0MDAsMjQ0MDQsMjQ0MDgsMjQ0MTEsMjQ0MTYsMjQ0MTksMjQ0MjAsMjQ0MjMsMjQ0MzEsMjQ0MzQsMjQ0MzYsMjQ0MzcsMjQ0NDAsMjQ0NDIsMjQ0NDUsMjQ0NDYsMjQ0NTcsMjQ0NjEsMjQ0NjMsMjQ0NzAsMjQ0NzYsMjQ0NzcsMjQ0ODIsMjQ0ODcsMjQ0OTEsMjQ0ODQsMjQ0OTIsMjQ0OTUsMjQ0OTYsMjQ0OTcsMjQ1MDQsMjQ1MTYsMjQ1MTksMjQ1MjAsMjQ1MjEsMjQ1MjMsMjQ1MjgsMjQ1MjksMjQ1MzAsMjQ1MzEsMjQ1MzIsMjQ1NDIsMjQ1NDUsMjQ1NDYsMjQ1NTIsMjQ1NTMsMjQ1NTQsMjQ1NTYsMjQ1NTcsMjQ1NTgsMjQ1NTksMjQ1NjIsMjQ1NjMsMjQ1NjYsMjQ1NzAsMjQ1NzIsMjQ1ODMsMjQ1ODYsMjQ1ODksMjQ1OTUsMjQ1OTYsMjQ1OTksMjQ2MDAsMjQ2MDIsMjQ2MDcsMjQ2MTIsMjQ2MjEsMjQ2MjcsMjQ2MjksMjQ2NDAsMjQ2NDcsMjQ2NDgsMjQ2NDksMjQ2NTIsMjQ2NTcsMjQ2NjAsMjQ2NjIsMjQ2NjMsMjQ2NjksMjQ2NzMsMjQ2NzksMjQ2ODksMjQ3MDIsMjQ3MDMsMjQ3MDYsMjQ3MTAsMjQ3MTIsMjQ3MTQsMjQ3MTgsMjQ3MjEsMjQ3MjMsMjQ3MjUsMjQ3MjgsMjQ3MzMsMjQ3MzQsMjQ3MzgsMjQ3NDAsMjQ3NDEsMjQ3NDQsMjQ3NTIsMjQ3NTMsMjQ3NTksMjQ3NjMsMjQ3NjYsMjQ3NzAsMjQ3NzIsMjQ3NzYsMjQ3NzcsMjQ3NzgsMjQ3NzksMjQ3ODIsMjQ3ODMsMjQ3ODgsMjQ3ODksMjQ3OTMsMjQ3OTUsMjQ3OTcsMjQ3OTgsMjQ4MDIsMjQ4MDUsMjQ4MTgsMjQ4MjEsMjQ4MjQsMjQ4MjgsMjQ4MjksMjQ4MzQsMjQ4MzksMjQ4NDIsMjQ4NDQsMjQ4NDgsMjQ4NDksMjQ4NTAsMjQ4NTEsMjQ4NTIsMjQ4NTQsMjQ4NTUsMjQ4NTcsMjQ4NjAsMjQ4NjIsMjQ4NjYsMjQ4NzQsMjQ4NzUsMjQ4ODAsMjQ4ODEsMjQ4ODUsMjQ4ODYsMjQ4ODcsMjQ4ODksMjQ4OTcsMjQ5MDEsMjQ5MDIsMjQ5MDUsMjQ5MjYsMjQ5MjgsMjQ5NDAsMjQ5NDYsMjQ5NTIsMjQ5NTUsMjQ5NTYsMjQ5NTksMjQ5NjAsMjQ5NjEsMjQ5NjMsMjQ5NjQsMjQ5NzEsMjQ5NzMsMjQ5NzgsMjQ5NzksMjQ5ODMsMjQ5ODQsMjQ5ODgsMjQ5ODksMjQ5OTEsMjQ5OTIsMjQ5OTcsMjUwMDAsMjUwMDIsMjUwMDUsMjUwMTYsMjUwMTcsMjUwMjAsMjUwMjQsMjUwMjUsMjUwMjYsMjUwMzgsMjUwMzksMjUwNDUsMjUwNTIsMjUwNTMsMjUwNTQsMjUwNTUsMjUwNTcsMjUwNTgsMjUwNjMsMjUwNjUsMjUwNjEsMjUwNjgsMjUwNjksMjUwNzEsMjUwODksMjUwOTEsMjUwOTIsMjUwOTUsMjUxMDcsMjUxMDksMjUxMTYsMjUxMjAsMjUxMjIsMjUxMjMsMjUxMjcsMjUxMjksMjUxMzEsMjUxNDUsMjUxNDksMjUxNTQsMjUxNTUsMjUxNTYsMjUxNTgsMjUxNjQsMjUxNjgsMjUxNjksMjUxNzAsMjUxNzIsMjUxNzQsMjUxNzgsMjUxODAsMjUxODgsMjUxOTcsMjUxOTksMjUyMDMsMjUyMTAsMjUyMTMsMjUyMjksMjUyMzAsMjUyMzEsMjUyMzIsMjUyNTQsMjUyNTYsMjUyNjcsMjUyNzAsMjUyNzEsMjUyNzQsMjUyNzgsMjUyNzksMjUyODQsMjUyOTQsMjUzMDEsMjUzMDIsMjUzMDYsMjUzMjIsMjUzMzAsMjUzMzIsMjUzNDAsMjUzNDEsMjUzNDcsMjUzNDgsMjUzNTQsMjUzNTUsMjUzNTcsMjUzNjAsMjUzNjMsMjUzNjYsMjUzNjgsMjUzODUsMjUzODYsMjUzODksMjUzOTcsMjUzOTgsMjU0MDEsMjU0MDQsMjU0MDksMjU0MTAsMjU0MTEsMjU0MTIsMjU0MTQsMjU0MTgsMjU0MTksMjU0MjIsMjU0MjYsMjU0MjcsMjU0MjgsMjU0MzIsMjU0MzUsMjU0NDUsMjU0NDYsMjU0NTIsMjU0NTMsMjU0NTcsMjU0NjAsMjU0NjEsMjU0NjQsMjU0NjgsMjU0NjksMjU0NzEsMjU0NzQsMjU0NzYsMjU0NzksMjU0ODIsMjU0ODgsMjU0OTIsMjU0OTMsMjU0OTcsMjU0OTgsMjU1MDIsMjU1MDgsMjU1MTAsMjU1MTcsMjU1MTgsMjU1MTksMjU1MzMsMjU1MzcsMjU1NDEsMjU1NDQsMjU1NTAsMjU1NTMsMjU1NTUsMjU1NTYsMjU1NTcsMjU1NjQsMjU1NjgsMjU1NzMsMjU1NzgsMjU1ODAsMjU1ODYsMjU1ODcsMjU1ODksMjU1OTIsMjU1OTMsMjU2MDksMjU2MTAsMjU2MTYsMjU2MTgsMjU2MjAsMjU2MjQsMjU2MzAsMjU2MzIsMjU2MzQsMjU2MzYsMjU2MzcsMjU2NDEsMjU2NDIsMjU2NDcsMjU2NDgsMjU2NTMsMjU2NjEsMjU2NjMsMjU2NzUsMjU2NzksMjU2ODEsMjU2ODIsMjU2ODMsMjU2ODQsMjU2OTAsMjU2OTEsMjU2OTIsMjU2OTMsMjU2OTUsMjU2OTYsMjU2OTcsMjU2OTksMjU3MDksMjU3MTUsMjU3MTYsMjU3MjMsMjU3MjUsMjU3MzMsMjU3MzUsMjU3NDMsMjU3NDQsMjU3NDUsMjU3NTIsMjU3NTMsMjU3NTUsMjU3NTcsMjU3NTksMjU3NjEsMjU3NjMsMjU3NjYsMjU3NjgsMjU3NzIsMjU3NzksMjU3ODksMjU3OTAsMjU3OTEsMjU3OTYsMjU4MDEsMjU4MDIsMjU4MDMsMjU4MDQsMjU4MDYsMjU4MDgsMjU4MDksMjU4MTMsMjU4MTUsMjU4MjgsMjU4MjksMjU4MzMsMjU4MzQsMjU4MzcsMjU4NDAsMjU4NDUsMjU4NDcsMjU4NTEsMjU4NTUsMjU4NTcsMjU4NjAsMjU4NjQsMjU4NjUsMjU4NjYsMjU4NzEsMjU4NzUsMjU4NzYsMjU4NzgsMjU4ODEsMjU4ODMsMjU4ODYsMjU4ODcsMjU4OTAsMjU4OTQsMjU4OTcsMjU5MDIsMjU5MDUsMjU5MTQsMjU5MTYsMjU5MTcsMjU5MjMsMjU5MjcsMjU5MjksMjU5MzYsMjU5MzgsMjU5NDAsMjU5NTEsMjU5NTIsMjU5NTksMjU5NjMsMjU5NzgsMjU5ODEsMjU5ODUsMjU5ODksMjU5OTQsMjYwMDIsMjYwMDUsMjYwMDgsMjYwMTMsMjYwMTYsMjYwMTksMjYwMjIsMjYwMzAsMjYwMzQsMjYwMzUsMjYwMzYsMjYwNDcsMjYwNTAsMjYwNTYsMjYwNTcsMjYwNjIsMjYwNjQsMjYwNjgsMjYwNzAsMjYwNzIsMjYwNzksMjYwOTYsMjYwOTgsMjYxMDAsMjYxMDEsMjYxMDUsMjYxMTAsMjYxMTEsMjYxMTIsMjYxMTYsMjYxMjAsMjYxMjEsMjYxMjUsMjYxMjksMjYxMzAsMjYxMzMsMjYxMzQsMjYxNDEsMjYxNDIsMjYxNDUsMjYxNDYsMjYxNDcsMjYxNDgsMjYxNTAsMjYxNTMsMjYxNTQsMjYxNTUsMjYxNTYsMjYxNTgsMjYxNjAsMjYxNjEsMjYxNjMsMjYxNjksMjYxNjcsMjYxNzYsMjYxODEsMjYxODIsMjYxODYsMjYxODgsMjYxOTMsMjYxOTAsMjYxOTksMjYyMDAsMjYyMDEsMjYyMDMsMjYyMDQsMjYyMDgsMjYyMDksMjYzNjMsMjYyMTgsMjYyMTksMjYyMjAsMjYyMzgsMjYyMjcsMjYyMjksMjYyMzksMjYyMzEsMjYyMzIsMjYyMzMsMjYyMzUsMjYyNDAsMjYyMzYsMjYyNTEsMjYyNTIsMjYyNTMsMjYyNTYsMjYyNTgsMjYyNjUsMjYyNjYsMjYyNjcsMjYyNjgsMjYyNzEsMjYyNzIsMjYyNzYsMjYyODUsMjYyODksMjYyOTAsMjYyOTMsMjYyOTksMjYzMDMsMjYzMDQsMjYzMDYsMjYzMDcsMjYzMTIsMjYzMTYsMjYzMTgsMjYzMTksMjYzMjQsMjYzMzEsMjYzMzUsMjYzNDQsMjYzNDcsMjYzNDgsMjYzNTAsMjYzNjIsMjYzNzMsMjYzNzUsMjYzODIsMjYzODcsMjYzOTMsMjYzOTYsMjY0MDAsMjY0MDIsMjY0MTksMjY0MzAsMjY0MzcsMjY0MzksMjY0NDAsMjY0NDQsMjY0NTIsMjY0NTMsMjY0NjEsMjY0NzAsMjY0NzYsMjY0NzgsMjY0ODQsMjY0ODYsMjY0OTEsMjY0OTcsMjY1MDAsMjY1MTAsMjY1MTEsMjY1MTMsMjY1MTUsMjY1MTgsMjY1MjAsMjY1MjEsMjY1MjMsMjY1NDQsMjY1NDUsMjY1NDYsMjY1NDksMjY1NTUsMjY1NTYsMjY1NTcsMjY2MTcsMjY1NjAsMjY1NjIsMjY1NjMsMjY1NjUsMjY1NjgsMjY1NjksMjY1NzgsMjY1ODMsMjY1ODUsMjY1ODgsMjY1OTMsMjY1OTgsMjY2MDgsMjY2MTAsMjY2MTQsMjY2MTUsMjY3MDYsMjY2NDQsMjY2NDksMjY2NTMsMjY2NTUsMjY2NjQsMjY2NjMsMjY2NjgsMjY2NjksMjY2NzEsMjY2NzIsMjY2NzMsMjY2NzUsMjY2ODMsMjY2ODcsMjY2OTIsMjY2OTMsMjY2OTgsMjY3MDAsMjY3MDksMjY3MTEsMjY3MTIsMjY3MTUsMjY3MzEsMjY3MzQsMjY3MzUsMjY3MzYsMjY3MzcsMjY3MzgsMjY3NDEsMjY3NDUsMjY3NDYsMjY3NDcsMjY3NDgsMjY3NTQsMjY3NTYsMjY3NTgsMjY3NjAsMjY3NzQsMjY3NzYsMjY3NzgsMjY3ODAsMjY3ODUsMjY3ODcsMjY3ODksMjY3OTMsMjY3OTQsMjY3OTgsMjY4MDIsMjY4MTEsMjY4MjEsMjY4MjQsMjY4MjgsMjY4MzEsMjY4MzIsMjY4MzMsMjY4MzUsMjY4MzgsMjY4NDEsMjY4NDQsMjY4NDUsMjY4NTMsMjY4NTYsMjY4NTgsMjY4NTksMjY4NjAsMjY4NjEsMjY4NjQsMjY4NjUsMjY4NjksMjY4NzAsMjY4NzUsMjY4NzYsMjY4NzcsMjY4ODYsMjY4ODksMjY4OTAsMjY4OTYsMjY4OTcsMjY4OTksMjY5MDIsMjY5MDMsMjY5MjksMjY5MzEsMjY5MzMsMjY5MzYsMjY5MzksMjY5NDYsMjY5NDksMjY5NTMsMjY5NTgsMjY5NjcsMjY5NzEsMjY5NzksMjY5ODAsMjY5ODEsMjY5ODIsMjY5ODQsMjY5ODUsMjY5ODgsMjY5OTIsMjY5OTMsMjY5OTQsMjcwMDIsMjcwMDMsMjcwMDcsMjcwMDgsMjcwMjEsMjcwMjYsMjcwMzAsMjcwMzIsMjcwNDEsMjcwNDUsMjcwNDYsMjcwNDgsMjcwNTEsMjcwNTMsMjcwNTUsMjcwNjMsMjcwNjQsMjcwNjYsMjcwNjgsMjcwNzcsMjcwODAsMjcwODksMjcwOTQsMjcwOTUsMjcxMDYsMjcxMDksMjcxMTgsMjcxMTksMjcxMjEsMjcxMjMsMjcxMjUsMjcxMzQsMjcxMzYsMjcxMzcsMjcxMzksMjcxNTEsMjcxNTMsMjcxNTcsMjcxNjIsMjcxNjUsMjcxNjgsMjcxNzIsMjcxNzYsMjcxODQsMjcxODYsMjcxODgsMjcxOTEsMjcxOTUsMjcxOTgsMjcxOTksMjcyMDUsMjcyMDYsMjcyMDksMjcyMTAsMjcyMTQsMjcyMTYsMjcyMTcsMjcyMTgsMjcyMjEsMjcyMjIsMjcyMjcsMjcyMzYsMjcyMzksMjcyNDIsMjcyNDksMjcyNTEsMjcyNjIsMjcyNjUsMjcyNjcsMjcyNzAsMjcyNzEsMjcyNzMsMjcyNzUsMjcyODEsMjcyOTEsMjcyOTMsMjcyOTQsMjcyOTUsMjczMDEsMjczMDcsMjczMTEsMjczMTIsMjczMTMsMjczMTYsMjczMjUsMjczMjYsMjczMjcsMjczMzQsMjczMzcsMjczMzYsMjczNDAsMjczNDQsMjczNDgsMjczNDksMjczNTAsMjczNTYsMjczNTcsMjczNjQsMjczNjcsMjczNzIsMjczNzYsMjczNzcsMjczNzgsMjczODgsMjczODksMjczOTQsMjczOTUsMjczOTgsMjczOTksMjc0MDEsMjc0MDcsMjc0MDgsMjc0MDksMjc0MTUsMjc0MTksMjc0MjIsMjc0MjgsMjc0MzIsMjc0MzUsMjc0MzYsMjc0MzksMjc0NDUsMjc0NDYsMjc0NTEsMjc0NTUsMjc0NjIsMjc0NjYsMjc0NjksMjc0NzQsMjc0NzgsMjc0ODAsMjc0ODUsMjc0ODgsMjc0OTUsMjc0OTksMjc1MDIsMjc1MDQsMjc1MDksMjc1MTcsMjc1MTgsMjc1MjIsMjc1MjUsMjc1NDMsMjc1NDcsMjc1NTEsMjc1NTIsMjc1NTQsMjc1NTUsMjc1NjAsMjc1NjEsMjc1NjQsMjc1NjUsMjc1NjYsMjc1NjgsMjc1NzYsMjc1NzcsMjc1ODEsMjc1ODIsMjc1ODcsMjc1ODgsMjc1OTMsMjc1OTYsMjc2MDYsMjc2MTAsMjc2MTcsMjc2MTksMjc2MjIsMjc2MjMsMjc2MzAsMjc2MzMsMjc2MzksMjc2NDEsMjc2NDcsMjc2NTAsMjc2NTIsMjc2NTMsMjc2NTcsMjc2NjEsMjc2NjIsMjc2NjQsMjc2NjYsMjc2NzMsMjc2NzksMjc2ODYsMjc2ODcsMjc2ODgsMjc2OTIsMjc2OTQsMjc2OTksMjc3MDEsMjc3MDIsMjc3MDYsMjc3MDcsMjc3MTEsMjc3MjIsMjc3MjMsMjc3MjUsMjc3MjcsMjc3MzAsMjc3MzIsMjc3MzcsMjc3MzksMjc3NDAsMjc3NTUsMjc3NTcsMjc3NTksMjc3NjQsMjc3NjYsMjc3NjgsMjc3NjksMjc3NzEsMjc3ODEsMjc3ODIsMjc3ODMsMjc3ODUsMjc3OTYsMjc3OTcsMjc3OTksMjc4MDAsMjc4MDQsMjc4MDcsMjc4MjQsMjc4MjYsMjc4MjgsMjc4NDIsMjc4NDYsMjc4NTMsMjc4NTUsMjc4NTYsMjc4NTcsMjc4NTgsMjc4NjAsMjc4NjIsMjc4NjYsMjc4NjgsMjc4NzIsMjc4NzksMjc4ODEsMjc4ODMsMjc4ODQsMjc4ODYsMjc4OTAsMjc4OTIsMjc5MDgsMjc5MTEsMjc5MTQsMjc5MTgsMjc5MTksMjc5MjEsMjc5MjMsMjc5MzAsMjc5NDIsMjc5NDMsMjc5NDQsMjc3NTEsMjc5NTAsMjc5NTEsMjc5NTMsMjc5NjEsMjc5NjQsMjc5NjcsMjc5OTEsMjc5OTgsMjc5OTksMjgwMDEsMjgwMDUsMjgwMDcsMjgwMTUsMjgwMTYsMjgwMjgsMjgwMzQsMjgwMzksMjgwNDksMjgwNTAsMjgwNTIsMjgwNTQsMjgwNTUsMjgwNTYsMjgwNzQsMjgwNzYsMjgwODQsMjgwODcsMjgwODksMjgwOTMsMjgwOTUsMjgxMDAsMjgxMDQsMjgxMDYsMjgxMTAsMjgxMTEsMjgxMTgsMjgxMjMsMjgxMjUsMjgxMjcsMjgxMjgsMjgxMzAsMjgxMzMsMjgxMzcsMjgxNDMsMjgxNDQsMjgxNDgsMjgxNTAsMjgxNTYsMjgxNjAsMjgxNjQsMjgxOTAsMjgxOTQsMjgxOTksMjgyMTAsMjgyMTQsMjgyMTcsMjgyMTksMjgyMjAsMjgyMjgsMjgyMjksMjgyMzIsMjgyMzMsMjgyMzUsMjgyMzksMjgyNDEsMjgyNDIsMjgyNDMsMjgyNDQsMjgyNDcsMjgyNTIsMjgyNTMsMjgyNTQsMjgyNTgsMjgyNTksMjgyNjQsMjgyNzUsMjgyODMsMjgyODUsMjgzMDEsMjgzMDcsMjgzMTMsMjgzMjAsMjgzMjcsMjgzMzMsMjgzMzQsMjgzMzcsMjgzMzksMjgzNDcsMjgzNTEsMjgzNTIsMjgzNTMsMjgzNTUsMjgzNTksMjgzNjAsMjgzNjIsMjgzNjUsMjgzNjYsMjgzNjcsMjgzOTUsMjgzOTcsMjgzOTgsMjg0MDksMjg0MTEsMjg0MTMsMjg0MjAsMjg0MjQsMjg0MjYsMjg0MjgsMjg0MjksMjg0MzgsMjg0NDAsMjg0NDIsMjg0NDMsMjg0NTQsMjg0NTcsMjg0NTgsMjg0NjMsMjg0NjQsMjg0NjcsMjg0NzAsMjg0NzUsMjg0NzYsMjg0NjEsMjg0OTUsMjg0OTcsMjg0OTgsMjg0OTksMjg1MDMsMjg1MDUsMjg1MDYsMjg1MDksMjg1MTAsMjg1MTMsMjg1MTQsMjg1MjAsMjg1MjQsMjg1NDEsMjg1NDIsMjg1NDcsMjg1NTEsMjg1NTIsMjg1NTUsMjg1NTYsMjg1NTcsMjg1NjAsMjg1NjIsMjg1NjMsMjg1NjQsMjg1NjYsMjg1NzAsMjg1NzUsMjg1NzYsMjg1ODEsMjg1ODIsMjg1ODMsMjg1ODQsMjg1OTAsMjg1OTEsMjg1OTIsMjg1OTcsMjg1OTgsMjg2MDQsMjg2MTMsMjg2MTUsMjg2MTYsMjg2MTgsMjg2MzQsMjg2MzgsMjg2NDgsMjg2NDksMjg2NTYsMjg2NjEsMjg2NjUsMjg2NjgsMjg2NjksMjg2NzIsMjg2NzcsMjg2NzgsMjg2NzksMjg2ODUsMjg2OTUsMjg3MDQsMjg3MDcsMjg3MTksMjg3MjQsMjg3MjcsMjg3MjksMjg3MzIsMjg3MzksMjg3NDAsMjg3NDQsMjg3NDUsMjg3NDYsMjg3NDcsMjg3NTYsMjg3NTcsMjg3NjUsMjg3NjYsMjg3NTAsMjg3NzIsMjg3NzMsMjg3ODAsMjg3ODIsMjg3ODksMjg3OTAsMjg3OTgsMjg4MDEsMjg4MDUsMjg4MDYsMjg4MjAsMjg4MjEsMjg4MjIsMjg4MjMsMjg4MjQsMjg4MjcsMjg4MzYsMjg4NDMsMjg4NDgsMjg4NDksMjg4NTIsMjg4NTUsMjg4NzQsMjg4ODEsMjg4ODMsMjg4ODQsMjg4ODUsMjg4ODYsMjg4ODgsMjg4OTIsMjg5MDAsMjg5MjIsMjg5MzEsMjg5MzIsMjg5MzMsMjg5MzQsMjg5MzUsMjg5MzksMjg5NDAsMjg5NDMsMjg5NTgsMjg5NjAsMjg5NzEsMjg5NzMsMjg5NzUsMjg5NzYsMjg5NzcsMjg5ODQsMjg5OTMsMjg5OTcsMjg5OTgsMjg5OTksMjkwMDIsMjkwMDMsMjkwMDgsMjkwMTAsMjkwMTUsMjkwMTgsMjkwMjAsMjkwMjIsMjkwMjQsMjkwMzIsMjkwNDksMjkwNTYsMjkwNjEsMjkwNjMsMjkwNjgsMjkwNzQsMjkwODIsMjkwODMsMjkwODgsMjkwOTAsMjkxMDMsMjkxMDQsMjkxMDYsMjkxMDcsMjkxMTQsMjkxMTksMjkxMjAsMjkxMjEsMjkxMjQsMjkxMzEsMjkxMzIsMjkxMzksMjkxNDIsMjkxNDUsMjkxNDYsMjkxNDgsMjkxNzYsMjkxODIsMjkxODQsMjkxOTEsMjkxOTIsMjkxOTMsMjkyMDMsMjkyMDcsMjkyMTAsMjkyMTMsMjkyMTUsMjkyMjAsMjkyMjcsMjkyMzEsMjkyMzYsMjkyNDAsMjkyNDEsMjkyNDksMjkyNTAsMjkyNTEsMjkyNTMsMjkyNjIsMjkyNjMsMjkyNjQsMjkyNjcsMjkyNjksMjkyNzAsMjkyNzQsMjkyNzYsMjkyNzgsMjkyODAsMjkyODMsMjkyODgsMjkyOTEsMjkyOTQsMjkyOTUsMjkyOTcsMjkzMDMsMjkzMDQsMjkzMDcsMjkzMDgsMjkzMTEsMjkzMTYsMjkzMjEsMjkzMjUsMjkzMjYsMjkzMzEsMjkzMzksMjkzNTIsMjkzNTcsMjkzNTgsMjkzNjEsMjkzNjQsMjkzNzQsMjkzNzcsMjkzODMsMjkzODUsMjkzODgsMjkzOTcsMjkzOTgsMjk0MDAsMjk0MDcsMjk0MTMsMjk0MjcsMjk0MjgsMjk0MzQsMjk0MzUsMjk0MzgsMjk0NDIsMjk0NDQsMjk0NDUsMjk0NDcsMjk0NTEsMjk0NTMsMjk0NTgsMjk0NTksMjk0NjQsMjk0NjUsMjk0NzAsMjk0NzQsMjk0NzYsMjk0NzksMjk0ODAsMjk0ODQsMjk0ODksMjk0OTAsMjk0OTMsMjk0OTgsMjk0OTksMjk1MDEsMjk1MDcsMjk1MTcsMjk1MjAsMjk1MjIsMjk1MjYsMjk1MjgsMjk1MzMsMjk1MzQsMjk1MzUsMjk1MzYsMjk1NDIsMjk1NDMsMjk1NDUsMjk1NDcsMjk1NDgsMjk1NTAsMjk1NTEsMjk1NTMsMjk1NTksMjk1NjEsMjk1NjQsMjk1NjgsMjk1NjksMjk1NzEsMjk1NzMsMjk1NzQsMjk1ODIsMjk1ODQsMjk1ODcsMjk1ODksMjk1OTEsMjk1OTIsMjk1OTYsMjk1OTgsMjk1OTksMjk2MDAsMjk2MDIsMjk2MDUsMjk2MDYsMjk2MTAsMjk2MTEsMjk2MTMsMjk2MjEsMjk2MjMsMjk2MjUsMjk2MjgsMjk2MjksMjk2MzEsMjk2MzcsMjk2MzgsMjk2NDEsMjk2NDMsMjk2NDQsMjk2NDcsMjk2NTAsMjk2NTEsMjk2NTQsMjk2NTcsMjk2NjEsMjk2NjUsMjk2NjcsMjk2NzAsMjk2NzEsMjk2NzMsMjk2ODQsMjk2ODUsMjk2ODcsMjk2ODksMjk2OTAsMjk2OTEsMjk2OTMsMjk2OTUsMjk2OTYsMjk2OTcsMjk3MDAsMjk3MDMsMjk3MDYsMjk3MTMsMjk3MjIsMjk3MjMsMjk3MzIsMjk3MzQsMjk3MzYsMjk3MzcsMjk3MzgsMjk3MzksMjk3NDAsMjk3NDEsMjk3NDIsMjk3NDMsMjk3NDQsMjk3NDUsMjk3NTMsMjk3NjAsMjk3NjMsMjk3NjQsMjk3NjYsMjk3NjcsMjk3NzEsMjk3NzMsMjk3NzcsMjk3NzgsMjk3ODMsMjk3ODksMjk3OTQsMjk3OTgsMjk3OTksMjk4MDAsMjk4MDMsMjk4MDUsMjk4MDYsMjk4MDksMjk4MTAsMjk4MjQsMjk4MjUsMjk4MjksMjk4MzAsMjk4MzEsMjk4MzMsMjk4MzksMjk4NDAsMjk4NDEsMjk4NDIsMjk4NDgsMjk4NDksMjk4NTAsMjk4NTIsMjk4NTUsMjk4NTYsMjk4NTcsMjk4NTksMjk4NjIsMjk4NjQsMjk4NjUsMjk4NjYsMjk4NjcsMjk4NzAsMjk4NzEsMjk4NzMsMjk4NzQsMjk4NzcsMjk4ODEsMjk4ODMsMjk4ODcsMjk4OTYsMjk4OTcsMjk5MDAsMjk5MDQsMjk5MDcsMjk5MTIsMjk5MTQsMjk5MTUsMjk5MTgsMjk5MTksMjk5MjQsMjk5MjgsMjk5MzAsMjk5MzEsMjk5MzUsMjk5NDAsMjk5NDYsMjk5NDcsMjk5NDgsMjk5NTEsMjk5NTgsMjk5NzAsMjk5NzQsMjk5NzUsMjk5ODQsMjk5ODUsMjk5ODgsMjk5OTEsMjk5OTMsMjk5OTQsMjk5OTksMzAwMDYsMzAwMDksMzAwMTMsMzAwMTQsMzAwMTUsMzAwMTYsMzAwMTksMzAwMjMsMzAwMjQsMzAwMzAsMzAwMzIsMzAwMzQsMzAwMzksMzAwNDYsMzAwNDcsMzAwNDksMzAwNjMsMzAwNjUsMzAwNzMsMzAwNzQsMzAwNzUsMzAwNzYsMzAwNzcsMzAwNzgsMzAwODEsMzAwODUsMzAwOTYsMzAwOTgsMzAwOTksMzAxMDEsMzAxMDUsMzAxMDgsMzAxMTQsMzAxMTYsMzAxMzIsMzAxMzgsMzAxNDMsMzAxNDQsMzAxNDUsMzAxNDgsMzAxNTAsMzAxNTYsMzAxNTgsMzAxNTksMzAxNjcsMzAxNzIsMzAxNzUsMzAxNzYsMzAxNzcsMzAxODAsMzAxODMsMzAxODgsMzAxOTAsMzAxOTEsMzAxOTMsMzAyMDEsMzAyMDgsMzAyMTAsMzAyMTEsMzAyMTIsMzAyMTUsMzAyMTYsMzAyMTgsMzAyMjAsMzAyMjMsMzAyMjYsMzAyMjcsMzAyMjksMzAyMzAsMzAyMzMsMzAyMzUsMzAyMzYsMzAyMzcsMzAyMzgsMzAyNDMsMzAyNDUsMzAyNDYsMzAyNDksMzAyNTMsMzAyNTgsMzAyNTksMzAyNjEsMzAyNjQsMzAyNjUsMzAyNjYsMzAyNjgsMzAyODIsMzAyNzIsMzAyNzMsMzAyNzUsMzAyNzYsMzAyNzcsMzAyODEsMzAyODMsMzAyOTMsMzAyOTcsMzAzMDMsMzAzMDgsMzAzMDksMzAzMTcsMzAzMTgsMzAzMTksMzAzMjEsMzAzMjQsMzAzMzcsMzAzNDEsMzAzNDgsMzAzNDksMzAzNTcsMzAzNjMsMzAzNjQsMzAzNjUsMzAzNjcsMzAzNjgsMzAzNzAsMzAzNzEsMzAzNzIsMzAzNzMsMzAzNzQsMzAzNzUsMzAzNzYsMzAzNzgsMzAzODEsMzAzOTcsMzA0MDEsMzA0MDUsMzA0MDksMzA0MTEsMzA0MTIsMzA0MTQsMzA0MjAsMzA0MjUsMzA0MzIsMzA0MzgsMzA0NDAsMzA0NDQsMzA0NDgsMzA0NDksMzA0NTQsMzA0NTcsMzA0NjAsMzA0NjQsMzA0NzAsMzA0NzQsMzA0NzgsMzA0ODIsMzA0ODQsMzA0ODUsMzA0ODcsMzA0ODksMzA0OTAsMzA0OTIsMzA0OTgsMzA1MDQsMzA1MDksMzA1MTAsMzA1MTEsMzA1MTYsMzA1MTcsMzA1MTgsMzA1MjEsMzA1MjUsMzA1MjYsMzA1MzAsMzA1MzMsMzA1MzQsMzA1MzgsMzA1NDEsMzA1NDIsMzA1NDMsMzA1NDYsMzA1NTAsMzA1NTEsMzA1NTYsMzA1NTgsMzA1NTksMzA1NjAsMzA1NjIsMzA1NjQsMzA1NjcsMzA1NzAsMzA1NzIsMzA1NzYsMzA1NzgsMzA1NzksMzA1ODAsMzA1ODYsMzA1ODksMzA1OTIsMzA1OTYsMzA2MDQsMzA2MDUsMzA2MTIsMzA2MTMsMzA2MTQsMzA2MTgsMzA2MjMsMzA2MjYsMzA2MzEsMzA2MzQsMzA2MzgsMzA2MzksMzA2NDEsMzA2NDUsMzA2NTQsMzA2NTksMzA2NjUsMzA2NzMsMzA2NzQsMzA2NzcsMzA2ODEsMzA2ODYsMzA2ODcsMzA2ODgsMzA2OTIsMzA2OTQsMzA2OTgsMzA3MDAsMzA3MDQsMzA3MDUsMzA3MDgsMzA3MTIsMzA3MTUsMzA3MjUsMzA3MjYsMzA3MjksMzA3MzMsMzA3MzQsMzA3MzcsMzA3NDksMzA3NTMsMzA3NTQsMzA3NTUsMzA3NjUsMzA3NjYsMzA3NjgsMzA3NzMsMzA3NzUsMzA3ODcsMzA3ODgsMzA3OTEsMzA3OTIsMzA3OTYsMzA3OTgsMzA4MDIsMzA4MTIsMzA4MTQsMzA4MTYsMzA4MTcsMzA4MTksMzA4MjAsMzA4MjQsMzA4MjYsMzA4MzAsMzA4NDIsMzA4NDYsMzA4NTgsMzA4NjMsMzA4NjgsMzA4NzIsMzA4ODEsMzA4NzcsMzA4NzgsMzA4NzksMzA4ODQsMzA4ODgsMzA4OTIsMzA4OTMsMzA4OTYsMzA4OTcsMzA4OTgsMzA4OTksMzA5MDcsMzA5MDksMzA5MTEsMzA5MTksMzA5MjAsMzA5MjEsMzA5MjQsMzA5MjYsMzA5MzAsMzA5MzEsMzA5MzMsMzA5MzQsMzA5NDgsMzA5MzksMzA5NDMsMzA5NDQsMzA5NDUsMzA5NTAsMzA5NTQsMzA5NjIsMzA5NjMsMzA5NzYsMzA5NjYsMzA5NjcsMzA5NzAsMzA5NzEsMzA5NzUsMzA5ODIsMzA5ODgsMzA5OTIsMzEwMDIsMzEwMDQsMzEwMDYsMzEwMDcsMzEwMDgsMzEwMTMsMzEwMTUsMzEwMTcsMzEwMjEsMzEwMjUsMzEwMjgsMzEwMjksMzEwMzUsMzEwMzcsMzEwMzksMzEwNDQsMzEwNDUsMzEwNDYsMzEwNTAsMzEwNTEsMzEwNTUsMzEwNTcsMzEwNjAsMzEwNjQsMzEwNjcsMzEwNjgsMzEwNzksMzEwODEsMzEwODMsMzEwOTAsMzEwOTcsMzEwOTksMzExMDAsMzExMDIsMzExMTUsMzExMTYsMzExMjEsMzExMjMsMzExMjQsMzExMjUsMzExMjYsMzExMjgsMzExMzEsMzExMzIsMzExMzcsMzExNDQsMzExNDUsMzExNDcsMzExNTEsMzExNTMsMzExNTYsMzExNjAsMzExNjMsMzExNzAsMzExNzIsMzExNzUsMzExNzYsMzExNzgsMzExODMsMzExODgsMzExOTAsMzExOTQsMzExOTcsMzExOTgsMzEyMDAsMzEyMDIsMzEyMDUsMzEyMTAsMzEyMTEsMzEyMTMsMzEyMTcsMzEyMjQsMzEyMjgsMzEyMzQsMzEyMzUsMzEyMzksMzEyNDEsMzEyNDIsMzEyNDQsMzEyNDksMzEyNTMsMzEyNTksMzEyNjIsMzEyNjUsMzEyNzEsMzEyNzUsMzEyNzcsMzEyNzksMzEyODAsMzEyODQsMzEyODUsMzEyODgsMzEyODksMzEyOTAsMzEzMDAsMzEzMDEsMzEzMDMsMzEzMDQsMzEzMDgsMzEzMTcsMzEzMTgsMzEzMjEsMzEzMjQsMzEzMjUsMzEzMjcsMzEzMjgsMzEzMzMsMzEzMzUsMzEzMzgsMzEzNDEsMzEzNDksMzEzNTIsMzEzNTgsMzEzNjAsMzEzNjIsMzEzNjUsMzEzNjYsMzEzNzAsMzEzNzEsMzEzNzYsMzEzNzcsMzEzODAsMzEzOTAsMzEzOTIsMzEzOTUsMzE0MDQsMzE0MTEsMzE0MTMsMzE0MTcsMzE0MTksMzE0MjAsMzE0MzAsMzE0MzMsMzE0MzYsMzE0MzgsMzE0NDEsMzE0NTEsMzE0NjQsMzE0NjUsMzE0NjcsMzE0NjgsMzE0NzMsMzE0NzYsMzE0ODMsMzE0ODUsMzE0ODYsMzE0OTUsMzE1MDgsMzE1MTksMzE1MjMsMzE1MjcsMzE1MjksMzE1MzAsMzE1MzEsMzE1MzMsMzE1MzQsMzE1MzUsMzE1MzYsMzE1MzcsMzE1NDAsMzE1NDksMzE1NTEsMzE1NTIsMzE1NTMsMzE1NTksMzE1NjYsMzE1NzMsMzE1ODQsMzE1ODgsMzE1OTAsMzE1OTMsMzE1OTQsMzE1OTcsMzE1OTksMzE2MDIsMzE2MDMsMzE2MDcsMzE2MjAsMzE2MjUsMzE2MzAsMzE2MzIsMzE2MzMsMzE2MzgsMzE2NDMsMzE2NDYsMzE2NDgsMzE2NTMsMzE2NjAsMzE2NjMsMzE2NjQsMzE2NjYsMzE2NjksMzE2NzAsMzE2NzQsMzE2NzUsMzE2NzYsMzE2NzcsMzE2ODIsMzE2ODUsMzE2ODgsMzE2OTAsMzE3MDAsMzE3MDIsMzE3MDMsMzE3MDUsMzE3MDYsMzE3MDcsMzE3MjAsMzE3MjIsMzE3MzAsMzE3MzIsMzE3MzMsMzE3MzYsMzE3MzcsMzE3MzgsMzE3NDAsMzE3NDIsMzE3NDUsMzE3NDYsMzE3NDcsMzE3NDgsMzE3NTAsMzE3NTMsMzE3NTUsMzE3NTYsMzE3NTgsMzE3NTksMzE3NjksMzE3NzEsMzE3NzYsMzE3ODEsMzE3ODIsMzE3ODQsMzE3ODgsMzE3OTMsMzE3OTUsMzE3OTYsMzE3OTgsMzE4MDEsMzE4MDIsMzE4MTQsMzE4MTgsMzE4MjksMzE4MjUsMzE4MjYsMzE4MjcsMzE4MzMsMzE4MzQsMzE4MzUsMzE4MzYsMzE4MzcsMzE4MzgsMzE4NDEsMzE4NDMsMzE4NDcsMzE4NDksMzE4NTMsMzE4NTQsMzE4NTYsMzE4NTgsMzE4NjUsMzE4NjgsMzE4NjksMzE4NzgsMzE4NzksMzE4ODcsMzE4OTIsMzE5MDIsMzE5MDQsMzE5MTAsMzE5MjAsMzE5MjYsMzE5MjcsMzE5MzAsMzE5MzEsMzE5MzIsMzE5MzUsMzE5NDAsMzE5NDMsMzE5NDQsMzE5NDUsMzE5NDksMzE5NTEsMzE5NTUsMzE5NTYsMzE5NTcsMzE5NTksMzE5NjEsMzE5NjIsMzE5NjUsMzE5NzQsMzE5NzcsMzE5NzksMzE5ODksMzIwMDMsMzIwMDcsMzIwMDgsMzIwMDksMzIwMTUsMzIwMTcsMzIwMTgsMzIwMTksMzIwMjIsMzIwMjksMzIwMzAsMzIwMzUsMzIwMzgsMzIwNDIsMzIwNDUsMzIwNDksMzIwNjAsMzIwNjEsMzIwNjIsMzIwNjQsMzIwNjUsMzIwNzEsMzIwNzIsMzIwNzcsMzIwODEsMzIwODMsMzIwODcsMzIwODksMzIwOTAsMzIwOTIsMzIwOTMsMzIxMDEsMzIxMDMsMzIxMDYsMzIxMTIsMzIxMjAsMzIxMjIsMzIxMjMsMzIxMjcsMzIxMjksMzIxMzAsMzIxMzEsMzIxMzMsMzIxMzQsMzIxMzYsMzIxMzksMzIxNDAsMzIxNDEsMzIxNDUsMzIxNTAsMzIxNTEsMzIxNTcsMzIxNTgsMzIxNjYsMzIxNjcsMzIxNzAsMzIxNzksMzIxODIsMzIxODMsMzIxODUsMzIxOTQsMzIxOTUsMzIxOTYsMzIxOTcsMzIxOTgsMzIyMDQsMzIyMDUsMzIyMDYsMzIyMTUsMzIyMTcsMzIyNTYsMzIyMjYsMzIyMjksMzIyMzAsMzIyMzQsMzIyMzUsMzIyMzcsMzIyNDEsMzIyNDUsMzIyNDYsMzIyNDksMzIyNTAsMzIyNjQsMzIyNzIsMzIyNzMsMzIyNzcsMzIyNzksMzIyODQsMzIyODUsMzIyODgsMzIyOTUsMzIyOTYsMzIzMDAsMzIzMDEsMzIzMDMsMzIzMDcsMzIzMTAsMzIzMTksMzIzMjQsMzIzMjUsMzIzMjcsMzIzMzQsMzIzMzYsMzIzMzgsMzIzNDQsMzIzNTEsMzIzNTMsMzIzNTQsMzIzNTcsMzIzNjMsMzIzNjYsMzIzNjcsMzIzNzEsMzIzNzYsMzIzODIsMzIzODUsMzIzOTAsMzIzOTEsMzIzOTQsMzIzOTcsMzI0MDEsMzI0MDUsMzI0MDgsMzI0MTAsMzI0MTMsMzI0MTQsMzI1NzIsMzI1NzEsMzI1NzMsMzI1NzQsMzI1NzUsMzI1NzksMzI1ODAsMzI1ODMsMzI1OTEsMzI1OTQsMzI1OTUsMzI2MDMsMzI2MDQsMzI2MDUsMzI2MDksMzI2MTEsMzI2MTIsMzI2MTMsMzI2MTQsMzI2MjEsMzI2MjUsMzI2MzcsMzI2MzgsMzI2MzksMzI2NDAsMzI2NTEsMzI2NTMsMzI2NTUsMzI2NTYsMzI2NTcsMzI2NjIsMzI2NjMsMzI2NjgsMzI2NzMsMzI2NzQsMzI2NzgsMzI2ODIsMzI2ODUsMzI2OTIsMzI3MDAsMzI3MDMsMzI3MDQsMzI3MDcsMzI3MTIsMzI3MTgsMzI3MTksMzI3MzEsMzI3MzUsMzI3MzksMzI3NDEsMzI3NDQsMzI3NDgsMzI3NTAsMzI3NTEsMzI3NTQsMzI3NjIsMzI3NjUsMzI3NjYsMzI3NjcsMzI3NzUsMzI3NzYsMzI3NzgsMzI3ODEsMzI3ODIsMzI3ODMsMzI3ODUsMzI3ODcsMzI3ODgsMzI3OTAsMzI3OTcsMzI3OTgsMzI3OTksMzI4MDAsMzI4MDQsMzI4MDYsMzI4MTIsMzI4MTQsMzI4MTYsMzI4MjAsMzI4MjEsMzI4MjMsMzI4MjUsMzI4MjYsMzI4MjgsMzI4MzAsMzI4MzIsMzI4MzYsMzI4NjQsMzI4NjgsMzI4NzAsMzI4NzcsMzI4ODEsMzI4ODUsMzI4OTcsMzI5MDQsMzI5MTAsMzI5MjQsMzI5MjYsMzI5MzQsMzI5MzUsMzI5MzksMzI5NTIsMzI5NTMsMzI5NjgsMzI5NzMsMzI5NzUsMzI5NzgsMzI5ODAsMzI5ODEsMzI5ODMsMzI5ODQsMzI5OTIsMzMwMDUsMzMwMDYsMzMwMDgsMzMwMTAsMzMwMTEsMzMwMTQsMzMwMTcsMzMwMTgsMzMwMjIsMzMwMjcsMzMwMzUsMzMwNDYsMzMwNDcsMzMwNDgsMzMwNTIsMzMwNTQsMzMwNTYsMzMwNjAsMzMwNjMsMzMwNjgsMzMwNzIsMzMwNzcsMzMwODIsMzMwODQsMzMwOTMsMzMwOTUsMzMwOTgsMzMxMDAsMzMxMDYsMzMxMTEsMzMxMjAsMzMxMjEsMzMxMjcsMzMxMjgsMzMxMjksMzMxMzMsMzMxMzUsMzMxNDMsMzMxNTMsMzMxNjgsMzMxNTYsMzMxNTcsMzMxNTgsMzMxNjMsMzMxNjYsMzMxNzQsMzMxNzYsMzMxNzksMzMxODIsMzMxODYsMzMxOTgsMzMyMDIsMzMyMDQsMzMyMTEsMzMyMjcsMzMyMTksMzMyMjEsMzMyMjYsMzMyMzAsMzMyMzEsMzMyMzcsMzMyMzksMzMyNDMsMzMyNDUsMzMyNDYsMzMyNDksMzMyNTIsMzMyNTksMzMyNjAsMzMyNjQsMzMyNjUsMzMyNjYsMzMyNjksMzMyNzAsMzMyNzIsMzMyNzMsMzMyNzcsMzMyNzksMzMyODAsMzMyODMsMzMyOTUsMzMyOTksMzMzMDAsMzMzMDUsMzMzMDYsMzMzMDksMzMzMTMsMzMzMTQsMzMzMjAsMzMzMzAsMzMzMzIsMzMzMzgsMzMzNDcsMzMzNDgsMzMzNDksMzMzNTAsMzMzNTUsMzMzNTgsMzMzNTksMzMzNjEsMzMzNjYsMzMzNzIsMzMzNzYsMzMzNzksMzMzODMsMzMzODksMzMzOTYsMzM0MDMsMzM0MDUsMzM0MDcsMzM0MDgsMzM0MDksMzM0MTEsMzM0MTIsMzM0MTUsMzM0MTcsMzM0MTgsMzM0MjIsMzM0MjUsMzM0MjgsMzM0MzAsMzM0MzIsMzM0MzQsMzM0MzUsMzM0NDAsMzM0NDEsMzM0NDMsMzM0NDQsMzM0NDcsMzM0NDgsMzM0NDksMzM0NTAsMzM0NTQsMzM0NTYsMzM0NTgsMzM0NjAsMzM0NjMsMzM0NjYsMzM0NjgsMzM0NzAsMzM0NzEsMzM0NzgsMzM0ODgsMzM0OTMsMzM0OTgsMzM1MDQsMzM1MDYsMzM1MDgsMzM1MTIsMzM1MTQsMzM1MTcsMzM1MTksMzM1MjYsMzM1MjcsMzM1MzMsMzM1MzQsMzM1MzYsMzM1MzcsMzM1NDMsMzM1NDQsMzM1NDYsMzM1NDcsMzM2MjAsMzM1NjMsMzM1NjUsMzM1NjYsMzM1NjcsMzM1NjksMzM1NzAsMzM1ODAsMzM1ODEsMzM1ODIsMzM1ODQsMzM1ODcsMzM1OTEsMzM1OTQsMzM1OTYsMzM1OTcsMzM2MDIsMzM2MDMsMzM2MDQsMzM2MDcsMzM2MTMsMzM2MTQsMzM2MTcsMzM2MjEsMzM2MjIsMzM2MjMsMzM2NDgsMzM2NTYsMzM2NjEsMzM2NjMsMzM2NjQsMzM2NjYsMzM2NjgsMzM2NzAsMzM2NzcsMzM2ODIsMzM2ODQsMzM2ODUsMzM2ODgsMzM2ODksMzM2OTEsMzM2OTIsMzM2OTMsMzM3MDIsMzM3MDMsMzM3MDUsMzM3MDgsMzM3MjYsMzM3MjcsMzM3MjgsMzM3MzUsMzM3MzcsMzM3NDMsMzM3NDQsMzM3NDUsMzM3NDgsMzM3NTcsMzM2MTksMzM3NjgsMzM3NzAsMzM3ODIsMzM3ODQsMzM3ODUsMzM3ODgsMzM3OTMsMzM3OTgsMzM4MDIsMzM4MDcsMzM4MDksMzM4MTMsMzM4MTcsMzM3MDksMzM4MzksMzM4NDksMzM4NjEsMzM4NjMsMzM4NjQsMzM4NjYsMzM4NjksMzM4NzEsMzM4NzMsMzM4NzQsMzM4NzgsMzM4ODAsMzM4ODEsMzM4ODIsMzM4ODQsMzM4ODgsMzM4OTIsMzM4OTMsMzM4OTUsMzM4OTgsMzM5MDQsMzM5MDcsMzM5MDgsMzM5MTAsMzM5MTIsMzM5MTYsMzM5MTcsMzM5MjEsMzM5MjUsMzM5MzgsMzM5MzksMzM5NDEsMzM5NTAsMzM5NTgsMzM5NjAsMzM5NjEsMzM5NjIsMzM5NjcsMzM5NjksMzM5NzIsMzM5NzgsMzM5ODEsMzM5ODIsMzM5ODQsMzM5ODYsMzM5OTEsMzM5OTIsMzM5OTYsMzM5OTksMzQwMDMsMzQwMTIsMzQwMjMsMzQwMjYsMzQwMzEsMzQwMzIsMzQwMzMsMzQwMzQsMzQwMzksMzQwOTgsMzQwNDIsMzQwNDMsMzQwNDUsMzQwNTAsMzQwNTEsMzQwNTUsMzQwNjAsMzQwNjIsMzQwNjQsMzQwNzYsMzQwNzgsMzQwODIsMzQwODMsMzQwODQsMzQwODUsMzQwODcsMzQwOTAsMzQwOTEsMzQwOTUsMzQwOTksMzQxMDAsMzQxMDIsMzQxMTEsMzQxMTgsMzQxMjcsMzQxMjgsMzQxMjksMzQxMzAsMzQxMzEsMzQxMzQsMzQxMzcsMzQxNDAsMzQxNDEsMzQxNDIsMzQxNDMsMzQxNDQsMzQxNDUsMzQxNDYsMzQxNDgsMzQxNTUsMzQxNTksMzQxNjksMzQxNzAsMzQxNzEsMzQxNzMsMzQxNzUsMzQxNzcsMzQxODEsMzQxODIsMzQxODUsMzQxODcsMzQxODgsMzQxOTEsMzQxOTUsMzQyMDAsMzQyMDUsMzQyMDcsMzQyMDgsMzQyMTAsMzQyMTMsMzQyMTUsMzQyMjgsMzQyMzAsMzQyMzEsMzQyMzIsMzQyMzYsMzQyMzcsMzQyMzgsMzQyMzksMzQyNDIsMzQyNDcsMzQyNTAsMzQyNTEsMzQyNTQsMzQyMjEsMzQyNjQsMzQyNjYsMzQyNzEsMzQyNzIsMzQyNzgsMzQyODAsMzQyODUsMzQyOTEsMzQyOTQsMzQzMDAsMzQzMDMsMzQzMDQsMzQzMDgsMzQzMDksMzQzMTcsMzQzMTgsMzQzMjAsMzQzMjEsMzQzMjIsMzQzMjgsMzQzMjksMzQzMzEsMzQzMzQsMzQzMzcsMzQzNDMsMzQzNDUsMzQzNTgsMzQzNjAsMzQzNjIsMzQzNjQsMzQzNjUsMzQzNjgsMzQzNzAsMzQzNzQsMzQzODYsMzQzODcsMzQzOTAsMzQzOTEsMzQzOTIsMzQzOTMsMzQzOTcsMzQ0MDAsMzQ0MDEsMzQ0MDIsMzQ0MDMsMzQ0MDQsMzQ0MDksMzQ0MTIsMzQ0MTUsMzQ0MjEsMzQ0MjIsMzQ0MjMsMzQ0MjYsMzQ0NDUsMzQ0NDksMzQ0NTQsMzQ0NTYsMzQ0NTgsMzQ0NjAsMzQ0NjUsMzQ0NzAsMzQ0NzEsMzQ0NzIsMzQ0NzcsMzQ0ODEsMzQ0ODMsMzQ0ODQsMzQ0ODUsMzQ0ODcsMzQ0ODgsMzQ0ODksMzQ0OTUsMzQ0OTYsMzQ0OTcsMzQ0OTksMzQ1MDEsMzQ1MTMsMzQ1MTQsMzQ1MTcsMzQ1MTksMzQ1MjIsMzQ1MjQsMzQ1MjgsMzQ1MzEsMzQ1MzMsMzQ1MzUsMzQ0NDAsMzQ1NTQsMzQ1NTYsMzQ1NTcsMzQ1NjQsMzQ1NjUsMzQ1NjcsMzQ1NzEsMzQ1NzQsMzQ1NzUsMzQ1NzYsMzQ1NzksMzQ1ODAsMzQ1ODUsMzQ1OTAsMzQ1OTEsMzQ1OTMsMzQ1OTUsMzQ2MDAsMzQ2MDYsMzQ2MDcsMzQ2MDksMzQ2MTAsMzQ2MTcsMzQ2MTgsMzQ2MjAsMzQ2MjEsMzQ2MjIsMzQ2MjQsMzQ2MjcsMzQ2MjksMzQ2MzcsMzQ2NDgsMzQ2NTMsMzQ2NTcsMzQ2NjAsMzQ2NjEsMzQ2NzEsMzQ2NzMsMzQ2NzQsMzQ2ODMsMzQ2OTEsMzQ2OTIsMzQ2OTMsMzQ2OTQsMzQ2OTUsMzQ2OTYsMzQ2OTcsMzQ2OTksMzQ3MDAsMzQ3MDQsMzQ3MDcsMzQ3MDksMzQ3MTEsMzQ3MTIsMzQ3MTMsMzQ3MTgsMzQ3MjAsMzQ3MjMsMzQ3MjcsMzQ3MzIsMzQ3MzMsMzQ3MzQsMzQ3MzcsMzQ3NDEsMzQ3NTAsMzQ3NTEsMzQ3NTMsMzQ3NjAsMzQ3NjEsMzQ3NjIsMzQ3NjYsMzQ3NzMsMzQ3NzQsMzQ3NzcsMzQ3NzgsMzQ3ODAsMzQ3ODMsMzQ3ODYsMzQ3ODcsMzQ3ODgsMzQ3OTQsMzQ3OTUsMzQ3OTcsMzQ4MDEsMzQ4MDMsMzQ4MDgsMzQ4MTAsMzQ4MTUsMzQ4MTcsMzQ4MTksMzQ4MjIsMzQ4MjUsMzQ4MjYsMzQ4MjcsMzQ4MzIsMzQ4NDEsMzQ4MzQsMzQ4MzUsMzQ4MzYsMzQ4NDAsMzQ4NDIsMzQ4NDMsMzQ4NDQsMzQ4NDYsMzQ4NDcsMzQ4NTYsMzQ4NjEsMzQ4NjIsMzQ4NjQsMzQ4NjYsMzQ4NjksMzQ4NzQsMzQ4NzYsMzQ4ODEsMzQ4ODMsMzQ4ODUsMzQ4ODgsMzQ4ODksMzQ4OTAsMzQ4OTEsMzQ4OTQsMzQ4OTcsMzQ5MDEsMzQ5MDIsMzQ5MDQsMzQ5MDYsMzQ5MDgsMzQ5MTEsMzQ5MTIsMzQ5MTYsMzQ5MjEsMzQ5MjksMzQ5MzcsMzQ5MzksMzQ5NDQsMzQ5NjgsMzQ5NzAsMzQ5NzEsMzQ5NzIsMzQ5NzUsMzQ5NzYsMzQ5ODQsMzQ5ODYsMzUwMDIsMzUwMDUsMzUwMDYsMzUwMDgsMzUwMTgsMzUwMTksMzUwMjAsMzUwMjEsMzUwMjIsMzUwMjUsMzUwMjYsMzUwMjcsMzUwMzUsMzUwMzgsMzUwNDcsMzUwNTUsMzUwNTYsMzUwNTcsMzUwNjEsMzUwNjMsMzUwNzMsMzUwNzgsMzUwODUsMzUwODYsMzUwODcsMzUwOTMsMzUwOTQsMzUwOTYsMzUwOTcsMzUwOTgsMzUxMDAsMzUxMDQsMzUxMTAsMzUxMTEsMzUxMTIsMzUxMjAsMzUxMjEsMzUxMjIsMzUxMjUsMzUxMjksMzUxMzAsMzUxMzQsMzUxMzYsMzUxMzgsMzUxNDEsMzUxNDIsMzUxNDUsMzUxNTEsMzUxNTQsMzUxNTksMzUxNjIsMzUxNjMsMzUxNjQsMzUxNjksMzUxNzAsMzUxNzEsMzUxNzksMzUxODIsMzUxODQsMzUxODcsMzUxODksMzUxOTQsMzUxOTUsMzUxOTYsMzUxOTcsMzUyMDksMzUyMTMsMzUyMTYsMzUyMjAsMzUyMjEsMzUyMjcsMzUyMjgsMzUyMzEsMzUyMzIsMzUyMzcsMzUyNDgsMzUyNTIsMzUyNTMsMzUyNTQsMzUyNTUsMzUyNjAsMzUyODQsMzUyODUsMzUyODYsMzUyODcsMzUyODgsMzUzMDEsMzUzMDUsMzUzMDcsMzUzMDksMzUzMTMsMzUzMTUsMzUzMTgsMzUzMjEsMzUzMjUsMzUzMjcsMzUzMzIsMzUzMzMsMzUzMzUsMzUzNDMsMzUzNDUsMzUzNDYsMzUzNDgsMzUzNDksMzUzNTgsMzUzNjAsMzUzNjIsMzUzNjQsMzUzNjYsMzUzNzEsMzUzNzIsMzUzNzUsMzUzODEsMzUzODMsMzUzODksMzUzOTAsMzUzOTIsMzUzOTUsMzUzOTcsMzUzOTksMzU0MDEsMzU0MDUsMzU0MDYsMzU0MTEsMzU0MTQsMzU0MTUsMzU0MTYsMzU0MjAsMzU0MjEsMzU0MjUsMzU0MjksMzU0MzEsMzU0NDUsMzU0NDYsMzU0NDcsMzU0NDksMzU0NTAsMzU0NTEsMzU0NTQsMzU0NTUsMzU0NTYsMzU0NTksMzU0NjIsMzU0NjcsMzU0NzEsMzU0NzIsMzU0NzQsMzU0NzgsMzU0NzksMzU0ODEsMzU0ODcsMzU0OTUsMzU0OTcsMzU1MDIsMzU1MDMsMzU1MDcsMzU1MTAsMzU1MTEsMzU1MTUsMzU1MTgsMzU1MjMsMzU1MjYsMzU1MjgsMzU1MjksMzU1MzAsMzU1MzcsMzU1MzksMzU1NDAsMzU1NDEsMzU1NDMsMzU1NDksMzU1NTEsMzU1NjQsMzU1NjgsMzU1NzIsMzU1NzMsMzU1NzQsMzU1ODAsMzU1ODMsMzU1ODksMzU1OTAsMzU1OTUsMzU2MDEsMzU2MTIsMzU2MTQsMzU2MTUsMzU1OTQsMzU2MjksMzU2MzIsMzU2MzksMzU2NDQsMzU2NTAsMzU2NTEsMzU2NTIsMzU2NTMsMzU2NTQsMzU2NTYsMzU2NjYsMzU2NjcsMzU2NjgsMzU2NzMsMzU2NjEsMzU2NzgsMzU2ODMsMzU2OTMsMzU3MDIsMzU3MDQsMzU3MDUsMzU3MDgsMzU3MTAsMzU3MTMsMzU3MTYsMzU3MTcsMzU3MjMsMzU3MjUsMzU3MjcsMzU3MzIsMzU3MzMsMzU3NDAsMzU3NDIsMzU3NDMsMzU4OTYsMzU4OTcsMzU5MDEsMzU5MDIsMzU5MDksMzU5MTEsMzU5MTMsMzU5MTUsMzU5MTksMzU5MjEsMzU5MjMsMzU5MjQsMzU5MjcsMzU5MjgsMzU5MzEsMzU5MzMsMzU5MjksMzU5MzksMzU5NDAsMzU5NDIsMzU5NDQsMzU5NDUsMzU5NDksMzU5NTUsMzU5NTcsMzU5NTgsMzU5NjMsMzU5NjYsMzU5NzQsMzU5NzUsMzU5NzksMzU5ODQsMzU5ODYsMzU5ODcsMzU5OTMsMzU5OTUsMzU5OTYsMzYwMDQsMzYwMjUsMzYwMjYsMzYwMzcsMzYwMzgsMzYwNDEsMzYwNDMsMzYwNDcsMzYwNTQsMzYwNTMsMzYwNTcsMzYwNjEsMzYwNjUsMzYwNzIsMzYwNzYsMzYwNzksMzYwODAsMzYwODIsMzYwODUsMzYwODcsMzYwODgsMzYwOTQsMzYwOTUsMzYwOTcsMzYwOTksMzYxMDUsMzYxMTQsMzYxMTksMzYxMjMsMzYxOTcsMzYyMDEsMzYyMDQsMzYyMDYsMzYyMjMsMzYyMjYsMzYyMjgsMzYyMzIsMzYyMzcsMzYyNDAsMzYyNDEsMzYyNDUsMzYyNTQsMzYyNTUsMzYyNTYsMzYyNjIsMzYyNjcsMzYyNjgsMzYyNzEsMzYyNzQsMzYyNzcsMzYyNzksMzYyODEsMzYyODMsMzYyODgsMzYyOTMsMzYyOTQsMzYyOTUsMzYyOTYsMzYyOTgsMzYzMDIsMzYzMDUsMzYzMDgsMzYzMDksMzYzMTEsMzYzMTMsMzYzMjQsMzYzMjUsMzYzMjcsMzYzMzIsMzYzMzYsMzYyODQsMzYzMzcsMzYzMzgsMzYzNDAsMzYzNDksMzYzNTMsMzYzNTYsMzYzNTcsMzYzNTgsMzYzNjMsMzYzNjksMzYzNzIsMzYzNzQsMzYzODQsMzYzODUsMzYzODYsMzYzODcsMzYzOTAsMzYzOTEsMzY0MDEsMzY0MDMsMzY0MDYsMzY0MDcsMzY0MDgsMzY0MDksMzY0MTMsMzY0MTYsMzY0MTcsMzY0MjcsMzY0MjksMzY0MzAsMzY0MzEsMzY0MzYsMzY0NDMsMzY0NDQsMzY0NDUsMzY0NDYsMzY0NDksMzY0NTAsMzY0NTcsMzY0NjAsMzY0NjEsMzY0NjMsMzY0NjQsMzY0NjUsMzY0NzMsMzY0NzQsMzY0NzUsMzY0ODIsMzY0ODMsMzY0ODksMzY0OTYsMzY0OTgsMzY1MDEsMzY1MDYsMzY1MDcsMzY1MDksMzY1MTAsMzY1MTQsMzY1MTksMzY1MjEsMzY1MjUsMzY1MjYsMzY1MzEsMzY1MzMsMzY1MzgsMzY1MzksMzY1NDQsMzY1NDUsMzY1NDcsMzY1NDgsMzY1NTEsMzY1NTksMzY1NjEsMzY1NjQsMzY1NzIsMzY1ODQsMzY1OTAsMzY1OTIsMzY1OTMsMzY1OTksMzY2MDEsMzY2MDIsMzY1ODksMzY2MDgsMzY2MTAsMzY2MTUsMzY2MTYsMzY2MjMsMzY2MjQsMzY2MzAsMzY2MzEsMzY2MzIsMzY2MzgsMzY2NDAsMzY2NDEsMzY2NDMsMzY2NDUsMzY2NDcsMzY2NDgsMzY2NTIsMzY2NTMsMzY2NTQsMzY2NjAsMzY2NjEsMzY2NjIsMzY2NjMsMzY2NjYsMzY2NzIsMzY2NzMsMzY2NzUsMzY2NzksMzY2ODcsMzY2ODksMzY2OTAsMzY2OTEsMzY2OTIsMzY2OTMsMzY2OTYsMzY3MDEsMzY3MDIsMzY3MDksMzY3NjUsMzY3NjgsMzY3NjksMzY3NzIsMzY3NzMsMzY3NzQsMzY3ODksMzY3OTAsMzY3OTIsMzY3OTgsMzY4MDAsMzY4MDEsMzY4MDYsMzY4MTAsMzY4MTEsMzY4MTMsMzY4MTYsMzY4MTgsMzY4MTksMzY4MjEsMzY4MzIsMzY4MzUsMzY4MzYsMzY4NDAsMzY4NDYsMzY4NDksMzY4NTMsMzY4NTQsMzY4NTksMzY4NjIsMzY4NjYsMzY4NjgsMzY4NzIsMzY4NzYsMzY4ODgsMzY4OTEsMzY5MDQsMzY5MDUsMzY5MTEsMzY5MDYsMzY5MDgsMzY5MDksMzY5MTUsMzY5MTYsMzY5MTksMzY5MjcsMzY5MzEsMzY5MzIsMzY5NDAsMzY5NTUsMzY5NTcsMzY5NjIsMzY5NjYsMzY5NjcsMzY5NzIsMzY5NzYsMzY5ODAsMzY5ODUsMzY5OTcsMzcwMDAsMzcwMDMsMzcwMDQsMzcwMDYsMzcwMDgsMzcwMTMsMzcwMTUsMzcwMTYsMzcwMTcsMzcwMTksMzcwMjQsMzcwMjUsMzcwMjYsMzcwMjksMzcwNDAsMzcwNDIsMzcwNDMsMzcwNDQsMzcwNDYsMzcwNTMsMzcwNjgsMzcwNTQsMzcwNTksMzcwNjAsMzcwNjEsMzcwNjMsMzcwNjQsMzcwNzcsMzcwNzksMzcwODAsMzcwODEsMzcwODQsMzcwODUsMzcwODcsMzcwOTMsMzcwNzQsMzcxMTAsMzcwOTksMzcxMDMsMzcxMDQsMzcxMDgsMzcxMTgsMzcxMTksMzcxMjAsMzcxMjQsMzcxMjUsMzcxMjYsMzcxMjgsMzcxMzMsMzcxMzYsMzcxNDAsMzcxNDIsMzcxNDMsMzcxNDQsMzcxNDYsMzcxNDgsMzcxNTAsMzcxNTIsMzcxNTcsMzcxNTQsMzcxNTUsMzcxNTksMzcxNjEsMzcxNjYsMzcxNjcsMzcxNjksMzcxNzIsMzcxNzQsMzcxNzUsMzcxNzcsMzcxNzgsMzcxODAsMzcxODEsMzcxODcsMzcxOTEsMzcxOTIsMzcxOTksMzcyMDMsMzcyMDcsMzcyMDksMzcyMTAsMzcyMTEsMzcyMTcsMzcyMjAsMzcyMjMsMzcyMjksMzcyMzYsMzcyNDEsMzcyNDIsMzcyNDMsMzcyNDksMzcyNTEsMzcyNTMsMzcyNTQsMzcyNTgsMzcyNjIsMzcyNjUsMzcyNjcsMzcyNjgsMzcyNjksMzcyNzIsMzcyNzgsMzcyODEsMzcyODYsMzcyODgsMzcyOTIsMzcyOTMsMzcyOTQsMzcyOTYsMzcyOTcsMzcyOTgsMzcyOTksMzczMDIsMzczMDcsMzczMDgsMzczMDksMzczMTEsMzczMTQsMzczMTUsMzczMTcsMzczMzEsMzczMzIsMzczMzUsMzczMzcsMzczMzgsMzczNDIsMzczNDgsMzczNDksMzczNTMsMzczNTQsMzczNTYsMzczNTcsMzczNTgsMzczNTksMzczNjAsMzczNjEsMzczNjcsMzczNjksMzczNzEsMzczNzMsMzczNzYsMzczNzcsMzczODAsMzczODEsMzczODIsMzczODMsMzczODUsMzczODYsMzczODgsMzczOTIsMzczOTQsMzczOTUsMzczOTgsMzc0MDAsMzc0MDQsMzc0MDUsMzc0MTEsMzc0MTIsMzc0MTMsMzc0MTQsMzc0MTYsMzc0MjIsMzc0MjMsMzc0MjQsMzc0MjcsMzc0MjksMzc0MzAsMzc0MzIsMzc0MzMsMzc0MzQsMzc0MzYsMzc0MzgsMzc0NDAsMzc0NDIsMzc0NDMsMzc0NDYsMzc0NDcsMzc0NTAsMzc0NTMsMzc0NTQsMzc0NTUsMzc0NTcsMzc0NjQsMzc0NjUsMzc0NjgsMzc0NjksMzc0NzIsMzc0NzMsMzc0NzcsMzc0NzksMzc0ODAsMzc0ODEsMzc0ODYsMzc0ODcsMzc0ODgsMzc0OTMsMzc0OTQsMzc0OTUsMzc0OTYsMzc0OTcsMzc0OTksMzc1MDAsMzc1MDEsMzc1MDMsMzc1MTIsMzc1MTMsMzc1MTQsMzc1MTcsMzc1MTgsMzc1MjIsMzc1MjcsMzc1MjksMzc1MzUsMzc1MzYsMzc1NDAsMzc1NDEsMzc1NDMsMzc1NDQsMzc1NDcsMzc1NTEsMzc1NTQsMzc1NTgsMzc1NjAsMzc1NjIsMzc1NjMsMzc1NjQsMzc1NjUsMzc1NjcsMzc1NjgsMzc1NjksMzc1NzAsMzc1NzEsMzc1NzMsMzc1NzQsMzc1NzUsMzc1NzYsMzc1NzksMzc1ODAsMzc1ODEsMzc1ODIsMzc1ODQsMzc1ODcsMzc1ODksMzc1OTEsMzc1OTIsMzc1OTMsMzc1OTYsMzc1OTcsMzc1OTksMzc2MDAsMzc2MDEsMzc2MDMsMzc2MDUsMzc2MDcsMzc2MDgsMzc2MTIsMzc2MTQsMzc2MTYsMzc2MjUsMzc2MjcsMzc2MzEsMzc2MzIsMzc2MzQsMzc2NDAsMzc2NDUsMzc2NDksMzc2NTIsMzc2NTMsMzc2NjAsMzc2NjEsMzc2NjIsMzc2NjMsMzc2NjUsMzc2NjgsMzc2NjksMzc2NzEsMzc2NzMsMzc2NzQsMzc2ODMsMzc2ODQsMzc2ODYsMzc2ODcsMzc3MDMsMzc3MDQsMzc3MDUsMzc3MTIsMzc3MTMsMzc3MTQsMzc3MTcsMzc3MTksMzc3MjAsMzc3MjIsMzc3MjYsMzc3MzIsMzc3MzMsMzc3MzUsMzc3MzcsMzc3MzgsMzc3NDEsMzc3NDMsMzc3NDQsMzc3NDUsMzc3NDcsMzc3NDgsMzc3NTAsMzc3NTQsMzc3NTcsMzc3NTksMzc3NjAsMzc3NjEsMzc3NjIsMzc3NjgsMzc3NzAsMzc3NzEsMzc3NzMsMzc3NzUsMzc3NzgsMzc3ODEsMzc3ODQsMzc3ODcsMzc3OTAsMzc3OTMsMzc3OTUsMzc3OTYsMzc3OTgsMzc4MDAsMzc4MDMsMzc4MTIsMzc4MTMsMzc4MTQsMzc4MTgsMzc4MDEsMzc4MjUsMzc4MjgsMzc4MjksMzc4MzAsMzc4MzEsMzc4MzMsMzc4MzQsMzc4MzUsMzc4MzYsMzc4MzcsMzc4NDMsMzc4NDksMzc4NTIsMzc4NTQsMzc4NTUsMzc4NTgsMzc4NjIsMzc4NjMsMzc4ODEsMzc4NzksMzc4ODAsMzc4ODIsMzc4ODMsMzc4ODUsMzc4ODksMzc4OTAsMzc4OTIsMzc4OTYsMzc4OTcsMzc5MDEsMzc5MDIsMzc5MDMsMzc5MDksMzc5MTAsMzc5MTEsMzc5MTksMzc5MzQsMzc5MzUsMzc5MzcsMzc5MzgsMzc5MzksMzc5NDAsMzc5NDcsMzc5NTEsMzc5NDksMzc5NTUsMzc5NTcsMzc5NjAsMzc5NjIsMzc5NjQsMzc5NzMsMzc5NzcsMzc5ODAsMzc5ODMsMzc5ODUsMzc5ODcsMzc5OTIsMzc5OTUsMzc5OTcsMzc5OTgsMzc5OTksMzgwMDEsMzgwMDIsMzgwMjAsMzgwMTksMzgyNjQsMzgyNjUsMzgyNzAsMzgyNzYsMzgyODAsMzgyODQsMzgyODUsMzgyODYsMzgzMDEsMzgzMDIsMzgzMDMsMzgzMDUsMzgzMTAsMzgzMTMsMzgzMTUsMzgzMTYsMzgzMjQsMzgzMjYsMzgzMzAsMzgzMzMsMzgzMzUsMzgzNDIsMzgzNDQsMzgzNDUsMzgzNDcsMzgzNTIsMzgzNTMsMzgzNTQsMzgzNTUsMzgzNjEsMzgzNjIsMzgzNjUsMzgzNjYsMzgzNjcsMzgzNjgsMzgzNzIsMzgzNzQsMzg0MjksMzg0MzAsMzg0MzQsMzg0MzYsMzg0MzcsMzg0MzgsMzg0NDQsMzg0NDksMzg0NTEsMzg0NTUsMzg0NTYsMzg0NTcsMzg0NTgsMzg0NjAsMzg0NjEsMzg0NjUsMzg0ODIsMzg0ODQsMzg0ODYsMzg0ODcsMzg0ODgsMzg0OTcsMzg1MTAsMzg1MTYsMzg1MjMsMzg1MjQsMzg1MjYsMzg1MjcsMzg1MjksMzg1MzAsMzg1MzEsMzg1MzIsMzg1MzcsMzg1NDUsMzg1NTAsMzg1NTQsMzg1NTcsMzg1NTksMzg1NjQsMzg1NjUsMzg1NjYsMzg1NjksMzg1NzQsMzg1NzUsMzg1NzksMzg1ODYsMzg2MDIsMzg2MTAsMjM5ODYsMzg2MTYsMzg2MTgsMzg2MjEsMzg2MjIsMzg2MjMsMzg2MzMsMzg2MzksMzg2NDEsMzg2NTAsMzg2NTgsMzg2NTksMzg2NjEsMzg2NjUsMzg2ODIsMzg2ODMsMzg2ODUsMzg2ODksMzg2OTAsMzg2OTEsMzg2OTYsMzg3MDUsMzg3MDcsMzg3MjEsMzg3MjMsMzg3MzAsMzg3MzQsMzg3MzUsMzg3NDEsMzg3NDMsMzg3NDQsMzg3NDYsMzg3NDcsMzg3NTUsMzg3NTksMzg3NjIsMzg3NjYsMzg3NzEsMzg3NzQsMzg3NzUsMzg3NzYsMzg3NzksMzg3ODEsMzg3ODMsMzg3ODQsMzg3OTMsMzg4MDUsMzg4MDYsMzg4MDcsMzg4MDksMzg4MTAsMzg4MTQsMzg4MTUsMzg4MTgsMzg4MjgsMzg4MzAsMzg4MzMsMzg4MzQsMzg4MzcsMzg4MzgsMzg4NDAsMzg4NDEsMzg4NDIsMzg4NDQsMzg4NDYsMzg4NDcsMzg4NDksMzg4NTIsMzg4NTMsMzg4NTUsMzg4NTcsMzg4NTgsMzg4NjAsMzg4NjEsMzg4NjIsMzg4NjQsMzg4NjUsMzg4NjgsMzg4NzEsMzg4NzIsMzg4NzMsMzg4NzcsMzg4NzgsMzg4ODAsMzg4NzUsMzg4ODEsMzg4ODQsMzg4OTUsMzg4OTcsMzg5MDAsMzg5MDMsMzg5MDQsMzg5MDYsMzg5MTksMzg5MjIsMzg5MzcsMzg5MjUsMzg5MjYsMzg5MzIsMzg5MzQsMzg5NDAsMzg5NDIsMzg5NDQsMzg5NDcsMzg5NTAsMzg5NTUsMzg5NTgsMzg5NTksMzg5NjAsMzg5NjIsMzg5NjMsMzg5NjUsMzg5NDksMzg5NzQsMzg5ODAsMzg5ODMsMzg5ODYsMzg5OTMsMzg5OTQsMzg5OTUsMzg5OTgsMzg5OTksMzkwMDEsMzkwMDIsMzkwMTAsMzkwMTEsMzkwMTMsMzkwMTQsMzkwMTgsMzkwMjAsMzkwODMsMzkwODUsMzkwODYsMzkwODgsMzkwOTIsMzkwOTUsMzkwOTYsMzkwOTgsMzkwOTksMzkxMDMsMzkxMDYsMzkxMDksMzkxMTIsMzkxMTYsMzkxMzcsMzkxMzksMzkxNDEsMzkxNDIsMzkxNDMsMzkxNDYsMzkxNTUsMzkxNTgsMzkxNzAsMzkxNzUsMzkxNzYsMzkxODUsMzkxODksMzkxOTAsMzkxOTEsMzkxOTQsMzkxOTUsMzkxOTYsMzkxOTksMzkyMDIsMzkyMDYsMzkyMDcsMzkyMTEsMzkyMTcsMzkyMTgsMzkyMTksMzkyMjAsMzkyMjEsMzkyMjUsMzkyMjYsMzkyMjcsMzkyMjgsMzkyMzIsMzkyMzMsMzkyMzgsMzkyMzksMzkyNDAsMzkyNDUsMzkyNDYsMzkyNTIsMzkyNTYsMzkyNTcsMzkyNTksMzkyNjAsMzkyNjIsMzkyNjMsMzkyNjQsMzkzMjMsMzkzMjUsMzkzMjcsMzkzMzQsMzkzNDQsMzkzNDUsMzkzNDYsMzkzNDksMzkzNTMsMzkzNTQsMzkzNTcsMzkzNTksMzkzNjMsMzkzNjksMzkzNzksMzkzODAsMzkzODUsMzkzODYsMzkzODgsMzkzOTAsMzkzOTksMzk0MDIsMzk0MDMsMzk0MDQsMzk0MDgsMzk0MTIsMzk0MTMsMzk0MTcsMzk0MjEsMzk0MjIsMzk0MjYsMzk0MjcsMzk0MjgsMzk0MzUsMzk0MzYsMzk0NDAsMzk0NDEsMzk0NDYsMzk0NTQsMzk0NTYsMzk0NTgsMzk0NTksMzk0NjAsMzk0NjMsMzk0NjksMzk0NzAsMzk0NzUsMzk0NzcsMzk0NzgsMzk0ODAsMzk0OTUsMzk0ODksMzk0OTIsMzk0OTgsMzk0OTksMzk1MDAsMzk1MDIsMzk1MDUsMzk1MDgsMzk1MTAsMzk1MTcsMzk1OTQsMzk1OTYsMzk1OTgsMzk1OTksMzk2MDIsMzk2MDQsMzk2MDUsMzk2MDYsMzk2MDksMzk2MTEsMzk2MTQsMzk2MTUsMzk2MTcsMzk2MTksMzk2MjIsMzk2MjQsMzk2MzAsMzk2MzIsMzk2MzQsMzk2MzcsMzk2MzgsMzk2MzksMzk2NDMsMzk2NDQsMzk2NDgsMzk2NTIsMzk2NTMsMzk2NTUsMzk2NTcsMzk2NjAsMzk2NjYsMzk2NjcsMzk2NjksMzk2NzMsMzk2NzQsMzk2NzcsMzk2NzksMzk2ODAsMzk2ODEsMzk2ODIsMzk2ODMsMzk2ODQsMzk2ODUsMzk2ODgsMzk2ODksMzk2OTEsMzk2OTIsMzk2OTMsMzk2OTQsMzk2OTYsMzk2OTgsMzk3MDIsMzk3MDUsMzk3MDcsMzk3MDgsMzk3MTIsMzk3MTgsMzk3MjMsMzk3MjUsMzk3MzEsMzk3MzIsMzk3MzMsMzk3MzUsMzk3MzcsMzk3MzgsMzk3NDEsMzk3NTIsMzk3NTUsMzk3NTYsMzk3NjUsMzk3NjYsMzk3NjcsMzk3NzEsMzk3NzQsMzk3NzcsMzk3NzksMzk3ODEsMzk3ODIsMzk3ODQsMzk3ODYsMzk3ODcsMzk3ODgsMzk3ODksMzk3OTAsMzk3OTUsMzk3OTcsMzk3OTksMzk4MDAsMzk4MDEsMzk4MDcsMzk4MDgsMzk4MTIsMzk4MTMsMzk4MTQsMzk4MTUsMzk4MTcsMzk4MTgsMzk4MTksMzk4MjEsMzk4MjMsMzk4MjQsMzk4MjgsMzk4MzQsMzk4MzcsMzk4MzgsMzk4NDYsMzk4NDcsMzk4NDksMzk4NTIsMzk4NTYsMzk4NTcsMzk4NTgsMzk4NjMsMzk4NjQsMzk4NjcsMzk4NjgsMzk4NzAsMzk4NzEsMzk4NzMsMzk4NzksMzk4ODAsMzk4ODYsMzk4ODgsMzk4OTUsMzk4OTYsMzk5MDEsMzk5MDMsMzk5MDksMzk5MTEsMzk5MTQsMzk5MTUsMzk5MTksMzk5MjMsMzk5MjcsMzk5MjgsMzk5MjksMzk5MzAsMzk5MzMsMzk5MzUsMzk5MzYsMzk5MzgsMzk5NDcsMzk5NTEsMzk5NTMsMzk5NTgsMzk5NjAsMzk5NjEsMzk5NjIsMzk5NjQsMzk5NjYsMzk5NzAsMzk5NzEsMzk5NzQsMzk5NzUsMzk5NzYsMzk5NzcsMzk5NzgsMzk5ODUsMzk5ODksMzk5OTAsMzk5OTEsMzk5OTcsNDAwMDEsNDAwMDMsNDAwMDQsNDAwMDUsNDAwMDksNDAwMTAsNDAwMTQsNDAwMTUsNDAwMTYsNDAwMTksNDAwMjAsNDAwMjIsNDAwMjQsNDAwMjcsNDAwMjksNDAwMzAsNDAwMzEsNDAwMzUsNDAwNDEsNDAwNDIsNDAwMjgsNDAwNDMsNDAwNDAsNDAwNDYsNDAwNDgsNDAwNTAsNDAwNTMsNDAwNTUsNDAwNTksNDAxNjYsNDAxNzgsNDAxODMsNDAxODUsNDAyMDMsNDAxOTQsNDAyMDksNDAyMTUsNDAyMTYsNDAyMjAsNDAyMjEsNDAyMjIsNDAyMzksNDAyNDAsNDAyNDIsNDAyNDMsNDAyNDQsNDAyNTAsNDAyNTIsNDAyNjEsNDAyNTMsNDAyNTgsNDAyNTksNDAyNjMsNDAyNjYsNDAyNzUsNDAyNzYsNDAyODcsNDAyOTEsNDAyOTAsNDAyOTMsNDAyOTcsNDAyOTgsNDAyOTksNDAzMDQsNDAzMTAsNDAzMTEsNDAzMTUsNDAzMTYsNDAzMTgsNDAzMjMsNDAzMjQsNDAzMjYsNDAzMzAsNDAzMzMsNDAzMzQsNDAzMzgsNDAzMzksNDAzNDEsNDAzNDIsNDAzNDMsNDAzNDQsNDAzNTMsNDAzNjIsNDAzNjQsNDAzNjYsNDAzNjksNDAzNzMsNDAzNzcsNDAzODAsNDAzODMsNDAzODcsNDAzOTEsNDAzOTMsNDAzOTQsNDA0MDQsNDA0MDUsNDA0MDYsNDA0MDcsNDA0MTAsNDA0MTQsNDA0MTUsNDA0MTYsNDA0MjEsNDA0MjMsNDA0MjUsNDA0MjcsNDA0MzAsNDA0MzIsNDA0MzUsNDA0MzYsNDA0NDYsNDA0NTgsNDA0NTAsNDA0NTUsNDA0NjIsNDA0NjQsNDA0NjUsNDA0NjYsNDA0NjksNDA0NzAsNDA0NzMsNDA0NzYsNDA0NzcsNDA1NzAsNDA1NzEsNDA1NzIsNDA1NzYsNDA1NzgsNDA1NzksNDA1ODAsNDA1ODEsNDA1ODMsNDA1OTAsNDA1OTEsNDA1OTgsNDA2MDAsNDA2MDMsNDA2MDYsNDA2MTIsNDA2MTYsNDA2MjAsNDA2MjIsNDA2MjMsNDA2MjQsNDA2MjcsNDA2MjgsNDA2MjksNDA2NDYsNDA2NDgsNDA2NTEsNDA2NjEsNDA2NzEsNDA2NzYsNDA2NzksNDA2ODQsNDA2ODUsNDA2ODYsNDA2ODgsNDA2ODksNDA2OTAsNDA2OTMsNDA2OTYsNDA3MDMsNDA3MDYsNDA3MDcsNDA3MTMsNDA3MTksNDA3MjAsNDA3MjEsNDA3MjIsNDA3MjQsNDA3MjYsNDA3MjcsNDA3MjksNDA3MzAsNDA3MzEsNDA3MzUsNDA3MzgsNDA3NDIsNDA3NDYsNDA3NDcsNDA3NTEsNDA3NTMsNDA3NTQsNDA3NTYsNDA3NTksNDA3NjEsNDA3NjIsNDA3NjQsNDA3NjUsNDA3NjcsNDA3NjksNDA3NzEsNDA3NzIsNDA3NzMsNDA3NzQsNDA3NzUsNDA3ODcsNDA3ODksNDA3OTAsNDA3OTEsNDA3OTIsNDA3OTQsNDA3OTcsNDA3OTgsNDA4MDgsNDA4MDksNDA4MTMsNDA4MTQsNDA4MTUsNDA4MTYsNDA4MTcsNDA4MTksNDA4MjEsNDA4MjYsNDA4MjksNDA4NDcsNDA4NDgsNDA4NDksNDA4NTAsNDA4NTIsNDA4NTQsNDA4NTUsNDA4NjIsNDA4NjUsNDA4NjYsNDA4NjcsNDA4NjksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSxcbiAgXCJpYm04NjZcIjpbMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsOTYxNyw5NjE4LDk2MTksOTQ3NCw5NTA4LDk1NjksOTU3MCw5NTU4LDk1NTcsOTU3MSw5NTUzLDk1NTksOTU2NSw5NTY0LDk1NjMsOTQ4OCw5NDkyLDk1MjQsOTUxNiw5NTAwLDk0NzIsOTUzMiw5NTY2LDk1NjcsOTU2Miw5NTU2LDk1NzcsOTU3NCw5NTY4LDk1NTIsOTU4MCw5NTc1LDk1NzYsOTU3Miw5NTczLDk1NjEsOTU2MCw5NTU0LDk1NTUsOTU3OSw5NTc4LDk0OTYsOTQ4NCw5NjA4LDk2MDQsOTYxMiw5NjE2LDk2MDAsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMywxMDI1LDExMDUsMTAyOCwxMTA4LDEwMzEsMTExMSwxMDM4LDExMTgsMTc2LDg3MjksMTgzLDg3MzAsODQ3MCwxNjQsOTYzMiwxNjBdLFxuICBcImlzby04ODU5LTJcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMjYwLDcyOCwzMjEsMTY0LDMxNywzNDYsMTY3LDE2OCwzNTIsMzUwLDM1NiwzNzcsMTczLDM4MSwzNzksMTc2LDI2MSw3MzEsMzIyLDE4MCwzMTgsMzQ3LDcxMSwxODQsMzUzLDM1MSwzNTcsMzc4LDczMywzODIsMzgwLDM0MCwxOTMsMTk0LDI1OCwxOTYsMzEzLDI2MiwxOTksMjY4LDIwMSwyODAsMjAzLDI4MiwyMDUsMjA2LDI3MCwyNzIsMzIzLDMyNywyMTEsMjEyLDMzNiwyMTQsMjE1LDM0NCwzNjYsMjE4LDM2OCwyMjAsMjIxLDM1NCwyMjMsMzQxLDIyNSwyMjYsMjU5LDIyOCwzMTQsMjYzLDIzMSwyNjksMjMzLDI4MSwyMzUsMjgzLDIzNywyMzgsMjcxLDI3MywzMjQsMzI4LDI0MywyNDQsMzM3LDI0NiwyNDcsMzQ1LDM2NywyNTAsMzY5LDI1MiwyNTMsMzU1LDcyOV0sXG4gIFwiaXNvLTg4NTktM1wiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwyOTQsNzI4LDE2MywxNjQsbnVsbCwyOTIsMTY3LDE2OCwzMDQsMzUwLDI4NiwzMDgsMTczLG51bGwsMzc5LDE3NiwyOTUsMTc4LDE3OSwxODAsMTgxLDI5MywxODMsMTg0LDMwNSwzNTEsMjg3LDMwOSwxODksbnVsbCwzODAsMTkyLDE5MywxOTQsbnVsbCwxOTYsMjY2LDI2NCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNyxudWxsLDIwOSwyMTAsMjExLDIxMiwyODgsMjE0LDIxNSwyODQsMjE3LDIxOCwyMTksMjIwLDM2NCwzNDgsMjIzLDIyNCwyMjUsMjI2LG51bGwsMjI4LDI2NywyNjUsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksbnVsbCwyNDEsMjQyLDI0MywyNDQsMjg5LDI0NiwyNDcsMjg1LDI0OSwyNTAsMjUxLDI1MiwzNjUsMzQ5LDcyOV0sXG4gIFwiaXNvLTg4NTktNFwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwyNjAsMzEyLDM0MiwxNjQsMjk2LDMxNSwxNjcsMTY4LDM1MiwyNzQsMjkwLDM1OCwxNzMsMzgxLDE3NSwxNzYsMjYxLDczMSwzNDMsMTgwLDI5NywzMTYsNzExLDE4NCwzNTMsMjc1LDI5MSwzNTksMzMwLDM4MiwzMzEsMjU2LDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDMwMiwyNjgsMjAxLDI4MCwyMDMsMjc4LDIwNSwyMDYsMjk4LDI3MiwzMjUsMzMyLDMxMCwyMTIsMjEzLDIxNCwyMTUsMjE2LDM3MCwyMTgsMjE5LDIyMCwzNjAsMzYyLDIyMywyNTcsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMzAzLDI2OSwyMzMsMjgxLDIzNSwyNzksMjM3LDIzOCwyOTksMjczLDMyNiwzMzMsMzExLDI0NCwyNDUsMjQ2LDI0NywyNDgsMzcxLDI1MCwyNTEsMjUyLDM2MSwzNjMsNzI5XSxcbiAgXCJpc28tODg1OS01XCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDEwMjUsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDE3MywxMDM4LDEwMzksMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMyw4NDcwLDExMDUsMTEwNiwxMTA3LDExMDgsMTEwOSwxMTEwLDExMTEsMTExMiwxMTEzLDExMTQsMTExNSwxMTE2LDE2NywxMTE4LDExMTldLFxuICBcImlzby04ODU5LTZcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsbnVsbCxudWxsLG51bGwsMTY0LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMTU0OCwxNzMsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxNTYzLG51bGwsbnVsbCxudWxsLDE1NjcsbnVsbCwxNTY5LDE1NzAsMTU3MSwxNTcyLDE1NzMsMTU3NCwxNTc1LDE1NzYsMTU3NywxNTc4LDE1NzksMTU4MCwxNTgxLDE1ODIsMTU4MywxNTg0LDE1ODUsMTU4NiwxNTg3LDE1ODgsMTU4OSwxNTkwLDE1OTEsMTU5MiwxNTkzLDE1OTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE2MDAsMTYwMSwxNjAyLDE2MDMsMTYwNCwxNjA1LDE2MDYsMTYwNywxNjA4LDE2MDksMTYxMCwxNjExLDE2MTIsMTYxMywxNjE0LDE2MTUsMTYxNiwxNjE3LDE2MTgsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sXG4gIFwiaXNvLTg4NTktN1wiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCw4MjE2LDgyMTcsMTYzLDgzNjQsODM2NywxNjYsMTY3LDE2OCwxNjksODkwLDE3MSwxNzIsMTczLG51bGwsODIxMywxNzYsMTc3LDE3OCwxNzksOTAwLDkwMSw5MDIsMTgzLDkwNCw5MDUsOTA2LDE4Nyw5MDgsMTg5LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksbnVsbCw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsOTM4LDkzOSw5NDAsOTQxLDk0Miw5NDMsOTQ0LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYyLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw5NzAsOTcxLDk3Miw5NzMsOTc0LG51bGxdLFxuICBcImlzby04ODU5LThcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsbnVsbCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDIxNSwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwyNDcsMTg3LDE4OCwxODksMTkwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCw4MjE1LDE0ODgsMTQ4OSwxNDkwLDE0OTEsMTQ5MiwxNDkzLDE0OTQsMTQ5NSwxNDk2LDE0OTcsMTQ5OCwxNDk5LDE1MDAsMTUwMSwxNTAyLDE1MDMsMTUwNCwxNTA1LDE1MDYsMTUwNywxNTA4LDE1MDksMTUxMCwxNTExLDE1MTIsMTUxMywxNTE0LG51bGwsbnVsbCw4MjA2LDgyMDcsbnVsbF0sXG4gIFwiaXNvLTg4NTktMTBcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMjYwLDI3NCwyOTAsMjk4LDI5NiwzMTAsMTY3LDMxNSwyNzIsMzUyLDM1OCwzODEsMTczLDM2MiwzMzAsMTc2LDI2MSwyNzUsMjkxLDI5OSwyOTcsMzExLDE4MywzMTYsMjczLDM1MywzNTksMzgyLDgyMTMsMzYzLDMzMSwyNTYsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMzAyLDI2OCwyMDEsMjgwLDIwMywyNzgsMjA1LDIwNiwyMDcsMjA4LDMyNSwzMzIsMjExLDIxMiwyMTMsMjE0LDM2MCwyMTYsMzcwLDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDI1NywyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwzMDMsMjY5LDIzMywyODEsMjM1LDI3OSwyMzcsMjM4LDIzOSwyNDAsMzI2LDMzMywyNDMsMjQ0LDI0NSwyNDYsMzYxLDI0OCwzNzEsMjUwLDI1MSwyNTIsMjUzLDI1NCwzMTJdLFxuICBcImlzby04ODU5LTEzXCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDgyMjEsMTYyLDE2MywxNjQsODIyMiwxNjYsMTY3LDIxNiwxNjksMzQyLDE3MSwxNzIsMTczLDE3NCwxOTgsMTc2LDE3NywxNzgsMTc5LDgyMjAsMTgxLDE4MiwxODMsMjQ4LDE4NSwzNDMsMTg3LDE4OCwxODksMTkwLDIzMCwyNjAsMzAyLDI1NiwyNjIsMTk2LDE5NywyODAsMjc0LDI2OCwyMDEsMzc3LDI3OCwyOTAsMzEwLDI5OCwzMTUsMzUyLDMyMywzMjUsMjExLDMzMiwyMTMsMjE0LDIxNSwzNzAsMzIxLDM0NiwzNjIsMjIwLDM3OSwzODEsMjIzLDI2MSwzMDMsMjU3LDI2MywyMjgsMjI5LDI4MSwyNzUsMjY5LDIzMywzNzgsMjc5LDI5MSwzMTEsMjk5LDMxNiwzNTMsMzI0LDMyNiwyNDMsMzMzLDI0NSwyNDYsMjQ3LDM3MSwzMjIsMzQ3LDM2MywyNTIsMzgwLDM4Miw4MjE3XSxcbiAgXCJpc28tODg1OS0xNFwiOlsxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCw3NjgyLDc2ODMsMTYzLDI2NiwyNjcsNzY5MCwxNjcsNzgwOCwxNjksNzgxMCw3NjkxLDc5MjIsMTczLDE3NCwzNzYsNzcxMCw3NzExLDI4OCwyODksNzc0NCw3NzQ1LDE4Miw3NzY2LDc4MDksNzc2Nyw3ODExLDc3NzYsNzkyMyw3ODEyLDc4MTMsNzc3NywxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMzcyLDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDc3ODYsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMzc0LDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMzczLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDc3ODcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMzc1LDI1NV0sXG4gIFwiaXNvLTg4NTktMTVcIjpbMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsODM2NCwxNjUsMzUyLDE2NywzNTMsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwzODEsMTgxLDE4MiwxODMsMzgyLDE4NSwxODYsMTg3LDMzOCwzMzksMzc2LDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwyNTVdLFxuICBcImlzby04ODU5LTE2XCI6WzEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDI2MCwyNjEsMzIxLDgzNjQsODIyMiwzNTIsMTY3LDM1MywxNjksNTM2LDE3MSwzNzcsMTczLDM3OCwzNzksMTc2LDE3NywyNjgsMzIyLDM4MSw4MjIxLDE4MiwxODMsMzgyLDI2OSw1MzcsMTg3LDMzOCwzMzksMzc2LDM4MCwxOTIsMTkzLDE5NCwyNTgsMTk2LDI2MiwxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjcyLDMyMywyMTAsMjExLDIxMiwzMzYsMjE0LDM0NiwzNjgsMjE3LDIxOCwyMTksMjIwLDI4MCw1MzgsMjIzLDIyNCwyMjUsMjI2LDI1OSwyMjgsMjYzLDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNzMsMzI0LDI0MiwyNDMsMjQ0LDMzNywyNDYsMzQ3LDM2OSwyNDksMjUwLDI1MSwyNTIsMjgxLDUzOSwyNTVdLFxuICBcImtvaTgtclwiOls5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTYwMCw5NjA0LDk2MDgsOTYxMiw5NjE2LDk2MTcsOTYxOCw5NjE5LDg5OTIsOTYzMiw4NzI5LDg3MzAsODc3Niw4ODA0LDg4MDUsMTYwLDg5OTMsMTc2LDE3OCwxODMsMjQ3LDk1NTIsOTU1Myw5NTU0LDExMDUsOTU1NSw5NTU2LDk1NTcsOTU1OCw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsOTU2NCw5NTY1LDk1NjYsOTU2Nyw5NTY4LDk1NjksMTAyNSw5NTcwLDk1NzEsOTU3Miw5NTczLDk1NzQsOTU3NSw5NTc2LDk1NzcsOTU3OCw5NTc5LDk1ODAsMTY5LDExMDIsMTA3MiwxMDczLDEwOTQsMTA3NiwxMDc3LDEwOTIsMTA3NSwxMDkzLDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMTAzLDEwODgsMTA4OSwxMDkwLDEwOTEsMTA3OCwxMDc0LDExMDAsMTA5OSwxMDc5LDEwOTYsMTEwMSwxMDk3LDEwOTUsMTA5OCwxMDcwLDEwNDAsMTA0MSwxMDYyLDEwNDQsMTA0NSwxMDYwLDEwNDMsMTA2MSwxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA3MSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNDYsMTA0MiwxMDY4LDEwNjcsMTA0NywxMDY0LDEwNjksMTA2NSwxMDYzLDEwNjZdLFxuICBcImtvaTgtdVwiOls5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTYwMCw5NjA0LDk2MDgsOTYxMiw5NjE2LDk2MTcsOTYxOCw5NjE5LDg5OTIsOTYzMiw4NzI5LDg3MzAsODc3Niw4ODA0LDg4MDUsMTYwLDg5OTMsMTc2LDE3OCwxODMsMjQ3LDk1NTIsOTU1Myw5NTU0LDExMDUsMTEwOCw5NTU2LDExMTAsMTExMSw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsMTE2OSwxMTE4LDk1NjYsOTU2Nyw5NTY4LDk1NjksMTAyNSwxMDI4LDk1NzEsMTAzMCwxMDMxLDk1NzQsOTU3NSw5NTc2LDk1NzcsOTU3OCwxMTY4LDEwMzgsMTY5LDExMDIsMTA3MiwxMDczLDEwOTQsMTA3NiwxMDc3LDEwOTIsMTA3NSwxMDkzLDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMTAzLDEwODgsMTA4OSwxMDkwLDEwOTEsMTA3OCwxMDc0LDExMDAsMTA5OSwxMDc5LDEwOTYsMTEwMSwxMDk3LDEwOTUsMTA5OCwxMDcwLDEwNDAsMTA0MSwxMDYyLDEwNDQsMTA0NSwxMDYwLDEwNDMsMTA2MSwxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA3MSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNDYsMTA0MiwxMDY4LDEwNjcsMTA0NywxMDY0LDEwNjksMTA2NSwxMDYzLDEwNjZdLFxuICBcIm1hY2ludG9zaFwiOlsxOTYsMTk3LDE5OSwyMDEsMjA5LDIxNCwyMjAsMjI1LDIyNCwyMjYsMjI4LDIyNywyMjksMjMxLDIzMywyMzIsMjM0LDIzNSwyMzcsMjM2LDIzOCwyMzksMjQxLDI0MywyNDIsMjQ0LDI0NiwyNDUsMjUwLDI0OSwyNTEsMjUyLDgyMjQsMTc2LDE2MiwxNjMsMTY3LDgyMjYsMTgyLDIyMywxNzQsMTY5LDg0ODIsMTgwLDE2OCw4ODAwLDE5OCwyMTYsODczNCwxNzcsODgwNCw4ODA1LDE2NSwxODEsODcwNiw4NzIxLDg3MTksOTYwLDg3NDcsMTcwLDE4Niw5MzcsMjMwLDI0OCwxOTEsMTYxLDE3Miw4NzMwLDQwMiw4Nzc2LDg3MTAsMTcxLDE4Nyw4MjMwLDE2MCwxOTIsMTk1LDIxMywzMzgsMzM5LDgyMTEsODIxMiw4MjIwLDgyMjEsODIxNiw4MjE3LDI0Nyw5Njc0LDI1NSwzNzYsODI2MCw4MzY0LDgyNDksODI1MCw2NDI1Nyw2NDI1OCw4MjI1LDE4Myw4MjE4LDgyMjIsODI0MCwxOTQsMjAyLDE5MywyMDMsMjAwLDIwNSwyMDYsMjA3LDIwNCwyMTEsMjEyLDYzNzQzLDIxMCwyMTgsMjE5LDIxNywzMDUsNzEwLDczMiwxNzUsNzI4LDcyOSw3MzAsMTg0LDczMyw3MzEsNzExXSxcbiAgXCJ3aW5kb3dzLTg3NFwiOls4MzY0LDEyOSwxMzAsMTMxLDEzMiw4MjMwLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwzNTg1LDM1ODYsMzU4NywzNTg4LDM1ODksMzU5MCwzNTkxLDM1OTIsMzU5MywzNTk0LDM1OTUsMzU5NiwzNTk3LDM1OTgsMzU5OSwzNjAwLDM2MDEsMzYwMiwzNjAzLDM2MDQsMzYwNSwzNjA2LDM2MDcsMzYwOCwzNjA5LDM2MTAsMzYxMSwzNjEyLDM2MTMsMzYxNCwzNjE1LDM2MTYsMzYxNywzNjE4LDM2MTksMzYyMCwzNjIxLDM2MjIsMzYyMywzNjI0LDM2MjUsMzYyNiwzNjI3LDM2MjgsMzYyOSwzNjMwLDM2MzEsMzYzMiwzNjMzLDM2MzQsMzYzNSwzNjM2LDM2MzcsMzYzOCwzNjM5LDM2NDAsMzY0MSwzNjQyLG51bGwsbnVsbCxudWxsLG51bGwsMzY0NywzNjQ4LDM2NDksMzY1MCwzNjUxLDM2NTIsMzY1MywzNjU0LDM2NTUsMzY1NiwzNjU3LDM2NTgsMzY1OSwzNjYwLDM2NjEsMzY2MiwzNjYzLDM2NjQsMzY2NSwzNjY2LDM2NjcsMzY2OCwzNjY5LDM2NzAsMzY3MSwzNjcyLDM2NzMsMzY3NCwzNjc1LG51bGwsbnVsbCxudWxsLG51bGxdLFxuICBcIndpbmRvd3MtMTI1MFwiOls4MzY0LDEyOSw4MjE4LDEzMSw4MjIyLDgyMzAsODIyNCw4MjI1LDEzNiw4MjQwLDM1Miw4MjQ5LDM0NiwzNTYsMzgxLDM3NywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsODQ4MiwzNTMsODI1MCwzNDcsMzU3LDM4MiwzNzgsMTYwLDcxMSw3MjgsMzIxLDE2NCwyNjAsMTY2LDE2NywxNjgsMTY5LDM1MCwxNzEsMTcyLDE3MywxNzQsMzc5LDE3NiwxNzcsNzMxLDMyMiwxODAsMTgxLDE4MiwxODMsMTg0LDI2MSwzNTEsMTg3LDMxNyw3MzMsMzE4LDM4MCwzNDAsMTkzLDE5NCwyNTgsMTk2LDMxMywyNjIsMTk5LDI2OCwyMDEsMjgwLDIwMywyODIsMjA1LDIwNiwyNzAsMjcyLDMyMywzMjcsMjExLDIxMiwzMzYsMjE0LDIxNSwzNDQsMzY2LDIxOCwzNjgsMjIwLDIyMSwzNTQsMjIzLDM0MSwyMjUsMjI2LDI1OSwyMjgsMzE0LDI2MywyMzEsMjY5LDIzMywyODEsMjM1LDI4MywyMzcsMjM4LDI3MSwyNzMsMzI0LDMyOCwyNDMsMjQ0LDMzNywyNDYsMjQ3LDM0NSwzNjcsMjUwLDM2OSwyNTIsMjUzLDM1NSw3MjldLFxuICBcIndpbmRvd3MtMTI1MVwiOlsxMDI2LDEwMjcsODIxOCwxMTA3LDgyMjIsODIzMCw4MjI0LDgyMjUsODM2NCw4MjQwLDEwMzMsODI0OSwxMDM0LDEwMzYsMTAzNSwxMDM5LDExMDYsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsODQ4MiwxMTEzLDgyNTAsMTExNCwxMTE2LDExMTUsMTExOSwxNjAsMTAzOCwxMTE4LDEwMzIsMTY0LDExNjgsMTY2LDE2NywxMDI1LDE2OSwxMDI4LDE3MSwxNzIsMTczLDE3NCwxMDMxLDE3NiwxNzcsMTAzMCwxMTEwLDExNjksMTgxLDE4MiwxODMsMTEwNSw4NDcwLDExMDgsMTg3LDExMTIsMTAyOSwxMTA5LDExMTEsMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwM10sXG4gIFwid2luZG93cy0xMjUyXCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsNzEwLDgyNDAsMzUyLDgyNDksMzM4LDE0MSwzODEsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDczMiw4NDgyLDM1Myw4MjUwLDMzOSwxNTcsMzgyLDM3NiwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NV0sXG4gIFwid2luZG93cy0xMjUzXCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsMTM2LDgyNDAsMTM4LDgyNDksMTQwLDE0MSwxNDIsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE1Miw4NDgyLDE1NCw4MjUwLDE1NiwxNTcsMTU4LDE1OSwxNjAsOTAxLDkwMiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksbnVsbCwxNzEsMTcyLDE3MywxNzQsODIxMywxNzYsMTc3LDE3OCwxNzksOTAwLDE4MSwxODIsMTgzLDkwNCw5MDUsOTA2LDE4Nyw5MDgsMTg5LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksbnVsbCw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsOTM4LDkzOSw5NDAsOTQxLDk0Miw5NDMsOTQ0LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYyLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw5NzAsOTcxLDk3Miw5NzMsOTc0LG51bGxdLFxuICBcIndpbmRvd3MtMTI1NFwiOls4MzY0LDEyOSw4MjE4LDQwMiw4MjIyLDgyMzAsODIyNCw4MjI1LDcxMCw4MjQwLDM1Miw4MjQ5LDMzOCwxNDEsMTQyLDE0MywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiw3MzIsODQ4MiwzNTMsODI1MCwzMzksMTU3LDE1OCwzNzYsMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjg2LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDMwNCwzNTAsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyODcsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMzA1LDM1MSwyNTVdLFxuICBcIndpbmRvd3MtMTI1NVwiOls4MzY0LDEyOSw4MjE4LDQwMiw4MjIyLDgyMzAsODIyNCw4MjI1LDcxMCw4MjQwLDEzOCw4MjQ5LDE0MCwxNDEsMTQyLDE0MywxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiw3MzIsODQ4MiwxNTQsODI1MCwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDgzNjIsMTY1LDE2NiwxNjcsMTY4LDE2OSwyMTUsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMjQ3LDE4NywxODgsMTg5LDE5MCwxOTEsMTQ1NiwxNDU3LDE0NTgsMTQ1OSwxNDYwLDE0NjEsMTQ2MiwxNDYzLDE0NjQsMTQ2NSwxNDY2LDE0NjcsMTQ2OCwxNDY5LDE0NzAsMTQ3MSwxNDcyLDE0NzMsMTQ3NCwxNDc1LDE1MjAsMTUyMSwxNTIyLDE1MjMsMTUyNCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDE0ODgsMTQ4OSwxNDkwLDE0OTEsMTQ5MiwxNDkzLDE0OTQsMTQ5NSwxNDk2LDE0OTcsMTQ5OCwxNDk5LDE1MDAsMTUwMSwxNTAyLDE1MDMsMTUwNCwxNTA1LDE1MDYsMTUwNywxNTA4LDE1MDksMTUxMCwxNTExLDE1MTIsMTUxMywxNTE0LG51bGwsbnVsbCw4MjA2LDgyMDcsbnVsbF0sXG4gIFwid2luZG93cy0xMjU2XCI6WzgzNjQsMTY2Miw4MjE4LDQwMiw4MjIyLDgyMzAsODIyNCw4MjI1LDcxMCw4MjQwLDE2NTcsODI0OSwzMzgsMTY3MCwxNjg4LDE2NzIsMTcxMSw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDE3MDUsODQ4MiwxNjgxLDgyNTAsMzM5LDgyMDQsODIwNSwxNzIyLDE2MCwxNTQ4LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcyNiwxNzEsMTcyLDE3MywxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxNTYzLDE4NywxODgsMTg5LDE5MCwxNTY3LDE3MjksMTU2OSwxNTcwLDE1NzEsMTU3MiwxNTczLDE1NzQsMTU3NSwxNTc2LDE1NzcsMTU3OCwxNTc5LDE1ODAsMTU4MSwxNTgyLDE1ODMsMTU4NCwxNTg1LDE1ODYsMTU4NywxNTg4LDE1ODksMTU5MCwyMTUsMTU5MSwxNTkyLDE1OTMsMTU5NCwxNjAwLDE2MDEsMTYwMiwxNjAzLDIyNCwxNjA0LDIyNiwxNjA1LDE2MDYsMTYwNywxNjA4LDIzMSwyMzIsMjMzLDIzNCwyMzUsMTYwOSwxNjEwLDIzOCwyMzksMTYxMSwxNjEyLDE2MTMsMTYxNCwyNDQsMTYxNSwxNjE2LDI0NywxNjE3LDI0OSwxNjE4LDI1MSwyNTIsODIwNiw4MjA3LDE3NDZdLFxuICBcIndpbmRvd3MtMTI1N1wiOls4MzY0LDEyOSw4MjE4LDEzMSw4MjIyLDgyMzAsODIyNCw4MjI1LDEzNiw4MjQwLDEzOCw4MjQ5LDE0MCwxNjgsNzExLDE4NCwxNDQsODIxNiw4MjE3LDgyMjAsODIyMSw4MjI2LDgyMTEsODIxMiwxNTIsODQ4MiwxNTQsODI1MCwxNTYsMTc1LDczMSwxNTksMTYwLG51bGwsMTYyLDE2MywxNjQsbnVsbCwxNjYsMTY3LDIxNiwxNjksMzQyLDE3MSwxNzIsMTczLDE3NCwxOTgsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywyNDgsMTg1LDM0MywxODcsMTg4LDE4OSwxOTAsMjMwLDI2MCwzMDIsMjU2LDI2MiwxOTYsMTk3LDI4MCwyNzQsMjY4LDIwMSwzNzcsMjc4LDI5MCwzMTAsMjk4LDMxNSwzNTIsMzIzLDMyNSwyMTEsMzMyLDIxMywyMTQsMjE1LDM3MCwzMjEsMzQ2LDM2MiwyMjAsMzc5LDM4MSwyMjMsMjYxLDMwMywyNTcsMjYzLDIyOCwyMjksMjgxLDI3NSwyNjksMjMzLDM3OCwyNzksMjkxLDMxMSwyOTksMzE2LDM1MywzMjQsMzI2LDI0MywzMzMsMjQ1LDI0NiwyNDcsMzcxLDMyMiwzNDcsMzYzLDI1MiwzODAsMzgyLDcyOV0sXG4gIFwid2luZG93cy0xMjU4XCI6WzgzNjQsMTI5LDgyMTgsNDAyLDgyMjIsODIzMCw4MjI0LDgyMjUsNzEwLDgyNDAsMTM4LDgyNDksMzM4LDE0MSwxNDIsMTQzLDE0NCw4MjE2LDgyMTcsODIyMCw4MjIxLDgyMjYsODIxMSw4MjEyLDczMiw4NDgyLDE1NCw4MjUwLDMzOSwxNTcsMTU4LDM3NiwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDI1OCwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDc2OCwyMDUsMjA2LDIwNywyNzIsMjA5LDc3NywyMTEsMjEyLDQxNiwyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsNDMxLDc3MSwyMjMsMjI0LDIyNSwyMjYsMjU5LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsNzY5LDIzNywyMzgsMjM5LDI3MywyNDEsODAzLDI0MywyNDQsNDE3LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1Miw0MzIsODM2MywyNTVdLFxuICBcIngtbWFjLWN5cmlsbGljXCI6WzEwNDAsMTA0MSwxMDQyLDEwNDMsMTA0NCwxMDQ1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSw4MjI0LDE3NiwxMTY4LDE2MywxNjcsODIyNiwxODIsMTAzMCwxNzQsMTY5LDg0ODIsMTAyNiwxMTA2LDg4MDAsMTAyNywxMTA3LDg3MzQsMTc3LDg4MDQsODgwNSwxMTEwLDE4MSwxMTY5LDEwMzIsMTAyOCwxMTA4LDEwMzEsMTExMSwxMDMzLDExMTMsMTAzNCwxMTE0LDExMTIsMTAyOSwxNzIsODczMCw0MDIsODc3Niw4NzEwLDE3MSwxODcsODIzMCwxNjAsMTAzNSwxMTE1LDEwMzYsMTExNiwxMTA5LDgyMTEsODIxMiw4MjIwLDgyMjEsODIxNiw4MjE3LDI0Nyw4MjIyLDEwMzgsMTExOCwxMDM5LDExMTksODQ3MCwxMDI1LDExMDUsMTEwMywxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDgzNjRdXG59O1xuXG4vLyBGb3Igc3RyaWN0IGVudmlyb25tZW50cyB3aGVyZSBgdGhpc2AgaW5zaWRlIHRoZSBnbG9iYWwgc2NvcGVcbi8vIGlzIGB1bmRlZmluZWRgLCB0YWtlIGEgcHVyZSBvYmplY3QgaW5zdGVhZFxufSh0aGlzIHx8IHt9KSk7IiwiLy8gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbi8vIFNlZSBMSUNFTlNFLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgR2xvYmFsIHx0aGlzfCByZXF1aXJlZCBmb3IgcmVzb2x2aW5nIGluZGV4ZXMgaW4gbm9kZS5cbiAqIEBzdXBwcmVzcyB7Z2xvYmFsVGhpc31cbiAqL1xuKGZ1bmN0aW9uKGdsb2JhbCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gSWYgd2UncmUgaW4gbm9kZSByZXF1aXJlIGVuY29kaW5nLWluZGV4ZXMgYW5kIGF0dGFjaCBpdCB0byB0aGUgZ2xvYmFsLlxuICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cyAmJlxuICAgICFnbG9iYWxbXCJlbmNvZGluZy1pbmRleGVzXCJdKSB7XG4gICAgZ2xvYmFsW1wiZW5jb2RpbmctaW5kZXhlc1wiXSA9XG4gICAgICByZXF1aXJlKFwiLi9lbmNvZGluZy1pbmRleGVzLmpzXCIpW1wiZW5jb2RpbmctaW5kZXhlc1wiXTtcbiAgfVxuXG4gIC8vXG4gIC8vIFV0aWxpdGllc1xuICAvL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgbnVtYmVyIHRvIHRlc3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gVGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIHJhbmdlLCBpbmNsdXNpdmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggVGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHJhbmdlLCBpbmNsdXNpdmUuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYSA+PSBtaW4gYW5kIGEgPD0gbWF4LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5SYW5nZShhLCBtaW4sIG1heCkge1xuICAgIHJldHVybiBtaW4gPD0gYSAmJiBhIDw9IG1heDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyFBcnJheS48Kj59IGFycmF5IFRoZSBhcnJheSB0byBjaGVjay5cbiAgICogQHBhcmFtIHsqfSBpdGVtIFRoZSBpdGVtIHRvIGxvb2sgZm9yIGluIHRoZSBhcnJheS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgaXRlbSBhcHBlYXJzIGluIHRoZSBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGluY2x1ZGVzKGFycmF5LCBpdGVtKSB7XG4gICAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSkgIT09IC0xO1xuICB9XG5cbiAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIFRvRGljdGlvbmFyeShvKSB7XG4gICAgaWYgKG8gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHt9O1xuICAgIGlmIChvID09PSBPYmplY3QobykpIHJldHVybiBvO1xuICAgIHRocm93IFR5cGVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgYXJndW1lbnQgdG8gZGljdGlvbmFyeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgSW5wdXQgc3RyaW5nIG9mIFVURi0xNiBjb2RlIHVuaXRzLlxuICAgKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59IENvZGUgcG9pbnRzLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nVG9Db2RlUG9pbnRzKHN0cmluZykge1xuICAgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vYnRhaW4tdW5pY29kZVxuXG4gICAgLy8gMS4gTGV0IFMgYmUgdGhlIERPTVN0cmluZyB2YWx1ZS5cbiAgICB2YXIgcyA9IFN0cmluZyhzdHJpbmcpO1xuXG4gICAgLy8gMi4gTGV0IG4gYmUgdGhlIGxlbmd0aCBvZiBTLlxuICAgIHZhciBuID0gcy5sZW5ndGg7XG5cbiAgICAvLyAzLiBJbml0aWFsaXplIGkgdG8gMC5cbiAgICB2YXIgaSA9IDA7XG5cbiAgICAvLyA0LiBJbml0aWFsaXplIFUgdG8gYmUgYW4gZW1wdHkgc2VxdWVuY2Ugb2YgVW5pY29kZSBjaGFyYWN0ZXJzLlxuICAgIHZhciB1ID0gW107XG5cbiAgICAvLyA1LiBXaGlsZSBpIDwgbjpcbiAgICB3aGlsZSAoaSA8IG4pIHtcblxuICAgICAgLy8gMS4gTGV0IGMgYmUgdGhlIGNvZGUgdW5pdCBpbiBTIGF0IGluZGV4IGkuXG4gICAgICB2YXIgYyA9IHMuY2hhckNvZGVBdChpKTtcblxuICAgICAgLy8gMi4gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjOlxuXG4gICAgICAvLyBjIDwgMHhEODAwIG9yIGMgPiAweERGRkZcbiAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPiAweERGRkYpIHtcbiAgICAgICAgLy8gQXBwZW5kIHRvIFUgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludCBjLlxuICAgICAgICB1LnB1c2goYyk7XG4gICAgICB9XG5cbiAgICAgIC8vIDB4REMwMCDiiaQgYyDiiaQgMHhERkZGXG4gICAgICBlbHNlIGlmICgweERDMDAgPD0gYyAmJiBjIDw9IDB4REZGRikge1xuICAgICAgICAvLyBBcHBlbmQgdG8gVSBhIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIuXG4gICAgICAgIHUucHVzaCgweEZGRkQpO1xuICAgICAgfVxuXG4gICAgICAvLyAweEQ4MDAg4omkIGMg4omkIDB4REJGRlxuICAgICAgZWxzZSBpZiAoMHhEODAwIDw9IGMgJiYgYyA8PSAweERCRkYpIHtcbiAgICAgICAgLy8gMS4gSWYgaSA9IG7iiJIxLCB0aGVuIGFwcGVuZCB0byBVIGEgVStGRkZEIFJFUExBQ0VNRU5UXG4gICAgICAgIC8vIENIQVJBQ1RFUi5cbiAgICAgICAgaWYgKGkgPT09IG4gLSAxKSB7XG4gICAgICAgICAgdS5wdXNoKDB4RkZGRCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpIDwgbuKIkjE6XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIDEuIExldCBkIGJlIHRoZSBjb2RlIHVuaXQgaW4gUyBhdCBpbmRleCBpKzEuXG4gICAgICAgICAgdmFyIGQgPSBzLmNoYXJDb2RlQXQoaSArIDEpO1xuXG4gICAgICAgICAgLy8gMi4gSWYgMHhEQzAwIOKJpCBkIOKJpCAweERGRkYsIHRoZW46XG4gICAgICAgICAgaWYgKDB4REMwMCA8PSBkICYmIGQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgICAvLyAxLiBMZXQgYSBiZSBjICYgMHgzRkYuXG4gICAgICAgICAgICB2YXIgYSA9IGMgJiAweDNGRjtcblxuICAgICAgICAgICAgLy8gMi4gTGV0IGIgYmUgZCAmIDB4M0ZGLlxuICAgICAgICAgICAgdmFyIGIgPSBkICYgMHgzRkY7XG5cbiAgICAgICAgICAgIC8vIDMuIEFwcGVuZCB0byBVIHRoZSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIC8vIDJeMTYrMl4xMCphK2IuXG4gICAgICAgICAgICB1LnB1c2goMHgxMDAwMCArIChhIDw8IDEwKSArIGIpO1xuXG4gICAgICAgICAgICAvLyA0LiBTZXQgaSB0byBpKzEuXG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBkIDwgMHhEQzAwIG9yIGQgPiAweERGRkYuIEFwcGVuZCB0byBVIGFcbiAgICAgICAgICAvLyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLlxuICAgICAgICAgIGVsc2UgIHtcbiAgICAgICAgICAgIHUucHVzaCgweEZGRkQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBTZXQgaSB0byBpKzEuXG4gICAgICBpICs9IDE7XG4gICAgfVxuXG4gICAgLy8gNi4gUmV0dXJuIFUuXG4gICAgcmV0dXJuIHU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGNvZGVfcG9pbnRzIEFycmF5IG9mIGNvZGUgcG9pbnRzLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHN0cmluZyBTdHJpbmcgb2YgVVRGLTE2IGNvZGUgdW5pdHMuXG4gICAqL1xuICBmdW5jdGlvbiBjb2RlUG9pbnRzVG9TdHJpbmcoY29kZV9wb2ludHMpIHtcbiAgICB2YXIgcyA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZV9wb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBjcCA9IGNvZGVfcG9pbnRzW2ldO1xuICAgICAgaWYgKGNwIDw9IDB4RkZGRikge1xuICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3AgLT0gMHgxMDAwMDtcbiAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjcCA+PiAxMCkgKyAweEQ4MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3AgJiAweDNGRikgKyAweERDMDApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcztcbiAgfVxuXG5cbiAgLy9cbiAgLy8gSW1wbGVtZW50YXRpb24gb2YgRW5jb2Rpbmcgc3BlY2lmaWNhdGlvblxuICAvLyBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy9cbiAgLy9cblxuICAvL1xuICAvLyA0LiBUZXJtaW5vbG9neVxuICAvL1xuXG4gIC8qKlxuICAgKiBBbiBBU0NJSSBieXRlIGlzIGEgYnl0ZSBpbiB0aGUgcmFuZ2UgMHgwMCB0byAweDdGLCBpbmNsdXNpdmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhIFRoZSBudW1iZXIgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIGlzIGluIHRoZSByYW5nZSAweDAwIHRvIDB4N0YsIGluY2x1c2l2ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGlzQVNDSUlCeXRlKGEpIHtcbiAgICByZXR1cm4gMHgwMCA8PSBhICYmIGEgPD0gMHg3RjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBBU0NJSSBjb2RlIHBvaW50IGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgVSswMDAwIHRvXG4gICAqIFUrMDA3RiwgaW5jbHVzaXZlLlxuICAgKi9cbiAgdmFyIGlzQVNDSUlDb2RlUG9pbnQgPSBpc0FTQ0lJQnl0ZTtcblxuXG4gIC8qKlxuICAgKiBFbmQtb2Ytc3RyZWFtIGlzIGEgc3BlY2lhbCB0b2tlbiB0aGF0IHNpZ25pZmllcyBubyBtb3JlIHRva2Vuc1xuICAgKiBhcmUgaW4gdGhlIHN0cmVhbS5cbiAgICogQGNvbnN0XG4gICAqLyB2YXIgZW5kX29mX3N0cmVhbSA9IC0xO1xuXG4gIC8qKlxuICAgKiBBIHN0cmVhbSByZXByZXNlbnRzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgdG9rZW5zLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHshKEFycmF5LjxudW1iZXI+fFVpbnQ4QXJyYXkpfSB0b2tlbnMgQXJyYXkgb2YgdG9rZW5zIHRoYXQgcHJvdmlkZVxuICAgKiB0aGUgc3RyZWFtLlxuICAgKi9cbiAgZnVuY3Rpb24gU3RyZWFtKHRva2Vucykge1xuICAgIC8qKiBAdHlwZSB7IUFycmF5LjxudW1iZXI+fSAqL1xuICAgIHRoaXMudG9rZW5zID0gW10uc2xpY2UuY2FsbCh0b2tlbnMpO1xuICAgIC8vIFJldmVyc2VkIGFzIHB1c2gvcG9wIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gc2hpZnQvdW5zaGlmdC5cbiAgICB0aGlzLnRva2Vucy5yZXZlcnNlKCk7XG4gIH1cblxuICBTdHJlYW0ucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgZW5kLW9mLXN0cmVhbSBoYXMgYmVlbiBoaXQuXG4gICAgICovXG4gICAgZW5kT2ZTdHJlYW06IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICF0aGlzLnRva2Vucy5sZW5ndGg7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSB0b2tlbiBpcyByZWFkIGZyb20gYSBzdHJlYW0sIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGVcbiAgICAgKiBzdHJlYW0gbXVzdCBiZSByZXR1cm5lZCBhbmQgc3Vic2VxdWVudGx5IHJlbW92ZWQsIGFuZFxuICAgICAqIGVuZC1vZi1zdHJlYW0gbXVzdCBiZSByZXR1cm5lZCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEdldCB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBzdHJlYW0sIG9yXG4gICAgICogZW5kX29mX3N0cmVhbS5cbiAgICAgKi9cbiAgICAgcmVhZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXRoaXMudG9rZW5zLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGVuZF9vZl9zdHJlYW07XG4gICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnBvcCgpO1xuICAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHByZXBlbmRlZCB0byBhIHN0cmVhbSwgdGhvc2UgdG9rZW5zXG4gICAgICogbXVzdCBiZSBpbnNlcnRlZCwgaW4gZ2l2ZW4gb3JkZXIsIGJlZm9yZSB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlXG4gICAgICogc3RyZWFtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IHRva2VuIFRoZSB0b2tlbihzKSB0byBwcmVwZW5kIHRvIHRoZVxuICAgICAqIHN0cmVhbS5cbiAgICAgKi9cbiAgICBwcmVwZW5kOiBmdW5jdGlvbih0b2tlbikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9rZW4pKSB7XG4gICAgICAgIHZhciB0b2tlbnMgPSAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHRva2VuKTtcbiAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGgpXG4gICAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbnMucG9wKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZW4gb25lIG9yIG1vcmUgdG9rZW5zIGFyZSBwdXNoZWQgdG8gYSBzdHJlYW0sIHRob3NlIHRva2Vuc1xuICAgICAqIG11c3QgYmUgaW5zZXJ0ZWQsIGluIGdpdmVuIG9yZGVyLCBhZnRlciB0aGUgbGFzdCB0b2tlbiBpbiB0aGVcbiAgICAgKiBzdHJlYW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gdG9rZW4gVGhlIHRva2VucyhzKSB0byBwdXNoIHRvIHRoZVxuICAgICAqIHN0cmVhbS5cbiAgICAgKi9cbiAgICBwdXNoOiBmdW5jdGlvbih0b2tlbikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9rZW4pKSB7XG4gICAgICAgIHZhciB0b2tlbnMgPSAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHRva2VuKTtcbiAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGgpXG4gICAgICAgICAgdGhpcy50b2tlbnMudW5zaGlmdCh0b2tlbnMuc2hpZnQoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRva2Vucy51bnNoaWZ0KHRva2VuKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy9cbiAgLy8gNS4gRW5jb2RpbmdzXG4gIC8vXG5cbiAgLy8gNS4xIEVuY29kZXJzIGFuZCBkZWNvZGVyc1xuXG4gIC8qKiBAY29uc3QgKi9cbiAgdmFyIGZpbmlzaGVkID0gLTE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmF0YWwgSWYgdHJ1ZSwgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFuIGV4Y2VwdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBvcHRfY29kZV9wb2ludCBPdmVycmlkZSB0aGUgc3RhbmRhcmQgZmFsbGJhY2sgY29kZSBwb2ludC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29kZSBwb2ludCB0byBpbnNlcnQgb24gYSBkZWNvZGluZyBlcnJvci5cbiAgICovXG4gIGZ1bmN0aW9uIGRlY29kZXJFcnJvcihmYXRhbCwgb3B0X2NvZGVfcG9pbnQpIHtcbiAgICBpZiAoZmF0YWwpXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0RlY29kZXIgZXJyb3InKTtcbiAgICByZXR1cm4gb3B0X2NvZGVfcG9pbnQgfHwgMHhGRkZEO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IFRoZSBjb2RlIHBvaW50IHRoYXQgY291bGQgbm90IGJlIGVuY29kZWQuXG4gICAqIEByZXR1cm4ge251bWJlcn0gQWx3YXlzIHRocm93cywgbm8gdmFsdWUgaXMgYWN0dWFsbHkgcmV0dXJuZWQuXG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCkge1xuICAgIHRocm93IFR5cGVFcnJvcignVGhlIGNvZGUgcG9pbnQgJyArIGNvZGVfcG9pbnQgKyAnIGNvdWxkIG5vdCBiZSBlbmNvZGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbnRlcmZhY2UgKi9cbiAgZnVuY3Rpb24gRGVjb2RlcigpIHt9XG4gIERlY29kZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LCBvciB8ZmluaXNoZWR8LlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge31cbiAgfTtcblxuICAvKiogQGludGVyZmFjZSAqL1xuICBmdW5jdGlvbiBFbmNvZGVyKCkge31cbiAgRW5jb2Rlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGNvZGUgcG9pbnRzIGJlaW5nIGVuY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LCBvciB8ZmluaXNoZWR8LlxuICAgICAqL1xuICAgIGhhbmRsZXI6IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge31cbiAgfTtcblxuICAvLyA1LjIgTmFtZXMgYW5kIGxhYmVsc1xuXG4gIC8vIFRPRE86IERlZmluZSBAdHlwZWRlZiBmb3IgRW5jb2Rpbmc6IHtuYW1lOnN0cmluZyxsYWJlbHM6QXJyYXkuPHN0cmluZz59XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMjQ3XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBUaGUgZW5jb2RpbmcgbGFiZWwuXG4gICAqIEByZXR1cm4gez97bmFtZTpzdHJpbmcsbGFiZWxzOkFycmF5LjxzdHJpbmc+fX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEVuY29kaW5nKGxhYmVsKSB7XG4gICAgLy8gMS4gUmVtb3ZlIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gbGFiZWwuXG4gICAgbGFiZWwgPSBTdHJpbmcobGFiZWwpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gMi4gSWYgbGFiZWwgaXMgYW4gQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgYW55IG9mIHRoZVxuICAgIC8vIGxhYmVscyBsaXN0ZWQgaW4gdGhlIHRhYmxlIGJlbG93LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBlbmNvZGluZywgYW5kIGZhaWx1cmUgb3RoZXJ3aXNlLlxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobGFiZWxfdG9fZW5jb2RpbmcsIGxhYmVsKSkge1xuICAgICAgcmV0dXJuIGxhYmVsX3RvX2VuY29kaW5nW2xhYmVsXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RpbmdzIHRhYmxlOiBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy9lbmNvZGluZ3MuanNvblxuICAgKiBAY29uc3RcbiAgICogQHR5cGUgeyFBcnJheS48e1xuICAgKiAgICAgICAgICBoZWFkaW5nOiBzdHJpbmcsXG4gICAqICAgICAgICAgIGVuY29kaW5nczogQXJyYXkuPHtuYW1lOnN0cmluZyxsYWJlbHM6QXJyYXkuPHN0cmluZz59PlxuICAgKiAgICAgICAgfT59XG4gICAqL1xuICB2YXIgZW5jb2RpbmdzID0gW1xuICAgIHtcbiAgICAgIFwiZW5jb2RpbmdzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwidW5pY29kZS0xLTEtdXRmLThcIixcbiAgICAgICAgICAgIFwidXRmLThcIixcbiAgICAgICAgICAgIFwidXRmOFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJVVEYtOFwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJUaGUgRW5jb2RpbmdcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCI4NjZcIixcbiAgICAgICAgICAgIFwiY3A4NjZcIixcbiAgICAgICAgICAgIFwiY3NpYm04NjZcIixcbiAgICAgICAgICAgIFwiaWJtODY2XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklCTTg2NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvbGF0aW4yXCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTJcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEwMVwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTJcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTJcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMlwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0yOjE5ODdcIixcbiAgICAgICAgICAgIFwibDJcIixcbiAgICAgICAgICAgIFwibGF0aW4yXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzb2xhdGluM1wiLFxuICAgICAgICAgICAgXCJpc28tODg1OS0zXCIsXG4gICAgICAgICAgICBcImlzby1pci0xMDlcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS0zXCIsXG4gICAgICAgICAgICBcImlzbzg4NTkzXCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTNcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMzoxOTg4XCIsXG4gICAgICAgICAgICBcImwzXCIsXG4gICAgICAgICAgICBcImxhdGluM1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0zXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjRcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktNFwiLFxuICAgICAgICAgICAgXCJpc28taXItMTEwXCIsXG4gICAgICAgICAgICBcImlzbzg4NTktNFwiLFxuICAgICAgICAgICAgXCJpc284ODU5NFwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS00XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTQ6MTk4OFwiLFxuICAgICAgICAgICAgXCJsNFwiLFxuICAgICAgICAgICAgXCJsYXRpbjRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktNFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvbGF0aW5jeXJpbGxpY1wiLFxuICAgICAgICAgICAgXCJjeXJpbGxpY1wiLFxuICAgICAgICAgICAgXCJpc28tODg1OS01XCIsXG4gICAgICAgICAgICBcImlzby1pci0xNDRcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS01XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk1XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTVcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktNToxOTg4XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJhcmFiaWNcIixcbiAgICAgICAgICAgIFwiYXNtby03MDhcIixcbiAgICAgICAgICAgIFwiY3Npc284ODU5NmVcIixcbiAgICAgICAgICAgIFwiY3Npc284ODU5NmlcIixcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbmFyYWJpY1wiLFxuICAgICAgICAgICAgXCJlY21hLTExNFwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS02XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTYtZVwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS02LWlcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEyN1wiLFxuICAgICAgICAgICAgXCJpc284ODU5LTZcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTZcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktNlwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS02OjE5ODdcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvbGF0aW5ncmVla1wiLFxuICAgICAgICAgICAgXCJlY21hLTExOFwiLFxuICAgICAgICAgICAgXCJlbG90XzkyOFwiLFxuICAgICAgICAgICAgXCJncmVla1wiLFxuICAgICAgICAgICAgXCJncmVlazhcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktN1wiLFxuICAgICAgICAgICAgXCJpc28taXItMTI2XCIsXG4gICAgICAgICAgICBcImlzbzg4NTktN1wiLFxuICAgICAgICAgICAgXCJpc284ODU5N1wiLFxuICAgICAgICAgICAgXCJpc29fODg1OS03XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTc6MTk4N1wiLFxuICAgICAgICAgICAgXCJzdW5fZXVfZ3JlZWtcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktN1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvODg1OThlXCIsXG4gICAgICAgICAgICBcImNzaXNvbGF0aW5oZWJyZXdcIixcbiAgICAgICAgICAgIFwiaGVicmV3XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LThcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktOC1lXCIsXG4gICAgICAgICAgICBcImlzby1pci0xMzhcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS04XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk4XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LThcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktODoxOTg4XCIsXG4gICAgICAgICAgICBcInZpc3VhbFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS04XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc284ODU5OGlcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktOC1pXCIsXG4gICAgICAgICAgICBcImxvZ2ljYWxcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktOC1JXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjZcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMTBcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTE1N1wiLFxuICAgICAgICAgICAgXCJpc284ODU5LTEwXCIsXG4gICAgICAgICAgICBcImlzbzg4NTkxMFwiLFxuICAgICAgICAgICAgXCJsNlwiLFxuICAgICAgICAgICAgXCJsYXRpbjZcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktMTBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJpc28tODg1OS0xM1wiLFxuICAgICAgICAgICAgXCJpc284ODU5LTEzXCIsXG4gICAgICAgICAgICBcImlzbzg4NTkxM1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0xM1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImlzby04ODU5LTE0XCIsXG4gICAgICAgICAgICBcImlzbzg4NTktMTRcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTE0XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy04ODU5LTE0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjlcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMTVcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS0xNVwiLFxuICAgICAgICAgICAgXCJpc284ODU5MTVcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMTVcIixcbiAgICAgICAgICAgIFwibDlcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiSVNPLTg4NTktMTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJpc28tODg1OS0xNlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJJU08tODg1OS0xNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNza29pOHJcIixcbiAgICAgICAgICAgIFwia29pXCIsXG4gICAgICAgICAgICBcImtvaThcIixcbiAgICAgICAgICAgIFwia29pOC1yXCIsXG4gICAgICAgICAgICBcImtvaThfclwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJLT0k4LVJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJrb2k4LXJ1XCIsXG4gICAgICAgICAgICBcImtvaTgtdVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJLT0k4LVVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc21hY2ludG9zaFwiLFxuICAgICAgICAgICAgXCJtYWNcIixcbiAgICAgICAgICAgIFwibWFjaW50b3NoXCIsXG4gICAgICAgICAgICBcIngtbWFjLXJvbWFuXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIm1hY2ludG9zaFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImRvcy04NzRcIixcbiAgICAgICAgICAgIFwiaXNvLTg4NTktMTFcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS0xMVwiLFxuICAgICAgICAgICAgXCJpc284ODU5MTFcIixcbiAgICAgICAgICAgIFwidGlzLTYyMFwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTg3NFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTg3NFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1MFwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTBcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTBcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjUwXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjUxXCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1MVwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1MVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTFcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJhbnNpX3gzLjQtMTk2OFwiLFxuICAgICAgICAgICAgXCJhc2NpaVwiLFxuICAgICAgICAgICAgXCJjcDEyNTJcIixcbiAgICAgICAgICAgIFwiY3A4MTlcIixcbiAgICAgICAgICAgIFwiY3Npc29sYXRpbjFcIixcbiAgICAgICAgICAgIFwiaWJtODE5XCIsXG4gICAgICAgICAgICBcImlzby04ODU5LTFcIixcbiAgICAgICAgICAgIFwiaXNvLWlyLTEwMFwiLFxuICAgICAgICAgICAgXCJpc284ODU5LTFcIixcbiAgICAgICAgICAgIFwiaXNvODg1OTFcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktMVwiLFxuICAgICAgICAgICAgXCJpc29fODg1OS0xOjE5ODdcIixcbiAgICAgICAgICAgIFwibDFcIixcbiAgICAgICAgICAgIFwibGF0aW4xXCIsXG4gICAgICAgICAgICBcInVzLWFzY2lpXCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1MlwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1MlwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTJcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjcDEyNTNcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjUzXCIsXG4gICAgICAgICAgICBcIngtY3AxMjUzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1M1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1NFwiLFxuICAgICAgICAgICAgXCJjc2lzb2xhdGluNVwiLFxuICAgICAgICAgICAgXCJpc28tODg1OS05XCIsXG4gICAgICAgICAgICBcImlzby1pci0xNDhcIixcbiAgICAgICAgICAgIFwiaXNvODg1OS05XCIsXG4gICAgICAgICAgICBcImlzbzg4NTk5XCIsXG4gICAgICAgICAgICBcImlzb184ODU5LTlcIixcbiAgICAgICAgICAgIFwiaXNvXzg4NTktOToxOTg5XCIsXG4gICAgICAgICAgICBcImw1XCIsXG4gICAgICAgICAgICBcImxhdGluNVwiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTRcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjU0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjU1XCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1NVwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1NVwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNTVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjcDEyNTZcIixcbiAgICAgICAgICAgIFwid2luZG93cy0xMjU2XCIsXG4gICAgICAgICAgICBcIngtY3AxMjU2XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndpbmRvd3MtMTI1NlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNwMTI1N1wiLFxuICAgICAgICAgICAgXCJ3aW5kb3dzLTEyNTdcIixcbiAgICAgICAgICAgIFwieC1jcDEyNTdcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwid2luZG93cy0xMjU3XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3AxMjU4XCIsXG4gICAgICAgICAgICBcIndpbmRvd3MtMTI1OFwiLFxuICAgICAgICAgICAgXCJ4LWNwMTI1OFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3aW5kb3dzLTEyNThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJ4LW1hYy1jeXJpbGxpY1wiLFxuICAgICAgICAgICAgXCJ4LW1hYy11a3JhaW5pYW5cIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwieC1tYWMtY3lyaWxsaWNcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IHNpbmdsZS1ieXRlIGVuY29kaW5nc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcImVuY29kaW5nc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNoaW5lc2VcIixcbiAgICAgICAgICAgIFwiY3NnYjIzMTJcIixcbiAgICAgICAgICAgIFwiY3Npc281OGdiMjMxMjgwXCIsXG4gICAgICAgICAgICBcImdiMjMxMlwiLFxuICAgICAgICAgICAgXCJnYl8yMzEyXCIsXG4gICAgICAgICAgICBcImdiXzIzMTItODBcIixcbiAgICAgICAgICAgIFwiZ2JrXCIsXG4gICAgICAgICAgICBcImlzby1pci01OFwiLFxuICAgICAgICAgICAgXCJ4LWdia1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJHQktcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJnYjE4MDMwXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcImdiMTgwMzBcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IG11bHRpLWJ5dGUgQ2hpbmVzZSAoc2ltcGxpZmllZCkgZW5jb2RpbmdzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwiZW5jb2RpbmdzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiYmlnNVwiLFxuICAgICAgICAgICAgXCJiaWc1LWhrc2NzXCIsXG4gICAgICAgICAgICBcImNuLWJpZzVcIixcbiAgICAgICAgICAgIFwiY3NiaWc1XCIsXG4gICAgICAgICAgICBcIngteC1iaWc1XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIkJpZzVcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IG11bHRpLWJ5dGUgQ2hpbmVzZSAodHJhZGl0aW9uYWwpIGVuY29kaW5nc1wiXG4gICAgfSxcbiAgICB7XG4gICAgICBcImVuY29kaW5nc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzZXVjcGtkZm10amFwYW5lc2VcIixcbiAgICAgICAgICAgIFwiZXVjLWpwXCIsXG4gICAgICAgICAgICBcIngtZXVjLWpwXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIkVVQy1KUFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcImNzaXNvMjAyMmpwXCIsXG4gICAgICAgICAgICBcImlzby0yMDIyLWpwXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIklTTy0yMDIyLUpQXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwiY3NzaGlmdGppc1wiLFxuICAgICAgICAgICAgXCJtczkzMlwiLFxuICAgICAgICAgICAgXCJtc19rYW5qaVwiLFxuICAgICAgICAgICAgXCJzaGlmdC1qaXNcIixcbiAgICAgICAgICAgIFwic2hpZnRfamlzXCIsXG4gICAgICAgICAgICBcInNqaXNcIixcbiAgICAgICAgICAgIFwid2luZG93cy0zMWpcIixcbiAgICAgICAgICAgIFwieC1zamlzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIlNoaWZ0X0pJU1wiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImhlYWRpbmdcIjogXCJMZWdhY3kgbXVsdGktYnl0ZSBKYXBhbmVzZSBlbmNvZGluZ3NcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2V1Y2tyXCIsXG4gICAgICAgICAgICBcImNza3NjNTYwMTE5ODdcIixcbiAgICAgICAgICAgIFwiZXVjLWtyXCIsXG4gICAgICAgICAgICBcImlzby1pci0xNDlcIixcbiAgICAgICAgICAgIFwia29yZWFuXCIsXG4gICAgICAgICAgICBcImtzX2NfNTYwMS0xOTg3XCIsXG4gICAgICAgICAgICBcImtzX2NfNTYwMS0xOTg5XCIsXG4gICAgICAgICAgICBcImtzYzU2MDFcIixcbiAgICAgICAgICAgIFwia3NjXzU2MDFcIixcbiAgICAgICAgICAgIFwid2luZG93cy05NDlcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwiRVVDLUtSXCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiaGVhZGluZ1wiOiBcIkxlZ2FjeSBtdWx0aS1ieXRlIEtvcmVhbiBlbmNvZGluZ3NcIlxuICAgIH0sXG4gICAge1xuICAgICAgXCJlbmNvZGluZ3NcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbHNcIjogW1xuICAgICAgICAgICAgXCJjc2lzbzIwMjJrclwiLFxuICAgICAgICAgICAgXCJoei1nYi0yMzEyXCIsXG4gICAgICAgICAgICBcImlzby0yMDIyLWNuXCIsXG4gICAgICAgICAgICBcImlzby0yMDIyLWNuLWV4dFwiLFxuICAgICAgICAgICAgXCJpc28tMjAyMi1rclwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm5hbWVcIjogXCJyZXBsYWNlbWVudFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsc1wiOiBbXG4gICAgICAgICAgICBcInV0Zi0xNmJlXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIlVURi0xNkJFXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwidXRmLTE2XCIsXG4gICAgICAgICAgICBcInV0Zi0xNmxlXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibmFtZVwiOiBcIlVURi0xNkxFXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxzXCI6IFtcbiAgICAgICAgICAgIFwieC11c2VyLWRlZmluZWRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJuYW1lXCI6IFwieC11c2VyLWRlZmluZWRcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJoZWFkaW5nXCI6IFwiTGVnYWN5IG1pc2NlbGxhbmVvdXMgZW5jb2RpbmdzXCJcbiAgICB9XG4gIF07XG5cbiAgLy8gTGFiZWwgdG8gZW5jb2RpbmcgcmVnaXN0cnkuXG4gIC8qKiBAdHlwZSB7T2JqZWN0LjxzdHJpbmcse25hbWU6c3RyaW5nLGxhYmVsczpBcnJheS48c3RyaW5nPn0+fSAqL1xuICB2YXIgbGFiZWxfdG9fZW5jb2RpbmcgPSB7fTtcbiAgZW5jb2RpbmdzLmZvckVhY2goZnVuY3Rpb24oY2F0ZWdvcnkpIHtcbiAgICBjYXRlZ29yeS5lbmNvZGluZ3MuZm9yRWFjaChmdW5jdGlvbihlbmNvZGluZykge1xuICAgICAgZW5jb2RpbmcubGFiZWxzLmZvckVhY2goZnVuY3Rpb24obGFiZWwpIHtcbiAgICAgICAgbGFiZWxfdG9fZW5jb2RpbmdbbGFiZWxdID0gZW5jb2Rpbmc7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gUmVnaXN0cnkgb2Ygb2YgZW5jb2Rlci9kZWNvZGVyIGZhY3RvcmllcywgYnkgZW5jb2RpbmcgbmFtZS5cbiAgLyoqIEB0eXBlIHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24oe2ZhdGFsOmJvb2xlYW59KTogRW5jb2Rlcj59ICovXG4gIHZhciBlbmNvZGVycyA9IHt9O1xuICAvKiogQHR5cGUge09iamVjdC48c3RyaW5nLCBmdW5jdGlvbih7ZmF0YWw6Ym9vbGVhbn0pOiBEZWNvZGVyPn0gKi9cbiAgdmFyIGRlY29kZXJzID0ge307XG5cbiAgLy9cbiAgLy8gNi4gSW5kZXhlc1xuICAvL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcG9pbnRlciBUaGUgfHBvaW50ZXJ8IHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7KCFBcnJheS48P251bWJlcj58dW5kZWZpbmVkKX0gaW5kZXggVGhlIHxpbmRleHwgdG8gc2VhcmNoIHdpdGhpbi5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB8aW5kZXh8LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhDb2RlUG9pbnRGb3IocG9pbnRlciwgaW5kZXgpIHtcbiAgICBpZiAoIWluZGV4KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gaW5kZXhbcG9pbnRlcl0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBUaGUgfGNvZGUgcG9pbnR8IHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7IUFycmF5Ljw/bnVtYmVyPn0gaW5kZXggVGhlIHxpbmRleHwgdG8gc2VhcmNoIHdpdGhpbi5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGZpcnN0IHBvaW50ZXIgY29ycmVzcG9uZGluZyB0byB8Y29kZSBwb2ludHwgaW5cbiAgICogICAgIHxpbmRleHwsIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB8aW5kZXh8LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KSB7XG4gICAgdmFyIHBvaW50ZXIgPSBpbmRleC5pbmRleE9mKGNvZGVfcG9pbnQpO1xuICAgIHJldHVybiBwb2ludGVyID09PSAtMSA/IG51bGwgOiBwb2ludGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGluZGV4LlxuICAgKiBAcmV0dXJuIHsoIUFycmF5LjxudW1iZXI+fCFBcnJheS48QXJyYXkuPG51bWJlcj4+KX1cbiAgICogICovXG4gIGZ1bmN0aW9uIGluZGV4KG5hbWUpIHtcbiAgICBpZiAoISgnZW5jb2RpbmctaW5kZXhlcycgaW4gZ2xvYmFsKSkge1xuICAgICAgdGhyb3cgRXJyb3IoXCJJbmRleGVzIG1pc3NpbmcuXCIgK1xuICAgICAgICAgICAgICAgICAgXCIgRGlkIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSBlbmNvZGluZy1pbmRleGVzLmpzIGZpcnN0P1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbFsnZW5jb2RpbmctaW5kZXhlcyddW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb2ludGVyIFRoZSB8cG9pbnRlcnwgdG8gc2VhcmNoIGZvciBpbiB0aGUgZ2IxODAzMCBpbmRleC5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB0aGUgZ2IxODAzMCBpbmRleC5cbiAgICovXG4gIGZ1bmN0aW9uIGluZGV4R0IxODAzMFJhbmdlc0NvZGVQb2ludEZvcihwb2ludGVyKSB7XG4gICAgLy8gMS4gSWYgcG9pbnRlciBpcyBncmVhdGVyIHRoYW4gMzk0MTkgYW5kIGxlc3MgdGhhbiAxODkwMDAsIG9yXG4gICAgLy8gcG9pbnRlciBpcyBncmVhdGVyIHRoYW4gMTIzNzU3NSwgcmV0dXJuIG51bGwuXG4gICAgaWYgKChwb2ludGVyID4gMzk0MTkgJiYgcG9pbnRlciA8IDE4OTAwMCkgfHwgKHBvaW50ZXIgPiAxMjM3NTc1KSlcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgLy8gMi4gSWYgcG9pbnRlciBpcyA3NDU3LCByZXR1cm4gY29kZSBwb2ludCBVK0U3QzcuXG4gICAgaWYgKHBvaW50ZXIgPT09IDc0NTcpIHJldHVybiAweEU3Qzc7XG5cbiAgICAvLyAzLiBMZXQgb2Zmc2V0IGJlIHRoZSBsYXN0IHBvaW50ZXIgaW4gaW5kZXggZ2IxODAzMCByYW5nZXMgdGhhdFxuICAgIC8vIGlzIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiBwb2ludGVyIGFuZCBsZXQgY29kZSBwb2ludCBvZmZzZXQgYmVcbiAgICAvLyBpdHMgY29ycmVzcG9uZGluZyBjb2RlIHBvaW50LlxuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIHZhciBjb2RlX3BvaW50X29mZnNldCA9IDA7XG4gICAgdmFyIGlkeCA9IGluZGV4KCdnYjE4MDMwLXJhbmdlcycpO1xuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBpZHgubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8qKiBAdHlwZSB7IUFycmF5LjxudW1iZXI+fSAqL1xuICAgICAgdmFyIGVudHJ5ID0gaWR4W2ldO1xuICAgICAgaWYgKGVudHJ5WzBdIDw9IHBvaW50ZXIpIHtcbiAgICAgICAgb2Zmc2V0ID0gZW50cnlbMF07XG4gICAgICAgIGNvZGVfcG9pbnRfb2Zmc2V0ID0gZW50cnlbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQgb2Zmc2V0ICtcbiAgICAvLyBwb2ludGVyIOKIkiBvZmZzZXQuXG4gICAgcmV0dXJuIGNvZGVfcG9pbnRfb2Zmc2V0ICsgcG9pbnRlciAtIG9mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBUaGUgfGNvZGUgcG9pbnR8IHRvIGxvY2F0ZSBpbiB0aGUgZ2IxODAzMCBpbmRleC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZmlyc3QgcG9pbnRlciBjb3JyZXNwb25kaW5nIHRvIHxjb2RlIHBvaW50fCBpbiB0aGVcbiAgICogICAgIGdiMTgwMzAgaW5kZXguXG4gICAqL1xuICBmdW5jdGlvbiBpbmRleEdCMTgwMzBSYW5nZXNQb2ludGVyRm9yKGNvZGVfcG9pbnQpIHtcbiAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIFUrRTdDNywgcmV0dXJuIHBvaW50ZXIgNzQ1Ny5cbiAgICBpZiAoY29kZV9wb2ludCA9PT0gMHhFN0M3KSByZXR1cm4gNzQ1NztcblxuICAgIC8vIDIuIExldCBvZmZzZXQgYmUgdGhlIGxhc3QgY29kZSBwb2ludCBpbiBpbmRleCBnYjE4MDMwIHJhbmdlc1xuICAgIC8vIHRoYXQgaXMgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIGNvZGUgcG9pbnQgYW5kIGxldCBwb2ludGVyIG9mZnNldFxuICAgIC8vIGJlIGl0cyBjb3JyZXNwb25kaW5nIHBvaW50ZXIuXG4gICAgdmFyIG9mZnNldCA9IDA7XG4gICAgdmFyIHBvaW50ZXJfb2Zmc2V0ID0gMDtcbiAgICB2YXIgaWR4ID0gaW5kZXgoJ2diMTgwMzAtcmFuZ2VzJyk7XG4gICAgdmFyIGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGlkeC5sZW5ndGg7ICsraSkge1xuICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPG51bWJlcj59ICovXG4gICAgICB2YXIgZW50cnkgPSBpZHhbaV07XG4gICAgICBpZiAoZW50cnlbMV0gPD0gY29kZV9wb2ludCkge1xuICAgICAgICBvZmZzZXQgPSBlbnRyeVsxXTtcbiAgICAgICAgcG9pbnRlcl9vZmZzZXQgPSBlbnRyeVswXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIFJldHVybiBhIHBvaW50ZXIgd2hvc2UgdmFsdWUgaXMgcG9pbnRlciBvZmZzZXQgKyBjb2RlIHBvaW50XG4gICAgLy8g4oiSIG9mZnNldC5cbiAgICByZXR1cm4gcG9pbnRlcl9vZmZzZXQgKyBjb2RlX3BvaW50IC0gb2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IFRoZSB8Y29kZV9wb2ludHwgdG8gc2VhcmNoIGZvciBpbiB0aGUgU2hpZnRfSklTXG4gICAqICAgICBpbmRleC5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB0aGUgU2hpZnRfSklTIGluZGV4LlxuICAgKi9cbiAgZnVuY3Rpb24gaW5kZXhTaGlmdEpJU1BvaW50ZXJGb3IoY29kZV9wb2ludCkge1xuICAgIC8vIDEuIExldCBpbmRleCBiZSBpbmRleCBqaXMwMjA4IGV4Y2x1ZGluZyBhbGwgZW50cmllcyB3aG9zZVxuICAgIC8vIHBvaW50ZXIgaXMgaW4gdGhlIHJhbmdlIDgyNzIgdG8gODgzNSwgaW5jbHVzaXZlLlxuICAgIHNoaWZ0X2ppc19pbmRleCA9IHNoaWZ0X2ppc19pbmRleCB8fFxuICAgICAgaW5kZXgoJ2ppczAyMDgnKS5tYXAoZnVuY3Rpb24oY29kZV9wb2ludCwgcG9pbnRlcikge1xuICAgICAgICByZXR1cm4gaW5SYW5nZShwb2ludGVyLCA4MjcyLCA4ODM1KSA/IG51bGwgOiBjb2RlX3BvaW50O1xuICAgICAgfSk7XG4gICAgdmFyIGluZGV4XyA9IHNoaWZ0X2ppc19pbmRleDtcblxuICAgIC8vIDIuIFJldHVybiB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleC5cbiAgICByZXR1cm4gaW5kZXhfLmluZGV4T2YoY29kZV9wb2ludCk7XG4gIH1cbiAgdmFyIHNoaWZ0X2ppc19pbmRleDtcblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgVGhlIHxjb2RlX3BvaW50fCB0byBzZWFyY2ggZm9yIGluIHRoZSBiaWc1XG4gICAqICAgICBpbmRleC5cbiAgICogQHJldHVybiB7P251bWJlcn0gVGhlIGNvZGUgcG9pbnQgY29ycmVzcG9uZGluZyB0byB8cG9pbnRlcnwgaW4gfGluZGV4fCxcbiAgICogICAgIG9yIG51bGwgaWYgfGNvZGUgcG9pbnR8IGlzIG5vdCBpbiB0aGUgYmlnNSBpbmRleC5cbiAgICovXG4gIGZ1bmN0aW9uIGluZGV4QmlnNVBvaW50ZXJGb3IoY29kZV9wb2ludCkge1xuICAgIC8vIDEuIExldCBpbmRleCBiZSBpbmRleCBCaWc1IGV4Y2x1ZGluZyBhbGwgZW50cmllcyB3aG9zZSBwb2ludGVyXG4gICAgYmlnNV9pbmRleF9ub19oa3NjcyA9IGJpZzVfaW5kZXhfbm9faGtzY3MgfHxcbiAgICAgIGluZGV4KCdiaWc1JykubWFwKGZ1bmN0aW9uKGNvZGVfcG9pbnQsIHBvaW50ZXIpIHtcbiAgICAgICAgcmV0dXJuIChwb2ludGVyIDwgKDB4QTEgLSAweDgxKSAqIDE1NykgPyBudWxsIDogY29kZV9wb2ludDtcbiAgICAgIH0pO1xuICAgIHZhciBpbmRleF8gPSBiaWc1X2luZGV4X25vX2hrc2NzO1xuXG4gICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBVKzI1NTAsIFUrMjU1RSwgVSsyNTYxLCBVKzI1NkEsIFUrNTM0MSwgb3JcbiAgICAvLyBVKzUzNDUsIHJldHVybiB0aGUgbGFzdCBwb2ludGVyIGNvcnJlc3BvbmRpbmcgdG8gY29kZSBwb2ludCBpblxuICAgIC8vIGluZGV4LlxuICAgIGlmIChjb2RlX3BvaW50ID09PSAweDI1NTAgfHwgY29kZV9wb2ludCA9PT0gMHgyNTVFIHx8XG4gICAgICAgIGNvZGVfcG9pbnQgPT09IDB4MjU2MSB8fCBjb2RlX3BvaW50ID09PSAweDI1NkEgfHxcbiAgICAgICAgY29kZV9wb2ludCA9PT0gMHg1MzQxIHx8IGNvZGVfcG9pbnQgPT09IDB4NTM0NSkge1xuICAgICAgcmV0dXJuIGluZGV4Xy5sYXN0SW5kZXhPZihjb2RlX3BvaW50KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZXR1cm4gdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXguXG4gICAgcmV0dXJuIGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleF8pO1xuICB9XG4gIHZhciBiaWc1X2luZGV4X25vX2hrc2NzO1xuXG4gIC8vXG4gIC8vIDguIEFQSVxuICAvL1xuXG4gIC8qKiBAY29uc3QgKi8gdmFyIERFRkFVTFRfRU5DT0RJTkcgPSAndXRmLTgnO1xuXG4gIC8vIDguMSBJbnRlcmZhY2UgVGV4dERlY29kZXJcblxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSBlbmNvZGluZztcbiAgICogICAgIGRlZmF1bHRzIHRvICd1dGYtOCcuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gVGV4dERlY29kZXIobGFiZWwsIG9wdGlvbnMpIHtcbiAgICAvLyBXZWIgSURMIGNvbnZlbnRpb25zXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRleHREZWNvZGVyKSlcbiAgICAgIHRocm93IFR5cGVFcnJvcignQ2FsbGVkIGFzIGEgZnVuY3Rpb24uIERpZCB5b3UgZm9yZ2V0IFxcJ25ld1xcJz8nKTtcbiAgICBsYWJlbCA9IGxhYmVsICE9PSB1bmRlZmluZWQgPyBTdHJpbmcobGFiZWwpIDogREVGQVVMVF9FTkNPRElORztcbiAgICBvcHRpb25zID0gVG9EaWN0aW9uYXJ5KG9wdGlvbnMpO1xuXG4gICAgLy8gQSBUZXh0RGVjb2RlciBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgZW5jb2RpbmcsIGRlY29kZXIsXG4gICAgLy8gc3RyZWFtLCBpZ25vcmUgQk9NIGZsYWcgKGluaXRpYWxseSB1bnNldCksIEJPTSBzZWVuIGZsYWdcbiAgICAvLyAoaW5pdGlhbGx5IHVuc2V0KSwgZXJyb3IgbW9kZSAoaW5pdGlhbGx5IHJlcGxhY2VtZW50KSwgYW5kIGRvXG4gICAgLy8gbm90IGZsdXNoIGZsYWcgKGluaXRpYWxseSB1bnNldCkuXG5cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICB0aGlzLl9lbmNvZGluZyA9IG51bGw7XG4gICAgLyoqIEBwcml2YXRlIEB0eXBlIHs/RGVjb2Rlcn0gKi9cbiAgICB0aGlzLl9kZWNvZGVyID0gbnVsbDtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5faWdub3JlQk9NID0gZmFsc2U7XG4gICAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuX0JPTXNlZW4gPSBmYWxzZTtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLl9lcnJvcl9tb2RlID0gJ3JlcGxhY2VtZW50JztcbiAgICAvKiogQHByaXZhdGUgQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fZG9fbm90X2ZsdXNoID0gZmFsc2U7XG5cblxuICAgIC8vIDEuIExldCBlbmNvZGluZyBiZSB0aGUgcmVzdWx0IG9mIGdldHRpbmcgYW4gZW5jb2RpbmcgZnJvbVxuICAgIC8vIGxhYmVsLlxuICAgIHZhciBlbmNvZGluZyA9IGdldEVuY29kaW5nKGxhYmVsKTtcblxuICAgIC8vIDIuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUgb3IgcmVwbGFjZW1lbnQsIHRocm93IGEgUmFuZ2VFcnJvci5cbiAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwgfHwgZW5jb2RpbmcubmFtZSA9PT0gJ3JlcGxhY2VtZW50JylcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBsYWJlbCk7XG4gICAgaWYgKCFkZWNvZGVyc1tlbmNvZGluZy5uYW1lXSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RlY29kZXIgbm90IHByZXNlbnQuJyArXG4gICAgICAgICAgICAgICAgICAnIERpZCB5b3UgZm9yZ2V0IHRvIGluY2x1ZGUgZW5jb2RpbmctaW5kZXhlcy5qcyBmaXJzdD8nKTtcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgZGVjIGJlIGEgbmV3IFRleHREZWNvZGVyIG9iamVjdC5cbiAgICB2YXIgZGVjID0gdGhpcztcblxuICAgIC8vIDQuIFNldCBkZWMncyBlbmNvZGluZyB0byBlbmNvZGluZy5cbiAgICBkZWMuX2VuY29kaW5nID0gZW5jb2Rpbmc7XG5cbiAgICAvLyA1LiBJZiBvcHRpb25zJ3MgZmF0YWwgbWVtYmVyIGlzIHRydWUsIHNldCBkZWMncyBlcnJvciBtb2RlIHRvXG4gICAgLy8gZmF0YWwuXG4gICAgaWYgKEJvb2xlYW4ob3B0aW9uc1snZmF0YWwnXSkpXG4gICAgICBkZWMuX2Vycm9yX21vZGUgPSAnZmF0YWwnO1xuXG4gICAgLy8gNi4gSWYgb3B0aW9ucydzIGlnbm9yZUJPTSBtZW1iZXIgaXMgdHJ1ZSwgc2V0IGRlYydzIGlnbm9yZSBCT01cbiAgICAvLyBmbGFnLlxuICAgIGlmIChCb29sZWFuKG9wdGlvbnNbJ2lnbm9yZUJPTSddKSlcbiAgICAgIGRlYy5faWdub3JlQk9NID0gdHJ1ZTtcblxuICAgIC8vIEZvciBwcmUtRVM1IHJ1bnRpbWVzOlxuICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICB0aGlzLmVuY29kaW5nID0gZGVjLl9lbmNvZGluZy5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmZhdGFsID0gZGVjLl9lcnJvcl9tb2RlID09PSAnZmF0YWwnO1xuICAgICAgdGhpcy5pZ25vcmVCT00gPSBkZWMuX2lnbm9yZUJPTTtcbiAgICB9XG5cbiAgICAvLyA3LiBSZXR1cm4gZGVjLlxuICAgIHJldHVybiBkZWM7XG4gIH1cblxuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgLy8gVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSdzIGdldHRlciBtdXN0IHJldHVybiBlbmNvZGluZydzIG5hbWUuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHREZWNvZGVyLnByb3RvdHlwZSwgJ2VuY29kaW5nJywge1xuICAgICAgLyoqIEB0aGlzIHtUZXh0RGVjb2Rlcn0gKi9cbiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9lbmNvZGluZy5uYW1lLnRvTG93ZXJDYXNlKCk7IH1cbiAgICB9KTtcblxuICAgIC8vIFRoZSBmYXRhbCBhdHRyaWJ1dGUncyBnZXR0ZXIgbXVzdCByZXR1cm4gdHJ1ZSBpZiBlcnJvciBtb2RlXG4gICAgLy8gaXMgZmF0YWwsIGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRleHREZWNvZGVyLnByb3RvdHlwZSwgJ2ZhdGFsJywge1xuICAgICAgLyoqIEB0aGlzIHtUZXh0RGVjb2Rlcn0gKi9cbiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9lcnJvcl9tb2RlID09PSAnZmF0YWwnOyB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgaWdub3JlQk9NIGF0dHJpYnV0ZSdzIGdldHRlciBtdXN0IHJldHVybiB0cnVlIGlmIGlnbm9yZVxuICAgIC8vIEJPTSBmbGFnIGlzIHNldCwgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGV4dERlY29kZXIucHJvdG90eXBlLCAnaWdub3JlQk9NJywge1xuICAgICAgLyoqIEB0aGlzIHtUZXh0RGVjb2Rlcn0gKi9cbiAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9pZ25vcmVCT007IH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0J1ZmZlclNvdXJjZT19IGlucHV0IFRoZSBidWZmZXIgb2YgYnl0ZXMgdG8gZGVjb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmcuXG4gICAqL1xuICBUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBvcHRpb25zKSB7XG4gICAgdmFyIGJ5dGVzO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiAnYnVmZmVyJyBpbiBpbnB1dCAmJlxuICAgICAgICAgICAgICAgaW5wdXQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQuYnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ieXRlTGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gVG9EaWN0aW9uYXJ5KG9wdGlvbnMpO1xuXG4gICAgLy8gMS4gSWYgdGhlIGRvIG5vdCBmbHVzaCBmbGFnIGlzIHVuc2V0LCBzZXQgZGVjb2RlciB0byBhIG5ld1xuICAgIC8vIGVuY29kaW5nJ3MgZGVjb2Rlciwgc2V0IHN0cmVhbSB0byBhIG5ldyBzdHJlYW0sIGFuZCB1bnNldCB0aGVcbiAgICAvLyBCT00gc2VlbiBmbGFnLlxuICAgIGlmICghdGhpcy5fZG9fbm90X2ZsdXNoKSB7XG4gICAgICB0aGlzLl9kZWNvZGVyID0gZGVjb2RlcnNbdGhpcy5fZW5jb2RpbmcubmFtZV0oe1xuICAgICAgICBmYXRhbDogdGhpcy5fZXJyb3JfbW9kZSA9PT0gJ2ZhdGFsJ30pO1xuICAgICAgdGhpcy5fQk9Nc2VlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDIuIElmIG9wdGlvbnMncyBzdHJlYW0gaXMgdHJ1ZSwgc2V0IHRoZSBkbyBub3QgZmx1c2ggZmxhZywgYW5kXG4gICAgLy8gdW5zZXQgdGhlIGRvIG5vdCBmbHVzaCBmbGFnIG90aGVyd2lzZS5cbiAgICB0aGlzLl9kb19ub3RfZmx1c2ggPSBCb29sZWFuKG9wdGlvbnNbJ3N0cmVhbSddKTtcblxuICAgIC8vIDMuIElmIGlucHV0IGlzIGdpdmVuLCBwdXNoIGEgY29weSBvZiBpbnB1dCB0byBzdHJlYW0uXG4gICAgLy8gVE9ETzogQWxpZ24gd2l0aCBzcGVjIGFsZ29yaXRobSAtIG1haW50YWluIHN0cmVhbSBvbiBpbnN0YW5jZS5cbiAgICB2YXIgaW5wdXRfc3RyZWFtID0gbmV3IFN0cmVhbShieXRlcyk7XG5cbiAgICAvLyA0LiBMZXQgb3V0cHV0IGJlIGEgbmV3IHN0cmVhbS5cbiAgICB2YXIgb3V0cHV0ID0gW107XG5cbiAgICAvKiogQHR5cGUgez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9ICovXG4gICAgdmFyIHJlc3VsdDtcblxuICAgIC8vIDUuIFdoaWxlIHRydWU6XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEuIExldCB0b2tlbiBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgZnJvbSBzdHJlYW0uXG4gICAgICB2YXIgdG9rZW4gPSBpbnB1dF9zdHJlYW0ucmVhZCgpO1xuXG4gICAgICAvLyAyLiBJZiB0b2tlbiBpcyBlbmQtb2Ytc3RyZWFtIGFuZCB0aGUgZG8gbm90IGZsdXNoIGZsYWcgaXNcbiAgICAgIC8vIHNldCwgcmV0dXJuIG91dHB1dCwgc2VyaWFsaXplZC5cbiAgICAgIC8vIFRPRE86IEFsaWduIHdpdGggc3BlYyBhbGdvcml0aG0uXG4gICAgICBpZiAodG9rZW4gPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvLyAzLiBPdGhlcndpc2UsIHJ1biB0aGVzZSBzdWJzdWJzdGVwczpcblxuICAgICAgLy8gMS4gTGV0IHJlc3VsdCBiZSB0aGUgcmVzdWx0IG9mIHByb2Nlc3NpbmcgdG9rZW4gZm9yIGRlY29kZXIsXG4gICAgICAvLyBzdHJlYW0sIG91dHB1dCwgYW5kIGVycm9yIG1vZGUuXG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVyLmhhbmRsZXIoaW5wdXRfc3RyZWFtLCB0b2tlbik7XG5cbiAgICAgIC8vIDIuIElmIHJlc3VsdCBpcyBmaW5pc2hlZCwgcmV0dXJuIG91dHB1dCwgc2VyaWFsaXplZC5cbiAgICAgIGlmIChyZXN1bHQgPT09IGZpbmlzaGVkKVxuICAgICAgICBicmVhaztcblxuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKVxuICAgICAgICAgIG91dHB1dC5wdXNoLmFwcGx5KG91dHB1dCwgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyhyZXN1bHQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgcmVzdWx0IGlzIGVycm9yLCB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIC8vIChUaHJvd24gaW4gaGFuZGxlcilcblxuICAgICAgLy8gNC4gT3RoZXJ3aXNlLCBkbyBub3RoaW5nLlxuICAgIH1cbiAgICAvLyBUT0RPOiBBbGlnbiB3aXRoIHNwZWMgYWxnb3JpdGhtLlxuICAgIGlmICghdGhpcy5fZG9fbm90X2ZsdXNoKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZXIuaGFuZGxlcihpbnB1dF9zdHJlYW0sIGlucHV0X3N0cmVhbS5yZWFkKCkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmaW5pc2hlZClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSlcbiAgICAgICAgICBvdXRwdXQucHVzaC5hcHBseShvdXRwdXQsIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki8ocmVzdWx0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfSB3aGlsZSAoIWlucHV0X3N0cmVhbS5lbmRPZlN0cmVhbSgpKTtcbiAgICAgIHRoaXMuX2RlY29kZXIgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEEgVGV4dERlY29kZXIgb2JqZWN0IGFsc28gaGFzIGFuIGFzc29jaWF0ZWQgc2VyaWFsaXplIHN0cmVhbVxuICAgIC8vIGFsZ29yaXRobS4uLlxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBzdHJlYW1cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICogQHRoaXMge1RleHREZWNvZGVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZVN0cmVhbShzdHJlYW0pIHtcbiAgICAgIC8vIDEuIExldCB0b2tlbiBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgZnJvbSBzdHJlYW0uXG4gICAgICAvLyAoRG9uZSBpbi1wbGFjZSBvbiBhcnJheSwgcmF0aGVyIHRoYW4gYXMgYSBzdHJlYW0pXG5cbiAgICAgIC8vIDIuIElmIGVuY29kaW5nIGlzIFVURi04LCBVVEYtMTZCRSwgb3IgVVRGLTE2TEUsIGFuZCBpZ25vcmVcbiAgICAgIC8vIEJPTSBmbGFnIGFuZCBCT00gc2VlbiBmbGFnIGFyZSB1bnNldCwgcnVuIHRoZXNlIHN1YnN1YnN0ZXBzOlxuICAgICAgaWYgKGluY2x1ZGVzKFsnVVRGLTgnLCAnVVRGLTE2TEUnLCAnVVRGLTE2QkUnXSwgdGhpcy5fZW5jb2RpbmcubmFtZSkgJiZcbiAgICAgICAgICAhdGhpcy5faWdub3JlQk9NICYmICF0aGlzLl9CT01zZWVuKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubGVuZ3RoID4gMCAmJiBzdHJlYW1bMF0gPT09IDB4RkVGRikge1xuICAgICAgICAgIC8vIDEuIElmIHRva2VuIGlzIFUrRkVGRiwgc2V0IEJPTSBzZWVuIGZsYWcuXG4gICAgICAgICAgdGhpcy5fQk9Nc2VlbiA9IHRydWU7XG4gICAgICAgICAgc3RyZWFtLnNoaWZ0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyAyLiBPdGhlcndpc2UsIGlmIHRva2VuIGlzIG5vdCBlbmQtb2Ytc3RyZWFtLCBzZXQgQk9NIHNlZW5cbiAgICAgICAgICAvLyBmbGFnIGFuZCBhcHBlbmQgdG9rZW4gdG8gc3RyZWFtLlxuICAgICAgICAgIHRoaXMuX0JPTXNlZW4gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgdG9rZW4gaXMgbm90IGVuZC1vZi1zdHJlYW0sIGFwcGVuZCB0b2tlblxuICAgICAgICAgIC8vIHRvIG91dHB1dC5cbiAgICAgICAgICAvLyAobm8tb3ApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgcmV0dXJuIG91dHB1dC5cbiAgICAgIHJldHVybiBjb2RlUG9pbnRzVG9TdHJpbmcoc3RyZWFtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplU3RyZWFtLmNhbGwodGhpcywgb3V0cHV0KTtcbiAgfTtcblxuICAvLyA4LjIgSW50ZXJmYWNlIFRleHRFbmNvZGVyXG5cbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IGxhYmVsIFRoZSBsYWJlbCBvZiB0aGUgZW5jb2RpbmcuIE5PTlNUQU5EQVJELlxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgTk9OU1RBTkRBUkQuXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0RW5jb2RlcihsYWJlbCwgb3B0aW9ucykge1xuICAgIC8vIFdlYiBJREwgY29udmVudGlvbnNcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGV4dEVuY29kZXIpKVxuICAgICAgdGhyb3cgVHlwZUVycm9yKCdDYWxsZWQgYXMgYSBmdW5jdGlvbi4gRGlkIHlvdSBmb3JnZXQgXFwnbmV3XFwnPycpO1xuICAgIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgICAvLyBBIFRleHRFbmNvZGVyIG9iamVjdCBoYXMgYW4gYXNzb2NpYXRlZCBlbmNvZGluZyBhbmQgZW5jb2Rlci5cblxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHRoaXMuX2VuY29kaW5nID0gbnVsbDtcbiAgICAvKiogQHByaXZhdGUgQHR5cGUgez9FbmNvZGVyfSAqL1xuICAgIHRoaXMuX2VuY29kZXIgPSBudWxsO1xuXG4gICAgLy8gTm9uLXN0YW5kYXJkXG4gICAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuX2RvX25vdF9mbHVzaCA9IGZhbHNlO1xuICAgIC8qKiBAcHJpdmF0ZSBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIHRoaXMuX2ZhdGFsID0gQm9vbGVhbihvcHRpb25zWydmYXRhbCddKSA/ICdmYXRhbCcgOiAncmVwbGFjZW1lbnQnO1xuXG4gICAgLy8gMS4gTGV0IGVuYyBiZSBhIG5ldyBUZXh0RW5jb2RlciBvYmplY3QuXG4gICAgdmFyIGVuYyA9IHRoaXM7XG5cbiAgICAvLyAyLiBTZXQgZW5jJ3MgZW5jb2RpbmcgdG8gVVRGLTgncyBlbmNvZGVyLlxuICAgIGlmIChCb29sZWFuKG9wdGlvbnNbJ05PTlNUQU5EQVJEX2FsbG93TGVnYWN5RW5jb2RpbmcnXSkpIHtcbiAgICAgIC8vIE5PTlNUQU5EQVJEIGJlaGF2aW9yLlxuICAgICAgbGFiZWwgPSBsYWJlbCAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGxhYmVsKSA6IERFRkFVTFRfRU5DT0RJTkc7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhsYWJlbCk7XG4gICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwgfHwgZW5jb2RpbmcubmFtZSA9PT0gJ3JlcGxhY2VtZW50JylcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGxhYmVsKTtcbiAgICAgIGlmICghZW5jb2RlcnNbZW5jb2RpbmcubmFtZV0pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0VuY29kZXIgbm90IHByZXNlbnQuJyArXG4gICAgICAgICAgICAgICAgICAgICcgRGlkIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSBlbmNvZGluZy1pbmRleGVzLmpzIGZpcnN0PycpO1xuICAgICAgfVxuICAgICAgZW5jLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGFuZGFyZCBiZWhhdmlvci5cbiAgICAgIGVuYy5fZW5jb2RpbmcgPSBnZXRFbmNvZGluZygndXRmLTgnKTtcblxuICAgICAgaWYgKGxhYmVsICE9PSB1bmRlZmluZWQgJiYgJ2NvbnNvbGUnIGluIGdsb2JhbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RleHRFbmNvZGVyIGNvbnN0cnVjdG9yIGNhbGxlZCB3aXRoIGVuY29kaW5nIGxhYmVsLCAnXG4gICAgICAgICAgICAgICAgICAgICArICd3aGljaCBpcyBpZ25vcmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvciBwcmUtRVM1IHJ1bnRpbWVzOlxuICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnR5KVxuICAgICAgdGhpcy5lbmNvZGluZyA9IGVuYy5fZW5jb2RpbmcubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gMy4gUmV0dXJuIGVuYy5cbiAgICByZXR1cm4gZW5jO1xuICB9XG5cbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIC8vIFRoZSBlbmNvZGluZyBhdHRyaWJ1dGUncyBnZXR0ZXIgbXVzdCByZXR1cm4gZW5jb2RpbmcncyBuYW1lLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZXh0RW5jb2Rlci5wcm90b3R5cGUsICdlbmNvZGluZycsIHtcbiAgICAgIC8qKiBAdGhpcyB7VGV4dEVuY29kZXJ9ICovXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fZW5jb2RpbmcubmFtZS50b0xvd2VyQ2FzZSgpOyB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBvcHRfc3RyaW5nIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAgICogQHJldHVybiB7IVVpbnQ4QXJyYXl9IEVuY29kZWQgYnl0ZXMsIGFzIGEgVWludDhBcnJheS5cbiAgICovXG4gIFRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUob3B0X3N0cmluZywgb3B0aW9ucykge1xuICAgIG9wdF9zdHJpbmcgPSBvcHRfc3RyaW5nID09PSB1bmRlZmluZWQgPyAnJyA6IFN0cmluZyhvcHRfc3RyaW5nKTtcbiAgICBvcHRpb25zID0gVG9EaWN0aW9uYXJ5KG9wdGlvbnMpO1xuXG4gICAgLy8gTk9URTogVGhpcyBvcHRpb24gaXMgbm9uc3RhbmRhcmQuIE5vbmUgb2YgdGhlIGVuY29kaW5nc1xuICAgIC8vIHBlcm1pdHRlZCBmb3IgZW5jb2RpbmcgKGkuZS4gVVRGLTgsIFVURi0xNikgYXJlIHN0YXRlZnVsIHdoZW5cbiAgICAvLyB0aGUgaW5wdXQgaXMgYSBVU1ZTdHJpbmcgc28gc3RyZWFtaW5nIGlzIG5vdCBuZWNlc3NhcnkuXG4gICAgaWYgKCF0aGlzLl9kb19ub3RfZmx1c2gpXG4gICAgICB0aGlzLl9lbmNvZGVyID0gZW5jb2RlcnNbdGhpcy5fZW5jb2RpbmcubmFtZV0oe1xuICAgICAgICBmYXRhbDogdGhpcy5fZmF0YWwgPT09ICdmYXRhbCd9KTtcbiAgICB0aGlzLl9kb19ub3RfZmx1c2ggPSBCb29sZWFuKG9wdGlvbnNbJ3N0cmVhbSddKTtcblxuICAgIC8vIDEuIENvbnZlcnQgaW5wdXQgdG8gYSBzdHJlYW0uXG4gICAgdmFyIGlucHV0ID0gbmV3IFN0cmVhbShzdHJpbmdUb0NvZGVQb2ludHMob3B0X3N0cmluZykpO1xuXG4gICAgLy8gMi4gTGV0IG91dHB1dCBiZSBhIG5ldyBzdHJlYW1cbiAgICB2YXIgb3V0cHV0ID0gW107XG5cbiAgICAvKiogQHR5cGUgez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9ICovXG4gICAgdmFyIHJlc3VsdDtcbiAgICAvLyAzLiBXaGlsZSB0cnVlLCBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEuIExldCB0b2tlbiBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgZnJvbSBpbnB1dC5cbiAgICAgIHZhciB0b2tlbiA9IGlucHV0LnJlYWQoKTtcbiAgICAgIGlmICh0b2tlbiA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyAyLiBMZXQgcmVzdWx0IGJlIHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyB0b2tlbiBmb3IgZW5jb2RlcixcbiAgICAgIC8vIGlucHV0LCBvdXRwdXQuXG4gICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIoaW5wdXQsIHRva2VuKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IGZpbmlzaGVkKVxuICAgICAgICBicmVhaztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpXG4gICAgICAgIG91dHB1dC5wdXNoLmFwcGx5KG91dHB1dCwgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyhyZXN1bHQpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgb3V0cHV0LnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgLy8gVE9ETzogQWxpZ24gd2l0aCBzcGVjIGFsZ29yaXRobS5cbiAgICBpZiAoIXRoaXMuX2RvX25vdF9mbHVzaCkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZW5jb2Rlci5oYW5kbGVyKGlucHV0LCBpbnB1dC5yZWFkKCkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmaW5pc2hlZClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSlcbiAgICAgICAgICBvdXRwdXQucHVzaC5hcHBseShvdXRwdXQsIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki8ocmVzdWx0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZW5jb2RlciA9IG51bGw7XG4gICAgfVxuICAgIC8vIDMuIElmIHJlc3VsdCBpcyBmaW5pc2hlZCwgY29udmVydCBvdXRwdXQgaW50byBhIGJ5dGUgc2VxdWVuY2UsXG4gICAgLy8gYW5kIHRoZW4gcmV0dXJuIGEgVWludDhBcnJheSBvYmplY3Qgd3JhcHBpbmcgYW4gQXJyYXlCdWZmZXJcbiAgICAvLyBjb250YWluaW5nIG91dHB1dC5cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkob3V0cHV0KTtcbiAgfTtcblxuXG4gIC8vXG4gIC8vIDkuIFRoZSBlbmNvZGluZ1xuICAvL1xuXG4gIC8vIDkuMSB1dGYtOFxuXG4gIC8vIDkuMS4xIHV0Zi04IGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBVVEY4RGVjb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcblxuICAgIC8vIHV0Zi04J3MgZGVjb2RlcidzIGhhcyBhbiBhc3NvY2lhdGVkIHV0Zi04IGNvZGUgcG9pbnQsIHV0Zi04XG4gICAgLy8gYnl0ZXMgc2VlbiwgYW5kIHV0Zi04IGJ5dGVzIG5lZWRlZCAoYWxsIGluaXRpYWxseSAwKSwgYSB1dGYtOFxuICAgIC8vIGxvd2VyIGJvdW5kYXJ5IChpbml0aWFsbHkgMHg4MCksIGFuZCBhIHV0Zi04IHVwcGVyIGJvdW5kYXJ5XG4gICAgLy8gKGluaXRpYWxseSAweEJGKS5cbiAgICB2YXIgLyoqIEB0eXBlIHtudW1iZXJ9ICovIHV0ZjhfY29kZV9wb2ludCA9IDAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X2J5dGVzX3NlZW4gPSAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gdXRmOF9ieXRlc19uZWVkZWQgPSAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4ODAsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHhCRjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCB1dGYtOCBieXRlcyBuZWVkZWQgaXMgbm90IDAsXG4gICAgICAvLyBzZXQgdXRmLTggYnl0ZXMgbmVlZGVkIHRvIDAgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIHV0ZjhfYnl0ZXNfbmVlZGVkICE9PSAwKSB7XG4gICAgICAgIHV0ZjhfYnl0ZXNfbmVlZGVkID0gMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMy4gSWYgdXRmLTggYnl0ZXMgbmVlZGVkIGlzIDAsIGJhc2VkIG9uIGJ5dGU6XG4gICAgICBpZiAodXRmOF9ieXRlc19uZWVkZWQgPT09IDApIHtcblxuICAgICAgICAvLyAweDAwIHRvIDB4N0ZcbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgwMCwgMHg3RikpIHtcbiAgICAgICAgICAvLyBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIGJ5dGUuXG4gICAgICAgICAgcmV0dXJuIGJpdGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweEMyIHRvIDB4REZcbiAgICAgICAgZWxzZSBpZiAoaW5SYW5nZShiaXRlLCAweEMyLCAweERGKSkge1xuICAgICAgICAgIC8vIDEuIFNldCB1dGYtOCBieXRlcyBuZWVkZWQgdG8gMS5cbiAgICAgICAgICB1dGY4X2J5dGVzX25lZWRlZCA9IDE7XG5cbiAgICAgICAgICAvLyAyLiBTZXQgVVRGLTggY29kZSBwb2ludCB0byBieXRlICYgMHgxRi5cbiAgICAgICAgICB1dGY4X2NvZGVfcG9pbnQgPSBiaXRlICYgMHgxRjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4RTAgdG8gMHhFRlxuICAgICAgICBlbHNlIGlmIChpblJhbmdlKGJpdGUsIDB4RTAsIDB4RUYpKSB7XG4gICAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyAweEUwLCBzZXQgdXRmLTggbG93ZXIgYm91bmRhcnkgdG8gMHhBMC5cbiAgICAgICAgICBpZiAoYml0ZSA9PT0gMHhFMClcbiAgICAgICAgICAgIHV0ZjhfbG93ZXJfYm91bmRhcnkgPSAweEEwO1xuICAgICAgICAgIC8vIDIuIElmIGJ5dGUgaXMgMHhFRCwgc2V0IHV0Zi04IHVwcGVyIGJvdW5kYXJ5IHRvIDB4OUYuXG4gICAgICAgICAgaWYgKGJpdGUgPT09IDB4RUQpXG4gICAgICAgICAgICB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHg5RjtcbiAgICAgICAgICAvLyAzLiBTZXQgdXRmLTggYnl0ZXMgbmVlZGVkIHRvIDIuXG4gICAgICAgICAgdXRmOF9ieXRlc19uZWVkZWQgPSAyO1xuICAgICAgICAgIC8vIDQuIFNldCBVVEYtOCBjb2RlIHBvaW50IHRvIGJ5dGUgJiAweEYuXG4gICAgICAgICAgdXRmOF9jb2RlX3BvaW50ID0gYml0ZSAmIDB4RjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4RjAgdG8gMHhGNFxuICAgICAgICBlbHNlIGlmIChpblJhbmdlKGJpdGUsIDB4RjAsIDB4RjQpKSB7XG4gICAgICAgICAgLy8gMS4gSWYgYnl0ZSBpcyAweEYwLCBzZXQgdXRmLTggbG93ZXIgYm91bmRhcnkgdG8gMHg5MC5cbiAgICAgICAgICBpZiAoYml0ZSA9PT0gMHhGMClcbiAgICAgICAgICAgIHV0ZjhfbG93ZXJfYm91bmRhcnkgPSAweDkwO1xuICAgICAgICAgIC8vIDIuIElmIGJ5dGUgaXMgMHhGNCwgc2V0IHV0Zi04IHVwcGVyIGJvdW5kYXJ5IHRvIDB4OEYuXG4gICAgICAgICAgaWYgKGJpdGUgPT09IDB4RjQpXG4gICAgICAgICAgICB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHg4RjtcbiAgICAgICAgICAvLyAzLiBTZXQgdXRmLTggYnl0ZXMgbmVlZGVkIHRvIDMuXG4gICAgICAgICAgdXRmOF9ieXRlc19uZWVkZWQgPSAzO1xuICAgICAgICAgIC8vIDQuIFNldCBVVEYtOCBjb2RlIHBvaW50IHRvIGJ5dGUgJiAweDcuXG4gICAgICAgICAgdXRmOF9jb2RlX3BvaW50ID0gYml0ZSAmIDB4NztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IuXG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gY29udGludWUuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBJZiBieXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2UgdXRmLTggbG93ZXIgYm91bmRhcnkgdG8gdXRmLThcbiAgICAgIC8vIHVwcGVyIGJvdW5kYXJ5LCBpbmNsdXNpdmUsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmICghaW5SYW5nZShiaXRlLCB1dGY4X2xvd2VyX2JvdW5kYXJ5LCB1dGY4X3VwcGVyX2JvdW5kYXJ5KSkge1xuXG4gICAgICAgIC8vIDEuIFNldCB1dGYtOCBjb2RlIHBvaW50LCB1dGYtOCBieXRlcyBuZWVkZWQsIGFuZCB1dGYtOFxuICAgICAgICAvLyBieXRlcyBzZWVuIHRvIDAsIHNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweDgwLCBhbmQgc2V0XG4gICAgICAgIC8vIHV0Zi04IHVwcGVyIGJvdW5kYXJ5IHRvIDB4QkYuXG4gICAgICAgIHV0ZjhfY29kZV9wb2ludCA9IHV0ZjhfYnl0ZXNfbmVlZGVkID0gdXRmOF9ieXRlc19zZWVuID0gMDtcbiAgICAgICAgdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4ODA7XG4gICAgICAgIHV0ZjhfdXBwZXJfYm91bmRhcnkgPSAweEJGO1xuXG4gICAgICAgIC8vIDIuIFByZXBlbmQgYnl0ZSB0byBzdHJlYW0uXG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKGJpdGUpO1xuXG4gICAgICAgIC8vIDMuIFJldHVybiBlcnJvci5cbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDUuIFNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweDgwIGFuZCB1dGYtOCB1cHBlciBib3VuZGFyeVxuICAgICAgLy8gdG8gMHhCRi5cbiAgICAgIHV0ZjhfbG93ZXJfYm91bmRhcnkgPSAweDgwO1xuICAgICAgdXRmOF91cHBlcl9ib3VuZGFyeSA9IDB4QkY7XG5cbiAgICAgIC8vIDYuIFNldCBVVEYtOCBjb2RlIHBvaW50IHRvIChVVEYtOCBjb2RlIHBvaW50IDw8IDYpIHwgKGJ5dGUgJlxuICAgICAgLy8gMHgzRilcbiAgICAgIHV0ZjhfY29kZV9wb2ludCA9ICh1dGY4X2NvZGVfcG9pbnQgPDwgNikgfCAoYml0ZSAmIDB4M0YpO1xuXG4gICAgICAvLyA3LiBJbmNyZWFzZSB1dGYtOCBieXRlcyBzZWVuIGJ5IG9uZS5cbiAgICAgIHV0ZjhfYnl0ZXNfc2VlbiArPSAxO1xuXG4gICAgICAvLyA4LiBJZiB1dGYtOCBieXRlcyBzZWVuIGlzIG5vdCBlcXVhbCB0byB1dGYtOCBieXRlcyBuZWVkZWQsXG4gICAgICAvLyBjb250aW51ZS5cbiAgICAgIGlmICh1dGY4X2J5dGVzX3NlZW4gIT09IHV0ZjhfYnl0ZXNfbmVlZGVkKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gOS4gTGV0IGNvZGUgcG9pbnQgYmUgdXRmLTggY29kZSBwb2ludC5cbiAgICAgIHZhciBjb2RlX3BvaW50ID0gdXRmOF9jb2RlX3BvaW50O1xuXG4gICAgICAvLyAxMC4gU2V0IHV0Zi04IGNvZGUgcG9pbnQsIHV0Zi04IGJ5dGVzIG5lZWRlZCwgYW5kIHV0Zi04IGJ5dGVzXG4gICAgICAvLyBzZWVuIHRvIDAuXG4gICAgICB1dGY4X2NvZGVfcG9pbnQgPSB1dGY4X2J5dGVzX25lZWRlZCA9IHV0ZjhfYnl0ZXNfc2VlbiA9IDA7XG5cbiAgICAgIC8vIDExLiBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICB9O1xuICB9XG5cbiAgLy8gOS4xLjIgdXRmLTggZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIFVURjhFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBTZXQgY291bnQgYW5kIG9mZnNldCBiYXNlZCBvbiB0aGUgcmFuZ2UgY29kZSBwb2ludCBpcyBpbjpcbiAgICAgIHZhciBjb3VudCwgb2Zmc2V0O1xuICAgICAgLy8gVSswMDgwIHRvIFUrMDdGRiwgaW5jbHVzaXZlOlxuICAgICAgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHgwMDgwLCAweDA3RkYpKSB7XG4gICAgICAgIC8vIDEgYW5kIDB4QzBcbiAgICAgICAgY291bnQgPSAxO1xuICAgICAgICBvZmZzZXQgPSAweEMwO1xuICAgICAgfVxuICAgICAgLy8gVSswODAwIHRvIFUrRkZGRiwgaW5jbHVzaXZlOlxuICAgICAgZWxzZSBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweDA4MDAsIDB4RkZGRikpIHtcbiAgICAgICAgLy8gMiBhbmQgMHhFMFxuICAgICAgICBjb3VudCA9IDI7XG4gICAgICAgIG9mZnNldCA9IDB4RTA7XG4gICAgICB9XG4gICAgICAvLyBVKzEwMDAwIHRvIFUrMTBGRkZGLCBpbmNsdXNpdmU6XG4gICAgICBlbHNlIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4MTAwMDAsIDB4MTBGRkZGKSkge1xuICAgICAgICAvLyAzIGFuZCAweEYwXG4gICAgICAgIGNvdW50ID0gMztcbiAgICAgICAgb2Zmc2V0ID0gMHhGMDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gTGV0IGJ5dGVzIGJlIGEgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCBieXRlIGlzIChjb2RlXG4gICAgICAvLyBwb2ludCA+PiAoNiDDlyBjb3VudCkpICsgb2Zmc2V0LlxuICAgICAgdmFyIGJ5dGVzID0gWyhjb2RlX3BvaW50ID4+ICg2ICogY291bnQpKSArIG9mZnNldF07XG5cbiAgICAgIC8vIDUuIFJ1biB0aGVzZSBzdWJzdGVwcyB3aGlsZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gMDpcbiAgICAgIHdoaWxlIChjb3VudCA+IDApIHtcblxuICAgICAgICAvLyAxLiBTZXQgdGVtcCB0byBjb2RlIHBvaW50ID4+ICg2IMOXIChjb3VudCDiiJIgMSkpLlxuICAgICAgICB2YXIgdGVtcCA9IGNvZGVfcG9pbnQgPj4gKDYgKiAoY291bnQgLSAxKSk7XG5cbiAgICAgICAgLy8gMi4gQXBwZW5kIHRvIGJ5dGVzIDB4ODAgfCAodGVtcCAmIDB4M0YpLlxuICAgICAgICBieXRlcy5wdXNoKDB4ODAgfCAodGVtcCAmIDB4M0YpKTtcblxuICAgICAgICAvLyAzLiBEZWNyZWFzZSBjb3VudCBieSBvbmUuXG4gICAgICAgIGNvdW50IC09IDE7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIFJldHVybiBieXRlcyBieXRlcywgaW4gb3JkZXIuXG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ1VURi04J10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBVVEY4RW5jb2RlcihvcHRpb25zKTtcbiAgfTtcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snVVRGLTgnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjhEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vXG4gIC8vIDEwLiBMZWdhY3kgc2luZ2xlLWJ5dGUgZW5jb2RpbmdzXG4gIC8vXG5cbiAgLy8gMTAuMSBzaW5nbGUtYnl0ZSBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBpbmRleCBUaGUgZW5jb2RpbmcgaW5kZXguXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2luZ2xlQnl0ZURlY29kZXIoaW5kZXgsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGFuIEFTQ0lJIGJ5dGUsIHJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWVcbiAgICAgIC8vIGlzIGJ5dGUuXG4gICAgICBpZiAoaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgIHJldHVybiBiaXRlO1xuXG4gICAgICAvLyAzLiBMZXQgY29kZSBwb2ludCBiZSB0aGUgaW5kZXggY29kZSBwb2ludCBmb3IgYnl0ZSDiiJIgMHg4MCBpblxuICAgICAgLy8gaW5kZXggc2luZ2xlLWJ5dGUuXG4gICAgICB2YXIgY29kZV9wb2ludCA9IGluZGV4W2JpdGUgLSAweDgwXTtcblxuICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgIC8vIDUuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuICAgIH07XG4gIH1cblxuICAvLyAxMC4yIHNpbmdsZS1ieXRlIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHshQXJyYXkuPD9udW1iZXI+fSBpbmRleCBUaGUgZW5jb2RpbmcgaW5kZXguXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2luZ2xlQnl0ZUVuY29kZXIoaW5kZXgsIG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleFxuICAgICAgLy8gc2luZ2xlLWJ5dGUuXG4gICAgICB2YXIgcG9pbnRlciA9IGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleCk7XG5cbiAgICAgIC8vIDQuIElmIHBvaW50ZXIgaXMgbnVsbCwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChwb2ludGVyID09PSBudWxsKVxuICAgICAgICBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDUuIFJldHVybiBhIGJ5dGUgd2hvc2UgdmFsdWUgaXMgcG9pbnRlciArIDB4ODAuXG4gICAgICByZXR1cm4gcG9pbnRlciArIDB4ODA7XG4gICAgfTtcbiAgfVxuXG4gIChmdW5jdGlvbigpIHtcbiAgICBpZiAoISgnZW5jb2RpbmctaW5kZXhlcycgaW4gZ2xvYmFsKSlcbiAgICAgIHJldHVybjtcbiAgICBlbmNvZGluZ3MuZm9yRWFjaChmdW5jdGlvbihjYXRlZ29yeSkge1xuICAgICAgaWYgKGNhdGVnb3J5LmhlYWRpbmcgIT09ICdMZWdhY3kgc2luZ2xlLWJ5dGUgZW5jb2RpbmdzJylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2F0ZWdvcnkuZW5jb2RpbmdzLmZvckVhY2goZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBlbmNvZGluZy5uYW1lO1xuICAgICAgICB2YXIgaWR4ID0gaW5kZXgobmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICAgICAgICBkZWNvZGVyc1tuYW1lXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZUJ5dGVEZWNvZGVyKGlkeCwgb3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgICAgICAgZW5jb2RlcnNbbmFtZV0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVCeXRlRW5jb2RlcihpZHgsIG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0oKSk7XG5cbiAgLy9cbiAgLy8gMTEuIExlZ2FjeSBtdWx0aS1ieXRlIENoaW5lc2UgKHNpbXBsaWZpZWQpIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDExLjEgZ2JrXG5cbiAgLy8gMTEuMS4xIGdiayBkZWNvZGVyXG4gIC8vIGdiaydzIGRlY29kZXIgaXMgZ2IxODAzMCdzIGRlY29kZXIuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ0dCSyddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR0IxODAzMERlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cbiAgLy8gMTEuMS4yIGdiayBlbmNvZGVyXG4gIC8vIGdiaydzIGVuY29kZXIgaXMgZ2IxODAzMCdzIGVuY29kZXIgd2l0aCBpdHMgZ2JrIGZsYWcgc2V0LlxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydHQksnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdCMTgwMzBFbmNvZGVyKG9wdGlvbnMsIHRydWUpO1xuICB9O1xuXG4gIC8vIDExLjIgZ2IxODAzMFxuXG4gIC8vIDExLjIuMSBnYjE4MDMwIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBHQjE4MDMwRGVjb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvLyBnYjE4MDMwJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBnYjE4MDMwIGZpcnN0LCBnYjE4MDMwXG4gICAgLy8gc2Vjb25kLCBhbmQgZ2IxODAzMCB0aGlyZCAoYWxsIGluaXRpYWxseSAweDAwKS5cbiAgICB2YXIgLyoqIEB0eXBlIHtudW1iZXJ9ICovIGdiMTgwMzBfZmlyc3QgPSAweDAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gZ2IxODAzMF9zZWNvbmQgPSAweDAwLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gZ2IxODAzMF90aGlyZCA9IDB4MDA7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIGdiMTgwMzAgZmlyc3QsIGdiMTgwMzBcbiAgICAgIC8vIHNlY29uZCwgYW5kIGdiMTgwMzAgdGhpcmQgYXJlIDB4MDAsIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIGdiMTgwMzBfZmlyc3QgPT09IDB4MDAgJiZcbiAgICAgICAgICBnYjE4MDMwX3NlY29uZCA9PT0gMHgwMCAmJiBnYjE4MDMwX3RoaXJkID09PSAweDAwKSB7XG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcbiAgICAgIH1cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSwgYW5kIGdiMTgwMzAgZmlyc3QsIGdiMTgwMzBcbiAgICAgIC8vIHNlY29uZCwgb3IgZ2IxODAzMCB0aGlyZCBpcyBub3QgMHgwMCwgc2V0IGdiMTgwMzAgZmlyc3QsXG4gICAgICAvLyBnYjE4MDMwIHNlY29uZCwgYW5kIGdiMTgwMzAgdGhpcmQgdG8gMHgwMCwgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmXG4gICAgICAgICAgKGdiMTgwMzBfZmlyc3QgIT09IDB4MDAgfHwgZ2IxODAzMF9zZWNvbmQgIT09IDB4MDAgfHxcbiAgICAgICAgICAgZ2IxODAzMF90aGlyZCAhPT0gMHgwMCkpIHtcbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IDB4MDA7XG4gICAgICAgIGdiMTgwMzBfc2Vjb25kID0gMHgwMDtcbiAgICAgICAgZ2IxODAzMF90aGlyZCA9IDB4MDA7XG4gICAgICAgIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG4gICAgICB2YXIgY29kZV9wb2ludDtcbiAgICAgIC8vIDMuIElmIGdiMTgwMzAgdGhpcmQgaXMgbm90IDB4MDAsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChnYjE4MDMwX3RoaXJkICE9PSAweDAwKSB7XG4gICAgICAgIC8vIDEuIExldCBjb2RlIHBvaW50IGJlIG51bGwuXG4gICAgICAgIGNvZGVfcG9pbnQgPSBudWxsO1xuICAgICAgICAvLyAyLiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweDMwIHRvIDB4MzksIGluY2x1c2l2ZSwgc2V0XG4gICAgICAgIC8vIGNvZGUgcG9pbnQgdG8gdGhlIGluZGV4IGdiMTgwMzAgcmFuZ2VzIGNvZGUgcG9pbnQgZm9yXG4gICAgICAgIC8vICgoKGdiMTgwMzAgZmlyc3Qg4oiSIDB4ODEpIMOXIDEwICsgZ2IxODAzMCBzZWNvbmQg4oiSIDB4MzApIMOXXG4gICAgICAgIC8vIDEyNiArIGdiMTgwMzAgdGhpcmQg4oiSIDB4ODEpIMOXIDEwICsgYnl0ZSDiiJIgMHgzMC5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgzMCwgMHgzOSkpIHtcbiAgICAgICAgICBjb2RlX3BvaW50ID0gaW5kZXhHQjE4MDMwUmFuZ2VzQ29kZVBvaW50Rm9yKFxuICAgICAgICAgICAgICAoKChnYjE4MDMwX2ZpcnN0IC0gMHg4MSkgKiAxMCArIGdiMTgwMzBfc2Vjb25kIC0gMHgzMCkgKiAxMjYgK1xuICAgICAgICAgICAgICAgZ2IxODAzMF90aGlyZCAtIDB4ODEpICogMTAgKyBiaXRlIC0gMHgzMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBMZXQgYnVmZmVyIGJlIGEgYnl0ZSBzZXF1ZW5jZSBjb25zaXN0aW5nIG9mIGdiMTgwMzBcbiAgICAgICAgLy8gc2Vjb25kLCBnYjE4MDMwIHRoaXJkLCBhbmQgYnl0ZSwgaW4gb3JkZXIuXG4gICAgICAgIHZhciBidWZmZXIgPSBbZ2IxODAzMF9zZWNvbmQsIGdiMTgwMzBfdGhpcmQsIGJpdGVdO1xuXG4gICAgICAgIC8vIDQuIFNldCBnYjE4MDMwIGZpcnN0LCBnYjE4MDMwIHNlY29uZCwgYW5kIGdiMTgwMzAgdGhpcmQgdG9cbiAgICAgICAgLy8gMHgwMC5cbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IDB4MDA7XG4gICAgICAgIGdiMTgwMzBfc2Vjb25kID0gMHgwMDtcbiAgICAgICAgZ2IxODAzMF90aGlyZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gNS4gSWYgY29kZSBwb2ludCBpcyBudWxsLCBwcmVwZW5kIGJ1ZmZlciB0byBzdHJlYW0gYW5kXG4gICAgICAgIC8vIHJldHVybiBlcnJvci5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBzdHJlYW0ucHJlcGVuZChidWZmZXIpO1xuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNi4gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZ2IxODAzMCBzZWNvbmQgaXMgbm90IDB4MDAsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChnYjE4MDMwX3NlY29uZCAhPT0gMHgwMCkge1xuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCB0aGlyZCB0byBieXRlIGFuZCByZXR1cm4gY29udGludWUuXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4ODEsIDB4RkUpKSB7XG4gICAgICAgICAgZ2IxODAzMF90aGlyZCA9IGJpdGU7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBQcmVwZW5kIGdiMTgwMzAgc2Vjb25kIGZvbGxvd2VkIGJ5IGJ5dGUgdG8gc3RyZWFtLCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCBmaXJzdCBhbmQgZ2IxODAzMCBzZWNvbmQgdG8gMHgwMCwgYW5kIHJldHVybiBlcnJvci5cbiAgICAgICAgc3RyZWFtLnByZXBlbmQoW2diMTgwMzBfc2Vjb25kLCBiaXRlXSk7XG4gICAgICAgIGdiMTgwMzBfZmlyc3QgPSAweDAwO1xuICAgICAgICBnYjE4MDMwX3NlY29uZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBJZiBnYjE4MDMwIGZpcnN0IGlzIG5vdCAweDAwLCBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgICBpZiAoZ2IxODAzMF9maXJzdCAhPT0gMHgwMCkge1xuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4MzAgdG8gMHgzOSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCBzZWNvbmQgdG8gYnl0ZSBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDMwLCAweDM5KSkge1xuICAgICAgICAgIGdiMTgwMzBfc2Vjb25kID0gYml0ZTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIExldCBsZWFkIGJlIGdiMTgwMzAgZmlyc3QsIGxldCBwb2ludGVyIGJlIG51bGwsIGFuZCBzZXRcbiAgICAgICAgLy8gZ2IxODAzMCBmaXJzdCB0byAweDAwLlxuICAgICAgICB2YXIgbGVhZCA9IGdiMTgwMzBfZmlyc3Q7XG4gICAgICAgIHZhciBwb2ludGVyID0gbnVsbDtcbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMy4gTGV0IG9mZnNldCBiZSAweDQwIGlmIGJ5dGUgaXMgbGVzcyB0aGFuIDB4N0YgYW5kIDB4NDFcbiAgICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgb2Zmc2V0ID0gYml0ZSA8IDB4N0YgPyAweDQwIDogMHg0MTtcblxuICAgICAgICAvLyA0LiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweDQwIHRvIDB4N0UsIGluY2x1c2l2ZSwgb3IgMHg4MFxuICAgICAgICAvLyB0byAweEZFLCBpbmNsdXNpdmUsIHNldCBwb2ludGVyIHRvIChsZWFkIOKIkiAweDgxKSDDlyAxOTAgK1xuICAgICAgICAvLyAoYnl0ZSDiiJIgb2Zmc2V0KS5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg0MCwgMHg3RSkgfHwgaW5SYW5nZShiaXRlLCAweDgwLCAweEZFKSlcbiAgICAgICAgICBwb2ludGVyID0gKGxlYWQgLSAweDgxKSAqIDE5MCArIChiaXRlIC0gb2Zmc2V0KTtcblxuICAgICAgICAvLyA1LiBMZXQgY29kZSBwb2ludCBiZSBudWxsIGlmIHBvaW50ZXIgaXMgbnVsbCBhbmQgdGhlIGluZGV4XG4gICAgICAgIC8vIGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW4gaW5kZXggZ2IxODAzMCBvdGhlcndpc2UuXG4gICAgICAgIGNvZGVfcG9pbnQgPSBwb2ludGVyID09PSBudWxsID8gbnVsbCA6XG4gICAgICAgICAgICBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCgnZ2IxODAzMCcpKTtcblxuICAgICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNy4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDguIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDcuIElmIGJ5dGUgaXMgMHg4MCwgcmV0dXJuIGNvZGUgcG9pbnQgVSsyMEFDLlxuICAgICAgaWYgKGJpdGUgPT09IDB4ODApXG4gICAgICAgIHJldHVybiAweDIwQUM7XG5cbiAgICAgIC8vIDguIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgIC8vIGdiMTgwMzAgZmlyc3QgdG8gYnl0ZSBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg4MSwgMHhGRSkpIHtcbiAgICAgICAgZ2IxODAzMF9maXJzdCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA5LiBSZXR1cm4gZXJyb3IuXG4gICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTEuMi4yIGdiMTgwMzAgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2JrX2ZsYWdcbiAgICovXG4gIGZ1bmN0aW9uIEdCMTgwMzBFbmNvZGVyKG9wdGlvbnMsIGdia19mbGFnKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvLyBnYjE4MDMwJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBnYmsgZmxhZyAoaW5pdGlhbGx5IHVuc2V0KS5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZVxuICAgICAgLy8gdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gSWYgY29kZSBwb2ludCBpcyBVK0U1RTUsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHhFNUU1KVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA0LiBJZiB0aGUgZ2JrIGZsYWcgaXMgc2V0IGFuZCBjb2RlIHBvaW50IGlzIFUrMjBBQywgcmV0dXJuXG4gICAgICAvLyBieXRlIDB4ODAuXG4gICAgICBpZiAoZ2JrX2ZsYWcgJiYgY29kZV9wb2ludCA9PT0gMHgyMEFDKVxuICAgICAgICByZXR1cm4gMHg4MDtcblxuICAgICAgLy8gNS4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXhcbiAgICAgIC8vIGdiMTgwMzAuXG4gICAgICB2YXIgcG9pbnRlciA9IGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleCgnZ2IxODAzMCcpKTtcblxuICAgICAgLy8gNi4gSWYgcG9pbnRlciBpcyBub3QgbnVsbCwgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgICAgaWYgKHBvaW50ZXIgIT09IG51bGwpIHtcblxuICAgICAgICAvLyAxLiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gMTkwKSArIDB4ODEuXG4gICAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDE5MCkgKyAweDgxO1xuXG4gICAgICAgIC8vIDIuIExldCB0cmFpbCBiZSBwb2ludGVyICUgMTkwLlxuICAgICAgICB2YXIgdHJhaWwgPSBwb2ludGVyICUgMTkwO1xuXG4gICAgICAgIC8vIDMuIExldCBvZmZzZXQgYmUgMHg0MCBpZiB0cmFpbCBpcyBsZXNzIHRoYW4gMHgzRiBhbmQgMHg0MSBvdGhlcndpc2UuXG4gICAgICAgIHZhciBvZmZzZXQgPSB0cmFpbCA8IDB4M0YgPyAweDQwIDogMHg0MTtcblxuICAgICAgICAvLyA0LiBSZXR1cm4gdHdvIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgbGVhZCBhbmQgdHJhaWwgKyBvZmZzZXQuXG4gICAgICAgIHJldHVybiBbbGVhZCwgdHJhaWwgKyBvZmZzZXRdO1xuICAgICAgfVxuXG4gICAgICAvLyA3LiBJZiBnYmsgZmxhZyBpcyBzZXQsIHJldHVybiBlcnJvciB3aXRoIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoZ2JrX2ZsYWcpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDguIFNldCBwb2ludGVyIHRvIHRoZSBpbmRleCBnYjE4MDMwIHJhbmdlcyBwb2ludGVyIGZvciBjb2RlXG4gICAgICAvLyBwb2ludC5cbiAgICAgIHBvaW50ZXIgPSBpbmRleEdCMTgwMzBSYW5nZXNQb2ludGVyRm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA5LiBMZXQgYnl0ZTEgYmUgZmxvb3IocG9pbnRlciAvIDEwIC8gMTI2IC8gMTApLlxuICAgICAgdmFyIGJ5dGUxID0gZmxvb3IocG9pbnRlciAvIDEwIC8gMTI2IC8gMTApO1xuXG4gICAgICAvLyAxMC4gU2V0IHBvaW50ZXIgdG8gcG9pbnRlciDiiJIgYnl0ZTEgw5cgMTAgw5cgMTI2IMOXIDEwLlxuICAgICAgcG9pbnRlciA9IHBvaW50ZXIgLSBieXRlMSAqIDEwICogMTI2ICogMTA7XG5cbiAgICAgIC8vIDExLiBMZXQgYnl0ZTIgYmUgZmxvb3IocG9pbnRlciAvIDEwIC8gMTI2KS5cbiAgICAgIHZhciBieXRlMiA9IGZsb29yKHBvaW50ZXIgLyAxMCAvIDEyNik7XG5cbiAgICAgIC8vIDEyLiBTZXQgcG9pbnRlciB0byBwb2ludGVyIOKIkiBieXRlMiDDlyAxMCDDlyAxMjYuXG4gICAgICBwb2ludGVyID0gcG9pbnRlciAtIGJ5dGUyICogMTAgKiAxMjY7XG5cbiAgICAgIC8vIDEzLiBMZXQgYnl0ZTMgYmUgZmxvb3IocG9pbnRlciAvIDEwKS5cbiAgICAgIHZhciBieXRlMyA9IGZsb29yKHBvaW50ZXIgLyAxMCk7XG5cbiAgICAgIC8vIDE0LiBMZXQgYnl0ZTQgYmUgcG9pbnRlciDiiJIgYnl0ZTMgw5cgMTAuXG4gICAgICB2YXIgYnl0ZTQgPSBwb2ludGVyIC0gYnl0ZTMgKiAxMDtcblxuICAgICAgLy8gMTUuIFJldHVybiBmb3VyIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgYnl0ZTEgKyAweDgxLCBieXRlMiArXG4gICAgICAvLyAweDMwLCBieXRlMyArIDB4ODEsIGJ5dGU0ICsgMHgzMC5cbiAgICAgIHJldHVybiBbYnl0ZTEgKyAweDgxLFxuICAgICAgICAgICAgICBieXRlMiArIDB4MzAsXG4gICAgICAgICAgICAgIGJ5dGUzICsgMHg4MSxcbiAgICAgICAgICAgICAgYnl0ZTQgKyAweDMwXTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snZ2IxODAzMCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR0IxODAzMEVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ2diMTgwMzAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdCMTgwMzBEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG5cbiAgLy9cbiAgLy8gMTIuIExlZ2FjeSBtdWx0aS1ieXRlIENoaW5lc2UgKHRyYWRpdGlvbmFsKSBlbmNvZGluZ3NcbiAgLy9cblxuICAvLyAxMi4xIEJpZzVcblxuICAvLyAxMi4xLjEgQmlnNSBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gQmlnNURlY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLy8gQmlnNSdzIGRlY29kZXIgaGFzIGFuIGFzc29jaWF0ZWQgQmlnNSBsZWFkIChpbml0aWFsbHkgMHgwMCkuXG4gICAgdmFyIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBCaWc1X2xlYWQgPSAweDAwO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIEJpZzUgbGVhZCBpcyBub3QgMHgwMCwgc2V0XG4gICAgICAvLyBCaWc1IGxlYWQgdG8gMHgwMCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgQmlnNV9sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIEJpZzVfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIEJpZzUgbGVhZCBpcyAweDAwLCByZXR1cm5cbiAgICAgIC8vIGZpbmlzaGVkLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgQmlnNV9sZWFkID09PSAweDAwKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDMuIElmIEJpZzUgbGVhZCBpcyBub3QgMHgwMCwgbGV0IGxlYWQgYmUgQmlnNSBsZWFkLCBsZXRcbiAgICAgIC8vIHBvaW50ZXIgYmUgbnVsbCwgc2V0IEJpZzUgbGVhZCB0byAweDAwLCBhbmQgdGhlbiBydW4gdGhlc2VcbiAgICAgIC8vIHN1YnN0ZXBzOlxuICAgICAgaWYgKEJpZzVfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICB2YXIgbGVhZCA9IEJpZzVfbGVhZDtcbiAgICAgICAgdmFyIHBvaW50ZXIgPSBudWxsO1xuICAgICAgICBCaWc1X2xlYWQgPSAweDAwO1xuXG4gICAgICAgIC8vIDEuIExldCBvZmZzZXQgYmUgMHg0MCBpZiBieXRlIGlzIGxlc3MgdGhhbiAweDdGIGFuZCAweDYyXG4gICAgICAgIC8vIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIG9mZnNldCA9IGJpdGUgPCAweDdGID8gMHg0MCA6IDB4NjI7XG5cbiAgICAgICAgLy8gMi4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg0MCB0byAweDdFLCBpbmNsdXNpdmUsIG9yIDB4QTFcbiAgICAgICAgLy8gdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXQgcG9pbnRlciB0byAobGVhZCDiiJIgMHg4MSkgw5cgMTU3ICtcbiAgICAgICAgLy8gKGJ5dGUg4oiSIG9mZnNldCkuXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4NDAsIDB4N0UpIHx8IGluUmFuZ2UoYml0ZSwgMHhBMSwgMHhGRSkpXG4gICAgICAgICAgcG9pbnRlciA9IChsZWFkIC0gMHg4MSkgKiAxNTcgKyAoYml0ZSAtIG9mZnNldCk7XG5cbiAgICAgICAgLy8gMy4gSWYgdGhlcmUgaXMgYSByb3cgaW4gdGhlIHRhYmxlIGJlbG93IHdob3NlIGZpcnN0IGNvbHVtblxuICAgICAgICAvLyBpcyBwb2ludGVyLCByZXR1cm4gdGhlIHR3byBjb2RlIHBvaW50cyBsaXN0ZWQgaW4gaXRzIHNlY29uZFxuICAgICAgICAvLyBjb2x1bW5cbiAgICAgICAgLy8gUG9pbnRlciB8IENvZGUgcG9pbnRzXG4gICAgICAgIC8vIC0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tXG4gICAgICAgIC8vIDExMzMgICAgfCBVKzAwQ0EgVSswMzA0XG4gICAgICAgIC8vIDExMzUgICAgfCBVKzAwQ0EgVSswMzBDXG4gICAgICAgIC8vIDExNjQgICAgfCBVKzAwRUEgVSswMzA0XG4gICAgICAgIC8vIDExNjYgICAgfCBVKzAwRUEgVSswMzBDXG4gICAgICAgIHN3aXRjaCAocG9pbnRlcikge1xuICAgICAgICAgIGNhc2UgMTEzMzogcmV0dXJuIFsweDAwQ0EsIDB4MDMwNF07XG4gICAgICAgICAgY2FzZSAxMTM1OiByZXR1cm4gWzB4MDBDQSwgMHgwMzBDXTtcbiAgICAgICAgICBjYXNlIDExNjQ6IHJldHVybiBbMHgwMEVBLCAweDAzMDRdO1xuICAgICAgICAgIGNhc2UgMTE2NjogcmV0dXJuIFsweDAwRUEsIDB4MDMwQ107XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiBMZXQgY29kZSBwb2ludCBiZSBudWxsIGlmIHBvaW50ZXIgaXMgbnVsbCBhbmQgdGhlIGluZGV4XG4gICAgICAgIC8vIGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW4gaW5kZXggQmlnNSBvdGhlcndpc2UuXG4gICAgICAgIHZhciBjb2RlX3BvaW50ID0gKHBvaW50ZXIgPT09IG51bGwpID8gbnVsbCA6XG4gICAgICAgICAgICBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCgnYmlnNScpKTtcblxuICAgICAgICAvLyA1LiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNi4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDcuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDUuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXQgQmlnNVxuICAgICAgLy8gbGVhZCB0byBieXRlIGFuZCByZXR1cm4gY29udGludWUuXG4gICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDgxLCAweEZFKSkge1xuICAgICAgICBCaWc1X2xlYWQgPSBiaXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gUmV0dXJuIGVycm9yLlxuICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDEyLjEuMiBCaWc1IGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBCaWc1RW5jb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZVxuICAgICAgLy8gdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IEJpZzUgcG9pbnRlciBmb3IgY29kZSBwb2ludC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhCaWc1UG9pbnRlckZvcihjb2RlX3BvaW50KTtcblxuICAgICAgLy8gNC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDUuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyAxNTcpICsgMHg4MS5cbiAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDE1NykgKyAweDgxO1xuXG4gICAgICAvLyA2LiBJZiBsZWFkIGlzIGxlc3MgdGhhbiAweEExLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKGxlYWQgPCAweEExKVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA3LiBMZXQgdHJhaWwgYmUgcG9pbnRlciAlIDE1Ny5cbiAgICAgIHZhciB0cmFpbCA9IHBvaW50ZXIgJSAxNTc7XG5cbiAgICAgIC8vIDguIExldCBvZmZzZXQgYmUgMHg0MCBpZiB0cmFpbCBpcyBsZXNzIHRoYW4gMHgzRiBhbmQgMHg2MlxuICAgICAgLy8gb3RoZXJ3aXNlLlxuICAgICAgdmFyIG9mZnNldCA9IHRyYWlsIDwgMHgzRiA/IDB4NDAgOiAweDYyO1xuXG4gICAgICAvLyBSZXR1cm4gdHdvIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgbGVhZCBhbmQgdHJhaWwgKyBvZmZzZXQuXG4gICAgICByZXR1cm4gW2xlYWQsIHRyYWlsICsgb2Zmc2V0XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snQmlnNSddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgQmlnNUVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ0JpZzUnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEJpZzVEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG5cbiAgLy9cbiAgLy8gMTMuIExlZ2FjeSBtdWx0aS1ieXRlIEphcGFuZXNlIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDEzLjEgZXVjLWpwXG5cbiAgLy8gMTMuMS4xIGV1Yy1qcCBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gRVVDSlBEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuXG4gICAgLy8gZXVjLWpwJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBldWMtanAgamlzMDIxMiBmbGFnXG4gICAgLy8gKGluaXRpYWxseSB1bnNldCkgYW5kIGV1Yy1qcCBsZWFkIChpbml0aWFsbHkgMHgwMCkuXG4gICAgdmFyIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8gZXVjanBfamlzMDIxMl9mbGFnID0gZmFsc2UsXG4gICAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyBldWNqcF9sZWFkID0gMHgwMDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCBldWMtanAgbGVhZCBpcyBub3QgMHgwMCwgc2V0XG4gICAgICAvLyBldWMtanAgbGVhZCB0byAweDAwLCBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgZXVjanBfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICBldWNqcF9sZWFkID0gMHgwMDtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgZXVjLWpwIGxlYWQgaXMgMHgwMCwgcmV0dXJuXG4gICAgICAvLyBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIGV1Y2pwX2xlYWQgPT09IDB4MDApXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMy4gSWYgZXVjLWpwIGxlYWQgaXMgMHg4RSBhbmQgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHhBMSB0b1xuICAgICAgLy8gMHhERiwgaW5jbHVzaXZlLCBzZXQgZXVjLWpwIGxlYWQgdG8gMHgwMCBhbmQgcmV0dXJuIGEgY29kZVxuICAgICAgLy8gcG9pbnQgd2hvc2UgdmFsdWUgaXMgMHhGRjYxIOKIkiAweEExICsgYnl0ZS5cbiAgICAgIGlmIChldWNqcF9sZWFkID09PSAweDhFICYmIGluUmFuZ2UoYml0ZSwgMHhBMSwgMHhERikpIHtcbiAgICAgICAgZXVjanBfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiAweEZGNjEgLSAweEExICsgYml0ZTtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZXVjLWpwIGxlYWQgaXMgMHg4RiBhbmQgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHhBMSB0b1xuICAgICAgLy8gMHhGRSwgaW5jbHVzaXZlLCBzZXQgdGhlIGV1Yy1qcCBqaXMwMjEyIGZsYWcsIHNldCBldWMtanAgbGVhZFxuICAgICAgLy8gdG8gYnl0ZSwgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChldWNqcF9sZWFkID09PSAweDhGICYmIGluUmFuZ2UoYml0ZSwgMHhBMSwgMHhGRSkpIHtcbiAgICAgICAgZXVjanBfamlzMDIxMl9mbGFnID0gdHJ1ZTtcbiAgICAgICAgZXVjanBfbGVhZCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBJZiBldWMtanAgbGVhZCBpcyBub3QgMHgwMCwgbGV0IGxlYWQgYmUgZXVjLWpwIGxlYWQsIHNldFxuICAgICAgLy8gZXVjLWpwIGxlYWQgdG8gMHgwMCwgYW5kIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChldWNqcF9sZWFkICE9PSAweDAwKSB7XG4gICAgICAgIHZhciBsZWFkID0gZXVjanBfbGVhZDtcbiAgICAgICAgZXVjanBfbGVhZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMS4gTGV0IGNvZGUgcG9pbnQgYmUgbnVsbC5cbiAgICAgICAgdmFyIGNvZGVfcG9pbnQgPSBudWxsO1xuXG4gICAgICAgIC8vIDIuIElmIGxlYWQgYW5kIGJ5dGUgYXJlIGJvdGggaW4gdGhlIHJhbmdlIDB4QTEgdG8gMHhGRSxcbiAgICAgICAgLy8gaW5jbHVzaXZlLCBzZXQgY29kZSBwb2ludCB0byB0aGUgaW5kZXggY29kZSBwb2ludCBmb3IgKGxlYWRcbiAgICAgICAgLy8g4oiSIDB4QTEpIMOXIDk0ICsgYnl0ZSDiiJIgMHhBMSBpbiBpbmRleCBqaXMwMjA4IGlmIHRoZSBldWMtanBcbiAgICAgICAgLy8gamlzMDIxMiBmbGFnIGlzIHVuc2V0IGFuZCBpbiBpbmRleCBqaXMwMjEyIG90aGVyd2lzZS5cbiAgICAgICAgaWYgKGluUmFuZ2UobGVhZCwgMHhBMSwgMHhGRSkgJiYgaW5SYW5nZShiaXRlLCAweEExLCAweEZFKSkge1xuICAgICAgICAgIGNvZGVfcG9pbnQgPSBpbmRleENvZGVQb2ludEZvcihcbiAgICAgICAgICAgIChsZWFkIC0gMHhBMSkgKiA5NCArIChiaXRlIC0gMHhBMSksXG4gICAgICAgICAgICBpbmRleCghZXVjanBfamlzMDIxMl9mbGFnID8gJ2ppczAyMDgnIDogJ2ppczAyMTInKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBVbnNldCB0aGUgZXVjLWpwIGppczAyMTIgZmxhZy5cbiAgICAgICAgZXVjanBfamlzMDIxMl9mbGFnID0gZmFsc2U7XG5cbiAgICAgICAgLy8gNC4gSWYgYnl0ZSBpcyBub3QgaW4gdGhlIHJhbmdlIDB4QTEgdG8gMHhGRSwgaW5jbHVzaXZlLFxuICAgICAgICAvLyBwcmVwZW5kIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBpZiAoIWluUmFuZ2UoYml0ZSwgMHhBMSwgMHhGRSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNS4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDYuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDcuIElmIGJ5dGUgaXMgMHg4RSwgMHg4Riwgb3IgaW4gdGhlIHJhbmdlIDB4QTEgdG8gMHhGRSxcbiAgICAgIC8vIGluY2x1c2l2ZSwgc2V0IGV1Yy1qcCBsZWFkIHRvIGJ5dGUgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChiaXRlID09PSAweDhFIHx8IGJpdGUgPT09IDB4OEYgfHwgaW5SYW5nZShiaXRlLCAweEExLCAweEZFKSkge1xuICAgICAgICBldWNqcF9sZWFkID0gYml0ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIDguIFJldHVybiBlcnJvci5cbiAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgIH07XG4gIH1cblxuICAvLyAxMy4xLjIgZXVjLWpwIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBFVUNKUEVuY29kZXIob3B0aW9ucykge1xuICAgIHZhciBmYXRhbCA9IG9wdGlvbnMuZmF0YWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBJbnB1dCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfcG9pbnQgTmV4dCBjb2RlIHBvaW50IHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgY29kZV9wb2ludCkge1xuICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIHJldHVybiBhIGJ5dGUgd2hvc2VcbiAgICAgIC8vIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICBpZiAoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgVSswMEE1LCByZXR1cm4gYnl0ZSAweDVDLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MDBBNSlcbiAgICAgICAgcmV0dXJuIDB4NUM7XG5cbiAgICAgIC8vIDQuIElmIGNvZGUgcG9pbnQgaXMgVSsyMDNFLCByZXR1cm4gYnl0ZSAweDdFLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjAzRSlcbiAgICAgICAgcmV0dXJuIDB4N0U7XG5cbiAgICAgIC8vIDUuIElmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrRkY2MSB0byBVK0ZGOUYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSAweDhFIGFuZCBjb2RlIHBvaW50IOKIklxuICAgICAgLy8gMHhGRjYxICsgMHhBMS5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4RkY2MSwgMHhGRjlGKSlcbiAgICAgICAgcmV0dXJuIFsweDhFLCBjb2RlX3BvaW50IC0gMHhGRjYxICsgMHhBMV07XG5cbiAgICAgIC8vIDYuIElmIGNvZGUgcG9pbnQgaXMgVSsyMjEyLCBzZXQgaXQgdG8gVStGRjBELlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjIxMilcbiAgICAgICAgY29kZV9wb2ludCA9IDB4RkYwRDtcblxuICAgICAgLy8gNy4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXhcbiAgICAgIC8vIGppczAyMDguXG4gICAgICB2YXIgcG9pbnRlciA9IGluZGV4UG9pbnRlckZvcihjb2RlX3BvaW50LCBpbmRleCgnamlzMDIwOCcpKTtcblxuICAgICAgLy8gOC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDkuIExldCBsZWFkIGJlIGZsb29yKHBvaW50ZXIgLyA5NCkgKyAweEExLlxuICAgICAgdmFyIGxlYWQgPSBmbG9vcihwb2ludGVyIC8gOTQpICsgMHhBMTtcblxuICAgICAgLy8gMTAuIExldCB0cmFpbCBiZSBwb2ludGVyICUgOTQgKyAweEExLlxuICAgICAgdmFyIHRyYWlsID0gcG9pbnRlciAlIDk0ICsgMHhBMTtcblxuICAgICAgLy8gMTEuIFJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBsZWFkIGFuZCB0cmFpbC5cbiAgICAgIHJldHVybiBbbGVhZCwgdHJhaWxdO1xuICAgIH07XG4gIH1cblxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGVuY29kZXJzWydFVUMtSlAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEVVQ0pQRW5jb2RlcihvcHRpb25zKTtcbiAgfTtcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snRVVDLUpQJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBFVUNKUERlY29kZXIob3B0aW9ucyk7XG4gIH07XG5cbiAgLy8gMTMuMiBpc28tMjAyMi1qcFxuXG4gIC8vIDEzLjIuMSBpc28tMjAyMi1qcCBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gSVNPMjAyMkpQRGVjb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKiogQGVudW0gKi9cbiAgICB2YXIgc3RhdGVzID0ge1xuICAgICAgQVNDSUk6IDAsXG4gICAgICBSb21hbjogMSxcbiAgICAgIEthdGFrYW5hOiAyLFxuICAgICAgTGVhZEJ5dGU6IDMsXG4gICAgICBUcmFpbEJ5dGU6IDQsXG4gICAgICBFc2NhcGVTdGFydDogNSxcbiAgICAgIEVzY2FwZTogNlxuICAgIH07XG4gICAgLy8gaXNvLTIwMjItanAncyBkZWNvZGVyIGhhcyBhbiBhc3NvY2lhdGVkIGlzby0yMDIyLWpwIGRlY29kZXJcbiAgICAvLyBzdGF0ZSAoaW5pdGlhbGx5IEFTQ0lJKSwgaXNvLTIwMjItanAgZGVjb2RlciBvdXRwdXQgc3RhdGVcbiAgICAvLyAoaW5pdGlhbGx5IEFTQ0lJKSwgaXNvLTIwMjItanAgbGVhZCAoaW5pdGlhbGx5IDB4MDApLCBhbmRcbiAgICAvLyBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyAoaW5pdGlhbGx5IHVuc2V0KS5cbiAgICB2YXIgLyoqIEB0eXBlIHtudW1iZXJ9ICovIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGVzLkFTQ0lJLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gaXNvMjAyMmpwX2RlY29kZXJfb3V0cHV0X3N0YXRlID0gc3RhdGVzLkFTQ0lJLFxuICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8gaXNvMjAyMmpwX2xlYWQgPSAweDAwLFxuICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gc3dpdGNoaW5nIG9uIGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGU6XG4gICAgICBzd2l0Y2ggKGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlKSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSBzdGF0ZXMuQVNDSUk6XG4gICAgICAgIC8vIEFTQ0lJXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDAwIHRvIDB4N0YsIGV4Y2x1ZGluZyAweDBFLCAweDBGLCBhbmQgMHgxQlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDAwLCAweDdGKSAmJiBiaXRlICE9PSAweDBFXG4gICAgICAgICAgICAmJiBiaXRlICE9PSAweDBGICYmIGJpdGUgIT09IDB4MUIpIHtcbiAgICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBhIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyB3aG9zZSB2YWx1ZSBpcyBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBiaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFJldHVybiBmaW5pc2hlZC5cbiAgICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuUm9tYW46XG4gICAgICAgIC8vIFJvbWFuXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDVDXG4gICAgICAgIGlmIChiaXRlID09PSAweDVDKSB7XG4gICAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gY29kZSBwb2ludFxuICAgICAgICAgIC8vIFUrMDBBNS5cbiAgICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gMHgwMEE1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMHg3RVxuICAgICAgICBpZiAoYml0ZSA9PT0gMHg3RSkge1xuICAgICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyBhbmQgcmV0dXJuIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyBVKzIwM0UuXG4gICAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIDB4MjAzRTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4MDAgdG8gMHg3RiwgZXhjbHVkaW5nIDB4MEUsIDB4MEYsIDB4MUIsIDB4NUMsIGFuZCAweDdFXG4gICAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4MDAsIDB4N0YpICYmIGJpdGUgIT09IDB4MEUgJiYgYml0ZSAhPT0gMHgwRlxuICAgICAgICAgICAgJiYgYml0ZSAhPT0gMHgxQiAmJiBiaXRlICE9PSAweDVDICYmIGJpdGUgIT09IDB4N0UpIHtcbiAgICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBhIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyB3aG9zZSB2YWx1ZSBpcyBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBiaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFJldHVybiBmaW5pc2hlZC5cbiAgICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuS2F0YWthbmE6XG4gICAgICAgIC8vIEthdGFrYW5hXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDIxIHRvIDB4NUZcbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgyMSwgMHg1RikpIHtcbiAgICAgICAgICAvLyBVbnNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcgYW5kIHJldHVybiBhIGNvZGUgcG9pbnRcbiAgICAgICAgICAvLyB3aG9zZSB2YWx1ZSBpcyAweEZGNjEg4oiSIDB4MjEgKyBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiAweEZGNjEgLSAweDIxICsgYml0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuZC1vZi1zdHJlYW1cbiAgICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0pIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZmluaXNoZWQuXG4gICAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlXG4gICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZyBhbmQgcmV0dXJuIGVycm9yLlxuICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgIGNhc2Ugc3RhdGVzLkxlYWRCeXRlOlxuICAgICAgICAvLyBMZWFkIGJ5dGVcbiAgICAgICAgLy8gQmFzZWQgb24gYnl0ZTpcblxuICAgICAgICAvLyAweDFCXG4gICAgICAgIGlmIChiaXRlID09PSAweDFCKSB7XG4gICAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gZXNjYXBlIHN0YXJ0IGFuZCByZXR1cm5cbiAgICAgICAgICAvLyBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IHN0YXRlcy5Fc2NhcGVTdGFydDtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDB4MjEgdG8gMHg3RVxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDIxLCAweDdFKSkge1xuICAgICAgICAgIC8vIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZywgc2V0IGlzby0yMDIyLWpwIGxlYWRcbiAgICAgICAgICAvLyB0byBieXRlLCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIHRyYWlsIGJ5dGUsIGFuZFxuICAgICAgICAgIC8vIHJldHVybiBjb250aW51ZS5cbiAgICAgICAgICBpc28yMDIyanBfb3V0cHV0X2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICBpc28yMDIyanBfbGVhZCA9IGJpdGU7XG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuVHJhaWxCeXRlO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5kLW9mLXN0cmVhbVxuICAgICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSkge1xuICAgICAgICAgIC8vIFJldHVybiBmaW5pc2hlZC5cbiAgICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9vdXRwdXRfZmxhZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuVHJhaWxCeXRlOlxuICAgICAgICAvLyBUcmFpbCBieXRlXG4gICAgICAgIC8vIEJhc2VkIG9uIGJ5dGU6XG5cbiAgICAgICAgLy8gMHgxQlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHgxQikge1xuICAgICAgICAgIC8vIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIHRvIGVzY2FwZSBzdGFydCBhbmQgcmV0dXJuXG4gICAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlU3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAweDIxIHRvIDB4N0VcbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgyMSwgMHg3RSkpIHtcbiAgICAgICAgICAvLyAxLiBTZXQgdGhlIGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gbGVhZCBieXRlLlxuICAgICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGVzLkxlYWRCeXRlO1xuXG4gICAgICAgICAgLy8gMi4gTGV0IHBvaW50ZXIgYmUgKGlzby0yMDIyLWpwIGxlYWQg4oiSIDB4MjEpIMOXIDk0ICsgYnl0ZSDiiJIgMHgyMS5cbiAgICAgICAgICB2YXIgcG9pbnRlciA9IChpc28yMDIyanBfbGVhZCAtIDB4MjEpICogOTQgKyBiaXRlIC0gMHgyMTtcblxuICAgICAgICAgIC8vIDMuIExldCBjb2RlIHBvaW50IGJlIHRoZSBpbmRleCBjb2RlIHBvaW50IGZvciBwb2ludGVyIGluXG4gICAgICAgICAgLy8gaW5kZXggamlzMDIwOC5cbiAgICAgICAgICB2YXIgY29kZV9wb2ludCA9IGluZGV4Q29kZVBvaW50Rm9yKHBvaW50ZXIsIGluZGV4KCdqaXMwMjA4JykpO1xuXG4gICAgICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgICAgIC8vIDUuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuZC1vZi1zdHJlYW1cbiAgICAgICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0pIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gbGVhZCBieXRlLCBwcmVwZW5kXG4gICAgICAgICAgLy8gYnl0ZSB0byBzdHJlYW0sIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuTGVhZEJ5dGU7XG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2VcbiAgICAgICAgLy8gU2V0IGlzby0yMDIyLWpwIGRlY29kZXIgc3RhdGUgdG8gbGVhZCBieXRlIGFuZCByZXR1cm5cbiAgICAgICAgLy8gZXJyb3IuXG4gICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGVzLkxlYWRCeXRlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuRXNjYXBlU3RhcnQ6XG4gICAgICAgIC8vIEVzY2FwZSBzdGFydFxuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgZWl0aGVyIDB4MjQgb3IgMHgyOCwgc2V0IGlzby0yMDIyLWpwIGxlYWQgdG9cbiAgICAgICAgLy8gYnl0ZSwgaXNvLTIwMjItanAgZGVjb2RlciBzdGF0ZSB0byBlc2NhcGUsIGFuZCByZXR1cm5cbiAgICAgICAgLy8gY29udGludWUuXG4gICAgICAgIGlmIChiaXRlID09PSAweDI0IHx8IGJpdGUgPT09IDB4MjgpIHtcbiAgICAgICAgICBpc28yMDIyanBfbGVhZCA9IGJpdGU7XG4gICAgICAgICAgaXNvMjAyMmpwX2RlY29kZXJfc3RhdGUgPSBzdGF0ZXMuRXNjYXBlO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gUHJlcGVuZCBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gMy4gVW5zZXQgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnLCBzZXQgaXNvLTIwMjItanBcbiAgICAgICAgLy8gZGVjb2RlciBzdGF0ZSB0byBpc28tMjAyMi1qcCBkZWNvZGVyIG91dHB1dCBzdGF0ZSwgYW5kXG4gICAgICAgIC8vIHJldHVybiBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gaXNvMjAyMmpwX2RlY29kZXJfb3V0cHV0X3N0YXRlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcblxuICAgICAgY2FzZSBzdGF0ZXMuRXNjYXBlOlxuICAgICAgICAvLyBFc2NhcGVcblxuICAgICAgICAvLyAxLiBMZXQgbGVhZCBiZSBpc28tMjAyMi1qcCBsZWFkIGFuZCBzZXQgaXNvLTIwMjItanAgbGVhZCB0b1xuICAgICAgICAvLyAweDAwLlxuICAgICAgICB2YXIgbGVhZCA9IGlzbzIwMjJqcF9sZWFkO1xuICAgICAgICBpc28yMDIyanBfbGVhZCA9IDB4MDA7XG5cbiAgICAgICAgLy8gMi4gTGV0IHN0YXRlIGJlIG51bGwuXG4gICAgICAgIHZhciBzdGF0ZSA9IG51bGw7XG5cbiAgICAgICAgLy8gMy4gSWYgbGVhZCBpcyAweDI4IGFuZCBieXRlIGlzIDB4NDIsIHNldCBzdGF0ZSB0byBBU0NJSS5cbiAgICAgICAgaWYgKGxlYWQgPT09IDB4MjggJiYgYml0ZSA9PT0gMHg0MilcbiAgICAgICAgICBzdGF0ZSA9IHN0YXRlcy5BU0NJSTtcblxuICAgICAgICAvLyA0LiBJZiBsZWFkIGlzIDB4MjggYW5kIGJ5dGUgaXMgMHg0QSwgc2V0IHN0YXRlIHRvIFJvbWFuLlxuICAgICAgICBpZiAobGVhZCA9PT0gMHgyOCAmJiBiaXRlID09PSAweDRBKVxuICAgICAgICAgIHN0YXRlID0gc3RhdGVzLlJvbWFuO1xuXG4gICAgICAgIC8vIDUuIElmIGxlYWQgaXMgMHgyOCBhbmQgYnl0ZSBpcyAweDQ5LCBzZXQgc3RhdGUgdG8gS2F0YWthbmEuXG4gICAgICAgIGlmIChsZWFkID09PSAweDI4ICYmIGJpdGUgPT09IDB4NDkpXG4gICAgICAgICAgc3RhdGUgPSBzdGF0ZXMuS2F0YWthbmE7XG5cbiAgICAgICAgLy8gNi4gSWYgbGVhZCBpcyAweDI0IGFuZCBieXRlIGlzIGVpdGhlciAweDQwIG9yIDB4NDIsIHNldFxuICAgICAgICAvLyBzdGF0ZSB0byBsZWFkIGJ5dGUuXG4gICAgICAgIGlmIChsZWFkID09PSAweDI0ICYmIChiaXRlID09PSAweDQwIHx8IGJpdGUgPT09IDB4NDIpKVxuICAgICAgICAgIHN0YXRlID0gc3RhdGVzLkxlYWRCeXRlO1xuXG4gICAgICAgIC8vIDcuIElmIHN0YXRlIGlzIG5vbi1udWxsLCBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIDEuIFNldCBpc28tMjAyMi1qcCBkZWNvZGVyIHN0YXRlIGFuZCBpc28tMjAyMi1qcCBkZWNvZGVyXG4gICAgICAgICAgLy8gb3V0cHV0IHN0YXRlIHRvIHN0YXRlcy5cbiAgICAgICAgICBpc28yMDIyanBfZGVjb2Rlcl9zdGF0ZSA9IGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gc3RhdGU7XG5cbiAgICAgICAgICAvLyAyLiBMZXQgb3V0cHV0IGZsYWcgYmUgdGhlIGlzby0yMDIyLWpwIG91dHB1dCBmbGFnLlxuICAgICAgICAgIHZhciBvdXRwdXRfZmxhZyA9IGlzbzIwMjJqcF9vdXRwdXRfZmxhZztcblxuICAgICAgICAgIC8vIDMuIFNldCB0aGUgaXNvLTIwMjItanAgb3V0cHV0IGZsYWcuXG4gICAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIDQuIFJldHVybiBjb250aW51ZSwgaWYgb3V0cHV0IGZsYWcgaXMgdW5zZXQsIGFuZCBlcnJvclxuICAgICAgICAgIC8vIG90aGVyd2lzZS5cbiAgICAgICAgICByZXR1cm4gIW91dHB1dF9mbGFnID8gbnVsbCA6IGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA4LiBQcmVwZW5kIGxlYWQgYW5kIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgICBzdHJlYW0ucHJlcGVuZChbbGVhZCwgYml0ZV0pO1xuXG4gICAgICAgIC8vIDkuIFVuc2V0IHRoZSBpc28tMjAyMi1qcCBvdXRwdXQgZmxhZywgc2V0IGlzby0yMDIyLWpwXG4gICAgICAgIC8vIGRlY29kZXIgc3RhdGUgdG8gaXNvLTIwMjItanAgZGVjb2RlciBvdXRwdXQgc3RhdGUgYW5kXG4gICAgICAgIC8vIHJldHVybiBlcnJvci5cbiAgICAgICAgaXNvMjAyMmpwX291dHB1dF9mbGFnID0gZmFsc2U7XG4gICAgICAgIGlzbzIwMjJqcF9kZWNvZGVyX3N0YXRlID0gaXNvMjAyMmpwX2RlY29kZXJfb3V0cHV0X3N0YXRlO1xuICAgICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gMTMuMi4yIGlzby0yMDIyLWpwIGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBJU08yMDIySlBFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8vIGlzby0yMDIyLWpwJ3MgZW5jb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBpc28tMjAyMi1qcCBlbmNvZGVyXG4gICAgLy8gc3RhdGUgd2hpY2ggaXMgb25lIG9mIEFTQ0lJLCBSb21hbiwgYW5kIGppczAyMDggKGluaXRpYWxseVxuICAgIC8vIEFTQ0lJKS5cbiAgICAvKiogQGVudW0gKi9cbiAgICB2YXIgc3RhdGVzID0ge1xuICAgICAgQVNDSUk6IDAsXG4gICAgICBSb21hbjogMSxcbiAgICAgIGppczAyMDg6IDJcbiAgICB9O1xuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gaXNvMjAyMmpwX3N0YXRlID0gc3RhdGVzLkFTQ0lJO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSBhbmQgaXNvLTIwMjItanAgZW5jb2RlclxuICAgICAgLy8gc3RhdGUgaXMgbm90IEFTQ0lJLCBwcmVwZW5kIGNvZGUgcG9pbnQgdG8gc3RyZWFtLCBzZXRcbiAgICAgIC8vIGlzby0yMDIyLWpwIGVuY29kZXIgc3RhdGUgdG8gQVNDSUksIGFuZCByZXR1cm4gdGhyZWUgYnl0ZXNcbiAgICAgIC8vIDB4MUIgMHgyOCAweDQyLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0gJiZcbiAgICAgICAgICBpc28yMDIyanBfc3RhdGUgIT09IHN0YXRlcy5BU0NJSSkge1xuICAgICAgICBzdHJlYW0ucHJlcGVuZChjb2RlX3BvaW50KTtcbiAgICAgICAgaXNvMjAyMmpwX3N0YXRlID0gc3RhdGVzLkFTQ0lJO1xuICAgICAgICByZXR1cm4gWzB4MUIsIDB4MjgsIDB4NDJdO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0gYW5kIGlzby0yMDIyLWpwIGVuY29kZXJcbiAgICAgIC8vIHN0YXRlIGlzIEFTQ0lJLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gZW5kX29mX3N0cmVhbSAmJiBpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5BU0NJSSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAzLiBJZiBJU08tMjAyMi1KUCBlbmNvZGVyIHN0YXRlIGlzIEFTQ0lJIG9yIFJvbWFuLCBhbmQgY29kZVxuICAgICAgLy8gcG9pbnQgaXMgVSswMDBFLCBVKzAwMEYsIG9yIFUrMDAxQiwgcmV0dXJuIGVycm9yIHdpdGggVStGRkZELlxuICAgICAgaWYgKChpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5BU0NJSSB8fFxuICAgICAgICAgICBpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5Sb21hbikgJiZcbiAgICAgICAgICAoY29kZV9wb2ludCA9PT0gMHgwMDBFIHx8IGNvZGVfcG9pbnQgPT09IDB4MDAwRiB8fFxuICAgICAgICAgICBjb2RlX3BvaW50ID09PSAweDAwMUIpKSB7XG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoMHhGRkZEKTtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSBpcyBBU0NJSSBhbmQgY29kZSBwb2ludCBpcyBhblxuICAgICAgLy8gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZSB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzbzIwMjJqcF9zdGF0ZSA9PT0gc3RhdGVzLkFTQ0lJICYmXG4gICAgICAgICAgaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDUuIElmIGlzby0yMDIyLWpwIGVuY29kZXIgc3RhdGUgaXMgUm9tYW4gYW5kIGNvZGUgcG9pbnQgaXMgYW5cbiAgICAgIC8vIEFTQ0lJIGNvZGUgcG9pbnQsIGV4Y2x1ZGluZyBVKzAwNUMgYW5kIFUrMDA3RSwgb3IgaXMgVSswMEE1XG4gICAgICAvLyBvciBVKzIwM0UsIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChpc28yMDIyanBfc3RhdGUgPT09IHN0YXRlcy5Sb21hbiAmJlxuICAgICAgICAgICgoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSAmJlxuICAgICAgICAgICBjb2RlX3BvaW50ICE9PSAweDAwNUMgJiYgY29kZV9wb2ludCAhPT0gMHgwMDdFKSB8fFxuICAgICAgICAgIChjb2RlX3BvaW50ID09IDB4MDBBNSB8fCBjb2RlX3BvaW50ID09IDB4MjAzRSkpKSB7XG5cbiAgICAgICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlXG4gICAgICAgIC8vIHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQuXG4gICAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgVSswMEE1LCByZXR1cm4gYnl0ZSAweDVDLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgwMEE1KVxuICAgICAgICAgIHJldHVybiAweDVDO1xuXG4gICAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgVSsyMDNFLCByZXR1cm4gYnl0ZSAweDdFLlxuICAgICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgyMDNFKVxuICAgICAgICAgIHJldHVybiAweDdFO1xuICAgICAgfVxuXG4gICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIGFuIEFTQ0lJIGNvZGUgcG9pbnQsIGFuZCBpc28tMjAyMi1qcFxuICAgICAgLy8gZW5jb2RlciBzdGF0ZSBpcyBub3QgQVNDSUksIHByZXBlbmQgY29kZSBwb2ludCB0byBzdHJlYW0sIHNldFxuICAgICAgLy8gaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSB0byBBU0NJSSwgYW5kIHJldHVybiB0aHJlZSBieXRlc1xuICAgICAgLy8gMHgxQiAweDI4IDB4NDIuXG4gICAgICBpZiAoaXNBU0NJSUNvZGVQb2ludChjb2RlX3BvaW50KSAmJlxuICAgICAgICAgIGlzbzIwMjJqcF9zdGF0ZSAhPT0gc3RhdGVzLkFTQ0lJKSB7XG4gICAgICAgIHN0cmVhbS5wcmVwZW5kKGNvZGVfcG9pbnQpO1xuICAgICAgICBpc28yMDIyanBfc3RhdGUgPSBzdGF0ZXMuQVNDSUk7XG4gICAgICAgIHJldHVybiBbMHgxQiwgMHgyOCwgMHg0Ml07XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIElmIGNvZGUgcG9pbnQgaXMgZWl0aGVyIFUrMDBBNSBvciBVKzIwM0UsIGFuZCBpc28tMjAyMi1qcFxuICAgICAgLy8gZW5jb2RlciBzdGF0ZSBpcyBub3QgUm9tYW4sIHByZXBlbmQgY29kZSBwb2ludCB0byBzdHJlYW0sIHNldFxuICAgICAgLy8gaXNvLTIwMjItanAgZW5jb2RlciBzdGF0ZSB0byBSb21hbiwgYW5kIHJldHVybiB0aHJlZSBieXRlc1xuICAgICAgLy8gMHgxQiAweDI4IDB4NEEuXG4gICAgICBpZiAoKGNvZGVfcG9pbnQgPT09IDB4MDBBNSB8fCBjb2RlX3BvaW50ID09PSAweDIwM0UpICYmXG4gICAgICAgICAgaXNvMjAyMmpwX3N0YXRlICE9PSBzdGF0ZXMuUm9tYW4pIHtcbiAgICAgICAgc3RyZWFtLnByZXBlbmQoY29kZV9wb2ludCk7XG4gICAgICAgIGlzbzIwMjJqcF9zdGF0ZSA9IHN0YXRlcy5Sb21hbjtcbiAgICAgICAgcmV0dXJuIFsweDFCLCAweDI4LCAweDRBXTtcbiAgICAgIH1cblxuICAgICAgLy8gOC4gSWYgY29kZSBwb2ludCBpcyBVKzIyMTIsIHNldCBpdCB0byBVK0ZGMEQuXG4gICAgICBpZiAoY29kZV9wb2ludCA9PT0gMHgyMjEyKVxuICAgICAgICBjb2RlX3BvaW50ID0gMHhGRjBEO1xuXG4gICAgICAvLyA5LiBMZXQgcG9pbnRlciBiZSB0aGUgaW5kZXggcG9pbnRlciBmb3IgY29kZSBwb2ludCBpbiBpbmRleFxuICAgICAgLy8gamlzMDIwOC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KCdqaXMwMjA4JykpO1xuXG4gICAgICAvLyAxMC4gSWYgcG9pbnRlciBpcyBudWxsLCByZXR1cm4gZXJyb3Igd2l0aCBjb2RlIHBvaW50LlxuICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDExLiBJZiBpc28tMjAyMi1qcCBlbmNvZGVyIHN0YXRlIGlzIG5vdCBqaXMwMjA4LCBwcmVwZW5kIGNvZGVcbiAgICAgIC8vIHBvaW50IHRvIHN0cmVhbSwgc2V0IGlzby0yMDIyLWpwIGVuY29kZXIgc3RhdGUgdG8gamlzMDIwOCxcbiAgICAgIC8vIGFuZCByZXR1cm4gdGhyZWUgYnl0ZXMgMHgxQiAweDI0IDB4NDIuXG4gICAgICBpZiAoaXNvMjAyMmpwX3N0YXRlICE9PSBzdGF0ZXMuamlzMDIwOCkge1xuICAgICAgICBzdHJlYW0ucHJlcGVuZChjb2RlX3BvaW50KTtcbiAgICAgICAgaXNvMjAyMmpwX3N0YXRlID0gc3RhdGVzLmppczAyMDg7XG4gICAgICAgIHJldHVybiBbMHgxQiwgMHgyNCwgMHg0Ml07XG4gICAgICB9XG5cbiAgICAgIC8vIDEyLiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gOTQpICsgMHgyMS5cbiAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDk0KSArIDB4MjE7XG5cbiAgICAgIC8vIDEzLiBMZXQgdHJhaWwgYmUgcG9pbnRlciAlIDk0ICsgMHgyMS5cbiAgICAgIHZhciB0cmFpbCA9IHBvaW50ZXIgJSA5NCArIDB4MjE7XG5cbiAgICAgIC8vIDE0LiBSZXR1cm4gdHdvIGJ5dGVzIHdob3NlIHZhbHVlcyBhcmUgbGVhZCBhbmQgdHJhaWwuXG4gICAgICByZXR1cm4gW2xlYWQsIHRyYWlsXTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snSVNPLTIwMjItSlAnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IElTTzIwMjJKUEVuY29kZXIob3B0aW9ucyk7XG4gIH07XG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZGVjb2RlcnNbJ0lTTy0yMDIyLUpQJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBJU08yMDIySlBEZWNvZGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vIDEzLjMgU2hpZnRfSklTXG5cbiAgLy8gMTMuMy4xIFNoaWZ0X0pJUyBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2hpZnRKSVNEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8vIFNoaWZ0X0pJUydzIGRlY29kZXIgaGFzIGFuIGFzc29jaWF0ZWQgU2hpZnRfSklTIGxlYWQgKGluaXRpYWxseVxuICAgIC8vIDB4MDApLlxuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gU2hpZnRfSklTX2xlYWQgPSAweDAwO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCBTaGlmdF9KSVMgbGVhZCBpcyBub3QgMHgwMCxcbiAgICAgIC8vIHNldCBTaGlmdF9KSVMgbGVhZCB0byAweDAwIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBTaGlmdF9KSVNfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICBTaGlmdF9KSVNfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIFNoaWZ0X0pJUyBsZWFkIGlzIDB4MDAsXG4gICAgICAvLyByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBTaGlmdF9KSVNfbGVhZCA9PT0gMHgwMClcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAzLiBJZiBTaGlmdF9KSVMgbGVhZCBpcyBub3QgMHgwMCwgbGV0IGxlYWQgYmUgU2hpZnRfSklTIGxlYWQsXG4gICAgICAvLyBsZXQgcG9pbnRlciBiZSBudWxsLCBzZXQgU2hpZnRfSklTIGxlYWQgdG8gMHgwMCwgYW5kIHRoZW4gcnVuXG4gICAgICAvLyB0aGVzZSBzdWJzdGVwczpcbiAgICAgIGlmIChTaGlmdF9KSVNfbGVhZCAhPT0gMHgwMCkge1xuICAgICAgICB2YXIgbGVhZCA9IFNoaWZ0X0pJU19sZWFkO1xuICAgICAgICB2YXIgcG9pbnRlciA9IG51bGw7XG4gICAgICAgIFNoaWZ0X0pJU19sZWFkID0gMHgwMDtcblxuICAgICAgICAvLyAxLiBMZXQgb2Zmc2V0IGJlIDB4NDAsIGlmIGJ5dGUgaXMgbGVzcyB0aGFuIDB4N0YsIGFuZCAweDQxXG4gICAgICAgIC8vIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIG9mZnNldCA9IChiaXRlIDwgMHg3RikgPyAweDQwIDogMHg0MTtcblxuICAgICAgICAvLyAyLiBMZXQgbGVhZCBvZmZzZXQgYmUgMHg4MSwgaWYgbGVhZCBpcyBsZXNzIHRoYW4gMHhBMCwgYW5kXG4gICAgICAgIC8vIDB4QzEgb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgbGVhZF9vZmZzZXQgPSAobGVhZCA8IDB4QTApID8gMHg4MSA6IDB4QzE7XG5cbiAgICAgICAgLy8gMy4gSWYgYnl0ZSBpcyBpbiB0aGUgcmFuZ2UgMHg0MCB0byAweDdFLCBpbmNsdXNpdmUsIG9yIDB4ODBcbiAgICAgICAgLy8gdG8gMHhGQywgaW5jbHVzaXZlLCBzZXQgcG9pbnRlciB0byAobGVhZCDiiJIgbGVhZCBvZmZzZXQpIMOXXG4gICAgICAgIC8vIDE4OCArIGJ5dGUg4oiSIG9mZnNldC5cbiAgICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg0MCwgMHg3RSkgfHwgaW5SYW5nZShiaXRlLCAweDgwLCAweEZDKSlcbiAgICAgICAgICBwb2ludGVyID0gKGxlYWQgLSBsZWFkX29mZnNldCkgKiAxODggKyBiaXRlIC0gb2Zmc2V0O1xuXG4gICAgICAgIC8vIDQuIElmIHBvaW50ZXIgaXMgaW4gdGhlIHJhbmdlIDg4MzYgdG8gMTA3MTUsIGluY2x1c2l2ZSxcbiAgICAgICAgLy8gcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyAweEUwMDAg4oiSIDg4MzYgKyBwb2ludGVyLlxuICAgICAgICBpZiAoaW5SYW5nZShwb2ludGVyLCA4ODM2LCAxMDcxNSkpXG4gICAgICAgICAgcmV0dXJuIDB4RTAwMCAtIDg4MzYgKyBwb2ludGVyO1xuXG4gICAgICAgIC8vIDUuIExldCBjb2RlIHBvaW50IGJlIG51bGwsIGlmIHBvaW50ZXIgaXMgbnVsbCwgYW5kIHRoZVxuICAgICAgICAvLyBpbmRleCBjb2RlIHBvaW50IGZvciBwb2ludGVyIGluIGluZGV4IGppczAyMDggb3RoZXJ3aXNlLlxuICAgICAgICB2YXIgY29kZV9wb2ludCA9IChwb2ludGVyID09PSBudWxsKSA/IG51bGwgOlxuICAgICAgICAgICAgICBpbmRleENvZGVQb2ludEZvcihwb2ludGVyLCBpbmRleCgnamlzMDIwOCcpKTtcblxuICAgICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNy4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDguIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSBvciAweDgwLCByZXR1cm4gYSBjb2RlIHBvaW50XG4gICAgICAvLyB3aG9zZSB2YWx1ZSBpcyBieXRlLlxuICAgICAgaWYgKGlzQVNDSUlCeXRlKGJpdGUpIHx8IGJpdGUgPT09IDB4ODApXG4gICAgICAgIHJldHVybiBiaXRlO1xuXG4gICAgICAvLyA1LiBJZiBieXRlIGlzIGluIHRoZSByYW5nZSAweEExIHRvIDB4REYsIGluY2x1c2l2ZSwgcmV0dXJuIGFcbiAgICAgIC8vIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgMHhGRjYxIOKIkiAweEExICsgYnl0ZS5cbiAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4QTEsIDB4REYpKVxuICAgICAgICByZXR1cm4gMHhGRjYxIC0gMHhBMSArIGJpdGU7XG5cbiAgICAgIC8vIDYuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHg5RiwgaW5jbHVzaXZlLCBvciAweEUwXG4gICAgICAvLyB0byAweEZDLCBpbmNsdXNpdmUsIHNldCBTaGlmdF9KSVMgbGVhZCB0byBieXRlIGFuZCByZXR1cm5cbiAgICAgIC8vIGNvbnRpbnVlLlxuICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHg4MSwgMHg5RikgfHwgaW5SYW5nZShiaXRlLCAweEUwLCAweEZDKSkge1xuICAgICAgICBTaGlmdF9KSVNfbGVhZCA9IGJpdGU7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyA3LiBSZXR1cm4gZXJyb3IuXG4gICAgICByZXR1cm4gZGVjb2RlckVycm9yKGZhdGFsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gMTMuMy4yIFNoaWZ0X0pJUyBlbmNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0VuY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gU2hpZnRKSVNFbmNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlX3BvaW50IE5leHQgY29kZSBwb2ludCByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IEJ5dGUocykgdG8gZW1pdC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGNvZGVfcG9pbnQpIHtcbiAgICAgIC8vIDEuIElmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50IG9yIFUrMDA4MCwgcmV0dXJuIGFcbiAgICAgIC8vIGJ5dGUgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpIHx8IGNvZGVfcG9pbnQgPT09IDB4MDA4MClcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG5cbiAgICAgIC8vIDMuIElmIGNvZGUgcG9pbnQgaXMgVSswMEE1LCByZXR1cm4gYnl0ZSAweDVDLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MDBBNSlcbiAgICAgICAgcmV0dXJuIDB4NUM7XG5cbiAgICAgIC8vIDQuIElmIGNvZGUgcG9pbnQgaXMgVSsyMDNFLCByZXR1cm4gYnl0ZSAweDdFLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IDB4MjAzRSlcbiAgICAgICAgcmV0dXJuIDB4N0U7XG5cbiAgICAgIC8vIDUuIElmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrRkY2MSB0byBVK0ZGOUYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiBhIGJ5dGUgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludCDiiJIgMHhGRjYxICsgMHhBMS5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4RkY2MSwgMHhGRjlGKSlcbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQgLSAweEZGNjEgKyAweEExO1xuXG4gICAgICAvLyA2LiBJZiBjb2RlIHBvaW50IGlzIFUrMjIxMiwgc2V0IGl0IHRvIFUrRkYwRC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSAweDIyMTIpXG4gICAgICAgIGNvZGVfcG9pbnQgPSAweEZGMEQ7XG5cbiAgICAgIC8vIDcuIExldCBwb2ludGVyIGJlIHRoZSBpbmRleCBTaGlmdF9KSVMgcG9pbnRlciBmb3IgY29kZSBwb2ludC5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhTaGlmdEpJU1BvaW50ZXJGb3IoY29kZV9wb2ludCk7XG5cbiAgICAgIC8vIDguIElmIHBvaW50ZXIgaXMgbnVsbCwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChwb2ludGVyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA5LiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gMTg4KS5cbiAgICAgIHZhciBsZWFkID0gZmxvb3IocG9pbnRlciAvIDE4OCk7XG5cbiAgICAgIC8vIDEwLiBMZXQgbGVhZCBvZmZzZXQgYmUgMHg4MSwgaWYgbGVhZCBpcyBsZXNzIHRoYW4gMHgxRiwgYW5kXG4gICAgICAvLyAweEMxIG90aGVyd2lzZS5cbiAgICAgIHZhciBsZWFkX29mZnNldCA9IChsZWFkIDwgMHgxRikgPyAweDgxIDogMHhDMTtcblxuICAgICAgLy8gMTEuIExldCB0cmFpbCBiZSBwb2ludGVyICUgMTg4LlxuICAgICAgdmFyIHRyYWlsID0gcG9pbnRlciAlIDE4ODtcblxuICAgICAgLy8gMTIuIExldCBvZmZzZXQgYmUgMHg0MCwgaWYgdHJhaWwgaXMgbGVzcyB0aGFuIDB4M0YsIGFuZCAweDQxXG4gICAgICAvLyBvdGhlcndpc2UuXG4gICAgICB2YXIgb2Zmc2V0ID0gKHRyYWlsIDwgMHgzRikgPyAweDQwIDogMHg0MTtcblxuICAgICAgLy8gMTMuIFJldHVybiB0d28gYnl0ZXMgd2hvc2UgdmFsdWVzIGFyZSBsZWFkICsgbGVhZCBvZmZzZXQgYW5kXG4gICAgICAvLyB0cmFpbCArIG9mZnNldC5cbiAgICAgIHJldHVybiBbbGVhZCArIGxlYWRfb2Zmc2V0LCB0cmFpbCArIG9mZnNldF07XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ1NoaWZ0X0pJUyddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgU2hpZnRKSVNFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydTaGlmdF9KSVMnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFNoaWZ0SklTRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuICAvL1xuICAvLyAxNC4gTGVnYWN5IG11bHRpLWJ5dGUgS29yZWFuIGVuY29kaW5nc1xuICAvL1xuXG4gIC8vIDE0LjEgZXVjLWtyXG5cbiAgLy8gMTQuMS4xIGV1Yy1rciBkZWNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0RlY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gRVVDS1JEZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuXG4gICAgLy8gZXVjLWtyJ3MgZGVjb2RlciBoYXMgYW4gYXNzb2NpYXRlZCBldWMta3IgbGVhZCAoaW5pdGlhbGx5IDB4MDApLlxuICAgIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gZXVja3JfbGVhZCA9IDB4MDA7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdGUgVGhlIG5leHQgYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBUaGUgbmV4dCBjb2RlIHBvaW50KHMpXG4gICAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICAgKiAgICAgc3RyZWFtIHRvIGRlY29kZSBhIGNvbXBsZXRlIGNvZGUgcG9pbnQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgICAvLyAxLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIGV1Yy1rciBsZWFkIGlzIG5vdCAweDAwLCBzZXRcbiAgICAgIC8vIGV1Yy1rciBsZWFkIHRvIDB4MDAgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIGV1Y2tyX2xlYWQgIT09IDApIHtcbiAgICAgICAgZXVja3JfbGVhZCA9IDB4MDA7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIGV1Yy1rciBsZWFkIGlzIDB4MDAsIHJldHVyblxuICAgICAgLy8gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSAmJiBldWNrcl9sZWFkID09PSAwKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDMuIElmIGV1Yy1rciBsZWFkIGlzIG5vdCAweDAwLCBsZXQgbGVhZCBiZSBldWMta3IgbGVhZCwgbGV0XG4gICAgICAvLyBwb2ludGVyIGJlIG51bGwsIHNldCBldWMta3IgbGVhZCB0byAweDAwLCBhbmQgdGhlbiBydW4gdGhlc2VcbiAgICAgIC8vIHN1YnN0ZXBzOlxuICAgICAgaWYgKGV1Y2tyX2xlYWQgIT09IDB4MDApIHtcbiAgICAgICAgdmFyIGxlYWQgPSBldWNrcl9sZWFkO1xuICAgICAgICB2YXIgcG9pbnRlciA9IG51bGw7XG4gICAgICAgIGV1Y2tyX2xlYWQgPSAweDAwO1xuXG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4NDEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgICAgLy8gcG9pbnRlciB0byAobGVhZCDiiJIgMHg4MSkgw5cgMTkwICsgKGJ5dGUg4oiSIDB4NDEpLlxuICAgICAgICBpZiAoaW5SYW5nZShiaXRlLCAweDQxLCAweEZFKSlcbiAgICAgICAgICBwb2ludGVyID0gKGxlYWQgLSAweDgxKSAqIDE5MCArIChiaXRlIC0gMHg0MSk7XG5cbiAgICAgICAgLy8gMi4gTGV0IGNvZGUgcG9pbnQgYmUgbnVsbCwgaWYgcG9pbnRlciBpcyBudWxsLCBhbmQgdGhlXG4gICAgICAgIC8vIGluZGV4IGNvZGUgcG9pbnQgZm9yIHBvaW50ZXIgaW4gaW5kZXggZXVjLWtyIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIGNvZGVfcG9pbnQgPSAocG9pbnRlciA9PT0gbnVsbClcbiAgICAgICAgICAgICAgPyBudWxsIDogaW5kZXhDb2RlUG9pbnRGb3IocG9pbnRlciwgaW5kZXgoJ2V1Yy1rcicpKTtcblxuICAgICAgICAvLyAzLiBJZiBjb2RlIHBvaW50IGlzIG51bGwgYW5kIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcHJlcGVuZFxuICAgICAgICAvLyBieXRlIHRvIHN0cmVhbS5cbiAgICAgICAgaWYgKHBvaW50ZXIgPT09IG51bGwgJiYgaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgICAgLy8gNC4gSWYgY29kZSBwb2ludCBpcyBudWxsLCByZXR1cm4gZXJyb3IuXG4gICAgICAgIGlmIChjb2RlX3BvaW50ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuXG4gICAgICAgIC8vIDUuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgICAgcmV0dXJuIGNvZGVfcG9pbnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIGJ5dGUgaXMgYW4gQVNDSUkgYnl0ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZVxuICAgICAgLy8gaXMgYnl0ZS5cbiAgICAgIGlmIChpc0FTQ0lJQnl0ZShiaXRlKSlcbiAgICAgICAgcmV0dXJuIGJpdGU7XG5cbiAgICAgIC8vIDUuIElmIGJ5dGUgaXMgaW4gdGhlIHJhbmdlIDB4ODEgdG8gMHhGRSwgaW5jbHVzaXZlLCBzZXRcbiAgICAgIC8vIGV1Yy1rciBsZWFkIHRvIGJ5dGUgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChpblJhbmdlKGJpdGUsIDB4ODEsIDB4RkUpKSB7XG4gICAgICAgIGV1Y2tyX2xlYWQgPSBiaXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gUmV0dXJuIGVycm9yLlxuICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE0LjEuMiBldWMta3IgZW5jb2RlclxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICAgKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIEVVQ0tSRW5jb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgYW4gQVNDSUkgY29kZSBwb2ludCwgcmV0dXJuIGEgYnl0ZSB3aG9zZVxuICAgICAgLy8gdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICAgIGlmIChpc0FTQ0lJQ29kZVBvaW50KGNvZGVfcG9pbnQpKVxuICAgICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgICAgLy8gMy4gTGV0IHBvaW50ZXIgYmUgdGhlIGluZGV4IHBvaW50ZXIgZm9yIGNvZGUgcG9pbnQgaW4gaW5kZXhcbiAgICAgIC8vIGV1Yy1rci5cbiAgICAgIHZhciBwb2ludGVyID0gaW5kZXhQb2ludGVyRm9yKGNvZGVfcG9pbnQsIGluZGV4KCdldWMta3InKSk7XG5cbiAgICAgIC8vIDQuIElmIHBvaW50ZXIgaXMgbnVsbCwgcmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIGlmIChwb2ludGVyID09PSBudWxsKVxuICAgICAgICByZXR1cm4gZW5jb2RlckVycm9yKGNvZGVfcG9pbnQpO1xuXG4gICAgICAvLyA1LiBMZXQgbGVhZCBiZSBmbG9vcihwb2ludGVyIC8gMTkwKSArIDB4ODEuXG4gICAgICB2YXIgbGVhZCA9IGZsb29yKHBvaW50ZXIgLyAxOTApICsgMHg4MTtcblxuICAgICAgLy8gNi4gTGV0IHRyYWlsIGJlIHBvaW50ZXIgJSAxOTAgKyAweDQxLlxuICAgICAgdmFyIHRyYWlsID0gKHBvaW50ZXIgJSAxOTApICsgMHg0MTtcblxuICAgICAgLy8gNy4gUmV0dXJuIHR3byBieXRlcyB3aG9zZSB2YWx1ZXMgYXJlIGxlYWQgYW5kIHRyYWlsLlxuICAgICAgcmV0dXJuIFtsZWFkLCB0cmFpbF07XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ0VVQy1LUiddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRVVDS1JFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydFVUMtS1InXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEVVQ0tSRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuXG4gIC8vXG4gIC8vIDE1LiBMZWdhY3kgbWlzY2VsbGFuZW91cyBlbmNvZGluZ3NcbiAgLy9cblxuICAvLyAxNS4xIHJlcGxhY2VtZW50XG5cbiAgLy8gTm90IG5lZWRlZCAtIEFQSSB0aHJvd3MgUmFuZ2VFcnJvclxuXG4gIC8vIDE1LjIgQ29tbW9uIGluZnJhc3RydWN0dXJlIGZvciB1dGYtMTZiZSBhbmQgdXRmLTE2bGVcblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVfdW5pdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHV0ZjE2YmVcbiAgICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fSBieXRlc1xuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydENvZGVVbml0VG9CeXRlcyhjb2RlX3VuaXQsIHV0ZjE2YmUpIHtcbiAgICAvLyAxLiBMZXQgYnl0ZTEgYmUgY29kZSB1bml0ID4+IDguXG4gICAgdmFyIGJ5dGUxID0gY29kZV91bml0ID4+IDg7XG5cbiAgICAvLyAyLiBMZXQgYnl0ZTIgYmUgY29kZSB1bml0ICYgMHgwMEZGLlxuICAgIHZhciBieXRlMiA9IGNvZGVfdW5pdCAmIDB4MDBGRjtcblxuICAgIC8vIDMuIFRoZW4gcmV0dXJuIHRoZSBieXRlcyBpbiBvcmRlcjpcbiAgICAgICAgLy8gdXRmLTE2YmUgZmxhZyBpcyBzZXQ6IGJ5dGUxLCB0aGVuIGJ5dGUyLlxuICAgIGlmICh1dGYxNmJlKVxuICAgICAgcmV0dXJuIFtieXRlMSwgYnl0ZTJdO1xuICAgIC8vIHV0Zi0xNmJlIGZsYWcgaXMgdW5zZXQ6IGJ5dGUyLCB0aGVuIGJ5dGUxLlxuICAgIHJldHVybiBbYnl0ZTIsIGJ5dGUxXTtcbiAgfVxuXG4gIC8vIDE1LjIuMSBzaGFyZWQgdXRmLTE2IGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHtib29sZWFufSB1dGYxNl9iZSBUcnVlIGlmIGJpZy1lbmRpYW4sIGZhbHNlIGlmIGxpdHRsZS1lbmRpYW4uXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gVVRGMTZEZWNvZGVyKHV0ZjE2X2JlLCBvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICB2YXIgLyoqIEB0eXBlIHs/bnVtYmVyfSAqLyB1dGYxNl9sZWFkX2J5dGUgPSBudWxsLFxuICAgICAgICAvKiogQHR5cGUgez9udW1iZXJ9ICovIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIFRoZSBzdHJlYW0gb2YgYnl0ZXMgYmVpbmcgZGVjb2RlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0ZSBUaGUgbmV4dCBieXRlIHJlYWQgZnJvbSB0aGUgc3RyZWFtLlxuICAgICAqIEByZXR1cm4gez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9IFRoZSBuZXh0IGNvZGUgcG9pbnQocylcbiAgICAgKiAgICAgZGVjb2RlZCwgb3IgbnVsbCBpZiBub3QgZW5vdWdoIGRhdGEgZXhpc3RzIGluIHRoZSBpbnB1dFxuICAgICAqICAgICBzdHJlYW0gdG8gZGVjb2RlIGEgY29tcGxldGUgY29kZSBwb2ludC5cbiAgICAgKi9cbiAgICB0aGlzLmhhbmRsZXIgPSBmdW5jdGlvbihzdHJlYW0sIGJpdGUpIHtcbiAgICAgIC8vIDEuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSBhbmQgZWl0aGVyIHV0Zi0xNiBsZWFkIGJ5dGUgb3JcbiAgICAgIC8vIHV0Zi0xNiBsZWFkIHN1cnJvZ2F0ZSBpcyBub3QgbnVsbCwgc2V0IHV0Zi0xNiBsZWFkIGJ5dGUgYW5kXG4gICAgICAvLyB1dGYtMTYgbGVhZCBzdXJyb2dhdGUgdG8gbnVsbCwgYW5kIHJldHVybiBlcnJvci5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmICh1dGYxNl9sZWFkX2J5dGUgIT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmMTZfbGVhZF9zdXJyb2dhdGUgIT09IG51bGwpKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGVuZC1vZi1zdHJlYW0gYW5kIHV0Zi0xNiBsZWFkIGJ5dGUgYW5kIHV0Zi0xNlxuICAgICAgLy8gbGVhZCBzdXJyb2dhdGUgYXJlIG51bGwsIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtICYmIHV0ZjE2X2xlYWRfYnl0ZSA9PT0gbnVsbCAmJlxuICAgICAgICAgIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgdXRmLTE2IGxlYWQgYnl0ZSBpcyBudWxsLCBzZXQgdXRmLTE2IGxlYWQgYnl0ZSB0byBieXRlXG4gICAgICAvLyBhbmQgcmV0dXJuIGNvbnRpbnVlLlxuICAgICAgaWYgKHV0ZjE2X2xlYWRfYnl0ZSA9PT0gbnVsbCkge1xuICAgICAgICB1dGYxNl9sZWFkX2J5dGUgPSBiaXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNC4gTGV0IGNvZGUgdW5pdCBiZSB0aGUgcmVzdWx0IG9mOlxuICAgICAgdmFyIGNvZGVfdW5pdDtcbiAgICAgIGlmICh1dGYxNl9iZSkge1xuICAgICAgICAvLyB1dGYtMTZiZSBkZWNvZGVyIGZsYWcgaXMgc2V0XG4gICAgICAgIC8vICAgKHV0Zi0xNiBsZWFkIGJ5dGUgPDwgOCkgKyBieXRlLlxuICAgICAgICBjb2RlX3VuaXQgPSAodXRmMTZfbGVhZF9ieXRlIDw8IDgpICsgYml0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHV0Zi0xNmJlIGRlY29kZXIgZmxhZyBpcyB1bnNldFxuICAgICAgICAvLyAgIChieXRlIDw8IDgpICsgdXRmLTE2IGxlYWQgYnl0ZS5cbiAgICAgICAgY29kZV91bml0ID0gKGJpdGUgPDwgOCkgKyB1dGYxNl9sZWFkX2J5dGU7XG4gICAgICB9XG4gICAgICAvLyBUaGVuIHNldCB1dGYtMTYgbGVhZCBieXRlIHRvIG51bGwuXG4gICAgICB1dGYxNl9sZWFkX2J5dGUgPSBudWxsO1xuXG4gICAgICAvLyA1LiBJZiB1dGYtMTYgbGVhZCBzdXJyb2dhdGUgaXMgbm90IG51bGwsIGxldCBsZWFkIHN1cnJvZ2F0ZVxuICAgICAgLy8gYmUgdXRmLTE2IGxlYWQgc3Vycm9nYXRlLCBzZXQgdXRmLTE2IGxlYWQgc3Vycm9nYXRlIHRvIG51bGwsXG4gICAgICAvLyBhbmQgdGhlbiBydW4gdGhlc2Ugc3Vic3RlcHM6XG4gICAgICBpZiAodXRmMTZfbGVhZF9zdXJyb2dhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGxlYWRfc3Vycm9nYXRlID0gdXRmMTZfbGVhZF9zdXJyb2dhdGU7XG4gICAgICAgIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID0gbnVsbDtcblxuICAgICAgICAvLyAxLiBJZiBjb2RlIHVuaXQgaXMgaW4gdGhlIHJhbmdlIFUrREMwMCB0byBVK0RGRkYsXG4gICAgICAgIC8vIGluY2x1c2l2ZSwgcmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyAweDEwMDAwICtcbiAgICAgICAgLy8gKChsZWFkIHN1cnJvZ2F0ZSDiiJIgMHhEODAwKSA8PCAxMCkgKyAoY29kZSB1bml0IOKIkiAweERDMDApLlxuICAgICAgICBpZiAoaW5SYW5nZShjb2RlX3VuaXQsIDB4REMwMCwgMHhERkZGKSkge1xuICAgICAgICAgIHJldHVybiAweDEwMDAwICsgKGxlYWRfc3Vycm9nYXRlIC0gMHhEODAwKSAqIDB4NDAwICtcbiAgICAgICAgICAgICAgKGNvZGVfdW5pdCAtIDB4REMwMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBQcmVwZW5kIHRoZSBzZXF1ZW5jZSByZXN1bHRpbmcgb2YgY29udmVydGluZyBjb2RlIHVuaXRcbiAgICAgICAgLy8gdG8gYnl0ZXMgdXNpbmcgdXRmLTE2YmUgZGVjb2RlciBmbGFnIHRvIHN0cmVhbSBhbmQgcmV0dXJuXG4gICAgICAgIC8vIGVycm9yLlxuICAgICAgICBzdHJlYW0ucHJlcGVuZChjb252ZXJ0Q29kZVVuaXRUb0J5dGVzKGNvZGVfdW5pdCwgdXRmMTZfYmUpKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIElmIGNvZGUgdW5pdCBpcyBpbiB0aGUgcmFuZ2UgVStEODAwIHRvIFUrREJGRiwgaW5jbHVzaXZlLFxuICAgICAgLy8gc2V0IHV0Zi0xNiBsZWFkIHN1cnJvZ2F0ZSB0byBjb2RlIHVuaXQgYW5kIHJldHVybiBjb250aW51ZS5cbiAgICAgIGlmIChpblJhbmdlKGNvZGVfdW5pdCwgMHhEODAwLCAweERCRkYpKSB7XG4gICAgICAgIHV0ZjE2X2xlYWRfc3Vycm9nYXRlID0gY29kZV91bml0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gNy4gSWYgY29kZSB1bml0IGlzIGluIHRoZSByYW5nZSBVK0RDMDAgdG8gVStERkZGLCBpbmNsdXNpdmUsXG4gICAgICAvLyByZXR1cm4gZXJyb3IuXG4gICAgICBpZiAoaW5SYW5nZShjb2RlX3VuaXQsIDB4REMwMCwgMHhERkZGKSlcbiAgICAgICAgcmV0dXJuIGRlY29kZXJFcnJvcihmYXRhbCk7XG5cbiAgICAgIC8vIDguIFJldHVybiBjb2RlIHBvaW50IGNvZGUgdW5pdC5cbiAgICAgIHJldHVybiBjb2RlX3VuaXQ7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE1LjIuMiBzaGFyZWQgdXRmLTE2IGVuY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RW5jb2Rlcn1cbiAgICogQHBhcmFtIHtib29sZWFufSB1dGYxNl9iZSBUcnVlIGlmIGJpZy1lbmRpYW4sIGZhbHNlIGlmIGxpdHRsZS1lbmRpYW4uXG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gVVRGMTZFbmNvZGVyKHV0ZjE2X2JlLCBvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLiBJZiBjb2RlIHBvaW50IGlzIGVuZC1vZi1zdHJlYW0sIHJldHVybiBmaW5pc2hlZC5cbiAgICAgIGlmIChjb2RlX3BvaW50ID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAgIC8vIDIuIElmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDAwMCB0byBVK0ZGRkYsIGluY2x1c2l2ZSxcbiAgICAgIC8vIHJldHVybiB0aGUgc2VxdWVuY2UgcmVzdWx0aW5nIG9mIGNvbnZlcnRpbmcgY29kZSBwb2ludCB0b1xuICAgICAgLy8gYnl0ZXMgdXNpbmcgdXRmLTE2YmUgZW5jb2RlciBmbGFnLlxuICAgICAgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHgwMDAwLCAweEZGRkYpKVxuICAgICAgICByZXR1cm4gY29udmVydENvZGVVbml0VG9CeXRlcyhjb2RlX3BvaW50LCB1dGYxNl9iZSk7XG5cbiAgICAgIC8vIDMuIExldCBsZWFkIGJlICgoY29kZSBwb2ludCDiiJIgMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLFxuICAgICAgLy8gY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHV0Zi0xNmJlIGVuY29kZXIgZmxhZy5cbiAgICAgIHZhciBsZWFkID0gY29udmVydENvZGVVbml0VG9CeXRlcyhcbiAgICAgICAgKChjb2RlX3BvaW50IC0gMHgxMDAwMCkgPj4gMTApICsgMHhEODAwLCB1dGYxNl9iZSk7XG5cbiAgICAgIC8vIDQuIExldCB0cmFpbCBiZSAoKGNvZGUgcG9pbnQg4oiSIDB4MTAwMDApICYgMHgzRkYpICsgMHhEQzAwLFxuICAgICAgLy8gY29udmVydGVkIHRvIGJ5dGVzIHVzaW5nIHV0Zi0xNmJlIGVuY29kZXIgZmxhZy5cbiAgICAgIHZhciB0cmFpbCA9IGNvbnZlcnRDb2RlVW5pdFRvQnl0ZXMoXG4gICAgICAgICgoY29kZV9wb2ludCAtIDB4MTAwMDApICYgMHgzRkYpICsgMHhEQzAwLCB1dGYxNl9iZSk7XG5cbiAgICAgIC8vIDUuIFJldHVybiBhIGJ5dGUgc2VxdWVuY2Ugb2YgbGVhZCBmb2xsb3dlZCBieSB0cmFpbC5cbiAgICAgIHJldHVybiBsZWFkLmNvbmNhdCh0cmFpbCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE1LjMgdXRmLTE2YmVcbiAgLy8gMTUuMy4xIHV0Zi0xNmJlIGRlY29kZXJcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBlbmNvZGVyc1snVVRGLTE2QkUnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjE2RW5jb2Rlcih0cnVlLCBvcHRpb25zKTtcbiAgfTtcbiAgLy8gMTUuMy4yIHV0Zi0xNmJlIGVuY29kZXJcbiAgLyoqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9ucyAqL1xuICBkZWNvZGVyc1snVVRGLTE2QkUnXSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFVURjE2RGVjb2Rlcih0cnVlLCBvcHRpb25zKTtcbiAgfTtcblxuICAvLyAxNS40IHV0Zi0xNmxlXG4gIC8vIDE1LjQuMSB1dGYtMTZsZSBkZWNvZGVyXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ1VURi0xNkxFJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBVVEYxNkVuY29kZXIoZmFsc2UsIG9wdGlvbnMpO1xuICB9O1xuICAvLyAxNS40LjIgdXRmLTE2bGUgZW5jb2RlclxuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWydVVEYtMTZMRSddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVVRGMTZEZWNvZGVyKGZhbHNlLCBvcHRpb25zKTtcbiAgfTtcblxuICAvLyAxNS41IHgtdXNlci1kZWZpbmVkXG5cbiAgLy8gMTUuNS4xIHgtdXNlci1kZWZpbmVkIGRlY29kZXJcbiAgLyoqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAaW1wbGVtZW50cyB7RGVjb2Rlcn1cbiAgICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBYVXNlckRlZmluZWREZWNvZGVyKG9wdGlvbnMpIHtcbiAgICB2YXIgZmF0YWwgPSBvcHRpb25zLmZhdGFsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gVGhlIHN0cmVhbSBvZiBieXRlcyBiZWluZyBkZWNvZGVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7PyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gVGhlIG5leHQgY29kZSBwb2ludChzKVxuICAgICAqICAgICBkZWNvZGVkLCBvciBudWxsIGlmIG5vdCBlbm91Z2ggZGF0YSBleGlzdHMgaW4gdGhlIGlucHV0XG4gICAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgICAqL1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uKHN0cmVhbSwgYml0ZSkge1xuICAgICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgICBpZiAoYml0ZSA9PT0gZW5kX29mX3N0cmVhbSlcbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgICAvLyAyLiBJZiBieXRlIGlzIGFuIEFTQ0lJIGJ5dGUsIHJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWVcbiAgICAgIC8vIGlzIGJ5dGUuXG4gICAgICBpZiAoaXNBU0NJSUJ5dGUoYml0ZSkpXG4gICAgICAgIHJldHVybiBiaXRlO1xuXG4gICAgICAvLyAzLiBSZXR1cm4gYSBjb2RlIHBvaW50IHdob3NlIHZhbHVlIGlzIDB4Rjc4MCArIGJ5dGUg4oiSIDB4ODAuXG4gICAgICByZXR1cm4gMHhGNzgwICsgYml0ZSAtIDB4ODA7XG4gICAgfTtcbiAgfVxuXG4gIC8vIDE1LjUuMiB4LXVzZXItZGVmaW5lZCBlbmNvZGVyXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGltcGxlbWVudHMge0VuY29kZXJ9XG4gICAqIEBwYXJhbSB7e2ZhdGFsOiBib29sZWFufX0gb3B0aW9uc1xuICAgKi9cbiAgZnVuY3Rpb24gWFVzZXJEZWZpbmVkRW5jb2RlcihvcHRpb25zKSB7XG4gICAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIElucHV0IHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSBCeXRlKHMpIHRvIGVtaXQuXG4gICAgICovXG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgICAvLyAxLklmIGNvZGUgcG9pbnQgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICAgIHJldHVybiBmaW5pc2hlZDtcblxuICAgICAgLy8gMi4gSWYgY29kZSBwb2ludCBpcyBhbiBBU0NJSSBjb2RlIHBvaW50LCByZXR1cm4gYSBieXRlIHdob3NlXG4gICAgICAvLyB2YWx1ZSBpcyBjb2RlIHBvaW50LlxuICAgICAgaWYgKGlzQVNDSUlDb2RlUG9pbnQoY29kZV9wb2ludCkpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50O1xuXG4gICAgICAvLyAzLiBJZiBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVK0Y3ODAgdG8gVStGN0ZGLCBpbmNsdXNpdmUsXG4gICAgICAvLyByZXR1cm4gYSBieXRlIHdob3NlIHZhbHVlIGlzIGNvZGUgcG9pbnQg4oiSIDB4Rjc4MCArIDB4ODAuXG4gICAgICBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweEY3ODAsIDB4RjdGRikpXG4gICAgICAgIHJldHVybiBjb2RlX3BvaW50IC0gMHhGNzgwICsgMHg4MDtcblxuICAgICAgLy8gNC4gUmV0dXJuIGVycm9yIHdpdGggY29kZSBwb2ludC5cbiAgICAgIHJldHVybiBlbmNvZGVyRXJyb3IoY29kZV9wb2ludCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3tmYXRhbDogYm9vbGVhbn19IG9wdGlvbnMgKi9cbiAgZW5jb2RlcnNbJ3gtdXNlci1kZWZpbmVkJ10gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBYVXNlckRlZmluZWRFbmNvZGVyKG9wdGlvbnMpO1xuICB9O1xuICAvKiogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zICovXG4gIGRlY29kZXJzWyd4LXVzZXItZGVmaW5lZCddID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWFVzZXJEZWZpbmVkRGVjb2RlcihvcHRpb25zKTtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFsnVGV4dEVuY29kZXInXSlcbiAgICBnbG9iYWxbJ1RleHRFbmNvZGVyJ10gPSBUZXh0RW5jb2RlcjtcbiAgaWYgKCFnbG9iYWxbJ1RleHREZWNvZGVyJ10pXG4gICAgZ2xvYmFsWydUZXh0RGVjb2RlciddID0gVGV4dERlY29kZXI7XG5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgIFRleHRFbmNvZGVyOiBnbG9iYWxbJ1RleHRFbmNvZGVyJ10sXG4gICAgICBUZXh0RGVjb2RlcjogZ2xvYmFsWydUZXh0RGVjb2RlciddLFxuICAgICAgRW5jb2RpbmdJbmRleGVzOiBnbG9iYWxbXCJlbmNvZGluZy1pbmRleGVzXCJdXG4gICAgfTtcbiAgfVxuXG4vLyBGb3Igc3RyaWN0IGVudmlyb25tZW50cyB3aGVyZSBgdGhpc2AgaW5zaWRlIHRoZSBnbG9iYWwgc2NvcGVcbi8vIGlzIGB1bmRlZmluZWRgLCB0YWtlIGEgcHVyZSBvYmplY3QgaW5zdGVhZFxufSh0aGlzIHx8IHt9KSk7IiwiZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9YTUwoY2hhbmdlcykge1xuICBsZXQgcmV0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8aW5zPicpO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJlbW92ZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8ZGVsPicpO1xuICAgIH1cblxuICAgIHJldC5wdXNoKGVzY2FwZUhUTUwoY2hhbmdlLnZhbHVlKSk7XG5cbiAgICBpZiAoY2hhbmdlLmFkZGVkKSB7XG4gICAgICByZXQucHVzaCgnPC9pbnM+Jyk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgcmV0LnB1c2goJzwvZGVsPicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHMpIHtcbiAgbGV0IG4gPSBzO1xuICBuID0gbi5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuICBuID0gbi5yZXBsYWNlKC88L2csICcmbHQ7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXG4gIHJldHVybiBuO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmQ7XG5cbi8qXG4gIHZhciBvYmogPSB7YTogMywgYjogNX07XG4gIGV4dGVuZChvYmosIHthOiA0LCBjOiA4fSk7IC8vIHthOiA0LCBiOiA1LCBjOiA4fVxuICBvYmo7IC8vIHthOiA0LCBiOiA1LCBjOiA4fVxuXG4gIHZhciBvYmogPSB7YTogMywgYjogNX07XG4gIGV4dGVuZCh7fSwgb2JqLCB7YTogNCwgYzogOH0pOyAvLyB7YTogNCwgYjogNSwgYzogOH1cbiAgb2JqOyAvLyB7YTogMywgYjogNX1cblxuICB2YXIgYXJyID0gWzEsIDIsIDNdO1xuICB2YXIgb2JqID0ge2E6IDMsIGI6IDV9O1xuICBleHRlbmQob2JqLCB7YzogYXJyfSk7IC8vIHthOiAzLCBiOiA1LCBjOiBbMSwgMiwgM119XG4gIGFyci5wdXNoKDQpO1xuICBvYmo7IC8vIHthOiAzLCBiOiA1LCBjOiBbMSwgMiwgMywgNF19XG5cbiAgdmFyIGFyciA9IFsxLCAyLCAzXTtcbiAgdmFyIG9iaiA9IHthOiAzLCBiOiA1fTtcbiAgZXh0ZW5kKHRydWUsIG9iaiwge2M6IGFycn0pOyAvLyB7YTogMywgYjogNSwgYzogWzEsIDIsIDNdfVxuICBhcnIucHVzaCg0KTtcbiAgb2JqOyAvLyB7YTogMywgYjogNSwgYzogWzEsIDIsIDNdfVxuXG4gIGV4dGVuZCh7YTogNCwgYjogNX0pOyAvLyB7YTogNCwgYjogNX1cbiAgZXh0ZW5kKHthOiA0LCBiOiA1fSwgMyk7IHthOiA0LCBiOiA1fVxuICBleHRlbmQoe2E6IDQsIGI6IDV9LCB0cnVlKTsge2E6IDQsIGI6IDV9XG4gIGV4dGVuZCgnaGVsbG8nLCB7YTogNCwgYjogNX0pOyAvLyB0aHJvd3NcbiAgZXh0ZW5kKDMsIHthOiA0LCBiOiA1fSk7IC8vIHRocm93c1xuKi9cblxuZnVuY3Rpb24gZXh0ZW5kKC8qIFtkZWVwXSwgb2JqMSwgb2JqMiwgW29iam5dICovKSB7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICB2YXIgZGVlcCA9IGZhbHNlO1xuICBpZiAodHlwZW9mIGFyZ3NbMF0gPT0gJ2Jvb2xlYW4nKSB7XG4gICAgZGVlcCA9IGFyZ3Muc2hpZnQoKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gYXJnc1swXTtcbiAgaWYgKCFyZXN1bHQgfHwgKHR5cGVvZiByZXN1bHQgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHJlc3VsdCAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXh0ZW5kZWUgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuICB2YXIgZXh0ZW5kZXJzID0gYXJncy5zbGljZSgxKTtcbiAgdmFyIGxlbiA9IGV4dGVuZGVycy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgZXh0ZW5kZXIgPSBleHRlbmRlcnNbaV07XG4gICAgZm9yICh2YXIga2V5IGluIGV4dGVuZGVyKSB7XG4gICAgICBpZiAoZXh0ZW5kZXIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBleHRlbmRlcltrZXldO1xuICAgICAgICBpZiAoZGVlcCAmJiBpc0Nsb25lYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YXIgYmFzZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGV4dGVuZCh0cnVlLCByZXN1bHQuaGFzT3duUHJvcGVydHkoa2V5KSA/IHJlc3VsdFtrZXldIDogYmFzZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNDbG9uZWFibGUob2JqKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG9iaikgfHwge30udG9TdHJpbmcuY2FsbChvYmopID09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogTG9kYXNoIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcy5mb3VuZGF0aW9uLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUtRVM1IGVudmlyb25tZW50cy4gKi9cbiAgdmFyIHVuZGVmaW5lZDtcblxuICAvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG4gIHZhciBWRVJTSU9OID0gJzQuMTcuMTEnO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xuICB2YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuICAvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG4gIHZhciBDT1JFX0VSUk9SX1RFWFQgPSAnVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJyxcbiAgICAgIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xuICB2YXIgcmVUcmltID0gL15cXHMrfFxccyskL2csXG4gICAgICByZVRyaW1TdGFydCA9IC9eXFxzKy8sXG4gICAgICByZVRyaW1FbmQgPSAvXFxzKyQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xuICB2YXIgcmVXcmFwQ29tbWVudCA9IC9cXHsoPzpcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoIC4rXFxdIFxcKlxcLyk/XFxuPy8sXG4gICAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaFxuICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLlxuICAgKi9cbiAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG4gIHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG4gIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggTGF0aW4gVW5pY29kZSBsZXR0ZXJzIChleGNsdWRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycykuICovXG4gIHZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbiAgdmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICAgIHJzTG93ZXJSYW5nZSA9ICdhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmYnLFxuICAgICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgICByc1B1bmN0dWF0aW9uUmFuZ2UgPSAnXFxcXHUyMDAwLVxcXFx1MjA2ZicsXG4gICAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZicsXG4gICAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xuICB2YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCIsXG4gICAgICByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICAgIHJzRGlnaXRzID0gJ1xcXFxkKycsXG4gICAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgICByc01pc2MgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArIHJzQnJlYWtSYW5nZSArIHJzRGlnaXRzICsgcnNEaW5nYmF0UmFuZ2UgKyByc0xvd2VyUmFuZ2UgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICAgIHJzVXBwZXIgPSAnWycgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xuICB2YXIgcnNNaXNjTG93ZXIgPSAnKD86JyArIHJzTG93ZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgICAgcnNPcHRDb250clVwcGVyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86RHxMTHxNfFJFfFN8VHxWRSkpPycsXG4gICAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxLFxuICAgICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG4gIHZhciByZUFwb3MgPSBSZWdFeHAocnNBcG9zLCAnZycpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kXG4gICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gICAqL1xuICB2YXIgcmVDb21ib01hcmsgPSBSZWdFeHAocnNDb21ibywgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xuICB2YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggY29tcGxleCBvciBjb21wb3VuZCB3b3Jkcy4gKi9cbiAgdmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICAgIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNNaXNjVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyICsgcnNNaXNjTG93ZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICAgIHJzT3JkVXBwZXIsXG4gICAgcnNPcmRMb3dlcixcbiAgICByc0RpZ2l0cyxcbiAgICByc0Vtb2ppXG4gIF0uam9pbignfCcpLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG4gIHZhciByZUhhc1VuaWNvZGVXb3JkID0gL1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdCdWZmZXInLCAnRGF0YVZpZXcnLCAnRGF0ZScsICdFcnJvcicsICdGbG9hdDMyQXJyYXknLCAnRmxvYXQ2NEFycmF5JyxcbiAgICAnRnVuY3Rpb24nLCAnSW50OEFycmF5JywgJ0ludDE2QXJyYXknLCAnSW50MzJBcnJheScsICdNYXAnLCAnTWF0aCcsICdPYmplY3QnLFxuICAgICdQcm9taXNlJywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ1N5bWJvbCcsICdUeXBlRXJyb3InLCAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ1VpbnQxNkFycmF5JywgJ1VpbnQzMkFycmF5JywgJ1dlYWtNYXAnLFxuICAgICdfJywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdwYXJzZUludCcsICdzZXRUaW1lb3V0J1xuICBdO1xuXG4gIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG4gIHZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xuICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICB0eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbiAgdmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbiAgY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbiAgY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbiAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcycsXG4gICAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAgICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAgICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAgICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAgICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAgICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAgICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAgICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAgICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAgICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAgICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG4gIHZhciBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgaHRtbFVuZXNjYXBlcyA9IHtcbiAgICAnJmFtcDsnOiAnJicsXG4gICAgJyZsdDsnOiAnPCcsXG4gICAgJyZndDsnOiAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyYjMzk7JzogXCInXCJcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbiAgdmFyIGZyZWVQYXJzZUZsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICAgIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbiAgLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG4gIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgICAgaWYgKHR5cGVzKSB7XG4gICAgICAgIHJldHVybiB0eXBlcztcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9KCkpO1xuXG4gIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG4gIHZhciBub2RlSXNBcnJheUJ1ZmZlciA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsXG4gICAgICBub2RlSXNEYXRlID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNEYXRlLFxuICAgICAgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXAsXG4gICAgICBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cCxcbiAgICAgIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0LFxuICAgICAgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgIH1cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsXG4gICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICAgIHZhciByZXN1bHQ7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlSW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVhbmAgYW5kIGBfLm1lYW5CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gICAqIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXlcbiAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgICAgIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zVG9gIHdoaWNoIGFjY2VwdHMgYHByb3BzYCB0byBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHNvdXJjZVtrZXldLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICogdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ldmVyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICAgICAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgICAgIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgICAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmICghKHNlZW5cbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYXBwbHkoZnVuYywgb2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcnJheUJ1ZmZlclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gZGF0ZVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICAgICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gICAgICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgICAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICAgICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2FtZVRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgICAgPyBjdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LCBrZXkpLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm50aGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTnRoKGFycmF5LCBuKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbiArPSBuIDwgMCA/IGxlbmd0aCA6IDA7XG4gICAgICByZXR1cm4gaXNJbmRleChuLCBsZW5ndGgpID8gYXJyYXlbbl0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLmxlbmd0aCA/IGl0ZXJhdGVlcyA6IFtpZGVudGl0eV0sIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFsdWUgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24pIHtcbiAgICAgICAgICAvLyBTaGlmdCB3aXRoIGV4cG9uZW50aWFsIG5vdGF0aW9uIHRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGlzc3Vlcy5cbiAgICAgICAgICAvLyBTZWUgW01ETl0oaHR0cHM6Ly9tZG4uaW8vcm91bmQjRXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgdmFyIHBhaXIgPSAodG9TdHJpbmcobnVtYmVyKSArICdlJykuc3BsaXQoJ2UnKSxcbiAgICAgICAgICAgICAgdmFsdWUgPSBmdW5jKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gKyBwcmVjaXNpb24pKTtcblxuICAgICAgICAgIHBhaXIgPSAodG9TdHJpbmcodmFsdWUpICsgJ2UnKS5zcGxpdCgnZScpO1xuICAgICAgICAgIHJldHVybiArKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gLSBwcmVjaXNpb24pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuYyhudW1iZXIpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAgICAgKi9cbiAgICB2YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLnRvUGFpcnNgIG9yIGBfLnRvUGFpcnNJbmAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFpcnMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlVG9QYWlycyhrZXlzRnVuYykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgdGFnID0gZ2V0VGFnKG9iamVjdCk7XG4gICAgICAgIGlmICh0YWcgPT0gbWFwVGFnKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcFRvQXJyYXkob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnID09IHNldFRhZykge1xuICAgICAgICAgIHJldHVybiBzZXRUb1BhaXJzKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VUb1BhaXJzKG9iamVjdCwga2V5c0Z1bmMob2JqZWN0KSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAgICAgKiBgdGhpc2AgYmluZGluZyBhbmQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgICAxIC0gYF8uYmluZGBcbiAgICAgKiAgICAyIC0gYF8uYmluZEtleWBcbiAgICAgKiAgICA0IC0gYF8uY3VycnlgIG9yIGBfLmN1cnJ5UmlnaHRgIG9mIGEgYm91bmQgZnVuY3Rpb25cbiAgICAgKiAgICA4IC0gYF8uY3VycnlgXG4gICAgICogICAxNiAtIGBfLmN1cnJ5UmlnaHRgXG4gICAgICogICAzMiAtIGBfLnBhcnRpYWxgXG4gICAgICogICA2NCAtIGBfLnBhcnRpYWxSaWdodGBcbiAgICAgKiAgMTI4IC0gYF8ucmVhcmdgXG4gICAgICogIDI1NiAtIGBfLmFyeWBcbiAgICAgKiAgNTEyIC0gYF8uZmxpcGBcbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgICAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gICAgICBhcml0eSA9IGFyaXR5ID09PSB1bmRlZmluZWQgPyBhcml0eSA6IHRvSW50ZWdlcihhcml0eSk7XG4gICAgICBsZW5ndGggLT0gaG9sZGVycyA/IGhvbGRlcnMubGVuZ3RoIDogMDtcblxuICAgICAgaWYgKGJpdG1hc2sgJiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRykge1xuICAgICAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICAgICAgaG9sZGVyc1JpZ2h0ID0gaG9sZGVycztcblxuICAgICAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB2YXIgZGF0YSA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGdldERhdGEoZnVuYyk7XG5cbiAgICAgIHZhciBuZXdEYXRhID0gW1xuICAgICAgICBmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LFxuICAgICAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgICAgIF07XG5cbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIG1lcmdlRGF0YShuZXdEYXRhLCBkYXRhKTtcbiAgICAgIH1cbiAgICAgIGZ1bmMgPSBuZXdEYXRhWzBdO1xuICAgICAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gICAgICB0aGlzQXJnID0gbmV3RGF0YVsyXTtcbiAgICAgIHBhcnRpYWxzID0gbmV3RGF0YVszXTtcbiAgICAgIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICAgICAgYXJpdHkgPSBuZXdEYXRhWzldID0gbmV3RGF0YVs5XSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gKGlzQmluZEtleSA/IDAgOiBmdW5jLmxlbmd0aClcbiAgICAgICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgICAgIGlmICghYXJpdHkgJiYgYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO1xuICAgICAgfVxuICAgICAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gICAgICB9IGVsc2UgaWYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgICAgIH0gZWxzZSBpZiAoKGJpdG1hc2sgPT0gV1JBUF9QQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRykpICYmICFob2xkZXJzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZC5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgdmFyIHNldHRlciA9IGRhdGEgPyBiYXNlU2V0RGF0YSA6IHNldERhdGE7XG4gICAgICByZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHNldHRlcihyZXN1bHQsIG5ld0RhdGEpLCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzYCB0byBjdXN0b21pemUgaXRzIGBfLmFzc2lnbkluYCB1c2UgdG8gYXNzaWduIHByb3BlcnRpZXNcbiAgICAgKiBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllc1xuICAgICAqIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEob2JqVmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgcmV0dXJuIHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNEZWVwYCB0byBjdXN0b21pemUgaXRzIGBfLm1lcmdlYCB1c2UgdG8gbWVyZ2Ugc291cmNlXG4gICAgICogb2JqZWN0cyBpbnRvIGRlc3RpbmF0aW9uIG9iamVjdHMgdGhhdCBhcmUgcGFzc2VkIHRocnUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBzcmNWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qob2JqVmFsdWUpICYmIGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBvYmpWYWx1ZSk7XG4gICAgICAgIGJhc2VNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSwgc3RhY2spO1xuICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gICAgICogb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21PbWl0Q2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgYXJyYXlzIHdpdGggc3VwcG9ydCBmb3JcbiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYGFycmF5YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhlci5sZW5ndGg7XG5cbiAgICAgIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgaWYgKHN0YWNrZWQgJiYgc3RhY2suZ2V0KG90aGVyKSkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICAgICAgc2VlbiA9IChiaXRtYXNrICYgQ09NUEFSRV9VTk9SREVSRURfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHN0YWNrLnNldChhcnJheSwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgICAgIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICghY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8XG4gICAgICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gICAgICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBjYXNlIGJvb2xUYWc6XG4gICAgICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgICAgICBjYXNlIG1hcFRhZzpcbiAgICAgICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgICAgIG9ialByb3BzID0gZ2V0QWxsS2V5cyhvYmplY3QpLFxuICAgICAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcblxuICAgICAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmQodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICovXG4gICAgdmFyIGZpbmQgPSBjcmVhdGVGaW5kKGZpbmRJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1jb2xsZWN0aW9uLmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5maW5kTGFzdChbMSwgMiwgMywgNF0sIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAxO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICB2YXIgZmluZExhc3QgPSBjcmVhdGVGaW5kKGZpbmRMYXN0SW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZsYXR0ZW5lZCBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gXG4gICAgICogdGhydSBgaXRlcmF0ZWVgIGFuZCBmbGF0dGVuaW5nIHRoZSBtYXBwZWQgcmVzdWx0cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICAgICAqICAgcmV0dXJuIFtuLCBuXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICAgICAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwRGVlcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpLCBJTkZJTklUWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cyB1cCB0byBgZGVwdGhgIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikge1xuICAgICAqICAgcmV0dXJuIFtbW24sIG5dXV07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwRGVwdGgoWzEsIDJdLCBkdXBsaWNhdGUsIDIpO1xuICAgICAqIC8vID0+IFtbMSwgMV0sIFsyLCAyXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVwdGgoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGRlcHRoKSB7XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpLCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICAgICAqIG9yIGBfLmZvck93bmAgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZWFjaFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAxYCB0aGVuIGAyYC5cbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaCh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoIDogYmFzZUVhY2g7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yRWFjaGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAYWxpYXMgZWFjaFJpZ2h0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mb3JFYWNoUmlnaHQoWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDJgIHRoZW4gYDFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2hSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoUmlnaHQgOiBiYXNlRWFjaFJpZ2h0O1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIG9yZGVyIG9mIGdyb3VwZWQgdmFsdWVzXG4gICAgICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiBgY29sbGVjdGlvbmAuIFRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogdmFsdWUgb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlXG4gICAgICoga2V5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ncm91cEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuM10gfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ncm91cEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IFsnb25lJywgJ3R3byddLCAnNSc6IFsndGhyZWUnXSB9XG4gICAgICovXG4gICAgdmFyIGdyb3VwQnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBbdmFsdWVdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIGBjb2xsZWN0aW9uYC4gSWYgYGNvbGxlY3Rpb25gIGlzIGEgc3RyaW5nLCBpdCdzXG4gICAgICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBpcyB1c2VkIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhc1xuICAgICAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKHsgJ2EnOiAxLCAnYic6IDIgfSwgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcygnYWJjZCcsICdiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4LCBndWFyZCkge1xuICAgICAgY29sbGVjdGlvbiA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbiA6IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICAgICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbilcbiAgICAgICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICAgICAgOiAoISFsZW5ndGggJiYgYmFzZUluZGV4T2YoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCkgPiAtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLCByZXR1cm5pbmdcbiAgICAgKiBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGludm9rZWQgbWV0aG9kLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICAgKiBhcmUgcHJvdmlkZWQgdG8gZWFjaCBpbnZva2VkIG1ldGhvZC4gSWYgYHBhdGhgIGlzIGEgZnVuY3Rpb24sIGl0J3MgaW52b2tlZFxuICAgICAqIGZvciwgYW5kIGB0aGlzYCBib3VuZCB0bywgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb258c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIG9yXG4gICAgICogIHRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgZWFjaCBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFtbNSwgMSwgN10sIFszLCAyLCAxXV0sICdzb3J0Jyk7XG4gICAgICogLy8gPT4gW1sxLCA1LCA3XSwgWzEsIDIsIDNdXVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoWzEyMywgNDU2XSwgU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwgJycpO1xuICAgICAqIC8vID0+IFtbJzEnLCAnMicsICczJ10sIFsnNCcsICc1JywgJzYnXV1cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlTWFwID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgcGF0aCwgYXJncykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaXNGdW5jID0gdHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpc0Z1bmMgPyBhcHBseShwYXRoLCB2YWx1ZSwgYXJncykgOiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBsYXN0IGVsZW1lbnQgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGtleS4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1xuICAgICAqICAgeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sXG4gICAgICogICB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksIGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG8uY29kZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAnZCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgJ2RpcicpO1xuICAgICAqIC8vID0+IHsgJ2xlZnQnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ3JpZ2h0JzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICovXG4gICAgdmFyIGtleUJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnVcbiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gICAgICogYGZpbGxgLCBgaW52ZXJ0YCwgYHBhcnNlSW50YCwgYHJhbmRvbWAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlcGVhdGAsXG4gICAgICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICAgICAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF1cbiAgICAgKlxuICAgICAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheU1hcCA6IGJhc2VNYXA7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydEJ5YCBleGNlcHQgdGhhdCBpdCBhbGxvd3Mgc3BlY2lmeWluZyB0aGUgc29ydFxuICAgICAqIG9yZGVycyBvZiB0aGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzXG4gICAgICogYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSwgc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3JcbiAgICAgKiBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheVtdfEZ1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29yZGVyc10gVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFNvcnQgYnkgYHVzZXJgIGluIGFzY2VuZGluZyBvcmRlciBhbmQgYnkgYGFnZWAgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBfLm9yZGVyQnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSwgWydhc2MnLCAnZGVzYyddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDQwXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzLCBndWFyZCkge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkoaXRlcmF0ZWVzKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBpdGVyYXRlZXMgPT0gbnVsbCA/IFtdIDogW2l0ZXJhdGVlc107XG4gICAgICB9XG4gICAgICBvcmRlcnMgPSBndWFyZCA/IHVuZGVmaW5lZCA6IG9yZGVycztcbiAgICAgIGlmICghaXNBcnJheShvcmRlcnMpKSB7XG4gICAgICAgIG9yZGVycyA9IG9yZGVycyA9PSBudWxsID8gW10gOiBbb3JkZXJzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cyBzcGxpdCBpbnRvIHR3byBncm91cHMsIHRoZSBmaXJzdCBvZiB3aGljaFxuICAgICAqIGNvbnRhaW5zIGVsZW1lbnRzIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciwgdGhlIHNlY29uZCBvZiB3aGljaFxuICAgICAqIGNvbnRhaW5zIGVsZW1lbnRzIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5IGZvci4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2ZyZWQnXSwgWydiYXJuZXknLCAncGViYmxlcyddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ3BlYmJsZXMnXSwgWydiYXJuZXknLCAnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgJ3BlYmJsZXMnXSwgWydmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2ZyZWQnXSwgWydiYXJuZXknLCAncGViYmxlcyddXVxuICAgICAqL1xuICAgIHZhciBwYXJ0aXRpb24gPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0W2tleSA/IDAgOiAxXS5wdXNoKHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbigpIHsgcmV0dXJuIFtbXSwgW11dOyB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlZHVjZXMgYGNvbGxlY3Rpb25gIHRvIGEgdmFsdWUgd2hpY2ggaXMgdGhlIGFjY3VtdWxhdGVkIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICAgICAqIGludm9jYXRpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuIElmIGBhY2N1bXVsYXRvcmBcbiAgICAgKiBpcyBub3QgZ2l2ZW4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCBpcyB1c2VkIGFzIHRoZSBpbml0aWFsXG4gICAgICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gICAgICogKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLnJlZHVjZWAsIGBfLnJlZHVjZVJpZ2h0YCwgYW5kIGBfLnRyYW5zZm9ybWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXNzaWduYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBpbmNsdWRlc2AsIGBtZXJnZWAsIGBvcmRlckJ5YCxcbiAgICAgKiBhbmQgYHNvcnRCeWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gICAgICogICByZXR1cm4gc3VtICsgbjtcbiAgICAgKiB9LCAwKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgKiB9LCB7fSk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgICAgICBpbml0QWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcblxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBiYXNlRWFjaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yZWR1Y2VgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtbMCwgMV0sIFsyLCAzXSwgWzQsIDVdXTtcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlUmlnaHQoYXJyYXksIGZ1bmN0aW9uKGZsYXR0ZW5lZCwgb3RoZXIpIHtcbiAgICAgKiAgIHJldHVybiBmbGF0dGVuZWQuY29uY2F0KG90aGVyKTtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDUsIDIsIDMsIDAsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZVJpZ2h0IDogYmFzZVJlZHVjZSxcbiAgICAgICAgICBpbml0QWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMztcblxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBiYXNlRWFjaFJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uZmlsdGVyYDsgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gXG4gICAgICogdGhhdCBgcHJlZGljYXRlYCBkb2VzICoqbm90KiogcmV0dXJuIHRydXRoeSBmb3IuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLmZpbHRlclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnJlamVjdCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnJlamVjdCh1c2VycywgeyAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnJlamVjdCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnJlamVjdCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSByYW5kb20gZWxlbWVudCBmcm9tIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2FtcGxlIDogYmFzZVNhbXBsZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYG5gIHJhbmRvbSBlbGVtZW50cyBhdCB1bmlxdWUga2V5cyBmcm9tIGBjb2xsZWN0aW9uYCB1cCB0byB0aGVcbiAgICAgKiBzaXplIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMywgMV1cbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDQpO1xuICAgICAqIC8vID0+IFsyLCAzLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZVNpemUoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2FtcGxlU2l6ZSA6IGJhc2VTYW1wbGVTaXplO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBzaHVmZmxlZCB2YWx1ZXMsIHVzaW5nIGEgdmVyc2lvbiBvZiB0aGVcbiAgICAgKiBbRmlzaGVyLVlhdGVzIHNodWZmbGVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlci1ZYXRlc19zaHVmZmxlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zaHVmZmxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gWzQsIDEsIDMsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNodWZmbGUgOiBiYXNlU2h1ZmZsZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgYGNvbGxlY3Rpb25gIGJ5IHJldHVybmluZyBpdHMgbGVuZ3RoIGZvciBhcnJheS1saWtlXG4gICAgICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbGxlY3Rpb24gc2l6ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zaXplKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5zaXplKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5zaXplKCdwZWJibGVzJyk7XG4gICAgICogLy8gPT4gN1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbikge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKGNvbGxlY3Rpb24pO1xuICAgICAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5zaXplO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYW55KiogZWxlbWVudCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTb21lIDogYmFzZVNvbWU7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICAgICAqIHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB0aHJ1IGVhY2ggaXRlcmF0ZWUuIFRoaXMgbWV0aG9kXG4gICAgICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gICAgICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFtmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXI7IH1dKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDQwXV1cbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDQwXSwgWydmcmVkJywgNDhdXVxuICAgICAqL1xuICAgIHZhciBzb3J0QnkgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZXMpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoID4gMSAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW107XG4gICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW2l0ZXJhdGVlc1swXV07XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xuICAgIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gICAgICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgRGF0ZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICAgICAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAgICAgKiB9LCBfLm5vdygpKTtcbiAgICAgKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICAgICAqL1xuICAgIHZhciBub3cgPSBjdHhOb3cgfHwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xuICAgIH07XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uYmVmb3JlYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIGBmdW5jYCBvbmNlIGl0J3MgY2FsbGVkIGBuYCBvciBtb3JlIHRpbWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBiZWZvcmUgYGZ1bmNgIGlzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNhdmVzID0gWydwcm9maWxlJywgJ3NldHRpbmdzJ107XG4gICAgICpcbiAgICAgKiB2YXIgZG9uZSA9IF8uYWZ0ZXIoc2F2ZXMubGVuZ3RoLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdkb25lIHNhdmluZyEnKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChzYXZlcywgZnVuY3Rpb24odHlwZSkge1xuICAgICAqICAgYXN5bmNTYXZlKHsgJ3R5cGUnOiB0eXBlLCAnY29tcGxldGUnOiBkb25lIH0pO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2RvbmUgc2F2aW5nIScgYWZ0ZXIgdGhlIHR3byBhc3luYyBzYXZlcyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZnRlcihuLCBmdW5jKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uIDwgMSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdXAgdG8gYG5gIGFyZ3VtZW50cyxcbiAgICAgKiBpZ25vcmluZyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBjYXAuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8uYXJ5KHBhcnNlSW50LCAxKSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFyeShmdW5jLCBuLCBndWFyZCkge1xuICAgICAgbiA9IGd1YXJkID8gdW5kZWZpbmVkIDogbjtcbiAgICAgIG4gPSAoZnVuYyAmJiBuID09IG51bGwpID8gZnVuYy5sZW5ndGggOiBuO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9BUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50c1xuICAgICAqIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGlsZSBpdCdzIGNhbGxlZCBsZXNzIHRoYW4gYG5gIHRpbWVzLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5iZWZvcmUoNSwgYWRkQ29udGFjdFRvTGlzdCkpO1xuICAgICAqIC8vID0+IEFsbG93cyBhZGRpbmcgdXAgdG8gNCBjb250YWN0cyB0byB0aGUgbGlzdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiZWZvcmUobiwgZnVuYykge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPiAwKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuIDw9IDEpIHtcbiAgICAgICAgICBmdW5jID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYFxuICAgICAqIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhlIGBfLmJpbmQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYyBidWlsZHMsXG4gICAgICogbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBuYXRpdmUgYEZ1bmN0aW9uI2JpbmRgLCB0aGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZChncmVldCwgb2JqZWN0LCAnaGknKTtcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIEJvdW5kIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZChncmVldCwgb2JqZWN0LCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZCkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBvYmplY3Rba2V5XWAgd2l0aCBgcGFydGlhbHNgXG4gICAgICogcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gYF8uYmluZGAgYnkgYWxsb3dpbmcgYm91bmQgZnVuY3Rpb25zIHRvIHJlZmVyZW5jZVxuICAgICAqIG1ldGhvZHMgdGhhdCBtYXkgYmUgcmVkZWZpbmVkIG9yIGRvbid0IHlldCBleGlzdC4gU2VlXG4gICAgICogW1BldGVyIE1pY2hhdXgncyBhcnRpY2xlXShodHRwOi8vcGV0ZXIubWljaGF1eC5jYS9hcnRpY2xlcy9sYXp5LWZ1bmN0aW9uLWRlZmluaXRpb24tcGF0dGVybilcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogVGhlIGBfLmJpbmRLZXkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICd1c2VyJzogJ2ZyZWQnLFxuICAgICAqICAgJ2dyZWV0JzogZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCAnaGknKTtcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgKlxuICAgICAqIG9iamVjdC5ncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJ3lhICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIEJvdW5kIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmRLZXkgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGtleSwgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kS2V5KSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChrZXksIGJpdG1hc2ssIG9iamVjdCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhcmd1bWVudHMgb2YgYGZ1bmNgIGFuZCBlaXRoZXIgaW52b2tlc1xuICAgICAqIGBmdW5jYCByZXR1cm5pbmcgaXRzIHJlc3VsdCwgaWYgYXQgbGVhc3QgYGFyaXR5YCBudW1iZXIgb2YgYXJndW1lbnRzIGhhdmVcbiAgICAgKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gICAgICogYXJndW1lbnRzLCBhbmQgc28gb24uIFRoZSBhcml0eSBvZiBgZnVuY2AgbWF5IGJlIHNwZWNpZmllZCBpZiBgZnVuYy5sZW5ndGhgXG4gICAgICogaXMgbm90IHN1ZmZpY2llbnQuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uY3VycnkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYyBidWlsZHMsXG4gICAgICogbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnkoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSkoMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgxKShfLCAzKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeShmdW5jLCBhcml0eSwgZ3VhcmQpIHtcbiAgICAgIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQ1VSUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmN1cnJ5YCBleGNlcHQgdGhhdCBhcmd1bWVudHMgYXJlIGFwcGxpZWQgdG8gYGZ1bmNgXG4gICAgICogaW4gdGhlIG1hbm5lciBvZiBgXy5wYXJ0aWFsUmlnaHRgIGluc3RlYWQgb2YgYF8ucGFydGlhbGAuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uY3VycnlSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeVJpZ2h0KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDMpKDIpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgyLCAzKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMykoMSwgXykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnlSaWdodChmdW5jLCBhcml0eSwgZ3VhcmQpIHtcbiAgICAgIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQ1VSUllfUklHSFRfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICAgICAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICAgICAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAgICAgKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAgICAgKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAgICAgKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gICAgICogaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gICAgICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAgICAgKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAgICAgKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gICAgICogfSkpO1xuICAgICAqXG4gICAgICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAgICAgKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAgICAgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gICAgICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICAgICAqXG4gICAgICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGFzdEFyZ3MsXG4gICAgICAgICAgbGFzdFRoaXMsXG4gICAgICAgICAgbWF4V2FpdCxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgdGltZXJJZCxcbiAgICAgICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICAgICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgICAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgICAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgICAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgICAgIHRpbWVXYWl0aW5nID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgICAgIHJldHVybiBtYXhpbmdcbiAgICAgICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICAgICAgOiB0aW1lV2FpdGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAgICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAgICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAgICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgICAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICAgICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgICAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICAgICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgICAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgICAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgICAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gICAgICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgICAgIHJldHVybiBkZWJvdW5jZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmZXJzIGludm9raW5nIHRoZSBgZnVuY2AgdW50aWwgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMgY2xlYXJlZC4gQW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlZmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAqIH0sICdkZWZlcnJlZCcpO1xuICAgICAqIC8vID0+IExvZ3MgJ2RlZmVycmVkJyBhZnRlciBvbmUgbWlsbGlzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlZmVyID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCAxLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgYGZ1bmNgIGFmdGVyIGB3YWl0YCBtaWxsaXNlY29uZHMuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlbGF5KGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAqIH0sIDEwMDAsICdsYXRlcicpO1xuICAgICAqIC8vID0+IExvZ3MgJ2xhdGVyJyBhZnRlciBvbmUgc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWxheSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgdG9OdW1iZXIod2FpdCkgfHwgMCwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyByZXZlcnNlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZsaXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbGlwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZmxpcHBlZCA9IF8uZmxpcChmdW5jdGlvbigpIHtcbiAgICAgKiAgIHJldHVybiBfLnRvQXJyYXkoYXJndW1lbnRzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGZsaXBwZWQoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiBbJ2QnLCAnYycsICdiJywgJ2EnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsaXAoZnVuYykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9GTElQX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gICAgICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICAgICAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gICAgICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gICAgICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAgICAgKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICAgICAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gICAgICpcbiAgICAgKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHZhbHVlcyhvdGhlcik7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICpcbiAgICAgKiBvYmplY3QuYSA9IDI7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAgICAgKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqXG4gICAgICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAgICAgKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICAgICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxuICAgIG1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGBmdW5jYC4gVGhlXG4gICAgICogYGZ1bmNgIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgcHJlZGljYXRlIHRvIG5lZ2F0ZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBuZWdhdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0V2ZW4obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5maWx0ZXIoWzEsIDIsIDMsIDQsIDUsIDZdLCBfLm5lZ2F0ZShpc0V2ZW4pKTtcbiAgICAgKiAvLyA9PiBbMSwgMywgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKSB7XG4gICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcyk7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0pO1xuICAgICAgICAgIGNhc2UgMjogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICAgICAqIHRvIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnZvY2F0aW9uLiBUaGUgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiZWZvcmUoMiwgZnVuYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnRzIHRyYW5zZm9ybWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3RyYW5zZm9ybXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgYXJndW1lbnQgdHJhbnNmb3Jtcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZG91YmxlZChuKSB7XG4gICAgICogICByZXR1cm4gbiAqIDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckFyZ3MoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIFt4LCB5XTtcbiAgICAgKiB9LCBbc3F1YXJlLCBkb3VibGVkXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDksIDMpO1xuICAgICAqIC8vID0+IFs4MSwgNl1cbiAgICAgKlxuICAgICAqIGZ1bmMoMTAsIDUpO1xuICAgICAqIC8vID0+IFsxMDAsIDEwXVxuICAgICAqL1xuICAgIHZhciBvdmVyQXJncyA9IGNhc3RSZXN0KGZ1bmN0aW9uKGZ1bmMsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHRyYW5zZm9ybXMgPSAodHJhbnNmb3Jtcy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHRyYW5zZm9ybXNbMF0pKVxuICAgICAgICA/IGFycmF5TWFwKHRyYW5zZm9ybXNbMF0sIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSlcbiAgICAgICAgOiBhcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLCAxKSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcblxuICAgICAgdmFyIGZ1bmNzTGVuZ3RoID0gdHJhbnNmb3Jtcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihhcmdzLmxlbmd0aCwgZnVuY3NMZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSB0cmFuc2Zvcm1zW2luZGV4XS5jYWxsKHRoaXMsIGFyZ3NbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlXG4gICAgICogYXJndW1lbnRzIGl0IHJlY2VpdmVzLiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmJpbmRgIGV4Y2VwdCBpdCBkb2VzICoqbm90KipcbiAgICAgKiBhbHRlciB0aGUgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbChncmVldCwgJ2hlbGxvJyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbChncmVldCwgXywgJ2ZyZWQnKTtcbiAgICAgKiBncmVldEZyZWQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQnXG4gICAgICovXG4gICAgdmFyIHBhcnRpYWwgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWwpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFydGlhbGAgZXhjZXB0IHRoYXQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzXG4gICAgICogYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbFJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2ZyZWQnKTtcbiAgICAgKiBncmVldEZyZWQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgc2F5SGVsbG9UbyA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnaGVsbG8nLCBfKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICovXG4gICAgdmFyIHBhcnRpYWxSaWdodCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbFJpZ2h0KSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGFyZ3VtZW50cyBhcnJhbmdlZCBhY2NvcmRpbmdcbiAgICAgKiB0byB0aGUgc3BlY2lmaWVkIGBpbmRleGVzYCB3aGVyZSB0aGUgYXJndW1lbnQgdmFsdWUgYXQgdGhlIGZpcnN0IGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCB0aGUgYXJndW1lbnQgdmFsdWUgYXQgdGhlIHNlY29uZCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlYXJyYW5nZSBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFyZ3VtZW50IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciByZWFyZ2VkID0gXy5yZWFyZyhmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH0sIFsyLCAwLCAxXSk7XG4gICAgICpcbiAgICAgKiByZWFyZ2VkKCdiJywgJ2MnLCAnYScpXG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgdmFyIHJlYXJnID0gZmxhdFJlc3QoZnVuY3Rpb24oZnVuYywgaW5kZXhlcykge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9SRUFSR19GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBpbmRleGVzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gYW5kIGFyZ3VtZW50cyBmcm9tIGBzdGFydGAgYW5kIGJleW9uZCBwcm92aWRlZCBhc1xuICAgICAqIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtyZXN0IHBhcmFtZXRlcl0oaHR0cHM6Ly9tZG4uaW8vcmVzdF9wYXJhbWV0ZXJzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F5ID0gXy5yZXN0KGZ1bmN0aW9uKHdoYXQsIG5hbWVzKSB7XG4gICAgICogICByZXR1cm4gd2hhdCArICcgJyArIF8uaW5pdGlhbChuYW1lcykuam9pbignLCAnKSArXG4gICAgICogICAgIChfLnNpemUobmFtZXMpID4gMSA/ICcsICYgJyA6ICcnKSArIF8ubGFzdChuYW1lcyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoJ2hlbGxvJywgJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGUgZnVuY3Rpb24gYW5kIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBtdWNoIGxpa2VcbiAgICAgKiBbYEZ1bmN0aW9uI2FwcGx5YF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3NwcmVhZCBvcGVyYXRvcl0oaHR0cHM6Ly9tZG4uaW8vc3ByZWFkX29wZXJhdG9yKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHNwcmVhZCBhcmd1bWVudHMgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgc3ByZWFkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F5ID0gXy5zcHJlYWQoZnVuY3Rpb24od2hvLCB3aGF0KSB7XG4gICAgICogICByZXR1cm4gd2hvICsgJyBzYXlzICcgKyB3aGF0O1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KFsnZnJlZCcsICdoZWxsbyddKTtcbiAgICAgKiAvLyA9PiAnZnJlZCBzYXlzIGhlbGxvJ1xuICAgICAqXG4gICAgICogdmFyIG51bWJlcnMgPSBQcm9taXNlLmFsbChbXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoNDApLFxuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDM2KVxuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogbnVtYmVycy50aGVuKF8uc3ByZWFkKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiB4ICsgeTtcbiAgICAgKiB9KSk7XG4gICAgICogLy8gPT4gYSBQcm9taXNlIG9mIDc2XG4gICAgICovXG4gICAgZnVuY3Rpb24gc3ByZWFkKGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogbmF0aXZlTWF4KHRvSW50ZWdlcihzdGFydCksIDApO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJnc1tzdGFydF0sXG4gICAgICAgICAgICBvdGhlckFyZ3MgPSBjYXN0U2xpY2UoYXJncywgMCwgc3RhcnQpO1xuXG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIGFycmF5UHVzaChvdGhlckFyZ3MsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgYGZ1bmNgIGF0IG1vc3Qgb25jZSBwZXJcbiAgICAgKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICAgICAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAgICAgKiBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4gUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2BcbiAgICAgKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gICAgICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICAgICAqIHRocm90dGxlZCBmdW5jdGlvbi4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHJldHVybiB0aGVcbiAgICAgKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZy5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHJlbmV3VG9rZW5gIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBidXQgbm90IG1vcmUgdGhhbiBvbmNlIGV2ZXJ5IDUgbWludXRlcy5cbiAgICAgKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICAgICAnbGVhZGluZyc6IGxlYWRpbmcsXG4gICAgICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAgICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdXAgdG8gb25lIGFyZ3VtZW50LCBpZ25vcmluZyBhbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy51bmFyeShwYXJzZUludCkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmFyeShmdW5jKSB7XG4gICAgICByZXR1cm4gYXJ5KGZ1bmMsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGB2YWx1ZWAgdG8gYHdyYXBwZXJgIGFzIGl0cyBmaXJzdFxuICAgICAqIGFyZ3VtZW50LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uIGFyZSBhcHBlbmRlZFxuICAgICAqIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBgd3JhcHBlcmAuIFRoZSB3cmFwcGVyIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3dyYXBwZXI9aWRlbnRpdHldIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcCA9IF8ud3JhcChfLmVzY2FwZSwgZnVuY3Rpb24oZnVuYywgdGV4dCkge1xuICAgICAqICAgcmV0dXJuICc8cD4nICsgZnVuYyh0ZXh0KSArICc8L3A+JztcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHAoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJzxwPmZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlczwvcD4nXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgd3JhcHBlcikge1xuICAgICAgcmV0dXJuIHBhcnRpYWwoY2FzdEZ1bmN0aW9uKHdyYXBwZXIpLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCBhcyBhbiBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtudWxsXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkodW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqIGNvbnNvbGUubG9nKF8uY2FzdEFycmF5KGFycmF5KSA9PT0gYXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXkoKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzWzBdO1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKVxuICAgICAqIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcyxcbiAgICAgKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAgICAgKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZFxuICAgICAqIGFzIHBsYWluIG9iamVjdHMuIEFuIGVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdW5jbG9uZWFibGUgdmFsdWVzIHN1Y2hcbiAgICAgKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZURlZXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gICAgICpcbiAgICAgKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coc2hhbGxvd1swXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBjbG9uZWQgdmFsdWUuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLFxuICAgICAqIGNsb25pbmcgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdXAgdG8gZm91ciBhcmd1bWVudHM7ICh2YWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZURlZXBXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZShmYWxzZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGVsID0gXy5jbG9uZVdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gICAgICpcbiAgICAgKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVXaXRoYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGVsID0gXy5jbG9uZURlZXBXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBvYmplY3RgIGNvbmZvcm1zIHRvIGBzb3VyY2VgIGJ5IGludm9raW5nIHRoZSBwcmVkaWNhdGVcbiAgICAgKiBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAyOyB9IH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZSA9PSBudWxsIHx8IGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBrZXlzKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZXEoJ2EnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZXEoTmFOLCBOYU4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmd0KDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ndGUoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndGUoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3RlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAgICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5QnVmZmVyYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5QnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FycmF5QnVmZmVyID0gbm9kZUlzQXJyYXlCdWZmZXIgPyBiYXNlVW5hcnkobm9kZUlzQXJyYXlCdWZmZXIpIDogYmFzZUlzQXJyYXlCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gICAgICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICAgICAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAgICAgKiBpcyBhbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYm9vbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYERhdGVgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZShuZXcgRGF0ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUoJ01vbiBBcHJpbCAyMyAyMDEyJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNEYXRlID0gbm9kZUlzRGF0ZSA/IGJhc2VVbmFyeShub2RlSXNEYXRlKSA6IGJhc2VJc0RhdGU7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBET00gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudChkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudCgnPGJvZHk+Jyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIHZhbHVlLm5vZGVUeXBlID09PSAxICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICAgICAqXG4gICAgICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gICAgICogcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICAgICAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAgICAgKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh0cnVlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlXG4gICAgICogZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBjb21wYXJpbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucyxcbiAgICAgKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gICAgICogc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkIGFycmF5cy4gYE9iamVjdGAgb2JqZWN0cyBhcmUgY29tcGFyZWRcbiAgICAgKiBieSB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRnVuY3Rpb25zIGFuZCBET01cbiAgICAgKiBub2RlcyBhcmUgY29tcGFyZWQgYnkgc3RyaWN0IGVxdWFsaXR5LCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbChvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBvYmplY3QgPT09IG90aGVyO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNFcXVhbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHVwIHRvXG4gICAgICogc2l4IGFyZ3VtZW50czogKG9ialZhbHVlLCBvdGhWYWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlKSB7XG4gICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhvdGhWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydoZWxsbycsICdnb29kYnllJ107XG4gICAgICogdmFyIG90aGVyID0gWydoaScsICdnb29kYnllJ107XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWxXaXRoKGFycmF5LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWxXaXRoKHZhbHVlLCBvdGhlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKHZhbHVlLCBvdGhlcikgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIHVuZGVmaW5lZCwgY3VzdG9taXplcikgOiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgRXJyb3JgLCBgRXZhbEVycm9yYCwgYFJhbmdlRXJyb3JgLCBgUmVmZXJlbmNlRXJyb3JgLFxuICAgICAqIGBTeW50YXhFcnJvcmAsIGBUeXBlRXJyb3JgLCBvciBgVVJJRXJyb3JgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gZXJyb3Igb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihuZXcgRXJyb3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihFcnJvcik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Vycm9yKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICAgICAgcmV0dXJuIHRhZyA9PSBlcnJvclRhZyB8fCB0YWcgPT0gZG9tRXhjVGFnIHx8XG4gICAgICAgICh0eXBlb2YgdmFsdWUubWVzc2FnZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUubmFtZSA9PSAnc3RyaW5nJyAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIHByaW1pdGl2ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0Zpbml0ZWBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0Zpbml0ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIG5hdGl2ZUlzRmluaXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKF8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgICAgIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICAgICAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICAgICAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzSW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PSB0b0ludGVnZXIodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAgICAgKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gICAgICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdCh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAgICAgKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgTWFwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGBvYmplY3RgIGFuZCBgc291cmNlYCB0b1xuICAgICAqIGRldGVybWluZSBpZiBgb2JqZWN0YCBjb250YWlucyBlcXVpdmFsZW50IHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLm1hdGNoZXNgIHdoZW4gYHNvdXJjZWAgaXNcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hdGNoKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzTWF0Y2hgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBmaXZlXG4gICAgICogYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBpbmRleHxrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhzcmNWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2dyZWV0aW5nJzogJ2hlbGxvJyB9O1xuICAgICAqIHZhciBzb3VyY2UgPSB7ICdncmVldGluZyc6ICdoaScgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYE5hTmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc05hTmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc05hTikgYW5kIGlzIG5vdCB0aGUgc2FtZSBhc1xuICAgICAqIGdsb2JhbCBbYGlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vaXNOYU4pIHdoaWNoIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtYmVyIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hTihOYU4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4obmV3IE51bWJlcihOYU4pKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBpc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7XG4gICAgICAvLyBBbiBgTmFOYCBwcmltaXRpdmUgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLlxuICAgICAgLy8gUGVyZm9ybSB0aGUgYHRvU3RyaW5nVGFnYCBjaGVjayBmaXJzdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBzb21lXG4gICAgICAvLyBBY3RpdmVYIG9iamVjdHMgaW4gSUUuXG4gICAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByaXN0aW5lIG5hdGl2ZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBjYW4ndCByZWxpYWJseSBkZXRlY3QgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgcHJlc2VuY2VcbiAgICAgKiBvZiB0aGUgY29yZS1qcyBwYWNrYWdlIGJlY2F1c2UgY29yZS1qcyBjaXJjdW12ZW50cyB0aGlzIGtpbmQgb2YgZGV0ZWN0aW9uLlxuICAgICAqIERlc3BpdGUgbXVsdGlwbGUgcmVxdWVzdHMsIHRoZSBjb3JlLWpzIG1haW50YWluZXIgaGFzIG1hZGUgaXQgY2xlYXI6IGFueVxuICAgICAqIGF0dGVtcHQgdG8gZml4IHRoZSBkZXRlY3Rpb24gd2lsbCBiZSBvYnN0cnVjdGVkLiBBcyBhIHJlc3VsdCwgd2UncmUgbGVmdFxuICAgICAqIHdpdGggbGl0dGxlIGNob2ljZSBidXQgdG8gdGhyb3cgYW4gZXJyb3IuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBhZmZlY3RzXG4gICAgICogcGFja2FnZXMsIGxpa2UgW2JhYmVsLXBvbHlmaWxsXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9iYWJlbC1wb2x5ZmlsbCksXG4gICAgICogd2hpY2ggcmVseSBvbiBjb3JlLWpzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmF0aXZlKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmF0aXZlKF8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmIChpc01hc2thYmxlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQ09SRV9FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYG51bGxgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdWxsKHZvaWQgMCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc051bGwodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG51bGxpc2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05pbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbChOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOaWwodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTnVtYmVyYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gICAgICogY2xhc3NpZmllZCBhcyBudW1iZXJzLCB1c2UgdGhlIGBfLmlzRmluaXRlYCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBudW1iZXJUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAgICAgKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC44LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gICAgICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICAgICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFJlZ0V4cGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzUmVnRXhwKC9hYmMvKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUmVnRXhwKCcvYWJjLycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzUmVnRXhwID0gbm9kZUlzUmVnRXhwID8gYmFzZVVuYXJ5KG5vZGVJc1JlZ0V4cCkgOiBiYXNlSXNSZWdFeHA7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlci4gQW4gaW50ZWdlciBpcyBzYWZlIGlmIGl0J3MgYW4gSUVFRS03NTRcbiAgICAgKiBkb3VibGUgcHJlY2lzaW9uIG51bWJlciB3aGljaCBpc24ndCB0aGUgcmVzdWx0IG9mIGEgcm91bmRlZCB1bnNhZmUgaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzU2FmZUludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNTYWZlSW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gLU1BWF9TQUZFX0lOVEVHRVIgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFNldGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygnYWJjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha01hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHdlYWsgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBXZWFrTWFwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgTWFwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSB3ZWFrTWFwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha1NldGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHdlYWsgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gd2Vha1NldFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubHQoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUx0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubHRlKDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHRlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHRlKDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPD0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoMSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcodmFsdWUpID8gc3RyaW5nVG9BcnJheSh2YWx1ZSkgOiBjb3B5QXJyYXkodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHN5bUl0ZXJhdG9yICYmIHZhbHVlW3N5bUl0ZXJhdG9yXSkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgIGZ1bmMgPSB0YWcgPT0gbWFwVGFnID8gbWFwVG9BcnJheSA6ICh0YWcgPT0gc2V0VGFnID8gc2V0VG9BcnJheSA6IHZhbHVlcyk7XG5cbiAgICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEyLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgICAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gICAgICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyIHN1aXRhYmxlIGZvciB1c2UgYXMgdGhlIGxlbmd0aCBvZiBhblxuICAgICAqIGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xlbmd0aCgzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b0xlbmd0aChJbmZpbml0eSk7XG4gICAgICogLy8gPT4gNDI5NDk2NzI5NVxuICAgICAqXG4gICAgICogXy50b0xlbmd0aCgnMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgMCwgTUFYX0FSUkFZX0xFTkdUSCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gSW5maW5pdHlcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgICAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgICAgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAgICAgKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICAgICAqIHJlcHJlc2VudGVkIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIC1NQVhfU0FGRV9JTlRFR0VSLCBNQVhfU0FGRV9JTlRFR0VSKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAgICAgKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKG51bGwpO1xuICAgICAqIC8vID0+ICcnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKC0wKTtcbiAgICAgKiAvLyA9PiAnLTAnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gJzEsMiwzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgIGFuZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBpZiAoaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25JbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRXaXRoXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25JbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXy5hdChvYmplY3QsIFsnYVswXS5iLmMnLCAnYVsxXSddKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgYXQgPSBmbGF0UmVzdChiYXNlQXQpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgcHJvdG90eXBlYCBvYmplY3QuIElmIGFcbiAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0IGlzIGdpdmVuLCBpdHMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXNcbiAgICAgKiBhcmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICAgICAqICAgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTtcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcyA9PSBudWxsID8gcmVzdWx0IDogYmFzZUFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAgICAgKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgICAgICB2YXIgcHJvcHNJbmRleCA9IC0xO1xuICAgICAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW3Byb3BzSW5kZXhdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kZWZhdWx0c2AgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgYXNzaWduc1xuICAgICAqIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0c0RlZXAoeyAnYSc6IHsgJ2InOiAyIH0gfSwgeyAnYSc6IHsgJ2InOiAxLCAnYyc6IDMgfSB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IDIsICdjJzogMyB9IH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHNEZWVwID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgYXJncy5wdXNoKHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSk7XG4gICAgICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiByZXR1cm5zICdwZWJibGVzJyBhc3N1bWluZyBgXy5maW5kS2V5YCByZXR1cm5zICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW5cbiAgICAgKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3Iob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW5SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2MnLCAnYicsIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvckluYCBsb2dzICdhJywgJ2InLCB0aGVuICdjJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3JSaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmRcbiAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd24ob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdiJyB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIHRoZW4gJ2InLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93blJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgICAqIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc0luXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGFuZCBpbmhlcml0ZWRcbiAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gICAgICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gICAgICogcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnQob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9XG4gICAgICovXG4gICAgdmFyIGludmVydCA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRbdmFsdWVdID0ga2V5O1xuICAgIH0sIGNvbnN0YW50KGlkZW50aXR5KSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludmVydGAgZXhjZXB0IHRoYXQgdGhlIGludmVydGVkIG9iamVjdCBpcyBnZW5lcmF0ZWRcbiAgICAgKiBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogY29ycmVzcG9uZGluZyBpbnZlcnRlZCB2YWx1ZSBvZiBlYWNoIGludmVydGVkIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzXG4gICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGludmVydGVkIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAnZ3JvdXAnICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnZ3JvdXAxJzogWydhJywgJ2MnXSwgJ2dyb3VwMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0QnkgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gW2tleV07XG4gICAgICB9XG4gICAgfSwgZ2V0SXRlcmF0ZWUpO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IFsxLCAyLCAzLCA0XSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmludm9rZShvYmplY3QsICdhWzBdLmIuYy5zbGljZScsIDEsIDMpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIHZhciBpbnZva2UgPSBiYXNlUmVzdChiYXNlSW52b2tlKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAgICAgKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5cyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLmtleXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1hcFZhbHVlc2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAgICogc2FtZSB2YWx1ZXMgYXMgYG9iamVjdGAgYW5kIGtleXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZVxuICAgICAqIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcFZhbHVlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcEtleXMoeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICByZXR1cm4ga2V5ICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYTEnOiAxLCAnYjInOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBLZXlzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAgICAgKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBLZXlzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICAgICAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICAgICAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gICAgICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gICAgICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIG90aGVyID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVyZ2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlXG4gICAgICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGVcbiAgICAgKiBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggc2l4IGFyZ3VtZW50czpcbiAgICAgKiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogWzFdLCAnYic6IFsyXSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiBbM10sICdiJzogWzRdIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlV2l0aChvYmplY3QsIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogWzEsIDNdLCAnYic6IFsyLCA0XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgcGF0aHMgb2YgYG9iamVjdGAgdGhhdCBhcmUgbm90IG9taXR0ZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IHNsb3dlciB0aGFuIGBfLnBpY2tgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gb21pdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdChvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIHZhciBvbWl0ID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaXNEZWVwID0gZmFsc2U7XG4gICAgICBwYXRocyA9IGFycmF5TWFwKHBhdGhzLCBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgICBpc0RlZXAgfHwgKGlzRGVlcCA9IHBhdGgubGVuZ3RoID4gMSk7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSk7XG4gICAgICBjb3B5T2JqZWN0KG9iamVjdCwgZ2V0QWxsS2V5c0luKG9iamVjdCksIHJlc3VsdCk7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJlc3VsdCA9IGJhc2VDbG9uZShyZXN1bHQsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX0ZMQVRfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9tT21pdENsb25lKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgYmFzZVVuc2V0KHJlc3VsdCwgcGF0aHNbbGVuZ3RoXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tCeWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mXG4gICAgICogdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYG9iamVjdGAgdGhhdFxuICAgICAqIGBwcmVkaWNhdGVgIGRvZXNuJ3QgcmV0dXJuIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3b1xuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9taXRCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHBpY2tCeShvYmplY3QsIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAgICAgKiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGlja0J5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGlja0J5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFtwcm9wXTtcbiAgICAgIH0pO1xuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlKTtcbiAgICAgIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwcmVkaWNhdGUodmFsdWUsIHBhdGhbMF0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhXG4gICAgICogZnVuY3Rpb24gaXQncyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGl0cyBwYXJlbnQgb2JqZWN0IGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYzEnOiAzLCAnYzInOiBfLmNvbnN0YW50KDQpIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMScpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMicpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCBfLmNvbnN0YW50KCdkZWZhdWx0JykpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3VsdChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGxvb3AgaXMgZW50ZXJlZCB3aGVuIHBhdGggaXMgZW1wdHkuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICBvYmplY3QgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IGlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUuY2FsbChvYmplY3QpIDogdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICAgICAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICAgICAqIGFyZSBjcmVhdGVkIGZvciBhbGwgb3RoZXIgbWlzc2luZyBwcm9wZXJ0aWVzLiBVc2UgYF8uc2V0V2l0aGAgdG8gY3VzdG9taXplXG4gICAgICogYHBhdGhgIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgWyd4JywgJzAnLCAneScsICd6J10sIDUpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnNldFdpdGgob2JqZWN0LCAnWzBdWzFdJywgJ2EnLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdpdGgob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGBcbiAgICAgKiB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXAgb3Igc2V0LCBpdHNcbiAgICAgKiBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlycyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzID0gY3JlYXRlVG9QYWlycyhrZXlzKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnNcbiAgICAgKiBmb3IgYG9iamVjdGAgd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwXG4gICAgICogb3Igc2V0LCBpdHMgZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc0luXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlyc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzSW4gPSBjcmVhdGVUb1BhaXJzKGtleXNJbik7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICAgICAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICAgICAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAgICAgKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICAgICAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgOV1cbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgICAgIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogNyB9IH1dIH07XG4gICAgICogXy51bnNldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udW5zZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdHJ1ZSA6IGJhc2VVbnNldChvYmplY3QsIHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBhY2NlcHRzIGB1cGRhdGVyYCB0byBwcm9kdWNlIHRoZVxuICAgICAqIHZhbHVlIHRvIHNldC4gVXNlIGBfLnVwZGF0ZVdpdGhgIHRvIGN1c3RvbWl6ZSBgcGF0aGAgY3JlYXRpb24uIFRoZSBgdXBkYXRlcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ2FbMF0uYi5jJywgZnVuY3Rpb24obikgeyByZXR1cm4gbiAqIG47IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gOVxuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAneFswXS55LnonLCBmdW5jdGlvbihuKSB7IHJldHVybiBuID8gbiArIDEgOiAwOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVwZGF0ZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlV2l0aChvYmplY3QsICdbMF1bMV0nLCBfLmNvbnN0YW50KCdhJyksIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlciksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKCdoaScpO1xuICAgICAqIC8vID0+IFsnaCcsICdpJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5XG4gICAgICogdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IC01XG4gICAgICpcbiAgICAgKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgICAgICB1cHBlciA9IHVwcGVyID09PSB1cHBlciA/IHVwcGVyIDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gdG9OdW1iZXIobG93ZXIpO1xuICAgICAgICBsb3dlciA9IGxvd2VyID09PSBsb3dlciA/IGxvd2VyIDogMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSwgbG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG5gIGlzIGJldHdlZW4gYHN0YXJ0YCBhbmQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gSWZcbiAgICAgKiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLCBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0XG4gICAgICogbmVnYXRpdmUgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLnJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDMsIDIsIDQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCA4KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgyLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDEuMiwgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDUuMiwgNCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgtMywgLTIsIC02KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgfVxuICAgICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICAgIHJldHVybiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICogSWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXJcbiAgICAgKiBpcyByZXR1cm5lZC4gSWYgYGZsb2F0aW5nYCBpcyBgdHJ1ZWAsIG9yIGVpdGhlciBgbG93ZXJgIG9yIGB1cHBlcmAgYXJlXG4gICAgICogZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyPTBdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3VwcGVyPTFdIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZ10gU3BlY2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obG93ZXIsIHVwcGVyLCBmbG9hdGluZykge1xuICAgICAgaWYgKGZsb2F0aW5nICYmIHR5cGVvZiBmbG9hdGluZyAhPSAnYm9vbGVhbicgJiYgaXNJdGVyYXRlZUNhbGwobG93ZXIsIHVwcGVyLCBmbG9hdGluZykpIHtcbiAgICAgICAgdXBwZXIgPSBmbG9hdGluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdXBwZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSB1cHBlcjtcbiAgICAgICAgICB1cHBlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG93ZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID09PSB1bmRlZmluZWQgJiYgdXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIHVwcGVyID0gMTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBsb3dlciA9IHRvRmluaXRlKGxvd2VyKTtcbiAgICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cHBlciA9IHRvRmluaXRlKHVwcGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgICAgdmFyIHRlbXAgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1cHBlcjtcbiAgICAgICAgdXBwZXIgPSB0ZW1wO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nIHx8IGxvd2VyICUgMSB8fCB1cHBlciAlIDEpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVSYW5kb20oKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihsb3dlciArIChyYW5kICogKHVwcGVyIC0gbG93ZXIgKyBmcmVlUGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArICcnKS5sZW5ndGggLSAxKSkpKSwgdXBwZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbY2FtZWwgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FtZWxDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhbWVsIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICovXG4gICAgdmFyIGNhbWVsQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyBjYXBpdGFsaXplKHdvcmQpIDogd29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UgYW5kIHRoZSByZW1haW5pbmdcbiAgICAgKiB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICAgICAgcmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWJ1cnJzIGBzdHJpbmdgIGJ5IGNvbnZlcnRpbmdcbiAgICAgKiBbTGF0aW4tMSBTdXBwbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbi0xX1N1cHBsZW1lbnRfKFVuaWNvZGVfYmxvY2spI0NoYXJhY3Rlcl90YWJsZSlcbiAgICAgKiBhbmQgW0xhdGluIEV4dGVuZGVkLUFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX0V4dGVuZGVkLUEpXG4gICAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzIGFuZCByZW1vdmluZ1xuICAgICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWJ1cnIoJ2TDqWrDoCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgICAgIHZhciBlbmQgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uIC09IHRhcmdldC5sZW5ndGg7XG4gICAgICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICAgICAqIFhTUyB2ZWN0b3JzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlUmVnRXhwKCdbbG9kYXNoXShodHRwczovL2xvZGFzaC5jb20vKScpO1xuICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKi9cbiAgICB2YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJy0nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnZlJFRCdcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSwgY2hhcnMpICtcbiAgICAgICAgc3RyaW5nICtcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksIGNoYXJzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBJZiBgcmFkaXhgIGlzXG4gICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgKiBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAqIFtFUzUgaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4yKSBvZiBgcGFyc2VJbnRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXg9MTBdIFRoZSByYWRpeCB0byBpbnRlcnByZXQgYHZhbHVlYCBieS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCB8fCByYWRpeCA9PSBudWxsKSB7XG4gICAgICAgIHJhZGl4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocmFkaXgpIHtcbiAgICAgICAgcmFkaXggPSArcmFkaXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyksIHJhZGl4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdHMgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIG1hdGNoZXMgZm9yIGBwYXR0ZXJuYCBpbiBgc3RyaW5nYCB3aXRoIGByZXBsYWNlbWVudGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNyZXBsYWNlYF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3JlcGxhY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBsYWNlKCdIaSBGcmVkJywgJ0ZyZWQnLCAnQmFybmV5Jyk7XG4gICAgICogLy8gPT4gJ0hpIEJhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoYXJnc1swXSk7XG5cbiAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA8IDMgPyBzdHJpbmcgOiBzdHJpbmcucmVwbGFjZShhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgcmVzdWx0cyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBsaW1pdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmICghbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKFxuICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKVxuICAgICAgICAgICkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgdXBwZXJGaXJzdCh3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgPyAwXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgKiBpbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpblxuICAgICAqIFwiZXNjYXBlXCIgZGVsaW1pdGVycywgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy4gRGF0YVxuICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICogb2JqZWN0IGlzIGdpdmVuLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYF8udGVtcGxhdGVTZXR0aW5nc2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgKiBbc291cmNlVVJMc10oaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybClcbiAgICAgKiBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlXG4gICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlXG4gICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHRlbXBsYXRlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlPV8udGVtcGxhdGVTZXR0aW5ncy5lc2NhcGVdXG4gICAgICogIFRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICogIFRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzPV8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXVxuICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGVdXG4gICAgICogIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAqICBUaGUgc291cmNlVVJMIG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBkYXRhIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIF8uZm9yRWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEVTIHRlbXBsYXRlIGxpdGVyYWwgZGVsaW1pdGVyIGFzIGFuIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pO1xuICAgICAqIGNvbXBpbGVkKGRhdGEpO1xuICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICogY29tcGlsZWQuc291cmNlO1xuICAgICAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAqIC8vICAgX19wICs9ICdoaSAnICsgKChfX3QgPSAoIGRhdGEudXNlciApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnO1xuICAgICAqIC8vICAgcmV0dXJuIF9fcDtcbiAgICAgKiAvLyB9XG4gICAgICpcbiAgICAgKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyB7eyB1c2VyIH19IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIChodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLylcbiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1QpLlxuICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0dGluZ3MuaW1wb3J0cywgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksXG4gICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSBiYXNlVmFsdWVzKGltcG9ydHMsIGltcG9ydHNLZXlzKTtcblxuICAgICAgdmFyIGlzRXNjYXBpbmcsXG4gICAgICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGUgfHwgcmVOb01hdGNoLFxuICAgICAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAgICAgLy8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgdmFyIHNvdXJjZVVSTCA9ICcvLyMgc291cmNlVVJMPScgK1xuICAgICAgICAoJ3NvdXJjZVVSTCcgaW4gb3B0aW9uc1xuICAgICAgICAgID8gb3B0aW9ucy5zb3VyY2VVUkxcbiAgICAgICAgICA6ICgnbG9kYXNoLnRlbXBsYXRlU291cmNlc1snICsgKCsrdGVtcGxhdGVDb3VudGVyKSArICddJylcbiAgICAgICAgKSArICdcXG4nO1xuXG4gICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgICAgIHNvdXJjZSArPSBzdHJpbmcuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHMuXG4gICAgICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbl9fZShcIiArIGVzY2FwZVZhbHVlICsgXCIpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJwb2xhdGVWYWx1ZSkge1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgICAgLy8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAgICAgdmFyIHZhcmlhYmxlID0gb3B0aW9ucy52YXJpYWJsZTtcbiAgICAgIGlmICghdmFyaWFibGUpIHtcbiAgICAgICAgc291cmNlID0gJ3dpdGggKG9iaikge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gICAgICB9XG4gICAgICAvLyBDbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3MuXG4gICAgICBzb3VyY2UgPSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcnKSA6IHNvdXJjZSlcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJylcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7XG5cbiAgICAgIC8vIEZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkuXG4gICAgICBzb3VyY2UgPSAnZnVuY3Rpb24oJyArICh2YXJpYWJsZSB8fCAnb2JqJykgKyAnKSB7XFxuJyArXG4gICAgICAgICh2YXJpYWJsZVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6ICdvYmogfHwgKG9iaiA9IHt9KTtcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBcInZhciBfX3QsIF9fcCA9ICcnXCIgK1xuICAgICAgICAoaXNFc2NhcGluZ1xuICAgICAgICAgICA/ICcsIF9fZSA9IF8uZXNjYXBlJ1xuICAgICAgICAgICA6ICcnXG4gICAgICAgICkgK1xuICAgICAgICAoaXNFdmFsdWF0aW5nXG4gICAgICAgICAgPyAnLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcXG4nICtcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XFxuXCJcbiAgICAgICAgICA6ICc7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgc291cmNlICtcbiAgICAgICAgJ3JldHVybiBfX3BcXG59JztcblxuICAgICAgdmFyIHJlc3VsdCA9IGF0dGVtcHQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbihpbXBvcnRzS2V5cywgc291cmNlVVJMICsgJ3JldHVybiAnICsgc291cmNlKVxuICAgICAgICAgIC5hcHBseSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdgIG1ldGhvZCBvclxuICAgICAgLy8gdGhlIGBzb3VyY2VgIHByb3BlcnR5IGFzIGEgY29udmVuaWVuY2UgZm9yIGlubGluaW5nIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBpZiAoaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b0xvd2VyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9Mb3dlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tZm9vLWJhci0tJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vYmFyJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdfX2Zvb19iYXJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xvd2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIHVwcGVyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b1VwcGVyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9VcHBlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tRk9PLUJBUi0tJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PQkFSJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdfX0ZPT19CQVJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1VwcGVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8udHJpbSgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnICBmb28gICcsICcgIGJhciAgJ10sIF8udHJpbSk7XG4gICAgICogLy8gPT4gWydmb28nLCAnYmFyJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltRW5kKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJyAgYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltRW5kKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnLV8tYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjICAnXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYy1fLSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0KS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgYHN0cmluZ2AgaWYgaXQncyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gICAgICogc3RyaW5nIHdoaWNoIGRlZmF1bHRzIHRvIFwiLi4uXCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub21pc3Npb249Jy4uLiddIFRoZSBzdHJpbmcgdG8gaW5kaWNhdGUgdGV4dCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuc2VwYXJhdG9yXSBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gdHJ1bmNhdGUgdG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm8uLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6ICcgJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAvLD8gKy9cbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdvbWlzc2lvbic6ICcgWy4uLl0nXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBERUZBVUxUX1RSVU5DX0xFTkdUSCxcbiAgICAgICAgICBvbWlzc2lvbiA9IERFRkFVTFRfVFJVTkNfT01JU1NJT047XG5cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gJ3NlcGFyYXRvcicgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc2VwYXJhdG9yIDogc2VwYXJhdG9yO1xuICAgICAgICBsZW5ndGggPSAnbGVuZ3RoJyBpbiBvcHRpb25zID8gdG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKSA6IGxlbmd0aDtcbiAgICAgICAgb21pc3Npb24gPSAnb21pc3Npb24nIGluIG9wdGlvbnMgPyBiYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbikgOiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTtcbiAgICAgICAgc3RyTGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pO1xuICAgICAgaWYgKGVuZCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHN0clN5bWJvbHNcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKVxuICAgICAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpO1xuXG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKHN0clN5bWJvbHMpIHtcbiAgICAgICAgZW5kICs9IChyZXN1bHQubGVuZ3RoIC0gZW5kKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlZ0V4cChzZXBhcmF0b3IpKSB7XG4gICAgICAgIGlmIChzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSkge1xuICAgICAgICAgIHZhciBtYXRjaCxcbiAgICAgICAgICAgICAgc3Vic3RyaW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgICAgICB2YXIgbmV3RW5kID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCA/IGVuZCA6IG5ld0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksIGVuZCkgIT0gZW5kKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAqIGAmYW1wO2AsIGAmbHQ7YCwgYCZndDtgLCBgJnF1b3Q7YCwgYW5kIGAmIzM5O2AgaW4gYHN0cmluZ2AgdG9cbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogSFRNTCBlbnRpdGllcyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCctLWZvby1iYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGUkVEJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b1VwcGVyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gICAgICBpZiAocGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pIHx8IFtdO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGludm9rZSBgZnVuY2AsIHJldHVybmluZyBlaXRoZXIgdGhlIHJlc3VsdCBvciB0aGUgY2F1Z2h0IGVycm9yXG4gICAgICogb2JqZWN0LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYGZ1bmNgIHJlc3VsdCBvciBlcnJvciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIHRocm93aW5nIGVycm9ycyBmb3IgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgICogdmFyIGVsZW1lbnRzID0gXy5hdHRlbXB0KGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICogICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICogfSwgJz5fPicpO1xuICAgICAqXG4gICAgICogaWYgKF8uaXNFcnJvcihlbGVtZW50cykpIHtcbiAgICAgKiAgIGVsZW1lbnRzID0gW107XG4gICAgICogfVxuICAgICAqL1xuICAgIHZhciBhdHRlbXB0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBpc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgKiBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IG1ldGhvZE5hbWVzIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVzIHRvIGJpbmQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHZpZXcgPSB7XG4gICAgICogICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICogICAnY2xpY2snOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdmlldy5jbGljayk7XG4gICAgICogLy8gPT4gTG9ncyAnY2xpY2tlZCBkb2NzJyB3aGVuIGNsaWNrZWQuXG4gICAgICovXG4gICAgdmFyIGJpbmRBbGwgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIG1ldGhvZE5hbWVzKSB7XG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBrZXkgPSB0b0tleShrZXkpO1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIGJpbmQob2JqZWN0W2tleV0sIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogZnVuY3Rpb24gb2YgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byByZXR1cm4gdHJ1dGh5LiBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uXG4gICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLmNvbmQoW1xuICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSxcbiAgICAgKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sXG4gICAgICogICBbXy5zdHViVHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgXy5jb25zdGFudCgnbm8gbWF0Y2gnKV1cbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMCwgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEInXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAnMScsICdiJzogJzInIH0pO1xuICAgICAqIC8vID0+ICdubyBtYXRjaCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25kKHBhaXJzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgdG9JdGVyYXRlZSA9IGdldEl0ZXJhdGVlKCk7XG5cbiAgICAgIHBhaXJzID0gIWxlbmd0aCA/IFtdIDogYXJyYXlNYXAocGFpcnMsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYWlyWzFdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0b0l0ZXJhdGVlKHBhaXJbMF0pLCBwYWlyWzFdXTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgICBpZiAoYXBwbHkocGFpclswXSwgdGhpcywgYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShwYWlyWzFdLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYSBnaXZlbiBvYmplY3QsIHJldHVybmluZyBgdHJ1ZWAgaWZcbiAgICAgKiBhbGwgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc1RvYCB3aXRoXG4gICAgICogYHNvdXJjZWAgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMiwgJ2InOiAxIH0sXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5jb25mb3Jtcyh7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYHZhbHVlYCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIGluXG4gICAgICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICAgICAqIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3coW18uYWRkLCBzcXVhcmVdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93ID0gY3JlYXRlRmxvdygpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbG93YCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdFxuICAgICAqIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3dSaWdodChbc3F1YXJlLCBfLmFkZF0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3dSaWdodCA9IGNyZWF0ZUZsb3codHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUsIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlXG4gICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50XG4gICAgICogc291cmNlIHByb3BlcnRpZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZShbJ3VzZXInLCAnZnJlZCddKSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsIF8uaXRlcmF0ZWUoJ3VzZXInKSk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBDcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICAgICAqICAgcmV0dXJuICFfLmlzUmVnRXhwKGZ1bmMpID8gaXRlcmF0ZWUoZnVuYykgOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgKiAgICAgcmV0dXJuIGZ1bmMudGVzdChzdHJpbmcpO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAgICAgKiAvLyA9PiBbJ2RlZiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykge1xuICAgICAgcmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gZnVuYyA6IGJhc2VDbG9uZShmdW5jLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlblxuICAgICAqIG9iamVjdCBhbmQgYHNvdXJjZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgZXF1aXZhbGVudFxuICAgICAqIHByb3BlcnR5IHZhbHVlcywgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uaXNNYXRjaGAgd2l0aCBgc291cmNlYFxuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm1hdGNoZXMoeyAnYSc6IDQsICdjJzogNiB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZVxuICAgICAqIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdCB0byBgc3JjVmFsdWVgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZVxuICAgICAqIG9iamVjdCB2YWx1ZSBpcyBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3RcbiAgICAgKiBgc3JjVmFsdWVgIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlXG4gICAgICogYF8uaXNFcXVhbGAgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZChvYmplY3RzLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgYmFzZUNsb25lKHNyY1ZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMikgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDEpIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZCgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoWydhJywgJ2InXSkpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciBtZXRob2QgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1ldGhvZGA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiB0aGUgbWV0aG9kIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBfLnRpbWVzKDMsIF8uY29uc3RhbnQpLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZE9mID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYWxsIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBmdW5jdGlvbiBwcm9wZXJ0aWVzIG9mIGEgc291cmNlXG4gICAgICogb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24sIHRoZW4gbWV0aG9kc1xuICAgICAqIGFyZSBhZGRlZCB0byBpdHMgcHJvdG90eXBlIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVXNlIGBfLnJ1bkluQ29udGV4dGAgdG8gY3JlYXRlIGEgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdG9cbiAgICAgKiBhdm9pZCBjb25mbGljdHMgY2F1c2VkIGJ5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgZnVuY3Rpb25zIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoYWluPXRydWVdIFNwZWNpZnkgd2hldGhlciBtaXhpbnMgYXJlIGNoYWluYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB2b3dlbHMoc3RyaW5nKSB7XG4gICAgICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gICAgICogICAgIHJldHVybiAvW2FlaW91XS9pLnRlc3Qodik7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9KTtcbiAgICAgKiBfLnZvd2VscygnZnJlZCcpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpLFxuICAgICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIHByb3BzKTtcblxuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCAmJlxuICAgICAgICAgICEoaXNPYmplY3Qoc291cmNlKSAmJiAobWV0aG9kTmFtZXMubGVuZ3RoIHx8ICFwcm9wcy5sZW5ndGgpKSkge1xuICAgICAgICBvcHRpb25zID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSBvYmplY3Q7XG4gICAgICAgIG9iamVjdCA9IHRoaXM7XG4gICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2hhaW4gPSAhKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykgfHwgISFvcHRpb25zLmNoYWluLFxuICAgICAgICAgIGlzRnVuYyA9IGlzRnVuY3Rpb24ob2JqZWN0KTtcblxuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBmdW5jID0gc291cmNlW21ldGhvZE5hbWVdO1xuICAgICAgICBvYmplY3RbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICBpZiAoaXNGdW5jKSB7XG4gICAgICAgICAgb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX187XG4gICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHtcbiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbnMgPSByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG5cbiAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKHsgJ2Z1bmMnOiBmdW5jLCAnYXJncyc6IGFyZ3VtZW50cywgJ3RoaXNBcmcnOiBvYmplY3QgfSk7XG4gICAgICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KG9iamVjdCwgYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLCBhcmd1bWVudHMpKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvXG4gICAgICogdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbG9kYXNoID0gXy5ub0NvbmZsaWN0KCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgIGlmIChyb290Ll8gPT09IHRoaXMpIHtcbiAgICAgICAgcm9vdC5fID0gb2xkRGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGFyZ3VtZW50IGF0IGluZGV4IGBuYC4gSWYgYG5gIGlzIG5lZ2F0aXZlLFxuICAgICAqIHRoZSBudGggYXJndW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFzcy10aHJ1IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKDEpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoLTIpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGhBcmcobikge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHJldHVybiBiYXNlTnRoKGFyZ3MsIG4pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgaXRlcmF0ZWVzYCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXNcbiAgICAgKiBhbmQgcmV0dXJucyB0aGVpciByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlcihbTWF0aC5tYXgsIE1hdGgubWluXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDEsIDIsIDMsIDQpO1xuICAgICAqIC8vID0+IFs0LCAxXVxuICAgICAqL1xuICAgIHZhciBvdmVyID0gY3JlYXRlT3ZlcihhcnJheU1hcCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbGwqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlclNvbWUoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlclNvbWUgPSBjcmVhdGVPdmVyKGFycmF5U29tZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICogdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMCwgMSwgMl0sXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3QpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAgICAgKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICAgICAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZSg0KTtcbiAgICAgKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoLTQpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJhbmdlYCBleGNlcHQgdGhhdCBpdCBwb3B1bGF0ZXMgdmFsdWVzIGluXG4gICAgICogZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoNCk7XG4gICAgICogLy8gPT4gWzMsIDIsIDEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoLTQpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICAgICAqIC8vID0+IFs0LCAzLCAyLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTUsIDEwLCA1LCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICAgICAqIC8vID0+IFtbXSwgW11dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gICAgICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5zdHViT2JqZWN0KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7fSwge31dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJycsICcnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViVHJ1ZSk7XG4gICAgICogLy8gPT4gW3RydWUsIHRydWVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlRydWUoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZlxuICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIFN0cmluZyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddXG4gICAgICpcbiAgICAgKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTtcbiAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSk7XG4gICAgICBuIC09IE1BWF9BUlJBWV9MRU5HVEg7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlVGltZXMobGVuZ3RoLCBpdGVyYXRlZSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgICAgaXRlcmF0ZWUoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBnaXZlbiwgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD0nJ10gVGhlIHZhbHVlIHRvIHByZWZpeCB0aGUgSUQgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgpO1xuICAgICAqIC8vID0+ICcxMDUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgICAgIHJldHVybiB0b1N0cmluZyhwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdG90YWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYWRkKDYsIDQpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgdmFyIGFkZCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLCBhZGRlbmQpIHtcbiAgICAgIHJldHVybiBhdWdlbmQgKyBhZGRlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg0LjAwNik7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogXy5jZWlsKDYuMDA0LCAyKTtcbiAgICAgKiAvLyA9PiA2LjAxXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNjA0MCwgLTIpO1xuICAgICAqIC8vID0+IDYxMDBcbiAgICAgKi9cbiAgICB2YXIgY2VpbCA9IGNyZWF0ZVJvdW5kKCdjZWlsJyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpZGVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBxdW90aWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaXZpZGUoNiwgNCk7XG4gICAgICogLy8gPT4gMS41XG4gICAgICovXG4gICAgdmFyIGRpdmlkZSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgIHJldHVybiBkaXZpZGVuZCAvIGRpdmlzb3I7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbG9vcig0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5mbG9vcigwLjA0NiwgMik7XG4gICAgICogLy8gPT4gMC4wNFxuICAgICAqXG4gICAgICogXy5mbG9vcig0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDAwMFxuICAgICAqL1xuICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXgoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1heGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXhCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1lYW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbihhcnJheSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBpZGVudGl0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgYXZlcmFnZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5taW4oW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbihhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGllciBUaGUgZmlyc3QgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpY2FuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHByb2R1Y3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubXVsdGlwbHkoNiwgNCk7XG4gICAgICogLy8gPT4gMjRcbiAgICAgKi9cbiAgICB2YXIgbXVsdGlwbHkgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCkge1xuICAgICAgcmV0dXJuIG11bHRpcGxpZXIgKiBtdWx0aXBsaWNhbmQ7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICAgICAqIC8vID0+IDQuMDFcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQxMDBcbiAgICAgKi9cbiAgICB2YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTtcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWludWVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN1YnRyYWhlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1YnRyYWN0KDYsIDQpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsIHN1YnRyYWhlbmQpIHtcbiAgICAgIHJldHVybiBtaW51ZW5kIC0gc3VidHJhaGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdW0oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgaWRlbnRpdHkpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7XG4gICAgbG9kYXNoLmFyeSA9IGFyeTtcbiAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduO1xuICAgIGxvZGFzaC5hc3NpZ25JbiA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5hc3NpZ25JbldpdGggPSBhc3NpZ25JbldpdGg7XG4gICAgbG9kYXNoLmFzc2lnbldpdGggPSBhc3NpZ25XaXRoO1xuICAgIGxvZGFzaC5hdCA9IGF0O1xuICAgIGxvZGFzaC5iZWZvcmUgPSBiZWZvcmU7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNhc3RBcnJheSA9IGNhc3RBcnJheTtcbiAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjtcbiAgICBsb2Rhc2guY2h1bmsgPSBjaHVuaztcbiAgICBsb2Rhc2guY29tcGFjdCA9IGNvbXBhY3Q7XG4gICAgbG9kYXNoLmNvbmNhdCA9IGNvbmNhdDtcbiAgICBsb2Rhc2guY29uZCA9IGNvbmQ7XG4gICAgbG9kYXNoLmNvbmZvcm1zID0gY29uZm9ybXM7XG4gICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7XG4gICAgbG9kYXNoLmNvdW50QnkgPSBjb3VudEJ5O1xuICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgbG9kYXNoLmN1cnJ5ID0gY3Vycnk7XG4gICAgbG9kYXNoLmN1cnJ5UmlnaHQgPSBjdXJyeVJpZ2h0O1xuICAgIGxvZGFzaC5kZWJvdW5jZSA9IGRlYm91bmNlO1xuICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgIGxvZGFzaC5kZWZhdWx0c0RlZXAgPSBkZWZhdWx0c0RlZXA7XG4gICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7XG4gICAgbG9kYXNoLmRlbGF5ID0gZGVsYXk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlO1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlQnkgPSBkaWZmZXJlbmNlQnk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VXaXRoID0gZGlmZmVyZW5jZVdpdGg7XG4gICAgbG9kYXNoLmRyb3AgPSBkcm9wO1xuICAgIGxvZGFzaC5kcm9wUmlnaHQgPSBkcm9wUmlnaHQ7XG4gICAgbG9kYXNoLmRyb3BSaWdodFdoaWxlID0gZHJvcFJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTtcbiAgICBsb2Rhc2guZmlsbCA9IGZpbGw7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdE1hcCA9IGZsYXRNYXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZWVwID0gZmxhdE1hcERlZXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZXB0aCA9IGZsYXRNYXBEZXB0aDtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZsYXR0ZW5EZWVwID0gZmxhdHRlbkRlZXA7XG4gICAgbG9kYXNoLmZsYXR0ZW5EZXB0aCA9IGZsYXR0ZW5EZXB0aDtcbiAgICBsb2Rhc2guZmxpcCA9IGZsaXA7XG4gICAgbG9kYXNoLmZsb3cgPSBmbG93O1xuICAgIGxvZGFzaC5mbG93UmlnaHQgPSBmbG93UmlnaHQ7XG4gICAgbG9kYXNoLmZyb21QYWlycyA9IGZyb21QYWlycztcbiAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zO1xuICAgIGxvZGFzaC5mdW5jdGlvbnNJbiA9IGZ1bmN0aW9uc0luO1xuICAgIGxvZGFzaC5ncm91cEJ5ID0gZ3JvdXBCeTtcbiAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uQnkgPSBpbnRlcnNlY3Rpb25CeTtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aCA9IGludGVyc2VjdGlvbldpdGg7XG4gICAgbG9kYXNoLmludmVydCA9IGludmVydDtcbiAgICBsb2Rhc2guaW52ZXJ0QnkgPSBpbnZlcnRCeTtcbiAgICBsb2Rhc2guaW52b2tlTWFwID0gaW52b2tlTWFwO1xuICAgIGxvZGFzaC5pdGVyYXRlZSA9IGl0ZXJhdGVlO1xuICAgIGxvZGFzaC5rZXlCeSA9IGtleUJ5O1xuICAgIGxvZGFzaC5rZXlzID0ga2V5cztcbiAgICBsb2Rhc2gua2V5c0luID0ga2V5c0luO1xuICAgIGxvZGFzaC5tYXAgPSBtYXA7XG4gICAgbG9kYXNoLm1hcEtleXMgPSBtYXBLZXlzO1xuICAgIGxvZGFzaC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7XG4gICAgbG9kYXNoLm1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGxvZGFzaC5tYXRjaGVzUHJvcGVydHkgPSBtYXRjaGVzUHJvcGVydHk7XG4gICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplO1xuICAgIGxvZGFzaC5tZXJnZSA9IG1lcmdlO1xuICAgIGxvZGFzaC5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG4gICAgbG9kYXNoLm1ldGhvZCA9IG1ldGhvZDtcbiAgICBsb2Rhc2gubWV0aG9kT2YgPSBtZXRob2RPZjtcbiAgICBsb2Rhc2gubWl4aW4gPSBtaXhpbjtcbiAgICBsb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xuICAgIGxvZGFzaC5udGhBcmcgPSBudGhBcmc7XG4gICAgbG9kYXNoLm9taXQgPSBvbWl0O1xuICAgIGxvZGFzaC5vbWl0QnkgPSBvbWl0Qnk7XG4gICAgbG9kYXNoLm9uY2UgPSBvbmNlO1xuICAgIGxvZGFzaC5vcmRlckJ5ID0gb3JkZXJCeTtcbiAgICBsb2Rhc2gub3ZlciA9IG92ZXI7XG4gICAgbG9kYXNoLm92ZXJBcmdzID0gb3ZlckFyZ3M7XG4gICAgbG9kYXNoLm92ZXJFdmVyeSA9IG92ZXJFdmVyeTtcbiAgICBsb2Rhc2gub3ZlclNvbWUgPSBvdmVyU29tZTtcbiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgbG9kYXNoLnBhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodDtcbiAgICBsb2Rhc2gucGFydGl0aW9uID0gcGFydGl0aW9uO1xuICAgIGxvZGFzaC5waWNrID0gcGljaztcbiAgICBsb2Rhc2gucGlja0J5ID0gcGlja0J5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eU9mID0gcHJvcGVydHlPZjtcbiAgICBsb2Rhc2gucHVsbCA9IHB1bGw7XG4gICAgbG9kYXNoLnB1bGxBbGwgPSBwdWxsQWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsQnkgPSBwdWxsQWxsQnk7XG4gICAgbG9kYXNoLnB1bGxBbGxXaXRoID0gcHVsbEFsbFdpdGg7XG4gICAgbG9kYXNoLnB1bGxBdCA9IHB1bGxBdDtcbiAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTtcbiAgICBsb2Rhc2gucmFuZ2VSaWdodCA9IHJhbmdlUmlnaHQ7XG4gICAgbG9kYXNoLnJlYXJnID0gcmVhcmc7XG4gICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDtcbiAgICBsb2Rhc2gucmVtb3ZlID0gcmVtb3ZlO1xuICAgIGxvZGFzaC5yZXN0ID0gcmVzdDtcbiAgICBsb2Rhc2gucmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgbG9kYXNoLnNhbXBsZVNpemUgPSBzYW1wbGVTaXplO1xuICAgIGxvZGFzaC5zZXQgPSBzZXQ7XG4gICAgbG9kYXNoLnNldFdpdGggPSBzZXRXaXRoO1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc2xpY2UgPSBzbGljZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxID0gc29ydGVkVW5pcTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcUJ5ID0gc29ydGVkVW5pcUJ5O1xuICAgIGxvZGFzaC5zcGxpdCA9IHNwbGl0O1xuICAgIGxvZGFzaC5zcHJlYWQgPSBzcHJlYWQ7XG4gICAgbG9kYXNoLnRhaWwgPSB0YWlsO1xuICAgIGxvZGFzaC50YWtlID0gdGFrZTtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0ID0gdGFrZVJpZ2h0O1xuICAgIGxvZGFzaC50YWtlUmlnaHRXaGlsZSA9IHRha2VSaWdodFdoaWxlO1xuICAgIGxvZGFzaC50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG4gICAgbG9kYXNoLnRhcCA9IHRhcDtcbiAgICBsb2Rhc2gudGhyb3R0bGUgPSB0aHJvdHRsZTtcbiAgICBsb2Rhc2gudGhydSA9IHRocnU7XG4gICAgbG9kYXNoLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIGxvZGFzaC50b1BhaXJzID0gdG9QYWlycztcbiAgICBsb2Rhc2gudG9QYWlyc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC50b1BhdGggPSB0b1BhdGg7XG4gICAgbG9kYXNoLnRvUGxhaW5PYmplY3QgPSB0b1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgbG9kYXNoLnVuYXJ5ID0gdW5hcnk7XG4gICAgbG9kYXNoLnVuaW9uID0gdW5pb247XG4gICAgbG9kYXNoLnVuaW9uQnkgPSB1bmlvbkJ5O1xuICAgIGxvZGFzaC51bmlvbldpdGggPSB1bmlvbldpdGg7XG4gICAgbG9kYXNoLnVuaXEgPSB1bmlxO1xuICAgIGxvZGFzaC51bmlxQnkgPSB1bmlxQnk7XG4gICAgbG9kYXNoLnVuaXFXaXRoID0gdW5pcVdpdGg7XG4gICAgbG9kYXNoLnVuc2V0ID0gdW5zZXQ7XG4gICAgbG9kYXNoLnVuemlwID0gdW56aXA7XG4gICAgbG9kYXNoLnVuemlwV2l0aCA9IHVuemlwV2l0aDtcbiAgICBsb2Rhc2gudXBkYXRlID0gdXBkYXRlO1xuICAgIGxvZGFzaC51cGRhdGVXaXRoID0gdXBkYXRlV2l0aDtcbiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzO1xuICAgIGxvZGFzaC52YWx1ZXNJbiA9IHZhbHVlc0luO1xuICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDtcbiAgICBsb2Rhc2gud29yZHMgPSB3b3JkcztcbiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7XG4gICAgbG9kYXNoLnhvciA9IHhvcjtcbiAgICBsb2Rhc2gueG9yQnkgPSB4b3JCeTtcbiAgICBsb2Rhc2gueG9yV2l0aCA9IHhvcldpdGg7XG4gICAgbG9kYXNoLnppcCA9IHppcDtcbiAgICBsb2Rhc2guemlwT2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC56aXBPYmplY3REZWVwID0gemlwT2JqZWN0RGVlcDtcbiAgICBsb2Rhc2guemlwV2l0aCA9IHppcFdpdGg7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZW50cmllcyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLmVudHJpZXNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmV4dGVuZFdpdGggPSBhc3NpZ25JbldpdGg7XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgbWl4aW4obG9kYXNoLCBsb2Rhc2gpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFkZCA9IGFkZDtcbiAgICBsb2Rhc2guYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgbG9kYXNoLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbiAgICBsb2Rhc2guY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7XG4gICAgbG9kYXNoLmNlaWwgPSBjZWlsO1xuICAgIGxvZGFzaC5jbGFtcCA9IGNsYW1wO1xuICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lO1xuICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7XG4gICAgbG9kYXNoLmNsb25lRGVlcFdpdGggPSBjbG9uZURlZXBXaXRoO1xuICAgIGxvZGFzaC5jbG9uZVdpdGggPSBjbG9uZVdpdGg7XG4gICAgbG9kYXNoLmNvbmZvcm1zVG8gPSBjb25mb3Jtc1RvO1xuICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7XG4gICAgbG9kYXNoLmRlZmF1bHRUbyA9IGRlZmF1bHRUbztcbiAgICBsb2Rhc2guZGl2aWRlID0gZGl2aWRlO1xuICAgIGxvZGFzaC5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuICAgIGxvZGFzaC5lcSA9IGVxO1xuICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7XG4gICAgbG9kYXNoLmVzY2FwZVJlZ0V4cCA9IGVzY2FwZVJlZ0V4cDtcbiAgICBsb2Rhc2guZXZlcnkgPSBldmVyeTtcbiAgICBsb2Rhc2guZmluZCA9IGZpbmQ7XG4gICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7XG4gICAgbG9kYXNoLmZpbmRMYXN0ID0gZmluZExhc3Q7XG4gICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4O1xuICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5O1xuICAgIGxvZGFzaC5mbG9vciA9IGZsb29yO1xuICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5mb3JJbiA9IGZvckluO1xuICAgIGxvZGFzaC5mb3JJblJpZ2h0ID0gZm9ySW5SaWdodDtcbiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duO1xuICAgIGxvZGFzaC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0O1xuICAgIGxvZGFzaC5nZXQgPSBnZXQ7XG4gICAgbG9kYXNoLmd0ID0gZ3Q7XG4gICAgbG9kYXNoLmd0ZSA9IGd0ZTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5oYXNJbiA9IGhhc0luO1xuICAgIGxvZGFzaC5oZWFkID0gaGVhZDtcbiAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7XG4gICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlO1xuICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7XG4gICAgbG9kYXNoLmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7XG4gICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuICAgIGxvZGFzaC5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZTtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2VPYmplY3QgPSBpc0FycmF5TGlrZU9iamVjdDtcbiAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuO1xuICAgIGxvZGFzaC5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7XG4gICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbiAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7XG4gICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsO1xuICAgIGxvZGFzaC5pc0VxdWFsV2l0aCA9IGlzRXF1YWxXaXRoO1xuICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzSW50ZWdlciA9IGlzSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNMZW5ndGggPSBpc0xlbmd0aDtcbiAgICBsb2Rhc2guaXNNYXAgPSBpc01hcDtcbiAgICBsb2Rhc2guaXNNYXRjaCA9IGlzTWF0Y2g7XG4gICAgbG9kYXNoLmlzTWF0Y2hXaXRoID0gaXNNYXRjaFdpdGg7XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTmF0aXZlID0gaXNOYXRpdmU7XG4gICAgbG9kYXNoLmlzTmlsID0gaXNOaWw7XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNPYmplY3RMaWtlID0gaXNPYmplY3RMaWtlO1xuICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcbiAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4cDtcbiAgICBsb2Rhc2guaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLmlzU2V0ID0gaXNTZXQ7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzU3ltYm9sID0gaXNTeW1ib2w7XG4gICAgbG9kYXNoLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTtcbiAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcbiAgICBsb2Rhc2guaXNXZWFrTWFwID0gaXNXZWFrTWFwO1xuICAgIGxvZGFzaC5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7XG4gICAgbG9kYXNoLmpvaW4gPSBqb2luO1xuICAgIGxvZGFzaC5rZWJhYkNhc2UgPSBrZWJhYkNhc2U7XG4gICAgbG9kYXNoLmxhc3QgPSBsYXN0O1xuICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5sb3dlckNhc2UgPSBsb3dlckNhc2U7XG4gICAgbG9kYXNoLmxvd2VyRmlyc3QgPSBsb3dlckZpcnN0O1xuICAgIGxvZGFzaC5sdCA9IGx0O1xuICAgIGxvZGFzaC5sdGUgPSBsdGU7XG4gICAgbG9kYXNoLm1heCA9IG1heDtcbiAgICBsb2Rhc2gubWF4QnkgPSBtYXhCeTtcbiAgICBsb2Rhc2gubWVhbiA9IG1lYW47XG4gICAgbG9kYXNoLm1lYW5CeSA9IG1lYW5CeTtcbiAgICBsb2Rhc2gubWluID0gbWluO1xuICAgIGxvZGFzaC5taW5CeSA9IG1pbkJ5O1xuICAgIGxvZGFzaC5zdHViQXJyYXkgPSBzdHViQXJyYXk7XG4gICAgbG9kYXNoLnN0dWJGYWxzZSA9IHN0dWJGYWxzZTtcbiAgICBsb2Rhc2guc3R1Yk9iamVjdCA9IHN0dWJPYmplY3Q7XG4gICAgbG9kYXNoLnN0dWJTdHJpbmcgPSBzdHViU3RyaW5nO1xuICAgIGxvZGFzaC5zdHViVHJ1ZSA9IHN0dWJUcnVlO1xuICAgIGxvZGFzaC5tdWx0aXBseSA9IG11bHRpcGx5O1xuICAgIGxvZGFzaC5udGggPSBudGg7XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYWQgPSBwYWQ7XG4gICAgbG9kYXNoLnBhZEVuZCA9IHBhZEVuZDtcbiAgICBsb2Rhc2gucGFkU3RhcnQgPSBwYWRTdGFydDtcbiAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUludDtcbiAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tO1xuICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1Y2U7XG4gICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7XG4gICAgbG9kYXNoLnJlcGVhdCA9IHJlcGVhdDtcbiAgICBsb2Rhc2gucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDtcbiAgICBsb2Rhc2gucm91bmQgPSByb3VuZDtcbiAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0O1xuICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zbmFrZUNhc2UgPSBzbmFrZUNhc2U7XG4gICAgbG9kYXNoLnNvbWUgPSBzb21lO1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleEJ5ID0gc29ydGVkSW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhPZiA9IHNvcnRlZEluZGV4T2Y7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4QnkgPSBzb3J0ZWRMYXN0SW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBzb3J0ZWRMYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlO1xuICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbiAgICBsb2Rhc2guc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBsb2Rhc2guc3VtID0gc3VtO1xuICAgIGxvZGFzaC5zdW1CeSA9IHN1bUJ5O1xuICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzO1xuICAgIGxvZGFzaC50b0Zpbml0ZSA9IHRvRmluaXRlO1xuICAgIGxvZGFzaC50b0ludGVnZXIgPSB0b0ludGVnZXI7XG4gICAgbG9kYXNoLnRvTGVuZ3RoID0gdG9MZW5ndGg7XG4gICAgbG9kYXNoLnRvTG93ZXIgPSB0b0xvd2VyO1xuICAgIGxvZGFzaC50b051bWJlciA9IHRvTnVtYmVyO1xuICAgIGxvZGFzaC50b1NhZmVJbnRlZ2VyID0gdG9TYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBsb2Rhc2gudG9VcHBlciA9IHRvVXBwZXI7XG4gICAgbG9kYXNoLnRyaW0gPSB0cmltO1xuICAgIGxvZGFzaC50cmltRW5kID0gdHJpbUVuZDtcbiAgICBsb2Rhc2gudHJpbVN0YXJ0ID0gdHJpbVN0YXJ0O1xuICAgIGxvZGFzaC50cnVuY2F0ZSA9IHRydW5jYXRlO1xuICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlO1xuICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGxvZGFzaC51cHBlckNhc2UgPSB1cHBlckNhc2U7XG4gICAgbG9kYXNoLnVwcGVyRmlyc3QgPSB1cHBlckZpcnN0O1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5lYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZpcnN0ID0gaGVhZDtcblxuICAgIG1peGluKGxvZGFzaCwgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHt9O1xuICAgICAgYmFzZUZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsIG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH0oKSksIHsgJ2NoYWluJzogZmFsc2UgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGxvZGFzaC5WRVJTSU9OID0gVkVSU0lPTjtcblxuICAgIC8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbiAgICBhcnJheUVhY2goWydiaW5kJywgJ2JpbmRLZXknLCAnY3VycnknLCAnY3VycnlSaWdodCcsICdwYXJ0aWFsJywgJ3BhcnRpYWxSaWdodCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICBsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXIgPSBsb2Rhc2g7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuXG4gICAgYXJyYXlFYWNoKFsnZHJvcCcsICd0YWtlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIG4gPSBuID09PSB1bmRlZmluZWQgPyAxIDogbmF0aXZlTWF4KHRvSW50ZWdlcihuKSwgMCk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9ICh0aGlzLl9fZmlsdGVyZWRfXyAmJiAhaW5kZXgpXG4gICAgICAgICAgPyBuZXcgTGF6eVdyYXBwZXIodGhpcylcbiAgICAgICAgICA6IHRoaXMuY2xvbmUoKTtcblxuICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXykge1xuICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gbmF0aXZlTWluKG4sIHJlc3VsdC5fX3Rha2VDb3VudF9fKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQuX192aWV3c19fLnB1c2goe1xuICAgICAgICAgICAgJ3NpemUnOiBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCksXG4gICAgICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSArICdSaWdodCddID0gZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdGhhdCBhY2NlcHQgYW4gYGl0ZXJhdGVlYCB2YWx1ZS5cbiAgICBhcnJheUVhY2goWydmaWx0ZXInLCAnbWFwJywgJ3Rha2VXaGlsZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHR5cGUgPSBpbmRleCArIDEsXG4gICAgICAgICAgaXNGaWx0ZXIgPSB0eXBlID09IExBWllfRklMVEVSX0ZMQUcgfHwgdHlwZSA9PSBMQVpZX1dISUxFX0ZMQUc7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe1xuICAgICAgICAgICdpdGVyYXRlZSc6IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSxcbiAgICAgICAgICAndHlwZSc6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmhlYWRgIGFuZCBgXy5sYXN0YC5cbiAgICBhcnJheUVhY2goWydoZWFkJywgJ2xhc3QnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuXG4gICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fICYmIChzdGFydCA+IDAgfHwgZW5kIDwgMCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGFrZVJpZ2h0KC1zdGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kcm9wKHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0b0ludGVnZXIoZW5kKTtcbiAgICAgICAgcmVzdWx0ID0gZW5kIDwgMCA/IHJlc3VsdC5kcm9wUmlnaHQoLWVuZCkgOiByZXN1bHQudGFrZShlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWtlKE1BWF9BUlJBWV9MRU5HVEgpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGNoZWNrSXRlcmF0ZWUgPSAvXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW2lzVGFrZXIgPyAoJ3Rha2UnICsgKG1ldGhvZE5hbWUgPT0gJ2xhc3QnID8gJ1JpZ2h0JyA6ICcnKSkgOiBtZXRob2ROYW1lXSxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSBpc1Rha2VyIHx8IC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgaWYgKCFsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICAgIGFyZ3MgPSBpc1Rha2VyID8gWzFdIDogYXJndW1lbnRzLFxuICAgICAgICAgICAgaXNMYXp5ID0gdmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixcbiAgICAgICAgICAgIGl0ZXJhdGVlID0gYXJnc1swXSxcbiAgICAgICAgICAgIHVzZUxhenkgPSBpc0xhenkgfHwgaXNBcnJheSh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIGludGVyY2VwdG9yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsIGFycmF5UHVzaChbdmFsdWVdLCBhcmdzKSk7XG4gICAgICAgICAgcmV0dXJuIChpc1Rha2VyICYmIGNoYWluQWxsKSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhIFwibGVuZ3RoXCIgdmFsdWUgb3RoZXIgdGhhbiBgMWAuXG4gICAgICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgaXNIeWJyaWQgPSAhIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLFxuICAgICAgICAgICAgaXNVbndyYXBwZWQgPSByZXRVbndyYXBwZWQgJiYgIWNoYWluQWxsLFxuICAgICAgICAgICAgb25seUxhenkgPSBpc0xhenkgJiYgIWlzSHlicmlkO1xuXG4gICAgICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9ubHlMYXp5ID8gdmFsdWUgOiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbndyYXBwZWQgJiYgb25seUxhenkpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgICByZXR1cm4gaXNVbndyYXBwZWQgPyAoaXNUYWtlciA/IHJlc3VsdC52YWx1ZSgpWzBdIDogcmVzdWx0LnZhbHVlKCkpIDogcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgQXJyYXlgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGFycmF5RWFjaChbJ3BvcCcsICdwdXNoJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVByb3RvW21ldGhvZE5hbWVdLFxuICAgICAgICAgIGNoYWluTmFtZSA9IC9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKSA/ICd0YXAnIDogJ3RocnUnLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IC9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIXRoaXMuX19jaGFpbl9fKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIE1hcCBtaW5pZmllZCBtZXRob2QgbmFtZXMgdG8gdGhlaXIgcmVhbCBuYW1lcy5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbbWV0aG9kTmFtZV07XG4gICAgICBpZiAobG9kYXNoRnVuYykge1xuICAgICAgICB2YXIga2V5ID0gKGxvZGFzaEZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICAgIG5hbWVzID0gcmVhbE5hbWVzW2tleV0gfHwgKHJlYWxOYW1lc1trZXldID0gW10pO1xuXG4gICAgICAgIG5hbWVzLnB1c2goeyAnbmFtZSc6IG1ldGhvZE5hbWUsICdmdW5jJzogbG9kYXNoRnVuYyB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLCBXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3tcbiAgICAgICduYW1lJzogJ3dyYXBwZXInLFxuICAgICAgJ2Z1bmMnOiB1bmRlZmluZWRcbiAgICB9XTtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMYXp5V3JhcHBlcmAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lID0gbGF6eUNsb25lO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlID0gbGF6eVJldmVyc2U7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlID0gbGF6eVZhbHVlO1xuXG4gICAgLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5hdCA9IHdyYXBwZXJBdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29tbWl0ID0gd3JhcHBlckNvbW1pdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLm5leHQgPSB3cmFwcGVyTmV4dDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnBsYW50ID0gd3JhcHBlclBsYW50O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucmV2ZXJzZSA9IHdyYXBwZXJSZXZlcnNlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTtcblxuICAgIC8vIEFkZCBsYXp5IGFsaWFzZXMuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5maXJzdCA9IGxvZGFzaC5wcm90b3R5cGUuaGVhZDtcblxuICAgIGlmIChzeW1JdGVyYXRvcikge1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl0gPSB3cmFwcGVyVG9JdGVyYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfSk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLy8gRXhwb3J0IGxvZGFzaC5cbiAgdmFyIF8gPSBydW5JbkNvbnRleHQoKTtcblxuICAvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBjb25kaXRpb24gcGF0dGVybnMgbGlrZTpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIExvZGFzaCBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBwcmV2ZW50IGVycm9ycyB3aGVuIExvZGFzaCBpc1xuICAgIC8vIGxvYWRlZCBieSBhIHNjcmlwdCB0YWcgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRCBsb2FkZXIuXG4gICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjbWlzbWF0Y2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAvLyBVc2UgYF8ubm9Db25mbGljdGAgdG8gcmVtb3ZlIExvZGFzaCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG5cbiAgICAvLyBEZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBpdC5cbiAgZWxzZSBpZiAoZnJlZU1vZHVsZSkge1xuICAgIC8vIEV4cG9ydCBmb3IgTm9kZS5qcy5cbiAgICAoZnJlZU1vZHVsZS5leHBvcnRzID0gXykuXyA9IF87XG4gICAgLy8gRXhwb3J0IGZvciBDb21tb25KUyBzdXBwb3J0LlxuICAgIGZyZWVFeHBvcnRzLl8gPSBfO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIEV4cG9ydCB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuICB9XG59LmNhbGwodGhpcykpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIHdpdGhHbG9iYWwoX2dsb2JhbCkge1xuICAgIHZhciB1c2VyQWdlbnQgPSBfZ2xvYmFsLm5hdmlnYXRvciAmJiBfZ2xvYmFsLm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgdmFyIGlzUnVubmluZ0luSUUgPSB1c2VyQWdlbnQgJiYgdXNlckFnZW50LmluZGV4T2YoXCJNU0lFIFwiKSA+IC0xO1xuICAgIHZhciBtYXhUaW1lb3V0ID0gTWF0aC5wb3coMiwgMzEpIC0gMTsgLy9zZWUgaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jYWJzdHJhY3Qtb3BkZWYtY29udmVydHRvaW50XG5cbiAgICAvLyBNYWtlIHByb3BlcnRpZXMgd3JpdGFibGUgaW4gSUUsIGFzIHBlclxuICAgIC8vIGh0dHA6Ly93d3cuYWRlcXVhdGVseWdvb2QuY29tL1JlcGxhY2luZy1zZXRUaW1lb3V0LUdsb2JhbGx5Lmh0bWxcbiAgICBpZiAoaXNSdW5uaW5nSW5JRSkge1xuICAgICAgICBfZ2xvYmFsLnNldFRpbWVvdXQgPSBfZ2xvYmFsLnNldFRpbWVvdXQ7XG4gICAgICAgIF9nbG9iYWwuY2xlYXJUaW1lb3V0ID0gX2dsb2JhbC5jbGVhclRpbWVvdXQ7XG4gICAgICAgIF9nbG9iYWwuc2V0SW50ZXJ2YWwgPSBfZ2xvYmFsLnNldEludGVydmFsO1xuICAgICAgICBfZ2xvYmFsLmNsZWFySW50ZXJ2YWwgPSBfZ2xvYmFsLmNsZWFySW50ZXJ2YWw7XG4gICAgICAgIF9nbG9iYWwuRGF0ZSA9IF9nbG9iYWwuRGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzZXRJbW1lZGlhdGUgaXMgbm90IGEgc3RhbmRhcmQgZnVuY3Rpb25cbiAgICAvLyBhdm9pZCBhZGRpbmcgdGhlIHByb3AgdG8gdGhlIHdpbmRvdyBvYmplY3QgaWYgbm90IHByZXNlbnRcbiAgICBpZiAoX2dsb2JhbC5zZXRJbW1lZGlhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBfZ2xvYmFsLnNldEltbWVkaWF0ZSA9IF9nbG9iYWwuc2V0SW1tZWRpYXRlO1xuICAgICAgICBfZ2xvYmFsLmNsZWFySW1tZWRpYXRlID0gX2dsb2JhbC5jbGVhckltbWVkaWF0ZTtcbiAgICB9XG5cbiAgICAvLyBub2RlIGV4cGVjdHMgc2V0VGltZW91dC9zZXRJbnRlcnZhbCB0byByZXR1cm4gYSBmbiBvYmplY3Qgdy8gLnJlZigpLy51bnJlZigpXG4gICAgLy8gYnJvd3NlcnMsIGEgbnVtYmVyLlxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2pvaGFuc2VuL1Npbm9uLkpTL3B1bGwvNDM2XG5cbiAgICB2YXIgTk9PUCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfTtcbiAgICB2YXIgdGltZW91dFJlc3VsdCA9IF9nbG9iYWwuc2V0VGltZW91dChOT09QLCAwKTtcbiAgICB2YXIgYWRkVGltZXJSZXR1cm5zT2JqZWN0ID0gdHlwZW9mIHRpbWVvdXRSZXN1bHQgPT09IFwib2JqZWN0XCI7XG4gICAgdmFyIGhydGltZVByZXNlbnQgPSAoX2dsb2JhbC5wcm9jZXNzICYmIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MuaHJ0aW1lID09PSBcImZ1bmN0aW9uXCIpO1xuICAgIHZhciBuZXh0VGlja1ByZXNlbnQgPSAoX2dsb2JhbC5wcm9jZXNzICYmIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2sgPT09IFwiZnVuY3Rpb25cIik7XG4gICAgdmFyIHBlcmZvcm1hbmNlUHJlc2VudCA9IChfZ2xvYmFsLnBlcmZvcm1hbmNlICYmIHR5cGVvZiBfZ2xvYmFsLnBlcmZvcm1hbmNlLm5vdyA9PT0gXCJmdW5jdGlvblwiKTtcbiAgICB2YXIgaGFzUGVyZm9ybWFuY2VQcm90b3R5cGUgPSAoX2dsb2JhbC5QZXJmb3JtYW5jZSAmJiAodHlwZW9mIF9nbG9iYWwuUGVyZm9ybWFuY2UpLm1hdGNoKC9eKGZ1bmN0aW9ufG9iamVjdCkkLykpO1xuICAgIHZhciBxdWV1ZU1pY3JvdGFza1ByZXNlbnQgPSAodHlwZW9mIF9nbG9iYWwucXVldWVNaWNyb3Rhc2sgPT09IFwiZnVuY3Rpb25cIik7XG4gICAgdmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZVByZXNlbnQgPSAoXG4gICAgICAgIF9nbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lICYmIHR5cGVvZiBfZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgKTtcbiAgICB2YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWVQcmVzZW50ID0gKFxuICAgICAgICBfZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lICYmIHR5cGVvZiBfZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lID09PSBcImZ1bmN0aW9uXCJcbiAgICApO1xuICAgIHZhciByZXF1ZXN0SWRsZUNhbGxiYWNrUHJlc2VudCA9IChcbiAgICAgICAgX2dsb2JhbC5yZXF1ZXN0SWRsZUNhbGxiYWNrICYmIHR5cGVvZiBfZ2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIlxuICAgICk7XG4gICAgdmFyIGNhbmNlbElkbGVDYWxsYmFja1ByZXNlbnQgPSAoXG4gICAgICAgIF9nbG9iYWwuY2FuY2VsSWRsZUNhbGxiYWNrICYmIHR5cGVvZiBfZ2xvYmFsLmNhbmNlbElkbGVDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiXG4gICAgKTtcblxuICAgIF9nbG9iYWwuY2xlYXJUaW1lb3V0KHRpbWVvdXRSZXN1bHQpO1xuXG4gICAgdmFyIE5hdGl2ZURhdGUgPSBfZ2xvYmFsLkRhdGU7XG4gICAgdmFyIHVuaXF1ZVRpbWVySWQgPSAxO1xuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXJGaW5pdGUobnVtKSB7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBzdHJpbmdzIGxpa2UgXCIwMToxMDowMFwiIChtZWFuaW5nIDEgaG91ciwgMTAgbWludXRlcywgMCBzZWNvbmRzKSBpbnRvXG4gICAgICogbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgaHVtYW4tcmVhZGFibGUgc3RyaW5ncyBwYXNzZWRcbiAgICAgKiB0byBjbG9jay50aWNrKClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZVRpbWUoc3RyKSB7XG4gICAgICAgIGlmICghc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdHJpbmdzID0gc3RyLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgdmFyIGwgPSBzdHJpbmdzLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSBsO1xuICAgICAgICB2YXIgbXMgPSAwO1xuICAgICAgICB2YXIgcGFyc2VkO1xuXG4gICAgICAgIGlmIChsID4gMyB8fCAhL14oXFxkXFxkOil7MCwyfVxcZFxcZD8kLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRpY2sgb25seSB1bmRlcnN0YW5kcyBudW1iZXJzLCAnbTpzJyBhbmQgJ2g6bTpzJy4gRWFjaCBwYXJ0IG11c3QgYmUgdHdvIGRpZ2l0c1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZ3NbaV0sIDEwKTtcblxuICAgICAgICAgICAgaWYgKHBhcnNlZCA+PSA2MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGltZSBcIiArIHN0cik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1zICs9IHBhcnNlZCAqIE1hdGgucG93KDYwLCAobCAtIGkgLSAxKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbXMgKiAxMDAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVjaW1hbCBwYXJ0IG9mIHRoZSBtaWxsaXNlY29uZCB2YWx1ZSBhcyBuYW5vc2Vjb25kc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1zRmxvYXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSBhbiBpbnRlZ2VyIG51bWJlciBvZiBuYW5vc2Vjb25kcyBpbiB0aGUgcmFuZ2UgWzAsMWU2KVxuICAgICAqXG4gICAgICogRXhhbXBsZTogbmFub1JlbWFpbmVyKDEyMy40NTY3ODkpIC0+IDQ1Njc4OVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hbm9SZW1haW5kZXIobXNGbG9hdCkge1xuICAgICAgICB2YXIgbW9kdWxvID0gMWU2O1xuICAgICAgICB2YXIgcmVtYWluZGVyID0gKG1zRmxvYXQgKiAxZTYpICUgbW9kdWxvO1xuICAgICAgICB2YXIgcG9zaXRpdmVSZW1haW5kZXIgPSByZW1haW5kZXIgPCAwID8gcmVtYWluZGVyICsgbW9kdWxvIDogcmVtYWluZGVyO1xuXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHBvc2l0aXZlUmVtYWluZGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGdyb2sgdGhlIGBub3dgIHBhcmFtZXRlciB0byBjcmVhdGVDbG9jay5cbiAgICAgKiBAcGFyYW0gZXBvY2gge0RhdGV8bnVtYmVyfSB0aGUgc3lzdGVtIHRpbWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRFcG9jaChlcG9jaCkge1xuICAgICAgICBpZiAoIWVwb2NoKSB7IHJldHVybiAwOyB9XG4gICAgICAgIGlmICh0eXBlb2YgZXBvY2guZ2V0VGltZSA9PT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiBlcG9jaC5nZXRUaW1lKCk7IH1cbiAgICAgICAgaWYgKHR5cGVvZiBlcG9jaCA9PT0gXCJudW1iZXJcIikgeyByZXR1cm4gZXBvY2g7IH1cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm5vdyBzaG91bGQgYmUgbWlsbGlzZWNvbmRzIHNpbmNlIFVOSVggZXBvY2hcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5SYW5nZShmcm9tLCB0bywgdGltZXIpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVyICYmIHRpbWVyLmNhbGxBdCA+PSBmcm9tICYmIHRpbWVyLmNhbGxBdCA8PSB0bztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaXJyb3JEYXRlUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICB2YXIgcHJvcDtcbiAgICAgICAgZm9yIChwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBzcGVjaWFsIG5vdyBpbXBsZW1lbnRhdGlvblxuICAgICAgICBpZiAoc291cmNlLm5vdykge1xuICAgICAgICAgICAgdGFyZ2V0Lm5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmNsb2NrLm5vdztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0Lm5vdztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBzcGVjaWFsIHRvU291cmNlIGltcGxlbWVudGF0aW9uXG4gICAgICAgIGlmIChzb3VyY2UudG9Tb3VyY2UpIHtcbiAgICAgICAgICAgIHRhcmdldC50b1NvdXJjZSA9IGZ1bmN0aW9uIHRvU291cmNlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UudG9Tb3VyY2UoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGFyZ2V0LnRvU291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IHNwZWNpYWwgdG9TdHJpbmcgaW1wbGVtZW50YXRpb25cbiAgICAgICAgdGFyZ2V0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSA9IHNvdXJjZS5wcm90b3R5cGU7XG4gICAgICAgIHRhcmdldC5wYXJzZSA9IHNvdXJjZS5wYXJzZTtcbiAgICAgICAgdGFyZ2V0LlVUQyA9IHNvdXJjZS5VVEM7XG4gICAgICAgIHRhcmdldC5wcm90b3R5cGUudG9VVENTdHJpbmcgPSBzb3VyY2UucHJvdG90eXBlLnRvVVRDU3RyaW5nO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGF0ZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gQ2xvY2tEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbXMpIHtcbiAgICAgICAgICAgIC8vIERlZmVuc2l2ZSBhbmQgdmVyYm9zZSB0byBhdm9pZCBwb3RlbnRpYWwgaGFybSBpbiBwYXNzaW5nXG4gICAgICAgICAgICAvLyBleHBsaWNpdCB1bmRlZmluZWQgd2hlbiB1c2VyIGRvZXMgbm90IHBhc3MgYXJndW1lbnRcbiAgICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKENsb2NrRGF0ZS5jbG9jay5ub3cpO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIpO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoKTtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIpO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUsIHNlY29uZCk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoLCBkYXRlLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pcnJvckRhdGVQcm9wZXJ0aWVzKENsb2NrRGF0ZSwgTmF0aXZlRGF0ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZUpvYihjbG9jaywgam9iKSB7XG4gICAgICAgIC8vIGVucXVldWVzIGEgbWljcm90aWNrLWRlZmVycmVkIHRhc2sgLSBlY21hMjYyLyNzZWMtZW5xdWV1ZWpvYlxuICAgICAgICBpZiAoIWNsb2NrLmpvYnMpIHtcbiAgICAgICAgICAgIGNsb2NrLmpvYnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjbG9jay5qb2JzLnB1c2goam9iKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5Kb2JzKGNsb2NrKSB7XG4gICAgICAgIC8vIHJ1bnMgYWxsIG1pY3JvdGljay1kZWZlcnJlZCB0YXNrcyAtIGVjbWEyNjIvI3NlYy1ydW5qb2JzXG4gICAgICAgIGlmICghY2xvY2suam9icykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvY2suam9icy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGpvYiA9IGNsb2NrLmpvYnNbaV07XG4gICAgICAgICAgICBqb2IuZnVuYy5hcHBseShudWxsLCBqb2IuYXJncyk7XG4gICAgICAgICAgICBpZiAoY2xvY2subG9vcExpbWl0ICYmIGkgPiBjbG9jay5sb29wTGltaXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYm9ydGluZyBhZnRlciBydW5uaW5nIFwiICsgY2xvY2subG9vcExpbWl0ICsgXCIgdGltZXJzLCBhc3N1bWluZyBhbiBpbmZpbml0ZSBsb29wIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjbG9jay5qb2JzID0gW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZXIoY2xvY2ssIHRpbWVyKSB7XG4gICAgICAgIGlmICh0aW1lci5mdW5jID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQgdG8gdGltZXIgY2FsbHNcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lci50eXBlID0gdGltZXIuaW1tZWRpYXRlID8gXCJJbW1lZGlhdGVcIiA6IFwiVGltZW91dFwiO1xuXG4gICAgICAgIGlmICh0aW1lci5oYXNPd25Qcm9wZXJ0eShcImRlbGF5XCIpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTnVtYmVyRmluaXRlKHRpbWVyLmRlbGF5KSkge1xuICAgICAgICAgICAgICAgIHRpbWVyLmRlbGF5ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpbWVyLmRlbGF5ID0gdGltZXIuZGVsYXkgPiBtYXhUaW1lb3V0ID8gMSA6IHRpbWVyLmRlbGF5O1xuICAgICAgICAgICAgdGltZXIuZGVsYXkgPSBNYXRoLm1heCgwLCB0aW1lci5kZWxheSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGltZXIuaGFzT3duUHJvcGVydHkoXCJpbnRlcnZhbFwiKSkge1xuICAgICAgICAgICAgdGltZXIudHlwZSA9IFwiSW50ZXJ2YWxcIjtcbiAgICAgICAgICAgIHRpbWVyLmludGVydmFsID0gdGltZXIuaW50ZXJ2YWwgPiBtYXhUaW1lb3V0ID8gMSA6IHRpbWVyLmludGVydmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWVyLmhhc093blByb3BlcnR5KFwiYW5pbWF0aW9uXCIpKSB7XG4gICAgICAgICAgICB0aW1lci50eXBlID0gXCJBbmltYXRpb25GcmFtZVwiO1xuICAgICAgICAgICAgdGltZXIuYW5pbWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2xvY2sudGltZXJzKSB7XG4gICAgICAgICAgICBjbG9jay50aW1lcnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWVyLmlkID0gdW5pcXVlVGltZXJJZCsrO1xuICAgICAgICB0aW1lci5jcmVhdGVkQXQgPSBjbG9jay5ub3c7XG4gICAgICAgIHRpbWVyLmNhbGxBdCA9IGNsb2NrLm5vdyArIChwYXJzZUludCh0aW1lci5kZWxheSkgfHwgKGNsb2NrLmR1cmluZ1RpY2sgPyAxIDogMCkpO1xuXG4gICAgICAgIGNsb2NrLnRpbWVyc1t0aW1lci5pZF0gPSB0aW1lcjtcblxuICAgICAgICBpZiAoYWRkVGltZXJSZXR1cm5zT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVzID0ge1xuICAgICAgICAgICAgICAgIGlkOiB0aW1lci5pZCxcbiAgICAgICAgICAgICAgICByZWY6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlczsgfSxcbiAgICAgICAgICAgICAgICB1bnJlZjogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzOyB9LFxuICAgICAgICAgICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlczsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGltZXIuaWQ7XG4gICAgfVxuXG4gICAgLyogZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOiBcIm9mZlwiICovXG4gICAgZnVuY3Rpb24gY29tcGFyZVRpbWVycyhhLCBiKSB7XG4gICAgICAgIC8vIFNvcnQgZmlyc3QgYnkgYWJzb2x1dGUgdGltaW5nXG4gICAgICAgIGlmIChhLmNhbGxBdCA8IGIuY2FsbEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuY2FsbEF0ID4gYi5jYWxsQXQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGltbWVkaWF0ZSwgaW1tZWRpYXRlIHRpbWVycyB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKGEuaW1tZWRpYXRlICYmICFiLmltbWVkaWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYS5pbW1lZGlhdGUgJiYgYi5pbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGNyZWF0aW9uIHRpbWUsIGVhcmxpZXItY3JlYXRlZCB0aW1lcnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChhLmNyZWF0ZWRBdCA8IGIuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuY3JlYXRlZEF0ID4gYi5jcmVhdGVkQXQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGlkLCBsb3dlci1pZCB0aW1lcnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChhLmlkIDwgYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmlkID4gYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcyB0aW1lciBpZHMgYXJlIHVuaXF1ZSwgbm8gZmFsbGJhY2sgYDBgIGlzIG5lY2Vzc2FyeVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCBmcm9tLCB0bykge1xuICAgICAgICB2YXIgdGltZXJzID0gY2xvY2sudGltZXJzO1xuICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuICAgICAgICB2YXIgaWQsIGlzSW5SYW5nZTtcblxuICAgICAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBpc0luUmFuZ2UgPSBpblJhbmdlKGZyb20sIHRvLCB0aW1lcnNbaWRdKTtcblxuICAgICAgICAgICAgICAgIGlmIChpc0luUmFuZ2UgJiYgKCF0aW1lciB8fCBjb21wYXJlVGltZXJzKHRpbWVyLCB0aW1lcnNbaWRdKSA9PT0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIgPSB0aW1lcnNbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaXJzdFRpbWVyKGNsb2NrKSB7XG4gICAgICAgIHZhciB0aW1lcnMgPSBjbG9jay50aW1lcnM7XG4gICAgICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgICAgIHZhciBpZDtcblxuICAgICAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbWVyIHx8IGNvbXBhcmVUaW1lcnModGltZXIsIHRpbWVyc1tpZF0pID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gdGltZXJzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGFzdFRpbWVyKGNsb2NrKSB7XG4gICAgICAgIHZhciB0aW1lcnMgPSBjbG9jay50aW1lcnM7XG4gICAgICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgICAgIHZhciBpZDtcblxuICAgICAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbWVyIHx8IGNvbXBhcmVUaW1lcnModGltZXIsIHRpbWVyc1tpZF0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IHRpbWVyc1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxUaW1lcihjbG9jaywgdGltZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aW1lci5pbnRlcnZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgY2xvY2sudGltZXJzW3RpbWVyLmlkXS5jYWxsQXQgKz0gdGltZXIuaW50ZXJ2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgY2xvY2sudGltZXJzW3RpbWVyLmlkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGltZXIuZnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aW1lci5mdW5jLmFwcGx5KG51bGwsIHRpbWVyLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogZXNsaW50IG5vLWV2YWw6IFwib2ZmXCIgKi9cbiAgICAgICAgICAgIGV2YWwodGltZXIuZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCB0dHlwZSkge1xuICAgICAgICBpZiAoIXRpbWVySWQpIHtcbiAgICAgICAgICAgIC8vIG51bGwgYXBwZWFycyB0byBiZSBhbGxvd2VkIGluIG1vc3QgYnJvd3NlcnMsIGFuZCBhcHBlYXJzIHRvIGJlXG4gICAgICAgICAgICAvLyByZWxpZWQgdXBvbiBieSBzb21lIGxpYnJhcmllcywgbGlrZSBCb290c3RyYXAgY2Fyb3VzZWxcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2xvY2sudGltZXJzKSB7XG4gICAgICAgICAgICBjbG9jay50aW1lcnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluIE5vZGUsIHRpbWVySWQgaXMgYW4gb2JqZWN0IHdpdGggLnJlZigpLy51bnJlZigpLCBhbmRcbiAgICAgICAgLy8gaXRzIC5pZCBmaWVsZCBpcyB0aGUgYWN0dWFsIHRpbWVyIGlkLlxuICAgICAgICBpZiAodHlwZW9mIHRpbWVySWQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRpbWVySWQgPSB0aW1lcklkLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsb2NrLnRpbWVycy5oYXNPd25Qcm9wZXJ0eSh0aW1lcklkKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgSUQgbWF0Y2hlcyBhIHRpbWVyIG9mIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgICAgICAgIHZhciB0aW1lciA9IGNsb2NrLnRpbWVyc1t0aW1lcklkXTtcbiAgICAgICAgICAgIGlmICh0aW1lci50eXBlID09PSB0dHlwZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjbG9jay50aW1lcnNbdGltZXJJZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjbGVhciA9IHR0eXBlID09PSBcIkFuaW1hdGlvbkZyYW1lXCIgPyBcImNhbmNlbEFuaW1hdGlvbkZyYW1lXCIgOiBcImNsZWFyXCIgKyB0dHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgc2NoZWR1bGUgPSB0aW1lci50eXBlID09PSBcIkFuaW1hdGlvbkZyYW1lXCIgPyBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiIDogXCJzZXRcIiArIHRpbWVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNsZWFyIHRpbWVyOiB0aW1lciBjcmVhdGVkIHdpdGggXCIgKyBzY2hlZHVsZVxuICAgICAgICAgICAgICAgICAgICArIFwiKCkgYnV0IGNsZWFyZWQgd2l0aCBcIiArIGNsZWFyICsgXCIoKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaW5zdGFsbChjbG9jaywgdGFyZ2V0LCBjb25maWcpIHtcbiAgICAgICAgdmFyIG1ldGhvZCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsO1xuICAgICAgICB2YXIgaW5zdGFsbGVkSHJUaW1lID0gXCJfaHJ0aW1lXCI7XG4gICAgICAgIHZhciBpbnN0YWxsZWROZXh0VGljayA9IFwiX25leHRUaWNrXCI7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGNsb2NrLm1ldGhvZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBtZXRob2QgPSBjbG9jay5tZXRob2RzW2ldO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJocnRpbWVcIiAmJiB0YXJnZXQucHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wcm9jZXNzLmhydGltZSA9IGNsb2NrW2luc3RhbGxlZEhyVGltZV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJuZXh0VGlja1wiICYmIHRhcmdldC5wcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnByb2Nlc3MubmV4dFRpY2sgPSBjbG9ja1tpbnN0YWxsZWROZXh0VGlja107XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJwZXJmb3JtYW5jZVwiKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBjbG9ja1tcIl9cIiArIG1ldGhvZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRbbWV0aG9kXSAmJiB0YXJnZXRbbWV0aG9kXS5oYWRPd25Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGNsb2NrW1wiX1wiICsgbWV0aG9kXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJjbGVhckludGVydmFsXCIgJiYgY29uZmlnLnNob3VsZEFkdmFuY2VUaW1lID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXShjbG9jay5hdHRhY2hlZEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W21ldGhvZF07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgeyAvKiBlc2xpbnQgZW1wdHktYmxvY2s6IFwib2ZmXCIgKi8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgZXhlY3V0aW9ucyB3aGljaCB3aWxsIGNvbXBsZXRlbHkgcmVtb3ZlIHRoZXNlIHByb3BzXG4gICAgICAgIGNsb2NrLm1ldGhvZHMgPSBbXTtcblxuICAgICAgICAvLyByZXR1cm4gcGVuZGluZyB0aW1lcnMsIHRvIGVuYWJsZSBjaGVja2luZyB3aGF0IHRpbWVycyByZW1haW5lZCBvbiB1bmluc3RhbGxcbiAgICAgICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY2xvY2sudGltZXJzKS5tYXAoZnVuY3Rpb24gbWFwcGVyKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLnRpbWVyc1trZXldO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoaWphY2tNZXRob2QodGFyZ2V0LCBtZXRob2QsIGNsb2NrKSB7XG4gICAgICAgIHZhciBwcm9wO1xuICAgICAgICBjbG9ja1ttZXRob2RdLmhhZE93blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY2xvY2tbXCJfXCIgKyBtZXRob2RdID0gdGFyZ2V0W21ldGhvZF07XG5cbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJEYXRlXCIpIHtcbiAgICAgICAgICAgIHZhciBkYXRlID0gbWlycm9yRGF0ZVByb3BlcnRpZXMoY2xvY2tbbWV0aG9kXSwgdGFyZ2V0W21ldGhvZF0pO1xuICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBkYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJwZXJmb3JtYW5jZVwiKSB7XG4gICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGNsb2NrW21ldGhvZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2tbbWV0aG9kXS5hcHBseShjbG9jaywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAocHJvcCBpbiBjbG9ja1ttZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsb2NrW21ldGhvZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF1bcHJvcF0gPSBjbG9ja1ttZXRob2RdW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldFttZXRob2RdLmNsb2NrID0gY2xvY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9JbnRlcnZhbFRpY2soY2xvY2ssIGFkdmFuY2VUaW1lRGVsdGEpIHtcbiAgICAgICAgY2xvY2sudGljayhhZHZhbmNlVGltZURlbHRhKTtcbiAgICB9XG5cbiAgICB2YXIgdGltZXJzID0ge1xuICAgICAgICBzZXRUaW1lb3V0OiBfZ2xvYmFsLnNldFRpbWVvdXQsXG4gICAgICAgIGNsZWFyVGltZW91dDogX2dsb2JhbC5jbGVhclRpbWVvdXQsXG4gICAgICAgIHNldEltbWVkaWF0ZTogX2dsb2JhbC5zZXRJbW1lZGlhdGUsXG4gICAgICAgIGNsZWFySW1tZWRpYXRlOiBfZ2xvYmFsLmNsZWFySW1tZWRpYXRlLFxuICAgICAgICBzZXRJbnRlcnZhbDogX2dsb2JhbC5zZXRJbnRlcnZhbCxcbiAgICAgICAgY2xlYXJJbnRlcnZhbDogX2dsb2JhbC5jbGVhckludGVydmFsLFxuICAgICAgICBEYXRlOiBfZ2xvYmFsLkRhdGVcbiAgICB9O1xuXG4gICAgaWYgKGhydGltZVByZXNlbnQpIHtcbiAgICAgICAgdGltZXJzLmhydGltZSA9IF9nbG9iYWwucHJvY2Vzcy5ocnRpbWU7XG4gICAgfVxuXG4gICAgaWYgKG5leHRUaWNrUHJlc2VudCkge1xuICAgICAgICB0aW1lcnMubmV4dFRpY2sgPSBfZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2s7XG4gICAgfVxuXG4gICAgaWYgKHBlcmZvcm1hbmNlUHJlc2VudCkge1xuICAgICAgICB0aW1lcnMucGVyZm9ybWFuY2UgPSBfZ2xvYmFsLnBlcmZvcm1hbmNlO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0QW5pbWF0aW9uRnJhbWVQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBfZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlTWljcm90YXNrUHJlc2VudCkge1xuICAgICAgICB0aW1lcnMucXVldWVNaWNyb3Rhc2sgPSBfZ2xvYmFsLnF1ZXVlTWljcm90YXNrO1xuICAgIH1cblxuICAgIGlmIChjYW5jZWxBbmltYXRpb25GcmFtZVByZXNlbnQpIHtcbiAgICAgICAgdGltZXJzLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gX2dsb2JhbC5jYW5jZWxBbmltYXRpb25GcmFtZTtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkbGVDYWxsYmFja1ByZXNlbnQpIHtcbiAgICAgICAgdGltZXJzLnJlcXVlc3RJZGxlQ2FsbGJhY2sgPSBfZ2xvYmFsLnJlcXVlc3RJZGxlQ2FsbGJhY2s7XG4gICAgfVxuXG4gICAgaWYgKGNhbmNlbElkbGVDYWxsYmFja1ByZXNlbnQpIHtcbiAgICAgICAgdGltZXJzLmNhbmNlbElkbGVDYWxsYmFjayA9IF9nbG9iYWwuY2FuY2VsSWRsZUNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIga3MgPSBbXTtcbiAgICAgICAgdmFyIGtleTtcblxuICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGtzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHN0YXJ0IHtEYXRlfG51bWJlcn0gdGhlIHN5c3RlbSB0aW1lIC0gbm9uLWludGVnZXIgdmFsdWVzIGFyZSBmbG9vcmVkXG4gICAgICogQHBhcmFtIGxvb3BMaW1pdCB7bnVtYmVyfSAgbWF4aW11bSBudW1iZXIgb2YgdGltZXJzIHRoYXQgd2lsbCBiZSBydW4gd2hlbiBjYWxsaW5nIHJ1bkFsbCgpXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ2xvY2soc3RhcnQsIGxvb3BMaW1pdCkge1xuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3IoZ2V0RXBvY2goc3RhcnQpKTtcbiAgICAgICAgbG9vcExpbWl0ID0gbG9vcExpbWl0IHx8IDEwMDA7XG4gICAgICAgIHZhciBuYW5vcyA9IDA7XG4gICAgICAgIHZhciBhZGp1c3RlZFN5c3RlbVRpbWUgPSBbMCwgMF07IC8vIFttaWxsaXMsIG5hbm9yZW1haW5kZXJdXG5cbiAgICAgICAgaWYgKE5hdGl2ZURhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGdsb2JhbCBzY29wZSBkb2Vzbid0IGhhdmUgYSBgRGF0ZWAgb2JqZWN0XCJcbiAgICAgICAgICAgICAgICArIFwiIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Npbm9uanMvc2lub24vaXNzdWVzLzE4NTIjaXNzdWVjb21tZW50LTQxOTYyMjc4MClcIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2xvY2sgPSB7XG4gICAgICAgICAgICBub3c6IHN0YXJ0LFxuICAgICAgICAgICAgdGltZW91dHM6IHt9LFxuICAgICAgICAgICAgRGF0ZTogY3JlYXRlRGF0ZSgpLFxuICAgICAgICAgICAgbG9vcExpbWl0OiBsb29wTGltaXRcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5EYXRlLmNsb2NrID0gY2xvY2s7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VGltZVRvTmV4dEZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIDE2IC0gKChjbG9jay5ub3cgLSBzdGFydCkgJSAxNik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBocnRpbWUocHJldikge1xuICAgICAgICAgICAgdmFyIG1pbGxpc1NpbmNlU3RhcnQgPSBjbG9jay5ub3cgLSBhZGp1c3RlZFN5c3RlbVRpbWVbMF0gLSBzdGFydDtcbiAgICAgICAgICAgIHZhciBzZWNzU2luY2VTdGFydCA9IE1hdGguZmxvb3IoIG1pbGxpc1NpbmNlU3RhcnQgLyAxMDAwKTtcbiAgICAgICAgICAgIHZhciByZW1haW5kZXJJbk5hbm9zID0gKG1pbGxpc1NpbmNlU3RhcnQgLSBzZWNzU2luY2VTdGFydCAqIDFlMyApICogMWU2ICsgbmFub3MgLSBhZGp1c3RlZFN5c3RlbVRpbWVbMV07XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByZXYpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBwcmV2WzFdID4gMWU5ICkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTnVtYmVyIG9mIG5hbm9zZWNvbmRzIGNhbid0IGV4Y2VlZCBhIGJpbGxpb25cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG9sZFNlY3MgPSBwcmV2WzBdO1xuICAgICAgICAgICAgICAgIHZhciBuYW5vRGlmZiA9IHJlbWFpbmRlckluTmFub3MgLSBwcmV2WzFdO1xuICAgICAgICAgICAgICAgIHZhciBzZWNEaWZmID0gc2Vjc1NpbmNlU3RhcnQgLSBvbGRTZWNzO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbm9EaWZmIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBuYW5vRGlmZiArPSAxZTk7XG4gICAgICAgICAgICAgICAgICAgIHNlY0RpZmYgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW3NlY0RpZmYsIG5hbm9EaWZmXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbc2Vjc1NpbmNlU3RhcnQsIHJlbWFpbmRlckluTmFub3NdO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvY2sucmVxdWVzdElkbGVDYWxsYmFjayA9IGZ1bmN0aW9uIHJlcXVlc3RJZGxlQ2FsbGJhY2soZnVuYywgdGltZW91dCkge1xuICAgICAgICAgICAgdmFyIHRpbWVUb05leHRJZGxlUGVyaW9kID0gMDtcblxuICAgICAgICAgICAgaWYgKGNsb2NrLmNvdW50VGltZXJzKCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGltZVRvTmV4dElkbGVQZXJpb2QgPSA1MDsgLy8gY29uc3QgZm9yIG5vd1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksXG4gICAgICAgICAgICAgICAgZGVsYXk6IHR5cGVvZiB0aW1lb3V0ID09PSBcInVuZGVmaW5lZFwiID8gdGltZVRvTmV4dElkbGVQZXJpb2QgOiBNYXRoLm1pbih0aW1lb3V0LCB0aW1lVG9OZXh0SWRsZVBlcmlvZClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmlkIHx8IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jYW5jZWxJZGxlQ2FsbGJhY2sgPSBmdW5jdGlvbiBjYW5jZWxJZGxlQ2FsbGJhY2sodGltZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIFwiVGltZW91dFwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksXG4gICAgICAgICAgICAgICAgZGVsYXk6IHRpbWVvdXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIGNsZWFyVGltZW91dCh0aW1lcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJUaW1lb3V0XCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLm5leHRUaWNrID0gZnVuY3Rpb24gbmV4dFRpY2soZnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGVucXVldWVKb2IoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnF1ZXVlTWljcm90YXNrID0gZnVuY3Rpb24gcXVldWVNaWNyb3Rhc2soZnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLm5leHRUaWNrKGZ1bmMpOyAvLyBleHBsaWNpdGx5IGRyb3AgYWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uIHNldEludGVydmFsKGZ1bmMsIHRpbWVvdXQpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBwYXJzZUludCh0aW1lb3V0LCAxMCk7XG4gICAgICAgICAgICByZXR1cm4gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksXG4gICAgICAgICAgICAgICAgZGVsYXk6IHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgaW50ZXJ2YWw6IHRpbWVvdXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbiBjbGVhckludGVydmFsKHRpbWVySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCBcIkludGVydmFsXCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmdW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jbGVhckltbWVkaWF0ZSA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKHRpbWVySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCBcIkltbWVkaWF0ZVwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jb3VudFRpbWVycyA9IGZ1bmN0aW9uIGNvdW50VGltZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNsb2NrLnRpbWVycyB8fCB7fSkubGVuZ3RoO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGRlbGF5OiBnZXRUaW1lVG9OZXh0RnJhbWUoKSxcbiAgICAgICAgICAgICAgICBhcmdzOiBbY2xvY2subm93ICsgZ2V0VGltZVRvTmV4dEZyYW1lKCldLFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuaWQgfHwgcmVzdWx0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZXIoY2xvY2ssIHRpbWVySWQsIFwiQW5pbWF0aW9uRnJhbWVcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucnVuTWljcm90YXNrcyA9IGZ1bmN0aW9uIHJ1bk1pY3JvdGFza3MoKSB7XG4gICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHt0aWNrVmFsdWV9IHtTdHJpbmd8TnVtYmVyfSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIGEgaHVtYW4tcmVhZGFibGUgdmFsdWUgbGlrZSBcIjAxOjExOjE1XCJcbiAgICAgICAgKi9cbiAgICAgICAgY2xvY2sudGljayA9IGZ1bmN0aW9uIHRpY2sodGlja1ZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgbXNGbG9hdCA9IHR5cGVvZiB0aWNrVmFsdWUgPT09IFwibnVtYmVyXCIgPyB0aWNrVmFsdWUgOiBwYXJzZVRpbWUodGlja1ZhbHVlKTtcbiAgICAgICAgICAgIHZhciBtcyA9IE1hdGguZmxvb3IobXNGbG9hdCk7XG4gICAgICAgICAgICB2YXIgcmVtYWluZGVyID0gbmFub1JlbWFpbmRlcihtc0Zsb2F0KTtcbiAgICAgICAgICAgIHZhciBuYW5vc1RvdGFsID0gbmFub3MgKyByZW1haW5kZXI7XG4gICAgICAgICAgICB2YXIgdGlja1RvID0gY2xvY2subm93ICsgbXM7XG5cbiAgICAgICAgICAgIGlmIChtc0Zsb2F0IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJOZWdhdGl2ZSB0aWNrcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRqdXN0IGZvciBwb3NpdGl2ZSBvdmVyZmxvd1xuICAgICAgICAgICAgaWYgKG5hbm9zVG90YWwgPj0gMWU2KSB7XG4gICAgICAgICAgICAgICAgdGlja1RvICs9IDE7XG4gICAgICAgICAgICAgICAgbmFub3NUb3RhbCAtPSAxZTY7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5hbm9zID0gbmFub3NUb3RhbDtcbiAgICAgICAgICAgIHZhciB0aWNrRnJvbSA9IGNsb2NrLm5vdztcbiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IGNsb2NrLm5vdztcbiAgICAgICAgICAgIHZhciB0aW1lciwgZmlyc3RFeGNlcHRpb24sIG9sZE5vdztcblxuICAgICAgICAgICAgY2xvY2suZHVyaW5nVGljayA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIHBlcmZvcm0gbWljcm90YXNrc1xuICAgICAgICAgICAgb2xkTm93ID0gY2xvY2subm93O1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICBpZiAob2xkTm93ICE9PSBjbG9jay5ub3cpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wZW5zYXRlIGZvciBhbnkgc2V0U3lzdGVtVGltZSgpIGNhbGwgZHVyaW5nIG1pY3JvdGFzayBjYWxsYmFja1xuICAgICAgICAgICAgICAgIHRpY2tGcm9tICs9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgICAgICB0aWNrVG8gKz0gY2xvY2subm93IC0gb2xkTm93O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwZXJmb3JtIGVhY2ggdGltZXIgaW4gdGhlIHJlcXVlc3RlZCByYW5nZVxuICAgICAgICAgICAgdGltZXIgPSBmaXJzdFRpbWVySW5SYW5nZShjbG9jaywgdGlja0Zyb20sIHRpY2tUbyk7XG4gICAgICAgICAgICB3aGlsZSAodGltZXIgJiYgdGlja0Zyb20gPD0gdGlja1RvKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsb2NrLnRpbWVyc1t0aW1lci5pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGlja0Zyb20gPSB0aW1lci5jYWxsQXQ7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLm5vdyA9IHRpbWVyLmNhbGxBdDtcbiAgICAgICAgICAgICAgICAgICAgb2xkTm93ID0gY2xvY2subm93O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsVGltZXIoY2xvY2ssIHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNlcHRpb24gPSBmaXJzdEV4Y2VwdGlvbiB8fCBlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcGVuc2F0ZSBmb3IgYW55IHNldFN5c3RlbVRpbWUoKSBjYWxsIGR1cmluZyB0aW1lciBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAob2xkTm93ICE9PSBjbG9jay5ub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tGcm9tICs9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tUbyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aW1lciA9IGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCBwcmV2aW91cywgdGlja1RvKTtcbiAgICAgICAgICAgICAgICBwcmV2aW91cyA9IHRpY2tGcm9tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwZXJmb3JtIHByb2Nlc3MubmV4dFRpY2soKXMgYWdhaW5cbiAgICAgICAgICAgIG9sZE5vdyA9IGNsb2NrLm5vdztcbiAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgaWYgKG9sZE5vdyAhPT0gY2xvY2subm93KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcGVuc2F0ZSBmb3IgYW55IHNldFN5c3RlbVRpbWUoKSBjYWxsIGR1cmluZyBwcm9jZXNzLm5leHRUaWNrKCkgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICB0aWNrRnJvbSArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgdGlja1RvICs9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gY29ybmVyIGNhc2U6IGR1cmluZyBydW5Kb2JzLCBuZXcgdGltZXJzIHdlcmUgc2NoZWR1bGVkIHdoaWNoIGNvdWxkIGJlIGluIHRoZSByYW5nZSBbY2xvY2subm93LCB0aWNrVG9dXG4gICAgICAgICAgICB0aW1lciA9IGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCB0aWNrRnJvbSwgdGlja1RvKTtcbiAgICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLnRpY2sodGlja1RvIC0gY2xvY2subm93KTsgLy8gZG8gaXQgYWxsIGFnYWluIC0gZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlcXVlc3RlZCByYW5nZVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNlcHRpb24gPSBmaXJzdEV4Y2VwdGlvbiB8fCBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gdGltZXJzIHJlbWFpbmluZyBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlOiBtb3ZlIHRoZSBjbG9jayBhbGwgdGhlIHdheSB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgY2xvY2subm93ID0gdGlja1RvO1xuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIG5hbm9zXG4gICAgICAgICAgICAgICAgbmFub3MgPSBuYW5vc1RvdGFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0RXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZmlyc3RFeGNlcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLm5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICB2YXIgdGltZXIgPSBmaXJzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgIGlmICghdGltZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbG9jay5kdXJpbmdUaWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2xvY2subm93ID0gdGltZXIuY2FsbEF0O1xuICAgICAgICAgICAgICAgIGNhbGxUaW1lcihjbG9jaywgdGltZXIpO1xuICAgICAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9jay5ub3c7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5ydW5BbGwgPSBmdW5jdGlvbiBydW5BbGwoKSB7XG4gICAgICAgICAgICB2YXIgbnVtVGltZXJzLCBpO1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xvY2subG9vcExpbWl0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsb2NrLnRpbWVycykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG51bVRpbWVycyA9IGtleXMoY2xvY2sudGltZXJzKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG51bVRpbWVycyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsb2NrLm5leHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJvcnRpbmcgYWZ0ZXIgcnVubmluZyBcIiArIGNsb2NrLmxvb3BMaW1pdCArIFwiIHRpbWVycywgYXNzdW1pbmcgYW4gaW5maW5pdGUgbG9vcCFcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucnVuVG9GcmFtZSA9IGZ1bmN0aW9uIHJ1blRvRnJhbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvY2sudGljayhnZXRUaW1lVG9OZXh0RnJhbWUoKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucnVuVG9MYXN0ID0gZnVuY3Rpb24gcnVuVG9MYXN0KCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyID0gbGFzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgIGlmICghdGltZXIpIHtcbiAgICAgICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY2xvY2sudGljayh0aW1lci5jYWxsQXQgLSBjbG9jay5ub3cpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgICAgICBuYW5vcyA9IDA7XG4gICAgICAgICAgICBjbG9jay50aW1lcnMgPSB7fTtcbiAgICAgICAgICAgIGNsb2NrLmpvYnMgPSBbXTtcbiAgICAgICAgICAgIGNsb2NrLm5vdyA9IHN0YXJ0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnNldFN5c3RlbVRpbWUgPSBmdW5jdGlvbiBzZXRTeXN0ZW1UaW1lKHN5c3RlbVRpbWUpIHtcbiAgICAgICAgICAgIC8vIGRldGVybWluZSB0aW1lIGRpZmZlcmVuY2VcbiAgICAgICAgICAgIHZhciBuZXdOb3cgPSBnZXRFcG9jaChzeXN0ZW1UaW1lKTtcbiAgICAgICAgICAgIHZhciBkaWZmZXJlbmNlID0gbmV3Tm93IC0gY2xvY2subm93O1xuICAgICAgICAgICAgdmFyIGlkLCB0aW1lcjtcblxuICAgICAgICAgICAgYWRqdXN0ZWRTeXN0ZW1UaW1lWzBdID0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgIGFkanVzdGVkU3lzdGVtVGltZVsxXSA9IG5hbm9zO1xuICAgICAgICAgICAgLy8gdXBkYXRlICdzeXN0ZW0gY2xvY2snXG4gICAgICAgICAgICBjbG9jay5ub3cgPSBuZXdOb3c7XG4gICAgICAgICAgICBuYW5vcyA9IDA7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aW1lcnMgYW5kIGludGVydmFscyB0byBrZWVwIHRoZW0gc3RhYmxlXG4gICAgICAgICAgICBmb3IgKGlkIGluIGNsb2NrLnRpbWVycykge1xuICAgICAgICAgICAgICAgIGlmIChjbG9jay50aW1lcnMuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gY2xvY2sudGltZXJzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIuY3JlYXRlZEF0ICs9IGRpZmZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyLmNhbGxBdCArPSBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocGVyZm9ybWFuY2VQcmVzZW50KSB7XG4gICAgICAgICAgICBjbG9jay5wZXJmb3JtYW5jZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChoYXNQZXJmb3JtYW5jZVByb3RvdHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm90byA9IF9nbG9iYWwuUGVyZm9ybWFuY2UucHJvdG90eXBlO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sucGVyZm9ybWFuY2VbbmFtZV0gPSBOT09QO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xvY2sucGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gbG9sZXhOb3coKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhydCA9IGhydGltZSgpO1xuICAgICAgICAgICAgICAgIHZhciBtaWxsaXMgPSAoaHJ0WzBdICogMTAwMCArIGhydFsxXSAvIDFlNik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pbGxpcztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChocnRpbWVQcmVzZW50KSB7XG4gICAgICAgICAgICBjbG9jay5ocnRpbWUgPSBocnRpbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xvY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmZpZyB7T2JqZWN0fSBvcHRpb25hbCBjb25maWdcbiAgICAgKiBAcGFyYW0gY29uZmlnLnRhcmdldCB7T2JqZWN0fSB0aGUgdGFyZ2V0IHRvIGluc3RhbGwgdGltZXJzIGluIChkZWZhdWx0IGB3aW5kb3dgKVxuICAgICAqIEBwYXJhbSBjb25maWcubm93IHtudW1iZXJ8RGF0ZX0gIGEgbnVtYmVyIChpbiBtaWxsaXNlY29uZHMpIG9yIGEgRGF0ZSBvYmplY3QgKGRlZmF1bHQgZXBvY2gpXG4gICAgICogQHBhcmFtIGNvbmZpZy50b0Zha2Uge3N0cmluZ1tdfSBuYW1lcyBvZiB0aGUgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBmYWtlZC5cbiAgICAgKiBAcGFyYW0gY29uZmlnLmxvb3BMaW1pdCB7bnVtYmVyfSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXJzIHRoYXQgd2lsbCBiZSBydW4gd2hlbiBjYWxsaW5nIHJ1bkFsbCgpXG4gICAgICogQHBhcmFtIGNvbmZpZy5zaG91bGRBZHZhbmNlVGltZSB7Qm9vbGVhbn0gdGVsbHMgbG9sZXggdG8gaW5jcmVtZW50IG1vY2tlZCB0aW1lIGF1dG9tYXRpY2FsbHkgKGRlZmF1bHQgZmFsc2UpXG4gICAgICogQHBhcmFtIGNvbmZpZy5hZHZhbmNlVGltZURlbHRhIHtOdW1iZXJ9IGluY3JlbWVudCBtb2NrZWQgdGltZSBldmVyeSA8PGFkdmFuY2VUaW1lRGVsdGE+PiBtcyAoZGVmYXVsdDogMjBtcylcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnN0YWxsKGNvbmZpZykge1xuICAgICAgICBpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxIHx8IGNvbmZpZyBpbnN0YW5jZW9mIERhdGUgfHwgQXJyYXkuaXNBcnJheShjb25maWcpIHx8IHR5cGVvZiBjb25maWcgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsb2xleC5pbnN0YWxsIGNhbGxlZCB3aXRoIFwiICsgU3RyaW5nKGNvbmZpZykgK1xuICAgICAgICAgICAgICAgIFwiIGxvbGV4IDIuMCsgcmVxdWlyZXMgYW4gb2JqZWN0IHBhcmFtZXRlciAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2lub25qcy9sb2xleFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcgPSB0eXBlb2YgY29uZmlnICE9PSBcInVuZGVmaW5lZFwiID8gY29uZmlnIDoge307XG4gICAgICAgIGNvbmZpZy5zaG91bGRBZHZhbmNlVGltZSA9IGNvbmZpZy5zaG91bGRBZHZhbmNlVGltZSB8fCBmYWxzZTtcbiAgICAgICAgY29uZmlnLmFkdmFuY2VUaW1lRGVsdGEgPSBjb25maWcuYWR2YW5jZVRpbWVEZWx0YSB8fCAyMDtcblxuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgdmFyIHRhcmdldCA9IGNvbmZpZy50YXJnZXQgfHwgX2dsb2JhbDtcbiAgICAgICAgdmFyIGNsb2NrID0gY3JlYXRlQ2xvY2soY29uZmlnLm5vdywgY29uZmlnLmxvb3BMaW1pdCk7XG5cbiAgICAgICAgY2xvY2sudW5pbnN0YWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuaW5zdGFsbChjbG9jaywgdGFyZ2V0LCBjb25maWcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLm1ldGhvZHMgPSBjb25maWcudG9GYWtlIHx8IFtdO1xuXG4gICAgICAgIGlmIChjbG9jay5tZXRob2RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gZG8gbm90IGZha2UgbmV4dFRpY2sgYnkgZGVmYXVsdCAtIEdpdEh1YiMxMjZcbiAgICAgICAgICAgIGNsb2NrLm1ldGhvZHMgPSBrZXlzKHRpbWVycykuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtyZXR1cm4ga2V5ICE9PSBcIm5leHRUaWNrXCI7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gY2xvY2subWV0aG9kcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbG9jay5tZXRob2RzW2ldID09PSBcImhydGltZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wcm9jZXNzICYmIHR5cGVvZiB0YXJnZXQucHJvY2Vzcy5ocnRpbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBoaWphY2tNZXRob2QodGFyZ2V0LnByb2Nlc3MsIGNsb2NrLm1ldGhvZHNbaV0sIGNsb2NrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNsb2NrLm1ldGhvZHNbaV0gPT09IFwibmV4dFRpY2tcIikge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucHJvY2VzcyAmJiB0eXBlb2YgdGFyZ2V0LnByb2Nlc3MubmV4dFRpY2sgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBoaWphY2tNZXRob2QodGFyZ2V0LnByb2Nlc3MsIGNsb2NrLm1ldGhvZHNbaV0sIGNsb2NrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjbG9jay5tZXRob2RzW2ldID09PSBcInNldEludGVydmFsXCIgJiYgY29uZmlnLnNob3VsZEFkdmFuY2VUaW1lID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnZhbFRpY2sgPSBkb0ludGVydmFsVGljay5iaW5kKG51bGwsIGNsb2NrLCBjb25maWcuYWR2YW5jZVRpbWVEZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnZhbElkID0gdGFyZ2V0W2Nsb2NrLm1ldGhvZHNbaV1dKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxUaWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFkdmFuY2VUaW1lRGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICBjbG9jay5hdHRhY2hlZEludGVydmFsID0gaW50ZXJ2YWxJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGlqYWNrTWV0aG9kKHRhcmdldCwgY2xvY2subWV0aG9kc1tpXSwgY2xvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsb2NrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHRpbWVyczogdGltZXJzLFxuICAgICAgICBjcmVhdGVDbG9jazogY3JlYXRlQ2xvY2ssXG4gICAgICAgIGluc3RhbGw6IGluc3RhbGwsXG4gICAgICAgIHdpdGhHbG9iYWw6IHdpdGhHbG9iYWxcbiAgICB9O1xufVxuXG52YXIgZGVmYXVsdEltcGxlbWVudGF0aW9uID0gd2l0aEdsb2JhbChnbG9iYWwgfHwgd2luZG93KTtcblxuZXhwb3J0cy50aW1lcnMgPSBkZWZhdWx0SW1wbGVtZW50YXRpb24udGltZXJzO1xuZXhwb3J0cy5jcmVhdGVDbG9jayA9IGRlZmF1bHRJbXBsZW1lbnRhdGlvbi5jcmVhdGVDbG9jaztcbmV4cG9ydHMuaW5zdGFsbCA9IGRlZmF1bHRJbXBsZW1lbnRhdGlvbi5pbnN0YWxsO1xuZXhwb3J0cy53aXRoR2xvYmFsID0gd2l0aEdsb2JhbDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBjYWNoZSBhIHJlZmVyZW5jZSB0byBzZXRUaW1lb3V0LCBzbyB0aGF0IG91ciByZWZlcmVuY2Ugd29uJ3QgYmUgc3R1YmJlZCBvdXRcbi8vIHdoZW4gdXNpbmcgZmFrZSB0aW1lcnMgYW5kIGVycm9ycyB3aWxsIHN0aWxsIGdldCBsb2dnZWRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jam9oYW5zZW4vU2lub24uSlMvaXNzdWVzLzM4MVxudmFyIHJlYWxTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblxuZnVuY3Rpb24gY29uZmlndXJlTG9nZ2VyKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAvLyBGdW5jdGlvbiB3aGljaCBwcmludHMgZXJyb3JzLlxuICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KFwibG9nZ2VyXCIpKSB7XG4gICAgICAgIGNvbmZpZy5sb2dnZXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIC8vIFdoZW4gc2V0IHRvIHRydWUsIGFueSBlcnJvcnMgbG9nZ2VkIHdpbGwgYmUgdGhyb3duIGltbWVkaWF0ZWx5O1xuICAgIC8vIElmIHNldCB0byBmYWxzZSwgdGhlIGVycm9ycyB3aWxsIGJlIHRocm93biBpbiBzZXBhcmF0ZSBleGVjdXRpb24gZnJhbWUuXG4gICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoXCJ1c2VJbW1lZGlhdGVFeGNlcHRpb25zXCIpKSB7XG4gICAgICAgIGNvbmZpZy51c2VJbW1lZGlhdGVFeGNlcHRpb25zID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gd3JhcCByZWFsU2V0VGltZW91dCB3aXRoIHNvbWV0aGluZyB3ZSBjYW4gc3R1YiBpbiB0ZXN0c1xuICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KFwic2V0VGltZW91dFwiKSkge1xuICAgICAgICBjb25maWcuc2V0VGltZW91dCA9IHJlYWxTZXRUaW1lb3V0O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBsb2dFcnJvcihsYWJlbCwgZSkge1xuICAgICAgICB2YXIgbXNnID0gbGFiZWwgKyBcIiB0aHJldyBleGNlcHRpb246IFwiO1xuICAgICAgICB2YXIgZXJyID0geyBuYW1lOiBlLm5hbWUgfHwgbGFiZWwsIG1lc3NhZ2U6IGUubWVzc2FnZSB8fCBlLnRvU3RyaW5nKCksIHN0YWNrOiBlLnN0YWNrIH07XG5cbiAgICAgICAgZnVuY3Rpb24gdGhyb3dMb2dnZWRFcnJvcigpIHtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlID0gbXNnICsgZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcubG9nZ2VyKG1zZyArIFwiW1wiICsgZXJyLm5hbWUgKyBcIl0gXCIgKyBlcnIubWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlcihlcnIuc3RhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy51c2VJbW1lZGlhdGVFeGNlcHRpb25zKSB7XG4gICAgICAgICAgICB0aHJvd0xvZ2dlZEVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuc2V0VGltZW91dCh0aHJvd0xvZ2dlZEVycm9yLCAwKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uZmlndXJlTG9nZ2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBFdmVudCA9IHJlcXVpcmUoXCIuL2V2ZW50XCIpO1xuXG5mdW5jdGlvbiBDdXN0b21FdmVudCh0eXBlLCBjdXN0b21EYXRhLCB0YXJnZXQpIHtcbiAgICB0aGlzLmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHRhcmdldCk7XG4gICAgdGhpcy5kZXRhaWwgPSBjdXN0b21EYXRhLmRldGFpbCB8fCBudWxsO1xufVxuXG5DdXN0b21FdmVudC5wcm90b3R5cGUgPSBuZXcgRXZlbnQoKTtcblxuQ3VzdG9tRXZlbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3VzdG9tRXZlbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gQ3VzdG9tRXZlbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gZmxhdHRlbk9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICE9PSBPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhcHR1cmU6IEJvb2xlYW4ob3B0aW9ucyksXG4gICAgICAgICAgICBvbmNlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNhcHR1cmU6IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKSxcbiAgICAgICAgb25jZTogQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICBwYXNzaXZlOiBCb29sZWFuKG9wdGlvbnMucGFzc2l2ZSlcbiAgICB9O1xufVxuZnVuY3Rpb24gbm90KGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICFmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5mdW5jdGlvbiBoYXNMaXN0ZW5lckZpbHRlcihsaXN0ZW5lciwgY2FwdHVyZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobGlzdGVuZXJTcGVjKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lclNwZWMuY2FwdHVyZSA9PT0gY2FwdHVyZVxuICAgICAgICAgICAgJiYgbGlzdGVuZXJTcGVjLmxpc3RlbmVyID09PSBsaXN0ZW5lcjtcbiAgICB9O1xufVxuXG52YXIgRXZlbnRUYXJnZXQgPSB7XG4gICAgLy8gaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnR0YXJnZXQtYWRkZXZlbnRsaXN0ZW5lclxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBwcm92aWRlZE9wdGlvbnMpIHtcbiAgICAgICAgLy8gMy4gTGV0IGNhcHR1cmUsIHBhc3NpdmUsIGFuZCBvbmNlIGJlIHRoZSByZXN1bHQgb2YgZmxhdHRlbmluZyBtb3JlIG9wdGlvbnMuXG4gICAgICAgIC8vIEZsYXR0ZW4gcHJvcGVydHkgYmVmb3JlIGV4ZWN1dGluZyBzdGVwIDIsXG4gICAgICAgIC8vIGZldHVyZSBkZXRlY3Rpb24gaXMgdXN1YWxseSBiYXNlZCBvbiByZWdpc3RlcmluZyBoYW5kbGVyIHdpdGggb3B0aW9ucyBvYmplY3QsXG4gICAgICAgIC8vIHRoYXQgaGFzIGdldHRlciBkZWZpbmVkXG4gICAgICAgIC8vIGFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHt9LCB7XG4gICAgICAgIC8vICAgIGdldCBvbmNlKCkgeyBzdXBwb3J0c09uY2UgPSB0cnVlOyB9XG4gICAgICAgIC8vIH0pO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IGZsYXR0ZW5PcHRpb25zKHByb3ZpZGVkT3B0aW9ucyk7XG5cbiAgICAgICAgLy8gMi4gSWYgY2FsbGJhY2sgaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVycyB8fCB7fTtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyc1tldmVudF0gPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50XSB8fCBbXTtcblxuICAgICAgICAvLyA0LiBJZiBjb250ZXh0IG9iamVjdOKAmXMgYXNzb2NpYXRlZCBsaXN0IG9mIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIC8vICAgIGRvZXMgbm90IGNvbnRhaW4gYW4gZXZlbnQgbGlzdGVuZXIgd2hvc2UgdHlwZSBpcyB0eXBlLFxuICAgICAgICAvLyAgICBjYWxsYmFjayBpcyBjYWxsYmFjaywgYW5kIGNhcHR1cmUgaXMgY2FwdHVyZSwgdGhlbiBhcHBlbmRcbiAgICAgICAgLy8gICAgYSBuZXcgZXZlbnQgbGlzdGVuZXIgdG8gaXQsIHdob3NlIHR5cGUgaXMgdHlwZSwgY2FsbGJhY2sgaXNcbiAgICAgICAgLy8gICAgY2FsbGJhY2ssIGNhcHR1cmUgaXMgY2FwdHVyZSwgcGFzc2l2ZSBpcyBwYXNzaXZlLCBhbmQgb25jZSBpcyBvbmNlLlxuICAgICAgICBpZiAoIXRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnRdLnNvbWUoaGFzTGlzdGVuZXJGaWx0ZXIobGlzdGVuZXIsIG9wdGlvbnMuY2FwdHVyZSkpKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgY2FwdHVyZTogb3B0aW9ucy5jYXB0dXJlLFxuICAgICAgICAgICAgICAgIG9uY2U6IG9wdGlvbnMub25jZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZXZlbnR0YXJnZXQtcmVtb3ZlZXZlbnRsaXN0ZW5lclxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBwcm92aWRlZE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50TGlzdGVuZXJzIHx8ICF0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gTGV0IGNhcHR1cmUgYmUgdGhlIHJlc3VsdCBvZiBmbGF0dGVuaW5nIG9wdGlvbnMuXG4gICAgICAgIHZhciBvcHRpb25zID0gZmxhdHRlbk9wdGlvbnMocHJvdmlkZWRPcHRpb25zKTtcblxuICAgICAgICAvLyAzLiBJZiB0aGVyZSBpcyBhbiBldmVudCBsaXN0ZW5lciBpbiB0aGUgYXNzb2NpYXRlZCBsaXN0IG9mXG4gICAgICAgIC8vICAgIGV2ZW50IGxpc3RlbmVycyB3aG9zZSB0eXBlIGlzIHR5cGUsIGNhbGxiYWNrIGlzIGNhbGxiYWNrLFxuICAgICAgICAvLyAgICBhbmQgY2FwdHVyZSBpcyBjYXB0dXJlLCB0aGVuIHNldCB0aGF0IGV2ZW50IGxpc3RlbmVy4oCZc1xuICAgICAgICAvLyAgICByZW1vdmVkIHRvIHRydWUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhc3NvY2lhdGVkIGxpc3Qgb2YgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50XSA9IHRoaXMuZXZlbnRMaXN0ZW5lcnNbZXZlbnRdXG4gICAgICAgICAgICAuZmlsdGVyKG5vdChoYXNMaXN0ZW5lckZpbHRlcihsaXN0ZW5lciwgb3B0aW9ucy5jYXB0dXJlKSkpO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudExpc3RlbmVycyB8fCAhdGhpcy5ldmVudExpc3RlbmVyc1tldmVudC50eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZXZlbnQuZGVmYXVsdFByZXZlbnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciB0eXBlID0gZXZlbnQudHlwZTtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHNlbGYuZXZlbnRMaXN0ZW5lcnNbdHlwZV07XG5cbiAgICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVycywgdGhhdCBzaG91bGQgYmUgZGlzcGF0Y2hlZCBvbmNlXG4gICAgICAgIC8vIGJlZm9yZSBydW5uaW5nIGRpc3BhdGNoIGxvb3AgdG8gYXZvaWQgbmVzdGVkIGRpc3BhdGNoIGlzc3Vlc1xuICAgICAgICBzZWxmLmV2ZW50TGlzdGVuZXJzW3R5cGVdID0gbGlzdGVuZXJzLmZpbHRlcihmdW5jdGlvbiAobGlzdGVuZXJTcGVjKSB7XG4gICAgICAgICAgICByZXR1cm4gIWxpc3RlbmVyU3BlYy5vbmNlO1xuICAgICAgICB9KTtcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyU3BlYykge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJTcGVjLmxpc3RlbmVyO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbChzZWxmLCBldmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZXZlbnQuZGVmYXVsdFByZXZlbnRlZCk7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFRhcmdldDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBFdmVudCh0eXBlLCBidWJibGVzLCBjYW5jZWxhYmxlLCB0YXJnZXQpIHtcbiAgICB0aGlzLmluaXRFdmVudCh0eXBlLCBidWJibGVzLCBjYW5jZWxhYmxlLCB0YXJnZXQpO1xufVxuXG5FdmVudC5wcm90b3R5cGUgPSB7XG4gICAgaW5pdEV2ZW50OiBmdW5jdGlvbiAodHlwZSwgYnViYmxlcywgY2FuY2VsYWJsZSwgdGFyZ2V0KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYnViYmxlcyA9IGJ1YmJsZXM7XG4gICAgICAgIHRoaXMuY2FuY2VsYWJsZSA9IGNhbmNlbGFibGU7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSB0YXJnZXQ7XG4gICAgfSxcblxuICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge30sXG5cbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgRXZlbnQ6IHJlcXVpcmUoXCIuL2V2ZW50XCIpLFxuICAgIFByb2dyZXNzRXZlbnQ6IHJlcXVpcmUoXCIuL3Byb2dyZXNzLWV2ZW50XCIpLFxuICAgIEN1c3RvbUV2ZW50OiByZXF1aXJlKFwiLi9jdXN0b20tZXZlbnRcIiksXG4gICAgRXZlbnRUYXJnZXQ6IHJlcXVpcmUoXCIuL2V2ZW50LXRhcmdldFwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgRXZlbnQgPSByZXF1aXJlKFwiLi9ldmVudFwiKTtcblxuZnVuY3Rpb24gUHJvZ3Jlc3NFdmVudCh0eXBlLCBwcm9ncmVzc0V2ZW50UmF3LCB0YXJnZXQpIHtcbiAgICB0aGlzLmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHRhcmdldCk7XG4gICAgdGhpcy5sb2FkZWQgPSB0eXBlb2YgcHJvZ3Jlc3NFdmVudFJhdy5sb2FkZWQgPT09IFwibnVtYmVyXCIgPyBwcm9ncmVzc0V2ZW50UmF3LmxvYWRlZCA6IG51bGw7XG4gICAgdGhpcy50b3RhbCA9IHR5cGVvZiBwcm9ncmVzc0V2ZW50UmF3LnRvdGFsID09PSBcIm51bWJlclwiID8gcHJvZ3Jlc3NFdmVudFJhdy50b3RhbCA6IG51bGw7XG4gICAgdGhpcy5sZW5ndGhDb21wdXRhYmxlID0gISFwcm9ncmVzc0V2ZW50UmF3LnRvdGFsO1xufVxuXG5Qcm9ncmVzc0V2ZW50LnByb3RvdHlwZSA9IG5ldyBFdmVudCgpO1xuXG5Qcm9ncmVzc0V2ZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFByb2dyZXNzRXZlbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvZ3Jlc3NFdmVudDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbG9sZXggPSByZXF1aXJlKFwibG9sZXhcIik7XG52YXIgZmFrZVNlcnZlciA9IHJlcXVpcmUoXCIuL2luZGV4XCIpO1xuXG5mdW5jdGlvbiBTZXJ2ZXIoKSB7fVxuU2VydmVyLnByb3RvdHlwZSA9IGZha2VTZXJ2ZXI7XG5cbnZhciBmYWtlU2VydmVyV2l0aENsb2NrID0gbmV3IFNlcnZlcigpO1xuXG5mYWtlU2VydmVyV2l0aENsb2NrLmFkZFJlcXVlc3QgPSBmdW5jdGlvbiBhZGRSZXF1ZXN0KHhocikge1xuICAgIGlmICh4aHIuYXN5bmMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0LmNsb2NrID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNsb2NrID0gc2V0VGltZW91dC5jbG9jaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xvY2sgPSBsb2xleC5pbnN0YWxsKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2xvY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvbmdlc3RUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgY2xvY2tTZXRUaW1lb3V0ID0gdGhpcy5jbG9jay5zZXRUaW1lb3V0O1xuICAgICAgICAgICAgdmFyIGNsb2NrU2V0SW50ZXJ2YWwgPSB0aGlzLmNsb2NrLnNldEludGVydmFsO1xuICAgICAgICAgICAgdmFyIHNlcnZlciA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuY2xvY2suc2V0VGltZW91dCA9IGZ1bmN0aW9uIChmbiwgdGltZW91dCkge1xuICAgICAgICAgICAgICAgIHNlcnZlci5sb25nZXN0VGltZW91dCA9IE1hdGgubWF4KHRpbWVvdXQsIHNlcnZlci5sb25nZXN0VGltZW91dCB8fCAwKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjbG9ja1NldFRpbWVvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuY2xvY2suc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiAoZm4sIHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXIubG9uZ2VzdFRpbWVvdXQgPSBNYXRoLm1heCh0aW1lb3V0LCBzZXJ2ZXIubG9uZ2VzdFRpbWVvdXQgfHwgMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2tTZXRJbnRlcnZhbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWtlU2VydmVyLmFkZFJlcXVlc3QuY2FsbCh0aGlzLCB4aHIpO1xufTtcblxuZmFrZVNlcnZlcldpdGhDbG9jay5yZXNwb25kID0gZnVuY3Rpb24gcmVzcG9uZCgpIHtcbiAgICB2YXIgcmV0dXJuVmFsID0gZmFrZVNlcnZlci5yZXNwb25kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAodGhpcy5jbG9jaykge1xuICAgICAgICB0aGlzLmNsb2NrLnRpY2sodGhpcy5sb25nZXN0VGltZW91dCB8fCAwKTtcbiAgICAgICAgdGhpcy5sb25nZXN0VGltZW91dCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMucmVzZXRDbG9jaykge1xuICAgICAgICAgICAgdGhpcy5jbG9jay51bmluc3RhbGwoKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDbG9jayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbDtcbn07XG5cbmZha2VTZXJ2ZXJXaXRoQ2xvY2sucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgaWYgKHRoaXMuY2xvY2spIHtcbiAgICAgICAgdGhpcy5jbG9jay51bmluc3RhbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFrZVNlcnZlci5yZXN0b3JlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZha2VTZXJ2ZXJXaXRoQ2xvY2s7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIGZvcm1hdGlvID0gcmVxdWlyZShcIkBzaW5vbmpzL2Zvcm1hdGlvXCIpO1xuXG52YXIgZm9ybWF0dGVyID0gZm9ybWF0aW8uY29uZmlndXJlKHtcbiAgICBxdW90ZVN0cmluZ3M6IGZhbHNlLFxuICAgIGxpbWl0Q2hpbGRyZW5Db3VudDogMjUwXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JtYXQoKSB7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5hc2NpaS5hcHBseShmb3JtYXR0ZXIsIGFyZ3VtZW50cyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBmYWtlWGhyID0gcmVxdWlyZShcIi4uL2Zha2UteGhyXCIpO1xudmFyIHB1c2ggPSBbXS5wdXNoO1xudmFyIGZvcm1hdCA9IHJlcXVpcmUoXCIuL2Zvcm1hdFwiKTtcbnZhciBjb25maWd1cmVMb2dFcnJvciA9IHJlcXVpcmUoXCIuLi9jb25maWd1cmUtbG9nZ2VyXCIpO1xudmFyIHBhdGhUb1JlZ2V4cCA9IHJlcXVpcmUoXCJwYXRoLXRvLXJlZ2V4cFwiKTtcblxudmFyIHN1cHBvcnRzQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09IFwidW5kZWZpbmVkXCI7XG5cbmZ1bmN0aW9uIHJlc3BvbnNlQXJyYXkoaGFuZGxlcikge1xuICAgIHZhciByZXNwb25zZSA9IGhhbmRsZXI7XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGhhbmRsZXIpICE9PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgcmVzcG9uc2UgPSBbMjAwLCB7fSwgaGFuZGxlcl07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXNwb25zZVsyXSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoIXN1cHBvcnRzQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWtlIHNlcnZlciByZXNwb25zZSBib2R5IHNob3VsZCBiZSBhIHN0cmluZywgYnV0IHdhcyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXNwb25zZVsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShyZXNwb25zZVsyXSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZha2Ugc2VydmVyIHJlc3BvbnNlIGJvZHkgc2hvdWxkIGJlIGEgc3RyaW5nIG9yIEFycmF5QnVmZmVyLCBidXQgd2FzIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3BvbnNlWzJdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFdpbmRvd0xvY2F0aW9uKCkge1xuICAgIHJldHVybiB7IFwiaG9zdFwiOiBcImxvY2FsaG9zdFwiLCBcInByb3RvY29sXCI6IFwiaHR0cFwiIH07XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd0xvY2F0aW9uKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrXG4gICAgICAgIHJldHVybiBnZXREZWZhdWx0V2luZG93TG9jYXRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBCcm93c2VycyBwbGFjZSBsb2NhdGlvbiBvbiB3aW5kb3dcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoKHR5cGVvZiB3aW5kb3cud2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSAmJiAodHlwZW9mIHdpbmRvdy53aW5kb3cubG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIpKSB7XG4gICAgICAgIC8vIFJlYWN0IE5hdGl2ZSBvbiBBbmRyb2lkIHBsYWNlcyBsb2NhdGlvbiBvbiB3aW5kb3cud2luZG93XG4gICAgICAgIHJldHVybiB3aW5kb3cud2luZG93LmxvY2F0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBnZXREZWZhdWx0V2luZG93TG9jYXRpb24oKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hPbmUocmVzcG9uc2UsIHJlcU1ldGhvZCwgcmVxVXJsKSB7XG4gICAgdmFyIHJtZXRoID0gcmVzcG9uc2UubWV0aG9kO1xuICAgIHZhciBtYXRjaE1ldGhvZCA9ICFybWV0aCB8fCBybWV0aC50b0xvd2VyQ2FzZSgpID09PSByZXFNZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHZhciBtYXRjaFVybCA9ICF1cmwgfHwgdXJsID09PSByZXFVcmwgfHwgKHR5cGVvZiB1cmwudGVzdCA9PT0gXCJmdW5jdGlvblwiICYmIHVybC50ZXN0KHJlcVVybCkpO1xuXG4gICAgcmV0dXJuIG1hdGNoTWV0aG9kICYmIG1hdGNoVXJsO1xufVxuXG5mdW5jdGlvbiBtYXRjaChyZXNwb25zZSwgcmVxdWVzdCkge1xuICAgIHZhciB3bG9jID0gZ2V0V2luZG93TG9jYXRpb24oKTtcblxuICAgIHZhciByQ3VyckxvYyA9IG5ldyBSZWdFeHAoXCJeXCIgKyB3bG9jLnByb3RvY29sICsgXCIvL1wiICsgd2xvYy5ob3N0KTtcblxuICAgIHZhciByZXF1ZXN0VXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICBpZiAoIS9eaHR0cHM/OlxcL1xcLy8udGVzdChyZXF1ZXN0VXJsKSB8fCByQ3VyckxvYy50ZXN0KHJlcXVlc3RVcmwpKSB7XG4gICAgICAgIHJlcXVlc3RVcmwgPSByZXF1ZXN0VXJsLnJlcGxhY2UockN1cnJMb2MsIFwiXCIpO1xuICAgIH1cblxuICAgIGlmIChtYXRjaE9uZShyZXNwb25zZSwgdGhpcy5nZXRIVFRQTWV0aG9kKHJlcXVlc3QpLCByZXF1ZXN0VXJsKSkge1xuICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlLnJlc3BvbnNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHZhciBydSA9IHJlc3BvbnNlLnVybDtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW3JlcXVlc3RdLmNvbmNhdChydSAmJiB0eXBlb2YgcnUuZXhlYyA9PT0gXCJmdW5jdGlvblwiID8gcnUuZXhlYyhyZXF1ZXN0VXJsKS5zbGljZSgxKSA6IFtdKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5yZXNwb25zZS5hcHBseShyZXNwb25zZSwgYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGluY3JlbWVudFJlcXVlc3RDb3VudCgpIHtcbiAgICB2YXIgY291bnQgPSArK3RoaXMucmVxdWVzdENvdW50O1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5yZXF1ZXN0ZWRPbmNlID0gY291bnQgPT09IDE7XG4gICAgdGhpcy5yZXF1ZXN0ZWRUd2ljZSA9IGNvdW50ID09PSAyO1xuICAgIHRoaXMucmVxdWVzdGVkVGhyaWNlID0gY291bnQgPT09IDM7XG5cbiAgICB0aGlzLmZpcnN0UmVxdWVzdCA9IHRoaXMuZ2V0UmVxdWVzdCgwKTtcbiAgICB0aGlzLnNlY29uZFJlcXVlc3QgPSB0aGlzLmdldFJlcXVlc3QoMSk7XG4gICAgdGhpcy50aGlyZFJlcXVlc3QgPSB0aGlzLmdldFJlcXVlc3QoMik7XG5cbiAgICB0aGlzLmxhc3RSZXF1ZXN0ID0gdGhpcy5nZXRSZXF1ZXN0KGNvdW50IC0gMSk7XG59XG5cbnZhciBmYWtlU2VydmVyID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgc2VydmVyID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICAgICAgc2VydmVyLmNvbmZpZ3VyZShjb25maWcpO1xuICAgICAgICB0aGlzLnhociA9IGZha2VYaHIudXNlRmFrZVhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHNlcnZlci5yZXF1ZXN0cyA9IFtdO1xuICAgICAgICBzZXJ2ZXIucmVxdWVzdENvdW50ID0gMDtcbiAgICAgICAgc2VydmVyLnF1ZXVlID0gW107XG4gICAgICAgIHNlcnZlci5yZXNwb25zZXMgPSBbXTtcblxuXG4gICAgICAgIHRoaXMueGhyLm9uQ3JlYXRlID0gZnVuY3Rpb24gKHhock9iaikge1xuICAgICAgICAgICAgeGhyT2JqLnVuc2FmZUhlYWRlcnNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhKHNlcnZlci51bnNhZmVIZWFkZXJzRW5hYmxlZCA9PT0gZmFsc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNlcnZlci5hZGRSZXF1ZXN0KHhock9iaik7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9LFxuXG4gICAgY29uZmlndXJlOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHdoaXRlbGlzdCA9IHtcbiAgICAgICAgICAgIFwiYXV0b1Jlc3BvbmRcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiYXV0b1Jlc3BvbmRBZnRlclwiOiB0cnVlLFxuICAgICAgICAgICAgXCJyZXNwb25kSW1tZWRpYXRlbHlcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiZmFrZUhUVFBNZXRob2RzXCI6IHRydWUsXG4gICAgICAgICAgICBcImxvZ2dlclwiOiB0cnVlLFxuICAgICAgICAgICAgXCJ1bnNhZmVIZWFkZXJzRW5hYmxlZFwiOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaChmdW5jdGlvbiAoc2V0dGluZykge1xuICAgICAgICAgICAgaWYgKHNldHRpbmcgaW4gd2hpdGVsaXN0KSB7XG4gICAgICAgICAgICAgICAgc2VsZltzZXR0aW5nXSA9IGNvbmZpZ1tzZXR0aW5nXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VsZi5sb2dFcnJvciA9IGNvbmZpZ3VyZUxvZ0Vycm9yKGNvbmZpZyk7XG4gICAgfSxcblxuICAgIGFkZFJlcXVlc3Q6IGZ1bmN0aW9uIGFkZFJlcXVlc3QoeGhyT2JqKSB7XG4gICAgICAgIHZhciBzZXJ2ZXIgPSB0aGlzO1xuICAgICAgICBwdXNoLmNhbGwodGhpcy5yZXF1ZXN0cywgeGhyT2JqKTtcblxuICAgICAgICBpbmNyZW1lbnRSZXF1ZXN0Q291bnQuY2FsbCh0aGlzKTtcblxuICAgICAgICB4aHJPYmoub25TZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VydmVyLmhhbmRsZVJlcXVlc3QodGhpcyk7XG5cbiAgICAgICAgICAgIGlmIChzZXJ2ZXIucmVzcG9uZEltbWVkaWF0ZWx5KSB7XG4gICAgICAgICAgICAgICAgc2VydmVyLnJlc3BvbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyLmF1dG9SZXNwb25kICYmICFzZXJ2ZXIucmVzcG9uZGluZykge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIucmVzcG9uZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIucmVzcG9uZCgpO1xuICAgICAgICAgICAgICAgIH0sIHNlcnZlci5hdXRvUmVzcG9uZEFmdGVyIHx8IDEwKTtcblxuICAgICAgICAgICAgICAgIHNlcnZlci5yZXNwb25kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgZ2V0SFRUUE1ldGhvZDogZnVuY3Rpb24gZ2V0SFRUUE1ldGhvZChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLmZha2VIVFRQTWV0aG9kcyAmJiAvcG9zdC9pLnRlc3QocmVxdWVzdC5tZXRob2QpKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IChyZXF1ZXN0LnJlcXVlc3RCb2R5IHx8IFwiXCIpLm1hdGNoKC9fbWV0aG9kPShbXlxcYjtdKykvKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6IHJlcXVlc3QubWV0aG9kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcXVlc3QubWV0aG9kO1xuICAgIH0sXG5cbiAgICBoYW5kbGVSZXF1ZXN0OiBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KHhocikge1xuICAgICAgICBpZiAoeGhyLmFzeW5jKSB7XG4gICAgICAgICAgICBwdXNoLmNhbGwodGhpcy5xdWV1ZSwgeGhyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3QoeGhyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2dnZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gbm8tb3A7IG92ZXJyaWRlIHZpYSBjb25maWd1cmUoKVxuICAgIH0sXG5cbiAgICBsb2dFcnJvcjogY29uZmlndXJlTG9nRXJyb3Ioe30pLFxuXG4gICAgbG9nOiBmdW5jdGlvbiBsb2cocmVzcG9uc2UsIHJlcXVlc3QpIHtcbiAgICAgICAgdmFyIHN0cjtcblxuICAgICAgICBzdHIgPSBcIlJlcXVlc3Q6XFxuXCIgKyBmb3JtYXQocmVxdWVzdCkgKyBcIlxcblxcblwiO1xuICAgICAgICBzdHIgKz0gXCJSZXNwb25zZTpcXG5cIiArIGZvcm1hdChyZXNwb25zZSkgKyBcIlxcblxcblwiO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2dnZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIoc3RyKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXNwb25kV2l0aDogZnVuY3Rpb24gcmVzcG9uZFdpdGgobWV0aG9kLCB1cmwsIGJvZHkpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VBcnJheShtZXRob2QpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGJvZHkgPSBtZXRob2Q7XG4gICAgICAgICAgICB1cmwgPSBtZXRob2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGJvZHkgPSB1cmw7XG4gICAgICAgICAgICB1cmwgPSBtZXRob2Q7XG4gICAgICAgICAgICBtZXRob2QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaC5jYWxsKHRoaXMucmVzcG9uc2VzLCB7XG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHVybDogdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIiAmJiB1cmwgIT09IFwiXCIgPyBwYXRoVG9SZWdleHAodXJsKSA6IHVybCxcbiAgICAgICAgICAgIHJlc3BvbnNlOiB0eXBlb2YgYm9keSA9PT0gXCJmdW5jdGlvblwiID8gYm9keSA6IHJlc3BvbnNlQXJyYXkoYm9keSlcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc3BvbmQ6IGZ1bmN0aW9uIHJlc3BvbmQoKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kV2l0aC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHF1ZXVlID0gdGhpcy5xdWV1ZSB8fCBbXTtcbiAgICAgICAgdmFyIHJlcXVlc3RzID0gcXVldWUuc3BsaWNlKDAsIHF1ZXVlLmxlbmd0aCk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICByZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICBzZWxmLnByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JlcXVlc3Q6IGZ1bmN0aW9uIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IHRoaXMucmVzcG9uc2UgfHwgWzQwNCwge30sIFwiXCJdO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gdGhpcy5yZXNwb25zZXMubGVuZ3RoLCBpID0gbCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5jYWxsKHRoaXMsIHRoaXMucmVzcG9uc2VzW2ldLCByZXF1ZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlc1tpXS5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cocmVzcG9uc2UsIHJlcXVlc3QpO1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25kKHJlc3BvbnNlWzBdLCByZXNwb25zZVsxXSwgcmVzcG9uc2VbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Vycm9yKFwiRmFrZSBzZXJ2ZXIgcmVxdWVzdCBwcm9jZXNzaW5nXCIsIGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlc3RvcmU6IGZ1bmN0aW9uIHJlc3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnhoci5yZXN0b3JlICYmIHRoaXMueGhyLnJlc3RvcmUuYXBwbHkodGhpcy54aHIsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIGdldFJlcXVlc3Q6IGZ1bmN0aW9uIGdldFJlcXVlc3QoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdHNbaW5kZXhdIHx8IG51bGw7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEJlaGF2aW9yKCk7XG4gICAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgfSxcblxuICAgIHJlc2V0QmVoYXZpb3I6IGZ1bmN0aW9uIHJlc2V0QmVoYXZpb3IoKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VzLmxlbmd0aCA9IHRoaXMucXVldWUubGVuZ3RoID0gMDtcbiAgICB9LFxuXG4gICAgcmVzZXRIaXN0b3J5OiBmdW5jdGlvbiByZXNldEhpc3RvcnkoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdHMubGVuZ3RoID0gdGhpcy5yZXF1ZXN0Q291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdGVkT25jZSA9IHRoaXMucmVxdWVzdGVkVHdpY2UgPSB0aGlzLnJlcXVlc3RlZFRocmljZSA9IHRoaXMucmVxdWVzdGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5maXJzdFJlcXVlc3QgPSB0aGlzLnNlY29uZFJlcXVlc3QgPSB0aGlzLnRoaXJkUmVxdWVzdCA9IHRoaXMubGFzdFJlcXVlc3QgPSBudWxsO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmFrZVNlcnZlcjtcbiIsIi8qZ2xvYmFsIEJsb2IgKi9cblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLmlzU3VwcG9ydGVkID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gISFuZXcgQmxvYigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0oKSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIFRleHRFbmNvZGVyID0gcmVxdWlyZShcIkBzaW5vbmpzL3RleHQtZW5jb2RpbmdcIikuVGV4dEVuY29kZXI7XG5cbnZhciBjb25maWd1cmVMb2dFcnJvciA9IHJlcXVpcmUoXCIuLi9jb25maWd1cmUtbG9nZ2VyXCIpO1xudmFyIHNpbm9uRXZlbnQgPSByZXF1aXJlKFwiLi4vZXZlbnRcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcImp1c3QtZXh0ZW5kXCIpO1xuXG5mdW5jdGlvbiBnZXRXb3JraW5nWEhSKGdsb2JhbFNjb3BlKSB7XG4gICAgdmFyIHN1cHBvcnRzWEhSID0gdHlwZW9mIGdsb2JhbFNjb3BlLlhNTEh0dHBSZXF1ZXN0ICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIGlmIChzdXBwb3J0c1hIUikge1xuICAgICAgICByZXR1cm4gZ2xvYmFsU2NvcGUuWE1MSHR0cFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgdmFyIHN1cHBvcnRzQWN0aXZlWCA9IHR5cGVvZiBnbG9iYWxTY29wZS5BY3RpdmVYT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIGlmIChzdXBwb3J0c0FjdGl2ZVgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgZ2xvYmFsU2NvcGUuQWN0aXZlWE9iamVjdChcIk1TWE1MMi5YTUxIVFRQLjMuMFwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBzdXBwb3J0c1Byb2dyZXNzID0gdHlwZW9mIFByb2dyZXNzRXZlbnQgIT09IFwidW5kZWZpbmVkXCI7XG52YXIgc3VwcG9ydHNDdXN0b21FdmVudCA9IHR5cGVvZiBDdXN0b21FdmVudCAhPT0gXCJ1bmRlZmluZWRcIjtcbnZhciBzdXBwb3J0c0Zvcm1EYXRhID0gdHlwZW9mIEZvcm1EYXRhICE9PSBcInVuZGVmaW5lZFwiO1xudmFyIHN1cHBvcnRzQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09IFwidW5kZWZpbmVkXCI7XG52YXIgc3VwcG9ydHNCbG9iID0gcmVxdWlyZShcIi4vYmxvYlwiKS5pc1N1cHBvcnRlZDtcbnZhciBpc1JlYWN0TmF0aXZlID0gZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnByb2R1Y3QgPT09IFwiUmVhY3ROYXRpdmVcIjtcbnZhciBzaW5vblhociA9IHsgWE1MSHR0cFJlcXVlc3Q6IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCB9O1xuc2lub25YaHIuR2xvYmFsWE1MSHR0cFJlcXVlc3QgPSBnbG9iYWwuWE1MSHR0cFJlcXVlc3Q7XG5zaW5vblhoci5HbG9iYWxBY3RpdmVYT2JqZWN0ID0gZ2xvYmFsLkFjdGl2ZVhPYmplY3Q7XG5zaW5vblhoci5zdXBwb3J0c0FjdGl2ZVggPSB0eXBlb2Ygc2lub25YaHIuR2xvYmFsQWN0aXZlWE9iamVjdCAhPT0gXCJ1bmRlZmluZWRcIjtcbnNpbm9uWGhyLnN1cHBvcnRzWEhSID0gdHlwZW9mIHNpbm9uWGhyLkdsb2JhbFhNTEh0dHBSZXF1ZXN0ICE9PSBcInVuZGVmaW5lZFwiO1xuc2lub25YaHIud29ya2luZ1hIUiA9IGdldFdvcmtpbmdYSFIoZ2xvYmFsKTtcbnNpbm9uWGhyLnN1cHBvcnRzVGltZW91dCA9XG4gICAgKHNpbm9uWGhyLnN1cHBvcnRzWEhSICYmIFwidGltZW91dFwiIGluIChuZXcgc2lub25YaHIuR2xvYmFsWE1MSHR0cFJlcXVlc3QoKSkpO1xuc2lub25YaHIuc3VwcG9ydHNDT1JTID0gaXNSZWFjdE5hdGl2ZSB8fFxuICAgIChzaW5vblhoci5zdXBwb3J0c1hIUiAmJiBcIndpdGhDcmVkZW50aWFsc1wiIGluIChuZXcgc2lub25YaHIuR2xvYmFsWE1MSHR0cFJlcXVlc3QoKSkpO1xuXG4vLyBSZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmb3JiaWRkZW4taGVhZGVyLW5hbWVcbnZhciB1bnNhZmVIZWFkZXJzID0ge1xuICAgIFwiQWNjZXB0LUNoYXJzZXRcIjogdHJ1ZSxcbiAgICBcIkFjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVyc1wiOiB0cnVlLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2RcIjogdHJ1ZSxcbiAgICBcIkFjY2VwdC1FbmNvZGluZ1wiOiB0cnVlLFxuICAgIFwiQ29ubmVjdGlvblwiOiB0cnVlLFxuICAgIFwiQ29udGVudC1MZW5ndGhcIjogdHJ1ZSxcbiAgICBcIkNvb2tpZVwiOiB0cnVlLFxuICAgIFwiQ29va2llMlwiOiB0cnVlLFxuICAgIFwiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZ1wiOiB0cnVlLFxuICAgIFwiRGF0ZVwiOiB0cnVlLFxuICAgIFwiRE5UXCI6IHRydWUsXG4gICAgXCJFeHBlY3RcIjogdHJ1ZSxcbiAgICBcIkhvc3RcIjogdHJ1ZSxcbiAgICBcIktlZXAtQWxpdmVcIjogdHJ1ZSxcbiAgICBcIk9yaWdpblwiOiB0cnVlLFxuICAgIFwiUmVmZXJlclwiOiB0cnVlLFxuICAgIFwiVEVcIjogdHJ1ZSxcbiAgICBcIlRyYWlsZXJcIjogdHJ1ZSxcbiAgICBcIlRyYW5zZmVyLUVuY29kaW5nXCI6IHRydWUsXG4gICAgXCJVcGdyYWRlXCI6IHRydWUsXG4gICAgXCJVc2VyLUFnZW50XCI6IHRydWUsXG4gICAgXCJWaWFcIjogdHJ1ZVxufTtcblxuXG5mdW5jdGlvbiBFdmVudFRhcmdldEhhbmRsZXIoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBldmVudHMgPSBbXCJsb2Fkc3RhcnRcIiwgXCJwcm9ncmVzc1wiLCBcImFib3J0XCIsIFwiZXJyb3JcIiwgXCJsb2FkXCIsIFwidGltZW91dFwiLCBcImxvYWRlbmRcIl07XG5cbiAgICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSkge1xuICAgICAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IHNlbGZbXCJvblwiICsgZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgaWYgKGxpc3RlbmVyICYmIHR5cGVvZiBsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGV2ZW50cy5mb3JFYWNoKGFkZEV2ZW50TGlzdGVuZXIpO1xufVxuXG5FdmVudFRhcmdldEhhbmRsZXIucHJvdG90eXBlID0gc2lub25FdmVudC5FdmVudFRhcmdldDtcblxuLy8gTm90ZSB0aGF0IGZvciBGYWtlWE1MSHR0cFJlcXVlc3QgdG8gd29yayBwcmUgRVM1XG4vLyB3ZSBsb3NlIHNvbWUgb2YgdGhlIGFsaWdubWVudCB3aXRoIHRoZSBzcGVjLlxuLy8gVG8gZW5zdXJlIGFzIGNsb3NlIGEgbWF0Y2ggYXMgcG9zc2libGUsXG4vLyBzZXQgcmVzcG9uc2VUeXBlIGJlZm9yZSBjYWxsaW5nIG9wZW4sIHNlbmQgb3IgcmVzcG9uZDtcbmZ1bmN0aW9uIEZha2VYTUxIdHRwUmVxdWVzdChjb25maWcpIHtcbiAgICBFdmVudFRhcmdldEhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBGYWtlWE1MSHR0cFJlcXVlc3QuVU5TRU5UO1xuICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICB0aGlzLnJlcXVlc3RCb2R5ID0gbnVsbDtcbiAgICB0aGlzLnN0YXR1cyA9IDA7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gXCJcIjtcbiAgICB0aGlzLnVwbG9hZCA9IG5ldyBFdmVudFRhcmdldEhhbmRsZXIoKTtcbiAgICB0aGlzLnJlc3BvbnNlVHlwZSA9IFwiXCI7XG4gICAgdGhpcy5yZXNwb25zZSA9IFwiXCI7XG4gICAgdGhpcy5sb2dFcnJvciA9IGNvbmZpZ3VyZUxvZ0Vycm9yKGNvbmZpZyk7XG5cbiAgICBpZiAoc2lub25YaHIuc3VwcG9ydHNUaW1lb3V0KSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzQ09SUykge1xuICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgRmFrZVhNTEh0dHBSZXF1ZXN0Lm9uQ3JlYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgRmFrZVhNTEh0dHBSZXF1ZXN0Lm9uQ3JlYXRlKHRoaXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3RhdGUoeGhyKSB7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuT1BFTkVEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSXCIpO1xuICAgIH1cblxuICAgIGlmICh4aHIuc2VuZEZsYWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRF9TVEFURV9FUlJcIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXJWYWx1ZSh2YWx1ZSkge1xuICAgIC8vIFJlZjogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZS1ieXRlc1xuICAgIC8qZXNsaW50IG5vLWNvbnRyb2wtcmVnZXg6IFwib2ZmXCIqL1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9eW1xceDA5XFx4MEFcXHgwRFxceDIwXSt8W1xceDA5XFx4MEFcXHgwRFxceDIwXSskL2csIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXIoaGVhZGVycywgaGVhZGVyKSB7XG4gICAgdmFyIGZvdW5kSGVhZGVyID0gT2JqZWN0LmtleXMoaGVhZGVycykuZmlsdGVyKGZ1bmN0aW9uIChoKSB7XG4gICAgICAgIHJldHVybiBoLnRvTG93ZXJDYXNlKCkgPT09IGhlYWRlci50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZvdW5kSGVhZGVyWzBdIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXRDb29raWUySGVhZGVyKGhlYWRlcikge1xuICAgIHJldHVybiAhL15TZXQtQ29va2llMj8kL2kudGVzdChoZWFkZXIpO1xufVxuXG4vLyBsYXJnZXN0IGFyaXR5IGluIFhIUiBpcyA1IC0gWEhSI29wZW5cbnZhciBhcHBseSA9IGZ1bmN0aW9uIChvYmosIG1ldGhvZCwgYXJncykge1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gb2JqW21ldGhvZF0oKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gb2JqW21ldGhvZF0oYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG9ialttZXRob2RdKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBvYmpbbWV0aG9kXShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gb2JqW21ldGhvZF0oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgIGNhc2UgNTogcmV0dXJuIG9ialttZXRob2RdKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO1xuICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgY2FzZVwiKTtcbiAgICB9XG59O1xuXG5GYWtlWE1MSHR0cFJlcXVlc3QuZmlsdGVycyA9IFtdO1xuRmFrZVhNTEh0dHBSZXF1ZXN0LmFkZEZpbHRlciA9IGZ1bmN0aW9uIGFkZEZpbHRlcihmbikge1xuICAgIHRoaXMuZmlsdGVycy5wdXNoKGZuKTtcbn07XG5GYWtlWE1MSHR0cFJlcXVlc3QuZGVmYWtlID0gZnVuY3Rpb24gZGVmYWtlKGZha2VYaHIsIHhockFyZ3MpIHtcbiAgICB2YXIgeGhyID0gbmV3IHNpbm9uWGhyLndvcmtpbmdYSFIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cbiAgICBbXG4gICAgICAgIFwib3BlblwiLFxuICAgICAgICBcInNldFJlcXVlc3RIZWFkZXJcIixcbiAgICAgICAgXCJhYm9ydFwiLFxuICAgICAgICBcImdldFJlc3BvbnNlSGVhZGVyXCIsXG4gICAgICAgIFwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzXCIsXG4gICAgICAgIFwiYWRkRXZlbnRMaXN0ZW5lclwiLFxuICAgICAgICBcIm92ZXJyaWRlTWltZVR5cGVcIixcbiAgICAgICAgXCJyZW1vdmVFdmVudExpc3RlbmVyXCJcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICBmYWtlWGhyW21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoeGhyLCBtZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBmYWtlWGhyLnNlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJlZjogaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyN0aGUtcmVzcG9uc2V0eXBlLWF0dHJpYnV0ZVxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVHlwZSAhPT0gZmFrZVhoci5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBmYWtlWGhyLnJlc3BvbnNlVHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoeGhyLCBcInNlbmRcIiwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgdmFyIGNvcHlBdHRycyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgICAgZmFrZVhoclthdHRyXSA9IHhoclthdHRyXTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBzdGF0ZUNoYW5nZVN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmYWtlWGhyLnJlYWR5U3RhdGUgPSB4aHIucmVhZHlTdGF0ZTtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID49IEZha2VYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEKSB7XG4gICAgICAgICAgICBjb3B5QXR0cnMoW1wic3RhdHVzXCIsIFwic3RhdHVzVGV4dFwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID49IEZha2VYTUxIdHRwUmVxdWVzdC5MT0FESU5HKSB7XG4gICAgICAgICAgICBjb3B5QXR0cnMoW1wicmVzcG9uc2VcIl0pO1xuICAgICAgICAgICAgaWYgKHhoci5yZXNwb25zZVR5cGUgPT09IFwiXCIgfHwgeGhyLnJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBjb3B5QXR0cnMoW1wicmVzcG9uc2VUZXh0XCJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB4aHIucmVhZHlTdGF0ZSA9PT0gRmFrZVhNTEh0dHBSZXF1ZXN0LkRPTkUgJiZcbiAgICAgICAgICAgICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiIHx8IHhoci5yZXNwb25zZVR5cGUgPT09IFwiZG9jdW1lbnRcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb3B5QXR0cnMoW1wicmVzcG9uc2VYTUxcIl0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBzdGF0ZUNoYW5nZUVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGZha2VYaHIub25yZWFkeXN0YXRlY2hhbmdlKSB7XG4gICAgICAgICAgICBmYWtlWGhyLm9ucmVhZHlzdGF0ZWNoYW5nZS5jYWxsKGZha2VYaHIsIHsgdGFyZ2V0OiBmYWtlWGhyLCBjdXJyZW50VGFyZ2V0OiBmYWtlWGhyIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBzdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uIHN0YXRlQ2hhbmdlKCkge1xuICAgICAgICBzdGF0ZUNoYW5nZVN0YXJ0KCk7XG4gICAgICAgIHN0YXRlQ2hhbmdlRW5kKCk7XG4gICAgfTtcblxuICAgIGlmICh4aHIuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlYWR5c3RhdGVjaGFuZ2VcIiwgc3RhdGVDaGFuZ2VTdGFydCk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZmFrZVhoci5ldmVudExpc3RlbmVycykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIC8qZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jKi9cbiAgICAgICAgICAgIGZha2VYaHIuZXZlbnRMaXN0ZW5lcnNbZXZlbnRdLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlci5saXN0ZW5lciwge1xuICAgICAgICAgICAgICAgICAgICBjYXB0dXJlOiBoYW5kbGVyLmNhcHR1cmUsXG4gICAgICAgICAgICAgICAgICAgIG9uY2U6IGhhbmRsZXIub25jZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKmVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jKi9cbiAgICAgICAgfSk7XG5cbiAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoXCJyZWFkeXN0YXRlY2hhbmdlXCIsIHN0YXRlQ2hhbmdlRW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gc3RhdGVDaGFuZ2U7XG4gICAgfVxuICAgIGFwcGx5KHhociwgXCJvcGVuXCIsIHhockFyZ3MpO1xufTtcbkZha2VYTUxIdHRwUmVxdWVzdC51c2VGaWx0ZXJzID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHZlcmlmeVJlcXVlc3RPcGVuZWQoeGhyKSB7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuT1BFTkVEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSIC0gXCIgKyB4aHIucmVhZHlTdGF0ZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2ZXJpZnlSZXF1ZXN0U2VudCh4aHIpIHtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IEZha2VYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlcXVlc3QgZG9uZVwiKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUhlYWRlcnNSZWNlaXZlZCh4aHIpIHtcbiAgICBpZiAoeGhyLmFzeW5jICYmIHhoci5yZWFkeVN0YXRlICE9PSBGYWtlWE1MSHR0cFJlcXVlc3QuSEVBREVSU19SRUNFSVZFRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBoZWFkZXJzIHJlY2VpdmVkXCIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmVyaWZ5UmVzcG9uc2VCb2R5VHlwZShib2R5LCByZXNwb25zZVR5cGUpIHtcbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuICAgIHZhciBpc1N0cmluZyA9IHR5cGVvZiBib2R5ID09PSBcInN0cmluZ1wiO1xuXG4gICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gXCJhcnJheWJ1ZmZlclwiKSB7XG5cbiAgICAgICAgaWYgKCFpc1N0cmluZyAmJiAhKGJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIHJlc3BvbmQgdG8gZmFrZSBYTUxIdHRwUmVxdWVzdCB3aXRoIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5ICsgXCIsIHdoaWNoIGlzIG5vdCBhIHN0cmluZyBvciBBcnJheUJ1ZmZlci5cIik7XG4gICAgICAgICAgICBlcnJvci5uYW1lID0gXCJJbnZhbGlkQm9keUV4Y2VwdGlvblwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc1N0cmluZykge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcIkF0dGVtcHRlZCB0byByZXNwb25kIHRvIGZha2UgWE1MSHR0cFJlcXVlc3Qgd2l0aCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5ICsgXCIsIHdoaWNoIGlzIG5vdCBhIHN0cmluZy5cIik7XG4gICAgICAgIGVycm9yLm5hbWUgPSBcIkludmFsaWRCb2R5RXhjZXB0aW9uXCI7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFRvQXJyYXlCdWZmZXIoYm9keSwgZW5jb2RpbmcpIHtcbiAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBib2R5O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVGV4dEVuY29kZXIoZW5jb2RpbmcgfHwgXCJ1dGYtOFwiKS5lbmNvZGUoYm9keSkuYnVmZmVyO1xufVxuXG5mdW5jdGlvbiBpc1htbENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKSB7XG4gICAgcmV0dXJuICFjb250ZW50VHlwZSB8fCAvKHRleHRcXC94bWwpfChhcHBsaWNhdGlvblxcL3htbCl8KFxcK3htbCkvLnRlc3QoY29udGVudFR5cGUpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0UmVzcG9uc2VCb2R5KHJlc3BvbnNlVHlwZSwgY29udGVudFR5cGUsIGJvZHkpIHtcbiAgICBpZiAocmVzcG9uc2VUeXBlID09PSBcIlwiIHx8IHJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0FycmF5QnVmZmVyICYmIHJlc3BvbnNlVHlwZSA9PT0gXCJhcnJheWJ1ZmZlclwiKSB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0VG9BcnJheUJ1ZmZlcihib2R5KTtcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gcGFyc2luZyBmYWlsdXJlIGFzIG51bGxcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0c0Jsb2IgJiYgcmVzcG9uc2VUeXBlID09PSBcImJsb2JcIikge1xuICAgICAgICB2YXIgYmxvYk9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICBibG9iT3B0aW9ucy50eXBlID0gY29udGVudFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtjb252ZXJ0VG9BcnJheUJ1ZmZlcihib2R5KV0sIGJsb2JPcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PT0gXCJkb2N1bWVudFwiKSB7XG4gICAgICAgIGlmIChpc1htbENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZha2VYTUxIdHRwUmVxdWVzdC5wYXJzZVhNTChib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByZXNwb25zZVR5cGUgXCIgKyByZXNwb25zZVR5cGUpO1xufVxuXG5mdW5jdGlvbiBjbGVhclJlc3BvbnNlKHhocikge1xuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiIHx8IHhoci5yZXNwb25zZVR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIHhoci5yZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHQgPSBcIlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHhoci5yZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHQgPSBudWxsO1xuICAgIH1cbiAgICB4aHIucmVzcG9uc2VYTUwgPSBudWxsO1xufVxuXG4vKipcbiAqIFN0ZXBzIHRvIGZvbGxvdyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLCBhY2NvcmRpbmcgdG86XG4gKiBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3QtZXJyb3Itc3RlcHNcbiAqL1xuZnVuY3Rpb24gcmVxdWVzdEVycm9yU3RlcHMoeGhyKSB7XG4gICAgY2xlYXJSZXNwb25zZSh4aHIpO1xuICAgIHhoci5lcnJvckZsYWcgPSB0cnVlO1xuICAgIHhoci5yZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIHhoci5yZXNwb25zZUhlYWRlcnMgPSB7fTtcblxuICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gRmFrZVhNTEh0dHBSZXF1ZXN0LlVOU0VOVCAmJiB4aHIuc2VuZEZsYWdcbiAgICAgICAgJiYgeGhyLnJlYWR5U3RhdGUgIT09IEZha2VYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgIHhoci5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5ET05FKTtcbiAgICAgICAgeGhyLnNlbmRGbGFnID0gZmFsc2U7XG4gICAgfVxufVxuXG5GYWtlWE1MSHR0cFJlcXVlc3QucGFyc2VYTUwgPSBmdW5jdGlvbiBwYXJzZVhNTCh0ZXh0KSB7XG4gICAgLy8gVHJlYXQgZW1wdHkgc3RyaW5nIGFzIHBhcnNpbmcgZmFpbHVyZVxuICAgIGlmICh0ZXh0ICE9PSBcIlwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIERPTVBhcnNlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgdmFyIHBhcnNlcmVycm9yTlMgPSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlcmVycm9ycyA9IHBhcnNlclxuICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlRnJvbVN0cmluZyhcIklOVkFMSURcIiwgXCJ0ZXh0L3htbFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwicGFyc2VyZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJlcnJvck5TID0gcGFyc2VyZXJyb3JzWzBdLm5hbWVzcGFjZVVSSTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2luZyBpbnZhbGlkIFhNTCBtYWtlcyBJRTExIHRocm93XG4gICAgICAgICAgICAgICAgICAgIC8vIHNvIG5vIG5hbWVzcGFjZSBuZWVkcyB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsIFwidGV4dC94bWxcIik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhwYXJzZXJlcnJvck5TLCBcInBhcnNlcmVycm9yXCIpLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IG51bGwgOiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeG1sRG9jID0gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTERPTVwiKTtcbiAgICAgICAgICAgIHhtbERvYy5hc3luYyA9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIHhtbERvYy5sb2FkWE1MKHRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIHhtbERvYy5wYXJzZUVycm9yLmVycm9yQ29kZSAhPT0gMFxuICAgICAgICAgICAgICAgID8gbnVsbCA6IHhtbERvYztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVW5hYmxlIHRvIHBhcnNlIFhNTCAtIG5vIGJpZ2dpZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5GYWtlWE1MSHR0cFJlcXVlc3Quc3RhdHVzQ29kZXMgPSB7XG4gICAgMTAwOiBcIkNvbnRpbnVlXCIsXG4gICAgMTAxOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgICAyMDA6IFwiT0tcIixcbiAgICAyMDE6IFwiQ3JlYXRlZFwiLFxuICAgIDIwMjogXCJBY2NlcHRlZFwiLFxuICAgIDIwMzogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICAgIDIwNDogXCJObyBDb250ZW50XCIsXG4gICAgMjA1OiBcIlJlc2V0IENvbnRlbnRcIixcbiAgICAyMDY6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gICAgMjA3OiBcIk11bHRpLVN0YXR1c1wiLFxuICAgIDMwMDogXCJNdWx0aXBsZSBDaG9pY2VcIixcbiAgICAzMDE6IFwiTW92ZWQgUGVybWFuZW50bHlcIixcbiAgICAzMDI6IFwiRm91bmRcIixcbiAgICAzMDM6IFwiU2VlIE90aGVyXCIsXG4gICAgMzA0OiBcIk5vdCBNb2RpZmllZFwiLFxuICAgIDMwNTogXCJVc2UgUHJveHlcIixcbiAgICAzMDc6IFwiVGVtcG9yYXJ5IFJlZGlyZWN0XCIsXG4gICAgNDAwOiBcIkJhZCBSZXF1ZXN0XCIsXG4gICAgNDAxOiBcIlVuYXV0aG9yaXplZFwiLFxuICAgIDQwMjogXCJQYXltZW50IFJlcXVpcmVkXCIsXG4gICAgNDAzOiBcIkZvcmJpZGRlblwiLFxuICAgIDQwNDogXCJOb3QgRm91bmRcIixcbiAgICA0MDU6IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIsXG4gICAgNDA2OiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gICAgNDA3OiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG4gICAgNDA4OiBcIlJlcXVlc3QgVGltZW91dFwiLFxuICAgIDQwOTogXCJDb25mbGljdFwiLFxuICAgIDQxMDogXCJHb25lXCIsXG4gICAgNDExOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICAgIDQxMjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gICAgNDEzOiBcIlJlcXVlc3QgRW50aXR5IFRvbyBMYXJnZVwiLFxuICAgIDQxNDogXCJSZXF1ZXN0LVVSSSBUb28gTG9uZ1wiLFxuICAgIDQxNTogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gICAgNDE2OiBcIlJlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGVcIixcbiAgICA0MTc6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG4gICAgNDIyOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gICAgNTAwOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIDUwMTogXCJOb3QgSW1wbGVtZW50ZWRcIixcbiAgICA1MDI6IFwiQmFkIEdhdGV3YXlcIixcbiAgICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICAgIDUwNDogXCJHYXRld2F5IFRpbWVvdXRcIixcbiAgICA1MDU6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIlxufTtcblxuZXh0ZW5kKEZha2VYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsIHNpbm9uRXZlbnQuRXZlbnRUYXJnZXQsIHtcbiAgICBhc3luYzogdHJ1ZSxcblxuICAgIG9wZW46IGZ1bmN0aW9uIG9wZW4obWV0aG9kLCB1cmwsIGFzeW5jLCB1c2VybmFtZSwgcGFzc3dvcmQpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmFzeW5jID0gdHlwZW9mIGFzeW5jID09PSBcImJvb2xlYW5cIiA/IGFzeW5jIDogdHJ1ZTtcbiAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgICAgIGNsZWFyUmVzcG9uc2UodGhpcyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5zZW5kRmxhZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChGYWtlWE1MSHR0cFJlcXVlc3QudXNlRmlsdGVycyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIHhockFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICB2YXIgZGVmYWtlID0gRmFrZVhNTEh0dHBSZXF1ZXN0LmZpbHRlcnMuc29tZShmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5hcHBseSh0aGlzLCB4aHJBcmdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRlZmFrZSkge1xuICAgICAgICAgICAgICAgIEZha2VYTUxIdHRwUmVxdWVzdC5kZWZha2UodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5PUEVORUQpO1xuICAgIH0sXG5cbiAgICByZWFkeVN0YXRlQ2hhbmdlOiBmdW5jdGlvbiByZWFkeVN0YXRlQ2hhbmdlKHN0YXRlKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IHN0YXRlO1xuXG4gICAgICAgIHZhciByZWFkeVN0YXRlQ2hhbmdlRXZlbnQgPSBuZXcgc2lub25FdmVudC5FdmVudChcInJlYWR5c3RhdGVjaGFuZ2VcIiwgZmFsc2UsIGZhbHNlLCB0aGlzKTtcbiAgICAgICAgdmFyIGV2ZW50LCBwcm9ncmVzcztcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UocmVhZHlTdGF0ZUNoYW5nZUV2ZW50KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0Vycm9yKFwiRmFrZSBYSFIgb25yZWFkeXN0YXRlY2hhbmdlIGhhbmRsZXJcIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZWRPdXQgfHwgdGhpcy5hYm9ydGVkIHx8IHRoaXMuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB7bG9hZGVkOiAwLCB0b3RhbDogMH07XG4gICAgICAgICAgICAgICAgZXZlbnQgPSAodGhpcy50aW1lZE91dCAmJiBcInRpbWVvdXRcIikgfHwgKHRoaXMuYWJvcnRlZCAmJiBcImFib3J0XCIpIHx8IFwiZXJyb3JcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB7bG9hZGVkOiAxMDAsIHRvdGFsOiAxMDB9O1xuICAgICAgICAgICAgICAgIGV2ZW50ID0gXCJsb2FkXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdXBwb3J0c1Byb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWQuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KFwicHJvZ3Jlc3NcIiwgcHJvZ3Jlc3MsIHRoaXMpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZC5kaXNwYXRjaEV2ZW50KG5ldyBzaW5vbkV2ZW50LlByb2dyZXNzRXZlbnQoZXZlbnQsIHByb2dyZXNzLCB0aGlzKSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWQuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KFwibG9hZGVuZFwiLCBwcm9ncmVzcywgdGhpcykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChcInByb2dyZXNzXCIsIHByb2dyZXNzLCB0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuUHJvZ3Jlc3NFdmVudChldmVudCwgcHJvZ3Jlc3MsIHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KFwibG9hZGVuZFwiLCBwcm9ncmVzcywgdGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHJlYWR5U3RhdGVDaGFuZ2VFdmVudCk7XG4gICAgfSxcblxuICAgIC8vIFJlZiBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3RoZS1zZXRyZXF1ZXN0aGVhZGVyKCktbWV0aG9kXG4gICAgc2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJCeSBSRkM3MjMwLCBzZWN0aW9uIDMuMi40LCBoZWFkZXIgdmFsdWVzIHNob3VsZCBiZSBzdHJpbmdzLiBHb3QgXCIgKyB0eXBlb2YgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHZlcmlmeVN0YXRlKHRoaXMpO1xuXG4gICAgICAgIHZhciBjaGVja1Vuc2FmZUhlYWRlcnMgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudW5zYWZlSGVhZGVyc0VuYWJsZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY2hlY2tVbnNhZmVIZWFkZXJzID0gdGhpcy51bnNhZmVIZWFkZXJzRW5hYmxlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrVW5zYWZlSGVhZGVycyAmJiAoZ2V0SGVhZGVyKHVuc2FmZUhlYWRlcnMsIGhlYWRlcikgIT09IG51bGwgfHwgL14oU2VjLXxQcm94eS0pL2kudGVzdChoZWFkZXIpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVmdXNlZCB0byBzZXQgdW5zYWZlIGhlYWRlciBcXFwiXCIgKyBoZWFkZXIgKyBcIlxcXCJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IG5vcm1hbGl6ZUhlYWRlclZhbHVlKHZhbHVlKTtcblxuICAgICAgICB2YXIgZXhpc3RpbmdIZWFkZXIgPSBnZXRIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVycywgaGVhZGVyKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nSGVhZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzW2V4aXN0aW5nSGVhZGVyXSArPSBcIiwgXCIgKyB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnNbaGVhZGVyXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNldFN0YXR1czogZnVuY3Rpb24gc2V0U3RhdHVzKHN0YXR1cykge1xuICAgICAgICB2YXIgc2FuaXRpemVkU3RhdHVzID0gdHlwZW9mIHN0YXR1cyA9PT0gXCJudW1iZXJcIiA/IHN0YXR1cyA6IDIwMDtcblxuICAgICAgICB2ZXJpZnlSZXF1ZXN0T3BlbmVkKHRoaXMpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHNhbml0aXplZFN0YXR1cztcbiAgICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gRmFrZVhNTEh0dHBSZXF1ZXN0LnN0YXR1c0NvZGVzW3Nhbml0aXplZFN0YXR1c107XG4gICAgfSxcblxuICAgIC8vIEhlbHBzIHRlc3RpbmdcbiAgICBzZXRSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uIHNldFJlc3BvbnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgICAgIHZlcmlmeVJlcXVlc3RPcGVuZWQodGhpcyk7XG5cbiAgICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9IHRoaXMucmVzcG9uc2VIZWFkZXJzID0ge307XG5cbiAgICAgICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbaGVhZGVyXSA9IGhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZUNoYW5nZShGYWtlWE1MSHR0cFJlcXVlc3QuSEVBREVSU19SRUNFSVZFRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBGYWtlWE1MSHR0cFJlcXVlc3QuSEVBREVSU19SRUNFSVZFRDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDdXJyZW50bHkgdHJlYXRzIEFMTCBkYXRhIGFzIGEgRE9NU3RyaW5nIChpLmUuIG5vIERvY3VtZW50KVxuICAgIHNlbmQ6IGZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICAgICAgICB2ZXJpZnlTdGF0ZSh0aGlzKTtcblxuICAgICAgICBpZiAoIS9eKGhlYWQpJC9pLnRlc3QodGhpcy5tZXRob2QpKSB7XG4gICAgICAgICAgICB2YXIgY29udGVudFR5cGUgPSBnZXRIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVycywgXCJDb250ZW50LVR5cGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0SGVhZGVyc1tjb250ZW50VHlwZV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnJlcXVlc3RIZWFkZXJzW2NvbnRlbnRUeXBlXS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVyc1tjb250ZW50VHlwZV0gPSB2YWx1ZVswXSArIFwiO2NoYXJzZXQ9dXRmLThcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNGb3JtRGF0YSAmJiAhKGRhdGEgaW5zdGFuY2VvZiBGb3JtRGF0YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLThcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0Qm9keSA9IGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVycm9yRmxhZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbmRGbGFnID0gdGhpcy5hc3luYztcbiAgICAgICAgY2xlYXJSZXNwb25zZSh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlQ2hhbmdlKEZha2VYTUxIdHRwUmVxdWVzdC5PUEVORUQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vblNlbmQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5vblNlbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGxpc3RlbiBpZiBzZXRJbnRlcnZhbCBhbmQgRGF0ZSBhcmUgYSBzdHViYmVkLlxuICAgICAgICBpZiAoc2lub25YaHIuc3VwcG9ydHNUaW1lb3V0ICYmIHR5cGVvZiBzZXRJbnRlcnZhbC5jbG9jayA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgRGF0ZS5jbG9jayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdmFyIGluaXRpYXRlZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBMaXN0ZW4gdG8gYW55IHBvc3NpYmxlIHRpY2sgYnkgZmFrZSB0aW1lcnMgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aW1lb3V0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiBleGNlZWRlZC4gSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRpbWVvdXQgY2FuIGJlIGNoYW5nZWQgd2hpbGUgYSByZXF1ZXN0XG4gICAgICAgICAgICAvLyBpcyBpbiBmbGlnaHQsIHNvIHdlIG11c3QgY2hlY2sgYW55dGltZSB0aGUgZW5kIHVzZXIgZm9yY2VzIGEgY2xvY2sgdGljayB0byBtYWtlXG4gICAgICAgICAgICAvLyBzdXJlIHRpbWVvdXQgaGFzbid0IGNoYW5nZWQuXG4gICAgICAgICAgICAvLyBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI2RmblJldHVybkxpbmstMlxuICAgICAgICAgICAgdmFyIGNsZWFySW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVhZHlTdGF0ZSBoYXMgYmVlbiByZXNldCBvciBpcyBkb25lLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVyZVxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBubyB0aW1lb3V0LiBUaGlzIHdpbGwgYWxzbyBwcmV2ZW50IGFib3J0ZWQgcmVxdWVzdHMgYW5kXG4gICAgICAgICAgICAgICAgLy8gZmFrZVNlcnZlcldpdGhDbG9jayBmcm9tIHRyaWdnZXJpbmcgdW5uZWNlc3NhcnkgcmVzcG9uc2VzLlxuICAgICAgICAgICAgICAgIGlmIChzZWxmLnJlYWR5U3RhdGUgPT09IEZha2VYTUxIdHRwUmVxdWVzdC5VTlNFTlRcbiAgICAgICAgICAgICAgICAgIHx8IHNlbGYucmVhZHlTdGF0ZSA9PT0gRmFrZVhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjbGVhckludGVydmFsSWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYudGltZW91dCA9PT0gXCJudW1iZXJcIiAmJiBzZWxmLnRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID49IChpbml0aWF0ZWRUaW1lICsgc2VsZi50aW1lb3V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjbGVhckludGVydmFsSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IHNpbm9uRXZlbnQuRXZlbnQoXCJsb2Fkc3RhcnRcIiwgZmFsc2UsIGZhbHNlLCB0aGlzKSk7XG4gICAgfSxcblxuICAgIGFib3J0OiBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmVxdWVzdEVycm9yU3RlcHModGhpcyk7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IEZha2VYTUxIdHRwUmVxdWVzdC5VTlNFTlQ7XG4gICAgfSxcblxuICAgIGVycm9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNsZWFyUmVzcG9uc2UodGhpcyk7XG4gICAgICAgIHRoaXMuZXJyb3JGbGFnID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgICAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZUNoYW5nZShGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORSk7XG4gICAgfSxcblxuICAgIHRyaWdnZXJUaW1lb3V0OiBmdW5jdGlvbiB0cmlnZ2VyVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzVGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy50aW1lZE91dCA9IHRydWU7XG4gICAgICAgICAgICByZXF1ZXN0RXJyb3JTdGVwcyh0aGlzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPCBGYWtlWE1MSHR0cFJlcXVlc3QuSEVBREVSU19SRUNFSVZFRCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoL15TZXQtQ29va2llMj8kL2kudGVzdChoZWFkZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGhlYWRlciA9IGdldEhlYWRlcih0aGlzLnJlc3BvbnNlSGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZUhlYWRlcnNbaGVhZGVyXSB8fCBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uIGdldEFsbFJlc3BvbnNlSGVhZGVycygpIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA8IEZha2VYTUxIdHRwUmVxdWVzdC5IRUFERVJTX1JFQ0VJVkVEKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXNwb25zZUhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycztcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBPYmplY3Qua2V5cyhyZXNwb25zZUhlYWRlcnMpXG4gICAgICAgICAgICAuZmlsdGVyKGV4Y2x1ZGVTZXRDb29raWUySGVhZGVyKVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAocHJldiwgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVzcG9uc2VIZWFkZXJzW2hlYWRlcl07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIChoZWFkZXIgKyBcIjogXCIgKyB2YWx1ZSArIFwiXFxyXFxuXCIpO1xuICAgICAgICAgICAgfSwgXCJcIik7XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfSxcblxuICAgIHNldFJlc3BvbnNlQm9keTogZnVuY3Rpb24gc2V0UmVzcG9uc2VCb2R5KGJvZHkpIHtcbiAgICAgICAgdmVyaWZ5UmVxdWVzdFNlbnQodGhpcyk7XG4gICAgICAgIHZlcmlmeUhlYWRlcnNSZWNlaXZlZCh0aGlzKTtcbiAgICAgICAgdmVyaWZ5UmVzcG9uc2VCb2R5VHlwZShib2R5LCB0aGlzLnJlc3BvbnNlVHlwZSk7XG4gICAgICAgIHZhciBjb250ZW50VHlwZSA9IHRoaXMub3ZlcnJpZGRlbk1pbWVUeXBlIHx8IHRoaXMuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVR5cGVcIik7XG5cbiAgICAgICAgdmFyIGlzVGV4dFJlc3BvbnNlID0gdGhpcy5yZXNwb25zZVR5cGUgPT09IFwiXCIgfHwgdGhpcy5yZXNwb25zZVR5cGUgPT09IFwidGV4dFwiO1xuICAgICAgICBjbGVhclJlc3BvbnNlKHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5hc3luYykge1xuICAgICAgICAgICAgdmFyIGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplIHx8IDEwO1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gMDtcblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZUNoYW5nZShGYWtlWE1MSHR0cFJlcXVlc3QuTE9BRElORyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUZXh0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZVRleHQgPSB0aGlzLnJlc3BvbnNlICs9IGJvZHkuc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ICs9IGNodW5rU2l6ZTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGluZGV4IDwgYm9keS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IGNvbnZlcnRSZXNwb25zZUJvZHkodGhpcy5yZXNwb25zZVR5cGUsIGNvbnRlbnRUeXBlLCBib2R5KTtcbiAgICAgICAgaWYgKGlzVGV4dFJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IHRoaXMucmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZXNwb25zZVR5cGUgPT09IFwiZG9jdW1lbnRcIikge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZVhNTCA9IHRoaXMucmVzcG9uc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXNwb25zZVR5cGUgPT09IFwiXCIgJiYgaXNYbWxDb250ZW50VHlwZShjb250ZW50VHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VYTUwgPSBGYWtlWE1MSHR0cFJlcXVlc3QucGFyc2VYTUwodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZUNoYW5nZShGYWtlWE1MSHR0cFJlcXVlc3QuRE9ORSk7XG4gICAgfSxcblxuICAgIHJlc3BvbmQ6IGZ1bmN0aW9uIHJlc3BvbmQoc3RhdHVzLCBoZWFkZXJzLCBib2R5KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdHVzKHN0YXR1cyk7XG4gICAgICAgIHRoaXMuc2V0UmVzcG9uc2VIZWFkZXJzKGhlYWRlcnMgfHwge30pO1xuICAgICAgICB0aGlzLnNldFJlc3BvbnNlQm9keShib2R5IHx8IFwiXCIpO1xuICAgIH0sXG5cbiAgICB1cGxvYWRQcm9ncmVzczogZnVuY3Rpb24gdXBsb2FkUHJvZ3Jlc3MocHJvZ3Jlc3NFdmVudFJhdykge1xuICAgICAgICBpZiAoc3VwcG9ydHNQcm9ncmVzcykge1xuICAgICAgICAgICAgdGhpcy51cGxvYWQuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KFwicHJvZ3Jlc3NcIiwgcHJvZ3Jlc3NFdmVudFJhdywgdGhpcy51cGxvYWQpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkb3dubG9hZFByb2dyZXNzOiBmdW5jdGlvbiBkb3dubG9hZFByb2dyZXNzKHByb2dyZXNzRXZlbnRSYXcpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5Qcm9ncmVzc0V2ZW50KFwicHJvZ3Jlc3NcIiwgcHJvZ3Jlc3NFdmVudFJhdywgdGhpcykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHVwbG9hZEVycm9yOiBmdW5jdGlvbiB1cGxvYWRFcnJvcihlcnJvcikge1xuICAgICAgICBpZiAoc3VwcG9ydHNDdXN0b21FdmVudCkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWQuZGlzcGF0Y2hFdmVudChuZXcgc2lub25FdmVudC5DdXN0b21FdmVudChcImVycm9yXCIsIHtkZXRhaWw6IGVycm9yfSkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uIG92ZXJyaWRlTWltZVR5cGUodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID49IEZha2VYTUxIdHRwUmVxdWVzdC5MT0FESU5HKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEX1NUQVRFX0VSUlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm92ZXJyaWRkZW5NaW1lVHlwZSA9IHR5cGU7XG4gICAgfVxufSk7XG5cbnZhciBzdGF0ZXMgPSB7XG4gICAgVU5TRU5UOiAwLFxuICAgIE9QRU5FRDogMSxcbiAgICBIRUFERVJTX1JFQ0VJVkVEOiAyLFxuICAgIExPQURJTkc6IDMsXG4gICAgRE9ORTogNFxufTtcblxuZXh0ZW5kKEZha2VYTUxIdHRwUmVxdWVzdCwgc3RhdGVzKTtcbmV4dGVuZChGYWtlWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCBzdGF0ZXMpO1xuXG5mdW5jdGlvbiB1c2VGYWtlWE1MSHR0cFJlcXVlc3QoKSB7XG4gICAgRmFrZVhNTEh0dHBSZXF1ZXN0LnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKGtlZXBPbkNyZWF0ZSkge1xuICAgICAgICBpZiAoc2lub25YaHIuc3VwcG9ydHNYSFIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5YTUxIdHRwUmVxdWVzdCA9IHNpbm9uWGhyLkdsb2JhbFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzQWN0aXZlWCkge1xuICAgICAgICAgICAgZ2xvYmFsLkFjdGl2ZVhPYmplY3QgPSBzaW5vblhoci5HbG9iYWxBY3RpdmVYT2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIEZha2VYTUxIdHRwUmVxdWVzdC5yZXN0b3JlO1xuXG4gICAgICAgIGlmIChrZWVwT25DcmVhdGUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBGYWtlWE1MSHR0cFJlcXVlc3Qub25DcmVhdGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChzaW5vblhoci5zdXBwb3J0c1hIUikge1xuICAgICAgICBnbG9iYWwuWE1MSHR0cFJlcXVlc3QgPSBGYWtlWE1MSHR0cFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgaWYgKHNpbm9uWGhyLnN1cHBvcnRzQWN0aXZlWCkge1xuICAgICAgICBnbG9iYWwuQWN0aXZlWE9iamVjdCA9IGZ1bmN0aW9uIEFjdGl2ZVhPYmplY3Qob2JqSWQpIHtcbiAgICAgICAgICAgIGlmIChvYmpJZCA9PT0gXCJNaWNyb3NvZnQuWE1MSFRUUFwiIHx8IC9eTXN4bWwyXFwuWE1MSFRUUC9pLnRlc3Qob2JqSWQpKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZha2VYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IHNpbm9uWGhyLkdsb2JhbEFjdGl2ZVhPYmplY3Qob2JqSWQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBGYWtlWE1MSHR0cFJlcXVlc3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHhocjogc2lub25YaHIsXG4gICAgRmFrZVhNTEh0dHBSZXF1ZXN0OiBGYWtlWE1MSHR0cFJlcXVlc3QsXG4gICAgdXNlRmFrZVhNTEh0dHBSZXF1ZXN0OiB1c2VGYWtlWE1MSHR0cFJlcXVlc3Rcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmFrZVNlcnZlcjogcmVxdWlyZShcIi4vZmFrZS1zZXJ2ZXJcIiksXG4gICAgZmFrZVNlcnZlcldpdGhDbG9jazogcmVxdWlyZShcIi4vZmFrZS1zZXJ2ZXIvZmFrZS1zZXJ2ZXItd2l0aC1jbG9ja1wiKSxcbiAgICBmYWtlWGhyOiByZXF1aXJlKFwiLi9mYWtlLXhoclwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiB3aXRoR2xvYmFsKF9nbG9iYWwpIHtcbiAgICB2YXIgdXNlckFnZW50ID0gX2dsb2JhbC5uYXZpZ2F0b3IgJiYgX2dsb2JhbC5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIHZhciBpc1J1bm5pbmdJbklFID0gdXNlckFnZW50ICYmIHVzZXJBZ2VudC5pbmRleE9mKFwiTVNJRSBcIikgPiAtMTtcbiAgICB2YXIgbWF4VGltZW91dCA9IE1hdGgucG93KDIsIDMxKSAtIDE7IC8vc2VlIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludFxuXG4gICAgLy8gTWFrZSBwcm9wZXJ0aWVzIHdyaXRhYmxlIGluIElFLCBhcyBwZXJcbiAgICAvLyBodHRwOi8vd3d3LmFkZXF1YXRlbHlnb29kLmNvbS9SZXBsYWNpbmctc2V0VGltZW91dC1HbG9iYWxseS5odG1sXG4gICAgaWYgKGlzUnVubmluZ0luSUUpIHtcbiAgICAgICAgX2dsb2JhbC5zZXRUaW1lb3V0ID0gX2dsb2JhbC5zZXRUaW1lb3V0O1xuICAgICAgICBfZ2xvYmFsLmNsZWFyVGltZW91dCA9IF9nbG9iYWwuY2xlYXJUaW1lb3V0O1xuICAgICAgICBfZ2xvYmFsLnNldEludGVydmFsID0gX2dsb2JhbC5zZXRJbnRlcnZhbDtcbiAgICAgICAgX2dsb2JhbC5jbGVhckludGVydmFsID0gX2dsb2JhbC5jbGVhckludGVydmFsO1xuICAgICAgICBfZ2xvYmFsLkRhdGUgPSBfZ2xvYmFsLkRhdGU7XG4gICAgfVxuXG4gICAgLy8gc2V0SW1tZWRpYXRlIGlzIG5vdCBhIHN0YW5kYXJkIGZ1bmN0aW9uXG4gICAgLy8gYXZvaWQgYWRkaW5nIHRoZSBwcm9wIHRvIHRoZSB3aW5kb3cgb2JqZWN0IGlmIG5vdCBwcmVzZW50XG4gICAgaWYgKF9nbG9iYWwuc2V0SW1tZWRpYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX2dsb2JhbC5zZXRJbW1lZGlhdGUgPSBfZ2xvYmFsLnNldEltbWVkaWF0ZTtcbiAgICAgICAgX2dsb2JhbC5jbGVhckltbWVkaWF0ZSA9IF9nbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG4gICAgfVxuXG4gICAgLy8gbm9kZSBleHBlY3RzIHNldFRpbWVvdXQvc2V0SW50ZXJ2YWwgdG8gcmV0dXJuIGEgZm4gb2JqZWN0IHcvIC5yZWYoKS8udW5yZWYoKVxuICAgIC8vIGJyb3dzZXJzLCBhIG51bWJlci5cbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nqb2hhbnNlbi9TaW5vbi5KUy9wdWxsLzQzNlxuXG4gICAgdmFyIE5PT1AgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmRlZmluZWQ7IH07XG4gICAgdmFyIHRpbWVvdXRSZXN1bHQgPSBfZ2xvYmFsLnNldFRpbWVvdXQoTk9PUCwgMCk7XG4gICAgdmFyIGFkZFRpbWVyUmV0dXJuc09iamVjdCA9IHR5cGVvZiB0aW1lb3V0UmVzdWx0ID09PSBcIm9iamVjdFwiO1xuICAgIHZhciBocnRpbWVQcmVzZW50ID0gKF9nbG9iYWwucHJvY2VzcyAmJiB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzLmhydGltZSA9PT0gXCJmdW5jdGlvblwiKTtcbiAgICB2YXIgbmV4dFRpY2tQcmVzZW50ID0gKF9nbG9iYWwucHJvY2VzcyAmJiB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzLm5leHRUaWNrID09PSBcImZ1bmN0aW9uXCIpO1xuICAgIHZhciBwZXJmb3JtYW5jZVByZXNlbnQgPSAoX2dsb2JhbC5wZXJmb3JtYW5jZSAmJiB0eXBlb2YgX2dsb2JhbC5wZXJmb3JtYW5jZS5ub3cgPT09IFwiZnVuY3Rpb25cIik7XG4gICAgdmFyIGhhc1BlcmZvcm1hbmNlUHJvdG90eXBlID0gKF9nbG9iYWwuUGVyZm9ybWFuY2UgJiYgKHR5cGVvZiBfZ2xvYmFsLlBlcmZvcm1hbmNlKS5tYXRjaCgvXihmdW5jdGlvbnxvYmplY3QpJC8pKTtcbiAgICB2YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lUHJlc2VudCA9IChcbiAgICAgICAgX2dsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgdHlwZW9mIF9nbG9iYWwucmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSBcImZ1bmN0aW9uXCJcbiAgICApO1xuICAgIHZhciBjYW5jZWxBbmltYXRpb25GcmFtZVByZXNlbnQgPSAoXG4gICAgICAgIF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgJiYgdHlwZW9mIF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICk7XG5cbiAgICBfZ2xvYmFsLmNsZWFyVGltZW91dCh0aW1lb3V0UmVzdWx0KTtcblxuICAgIHZhciBOYXRpdmVEYXRlID0gX2dsb2JhbC5EYXRlO1xuICAgIHZhciB1bmlxdWVUaW1lcklkID0gMTtcblxuICAgIGZ1bmN0aW9uIGlzTnVtYmVyRmluaXRlKG51bSkge1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG51bSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2Ugc3RyaW5ncyBsaWtlIFwiMDE6MTA6MDBcIiAobWVhbmluZyAxIGhvdXIsIDEwIG1pbnV0ZXMsIDAgc2Vjb25kcykgaW50b1xuICAgICAqIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IGh1bWFuLXJlYWRhYmxlIHN0cmluZ3MgcGFzc2VkXG4gICAgICogdG8gY2xvY2sudGljaygpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VUaW1lKHN0cikge1xuICAgICAgICBpZiAoIXN0cikge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RyaW5ncyA9IHN0ci5zcGxpdChcIjpcIik7XG4gICAgICAgIHZhciBsID0gc3RyaW5ncy5sZW5ndGg7XG4gICAgICAgIHZhciBpID0gbDtcbiAgICAgICAgdmFyIG1zID0gMDtcbiAgICAgICAgdmFyIHBhcnNlZDtcblxuICAgICAgICBpZiAobCA+IDMgfHwgIS9eKFxcZFxcZDopezAsMn1cXGRcXGQ/JC8udGVzdChzdHIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aWNrIG9ubHkgdW5kZXJzdGFuZHMgbnVtYmVycywgJ206cycgYW5kICdoOm06cycuIEVhY2ggcGFydCBtdXN0IGJlIHR3byBkaWdpdHNcIik7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUludChzdHJpbmdzW2ldLCAxMCk7XG5cbiAgICAgICAgICAgIGlmIChwYXJzZWQgPj0gNjApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRpbWUgXCIgKyBzdHIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtcyArPSBwYXJzZWQgKiBNYXRoLnBvdyg2MCwgKGwgLSBpIC0gMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1zICogMTAwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbG9vciBmdW5jdGlvbiB0aGF0IGFsc28gd29ya3MgZm9yIG5lZ2F0aXZlIG51bWJlcnNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaXhlZEZsb29yKG4pIHtcbiAgICAgICAgcmV0dXJuIChuID49IDAgPyBNYXRoLmZsb29yKG4pIDogTWF0aC5jZWlsKG4pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAlIG9wZXJhdG9yIHRoYXQgYWxzbyB3b3JrcyBmb3IgbmVnYXRpdmUgbnVtYmVyc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpeGVkTW9kdWxvKG4sIG0pIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKChuICUgbSkgKyBtKSAlIG0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gZ3JvayB0aGUgYG5vd2AgcGFyYW1ldGVyIHRvIGNyZWF0ZUNsb2NrLlxuICAgICAqIEBwYXJhbSBlcG9jaCB7RGF0ZXxudW1iZXJ9IHRoZSBzeXN0ZW0gdGltZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEVwb2NoKGVwb2NoKSB7XG4gICAgICAgIGlmICghZXBvY2gpIHsgcmV0dXJuIDA7IH1cbiAgICAgICAgaWYgKHR5cGVvZiBlcG9jaC5nZXRUaW1lID09PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIGVwb2NoLmdldFRpbWUoKTsgfVxuICAgICAgICBpZiAodHlwZW9mIGVwb2NoID09PSBcIm51bWJlclwiKSB7IHJldHVybiBlcG9jaDsgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibm93IHNob3VsZCBiZSBtaWxsaXNlY29uZHMgc2luY2UgVU5JWCBlcG9jaFwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpblJhbmdlKGZyb20sIHRvLCB0aW1lcikge1xuICAgICAgICByZXR1cm4gdGltZXIgJiYgdGltZXIuY2FsbEF0ID49IGZyb20gJiYgdGltZXIuY2FsbEF0IDw9IHRvO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1pcnJvckRhdGVQcm9wZXJ0aWVzKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgIHZhciBwcm9wO1xuICAgICAgICBmb3IgKHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IHNwZWNpYWwgbm93IGltcGxlbWVudGF0aW9uXG4gICAgICAgIGlmIChzb3VyY2Uubm93KSB7XG4gICAgICAgICAgICB0YXJnZXQubm93ID0gZnVuY3Rpb24gbm93KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuY2xvY2subm93O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXQubm93O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IHNwZWNpYWwgdG9Tb3VyY2UgaW1wbGVtZW50YXRpb25cbiAgICAgICAgaWYgKHNvdXJjZS50b1NvdXJjZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnRvU291cmNlID0gZnVuY3Rpb24gdG9Tb3VyY2UoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS50b1NvdXJjZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXQudG9Tb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgc3BlY2lhbCB0b1N0cmluZyBpbXBsZW1lbnRhdGlvblxuICAgICAgICB0YXJnZXQudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2UudG9TdHJpbmcoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0YXJnZXQucHJvdG90eXBlID0gc291cmNlLnByb3RvdHlwZTtcbiAgICAgICAgdGFyZ2V0LnBhcnNlID0gc291cmNlLnBhcnNlO1xuICAgICAgICB0YXJnZXQuVVRDID0gc291cmNlLlVUQztcbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZS50b1VUQ1N0cmluZyA9IHNvdXJjZS5wcm90b3R5cGUudG9VVENTdHJpbmc7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlKCkge1xuICAgICAgICBmdW5jdGlvbiBDbG9ja0RhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtcykge1xuICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGFuZCB2ZXJib3NlIHRvIGF2b2lkIHBvdGVudGlhbCBoYXJtIGluIHBhc3NpbmdcbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IHVuZGVmaW5lZCB3aGVuIHVzZXIgZG9lcyBub3QgcGFzcyBhcmd1bWVudFxuICAgICAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoQ2xvY2tEYXRlLmNsb2NrLm5vdyk7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhcik7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgpO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVEYXRlKHllYXIsIG1vbnRoLCBkYXRlKTtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSwgaG91cik7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIsIG1pbnV0ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZURhdGUoeWVhciwgbW9udGgsIGRhdGUsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlycm9yRGF0ZVByb3BlcnRpZXMoQ2xvY2tEYXRlLCBOYXRpdmVEYXRlKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGVucXVldWVKb2IoY2xvY2ssIGpvYikge1xuICAgICAgICAvLyBlbnF1ZXVlcyBhIG1pY3JvdGljay1kZWZlcnJlZCB0YXNrIC0gZWNtYTI2Mi8jc2VjLWVucXVldWVqb2JcbiAgICAgICAgaWYgKCFjbG9jay5qb2JzKSB7XG4gICAgICAgICAgICBjbG9jay5qb2JzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgY2xvY2suam9icy5wdXNoKGpvYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSm9icyhjbG9jaykge1xuICAgICAgICAvLyBydW5zIGFsbCBtaWNyb3RpY2stZGVmZXJyZWQgdGFza3MgLSBlY21hMjYyLyNzZWMtcnVuam9ic1xuICAgICAgICBpZiAoIWNsb2NrLmpvYnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb2NrLmpvYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBqb2IgPSBjbG9jay5qb2JzW2ldO1xuICAgICAgICAgICAgam9iLmZ1bmMuYXBwbHkobnVsbCwgam9iLmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGNsb2NrLmxvb3BMaW1pdCAmJiBpID4gY2xvY2subG9vcExpbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJvcnRpbmcgYWZ0ZXIgcnVubmluZyBcIiArIGNsb2NrLmxvb3BMaW1pdCArIFwiIHRpbWVycywgYXNzdW1pbmcgYW4gaW5maW5pdGUgbG9vcCFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2xvY2suam9icyA9IFtdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRpbWVyKGNsb2NrLCB0aW1lcikge1xuICAgICAgICBpZiAodGltZXIuZnVuYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkIHRvIHRpbWVyIGNhbGxzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZXIudHlwZSA9IHRpbWVyLmltbWVkaWF0ZSA/IFwiSW1tZWRpYXRlXCIgOiBcIlRpbWVvdXRcIjtcblxuICAgICAgICBpZiAodGltZXIuaGFzT3duUHJvcGVydHkoXCJkZWxheVwiKSkge1xuICAgICAgICAgICAgaWYgKCFpc051bWJlckZpbml0ZSh0aW1lci5kZWxheSkpIHtcbiAgICAgICAgICAgICAgICB0aW1lci5kZWxheSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lci5kZWxheSA9IHRpbWVyLmRlbGF5ID4gbWF4VGltZW91dCA/IDEgOiB0aW1lci5kZWxheTtcbiAgICAgICAgICAgIHRpbWVyLmRlbGF5ID0gTWF0aC5tYXgoMCwgdGltZXIuZGVsYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWVyLmhhc093blByb3BlcnR5KFwiaW50ZXJ2YWxcIikpIHtcbiAgICAgICAgICAgIHRpbWVyLnR5cGUgPSBcIkludGVydmFsXCI7XG4gICAgICAgICAgICB0aW1lci5pbnRlcnZhbCA9IHRpbWVyLmludGVydmFsID4gbWF4VGltZW91dCA/IDEgOiB0aW1lci5pbnRlcnZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aW1lci5oYXNPd25Qcm9wZXJ0eShcImFuaW1hdGlvblwiKSkge1xuICAgICAgICAgICAgdGltZXIudHlwZSA9IFwiQW5pbWF0aW9uRnJhbWVcIjtcbiAgICAgICAgICAgIHRpbWVyLmFuaW1hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNsb2NrLnRpbWVycykge1xuICAgICAgICAgICAgY2xvY2sudGltZXJzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lci5pZCA9IHVuaXF1ZVRpbWVySWQrKztcbiAgICAgICAgdGltZXIuY3JlYXRlZEF0ID0gY2xvY2subm93O1xuICAgICAgICB0aW1lci5jYWxsQXQgPSBjbG9jay5ub3cgKyAocGFyc2VJbnQodGltZXIuZGVsYXkpIHx8IChjbG9jay5kdXJpbmdUaWNrID8gMSA6IDApKTtcblxuICAgICAgICBjbG9jay50aW1lcnNbdGltZXIuaWRdID0gdGltZXI7XG5cbiAgICAgICAgaWYgKGFkZFRpbWVyUmV0dXJuc09iamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlcyA9IHtcbiAgICAgICAgICAgICAgICBpZDogdGltZXIuaWQsXG4gICAgICAgICAgICAgICAgcmVmOiBmdW5jdGlvbiAoKSB7IHJldHVybiByZXM7IH0sXG4gICAgICAgICAgICAgICAgdW5yZWY6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlczsgfSxcbiAgICAgICAgICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7IHJldHVybiByZXM7IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbWVyLmlkO1xuICAgIH1cblxuXG4gICAgLyogZXNsaW50IGNvbnNpc3RlbnQtcmV0dXJuOiBcIm9mZlwiICovXG4gICAgZnVuY3Rpb24gY29tcGFyZVRpbWVycyhhLCBiKSB7XG4gICAgICAgIC8vIFNvcnQgZmlyc3QgYnkgYWJzb2x1dGUgdGltaW5nXG4gICAgICAgIGlmIChhLmNhbGxBdCA8IGIuY2FsbEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuY2FsbEF0ID4gYi5jYWxsQXQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGltbWVkaWF0ZSwgaW1tZWRpYXRlIHRpbWVycyB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKGEuaW1tZWRpYXRlICYmICFiLmltbWVkaWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYS5pbW1lZGlhdGUgJiYgYi5pbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGNyZWF0aW9uIHRpbWUsIGVhcmxpZXItY3JlYXRlZCB0aW1lcnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChhLmNyZWF0ZWRBdCA8IGIuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEuY3JlYXRlZEF0ID4gYi5jcmVhdGVkQXQpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBuZXh0IGJ5IGlkLCBsb3dlci1pZCB0aW1lcnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChhLmlkIDwgYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmlkID4gYi5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcyB0aW1lciBpZHMgYXJlIHVuaXF1ZSwgbm8gZmFsbGJhY2sgYDBgIGlzIG5lY2Vzc2FyeVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCBmcm9tLCB0bykge1xuICAgICAgICB2YXIgdGltZXJzID0gY2xvY2sudGltZXJzO1xuICAgICAgICB2YXIgdGltZXIgPSBudWxsO1xuICAgICAgICB2YXIgaWQsIGlzSW5SYW5nZTtcblxuICAgICAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBpc0luUmFuZ2UgPSBpblJhbmdlKGZyb20sIHRvLCB0aW1lcnNbaWRdKTtcblxuICAgICAgICAgICAgICAgIGlmIChpc0luUmFuZ2UgJiYgKCF0aW1lciB8fCBjb21wYXJlVGltZXJzKHRpbWVyLCB0aW1lcnNbaWRdKSA9PT0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZXIgPSB0aW1lcnNbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaXJzdFRpbWVyKGNsb2NrKSB7XG4gICAgICAgIHZhciB0aW1lcnMgPSBjbG9jay50aW1lcnM7XG4gICAgICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgICAgIHZhciBpZDtcblxuICAgICAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbWVyIHx8IGNvbXBhcmVUaW1lcnModGltZXIsIHRpbWVyc1tpZF0pID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gdGltZXJzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGFzdFRpbWVyKGNsb2NrKSB7XG4gICAgICAgIHZhciB0aW1lcnMgPSBjbG9jay50aW1lcnM7XG4gICAgICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgICAgIHZhciBpZDtcblxuICAgICAgICBmb3IgKGlkIGluIHRpbWVycykge1xuICAgICAgICAgICAgaWYgKHRpbWVycy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbWVyIHx8IGNvbXBhcmVUaW1lcnModGltZXIsIHRpbWVyc1tpZF0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IHRpbWVyc1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxUaW1lcihjbG9jaywgdGltZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aW1lci5pbnRlcnZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgY2xvY2sudGltZXJzW3RpbWVyLmlkXS5jYWxsQXQgKz0gdGltZXIuaW50ZXJ2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgY2xvY2sudGltZXJzW3RpbWVyLmlkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGltZXIuZnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aW1lci5mdW5jLmFwcGx5KG51bGwsIHRpbWVyLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogZXNsaW50IG5vLWV2YWw6IFwib2ZmXCIgKi9cbiAgICAgICAgICAgIGV2YWwodGltZXIuZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhclRpbWVyKGNsb2NrLCB0aW1lcklkLCB0dHlwZSkge1xuICAgICAgICBpZiAoIXRpbWVySWQpIHtcbiAgICAgICAgICAgIC8vIG51bGwgYXBwZWFycyB0byBiZSBhbGxvd2VkIGluIG1vc3QgYnJvd3NlcnMsIGFuZCBhcHBlYXJzIHRvIGJlXG4gICAgICAgICAgICAvLyByZWxpZWQgdXBvbiBieSBzb21lIGxpYnJhcmllcywgbGlrZSBCb290c3RyYXAgY2Fyb3VzZWxcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2xvY2sudGltZXJzKSB7XG4gICAgICAgICAgICBjbG9jay50aW1lcnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluIE5vZGUsIHRpbWVySWQgaXMgYW4gb2JqZWN0IHdpdGggLnJlZigpLy51bnJlZigpLCBhbmRcbiAgICAgICAgLy8gaXRzIC5pZCBmaWVsZCBpcyB0aGUgYWN0dWFsIHRpbWVyIGlkLlxuICAgICAgICBpZiAodHlwZW9mIHRpbWVySWQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRpbWVySWQgPSB0aW1lcklkLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsb2NrLnRpbWVycy5oYXNPd25Qcm9wZXJ0eSh0aW1lcklkKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgSUQgbWF0Y2hlcyBhIHRpbWVyIG9mIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgICAgICAgIHZhciB0aW1lciA9IGNsb2NrLnRpbWVyc1t0aW1lcklkXTtcbiAgICAgICAgICAgIGlmICh0aW1lci50eXBlID09PSB0dHlwZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjbG9jay50aW1lcnNbdGltZXJJZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjbGVhciA9IHR0eXBlID09PSBcIkFuaW1hdGlvbkZyYW1lXCIgPyBcImNhbmNlbEFuaW1hdGlvbkZyYW1lXCIgOiBcImNsZWFyXCIgKyB0dHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgc2NoZWR1bGUgPSB0aW1lci50eXBlID09PSBcIkFuaW1hdGlvbkZyYW1lXCIgPyBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiIDogXCJzZXRcIiArIHRpbWVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNsZWFyIHRpbWVyOiB0aW1lciBjcmVhdGVkIHdpdGggXCIgKyBzY2hlZHVsZVxuICAgICAgICAgICAgICAgICAgICArIFwiKCkgYnV0IGNsZWFyZWQgd2l0aCBcIiArIGNsZWFyICsgXCIoKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaW5zdGFsbChjbG9jaywgdGFyZ2V0LCBjb25maWcpIHtcbiAgICAgICAgdmFyIG1ldGhvZCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsO1xuICAgICAgICB2YXIgaW5zdGFsbGVkSHJUaW1lID0gXCJfaHJ0aW1lXCI7XG4gICAgICAgIHZhciBpbnN0YWxsZWROZXh0VGljayA9IFwiX25leHRUaWNrXCI7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGNsb2NrLm1ldGhvZHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBtZXRob2QgPSBjbG9jay5tZXRob2RzW2ldO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJocnRpbWVcIiAmJiB0YXJnZXQucHJvY2Vzcykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wcm9jZXNzLmhydGltZSA9IGNsb2NrW2luc3RhbGxlZEhyVGltZV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJuZXh0VGlja1wiICYmIHRhcmdldC5wcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnByb2Nlc3MubmV4dFRpY2sgPSBjbG9ja1tpbnN0YWxsZWROZXh0VGlja107XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJwZXJmb3JtYW5jZVwiKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBjbG9ja1tcIl9cIiArIG1ldGhvZF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRbbWV0aG9kXSAmJiB0YXJnZXRbbWV0aG9kXS5oYWRPd25Qcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGNsb2NrW1wiX1wiICsgbWV0aG9kXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJjbGVhckludGVydmFsXCIgJiYgY29uZmlnLnNob3VsZEFkdmFuY2VUaW1lID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbWV0aG9kXShjbG9jay5hdHRhY2hlZEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W21ldGhvZF07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgeyAvKiBlc2xpbnQgZW1wdHktYmxvY2s6IFwib2ZmXCIgKi8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgZXhlY3V0aW9ucyB3aGljaCB3aWxsIGNvbXBsZXRlbHkgcmVtb3ZlIHRoZXNlIHByb3BzXG4gICAgICAgIGNsb2NrLm1ldGhvZHMgPSBbXTtcblxuICAgICAgICAvLyByZXR1cm4gcGVuZGluZyB0aW1lcnMsIHRvIGVuYWJsZSBjaGVja2luZyB3aGF0IHRpbWVycyByZW1haW5lZCBvbiB1bmluc3RhbGxcbiAgICAgICAgaWYgKCFjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY2xvY2sudGltZXJzKS5tYXAoZnVuY3Rpb24gbWFwcGVyKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGNsb2NrLnRpbWVyc1trZXldO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoaWphY2tNZXRob2QodGFyZ2V0LCBtZXRob2QsIGNsb2NrKSB7XG4gICAgICAgIHZhciBwcm9wO1xuICAgICAgICBjbG9ja1ttZXRob2RdLmhhZE93blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgbWV0aG9kKTtcbiAgICAgICAgY2xvY2tbXCJfXCIgKyBtZXRob2RdID0gdGFyZ2V0W21ldGhvZF07XG5cbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJEYXRlXCIpIHtcbiAgICAgICAgICAgIHZhciBkYXRlID0gbWlycm9yRGF0ZVByb3BlcnRpZXMoY2xvY2tbbWV0aG9kXSwgdGFyZ2V0W21ldGhvZF0pO1xuICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF0gPSBkYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJwZXJmb3JtYW5jZVwiKSB7XG4gICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGNsb2NrW21ldGhvZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2tbbWV0aG9kXS5hcHBseShjbG9jaywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAocHJvcCBpbiBjbG9ja1ttZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsb2NrW21ldGhvZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZF1bcHJvcF0gPSBjbG9ja1ttZXRob2RdW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldFttZXRob2RdLmNsb2NrID0gY2xvY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9JbnRlcnZhbFRpY2soY2xvY2ssIGFkdmFuY2VUaW1lRGVsdGEpIHtcbiAgICAgICAgY2xvY2sudGljayhhZHZhbmNlVGltZURlbHRhKTtcbiAgICB9XG5cbiAgICB2YXIgdGltZXJzID0ge1xuICAgICAgICBzZXRUaW1lb3V0OiBfZ2xvYmFsLnNldFRpbWVvdXQsXG4gICAgICAgIGNsZWFyVGltZW91dDogX2dsb2JhbC5jbGVhclRpbWVvdXQsXG4gICAgICAgIHNldEltbWVkaWF0ZTogX2dsb2JhbC5zZXRJbW1lZGlhdGUsXG4gICAgICAgIGNsZWFySW1tZWRpYXRlOiBfZ2xvYmFsLmNsZWFySW1tZWRpYXRlLFxuICAgICAgICBzZXRJbnRlcnZhbDogX2dsb2JhbC5zZXRJbnRlcnZhbCxcbiAgICAgICAgY2xlYXJJbnRlcnZhbDogX2dsb2JhbC5jbGVhckludGVydmFsLFxuICAgICAgICBEYXRlOiBfZ2xvYmFsLkRhdGVcbiAgICB9O1xuXG4gICAgaWYgKGhydGltZVByZXNlbnQpIHtcbiAgICAgICAgdGltZXJzLmhydGltZSA9IF9nbG9iYWwucHJvY2Vzcy5ocnRpbWU7XG4gICAgfVxuXG4gICAgaWYgKG5leHRUaWNrUHJlc2VudCkge1xuICAgICAgICB0aW1lcnMubmV4dFRpY2sgPSBfZ2xvYmFsLnByb2Nlc3MubmV4dFRpY2s7XG4gICAgfVxuXG4gICAgaWYgKHBlcmZvcm1hbmNlUHJlc2VudCkge1xuICAgICAgICB0aW1lcnMucGVyZm9ybWFuY2UgPSBfZ2xvYmFsLnBlcmZvcm1hbmNlO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0QW5pbWF0aW9uRnJhbWVQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBfZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICB9XG5cbiAgICBpZiAoY2FuY2VsQW5pbWF0aW9uRnJhbWVQcmVzZW50KSB7XG4gICAgICAgIHRpbWVycy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IF9nbG9iYWwuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHZhciBrcyA9IFtdO1xuICAgICAgICB2YXIga2V5O1xuXG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAga3MucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc3RhcnQge0RhdGV8bnVtYmVyfSB0aGUgc3lzdGVtIHRpbWVcbiAgICAgKiBAcGFyYW0gbG9vcExpbWl0IHtudW1iZXJ9ICBtYXhpbXVtIG51bWJlciBvZiB0aW1lcnMgdGhhdCB3aWxsIGJlIHJ1biB3aGVuIGNhbGxpbmcgcnVuQWxsKClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDbG9jayhzdGFydCwgbG9vcExpbWl0KSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgbG9vcExpbWl0ID0gbG9vcExpbWl0IHx8IDEwMDA7XG5cbiAgICAgICAgaWYgKE5hdGl2ZURhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGdsb2JhbCBzY29wZSBkb2Vzbid0IGhhdmUgYSBgRGF0ZWAgb2JqZWN0XCJcbiAgICAgICAgICAgICAgICArIFwiIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3Npbm9uanMvc2lub24vaXNzdWVzLzE4NTIjaXNzdWVjb21tZW50LTQxOTYyMjc4MClcIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2xvY2sgPSB7XG4gICAgICAgICAgICBub3c6IGdldEVwb2NoKHN0YXJ0KSxcbiAgICAgICAgICAgIGhyTm93OiAwLFxuICAgICAgICAgICAgdGltZW91dHM6IHt9LFxuICAgICAgICAgICAgRGF0ZTogY3JlYXRlRGF0ZSgpLFxuICAgICAgICAgICAgbG9vcExpbWl0OiBsb29wTGltaXRcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5EYXRlLmNsb2NrID0gY2xvY2s7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0VGltZVRvTmV4dEZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIDE2IC0gKChjbG9jay5ub3cgLSBzdGFydCkgJSAxNik7XG4gICAgICAgIH1cblxuICAgICAgICBjbG9jay5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVGltZXIoY2xvY2ssIHtcbiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jLFxuICAgICAgICAgICAgICAgIGFyZ3M6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksXG4gICAgICAgICAgICAgICAgZGVsYXk6IHRpbWVvdXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLmNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIGNsZWFyVGltZW91dCh0aW1lcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJUaW1lb3V0XCIpO1xuICAgICAgICB9O1xuICAgICAgICBjbG9jay5uZXh0VGljayA9IGZ1bmN0aW9uIG5leHRUaWNrKGZ1bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnF1ZXVlSm9iKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBhcmdzOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY2xvY2suc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiBzZXRJbnRlcnZhbChmdW5jLCB0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gcGFyc2VJbnQodGltZW91dCwgMTApO1xuICAgICAgICAgICAgcmV0dXJuIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBhcmdzOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLFxuICAgICAgICAgICAgICAgIGRlbGF5OiB0aW1lb3V0LFxuICAgICAgICAgICAgICAgIGludGVydmFsOiB0aW1lb3V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5jbGVhckludGVydmFsID0gZnVuY3Rpb24gY2xlYXJJbnRlcnZhbCh0aW1lcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJJbnRlcnZhbFwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5zZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGFkZFRpbWVyKGNsb2NrLCB7XG4gICAgICAgICAgICAgICAgZnVuYzogZnVuYyxcbiAgICAgICAgICAgICAgICBhcmdzOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2suY2xlYXJJbW1lZGlhdGUgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZSh0aW1lcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJJbW1lZGlhdGVcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmMpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhZGRUaW1lcihjbG9jaywge1xuICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmMsXG4gICAgICAgICAgICAgICAgZGVsYXk6IGdldFRpbWVUb05leHRGcmFtZSgpLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtjbG9jay5ub3cgKyBnZXRUaW1lVG9OZXh0RnJhbWUoKV0sXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pZCB8fCByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2suY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lcihjbG9jaywgdGltZXJJZCwgXCJBbmltYXRpb25GcmFtZVwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVIclRpbWUobmV3Tm93KSB7XG4gICAgICAgICAgICBjbG9jay5ock5vdyArPSAobmV3Tm93IC0gY2xvY2subm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsb2NrLnJ1bk1pY3JvdGFza3MgPSBmdW5jdGlvbiBydW5NaWNyb3Rhc2tzKCkge1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sudGljayA9IGZ1bmN0aW9uIHRpY2sobXMpIHtcbiAgICAgICAgICAgIG1zID0gdHlwZW9mIG1zID09PSBcIm51bWJlclwiID8gbXMgOiBwYXJzZVRpbWUobXMpO1xuICAgICAgICAgICAgdmFyIHRpY2tGcm9tID0gY2xvY2subm93O1xuICAgICAgICAgICAgdmFyIHRpY2tUbyA9IGNsb2NrLm5vdyArIG1zO1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvY2subm93O1xuICAgICAgICAgICAgdmFyIHRpbWVyLCBmaXJzdEV4Y2VwdGlvbiwgb2xkTm93O1xuXG4gICAgICAgICAgICBjbG9jay5kdXJpbmdUaWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gcGVyZm9ybSBwcm9jZXNzLm5leHRUaWNrKClzXG4gICAgICAgICAgICBvbGROb3cgPSBjbG9jay5ub3c7XG4gICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgICAgIGlmIChvbGROb3cgIT09IGNsb2NrLm5vdykge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBlbnNhdGUgZm9yIGFueSBzZXRTeXN0ZW1UaW1lKCkgY2FsbCBkdXJpbmcgcHJvY2Vzcy5uZXh0VGljaygpIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgdGlja0Zyb20gKz0gY2xvY2subm93IC0gb2xkTm93O1xuICAgICAgICAgICAgICAgIHRpY2tUbyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHBlcmZvcm0gZWFjaCB0aW1lciBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlXG4gICAgICAgICAgICB0aW1lciA9IGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCB0aWNrRnJvbSwgdGlja1RvKTtcbiAgICAgICAgICAgIHdoaWxlICh0aW1lciAmJiB0aWNrRnJvbSA8PSB0aWNrVG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xvY2sudGltZXJzW3RpbWVyLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVIclRpbWUodGltZXIuY2FsbEF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGlja0Zyb20gPSB0aW1lci5jYWxsQXQ7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLm5vdyA9IHRpbWVyLmNhbGxBdDtcbiAgICAgICAgICAgICAgICAgICAgb2xkTm93ID0gY2xvY2subm93O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsVGltZXIoY2xvY2ssIHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNlcHRpb24gPSBmaXJzdEV4Y2VwdGlvbiB8fCBlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcGVuc2F0ZSBmb3IgYW55IHNldFN5c3RlbVRpbWUoKSBjYWxsIGR1cmluZyB0aW1lciBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAob2xkTm93ICE9PSBjbG9jay5ub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tGcm9tICs9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tUbyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aW1lciA9IGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCBwcmV2aW91cywgdGlja1RvKTtcbiAgICAgICAgICAgICAgICBwcmV2aW91cyA9IHRpY2tGcm9tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwZXJmb3JtIHByb2Nlc3MubmV4dFRpY2soKXMgYWdhaW5cbiAgICAgICAgICAgIG9sZE5vdyA9IGNsb2NrLm5vdztcbiAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgaWYgKG9sZE5vdyAhPT0gY2xvY2subm93KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcGVuc2F0ZSBmb3IgYW55IHNldFN5c3RlbVRpbWUoKSBjYWxsIGR1cmluZyBwcm9jZXNzLm5leHRUaWNrKCkgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICB0aWNrRnJvbSArPSBjbG9jay5ub3cgLSBvbGROb3c7XG4gICAgICAgICAgICAgICAgdGlja1RvICs9IGNsb2NrLm5vdyAtIG9sZE5vdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gY29ybmVyIGNhc2U6IGR1cmluZyBydW5Kb2JzLCBuZXcgdGltZXJzIHdlcmUgc2NoZWR1bGVkIHdoaWNoIGNvdWxkIGJlIGluIHRoZSByYW5nZSBbY2xvY2subm93LCB0aWNrVG9dXG4gICAgICAgICAgICB0aW1lciA9IGZpcnN0VGltZXJJblJhbmdlKGNsb2NrLCB0aWNrRnJvbSwgdGlja1RvKTtcbiAgICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLnRpY2sodGlja1RvIC0gY2xvY2subm93KTsgLy8gZG8gaXQgYWxsIGFnYWluIC0gZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlcXVlc3RlZCByYW5nZVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGNlcHRpb24gPSBmaXJzdEV4Y2VwdGlvbiB8fCBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gdGltZXJzIHJlbWFpbmluZyBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlOiBtb3ZlIHRoZSBjbG9jayBhbGwgdGhlIHdheSB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgdXBkYXRlSHJUaW1lKHRpY2tUbyk7XG4gICAgICAgICAgICAgICAgY2xvY2subm93ID0gdGlja1RvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0RXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZmlyc3RFeGNlcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLm5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICB2YXIgdGltZXIgPSBmaXJzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgIGlmICghdGltZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbG9jay5kdXJpbmdUaWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlSHJUaW1lKHRpbWVyLmNhbGxBdCk7XG4gICAgICAgICAgICAgICAgY2xvY2subm93ID0gdGltZXIuY2FsbEF0O1xuICAgICAgICAgICAgICAgIGNhbGxUaW1lcihjbG9jaywgdGltZXIpO1xuICAgICAgICAgICAgICAgIHJ1bkpvYnMoY2xvY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9jay5ub3c7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGNsb2NrLmR1cmluZ1RpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5ydW5BbGwgPSBmdW5jdGlvbiBydW5BbGwoKSB7XG4gICAgICAgICAgICB2YXIgbnVtVGltZXJzLCBpO1xuICAgICAgICAgICAgcnVuSm9icyhjbG9jayk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xvY2subG9vcExpbWl0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsb2NrLnRpbWVycykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG51bVRpbWVycyA9IGtleXMoY2xvY2sudGltZXJzKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG51bVRpbWVycyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsb2NrLm5leHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJvcnRpbmcgYWZ0ZXIgcnVubmluZyBcIiArIGNsb2NrLmxvb3BMaW1pdCArIFwiIHRpbWVycywgYXNzdW1pbmcgYW4gaW5maW5pdGUgbG9vcCFcIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucnVuVG9GcmFtZSA9IGZ1bmN0aW9uIHJ1blRvRnJhbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvY2sudGljayhnZXRUaW1lVG9OZXh0RnJhbWUoKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2sucnVuVG9MYXN0ID0gZnVuY3Rpb24gcnVuVG9MYXN0KCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyID0gbGFzdFRpbWVyKGNsb2NrKTtcbiAgICAgICAgICAgIGlmICghdGltZXIpIHtcbiAgICAgICAgICAgICAgICBydW5Kb2JzKGNsb2NrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvY2subm93O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY2xvY2sudGljayh0aW1lci5jYWxsQXQgLSBjbG9jay5ub3cpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsb2NrLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgICAgICBjbG9jay50aW1lcnMgPSB7fTtcbiAgICAgICAgICAgIGNsb2NrLmpvYnMgPSBbXTtcbiAgICAgICAgICAgIGNsb2NrLm5vdyA9IGdldEVwb2NoKHN0YXJ0KTtcbiAgICAgICAgICAgIGNsb2NrLmhyTm93ID0gMDtcbiAgICAgICAgfTtcblxuICAgICAgICBjbG9jay5zZXRTeXN0ZW1UaW1lID0gZnVuY3Rpb24gc2V0U3lzdGVtVGltZShzeXN0ZW1UaW1lKSB7XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGltZSBkaWZmZXJlbmNlXG4gICAgICAgICAgICB2YXIgbmV3Tm93ID0gZ2V0RXBvY2goc3lzdGVtVGltZSk7XG4gICAgICAgICAgICB2YXIgZGlmZmVyZW5jZSA9IG5ld05vdyAtIGNsb2NrLm5vdztcbiAgICAgICAgICAgIHZhciBpZCwgdGltZXI7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSAnc3lzdGVtIGNsb2NrJ1xuICAgICAgICAgICAgY2xvY2subm93ID0gbmV3Tm93O1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgdGltZXJzIGFuZCBpbnRlcnZhbHMgdG8ga2VlcCB0aGVtIHN0YWJsZVxuICAgICAgICAgICAgZm9yIChpZCBpbiBjbG9jay50aW1lcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xvY2sudGltZXJzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IGNsb2NrLnRpbWVyc1tpZF07XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyLmNyZWF0ZWRBdCArPSBkaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICB0aW1lci5jYWxsQXQgKz0gZGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHBlcmZvcm1hbmNlUHJlc2VudCkge1xuICAgICAgICAgICAgY2xvY2sucGVyZm9ybWFuY2UgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgICAgICBpZiAoaGFzUGVyZm9ybWFuY2VQcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdG8gPSBfZ2xvYmFsLlBlcmZvcm1hbmNlLnByb3RvdHlwZTtcblxuICAgICAgICAgICAgICAgIE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90bylcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLnBlcmZvcm1hbmNlW25hbWVdID0gTk9PUDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsb2NrLnBlcmZvcm1hbmNlLm5vdyA9IGZ1bmN0aW9uIGxvbGV4Tm93KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9jay5ock5vdztcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaHJ0aW1lUHJlc2VudCkge1xuICAgICAgICAgICAgY2xvY2suaHJ0aW1lID0gZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2xkU2VjcyA9IChwcmV2WzBdICsgcHJldlsxXSAvIDFlOSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdTZWNzID0gKGNsb2NrLmhyTm93IC8gMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWZmZXJlbmNlID0gKG5ld1NlY3MgLSBvbGRTZWNzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlY3MgPSBmaXhlZEZsb29yKGRpZmZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmFub3NlY3MgPSBmaXhlZE1vZHVsbyhkaWZmZXJlbmNlICogMWU5LCAxZTkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbm9zZWNzXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGZpeGVkRmxvb3IoY2xvY2suaHJOb3cgLyAxMDAwKSxcbiAgICAgICAgICAgICAgICAgICAgZml4ZWRNb2R1bG8oY2xvY2suaHJOb3cgKiAxZTYsIDFlOSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbG9jaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uZmlnIHtPYmplY3R9IG9wdGlvbmFsIGNvbmZpZ1xuICAgICAqIEBwYXJhbSBjb25maWcudGFyZ2V0IHtPYmplY3R9IHRoZSB0YXJnZXQgdG8gaW5zdGFsbCB0aW1lcnMgaW4gKGRlZmF1bHQgYHdpbmRvd2ApXG4gICAgICogQHBhcmFtIGNvbmZpZy5ub3cge251bWJlcnxEYXRlfSAgYSBudW1iZXIgKGluIG1pbGxpc2Vjb25kcykgb3IgYSBEYXRlIG9iamVjdCAoZGVmYXVsdCBlcG9jaClcbiAgICAgKiBAcGFyYW0gY29uZmlnLnRvRmFrZSB7c3RyaW5nW119IG5hbWVzIG9mIHRoZSBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGZha2VkLlxuICAgICAqIEBwYXJhbSBjb25maWcubG9vcExpbWl0IHtudW1iZXJ9IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcnMgdGhhdCB3aWxsIGJlIHJ1biB3aGVuIGNhbGxpbmcgcnVuQWxsKClcbiAgICAgKiBAcGFyYW0gY29uZmlnLnNob3VsZEFkdmFuY2VUaW1lIHtCb29sZWFufSB0ZWxscyBsb2xleCB0byBpbmNyZW1lbnQgbW9ja2VkIHRpbWUgYXV0b21hdGljYWxseSAoZGVmYXVsdCBmYWxzZSlcbiAgICAgKiBAcGFyYW0gY29uZmlnLmFkdmFuY2VUaW1lRGVsdGEge051bWJlcn0gaW5jcmVtZW50IG1vY2tlZCB0aW1lIGV2ZXJ5IDw8YWR2YW5jZVRpbWVEZWx0YT4+IG1zIChkZWZhdWx0OiAyMG1zKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoY29uZmlnKSB7XG4gICAgICAgIGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgfHwgY29uZmlnIGluc3RhbmNlb2YgRGF0ZSB8fCBBcnJheS5pc0FycmF5KGNvbmZpZykgfHwgdHlwZW9mIGNvbmZpZyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxvbGV4Lmluc3RhbGwgY2FsbGVkIHdpdGggXCIgKyBTdHJpbmcoY29uZmlnKSArXG4gICAgICAgICAgICAgICAgXCIgbG9sZXggMi4wKyByZXF1aXJlcyBhbiBvYmplY3QgcGFyYW1ldGVyIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5vbmpzL2xvbGV4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZyA9IHR5cGVvZiBjb25maWcgIT09IFwidW5kZWZpbmVkXCIgPyBjb25maWcgOiB7fTtcbiAgICAgICAgY29uZmlnLnNob3VsZEFkdmFuY2VUaW1lID0gY29uZmlnLnNob3VsZEFkdmFuY2VUaW1lIHx8IGZhbHNlO1xuICAgICAgICBjb25maWcuYWR2YW5jZVRpbWVEZWx0YSA9IGNvbmZpZy5hZHZhbmNlVGltZURlbHRhIHx8IDIwO1xuXG4gICAgICAgIHZhciBpLCBsO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gY29uZmlnLnRhcmdldCB8fCBfZ2xvYmFsO1xuICAgICAgICB2YXIgY2xvY2sgPSBjcmVhdGVDbG9jayhjb25maWcubm93LCBjb25maWcubG9vcExpbWl0KTtcblxuICAgICAgICBjbG9jay51bmluc3RhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5pbnN0YWxsKGNsb2NrLCB0YXJnZXQsIGNvbmZpZyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xvY2subWV0aG9kcyA9IGNvbmZpZy50b0Zha2UgfHwgW107XG5cbiAgICAgICAgaWYgKGNsb2NrLm1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBkbyBub3QgZmFrZSBuZXh0VGljayBieSBkZWZhdWx0IC0gR2l0SHViIzEyNlxuICAgICAgICAgICAgY2xvY2subWV0aG9kcyA9IGtleXModGltZXJzKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge3JldHVybiBrZXkgIT09IFwibmV4dFRpY2tcIjt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBjbG9jay5tZXRob2RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNsb2NrLm1ldGhvZHNbaV0gPT09IFwiaHJ0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnByb2Nlc3MgJiYgdHlwZW9mIHRhcmdldC5wcm9jZXNzLmhydGltZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpamFja01ldGhvZCh0YXJnZXQucHJvY2VzcywgY2xvY2subWV0aG9kc1tpXSwgY2xvY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvY2subWV0aG9kc1tpXSA9PT0gXCJuZXh0VGlja1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wcm9jZXNzICYmIHR5cGVvZiB0YXJnZXQucHJvY2Vzcy5uZXh0VGljayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGhpamFja01ldGhvZCh0YXJnZXQucHJvY2VzcywgY2xvY2subWV0aG9kc1tpXSwgY2xvY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsb2NrLm1ldGhvZHNbaV0gPT09IFwic2V0SW50ZXJ2YWxcIiAmJiBjb25maWcuc2hvdWxkQWR2YW5jZVRpbWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFsVGljayA9IGRvSW50ZXJ2YWxUaWNrLmJpbmQobnVsbCwgY2xvY2ssIGNvbmZpZy5hZHZhbmNlVGltZURlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFsSWQgPSB0YXJnZXRbY2xvY2subWV0aG9kc1tpXV0oXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbFRpY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYWR2YW5jZVRpbWVEZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLmF0dGFjaGVkSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoaWphY2tNZXRob2QodGFyZ2V0LCBjbG9jay5tZXRob2RzW2ldLCBjbG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xvY2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGltZXJzOiB0aW1lcnMsXG4gICAgICAgIGNyZWF0ZUNsb2NrOiBjcmVhdGVDbG9jayxcbiAgICAgICAgaW5zdGFsbDogaW5zdGFsbCxcbiAgICAgICAgd2l0aEdsb2JhbDogd2l0aEdsb2JhbFxuICAgIH07XG59XG5cbnZhciBkZWZhdWx0SW1wbGVtZW50YXRpb24gPSB3aXRoR2xvYmFsKGdsb2JhbCB8fCB3aW5kb3cpO1xuXG5leHBvcnRzLnRpbWVycyA9IGRlZmF1bHRJbXBsZW1lbnRhdGlvbi50aW1lcnM7XG5leHBvcnRzLmNyZWF0ZUNsb2NrID0gZGVmYXVsdEltcGxlbWVudGF0aW9uLmNyZWF0ZUNsb2NrO1xuZXhwb3J0cy5pbnN0YWxsID0gZGVmYXVsdEltcGxlbWVudGF0aW9uLmluc3RhbGw7XG5leHBvcnRzLndpdGhHbG9iYWwgPSB3aXRoR2xvYmFsO1xuIiwidmFyIGlzYXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuLyoqXG4gKiBFeHBvc2UgYHBhdGhUb1JlZ2V4cGAuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gcGF0aFRvUmVnZXhwXG5tb2R1bGUuZXhwb3J0cy5wYXJzZSA9IHBhcnNlXG5tb2R1bGUuZXhwb3J0cy5jb21waWxlID0gY29tcGlsZVxubW9kdWxlLmV4cG9ydHMudG9rZW5zVG9GdW5jdGlvbiA9IHRva2Vuc1RvRnVuY3Rpb25cbm1vZHVsZS5leHBvcnRzLnRva2Vuc1RvUmVnRXhwID0gdG9rZW5zVG9SZWdFeHBcblxuLyoqXG4gKiBUaGUgbWFpbiBwYXRoIG1hdGNoaW5nIHJlZ2V4cCB1dGlsaXR5LlxuICpcbiAqIEB0eXBlIHtSZWdFeHB9XG4gKi9cbnZhciBQQVRIX1JFR0VYUCA9IG5ldyBSZWdFeHAoW1xuICAvLyBNYXRjaCBlc2NhcGVkIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYXBwZWFyIGluIGZ1dHVyZSBtYXRjaGVzLlxuICAvLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgd29uJ3QgdHJhbnNmb3JtLlxuICAnKFxcXFxcXFxcLiknLFxuICAvLyBNYXRjaCBFeHByZXNzLXN0eWxlIHBhcmFtZXRlcnMgYW5kIHVuLW5hbWVkIHBhcmFtZXRlcnMgd2l0aCBhIHByZWZpeFxuICAvLyBhbmQgb3B0aW9uYWwgc3VmZml4ZXMuIE1hdGNoZXMgYXBwZWFyIGFzOlxuICAvL1xuICAvLyBcIi86dGVzdChcXFxcZCspP1wiID0+IFtcIi9cIiwgXCJ0ZXN0XCIsIFwiXFxkK1wiLCB1bmRlZmluZWQsIFwiP1wiLCB1bmRlZmluZWRdXG4gIC8vIFwiL3JvdXRlKFxcXFxkKylcIiAgPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFwiXFxkK1wiLCB1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgLy8gXCIvKlwiICAgICAgICAgICAgPT4gW1wiL1wiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFwiKlwiXVxuICAnKFtcXFxcLy5dKT8oPzooPzpcXFxcOihcXFxcdyspKD86XFxcXCgoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKV0pKylcXFxcKSk/fFxcXFwoKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKCldKSspXFxcXCkpKFsrKj9dKT98KFxcXFwqKSknXG5dLmpvaW4oJ3wnKSwgJ2cnKVxuXG4vKipcbiAqIFBhcnNlIGEgc3RyaW5nIGZvciB0aGUgcmF3IHRva2Vucy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBzdHJcbiAqIEBwYXJhbSAge09iamVjdD19IG9wdGlvbnNcbiAqIEByZXR1cm4geyFBcnJheX1cbiAqL1xuZnVuY3Rpb24gcGFyc2UgKHN0ciwgb3B0aW9ucykge1xuICB2YXIgdG9rZW5zID0gW11cbiAgdmFyIGtleSA9IDBcbiAgdmFyIGluZGV4ID0gMFxuICB2YXIgcGF0aCA9ICcnXG4gIHZhciBkZWZhdWx0RGVsaW1pdGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlbGltaXRlciB8fCAnLydcbiAgdmFyIHJlc1xuXG4gIHdoaWxlICgocmVzID0gUEFUSF9SRUdFWFAuZXhlYyhzdHIpKSAhPSBudWxsKSB7XG4gICAgdmFyIG0gPSByZXNbMF1cbiAgICB2YXIgZXNjYXBlZCA9IHJlc1sxXVxuICAgIHZhciBvZmZzZXQgPSByZXMuaW5kZXhcbiAgICBwYXRoICs9IHN0ci5zbGljZShpbmRleCwgb2Zmc2V0KVxuICAgIGluZGV4ID0gb2Zmc2V0ICsgbS5sZW5ndGhcblxuICAgIC8vIElnbm9yZSBhbHJlYWR5IGVzY2FwZWQgc2VxdWVuY2VzLlxuICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICBwYXRoICs9IGVzY2FwZWRbMV1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFyIG5leHQgPSBzdHJbaW5kZXhdXG4gICAgdmFyIHByZWZpeCA9IHJlc1syXVxuICAgIHZhciBuYW1lID0gcmVzWzNdXG4gICAgdmFyIGNhcHR1cmUgPSByZXNbNF1cbiAgICB2YXIgZ3JvdXAgPSByZXNbNV1cbiAgICB2YXIgbW9kaWZpZXIgPSByZXNbNl1cbiAgICB2YXIgYXN0ZXJpc2sgPSByZXNbN11cblxuICAgIC8vIFB1c2ggdGhlIGN1cnJlbnQgcGF0aCBvbnRvIHRoZSB0b2tlbnMuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHRva2Vucy5wdXNoKHBhdGgpXG4gICAgICBwYXRoID0gJydcbiAgICB9XG5cbiAgICB2YXIgcGFydGlhbCA9IHByZWZpeCAhPSBudWxsICYmIG5leHQgIT0gbnVsbCAmJiBuZXh0ICE9PSBwcmVmaXhcbiAgICB2YXIgcmVwZWF0ID0gbW9kaWZpZXIgPT09ICcrJyB8fCBtb2RpZmllciA9PT0gJyonXG4gICAgdmFyIG9wdGlvbmFsID0gbW9kaWZpZXIgPT09ICc/JyB8fCBtb2RpZmllciA9PT0gJyonXG4gICAgdmFyIGRlbGltaXRlciA9IHJlc1syXSB8fCBkZWZhdWx0RGVsaW1pdGVyXG4gICAgdmFyIHBhdHRlcm4gPSBjYXB0dXJlIHx8IGdyb3VwXG5cbiAgICB0b2tlbnMucHVzaCh7XG4gICAgICBuYW1lOiBuYW1lIHx8IGtleSsrLFxuICAgICAgcHJlZml4OiBwcmVmaXggfHwgJycsXG4gICAgICBkZWxpbWl0ZXI6IGRlbGltaXRlcixcbiAgICAgIG9wdGlvbmFsOiBvcHRpb25hbCxcbiAgICAgIHJlcGVhdDogcmVwZWF0LFxuICAgICAgcGFydGlhbDogcGFydGlhbCxcbiAgICAgIGFzdGVyaXNrOiAhIWFzdGVyaXNrLFxuICAgICAgcGF0dGVybjogcGF0dGVybiA/IGVzY2FwZUdyb3VwKHBhdHRlcm4pIDogKGFzdGVyaXNrID8gJy4qJyA6ICdbXicgKyBlc2NhcGVTdHJpbmcoZGVsaW1pdGVyKSArICddKz8nKVxuICAgIH0pXG4gIH1cblxuICAvLyBNYXRjaCBhbnkgY2hhcmFjdGVycyBzdGlsbCByZW1haW5pbmcuXG4gIGlmIChpbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICBwYXRoICs9IHN0ci5zdWJzdHIoaW5kZXgpXG4gIH1cblxuICAvLyBJZiB0aGUgcGF0aCBleGlzdHMsIHB1c2ggaXQgb250byB0aGUgZW5kLlxuICBpZiAocGF0aCkge1xuICAgIHRva2Vucy5wdXNoKHBhdGgpXG4gIH1cblxuICByZXR1cm4gdG9rZW5zXG59XG5cbi8qKlxuICogQ29tcGlsZSBhIHN0cmluZyB0byBhIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciB0aGUgcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshZnVuY3Rpb24oT2JqZWN0PSwgT2JqZWN0PSl9XG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGUgKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9GdW5jdGlvbihwYXJzZShzdHIsIG9wdGlvbnMpKVxufVxuXG4vKipcbiAqIFByZXR0aWVyIGVuY29kaW5nIG9mIFVSSSBwYXRoIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ31cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50UHJldHR5IChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1tcXC8/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRW5jb2RlIHRoZSBhc3RlcmlzayBwYXJhbWV0ZXIuIFNpbWlsYXIgdG8gYHByZXR0eWAsIGJ1dCBhbGxvd3Mgc2xhc2hlcy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUFzdGVyaXNrIChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShzdHIpLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRXhwb3NlIGEgbWV0aG9kIGZvciB0cmFuc2Zvcm1pbmcgdG9rZW5zIGludG8gdGhlIHBhdGggZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvRnVuY3Rpb24gKHRva2Vucykge1xuICAvLyBDb21waWxlIGFsbCB0aGUgdG9rZW5zIGludG8gcmVnZXhwcy5cbiAgdmFyIG1hdGNoZXMgPSBuZXcgQXJyYXkodG9rZW5zLmxlbmd0aClcblxuICAvLyBDb21waWxlIGFsbCB0aGUgcGF0dGVybnMgYmVmb3JlIGNvbXBpbGF0aW9uLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0eXBlb2YgdG9rZW5zW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgbWF0Y2hlc1tpXSA9IG5ldyBSZWdFeHAoJ14oPzonICsgdG9rZW5zW2ldLnBhdHRlcm4gKyAnKSQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqLCBvcHRzKSB7XG4gICAgdmFyIHBhdGggPSAnJ1xuICAgIHZhciBkYXRhID0gb2JqIHx8IHt9XG4gICAgdmFyIG9wdGlvbnMgPSBvcHRzIHx8IHt9XG4gICAgdmFyIGVuY29kZSA9IG9wdGlvbnMucHJldHR5ID8gZW5jb2RlVVJJQ29tcG9uZW50UHJldHR5IDogZW5jb2RlVVJJQ29tcG9uZW50XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRva2VuID0gdG9rZW5zW2ldXG5cbiAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhdGggKz0gdG9rZW5cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWUgPSBkYXRhW3Rva2VuLm5hbWVdXG4gICAgICB2YXIgc2VnbWVudFxuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgICAvLyBQcmVwZW5kIHBhcnRpYWwgc2VnbWVudCBwcmVmaXhlcy5cbiAgICAgICAgICBpZiAodG9rZW4ucGFydGlhbCkge1xuICAgICAgICAgICAgcGF0aCArPSB0b2tlbi5wcmVmaXhcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gYmUgZGVmaW5lZCcpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzYXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlmICghdG9rZW4ucmVwZWF0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBub3QgcmVwZWF0LCBidXQgcmVjZWl2ZWQgYCcgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnYCcpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaWYgKHRva2VuLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG5vdCBiZSBlbXB0eScpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHNlZ21lbnQgPSBlbmNvZGUodmFsdWVbal0pXG5cbiAgICAgICAgICBpZiAoIW1hdGNoZXNbaV0udGVzdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWxsIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbWF0Y2ggXCInICsgdG9rZW4ucGF0dGVybiArICdcIiwgYnV0IHJlY2VpdmVkIGAnICsgSlNPTi5zdHJpbmdpZnkoc2VnbWVudCkgKyAnYCcpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGF0aCArPSAoaiA9PT0gMCA/IHRva2VuLnByZWZpeCA6IHRva2VuLmRlbGltaXRlcikgKyBzZWdtZW50XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzZWdtZW50ID0gdG9rZW4uYXN0ZXJpc2sgPyBlbmNvZGVBc3Rlcmlzayh2YWx1ZSkgOiBlbmNvZGUodmFsdWUpXG5cbiAgICAgIGlmICghbWF0Y2hlc1tpXS50ZXN0KHNlZ21lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbWF0Y2ggXCInICsgdG9rZW4ucGF0dGVybiArICdcIiwgYnV0IHJlY2VpdmVkIFwiJyArIHNlZ21lbnQgKyAnXCInKVxuICAgICAgfVxuXG4gICAgICBwYXRoICs9IHRva2VuLnByZWZpeCArIHNlZ21lbnRcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aFxuICB9XG59XG5cbi8qKlxuICogRXNjYXBlIGEgcmVndWxhciBleHByZXNzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcgKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18XFwvXFxcXF0pL2csICdcXFxcJDEnKVxufVxuXG4vKipcbiAqIEVzY2FwZSB0aGUgY2FwdHVyaW5nIGdyb3VwIGJ5IGVzY2FwaW5nIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgbWVhbmluZy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGdyb3VwXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUdyb3VwIChncm91cCkge1xuICByZXR1cm4gZ3JvdXAucmVwbGFjZSgvKFs9ITokXFwvKCldKS9nLCAnXFxcXCQxJylcbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIGtleXMgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgcmVnZXhwLlxuICpcbiAqIEBwYXJhbSAgeyFSZWdFeHB9IHJlXG4gKiBAcGFyYW0gIHtBcnJheX0gICBrZXlzXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBhdHRhY2hLZXlzIChyZSwga2V5cykge1xuICByZS5rZXlzID0ga2V5c1xuICByZXR1cm4gcmVcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZsYWdzIGZvciBhIHJlZ2V4cCBmcm9tIHRoZSBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBmbGFncyAob3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucy5zZW5zaXRpdmUgPyAnJyA6ICdpJ1xufVxuXG4vKipcbiAqIFB1bGwgb3V0IGtleXMgZnJvbSBhIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshUmVnRXhwfSBwYXRoXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBrZXlzXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiByZWdleHBUb1JlZ2V4cCAocGF0aCwga2V5cykge1xuICAvLyBVc2UgYSBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gbWF0Y2ggb25seSBjYXB0dXJpbmcgZ3JvdXBzLlxuICB2YXIgZ3JvdXBzID0gcGF0aC5zb3VyY2UubWF0Y2goL1xcKCg/IVxcPykvZylcblxuICBpZiAoZ3JvdXBzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleXMucHVzaCh7XG4gICAgICAgIG5hbWU6IGksXG4gICAgICAgIHByZWZpeDogbnVsbCxcbiAgICAgICAgZGVsaW1pdGVyOiBudWxsLFxuICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICAgIHJlcGVhdDogZmFsc2UsXG4gICAgICAgIHBhcnRpYWw6IGZhbHNlLFxuICAgICAgICBhc3RlcmlzazogZmFsc2UsXG4gICAgICAgIHBhdHRlcm46IG51bGxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMocGF0aCwga2V5cylcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gYXJyYXkgaW50byBhIHJlZ2V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBwYXRoXG4gKiBAcGFyYW0gIHtBcnJheX0gICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBhcnJheVRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIHZhciBwYXJ0cyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFydHMucHVzaChwYXRoVG9SZWdleHAocGF0aFtpXSwga2V5cywgb3B0aW9ucykuc291cmNlKVxuICB9XG5cbiAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJyg/OicgKyBwYXJ0cy5qb2luKCd8JykgKyAnKScsIGZsYWdzKG9wdGlvbnMpKVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKHJlZ2V4cCwga2V5cylcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBwYXRoIHJlZ2V4cCBmcm9tIHN0cmluZyBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICBwYXRoXG4gKiBAcGFyYW0gIHshQXJyYXl9ICBrZXlzXG4gKiBAcGFyYW0gIHshT2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9SZWdFeHAocGFyc2UocGF0aCwgb3B0aW9ucyksIGtleXMsIG9wdGlvbnMpXG59XG5cbi8qKlxuICogRXhwb3NlIGEgZnVuY3Rpb24gZm9yIHRha2luZyB0b2tlbnMgYW5kIHJldHVybmluZyBhIFJlZ0V4cC5cbiAqXG4gKiBAcGFyYW0gIHshQXJyYXl9ICAgICAgICAgIHRva2Vuc1xuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHRva2Vuc1RvUmVnRXhwICh0b2tlbnMsIGtleXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFpc2FycmF5KGtleXMpKSB7XG4gICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKGtleXMgfHwgb3B0aW9ucylcbiAgICBrZXlzID0gW11cbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZCAhPT0gZmFsc2VcbiAgdmFyIHJvdXRlID0gJydcblxuICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRva2VucyBhbmQgY3JlYXRlIG91ciByZWdleHAgc3RyaW5nLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJvdXRlICs9IGVzY2FwZVN0cmluZyh0b2tlbilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZWZpeCA9IGVzY2FwZVN0cmluZyh0b2tlbi5wcmVmaXgpXG4gICAgICB2YXIgY2FwdHVyZSA9ICcoPzonICsgdG9rZW4ucGF0dGVybiArICcpJ1xuXG4gICAgICBrZXlzLnB1c2godG9rZW4pXG5cbiAgICAgIGlmICh0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgY2FwdHVyZSArPSAnKD86JyArIHByZWZpeCArIGNhcHR1cmUgKyAnKSonXG4gICAgICB9XG5cbiAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICBpZiAoIXRva2VuLnBhcnRpYWwpIHtcbiAgICAgICAgICBjYXB0dXJlID0gJyg/OicgKyBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJykpPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYXB0dXJlID0gcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpPydcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKSdcbiAgICAgIH1cblxuICAgICAgcm91dGUgKz0gY2FwdHVyZVxuICAgIH1cbiAgfVxuXG4gIHZhciBkZWxpbWl0ZXIgPSBlc2NhcGVTdHJpbmcob3B0aW9ucy5kZWxpbWl0ZXIgfHwgJy8nKVxuICB2YXIgZW5kc1dpdGhEZWxpbWl0ZXIgPSByb3V0ZS5zbGljZSgtZGVsaW1pdGVyLmxlbmd0aCkgPT09IGRlbGltaXRlclxuXG4gIC8vIEluIG5vbi1zdHJpY3QgbW9kZSB3ZSBhbGxvdyBhIHNsYXNoIGF0IHRoZSBlbmQgb2YgbWF0Y2guIElmIHRoZSBwYXRoIHRvXG4gIC8vIG1hdGNoIGFscmVhZHkgZW5kcyB3aXRoIGEgc2xhc2gsIHdlIHJlbW92ZSBpdCBmb3IgY29uc2lzdGVuY3kuIFRoZSBzbGFzaFxuICAvLyBpcyB2YWxpZCBhdCB0aGUgZW5kIG9mIGEgcGF0aCBtYXRjaCwgbm90IGluIHRoZSBtaWRkbGUuIFRoaXMgaXMgaW1wb3J0YW50XG4gIC8vIGluIG5vbi1lbmRpbmcgbW9kZSwgd2hlcmUgXCIvdGVzdC9cIiBzaG91bGRuJ3QgbWF0Y2ggXCIvdGVzdC8vcm91dGVcIi5cbiAgaWYgKCFzdHJpY3QpIHtcbiAgICByb3V0ZSA9IChlbmRzV2l0aERlbGltaXRlciA/IHJvdXRlLnNsaWNlKDAsIC1kZWxpbWl0ZXIubGVuZ3RoKSA6IHJvdXRlKSArICcoPzonICsgZGVsaW1pdGVyICsgJyg/PSQpKT8nXG4gIH1cblxuICBpZiAoZW5kKSB7XG4gICAgcm91dGUgKz0gJyQnXG4gIH0gZWxzZSB7XG4gICAgLy8gSW4gbm9uLWVuZGluZyBtb2RlLCB3ZSBuZWVkIHRoZSBjYXB0dXJpbmcgZ3JvdXBzIHRvIG1hdGNoIGFzIG11Y2ggYXNcbiAgICAvLyBwb3NzaWJsZSBieSB1c2luZyBhIHBvc2l0aXZlIGxvb2thaGVhZCB0byB0aGUgZW5kIG9yIG5leHQgcGF0aCBzZWdtZW50LlxuICAgIHJvdXRlICs9IHN0cmljdCAmJiBlbmRzV2l0aERlbGltaXRlciA/ICcnIDogJyg/PScgKyBkZWxpbWl0ZXIgKyAnfCQpJ1xuICB9XG5cbiAgcmV0dXJuIGF0dGFjaEtleXMobmV3IFJlZ0V4cCgnXicgKyByb3V0ZSwgZmxhZ3Mob3B0aW9ucykpLCBrZXlzKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgZ2l2ZW4gcGF0aCBzdHJpbmcsIHJldHVybmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBBbiBlbXB0eSBhcnJheSBjYW4gYmUgcGFzc2VkIGluIGZvciB0aGUga2V5cywgd2hpY2ggd2lsbCBob2xkIHRoZVxuICogcGxhY2Vob2xkZXIga2V5IGRlc2NyaXB0aW9ucy4gRm9yIGV4YW1wbGUsIHVzaW5nIGAvdXNlci86aWRgLCBga2V5c2Agd2lsbFxuICogY29udGFpbiBgW3sgbmFtZTogJ2lkJywgZGVsaW1pdGVyOiAnLycsIG9wdGlvbmFsOiBmYWxzZSwgcmVwZWF0OiBmYWxzZSB9XWAuXG4gKlxuICogQHBhcmFtICB7KHN0cmluZ3xSZWdFeHB8QXJyYXkpfSBwYXRoXG4gKiBAcGFyYW0gIHsoQXJyYXl8T2JqZWN0KT19ICAgICAgIGtleXNcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gcGF0aFRvUmVnZXhwIChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpXG4gICAga2V5cyA9IFtdXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cFRvUmVnZXhwKHBhdGgsIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cykpXG4gIH1cblxuICBpZiAoaXNhcnJheShwYXRoKSkge1xuICAgIHJldHVybiBhcnJheVRvUmVnZXhwKC8qKiBAdHlwZSB7IUFycmF5fSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG4gIH1cblxuICByZXR1cm4gc3RyaW5nVG9SZWdleHAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXRoKSwgLyoqIEB0eXBlIHshQXJyYXl9ICovIChrZXlzKSwgb3B0aW9ucylcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0ge1xuXHRzdGRvdXQ6IGZhbHNlLFxuXHRzdGRlcnI6IGZhbHNlXG59O1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsLnR5cGVEZXRlY3QgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIHR5cGUtZGV0ZWN0XG4gKiBDb3B5cmlnaHQoYykgMjAxMyBqYWtlIGx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG52YXIgcHJvbWlzZUV4aXN0cyA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xudmFyIGdsb2JhbE9iamVjdCA9IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyA/IHNlbGYgOiBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaWQtYmxhY2tsaXN0XG5cbnZhciBzeW1ib2xFeGlzdHMgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbnZhciBtYXBFeGlzdHMgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJztcbnZhciBzZXRFeGlzdHMgPSB0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJztcbnZhciB3ZWFrTWFwRXhpc3RzID0gdHlwZW9mIFdlYWtNYXAgIT09ICd1bmRlZmluZWQnO1xudmFyIHdlYWtTZXRFeGlzdHMgPSB0eXBlb2YgV2Vha1NldCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgZGF0YVZpZXdFeGlzdHMgPSB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbEl0ZXJhdG9yRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnO1xudmFyIHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID0gc3ltYm9sRXhpc3RzICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgIT09ICd1bmRlZmluZWQnO1xudmFyIHNldEVudHJpZXNFeGlzdHMgPSBzZXRFeGlzdHMgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbnZhciBtYXBFbnRyaWVzRXhpc3RzID0gbWFwRXhpc3RzICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09ICdmdW5jdGlvbic7XG52YXIgc2V0SXRlcmF0b3JQcm90b3R5cGUgPSBzZXRFbnRyaWVzRXhpc3RzICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgU2V0KCkuZW50cmllcygpKTtcbnZhciBtYXBJdGVyYXRvclByb3RvdHlwZSA9IG1hcEVudHJpZXNFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBNYXAoKS5lbnRyaWVzKCkpO1xudmFyIGFycmF5SXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgQXJyYXkucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG52YXIgYXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGFycmF5SXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgc3RyaW5nSXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xJdGVyYXRvckV4aXN0cyAmJiB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xudmFyIHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlID0gc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG52YXIgdG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGggPSA4O1xudmFyIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCA9IC0xO1xuLyoqXG4gKiAjIyMgdHlwZU9mIChvYmopXG4gKlxuICogVXNlcyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIG9iamVjdCxcbiAqIG5vcm1hbGlzaW5nIGJlaGF2aW91ciBhY3Jvc3MgZW5naW5lIHZlcnNpb25zICYgd2VsbCBvcHRpbWlzZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IG9iamVjdCB0eXBlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiB0eXBlRGV0ZWN0KG9iaikge1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgc3RyaW5nIGxpdGVyYWwgICAgIHggMywwMzksMDM1IG9wcy9zZWMgwrExLjYyJSAoNzggcnVucyBzYW1wbGVkKVxuICAgKiAgIGJvb2xlYW4gbGl0ZXJhbCAgICB4IDEsNDI0LDEzOCBvcHMvc2VjIMKxNC41NCUgKDc1IHJ1bnMgc2FtcGxlZClcbiAgICogICBudW1iZXIgbGl0ZXJhbCAgICAgeCAxLDY1MywxNTMgb3BzL3NlYyDCsTEuOTElICg4MiBydW5zIHNhbXBsZWQpXG4gICAqICAgdW5kZWZpbmVkICAgICAgICAgIHggOSw5NzgsNjYwIG9wcy9zZWMgwrExLjkyJSAoNzUgcnVucyBzYW1wbGVkKVxuICAgKiAgIGZ1bmN0aW9uICAgICAgICAgICB4IDIsNTU2LDc2OSBvcHMvc2VjIMKxMS43MyUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgICogUG9zdDpcbiAgICogICBzdHJpbmcgbGl0ZXJhbCAgICAgeCAzOCw1NjQsNzk2IG9wcy9zZWMgwrExLjE1JSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIGJvb2xlYW4gbGl0ZXJhbCAgICB4IDMxLDE0OCw5NDAgb3BzL3NlYyDCsTEuMTAlICg3OSBydW5zIHNhbXBsZWQpXG4gICAqICAgbnVtYmVyIGxpdGVyYWwgICAgIHggMzIsNjc5LDMzMCBvcHMvc2VjIMKxMS45MCUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgICogICB1bmRlZmluZWQgICAgICAgICAgeCAzMiwzNjMsMzY4IG9wcy9zZWMgwrExLjA3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiAgIGZ1bmN0aW9uICAgICAgICAgICB4IDMxLDI5Niw4NzAgb3BzL3NlYyDCsTAuOTYlICg4MyBydW5zIHNhbXBsZWQpXG4gICAqL1xuICB2YXIgdHlwZW9mT2JqID0gdHlwZW9mIG9iajtcbiAgaWYgKHR5cGVvZk9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZW9mT2JqO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgICogUHJlOlxuICAgKiAgIG51bGwgICAgICAgICAgICAgICB4IDI4LDY0NSw3NjUgb3BzL3NlYyDCsTEuMTclICg4MiBydW5zIHNhbXBsZWQpXG4gICAqIFBvc3Q6XG4gICAqICAgbnVsbCAgICAgICAgICAgICAgIHggMzYsNDI4LDk2MiBvcHMvc2VjIMKxMS4zNyUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgICovXG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2luZG93KWBgXG4gICAqICAtIE5vZGUgPT09IFwiW29iamVjdCBnbG9iYWxdXCJcbiAgICogIC0gQ2hyb21lID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gUGhhbnRvbUpTID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSAxMSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBJRSBFZGdlID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcylgYFxuICAgKiAgLSBDaHJvbWUgV29ya2VyID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIEZpcmVmb3ggV29ya2VyID09PSBcIltvYmplY3QgRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICogIC0gU2FmYXJpIFdvcmtlciA9PT0gXCJbb2JqZWN0IERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIDExIFdvcmtlciA9PT0gXCJbb2JqZWN0IFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIElFIEVkZ2UgV29ya2VyID09PSBcIltvYmplY3QgV29ya2VyR2xvYmFsU2NvcGVdXCJcbiAgICovXG4gIGlmIChvYmogPT09IGdsb2JhbE9iamVjdCkge1xuICAgIHJldHVybiAnZ2xvYmFsJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBhcnJheSBsaXRlcmFsICAgICAgeCAyLDg4OCwzNTIgb3BzL3NlYyDCsTAuNjclICg4MiBydW5zIHNhbXBsZWQpXG4gICAqIFBvc3Q6XG4gICAqICAgYXJyYXkgbGl0ZXJhbCAgICAgIHggMjIsNDc5LDY1MCBvcHMvc2VjIMKxMC45NiUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgICovXG4gIGlmIChcbiAgICBBcnJheS5pc0FycmF5KG9iaikgJiZcbiAgICAoc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgPT09IGZhbHNlIHx8ICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIG9iaikpXG4gICkge1xuICAgIHJldHVybiAnQXJyYXknO1xuICB9XG5cbiAgLy8gTm90IGNhY2hpbmcgZXhpc3RlbmNlIG9mIGB3aW5kb3dgIGFuZCByZWxhdGVkIHByb3BlcnRpZXMgZHVlIHRvIHBvdGVudGlhbFxuICAvLyBmb3IgYHdpbmRvd2AgdG8gYmUgdW5zZXQgYmVmb3JlIHRlc3RzIGluIHF1YXNpLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiYgd2luZG93ICE9PSBudWxsKSB7XG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjbG9jYXRpb24pXG4gICAgICogV2hhdFdHIEhUTUwkNy43LjMgLSBUaGUgYExvY2F0aW9uYCBpbnRlcmZhY2VcbiAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5sb2NhdGlvbilgYFxuICAgICAqICAtIElFIDw9MTEgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICAgKiAgLSBJRSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICAgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2NhdGlvbiA9PT0gJ29iamVjdCcgJiYgb2JqID09PSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICAgIHJldHVybiAnTG9jYXRpb24nO1xuICAgIH1cblxuICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNkb2N1bWVudClcbiAgICAgKiBXaGF0V0cgSFRNTCQzLjEuMSAtIFRoZSBgRG9jdW1lbnRgIG9iamVjdFxuICAgICAqIE5vdGU6IE1vc3QgYnJvd3NlcnMgY3VycmVudGx5IGFkaGVyIHRvIHRoZSBXM0MgRE9NIExldmVsIDIgc3BlY1xuICAgICAqICAgICAgIChodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItSFRNTC9odG1sLmh0bWwjSUQtMjY4MDkyNjgpXG4gICAgICogICAgICAgd2hpY2ggc3VnZ2VzdHMgdGhhdCBicm93c2VycyBzaG91bGQgdXNlIEhUTUxUYWJsZUNlbGxFbGVtZW50IGZvclxuICAgICAqICAgICAgIGJvdGggVEQgYW5kIFRIIGVsZW1lbnRzLiBXaGF0V0cgc2VwYXJhdGVzIHRoZXNlLlxuICAgICAqICAgICAgIFdoYXRXRyBIVE1MIHN0YXRlczpcbiAgICAgKiAgICAgICAgID4gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgV2luZG93IG9iamVjdHMgbXVzdCBhbHNvIGhhdmUgYVxuICAgICAqICAgICAgICAgPiB3cml0YWJsZSwgY29uZmlndXJhYmxlLCBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lZFxuICAgICAqICAgICAgICAgPiBIVE1MRG9jdW1lbnQgd2hvc2UgdmFsdWUgaXMgdGhlIERvY3VtZW50IGludGVyZmFjZSBvYmplY3QuXG4gICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudClgYFxuICAgICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBTYWZhcmkgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBJRSA8PTEwID09PSBcIltvYmplY3QgRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBJRSAxMSA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqICAtIElFIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IEhUTUxEb2N1bWVudF1cIlxuICAgICAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmRvY3VtZW50ID09PSAnb2JqZWN0JyAmJiBvYmogPT09IHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuICdEb2N1bWVudCc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yID09PSAnb2JqZWN0Jykge1xuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI21pbWV0eXBlYXJyYXkpXG4gICAgICAgKiBXaGF0V0cgSFRNTCQ4LjYuMS41IC0gUGx1Z2lucyAtIEludGVyZmFjZSBNaW1lVHlwZUFycmF5XG4gICAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5hdmlnYXRvci5taW1lVHlwZXMpYGBcbiAgICAgICAqICAtIElFIDw9MTAgPT09IFwiW29iamVjdCBNU01pbWVUeXBlc0NvbGxlY3Rpb25dXCJcbiAgICAgICAqL1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yLm1pbWVUeXBlcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICBvYmogPT09IHdpbmRvdy5uYXZpZ2F0b3IubWltZVR5cGVzKSB7XG4gICAgICAgIHJldHVybiAnTWltZVR5cGVBcnJheSc7XG4gICAgICB9XG5cbiAgICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheSlcbiAgICAgICAqIFdoYXRXRyBIVE1MJDguNi4xLjUgLSBQbHVnaW5zIC0gSW50ZXJmYWNlIFBsdWdpbkFycmF5XG4gICAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5hdmlnYXRvci5wbHVnaW5zKWBgXG4gICAgICAgKiAgLSBJRSA8PTEwID09PSBcIltvYmplY3QgTVNQbHVnaW5zQ29sbGVjdGlvbl1cIlxuICAgICAgICovXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IucGx1Z2lucyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICBvYmogPT09IHdpbmRvdy5uYXZpZ2F0b3IucGx1Z2lucykge1xuICAgICAgICByZXR1cm4gJ1BsdWdpbkFycmF5JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKHR5cGVvZiB3aW5kb3cuSFRNTEVsZW1lbnQgPT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIHdpbmRvdy5IVE1MRWxlbWVudCA9PT0gJ29iamVjdCcpICYmXG4gICAgICAgIG9iaiBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudCkge1xuICAgICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjcGx1Z2luYXJyYXkpXG4gICAgICAqIFdoYXRXRyBIVE1MJDQuNC40IC0gVGhlIGBibG9ja3F1b3RlYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MUXVvdGVFbGVtZW50YFxuICAgICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jsb2NrcXVvdGUnKSlgYFxuICAgICAgKiAgLSBJRSA8PTEwID09PSBcIltvYmplY3QgSFRNTEJsb2NrRWxlbWVudF1cIlxuICAgICAgKi9cbiAgICAgIGlmIChvYmoudGFnTmFtZSA9PT0gJ0JMT0NLUVVPVEUnKSB7XG4gICAgICAgIHJldHVybiAnSFRNTFF1b3RlRWxlbWVudCc7XG4gICAgICB9XG5cbiAgICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2h0bWx0YWJsZWRhdGFjZWxsZWxlbWVudClcbiAgICAgICAqIFdoYXRXRyBIVE1MJDQuOS45IC0gVGhlIGB0ZGAgZWxlbWVudCAtIEludGVyZmFjZSBgSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50YFxuICAgICAgICogTm90ZTogTW9zdCBicm93c2VycyBjdXJyZW50bHkgYWRoZXIgdG8gdGhlIFczQyBET00gTGV2ZWwgMiBzcGVjXG4gICAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTgyOTE1MDc1KVxuICAgICAgICogICAgICAgd2hpY2ggc3VnZ2VzdHMgdGhhdCBicm93c2VycyBzaG91bGQgdXNlIEhUTUxUYWJsZUNlbGxFbGVtZW50IGZvclxuICAgICAgICogICAgICAgYm90aCBURCBhbmQgVEggZWxlbWVudHMuIFdoYXRXRyBzZXBhcmF0ZXMgdGhlc2UuXG4gICAgICAgKiBUZXN0OiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKSlcbiAgICAgICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKi9cbiAgICAgIGlmIChvYmoudGFnTmFtZSA9PT0gJ1REJykge1xuICAgICAgICByZXR1cm4gJ0hUTUxUYWJsZURhdGFDZWxsRWxlbWVudCc7XG4gICAgICB9XG5cbiAgICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2h0bWx0YWJsZWhlYWRlcmNlbGxlbGVtZW50KVxuICAgICAgICogV2hhdFdHIEhUTUwkNC45LjkgLSBUaGUgYHRkYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudGBcbiAgICAgICAqIE5vdGU6IE1vc3QgYnJvd3NlcnMgY3VycmVudGx5IGFkaGVyIHRvIHRoZSBXM0MgRE9NIExldmVsIDIgc3BlY1xuICAgICAgICogICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCNJRC04MjkxNTA3NSlcbiAgICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgICAqICAgICAgIGJvdGggVEQgYW5kIFRIIGVsZW1lbnRzLiBXaGF0V0cgc2VwYXJhdGVzIHRoZXNlLlxuICAgICAgICogVGVzdDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJykpXG4gICAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICAgKiAgLSBTYWZhcmkgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAgICovXG4gICAgICBpZiAob2JqLnRhZ05hbWUgPT09ICdUSCcpIHtcbiAgICAgICAgcmV0dXJuICdIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBGbG9hdDY0QXJyYXkgICAgICAgeCA2MjUsNjQ0IG9wcy9zZWMgwrExLjU4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggMSwyNzksODUyIG9wcy9zZWMgwrEyLjkxJSAoNzcgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDMyQXJyYXkgICAgICAgIHggMSwxNzgsMTg1IG9wcy9zZWMgwrExLjk1JSAoODMgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDE2QXJyYXkgICAgICAgIHggMSwwMDgsMzgwIG9wcy9zZWMgwrEyLjI1JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggMSwxMjgsMDQwIG9wcy9zZWMgwrEyLjExJSAoODEgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MzJBcnJheSAgICAgICAgIHggMSwxNzAsMTE5IG9wcy9zZWMgwrEyLjg4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MTZBcnJheSAgICAgICAgIHggMSwxNzYsMzQ4IG9wcy9zZWMgwrE1Ljc5JSAoODYgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggMSwwNTgsNzA3IG9wcy9zZWMgwrE0Ljk0JSAoNzcgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhDbGFtcGVkQXJyYXkgIHggMSwxMTAsNjMzIG9wcy9zZWMgwrE0LjIwJSAoODAgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBGbG9hdDY0QXJyYXkgICAgICAgeCA3LDEwNSw2NzEgb3BzL3NlYyDCsTEzLjQ3JSAoNjQgcnVucyBzYW1wbGVkKVxuICAqICAgRmxvYXQzMkFycmF5ICAgICAgIHggNSw4ODcsOTEyIG9wcy9zZWMgwrExLjQ2JSAoODIgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDMyQXJyYXkgICAgICAgIHggNiw0OTEsNjYxIG9wcy9zZWMgwrExLjc2JSAoNzkgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDE2QXJyYXkgICAgICAgIHggNiw1NTksNzk1IG9wcy9zZWMgwrExLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhBcnJheSAgICAgICAgIHggNiw0NjMsOTY2IG9wcy9zZWMgwrExLjQzJSAoODUgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MzJBcnJheSAgICAgICAgIHggNSw2NDEsODQxIG9wcy9zZWMgwrEzLjQ5JSAoODEgcnVucyBzYW1wbGVkKVxuICAqICAgSW50MTZBcnJheSAgICAgICAgIHggNiw1ODMsNTExIG9wcy9zZWMgwrExLjk4JSAoODAgcnVucyBzYW1wbGVkKVxuICAqICAgSW50OEFycmF5ICAgICAgICAgIHggNiw2MDYsMDc4IG9wcy9zZWMgwrExLjc0JSAoODEgcnVucyBzYW1wbGVkKVxuICAqICAgVWludDhDbGFtcGVkQXJyYXkgIHggNiw2MDIsMjI0IG9wcy9zZWMgwrExLjc3JSAoODMgcnVucyBzYW1wbGVkKVxuICAqL1xuICB2YXIgc3RyaW5nVGFnID0gKHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzICYmIG9ialtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgaWYgKHR5cGVvZiBzdHJpbmdUYWcgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuXG4gIHZhciBvYmpQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICByZWdleCBsaXRlcmFsICAgICAgeCAxLDc3MiwzODUgb3BzL3NlYyDCsTEuODUlICg3NyBydW5zIHNhbXBsZWQpXG4gICogICByZWdleCBjb25zdHJ1Y3RvciAgeCAyLDE0Myw2MzQgb3BzL3NlYyDCsTIuNDYlICg3OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHJlZ2V4IGxpdGVyYWwgICAgICB4IDMsOTI4LDAwOSBvcHMvc2VjIMKxMC42NSUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgKiAgIHJlZ2V4IGNvbnN0cnVjdG9yICB4IDMsOTMxLDEwOCBvcHMvc2VjIMKxMC41OCUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gUmVnRXhwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUmVnRXhwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgZGF0ZSAgICAgICAgICAgICAgIHggMiwxMzAsMDc0IG9wcy9zZWMgwrE0LjQyJSAoNjggcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBkYXRlICAgICAgICAgICAgICAgeCAzLDk1Myw3Nzkgb3BzL3NlYyDCsTEuMzUlICg3NyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IERhdGUucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdEYXRlJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1wcm9taXNlLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjUuNC41LjQgLSBQcm9taXNlLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJQcm9taXNlXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUHJvbWlzZS5yZXNvbHZlKCkpYGBcbiAgICogIC0gQ2hyb21lIDw9NDcgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICogIC0gRWRnZSA8PTIwID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqICAtIEZpcmVmb3ggMjktTGF0ZXN0ID09PSBcIltvYmplY3QgUHJvbWlzZV1cIlxuICAgKiAgLSBTYWZhcmkgNy4xLUxhdGVzdCA9PT0gXCJbb2JqZWN0IFByb21pc2VdXCJcbiAgICovXG4gIGlmIChwcm9taXNlRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gUHJvbWlzZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1Byb21pc2UnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBzZXQgICAgICAgICAgICAgICAgeCAyLDIyMiwxODYgb3BzL3NlYyDCsTEuMzElICg4MiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDQsNTQ1LDg3OSBvcHMvc2VjIMKxMS4xMyUgKDgzIHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHNldEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IFNldC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1NldCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIG1hcCAgICAgICAgICAgICAgICB4IDIsMzk2LDg0MiBvcHMvc2VjIMKxMS41OSUgKDgxIHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgbWFwICAgICAgICAgICAgICAgIHggNCwxODMsOTQ1IG9wcy9zZWMgwrE2LjU5JSAoODIgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAobWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gTWFwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnTWFwJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgd2Vha3NldCAgICAgICAgICAgIHggMSwzMjMsMjIwIG9wcy9zZWMgwrEyLjE3JSAoNzYgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICB3ZWFrc2V0ICAgICAgICAgICAgeCA0LDIzNyw1MTAgb3BzL3NlYyDCsTIuMDElICg3NyBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmICh3ZWFrU2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gV2Vha1NldC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ1dlYWtTZXQnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICB3ZWFrbWFwICAgICAgICAgICAgeCAxLDUwMCwyNjAgb3BzL3NlYyDCsTIuMDIlICg3OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDMsODgxLDM4NCBvcHMvc2VjIMKxMS40NSUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHdlYWtNYXBFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrTWFwLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnV2Vha01hcCc7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtZGF0YXZpZXcucHJvdG90eXBlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyNC4yLjQuMjEgLSBEYXRhVmlldy5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiRGF0YVZpZXdcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChkYXRhVmlld0V4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IERhdGFWaWV3LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnRGF0YVZpZXcnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVtYXBpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIzLjEuNS4yLjIgLSAlTWFwSXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIk1hcCBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBNYXAoKS5lbnRyaWVzKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAobWFwRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gbWFwSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ01hcCBJdGVyYXRvcic7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJXNldGl0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjMuMi41LjIuMiAtICVTZXRJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiU2V0IEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IFNldCgpLmVudHJpZXMoKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChzZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBzZXRJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnU2V0IEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIyLjEuNS4yLjIgLSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiQXJyYXkgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChbXVtTeW1ib2wuaXRlcmF0b3JdKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoYXJyYXlJdGVyYXRvckV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IGFycmF5SXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0FycmF5IEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMS4xLjUuMi4yIC0gJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJTdHJpbmcgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpYGBcbiAgICogIC0gRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAqL1xuICBpZiAoc3RyaW5nSXRlcmF0b3JFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBzdHJpbmdJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnU3RyaW5nIEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgb2JqZWN0IGZyb20gbnVsbCAgIHggMiw0MjQsMzIwIG9wcy9zZWMgwrExLjY3JSAoNzYgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBvYmplY3QgZnJvbSBudWxsICAgeCA1LDgzOCwwMDAgb3BzL3NlYyDCsTAuOTklICg4NCBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChvYmpQcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0XG4gICAgLnByb3RvdHlwZVxuICAgIC50b1N0cmluZ1xuICAgIC5jYWxsKG9iailcbiAgICAuc2xpY2UodG9TdHJpbmdMZWZ0U2xpY2VMZW5ndGgsIHRvU3RyaW5nUmlnaHRTbGljZUxlbmd0aCk7XG59XG5cbnJldHVybiB0eXBlRGV0ZWN0O1xuXG59KSkpO1xuIl19\n"
  },
  {
    "path": "common/Tests/External/sinon.d.ts",
    "content": "// Type definitions for Sinon 1.16.0\n// Project: http://sinonjs.org/\n// Definitions by: William Sears <https://github.com/mrbigdog2u>\n// Definitions: https://github.com/borisyankov/DefinitelyTyped\n\n\ninterface SinonSpyCallApi {\n    // Properties\n    thisValue: any;\n    args: any[];\n    exception: any;\n    returnValue: any;\n\n    // Methods\n    calledOn(obj: any): boolean;\n    calledWith(...args: any[]): boolean;\n    calledWithExactly(...args: any[]): boolean;\n    calledWithMatch(...args: any[]): boolean;\n    notCalledWith(...args: any[]): boolean;\n    notCalledWithMatch(...args: any[]): boolean;\n    returned(value: any): boolean;\n    threw(): boolean;\n    threw(type: string): boolean;\n    threw(obj: any): boolean;\n    callArg(pos: number): void;\n    callArgOn(pos: number, obj: any, ...args: any[]): void;\n    callArgWith(pos: number, ...args: any[]): void;\n    callArgOnWith(pos: number, obj: any, ...args: any[]): void;\n    yield(...args: any[]): void;\n    yieldOn(obj: any, ...args: any[]): void;\n    yieldTo(property: string, ...args: any[]): void;\n    yieldToOn(property: string, obj: any, ...args: any[]): void;\n}\n\ninterface SinonSpyCall extends SinonSpyCallApi {\n    calledBefore(call: SinonSpyCall): boolean;\n    calledAfter(call: SinonSpyCall): boolean;\n    calledWithNew(call: SinonSpyCall): boolean;\n}\n\ninterface SinonSpy extends SinonSpyCallApi {\n    // Properties\n    callCount: number;\n    called: boolean;\n    notCalled: boolean;\n    calledOnce: boolean;\n    calledTwice: boolean;\n    calledThrice: boolean;\n    firstCall: SinonSpyCall;\n    secondCall: SinonSpyCall;\n    thirdCall: SinonSpyCall;\n    lastCall: SinonSpyCall;\n    thisValues: any[];\n    args: any[][];\n    exceptions: any[];\n    returnValues: any[];\n\n    // Methods\n    (...args: any[]): any;\n    calledBefore(anotherSpy: SinonSpy): boolean;\n    calledAfter(anotherSpy: SinonSpy): boolean;\n    calledWithNew(spy: SinonSpy): boolean;\n    withArgs(...args: any[]): SinonSpy;\n    alwaysCalledOn(obj: any): boolean;\n    alwaysCalledWith(...args: any[]): boolean;\n    alwaysCalledWithExactly(...args: any[]): boolean;\n    alwaysCalledWithMatch(...args: any[]): boolean;\n    neverCalledWith(...args: any[]): boolean;\n    neverCalledWithMatch(...args: any[]): boolean;\n    alwaysThrew(): boolean;\n    alwaysThrew(type: string): boolean;\n    alwaysThrew(obj: any): boolean;\n    alwaysReturned(): boolean;\n    invokeCallback(...args: any[]): void;\n    getCall(n: number): SinonSpyCall;\n    reset(): void;\n    printf(format: string, ...args: any[]): string;\n    restore(): void;\n}\n\ninterface SinonSpyStatic {\n    (): SinonSpy;\n    (func: any): SinonSpy;\n    (obj: any, method: string): SinonSpy;\n}\n\ninterface SinonStatic {\n    spy: SinonSpyStatic;\n}\n\ninterface SinonStub extends SinonSpy {\n    resetBehavior(): void;\n    returns(obj: any): SinonStub;\n    returnsArg(index: number): SinonStub;\n    throws(type?: string): SinonStub;\n    throws(obj: any): SinonStub;\n    callsArg(index: number): SinonStub;\n    callsArgOn(index: number, context: any): SinonStub;\n    callsArgWith(index: number, ...args: any[]): SinonStub;\n    callsArgOnWith(index: number, context: any, ...args: any[]): SinonStub;\n    callsArgAsync(index: number): SinonStub;\n    callsArgOnAsync(index: number, context: any): SinonStub;\n    callsArgWithAsync(index: number, ...args: any[]): SinonStub;\n    callsArgOnWithAsync(index: number, context: any, ...args: any[]): SinonStub;\n    onCall(n: number): SinonStub;\n    onFirstCall(): SinonStub;\n    onSecondCall(): SinonStub;\n    onThirdCall(): SinonStub;\n    yields(...args: any[]): SinonStub;\n    yieldsOn(context: any, ...args: any[]): SinonStub;\n    yieldsTo(property: string, ...args: any[]): SinonStub;\n    yieldsToOn(property: string, context: any, ...args: any[]): SinonStub;\n    yieldsAsync(...args: any[]): SinonStub;\n    yieldsOnAsync(context: any, ...args: any[]): SinonStub;\n    yieldsToAsync(property: string, ...args: any[]): SinonStub;\n    yieldsToOnAsync(property: string, context: any, ...args: any[]): SinonStub;\n    withArgs(...args: any[]): SinonStub;\n}\n\ninterface SinonStubStatic {\n    (): SinonStub;\n    (obj: any): SinonStub;\n    (obj: any, method: string): SinonStub;\n    (obj: any, method: string, func: any): SinonStub;\n}\n\ninterface SinonStatic {\n    stub: SinonStubStatic;\n}\n\ninterface SinonExpectation extends SinonStub {\n    atLeast(n: number): SinonExpectation;\n    atMost(n: number): SinonExpectation;\n    never(): SinonExpectation;\n    once(): SinonExpectation;\n    twice(): SinonExpectation;\n    thrice(): SinonExpectation;\n    exactly(n: number): SinonExpectation;\n    withArgs(...args: any[]): SinonExpectation;\n    withExactArgs(...args: any[]): SinonExpectation;\n    on(obj: any): SinonExpectation;\n    verify(): SinonExpectation;\n    restore(): void;\n}\n\ninterface SinonExpectationStatic {\n    create(methodName?: string): SinonExpectation;\n}\n\ninterface SinonMock {\n    expects(method: string): SinonExpectation;\n    restore(): void;\n    verify(): void;\n}\n\ninterface SinonMockStatic {\n    (): SinonExpectation;\n    (obj: any): SinonMock;\n}\n\ninterface SinonStatic {\n    expectation: SinonExpectationStatic;\n    mock: SinonMockStatic;\n}\n\ninterface SinonFakeTimers {\n    now: number;\n    create(now: number): SinonFakeTimers;\n    setTimeout(callback: (...args: any[]) => void, timeout: number, ...args: any[]): number;\n    clearTimeout(id: number): void;\n    setInterval(callback: (...args: any[]) => void, timeout: number, ...args: any[]): number;\n    clearInterval(id: number): void;\n    tick(ms: number): number;\n    reset(): void;\n    Date(): Date;\n    Date(year: number): Date;\n    Date(year: number, month: number): Date;\n    Date(year: number, month: number, day: number): Date;\n    Date(year: number, month: number, day: number, hour: number): Date;\n    Date(year: number, month: number, day: number, hour: number, minute: number): Date;\n    Date(year: number, month: number, day: number, hour: number, minute: number, second: number): Date;\n    Date(year: number, month: number, day: number, hour: number, minute: number, second: number, ms: number): Date;\n    restore(): void;\n\n    /**\n     * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp\n     * without affecting timers, intervals or immediates.\n     * @param now - The new 'now' in unix milliseconds\n     */\n    setSystemTime(now: number): void;\n    /**\n     * Simulate the user changing the system clock while your program is running. It changes the 'now' timestamp\n     * without affecting timers, intervals or immediates.\n     * @param now - The new 'now' as a JavaScript Date\n     */\n    setSystemTime(date: Date): void;\n}\n\ninterface SinonFakeTimersStatic {\n    (): SinonFakeTimers;\n    (...timers: string[]): SinonFakeTimers;\n    (now: number, ...timers: string[]): SinonFakeTimers;\n}\n\ninterface SinonStatic {\n    useFakeTimers: SinonFakeTimersStatic;\n    clock: SinonFakeTimers;\n}\n\ninterface SinonFakeUploadProgress {\n    eventListeners: {\n        progress: any[];\n        load: any[];\n        abort: any[];\n        error: any[];\n    };\n\n    addEventListener(event: string, listener: (e: Event) => any): void;\n    removeEventListener(event: string, listener: (e: Event) => any): void;\n    dispatchEvent(event: Event): void;\n}\n\ninterface SinonFakeXMLHttpRequest {\n    // Properties\n    onCreate: (xhr: SinonFakeXMLHttpRequest) => void;\n    url: string;\n    method: string;\n    requestHeaders: any;\n    requestBody: string;\n    status: number;\n    statusText: string;\n    async: boolean;\n    username: string;\n    password: string;\n    withCredentials: boolean;\n    upload: SinonFakeUploadProgress;\n    responseXML: Document;\n    getResponseHeader(header: string): string;\n    getAllResponseHeaders(): any;\n\n    // Methods\n    restore(): void;\n    useFilters: boolean;\n    addFilter(filter: (method: string, url: string, async: boolean, username: string, password: string) => boolean): void;\n    setResponseHeaders(headers: any): void;\n    setResponseBody(body: string): void;\n    respond(status: number, headers: any, body: string): void;\n    autoRespond(ms: number): void;\n}\n\ninterface SinonFakeXMLHttpRequestStatic {\n    (): SinonFakeXMLHttpRequest;\n}\n\ninterface SinonStatic {\n    useFakeXMLHttpRequest: SinonFakeXMLHttpRequestStatic;\n    FakeXMLHttpRequest: SinonFakeXMLHttpRequest;\n}\n\ninterface SinonFakeServer {\n    // Properties\n    autoRespond: boolean;\n    autoRespondAfter: number;\n    fakeHTTPMethods: boolean;\n    getHTTPMethod: (request: SinonFakeXMLHttpRequest) => string;\n    requests: SinonFakeXMLHttpRequest[];\n    respondImmediately: boolean;\n\n    // Methods\n    respondWith(body: string): void;\n    respondWith(response: any[]): void;\n    respondWith(fn: (xhr: SinonFakeXMLHttpRequest) => void): void;\n    respondWith(url: string, body: string): void;\n    respondWith(url: string, response: any[]): void;\n    respondWith(url: string, fn: (xhr: SinonFakeXMLHttpRequest) => void): void;\n    respondWith(method: string, url: string, body: string): void;\n    respondWith(method: string, url: string, response: any[]): void;\n    respondWith(method: string, url: string, fn: (xhr: SinonFakeXMLHttpRequest) => void): void;\n    respondWith(url: RegExp, body: string): void;\n    respondWith(url: RegExp, response: any[]): void;\n    respondWith(url: RegExp, fn: (xhr: SinonFakeXMLHttpRequest) => void): void;\n    respondWith(method: string, url: RegExp, body: string): void;\n    respondWith(method: string, url: RegExp, response: any[]): void;\n    respondWith(method: string, url: RegExp, fn: (xhr: SinonFakeXMLHttpRequest) => void): void;\n    respond(): void;\n    restore(): void;\n}\n\ninterface SinonFakeServerStatic {\n    create(): SinonFakeServer;\n}\n\ninterface SinonStatic {\n    fakeServer: SinonFakeServerStatic;\n    fakeServerWithClock: SinonFakeServerStatic;\n}\n\ninterface SinonExposeOptions {\n    prefix?: string;\n    includeFail?: boolean;\n}\n\ninterface SinonAssert {\n    // Properties\n    failException: string;\n    fail: (message?: string) => void; // Overridable\n    pass: (assertion: any) => void; // Overridable\n\n    // Methods\n    notCalled(spy: SinonSpy): void;\n    called(spy: SinonSpy): void;\n    calledOnce(spy: SinonSpy): void;\n    calledTwice(spy: SinonSpy): void;\n    calledThrice(spy: SinonSpy): void;\n    callCount(spy: SinonSpy, count: number): void;\n    callOrder(...spies: SinonSpy[]): void;\n    calledOn(spy: SinonSpy, obj: any): void;\n    alwaysCalledOn(spy: SinonSpy, obj: any): void;\n    calledWith(spy: SinonSpy, ...args: any[]): void;\n    alwaysCalledWith(spy: SinonSpy, ...args: any[]): void;\n    neverCalledWith(spy: SinonSpy, ...args: any[]): void;\n    calledWithExactly(spy: SinonSpy, ...args: any[]): void;\n    alwaysCalledWithExactly(spy: SinonSpy, ...args: any[]): void;\n    calledWithMatch(spy: SinonSpy, ...args: any[]): void;\n    alwaysCalledWithMatch(spy: SinonSpy, ...args: any[]): void;\n    neverCalledWithMatch(spy: SinonSpy, ...args: any[]): void;\n    threw(spy: SinonSpy): void;\n    threw(spy: SinonSpy, exception: string): void;\n    threw(spy: SinonSpy, exception: any): void;\n    alwaysThrew(spy: SinonSpy): void;\n    alwaysThrew(spy: SinonSpy, exception: string): void;\n    alwaysThrew(spy: SinonSpy, exception: any): void;\n    expose(obj: any, options?: SinonExposeOptions): void;\n}\n\ninterface SinonStatic {\n    assert: SinonAssert;\n}\n\ninterface SinonMatcher {\n    and(expr: SinonMatcher): SinonMatcher;\n    or(expr: SinonMatcher): SinonMatcher;\n}\n\ninterface SinonMatch {\n    (value: number): SinonMatcher;\n    (value: string): SinonMatcher;\n    (expr: RegExp): SinonMatcher;\n    (obj: any): SinonMatcher;\n    (callback: (value: any) => boolean): SinonMatcher;\n    any: SinonMatcher;\n    defined: SinonMatcher;\n    truthy: SinonMatcher;\n    falsy: SinonMatcher;\n    bool: SinonMatcher;\n    number: SinonMatcher;\n    string: SinonMatcher;\n    object: SinonMatcher;\n    func: SinonMatcher;\n    array: SinonMatcher;\n    regexp: SinonMatcher;\n    date: SinonMatcher;\n    same(obj: any): SinonMatcher;\n    typeOf(type: string): SinonMatcher;\n    instanceOf(type: any): SinonMatcher;\n    has(property: string, expect?: any): SinonMatcher;\n    hasOwn(property: string, expect?: any): SinonMatcher;\n}\n\ninterface SinonStatic {\n    match: SinonMatch;\n}\n\ninterface SinonSandboxConfig {\n    injectInto?: any;\n    properties?: string[];\n    useFakeTimers?: any;\n    useFakeServer?: any;\n}\n\ninterface SinonSandbox {\n    clock: SinonFakeTimers;\n    requests: SinonFakeXMLHttpRequest;\n    server: SinonFakeServer;\n    spy: SinonSpyStatic;\n    stub: SinonStubStatic;\n    mock: SinonMockStatic;\n    useFakeTimers: SinonFakeTimersStatic;\n    useFakeXMLHttpRequest: SinonFakeXMLHttpRequestStatic;\n    useFakeServer(): SinonFakeServer;\n    restore(): void;\n}\n\ninterface SinonSandboxStatic {\n    create(): SinonSandbox;\n    create(config: SinonSandboxConfig): SinonSandbox;\n}\n\ninterface SinonStatic {\n    sandbox: SinonSandboxStatic;\n}\n\ninterface SinonTestConfig {\n    injectIntoThis?: boolean;\n    injectInto?: any;\n    properties?: string[];\n    useFakeTimers?: boolean;\n    useFakeServer?: boolean;\n}\n\ninterface SinonTestWrapper extends SinonSandbox {\n    (...args: any[]): any;\n}\n\ninterface SinonStatic {\n    config: SinonTestConfig;\n    test(fn: (...args: any[]) => any): SinonTestWrapper;\n    testCase(tests: any): any;\n}\n\n// Utility overridables\ninterface SinonStatic {\n    createStubInstance(constructor: any): SinonStub;\n    format(obj: any): string;\n    log(message: string): void;\n    restore(object: any): void;\n}\n\n\ndeclare var sinon: SinonStatic;\n\ndeclare module \"sinon\" {\n    export = sinon;\n}"
  },
  {
    "path": "common/Tests/External/whatwg-fetch.3.0.0.js",
    "content": "// -----------------------------------------------------------------------------\n// NOTE: This is a modified version of the whatwg-fetch to support running in \n// the Application Insights (PhantomJS) \n// Test environment\n// -----------------------------------------------------------------------------\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (factory((global.WHATWGFetch = {})));\n}(this, (function (exports) { 'use strict';\n\n  // -----------------------------------------------------------------------------\n  // TEST HOOK! -- NOT PART of the standard whatwg-fetch logic\n  // Adding so that we can test that only the fetch is getting logged!\n  // Capture the \"Real\" XMLHttpRequest so that \n  var XHR = self.XMLHttpRequest;\n  // -----------------------------------------------------------------------------\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob:\n      'FileReader' in self &&\n      'Blob' in self &&\n      (function() {\n        try {\n          new Blob();\n          return true\n        } catch (e) {\n          return false\n        }\n      })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  };\n\n  function isDataView(obj) {\n    return obj && DataView.prototype.isPrototypeOf(obj)\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ];\n\n    var isArrayBufferView =\n      ArrayBuffer.isView ||\n      function(obj) {\n        return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n      };\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name);\n    }\n    if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value);\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift();\n        return {done: value === undefined, value: value}\n      }\n    };\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      };\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {};\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value);\n      }, this);\n    } else if (Array.isArray(headers)) {\n      headers.forEach(function(header) {\n        this.append(header[0], header[1]);\n      }, this);\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name]);\n      }, this);\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name);\n    value = normalizeValue(value);\n    var oldValue = this.map[name];\n    this.map[name] = oldValue ? oldValue + ', ' + value : value;\n  };\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)];\n  };\n\n  Headers.prototype.get = function(name) {\n    name = normalizeName(name);\n    return this.has(name) ? this.map[name] : null\n  };\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  };\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = normalizeValue(value);\n  };\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    for (var name in this.map) {\n      if (this.map.hasOwnProperty(name)) {\n        callback.call(thisArg, this.map[name], name, this);\n      }\n    }\n  };\n\n  Headers.prototype.keys = function() {\n    var items = [];\n    this.forEach(function(value, name) {\n      items.push(name);\n    });\n    return iteratorFor(items)\n  };\n\n  Headers.prototype.values = function() {\n    var items = [];\n    this.forEach(function(value) {\n      items.push(value);\n    });\n    return iteratorFor(items)\n  };\n\n  Headers.prototype.entries = function() {\n    var items = [];\n    this.forEach(function(value, name) {\n      items.push([name, value]);\n    });\n    return iteratorFor(items)\n  };\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true;\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result);\n      };\n      reader.onerror = function() {\n        reject(reader.error);\n      };\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader();\n    var promise = fileReaderReady(reader);\n    reader.readAsArrayBuffer(blob);\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader();\n    var promise = fileReaderReady(reader);\n    reader.readAsText(blob);\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf);\n    var chars = new Array(view.length);\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i]);\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength);\n      view.set(new Uint8Array(buf));\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false;\n\n    this._initBody = function(body) {\n      this._bodyInit = body;\n      if (!body) {\n        this._bodyText = '';\n      } else if (typeof body === 'string') {\n        this._bodyText = body;\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body;\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body;\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString();\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer);\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer]);\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body);\n      } else {\n        this._bodyText = body = Object.prototype.toString.call(body);\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8');\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type);\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n        }\n      }\n    };\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this);\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      };\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      };\n    }\n\n    this.text = function() {\n      var rejected = consumed(this);\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    };\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      };\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    };\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase();\n    return methods.indexOf(upcased) > -1 ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {};\n    var body = options.body;\n\n    if (input instanceof Request) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url;\n      this.credentials = input.credentials;\n      if (!options.headers) {\n        this.headers = new Headers(input.headers);\n      }\n      this.method = input.method;\n      this.mode = input.mode;\n      this.signal = input.signal;\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit;\n        input.bodyUsed = true;\n      }\n    } else {\n      this.url = String(input);\n    }\n\n    this.credentials = options.credentials || this.credentials || 'same-origin';\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers);\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET');\n    this.mode = options.mode || this.mode || null;\n    this.signal = options.signal || this.signal;\n    this.referrer = null;\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body);\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, {body: this._bodyInit})\n  };\n\n  function decode(body) {\n    var form = new FormData();\n    body\n      .trim()\n      .split('&')\n      .forEach(function(bytes) {\n        if (bytes) {\n          var split = bytes.split('=');\n          var name = split.shift().replace(/\\+/g, ' ');\n          var value = split.join('=').replace(/\\+/g, ' ');\n          form.append(decodeURIComponent(name), decodeURIComponent(value));\n        }\n      });\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers();\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n    // https://tools.ietf.org/html/rfc7230#section-3.2\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n    preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n      var parts = line.split(':');\n      var key = parts.shift().trim();\n      if (key) {\n        var value = parts.join(':').trim();\n        headers.append(key, value);\n      }\n    });\n    return headers\n  }\n\n  Body.call(Request.prototype);\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {};\n    }\n\n    this.type = 'default';\n    this.status = options.status === undefined ? 200 : options.status;\n    this.ok = this.status >= 200 && this.status < 300;\n    this.statusText = 'statusText' in options ? options.statusText : 'OK';\n    this.headers = new Headers(options.headers);\n    this.url = options.url || '';\n    this._initBody(bodyInit);\n  }\n\n  Body.call(Response.prototype);\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  };\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''});\n    response.type = 'error';\n    return response\n  };\n\n  var redirectStatuses = [301, 302, 303, 307, 308];\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  };\n\n  exports.DOMException = self.DOMException;\n  try {\n    new exports.DOMException();\n  } catch (err) {\n    exports.DOMException = function(message, name) {\n      this.message = message;\n      this.name = name;\n      var error = Error(message);\n      this.stack = error.stack;\n    };\n    exports.DOMException.prototype = Object.create(Error.prototype);\n    exports.DOMException.prototype.constructor = exports.DOMException;\n  }\n\n  function fetch(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init);\n\n      if (request.signal && request.signal.aborted) {\n        return reject(new exports.DOMException('Aborted', 'AbortError'))\n      }\n\n      var xhr = new XHR();\n\n      function abortXhr() {\n        xhr.abort();\n      }\n\n      // -----------------------------------------------------------------------------\n      // TEST HOOK! -- NOT PART of the standard whatwg-fetch logic\n      // Adding so that we can test that only the fetch is getting logged!\n\n      // PhantomJS Doesn't support the main events, so linking in the readystate\n      function _readyStateChange() {\n        // DONE (success or failure)\n        if (xhr.readyState === 4) {\n          var options = {\n            status: xhr.status,\n            statusText: xhr.statusText,\n            headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n          };\n          options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n          var body = 'response' in xhr ? xhr.response : xhr.responseText;\n          resolve(new Response(body, options));\n        }\n      }\n\n      var evtName = \"readystatechange\";\n      if (xhr.addEventListener) {\n        xhr.addEventListener(evtName, _readyStateChange);        \n      } else if (xhr.attachEvent) {\n        xhr.attachEvent(\"on\" + evtName, _readyStateChange);\n      }\n\n      // // xhr.onload = function() {\n      // //   var options = {\n      // //     status: xhr.status,\n      // //     statusText: xhr.statusText,\n      // //     headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n      // //   };\n      // //   options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n      // //   var body = 'response' in xhr ? xhr.response : xhr.responseText;\n      // //   resolve(new Response(body, options));\n      // // };\n      // -----------------------------------------------------------------------------\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'));\n      };\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'));\n      };\n\n      xhr.onabort = function() {\n        reject(new exports.DOMException('Aborted', 'AbortError'));\n      };\n\n      xhr.open(request.method, request.url, true);\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true;\n      } else if (request.credentials === 'omit') {\n        xhr.withCredentials = false;\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob';\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value);\n      });\n\n      if (request.signal) {\n        request.signal.addEventListener('abort', abortXhr);\n        xhr.onreadystatechange = function() {\n          // DONE (success or failure)\n          if (xhr.readyState === 4) {\n            request.signal.removeEventListener('abort', abortXhr);\n          }\n        };\n      }\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n    })\n  }\n\n  fetch.polyfill = true;\n\n  if (!self.fetch) {\n    self.fetch = fetch;\n    self.Headers = Headers;\n    self.Request = Request;\n    self.Response = Response;\n  }\n\n  exports.Headers = Headers;\n  exports.Request = Request;\n  exports.Response = Response;\n  exports.fetch = fetch;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "common/Tests/External/whatwg-fetch.3.6.2.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (factory((global.WHATWGFetch = {})));\n}(this, (function (exports) { 'use strict';\n\n  var global =\n    (typeof globalThis !== 'undefined' && globalThis) ||\n    (typeof self !== 'undefined' && self) ||\n    (typeof global !== 'undefined' && global);\n\n  var support = {\n    searchParams: 'URLSearchParams' in global,\n    iterable: 'Symbol' in global && 'iterator' in Symbol,\n    blob:\n      'FileReader' in global &&\n      'Blob' in global &&\n      (function() {\n        try {\n          new Blob();\n          return true\n        } catch (e) {\n          return false\n        }\n      })(),\n    formData: 'FormData' in global,\n    arrayBuffer: 'ArrayBuffer' in global\n  };\n\n  function isDataView(obj) {\n    return obj && DataView.prototype.isPrototypeOf(obj)\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ];\n\n    var isArrayBufferView =\n      ArrayBuffer.isView ||\n      function(obj) {\n        return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n      };\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name);\n    }\n    if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n      throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value);\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift();\n        return {done: value === undefined, value: value}\n      }\n    };\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      };\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {};\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value);\n      }, this);\n    } else if (Array.isArray(headers)) {\n      headers.forEach(function(header) {\n        this.append(header[0], header[1]);\n      }, this);\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name]);\n      }, this);\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name);\n    value = normalizeValue(value);\n    var oldValue = this.map[name];\n    this.map[name] = oldValue ? oldValue + ', ' + value : value;\n  };\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)];\n  };\n\n  Headers.prototype.get = function(name) {\n    name = normalizeName(name);\n    return this.has(name) ? this.map[name] : null\n  };\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  };\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = normalizeValue(value);\n  };\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    for (var name in this.map) {\n      if (this.map.hasOwnProperty(name)) {\n        callback.call(thisArg, this.map[name], name, this);\n      }\n    }\n  };\n\n  Headers.prototype.keys = function() {\n    var items = [];\n    this.forEach(function(value, name) {\n      items.push(name);\n    });\n    return iteratorFor(items)\n  };\n\n  Headers.prototype.values = function() {\n    var items = [];\n    this.forEach(function(value) {\n      items.push(value);\n    });\n    return iteratorFor(items)\n  };\n\n  Headers.prototype.entries = function() {\n    var items = [];\n    this.forEach(function(value, name) {\n      items.push([name, value]);\n    });\n    return iteratorFor(items)\n  };\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true;\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result);\n      };\n      reader.onerror = function() {\n        reject(reader.error);\n      };\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader();\n    var promise = fileReaderReady(reader);\n    reader.readAsArrayBuffer(blob);\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader();\n    var promise = fileReaderReady(reader);\n    reader.readAsText(blob);\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf);\n    var chars = new Array(view.length);\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i]);\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength);\n      view.set(new Uint8Array(buf));\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false;\n\n    this._initBody = function(body) {\n      /*\n        fetch-mock wraps the Response object in an ES6 Proxy to\n        provide useful test harness features such as flush. However, on\n        ES5 browsers without fetch or Proxy support pollyfills must be used;\n        the proxy-pollyfill is unable to proxy an attribute unless it exists\n        on the object before the Proxy is created. This change ensures\n        Response.bodyUsed exists on the instance, while maintaining the\n        semantic of setting Request.bodyUsed in the constructor before\n        _initBody is called.\n      */\n      this.bodyUsed = this.bodyUsed;\n      this._bodyInit = body;\n      if (!body) {\n        this._bodyText = '';\n      } else if (typeof body === 'string') {\n        this._bodyText = body;\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body;\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body;\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString();\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer);\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer]);\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body);\n      } else {\n        this._bodyText = body = Object.prototype.toString.call(body);\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8');\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type);\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n        }\n      }\n    };\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this);\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      };\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          var isConsumed = consumed(this);\n          if (isConsumed) {\n            return isConsumed\n          }\n          if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n            return Promise.resolve(\n              this._bodyArrayBuffer.buffer.slice(\n                this._bodyArrayBuffer.byteOffset,\n                this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n              )\n            )\n          } else {\n            return Promise.resolve(this._bodyArrayBuffer)\n          }\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      };\n    }\n\n    this.text = function() {\n      var rejected = consumed(this);\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    };\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      };\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    };\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase();\n    return methods.indexOf(upcased) > -1 ? upcased : method\n  }\n\n  function Request(input, options) {\n    if (!(this instanceof Request)) {\n      throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n    }\n\n    options = options || {};\n    var body = options.body;\n\n    if (input instanceof Request) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url;\n      this.credentials = input.credentials;\n      if (!options.headers) {\n        this.headers = new Headers(input.headers);\n      }\n      this.method = input.method;\n      this.mode = input.mode;\n      this.signal = input.signal;\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit;\n        input.bodyUsed = true;\n      }\n    } else {\n      this.url = String(input);\n    }\n\n    this.credentials = options.credentials || this.credentials || 'same-origin';\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers);\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET');\n    this.mode = options.mode || this.mode || null;\n    this.signal = options.signal || this.signal;\n    this.referrer = null;\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body);\n\n    if (this.method === 'GET' || this.method === 'HEAD') {\n      if (options.cache === 'no-store' || options.cache === 'no-cache') {\n        // Search for a '_' parameter in the query string\n        var reParamSearch = /([?&])_=[^&]*/;\n        if (reParamSearch.test(this.url)) {\n          // If it already exists then set the value with the current time\n          this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());\n        } else {\n          // Otherwise add a new '_' parameter to the end with the current time\n          var reQueryString = /\\?/;\n          this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();\n        }\n      }\n    }\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, {body: this._bodyInit})\n  };\n\n  function decode(body) {\n    var form = new FormData();\n    body\n      .trim()\n      .split('&')\n      .forEach(function(bytes) {\n        if (bytes) {\n          var split = bytes.split('=');\n          var name = split.shift().replace(/\\+/g, ' ');\n          var value = split.join('=').replace(/\\+/g, ' ');\n          form.append(decodeURIComponent(name), decodeURIComponent(value));\n        }\n      });\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers();\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n    // https://tools.ietf.org/html/rfc7230#section-3.2\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n    // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n    // https://github.com/github/fetch/issues/748\n    // https://github.com/zloirock/core-js/issues/751\n    preProcessedHeaders\n      .split('\\r')\n      .map(function(header) {\n        return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n      })\n      .forEach(function(line) {\n        var parts = line.split(':');\n        var key = parts.shift().trim();\n        if (key) {\n          var value = parts.join(':').trim();\n          headers.append(key, value);\n        }\n      });\n    return headers\n  }\n\n  Body.call(Request.prototype);\n\n  function Response(bodyInit, options) {\n    if (!(this instanceof Response)) {\n      throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n    }\n    if (!options) {\n      options = {};\n    }\n\n    this.type = 'default';\n    this.status = options.status === undefined ? 200 : options.status;\n    this.ok = this.status >= 200 && this.status < 300;\n    this.statusText = options.statusText === undefined ? '' : '' + options.statusText;\n    this.headers = new Headers(options.headers);\n    this.url = options.url || '';\n    this._initBody(bodyInit);\n  }\n\n  Body.call(Response.prototype);\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  };\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''});\n    response.type = 'error';\n    return response\n  };\n\n  var redirectStatuses = [301, 302, 303, 307, 308];\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  };\n\n  exports.DOMException = global.DOMException;\n  try {\n    new exports.DOMException();\n  } catch (err) {\n    exports.DOMException = function(message, name) {\n      this.message = message;\n      this.name = name;\n      var error = Error(message);\n      this.stack = error.stack;\n    };\n    exports.DOMException.prototype = Object.create(Error.prototype);\n    exports.DOMException.prototype.constructor = exports.DOMException;\n  }\n\n  function fetch(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init);\n\n      if (request.signal && request.signal.aborted) {\n        return reject(new exports.DOMException('Aborted', 'AbortError'))\n      }\n\n      var xhr = new XMLHttpRequest();\n\n      function abortXhr() {\n        xhr.abort();\n      }\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n        };\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n        var body = 'response' in xhr ? xhr.response : xhr.responseText;\n        setTimeout(function() {\n          resolve(new Response(body, options));\n        }, 0);\n      };\n\n      xhr.onerror = function() {\n        setTimeout(function() {\n          reject(new TypeError('Network request failed'));\n        }, 0);\n      };\n\n      xhr.ontimeout = function() {\n        setTimeout(function() {\n          reject(new TypeError('Network request failed'));\n        }, 0);\n      };\n\n      xhr.onabort = function() {\n        setTimeout(function() {\n          reject(new exports.DOMException('Aborted', 'AbortError'));\n        }, 0);\n      };\n\n      function fixUrl(url) {\n        try {\n          return url === '' && global.location.href ? global.location.href : url\n        } catch (e) {\n          return url\n        }\n      }\n\n      xhr.open(request.method, fixUrl(request.url), true);\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true;\n      } else if (request.credentials === 'omit') {\n        xhr.withCredentials = false;\n      }\n\n      if ('responseType' in xhr) {\n        if (support.blob) {\n          xhr.responseType = 'blob';\n        } else if (\n          support.arrayBuffer &&\n          request.headers.get('Content-Type') &&\n          request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1\n        ) {\n          xhr.responseType = 'arraybuffer';\n        }\n      }\n\n      if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) {\n        Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n          xhr.setRequestHeader(name, normalizeValue(init.headers[name]));\n        });\n      } else {\n        request.headers.forEach(function(value, name) {\n          xhr.setRequestHeader(name, value);\n        });\n      }\n\n      if (request.signal) {\n        request.signal.addEventListener('abort', abortXhr);\n\n        xhr.onreadystatechange = function() {\n          // DONE (success or failure)\n          if (xhr.readyState === 4) {\n            request.signal.removeEventListener('abort', abortXhr);\n          }\n        };\n      }\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n    })\n  }\n\n  fetch.polyfill = true;\n\n  if (!global.fetch) {\n    global.fetch = fetch;\n    global.Headers = Headers;\n    global.Request = Request;\n    global.Response = Response;\n  }\n\n  exports.Headers = Headers;\n  exports.Request = Request;\n  exports.Response = Response;\n  exports.fetch = fetch;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "common/Tests/Framework/package.json",
    "content": "{\n    \"name\": \"@microsoft/ai-test-framework\",\n    \"author\": \"Microsoft Corporation\",\n    \"version\": \"0.0.1\",\n    \"description\": \"Microsoft Application Insights Javascript SDK Internal Test Framework\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\"\n    ],\n    \"main\": \"dist/es5/ai-test-framework.js\",\n    \"module\": \"dist-es5/ai-test-framework.js\",\n    \"types\": \"types/ai-test-framework.d.ts\",\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser\",\n        \"build:esm\": \"grunt tst-framework\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/common/Tests/Framework\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@types/qunit\": \"^2.19.3\",\n        \"@types/sinon\": \"4.3.3\",\n        \"grunt\": \"^1.6.1\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "common/Tests/Framework/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { updateDistEsmFiles } from \"../../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst outputName = \"ai-test-framework\";\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Internal Test Framework, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst nodeUmdRollupConfigFactory = () => {\n  const nodeRollupConfig = {\n    input: `dist-es5/ai-test-framework.js`,\n    output: {\n      file: `dist/es5/${outputName}.js`,\n      banner: banner,\n      format: \"umd\",\n      name: \"Microsoft.ApplicationInsights\",\n      extend: true,\n      freeze: false,\n      sourcemap: true\n    },\n    plugins: [\n      nodeResolve()\n    ]\n  };\n\n  return nodeRollupConfig;\n}\n\nupdateDistEsmFiles({}, banner);\n\nexport default [\n  nodeUmdRollupConfigFactory(),\n];\n"
  },
  {
    "path": "common/Tests/Framework/src/AITestClass.ts",
    "content": "/// <reference path=\"../../External/qunit.d.ts\" />\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { arrForEach, dumpObj, getGlobal, isArray, objDefineProp, objForEachKey, objGetPrototypeOf, setBypassLazyCache, strStartsWith, throwError, getNavigator, getPerformance, strSubstr, strContains, getDocument, ITimerHandler, isFunction, isPromiseLike } from \"@nevware21/ts-utils\";\nimport { SinonSandbox, SinonSpy, SinonStub, SinonMock, useFakeTimers, stub, createSandbox, useFakeXMLHttpRequest, assert as sinonAssert } from \"sinon\";\nimport { Assert } from \"./Assert\";\nimport { ITestCaseAsync } from \"./interfaces/ITestCaseAsync\";\nimport { ITestCase } from \"./interfaces/ITestCase\";\nimport { ITestContext } from \"./interfaces/ITestContext\";\nimport { StepResult } from \"./StepResult\";\nimport { IFakeXMLHttpRequest } from \"./interfaces/FakeXMLHttpRequest\";\nimport { IFetchRequest } from \"./interfaces/IFetchRequest\";\nimport { IBeaconRequest } from \"./interfaces/IBeaconRequest\";\nimport { createPromise, createSyncPromise, createTaskScheduler, createTimeoutPromise, doAwait, FinallyPromiseHandler, IPromise, RejectedPromiseHandler, ResolvedPromiseHandler } from \"@nevware21/ts-async\";\nimport { AITestQueueTask, IAsyncQueue } from \"./interfaces/IASyncQueue\";\n\nconst stepRetryCnt = \"retryCnt\";\n\nexport interface FakeXMLHttpRequest extends XMLHttpRequest {\n    url?: string;\n    method?: string;\n    requestHeaders?: any;\n    respond: (status: number, headers: any, body: string) => void;\n}\n\nexport interface IFetchArgs {\n    input: RequestInfo,\n    init: RequestInit\n}\n\nfunction _getObjName(target:any, unknownValue?:string) {\n    if (target.hasOwnProperty(\"prototype\")) {\n        // Look like a prototype\n        return target.name || unknownValue || \"\"\n    }\n\n    return (((target || {})[\"constructor\"]) || {}).name || unknownValue || \"\";\n}\n\nfunction _getAllAiDataKeys<T = any>(target: T, callbackfn: (name: string, value: T[keyof T]) => void) {\n    if (target) {\n        let keys = Object.getOwnPropertyNames(target);\n        arrForEach(keys, (key) => {\n            if (strStartsWith(key, \"_aiData\")) {\n                callbackfn.call(target, key, target[key]);\n            }\n        });\n    }\n}\n\nfunction _formatNamespace(namespaces: string | string[]) {\n    if (namespaces) {\n        if (isArray(namespaces)) {\n            return namespaces.sort().join(\".\");\n        }\n    }\n\n    return namespaces || \"\";\n}\n\n/**\n * @internal\n * This is HIGHLY specific to the QUnit test framework (and possibly the version) and should be updated for other frameworks\n * @param name - The new test name to set\n * @param message - The message to log to the console\n */\nfunction _updateQUnitTestName(name: string, message: string) {\n    // Mark the test as asynchronous by updating the QUnit test name\n    // This is specific to the QUnit test framework and may need to be updated for other frameworks\n    const currentTest: any = QUnit.config && QUnit.config.current;\n    if (currentTest) {\n        if (\"testName\" in currentTest) {\n            currentTest.testName = name;\n        }\n\n        if (\"testReport\" in currentTest) {\n            if (\"name\" in currentTest.testReport) {\n                currentTest.testReport.name = name;\n            }\n\n            if (\"fullName\" in currentTest.testReport && isArray(currentTest.testReport.fullName) && currentTest.testReport.fullName.length == 2) {\n                currentTest.testReport.fullName[1] = name;\n            }\n        }\n\n        // Update the HTML report to include the updated test name\n        let doc = getDocument();\n        let parentElm = doc.getElementById(\"qunit-test-output-\" + currentTest.testId);\n        if (parentElm) {\n            let testName: HTMLElement = parentElm.querySelector(\".test-name\");\n            if (testName) {\n                testName.innerText = name;\n            }\n        }\n    }\n\n    QUnit.assert.ok(true, message || (\"Updating test name to: \" + name));\n}\n\nexport class AITestClass {\n    public static orgSetTimeout: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timeout;\n    public static orgClearTimeout: (timeoutId: NodeJS.Timeout) => void;\n    public static orgLocalStorage: Storage;\n    public static orgObjectDefineProperty = Object.defineProperty;\n    public static isPollingStepFlag = \"isPollingStep\";\n\n    /** The instance of the currently running suite. */\n    public static currentTestClass: AITestClass;\n    public static currentTestInfo: ITestCase | ITestCaseAsync;\n    private static _currentTestContext: ITestContext | null = null;\n\n    /**\n     * Find a named base class for the provided class instance, using an instance so that any dynamicProto() implementations have been resolved.\n     * @param rootInstance An instance of the Class that you want to find the named base class.\n     * @param baseClassName The name of the base class\n     * @returns The named base class constructor or null if not found\n     */\n    public static GetNamedBaseClass<T>(rootInstance: T, baseClassName: string) {\n        let rootPrototype = objGetPrototypeOf(rootInstance);\n        let parent = rootPrototype;\n        while (parent != null) {\n            if (parent != rootPrototype) {\n                let parentName = parent.constructor.name;\n                if (parentName == baseClassName) {\n                    return parent.constructor;\n                }\n        \n                if (!parentName || parentName == \"Object\") {\n                    break;\n                }\n            }\n    \n            parent = objGetPrototypeOf(parent);\n        }\n    \n        return null;\n    }\n    \n    /** Turns on/off sinon's fake implementation of XMLHttpRequest. On by default. */\n    public sandboxConfig: any = {};\n\n    \n    /**** Sinon methods and properties ***/\n\n    // These methods and properties are injected by Sinon and will override the implementation here.\n    // These are here purely to make typescript happy.\n    protected clock: any;\n    public sandbox: SinonSandbox;\n    public fakeServerAutoRespond: boolean = false;\n    public fakeFetchAutoRespond: boolean = false;\n    public isEmulatingIe: boolean;\n\n    /**\n     * Automatically assert that all registered events have been removed\n     */\n    public assertNoEvents: boolean = true;\n\n    /**\n      * Automatically assert that all hooks have been removed\n      */\n    public assertNoHooks: boolean = true;\n\n    protected _orgCrypto: Crypto | null;\n    protected _orgLocation: Location | null;\n\n    /** Turns on/off sinon's fake implementation of XMLHttpRequest. On by default. */\n    private _useFakeServer: boolean = true;\n    private _useFakeFetch: boolean = false;\n    private _moduleName: string;\n    private _xhr: any;\n    private _xhrOrgSend: any;\n    private _xhrRequests: FakeXMLHttpRequest[] = [];\n    private _fetchRequests: IFetchArgs[] = [];\n    private _orgNavigator: any;\n    private _orgPerformance: any;\n    private _beaconHooked: boolean = false;\n    private _beaconHooks: any[] = [];\n    private _dynProtoOpts: any = null;\n    private _orgLocalStorage: any;\n    private _navOrgProduct:string;\n\n    // Simulate an IE environment\n    private _orgObjectFuncs: any = null;\n    private _orgFetch: any = null;\n    private _orgSymbol: Symbol = null;\n\n    private _onDoneFuncs: VoidFunction[] = [];\n\n    constructor(name?: string, emulateIE?: boolean) {\n        this._moduleName = (emulateIE ? \"(IE) \" : \"\") + (name || _getObjName(this, \"\"));\n        this.isEmulatingIe = emulateIE;\n        QUnit.module(this._moduleName);\n        this.sandboxConfig.injectIntoThis = true;\n        this.sandboxConfig.injectInto = null;\n        this.sandboxConfig.properties = [\"spy\", \"stub\", \"mock\", \"sandbox\"];\n    }\n\n    get useFakeServer(): boolean {\n        return this._useFakeServer;\n    }\n\n    set useFakeServer(value: boolean) {\n        this._useFakeServer = value;\n        if (!value) {\n            this._unhookXhr();\n        } else if (value && AITestClass.currentTestInfo) {\n            this._hookXhr();\n        }\n    }\n\n    get useFakeFetch(): boolean {\n        return this._useFakeFetch;\n    }\n\n    set useFakeFetch(value: boolean) {\n        this._useFakeFetch = value;\n        if (!value) {\n            this._unhookFetch();\n        } else if (value && AITestClass.currentTestInfo) {\n            this._hookFetch();\n        }\n    }\n\n    get activeXhrRequests(): IFakeXMLHttpRequest[] {\n        let activeRequests: IFakeXMLHttpRequest[] = [];\n\n        this._xhrRequests.forEach((xhr) => {\n            if (xhr && xhr.url && xhr.method) {\n                activeRequests.push(xhr);\n            }\n        });\n\n        return activeRequests;\n    }\n\n    protected get _testContext(): ITestContext {\n        if (AITestClass._currentTestContext) {\n            return AITestClass._currentTestContext;\n        }\n\n        return {\n            name: AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<undefined>\",\n            context: {},\n            pollDelay: 100,\n            testDone: () => { },\n            clock: AITestClass.currentTestClass ? AITestClass.currentTestClass.clock : null,\n            finished: true\n        };\n    }\n\n    /** Method called before the start of each test method */\n    public testInitialize() {\n    }\n\n    /**\n     * Method called immediately after the test case has finished, but before the automatic test case assertions.\n     * Use this method to call unload / teardown so the SDK can remove it's own events before being validated\n     */\n    public testFinishedCleanup() {\n    }\n\n    /** Method called after each test method has completed and after the test sandbox has been cleanup up.\n     * This is the final step before the next test is executed\n     */\n    public testCleanup() {\n        let storage: Storage = sessionStorage;\n        if (storage) {\n            storage.clear();\n        }\n    }\n\n    /** Method in which test class instances should call this.testCase(...) to register each of this suite's tests. */\n    public registerTests() {\n    }\n\n    /**\n     * Register an async Javascript unit testcase.\n     * @deprecated Use the normal {@link AITestClass.testCase} method instead and return a Promise from the test method,\n     * this will be automatically detected and handled as an asynchronous test case. For Polling test cases instead of\n     * using {@link PollingAssert.createPollingAssert} use {@link AITestClass._asyncQueue} {@link PollingAssert.asyncTaskPollingAssert}\n     * which will use Promise(s) that will resolve immediately once the polling has completed.\n     */\n    public testCaseAsync(testInfo: ITestCaseAsync) {\n        if (!testInfo.name) {\n            throwError(\"Must specify name in testInfo context in registerTestcase call\");\n        }\n\n        if (isNaN(testInfo.stepDelay)) {\n            throwError(\"Must specify 'stepDelay' period between pre and post\");\n        }\n\n        if (!testInfo.steps) {\n            throwError(\"Must specify 'steps' to take asynchronously\");\n        }\n\n        if (testInfo.autoComplete === undefined) {\n            testInfo.autoComplete = true;\n        }\n\n        if (!testInfo.orgClearTimeout) {\n            // Set as the real clearTimeout (as _testStarting and enable sinon fake timers)\n            testInfo.orgClearTimeout = clearTimeout;\n        }\n\n        if (!testInfo.orgSetTimeout) {\n            // Set as the real setTimeout (as _testStarting and enable sinon fake timers)\n            testInfo.orgSetTimeout = setTimeout;\n        }\n                \n        // Create a wrapper around the test method so we can do test initilization and cleanup.\n        const testMethod = (assert: any) => {\n            const done = assert.async();\n            const self = this;\n\n            // Save off the instance of the currently running suite.\n            AITestClass.currentTestClass = this;\n            AITestClass.currentTestInfo = testInfo;\n\n            // Save the real clearTimeout (as _testStarting and enable sinon fake timers)\n            const orgClearTimeout = clearTimeout;\n            const orgSetTimeout = setTimeout;\n            AITestClass.orgLocalStorage = window.localStorage;\n\n            AITestClass.orgSetTimeout = (handler: (...args: any[]) => void, timeout: number, ...args: any[]) => {\n                if (AITestClass.currentTestInfo && AITestClass.currentTestInfo.orgSetTimeout) {\n                    return AITestClass.currentTestInfo.orgSetTimeout.call(null, handler, timeout, args);\n                }\n\n                orgSetTimeout(handler, timeout, args);\n            };\n\n            AITestClass.orgClearTimeout = (timeoutId: NodeJS.Timeout) => {\n                if (AITestClass.currentTestInfo && AITestClass.currentTestInfo.orgClearTimeout) {\n                    AITestClass.currentTestInfo.orgClearTimeout.call(null, timeoutId);\n                } else {\n                    orgClearTimeout(timeoutId);\n                }\n            };\n\n            let useFakeServer = testInfo.useFakeServer;\n            if (useFakeServer === undefined) {\n                useFakeServer = self.useFakeServer;\n            }\n\n            if (useFakeServer) {\n                self._hookXhr();\n            }\n\n            let useFakeFetch = testInfo.useFakeFetch;\n            if (useFakeFetch === undefined) {\n                useFakeFetch = self.useFakeFetch;\n            }\n\n            if (useFakeFetch && !self.isEmulatingIe) {\n                self._hookFetch();\n            }\n\n            if (testInfo.useFakeTimers) {\n                self.clock = useFakeTimers();\n            }\n\n            if (self.isEmulatingIe) {\n                self._emulateIE();\n            }\n\n            if (testInfo.assertNoEvents === undefined) {\n                testInfo.assertNoEvents = self.assertNoEvents;\n            }\n\n            if (testInfo.assertNoHooks === undefined) {\n                testInfo.assertNoHooks = self.assertNoHooks;\n            }\n\n            // Run the test.\n            try {\n                let self = this;\n                let testComplete = false;\n                let timeOutTimer: any = null;\n                let stepIndex = 0;\n\n                const testDone = () => {\n                    self._testFinishedCleanup();\n\n                    if (testInfo.assertNoEvents) {\n                        self._assertEventsRemoved();\n                    }\n\n                    if (testInfo.assertNoHooks) {\n                        self._assertHooksRemoved();\n                    }\n\n                    if (timeOutTimer) {\n                        orgClearTimeout(timeOutTimer);\n                    }\n    \n                    testComplete = true;\n                    // done is QUnit callback indicating the end of the test\n                    self._testCompleted();\n                    done();\n                };\n    \n                let testContext: ITestContext = {\n                    name: testInfo.name,\n                    context: {},\n                    pollDelay: testInfo.stepDelay || 100,\n                    testDone: testDone,\n                    clock: testInfo.useFakeTimers ? self.clock : null,\n                    finished: false\n                };\n\n                AITestClass._currentTestContext = testContext;\n\n                if (testInfo.skipTimeout !== true && testInfo.timeOut !== undefined) {\n                    timeOutTimer = AITestClass.orgSetTimeout(() => {\n                        QUnit.assert.ok(false, \"Test case timed out!\");\n                        testComplete = true;\n                        done();\n                    }, testInfo.timeOut);\n                }\n\n                self._testStarting();\n\n                const steps = testInfo.steps;\n                const trigger = () => {\n                    // The callback which activates the next test step.\n                    const nextTestStepTrigger = () => {\n                        AITestClass.orgSetTimeout(() => {\n                            trigger();\n                        }, testInfo.stepDelay);\n                    };\n\n                    if (steps.length && !testComplete) {\n                        const step = steps.shift();\n                        stepIndex++;\n\n                        // There 2 types of test steps - simple and polling.\n                        // Upon completion of the simple test step the next test step will be called.\n                        // In case of polling test step the next test step is passed to the polling test step, and\n                        // it is responsibility of the polling test step to call the next test step.\n                        try {\n                            if (step) {\n                                testContext.clock = this.clock || null;\n                                if (step[AITestClass.isPollingStepFlag]) {\n                                    step.call(this, testContext, nextTestStepTrigger);\n                                } else {\n                                    step[stepRetryCnt] = step[stepRetryCnt] || 0;\n    \n                                    let result = step.call(this, testContext);\n                                    if (result === StepResult.Retry || result === false) {\n                                        // The step requested itself to be retried\n                                        Assert.ok(false, \"Retrying Step - \" + stepIndex + \" - Attempt #\" + step[stepRetryCnt]);\n                                        step[stepRetryCnt] = step[stepRetryCnt] + 1;\n                                        steps.unshift(step);\n                                        stepIndex--;\n                                    } else if (result === StepResult.Repeat) {\n                                        // The step requested itself to be repeated\n                                        steps.unshift(step);\n                                        stepIndex--;\n                                    } else if (result === StepResult.Abort) {\n                                        Assert.ok(false, \"Step aborted!\");\n                                        testDone();\n                                        return;\n                                    }\n    \n                                    nextTestStepTrigger.call(this);\n                                }\n                            }\n                        } catch (e) {\n                            // tslint:disable-next-line:no-console\n                            console && console.error(\"Failed: Unexpected Exception: \" + dumpObj(e));\n                            Assert.ok(false, dumpObj(e));\n\n                            // done is QUnit callback indicating the end of the test\n                            testDone();\n                            return;\n                        }\n                    } else if (!testComplete) {\n                        if (testInfo.autoComplete) {\n                            // done is QUnit callback indicating the end of the test\n                            testDone();\n                        } else {\n                            nextTestStepTrigger();\n                        }\n                    }\n                };\n\n                trigger();\n            } catch (ex) {\n                // tslint:disable-next-line:no-console\n                console && console.error(\"Failed: Unexpected Exception: \" + dumpObj(ex));\n                Assert.ok(false, \"Unexpected Exception: \" + dumpObj(ex));\n                self._testCompleted(true);\n\n                // done is QUnit callback indicating the end of the test\n                done();\n            }\n        };\n\n        // Register the test with QUnit\n        QUnit.test((this.isEmulatingIe ? \"(IE) \" : \"\") + testInfo.name + \" - (Async)\", testMethod);\n    }\n\n    /** Register a Javascript unit testcase. */\n    public testCase(testInfo: ITestCase) {\n        if (!testInfo.name) {\n            throw new Error(\"Must specify name in testInfo context in registerTestcase call\");\n        }\n\n        if (!testInfo.test) {\n            throw new Error(\"Must specify 'test' method in testInfo context in registerTestcase call\");\n        }\n\n        if (!testInfo.orgClearTimeout) {\n            // Set as the real clearTimeout (as _testStarting and enable sinon fake timers)\n            testInfo.orgClearTimeout = clearTimeout;\n        }\n\n        if (!testInfo.orgSetTimeout) {\n            // Set as the real setTimeout (as _testStarting and enable sinon fake timers)\n            testInfo.orgSetTimeout = setTimeout;\n        }\n\n        // Create a wrapper around the test method so we can do test initilization and cleanup.\n        const testMethod = (assert: any) => {\n            // Treating all tests as async, so there is no issues with mixing them\n            let done = assert.async();\n            let self = this;\n\n            // Save off the instance of the currently running suite.\n            AITestClass.currentTestClass = this;\n            AITestClass.currentTestInfo = testInfo;\n\n            function _testFinished(failed?: boolean) {\n                self._testFinishedCleanup();\n\n                if (testInfo.assertNoEvents) {\n                    self._assertEventsRemoved();\n                }\n\n                if (testInfo.assertNoHooks) {\n                    self._assertHooksRemoved();\n                }\n\n                AITestClass.currentTestClass && AITestClass.currentTestClass._testCompleted(failed);\n                done();\n            }\n\n            // Save the real clearTimeout (as _testStarting and enable sinon fake timers)\n            const orgClearTimeout = clearTimeout;\n            const orgSetTimeout = setTimeout;\n            AITestClass.orgLocalStorage = window.localStorage;\n\n            AITestClass.orgSetTimeout = (handler: (...args: any[]) => void, timeout: number, ...args: any[]) => {\n                if (AITestClass.currentTestInfo && AITestClass.currentTestInfo.orgSetTimeout) {\n                    return AITestClass.currentTestInfo.orgSetTimeout.call(null, handler, timeout, args);\n                }\n\n                orgSetTimeout(handler, timeout, args);\n            };\n\n            AITestClass.orgClearTimeout = (timeoutId: NodeJS.Timeout) => {\n                if (AITestClass.currentTestInfo && AITestClass.currentTestInfo.orgClearTimeout) {\n                    AITestClass.currentTestInfo.orgClearTimeout.call(null, timeoutId);\n                } else {\n                    orgClearTimeout(timeoutId);\n                }\n            };\n\n            let useFakeServer = testInfo.useFakeServer;\n            if (useFakeServer === undefined) {\n                useFakeServer = this.useFakeServer;\n            }\n\n            if (useFakeServer) {\n                this._hookXhr();\n            }\n\n            if (testInfo.useFakeTimers) {\n                this.clock = useFakeTimers();\n            }\n\n            if (this.isEmulatingIe) {\n                this._emulateIE();\n            }\n\n            if (testInfo.assertNoEvents === undefined) {\n                testInfo.assertNoEvents = this.assertNoEvents;\n            }\n\n            if (testInfo.assertNoHooks === undefined) {\n                testInfo.assertNoHooks = this.assertNoHooks;\n            }\n\n            let testContext = {\n                name: testInfo.name,\n                context: {},\n                pollDelay: testInfo.pollDelay,\n                testDone: () => {\n                    _testFinished(true);\n                },\n                clock: testInfo.useFakeTimers ? self.clock : null,\n                finished: false\n            };\n\n            let testTimeout: any\n\n            // Run the test.\n            try {\n                this._testStarting();\n\n                if (testInfo.skipTimeout !== true) {\n                    // Default timeout for tests has been set to 30 seconds\n                    let timeout = testInfo.timeout || 30000;\n                    testTimeout = AITestClass.orgSetTimeout(() => {\n                        if (!testContext.finished) {\n                            QUnit.assert.ok(false, \"Timeout: Aborting as the Promise returned from the test method did not resolve within \" + timeout + \" ms\");\n                            testTimeout = null;\n                        }\n\n                        _testFinished(true);\n                    }, timeout);\n                }\n\n                AITestClass._currentTestContext = testContext;\n\n                // Call the test method directly\n                let result = testInfo.test.call(this);\n\n                if (result && result.waitComplete) {\n                    // looks like an IAsyncQueue object\n                    result = result.waitComplete();\n                }\n\n                // Check if the result is present and looks like a Promise\n                if (result && result.then) {\n                    // Append \"(Async)\" to the test name to indicate that this is an async test\"\n                    _updateQUnitTestName((this.isEmulatingIe ? \"(IE) \" : \"\") + testInfo.name + \" - (Async)\", \" -=( Async test detected -- updating test name )=-\");\n                    result.then(() => {\n                        if (!testContext.finished) {\n                            testTimeout && AITestClass.orgClearTimeout(testTimeout);\n                            testTimeout = null;\n                            QUnit.assert.ok(true, \"Returned Promise resolved\");\n                        }\n\n                        _testFinished();\n                    });\n                    result.catch && result.catch((reason: any) => {\n                        if (!testContext.finished) {\n                            testTimeout && AITestClass.orgClearTimeout(testTimeout);\n                            testTimeout = null;\n                            QUnit.assert.ok(false, \"Returned Promise rejected: \" + reason);\n                        }\n\n                        _testFinished(true);\n                    });\n                } else {\n                    testTimeout && AITestClass.orgClearTimeout(testTimeout);\n                    testTimeout = null;\n                    _testFinished();\n                }\n            } catch (ex) {\n                if (!testContext.finished) {\n                    // tslint:disable-next-line:no-console\n                    console && console.error(\"Failed: Unexpected Exception: \" + dumpObj(ex));\n                    Assert.ok(false, \"Unexpected Exception: \" + dumpObj(ex));\n                    testTimeout && AITestClass.orgClearTimeout(testTimeout);\n                    testTimeout = null;\n                }\n\n                _testFinished(true);\n            }\n        };\n\n        // Register the test with QUnit\n        QUnit.test((this.isEmulatingIe ? \"(IE) \" : \"\") + testInfo.name, testMethod);\n    }\n\n    /** Creates an anonymous function that records arguments, this value, exceptions and return values for all calls. */\n    public spy(): SinonSpy;\n    /** Spies on the provided function */\n    public spy(funcToWrap: Function): SinonSpy;\n    /** Creates a spy for object.methodName and replaces the original method with the spy. The spy acts exactly like the original method in all cases. The original method can be restored by calling object.methodName.restore(). The returned spy is the function object which replaced the original method. spy === object.method. */\n    public spy(object: any, methodName: string, func?: Function): SinonSpy;\n    public spy(..._args: any[]): SinonSpy {\n        return null;\n    }\n\n    /** Creates an anonymous stub function. */\n    public stub(): SinonStub;\n    /** Stubs all the object's methods. */\n    public stub(object: any): SinonStub;\n    /** Replaces object.methodName with a func, wrapped in a spy. As usual, object.methodName.restore(); can be used to restore the original method. */\n    public stub(object: any, methodName: string, func?: Function): SinonStub;\n    public stub(..._args: any[]): SinonStub {\n        return null;\n    }\n\n    /** Creates a mock for the provided object.Does not change the object, but returns a mock object to set expectations on the object's methods. */\n    public mock(_object: any): SinonMock {\n        return null;\n    }\n\n    /**** end: Sinon methods and properties ***/\n\n    /**\n     * Sends a JSON response to the provided request.\n     * @param request - The request to respond to.\n     * @param data - Data to respond with.\n     * @param errorCode - Optional error code to send with the request, default is 200\n     */\n    public sendJsonResponse(request: IFakeXMLHttpRequest, data: any, errorCode?: number) {\n        if (errorCode === undefined) {\n            errorCode = 200;\n        }\n\n        request.respond(\n            errorCode,\n            { \"Content-Type\": \"application/json\" },\n            JSON.stringify(data));\n    }\n\n    public getPayloadMessages(spy: SinonSpy, includeInit:boolean = false) {\n        let resultPayload: any[] = [];\n        if (spy.called && spy.args && spy.args.length > 0) {\n            spy.args.forEach(call => {\n                call[0].forEach((item: any) => {\n                    let message = item;\n                    if (typeof item !== \"string\") {\n                        message = item.item;\n                    }\n                    if (message) {\n                        // Ignore the internal SendBrowserInfoOnUserInit message (Only occurs when running tests in a browser)\n                        if (includeInit || message.indexOf(\"AI (Internal): 72 \") === -1) {\n                            resultPayload.push(message);\n                        }\n                    }\n                });\n            });\n        }\n\n        return resultPayload;\n    }\n\n    public dumpPayloadMessages(spy: SinonSpy) {\n        let msg = \"Sent Messages\";\n        if (spy.called && spy.args && spy.args.length > 0) {\n            spy.args[0][0].forEach((value: any, idx: number) => {\n                msg += \"\\n\" + idx + \":\" + value;\n            });\n        }\n        Assert.ok(false, msg);\n    }\n        \n    protected _asyncQueue(): IAsyncQueue {\n        let testContext = this._testContext;\n        // This is an async task, so we need to wait for it to complete\n        let scheduler = createTaskScheduler(createPromise, testContext.name);\n\n        function _addTask(theTask: AITestQueueTask, taskName?: string, timeout?: number): IAsyncQueue {\n            if (theTask) {\n                scheduler.queue((taskName: string) => {\n                    if (!testContext.finished) {\n                        QUnit.assert.ok(true, \"Task: \" + taskName);\n                        return theTask.call(this, testContext);\n                    }\n                }, taskName || theTask.name || \"\", timeout);\n            }\n\n            return theAsyncTasks;\n        }\n\n        function _doAwait<T, TResult1 = T, TResult2 = never>(value: T | PromiseLike<T>,  resolveFn: ResolvedPromiseHandler<T, TResult1>, rejectFn?: RejectedPromiseHandler<TResult2>, finallyFn?: FinallyPromiseHandler): IAsyncQueue {\n            scheduler.queue((taskName: string) => {\n                if (!testContext.finished) {\n                    QUnit.assert.ok(true, \"Await: \" + taskName);\n                    let result = doAwait(value, resolveFn, rejectFn, finallyFn);\n                    if (isPromiseLike(result)) {\n                        return result as IPromise<any>;\n                    }\n                }\n            });\n            \n            return theAsyncTasks;\n        }\n\n        let theAsyncTasks: IAsyncQueue = {\n            add: _addTask,\n            concat: _addTask,\n            doAwait: _doAwait,\n            waitComplete: () => {\n                // Wait for the scheduler to complete\n                return scheduler.queue(() => {\n                    if (!testContext.finished) {\n                        QUnit.assert.ok(true, \"Async Tasks complete\");\n                    }\n                }, \"Async Tasks complete\");\n            }\n        };\n\n        return theAsyncTasks;\n    }\n\n    protected _delay(ms: number, nextTask: AITestQueueTask): IPromise<void> {\n        let testContext = this._testContext;\n        return createTimeoutPromise(ms, true).then(() => {\n            if (testContext && testContext.finished) {\n                return;\n            }\n\n            if (testContext && testContext.clock) {\n                testContext.clock.tick(ms);\n            }\n\n            return nextTask(testContext);\n        });\n    }\n\n    protected onDone(cleanupFn: VoidFunction) {\n        if (cleanupFn && this._onDoneFuncs) {\n            this._onDoneFuncs.push(cleanupFn);\n        }\n    }\n\n    protected setUserAgent(userAgent: string) {\n        // Hook Send beacon which also mocks navigator\n        if (!this._orgNavigator) {\n            // Hook the navigator\n            this.hookSendBeacon(null);\n        }\n\t\n        this.setNavigator({\n            userAgent: userAgent\n        }, true);\n    }\n\n    protected setUserAgentData(userAgentData: any) {\n        // Hook Send beacon which also mocks navigator\n        if (!this._orgNavigator) {\n            this.hookSendBeacon(null);\n        }\n\n        try {\n            AITestClass.orgObjectDefineProperty(getNavigator(), \"userAgentData\",\n                {\n                    configurable: true,\n                    get: function () {\n                        return userAgentData;\n                    }\n                });\n\n            setBypassLazyCache(true);\n        } catch (e) {\n            Assert.ok(false, \"Failed to set the userAgent - \" + e);\n            throw e;\n        }\n    }\n\n    protected setReactNative() {\n        this._setNavProduct(\"ReactNative\");\n    }\n\n    protected hookSendBeacon(cb: (url: string, data?: BodyInit | null) => void): IBeaconRequest[] {\n        let _self = this;\n        let calls:IBeaconRequest[] = [];\n\n        if (cb) {\n            _self._beaconHooks.push((url: string, data: any) => {\n                calls.push({\n                    url,\n                    data\n                });\n    \n                return cb(url, data);\n            });\n        }\n\n        if (!_self._beaconHooked) {\n            let newNavigator = <any>{};\n\n            newNavigator.sendBeacon = (url: string, data: any) => {\n                let returnValue = false;\n                let handled = false;\n    \n                // Note: Using the _self and not the current this\n                _self._beaconHooks.forEach(element => {\n                    let result = element(url, data);\n                    if (result !== undefined) {\n                        returnValue = returnValue || result;\n                        handled = true;\n                    }\n                });\n                if (!handled) {\n                    return _self._orgNavigator.sendBeacon(url, data);\n                }\n    \n                return returnValue;\n            };\n    \n            _self.setNavigator(newNavigator, true);\n            setBypassLazyCache(true);\n            _self._beaconHooked = true;\n        }\n\n        return calls;\n    }\n\n    protected hookFetch<T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): IFetchRequest[] {\n        let calls: IFetchRequest[] = [];\n        let global = getGlobal() as any;\n\n        if (!this._orgFetch) {\n            // Save Previous fetch so we can restore it\n            this._orgFetch = global.fetch;\n        }\n\n        global.fetch = function(input: RequestInfo, init?: RequestInit) {\n            calls.push({\n                input,\n                init\n            });\n\n            return createSyncPromise(executor);\n        }\n    \n        return calls;\n    }\n\n    protected setNavigator(newNavigator: any, mergeWithExisting: boolean) {\n        let navigator = getNavigator();\n\n        if (!this._orgNavigator) {\n            this._orgNavigator = navigator;\n        }\n\n        if (newNavigator != this._orgNavigator || newNavigator !== navigator) {\n            if (mergeWithExisting) {\n                try {\n                    // Just Blindly copy the properties over onto the new Navigator\n                    // tslint:disable-next-line: forin\n                    for (let name in navigator) {\n                        if (!newNavigator.hasOwnProperty(name)) {\n                            newNavigator[name] = navigator[name];\n                            if (!newNavigator.hasOwnProperty(name)) {\n                                // if it couldn't be set directly try and pretend\n                                AITestClass.orgObjectDefineProperty(newNavigator, name,\n                                    {\n                                        configurable: true,\n                                        get: function () {\n                                            return navigator[name];\n                                        }\n                                    });\n                            }\n                        }\n                    }\n                } catch (e) {\n                    QUnit.assert.ok(false, \"Creating navigator copy failed - \" + e);\n                    throw e;\n                }\n            }\n\n            try {\n                AITestClass.orgObjectDefineProperty(window, \"navigator\",\n                    {\n                        configurable: true,\n                        get: function () {\n                            return newNavigator || navigator;\n                        }\n                    });\n\n                setBypassLazyCache(true);\n            } catch (e) {\n                Assert.ok(false, \"Failed to set the navigator obejct\");\n            }\n        }\n    }\n\n    protected setLocalStorage(newLocalStorage: Storage | undefined | null) {\n        if (!this._orgLocalStorage) {\n            // Save the original local storage\n            this._orgLocalStorage = AITestClass.orgLocalStorage;\n        }\n\n        AITestClass.orgObjectDefineProperty(window, \"localStorage\",\n            {\n                configurable: true,\n                get: function() {\n                    return newLocalStorage;\n                }\n            });\n\n        setBypassLazyCache(true);\n    }\n\n    protected setCrypto(crypto: Crypto | null) {\n        AITestClass.orgObjectDefineProperty(window, \"crypto\",\n            {\n                configurable: true,\n                get () {\n                    return crypto;\n                }\n            });\n    }\n    \n    protected mockPerformance(newPerformance: any) {\n        \n        try {\n            if (!this._orgPerformance) {\n                this._hookPerformance();\n            }\n\n            // Copy over the mocked values\n            for (let name in newPerformance) {\n                if (newPerformance.hasOwnProperty(name)) {\n                    window.performance[name] = newPerformance[name];\n                }\n            }\n        } catch (e) {\n            console.log(\"Set performance failed - \" + e);\n            QUnit.assert.ok(true, \"Set performance failed - \" + e);\n            try {\n                stub(window, \"performance\").returns(newPerformance);\n            } catch (ex) {\n                console.log(\"Unable to fallback to stub performance failed - \" + e);\n                QUnit.assert.ok(true, \"Unable to fallback to stub performance failed - \" + e);\n            }\n        }\n    }\n\n    private _hookPerformance() {\n        if (!this._orgPerformance) {\n            this._orgPerformance = {};\n\n            try {\n                // Just Blindly copy the properties over\n                // tslint:disable-next-line: forin\n                for (let name in window.performance) {\n                    if (window.performance.hasOwnProperty(name)) {\n                        this._orgPerformance[name] = window.performance[name];\n                    }\n                }\n\n                getPerformance();\n            } catch (e) {\n                console.log(\"Saving performance values - \" + e);\n                QUnit.assert.ok(false, \"Saving performance values failed - \" + e);\n                // throw e;\n            }\n        }\n    }\n\n    private _restorePerformance() {\n        if (this._orgPerformance) {\n\n            try {\n                // Just Blindly copy the properties over\n                // tslint:disable-next-line: forin\n                for (let name in this._orgPerformance) {\n                    if (!this._orgPerformance.hasOwnProperty(name)) {\n                        window.performance[name] = this._orgPerformance[name];\n                    }\n                }\n\n            } catch (e) {\n                console.log(\"Restoring performance values - \" + e);\n                QUnit.assert.ok(false, \"Restoring performance values failed - \" + e);\n                // throw e;\n            }\n\n            this._orgPerformance = null;\n        }\n\n        getPerformance();\n    }\n\n\n    private _mockLocation() {\n        if (!this._orgLocation) {\n            this._orgLocation = window.location;\n            let newLocation = <any>{\n                // The fields that we want to be able to mock\n                href: this._orgLocation.href\n            };\n\n            try {\n                // Just Blindly copy the properties over\n                // tslint:disable-next-line: forin\n                for (let name in this._orgLocation) {\n                    if (!newLocation.hasOwnProperty(name)) {\n                        newLocation[name] = this._orgLocation[name];\n                        if (!newLocation.hasOwnProperty(name)) {\n                            // if it couldn't be set directly try and pretend\n                            AITestClass.orgObjectDefineProperty(newLocation, name,\n                                {\n                                    configurable: true,\n                                    get: function () {\n                                        return this._orgLocation[name];\n                                    }\n                                });\n                        }\n                    }\n                }\n            } catch (e) {\n                QUnit.assert.ok(false, \"Creating navigator copy failed - \" + e);\n                throw e;\n            }\n\n            this.setLocation(newLocation);\n        }\n    }\n\n    protected setLocationHref(href: string) {\n        this._mockLocation();\n        (window as any).__mockLocation.href = href;\n    }\n\n    protected setLocation(newLocation: Location | null) {\n        try {\n            if (newLocation) {\n                AITestClass.orgObjectDefineProperty(window, \"__mockLocation\",\n                    {\n                        configurable: true,\n                        enumerable: true,\n                        value: newLocation\n                    });\n            } else {\n                delete (window as any).__mockLocation;\n            }\n        } catch (e) {\n            QUnit.assert.ok(true, \"Set Location failed - \" + e);\n            stub(window, \"location\").returns(newLocation);\n        }\n    }\n\n    protected _getXhrRequests(url?: string): FakeXMLHttpRequest[] {\n        let requests: FakeXMLHttpRequest[] = [];\n\n        for (let lp = 0; lp < this._xhrRequests.length; lp++) {\n            let value = this._xhrRequests[lp];\n            if (value && value.url && (!url || value.url.indexOf(url) !== -1)) {\n                requests.push(value);\n            }\n        }\n\n        return requests;\n    }\n\n    protected _deleteAllCookies() {\n        var cookies = document.cookie.split(\";\");\n\n        for (var i = 0; i < cookies.length; i++) {\n            var cookie = cookies[i];\n            if (cookie) {\n                var eqPos = cookie.indexOf(\"=\");\n                var name = eqPos > -1 ? strSubstr(cookie, 0, eqPos) : cookie;\n                document.cookie = name + \"=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/\";\n            }\n        }\n    }\n\n    protected _clearSessionStorage() {\n        if (window.sessionStorage) {\n            window.sessionStorage.clear();\n        }\n    }\n\n    protected _clearLocalStorage() {\n        if (window.localStorage) {\n            window.localStorage.clear();\n        }\n    }\n\n    protected _disableDynProtoBaseFuncs(dynamicProtoInst: typeof dynamicProto = dynamicProto) {\n        let defOpts = dynamicProtoInst[\"_dfOpts\"];\n        if (defOpts) {\n            if (!this._dynProtoOpts) {\n                // Save the current settings so we can restore them\n                this._dynProtoOpts = {};\n                Object.keys(defOpts).forEach((key) => {\n                    this._dynProtoOpts[key] = defOpts[key];\n                });\n            }\n\n            defOpts.useBaseInst = false;\n            defOpts.strSetInstFuncs = false;\n        }\n    }\n\n    protected _assertEventsRemoved() {\n        this._assertNoEvents(window, \"window\");\n        this._assertNoEvents(document, \"document\");\n        if (document[\"body\"]) {\n            this._assertNoEvents(document[\"body\"], \"body\");\n        }\n\n        if (navigator) {\n            this._assertNoEvents(navigator, \"navigator\");\n        }\n\n        if (history) {\n            this._assertNoEvents(history, \"history\");\n        }\n    }\n\n    protected _assertHooksRemoved() {\n        this._assertRemoveHooks(history, \"history\");\n        this._assertRemoveHooks(XMLHttpRequest.prototype, \"XHR Prototype\");\n        this._assertRemoveHooks(XMLHttpRequest, \"XHR\");\n        this._assertRemoveHooks(window, \"window\");\n        this._assertRemoveFuncHooks(window.fetch, \"fetch\");\n        this._assertRemoveFuncHooks(window.onerror, \"window.onerror\");\n        this._assertRemoveFuncHooks(window.onunhandledrejection, \"window.onunhandledrejection\");\n    }\n\n    private _setNavProduct(product: string) {\n        // Hook Send beacon which also mocks navigator\n        if (!this._orgNavigator) {\n            this.hookSendBeacon(null);\n        }\n        let nav = getNavigator();\n\n        if (!this._navOrgProduct) {\n            // Save the original navigator product if we have not already\n            this._navOrgProduct = nav.product;\n        }\n\n        objDefineProp(nav, \"product\",\n            {\n                configurable: true,\n                get: function () {\n                    return product;\n                }\n            });\n\n        setBypassLazyCache(true);\n    }\n\n    /** Called when the test is starting. */\n    private _testStarting() {\n        let _self = this;\n        // Initialize the sandbox similar to what is done in sinon.js \"test()\" override. See note on class.\n        _self.sandbox = createSandbox(this.sandboxConfig);\n        // Clear out all cookies\n        _self._deleteAllCookies();\n        _self._clearSessionStorage();\n        _self._clearLocalStorage();\n\n        if (_self.isEmulatingIe) {\n            // Reset any previously cached values, which may have grabbed the mocked values\n            setBypassLazyCache(true);\n\n            // As we removed Object.define we need to temporarily restore this for each sandbox call\n            for (var field in _self.sandbox) {\n                var value = _self.sandbox[field];\n                if (typeof value === \"function\") {\n                    _self.sandbox[field] = (function(theValue) {\n                        return function() {\n                            var orgArguments = arguments;\n                            let saveObjectProps = {};\n                            // Save and restore the Object properties/functions\n                            if (_self._orgObjectFuncs) {\n                                for (var name in _self._orgObjectFuncs) {\n                                    if (_self._orgObjectFuncs.hasOwnProperty(name) && _self._orgObjectFuncs[name] !== undefined) {\n                                        saveObjectProps[name] = Object[name];\n                                        Object[name] = _self._orgObjectFuncs[name];\n                                    }\n                                }\n                            }\n\n                            // Call the original sandbox function\n                            let result = theValue.apply(this, orgArguments);\n\n                            // Restore the Object properties/functions\n                            _self._restoreObject(saveObjectProps);\n\n                            return result;\n                        }\n                    })(value);\n                }\n            }\n        }\n\n        this._orgCrypto = window.crypto;\n\n        // Allow the derived class to perform test initialization.\n        this.testInitialize();\n    }\n\n    private _testFinishedCleanup() {\n        let doneFuncs = this._onDoneFuncs;\n        this._onDoneFuncs = [];\n        if (doneFuncs) {\n            doneFuncs.forEach((fn) => {\n                try {\n                    fn();\n                } catch (e) {\n                    // Do nothing during cleanup\n                }\n            });\n        }\n\n        this.testFinishedCleanup();\n    }\n\n    /** Called when the test is completed. */\n    private _testCompleted(failed?: boolean) {\n        if (AITestClass._currentTestContext) {\n            // Tag the test context as finished so we don't try and call the testDone function again\n            AITestClass._currentTestContext.finished = true;\n            AITestClass._currentTestContext.failed = failed;\n        }\n\n        this._unhookXhr();\n        this._unhookFetch();\n\n        if (this.clock) {\n            this.clock.restore();\n            this.clock = null;\n        }\n\n        if (this._orgCrypto && window.crypto !== this._orgCrypto) {\n            this.setCrypto(this._orgCrypto);\n        }\n\n        if (this._orgLocation && window.location !== this._orgLocation) {\n            this.setLocation(null);\n            this._orgLocation = null;\n        }\n\n        if (this._orgNavigator) {\n            this.setNavigator(this._orgNavigator, false);\n            Assert.ok(this._orgNavigator === getNavigator(), \"Navigator should have been restored - \" + this._orgNavigator.userAgent + \"::\" + getNavigator().userAgent);\n            this._orgNavigator = null;\n        }\n\n        if (this._orgLocalStorage) {\n            this.setLocalStorage(this._orgLocalStorage);\n            this._orgLocalStorage = null;\n        }\n\n        this._restorePerformance();\n\n        this._beaconHooks = [];\n        this._beaconHooked = false;\n        this._cleanupAllHooks();\n        this._cleanupEvents();\n        this._restoreIE();\n\n        Assert.equal(false, isIE(), \"We should not be emulating IE anymore - \" + getNavigator().userAgent);\n\n        if (failed) {\n            // Just cleanup the sandbox since the test has already failed.\n            this.sandbox.restore();\n        } else {\n            // Verify the sandbox and restore.\n            (this.sandbox as any).verifyAndRestore();\n        }\n\n        this.sandbox = null;\n\n        this.testCleanup();\n\n        // Clear the instance of the currently running suite.\n        AITestClass.currentTestClass = null;\n        AITestClass.currentTestInfo = null;\n        AITestClass._currentTestContext = null;\n\n        AITestClass.orgSetTimeout = null;\n        AITestClass.orgClearTimeout = null;\n    }\n\n    private _assertRemoveFuncHooks(fn:any, targetName: string) {\n        let failed = false;\n\n        if (typeof fn === \"function\") {\n            let aiHook:any = fn[\"_aiHooks\"];\n\n            if (aiHook && aiHook.h) {\n                aiHook.h.forEach((hook: any) => {\n                    Assert.ok(false, targetName + \" Hook: \" + aiHook.n + \".\" + _formatNamespace(hook.cbks.ns || \"\") + \" exists\");\n                    failed = true;\n                });\n\n                if (!failed) {\n                    QUnit.assert.ok(true, \"Validated [\" + targetName + \"] has no registered hooks\");\n                } else {\n                    QUnit.assert.ok(false, \"Hooks: \" + JSON.stringify(aiHook.h));\n                }\n            }\n        }\n    }\n\n    private _assertRemoveHooks(target:any, targetName: string) {\n        if (target) {\n            Object.keys(target).forEach(name => {\n                try {\n                    this._assertRemoveFuncHooks(target[name], targetName + \".\" + name);\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            });\n        }\n    }\n\n    private _removeFuncHooks(fn:any) {\n        if (typeof fn === \"function\") {\n            let aiHook:any = fn[\"_aiHooks\"];\n\n            if (aiHook && aiHook.h) {\n                aiHook.h = [];\n            }\n        }\n    }\n\n    private _removeHooks(target:any) {\n        if (target) {\n            Object.keys(target).forEach(name => {\n                try {\n                    this._removeFuncHooks(target[name]);\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            });\n        }\n    }\n\n    private _cleanupAllHooks() {\n        this._removeHooks(history);\n        this._removeHooks(XMLHttpRequest.prototype);\n        this._removeHooks(XMLHttpRequest);\n        this._removeHooks(window);\n        this._removeFuncHooks(window.fetch);\n        this._removeFuncHooks(window.onerror);\n        this._removeFuncHooks(window.onunhandledrejection);\n    }\n\n    private _restoreObject(objectProps: any) {\n        if (objectProps) {\n            // Restore the Object properties/functions\n            for (var name in objectProps) {\n                if (objectProps.hasOwnProperty(name) && objectProps[name] !== undefined) {\n                    Object[name] = objectProps[name];\n                }\n            }\n        }\n    }\n\n    private _restoreIE() {\n        // We need to clear any lazy cached global values\n        setBypassLazyCache(true);\n\n        this._restoreObject(this._orgObjectFuncs);\n        this._orgObjectFuncs = null;\n\n        this._unhookFetch();\n\n        if (this._orgSymbol) {\n            let global = window as any;\n            global[\"Symbol\"] = this._orgSymbol;\n            this._orgSymbol = null;\n        }\n    }\n\n    private _emulateIE() {\n        const objectNames = [ \"assign\" ];\n        if (!this._orgObjectFuncs) {\n            this._orgObjectFuncs = {};\n            for (var lp = 0; lp < objectNames.length; lp++) {\n                let name = objectNames[lp];\n                this._orgObjectFuncs[name] = Object[name];\n                Object[name] = null;\n            }\n        }\n\n        // clear any lazy cached global values\n        setBypassLazyCache(true);\n\n        let global = getGlobal() as any;\n        if (!this._orgFetch) {\n            this._orgFetch = global.fetch;\n            global.fetch = null;\n        }\n\n        // Hook Send beacon which also mocks navigator\n        if (!this._orgNavigator) {\n            this.hookSendBeacon(null);\n        }\n\n        // Remove beacon support\n        global.sendBeacon = null;\n\n        // Lets pretend to also be IE9\n        this.setUserAgent(\"Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)\");\n\n        if (!this._orgSymbol) {\n            this._orgSymbol = global[\"Symbol\"];\n            global[\"Symbol\"] = undefined;\n        }\n    }\n\n    private _unhookXhr() {\n        if (this._xhr) {\n            if (this._xhrOrgSend) {\n                this._xhr.prototype.send = this._xhrOrgSend;\n                this._xhrOrgSend = null;\n            }\n\n            this._xhr.restore();\n            this._xhr = null;\n        }\n    }\n\n    private _hookXhr() {\n        let _self = this;\n        if (!_self._xhr) {\n            // useFake Server is being re-enabled while we are running a test so we need to re-fake it\n            _self._xhr = useFakeXMLHttpRequest();\n            _self._xhrRequests = [];\n            _self._xhr.onCreate = (xhr: FakeXMLHttpRequest) => {\n                _self._xhrRequests.push(xhr);\n            }\n\n            _self._xhrOrgSend = _self._xhr.prototype.send;\n            _self._xhr.prototype.send = function() {\n                let xhr = this;\n                let theArguments = arguments;\n                let autoRespond = _self.fakeServerAutoRespond;\n                if (AITestClass.currentTestInfo && AITestClass.currentTestInfo.fakeServerAutoRespond !== undefined) {\n                    autoRespond = AITestClass.currentTestInfo.fakeServerAutoRespond;\n                }\n\n                if (autoRespond && xhr && xhr.url && xhr.method) {\n                    AITestClass.orgSetTimeout && AITestClass.orgSetTimeout(() => {\n                        if (AITestClass.currentTestInfo && xhr && _self._xhrRequests && _self._xhrRequests.indexOf(xhr) !== -1) {\n                            var theResponse: any;\n                            if (xhr.url.endsWith(\"/v2/track\")) {\n                                theResponse = {\n                                    itemsReceived: 1,\n                                    itemsAccepted: 1,\n                                    errors: [],\n                                    appId: \"00000000-0000-0000-0000-000000000000\"\n                                };\n                            }\n                            xhr.respond(200, {}, (theResponse && JSON.stringify(theResponse)) || \"\");\n                        }\n                    }, 5);\n                }\n\n                if (_self._xhrOrgSend) {\n                    _self._xhrOrgSend.apply(xhr, theArguments);\n                }\n            }\n        }\n    }\n\n    private _hookFetch() {\n        let _self = this;\n        if (!this._orgFetch) {\n            let global = window as any;\n            this._orgFetch = global.fetch;\n            _self._fetchRequests = [];\n            global.fetch = function(input: RequestInfo, init?: RequestInit) {\n                let theFetch = this;\n                _self._fetchRequests.push({\n                    input,\n                    init\n                });\n\n                let theArguments = arguments;\n                let autoRespond = _self.fakeFetchAutoRespond;\n                if (AITestClass.currentTestInfo && AITestClass.currentTestInfo.fakeFetchAutoRespond !== undefined) {\n                    autoRespond = AITestClass.currentTestInfo.fakeFetchAutoRespond;\n                }\n\n                if (autoRespond) {\n                    return new Promise((resolve, reject) => {\n                        AITestClass.orgSetTimeout && AITestClass.orgSetTimeout(() => {\n                            if (AITestClass.currentTestInfo) {\n                                let theResponse = {\n                                    itemsReceived: 1,\n                                    itemsAccepted: 1,\n                                    errors: [] as any[],\n                                    appId: \"00000000-0000-0000-0000-000000000000\"\n                                };\n                                resolve(new Response(JSON.stringify(theResponse), {\n                                    headers: [],\n                                    status: 200,\n                                    statusText: \"Ok\"\n                                }));\n                            }\n                        }, 5);\n                    });\n                }\n                \n                return _self._orgFetch.apply(theFetch, theArguments);\n            };\n        }\n    }\n\n    private _unhookFetch() {\n        if (this._orgFetch) {\n            let global = window as any;\n            global.fetch = this._orgFetch;\n            this._orgFetch = null;\n        }\n    }\n    \n    private _assertNoEvents(target: any, targetName: string): void {\n        let failed = false;\n        _getAllAiDataKeys(target, (name, value) => {\n            if (value && name.startsWith(\"_aiDataEvents\")) {\n                let events = value.events;\n                if (events) {\n                    objForEachKey(events, (evtName, evts) => {\n                        if (evts) {\n                            for (let lp = 0; lp < evts.length; lp++) {\n                                let theEvent = evts[lp];\n                                if (theEvent) {\n                                    Assert.ok(false, \"[\" + targetName + \"] has registered event handler [\" + evtName + \".\" + (theEvent.evtName.ns || \"\") + \"]\");\n                                    failed = true;\n                                }\n                            }\n                        }\n                    });\n                }\n            }\n        });\n\n        if (!failed) {\n            QUnit.assert.ok(true, \"Validated [\" + targetName + \"] has no registered event handlers\");\n        }\n    }\n\n    private _removeAllEvents(target: any, targetName: string): any {\n        let dataName: string[] = [];\n        _getAllAiDataKeys(target, (name, value) => {\n            if (value && name.startsWith(\"_aiDataEvents\")) {\n                dataName.push(name);\n                let events = value.events;\n                if (events) {\n                    objForEachKey(events, (evtName, evts) => {\n                        if (evts) {\n                            for (let lp = 0; lp < evts.length; lp++) {\n                                let theEvent = evts[lp];\n                                if (theEvent) {\n                                    console && console.log(\"Removing [\" + targetName + \"] event handler \" + evtName + \".\" + (theEvent.evtName.ns || \"\"));\n                                    if (target.removeEventListener) {\n                                        target.removeEventListener(evtName, theEvent.handler, theEvent.capture);\n                                    }\n                                }\n                            }\n                        }\n                    });\n                }\n\n                delete value.events;\n            }\n        });\n\n        for (let lp = 0; lp < dataName.length; lp++) {\n            delete target[dataName[lp]];\n        }\n\n        return null;\n    }\n\n    private _cleanupEvents() {\n        this._removeAllEvents(window, \"window\");\n        this._removeAllEvents(document, \"document\");\n        if (document[\"body\"]) {\n            this._removeAllEvents(document[\"body\"], \"body\");\n        }\n\n        if (navigator) {\n            this._removeAllEvents(navigator, \"navigator\");\n        }\n\n        if (history) {\n            this._removeAllEvents(history, \"history\");\n        }\n    }\n}\n\n// Configure Sinon\nsinonAssert.fail = (msg?) => {\n    QUnit.assert.ok(false, msg);\n};\n\nsinonAssert.pass = (assertion) => {\n    QUnit.assert.ok(assertion, \"sinon assert\");\n};\n\n/**\n * Identifies whether the current environment appears to be IE\n */\nexport function isIE() {\n    let nav = getNavigator();\n    if (nav) {\n        let userAgent = (nav.userAgent || \"\").toLowerCase();\n        return strContains(userAgent, \"msie\") || strContains(userAgent, \"trident/\");\n    }\n\n    return false;\n}\n\n// sinon.config = {\n//     injectIntoThis: true,\n//     injectInto: null,\n//     properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"sandbox\"],\n//     useFakeTimers: true,\n//     useFakeServer: true\n// };\n"
  },
  {
    "path": "common/Tests/Framework/src/Assert.ts",
    "content": "/// <reference path=\"../../External/qunit.d.ts\" />\n\nimport { dumpObj } from \"@nevware21/ts-utils\";\nimport { expectedToString, stateToString } from \"./DebugHelpers\";\n\n/**\n * Wrapper around QUnit asserts. This class has two purposes:\n * - Make Assertion methods easy to discover.\n * - Make them consistent with XUnit assertions in the order of the actual and expected parameter values.\n */\nexport class Assert {\n    /**\n    * A deep recursive comparison assertion, working on primitive types, arrays, objects,\n    * regular expressions, dates and functions.\n    *\n    * The deepEqual() assertion can be used just like equal() when comparing the value of\n    * objects, such that { key: value } is equal to { key: value }. For non-scalar values,\n    * identity will be disregarded by deepEqual.\n    *\n    * @param expected - Known comparison value\n    * @param actual - Object or Expression being tested\n    * @param message - A short description of the assertion\n    */\n    public static deepEqual(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.deepEqual(actual, expected, message || expectedToString(expected));\n    }\n\n    /**\n    * A non-strict comparison assertion, roughly equivalent to JUnit assertEquals.\n    *\n    * The equal assertion uses the simple comparison operator (==) to compare the actual\n    * and expected arguments. When they are equal, the assertion passes: any; otherwise, it fails.\n    * When it fails, both actual and expected values are displayed in the test result,\n    * in addition to a given message.\n    *\n    * @param expected - Known comparison value\n    * @param actual - Expression being tested\n    * @param message - A short description of the assertion\n    */\n    public static equal(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.equal(actual, expected, message || expectedToString(expected));\n    }\n\n    /**\n    * An inverted deep recursive comparison assertion, working on primitive types,\n    * arrays, objects, regular expressions, dates and functions.\n    *\n    * The notDeepEqual() assertion can be used just like equal() when comparing the\n    * value of objects, such that { key: value } is equal to { key: value }. For non-scalar\n    * values, identity will be disregarded by notDeepEqual.\n    *\n    * @param expected - Known comparison value\n    * @param actual - Object or Expression being tested\n    * @param message - A short description of the assertion\n    */\n    public static notDeepEqual(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.notDeepEqual(actual, expected, message || expectedToString(expected));\n    }\n\n    /**\n    * A non-strict comparison assertion, checking for inequality.\n    *\n    * The notEqual assertion uses the simple inverted comparison operator (!=) to compare\n    * the actual and expected arguments. When they aren't equal, the assertion passes: any;\n    * otherwise, it fails. When it fails, both actual and expected values are displayed\n    * in the test result, in addition to a given message.\n    *\n    * @param expected - Known comparison value\n    * @param actual - Expression being tested\n    * @param message - A short description of the assertion\n    */\n    public static notEqual(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.notEqual(actual, expected, message || expectedToString(expected));\n    }\n\n    public static notPropEqual(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.notPropEqual(actual, expected, message || expectedToString(expected));\n    }\n\n    public static propEqual(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.propEqual(actual, expected, message || expectedToString(expected));\n    }\n\n    /**\n    * A non-strict comparison assertion, checking for inequality.\n    *\n    * The notStrictEqual assertion uses the strict inverted comparison operator (!==)\n    * to compare the actual and expected arguments. When they aren't equal, the assertion\n    * passes: any; otherwise, it fails. When it fails, both actual and expected values are\n    * displayed in the test result, in addition to a given message.\n    *\n    * @param expected - Known comparison value\n    * @param actual - Expression being tested\n    * @param message - A short description of the assertion\n    */\n    public static notStrictEqual(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.notStrictEqual(actual, expected, message || expectedToString(expected));\n    }\n\n    /**\n    * A boolean assertion, equivalent to CommonJS's assert.ok() and JUnit's assertTrue().\n    * Passes if the first argument is truthy.\n    *\n    * The most basic assertion in QUnit, ok() requires just one argument. If the argument\n    * evaluates to true, the assertion passes; otherwise, it fails. If a second message\n    * argument is provided, it will be displayed in place of the result.\n    *\n    * @param state - Expression being tested\n    * @param message - A short description of the assertion\n    */\n    public static ok(state: any, message?: string): any {\n        return QUnit.assert.ok(state, message || stateToString(state));\n    }\n\n    /**\n    * A strict type and value comparison assertion.\n    *\n    * The strictEqual() assertion provides the most rigid comparison of type and value with\n    * the strict equality operator (===)\n    *\n    * @param expected - Known comparison value\n    * @param actual - Expression being tested\n    * @param message - A short description of the assertion\n    */\n    public static strictEqual(expected: any, actual: any, message?: string): any {\n        return QUnit.assert.strictEqual(actual, expected, message || expectedToString(expected));\n    }\n\n    /**\n    * Assertion to test if a callback throws an exception when run.\n    *\n    * When testing code that is expected to throw an exception based on a specific set of\n    * circumstances, use throws() to catch the error object for testing and comparison.\n    *\n    * @param block - Function to execute\n    * @param expected - Error Object to compare\n    * @param message - A short description of the assertion\n    */\n    public static throws(block: () => any, expected: any, message?: string): any;\n\n    /**\n    * @param block - Function to execute\n    * @param message - A short description of the assertion\n    */\n    public static throws(block: () => any, message?: string): any;\n\n    public static throws(block: () => any, expected?: any, message?: string): any {\n        return QUnit.assert.throws(block, expected, message || expectedToString(expected));\n    }\n\n\n    public static doesNotThrow(block: () => any, message?: string): any {\n        try {\n            return block();\n        } catch (e) {\n            return Assert.fail((message || \"Expected no exception, but got\") + \": \" + dumpObj(e));\n        }\n    }\n    \n    /**\n     * Fails a test with the given message.\n     *\n     * @param message - Message to display for the failure\n     */\n    public static fail(message?: string): any {\n        return QUnit.assert.ok(false, message || \"Test failed\");\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/DebugHelpers.ts",
    "content": "\n\nexport function _toString(value: any, isRecursive: boolean = false): string {\n    if (value === undefined) {\n        return \"<undefined>\";\n    }\n\n    if (value === null) {\n        return \"<null>\";\n    }\n\n    try {\n        if (typeof value !== \"string\") {\n            const objectTypeDump: string = Object.prototype.toString.call(value);\n            let propertyValueDump: string = \"\";\n            if (objectTypeDump === \"[object Error]\") {\n                propertyValueDump = \"{ stack: '\" + value.stack + \"', message: '\" + value.message + \"', name: '\" + value.name + \"'\";\n            } else {\n                propertyValueDump = JSON.stringify(value);\n            }\n        \n            return objectTypeDump + propertyValueDump;\n        }\n    } catch (e) {\n        return \"!!!Unable to convert to a string!!! - \" + (!isRecursive ? _toString(e, true) : \"%$#%&*@\");\n    }\n\n    return value || \"\";\n}\n\nexport function expectedToString(value: any) {\n    return \"Expected: [\" + _toString(value) + \"]\";\n}\n\nexport function stateToString(value: any) {\n    return \"State: [\" + _toString(value) + \"]\";\n}"
  },
  {
    "path": "common/Tests/Framework/src/PollingAssert.ts",
    "content": "import { Assert } from \"./Assert\";\nimport { AITestClass } from \"./AITestClass\";\nimport { ITestContext } from \"./interfaces/ITestContext\";\nimport { scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { createNativePromise, doAwaitResponse, IPromise } from \"@nevware21/ts-async\";\n\nexport class PollingAssert {\n    /**\n    * Starts polling assertion function for a period of time after which it's considered failed.\n    * @param assertionFunctionReturnsBoolean - funciton returning true if condition passes and false if condition fails. Assertion will be done on this function's result.\n    * @param assertDescription - message shown with the assertion\n    * @param timeoutSeconds - timeout in seconds after which assertion fails\n    * @param pollIntervalMs - polling interval in milliseconds\n    * @returns {(nextTestStep) =&gt; void} callback which will be invoked by the AITestClass\n    */\n    public static createPollingAssert(assertionFunctionReturnsBoolean: (testContext?: ITestContext) => boolean, assertDescription: string, timeoutSeconds: number = 30, pollIntervalMs: number = 100): (testContext: ITestContext, nextTestStep: () => void) => void {\n        const pollingAssert = (testContext: ITestContext, nextTestStep: () => void) => {\n            doAwaitResponse(PollingAssert.asyncTaskPollingAssert(assertionFunctionReturnsBoolean, assertDescription, timeoutSeconds, pollIntervalMs)(testContext), (resp) => {\n                if (resp.rejected) {\n                    // If the promise was rejected, then we need to call the next test step with the error\n                    // and we can also log the error message to the console\n                    Assert.ok(false, \"Polling assert failed: \" + resp.reason + \" - \" + assertDescription + \"[\" + (AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<null>\") + \"]\");\n                }\n\n                nextTestStep();\n            });\n        }\n\n        (pollingAssert as any)[AITestClass.isPollingStepFlag] = true;\n\n        return pollingAssert;\n    }\n\n    /**\n    * Starts polling assertion function for a period of time after which it's considered failed, this is a promise based version\n    * of the polling assert, which will resolve once the polling has successfully completed or rejected if the polling fails.\n    * @param pollContext - context to use for the polling, this is typically the test context\n    * @param assertionFunctionReturnsBoolean - funciton returning true if condition passes and false if condition fails. Assertion will be done on this function's result.\n    * @param assertDescription - message shown with the assertion\n    * @param timeoutSeconds - timeout in seconds after which assertion fails\n    * @param pollIntervalMs - polling interval in milliseconds\n    * @param incRetry - if true, then the retry count will be incremented for each failed attempt\n    * @returns IPromise<void> which will resolve once the polling has successfully completed\n    */\n    public static asyncTaskPollingAssert(assertionFunctionReturnsBoolean: (testContext?: ITestContext) => boolean, assertDescription: string, timeoutSeconds: number = 30, pollIntervalMs: number = 0): (pollContext?: ITestContext) => IPromise<void> {\n\n        return (pollContext: ITestContext) => {\n            let retryCnt = 0;\n            function _next(polling: () => void, pollIntervalMs: number) {\n                scheduleTimeout(polling, pollIntervalMs || pollContext.pollDelay || 100);\n\n                if (pollContext && pollContext.clock) {\n                    // Using fake timers, so push the fake time forward in the next execution cycle\n                    AITestClass.orgSetTimeout(() => {\n                        pollContext.clock.tick(pollIntervalMs);\n                    }, 0);\n                }\n            }\n\n            if (pollContext && pollContext.finished) {\n                // Test has already completed, so we can just return so we don't try to do any more polling\n                return;\n            }\n\n            return createNativePromise<void>((resolve, reject) => {\n                const timeout = new Date(new Date().getTime() + timeoutSeconds * 1000);\n                const polling = () => {\n                    if (pollContext && pollContext.finished) {\n                        // Test has already completed, so we can just return so we don't try to do any more polling\n                        reject();\n                        return;\n                    }\n\n                    if (retryCnt > 0) {\n                        Assert.ok(true, \" -- Retry Attempt #\" + retryCnt + \" [\" + assertDescription + \"] - \" + pollContext.name);\n                    }\n\n                    try {\n                        if (assertionFunctionReturnsBoolean.call(this, pollContext)) {\n                            Assert.ok(true, assertDescription + \" [\" + (AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<null>\") + \"]\");\n                            resolve();\n                            return;\n                        }\n                        \n                        if (timeout < new Date()) {\n                            Assert.ok(false, \"check didn't succeed for \" + timeout + \" seconds: \" + assertDescription + \" [\" + (AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<null>\") + \"]\");\n                            reject();\n                            return;\n                        }\n\n                        Assert.ok(true, \" -- Check didn't succeed: \" + assertDescription + \" [\" + (AITestClass.currentTestInfo ? AITestClass.currentTestInfo.name : \"<null>\") + \"]\");\n                        retryCnt++;\n                    } catch (e) {\n                        Assert.ok(true, \"Polling exception - \" + e);\n                        retryCnt++;\n                    }\n\n                    _next(polling, pollIntervalMs);\n                };\n\n                _next(polling, pollIntervalMs);\n            });\n        };\n    }\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/StepResult.ts",
    "content": "export const enum StepResult {\n    Abort = -1,\n    Complete = 0,\n    Repeat = 90,\n    Retry = 99\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/CommonValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\n\nexport class CommonValidator implements ITypeValidator {\n\n    static CommonValidator = new CommonValidator();\n\n    public Validate(item: any, _baseType: string): boolean {\n        // verify item has data, iKey, name, tags, and time fields\n        if (!item.data || !item.iKey || !item.name || !item.tags || !item.time) {\n            return false;\n        }\n\n        if (item.data.baseData.ver !== 2) {\n            return false;\n        }\n\n        // verify item.data has baseType field\n        if (!item.data.baseType) {\n            return false;\n        }\n\n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/EventValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\nimport { CommonValidator } from \"./CommonValidator\";\n\nexport class EventValidator implements ITypeValidator {\n\n    static EventValidator = new EventValidator();\n\n    public Validate(item: any, baseType: string): boolean {\n        // verify item passes CommonValidator\n        if (!CommonValidator.CommonValidator.Validate(item, baseType)) {\n            return false;\n        }\n\n        // verify item has ver, name, properties, and measurement fields\n        if (!item.data.baseData ||\n            !item.data.baseData.ver ||\n            !item.data.baseData.name ||\n            !item.data.baseData.properties ||\n            !item.data.baseData.measurements) {\n            return false;\n        }\n\n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/ExceptionValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\nimport { CommonValidator } from \"./CommonValidator\";\n\nexport class ExceptionValidator implements ITypeValidator {\n    static ExceptionValidator = new ExceptionValidator();\n\n    private static _validateExceptions(exceptions: any[]): boolean {\n        // verify exceptions has typeName, message, hasFullStack, stack, parsedStack fields\n        if (!(\"typeName\" in exceptions[0]) ||\n            !(\"message\" in exceptions[0]) ||\n            !(\"hasFullStack\" in exceptions[0]) ||\n            !(\"stack\" in exceptions[0]) ||\n            !(\"parsedStack\" in exceptions[0])) {\n            return false;\n        }\n        \n        return true;\n    }\n\n    Validate(item: any, baseType: string): boolean {\n        // verify item passes CommonValidator\n        if (!CommonValidator.CommonValidator.Validate(item, baseType)) {\n            console.log(\"ExceptionValidator::Validate failed - \" + JSON.stringify(item));\n            return false;\n        }\n\n        // verify item has ver and exceptions fields\n        if (!item.data.baseData ||\n            !item.data.baseData.ver ||\n            !item.data.baseData.exceptions) {\n            console.log(\"ExceptionValidator::Validate missing basedata values - \" + JSON.stringify(item.data));\n            return false;\n        }\n\n        // Exception.ver should be a number for breeze channel, but a string in CS4.0\n        if (item.data.baseData.ver !== 2) {\n            console.log(\"ExceptionValidator::Validate not breeze - \" + JSON.stringify(item.data.baseData));\n            return false; // not a valid breeze exception\n        }\n\n        if (!ExceptionValidator._validateExceptions(item.data.baseData.exceptions)) {\n            console.log(\"ExceptionValidator::_validateExceptions failed - \" + JSON.stringify(item.data.baseData.exceptions));\n            return false;\n        }\n\n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/ITypeValidator.ts",
    "content": "export interface ITypeValidator {\n    Validate(item: any, baseType?: string): boolean;\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/MetricValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\nimport { CommonValidator } from \"./CommonValidator\";\n\nexport class MetricValidator implements ITypeValidator {\n    static MetricValidator = new MetricValidator();\n\n    Validate(item: any, baseType: string): boolean {\n        // verify item passes CommonValidator\n        if (!CommonValidator.CommonValidator.Validate(item, baseType)) {\n            return false;\n        }\n\n        // verify item has ver, metrics, and properties fields\n        if (!item.data.baseData ||\n            !item.data.baseData.ver ||\n            !item.data.baseData.metrics ||\n            !item.data.baseData.properties) {\n            return false;\n        }\n\n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/PageViewPerformanceValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\nimport { CommonValidator } from \"./CommonValidator\";\n\nexport class PageViewPerformanceValidator implements ITypeValidator {\n    static PageViewPerformanceValidator = new PageViewPerformanceValidator();\n\n    public Validate(item: any, baseType: string): boolean {\n        // verify item passes CommonValidator\n        if (!CommonValidator.CommonValidator.Validate(item, baseType)) {\n            return false;\n        }\n\n        // verify item has ver, url, perfTotal, name, duration, networkConnect, sentRequest, receivedResponse, and domProcessing fields\n        if (!item.data.baseData ||\n            !item.data.baseData.ver ||\n            !item.data.baseData.url ||\n            !item.data.baseData.perfTotal ||\n            !item.data.baseData.name ||\n            !item.data.baseData.duration ||\n            !item.data.baseData.networkConnect ||\n            !item.data.baseData.sentRequest ||\n            !item.data.baseData.receivedResponse ||\n            !item.data.baseData.domProcessing) {\n            return false;\n        }\n\n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/PageViewValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\nimport { CommonValidator } from \"./CommonValidator\";\n\nexport class PageViewValidator implements ITypeValidator {\n    static PageViewValidator = new PageViewValidator();\n\n    public Validate(item: any, baseType: string): boolean {\n        // verify item passes CommonValidator\n        if (!CommonValidator.CommonValidator.Validate(item, baseType)) {\n            return false;\n        }\n\n        // verify item has ver, url, name, duration, id, properties, and measurements fields\n        if (!item.data.baseData ||\n            !item.data.baseData.ver ||\n            !item.data.baseData.url ||\n            !item.data.baseData.name ||\n            !item.data.baseData.duration ||\n            !item.data.baseData.id ||\n            !item.data.baseData.properties ||\n            !item.data.baseData.measurements) {\n            return false;\n        }\n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/RemoteDepdencyValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\nimport { CommonValidator } from \"./CommonValidator\";\n\nexport class RemoteDepdencyValidator implements ITypeValidator {\n    static RemoteDepdencyValidator = new RemoteDepdencyValidator();\n\n    public Validate(item: any, baseType: string): boolean {\n        // verify item passes CommonValidator\n        if (!CommonValidator.CommonValidator.Validate(item, baseType)) {\n            return false;\n        }\n\n        // verify item has ver, name, id, resultCode, duration, data, target, type, properties, and measurement fields\n        if (!item.data.baseData ||\n            !item.data.baseData.ver ||\n            !item.data.baseData.name ||\n            !item.data.baseData.id ||\n            !item.data.baseData.resultCode ||\n            !item.data.baseData.duration ||\n            !item.data.baseData.data ||\n            !item.data.baseData.target ||\n            !item.data.baseData.type ||\n            !item.data.baseData.properties ||\n            !item.data.baseData.measurements) {\n            return false;\n        }\n        \n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TelemetryValidation/TraceValidator.ts",
    "content": "import { ITypeValidator } from \"./ITypeValidator\";\nimport { CommonValidator } from \"./CommonValidator\";\n\nexport class TraceValidator implements ITypeValidator {\n    static TraceValidator = new TraceValidator();\n\n    public Validate(item: any, baseType: string): boolean {\n        // verify item passes CommonValidator\n        if (!CommonValidator.CommonValidator.Validate(item, baseType)) {\n            return false;\n        }\n\n        // verify item has ver, message, and properties fields\n        if (!item.data.baseData ||\n            !item.data.baseData.ver ||\n            !item.data.baseData.message ||\n            !item.data.baseData.properties) {\n            return false;\n        }\n        return true;\n    }\n}"
  },
  {
    "path": "common/Tests/Framework/src/TestHelper.ts",
    "content": "export class TestHelper {\n    private static _idCount = 0;\n\n    static reset(key: string) {\n        this._idCount = 0;\n        localStorage.removeItem(key);\n    }\n\n    static mockEvent(persistence: number): any {\n        this._idCount++;\n        return {\n            name: \"test_event-\" + this._idCount.toString(),\n            baseType: \"custom\",\n            time: \"\",\n            persistence: persistence,\n            data: {\n                \"key\": \"value\",\n                empty: [],\n                value1: [1],\n                value2: [\"Hello\"],\n                value3: [[\"Hello\"]],\n                value4: true,\n                value5: 42,\n                value6: {\n                    more: {\n                        data: \"X\"\n                    }\n                },\n                evValue1: {\n                    value: \"event Property\"\n                },\n                evValue2: {\n                    value: \"event Property2\",\n                    kind: 32 /* CustomerContent_GenericContent */,\n                    propertyType: 1 /* String */\n                }\n            }\n        };\n    }\n\n    static mockEvent2(persistence: number): any {\n        this._idCount++;\n        return {\n            name: \"test_event-\" + this._idCount.toString(),\n            time:\" 1970-01-01T00:00:00.000Z\",\n            ver: \"4.0\",\n            iKey: \"o:12345-12345\",\n            ext: {\n                sdk: {\n                    ver: \"Hello version 1.0\",\n                    seq: 1,\n                    epoch: \"0\",\n                    installId: \"TestDeviceId\"\n                },\n                app: { sesId: \"####\" },\n                user: { locale: \"en-US\" },\n                web: { domain: \"localhost:9001\" },\n                intweb: { },\n                utc: { popSample: 100 },\n                loc: { tz: \"-08:00\" },\n                metadata: {\n                    f: {\n                        value1: { a: { t: 6 } },\n                        value5: { t: 6 },\n                        evValue2: { t: 8193 }\n                    }\n                }\n            },\n            baseData: {\n                properties: {\n                    version: \"##currentPluginVersions##\"\n                }\n            },\n            data: {\n                baseType: \"testEventBaseType\",\n                value1: [1],\n                value2: [\"Hello\"],\n                value3: [[\"Hello\"]],\n                value4: true,\n                value5: 42,\n                value6: {\n                    more: {\n                        data: \"X\"\n                    }\n                },\n                evValue1: \"event Property\",\n                evValue2: \"event Property2\"\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/ai-test-framework.ts",
    "content": "export { Assert } from \"./Assert\";\nexport { IBeaconRequest } from \"./interfaces/IBeaconRequest\";\nexport { IFakeXMLHttpRequest } from \"./interfaces/FakeXMLHttpRequest\";\nexport { IFetchRequest } from \"./interfaces/IFetchRequest\";\nexport { ITestCase } from \"./interfaces/ITestCase\";\nexport { ITestCaseAsync } from \"./interfaces/ITestCaseAsync\";\nexport { ITestContext } from \"./interfaces/ITestContext\";\n\nexport { PollingAssert } from \"./PollingAssert\";\nexport { StepResult } from \"./StepResult\";\nexport { TestHelper } from \"./TestHelper\";\nexport { AITestClass, FakeXMLHttpRequest, IFetchArgs } from \"./AITestClass\";\n\nexport { ITypeValidator } from \"./TelemetryValidation/ITypeValidator\";\nexport { CommonValidator } from \"./TelemetryValidation/CommonValidator\";\nexport { EventValidator } from \"./TelemetryValidation/EventValidator\";\nexport { ExceptionValidator } from \"./TelemetryValidation/ExceptionValidator\";\nexport { MetricValidator } from \"./TelemetryValidation/MetricValidator\";\nexport { PageViewPerformanceValidator } from \"./TelemetryValidation/PageViewPerformanceValidator\";\nexport { PageViewValidator } from \"./TelemetryValidation/PageViewValidator\";\nexport { RemoteDepdencyValidator } from \"./TelemetryValidation/RemoteDepdencyValidator\";\nexport { TraceValidator } from \"./TelemetryValidation/TraceValidator\";\n"
  },
  {
    "path": "common/Tests/Framework/src/interfaces/FakeXMLHttpRequest.ts",
    "content": "\nexport interface IFakeXMLHttpRequest extends XMLHttpRequest {\n    url?: string;\n    method?: string;\n    requestHeaders?: any;\n    async?: boolean;\n    respond: (status: number, headers: any, body: string) => void;\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/interfaces/IASyncQueue.ts",
    "content": "import { FinallyPromiseHandler, IPromise, RejectedPromiseHandler, ResolvedPromiseHandler } from \"@nevware21/ts-async\";\nimport { ITestContext } from \"./ITestContext\";\n\nexport type AITestQueueTask = (testContext?: ITestContext) => (PromiseLike<void>|void);\n\nexport interface IAsyncQueue {\n    add: (task: AITestQueueTask, taskName?: string, timeout?: number) => IAsyncQueue;\n    concat: (task: AITestQueueTask, taskName?: string, timeout?: number) => IAsyncQueue;\n    doAwait<T, TResult1 = T, TResult2 = never>(value: T | PromiseLike<T>,  resolveFn: ResolvedPromiseHandler<T, TResult1>, rejectFn?: RejectedPromiseHandler<TResult2>, finallyFn?: FinallyPromiseHandler): IAsyncQueue;\n    waitComplete: () => IPromise<void>;\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/interfaces/IBeaconRequest.ts",
    "content": "\nexport interface IBeaconRequest {\n    url: string;\n    data: string;\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/interfaces/IFetchRequest.ts",
    "content": "export interface IFetchRequest {\n    input: RequestInfo,\n    init: RequestInit\n}"
  },
  {
    "path": "common/Tests/Framework/src/interfaces/ITestCase.ts",
    "content": "import { IPromise } from \"@nevware21/ts-async\";\nimport { IAsyncQueue } from \"./IASyncQueue\";\n\n/** Defines a test case */\nexport interface ITestCase {\n    /** Name to use for the test case */\n    name: string;\n\n    fakeServerAutoRespond?: boolean;\n\n    useFakeServer?: boolean;\n\n    useFakeFetch?: boolean;\n    fakeFetchAutoRespond?: boolean;\n\n    useFakeTimers?: boolean;\n\n    /** Test case method */\n    test: () => void | PromiseLike<any> | IAsyncQueue;\n\n    /**\n     * Timeout in milliseconds for the test case to complete (defaults to 30000 milliseconds),\n     * this is the time that the test case is expected to complete in.\n     * If the test case does not complete within this time, then the test case will be failed.\n     * This value is ignored if the test case returns a promise and the skipTimeout flag is set to true.\n     * @default 30000\n     * @see skipTimeout\n     * @see ITestCaseAsync.timeout\n     * @see ITestCaseAsync.skipTimeout\n     * */\n    timeout?: number;\n\n    /** The polling asserts should use this as the real ms between attempts */\n    pollDelay?: number;\n\n    /** Used for debugging, set this value to ignore the automatic timeout for tests that return a promise */\n    skipTimeout? : boolean;\n\n    /**\n     * Automatically assert that all registered events have been removed\n     */\n    assertNoEvents?: boolean;\n\n    /**\n     * Automatically assert that all hooks have been removed\n     */\n    assertNoHooks?: boolean;\n    \n    orgSetTimeout?: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timeout;\n    orgClearTimeout?: (timeoutId: NodeJS.Timeout) => void;\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/interfaces/ITestCaseAsync.ts",
    "content": "import { StepResult } from \"../StepResult\";\nimport { ITestContext } from \"./ITestContext\";\n\n/**\n * Defines an asynchronous test case\n * @deprecated This interface is deprecated and will be removed in future versions. Use ITestCase instead\n * and use {@link AITestClass._asyncQueue} or return a Promise from the test case function instead of using\n * the steps array, this will allow for better performance and error handling, reporting and is automatically\n * detected by the\n * test framework as an asynchronous test case.\n * @see ITestCase\n * @see ITestContext\n */\nexport interface ITestCaseAsync {\n    /** Name to use for the test case */\n    name: string;\n\n    fakeServerAutoRespond?: boolean;\n\n    useFakeServer?: boolean;\n\n    useFakeFetch?: boolean;\n    fakeFetchAutoRespond?: boolean;\n\n    useFakeTimers?: boolean;\n\n    /** time to wait after pre before invoking post and calling start() */\n    stepDelay: number;\n\n    /** async steps */\n    steps: Array<(testContext?: ITestContext, pollingDoneCallback?: () => void) => StepResult|boolean|void>;\n\n    /**\n     * Terminate and fail the test if it runs longer than this\n     */\n    timeOut?: number;\n\n    /** Used for debugging, set this value to ignore the automatic timeout for tests that return a promise */\n    skipTimeout?: boolean;\n\n    /**\n     * Flag which specifies that once all of the steps are completed the test case is completed.\n     * True by default\n     */\n    autoComplete?: boolean;\n\n    /**\n     * Automatically assert that all registered events have been removed\n     */\n    assertNoEvents?: boolean;\n\n    /**\n     * Automatically assert that all hooks have been removed\n     */\n    assertNoHooks?: boolean;\n\n    orgSetTimeout?: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timeout;\n    orgClearTimeout?: (timeoutId: NodeJS.Timeout) => void;\n}\n"
  },
  {
    "path": "common/Tests/Framework/src/interfaces/ITestContext.ts",
    "content": "export interface ITestContext {\n    name: string;                       // Name of the test case\n    context: { [key: string]: any };\n    pollDelay?: number;                 // The ms between polling attempts\n    testDone: VoidFunction;             // Consider that the test is complete\n    clock: sinon.SinonFakeTimers;\n    finished: boolean;                  // Flag which indicates that the test has completed\n    failed?: boolean;                   // Flag which indicates that the test has failed\n}\n"
  },
  {
    "path": "common/Tests/Framework/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"noImplicitAny\": true,\n      \"module\": \"es6\",\n      \"moduleResolution\": \"node\",\n      \"target\": \"es5\",\n      \"forceConsistentCasingInFileNames\": true,\n      \"importHelpers\": true,\n      \"noEmitHelpers\": false,\n      \"skipLibCheck\": true,\n      \"alwaysStrict\": true,\n      \"declaration\": true,\n      \"declarationDir\": \"./types\",\n      \"outDir\": \"dist-es5\",\n      \"rootDir\": \"./src\",\n      \"suppressImplicitAnyIndexErrors\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"removeComments\": false\n    },\n    \"include\": [\n      \"./src/**/*.ts\"\n    ],\n    \"exclude\": [\n      \"node_modules/\"\n    ]\n  }\n  "
  },
  {
    "path": "common/Tests/Selenium/ExceptionHelper.js",
    "content": "\nfunction ExceptionHelper(config) {\n\n    let orgError = null;\n\n    function throwCorsException() {\n        throw \"Simulated Cors Exception\";\n    }\n\n    function throwPageException(value) {\n        function doThrow() {\n            throw value;\n        }\n\n        doThrow();\n    }\n\n    function throwStrictException(value) {\n        \"use strict\";\n        function doThrow() {\n            throw value;\n        }\n\n        doThrow();\n    }\n\n    function throwRuntimeException(timeoutFunc) {\n        function doThrow() {\n            var ug = \"Hello\";\n            // This should throw\n            ug();\n        }\n\n        if (!timeoutFunc) {\n            timeoutFunc = setTimeout;\n        }\n\n        timeoutFunc(function() {\n            doThrow();\n        }, 0);\n    }\n\n    function throwStrictRuntimeException(timeoutFunc) {\n        \"use strict\";\n        function doThrow() {\n            var ug = \"Hello\";\n            // This should throw\n            ug();\n        }\n\n        if (!timeoutFunc) {\n            timeoutFunc = setTimeout;\n        }\n\n        timeoutFunc(function() {\n            doThrow();\n        }, 0);\n    }\n    function saveOnError() {\n        if (!orgError) {\n            orgError = {\n                onerror: window.onerror\n            };\n        }\n    }\n\n    function restoreOnError() {\n        if (orgError && orgError.onerror) {\n            window.onerror = orgError.onerror;\n        }\n    }\n\n    function captureStrictPageOnError(appInsights) {\n        saveOnError();\n\n        \"use strict\";\n        function doCapture() {\n\n            // Ignoring any previous handler\n            window.onerror = function (message, url, lineNumber, columnNumber, error) {\n                appInsights._onerror({\n                    message,\n                    url,\n                    lineNumber,\n                    columnNumber,\n                    error: error,\n                    evt: window.event\n                });\n    \n                return true;\n            }\n        }\n\n        doCapture();\n    }\n\n    function capturePageOnError(appInsights) {\n        saveOnError();\n\n        function doCapture() {\n            // Ignoring any previous handler\n            window.onerror = function (message, url, lineNumber, columnNumber, error) {\n                appInsights._onerror({\n                    message,\n                    url,\n                    lineNumber,\n                    columnNumber,\n                    error: error,\n                    evt: window.event\n                });\n    \n                return true;\n            }\n        }\n\n        doCapture();\n    }\n\n    return {\n        capture: capturePageOnError,\n        captureStrict: captureStrictPageOnError,\n        restore: restoreOnError,\n        throw: throwPageException,\n        throwCors: throwCorsException,\n        throwStrict: throwStrictException,\n        throwRuntimeException: throwRuntimeException,\n        throwStrictRuntimeException: throwStrictRuntimeException\n    }\n}"
  },
  {
    "path": "common/Tests/Selenium/ModuleLoader.js",
    "content": "function getParameterByName(name, url) {\n    if (!url) url = window.location.href;\n    name = name.replace(/[\\[\\]]/g, '\\\\$&');\n    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n        results = regex.exec(url);\n    if (!results) return null;\n    if (!results[2]) return '';\n    return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n}\n\nfunction loadFetchModule(moduleLoader, name) {\n    // Load whatwg-fetch\n    moduleLoader.add(name || \"whatwg-fetch\").afterLoad = function (polyFetch) {\n        window.fetch = window.fetch || polyFetch.fetch;\n        window.Headers = window.Headers || polyFetch.Headers;\n        window.Response = window.Response || polyFetch.Response;\n        window.Request = window.Request || polyFetch.Request;\n        \n        var usePolyFetch = getParameterByName(\"polyFetch\");\n        if (usePolyFetch) {\n            window.fetch = polyFetch.fetch;\n            window.Headers = polyFetch.Headers;\n            window.Response = polyFetch.Response;\n            window.Request = polyFetch.Request;\n        }\n    };\n}\n\nfunction loadCommonModules(moduleLoader, onDone, includeShims) {\n\n    // Load and define the app insights test framework module\n    moduleLoader.add(\"@microsoft/ai-test-framework\");\n    if (includeShims !== false) {\n        moduleLoader.add(\"@microsoft/applicationinsights-shims\");\n    }\n\n    moduleLoader.addModuleDependencies(onDone);\n}\n\nfunction ModuleLoader(config) {\n\n    if (config) {\n        require.config(config);\n    }\n\n    var requiredModules = [];\n    var loadedModules = {};\n\n    function doModuleCb(moduleDef, theModule, cb) {\n        if (theModule) {\n            cb(theModule);\n        } else {\n            // Module was loaded, but has not yet created and instance -- so create one\n            console && console.log(\"Module [\" + moduleDef.name + \"] loaded - creating instance - \" + moduleDef.name);\n            require([moduleDef.name], function (theModule) {\n                cb(theModule);\n            });\n        }\n    }\n\n    function tryLoadModule(moduleDef, onSuccess, onFailure, prefix) {\n        if (loadedModules[moduleDef.name]) {\n            onSuccess();\n            return;\n        }\n\n        console.log(prefix + \"Module: \" + moduleDef.name);\n        prefix += \"  |  \";\n        prefix = prefix.replace(/\\+\\-\\-/g, \"|  \");\n        function reportLoadFailure(reason) {\n            console && console.error(prefix + \"Failed to load [\" + moduleDef.name + \"] from [\" + moduleDef.pkgPath + \"]\\n - Require ERROR: \" + reason.toString());\n            if (moduleDef.path.toLowerCase() !== moduleDef.path) {\n                console && console.log(prefix + \" ** Validate the path it may need to be all lowercase -- \" + moduleDef.path);\n            }\n\n            onFailure && onFailure(reason);\n        }\n\n        var baseUrl = config.baseUrl;\n        if ((moduleDef.name === moduleDef.path || moduleDef.isDependency) && !config.paths[moduleDef.name]) {\n            var modulePath = \"node_modules/\" + moduleDef.path;\n            doFetch(baseUrl + modulePath + \"/package.json\", function (theUrl, resp) {\n                resp.text().then(function (theText) {\n                    processPackageJson(moduleDef, modulePath, theText, onSuccess, reportLoadFailure, prefix);\n                }, function (reason) {\n                    reportLoadFailure(reason);\n                });\n            }, function (reason) {\n                if (moduleDef.pkgPath) {\n                    console.log(\"Trying - \" + moduleDef.pkgPath + \" [\" + modulePath + \"]\");\n                    modulePath = moduleDef.pkgPath + \"/\" + modulePath;\n                    doFetch(baseUrl + modulePath + \"/package.json\", function (theUrl, resp) {\n                        resp.text().then(function (theText) {\n                            processPackageJson(moduleDef, modulePath, theText, onSuccess, reportLoadFailure, prefix);\n                        }, reportLoadFailure);\n                    }, function (reason) {\n                        modulePath = moduleDef.pkgPath;\n                        var idx = modulePath.lastIndexOf(\"node_modules/\");\n                        if (idx !== -1) {\n                            modulePath = modulePath.substring(0, idx + 13);\n                        }\n    \n                        console.log(\"Trying2 - \" + moduleDef.pkgPath + \" [\" + modulePath + \"]\");\n                        modulePath = modulePath + moduleDef.path;\n                        doFetch(baseUrl + modulePath + \"/package.json\", function (theUrl, resp) {\n                            resp.text().then(function (theText) {\n                                processPackageJson(moduleDef, modulePath, theText, onSuccess, reportLoadFailure, prefix);\n                            }, reportLoadFailure);\n                        }, reportLoadFailure);\n                    });\n                } else {\n                    reportLoadFailure(reason);\n                }\n            });\n        } else {\n            doRequireModule(moduleDef, moduleDef.path, onSuccess, reportLoadFailure, prefix);\n        }\n    }\n\n    function processModules() {\n        if (requiredModules.length > 0) {\n            var moduleDef = requiredModules.shift();\n            if (moduleDef.prepare) {\n                moduleDef.prepare();\n            }\n\n            if (moduleDef.config) {\n                require.config(config);\n            }\n\n            tryLoadModule(moduleDef, processModules, processModules, \"\");\n        }\n    }\n\n    function doFetch(theUrl, onSuccess, onFailure) {\n        //console.log(\"doFetch(\" + theUrl + \")\");\n        var fileExt = /\\.\\w+/g.exec(theUrl)[0];\n        fetch(theUrl).then(function (resp) {\n            if (resp.ok) {\n                onSuccess(theUrl, resp);\n            } else {\n                if (fileExt === \".js\") {\n                    doFetch(theUrl + \".cjs\", onSuccess, onFailure);\n                } else if (fileExt === \".cjs\") {\n                    doFetch(theUrl + \".mjs\", onSuccess, onFailure);\n                } else {\n                    onFailure(resp.statusText);\n                }\n            }\n        }, function (reason) {\n            onFailure && onFailure(reason);\n        });\n    }\n\n    function loadPackageJson(packageJson) {\n        function removeTrailingComma(text) {\n            return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n        }\n\n        return JSON.parse(removeTrailingComma(packageJson));\n    }\n\n    function loadPackageDependencies(prefix, moduleDef, thePackage, onSuccess, onFailure) {\n        var theDependencies;\n        var depIdx = 0;\n\n        function _loadDependencies() {\n            if (theDependencies && depIdx < theDependencies.length) {\n                var dependency = theDependencies[depIdx++];\n                console.log(prefix + \" +-- Adding dependency \" + dependency + \" for \" + moduleDef.name);\n                tryLoadModule(createDependencyModule(dependency, moduleDef.pkgPath), _loadDependencies, _loadDependencies, prefix + \" |   +--\");\n            } else {\n                onSuccess && onSuccess();\n            }\n        }\n\n        if (thePackage && thePackage.dependencies) {\n            theDependencies = Object.keys(thePackage.dependencies);\n            _loadDependencies();\n        } else {\n            onSuccess && onSuccess();\n        }\n    }\n\n    function processPackageJson(moduleDef, thePath, packageJson, onSuccess, onFailure, prefix) {\n        \n        function reportLoadFailure(reason) {\n            console && console.error(prefix + \"Failed to load [\" + moduleDef.name + \"] from [\" + moduleDef.path + \"]\\n - Require ERROR: \" + String(reason));\n            if (moduleDef.path.toLowerCase() !== moduleDef.path) {\n                console && console.log(prefix + \" ** Validate the path it may need to be all lowercase -- \" + moduleDef.path);\n            }\n\n            onFailure && onFailure(reason);\n        }\n\n        function loadThisModule() {\n            //console.log(prefix + \"loadThisModule - \" + moduleDef.path);\n            doRequireModule(moduleDef, moduleDef.path, onSuccess, reportLoadFailure, prefix);\n        }\n\n        var thePackage = loadPackageJson(packageJson);\n\n        moduleDef.name = thePackage.name;\n        moduleDef.pkgPath = thePath;\n        moduleDef.path = (thePath + \"/\" + thePackage.main).replace(/\\.\\w*$/, \"\");\n\n        loadPackageDependencies(prefix, moduleDef, thePackage, loadThisModule, loadThisModule);\n    }\n\n    function doRequireModule(moduleDef, modulePath, onSuccess, onFailure, prefix) {\n        modulePath = modulePath || moduleDef.path;\n\n        console.info(prefix + \" +-Require - \" + moduleDef.name + \":\" + moduleDef.path);\n        require([moduleDef.path], function (theModule) {\n            try {\n                if (moduleDef.run) {\n                    doModuleCb(moduleDef, theModule, function(theModule) {\n                        console && console.log(prefix + \"    +--Running module: \" + moduleDef.name);\n                        moduleDef.run(theModule);\n                    });\n                } else {\n                    define(moduleDef.name, function() {\n                        if (moduleDef.asDefault || (theModule.name && !theModule.__esModule)) {\n                            console && console.log(prefix + \"    +--Returning default module: \" + moduleDef.name);\n\n                            if (moduleDef.asDefault === 2) {\n                                theModule.default = theModule.default || theModule;\n                                return theModule;\n                            }\n\n                            return {\n                                \"default\": theModule\n                            }\n                        }\n                        //console && console.log(prefix + \"    +--Returning module: \" + moduleDef.name);\n                        return theModule \n                    });\n\n                    if (moduleDef.afterLoad) {\n                        doModuleCb(moduleDef, theModule, function(theModule) {\n                            console && console.log(prefix + \"    +--Module After Load called: \" + moduleDef.name + \" from \" + moduleDef.path);\n                            moduleDef.afterLoad(theModule);\n                        });\n                    }\n\n                    loadedModules[moduleDef.name] = true;\n                    console && console.log(prefix + \"    +--Loaded: \" + moduleDef.name + \" from \" + moduleDef.path);\n                }\n            } catch(err) {\n                console && console.error(prefix + \"    +--Failed to load and initialize [\" + moduleDef.name + \"] from [\" + moduleDef.path + \"]\\n - Require ERROR: \" + err.toString());\n            }\n\n            onSuccess && onSuccess();\n        },\n        function (err) {\n            onFailure(err);\n        });\n    }\n\n    function addModuleDependencies(onDone) {\n        var moduleDef = {\n            name: \"\"\n        };\n        var baseUrl = config.baseUrl;\n        doFetch(baseUrl + \"/package.json\", function (theUrl, resp) {\n            resp.text().then(function (theText) {\n                var thePackage = loadPackageJson(theText);\n                if (thePackage) {\n                    moduleDef.name = thePackage.name;\n                    moduleDef.pkgPath = \"\";\n                    loadPackageDependencies(\"\", moduleDef, thePackage, onDone, onDone);\n                } else {\n                    onDone();\n                }\n            }, onDone);\n        }, onDone);\n    }\n\n    function addModule(name, path, asDefault) {\n        var moduleDef = {\n            name: name,\n            path: !path ? name : path,\n            asDefault: asDefault\n        }\n        \n        requiredModules.push(moduleDef);\n\n        return moduleDef;\n    }\n\n    function createDependencyModule(name, pkgPath) {\n        return {\n            name: name,\n            path: name,\n            pkgPath: pkgPath,\n            isDependency: true\n        }\n    }\n\n    return {\n        add: addModule,\n        addModuleDependencies: addModuleDependencies,\n        run: processModules\n    }\n}\n"
  },
  {
    "path": "common/changes/@microsoft/applicationinsights-web/markwolff-refactor_readme_2019-10-04-20-34.json",
    "content": "{\n  \"changes\": [\n    {\n      \"packageName\": \"@microsoft/applicationinsights-web\",\n      \"comment\": \"\",\n      \"type\": \"none\"\n    }\n  ],\n  \"packageName\": \"@microsoft/applicationinsights-web\",\n  \"email\": \"marwolff@microsoft.com\"\n}"
  },
  {
    "path": "common/config/rush/.npmrc",
    "content": "# Rush uses this file to configure the package registry, regardless of whether the\n# package manager is PNPM, NPM, or Yarn.  Prior to invoking the package manager,\n# Rush will always copy this file to the folder where installation is performed.\n# When NPM is the package manager, Rush works around NPM's processing of\n# undefined environment variables by deleting any lines that reference undefined\n# environment variables.\n#\n# DO NOT SPECIFY AUTHENTICATION CREDENTIALS IN THIS FILE.  It should only be used\n# to configure registry sources.\n\nregistry=https://registry.npmjs.org/\nalways-auth=false\n"
  },
  {
    "path": "common/config/rush/command-line.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json\",\n    \"commands\": [\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"test\",\n            \"summary\": \"Run all tests for all packages\",\n            \"description\": \"Runs tests for all projects\",\n            \"safeForSimultaneousRushProcesses\": false,\n            \"enableParallelism\": false,\n            \"ignoreMissingScript\": false,\n            \"allowWarningsInSuccessfulBuild\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"mintest\",\n            \"summary\": \"Run all tests for all packages using the ai-minify for the source\",\n            \"description\": \"Runs tests for all projects using the ai-minify for the source\",\n            \"safeForSimultaneousRushProcesses\": false,\n            \"enableParallelism\": false,\n            \"ignoreMissingScript\": true,\n            \"allowWarningsInSuccessfulBuild\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"perftest\",\n            \"summary\": \"Run all performance based tests for all packages\",\n            \"description\": \"Runs performance tests for all projects\",\n            \"safeForSimultaneousRushProcesses\": false,\n            \"enableParallelism\": false,\n            \"ignoreMissingScript\": true,\n            \"allowWarningsInSuccessfulBuild\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"lint\",\n            \"summary\": \"Run all tslint for all packages\",\n            \"description\": \"Runs tslint for all projects\",\n            \"safeForSimultaneousRushProcesses\": false,\n            \"enableParallelism\": true,\n            \"ignoreMissingScript\": false\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"summary\": \"Run all build for all packages\",\n            \"name\": \"build\",\n            \"allowWarningsInSuccessfulBuild\": true,\n            \"enableParallelism\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"summary\": \"Run all build for all packages\",\n            \"name\": \"rebuild\",\n            \"allowWarningsInSuccessfulBuild\": true,\n            \"enableParallelism\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"ai-min\",\n            \"summary\": \"Run all ai-minify tasks for all packages\",\n            \"description\": \"Runs ai-minify tasks for all projects\",\n            \"safeForSimultaneousRushProcesses\": false,\n            \"enableParallelism\": true,\n            \"ignoreMissingScript\": true,\n            \"allowWarningsInSuccessfulBuild\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"ai-restore\",\n            \"summary\": \"Run all restore tasks for all packages to unminify the files\",\n            \"description\": \"Runs all restore tasks for all projects to unminify the files\",\n            \"safeForSimultaneousRushProcesses\": false,\n            \"enableParallelism\": true,\n            \"ignoreMissingScript\": true,\n            \"allowWarningsInSuccessfulBuild\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"npm-pack\",\n            \"summary\": \"Run all npm_pack tasks to create the npm bundle\",\n            \"description\": \"Run all npm_pack tasks to create the npm bundle\",\n            \"safeForSimultaneousRushProcesses\": true,\n            \"enableParallelism\": true,\n            \"ignoreMissingScript\": true,\n            \"allowWarningsInSuccessfulBuild\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"clean\",\n            \"summary\": \"Run all clean tasks to clean each project\",\n            \"description\": \"Run all clean tasks to clean each project\",\n            \"safeForSimultaneousRushProcesses\": true,\n            \"enableParallelism\": true,\n            \"ignoreMissingScript\": true,\n            \"allowWarningsInSuccessfulBuild\": true\n        },\n        {\n            \"commandKind\": \"bulk\",\n            \"name\": \"api-docs\",\n            \"summary\": \"Run all api-docs tasks for each project\",\n            \"description\": \"Run all api-docs tasks for each project\",\n            \"safeForSimultaneousRushProcesses\": true,\n            \"enableParallelism\": true,\n            \"ignoreMissingScript\": true,\n            \"allowWarningsInSuccessfulBuild\": true\n        }\n    ]\n}"
  },
  {
    "path": "common/config/rush/common-versions.json",
    "content": "/**\n * This configuration file specifies NPM dependency version selections that affect all projects\n * in a Rush repo.  For full documentation, please see https://rushjs.io\n */\n{\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json\",\n\n  /**\n   * A table that specifies a \"preferred version\" for a dependency package. The \"preferred version\"\n   * is typically used to hold an indirect dependency back to a specific version, however generally\n   * it can be any SemVer range specifier (e.g. \"~1.2.3\"), and it will narrow any (compatible)\n   * SemVer range specifier.  See the Rush documentation for details about this feature.\n   */\n  \"preferredVersions\": {\n\n    /**\n     * When someone asks for \"^1.0.0\" make sure they get \"1.2.3\" when working in this repo,\n     * instead of the latest version.\n     */\n    // \"some-library\": \"1.2.3\"\n    \"glob\": \"7.2.3\",\n    \"form-data\": \"^2.5.5\"\n  },\n\n  /**\n   * The \"rush check\" command can be used to enforce that every project in the repo must specify\n   * the same SemVer range for a given dependency.  However, sometimes exceptions are needed.\n   * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be\n   * accepted by \"rush check\" for a given dependency.\n   *\n   * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE\n   * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO).\n   * This design avoids unnecessary churn in this file.\n   */\n   \"allowedAlternativeVersions\": {\n\n    /**\n     * For example, allow some projects to use an older TypeScript compiler\n     * (in addition to whatever \"usual\" version is being used by other projects in the repo):\n     */\n    \"typescript\": [\n      \"^3.9.2\"\n    ]\n  }\n}\n"
  },
  {
    "path": "common/config/rush/npm-shrinkwrap.json",
    "content": "{\n  \"name\": \"rush-common\",\n  \"version\": \"0.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"rush-common\",\n      \"version\": \"0.0.0\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@rush-temp/1ds-core-js\": \"file:./projects/1ds-core-js.tgz\",\n        \"@rush-temp/1ds-post-js\": \"file:./projects/1ds-post-js.tgz\",\n        \"@rush-temp/ai-test-framework\": \"file:./projects/ai-test-framework.tgz\",\n        \"@rush-temp/applicationinsights-analytics-js\": \"file:./projects/applicationinsights-analytics-js.tgz\",\n        \"@rush-temp/applicationinsights-cfgsync-js\": \"file:./projects/applicationinsights-cfgsync-js.tgz\",\n        \"@rush-temp/applicationinsights-channel-js\": \"file:./projects/applicationinsights-channel-js.tgz\",\n        \"@rush-temp/applicationinsights-chrome-debug-extension\": \"file:./projects/applicationinsights-chrome-debug-extension.tgz\",\n        \"@rush-temp/applicationinsights-clickanalytics-js\": \"file:./projects/applicationinsights-clickanalytics-js.tgz\",\n        \"@rush-temp/applicationinsights-common\": \"file:./projects/applicationinsights-common.tgz\",\n        \"@rush-temp/applicationinsights-core-js\": \"file:./projects/applicationinsights-core-js.tgz\",\n        \"@rush-temp/applicationinsights-debugplugin-js\": \"file:./projects/applicationinsights-debugplugin-js.tgz\",\n        \"@rush-temp/applicationinsights-dependencies-js\": \"file:./projects/applicationinsights-dependencies-js.tgz\",\n        \"@rush-temp/applicationinsights-example-aisku\": \"file:./projects/applicationinsights-example-aisku.tgz\",\n        \"@rush-temp/applicationinsights-example-cfgsync\": \"file:./projects/applicationinsights-example-cfgsync.tgz\",\n        \"@rush-temp/applicationinsights-example-dependencies\": \"file:./projects/applicationinsights-example-dependencies.tgz\",\n        \"@rush-temp/applicationinsights-example-shared-worker\": \"file:./projects/applicationinsights-example-shared-worker.tgz\",\n        \"@rush-temp/applicationinsights-example-startspan\": \"file:./projects/applicationinsights-example-startspan.tgz\",\n        \"@rush-temp/applicationinsights-js-release-tools\": \"file:./projects/applicationinsights-js-release-tools.tgz\",\n        \"@rush-temp/applicationinsights-offlinechannel-js\": \"file:./projects/applicationinsights-offlinechannel-js.tgz\",\n        \"@rush-temp/applicationinsights-osplugin-js\": \"file:./projects/applicationinsights-osplugin-js.tgz\",\n        \"@rush-temp/applicationinsights-perfmarkmeasure-js\": \"file:./projects/applicationinsights-perfmarkmeasure-js.tgz\",\n        \"@rush-temp/applicationinsights-properties-js\": \"file:./projects/applicationinsights-properties-js.tgz\",\n        \"@rush-temp/applicationinsights-rollup-es5\": \"file:./projects/applicationinsights-rollup-es5.tgz\",\n        \"@rush-temp/applicationinsights-rollup-plugin-uglify3-js\": \"file:./projects/applicationinsights-rollup-plugin-uglify3-js.tgz\",\n        \"@rush-temp/applicationinsights-shims\": \"file:./projects/applicationinsights-shims.tgz\",\n        \"@rush-temp/applicationinsights-teechannel-js\": \"file:./projects/applicationinsights-teechannel-js.tgz\",\n        \"@rush-temp/applicationinsights-test-module-type-check\": \"file:./projects/applicationinsights-test-module-type-check.tgz\",\n        \"@rush-temp/applicationinsights-web\": \"file:./projects/applicationinsights-web.tgz\",\n        \"@rush-temp/applicationinsights-web-basic\": \"file:./projects/applicationinsights-web-basic.tgz\",\n        \"@rush-temp/applicationinsights-web-config\": \"file:./projects/applicationinsights-web-config.tgz\",\n        \"@rush-temp/applicationinsights-web-snippet\": \"file:./projects/applicationinsights-web-snippet.tgz\",\n        \"@types/chrome\": \"^0.0.181\",\n        \"@types/file-saver\": \"~2.0.1\",\n        \"@types/lodash\": \"^4.14.181\",\n        \"@types/node\": \"11.13.2\",\n        \"@types/qunit\": \"^2.19.3\",\n        \"@types/react\": \"^16.9.11\",\n        \"@types/react-dom\": \"^16.9.4\",\n        \"@types/sinon\": \"4.3.3\",\n        \"ansi-regex\": \">=5.0.1\",\n        \"archiver\": \"^5.3.0\",\n        \"autoprefixer\": \"9.4.5\",\n        \"file-saver\": \"^2.0.0\",\n        \"finalhandler\": \"^1.1.1\",\n        \"form-data\": \"^2.5.5\",\n        \"glob\": \"7.2.3\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"puppeteer\": \"^24.40.0\",\n        \"qunit\": \"^2.11.2\",\n        \"react\": \"^17.0.2\",\n        \"react-dom\": \"^17.0.2\",\n        \"react-is\": \"16.13.1\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-copy\": \"^3.4.0\",\n        \"rollup-plugin-minify-es\": \"^1.1.1\",\n        \"rollup-plugin-peer-deps-external\": \"^2.2.4\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"scheduler\": \"~0.11.2\",\n        \"selenium-server-standalone-jar\": \"^3.141.5\",\n        \"serve-static\": \"^1.13.2\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\",\n        \"uglify-js\": \"3.16.0\"\n      }\n    },\n    \"node_modules/@babel/code-frame\": {\n      \"version\": \"7.12.11\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz\",\n      \"integrity\": \"sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==\",\n      \"dependencies\": {\n        \"@babel/highlight\": \"^7.10.4\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.28.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz\",\n      \"integrity\": \"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/highlight\": {\n      \"version\": \"7.25.9\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz\",\n      \"integrity\": \"sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.25.9\",\n        \"chalk\": \"^2.4.2\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/ansi-styles\": {\n      \"version\": \"3.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n      \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n      \"dependencies\": {\n        \"color-convert\": \"^1.9.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/chalk\": {\n      \"version\": \"2.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n      \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^3.2.1\",\n        \"escape-string-regexp\": \"^1.0.5\",\n        \"supports-color\": \"^5.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/color-convert\": {\n      \"version\": \"1.9.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n      \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n      \"dependencies\": {\n        \"color-name\": \"1.1.3\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/color-name\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n      \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\"\n    },\n    \"node_modules/@babel/highlight/node_modules/escape-string-regexp\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n      \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/has-flag\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n      \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@babel/highlight/node_modules/supports-color\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n      \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n      \"dependencies\": {\n        \"has-flag\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/@eslint-community/eslint-utils\": {\n      \"version\": \"4.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz\",\n      \"integrity\": \"sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"eslint-visitor-keys\": \"^3.4.3\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^6.0.0 || ^7.0.0 || >=8.0.0\"\n      }\n    },\n    \"node_modules/@eslint-community/regexpp\": {\n      \"version\": \"4.12.2\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz\",\n      \"integrity\": \"sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \"^12.0.0 || ^14.0.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc\": {\n      \"version\": \"2.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz\",\n      \"integrity\": \"sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"ajv\": \"^6.12.4\",\n        \"debug\": \"^4.3.2\",\n        \"espree\": \"^9.6.0\",\n        \"globals\": \"^13.19.0\",\n        \"ignore\": \"^5.2.0\",\n        \"import-fresh\": \"^3.2.1\",\n        \"js-yaml\": \"^4.1.0\",\n        \"minimatch\": \"^3.1.2\",\n        \"strip-json-comments\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/ajv\": {\n      \"version\": \"6.14.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz\",\n      \"integrity\": \"sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.1\",\n        \"fast-json-stable-stringify\": \"^2.0.0\",\n        \"json-schema-traverse\": \"^0.4.1\",\n        \"uri-js\": \"^4.2.2\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/epoberezkin\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"peer\": true\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/brace-expansion\": {\n      \"version\": \"1.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz\",\n      \"integrity\": \"sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\",\n        \"concat-map\": \"0.0.1\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/ignore\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz\",\n      \"integrity\": \"sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/json-schema-traverse\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\n      \"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\",\n      \"peer\": true\n    },\n    \"node_modules/@eslint/eslintrc/node_modules/minimatch\": {\n      \"version\": \"3.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz\",\n      \"integrity\": \"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^1.1.7\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/@eslint/js\": {\n      \"version\": \"8.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz\",\n      \"integrity\": \"sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/@humanwhocodes/config-array\": {\n      \"version\": \"0.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz\",\n      \"integrity\": \"sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==\",\n      \"deprecated\": \"Use @eslint/config-array instead\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@humanwhocodes/object-schema\": \"^2.0.3\",\n        \"debug\": \"^4.3.1\",\n        \"minimatch\": \"^3.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">=10.10.0\"\n      }\n    },\n    \"node_modules/@humanwhocodes/config-array/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"peer\": true\n    },\n    \"node_modules/@humanwhocodes/config-array/node_modules/brace-expansion\": {\n      \"version\": \"1.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz\",\n      \"integrity\": \"sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\",\n        \"concat-map\": \"0.0.1\"\n      }\n    },\n    \"node_modules/@humanwhocodes/config-array/node_modules/minimatch\": {\n      \"version\": \"3.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz\",\n      \"integrity\": \"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^1.1.7\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/@humanwhocodes/module-importer\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz\",\n      \"integrity\": \"sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=12.22\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/nzakas\"\n      }\n    },\n    \"node_modules/@humanwhocodes/object-schema\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz\",\n      \"integrity\": \"sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==\",\n      \"deprecated\": \"Use @eslint/object-schema instead\",\n      \"peer\": true\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\"\n    },\n    \"node_modules/@microsoft/api-extractor\": {\n      \"version\": \"7.58.2\",\n      \"resolved\": \"https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.58.2.tgz\",\n      \"integrity\": \"sha512-qmqWa0Fx1xn3irQy8MyuAKUs8e3CdwMJOujaPkM8gx5v/V7RcLhTjBU0/uL2kdhmROpW+5WG1FD98O441kkvQQ==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor-model\": \"7.33.6\",\n        \"@microsoft/tsdoc\": \"~0.16.0\",\n        \"@microsoft/tsdoc-config\": \"~0.18.1\",\n        \"@rushstack/node-core-library\": \"5.22.0\",\n        \"@rushstack/rig-package\": \"0.7.2\",\n        \"@rushstack/terminal\": \"0.22.5\",\n        \"@rushstack/ts-command-line\": \"5.3.5\",\n        \"diff\": \"~8.0.2\",\n        \"lodash\": \"~4.18.1\",\n        \"minimatch\": \"10.2.3\",\n        \"resolve\": \"~1.22.1\",\n        \"semver\": \"~7.5.4\",\n        \"source-map\": \"~0.6.1\",\n        \"typescript\": \"5.9.3\"\n      },\n      \"bin\": {\n        \"api-extractor\": \"bin/api-extractor\"\n      }\n    },\n    \"node_modules/@microsoft/api-extractor-model\": {\n      \"version\": \"7.33.6\",\n      \"resolved\": \"https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.6.tgz\",\n      \"integrity\": \"sha512-E9iI4yGEVVusbTAqSLetVFxDuBVCVqCigcoQwdJuOjsLq5Hry3MkBgUQhSZNzLCu17pgjk58MI80GRDJLht/1A==\",\n      \"dependencies\": {\n        \"@microsoft/tsdoc\": \"~0.16.0\",\n        \"@microsoft/tsdoc-config\": \"~0.18.1\",\n        \"@rushstack/node-core-library\": \"5.22.0\"\n      }\n    },\n    \"node_modules/@microsoft/api-extractor/node_modules/typescript\": {\n      \"version\": \"5.9.3\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz\",\n      \"integrity\": \"sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==\",\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/@microsoft/dynamicproto-js\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz\",\n      \"integrity\": \"sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==\",\n      \"dependencies\": {\n        \"@nevware21/ts-utils\": \">= 0.10.4 < 2.x\"\n      }\n    },\n    \"node_modules/@microsoft/tsdoc\": {\n      \"version\": \"0.16.0\",\n      \"resolved\": \"https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz\",\n      \"integrity\": \"sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==\"\n    },\n    \"node_modules/@microsoft/tsdoc-config\": {\n      \"version\": \"0.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz\",\n      \"integrity\": \"sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==\",\n      \"dependencies\": {\n        \"@microsoft/tsdoc\": \"0.16.0\",\n        \"ajv\": \"~8.18.0\",\n        \"jju\": \"~1.4.0\",\n        \"resolve\": \"~1.22.2\"\n      }\n    },\n    \"node_modules/@nevware21/grunt-eslint-ts\": {\n      \"version\": \"0.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@nevware21/grunt-eslint-ts/-/grunt-eslint-ts-0.5.2.tgz\",\n      \"integrity\": \"sha512-k2gzszSryZ+oeM1lCSAgXHXeMvPtzyesHKKd1sH8etQMvmwQJq0lYi5VpjIABzgWAE1jO5/4ZPQq0XB2QieAag==\",\n      \"dependencies\": {\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"eslint-formatter-codeframe\": \"^7.32.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@typescript-eslint/eslint-plugin\": \"*\",\n        \"@typescript-eslint/parser\": \"*\",\n        \"eslint\": \"^7.0.0 || ^8.0.0\",\n        \"eslint-plugin-security\": \"*\",\n        \"grunt\": \">=1\",\n        \"typescript\": \">=1\"\n      }\n    },\n    \"node_modules/@nevware21/grunt-ts-plugin\": {\n      \"version\": \"0.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/@nevware21/grunt-ts-plugin/-/grunt-ts-plugin-0.5.2.tgz\",\n      \"integrity\": \"sha512-lW0vWYDYV+ZlMf+2+edD/VdSjH/Gfy2+nuxbTCeNxySkC1FPrWFDh3Iefe8BplIdoySoZxVyqhsCaME+SoCO4Q==\",\n      \"dependencies\": {\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      },\n      \"peerDependencies\": {\n        \"grunt\": \">=1\",\n        \"typescript\": \">=1\"\n      }\n    },\n    \"node_modules/@nevware21/ts-async\": {\n      \"version\": \"0.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.5.tgz\",\n      \"integrity\": \"sha512-vwqaL05iJPjLeh5igPi8MeeAu10i+Aq7xko1fbo9F5Si6MnVN5505qaV7AhSdk5MCBJVT/UYMk3kgInNjDb4Ig==\",\n      \"dependencies\": {\n        \"@nevware21/ts-utils\": \">= 0.12.2 < 2.x\"\n      }\n    },\n    \"node_modules/@nevware21/ts-utils\": {\n      \"version\": \"0.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.13.0.tgz\",\n      \"integrity\": \"sha512-F3mD+DsUn9OiZmZc5tg0oKqrJCtiCstwx+wE+DNzFYh2cCRUuzTYdK9zGGP/au2BWvbOQ6Tqlbjr2+dT1P3AlQ==\"\n    },\n    \"node_modules/@nodelib/fs.scandir\": {\n      \"version\": \"2.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz\",\n      \"integrity\": \"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==\",\n      \"dependencies\": {\n        \"@nodelib/fs.stat\": \"2.0.5\",\n        \"run-parallel\": \"^1.1.9\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/@nodelib/fs.stat\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz\",\n      \"integrity\": \"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==\",\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/@nodelib/fs.walk\": {\n      \"version\": \"1.2.8\",\n      \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz\",\n      \"integrity\": \"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==\",\n      \"dependencies\": {\n        \"@nodelib/fs.scandir\": \"2.1.5\",\n        \"fastq\": \"^1.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/@puppeteer/browsers\": {\n      \"version\": \"2.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz\",\n      \"integrity\": \"sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.3\",\n        \"extract-zip\": \"^2.0.1\",\n        \"progress\": \"^2.0.3\",\n        \"proxy-agent\": \"^6.5.0\",\n        \"semver\": \"^7.7.4\",\n        \"tar-fs\": \"^3.1.1\",\n        \"yargs\": \"^17.7.2\"\n      },\n      \"bin\": {\n        \"browsers\": \"lib/cjs/main-cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@puppeteer/browsers/node_modules/semver\": {\n      \"version\": \"7.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.7.4.tgz\",\n      \"integrity\": \"sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@rollup/plugin-commonjs\": {\n      \"version\": \"24.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz\",\n      \"integrity\": \"sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==\",\n      \"dependencies\": {\n        \"@rollup/pluginutils\": \"^5.0.1\",\n        \"commondir\": \"^1.0.1\",\n        \"estree-walker\": \"^2.0.2\",\n        \"glob\": \"^8.0.3\",\n        \"is-reference\": \"1.2.1\",\n        \"magic-string\": \"^0.27.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"peerDependencies\": {\n        \"rollup\": \"^2.68.0||^3.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"rollup\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rollup/plugin-commonjs/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\"\n    },\n    \"node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@rollup/plugin-commonjs/node_modules/glob\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-8.1.0.tgz\",\n      \"integrity\": \"sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==\",\n      \"deprecated\": \"Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me\",\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^5.0.1\",\n        \"once\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/@rollup/plugin-commonjs/node_modules/magic-string\": {\n      \"version\": \"0.27.0\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz\",\n      \"integrity\": \"sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==\",\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.4.13\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@rollup/plugin-commonjs/node_modules/minimatch\": {\n      \"version\": \"5.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz\",\n      \"integrity\": \"sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@rollup/plugin-node-resolve\": {\n      \"version\": \"15.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz\",\n      \"integrity\": \"sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==\",\n      \"dependencies\": {\n        \"@rollup/pluginutils\": \"^5.0.1\",\n        \"@types/resolve\": \"1.20.2\",\n        \"deepmerge\": \"^4.2.2\",\n        \"is-module\": \"^1.0.0\",\n        \"resolve\": \"^1.22.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"peerDependencies\": {\n        \"rollup\": \"^2.78.0||^3.0.0||^4.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"rollup\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rollup/plugin-replace\": {\n      \"version\": \"5.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz\",\n      \"integrity\": \"sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==\",\n      \"dependencies\": {\n        \"@rollup/pluginutils\": \"^5.0.1\",\n        \"magic-string\": \"^0.30.3\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"peerDependencies\": {\n        \"rollup\": \"^1.20.0||^2.0.0||^3.0.0||^4.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"rollup\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rollup/plugin-replace/node_modules/magic-string\": {\n      \"version\": \"0.30.21\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz\",\n      \"integrity\": \"sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==\",\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.5\"\n      }\n    },\n    \"node_modules/@rollup/pluginutils\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz\",\n      \"integrity\": \"sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==\",\n      \"dependencies\": {\n        \"@types/estree\": \"^1.0.0\",\n        \"estree-walker\": \"^2.0.2\",\n        \"picomatch\": \"^4.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=14.0.0\"\n      },\n      \"peerDependencies\": {\n        \"rollup\": \"^1.20.0||^2.0.0||^3.0.0||^4.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"rollup\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rush-temp/1ds-core-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/1ds-core-js.tgz\",\n      \"integrity\": \"sha512-SzQBOP3d58VNY5XvZfQvygUyUdlv/gKJ2EY8p97j7TjsxaMhfBtzkDT9OsC06rmxImjf0sh7OipMyi2UUyvbDg==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/qunit\": \"^2.19.3\",\n        \"@types/sinon\": \"4.3.3\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"pako\": \"^2.0.3\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/1ds-post-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/1ds-post-js.tgz\",\n      \"integrity\": \"sha512-UutzZGhEbtTjjGr39rX332E0Tqkg06yTLmcQ2DJJ2wGljVGUyZAxTOVVP44GwA91gFnUjZWfMnYOBPiqW7oxQw==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"pako\": \"^2.0.3\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/ai-test-framework\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/ai-test-framework.tgz\",\n      \"integrity\": \"sha512-98INIb9sg5Eulu0M7JiNXExE9K4pn8UogFT6f/vTrdeL4NbkCRhCvW2T0iukEuxAYLNScYfoHGKFJDkWmESbnA==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/qunit\": \"^2.19.3\",\n        \"@types/sinon\": \"4.3.3\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"magic-string\": \"^0.25.7\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-analytics-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-analytics-js.tgz\",\n      \"integrity\": \"sha512-p9cYTb2AXjUPfsZ0IB3VoaPpxyqeu+FQoCeEJljnj7+8twqBhOIGO9BVFCnIhps3Je6E7QLumJt71hUs/9nGew==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-cfgsync-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-cfgsync-js.tgz\",\n      \"integrity\": \"sha512-QzPWVHskZ+6OiXsQbGslJaS/aodqcAddDJVEKtVBvvZMs5zjmuT6MfUzCzgPuFUF9PApGYNTyKB6P9JN8zFFjw==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-channel-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-channel-js.tgz\",\n      \"integrity\": \"sha512-gtYf+Edm6ccRvK061SEoZQplH03Ou3kAF+HdPirTvYibp6LepJXOPKzX/RpKM1xM7h2TgHTbiP7CJyj5f2oiTQ==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/sinon\": \"4.3.3\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-chrome-debug-extension\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-chrome-debug-extension.tgz\",\n      \"integrity\": \"sha512-UQ7RDVim7seZ0f1RG1HKdNNXkD4qBancJgm2F7Kh1N7wg299Fj5TfSbRfr68GJDskPQIPqTNKc+8ffAQrdiTfg==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/chrome\": \"^0.0.181\",\n        \"@types/file-saver\": \"~2.0.1\",\n        \"@types/lodash\": \"^4.14.181\",\n        \"@types/node\": \"11.13.2\",\n        \"@types/react\": \"^16.9.11\",\n        \"@types/react-dom\": \"^16.9.4\",\n        \"ansi-regex\": \">=5.0.1\",\n        \"archiver\": \"^5.3.0\",\n        \"autoprefixer\": \"9.4.5\",\n        \"file-saver\": \"^2.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"react\": \"^17.0.2\",\n        \"react-dom\": \"^17.0.2\",\n        \"react-is\": \"16.13.1\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-copy\": \"^3.4.0\",\n        \"rollup-plugin-peer-deps-external\": \"^2.2.4\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"scheduler\": \"~0.11.2\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-clickanalytics-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-clickanalytics-js.tgz\",\n      \"integrity\": \"sha512-Hoq7lxOXCqC+RaKp1sfrnkJ0i0drTLnsQRMoeKuoeO8wXq+1KrXaUSdRVhz1TSRF7Ek4qdyKEi/wJIWM6hAuqQ==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-common\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-common.tgz\",\n      \"integrity\": \"sha512-BE4vBHvSw2wO1VQjkIeXNp0BjKDBcm1PFuJ7whswQ8LoPfd8/xTil+fxtqCMBl42Nchwlh6RUCLnrA0Wd70dsg==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-core-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-core-js.tgz\",\n      \"integrity\": \"sha512-E8B4hkB83pVZjw2nMpyQuLT1xpPqOppqYzxl2S4OmCyrtUbSoyFoJbNen9Mgd7g0nhnL8VoAY6ca5y4RPZ7SqA==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-debugplugin-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-debugplugin-js.tgz\",\n      \"integrity\": \"sha512-w9aqV1uwi/lYQi5AAgSv1cGajZHz5KdHfVpD5KDsVgdg98GnJjyE/ODqs7YnBvxp9Mkxivi/trSPSKXLOine+g==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-dependencies-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-dependencies-js.tgz\",\n      \"integrity\": \"sha512-hKcNAKpcSI/IL8SuvRRIawHGQV5YV5pFRtNlGzyUCSij2zo0SX8p0ae0dFQ8CcOuOphIhNEBnz+3ewHbPhDBVg==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-example-aisku\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-example-aisku.tgz\",\n      \"integrity\": \"sha512-FB1/b2VX7Fb1xfy1S7yqjf5saN1fUix5rygBbXngDyNwfNSDyu6q8htb5etzaMTJPy9TcQ4089j3fj08TLnHKQ==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \">= 1.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-example-cfgsync\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-example-cfgsync.tgz\",\n      \"integrity\": \"sha512-v5LZ27Qc+0Y+eanuY6NVsP5ueGOzxHP21yU9xFgX0Bn/nUErGXskb2NXtE/lBgX98wPFz6uPBcgMGZjbMC8lZg==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-example-dependencies\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-example-dependencies.tgz\",\n      \"integrity\": \"sha512-pRoEojZYbzjC471oTZ3nHforGF8xoCfelBBKrQ5HcqqM3CKg4db9yRlaDV4k+zPmUK9lAV/xrhuSptiUZLcLlg==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \">= 1.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-example-shared-worker\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-example-shared-worker.tgz\",\n      \"integrity\": \"sha512-21f+RLsazNOeRSduZ4hyuCihrCq/g+qQPfuHcUkh4KNLCDymJdPC34GQG0E4jgAPSpRXav5q+/gLA+BPklOSmg==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-example-startspan\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-example-startspan.tgz\",\n      \"integrity\": \"sha512-y+4U3H0j3fzJgg0JuoNNb5co3hA5qLYypG68wC/I3tIS+dNgOA5QPsEI/cAwdqztEzjoAsuWCcD5NDUFiDnUFw==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \">= 1.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-js-release-tools\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-js-release-tools.tgz\",\n      \"integrity\": \"sha512-8uINBeACjJThsXFQEnxCoZ+r0tfEq8xQsS83PjgTyNYgkqHNethd6/DR1uFrszGSTBoBNtuI0bMUWPN1e0axPw==\",\n      \"dependencies\": {\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-offlinechannel-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-offlinechannel-js.tgz\",\n      \"integrity\": \"sha512-Hp0iRY/TbN/UuBpnla6gLsyzvXEEXI/fUKOyaWxwOJ8CdWYcZpS/a/dxrOlduhBmqVwcHnzEoPbeYLnrfqdJIA==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/sinon\": \"4.3.3\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-osplugin-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-osplugin-js.tgz\",\n      \"integrity\": \"sha512-+7Ea5IJH7qeUTrRABASD39/l835OvpnAT73VHKWE2XszvIZxXPj+vQPL2gfnBu6n5B3b8hL2vuQoWn+HuMnR5w==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/sinon\": \"4.3.3\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-perfmarkmeasure-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-perfmarkmeasure-js.tgz\",\n      \"integrity\": \"sha512-IPAbdjmz64eSGpbArdJDpGOmWA1YQ4eltvrvs6ehoppa32ORCiEYHengFIQD0Yze4yaxHs9235murYsnV1Txdw==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-properties-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-properties-js.tgz\",\n      \"integrity\": \"sha512-QaVXQ0xMI8kbwCqUAQ2gIs+lTPfUaXXOvNGdjKuX69e/SM+BTj5a3eF8B1jGWAGbysTA/BIqi8pJIkOUw2XErw==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"qunit\": \"^2.11.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-rollup-es5\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-rollup-es5.tgz\",\n      \"integrity\": \"sha512-LYOlzncve85WY3gJ70bvYsq77Hwg4YJXMFghmI0KdPlp1kUeTiuyys3Kw2tWtCFuTEzwrLEoCdIQ9jTZNDuEHw==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/qunit\": \"^2.19.3\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-minify-es\": \"^1.1.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-rollup-plugin-uglify3-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-rollup-plugin-uglify3-js.tgz\",\n      \"integrity\": \"sha512-wQTusQGKyKlXXnPQNR0Zp4y7LC5PYWFCOQGu3ZiDV9khNWHOMfZIfH0Q9/QYLBm+pijHAoysAKLW5G+wTa1UKg==\",\n      \"dependencies\": {\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typescript\": \"^4.9.3\",\n        \"uglify-js\": \"3.16.0\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-shims\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-shims.tgz\",\n      \"integrity\": \"sha512-73OfhmEOJjt7SWbqvs5lzlqjMBFGr6EkQBE45TQFM1PMdtUn4qXHkmWe6C4H8yuna+5gXLMVXmIi3gPAgAYJWg==\",\n      \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/qunit\": \"^2.19.3\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-minify-es\": \"^1.1.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-teechannel-js\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-teechannel-js.tgz\",\n      \"integrity\": \"sha512-bce+lerO73uSluhra75NetTTV7CqiBSE080LS1JVucU4qIq62qNvdQ8crj5QOmU2d4dZsM271Crw7mQo19tIZw==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/sinon\": \"4.3.3\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-test-module-type-check\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-test-module-type-check.tgz\",\n      \"integrity\": \"sha512-gAICBFtB6Tk3UXfUGvErjLTCNfre006GoY4wmXW1ijPCHdOmU+qew5YWLEBdoTRJNu7Llanv4bzX0qYdHFoUrw==\",\n      \"dependencies\": {\n        \"tslib\": \">= 1.0.0\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-web\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-web.tgz\",\n      \"integrity\": \"sha512-UDu30TQNcs1UP8T7EiORslNM5yaWXfNcSA1pO2mdD28q8VelHki8xxmrY3JN7YerfH2yEUrMPt8A43hVcmuQbg==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"finalhandler\": \"^1.1.1\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"puppeteer\": \"^24.40.0\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"selenium-server-standalone-jar\": \"^3.141.5\",\n        \"serve-static\": \"^1.13.2\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-web-basic\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-web-basic.tgz\",\n      \"integrity\": \"sha512-F809vTNNN8fhXcku6kfX672M9Fbca+ULKYmvra/VlFFG2oGrYzUypw1DiISTJVrsu6enXQElx0cCcS929aop8Q==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"sinon\": \"^7.3.1\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rush-temp/applicationinsights-web-config\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-web-config.tgz\",\n      \"integrity\": \"sha512-FwPOZ+esirRqdKg9s7VTxtWqGJ9CQ/gIJ0PfUvTolAF9JZCVw5wQeHD4Tv/KiziZhB50CNaGshnPmLpWGVzo9g==\"\n    },\n    \"node_modules/@rush-temp/applicationinsights-web-snippet\": {\n      \"version\": \"0.0.0\",\n      \"resolved\": \"file:projects/applicationinsights-web-snippet.tgz\",\n      \"integrity\": \"sha512-fA4kHfH/NMRI3YzhsRDUAhcR12m1Kyz/ILgRMEBsA1rM7dvnb+d2Nfs6XbcEGtqAxfMSoRGgqU9bOIqA4uneBg==\",\n      \"dependencies\": {\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/qunit\": \"^2.19.3\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\"\n      }\n    },\n    \"node_modules/@rushstack/node-core-library\": {\n      \"version\": \"5.22.0\",\n      \"resolved\": \"https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.22.0.tgz\",\n      \"integrity\": \"sha512-S/Dm/N+8tkbasS6yM5cF6q4iDFt14mQQniiVIwk1fd0zpPwWESspO4qtPyIl8szEaN86XOYC1HRRzZrOowxjtw==\",\n      \"dependencies\": {\n        \"ajv\": \"~8.18.0\",\n        \"ajv-draft-04\": \"~1.0.0\",\n        \"ajv-formats\": \"~3.0.1\",\n        \"fs-extra\": \"~11.3.0\",\n        \"import-lazy\": \"~4.0.0\",\n        \"jju\": \"~1.4.0\",\n        \"resolve\": \"~1.22.1\",\n        \"semver\": \"~7.5.4\"\n      },\n      \"peerDependencies\": {\n        \"@types/node\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@types/node\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rushstack/problem-matcher\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz\",\n      \"integrity\": \"sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==\",\n      \"peerDependencies\": {\n        \"@types/node\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@types/node\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rushstack/rig-package\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.2.tgz\",\n      \"integrity\": \"sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==\",\n      \"dependencies\": {\n        \"resolve\": \"~1.22.1\",\n        \"strip-json-comments\": \"~3.1.1\"\n      }\n    },\n    \"node_modules/@rushstack/terminal\": {\n      \"version\": \"0.22.5\",\n      \"resolved\": \"https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.22.5.tgz\",\n      \"integrity\": \"sha512-umej8J6A+WRbfQV1G/uNfnz4bMa8CzFU9IJzQb/ZcH4j7Ybg3BQ8UBKOCF3o5U3/2yah1TDU/zE71ugg2JJv+Q==\",\n      \"dependencies\": {\n        \"@rushstack/node-core-library\": \"5.22.0\",\n        \"@rushstack/problem-matcher\": \"0.2.1\",\n        \"supports-color\": \"~8.1.1\"\n      },\n      \"peerDependencies\": {\n        \"@types/node\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@types/node\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@rushstack/ts-command-line\": {\n      \"version\": \"5.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.5.tgz\",\n      \"integrity\": \"sha512-ToJQu3+o6aEdDoApGrwb/RsbwDi/NSC7jIEaAezzWM470TRrsXfSHoYAm1eWkhh34xJ+kZxU1ZzKSHiOMlOFPA==\",\n      \"dependencies\": {\n        \"@rushstack/terminal\": \"0.22.5\",\n        \"@types/argparse\": \"1.0.38\",\n        \"argparse\": \"~1.0.9\",\n        \"string-argv\": \"~0.3.1\"\n      }\n    },\n    \"node_modules/@shikijs/core\": {\n      \"version\": \"1.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz\",\n      \"integrity\": \"sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==\",\n      \"dependencies\": {\n        \"@shikijs/engine-javascript\": \"1.29.2\",\n        \"@shikijs/engine-oniguruma\": \"1.29.2\",\n        \"@shikijs/types\": \"1.29.2\",\n        \"@shikijs/vscode-textmate\": \"^10.0.1\",\n        \"@types/hast\": \"^3.0.4\",\n        \"hast-util-to-html\": \"^9.0.4\"\n      }\n    },\n    \"node_modules/@shikijs/engine-javascript\": {\n      \"version\": \"1.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz\",\n      \"integrity\": \"sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==\",\n      \"dependencies\": {\n        \"@shikijs/types\": \"1.29.2\",\n        \"@shikijs/vscode-textmate\": \"^10.0.1\",\n        \"oniguruma-to-es\": \"^2.2.0\"\n      }\n    },\n    \"node_modules/@shikijs/engine-oniguruma\": {\n      \"version\": \"1.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz\",\n      \"integrity\": \"sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==\",\n      \"dependencies\": {\n        \"@shikijs/types\": \"1.29.2\",\n        \"@shikijs/vscode-textmate\": \"^10.0.1\"\n      }\n    },\n    \"node_modules/@shikijs/langs\": {\n      \"version\": \"1.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz\",\n      \"integrity\": \"sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==\",\n      \"dependencies\": {\n        \"@shikijs/types\": \"1.29.2\"\n      }\n    },\n    \"node_modules/@shikijs/themes\": {\n      \"version\": \"1.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz\",\n      \"integrity\": \"sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==\",\n      \"dependencies\": {\n        \"@shikijs/types\": \"1.29.2\"\n      }\n    },\n    \"node_modules/@shikijs/types\": {\n      \"version\": \"1.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz\",\n      \"integrity\": \"sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==\",\n      \"dependencies\": {\n        \"@shikijs/vscode-textmate\": \"^10.0.1\",\n        \"@types/hast\": \"^3.0.4\"\n      }\n    },\n    \"node_modules/@shikijs/vscode-textmate\": {\n      \"version\": \"10.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz\",\n      \"integrity\": \"sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==\"\n    },\n    \"node_modules/@sinonjs/commons\": {\n      \"version\": \"1.8.6\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz\",\n      \"integrity\": \"sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==\",\n      \"dependencies\": {\n        \"type-detect\": \"4.0.8\"\n      }\n    },\n    \"node_modules/@sinonjs/formatio\": {\n      \"version\": \"3.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz\",\n      \"integrity\": \"sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==\",\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^1\",\n        \"@sinonjs/samsam\": \"^3.1.0\"\n      }\n    },\n    \"node_modules/@sinonjs/samsam\": {\n      \"version\": \"3.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz\",\n      \"integrity\": \"sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==\",\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^1.3.0\",\n        \"array-from\": \"^2.1.1\",\n        \"lodash\": \"^4.17.15\"\n      }\n    },\n    \"node_modules/@sinonjs/text-encoding\": {\n      \"version\": \"0.7.3\",\n      \"resolved\": \"https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz\",\n      \"integrity\": \"sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==\",\n      \"deprecated\": \"Deprecated: no longer maintained and no longer used by Sinon packages. See\\n  https://github.com/sinonjs/nise/issues/243 for replacement details.\"\n    },\n    \"node_modules/@tootallnate/quickjs-emscripten\": {\n      \"version\": \"0.23.0\",\n      \"resolved\": \"https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz\",\n      \"integrity\": \"sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==\"\n    },\n    \"node_modules/@types/argparse\": {\n      \"version\": \"1.0.38\",\n      \"resolved\": \"https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz\",\n      \"integrity\": \"sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==\"\n    },\n    \"node_modules/@types/chrome\": {\n      \"version\": \"0.0.181\",\n      \"resolved\": \"https://registry.npmjs.org/@types/chrome/-/chrome-0.0.181.tgz\",\n      \"integrity\": \"sha512-34Ln9YVVC8a195ruqWeaty3pouFdCLr9L5kPcbRflQcxnbXQnHor9uETof8OhDf8JLDytSRDiuDsRXYQYQ+9FA==\",\n      \"dependencies\": {\n        \"@types/filesystem\": \"*\",\n        \"@types/har-format\": \"*\"\n      }\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz\",\n      \"integrity\": \"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==\"\n    },\n    \"node_modules/@types/file-saver\": {\n      \"version\": \"2.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz\",\n      \"integrity\": \"sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==\"\n    },\n    \"node_modules/@types/filesystem\": {\n      \"version\": \"0.0.36\",\n      \"resolved\": \"https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz\",\n      \"integrity\": \"sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==\",\n      \"dependencies\": {\n        \"@types/filewriter\": \"*\"\n      }\n    },\n    \"node_modules/@types/filewriter\": {\n      \"version\": \"0.0.33\",\n      \"resolved\": \"https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz\",\n      \"integrity\": \"sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==\"\n    },\n    \"node_modules/@types/fs-extra\": {\n      \"version\": \"8.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz\",\n      \"integrity\": \"sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/glob\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz\",\n      \"integrity\": \"sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==\",\n      \"dependencies\": {\n        \"@types/minimatch\": \"*\",\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/har-format\": {\n      \"version\": \"1.2.16\",\n      \"resolved\": \"https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz\",\n      \"integrity\": \"sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==\"\n    },\n    \"node_modules/@types/hast\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz\",\n      \"integrity\": \"sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==\",\n      \"dependencies\": {\n        \"@types/unist\": \"*\"\n      }\n    },\n    \"node_modules/@types/lodash\": {\n      \"version\": \"4.17.24\",\n      \"resolved\": \"https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz\",\n      \"integrity\": \"sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==\"\n    },\n    \"node_modules/@types/mdast\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz\",\n      \"integrity\": \"sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==\",\n      \"dependencies\": {\n        \"@types/unist\": \"*\"\n      }\n    },\n    \"node_modules/@types/minimatch\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/minimatch/-/minimatch-6.0.0.tgz\",\n      \"integrity\": \"sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==\",\n      \"deprecated\": \"This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed.\",\n      \"dependencies\": {\n        \"minimatch\": \"*\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"11.13.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-11.13.2.tgz\",\n      \"integrity\": \"sha512-HOtU5KqROKT7qX/itKHuTtt5fV0iXbheQvrgbLNXFJQBY/eh+VS5vmmTAVlo3qIGMsypm0G4N1t2AXjy1ZicaQ==\"\n    },\n    \"node_modules/@types/prop-types\": {\n      \"version\": \"15.7.15\",\n      \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz\",\n      \"integrity\": \"sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==\"\n    },\n    \"node_modules/@types/qunit\": {\n      \"version\": \"2.19.13\",\n      \"resolved\": \"https://registry.npmjs.org/@types/qunit/-/qunit-2.19.13.tgz\",\n      \"integrity\": \"sha512-N4xp3v4s7f0jb2Oij6+6xw5QhH7/IgHCoGIFLCWtbEWoPkGYp8Te4mIwIP21qaurr6ed5JiPMiy2/ZoiGPkLIw==\"\n    },\n    \"node_modules/@types/react\": {\n      \"version\": \"16.14.69\",\n      \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-16.14.69.tgz\",\n      \"integrity\": \"sha512-NdnAamzkxLX9LBssSdt9Q0tQ3LR94hYxotI4/sRUs1vHKFXaDx9xDbK8S4wuw5bwrxiiXbTYyhKeITtFnwDvEA==\",\n      \"dependencies\": {\n        \"@types/prop-types\": \"*\",\n        \"@types/scheduler\": \"^0.16\",\n        \"csstype\": \"^3.2.2\"\n      }\n    },\n    \"node_modules/@types/react-dom\": {\n      \"version\": \"16.9.25\",\n      \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.25.tgz\",\n      \"integrity\": \"sha512-ZK//eAPhwft9Ul2/Zj+6O11YR6L4JX0J2sVeBC9Ft7x7HFN7xk7yUV/zDxqV6rjvqgl6r8Dq7oQImxtyf/Mzcw==\",\n      \"peerDependencies\": {\n        \"@types/react\": \"^16.0.0\"\n      }\n    },\n    \"node_modules/@types/resolve\": {\n      \"version\": \"1.20.2\",\n      \"resolved\": \"https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz\",\n      \"integrity\": \"sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==\"\n    },\n    \"node_modules/@types/scheduler\": {\n      \"version\": \"0.16.8\",\n      \"resolved\": \"https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz\",\n      \"integrity\": \"sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==\"\n    },\n    \"node_modules/@types/sinon\": {\n      \"version\": \"4.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/sinon/-/sinon-4.3.3.tgz\",\n      \"integrity\": \"sha512-Tt7w/ylBS/OEAlSCwzB0Db1KbxnkycP/1UkQpbvKFYoUuRn4uYsC3xh5TRPrOjTy0i8TIkSz1JdNL4GPVdf3KQ==\"\n    },\n    \"node_modules/@types/unist\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz\",\n      \"integrity\": \"sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==\"\n    },\n    \"node_modules/@types/yauzl\": {\n      \"version\": \"2.10.3\",\n      \"resolved\": \"https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz\",\n      \"integrity\": \"sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@typescript-eslint/eslint-plugin\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz\",\n      \"integrity\": \"sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@eslint-community/regexpp\": \"^4.12.2\",\n        \"@typescript-eslint/scope-manager\": \"8.58.1\",\n        \"@typescript-eslint/type-utils\": \"8.58.1\",\n        \"@typescript-eslint/utils\": \"8.58.1\",\n        \"@typescript-eslint/visitor-keys\": \"8.58.1\",\n        \"ignore\": \"^7.0.5\",\n        \"natural-compare\": \"^1.4.0\",\n        \"ts-api-utils\": \"^2.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"@typescript-eslint/parser\": \"^8.58.1\",\n        \"eslint\": \"^8.57.0 || ^9.0.0 || ^10.0.0\",\n        \"typescript\": \">=4.8.4 <6.1.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/parser\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz\",\n      \"integrity\": \"sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/scope-manager\": \"8.58.1\",\n        \"@typescript-eslint/types\": \"8.58.1\",\n        \"@typescript-eslint/typescript-estree\": \"8.58.1\",\n        \"@typescript-eslint/visitor-keys\": \"8.58.1\",\n        \"debug\": \"^4.4.3\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^8.57.0 || ^9.0.0 || ^10.0.0\",\n        \"typescript\": \">=4.8.4 <6.1.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/project-service\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz\",\n      \"integrity\": \"sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/tsconfig-utils\": \"^8.58.1\",\n        \"@typescript-eslint/types\": \"^8.58.1\",\n        \"debug\": \"^4.4.3\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.8.4 <6.1.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/scope-manager\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz\",\n      \"integrity\": \"sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/types\": \"8.58.1\",\n        \"@typescript-eslint/visitor-keys\": \"8.58.1\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      }\n    },\n    \"node_modules/@typescript-eslint/tsconfig-utils\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz\",\n      \"integrity\": \"sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.8.4 <6.1.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/type-utils\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz\",\n      \"integrity\": \"sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/types\": \"8.58.1\",\n        \"@typescript-eslint/typescript-estree\": \"8.58.1\",\n        \"@typescript-eslint/utils\": \"8.58.1\",\n        \"debug\": \"^4.4.3\",\n        \"ts-api-utils\": \"^2.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^8.57.0 || ^9.0.0 || ^10.0.0\",\n        \"typescript\": \">=4.8.4 <6.1.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/types\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz\",\n      \"integrity\": \"sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      }\n    },\n    \"node_modules/@typescript-eslint/typescript-estree\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz\",\n      \"integrity\": \"sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/project-service\": \"8.58.1\",\n        \"@typescript-eslint/tsconfig-utils\": \"8.58.1\",\n        \"@typescript-eslint/types\": \"8.58.1\",\n        \"@typescript-eslint/visitor-keys\": \"8.58.1\",\n        \"debug\": \"^4.4.3\",\n        \"minimatch\": \"^10.2.2\",\n        \"semver\": \"^7.7.3\",\n        \"tinyglobby\": \"^0.2.15\",\n        \"ts-api-utils\": \"^2.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.8.4 <6.1.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/typescript-estree/node_modules/semver\": {\n      \"version\": \"7.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.7.4.tgz\",\n      \"integrity\": \"sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==\",\n      \"peer\": true,\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/@typescript-eslint/utils\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz\",\n      \"integrity\": \"sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@eslint-community/eslint-utils\": \"^4.9.1\",\n        \"@typescript-eslint/scope-manager\": \"8.58.1\",\n        \"@typescript-eslint/types\": \"8.58.1\",\n        \"@typescript-eslint/typescript-estree\": \"8.58.1\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      },\n      \"peerDependencies\": {\n        \"eslint\": \"^8.57.0 || ^9.0.0 || ^10.0.0\",\n        \"typescript\": \">=4.8.4 <6.1.0\"\n      }\n    },\n    \"node_modules/@typescript-eslint/visitor-keys\": {\n      \"version\": \"8.58.1\",\n      \"resolved\": \"https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz\",\n      \"integrity\": \"sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@typescript-eslint/types\": \"8.58.1\",\n        \"eslint-visitor-keys\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/typescript-eslint\"\n      }\n    },\n    \"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz\",\n      \"integrity\": \"sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.13.0 || >=24\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/@ungap/structured-clone\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz\",\n      \"integrity\": \"sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==\"\n    },\n    \"node_modules/abbrev\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz\",\n      \"integrity\": \"sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==\"\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.16.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz\",\n      \"integrity\": \"sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==\",\n      \"peer\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/acorn-jsx\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz\",\n      \"integrity\": \"sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==\",\n      \"peer\": true,\n      \"peerDependencies\": {\n        \"acorn\": \"^6.0.0 || ^7.0.0 || ^8.0.0\"\n      }\n    },\n    \"node_modules/agent-base\": {\n      \"version\": \"7.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz\",\n      \"integrity\": \"sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==\",\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/ajv\": {\n      \"version\": \"8.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz\",\n      \"integrity\": \"sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==\",\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.3\",\n        \"fast-uri\": \"^3.0.1\",\n        \"json-schema-traverse\": \"^1.0.0\",\n        \"require-from-string\": \"^2.0.2\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/epoberezkin\"\n      }\n    },\n    \"node_modules/ajv-draft-04\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz\",\n      \"integrity\": \"sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==\",\n      \"peerDependencies\": {\n        \"ajv\": \"^8.5.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"ajv\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/ajv-formats\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz\",\n      \"integrity\": \"sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==\",\n      \"dependencies\": {\n        \"ajv\": \"^8.0.0\"\n      },\n      \"peerDependencies\": {\n        \"ajv\": \"^8.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"ajv\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz\",\n      \"integrity\": \"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/archiver\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz\",\n      \"integrity\": \"sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^2.1.0\",\n        \"async\": \"^3.2.4\",\n        \"buffer-crc32\": \"^0.2.1\",\n        \"readable-stream\": \"^3.6.0\",\n        \"readdir-glob\": \"^1.1.2\",\n        \"tar-stream\": \"^2.2.0\",\n        \"zip-stream\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/archiver-utils\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz\",\n      \"integrity\": \"sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==\",\n      \"dependencies\": {\n        \"glob\": \"^7.1.4\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"lazystream\": \"^1.0.0\",\n        \"lodash.defaults\": \"^4.2.0\",\n        \"lodash.difference\": \"^4.5.0\",\n        \"lodash.flatten\": \"^4.4.0\",\n        \"lodash.isplainobject\": \"^4.0.6\",\n        \"lodash.union\": \"^4.6.0\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\"\n    },\n    \"node_modules/archiver-utils/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\"\n    },\n    \"node_modules/archiver-utils/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz\",\n      \"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n      \"dependencies\": {\n        \"sprintf-js\": \"~1.0.2\"\n      }\n    },\n    \"node_modules/array-each\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz\",\n      \"integrity\": \"sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/array-from\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz\",\n      \"integrity\": \"sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==\"\n    },\n    \"node_modules/array-slice\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz\",\n      \"integrity\": \"sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/array-union\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz\",\n      \"integrity\": \"sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ast-types\": {\n      \"version\": \"0.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz\",\n      \"integrity\": \"sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==\",\n      \"dependencies\": {\n        \"tslib\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/async\": {\n      \"version\": \"3.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.6.tgz\",\n      \"integrity\": \"sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==\"\n    },\n    \"node_modules/asynckit\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\"\n    },\n    \"node_modules/atob\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/atob/-/atob-2.1.2.tgz\",\n      \"integrity\": \"sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==\",\n      \"bin\": {\n        \"atob\": \"bin/atob.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 4.5.0\"\n      }\n    },\n    \"node_modules/autoprefixer\": {\n      \"version\": \"9.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.5.tgz\",\n      \"integrity\": \"sha512-M602C0ZxzFpJKqD4V6eq2j+K5CkzlhekCrcQupJmAOrPEZjWJyj/wSeo6qRSNoN6M3/9mtLPQqTTrABfReytQg==\",\n      \"dependencies\": {\n        \"browserslist\": \"^4.4.0\",\n        \"caniuse-lite\": \"^1.0.30000928\",\n        \"normalize-range\": \"^0.1.2\",\n        \"num2fraction\": \"^1.2.2\",\n        \"postcss\": \"^7.0.11\",\n        \"postcss-value-parser\": \"^3.3.1\"\n      },\n      \"bin\": {\n        \"autoprefixer\": \"bin/autoprefixer\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz\",\n      \"integrity\": \"sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==\",\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/bare-events\": {\n      \"version\": \"2.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz\",\n      \"integrity\": \"sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==\",\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-fs\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.0.tgz\",\n      \"integrity\": \"sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.5.4\",\n        \"bare-path\": \"^3.0.0\",\n        \"bare-stream\": \"^2.6.4\",\n        \"bare-url\": \"^2.2.2\",\n        \"fast-fifo\": \"^1.3.2\"\n      },\n      \"engines\": {\n        \"bare\": \">=1.16.0\"\n      },\n      \"peerDependencies\": {\n        \"bare-buffer\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-buffer\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-os\": {\n      \"version\": \"3.8.7\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz\",\n      \"integrity\": \"sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==\",\n      \"engines\": {\n        \"bare\": \">=1.14.0\"\n      }\n    },\n    \"node_modules/bare-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==\",\n      \"dependencies\": {\n        \"bare-os\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/bare-stream\": {\n      \"version\": \"2.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-2.12.0.tgz\",\n      \"integrity\": \"sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==\",\n      \"dependencies\": {\n        \"streamx\": \"^2.25.0\",\n        \"teex\": \"^1.0.1\"\n      },\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\",\n        \"bare-buffer\": \"*\",\n        \"bare-events\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        },\n        \"bare-buffer\": {\n          \"optional\": true\n        },\n        \"bare-events\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-url\": {\n      \"version\": \"2.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz\",\n      \"integrity\": \"sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==\",\n      \"dependencies\": {\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/base64-js\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz\",\n      \"integrity\": \"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/baseline-browser-mapping\": {\n      \"version\": \"2.10.17\",\n      \"resolved\": \"https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz\",\n      \"integrity\": \"sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==\",\n      \"bin\": {\n        \"baseline-browser-mapping\": \"dist/cli.cjs\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/basic-ftp\": {\n      \"version\": \"5.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.2.tgz\",\n      \"integrity\": \"sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw==\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/bl\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bl/-/bl-4.1.0.tgz\",\n      \"integrity\": \"sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==\",\n      \"dependencies\": {\n        \"buffer\": \"^5.5.0\",\n        \"inherits\": \"^2.0.4\",\n        \"readable-stream\": \"^3.4.0\"\n      }\n    },\n    \"node_modules/brace-expansion\": {\n      \"version\": \"5.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz\",\n      \"integrity\": \"sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^4.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/braces\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/braces/-/braces-3.0.3.tgz\",\n      \"integrity\": \"sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==\",\n      \"dependencies\": {\n        \"fill-range\": \"^7.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/browserslist\": {\n      \"version\": \"4.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz\",\n      \"integrity\": \"sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==\",\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/browserslist\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"baseline-browser-mapping\": \"^2.10.12\",\n        \"caniuse-lite\": \"^1.0.30001782\",\n        \"electron-to-chromium\": \"^1.5.328\",\n        \"node-releases\": \"^2.0.36\",\n        \"update-browserslist-db\": \"^1.2.3\"\n      },\n      \"bin\": {\n        \"browserslist\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n      }\n    },\n    \"node_modules/buffer\": {\n      \"version\": \"5.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz\",\n      \"integrity\": \"sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.1.13\"\n      }\n    },\n    \"node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/callsites\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz\",\n      \"integrity\": \"sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/caniuse-lite\": {\n      \"version\": \"1.0.30001787\",\n      \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz\",\n      \"integrity\": \"sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==\",\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/browserslist\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ]\n    },\n    \"node_modules/ccount\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz\",\n      \"integrity\": \"sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/chalk\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n      \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.1.0\",\n        \"supports-color\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/chalk/node_modules/supports-color\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n      \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/character-entities-html4\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz\",\n      \"integrity\": \"sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/character-entities-legacy\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz\",\n      \"integrity\": \"sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/chromium-bidi\": {\n      \"version\": \"14.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz\",\n      \"integrity\": \"sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==\",\n      \"dependencies\": {\n        \"mitt\": \"^3.0.1\",\n        \"zod\": \"^3.24.1\"\n      },\n      \"peerDependencies\": {\n        \"devtools-protocol\": \"*\"\n      }\n    },\n    \"node_modules/cliui\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz\",\n      \"integrity\": \"sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==\",\n      \"dependencies\": {\n        \"string-width\": \"^4.2.0\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"wrap-ansi\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\"\n    },\n    \"node_modules/colorette\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz\",\n      \"integrity\": \"sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==\"\n    },\n    \"node_modules/colors\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/colors/-/colors-1.1.2.tgz\",\n      \"integrity\": \"sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==\",\n      \"engines\": {\n        \"node\": \">=0.1.90\"\n      }\n    },\n    \"node_modules/combined-stream\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n      \"dependencies\": {\n        \"delayed-stream\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/comma-separated-tokens\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz\",\n      \"integrity\": \"sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/commander\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-7.2.0.tgz\",\n      \"integrity\": \"sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==\",\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/commondir\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz\",\n      \"integrity\": \"sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==\"\n    },\n    \"node_modules/compress-commons\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz\",\n      \"integrity\": \"sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==\",\n      \"dependencies\": {\n        \"buffer-crc32\": \"^0.2.13\",\n        \"crc32-stream\": \"^4.0.2\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/concat-map\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz\",\n      \"integrity\": \"sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==\"\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\"\n    },\n    \"node_modules/cosmiconfig\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz\",\n      \"integrity\": \"sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==\",\n      \"dependencies\": {\n        \"env-paths\": \"^2.2.1\",\n        \"import-fresh\": \"^3.3.0\",\n        \"js-yaml\": \"^4.1.0\",\n        \"parse-json\": \"^5.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/d-fischer\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.9.5\"\n      },\n      \"peerDependenciesMeta\": {\n        \"typescript\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/crc-32\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz\",\n      \"integrity\": \"sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==\",\n      \"bin\": {\n        \"crc32\": \"bin/crc32.njs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/crc32-stream\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz\",\n      \"integrity\": \"sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"readable-stream\": \"^3.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n      \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/csstype\": {\n      \"version\": \"3.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz\",\n      \"integrity\": \"sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==\"\n    },\n    \"node_modules/data-uri-to-buffer\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz\",\n      \"integrity\": \"sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==\",\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/dateformat\": {\n      \"version\": \"4.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz\",\n      \"integrity\": \"sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/decode-uri-component\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz\",\n      \"integrity\": \"sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==\",\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/deep-is\": {\n      \"version\": \"0.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz\",\n      \"integrity\": \"sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==\",\n      \"peer\": true\n    },\n    \"node_modules/deepmerge\": {\n      \"version\": \"4.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz\",\n      \"integrity\": \"sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/degenerator\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz\",\n      \"integrity\": \"sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==\",\n      \"dependencies\": {\n        \"ast-types\": \"^0.13.4\",\n        \"escodegen\": \"^2.1.0\",\n        \"esprima\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/delayed-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/depd\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/depd/-/depd-2.0.0.tgz\",\n      \"integrity\": \"sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/dequal\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz\",\n      \"integrity\": \"sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/destroy\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz\",\n      \"integrity\": \"sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==\",\n      \"engines\": {\n        \"node\": \">= 0.8\",\n        \"npm\": \"1.2.8000 || >= 1.4.16\"\n      }\n    },\n    \"node_modules/detect-file\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz\",\n      \"integrity\": \"sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/devlop\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz\",\n      \"integrity\": \"sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==\",\n      \"dependencies\": {\n        \"dequal\": \"^2.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/devtools-protocol\": {\n      \"version\": \"0.0.1581282\",\n      \"resolved\": \"https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz\",\n      \"integrity\": \"sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==\"\n    },\n    \"node_modules/diff\": {\n      \"version\": \"8.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-8.0.4.tgz\",\n      \"integrity\": \"sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==\",\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/dir-glob\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz\",\n      \"integrity\": \"sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==\",\n      \"dependencies\": {\n        \"path-type\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/doctrine\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz\",\n      \"integrity\": \"sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"esutils\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/ee-first\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz\",\n      \"integrity\": \"sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==\"\n    },\n    \"node_modules/electron-to-chromium\": {\n      \"version\": \"1.5.334\",\n      \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.334.tgz\",\n      \"integrity\": \"sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==\"\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\"\n    },\n    \"node_modules/emoji-regex-xs\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz\",\n      \"integrity\": \"sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==\"\n    },\n    \"node_modules/encodeurl\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n      \"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/end-of-stream\": {\n      \"version\": \"1.4.5\",\n      \"resolved\": \"https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz\",\n      \"integrity\": \"sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==\",\n      \"dependencies\": {\n        \"once\": \"^1.4.0\"\n      }\n    },\n    \"node_modules/entities\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/entities/-/entities-4.5.0.tgz\",\n      \"integrity\": \"sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==\",\n      \"engines\": {\n        \"node\": \">=0.12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/fb55/entities?sponsor=1\"\n      }\n    },\n    \"node_modules/env-paths\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz\",\n      \"integrity\": \"sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/error-ex\": {\n      \"version\": \"1.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz\",\n      \"integrity\": \"sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==\",\n      \"dependencies\": {\n        \"is-arrayish\": \"^0.2.1\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-set-tostringtag\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.6\",\n        \"has-tostringtag\": \"^1.0.2\",\n        \"hasown\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/escalade\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/escape-html\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz\",\n      \"integrity\": \"sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==\"\n    },\n    \"node_modules/escape-string-regexp\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz\",\n      \"integrity\": \"sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/escodegen\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz\",\n      \"integrity\": \"sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==\",\n      \"dependencies\": {\n        \"esprima\": \"^4.0.1\",\n        \"estraverse\": \"^5.2.0\",\n        \"esutils\": \"^2.0.2\"\n      },\n      \"bin\": {\n        \"escodegen\": \"bin/escodegen.js\",\n        \"esgenerate\": \"bin/esgenerate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"optionalDependencies\": {\n        \"source-map\": \"~0.6.1\"\n      }\n    },\n    \"node_modules/eslint\": {\n      \"version\": \"8.57.1\",\n      \"resolved\": \"https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz\",\n      \"integrity\": \"sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==\",\n      \"deprecated\": \"This version is no longer supported. Please see https://eslint.org/version-support for other options.\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"@eslint-community/eslint-utils\": \"^4.2.0\",\n        \"@eslint-community/regexpp\": \"^4.6.1\",\n        \"@eslint/eslintrc\": \"^2.1.4\",\n        \"@eslint/js\": \"8.57.1\",\n        \"@humanwhocodes/config-array\": \"^0.13.0\",\n        \"@humanwhocodes/module-importer\": \"^1.0.1\",\n        \"@nodelib/fs.walk\": \"^1.2.8\",\n        \"@ungap/structured-clone\": \"^1.2.0\",\n        \"ajv\": \"^6.12.4\",\n        \"chalk\": \"^4.0.0\",\n        \"cross-spawn\": \"^7.0.2\",\n        \"debug\": \"^4.3.2\",\n        \"doctrine\": \"^3.0.0\",\n        \"escape-string-regexp\": \"^4.0.0\",\n        \"eslint-scope\": \"^7.2.2\",\n        \"eslint-visitor-keys\": \"^3.4.3\",\n        \"espree\": \"^9.6.1\",\n        \"esquery\": \"^1.4.2\",\n        \"esutils\": \"^2.0.2\",\n        \"fast-deep-equal\": \"^3.1.3\",\n        \"file-entry-cache\": \"^6.0.1\",\n        \"find-up\": \"^5.0.0\",\n        \"glob-parent\": \"^6.0.2\",\n        \"globals\": \"^13.19.0\",\n        \"graphemer\": \"^1.4.0\",\n        \"ignore\": \"^5.2.0\",\n        \"imurmurhash\": \"^0.1.4\",\n        \"is-glob\": \"^4.0.0\",\n        \"is-path-inside\": \"^3.0.3\",\n        \"js-yaml\": \"^4.1.0\",\n        \"json-stable-stringify-without-jsonify\": \"^1.0.1\",\n        \"levn\": \"^0.4.1\",\n        \"lodash.merge\": \"^4.6.2\",\n        \"minimatch\": \"^3.1.2\",\n        \"natural-compare\": \"^1.4.0\",\n        \"optionator\": \"^0.9.3\",\n        \"strip-ansi\": \"^6.0.1\",\n        \"text-table\": \"^0.2.0\"\n      },\n      \"bin\": {\n        \"eslint\": \"bin/eslint.js\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint-formatter-codeframe\": {\n      \"version\": \"7.32.2\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.2.tgz\",\n      \"integrity\": \"sha512-0X5vEQeNniQRbGm+ec9Ow6LWj4RqZEcjPSfZ+t8qLPWqwyaBa67GrNetTxd0aYKoHrpbZeoRRlvA2gz9HujiEg==\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"7.12.11\",\n        \"chalk\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^10.12.0 || >=12.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint-plugin-security\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-4.0.0.tgz\",\n      \"integrity\": \"sha512-tfuQT8K/Li1ZxhFzyD8wPIKtlzZxqBcPr9q0jFMQ77wWAbKBVEhaMPVQRTMTvCMUDhwBe5vPVqQPwAGk/ASfxQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"safe-regex\": \"^2.1.1\"\n      },\n      \"engines\": {\n        \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint-scope\": {\n      \"version\": \"7.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz\",\n      \"integrity\": \"sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"esrecurse\": \"^4.3.0\",\n        \"estraverse\": \"^5.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint-visitor-keys\": {\n      \"version\": \"3.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz\",\n      \"integrity\": \"sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/eslint/node_modules/ajv\": {\n      \"version\": \"6.14.0\",\n      \"resolved\": \"https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz\",\n      \"integrity\": \"sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"fast-deep-equal\": \"^3.1.1\",\n        \"fast-json-stable-stringify\": \"^2.0.0\",\n        \"json-schema-traverse\": \"^0.4.1\",\n        \"uri-js\": \"^4.2.2\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/epoberezkin\"\n      }\n    },\n    \"node_modules/eslint/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"peer\": true\n    },\n    \"node_modules/eslint/node_modules/brace-expansion\": {\n      \"version\": \"1.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz\",\n      \"integrity\": \"sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\",\n        \"concat-map\": \"0.0.1\"\n      }\n    },\n    \"node_modules/eslint/node_modules/ignore\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz\",\n      \"integrity\": \"sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/eslint/node_modules/json-schema-traverse\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz\",\n      \"integrity\": \"sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==\",\n      \"peer\": true\n    },\n    \"node_modules/eslint/node_modules/minimatch\": {\n      \"version\": \"3.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz\",\n      \"integrity\": \"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"brace-expansion\": \"^1.1.7\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/espree\": {\n      \"version\": \"9.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/espree/-/espree-9.6.1.tgz\",\n      \"integrity\": \"sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"acorn\": \"^8.9.0\",\n        \"acorn-jsx\": \"^5.3.2\",\n        \"eslint-visitor-keys\": \"^3.4.1\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/eslint\"\n      }\n    },\n    \"node_modules/esprima\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz\",\n      \"integrity\": \"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==\",\n      \"bin\": {\n        \"esparse\": \"bin/esparse.js\",\n        \"esvalidate\": \"bin/esvalidate.js\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/esquery\": {\n      \"version\": \"1.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz\",\n      \"integrity\": \"sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"estraverse\": \"^5.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/esrecurse\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz\",\n      \"integrity\": \"sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"estraverse\": \"^5.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/estraverse\": {\n      \"version\": \"5.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz\",\n      \"integrity\": \"sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==\",\n      \"engines\": {\n        \"node\": \">=4.0\"\n      }\n    },\n    \"node_modules/estree-walker\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz\",\n      \"integrity\": \"sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==\"\n    },\n    \"node_modules/esutils\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz\",\n      \"integrity\": \"sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/etag\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/etag/-/etag-1.8.1.tgz\",\n      \"integrity\": \"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/eventemitter2\": {\n      \"version\": \"0.4.14\",\n      \"resolved\": \"https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz\",\n      \"integrity\": \"sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==\"\n    },\n    \"node_modules/events-universal\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz\",\n      \"integrity\": \"sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.7.0\"\n      }\n    },\n    \"node_modules/exit\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/exit/-/exit-0.1.2.tgz\",\n      \"integrity\": \"sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==\",\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/expand-tilde\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz\",\n      \"integrity\": \"sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==\",\n      \"dependencies\": {\n        \"homedir-polyfill\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/extend\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/extend/-/extend-3.0.2.tgz\",\n      \"integrity\": \"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==\"\n    },\n    \"node_modules/extract-zip\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz\",\n      \"integrity\": \"sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==\",\n      \"dependencies\": {\n        \"debug\": \"^4.1.1\",\n        \"get-stream\": \"^5.1.0\",\n        \"yauzl\": \"^2.10.0\"\n      },\n      \"bin\": {\n        \"extract-zip\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.17.0\"\n      },\n      \"optionalDependencies\": {\n        \"@types/yauzl\": \"^2.9.1\"\n      }\n    },\n    \"node_modules/fast-deep-equal\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz\",\n      \"integrity\": \"sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==\"\n    },\n    \"node_modules/fast-fifo\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz\",\n      \"integrity\": \"sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==\"\n    },\n    \"node_modules/fast-glob\": {\n      \"version\": \"3.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz\",\n      \"integrity\": \"sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==\",\n      \"dependencies\": {\n        \"@nodelib/fs.stat\": \"^2.0.2\",\n        \"@nodelib/fs.walk\": \"^1.2.3\",\n        \"glob-parent\": \"^5.1.2\",\n        \"merge2\": \"^1.3.0\",\n        \"micromatch\": \"^4.0.8\"\n      },\n      \"engines\": {\n        \"node\": \">=8.6.0\"\n      }\n    },\n    \"node_modules/fast-glob/node_modules/glob-parent\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz\",\n      \"integrity\": \"sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==\",\n      \"dependencies\": {\n        \"is-glob\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/fast-json-stable-stringify\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz\",\n      \"integrity\": \"sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==\",\n      \"peer\": true\n    },\n    \"node_modules/fast-levenshtein\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz\",\n      \"integrity\": \"sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==\",\n      \"peer\": true\n    },\n    \"node_modules/fast-uri\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz\",\n      \"integrity\": \"sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/fastify\"\n        },\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/fastify\"\n        }\n      ]\n    },\n    \"node_modules/fastq\": {\n      \"version\": \"1.20.1\",\n      \"resolved\": \"https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz\",\n      \"integrity\": \"sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==\",\n      \"dependencies\": {\n        \"reusify\": \"^1.0.4\"\n      }\n    },\n    \"node_modules/fd-slicer\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz\",\n      \"integrity\": \"sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==\",\n      \"dependencies\": {\n        \"pend\": \"~1.2.0\"\n      }\n    },\n    \"node_modules/fdir\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz\",\n      \"integrity\": \"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"picomatch\": \"^3 || ^4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"picomatch\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/file-entry-cache\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz\",\n      \"integrity\": \"sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"flat-cache\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^10.12.0 || >=12.0.0\"\n      }\n    },\n    \"node_modules/file-saver\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz\",\n      \"integrity\": \"sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==\"\n    },\n    \"node_modules/fill-range\": {\n      \"version\": \"7.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz\",\n      \"integrity\": \"sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==\",\n      \"dependencies\": {\n        \"to-regex-range\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/finalhandler\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz\",\n      \"integrity\": \"sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==\",\n      \"dependencies\": {\n        \"debug\": \"2.6.9\",\n        \"encodeurl\": \"~2.0.0\",\n        \"escape-html\": \"~1.0.3\",\n        \"on-finished\": \"~2.4.1\",\n        \"parseurl\": \"~1.3.3\",\n        \"statuses\": \"~2.0.2\",\n        \"unpipe\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/finalhandler/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/finalhandler/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\"\n    },\n    \"node_modules/find-up\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz\",\n      \"integrity\": \"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"locate-path\": \"^6.0.0\",\n        \"path-exists\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/findup-sync\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz\",\n      \"integrity\": \"sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==\",\n      \"dependencies\": {\n        \"detect-file\": \"^1.0.0\",\n        \"is-glob\": \"^4.0.3\",\n        \"micromatch\": \"^4.0.4\",\n        \"resolve-dir\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      }\n    },\n    \"node_modules/fined\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/fined/-/fined-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==\",\n      \"dependencies\": {\n        \"expand-tilde\": \"^2.0.2\",\n        \"is-plain-object\": \"^2.0.3\",\n        \"object.defaults\": \"^1.1.0\",\n        \"object.pick\": \"^1.2.0\",\n        \"parse-filepath\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/flagged-respawn\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz\",\n      \"integrity\": \"sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==\",\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/flat-cache\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz\",\n      \"integrity\": \"sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"flatted\": \"^3.2.9\",\n        \"keyv\": \"^4.5.3\",\n        \"rimraf\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"^10.12.0 || >=12.0.0\"\n      }\n    },\n    \"node_modules/flatted\": {\n      \"version\": \"3.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz\",\n      \"integrity\": \"sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==\",\n      \"peer\": true\n    },\n    \"node_modules/for-in\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz\",\n      \"integrity\": \"sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/for-own\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz\",\n      \"integrity\": \"sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==\",\n      \"dependencies\": {\n        \"for-in\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/form-data\": {\n      \"version\": \"2.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz\",\n      \"integrity\": \"sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==\",\n      \"dependencies\": {\n        \"asynckit\": \"^0.4.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"es-set-tostringtag\": \"^2.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"mime-types\": \"^2.1.35\",\n        \"safe-buffer\": \"^5.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.12\"\n      }\n    },\n    \"node_modules/fresh\": {\n      \"version\": \"0.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz\",\n      \"integrity\": \"sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/fs-constants\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz\",\n      \"integrity\": \"sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==\"\n    },\n    \"node_modules/fs-extra\": {\n      \"version\": \"11.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz\",\n      \"integrity\": \"sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^6.0.1\",\n        \"universalify\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.14\"\n      }\n    },\n    \"node_modules/fs.realpath\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz\",\n      \"integrity\": \"sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==\"\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-caller-file\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n      \"engines\": {\n        \"node\": \"6.* || 8.* || >= 10.*\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/get-stream\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz\",\n      \"integrity\": \"sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/get-uri\": {\n      \"version\": \"6.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz\",\n      \"integrity\": \"sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==\",\n      \"dependencies\": {\n        \"basic-ftp\": \"^5.0.2\",\n        \"data-uri-to-buffer\": \"^6.0.2\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/getobject\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz\",\n      \"integrity\": \"sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/glob\": {\n      \"version\": \"7.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.2.3.tgz\",\n      \"integrity\": \"sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==\",\n      \"deprecated\": \"Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me\",\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.1.1\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/glob-parent\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz\",\n      \"integrity\": \"sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"is-glob\": \"^4.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=10.13.0\"\n      }\n    },\n    \"node_modules/glob/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\"\n    },\n    \"node_modules/glob/node_modules/brace-expansion\": {\n      \"version\": \"1.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz\",\n      \"integrity\": \"sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\",\n        \"concat-map\": \"0.0.1\"\n      }\n    },\n    \"node_modules/glob/node_modules/minimatch\": {\n      \"version\": \"3.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz\",\n      \"integrity\": \"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^1.1.7\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/global-modules\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz\",\n      \"integrity\": \"sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==\",\n      \"dependencies\": {\n        \"global-prefix\": \"^1.0.1\",\n        \"is-windows\": \"^1.0.1\",\n        \"resolve-dir\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/global-prefix\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz\",\n      \"integrity\": \"sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==\",\n      \"dependencies\": {\n        \"expand-tilde\": \"^2.0.2\",\n        \"homedir-polyfill\": \"^1.0.1\",\n        \"ini\": \"^1.3.4\",\n        \"is-windows\": \"^1.0.1\",\n        \"which\": \"^1.2.14\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/global-prefix/node_modules/which\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\n      \"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"which\": \"bin/which\"\n      }\n    },\n    \"node_modules/globals\": {\n      \"version\": \"13.24.0\",\n      \"resolved\": \"https://registry.npmjs.org/globals/-/globals-13.24.0.tgz\",\n      \"integrity\": \"sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"type-fest\": \"^0.20.2\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/globalyzer\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz\",\n      \"integrity\": \"sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==\"\n    },\n    \"node_modules/globby\": {\n      \"version\": \"11.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/globby/-/globby-11.1.0.tgz\",\n      \"integrity\": \"sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==\",\n      \"dependencies\": {\n        \"array-union\": \"^2.1.0\",\n        \"dir-glob\": \"^3.0.1\",\n        \"fast-glob\": \"^3.2.9\",\n        \"ignore\": \"^5.2.0\",\n        \"merge2\": \"^1.4.1\",\n        \"slash\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/globby/node_modules/ignore\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz\",\n      \"integrity\": \"sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==\",\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/globrex\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz\",\n      \"integrity\": \"sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==\"\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\"\n    },\n    \"node_modules/graphemer\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz\",\n      \"integrity\": \"sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==\",\n      \"peer\": true\n    },\n    \"node_modules/grunt\": {\n      \"version\": \"1.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz\",\n      \"integrity\": \"sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==\",\n      \"dependencies\": {\n        \"dateformat\": \"~4.6.2\",\n        \"eventemitter2\": \"~0.4.13\",\n        \"exit\": \"~0.1.2\",\n        \"findup-sync\": \"~5.0.0\",\n        \"glob\": \"~7.1.6\",\n        \"grunt-cli\": \"~1.4.3\",\n        \"grunt-known-options\": \"~2.0.0\",\n        \"grunt-legacy-log\": \"~3.0.0\",\n        \"grunt-legacy-util\": \"~2.0.1\",\n        \"iconv-lite\": \"~0.6.3\",\n        \"js-yaml\": \"~3.14.0\",\n        \"minimatch\": \"~3.0.4\",\n        \"nopt\": \"~3.0.6\"\n      },\n      \"bin\": {\n        \"grunt\": \"bin/grunt\"\n      },\n      \"engines\": {\n        \"node\": \">=16\"\n      }\n    },\n    \"node_modules/grunt-cli\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.5.0.tgz\",\n      \"integrity\": \"sha512-rILKAFoU0dzlf22SUfDtq2R1fosChXXlJM5j7wI6uoW8gwmXDXzbUvirlKZSYCdXl3LXFbR+8xyS+WFo+b6vlA==\",\n      \"dependencies\": {\n        \"grunt-known-options\": \"~2.0.0\",\n        \"interpret\": \"~1.1.0\",\n        \"liftup\": \"~3.0.1\",\n        \"nopt\": \"~5.0.0\",\n        \"v8flags\": \"^4.0.1\"\n      },\n      \"bin\": {\n        \"grunt\": \"bin/grunt\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/grunt-cli/node_modules/nopt\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz\",\n      \"integrity\": \"sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==\",\n      \"dependencies\": {\n        \"abbrev\": \"1\"\n      },\n      \"bin\": {\n        \"nopt\": \"bin/nopt.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/grunt-known-options\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz\",\n      \"integrity\": \"sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/grunt-legacy-log\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz\",\n      \"integrity\": \"sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==\",\n      \"dependencies\": {\n        \"colors\": \"~1.1.2\",\n        \"grunt-legacy-log-utils\": \"~2.1.0\",\n        \"hooker\": \"~0.2.3\",\n        \"lodash\": \"~4.17.19\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/grunt-legacy-log-utils\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.3.tgz\",\n      \"integrity\": \"sha512-sgG+QvKmdb44wZyzJP+ejDsy3jYxG2wzohpol+JTMlXqMUBDoZb01JPQ5jKAedtZBFwhmABAc88T9hEBLy3U+Q==\",\n      \"dependencies\": {\n        \"chalk\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/grunt-legacy-log/node_modules/lodash\": {\n      \"version\": \"4.17.23\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz\",\n      \"integrity\": \"sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==\"\n    },\n    \"node_modules/grunt-legacy-util\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz\",\n      \"integrity\": \"sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==\",\n      \"dependencies\": {\n        \"async\": \"~3.2.0\",\n        \"exit\": \"~0.1.2\",\n        \"getobject\": \"~1.0.0\",\n        \"hooker\": \"~0.2.3\",\n        \"lodash\": \"~4.17.21\",\n        \"underscore.string\": \"~3.3.5\",\n        \"which\": \"~2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/grunt-legacy-util/node_modules/lodash\": {\n      \"version\": \"4.17.23\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz\",\n      \"integrity\": \"sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==\"\n    },\n    \"node_modules/grunt/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\"\n    },\n    \"node_modules/grunt/node_modules/brace-expansion\": {\n      \"version\": \"1.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz\",\n      \"integrity\": \"sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\",\n        \"concat-map\": \"0.0.1\"\n      }\n    },\n    \"node_modules/grunt/node_modules/glob\": {\n      \"version\": \"7.1.7\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-7.1.7.tgz\",\n      \"integrity\": \"sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==\",\n      \"deprecated\": \"Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me\",\n      \"dependencies\": {\n        \"fs.realpath\": \"^1.0.0\",\n        \"inflight\": \"^1.0.4\",\n        \"inherits\": \"2\",\n        \"minimatch\": \"^3.0.4\",\n        \"once\": \"^1.3.0\",\n        \"path-is-absolute\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/grunt/node_modules/grunt-cli\": {\n      \"version\": \"1.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz\",\n      \"integrity\": \"sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==\",\n      \"dependencies\": {\n        \"grunt-known-options\": \"~2.0.0\",\n        \"interpret\": \"~1.1.0\",\n        \"liftup\": \"~3.0.1\",\n        \"nopt\": \"~4.0.1\",\n        \"v8flags\": \"~3.2.0\"\n      },\n      \"bin\": {\n        \"grunt\": \"bin/grunt\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/grunt/node_modules/grunt-cli/node_modules/nopt\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz\",\n      \"integrity\": \"sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==\",\n      \"dependencies\": {\n        \"abbrev\": \"1\",\n        \"osenv\": \"^0.1.4\"\n      },\n      \"bin\": {\n        \"nopt\": \"bin/nopt.js\"\n      }\n    },\n    \"node_modules/grunt/node_modules/js-yaml\": {\n      \"version\": \"3.14.2\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz\",\n      \"integrity\": \"sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==\",\n      \"dependencies\": {\n        \"argparse\": \"^1.0.7\",\n        \"esprima\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/grunt/node_modules/minimatch\": {\n      \"version\": \"3.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz\",\n      \"integrity\": \"sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^1.1.7\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/grunt/node_modules/v8flags\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz\",\n      \"integrity\": \"sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==\",\n      \"dependencies\": {\n        \"homedir-polyfill\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/has-flag\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n      \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-tostringtag\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\n      \"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\n      \"dependencies\": {\n        \"has-symbols\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz\",\n      \"integrity\": \"sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/hast-util-to-html\": {\n      \"version\": \"9.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz\",\n      \"integrity\": \"sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==\",\n      \"dependencies\": {\n        \"@types/hast\": \"^3.0.0\",\n        \"@types/unist\": \"^3.0.0\",\n        \"ccount\": \"^2.0.0\",\n        \"comma-separated-tokens\": \"^2.0.0\",\n        \"hast-util-whitespace\": \"^3.0.0\",\n        \"html-void-elements\": \"^3.0.0\",\n        \"mdast-util-to-hast\": \"^13.0.0\",\n        \"property-information\": \"^7.0.0\",\n        \"space-separated-tokens\": \"^2.0.0\",\n        \"stringify-entities\": \"^4.0.0\",\n        \"zwitch\": \"^2.0.4\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/hast-util-whitespace\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz\",\n      \"integrity\": \"sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==\",\n      \"dependencies\": {\n        \"@types/hast\": \"^3.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/homedir-polyfill\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz\",\n      \"integrity\": \"sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==\",\n      \"dependencies\": {\n        \"parse-passwd\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/hooker\": {\n      \"version\": \"0.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz\",\n      \"integrity\": \"sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/html-void-elements\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz\",\n      \"integrity\": \"sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/http-errors\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz\",\n      \"integrity\": \"sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==\",\n      \"dependencies\": {\n        \"depd\": \"~2.0.0\",\n        \"inherits\": \"~2.0.4\",\n        \"setprototypeof\": \"~1.2.0\",\n        \"statuses\": \"~2.0.2\",\n        \"toidentifier\": \"~1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/http-proxy-agent\": {\n      \"version\": \"7.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz\",\n      \"integrity\": \"sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.0\",\n        \"debug\": \"^4.3.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/https-proxy-agent\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz\",\n      \"integrity\": \"sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"4\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz\",\n      \"integrity\": \"sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/ieee754\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz\",\n      \"integrity\": \"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/ignore\": {\n      \"version\": \"7.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz\",\n      \"integrity\": \"sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/import-fresh\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz\",\n      \"integrity\": \"sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==\",\n      \"dependencies\": {\n        \"parent-module\": \"^1.0.0\",\n        \"resolve-from\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/import-lazy\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz\",\n      \"integrity\": \"sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/imurmurhash\": {\n      \"version\": \"0.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz\",\n      \"integrity\": \"sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=0.8.19\"\n      }\n    },\n    \"node_modules/inflight\": {\n      \"version\": \"1.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz\",\n      \"integrity\": \"sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==\",\n      \"deprecated\": \"This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.\",\n      \"dependencies\": {\n        \"once\": \"^1.3.0\",\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\"\n    },\n    \"node_modules/ini\": {\n      \"version\": \"1.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-1.3.8.tgz\",\n      \"integrity\": \"sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==\"\n    },\n    \"node_modules/interpret\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz\",\n      \"integrity\": \"sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==\"\n    },\n    \"node_modules/ip-address\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz\",\n      \"integrity\": \"sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==\",\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/is-absolute\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz\",\n      \"integrity\": \"sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==\",\n      \"dependencies\": {\n        \"is-relative\": \"^1.0.0\",\n        \"is-windows\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-arrayish\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz\",\n      \"integrity\": \"sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==\"\n    },\n    \"node_modules/is-core-module\": {\n      \"version\": \"2.16.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz\",\n      \"integrity\": \"sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==\",\n      \"dependencies\": {\n        \"hasown\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/is-extglob\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz\",\n      \"integrity\": \"sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-glob\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz\",\n      \"integrity\": \"sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==\",\n      \"dependencies\": {\n        \"is-extglob\": \"^2.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-module\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz\",\n      \"integrity\": \"sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==\"\n    },\n    \"node_modules/is-number\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz\",\n      \"integrity\": \"sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==\",\n      \"engines\": {\n        \"node\": \">=0.12.0\"\n      }\n    },\n    \"node_modules/is-path-inside\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz\",\n      \"integrity\": \"sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-plain-object\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz\",\n      \"integrity\": \"sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==\",\n      \"dependencies\": {\n        \"isobject\": \"^3.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-reference\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz\",\n      \"integrity\": \"sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==\",\n      \"dependencies\": {\n        \"@types/estree\": \"*\"\n      }\n    },\n    \"node_modules/is-relative\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz\",\n      \"integrity\": \"sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==\",\n      \"dependencies\": {\n        \"is-unc-path\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-unc-path\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz\",\n      \"integrity\": \"sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==\",\n      \"dependencies\": {\n        \"unc-path-regex\": \"^0.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/is-windows\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz\",\n      \"integrity\": \"sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/isarray\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz\",\n      \"integrity\": \"sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==\"\n    },\n    \"node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\"\n    },\n    \"node_modules/isobject\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz\",\n      \"integrity\": \"sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/jju\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/jju/-/jju-1.4.0.tgz\",\n      \"integrity\": \"sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==\"\n    },\n    \"node_modules/js-cleanup\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz\",\n      \"integrity\": \"sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==\",\n      \"dependencies\": {\n        \"magic-string\": \"^0.25.7\",\n        \"perf-regexes\": \"^1.0.1\",\n        \"skip-regex\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"^10.14.2 || >=12.0.0\"\n      }\n    },\n    \"node_modules/js-tokens\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n    },\n    \"node_modules/js-yaml\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz\",\n      \"integrity\": \"sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==\",\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\"\n      },\n      \"bin\": {\n        \"js-yaml\": \"bin/js-yaml.js\"\n      }\n    },\n    \"node_modules/js-yaml/node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\"\n    },\n    \"node_modules/json-buffer\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz\",\n      \"integrity\": \"sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==\",\n      \"peer\": true\n    },\n    \"node_modules/json-parse-even-better-errors\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz\",\n      \"integrity\": \"sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==\"\n    },\n    \"node_modules/json-schema-traverse\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz\",\n      \"integrity\": \"sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==\"\n    },\n    \"node_modules/json-stable-stringify-without-jsonify\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz\",\n      \"integrity\": \"sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==\",\n      \"peer\": true\n    },\n    \"node_modules/jsonfile\": {\n      \"version\": \"6.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz\",\n      \"integrity\": \"sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==\",\n      \"dependencies\": {\n        \"universalify\": \"^2.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/just-extend\": {\n      \"version\": \"4.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz\",\n      \"integrity\": \"sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==\"\n    },\n    \"node_modules/keyv\": {\n      \"version\": \"4.5.4\",\n      \"resolved\": \"https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz\",\n      \"integrity\": \"sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"json-buffer\": \"3.0.1\"\n      }\n    },\n    \"node_modules/kind-of\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz\",\n      \"integrity\": \"sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/lazystream\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz\",\n      \"integrity\": \"sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==\",\n      \"dependencies\": {\n        \"readable-stream\": \"^2.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6.3\"\n      }\n    },\n    \"node_modules/lazystream/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\"\n    },\n    \"node_modules/lazystream/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/lazystream/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\"\n    },\n    \"node_modules/lazystream/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/levn\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/levn/-/levn-0.4.1.tgz\",\n      \"integrity\": \"sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"prelude-ls\": \"^1.2.1\",\n        \"type-check\": \"~0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/liftup\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz\",\n      \"integrity\": \"sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==\",\n      \"dependencies\": {\n        \"extend\": \"^3.0.2\",\n        \"findup-sync\": \"^4.0.0\",\n        \"fined\": \"^1.2.0\",\n        \"flagged-respawn\": \"^1.0.1\",\n        \"is-plain-object\": \"^2.0.4\",\n        \"object.map\": \"^1.0.1\",\n        \"rechoir\": \"^0.7.0\",\n        \"resolve\": \"^1.19.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/liftup/node_modules/findup-sync\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz\",\n      \"integrity\": \"sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==\",\n      \"dependencies\": {\n        \"detect-file\": \"^1.0.0\",\n        \"is-glob\": \"^4.0.0\",\n        \"micromatch\": \"^4.0.2\",\n        \"resolve-dir\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\"\n    },\n    \"node_modules/linkify-it\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz\",\n      \"integrity\": \"sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==\",\n      \"dependencies\": {\n        \"uc.micro\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/locate-path\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz\",\n      \"integrity\": \"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"p-locate\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/lodash\": {\n      \"version\": \"4.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz\",\n      \"integrity\": \"sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==\"\n    },\n    \"node_modules/lodash.defaults\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz\",\n      \"integrity\": \"sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==\"\n    },\n    \"node_modules/lodash.difference\": {\n      \"version\": \"4.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz\",\n      \"integrity\": \"sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==\"\n    },\n    \"node_modules/lodash.flatten\": {\n      \"version\": \"4.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz\",\n      \"integrity\": \"sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==\"\n    },\n    \"node_modules/lodash.isplainobject\": {\n      \"version\": \"4.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz\",\n      \"integrity\": \"sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==\"\n    },\n    \"node_modules/lodash.merge\": {\n      \"version\": \"4.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz\",\n      \"integrity\": \"sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==\",\n      \"peer\": true\n    },\n    \"node_modules/lodash.union\": {\n      \"version\": \"4.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz\",\n      \"integrity\": \"sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==\"\n    },\n    \"node_modules/lolex\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz\",\n      \"integrity\": \"sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==\"\n    },\n    \"node_modules/loose-envify\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n      \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n      \"dependencies\": {\n        \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n      },\n      \"bin\": {\n        \"loose-envify\": \"cli.js\"\n      }\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"7.18.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz\",\n      \"integrity\": \"sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/lunr\": {\n      \"version\": \"2.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz\",\n      \"integrity\": \"sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==\"\n    },\n    \"node_modules/magic-string\": {\n      \"version\": \"0.25.9\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz\",\n      \"integrity\": \"sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==\",\n      \"dependencies\": {\n        \"sourcemap-codec\": \"^1.4.8\"\n      }\n    },\n    \"node_modules/make-iterator\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz\",\n      \"integrity\": \"sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==\",\n      \"dependencies\": {\n        \"kind-of\": \"^6.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/map-cache\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz\",\n      \"integrity\": \"sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/markdown-it\": {\n      \"version\": \"14.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz\",\n      \"integrity\": \"sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==\",\n      \"dependencies\": {\n        \"argparse\": \"^2.0.1\",\n        \"entities\": \"^4.4.0\",\n        \"linkify-it\": \"^5.0.0\",\n        \"mdurl\": \"^2.0.0\",\n        \"punycode.js\": \"^2.3.1\",\n        \"uc.micro\": \"^2.1.0\"\n      },\n      \"bin\": {\n        \"markdown-it\": \"bin/markdown-it.mjs\"\n      }\n    },\n    \"node_modules/markdown-it/node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\"\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/mdast-util-to-hast\": {\n      \"version\": \"13.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz\",\n      \"integrity\": \"sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==\",\n      \"dependencies\": {\n        \"@types/hast\": \"^3.0.0\",\n        \"@types/mdast\": \"^4.0.0\",\n        \"@ungap/structured-clone\": \"^1.0.0\",\n        \"devlop\": \"^1.0.0\",\n        \"micromark-util-sanitize-uri\": \"^2.0.0\",\n        \"trim-lines\": \"^3.0.0\",\n        \"unist-util-position\": \"^5.0.0\",\n        \"unist-util-visit\": \"^5.0.0\",\n        \"vfile\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/mdurl\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz\",\n      \"integrity\": \"sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==\"\n    },\n    \"node_modules/merge2\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz\",\n      \"integrity\": \"sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==\",\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/micromark-util-character\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz\",\n      \"integrity\": \"sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==\",\n      \"funding\": [\n        {\n          \"type\": \"GitHub Sponsors\",\n          \"url\": \"https://github.com/sponsors/unifiedjs\"\n        },\n        {\n          \"type\": \"OpenCollective\",\n          \"url\": \"https://opencollective.com/unified\"\n        }\n      ],\n      \"dependencies\": {\n        \"micromark-util-symbol\": \"^2.0.0\",\n        \"micromark-util-types\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/micromark-util-encode\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz\",\n      \"integrity\": \"sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==\",\n      \"funding\": [\n        {\n          \"type\": \"GitHub Sponsors\",\n          \"url\": \"https://github.com/sponsors/unifiedjs\"\n        },\n        {\n          \"type\": \"OpenCollective\",\n          \"url\": \"https://opencollective.com/unified\"\n        }\n      ]\n    },\n    \"node_modules/micromark-util-sanitize-uri\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz\",\n      \"integrity\": \"sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==\",\n      \"funding\": [\n        {\n          \"type\": \"GitHub Sponsors\",\n          \"url\": \"https://github.com/sponsors/unifiedjs\"\n        },\n        {\n          \"type\": \"OpenCollective\",\n          \"url\": \"https://opencollective.com/unified\"\n        }\n      ],\n      \"dependencies\": {\n        \"micromark-util-character\": \"^2.0.0\",\n        \"micromark-util-encode\": \"^2.0.0\",\n        \"micromark-util-symbol\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/micromark-util-symbol\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz\",\n      \"integrity\": \"sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==\",\n      \"funding\": [\n        {\n          \"type\": \"GitHub Sponsors\",\n          \"url\": \"https://github.com/sponsors/unifiedjs\"\n        },\n        {\n          \"type\": \"OpenCollective\",\n          \"url\": \"https://opencollective.com/unified\"\n        }\n      ]\n    },\n    \"node_modules/micromark-util-types\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz\",\n      \"integrity\": \"sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==\",\n      \"funding\": [\n        {\n          \"type\": \"GitHub Sponsors\",\n          \"url\": \"https://github.com/sponsors/unifiedjs\"\n        },\n        {\n          \"type\": \"OpenCollective\",\n          \"url\": \"https://opencollective.com/unified\"\n        }\n      ]\n    },\n    \"node_modules/micromatch\": {\n      \"version\": \"4.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz\",\n      \"integrity\": \"sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==\",\n      \"dependencies\": {\n        \"braces\": \"^3.0.3\",\n        \"picomatch\": \"^2.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8.6\"\n      }\n    },\n    \"node_modules/micromatch/node_modules/picomatch\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz\",\n      \"integrity\": \"sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==\",\n      \"engines\": {\n        \"node\": \">=8.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/mime\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime/-/mime-1.6.0.tgz\",\n      \"integrity\": \"sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==\",\n      \"bin\": {\n        \"mime\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/mime-db\": {\n      \"version\": \"1.52.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\n      \"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/mime-types\": {\n      \"version\": \"2.1.35\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\n      \"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\n      \"dependencies\": {\n        \"mime-db\": \"1.52.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/minimatch\": {\n      \"version\": \"10.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz\",\n      \"integrity\": \"sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^5.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/mitt\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz\",\n      \"integrity\": \"sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==\"\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\"\n    },\n    \"node_modules/natural-compare\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz\",\n      \"integrity\": \"sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==\",\n      \"peer\": true\n    },\n    \"node_modules/netmask\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz\",\n      \"integrity\": \"sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==\",\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/nise\": {\n      \"version\": \"1.5.3\",\n      \"resolved\": \"https://registry.npmjs.org/nise/-/nise-1.5.3.tgz\",\n      \"integrity\": \"sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==\",\n      \"dependencies\": {\n        \"@sinonjs/formatio\": \"^3.2.1\",\n        \"@sinonjs/text-encoding\": \"^0.7.1\",\n        \"just-extend\": \"^4.0.2\",\n        \"lolex\": \"^5.0.1\",\n        \"path-to-regexp\": \"^1.7.0\"\n      }\n    },\n    \"node_modules/nise/node_modules/lolex\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz\",\n      \"integrity\": \"sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==\",\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^1.7.0\"\n      }\n    },\n    \"node_modules/node-releases\": {\n      \"version\": \"2.0.37\",\n      \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz\",\n      \"integrity\": \"sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==\"\n    },\n    \"node_modules/node-watch\": {\n      \"version\": \"0.7.3\",\n      \"resolved\": \"https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz\",\n      \"integrity\": \"sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/nopt\": {\n      \"version\": \"3.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz\",\n      \"integrity\": \"sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==\",\n      \"dependencies\": {\n        \"abbrev\": \"1\"\n      },\n      \"bin\": {\n        \"nopt\": \"bin/nopt.js\"\n      }\n    },\n    \"node_modules/normalize-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/normalize-range\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz\",\n      \"integrity\": \"sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/num2fraction\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz\",\n      \"integrity\": \"sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==\"\n    },\n    \"node_modules/object-assign\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n      \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/object.defaults\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz\",\n      \"integrity\": \"sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==\",\n      \"dependencies\": {\n        \"array-each\": \"^1.0.1\",\n        \"array-slice\": \"^1.0.0\",\n        \"for-own\": \"^1.0.0\",\n        \"isobject\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/object.map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz\",\n      \"integrity\": \"sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==\",\n      \"dependencies\": {\n        \"for-own\": \"^1.0.0\",\n        \"make-iterator\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/object.pick\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz\",\n      \"integrity\": \"sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==\",\n      \"dependencies\": {\n        \"isobject\": \"^3.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/on-finished\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz\",\n      \"integrity\": \"sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==\",\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/once\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n      \"dependencies\": {\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/oniguruma-to-es\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz\",\n      \"integrity\": \"sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==\",\n      \"dependencies\": {\n        \"emoji-regex-xs\": \"^1.0.0\",\n        \"regex\": \"^5.1.1\",\n        \"regex-recursion\": \"^5.1.1\"\n      }\n    },\n    \"node_modules/optionator\": {\n      \"version\": \"0.9.4\",\n      \"resolved\": \"https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz\",\n      \"integrity\": \"sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"deep-is\": \"^0.1.3\",\n        \"fast-levenshtein\": \"^2.0.6\",\n        \"levn\": \"^0.4.1\",\n        \"prelude-ls\": \"^1.2.1\",\n        \"type-check\": \"^0.4.0\",\n        \"word-wrap\": \"^1.2.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/os-homedir\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz\",\n      \"integrity\": \"sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/os-tmpdir\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz\",\n      \"integrity\": \"sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/osenv\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz\",\n      \"integrity\": \"sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==\",\n      \"deprecated\": \"This package is no longer supported.\",\n      \"dependencies\": {\n        \"os-homedir\": \"^1.0.0\",\n        \"os-tmpdir\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/p-limit\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz\",\n      \"integrity\": \"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"yocto-queue\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/p-locate\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz\",\n      \"integrity\": \"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"p-limit\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/pac-proxy-agent\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz\",\n      \"integrity\": \"sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==\",\n      \"dependencies\": {\n        \"@tootallnate/quickjs-emscripten\": \"^0.23.0\",\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"^4.3.4\",\n        \"get-uri\": \"^6.0.1\",\n        \"http-proxy-agent\": \"^7.0.0\",\n        \"https-proxy-agent\": \"^7.0.6\",\n        \"pac-resolver\": \"^7.0.1\",\n        \"socks-proxy-agent\": \"^8.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/pac-resolver\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz\",\n      \"integrity\": \"sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==\",\n      \"dependencies\": {\n        \"degenerator\": \"^5.0.0\",\n        \"netmask\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/pako\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/pako/-/pako-2.1.0.tgz\",\n      \"integrity\": \"sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==\"\n    },\n    \"node_modules/parent-module\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz\",\n      \"integrity\": \"sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==\",\n      \"dependencies\": {\n        \"callsites\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/parse-filepath\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz\",\n      \"integrity\": \"sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==\",\n      \"dependencies\": {\n        \"is-absolute\": \"^1.0.0\",\n        \"map-cache\": \"^0.2.0\",\n        \"path-root\": \"^0.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/parse-json\": {\n      \"version\": \"5.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz\",\n      \"integrity\": \"sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.0.0\",\n        \"error-ex\": \"^1.3.1\",\n        \"json-parse-even-better-errors\": \"^2.3.0\",\n        \"lines-and-columns\": \"^1.1.6\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/parse-passwd\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz\",\n      \"integrity\": \"sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/parseurl\": {\n      \"version\": \"1.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz\",\n      \"integrity\": \"sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/path-exists\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz\",\n      \"integrity\": \"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-is-absolute\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz\",\n      \"integrity\": \"sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-parse\": {\n      \"version\": \"1.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n      \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\"\n    },\n    \"node_modules/path-root\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz\",\n      \"integrity\": \"sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==\",\n      \"dependencies\": {\n        \"path-root-regex\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/path-root-regex\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz\",\n      \"integrity\": \"sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/path-to-regexp\": {\n      \"version\": \"1.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz\",\n      \"integrity\": \"sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==\",\n      \"dependencies\": {\n        \"isarray\": \"0.0.1\"\n      }\n    },\n    \"node_modules/path-type\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz\",\n      \"integrity\": \"sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/pend\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pend/-/pend-1.2.0.tgz\",\n      \"integrity\": \"sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==\"\n    },\n    \"node_modules/perf-regexes\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz\",\n      \"integrity\": \"sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==\",\n      \"engines\": {\n        \"node\": \">=6.14\"\n      }\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\"\n    },\n    \"node_modules/picomatch\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz\",\n      \"integrity\": \"sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/postcss\": {\n      \"version\": \"7.0.39\",\n      \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz\",\n      \"integrity\": \"sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==\",\n      \"dependencies\": {\n        \"picocolors\": \"^0.2.1\",\n        \"source-map\": \"^0.6.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/postcss/\"\n      }\n    },\n    \"node_modules/postcss-value-parser\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz\",\n      \"integrity\": \"sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==\"\n    },\n    \"node_modules/postcss/node_modules/picocolors\": {\n      \"version\": \"0.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz\",\n      \"integrity\": \"sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==\"\n    },\n    \"node_modules/prelude-ls\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz\",\n      \"integrity\": \"sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\"\n    },\n    \"node_modules/progress\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/progress/-/progress-2.0.3.tgz\",\n      \"integrity\": \"sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/property-information\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz\",\n      \"integrity\": \"sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/proxy-agent\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz\",\n      \"integrity\": \"sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"^4.3.4\",\n        \"http-proxy-agent\": \"^7.0.1\",\n        \"https-proxy-agent\": \"^7.0.6\",\n        \"lru-cache\": \"^7.14.1\",\n        \"pac-proxy-agent\": \"^7.1.0\",\n        \"proxy-from-env\": \"^1.1.0\",\n        \"socks-proxy-agent\": \"^8.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/proxy-from-env\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz\",\n      \"integrity\": \"sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==\"\n    },\n    \"node_modules/pump\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/pump/-/pump-3.0.4.tgz\",\n      \"integrity\": \"sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==\",\n      \"dependencies\": {\n        \"end-of-stream\": \"^1.1.0\",\n        \"once\": \"^1.3.1\"\n      }\n    },\n    \"node_modules/punycode\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz\",\n      \"integrity\": \"sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/punycode.js\": {\n      \"version\": \"2.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz\",\n      \"integrity\": \"sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/puppeteer\": {\n      \"version\": \"24.40.0\",\n      \"resolved\": \"https://registry.npmjs.org/puppeteer/-/puppeteer-24.40.0.tgz\",\n      \"integrity\": \"sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"@puppeteer/browsers\": \"2.13.0\",\n        \"chromium-bidi\": \"14.0.0\",\n        \"cosmiconfig\": \"^9.0.0\",\n        \"devtools-protocol\": \"0.0.1581282\",\n        \"puppeteer-core\": \"24.40.0\",\n        \"typed-query-selector\": \"^2.12.1\"\n      },\n      \"bin\": {\n        \"puppeteer\": \"lib/cjs/puppeteer/node/cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/puppeteer-core\": {\n      \"version\": \"24.40.0\",\n      \"resolved\": \"https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.40.0.tgz\",\n      \"integrity\": \"sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==\",\n      \"dependencies\": {\n        \"@puppeteer/browsers\": \"2.13.0\",\n        \"chromium-bidi\": \"14.0.0\",\n        \"debug\": \"^4.4.3\",\n        \"devtools-protocol\": \"0.0.1581282\",\n        \"typed-query-selector\": \"^2.12.1\",\n        \"webdriver-bidi-protocol\": \"0.4.1\",\n        \"ws\": \"^8.19.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/queue-microtask\": {\n      \"version\": \"1.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz\",\n      \"integrity\": \"sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/qunit\": {\n      \"version\": \"2.25.0\",\n      \"resolved\": \"https://registry.npmjs.org/qunit/-/qunit-2.25.0.tgz\",\n      \"integrity\": \"sha512-MONPKgjavgTqArCwZOEz8nEMbA19zNXIp5ZOW9rPYj5cbgQp0fiI36c9dPTSzTRRzx+KcfB5eggYB/ENqxi0+w==\",\n      \"dependencies\": {\n        \"commander\": \"7.2.0\",\n        \"node-watch\": \"0.7.3\",\n        \"tiny-glob\": \"0.2.9\"\n      },\n      \"bin\": {\n        \"qunit\": \"bin/qunit.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/range-parser\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz\",\n      \"integrity\": \"sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/react\": {\n      \"version\": \"17.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/react/-/react-17.0.2.tgz\",\n      \"integrity\": \"sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.1.0\",\n        \"object-assign\": \"^4.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/react-dom\": {\n      \"version\": \"17.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz\",\n      \"integrity\": \"sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.1.0\",\n        \"object-assign\": \"^4.1.1\",\n        \"scheduler\": \"^0.20.2\"\n      },\n      \"peerDependencies\": {\n        \"react\": \"17.0.2\"\n      }\n    },\n    \"node_modules/react-dom/node_modules/scheduler\": {\n      \"version\": \"0.20.2\",\n      \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz\",\n      \"integrity\": \"sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.1.0\",\n        \"object-assign\": \"^4.1.1\"\n      }\n    },\n    \"node_modules/react-is\": {\n      \"version\": \"16.13.1\",\n      \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n      \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n    },\n    \"node_modules/readable-stream\": {\n      \"version\": \"3.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz\",\n      \"integrity\": \"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==\",\n      \"dependencies\": {\n        \"inherits\": \"^2.0.3\",\n        \"string_decoder\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/readdir-glob\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz\",\n      \"integrity\": \"sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==\",\n      \"dependencies\": {\n        \"minimatch\": \"^5.1.0\"\n      }\n    },\n    \"node_modules/readdir-glob/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\"\n    },\n    \"node_modules/readdir-glob/node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/readdir-glob/node_modules/minimatch\": {\n      \"version\": \"5.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz\",\n      \"integrity\": \"sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/rechoir\": {\n      \"version\": \"0.7.1\",\n      \"resolved\": \"https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz\",\n      \"integrity\": \"sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==\",\n      \"dependencies\": {\n        \"resolve\": \"^1.9.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/regex\": {\n      \"version\": \"5.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/regex/-/regex-5.1.1.tgz\",\n      \"integrity\": \"sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==\",\n      \"dependencies\": {\n        \"regex-utilities\": \"^2.3.0\"\n      }\n    },\n    \"node_modules/regex-recursion\": {\n      \"version\": \"5.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz\",\n      \"integrity\": \"sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==\",\n      \"dependencies\": {\n        \"regex\": \"^5.1.1\",\n        \"regex-utilities\": \"^2.3.0\"\n      }\n    },\n    \"node_modules/regex-utilities\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz\",\n      \"integrity\": \"sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==\"\n    },\n    \"node_modules/regexp-tree\": {\n      \"version\": \"0.1.27\",\n      \"resolved\": \"https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz\",\n      \"integrity\": \"sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==\",\n      \"peer\": true,\n      \"bin\": {\n        \"regexp-tree\": \"bin/regexp-tree\"\n      }\n    },\n    \"node_modules/require-directory\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n      \"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/require-from-string\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz\",\n      \"integrity\": \"sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/resolve\": {\n      \"version\": \"1.22.11\",\n      \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz\",\n      \"integrity\": \"sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==\",\n      \"dependencies\": {\n        \"is-core-module\": \"^2.16.1\",\n        \"path-parse\": \"^1.0.7\",\n        \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n      },\n      \"bin\": {\n        \"resolve\": \"bin/resolve\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/resolve-dir\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz\",\n      \"integrity\": \"sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==\",\n      \"dependencies\": {\n        \"expand-tilde\": \"^2.0.0\",\n        \"global-modules\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz\",\n      \"integrity\": \"sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/reusify\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz\",\n      \"integrity\": \"sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==\",\n      \"engines\": {\n        \"iojs\": \">=1.0.0\",\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/rimraf\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz\",\n      \"integrity\": \"sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==\",\n      \"deprecated\": \"Rimraf versions prior to v4 are no longer supported\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"glob\": \"^7.1.3\"\n      },\n      \"bin\": {\n        \"rimraf\": \"bin.js\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/rollup\": {\n      \"version\": \"3.30.0\",\n      \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-3.30.0.tgz\",\n      \"integrity\": \"sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==\",\n      \"bin\": {\n        \"rollup\": \"dist/bin/rollup\"\n      },\n      \"engines\": {\n        \"node\": \">=14.18.0\",\n        \"npm\": \">=8.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"~2.3.2\"\n      }\n    },\n    \"node_modules/rollup-plugin-cleanup\": {\n      \"version\": \"3.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz\",\n      \"integrity\": \"sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==\",\n      \"dependencies\": {\n        \"js-cleanup\": \"^1.2.0\",\n        \"rollup-pluginutils\": \"^2.8.2\"\n      },\n      \"engines\": {\n        \"node\": \"^10.14.2 || >=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"rollup\": \">=2.0\"\n      }\n    },\n    \"node_modules/rollup-plugin-copy\": {\n      \"version\": \"3.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz\",\n      \"integrity\": \"sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==\",\n      \"dependencies\": {\n        \"@types/fs-extra\": \"^8.0.1\",\n        \"colorette\": \"^1.1.0\",\n        \"fs-extra\": \"^8.1.0\",\n        \"globby\": \"10.0.1\",\n        \"is-plain-object\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.3\"\n      }\n    },\n    \"node_modules/rollup-plugin-copy/node_modules/fs-extra\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz\",\n      \"integrity\": \"sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==\",\n      \"dependencies\": {\n        \"graceful-fs\": \"^4.2.0\",\n        \"jsonfile\": \"^4.0.0\",\n        \"universalify\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6 <7 || >=8\"\n      }\n    },\n    \"node_modules/rollup-plugin-copy/node_modules/globby\": {\n      \"version\": \"10.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/globby/-/globby-10.0.1.tgz\",\n      \"integrity\": \"sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==\",\n      \"dependencies\": {\n        \"@types/glob\": \"^7.1.1\",\n        \"array-union\": \"^2.1.0\",\n        \"dir-glob\": \"^3.0.1\",\n        \"fast-glob\": \"^3.0.3\",\n        \"glob\": \"^7.1.3\",\n        \"ignore\": \"^5.1.1\",\n        \"merge2\": \"^1.2.3\",\n        \"slash\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/rollup-plugin-copy/node_modules/ignore\": {\n      \"version\": \"5.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz\",\n      \"integrity\": \"sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==\",\n      \"engines\": {\n        \"node\": \">= 4\"\n      }\n    },\n    \"node_modules/rollup-plugin-copy/node_modules/is-plain-object\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz\",\n      \"integrity\": \"sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/rollup-plugin-copy/node_modules/jsonfile\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz\",\n      \"integrity\": \"sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==\",\n      \"optionalDependencies\": {\n        \"graceful-fs\": \"^4.1.6\"\n      }\n    },\n    \"node_modules/rollup-plugin-copy/node_modules/universalify\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz\",\n      \"integrity\": \"sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==\",\n      \"engines\": {\n        \"node\": \">= 4.0.0\"\n      }\n    },\n    \"node_modules/rollup-plugin-minify-es\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/rollup-plugin-minify-es/-/rollup-plugin-minify-es-1.1.1.tgz\",\n      \"integrity\": \"sha512-lvFDoGNR5OdRUki00uv70sUluPxBrOcULK6yEyh/lxBeRoaKkuUyhiLE76IDQR1+mmKSDzeYVMquZ+KWl0q2EQ==\",\n      \"dependencies\": {\n        \"uglify-es\": \"^3.1.0\"\n      }\n    },\n    \"node_modules/rollup-plugin-peer-deps-external\": {\n      \"version\": \"2.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz\",\n      \"integrity\": \"sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==\",\n      \"peerDependencies\": {\n        \"rollup\": \"*\"\n      }\n    },\n    \"node_modules/rollup-plugin-sourcemaps\": {\n      \"version\": \"0.6.3\",\n      \"resolved\": \"https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz\",\n      \"integrity\": \"sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==\",\n      \"dependencies\": {\n        \"@rollup/pluginutils\": \"^3.0.9\",\n        \"source-map-resolve\": \"^0.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"@types/node\": \">=10.0.0\",\n        \"rollup\": \">=0.31.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"@types/node\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/rollup-plugin-sourcemaps/node_modules/@rollup/pluginutils\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz\",\n      \"integrity\": \"sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==\",\n      \"dependencies\": {\n        \"@types/estree\": \"0.0.39\",\n        \"estree-walker\": \"^1.0.1\",\n        \"picomatch\": \"^2.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 8.0.0\"\n      },\n      \"peerDependencies\": {\n        \"rollup\": \"^1.20.0||^2.0.0\"\n      }\n    },\n    \"node_modules/rollup-plugin-sourcemaps/node_modules/@types/estree\": {\n      \"version\": \"0.0.39\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz\",\n      \"integrity\": \"sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==\"\n    },\n    \"node_modules/rollup-plugin-sourcemaps/node_modules/estree-walker\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz\",\n      \"integrity\": \"sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==\"\n    },\n    \"node_modules/rollup-plugin-sourcemaps/node_modules/picomatch\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz\",\n      \"integrity\": \"sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==\",\n      \"engines\": {\n        \"node\": \">=8.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/rollup-pluginutils\": {\n      \"version\": \"2.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz\",\n      \"integrity\": \"sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==\",\n      \"dependencies\": {\n        \"estree-walker\": \"^0.6.1\"\n      }\n    },\n    \"node_modules/rollup-pluginutils/node_modules/estree-walker\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz\",\n      \"integrity\": \"sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==\"\n    },\n    \"node_modules/run-parallel\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz\",\n      \"integrity\": \"sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"dependencies\": {\n        \"queue-microtask\": \"^1.2.2\"\n      }\n    },\n    \"node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ]\n    },\n    \"node_modules/safe-regex\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz\",\n      \"integrity\": \"sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"regexp-tree\": \"~0.1.1\"\n      }\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\"\n    },\n    \"node_modules/scheduler\": {\n      \"version\": \"0.11.3\",\n      \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.11.3.tgz\",\n      \"integrity\": \"sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ==\",\n      \"dependencies\": {\n        \"loose-envify\": \"^1.1.0\",\n        \"object-assign\": \"^4.1.1\"\n      }\n    },\n    \"node_modules/selenium-server-standalone-jar\": {\n      \"version\": \"3.141.59\",\n      \"resolved\": \"https://registry.npmjs.org/selenium-server-standalone-jar/-/selenium-server-standalone-jar-3.141.59.tgz\",\n      \"integrity\": \"sha512-gh7LagmKMkthQZo0q9qrDSWy+ISYnCUhOUW6IyRQIMGdg8Os/uMfChTDO17DYzxKmNIDx/h6+yfBj34QYALycw==\"\n    },\n    \"node_modules/semver\": {\n      \"version\": \"7.5.4\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.5.4.tgz\",\n      \"integrity\": \"sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==\",\n      \"dependencies\": {\n        \"lru-cache\": \"^6.0.0\"\n      },\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/semver/node_modules/lru-cache\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz\",\n      \"integrity\": \"sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==\",\n      \"dependencies\": {\n        \"yallist\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/send\": {\n      \"version\": \"0.19.2\",\n      \"resolved\": \"https://registry.npmjs.org/send/-/send-0.19.2.tgz\",\n      \"integrity\": \"sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==\",\n      \"dependencies\": {\n        \"debug\": \"2.6.9\",\n        \"depd\": \"2.0.0\",\n        \"destroy\": \"1.2.0\",\n        \"encodeurl\": \"~2.0.0\",\n        \"escape-html\": \"~1.0.3\",\n        \"etag\": \"~1.8.1\",\n        \"fresh\": \"~0.5.2\",\n        \"http-errors\": \"~2.0.1\",\n        \"mime\": \"1.6.0\",\n        \"ms\": \"2.1.3\",\n        \"on-finished\": \"~2.4.1\",\n        \"range-parser\": \"~1.2.1\",\n        \"statuses\": \"~2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/send/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/send/node_modules/debug/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\"\n    },\n    \"node_modules/serve-static\": {\n      \"version\": \"1.16.3\",\n      \"resolved\": \"https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz\",\n      \"integrity\": \"sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==\",\n      \"dependencies\": {\n        \"encodeurl\": \"~2.0.0\",\n        \"escape-html\": \"~1.0.3\",\n        \"parseurl\": \"~1.3.3\",\n        \"send\": \"~0.19.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/setprototypeof\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz\",\n      \"integrity\": \"sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==\"\n    },\n    \"node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shiki\": {\n      \"version\": \"1.29.2\",\n      \"resolved\": \"https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz\",\n      \"integrity\": \"sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==\",\n      \"dependencies\": {\n        \"@shikijs/core\": \"1.29.2\",\n        \"@shikijs/engine-javascript\": \"1.29.2\",\n        \"@shikijs/engine-oniguruma\": \"1.29.2\",\n        \"@shikijs/langs\": \"1.29.2\",\n        \"@shikijs/themes\": \"1.29.2\",\n        \"@shikijs/types\": \"1.29.2\",\n        \"@shikijs/vscode-textmate\": \"^10.0.1\",\n        \"@types/hast\": \"^3.0.4\"\n      }\n    },\n    \"node_modules/sinon\": {\n      \"version\": \"7.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz\",\n      \"integrity\": \"sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==\",\n      \"deprecated\": \"16.1.1\",\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^1.4.0\",\n        \"@sinonjs/formatio\": \"^3.2.1\",\n        \"@sinonjs/samsam\": \"^3.3.3\",\n        \"diff\": \"^3.5.0\",\n        \"lolex\": \"^4.2.0\",\n        \"nise\": \"^1.5.2\",\n        \"supports-color\": \"^5.5.0\"\n      }\n    },\n    \"node_modules/sinon/node_modules/diff\": {\n      \"version\": \"3.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/diff/-/diff-3.5.1.tgz\",\n      \"integrity\": \"sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==\",\n      \"engines\": {\n        \"node\": \">=0.3.1\"\n      }\n    },\n    \"node_modules/sinon/node_modules/has-flag\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n      \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/sinon/node_modules/supports-color\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n      \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n      \"dependencies\": {\n        \"has-flag\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/skip-regex\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/skip-regex/-/skip-regex-1.0.2.tgz\",\n      \"integrity\": \"sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==\",\n      \"engines\": {\n        \"node\": \">=4.2\"\n      }\n    },\n    \"node_modules/slash\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/slash/-/slash-3.0.0.tgz\",\n      \"integrity\": \"sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/smart-buffer\": {\n      \"version\": \"4.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz\",\n      \"integrity\": \"sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==\",\n      \"engines\": {\n        \"node\": \">= 6.0.0\",\n        \"npm\": \">= 3.0.0\"\n      }\n    },\n    \"node_modules/socks\": {\n      \"version\": \"2.8.7\",\n      \"resolved\": \"https://registry.npmjs.org/socks/-/socks-2.8.7.tgz\",\n      \"integrity\": \"sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==\",\n      \"dependencies\": {\n        \"ip-address\": \"^10.0.1\",\n        \"smart-buffer\": \"^4.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10.0.0\",\n        \"npm\": \">= 3.0.0\"\n      }\n    },\n    \"node_modules/socks-proxy-agent\": {\n      \"version\": \"8.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz\",\n      \"integrity\": \"sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==\",\n      \"dependencies\": {\n        \"agent-base\": \"^7.1.2\",\n        \"debug\": \"^4.3.4\",\n        \"socks\": \"^2.8.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/source-map\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n      \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/source-map-resolve\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz\",\n      \"integrity\": \"sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==\",\n      \"deprecated\": \"See https://github.com/lydell/source-map-resolve#deprecated\",\n      \"dependencies\": {\n        \"atob\": \"^2.1.2\",\n        \"decode-uri-component\": \"^0.2.0\"\n      }\n    },\n    \"node_modules/sourcemap-codec\": {\n      \"version\": \"1.4.8\",\n      \"resolved\": \"https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz\",\n      \"integrity\": \"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==\",\n      \"deprecated\": \"Please use @jridgewell/sourcemap-codec instead\"\n    },\n    \"node_modules/space-separated-tokens\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz\",\n      \"integrity\": \"sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/sprintf-js\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz\",\n      \"integrity\": \"sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==\"\n    },\n    \"node_modules/statuses\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz\",\n      \"integrity\": \"sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/streamx\": {\n      \"version\": \"2.25.0\",\n      \"resolved\": \"https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz\",\n      \"integrity\": \"sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==\",\n      \"dependencies\": {\n        \"events-universal\": \"^1.0.0\",\n        \"fast-fifo\": \"^1.3.2\",\n        \"text-decoder\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/string_decoder\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz\",\n      \"integrity\": \"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.2.0\"\n      }\n    },\n    \"node_modules/string-argv\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz\",\n      \"integrity\": \"sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==\",\n      \"engines\": {\n        \"node\": \">=0.6.19\"\n      }\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/stringify-entities\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz\",\n      \"integrity\": \"sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==\",\n      \"dependencies\": {\n        \"character-entities-html4\": \"^2.0.0\",\n        \"character-entities-legacy\": \"^3.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-json-comments\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz\",\n      \"integrity\": \"sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==\",\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/supports-color\": {\n      \"version\": \"8.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz\",\n      \"integrity\": \"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==\",\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n      }\n    },\n    \"node_modules/supports-preserve-symlinks-flag\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n      \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/tar-fs\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz\",\n      \"integrity\": \"sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==\",\n      \"dependencies\": {\n        \"pump\": \"^3.0.0\",\n        \"tar-stream\": \"^3.1.5\"\n      },\n      \"optionalDependencies\": {\n        \"bare-fs\": \"^4.0.1\",\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/tar-fs/node_modules/b4a\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz\",\n      \"integrity\": \"sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/tar-fs/node_modules/tar-stream\": {\n      \"version\": \"3.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz\",\n      \"integrity\": \"sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\",\n        \"bare-fs\": \"^4.5.5\",\n        \"fast-fifo\": \"^1.2.0\",\n        \"streamx\": \"^2.15.0\"\n      }\n    },\n    \"node_modules/tar-stream\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz\",\n      \"integrity\": \"sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==\",\n      \"dependencies\": {\n        \"bl\": \"^4.0.3\",\n        \"end-of-stream\": \"^1.4.1\",\n        \"fs-constants\": \"^1.0.0\",\n        \"inherits\": \"^2.0.3\",\n        \"readable-stream\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/teex\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/teex/-/teex-1.0.1.tgz\",\n      \"integrity\": \"sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==\",\n      \"dependencies\": {\n        \"streamx\": \"^2.12.5\"\n      }\n    },\n    \"node_modules/text-decoder\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz\",\n      \"integrity\": \"sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\"\n      }\n    },\n    \"node_modules/text-decoder/node_modules/b4a\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz\",\n      \"integrity\": \"sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/text-table\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz\",\n      \"integrity\": \"sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==\",\n      \"peer\": true\n    },\n    \"node_modules/tiny-glob\": {\n      \"version\": \"0.2.9\",\n      \"resolved\": \"https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz\",\n      \"integrity\": \"sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==\",\n      \"dependencies\": {\n        \"globalyzer\": \"0.1.0\",\n        \"globrex\": \"^0.1.2\"\n      }\n    },\n    \"node_modules/tinyglobby\": {\n      \"version\": \"0.2.16\",\n      \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz\",\n      \"integrity\": \"sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"fdir\": \"^6.5.0\",\n        \"picomatch\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n      }\n    },\n    \"node_modules/to-regex-range\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz\",\n      \"integrity\": \"sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==\",\n      \"dependencies\": {\n        \"is-number\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8.0\"\n      }\n    },\n    \"node_modules/toidentifier\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz\",\n      \"integrity\": \"sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/trim-lines\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz\",\n      \"integrity\": \"sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    },\n    \"node_modules/ts-api-utils\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz\",\n      \"integrity\": \"sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=18.12\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \">=4.8.4\"\n      }\n    },\n    \"node_modules/tslib\": {\n      \"version\": \"2.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n      \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\"\n    },\n    \"node_modules/type-check\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz\",\n      \"integrity\": \"sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"prelude-ls\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/type-detect\": {\n      \"version\": \"4.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz\",\n      \"integrity\": \"sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/type-fest\": {\n      \"version\": \"0.20.2\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz\",\n      \"integrity\": \"sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/typed-query-selector\": {\n      \"version\": \"2.12.1\",\n      \"resolved\": \"https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz\",\n      \"integrity\": \"sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==\"\n    },\n    \"node_modules/typedoc\": {\n      \"version\": \"0.26.11\",\n      \"resolved\": \"https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz\",\n      \"integrity\": \"sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==\",\n      \"dependencies\": {\n        \"lunr\": \"^2.3.9\",\n        \"markdown-it\": \"^14.1.0\",\n        \"minimatch\": \"^9.0.5\",\n        \"shiki\": \"^1.16.2\",\n        \"yaml\": \"^2.5.1\"\n      },\n      \"bin\": {\n        \"typedoc\": \"bin/typedoc\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"peerDependencies\": {\n        \"typescript\": \"4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x\"\n      }\n    },\n    \"node_modules/typedoc/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\"\n    },\n    \"node_modules/typedoc/node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/typedoc/node_modules/minimatch\": {\n      \"version\": \"9.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz\",\n      \"integrity\": \"sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/typescript\": {\n      \"version\": \"4.9.5\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz\",\n      \"integrity\": \"sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==\",\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=4.2.0\"\n      }\n    },\n    \"node_modules/uc.micro\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz\",\n      \"integrity\": \"sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==\"\n    },\n    \"node_modules/uglify-es\": {\n      \"version\": \"3.3.9\",\n      \"resolved\": \"https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz\",\n      \"integrity\": \"sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==\",\n      \"deprecated\": \"support for ECMAScript is superseded by `uglify-js` as of v3.13.0\",\n      \"dependencies\": {\n        \"commander\": \"~2.13.0\",\n        \"source-map\": \"~0.6.1\"\n      },\n      \"bin\": {\n        \"uglifyjs\": \"bin/uglifyjs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/uglify-es/node_modules/commander\": {\n      \"version\": \"2.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-2.13.0.tgz\",\n      \"integrity\": \"sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==\"\n    },\n    \"node_modules/uglify-js\": {\n      \"version\": \"3.16.0\",\n      \"resolved\": \"https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.0.tgz\",\n      \"integrity\": \"sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==\",\n      \"bin\": {\n        \"uglifyjs\": \"bin/uglifyjs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/unc-path-regex\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz\",\n      \"integrity\": \"sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/underscore.string\": {\n      \"version\": \"3.3.6\",\n      \"resolved\": \"https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz\",\n      \"integrity\": \"sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==\",\n      \"dependencies\": {\n        \"sprintf-js\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/underscore.string/node_modules/sprintf-js\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz\",\n      \"integrity\": \"sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==\"\n    },\n    \"node_modules/unist-util-is\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz\",\n      \"integrity\": \"sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^3.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-position\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz\",\n      \"integrity\": \"sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^3.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-stringify-position\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz\",\n      \"integrity\": \"sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^3.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-visit\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz\",\n      \"integrity\": \"sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^3.0.0\",\n        \"unist-util-is\": \"^6.0.0\",\n        \"unist-util-visit-parents\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/unist-util-visit-parents\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz\",\n      \"integrity\": \"sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^3.0.0\",\n        \"unist-util-is\": \"^6.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/universalify\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz\",\n      \"integrity\": \"sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==\",\n      \"engines\": {\n        \"node\": \">= 10.0.0\"\n      }\n    },\n    \"node_modules/unpipe\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz\",\n      \"integrity\": \"sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/update-browserslist-db\": {\n      \"version\": \"1.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz\",\n      \"integrity\": \"sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==\",\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/browserslist\"\n        },\n        {\n          \"type\": \"tidelift\",\n          \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"escalade\": \"^3.2.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"bin\": {\n        \"update-browserslist-db\": \"cli.js\"\n      },\n      \"peerDependencies\": {\n        \"browserslist\": \">= 4.21.0\"\n      }\n    },\n    \"node_modules/uri-js\": {\n      \"version\": \"4.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz\",\n      \"integrity\": \"sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==\",\n      \"peer\": true,\n      \"dependencies\": {\n        \"punycode\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\"\n    },\n    \"node_modules/v8flags\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz\",\n      \"integrity\": \"sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==\",\n      \"engines\": {\n        \"node\": \">= 10.13.0\"\n      }\n    },\n    \"node_modules/vfile\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz\",\n      \"integrity\": \"sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^3.0.0\",\n        \"vfile-message\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/vfile-message\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz\",\n      \"integrity\": \"sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==\",\n      \"dependencies\": {\n        \"@types/unist\": \"^3.0.0\",\n        \"unist-util-stringify-position\": \"^4.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/unified\"\n      }\n    },\n    \"node_modules/webdriver-bidi-protocol\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz\",\n      \"integrity\": \"sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==\"\n    },\n    \"node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/word-wrap\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz\",\n      \"integrity\": \"sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrappy\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\"\n    },\n    \"node_modules/ws\": {\n      \"version\": \"8.20.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.20.0.tgz\",\n      \"integrity\": \"sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/yallist\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz\",\n      \"integrity\": \"sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==\"\n    },\n    \"node_modules/yaml\": {\n      \"version\": \"2.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz\",\n      \"integrity\": \"sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==\",\n      \"bin\": {\n        \"yaml\": \"bin.mjs\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/eemeli\"\n      }\n    },\n    \"node_modules/yargs\": {\n      \"version\": \"17.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz\",\n      \"integrity\": \"sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==\",\n      \"dependencies\": {\n        \"cliui\": \"^8.0.1\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"require-directory\": \"^2.1.1\",\n        \"string-width\": \"^4.2.3\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^21.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/yargs-parser\": {\n      \"version\": \"21.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz\",\n      \"integrity\": \"sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/yauzl\": {\n      \"version\": \"2.10.0\",\n      \"resolved\": \"https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz\",\n      \"integrity\": \"sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==\",\n      \"dependencies\": {\n        \"buffer-crc32\": \"~0.2.3\",\n        \"fd-slicer\": \"~1.1.0\"\n      }\n    },\n    \"node_modules/yocto-queue\": {\n      \"version\": \"0.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz\",\n      \"integrity\": \"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==\",\n      \"peer\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/zip-stream\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz\",\n      \"integrity\": \"sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^3.0.4\",\n        \"compress-commons\": \"^4.1.2\",\n        \"readable-stream\": \"^3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/zip-stream/node_modules/archiver-utils\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz\",\n      \"integrity\": \"sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==\",\n      \"dependencies\": {\n        \"glob\": \"^7.2.3\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"lazystream\": \"^1.0.0\",\n        \"lodash.defaults\": \"^4.2.0\",\n        \"lodash.difference\": \"^4.5.0\",\n        \"lodash.flatten\": \"^4.4.0\",\n        \"lodash.isplainobject\": \"^4.0.6\",\n        \"lodash.union\": \"^4.6.0\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^3.6.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      }\n    },\n    \"node_modules/zod\": {\n      \"version\": \"3.25.76\",\n      \"resolved\": \"https://registry.npmjs.org/zod/-/zod-3.25.76.tgz\",\n      \"integrity\": \"sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/colinhacks\"\n      }\n    },\n    \"node_modules/zwitch\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz\",\n      \"integrity\": \"sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==\",\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/wooorm\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "common/config/rush/version-policies.json",
    "content": "/**\n * This is configuration file is used for advanced publishing configurations with Rush.\n * For full documentation, please see https://rushjs.io\n */\n\n /**\n  * A list of version policy definitions.  A \"version policy\" is a custom package versioning\n  * strategy that affets \"rush change\", \"rush version\", and \"rush publish\".  The strategy applies\n  * to a set of projects that are specified using the \"versionPolicyName\" field in rush.json.\n  */\n[\n  // {\n  //   /**\n  //    * (Required) Indicates the kind of version policy being defined (\"lockStepVersion\" or \"individualVersion\").\n  //    *\n  //    * The \"lockStepVersion\" mode specifies that the projects will use \"lock-step versioning\".  This\n  //    * strategy is appropriate for a set of packages that act as selectable components of a\n  //    * unified product.  The entire set of packages are always published together, and always share\n  //    * the same NPM version number.  When the packages depend on other packages in the set, the\n  //    * SemVer range is usually restricted to a single version.\n  //    */\n  //   \"definitionName\": \"lockStepVersion\",\n  // \n  //   /**\n  //    * (Required) The name that will be used for the \"versionPolicyName\" field in rush.json.\n  //    * This name is also used command-line parameters such as \"--version-policy\"\n  //    * and \"--to-version-policy\".\n  //    */\n  //   \"policyName\": \"MyBigFramework\",\n  // \n  //   /**\n  //    * (Required) The current version.  All packages belonging to the set should have this version\n  //    * in the current branch.  When bumping versions, Rush uses this to determine the next version.\n  //    * (The \"version\" field in package.json is NOT considered.)\n  //    */\n  //   \"version\": \"1.0.0\",\n  // \n  //   /**\n  //    * (Required) The type of bump that will be performed when publishing the next release.\n  //    * When creating a release branch in Git, this field should be updated according to the\n  //    * type of release.\n  //    *\n  //    * Valid values are: \"prerelease\", \"release\", \"minor\", \"patch\", \"major\"\n  //    */\n  //   \"nextBump\": \"prerelease\",\n  // \n  //   /**\n  //    * (Optional) If specified, all packages in the set share a common CHANGELOG.md file.\n  //    * This file is stored with the specified \"main\" project, which must be a member of the set.\n  //    *\n  //    * If this field is omitted, then a separate CHANGELOG.md file will be maintained for each\n  //    * package in the set.\n  //    */\n  //   \"mainProject\": \"my-app\"\n  // },\n  // \n  // {\n  //   /**\n  //    * (Required) Indicates the kind of version policy being defined (\"lockStepVersion\" or \"individualVersion\").\n  //    *\n  //    * The \"individualVersion\" mode specifies that the projects will use \"individual versioning\".\n  //    * This is the typical NPM model where each package has an independent version number\n  //    * and CHANGELOG.md file.  Although a single CI definition is responsible for publishing the\n  //    * packages, they otherwise don't have any special relationship.  The version bumping will\n  //    * depend on how developers answer the \"rush change\" questions for each package that\n  //    * is changed.\n  //    */\n  //   \"definitionName\": \"individualVersion\",\n  // \n  //   \"policyName\": \"MyRandomLibraries\",\n  // \n  //   /**\n  //    * (Optional) This can be used to enforce that all packages in the set must share a common\n  //    * major version number, e.g. because they are from the same major release branch.\n  //    * It can also be used to discourage people from accidentally making \"MAJOR\" SemVer changes\n  //    * inappropriately.  The minor/patch version parts will be bumped independently according\n  //    * to the types of changes made to each project, according to the \"rush change\" command.\n  //    */\n  //   \"lockedMajor\": 3\n  // }\n]\n"
  },
  {
    "path": "common/scripts/install-run-rush-silent.js",
    "content": "// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where the Rush command may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the version of Rush\n// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it.\n// An example usage would be:\n//\n//    node common/scripts/install-run-rush.js install\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\n//\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for details.\n\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 179896:\n/*!*********************!*\\\n  !*** external \"fs\" ***!\n  \\*********************/\n/***/ ((module) => {\n\nmodule.exports = require(\"fs\");\n\n/***/ }),\n\n/***/ 16928:\n/*!***********************!*\\\n  !*** external \"path\" ***!\n  \\***********************/\n/***/ ((module) => {\n\nmodule.exports = require(\"path\");\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\n/*!************************************************!*\\\n  !*** ./lib-esnext/scripts/install-run-rush.js ***!\n  \\************************************************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ 16928);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 179896);\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__);\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n/* eslint-disable no-console */\n\n\n// ------------------------------------------\n// Manual edit of the original install-run-rush.js\n// ------------------------------------------\n\nconst { installAndRun, findRushJsonFolder, RUSH_JSON_FILENAME, runWithErrorAndStatusCode } = require('./install-run-silent');\n\n// ------------------------------------------\n// End of Manual edit of the original install-run-rush.js\n// ------------------------------------------\n\nconst PACKAGE_NAME = '@microsoft/rush';\nconst RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION';\nconst INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH';\nfunction _getRushVersion(logger) {\n    const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION];\n    if (rushPreviewVersion !== undefined) {\n        logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`);\n        return rushPreviewVersion;\n    }\n    const rushJsonFolder = findRushJsonFolder();\n    const rushJsonPath = path__WEBPACK_IMPORTED_MODULE_0__.join(rushJsonFolder, RUSH_JSON_FILENAME);\n    try {\n        const rushJsonContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(rushJsonPath, 'utf-8');\n        // Use a regular expression to parse out the rushVersion value because rush.json supports comments,\n        // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script.\n        const rushJsonMatches = rushJsonContents.match(/\\\"rushVersion\\\"\\s*\\:\\s*\\\"([0-9a-zA-Z.+\\-]+)\\\"/);\n        return rushJsonMatches[1];\n    }\n    catch (e) {\n        throw new Error(`Unable to determine the required version of Rush from ${RUSH_JSON_FILENAME} (${rushJsonFolder}). ` +\n            `The 'rushVersion' field is either not assigned in ${RUSH_JSON_FILENAME} or was specified ` +\n            'using an unexpected syntax.');\n    }\n}\nfunction _getBin(scriptName) {\n    switch (scriptName.toLowerCase()) {\n        case 'install-run-rush-pnpm.js':\n            return 'rush-pnpm';\n        case 'install-run-rushx.js':\n            return 'rushx';\n        default:\n            return 'rush';\n    }\n}\nfunction _run() {\n    const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv;\n    // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the\n    // appropriate binary inside the rush package to run\n    const scriptName = path__WEBPACK_IMPORTED_MODULE_0__.basename(scriptPath);\n    const bin = _getBin(scriptName);\n    if (!nodePath || !scriptPath) {\n        throw new Error('Unexpected exception: could not detect node path or script path');\n    }\n    let commandFound = false;\n    let logger = { info: console.log, error: console.error };\n    for (const arg of packageBinArgs) {\n        if (arg === '-q' || arg === '--quiet') {\n            // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress\n            // any normal informational/diagnostic information printed during startup.\n            //\n            // To maintain the same user experience, the install-run* scripts pass along this\n            // flag but also use it to suppress any diagnostic information normally printed\n            // to stdout.\n            logger = {\n                info: () => { },\n                error: console.error\n            };\n        }\n        else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') {\n            // We either found something that looks like a command (i.e. - doesn't start with a \"-\"),\n            // or we found the -h/--help flag, which can be run without a command\n            commandFound = true;\n        }\n    }\n    if (!commandFound) {\n        console.log(`Usage: ${scriptName} <command> [args...]`);\n        if (scriptName === 'install-run-rush-pnpm.js') {\n            console.log(`Example: ${scriptName} pnpm-command`);\n        }\n        else if (scriptName === 'install-run-rush.js') {\n            console.log(`Example: ${scriptName} build --to myproject`);\n        }\n        else {\n            console.log(`Example: ${scriptName} custom-command`);\n        }\n        process.exit(1);\n    }\n    runWithErrorAndStatusCode(logger, () => {\n        const version = _getRushVersion(logger);\n        logger.info(`The ${RUSH_JSON_FILENAME} configuration requests Rush version ${version}`);\n        const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE];\n        if (lockFilePath) {\n            logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}=\"${lockFilePath}\", installing with lockfile.`);\n        }\n        return installAndRun(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath);\n    });\n}\n_run();\n//# sourceMappingURL=install-run-rush.js.map\n})();\n\nmodule.exports = __webpack_exports__;\n/******/ })()\n;\n//# sourceMappingURL=install-run-rush.js.map"
  },
  {
    "path": "common/scripts/install-run-rush.js",
    "content": "// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where the Rush command may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the version of Rush\n// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it.\n// An example usage would be:\n//\n//    node common/scripts/install-run-rush.js install\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\n//\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for details.\n\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 973024\n/*!**************************!*\\\n  !*** external \"node:fs\" ***!\n  \\**************************/\n(module) {\n\nmodule.exports = require(\"node:fs\");\n\n/***/ },\n\n/***/ 176760\n/*!****************************!*\\\n  !*** external \"node:path\" ***!\n  \\****************************/\n(module) {\n\nmodule.exports = require(\"node:path\");\n\n/***/ }\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Check if module exists (development only)\n/******/ \t\tif (__webpack_modules__[moduleId] === undefined) {\n/******/ \t\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n/******/ \t\t\te.code = 'MODULE_NOT_FOUND';\n/******/ \t\t\tthrow e;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.\n(() => {\n/*!**********************************************************!*\\\n  !*** ./lib-intermediate-esm/scripts/install-run-rush.js ***!\n  \\**********************************************************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node:path */ 176760);\n/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_path__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! node:fs */ 973024);\n/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_1__);\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n/* eslint-disable no-console */\n\n\nconst { installAndRun, findRushJsonFolder, RUSH_JSON_FILENAME, runWithErrorAndStatusCode } = require('./install-run');\nconst PACKAGE_NAME = '@microsoft/rush';\nconst RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION';\nconst RUSH_QUIET_MODE = 'RUSH_QUIET_MODE';\nconst INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH';\nfunction _getRushVersion(logger) {\n    const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION];\n    if (rushPreviewVersion !== undefined) {\n        logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`);\n        return rushPreviewVersion;\n    }\n    const rushJsonFolder = findRushJsonFolder();\n    const rushJsonPath = node_path__WEBPACK_IMPORTED_MODULE_0__.join(rushJsonFolder, RUSH_JSON_FILENAME);\n    try {\n        const rushJsonContents = node_fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(rushJsonPath, 'utf-8');\n        // Use a regular expression to parse out the rushVersion value because rush.json supports comments,\n        // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script.\n        const rushJsonMatches = rushJsonContents.match(/\\\"rushVersion\\\"\\s*\\:\\s*\\\"([0-9a-zA-Z.+\\-]+)\\\"/);\n        return rushJsonMatches[1];\n    }\n    catch (e) {\n        throw new Error(`Unable to determine the required version of Rush from ${RUSH_JSON_FILENAME} (${rushJsonFolder}). ` +\n            `The 'rushVersion' field is either not assigned in ${RUSH_JSON_FILENAME} or was specified ` +\n            'using an unexpected syntax.');\n    }\n}\nfunction _getBin(scriptName) {\n    switch (scriptName.toLowerCase()) {\n        case 'install-run-rush-pnpm.js':\n            return 'rush-pnpm';\n        case 'install-run-rushx.js':\n            return 'rushx';\n        default:\n            return 'rush';\n    }\n}\nfunction _run() {\n    const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv;\n    // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the\n    // appropriate binary inside the rush package to run\n    const scriptName = node_path__WEBPACK_IMPORTED_MODULE_0__.basename(scriptPath);\n    const bin = _getBin(scriptName);\n    if (!nodePath || !scriptPath) {\n        throw new Error('Unexpected exception: could not detect node path or script path');\n    }\n    let commandFound = false;\n    const quietModeEnvValue = process.env[RUSH_QUIET_MODE];\n    let quiet = quietModeEnvValue === '1' || quietModeEnvValue === 'true';\n    for (const arg of packageBinArgs) {\n        if (arg === '-q' || arg === '--quiet') {\n            // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress\n            // any normal informational/diagnostic information printed during startup.\n            //\n            // To maintain the same user experience, the install-run* scripts pass along this\n            // flag but also use it to suppress any diagnostic information normally printed\n            // to stdout.\n            quiet = true;\n        }\n        else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') {\n            // We either found something that looks like a command (i.e. - doesn't start with a \"-\"),\n            // or we found the -h/--help flag, which can be run without a command\n            commandFound = true;\n        }\n    }\n    if (!commandFound) {\n        console.log(`Usage: ${scriptName} <command> [args...]`);\n        if (scriptName === 'install-run-rush-pnpm.js') {\n            console.log(`Example: ${scriptName} pnpm-command`);\n        }\n        else if (scriptName === 'install-run-rush.js') {\n            console.log(`Example: ${scriptName} build --to myproject`);\n        }\n        else {\n            console.log(`Example: ${scriptName} custom-command`);\n        }\n        process.exit(1);\n    }\n    const logger = quiet\n        ? { info: () => { }, error: console.error }\n        : { info: console.log, error: console.error };\n    runWithErrorAndStatusCode(logger, () => {\n        const version = _getRushVersion(logger);\n        logger.info(`The ${RUSH_JSON_FILENAME} configuration requests Rush version ${version}`);\n        const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE];\n        if (lockFilePath) {\n            logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}=\"${lockFilePath}\", installing with lockfile.`);\n        }\n        return installAndRun(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath);\n    });\n}\n_run();\n//# sourceMappingURL=install-run-rush.js.map\n})();\n\nmodule.exports = __webpack_exports__;\n/******/ })()\n;\n//# sourceMappingURL=install-run-rush.js.map"
  },
  {
    "path": "common/scripts/install-run-rushx.js",
    "content": "// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where the Rush command may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the version of Rush\n// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the\n// rushx command.\n//\n// An example usage would be:\n//\n//    node common/scripts/install-run-rushx.js custom-command\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\n//\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for details.\n\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\nvar __webpack_exports__ = {};\n/*!***********************************************************!*\\\n  !*** ./lib-intermediate-esm/scripts/install-run-rushx.js ***!\n  \\***********************************************************/\n\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\nrequire('./install-run-rush');\n//# sourceMappingURL=install-run-rushx.js.map\nmodule.exports = __webpack_exports__;\n/******/ })()\n;\n//# sourceMappingURL=install-run-rushx.js.map"
  },
  {
    "path": "common/scripts/install-run-silent.js",
    "content": "// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where a Node tool may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the specified\n// version of the specified tool (if not already installed), and then pass a command-line to it.\n// An example usage would be:\n//\n//    node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\n//\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for details.\n\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 832286:\n/*!************************************************!*\\\n  !*** ./lib-esnext/utilities/npmrcUtilities.js ***!\n  \\************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   isVariableSetInNpmrcFile: () => (/* binding */ isVariableSetInNpmrcFile),\n/* harmony export */   syncNpmrc: () => (/* binding */ syncNpmrc),\n/* harmony export */   trimNpmrcFileLines: () => (/* binding */ trimNpmrcFileLines)\n/* harmony export */ });\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ 179896);\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! path */ 16928);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n// IMPORTANT - do not use any non-built-in libraries in this file\n\n\n/**\n * This function reads the content for given .npmrc file path, and also trims\n * unusable lines from the .npmrc file.\n *\n * @returns\n * The text of the the .npmrc.\n */\n// create a global _combinedNpmrc for cache purpose\nconst _combinedNpmrcMap = new Map();\nfunction _trimNpmrcFile(options) {\n    const { sourceNpmrcPath, linesToPrepend, linesToAppend, supportEnvVarFallbackSyntax } = options;\n    const combinedNpmrcFromCache = _combinedNpmrcMap.get(sourceNpmrcPath);\n    if (combinedNpmrcFromCache !== undefined) {\n        return combinedNpmrcFromCache;\n    }\n    let npmrcFileLines = [];\n    if (linesToPrepend) {\n        npmrcFileLines.push(...linesToPrepend);\n    }\n    if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) {\n        npmrcFileLines.push(...fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(sourceNpmrcPath).toString().split('\\n'));\n    }\n    if (linesToAppend) {\n        npmrcFileLines.push(...linesToAppend);\n    }\n    npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim());\n    const resultLines = trimNpmrcFileLines(npmrcFileLines, process.env, supportEnvVarFallbackSyntax);\n    const combinedNpmrc = resultLines.join('\\n');\n    //save the cache\n    _combinedNpmrcMap.set(sourceNpmrcPath, combinedNpmrc);\n    return combinedNpmrc;\n}\n/**\n *\n * @param npmrcFileLines The npmrc file's lines\n * @param env The environment variables object\n * @param supportEnvVarFallbackSyntax Whether to support fallback values in the form of `${VAR_NAME:-fallback}`\n * @returns\n */\nfunction trimNpmrcFileLines(npmrcFileLines, env, supportEnvVarFallbackSyntax) {\n    var _a;\n    const resultLines = [];\n    // This finds environment variable tokens that look like \"${VAR_NAME}\"\n    const expansionRegExp = /\\$\\{([^\\}]+)\\}/g;\n    // Comment lines start with \"#\" or \";\"\n    const commentRegExp = /^\\s*[#;]/;\n    // Trim out lines that reference environment variables that aren't defined\n    for (let line of npmrcFileLines) {\n        let lineShouldBeTrimmed = false;\n        //remove spaces before or after key and value\n        line = line\n            .split('=')\n            .map((lineToTrim) => lineToTrim.trim())\n            .join('=');\n        // Ignore comment lines\n        if (!commentRegExp.test(line)) {\n            const environmentVariables = line.match(expansionRegExp);\n            if (environmentVariables) {\n                for (const token of environmentVariables) {\n                    /**\n                     * Remove the leading \"${\" and the trailing \"}\" from the token\n                     *\n                     * ${nameString}                  -> nameString\n                     * ${nameString-fallbackString}   -> name-fallbackString\n                     * ${nameString:-fallbackString}  -> name:-fallbackString\n                     */\n                    const nameWithFallback = token.substring(2, token.length - 1);\n                    let environmentVariableName;\n                    let fallback;\n                    if (supportEnvVarFallbackSyntax) {\n                        /**\n                         * Get the environment variable name and fallback value.\n                         *\n                         *                                name          fallback\n                         * nameString                 ->  nameString    undefined\n                         * nameString-fallbackString  ->  nameString    fallbackString\n                         * nameString:-fallbackString ->  nameString    fallbackString\n                         */\n                        const matched = nameWithFallback.match(/^([^:-]+)(?:\\:?-(.+))?$/);\n                        // matched: [originStr, variableName, fallback]\n                        environmentVariableName = (_a = matched === null || matched === void 0 ? void 0 : matched[1]) !== null && _a !== void 0 ? _a : nameWithFallback;\n                        fallback = matched === null || matched === void 0 ? void 0 : matched[2];\n                    }\n                    else {\n                        environmentVariableName = nameWithFallback;\n                    }\n                    // Is the environment variable and fallback value defined.\n                    if (!env[environmentVariableName] && !fallback) {\n                        // No, so trim this line\n                        lineShouldBeTrimmed = true;\n                        break;\n                    }\n                }\n            }\n        }\n        if (lineShouldBeTrimmed) {\n            // Example output:\n            // \"; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}\"\n            resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line);\n        }\n        else {\n            resultLines.push(line);\n        }\n    }\n    return resultLines;\n}\nfunction _copyAndTrimNpmrcFile(options) {\n    const { logger, sourceNpmrcPath, targetNpmrcPath } = options;\n    logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose\n    logger.info(`  --> \"${targetNpmrcPath}\"`);\n    const combinedNpmrc = _trimNpmrcFile(options);\n    fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(targetNpmrcPath, combinedNpmrc);\n    return combinedNpmrc;\n}\nfunction syncNpmrc(options) {\n    const { sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish, logger = {\n        // eslint-disable-next-line no-console\n        info: console.log,\n        // eslint-disable-next-line no-console\n        error: console.error\n    }, createIfMissing = false } = options;\n    const sourceNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish');\n    const targetNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(targetNpmrcFolder, '.npmrc');\n    try {\n        if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath) || createIfMissing) {\n            // Ensure the target folder exists\n            if (!fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcFolder)) {\n                fs__WEBPACK_IMPORTED_MODULE_0__.mkdirSync(targetNpmrcFolder, { recursive: true });\n            }\n            return _copyAndTrimNpmrcFile(Object.assign({ sourceNpmrcPath,\n                targetNpmrcPath,\n                logger }, options));\n        }\n        else if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcPath)) {\n            // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target\n            logger.info(`Deleting ${targetNpmrcPath}`); // Verbose\n            fs__WEBPACK_IMPORTED_MODULE_0__.unlinkSync(targetNpmrcPath);\n        }\n    }\n    catch (e) {\n        throw new Error(`Error syncing .npmrc file: ${e}`);\n    }\n}\nfunction isVariableSetInNpmrcFile(sourceNpmrcFolder, variableKey, supportEnvVarFallbackSyntax) {\n    const sourceNpmrcPath = `${sourceNpmrcFolder}/.npmrc`;\n    //if .npmrc file does not exist, return false directly\n    if (!fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) {\n        return false;\n    }\n    const trimmedNpmrcFile = _trimNpmrcFile({ sourceNpmrcPath, supportEnvVarFallbackSyntax });\n    const variableKeyRegExp = new RegExp(`^${variableKey}=`, 'm');\n    return trimmedNpmrcFile.match(variableKeyRegExp) !== null;\n}\n//# sourceMappingURL=npmrcUtilities.js.map\n\n/***/ }),\n\n/***/ 535317:\n/*!********************************!*\\\n  !*** external \"child_process\" ***!\n  \\********************************/\n/***/ ((module) => {\n\nmodule.exports = require(\"child_process\");\n\n/***/ }),\n\n/***/ 179896:\n/*!*********************!*\\\n  !*** external \"fs\" ***!\n  \\*********************/\n/***/ ((module) => {\n\nmodule.exports = require(\"fs\");\n\n/***/ }),\n\n/***/ 370857:\n/*!*********************!*\\\n  !*** external \"os\" ***!\n  \\*********************/\n/***/ ((module) => {\n\nmodule.exports = require(\"os\");\n\n/***/ }),\n\n/***/ 16928:\n/*!***********************!*\\\n  !*** external \"path\" ***!\n  \\***********************/\n/***/ ((module) => {\n\nmodule.exports = require(\"path\");\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\n/*!*******************************************!*\\\n  !*** ./lib-esnext/scripts/install-run.js ***!\n  \\*******************************************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   RUSH_JSON_FILENAME: () => (/* binding */ RUSH_JSON_FILENAME),\n/* harmony export */   findRushJsonFolder: () => (/* binding */ findRushJsonFolder),\n/* harmony export */   getNpmPath: () => (/* binding */ getNpmPath),\n/* harmony export */   installAndRun: () => (/* binding */ installAndRun),\n/* harmony export */   runWithErrorAndStatusCode: () => (/* binding */ runWithErrorAndStatusCode)\n/* harmony export */ });\n/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! child_process */ 535317);\n/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 179896);\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! os */ 370857);\n/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(os__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ 16928);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/npmrcUtilities */ 832286);\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n/* eslint-disable no-console */\n\n\n\n\n\nconst RUSH_JSON_FILENAME = 'rush.json';\nconst RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER';\nconst INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH';\nconst INSTALLED_FLAG_FILENAME = 'installed.flag';\nconst NODE_MODULES_FOLDER_NAME = 'node_modules';\nconst PACKAGE_JSON_FILENAME = 'package.json';\n/**\n * Parse a package specifier (in the form of name\\@version) into name and version parts.\n */\nfunction _parsePackageSpecifier(rawPackageSpecifier) {\n    rawPackageSpecifier = (rawPackageSpecifier || '').trim();\n    const separatorIndex = rawPackageSpecifier.lastIndexOf('@');\n    let name;\n    let version = undefined;\n    if (separatorIndex === 0) {\n        // The specifier starts with a scope and doesn't have a version specified\n        name = rawPackageSpecifier;\n    }\n    else if (separatorIndex === -1) {\n        // The specifier doesn't have a version\n        name = rawPackageSpecifier;\n    }\n    else {\n        name = rawPackageSpecifier.substring(0, separatorIndex);\n        version = rawPackageSpecifier.substring(separatorIndex + 1);\n    }\n    if (!name) {\n        throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`);\n    }\n    return { name, version };\n}\nlet _npmPath = undefined;\n/**\n * Get the absolute path to the npm executable\n */\nfunction getNpmPath() {\n    if (!_npmPath) {\n        try {\n            if (_isWindows()) {\n                // We're on Windows\n                const whereOutput = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('where npm', { stdio: [] }).toString();\n                const lines = whereOutput.split(os__WEBPACK_IMPORTED_MODULE_2__.EOL).filter((line) => !!line);\n                // take the last result, we are looking for a .cmd command\n                // see https://github.com/microsoft/rushstack/issues/759\n                _npmPath = lines[lines.length - 1];\n            }\n            else {\n                // We aren't on Windows - assume we're on *NIX or Darwin\n                _npmPath = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('command -v npm', { stdio: [] }).toString();\n            }\n        }\n        catch (e) {\n            throw new Error(`Unable to determine the path to the NPM tool: ${e}`);\n        }\n        _npmPath = _npmPath.trim();\n        if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(_npmPath)) {\n            throw new Error('The NPM executable does not exist');\n        }\n    }\n    return _npmPath;\n}\nfunction _ensureFolder(folderPath) {\n    if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(folderPath)) {\n        const parentDir = path__WEBPACK_IMPORTED_MODULE_3__.dirname(folderPath);\n        _ensureFolder(parentDir);\n        fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(folderPath);\n    }\n}\n/**\n * Create missing directories under the specified base directory, and return the resolved directory.\n *\n * Does not support \".\" or \"..\" path segments.\n * Assumes the baseFolder exists.\n */\nfunction _ensureAndJoinPath(baseFolder, ...pathSegments) {\n    let joinedPath = baseFolder;\n    try {\n        for (let pathSegment of pathSegments) {\n            pathSegment = pathSegment.replace(/[\\\\\\/]/g, '+');\n            joinedPath = path__WEBPACK_IMPORTED_MODULE_3__.join(joinedPath, pathSegment);\n            if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(joinedPath)) {\n                fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(joinedPath);\n            }\n        }\n    }\n    catch (e) {\n        throw new Error(`Error building local installation folder (${path__WEBPACK_IMPORTED_MODULE_3__.join(baseFolder, ...pathSegments)}): ${e}`);\n    }\n    return joinedPath;\n}\nfunction _getRushTempFolder(rushCommonFolder) {\n    const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME];\n    if (rushTempFolder !== undefined) {\n        _ensureFolder(rushTempFolder);\n        return rushTempFolder;\n    }\n    else {\n        return _ensureAndJoinPath(rushCommonFolder, 'temp');\n    }\n}\n/**\n * Compare version strings according to semantic versioning.\n * Returns a positive integer if \"a\" is a later version than \"b\",\n * a negative integer if \"b\" is later than \"a\",\n * and 0 otherwise.\n */\nfunction _compareVersionStrings(a, b) {\n    const aParts = a.split(/[.-]/);\n    const bParts = b.split(/[.-]/);\n    const numberOfParts = Math.max(aParts.length, bParts.length);\n    for (let i = 0; i < numberOfParts; i++) {\n        if (aParts[i] !== bParts[i]) {\n            return (Number(aParts[i]) || 0) - (Number(bParts[i]) || 0);\n        }\n    }\n    return 0;\n}\n/**\n * Resolve a package specifier to a static version\n */\nfunction _resolvePackageVersion(logger, rushCommonFolder, { name, version }) {\n    if (!version) {\n        version = '*'; // If no version is specified, use the latest version\n    }\n    if (version.match(/^[a-zA-Z0-9\\-\\+\\.]+$/)) {\n        // If the version contains only characters that we recognize to be used in static version specifiers,\n        // pass the version through\n        return version;\n    }\n    else {\n        // version resolves to\n        try {\n            const rushTempFolder = _getRushTempFolder(rushCommonFolder);\n            const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush');\n            (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)({\n                sourceNpmrcFolder,\n                targetNpmrcFolder: rushTempFolder,\n                logger,\n                supportEnvVarFallbackSyntax: false\n            });\n            const npmPath = getNpmPath();\n            // This returns something that looks like:\n            // ```\n            // [\n            //   \"3.0.0\",\n            //   \"3.0.1\",\n            //   ...\n            //   \"3.0.20\"\n            // ]\n            // ```\n            //\n            // if multiple versions match the selector, or\n            //\n            // ```\n            // \"3.0.0\"\n            // ```\n            //\n            // if only a single version matches.\n            const spawnSyncOptions = {\n                cwd: rushTempFolder,\n                stdio: [],\n                shell: _isWindows()\n            };\n            const platformNpmPath = _getPlatformPath(npmPath);\n            const npmVersionSpawnResult = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformNpmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier', '--json'], spawnSyncOptions);\n            if (npmVersionSpawnResult.status !== 0) {\n                throw new Error(`\"npm view\" returned error code ${npmVersionSpawnResult.status}`);\n            }\n            const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString();\n            const parsedVersionOutput = JSON.parse(npmViewVersionOutput);\n            const versions = Array.isArray(parsedVersionOutput)\n                ? parsedVersionOutput\n                : [parsedVersionOutput];\n            let latestVersion = versions[0];\n            for (let i = 1; i < versions.length; i++) {\n                const latestVersionCandidate = versions[i];\n                if (_compareVersionStrings(latestVersionCandidate, latestVersion) > 0) {\n                    latestVersion = latestVersionCandidate;\n                }\n            }\n            if (!latestVersion) {\n                throw new Error('No versions found for the specified version range.');\n            }\n            return latestVersion;\n        }\n        catch (e) {\n            throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`);\n        }\n    }\n}\nlet _rushJsonFolder;\n/**\n * Find the absolute path to the folder containing rush.json\n */\nfunction findRushJsonFolder() {\n    if (!_rushJsonFolder) {\n        let basePath = __dirname;\n        let tempPath = __dirname;\n        do {\n            const testRushJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(basePath, RUSH_JSON_FILENAME);\n            if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(testRushJsonPath)) {\n                _rushJsonFolder = basePath;\n                break;\n            }\n            else {\n                basePath = tempPath;\n            }\n        } while (basePath !== (tempPath = path__WEBPACK_IMPORTED_MODULE_3__.dirname(basePath))); // Exit the loop when we hit the disk root\n        if (!_rushJsonFolder) {\n            throw new Error(`Unable to find ${RUSH_JSON_FILENAME}.`);\n        }\n    }\n    return _rushJsonFolder;\n}\n/**\n * Detects if the package in the specified directory is installed\n */\nfunction _isPackageAlreadyInstalled(packageInstallFolder) {\n    try {\n        const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(flagFilePath)) {\n            return false;\n        }\n        const fileContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(flagFilePath).toString();\n        return fileContents.trim() === process.version;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Delete a file. Fail silently if it does not exist.\n */\nfunction _deleteFile(file) {\n    try {\n        fs__WEBPACK_IMPORTED_MODULE_1__.unlinkSync(file);\n    }\n    catch (err) {\n        if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') {\n            throw err;\n        }\n    }\n}\n/**\n * Removes the following files and directories under the specified folder path:\n *  - installed.flag\n *  -\n *  - node_modules\n */\nfunction _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) {\n    try {\n        const flagFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        _deleteFile(flagFile);\n        const packageLockFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, 'package-lock.json');\n        if (lockFilePath) {\n            fs__WEBPACK_IMPORTED_MODULE_1__.copyFileSync(lockFilePath, packageLockFile);\n        }\n        else {\n            // Not running `npm ci`, so need to cleanup\n            _deleteFile(packageLockFile);\n            const nodeModulesFolder = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME);\n            if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(nodeModulesFolder)) {\n                const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler');\n                fs__WEBPACK_IMPORTED_MODULE_1__.renameSync(nodeModulesFolder, path__WEBPACK_IMPORTED_MODULE_3__.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`));\n            }\n        }\n    }\n    catch (e) {\n        throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`);\n    }\n}\nfunction _createPackageJson(packageInstallFolder, name, version) {\n    try {\n        const packageJsonContents = {\n            name: 'ci-rush',\n            version: '0.0.0',\n            dependencies: {\n                [name]: version\n            },\n            description: \"DON'T WARN\",\n            repository: \"DON'T WARN\",\n            license: 'MIT'\n        };\n        const packageJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, PACKAGE_JSON_FILENAME);\n        fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2));\n    }\n    catch (e) {\n        throw new Error(`Unable to create package.json: ${e}`);\n    }\n}\n/**\n * Run \"npm install\" in the package install folder.\n */\nfunction _installPackage(logger, packageInstallFolder, name, version, command) {\n    try {\n        logger.info(`Installing ${name}...`);\n        const npmPath = getNpmPath();\n        const platformNpmPath = _getPlatformPath(npmPath);\n        const result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformNpmPath, [command], {\n            stdio: 'inherit',\n            cwd: packageInstallFolder,\n            env: process.env,\n            shell: _isWindows()\n        });\n        if (result.status !== 0) {\n            throw new Error(`\"npm ${command}\" encountered an error`);\n        }\n        logger.info(`Successfully installed ${name}@${version}`);\n    }\n    catch (e) {\n        throw new Error(`Unable to install package: ${e}`);\n    }\n}\n/**\n * Get the \".bin\" path for the package.\n */\nfunction _getBinPath(packageInstallFolder, binName) {\n    const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');\n    const resolvedBinName = _isWindows() ? `${binName}.cmd` : binName;\n    return path__WEBPACK_IMPORTED_MODULE_3__.resolve(binFolderPath, resolvedBinName);\n}\n/**\n * Returns a cross-platform path - windows must enclose any path containing spaces within double quotes.\n */\nfunction _getPlatformPath(platformPath) {\n    return _isWindows() && platformPath.includes(' ') ? `\"${platformPath}\"` : platformPath;\n}\nfunction _isWindows() {\n    return os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32';\n}\n/**\n * Write a flag file to the package's install directory, signifying that the install was successful.\n */\nfunction _writeFlagFile(packageInstallFolder) {\n    try {\n        const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(flagFilePath, process.version);\n    }\n    catch (e) {\n        throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`);\n    }\n}\nfunction installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) {\n    const rushJsonFolder = findRushJsonFolder();\n    const rushCommonFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushJsonFolder, 'common');\n    const rushTempFolder = _getRushTempFolder(rushCommonFolder);\n    const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`);\n    if (!_isPackageAlreadyInstalled(packageInstallFolder)) {\n        // The package isn't already installed\n        _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath);\n        const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush');\n        (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)({\n            sourceNpmrcFolder,\n            targetNpmrcFolder: packageInstallFolder,\n            logger,\n            supportEnvVarFallbackSyntax: false\n        });\n        _createPackageJson(packageInstallFolder, packageName, packageVersion);\n        const command = lockFilePath ? 'ci' : 'install';\n        _installPackage(logger, packageInstallFolder, packageName, packageVersion, command);\n        _writeFlagFile(packageInstallFolder);\n    }\n    const statusMessage = `Invoking \"${packageBinName} ${packageBinArgs.join(' ')}\"`;\n    const statusMessageLine = new Array(statusMessage.length + 1).join('-');\n    logger.info('\\n' + statusMessage + '\\n' + statusMessageLine + '\\n');\n    const binPath = _getBinPath(packageInstallFolder, packageBinName);\n    const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');\n    // Windows environment variables are case-insensitive.  Instead of using SpawnSyncOptions.env, we need to\n    // assign via the process.env proxy to ensure that we append to the right PATH key.\n    const originalEnvPath = process.env.PATH || '';\n    let result;\n    try {\n        // `npm` bin stubs on Windows are `.cmd` files\n        // Node.js will not directly invoke a `.cmd` file unless `shell` is set to `true`\n        const platformBinPath = _getPlatformPath(binPath);\n        process.env.PATH = [binFolderPath, originalEnvPath].join(path__WEBPACK_IMPORTED_MODULE_3__.delimiter);\n        result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformBinPath, packageBinArgs, {\n            stdio: 'inherit',\n            windowsVerbatimArguments: false,\n            shell: _isWindows(),\n            cwd: process.cwd(),\n            env: process.env\n        });\n    }\n    finally {\n        process.env.PATH = originalEnvPath;\n    }\n    if (result.status !== null) {\n        // ------------------------------------------\n        // Manual edit of the original install-run.js\n        // ------------------------------------------\n        \n        if (result.status == 1) {\n            return 0;\n        }\n        \n        // -------------------------------------------------\n        // End of Manual edit of the original install-run.js\n        // -------------------------------------------------\n        return result.status;\n    }\n    else {\n        throw result.error || new Error('An unknown error occurred.');\n    }\n}\nfunction runWithErrorAndStatusCode(logger, fn) {\n    process.exitCode = 1;\n    try {\n        const exitCode = fn();\n        process.exitCode = exitCode;\n    }\n    catch (e) {\n        logger.error('\\n\\n' + e.toString() + '\\n\\n');\n    }\n}\nfunction _run() {\n    const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv;\n    if (!nodePath) {\n        throw new Error('Unexpected exception: could not detect node path');\n    }\n    if (path__WEBPACK_IMPORTED_MODULE_3__.basename(scriptPath).toLowerCase() !== 'install-run.js') {\n        // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control\n        // to the script that (presumably) imported this file\n        return;\n    }\n    if (process.argv.length < 4) {\n        console.log('Usage: install-run.js <package>@<version> <command> [args...]');\n        console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io');\n        process.exit(1);\n    }\n    const logger = { info: console.log, error: console.error };\n    runWithErrorAndStatusCode(logger, () => {\n        const rushJsonFolder = findRushJsonFolder();\n        const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common');\n        const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier);\n        const name = packageSpecifier.name;\n        const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier);\n        if (packageSpecifier.version !== version) {\n            console.log(`Resolved to ${name}@${version}`);\n        }\n        return installAndRun(logger, name, version, packageBinName, packageBinArgs);\n    });\n}\n_run();\n//# sourceMappingURL=install-run.js.map\n})();\n\nmodule.exports = __webpack_exports__;\n/******/ })()\n;\n//# sourceMappingURL=install-run.js.map"
  },
  {
    "path": "common/scripts/install-run.js",
    "content": "// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.\n//\n// This script is intended for usage in an automated build environment where a Node tool may not have\n// been preinstalled, or may have an unpredictable version.  This script will automatically install the specified\n// version of the specified tool (if not already installed), and then pass a command-line to it.\n// An example usage would be:\n//\n//    node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io\n//\n// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/\n//\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @microsoft/rush package's LICENSE file for details.\n\n/******/ (() => { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 953844\n/*!**************************************************************!*\\\n  !*** ./lib-intermediate-esm/utilities/executionUtilities.js ***!\n  \\**************************************************************/\n(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   IS_WINDOWS: () => (/* binding */ IS_WINDOWS),\n/* harmony export */   escapeArgumentIfNeeded: () => (/* binding */ escapeArgumentIfNeeded)\n/* harmony export */ });\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\nconst IS_WINDOWS = process.platform === 'win32';\nfunction escapeArgumentIfNeeded(command, isWindows = IS_WINDOWS) {\n    if (command.includes(' ')) {\n        if (isWindows) {\n            // Windows: use double quotes and escape internal double quotes\n            return `\"${command.replace(/\"/g, '\"\"')}\"`;\n        }\n        else {\n            // Unix: use JSON.stringify for proper escaping\n            return JSON.stringify(command);\n        }\n    }\n    else {\n        return command;\n    }\n}\n//# sourceMappingURL=executionUtilities.js.map\n\n/***/ },\n\n/***/ 359480\n/*!**********************************************************!*\\\n  !*** ./lib-intermediate-esm/utilities/npmrcUtilities.js ***!\n  \\**********************************************************/\n(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   isVariableSetInNpmrcFile: () => (/* binding */ isVariableSetInNpmrcFile),\n/* harmony export */   syncNpmrc: () => (/* binding */ syncNpmrc),\n/* harmony export */   trimNpmrcFileLines: () => (/* binding */ trimNpmrcFileLines)\n/* harmony export */ });\n/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node:fs */ 973024);\n/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! node:path */ 176760);\n/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(node_path__WEBPACK_IMPORTED_MODULE_1__);\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n// IMPORTANT - do not use any non-built-in libraries in this file\n\n\n/**\n * This function reads the content for given .npmrc file path, and also trims\n * unusable lines from the .npmrc file.\n *\n * @returns\n * The text of the the .npmrc.\n */\nfunction _trimNpmrcFile(options) {\n    const { sourceNpmrcPath, linesToPrepend, linesToAppend, supportEnvVarFallbackSyntax, filterNpmIncompatibleProperties, env = process.env } = options;\n    let npmrcFileLines = [];\n    if (linesToPrepend) {\n        npmrcFileLines.push(...linesToPrepend);\n    }\n    if (node_fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) {\n        npmrcFileLines.push(...node_fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(sourceNpmrcPath).toString().split('\\n'));\n    }\n    if (linesToAppend) {\n        npmrcFileLines.push(...linesToAppend);\n    }\n    npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim());\n    const resultLines = trimNpmrcFileLines(npmrcFileLines, env, supportEnvVarFallbackSyntax, filterNpmIncompatibleProperties);\n    const combinedNpmrc = resultLines.join('\\n');\n    return combinedNpmrc;\n}\n/**\n * List of npmrc properties that are not supported by npm but may be present in the config.\n * These include pnpm-specific properties and deprecated npm properties.\n */\nconst NPM_INCOMPATIBLE_PROPERTIES = new Set([\n    // pnpm-specific hoisting configuration\n    'hoist',\n    'hoist-pattern',\n    'public-hoist-pattern',\n    'shamefully-hoist',\n    // Deprecated or unknown npm properties that cause warnings\n    'email',\n    'publish-branch'\n]);\n/**\n * List of registry-scoped npmrc property suffixes that are pnpm-specific.\n * These are properties like \"//registry.example.com/:tokenHelper\" where \"tokenHelper\"\n * is the suffix after the last colon.\n */\nconst NPM_INCOMPATIBLE_REGISTRY_SCOPED_PROPERTIES = new Set([\n    // pnpm-specific token helper properties\n    'tokenHelper',\n    'urlTokenHelper'\n]);\n/**\n * Regular expression to extract property names from .npmrc lines.\n * Matches everything before '=', '[', or whitespace to capture the property name.\n * Note: The 'g' flag is intentionally omitted since we only need the first match.\n * Examples:\n *   \"registry=https://...\" -> matches \"registry\"\n *   \"hoist-pattern[]=...\" -> matches \"hoist-pattern\"\n */\nconst PROPERTY_NAME_REGEX = /^([^=\\[\\s]+)/;\n/**\n * Regular expression to extract environment variable names and optional fallback values.\n * Matches patterns like:\n *   nameString                 -> group 1: nameString,    group 2: undefined\n *   nameString-fallbackString  -> group 1: nameString,    group 2: fallbackString\n *   nameString:-fallbackString -> group 1: nameString,    group 2: fallbackString\n */\nconst ENV_VAR_WITH_FALLBACK_REGEX = /^(?<name>[^:-]+)(?::?-(?<fallback>.+))?$/;\n/**\n *\n * @param npmrcFileLines The npmrc file's lines\n * @param env The environment variables object\n * @param supportEnvVarFallbackSyntax Whether to support fallback values in the form of `${VAR_NAME:-fallback}`\n * @param filterNpmIncompatibleProperties Whether to filter out properties that npm doesn't understand\n * @returns An array of processed npmrc file lines with undefined environment variables and npm-incompatible properties commented out\n */\nfunction trimNpmrcFileLines(npmrcFileLines, env, supportEnvVarFallbackSyntax, filterNpmIncompatibleProperties = false) {\n    var _a, _b, _c;\n    const resultLines = [];\n    // This finds environment variable tokens that look like \"${VAR_NAME}\"\n    const expansionRegExp = /\\$\\{([^\\}]+)\\}/g;\n    // Comment lines start with \"#\" or \";\"\n    const commentRegExp = /^\\s*[#;]/;\n    // Trim out lines that reference environment variables that aren't defined\n    for (let line of npmrcFileLines) {\n        let lineShouldBeTrimmed = false;\n        let trimReason = '';\n        //remove spaces before or after key and value\n        line = line\n            .split('=')\n            .map((lineToTrim) => lineToTrim.trim())\n            .join('=');\n        // Ignore comment lines\n        if (!commentRegExp.test(line)) {\n            // Check if this is a property that npm doesn't understand\n            if (filterNpmIncompatibleProperties) {\n                // Extract the property name (everything before the '=' or '[')\n                const match = line.match(PROPERTY_NAME_REGEX);\n                if (match) {\n                    const propertyName = match[1];\n                    // Check if this is a registry-scoped property (starts with \"//\" like \"//registry.npmjs.org/:_authToken\")\n                    const isRegistryScoped = propertyName.startsWith('//');\n                    if (isRegistryScoped) {\n                        // For registry-scoped properties, check if the suffix (after the last colon) is npm-incompatible\n                        // Example: \"//registry.example.com/:tokenHelper\" -> suffix is \"tokenHelper\"\n                        const lastColonIndex = propertyName.lastIndexOf(':');\n                        if (lastColonIndex !== -1) {\n                            const registryPropertySuffix = propertyName.substring(lastColonIndex + 1);\n                            if (NPM_INCOMPATIBLE_REGISTRY_SCOPED_PROPERTIES.has(registryPropertySuffix)) {\n                                lineShouldBeTrimmed = true;\n                                trimReason = 'NPM_INCOMPATIBLE_PROPERTY';\n                            }\n                        }\n                    }\n                    else {\n                        // For non-registry-scoped properties, check the full property name\n                        if (NPM_INCOMPATIBLE_PROPERTIES.has(propertyName)) {\n                            lineShouldBeTrimmed = true;\n                            trimReason = 'NPM_INCOMPATIBLE_PROPERTY';\n                        }\n                    }\n                }\n            }\n            // Check for undefined environment variables\n            if (!lineShouldBeTrimmed) {\n                const environmentVariables = line.match(expansionRegExp);\n                if (environmentVariables) {\n                    for (const token of environmentVariables) {\n                        /**\n                         * Remove the leading \"${\" and the trailing \"}\" from the token\n                         *\n                         * ${nameString}                  -> nameString\n                         * ${nameString-fallbackString}   -> name-fallbackString\n                         * ${nameString:-fallbackString}  -> name:-fallbackString\n                         */\n                        const nameWithFallback = token.slice(2, -1);\n                        let environmentVariableName;\n                        let fallback;\n                        if (supportEnvVarFallbackSyntax) {\n                            /**\n                             * Get the environment variable name and fallback value.\n                             *\n                             *                                name          fallback\n                             * nameString                 ->  nameString    undefined\n                             * nameString-fallbackString  ->  nameString    fallbackString\n                             * nameString:-fallbackString ->  nameString    fallbackString\n                             */\n                            const matched = nameWithFallback.match(ENV_VAR_WITH_FALLBACK_REGEX);\n                            environmentVariableName = (_b = (_a = matched === null || matched === void 0 ? void 0 : matched.groups) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : nameWithFallback;\n                            fallback = (_c = matched === null || matched === void 0 ? void 0 : matched.groups) === null || _c === void 0 ? void 0 : _c.fallback;\n                        }\n                        else {\n                            environmentVariableName = nameWithFallback;\n                        }\n                        // Is the environment variable and fallback value defined.\n                        if (!env[environmentVariableName] && !fallback) {\n                            // No, so trim this line\n                            lineShouldBeTrimmed = true;\n                            trimReason = 'MISSING_ENVIRONMENT_VARIABLE';\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        if (lineShouldBeTrimmed) {\n            // Comment out the line with appropriate reason\n            if (trimReason === 'NPM_INCOMPATIBLE_PROPERTY') {\n                // Example output:\n                // \"; UNSUPPORTED BY NPM: email=test@example.com\"\n                resultLines.push('; UNSUPPORTED BY NPM: ' + line);\n            }\n            else {\n                // Example output:\n                // \"; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}\"\n                resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line);\n            }\n        }\n        else {\n            resultLines.push(line);\n        }\n    }\n    return resultLines;\n}\nfunction _copyAndTrimNpmrcFile(options) {\n    const { logger, sourceNpmrcPath, targetNpmrcPath } = options;\n    logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose\n    logger.info(`  --> \"${targetNpmrcPath}\"`);\n    const combinedNpmrc = _trimNpmrcFile(options);\n    node_fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(targetNpmrcPath, combinedNpmrc);\n    return combinedNpmrc;\n}\nfunction syncNpmrc(options) {\n    const { sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish, logger = {\n        // eslint-disable-next-line no-console\n        info: console.log,\n        // eslint-disable-next-line no-console\n        error: console.error\n    }, createIfMissing = false } = options;\n    const sourceNpmrcPath = node_path__WEBPACK_IMPORTED_MODULE_1__.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish');\n    const targetNpmrcPath = node_path__WEBPACK_IMPORTED_MODULE_1__.join(targetNpmrcFolder, '.npmrc');\n    try {\n        if (node_fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath) || createIfMissing) {\n            // Ensure the target folder exists\n            if (!node_fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcFolder)) {\n                node_fs__WEBPACK_IMPORTED_MODULE_0__.mkdirSync(targetNpmrcFolder, { recursive: true });\n            }\n            return _copyAndTrimNpmrcFile({\n                sourceNpmrcPath,\n                targetNpmrcPath,\n                logger,\n                ...options\n            });\n        }\n        else if (node_fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcPath)) {\n            // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target\n            logger.info(`Deleting ${targetNpmrcPath}`); // Verbose\n            node_fs__WEBPACK_IMPORTED_MODULE_0__.unlinkSync(targetNpmrcPath);\n        }\n    }\n    catch (e) {\n        throw new Error(`Error syncing .npmrc file: ${e}`);\n    }\n}\nfunction isVariableSetInNpmrcFile(sourceNpmrcFolder, variableKey, supportEnvVarFallbackSyntax) {\n    const sourceNpmrcPath = `${sourceNpmrcFolder}/.npmrc`;\n    //if .npmrc file does not exist, return false directly\n    if (!node_fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) {\n        return false;\n    }\n    const trimmedNpmrcFile = _trimNpmrcFile({\n        sourceNpmrcPath,\n        supportEnvVarFallbackSyntax,\n        filterNpmIncompatibleProperties: false\n    });\n    const variableKeyRegExp = new RegExp(`^${variableKey}=`, 'm');\n    return trimmedNpmrcFile.match(variableKeyRegExp) !== null;\n}\n//# sourceMappingURL=npmrcUtilities.js.map\n\n/***/ },\n\n/***/ 731421\n/*!*************************************!*\\\n  !*** external \"node:child_process\" ***!\n  \\*************************************/\n(module) {\n\nmodule.exports = require(\"node:child_process\");\n\n/***/ },\n\n/***/ 973024\n/*!**************************!*\\\n  !*** external \"node:fs\" ***!\n  \\**************************/\n(module) {\n\nmodule.exports = require(\"node:fs\");\n\n/***/ },\n\n/***/ 848161\n/*!**************************!*\\\n  !*** external \"node:os\" ***!\n  \\**************************/\n(module) {\n\nmodule.exports = require(\"node:os\");\n\n/***/ },\n\n/***/ 176760\n/*!****************************!*\\\n  !*** external \"node:path\" ***!\n  \\****************************/\n(module) {\n\nmodule.exports = require(\"node:path\");\n\n/***/ }\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Check if module exists (development only)\n/******/ \t\tif (__webpack_modules__[moduleId] === undefined) {\n/******/ \t\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n/******/ \t\t\te.code = 'MODULE_NOT_FOUND';\n/******/ \t\t\tthrow e;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.\n(() => {\n/*!*****************************************************!*\\\n  !*** ./lib-intermediate-esm/scripts/install-run.js ***!\n  \\*****************************************************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   RUSH_JSON_FILENAME: () => (/* binding */ RUSH_JSON_FILENAME),\n/* harmony export */   findRushJsonFolder: () => (/* binding */ findRushJsonFolder),\n/* harmony export */   getNpmPath: () => (/* binding */ getNpmPath),\n/* harmony export */   installAndRun: () => (/* binding */ installAndRun),\n/* harmony export */   runWithErrorAndStatusCode: () => (/* binding */ runWithErrorAndStatusCode)\n/* harmony export */ });\n/* harmony import */ var node_child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node:child_process */ 731421);\n/* harmony import */ var node_child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_child_process__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! node:fs */ 973024);\n/* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var node_os__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node:os */ 848161);\n/* harmony import */ var node_os__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_os__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! node:path */ 176760);\n/* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(node_path__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/npmrcUtilities */ 359480);\n/* harmony import */ var _utilities_executionUtilities__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities/executionUtilities */ 953844);\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n/* eslint-disable no-console */\n\n\n\n\n\n\nconst RUSH_JSON_FILENAME = 'rush.json';\nconst RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER';\nconst INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH';\nconst INSTALLED_FLAG_FILENAME = 'installed.flag';\nconst NODE_MODULES_FOLDER_NAME = 'node_modules';\nconst PACKAGE_JSON_FILENAME = 'package.json';\n/**\n * Parse a package specifier (in the form of name\\@version) into name and version parts.\n */\nfunction _parsePackageSpecifier(rawPackageSpecifier) {\n    rawPackageSpecifier = (rawPackageSpecifier || '').trim();\n    const separatorIndex = rawPackageSpecifier.lastIndexOf('@');\n    let name;\n    let version = undefined;\n    if (separatorIndex === 0) {\n        // The specifier starts with a scope and doesn't have a version specified\n        name = rawPackageSpecifier;\n    }\n    else if (separatorIndex === -1) {\n        // The specifier doesn't have a version\n        name = rawPackageSpecifier;\n    }\n    else {\n        name = rawPackageSpecifier.substring(0, separatorIndex);\n        version = rawPackageSpecifier.substring(separatorIndex + 1);\n    }\n    if (!name) {\n        throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`);\n    }\n    return { name, version };\n}\nlet _npmPath = undefined;\n/**\n * Get the absolute path to the npm executable\n */\nfunction getNpmPath() {\n    if (!_npmPath) {\n        try {\n            if (_utilities_executionUtilities__WEBPACK_IMPORTED_MODULE_5__.IS_WINDOWS) {\n                // We're on Windows\n                const whereOutput = node_child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('where npm', { stdio: [] }).toString();\n                const lines = whereOutput.split(node_os__WEBPACK_IMPORTED_MODULE_2__.EOL).filter((line) => !!line);\n                // take the last result, we are looking for a .cmd command\n                // see https://github.com/microsoft/rushstack/issues/759\n                _npmPath = lines[lines.length - 1];\n            }\n            else {\n                // We aren't on Windows - assume we're on *NIX or Darwin\n                _npmPath = node_child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('command -v npm', { stdio: [] }).toString();\n            }\n        }\n        catch (e) {\n            throw new Error(`Unable to determine the path to the NPM tool: ${e}`);\n        }\n        _npmPath = _npmPath.trim();\n        if (!node_fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(_npmPath)) {\n            throw new Error('The NPM executable does not exist');\n        }\n    }\n    return _npmPath;\n}\nfunction _ensureFolder(folderPath) {\n    if (!node_fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(folderPath)) {\n        const parentDir = node_path__WEBPACK_IMPORTED_MODULE_3__.dirname(folderPath);\n        _ensureFolder(parentDir);\n        node_fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(folderPath);\n    }\n}\n/**\n * Create missing directories under the specified base directory, and return the resolved directory.\n *\n * Does not support \".\" or \"..\" path segments.\n * Assumes the baseFolder exists.\n */\nfunction _ensureAndJoinPath(baseFolder, ...pathSegments) {\n    let joinedPath = baseFolder;\n    try {\n        for (let pathSegment of pathSegments) {\n            pathSegment = pathSegment.replace(/[\\\\\\/]/g, '+');\n            joinedPath = node_path__WEBPACK_IMPORTED_MODULE_3__.join(joinedPath, pathSegment);\n            if (!node_fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(joinedPath)) {\n                node_fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(joinedPath);\n            }\n        }\n    }\n    catch (e) {\n        throw new Error(`Error building local installation folder (${node_path__WEBPACK_IMPORTED_MODULE_3__.join(baseFolder, ...pathSegments)}): ${e}`);\n    }\n    return joinedPath;\n}\nfunction _getRushTempFolder(rushCommonFolder) {\n    const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME];\n    if (rushTempFolder !== undefined) {\n        _ensureFolder(rushTempFolder);\n        return rushTempFolder;\n    }\n    else {\n        return _ensureAndJoinPath(rushCommonFolder, 'temp');\n    }\n}\n/**\n * Compare version strings according to semantic versioning.\n * Returns a positive integer if \"a\" is a later version than \"b\",\n * a negative integer if \"b\" is later than \"a\",\n * and 0 otherwise.\n */\nfunction _compareVersionStrings(a, b) {\n    const aParts = a.split(/[.-]/);\n    const bParts = b.split(/[.-]/);\n    const numberOfParts = Math.max(aParts.length, bParts.length);\n    for (let i = 0; i < numberOfParts; i++) {\n        if (aParts[i] !== bParts[i]) {\n            return (Number(aParts[i]) || 0) - (Number(bParts[i]) || 0);\n        }\n    }\n    return 0;\n}\n/**\n * Resolve a package specifier to a static version\n */\nfunction _resolvePackageVersion(logger, rushCommonFolder, { name, version }) {\n    if (!version) {\n        version = '*'; // If no version is specified, use the latest version\n    }\n    if (version.match(/^[a-zA-Z0-9\\-\\+\\.]+$/)) {\n        // If the version contains only characters that we recognize to be used in static version specifiers,\n        // pass the version through\n        return version;\n    }\n    else {\n        // version resolves to\n        try {\n            const rushTempFolder = _getRushTempFolder(rushCommonFolder);\n            const sourceNpmrcFolder = node_path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush');\n            (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)({\n                sourceNpmrcFolder,\n                targetNpmrcFolder: rushTempFolder,\n                logger,\n                supportEnvVarFallbackSyntax: false,\n                // Always filter npm-incompatible properties in install-run scripts.\n                // Any warnings will be shown when running Rush commands directly.\n                filterNpmIncompatibleProperties: true\n            });\n            // This returns something that looks like:\n            // ```\n            // [\n            //   \"3.0.0\",\n            //   \"3.0.1\",\n            //   ...\n            //   \"3.0.20\"\n            // ]\n            // ```\n            //\n            // if multiple versions match the selector, or\n            //\n            // ```\n            // \"3.0.0\"\n            // ```\n            //\n            // if only a single version matches.\n            const npmVersionSpawnResult = _runNpmConfirmSuccess(['view', `${name}@${version}`, 'version', '--no-update-notifier', '--json'], {\n                cwd: rushTempFolder,\n                stdio: [],\n                env: process.env\n            }, 'npm view');\n            const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString();\n            const parsedVersionOutput = JSON.parse(npmViewVersionOutput);\n            const versions = Array.isArray(parsedVersionOutput)\n                ? parsedVersionOutput\n                : [parsedVersionOutput];\n            let latestVersion = versions[0];\n            for (let i = 1; i < versions.length; i++) {\n                const latestVersionCandidate = versions[i];\n                if (_compareVersionStrings(latestVersionCandidate, latestVersion) > 0) {\n                    latestVersion = latestVersionCandidate;\n                }\n            }\n            if (!latestVersion) {\n                throw new Error('No versions found for the specified version range.');\n            }\n            return latestVersion;\n        }\n        catch (e) {\n            throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`);\n        }\n    }\n}\nlet _rushJsonFolder;\n/**\n * Find the absolute path to the folder containing rush.json\n */\nfunction findRushJsonFolder() {\n    if (!_rushJsonFolder) {\n        let basePath = __dirname;\n        let tempPath = __dirname;\n        do {\n            const testRushJsonPath = node_path__WEBPACK_IMPORTED_MODULE_3__.join(basePath, RUSH_JSON_FILENAME);\n            if (node_fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(testRushJsonPath)) {\n                _rushJsonFolder = basePath;\n                break;\n            }\n            else {\n                basePath = tempPath;\n            }\n        } while (basePath !== (tempPath = node_path__WEBPACK_IMPORTED_MODULE_3__.dirname(basePath))); // Exit the loop when we hit the disk root\n        if (!_rushJsonFolder) {\n            throw new Error(`Unable to find ${RUSH_JSON_FILENAME}.`);\n        }\n    }\n    return _rushJsonFolder;\n}\n/**\n * Detects if the package in the specified directory is installed\n */\nfunction _isPackageAlreadyInstalled(packageInstallFolder) {\n    try {\n        const flagFilePath = node_path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        if (!node_fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(flagFilePath)) {\n            return false;\n        }\n        const fileContents = node_fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(flagFilePath).toString();\n        return fileContents.trim() === process.version;\n    }\n    catch (e) {\n        return false;\n    }\n}\n/**\n * Delete a file. Fail silently if it does not exist.\n */\nfunction _deleteFile(file) {\n    try {\n        node_fs__WEBPACK_IMPORTED_MODULE_1__.unlinkSync(file);\n    }\n    catch (err) {\n        if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') {\n            throw err;\n        }\n    }\n}\n/**\n * Removes the following files and directories under the specified folder path:\n *  - installed.flag\n *  -\n *  - node_modules\n */\nfunction _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) {\n    try {\n        const flagFile = node_path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        _deleteFile(flagFile);\n        const packageLockFile = node_path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, 'package-lock.json');\n        if (lockFilePath) {\n            node_fs__WEBPACK_IMPORTED_MODULE_1__.copyFileSync(lockFilePath, packageLockFile);\n        }\n        else {\n            // Not running `npm ci`, so need to cleanup\n            _deleteFile(packageLockFile);\n            const nodeModulesFolder = node_path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME);\n            if (node_fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(nodeModulesFolder)) {\n                const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler');\n                node_fs__WEBPACK_IMPORTED_MODULE_1__.renameSync(nodeModulesFolder, node_path__WEBPACK_IMPORTED_MODULE_3__.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`));\n            }\n        }\n    }\n    catch (e) {\n        throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`);\n    }\n}\nfunction _createPackageJson(packageInstallFolder, name, version) {\n    try {\n        const packageJsonContents = {\n            name: 'ci-rush',\n            version: '0.0.0',\n            dependencies: {\n                [name]: version\n            },\n            description: \"DON'T WARN\",\n            repository: \"DON'T WARN\",\n            license: 'MIT'\n        };\n        const packageJsonPath = node_path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, PACKAGE_JSON_FILENAME);\n        node_fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2));\n    }\n    catch (e) {\n        throw new Error(`Unable to create package.json: ${e}`);\n    }\n}\n/**\n * Run \"npm install\" in the package install folder.\n */\nfunction _installPackage(logger, packageInstallFolder, name, version, npmCommand) {\n    try {\n        logger.info(`Installing ${name}...`);\n        _runNpmConfirmSuccess([npmCommand], {\n            stdio: 'inherit',\n            cwd: packageInstallFolder,\n            env: process.env\n        }, `npm ${npmCommand}`);\n        logger.info(`Successfully installed ${name}@${version}`);\n    }\n    catch (e) {\n        throw new Error(`Unable to install package: ${e}`);\n    }\n}\n/**\n * Get the \".bin\" path for the package.\n */\nfunction _getBinPath(packageInstallFolder, binName) {\n    const binFolderPath = node_path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');\n    const resolvedBinName = _utilities_executionUtilities__WEBPACK_IMPORTED_MODULE_5__.IS_WINDOWS ? `${binName}.cmd` : binName;\n    return node_path__WEBPACK_IMPORTED_MODULE_3__.resolve(binFolderPath, resolvedBinName);\n}\nfunction _buildShellCommand(command, args) {\n    const escapedCommand = (0,_utilities_executionUtilities__WEBPACK_IMPORTED_MODULE_5__.escapeArgumentIfNeeded)(command);\n    const escapedArgs = args.map((arg) => (0,_utilities_executionUtilities__WEBPACK_IMPORTED_MODULE_5__.escapeArgumentIfNeeded)(arg));\n    return [escapedCommand, ...escapedArgs].join(' ');\n}\n/**\n * Write a flag file to the package's install directory, signifying that the install was successful.\n */\nfunction _writeFlagFile(packageInstallFolder) {\n    try {\n        const flagFilePath = node_path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);\n        node_fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(flagFilePath, process.version);\n    }\n    catch (e) {\n        throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`);\n    }\n}\n/**\n * Run npm under the platform's shell and throw if it didn't succeed.\n */\nfunction _runNpmConfirmSuccess(args, options, commandNameForLogging) {\n    const command = getNpmPath();\n    let result;\n    if (_utilities_executionUtilities__WEBPACK_IMPORTED_MODULE_5__.IS_WINDOWS) {\n        result = node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(_buildShellCommand(command, args), {\n            ...options,\n            shell: true,\n            windowsVerbatimArguments: false\n        });\n    }\n    else {\n        result = node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(command, args, options);\n    }\n    if (result.status !== 0) {\n        if (!result.status) {\n            // Is status null or undefined?\n            if (result.error) {\n                throw new Error(`\"${commandNameForLogging}\" failed: ${result.error.message.toString()}`);\n            }\n            else if (result.signal) {\n                throw new Error(`\"${commandNameForLogging}\" was terminated by signal: ${result.signal}`);\n            }\n            else {\n                throw new Error(`\"${commandNameForLogging}\" failed for an unknown reason`);\n            }\n        }\n        else {\n            throw new Error(`\"${commandNameForLogging}\" returned error code ${result.status}`);\n        }\n    }\n    return result;\n}\nfunction installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) {\n    const rushJsonFolder = findRushJsonFolder();\n    const rushCommonFolder = node_path__WEBPACK_IMPORTED_MODULE_3__.join(rushJsonFolder, 'common');\n    const rushTempFolder = _getRushTempFolder(rushCommonFolder);\n    const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`);\n    if (!_isPackageAlreadyInstalled(packageInstallFolder)) {\n        // The package isn't already installed\n        _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath);\n        const sourceNpmrcFolder = node_path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush');\n        (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)({\n            sourceNpmrcFolder,\n            targetNpmrcFolder: packageInstallFolder,\n            logger,\n            supportEnvVarFallbackSyntax: false,\n            // Always filter npm-incompatible properties in install-run scripts.\n            // Any warnings will be shown when running Rush commands directly.\n            filterNpmIncompatibleProperties: true\n        });\n        _createPackageJson(packageInstallFolder, packageName, packageVersion);\n        const installCommand = lockFilePath ? 'ci' : 'install';\n        _installPackage(logger, packageInstallFolder, packageName, packageVersion, installCommand);\n        _writeFlagFile(packageInstallFolder);\n    }\n    const statusMessage = `Invoking \"${packageBinName} ${packageBinArgs.join(' ')}\"`;\n    const statusMessageLine = new Array(statusMessage.length + 1).join('-');\n    logger.info('\\n' + statusMessage + '\\n' + statusMessageLine + '\\n');\n    const binPath = _getBinPath(packageInstallFolder, packageBinName);\n    const binFolderPath = node_path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');\n    // Windows environment variables are case-insensitive.  Instead of using SpawnSyncOptions.env, we need to\n    // assign via the process.env proxy to ensure that we append to the right PATH key.\n    const originalEnvPath = process.env.PATH || '';\n    let result;\n    try {\n        process.env.PATH = [binFolderPath, originalEnvPath].join(node_path__WEBPACK_IMPORTED_MODULE_3__.delimiter);\n        const spawnOptions = {\n            stdio: 'inherit',\n            cwd: process.cwd(),\n            env: process.env\n        };\n        if (_utilities_executionUtilities__WEBPACK_IMPORTED_MODULE_5__.IS_WINDOWS) {\n            result = node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(_buildShellCommand(binPath, packageBinArgs), {\n                ...spawnOptions,\n                windowsVerbatimArguments: false,\n                // `npm` bin stubs on Windows are `.cmd` files\n                // Node.js will not directly invoke a `.cmd` file unless `shell` is set to `true`\n                shell: true\n            });\n        }\n        else {\n            result = node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(binPath, packageBinArgs, spawnOptions);\n        }\n    }\n    finally {\n        process.env.PATH = originalEnvPath;\n    }\n    if (result.status !== null) {\n        return result.status;\n    }\n    else {\n        throw result.error || new Error('An unknown error occurred.');\n    }\n}\nfunction runWithErrorAndStatusCode(logger, fn) {\n    process.exitCode = 1;\n    try {\n        const exitCode = fn();\n        process.exitCode = exitCode;\n    }\n    catch (e) {\n        logger.error('\\n\\n' + e.toString() + '\\n\\n');\n    }\n}\nfunction _run() {\n    const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv;\n    if (!nodePath) {\n        throw new Error('Could not detect node path');\n    }\n    const scriptFileName = node_path__WEBPACK_IMPORTED_MODULE_3__.basename(scriptPath).toLowerCase();\n    if (scriptFileName !== 'install-run.js' && scriptFileName !== 'install-run') {\n        // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control\n        // to the script that (presumably) imported this file\n        return;\n    }\n    if (process.argv.length < 4) {\n        console.log('Usage: install-run.js <package>@<version> <command> [args...]');\n        console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io');\n        process.exit(1);\n    }\n    const logger = { info: console.log, error: console.error };\n    runWithErrorAndStatusCode(logger, () => {\n        const rushJsonFolder = findRushJsonFolder();\n        const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common');\n        const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier);\n        const name = packageSpecifier.name;\n        const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier);\n        if (packageSpecifier.version !== version) {\n            console.log(`Resolved to ${name}@${version}`);\n        }\n        return installAndRun(logger, name, version, packageBinName, packageBinArgs);\n    });\n}\n_run();\n//# sourceMappingURL=install-run.js.map\n})();\n\nmodule.exports = __webpack_exports__;\n/******/ })()\n;\n//# sourceMappingURL=install-run.js.map"
  },
  {
    "path": "docs/API-reference.md",
    "content": "### trackPageView\n\n```ts\napplicationInsights.trackPageView(pageView: IPageViewTelemetry)\n```\n\nThe [`IPageViewTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html) interface is below:\n\nParameter | Type | Description\n---|---|---\n[`name?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#name) | string | **Optional**<br>Name of the pageview. Defaults to the document `title`.\n[`uri?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#uri) | string | **Optional**<br>A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n[`refUri?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#refUri) | string | **Optional**<br>The URL of the previous page that sent the user to the current page.\n[`pageType?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#pageType) | string | **Optional**<br>Page Type string. Describes how you classify this page, e.g. errorPage, formPage, etc.\n[`isLoggedIn?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#isLoggedIn) | boolean | **Optional**<br>Whether or not the user is logged in\n[`properties?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IPageViewTelemetry.html#properties) | dictionary | **Optional**<br>Map of string to any: Additional data used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n\n> *Note:* To send a custom duration (ms) of your pageview as an argument, it must be included in the `properties` named field. E.g `appInsights.trackPageView({ properties: { duration: 123.45 } });`.\n\n### startTrackPage\n\n```ts\nstartTrackPage(name?: string)\n```\n\nStarts the timer for tracking a page load time. Use this instead of `trackPageView` if you want to control when the page view timer starts and stops, but don't want to calculate the duration yourself. This method doesn't send any telemetry. Call `stopTrackPage` to log the end of the page view and send the event.\n\nParameter | Type | Description\n---|---|---\n`name?` | string | **Optional**<br>The name used to identify the page in the portal. Defaults to the document title.\n\n### stopTrackPage\n\n```ts\nstopTrackPage(name?: string, url?: string);\n```\n\nStops the timer that was started by calling `startTrackPage` and sends the pageview load time telemetry with the specified properties and measurements. The duration of the page view will be the time between calling `startTrackPage` and `stopTrackPage`.\n\nParameter | Type | Description\n---|---|---\n`name?` | string | **Optional**<br>The name used to identify the page in the portal. Defaults to the document title.\n`url?` |  string | **Optional**<br>A relative or absolute URL that identifies the page or similar item. Defaults to the window location.\n\n### trackMetric\n\n```ts\ntrackMetric(metric: IMetricTelemetry)\n```\n\nLog a positive numeric value that is not associated with a specific event. Typically used to send regular reports of performance indicators.\n\nTo send a single measurement, use just the first two parameters. If you take measurements very frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements and sending the resulting `average` and `sampleCount` at intervals.\n\n[`IMetricTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html) is described below\n\nParameter | Type | Description\n---|---|---\n[`name`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#name) | string | **Required**<br>A string that identifies the metric. In the portal, you can select metrics for display by name.\n[`average`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#average) | number | **Required**<br>Either a single measurement, or the average of several measurements. Should be >=0 to be correctly displayed.\n[`sampleCount?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#sampleCount) | number | **Optional**<br>Count of measurements represented by the average. Defaults to 1. Should be >=1.\n[`min?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#min) | number | **Optional**<br>The smallest measurement in the sample. Defaults to the average. Should be >= 0.\n[`max?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#max) | number | **Optional**<br>The largest measurement in the sample. Defaults to the average. Should be >= 0.\n[`properties?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IMetricTelemetry.html#properties) | dictionary | **Optional**<br>Map of string to any: Additional data used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n\n### trackException\n\n```ts\ntrackException(exception: IExceptionTelemetry)\n```\n\nLog an exception you have caught. Exceptions caught by the browser are also automatically logged.\n\n[`IExceptionTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IExceptionTelemetry.html) is described below\n\nParameter | Type | Description\n---|---|---\n[`exception`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IExceptionTelemetry.html#exception) | [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) | **Required**<br>Error object\n[`severityLevel?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IExceptionTelemetry.html#severityLevel) | [SeverityLevel (number)](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-common/enums/eSeverityLevel.html) | **Optional**<br>Severity of the message, ranging from verbose to critical\n[`properties?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IExceptionTelemetry.html#properties) | dictionary | **Optional**<br>Map of string to any: Additional data used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n\nBy default, uncaught browser exceptions are caught by the SDK and reported to the portal. To disable this behavior, insert the following line in the config section below your connection string:\n\n```ts\n{\n  connectionString: \"your connection string\",\n  disableExceptionTracking: true\n}\n```\n\n### trackTrace\n\n```ts\ntrackTrace(trace: ITraceTelemetry)\n```\n\nLog a diagnostic event such as entering or leaving a method.\n\n\nThe [`ITraceTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ITraceTelemetry.html) interface is described below\n\nParameter | Type | Description\n---|---|---\n[`message`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ITraceTelemetry.html#message) | string | **Required**<br>Diagnostic data. Can be much longer than an event's name.\n[`severityLevel?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ITraceTelemetry.html#severityLevel) | [SeverityLevel (number)](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-common/enums/eSeverityLevel.html) | **Optional**<br>Severity of the message, ranging from verbose to critical\n[`properties?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/ITraceTelemetry.html#properties) | dictionary | **Optional**<br>Map of string to any: Additional data used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n\nIn the portal, you can search on message content and [display individual trackTrace events](https://azure.microsoft.com/documentation/articles/app-insights-diagnostic-search/).\n(Unlike `trackEvent`, you can't filter on the message content in the portal.)\n\n\n### trackDependencyData\n\n```ts\ntrackDependencyData(dependency: IDependencyTelemetry)\n```\n\nLog a dependency call (for instance: ajax)\n\nThe [`IDependencyTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html) interface is described below\n\nParameter | Type | Description\n---|---|---\n[`id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#id) | string | **Required**<br>Unique id, this is used by the backend to correlate server requests.\n[`responseCode`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#responseCode) | number | **Required**<br>Response code returned by the dependency request (e.g., `200` for a success).\n[`name?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#name) | string | **Optional**<br>Name of the command initiated with this dependency call.\n[`duration?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#duration) | number | **Optional**<br>Elapsed time of request & reply\n[`success?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#success) | boolean | **Optional**<br>Whether or not the request was successful or not (e.g., `responseCode` in the range 200-299)\n[`startTime?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#startTime) | Date | **Optional**<br>Dependency start timestamp.\n[`correlationContext?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#correlationContext) | string | **Optional**<br>correlation context from the server.\n[`type?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#type) | string | **Optional**<br>Dependency type name.\n[`data?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#data) | string | **Internal**<br>Command initiated by this dependency call. This is not a user settable field. `data` is automatically set based on the dependency name (if available). Please include additional custom properties as part of the `properties` value below.\n[`target?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#target) | string | **Optional**<br>Target site of a dependency call.\n[`properties?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IDependencyTelemetry.html#properties) | dictionary | **Optional**<br>Map of string to any: Additional data used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n\n### trackEvent\n\n```ts\napplicationInsights.trackEvent(event: IEventTelemetry)\n```\n\nThe [`IEventTelemetry`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IEventTelemetry.html) interface is below:\n\nParameter | Type | Description\n---|---|---\n[`name`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IEventTelemetry.html#name) | string | **Required**<br>An event name string.\n[`properties?`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IEventTelemetry.html#properties) | dictionary | **Optional**<br>Map of string to any: Additional data used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n~~`measurements?`~~ | dictionary | **Optional**<br>Map of string to any: Additional data (metrics) used to [filter pages](https://azure.microsoft.com/documentation/articles/app-insights-api-custom-events-metrics/#properties) in the portal. Defaults to empty.\n\n### flush\n\n```ts\nflush(isAsync?: boolean, callBack?: () => void): void | IPromise<void>\n```\n\nImmediately send all queued telemetry. By default, it is sent asynchronously.\n\n- `isAsync` - Whether to send asynchronously. Defaults to `true`.\n- `callBack` - Optional callback invoked when the flush completes. If provided, the method returns `void`.\n- If `isAsync` is `true` and no `callBack` is provided, returns an `IPromise<void>` that resolves when the flush completes.\n\n> *Note:* You don't have to use flush, as it is automatically called at an interval and when the user closes the window.\n\n<a name=\"setAuthenticatedUserContext\"></a>\n### setAuthenticatedUserContext\n\n```ts\nsetAuthenticatedUserContext(authenticatedUserId: string, accountId?: string, storeInCookie = false)\n```\n\nSet the authenticated user id and the account id. Use this when you have identified a specific signed-in user. Parameters must not contain spaces or ,;=|\n\nThe method will only set the `authenticatedUserId` and `accountId` for all events in the current page view. To set them for all events within the whole session, you should either call this method on every page view or set `storeInCookie = true`.\n\n Parameter | Type |Description\n---|---|--\n`authenticatedUserId` | string | **Required**<br>An id that uniquely identifies a user of your app. No spaces, comma, semicolon, equals or vertical bar.\n`accountId?` | string | **Optional**<br>An optional account id, if your app groups users into accounts. No spaces, comma, semicolon, equals or vertical bar.\n\nIn the portal, this will add to the count of authenticated users. Authenticated users provide a more reliable count of the number of real users than the count of anonymous users.\n\nThe authenticated user id will be available as part of the context of the telemetry sent to the portal, so that you can filter and search on it. It will also be saved as a cookie and sent to the server, where the server SDK (if installed) will attach it to server telemetry.\n\n### clearAuthenticatedUserContext\n\n```ts\nclearAuthenticatedUserContext ()\n```\n\nClears the authenticated user id and the account id from the user context, and clears the associated cookie.\n\n\n### addTelemetryInitializer\n\n```ts\npublic addTelemetryInitializer(telemetryInitializer: (item: ITelemetryItem) => boolean | void)\n```\n\nAdds a telemetry initializer to the collection. Telemetry initializers will be called one by one with the telemetryItem of type [`ITelemetryItem`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryItem.html), in the order they were added,\nbefore the telemetry item is pushed for sending.\nIf one of the telemetry initializers returns false or throws an error, then the telemetry item will not be sent.\n\n### addDependencyListener\n\n```ts\npublic addDependencyListener(dependencyListener: (dependencyDetails: IDependencyListenerDetails) => void): IDependencyListenerHandler;\n\n// Example Usage\nlet handler = appInsights.addDependencyListener((details) => {\n    // You have complete access to the xhr instance\n    // details.xhr: XMLHttpRequest;\n\n    // Or if a fetch request you have complete access to the input and init objects\n    // details.input: Request | string;\n    // details.init: RequestInit;\n\n    // Access or change the W3C traceId that will be added to the outbound request\n    details.traceId = \"\";\n\n    // Access or change the W3C spanId that will be added to the outbound request\n    details.spanId = \"\";\n\n    // Access or change the W3C traceflags that will be added to the outbound request\n    details.traceFlags = 1;\n\n    // Add additional context values (any) that can be used by other listeners and is\n    // also passed to any dependency initializers\n    details.context.someValue = 1234;\n});\n\n// [Optional] Remove the dependency initializer\nhandler.remove();\n```\n\nA dependency listener is a callback function that allows you to perform additional manipulation of the request details before the request is performed.\n\nThis includes :-\n\n- Complete access to either the XMLHttpRequest instance or the fetch API `input` and `init` arguments.\n- Ability to get/set the properties used to generate the W3C `traceparent` header (`traceId`, `spanId, `traceFlags)\n- Set values in the object context container for other listeners called after the current one, as well as this context object is also made available to all dependency initializers.\n\n### addDependencyInitializer\n\n```ts\npublic addDependencyInitializer(dependencyInitializer: (item: IDependencyInitializerDetails) => boolean | void): IDependencyInitializerHandler\n\n// Example Usage\nlet handler = appInsights.addDependencyInitializer((details) => {\n    details.item.xxxx = \"\";   // item is the telemetry event \"before\" it's been processed\n\n    // [Optional] To stop any event from being reported you can\n    // return false;\n});\n\n\n// [Optional] Remove the dependency initializer\nhandler.remove();\n```\n\nA Dependency Initializer is very similar to a [Telemetry Initializer](https://github.com/Microsoft/ApplicationInsights-JS#telemetry-initializers) in that it allows you modify the contents of collected telemetry before being sent from the user's browser. And you can also returning `false` to cause the event to not be emitted.\n\nThe differences between a telemetry initializer and a dependency initializer are :-\n- A Dependency Initializer is called \"before\" the event is processed by the pipeline, as such it will NOT (yet) contain the automatically populated properties that are applied later;\n- When a dependency initializer returns `false` to drop the event the event does NOT count against the `maxAjaxCallsPerView` as this blocks the event call from being tracked, and while returning `false` from a [Telemetry Initializer](https://github.com/Microsoft/ApplicationInsights-JS#telemetry-initializers) will also stop the event from being reported because this is further down the processing pipeline the dependency event IS counted against the `maxAjaxCallsPerView` limit.\n- It has access to an optional \"context\" `{ [key: string]: any }` object that is also available to the Dependency Listeners. This allows a listener to add additional details to the context (before the XHR/fetch request is sent), and the initializer will be called after the request has completed.\n\nThe input argument to `addDependencyInitializer` is a callback that takes a [`IDependencyInitializerDetails`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-dependencies-js/interfaces/IDependencyInitializerDetails.html) as an argument and returns a `boolean` or `void`. If returning `false`, the dependency event is not sent, else it proceeds to the next dependency initializer, if any, or is sent to processing pipeline to be sent to the telemetry collection endpoint.\n\n### getSender\n\n```ts\napplicationInsights.getSender() => Sender\n```\n\nGet the sender to configure and set the custom headers when using a custom endpoint.\n\n### addHeader\n\n```ts\npublic addHeader(name: string, value: string)\n```\n\nAdd header to request.\n\n### Custom extension\n\nA custom plugin can be loaded by the SDK through config.extensions. All plugins must implement [`ITelemetryPlugin`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryPlugin.html) interface. These provide the capability of inspecting and updating data as it leaves the system, but also provides additional functionality to for one time initialization of extension state and pass in custom configuration through SKU configuration etc.\n\n## [`ITelemetryContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryContext.html)\n\n### context.application\n\n```ts\napplication: IApplication\n```\n\nDetails of the app you're monitoring. See [`IApplication`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IApplication.html).\n\nProperty | Type | Description\n---|---|---\n[`application.ver`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IApplication.html#ver) | string | Application version\n[`application.build`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IApplication.html#build) | string | Application build\n\n### context.device\n\n```ts\ndevice: IDevice\n```\n\nThe device the app is running on. See [`IDevice`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html).\n\nProperty | Type | Description\n---|---|---\n[`device.id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#id) | string | Unique ID\n[`device.deviceClass`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#deviceClass) | string | Device class\n[`device.model`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#model) | string | Device model\n[`device.resolution`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#resolution) | string | Screen resolution\n[`device.ip`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDevice.html#ip) | string | IP address\n\n### context.user\n\n```ts\nuser: IUserContext\n```\n\nData about the current user. Users are identified by cookie, so one person can look like\nmore than one user if they use different machines or browsers, or delete cookies. See [`IUserContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html).\n\nProperty | Type | Description\n---|---|---\n[`user.id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#id) | string | Unique, cookie-based user id, automatically assigned.\n[`user.authenticatedId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#authenticatedId) | string | Id set by your app using [`setAuthenticatedUserContext`](#setAuthenticatedUserContext) when the user signs in.\n[`user.accountId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#accountId) | string | Set by your app when the user signs in, if your app groups users into accounts.\n[`user.accountAcquisitionDate`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IUserContext.html#accountAcquisitionDate) | string | Account acquisition date\n\n\n### context.session\n\n```ts\nsession: ISession\n```\n\nThe user session. A session represents a series of user actions. A session starts with a user action.\nIt ends at the last user activity when there is no more activity for sessionRenewalMs, or if it lasts longer than sessionExpirationMs. See [`ISession`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html).\n\nProperty | Type | Description\n---|---|---\n[`session.id`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html#id) | string | Automatically assigned id\n[`session.acquisitionDate`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html#acquisitionDate) | number | The dateTime when this session was created.\n[`session.renewalDate`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISession.html#renewalDate) | number | DateTime when telemetry was last sent with this session.\n\n\n### context.location\n\n```ts\nlocation: ILocation\n```\n\nData from which the geographical location of the user's device can be guessed. See [`ILocation`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ILocation.html).\n\nProperty | Type | Description\n---|---|---\n[`location.ip`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ILocation.html#ip) | string | IP address\n\n### context.telemetryTrace\n\n> **Deprecated:** Use [`appInsights.getTraceCtx()`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html#getTraceCtx) instead to get/set the current trace context. This returns an [`IDistributedTraceContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html) which supports distributed tracing and allows the core to manage the trace context.\n\n```ts\ntelemetryTrace: ITelemetryTrace\n```\n\nRepresents the distributed trace context. See [`ITelemetryTrace`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html).\n\nProperty | Type | Description\n---|---|---\n[`telemetryTrace.traceID`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#traceID) | string | Trace ID\n[`telemetryTrace.parentID`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#parentID) | string | Parent ID\n[`telemetryTrace.traceFlags`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#traceFlags) | number | W3C trace flags\n[`telemetryTrace.name`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITelemetryTrace.html#name) | string | Operation name\n\n### Distributed Trace Context (Recommended)\n\nUse [`getTraceCtx()`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html#getTraceCtx) to access the current [`IDistributedTraceContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html). This is the recommended replacement for the deprecated `telemetryTrace`.\n\n```ts\n// Get the current trace context - using the standard SKU (AISKU)\nlet traceCtx = appInsights.getTraceCtx();\n\n// Or when using the core directly\n// let traceCtx = appInsights.core.getTraceCtx();\n\n// Read trace values\nlet traceId = traceCtx.traceId;\nlet spanId = traceCtx.spanId;\nlet traceFlags = traceCtx.traceFlags;\nlet pageName = traceCtx.pageName;\n\n// Update trace values (updates current context only)\ntraceCtx.traceId = \"new-trace-id\";\ntraceCtx.spanId = \"new-span-id\";\ntraceCtx.traceFlags = 1;\ntraceCtx.pageName = \"my-page\";\n\n// Replace the entire trace context\nappInsights.core.setTraceCtx(newTraceCtx);\n```\n\nProperty | Type | Description\n---|---|---\n[`traceId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#traceId) | string | 32 lowercase hex character trace ID, shared across all spans in a trace\n[`spanId`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#spanId) | string | 16 lowercase hex character span ID, unique identifier for this span\n[`traceFlags`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#traceFlags) | number | W3C trace flags (8-bit bitmap), bit 0x01 indicates sampling\n[`pageName`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#pageName) | string | Current page name\n[`traceState`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#traceState) | IW3cTraceState | Vendor-specific trace state for cross-system correlation\n[`parentCtx`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#parentCtx) | IDistributedTraceContext | Parent context (read-only)\n[`isRemote`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html#isRemote) | boolean | Whether context was propagated from a remote parent\n"
  },
  {
    "path": "docs/Dependency.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Dependencies Plugin\n\nDependencies Plugin for the Application Insights Javascript SDK\n\n## Configuration\n\n[`ICorrelationConfig`](https://github.com/Microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCommon/src/Interfaces/ICorrelationConfig.ts)\n\n## Functions\n\n### Dependency Listeners\n\n`addDependencyListener(dependencyListener: DependencyListenerFunction): IDependencyListenerHandler`\n\nA [dependency listener](https://microsoft.github.io/ApplicationInsights-JS/API-reference#adddependencylistener) is a callback function that **allows you to perform additional manipulation of the request details before the request is performed**.\n\nThis includes :-\n\n- Complete access to either the XMLHttpRequest instance or the fetch API `input` and `init` arguments.\n- Ability to get/set the properties used to generate the W3C `traceparent` header (`traceId`, `spanId,`traceFlags)\n- Set values in the object context container for other listeners called after the current one, as well as this context object is also made available to all dependency initializers.\n\n```javascript\npublic addDependencyListener(dependencyListener: (dependencyDetails: IDependencyListenerDetails) => void): IDependencyListenerHandler;\n\n// Example Usage\nlet handler = appInsights.addDependencyListener((details) => {\n    // You have complete access to the xhr instance\n    // details.xhr: XMLHttpRequest;\n\n    // Or if a fetch request you have complete access to the input and init objects\n    // details.input: Request | string;\n    // details.init: RequestInit;\n\n    // Access or change the W3C traceId that will be added to the outbound request\n    details.traceId = \"\";\n\n    // Access or change the W3C spanId that will be added to the outbound request\n    details.spanId = \"\";\n\n    // Access or change the W3C traceflags that will be added to the outbound request\n    details.traceFlags = 1;\n\n    // Add additional context values (any) that can be used by other listeners and is\n    // also passed to any dependency initializers\n    details.context.someValue = 1234;\n});\n\n// [Optional] Remove the dependency initializer\nhandler.remove();\n```\n\n### Dependency Initializers\n\n`addDependencyInitializer(dependencyInitializer: DependencyInitializerFunction): IDependencyInitializerHandler`\n\nA [Dependency Initializer](https://microsoft.github.io/ApplicationInsights-JS/API-reference#adddependencyinitializer)  is very similar to a [Telemetry Initializer](https://github.com/Microsoft/ApplicationInsights-JS#telemetry-initializers) in that it **allows you modify the contents of collected telemetry before being sent from the user's browser**. And you can also returning `false` to cause the event to not be emitted.\n\nThe differences between a telemetry initializer and a dependency initializer are :-\n\n- A Dependency Initializer is called \"before\" the event is processed by the pipeline, as such it will NOT (yet) contain the automatically populated properties that are applied later;\n- When a dependency initializer returns `false` to drop the event the event does NOT count against the `maxAjaxCallsPerView` as this blocks the event call from being tracked, and while returning `false` from a [Telemetry Initializer](https://github.com/Microsoft/ApplicationInsights-JS#telemetry-initializers) will also stop the event from being reported because this is further down the processing pipeline the dependency event IS counted against the `maxAjaxCallsPerView` limit.\n- It has access to an optional \"context\" `{ [key: string]: any }` object that is also available to the Dependency Listeners. This allows a listener to add additional details to the context (before the XHR/fetch request is sent), and the initializer will be called after the request has completed.\n\n```javascript\npublic addDependencyInitializer(dependencyInitializer: (item: IDependencyInitializerDetails) => boolean | void): IDependencyInitializerHandler\n\n// Example Usage\nlet handler = appInsights.addDependencyInitializer((details) => {\n    details.item.xxxx = \"\";   // item is the telemetry event \"before\" it's been processed\n\n    // [Optional] To stop any event from being reported you can\n    // return false;\n});\n\n\n// [Optional] Remove the dependency initializer\nhandler.remove();\n```\n\n### Track Dependency\n\n`trackDependencyData(dependency:` `IDependencyTelemetry``, properties?: { [key: string]: any }): void`\n\n[TrackDependencyData](https://microsoft.github.io/ApplicationInsights-JS/API-reference#trackdependencydata) function allows you to manually log a dependency call.\n\n```javascript\nappInsights.trackDependencyData({absoluteUrl: 'some url', responseCode: 200, method: 'GET', id: 'some id'});\n```\n\n## Sample\n\nA [sample](https://github.com/Microsoft/ApplicationInsights-JS/blob/main/examples/dependency/README.md) is provided to show how to filter, modify, block and disable dependency data.\n"
  },
  {
    "path": "docs/ExtensionErrorSteps.md",
    "content": "# Investigating and Solving Plugin-Type Errors in Extensions\n\nThis guide addresses plugin-type errors encountered when using the `applicationinsights-web` package alongside other extensions, such as `@microsoft/applicationinsights-react-js`, `@microsoft/applicationinsights-react-native`, and `@microsoft/applicationinsights-angularplugin-js`.\n\n## Overview\n\nA common error message associated with these issues might look like this:\n\n```plaintext\nType 'ReactPlugin' is not assignable to type 'ITelemetryPlugin'.\n```\n\nPlugin-type errors often arise due to version mismatches between applicationinsights-web and its extensions.\n\n## Reason \n\nWhen a new version of applicationinsights-web (which includes applicationinsights-core as a dependency) is released, package management tools may automatically update applicationinsights-core to the new version. However, if the extensions (e.g., React, Angular) have not been updated, their dependencies on applicationinsights-core may not match, leading to type errors.\n\n## Steps to Investigate and Solve Plugin-Type Errors\n\n### 1. Verify Package Versions\n\n- **Check Dependencies**: Ensure that you have compatible versions of applicationinsights-common, applicationinsights-core, and any other related libraries. Look for discrepancies in your yarn.lock or package-lock.json or node_modules folder. \n![alt text](./media/pluginType.png)\n\n### 2. Perform a Complete Update\nThe easiest way to ensure all dependencies are updated is to delete the node_modules folder and reinstall the packages:\n```\nrm -rf node_modules\nnpm install\n```\n### 3. Examples to follow\nHere is a discussion that provide deeper insights into resolving these issues:\nhttps://github.com/microsoft/applicationinsights-react-js/issues/95\n\n\n  \n\n"
  },
  {
    "path": "docs/OTel/README.md",
    "content": "# OpenTelemetry Tracing API in Application Insights JavaScript SDK\n\n## Overview\n\nThe Application Insights JavaScript SDK provides an OpenTelemetry (OTel) compatible tracing API, allowing you to instrument your applications using familiar OpenTelemetry-like APIs for distributed tracing while automatically sending telemetry to Azure Application Insights. This implementation focuses on **tracing support only** (not metrics or logs) and bridges the gap between OpenTelemetry's vendor-neutral instrumentation patterns and Application Insights' powerful monitoring capabilities.\n\n**Note:** This is an OpenTelemetry-compatible tracing API implementation, not a full OpenTelemetry SDK. It provides a Tracing API interface following OpenTelemetry conventions but does not include all span operations, metrics or logging APIs.\n\n## What is OpenTelemetry?\n\nOpenTelemetry is an open-source observability framework for cloud-native software. It provides a single set of APIs, libraries, and conventions for capturing distributed traces, metrics, and logs from your applications.\n\n**Application Insights Implementation:** The Application Insights JavaScript SDK implements an OpenTelemetry like compatible tracing API. This means you can use familiar OpenTelemetry tracing patterns for distributed trace instrumentation. However, this is not a full OpenTelemetry SDK implementation - only the tracing API is supported (metrics and logs APIs are not included).\n\n## Why Use the OpenTelemetry-compatible Tracing API?\n\n- **Familiar API**: Use OpenTelemetry-like tracing APIs following industry-standard patterns\n- **Tracing Standards**: Implement distributed tracing using OpenTelemetry conventions\n- **Automatic Telemetry**: Spans automatically create Application Insights trace telemetry\n- **Rich Context**: Full distributed tracing with parent-child span relationships\n- **Service Identification**: Organize traces by service name and version\n- **Type Safety**: Full TypeScript support with proper interfaces\n- **Backward Compatibility**: Works alongside existing Application Insights code\n- **Single SDK**: No need for separate OpenTelemetry packages for tracing\n\n## Core Concepts\n\n### 1. **OTel API** ([`IOTelApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelApi.html))\n\nThe main entry point for OpenTelemetry functionality. Provides access to tracers and the trace API.\n\n### 2. **Trace API** ([`ITraceApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceApi.html))\n\nManages tracer instances and provides utilities for span context management.\n\n### 3. **Tracer** ([`IOTelTracer`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracer.html))\n\nCreates and manages spans. Each tracer typically represents a specific component or service.\n\n### 4. **Span** ([`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html))\n\nRepresents a unit of work in a distributed trace. Contains timing, attributes, and context information.\n\n### 5. **Tracer Methods**\n\n- **`startActiveSpan`**: Creates a span, sets it as active, executes a callback, and automatically ends the span (recommended)\n- **`startSpan`**: Creates a new span without setting it as active (manual lifecycle management)\n  - **Note:** Does NOT change the active span or modify the current traceId/spanId on IDistributedTraceContext\n  - You must manually call `setActiveSpan()` if you want to change the active context\n\n### 6. **Standalone Helper Functions**\n\n- **`startActiveSpan`**: Creates a span, sets it as active, executes a callback, and automatically ends the span (recommended)\n- **`withSpan`**: Executes code with a span as the active context\n- **`useSpan`**: Similar to `withSpan` but provides the span scope as a parameter\n- **`wrapSpanContext`**: Creates a non-recording span from a span context\n- **`isSpanContextValid`**: Validates span context information\n\n### 7. **Application Insights Functions** ([`ITraceHost`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html))\n\nDirect access to OpenTelemetry trace operations available on `appInsights` or `core` instances:\n- **`startActiveSpan(name, options?, fn)`**: Create a span with automatic lifecycle management (recommended)\n- **`startSpan(name, options?, parent?)`**: Create a new span with explicit parent control\n  - **Note:** Does NOT change the active span or modify the current traceId/spanId on IDistributedTraceContext\n- **`getActiveSpan(createNew?)`**: Get the currently active span\n- **`setActiveSpan(span)`**: Set a span as the active span and manage context\n\nThese methods provide direct control over span lifecycle and context management as the main appInsights manages an\ninternal **Tracer** ([`IOTelTracer`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracer.html)).\n\n## Quick Start\n\n### Installation\n\nThe OpenTelemetry-compatible tracing APIs are built into the Application Insights packages:\n\n```bash\nnpm install @microsoft/applicationinsights-web\n# or for core only (by default does not initialize any trace provider\n# which means core.startSpan() will return null)\nnpm install @microsoft/applicationinsights-core-js\n```\n\n**No additional OpenTelemetry packages are required** for tracing. The tracing API is included in the core SDK.\n\n### Basic Usage\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\n// Initialize Application Insights\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING'\n    }\n});\nappInsights.loadAppInsights();\n\n// Get the OpenTelemetry API\nconst otelApi = appInsights.otelApi;\n\n// Get a tracer for your service\nconst tracer = otelApi.trace.getTracer('my-service');\n\n// Create a span\nconst span = tracer.startSpan('user-operation');\nspan.setAttribute('user.id', '12345');\nspan.setAttribute('operation.type', 'checkout');\n\ntry {\n    // Perform your operation\n    await processCheckout();\n    span.setStatus({ code: SpanStatusCode.OK });\n} catch (error) {\n    span.setStatus({ \n        code: SpanStatusCode.ERROR,\n        message: error.message \n    });\n} finally {\n    span.end(); // Always end the span\n}\n```\n\n### Using `startActiveSpan` Helper (Recommended)\n\nThe `startActiveSpan` standalone helper function provides automatic context management:\n\n```typescript\nimport { startActiveSpan } from '@microsoft/applicationinsights-core-js';\n\nconst result = await startActiveSpan(appInsights, 'process-payment', async (scope) => {\n    scope.span.setAttribute('payment.method', 'credit_card');\n    \n    try {\n        const response = await processPayment();\n        scope.span.setAttribute('payment.status', 'success');\n        return response;\n    } catch (error) {\n        scope.span.setStatus({ \n            code: SpanStatusCode.ERROR,\n            message: error.message \n        });\n        throw error;\n    }\n    // Span is automatically ended when function completes\n});\n```\n\n### Using startSpan Directly on the SKU\n\nThe Application Insights SKU instance (`appInsights`) is itself a tracer, so you can call `startSpan` directly without obtaining a tracer first.\n\n**Important:** `startSpan()` creates a span but does NOT set it as the active span. This means:\n- The span will not automatically become the parent of subsequently created spans\n- The current traceId/spanId on `IDistributedTraceContext` is NOT modified\n- If you need the span to be active, use `startActiveSpan()` helper or manually call `setActiveSpan(span)`\n\n```typescript\n// Direct usage - creates span but does NOT set it as active\nconst span = appInsights.startSpan('quick-operation', {\n    kind: OTelSpanKind.INTERNAL,\n    attributes: {\n        'user.id': '12345',\n        'operation.type': 'data-fetch'\n    }\n});\n\nif (span) {\n    try {\n        // Perform operation\n        const data = await fetchData();\n        span.setAttribute('items.count', data.length);\n        span.setStatus({ code: SpanStatusCode.OK });\n    } catch (error) {\n        span.setStatus({ \n            code: SpanStatusCode.ERROR,\n            message: error.message \n        });\n    } finally {\n        span.end();\n    }\n}\n```\n\n**When to use direct `startSpan` vs obtaining a tracer:**\n- **Use `appInsights.startSpan()` directly** (Recommended) - For most scenarios, provides simple and direct span creation\n- **Use `appInsights.trace.getTracer('service-name')`** - Only when you need to organize spans by different services or components with specific names for better categorization\n\nBoth approaches create identical telemetry, but using the direct `startSpan` method is simpler and recommended for most applications.\n\n## Documentation Structure\n\nThis folder contains comprehensive documentation on all OpenTelemetry features:\n\n### Core API Documentation\n- **[OTel API](./otelApi.md)** - Main OpenTelemetry API interface and creation\n- **[Trace API](./traceApi.md)** - Tracer management and span utilities\n\n### Helper Functions\n- **[startActiveSpan](./startActiveSpan.md)** - Create spans with automatic lifecycle management (recommended)\n- **[withSpan](./withSpan.md)** - Execute code with active span context\n- **[useSpan](./useSpan.md)** - Execute code with span scope parameter\n\n### Guides and Examples\n- **[Examples](./examples.md)** - Comprehensive usage examples and patterns\n\n## Key Features\n\n### Automatic Telemetry Creation\n\nWhen you end a span, Application Insights automatically:\n- Creates trace telemetry with full context\n- Includes all span attributes as custom properties\n- Preserves parent-child relationships via trace/span IDs\n- Calculates accurate timing and duration\n- Recognizes Azure SDK attributes (including both legacy and current OpenTelemetry semantic conventions)\n\n### Nested Spans\n\nCreate hierarchical traces with parent-child relationships:\n\n```typescript\ntracer.startActiveSpan('parent-operation', (parentSpan) => {\n    parentSpan.setAttribute('step', 'starting');\n    \n    // Child spans automatically inherit parent context\n    tracer.startActiveSpan('child-operation', (childSpan) => {\n        childSpan.setAttribute('detail', 'processing');\n        // Work here\n    });\n    \n    parentSpan.setAttribute('step', 'completed');\n});\n```\n\n### Distributed Tracing\n\nPropagate trace context across service boundaries:\n\n```typescript\n// Service A: Create a span and extract context\nconst span = tracer.startSpan('api-call');\nconst traceContext = span.spanContext();\n\n// Pass traceContext to Service B (e.g., via HTTP headers)\nconst headers = {\n    'traceparent': `00-${traceContext.traceId}-${traceContext.spanId}-01`\n};\n\n// Service B: Create child span from propagated context\nconst childSpan = tracer.startSpan('process-request', {\n    parent: traceContext\n});\n```\n\n### Multiple Services/Components\n\nUse different tracers for different parts of your application:\n\n```typescript\nconst userServiceTracer = otelApi.trace.getTracer('user-service');\nconst paymentTracer = otelApi.trace.getTracer('payment-service');\n\n// Each tracer can be used independently\nconst userSpan = userServiceTracer.startSpan('authenticate');\nconst paymentSpan = paymentTracer.startSpan('process-payment');\n```\n\n## Browser Compatibility\n\nThe OpenTelemetry implementation in Application Insights JavaScript SDK supports:\n\n- Modern browsers (Chrome, Firefox, Safari, Edge) - ES5 target\n- Internet Explorer 8+ (with ES5 polyfills)\n- Mobile browsers (iOS Safari, Android Chrome)\n- Non-browser runtimes (Node.js, Web Workers)\n\n## Performance Considerations\n\nThe OpenTelemetry implementation is designed for minimal performance impact:\n\n- **Lazy Initialization**: APIs are created only when accessed\n- **Efficient Caching**: Tracers are cached and reused\n- **Non-blocking**: Span operations don't block the browser UI\n- **Minimal Allocations**: Optimized to reduce memory pressure\n- **Tree-shakable**: Unused code can be eliminated by bundlers\n\n## Migration Guide\n\n### From OpenTelemetry SDK\n\nIf you're migrating from `@opentelemetry/api`:\n\n1. Replace `@opentelemetry/api` tracing imports with Application Insights imports\n2. Use `appInsights.otelApi` or `appInsights.trace` to access the tracing API\n3. Most tracing API signatures are compatible\n4. Telemetry automatically flows to Application Insights\n\n**Important Limitations:**\n- Only tracing APIs are supported (no metrics or logs APIs)\n- This is an OpenTelemetry-compatible implementation, not the official OpenTelemetry SDK\n- Some advanced OpenTelemetry features may not be available\n\n### Multiple Ways to Create Spans\n\nApplication Insights provides several methods to create spans:\n\n**Using Direct startSpan (Recommended):**\n```typescript\nconst span = appInsights.startSpan('operation', options);\n```\n\n**Using Tracer API (for organizing by service):**\n```typescript\nconst tracer = appInsights.trace.getTracer('my-service');\nconst span = tracer.startSpan('operation', options);\n```\n\n**Using startActiveSpan (for automatic context management):**\n```typescript\nappInsights.startActiveSpan('operation', (span) => {\n    // Work with automatic context and lifecycle management\n});\n```\n\nThe direct `startSpan` method is recommended for most scenarios. Use tracers when you need to organize spans by service name.\n\n## API Compatibility\n\nThis implementation provides an OpenTelemetry-compatible tracing API based on OpenTelemetry API v1.9.0 specifications:\n\n- **Trace API v1.x** - Core tracing functionality (tracers, spans, context)\n- **Context API v1.x** - Active span context management (via ITraceHost)\n- **Span interface specifications** - Compatible span attributes, events, and status\n\n**Scope:** Only tracing APIs are implemented. This is not a complete OpenTelemetry SDK - metrics and logs APIs are not included.\n\n## Best Practices\n\n1. **Use `startActiveSpan` for most scenarios** - Provides automatic lifecycle management\n2. **Always end spans** - Either manually or via `startActiveSpan`\n3. **Set span status** - Indicate success/failure explicitly with status codes\n4. **Use descriptive names** - Span names should clearly identify operations\n5. **Add relevant attributes** - Enrich spans with contextual information\n6. **Use service-specific tracers** - Organize telemetry by service/component\n\n## Common Patterns\n\n### Error Handling\n\n```typescript\nconst span = tracer.startSpan('risky-operation');\ntry {\n    await performOperation();\n    span.setStatus({ code: SpanStatusCode.OK });\n} catch (error) {\n    span.setStatus({ \n        code: SpanStatusCode.ERROR,\n        message: error.message \n    });\n    span.setAttribute('error', true);\n    span.setAttribute('error.message', error.message);\n    throw error;\n} finally {\n    span.end();\n}\n```\n\n### Async Operations\n\n```typescript\ntracer.startActiveSpan('async-work', async (span) => {\n    span.setAttribute('started', Date.now());\n    \n    const result = await doAsyncWork();\n    \n    span.setAttribute('completed', Date.now());\n    return result;\n});\n```\n\n### Background Tasks\n\n```typescript\nimport { withSpan } from '@microsoft/applicationinsights-core-js';\n\nconst span = tracer.startSpan('background-task');\nwithSpan(appInsights.core, span, async () => {\n    // All nested operations inherit this span context\n    await processBackgroundWork();\n});\nspan.end();\n```\n\n## Troubleshooting\n\n### Spans Not Creating Telemetry\n\n- Ensure spans are ended with `span.end()`\n- Check that Application Insights is initialized\n- Verify instrumentation key is correct\n\n### Missing Parent-Child Relationships\n\n- Use `startActiveSpan` or `withSpan`/`useSpan` helpers\n- Ensure parent span is active when creating child spans\n- Check that span contexts are properly propagated\n\n### Performance Issues\n\n- Don't create excessive spans in tight loops\n- Use sampling if generating high volume of traces\n- Consider span lifecycle and ensure spans are ended promptly\n\n## Additional Resources\n\n- [Application Insights Documentation](https://docs.microsoft.com/azure/azure-monitor/app/javascript)\n- [OpenTelemetry Specification](https://opentelemetry.io/docs/specs/otel/)\n- [Distributed Tracing Guide](../Dependency.md)\n- [Performance Monitoring](../PerformanceMonitoring.md)\n\n## Support and Feedback\n\nFor issues, questions, or feedback:\n- [GitHub Issues](https://github.com/microsoft/ApplicationInsights-JS/issues)\n- [Stack Overflow](https://stackoverflow.com/questions/tagged/azure-application-insights)\n\n---\nLearn about [startActiveSpan](./startActiveSpan.md) for the recommended way to create spans\n- \n**Next Steps:**\n- Read the [OTel API documentation](./otelApi.md) for detailed API reference\n- Explore [comprehensive examples](./examples.md) for common scenarios\n- Learn about [withSpan](./withSpan.md) and [useSpan](./useSpan.md) helpers\n"
  },
  {
    "path": "docs/OTel/examples.md",
    "content": "# OpenTelemetry Examples and Patterns\n\n## Overview\n\nThis guide provides examples and patterns for using the OpenTelemetry APIs in the Application Insights JavaScript SDK. These examples demonstrate real-world scenarios and best practices for instrumentation.\n\n## Table of Contents\n\n- [Getting Started](#getting-started)\n- [Basic Patterns](#basic-patterns)\n- [Advanced Patterns](#advanced-patterns)\n- [Real-World Scenarios](#real-world-scenarios)\n- [Integration Examples](#integration-examples)\n- [Performance Patterns](#performance-patterns)\n- [Testing and Debugging](#testing-and-debugging)\n\n## Getting Started\n\n### Setup\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { OTelSpanKind, SpanStatusCode } from '@microsoft/applicationinsights-core-js';\n\n// Initialize Application Insights\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING',\n        enableAutoRouteTracking: true\n    }\n});\n\nappInsights.loadAppInsights();\n\n// Get the OpenTelemetry API\nconst otelApi = appInsights.otelApi;\nconst trace = otelApi.trace;\n\n// Create a tracer for your application\nconst tracer = trace.getTracer('my-application');\n```\n\n## Basic Patterns\n\n### Pattern 1: Simple Span Creation\n\n```typescript\n// Create and end a simple span\nfunction trackOperation(operationName: string): void {\n    const span = tracer.startSpan(operationName);\n    \n    if (span) {\n        span.setAttribute('operation.type', 'manual');\n        span.setAttribute('timestamp', Date.now());\n        \n        try {\n            // Perform operation\n            performWork();\n            \n            span.setStatus({ code: SpanStatusCode.OK });\n        } catch (error) {\n            span.recordException(error);\n            span.setStatus({ \n                code: SpanStatusCode.ERROR,\n                message: error.message \n            });\n        } finally {\n            span.end();\n        }\n    }\n}\n\n// Usage\ntrackOperation('user-action');\n```\n\n### Pattern 2: Using startActiveSpan\n\n```typescript\n// Automatic span lifecycle management\nasync function fetchUserData(userId: string): Promise<any> {\n    return tracer.startActiveSpan('fetch-user-data', async (span) => {\n        span.setAttribute('user.id', userId);\n        span.setAttribute('operation', 'read');\n        \n        try {\n            const response = await fetch(`/api/users/${userId}`);\n            \n            span.setAttribute('http.status_code', response.status);\n            span.setAttribute('http.method', 'GET');\n            \n            if (!response.ok) {\n                throw new Error(`HTTP ${response.status}`);\n            }\n            \n            const data = await response.json();\n            span.setStatus({ code: SpanStatusCode.OK });\n            \n            return data;\n        } catch (error) {\n            span.recordException(error);\n            span.setStatus({ code: SpanStatusCode.ERROR });\n            throw error;\n        }\n        // Span automatically ended\n    });\n}\n\n// Usage\nconst userData = await fetchUserData('user123');\n```\n\n### Pattern 3: Parent-Child Spans\n\n```typescript\nasync function processOrder(orderId: string): Promise<any> {\n    return tracer.startActiveSpan('process-order', async (parentSpan) => {\n        parentSpan.setAttribute('order.id', orderId);\n        parentSpan.setAttributes({\n            'operation': 'checkout',\n            'service': 'order-processing'\n        });\n        \n        // Child span 1: Validate inventory\n        await tracer.startActiveSpan('validate-inventory', async (span) => {\n            span.setAttribute('check.type', 'inventory');\n            const available = await checkInventory(orderId);\n            span.setAttribute('inventory.available', available);\n        });\n        \n        // Child span 2: Process payment\n        const paymentResult = await tracer.startActiveSpan('process-payment', async (span) => {\n            span.setAttribute('payment.method', 'credit_card');\n            const result = await processPayment(orderId);\n            span.setAttribute('payment.success', result.success);\n            return result;\n        });\n        \n        // Child span 3: Send notification\n        await tracer.startActiveSpan('send-notification', async (span) => {\n            span.setAttribute('notification.type', 'email');\n            await sendOrderConfirmation(orderId);\n        });\n        \n        parentSpan.setAttribute('order.completed', true);\n        return { orderId, payment: paymentResult };\n    });\n}\n```\n\n### Pattern 4: Multiple Tracers\n\n```typescript\n// Create tracers for different services/components\nclass Application {\n    private userTracer = trace.getTracer('user-service');\n    private apiTracer = trace.getTracer('api-client');\n    private dbTracer = trace.getTracer('database-layer');\n    \n    async authenticateUser(username: string, password: string) {\n        return this.userTracer.startActiveSpan('authenticate', async (span) => {\n            span.setAttribute('auth.username', username);\n            span.setAttribute('auth.method', 'password');\n            \n            // Use database tracer for DB operations\n            const user = await this.dbTracer.startActiveSpan('query-user', async (dbSpan) => {\n                dbSpan.setAttribute('db.operation', 'SELECT');\n                dbSpan.setAttribute('db.table', 'users');\n                return await this.queryUser(username);\n            });\n            \n            // Use API tracer for external API calls\n            await this.apiTracer.startActiveSpan('verify-token', async (apiSpan) => {\n                apiSpan.setAttribute('api.endpoint', '/verify');\n                await this.verifyWithExternalService(user.token);\n            });\n            \n            return user;\n        });\n    }\n}\n```\n\n## Advanced Patterns\n\n### Pattern 5: Context Propagation Across Async Boundaries\n\n```typescript\nimport { withSpan } from '@microsoft/applicationinsights-core-js';\n\n// Preserve context across setTimeout/setInterval\nfunction scheduleWithContext(fn: () => void, delay: number): void {\n    const span = trace.getActiveSpan();\n    \n    setTimeout(() => {\n        if (span) {\n            withSpan(appInsights.core, span, fn);\n        } else {\n            fn();\n        }\n    }, delay);\n}\n\n// Usage\ntracer.startActiveSpan('parent-operation', (span) => {\n    span.setAttribute('scheduling', 'async-task');\n    \n    scheduleWithContext(() => {\n        // This executes with parent span context\n        console.log('Active span:', trace.getActiveSpan()?.name);\n    }, 1000);\n});\n```\n\n### Pattern 6: Distributed Tracing\n\n```typescript\n// Service A: Create span and propagate context\nclass ServiceA {\n    async callServiceB(data: any): Promise<any> {\n        return tracer.startActiveSpan('call-service-b', async (span) => {\n            span.setAttribute('service.target', 'service-b');\n            \n            // Get span context for propagation\n            const spanContext = span.spanContext();\n            \n            // Create W3C traceparent header\n            const traceparent = `00-${spanContext.traceId}-${spanContext.spanId}-01`;\n            \n            const response = await fetch('http://service-b/api/process', {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json',\n                    'traceparent': traceparent\n                },\n                body: JSON.stringify(data)\n            });\n            \n            span.setAttribute('http.status_code', response.status);\n            return response.json();\n        });\n    }\n}\n\n// Service B: Receive and continue trace\nclass ServiceB {\n    handleRequest(headers: Record<string, string>, data: any): any {\n        // Parse traceparent header\n        const traceparent = headers['traceparent'];\n        const [version, traceId, parentSpanId, flags] = traceparent.split('-');\n        \n        // Create context from propagated info\n        const parentContext = {\n            traceId: traceId,\n            spanId: parentSpanId,\n            traceFlags: parseInt(flags, 16)\n        };\n        \n        // Validate and wrap context\n        if (trace.isSpanContextValid(parentContext)) {\n            const wrappedSpan = trace.wrapSpanContext(parentContext);\n            const scope = trace.setActiveSpan(wrappedSpan);\n            \n            try {\n                // Create child span that continues the distributed trace\n                return tracer.startActiveSpan('process-request', (span) => {\n                    span.setAttribute('service', 'service-b');\n                    span.setAttribute('data.size', JSON.stringify(data).length);\n                    \n                    return this.processData(data);\n                });\n            } finally {\n                scope?.restore();\n            }\n        } else {\n            // Process without trace context\n            return this.processData(data);\n        }\n    }\n}\n```\n\n### Pattern 7: Conditional Tracing\n\n```typescript\nclass TracingConfig {\n    private enableTracing: boolean = true;\n    private sampleRate: number = 1.0; // 100%\n    \n    shouldTrace(): boolean {\n        return this.enableTracing && Math.random() < this.sampleRate;\n    }\n    \n    setSampleRate(rate: number): void {\n        this.sampleRate = Math.max(0, Math.min(1, rate));\n    }\n}\n\nconst config = new TracingConfig();\n\nfunction conditionalTrace<T>(\n    operationName: string,\n    fn: () => T\n): T {\n    if (!config.shouldTrace()) {\n        return fn();\n    }\n    \n    return tracer.startActiveSpan(operationName, (span) => {\n        span.setAttribute('sampled', true);\n        return fn();\n    });\n}\n\n// Usage\nconst result = conditionalTrace('expensive-operation', () => {\n    return performExpensiveOperation();\n});\n```\n\n### Pattern 8: Span Suppression\n\n```typescript\nimport { suppressTracing, unsuppressTracing, isTracingSuppressed } from '@microsoft/applicationinsights-core-js';\n\n// Suppress tracing for specific operations\nfunction performWithoutTracing<T>(fn: () => T): T {\n    const wasSupressed = isTracingSuppressed(appInsights.core);\n    \n    if (!wasSupressed) {\n        suppressTracing(appInsights.core);\n    }\n    \n    try {\n        return fn();\n    } finally {\n        if (!wasSupressed) {\n            unsuppressTracing(appInsights.core);\n        }\n    }\n}\n\n// Usage\ntracer.startActiveSpan('parent', (span) => {\n    span.setAttribute('traced', true);\n    \n    // This won't create spans\n    performWithoutTracing(() => {\n        const innerSpan = tracer.startSpan('should-not-trace');\n        console.log('Inner span:', innerSpan); // null\n    });\n    \n    // This will create spans again\n    const childSpan = tracer.startSpan('will-trace');\n    console.log('Child span:', childSpan); // span object\n});\n```\n\n## Real-World Scenarios\n\n### Scenario 1: E-Commerce Checkout Flow\n\n```typescript\nclass CheckoutService {\n    private tracer = trace.getTracer('checkout-service');\n    \n    async checkout(cartId: string, userId: string): Promise<any> {\n        return this.tracer.startActiveSpan('checkout', async (checkoutSpan) => {\n            checkoutSpan.setAttributes({\n                'cart.id': cartId,\n                'user.id': userId,\n                'checkout.started': new Date().toISOString()\n            });\n            \n            try {\n                // Step 1: Validate cart\n                const cart = await this.tracer.startActiveSpan('validate-cart', async (span) => {\n                    span.setAttribute('cart.id', cartId);\n                    const cart = await this.getCart(cartId);\n                    span.setAttribute('cart.items', cart.items.length);\n                    span.setAttribute('cart.total', cart.total);\n                    \n                    if (cart.items.length === 0) {\n                        throw new Error('Cart is empty');\n                    }\n                    \n                    return cart;\n                });\n                \n                // Step 2: Calculate totals\n                const totals = await this.tracer.startActiveSpan('calculate-totals', async (span) => {\n                    span.setAttribute('cart.subtotal', cart.subtotal);\n                    const totals = await this.calculateTotals(cart);\n                    span.setAttributes({\n                        'cart.tax': totals.tax,\n                        'cart.shipping': totals.shipping,\n                        'cart.total': totals.total\n                    });\n                    return totals;\n                });\n                \n                // Step 3: Process payment\n                const payment = await this.tracer.startActiveSpan('process-payment', async (span) => {\n                    span.setAttributes({\n                        'payment.amount': totals.total,\n                        'payment.currency': 'USD',\n                        'payment.method': 'credit_card'\n                    });\n                    \n                    const result = await this.processPayment(userId, totals.total);\n                    \n                    span.setAttributes({\n                        'payment.transaction_id': result.transactionId,\n                        'payment.status': result.status,\n                        'payment.success': result.success\n                    });\n                    \n                    if (!result.success) {\n                        throw new Error('Payment failed');\n                    }\n                    \n                    return result;\n                });\n                \n                // Step 4: Create order\n                const order = await this.tracer.startActiveSpan('create-order', async (span) => {\n                    span.setAttribute('order.user_id', userId);\n                    const order = await this.createOrder(userId, cart, payment);\n                    span.setAttributes({\n                        'order.id': order.id,\n                        'order.status': order.status,\n                        'order.created': order.createdAt\n                    });\n                    return order;\n                });\n                \n                // Step 5: Send confirmations\n                await this.tracer.startActiveSpan('send-confirmations', async (span) => {\n                    span.setAttribute('order.id', order.id);\n                    \n                    await Promise.all([\n                        this.sendEmailConfirmation(userId, order),\n                        this.sendSMSNotification(userId, order)\n                    ]);\n                    \n                    span.setAttribute('notifications.sent', 2);\n                });\n                \n                checkoutSpan.setAttributes({\n                    'checkout.completed': new Date().toISOString(),\n                    'checkout.success': true,\n                    'order.id': order.id\n                });\n                \n                checkoutSpan.setStatus({ code: SpanStatusCode.OK });\n                \n                return order;\n                \n            } catch (error) {\n                checkoutSpan.recordException(error);\n                checkoutSpan.setAttributes({\n                    'checkout.error': error.message,\n                    'checkout.success': false\n                });\n                checkoutSpan.setStatus({ \n                    code: SpanStatusCode.ERROR,\n                    message: error.message \n                });\n                throw error;\n            }\n        });\n    }\n}\n```\n\n### Scenario 2: API Client with Retry Logic\n\n```typescript\nclass RetryableAPIClient {\n    private tracer = trace.getTracer('api-client');\n    private maxRetries = 3;\n    private retryDelay = 1000;\n    \n    async fetchWithRetry<T>(\n        url: string,\n        options?: RequestInit\n    ): Promise<T> {\n        return this.tracer.startActiveSpan('fetch-with-retry', async (span) => {\n            span.setAttributes({\n                'http.url': url,\n                'http.method': options?.method || 'GET',\n                'retry.max_attempts': this.maxRetries\n            });\n            \n            let lastError: Error | null = null;\n            \n            for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n                const attemptSpan = this.tracer.startSpan(`attempt-${attempt}`);\n                \n                try {\n                    attemptSpan?.setAttributes({\n                        'retry.attempt': attempt,\n                        'retry.is_retry': attempt > 1\n                    });\n                    \n                    const response = await fetch(url, options);\n                    \n                    attemptSpan?.setAttributes({\n                        'http.status_code': response.status,\n                        'http.response_size': response.headers.get('content-length')\n                    });\n                    \n                    if (response.ok) {\n                        attemptSpan?.setStatus({ code: SpanStatusCode.OK });\n                        attemptSpan?.end();\n                        \n                        span.setAttributes({\n                            'retry.succeeded_on_attempt': attempt,\n                            'http.status_code': response.status\n                        });\n                        span.setStatus({ code: SpanStatusCode.OK });\n                        \n                        return response.json();\n                    }\n                    \n                    throw new Error(`HTTP ${response.status}`);\n                    \n                } catch (error) {\n                    lastError = error as Error;\n                    \n                    attemptSpan?.recordException(error);\n                    attemptSpan?.setAttributes({\n                        'retry.error': error.message,\n                        'retry.failed': true\n                    });\n                    attemptSpan?.setStatus({ code: SpanStatusCode.ERROR });\n                    attemptSpan?.end();\n                    \n                    if (attempt < this.maxRetries) {\n                        span.setAttribute(`retry.attempt_${attempt}_failed`, true);\n                        await this.delay(this.retryDelay * attempt);\n                    }\n                }\n            }\n            \n            // All retries failed\n            span.recordException(lastError!);\n            span.setAttributes({\n                'retry.exhausted': true,\n                'retry.final_error': lastError!.message\n            });\n            span.setStatus({ \n                code: SpanStatusCode.ERROR,\n                message: 'All retry attempts failed'\n            });\n            \n            throw lastError;\n        });\n    }\n    \n    private delay(ms: number): Promise<void> {\n        return new Promise(resolve => setTimeout(resolve, ms));\n    }\n}\n\n// Usage\nconst client = new RetryableAPIClient();\nconst data = await client.fetchWithRetry('/api/data');\n```\n\n### Scenario 3: Background Job Processing\n\n```typescript\nimport { withSpan } from '@microsoft/applicationinsights-core-js';\n\nclass JobProcessor {\n    private tracer = trace.getTracer('job-processor');\n    private processingJobs = new Map<string, IReadableSpan>();\n    \n    async processJob(job: Job): Promise<void> {\n        const jobSpan = this.tracer.startSpan('process-job', {\n            kind: OTelSpanKind.CONSUMER,\n            attributes: {\n                'job.id': job.id,\n                'job.type': job.type,\n                'job.priority': job.priority,\n                'job.queued_at': job.queuedAt\n            }\n        });\n        \n        if (!jobSpan) return;\n        \n        this.processingJobs.set(job.id, jobSpan);\n        \n        try {\n            await withSpan(appInsights.core, jobSpan, async () => {\n                jobSpan.setAttribute('job.started_at', new Date().toISOString());\n                \n                // Process job steps\n                await this.validateJob(job);\n                await this.executeJob(job);\n                await this.finalizeJob(job);\n                \n                jobSpan.setAttributes({\n                    'job.completed_at': new Date().toISOString(),\n                    'job.status': 'completed',\n                    'job.success': true\n                });\n                \n                jobSpan.setStatus({ code: SpanStatusCode.OK });\n            });\n            \n        } catch (error) {\n            jobSpan.recordException(error);\n            jobSpan.setAttributes({\n                'job.status': 'failed',\n                'job.error': error.message,\n                'job.success': false\n            });\n            jobSpan.setStatus({ code: SpanStatusCode.ERROR });\n            \n            await this.handleJobFailure(job, error);\n            \n        } finally {\n            this.processingJobs.delete(job.id);\n            jobSpan.end();\n        }\n    }\n    \n    private async validateJob(job: Job): Promise<void> {\n        return this.tracer.startActiveSpan('validate-job', async (span) => {\n            span.setAttribute('job.id', job.id);\n            \n            // Validation logic\n            const isValid = await this.runValidation(job);\n            \n            span.setAttribute('job.valid', isValid);\n            \n            if (!isValid) {\n                throw new Error('Job validation failed');\n            }\n        });\n    }\n    \n    private async executeJob(job: Job): Promise<void> {\n        return this.tracer.startActiveSpan('execute-job', async (span) => {\n            span.setAttribute('job.id', job.id);\n            \n            // Execute job-specific logic\n            const result = await this.runJobLogic(job);\n            \n            span.setAttributes({\n                'job.result.status': result.status,\n                'job.result.items_processed': result.itemsProcessed\n            });\n        });\n    }\n    \n    private async finalizeJob(job: Job): Promise<void> {\n        return this.tracer.startActiveSpan('finalize-job', async (span) => {\n            span.setAttribute('job.id', job.id);\n            \n            // Cleanup, notifications, etc.\n            await this.sendCompletionNotification(job);\n            await this.updateJobStatus(job, 'completed');\n            \n            span.setAttribute('job.finalized', true);\n        });\n    }\n}\n```\n\n## Integration Examples\n\n### Integration 1: React Component Instrumentation\n\n```typescript\nimport React, { useEffect } from 'react';\nimport { OTelSpanKind } from '@microsoft/applicationinsights-core-js';\n\nconst UserDashboard: React.FC<{ userId: string }> = ({ userId }) => {\n    const tracer = trace.getTracer('react-components');\n    \n    useEffect(() => {\n        const span = tracer.startSpan('load-dashboard', {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                'component': 'UserDashboard',\n                'user.id': userId\n            }\n        });\n        \n        // Load data\n        loadDashboardData(userId)\n            .then(data => {\n                span?.setAttribute('data.loaded', true);\n                span?.setAttribute('data.items', data.length);\n                span?.setStatus({ code: SpanStatusCode.OK });\n            })\n            .catch(error => {\n                span?.recordException(error);\n                span?.setStatus({ code: SpanStatusCode.ERROR });\n            })\n            .finally(() => {\n                span?.end();\n            });\n        \n        return () => {\n            // Cleanup\n        };\n    }, [userId]);\n    \n    const handleAction = (action: string) => {\n        tracer.startActiveSpan('user-action', (span) => {\n            span.setAttributes({\n                'action.type': action,\n                'component': 'UserDashboard',\n                'user.id': userId\n            });\n            \n            performAction(action);\n        });\n    };\n    \n    return (\n        <div>\n            <button onClick={() => handleAction('refresh')}>Refresh</button>\n        </div>\n    );\n};\n```\n\n### Integration 2: Express Middleware\n\n```typescript\nimport express from 'express';\n\nfunction tracingMiddleware(\n    req: express.Request,\n    res: express.Response,\n    next: express.NextFunction\n): void {\n    const tracer = trace.getTracer('express-server');\n    \n    const span = tracer.startSpan('http-request', {\n        kind: OTelSpanKind.SERVER,\n        attributes: {\n            'http.method': req.method,\n            'http.url': req.url,\n            'http.route': req.route?.path,\n            'http.user_agent': req.get('user-agent')\n        }\n    });\n    \n    if (!span) {\n        return next();\n    }\n    \n    // Store span in request for child spans\n    (req as any).span = span;\n    \n    const startTime = Date.now();\n    \n    // Override res.end to capture response\n    const originalEnd = res.end;\n    res.end = function(...args: any[]) {\n        const duration = Date.now() - startTime;\n        \n        span.setAttributes({\n            'http.status_code': res.statusCode,\n            'http.duration_ms': duration\n        });\n        \n        if (res.statusCode >= 500) {\n            span.setStatus({ \n                code: SpanStatusCode.ERROR,\n                message: `HTTP ${res.statusCode}`\n            });\n        } else {\n            span.setStatus({ code: SpanStatusCode.OK });\n        }\n        \n        span.end();\n        \n        return originalEnd.apply(res, args);\n    };\n    \n    next();\n}\n\n// Usage\nconst app = express();\napp.use(tracingMiddleware);\n```\n\n## Performance Patterns\n\n### Pattern 9: Batch Operations\n\n```typescript\nclass BatchProcessor {\n    private tracer = trace.getTracer('batch-processor');\n    \n    async processBatch<T>(items: T[], processor: (item: T) => Promise<void>): Promise<void> {\n        return this.tracer.startActiveSpan('process-batch', async (span) => {\n            span.setAttributes({\n                'batch.size': items.length,\n                'batch.started': new Date().toISOString()\n            });\n            \n            let successCount = 0;\n            let errorCount = 0;\n            \n            for (let i = 0; i < items.length; i++) {\n                const item = items[i];\n                \n                try {\n                    await this.tracer.startActiveSpan(`process-item-${i}`, async (itemSpan) => {\n                        itemSpan.setAttribute('item.index', i);\n                        await processor(item);\n                        successCount++;\n                    });\n                } catch (error) {\n                    errorCount++;\n                    span.recordException(error);\n                }\n            }\n            \n            span.setAttributes({\n                'batch.completed': new Date().toISOString(),\n                'batch.success_count': successCount,\n                'batch.error_count': errorCount,\n                'batch.success_rate': successCount / items.length\n            });\n            \n            if (errorCount > 0) {\n                span.setStatus({ \n                    code: SpanStatusCode.ERROR,\n                    message: `${errorCount} items failed`\n                });\n            } else {\n                span.setStatus({ code: SpanStatusCode.OK });\n            }\n        });\n    }\n}\n```\n\n### Pattern 10: Lazy Loading with Tracing\n\n```typescript\nclass LazyLoader<T> {\n    private tracer = trace.getTracer('lazy-loader');\n    private cache = new Map<string, T>();\n    \n    async load(key: string, loader: () => Promise<T>): Promise<T> {\n        // Check cache first\n        if (this.cache.has(key)) {\n            return this.cache.get(key)!;\n        }\n        \n        return this.tracer.startActiveSpan('lazy-load', async (span) => {\n            span.setAttributes({\n                'cache.key': key,\n                'cache.hit': false\n            });\n            \n            const value = await loader();\n            this.cache.set(key, value);\n            \n            span.setAttributes({\n                'cache.stored': true,\n                'cache.size': this.cache.size\n            });\n            \n            return value;\n        });\n    }\n}\n```\n\n## Using ITraceHost Methods Directly\n\nThe [`ITraceHost`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html) interface provides direct access to span lifecycle methods through `appInsights` (AISKU) or `core` (AppInsightsCore). These methods give you lower-level control over span creation and context management.\n\n### Pattern: Direct startSpan Usage\n\nThe `startSpan` method creates a new span without automatically setting it as the active span. This gives you explicit control over context management.\n\n```typescript\nimport { OTelSpanKind } from '@microsoft/applicationinsights-core-js';\n\n// Using AISKU\nconst span = appInsights.startSpan('manual-operation', {\n    kind: OTelSpanKind.INTERNAL,\n    attributes: {\n        'operation.type': 'manual',\n        'user.id': 'user123'\n    }\n});\n\nif (span) {\n    try {\n        // Do work - span is NOT automatically active\n        performOperation();\n        \n        // Manually add attributes as needed\n        span.setAttribute('result', 'success');\n        span.setAttribute('items.processed', 42);\n        \n        span.setStatus({ code: eOTelSpanStatusCode.OK });\n    } catch (error) {\n        span.recordException(error);\n        span.setStatus({ \n            code: eOTelSpanStatusCode.ERROR,\n            message: error.message \n        });\n    } finally {\n        span.end();\n    }\n}\n```\n\n### Pattern: activeSpan for Context Awareness\n\nThe `activeSpan` method retrieves the currently active span, useful for adding attributes or checking trace context.\n\n```typescript\n// Check if there's an active span and add context\nfunction addUserContextToActiveSpan(userId: string, userName: string): void {\n    const activeSpan = appInsights.getActiveSpan();\n    \n    if (activeSpan && activeSpan.isRecording()) {\n        activeSpan.setAttribute('user.id', userId);\n        activeSpan.setAttribute('user.name', userName);\n        activeSpan.setAttribute('context.added.at', Date.now());\n    }\n}\n\n// Usage in your application\nfunction handleUserAction(userId: string): void {\n    // Some parent span is already active\n    addUserContextToActiveSpan(userId, 'John Doe');\n    \n    // Continue with operation...\n}\n```\n\n### Pattern: activeSpan with createNew Parameter\n\nControl whether to create a non-recording span when no active span exists:\n\n```typescript\n// Performance-optimized check - don't create non-recording span\nfunction hasActiveTrace(): boolean {\n    const span = appInsights.getActiveSpan(false);\n    return span !== null;\n}\n\n// Create non-recording span if needed (default behavior)\nfunction getOrCreateActiveSpan(): IReadableSpan | null {\n    return appInsights.getActiveSpan(true);\n}\n\n// Conditional tracing based on active context\nfunction maybeTraceOperation(operationName: string): void {\n    if (hasActiveTrace()) {\n        // We're in a traced context, add details\n        const activeSpan = appInsights.getActiveSpan();\n        activeSpan?.setAttribute('operation', operationName);\n    }\n    \n    performOperation();\n}\n```\n\n### Pattern: setActiveSpan for Manual Context Management\n\nThe `setActiveSpan` method gives you explicit control over the active span context:\n\n```typescript\n// Create and manually set a span as active\nconst parentSpan = appInsights.startSpan('parent-operation', {\n    kind: OTelSpanKind.SERVER,\n    attributes: { 'http.method': 'POST' }\n});\n\nif (parentSpan) {\n    // Set this span as the active span\n    const scope = appInsights.setActiveSpan(parentSpan);\n    \n    try {\n        // Any child spans created now will use parentSpan as parent\n        const childSpan = appInsights.startSpan('child-operation');\n        \n        if (childSpan) {\n            // childSpan automatically has parentSpan as its parent\n            childSpan.setAttribute('child.data', 'value');\n            childSpan.end();\n        }\n        \n        parentSpan.setAttribute('children.created', 1);\n        \n    } finally {\n        // Restore previous active span\n        scope.restore();\n        parentSpan.end();\n    }\n}\n```\n\n### Pattern: Scope Management with ISpanScope\n\nThe [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) returned by `setActiveSpan` allows you to restore context:\n\n```typescript\nfunction executeWithTemporaryContext(operationName: string): void {\n    // Create a temporary span context\n    const tempSpan = appInsights.startSpan(operationName);\n    \n    if (tempSpan) {\n        const scope = appInsights.setActiveSpan(tempSpan);\n        \n        try {\n            // Access the scope properties\n            console.log('Current span:', scope.span.name);\n            console.log('Previous span:', scope.prvSpan?.name || 'none');\n            \n            // Do work in this context\n            performWork();\n            \n            // Manually restore early if needed\n            scope.restore();\n            \n            // Continue work outside the temporary context\n            performMoreWork();\n            \n        } finally {\n            tempSpan.end();\n        }\n    }\n}\n```\n\n### Pattern: Combining Host Methods for Complex Workflows\n\n```typescript\nimport { OTelSpanKind, eOTelSpanStatusCode } from '@microsoft/applicationinsights-core-js';\n\nclass WorkflowEngine {\n    private executionCount = 0;\n    \n    executeWorkflow(workflowName: string, steps: Array<() => Promise<void>>): Promise<void> {\n        // Create a span for the entire workflow\n        const workflowSpan = appInsights.startSpan(`workflow.${workflowName}`, {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                'workflow.name': workflowName,\n                'workflow.steps': steps.length,\n                'execution.count': ++this.executionCount\n            }\n        });\n        \n        if (!workflowSpan) {\n            return Promise.all(steps.map(step => step())).then(() => {});\n        }\n        \n        // Set workflow span as active\n        const workflowScope = appInsights.setActiveSpan(workflowSpan);\n        \n        return (async () => {\n            try {\n                for (let i = 0; i < steps.length; i++) {\n                    // Create a span for each step\n                    const stepSpan = appInsights.startSpan(`workflow.step.${i + 1}`, {\n                        kind: OTelSpanKind.INTERNAL,\n                        attributes: {\n                            'step.index': i,\n                            'step.name': steps[i].name || `step-${i + 1}`\n                        }\n                    });\n                    \n                    if (stepSpan) {\n                        const stepScope = appInsights.setActiveSpan(stepSpan);\n                        \n                        try {\n                            await steps[i]();\n                            stepSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                        } catch (error) {\n                            stepSpan.recordException(error);\n                            stepSpan.setStatus({ \n                                code: eOTelSpanStatusCode.ERROR,\n                                message: `Step ${i + 1} failed: ${error.message}`\n                            });\n                            throw error;\n                        } finally {\n                            stepScope.restore();\n                            stepSpan.end();\n                        }\n                    } else {\n                        await steps[i]();\n                    }\n                }\n                \n                workflowSpan.setAttribute('workflow.completed', true);\n                workflowSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                \n            } catch (error) {\n                workflowSpan.setAttribute('workflow.failed', true);\n                workflowSpan.recordException(error);\n                workflowSpan.setStatus({ \n                    code: eOTelSpanStatusCode.ERROR,\n                    message: `Workflow failed: ${error.message}`\n                });\n                throw error;\n                \n            } finally {\n                workflowScope.restore();\n                workflowSpan.end();\n            }\n        })();\n    }\n}\n\n// Usage\nconst workflow = new WorkflowEngine();\n\nworkflow.executeWorkflow('user-onboarding', [\n    async () => { /* validate input */ },\n    async () => { /* create user account */ },\n    async () => { /* send welcome email */ },\n    async () => { /* initialize preferences */ }\n]).then(() => {\n    console.log('Workflow completed successfully');\n}).catch(error => {\n    console.error('Workflow failed:', error);\n});\n```\n\n### Pattern: Accessing Active Span in Nested Functions\n\n```typescript\n// Middleware pattern that checks active span\nfunction withAuthentication<T>(operation: () => T): T {\n    const activeSpan = appInsights.getActiveSpan();\n    \n    // Add authentication context to active span if it exists\n    if (activeSpan && activeSpan.isRecording()) {\n        const authToken = getCurrentAuthToken();\n        activeSpan.setAttribute('auth.method', authToken ? 'token' : 'anonymous');\n        activeSpan.setAttribute('auth.validated', true);\n    }\n    \n    return operation();\n}\n\n// Usage - activeSpan is automatically propagated\nconst span = appInsights.startSpan('api-request');\nif (span) {\n    const scope = appInsights.setActiveSpan(span);\n    \n    try {\n        // The activeSpan in withAuthentication will be 'span'\n        const result = withAuthentication(() => {\n            return performSecureOperation();\n        });\n        \n        span.setAttribute('result', 'success');\n    } finally {\n        scope.restore();\n        span.end();\n    }\n}\n```\n\n## Testing and Debugging\n\n### Testing Pattern: Span Verification\n\n```typescript\nimport { isReadableSpan } from '@microsoft/applicationinsights-core-js';\n\ndescribe('Tracing Tests', () => {\n    it('should create span with correct attributes', () => {\n        const span = tracer.startSpan('test-operation');\n        \n        expect(span).toBeTruthy();\n        expect(isReadableSpan(span)).toBe(true);\n        \n        span?.setAttribute('test.key', 'test-value');\n        \n        const spanContext = span?.spanContext();\n        expect(spanContext?.traceId).toBeTruthy();\n        expect(spanContext?.spanId).toBeTruthy();\n        \n        span?.end();\n    });\n    \n    it('should create parent-child relationship', () => {\n        tracer.startActiveSpan('parent', (parentSpan) => {\n            const parentContext = parentSpan.spanContext();\n            \n            const childSpan = tracer.startSpan('child');\n            const childContext = childSpan?.spanContext();\n            \n            // Same trace ID\n            expect(childContext?.traceId).toBe(parentContext.traceId);\n            \n            // Different span IDs\n            expect(childContext?.spanId).not.toBe(parentContext.spanId);\n            \n            childSpan?.end();\n        });\n    });\n    \n    it('should manage active span context correctly', () => {\n        const span1 = appInsights.startSpan('span-1');\n        const span2 = appInsights.startSpan('span-2');\n        \n        expect(span1).toBeTruthy();\n        expect(span2).toBeTruthy();\n        \n        // Set span1 as active\n        const scope1 = appInsights.setActiveSpan(span1!);\n        expect(appInsights.getActiveSpan(false)?.spanContext().spanId).toBe(span1!.spanContext().spanId);\n        \n        // Set span2 as active (nested)\n        const scope2 = appInsights.setActiveSpan(span2!);\n        expect(appInsights.getActiveSpan(false)?.spanContext().spanId).toBe(span2!.spanContext().spanId);\n        \n        // Restore to span1\n        scope2.restore();\n        expect(appInsights.getActiveSpan(false)?.spanContext().spanId).toBe(span1!.spanContext().spanId);\n        \n        // Restore to previous context\n        scope1.restore();\n        \n        span1?.end();\n        span2?.end();\n    });\n});\n```\n\n### Debugging Pattern: Span Inspection\n\n```typescript\nfunction debugSpan(span: IReadableSpan | null): void {\n    if (!span) {\n        console.log('No span provided');\n        return;\n    }\n    \n    console.group('Span Debug Info');\n    console.log('Name:', span.name);\n    console.log('Kind:', span.kind);\n    console.log('Started:', span.startTime);\n    console.log('Ended:', span.ended);\n    console.log('Duration:', span.duration);\n    \n    const context = span.spanContext();\n    console.log('Trace ID:', context.traceId);\n    console.log('Span ID:', context.spanId);\n    console.log('Trace Flags:', context.traceFlags);\n    \n    console.log('Attributes:', span.attributes);\n    console.log('Status:', span.status);\n    console.log('Is Recording:', span.isRecording());\n    \n    console.groupEnd();\n}\n\n// Usage\nconst span = tracer.startSpan('debug-me');\nspan?.setAttribute('debug', true);\ndebugSpan(span);\nspan?.end();\n```\n\n## See Also\n\n- [Main README](./README.md) - OpenTelemetry compatibility overview\n- [OTel API Documentation](./otelApi.md) - Main API reference\n- [Trace API Documentation](./traceApi.md) - Tracer and span management\n- [withSpan Helper](./withSpan.md) - Context management helper\n- [useSpan Helper](./useSpan.md) - Scope-aware context helper\n\n---\n\nThese examples demonstrate real-world usage patterns for OpenTelemetry in Application Insights. Adapt them to your specific needs and follow the best practices outlined in each pattern.\n"
  },
  {
    "path": "docs/OTel/otelApi.md",
    "content": "# OTel API Reference\n\n## Overview\n\nThe [`IOTelApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelApi.html) interface is the main entry point for OpenTelemetry functionality in the Application Insights JavaScript SDK. It provides access to tracers, the trace API, and configuration settings. This API closely follows the OpenTelemetry specification while integrating seamlessly with Application Insights.\n\n## Table of Contents\n\n- [Getting the OTel API](#getting-the-otel-api)\n- [Interface Definition](#interface-definition)\n- [Properties](#properties)\n- [Creating an OTel API Instance](#creating-an-otel-api-instance)\n- [Usage Examples](#usage-examples)\n- [Best Practices](#best-practices)\n\n## Getting the OTel API\n\n### From AISKU (Web SDK)\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING'\n    }\n});\nappInsights.loadAppInsights();\n\n// Get the OpenTelemetry API\nconst otelApi = appInsights.otelApi;\n```\n\n**Note:** The `otelApi` and `trace` properties are only available on the AISKU (`appInsights`) instance, not on `AppInsightsCore`.\n\n## Interface Definition\n\n```typescript\nexport interface IOTelApi extends IOTelTracerProvider {\n    /**\n     * The configuration object that contains all OpenTelemetry-specific settings.\n     */\n    cfg: IOTelConfig;\n\n    /**\n     * The current ITraceHost instance for this IOTelApi instance.\n     */\n    host: ITraceHost;\n    \n    /**\n     * The current ITraceApi instance for this IOTelApi instance.\n     */\n    trace: ITraceApi;\n}\n```\n\n### Extended from [`IOTelTracerProvider`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracerProvider.html)\n\nSince [`IOTelApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelApi.html) extends [`IOTelTracerProvider`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracerProvider.html), it also provides:\n\n```typescript\n/**\n * Get a tracer for a specific instrumentation scope\n * @param name - The name of the tracer/instrumentation library\n * @param version - Optional version of the instrumentation library\n * @param options - Optional tracer configuration options\n * @returns A tracer instance\n */\ngetTracer(name: string, version?: string, options?: IOTelTracerOptions): IOTelTracer;\n```\n\n## Properties\n\n### cfg: IOTelConfig\n\nThe configuration object containing all OpenTelemetry-specific settings.\n\n**Type:** [`IOTelConfig`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelConfig.html)\n\n**Description:** Provides access to tracing configuration, error handlers, and other OpenTelemetry options. Changes to this configuration after initialization may not take effect until the next telemetry operation.\n\n**Example:**\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Access trace configuration\nif (otelApi.cfg.traceCfg) {\n    console.log('Tracing enabled:', !otelApi.cfg.traceCfg.suppressTracing);\n}\n\n// Check for error handlers\nif (otelApi.cfg.errorHandlers) {\n    console.log('Custom error handlers configured');\n}\n```\n\n### host: ITraceHost\n\nThe trace host instance that manages span lifecycle and active span context.\n\n**Type:** [`ITraceHost`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html)\n\n**Description:** This is effectively the OpenTelemetry ContextAPI without the static methods. It provides methods for managing the active span context and creating spans.\n\n**Key Methods:**\n- `startSpan(name, options?, context?)` - Create a new span\n- `getActiveSpan()` - Get the current active span\n- `setActiveSpan(span)` - Set a span as the active span\n- `getTraceCtx()` - Get the current trace context\n\n`setActiveSpan` requires a non-null span (`IReadableSpan`); clearing the active span by passing `null` is not supported.\n\n**Example:**\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Get the current active span\nconst activeSpan = otelApi.host.getActiveSpan();\nif (activeSpan) {\n    console.log('Active span:', activeSpan.name);\n    console.log('Trace ID:', activeSpan.spanContext().traceId);\n}\n\n// Create a span directly via host\nconst span = otelApi.host.startSpan('operation-name', {\n    kind: OTelSpanKind.INTERNAL,\n    attributes: { 'custom.attribute': 'value' }\n});\n```\n\n### trace: ITraceApi\n\nThe trace API providing utilities for tracer and span management.\n\n**Type:** [`ITraceApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceApi.html)\n\n**Description:** Provides the OpenTelemetry TraceAPI interface without static methods. This is the recommended way to get tracers and manage span contexts.\n\n**Key Methods:**\n- `getTracer(name, version?, options?)` - Get or create a tracer\n- `getActiveSpan()` - Get the current active span\n- `setActiveSpan(span)` - Set the active span\n- `wrapSpanContext(spanContext)` - Create a non-recording span from context\n- `isSpanContextValid(spanContext)` - Validate a span context\n\n**Example:**\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Get a tracer via trace API\nconst tracer = otelApi.trace.getTracer('my-service');\n\n// Check for active span\nconst activeSpan = otelApi.trace.getActiveSpan();\nif (activeSpan) {\n    console.log('Current operation:', activeSpan.name);\n}\n\n// Validate a span context\nconst isValid = otelApi.trace.isSpanContextValid(spanContext);\n```\n\n## Creating an OTel API Instance\n\nTypically, you don't create `IOTelApi` instances directly. They are created and managed by the Application Insights core. However, for advanced scenarios, you can use the `createOTelApi` function:\n\n### createOTelApi Function\n\n```typescript\nfunction createOTelApi(otelApiCtx: IOTelApiCtx): IOTelApi;\n```\n\n**Parameters:**\n- `otelApiCtx: IOTelApiCtx` - The context containing the host instance\n\n**Returns:** A new [`IOTelApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelApi.html) instance\n\n**Example:**\n```typescript\nimport { createOTelApi } from '@microsoft/applicationinsights-core-js';\n\n// Advanced: Create a custom OTel API instance\nconst otelApiCtx = {\n    host: appInsightsCore\n};\n\nconst customOtelApi = createOTelApi(otelApiCtx);\n```\n\n### IOTelApiCtx Interface\n\n```typescript\nexport interface IOTelApiCtx {\n    /**\n     * The host instance (AppInsightsCore) that provides tracing capabilities\n     */\n    host: ITraceHost;\n}\n```\n\n## Usage Examples\n\n### Example 1: Basic API Access\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING',\n        traceCfg: {\n            suppressTracing: false\n        }\n    }\n});\nappInsights.loadAppInsights();\n\n// Get the OTel API\nconst otelApi = appInsights.otelApi;\n\n// Access different parts of the API\nconsole.log('Has trace API:', !!otelApi.trace);\nconsole.log('Has host:', !!otelApi.host);\nconsole.log('Configuration available:', !!otelApi.cfg);\n```\n\n### Example 2: Getting Tracers\n\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Get a tracer directly from the API\nconst tracer1 = otelApi.getTracer('service-a');\n\n// Or get it via the trace property (recommended)\nconst tracer2 = otelApi.trace.getTracer('service-b');\n\n// Both approaches work and return cached instances\nconst tracer3 = otelApi.trace.getTracer('service-a');\nconsole.log(tracer1 === tracer3); // true - same cached instance\n```\n\n### Example 3: Working with Active Spans\n\n```typescript\nconst otelApi = appInsights.otelApi;\nconst tracer = otelApi.trace.getTracer('my-app');\n\n// Create and set an active span\nconst span = tracer.startSpan('operation');\notelApi.trace.setActiveSpan(span);\n\n// Later, get the active span\nconst activeSpan = otelApi.trace.getActiveSpan();\nif (activeSpan) {\n    activeSpan.setAttribute('additional.info', 'added later');\n}\n\n// Clear the active span\notelApi.trace.setActiveSpan(null);\nspan.end();\n```\n\n### Example 4: Span Context Utilities\n\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Check if a span context is valid\nconst spanContext = {\n    traceId: '00000000000000000000000000000001',\n    spanId: '0000000000000001',\n    traceFlags: 1\n};\n\nif (otelApi.trace.isSpanContextValid(spanContext)) {\n    // Wrap the context in a non-recording span\n    const wrappedSpan = otelApi.trace.wrapSpanContext(spanContext);\n    \n    // Use the wrapped span (e.g., for context propagation)\n    otelApi.trace.setActiveSpan(wrappedSpan);\n    \n    // ... perform operations that should have this context\n    \n    otelApi.trace.setActiveSpan(null);\n}\n```\n\n### Example 5: Multiple Service Components\n\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Define different tracers for different parts of your application\nconst tracers = {\n    userService: otelApi.trace.getTracer('user-service'),\n    paymentService: otelApi.trace.getTracer('payment-service'),\n    notificationService: otelApi.trace.getTracer('notification-service')\n};\n\n// Use the appropriate tracer for each operation\nfunction authenticateUser(userId: string) {\n    const span = tracers.userService.startSpan('authenticate');\n    span.setAttribute('user.id', userId);\n    // ... authentication logic\n    span.end();\n}\n\nfunction processPayment(amount: number) {\n    const span = tracers.paymentService.startSpan('process-payment');\n    span.setAttribute('payment.amount', amount);\n    // ... payment logic\n    span.end();\n}\n\nfunction sendNotification(type: string) {\n    const span = tracers.notificationService.startSpan('send-notification');\n    span.setAttribute('notification.type', type);\n    // ... notification logic\n    span.end();\n}\n```\n\n### Example 6: Accessing Configuration\n\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Check if tracing is enabled\nfunction isTracingEnabled(): boolean {\n    return otelApi.cfg?.traceCfg?.suppressTracing !== true;\n}\n\n// Conditionally create spans based on configuration\nfunction createSpanIfEnabled(name: string): IReadableSpan | null {\n    if (!isTracingEnabled()) {\n        return null;\n    }\n    \n    const tracer = otelApi.trace.getTracer('my-service');\n    return tracer.startSpan(name);\n}\n\n// Use the conditional span creation\nconst span = createSpanIfEnabled('optional-trace');\nif (span) {\n    span.setAttribute('traced', true);\n    // ... do work\n    span.end();\n}\n```\n\n### Example 7: Integration with Host Methods\n\n```typescript\nconst otelApi = appInsights.otelApi;\n\n// Use host methods directly for lower-level control\nconst span = otelApi.host.startSpan('low-level-operation', {\n    kind: OTelSpanKind.INTERNAL,\n    attributes: {\n        'operation.type': 'direct-host-call'\n    }\n});\n\n// Set it as active using the host\nconst scope = otelApi.host.setActiveSpan(span);\n\ntry {\n    // Perform work with span active\n    console.log('Current trace context:', otelApi.host.getTraceCtx());\n    \n    // Create child span (automatically uses active span as parent)\n    const childSpan = otelApi.host.startSpan('child-operation');\n    childSpan?.end();\n    \n} finally {\n    // Restore previous context\n    scope?.restore();\n    span.end();\n}\n```\n\n## Best Practices\n\n### 1. Prefer Direct startSpan for Most Scenarios\n\n**Recommended approach:**\n```typescript\n// Direct startSpan from AISKU - simplest for most use cases\nappInsights.startSpan('operation-name', (span) => {\n    span.setAttribute('key', 'value');\n    // operation code\n});\n```\n\n**Use getTracer for service organization:**\n```typescript\n// Only needed when organizing multiple services/components\nconst tracer = otelApi.trace.getTracer('my-service');\ntracer.startActiveSpan('operation', (span) => {\n    // ...\n});\n```\n\n### 2. Use the Trace API for Tracer Access\n\n**Recommended:**\n```typescript\nconst tracer = otelApi.trace.getTracer('my-service');\n```\n\n**Also Valid:**\n```typescript\nconst tracer = otelApi.getTracer('my-service');\n```\n\nBoth work, but using `otelApi.trace.getTracer()` is more explicit and follows OpenTelemetry conventions.\n\n### 3. Cache the OTel API Reference\n\n```typescript\n// Good - cache the reference\nconst otelApi = appInsights.otelApi;\nconst tracer = otelApi.trace.getTracer('my-service');\n\n// Less efficient - repeated property access\nappInsights.otelApi.trace.getTracer('my-service');\n```\n\n### 4. Check for Null/Undefined\n\nWhile rare, always check for null when working with spans:\n\n```typescript\nconst span = tracer.startSpan('operation');\nif (span) {\n    // Safe to use span\n    span.setAttribute('key', 'value');\n    span.end();\n}\n```\n\n### 5. Organize Tracers by Service/Component\n\n```typescript\n// Good - clear organization\nclass UserService {\n    private tracer = otelApi.trace.getTracer('user-service');\n    \n    authenticate(userId: string) {\n        const span = this.tracer.startSpan('authenticate');\n        // ...\n    }\n}\n\nclass PaymentService {\n    private tracer = otelApi.trace.getTracer('payment-service');\n    \n    processPayment(amount: number) {\n        const span = this.tracer.startSpan('process-payment');\n        // ...\n    }\n}\n```\n\n### 5. Use Configuration Safely\n\n```typescript\n// Safe configuration access with fallbacks\nfunction getTraceCfg(otelApi: IOTelApi): ITraceCfg | null {\n    return otelApi?.cfg?.traceCfg || null;\n}\n\n// Check before using\nconst traceCfg = getTraceCfg(otelApi);\nif (traceCfg && !traceCfg.suppressTracing) {\n    // Create spans\n}\n```\n\n### 6. Prefer Trace API Methods Over Direct Host Access\n\n**Recommended:**\n```typescript\nconst activeSpan = otelApi.trace.getActiveSpan();\notelApi.trace.setActiveSpan(span);\n```\n\n**Direct (lower level):**\n```typescript\nconst activeSpan = otelApi.host.getActiveSpan();\notelApi.host.setActiveSpan(span);\n```\n\nThe trace API methods provide better abstraction and follow OpenTelemetry conventions.\n\n## See Also\n\n- [Trace API Documentation](./traceApi.md) - Detailed tracer and span management\n- [withSpan Helper](./withSpan.md) - Executing code with active span context\n- [useSpan Helper](./useSpan.md) - Executing code with span scope parameter\n- [Examples Guide](./examples.md) - Comprehensive usage examples\n- [Main README](./README.md) - OpenTelemetry compatibility overview\n\n## Related Interfaces\n\n- [`IOTelConfig`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelConfig.html) - OpenTelemetry configuration settings\n- [`ITraceHost`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html) - Host interface for span management\n- [`ITraceApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceApi.html) - Trace API interface\n- [`IOTelTracer`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracer.html) - Tracer interface for creating spans\n- [`IOTelTracerProvider`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracerProvider.html) - Provider interface for getting tracers\n- [`IOTelTracerOptions`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracerOptions.html) - Options for tracer creation\n"
  },
  {
    "path": "docs/OTel/startActiveSpan.md",
    "content": "# startActiveSpan Helper Function\n\n## Overview\n\nThe `startActiveSpan` helper function is the **recommended approach** for creating spans in most scenarios. It provides automatic span lifecycle management, automatic context management, and ensures proper cleanup. This standalone utility function creates a span, sets it as active, executes your callback function, and automatically ends the span when the callback completes.\n\n**Important:** This documentation covers the **standalone helper function** from [utils.ts](../../shared/AppInsightsCore/src/OpenTelemetry/trace/utils.ts), not the IOTelTracer interface method. The helper function is designed for direct use when you have access to a trace host instance.\n\n## Table of Contents\n\n- [Function Signature](#function-signature)\n- [Parameters](#parameters)\n- [Return Value](#return-value)\n- [Key Features](#key-features)\n- [Comparison with Other Helpers](#comparison-with-other-helpers)\n- [Usage Examples](#usage-examples)\n- [Best Practices](#best-practices)\n- [Common Patterns](#common-patterns)\n- [Error Handling](#error-handling)\n- [Advanced Usage](#advanced-usage)\n\n## Function Signature\n\nThe `startActiveSpan` helper has three overloads:\n\n### Simple Form (No Options)\n\n```typescript\nfunction startActiveSpan<T extends ITraceHost, F extends (this: ThisParameterType<F> | ISpanScope<T>, scope?: ISpanScope<T>) => ReturnType<F>>(\n    traceHost: T,\n    name: string,\n    fn: F,\n    thisArg?: ThisParameterType<F>\n): ReturnType<F>;\n```\n\n### With Options\n\n```typescript\nfunction startActiveSpan<T extends ITraceHost, F extends (this: ThisParameterType<F> | ISpanScope<T>, scope?: ISpanScope<T>) => ReturnType<F>>(\n    traceHost: T,\n    name: string,\n    options: IOTelSpanOptions,\n    fn: F,\n    thisArg?: ThisParameterType<F>\n): ReturnType<F>;\n```\n\n### Combined Overload\n\n```typescript\nfunction startActiveSpan<T extends ITraceHost, F extends (this: ThisParameterType<F> | ISpanScope<T>, scope?: ISpanScope<T>) => ReturnType<F>>(\n    traceHost: T,\n    name: string,\n    optionsOrFn: IOTelSpanOptions | F,\n    maybeFnOrThis?: F | ThisParameterType<F>,\n    thisArg?: ThisParameterType<F>\n): ReturnType<F>;\n```\n\n## Parameters\n\n### traceHost: T extends ITraceHost\n\nThe trace host instance (typically an [`IAppInsightsCore`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IAppInsightsCore.html) or ApplicationInsights instance) that provides span creation and context management capabilities.\n\n**Example:**\n```typescript\nimport { startActiveSpan } from '@microsoft/applicationinsights-core-js';\n\n// Using with core instance\nstartActiveSpan(appInsightsCore, 'operation-name', (scope) => {\n    // Work here\n});\n\n// Using with AISKU instance\nstartActiveSpan(appInsights, 'operation-name', (scope) => {\n    // Work here\n});\n```\n\n### name: string\n\nThe name of the span, describing the operation being performed.\n\n**Best Practices:**\n- Use clear, descriptive names (e.g., `'process-payment'`, `'fetch-user-data'`)\n- Keep names concise but meaningful\n- Use consistent naming patterns across your application\n- Avoid including variable data in span names (use attributes instead)\n\n**Example:**\n```typescript\nstartActiveSpan(appInsights, 'authenticate-user', (scope) => {\n    // Work here\n});\n```\n\n### options?: IOTelSpanOptions\n\nOptional configuration for the span.\n\n**Type:** [`IOTelSpanOptions`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelSpanOptions.html)\n\n**Common Options:**\n```typescript\ninterface IOTelSpanOptions {\n    kind?: OTelSpanKind;           // Span kind (INTERNAL, SERVER, CLIENT, etc.)\n    attributes?: IOTelAttributes;   // Initial attributes\n    links?: IOTelLink[];           // Links to other spans\n    startTime?: number;            // Custom start time\n}\n```\n\n**Example:**\n```typescript\nstartActiveSpan(appInsights, 'api-call',\n    {\n        kind: OTelSpanKind.CLIENT,\n        attributes: {\n            'http.method': 'GET',\n            'http.url': '/api/data'\n        }\n    },\n    (scope) => {\n        // Work here\n    }\n);\n```\n\n### fn: Function\n\nThe callback function to execute with the span as active context. The callback receives an optional [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) parameter that provides access to the span and restoration capability.\n\n**Signature:**\n```typescript\n(this: ThisParameterType<F> | ISpanScope<T>, scope?: ISpanScope<T>) => any\n```\n\n**Parameters:**\n- `scope` (optional) - The [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) object providing:\n  - `scope.span` - The created [`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html) that is active during callback execution\n  - `scope.restore()` - Method to manually restore the previous active span\n\n**Context (`this`):**\n- When `thisArg` is not provided, `this` is set to the `ISpanScope` object\n- When `thisArg` is provided, `this` is set to that value\n\n**Characteristics:**\n- Can be synchronous or asynchronous (return a Promise)\n- Return value is passed through\n- Span is automatically ended when the function completes\n- The span is automatically set as active during execution\n\n**Example:**\n```typescript\n// Most common - access span via scope parameter\nstartActiveSpan(appInsights, 'operation', (scope) => {\n    scope.span.setAttribute('key', 'value');\n    return processData();\n});\n\n// Without scope parameter - access span via this\nstartActiveSpan(appInsights, 'operation', function() {\n    this.span.setAttribute('key', 'value');\n    return processData();\n});\n\n// Manual restoration (rarely needed)\nstartActiveSpan(appInsights, 'operation', (scope) => {\n    scope.span.setAttribute('key', 'value');\n    // Manual restoration for early exit\n    scope.restore();\n    return null;\n});\n```\n\n**Note:** The `scope` parameter is optional. If not used, you can access the span via `this.span` within the callback (when no `thisArg` is provided).\n\n### thisArg?: ThisParameterType<F>\n\nOptional `this` context for the callback function. If not provided, the `ISpanScope` object is used as the `this` context.\n\n**Example:**\n```typescript\nclass MyClass {\n    processWithContext() {\n        return startActiveSpan(appInsights, 'operation', function(scope) {\n            // this refers to MyClass instance\n            console.log(this instanceof MyClass); // true\n            scope.span.setAttribute('processed', true);\n        }, this); // Pass this as thisArg\n    }\n}\n\n## Return Value\n\nReturns the result of executing the callback function. The return type matches whatever the callback returns.\n\n**Synchronous callback:**\n```typescript\nconst result: number = startActiveSpan(appInsights, 'sync-op', (scope) => {\n    return 42;\n});\n```\n\n**Asynchronous callback:**\n```typescript\nconst result: Promise<string> = startActiveSpan(appInsights, 'async-op', async (scope) => {\n    return await fetchData();\n});\n\n// Must await the result as the \"activeSpan\" is NOT restored\n// until the promise is resolved or rejected\nconst data = await result;\n```\n\n## Key Features\n\n### 1. Automatic Span Lifecycle\n\nThe span is automatically ended when the callback completes, whether it returns synchronously or asynchronously.\n\n```typescript\nstartActiveSpan(appInsights, 'auto-lifecycle', (scope) => {\n    scope.span.setAttribute('started', Date.now());\n    performWork();\n    // Span automatically ends here\n});\n```\n\n### 2. Automatic Context Management\n\nThe span is automatically set as the active span during callback execution and restored afterward.\n\n```typescript\nstartActiveSpan(appInsights, 'outer', (outerScope) => {\n    console.log('Active span:', appInsights.getActiveSpan()?.name); // 'outer'\n    \n    startActiveSpan(appInsights, 'inner', (innerScope) => {\n        console.log('Active span:', appInsights.getActiveSpan()?.name); // 'inner'\n    });\n    \n    console.log('Active span:', appInsights.getActiveSpan()?.name); // 'outer' (restored)\n});\n```\n\n### 3. Exception Safety\n\nThe span is properly ended even if the callback throws an error, ensuring no span leaks.\n\n```typescript\ntry {\n    startActiveSpan(appInsights, 'risky-op', (scope) => {\n        throw new Error('Something went wrong');\n        // Span is still ended\n    });\n} catch (error) {\n    console.error('Error caught, span was still ended');\n}\n```\n\n### 4. Parent Span Inheritance\n\nChild spans created within the callback automatically use the active span as their parent.\n\n```typescript\nstartActiveSpan(appInsights, 'parent', (parentScope) => {\n    // Create child - automatically has parentScope.span as parent\n    startActiveSpan(appInsights, 'child', (childScope) => {\n        console.log('Same trace ID:', \n            parentScope.span.spanContext().traceId === childScope.span.spanContext().traceId\n        );\n    });\n});\n```\n\n### 5. Async/Await Support\n\nSeamlessly handles both synchronous and asynchronous operations.\n\n```typescript\n// Async example\nawait startActiveSpan(appInsights, 'async-work', async (scope) => {\n    const data = await fetchData();\n    scope.span.setAttribute('items', data.length);\n    return data;\n});\n```\n\n## Comparison with Other Helpers\n\n### vs. withSpan\n\n**startActiveSpan (Creates and manages span):**\n```typescript\n// Creates span, sets active, and automatically ends it\nstartActiveSpan(appInsights, 'operation', (scope) => {\n    scope.span.setAttribute('key', 'value');\n    return doWork();\n    // Span automatically ended\n});\n```\n\n**withSpan (Uses existing span):**\n```typescript\n// Uses an already-created span and sets it as active\nconst span = appInsights.startSpan('operation');\ntry {\n    withSpan(appInsights, span, () => {\n        // Use existing span as active\n        doWork();\n    });\n} finally {\n    span.end(); // Manual cleanup required\n}\n```\n\n### vs. useSpan\n\n**startActiveSpan (Creates span):**\n```typescript\n// Creates and manages a new span\nstartActiveSpan(appInsights, 'new-span', (scope) => {\n    // Span created here\n    scope.span.setAttribute('created', true);\n    doWork();\n});\n```\n\n**useSpan (Uses existing span with scope):**\n```typescript\n// Uses an already-created span and receives scope parameter\nconst span = appInsights.startSpan('existing-span');\ntry {\n    useSpan(appInsights, span, (scope) => {\n        // Use existing span via scope\n        scope.span.setAttribute('used', true);\n        doWork();\n    });\n} finally {\n    span.end(); // Manual cleanup required\n}\n```\n\n**When to Use:**\n- **`startActiveSpan`**: When creating a new span for an operation (most common)\n- **`withSpan`**: When you have an existing span and need to set it as active\n- **`useSpan`**: When you need both an existing span active and want scope parameter access\n\n## Usage Examples\n\n### Example 1: Basic Usage\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { startActiveSpan } from '@microsoft/applicationinsights-core-js';\n\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING'\n    }\n});\nappInsights.loadAppInsights();\n\n// Simple span creation\nfunction processOrder(orderId: string) {\n    return startActiveSpan(appInsights, 'process-order', (scope) => {\n        scope.span.setAttribute('order.id', orderId);\n        scope.span.setAttribute('service', 'order-processing');\n        \n        const result = performOrderProcessing(orderId);\n        \n        scope.span.setAttribute('result', 'success');\n        return result;\n    });\n}\n```\n\n### Example 2: Async Operations\n\n```typescript\nasync function fetchUserProfile(userId: string) {\n    return startActiveSpan(appInsights, 'fetch-user-profile', async (scope) => {\n        scope.span.setAttribute('user.id', userId);\n        scope.span.setAttribute('operation', 'read');\n        \n        try {\n            const response = await fetch(`/api/users/${userId}`);\n            scope.span.setAttribute('http.status_code', response.status);\n            \n            if (!response.ok) {\n                throw new Error(`HTTP ${response.status}`);\n            }\n            \n            const data = await response.json();\n            scope.span.setStatus({ code: SpanStatusCode.OK });\n            \n            return data;\n        } catch (error) {\n            scope.span.recordException(error);\n            scope.span.setStatus({ \n                code: SpanStatusCode.ERROR,\n                message: error.message \n            });\n            throw error;\n        }\n    });\n}\n\n// Usage\nconst profile = await fetchUserProfile('user123');\n```\n\n### Example 3: With Options\n\n```typescript\nfunction makeApiCall(endpoint: string, method: string) {\n    return startActiveSpan(\n        appInsights,\n        'api-call',\n        {\n            kind: OTelSpanKind.CLIENT,\n            attributes: {\n                'http.method': method,\n                'http.url': endpoint,\n                'service.name': 'api-client'\n            }\n        },\n        async (scope) => {\n            const startTime = Date.now();\n            \n            try {\n                const response = await fetch(endpoint, { method });\n                const duration = Date.now() - startTime;\n                \n                scope.span.setAttribute('http.status_code', response.status);\n                scope.span.setAttribute('http.response_time', duration);\n                scope.span.setStatus({ code: SpanStatusCode.OK });\n                \n                return response.json();\n            } catch (error) {\n                scope.span.recordException(error);\n                scope.span.setStatus({ code: SpanStatusCode.ERROR });\n                throw error;\n            }\n        }\n    );\n}\n```\n\n### Example 4: Nested Spans\n\n```typescript\nasync function handleCheckout(cartId: string) {\n    return startActiveSpan(appInsights, 'checkout', async (checkoutScope) => {\n        checkoutScope.span.setAttribute('cart.id', cartId);\n        checkoutScope.span.setAttributes({\n            'operation': 'checkout',\n            'service': 'e-commerce'\n        });\n        \n        // Step 1: Validate cart (child span)\n        await startActiveSpan(appInsights, 'validate-cart', async (scope) => {\n            scope.span.setAttribute('validation.type', 'cart');\n            const isValid = await validateCart(cartId);\n            scope.span.setAttribute('validation.result', isValid);\n            \n            if (!isValid) {\n                throw new Error('Invalid cart');\n            }\n        });\n        \n        // Step 2: Process payment (child span)\n        const paymentResult = await startActiveSpan(appInsights, 'process-payment', async (scope) => {\n            scope.span.setAttribute('payment.method', 'credit_card');\n            scope.span.setAttribute('payment.provider', 'stripe');\n            \n            const result = await processPayment(cartId);\n            scope.span.setAttribute('payment.transaction_id', result.transactionId);\n            \n            return result;\n        });\n        \n        // Step 3: Send confirmation (child span)\n        await startActiveSpan(appInsights, 'send-confirmation', async (scope) => {\n            scope.span.setAttribute('notification.type', 'email');\n            scope.span.setAttribute('notification.template', 'order-confirmation');\n            \n            await sendConfirmationEmail(cartId, paymentResult);\n        });\n        \n        checkoutScope.span.setAttribute('checkout.completed', true);\n        return { cartId, payment: paymentResult };\n    });\n}\n```\n\n### Example 5: Using this Context\n\n```typescript\n// Access span via this when no scope parameter is used\nstartActiveSpan(appInsights, 'user-action', function() {\n    this.span.setAttribute('action.type', 'button-click');\n    handleUserAction();\n});\n\n// With scope parameter (more explicit)\nstartActiveSpan(appInsights, 'user-action', (scope) => {\n    scope.span.setAttribute('action.type', 'button-click');\n    handleUserAction();\n});\n```\n\n### Example 6: Error Handling\n\n```typescript\nasync function riskyOperation(data: any) {\n    return startActiveSpan(appInsights, 'risky-operation', async (scope) => {\n        scope.span.setAttribute('operation.type', 'risky');\n        scope.span.setAttribute('data.size', JSON.stringify(data).length);\n        \n        try {\n            const result = await performRiskyWork(data);\n            \n            scope.span.setAttribute('result.success', true);\n            scope.span.setStatus({ code: SpanStatusCode.OK });\n            \n            return result;\n        } catch (error) {\n            scope.span.setAttribute('result.success', false);\n            scope.span.setAttribute('error.type', error.name);\n            scope.span.recordException(error);\n            scope.span.setStatus({ \n                code: SpanStatusCode.ERROR,\n                message: error.message \n            });\n            \n            // Re-throw or handle as needed\n            throw error;\n        }\n    });\n}\n```\n\n### Example 7: Manual Restoration (Rare)\n\n```typescript\nfunction processWithManualControl(data: any) {\n    return startActiveSpan(appInsights, 'process-data', (scope) => {\n        scope.span.setAttribute('data.type', typeof data);\n        \n        // Perform initial processing\n        const preprocessed = preprocessData(data);\n        \n        // Manually restore context early if needed\n        if (shouldEndEarly(preprocessed)) {\n            scope.restore();\n            scope.span.end();\n            return null;\n        }\n        \n        // Continue processing with active context\n        const result = transform(preprocessed);\n        scope.span.setAttribute('result.ready', true);\n        return result;\n    });\n}\n```\n\n### Example 8: With Custom This Context\n\n```typescript\nclass DataProcessor {\n    private serviceName = 'data-processor';\n    \n    processData(data: any) {\n        return startActiveSpan(\n            appInsights,\n            'process-data',\n            function(scope) {\n                // this refers to DataProcessor instance\n                scope.span.setAttribute('service', this.serviceName);\n                scope.span.setAttribute('data.length', data.length);\n                \n                return this.transform(data);\n            },\n            this // Pass this as thisArg\n        );\n    }\n    \n    private transform(data: any) {\n        // Transform logic\n        return data;\n    }\n}\n```\n\n## Best Practices\n\n### 1. Use startActiveSpan as Default\n\n```typescript\n// Good - use startActiveSpan for most scenarios\nstartActiveSpan(appInsights, 'operation', (scope) => {\n    scope.span.setAttribute('key', 'value');\n    return doWork();\n});\n\n// Less ideal - manual management only when needed\nconst span = appInsights.startSpan('operation');\ntry {\n    span.setAttribute('key', 'value');\n    return doWork();\n} finally {\n    span.end();\n}\n```\n\n### 2. Add Meaningful Attributes\n\n```typescript\n// Good - descriptive attributes\nstartActiveSpan(appInsights, 'database-query', (scope) => {\n    scope.span.setAttributes({\n        'db.system': 'postgresql',\n        'db.operation': 'SELECT',\n        'db.table': 'users',\n        'query.limit': 100\n    });\n    return queryDatabase();\n});\n\n// Less useful - minimal context\nstartActiveSpan(appInsights, 'query', (scope) => {\n    return queryDatabase();\n});\n```\n\n### 3. Set Appropriate Span Status\n\n```typescript\nstartActiveSpan(appInsights, 'operation', async (scope) => {\n    try {\n        await performWork();\n        scope.span.setStatus({ code: SpanStatusCode.OK });\n    } catch (error) {\n        scope.span.recordException(error);\n        scope.span.setStatus({ \n            code: SpanStatusCode.ERROR,\n            message: error.message \n        });\n        throw error;\n    }\n});\n```\n\n### 4. Use Descriptive Span Names\n\n```typescript\n// Good - clear and descriptive\nstartActiveSpan(appInsights, 'process-payment', (scope) => { });\nstartActiveSpan(appInsights, 'validate-user-credentials', (scope) => { });\nstartActiveSpan(appInsights, 'send-email-notification', (scope) => { });\n\n// Less ideal - vague names\nstartActiveSpan(appInsights, 'process', (scope) => { });\nstartActiveSpan(appInsights, 'validate', (scope) => { });\nstartActiveSpan(appInsights, 'send', (scope) => { });\n```\n\n### 5. Handle Async Operations Properly\n\n```typescript\n// Good - await the result\nconst result = await startActiveSpan(appInsights, 'async-op', async (scope) => {\n    return await doAsyncWork();\n});\n\n// Bad - not awaiting\nstartActiveSpan(appInsights, 'async-op', async (scope) => {\n    return await doAsyncWork();\n}); // Span ends immediately, not when promise settles\n```\n\n### 6. Don't Mutate Span After Callback\n\n```typescript\n// Good - all span operations inside callback\nstartActiveSpan(appInsights, 'operation', (scope) => {\n    scope.span.setAttribute('start', Date.now());\n    const result = doWork();\n    scope.span.setAttribute('end', Date.now());\n    return result;\n});\n\n// Bad - trying to use span after callback\nlet savedSpan;\nstartActiveSpan(appInsights, 'operation', (scope) => {\n    savedSpan = scope.span; // Don't do this\n    return doWork();\n});\n// savedSpan.setAttribute('late', 'value'); // Span already ended!\n```\n\n## Common Patterns\n\n### Pattern 1: Service Layer Wrapper\n\n```typescript\nimport { startActiveSpan } from '@microsoft/applicationinsights-core-js';\nimport { IAppInsightsCore } from '@microsoft/applicationinsights-core-js';\n\nclass ServiceLayer {\n    constructor(private core: IAppInsightsCore) {}\n    \n    async executeWithTracing<T>(\n        operationName: string,\n        operation: () => T | Promise<T>,\n        attributes?: Record<string, any>\n    ): Promise<T> {\n        return startActiveSpan(this.core, operationName, async (scope) => {\n            if (attributes) {\n                scope.span.setAttributes(attributes);\n            }\n            \n            try {\n                const result = await operation();\n                scope.span.setStatus({ code: SpanStatusCode.OK });\n                return result;\n            } catch (error) {\n                scope.span.recordException(error);\n                scope.span.setStatus({ code: SpanStatusCode.ERROR });\n                throw error;\n            }\n        });\n    }\n}\n\n// Usage\nconst service = new ServiceLayer(appInsightsCore);\nawait service.executeWithTracing('fetch-data', async () => {\n    return await fetchData();\n}, { 'data.type': 'users' });\n```\n\n### Pattern 2: Automatic Parent-Child Relationships\n\n```typescript\nasync function parentOperation() {\n    return startActiveSpan(appInsights, 'parent', async (parentScope) => {\n        parentScope.span.setAttribute('level', 'parent');\n        \n        // All child spans automatically have parent as parent\n        await childOperation1();\n        await childOperation2();\n        await childOperation3();\n        \n        return 'complete';\n    });\n}\n\nasync function childOperation1() {\n    return startActiveSpan(appInsights, 'child-1', async (scope) => {\n        // Automatically linked to parent\n        scope.span.setAttribute('level', 'child');\n        await doWork();\n    });\n}\n```\n\n### Pattern 3: Conditional Tracing\n\n```typescript\nimport { ISpanScope } from '@microsoft/applicationinsights-core-js';\n\nfunction maybeTrace<T>(\n    traceHost: ITraceHost,\n    operationName: string,\n    operation: (scope?: ISpanScope) => T,\n    shouldTrace: boolean = true\n): T {\n    if (!shouldTrace) {\n        return operation(undefined);\n    }\n    \n    return startActiveSpan(traceHost, operationName, (scope) => {\n        return operation(scope);\n    });\n}\n\n// Usage\nmaybeTrace(appInsights, 'operation', (scope) => {\n    scope?.span.setAttribute('traced', true);\n    return doWork();\n}, process.env.ENABLE_TRACING === 'true');\n```\n\n### Pattern 4: Batch Operations\n\n```typescript\nasync function processBatch<T>(items: T[], processor: (item: T) => Promise<void>) {\n    return startActiveSpan(appInsights, 'process-batch', async (batchScope) => {\n        batchScope.span.setAttribute('batch.size', items.length);\n        batchScope.span.setAttribute('batch.started', Date.now());\n        \n        let successful = 0;\n        let failed = 0;\n        \n        for (let i = 0; i < items.length; i++) {\n            await startActiveSpan(appInsights, `process-item-${i}`, async (itemScope) => {\n                itemScope.span.setAttribute('item.index', i);\n                \n                try {\n                    await processor(items[i]);\n                    successful++;\n                } catch (error) {\n                    itemScope.span.recordException(error);\n                    itemScope.span.setStatus({ code: SpanStatusCode.ERROR });\n                    failed++;\n                }\n            });\n        }\n        \n        batchScope.span.setAttributes({\n            'batch.completed': Date.now(),\n            'batch.successful': successful,\n            'batch.failed': failed\n        });\n        \n        return { successful, failed };\n    });\n}\n```\n\n## Error Handling\n\n### Automatic Span Ending on Error\n\n`startActiveSpan` guarantees the span is ended even when errors occur:\n\n```typescript\ntry {\n    startActiveSpan(appInsights, 'operation', (scope) => {\n        throw new Error('Something went wrong');\n        // Span is still ended automatically\n    });\n} catch (error) {\n    console.error('Error occurred, but span was ended');\n}\n```\n\n### Recording Exceptions\n\n```typescript\nstartActiveSpan(appInsights, 'risky-operation', (scope) => {\n    try {\n        performRiskyWork();\n        scope.span.setStatus({ code: SpanStatusCode.OK });\n    } catch (error) {\n        scope.span.recordException(error);\n        scope.span.setStatus({ \n            code: SpanStatusCode.ERROR,\n            message: error.message \n        });\n        throw error; // Re-throw if needed\n    }\n});\n```\n\n### Async Error Handling\n\n```typescript\nawait startActiveSpan(appInsights, 'async-operation', async (scope) => {\n    try {\n        const result = await fetchData();\n        scope.span.setStatus({ code: SpanStatusCode.OK });\n        return result;\n    } catch (error) {\n        scope.span.recordException(error);\n        scope.span.setStatus({ code: SpanStatusCode.ERROR });\n        throw error;\n    }\n});\n```\n\n## Advanced Usage\n\n### Custom Start Times\n\n```typescript\nstartActiveSpan(\n    appInsights,\n    'delayed-operation',\n    {\n        startTime: performance.now() - 1000 // Started 1 second ago\n    },\n    (scope) => {\n        scope.span.setAttribute('delayed', true);\n        return processData();\n    }\n);\n```\n\n### Span Links\n\n```typescript\nconst relatedSpanContext = previousSpan.spanContext();\n\nstartActiveSpan(\n    appInsights,\n    'linked-operation',\n    {\n        links: [{\n            context: relatedSpanContext,\n            attributes: { 'link.type': 'related' }\n        }]\n    },\n    (scope) => {\n        scope.span.setAttribute('has.links', true);\n        return doWork();\n    }\n);\n```\n\n### Different Span Kinds\n\n```typescript\n// Client span for outgoing HTTP request\nstartActiveSpan(appInsights, 'http-request',\n    { kind: OTelSpanKind.CLIENT },\n    (scope) => fetch('/api/data')\n);\n\n// Server span for incoming request handling\nstartActiveSpan(appInsights, 'handle-request',\n    { kind: OTelSpanKind.SERVER },\n    (scope) => handleRequest(req)\n);\n\n// Internal span for internal operations\nstartActiveSpan(appInsights, 'process-data',\n    { kind: OTelSpanKind.INTERNAL },\n    (scope) => processData()\n);\n```\n\n## See Also\n\n- [Trace API Documentation](./traceApi.md) - Overview of trace API and helper functions\n- [withSpan Helper](./withSpan.md) - Execute code with existing span as active\n- [useSpan Helper](./useSpan.md) - Execute code with span scope parameter\n- [Examples Guide](./examples.md) - Comprehensive usage examples\n- [Main README](./README.md) - OpenTelemetry compatibility overview\n\n## Related Interfaces\n\n- [`ITraceHost`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html) - Trace host interface (core or AISKU instance)\n- [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) - Scope for restoring active span context\n- [`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html) - Span interface\n- [`IOTelSpanOptions`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelSpanOptions.html) - Options for span creation\n- [`IAppInsightsCore`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IAppInsightsCore.html) - Core instance (implements ITraceHost)\n"
  },
  {
    "path": "docs/OTel/traceApi.md",
    "content": "# Trace API Reference\n\n## Overview\n\nThe [`ITraceApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceApi.html) interface provides the OpenTelemetry Trace API functionality for managing tracers and span contexts. It serves as the primary interface for creating tracers and working with span context utilities. This API closely follows the OpenTelemetry specification while integrating seamlessly with Application Insights.\n\n## Table of Contents\n\n- [Getting the Trace API](#getting-the-trace-api)\n- [Interface Definition](#interface-definition)\n- [Methods](#methods)\n  - [getTracer](#gettracer)\n  - [getActiveSpan](#getactivespan)\n  - [setActiveSpan](#setactivespan)\n  - [wrapSpanContext](#wrapspancontext)\n  - [isSpanContextValid](#isspancontextvalid)\n- [Tracer Interface](#tracer-interface)\n- [Usage Examples](#usage-examples)\n- [Best Practices](#best-practices)\n\n## Getting the Trace API\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING'\n    }\n});\nappInsights.loadAppInsights();\n\n// Get the Trace API\nconst otelApi = appInsights.otelApi;\nconst trace = otelApi.trace;\n\n// Or directly\nconst trace = appInsights.trace;\n```\n\n## Interface Definition\n\n```typescript\nexport interface ITraceApi {\n    /**\n     * Returns a Tracer, creating one if one with the given name and version\n     * if one has not already been created.\n     */\n    getTracer(name: string, version?: string, options?: IOTelTracerOptions): IOTelTracer;\n\n    /**\n     * Wrap the given IDistributedTraceContext in a new non-recording IReadableSpan\n     */\n    wrapSpanContext(spanContext: IDistributedTraceContext): IReadableSpan;\n\n    /**\n     * Returns true if this IDistributedTraceContext is valid.\n     */\n    isSpanContextValid(spanContext: IDistributedTraceContext): boolean;\n\n    /**\n     * Gets the span from the current context, if one exists.\n     */\n    getActiveSpan(): IReadableSpan | undefined | null;\n\n    /**\n     * Set or clear the current active span.\n     */\n    setActiveSpan(span: IReadableSpan | undefined | null): ISpanScope | undefined | null;\n}\n```\n\n## Methods\n\n### getTracer\n\nReturns a tracer instance, creating one if necessary. Tracers are cached by name@version combination.\n\n```typescript\ngetTracer(name: string, version?: string, options?: IOTelTracerOptions): IOTelTracer;\n```\n\n**Parameters:**\n- `name: string` - The name of the tracer or instrumentation library (required)\n- `version?: string` - The version of the tracer or instrumentation library (optional)\n- `options?: IOTelTracerOptions` - Additional configuration options (optional)\n\n**Returns:** [`IOTelTracer`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracer.html) - A tracer instance for creating spans\n\n**Caching Behavior:**\n- Tracers are cached by `name@version` combination\n- Multiple calls with same name/version return the same cached instance\n- Different versions of the same name create separate tracers\n\n**Example:**\n```typescript\nconst trace = otelApi.trace;\n\n// Get a tracer with just a name\nconst tracer1 = trace.getTracer('my-service');\n\n// Get a tracer with name and version (optional)\nconst tracer2 = trace.getTracer('user-service', '2.1.0');\n\n// Get a tracer with options\nconst tracer3 = trace.getTracer('payment-service', '1.5.0', {\n    schemaUrl: 'https://example.com/schema/v1'\n});\n\n// Subsequent call returns cached instance\nconst tracer4 = trace.getTracer('user-service', '2.1.0');\nconsole.log(tracer2 === tracer4); // true\n```\n\n### getActiveSpan\n\nGets the currently active span from the current context, if one exists.\n\n```typescript\ngetActiveSpan(): IReadableSpan | undefined | null;\n```\n\n**Parameters:** None\n\n**Returns:** \n- [`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html) - The currently active span\n- `undefined | null` - If no span is currently active\n\n**Example:**\n```typescript\nconst trace = otelApi.trace;\n\n// Check if there's an active span\nconst activeSpan = trace.getActiveSpan();\nif (activeSpan) {\n    console.log('Active span:', activeSpan.name);\n    console.log('Trace ID:', activeSpan.spanContext().traceId);\n    console.log('Span ID:', activeSpan.spanContext().spanId);\n    \n    // Add attributes to the active span\n    activeSpan.setAttribute('additional.context', 'added to active span');\n} else {\n    console.log('No active span');\n}\n```\n\n**Use Cases:**\n- Check if code is executing within a span context\n- Add attributes to the current span from deeply nested code\n- Retrieve trace context for logging or propagation\n\n### setActiveSpan\n\nSets a span as the active span in the current context, or clears the active span.\n\n```typescript\nsetActiveSpan(span: IReadableSpan | undefined | null): ISpanScope | undefined | null;\n```\n\n**Parameters:**\n- `span: IReadableSpan | undefined | null` - The span to set as active, or null/undefined to clear\n\n**Returns:** \n- [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) - A scope object that can be used to restore the previous active span\n- `undefined | null` - If there is no defined host\n\n**Important:** Always restore the previous context by calling `scope.restore()` when done.\n\n**Example:**\n```typescript\nconst trace = otelApi.trace;\nconst tracer = trace.getTracer('my-service');\n\n// Create a span\nconst span = tracer.startSpan('operation');\n\n// Set it as active\nconst scope = trace.setActiveSpan(span);\n\ntry {\n    // Span is now active - child spans will use it as parent\n    const childSpan = tracer.startSpan('child-operation');\n    childSpan?.end();\n} finally {\n    // Always restore previous context\n    scope?.restore();\n    span.end();\n}\n\n// Clear the active span\ntrace.setActiveSpan(null);\n```\n\n**Advanced Example with Nested Scopes:**\n```typescript\nconst trace = otelApi.trace;\nconst tracer = trace.getTracer('my-service');\n\nconst span1 = tracer.startSpan('operation-1');\nconst scope1 = trace.setActiveSpan(span1);\n\ntry {\n    // span1 is active\n    const span2 = tracer.startSpan('operation-2');\n    const scope2 = trace.setActiveSpan(span2);\n    \n    try {\n        // span2 is active\n        console.log('Active:', trace.getActiveSpan()?.name); // 'operation-2'\n    } finally {\n        scope2?.restore(); // Restore to span1\n        span2.end();\n    }\n    \n    console.log('Active:', trace.getActiveSpan()?.name); // 'operation-1'\n} finally {\n    scope1?.restore(); // Restore to previous (or no active span)\n    span1.end();\n}\n```\n\n### wrapSpanContext\n\nWraps a distributed trace context in a new non-recording span. This is useful for context propagation without creating telemetry.\n\n```typescript\nwrapSpanContext(spanContext: IDistributedTraceContext): IReadableSpan;\n```\n\n**Parameters:**\n- `spanContext: IDistributedTraceContext` - The span context to wrap\n\n**Returns:** [`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html) - A non-recording span with the provided context\n\n**Key Characteristics:**\n- Creates a span that doesn't record telemetry\n- Preserves trace context (trace ID, span ID, trace flags)\n- Useful for propagating existing trace context\n- Can be used as parent for new spans\n\n**Example:**\n```typescript\nconst trace = otelApi.trace;\n\n// Received trace context from external source (e.g., HTTP header)\nconst incomingContext = {\n    traceId: '00000000000000000000000000000001',\n    spanId: '0000000000000001',\n    traceFlags: 1\n};\n\n// Wrap the context in a non-recording span\nconst wrappedSpan = trace.wrapSpanContext(incomingContext);\n\n// Set as active to propagate context\nconst scope = trace.setActiveSpan(wrappedSpan);\n\ntry {\n    // Create child spans that inherit the external trace context\n    const tracer = trace.getTracer('my-service');\n    const childSpan = tracer.startSpan('process-request');\n    \n    // childSpan will have the same traceId and wrappedSpan's spanId as parent\n    console.log('Trace ID:', childSpan?.spanContext().traceId);\n    \n    childSpan?.end();\n} finally {\n    scope?.restore();\n}\n```\n\n**Distributed Tracing Example:**\n```typescript\n// Service A: Extract context from span\nconst span = tracer.startSpan('api-call');\nconst traceContext = span.spanContext();\n\n// Send to Service B (e.g., via HTTP headers)\nconst headers = {\n    'traceparent': `00-${traceContext.traceId}-${traceContext.spanId}-01`\n};\n\n// Service B: Receive and wrap context\nfunction handleIncomingRequest(headers: Record<string, string>) {\n    // Parse traceparent header\n    const traceContext = parseTraceparent(headers['traceparent']);\n    \n    // Wrap in a non-recording span\n    const wrappedSpan = trace.wrapSpanContext(traceContext);\n    \n    // Use as parent for new spans\n    const scope = trace.setActiveSpan(wrappedSpan);\n    try {\n        const childSpan = tracer.startSpan('process-request');\n        // childSpan maintains the distributed trace\n        childSpan?.end();\n    } finally {\n        scope?.restore();\n    }\n}\n```\n\n### isSpanContextValid\n\nValidates whether a span context has valid trace ID and span ID.\n\n```typescript\nisSpanContextValid(spanContext: IDistributedTraceContext): boolean;\n```\n\n**Parameters:**\n- `spanContext: IDistributedTraceContext` - The span context to validate\n\n**Returns:** `boolean` - `true` if the context is valid, `false` otherwise\n\n**Validation Rules:**\n- Trace ID must be valid (non-zero, proper length)\n- Span ID must be valid (non-zero, proper length)\n- Both must exist\n\n**Example:**\n```typescript\nconst trace = otelApi.trace;\n\n// Valid context\nconst validContext = {\n    traceId: '00000000000000000000000000000001',\n    spanId: '0000000000000001',\n    traceFlags: 1\n};\n\nconsole.log(trace.isSpanContextValid(validContext)); // true\n\n// Invalid context (zero trace ID)\nconst invalidContext = {\n    traceId: '00000000000000000000000000000000',\n    spanId: '0000000000000001',\n    traceFlags: 1\n};\n\nconsole.log(trace.isSpanContextValid(invalidContext)); // false\n\n// Practical usage\nfunction propagateContext(context: IDistributedTraceContext) {\n    if (trace.isSpanContextValid(context)) {\n        const wrappedSpan = trace.wrapSpanContext(context);\n        return trace.setActiveSpan(wrappedSpan);\n    } else {\n        console.warn('Invalid trace context, not propagating');\n        return null;\n    }\n}\n```\n\n## Tracer Interface\n\nThe [`IOTelTracer`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracer.html) interface returned by `getTracer()` provides methods for creating spans.\n\n### IOTelTracer Methods\n\n#### startSpan\n\nCreates a new span without setting it as active.\n\n```typescript\nstartSpan(name: string, options?: IOTelSpanOptions): IReadableSpan | null;\n```\n\n**Parameters:**\n- `name: string` - The span name\n- `options?: IOTelSpanOptions` - Configuration options\n\n**Example:**\n```typescript\nconst tracer = trace.getTracer('my-service');\n\nconst span = tracer.startSpan('database-query', {\n    kind: OTelSpanKind.CLIENT,\n    attributes: {\n        'db.system': 'postgresql',\n        'db.operation': 'SELECT'\n    }\n});\n\nif (span) {\n    // Use span\n    span.setAttribute('db.table', 'users');\n    // ... perform operation\n    span.end();\n}\n```\n\n#### startActiveSpan\n\nCreates a span, sets it as active, and executes a callback function. **This is the recommended method for creating spans** as it provides automatic lifecycle and context management.\n\n```typescript\nstartActiveSpan<F extends (span: IReadableSpan, scope?: ISpanScope<ITraceHost>) => ReturnType<F>>(\n    name: string,\n    fn: F\n): ReturnType<F>;\n\nstartActiveSpan<F extends (span: IReadableSpan, scope?: ISpanScope<ITraceHost>) => ReturnType<F>>(\n    name: string,\n    options: IOTelSpanOptions,\n    fn: F\n): ReturnType<F>;\n```\n\n**Parameters:**\n- `name: string` - The span name\n- `options?: IOTelSpanOptions` - Configuration options (optional)\n- `fn: (span: IReadableSpan) => any` - The callback function\n\n**Returns:** The result of the callback function\n\n**Key Features:**\n- Automatically sets the span as active during callback execution\n- Automatically ends the span when callback completes (including async)\n- Properly restores previous active span context\n- Handles errors and ensures cleanup\n\n**Example:**\n```typescript\nconst tracer = trace.getTracer('my-service');\n\n// Simple form\nconst result = tracer.startActiveSpan('operation', (span) => {\n    span.setAttribute('key', 'value');\n    return processData();\n    // Span automatically ended when function returns\n});\n\n// With options\nconst result2 = tracer.startActiveSpan('api-call', \n    { \n        kind: OTelSpanKind.CLIENT,\n        attributes: { 'http.method': 'GET' }\n    },\n    async (span) => {\n        const response = await fetch('/api/data');\n        span.setAttribute('http.status_code', response.status);\n        return response.json();\n    }\n);\n```\n\n**See [startActiveSpan documentation](./startActiveSpan.md) for comprehensive usage guide.**\n\n## Usage Examples\n\n### Example 1: Basic Tracer Usage\n\n```typescript\nconst trace = otelApi.trace;\n\n// Get a tracer\nconst tracer = trace.getTracer('user-service');\n\n// Create a simple span\nconst span = tracer.startSpan('authenticate-user');\nif (span) {\n    span.setAttribute('user.id', '12345');\n    \n    try {\n        // Perform authentication\n        const user = await authenticateUser();\n        span.setAttribute('auth.success', true);\n        span.setStatus({ code: SpanStatusCode.OK });\n    } catch (error) {\n        span.recordException(error);\n        span.setStatus({ \n            code: SpanStatusCode.ERROR,\n            message: error.message \n        });\n    } finally {\n        span.end();\n    }\n}\n```\n\n### Example 2: Multiple Tracers\n\n```typescript\nconst trace = otelApi.trace;\n\n// Create tracers for different services\nconst userTracer = trace.getTracer('user-service');\nconst paymentTracer = trace.getTracer('payment-service');\nconst notificationTracer = trace.getTracer('notification-service');\n\n// Use appropriate tracer for each operation\nfunction handleCheckout(userId: string, amount: number) {\n    // User service operation\n    const userSpan = userTracer.startSpan('validate-user');\n    userSpan?.setAttribute('user.id', userId);\n    userSpan?.end();\n    \n    // Payment service operation\n    const paymentSpan = paymentTracer.startSpan('process-payment');\n    paymentSpan?.setAttribute('payment.amount', amount);\n    paymentSpan?.end();\n    \n    // Notification service operation\n    const notifySpan = notificationTracer.startSpan('send-receipt');\n    notifySpan?.setAttribute('notification.type', 'email');\n    notifySpan?.end();\n}\n```\n\n### Example 3: Active Span Management\n\n```typescript\nconst trace = otelApi.trace;\nconst tracer = trace.getTracer('my-app');\n\n// Create parent span\nconst parentSpan = tracer.startSpan('parent-operation');\nconst scope = trace.setActiveSpan(parentSpan);\n\ntry {\n    // Child spans automatically use parent\n    const child1 = tracer.startSpan('child-1');\n    child1?.setAttribute('order', 1);\n    child1?.end();\n    \n    const child2 = tracer.startSpan('child-2');\n    child2?.setAttribute('order', 2);\n    child2?.end();\n    \n    // Check active span\n    const active = trace.getActiveSpan();\n    console.log('Active span:', active?.name); // 'parent-operation'\n    \n} finally {\n    scope?.restore();\n    parentSpan?.end();\n}\n```\n\n### Example 4: Context Propagation\n\n```typescript\nconst trace = otelApi.trace;\n\n// Extract context from current span\nfunction getCurrentTraceContext(): IDistributedTraceContext | null {\n    const activeSpan = trace.getActiveSpan();\n    return activeSpan ? activeSpan.spanContext() : null;\n}\n\n// Propagate context to async operation\nasync function performAsyncWork(context: IDistributedTraceContext | null) {\n    if (context && trace.isSpanContextValid(context)) {\n        // Wrap and set as active\n        const wrappedSpan = trace.wrapSpanContext(context);\n        const scope = trace.setActiveSpan(wrappedSpan);\n        \n        try {\n            // Create child span with inherited context\n            const tracer = trace.getTracer('async-worker');\n            const span = tracer.startSpan('async-operation');\n            \n            // Work maintains trace context\n            await doAsyncWork();\n            \n            span?.end();\n        } finally {\n            scope?.restore();\n        }\n    }\n}\n\n// Usage\nconst context = getCurrentTraceContext();\nsetTimeout(() => performAsyncWork(context), 1000);\n```\n\n### Example 5: Using startActiveSpan\n\n```typescript\nconst trace = otelApi.trace;\nconst tracer = trace.getTracer('my-service');\n\n// Automatic span lifecycle management\nasync function processOrder(orderId: string) {\n    return tracer.startActiveSpan('process-order', async (span) => {\n        span.setAttribute('order.id', orderId);\n        \n        // All nested operations inherit this span context\n        const items = await fetchOrderItems(orderId);\n        span.setAttribute('order.items', items.length);\n        \n        const total = await calculateTotal(items);\n        span.setAttribute('order.total', total);\n        \n        return { orderId, items, total };\n        // Span automatically ended when function returns\n    });\n}\n\n// Nested startActiveSpan calls\nfunction nestedOperations() {\n    return tracer.startActiveSpan('parent', (parentSpan) => {\n        parentSpan.setAttribute('level', 1);\n        \n        return tracer.startActiveSpan('child', (childSpan) => {\n            childSpan.setAttribute('level', 2);\n            \n            // childSpan automatically has parentSpan as parent\n            console.log('Parent trace ID:', parentSpan.spanContext().traceId);\n            console.log('Child trace ID:', childSpan.spanContext().traceId);\n            // Both have the same trace ID\n            \n            return 'result';\n        });\n    });\n}\n```\n\n### Example 6: Conditional Tracing\n\n```typescript\nconst trace = otelApi.trace;\nconst tracer = trace.getTracer('my-service');\n\nfunction conditionalTrace(operation: string, enabled: boolean) {\n    if (!enabled) {\n        // Perform operation without tracing\n        return performOperation(operation);\n    }\n    \n    // Trace the operation\n    return tracer.startActiveSpan(operation, (span) => {\n        span.setAttribute('traced', true);\n        return performOperation(operation);\n    });\n}\n\n// Check if currently being traced\nfunction isCurrentlyTraced(): boolean {\n    return trace.getActiveSpan() !== null;\n}\n\n// Conditionally add details\nfunction addTraceDetails(key: string, value: any) {\n    const activeSpan = trace.getActiveSpan();\n    if (activeSpan) {\n        activeSpan.setAttribute(key, value);\n    }\n}\n\n// Usage\naddTraceDetails('user.action', 'clicked-button');\n```\n\n## Best Practices\n\n### 1. Prefer Direct startSpan from AISKU\n\n**Recommended approach for simple cases:**\n```typescript\n// Direct startSpan from AISKU - simplest for most use cases\nappInsights.startSpan('operation-name', (span) => {\n    span.setAttribute('key', 'value');\n    // operation code\n});\n```\n\n**Use getTracer for service organization:**\n```typescript\n// Only needed when organizing multiple services/components\nconst tracer = otelApi.trace.getTracer('user-service');\ntracer.startActiveSpan('authenticate', (span) => {\n    // ...\n});\n```\n\n**Note:** For new code, prefer using `startActiveSpan` over manual `startSpan` + lifecycle management.\n\n### 2. Cache Tracer Instances\n\n```typescript\n// Good - cache tracers\nclass UserService {\n    private tracer = otelApi.trace.getTracer('user-service');\n    \n    async authenticate(userId: string) {\n        return this.tracer.startActiveSpan('authenticate', async (span) => {\n            span.setAttribute('user.id', userId);\n            // ...\n        });\n    }\n}\n\n// Less efficient - create tracer each time\nfunction authenticate(userId: string) {\n    const tracer = otelApi.trace.getTracer('user-service');\n    // ...\n}\n```\n\n### 3. Always Restore Context\n\n```typescript\n// Good - always restore\nconst scope = trace.setActiveSpan(span);\ntry {\n    // ... operations\n} finally {\n    scope?.restore();\n    span.end();\n}\n\n// Bad - forgetting to restore can leak context\nconst scope = trace.setActiveSpan(span);\n// ... operations\nspan.end(); // Forgot to restore!\n```\n\n### 4. Prefer startActiveSpan\n\n```typescript\n// Recommended - automatic lifecycle\ntracer.startActiveSpan('operation', (span) => {\n    span.setAttribute('key', 'value');\n    return doWork();\n});\n\n// Manual - requires careful management\nconst span = tracer.startSpan('operation');\nconst scope = trace.setActiveSpan(span);\ntry {\n    span.setAttribute('key', 'value');\n    return doWork();\n} finally {\n    scope?.restore();\n    span.end();\n}\n```\n\n### 5. Validate External Context\n\n```typescript\n// Good - validate before using\nfunction handleExternalContext(context: any) {\n    if (trace.isSpanContextValid(context)) {\n        const span = trace.wrapSpanContext(context);\n        // Use span\n    } else {\n        console.warn('Invalid trace context received');\n    }\n}\n\n// Bad - assume context is valid\nfunction handleExternalContext(context: any) {\n    const span = trace.wrapSpanContext(context); // May fail!\n}\n```\n\n### 5. Use Meaningful Tracer Names\n\n```typescript\n// Good - descriptive names\nconst authTracer = trace.getTracer('auth-service');\nconst dbTracer = trace.getTracer('database-layer');\nconst apiTracer = trace.getTracer('api-client');\n\n// Less useful - generic names\nconst tracer1 = trace.getTracer('tracer');\nconst tracer2 = trace.getTracer('app');\n```\n\n### 6. Check for Active Span Before Adding Attributes\n\n```typescript\n// Safe - check before using\nfunction addContextInfo(key: string, value: any) {\n    const activeSpan = trace.getActiveSpan();\n    if (activeSpan) {\n        activeSpan.setAttribute(key, value);\n    }\n}\n\n// Works but creates unnecessary span\nfunction addContextInfo(key: string, value: any) {\n    const span = tracer.startSpan('temp');\n    span?.setAttribute(key, value);\n    span?.end(); // Creates telemetry unnecessarily\n}\n```\n\n## See Also\n\n- [startActiveSpan Documentation](./startActiveSpan.md) - Comprehensive guide to the recommended span creation method\n- [OTel API Documentation](./otelApi.md) - Main OpenTelemetry API interface\n- [withSpan Helper](./withSpan.md) - Executing code with active span context\n- [useSpan Helper](./useSpan.md) - Executing code with span scope parameter\n- [Examples Guide](./examples.md) - Comprehensive usage examples\n- [Main README](./README.md) - OpenTelemetry compatibility overview\n\n## Related Interfaces\n\n- [`ITraceApi`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceApi.html) - Trace API interface\n- [`IOTelTracer`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelTracer.html) - Tracer interface for creating spans\n- [`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html) - Span interface\n- [`IOTelSpanOptions`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IOTelSpanOptions.html) - Options for span creation\n- [`IDistributedTraceContext`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html) - Distributed trace context\n- [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) - Scope for restoring active span context\n"
  },
  {
    "path": "docs/OTel/useSpan.md",
    "content": "# useSpan Helper Function\n\n## Overview\n\nThe `useSpan` helper function is similar to `withSpan` but provides the [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) object as the first parameter to your callback function. This allows you to manually manage span context restoration or access scope properties when needed. It automatically manages span activation and ensures proper context restoration after execution completes.\n\n## Table of Contents\n\n- [Function Signature](#function-signature)\n- [Parameters](#parameters)\n- [Return Value](#return-value)\n- [Key Features](#key-features)\n- [Comparison with withSpan](#comparison-with-withspan)\n- [Usage Examples](#usage-examples)\n- [Best Practices](#best-practices)\n- [Common Patterns](#common-patterns)\n- [Error Handling](#error-handling)\n\n## Function Signature\n\n```typescript\nfunction useSpan<T extends ITraceHost, A extends unknown[], F extends (this: ThisParameterType<F> | ISpanScope<T>, scope: ISpanScope<T>, ...args: A) => ReturnType<F>>(\n    traceHost: T,\n    span: IReadableSpan,\n    fn: F,\n    thisArg?: ThisParameterType<F>,\n    ..._args: A\n): ReturnType<F>;\n```\n\n## Parameters\n\n### traceHost: ITraceHost\n\nThe trace host instance that manages span contexts. Typically, this is your `AppInsightsCore` instance or the AISKU instance.\n\n**Type:** [`ITraceHost`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html)\n\n**Example:**\n```typescript\nconst core = new AppInsightsCore();\n// or\nconst appInsights = new ApplicationInsights({ ... });\n```\n\n### span: IReadableSpan\n\nThe span to set as the active span during the execution of the callback function.\n\n**Type:** [`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html)\n\n**Example:**\n```typescript\nconst tracer = otelApi.trace.getTracer('my-service');\nconst span = tracer.startSpan('operation-name');\n```\n\n### fn: Function\n\nThe callback function to execute with the span as the active context. The function receives the [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) as its first parameter, followed by any additional arguments.\n\n**Signature:**\n```typescript\n(this: ThisParameterType<F> | ISpanScope<T>, scope: ISpanScope<T>, ...args: A) => ReturnType<F>\n```\n\n### thisArg?: any (optional)\n\nThe `this` context for the callback function. If not provided, the [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) instance is used as `this`.\n\n### ..._args: any[] (optional)\n\nAdditional arguments to pass to the callback function (after the scope parameter).\n\n## Return Value\n\nReturns the result of executing the callback function. The return type matches the callback function's return type.\n\n**For synchronous functions:**\n```typescript\nconst result: number = useSpan(core, span, (scope) => {\n    return 42;\n});\n```\n\n**For asynchronous functions:**\n```typescript\nconst result: Promise<string> = useSpan(core, span, async (scope) => {\n    return await fetchData();\n});\n```\n\n## Key Features\n\n### 1. Scope Parameter Access\n\nThe callback receives an `ISpanScope` object as its first parameter, providing access to:\n- `restore()` - Method to manually restore the previous active span\n- The trace host instance (depending on implementation)\n\n```typescript\nuseSpan(core, span, (scope) => {\n    // Access the scope\n    console.log('Scope available:', scope);\n    \n    // Can manually restore if needed\n    // scope.restore();\n});\n```\n\n### 2. Automatic Span Context Management\n\nSets the span as active during execution and restores the previous active span afterward (unless manually restored).\n\n```typescript\nuseSpan(core, span, (scope) => {\n    // span is active here\n    console.log(core.getActiveSpan() === span); // true\n});\n// Previous active span is restored here\n```\n\n### 3. Manual Context Control\n\nUnlike `withSpan`, you can manually restore the context within your callback if needed.\n\n```typescript\nuseSpan(core, span, (scope) => {\n    // Do some work with span active\n    doWork();\n    \n    // Manually restore early if needed\n    scope.restore();\n    \n    // Continue with previous context\n    doMoreWork();\n});\n```\n\n### 4. Exception Safety\n\nEnsures the previous active span is restored even if the callback throws an error.\n\n### 5. Async Support\n\nAutomatically handles both synchronous and asynchronous callbacks, including Promise-based functions.\n\n## Comparison with withSpan\n\nThe main difference between `useSpan` and `withSpan` is how they pass parameters to the callback function.\n\n### withSpan\n\nDoes NOT pass the scope to the callback:\n\n```typescript\nwithSpan(core, span, (arg1, arg2) => {\n    // arg1 and arg2 are your custom arguments\n    // No access to scope\n    console.log(arg1, arg2);\n}, null, 'value1', 'value2');\n```\n\n### useSpan\n\nPasses the scope as the FIRST parameter:\n\n```typescript\nuseSpan(core, span, (scope, arg1, arg2) => {\n    // scope is the ISpanScope object\n    // arg1 and arg2 are your custom arguments\n    console.log(scope, arg1, arg2);\n    \n    // Can manually restore\n    scope.restore();\n}, null, 'value1', 'value2');\n```\n\n**When to use which:**\n\n| Use `withSpan` | Use `useSpan` |\n|----------------|---------------|\n| Don't need scope access | Need to manually restore context |\n| Simple callback execution | Need scope for advanced scenarios |\n| Most common scenarios | Complex context management |\n| Cleaner callback signature | Need explicit control |\n\n## Usage Examples\n\n### Example 1: Basic Usage\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { useSpan } from '@microsoft/applicationinsights-core-js';\n\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING'\n    }\n});\nappInsights.loadAppInsights();\n\nconst tracer = appInsights.trace.getTracer('my-service');\n\n// Create a span\nconst span = tracer.startSpan('operation');\n\n// Execute code with span as active context\nconst result = useSpan(appInsights, span, (scope) => {\n    span.setAttribute('step', 'processing');\n    \n    // Perform work - span is active during execution\n    const data = processData();\n    \n    span.setAttribute('result', 'success');\n    return data;\n});\n\nspan.end();\n```\n\n### Example 2: Manual Context Restoration\n\n```typescript\nconst span = tracer.startSpan('complex-operation');\n\nuseSpan(appInsights, span, (scope) => {\n    span.setAttribute('phase', 'with-context');\n    \n    // Do work with span active\n    performWorkWithContext();\n    \n    // Manually restore context early\n    scope.restore();\n    \n    span.setAttribute('phase', 'without-context');\n    \n    // Continue work with previous context\n    performWorkWithoutContext();\n});\n\nspan.end();\n```\n\n### Example 3: Conditional Context Restoration\n\n```typescript\nconst span = tracer.startSpan('conditional-context');\n\nuseSpan(core, span, (scope, shouldRestoreEarly) => {\n    span.setAttribute('processing', true);\n    \n    doInitialWork();\n    \n    if (shouldRestoreEarly) {\n        console.log('Restoring context early');\n        scope.restore();\n    }\n    \n    // If restored early, runs with previous context\n    // Otherwise, runs with span context\n    doAdditionalWork();\n}, null, true); // Pass shouldRestoreEarly = true\n\nspan.end();\n```\n\n### Example 4: Async Operations\n\n```typescript\nconst span = tracer.startSpan('async-operation');\n\nconst result = await useSpan(core, span, async (scope) => {\n    span.setAttribute('started', Date.now());\n    \n    // Async work\n    const response = await fetch('/api/data');\n    const data = await response.json();\n    \n    span.setAttribute('completed', Date.now());\n    span.setAttribute('items', data.length);\n    \n    return data;\n});\n\nspan.end();\nconsole.log('Result:', result);\n```\n\n### Example 5: Accessing Scope Properties\n\n```typescript\nconst span = tracer.startSpan('scope-access');\n\nuseSpan(core, span, (scope) => {\n    // Access scope properties\n    console.log('Scope type:', typeof scope);\n    console.log('Has restore method:', typeof scope.restore === 'function');\n    \n    // Perform work\n    span.setAttribute('scope.available', true);\n    \n    // Demonstrate manual restore\n    const shouldRestoreNow = checkCondition();\n    if (shouldRestoreNow) {\n        scope.restore();\n    }\n});\n\nspan.end();\n```\n\n### Example 6: Passing Additional Arguments\n\n```typescript\nfunction processWithContext(\n    scope: ISpanScope,\n    userId: string,\n    action: string\n): string {\n    console.log('Scope:', scope);\n    return `User ${userId} performed ${action}`;\n}\n\nconst span = tracer.startSpan('user-action');\n\n// Pass additional arguments to callback\nconst result = useSpan(\n    core,\n    span,\n    processWithContext,\n    null, // thisArg\n    'user123', // userId\n    'checkout' // action\n);\n\nspan.end();\nconsole.log(result); // 'User user123 performed checkout'\n```\n\n### Example 7: Error Handling with Manual Restoration\n\n```typescript\nconst span = tracer.startSpan('error-handling');\n\ntry {\n    useSpan(core, span, (scope) => {\n        span.setAttribute('attempting', true);\n        \n        try {\n            performRiskyOperation();\n            span.setStatus({ code: SpanStatusCode.OK });\n        } catch (error) {\n            // Record error and restore context before handling\n            span.recordException(error);\n            span.setStatus({ code: SpanStatusCode.ERROR });\n            \n            // Restore context before error propagates\n            scope.restore();\n            \n            throw error;\n        }\n    });\n} catch (error) {\n    // Context already restored\n    console.error('Operation failed:', error);\n} finally {\n    span.end();\n}\n```\n\n### Example 8: Nested Spans with Manual Control\n\n```typescript\nconst parentSpan = tracer.startSpan('parent-operation');\n\nuseSpan(core, parentSpan, (parentScope) => {\n    parentSpan.setAttribute('level', 1);\n    \n    // Create child span\n    const childSpan = tracer.startSpan('child-operation');\n    \n    useSpan(core, childSpan, (childScope) => {\n        childSpan.setAttribute('level', 2);\n        \n        // Access both scopes\n        console.log('Parent scope:', parentScope);\n        console.log('Child scope:', childScope);\n        \n        // Perform work\n        doNestedWork();\n        \n        // Could manually restore child scope if needed\n        // childScope.restore();\n    });\n    \n    childSpan.end();\n    \n    // Parent scope is still active here\n    console.log('Back to parent context');\n});\n\nparentSpan.end();\n```\n\n### Example 9: Complex Async Flow\n\n```typescript\nconst span = tracer.startSpan('complex-async');\n\nawait useSpan(core, span, async (scope) => {\n    span.setAttribute('stage', 'initial');\n    \n    // Phase 1: With span context\n    await performPhase1();\n    \n    // Conditionally restore based on async result\n    const shouldContinueWithContext = await checkContinuation();\n    \n    if (!shouldContinueWithContext) {\n        scope.restore();\n        span.setAttribute('context.restored.early', true);\n    }\n    \n    // Phase 2: Might be with or without context\n    await performPhase2();\n    \n    span.setAttribute('stage', 'completed');\n});\n\nspan.end();\n```\n\n### Example 10: Scope Inspection\n\n```typescript\nconst span = tracer.startSpan('scope-inspection');\n\nuseSpan(core, span, (scope) => {\n    // Inspect scope\n    console.log('Scope available:', !!scope);\n    console.log('Scope has restore:', 'restore' in scope);\n    \n    // Log current state\n    const currentSpan = core.getActiveSpan();\n    console.log('Current span matches:', currentSpan === span);\n    \n    // Perform work\n    doWork();\n    \n    // Demonstrate restoration\n    console.log('Before restore - active span:', core.getActiveSpan()?.name);\n    scope.restore();\n    console.log('After restore - active span:', core.getActiveSpan()?.name);\n});\n\nspan.end();\n```\n\n## Best Practices\n\n### 1. Only Use useSpan When You Need the Scope\n\n```typescript\n// Good - need scope for manual restore\nuseSpan(core, span, (scope) => {\n    doWork();\n    if (needsEarlyRestore()) {\n        scope.restore();\n    }\n    doMoreWork();\n});\n\n// Better - use withSpan if scope not needed\nwithSpan(core, span, () => {\n    doWork();\n    doMoreWork();\n});\n```\n\n### 2. Be Careful with Manual Restoration\n\n```typescript\n// Good - restore at the right time\nuseSpan(core, span, (scope) => {\n    doWorkNeedingContext();\n    scope.restore();\n    doWorkNotNeedingContext();\n});\n\n// Bad - restoring too early\nuseSpan(core, span, (scope) => {\n    scope.restore(); // Too early!\n    doWorkNeedingContext(); // Context already gone\n});\n```\n\n### 3. Don't Restore Multiple Times\n\n```typescript\n// Good - restore once\nuseSpan(core, span, (scope) => {\n    doWork();\n    scope.restore();\n});\n\n// Bad - multiple restores\nuseSpan(core, span, (scope) => {\n    scope.restore();\n    // ... more code ...\n    scope.restore(); // Second restore - unexpected behavior!\n});\n```\n\n### 4. Always End Spans\n\n```typescript\n// Good - span is ended\nconst span = tracer.startSpan('operation');\ntry {\n    useSpan(core, span, (scope) => {\n        // Work\n    });\n} finally {\n    span.end();\n}\n\n// Bad - span is never ended\nconst span = tracer.startSpan('operation');\nuseSpan(core, span, (scope) => {\n    // Work\n}); // Forgot to end span!\n```\n\n### 5. Use with startSpan, Not startActiveSpan\n\n```typescript\n// Good - use useSpan with startSpan\nconst span = tracer.startSpan('operation');\nuseSpan(core, span, (scope) => {\n    // Work\n});\nspan.end();\n\n// Redundant - startActiveSpan already manages context\ntracer.startActiveSpan('operation', (span) => {\n    // No need for useSpan here\n});\n```\n\n### 6. Handle Async Carefully\n\n```typescript\n// Good - proper async handling\nconst span = tracer.startSpan('async-op');\ntry {\n    await useSpan(core, span, async (scope) => {\n        await doAsyncWork();\n    });\n} finally {\n    span.end();\n}\n\n// Bad - not awaiting\nconst span = tracer.startSpan('async-op');\nuseSpan(core, span, async (scope) => {\n    await doAsyncWork();\n}); // Not awaited!\nspan.end(); // Ends before async work completes\n```\n\n## Common Patterns\n\n### Pattern 1: Conditional Context Management\n\n```typescript\nfunction executeWithOptionalContext<T>(\n    span: IReadableSpan,\n    fn: () => T,\n    keepContextActive: boolean\n): T {\n    return useSpan(core, span, (scope) => {\n        const result = fn();\n        \n        if (!keepContextActive) {\n            scope.restore();\n        }\n        \n        return result;\n    });\n}\n\n// Usage\nexecuteWithOptionalContext(span, doWork, false); // Restores context\nexecuteWithOptionalContext(span, doWork, true);  // Keeps context\n```\n\n### Pattern 2: Scope-Aware Wrapper\n\n```typescript\nfunction withManagedScope<T>(\n    operationName: string,\n    fn: (scope: ISpanScope) => T\n): T {\n    const span = tracer.startSpan(operationName);\n    try {\n        return useSpan(core, span, fn);\n    } finally {\n        span.end();\n    }\n}\n\n// Usage\nwithManagedScope('my-operation', (scope) => {\n    console.log('Have scope:', scope);\n    // Can manually restore if needed\n    return performWork();\n});\n```\n\n### Pattern 3: Early Exit with Restoration\n\n```typescript\nfunction processWithEarlyExit(data: any): any {\n    const span = tracer.startSpan('process');\n    \n    return useSpan(core, span, (scope) => {\n        if (!validateData(data)) {\n            scope.restore();\n            span.end();\n            return null; // Early exit\n        }\n        \n        const result = processData(data);\n        span.end();\n        return result;\n    });\n}\n```\n\n### Pattern 4: Scope Delegation\n\n```typescript\nfunction delegateWithScope<T>(\n    span: IReadableSpan,\n    operation: (restore: () => void) => T\n): T {\n    return useSpan(core, span, (scope) => {\n        // Delegate restore capability to the operation\n        return operation(() => scope.restore());\n    });\n}\n\n// Usage\ndelegateWithScope(span, (restore) => {\n    doWork();\n    \n    if (shouldStop()) {\n        restore(); // Operation controls restoration\n        return null;\n    }\n    \n    return continueWork();\n});\n```\n\n## Error Handling\n\n### Automatic Context Restoration on Error\n\n`useSpan` guarantees context restoration even when errors occur:\n\n```typescript\nconst previousSpan = core.getActiveSpan();\nconst span = tracer.startSpan('operation');\n\ntry {\n    useSpan(core, span, (scope) => {\n        throw new Error('Operation failed');\n    });\n} catch (error) {\n    // Context is restored to previousSpan\n    console.log(core.getActiveSpan() === previousSpan); // true\n} finally {\n    span.end();\n}\n```\n\n### Manual Restoration Before Error\n\n```typescript\nconst span = tracer.startSpan('operation');\n\ntry {\n    useSpan(core, span, (scope) => {\n        try {\n            performRiskyOperation();\n        } catch (error) {\n            // Restore context before handling error\n            scope.restore();\n            \n            span.recordException(error);\n            span.setStatus({ code: SpanStatusCode.ERROR });\n            \n            throw error;\n        }\n    });\n} catch (error) {\n    console.error('Handled:', error);\n} finally {\n    span.end();\n}\n```\n\n### Async Error Handling\n\n```typescript\nconst span = tracer.startSpan('async-operation');\n\ntry {\n    await useSpan(core, span, async (scope) => {\n        try {\n            const result = await fetch('/api/data');\n            if (!result.ok) {\n                throw new Error(`HTTP ${result.status}`);\n            }\n            return result.json();\n        } catch (error) {\n            // Can restore before re-throwing if needed\n            scope.restore();\n            span.recordException(error);\n            throw error;\n        }\n    });\n} catch (error) {\n    console.error('Request failed:', error);\n} finally {\n    span.end();\n}\n```\n\n### Scope State After Restoration\n\n```typescript\nconst span = tracer.startSpan('state-check');\n\nuseSpan(core, span, (scope) => {\n    console.log('Before restore:', core.getActiveSpan() === span); // true\n    \n    scope.restore();\n    \n    console.log('After restore:', core.getActiveSpan() === span); // false\n    \n    // Calling restore again has no effect (already restored)\n    scope.restore();\n});\n\nspan.end();\n```\n\n## ISpanScope Interface\n\nThe `ISpanScope` interface provides methods and properties for managing span context:\n\n```typescript\ninterface ISpanScope<T extends ITraceHost = ITraceHost> {\n    /**\n     * Restore the previous active span context\n     */\n    restore(): void;\n    \n    // Additional properties may be available depending on implementation\n}\n```\n\n### Using the Scope\n\n```typescript\nuseSpan(core, span, (scope) => {\n    // Check if scope has restore method\n    if (typeof scope.restore === 'function') {\n        // Perform work\n        doWork();\n        \n        // Restore when needed\n        scope.restore();\n    }\n});\n```\n\n## See Also\n\n- [withSpan Helper](./withSpan.md) - Similar helper without scope parameter\n- [Trace API Documentation](./traceApi.md) - Tracer and span management\n- [OTel API Documentation](./otelApi.md) - Main OpenTelemetry API\n- [Examples Guide](./examples.md) - Comprehensive usage examples\n- [Main README](./README.md) - OpenTelemetry compatibility overview\n\n## Related Types\n\n- `ITraceHost` - Host interface for span management\n- `IReadableSpan` - Span interface\n- `ISpanScope` - Scope for restoring active span context\n- `IOTelTracer` - Tracer interface for creating spans\n"
  },
  {
    "path": "docs/OTel/withSpan.md",
    "content": "# withSpan Helper Function\n\n## Overview\n\nThe `withSpan` helper function provides a convenient way to execute code within the context of an active span. It automatically manages span activation and restoration, ensuring that the previous active span context is properly restored after execution completes, even if an error occurs.\n\n## Table of Contents\n\n- [Function Signature](#function-signature)\n- [Parameters](#parameters)\n- [Return Value](#return-value)\n- [Key Features](#key-features)\n- [Usage Examples](#usage-examples)\n- [Comparison with useSpan](#comparison-with-usespan)\n- [Best Practices](#best-practices)\n- [Common Patterns](#common-patterns)\n- [Error Handling](#error-handling)\n\n## Function Signature\n\n```typescript\nfunction withSpan<T extends ITraceHost, A extends unknown[], F extends (this: ThisParameterType<F> | ISpanScope<T>, ...args: A) => ReturnType<F>>(\n    traceHost: T,\n    span: IReadableSpan,\n    fn: F,\n    thisArg?: ThisParameterType<F>,\n    ..._args: A\n): ReturnType<F>;\n```\n\n## Parameters\n\n### traceHost: ITraceHost\n\nThe trace host instance that manages span contexts. Typically, this is your `AppInsightsCore` instance or the AISKU instance.\n\n**Type:** [`ITraceHost`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html)\n\n**Example:**\n```typescript\nconst core = new AppInsightsCore();\n// or\nconst appInsights = new ApplicationInsights({ ... });\n```\n\n### span: IReadableSpan\n\nThe span to set as the active span during the execution of the callback function.\n\n**Type:** [`IReadableSpan`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IReadableSpan.html)\n\n**Example:**\n```typescript\nconst tracer = otelApi.trace.getTracer('my-service');\nconst span = tracer.startSpan('operation-name');\n```\n\n### fn: Function\n\nThe callback function to execute with the span as the active context. The function receives any additional arguments passed to `withSpan`.\n\n**Signature:**\n```typescript\n(this: ThisParameterType<F> | ISpanScope<T>, ...args: A) => ReturnType<F>\n```\n\n### thisArg?: any (optional)\n\nThe `this` context for the callback function. If not provided, the [`ISpanScope`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ISpanScope.html) instance is used as `this`.\n\n### ..._args: any[] (optional)\n\nAdditional arguments to pass to the callback function.\n\n## Return Value\n\nReturns the result of executing the callback function. The return type matches the callback function's return type.\n\n**For synchronous functions:**\n```typescript\nconst result: number = withSpan(core, span, () => {\n    return 42;\n});\n```\n\n**For asynchronous functions:**\n```typescript\nconst result: Promise<string> = withSpan(core, span, async () => {\n    return await fetchData();\n});\n```\n\n## Key Features\n\n### 1. Automatic Span Context Management\n\nSets the span as active during execution and restores the previous active span afterward.\n\n```typescript\nwithSpan(core, span, () => {\n    // span is active here\n    console.log(core.getActiveSpan() === span); // true\n});\n// Previous active span is restored here\n```\n\n### 2. Context Restoration\n\nEnsures the previous active span is restored even if the callback throws an error.\n\n```typescript\nconst previousSpan = core.getActiveSpan();\n\ntry {\n    withSpan(core, span, () => {\n        throw new Error('Something went wrong');\n    });\n} catch (error) {\n    // Previous span is still restored\n    console.log(core.getActiveSpan() === previousSpan); // true\n}\n```\n\n### 3. Exception Safety\n\nUses try-finally blocks internally to guarantee context restoration.\n\n### 4. Async Support\n\nAutomatically handles both synchronous and asynchronous callbacks, including Promise-based functions.\n\n```typescript\n// Async callback\nawait withSpan(core, span, async () => {\n    await doAsyncWork();\n    // Context restored after promise settles\n});\n```\n\n### 5. Nested Span Support\n\nHandles complex span hierarchies automatically through proper context stacking.\n\n```typescript\nwithSpan(core, parentSpan, () => {\n    // parentSpan is active\n    \n    withSpan(core, childSpan, () => {\n        // childSpan is active\n    });\n    \n    // parentSpan is active again\n});\n```\n\n## Usage Examples\n\n### Example 1: Basic Usage\n\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { withSpan } from '@microsoft/applicationinsights-core-js';\n\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'YOUR_CONNECTION_STRING'\n    }\n});\nappInsights.loadAppInsights();\n\nconst tracer = appInsights.trace.getTracer('my-service');\n\n// Create a span\nconst span = tracer.startSpan('operation');\n\n// Execute code with span as active context\nconst result = withSpan(appInsights, span, () => {\n    span.setAttribute('step', 'processing');\n    \n    // Perform work - span is active during execution\n    const data = processData();\n    \n    span.setAttribute('result', 'success');\n    return data;\n});\n\nspan.end();\n```\n\n### Example 2: Async Operations\n\n```typescript\nconst span = tracer.startSpan('async-operation');\n\nconst result = await withSpan(appInsights, span, async () => {\n    span.setAttribute('started', Date.now());\n    \n    // Async work\n    const response = await fetch('/api/data');\n    const data = await response.json();\n    \n    span.setAttribute('completed', Date.now());\n    span.setAttribute('items', data.length);\n    \n    return data;\n});\n\nspan.end();\nconsole.log('Result:', result);\n```\n\n### Example 3: Nested Spans\n\n```typescript\nconst parentSpan = tracer.startSpan('parent-operation');\n\nwithSpan(core, parentSpan, () => {\n    parentSpan.setAttribute('level', 1);\n    \n    // Create child span\n    const childSpan = tracer.startSpan('child-operation');\n    \n    withSpan(core, childSpan, () => {\n        childSpan.setAttribute('level', 2);\n        \n        // childSpan automatically has parentSpan as parent\n        console.log('Parent ID:', parentSpan.spanContext().spanId);\n        console.log('Child parent ID:', childSpan.spanContext().spanId);\n    });\n    \n    childSpan.end();\n});\n\nparentSpan.end();\n```\n\n### Example 4: Passing Additional Arguments\n\n```typescript\nfunction processWithContext(userId: string, action: string): string {\n    return `User ${userId} performed ${action}`;\n}\n\nconst span = tracer.startSpan('user-action');\n\n// Pass additional arguments to callback\nconst result = withSpan(\n    core,\n    span,\n    processWithContext,\n    null, // thisArg\n    'user123', // userId\n    'checkout' // action\n);\n\nspan.end();\nconsole.log(result); // 'User user123 performed checkout'\n```\n\n### Example 5: Custom This Context\n\n```typescript\nclass UserService {\n    private userId: string;\n    \n    constructor(userId: string) {\n        this.userId = userId;\n    }\n    \n    process(): string {\n        return `Processing for user ${this.userId}`;\n    }\n}\n\nconst service = new UserService('user123');\nconst span = tracer.startSpan('service-operation');\n\n// Preserve 'this' context\nconst result = withSpan(\n    core,\n    span,\n    service.process,\n    service // Use service as 'this'\n);\n\nspan.end();\nconsole.log(result); // 'Processing for user user123'\n```\n\n### Example 6: Error Handling\n\n```typescript\nconst span = tracer.startSpan('risky-operation');\n\ntry {\n    withSpan(core, span, () => {\n        span.setAttribute('attempting', true);\n        \n        // Operation that might throw\n        const result = performRiskyOperation();\n        \n        span.setStatus({ code: SpanStatusCode.OK });\n        span.setAttribute('success', true);\n        \n        return result;\n    });\n} catch (error) {\n    span.recordException(error);\n    span.setStatus({ \n        code: SpanStatusCode.ERROR,\n        message: error.message \n    });\n    span.setAttribute('success', false);\n} finally {\n    span.end(); // Always end the span\n}\n```\n\n### Example 7: Multiple Nested Operations\n\n```typescript\nconst operationSpan = tracer.startSpan('complete-checkout');\n\nwithSpan(core, operationSpan, async () => {\n    operationSpan.setAttribute('step', 'starting');\n    \n    // Validate user\n    const validateSpan = tracer.startSpan('validate-user');\n    await withSpan(core, validateSpan, async () => {\n        validateSpan.setAttribute('user.id', '12345');\n        await validateUser();\n    });\n    validateSpan.end();\n    \n    // Process payment\n    const paymentSpan = tracer.startSpan('process-payment');\n    await withSpan(core, paymentSpan, async () => {\n        paymentSpan.setAttribute('amount', 99.99);\n        await processPayment();\n    });\n    paymentSpan.end();\n    \n    // Send confirmation\n    const confirmSpan = tracer.startSpan('send-confirmation');\n    await withSpan(core, confirmSpan, async () => {\n        confirmSpan.setAttribute('notification.type', 'email');\n        await sendConfirmation();\n    });\n    confirmSpan.end();\n    \n    operationSpan.setAttribute('step', 'completed');\n});\n\noperationSpan.end();\n```\n\n### Example 8: Background Task\n\n```typescript\nconst span = tracer.startSpan('background-task');\n\n// Execute background work with trace context\nwithSpan(core, span, async () => {\n    span.setAttribute('task.type', 'data-sync');\n    span.setAttribute('started', new Date().toISOString());\n    \n    // All operations here inherit span context\n    await syncDataToDatabase();\n    \n    span.setAttribute('completed', new Date().toISOString());\n});\n\nspan.end();\n```\n\n### Example 9: Conditional Execution\n\n```typescript\nfunction executeWithTracing(operation: () => void, shouldTrace: boolean) {\n    if (!shouldTrace) {\n        // Execute without tracing\n        return operation();\n    }\n    \n    // Execute with tracing\n    const span = tracer.startSpan('conditional-operation');\n    try {\n        return withSpan(core, span, operation);\n    } finally {\n        span.end();\n    }\n}\n\n// Usage\nexecuteWithTracing(() => {\n    console.log('This is traced');\n}, true);\n\nexecuteWithTracing(() => {\n    console.log('This is not traced');\n}, false);\n```\n\n### Example 10: Integration with Existing Code\n\n```typescript\n// Existing function without tracing\nasync function fetchUserData(userId: string) {\n    const response = await fetch(`/api/users/${userId}`);\n    return response.json();\n}\n\n// Add tracing without modifying the function\nasync function fetchUserDataWithTracing(userId: string) {\n    const span = tracer.startSpan('fetch-user-data');\n    span.setAttribute('user.id', userId);\n    \n    try {\n        const result = await withSpan(core, span, () => {\n            return fetchUserData(userId);\n        });\n        \n        span.setStatus({ code: SpanStatusCode.OK });\n        return result;\n    } catch (error) {\n        span.recordException(error);\n        span.setStatus({ code: SpanStatusCode.ERROR });\n        throw error;\n    } finally {\n        span.end();\n    }\n}\n```\n\n## Comparison with useSpan\n\n`withSpan` and `useSpan` are similar but differ in how they pass parameters to the callback function.\n\n### withSpan\n\nPasses additional arguments directly to the callback:\n\n```typescript\nwithSpan(core, span, (arg1, arg2) => {\n    // arg1 and arg2 are your custom arguments\n    console.log(arg1, arg2);\n}, null, 'value1', 'value2');\n```\n\n### useSpan\n\nPasses the `ISpanScope` as the first argument:\n\n```typescript\nuseSpan(core, span, (scope, arg1, arg2) => {\n    // scope is the ISpanScope\n    // arg1 and arg2 are your custom arguments\n    console.log(scope, arg1, arg2);\n}, null, 'value1', 'value2');\n```\n\n**When to use which:**\n- **`withSpan`**: When you don't need access to the span scope object\n- **`useSpan`**: When you need to manually restore context or access scope properties\n\nSee the [useSpan documentation](./useSpan.md) for more details.\n\n## Best Practices\n\n### 1. Always End Spans\n\n```typescript\n// Good - span is ended\nconst span = tracer.startSpan('operation');\ntry {\n    withSpan(core, span, () => {\n        // Work\n    });\n} finally {\n    span.end();\n}\n\n// Bad - span is never ended\nconst span = tracer.startSpan('operation');\nwithSpan(core, span, () => {\n    // Work\n}); // Forgot to end span!\n```\n\n### 2. Use with startSpan, Not startActiveSpan\n\n```typescript\n// Good - use withSpan with startSpan\nconst span = tracer.startSpan('operation');\nwithSpan(core, span, () => {\n    // Work\n});\nspan.end();\n\n// Redundant - startActiveSpan already manages context\ntracer.startActiveSpan('operation', (span) => {\n    // No need for withSpan here\n});\n```\n\n### 3. Handle Errors Appropriately\n\n```typescript\nconst span = tracer.startSpan('operation');\ntry {\n    withSpan(core, span, () => {\n        // Work that might throw\n        throw new Error('Failed');\n    });\n} catch (error) {\n    // Record exception\n    span.recordException(error);\n    span.setStatus({ code: SpanStatusCode.ERROR });\n} finally {\n    span.end();\n}\n```\n\n### 4. Don't Nest withSpan Unnecessarily\n\n```typescript\n// Good - each span with its own withSpan\nconst span1 = tracer.startSpan('operation-1');\nwithSpan(core, span1, () => {\n    // Work\n});\nspan1.end();\n\nconst span2 = tracer.startSpan('operation-2');\nwithSpan(core, span2, () => {\n    // Work\n});\nspan2.end();\n\n// Less ideal - unnecessary nesting\nwithSpan(core, span1, () => {\n    withSpan(core, span1, () => { // Redundant\n        // Work\n    });\n});\n```\n\n### 5. Combine with Async/Await\n\n```typescript\n// Good - natural async/await usage\nconst span = tracer.startSpan('async-op');\ntry {\n    const result = await withSpan(core, span, async () => {\n        return await doAsyncWork();\n    });\n    span.setStatus({ code: SpanStatusCode.OK });\n} finally {\n    span.end();\n}\n```\n\n## Common Patterns\n\n### Pattern 1: Wrapper Functions\n\n```typescript\nfunction withTracing<T>(\n    operationName: string,\n    fn: () => T\n): T {\n    const span = tracer.startSpan(operationName);\n    try {\n        return withSpan(core, span, fn);\n    } finally {\n        span.end();\n    }\n}\n\n// Usage\nconst result = withTracing('my-operation', () => {\n    return performWork();\n});\n```\n\n### Pattern 2: Decorator Pattern\n\n```typescript\nfunction traced(operationName: string) {\n    return function(\n        target: any,\n        propertyKey: string,\n        descriptor: PropertyDescriptor\n    ) {\n        const original = descriptor.value;\n        \n        descriptor.value = function(...args: any[]) {\n            const span = tracer.startSpan(operationName);\n            try {\n                return withSpan(core, span, () => {\n                    return original.apply(this, args);\n                }, this);\n            } finally {\n                span.end();\n            }\n        };\n        \n        return descriptor;\n    };\n}\n\n// Usage\nclass MyService {\n    @traced('process-data')\n    processData(data: any) {\n        // Automatically traced\n        return data.processed;\n    }\n}\n```\n\n### Pattern 3: Context Preservation\n\n```typescript\nfunction preserveContext<T>(fn: () => T): () => T {\n    const span = core.getActiveSpan();\n    \n    return () => {\n        if (span) {\n            return withSpan(core, span, fn);\n        }\n        return fn();\n    };\n}\n\n// Usage\nconst contextualFn = preserveContext(() => {\n    console.log('Maintaining trace context');\n});\n\nsetTimeout(contextualFn, 1000); // Executes with preserved context\n```\n\n## Error Handling\n\n### Automatic Context Restoration\n\n`withSpan` guarantees context restoration even when errors occur:\n\n```typescript\nconst previousSpan = core.getActiveSpan();\nconst span = tracer.startSpan('operation');\n\ntry {\n    withSpan(core, span, () => {\n        throw new Error('Operation failed');\n    });\n} catch (error) {\n    // Context is restored to previousSpan\n    console.log(core.getActiveSpan() === previousSpan); // true\n} finally {\n    span.end();\n}\n```\n\n### Error Recording\n\n```typescript\nconst span = tracer.startSpan('operation');\n\ntry {\n    withSpan(core, span, () => {\n        try {\n            performRiskyOperation();\n            span.setStatus({ code: SpanStatusCode.OK });\n        } catch (error) {\n            span.recordException(error);\n            span.setStatus({ code: SpanStatusCode.ERROR });\n            throw error; // Re-throw if needed\n        }\n    });\n} catch (error) {\n    // Handle error at outer level\n    console.error('Operation failed:', error);\n} finally {\n    span.end();\n}\n```\n\n### Promise Rejection\n\n```typescript\nconst span = tracer.startSpan('async-operation');\n\ntry {\n    await withSpan(core, span, async () => {\n        const result = await fetch('/api/data');\n        if (!result.ok) {\n            throw new Error(`HTTP ${result.status}`);\n        }\n        return result.json();\n    });\n    span.setStatus({ code: SpanStatusCode.OK });\n} catch (error) {\n    span.recordException(error);\n    span.setStatus({ code: SpanStatusCode.ERROR });\n} finally {\n    span.end();\n}\n```\n\n## See Also\n\n- [useSpan Helper](./useSpan.md) - Similar helper with scope parameter\n- [Trace API Documentation](./traceApi.md) - Tracer and span management\n- [OTel API Documentation](./otelApi.md) - Main OpenTelemetry API\n- [Examples Guide](./examples.md) - Comprehensive usage examples\n- [Main README](./README.md) - OpenTelemetry compatibility overview\n\n## Related Types\n\n- `ITraceHost` - Host interface for span management\n- `IReadableSpan` - Span interface\n- `ISpanScope` - Scope for restoring active span context\n- `IOTelTracer` - Tracer interface for creating spans\n"
  },
  {
    "path": "docs/PageUnloadEvents.md",
    "content": "# Page Unload Event Handling\n\n## Overview\n\nApplication Insights Web SDK tracks several page lifecycle events to ensure that telemetry data is sent before a page is unloaded, helping to prevent data loss during page navigation or browser closure. The SDK hooks into different unload and visibility change events depending on the browser environment.\n\n## Unload Events\n\nThe SDK listens to the following events to detect when a page is being unloaded:\n\n1. **beforeunload** - Fired when the window, document, and its resources are about to be unloaded\n2. **unload** - Fired when the document or a child resource is being unloaded\n3. **pagehide** - Fired when the browser hides the current page in the process of navigating to another page\n4. **visibilitychange** (with 'hidden' state) - Fired when the content of a tab has become visible or hidden\n\n## Modern Browser Compatibility\n\nModern browsers and frameworks are deprecating or changing how some page unload events work:\n\n- **jQuery 3.7.1+** has deprecated the use of the `unload` event, showing warning messages when it's used.\n- Some modern browsers are changing the behavior of `beforeunload` event for better performance and reduced tracking potential.\n- The `pagehide` event and `visibilitychange` events are becoming the recommended alternatives.\n- The SDK is designed to handle cases where certain events are unavailable or behave differently across browsers, gracefully adapting to the environment to ensure telemetry is sent.\n\n## Configuration Options\n\nThe SDK provides configuration options to control which page lifecycle events are used:\n\n### disablePageUnloadEvents\n\nThis configuration option allows you to specify which page unload events should not be used by the SDK.\n\n**TypeScript Example:**\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n  config: {\n    connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE',\n    disablePageUnloadEvents: [\"unload\"],\n    /* ...Other Configuration Options... */\n  }\n});\n```\n\n**Important notes**:\n\n- The SDK requires at least one functioning page unload event to ensure telemetry is sent when the page is closed.\n- If all events are listed in `disablePageUnloadEvents` or if the only working events in the current browser environment are the ones you've disabled, the SDK will still use one of them to ensure functionality.\n- This option is especially useful for avoiding jQuery 3.7.1+ deprecation warnings by excluding the \"unload\" event.\n\n### disablePageShowEvents\n\nSimilarly, this configuration option controls which page show events are not used by the SDK. Page show events include:\n\n1. **pageshow** - Fired when a page is shown, or when navigating to a page using browser's back/forward functionality\n2. **visibilitychange** (with 'visible' state) - Fired when a tab becomes visible\n\n**TypeScript Example:**\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n  config: {\n    connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE',\n    disablePageShowEvents: [\"pageshow\"],\n    /* ...Other Configuration Options... */\n  }\n});\n```\n\n## Fallback Mechanism\n\nThe SDK implements a robust fallback mechanism to ensure that telemetry can be sent before the page unloads:\n\n1. The SDK first tries to use all available unload events except those listed in `disablePageUnloadEvents`.\n2. If no events can be registered (either because all are disabled or not supported), the SDK will ignore the `disablePageUnloadEvents` setting and force registration of at least one event.\n3. Even when the SDK attempts to hook events that may be missing in certain browsers, it's designed to gracefully handle these cases without errors.\n4. The SDK includes internal logic to detect when hooked events aren't firing as expected and will utilize alternative approaches to send telemetry.\n5. This ensures that critical telemetry data is always sent, even in constrained environments or when browser implementations change.\n\n## Use Cases\n\n### Avoiding jQuery 3.7.1+ Deprecation Warnings\n\nIf you're using jQuery 3.7.1 or newer, you'll encounter deprecation warnings when the 'unload' event is used. Configure the SDK to not use this deprecated event:\n\n**TypeScript Example:**\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n  config: {\n    connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE',\n    // Disable the deprecated 'unload' event to avoid jQuery deprecation warnings\n    disablePageUnloadEvents: [\"unload\"],\n  }\n});\n```\n\n### Optimizing for Modern Browsers\n\nFor the best experience in modern browsers, you might want to prioritize newer events:\n\n**TypeScript Example:**\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n  config: {\n    connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE',\n    // Use only modern events\n    disablePageUnloadEvents: [\"unload\", \"beforeunload\"],\n  }\n});\n```\n\nNote that the SDK will still use an older event if none of the modern events are supported in the browser environment.\n\n### Using Both Configuration Options Together\n\nYou can configure both unload and show events simultaneously for fine-grained control:\n\n**TypeScript Example:**\n```typescript\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\n\nconst appInsights = new ApplicationInsights({\n  config: {\n    connectionString: 'YOUR_CONNECTION_STRING_GOES_HERE',\n    // Disable specific unload events\n    disablePageUnloadEvents: [\"unload\"],\n    // Disable specific show events\n    disablePageShowEvents: [\"pageshow\"],\n  }\n});\n```\n\n### Progressive Enhancement\n\nThe SDK's approach to page lifecycle events reflects a progressive enhancement strategy, ensuring that telemetry works across diverse browser environments while offering configuration options for optimal behavior in modern contexts."
  },
  {
    "path": "docs/PerformanceMonitoring.md",
    "content": "# Performance Monitoring (since v2.5.7)\n\nThe SDK now provides support for local client side performance monitoring and testing, this support does not send any telemetry or events to Azure Monitor as it has been designed to help developers validate and measure the performance of the SDK and any optional user instrumented code.\n\nIt can be enabled via configuration (_enablePerfMgr_) during initialization or by setting the performance manager directly on the Application Insights instance (_setPerfMgr()_).\n\nThe SDK comes with a default implementation of the performance manager which will fire the new [_perfEvent_ on the INotificationManager](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/INotificationManager.ts#L51), so you can receive a notification of these events by adding a INotificationListener which contains a [_perfEvent_](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/INotificationListener.ts#L38) implementation.\n\nThe easiest way to view and monitor these events in your running application/website would be to use the new [DebugPlugin extension](https://github.com/microsoft/ApplicationInsights-JS/blob/main/extensions/applicationinsights-debugplugin-js/README.md), which now listens and displays to the INotificationManager events.\n\nThe default INotificationManager implementation will (by default) only fire a _perfEvent_ for top level events, which are defined as events that have not occurred within the same execution cycle of a previous (incomplete) perf event. This behaviour can be changed to fire a _perfEvent_ for every instrumented section of code via the _perfEvtsSendAll_ configuration setting. Where the tracking of the current execution cycle of a performance event is automatically handled by the provided doPerf() helper.\n\nExample of the IPerfEvents captured by the default IPerfManager using the [DebugPlugin extension](https://github.com/microsoft/ApplicationInsights-JS/blob/main/extensions/applicationinsights-debugplugin-js/README.md) to visualize the captured events.\n![DebugPlugin Example](./media/DebugPlugin-PerfEvent1.png)\n\n## The interfaces\n\nThe SDK avoids (as much as possible) from directly using hard coded implementations and only uses the following interfaces as part of instrumenting the code for performance monitoring. This allows you to provide your own implementation to support your requirements at runtime and testing.\n\nThe only directly named class references are in the ApplicationInsight Core instances where they will create a [PerfManager](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK/PerfManager.ts) instances when the _enablePerfMgr_ configuration is enabled. If you want to use your own performance implementation then do not enable the _enablePerfMgr_ configuration setting, and just call the _setPerfMgr()_ with your IPerfManager after the ApplicationInsights has been created.\n\n### [IPerfManager](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/IPerfManager.ts)\n\n#### Provides the basic interface for creating, monitoring and firing performance events\n\nThis interface is used by the system to start \"create()\" and complete \"fire()\" performance events, the default provided performance manager [PerfManager](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK/PerfManager.ts) provides a simple implementation that will create a new [IPerfEvent](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/IPerfEvent.ts) instance for every call to it's create() function and will complete and fire a INotificationManager.perfEvent in response to calling it's fire() function.\n\nThe basic usage is that you call \"create()\" at the beginning of the segment of code that you want to measure and when the code is complete just call the \"fire()\" method with the IPerfEvent object returned from the create(). By following this pattern the implementation of the IPerfManager can control the exact implementation of IPerfEvent instance that is used for tracking the performance.\n\n#### Methods of the IPerfManager\n\n * create(src: string, payloadDetails?: () => any, isAsync?: boolean): IPerfEvent - [Required] If the manager wants to instrument the named (_src_) code then it should return an IPerfEvent instance based on the _src; _payloadDetails_ and _isAsync_ arguments. The implementation may return null or undefined if it does not want to monitor this source (named) code.\n   * src - [string] The source / name to be used for the performance event. May be used to determine whether the manager wants to create a IPerfEvent for the code.\n   * payloadDetails -  [() => any] This is an optional callback function which is used to assign the _payload_ value of the IPerfEvent, to limit the performance impacts the implementation should only call this callback if it is returning an IPerfEvent AND it needs the value.\n   * isAsync - [Boolean] An optional flag identifying whether the code is being executed as part of a synchronous / asynchronous request, used by the default implementation to determine how it should fire the INotification.perfEvent. Defaults to true when not supplied.\n * fire(perfEvent:IPerfEvent): void - [Required] The performance manager should mark the passed _perfEvent_ as complete and fire the performance event.\n   * perfEvent - [IPerfEvent] This will be the value returned by the create() function.\n* setCtx(key: string, value: any): void - [Required] Allows users to set a named context value, setting the same named value will overwrite any previous value, it should also allow setting the value to null or undefined. This is used via the doPerf() helper to track the currently executing IPerfEvent instance for identifying the parent / children for each event.\n* getCtx(key: string): any - [Required] Return any previously named value that was set.\n\n### [IPerfEvent](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/IPerfEvent.ts)\n\n#### The basic interface used to generate performance event metrics for instrumented code\n\nThis is a generic interface for holding the details about the instrumented chunk of code, the SDK does not directly create instances of this interface but rather uses the instances returned via the IPerfManager.create().\n\n#### The fields of the IPerfEvent\n\n * name - [string] The name of the performance event. Examples \"AppInsightsCore:track\" \"AppInsightsPropertiesPlugin:processTelemetry\n * start - [number] The start time of the event, the actual value is dependent on the IPerfManager implementation, it could be in relative, absolute in milliseconds or nanoseconds. The provided default IPerfManager currently uses the absolute time in milliseconds (via Date.now()).\n * payload - [object] This is a copy / reference to the value provided during the call to the IPerfManager.create().\n * isAsync - [boolean] Identifies if the perfEvent is occurring via a synchronous or asynchronous execution path, primarily used to determine how to fire the _INotificationManager.perfEvent()_.\n * time - [number] Identifies the total amount of time (since the start to end) that this perfEvent represents. This value may be undefined until the event has completed (depending on the IPerfManager implementation).\n * exTime - [number] Identifies the exclusive amount of time (since the start to end) that this perfEvent represents. This effectively is the \"time\" less the sum of the \"time\" of all children.\n * parent - [IPerfEvent] An optional reference to the parent event that was active when this event was created.\n * childEvts - [Array&lt;IPerfEvent&gt;] An optional array of all child events started before this event completed.\n\n#### Methods of the IPerfEvent\n\n * getCtx?: (key: string) => any - [Optional] Returns any previously set context for the event, can be used by the instrumented code to set additional context to be reported or tracked for the performance event. The doPerf() Helper uses this function to get the child event value array for appending.\n * setCtx?: (key: string, value: any) => void - [Optional] Allows the instrumented code to set additional context to be reported or tracked for the performance event. The doPerf() Helper uses this function to set the parent, child event values and if an exception occurred during execution.\n * complete: () => void - [Required] - When called, the tracked event should be marked as complete. The default provided IPerfManager calls this method during it's call to fire() to mark the event as complete.\n\n## Provided Implementation helper\n\n### [doPerf()](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK/CoreUtils.ts#L498)\n\n#### Helper method that is used by the SDK to wrap the code to be measured\n\nThis is the primary helper used by the SDK to instrument a block of code that we have identified as a critical block that should be monitored / tested. We have exported this helper to allow you to instrument your own code as part of the normal execution cycle.\n\nIt is designed as a wrapper implementation where the 3rd argument _func_ is the code that is being monitored. The implementation handles cases where a performance manager is not enabled or available, so it is safe for you to include this into production code.\n\n##### Signature\n\nThe helper uses callback functions for constructing the source (_name_ of the event) and details (_payload_ of the event) to avoid any expensive string or object construction when performance monitoring is not enabled.\n\ndoPerf<T>(mgrSource: IPerfManagerProvider | IPerfManager, getSource: () => string, func: (perfEvt?: IPerfEvent) => T, details?: () => any, isAsync?: boolean) => T\n\n * mgrSource - [[IPerfManager|IPerfManagerProvider](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/IPerfManager.ts)] This can be either the IPerfManager or a provider that returns the IPerfManager (via the _getPerfMgr()_) instance. All Application Insights core instances are IPerfManagerProvider instances, so you can just the current Application Insights instance. The value may also be null or undefined, which means no perf event will be tracked.\n * getSource - [() => string] Callback function to return the _name_ for the perf event, this is only called when the performance monitoring is enabled and the value is passed to the IPerfManager.create() function.\n * func - [() => T] This is the actual code whose performance will be monitored / tracked, the return value of this function is the value returned by the doPerf() helper.\n * details - [() => any] This is an optional callback function which is used to assign the _payload_ value of the IPerfEvent, the callback function is passed to the IPerfManager.create() method and will only be called if the performance mananger creates an IPerfEvent for the request, to limit the performance impact that monitoring can introduce.\n * isAsync - [Boolean] An optional flag identifying whether the code is being executed as part of a synchronous / asynchronous request. Defaults to true when not supplied.\n\nExample usage\n```typescript\n\npublic myFunction(someArgument: any) {\n    return doPerf(appInsights, () => rootName + \":myFunction\", () => {\n        // This is the code that will be instrumented\n\n        // As a wrapper the doPerf supports returning the value returned by the func argument\n        return true;\n    }, () => ({ details: someArgument, retry: 1 }));\n}\n\n```\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Application Insights JavaScript SDK\n\n<properties\n    pageTitle=\"Application Insights SDK JavaScript API\"\n    description=\"Reference doc\"\n    services=\"application-insights\"\n    documentationCenter=\".net\"\n/>\n\n<tags\n    ms.service=\"application-insights\"\n    ms.workload=\"tbd\"\n    ms.tgt_pltfrm=\"ibiza\"\n    ms.devlang=\"na\"\n    ms.topic=\"article\"\n    ms.date=\"08/24/2015\"/>\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web)\n[![minified size size](https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js.svg)](https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js)\n[![gzip size](https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js.gzip.svg)](https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js)\n\n## Before Getting Started\n\nThis SDK is not for non-browser environments, for example, the Node.js applications.\n\nFor instrumenting a Node.js app, the recommended SDK is the [ApplicationInsights-node.js repository](https://github.com/microsoft/ApplicationInsights-node.js).\n\nES3 support has been removed from the latest version (v3.x), if required [see for ES3/IE8 Support](https://microsoft.github.io/ApplicationInsights-JS/es3_Support.html\n)\n\n## Release Versions\n\n| Version | Details\n|---------|--------------------------\n| <b>[3.x](https://github.com/microsoft/ApplicationInsights-JS/tree/main)<br/><sub>(main)</sub> </b>| Current supported release from April '2023.<br/>Supports dynamic configuration changes/updates after initialization. Supports all features of v2 except with the known <b>[Breaking changes from previous versions](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v3_BreakingChanges.html)</b> and does NOT support the previous v1.x compatible API proxy layer, it also removes support for ES3 / IE8. Minimum supported Runtime is now ES5 (IE9+).\n| [2.x](https://github.com/microsoft/ApplicationInsights-JS/tree/master)<br/><sub>(master)</sub> | Feature freeze from March '2023, security fixes and critical bugs only.<br />Supports adding / removing extensions and full unloading/removal of the SDK after initialization. Last version to support ES3 (IE8+), also provides a v1.x compatible API proxy layer for upgrading from V1.x.\n| [1.0.x](https://github.com/microsoft/ApplicationInsights-JS/tree/legacy-v1)<br/><sub>(legacy-v1)</sub> | No longer actively maintained -- please Upgrade. The documentation for `applicationinsights-js@1.0.x` has moved [here](https://github.com/microsoft/ApplicationInsights-JS/tree/master/legacy/README.md). If you are looking to upgrade to the new version of the SDK, please see the [Upgrade Guide](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v2_UpgradeGuide.html). | Not actively maintained, please upgrade.\n\n\n### Docs\n\n- [OpenTelemetry Tracing API](./OTel/README.md) - OpenTelemetry-compatible tracing API for distributed tracing\n- [Performance Monitoring](./PerformanceMonitoring.md)\n- [Dependency Listeners](./Dependency.md)\n- [SDK Load Failure](./SdkLoadFailure.md)\n- [Previous API Reference](./API-reference.md) - Legacy hand-maintained API reference, we recommend using the auto-generated [typedoc documentation](https://microsoft.github.io/ApplicationInsights-JS/webSdk/) instead\n\n### FAQ\n\n- [Create an Issue](https://github.com/microsoft/ApplicationInsights-JS/issues/new/choose)\n- [Using Azure API Management as a proxy for Application Insights Telemetry](https://techcommunity.microsoft.com/blog/azureobservabilityblog/using-azure-api-management-as-a-proxy-for-application-insights-telemetry/4422236)\n- [ES3 Support](./es3_Support.md)\n- [Page Unload Event Handling](./PageUnloadEvents.md)\n- [V2 Upgrade Guide](./upgrade/v2_UpgradeGuide.md)\n- [V3 Breaking Changes](./upgrade/v3_BreakingChanges.md)\n\n[Back to GitHub](https://github.com/Microsoft/ApplicationInsights-JS)"
  },
  {
    "path": "docs/SdkLoadFailure.md",
    "content": "# SDK Load Failure: Failed to load Application Insights SDK script (see stack for details)\n\nThis exception is created and reported by the snippet (v3 or later) when it detects that the SDK script failed to download or initialize. Simplistically, your end users client (browser) was unable to download the Application Insights SDK, or initialize from the identified hosting page and therefore no telemetry or events will be reported.\n\n<p><img src=\"./media/sdk-load-failure-overview.png\" alt=\"Azure portal browser failure overview\" style=\"border: lightgray 2px solid\" /></p>\n\n> :bulb: **Note**\n>\n> This exception is supported on all major browsers that support the fetch() API or XMLHttpRequest, this therefore explicitly excludes IE 8 and below, so you will not get this type of exception reported from those browsers (unless your environment includes a fetch polyfill).\n\n## What does this exception mean?\n\nThere are many possible reasons for this exception to be reported, we will cover some of the known issues as well the details to diagnose the root cause of the problem.\n\n<p><img src=\"./media/sdk-load-failure-exception.png\" alt=\"browser exception detail\" style=\"border: lightgray 2px solid\" /></p>\n\nThe stack details include the basic information with the URLs being used by the end user and is formatted as below\n\n> SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)<br />\n> Snippet failed to load [__&lt;CDN&nbsp;Endpoint&gt;__] -- Telemetry is disabled<br />\n> Help Link: __&lt;Help&nbsp;Link&gt;__<br />\n> Host: __&lt;Host&nbsp;URL&gt;__<br />\n> Endpoint: __&lt;Endpoint&nbsp;URL&gt;__<br />\n\n| Name | Description\n|----------------------|------------\n| &lt;CDN&nbsp;Endpoint&gt; | The URL that was used (and failed) to download the SDK\n| &lt;Help&nbsp;Link&gt;    | A help link URL that links to this page\n| &lt;Host&nbsp;URL&gt;     | The complete URL of the page that the end user was using\n| &lt;Endpoint&nbsp;URL&gt; | The URL that was used to report the exception, this value may be helpful in identifying whether the hosting page was accessed from the public internet or a private cloud.\n\n## Why did this exception occur?\n\nThere are many possible reasons for this exception to be reported, and the most common ones are described below with links to corresponding troubleshooting steps.\n\n> :bulb: **Note**\n>\n> Several of the Troubleshooting steps assume that your application has direct control of the Snippet &lt;script /&gt; tag and it's configuration that are returned as part of the hosting HTML page. If you don't then those identified steps will not apply for your scenario.\n\n## The Application Insights JS CDN has been blocked\n\nWhile typically NOT the cause for this exception, we recommend you rule it out first since there are limited options for you or your end users and may require immediate external assistance.\n\n### Troubleshooting\n\n- [Check if the CDN has been blocked](SdkLoadFailureSteps.md#cdn-blocked)\n- [Change the URL used to download the SDK](SdkLoadFailureSteps.md#change-the-cdn-endpoint)\n- [Host the SDK on you own CDN](SdkLoadFailureSteps.md#host-sdk)\n- [Use NPM packages to embed the Application Insights SDK](SdkLoadFailureSteps.md#use-npm).\n\n## Intermittent network connectivity failure\n\nThis is the most common reason for seeing this exception, though it may seem largely out of the developer's control. It's especially common in a mobile roaming scenario where the user looses network connectivity intermittently.\n\nTo minimize this issue, we have implemented Cache-Control headers on all of the CDN files so that once the end users browser has downloaded the current version of the SDK it will not need to downloaded again and the browser will reuse the previously obtained copy (see [How caching works](https://docs.microsoft.com/azure/cdn/cdn-how-caching-works)). If the caching check fails or there has been a new release, then your end users browser will need and download the updated version, so you may see a background level of _\"noise\"_ in the check failure scenario or a temporary spike when a new release occurs and is made generally available (deployed to the CDN).\n\nIf this exception is persistent and is occurring across many of your users (diagnosed by a rapid and sustained level of this exception being reported) along with a reduction in normal client telemetry, then intermittent network connectivity issues is _not-likely_ to be the true cause of the problem and you should continue diagnosing with the other known possible issues below.\n\n### Troubleshooting\n\n- [Intermittent Network failure](SdkLoadFailureSteps.md#intermittent-network-failure)\n- [Use NPM packages to embed the Application Insights SDK](SdkLoadFailureSteps.md#use-npm).\n\n> :bulb: **Note**\n>\n> Due to the caching headers on the CDN files and depending on how often and when your users access your site, not all of them will attempt to download the newer version at the same point in time, so reports may be staggered.\n\n## Application Insights JS CDN is blocked (by End User - blocked by browser; installed blocker; Personal firewall)\n\nCheck if your end users have installed: -\n- a browser plug-in (typically some form of Ad/Malware/Popup blocker);\n- blocked (or not allowed) the Application Insights CDN endpoints in their browser or proxy; \n- or configured a firewall rule that is causing the CDN domain for the SDK to be blocked (or the DNS entry to not be resolved).\n\nIf they have configured any of these options, you will need to work with them (or provide documentation) to allow the CDN endpoints.\n\nIt is also possible that the plug-in they have installed is using the [public blocklisting](SdkLoadFailureSteps.md#cdn-blocked), which is why that option is listed first, if you get here then it's most likely some other manually configured solution or it's using a private domain blocklisting.\n\n### Troubleshooting\n\n- [Check if CDN has been blocked](SdkLoadFailureSteps.md#cdn-blocked)\n- [Change the URL used to download the SDK](SdkLoadFailureSteps.md#change-the-cdn-endpoint)\n- [Add exceptions for CDN endpoints](SdkLoadFailureSteps.md#add-exceptions-for-cdn-endpoints)\n- [Host the SDK on you own CDN](SdkLoadFailureSteps.md#host-sdk)\n- [Use NPM packages to embed the Application Insights SDK](SdkLoadFailureSteps.md#use-npm).\n\n> :bulb: **Note**\n>\n> For this exception to be reported, they would not be blocking the reporting endpoint (otherwise you would not see the exception).\n\n## Application Insights CDN is blocked (by Corporate firewall)\n\nIf your end users are on a corporate network, then they are most likely behind some form of firewall solution and it's likely that their IT department has implemented some form of internet filtering system. In this case, you will need to work with them to allow the necessary rules for your end users.\n\n### Troubleshooting\n\n- [Check if CDN has been blocked](SdkLoadFailureSteps.md#cdn-blocked)\n- [Change the URL used to download the SDK](SdkLoadFailureSteps.md#change-the-cdn-endpoint)\n- [Add exceptions for CDN endpoints for corporations](SdkLoadFailureSteps.md#corporate-exceptions-for-cdn-endpoints)\n- [Host the SDK on you own CDN](SdkLoadFailureSteps.md#host-sdk)\n- [Use NPM packages to embed the Application Insights SDK](SdkLoadFailureSteps.md#use-npm).\n\n> :bulb: **Note**\n>\n> For this exception to be reported, they would not be blocking the reporting endpoint (otherwise you would not see the exception).\n\n## Application Insights CDN outage\n\nYou can confirm this scenario by attempting to access the CDN endpoint directly from the browser (for example, https://js.monitor.azure.com/scripts/b/ai.2.min.js) from a different location to that of your end users (probably from your own development machine - assuming that your organization has not blocked this domain).\n\n### Troubleshooting\n\n- [Create a support ticket](https://azure.microsoft.com/support/create-ticket/) with details of the outage and the CDN endpoint that is experiencing the issue. \n- [Change the URL used to download the SDK](SdkLoadFailureSteps.md#change-the-cdn-endpoint)\n\n### SDK failed to initialize after loading the script\n\nThere are several possible reasons that may cause the script to fail during initialization, when this occurs the SDK &lt;script /&gt; was successfully downloaded from the cdn but it fails during initialization. This issue can be because of one or more missing dependencies; invalid or some form of JavaScript exception.\n\nThe first thing to check is whether the SDK was successfully downloaded, if the script was NOT downloaded then this scenario is __not__ the failing scenario.\n\nQuick check: Using a browser that supports Developer tools (F12), validate on the network tab that the script defined in the ```src``` snippet configuration was downloaded with a response code of 200 (success) or a 304 (not changed). You could also use a tool like fiddler to review the network traffic.\n\n### Troubleshooting\n\n- [SDK Failed to initialize](SdkLoadFailureSteps.md#sdk-failed-to-initialize)\n\n## <a name=\"next\"></a> Next steps\n* [Get additional help by filing an issue on GitHub](https://github.com/Microsoft/ApplicationInsights-JS/issues)\n* [Back to Snippet setup](https://github.com/microsoft/ApplicationInsights-JS/blob/main/README.md#reporting-script-load-failures)\n\n## Sdk Initialization Failure Due to RequireJs\n\nIf you're experiencing issues with Application Insights not loading properly, it might be because there's a conflict with RequireJs. This usually happens when RequireJs has already been loaded by the time Application Insights tries to initialize. Refer to the documentation [here](https://github.com/microsoft/ApplicationInsights-JS/blob/main/README.md#module-formats) for more detailed information.\n\n\n### Troubleshooting\n- Check if another script is calling require js\n- Check if RequireJS is loaded first before script is loaded\n\n### Recommended Workaround Solution\n- Instead of using 3.x.x.min.js or 2.x.x.js, opt for 3.x.x.gbl.min.js or 2.x.x.glb.js. \n- Load application insight script prior to other scripts\n"
  },
  {
    "path": "docs/SdkLoadFailureSteps.md",
    "content": "# SDK Load Failure: Troubleshooting steps\n\n## CDN Blocked\n\nThis situation is possible when an Application Insights JS SDK CDN endpoint has been reported and/or identified as being unsafe for some reason. When this occurs, it will cause the endpoint to be publicly block-listed and consumers of these lists will begin to block all access.\nResolving this requires the owner of the CDN endpoint to work with the block-listing entity that has marked the endpoint as unsafe so that it can be removed from the relevant list. \n\nCheck if the CDN endpoint has been identified as unsafe.\n- [Google Transparency Report](https://transparencyreport.google.com/safe-browsing/search)\n- [VirusTotal](https://www.virustotal.com/gui/home/url)\n- [Sucuri SiteCheck](https://sitecheck.sucuri.net/)\n\nDepending on the frequency that the application, firewall or environment update their local copies of these lists, it may take a considerable amount of time and/or require manual intervention by end users or corporate IT departments to force an update or explicitly allow the CDN endpoints to resolve the issue. \n\nIf the CDN endpoint is identified as unsafe, please [create a support ticket](#create-a-support-ticket) with the required details to ensure that the issue is resolved as soon as possible.\n\nYou may also want to consider [changing the SDK CDN endpoint](#change-the-cdn-endpoint) to _potentially_ bypass this issue more rapidly.\n\n## Intermittent Network Failure\n\nIf the user is experiencing intermittent network connectivity failures, then there are fewer possible solutions and they will generally resolve themselves over a short period of time. For example, if the user reloads your site the files will (eventually) get downloaded and cached locally until an updated version is released.\n\nWith this situation [Hosting the SDK on you own CDN](#host-sdk) is unlikely to provide or reduce the occurrences of this exception, as your own CDN will be affected by the same issue.\n\nThe same is also true when [using the SDK via NPM packages](#use-npm) solution, however, from the end users perspective when this occurs your entire application fails to load / initialize (rather than _just_ the telemetry SDK - which they don't see visually), so they will most likely refresh your site until is loads completely.\n\n## Add Exceptions for CDN endpoints\n\nWork with your end users or provide documentation informing them that they should allow scripts from the Application Insights CDN endpoints to be downloaded by including them in their browsers plug-in or firewall rule exception list, this will vary based on the end users environment.\n\nHere is an example of how to configure within [Chrome to allow or block access to websites](https://support.google.com/chrome/a/answer/7532419?hl=en)\n\n## Corporate Exceptions for CDN endpoints\n\nThis is similar to [adding exceptions for end users](#add-exceptions-for-cdn-endpoints), but you will need to work with your end users IT department to have them configure the Application Insights CDN endpoints to be downloaded by including (or removing) them in any domain block-listing or allow-listing services.\n\n> :warning: **Important**\n>\n> If the your corporate user is using a [private cloud](https://azure.microsoft.com/overview/what-is-a-private-cloud/) and they cannot enable any form of exception to provide their internal users with public access for the CDN endpoints then you will need to [use the NPM packages](#use-npm) or [host the Application Insights SDK on your own CDN](#host-sdk).\n\n## Change the CDN endpoint\n\nAs the snippet and its configuration are returned by your application as part of each generated page, you can change the snippet `src` configuration to use a different URL for the SDK. By using this approach, you could bypass the [CDN Blocked](#cdn-blocked) issue as the new URL should not be blocked.\n\nCurrent Application Insights JavaScript SDK CDN endpoints\n- ~~https://az416426.vo.msecnd.net/scripts/b/ai.2.min.js~~\n- https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js (for snippet version >=7)\n- https://js.monitor.azure.com/scripts/b/ai.2.min.js (for snippet version <7)\n\n> :bulb: **Note**\n>\n> The https://js.monitor.azure.com/ endpoint is an alias that allows us to switch between CDN providers within approximately 5 minutes, without the need for you to change any config. This is to enable us to fix detected CDN related issues more rapidly if a CDN provider is having regional or global issues without requiring everyone to adjust their settings.\n\n## Use NPM\n \nRather than using the snippet and public CDN endpoints you could use the NPM packages to include the SDK as part of your own JavaScript files. With this approach, the SDK will become just another package within your own scripts. Note: It is recommended that when using this approach, you should also use some form of [JavaScript bundler](https://www.bing.com/search?q=javascript+bundler) to assist with code splitting and minification.\n\nAs with the snippet, it is also possible that your own scripts (with or without using the SDK NPM packages) could be affected by the same blocking issues listed here, so depending on your application, your users, and your framework you may want to consider implementing something similar to logic in the snippet to detect and report these issues.\n\n> :bulb: **Note**\n>\n> You will need to use this approach (or [Host the SDK on you own CDN](#host-sdk)) if your users are using a [private cloud](https://azure.microsoft.com/overview/what-is-a-private-cloud/) as they most likely will not have access to the public internet.\n\n## Host SDK\n \nRather than your end users downloading the Application Insights SDK from the public CDN you could host the Application Insights SDK from your own CDN endpoint. If using this approach, it is recommended that you use a specific version (ai.3.gbl.#.#.min.js) so that it's easier to identify which version you are using, it is also recommended that update it on a regular basis to the current version (ai.3.gbl.min.js) so you can leverage any bug fixes and new features that become available.\n\n<div class=\"alert alert-info\"> \n\n:bulb: __Note:__ You will need to use this approach (or [Use NPM packages](#use-npm)) if your users are using a [private cloud](https://azure.microsoft.com/overview/what-is-a-private-cloud/) as they most likely will not have access to the public internet.\n</div>\n\n## Create a support ticket\n \nUse the Azure Support portal to [create a new support ticket](https://azure.microsoft.com/support/create-ticket/) with details of the outage.\n\n> __Please include__ :-\n>  1. If the detected failure is caused by block-listing from a public Anti-virus or block-listing provider, please include details of the provider. This will help in reducing the time required to get the issue resolved;\n>  2. Checks / Validations that you have already performed;\n>  3. The timeframe(s) of the reported issues;\n>  4. The Expected SDK version # to be downloaded;\n>  5. Stack details from the reported exception (as it includes the CDN endpoint, the hosting page URL and the endpoint used to report the exception);\n>  6. The reported browser and if know the version of the browser/environment.\n> ---\n\n\n## SDK Failed to initialize\n\nWe will assume that you have already validated that the SDK script was successfully downloaded.\n\n> Basic reporting rules: This section includes different reporting options, it will recommend either creating a support ticket or raising an issue on GitHub.\n> - If the issue is only affecting a small number of users and more specifically a specific or subset of browser version(s) (check the details on the reported exception) then it's likely an end user or environment only issue which will probably require you application to provide additional polyfill implementations. For these please raise a GitHub issue.\n> - If this issue is affecting your entire application and all of your users are affected then it's probably a release related issue and therefore you should create a support ticket.\n\nFirst lets check for JavaScript exceptions, using a browser that supports developer tools (F12) load the page and review if any exceptions occurred.\n\nIf there are exceptions being reported in the SDK script (for example ai.2.min.js), then this may indicate that the configuration passed into the SDK contains unexpected or missing required configuration or a faulty release has been deployed to the CDN.\n\nTo check for faulty configuration, change the configuration passed into the snippet (if not already) so that it only includes your connection string as a string value\n\n> src: \"https://az416426.vo.msecnd.net/scripts/b/ai.2.min.js\",<br />\n> cfg:{<br />\n> connectionString: \"YOUR_CONNECTION_STRING\"<br />\n> }});<br />\n\nIf when using this minimal configuration you are still seeing a JavaScript exception in the SDK script, please [create a support ticket](#create-a-support-ticket) with the details as this will require the faulty build to be rolled back as it's most likely an issue with a newly deployed version.\n\nIf the exception disappears, then the issue is likely caused by a type mismatch or unexpected value, proceed to re-add your configuration options until the exception occurs again and then check the documentation for the item causing the issue. If the documentation is unclear or you need assistance, please [file an issue on GitHub](https://github.com/Microsoft/ApplicationInsights-JS/issues). \n\nIf your configuration was previously deployed and working but just started reporting this exception, then it may be an issue with a newly deployed version, please check whether is affecting only a small set of your users / browser and either [file an issue on GitHub](https://github.com/Microsoft/ApplicationInsights-JS/issues) or [create a support ticket](#create-a-support-ticket).\n\nAssuming there are no exceptions being thrown the next step is to enabling console debugging by adding ```loggingLevelConsole``` setting to the configuration, this will send all initialization errors and warnings to the browsers console (normally available via the developer tools (F12)). Any reported errors should be self-explanatory and if you need further assistance [file an issue on GitHub](https://github.com/Microsoft/ApplicationInsights-JS/issues).\n> cfg:{<br />\n> connectionString: \"CONNECTION_STRING\",<br />\n> loggingLevelConsole: 2<br />\n> }});<br />\n\n> :bulb: **Note**\n>\n> During initialization the SDK performs some basic checks for known major dependencies, if these are not provided by the current runtime it will report the failures out as warning messages to the console, but only if the loggingLevelConsole is greater than zero.\n\nIf it still fails to initialize, try enabling the ```enableDebug``` configuration setting, which will cause all internal errors to be thrown as an exception (which will cause telemetry to be lost), as this is a developer only setting it will probably get very noisy with exceptions getting thrown as part of some internal checks, so you will need to review each exception to determine which issue is causing the SDK to fail. Use the non-minified version of the script (note the extension below it's \".js\" and not \".min.js\") otherwise the exceptions will be unreadable. \n\n> :rotating_light: **WARNING:**\n>\n> This is a developer only setting and should NEVER be enabled in a full production environment as you will loose telemetry.\n\n> src: \"https://az416426.vo.msecnd.net/scripts/b/ai.2.js\",<br />\n> cfg:{<br />\n> connectionString: \"CONNECTION_STRING\",<br />\n> enableDebug: true<br />\n> }});<br />\n\nIf this still does not provide any insights, you should [file an issue on GitHub](https://github.com/Microsoft/ApplicationInsights-JS/issues) with the details and if you have an example site that would be extremely useful. Please ensure to include the browser version, operating system, and JS framework details to help identify the issue.\n\n## <a name=\"next\"></a> Next steps\n* [Get additional help by filing an issue on GitHub](https://github.com/Microsoft/ApplicationInsights-JS/issues)\n* [SDK Load Failure details](SdkLoadFailure.md)\n"
  },
  {
    "path": "docs/ThrottleMgr.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Throttle Manager\n\nThrottle Manager component for the Application Insights Javascript SDK.\n\n## Configuration\n\n[`IThrottleMgrConfig`](https://github.com/microsoft/ApplicationInsights-JS/blob/main/shared/AppInsightsCommon/src/Interfaces/IThrottleMgr.ts)\n\n## Examples\n\n### Initialization\n\nThe Throttle Manager component is already integrated into AISKU. If you're using AISKU, simply include your throttle manager configuration `throttleMgrCfg` in your root configuration. Otherwise, you'll need to provide `core` for initialization.\n\n```javascript\nimport { AppInsightsCore, _eInternalMessageId } from '@microsoft/applicationinsights-core-js\"';\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\";\n\nlet core = new AppInsightsCore();\nlet sender = new Sender();\n\nlet defaultThrottleCfg = {\n    disabled: false, /* throttle is enabled. If set to true, no messages will be sent out */\n    limit: {\n        samplingRate: 100, /* sampling rate is 0.01% */\n        maxSendNumber: 1 /* each time, only throttle 1 message */\n    }, /*  limit number/percentage of items sent per time */\n    interval: {\n        monthInterval: 3, /* messages will be sent out every 3 months */\n        dayInterval: undefined,\n        daysOfMonth: [28] /* on date 28th */\n    }, /* frequency of messages that should be sent out  */\n};\n\nlet iKeyDeprecaredMsgThrottleCfg = {\n    disabled: false, /* throttle is enabled. If set to true, no messages will be sent out */\n    limit: {\n        samplingRate: 10, /* sampling rate is 0.001% */\n        maxSendNumber: 1 /* each time, only throttle 1 message */\n    }, /*  limit number/percentage of items sent per time */\n    interval: {\n        monthInterval: undefined,\n        dayInterval: 20, /* messages will be sent out every 20 days */\n        daysOfMonth: undefined\n    }, /* frequency of messages that should be sent out */\n};\nconst defaultThrottleMsgKey = _eInternalMessageId.DefaultThrottleMsgKey;\nconst instrumentationKeyDeprecation = _eInternalMessageId.InstrumentationKeyDeprecation;\nconst cdnDeprecation = _eInternalMessageId.CdnDeprecation;\n\n/* if specific message id throttle config is not defined, defaultThrottleMsgKey config will be used */\nlet throttleCfg = {\n    [defaultThrottleMsgKey]: defaultThrottleCfg,\n    [instrumentationKeyDeprecation]: iKeyDeprecaredMsgThrottleCfg\n};\n\nlet coreCfg = {\n    connectionString: 'test',\n    throttleMgrCfg: throttleCfg\n};\ncore.initialize(coreCfg, [sender]);\nconst throttleMgr = new ThrottleMgr(core);\n\nthrottleMgr.onReadyState(true); /* the actual throttle will only be activated after onReadyState is set to true */\nthrottleMgr.isReady(); /* return if onReadyState is set to true */\n\n```\n\n### Throttle Message\n\nWhen calling `sendMessage()`, if throttling should happen based on throttle config, trace telemetry will be sent out. Otherwise, local storage will be updated to log the details.\n\n```javascript\n/* return if instrumentationKeyDeprecation message should be throttled or not currently based on throttleCfg[instrumentationKeyDeprecation] */\nthrottleMgr.canThrottle(instrumentationKeyDeprecation);\n\n/* return if cdnDeprecation message should be throttled or not currently. Since throttle manager config for cdnDeprecation is not defined, defaultThrottleMsgKey config will be used */\nthrottleMgr.canThrottle(cdnDeprecation);\n\n/* return if the instrumentationKeyDeprecation message has been triggered or not on the current date. For each key, throttling will only be triggered once per day.*/\nthrottleMgr.isTriggered(instrumentationKeyDeprecation);\n\n/* send instrumentationKeyDeprecation message */\nthrottleMgr.sendMessage(instrumentationKeyDeprecation, \"Instrumentation Key Deprecation Message\");\n\n```\n"
  },
  {
    "path": "docs/WebConfig.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Web Config for CfgSync Plugin\n\nDefine ThrottleMgrCfg Configurations and feature opt-in status details.\n\n## Change History\n\n### Version\n\n1.0.0 (March, 2024)\n\nCDN details\n\n| Name    | Description | Details\n|---------|------|----------------\n| enabled | General on/off | `true` (on)\n| featureOptIn | opt-in feature list | iKeyUsage (*inital opt-in*)\n| featureOptIn.iKeyUsage.mode | feature-iKeyUsage enable/disable status | `3` (enable/opt-in)\n| featureOptIn.iKeyUsage.onCfg | override values of the following cdn `config` when feature-iKeyUsage is enabled |  <sub>DefaultThrottleMsgKey</sub></br>throttleMgrCfg.109.disabled: `false`</br> <sub>InstrumentationKeyDeprecation</sub></br> throttleMgrCfg.106.disabled: `false`\n| featureOptIn.iKeyUsage.offCfg | override values of the following cdn `config` when feature-iKeyUsage is disabled | <sub>DefaultThrottleMsgKey</sub></br>throttleMgrCfg.109.disabled: `true`</br> <sub>InstrumentationKeyDeprecation</sub></br> throttleMgrCfg.106.disabled: `true`\n| config | override values for user's core config | throttleMgrCfg\n| config.throttleMgrCfg | override values for user's throttleMgrCfg under core config | <sub>InstrumentationKeyDeprecation</sub></br> throttleMgrCfg.106:</br>{  `\"disabled\": false`, *// will send ikey InstrumentationKey Deprecation message*</br>`\"limit\": { \"samplingRate\": 1, \"maxSendNumber\": 1}`, *// sampling rate: 0.0001%, and will send max one message per time* </br>`\"interval\": {\"monthInterval\": 2,\"daysOfMonth\": [1]}`} *// message will be sent on the first day every 2 months*,</br><sub>DefaultThrottleMsgKey</sub></br>throttleMgrCfg.109:</br>{  `\"disabled\": false`, *// generally enable*</br> ... *// all other settings are same with the InstrumentationKeyDeprecation settings*}</br>\n\n#### Note\n\nThis change will begin InstrumentationKeyDeprecation message throttling. If InstrumentationKey is used instead of ConnectionString for appInsights SDK initialization, logs with InstrumentationKeyDeprecation(106) message id will be sent.\n\n## Basic Usage\n\n### Change Feature Opt-in Status\n\nUnder your config, define opt-in details in `featureOptIn`\n\n```js\n\n//to define iKeyUsage opt-in details\n{\n    connectionString: \"YOUR_CONNECTION_STRING\",\n    ...\n    featureOptIn: {[\"iKeyUsage\"]: {\n        mode: FeatureOptInMode.disable, // set feature-iKeyUsage opt-in status to disable\n        blockCdnCfg: false, //define if should block any changes from web config cdn\n        } as IFeatureOptInDetails\n    }\n}\n\n```\n\n### Disable Fetching From CDN\n\nFor users behind a firewall, if fetching config CDN needs to be disabled, the following changes can be applied to your root configurations.\n\n```js\n{\n    connectionString: \"YOUR_CONNECTION_STRING\",\n    ...\n    extensionConfig: {\n            [\"AppInsightsCfgSyncPlugin\"]: {\n                cfgUrl: \"\" // this will block fetching from default cdn\n            }\n    }\n}\n\n```\n\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "docs/es3_Support.md",
    "content": "## ES3/IE8 Compatibility\n\n> __ES3 / IE8 support was removed in Version 3.x (released April 2023).__\n>\n> __If you need to retain ES3 / IE8 compatibility then you will need to use one of the 2.x versions of the SDK, which is available on the old [master branch](https://github.com/Microsoft/ApplicationInsights-JS/tree/master). The 2.x branch will only receive critical bug fixes when no workaround exists — no new features or back-porting from later versions will be provided.__\n\nThe version 3.x is maintained on the default [main branch](https://github.com/Microsoft/ApplicationInsights-JS/tree/main)\n\n\nAs an SDK there are numerous users which cannot control the browsers that their customers use. As such we need to ensure that this SDK continues to \"work\" and does not break the JS execution when loaded by an older browser. While it would be ideal to just not support IE8 and older generation (ES3) browsers there are numerous large customers/users that continue to require pages to \"work\" and as noted they may or cannot control which browser that their end users choose to use.\n\nThis does NOT mean that we will only support the lowest common set of features, just that we need to maintain ES3 code compatibility and when adding new features they will need to be added in a manner that would not break ES3 Javascript parsing and added as an optional feature.\n\nAs part of enabling ES3/IE8 support we have set the ```tsconfig.json``` to ES3 and ```uglify``` settings in ```rollup.config.js``` transformations to support ie8. This provides a first level of support which blocks anyone from adding unsupported ES3 features to the code and enables the generated javascript to be validily parsed in an ES3+ environment.\n\nEnsuring that the generated code is compatible with ES3 is only the first step, JS parsers will still parse the code when an unsupport core function is used, it will just fail or throw an exception at runtime. Therefore, we also need to require/use polyfill implementations or helper functions to handle those scenarios.\n\nIt should also be noted that the overall goal of ES3/IE8 compatibility is the support at least the following 2 usage usage patterns. By supporting these two (2) basic use-cases, application/developers will be able to determine what browsers their users are using and whether they are experiencing any issues. As the SDK will report the data to the server, thus enabling the insights into whether they need to either fully support ES3/IE8 or provide some sort of browser upgrade notifications.\n\n- track()\n- trackException()\n\nBeyond terminating support for older browsers that only support ES3, (which we cannot do at this point in time) we will endeavour to maintain support for the above two (2) use-cases.\n\n### Browser must support JSON class\n\nIf your users are using a browser that does not support the [JSON](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON) Api you will need to include your own JSON polyfil implementation and this will need to be loaded prior to the application insights code.\n\nThis **includes** when running your application within an embedded browser, which on windows will default to using IE in IE7 doc mode -- which does NOT provide the JSON Api. \n\nFor this case either provide a JSON polyfil or add the [\"X-UA-Compatible\"](https://docs.microsoft.com/en-us/openspecs/ie_standards/ms-iedoco/380e2488-f5eb-4457-a07a-0cb1b6e4b4b5?redirectedfrom=MSDN) meta tag and/or a header to your hosting page so that IE will provide the expected runtime environment.\n\n```\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n \n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=11\">\n```\n\n[More details on this are available here](https://docs.microsoft.com/en-us/archive/blogs/asiatech/ie11-migration-guide-understanding-browser-mode-document-mode-user-agent-and-x-ua-compatible)\n\n### ES3/IE8 Packaging helper (ES3 rollup-plugin)\n\n> Removed for v.3, only supported for 2.x\n\nTo ensure that the system conforms to the ES3 spec, by only using ES3 compatible code we have created a rollup plugin which has 2 functions\n\n- es3Poly() finds and rewrite several commonly incompatible functions (such as Object.defineProperty; Object.getOwnPropertyDescriptor; Object.create) with inline polyfill functions that either call the real implementation or provide a basic implementation so that the scripts can be loaded and executed.\n- es3Check() finds some of the known ES3 incompatible methods and will stop the packaging process if they are identified (and have not been polyfilled by es3Poly()), this provides a semi-automated validation of not just the application insights code, but also 3rd party libraries that it uses.\n- importCheck() checks that the source code does not include imports from specific files or packages, this has been added due to packaging issues while using es3Poly causing imported type values to be renamed as \"name$$1\", which causes uglify() to missing renaming in some cases where the original source is \"name$1\". So this is being used to ensure that each source file only imports the values from packages or the original source file and not the main module export like \"index\". The importCheck can be placed before the nodeResolve() or after the es3Check() the recommendation is to fail fast be having this before the resolve. It should also be noted that only if the import is used will it appear in the final output (packagin), so it may exist in the original source but the packaging will not fail in this case.\n\nTo use these rollup plugins you simply need to add the following to your rollup.config.js\n\nTo import the module\n```\nimport { es3Poly, es3Check, importCheck } from \"@microsoft/applicationinsights-rollup-es3\";\n```\n\nAnd then include as part of the packaging plugin list, if you use es3Poly()you should always include it before es3Check() \n\n```\n    plugins: [\n      replace({ ... }),\n      importCheck({ exclude: [ \"Index\" ] }),\n      nodeResolve({ browser: false, preferBuiltins: false }),\n      es3Poly(),\n      es3Check()\n    ]\n```\n\nAll plugins take an options which allows you to add additional checks and polyfill replacements. See the [Interfaces.ts](https://github.com/microsoft/ApplicationInsights-JS/blob/master/tools/rollup-es3/src/es3/Interfaces.ts) for the definitions and [ES3Tokens.ts](https://github.com/microsoft/ApplicationInsights-JS/blob/master/tools/rollup-es3/src/es3/Es3Tokens.ts) for the default values, which should provide the examples, if we have missed some common values that you require please feel free to raise an issue or provide a PR to add as the defaults.\n\nIt should be noted at this point that the both react and react-native extensions will NOT work in an ES3/IE8 environment out of the box, primarily because of the react code and their dependencies.\nYou *may* be able to workaround this limitation by providing and your own polyfill implementations for the unsupported methods.\n\n### ES3/IE8 Features, Solutions, Workarounds and Polyfill style helper functions\n\n> Note: We will be removing our internal ES3 / IE8 support polyfills as part of the next major release 3.x.x (scheduled for mid-late 2022), so if you need to retain ES3 compatibility you will need to remain on the 2.x.x versions of the SDK or your runtime will need install polyfill's to your ES3 environment __before__ loading / initializing the SDK.\n\nAs part of contributing to the project the following table highlights all of the currently known issues and the available solution/workaround. During PR and reviewing please ensure that you do not use the unsupported feature directly and instead use (or provide) the helper, solution or workaround.\n\nThis table does not attempt to include ALL of the ES3 unsupported features, just the currently known functions that where being used at the time or writing. You are welcome to contribute to provide additional helpers, workarounds or documentation of values that should not be used.\n\n|  Feature  |  Description  |  Helper, Solution or Workaround |\n|-----------|-----------------|-----------------|\n| ```JSON.stringify(obj)``` | We have a hard requirement on JSON support, however, because of the size of adding a specific JSON polyfil just for our usage we decided not to include our own version. As such any user of this Api **MUST** include a JSON polyfil implementation, otherwise, the API simply will not work. | App/Site **MUST** provide their own JSON polyfil.\n| ```Object.keys()``` | Not provided by ES3, use the helper  | ```CoreUtils.objKeys(obj: {}): string[]``` |\n| ES5+ getters/setters<br>```Object.defineProperty(...)``` | Code will needs to created the individual getters/setters manually in a static initializer. See ```ChannelController.ts``` for example usage.<br>However, to ensure compatibility actual usage of any getters/setters internally in the primary SDK code is not permitted. They may (and should) be used in unit tests to ensure that if used they function as expected (in an ES5+ environment).| ``` CoreUtils.objDefineAccessors<T>(target:any, prop:string, getProp?:() => T, setProp?: (v:T) => void) : boolean``` |\n| ```Object.create(protoObj)``` | Not supported in an ES3 environment, use the helper or direct construct the object with SON style notation (if possible) | ```CoreUtils.objCreate(obj:object):any``` |\n| ```Object.create(protoObj, descriptorSet)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.defineProperties()``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.getOwnPropertyNames(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.getPrototypeOf(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.getOwnPropertyDescriptor(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.getOwnPropertyNames()``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.preventExtensions(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.isExtensible(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.seal(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.isSealed(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.freeze(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Object.isFrozen(obj)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Array.prototype.indexOf(...)``` | Use the provided helper | ```CoreUtils.arrIndexOf<T>(arr: T[], searchElement: T, fromIndex?: number): number``` |\n| ```Array.prototype.lastIndexOf(...)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Array.prototype.every(...)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Array.prototype.some(...)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Array.prototype.forEach(...)``` | Use the provided helper. | ```arrForEach<T>(arr: T[], callbackfn: (value: T, index?: number, array?: T[]) => void, thisArg?: any):void``` |\n| ```Array.prototype.map(...)``` | Use the provided helper. | ```CoreUtils.arrMap<T,R>(arr: T[], callbackfn: (value: T, index?: number, array?: T[]) => R, thisArg?: any): R[]``` |\n| ```Array.prototype.filter(...)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Array.prototype.reduce(...)``` | Use the provided helper. | ```CoreUtils.arrReduce<T,R>(arr: T[], callbackfn: (previousValue: T|R, currentValue?: T, currentIndex?: number, array?: T[]) => R, initialValue?: R): R``` |\n| ```Array.prototype.reduceRight(...)``` | Not supported and no provided workaround/solution. | N/A |\n| ```Date.prototype.toISOString()``` | Use the provided helper | ```CoreUtils.toISOString(date: Date)``` |\n| ```Date.now()``` | Use the provided helper | ```CoreUtils.dateNow()``` |\n| ```performance.now()``` | Use the provided helper for the Performance Api now function. | ```CoreUtils.perfNow()``` |\n"
  },
  {
    "path": "docs/exceptionTelemetry.md",
    "content": "## Add More Information to Exception Telemetry\n\nTo enhance the detail and usefulness of exception telemetry in your application, you can configure additional settings through the `IExceptionConfig` interface. This allows for more comprehensive data to be included when exceptions are sent, such as scripts loaded on the page.\n\n### Configuration\n\n| Property | Type | Default | Description |\n| --- | --- | --- | --- |\n| expCfg | [`IExceptionConfig`](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IExceptionConfig.html) | `undefined` | Set additional configuration for exceptions, such as more scripts to include in the exception telemetry. |\n\n### Example Usage\n```js\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n        expCfg: {\n            inclScripts: true,\n            expLog : () => {\n                return {logs: [\"log info 1\", \"log info 2\"]};\n            },\n            maxLogs : 100\n        }\n    }\n});\nappInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n```\n\n### Where could I find those extra information?\nThe extra info is added as properties into exception Telemetry.\nFor script information, it would be stored under properties[exceptionScripts].\nFor log information, it would be stored under properties[exceptionLog].\nYou could find the info as shown in the pic:\n![alt text](./img/exceptionTelemetry.png)"
  },
  {
    "path": "docs/upgrade/MergeCommonToCore.md",
    "content": "# Migrating from @microsoft/applicationinsights-common to @microsoft/applicationinsights-core-js\n\n## Overview\n\nAs of version 3.4.0, the `@microsoft/applicationinsights-common` package has been merged into \n`@microsoft/applicationinsights-core-js`. This consolidation simplifies the dependency tree \nand improves tree-shaking capabilities while maintaining full backward compatibility.\n\n## What Changed?\n\n- All functionality from `applicationinsights-common` is now exported from `applicationinsights-core-js`\n- The `applicationinsights-common` package still exists as a compatibility layer (re-exports from Core)\n- No breaking changes to public APIs\n- All imports work the same, just from a different package\n\n## Migration Steps\n\n### Step 1: Update Dependencies\n\nIn your `package.json`:\n\n```json\n{\n  \"dependencies\": {\n    // Before\n    \"@microsoft/applicationinsights-common\": \"3.3.11\",\n    \"@microsoft/applicationinsights-core-js\": \"3.3.11\"\n    \n    // After\n    \"@microsoft/applicationinsights-core-js\": \"3.4.0\"\n    // Remove applicationinsights-common dependency\n  }\n}\n```\n\n### Step 2: Update Imports\n\nFind and replace in your source files:\n\n```typescript\n// Before\nimport { IConfig, ContextTagKeys, Event } from \"@microsoft/applicationinsights-common\";\n\n// After\nimport { IConfig, ContextTagKeys, Event } from \"@microsoft/applicationinsights-core-js\";\n```\n\n### Automated Migration\n\nYou can use a script to automate the migration:\n\n```bash\n# Replace imports in TypeScript files\nfind ./src -name \"*.ts\" -exec sed -i 's/@microsoft\\/applicationinsights-common/@microsoft\\/applicationinsights-core-js/g' {} +\n\n# Update package.json manually or with jq\n```\n\n## Do I Need to Migrate Immediately?\n\n**No.** The `applicationinsights-common` package will continue to work through version 3.x as a \ncompatibility layer. However, we recommend migrating when convenient as:\n\n- The Common package will be removed in version 4.0.0\n- Direct Core imports result in smaller bundles (better tree-shaking)\n- Future features will only be added to Core\n\n## Timeline\n\n- **Version 3.4.0** (Current): Common merged into Core, compatibility layer introduced\n- **Version 3.x** (Ongoing): Both import styles supported\n- **Version 4.0.0** (Future): Common package removed, Core imports required\n\n## What If I Can't Migrate Yet?\n\nThe compatibility layer ensures your code continues to work without changes. However:\n\n1. Your bundle may be slightly larger (includes the re-export layer)\n2. You may see deprecation warnings in development\n3. You'll need to migrate before upgrading to version 4.0.0\n\n## Troubleshooting\n\n### TypeScript Type Errors\n\nIf you encounter type errors after migration:\n\n1. Ensure `@microsoft/applicationinsights-core-js` is version 3.4.0 or higher\n2. Remove `@microsoft/applicationinsights-common` from dependencies\n3. Clear `node_modules` and reinstall: `rm -rf node_modules && npm install`\n4. Restart TypeScript server in your IDE\n\n### Import Not Found\n\nIf an import can't be found:\n\n1. Verify the export exists in Core 3.4.0+\n2. Check for typos in import names\n3. Ensure you're importing from `@microsoft/applicationinsights-core-js`\n\n### Bundle Size Increased\n\nIf your bundle size increased after migration:\n\n1. Ensure you're using `@microsoft/applicationinsights-core-js` 3.4.0+\n2. Remove `@microsoft/applicationinsights-common` from package.json\n3. Rebuild with tree-shaking enabled\n4. Check for unused imports and remove them\n\n## Need Help?\n\n- 📖 [Full Documentation](https://github.com/microsoft/ApplicationInsights-JS)\n- 🐛 [Report Issues](https://github.com/microsoft/ApplicationInsights-JS/issues)\n- 💬 [Discussions](https://github.com/microsoft/ApplicationInsights-JS/discussions)\n"
  },
  {
    "path": "docs/upgrade/v2_UpgradeGuide.md",
    "content": "## Upgrading from v1.x -> v2.x of Application Insights\n\nBreaking changes in the SDK V2 version:\n- To allow for better API signatures, some of the apis such as trackPageView, trackException have been updated.\n- ES3 (IE8) compatibility, while running in IE8 or lower versions of the browser is not an officially supported scenario we are working to maintain ES3 level compatibility to ensure that the SDK will not cause any unexpected failures due to Javascript parsing error. See [ES3/IE8 Compatibility](../es3_Support.md) below for further information.\n- Telemetry envelope has field name and structure changes due to data schema updates.\n- Moved `context.operation` to `context.telemetryTrace`. Some fields were also changed (`operation.id` --> `telemetryTrace.traceID`)\n  - If you want to maunally refresh the current pageview id (e.g. in SPA apps) this can be done with `appInsights.context.telemetryTrace.traceID = generateW3CId()`\n\nIf you are using the current application insights PRODUCTION SDK (1.0.20) and want to see if the new SDK works in runtime, please update URL depending on your current SDK loading scenario:\n\n**a)** Download via CDN scenario:\n    Update code snippet that you currently use to point to the following URL:\n    ```\n    \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\"\n    ```\n\n**b)** NPM scenario:\n    Call downloadAndSetup to download full ApplicationInsights script from CDN and initialize it with connection string.\n\n```ts\nappInsights.downloadAndSetup({\n    connectionString: \"InstrumentationKey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx\",\n    url: \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\"\n});\n```\n\nTest in internal environment to verify monitoring telemetry is working as expected. If all works, please update your api signatures appropriately to SDK V2 version and deploy in your production environments.\n"
  },
  {
    "path": "docs/upgrade/v3_BreakingChanges.md",
    "content": "# V3.x Upgrade Breaking Changes (from v2.x))\n\nSome of the major changes include\n\n- Added support for dynamic (reactive) configuration changes after initialization\n- Removed ES3 / IE8 Support, now only supports ES5 / IE9+\n- Removed V1 API Backward Compatibility, Upgrading from V1 -> V3 is NOT supported and will require code changes in your application if you use the previous V1 API functions\n- Requires Object.defineProperty support, the SDK now uses [Object.defineProperty](https://caniuse.com/?search=defineProperty) quite heavily and therefore support is limited to runtimes correctly implement this functionality. Without this the SDK will not function correctly.\n- Many (mostly unused) exports from the NPM packages have been removed.\n\nThis document has attempted to identify all of the major breaking and behavior changes, it may be incomplete. If you encounter an issue that has not been documented please [create an issue](https://github.com/microsoft/ApplicationInsights-JS/issues/new/choose) and we will review to determine whether this was unexpected and should be fixed or if it needs to be documented.\n\n## Extensions build for v2.x\n\nIf the extension is 100% self contained (all referenced code is included in it's own bundle), then apart from some TypeScript typing warnings / errors the SDK will load and initialize the plugin. It will most likely not support some of the newer functionality like dynamic configuration changes, complete unloading and removal.\n\nHowever, for any extensions that contain references to the core components (import / require) the core components WILL likely not work with the v3.x (because of the breaking changes) and will need to be updated to use the external helpers or the alternate functions.\n\n## Removed ES3 (IE8) Support\n\nPrevious internal polyfills for JavaScript features that are supported by ES5 are no longer included.\n\nAs part of packaging ES3 reserved word usage (\"catch\") is not longer wrapped, this WILL cause the SDK to fail to load in an ES3 environment.\n\nThe SDK still uses internal polyfills for ES5 features that are not supported by IE9-11 (like. Symbol).\n\nIf your application is required to maintain support for IE8 (ES3) you WILL need to continue to use the latest v2.x (Supported) releases.\n\n## Configuration changes\n\n| Configuration | Change\n|---------------|-----------------\n| `enableDebugExceptions` | This configuration has been removed and now only `enableDebug` is not used, as previously documented for v2\n\n## Behavior changes\n\n| Function       | Change\n|----------------|--------------\n| strStartsWith  | This is now uses the native [startsWith](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith) or a [polyfill if required](https://caniuse.com/?search=startsWith) that conforms the same functionality which will throw a TypeError for `null`, `undefined` values\n| strEndsWith  | This is now uses the native [endsWith](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith) or a [polyfill if required](https://caniuse.com/?search=endsWith) that conforms the same functionality which will throw a TypeError for `null`, `undefined` values\n\n| IAppInsightsCore   | Details\n|--------------------|--------------------\n| pollInternalLogs() | This now returns an ITimerHandler interface with a `cancel()` function rather than the `number` returned from the `setInternal()`.<br/>It is also now called automatically at the end of core `initialize` rather than being explicitly called via `snippet` initialization and `loadAppInsights`, this is a minor execution order change.\n\n## AISKU\n\n- V1 Snippet Usage\n- All V1 API Compatibility Support\n\n| V1 API | Details\n|-----------|---------------------\n| trackPageView | Use V2 API<br/>`trackPageView(pageView?: IPageViewTelemetry)`<br/><br/>V1 Removed<br/> `track(name?: string, url?: string, properties?: {[key: string]: string }, measurements?: {[key: string]: number }, duration?: number)`\n| trackEvent | Use V2 API<br/>`trackEvent(event: IEventTelemetry, customProperties?: ICustomProperties)`<br/><br />V1 Removed<br /> `trackEvent(name: string, properties?: Object, measurements?: Object)`\n| trackDependency | Use V2 API<br/>`trackDependencyData(dependency: IDependencyTelemetry)`<br/><br/>V1 Removed<br/>`trackDependency(id: string, method: string, absoluteUrl: string, pathName: string, totalTime: number, success: boolean, resultCode: number)`\n| trackException | Use V2 API<br/>`trackException(exception: IExceptionTelemetry, customProperties?: ICustomProperties)`<br/><br/> V1 Removed<br/> `trackException(exception: Error, handledAt?: string, properties?: { [name: string]: string; }, measurements?: { [name: string]: number; }, severityLevel?: any)`\n| trackMetric | Use V2 API<br/>`trackMetric(metric: IMetricTelemetry, customProperties?: ICustomProperties)`<br/><br />V1 Removed<br/> `trackMetric(name: string, average: number, sampleCount?: number, min?: number, max?: number, properties?: { [name: string]: string; })`\n| trackTrace | Use V2 API<br/>`trackTrace(trace: ITraceTelemetry, customProperties?: ICustomProperties)`<br/><br />V1 Removed<br/> `trackTrace(message: string, properties?: { [name: string]: string; }, severityLevel?: any)`\n| _onerror | Use V2 API<br/>`_onerror(exception: IAutoExceptionTelemetry)`<br/><br />V1 Removed<br/> `_onerror(message: string, url: string, lineNumber: number, columnNumber: number, error: Error)`\n| downloadAndSetup | Removed\n\n#### Exported Globals (NPM)\n\n- Telemetry\n- ICoreUtils; CoreUtils\n- IUtil; Util\n- ICorrelationIdHelper\n- IUrlHelper\n- IDateTimeUtils\n- DataSanitizer (from common module)\n- IDataSanitizer (from common module)\n\n#### Exported Globals (CDN)\n\nThe previously exported namespaced globals have been replaced with a reduced set of individual functions (Which where also exported by v2.8.x)\n\n> Note: Until the final release all of these \"Removed\" or \"New Access\" are subject to be changed. You should not be using the published `beta` for validation purposes and not in a production environment.\n\n<table>\n<thead>\n<tr><th colspan=\"2\">Previous CDN namespace / access</th><th>Replacement new access</th></tr>\n</thead>\n<tbody>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry</code></td><td>Removed</td></tr>\n<tr><td></td><td>BreezeChannelIdentifier</td><td><code>Microsoft.ApplicationInsights.</code>BreezeChannelIdentifier</td></tr>\n<tr><td></td><td>PropertiesPluginIdentifier</td><td><code>Microsoft.ApplicationInsights.</code>PropertiesPluginIdentifier</td></tr>\n<tr><td></td><td>AnalyticsPluginIdentifier</td><td><code>Microsoft.ApplicationInsights.</code>AnalyticsPluginIdentifier</td></tr>\n<tr><td></td><td>DisabledPropertyName</td><td><code>Microsoft.ApplicationInsights.</code>DisabledPropertyName</td></tr>\n<tr><td></td><td>ProcessLegacy</td><td>Removed</td></tr>\n<tr><td></td><td>SampleRate</td><td>\"sampleRate\"</td></tr>\n<tr><td></td><td>HttpMethod</td><td>\"http.method\"</td></tr>\n<tr><td></td><td>DEFAULT_BREEZE_ENDPOINT</td><td><code>Microsoft.ApplicationInsights.</code>DEFAULT_BREEZE_ENDPOINT</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Util</code></td><td>Removed</td></tr>\n<tr><td></td><td>NotSpecified</td><td>Removed</td></tr>\n<tr><td></td><td>createDomEvent</td><td>Removed</td></tr>\n<tr><td></td><td>disableStorage</td><td>Removed</td></tr>\n<tr><td></td><td>isInternalApplicationInsightsEndpoint</td><td>Removed</td></tr>\n<tr><td></td><td>canUseLocalStorage</td><td>Removed</td></tr>\n<tr><td></td><td>getStorage</td><td>Removed</td></tr>\n<tr><td></td><td>setStorage</td><td>Removed</td></tr>\n<tr><td></td><td>removeStorage</td><td>Removed</td></tr>\n<tr><td></td><td>canUseSessionStorage</td><td>Removed</td></tr>\n<tr><td></td><td>getSessionStorageKeys</td><td>Removed</td></tr>\n<tr><td></td><td>getSessionStorage</td><td>Removed</td></tr>\n<tr><td></td><td>setSessionStorage</td><td>Removed</td></tr>\n<tr><td></td><td>removeSessionStorage</td><td>Removed</td></tr>\n<tr><td></td><td>disableCookies</td><td>Removed</td></tr>\n<tr><td></td><td>canUseCookies</td><td>Removed</td></tr>\n<tr><td></td><td>disallowsSameSiteNone</td><td>Removed</td></tr>\n<tr><td></td><td>setCookie</td><td>Removed</td></tr>\n<tr><td></td><td>stringToBoolOrDefault</td><td>Removed</td></tr>\n<tr><td></td><td>getCookie</td><td>Removed</td></tr>\n<tr><td></td><td>deleteCookie</td><td>Removed</td></tr>\n<tr><td></td><td>trim</td><td>Removed</td></tr>\n<tr><td></td><td>newId</td><td><code>Microsoft.ApplicationInsights.</code>newId</td></tr>\n<tr><td></td><td>random32</td><td><code>Microsoft.ApplicationInsights.</code>random32</td></tr>\n<tr><td></td><td>generateW3CId</td><td><code>Microsoft.ApplicationInsights.</code>generateW3CId</td></tr>\n<tr><td></td><td>isArray</td><td>Removed</td></tr>\n<tr><td></td><td>isError</td><td>Removed</td></tr>\n<tr><td></td><td>isDate</td><td>Removed</td></tr>\n<tr><td></td><td>toISOStringForIE8</td><td>Removed</td></tr>\n<tr><td></td><td>getIEVersion</td><td>Removed</td></tr>\n<tr><td></td><td>msToTimeSpan</td><td>Removed</td></tr>\n<tr><td></td><td>isCrossOriginError</td><td>Removed</td></tr>\n<tr><td></td><td>dump</td><td>Removed</td></tr>\n<tr><td></td><td>getExceptionName</td><td>Removed</td></tr>\n<tr><td></td><td>addEventHandler</td><td><code>Microsoft.ApplicationInsights.</code>addEventHandler</td></tr>\n<tr><td></td><td>removeEventHandler</td><td><code>Microsoft.ApplicationInsights.</code>removeEventHandler</td></tr>\n<tr><td></td><td>IsBeaconApiSupported</td><td><code>Microsoft.ApplicationInsights.</code>IsBeaconApiSupported</td></tr>\n<tr><td></td><td>getExtension</td><td><code>appInsights.getPlugin(\"&lt;plugin id&gt;\")?.plugin</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.CorrelationIdHelper</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.UrlHelper</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.DateTimeUtils</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.ConnectionStringParser</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.FieldType (enum)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.RequestHeaders (enum)</code></td><td><code>Microsoft.ApplicationInsights.</code>RequestHeaders</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Envelope (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Event (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Exception (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Metric (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.PageView (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.RemoteDependencyData (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Trace (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.PageViewPerformance (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Data (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.SeverityLevel (enum)</code></td><td><code>Microsoft.ApplicationInsights.</code>SeverityLevel</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.ConfigurationManager (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.ContextTagKeys (class)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.DataSanitizer</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.TelemetryItemCreator</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.CtxTagKeys</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.Extensions (enum)</code></td><td>Removed</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Telemetry.DistributedTracingMode (enum)</code></td><td><code>Microsoft.ApplicationInsights.</code>DistributedTracingMode</td></tr>\n<tr><td colspan=\"2\"><code>Microsoft.ApplicationInsights.Util</code></td><td>Removed: see <code>Microsoft.ApplicationInsights.Telemetry.Util</td></tr>\n</tbody>\n</table>\n\n### AISKU Light\n\n#### V2 API Changes\n\n| V1 API    | Details\n|-----------|---------------------\n| getSKUDefaults | Removed in V2\n\n#### Exported Globals\n\n- CoreUtils\n\n### @microsoft/applicationinsights-common\n\n#### Exported Globals (NPM)\n\n- IUtil; Util\n  - Use the individual `utl` prefixed functions that are also exported in later v2 releases documented in the [Tree Shaking Recommendations](https://github.com/microsoft/ApplicationInsights-JS/blob/main/TreeShakingRecommendations.md).\n- ICorrelationIdHelper; CorrelationIdHelper\n  - Use the individual `correlationId` prefixed functions that are also exported in later v2 releases documented in the [Tree Shaking Recommendations](https://github.com/microsoft/ApplicationInsights-JS/blob/main/TreeShakingRecommendations.md).\n- IDateTimeUtils; DateTimeUtils;\n  - Use the individual `dateTimeUtils` prefixed functions that are also exported in later v2 releases documented in the [Tree Shaking Recommendations](https://github.com/microsoft/ApplicationInsights-JS/blob/main/TreeShakingRecommendations.md).\n- IUrlHelper; UrlHelper\n  - Use the individual `url` prefixed functions that are also exported in later v2 releases documented in the [Tree Shaking Recommendations](https://github.com/microsoft/ApplicationInsights-JS/blob/main/TreeShakingRecommendations.md).\n- IDataSanitizer, DataSanitizer\n  - Use the individual `dataSanitizer` prefixed functions that are also exported in later v2 releases documented in the [Tree Shaking Recommendations](https://github.com/microsoft/ApplicationInsights-JS/blob/main/TreeShakingRecommendations.md).\n\n### @microsoft/applicationinsights-core-js\n\nAll previously `@deprecated` marked functions and the legacy \"global\" cookie handling functions\n#### Exported Globals (NPM)\n\n- BaseCore\n  - Use `AppInsightsCore` (`AppInsightsCore` and `BaseCore` are now merged)\n- ICoreUtils; CoreUtils\n  - See the replacements documented in the [Tree Shaking Recommendations](https://microsoft.github.io/ApplicationInsights-JS/TreeShakingRecommendations.html).\n- IEventHelper; EventHelper\n  - See the replacements documented in the [Tree Shaking Recommendations](https://github.com/microsoft/ApplicationInsights-JS/blob/main/TreeShakingRecommendations.md).\n- EnumMap, createEnumMap\n  - Removed as not used internally, use the ts-utils support versions if required\n-`hasOwnProperty()`\n  - use `objHasOwnProperty()`\n\n#### Exposed Runtime configuration values\n\n- `config.extensionConfig.NotificationManager` In eariler versions this was assigned to the current notification manager, this is now removed\n  - You can access the current notification manager via `core.getNotifyMgr()` which is more reliable as it will lazily create an instance if one is currently not assigned.\n\n##### Removed no replacement\n\n__Functions__\n\n- disableCookies\n- canUseCookies\n- getCookie\n- setCookie\n- deleteCookie\n- _legacyCookieMgr\n\n__Classes__\n\n- `BaseCore`\n\n## Browser Support\n\nMinimum JavaScript Language Specification: ES5\n\n![Chrome](https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![IE](https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | ![Opera](https://raw.githubusercontent.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Safari](https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png)\n--- | --- | --- | --- | --- |\nLatest ✔ | Latest ✔ | 9+ Full ✔ | Latest ✔ | Latest ✔ |\n\n> Note: ES3/IE8 compatibility has been <u>__removed__</u>, so if you need to retain ES3 compatibility you will need to remain on the 2.x.x versions of the SDK."
  },
  {
    "path": "docs/webSdk/README.md",
    "content": "# API Documentation\n\nPlaceholder for auto-generated API documentation\n\n\n## Sku\n\n[Application Insights Web Sku](./applicationinsights-web/index.html)\n\n[Microsoft Application Insights JavaScript SDK - Web Basic](./applicationinsights-web-basic/index.html)\n\n## Components\n\n[Application Insights Core](./applicationinsights-core-js/index.html) - The main core package, required and used by all SKUs, components, and extensions.\n\n\n[1DS Post Channel](./1ds-post-js/index.html)\n\n[Microsoft Application Insights JavaScript SDK Offline Channel](./applicationinsights-offlinechannel-js/index.html)\n\n[Application Insights JavaScript SDK Channel](./applicationinsights-channel-js/index.html)\n\n[Application Insights JavaScript SDK Tee Channel](./applicationinsights-teechannel-js/index.html)\n\n### Deprecated Packages\n\n[1DS Core](./1ds-core-js/index.html)\n\n[Application Insights Common](./applicationinsights-common/index.html)\n\n## Extensions\n\n[Web Analytics](./applicationinsights-analytics-js/index.html)\n\n[CfgSync Plugin](./applicationinsights-cfgsync-js/index.html)\n\n[Click Analytics extension](./applicationinsights-clickanalytics-js/index.html)\n\n[OS Plugin extension](./applicationinsights-osplugin-js/index.html)\n\n[Debug Plugin extension](./applicationinsights-debugplugin-js/index.html)\n\n[XHR dependencies plugin](./applicationinsights-dependencies-js/index.html)\n\n[Performance Mark and Measure Manager plugin](./applicationinsights-perfmarkmeasure-js/index.html)\n\n[Properties plugin](./applicationinsights-properties-js/index.html)\n\n## tools\n\n[Web Snippet](./applicationinsights-web-snippet/index.html)"
  },
  {
    "path": "examples/AISKU/README.md",
    "content": "# Application Insights JavaScript SDK\n\n## AISKU Sample\n\nThis Sample shows how to track [`pageview`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#trackpageview), [`event`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#trackevent), [`trace`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#tracktrace), [`metric`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#trackmetric), [`exception`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#trackexception), get cookies details by using `cookieMgr` and record event duration manually by using `startTrackEvent` and `stopTrackEvent`.\n\n## Sample Build\n\n- Build the repository before running this example.\n- Run `npm run serve` under root folder.\n- Open `http://localhost:9001/examples/AISKU/`.\n\n## Description\n\n- button `Change Config` will change config dynamically.\n- button `Create Pageview` will trigger a pageview telemetry.\n- button `Create Event` will trigger an event telemetry.\n- button `Create Trace` will trigger a trace telemetry.\n- button `Create Metric` will trigger a metric telemetry.\n- button `Create Exception` will trigger an exception telemetry.\n- button `Start Tracking event` will start timing an event with given name `manual_record_event`\n- button `Stop Tracking event` will stop timing the previous event with given name `manual_record_event`.\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit <https://cla.microsoft.com>.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at [here](https://go.microsoft.com/fwlink/?LinkID=824704). You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft’s Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\nMIT\n"
  },
  {
    "path": "examples/AISKU/index.html",
    "content": "<!DOCTYPE html>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>AISKU Sample</title>\n    <link rel=\"stylesheet\" href=\"style/style.css\"/>\n    <script type=\"text/javascript\">\n      var connectionString = \"YOUR_CONNECTION_STRING\";\n    </script>\n\n    <!-- use this section for snippet Initialization -->\n    <!-- <script type=\"text/javascript\">!function(T,l,y){var S=T.location,k=\"script\",D=\"instrumentationKey\",C=\"ingestionendpoint\",I=\"disableExceptionTracking\",E=\"ai.device.\",b=\"toLowerCase\",w=\"crossOrigin\",N=\"POST\",e=\"appInsightsSDK\",t=y.name||\"appInsights\";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:\"5\",version:2,config:d};function v(e,t){var n={},a=\"Browser\";return n[E+\"id\"]=a[b](),n[E+\"type\"]=a,n[\"ai.operation.name\"]=S&&S.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=\"\"+e;return 1===t.length&&(t=\"0\"+t),t}return e.getUTCFullYear()+\"-\"+t(1+e.getUTCMonth())+\"-\"+t(e.getUTCDate())+\"T\"+t(e.getUTCHours())+\":\"+t(e.getUTCMinutes())+\":\"+t(e.getUTCSeconds())+\".\"+((e.getUTCMilliseconds()/1e3).toFixed(3)+\"\").slice(2,5)+\"Z\"}(),iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(\";\"),a=0;a<n.length;a++){var i=n[a].split(\"=\");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]=\"https://\"+(o?o+\".\":\"\")+\"dc.\"+(r||\"services.visualstudio.com\")}return e}(),c=s[D]||d[D]||\"\",u=s[C],p=u?u+\"/v2/track\":d.endpointUrl,(l=[]).push((n=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=t,i=p,(o=(r=v(c,\"Exception\")).data).baseType=\"ExceptionData\",o.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:n.replace(/\\./g,\"-\"),hasFullStack:!1,stack:n+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(S&&S.pathname||\"_unknown_\")+\"\\nEndpoint: \"+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,\"Message\"),r=i.data;r.baseType=\"MessageData\";var o=r.baseData;return o.message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+n+\")\").replace(/\\\"/g,\"\")+'\"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:\"cors\"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader(\"Content-type\",\"application/json\"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&\"\"!==e||\"undefined\"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){\"loaded\"!==n.readyState&&\"complete\"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName(\"head\")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n=\"track\",r=\"TrackPage\",o=\"TrackEvent\";t([n+\"Event\",n+\"PageView\",n+\"Exception\",n+\"Trace\",n+\"DependencyData\",n+\"Metric\",n+\"PageViewPerformance\",\"start\"+r,\"stop\"+r,\"start\"+o,\"stop\"+o,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c=\"onerror\";t([\"_\"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m[\"_\"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{\n        src: \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\", // The SDK URL Source for the CDN\n        crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n        cfg: { // Application Insights Configuration\n          connectionString: connectionString\n        }});\n    </script> -->\n    \n  </head>\n  <body>\n    <h1>Microsoft Application Insights JavaScript SDK - AISKU</h1>\n    <!-- this script is for local build testing -->\n    <script src=\"../../AISKU/dist/es5/applicationinsights-web.js\"></script>\n    <script>\n      let appInsights = new Microsoft.ApplicationInsights.ApplicationInsights({ config: {connectionString: \"InstrumentationKey=key123\", disableInstrumentationKeyValidation: true}});\n      appInsights.loadAppInsights();\n      window.appInsights = appInsights;\n    </script>\n    <script src=\"./browser/es5/aisku-example-index.gbl.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "examples/AISKU/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-example-aisku\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights AISKU Example\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\",\n        \"example\"\n    ],\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser\",\n        \"build:esm\": \"grunt example-aisku\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"mintest\": \"\",\n        \"perftest\": \"\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"ai-min\": \"\",\n        \"ai-restore\": \"\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/examples/AISKU\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-web\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "examples/AISKU/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport cleanup from \"rollup-plugin-cleanup\";\nimport dynamicRemove from \"@microsoft/dynamicproto-js/tools/rollup/dist/node/removedynamic\";\nimport { es5Poly, es5Check, importCheck } from \"@microsoft/applicationinsights-rollup-es5\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\n\nconst workerName = \"aisku-example-index\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK Example - AISKU, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nfunction doCleanup() {\n  return cleanup({\n    comments: [\n      'some', \n      /^.\\s*@DynamicProtoStub/i,\n      /^\\*\\*\\s*@class\\s*$/\n    ]\n  })\n}\n\nconst browserRollupConfigFactory = (name, isProduction, format = \"umd\", extension = \"\") => {\n  const browserRollupConfig = {\n    input: `dist-es5/${name}.js`,\n    output: {\n      file: `browser/es5/${name}${extension ? \".\" +extension : \"\"}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights.Example\",\n      extend: true,\n      freeze: false,\n      sourcemap: true\n    },\n    treeshake: {\n      propertyReadSideEffects: false,\n      moduleSideEffects: false,\n      tryCatchDeoptimization: false,\n      correctVarValueBeforeDeclaration: false\n    },\n    plugins: [\n      dynamicRemove(),\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: replaceValues\n      }),\n      // This just makes sure we are importing the example dependencies correctly\n      importCheck({ exclude: [ \"aisku-example-index\" ] }),\n      nodeResolve({\n        module: true,\n        browser: true,\n        preferBuiltins: false\n      }),\n      doCleanup(),\n      es5Poly(),\n      es5Check()\n    ]\n  };\n\n  if (isProduction) {\n    browserRollupConfig.output.file = `browser/${name}${extension ? \".\" +extension : \"\"}.min.js`;\n    browserRollupConfig.plugins.push(\n      uglify({\n        ie8: false,\n        ie: true,\n        compress: {\n          ie: true,\n          passes:3,\n          unsafe: true,\n        },\n        output: {\n          ie: true,\n          preamble: banner,\n          webkit:true\n        }\n      })\n    );\n  }\n\n  return browserRollupConfig;\n};\n\nupdateDistEsmFiles(replaceValues, banner);\n\nexport default [\n  browserRollupConfigFactory(workerName, false, \"iife\", \"gbl\")\n];\n"
  },
  {
    "path": "examples/AISKU/src/aisku-example-index.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { addTelemetryInitializer, changeConfig, eventItem, getConfig, getCookieMgr, initApplicationInsights, metricItem, pageviewItem, startTrackEvent, stopTrackEvent, traceItem, trackEvent, trackMetric, trackPageView, trackTrace } from \"./aisku-init\";\nimport { ai_session, ai_user, buttonSectionId, clearDetailsList, clearEle, configContainerId, configDetails, cookieWatchList, createButton, createContainers, createDetailList, detailsContainerId, detailsWatchList, manual_event, triggerException } from \"./utils\";\n\nfunction createPageviewTracks() {\n    trackPageView(pageviewItem);\n}\n\nfunction createEventTracks() {\n    trackEvent(eventItem, {prop2: \"prop2\"});\n}\n\nfunction startEvent() {\n    startTrackEvent(manual_event);\n}\n\n\nfunction stopEvent() {\n    stopTrackEvent(manual_event, {prop:\"prop\"}, {metric: 1});\n}\n\nfunction createTraceTracks() {\n    trackTrace(traceItem);\n}\n\nfunction createMetricTracks() {\n    trackMetric(metricItem, {prop2: \"prop2\"});\n}\n\nfunction getCookieMgrdetails() {\n    let cookieMgr = getCookieMgr();\n    if(cookieMgr) {\n        let details =  {\n            isEnabled: cookieMgr.isEnabled(),\n            ai_session: cookieMgr.get(ai_session),\n            ai_user: cookieMgr.get(ai_user)\n        } as any;\n        createDetailList(cookieWatchList, details, detailsContainerId, \"Cookie\");\n    }\n}\n\nfunction addTelemetryListener() {\n    addTelemetryInitializer((env: any) => {\n        console.log(\"The following Event is triggered.\");\n        console.log(env);\n\n        createDetailList(detailsWatchList, env, detailsContainerId, \"Telemetry\");\n    });\n}\n\nfunction createConfigDetails() {\n    let config = getConfig();\n    clearEle(configContainerId);\n    createDetailList(configDetails, config, configContainerId, \"Config\");\n}\n\nfunction changeConfigOnClick() {\n    changeConfig();\n    createConfigDetails();\n}\n\n\nfunction createButtonSection() {\n    let container = document.getElementById(buttonSectionId);\n    let changeConfigBtn = createButton(\"Change Config\",  changeConfigOnClick);\n    let pageviewButton = createButton(\"Create Pageview\", createPageviewTracks);\n    let eventButton = createButton(\"Create Event\", createEventTracks);\n    let startButton = createButton(\"Start Tracking Event\", startEvent);\n    let stopButton = createButton(\"Stop Tracking Event\", stopEvent);\n    let traceButton = createButton(\"Create Trace\", createTraceTracks);\n    let metricButton = createButton(\"Create Metric\", createMetricTracks);\n    let exceptionButton = createButton(\"Create Exception\", triggerException);\n    let cookieButton = createButton(\"Get Cookie\", getCookieMgrdetails);\n    let clearButton = createButton(\"Clear Details\", clearDetailsList);\n    let buttons = [changeConfigBtn, pageviewButton, eventButton, traceButton, metricButton, startButton, stopButton, exceptionButton, cookieButton, clearButton];\n    buttons.forEach(ele => {\n        container?.appendChild(ele);\n    });\n}\n\nfunction analyticsSample() {\n    initApplicationInsights();\n    createContainers();\n    addTelemetryListener();\n    createButtonSection();\n    createConfigDetails();\n}\nanalyticsSample();\n\n\n"
  },
  {
    "path": "examples/AISKU/src/aisku-init.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ApplicationInsights, IConfiguration, IEventTelemetry, IMetricTelemetry, IPageViewTelemetry, ITraceTelemetry } from \"@microsoft/applicationinsights-web\";\nimport { generateNewConfig } from \"./utils\";\nimport { runTargetUnload } from \"@microsoft/applicationinsights-core-js\";\n\n\n// ******************************************************************************************************************************\n// Snippet Initialization. If you want to use NPM initialization, replace this section with the NPM Initialization section at the end.\nlet _appInsights: any;\n\nexport function initApplicationInsights(config: IConfiguration = {}) {\n    \n    if (!_appInsights) {\n        _appInsights =  (window as any).appInsights;\n        return _appInsights;\n    }\n\n    _appInsights = new ApplicationInsights({\n        config: config\n    });\n    \n    _appInsights.loadAppInsights();\n    _appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n\n    return _appInsights;\n}\n\n// ***********************************************************************************************************************************\n\n\n/**\n * Unload the SDK if it has been initialized\n * @returns\n */\nexport function unloadApplicationInsights() {\n    if (_appInsights) {\n        runTargetUnload(_appInsights);\n        _appInsights = null;\n        return true;\n    }\n    return false;\n}\n\n/**\n * Request a page view request if the SDK has been initialized\n */\nexport function trackPageView(pageView?: IPageViewTelemetry) {\n    if (_appInsights) {\n        _appInsights.trackPageView(pageView);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Log a custom event if the SDK has been initialized\n */\nexport function trackEvent(event: IEventTelemetry, customProperties?: {[key: string]: any;} ) {\n    if (_appInsights) {\n        _appInsights.trackEvent(event, customProperties);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Start timing an event with given name if the SDK has been initialized\n */\nexport function startTrackEvent(name?: string) {\n    if (_appInsights) {\n        _appInsights.startTrackEvent(name);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Stop timing an event with given name if the SDK has been initialized\n */\nexport function stopTrackEvent(name: string, properties?: { [key: string]: string; }, measurements?: { [key: string]: number; }) {\n    if (_appInsights) {\n        _appInsights.stopTrackEvent(name, properties, measurements);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Log traces if the SDK has been initialized\n * Typically used to send regular reports of performance indicators\n */\nexport function trackTrace(trace: ITraceTelemetry) {\n    if (_appInsights) {\n        _appInsights.trackTrace(trace);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Log Metric if the SDK has been initialized\n */\nexport function trackMetric(metric: IMetricTelemetry, customProperties?: {[name: string]: any}) {\n    if (_appInsights) {\n        _appInsights.trackMetric(metric, customProperties);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Adds a telemetry initializer to the collection if the SDK has been initialized\n * Telemetry initializers will be called before the telemetry item is pushed for sending\n */\nexport function addTelemetryInitializer(telemetryInitializer: (item: any) => boolean | void) {\n    if (_appInsights) {\n        \n        _appInsights.addTelemetryInitializer(telemetryInitializer);\n        return true;\n    }\n    return false;\n}\n\n/**\n * Use getCookieMgr to get cookie details if the SDK has been initialized\n * cookieMgr can be used to del, get, purge, set cookies\n */\nexport function getCookieMgr() {\n    if (_appInsights) {\n        return _appInsights.getCookieMgr();\n    }\n    return null;\n}\n\n/**\n * Get current config settings if the SDK has been initialized\n */\nexport function getConfig() {\n    if (_appInsights) {\n        let config = _appInsights[\"config\"];\n        console.log(\"current config\");\n        console.log(config);\n        return config;\n    }\n    return null;\n}\n\n/**\n * Change current config settings dynamically if the SDK has been initialized\n */\nexport function changeConfig() {\n    if (_appInsights) {\n        let newConfig = generateNewConfig(); // generate new config object\n        _appInsights[\"config\"] = newConfig; // change config\n        return true;\n    }\n    return false;\n}\n\n/**\n * An example of customized pageview item\n */\nexport const pageviewItem: IPageViewTelemetry = {\n    name: \"pageviewWithproperities\", // Defaults to the document title\n    uri: \"https://pageview\",\n    refUri: \"https://sample\",\n    pageType: \"type\",\n    isLoggedIn: false,\n    properties: {\n        duration: 100, // pre-defined property\n        prop: \"prop\",\n        prop1: {prop1:\"prop1\"}\n    },\n    measurements: {\n        metric: 1\n    }\n};\n\n/**\n * An example of customized event item\n */\nexport const eventItem: IEventTelemetry = {\n    name: \"eventWithproperities\",\n    properties: {\n        prop: {prop1:\"prop1\"}\n    },\n    measurements: {\n        metirc: 1\n    }\n};\n\n/**\n * An example of customized trace item\n */\nexport const traceItem: ITraceTelemetry = {\n    message: \"trace\",\n    severityLevel: 1,\n    properties: {\n        prop: {prop1:\"prop1\"}\n    },\n    measurements: {\n        metirc: 1\n    }\n};\n\n/**\n * An example of customized metric item\n */\nexport const metricItem: IMetricTelemetry = {\n    name: \"metric\",\n    average: 1.2,\n    //default to 1\n    sampleCount: 2,\n    //default to average\n    min: 1,\n    //default to average\n    max: 2,\n    // default to 0\n    stdDev: 1.23,\n    properties: {\n        prop: {prop1:\"prop1\"}\n    },\n    measurements: {\n        metirc: 1\n    }\n};\n\n// // ***********************************************************************************************************\n// // NPM Initialization\n// // Use this section to initialize Application Insights with NPM\n\n// import { ApplicationInsights, IConfiguration } from \"@microsoft/applicationinsights-web\"\n\n//  // Cache the previously initialized instance to avoid creating multiple instances\n// let _appInsights: ApplicationInsights;\n\n// export function initApplicationInsights(config: IConfiguration) {\n    \n//     if (!_appInsights) {\n//         // Make sure we have a configuration object\n//         config = config || {};\n//         if (!config.instrumentationKey || !config.connectionString) {\n//             config.connectionString = \"InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE\";\n//         }\n\n//         _appInsights = new ApplicationInsights({\n//              config: config\n//         });\n       \n//         _appInsights.loadAppInsights();\n//         _appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n\n//         return _appInsights;\n//     }\n\n//     return _appInsights;\n// }\n\n// // **************************************************************************************************************\n"
  },
  {
    "path": "examples/AISKU/src/utils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, arrIncludes } from \"@nevware21/ts-utils\";\n\nexport const detailsContainerId = \"details-container\";\nexport const detailsWatchList = [\"baseType\", \"name\", \"time\", \"properties\"];\nexport const ajaxDetails: string[] = [\"disabbleFetchTracking\", \"disableExceptionTracking\", \"enableAutoRouteTracking\"];\nexport const analyticsDetails: string[] = [\"autoTrackPageVisitTime\", \"appId\", \"enableAjaxPerfTracking\", \"enableCorsCorrelation\"];\nexport const configDetails: string[] = [\"connectionString\", ...ajaxDetails, ...analyticsDetails];\nexport const buttonSectionId = \"button-section\";\nexport const configContainerId = \"config-details\";\nexport const containerId = \"aisku-container\";\nexport const ai_session = \"ai_session\";\nexport const ai_user = \"ai_user\";\nexport const manual_event = \"manual_record_event\";\nexport const cookieWatchList = [\"isEnabled\", ai_session, ai_user];\n\n\nexport function randomBoolean() {\n    if (Math.random() > 0.5) {\n        return true;\n    }\n    return false;\n}\n\nexport function clearEle(id: string) {\n    let ele = document.getElementById(id);\n    if (ele) {\n        ele.innerHTML = \"\";\n    }\n}\n\nexport function clearDetailsList() {\n    clearEle(detailsContainerId);\n}\n\nexport function createSubContainer(id: string, className?: string) {\n    let ele = document.createElement(\"div\");\n    ele.className =  className || \"container-main\";\n    ele.id = id;\n    return ele;\n}\n\nexport function createButton(buttontextContent: string, buttobuttononclickFn: any, id?: string): HTMLButtonElement {\n    let btn = document.createElement(\"button\");\n    if (id) {\n        btn.id = id;\n    }\n    btn.innerHTML = buttontextContent;\n    btn.onclick = buttobuttononclickFn;\n    return btn;\n}\n\nexport function generateNewConfig() {\n    let prefix = Math.random().toString(36).slice(6);\n\n    let newConfig: any = {\n        connectionString: `InstrumentationKey=newKey${prefix}`,\n        extensionConfig: {\n            ApplicationInsightsAnalytics: {\n                autoTrackPageVisitTime: randomBoolean(),\n                appId: Math.random().toString(36).slice(8),\n                enableAjaxPerfTracking:  randomBoolean(),\n                enableCorsCorrelation: randomBoolean()\n            },\n            AjaxDependencyPlugin: {\n                disabbleFetchTracking: randomBoolean(), // false block fetch tracking\n                disableExceptionTracking: randomBoolean(),\n                enableAutoRouteTracking: randomBoolean()\n            }\n        }\n    }\n    return newConfig;\n}\n\nexport function createDetailList(propsToWatch: string[], details: any, id: string, title: string) {\n    let container = document.getElementById(id);\n    let ele = document.createElement(\"div\");\n    ele.className = \"list\";\n    let list = \"\";\n    if (details) {\n        list += `\n            <h6>${title} Details</h6>\n            <p>Not all auto-captured events and details are displayed here.</p>\n            <p>Check console and network trace for complete details</p>\n        `;\n        arrForEach(propsToWatch, (prop) => {\n            let obj;\n            \n            if (details[\"baseData\"]) {\n                obj =  details[\"baseData\"][prop] || details[prop] || details[\"baseData\"];\n            } else {\n                obj =  details[prop] || details[\"baseData\"];\n            }\n\n            if (arrIncludes(analyticsDetails, prop)) {\n                obj = details[\"extensionConfig\"][\"ApplicationInsightsAnalytics\"][prop];\n            }\n            if (arrIncludes(ajaxDetails, prop)) {\n                obj = details[\"extensionConfig\"][\"AjaxDependencyPlugin\"][prop];\n            }\n            if (prop === \"item\") {\n                obj = {name: obj.name, target: obj.target};\n            }\n\n            obj = (obj === undefined)?  \"undefined\" : obj;\n            \n            if (typeof obj === \"object\") {\n                obj = JSON.stringify(obj);\n            }\n            list += `<li>${prop}: ${obj}</li>`;\n\n        });\n        \n        list += \"<div>-------------------------</div>\";\n        ele.innerHTML = list;\n        container?.appendChild(ele);\n    }\n}\n\nexport function createContainers() {\n    let container = document.createElement(\"div\");\n    container.className = \"container\";\n    container.id = containerId;\n    let buttonSection = createSubContainer(buttonSectionId, \"container\");\n    container.appendChild(buttonSection);\n    let configSection = createSubContainer(configContainerId);\n    container.appendChild(configSection);\n    let detailsSection = createSubContainer(detailsContainerId);\n    container.appendChild(detailsSection);\n    document.body.append(container);\n}\n\nexport function triggerException() {\n    // This will trigger exception telemetry automatically\n    throw new Error(\"error is triggered\");\n}\n"
  },
  {
    "path": "examples/AISKU/style/style.css",
    "content": "body {\n    margin: 0;\n}\n\nh1 {\n    font-size: 1.875rem;\n    margin: 0.67rem 0;\n}\n\nh2 {\n    font-size: 1.5rem;\n    margin: 0.83rem 0;\n}\n\nh3 {\n    font-size: 1.25rem;\n    margin: 1rem 0;\n}\n\nh4 {\n    font-size: 1.05rem;\n    margin: 1.33rem 0;\n}\n\nh5 {\n    font-size: 1rem;\n    margin: 1.5rem 0;\n}\n\nh6 {\n    font-size: 0.875rem;\n    margin: 0.3rem 0;\n}\n\n.uppercase {\n    text-transform: uppercase;\n}\n\npre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n}\n\nol,\nul {\n    margin: 1em 0;\n}\n\n.container {\n    max-width: 1600px;\n    padding: 0 2rem;\n}\n\n.container-main {\n    justify-content: space-between;\n    font-size: 0.9rem;\n    position: relative;\n    margin: 1rem auto;\n    padding-left: 1rem;\n    background-color: azure;\n    overflow: auto;\n    max-height: 350px;\n}\n\n\nbody {\n    font-family: \"Segoe UI\", sans-serif;\n    font-size: 16px;\n    padding-left: 1rem;\n}\n\ncode,\npre {\n    font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n    padding: 0.2em;\n    margin: 0;\n    font-size: 0.875rem;\n    border-radius: 0.8em;\n}\nbutton {\n    font-family: \"Segoe UI\", sans-serif;\n    margin: 0.5rem;\n    padding: 0.2em;\n}\n\np{\n    font-size: 12px;\n    margin: 0;\n}"
  },
  {
    "path": "examples/AISKU/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {                   \n      \"target\": \"es5\",                           \n      \"module\": \"es6\",\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"moduleResolution\": \"node\",\n      \"strict\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"esModuleInterop\": true,\n      \"skipLibCheck\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"noImplicitAny\": false,\n      \"importHelpers\": true,\n      \"allowJs\": true,\n      \"resolveJsonModule\": true,\n      \"declaration\": true,\n      \"declarationDir\": \"build/types\",\n      \"outDir\": \"dist-es5\",\n      \"rootDir\": \"./src\",\n      \"removeComments\": false\n    },\n    \"include\": [\n      \"./src\"\n    ],\n    \"exclude\": [\n      \"node_modules\"\n  ]\n}"
  },
  {
    "path": "examples/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK Examples\n\nA collection of examples using the ApplicationInsights SDK, these examples are compiled as part of every build (unless otherwise stated),\nbut may not be executed as part of any automated test pass -- this may change/vary.\n\n## Examples\n\n[Shared Worker](./shared-worker/README.md)\n\n[AISKU](./AISKU/README.md)\n\n[Dependency](./dependency/README.md)\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "examples/cfgSync/CfgSync.html",
    "content": "<!DOCTYPE html>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<html lang=\"en\">\n  <head>\n    <style>\n      .button {\n        background-color: #008CBA;\n        border: none;\n        color: white;\n        padding: 12px 20px;\n        text-align: center;\n        text-decoration: none;\n        display: inline-block;\n        font-size: 12px;\n        margin: 4px 2px;\n        cursor: pointer;\n      }\n      </style>\n    <meta charset=\"utf-8\">\n    <title>Sample</title>\n  </head>\n  <body>\n    <h1>Microsoft Application Insights JavaScript SDK - CfgSync Plugin</h1>\n    <p>Check console for details</p>\n    <script src=\"./browser/es5/example-cfgsync-index.gbl.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "examples/cfgSync/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK Example - CfgSync Plugin\n\n## Sample Build\n\nYou WILL NEED to have compiled the repository before running this example as it loads the compiled scripts, and you will also NEED to start the\nlocal web server via `npm run serve` from the root of repository.\n\nYou can load the example via the [CfgSync.html](CfgSync.html).\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "examples/cfgSync/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-example-cfgsync\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights CfgSync Plugin Example\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\",\n        \"example\"\n    ],\n    \"module\": \"dist-es5/example-cfgsync-index.js\",\n    \"types\": \"types/example-cfgsync-index.d.ts\",\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser\",\n        \"build:esm\": \"grunt example-cfgsync\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"mintest\": \"\",\n        \"perftest\": \"\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"ai-min\": \"\",\n        \"ai-restore\": \"\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/examples/cfgSync\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-cfgsync-js\": \"3.4.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-web\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "examples/cfgSync/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport cleanup from \"rollup-plugin-cleanup\";\nimport dynamicRemove from \"@microsoft/dynamicproto-js/tools/rollup/dist/node/removedynamic\";\nimport { es5Poly, es5Check, importCheck } from \"@microsoft/applicationinsights-rollup-es5\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\n\nconst workerName = \"example-cfgsync-index\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK Example - CfgSync Plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nfunction doCleanup() {\n  return cleanup({\n    comments: [\n      'some', \n      /^.\\s*@DynamicProtoStub/i,\n      /^\\*\\*\\s*@class\\s*$/\n    ]\n  })\n}\n\nconst browserRollupConfigFactory = (name, isProduction, format = \"umd\", extension = \"\") => {\n  const browserRollupConfig = {\n    input: `dist-es5/${name}.js`,\n    output: {\n      file: `browser/es5/${name}${extension ? \".\" +extension : \"\"}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights.Example\",\n      extend: true,\n      freeze: false,\n      sourcemap: true\n    },\n    treeshake: {\n      propertyReadSideEffects: false,\n      moduleSideEffects: false,\n      tryCatchDeoptimization: false,\n      correctVarValueBeforeDeclaration: false\n    },\n    plugins: [\n      dynamicRemove(),\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: replaceValues\n      }),\n      // This just makes sure we are importing the example dependencies correctly\n      importCheck({ exclude: [ \"example-cfgsync-index\" ] }),\n      nodeResolve({\n        module: true,\n        browser: true,\n        preferBuiltins: false\n      }),\n      doCleanup(),\n      es5Poly(),\n      es5Check()\n    ]\n  };\n\n  if (isProduction) {\n    browserRollupConfig.output.file = `browser/${name}${extension ? \".\" +extension : \"\"}.min.js`;\n    browserRollupConfig.plugins.push(\n      uglify({\n        ie8: false,\n        ie: true,\n        compress: {\n          ie: true,\n          passes:3,\n          unsafe: true,\n        },\n        output: {\n          ie: true,\n          preamble: banner,\n          webkit:true\n        }\n      })\n    );\n  }\n\n  return browserRollupConfig;\n};\n\nupdateDistEsmFiles(replaceValues, banner);\n\nexport default [\n  browserRollupConfigFactory(workerName, false, \"iife\", \"gbl\")\n];\n"
  },
  {
    "path": "examples/cfgSync/src/example-cfgsync-index.ts",
    "content": "// // Copyright (c) Microsoft Corporation. All rights reserved.\n// // Licensed under the MIT License.\n\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\nimport { addListener, getConfig } from \"./example-cfgsync-init\";\nimport { initListenerInstance1 } from \"./listener1\";\nimport { initListenerInstance2 } from \"./listener2\";\nimport { initMainInstance } from \"./main\";\n\nexport function createButton(inst: ApplicationInsights): HTMLButtonElement {\n    let ele = document.createElement(\"div\");\n    let btn = document.createElement(\"button\");\n    btn.className = \"button\";\n    btn.innerHTML = \"Change Config\";\n    btn.onclick = () => {\n        inst.updateCfg(getConfig());\n    }\n    ele.appendChild(btn);\n    document.body.appendChild(ele);\n    return btn;\n}\n\nexport function createGetCfgButton(inst: ApplicationInsights, name?: string): HTMLButtonElement {\n    let ele = document.createElement(\"div\");\n    let btn = document.createElement(\"button\");\n    btn.className = \"button\";\n    btn.innerHTML = `Get ${name} Config`;\n    btn.onclick = () => {\n        console.log(`${name} config`);\n        console.log(inst.config);\n    }\n    ele.appendChild(btn);\n    document.body.appendChild(ele);\n    return btn;\n}\n\n\nfunction start() {\n    addListener();\n    let mainInst = initMainInstance();\n    let listener1 = initListenerInstance1();\n    let listener2 = initListenerInstance2();\n    createButton(mainInst);\n    createGetCfgButton(listener1, \"listener1\");\n    createGetCfgButton(listener2, \"listener2\");\n}\nstart();\n\n\n\n\n"
  },
  {
    "path": "examples/cfgSync/src/example-cfgsync-init.ts",
    "content": "import { IConfiguration, random32 } from \"@microsoft/applicationinsights-core-js\"\n\nexport function addListener() {\n    window.addEventListener(\"ai_cfgsync\", (e) => {\n        console.log(\"new event\");\n        console.log(e);\n    })\n}\n\nexport function getConfig() {\n    let newConfig = {\n        instrumentationKey: `InstrumentationKey=main${random32()}`,\n        cookieCfg:{domain: `domain${random32()}`}\n    } as IConfiguration;\n    return newConfig;\n}"
  },
  {
    "path": "examples/cfgSync/src/listener1.ts",
    "content": "import { ApplicationInsights, IConfiguration} from \"@microsoft/applicationinsights-web\";\nimport {CfgSyncPlugin, ICfgSyncConfig, ICfgSyncMode} from \"@microsoft/applicationinsights-cfgsync-js\"\n\nexport function initListenerInstance1() {\n    let listenerCfgSyncPlugin1 = new CfgSyncPlugin();\n    let listenerInstCfg1 = {\n        connectionString: \"InstrumentationKey=listener1\",\n        disableInstrumentationKeyValidation: true,\n        extensionConfig:{\n            [listenerCfgSyncPlugin1.identifier]: {\n                syncMode: ICfgSyncMode.Receive,\n                nonOverrideConfigs: {\n                    connectionString: true,\n                    instrumentationKey: true,\n                    endpointUrl: true,\n                    extensionConfig: {\n                        [\"ApplicationInsightsAnalytics\"]: {\n                            accountId: true\n                        }\n                    }\n                }\n            } as ICfgSyncConfig\n        },\n        extensions:[listenerCfgSyncPlugin1]\n    } as IConfiguration;\n    let listenerAppInsights1 = new ApplicationInsights({config: listenerInstCfg1});\n    listenerAppInsights1.loadAppInsights();\n    console.log(\"listener 1\");\n    console.log(listenerAppInsights1);\n    return  listenerAppInsights1;\n}"
  },
  {
    "path": "examples/cfgSync/src/listener2.ts",
    "content": "import { ApplicationInsights, IConfiguration} from \"@microsoft/applicationinsights-web\";\nimport {CfgSyncPlugin, ICfgSyncConfig, ICfgSyncMode} from \"@microsoft/applicationinsights-cfgsync-js\"\n\nexport function initListenerInstance2() {\n    let listenerCfgSyncPlugin2 = new CfgSyncPlugin();\n    let listenerInstCfg2 = {\n        connectionString: \"InstrumentationKey=listener2\",\n        disableInstrumentationKeyValidation: true,\n        extensionConfig:{\n            [listenerCfgSyncPlugin2.identifier]: {\n                syncMode: ICfgSyncMode.Receive,\n                nonOverrideConfigs: {\n                    connectionString: true,\n                    instrumentationKey: true,\n                    endpointUrl: true,\n                    extensionConfig: {\n                        [\"ApplicationInsightsAnalytics\"]: {\n                            excludeRequestFromAutoTrackingPatterns: true,\n                            bufferOverride: true\n                        }\n                    }\n                }\n            } as ICfgSyncConfig\n        },\n        extensions:[listenerCfgSyncPlugin2]\n    } as IConfiguration;\n    let listenerAppInsights2 = new ApplicationInsights({config: listenerInstCfg2});\n    listenerAppInsights2.loadAppInsights();\n    console.log(\"listener 2\");\n    console.log(listenerAppInsights2);\n    return  listenerAppInsights2;\n}"
  },
  {
    "path": "examples/cfgSync/src/main.ts",
    "content": "import { ApplicationInsights, IConfig, IConfiguration, IDiagnosticLogger} from \"@microsoft/applicationinsights-web\";\nimport {CfgSyncPlugin, ICfgSyncConfig, ICfgSyncMode} from \"@microsoft/applicationinsights-cfgsync-js\";\n\n\nexport function initMainInstance() {\n    let mainCfgSyncPlugin = new CfgSyncPlugin();\n    let mainInstCfg = {\n        instrumentationKey: \"InstrumentationKey=main\",\n        disableInstrumentationKeyValidation: true,\n        extensionConfig:{\n            [mainCfgSyncPlugin.identifier]: {\n                syncMode: ICfgSyncMode.Broadcast\n            } as ICfgSyncConfig,\n            [\"ApplicationInsightsAnalytics\"]: {\n                emitLineDelimitedJson: false,\n                accountId: \"mainaccid\",\n                sessionRenewalMs: 1000000,\n                excludeRequestFromAutoTrackingPatterns: [\"excludeRequest1\",\"excludeRequest2\"],\n                bufferOverride: {\n                    getItem: (logger: IDiagnosticLogger, name: string) => {\n                        return `${name}test`;\n                    },\n                    setItem: (logger: IDiagnosticLogger, name: string, data: string) => {\n                        return name === \"delete\"\n                    }\n                }\n            } as IConfig\n        },\n        extensions:[mainCfgSyncPlugin]\n    } as IConfiguration;\n    let mainAppInsights = new ApplicationInsights({config: mainInstCfg});\n    mainAppInsights.loadAppInsights();\n    console.log(\"main instance\");\n    console.log(mainAppInsights);\n    return mainAppInsights;\n}"
  },
  {
    "path": "examples/cfgSync/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"es5\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": false,\n    \"alwaysStrict\": true,\n    \"skipDefaultLibCheck\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"src/**/*\"\n  ],\n  \"exclude\": [\"node_modules/\"]\n}\n"
  },
  {
    "path": "examples/dependency/README.md",
    "content": "# Application Insights JavaScript SDK\n\n## Dependency Sample\n\nThis Sample shows how to filter, modify, block and disable dependency data with [`addDependencyListener`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#adddependencylistener) and [`addDependencyInitializer`](https://microsoft.github.io/ApplicationInsights-JS/API-reference#adddependencyinitializer).\n\n## Sample Build\n\n- Build the repository before running this example.\n- Run `npm run serve` under root folder.\n- Open `http://localhost:9001/examples/dependency/`.\n\n## Description\n\n- button `change-config` will change config dynamically.\n\n- button `add-handlers` will add a dependencyListener with the following changes:\n\n    ```javascript\n        context.listener = \"dependency-listener-context\";\n        traceFlags = 0;\n    ```\n\n    and a dependencyInitializer with the following changes:\n\n    ```javascript\n        item.name = \"dependency-name\";\n        item.properties.url = item.target;\n        context.initializer = \"dependency-initializer-context\";\n    ```\n\n- button `stop-dependency-event` will block all dependency events.\n\n- button `remove-all-handlers` will remove all previously added dependency initializers and listeners.\n\n- button `create-fetch-request` will trigger a fetch request.\n\n- button `create-xhr-request` will trigger a xhr request.\n\n- button `untrack-fetch-request` will trigger a fetch request that will be blocked.\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit <https://cla.microsoft.com>.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at [here](https://go.microsoft.com/fwlink/?LinkID=824704). You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft’s Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\nMIT\n"
  },
  {
    "path": "examples/dependency/index.html",
    "content": "<!DOCTYPE html>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <title>Dependency Sample</title>\n    <link rel=\"stylesheet\" href=\"style/style.css\"/>\n\n    <!-- use this section for snippet Initialization -->\n    <!-- <script type=\"text/javascript\">!function(T,l,y){var S=T.location,k=\"script\",D=\"instrumentationKey\",C=\"ingestionendpoint\",I=\"disableExceptionTracking\",E=\"ai.device.\",b=\"toLowerCase\",w=\"crossOrigin\",N=\"POST\",e=\"appInsightsSDK\",t=y.name||\"appInsights\";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:\"5\",version:2,config:d};function v(e,t){var n={},a=\"Browser\";return n[E+\"id\"]=a[b](),n[E+\"type\"]=a,n[\"ai.operation.name\"]=S&&S.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=\"\"+e;return 1===t.length&&(t=\"0\"+t),t}return e.getUTCFullYear()+\"-\"+t(1+e.getUTCMonth())+\"-\"+t(e.getUTCDate())+\"T\"+t(e.getUTCHours())+\":\"+t(e.getUTCMinutes())+\":\"+t(e.getUTCSeconds())+\".\"+((e.getUTCMilliseconds()/1e3).toFixed(3)+\"\").slice(2,5)+\"Z\"}(),iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(\";\"),a=0;a<n.length;a++){var i=n[a].split(\"=\");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]=\"https://\"+(o?o+\".\":\"\")+\"dc.\"+(r||\"services.visualstudio.com\")}return e}(),c=s[D]||d[D]||\"\",u=s[C],p=u?u+\"/v2/track\":d.endpointUrl,(l=[]).push((n=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=t,i=p,(o=(r=v(c,\"Exception\")).data).baseType=\"ExceptionData\",o.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:n.replace(/\\./g,\"-\"),hasFullStack:!1,stack:n+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(S&&S.pathname||\"_unknown_\")+\"\\nEndpoint: \"+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,\"Message\"),r=i.data;r.baseType=\"MessageData\";var o=r.baseData;return o.message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+n+\")\").replace(/\\\"/g,\"\")+'\"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:\"cors\"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader(\"Content-type\",\"application/json\"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&\"\"!==e||\"undefined\"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){\"loaded\"!==n.readyState&&\"complete\"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName(\"head\")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n=\"track\",r=\"TrackPage\",o=\"TrackEvent\";t([n+\"Event\",n+\"PageView\",n+\"Exception\",n+\"Trace\",n+\"DependencyData\",n+\"Metric\",n+\"PageViewPerformance\",\"start\"+r,\"stop\"+r,\"start\"+o,\"stop\"+o,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c=\"onerror\";t([\"_\"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m[\"_\"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{\n        src: \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\", // The SDK URL Source for the CDN\n        crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n        cfg: { // Application Insights Configuration\n          connectionString: \"InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE\"\n        }});\n    </script> -->\n\n  </head>\n  <body>\n    <h1>Microsoft Application Insights JavaScript SDK - Dependencies</h1>\n    <!-- this section is only for local build testing -->\n    <!-- <script src=\"../../AISKU/dist/es5/applicationinsights-web.js\"></script>\n    <script>\n        let appInsights = new Microsoft.ApplicationInsights.ApplicationInsights({ config: {connectionString: \"InstrumentationKey=key123\"}});\n        appInsights.loadAppInsights();\n        window.appInsights = appInsights;\n    </script> -->\n    <script src=\"./browser/dependencies-example-index.gbl.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "examples/dependency/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-example-dependencies\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights Dependencies Example\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\",\n        \"example\"\n    ],\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser\",\n        \"build:esm\": \"grunt example-dependency\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"mintest\": \"\",\n        \"perftest\": \"\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"ai-min\": \"\",\n        \"ai-restore\": \"\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/examples/dependency\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-web\": \"3.4.1\",\n        \"@microsoft/applicationinsights-dependencies-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "examples/dependency/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport cleanup from \"rollup-plugin-cleanup\";\nimport dynamicRemove from \"@microsoft/dynamicproto-js/tools/rollup/dist/node/removedynamic\";\nimport { es5Poly, es5Check, importCheck } from \"@microsoft/applicationinsights-rollup-es5\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\n\nconst workerName = \"dependencies-example-index\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK Example - AISKU, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nfunction doCleanup() {\n  return cleanup({\n    comments: [\n      'some', \n      /^.\\s*@DynamicProtoStub/i,\n      /^\\*\\*\\s*@class\\s*$/\n    ]\n  })\n}\n\nconst browserRollupConfigFactory = (name, isProduction, format = \"umd\", extension = \"\") => {\n  const browserRollupConfig = {\n    input: `dist-es5/${name}.js`,\n    output: {\n      file: `browser/${name}${extension ? \".\" +extension : \"\"}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights.Example\",\n      extend: true,\n      freeze: false,\n      sourcemap: true\n    },\n    treeshake: {\n      propertyReadSideEffects: false,\n      moduleSideEffects: false,\n      tryCatchDeoptimization: false,\n      correctVarValueBeforeDeclaration: false\n    },\n    plugins: [\n      dynamicRemove(),\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: replaceValues\n      }),\n      // This just makes sure we are importing the example dependencies correctly\n      importCheck({ exclude: [ \"dependencies-example-index\" ] }),\n      nodeResolve({\n        module: true,\n        browser: true,\n        preferBuiltins: false\n      }),\n      doCleanup(),\n      es5Poly(),\n      es5Check()\n    ]\n  };\n\n  if (isProduction) {\n    browserRollupConfig.output.file = `browser/${name}${extension ? \".\" +extension : \"\"}.min.js`;\n    browserRollupConfig.plugins.push(\n      uglify({\n        ie8: false,\n        ie: true,\n        compress: {\n          ie: true,\n          passes:3,\n          unsafe: true,\n        },\n        output: {\n          ie: true,\n          preamble: banner,\n          webkit:true\n        }\n      })\n    );\n  }\n\n  return browserRollupConfig;\n};\n\nupdateDistEsmFiles(replaceValues, banner);\n\nexport default [\n  browserRollupConfigFactory(workerName, false, \"iife\", \"gbl\")\n];\n"
  },
  {
    "path": "examples/dependency/src/appinsights-init.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    ApplicationInsights, IConfiguration,\n    DependencyListenerFunction, DependencyInitializerFunction, IDependencyInitializerHandler, IDependencyListenerHandler,\n    OTelSpanKind\n} from \"@microsoft/applicationinsights-web\";\nimport { generateNewConfig } from \"./utils\";\n\n// Cache the previously initialized instance to avoid creating multiple instances\nlet _appInsights: ApplicationInsights;\n\nexport function initApplicationInsights(config?: IConfiguration) {\n    \n    if (!_appInsights) {\n        // Make sure we have a configuration object\n        config = config || {};\n        if (!config.connectionString) {\n            config.connectionString = \"InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE\";\n        }\n\n        _appInsights = new ApplicationInsights({\n            config: config\n        });\n       \n        _appInsights.loadAppInsights();\n        _appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n\n        return _appInsights;\n    }\n\n    return _appInsights;\n}\n\n/**\n * Use addDependencyListener to modify dependencyDetails if the SDK has been initialized\n */\nexport function addDependencyListener(dependencyListener: DependencyListenerFunction): IDependencyListenerHandler | null {\n    if (_appInsights) {\n        return _appInsights.addDependencyListener(dependencyListener);\n    }\n    return null;\n}\n\n/**\n * Use addDependencyInitializer to modify dependencyInitializerDetails if the SDK has been initialized\n */\nexport function addDependencyInitializer(dependencyInitializer: DependencyInitializerFunction): IDependencyInitializerHandler | null {\n    if (_appInsights) {\n        return _appInsights.addDependencyInitializer(dependencyInitializer);\n    }\n    return null;\n}\n\n/**\n * Use addDependencyInitializer to block any event from being reported\n */\nexport function stopDependencyEvent() {\n    if (_appInsights) {\n        _appInsights.addDependencyInitializer((details: any) => {\n            // Check console to view details\n            console.log(\"dependency event tracking is stopped, the following event will not be reported\");\n            console.log(details);\n            // To stop any event from being reported\n            return false;\n        });\n        return true;\n    }\n    return false;\n   \n}\n\n/**\n * Get current config settings if the SDK has been initialized\n */\nexport function getConfig() {\n    if (_appInsights) {\n        let config = _appInsights[\"config\"];\n        console.log(\"current config\");\n        console.log(config);\n        return config;\n    }\n    return null;\n}\n\n/**\n * Change current config settings dynamically if the SDK has been initialized\n */\nexport function changeConfig() {\n    if (_appInsights) {\n        let newConfig = generateNewConfig(); // generate new config object\n        _appInsights.updateCfg(newConfig);   // change config merging any changes\n        return true;\n    }\n    return false;\n}\n\nexport function enableAjaxPerfTrackingConfig() {\n    if (_appInsights && _appInsights.config.extensionConfig) {\n        _appInsights.config.extensionConfig[\"AjaxDependencyPlugin\"].enableAjaxPerfTracking = true;\n        return true;\n    }\n    return false;\n}\n\n/**\n * Example of using the new OpenTelemetry trace API\n */\nexport function createSpanWithTraceAPI() {\n    if (_appInsights) {\n        // Get the OpenTelemetry trace API\n        const trace = _appInsights.trace;\n        \n        // Get a tracer instance\n        const tracer = trace.getTracer(\"example-service\", \"1.0.0\");\n        \n        // Create a span using the OpenTelemetry API\n        const span = tracer.startSpan(\"api-request\", {\n            kind: OTelSpanKind.SERVER,\n            attributes: {\n                \"http.method\": \"POST\",\n                \"http.url\": \"/api/users\",\n                \"service.name\": \"user-service\"\n            }\n        });\n\n        if (!span) {\n            console.warn(\"Failed to create span in createSpanWithTraceAPI\");\n            return null;\n        }\n\n        // Set additional attributes\n        span.setAttribute(\"user.id\", \"12345\");\n        span.setAttributes({\n            \"request.size\": 1024,\n            \"response.status_code\": 200\n        });\n\n        // Simulate some async work\n        setTimeout(() => {\n            if (span) {\n                // Update span name if needed\n                span.updateName(\"api-request-completed\");\n                \n                // End the span - this will automatically create telemetry\n                span.end();\n            }\n        }, 800);\n\n        return span;\n    }\n    return null;\n}\n\n/**\n * Example of using multiple tracers for different components\n */\nexport function createMultipleTracers() {\n    if (_appInsights) {\n        const trace = _appInsights.trace;\n        \n        // Get different tracers for different services\n        const userServiceTracer = trace.getTracer(\"user-service\", \"1.2.3\");\n        const paymentServiceTracer = trace.getTracer(\"payment-service\", \"2.1.0\");\n        \n        // Create spans from different tracers\n        const userSpan = userServiceTracer.startSpan(\"validate-user\", {\n            attributes: { \"component\": \"authentication\" }\n        });\n        \n        const paymentSpan = paymentServiceTracer.startSpan(\"process-payment\", {\n            attributes: { \"component\": \"billing\" }\n        });\n\n        if (!userSpan || !paymentSpan) {\n            console.warn(\"Failed to create one or more spans in createMultipleTracers\");\n            return null;\n        }\n\n        // End spans after some work\n        setTimeout(() => {\n            if (userSpan) {\n                userSpan.end();\n            }\n            if (paymentSpan) {\n                paymentSpan.end();\n            }\n        }, 500);\n\n        return { userSpan, paymentSpan };\n    }\n    return null;\n}\n\n/**\n * Example of using the new startSpan API for distributed tracing\n */\nexport function createExampleSpan() {\n    if (_appInsights) {\n        // Create a span for a user operation\n        const span = _appInsights.core.startSpan(\"user-checkout\", {\n            kind: OTelSpanKind.SERVER,\n            attributes: {\n                \"user.action\": \"checkout\",\n                \"cart.items\": 3,\n                \"component\": \"shopping-cart\"\n            }\n        });\n\n        // Check if span is available before using it\n        if (!span) {\n            console.warn(\"Span creation failed - tracing may not be enabled\");\n            return null;\n        }\n\n        // Set additional attributes\n        span.setAttribute(\"order.total\", 99.99);\n        span.setAttributes({\n            \"payment.method\": \"credit_card\",\n            \"shipping.method\": \"standard\"\n        });\n\n        // Simulate some async work\n        setTimeout(() => {\n            if (span) {\n                // Update span name if needed\n                span.updateName(\"user-checkout-completed\");\n                \n                // End the span\n                span.end();\n            }\n        }, 1000);\n\n        return span;\n    }\n    return null;\n}\n\n/**\n * Example of creating child spans for nested operations\n */\nexport function createChildSpanExample() {\n    if (_appInsights) {\n        // Create parent span\n        const parentSpan = _appInsights.core.startSpan(\"process-order\", {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                \"order.id\": \"12345\"\n            }\n        });\n\n        // Create child span for payment processing\n        const paymentSpan = _appInsights.core.startSpan(\"process-payment\", {\n            kind: OTelSpanKind.CLIENT,\n            attributes: {\n                \"payment.processor\": \"stripe\",\n                \"amount\": 99.99\n            }\n        });\n\n        // Check if spans are available before using them\n        if (!parentSpan || !paymentSpan) {\n            console.warn(\"Span creation failed - tracing may not be enabled\");\n            // Clean up any successfully created spans\n            if (parentSpan) {\n                parentSpan.end();\n            }\n            if (paymentSpan) {\n                paymentSpan.end();\n            }\n            return null;\n        }\n\n        // Simulate payment processing\n        setTimeout(() => {\n            if (paymentSpan) {\n                paymentSpan.setAttribute(\"payment.status\", \"success\");\n                paymentSpan.end();\n            }\n\n            // End parent span\n            if (parentSpan) {\n                parentSpan.setAttribute(\"order.status\", \"completed\");\n                parentSpan.end();\n            }\n        }, 500);\n\n        return { parentSpan, paymentSpan };\n    }\n    return null;\n}\n\n\n"
  },
  {
    "path": "examples/dependency/src/dependencies-example-index.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, eW3CTraceFlags } from \"@microsoft/applicationinsights-core-js\";\nimport { addDependencyListener, addDependencyInitializer, stopDependencyEvent, changeConfig, initApplicationInsights, getConfig, enableAjaxPerfTrackingConfig } from \"./appinsights-init\";\nimport { addHandlersButtonId, ajaxCallId, buttonSectionId, changeConfigButtonId, clearDetailsButtonId, clearDetailsList, clearEle, configContainerId, configDetails, createButton, createContainers, createDetailList, createFetchRequest, createUnTrackRequest, createXhrRequest, dependencyInitializerDetails, dependencyInitializerDetailsContainerId, dependencyListenerButtonId, dependencyListenerDetails, dependencyListenerDetailsContainerId, fetchCallId, fetchXhrId, removeAllHandlersId, stopDependencyEventButtonId, untrackFetchRequestId } from \"./utils\";\n\nlet dependencyListenerHandler: any = null;\nlet dependencyInitializerHandler: any = null;\n\n// This function is an example of using addDependencyListener to modify dependencyDetails\nfunction addDependencyListenerOnclick() {\n    dependencyListenerHandler = addDependencyListener((details: any) => {\n        // Check console to view details\n        console.log(\"The folloing event is passed to addDependencyListener\");\n        console.log(details);\n        // Add additional context values (any) that can be used by other listeners and is also passed to any dependency initializers\n        details.context.listener = \"dependency-listener-context\";\n        details.traceFlags = eW3CTraceFlags.None;\n\n        createDetailList(dependencyListenerDetails, details, dependencyListenerDetailsContainerId, \"Listener\");\n    });\n}\n\n// This function is an example of using addDependencyInitializer to modify dependencyInitializerDetails\nfunction addDependencyInitializerOnClick() {\n    dependencyInitializerHandler = addDependencyInitializer((details: any) => {\n        // Check console to view details\n        console.log(\"The folloing event is passed to addDependencyInitializer\");\n        console.log(details);\n        // Events from https://api.npms.io/v2/search?q=angular&size=1 will not be reported\n        if (details.item?.target  === \"https://api.npms.io/v2/search?q=angular&size=1\") {\n            return false;\n        }\n        // Change properties of telemetry event \"before\" it's been processed\n        details.item.name = \"dependency-name\";\n        details.item.properties.url = details.item?.target;\n        details.context.initializer = \"dependency-initializer-context\";\n\n        createDetailList(dependencyInitializerDetails, details, dependencyInitializerDetailsContainerId, \"Initializer\");\n    });\n}\n\n// This function is an example of removing addDependencyInitializer and addDependencyListener\nfunction removeAllHandlers() {\n    if (dependencyInitializerHandler) {\n        // Remove the dependency initializer\n        dependencyInitializerHandler.remove();\n        console.log(\"dependencyInitializerHandler is removed\");\n    }\n\n    if (dependencyListenerHandler) {\n        // Remove the dependency Listener\n        dependencyListenerHandler.remove();\n        console.log(\"dependencyListenerHandler is removed\");\n    }\n}\n\nfunction createConfigDetails() {\n    let config = getConfig();\n    clearEle(configContainerId);\n    createDetailList(configDetails, config, configContainerId, \"Config\");\n}\n\nfunction changeConfigOnClick() {\n    changeConfig();\n    createConfigDetails();\n}\n\nfunction onAddHandlersClick() {\n    addDependencyListenerOnclick();\n    addDependencyInitializerOnClick();\n}\n\nfunction createAjaxPerformRequest() {\n    console.log(\"turn on perf tracking for ajax calls\");\n    enableAjaxPerfTrackingConfig();\n    createConfigDetails();\n    createXhrRequest();\n}\n\nfunction createButtonSection() {\n    let container = document.getElementById(buttonSectionId);\n    let changeConfigBtn = createButton(changeConfigButtonId, changeConfigOnClick, changeConfigButtonId);\n    let handlersBtn = createButton(addHandlersButtonId, onAddHandlersClick, dependencyListenerButtonId);\n    let fetchButton = createButton(fetchCallId, createFetchRequest);\n    let ajaxPerfButton = createButton(ajaxCallId, createAjaxPerformRequest);\n    let xhrButton = createButton(fetchXhrId, createXhrRequest);\n    let untrackRequestButton = createButton(untrackFetchRequestId, createUnTrackRequest);\n    let stopEventButton = createButton(stopDependencyEventButtonId, stopDependencyEvent);\n    let removeHandlersButton = createButton(removeAllHandlersId, removeAllHandlers);\n    let clearBtn = createButton(clearDetailsButtonId, clearDetailsList);\n    let buttons = [changeConfigBtn, handlersBtn, fetchButton, xhrButton, ajaxPerfButton, untrackRequestButton, stopEventButton, removeHandlersButton, clearBtn];\n    arrForEach(buttons, ele => {\n        container?.appendChild(ele);\n    });\n}\n\nfunction dependencySample() {\n    initApplicationInsights();\n    createContainers();\n    createButtonSection();\n    createConfigDetails();\n}\ndependencySample();\n"
  },
  {
    "path": "examples/dependency/src/startSpan-example.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IReadableSpan } from \"@microsoft/applicationinsights-core-js\";\nimport {\n    ApplicationInsights,\n    OTelSpanKind\n} from \"@microsoft/applicationinsights-web\";\n\n/**\n * Example demonstrating the simplified OpenTelemetry-like span interface\n * which focuses on ApplicationInsights telemetry needs.\n *\n * Key features of the simplified interface:\n * - setAttribute/setAttributes for additional properties\n * - updateName for changing span names\n * - end() to complete spans\n * - isRecording() to check if span is active\n * - spanContext() for getting trace/span IDs\n *\n * Note: This implementation does NOT include:\n * - addEvent() - events are not part of this simplified interface\n * - setStatus() - status tracking is not part of this simplified interface\n *\n * Attributes set on spans are sent as additional properties with ApplicationInsights telemetry.\n */\nexport class StartSpanExample {\n    private _appInsights: ApplicationInsights;\n\n    constructor(appInsights: ApplicationInsights) {\n        this._appInsights = appInsights;\n    }\n\n    /**\n     * Basic span creation example showing simplified interface\n     */\n    public basicSpanExample(): IReadableSpan | null {\n        if (!this._appInsights) {\n            return null;\n        }\n\n        // Create a root span with attributes\n        const span = this._appInsights.appInsights.core.startSpan(\"user-action\", {\n            kind: OTelSpanKind.SERVER,\n            attributes: {\n                \"user.id\": \"user123\",\n                \"action.type\": \"button_click\",\n                \"component\": \"ui\"\n            }\n        });\n\n        // Check if span is available before using it\n        if (!span) {\n            console.warn(\"Span creation failed - tracing may not be enabled\");\n            return null;\n        }\n\n        // Set additional individual attributes\n        span.setAttribute(\"session.id\", \"session456\");\n        span.setAttribute(\"page.url\", window.location.href);\n\n        // Set multiple attributes at once\n        span.setAttributes({\n            \"browser.name\": navigator.userAgent,\n            \"screen.resolution\": `${screen.width}x${screen.height}`,\n            \"timestamp\": Date.now()\n        });\n\n        // Update the span name if needed\n        span.updateName(\"user-button-click\");\n\n        // Check if span is still recording\n        console.log(\"Span is recording:\", span.isRecording());\n\n        // Get span context for trace/span IDs\n        const spanContext = span.spanContext();\n        console.log(\"Trace ID:\", spanContext.traceId);\n        console.log(\"Span ID:\", spanContext.spanId);\n\n        // End the span after some work\n        setTimeout(() => {\n            if (span) {\n                span.end();\n                console.log(\"Span ended. Still recording:\", span.isRecording());\n            }\n        }, 1000);\n\n        return span;\n    }\n\n    /**\n     * Example showing child span creation for nested operations\n     */\n    public nestedSpanExample(): { parent: IReadableSpan, child: IReadableSpan } | null {\n        if (!this._appInsights) {\n            return null;\n        }\n\n        // Create parent span for overall operation\n        const parentSpan = this._appInsights.appInsights.core.startSpan(\"data-processing\", {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                \"operation.type\": \"batch_process\",\n                \"data.source\": \"user_upload\"\n            }\n        });\n\n        // Create child span for specific sub-operation\n        // The child will automatically inherit the parent's trace context\n        const childSpan = this._appInsights.appInsights.core.startSpan(\"validate-data\", {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                \"validation.rules\": \"strict\",\n                \"data.format\": \"csv\"\n            }\n        });\n\n        // Check if spans are available before using them\n        if (!parentSpan || !childSpan) {\n            console.warn(\"Span creation failed - tracing may not be enabled\");\n            // Clean up any successfully created spans\n            if (parentSpan) {\n                parentSpan.end();\n            }\n            if (childSpan) {\n                childSpan.end();\n            }\n            return null;\n        }\n\n        // Both spans share the same trace ID but have different span IDs\n        console.log(\"Parent Trace ID:\", parentSpan.spanContext().traceId);\n        console.log(\"Child Trace ID:\", childSpan.spanContext().traceId);\n        console.log(\"Parent Span ID:\", parentSpan.spanContext().spanId);\n        console.log(\"Child Span ID:\", childSpan.spanContext().spanId);\n\n        // Simulate nested operations\n        setTimeout(() => {\n            // Child operation completes first\n            if (childSpan) {\n                childSpan.setAttribute(\"validation.result\", \"passed\");\n                childSpan.setAttribute(\"records.validated\", 1500);\n                childSpan.end();\n            }\n\n            // Parent operation completes after child\n            setTimeout(() => {\n                if (parentSpan) {\n                    parentSpan.setAttribute(\"processing.result\", \"success\");\n                    parentSpan.setAttribute(\"total.records\", 1500);\n                    parentSpan.end();\n                }\n            }, 200);\n        }, 800);\n\n        return { parent: parentSpan, child: childSpan };\n    }\n\n    /**\n     * Example showing HTTP request tracking with spans\n     */\n    public httpRequestSpanExample(): IReadableSpan | null {\n        if (!this._appInsights) {\n            return null;\n        }\n\n        // Create span for HTTP request\n        const httpSpan = this._appInsights.appInsights.core.startSpan(\"api-call\", {\n            kind: OTelSpanKind.CLIENT,\n            attributes: {\n                \"http.method\": \"POST\",\n                \"http.url\": \"https://api.example.com/data\",\n                \"http.user_agent\": navigator.userAgent\n            }\n        });\n\n        // Check if span is available before using it\n        if (!httpSpan) {\n            console.warn(\"HTTP span creation failed - tracing may not be enabled\");\n            return null;\n        }\n\n        // Simulate making an HTTP request\n        fetch(\"https://api.example.com/data\", {\n            method: \"POST\",\n            body: JSON.stringify({ test: \"data\" }),\n            headers: {\n                \"Content-Type\": \"application/json\"\n            }\n        }).then(response => {\n            // Set response attributes\n            if (httpSpan) {\n                httpSpan.setAttribute(\"http.status_code\", response.status);\n                httpSpan.setAttribute(\"http.response.size\", response.headers.get(\"content-length\") || 0);\n                \n                if (response.ok) {\n                    httpSpan.setAttribute(\"http.result\", \"success\");\n                } else {\n                    httpSpan.setAttribute(\"http.result\", \"error\");\n                    httpSpan.setAttribute(\"error.message\", `HTTP ${response.status}`);\n                }\n            }\n\n            return response.json();\n        }).then(data => {\n            if (httpSpan) {\n                httpSpan.setAttribute(\"response.records\", data?.length || 0);\n                httpSpan.end();\n            }\n        }).catch(error => {\n            if (httpSpan) {\n                httpSpan.setAttribute(\"http.result\", \"error\");\n                httpSpan.setAttribute(\"error.message\", error.message);\n                httpSpan.setAttribute(\"error.type\", error.name);\n                httpSpan.end();\n            }\n        });\n\n        return httpSpan;\n    }\n\n    /**\n     * Example showing manual trace context management\n     */\n    public manualTraceContextExample(): void {\n        if (!this._appInsights) {\n            return;\n        }\n\n        // Get current trace context\n        const currentContext = this._appInsights.appInsights.core.getTraceCtx();\n        console.log(\"Current trace context:\", currentContext);\n\n        // Create a span - this automatically becomes the active trace context\n        const span = this._appInsights.appInsights.core.startSpan(\"background-task\", {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                \"task.priority\": \"low\"\n            }\n        });\n\n        // Check if span is available before using it\n        if (!span) {\n            console.warn(\"Background task span creation failed - tracing may not be enabled\");\n            return;\n        }\n\n        // The span's context is now active for distributed tracing\n        const newContext = this._appInsights.appInsights.core.getTraceCtx();\n        console.log(\"New trace context after span creation:\", newContext);\n\n        // Any HTTP requests or other telemetry will now include this trace context\n        setTimeout(() => {\n            if (span) {\n                span.setAttribute(\"task.result\", \"completed\");\n                span.end();\n            }\n            \n            // Context remains until explicitly changed or another span is created\n            console.log(\"Trace context after span end:\", this._appInsights?.appInsights.core.getTraceCtx());\n        }, 500);\n    }\n\n    /**\n     * Example showing span attribute best practices for ApplicationInsights\n     */\n    public attributeBestPracticesExample(): IReadableSpan | null {\n        if (!this._appInsights) {\n            return null;\n        }\n\n        const span = this._appInsights.appInsights.core.startSpan(\"business-operation\", {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                // Use semantic naming conventions\n                \"operation.name\": \"calculate_price\",\n                \"operation.version\": \"1.2.0\",\n                \n                // Include business context\n                \"customer.tier\": \"premium\",\n                \"product.category\": \"electronics\",\n                \n                // Include technical context\n                \"service.name\": \"pricing-service\",\n                \"service.version\": \"2.1.3\"\n            }\n        });\n\n        // Check if span is available before using it\n        if (!span) {\n            console.warn(\"Span creation failed - tracing may not be enabled\");\n            return null;\n        }\n\n        // Add dynamic attributes during operation\n        span.setAttributes({\n            \"calculation.start_time\": Date.now(),\n            \"input.items_count\": 5,\n            \"pricing.rules_applied\": \"discount,tax,shipping\"\n        });\n\n        // Simulate business logic\n        setTimeout(() => {\n            // Ensure span is still available in callback\n            if (span) {\n                // Add result attributes\n                span.setAttribute(\"calculation.duration_ms\", 150);\n                span.setAttribute(\"output.base_price\", 299.99);\n                span.setAttribute(\"output.final_price\", 254.99);\n                span.setAttribute(\"discount.applied\", 45.00);\n                \n                // These attributes will be sent as additional properties\n                // with ApplicationInsights telemetry for correlation and analysis\n                span.end();\n            }\n        }, 150);\n\n        return span;\n    }\n}\n\n/**\n * Helper function to initialize ApplicationInsights with startSpan support\n */\nexport function createApplicationInsightsWithSpanSupport(connectionString: string): ApplicationInsights {\n    const appInsights = new ApplicationInsights({\n        config: {\n            connectionString: connectionString,\n            // Enable distributed tracing for span context propagation\n            disableAjaxTracking: false,\n            disableFetchTracking: false,\n            enableCorsCorrelation: true,\n            enableRequestHeaderTracking: true,\n            enableResponseHeaderTracking: true\n        }\n    });\n\n    appInsights.loadAppInsights();\n    return appInsights;\n}\n\n/**\n * Usage example\n */\nexport function runStartSpanExamples() {\n    // Initialize ApplicationInsights\n    const appInsights = createApplicationInsightsWithSpanSupport(\n        \"InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE\"\n    );\n\n    // Create example instance\n    const examples = new StartSpanExample(appInsights);\n\n    // Run examples\n    console.log(\"Running basic span example...\");\n    examples.basicSpanExample();\n\n    setTimeout(() => {\n        console.log(\"Running nested span example...\");\n        examples.nestedSpanExample();\n    }, 1500);\n\n    setTimeout(() => {\n        console.log(\"Running HTTP request span example...\");\n        examples.httpRequestSpanExample();\n    }, 3000);\n\n    setTimeout(() => {\n        console.log(\"Running manual trace context example...\");\n        examples.manualTraceContextExample();\n    }, 4500);\n\n    setTimeout(() => {\n        console.log(\"Running attribute best practices example...\");\n        examples.attributeBestPracticesExample();\n    }, 6000);\n}\n"
  },
  {
    "path": "examples/dependency/src/utils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach } from \"@microsoft/applicationinsights-core-js\";\nimport { arrIncludes } from \"@nevware21/ts-utils\";\n\nexport const containerId = \"dependency-sample-container\";\nexport const dependencyListenerButtonId = \"dependency-listener-button\";\nexport const dependencyListenerDetailsContainerId = \"dependency-listener-detail-container\";\nexport const dependencyInitializerDetailsContainerId = \"dependency-initializer-detail-container\";\nexport const stopDependencyEventButtonId = \"stop-dependency-events\";\nexport const changeConfigButtonId = \"change-config\";\nexport const fetchCallId = \"create-fetch-request\";\nexport const fetchXhrId = \"create-xhr-request\";\nexport const ajaxCallId = \"create-ajaxPerf-request\";\nexport const untrackFetchRequestId = \"create-untrack-fetch-request\";\nexport const removeAllHandlersId = \"remove-all-handlers\";\nexport const buttonSectionId = \"button-section\";\nexport const clearDetailsButtonId = \"clear-all-details\";\nexport const addHandlersButtonId = \"add-handlers\";\nexport const configContainerId = \"config-details\";\nexport const dependencyListenerDetails: string[] = [\"input\",\"traceId\",\"spanId\",\"traceFlags\",\"context\"]; // check full details in console\nexport const dependencyInitializerDetails: string[] = [\"item\",\"properties\",\"sysProperties\",\"context\"]; // check full details in console\nexport const ajaxDetails: string[] = [\"disabbleFetchTracking\", \"disableExceptionTracking\", \"enableAutoRouteTracking\"];\nexport const analyticsDetails: string[] = [\"autoTrackPageVisitTime\", \"appId\", \"enableAjaxPerfTracking\", \"enableCorsCorrelation\"];\nexport const configDetails: string[] = [\"connectionString\",...ajaxDetails, ...analyticsDetails]; // check full details in console\n\n\nexport function createFetchRequest() {\n    fetch(\"https://api.npms.io/v2/search?q=react&size=1\").then(() =>{\n        console.log(\"a fetch call triggered\");\n    });\n}\n\nexport function createXhrRequest() {\n    let xhr = new XMLHttpRequest();\n    xhr.open(\"GET\", \"https://api.npms.io/v2/search?q=react&size=1\");\n    xhr.onload = function() {\n        console.log(\"a xhr call triggered\");\n    };\n    xhr.send();\n}\n\nexport function createUnTrackRequest() {\n    fetch(\"https://api.npms.io/v2/search?q=angular&size=1\").then(() =>{\n        console.log(\"a untracked fetch call triggered\");\n    });\n}\n\nexport function randomBoolean() {\n    if (Math.random() > 0.5) {\n        return true;\n    }\n    return false;\n}\n\nexport function createDetailList(propsToWatch: string[], details: any, id: string, title: string) {\n    let container = document.getElementById(id);\n    let ele = document.createElement(\"div\");\n    ele.className = \"list\";\n    let date = new Date();\n    let list = \"\";\n    if (details) {\n        list += `\n            <h6>Dependency ${title} Details After Modifications</h6>\n            <div>Check console for details before modifications and network trace for complete details</div>\n            <div class=\"time\">Date: ${date}</div>\n        `;\n\n        arrForEach(propsToWatch, (prop) => {\n            let obj = details[prop];\n            if (prop === \"item\") {\n                obj = {name: obj.name, target: obj.target};\n            }\n            if (arrIncludes(analyticsDetails, prop)) {\n                obj = details[\"extensionConfig\"][\"ApplicationInsightsAnalytics\"][prop];\n            }\n            if (arrIncludes(ajaxDetails, prop)) {\n                obj = details[\"extensionConfig\"][\"AjaxDependencyPlugin\"][prop];\n            }\n            obj = (obj === undefined)?  \"undefined\" : obj;\n            if (typeof obj === \"object\") {\n                obj = JSON.stringify(obj);\n            }\n            list += `<li>${prop}: ${obj}</li>`;\n\n        });\n        \n        list += \"<div>-------------------------</div>\";\n        ele.innerHTML = list;\n        container?.appendChild(ele);\n    }\n}\n\nexport function createContainers() {\n    let container = document.createElement(\"div\");\n    container.className = \"container\";\n    container.id = containerId;\n    let buttonSection = createSubContainer(buttonSectionId, \"container\");\n    container.appendChild(buttonSection);\n    let configSection = createSubContainer(configContainerId);\n    container.appendChild(configSection);\n    let ListenerSection = createSubContainer(dependencyListenerDetailsContainerId);\n    container.appendChild(ListenerSection);\n    let initializerSection = createSubContainer(dependencyInitializerDetailsContainerId);\n    container.appendChild(initializerSection);\n    document.body.appendChild(container);\n}\n\nexport function createSubContainer(id: string, className?: string) {\n    let ele = document.createElement(\"div\");\n    ele.className =  className || \"container-main\";\n    ele.id = id;\n    return ele\n}\n\nexport function createButton(buttonTextContent: string, buttonOnclickFn: any, id?: string): HTMLButtonElement {\n    let btn = document.createElement(\"button\");\n    if (id) {\n        btn.id = id;\n    }\n    btn.innerHTML = buttonTextContent\n    btn.onclick = buttonOnclickFn;\n    return btn;\n}\n\nexport function generateNewConfig() {\n    let prefix = Math.random().toString(36).slice(6);\n\n    let newConfig: any = {\n        connectionString: `InstrumentationKey=newKey${prefix}`,\n        extensionConfig: {\n            ApplicationInsightsAnalytics: {\n                autoTrackPageVisitTime: randomBoolean(),\n                appId: Math.random().toString(36).slice(8),\n                enableAjaxPerfTracking:  randomBoolean(),\n                enableCorsCorrelation: randomBoolean()\n            },\n            AjaxDependencyPlugin: {\n                disabbleFetchTracking: randomBoolean(), // if true, fetch tracking will be blocked\n                disableExceptionTracking: randomBoolean(),\n                enableAutoRouteTracking: randomBoolean()\n            }\n        }\n    }\n    return newConfig;\n}\n\nexport function clearEle(id: string) {\n    let ele = document.getElementById(id);\n    if (ele) {\n        ele.innerHTML = \"\";\n    }\n}\n\nexport function clearDetailsList() {\n    clearEle(dependencyListenerDetailsContainerId);\n    clearEle(dependencyInitializerDetailsContainerId);\n}\n\n"
  },
  {
    "path": "examples/dependency/style/style.css",
    "content": "body {\n    margin: 0;\n    font-family: \"Segoe UI\", sans-serif;\n    font-size: 16px;\n    padding-left: 1rem;\n}\n\nh1 {\n    font-size: 1.875rem;\n    margin: 0.67rem 0;\n}\n\nh2 {\n    font-size: 1.5rem;\n    margin: 0.83rem 0;\n}\n\nh3 {\n    font-size: 1.25rem;\n    margin: 1rem 0;\n}\n\nh4 {\n    font-size: 1.05rem;\n    margin: 1.33rem 0;\n}\n\nh5 {\n    font-size: 1rem;\n    margin: 0.67rem 0;\n}\n\nh6 {\n    font-size: 0.875rem;\n    margin: 0.3rem 0;\n}\n\n.uppercase {\n    text-transform: uppercase;\n}\n\npre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n}\n\nol,\nul {\n    margin: 1em 0;\n}\n\n.container {\n    max-width: 1600px;\n    padding: 0 0.5rem;\n}\n\n.container-main {\n    justify-content: space-between;\n    font-size: 0.9rem;\n    position: relative;\n    margin: 1.5rem auto;\n    padding-left: 0.5rem;\n    max-height: 200px;\n    overflow: auto;\n    background-color: azure;\n}\n\ncode,\npre {\n    font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n    padding: 0.2em;\n    margin: 0;\n    font-size: 0.875rem;\n    border-radius: 0.8em;\n}\n\nbutton {\n    font-family: \"Segoe UI\", sans-serif;\n    margin: 0.5rem;\n    padding: 0.2em;\n}\n\n.time {\n    font-weight: bold;\n    font-size: 0.8rem;\n}"
  },
  {
    "path": "examples/dependency/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {                   \n      \"target\": \"es5\",                           \n      \"module\": \"es6\",\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"moduleResolution\": \"node\",\n      \"strict\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"esModuleInterop\": true,\n      \"skipLibCheck\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"noImplicitAny\": false,\n      \"importHelpers\": true,\n      \"allowJs\": true,\n      \"resolveJsonModule\": true,\n      \"declaration\": true,\n      \"declarationDir\": \"build/types\",\n      \"outDir\": \"dist-es5\",\n      \"rootDir\": \"./src\",\n      \"removeComments\": false\n      },\n    \"include\": [\n      \"./src\"\n    ],\n    \"exclude\": [\n      \"node_modules\"\n  ]\n}"
  },
  {
    "path": "examples/shared-worker/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK Example - Shared Worker\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n\nExample to instrument a Shared-Worker\n\n## Simple Instrumented Shared Worker Example\n\nThis is a simple example that uses 2 Shared Workers as defined by\n- [worker.ts](./src/worker.ts)\n- [worker2.ts](./src/worker2.ts)\n\nYou WILL NEED to have compiled the repository before running this example as it loads the compiled scripts, and you will also NEED to start the\nlocal web server via `npm run serve` from the root of repository.\n\nYou can load the Shared Worker example via the [SharedWorker.html](SharedWorker.html).\n\nThis implements a VERY simple Shared Worker example that passes messages between the\ncurrent page and the workers using the type in the [IExampleMessage](./src/interfaces/IExampleMessage.ts),\nAnd the support functions for the Web page are located in [example-shared-worker.ts](./src/example-shared-worker.ts)\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "examples/shared-worker/SharedWorker.html",
    "content": "<html>\n    <head>\n        <script src=\"./browser/example-shared-worker.gbl.js\"></script>\n    </head>\n    <body>\n        <h1>Simple Instrumented Shared Worker Example</h1>\n        <p>Please make sure that you have compiled the repository before running this example as it loads the compiled scripts.</p>\n        <p>This script also needs to be run from the hosted `localhost` instance which can be started by running<br/> &gt; <code>npm run serve</code><br/>\n            from the root folder of the repository.\n        </p>\n        <p>\n            And then re-laoding this page from <a href=\"http://localhost:9001/examples/shared-worker/SharedWorker.html\">http://localhost:9001/examples/shared-worker/SharedWorker.html</a>\n        </p>\n        <p>\n            Work is sent to the worker(s) and any responses are returned and displayed on the main console, if you want to inspect\n            the console of the workers you can access and debug the worker code via these links. You will need to manually open as accessing\n            local resources is generally prohibited.\n            <ul>\n                <li>Chrome: <code>chrome://inspect/#workers</code></li>\n                <li>MS Edge: <code>edge://inspect/#workers</code></li>\n            </ul>\n        </p>\n        <hr />\n        <h2>Worker 1 - Instrumented</h2>\n        <p>You must use the <code>Initialize SDK</code> button at least once to initialize Application Insights within the worker.\n            The <code>Unload SDK</code> will cause the SDK instance in the worker to unload and this will disable the reporting of fetch calls.<br/>\n            Once the SDK in initialized it will report back when events are sent from the Workers SDK instance.\n        </p>\n        <div>\n            <div style=\"display:inline-block; width:50%; vertical-align: top;\">\n                <div>\n                    <div style=\"display:inline-block; width:10%\">\n                        <label for=\"connectionString\">Connection String</label>\n                    </div>\n                    <input id=\"connectionString\" style=\"width:50%\" value=\"YourConnectionString\" />\n                </div>\n                <div style=\"margin-top:10px\">\n                    <div style=\"display:inline-block; width:10%\">\n                    </div>\n                    <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.loadSdk('connectionString')\">Initialize SDK</button>\n                    <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.unloadSdk()\">Unload SDK</button>\n                </div>\n                <hr style=\"margin-top:10px\"/>\n                <div>\n                    <div style=\"display:inline-block; width:10%\">\n                        <label for=\"fetchUrl\">Fetch URL</label>\n                    </div>\n                    <input id=\"fetchUrl\" style=\"width:50%\" value=\"https://js.monitor.azure.com/scripts/b/ai.2.integrity.json\" />\n                </div>\n                <div style=\"margin-top:10px\">\n                    <div style=\"display:inline-block; width:10%\">\n                    </div>\n                    <div style=\"display:inline-block\">\n                        <div>\n                            This will cause the worker (if the SDK is initialized) to send a RemoteDependency event.\n                        </div>\n                        <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.fetchUrl('fetchUrl')\">Fetch the URL</button> (Contents will be sent to the main page console via a post)\n                    </div>\n                </div>\n                <div style=\"margin-top:10px\">\n                    <div style=\"display:inline-block; width:10%\">\n                    </div>\n                    <div style=\"display:inline-block\">\n                        <div style=\"margin-bottom:2px\">\n                            This will cause the worker (if the SDK is initialized) to send a new PageView event.\n                        </div>\n                        <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.trackPageView()\">Track Page View</button>\n                    </div>\n                </div>\n                <div style=\"margin-top:10px\">\n                    <div style=\"display:inline-block; width:10%\">\n                    </div>\n                    <div style=\"display:inline-block\">\n                        <div style=\"margin-bottom:2px\">\n                            Send an invalid request to the worker\n                        </div>\n                        <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.sendInvalidRequest()\">Send Invalid Request</button>\n                    </div>\n                </div>\n            </div>\n            <div style=\"display:inline-table; width:45%; margin-left: 10px\">\n                <p>This is the information returned by the worker, when the SDK is initialized you will see an \"Events Sent\"\n                    message when the SDK has sent the events to Azure Monitor, if the connection string is valid you will\n                    see the generated events in the Azure Monitor Portal.\n                </p>\n                <textarea id=\"_logContainer-log\" style=\"width:100%; min-height: 200px;\"></textarea>\n                <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.clearLog('log')\">Clear Log</button>\n            </div>\n        </div>\n        <hr/>\n        <h2>Worker 2 - Not Instrumented</h2>\n        <div>\n            <div style=\"display:inline-block; width:50%; vertical-align: top;\">\n                <div>\n                    <div style=\"display:inline-block; width:10%\">\n                        <label for=\"fetch2Url\">Fetch URL</label>\n                    </div>\n                    <input id=\"fetch2Url\" style=\"width:50%\" value=\"https://js.monitor.azure.com/scripts/b/ai.2.integrity.json\" />\n                </div>\n                <div style=\"margin-top:10px\">\n                    <div style=\"display:inline-block; width:10%\">\n                    </div>\n                    <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.fetch2Url('fetch2Url')\">Fetch the URL</button> (Contents will be sent to the main page console via a post)\n                </div>\n                <div style=\"margin-top:10px\">\n                    <div style=\"display:inline-block; width:10%\">\n                    </div>\n                    <div style=\"display:inline-block\">\n                        <div style=\"margin-bottom:2px\">\n                            Send an invalid request to the worker\n                        </div>\n                        <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.sendInvalidRequest2()\">Send Invalid Request</button>\n                    </div>\n                </div>\n            </div>\n            <div style=\"display:inline-block; width:45%; margin-left: 10px\">\n                <p>This is the information returned by the worker 2.\n                </p>\n                <textarea id=\"_logContainer-log2\" style=\"width:100%; min-height: 200px;\"></textarea>\n                <button onclick=\"javascript:Microsoft.ApplicationInsights.Example.clearLog('log2')\">Clear Log</button>\n            </div>\n        </div>\n    </body>\n</html>"
  },
  {
    "path": "examples/shared-worker/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-example-shared-worker\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights Shared Worker Example\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\",\n        \"example\"\n    ],\n    \"module\": \"dist-es5/applicationinsights-example-shared-worker.js\",\n    \"types\": \"types/applicationinsights-example-shared-worker.d.ts\",\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser\",\n        \"build:esm\": \"grunt example-shared-worker\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"mintest\": \"\",\n        \"perftest\": \"\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"ai-min\": \"\",\n        \"ai-restore\": \"\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/examples/shared-worker\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-web\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "examples/shared-worker/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport cleanup from \"rollup-plugin-cleanup\";\nimport dynamicRemove from \"@microsoft/dynamicproto-js/tools/rollup/dist/node/removedynamic\";\nimport { es5Poly, es5Check, importCheck } from \"@microsoft/applicationinsights-rollup-es5\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst workerName = \"example-shared-worker\";\nconst workerModule = \"worker\";\nconst worker2Module = \"worker2\";\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK Example - Shared Worker, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nfunction doCleanup() {\n  return cleanup({\n    comments: [\n      'some', \n      /^.\\s*@DynamicProtoStub/i,\n      /^\\*\\*\\s*@class\\s*$/\n    ]\n  })\n}\n\nconst browserRollupConfigFactory = (name, isProduction, format = \"umd\", extension = \"\") => {\n  const browserRollupConfig = {\n    input: `dist-es5/${name}.js`,\n    output: {\n      file: `browser/${name}${extension ? \".\" +extension : \"\"}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights.Example\",\n      extend: true,\n      freeze: false,\n      sourcemap: true\n    },\n    treeshake: {\n      propertyReadSideEffects: false,\n      moduleSideEffects: false,\n      tryCatchDeoptimization: false,\n      correctVarValueBeforeDeclaration: false\n    },\n    plugins: [\n      dynamicRemove(),\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: replaceValues\n      }),\n      // This just makes sure we are importing the example dependencies correctly\n      importCheck({ exclude: [ \"applicationinsights-example-shared-worker\" ] }),\n      nodeResolve({\n        module: true,\n        browser: true,\n        preferBuiltins: false\n      }),\n      doCleanup(),\n      es5Poly(),\n      es5Check()\n    ]\n  };\n\n  if (isProduction) {\n    browserRollupConfig.output.file = `browser/${name}${extension ? \".\" +extension : \"\"}.min.js`;\n    browserRollupConfig.plugins.push(\n      uglify({\n        ie8: false,\n        ie: true,\n        compress: {\n          ie: true,\n          passes:3,\n          unsafe: true,\n        },\n        output: {\n          ie: true,\n          preamble: banner,\n          webkit:true\n        }\n      })\n    );\n  }\n\n  return browserRollupConfig;\n};\n\nupdateDistEsmFiles(replaceValues, banner);\n\nexport default [\n  browserRollupConfigFactory(workerName, false, \"iife\", \"gbl\"),\n  browserRollupConfigFactory(workerModule, false, \"esm\"),\n  browserRollupConfigFactory(worker2Module, false, \"esm\")\n];\n"
  },
  {
    "path": "examples/shared-worker/src/example-shared-worker.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getDocument } from \"@nevware21/ts-utils\";\nimport { ExampleMessageType, IExampleRequest } from \"./interfaces/IExampleMessage\";\n\n\nlet _logContainers = {\n    log: \"\",\n    log2: \"\"\n};\nlet _worker: SharedWorker;\nlet _worker2: SharedWorker;\n\n\n//-------------------------------------------------------------------------------------\n// Main Page Helper functions\n//-------------------------------------------------------------------------------------\n\n/**\n * Log details to the named HTML Text Area\n * @param message\n * @param dest\n */\nfunction logMessage(message: string, dest: keyof typeof _logContainers) {\n    var dateTime = new Date().toLocaleString();\n    var target = \"_logContainer-\" + dest || \"log\";\n    var elm = document.getElementById(target);\n    _logContainers[target] = dateTime + \": \" + message + \"\\n\" + (_logContainers[target] ||\"\");\n    if (_logContainers[target].length > 4096) {\n        _logContainers[target] = _logContainers[target].substring(0, 4090) + \"...\\n\";\n    }\n\n    if (elm) {\n        elm.innerHTML = _logContainers[target];\n    }\n\n    console.log(message);\n}\n\n/**\n * Clear the log and the named HTML Text Area\n * @param dest\n */\nexport function clearLog(dest: keyof typeof _logContainers) {\n    var target = \"_logContainer-\" + dest || \"log\";\n    var elm = document.getElementById(target);\n    _logContainers[target] = \"\";\n\n    if (elm) {\n        elm.innerHTML = _logContainers[target];\n    }\n}\n\n//-------------------------------------------------------------------------------------\n// Worker 1 functions for main page\n//-------------------------------------------------------------------------------------\n\n/**\n * Cause Worker 1 to be loaded and started or return the previous loaded / started reference\n * @returns\n */\nexport function loadSharedWorker() {\n    if (!_worker) {\n        _worker = new SharedWorker(\"./browser/worker.js\");\n        _worker.port.onmessage = (evt) => {\n            let resp = evt.data;\n            if (resp) {\n                logMessage(JSON.stringify(resp), \"log\");\n            }\n        }\n    }\n\n    return _worker;\n}\n\n/**\n * Send a message to Worker 1, this will initialize the worker if has not already been started\n * @param message\n */\nexport function sendWorkerMessage(message: IExampleRequest) {\n    let worker = loadSharedWorker();\n    worker.port.postMessage(message);\n}\n\n/**\n * Ask Worker 1 to initialize the SDK\n * @param connectionStringId\n */\nexport function loadSdk(connectionStringId: string) {\n    let doc = getDocument();\n    let elm = doc.getElementById(connectionStringId) as HTMLInputElement;\n    let connectionString: string;\n\n    if (elm) {\n        connectionString = elm.value;\n    }\n\n    sendWorkerMessage({\n        type: ExampleMessageType.Load,\n        connectionString: connectionString\n    });\n}\n\n/**\n * Ask Worker 1 to unload the SDK\n */\nexport function unloadSdk() {\n    sendWorkerMessage({\n        type: ExampleMessageType.Unload\n    });\n}\n\n/**\n * Ask Worker 1 to fetch the provided URL (this will cause the worker fetch to trigger a Dependency Request)\n * @param urlId\n */\nexport function fetchUrl(urlId: string) {\n    let doc = getDocument();\n    let elm = doc.getElementById(urlId) as HTMLInputElement;\n    let theUrl: string;\n\n    if (elm) {\n        theUrl = elm.value;\n    }\n\n    sendWorkerMessage({\n        type: ExampleMessageType.Fetch,\n        url: theUrl\n    });\n}\n\n/**\n * Ask Worker 1 to perform a track Page view\n */\nexport function trackPageView() {\n    sendWorkerMessage({\n        type: ExampleMessageType.TrackPageView\n    });\n}\n\n/**\n * Send an invalid request to Worker 1\n */\nexport function sendInvalidRequest() {\n    sendWorkerMessage({\n        type: 9999\n    });\n}\n\n//-------------------------------------------------------------------------------------\n// Worker 2 functions for main page\n//-------------------------------------------------------------------------------------\n\n/**\n * Cause Worker 2 to be loaded and started or return the previous loaded / started reference\n * @returns\n */\nexport function loadSharedWorker2() {\n    if (!_worker2) {\n        _worker2 = new SharedWorker(\"./browser/worker2.js\");\n        _worker2.port.onmessage = (evt) => {\n            let resp = evt.data;\n            if (resp) {\n                logMessage(JSON.stringify(resp), \"log2\");\n            }\n        }\n    }\n\n    return _worker2;\n}\n\n/**\n * Send a message to Worker 2, this will initialize the worker if has not already been started\n * @param message\n */\nexport function sendWorker2Message(message: IExampleRequest) {\n    let worker = loadSharedWorker2();\n    worker.port.postMessage(message);\n}\n\n/**\n * Ask Worker 2 to fetch the provided URL (this will cause the worker fetch to trigger a Dependency Request)\n * @param urlId\n */\nexport function fetch2Url(urlId: string) {\n    let doc = getDocument();\n    let elm = doc.getElementById(urlId) as HTMLInputElement;\n    let theUrl: string;\n\n    if (elm) {\n        theUrl = elm.value;\n    }\n\n    sendWorker2Message({\n        type: ExampleMessageType.Fetch,\n        url: theUrl\n    });\n}\n\n/**\n * Send an invalid request to Worker 2\n */\nexport function sendInvalidRequest2() {\n    sendWorker2Message({\n        type: 9999\n    });\n}\n"
  },
  {
    "path": "examples/shared-worker/src/interfaces/IExampleMessage.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Enum to identify the examples support messages\n */\nexport const enum ExampleMessageType {\n    Invalid = 0,\n    Load = 1,\n    Unload = 2,\n    Fetch = 3,\n    TrackPageView = 4\n}\n\n/**\n * The format of a request to the example workers\n */\nexport interface IExampleRequest {\n    type: ExampleMessageType;\n    connectionString?: string;\n    url?: string;\n}\n\n/**\n * The format of the response returned from the workers\n */\nexport interface IExampleResponse {\n    success: boolean;\n    message?: string;\n    resp?: string;\n}"
  },
  {
    "path": "examples/shared-worker/src/worker-npm-init.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ApplicationInsights, IConfiguration } from \"@microsoft/applicationinsights-web\"\nimport { runTargetUnload } from \"@microsoft/applicationinsights-core-js\";\n\n// Cache the previously initialized instance to avoid creating multiple instances\nlet _appInsights: ApplicationInsights;\n\n/**\n * Initialize (or return the previously initialized) SDK instance for the worker\n * @param config\n * @returns\n */\nexport function initApplicationInsights(config: IConfiguration, onInitCallback: (appInsights: ApplicationInsights, port: MessagePort) => void, port: MessagePort) {\n    \n    if (!_appInsights) {\n        // Make sure we have a configuration object\n        config = config || {};\n        if (!config.instrumentationKey || !config.connectionString) {\n            config.connectionString = \"InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE\";\n        }\n\n        _appInsights = new ApplicationInsights({\n            config: config\n        });\n        \n        _appInsights.loadAppInsights();\n        if (_appInsights.core.isInitialized()) {\n            // Call the callback before the trackPageView\n            onInitCallback(_appInsights, port);\n            _appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n        }\n\n        return _appInsights;\n    }\n\n    return _appInsights;\n}\n\n/**\n * Unload the SDK if it has been initialized\n * @returns\n */\nexport function unloadApplicationInsights() {\n    if (_appInsights) {\n        runTargetUnload(_appInsights);\n        _appInsights = null;\n        return true;\n    }\n\n    return false;\n}\n\n/**\n * Request a page view request if the SDK has been initialized\n * @returns\n */\nexport function trackPageView() {\n    if (_appInsights) {\n        _appInsights.trackPageView();\n        return true;\n    }\n\n    return false;\n}\n"
  },
  {
    "path": "examples/shared-worker/src/worker.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { initApplicationInsights, trackPageView, unloadApplicationInsights } from \"./worker-npm-init\";\nimport { ExampleMessageType, IExampleRequest, IExampleResponse } from \"./interfaces/IExampleMessage\";\nimport { ApplicationInsights, IConfiguration, INotificationListener } from \"@microsoft/applicationinsights-web\";\nimport { dumpObj, objAssign } from \"@nevware21/ts-utils\";\n\n/**\n * Default base configuration, add your defaults here.\n * Or simply specify your entire configuration and don't have the main page pass\n * the connection string.\n */\nconst defaultApplicationInsightsConfig: IConfiguration = {\n    /**\n     * Telemtry logging level to instrumentation key. All logs with a severity\n     * level higher than the configured level will sent as telemetry data to\n     * the configured instrumentation key.\n     *\n     * 0: ALL iKey logging off\n     * 1: logs to iKey: severity >= CRITICAL\n     * 2: logs to iKey: severity >= WARNING\n     */\n    loggingLevelTelemetry: 2\n};\n\n/**\n * Simple lookup table which matches the request type to the function that will process the request\n */\nconst EventHandlers: { [key: number]: (request: IExampleRequest, port: MessagePort) => IExampleResponse } = {\n    [ExampleMessageType.Invalid]: workerInvalid,\n    [ExampleMessageType.Load]: workerLoadSdk,\n    [ExampleMessageType.Unload]: workerUnloadSdk,\n    [ExampleMessageType.Fetch]: workerFetch,\n    [ExampleMessageType.TrackPageView]: workerTrackPageView\n};\n\n/**\n * The main shared worker entry point\n */\naddEventListener(\"connect\", (evt: MessageEvent) => {\n    const port = evt.ports[0];\n\n    // Add the message listener\n    port.addEventListener(\"message\", (evt: MessageEvent<IExampleRequest>) => {\n        const request = evt.data;\n        if (!request || !request.type) {\n            // doesn't look correct\n            port.postMessage(workerInvalid(request));\n            return;\n        }\n    \n        console.log(`Worker: Received message [${request.type}] from main script`);\n        let handler: (request: IExampleRequest, port: MessagePort) => IExampleResponse = EventHandlers[request.type];\n        if (!handler) {\n            handler = workerInvalid;\n        }\n\n        try {\n            let response = handler(request, port);\n            if (response) {\n                port.postMessage(response);\n            }\n        } catch (e) {\n            port.postMessage({\n                success: false,\n                message: dumpObj(e)\n            });\n        }\n    });\n\n    port.start();\n});\n\n/**\n * Handle \"Invalid\" (Unknown) request\n * @param request\n * @returns\n */\nfunction workerInvalid(request: IExampleRequest) {\n    return {\n        success: false,\n        message: `Unsupported command - ${request ? request.type : \"Invalid Request\"}`\n    }\n}\n\n/**\n * Internal hook to listen to the events send notification from the Application Insights Sender\n * @param port\n * @returns\n */\nfunction notificationListener(port: MessagePort): INotificationListener {\n    return {\n        eventsSendRequest: function () {\n            port.postMessage({\n                success: true,\n                message: `Events Sent: ${dumpObj(arguments)}`\n            });\n        }\n    };\n}\n\n/**\n * We only want to add any notification listener or telemetry initializer once\n * otherwise they WILL get called multiple times during processing.\n * @param appInsights\n * @param port\n */\nfunction onInitAddInitializers(appInsights: ApplicationInsights, port: MessagePort) {\n    // This callback is only called once, otherwise we would keep adding listeners and initializers\n    appInsights.core.getNotifyMgr().addNotificationListener(notificationListener(port));\n\n    // This is not normally needed, but this provides a view from the worker to the\n    // main page about errors that the worker is having / seeing\n    appInsights.addTelemetryInitializer((theEvent) => {\n        if (theEvent && theEvent.name && theEvent.name[\"startsWith\"](\"InternalMessageId\") && theEvent.baseData) {\n            port.postMessage({\n                success: true,\n                message: \"Internal Message: \" + (theEvent.baseData?.message || \"--\")\n            });\n\n            // Drop ALL  internal message from being sent to Azure Monitor portal\n            return false;\n        }\n    });\n}\n\n/**\n * Initialize the SDK using the passed connection string from the request (if supplied)\n * @param request\n * @param port\n * @returns\n */\nfunction workerLoadSdk(request: IExampleRequest, port: MessagePort) {\n    let theConfig = objAssign({}, defaultApplicationInsightsConfig);\n    theConfig.connectionString = request.connectionString;\n    let appInsights = initApplicationInsights(theConfig, onInitAddInitializers, port);\n    if (appInsights && appInsights.core.isInitialized()) {\n        return {\n            success: true,\n            message: `SDK Loaded and Initialized with - ${appInsights.config.connectionString}`\n        };\n    }\n\n    return {\n        success: true,\n        message: \"SDK Failed to initialize\"\n    };\n}\n\n/**\n * Unload the SDK instance\n * @param request\n * @returns\n */\nfunction workerUnloadSdk(request: IExampleRequest) {\n    if (unloadApplicationInsights()) {\n        return {\n            success: true,\n            message: \"SDK Unloading\"\n        };\n    }\n\n    return {\n        success: true,\n        message: \"SDK Already unloaded\"\n    };\n}\n\n\n/**\n * Perform a \"fetch\" request for the provided URL\n * @param request\n * @param port\n * @returns\n */\nfunction workerFetch(request: IExampleRequest, port: MessagePort) {\n    function fetchFailed(reason: any) {\n        port.postMessage({ success: false, message: dumpObj(reason) });\n    }\n\n    fetch(request.url).then((value) => {\n        value.text().then((theResponse) => {\n            port.postMessage({ success: true, resp: theResponse });\n        }, fetchFailed);\n    }, fetchFailed);\n\n    // Will return message asynchronously\n    return {\n        success: true,\n        message: \"Fetch request received\"\n    };\n}\n\n/**\n * Attempt to send a PageView event (if the SDK is initialized)\n * @param request\n * @param port\n * @returns\n */\nfunction workerTrackPageView(request: IExampleRequest, port: MessagePort) {\n    return {\n        success: trackPageView(),\n        message: \"TrackPageView requested\"\n    };\n}\n"
  },
  {
    "path": "examples/shared-worker/src/worker2.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ExampleMessageType, IExampleRequest, IExampleResponse } from \"./interfaces/IExampleMessage\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nconst EventHandlers: { [key: number]: (request: IExampleRequest, port: MessagePort) => IExampleResponse } = {\n    [ExampleMessageType.Invalid]: workerInvalid,\n    [ExampleMessageType.Fetch]: workerFetch\n};\n\n/**\n * The main shared worker entry point\n */\naddEventListener(\"connect\", (evt: MessageEvent) => {\n    const port = evt.ports[0];\n\n    // Add the message listener\n    port.addEventListener(\"message\", (evt: MessageEvent<IExampleRequest>) => {\n        const request = evt.data;\n        if (!request || !request.type) {\n            // doesn't look correct\n            console.log(\"Worker2: Invalid message received -- ignoring!\");\n            return;\n        }\n    \n        console.log(`Worker2: Received message [${request.type}] from main script`);\n        let handler: (request: IExampleRequest, port: MessagePort) => IExampleResponse = EventHandlers[request.type];\n        if (!handler) {\n            handler = workerInvalid;\n        }\n\n        try {\n            let response = handler(request, port);\n            if (response) {\n                port.postMessage(response);\n            }\n        } catch (e) {\n            port.postMessage({\n                success: false,\n                message: dumpObj(e)\n            });\n        }\n    });\n\n    port.start();\n});\n\n/**\n * Handle \"Invalid\" (Unknown) request\n * @param request\n * @returns\n */\nfunction workerInvalid(request: IExampleRequest) {\n    return {\n        success: false,\n        message: `Unsupported commend - ${request.type}`\n    }\n}\n\n/**\n * Perform a \"fetch\" request for the provided URL\n * @param request\n * @param port\n * @returns\n */\nfunction workerFetch(request: IExampleRequest, port: MessagePort) {\n    function fetchFailed(reason: any) {\n        port.postMessage({ success: false, message: dumpObj(reason) });\n    }\n\n    fetch(request.url).then((value) => {\n        value.text().then((theResponse) => {\n            port.postMessage({ success: true, resp: theResponse });\n        }, fetchFailed);\n    }, fetchFailed);\n\n    // Will return message asynchronously\n    return {\n        success: true,\n        message: \"Worker2: Fetch request received\"\n    };\n}\n"
  },
  {
    "path": "examples/shared-worker/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"es5\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": false,\n    \"alwaysStrict\": true,\n    \"skipDefaultLibCheck\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"src/**/*\"\n  ],\n  \"exclude\": [\"node_modules/\"]\n}\n"
  },
  {
    "path": "examples/startSpan/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-example-startspan\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights startSpan Example\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\",\n        \"opentelemetry\",\n        \"tracing\",\n        \"spans\",\n        \"example\"\n    ],\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser\",\n        \"build:esm\": \"grunt example-startspan\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"mintest\": \"\",\n        \"perftest\": \"\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"ai-min\": \"\",\n        \"ai-restore\": \"\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/examples/startSpan\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-web\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "examples/startSpan/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport cleanup from \"rollup-plugin-cleanup\";\nimport dynamicRemove from \"@microsoft/dynamicproto-js/tools/rollup/dist/node/removedynamic\";\nimport { es5Poly, es5Check, importCheck } from \"@microsoft/applicationinsights-rollup-es5\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\n\nconst workerName = \"startspan-example-index\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK Example - startSpan, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nfunction doCleanup() {\n  return cleanup({\n    comments: [\n      'some', \n      /^.\\s*@DynamicProtoStub/i,\n      /^\\*\\*\\s*@class\\s*$/\n    ]\n  })\n}\n\nconst browserRollupConfigFactory = (name, isProduction, format = \"umd\", extension = \"\") => {\n  const browserRollupConfig = {\n    input: `dist-es5/${name}.js`,\n    output: {\n      file: `browser/${name}${extension ? \".\" +extension : \"\"}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights.Example\",\n      extend: true,\n      freeze: false,\n      sourcemap: true\n    },\n    treeshake: {\n      propertyReadSideEffects: false,\n      moduleSideEffects: false,\n      tryCatchDeoptimization: false,\n      correctVarValueBeforeDeclaration: false\n    },\n    plugins: [\n      dynamicRemove(),\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: replaceValues\n      }),\n      // This just makes sure we are importing the example dependencies correctly\n      importCheck({ exclude: [ \"startspan-example-index\" ] }),\n      nodeResolve({\n        module: true,\n        browser: true,\n        preferBuiltins: false\n      }),\n      doCleanup(),\n      es5Poly(),\n      es5Check()\n    ]\n  };\n\n  if (isProduction) {\n    browserRollupConfig.output.file = `browser/${name}${extension ? \".\" +extension : \"\"}.min.js`;\n    browserRollupConfig.plugins.push(\n      uglify({\n        ie8: false,\n        ie: true,\n        compress: {\n          ie: true,\n          passes:3,\n          unsafe: true,\n        },\n        output: {\n          ie: true,\n          preamble: banner,\n          webkit:true\n        }\n      })\n    );\n  }\n\n  return browserRollupConfig;\n};\n\nupdateDistEsmFiles(replaceValues, banner);\n\nexport default [\n  browserRollupConfigFactory(workerName, false, \"iife\", \"gbl\")\n];"
  },
  {
    "path": "examples/startSpan/src/startSpanExample.ts",
    "content": "// Example usage of the new startSpan implementation with withSpan helper\n// This shows how to use the startSpan API to create spans and set distributed trace context\n//\n// The withSpan helper provides several benefits:\n// 1. Automatic span context management - sets span as active during execution\n// 2. Context restoration - restores previous active span after execution\n// 3. Exception safety - ensures context is restored even if function throws\n// 4. Cleaner code - eliminates manual span context management\n// 5. Nested span support - handles complex span hierarchies automatically\n\nimport { AppInsightsCore, OTelSpanKind, eOTelSpanStatusCode, withSpan } from \"@microsoft/applicationinsights-core-js\";\n\n// Example 1: Basic span creation with withSpan helper\nfunction exampleBasicSpanUsage() {\n    const core = new AppInsightsCore();\n    \n    // Initialize core (simplified)\n    core.initialize({\n        instrumentationKey: \"your-ikey-here\"\n    }, []);\n    \n    // Create a span - this will automatically set it as the active trace context\n    const span = core.startSpan(\"my-operation\", {\n        kind: OTelSpanKind.INTERNAL,\n        attributes: {\n            \"operation.type\": \"example\",\n            \"user.id\": \"123\"\n        }\n    });\n    \n    if (span) {\n        // Use withSpan to execute work within the span's context\n        const result = withSpan(core, span, () => {\n            // Do some work within the span context...\n            span.setAttribute(\"result\", \"success\");\n            // span.addEvent(\"Processing started\"); // Not implemented yet\n            \n            // Create a child span that will automatically inherit the current active context\n            const childSpan = core.startSpan(\"child-operation\", {\n                kind: OTelSpanKind.CLIENT,\n                attributes: {\n                    \"http.method\": \"GET\",\n                    \"http.url\": \"https://api.example.com/data\"\n                }\n            });\n            \n            if (childSpan) {\n                // Execute child work within its own span context\n                withSpan(core, childSpan, () => {\n                    // childSpan.addEvent(\"API call completed\"); // Not implemented yet\n                    childSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                });\n                childSpan.end();\n            }\n            \n            return \"operation completed\";\n        });\n        \n        // Complete the parent span\n        // span.addEvent(\"Processing completed\"); // Not implemented yet\n        span.setStatus({ code: eOTelSpanStatusCode.OK });\n        span.end();\n        \n        console.log(\"Operation result:\", result);\n    }\n}\n\n// Example 2: Manual parent context management with withSpan\nfunction exampleManualParentContext() {\n    const core = new AppInsightsCore();\n    \n    // Get the current active trace context\n    const currentTraceCtx = core.getTraceCtx();\n    \n    if (currentTraceCtx) {\n        // Create a new span with explicit parent\n        const span = core.startSpan(\"background-task\", {\n            kind: OTelSpanKind.INTERNAL,\n            attributes: {\n                \"task.type\": \"background\"\n            }\n        }, currentTraceCtx);\n        \n        if (span) {\n            // Use withSpan to execute work within the span context\n            // This ensures the span is properly active during execution\n            withSpan(core, span, () => {\n                // span.addEvent(\"Task started\"); // Not implemented yet\n                \n                // Simulate some background work\n                // In real scenarios, this could make HTTP requests, database calls, etc.\n                // All will inherit this span's context automatically\n                console.log(\"Executing background task with trace context:\", span.spanContext().traceId);\n                \n                // Create a child operation within this context\n                const childSpan = core.startSpan(\"background-subtask\", {\n                    kind: OTelSpanKind.INTERNAL,\n                    attributes: {\n                        \"subtask.type\": \"data-processing\"\n                    }\n                });\n                \n                if (childSpan) {\n                    withSpan(core, childSpan, () => {\n                        // This subtask automatically inherits the parent context\n                        childSpan.setAttribute(\"processed.items\", 42);\n                    });\n                    childSpan.end();\n                }\n                \n                return \"background work completed\";\n            });\n            \n            // span.addEvent(\"Task completed\"); // Not implemented yet\n            span.end();\n        }\n    }\n}\n\n// Example 3: Integration with existing telemetry using withSpan\nfunction exampleWithTelemetry() {\n    const core = new AppInsightsCore();\n    \n    // Start a span for a user action\n    const userActionSpan = core.startSpan(\"user-checkout\", {\n        kind: OTelSpanKind.SERVER,\n        attributes: {\n            \"user.id\": \"user123\",\n            \"action\": \"checkout\",\n            \"cart.items\": 5\n        }\n    });\n    \n    if (userActionSpan) {\n        // Use withSpan to execute the entire checkout process within the span context\n        const result = withSpan(core, userActionSpan, () => {\n            // Now all subsequent telemetry will inherit this trace context\n            // including dependency calls, custom events, etc.\n            \n            // Simulate processing steps\n            // userActionSpan.addEvent(\"Validating cart\"); // Not implemented yet\n            console.log(\"Processing checkout for user in trace context:\", userActionSpan.spanContext().traceId);\n            \n            // Create child span for payment processing\n            const paymentSpan = core.startSpan(\"process-payment\", {\n                kind: OTelSpanKind.CLIENT,\n                attributes: {\n                    \"payment.method\": \"credit_card\",\n                    \"payment.amount\": 99.99\n                }\n            });\n            \n            if (paymentSpan) {\n                // Execute payment processing within its own span context\n                const paymentResult = withSpan(core, paymentSpan, () => {\n                    // paymentSpan.addEvent(\"Payment authorized\"); // Not implemented yet\n                    paymentSpan.setAttribute(\"payment.processor\", \"stripe\");\n                    paymentSpan.setAttribute(\"payment.status\", \"authorized\");\n                    paymentSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n                    \n                    return { success: true, transactionId: \"txn_12345\" };\n                });\n                \n                paymentSpan.end();\n                \n                // Update parent span with payment result\n                userActionSpan.setAttribute(\"payment.success\", paymentResult.success);\n                userActionSpan.setAttribute(\"transaction.id\", paymentResult.transactionId);\n                \n                return {\n                    checkoutSuccess: true,\n                    payment: paymentResult,\n                    completedAt: new Date().toISOString()\n                };\n            }\n            \n            return { checkoutSuccess: false, error: \"Payment processing failed\" };\n        });\n        \n        // Complete the user action span\n        // userActionSpan.addEvent(\"Checkout completed\"); // Not implemented yet\n        userActionSpan.setStatus({ code: eOTelSpanStatusCode.OK });\n        userActionSpan.end();\n        \n        console.log(\"Checkout completed:\", result);\n        return result;\n    }\n    \n    return null;\n}\n\nexport {\n    exampleBasicSpanUsage,\n    exampleManualParentContext,\n    exampleWithTelemetry\n};\n"
  },
  {
    "path": "examples/startSpan/src/startspan-example-index.ts",
    "content": "// startSpan Example Index\n// This file exports the startSpan example functions for use in browser builds\n\nexport {\n    exampleBasicSpanUsage,\n    exampleManualParentContext,\n    exampleWithTelemetry\n} from \"./startSpanExample\";"
  },
  {
    "path": "examples/startSpan/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {                   \n      \"target\": \"es5\",                           \n      \"module\": \"es6\",\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"moduleResolution\": \"node\",\n      \"strict\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"esModuleInterop\": true,\n      \"skipLibCheck\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"noImplicitAny\": false,\n      \"importHelpers\": true,\n      \"allowJs\": true,\n      \"resolveJsonModule\": true,\n      \"declaration\": true,\n      \"declarationDir\": \"build/types\",\n      \"outDir\": \"dist-es5\",\n      \"rootDir\": \"./src\",\n      \"removeComments\": false\n      },\n    \"include\": [\n      \"./src\"\n    ],\n    \"exclude\": [\n      \"node_modules\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-analytics-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Analytics\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-analytics-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-analytics-js)\n\nWeb Analytics Plugin for the Application Insights Javascript SDK\n\n## Build:\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Run unit tests:\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/Tests/Unit/src/AnalyticsExtensionSize.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from '@nevware21/ts-utils';\nimport { createPromise, doAwait, IPromise } from '@nevware21/ts-async';\nimport * as pako from \"pako\";\n\nconst PACKAGE_JSON = \"../package.json\";\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction _loadPackageJson(cb:(isNightly: boolean, packageJson: any) => IPromise<void>): IPromise<void> {\n    return createPromise<void>((testCompleted, testFailed) => {\n        function _handleCallback(packageJson: any) {\n            let version = packageJson.version || \"unknown\";\n            let isNightly = version.includes(\"nightly\") || version.includes(\"dev\");\n            doAwait(cb(isNightly, packageJson), () => {\n                testCompleted();\n            }, (error) => {\n                Assert.ok(false, `checkIsNightlyBuild error: ${error}`);\n                testFailed(error);\n            });\n        }\n\n        fetch(PACKAGE_JSON).then((response) => {\n            if (!response.ok) {\n                Assert.ok(false, `fetch package.json error: ${dumpObj(response)}`);\n                _handleCallback(false);\n            } else {\n                return response.text().then((content) => {\n                    let json = JSON.parse(removeTrailingComma(content));\n                    _handleCallback(json);\n                }, (error) => {\n                    Assert.ok(false, `fetch package.json error: ${error}`);\n                    _handleCallback({});\n                });\n            }\n        }, (error) => {\n            Assert.ok(false, `fetch package.json error: ${error}`);\n            _handleCallback({});\n        });\n    });\n}\n\nfunction _checkSize(checkType: string, maxSize: number, size: number, isNightly: boolean): void {\n  if (isNightly) {\n        maxSize += .5;\n    }\n\n    Assert.ok(size <= maxSize, `exceed ${maxSize} KB, current ${checkType} size is: ${size} KB`);\n}    \n\nexport class AnalyticsExtensionSizeCheck extends AITestClass {\n    private readonly MAX_DEFLATE_SIZE = 27;\n    private readonly rawFilePath = \"../dist/es5/applicationinsights-analytics-js.min.js\";\n    private readonly prodFilePaath = \"../browser/es5/applicationinsights-analytics-js.min.js\"\n\n    public testInitialize() {\n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        this.addRawFileSizeCheck();\n        this.addProdFileSizeCheck();\n    }\n\n    constructor() {\n        super(\"AnalyticsExtensionSizeCheck\");\n    }\n\n    private addRawFileSizeCheck(): void {\n        this._fileSizeCheck(false);\n    }\n    private addProdFileSizeCheck(): void {\n        this._fileSizeCheck(true);\n    }\n    \n    private _fileSizeCheck(isProd: boolean): void {\n        let _filePath = isProd? this.prodFilePaath : this.rawFilePath;\n        let postfix = isProd? \"\" : \"-raw\";\n        let fileName = _filePath.split(\"..\")[1];\n        this.testCase({\n            name: `Test applicationinsights-analytics-extension${postfix} deflate size`,\n            test: () => {\n                Assert.ok(true, `test file: ${fileName}`);\n                return _loadPackageJson((isNightly, packageJson) => {\n                    Assert.ok(true, `  checking : ${packageJson.name || \"??\"} v${packageJson.version || \"unknown\"}`);\n                    let request = new Request(_filePath, {method:\"GET\"});\n                    return fetch(request).then((response) => {\n                        if (!response.ok) {\n                            Assert.ok(false, `fetch applicationinsights-analytics${postfix} error: ${response.statusText}`);\n                            return;\n                        } else {\n                            return response.text().then(text => {\n                                let size = Math.ceil((pako.deflate(text).length/1024) * 100) / 100.0;\n                                _checkSize(\"deflate\", this.MAX_DEFLATE_SIZE, size, isNightly);\n                            }).catch((error) => {\n                                Assert.ok(false, `applicationinsights-analytics-extension${postfix}  response error: ${error}`);\n                            });\n                        }\n                    }).catch((error: Error) => {\n                        Assert.ok(false, `applicationinsights-analytics-extension${postfix}  deflate size error: ${error}`);\n                    });\n                });\n            }\n        });\n    } \n}"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/Tests/Unit/src/AnalyticsPlugin.tests.ts",
    "content": "import { \n    Assert, AITestClass, PollingAssert, EventValidator, TraceValidator, ExceptionValidator, \n    MetricValidator, PageViewPerformanceValidator, PageViewValidator, RemoteDepdencyValidator\n} from \"@microsoft/ai-test-framework\";\nimport { SinonStub, SinonSpy } from 'sinon';\nimport { \n    Exception, SeverityLevel, Event, Trace, PageViewPerformance, IConfig, IExceptionInternal, \n    AnalyticsPluginIdentifier, IAppInsights, Metric, PageView, RemoteDependencyData, utlCanUseLocalStorage, createDomEvent, \n    ExceptionDataType,\n    TraceDataType,\n    PageViewPerformanceDataType,\n    RemoteDependencyDataType,\n    PageViewDataType,\n    MetricDataType,\n    EventDataType,\n    ExceptionEnvelopeType,\n    TraceEnvelopeType,\n    PageViewPerformanceEnvelopeType\n} from \"@microsoft/applicationinsights-core-js\";\nimport { ITelemetryItem, AppInsightsCore, IPlugin, IConfiguration, IAppInsightsCore, setEnableEnvMocks, getLocation, dumpObj, __getRegisteredEvents, createCookieMgr, findAllScripts } from \"@microsoft/applicationinsights-core-js\";\nimport { Sender } from \"@microsoft/applicationinsights-channel-js\"\nimport { PropertiesPlugin } from \"@microsoft/applicationinsights-properties-js\";\nimport { AnalyticsPlugin } from \"../../../src/JavaScriptSDK/AnalyticsPlugin\";\n\ndeclare class ExceptionHelper {\n    capture: (appInsights:IAppInsights) => void;\n    captureStrict: (appInsights:IAppInsights) => void;\n    throw: (value:any) => void;\n    throwCors: () => void;\n    throwStrict: (value:any) => void;\n    throwRuntimeException: (timeoutFunc: VoidFunction) => void;\n    throwStrictRuntimeException: (timeoutFunc: VoidFunction) => void;\n};\n\nexport class AnalyticsPluginTests extends AITestClass {\n    private _onerror:any = null;\n    private trackSpy:SinonSpy;\n    private throwInternalSpy:SinonSpy;\n    private exceptionHelper: any = new ExceptionHelper();\n    private cookieMgr = createCookieMgr();\n\n    constructor(name?: string, emulateIe?: boolean) {\n        super(name, emulateIe);\n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n    }\n\n    public testInitialize() {\n        this._onerror = window.onerror;\n        setEnableEnvMocks(false);\n        super.testInitialize();\n        this.cookieMgr.set('ai_session', \"\");\n        this.cookieMgr.set('ai_user', \"\");\n        if (utlCanUseLocalStorage()) {\n            window.localStorage.clear();\n        }\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this.cookieMgr.set('ai_session', \"\");\n        this.cookieMgr.set('ai_user', \"\");\n        if (utlCanUseLocalStorage()) {\n            window.localStorage.clear();\n        }\n        window.onerror = this._onerror;\n    }\n\n    public causeException(cb:Function) {\n        AITestClass.orgSetTimeout(() => {\n            cb();\n        }, 0);\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: 'enableAutoRouteTracking: event listener is added to the popstate event',\n            test: () => {\n                // Setup\n                const appInsights = new AnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const eventListenerStub = this.sandbox.stub(window, 'addEventListener');\n                let evtNamespace = (appInsights as any)._evtNamespace;\n\n                let registeredEvents = __getRegisteredEvents(window, null, evtNamespace);\n                Assert.equal(0, registeredEvents.length, \"No Events should be registered\");\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Act\n                core.initialize({\n                    instrumentationKey: '',\n                    enableAutoRouteTracking: true\n                } as IConfig & IConfiguration, [appInsights, channel]);\n\n                registeredEvents = __getRegisteredEvents(window, null, evtNamespace);\n                Assert.equal(2, registeredEvents.length, \"Two Events should be registered\");\n\n                // Assert\n                Assert.ok(eventListenerStub.calledTwice);\n                Assert.equal(eventListenerStub.args[0][0], \"popstate\");\n                Assert.equal(eventListenerStub.args[1][0], \"locationchange\");\n\n                core.getPlugin(appInsights.identifier).remove(false);\n\n                registeredEvents = __getRegisteredEvents(window, null, evtNamespace);\n                Assert.equal(0, registeredEvents.length, \"All Events should have been removed\");\n            }\n        });\n\n        this.testCase({\n            name: 'enableAutoRouteTracking: route changes trigger a new pageview',\n            useFakeTimers: true,\n            assertNoEvents: true,\n            test: () => {\n                // Current URL will be the test page\n                setEnableEnvMocks(true);\n                this.setLocationHref(\"firstUri\");\n\n                // Setup\n                const appInsights = new AnalyticsPlugin();\n                appInsights.autoRoutePVDelay = 500;\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const properties = new PropertiesPlugin();\n                const trackPageViewStub = this.sandbox.stub(appInsights, 'trackPageView');\n                let evtNamespace = (appInsights as any)._evtNamespace;\n\n                let registeredEvents = __getRegisteredEvents(window, null, evtNamespace);\n                Assert.equal(0, registeredEvents.length, \"No Events should be registered\");\n\n                this.onDone(() => {\n                    if (core.isInitialized()) {\n                        core.unload(false);\n                    }\n                });\n\n                // Act\n                core.initialize({\n                    instrumentationKey: '',\n                    enableAutoRouteTracking: true\n                } as IConfig & IConfiguration, [appInsights, channel, properties]);\n\n                properties.context.telemetryTrace.traceID = 'not set';\n                properties.context.telemetryTrace.name = 'name not set';\n\n                registeredEvents = __getRegisteredEvents(window, null, evtNamespace);\n                Assert.equal(2, registeredEvents.length, \"Two Events should be registered\");\n\n                this.setLocationHref(\"secondUri\");\n                window.dispatchEvent(createDomEvent('locationchange'));\n                this.clock.tick(500);\n\n                this.setLocationHref(\"thirdUri\");\n                window.dispatchEvent(createDomEvent('locationchange'));\n                this.clock.tick(500);\n\n                // Assert\n                Assert.equal(2, trackPageViewStub.callCount);\n                Assert.ok(properties.context.telemetryTrace.traceID);\n                Assert.ok(properties.context.telemetryTrace.name);\n                Assert.notEqual(properties.context.telemetryTrace.traceID, 'not set', 'current operation id is updated after route change');\n                Assert.notEqual(properties.context.telemetryTrace.name, 'name not set', 'current operation name is updated after route change');\n                // Assert.equal(appInsights['_prevUri'], 'secondUri', \"the previous uri is stored on variable _prevUri\");\n                // Assert.equal(appInsights['_currUri'], window.location.href, \"the current uri is stored on variable _currUri\");\n\n                Assert.equal(\"firstUri\", trackPageViewStub.args[0][0].refUri, \"previous uri is assigned to refUri as firstUri, and send as an argument of trackPageview method\");\n                Assert.equal(\"secondUri\", trackPageViewStub.args[1][0].refUri, \"previous uri is assigned to refUri as secondUri and send as an argument of trackPageview method\");\n\n                core.unload(false);\n                registeredEvents = __getRegisteredEvents(window, null, evtNamespace);\n                Assert.equal(0, registeredEvents.length, \"All Events should have been removed\");\n            }\n        });\n\n        this.testCase({\n            name: 'enableAutoRouteTracking: route changes trigger a new pageview with correct refUri when route changes happening before the timer autoRoutePVDelay stops',\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                setEnableEnvMocks(true);\n                this.setLocationHref(\"firstUri\");\n\n                const appInsights = new AnalyticsPlugin();\n                appInsights.autoRoutePVDelay = 500;\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const properties = new PropertiesPlugin();\n                appInsights['_prevUri'] = \"firstUri\";\n                const trackPageViewStub = this.sandbox.stub(appInsights, 'trackPageView');\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Act\n                core.initialize({\n                    instrumentationKey: '',\n                    enableAutoRouteTracking: true\n                } as IConfig & IConfiguration, [appInsights, channel, properties]);\n                properties.context.telemetryTrace.traceID = 'not set';\n                properties.context.telemetryTrace.name = 'name not set';\n\n                window.dispatchEvent(createDomEvent('locationchange'));\n                this.clock.tick(200);\n\n                // set up second dispatch\n                window.dispatchEvent(createDomEvent('locationchange'));\n                this.clock.tick(500);\n\n\n                // Assert\n                Assert.equal(2, trackPageViewStub.callCount);\n                Assert.ok(properties.context.telemetryTrace.traceID);\n                Assert.ok(properties.context.telemetryTrace.name);\n                Assert.notEqual(properties.context.telemetryTrace.traceID, 'not set', 'current operation id is updated after route change');\n                Assert.notEqual(properties.context.telemetryTrace.name, 'name not set', 'current operation name is updated after route change');\n                // first trackPageView event\n                Assert.equal(trackPageViewStub.args[0][0].refUri, 'firstUri', \"first trackPageview event: refUri grabs the value of existing _prevUri\");\n                // Assert.equal(appInsights['_currUri'], getLocation(true).href, \"first trackPageview event: the current uri is stored on variable _currUri\");\n                // second trackPageView event\n                Assert.equal(trackPageViewStub.args[1][0].refUri, getLocation(true).href, \"second trackPageview event: refUri grabs the value of updated _prevUri, which is the first pageView event's _currUri\");\n            }\n        });\n\n        this.testCase({\n            name: 'enableAutoRouteTracking: (IE9) app does not crash if history.pushState does not exist',\n            test: () => {\n                // Setup\n                const originalPushState = history.pushState;\n                const originalReplaceState = history.replaceState;\n                history.pushState = null;\n                history.replaceState = null;\n                const appInsights = new AnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const properties = new PropertiesPlugin();\n\n                this.sandbox.stub(appInsights, 'trackPageView');\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Act\n                core.initialize({\n                    instrumentationKey: '',\n                    enableAutoRouteTracking: true\n                } as IConfig & IConfiguration, [appInsights, channel, properties]);\n\n                properties.context.telemetryTrace.traceID = 'not set';\n                properties.context.telemetryTrace.parentID = undefined;\n\n                window.dispatchEvent(createDomEvent('locationchange'));\n\n                // Assert\n                Assert.ok(true, 'App does not crash when history object is incomplete');\n\n                // Cleanup\n                history.pushState = originalPushState;\n                history.replaceState = originalReplaceState;\n            }\n        });\n\n        this.testCase({\n            name: 'AppInsightsTests: PageVisitTimeManager is constructed when analytics plugin is initialized',\n            test: () => {\n                // Setup\n                const channel = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights: AnalyticsPlugin = new AnalyticsPlugin();\n\n                // Act\n                const config = {\n                    instrumentationKey: 'ikey'\n                };\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    config,\n                    [appInsights, channel]\n                );\n                const pvtm = appInsights['_pageVisitTimeManager'];\n\n                // Assert\n                Assert.ok(pvtm)\n                Assert.ok(pvtm['_logger']);\n                Assert.ok(pvtm['pageVisitTimeTrackingHandler']);\n            }\n        });\n\n        this.testCase({\n            name: 'AppInsightsTests: PageVisitTimeManager is available when config.autoTrackPageVisitTime is true and trackPageView is called',\n            test: () => {\n                // Setup\n                const channel = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights: AnalyticsPlugin = new AnalyticsPlugin();\n\n                const config = {\n                    instrumentationKey: 'ikey',\n                    autoTrackPageVisitTime: true\n                };\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    config,\n                    [appInsights, channel]\n                );\n                const pvtm = appInsights['_pageVisitTimeManager'];\n                const pvtmSpy = this.sandbox.spy(pvtm, 'trackPreviousPageVisit');\n\n                Assert.ok(pvtm)\n                Assert.ok(pvtmSpy.notCalled);\n\n                // Act\n                appInsights.trackPageView();\n\n                // Assert\n                Assert.ok(pvtmSpy.calledOnce);\n            }\n        });\n\n        this.testCase({\n            name: 'AppInsightsTests: config can be set from root',\n            test: () => {\n                // Setup\n                const appInsights = new AnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const properties = new PropertiesPlugin();\n\n                // Act\n                const config = {\n                    instrumentationKey: 'instrumentation_key',\n                    samplingPercentage: 12,\n                    accountId: 'aaa',\n                    extensionConfig: {\n                        [appInsights.identifier]: {\n                            accountId: 'def'\n                        }\n                    }\n                };\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Initialize\n                core.initialize(config, [appInsights, channel, properties]);\n\n                // Assert\n                Assert.equal(12, appInsights.config.samplingPercentage);\n                Assert.notEqual('aaa', appInsights.config.accountId);\n                Assert.equal('def', appInsights.config.accountId);\n                //Assert.equal('instrumentation_key', (appInsights['config'] as IConfiguration).instrumentationKey);\n                Assert.equal(30 * 60 * 1000, appInsights.config.sessionRenewalMs);\n                Assert.equal(24 * 60 * 60 * 1000, appInsights.config.sessionExpirationMs);\n\n                let extConfig = core.config.extensionConfig![AnalyticsPluginIdentifier] as IConfig;\n                Assert.equal('instrumentation_key', core.config.instrumentationKey);\n                Assert.equal(12, extConfig.samplingPercentage);\n                Assert.notEqual('aaa', extConfig.accountId);\n                Assert.equal('def', extConfig.accountId);\n                Assert.equal(30 * 60 * 1000, extConfig.sessionRenewalMs);\n                Assert.equal(24 * 60 * 60 * 1000, extConfig.sessionExpirationMs);\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: autoExceptionInstrumented can be set correctly without root config\",\n            test: () => {\n                let appInsights = new AnalyticsPlugin();\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin();\n\n                let config: IConfig & IConfiguration = {\n                    instrumentationKey: \"instrumentation_key\",\n                    samplingPercentage: 12,\n                    extensionConfig: {}\n                };\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Initialize\n                core.initialize(config, [appInsights, channel]);\n\n                let extConfig = (core.config.extensionConfig || {})[AnalyticsPluginIdentifier] as IConfig;\n                Assert.equal(extConfig.autoExceptionInstrumented, undefined, \"auto exception hook should be undefined for extenstion config\");\n                let autoExceptionHooked = appInsights[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(autoExceptionHooked, true, \"autoExceptionInstrumented should be set true\");\n                let errorHookCnt = appInsights[\"_getDbgPlgTargets\"]()[0];\n                Assert.equal(errorHookCnt, 1, \"auto exception hook should be instrumented\");\n                Assert.equal(extConfig.autoUnhandledPromiseInstrumented, false, \"autoUnhandledPromise should not be Instrumented\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: autoExceptionInstrumented can be set correctly without root config and with  enableUnhandledPromiseRejectionTracking \",\n            test: () => {\n                let appInsights = new AnalyticsPlugin();\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin();\n\n                let config: IConfig & IConfiguration = {\n                    instrumentationKey: \"instrumentation_key\",\n                    samplingPercentage: 12,\n                    extensionConfig: {\n                        [appInsights.identifier]: {\n                            enableUnhandledPromiseRejectionTracking: true\n                        }\n                    }\n                };\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Initialize\n                core.initialize(config, [appInsights, channel]);\n\n                let extConfig = (core.config.extensionConfig || {})[AnalyticsPluginIdentifier] as IConfig;\n                Assert.equal(extConfig.autoExceptionInstrumented, undefined, \"auto exception hook should be undefined for extenstion config\");\n                let autoExceptionHooked = appInsights[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(autoExceptionHooked, true, \"autoExceptionInstrumented should be set true\");\n                Assert.equal(extConfig.autoUnhandledPromiseInstrumented, true, \"autoUnhandledPromiseInstrumented is set to true\");\n                let errorHookCnt = appInsights[\"_getDbgPlgTargets\"]()[0];\n                Assert.equal(errorHookCnt, 2, \"auto exception hook should be instrumented twice\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"AppInsightsTests: autoExceptionInstrumented can be set correctly with root config\",\n            useFakeTimers: true,\n            test: () => {\n                let appInsights = new AnalyticsPlugin();\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin();\n\n                let config: IConfig & IConfiguration = {\n                    instrumentationKey: \"instrumentation_key\",\n                    samplingPercentage: 12,\n                    autoExceptionInstrumented: true,\n                    extensionConfig: {}\n                };\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Initialize\n                core.initialize(config, [appInsights, channel]);\n\n                let extConfig = (core.config.extensionConfig || {})[AnalyticsPluginIdentifier] as IConfig;\n                Assert.equal(extConfig.autoExceptionInstrumented, undefined, \"auto exception hook should be undefined for extenstion config\");\n                let autoExceptionHooked = appInsights[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(autoExceptionHooked, true, \"autoExceptionInstrumented should be set true\");\n                let errorHookCnt = appInsights[\"_getDbgPlgTargets\"]()[0];\n                Assert.equal(errorHookCnt, 0, \"auto exception hook should not be instrumented again\");\n                Assert.equal(extConfig.autoUnhandledPromiseInstrumented, false, \"autoUnhandledPromise should not be Instrumented\");\n\n                (core.config as IConfiguration & IConfig).autoExceptionInstrumented = false;\n                extConfig.autoExceptionInstrumented = false;\n                this.clock.tick(1);\n                autoExceptionHooked = appInsights[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(autoExceptionHooked, true, \"autoExceptionInstrumented should be not be override\");\n\n\n\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: autoExceptionInstrumented can be set correctly with root config and enableUnhandledPromiseRejectionTracking\",\n            test: () => {\n                let appInsights = new AnalyticsPlugin();\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin();\n\n                let config: IConfig & IConfiguration = {\n                    instrumentationKey: \"instrumentation_key\",\n                    samplingPercentage: 12,\n                    autoExceptionInstrumented: true,\n                    extensionConfig: {\n                        [appInsights.identifier]: {\n                            enableUnhandledPromiseRejectionTracking: true\n                        }\n                    }\n                };\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                // Initialize\n                core.initialize(config, [appInsights, channel]);\n\n                let extConfig = (core.config.extensionConfig || {})[AnalyticsPluginIdentifier] as IConfig;\n                Assert.equal(extConfig.autoExceptionInstrumented, undefined, \"auto exception hook should be undefined for extenstion config\");\n                let autoExceptionHooked = appInsights[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(autoExceptionHooked, true, \"autoExceptionInstrumented should be set true\");\n                Assert.equal(extConfig.autoUnhandledPromiseInstrumented, true, \"autoUnhandledPromiseInstrumented is set to true\");\n                let errorHookCnt = appInsights[\"_getDbgPlgTargets\"]()[0];\n                Assert.equal(errorHookCnt, 1, \"auto exception hook should be instrumented for autoUnhandledPromiseInstrumented\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsTests: public members are correct\",\n            test: () => {\n                // setup\n                const appInsights = new AnalyticsPlugin();\n\n                const leTest = (name) => {\n                    // assert\n                    Assert.ok(name in appInsights, name + \" exists\");\n                }\n\n                // act\n                const members = [\n                    \"config\",\n                    \"trackException\",\n                    \"_onerror\",\n                    \"trackEvent\",\n                    \"trackTrace\",\n                    \"trackMetric\",\n                    \"trackPageView\",\n                    \"trackPageViewPerformance\",\n                    \"startTrackPage\",\n                    \"stopTrackPage\",\n                    \"startTrackEvent\",\n                    \"stopTrackEvent\"\n                ];\n                while (members.length) {\n                    leTest(members.pop());\n                }\n            }\n        });\n\n        this.addGenericTests();\n        this.addStartStopTrackPageTests();\n        this.addStartStopTrackEventTests()\n        this.addTrackExceptionTests();\n        this.addOnErrorTests();\n        this.addTrackMetricTests();\n        this.addTelemetryInitializerTests();\n        this.addScriptInfoTests();\n    }\n\n    private addScriptInfoTests(): void {\n        this.testCase({\n            name: \"AppInsightsTests: findAllScripts function returns correct information\",\n            useFakeTimers: true,\n            test: () => {\n                // Initialize Application Insights core with plugins\n                let script = window.document.createElement(\"script\");\n                script.src = \"https://www.example.com/test.js\";\n                script.innerHTML = 'test script';\n                window.document.body.appendChild(script);\n\n                let doc = window.document;\n                let scriptsInfo = findAllScripts(doc);\n                Assert.deepEqual(true, JSON.stringify(scriptsInfo).indexOf(\"https://www.example.com/test.js\") !== -1, \"script info contains the correct url\");\n            }\n        });\n        this.testCase({\n            name: \"AppInsightsTests: trackException would contain scrips info when config turns on\",\n            useFakeTimers: true,\n            test: () => {\n                const appInsights = new AnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const properties = new PropertiesPlugin();\n                // Configuration\n                const config = {\n                    instrumentationKey: 'ikey',\n                };\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                // Initialize Application Insights core with plugins\n                core.initialize(config, [appInsights, channel, properties]);\n\n                // add test script\n                let script = window.document.createElement(\"script\");\n                script.src = \"https://www.example1.com/test.js\";\n                script.setAttribute(\"referrerpolicy\", \"no-referrer\");\n                script.innerHTML = 'test script';\n                let script2 = window.document.createElement(\"script\");\n                script2.src = \"https://www.test.com/test.js\";\n                script2.innerHTML = \"test tests\";\n                script2.setAttribute(\"async\", \"\"); \n                window.document.body.appendChild(script);\n                window.document.body.appendChild(script2);\n\n\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                const baseData = (trackStub.args[0][0] as ITelemetryItem).baseData as IExceptionInternal;\n                const prop = baseData.properties;\n                Assert.equal(-1, JSON.stringify(prop).indexOf(\"https://www.example.com/test.js\"), \"script info is not included\");\n                \n                appInsights.config.expCfg.inclScripts = true;\n                this.clock.tick(1);\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                Assert.ok(trackStub.calledTwice, \"single exception is tracked\");\n                const baseData2 = (trackStub.args[1][0] as ITelemetryItem).baseData as IExceptionInternal;\n                const prop2 = baseData2.properties;\n                Assert.deepEqual(true, prop2[\"exceptionScripts\"].includes('\"url\":\"https://www.test.com/test.js\",\"async\":true}'))\n                Assert.deepEqual(true, prop2[\"exceptionScripts\"].includes('\"url\":\"https://www.example1.com/test.js\",\"referrerPolicy\":\"no-referrer\"'))\n\n            }\n        });\n\n\n        this.testCase({\n            name: \"AppInsightsTests: trackException would contain log info when config turns on\",\n            useFakeTimers: true,\n            test: () => {\n                const appInsights = new AnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const properties = new PropertiesPlugin();\n                // Configuration\n                const config = {\n                    instrumentationKey: 'ikey',\n                };\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                // Initialize Application Insights core with plugins\n                core.initialize(config, [appInsights, channel, properties]);\n\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                const baseData = (trackStub.args[0][0] as ITelemetryItem).baseData as IExceptionInternal;\n                const prop = baseData.properties;\n                Assert.equal(-1, JSON.stringify(prop).indexOf(\"test message\"), \"log info is not included\");\n                \n                let applelist = new Array(49).fill(\"apple\");\n                // check maxLength default value\n                appInsights.config.expCfg.expLog = () => {\n                    return {logs: applelist.concat(['pear', 'banana'])};\n                };;\n                this.clock.tick(1);\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                Assert.ok(trackStub.calledTwice, \"second exception is tracked\");\n                const baseData2 = (trackStub.args[1][0] as ITelemetryItem).baseData as IExceptionInternal;\n                const prop2 = baseData2.properties;\n                Assert.deepEqual(true, prop2[\"exceptionLog\"].includes('apple'), \"log info before max length is included\");\n                Assert.deepEqual(true, prop2[\"exceptionLog\"].includes('pear'), \"log info before max length is included\");\n\n                Assert.equal(-1, prop2[\"exceptionLog\"].indexOf(\"banana\"), \"text after max length should not be included\");\n\n\n                // check maxLength would truncate the log info\n                let myLogFunction = () => {\n                    return {logs: ['test message', 'check message', 'banana']};\n                };\n                appInsights.config.expCfg.expLog = myLogFunction;\n                appInsights.config.expCfg.maxLogs = 2;\n                this.clock.tick(1);\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                this.clock.tick(1);\n                Assert.ok(trackStub.calledThrice, \"third exception is tracked\");\n                const baseData3 = (trackStub.args[2][0] as ITelemetryItem).baseData as IExceptionInternal;\n                const prop3 = baseData3.properties;\n                Assert.deepEqual(true, prop3[\"exceptionLog\"].includes('test'), \"log info is included\");\n                Assert.equal(false, prop3[\"exceptionLog\"].includes(\"banana\"), \"text after max length should not be included\");\n\n            }\n        });\n    }\n\n    private addGenericTests(): void {\n        this.testCase({\n            name: 'AppInsightsGenericTests: envelope type, data type, and ikey are correct',\n            test: () => {\n                // setup\n                const iKey: string = \"BDC8736D-D8E8-4B69-B19B-B0CE6B66A456\";\n                const iKeyNoDash: string = \"BDC8736DD8E84B69B19BB0CE6B66A456\";\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                core.initialize(\n                    {instrumentationKey: iKey},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.addPlugin(appInsights);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n    \n                let envelope: ITelemetryItem;\n                const test = (action, expectedEnvelopeType, expectedDataType, test?: () => void) => {\n                    action();\n                    envelope = this.getFirstResult(action, trackStub);\n                    Assert.equal(\"\", envelope.iKey, \"envelope iKey\");\n                    Assert.equal(expectedEnvelopeType, envelope.name, \"envelope name\");\n                    Assert.equal(expectedDataType, envelope.baseType, \"data type name\");\n                    if (typeof test === 'function') {test();}\n                    trackStub.reset();\n                };\n\n                // Test\n                test(() => appInsights.trackException({exception: new Error(), severityLevel: SeverityLevel.Critical}), ExceptionEnvelopeType, ExceptionDataType)\n                test(() => appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical}), ExceptionEnvelopeType, ExceptionDataType)\n                test(() => appInsights.trackTrace({message: \"some string\"}), TraceEnvelopeType, TraceDataType);\n                test(() => appInsights.trackPageViewPerformance({name: undefined, uri: undefined, measurements: {somefield: 123}}, {vpHeight: 123}), PageViewPerformanceEnvelopeType, PageViewPerformanceDataType, () => {\n                    Assert.deepEqual(undefined, envelope.baseData.properties, 'Properties does not exist in Part B');\n                });\n            }\n        });\n\n        this.testCase({\n            name: 'AppInsightsGenericTests: public APIs call track',\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const senderStub = this.sandbox.stub(appInsights.core, \"track\");\n\n                // Act\n                appInsights.trackException({exception: new Error(), severityLevel: SeverityLevel.Critical});\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                appInsights.trackException({exception: \"Critical Exception\" as any, severityLevel: SeverityLevel.Critical});\n                appInsights.trackException(\"Critical Exception\" as any);\n                this.clock.tick(1);\n\n                // Test\n                Assert.equal(4, senderStub.callCount, \"Telemetry is sent when master switch is on\");\n            }\n        });\n    }\n\n    private addTrackExceptionTests(): void {\n        this.testCase({\n            name: \"TrackExceptionTests: trackException accepts single exception\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n\n                // Test\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n\n                // Verify ver is a string, as required by CS4.0\n                const baseData = (trackStub.args[0][0] as ITelemetryItem).baseData as IExceptionInternal;\n                Assert.equal(\"string\", typeof baseData.ver, \"Exception.ver should be a string for CS4.0\");\n                Assert.equal(\"4.0\", baseData.ver);\n            }\n        });\n\n        this.testCase({\n            name: \"TrackExceptionTests: trackException allows logging errors with different severity level\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n\n                // Test\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                Assert.equal(SeverityLevel.Critical, trackStub.firstCall.args[0].baseData.severityLevel);\n\n                trackStub.reset();\n\n                appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Error});\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                Assert.equal(SeverityLevel.Error, trackStub.firstCall.args[0].baseData.severityLevel);\n            }\n        });\n\n        this.testCase({\n            name: \"TrackExceptionTests: trackException with a string as the exception\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n\n                // Test\n                appInsights.trackException({exception: new Error(\"Critical Exception\"), severityLevel: SeverityLevel.Critical});\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                Assert.equal(SeverityLevel.Critical, trackStub.firstCall.args[0].baseData.severityLevel);\n                Assert.equal(\"Critical Exception\", trackStub.firstCall.args[0].baseData.exceptions[0].message);\n\n                trackStub.reset();\n\n                appInsights.trackException({exception: \"String Exception\" as any, severityLevel: SeverityLevel.Error});\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                Assert.equal(SeverityLevel.Error, trackStub.firstCall.args[0].baseData.severityLevel);\n                Assert.equal(\"String Exception\", trackStub.firstCall.args[0].baseData.exceptions[0].message);\n\n                trackStub.reset();\n\n                appInsights.trackException(\"Direct String Exception\" as any);\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                Assert.equal(\"string: Direct String Exception\", trackStub.firstCall.args[0].baseData.exceptions[0].message);\n\n                trackStub.reset();\n\n                appInsights.trackException(new Error(\"Wrapped String Exception\") as any);\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                Assert.equal(\"Wrapped String Exception\", trackStub.firstCall.args[0].baseData.exceptions[0].message);\n\n                trackStub.reset();\n\n                appInsights.trackException(null as any);\n                Assert.ok(trackStub.calledOnce, \"single exception is tracked\");\n                Assert.equal(\"not_specified\", trackStub.firstCall.args[0].baseData.exceptions[0].message, JSON.stringify(trackStub.firstCall.args[0].baseData.exceptions[0]));\n            }\n        });\n    }\n\n    private addOnErrorTests(): void {\n        this.testCase({\n            name: \"OnErrorTests: _onerror creates a dump of unexpected error thrown by trackException for logging\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n\n                const unexpectedError = new Error();\n                const expectedString = dumpObj(unexpectedError);\n                const throwSpy = this.sandbox.spy(core.logger, \"throwInternal\");\n                this.sandbox.stub(appInsights, \"trackException\").throws(unexpectedError);\n\n                // Act\n                appInsights._onerror({message: \"msg\", url: \"some://url\", lineNumber: 123, columnNumber: 456, error: unexpectedError});\n\n                // Assert\n                Assert.equal(1, throwSpy.callCount);\n                // Check Message\n                Assert.ok(throwSpy.args[0][2].indexOf(\"_onError threw exception while logging error,\") !== -1, \"Message should indicate that _onError failed\");\n                // Check Exception contains the exception details\n                Assert.ok(throwSpy.args[0][3].exception.indexOf(expectedString) !== -1, \"Expected error to contain - \" + expectedString);\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror stringifies error object\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const unexpectedError = new Error(\"some message\");\n                const throwSpy = this.sandbox.spy(core.logger, \"throwInternal\");\n                const stub = this.sandbox.stub(appInsights, \"trackException\").throws(unexpectedError);\n\n                // Act\n                appInsights._onerror({message: \"any message\", url: \"any://url\", lineNumber: 123, columnNumber: 456, error: unexpectedError});\n\n                // Test\n                const dumpExMsg = throwSpy.args[0][3].exception;\n                Assert.ok(dumpExMsg.indexOf(\"stack: \") != -1);\n                Assert.ok(dumpExMsg.indexOf(`message: \\\"${unexpectedError.message}\\\"`) !== -1 ||\n                    dumpExMsg.indexOf(`message: '${unexpectedError.message}'`) !== -1);\n                Assert.ok(dumpExMsg.indexOf(\"name: \\\"Error\\\"\") !== -1 ||\n                    dumpExMsg.indexOf(\"name: 'Error'\") !== -1);\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror logs name of unexpected error thrown by trackException for diagnostics\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"key\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n\n                const throwInternal = this.sandbox.spy(appInsights.core.logger, \"throwInternal\");\n\n                this.sandbox.stub(appInsights, \"trackException\").throws(new CustomTestError(\"Simulated Error\"));\n                const expectedErrorName: string = \"CustomTestError\";\n\n                appInsights._onerror({message: \"some message\", url: \"some://url\", lineNumber: 1234, columnNumber: 5678, error: new Error()});\n\n                Assert.ok(throwInternal.calledOnce, \"throwInternal called once\");\n                const logMessage: string = throwInternal.getCall(0).args[2];\n                Assert.notEqual(-1, logMessage.indexOf(expectedErrorName), \"expected: \" + logMessage);\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror adds document URL in case of CORS error\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const trackSpy = this.sandbox.spy(appInsights.core, \"track\");\n\n                // Act\n                appInsights._onerror({message: \"Script error.\", url: \"\", lineNumber: 0, columnNumber: 0, error: null});\n\n                // Assert\n                Assert.equal(document.URL, trackSpy.args[0][0].baseData.url);\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror adds document URL in case of no CORS error\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const trackExceptionSpy = this.sandbox.spy(appInsights, \"trackException\");\n\n                // Act\n                // Last arg is not an error/null which will be treated as not CORS issue\n                appInsights._onerror({message: \"Script error.\", url: \"\", lineNumber: 0, columnNumber: 0, error: new Object() as any});\n\n                // Assert\n                // properties are passed as a 3rd parameter\n                Assert.equal(document.URL, trackExceptionSpy.args[0][1].url);\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror logs name of unexpected error thrown by trackException for diagnostics\",\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"key\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n\n                const throwInternal = this.sandbox.spy(appInsights.core.logger, \"throwInternal\");\n\n                // Internal code does call this anymore!\n                const expectedErrorName: string = \"test error\";\n\n                let theError = new Error();\n                theError.name = expectedErrorName;\n                this.sandbox.stub(appInsights, \"trackException\").throws(theError);\n\n\n                appInsights._onerror({message: \"some message\", url: \"some://url\", lineNumber: 1234, columnNumber: 5678, error: \"the error message\"});\n\n                Assert.ok(throwInternal.calledOnce, \"throwInternal called once\");\n                const logMessage: string = throwInternal.getCall(0).args[2];\n                Assert.notEqual(-1, logMessage.indexOf(expectedErrorName), \"logMessage: \" + logMessage);\n            }\n        });\n\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror logs name of unexpected error thrown by trackException for diagnostics\",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const sender: Sender = new Sender();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {\n                        instrumentationKey: \"key\",\n                        extensionConfig: {\n                            [sender.identifier]: {\n                                enableSessionStorageBuffer: false,\n                                maxBatchInterval: 1\n                            }\n                        }                \n                    },\n                    [sender]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                appInsights.addTelemetryInitializer((item: ITelemetryItem) => {\n                    Assert.equal(\"4.0\", item.ver, \"Telemetry items inside telemetry initializers should be in CS4.0 format\");\n                });\n\n                this.throwInternalSpy = this.sandbox.spy(appInsights.core.logger, \"throwInternal\");\n                sender._sender = (payload:any[], isAsync:boolean) => {\n                    sender._onSuccess(payload, payload.length);\n                };\n                this.sandbox.spy()\n                this.trackSpy = this.sandbox.spy(sender, \"_onSuccess\");\n\n                this.exceptionHelper.capture(appInsights);\n\n                this.causeException(() => {\n                    this.exceptionHelper.throwRuntimeException(AITestClass.orgSetTimeout);\n                });\n\n                Assert.ok(!this.trackSpy.calledOnce, \"track not called yet\");\n                Assert.ok(!this.throwInternalSpy.called, \"No internal errors\");\n                \n                return this._asyncQueue()\n                    .add(this.waitForExceptionPromise(1))\n                    .add(() => {\n                        let isLocal = window.location.protocol === \"file:\";\n                        let exp = this.trackSpy.args[0];\n                        const payloadStr: string[] = this.getPayloadMessages(this.trackSpy);\n                    \n                        if (payloadStr.length > 0) {\n                            const payload = JSON.parse(payloadStr[0]);\n                            const data = payload.data;\n                            Assert.ok(data, \"Has Data\");\n                            if (data) {\n                                Assert.ok(data.baseData, \"Has BaseData\");\n                                let baseData = data.baseData;\n                                if (baseData) {\n                                    const ex = baseData.exceptions[0];\n                                    if (isLocal) {\n                                        Assert.ok(ex.message.indexOf(\"Script error:\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                                        Assert.equal(\"String\", ex.typeName, \"Got the correct typename [\" + ex.typeName + \"]\");\n                                } else {\n                                    Assert.ok(ex.message.indexOf(\"ug is not a function\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                                    Assert.equal(\"TypeError\", ex.typeName, \"Got the correct typename [\" + ex.typeName + \"]\");\n                                    Assert.ok(baseData.properties[\"columnNumber\"], \"has column number\");\n                                    Assert.ok(baseData.properties[\"lineNumber\"], \"has Line number\");\n                                }\n\n                                Assert.ok(ex.stack.length > 0, \"Has stack\");\n                                Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                                Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n                                Assert.ok(baseData.properties[\"url\"], \"has Url\");\n                                Assert.ok(baseData.properties[\"errorSrc\"].indexOf(\"window.onerror@\") !== -1, \"has source\");\n                            }\n                        }\n                    }\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror logs name of unexpected error thrown by trackException for diagnostics with a text exception\",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const sender: Sender = new Sender();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {\n                        instrumentationKey: \"key\",\n                        extensionConfig: {\n                            [sender.identifier]: {\n                                enableSessionStorageBuffer: false,\n                                maxBatchInterval: 1\n                            }\n                            }                \n                        },\n                        [sender]\n                    );\n                    const appInsights = new AnalyticsPlugin();\n                    core.addPlugin(appInsights);\n                    appInsights.addTelemetryInitializer((item: ITelemetryItem) => {\n                        Assert.equal(\"4.0\", item.ver, \"Telemetry items inside telemetry initializers should be in CS4.0 format\");\n                    });\n\n                    this.throwInternalSpy = this.sandbox.spy(appInsights.core.logger, \"throwInternal\");\n                    sender._sender = (payload:any[], isAsync:boolean) => {\n                        sender._onSuccess(payload, payload.length);\n                    };\n                    this.sandbox.spy()\n                    this.trackSpy = this.sandbox.spy(sender, \"_onSuccess\");\n\n                    this.exceptionHelper.capture(appInsights);\n                    this.causeException(() => {\n                        this.exceptionHelper.throw(\"Test Text Error!\");\n                    });\n\n                    Assert.ok(!this.trackSpy.calledOnce, \"track not called yet\");\n                    Assert.ok(!this.throwInternalSpy.called, \"No internal errors\");\n                \n                    return this._asyncQueue()\n                        .add(this.waitForExceptionPromise(1))\n                        .add(() => {\n                            let exp = this.trackSpy.args[0];\n                            const payloadStr: string[] = this.getPayloadMessages(this.trackSpy);\n                            if (payloadStr.length > 0) {\n                                const payload = JSON.parse(payloadStr[0]);\n                                const data = payload.data;\n                                Assert.ok(data, \"Has Data\");\n                                if (data) {\n                                    Assert.ok(data.baseData, \"Has BaseData\");\n                                    let baseData = data.baseData;\n                                    if (baseData) {\n                                        const ex = baseData.exceptions[0];\n                                        Assert.ok(ex.message.indexOf(\"Test Text Error!\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                                        Assert.ok(baseData.properties[\"columnNumber\"], \"has column number\");\n                                        Assert.ok(baseData.properties[\"lineNumber\"], \"has Line number\");\n                                        Assert.equal(\"String\", ex.typeName, \"Got the correct typename\");\n                                        Assert.ok(ex.stack.length > 0, \"Has stack\");\n                                        Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                                        Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n                                        Assert.ok(baseData.properties[\"url\"], \"has Url\");\n                                        Assert.ok(baseData.properties[\"errorSrc\"].indexOf(\"window.onerror@\") !== -1, \"has source\");\n                                    }\n                                }\n                            }\n                        });\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror logs name of unexpected error thrown by trackException for diagnostics with a custom direct exception\",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const sender: Sender = new Sender();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {\n                        instrumentationKey: \"key\",\n                        extensionConfig: {\n                            [sender.identifier]: {\n                                enableSessionStorageBuffer: false,\n                                maxBatchInterval: 1\n                            }\n                        }                \n                    },\n                    [sender]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                appInsights.addTelemetryInitializer((item: ITelemetryItem) => {\n                    Assert.equal(\"4.0\", item.ver, \"Telemetry items inside telemetry initializers should be in CS4.0 format\");\n                });\n\n                this.throwInternalSpy = this.sandbox.spy(appInsights.core.logger, \"throwInternal\");\n                sender._sender = (payload:any[], isAsync:boolean) => {\n                    sender._onSuccess(payload, payload.length);\n                };\n                this.sandbox.spy()\n                this.trackSpy = this.sandbox.spy(sender, \"_onSuccess\");\n\n                this.exceptionHelper.capture(appInsights);\n                this.causeException(() => {\n                    this.exceptionHelper.throw(new CustomTestError(\"Test Text Error!\"));\n                });\n\n                Assert.ok(!this.trackSpy.calledOnce, \"track not called yet\");\n                Assert.ok(!this.throwInternalSpy.called, \"No internal errors\");\n                \n                return this._asyncQueue()\n                    .add(this.waitForExceptionPromise(1))\n                    .add(() => {\n                        let isLocal = window.location.protocol === \"file:\";\n                        let exp = this.trackSpy.args[0];\n                        const payloadStr: string[] = this.getPayloadMessages(this.trackSpy);\n                        if (payloadStr.length > 0) {\n                            const payload = JSON.parse(payloadStr[0]);\n                            const data = payload.data;\n                            Assert.ok(data, \"Has Data\");\n                            if (data) {\n                                Assert.ok(data.baseData, \"Has BaseData\");\n                                let baseData = data.baseData;\n                                if (baseData) {\n                                    const ex = baseData.exceptions[0];\n                                    if (isLocal) {\n                                        Assert.ok(ex.message.indexOf(\"Script error:\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                                        Assert.equal(\"String\", ex.typeName, \"Got the correct typename\");\n                                    } else {\n                                        Assert.ok(ex.message.indexOf(\"Test Text Error!\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                                        Assert.ok(ex.message.indexOf(\"CustomTestError\") !== -1, \"Make sure the error type is present [\" + ex.message + \"]\");\n                                        Assert.equal(\"CustomTestError\", ex.typeName, \"Got the correct typename\");\n                                        Assert.ok(baseData.properties[\"columnNumber\"], \"has column number\");\n                                        Assert.ok(baseData.properties[\"lineNumber\"], \"has Line number\");\n                                    }\n\n                                    Assert.ok(ex.stack.length > 0, \"Has stack\");\n                                    Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                                    Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n                                    Assert.ok(baseData.properties[\"url\"], \"has Url\");\n                                    Assert.ok(baseData.properties[\"errorSrc\"].indexOf(\"window.onerror@\") !== -1, \"has source\");\n                                }\n                            }\n                        }\n                    });\n            }\n        });\n\n        this.testCase({\n            name: \"OnErrorTests: _onerror logs name of unexpected error thrown by trackException for diagnostics with a strict custom direct exception\",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const sender: Sender = new Sender();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {\n                        instrumentationKey: \"key\",\n                        extensionConfig: {\n                            [sender.identifier]: {\n                                enableSessionStorageBuffer: false,\n                                maxBatchInterval: 1\n                            }\n                        }                \n                    },\n                    [sender]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                appInsights.addTelemetryInitializer((item: ITelemetryItem) => {\n                    Assert.equal(\"4.0\", item.ver, \"Telemetry items inside telemetry initializers should be in CS4.0 format\");\n                });\n\n                this.throwInternalSpy = this.sandbox.spy(appInsights.core.logger, \"throwInternal\");\n                sender._sender = (payload:any[], isAsync:boolean) => {\n                    sender._onSuccess(payload, payload.length);\n                };\n                this.sandbox.spy()\n                this.trackSpy = this.sandbox.spy(sender, \"_onSuccess\");\n\n                this.exceptionHelper.capture(appInsights);\n                this.causeException(() => {\n                    this.exceptionHelper.throwStrict(new CustomTestError(\"Test Text Error!\"));\n                });\n\n                Assert.ok(!this.trackSpy.calledOnce, \"track not called yet\");\n                Assert.ok(!this.throwInternalSpy.called, \"No internal errors\");\n                \n                return this._asyncQueue()\n                    .add(this.waitForExceptionPromise(1))\n                    .add(() => {\n                        let isLocal = window.location.protocol === \"file:\";\n                        let exp = this.trackSpy.args[0];\n                        const payloadStr: string[] = this.getPayloadMessages(this.trackSpy);\n                        if (payloadStr.length > 0) {\n                            const payload = JSON.parse(payloadStr[0]);\n                            const data = payload.data;\n                            Assert.ok(data, \"Has Data\");\n                            if (data) {\n                                Assert.ok(data.baseData, \"Has BaseData\");\n                                let baseData = data.baseData;\n                                if (baseData) {\n                                    const ex = baseData.exceptions[0];\n                                    if (isLocal) {\n                                        Assert.ok(ex.message.indexOf(\"Script error:\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                                        Assert.equal(\"String\", ex.typeName, \"Got the correct typename\");\n                                    } else {\n                                    Assert.ok(ex.message.indexOf(\"Test Text Error!\") !== -1, \"Make sure the error message is present [\" + ex.message + \"]\");\n                                    Assert.ok(ex.message.indexOf(\"CustomTestError\") !== -1, \"Make sure the error type is present [\" + ex.message + \"]\");\n                                    Assert.equal(\"CustomTestError\", ex.typeName, \"Got the correct typename\");\n                                    Assert.ok(baseData.properties[\"columnNumber\"], \"has column number\");\n                                    Assert.ok(baseData.properties[\"lineNumber\"], \"has Line number\");\n                                }\n\n                                Assert.ok(ex.stack.length > 0, \"Has stack\");\n                                Assert.ok(ex.parsedStack, \"Stack was parsed\");\n                                Assert.ok(ex.hasFullStack, \"Stack has been decoded\");\n                                Assert.ok(baseData.properties[\"url\"], \"has Url\");\n                                Assert.ok(baseData.properties[\"errorSrc\"].indexOf(\"window.onerror@\") !== -1, \"has source\");\n                            }\n                        }\n                    }\n                });\n            }\n        });\n    }\n\n    private throwStrictRuntimeException() {\n        \"use strict\";\n        function doThrow() {\n            var ug: any = \"Hello\";\n            // This should throw\n            ug();\n        }\n\n        doThrow();\n    }\n\n    private addStartStopTrackPageTests() {\n        const testValues = {\n            name: \"name\",\n            url: \"url\",\n            duration: 200,\n            properties: {\n                \"property1\": \"5\",\n                \"property2\": \"10\",\n                \"refUri\": \"test.com\"\n            },\n            measurements: {\n                \"measurement\": 300\n            }\n        };\n\n        this.testCase({\n            name: \"Timing Tests: Start/StopPageView pass correct duration\",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"key\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const spy = this.sandbox.spy(appInsights, \"sendPageViewInternal\");\n                this.clock.tick(1);\n\n                // act\n                appInsights.startTrackPage(testValues.name);\n                this.clock.tick(testValues.duration);\n                appInsights.stopTrackPage(testValues.name, testValues.url, testValues.properties, testValues.measurements);\n\n                // verify\n                Assert.ok(spy.calledOnce, \"stop track page view sent data\");\n                const actual = spy.args[0][0];\n                Assert.equal(testValues.name, actual.name);\n                Assert.equal(testValues.url, actual.uri);\n\n                const actualProperties = actual.properties;\n                const actualMeasurements = actual.measurements;\n                Assert.equal(testValues.duration, actualProperties.duration, \"duration is calculated and sent correctly\");\n                Assert.equal(testValues.properties.property1, actualProperties.property1);\n                Assert.equal(testValues.properties.property2, actualProperties.property2);\n                Assert.equal(testValues.properties.refUri, actualProperties.refUri);\n                Assert.equal(testValues.measurements.measurement, actualMeasurements.measurement);\n            }\n        });\n        this.testCase({\n            name: \"Timing Tests: Start/StopPageView tracks single page view with no parameters\",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const core = new AppInsightsCore();\n\n                // this.sandbox.stub(core, \"getTransmissionControls\");\n                const appInsights = new AnalyticsPlugin();\n                this.onDone(() => {\n                    appInsights.teardown();\n                });\n\n                appInsights.initialize({ \"instrumentationKey\": \"ikey\" }, core, []);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n                this.clock.tick(10);        // Needed to ensure the duration calculation works\n\n                // act\n                appInsights.startTrackPage();\n                this.clock.tick(testValues.duration);\n                appInsights.stopTrackPage();\n                Assert.ok(trackStub.calledOnce, \"single page view tracking stopped\");\n\n                // verify\n                const telemetry: ITelemetryItem = trackStub.args[0][0];\n                Assert.equal(window.document.title, telemetry.baseData.name);\n                Assert.equal(testValues.duration, telemetry.baseData.properties.duration);\n            }\n        });\n\n        this.testCase({\n            name: \"Timing Tests: Multiple Start/StopPageView track single pages view \",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                const core = new AppInsightsCore();\n\n                // this.sandbox.stub(core, \"getTransmissionControls\");\n                const appInsights = new AnalyticsPlugin();\n                this.onDone(() => {\n                    appInsights.teardown();\n                });\n\n                appInsights.initialize({ \"instrumentationKey\": \"ikey\" }, core, []);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n                this.clock.tick(10);        // Needed to ensure the duration calculation works\n\n                // act\n                appInsights.startTrackPage(testValues.name);\n                this.clock.tick(testValues.duration);\n\n                appInsights.startTrackPage();\n                this.clock.tick(testValues.duration);\n                appInsights.stopTrackPage();\n                Assert.ok(trackStub.calledOnce, \"single page view tracking stopped no parameters\");\n\n                this.clock.tick(testValues.duration);\n                appInsights.stopTrackPage(testValues.name, testValues.url, testValues.properties);\n                Assert.ok(trackStub.calledTwice, \"single page view tracking stopped all parameters\");\n\n                // verify\n                // Empty parameters\n                let telemetry: ITelemetryItem = trackStub.args[0][0];\n                Assert.equal(window.document.title, telemetry.baseData.name);\n                Assert.equal(window.document.location.href, telemetry.baseData.uri);\n\n                // // All parameters\n                telemetry = trackStub.args[1][0];\n                Assert.equal(testValues.name, telemetry.baseData.name);\n                Assert.equal(testValues.url, telemetry.baseData.uri);\n                Assert.deepEqual(testValues.properties, telemetry.baseData.properties);\n            }\n        });\n\n        this.testCase({\n            name: \"Timing Tests: Multiple startTrackPage\",\n            useFakeTimers: true,\n            test:\n                () => {\n                    // setup\n                    const plugin = new ChannelPlugin();\n                    const core = new AppInsightsCore();\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n    \n                    core.initialize(\n                        {instrumentationKey: \"ikey\"},\n                        [plugin]\n                    );\n                    const appInsights = new AnalyticsPlugin();\n                    core.addPlugin(appInsights);\n                    const logStub = this.sandbox.stub(core.logger, \"throwInternal\");\n                    core.config.loggingLevelConsole = 999;\n                    this.clock.tick(1);\n\n                    // act\n                    appInsights.startTrackPage();\n                    appInsights.startTrackPage();\n\n                    // verify\n                    Assert.ok(logStub.calledOnce, \"calling start twice triggers warning to user\");\n                }\n        });\n\n        this.testCase({\n            name: \"Timing Tests: stopTrackPage called without a corresponding start\",\n            useFakeTimers: true,\n            test:\n                () => {\n                    // setup\n                    const plugin = new ChannelPlugin();\n                    const core = new AppInsightsCore();\n\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n    \n                    core.initialize(\n                        {instrumentationKey: \"ikey\"},\n                        [plugin]\n                    );\n                    const appInsights = new AnalyticsPlugin();\n                    core.addPlugin(appInsights);\n                    const logStub = this.sandbox.stub(core.logger, \"throwInternal\");\n                    core.config.loggingLevelConsole = 999;\n                    this.clock.tick(1);\n\n                    // act\n                    appInsights.stopTrackPage();\n\n                    // verify\n                    Assert.ok(logStub.calledOnce, \"calling stop without a corresponding start triggers warning to user\");\n                }\n        });\n    }\n\n    private addTrackMetricTests() {\n        this.testCase({\n            name: 'TrackMetricTests: trackMetric batches metrics sent in a hot loop',\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin]\n                );\n                const appInsights = new AnalyticsPlugin();\n                core.addPlugin(appInsights);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n\n                // Act\n                appInsights.trackMetric({name: \"test metric\", average: 0});\n                this.clock.tick(1);\n\n                // Verify\n\n                Assert.ok(trackStub.calledOnce, \"core.track was called once after sending one metric\");\n                trackStub.reset();\n\n                // Act\n                for (let i = 0; i < 100; i++) {\n                    appInsights.trackMetric({name: \"test metric\", average: 0});\n                }\n                this.clock.tick(1);\n\n                // Test\n                Assert.equal(100, trackStub.callCount, \"core.track was called 100 times for sending 100 metrics\");\n            }\n        });\n    }\n\n    private addStartStopTrackEventTests() {\n        const testValues = {\n            name: \"testStopTrack\",\n            properties: {\n                \"property1\": \"5\",\n                \"property2\": \"10\",\n                \"refUri\": \"test.com\"\n            },\n            measurements: {\n                \"measurement\": 300\n            }\n        };\n\n        this.testCase({\n            name: \"TelemetryContex: empty Start/StopTrackEvent should only have duration properties\",\n            useFakeTimers: true,\n            test: () => {\n                const core = new AppInsightsCore();\n                // this.sandbox.stub(core, \"getTransmissionControls\");\n                const appInsights = new AnalyticsPlugin();\n                this.onDone(() => {\n                    appInsights.teardown();\n                });\n\n                appInsights.initialize({ \"instrumentationKey\": \"ikey\" }, core, []);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n                this.clock.tick(5);\n\n                // act\n                appInsights.startTrackEvent(testValues.name);\n                this.clock.tick(5);\n                appInsights.stopTrackEvent(testValues.name);\n                Assert.ok(trackStub.calledOnce, \"single event tracking stopped\");\n\n                // verify\n                const telemetry = trackStub.args[0][0];\n                Assert.equal(testValues.name,telemetry.baseData.name);\n                Assert.deepEqual({ \"duration\": \"5\"},telemetry.baseData.properties);\n                Assert.equal(undefined, telemetry.baseData.measurements.measurement);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContex: Start/StopTrackEvent capture correct properties and measurements\",\n            useFakeTimers: true,\n            test: () => {\n                const core = new AppInsightsCore();\n                // this.sandbox.stub(core, \"getTransmissionControls\");\n                const appInsights = new AnalyticsPlugin();\n                this.onDone(() => {\n                    appInsights.teardown();\n                });\n\n                appInsights.initialize({ \"instrumentationKey\": \"ikey\" }, core, []);\n                const trackStub = this.sandbox.stub(appInsights.core, \"track\");\n                this.clock.tick(5);\n\n                // act\n                appInsights.startTrackEvent(testValues.name);\n                this.clock.tick(5);\n                appInsights.stopTrackEvent(testValues.name,testValues.properties,testValues.measurements);\n                Assert.ok(trackStub.calledOnce, \"single event tracking stopped\");\n\n                // verify\n                const telemetry = trackStub.args[0][0];\n                Assert.equal(testValues.name,telemetry.baseData.name);\n                Assert.equal(testValues.properties.property1,telemetry.baseData.properties.property1);\n                Assert.equal(testValues.properties.property2, telemetry.baseData.properties.property2);\n                Assert.equal(testValues.properties.refUri, telemetry.baseData.properties.refUri);\n                Assert.equal(\"5\", telemetry.baseData.properties.duration);\n                Assert.equal(testValues.measurements.measurement, telemetry.baseData.measurements.measurement);\n            }\n        });\n    }\n\n    private addTelemetryInitializerTests(): void {\n        this.testCase({\n            name: \"TelemetryContext: onBeforeSendTelemetry is called within track() and gets the envelope as an argument\",\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n                const telemetryInitializer = {\n                    initializer: (envelope) => { }\n                }\n                const spy = this.sandbox.spy(telemetryInitializer, \"initializer\");\n\n                // act\n                appInsights.addTelemetryInitializer(telemetryInitializer.initializer);\n                appInsights.trackEvent({name: 'test event'});\n                this.clock.tick(1);\n\n                // verify\n                Assert.ok(spy.calledOnce, 'telemetryInitializer was called');\n                Assert.deepEqual(trackStub.args[0][0], spy.args[0][0], 'expected envelope is used');\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: onBeforeSendTelemetry changes the envelope props and sender gets them\",\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n                const nameOverride = \"my unique name\";\n                const telemetryInitializer = {\n                    initializer: (envelope) => {\n                        envelope.name = nameOverride;\n                        return true;}\n                }\n\n                // act\n                appInsights.addTelemetryInitializer(telemetryInitializer.initializer);\n                appInsights.trackTrace({message: 'test message'});\n                this.clock.tick(1);\n\n                // verify\n                Assert.ok(trackStub.calledOnce, \"channel sender was called\");\n\n                const envelope: ITelemetryItem = trackStub.args[0][0];\n                Assert.equal(envelope.name, nameOverride, 'expected envelope is used');\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer can modify the contents of an envelope\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n\n                const messageOverride = \"my unique name\";\n                const propOverride = \"val1\";\n                const telemetryInitializer = {\n                    // This illustrates how to use telemetry initializer (onBeforeSendTelemetry)\n                    // to access/ modify the contents of an envelope.\n                    initializer: (envelope) => {\n                        if (envelope.baseType ===\n                            TraceDataType) {\n                            const telemetryItem = envelope.baseData;\n                            telemetryItem.message = messageOverride;\n                            telemetryItem.properties = telemetryItem.properties || {};\n                            telemetryItem.properties[\"prop1\"] = propOverride;\n                            return true;\n                        }\n                    }\n                }\n\n                appInsights.addTelemetryInitializer(telemetryInitializer.initializer);\n\n                // act\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.calledOnce, \"sender should be called\");\n\n                const envelope: ITelemetryItem = trackStub.args[0][0];\n                Assert.equal(messageOverride, envelope.baseData.message);\n                Assert.equal(propOverride, envelope.baseData.properties[\"prop1\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: all added telemetry initializers get invoked\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const initializer1 = { init: () => { } };\n                const initializer2 = { init: () => { } };\n                const spy1 = this.sandbox.spy(initializer1, \"init\");\n                const spy2 = this.sandbox.spy(initializer2, \"init\");\n\n                // act\n                appInsights.addTelemetryInitializer(initializer1.init);\n                appInsights.addTelemetryInitializer(initializer2.init);\n\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(spy1.calledOnce);\n                Assert.ok(spy2.calledOnce);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: all added telemetry initializers get invoked for trackException\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const initializer1 = { init: (item: ITelemetryItem) => { \n                    if (item.data !== undefined) {\n                        item.data.init1 = true;\n                    }\n                } };\n                const initializer2 = { init: (item: ITelemetryItem) => { \n                    if (item.data !== undefined) {\n                        item.data.init2 = true;\n                    }\n                } };\n                const spy1 = this.sandbox.spy(initializer1, \"init\");\n                const spy2 = this.sandbox.spy(initializer2, \"init\");\n\n                // act\n                appInsights.addTelemetryInitializer(initializer1.init);\n                appInsights.addTelemetryInitializer(initializer2.init);\n\n                // Act\n                appInsights._onerror({message: \"msg\", url: \"some://url\", lineNumber: 123, columnNumber: 456, error: new Error()});\n\n                // verify\n                Assert.ok(spy1.calledOnce);\n                Assert.ok(spy2.calledOnce);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: all added telemetry initializers get invoked for _onError calls\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const initializer1 = { init: () => { } };\n                const initializer2 = { init: () => { } };\n                const spy1 = this.sandbox.spy(initializer1, \"init\");\n                const spy2 = this.sandbox.spy(initializer2, \"init\");\n\n                // act\n                appInsights.addTelemetryInitializer(initializer1.init);\n                appInsights.addTelemetryInitializer(initializer2.init);\n\n                appInsights.trackException({exception: new Error(), severityLevel: SeverityLevel.Critical});\n\n                // verify\n                Assert.ok(spy1.calledOnce);\n                Assert.ok(spy2.calledOnce);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer - returning false means don't send an item\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n\n                // act\n                appInsights.addTelemetryInitializer(() => false);\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.notCalled);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer - returning void means do send an item (back compact with older telemetry initializers)\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n\n                // act\n                appInsights.addTelemetryInitializer(() => { return; });\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.calledOnce); // TODO: use sender\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer - returning true means do send an item\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n\n                // act\n                appInsights.addTelemetryInitializer(() => true);\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.calledOnce);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer - if one of initializers returns false than item is not sent\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n\n                // act\n                appInsights.addTelemetryInitializer(() => true);\n                appInsights.addTelemetryInitializer(() => false);\n\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.notCalled);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer - if one of initializers returns false (any order) than item is not sent\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n\n                // act\n                appInsights.addTelemetryInitializer(() => false);\n                appInsights.addTelemetryInitializer(() => true);\n\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.notCalled);\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer - returning not boolean/undefined/null means do send an item (back compat with older telemetry initializers)\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n\n                // act\n                appInsights.addTelemetryInitializer((() => \"asdf\") as any);\n                appInsights.addTelemetryInitializer(() => null);\n                appInsights.addTelemetryInitializer(() => undefined);\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.calledOnce); // TODO: use sender\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryContext: telemetry initializer - if one initializer fails then error logged and is still sent\",\n            test: () => {\n                // Setup\n                const plugin = new ChannelPlugin();\n                const core = new AppInsightsCore();\n                const appInsights = new AnalyticsPlugin();\n\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.initialize(\n                    {instrumentationKey: \"ikey\"},\n                    [plugin, appInsights]\n                );\n\n                const trackStub = this.sandbox.spy(plugin, 'processTelemetry');\n                const logStub = this.sandbox.spy(appInsights.core.logger, \"throwInternal\")\n                // act\n                appInsights.addTelemetryInitializer(() => { throw new Error(\"Test error IGNORE\"); });\n                appInsights.addTelemetryInitializer(() => { });\n                appInsights.trackTrace({message: 'test message'});\n\n                // verify\n                Assert.ok(trackStub.calledOnce);\n                Assert.ok(logStub.calledOnce);\n\n            }\n        });\n    }\n\n    private getFirstResult(action: string, trackStub: SinonStub, skipSessionState?: boolean): ITelemetryItem {\n        const index: number = skipSessionState ? 1 : 0;\n\n        Assert.ok(trackStub.args && trackStub.args[index] && trackStub.args[index][0], \"track was called for: \" + action);\n        return trackStub.args[index][0] as ITelemetryItem;\n    }\n\n    private checkNoInternalErrors() {\n        if (this.throwInternalSpy) {\n            Assert.ok(this.throwInternalSpy.notCalled, \"Check no internal errors\");\n            if (this.throwInternalSpy.called) {\n                Assert.ok(false, JSON.stringify(this.throwInternalSpy.args[0]));\n            }\n        }\n    }\n\n    // waitForExceptionPromise for use with _asyncQueue that returns a promise\n    private waitForExceptionPromise(expectedCount: number, action: string = \"\", includeInit: boolean = false) {\n        const testContext = this._testContext;\n        const self = this; // Capture 'this' context to use in the polling function\n        \n        // Execute initial setup actions outside of the polling function\n        const message = \"polling: \" + new Date().toISOString() + \" \" + action;\n        Assert.ok(true, message);\n        console.log(message);\n        self.checkNoInternalErrors();\n        if (testContext && testContext.clock) {\n            testContext.clock.tick(500);\n        }\n        \n        return PollingAssert.asyncTaskPollingAssert(function () {\n            let argCount = 0;\n            if (self.trackSpy && self.trackSpy.called) {\n                self.trackSpy.args.forEach(call => {\n                    argCount += call.length;\n                });\n            }\n    \n            Assert.ok(true, \"* [\" + argCount + \" of \" + expectedCount + \"] checking spy \" + new Date().toISOString());\n            try {\n                if (argCount >= expectedCount) {\n                    // Use the existing getPayloadMessages method to extract payload data properly\n                    const payloadStr: string[] = self.getPayloadMessages(self.trackSpy);\n                    if (payloadStr.length > 0) {\n                        const payload = JSON.parse(payloadStr[0]);\n                        const baseType = payload.data.baseType;\n                        // call the appropriate Validate depending on the baseType\n                        switch (baseType) {\n                            case EventDataType:\n                                return EventValidator.EventValidator.Validate(payload, baseType);\n                            case TraceDataType:\n                                return TraceValidator.TraceValidator.Validate(payload, baseType);\n                            case ExceptionDataType:\n                                return ExceptionValidator.ExceptionValidator.Validate(payload, baseType);\n                            case MetricDataType:\n                                return MetricValidator.MetricValidator.Validate(payload, baseType);\n                            case PageViewDataType:\n                                return PageViewValidator.PageViewValidator.Validate(payload, baseType);\n                            case PageViewPerformanceDataType:\n                                return PageViewPerformanceValidator.PageViewPerformanceValidator.Validate(payload, baseType);\n                            case RemoteDependencyDataType:\n                                return RemoteDepdencyValidator.RemoteDepdencyValidator.Validate(payload, baseType);\n        \n                            default:\n                                return EventValidator.EventValidator.Validate(payload, baseType);\n                        }\n                    }\n                }\n            } finally {\n                if (testContext && testContext.clock) {\n                    testContext.clock.tick(500);\n                }\n            }\n            \n            return false;\n        }, \"sender succeeded\", 10, 1000);\n    }\n}\n\nclass ChannelPlugin implements IPlugin {\n\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry(env: ITelemetryItem) {}\n\n    setNextPlugin(next: any) {\n        // no next setup\n    }\n\n    public initialize = (config: IConfiguration, core: IAppInsightsCore, plugin: IPlugin[]) => {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n\n    }\n}\n\nclass CustomTestError extends Error {\n    constructor(message = \"\") {\n      super(message);\n      this.name = \"CustomTestError\";\n      this.message = message + \" -- test error.\";\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/Tests/Unit/src/TelemetryItemCreator.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport {\n    PageViewPerformance,\n    PageView,\n    TelemetryItemCreator,\n    IPageViewTelemetry,\n    IEventTelemetry,\n    Event as EventTelemetry,\n    Trace,\n    ITraceTelemetry,\n    Metric,\n    IMetricTelemetry,\n    RemoteDependencyData,\n    IDependencyTelemetry,\n    PageViewPerformanceDataType,\n    PageViewDataType,\n    EventDataType,\n    TraceDataType,\n    MetricDataType,\n    RemoteDependencyDataType,\n    PageViewPerformanceEnvelopeType,\n    PageViewEnvelopeType,\n    EventEnvelopeType,\n    TraceEnvelopeType,\n    MetricEnvelopeType,\n    RemoteDependencyEnvelopeType,\n} from '@microsoft/applicationinsights-core-js';\nimport { AnalyticsPlugin } from '../../../src/JavaScriptSDK/AnalyticsPlugin'\nimport { \n    IAppInsightsCore, AppInsightsCore,\n    ITelemetryItem,\n    IConfiguration, IPlugin\n} from '@microsoft/applicationinsights-core-js';\n\n\n\nexport class TelemetryItemCreatorTests extends AITestClass {\n    private _core: IAppInsightsCore;\n    private _appInsights: AnalyticsPlugin;\n\n    constructor(name?: string, emulateIe?: boolean) {\n        super(name, emulateIe);\n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n    }\n\n    public testInitialize() {\n        const plugin: IPlugin = new ChannelPlugin();\n        this._core = new AppInsightsCore();\n        this._core.initialize(\n            {instrumentationKey: \"ikey\"},\n            [plugin]\n        );\n        this._appInsights = new AnalyticsPlugin();\n        this._core.addPlugin(this._appInsights);\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._core) {\n            this._core.unload(false);\n        }    \n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"TelemetryItemCreatorTests: create a valid ITelemetryItem for a page view performance item\",\n            test: () => {\n                // setup\n                const name = \"testName\";\n                const uri = \"testUri\";\n                const pageViewPerformance = new PageViewPerformance(this._core.logger, name, uri, null);\n                const properties = {\n                    \"propKey1\": \"PropVal1\",\n                    \"propKey2\": \"PropVal2\"\n                };\n\n                // act\n                const telemetryItem = TelemetryItemCreator.create<PageViewPerformance>(\n                    pageViewPerformance,\n                    PageViewPerformanceDataType,\n                    PageViewPerformanceEnvelopeType,\n                    this._core.logger,\n                    properties);\n\n                // assert\n                Assert.ok(telemetryItem);\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.PageviewPerformance\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.PageviewPerformance\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"\", telemetryItem.iKey, \"telemetryItem.iKey\");\n                Assert.deepEqual({\"propKey1\":\"PropVal1\",\"propKey2\":\"PropVal2\"},telemetryItem.data, \"telemetryItem.data\");\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryItemCreatorTests: create a valid ITelemetryItem for a page view item\",\n            test: () => {\n                // setup\n                const name = \"testName\";\n                const uri = \"testUri\";\n                const pageView: IPageViewTelemetry = {\n                    name,\n                    uri\n                };\n                const properties = {\n                    \"propKey1\": \"PropVal1\",\n                    \"propKey2\": \"PropVal2\"\n                };\n\n                // act\n                const telemetryItem = TelemetryItemCreator.create<IPageViewTelemetry>(\n                    pageView,\n                    PageViewDataType,\n                    PageViewEnvelopeType,\n                    this._core.logger,\n                    properties);\n\n                // assert\n                Assert.ok(telemetryItem);\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.Pageview\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"PageviewData\", telemetryItem.baseType, \"telemetryItem.baseType\");\n                Assert.equal(\"\",telemetryItem.iKey,\"telemetryItem.iKey\");\n                Assert.deepEqual({\"propKey1\":\"PropVal1\",\"propKey2\":\"PropVal2\"},telemetryItem.data, \"telemetryItem.data\");\n            }\n        });\n\n        \n        this.testCase({\n            name: \"TelemetryItemCreatorTests: create a valid TelemetryItem for trackEvent with iKey\",\n            test: () => {\n                // setup\n                const event: IEventTelemetry = {\n                    name: \"trackEventNewtTest\",\n                    iKey: \"newTestIkey\",\n                    properties: { \"prop1\": \"value1\" },\n                    measurements: { \"measurement1\": 200 }\n                }\n                const customProperties = {\"propKey1\":\"PropVal1\"};\n                \n                // act\n                const telemetryItem = TelemetryItemCreator.create<ITelemetryItem>(\n                    event,\n                    EventDataType,\n                    EventEnvelopeType,\n                    this._appInsights.diagLog(),\n                    customProperties);\n\n                // assert\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.Event\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"EventData\", telemetryItem.baseType, \"telemetryItem.baseType\");\n                Assert.equal(\"newTestIkey\", telemetryItem.iKey, \"telemtryItem.iKey\");\n                Assert.deepEqual({\"propKey1\":\"PropVal1\"},telemetryItem.data, \"telemetryItem.data\");\n                Assert.deepEqual( \"trackEventNewtTest\",telemetryItem.baseData.name, \"telemetryItem.baseData.name\");\n                Assert.deepEqual({ \"prop1\": \"value1\" },telemetryItem.baseData.properties, \"telemetryItem.baseData.properties\");\n                Assert.deepEqual({ \"measurement1\": 200 },telemetryItem.baseData.measurements, \"telemetryItem.baseData.measurements\");\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryItemCreatorTests: create a valid ITelemetryItem for a page view item with iKey\",\n            test: () => {\n                // setup\n                const name = \"testName\";\n                const uri = \"testUri\";\n                const pageView: IPageViewTelemetry = {\n                    name: name,\n                    uri: uri,\n                    iKey: \"newIkey\"\n                };\n                const properties = {\n                    \"propKey1\": \"PropVal1\"\n                };\n\n                // act\n                const telemetryItem = TelemetryItemCreator.create<IPageViewTelemetry>(\n                    pageView,\n                    PageViewDataType,\n                    PageViewEnvelopeType,\n                    this._core.logger,\n                    properties);\n\n                // assert\n                Assert.ok(telemetryItem);\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.Pageview\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"newIkey\", telemetryItem.iKey, \"telemtryItem.iKey\");\n                Assert.equal(\"PageviewData\", telemetryItem.baseType, \"telemetryItem.baseType\");\n                Assert.equal(\"testUri\", telemetryItem.baseData.uri, \"telemetryItem.baseData.uri\");\n                Assert.equal(\"testName\", telemetryItem.baseData.name, \"telemetryItem.baseData.name\");\n                Assert.deepEqual({ \"propKey1\": \"PropVal1\" }, telemetryItem.data, \"telemetryItem.data\");\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryItemCreatorTests: create a valid ITelemetryItem for a trace item with iKey\",\n            test: () => {\n                // setup\n                const trace: ITraceTelemetry = {\n                    message:\"traceMessage\",\n                    iKey: \"newIkey\"\n                };\n                const  customProperties = {\n                    \"propKey1\": \"PropVal1\"\n                };\n\n                // act\n                const telemetryItem = TelemetryItemCreator.create<ITraceTelemetry>(\n                    trace,\n                    TraceDataType,\n                    TraceEnvelopeType,\n                    this._core.logger,\n                    customProperties);\n\n                // assert\n                Assert.ok(telemetryItem);\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.Message\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"newIkey\", telemetryItem.iKey, \"telemtryItem.iKey\");\n                Assert.equal(\"MessageData\", telemetryItem.baseType, \"telemetryItem.baseType\");\n                Assert.equal(\"traceMessage\", telemetryItem.baseData.message, \"telemetryItem.baseData.message\");\n                Assert.deepEqual({\"propKey1\":\"PropVal1\"},telemetryItem.data, \"telemetryItem.data\");\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryItemCreatorTests: create a valid ITelemetryItem for a metric item with iKey\",\n            test: () => {\n                // setup\n                const metric: IMetricTelemetry = {\n                    name:\"metricName\",\n                    average: 5,\n                    iKey: \"newIkey\"\n                };\n\n                // act\n                const telemetryItem = TelemetryItemCreator.create<IMetricTelemetry>(\n                    metric,\n                    MetricDataType,\n                    MetricEnvelopeType,\n                    this._core.logger\n                );\n\n                // assert\n                Assert.ok(telemetryItem);\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.Metric\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"newIkey\", telemetryItem.iKey, \"telemtryItem.iKey\");\n                Assert.equal(\"MetricData\", telemetryItem.baseType, \"telemetryItem.baseType\");\n                Assert.equal(\"metricName\",telemetryItem.baseData.name, \"telemetryItem.baseData.name\");\n                Assert.equal(5,telemetryItem.baseData.average, \"telemetryItem.baseData.average\");\n            }\n        });\n\n        this.testCase({\n            name: \"TelemetryItemCreatorTests: create a valid ITelemetryItem for a dependency item with iKey\",\n            test: () => {\n                // setup\n                const dependency: IDependencyTelemetry = {\n                    name:\"dependencyName\",\n                    id:\"id\",\n                    responseCode: 200,\n                    iKey: \"newIkey\"\n                };\n\n                // act\n                const telemetryItem = TelemetryItemCreator.create<IDependencyTelemetry>(\n                    dependency,\n                    RemoteDependencyDataType,\n                    RemoteDependencyEnvelopeType,\n                    this._core.logger,\n                );\n\n                // assert\n                Assert.ok(telemetryItem);\n                Assert.equal(\"Microsoft.ApplicationInsights.{0}.RemoteDependency\", telemetryItem.name, \"telemtryItem.name\");\n                Assert.equal(\"newIkey\", telemetryItem.iKey, \"telemtryItem.iKey\");\n                Assert.equal(\"RemoteDependencyData\", telemetryItem.baseType, \"telemetryItem.baseType\");\n                Assert.equal(\"dependencyName\",telemetryItem.baseData.name, \"telemetryItem.baseData.name\");\n                Assert.equal(200,telemetryItem.baseData.responseCode, \"telemetryItem.baseData.responseCode\");\n                Assert.equal(\"id\",telemetryItem.baseData.id, \"telemetryItem.baseData.id\");\n                \n            }\n        });\n    }\n}\n\nclass ChannelPlugin implements IPlugin {\n\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    public processTelemetry;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }    \n    \n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n    \n    setNextPlugin(next: any) {\n        // no next setup\n    }\n\n    public initialize = (config: IConfiguration) => {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/Tests/Unit/src/appinsights-analytics.tests.ts",
    "content": "import { AnalyticsPluginTests } from './AnalyticsPlugin.tests';\nimport { TelemetryItemCreatorTests } from './TelemetryItemCreator.tests';\nimport { AnalyticsExtensionSizeCheck } from \"./AnalyticsExtensionSize.tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new AnalyticsPluginTests().registerTests();\n    new TelemetryItemCreatorTests().registerTests();\n    new AnalyticsExtensionSizeCheck().registerTests();\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript Analytics Extension</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/Selenium/ExceptionHelper.js\"></script>\n    <!-- <script src=\"../../../common/Tests/External/sinon-2.3.8.js\" crossorigin=\"anonymous\"></script> -->\n    <script src=\"../../../common/Tests/External/sinon-7.3.1.js\"></script> -->\n    <!-- <script src=\"../../../common/Tests/External/require-2.3.6.js\" crossorigin=\"anonymous\"></script> -->\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"pako\",\"./node_modules/pako/dist/pako\");\n\n        // Dev Dependencies are not automatically detected and loaded so we need to include manually\n        modules.add(\"@microsoft/applicationinsights-channel-js\");           // Load Channel\n        modules.add(\"@microsoft/applicationinsights-properties-js\");        // Load Properties\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/appinsights-analytics.tests\", \"./Unit/dist/appinsights-analytics.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-analytics-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-analytics-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-analytics-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - Web Analytics\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-analytics-js.js\",\n    \"module\": \"dist-es5/applicationinsights-analytics-js.js\",\n    \"types\": \"types/applicationinsights-analytics-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-analytics-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt ai\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt aitests\",\n        \"mintest\": \"grunt ai-mintests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights JavaScript SDK - Web Analytics\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt ai-min\",\n        \"ai-restore\": \"grunt ai-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/applicationinsights-properties-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-channel-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-dependencies-js\": \"3.4.1\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"qunit\": \"^2.11.2\",\n        \"typedoc\": \"^0.26.6\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/rollup.config.js",
    "content": "import { createUnVersionedConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst outputName = \"applicationinsights-analytics-js\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Web Analytics, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createUnVersionedConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: outputName, \n      outputName: outputName\n    },\n    browser: {\n      entryPoint: outputName,\n      outputName: outputName\n    },\n  },\n  [ \"applicationinsights-analytics-js\" ],\n  false\n);\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/src/JavaScriptSDK/AnalyticsPlugin.ts",
    "content": "/**\n* ApplicationInsights.ts\n* @copyright Microsoft 2018\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    AnalyticsPluginIdentifier, BaseTelemetryPlugin, EventDataType, EventEnvelopeType, Exception, ExceptionDataType, ExceptionEnvelopeType,\n    IAppInsights, IAppInsightsCore, IAutoExceptionTelemetry, IConfig, IConfigDefaults, IConfiguration, ICookieMgr, ICustomProperties,\n    IDependencyTelemetry, IDistributedTraceContext, IEventTelemetry, IExceptionConfig, IExceptionInternal, IExceptionTelemetry,\n    IInstrumentCallDetails, IMetricTelemetry, IPageViewPerformanceTelemetry, IPageViewPerformanceTelemetryInternal, IPageViewTelemetry,\n    IPageViewTelemetryInternal, IPlugin, IProcessTelemetryContext, IProcessTelemetryUnloadContext, ITelemetryInitializerHandler,\n    ITelemetryItem, ITelemetryPluginChain, ITelemetryUnloadState, ITraceTelemetry, InstrumentEvent, MetricDataType, MetricEnvelopeType,\n    PageViewDataType, PageViewEnvelopeType, PageViewPerformanceDataType, PageViewPerformanceEnvelopeType, RemoteDependencyDataType,\n    TelemetryInitializerFunction, TraceDataType, TraceEnvelopeType, _eInternalMessageId, arrForEach, cfgDfBoolean, cfgDfMerge, cfgDfSet,\n    cfgDfString, cfgDfValidate, createDistributedTraceContext, createDomEvent, createProcessTelemetryContext, createTelemetryItem,\n    createUniqueNamespace, dataSanitizeString, dumpObj, eLoggingSeverity, eSeverityLevel, eventOff, eventOn, fieldRedaction, findAllScripts,\n    generateW3CId, getDocument, getExceptionName, getHistory, getLocation, getWindow, hasHistory, hasWindow, isCrossOriginError, isFunction,\n    isNullOrUndefined, isString, isUndefined, mergeEvtNamespace, onConfigChange, safeGetCookieMgr, strNotSpecified, strUndefined, throwError,\n    utlDisableStorage, utlEnableStorage, utlSetStoragePrefix\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IAjaxMonitorPlugin } from \"@microsoft/applicationinsights-dependencies-js\";\nimport { isArray, isError, objDeepFreeze, objDefine, scheduleTimeout, strIndexOf } from \"@nevware21/ts-utils\";\nimport { IAnalyticsConfig, eRouteTraceStrategy } from \"./Interfaces/IAnalyticsConfig\";\nimport { IAppInsightsInternal, IPageViewManager, createPageViewManager } from \"./Telemetry/PageViewManager\";\nimport { IPageViewPerformanceManager, createPageViewPerformanceManager } from \"./Telemetry/PageViewPerformanceManager\";\nimport { IPageVisitTimeManager, createPageVisitTimeManager } from \"./Telemetry/PageVisitTimeManager\";\nimport { ITiming, createTiming } from \"./Timing\";\n\nconst strEvent = \"event\";\n\nfunction _dispatchEvent(target:EventTarget, evnt: Event) {\n    if (target && target.dispatchEvent && evnt) {\n        target.dispatchEvent(evnt);\n    }\n}\n\nfunction _getReason(error: any) {\n    if (error && error.reason) {\n        const reason = error.reason;\n        if (!isString(reason) && isFunction(reason.toString)) {\n            return reason.toString();\n        }\n\n        return dumpObj(reason);\n    }\n\n    // Pass the original object down which will eventually get evaluated for any message or description\n    return error || \"\";\n}\n\nconst MinMilliSeconds = 60000;\n\nconst defaultValues: IConfigDefaults<IAnalyticsConfig> = objDeepFreeze({\n    sessionRenewalMs: cfgDfSet(_chkConfigMilliseconds, 30 * 60 * 1000),\n    sessionExpirationMs: cfgDfSet(_chkConfigMilliseconds, 24 * 60 * 60 * 1000),\n    disableExceptionTracking: cfgDfBoolean(),\n    autoTrackPageVisitTime: cfgDfBoolean(),\n    overridePageViewDuration: cfgDfBoolean(),\n    enableUnhandledPromiseRejectionTracking: cfgDfBoolean(),\n    autoUnhandledPromiseInstrumented: false,\n    samplingPercentage: cfgDfValidate(_chkSampling, 100),\n    isStorageUseDisabled: cfgDfBoolean(),\n    isBrowserLinkTrackingEnabled: cfgDfBoolean(),\n    enableAutoRouteTracking: cfgDfBoolean(),\n    namePrefix: cfgDfString(),\n    enableDebug: cfgDfBoolean(),\n    disableFlushOnBeforeUnload: cfgDfBoolean(),\n    disableFlushOnUnload: cfgDfBoolean(false, \"disableFlushOnBeforeUnload\"),\n    expCfg: cfgDfMerge<IExceptionConfig>({inclScripts: false, expLog: undefined, maxLogs: 50}),\n    routeTraceStrategy: eRouteTraceStrategy.Server\n});\n\nfunction _chkConfigMilliseconds(value: number, defValue: number): number {\n    value = value || defValue;\n    if (value < MinMilliSeconds) {\n        value = MinMilliSeconds;\n    }\n\n    return +value;\n}\n\nfunction _chkSampling(value: number) {\n    return !isNaN(value) && value > 0 && value <= 100;\n}\n\nfunction _updateStorageUsage(extConfig: IAnalyticsConfig) {\n    // Not resetting the storage usage as someone may have manually called utlDisableStorage, so this will only\n    // reset based if the configuration option is provided\n    if (!isUndefined(extConfig.isStorageUseDisabled)) {\n        if (extConfig.isStorageUseDisabled) {\n            utlDisableStorage();\n        } else {\n            utlEnableStorage();\n        }\n    }\n}\n\nexport class AnalyticsPlugin extends BaseTelemetryPlugin implements IAppInsights, IAppInsightsInternal {\n    public static Version = \"#version#\"; // Not currently used anywhere\n\n    public identifier: string = AnalyticsPluginIdentifier; // do not change name or priority\n    public priority: number = 180; // take from reserved priority range 100- 200\n    public readonly config: IConfig & IConfiguration;\n    public queue: Array<() => void>;\n    public autoRoutePVDelay = 500; // ms; Time to wait after a route change before triggering a pageview to allow DOM changes to take place\n\n    constructor() {\n        super();\n        let _eventTracking: ITiming;\n        let _pageTracking: ITiming;\n        let _pageViewManager: IPageViewManager;\n        let _pageViewPerformanceManager: IPageViewPerformanceManager;\n        let _pageVisitTimeManager: IPageVisitTimeManager;\n        let _preInitTelemetryInitializers: TelemetryInitializerFunction[];\n        let _isBrowserLinkTrackingEnabled: boolean;\n        let _browserLinkInitializerAdded: boolean;\n        let _enableAutoRouteTracking: boolean;\n        let _historyListenerAdded: boolean;\n        let _disableExceptionTracking: boolean;\n        let _autoExceptionInstrumented: boolean;\n        let _enableUnhandledPromiseRejectionTracking: boolean;\n        let _autoUnhandledPromiseInstrumented: boolean;\n        let _extConfig: IAnalyticsConfig;\n        let _autoTrackPageVisitTime: boolean;\n        let _expCfg: IExceptionConfig;\n\n        // New configuration variables for trace context management\n        let _routeTraceStrategy: eRouteTraceStrategy;\n\n        // array with max length of 2 that store current url and previous url for SPA page route change trackPageview use.\n        let _prevUri: string; // Assigned in the constructor\n        let _currUri: string;\n        let _evtNamespace: string | string[];\n        // For testing error hooks only\n        let _errorHookCnt: number;\n\n        dynamicProto(AnalyticsPlugin, this, (_self, _base) => {\n            let _addHook = _base._addHook;\n\n            _initDefaults();\n\n            _self.getCookieMgr = () => {\n                return safeGetCookieMgr(_self.core);\n            };\n\n            _self.processTelemetry = (env: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                _self.processNext(env, itemCtx);\n            };\n\n            _self.trackEvent = (event: IEventTelemetry, customProperties?: ICustomProperties): void => {\n                try {\n                    let telemetryItem = createTelemetryItem<IEventTelemetry>(\n                        event,\n                        EventDataType,\n                        EventEnvelopeType,\n                        _self.diagLog(),\n                        customProperties\n                    );\n\n                    _self.core.track(telemetryItem);\n                } catch (e) {\n                    _throwInternal(eLoggingSeverity.WARNING,\n                        _eInternalMessageId.TrackTraceFailed,\n                        \"trackTrace failed, trace will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * Start timing an extended event. Call `stopTrackEvent` to log the event when it ends.\n             * @param name - A string that identifies this event uniquely within the document.\n             */\n            _self.startTrackEvent = (name: string) => {\n                try {\n                    _eventTracking.start(name);\n                } catch (e) {\n                    _throwInternal(eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.StartTrackEventFailed,\n                        \"startTrackEvent failed, event will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * Log an extended event that you started timing with `startTrackEvent`.\n             * @param name - The string you used to identify this event in `startTrackEvent`.\n             * @param properties - map[string, string] - additional data used to filter events and metrics in the portal. Defaults to empty.\n             * @param measurements - map[string, number] - metrics associated with this event, displayed in Metrics Explorer on the portal. Defaults to empty.\n             */\n            _self.stopTrackEvent = (name: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) => {\n                try {\n                    _eventTracking.stop(name, undefined, properties, measurements);\n                } catch (e) {\n                    _throwInternal(eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.StopTrackEventFailed,\n                        \"stopTrackEvent failed, event will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * @description Log a diagnostic message\n             * @param trace - the trace message\n             * @param customProperties - Additional custom properties to include in the event\n             */\n            _self.trackTrace = (trace: ITraceTelemetry, customProperties?: ICustomProperties): void => {\n                try {\n                    let telemetryItem = createTelemetryItem<ITraceTelemetry>(\n                        trace,\n                        TraceDataType,\n                        TraceEnvelopeType,\n                        _self.diagLog(),\n                        customProperties);\n\n                    _self.core.track(telemetryItem);\n                } catch (e) {\n                    _throwInternal(eLoggingSeverity.WARNING,\n                        _eInternalMessageId.TrackTraceFailed,\n                        \"trackTrace failed, trace will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * @description Log a numeric value that is not associated with a specific event. Typically\n             * used to send regular reports of performance indicators. To send single measurement, just\n             * use the name and average fields of {@link IMetricTelemetry}. If you take measurements\n             * frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements\n             * and sending the resulting average at intervals\n             * @param metric - input object argument. Only name and average are mandatory.\n             * @param } customProperties additional data used to filter metrics in the\n             * portal. Defaults to empty.\n             */\n            _self.trackMetric = (metric: IMetricTelemetry, customProperties?: ICustomProperties): void => {\n                try {\n                    let telemetryItem = createTelemetryItem<IMetricTelemetry>(\n                        metric,\n                        MetricDataType,\n                        MetricEnvelopeType,\n                        _self.diagLog(),\n                        customProperties\n                    );\n\n                    _self.core.track(telemetryItem);\n                } catch (e) {\n                    _throwInternal(eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.TrackMetricFailed,\n                        \"trackMetric failed, metric will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * Logs that a page or other item was viewed.\n             * @param IPageViewTelemetry - The string you used as the name in startTrackPage. Defaults to the document title.\n             * @param customProperties - Additional data used to filter events and metrics. Defaults to empty.\n             * If a user wants to provide duration for pageLoad, it'll have to be in pageView.properties.duration\n             */\n            _self.trackPageView = (pageView?: IPageViewTelemetry, customProperties?: ICustomProperties) => {\n                try {\n                    let inPv = pageView || {};\n                    if (_self.core && _self.core.config) {\n                        inPv.uri = fieldRedaction(inPv.uri, _self.core.config);\n                    }\n                    _pageViewManager.trackPageView(inPv, { ...inPv.properties, ...inPv.measurements, ...customProperties });\n\n                    if (_autoTrackPageVisitTime) {\n                        _pageVisitTimeManager.trackPreviousPageVisit(inPv.name, inPv.uri);\n                    }\n                } catch (e) {\n                    _throwInternal(\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.TrackPVFailed,\n                        \"trackPageView failed, page view will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * Create a page view telemetry item and send it to the SDK pipeline through the core.track API\n             * @param pageView - Page view item to be sent\n             * @param properties - Custom properties (Part C) that a user can add to the telemetry item\n             * @param systemProperties - System level properties (Part A) that a user can add to the telemetry item\n             */\n            _self.sendPageViewInternal = (pageView: IPageViewTelemetryInternal, properties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) => {\n                let doc = getDocument();\n                if (doc) {\n                    pageView.refUri = pageView.refUri === undefined ? doc.referrer : pageView.refUri;\n                }\n                if (_self.core && _self.core.config) {\n                    pageView.refUri = fieldRedaction(pageView.refUri, _self.core.config);\n                }\n                if (isNullOrUndefined(pageView.startTime)) {\n                    // calculate the start time manually\n                    let duration = ((properties || pageView.properties || {}).duration || 0);\n                    pageView.startTime = new Date(new Date().getTime() - duration);\n                }\n                let telemetryItem = createTelemetryItem<IPageViewTelemetryInternal>(\n                    pageView,\n                    PageViewDataType,\n                    PageViewEnvelopeType,\n                    _self.diagLog(),\n                    properties,\n                    systemProperties);\n\n                _self.core.track(telemetryItem);\n                // reset ajaxes counter\n                _resetAjaxAttempts();\n            };\n\n            /**\n             * @ignore INTERNAL ONLY\n             * @param pageViewPerformance\n             * @param properties\n             */\n            _self.sendPageViewPerformanceInternal = (pageViewPerformance: IPageViewPerformanceTelemetryInternal, properties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) => {\n                let telemetryItem = createTelemetryItem<IPageViewPerformanceTelemetryInternal>(\n                    pageViewPerformance,\n                    PageViewPerformanceDataType,\n                    PageViewPerformanceEnvelopeType,\n                    _self.diagLog(),\n                    properties,\n                    systemProperties);\n\n                _self.core.track(telemetryItem);\n            };\n\n            /**\n             * Send browser performance metrics.\n             * @param pageViewPerformance\n             * @param customProperties\n             */\n            _self.trackPageViewPerformance = (pageViewPerformance: IPageViewPerformanceTelemetry, customProperties?: ICustomProperties): void => {\n                let inPvp = pageViewPerformance || {};\n                try {\n                    _pageViewPerformanceManager.populatePageViewPerformanceEvent(inPvp);\n                    _self.sendPageViewPerformanceInternal(inPvp, customProperties);\n                } catch (e) {\n                    _throwInternal(\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.TrackPVFailed,\n                        \"trackPageViewPerformance failed, page view will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * Starts the timer for tracking a page load time. Use this instead of `trackPageView` if you want to control when the page view timer starts and stops,\n             * but don't want to calculate the duration yourself. This method doesn't send any telemetry. Call `stopTrackPage` to log the end of the page view\n             * and send the event.\n             * @param name - A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n             */\n            _self.startTrackPage = (name?: string) => {\n                try {\n                    if (typeof name !== \"string\") {\n                        let doc = getDocument();\n                        name = doc && doc.title || \"\";\n                    }\n\n                    _pageTracking.start(name);\n                } catch (e) {\n                    _throwInternal(\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.StartTrackFailed,\n                        \"startTrackPage failed, page view may not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * Stops the timer that was started by calling `startTrackPage` and sends the pageview load time telemetry with the specified properties and measurements.\n             * The duration of the page view will be the time between calling `startTrackPage` and `stopTrackPage`.\n             * @param name - The string you used as the name in startTrackPage. Defaults to the document title.\n             * @param url - String - a relative or absolute URL that identifies the page or other item. Defaults to the window location.\n             * @param properties - map[string, string] - additional data used to filter pages and metrics in the portal. Defaults to empty.\n             * @param measurements - map[string, number] - metrics associated with this page, displayed in Metrics Explorer on the portal. Defaults to empty.\n             */\n            _self.stopTrackPage = (name?: string, url?: string, properties?: { [key: string]: string }, measurement?: { [key: string]: number }) => {\n                try {\n                    if (typeof name !== \"string\") {\n                        let doc = getDocument();\n                        name = doc && doc.title || \"\";\n                    }\n\n                    if (typeof url !== \"string\") {\n                        let loc = getLocation();\n                        url = loc && loc.href || \"\";\n                    }\n                    if (_self.core && _self.core.config) {\n                        url = fieldRedaction(url, _self.core.config);\n                    }\n                    _pageTracking.stop(name, url, properties, measurement);\n\n                    if (_autoTrackPageVisitTime) {\n                        _pageVisitTimeManager.trackPreviousPageVisit(name, url);\n                    }\n                } catch (e) {\n                    _throwInternal(\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.StopTrackFailed,\n                        \"stopTrackPage failed, page view will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n            * @ignore INTERNAL ONLY\n            * @param exception\n            * @param properties\n            * @param systemProperties\n            */\n            _self.sendExceptionInternal = (exception: IExceptionTelemetry, customProperties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) => {\n                // Adding additional edge cases to handle\n                // - Not passing anything (null / undefined)\n                const theError = (exception && (exception.exception || exception.error)) ||\n                    // - Handle someone calling trackException based of v1 API where the exception was the Error\n                    isError(exception) && exception ||\n                    // - Handles no error being defined and instead of creating a new Error() instance attempt to map so any stacktrace\n                    //   is preserved and does not list ApplicationInsights code as the source\n                    { name: (exception && typeof exception) as string, message: exception as any || strNotSpecified };\n\n                // If no exception object was passed assign to an empty object to avoid internal exceptions\n                exception = exception || {};\n                let exceptionPartB = new Exception(\n                    _self.diagLog(),\n                    theError,\n                    exception.properties || customProperties,\n                    exception.measurements,\n                    exception.severityLevel,\n                    exception.id\n                ).toInterface();\n                var doc = getDocument();\n                if (doc && _expCfg?.inclScripts) {\n                    var scriptsInfo = findAllScripts(doc);\n                    exceptionPartB.properties[\"exceptionScripts\"] = JSON.stringify(scriptsInfo);\n                }\n                if (_expCfg?.expLog) {\n                    let logs = _expCfg.expLog();\n                    if (logs && logs.logs && isArray(logs.logs)) {\n                        exceptionPartB.properties[\"exceptionLog\"] = logs.logs.slice(0, _expCfg.maxLogs).join(\"\\n\");\n                    }\n                }\n                let telemetryItem: ITelemetryItem = createTelemetryItem<IExceptionInternal>(\n                    exceptionPartB,\n                    ExceptionDataType,\n                    ExceptionEnvelopeType,\n                    _self.diagLog(),\n                    customProperties,\n                    systemProperties\n                );\n                _self.core.track(telemetryItem);\n            };\n\n            /**\n             * Log an exception you have caught.\n             *\n             * @param exception -   Object which contains exception to be sent\n             * @param } customProperties   Additional data used to filter pages and metrics in the portal. Defaults to empty.\n             *\n             * Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric.\n             */\n            _self.trackException = (exception: IExceptionTelemetry, customProperties?: ICustomProperties): void => {\n                if (exception && !exception.exception && (exception as any).error) {\n                    exception.exception = (exception as any).error;\n                }\n\n                try {\n                    _self.sendExceptionInternal(exception, customProperties);\n                } catch (e) {\n                    _throwInternal(\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.TrackExceptionFailed,\n                        \"trackException failed, exception will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            /**\n             * @description Custom error handler for Application Insights Analytics\n             * @param exception\n             */\n            _self._onerror = (exception: IAutoExceptionTelemetry): void => {\n                let error = exception && exception.error;\n                let evt = exception && exception.evt;\n\n                try {\n                    if (!evt) {\n                        let _window = getWindow();\n                        if (_window) {\n                            evt = _window[strEvent];\n                        }\n                    }\n                    const url = (exception && exception.url) || (getDocument() || {} as any).URL;\n                    // If no error source is provided assume the default window.onerror handler\n                    const errorSrc = exception.errorSrc || \"window.onerror@\" + url + \":\" + (exception.lineNumber || 0) + \":\" + (exception.columnNumber || 0);\n                    let properties = {\n                        errorSrc,\n                        url,\n                        lineNumber: exception.lineNumber || 0,\n                        columnNumber: exception.columnNumber || 0,\n                        message: exception.message\n                    };\n\n                    if (isCrossOriginError(exception.message, exception.url, exception.lineNumber, exception.columnNumber, exception.error)) {\n                        _sendCORSException(Exception.CreateAutoException(\n                            \"Script error: The browser's same-origin policy prevents us from getting the details of this exception. Consider using the 'crossorigin' attribute.\",\n                            url,\n                            exception.lineNumber || 0,\n                            exception.columnNumber || 0,\n                            error,\n                            evt,\n                            null,\n                            errorSrc\n                        ), properties);\n                    } else {\n                        if (!exception.errorSrc) {\n                            exception.errorSrc = errorSrc;\n                        }\n                        _self.trackException({ exception, severityLevel: eSeverityLevel.Error }, properties);\n                    }\n                } catch (e) {\n                    const errorString = error ? (error.name + \", \" + error.message) : \"null\";\n\n                    _throwInternal(\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.ExceptionWhileLoggingError,\n                        \"_onError threw exception while logging error, error will not be collected: \"\n                        + getExceptionName(e),\n                        { exception: dumpObj(e), errorString }\n                    );\n                }\n            };\n\n            _self.addTelemetryInitializer = (telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler => {\n                if (_self.core) {\n                    // Just add to the core\n                    return _self.core.addTelemetryInitializer(telemetryInitializer);\n                }\n\n                // Handle \"pre-initialization\" telemetry initializers (for backward compatibility)\n                if (!_preInitTelemetryInitializers) {\n                    _preInitTelemetryInitializers = [];\n                }\n\n                _preInitTelemetryInitializers.push(telemetryInitializer);\n            };\n\n            _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) => {\n                if (_self.isInitialized()) {\n                    return;\n                }\n\n                if (isNullOrUndefined(core)) {\n                    throwError(\"Error initializing\");\n                }\n\n                _base.initialize(config, core, extensions, pluginChain);\n                try {\n                    _evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());\n                    if (_preInitTelemetryInitializers) {\n                        arrForEach(_preInitTelemetryInitializers, (initializer) => {\n                            core.addTelemetryInitializer(initializer);\n                        });\n\n                        _preInitTelemetryInitializers = null;\n                    }\n\n                    _populateDefaults(config);\n\n                    _pageViewPerformanceManager = createPageViewPerformanceManager(_self.core);\n                    _pageViewManager = createPageViewManager(_self, _extConfig.overridePageViewDuration, _self.core, _pageViewPerformanceManager);\n                    _pageVisitTimeManager = createPageVisitTimeManager(_self.diagLog(), (pageName, pageUrl, pageVisitTime) => trackPageVisitTime(pageName, pageUrl, pageVisitTime));\n\n                    _eventTracking = createTiming(_self.diagLog(), \"trackEvent\");\n                    _eventTracking.action =\n                        (name?: string, url?: string, duration?: number, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) => {\n                            if (!properties) {\n                                properties = {};\n                            }\n\n                            if (!measurements) {\n                                measurements = {};\n                            }\n\n                            properties.duration = duration.toString();\n                            _self.trackEvent({ name, properties, measurements } as IEventTelemetry);\n                        }\n\n                    // initialize page view timing\n                    _pageTracking = createTiming(_self.diagLog(), \"trackPageView\");\n                    _pageTracking.action = (name, url, duration, properties, measurements) => {\n\n                        // duration must be a custom property in order for the collector to extract it\n                        if (isNullOrUndefined(properties)) {\n                            properties = {};\n                        }\n                        properties.duration = duration.toString();\n    \n                        let pageViewItem: IPageViewTelemetry = {\n                            name,\n                            uri: url,\n                            properties,\n                            measurements\n                        };\n    \n                        _self.sendPageViewInternal(pageViewItem, properties);\n                    }\n    \n                    if (hasWindow()) {\n                        _updateExceptionTracking();\n                        _updateLocationChange();\n                    }\n    \n                } catch (e) {\n                    // resetting the initialized state because of failure\n                    _self.setInitialized(false);\n                    throw e;\n                }\n            };\n\n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _pageViewManager && _pageViewManager.teardown(unloadCtx, unloadState)\n        \n                // Just register to remove all events associated with this namespace\n                eventOff(window, null, null, _evtNamespace);\n                _initDefaults();\n            };\n\n           \n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [_errorHookCnt, _autoExceptionInstrumented];\n            };\n            \n            function _resetAjaxAttempts() {\n                // Reset ajax attempts counter for the new page view\n                if (_self.core) {\n                    let ajaxPlugin = _self.core.getPlugin<IAjaxMonitorPlugin>(\"AjaxDependencyPlugin\");\n                    if (ajaxPlugin && ajaxPlugin.plugin && ajaxPlugin.plugin.resetAjaxAttempts) {\n                        ajaxPlugin.plugin.resetAjaxAttempts();\n                    }\n                }\n            }\n            \n            function _populateDefaults(config: IConfiguration) {\n                // it is used for 1DS as well, so config type should be IConfiguration only\n                let identifier = _self.identifier;\n                let core = _self.core;\n\n                _self._addHook(onConfigChange(config, () => {\n                    let ctx = createProcessTelemetryContext(null, config, core);\n                    _extConfig = ctx.getExtCfg(identifier, defaultValues);\n                    // make sure auto exception is instrumented only once and it won't be overriden by the following config changes\n                    _autoExceptionInstrumented = _autoExceptionInstrumented || (config as any).autoExceptionInstrumented || _extConfig.autoExceptionInstrumented;\n\n                    _expCfg = _extConfig.expCfg;\n                    _autoTrackPageVisitTime = _extConfig.autoTrackPageVisitTime;\n\n                    // Initialize new trace context configuration options\n                    _routeTraceStrategy = _extConfig.routeTraceStrategy || eRouteTraceStrategy.Server;\n\n                    if (config.storagePrefix){\n                        utlSetStoragePrefix(config.storagePrefix);\n                    }\n                    _updateStorageUsage(_extConfig);\n\n                    // _updateBrowserLinkTracking\n                    _isBrowserLinkTrackingEnabled = _extConfig.isBrowserLinkTrackingEnabled;\n                    _addDefaultTelemetryInitializers();\n                }));\n            }\n\n            /**\n             * Log a page visit time\n             * @param pageName - Name of page\n             * @param pageVisitDuration - Duration of visit to the page in milliseconds\n             */\n            function trackPageVisitTime(pageName: string, pageUrl: string, pageVisitTime: number) {\n                let properties = { PageName: pageName, PageUrl: pageUrl };\n                _self.trackMetric({\n                    name: \"PageVisitTime\",\n                    average: pageVisitTime,\n                    max: pageVisitTime,\n                    min: pageVisitTime,\n                    sampleCount: 1\n                }, properties);\n            }\n\n            function _addDefaultTelemetryInitializers() {\n                if (!_browserLinkInitializerAdded && _isBrowserLinkTrackingEnabled) {\n                    const browserLinkPaths = [\"/browserLinkSignalR/\", \"/__browserLink/\"];\n                    const dropBrowserLinkRequests = (envelope: ITelemetryItem) => {\n                        if (_isBrowserLinkTrackingEnabled && envelope.baseType === RemoteDependencyDataType) {\n                            let remoteData = envelope.baseData as IDependencyTelemetry;\n                            if (remoteData) {\n                                for (let i = 0; i < browserLinkPaths.length; i++) {\n                                    if (remoteData.target && strIndexOf(remoteData.target, browserLinkPaths[i]) >= 0) {\n                                        return false;\n                                    }\n                                }\n                            }\n                        }\n\n                        return true;\n                    }\n\n                    _self._addHook(_self.addTelemetryInitializer(dropBrowserLinkRequests));\n                    _browserLinkInitializerAdded = true;\n                }\n            }\n\n            function _sendCORSException(exception: IAutoExceptionTelemetry, properties?: ICustomProperties) {\n                let telemetryItem: ITelemetryItem = createTelemetryItem<IAutoExceptionTelemetry>(\n                    exception,\n                    ExceptionDataType,\n                    ExceptionEnvelopeType,\n                    _self.diagLog(),\n                    properties\n                );\n\n                _self.core.track(telemetryItem);\n            }\n\n            function _updateExceptionTracking() {\n                let _window = getWindow();\n                let locn = getLocation(true);\n\n                _self._addHook(onConfigChange(_extConfig, () => {\n                    _disableExceptionTracking = _extConfig.disableExceptionTracking;\n                    if (!_disableExceptionTracking && !_autoExceptionInstrumented && !_extConfig.autoExceptionInstrumented) {\n                        // We want to enable exception auto collection and it has not been done so yet\n                        _addHook(InstrumentEvent(_window, \"onerror\", {\n                            ns: _evtNamespace,\n                            rsp: (callDetails: IInstrumentCallDetails, message, url, lineNumber, columnNumber, error) => {\n                                if (!_disableExceptionTracking && callDetails.rslt !== true) {\n                                    _self._onerror(Exception.CreateAutoException(\n                                        message,\n                                        url,\n                                        lineNumber,\n                                        columnNumber,\n                                        error,\n                                        callDetails.evt\n                                    ));\n                                }\n                            }\n                        }, false));\n                        _errorHookCnt ++;\n\n                        _autoExceptionInstrumented = true;\n                    }\n                }));\n\n                _addUnhandledPromiseRejectionTracking(_window, locn);\n            }\n\n            function _updateLocationChange() {\n                let win = getWindow();\n                let locn = getLocation(true);\n\n                _self._addHook(onConfigChange(_extConfig, () => {\n                    _enableAutoRouteTracking = _extConfig.enableAutoRouteTracking === true;\n\n                    /**\n                     * Create a custom \"locationchange\" event which is triggered each time the history object is changed\n                     */\n                    if (win && _enableAutoRouteTracking && !_historyListenerAdded && hasHistory()) {\n                        let _history = getHistory();\n\n                        if (isFunction(_history.pushState) && isFunction(_history.replaceState) && typeof Event !== strUndefined) {\n                            _addHistoryListener(win, _history, locn);\n                        }\n                    }\n                }));\n            }\n\n            /**\n             * Create a custom \"locationchange\" event which is triggered each time the history object is changed\n             */\n            function _addHistoryListener(win: Window, history: History, locn: Location) {\n                if (_historyListenerAdded) {\n                    return;\n                }\n\n                // Name Prefix is only referenced during the initial initialization and cannot be changed afterwards\n                let namePrefix = _extConfig.namePrefix || \"\";\n\n                function _popstateHandler() {\n                    if (_enableAutoRouteTracking) {\n                        _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                    }\n                }\n\n                function _locationChangeHandler() {\n                    // We always track the changes (if the handler is installed) to handle the feature being disabled between location changes\n                    if (_currUri) {\n                        _prevUri = _currUri;\n                        _currUri = locn && locn.href || \"\";\n                    } else {\n                        _currUri = locn && locn.href || \"\";\n                    }\n                    if (_self.core && _self.core.config) {\n                        _currUri = fieldRedaction(_currUri, _self.core.config);\n                    }\n\n                    if (_enableAutoRouteTracking) {\n\n                        // TODO(OTelSpan) (create new \"context\") / spans for the new page view\n                        // Should \"end\" any previous span (once we have a new one)\n                        let newContext: IDistributedTraceContext;\n\n                        // Quick and dirty backward compatibility check -- should never be needed but here to avoid a JS exception\n                        if (_self.core && _self.core.getTraceCtx) {\n                            let currentContext = _self.core.getTraceCtx(false); // Get current context without creating new\n                            \n                            if (currentContext && _routeTraceStrategy === eRouteTraceStrategy.Page) {\n                                // Create new context with the determined parent\n                                newContext = createDistributedTraceContext(currentContext);\n                            } else {\n                                // Fall back to original behavior - use server context as parent\n                                newContext = _self.core.getTraceCtx(true);\n                            }\n                            \n                            // Always generate new trace ID for route changes (this also generates new span ID)\n                            newContext.traceId = generateW3CId();\n\n                            // This populates the ai.operation.name which has a maximum size of 1024 so we need to sanitize it\n                            newContext.pageName = dataSanitizeString(_self.diagLog(), newContext.pageName || \"_unknown_\");\n\n                            _self.core.setTraceCtx(newContext);\n                        }\n\n                        // Single page view tracking call for all scenarios\n                        scheduleTimeout(((uri: string) => {\n                            _self.trackPageView({ refUri: uri, properties: { duration: 0 } });\n                        }).bind(_self, _prevUri), _self.autoRoutePVDelay);\n                    }\n                }\n\n                _addHook(InstrumentEvent(history, \"pushState\", {\n                    ns: _evtNamespace,\n                    rsp: () => {\n                        if (_enableAutoRouteTracking) {\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"pushState\"));\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                        }\n                    }\n                }, true));\n\n                _addHook(InstrumentEvent(history, \"replaceState\", {\n                    ns: _evtNamespace,\n                    rsp: () => {\n                        if (_enableAutoRouteTracking) {\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"replaceState\"));\n                            _dispatchEvent(win, createDomEvent(namePrefix + \"locationchange\"));\n                        }\n                    }\n                }, true));\n\n                eventOn(win, namePrefix + \"popstate\", _popstateHandler, _evtNamespace);\n                eventOn(win, namePrefix + \"locationchange\", _locationChangeHandler, _evtNamespace);\n\n                _historyListenerAdded = true;\n            }\n\n            function _addUnhandledPromiseRejectionTracking(_window: Window, _location: Location) {\n                _self._addHook(onConfigChange(_extConfig, () => {\n\n                    _enableUnhandledPromiseRejectionTracking = _extConfig.enableUnhandledPromiseRejectionTracking === true;\n                    _autoExceptionInstrumented = _autoExceptionInstrumented || _extConfig.autoUnhandledPromiseInstrumented;\n\n                    if (_enableUnhandledPromiseRejectionTracking && !_autoUnhandledPromiseInstrumented) {\n                        // We want to enable exception auto collection and it has not been done so yet\n                        _addHook(InstrumentEvent(_window, \"onunhandledrejection\", {\n                            ns: _evtNamespace,\n                            rsp: (callDetails: IInstrumentCallDetails, error: PromiseRejectionEvent) => {\n                                if (_enableUnhandledPromiseRejectionTracking && callDetails.rslt !== true) { // handled could be typeof function\n                                    _self._onerror(Exception.CreateAutoException(\n                                        _getReason(error),\n                                        _location ? _location.href : \"\",\n                                        0,\n                                        0,\n                                        error,\n                                        callDetails.evt\n                                    ));\n                                }\n                            }\n                        }, false));\n                        _errorHookCnt ++;\n                        _extConfig.autoUnhandledPromiseInstrumented = _autoUnhandledPromiseInstrumented = true;\n                    }\n                }));\n            }\n\n            /**\n             * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n             * @param severity - The severity of the log message\n             * @param msgId - The log message.\n             */\n            function _throwInternal(severity: eLoggingSeverity, msgId: _eInternalMessageId, msg: string, properties?: Object, isUserAct?: boolean): void {\n                _self.diagLog().throwInternal(severity, msgId, msg, properties, isUserAct);\n            }\n\n            function _initDefaults() {\n                _eventTracking = null;\n                _pageTracking = null;\n                _pageViewManager = null;\n                _pageViewPerformanceManager = null;\n                _pageVisitTimeManager = null;\n                _preInitTelemetryInitializers = null;\n                _isBrowserLinkTrackingEnabled = false;\n                _browserLinkInitializerAdded = false;\n                _enableAutoRouteTracking = false;\n                _historyListenerAdded = false;\n                _disableExceptionTracking = false;\n                _autoExceptionInstrumented = false;\n                _enableUnhandledPromiseRejectionTracking = false;\n                _autoUnhandledPromiseInstrumented = false;\n                _autoTrackPageVisitTime = false;\n\n                // Reset ajax attempts counter\n                _resetAjaxAttempts();\n            \n                // array with max length of 2 that store current url and previous url for SPA page route change trackPageview use.\n                let location = getLocation(true);\n                _prevUri = location && location.href || \"\";\n                if (_self.core && _self.core.config) {\n                    _prevUri = fieldRedaction(_prevUri, _self.core.config);\n                }\n                _currUri = null;\n                _evtNamespace = null;\n                _extConfig = null;\n                _errorHookCnt = 0;\n\n                // Define _self.config\n                objDefine(_self, \"config\", {\n                    g: () => _extConfig\n                });\n            }\n        \n            // For backward compatibility\n            objDefine<any>(_self, \"_pageViewManager\", { g: () => _pageViewManager });\n            objDefine<any>(_self, \"_pageViewPerformanceManager\", { g: () => _pageViewPerformanceManager });\n            objDefine<any>(_self, \"_pageVisitTimeManager\", { g: () => _pageVisitTimeManager });\n            objDefine<any>(_self, \"_evtNamespace\", { g: () => \".\" + _evtNamespace });\n        });\n    }\n\n    /**\n     * Get the current cookie manager for this instance\n     */\n    public getCookieMgr(): ICookieMgr {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n    \n    public processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public trackEvent(event: IEventTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Start timing an extended event. Call `stopTrackEvent` to log the event when it ends.\n     * @param name - A string that identifies this event uniquely within the document.\n     */\n    public startTrackEvent(name: string) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Log an extended event that you started timing with `startTrackEvent`.\n     * @param name - The string you used to identify this event in `startTrackEvent`.\n     * @param properties - map[string, string] - additional data used to filter events and metrics in the portal. Defaults to empty.\n     * @param measurements - map[string, number] - metrics associated with this event, displayed in Metrics Explorer on the portal. Defaults to empty.\n     */\n    public stopTrackEvent(name: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * @description Log a diagnostic message\n     * @param trace - the trace message\n     * @param customProperties - Additional custom properties to include in the event\n     */\n    public trackTrace(trace: ITraceTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * @description Log a numeric value that is not associated with a specific event. Typically\n     * used to send regular reports of performance indicators. To send single measurement, just\n     * use the name and average fields of {@link IMetricTelemetry}. If you take measurements\n     * frequently, you can reduce the telemetry bandwidth by aggregating multiple measurements\n     * and sending the resulting average at intervals\n     * @param metric - input object argument. Only name and average are mandatory.\n     * @param customProperties - additional data used to filter metrics in the\n     * portal. Defaults to empty.\n     */\n    public trackMetric(metric: IMetricTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Logs that a page or other item was viewed.\n     * @param IPageViewTelemetry - The string you used as the name in startTrackPage. Defaults to the document title.\n     * @param customProperties - Additional data used to filter events and metrics. Defaults to empty.\n     * If a user wants to provide duration for pageLoad, it'll have to be in pageView.properties.duration\n     */\n    public trackPageView(pageView?: IPageViewTelemetry, customProperties?: ICustomProperties) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Create a page view telemetry item and send it to the SDK pipeline through the core.track API\n     * @param pageView - Page view item to be sent\n     * @param properties - Custom properties (Part C) that a user can add to the telemetry item\n     * @param systemProperties - System level properties (Part A) that a user can add to the telemetry item\n     */\n    public sendPageViewInternal(pageView: IPageViewTelemetryInternal, properties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * @ignore INTERNAL ONLY\n     * @param pageViewPerformance - The page view performance item to be sent\n     * @param properties - Custom properties (Part C) that a user can add to the telemetry item\n     */\n    public sendPageViewPerformanceInternal(pageViewPerformance: IPageViewPerformanceTelemetryInternal, properties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Send browser performance metrics.\n     * @param pageViewPerformance - The page view performance item to be sent\n     * @param customProperties - Additional data used to filter pages and metrics in the portal. Defaults to empty.\n     */\n    public trackPageViewPerformance(pageViewPerformance: IPageViewPerformanceTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Starts the timer for tracking a page load time. Use this instead of `trackPageView` if you want to control when the page view timer starts and stops,\n     * but don't want to calculate the duration yourself. This method doesn't send any telemetry. Call `stopTrackPage` to log the end of the page view\n     * and send the event.\n     * @param name - A string that idenfities this item, unique within this HTML document. Defaults to the document title.\n     */\n    public startTrackPage(name?: string) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Stops the timer that was started by calling `startTrackPage` and sends the pageview load time telemetry with the specified properties and measurements.\n     * The duration of the page view will be the time between calling `startTrackPage` and `stopTrackPage`.\n     * @param name - The string you used as the name in startTrackPage. Defaults to the document title.\n     * @param url - String - a relative or absolute URL that identifies the page or other item. Defaults to the window location.\n     * @param properties - map[string, string] - additional data used to filter pages and metrics in the portal. Defaults to empty.\n     * @param measurements - map[string, number] - metrics associated with this page, displayed in Metrics Explorer on the portal. Defaults to empty.\n     */\n    public stopTrackPage(name?: string, url?: string, properties?: { [key: string]: string }, measurement?: { [key: string]: number }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n    * @ignore INTERNAL ONLY\n    * @param exception - The exception item to be sent\n    * @param properties - Custom properties (Part C) that a user can add to the telemetry item\n    * @param systemProperties - System level properties (Part A) that a user can add to the telemetry item\n    */\n    public sendExceptionInternal(exception: IExceptionTelemetry, customProperties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Log an exception you have caught.\n     *\n     * @param exception - Object which contains exception to be sent\n     * @param customProperties - Additional data used to filter pages and metrics in the portal. Defaults to empty.\n     *\n     * Any property of type double will be considered a measurement, and will be treated by Application Insights as a metric.\n     */\n    public trackException(exception: IExceptionTelemetry, customProperties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * @description Custom error handler for Application Insights Analytics\n     * @param exception - The exception item to be sent\n     */\n    public _onerror(exception: IAutoExceptionTelemetry): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public addTelemetryInitializer(telemetryInitializer: (item: ITelemetryItem) => boolean | void): ITelemetryInitializerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/src/JavaScriptSDK/Interfaces/IAnalyticsConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IExceptionConfig } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Enum values for configuring trace context strategy for SPA route changes.\n * Controls how trace contexts are managed when navigating between pages in a Single Page Application.\n * @since 3.4.0\n */\nexport const enum eRouteTraceStrategy {\n    /**\n     * Server strategy: Each page view gets a new, independent trace context.\n     * No parent-child relationships are created between page views.\n     * Each page will use the original server-provided trace context (if available) as its parent,\n     * as defined by the {@link IConfiguration.traceHdrMode} configuration for distributed tracing headers.\n     * This is the traditional behavior where each page view is treated as a separate operation.\n     */\n    Server = 0,\n    \n    /**\n     * Page strategy: Page views are chained together with parent-child relationships.\n     * Each new page view inherits the trace context from the previous page view,\n     * creating a connected chain of related operations for better correlation.\n     */\n    Page = 1\n}\n\n/**\n * Configuration interface specifically for AnalyticsPlugin\n * This interface defines only the configuration properties that the Analytics plugin uses.\n */\nexport interface IAnalyticsConfig {\n    /**\n     * A session is logged if the user is inactive for this amount of time in milliseconds.\n     * @default 1800000 (30 minutes)\n     */\n    sessionRenewalMs?: number;\n\n    /**\n     * A session is logged if it has continued for this amount of time in milliseconds.\n     * @default 86400000 (24 hours)\n     */\n    sessionExpirationMs?: number;\n\n    /**\n     * If true, exceptions are not autocollected.\n     * @default false\n     */\n    disableExceptionTracking?: boolean;\n\n    /**\n     * If true, on a pageview, the previous instrumented page's view time is tracked and sent as telemetry and a new timer is started for the current pageview.\n     * @default false\n     */\n    autoTrackPageVisitTime?: boolean;\n\n    /**\n     * If true, default behavior of trackPageView is changed to record end of page view duration interval when trackPageView is called.\n     * @default false\n     */\n    overridePageViewDuration?: boolean;\n\n    /**\n     * Define whether to track unhandled promise rejections and report as JS errors.\n     * @default false\n     */\n    enableUnhandledPromiseRejectionTracking?: boolean;\n\n    /**\n     * Internal flag to track if unhandled promise instrumentation is already set up.\n     * @default false\n     * @internal Internal use only\n     * @ignore INTERNAL ONLY\n     */\n    autoUnhandledPromiseInstrumented?: boolean;\n\n    /**\n     * Percentage of events that will be sent. Value must be between 0 and 100.\n     * @default 100\n     * @example 50 // Only send 50% of events\n     */\n    samplingPercentage?: number;\n\n    /**\n     * If true, the SDK will not store or read any data from local and session storage.\n     * @default false\n     */\n    isStorageUseDisabled?: boolean;\n\n    /**\n     * If true, the SDK will track all Browser Link requests.\n     * @default false\n     */\n    isBrowserLinkTrackingEnabled?: boolean;\n\n    /**\n     * Automatically track route changes in Single Page Applications (SPA). If true, each route change will send a new Pageview to Application Insights.\n     * @default false\n     */\n    enableAutoRouteTracking?: boolean;\n\n    /**\n     * An optional value that will be used as name postfix for localStorage and session cookie name.\n     * @default \"\"\n     * @example \"MyApp\" // Results in localStorage keys like \"ai_session_MyApp\"\n     */\n    namePrefix?: string;\n\n    /**\n     * If true, debugging data is thrown as an exception by the logger.\n     * @default false\n     */\n    enableDebug?: boolean;\n\n    /**\n     * If true, flush method will not be called when onBeforeUnload event triggers.\n     * @default false\n     */\n    disableFlushOnBeforeUnload?: boolean;\n\n    /**\n     * If true, flush method will not be called when onPageHide or onVisibilityChange (hidden state) event(s) trigger.\n     * @default false\n     */\n    disableFlushOnUnload?: boolean;\n\n    /**\n     * Internal flag to track if exception instrumentation is already set up.\n     * @default false\n     * @internal Internal use only\n     * @ignore INTERNAL ONLY\n     */\n    autoExceptionInstrumented?: boolean;\n\n    /**\n     * Exception configuration for additional exception handling options.\n     * @default { inclScripts: false, expLog: undefined, maxLogs: 50 }\n     */\n    expCfg?: IExceptionConfig;\n\n    /**\n     * Controls the trace context strategy for SPA route changes.\n     * Determines how trace contexts are managed and correlated across virtual page views\n     * in Single Page Applications, affecting telemetry correlation and operation tracking.\n     * @default eRouteTraceStrategy.Server\n     * @since 3.4.0\n     */\n    routeTraceStrategy?: eRouteTraceStrategy;\n}\n\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/src/JavaScriptSDK/Telemetry/PageViewManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IAppInsightsCore, IDiagnosticLogger, IPageViewPerformanceTelemetryInternal, IPageViewTelemetry, IPageViewTelemetryInternal,\n    IProcessTelemetryUnloadContext, ITelemetryUnloadState, _eInternalMessageId, _throwInternal, arrForEach, dateTimeUtilsDuration, dumpObj,\n    eLoggingSeverity, fieldRedaction, getDocument, getExceptionName, getLocation, isNullOrUndefined\n} from \"@microsoft/applicationinsights-core-js\";\nimport { ITimerHandler, getPerformance, isUndefined, isWebWorker, scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { IPageViewPerformanceManager } from \"./PageViewPerformanceManager\";\n\n/**\n * Internal interface to pass appInsights object to subcomponents without coupling\n */\nexport interface IAppInsightsInternal {\n    sendPageViewInternal(pageViewItem: IPageViewTelemetryInternal, properties?: Object, systemProperties?: Object): void;\n    sendPageViewPerformanceInternal(pageViewPerformance: IPageViewPerformanceTelemetryInternal, properties?: Object, systemProperties?: Object): void;\n}\n\n/**\n * Internal interface for PageViewManager.\n * @internal\n */\nexport interface IPageViewManager {\n    /**\n     * Currently supported cases:\n     * 1) (default case) track page view called with default parameters, overridePageViewDuration = false. Page view is sent with page view performance when navigation timing data is available.\n     *    a. If navigation timing is not supported then page view is sent right away with undefined duration. Page view performance is not sent.\n     * 2) overridePageViewDuration = true, custom duration provided. Custom duration is used, page view sends right away.\n     * 3) overridePageViewDuration = true, custom duration NOT provided. Page view is sent right away, duration is time spent from page load till now (or undefined if navigation timing is not supported).\n     * 4) overridePageViewDuration = false, custom duration is provided. Page view is sent right away with custom duration.\n     *\n     * In all cases page view performance is sent once (only for the 1st call of trackPageView), or not sent if navigation timing is not supported.\n     */\n    trackPageView(pageView: IPageViewTelemetry, customProperties?: { [key: string]: any }): void;\n\n    teardown(unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState): void;\n}\n\n/**\n * Factory function to create a PageViewManager instance.\n * @param appInsights - Internal interface to send telemetry\n * @param overridePageViewDuration - Whether to override page view duration\n * @param core - App Insights core instance\n * @param pageViewPerformanceManager - Page view performance manager instance\n * @returns A new IPageViewManager instance.\n * @internal\n */\nexport function createPageViewManager(\n    appInsights: IAppInsightsInternal,\n    overridePageViewDuration: boolean,\n    core: IAppInsightsCore,\n    pageViewPerformanceManager: IPageViewPerformanceManager): IPageViewManager {\n\n    let queueTimer: ITimerHandler = null;\n    let itemQueue: Array<() => boolean> = [];\n    let pageViewPerformanceSent: boolean = false;\n    let firstPageViewSent: boolean = false;\n    let _logger: IDiagnosticLogger;\n            \n    if (core) {\n        _logger = core.logger;\n    }\n\n    function _flushChannels(isAsync: boolean) {\n        if (core) {\n            core.flush(isAsync, () => {\n                // Event flushed, callback added to prevent promise creation\n            });\n        }\n    }\n\n    function _startTimer() {\n        if (!queueTimer) {\n            queueTimer = scheduleTimeout((() => {\n                queueTimer = null;\n                let allItems = itemQueue.slice(0);\n                let doFlush = false;\n                itemQueue = [];\n                arrForEach(allItems, (item) => {\n                    if (!item()) {\n                        // Not processed so rescheduled\n                        itemQueue.push(item);\n                    } else {\n                        doFlush = true;\n                    }\n                });\n\n                if (itemQueue.length > 0) {\n                    _startTimer();\n                }\n\n                if (doFlush) {\n                    // We process at least one item so flush the queue\n                    _flushChannels(true);\n                }\n            }), 100);\n        }\n    }\n\n    function _addQueue(cb:() => boolean) {\n        itemQueue.push(cb);\n\n        _startTimer();\n    }\n\n    return {\n        trackPageView: (pageView: IPageViewTelemetry, customProperties?: { [key: string]: any })  => {\n            let name = pageView.name;\n            if (isNullOrUndefined(name) || typeof name !== \"string\") {\n                let doc = getDocument();\n                name = pageView.name = doc && doc.title || \"\";\n            }\n    \n            let uri = pageView.uri;\n            if (isNullOrUndefined(uri) || typeof uri !== \"string\") {\n                let location = getLocation();\n                uri = pageView.uri = location && location.href || \"\";\n            }\n            if (core && core.config){\n                uri = pageView.uri = fieldRedaction(pageView.uri, core.config);\n            }\n            if (!firstPageViewSent){\n                let perf = getPerformance();\n                // Access the performance timing object\n                const navigationEntries = (perf && perf.getEntriesByType && perf.getEntriesByType(\"navigation\"));\n\n                // Edge Case the navigation Entries may return an empty array and the timeOrigin is not supported on IE\n                if (navigationEntries && navigationEntries[0] && !isUndefined(perf.timeOrigin)) {\n                    // Get the value of loadEventStart\n                    const loadEventStart = (navigationEntries[0] as PerformanceNavigationTiming).loadEventStart;\n                    pageView.startTime =  new Date(perf.timeOrigin + loadEventStart);\n                } else {\n                    // calculate the start time manually\n                    let duration = ((customProperties || pageView.properties || {}).duration || 0);\n                    pageView.startTime = new Date(new Date().getTime() - duration);\n                }\n                firstPageViewSent = true;\n            }\n    \n            // case 1a. if performance timing is not supported by the browser, send the page view telemetry with the duration provided by the user. If the user\n            // do not provide the duration, set duration to undefined\n            // Also this is case 4\n            if (!pageViewPerformanceManager.isPerformanceTimingSupported()) {\n                appInsights.sendPageViewInternal(\n                    pageView,\n                    customProperties\n                );\n                _flushChannels(true);\n    \n                if (!isWebWorker()) {\n                    // no navigation timing (IE 8, iOS Safari 8.4, Opera Mini 8 - see http://caniuse.com/#feat=nav-timing)\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.NavigationTimingNotSupported,\n                        \"trackPageView: navigation timing API used for calculation of page duration is not supported in this browser. This page view will be collected without duration and timing info.\");\n                }\n    \n                return;\n            }\n    \n            let pageViewSent = false;\n            let customDuration: number;\n    \n            // if the performance timing is supported by the browser, calculate the custom duration\n            const start = pageViewPerformanceManager.getPerformanceTiming().navigationStart;\n            if (start > 0) {\n                customDuration = dateTimeUtilsDuration(start, +new Date);\n                if (!pageViewPerformanceManager.shouldCollectDuration(customDuration)) {\n                    customDuration = undefined;\n                }\n            }\n    \n            // if the user has provided duration, send a page view telemetry with the provided duration. Otherwise, if\n            // overridePageViewDuration is set to true, send a page view telemetry with the custom duration calculated earlier\n            let duration;\n            if (!isNullOrUndefined(customProperties) &&\n                !isNullOrUndefined(customProperties.duration)) {\n                duration = customProperties.duration;\n            }\n            if (overridePageViewDuration || !isNaN(duration)) {\n                if (isNaN(duration)) {\n                    // case 3\n                    if (!customProperties) {\n                        customProperties = {};\n                    }\n    \n                    customProperties.duration = customDuration;\n                }\n                // case 2\n                appInsights.sendPageViewInternal(\n                    pageView,\n                    customProperties\n                );\n                _flushChannels(true);\n                pageViewSent = true;\n            }\n    \n            // now try to send the page view performance telemetry\n            const maxDurationLimit = 60000;\n            if (!customProperties) {\n                customProperties = {};\n            }\n    \n            // Queue the event for processing\n            _addQueue(() => {\n                let processed = false;\n                try {\n                    if (pageViewPerformanceManager.isPerformanceTimingDataReady()) {\n                        processed = true;\n                        const pageViewPerformance: IPageViewPerformanceTelemetryInternal = {\n                            name,\n                            uri\n                        };\n                        pageViewPerformanceManager.populatePageViewPerformanceEvent(pageViewPerformance);\n    \n                        if (!pageViewPerformance.isValid && !pageViewSent) {\n                            // If navigation timing gives invalid numbers, then go back to \"override page view duration\" mode.\n                            // That's the best value we can get that makes sense.\n                            customProperties.duration = customDuration;\n                            appInsights.sendPageViewInternal(\n                                pageView,\n                                customProperties);\n                        } else {\n                            if (!pageViewSent) {\n                                customProperties.duration = pageViewPerformance.durationMs;\n                                appInsights.sendPageViewInternal(\n                                    pageView,\n                                    customProperties);\n                            }\n    \n                            if (!pageViewPerformanceSent) {\n                                appInsights.sendPageViewPerformanceInternal(pageViewPerformance, customProperties);\n                                pageViewPerformanceSent = true;\n                            }\n                        }\n                    } else if (start > 0 && dateTimeUtilsDuration(start, +new Date) > maxDurationLimit) {\n                        // if performance timings are not ready but we exceeded the maximum duration limit, just log a page view telemetry\n                        // with the maximum duration limit. Otherwise, keep waiting until performance timings are ready\n                        processed = true;\n                        if (!pageViewSent) {\n                            customProperties.duration = maxDurationLimit;\n                            appInsights.sendPageViewInternal(\n                                pageView,\n                                customProperties\n                            );\n                        }\n                    }\n                } catch (e) {\n                    _throwInternal(_logger,\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.TrackPVFailedCalc,\n                        \"trackPageView failed on page load calculation: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n    \n                return processed;\n            });\n        },\n\n        teardown: (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n            if (queueTimer) {\n                queueTimer.cancel();\n                queueTimer = null;\n\n                let allItems = itemQueue.slice(0);\n                itemQueue = [];\n                arrForEach(allItems, (item) => {\n                    if (item()) {\n                        // Item processed successfully\n                    }\n                });\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/src/JavaScriptSDK/Telemetry/PageViewPerformanceManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IAppInsightsCore, IDiagnosticLogger, IPageViewPerformanceTelemetryInternal, _eInternalMessageId, _throwInternal, dateTimeUtilsDuration,\n    eLoggingSeverity, getNavigator, getPerformance, msToTimeSpan, safeGetLogger\n} from \"@microsoft/applicationinsights-core-js\";\nimport { mathFloor, strIndexOf } from \"@nevware21/ts-utils\";\n\nconst MAX_DURATION_ALLOWED = 3600000; // 1h\nconst botAgentNames = [\"googlebot\", \"adsbot-google\", \"apis-google\", \"mediapartners-google\"];\n\nfunction _isPerformanceTimingSupported() {\n    let perf = getPerformance();\n    return perf && !!perf.timing;\n}\n\nfunction _isPerformanceNavigationTimingSupported() {\n    let perf = getPerformance();\n    return perf && perf.getEntriesByType && perf.getEntriesByType(\"navigation\").length > 0;\n}\n\nfunction _isPerformanceTimingDataReady() {\n    let perf = getPerformance();\n    const timing = perf ? perf.timing : 0;\n\n    return timing\n        && timing.domainLookupStart > 0\n        && timing.navigationStart > 0\n        && timing.responseStart > 0\n        && timing.requestStart > 0\n        && timing.loadEventEnd > 0\n        && timing.responseEnd > 0\n        && timing.connectEnd > 0\n        && timing.domLoading > 0;\n}\n\nfunction _getPerformanceTiming(): PerformanceTiming | null {\n    if (_isPerformanceTimingSupported()) {\n        return getPerformance().timing;\n    }\n\n    return null;\n}\n\nfunction _getPerformanceNavigationTiming(): PerformanceNavigationTiming | null {\n    if (_isPerformanceNavigationTimingSupported()) {\n        return getPerformance().getEntriesByType(\"navigation\")[0] as PerformanceNavigationTiming;\n    }\n\n    return null;\n}\n\n/**\n* This method tells if given durations should be excluded from collection.\n*/\nfunction _shouldCollectDuration(...durations: number[]): boolean {\n    var _navigator = getNavigator() || {} as any;\n    // a full list of Google crawlers user agent strings - https://support.google.com/webmasters/answer/1061943?hl=en\n    const userAgent = _navigator.userAgent;\n    let isGoogleBot = false;\n\n    if (userAgent) {\n        for (let i = 0; i < botAgentNames.length; i++) {\n            isGoogleBot = isGoogleBot || strIndexOf(userAgent.toLowerCase(), botAgentNames[i]) !== -1;\n        }\n    }\n\n    if (isGoogleBot) {\n        // Don't report durations for GoogleBot, it is returning invalid values in performance.timing API.\n        return false;\n    } else {\n        // for other page views, don't report if it's outside of a reasonable range\n        for (let i = 0; i < durations.length; i++) {\n            if (durations[i] < 0 || durations[i] >= MAX_DURATION_ALLOWED) {\n                return false;\n            }\n        }\n    }\n\n    return true;\n}\n\n/**\n * Internal interface for PageViewPerformanceManager.\n * @internal\n */\nexport interface IPageViewPerformanceManager {\n\n    populatePageViewPerformanceEvent(pageViewPerformance: IPageViewPerformanceTelemetryInternal): void;\n\n    getPerformanceTiming(): PerformanceTiming | null;\n\n    /**\n    * Returns true is window performance timing API is supported, false otherwise.\n    */\n    isPerformanceTimingSupported(): boolean;\n\n    /**\n    * As page loads different parts of performance timing numbers get set. When all of them are set we can report it.\n    * Returns true if ready, false otherwise.\n    */\n    isPerformanceTimingDataReady(): boolean;\n\n    /**\n    * This method tells if given durations should be excluded from collection.\n    */\n    shouldCollectDuration(...durations: number[]): boolean;\n}\n\n/**\n * Factory function to create a PageViewPerformanceManager instance.\n * @param core - App Insights core instance\n * @returns A new IPageViewPerformanceManager instance.\n * @internal\n */\nexport function createPageViewPerformanceManager(core: IAppInsightsCore): IPageViewPerformanceManager {\n    let _logger: IDiagnosticLogger = safeGetLogger(core);\n\n    return {\n        populatePageViewPerformanceEvent: (pageViewPerformance: IPageViewPerformanceTelemetryInternal): void => {\n            pageViewPerformance.isValid = false;\n    \n            /*\n             * http://www.w3.org/TR/navigation-timing/#processing-model\n             *  |-navigationStart\n             *  |             |-connectEnd\n             *  |             ||-requestStart\n             *  |             ||             |-responseStart\n             *  |             ||             |              |-responseEnd\n             *  |             ||             |              |\n             *  |             ||             |              |         |-loadEventEnd\n             *  |---network---||---request---|---response---|---dom---|\n             *  |--------------------------total----------------------|\n             *\n             *  total = The difference between the load event of the current document is completed and the first recorded timestamp of the performance entry : https://developer.mozilla.org/en-US/docs/Web/Performance/Navigation_and_resource_timings#duration\n             *  network = Redirect time + App Cache + DNS lookup time + TCP connection time\n             *  request = Request time : https://developer.mozilla.org/en-US/docs/Web/Performance/Navigation_and_resource_timings#request_time\n             *  response = Response time\n             *  dom = Document load time : https://html.spec.whatwg.org/multipage/dom.html#document-load-timing-info\n             *      = Document processing time : https://developers.google.com/web/fundamentals/performance/navigation-and-resource-timing/#document_processing\n             *      + Loading time : https://developers.google.com/web/fundamentals/performance/navigation-and-resource-timing/#loading\n             */\n            const navigationTiming = _getPerformanceNavigationTiming();\n            const timing = _getPerformanceTiming();\n            let total = 0;\n            let network = 0;\n            let request = 0;\n            let response = 0;\n            let dom = 0;\n    \n            if (navigationTiming || timing) {\n                if (navigationTiming) {\n                    total = navigationTiming.duration;\n                    /**\n                     * support both cases:\n                     * - startTime is always zero: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming\n                     * - for older browsers where the startTime is not zero\n                     */\n                    network = navigationTiming.startTime === 0 ? navigationTiming.connectEnd : dateTimeUtilsDuration(navigationTiming.startTime, navigationTiming.connectEnd);\n                    request = dateTimeUtilsDuration(navigationTiming.requestStart, navigationTiming.responseStart);\n                    response = dateTimeUtilsDuration(navigationTiming.responseStart, navigationTiming.responseEnd);\n                    dom = dateTimeUtilsDuration(navigationTiming.responseEnd, navigationTiming.loadEventEnd);\n                } else {\n                    total = dateTimeUtilsDuration(timing.navigationStart, timing.loadEventEnd);\n                    network = dateTimeUtilsDuration(timing.navigationStart, timing.connectEnd);\n                    request = dateTimeUtilsDuration(timing.requestStart, timing.responseStart);\n                    response = dateTimeUtilsDuration(timing.responseStart, timing.responseEnd);\n                    dom = dateTimeUtilsDuration(timing.responseEnd, timing.loadEventEnd);\n                }\n    \n                if (total === 0) {\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.ErrorPVCalc,\n                        \"error calculating page view performance.\",\n                        { total, network, request, response, dom });\n    \n                } else if (!_shouldCollectDuration(total, network, request, response, dom)) {\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.InvalidDurationValue,\n                        \"Invalid page load duration value. Browser perf data won't be sent.\",\n                        { total, network, request, response, dom });\n    \n                } else if (total < mathFloor(network) + mathFloor(request) + mathFloor(response) + mathFloor(dom)) {\n                    // some browsers may report individual components incorrectly so that the sum of the parts will be bigger than total PLT\n                    // in this case, don't report client performance from this page\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.ClientPerformanceMathError,\n                        \"client performance math error.\",\n                        { total, network, request, response, dom });\n    \n                } else {\n                    pageViewPerformance.durationMs = total;\n                    // // convert to timespans\n                    pageViewPerformance.perfTotal = pageViewPerformance.duration = msToTimeSpan(total);\n                    pageViewPerformance.networkConnect = msToTimeSpan(network);\n                    pageViewPerformance.sentRequest = msToTimeSpan(request);\n                    pageViewPerformance.receivedResponse = msToTimeSpan(response);\n                    pageViewPerformance.domProcessing = msToTimeSpan(dom);\n                    pageViewPerformance.isValid = true;\n                }\n            }\n        },\n\n        getPerformanceTiming: _getPerformanceTiming,\n\n        isPerformanceTimingSupported: _isPerformanceTimingSupported,\n\n        isPerformanceTimingDataReady: _isPerformanceTimingDataReady,\n\n        shouldCollectDuration: _shouldCollectDuration\n    };\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/src/JavaScriptSDK/Telemetry/PageVisitTimeManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IDiagnosticLogger, _warnToConsole, dateNow, dumpObj, getJSON, hasJSON, throwError, utlCanUseSessionStorage, utlGetSessionStorage,\n    utlRemoveSessionStorage, utlSetSessionStorage\n} from \"@microsoft/applicationinsights-core-js\";\n\nexport interface IPageVisitData {\n    pageName: string;\n    pageUrl: string;\n    pageVisitStartTime: number;\n    pageVisitTime: number;\n}\n\n/**\n * Factory function to create a page visit data object\n * @param pageName - Name of the page\n * @param pageUrl - URL of the page\n * @returns IPageVisitData instance\n */\nexport function createPageVisitData(pageName: string, pageUrl: string): IPageVisitData {\n    return {\n        pageVisitStartTime: dateNow(),\n        pageName: pageName,\n        pageUrl: pageUrl,\n        pageVisitTime: 0\n    };\n}\n\n/**\n * Internal interface for PageVisitTimeManager.\n * @internal\n */\nexport interface IPageVisitTimeManager {\n    /**\n    * Tracks the previous page visit time telemetry (if exists) and starts timing of new page visit time\n    * @param currentPageName - Name of page to begin timing for visit duration\n    * @param currentPageUrl - Url of page to begin timing for visit duration\n    */\n    trackPreviousPageVisit(currentPageName: string, currentPageUrl: string): void;\n\n    // These properties are exposed for backward compatibility with tests\n    readonly _logger?: IDiagnosticLogger;\n    readonly pageVisitTimeTrackingHandler?: (pageName: string, pageUrl: string, pageVisitTime: number) => void;\n}\n\n/**\n * Factory function to create a PageVisitTimeManager instance.\n * @param logger - Diagnostic logger\n * @param pageVisitTimeTrackingHandler - Delegate that will be called to send telemetry data to AI (when trackPreviousPageVisit is called)\n * @returns A new IPageVisitTimeManager instance.\n * @internal\n */\nexport function createPageVisitTimeManager(logger: IDiagnosticLogger, pageVisitTimeTrackingHandler: (pageName: string, pageUrl: string, pageVisitTime: number) => void): IPageVisitTimeManager {\n    let prevPageVisitDataKeyName: string = \"prevPageVisitData\";\n\n    /**\n     * Stops timing of current page (if exists) and starts timing for duration of visit to pageName\n     * @param pageName - Name of page to begin timing visit duration\n     * @returns {IPageVisitData} Page visit data (including duration) of pageName from last call to start or restart, if exists. Null if not.\n     */\n    function restartPageVisitTimer(pageName: string, pageUrl: string) {\n        let prevPageVisitData: IPageVisitData = null;\n        try {\n            prevPageVisitData = stopPageVisitTimer();\n            if (utlCanUseSessionStorage()) {\n                if (utlGetSessionStorage(logger, prevPageVisitDataKeyName) != null) {\n                    throwError(\"Cannot call startPageVisit consecutively without first calling stopPageVisit\");\n                }\n\n                const currPageVisitDataStr = getJSON().stringify(createPageVisitData(pageName, pageUrl));\n                utlSetSessionStorage(logger, prevPageVisitDataKeyName, currPageVisitDataStr);\n            }\n    \n        } catch (e) {\n            _warnToConsole(logger, \"Call to restart failed: \" + dumpObj(e));\n            prevPageVisitData = null;\n        }\n\n        return prevPageVisitData;\n    }\n\n    /**\n     * Stops timing of current page, if exists.\n     * @returns {IPageVisitData} Page visit data (including duration) of pageName from call to start, if exists. Null if not.\n     */\n    function stopPageVisitTimer() {\n        let prevPageVisitData: IPageVisitData = null;\n        try {\n            if (utlCanUseSessionStorage()) {\n\n                // Define end time of page's visit\n                const pageVisitEndTime = dateNow();\n\n                // Try to retrieve  page name and start time from session storage\n                const pageVisitDataJsonStr = utlGetSessionStorage(logger, prevPageVisitDataKeyName);\n                if (pageVisitDataJsonStr && hasJSON()) {\n\n                    // if previous page data exists, set end time of visit\n                    prevPageVisitData = getJSON().parse(pageVisitDataJsonStr);\n                    prevPageVisitData.pageVisitTime = pageVisitEndTime - prevPageVisitData.pageVisitStartTime;\n\n                    // Remove data from storage since we already used it\n                    utlRemoveSessionStorage(logger, prevPageVisitDataKeyName);\n                }\n            }\n        } catch (e) {\n            _warnToConsole(logger, \"Stop page visit timer failed: \" + dumpObj(e));\n            prevPageVisitData = null;\n        }\n\n        return prevPageVisitData;\n    }\n\n    return {\n        trackPreviousPageVisit: (currentPageName: string, currentPageUrl: string) => {\n            try {\n                // Restart timer for new page view\n                const prevPageVisitTimeData = restartPageVisitTimer(currentPageName, currentPageUrl);\n    \n                // If there was a page already being timed, track the visit time for it now.\n                if (prevPageVisitTimeData) {\n                    pageVisitTimeTrackingHandler(prevPageVisitTimeData.pageName, prevPageVisitTimeData.pageUrl, prevPageVisitTimeData.pageVisitTime);\n                }\n            } catch (e) {\n                _warnToConsole(logger, \"Auto track page visit time failed, metric will not be collected: \" + dumpObj(e));\n            }\n        },\n\n        // Expose for backward compatibility with tests\n        _logger: logger,\n        pageVisitTimeTrackingHandler: pageVisitTimeTrackingHandler\n    };\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/src/JavaScriptSDK/Timing.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IDiagnosticLogger, _eInternalMessageId, _throwInternal, dateTimeUtilsDuration, eLoggingSeverity\n} from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * Internal interface for Timing.\n * @internal\n */\nexport interface ITiming {\n    action: (name?: string, url?: string, duration?: number, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) => void;\n    start: (name: string) => void;\n    stop: (name: string, url: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) => void;\n}\n\n/**\n * Factory function to create a Timing instance.\n * @param logger - Diagnostic logger\n * @param name - Name identifier for timing operations\n * @returns A new ITiming instance.\n * @internal\n */\nexport function createTiming(logger: IDiagnosticLogger, name: string): ITiming {\n    let _events: { [key: string]: number; } = {}\n\n    const timing: ITiming = {\n        action: null, // Will be set by the caller\n        start: (name: string) => {\n            if (typeof _events[name] !== \"undefined\") {\n                _throwInternal(logger,\n                    eLoggingSeverity.WARNING, _eInternalMessageId.StartCalledMoreThanOnce, \"start was called more than once for this event without calling stop.\",\n                    { name, key: name }, true);\n            }\n    \n            _events[name] = +new Date;\n        },\n        stop: (name: string, url: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }) => {\n            const start = _events[name];\n            if (isNaN(start)) {\n                _throwInternal(logger,\n                    eLoggingSeverity.WARNING, _eInternalMessageId.StopCalledWithoutStart, \"stop was called without a corresponding start.\",\n                    { name, key: name }, true);\n            } else {\n                const end = +new Date;\n                const duration = dateTimeUtilsDuration(start, end);\n                timing.action(name, url, duration, properties, measurements);\n            }\n    \n            delete _events[name];\n            _events[name] = undefined;\n        }\n    };\n\n    return timing;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/src/applicationinsights-analytics-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport { AnalyticsPlugin, AnalyticsPlugin as ApplicationInsights } from \"./JavaScriptSDK/AnalyticsPlugin\";\nexport { IAppInsightsInternal } from \"./JavaScriptSDK/Telemetry/PageViewManager\";\nexport { IAnalyticsConfig } from \"./JavaScriptSDK/Interfaces/IAnalyticsConfig\";\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-analytics-js/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ]\n}\n"
  },
  {
    "path": "extensions/applicationinsights-analytics-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-analytics-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-analytics-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-analytics-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-analytics-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-angularplugin-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Angular Plugin (&lt; 2.5.10)\n\n*******************\n\n:exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation:\n\n# The current development repo location of the [Angular Plugin Repo has moved here](https://github.com/microsoft/applicationinsights-angularplugin-js) - (for v2.5.11 or greater) \n\n## Please refer to the new repo for usage instructions, and open issues there.\n\n### This repo folder is no longer compiled and tested as part of the PR and merge validation, thus it WILL go stale\n\n:exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation:\n\n*******************\n\n### Where is the source code for the previous version\n\nFor historical purposes the previous code for the angular plugin has been archived in the [angularplugin-legacy branch to review all previous code and documentation](https://github.com/microsoft/ApplicationInsights-JS/tree/angularplugin-legacy/extensions/applicationinsights-angularplugin-js) branch.\n\nNo further changes are scheduled or expected, any and all changes will occur in the [new repo](https://github.com/microsoft/applicationinsights-angularplugin-js) only.\n\n### Links\n\n- [v2.5.10 Readme](https://github.com/microsoft/ApplicationInsights-JS/blob/angularplugin-legacy/extensions/applicationinsights-angularplugin-js/README.md)\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-angularplugin-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/README.md",
    "content": "\n# Microsoft Application Insights JavaScript SDK - CfgSync Plugin\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status/AppInsights%20-%20DevTools/1DS%20JavaScript%20SDK%20web%20SKU%20vNext?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-cfgsync-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-cfgsync-js)\n\nApplication Insights CfgSync Plugin enables configuration change communication among mutiple instances.\nRefer to [our GitHub page](https://github.com/microsoft/ApplicationInsights-JS) for more details on getting started.\n\n## [Configuration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html)\n\n| Name | Type | Default | Description |\n|------|------|---------|-------------|\n| [syncMode](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#syncMode) | ICfgSyncMode<br>[Optional]| Broadcast | Sync mode of current instance. If set to `None`, current instance will NOT receive or broadcast config changes. If set to `Broadcast`, current instance will ONLY broadcast changes. If set to `Receive`, instance will ONLY receive config changes but NOT broadcast config changes. |\n| [customEvtName](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#customEvtName) | string<br>[Optional] | ai_cfgsync | Event name for sending or listening to configuration change details. |\n| [cfgUrl](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#cfgUrl) | string<br>[Optional] | null | CDN endpoint for fetching configuration. If cfgUrl is defined, instance will NOT listen to core configuration changes. Details defined in the CDN endpoint should follow `ICfgSyncCdnConfig` interface. |\n| [blkCdnCfg](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#blkCdnCfg) | boolean<br>[Optional] | false | Determines if fetching the CDN endpoint should be blocked or not. |\n| [onCfgChangeReceive](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#onCfgChangeReceive) | function<br>[Optional] | null | Overrides callback function to handle event details when changes are received via event listener. |\n| [overrideSyncFn](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#overrideSyncFn) | function<br>[Optional] | null | Overrides sync() function to broadcast changes. |\n| [overrideFetchFn](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#overrideFetchFn) | function<br>[Optional] | null | Overrides fetch function to get config from cfgUrl when cfgUrl is defined. |\n| [nonOverrideConfigs](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#nonOverrideConfigs) | NonOverrideCfg<br>[Optional] | {instrumentationKey: true, connectionString: true, endpointUrl: true } | When current instance is set with syncMode: `Receive`, config fields under nonOverrideConfigs will NOT be changed by any confif details sent out from other instances. NOTE: this config will be ONLY applied during initialization, so it won't be changed dynamically. |\n| [scheduleFetchTimeout](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-cfgsync-js/interfaces/ICfgSyncConfig.html#scheduleFetchTimeout) | number<br>[Optional] | 30 mins | Identifies the time interval (in milliseconds) for fetching config details from cfgUrl when cfgUrl is defined. If set to 0, the fetch operation will only be called once during initialization. |\n\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\n<https://cla.microsoft.com>.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at <https://go.microsoft.com/fwlink/?LinkID=824704>. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsync.tests.ts",
    "content": "import { CfgSyncHelperTests } from \"./cfgsynchelper.tests\";\nimport {CfgSyncPluginTests}  from \"./cfgsyncplugin.tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new CfgSyncPluginTests().registerTests();\n    new CfgSyncHelperTests().registerTests();\n}\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsynchelper.tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { NonOverrideCfg } from \"../../../src/Interfaces/ICfgSyncConfig\";\nimport { ICookieMgrConfig, AppInsightsCore, CdnFeatureMode, FeatureOptInMode, IAppInsightsCore, IConfiguration, IFeatureOptIn, IFeatureOptInDetails, INotificationManager, IPlugin, ITelemetryItem, PerfManager, suppressTracing } from \"@microsoft/applicationinsights-core-js\";\nimport { IConfig, IStorageBuffer } from \"@microsoft/applicationinsights-core-js\";\nimport { resolveCdnFeatureCfg, replaceByNonOverrideCfg, applyCdnfeatureCfg } from \"../../../src/CfgSyncHelperFuncs\";\nimport { ICfgSyncCdnConfig } from \"../../../src/Interfaces/ICfgSyncCdnConfig\";\n\nexport class CfgSyncHelperTests extends AITestClass {\n\n \n\n    constructor(emulateIe?: boolean) {\n        super(\"CfgSyncHelperTests\", emulateIe);\n    }\n\n    public testInitialize() {\n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"CfgSyncPluginHelper: replaceByNonOverrideCfg should work with flat-level config\",\n            useFakeTimers: true,\n            test: () => {\n                let testFunc = (core: IAppInsightsCore, notificationManager: INotificationManager) => {\n                    return new PerfManager(notificationManager);\n                }\n                let config = {\n                    instrumentationKey: \"Test-iKey\",\n                    maxMessageLimit: 100,\n                    loggingLevelConsole: 0,\n                    endpointUrl: \"testurl\",\n                    loggingLevelTelemetry: 0,\n                    disableInstrumentationKeyValidation: true,\n                    enablePerfMgr: false,\n                    createPerfMgr: testFunc,\n                    perfEvtsSendAll: true,\n                    idLength: 100,\n                    cookieDomain: \"test\",\n                    cookiePath: \"test\",\n                    disableCookiesUsage: true,\n                    disablePageUnloadEvents: [\"eve1\", \"eve2\"]\n                } as IConfig & IConfiguration;\n\n                let newConfig = {\n                    instrumentationKey: \"Test-iKey123\",\n                    maxMessageLimit: 1000,\n                    loggingLevelConsole: 1,\n                    endpointUrl: \"testurl123\",\n                    loggingLevelTelemetry: 1,\n                    disableInstrumentationKeyValidation: false,\n                    enablePerfMgr: true,\n                    perfEvtsSendAll: false,\n                    idLength: 10,\n                    cookieDomain: \"test123\",\n                    cookiePath: \"test123\",\n                    disableCookiesUsage: true,\n                    disablePageUnloadEvents: [\"eve123\", \"eve223\"]\n                } as IConfig & IConfiguration;\n                \n                let nonoverrideCfg = {\n                    instrumentationKey: true,\n                    maxMessageLimit: true,\n                    loggingLevelConsole: true,\n                    endpointUrl: undefined,\n                    loggingLevelTelemetry: false,\n                    disableInstrumentationKeyValidation: true,\n                    enablePerfMgr: true,\n                    createPerfMgr: true,\n                    perfEvtsSendAll: true,\n                    idLength: true,\n                    cookieDomain: true,\n                    cookiePath: false,\n                    disableCookiesUsage: true,\n                    disablePageUnloadEvents: true\n                } as NonOverrideCfg;\n\n                let  expectedNewCfg = {\n                    endpointUrl:\"testurl123\",\n                    loggingLevelTelemetry: 1,\n                    cookiePath:\"test123\"\n                }\n\n                let expectedCoreCfg = {\n                    instrumentationKey:\"Test-iKey\",\n                    maxMessageLimit: 100,\n                    loggingLevelConsole:0,\n                    endpointUrl:\"testurl123\",\n                    loggingLevelTelemetry: 1,\n                    disableInstrumentationKeyValidation: true,\n                    enablePerfMgr: false,\n                    perfEvtsSendAll: true,\n                    idLength: 100,\n                    cookieDomain: \"test\",\n                    cookiePath: \"test123\",\n                    disableCookiesUsage: true,\n                    disablePageUnloadEvents:[\"eve1\",\"eve2\"],\n                    cookieCfg:{},\n                    extensions:[{isFlushInvoked:false,isTearDownInvoked:false,isResumeInvoked:false,isPauseInvoked:false,identifier:\"Sender\",priority:1001}],\n                    channels:[],\n                    extensionConfig:{},\n                    //_sdk: {\n                    //    stats: {\n                    //        endCfg: []\n                    //    }\n                    //},\n                    traceHdrMode: 3,\n                    traceCfg: {\n                        generalLimits: {\n                            attributeCountLimit: 128\n                        },\n                        // spanLimits: {\n                        //     attributeCountLimit: 128,\n                        //     linkCountLimit: 128,\n                        //     eventCountLimit: 128,\n                        //     attributePerEventCountLimit: 128,\n                        //     attributePerLinkCountLimit: 128\n                        // },\n                        serviceName: null,\n                        suppressTracing: false\n                    },\n                    errorHandlers: {},\n                    enableDebug: false\n                };\n\n                let core = new AppInsightsCore();\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let channel = new ChannelPlugin();\n                core.initialize(config, [channel]);\n                let coreCfg = core.config;\n                let newCfg = replaceByNonOverrideCfg(newConfig, nonoverrideCfg, 0, 4);\n                Assert.deepEqual(JSON.stringify(newCfg), JSON.stringify(expectedNewCfg), \"only expected configs are changed under new config\");\n\n                core.updateCfg(newCfg);\n                this.clock.tick(1);\n                coreCfg = core.config;\n                Assert.deepEqual(JSON.stringify(coreCfg), JSON.stringify(expectedCoreCfg), \"core config should be updated as expected\");\n            }\n\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: replaceByNonOverrideCfg should work with 2 nested levels config\",\n            useFakeTimers: true,\n            test: () => {\n                let cookieCfg = {\n                    enabled: false,\n                    domain: \"test\",\n                    path: \"testpath\",\n                    ignoreCookies: [\"test1\", \"test2\"],\n                    getCookie: (name) => {\n                        let theValue = name || \"\";\n                        return theValue + \"Test\";\n                    }\n                } as ICookieMgrConfig;\n                let newCookieCfg = {\n                    enabled: true,\n                    domain: \"test123\",\n                    path: \"testpath123\",\n                    ignoreCookies: [\"test1123\", \"test2123\"],\n                    getCookie: (name) => {\n                        let theValue = name || \"\";\n                        return theValue + \"Test123\";\n                    },\n                    setCookie: (name, value) => {\n                        name = value;\n                    },\n                    delCookie: (name) => {\n                        return null;\n                    }\n                } as ICookieMgrConfig;\n                let config = {\n                    instrumentationKey: \"Test-iKey\",\n                    endpointUrl: \"testurl\",\n                    maxMessageLimit: 100,\n                    disablePageUnloadEvents: [\"eve1\", \"eve2\"],\n                    cookieCfg: cookieCfg\n                } as IConfig & IConfiguration;\n\n                let newConfig = {\n                    instrumentationKey: \"Test-iKey123\",\n                    endpointUrl: \"testurl123\",\n                    maxMessageLimit: 1000,\n                    cookieCfg: newCookieCfg,\n                    disablePageUnloadEvents: [\"eve123\", \"eve223\"]\n                } as IConfig & IConfiguration;\n                \n                let nonoverrideCfg = {\n                    instrumentationKey: true,\n                    endpointUrl: true,\n                    cookieCfg: {\n                        enabled: true,\n                        domain: true,\n                        getCookie: true\n                    }\n                } as NonOverrideCfg;\n\n                let  expectedNewCfg = {\n                    maxMessageLimit: 1000,\n                    cookieCfg: {\n                        path: \"testpath123\",\n                        ignoreCookies: [\"test1123\", \"test2123\"],\n                        setCookie: (name, value) => {\n                            name = value;\n                        },\n                        delCookie: (name) => {\n                            return null;\n                        }\n                    },\n                    disablePageUnloadEvents: [\"eve123\", \"eve223\"]\n                }\n               \n                let core = new AppInsightsCore();\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let channel = new ChannelPlugin();\n                core.initialize(config, [channel]);\n                let coreCfg = core.config;\n                let newCfg = replaceByNonOverrideCfg(newConfig, nonoverrideCfg, 0, 4);\n                Assert.deepEqual(JSON.stringify(newCfg), JSON.stringify(expectedNewCfg), \"only expected configs are changed under new config\");\n\n                core.updateCfg(newCfg);\n                this.clock.tick(1);\n                coreCfg = core.config;\n                let ikey = coreCfg.instrumentationKey;\n                let endpoint = coreCfg.endpointUrl;\n                let maxMessageLimit = coreCfg.maxMessageLimit;\n                let disablePageUnloadEvents = coreCfg.disablePageUnloadEvents;\n                Assert.deepEqual(ikey, \"Test-iKey\", \"core config ikey should not be updated\");\n                Assert.deepEqual(endpoint, \"testurl\", \"core config endpoint url should not be updated\");\n                Assert.deepEqual(maxMessageLimit, 1000, \"core config maxMessageLimit url should be updated\");\n                Assert.deepEqual(disablePageUnloadEvents, [\"eve123\", \"eve223\"], \"core config disablePageUnloadEvents should be updated\");\n\n                let coreCookieCfg = core.config.cookieCfg || {};\n                Assert.ok(coreCookieCfg, \"cookie config should exist\");\n                let enabled = coreCookieCfg.enabled;\n                Assert.equal(enabled, false, \"cookie config enabled should not be udpated\");\n                let path = coreCookieCfg.path;\n                Assert.equal(path, \"testpath123\", \"cookie config path should be udpated\");\n                let domain = coreCookieCfg.domain;\n                Assert.equal(domain, \"test\", \"cookie config domain should not be udpated\");\n                let cookie = coreCfg.cookieCfg;\n                let getFunc = cookie?.getCookie;\n                let val = getFunc && getFunc(\"\");\n                Assert.equal(val, \"Test\", \"cookie config domain should not be udpated\");\n            }\n\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: replaceByNonOverrideCfg should work with 3 & 4 nested levels config\",\n            useFakeTimers: true,\n            test: () => {\n                let storageBuffer = {\n                    getItem: (logger: any, name: string) => {\n                        return \"test\"\n                    },\n                    setItem: (logger: any, name: string, data: string) => {\n                        return true;\n                    }\n                } as IStorageBuffer;\n\n                let newStorageBuffer = {\n                    getItem: (logger: any, name: string) => {\n                        return \"test123\"\n                    },\n                    setItem: (logger: any, name: string, data: string) => {\n                        return false;\n                    }\n                } as IStorageBuffer;\n\n                let config = {\n                    instrumentationKey: \"Test-iKey\",\n                    maxMessageLimit: 100,\n                    extensionConfig: {\n                        [\"ApplicationInsightsAnalytics\"]: {\n                            emitLineDelimitedJson: true,\n                            sessionRenewalMs: 100,\n                            bufferOverride: storageBuffer\n                        } as IConfig\n                    }\n                } as IConfiguration;\n\n                let newConfig = {\n                    instrumentationKey: \"Test-iKey123\",\n                    maxMessageLimit: 1000,\n                    extensionConfig: {\n                        [\"ApplicationInsightsAnalytics\"]: {\n                            emitLineDelimitedJson: false,\n                            sessionRenewalMs: 1000,\n                            bufferOverride: newStorageBuffer\n                        } as IConfig\n                    }\n                } as IConfiguration;\n                \n                let nonoverrideCfg = {\n                    instrumentationKey: true,\n                    extensionConfig: {\n                        [\"ApplicationInsightsAnalytics\"]: {\n                            emitLineDelimitedJson: true,\n                            bufferOverride: {\n                                getItem: true\n                            }\n                        }\n                    }\n                } as NonOverrideCfg;\n               \n                let core = new AppInsightsCore();\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let channel = new ChannelPlugin();\n                core.initialize(config, [channel]);\n                let coreCfg = core.config;\n                let newCfg = replaceByNonOverrideCfg(newConfig, nonoverrideCfg, 0, 4);\n                let newCfgIkey = newCfg.instrumentationKey;\n                Assert.deepEqual(newCfgIkey, undefined, \"new config ikey should be deleted\");\n                let newMsgLimit = newCfg.maxMessageLimit;\n                Assert.deepEqual(newMsgLimit, 1000, \"new config maxMessageLimit should not be deleted\");\n                let newExtConfig = newCfg.extensionConfig || {};\n                Assert.ok(newExtConfig, \"new ext config should not be deleted\");\n                let newPluginConfig = newExtConfig[\"ApplicationInsightsAnalytics\"] || {};\n                Assert.ok(newPluginConfig, \"new plugin config should not be deleted\");\n                Assert.ok(!newPluginConfig.emitLineDelimitedJson, \"new plugin config emitLineDelimitedJson should be updated\");\n                Assert.deepEqual(newPluginConfig.sessionRenewalMs, 1000, \"new plugin config sessionRenewalMs should not be deleted\");\n                let newBuffer = newPluginConfig.bufferOverride || {};\n                Assert.ok(newBuffer, \"new plugin config bufferOverride should not be deleted\");\n                Assert.deepEqual(newBuffer.getItem, undefined, \"new bufferOveride getItem should be deleted\");\n                let setItem = newBuffer && newBuffer.setItem;\n                Assert.deepEqual(setItem(null, \"name\", \"data\"), false, \"new bufferOveride setItem should not be deleted\");\n                \n\n                core.updateCfg(newCfg);\n                this.clock.tick(1);\n                coreCfg = core.config;\n                let ikey = coreCfg.instrumentationKey;\n                Assert.deepEqual(ikey, \"Test-iKey\", \"core config ikey should not be updated\");\n                let coreMsgLimit = coreCfg.maxMessageLimit;\n                Assert.deepEqual(coreMsgLimit, 1000, \"core config maxMessageLimit should not be deleted\");\n                let coreExtConfig = coreCfg.extensionConfig || {};\n                Assert.ok(coreExtConfig, \"core ext config should not be deleted\");\n                let corePluginConfig = coreExtConfig[\"ApplicationInsightsAnalytics\"] || {};\n                Assert.ok(corePluginConfig, \"core plugin config should not be deleted\");\n                Assert.ok(corePluginConfig.emitLineDelimitedJson, \"core plugin config emitLineDelimitedJson should not be updated\");\n                Assert.deepEqual(corePluginConfig.sessionRenewalMs, 1000, \"core plugin config sessionRenewalMs should not be deleted\");\n                let coreBuffer = corePluginConfig.bufferOverride || {};\n                Assert.ok(coreBuffer, \"core plugin config bufferOverride should not be deleted\");\n                let coreGetItem = coreBuffer && coreBuffer.getItem;\n                Assert.ok(coreGetItem, \"core plugin config getItem should not be deleted\");\n                Assert.deepEqual( coreGetItem && coreGetItem(null, \"test\"), \"test\", \"core bufferOveride getItem should not be updated\");\n                let coreSetItem = coreBuffer && coreBuffer.setItem;\n                Assert.ok(coreSetItem, \"core plugin config setItem should not be deleted\");\n                Assert.deepEqual(coreSetItem(null, \"name\", \"data\"), false, \"new bufferOveride setItem should be updated\");\n            }\n\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: replaceByNonOverrideCfg should work with max nested level config\",\n            useFakeTimers: true,\n            test: () => {\n             \n                let newCookieCfg = {\n                    enabled: true,\n                    domain: \"test123\",\n                    path: \"testpath123\",\n                    ignoreCookies: [\"test1123\", \"test2123\"],\n                    getCookie: (name) => {\n                        let theValue = name || \"\";\n                        return theValue + \"Test123\";\n                    },\n                    setCookie: (name, value) => {\n                        name = value;\n                    },\n                    delCookie: (name) => {\n                        return null;\n                    }\n                } as ICookieMgrConfig;\n\n                let newConfig = {\n                    instrumentationKey: \"Test-iKey123\",\n                    maxMessageLimit: 1000,\n                    cookieCfg: newCookieCfg,\n                    disablePageUnloadEvents: [\"eve123\", \"eve223\"]\n                } as IConfig & IConfiguration;\n                \n                let nonoverrideCfg = {\n                    instrumentationKey: true,\n                    cookieCfg: {\n                        enabled: true,\n                        domain: true,\n                        getCookie: true\n                    },\n                    disablePageUnloadEvents: true\n                } as NonOverrideCfg;\n               \n                let newCfg = replaceByNonOverrideCfg(newConfig, nonoverrideCfg, 0, 0);\n                Assert.deepEqual(newCfg.instrumentationKey, undefined, \"instrumentationKey should be deleted\");\n                Assert.deepEqual(newCfg.maxMessageLimit, 1000, \"maxMessageLimit should not be deleted\");\n                Assert.deepEqual(newCfg.disablePageUnloadEvents, undefined, \"disablePageUnloadEvents should be deleted\");\n                Assert.deepEqual(newCfg.cookieCfg, null, \"cookieCfg should exceed max level\");\n\n\n                let storageBuffer = {\n                    getItem: (logger: any, name: string) => {\n                        return \"test\"\n                    },\n                    setItem: (logger: any, name: string, data: string) => {\n                        return true;\n                    }\n                } as IStorageBuffer;\n                let newConfig2 = {\n                    instrumentationKey: \"Test-iKey\",\n                    maxMessageLimit: 100,\n                    extensionConfig: {\n                        [\"ApplicationInsightsAnalytics\"]: {\n                            emitLineDelimitedJson: true,\n                            sessionRenewalMs: 100,\n                            bufferOverride: storageBuffer\n                        } as IConfig\n                    }\n                } as IConfiguration;\n                let nonoverrideCfg2 = {\n                    instrumentationKey: true,\n                    extensionConfig: {\n                        [\"ApplicationInsightsAnalytics\"]: {\n                            emitLineDelimitedJson: true,\n                            bufferOverride: {\n                                getItem: true\n                            }\n                        }\n                    }\n                } as NonOverrideCfg;\n                let newCfg2 = replaceByNonOverrideCfg(newConfig2, nonoverrideCfg2, 0, 2);\n                Assert.deepEqual(newCfg2.instrumentationKey, undefined, \"instrumentationKey should be deleted\");\n                let extCfg = newCfg2.extensionConfig || {};\n                Assert.ok(extCfg, \"ext config should not be deleted\");\n                let pluginCfg = extCfg.ApplicationInsightsAnalytics || null;\n                Assert.ok(pluginCfg, \"plugin config should not be deleted\");\n                Assert.deepEqual(pluginCfg.emitLineDelimitedJson, undefined, \"emitLineDelimitedJson should be deleted\");\n                Assert.deepEqual(pluginCfg.sessionRenewalMs, 100, \" sessionRenewalMs should not be deleted\");\n                Assert.deepEqual(pluginCfg.bufferOverride, null, \"bufferOverride should exceed max level\");\n\n            }\n\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: shouldOptInFeature should work as expected with empty or undefiend or cdn config is disabled\",\n            useFakeTimers: true,\n            test: () => {\n                let mfield = \"featureOptIn.enableWParamFeature.mode\";\n                let vField = \"featureOptIn.enableWParamFeature.onCfg\";\n                let dField = \"featureOptIn.enableWParamFeature.offCfg\";\n\n\n                //Case1: cdn cfg and custom cfg are both undefined or empty\n                let featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\");\n                Assert.deepEqual(null, featureValue, \"feature value should be null when cfg are undefined case1\");\n\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", {}, {});\n                Assert.deepEqual(null, featureValue, \"feature value should be null when cfg are empty case1\");\n\n\n                //Case2: custom cfg is undefined or empty\n                let cdnConfig = {\n                    enabled: false\n                } as ICfgSyncCdnConfig;\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", cdnConfig);\n                Assert.deepEqual(null, featureValue, \"feature value should be null when custom cfg is undefined and cdn config is disabled case2\");\n                cdnConfig = {\n                    enabled: true\n                } as ICfgSyncCdnConfig;\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", cdnConfig, {});\n                Assert.deepEqual({[mfield]: FeatureOptInMode.disable, [vField]: undefined, [dField]: undefined}, featureValue, \"feature value should be disbale when custom cfg is empty and cdn config is enabled case2\");\n                cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[\"enableWParamFeature\"]: {mode: CdnFeatureMode.enable}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", cdnConfig);\n                Assert.deepEqual({[mfield]: FeatureOptInMode.disable, [vField]: undefined, [dField]: undefined}, featureValue, \"feature value should be disable when custom cfg is undefined case2\");\n                featureValue = resolveCdnFeatureCfg(\"enableWP\", cdnConfig);\n                Assert.deepEqual({\"featureOptIn.enableWP.mode\": FeatureOptInMode.disable, \"featureOptIn.enableWP.onCfg\": undefined,\"featureOptIn.enableWP.offCfg\": undefined}, featureValue, \"feature value should be null when field is not defined case2\");\n                \n\n                //Case3: cdn config is undefined or empty\n                let customFeatureOptIn = {\n                    [\"enableWParamFeature\"]: {mode: FeatureOptInMode.enable, onCfg: {\"config1\": true}, offCfg: {\"config2\": false}} as IFeatureOptInDetails\n                }as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", {}, customFeatureOptIn);\n                Assert.deepEqual(null, featureValue, \"feature value should be disable case3\");\n\n\n                //Case4: cdn config is disbaled\n                cdnConfig = {\n                    enabled: false,\n                    featureOptIn:{[\"enableWParamFeature\"]: {mode: CdnFeatureMode.disable}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                customFeatureOptIn = {\n                    [\"enableWParamFeature\"]: {mode: FeatureOptInMode.enable, onCfg: {\"config1\": true}, offCfg: {\"config2\": false}} as IFeatureOptInDetails\n                }as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", cdnConfig, customFeatureOptIn);\n                Assert.deepEqual(null, featureValue, \"feature value should be disable case4\");\n\n                //Case5: cdn config has value and custom details is none\n                cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[\"enableWParamFeature\"]: {mode: CdnFeatureMode.enable, onCfg: {\"config1\": true}, offCfg: {\"config2\": false}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", cdnConfig);\n                Assert.deepEqual({[mfield]: FeatureOptInMode.disable, [vField]: {\"config1\": true}, [dField]: {\"config2\": false}}, featureValue, \"feature value should be cdn Value case5\");\n\n                cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[\"enableWParamFeature\"]: {mode: CdnFeatureMode.disable, onCfg: {\"config1\": true}, offCfg: {\"config2\": false}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                featureValue = resolveCdnFeatureCfg(\"enableWParamFeature\", cdnConfig);\n                Assert.deepEqual({[mfield]: FeatureOptInMode.disable, [vField]: {\"config1\": true}, [dField]: {\"config2\": false}}, featureValue, \"feature value should combine user and cdn values case5\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: shouldOptInFeature should work with cdn mode set enabled and custom mode set to enable\",\n            useFakeTimers: true,\n            test: () => {\n                let field = \"enableWParamFeature\";\n                let mField = `featureOptIn.${field}.mode`;\n                let vField = `featureOptIn.${field}.onCfg`;\n                let dField = `featureOptIn.${field}.offCfg`;\n\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable, onCfg: {\"config1\": true}, offCfg: {\"config2\": false}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                // case 1\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config1\": true}, [dField]: {\"config2\": false}}, featureValue, \"feature value should be cdn value case1\");\n\n                // case 1-1\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg: {\"config3\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config3\": true}, [dField]: {\"config2\": false}}, featureValue, \"feature value should be custom value case1-1\");\n\n                // case 2\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg: {\"config3\": true}, offCfg: {\"config4\": false}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config3\": true}, [dField]: {\"config4\": false}}, featureValue, \"feature value should be custom value case2\");\n\n                // case 3\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, blockCdnCfg: true} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: undefined, [dField]: undefined}, featureValue, \"feature value should be custom value case3\");\n\n                //case 4\n                cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: undefined, [dField]: undefined}, featureValue, \"feature value should be undefined case4\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: shouldOptInFeature should work with cdn mode set enabled and custom mode set to none\",\n            useFakeTimers: true,\n            test: () => {\n                let field = \"enableWParamFeature\";\n                let mField = `featureOptIn.${field}.mode`;\n                let vField = `featureOptIn.${field}.onCfg`;\n                let dField = `featureOptIn.${field}.offCfg`;\n              \n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable, onCfg: {\"config1\": true}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                // case 1\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.none} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config1\": true}, [dField]: undefined}, featureValue, \"feature value should be enable case1\");\n\n                // case 2\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.none, onCfg: {\"config1\": false}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config1\": false}, [dField]: undefined}, featureValue, \"feature value should be enable case2\");\n                \n                //case 3\n                cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.disable}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.none, onCfg: {\"config1\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable, [vField]: {\"config1\": true}, [dField]: undefined }, featureValue, \"feature value should be disable case3\");\n\n                // case 4\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.none, blockCdnCfg: true} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.none, [vField]: undefined, [dField]: undefined}, featureValue, \"feature value should be custom value case4\");\n\n                // case 5\n                cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.none}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.none, onCfg: {\"config1\": false}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.none, [vField]: {\"config1\": false}, [dField]: undefined}, featureValue, \"feature value should be custom value case5\");\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: shouldOptInFeature should work with cdn mode set enabled and custom mode set to disable\",\n            useFakeTimers: true,\n            test: () => {\n                let field = \"enableWParamFeature\";\n                let mField = `featureOptIn.${field}.mode`;\n                let vField = `featureOptIn.${field}.onCfg`;\n                let dField = `featureOptIn.${field}.offCfg`;\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable, onCfg: {\"config1\": false}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                // case 1\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.disable} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable,  [vField]: {\"config1\": false}, [dField]: undefined}, featureValue, \"feature value should be disable case1\");\n\n                // case 2\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.disable, onCfg: {\"config1\": false}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable, [vField]: {\"config1\": false}, [dField]: undefined}, featureValue, \"feature value should be disable case2\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: shouldOptInFeature should work with cdn mode set to force\",\n            useFakeTimers: true,\n            test: () => {\n                let field = \"enableWParamFeature\";\n                let mField = `featureOptIn.${field}.mode`;\n                let vField = `featureOptIn.${field}.onCfg`;\n                let dField = `featureOptIn.${field}.offCfg`;\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.forceOn,  onCfg: {\"config1\": false}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                // case 1\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.disable, onCfg: {\"config1\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config1\": false}, [dField]: undefined}, featureValue, \"feature value should be cdn value case1\");\n\n                // case 2\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.disable, blockCdnCfg: true} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable, [vField]: undefined, [dField]: undefined}, featureValue, \"feature value should be custom value case2\");\n\n                // case 3\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg: {\"config1\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable,  [vField]: {\"config1\": false}, [dField]: undefined}, featureValue, \"feature value should be cdn value case3\");\n\n                // case 4\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg: {\"config1\": true}, blockCdnCfg: true} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config1\": true}, [dField]: undefined}, featureValue, \"feature value should be custom value case4\");\n                \n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: shouldOptInFeature should work with cdn mode set to none or disable\",\n            useFakeTimers: true,\n            test: () => {\n                let field = \"enableWParamFeature\";\n                let mField = `featureOptIn.${field}.mode`;\n                let vField = `featureOptIn.${field}.onCfg`;\n                let dField = `featureOptIn.${field}.offCfg`;\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.disable, onCfg: {\"config1\": false}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                // case 1\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.none} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable, [vField]: {\"config1\": false}, [dField]: undefined}, featureValue, \"feature value should be null case1\");\n\n                // case 2\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg:  {\"config1\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable, [vField]: {\"config1\": true}, [dField]: undefined}, featureValue, \"feature value should be enable case2\");\n\n                // case 2-1\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.disable, onCfg: {\"config1\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable, [vField]: {\"config1\": true}, [dField]: undefined}, featureValue, \"feature value should be disable case2-1\");\n                \n                //case 3\n                cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.none}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.disable} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.disable, [vField]: undefined, [dField]: undefined}, featureValue, \"feature value should be null case3\");\n\n                // case 4\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.none, onCfg:{\"config1\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.none, [vField]: {\"config1\": true}, [dField]: undefined}, featureValue, \"feature value should be custom value case4\");\n\n                // case 5\n                customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg:{\"config1\": true}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                featureValue = resolveCdnFeatureCfg(field, cdnConfig, customFeatureOptIn);\n                Assert.deepEqual({[mField]: FeatureOptInMode.enable, [vField]: {\"config1\": true}, [dField]: undefined}, featureValue, \"feature value should be null case5\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: getConfigFromCdn should get config correctly with none custom opt-in\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin()\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let field = \"enableWParamFeature\";\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable, onCfg: {[\"maxMessageLimit\"]: 11}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                let config = {instrumentationKey: \"test\"} as IConfiguration;\n                core.initialize(config, [channel]);\n\n                let expectedCfg = {\n                    maxMessageLimit: 10,\n                    featureOptIn: {[field]: {mode: FeatureOptInMode.disable, onCfg: {[\"maxMessageLimit\"]: 11}, offCfg: undefined}}\n                };\n\n                let actualCdnCfg = applyCdnfeatureCfg(cdnConfig, core);\n                Assert.deepEqual(expectedCfg, actualCdnCfg, \"cdn config should not enable feature\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: getConfigFromCdn should get config correctly with custom opt-in\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin()\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let field = \"enableWParamFeature\";\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable, onCfg: {[\"maxMessageLimit\"]: 11}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let config = {instrumentationKey: \"test\", featureOptIn: customFeatureOptIn} as IConfiguration;\n                core.initialize(config, [channel]);\n\n                let actualCdnCfg = applyCdnfeatureCfg(cdnConfig, core);\n                let expectedCfg = {\n                    maxMessageLimit: 11,\n                    featureOptIn: {[field]: {mode: FeatureOptInMode.enable, onCfg: {[\"maxMessageLimit\"]: 11}, offCfg: undefined}}\n                }\n                Assert.deepEqual(expectedCfg, actualCdnCfg, \"cdn config should contain feature\");\n                \n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: getConfigFromCdn should override config correctly with custom opt-in\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin()\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let field = \"enableWParamFeature\";\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable, onCfg: {[\"maxMessageLimit\"]: 11}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg: {[\"maxMessageLimit\"]: 12}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let config = {instrumentationKey: \"test\", featureOptIn: customFeatureOptIn} as IConfiguration;\n                core.initialize(config, [channel]);\n\n                let actualCdnCfg = applyCdnfeatureCfg(cdnConfig, core);\n                let expectedCfg = {\n                    maxMessageLimit: 12,\n                    featureOptIn: {[field]: {mode: FeatureOptInMode.enable,  onCfg: {[\"maxMessageLimit\"]: 12}, offCfg: undefined}}\n                }\n                Assert.deepEqual(expectedCfg, actualCdnCfg, \"cdn config should contain feature\");\n                core.updateCfg(actualCdnCfg as any);\n\n                this.clock.tick(1);\n                Assert.deepEqual(core.config.instrumentationKey, \"test\", \"core ikey config\");\n                Assert.deepEqual(core.config.maxMessageLimit, 12, \"core maxMessageLimit config\");\n                Assert.deepEqual(core.config.featureOptIn, expectedCfg.featureOptIn, \"core featureOptIn config\");\n                \n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPluginHelper: getConfigFromCdn should override enable and disaled config correctly with custom opt-in\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin()\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let field = \"enableWParamFeature\";\n                let cdnConfig = {\n                    enabled: true,\n                    featureOptIn:{[field]: {mode: CdnFeatureMode.enable, onCfg: {[\"maxMessageLimit\"]: 11}, offCfg: {[\"maxMessageLimit\"]: 12}}},\n                    config: {\n                        maxMessageLimit: 10\n                    }\n                } as ICfgSyncCdnConfig;\n\n                let customFeatureOptIn = {\n                    [field]: {mode: FeatureOptInMode.enable, onCfg: {[\"maxMessageLimit\"]: 13}, offCfg: {[\"maxMessageLimit\"]: 14}} as IFeatureOptInDetails\n                } as IFeatureOptIn;\n                let config = {instrumentationKey: \"test\", featureOptIn: customFeatureOptIn} as IConfiguration;\n                core.initialize(config, [channel]);\n\n                let actualCdnCfg = applyCdnfeatureCfg(cdnConfig, core);\n                let expectedCfg = {\n                    maxMessageLimit: 13,\n                    featureOptIn: {[field]: {mode: FeatureOptInMode.enable,  onCfg: {[\"maxMessageLimit\"]: 13}, offCfg: {[\"maxMessageLimit\"]: 14}}}\n                }\n                Assert.deepEqual(expectedCfg, actualCdnCfg, \"cdn config should contain feature\");\n                Assert.deepEqual(cdnConfig.config?.maxMessageLimit, 13, \"original cdn config object is updated\");\n                core.updateCfg(actualCdnCfg as any);\n\n                this.clock.tick(1);\n                Assert.deepEqual(core.config.instrumentationKey, \"test\", \"core ikey config\");\n                Assert.deepEqual(core.config.maxMessageLimit, 13, \"core maxMessageLimit config\");\n                Assert.deepEqual(core.config.featureOptIn, expectedCfg.featureOptIn, \"core featureOptIn config\");\n                \n            }\n        });\n\n    }\n}\n\n\nclass ChannelPlugin implements IPlugin {\n\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry(env: ITelemetryItem) {}\n\n    setNextPlugin(next: any) {\n        // no next setup\n    }\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n\n    }\n}\n\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsyncplugin.tests.ts",
    "content": "import { Assert, AITestClass, IFetchArgs, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore, FeatureOptInMode, IAppInsightsCore, IPlugin, ITelemetryItem, getGlobal, getGlobalInst } from \"@microsoft/applicationinsights-core-js\";\nimport { IConfiguration } from \"@microsoft/applicationinsights-core-js\";\nimport { CfgSyncPlugin } from \"../../../../applicationinsights-cfgsync-js/src/applicationinsights-cfgsync-js\";\nimport { ICfgSyncConfig, ICfgSyncMode, NonOverrideCfg } from \"../../../src/Interfaces/ICfgSyncConfig\";\nimport { DisabledPropertyName, IConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { createSyncPromise } from \"@nevware21/ts-async\";\n\n\n\nexport class CfgSyncPluginTests extends AITestClass {\n    private core: AppInsightsCore;\n    private _config: IConfiguration & IConfig;\n    private mainInst: CfgSyncPlugin;\n    private identifier: string;\n    private _channel: ChannelPlugin;\n    private _context:any = {};\n    private _fetch;\n\n    constructor(emulateIe?: boolean) {\n        super(\"CfgSyncPluginTests\", emulateIe);\n    }\n\n    public testInitialize() {\n        let _self = this;\n        _self.mainInst = new CfgSyncPlugin();\n        _self.identifier = _self.mainInst.identifier;\n        _self._config = {\n            instrumentationKey: \"Test-iKey\",\n            disableInstrumentationKeyValidation: true,\n            maxMessageLimit: 3000,\n            enablePerfMgr: true,\n            extensions: [_self.mainInst],\n            extensionConfig: {\n                [_self.identifier]: {\n                    syncMode: ICfgSyncMode.Broadcast\n                } as ICfgSyncConfig\n            }\n        };\n        _self._channel = new ChannelPlugin();\n        _self.core = new AppInsightsCore();\n        this._fetch = getGlobalInst(\"fetch\");\n    }\n\n    public testCleanup() {\n        this.mainInst.teardown();\n        this.core = null as any;\n        this._config = null as any;\n        this.mainInst = null as any;\n        getGlobal().fetch = this._fetch;\n        this._context = {};\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"CfgSyncPlugin: default config should be set dynamically from root\",\n            useFakeTimers: true,\n            test: () => {\n                let doc = getGlobal();\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                this.core.initialize({instrumentationKey: \"Test-iKey\",  extensions: [this.mainInst], extensionConfig: {[this.identifier]: {}}}, [this._channel]);\n                let udfVal = undefined;\n                let defaultNonOverrideCfg: NonOverrideCfg = {instrumentationKey: true, connectionString: true, endpointUrl: true }\n                let expectedDefaults = {\n                    syncMode: ICfgSyncMode.Broadcast,\n                    customEvtName: udfVal,\n                    cfgUrl: udfVal,\n                    overrideSyncFn: udfVal,\n                    overrideFetchFn: udfVal,\n                    onCfgChangeReceive: udfVal,\n                    scheduleFetchTimeout: 1800000,\n                    nonOverrideConfigs: defaultNonOverrideCfg,\n                    blkCdnCfg: udfVal,\n                    enableAjax: false\n                };\n                this.core.config.extensionConfig = this.core.config.extensionConfig || {};\n                let actualDefaults = this.core.config.extensionConfig[this.identifier];\n                Assert.deepEqual(expectedDefaults, actualDefaults, \"default config should be set dynamically\");\n                let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], true, \"auto broadcast is on by default\");\n                Assert.equal(targets[1], false, \"receive changes is off by default\");\n                Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                Assert.equal(targets[3], false, \"default blkCdnCfg is set by default\");\n                Assert.equal(patchEvnSpy.callCount, 1, \"event is dispatched for one time\");\n                let curMainCfg = this.mainInst.getCfg();\n                Assert.deepEqual(curMainCfg, this.core.config, \"main config should be set\");\n\n                this.core.config.extensionConfig[this.identifier].customEvtName = \"test\";\n                this.clock.tick(1);\n                targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[2], \"test\", \"default event name should be changed dynamically\");\n                Assert.equal(patchEvnSpy.callCount, 2, \"event dispatch should be called again\");\n                curMainCfg = this.mainInst.getCfg();\n                Assert.deepEqual(curMainCfg, this.core.config, \"main config should be set test1\");\n\n                this.core.config.extensionConfig[this.identifier].syncMode = ICfgSyncMode.Receive;\n                this.core.config.extensionConfig[this.identifier].receiveChanges = true;\n                this.core.config.extensionConfig[this.identifier].blkCdnCfg = true;\n                this.core.config.extensionConfig[this.identifier].nonOverrideConfigs = {};\n              \n                this.clock.tick(1);\n                targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], true, \"auto sync should not be changed to false dynamically\");\n                Assert.equal(targets[1], false, \"receive changes should not be changed dynamically\");\n                Assert.equal(targets[3], true, \"blkCdnCfg changes should be changed dynamically\");\n                Assert.deepEqual(targets[4], defaultNonOverrideCfg, \"nonOverrideCfg changes should not be changed dynamically\");\n                Assert.equal(patchEvnSpy.callCount, 3, \"event dispatch should be called again\");\n                curMainCfg = this.mainInst.getCfg();\n                Assert.deepEqual(curMainCfg, this.core.config, \"main config should be set test2\");\n            }\n\n        });\n\n \n        this.testCase({\n            name: \"CfgSyncPlugin: override function configs from root\",\n            useFakeTimers: true,\n            test: () => {\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                let called = 0;\n                let send = 0;\n                let overrideSyncFn = (config?:IConfiguration & IConfig, customDetails?: any) =>  {\n                    called ++;\n                    return true;\n                }\n                let onCompleteCallback = (status: number, response?: string, isAutoSync?: boolean) => {\n                    return;\n                };\n                let sendGetFunction = (url: string, oncomplete: any, isAutoSync?: boolean) => {\n                    send++;\n                    return;\n                };\n                this.core.initialize({instrumentationKey: \"Test-iKey\",  extensions: [this.mainInst], extensionConfig: {[this.identifier]: {overrideSyncFn: overrideSyncFn, overrideFetchFn: sendGetFunction} as ICfgSyncConfig}}, [this._channel]);\n                this.core.config.extensionConfig = this.core.config.extensionConfig || {};\n                let actualsyncFn = this.core.config.extensionConfig[this.identifier].overrideSyncFn;\n                let actualFetchFn = this.core.config.extensionConfig[this.identifier].overrideFetchFn;\n                actualsyncFn();\n                Assert.equal(called, 1, \"sync function should be replced\");\n\n                actualFetchFn(\"test\", onCompleteCallback);\n                Assert.equal(send, 1, \"fetch function should be replced\");\n\n            }\n\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: eventListener should be set correctly to broadcast mode instacne\",\n            test: () => {\n                let doc = getGlobal();\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let global = getGlobal();\n                let eventListenerStub = this.sandbox.spy(global, \"addEventListener\");\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n\n                this.core.initialize(this._config, [this._channel]);\n                let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], true, \"auto broadcast is on by default\");\n                Assert.equal(targets[1], false, \"receive changes is on\");\n                Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                Assert.equal(patchEvnSpy.callCount, 1, \"event is dispatched\");\n                Assert.equal(eventListenerStub.callCount, 0, \"event listener is not added to broadcase mode instance\");\n\n                this.mainInst.updateEventListenerName(\"test\");\n                targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[2], \"test\", \"event name should be changed\");\n                Assert.equal(patchEvnSpy.callCount, 1, \"event dispatch shoule not be called again\");\n                Assert.equal(eventListenerStub.callCount, 0, \"event listener is should not be added to broadcast mode instance again\");\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: eventListener should be set correctly to receive mode instance\",\n            test: () => {\n                let doc = getGlobal();\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let global = getGlobal();\n                let eventListenerStub = this.sandbox.spy(global, \"addEventListener\");\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n\n                this._config.extensionConfig = this._config.extensionConfig || {};\n                this._config.extensionConfig[this.identifier].syncMode = ICfgSyncMode.Receive;\n                this.core.initialize(this._config, [this._channel]);\n                let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], false, \"auto broadcast is off by default\");\n                Assert.equal(targets[1], true, \"receive changes is on\");\n                Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                Assert.equal(patchEvnSpy.callCount, 0, \"no event should be dispatched\");\n                Assert.equal(eventListenerStub.callCount, 1, \"event listener is added to receive mode instance\");\n\n                this.mainInst.updateEventListenerName(\"test\");\n                targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[2], \"test\", \"event name should be changed\");\n                Assert.equal(patchEvnSpy.callCount, 0, \"event dispatch shoule not be called again\");\n                Assert.equal(eventListenerStub.callCount, 2, \"event listener is be added to receive modeinstance again\");\n            }\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: eventListener should be set correctly to None mode instance\",\n            test: () => {\n                let doc = getGlobal();\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let global = getGlobal();\n                let eventListenerStub = this.sandbox.spy(global, \"addEventListener\");\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n\n                this._config.extensionConfig = this._config.extensionConfig || {};\n                this._config.extensionConfig[this.identifier].syncMode = ICfgSyncMode.None;\n                this.core.initialize(this._config, [this._channel]);\n                let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], false, \"auto broadcast is off by default\");\n                Assert.equal(targets[1], false, \"receive changes is off\");\n                Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                Assert.equal(patchEvnSpy.callCount, 0, \"no event should be dispatched\");\n                Assert.equal(eventListenerStub.callCount, 0, \"no event listener is added to none mode instance\");\n\n                this.mainInst.updateEventListenerName(\"test\");\n                targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[2], \"test\", \"event name should be changed\");\n                Assert.equal(patchEvnSpy.callCount, 0, \"event dispatch shoule not be called again\");\n                Assert.equal(eventListenerStub.callCount, 0, \"event listener should not be added to none mode instance again\");\n            }\n        });\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: should fetch from config url\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            steps: [ () => {\n                let doc = getGlobal();\n                let config = {\n                    instrumentationKey:\"testIkey\",\n                    enableAjaxPerfTracking: true\n                } as IConfiguration & IConfig;\n                let cdnCfg = {\n                    enabled: true,\n                    config: config\n                } as ICfgSyncConfig;\n                let res = new (doc as any).Response(JSON.stringify(cdnCfg), {\n                    status: 200,\n                    headers: { \"Content-type\": \"application/json\" }\n                });\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve(res);\n                    }, 0);\n                });\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this._config.extensionConfig  = { [this.identifier]: {\n                    cfgUrl: \"testURL\"\n                }};\n                this._context[\"patchEvnSpy\"] = patchEvnSpy;\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                let patchEvnSpy = this._context[\"patchEvnSpy\"];\n                let config = {\n                    //instrumentationKey:\"testIkey\", // should not be override\n                    enableAjaxPerfTracking: true\n                } as IConfiguration & IConfig;\n                if (fetchStub.called && patchEvnSpy.called) {\n                    Assert.ok(fetchStub.calledOnce, \"fetch is called\");\n                    Assert.ok(patchEvnSpy.calledOnce, \"patchEvnSpy is called\");\n                    let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                    Assert.equal(targets[0], true, \"auto broadcast is on by default\");\n                    Assert.equal(targets[1], false, \"receive changes is off\");\n                    Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                    let curMainCfg = this.mainInst.getCfg();\n                    Assert.deepEqual(curMainCfg, config, \"main config should be get from url\");\n                    Assert.equal(patchEvnSpy.callCount, 1, \"event should be dispatched\");\n                    Assert.equal(fetchStub.callCount, 1, \"fetch is called\");\n                    return true;\n                }\n                return false;\n            }, \"response received\", 60, 1000) as any)\n        \n        });\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: should fetch call with disabledProperty when enableAjax is true\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            steps: [ () => {\n                let doc = getGlobal();\n                let config = {\n                    instrumentationKey:\"testIkey\",\n                    enableAjaxPerfTracking: true\n                } as IConfiguration & IConfig;\n                let cdnCfg = {\n                    enabled: true,\n                    config: config\n                } as ICfgSyncConfig;\n                let res = new (doc as any).Response(JSON.stringify(cdnCfg), {\n                    status: 200,\n                    headers: { \"Content-type\": \"application/json\" }\n                });\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve(res);\n                    }, 0);\n                });\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this._config.extensionConfig  = { [this.identifier]: {\n                    cfgUrl: \"testURL\"\n                }};\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                if (fetchStub.called) {\n                    Assert.equal(fetchStub.callCount, 1, \"fetch is called once\");\n                    let rlt = fetchStub.args[0][0][DisabledPropertyName];\n                    Assert.equal(rlt, true, \"disableProperty tag should be true\")\n                    return true;\n                }\n                return false;\n            }, \"response received\", 60, 1000) as any)\n        \n        });\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: should fetch call without disabledProperty when enableAjax is false\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            steps: [ () => {\n                let doc = getGlobal();\n                let config = {\n                    instrumentationKey:\"testIkey\",\n                    enableAjaxPerfTracking: true\n                } as IConfiguration & IConfig;\n                let cdnCfg = {\n                    enabled: true,\n                    config: config\n                } as ICfgSyncConfig;\n                let res = new (doc as any).Response(JSON.stringify(cdnCfg), {\n                    status: 200,\n                    headers: { \"Content-type\": \"application/json\" }\n                });\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve(res);\n                    }, 0);\n                });\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this._config.extensionConfig  = { [this.identifier]: {\n                    cfgUrl: \"testURL\",\n                    enableAjax: true\n                }};\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                if (fetchStub.called) {\n                    Assert.equal(fetchStub.callCount, 1, \"fetch is called once\");\n                    let rlt = fetchStub.args[0][0][DisabledPropertyName];\n                    Assert.equal(!!rlt, false, \"disableProperty tag should be true\")\n                    return true;\n                }\n                return false;\n            }, \"response received\", 60, 1000) as any)\n        \n        });\n\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: should fetch from config url at expected interval\",\n            stepDelay: 100,\n            useFakeTimers: true,\n            steps: [ () => {\n                let doc = getGlobal();\n                let config = {\n                    instrumentationKey:\"testIkey\",\n                    enableAjaxPerfTracking: true\n                } as IConfiguration & IConfig;\n                let cdnCfg = {\n                    enabled: true,\n                    config: config\n                } as ICfgSyncConfig;\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve(new (doc as any).Response(JSON.stringify(cdnCfg), {\n                            status: 200,\n                            headers: { \"Content-type\": \"application/json\" }\n                        }));\n                    }, 0);\n                });\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this._config.extensionConfig  = { [this.identifier]: {\n                    cfgUrl: \"testURL\",\n                    scheduleFetchTimeout: 1000\n                }};\n                this._context[\"patchEvnSpy\"] = patchEvnSpy;\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                let patchEvnSpy = this._context[\"patchEvnSpy\"];\n                let config = {\n                    //instrumentationKey:\"testIkey\", // should not be override\n                    enableAjaxPerfTracking: true\n                } as IConfiguration & IConfig;\n                if (fetchStub.called && patchEvnSpy.called) {\n                    Assert.ok(patchEvnSpy.calledOnce, \"patchEvnSpy is called\");\n                    let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                    Assert.equal(targets[0], true, \"auto braodcast is on by default\");\n                    Assert.equal(targets[1], false, \"receive changes is off\");\n                    Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                    let curMainCfg = this.mainInst.getCfg();\n                    Assert.deepEqual(curMainCfg, config, \"main config should be get from url\");\n                    Assert.equal(fetchStub.callCount, 2, \"fetch is called 2 times\");\n                    Assert.equal(patchEvnSpy.callCount, 1, \"event should be dispatched 1 time\");\n                    return true;\n                }\n                return false;\n            }, \"response received\", 60, 1000) as any).concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                let patchEvnSpy = this._context[\"patchEvnSpy\"];\n               \n                if (fetchStub.called && patchEvnSpy.called && fetchStub.callCount >= 3 && patchEvnSpy.callCount >= 3) {\n                    Assert.equal(fetchStub.callCount, 3, \"fetch is called 3 times\");\n                    Assert.equal(patchEvnSpy.callCount, 3, \"event should be dispatched 3 times\");\n                    return true;\n                }\n                return false;\n            }, \"response received\", 60, 100) as any)\n        });\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: should not fetch from config url at when retry count > 2\",\n            stepDelay: 10,\n            steps: [ () => {\n                let doc = getGlobal();\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve(new (doc as any).Response(JSON.stringify({}), {\n                            status: 400,\n                            headers: { \"Content-type\": \"application/json\" }\n                        }));\n                    }, 0);\n                });\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this._config.extensionConfig  = { [this.identifier]: {\n                    cfgUrl: \"testURL\",\n                    scheduleFetchTimeout: 1000\n                }};\n                this._context[\"patchEvnSpy\"] = patchEvnSpy;\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n               \n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                let patchEvnSpy = this._context[\"patchEvnSpy\"];\n\n                if (fetchStub.called) {\n                    Assert.ok(!patchEvnSpy.calledOnce, \"patchEvnSpy should not be called\");\n                    let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                    Assert.equal(targets[0], true, \"auto braodcast is on by default\");\n                    Assert.equal(targets[1], false, \"receive changes is off\");\n                    Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                    let curMainCfg = this.mainInst.getCfg();\n                    Assert.deepEqual(curMainCfg, null, \"main config should not be set from url\");\n                    Assert.equal(fetchStub.callCount, 2, \"fetch is called 2 times\");\n                    Assert.equal(patchEvnSpy.callCount, 0, \"no event should be dispatched 1 time\");\n                    return true;\n                }\n                return false;\n            }, \"response received\", 60, 1000) as any).concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                let patchEvnSpy = this._context[\"patchEvnSpy\"];\n               \n                if (fetchStub.called) {\n                    Assert.equal(fetchStub.callCount, 2, \"fetch should not be called 3 times\");\n                    Assert.equal(patchEvnSpy.callCount, 0, \"event should not be dispatched again\");\n                    return true;\n                }\n                return false;\n            }, \"response received\", 60, 100) as any)\n        });\n\n        this.testCase({\n            name: \"CfgSyncPlugin: main instance should change listeners config\",\n            useFakeTimers: true,\n            test: () => {\n                let listener = new CfgSyncPlugin();\n                let core = new AppInsightsCore();\n                let config = {\n                    instrumentationKey: \"Test-iKey123\",\n                    disableInstrumentationKeyValidation: false,\n                    maxMessageLimit: 3001,\n                    enablePerfMgr: false,\n                    extensions: [listener],\n                    extensionConfig: {\n                        [this.identifier]: {\n                            syncMode: ICfgSyncMode.Receive\n                        }\n                    }\n                }\n                let doc = getGlobal();\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let eventListenerStub = this.sandbox.spy(doc, \"addEventListener\");\n                this._config.extensionConfig  = { [this.identifier]: {}};\n                this.onDone(() => {\n                    this.core.unload(false);\n                    core.unload(false);\n                });\n                core.initialize(config, [this._channel]);\n                this.core.initialize(this._config, [this._channel]);\n                let targets = this.mainInst[\"_getDbgPlgTargets\"]();\n                Assert.equal(targets[0], true, \"auto broadcast is on by default\");\n                Assert.equal(targets[1], false, \"receive changes is off\");\n                Assert.equal(targets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                Assert.equal(patchEvnSpy.callCount, 1, \"event should be dispatched\");\n                let curMainCfg = this.mainInst.getCfg();\n                Assert.deepEqual(curMainCfg, this.core.config, \"main config should be set\");\n\n                let listenerTargets = listener[\"_getDbgPlgTargets\"]();\n                Assert.equal(listenerTargets[0], false, \"auto broadcast is off by default\");\n                Assert.equal(listenerTargets[1], true, \"receive changes is true\");\n                Assert.equal(listenerTargets[2], \"ai_cfgsync\", \"default event name is set by default\");\n                Assert.equal(patchEvnSpy.callCount, 1, \"event should not be dispatched\");\n                Assert.equal(eventListenerStub.callCount, 1, \"event listener is added\");\n                let curListenerMainCfg = listener.getCfg();\n                Assert.deepEqual(curListenerMainCfg, core.config, \"listener config should be set\");\n                \n                this.clock.tick(1);\n\n                Assert.equal(core.config.instrumentationKey, \"Test-iKey123\", \"config ikey should not be updated\");\n                Assert.equal(core.config.maxMessageLimit, 3000, \"config maxMessageLimit should be updated\");\n                Assert.equal(core.config.enablePerfMgr, true, \"config enablePerfMgr should be updated\");\n\n                Assert.equal(this.core.config.instrumentationKey, \"Test-iKey\", \"main inst config ikey should not be updated\");\n                Assert.equal(this.core.config.maxMessageLimit, 3000, \"main inst config maxMessageLimit should not be updated\");\n                Assert.equal(this.core.config.enablePerfMgr, true, \"main inst config enablePerfMgr should not be updated\");\n\n            }\n        });\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: should not fetch when blkCdnCfg is set to true\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [ () => {\n                let doc = getGlobal();\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve(new (doc as any).Response(JSON.stringify({}), {\n                            status: 400,\n                            headers: { \"Content-type\": \"application/json\" }\n                        }));\n                    }, 0);\n                });\n                let patchEvnSpy = this.sandbox.spy(doc, \"dispatchEvent\");\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this._config.extensionConfig  = { [this.identifier]: {\n                    cfgUrl: \"testURL\",\n                    scheduleFetchTimeout: 1000,\n                    blkCdnCfg: true\n                }};\n                this._context[\"patchEvnSpy\"] = patchEvnSpy;\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n               \n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                let patchEvnSpy = this._context[\"patchEvnSpy\"];\n                Assert.equal(fetchStub.callCount, 0, \"fetch is should not be called\");\n                Assert.equal(patchEvnSpy.callCount, 0, \"no event should be dispatched 1 time\");\n                if (fetchStub.called) {\n                    return false;\n                }\n                return true;\n            }, \"response received\", 60, 1000) as any).concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                let patchEvnSpy = this._context[\"patchEvnSpy\"];\n               \n                Assert.equal(fetchStub.callCount, 0, \"fetch is should not be called\");\n                Assert.equal(patchEvnSpy.callCount, 0, \"no event should be dispatched 1 time\");\n                if (fetchStub.called) {\n                    return false;\n                }\n                return true;\n            }, \"response received\", 60, 100) as any)\n        });\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: Test with current cfgSync CDN v1\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [ () => {\n              \n                let doc = getGlobal();\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n    \n                this._config.featureOptIn = {[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}, [\"CdnUsage\"]:{mode: FeatureOptInMode.disable}}\n                this._config.throttleMgrCfg = {\n                    [\"109\"]: {disabled: true},\n                    [\"106\"]: {disabled: true},\n                    [\"110\"]: {disabled: true}\n                }\n                this._config.extensionConfig  = { [this.identifier]: {\n                    syncMode: ICfgSyncMode.Receive,\n                    cfgUrl: \"https://js.monitor.azure.com/scripts/b/ai.config.1.cfg.json\",\n                    scheduleFetchTimeout: 10000\n                }};\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n               \n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                Assert.equal(fetchStub.callCount, 1, \"fetch is should called once\");\n                if (fetchStub.called) {\n                    return true;\n                }\n                return false;\n            }, \"wait for fetch response\", 60, 100) as any).concat(PollingAssert.createPollingAssert(() => {\n                let coreConfig = this.core.config as IConfig & IConfiguration;\n                let featureOptIn = coreConfig.featureOptIn || {};\n                let throttleMgrConfig = coreConfig.throttleMgrCfg || {};\n                let ikeyOptIn = featureOptIn[\"iKeyUsage\"];\n                let defaultIkey = throttleMgrConfig[\"109\"];\n                let defaultEnabled = !defaultIkey.disabled;\n                let onConfig = ikeyOptIn.onCfg;\n                let offConfig = ikeyOptIn.onCfg;\n                if (onConfig && offConfig && defaultEnabled) {\n                    let ikeyMsg = throttleMgrConfig[\"106\"];\n                    Assert.equal(ikeyMsg.disabled, false, \"ikey msg should be enabled\");\n                    let otherMsg = throttleMgrConfig[\"110\"];\n                    Assert.equal(otherMsg.disabled, false, \"other msg should be enabled\");\n                    let cdnOptIn = featureOptIn[\"CdnUsage\"];\n                    Assert.equal(cdnOptIn.mode, 3, \"cdn feature optin should be enabled\");\n                    Assert.equal(ikeyOptIn.mode, 3, \"ikey feature optin should be enabled\");\n                    return true;\n                }\n                return false;\n            }, \"wait for core config update\", 60, 100) as any)\n        });\n\n        this.testCaseAsync({\n            name: \"CfgSyncPlugin: NonOverride values should not be changed Test with current cfgSync CDN v1\",\n            stepDelay: 10,\n            useFakeTimers: true,\n            useFakeServer: true,\n            steps: [ () => {\n              \n                let doc = getGlobal();\n                this.onDone(() => {\n                    this.core.unload(false);\n                });\n                let fetchStub = this.sandbox.spy((doc as any), \"fetch\");\n                this._config.throttleMgrCfg = {};\n                this._config.featureOptIn = {[\"iKeyUsage\"]: {mode: FeatureOptInMode.enable}, [\"CdnUsage\"]:{mode: FeatureOptInMode.disable}}\n                this._config.throttleMgrCfg = {\n                    [\"109\"]: {disabled: true},\n                    [\"106\"]: {disabled: true},\n                    [\"110\"]: {disabled: true}\n                }\n\n                this._config.extensionConfig  = { [this.identifier]: {\n                    syncMode: ICfgSyncMode.Receive,\n                    cfgUrl: \"https://js.monitor.azure.com/scripts/b/ai.config.1.cfg.json\",\n                    scheduleFetchTimeout: 10000,\n                    nonOverrideConfigs: {throttleMgrCfg: true}\n                \n                } as ICfgSyncConfig};\n                this._context[\"fetchStub\"] = fetchStub;\n                this.core.initialize(this._config, [this._channel]);\n               \n            }].concat(PollingAssert.createPollingAssert(() => {\n                let fetchStub = this._context[\"fetchStub\"];\n                Assert.equal(fetchStub.callCount, 1, \"fetch is should called once\");\n                if (fetchStub.called) {\n                    return true;\n                }\n                return false;\n            }, \"wait for fetch response\", 60, 100) as any).concat(PollingAssert.createPollingAssert(() => {\n                let coreConfig = this.core.config as IConfig & IConfiguration;\n                let featureOptIn = coreConfig.featureOptIn || {};\n                let throttleMgrConfig = coreConfig.throttleMgrCfg || {};\n                let ikeyOptIn = featureOptIn[\"iKeyUsage\"];\n            \n                let onConfig = ikeyOptIn.onCfg;\n                let offConfig = ikeyOptIn.onCfg;\n                if (onConfig && offConfig) {\n                    let defaultIkey = throttleMgrConfig[\"109\"];\n                    Assert.equal(defaultIkey.disabled, true, \"ikey msg should be disbaled\");\n                    let ikeyMsg = throttleMgrConfig[\"106\"];\n                    Assert.equal(ikeyMsg.disabled, true, \"ikey msg should be disabled\");\n                    let otherMsg = throttleMgrConfig[\"110\"];\n                    Assert.equal(otherMsg.disabled, true, \"other msg should be disabled\");\n                    let cdnOptIn = featureOptIn[\"CdnUsage\"];\n                    Assert.equal(cdnOptIn.mode, 3, \"cdn feature optin should be disabled\");\n                    Assert.equal(ikeyOptIn.mode, 3, \"ikey feature optin should be enabled\");\n                    return true;\n                }\n                return false;\n            }, \"wait for core config update\", 60, 100) as any)\n        });\n\n    }\n}\n\n\nfunction hookFetch<T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): IFetchArgs[] {\n    let calls:IFetchArgs[] = [];\n    let global = getGlobal() as any;\n    global.fetch = function(input: RequestInfo, init?: RequestInit) {\n        calls.push({\n            input,\n            init\n        });\n        return createSyncPromise(executor);\n    }\n\n    return calls;\n}\n\n\n\n\n\n\n\n\nclass ChannelPlugin implements IPlugin {\n\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry(env: ITelemetryItem) {}\n\n    setNextPlugin(next: any) {\n        // no next setup\n    }\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n\n    }\n}\n\n\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript Idsync Plugin</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"pako\",\"./node_modules/pako/dist/pako\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n\n            var testModule = modules.add(\"Tests/Unit/src/cfgsync.tests\", \"./Unit/dist/cfgsync.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-cfgsync-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-cfgsync-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights CfgSync Plugin\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-cfgsync-js.js\",\n    \"module\": \"dist-es5/applicationinsights-cfgsync-js.js\",\n    \"types\": \"types/applicationinsights-cfgsync-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-cfgsync-js\"\n    },\n    \"scripts\": {\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt cfgsync\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt cfgsynctests\",\n        \"mintest\": \"grunt cfgsync-mintests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights idsync plugin\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt cfgsync-min\",\n        \"ai-restore\": \"grunt cfgsync-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"applicationinsights-cfgsync-js\";\nconst browserOutputName = \"ai.cfgsync\";\nconst entryPointName = \"applicationinsights-cfgsync-js\";\nconst outputName = \"applicationinsights-cfgsync-js\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Properties Plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ outputName ]);\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/src/CfgSyncHelperFuncs.ts",
    "content": "import {\n    CdnFeatureMode, FeatureOptInMode, IAppInsightsCore, IConfig, IConfiguration, IFeatureOptIn\n} from \"@microsoft/applicationinsights-core-js\";\nimport { isNullOrUndefined, isObject, objExtend, objForEachKey, setValueByKey } from \"@nevware21/ts-utils\";\nimport { ICfgSyncCdnConfig } from \"./Interfaces/ICfgSyncCdnConfig\";\nimport { NonOverrideCfg } from \"./Interfaces/ICfgSyncConfig\";\n\n/**\n * Delete a config key in the given cfg, if the config key exists in nonOverrideConfigs and its value is set to true\n * @param cfg - cfg to modify\n * @param nonOverrideConfigs - nonOverrideConfigs\n * @param curLevel - cur config level, starting at 0\n * @param maxLevel - max config level\n * @returns new copy of modified configs\n */\nexport function replaceByNonOverrideCfg<T=IConfiguration & IConfig, T1=NonOverrideCfg>(cfg: T , nonOverrideConfigs: T1, curLevel: number, maxLevel: number): T {\n    try {\n        let exceedMaxLevel = curLevel > maxLevel;\n        if (exceedMaxLevel) {\n            cfg = null;\n        }\n        let curCfg = curLevel == 0? objExtend({}, cfg): cfg;   // only copy cfg at the begining level\n        if (curCfg && nonOverrideConfigs && !exceedMaxLevel) {\n            objForEachKey(curCfg, (key) => {\n                let nonOverrideVal = nonOverrideConfigs[key];\n                if (!!nonOverrideVal) {\n                    if (isObject(curCfg[key]) && isObject(nonOverrideVal)) {\n                        curCfg[key] = replaceByNonOverrideCfg(curCfg[key], nonOverrideVal, ++curLevel, maxLevel);\n                    } else {\n                        delete curCfg[key];\n                    }\n                }\n            });\n        }\n        return curCfg;\n        \n    } catch(e) {\n        // eslint-disable-next-line no-empty\n    }\n\n    // if errors happen, do nothing\n    return cfg;\n}\n\n\n//                                                     CDN Mode, value = B (CDN value = B)\n//                                |--------------------------------------------------------------------------|-----------|\n//                                |                    | none        | disabled    | enabled     | forceOn   | forceOff  |\n//                                | ------------------ | ----------- | ----------- | ----------- | --------- | --------- |\n// | User Mode, value = A         | none               | none        | disabled    | enabled     | enabled   | disabled  |\n// (user Value = A)               | disabled           | disabled    | disabled    | disabled    | enabled   | disabled  |\n//                                | enabled            | enabled     | disabled    | enabled     | enabled   | disabled  |\n//                                | none(blockCdn)     | none        | none        | none        | none      | none      |\n//                                | disabled(blockCdn) | disabled    | disabled    | disabled    | disabled  | disabled  |\n//                                | enabled(blockCdn)  | enabled     | enabled     | enabled     | enabled   | enabled   |\n\n// This matrix identifies how feature based overrides are selected (if present)\n//                                cdn Mode (cdn Value = B)\n//                   |---------------------------------------------------------------------------|\n//                   |                    | none     | disabled | enabled  | forceOn  | forceOff |\n//                   | ------------------ | ---------| ---------| ---------| ---------|----------|\n// | User Mode       | none               | A        | A        | A || B   | B || A   | B || A   |\n// (user Value = A)  | disabled           | A        | A        | A        | B || A   | B || A   |\n//                   | enabled            | A        | A        | A || B   | B || A   | B || A   |\n//                   | none(blockCdn)     | A        | A        | A        | A        | A        |\n//                   | disabled(blockCdn) | A        | A        | A        | A        | A        |\n//                   | enabled(blockCdn)  | A        | A        | A        | A        | A        |\n// Note:\n// Where the \"value\" is an object (map) of encoded key/values which will be used to override the real configuration\n// A = either the user supplied enable/disable value (via the `config.featureOptIn[name]`) or if not defined by the user the SDK defaults of the same.\n// B = The enable/disable value obtained from the CDN for the named feature\n// These are evaluated based on the above matrix to either\n// - A (Always the user/sdk value)\n// - B (Always the value from the CDN)\n// - A || B (If A is null or undefined use the value from the CDN (B) otherwise A)\n// - B || A (If B is null or undefined use the user/SDK value otherwise use the value from the CDN)\n//\n// The result of the value may also be null / undefined, which means there are no overrides to apply when the feature is enabled\nconst F = \"featureOptIn.\";\nconst M = \".mode\";\nconst ON = \".onCfg\";\nconst OFF = \".offCfg\";\n\nexport function resolveCdnFeatureCfg(field: string, cdnCfg?: ICfgSyncCdnConfig, userOptInDetails?: IFeatureOptIn) {\n    // cdn conifg value\n    if (!cdnCfg || !cdnCfg.enabled) {\n        return null;\n    }\n\n    let cdnFt = (cdnCfg.featureOptIn || {})[field] || {mode: CdnFeatureMode.none};\n    let cdnM = cdnFt.mode;\n    let cdnOnV = cdnFt.onCfg;\n    let cdnOffV = cdnFt.offCfg;\n    let userFt = (userOptInDetails || {})[field] || {mode: FeatureOptInMode.disable}; // default user mode is disable\n    let userM = userFt.mode;\n    let userOnV= userFt.onCfg;\n    let userOffV= userFt.offCfg;\n    let blockCdn = !!userFt.blockCdnCfg;\n    let mFld = F + field + M;\n    let onFld = F + field + ON;\n    let offFld = F + field + OFF;\n\n    let mode = userM;\n    let onV =  userOnV;\n    let offV = userOffV;\n\n    if (!blockCdn) {\n        if (cdnM === CdnFeatureMode.forceOn || cdnM === CdnFeatureMode.forceOff) {\n\n            mode = (cdnM == CdnFeatureMode.forceOn? FeatureOptInMode.enable : FeatureOptInMode.disable);\n            onV = cdnOnV || userOnV;\n            offV = cdnOffV || userOffV;\n\n        } else if (cdnM === CdnFeatureMode.disable || userM === FeatureOptInMode.disable) {\n            \n            mode = FeatureOptInMode.disable;\n            onV =  userOnV || cdnOnV;\n            offV = userOffV || cdnOffV;\n\n        } else if (cdnM === CdnFeatureMode.enable) {\n            mode = FeatureOptInMode.enable;\n            onV =  userOnV || cdnOnV;\n            offV = userOffV || cdnOffV;\n\n        } else if (cdnM === CdnFeatureMode.none && userM === FeatureOptInMode.none) {\n            mode = FeatureOptInMode.none;\n        }\n\n    }\n    \n    return {\n        [mFld]: mode,\n        [onFld]: onV,\n        [offFld]: offV\n    };\n\n}\n\n\n\n// helper function to get cdn config with opt-in features\nexport function applyCdnfeatureCfg(cdnCfg: ICfgSyncCdnConfig, core: IAppInsightsCore) {\n    try {\n        if (!cdnCfg || !cdnCfg.enabled) {\n            return null;\n        }\n        if (!cdnCfg.featureOptIn) {\n            return cdnCfg.config;\n        }\n        let optInMap = cdnCfg.featureOptIn;\n        let cdnConfig = cdnCfg.config || {};\n        objForEachKey(optInMap, (key) => {\n            let featureVal = resolveCdnFeatureCfg(key, cdnCfg, core.config.featureOptIn);\n            if (!isNullOrUndefined(featureVal)) {\n                objForEachKey(featureVal, (config, val) => {\n                    setValueByKey(cdnConfig, config, val);\n                });\n                _overrideCdnCfgByFeature(key, featureVal, cdnConfig);\n            }\n        });\n        return cdnConfig;\n    } catch (e) {\n        // eslint-disable-next-line no-empty\n    }\n    return null;\n}\n\nfunction _overrideCdnCfgByFeature(field: string, ftVal: any, config: IConfiguration & IConfig) {\n    let mode = ftVal[F + field + M];\n    let val =  ftVal[F + field + ON];\n    let dVal=  ftVal[F + field + OFF];\n    let target = null;\n    if (mode === FeatureOptInMode.enable) {\n        target = val;\n    }\n\n    if (mode === FeatureOptInMode.disable) {\n        target = dVal;\n    }\n\n    if (target) {\n        objForEachKey(target, (key, cfg) => {\n            setValueByKey(config, key, cfg);\n        });\n    }\n\n}\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/src/CfgSyncPlugin.ts",
    "content": "/**\n* CfgSyncPlugin.ts\n* @copyright Microsoft 2018\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, DisabledPropertyName, IAppInsightsCore, IConfig, IConfigDefaults, IConfiguration, IPlugin, IProcessTelemetryContext,\n    IProcessTelemetryUnloadContext, ITelemetryItem, ITelemetryPluginChain, ITelemetryUnloadState, createProcessTelemetryContext,\n    createUniqueNamespace, eventOff, eventOn, getGlobal, getJSON, isFetchSupported, isXhrSupported, mergeEvtNamespace, onConfigChange,\n    sendCustomEvent\n} from \"@microsoft/applicationinsights-core-js\";\nimport { doAwaitResponse } from \"@nevware21/ts-async\";\nimport { ITimerHandler, isFunction, isNullOrUndefined, isPlainObject, objDeepFreeze, scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { applyCdnfeatureCfg, replaceByNonOverrideCfg } from \"./CfgSyncHelperFuncs\";\nimport {\n    ICfgSyncConfig, ICfgSyncEvent, ICfgSyncMode, NonOverrideCfg, OnCompleteCallback, SendGetFunction\n} from \"./Interfaces/ICfgSyncConfig\";\nimport { ICfgSyncPlugin } from \"./Interfaces/ICfgSyncPlugin\";\n\nconst EVENT_NAME = \"ai_cfgsync\";\nconst STR_GET_METHOD = \"GET\";\nconst FETCH_TIMEOUT = 1800000; // 30 minutes\nconst udfVal: undefined = undefined;\nlet defaultNonOverrideCfg: NonOverrideCfg  = {instrumentationKey: true, connectionString: true, endpointUrl: true }\nconst _defaultConfig: IConfigDefaults<ICfgSyncConfig> = objDeepFreeze({\n    syncMode: ICfgSyncMode.Broadcast,\n    blkCdnCfg: udfVal,\n    customEvtName: udfVal,\n    cfgUrl: udfVal,\n    overrideSyncFn: udfVal,\n    overrideFetchFn: udfVal,\n    onCfgChangeReceive: udfVal,\n    scheduleFetchTimeout: FETCH_TIMEOUT,\n    nonOverrideConfigs: defaultNonOverrideCfg,\n    enableAjax: false\n});\n\nexport class CfgSyncPlugin extends BaseTelemetryPlugin implements ICfgSyncPlugin {\n\n    public priority = 198;\n    public identifier = \"AppInsightsCfgSyncPlugin\";\n\n    constructor() {\n        super();\n\n        let _extensionConfig: ICfgSyncConfig;\n        let _mainConfig: IConfiguration & IConfig; // throttle config should be wrapped in IConfiguration\n        let _evtName: string;\n        let _evtNamespace: string | string[];\n        let _cfgUrl: string;\n        let _timeoutHandle: ITimerHandler;\n        let _receiveChanges: boolean;\n        let _broadcastChanges: boolean;\n        let _blkCdnCfg: boolean;\n        let _fetchTimeout: number;\n        let _retryCnt: number;\n        let _onCfgChangeReceive: (event: ICfgSyncEvent) => void;\n        let _nonOverrideConfigs: NonOverrideCfg;\n        let _fetchFn: SendGetFunction;\n        let _overrideFetchFn: SendGetFunction;\n        let _overrideSyncFn: (config?:IConfiguration & IConfig, customDetails?: any) => boolean;\n        let _paused = false;\n        let _enableAjax: boolean;\n\n        dynamicProto(CfgSyncPlugin, this, (_self, _base) => {\n\n            _initDefaults();\n\n            _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) => {\n                _base.initialize(config, core, extensions, pluginChain);\n                _evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());\n                _populateDefaults(config);\n            };\n\n            _self.getCfg = () => {\n                return _mainConfig;\n            }\n\n            _self.pause = () => {\n                _paused = true;\n                _clearScheduledTimer();\n            }\n\n            _self.resume = () => {\n                _paused = false;\n                _setupTimer();\n            }\n\n            // used for V2 to manaully trigger config udpate\n            _self.setCfg = (config?: IConfiguration & IConfig) => {\n                return _setCfg(config);\n            }\n\n            _self.sync = (customDetails?: any) => {\n                return _sendCfgsyncEvents(customDetails);\n            }\n\n            _self.updateEventListenerName = (eventName?: string) => {\n                return _updateEventListenerName(eventName);\n            }\n\n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _eventOff();\n                _clearScheduledTimer();\n                _initDefaults();\n            };\n\n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [_broadcastChanges, _receiveChanges, _evtName, _blkCdnCfg, _nonOverrideConfigs];\n            };\n    \n            function _initDefaults() {\n                _mainConfig = null;\n                _evtName = null;\n                _evtNamespace = null;\n                _cfgUrl = null;\n                _receiveChanges = null;\n                _broadcastChanges = null;\n                _nonOverrideConfigs = null;\n                _timeoutHandle = null;\n                _fetchTimeout = null;\n                _retryCnt = null;\n                _blkCdnCfg = null;\n                _enableAjax = false;\n                _overrideFetchFn = null;\n                _overrideSyncFn = null;\n                _onCfgChangeReceive = null;\n            }\n\n            function _populateDefaults(config: IConfiguration) {\n                let identifier = _self.identifier;\n                let core = _self.core;\n               \n                _self._addHook(onConfigChange(config, () => {\n                    let ctx = createProcessTelemetryContext(null, config, core);\n                    _extensionConfig = ctx.getExtCfg(identifier, _defaultConfig);\n                    let preBlkCdn = _blkCdnCfg;\n                    _blkCdnCfg = !!_extensionConfig.blkCdnCfg;\n                    _enableAjax = !!_extensionConfig.enableAjax;\n                    // avoid initial call\n                    if (!isNullOrUndefined(preBlkCdn) && preBlkCdn !== _blkCdnCfg) {\n                        if (!_blkCdnCfg && _cfgUrl) {\n                            _fetchFn && _fetchFn(_cfgUrl, _onFetchComplete, _broadcastChanges);\n                        } else {\n                            _clearScheduledTimer();\n                        }\n                    }\n\n                    if (isNullOrUndefined(_receiveChanges)) {\n                        _receiveChanges = _extensionConfig.syncMode === ICfgSyncMode.Receive;\n                    }\n                    if (isNullOrUndefined(_broadcastChanges)) {\n                        _broadcastChanges = _extensionConfig.syncMode === ICfgSyncMode.Broadcast;\n                    }\n                   \n                    let newEvtName =  _extensionConfig.customEvtName || EVENT_NAME;\n                    if (_evtName !== newEvtName) {\n                        if (_receiveChanges) {\n                            _updateEventListenerName(newEvtName);\n\n                        } else {\n                            _eventOff();\n                            _evtName = newEvtName;\n                        }\n\n                    }\n\n                    if (isNullOrUndefined(_cfgUrl)) {\n                        _cfgUrl = _extensionConfig.cfgUrl;\n                    }\n                    // if cfgUrl is set, we will ignore core config change\n                    if (!_cfgUrl) {\n                        _mainConfig = config;\n                        \n                        if (_broadcastChanges) {\n                            _sendCfgsyncEvents();\n                        }\n                    }\n                }));\n               \n                _overrideSyncFn = _extensionConfig.overrideSyncFn;\n                _overrideFetchFn = _extensionConfig.overrideFetchFn;\n                _onCfgChangeReceive = _extensionConfig.onCfgChangeReceive;\n                _nonOverrideConfigs = _extensionConfig.nonOverrideConfigs; // override values should not be changed\n               \n                _fetchTimeout = _extensionConfig.scheduleFetchTimeout;\n                _fetchFn = _getFetchFnInterface();\n                _retryCnt = 0;\n                \n                // NOT support cfgURL change to avoid mutiple fetch calls\n                if (_cfgUrl && !_blkCdnCfg) {\n                    _fetchFn && _fetchFn(_cfgUrl, _onFetchComplete, _broadcastChanges);\n                }\n            }\n\n            function _setCfg(config?: IConfiguration & IConfig, isAutoSync?: boolean) {\n                if (config) {\n                    _mainConfig = config;\n                    if (!!isAutoSync && !_paused) {\n                        return _sendCfgsyncEvents();\n                    }\n                    if (_receiveChanges && !_paused) {\n                        _self.core.updateCfg(config);\n                        return true;\n                    }\n                }\n                return false;\n            }\n\n            function _eventOff() {\n                try {\n                    let global = getGlobal();\n                    if (global) {\n                        eventOff(global, null, null,  _evtNamespace);\n                    }\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            }\n\n            function _sendCfgsyncEvents(customDetails?: any) {\n                try {\n                    if (!!_overrideSyncFn && isFunction(_overrideSyncFn)) {\n                        return _overrideSyncFn(_mainConfig, customDetails);\n                    }\n                    return sendCustomEvent(_evtName, _mainConfig, customDetails);\n\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return false;\n            }\n\n            function _updateEventListenerName(name?: string) {\n                try {\n                    _eventOff();\n                    if (name) {\n                        _evtName = name;\n                        _addEventListener();\n                    }\n                    return true;\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return false;\n            }\n\n\n            function _getFetchFnInterface() {\n                let _fetchFn = _overrideFetchFn;\n                if (isNullOrUndefined(_fetchFn)) {\n                    if (isFetchSupported()) {\n                        _fetchFn = _fetchSender;\n                    } else if (isXhrSupported()) {\n                        _fetchFn = _xhrSender;\n                    }\n                }\n                return _fetchFn;\n            }\n\n\n            function _fetchSender(url: string, oncomplete: OnCompleteCallback, isAutoSync?:  boolean) {\n                let global = getGlobal();\n                let fetchFn = (global && global.fetch) || null;\n                if (url && fetchFn && isFunction(fetchFn)) {\n                    try {\n                        const init: RequestInit = {\n                            method: STR_GET_METHOD\n                        };\n                        if (!_enableAjax) {\n                            init[DisabledPropertyName] = true;\n                        }\n\n                        const request = new Request(url, init);\n                        if (!_enableAjax) {\n                            try {\n                                // Also try and tag the request (just in case the value in init is not copied over)\n                                request[DisabledPropertyName] = true;\n                            } catch(e) {\n                                // If the environment has locked down the XMLHttpRequest (preventExtensions and/or freeze), this would\n                                // cause the request to fail and we no telemetry would be sent\n                            }\n                        }\n                  \n                        doAwaitResponse(fetch(request), (result) => {\n                            let response = result.value;\n                          \n                            if (!result.rejected) {\n                                if (response.ok) {\n                                    doAwaitResponse(response.text(), (res) => {\n                                        _doOnComplete(oncomplete, response.status, res.value, isAutoSync);\n                                    });\n                                } else {\n                                    _doOnComplete(oncomplete, response.status, null, isAutoSync);\n                                }\n                            } else {\n                                _doOnComplete(oncomplete, 400);\n                            }\n                        });\n                    } catch (e) {\n                        // eslint-disable-next-line no-empty\n                    }\n                }\n            }\n\n            function _xhrSender(url: string, oncomplete: OnCompleteCallback, isAutoSync?: boolean) {\n                try {\n                    let xhr = new XMLHttpRequest();\n                    if (!_enableAjax) {\n                        xhr[DisabledPropertyName] = true;\n                    }\n                    xhr.open(STR_GET_METHOD, url);\n                    xhr.onreadystatechange = () => {\n                        if (xhr.readyState === XMLHttpRequest.DONE) {\n                            _doOnComplete(oncomplete, xhr.status, xhr.responseText, isAutoSync);\n                        }\n                    };\n                    xhr.onerror = () => {\n                        _doOnComplete(oncomplete, 400);\n                    };\n                    xhr.ontimeout = () => {\n                        _doOnComplete(oncomplete, 400);\n                    };\n                    xhr.send();\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            }\n\n            function _onFetchComplete(status: number, response?: string, isAutoSync?: boolean) {\n                try {\n                    if (status >= 200 && status < 400 && response) {\n                        _retryCnt = 0; // any successful response will reset retry count to 0\n                        let JSON = getJSON();\n                        if (JSON) {\n                            let cdnCfg = JSON.parse(response); //comments are not allowed\n                            let cfg = applyCdnfeatureCfg(cdnCfg, _self.core);\n                            let newCfg = cfg && isPlainObject(cfg) && _replaceTartgetByKeys(cfg);\n                            newCfg && _setCfg(newCfg, isAutoSync);\n                            //cfg && _setCfg(cfg, isAutoSync);\n                        }\n                    } else {\n                        _retryCnt ++;\n                    }\n                    \n                    if (_retryCnt < 3) {\n                        _setupTimer();\n                    }\n                    \n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            }\n\n            function _doOnComplete(oncomplete: OnCompleteCallback, status: number, response?: string, isAutoSync?: boolean) {\n                try {\n                    oncomplete(status, response, isAutoSync);\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            }\n\n            function _addEventListener() {\n                if (_receiveChanges) {\n                    let global = getGlobal();\n                    if (global) {\n                        try {\n                            eventOn(global, _evtName, (event: any) => {\n                                // TODO: add more validation here\n                                // may include a \"name\" or some other features to check\n                                let cfgEvent = event && (event as any).detail;\n                                if (_onCfgChangeReceive && cfgEvent) {\n                                    _onCfgChangeReceive(cfgEvent);\n                                } else {\n                                    let cfg = cfgEvent && cfgEvent.cfg;\n                                    let newCfg = cfg && isPlainObject(cfg) && _replaceTartgetByKeys(cfg);\n                                    newCfg && _setCfg(newCfg);\n                                }\n                            }, _evtNamespace, true);\n\n                        } catch(e) {\n                            // eslint-disable-next-line no-empty\n                        }\n                    }\n                }\n            }\n\n            // 4 levels\n            function _replaceTartgetByKeys<T=IConfiguration & IConfig>(cfg: T , level?: number) {\n                let _cfg: IConfiguration & IConfig = null;\n                try {\n                    if (cfg) {\n                        _cfg = replaceByNonOverrideCfg(cfg, _nonOverrideConfigs, 0, 5);\n                    }\n                } catch(e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return _cfg;\n            }\n\n            /**\n             * Sets up the timer which triggers fetching cdn every 30mins after inital call\n             */\n            function _setupTimer() {\n                if (!_timeoutHandle && _fetchTimeout) {\n                    _timeoutHandle = scheduleTimeout(() => {\n                        _timeoutHandle = null;\n                        _fetchFn(_cfgUrl, _onFetchComplete, _broadcastChanges);\n                    }, _fetchTimeout);\n                    _timeoutHandle.unref();\n                }\n            }\n\n            function _clearScheduledTimer() {\n                _timeoutHandle && _timeoutHandle.cancel();\n                _timeoutHandle = null;\n                _retryCnt = 0;\n            }\n        \n\n            _self.processTelemetry = (env: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                _self.processNext(env, itemCtx);\n            };\n\n        });\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get current configs of current instance.\n     * @param config - current configs\n     */\n    public getCfg(): IConfiguration & IConfig {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Manually set configs of current instance.\n     * @param config - new configs\n    */\n    public setCfg(config?: IConfiguration & IConfig): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Manually broadcast configs of current instance to all other instances.\n     * @param customDetails - additional details should also be sent out to other instances\n    */\n    public sync(customDetails?: any): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Manually update event name.\n     * If current instance is the main instance, then following config changes will be sent out under this new event name.\n     * If current instance is listener instances, it will listen to event details under this new name.\n     * @param eventName - new event name\n     */\n    public updateEventListenerName(eventName?: string): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Pause the sending/receiving of events\n     */\n    public pause(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resume the sending/receiving of events\n     */\n    public resume(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n   \n    // /**\n    //  * Add Part A fields to the event\n    //  * @param event - The event that needs to be processed\n    //  */\n    public processTelemetry(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/src/Interfaces/ICfgSyncCdnConfig.ts",
    "content": "import { CdnFeatureMode, IConfiguration } from \"@microsoft/applicationinsights-core-js\";\n\nexport interface ICfgSyncCdnConfig {\n    /**\n     * Identifies whether cfgSync plugin should be enabled or not\n     * @default false\n     */\n    enabled?: boolean;\n    /**\n     * Identifies if the feature should be opt-in or disabled and sets configuration values\n     * @default undefined\n     */\n    featureOptIn?: {[field: string]: ICdnFeatureOptIn};\n    /**\n     * Identifies IConfiguration that will be used for IConfigSync Plugin, especially throttleMgr Config\n     * @default undefined\n     */\n    config?: IConfiguration;\n\n    /**\n     * Identifies fields of IConfiguration should be overridden (not in use currently)\n     * only override for opt-in instances when enabled is set to true\n     * NOTE: should use flat string for fields, for example, if you want to use extensionConfig.Ananlytics.disableAjaxTrackig as one opt-in field,\n     * you should use \"extensionConfig.Ananlytics.disableAjaxTrackig\" as field name\n     * TODO: add implementations on this config\n     * @example overrides:{\"endpointUrl\":{\"endpoint1\":\"endpoint2\", \"endpoint3\":\"endpoint4\"}, \"extensionConfig.Analytics.disableAjaxTrackig\":{\"true\": false}}\n     * @default undefined\n     */\n    overrides?: {[field: string]: {[value: string]: any}};\n}\n\nexport interface ICdnFeatureOptIn {\n    /**\n     * Identifies current cdn opt in mode\n     */\n    mode: CdnFeatureMode,\n    /**\n    * Identifies override configuration values when given feature is enabled\n    * NOTE: should use flat string for fields, for example, if you want to set value for extensionConfig.Ananlytics.disableAjaxTrackig in configurations,\n    * you should use \"extensionConfig.Ananlytics.disableAjaxTrackig\" as field name: {[\"extensionConfig.Analytics.disableAjaxTrackig\"]:1}\n    * Default: undefined\n    */\n    onCfg?: {[field: string]: any};\n    /**\n      * Identifies override configuration values when given feature is disabled\n      * NOTE: should use flat string for fields, for example, if you want to set value for extensionConfig.Ananlytics.disableAjaxTrackig in configurations,\n      * you should use \"extensionConfig.Ananlytics.disableAjaxTrackig\" as field name: {[\"extensionConfig.Analytics.disableAjaxTrackig\"]:1}\n      * Default: undefined\n      */\n    offCfg?: {[field: string]: any};\n    \n}"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/src/Interfaces/ICfgSyncConfig.ts",
    "content": "import { IConfig, IConfiguration } from \"@microsoft/applicationinsights-core-js\";\n\nexport interface ICfgSyncConfig {\n    /**\n     * Identifies whether instance should receive or broadcast config changes\n     * @default Broadcast\n     */\n    syncMode?: ICfgSyncMode;\n    /**\n     * Event name for sending or listening to configuration change details\n     * @default ai_cfgsync\n     */\n    customEvtName?: string;\n     /**\n     * CDN endpoint for fetching configuration. If cfgUrl is defined, instance will NOT listen to core configuration changes.\n     * @default null\n     */\n    cfgUrl?: string;\n    /**\n     * Determines if fetching the CDN endpoint should be blocked or not.\n     * @default false\n     */\n    blkCdnCfg?: boolean;\n    /**\n     *  Overrides callback function to handle event details when changes are received via event listener.\n     * @default null\n     */\n    onCfgChangeReceive?: (event?: ICfgSyncEvent) => void;\n    /**\n     * Overrides sync() function to broadcast changes.\n     * @default null\n     */\n    overrideSyncFn?: (config?:IConfiguration & IConfig, customDetails?: any) => boolean;\n    /**\n     * Overrides fetch function to get config from cfgUrl when cfgUrl is defined.\n     * @default null\n     */\n    overrideFetchFn?: SendGetFunction;\n    /**\n     * When current instance is set with syncMode: `Receive`, config fields under nonOverrideConfigs will NOT be changed by any config details sent out from other instances.\n     * NOTE: this config will be ONLY applied during initialization, so it won't be changed dynamically\n     * @default \\{instrumentationKey:true,connectionString:true,endpointUrl:true\\}\n     */\n    nonOverrideConfigs?: NonOverrideCfg;\n    /**\n     * Identifies the time interval (in milliseconds) for fetching config details from cfgUrl when cfgUrl is defined.\n     * Default to 30 mins, 30*60*1000ms.\n     * If set to 0, the fetch operation will only be called once during initialization.\n     * @default 30mins (30*60*1000ms)\n     */\n    scheduleFetchTimeout?: number;\n\n    /**\n     * An internal flag to determine if sending requests with the internal endpoints as dependency requests.\n     * @internal\n     * @default false\n     * @since 3.3.6\n     */\n    enableAjax?: boolean;\n}\n\nexport const enum ICfgSyncMode {\n    /**\n     * Instance will NOT receive config changes or broadcast changes\n     */\n    None = 0,\n    /**\n     * Instance will only broadcast config changes but NOT receive changes\n     */\n    Broadcast = 1,\n    /**\n     * Instance will only receive config changes but NOT broadcast changes\n     */\n    Receive = 2\n}\n\nexport interface ICfgSyncEvent {\n     /**\n     * Identifies config changes are expected to send out to other instances.\n     */\n    cfg?: IConfiguration & IConfig;\n     /**\n     * Identifies additional details that are expected to send out with config changes.\n     */\n    customDetails?: any;\n}\n\nexport type NonOverrideCfg<T = IConfiguration & IConfig> = {\n    /**\n     * Identifies config that should NOT be changed when the config is set to TRUE.\n     * If it is set to undefined, null or false, changes will be applied to this config.\n     * Default: undefined\n     */\n    [key in keyof T]?: boolean | NonOverrideCfg<T[key]> | undefined;\n}\nexport type OnCompleteCallback = (status: number, response?: string, isAutoSync?: boolean) => void;\nexport type SendGetFunction = (url: string, oncomplete: OnCompleteCallback, isAutoSync?: boolean) => void;\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/src/Interfaces/ICfgSyncPlugin.ts",
    "content": "import { IConfig, IConfiguration } from \"@microsoft/applicationinsights-core-js\";\n\nexport declare interface ICfgSyncPlugin {\n    /**\n     * Get current configs of current instance.\n     * @param config - current configs\n     */\n    getCfg(): IConfiguration & IConfig;\n    /**\n     * Manually set configs of current instance.\n     * @param config - new configs\n     */\n    setCfg(config?:IConfiguration & IConfig): boolean;\n    /**\n     * Manually broadcast configs of current instance to all other instances.\n     * @param customDetails - additional details should also be sent out to other instances\n     */\n    sync(customDetails?: any): boolean;\n    /**\n     * Manually update event name.\n     * If current instance is the main instance, then following config changes will be sent out under this new event name.\n     * If current instance is listener instances, it will listen to event details under this new name.\n     * @param eventName - new event name\n     */\n    updateEventListenerName(eventName?: string): boolean;\n    /**\n     * Pause the sending/receiving of events\n     */\n    pause(): void;\n     /**\n     * Resume the sending/receiving of events\n     */\n    resume(): void;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/src/applicationinsights-cfgsync-js.ts",
    "content": "import { CfgSyncPlugin } from \"./CfgSyncPlugin\";\nimport {\n    ICfgSyncConfig, ICfgSyncEvent, ICfgSyncMode, NonOverrideCfg, OnCompleteCallback, SendGetFunction\n} from \"./Interfaces/ICfgSyncConfig\";\nimport { ICfgSyncPlugin } from \"./Interfaces/ICfgSyncPlugin\";\n\nexport { CfgSyncPlugin, ICfgSyncPlugin, ICfgSyncConfig, ICfgSyncEvent, ICfgSyncMode, NonOverrideCfg, OnCompleteCallback, SendGetFunction };\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"prefer-conditional-expression\": false\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-cfgsync-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-cfgsync-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-cfgsync-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-cfgsync-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-cfgsync-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Click Analytics Plugin\n\nClick Analytics Plugin for the Application Insights Javascript SDK, enables automatic tracking of the click events on web pages based on `data-*` meta tags.\nThis plugin uses the `data-*` global attributes to capture the click events and populate telemetry data.\n\n## How to effectively use the plugin\n\n1. Telemetry data generated from the click events are stored as `customEvents` in the Application Insights section of the Azure portal.\n2. The `name` of the customEvent is populated based on the following rules:\n    1.  The `id` provided in the `data-*-id` will be used as the customEvent name. For example, if the clicked HTML element has the attribute \"data-sample-id\"=\"button1\", then \"button1\" will be the customEvent name.\n    2. If no such attribute exists and if the `useDefaultContentNameOrId` is set to `true` in the configuration, then the clicked element's HTML attribute `id` or content name of the element will be used as the customEvent name. If both `id` and content name are present, precedence is given to `id`.\n    3. If `useDefaultContentNameOrId` is false, then the customEvent name will be \"not_specified\".\n\n    > [!TIP]\n    > Our recommendations is to set `useDefaultContentNameOrId` to true for generating meaningful data.  \n3. `parentDataTag` does two things:\n    1. If this tag is present, the plugin will fetch the `data-*` attributes and values from all the parent HTML elements of the clicked element.\n    2. To improve efficiency, the plugin uses this tag as a flag, when encountered it will stop itself from further processing the DOM (Document Object Model) upwards.\n    \n    > [!CAUTION]\n    > Once `parentDataTag` is used, the SDK will begin looking for parent tags across your entire application and not just the HTML element where you used it.\n4. `customDataPrefix` provided by the user should always start with `data-`, for example `data-sample-`. In HTML the `data-*` global attributes form a class of attributes called custom data attributes, that allow proprietary information to be exchanged between the HTML and its DOM representation by scripts. Older browsers (Internet Explorer, Safari) will drop attributes that it doesn't understand, unless they start with `data-`.\n\n    The `*` in `data-*`  may be replaced by any name following the [production rule of XML names](https://www.w3.org/TR/REC-xml/#NT-Name) with the following restrictions:\n    - The name must not start with \"xml\", whatever case is used for these letters.\n    - The name must not contain any semicolon (U+003A).\n    - The name must not contain capital letters.\n\n## What data does the plugin collect\n\nThe following are some of the key properties captured by default when the plugin is enabled:\n\n### Custom Event Properties\n| Name                  | Description                            | Sample          |\n| --------------------- | ---------------------------------------|-----------------|\n| name                  | The `name` of the customEvent. More info on how this is populated is shown [here](#how-to-effectively-use-the-plugin).| About              |\n| itemType              | Type of event.                                      | customEvent      |\n|sdkVersion             | version of Application Insights SDK along with click plugin|javascript:2.6.2_ClickPlugin2.6.2|\n\n### Custom Dimensions\n| Name                  | Description                            | Sample          |\n| --------------------- | ---------------------------------------|-----------------|\n| actionType            | Action type that caused the click event. Can be left-click or right-click. | CL              |\n| baseTypeSource        | Base Type source of the custom event.                                      | ClickEvent      |\n| clickCoordinates      | Coordinates where the click event is triggered.                            | 659X47          |\n| content               | Placeholder to store additional `data-*` attributes and values.            | [{sample1:value1, sample2:value2}] |\n| pageName              | Title of the page where the click event is triggered.                      | Sample Title    |\n| parentId              | Id or name of the parent element                                           | navbarContainer |\n\n### Custom Measurements\n| Name                  | Description                            | Sample          |\n| --------------------- | ---------------------------------------|-----------------|\n| timeToAction          | Time taken in millisecs for the user to click the element since initial page load | 87407              |\n\n## Getting Started\n\n## NPM Setup (ignore if using Snippet Setup)\n\nInstall npm package:\n\n```bash\nnpm install --save @microsoft/applicationinsights-clickanalytics-js @microsoft/applicationinsights-web\n```\n\n```js\n\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { ClickAnalyticsPlugin } from '@microsoft/applicationinsights-clickanalytics-js';\n\nconst clickPluginInstance = new ClickAnalyticsPlugin();\n// Click Analytics configuration\nconst clickPluginConfig = {\n  autoCapture: true\n};\n// Application Insights Configuration\nconst configObj = {\n  connectionString: 'YOUR_CONNECTION_STRING',\n  extensions: [clickPluginInstance],\n  extensionConfig: {\n    [clickPluginInstance.identifier]: clickPluginConfig\n  },\n};\n\nconst appInsights = new ApplicationInsights({ config: configObj });\nappInsights.loadAppInsights();\n```\n\n## Snippet Setup (ignore if using NPM setup)\n\n```html\n<script type=\"text/javascript\" src=\"https://js.monitor.azure.com/scripts/b/ext/ai.clck.2.6.2.min.js\"></script>\n<script type=\"text/javascript\">\n  var clickPluginInstance = new Microsoft.ApplicationInsights.ClickAnalyticsPlugin();\n  // Click Analytics configuration\n  var clickPluginConfig = {\n    autoCapture : true,\n    dataTags: {\n      useDefaultContentNameOrId: true\n    }\n  }\n  // Application Insights Configuration\n  var configObj = {\n    connectionString: 'YOUR CONNECTION STRING\",\n    extensions: [\n      clickPluginInstance\n    ],\n    extensionConfig: {\n      [clickPluginInstance.identifier] : clickPluginConfig\n    },\n  };\n  // Application Insights Snippet code\n  !function(T,l,y){<!-- Removed the Snippet code for brevity -->}(window,document,{\n    src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n    crossOrigin: \"anonymous\",\n    cfg: configObj\n  });\n</script>\n```\n\n## [Configuration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html)\n\n| Name                  | Type                               | Default | Description                                                                                                                              |\n| --------------------- | -----------------------------------| --------| ---------------------------------------------------------------------------------------------------------------------------------------- |\n| [autoCapture](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#autoCapture)           | boolean                            | true    | Automatic capture configuration.                                |\n| [callback](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#callback)              | [IValueCallback](#ivaluecallback)  | null    | Callbacks configuration.                               |\n| [pageTags](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#pageTags)              | string                             | null    | Page tags.                                             |\n| [dataTags](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#dataTags)              | [ICustomDataTags](#icustomdatatags)| null    | Custom Data Tags provided to override default tags used to capture click data. |\n| [urlCollectHash](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#urlCollectHash)        | boolean                            | false   | Enables the logging of values after a \"#\" character of the URL.                |\n| [urlCollectQuery](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#urlCollectQuery)       | boolean                            | false   | Enables the logging of the query string of the URL.                            |\n| [behaviorValidator](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#behaviorValidator)     | Function                           | null  | Callback function to use for the `data-*-bhvr` value validation. For more information, go to [behaviorValidator section](#behaviorvalidator).|\n| [defaultRightClickBhvr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#defaultRightClickBhvr) | string (or) number                 | ''      | Default Behavior value when Right Click event has occurred. This value will be overridden if the element has the `data-*-bhvr` attribute. |\n| [dropInvalidEvents](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IClickAnalyticsConfiguration.html#dropInvalidEvents)     | boolean                            | false   | Flag to drop events that do not have useful click data.                                                                                   |\n\n### [IValueCallback](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IValueCallback.html)\n\n| Name               | Type     | Default | Description                                                                             |\n| ------------------ | -------- | ------- | --------------------------------------------------------------------------------------- |\n| [pageName](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IValueCallback.html#pageName)           | Function | null    | Function to override the default pageName capturing behavior.                           |\n| [pageActionPageTags](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IValueCallback.html#pageActionPageTags) | Function | null    | A callback function to augment the default pageTags collected during pageAction event.  |\n| [contentName](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/IValueCallback.html#contentName)        | Function | null    | A callback function to populate customized contentName.                                 |\n\n### [ICustomDataTags](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html)\n\n| Name                      | Type    | Default   | Default Tag to Use in HTML |   Description                                                                                |\n|---------------------------|---------|-----------|-------------|----------------------------------------------------------------------------------------------|\n| [useDefaultContentNameOrId](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html#useDefaultContentNameOrId) | boolean | false     | N/A         |Collects standard HTML attribute for contentName when a particular element is not tagged with default customDataPrefix or when customDataPrefix is not provided by user. |\n| [customDataPrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html#customDataPrefix)          | string  | `data-`   | `data-*`| Automatic capture content name and value of elements that are tagged with provided prefix. For example, `data-*-id`, `data-<yourcustomattribute>` can be used in the HTML tags.   |\n| [aiBlobAttributeTag](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html#aiBlobAttributeTag)        | string  | `ai-blob` |  `data-ai-blob`| Plugin supports a JSON blob attribute instead of individual `data-*` attributes. |\n| [metaDataPrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html#metaDataPrefix)            | string  | null      | N/A  | Automatic capture HTML Head's meta element name and content with provided prefix when capture. For example, `custom-` can be used in the HTML meta tag. |\n| [captureAllMetaDataContent](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html#captureAllMetaDataContent) | boolean | false     | N/A   | Automatic capture all HTML Head's meta element names and content. Default is false. If enabled this will override provided metaDataPrefix. |\n| [parentDataTag](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html#parentDataTag)             | string  | null      |  N/A  | Stops traversing up the DOM to capture content name and value of elements when encountered with this tag. For example, `data-<yourparentDataTag>` can be used in the HTML tags.|\n| [dntDataTag](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-clickanalytics-js/interfaces/ICustomDataTags.html#dntDataTag)                | string  | `ai-dnt`  |  `data-ai-dnt`| HTML elements with this attribute will be ignored by the plugin for capturing telemetry data.|\n\n### behaviorValidator\n\nThe behaviorValidator functions automatically checks that tagged behaviors in code conform to a pre-defined list. This ensures tagged behaviors are consistent with your enterprise's established taxonomy. It is not required or expected that most Azure Monitor customers will use this, but it's available for advanced scenarios. There are three different behaviorValidator callback functions exposed as part of this extension. However, users can use their own callback functions if the exposed functions do not solve your requirement. The intent is to bring your own behaviors data structure, the plugin uses this validator function while extracting the behaviors from the data tags.\n\n| Name                   | Description                                                                        |\n| ---------------------- | -----------------------------------------------------------------------------------|\n| BehaviorValueValidator | Use this callback function if your behaviors data structure is an array of strings.|\n| BehaviorMapValidator   | Use this callback function if your behaviors data structure is a dictionary.       |\n| BehaviorEnumValidator  | Use this callback function if your behaviors data structure is an Enum.            |\n\n#### Sample usage with behaviorValidator\n\n```js\nvar clickPlugin = Microsoft.ApplicationInsights.ClickAnalyticsPlugin;\nvar clickPluginInstance = new clickPlugin();\n\n// Behavior enum values\nvar behaviorMap = {\n  UNDEFINED: 0, // default, Undefined\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Page Experience [1-19]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  NAVIGATIONBACK: 1, // Advancing to the previous index position within a webpage\n  NAVIGATION: 2, // Advancing to a specific index position within a webpage\n  NAVIGATIONFORWARD: 3, // Advancing to the next index position within a webpage\n  APPLY: 4, // Applying filter(s) or making selections\n  REMOVE: 5, // Applying filter(s) or removing selections\n  SORT: 6, // Sorting content\n  EXPAND: 7, // Expanding content or content container\n  REDUCE: 8, // Sorting content\n  CONTEXTMENU: 9, // Context Menu\n  TAB: 10, // Tab control\n  COPY: 11, // Copy the contents of a page\n  EXPERIMENTATION: 12, // Used to identify a third party experimentation event\n  PRINT: 13, // User printed page\n  SHOW: 14, //  Displaying an overlay\n  HIDE: 15, //  Hiding an overlay\n  MAXIMIZE: 16, //  Maximizing an overlay\n  MINIMIZE: 17, // Minimizing an overlay\n  BACKBUTTON: 18, //  Clicking the back button\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Scenario Process [20-39]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  STARTPROCESS: 20, // Initiate a web process unique to adopter\n  PROCESSCHECKPOINT: 21, // Represents a checkpoint in a web process unique to adopter\n  COMPLETEPROCESS: 22, // Page Actions that complete a web process unique to adopter\n  SCENARIOCANCEL: 23, // Actions resulting from cancelling a process/scenario\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Download [40-59]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  DOWNLOADCOMMIT: 40, // Initiating an unmeasurable off-network download\n  DOWNLOAD: 41, // Initiating a download\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Search [60-79]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  SEARCHAUTOCOMPLETE: 60, // Auto-completing a search query during user input\n  SEARCH: 61, // Submitting a search query\n  SEARCHINITIATE: 62, // Initiating a search query\n  TEXTBOXINPUT: 63, // Typing or entering text in the text box\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Commerce [80-99]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  VIEWCART: 82, // Viewing the cart\n  ADDWISHLIST: 83, // Adding a physical or digital good or services to a wishlist\n  FINDSTORE: 84, // Finding a physical store\n  CHECKOUT: 85, // Before you fill in credit card info\n  REMOVEFROMCART: 86, // Remove an item from the cart\n  PURCHASECOMPLETE: 87, // Used to track the pageView event that happens when the CongratsPage or Thank You page loads after a successful purchase\n  VIEWCHECKOUTPAGE: 88, // View the checkout page\n  VIEWCARTPAGE: 89, // View the cart page\n  VIEWPDP: 90, // View a PDP\n  UPDATEITEMQUANTITY: 91, // Update an item's quantity\n  INTENTTOBUY: 92, // User has the intent to buy an item\n  PUSHTOINSTALL: 93, // User has selected the push to install option\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Authentication [100-119]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  SIGNIN: 100, // User sign-in\n  SIGNOUT: 101, // User sign-out\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Social [120-139]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  SOCIALSHARE: 120, // \"Sharing\" content for a specific social channel\n  SOCIALLIKE: 121, // \"Liking\" content for a specific social channel\n  SOCIALREPLY: 122, // \"Replying\" content for a specific social channel\n  CALL: 123, // Click on a \"call\" link\n  EMAIL: 124, // Click on an \"email\" link\n  COMMUNITY: 125, // Click on a \"community\" link\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Feedback [140-159]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  VOTE: 140, // Rating content or voting for content\n  SURVEYCHECKPOINT: 145, // reaching the survey page/form\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Registration, Contact [160-179]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  REGISTRATIONINITIATE: 161, // Initiating a registration process\n  REGISTRATIONCOMPLETE: 162, // Completing a registration process\n  CANCELSUBSCRIPTION: 163, // Canceling a subscription\n  RENEWSUBSCRIPTION: 164, // Renewing a subscription\n  CHANGESUBSCRIPTION: 165, // Changing a subscription\n  REGISTRATIONCHECKPOINT: 166, // Reaching the registration page/form\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Chat [180-199]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  CHATINITIATE: 180, // Initiating a chat experience\n  CHATEND: 181, // Ending a chat experience\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Trial [200-209]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  TRIALSIGNUP: 200, // Signing-up for a trial\n  TRIALINITIATE: 201, // Initiating a trial\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Signup [210-219]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  SIGNUP: 210, // Signing-up for a notification or service\n  FREESIGNUP: 211, // Signing-up for a free service\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Referals [220-229]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  PARTNERREFERRAL: 220, // Navigating to a partner's web property\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Intents [230-239]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  LEARNLOWFUNNEL: 230, // Engaging in learning behavior on a commerce page (ex. \"Learn more click\")\n  LEARNHIGHFUNNEL: 231, // Engaging in learning behavior on a non-commerce page (ex. \"Learn more click\")\n  SHOPPINGINTENT: 232, // Shopping behavior prior to landing on a commerce page\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // Video [240-259]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  VIDEOSTART: 240, // Initiating a video\n  VIDEOPAUSE: 241, // Pausing a video\n  VIDEOCONTINUE: 242, // Pausing or resuming a video.\n  VIDEOCHECKPOINT: 243, // Capturing predetermined video percentage complete.\n  VIDEOJUMP: 244, // Jumping to a new video location.\n  VIDEOCOMPLETE: 245, // Completing a video (or % proxy)\n  VIDEOBUFFERING: 246, // Capturing a video buffer event\n  VIDEOERROR: 247, // Capturing a video error\n  VIDEOMUTE: 248, // Muting a video\n  VIDEOUNMUTE: 249, // Unmuting a video\n  VIDEOFULLSCREEN: 250, // Making a video full screen\n  VIDEOUNFULLSCREEN: 251, // Making a video return from full screen to original size\n  VIDEOREPLAY: 252, // Making a video replay\n  VIDEOPLAYERLOAD: 253, // Loading the video player\n  VIDEOPLAYERCLICK: 254, //  Click on a button within the interactive player\n  VIDEOVOLUMECONTROL: 255, //  Click on video volume control\n  VIDEOAUDIOTRACKCONTROL: 256, // Click on audio control within a video\n  VIDEOCLOSEDCAPTIONCONTROL: 257, //  Click on the closed caption control\n  VIDEOCLOSEDCAPTIONSTYLE: 258, //  Click to change closed caption style\n  VIDEORESOLUTIONCONTROL: 259, //  Click to change resolution\n\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  // \tAdvertisement Engagement [280-299]\n  ///////////////////////////////////////////////////////////////////////////////////////////////////\n  ADBUFFERING: 283, // Ad is buffering\n  ADERROR: 284, // Ad error\n  ADSTART: 285, // Ad start\n  ADCOMPLETE: 286, // Ad complete\n  ADSKIP: 287, // Ad skipped\n  ADTIMEOUT: 288, // Ad timed-out\n  OTHER: 300 // Other\n};\n\n// Application Insights Configuration\nvar configObj = {\n    connectionString: \"YOUR CONNECTION STRING\",\n  extensions: [clickPluginInstance],\n  extensionConfig: {\n    [clickPluginInstance.identifier]: {\n      behaviorValidator: Microsoft.ApplicationInsights.BehaviorMapValidator(behaviorMap),\n      defaultRightClickBhvr: 9\n    },\n  },\n};\nvar appInsights = new Microsoft.ApplicationInsights.ApplicationInsights({\n  config: configObj\n});\nappInsights.loadAppInsights();\n```\n\n## Sample app\n\n[Simple web app with Click Analytics Auto-collection Plugin enabled](https://go.microsoft.com/fwlink/?linkid=2152871).\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/ClickEventTest.ts",
    "content": "/**\n * @copyright Microsoft 2020\n */\n\nimport { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { IConfig, utlCanUseLocalStorage } from \"@microsoft/applicationinsights-core-js\";\nimport { ITelemetryItem, AppInsightsCore, IPlugin, IConfiguration, DiagnosticLogger, hasDocument, isFunction, IAppInsightsCore } from '@microsoft/applicationinsights-core-js';\nimport { ClickAnalyticsPlugin, BehaviorMapValidator, BehaviorValueValidator, BehaviorEnumValidator } from '../../../src/ClickAnalyticsPlugin';\nimport { PageAction } from \"../../../src/events/PageAction\";\nimport { DomContentHandler } from '../../../src/handlers/DomContentHandler';\nimport { IClickAnalyticsConfiguration, IPageActionOverrideValues } from '../../../src/Interfaces/Datamodel';\nimport { sanitizeUrl } from \"../../../src/DataCollector\";\nimport { DEFAULT_AI_BLOB_ATTRIBUTE_TAG, DEFAULT_DATA_PREFIX, DEFAULT_DONOT_TRACK_TAG } from \"../../../src/common/Utils\";\nimport { PropertiesPlugin } from \"@microsoft/applicationinsights-properties-js\";\nimport { strContains } from \"@nevware21/ts-utils\";\n\nexport class ClickEventTest extends AITestClass {\n    public testInitialize() {\n        if (utlCanUseLocalStorage()) {\n            window.localStorage.clear();\n        }\n    }\n\n    public testCleanup() {\n        if (utlCanUseLocalStorage()) {\n            window.localStorage.clear();\n        }\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"clickPlugin: config can be set from roots dynamically\",\n            useFakeTimers: true,\n            test: () => {\n                const dataTagsDefault = {\n                    useDefaultContentNameOrId: false,\n                    aiBlobAttributeTag: DEFAULT_AI_BLOB_ATTRIBUTE_TAG,\n                    customDataPrefix: DEFAULT_DATA_PREFIX,\n                    captureAllMetaDataContent: false,\n                    dntDataTag: DEFAULT_DONOT_TRACK_TAG,\n                    metaDataPrefix: \"\",\n                    parentDataTag: \"\"\n                };\n                const coreDataDefault = {\n                    referrerUri: hasDocument() ? document.referrer : \"\",\n                    requestUri: \"\",\n                    pageName: \"\",\n                    pageType: \"\"\n                };\n\n                const defaultElementTypes = \"A,BUTTON,AREA,INPUT\"; \n\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const id = clickAnalyticsPlugin.identifier;\n               \n                core.initialize({\n                    instrumentationKey: \"testIkey\",\n                    extensionConfig : {\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config.extensionConfig =  core.config.extensionConfig?  core.config.extensionConfig : {};\n                let extConfig = core.config.extensionConfig[id];\n                Assert.ok(extConfig, \"default config should not be null\");\n\n                //check defaults\n                Assert.equal(extConfig.autoCapture,true, \"autoCapture should be true by default\");\n                Assert.deepEqual(extConfig.pageTags, {}, \"pageTags should be {} by default\");\n                Assert.equal(extConfig.defaultRightClickBhvr, \"\", \"defaultRightClickBhvr should be '' by default\");\n                Assert.equal(extConfig.dropInvalidEvents, false, \"dropInvalidEvents should be false by default\");\n                Assert.equal(extConfig.urlCollectHash, false, \"urlCollectHash should be false by default\");\n                Assert.equal(extConfig.urlCollectQuery, false, \"urlCollectQuery should be false by default\");\n                Assert.deepEqual(extConfig.dataTags, dataTagsDefault, \"udataTags should be set by default\");\n                Assert.deepEqual(extConfig.coreData, coreDataDefault, \"udataTags should be set by default\");\n                Assert.deepEqual(extConfig.trackElementTypes, defaultElementTypes, \"trackElementTypes should be set by default\");\n\n                Assert.ok(extConfig.callback, \"callback should be set by default\");\n                let callbacks = extConfig.callback;\n                let pageActionPageTags = callbacks.pageActionPageTags;\n                let pageName = callbacks.pageName;\n                let contentName = callbacks.contentName;\n                Assert.equal(pageName, null, \"pageName should be set by default\");\n                Assert.equal(pageActionPageTags, null, \"pageActionPageTags should be set by default\");\n                Assert.equal(contentName, null, \"contentName should be set by default\");\n                \n                Assert.ok(extConfig.behaviorValidator,\"behaviorValidator should be set by default\");\n                let bhvVal = extConfig.behaviorValidator;\n                Assert.equal(bhvVal(), \"\", \"behaviorValidator should return ''\");\n                Assert.equal(bhvVal(1), 1, \"behaviorValidator should return key\");\n\n                //config(non-Object) changes\n                let config = {\n                    urlCollectHash: true,\n                    urlCollectQuery: true,\n                    dropInvalidEvents: true,\n                    autoCapture: true,\n                    defaultRightClickBhvr: \"click\"\n                }\n                core.config.extensionConfig[id] = config;\n                this.clock.tick(1);\n                extConfig = core.config.extensionConfig[id];\n                Assert.equal(extConfig.urlCollectHash, true, \"urlCollectHash should be updated\");\n                Assert.equal(extConfig.urlCollectQuery, true, \"urlCollectQuery should be updated\");\n                Assert.equal(extConfig.dropInvalidEvents, true, \"dropInvalidEvents should be updated\");\n                Assert.equal(extConfig.autoCapture, true, \"autoCapture should be updated\");\n                Assert.equal(extConfig.defaultRightClickBhvr, \"click\", \"defaultRightClickBhvrshould be updated\");\n\n                \n                //config(object) changes\n                let dataTags = {\n                    useDefaultContentNameOrId: true\n                };\n                core.config.extensionConfig[id].dataTags = dataTags;\n                this.clock.tick(1);\n                extConfig = core.config.extensionConfig[id];\n                let expectedDataTags ={...dataTagsDefault};\n                expectedDataTags.useDefaultContentNameOrId = true;\n                Assert.deepEqual(extConfig.dataTags, expectedDataTags, \"dataTags should be updated\");\n                 \n                let dataTags1 = {\n                    dntDataTag: \"dnt\",\n                    captureAllMetaDataContent: true,\n                    customDataPrefix: \"wrongtage\"\n                };\n                core.config.extensionConfig[id].dataTags = dataTags1;\n                this.clock.tick(1);\n                let extConfig1 = core.config.extensionConfig[id];\n                let expectedDataTags1 = {...dataTagsDefault};\n                expectedDataTags1.dntDataTag = \"dnt\";\n                expectedDataTags1.captureAllMetaDataContent = true;\n                Assert.deepEqual(extConfig1.dataTags, expectedDataTags1, \"dataTags should be updated with correct prefixName\");\n\n                let coreData = {\n                    referrerUri: \"url\",\n                    pageName: \"name\"\n                }\n                core.config.extensionConfig[id].coreData =coreData;\n                this.clock.tick(1);\n                extConfig = core.config.extensionConfig[id];\n                let expectedCoreData = {\n                    referrerUri: \"url\",\n                    requestUri: \"\",\n                    pageName: \"name\",\n                    pageType: \"\"\n                };\n                Assert.deepEqual(extConfig.coreData, expectedCoreData, \"coreData should be updated\");\n           \n                let pageTags = {\n                    tag1: \"tag1\",\n                    tag2: true,\n                    tag3: 1,\n                    tag4: {tag: \"val1\"},\n                    tag5: [\"val1\",\"val2\"]\n                }\n                core.config.extensionConfig[id].pageTags = pageTags;\n                this.clock.tick(1);\n                extConfig = core.config.extensionConfig[id];\n                Assert.deepEqual(extConfig.pageTags, pageTags, \"PageTags should be updated\");\n            }\n        });\n\n        this.testCase({\n            name: \"autoCapture: click events are automatically captured and tracked\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    coreData: {},\n                    autoCapture: true,\n                    dataTags: {\n                        useDefaultContentNameOrId: true,\n                        metaDataPrefix: \"ha-\",\n                        customDataPrefix: \"data-ha-\",\n                        aiBlobAttributeTag: \"blob\"\n                    }\n                } as IClickAnalyticsConfiguration;\n                let clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: \"testIkey\",\n                    extensionConfig: {\n                        [clickAnalyticsPlugin.identifier]: config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, \"track\");\n\n                let element = document.createElement(\"button\");\n                element.setAttribute(\"id\", \"testAutoCaptureBtn\");\n                element.setAttribute(\"data-ha-aN\", \"autoCaptureArea\");\n                document.body.appendChild(element);\n\n                const mouseDownEvent = new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true });\n                element.dispatchEvent(mouseDownEvent);\n            \n                this.clock.tick(500);\n\n                Assert.equal(true, spy.called, \"track should be called on click event\");\n                let calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(\"testAutoCaptureBtn\", calledEvent.baseData[\"name\"]);\n\n                // Clean up\n                document.body.removeChild(element);\n            }\n        });\n\n        this.testCase({\n            name: \"autoCapture: click events are automatically captured and tracked with customized config\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    coreData: {},\n                    autoCapture: true,\n                    dataTags: {\n                        useDefaultContentNameOrId: true,\n                        metaDataPrefix: \"ha-\",\n                        customDataPrefix: \"data-ha-\",\n                        aiBlobAttributeTag: \"blob\"\n                    },\n                    trackElementTypes: \"A\"\n                } as IClickAnalyticsConfiguration;\n                let clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                let core = new AppInsightsCore();\n                let channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: \"testIkey\",\n                    extensionConfig: {\n                        [clickAnalyticsPlugin.identifier]: config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, \"track\");\n\n                let element = document.createElement(\"a\");\n                element.setAttribute(\"id\", \"testAutoCaptureA\");\n                element.setAttribute(\"data-ha-aN\", \"autoCaptureArea\");\n                document.body.appendChild(element);\n\n                let elementNotToTrack = document.createElement(\"button\");\n                elementNotToTrack.setAttribute(\"id\", \"testAutoCaptureBtn\");\n                elementNotToTrack.setAttribute(\"data-ha-aN\", \"autoCaptureArea\");\n                document.body.appendChild(elementNotToTrack);\n\n                let mouseDownEvent = new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true });\n                element.dispatchEvent(mouseDownEvent);\n\n                let mouseDownEventNotToTrack = new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true });\n                elementNotToTrack.dispatchEvent(mouseDownEventNotToTrack);\n            \n                this.clock.tick(500);\n\n                Assert.equal(true, spy.called, \"track should be called on click event\");\n                let calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(\"testAutoCaptureA\", calledEvent.baseData[\"name\"]);\n\n                // Clean up\n                document.body.removeChild(element);\n                document.body.removeChild(elementNotToTrack);\n            }\n        });\n\n        this.testCase({\n            name: \"trackPageView properties are correctly assigned (Empty)\",\n            test: () => {\n                let config = {\n                    coreData: {},\n                    callback: {\n                        pageActionPageTags: () => ({ key2: \"value2\" })\n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:\"ha-\",\n                        customDataPrefix: \"data-ha-\",\n                        aiBlobAttributeTag: \"blob\",\n                        parentDataTag: \"parent\",\n                        dntDataTag: \"donotTrack\"\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n               \n                core.initialize({\n                    instrumentationKey: \"testIkey\",\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler,  extConfig.callback?.pageActionPageTags, {}, traceLogger );\n               \n                \n                clickAnalyticsPlugin.trackPageAction()\n                const element = document.createElement(\"a\");\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, \"track\");\n                // clickAnalyticsPlugin.capturePageAction(element, {} as IOverrideValues, {}, false);\n                pageAction.capturePageAction(element);\n                Assert.equal(true, spy.called);\n                let calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.notEqual(-1, calledEvent.data[\"uri\"].indexOf(\"Tests.html\"));\n                Assert.equal(undefined, calledEvent.data[\"behavior\"]);\n                Assert.equal(undefined, calledEvent.data[\"actionType\"]);\n                Assert.equal(\"[{}]\", calledEvent.data[\"content\"]);\n                Assert.equal(false, isNaN(calledEvent.data[\"timeToAction\"] as number));\n                Assert.equal(\"value2\", calledEvent.data[\"properties\"][\"pageTags\"].key2);\n            }\n\n        });\n\n        this.testCase({\n            name: \"PageAction properties are correctly assigned (Empty)\",\n            test: () => {\n                let config = {\n                    coreData: {},\n                    callback: {\n                        pageActionPageTags: () => ({ key2: \"value2\" })\n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:\"ha-\",\n                        customDataPrefix: \"data-ha-\",\n                        aiBlobAttributeTag: \"blob\",\n                        parentDataTag: \"parent\",\n                        dntDataTag: \"donotTrack\"\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const properties = new PropertiesPlugin();\n               \n                core.initialize({\n                    instrumentationKey: \"testIkey\",\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel, properties]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                let sdkVersion = properties.context.internal.sdkVersion;\n                Assert.ok(strContains(sdkVersion, \"_ClickPlugin\"), sdkVersion);\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler,  extConfig.callback?.pageActionPageTags, {}, traceLogger );\n\n                const element = document.createElement(\"a\");\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, \"track\");\n                // clickAnalyticsPlugin.capturePageAction(element, {} as IOverrideValues, {}, false);\n                pageAction.capturePageAction(element);\n                Assert.equal(true, spy.called);\n                let calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.notEqual(-1, calledEvent.data[\"uri\"].indexOf(\"Tests.html\"));\n                Assert.equal(undefined, calledEvent.data[\"behavior\"]);\n                Assert.equal(undefined, calledEvent.data[\"actionType\"]);\n                Assert.equal(\"[{}]\", calledEvent.data[\"content\"]);\n                Assert.equal(false, isNaN(calledEvent.data[\"timeToAction\"] as number));\n                Assert.equal(\"value2\", calledEvent.data[\"properties\"][\"pageTags\"].key2);\n            }\n\n        });\n\n        this.testCase({\n            name: \"PageAction properties are correctly assigned (Overrides)\",\n            useFakeTimers: true,\n            test: () => {\n                const overrides: IPageActionOverrideValues = {\n                    actionType: \"overrideActionType\",\n                    contentTags: { 'testTag': 'testValue' },\n                    refUri: \"overrideReferrerUri\",\n                    behavior: 2\n                };\n                const config = {\n                    coreData: {},\n                    autoCapture: false,\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n                const element = document.createElement('a');\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                this.clock.tick(500);\n                // clickAnalyticsPlugin.capturePageAction(element, overrides, { customProperty: { customNextedProperty: \"test\" } });\n                pageAction.capturePageAction(element, overrides, { customProperty: { customNextedProperty: \"test\" } });\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(\"overrideActionType\", calledEvent.data[\"actionType\"]);\n                Assert.equal('[{\"testTag\":\"testValue\"}]', calledEvent.data[\"content\"]);\n                Assert.equal(2, calledEvent.data[\"behavior\"]);\n                Assert.equal(\"overrideReferrerUri\", calledEvent.data[\"refUri\"]);\n                Assert.equal(\"test\", calledEvent.data[\"customProperty\"][\"customNextedProperty\"]);\n            }\n\n        });\n\n        this.testCase({\n            name: \"PageAction properties are correctly assigned (Populated)\",\n            useFakeTimers: true,\n            test: () => {\n                const contentNameFn = () => \"testContentName\";\n                const config = {\n                    callback: {\n                        contentName: contentNameFn\n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier];\n                Assert.ok(extConfig, \"Make sure it is not null/undefined\");\n                const behaviorValidator = extConfig.behaviorValidator;\n                Assert.ok(isFunction(behaviorValidator), \"Make sure we have a function\")\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n                \n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\");\n                element.setAttribute(\"data-ha-aN\", \"testAn\");\n                element.setAttribute(\"data-ha-sN\", \"testsN\");\n                element.setAttribute(\"data-ha-cS\", \"testcS\");\n                element.setAttribute(\"data-ha-tN\", \"testtN\");\n                element.setAttribute(\"data-ha-pid\", \"testpid\");\n                element.setAttribute(\"data-ha-cT\", \"testcT\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                    an: \"testAn\",\n                    sn: \"testsN\",\n                    cs: \"testcS\",\n                    tn: \"testtN\",\n                    pid: \"testpid\",\n                    ct: \"testcT\",\n                    contentName: \"testContentName\"\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(\"testId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n\n                // Check the \"merged\" config\n                Assert.deepEqual({                // Check the \"merged\" config\n                    autoCapture: true,\n                    callback: {\n                        contentName: contentNameFn,\n                        pageActionPageTags: null,\n                        pageName: null\n                    },\n                    coreData: {\n                        referrerUri: document.referrer,\n                        requestUri: \"\",\n                        pageName: \"\",\n                        pageType: \"\"\n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob',\n                        captureAllMetaDataContent: false,\n                        dntDataTag: DEFAULT_DONOT_TRACK_TAG,\n                        parentDataTag: \"\"                        \n                    },\n                    pageTags: {},\n                    behaviorValidator: behaviorValidator,\n                    defaultRightClickBhvr: \"\",\n                    dropInvalidEvents : false,\n                    urlCollectHash: false,\n                    urlCollectQuery: false,\n                    trackElementTypes: \"A,BUTTON,AREA,INPUT\"\n                }, core.config.extensionConfig[clickAnalyticsPlugin.identifier]);\n\n            }\n        });\n        this.testCase({\n            name: \"trackElementTypes: validate empty string, string with spaces, lowercase, and dynamic changes\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    trackElementTypes: \"A,BUTTON,AREA,INPUT\"\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig: {\n                        [clickAnalyticsPlugin.identifier]: config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n        \n                let currentConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier].trackElementTypes;\n                // Validate default value\n                Assert.equal(\"A,BUTTON,AREA,INPUT\", currentConfig, \"Default trackElementTypes should be 'A,BUTTON,AREA,INPUT'\");\n        \n                // Test empty string\n                core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier].trackElementTypes = null;\n                this.clock.tick(1);\n                currentConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier].trackElementTypes;\n                Assert.equal(\"A,BUTTON,AREA,INPUT\", currentConfig, \"default value would be applied\");\n        \n                // Test dynamic change\n                core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier].trackElementTypes = \"A,BUTTON,AREA,INPUT,TEST\";\n                this.clock.tick(1);\n                currentConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier].trackElementTypes;\n                Assert.equal(\"A,BUTTON,AREA,INPUT,TEST\", currentConfig, \"spaces and lowercase string will be converted to uppercase and trimmed\");\n            }\n        });\n\n        this.testCase({\n            name: \"PageAction properties are correctly assigned (Populated) with useDefaultContentNameOrId flag false\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"\n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : false,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier];\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\")\n                element.setAttribute(\"data-ha-aN\", \"testAn\");\n                element.setAttribute(\"data-ha-sN\", \"testsN\");\n                element.setAttribute(\"data-ha-cS\", \"testcS\");\n                element.setAttribute(\"data-ha-tN\", \"testtN\");\n                element.setAttribute(\"data-ha-pid\", \"testpid\");\n                element.setAttribute(\"data-ha-cT\", \"testcT\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                    an: \"testAn\",\n                    sn: \"testsN\",\n                    cs: \"testcS\",\n                    tn: \"testtN\",\n                    pid: \"testpid\",\n                    ct: \"testcT\",\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(\"not_specified\", calledEvent.baseData[\"name\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n        // pageAction - clicked element has no tags, capture the id of the html element\n        this.testCase({\n            name: \"PageAction properties are correctly populated when parent element has data tags\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"\n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\", \"testId\")\n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"data-ha-id\", \"testParentId\");\n                parentElement.setAttribute(\"data-ha-name\", \"testParentName\");\n                parentElement.appendChild(element);\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                    contentName: \"testContentName\",\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"testId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(\"not_specified\", calledEvent.data[\"parentId\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n\n        // pageAction - clicked element has no tags on current element, capture the id of the html element and parentId of the parent\n        this.testCase({\n            name: \"PageAction - clicked element has no tags on current element, capture the id of the html element and parentId of the parent\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob',\n                        parentDataTag:'parentgroup'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\", \"testId\")\n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"data-ha-id\", \"testParentId\");\n                parentElement.setAttribute(\"data-ha-name\", \"testParentName\");\n                parentElement.setAttribute(\"data-ha-parentgroup\", \"testParentGroup\");\n                parentElement.appendChild(element);\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                    contentName: \"testContentName\",\n                    name: \"testParentName\"\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"testId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(\"testParentId\", calledEvent.data[\"parentId\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n        // pageAction - clicked element has no tags on current element, capture the id of the html element and html id of the parent\n        this.testCase({\n            name: \"PageAction - clicked element has no tags on current element, capture the id of the html element and html id of the parent\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob',\n                        parentDataTag:'parentgroup'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n               \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\", \"testId\")\n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"id\",\"testParentId\")\n                parentElement.setAttribute(\"data-ha-name\", \"testParentName\");\n                parentElement.setAttribute(\"data-ha-parentgroup\", \"testParentGroup\");\n                parentElement.appendChild(element);\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                    contentName: \"testContentName\",\n                    name: \"testParentName\"\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"testId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(\"testParentId\", calledEvent.data[\"parentId\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n        // pageAction - clicked element has no tags, no html id capture the content name of html element should be event name\n        this.testCase({\n            name: \"PageAction name populated from contentname\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"data-ha-id\", \"testParentId\");\n                parentElement.setAttribute(\"data-ha-name\", \"testParentName\");\n                parentElement.appendChild(element);\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                    contentName: \"testContentName\",\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"testContentName\", calledEvent.baseData[\"name\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n        \n        // Parent element has no tags, continue walk up the DOM to find grand parent element's info\n        this.testCase({\n            name: \"PageAction: element and its upper element does not have any tags, so grand parent element is recognize as under one area, no parent info is populated.\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        customDataPrefix: 'data-ha-',\n                        parentDataTag:'parentgroup'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\", \"testId\")\n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"id\", \"testParentId\");\n                parentElement.appendChild(element);\n                const grandParentElement = document.createElement('div');\n                grandParentElement.setAttribute(\"data-ha-parentgroup\", \"group1\");\n                grandParentElement.setAttribute(\"data-ha-id\", \"testGrandParentId\");\n                grandParentElement.setAttribute(\"data-ha-name\", \"testGrandParentName\");\n                grandParentElement.appendChild(parentElement);\n\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                    contentName: \"testContentName\",\n                    name: \"testGrandParentName\",\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"testId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(\"testGrandParentId\", calledEvent.data[\"parentId\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n        // no data tags found, do not populate any data except the id\n        this.testCase({\n            name: \"PageAction: no parentId or parentName data is found\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        customDataPrefix: 'data-ha-',\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\", \"testId\")\n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"id\", \"testParentId\");\n                parentElement.appendChild(element);\n                const grandParentElement = document.createElement('div');\n                grandParentElement.setAttribute(\"id\", \"testGrandParentId\");\n                grandParentElement.appendChild(parentElement);\n\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"testId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(\"not_specified\", calledEvent.data[\"parentId\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n        // element use data-ha-blob\n        this.testCase({\n            name: \"Element uses data* blob \",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    },\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"data-ha-id\", \"testId\");\n                element.setAttribute(\"data-ha-blob\", '{\"id\":\"parentTestId\",\"aN\":\"areaTestName\",\"sN\":\"slotTestName\",\"cN\":\"contentTestName\", \"pI\":\"parentIdSelfDefined\", \"pN\":\"parentNameSelfDefined\"}');\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                    aN: \"areaTestName\",\n                    sN: \"slotTestName\",\n                    cN: \"contentTestName\",\n                    pI: \"parentIdSelfDefined\",\n                    pN: \"parentNameSelfDefined\"\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"parentTestId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n        // parent element use data-ha-blob\n        this.testCase({\n            name: \"Parent Element uses data* blob \",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob',\n                        parentDataTag:'parentgroup'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');  \n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"id\", \"testParentId\");\n                parentElement.setAttribute(\"data-ha-parentgroup\", \"group1\");\n                parentElement.setAttribute(\"data-ha-blob\", '{\"id\":\"parentTestId\",\"aN\":\"areaTestName\",\"sN\":\"slotTestName\",\"cN\":\"contentTestName\", \"pI\":\"parentIdSelfDefined\", \"pN\":\"parentNameSelfDefined\"}');\n                parentElement.appendChild(element);\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"not_specified\", calledEvent.baseData[\"name\"]);\n                Assert.equal(\"parentTestId\", calledEvent.data[\"parentId\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n         // parent element use data-ha-parent, donot populate data from grandparent\n        this.testCase({\n            name: \"Parent element use data-ha-parent, donot populate data from grandparent\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        customDataPrefix: 'data-ha-',\n                        parentDataTag: 'parent'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"data-ha-id\", \"testId\");\n                const parentElement = document.createElement('div');\n                parentElement.setAttribute(\"data-ha-parentid\", \"testParentId\");\n                parentElement.setAttribute(\"data-ha-name\", \"testParentName\");\n                parentElement.appendChild(element);\n                const grandParentElement = document.createElement('div');\n                grandParentElement.setAttribute(\"data-ha-grandparent-id\", \"testGrandParentId\");\n                grandParentElement.setAttribute(\"data-ha-grandparent-name\", \"testGrandParentName\");\n                grandParentElement.appendChild(parentElement);\n\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                var expectedContent = JSON.stringify([{\n                    name: \"testParentName\",\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent = spy.getCall(0).args[0];\n                Assert.equal(\"testId\", calledEvent.baseData[\"name\"]);\n                Assert.equal(\"testParentId\", calledEvent.data[\"parentId\"]);\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"PageAction Behaviours test default value\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\")\n                element.setAttribute(\"data-ha-aN\", \"testAn\");\n                element.setAttribute(\"data-ha-bhvr\", \"testBehavior\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                    an: \"testAn\",\n                    contentName: \"testContentName\"\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n                Assert.equal(\"testBehavior\",calledEvent.data[\"behavior\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"PageAction Behaviours test empty default value\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    }\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\")\n                element.setAttribute(\"data-ha-aN\", \"testAn\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                    an: \"testAn\",\n                    contentName: \"testContentName\"\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n                Assert.equal(undefined, calledEvent.data[\"behavior\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"PageAction Behaviours test default BehaviorMapValidator\",\n            useFakeTimers: true,\n            test: () => {\n                const behaviorMap = {\n                    BEHAVIOR1:\"behavior1_Value\",\n                    BEHAVIOR2:\"behavior2_Value\",\n                }\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    },\n                    behaviorValidator : BehaviorMapValidator(behaviorMap)\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\")\n                element.setAttribute(\"data-ha-aN\", \"testAn\");\n                element.setAttribute(\"data-ha-bhvr\", \"BEHAVIOR1\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                    an: \"testAn\",\n                    contentName: \"testContentName\",\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n                Assert.equal(\"behavior1_Value\",calledEvent.data[\"behavior\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"PageAction Behaviours test default BehaviorValueValidator\",\n            useFakeTimers: true,\n            test: () => {\n                const behaviorArray = [\n                    \"BEHAVIOR1\",\n                    \"BEHAVIOR2\"\n                ]\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    },\n                    behaviorValidator : BehaviorValueValidator(behaviorArray)\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\")\n                element.setAttribute(\"data-ha-aN\", \"testAn\");\n                element.setAttribute(\"data-ha-bhvr\", \"BEHAVIOR1\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                    an: \"testAn\",\n                    contentName: \"testContentName\",\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n                Assert.equal(\"BEHAVIOR1\",calledEvent.data[\"behavior\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"PageAction Behaviours test default BehaviorEnumValidator\",\n            useFakeTimers: true,\n            test: () => {\n                const behaviorEnum = {\n                    NAVIGATIONBACK: 1,\n                    NAVIGATION: 2,          \n                    NAVIGATIONFORWARD: 3\n                };\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    },\n                    behaviorValidator : BehaviorEnumValidator(behaviorEnum)\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n                \n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\")\n                element.setAttribute(\"data-ha-aN\", \"testAn\");\n                element.setAttribute(\"data-ha-bhvr\", \"NAVIGATION\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n\n                var expectedContent = JSON.stringify([{\n                    an: \"testAn\",\n                    contentName: \"testContentName\"\n                }]);\n                // clickAnalyticsPlugin.capturePageAction(element);\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(true, spy.called);\n                var calledEvent: ITelemetryItem = spy.getCall(0).args[0];\n                Assert.equal(expectedContent, calledEvent.data[\"content\"]);\n                Assert.equal(2,calledEvent.data[\"behavior\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"PageAction not called on undefined event and disableUndefinedEventsTracking is set to true\",\n            useFakeTimers: true,\n            test: () => {\n                const config = {\n                    callback: {\n                        contentName: () => \"testContentName\"                  \n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : false,\n                        metaDataPrefix:'ha-',\n                        customDataPrefix: 'data-ha-',\n                        aiBlobAttributeTag: 'blob'\n                    },\n                    dropInvalidEvents:true\n                };\n                const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                const core = new AppInsightsCore();\n                const channel = new ChannelPlugin();\n                const traceLogger = new DiagnosticLogger({ loggingLevelConsole: 1 } as any);\n\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                    extensionConfig : {\n                        [clickAnalyticsPlugin.identifier] : config\n                    }\n                } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel]);\n                this.onDone(() => {\n                    core.unload(false);\n                });\n\n                core.config[\"extensionConfig\"] =  core.config[\"extensionConfig\"]?  core.config[\"extensionConfig\"] : {};\n                let extConfig = core.config[\"extensionConfig\"][clickAnalyticsPlugin.identifier]\n                const contentHandler = new DomContentHandler(extConfig, traceLogger);\n                const pageAction = new PageAction(clickAnalyticsPlugin, extConfig, contentHandler, null, {}, traceLogger );\n\n\n                let spy = this.sandbox.spy(clickAnalyticsPlugin.core, 'track');\n                const element = document.createElement('a');\n                element.setAttribute(\"id\",\"testId\");\n                ((element) as HTMLBaseElement).href = \"testClickTarget\";\n                pageAction.capturePageAction(element);\n                this.clock.tick(500);\n                Assert.equal(false, spy.called);\n            }\n        });\n\n        this.testCase({\n            name: \"Test sanitizeUrl\",\n            test: () => {\n                let fakeLocation1 = null;\n                let fakeLocation2 = {\n                    protocol:\"https:\",\n                    hostname:\"www.test.com\",\n                    host:\"www.test.com\",\n                    port:\"3000\",\n                    pathname:\"/path\",\n                    hash:\"#test\",\n                    search:\"?q=search&rlz=1C1CHBF\"\n                } as any;\n                let fakeLocation3 = {\n                    protocol:\"https:\",\n                    host:\"www.test.com\",\n                    port:\"\",\n                    pathname:\"\",\n                    hash:\"\",\n                    search:\"?q=search&rlz=1C1CHBF\"\n                } as any;\n\n                const config1 = {\n                    urlCollectHash: true,\n                    urlCollectQuery: true\n                };\n                const config2 = {\n                    urlCollectHash: false,\n                    urlCollectQuery: false\n                };\n                const config3 = {\n                    urlCollectHash:false,\n                    urlCollectQuery: true\n                };\n\n                \n                let url1 = sanitizeUrl(config1, fakeLocation1);\n                Assert.equal(null, url1);\n\n                let url2 = sanitizeUrl(config2, fakeLocation2);\n                Assert.equal(\"https://www.test.com:3000/path\", url2);\n\n                let url3 = sanitizeUrl(config1,fakeLocation2);\n                Assert.equal(\"https://www.test.com:3000/path#test?q=search&rlz=1C1CHBF\", url3);\n\n                let url4 = sanitizeUrl(config3, fakeLocation3);\n                Assert.equal(\"https://www.test.com?q=search&rlz=1C1CHBF\", url4);\n\n                let url5 = sanitizeUrl(config1, fakeLocation3);\n                Assert.equal(\"https://www.test.com?q=search&rlz=1C1CHBF\", url5);\n            }\n        });\n\n        this.testCase({\n            name: \"Check sdkVersion length limitation\",\n            test: () => {\n                let config = {\n                    coreData: {},\n                    callback: {\n                        pageActionPageTags: () => ({ key2: \"value2\" })\n                    },\n                    dataTags : {\n                        useDefaultContentNameOrId : true,\n                        metaDataPrefix:\"ha-\",\n                        customDataPrefix: \"data-ha-\",\n                        aiBlobAttributeTag: \"blob\",\n                        parentDataTag: \"parent\",\n                        dntDataTag: \"donotTrack\"\n                    }\n                };\n                let prevVersion = ClickAnalyticsPlugin.Version\n                try {\n                    ClickAnalyticsPlugin.Version = \"9.9.9-nightly3.2305-999.reallylongversionthatshouldgettruncated\";\n\n                    const clickAnalyticsPlugin = new ClickAnalyticsPlugin();\n                    const core = new AppInsightsCore();\n                    const channel = new ChannelPlugin();\n                    const properties = new PropertiesPlugin();\n                   \n                    core.initialize({\n                        instrumentationKey: \"testIkey\",\n                        extensionConfig : {\n                            [clickAnalyticsPlugin.identifier] : config\n                        }\n                    } as IConfig & IConfiguration, [clickAnalyticsPlugin, channel, properties]);\n                    this.onDone(() => {\n                        core.unload(false);\n                    });\n    \n                    let sdkVersion = properties.context.internal.sdkVersion;\n                    Assert.ok(strContains(sdkVersion, \"_ClickPlugin\"), sdkVersion);\n                    Assert.equal(64, sdkVersion.length);\n    \n                } finally {\n                    ClickAnalyticsPlugin.Version = prevVersion;\n                }\n            }\n        });\n    }\n}\n\nclass ChannelPlugin implements IPlugin {\n\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry(env: ITelemetryItem) {}\n\n    setNextPlugin(next: any) {\n        // no next setup\n    }\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/appinsights-clickanalytics.tests.ts",
    "content": "import { ClickEventTest } from './ClickEventTest';\nimport { GlobalTestHooks } from './GlobalTestHooks.Test';\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new ClickEventTest().registerTests();\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript API</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/appinsights-clickanalytics.tests\", \"./Unit/dist/appinsights-clickanalytics.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-clickanalytics-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-clickanalytics-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights Click Analytics extension\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-clickanalytics-js.js\",\n    \"module\": \"dist-es5/applicationinsights-clickanalytics-js.js\",\n    \"types\": \"types/applicationinsights-clickanalytics-js.d.ts\",\n    \"sideEffects\": false,\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt clickanalytics\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt clickanalyticstests\",\n        \"mintest\": \"grunt clickanalytics-mintests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js 'Microsoft.ApplicationInsights'\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt clickanalytics-min\",\n        \"ai-restore\": \"grunt clickanalytics-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-properties-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-clickanalytics-js\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserOutputName = \"ai.clck\";\nconst outputName = \"applicationinsights-clickanalytics-js\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Click Analytics, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: outputName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: outputName,\n      outputName: browserOutputName\n    }\n  },\n  [ outputName ]);\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/scripts/listAzCdnVersions.ps1",
    "content": "param (\n    [string] $container = $null,                        # Identify the container that you want to check blank == all\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $showFiles = $false,                       # Show the individual files with details as well\n    [switch] $activeOnly = $false,                      # Only show the active (deployed) versions\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Container         : $container\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Show Files        : $showFiles\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    # Validate parameters\n    if ([string]::IsNullOrWhiteSpace($container) -ne $true -and \"beta\",\"next\",\"public\", \"dev\", \"nightly\" -NotContains $container) {\n        Write-LogFailure \"[$($container)] is not a valid value, must be beta, next or public\"\n    }\n}\n\nFunction Get-AllVersionFiles(\n    [system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]] $files,\n    [string] $storagePath\n) {\n    Get-VersionFiles $files \"$storagePath/ext\" \"ai.clck.\" $null\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath, \"listCdnVersionsLog\"\nWrite-LogParams\nValidate-Params\n\n# Don't try and list anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n\n# Get the public files (scripts/b)\nif ([string]::IsNullOrWhiteSpace($container) -eq $true) {\n    Get-AllVersionFiles $files \"scripts/b\"\n    Get-AllVersionFiles $files \"beta\"\n    Get-AllVersionFiles $files \"next\"\n    Get-AllVersionFiles $files \"dev\"\n    Get-AllVersionFiles $files \"nightly\"\n}\n\nif ([string]::IsNullOrWhiteSpace($container) -ne $true) {\n    if ($container -eq \"public\") {\n        Get-AllVersionFiles $files \"scripts/b\"\n    } elseif ($container -eq \"beta\" -or $container -eq \"next\" -or $container -eq \"dev\" -or $container -eq \"nightly\") {\n        Get-AllVersionFiles $files \"$container\"\n    } else {\n        $global:connectDetails.testOnly = $true\n        $global:connectDetails.storeContainer = \"tst\"\n        Get-AllVersionFiles $files \"$container\"\n    }\n}\n\nListVersions $files $activeOnly $showFiles\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/scripts/publishAzReleaseToCdn.ps1",
    "content": "param (\n    [string] $releaseFrom = $null,                      # The root path for where to find the files to be released\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $overwrite = $false,                       # Overwrite any existing files   \n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\n$global:cacheValue = $null\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Overwrite         : $overwrite\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"SourcePath        : $jsSdkDir\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction GetReleaseFiles (\n    [hashtable] $verDetails\n)\n{\n    $version = $verDetails.full\n    Write-Log \"Version   : $($verDetails.full)\"\n    Write-Log \"  Number  : $($verDetails.ver)\"\n    Write-Log \"  Type    : $($verDetails.type)\"\n    Write-Log \"  BldNum  : $($verDetails.bldNum)\"\n\n    # check if the minified dir exists\n    $jsSdkSrcDir = Join-Path $jssdkDir -ChildPath \"browser\\es5\\\";\n\n    if (-Not (Test-Path $jsSdkSrcDir)) {\n        Write-LogWarning \"'$jsSdkSrcDir' directory doesn't exist. Compile JSSDK first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    Write-Log \"Adding files\";\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.integrity.json\" $true\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.cjs.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.cjs.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.cjs.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.cjs.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.gbl.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.gbl.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.gbl.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.clck.$version.gbl.min.js.map\"\n\n    return $files\n}\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"publishReleaseCdnLog\"\n\n$jsSdkDir = $releaseFrom\nif ([string]::IsNullOrWhiteSpace($jsSdkDir) -eq $true) {\n    $jsSdkDir = Split-Path (Split-Path $MyInvocation.MyCommand.Path) -Parent\n}\n\n$cacheControl1Year = \"public, max-age=31536000, immutable, no-transform\";\n$contentType = \"text/javascript; charset=utf-8\";\n\nWrite-LogParams\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n$version = GetPackageVersion $jsSdkDir\n\n$releaseFiles = GetReleaseFiles $version      # Get the versioned files only\nif ($null -eq $releaseFiles -or $releaseFiles.Count -eq 0) {\n    Write-LogFailure \"Unable to find any release files\"\n}\n\nWrite-Log \"Release Files : $($releaseFiles.Count)\"\nWrite-Log \"----------------------------------------------------------------------\"\n\n# Publish the full versioned files to all release folders\nif ($version.type -eq \"release\") {\n    # Normal publishing deployment\n    PublishFiles $releaseFiles \"beta/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"scripts/b/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"rc\") {\n    PublishFiles $releaseFiles \"beta/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n    # Publish to release type folder folder\n    PublishFiles $releaseFiles \"$($version.type)/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -like \"nightly*\") {\n    # Publish to release nightly folder folder\n    PublishFiles $releaseFiles \"nightly/ext\" $cacheControl1Year $contentType $overwrite\n}\nelse {\n    # Upload to the test container rather than the supplied one\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n    PublishFiles $releaseFiles \"$($version.type)/ext\" $cacheControl1Year $contentType $overwrite\n}\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/scripts/setAzActiveCdnVersion.ps1",
    "content": "[CmdletBinding()]\nparam (\n    [string] $container = \"\",                           # The container to update\n    [string] $activeVersion = \"\",                       # The version to copy as the active version\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $minorOnly = $false,                       # Only set the active minor version (v2.x) and not the major version (v2)\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    Write-Log \"Container         : $container\"\n    Write-Log \"Version           : $activeVersion\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    if ([string]::IsNullOrWhiteSpace($activeVersion) -eq $true) {\n        Write-LogFailure \"The Active version is not specified\"\n        exit\n    }\n\n    $version = Get-VersionDetails $activeVersion\n\n    if ([string]::IsNullOrWhiteSpace($version.type) -eq $true) {\n        Write-LogFailure \"Unknown release type\"\n    }\n\n    $versionParts = $version.ver.Split(\".\")\n    if ($versionParts.Length -ne 3) {\n        Write-LogFailure \"Active Version [$activeVersion] is not a valid version number\"\n    }\n\n    foreach ($verNum in $versionParts) {\n        [int]$value = 0\n        if ([int32]::TryParse($verNum, [ref]$value) -ne $true) {\n            Write-LogFailure \"[$($verNum)] is not a valid number within the version[$activeVersion]\"\n        }\n    }\n\n    # Publish the full versioned files to all release folders\n    if ($version.type -eq \"release\") {\n        # Normal publishing deployment\n        if (\"beta\",\"next\",\"public\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"rc\") {\n        if (\"beta\",\"next\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -like \"nightly*\") {\n        if (\"nightly\" -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    else {\n        # Upload to the test container rather than the supplied one\n        $global:connectDetails.testOnly = $true\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        } else {\n            Write-LogWarning \"Non-Standard release type using tst/$container as the destination\"\n        }\n    }\n    \n    return $version;\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"setActiveCdnVersionLog\"\n\nWrite-LogParams\n$version = Validate-Params\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n$storePath = \"$container/ext\"\nif ($container -eq \"public\") {\n    $storePath = \"scripts/b/ext\"\n} elseif ($container -ne \"beta\" -and $container -ne \"next\" -and $container -ne \"dev\" -and $container -ne \"nightly\") {\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst/ext\"\n}\n\nGet-VersionFiles $files $storePath \"ai.clck.\" $activeVersion\n\nif ($files.ContainsKey($activeVersion) -ne $true) {\n    Write-LogFailure \"Version [$activeVersion] does not appear to be deployed to [$container]\"\n} elseif ($files[$activeVersion].Count -ne 12 -and\n        $files[$activeVersion].Count -ne 13) {          # Since 2.6.5\n    Write-LogFailure \"Version [$activeVersion] does not fully deployed to [$container] -- only found [$($files[$activeVersion].Count)] file(s)\"\n}\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\nSetActiveVersion $files[$activeVersion] $storePath $minorOnly\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/Behaviours.ts",
    "content": "/**\n*  @copyright Microsoft 2020\n*/\n\n// Behavior enum values\nexport enum Behavior {\n    UNDEFINED = 0,\t\t\t\t// default, Undefined\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Page Experience [1-19]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    NAVIGATIONBACK = 1,          // Advancing to the previous index position within a webpage\n    NAVIGATION = 2,              // Advancing to a specific index position within a webpage\n    NAVIGATIONFORWARD = 3,       // Advancing to the next index position within a webpage\n    APPLY = 4,\t\t\t\t\t// Applying filter(s) or making selections\n    REMOVE = 5,\t\t\t\t\t// Applying filter(s) or removing selections\n    SORT = 6,\t\t\t\t\t// Sorting content\n    EXPAND = 7,\t\t\t\t\t// Expanding content or content container\n    REDUCE = 8,\t\t\t\t\t// Sorting content\n    CONTEXTMENU = 9,             // Context Menu\n    TAB = 10,                    // Tab control\n    COPY = 11,                   // Copy the contents of a page\n    EXPERIMENTATION = 12,        // Used to identify a third party experimentation event\n    PRINT = 13,                  // User printed page\n    SHOW = 14,                   //  Displaying an overlay\n    HIDE = 15,                   //  Hiding an overlay\n    MAXIMIZE = 16,               //  Maximizing an overlay\n    MINIMIZE = 17,               // Minimizing an overlay\n    BACKBUTTON = 18,             //  Clicking the back button\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Scenario Process [20-39]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    STARTPROCESS = 20,\t\t\t// Initiate a web process unique to adopter\n    PROCESSCHECKPOINT = 21,\t\t// Represents a checkpoint in a web process unique to adopter\n    COMPLETEPROCESS = 22,\t\t// Page Actions that complete a web process unique to adopter\n    SCENARIOCANCEL = 23, // Actions resulting from cancelling a process/scenario\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Download [40-59]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    DOWNLOADCOMMIT = 40,\t\t    // Initiating an unmeasurable off-network download\n    DOWNLOAD = 41,\t\t\t\t// Initiating a download\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Search [60-79]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    SEARCHAUTOCOMPLETE = 60,\t    // Auto-completing a search query during user input\n    SEARCH = 61,\t\t\t\t    // Submitting a search query\n    SEARCHINITIATE = 62,\t\t\t// Initiating a search query\n    TEXTBOXINPUT = 63,   // Typing or entering text in the text box\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Commerce [80-99]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    VIEWCART = 82,               // Viewing the cart\n    ADDWISHLIST = 83,            // Adding a physical or digital good or services to a wishlist\n    FINDSTORE = 84,              // Finding a physical store\n    CHECKOUT = 85,               // Before you fill in credit card info\n    REMOVEFROMCART = 86,         // Remove an item from the cart\n    PURCHASECOMPLETE = 87,       // Used to track the pageView event that happens when the CongratsPage or Thank You page loads after a successful purchase\n    VIEWCHECKOUTPAGE = 88,       // View the checkout page\n    VIEWCARTPAGE = 89,           // View the cart page\n    VIEWPDP = 90,                // View a PDP\n    UPDATEITEMQUANTITY = 91,     // Update an item's quantity\n    INTENTTOBUY = 92,            // User has the intent to buy an item\n    PUSHTOINSTALL = 93,          // User has selected the push to install option\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Authentication [100-119]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    SIGNIN = 100,\t\t\t\t// User sign-in\n    SIGNOUT = 101,\t\t\t\t// User sign-out\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Social [120-139]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    SOCIALSHARE = 120,\t\t\t// \"Sharing\" content for a specific social channel\n    SOCIALLIKE = 121,\t\t\t// \"Liking\" content for a specific social channel\n    SOCIALREPLY = 122,\t\t\t// \"Replying\" content for a specific social channel\n    CALL = 123,                  // Click on a \"call\" link\n    EMAIL = 124,                 // Click on an \"email\" link\n    COMMUNITY = 125,             // Click on a \"community\" link\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Feedback [140-159]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    VOTE = 140,\t\t\t\t\t// Rating content or voting for content\n    SURVEYCHECKPOINT = 145,      // reaching the survey page/form\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Registration, Contact [160-179]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    REGISTRATIONINITIATE = 161,  // Initiating a registration process\n    REGISTRATIONCOMPLETE = 162,  // Completing a registration process\n    CANCELSUBSCRIPTION = 163,    // Canceling a subscription\n    RENEWSUBSCRIPTION = 164,     // Renewing a subscription\n    CHANGESUBSCRIPTION = 165,     // Changing a subscription\n    REGISTRATIONCHECKPOINT = 166, // Reaching the registration page/form\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Chat [180-199]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    CHATINITIATE = 180,\t\t\t// Initiating a chat experience\n    CHATEND = 181,\t\t\t\t// Ending a chat experience\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Trial [200-209]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    TRIALSIGNUP = 200,\t\t\t// Signing-up for a trial\n    TRIALINITIATE = 201,         // Initiating a trial\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Signup [210-219]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    SIGNUP = 210,\t\t\t  // Signing-up for a notification or service\n    FREESIGNUP = 211,         // Signing-up for a free service\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Referals [220-229]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    PARTNERREFERRAL = 220,\t\t// Navigating to a partner's web property\n    \n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Intents [230-239]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    LEARNLOWFUNNEL = 230,       // Engaging in learning behavior on a commerce page (ex. \"Learn more click\")\n    LEARNHIGHFUNNEL = 231,      // Engaging in learning behavior on a non-commerce page (ex. \"Learn more click\")\n    SHOPPINGINTENT = 232,       // Shopping behavior prior to landing on a commerce page\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // Video [240-259]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    VIDEOSTART = 240,\t\t\t// Initiating a video\n    VIDEOPAUSE = 241,\t\t\t// Pausing a video\n    VIDEOCONTINUE = 242,\t\t    // Pausing or resuming a video.\n    VIDEOCHECKPOINT = 243,\t\t// Capturing predetermined video percentage complete.\n    VIDEOJUMP = 244,\t\t\t    // Jumping to a new video location.\n    VIDEOCOMPLETE = 245,\t\t    // Completing a video (or % proxy)\n    VIDEOBUFFERING = 246,\t\t// Capturing a video buffer event\n    VIDEOERROR = 247,\t\t\t// Capturing a video error\n    VIDEOMUTE = 248,\t\t\t    // Muting a video\n    VIDEOUNMUTE = 249,\t\t\t// Unmuting a video\n    VIDEOFULLSCREEN = 250,\t\t// Making a video full screen\n    VIDEOUNFULLSCREEN = 251,\t    // Making a video return from full screen to original size\n    VIDEOREPLAY = 252,           // Making a video replay\n    VIDEOPLAYERLOAD = 253,       // Loading the video player\n    VIDEOPLAYERCLICK = 254,        //  Click on a button within the interactive player\n    VIDEOVOLUMECONTROL = 255,       //  Click on video volume control\n    VIDEOAUDIOTRACKCONTROL = 256,     // Click on audio control within a video\n    VIDEOCLOSEDCAPTIONCONTROL = 257,    //  Click on the closed caption control\n    VIDEOCLOSEDCAPTIONSTYLE = 258,     //  Click to change closed caption style\n    VIDEORESOLUTIONCONTROL = 259,     //  Click to change resolution\n\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    // \tAdvertisement Engagement [280-299]\n    ///////////////////////////////////////////////////////////////////////////////////////////////////\n    ADBUFFERING = 283,           // Ad is buffering\n    ADERROR = 284,               // Ad error\n    ADSTART = 285,               // Ad start\n    ADCOMPLETE = 286,            // Ad complete\n    ADSKIP = 287,                // Ad skipped\n    ADTIMEOUT = 288,             // Ad timed-out\n    OTHER = 300\t\t\t\t\t// Other\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/ClickAnalyticsPlugin.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, IAppInsightsCore, IConfig, IConfigDefaults, IConfiguration, ICustomProperties, IPlugin, IProcessTelemetryContext,\n    IProcessTelemetryUnloadContext, IPropertiesPlugin, ITelemetryItem, ITelemetryPluginChain, ITelemetryUnloadState,\n    PropertiesPluginIdentifier, _eInternalMessageId, _throwInternal, arrForEach, cfgDfFunc, cfgDfMerge, cfgDfString, cfgDfValidate,\n    createProcessTelemetryContext, dumpObj, eLoggingSeverity, getExceptionName, isNullOrUndefined, onConfigChange, throwError,\n    unloadComponents\n} from \"@microsoft/applicationinsights-core-js\";\nimport { PropertiesPlugin } from \"@microsoft/applicationinsights-properties-js\";\nimport { getDocument, hasDocument, objDeepFreeze, strSubstring, strTrim } from \"@nevware21/ts-utils\";\nimport {\n    IAutoCaptureHandler, IClickAnalyticsConfiguration, IContentHandler, ICoreData, ICustomDataTags, IPageActionTelemetry, IValueCallback\n} from \"./Interfaces/Datamodel\";\nimport {\n    BehaviorEnumValidator, BehaviorMapValidator, BehaviorValueValidator, DEFAULT_AI_BLOB_ATTRIBUTE_TAG, DEFAULT_DATA_PREFIX,\n    DEFAULT_DONOT_TRACK_TAG\n} from \"./common/Utils\";\nimport { PageAction } from \"./events/PageAction\";\nimport { AutoCaptureHandler } from \"./handlers/AutoCaptureHandler\";\nimport { DomContentHandler } from \"./handlers/DomContentHandler\";\n\nexport { BehaviorMapValidator, BehaviorValueValidator, BehaviorEnumValidator }\n\nconst defaultValues: IConfigDefaults<IClickAnalyticsConfiguration> = objDeepFreeze({\n    autoCapture: true,\n    callback: cfgDfMerge<IValueCallback, IClickAnalyticsConfiguration>({\n        pageActionPageTags: cfgDfFunc(),\n        pageName: cfgDfFunc(),\n        contentName: cfgDfFunc()\n    }),\n    pageTags: {},\n    coreData: cfgDfMerge<ICoreData, IClickAnalyticsConfiguration>({\n        referrerUri: hasDocument() ? getDocument().referrer : \"\",\n        requestUri: cfgDfString(),\n        pageName: cfgDfString(),\n        pageType: cfgDfString()\n    }),\n    dataTags: cfgDfMerge<ICustomDataTags, IClickAnalyticsConfiguration>({\n        useDefaultContentNameOrId: false,\n        aiBlobAttributeTag: DEFAULT_AI_BLOB_ATTRIBUTE_TAG,\n        customDataPrefix: cfgDfValidate(_dataPrefixChk, DEFAULT_DATA_PREFIX),\n        captureAllMetaDataContent: false,\n        dntDataTag: DEFAULT_DONOT_TRACK_TAG,\n        metaDataPrefix: cfgDfString(),\n        parentDataTag: cfgDfString()\n    }),\n    behaviorValidator: cfgDfFunc((key:string) => key || \"\"),\n    defaultRightClickBhvr: cfgDfString(),\n    dropInvalidEvents : false,\n    urlCollectHash: false,\n    urlCollectQuery: false,\n    trackElementTypes: cfgDfString(\"A,BUTTON,AREA,INPUT\")\n});\n\nfunction _dataPrefixChk(val: any) {\n    return val && val.indexOf(DEFAULT_DATA_PREFIX) === 0;\n}\n\nexport class ClickAnalyticsPlugin extends BaseTelemetryPlugin {\n    public identifier: string = \"ClickAnalyticsPlugin\";\n    public priority: number = 181;\n    public static Version = \"#version#\";\n\n    constructor() {\n        super();\n\n        let _config: IClickAnalyticsConfiguration;\n        let _pageAction: PageAction;\n        let _autoCaptureHandler: IAutoCaptureHandler;\n        let _contentHandler: IContentHandler;\n        let _autoCapture: boolean;\n\n        dynamicProto(ClickAnalyticsPlugin, this, (_self, _base) => {\n            let _identifier = _self.identifier;\n            _initDefaults();\n\n            _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) => {\n\n                if (isNullOrUndefined(core)) {\n                    throwError(\"Error initializing\");\n                }\n\n                super.initialize(config, core, extensions, pluginChain);\n                _populateDefaults(config);\n\n                // Find the properties plugin.\n                let _propertiesExtension:IPropertiesPlugin;\n                arrForEach(extensions, extension => {\n                    if (extension.identifier === PropertiesPluginIdentifier) {\n                        _propertiesExtension = extension as PropertiesPlugin;\n                    }\n                });\n                // Append Click Analytics Plugin Version to SDK version.\n                if (_propertiesExtension && _propertiesExtension.context && _propertiesExtension.context.internal) {\n                    let theVersion = _propertiesExtension.context.internal.sdkVersion;\n                    if (theVersion) {\n                        theVersion += \"_ClickPlugin\"+ ClickAnalyticsPlugin.Version;\n                        if (theVersion.length > 64) {\n                            theVersion = strTrim(strSubstring(theVersion, 0, 64));\n                        }\n\n                        _propertiesExtension.context.internal.sdkVersion = theVersion\n                    }\n                }\n            }\n        \n            _self.processTelemetry = (env: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void => {\n                _self.processNext(env, itemCtx);\n            };\n        \n            _self.trackPageAction = (pageAction?: IPageActionTelemetry, customProperties?: ICustomProperties) => {\n                try {\n                    _pageAction.trackPageAction(pageAction, customProperties);\n                } catch (e) {\n                    _throwInternal(\n                        _self.diagLog(),\n                        eLoggingSeverity.CRITICAL,\n                        _eInternalMessageId.TrackPageActionEventFailed,\n                        \"trackPageAction failed, page action event will not be collected: \" + getExceptionName(e),\n                        { exception: dumpObj(e) });\n                }\n            };\n\n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void): void | boolean => {\n                return unloadComponents([\n                    _autoCaptureHandler,\n                    _contentHandler,\n                    _pageAction\n                ], unloadCtx, unloadState, () => {\n                    _initDefaults();\n                    asyncCallback && asyncCallback();\n                })\n            };\n\n            function _populateDefaults(config: IConfiguration) {\n                let core = _self.core;\n\n                _self._addHook(onConfigChange(config, (details) => {\n                    let config = details.cfg;\n                    let ctx = createProcessTelemetryContext(null, config, core);\n                    let _config = ctx.getExtCfg(_identifier, defaultValues);\n\n                    let logger = _self.diagLog();\n                    _contentHandler = new DomContentHandler(_config, logger);\n                    let metaTags = _contentHandler.getMetadata();\n                    _pageAction = new PageAction(_self, _config, _contentHandler, _config.callback.pageActionPageTags, metaTags, logger);\n\n                    // Default to DOM autoCapture handler\n                    if (_autoCaptureHandler) {\n                        _autoCaptureHandler._doUnload();\n                    }\n                    _autoCaptureHandler = new AutoCaptureHandler(_self, _config, _pageAction, logger);\n                    let autoCapture = !!_config.autoCapture;\n                    if (!_autoCapture && autoCapture) {\n                        _autoCaptureHandler.click();\n                    }\n                    _autoCapture = autoCapture;\n                }));\n            }\n\n            function _initDefaults() {\n                _config = null;\n                _pageAction = null;\n                _autoCaptureHandler = null;\n                _contentHandler = null;\n                _autoCapture = false;\n            }\n        });\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Logs a page action event.\n     * @param IPageActionTelemetry - The page action event to log.\n     * @param customProperties - Additional data used to filter events and metrics. Defaults to empty.\n     */\n    public trackPageAction(pageAction?: IPageActionTelemetry, customProperties?: ICustomProperties) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/DataCollector.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nimport {\n    IConfiguration, fieldRedaction, getDocument, getLocation, getWindow, hasDocument, isFunction\n} from \"@microsoft/applicationinsights-core-js\";\nimport { scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { IClickAnalyticsConfiguration, IOverrideValues } from \"./Interfaces/Datamodel\";\nimport { findClosestAnchor, isValueAssigned } from \"./common/Utils\";\n\nvar clickCaptureInputTypes = { BUTTON: true, CHECKBOX: true, RADIO: true, RESET: true, SUBMIT: true };\n\n\n/**\n * Get Image href of a given HTMLImageElement\n * @param element - An html image element\n * @returns Href value.\n */\nexport function getImageHref(element: HTMLImageElement): string {\n    var temp = element;\n    if (temp) {\n        var parent = findClosestAnchor(temp as Element);\n        if (parent && (parent as any).length === 1) {\n            const firstParent = parent[0];\n            if (firstParent.href) {\n                return firstParent.href;\n            } else if (firstParent.src) {\n                return (firstParent.src);\n            }\n        }\n    }\n    return \"\";\n}\n\n\n/**\n * Get click target\n * @returns Click target URI\n */\nexport function getClickTarget(element: any) {\n    var clickTarget = \"\";\n    switch (element.tagName) {\n    case \"A\":\n    case \"AREA\":\n        clickTarget = element.href || \"\";\n        break;\n    case \"IMG\":\n        clickTarget = getImageHref(element as HTMLImageElement);\n        break;\n    case \"INPUT\":\n        var type = element.type;\n        if (type && (clickCaptureInputTypes[type.toUpperCase()])) {\n            let loc = getLocation() || ({} as Location);\n            if (element.form) {\n                clickTarget = element.form.action || (loc.pathname || \"\");\n            } else {\n                clickTarget = loc.pathname || \"\";\n            }\n        }\n        break;\n    default:\n        break;\n    }\n    return clickTarget;\n}\n\n/**\n * Execute callback when DOM finish loading\n */\nexport function onDomLoaded(callback: () => void) {\n    onDomReadyDo(() => {\n        if (hasDocument() && getDocument().readyState === \"complete\") {\n            callback();\n        } else {\n            let win = getWindow();\n            if (win) {\n                if (win.addEventListener) {\n                    win.addEventListener(\"load\", () => {\n                        callback();\n                    }); // NB **not** 'onload'\n                } else if ((win as any).attachEvent) {\n                    (win as any).attachEvent(\"onload\", () => {\n                        callback();\n                    }); // IE8\n                }\n            }\n        }\n    });\n}\n\n// use smallest domready ever for IE8. When IE8 is deprecated, use addEventListener('DomContentLoaded')\nfunction onDomReadyDo(f: any) {\n    /// <summary> fires function f on domRead </summary>\n    /// <param type='function'>function to call on domRead</param>\n\n    let doc = getDocument() || ({} as Document);\n    /in/.test(doc.readyState) ? scheduleTimeout(() => {\n        onDomReadyDo(f);\n    }, 100) : f.call();\n}\n\n/**\n * Gets the pageName from the DOM or by calling a override if set.\n * @param config - configuration object\n * @returns Page name.\n */\nexport function getPageName(config: IClickAnalyticsConfiguration, overrideValues: IOverrideValues) {\n    /// <summary>\n    ///  Gets the pageName from the DOM or by calling a override if set.\n    /// </summary>\n\n    if (overrideValues && overrideValues.pageName) {\n        return overrideValues.pageName;\n    } else if (config.callback && isFunction(config.callback.pageName)) {\n        return config.callback.pageName();\n    } else if (config.coreData && config.coreData.pageName) {\n        return config.coreData.pageName;\n    } else {\n        const doc = getDocument();\n        return doc && doc.title || \"\";\n    }\n}\n\n/**\n * Sanitize URL values\n * @param config - Configuration\n * @param location - window.location or document.location\n * @returns Flag indicating if an element is market PII.\n */\nexport function sanitizeUrl(config: IClickAnalyticsConfiguration, location: Location, rootConfig?: IConfiguration): string {\n    if (!location) {\n        return null;\n    }\n    var url = location.protocol + \"//\" + (location.hostname || location.host) +         // location.hostname is not supported on Opera and Opera for Android\n        (isValueAssigned(location.port) ? \":\" + location.port : \"\") +\n        location.pathname;\n        \n    if (!!config.urlCollectHash) { // false by default\n        url += (isValueAssigned(location.hash)? location.hash : \"\");\n    }\n\n    if (!!config.urlCollectQuery) { // false by default\n        url += (isValueAssigned(location.search)? location.search : \"\");\n    }\n    url = fieldRedaction(url, rootConfig);\n    return url;\n}\n\n/**\n * Get URI, sanitize the value if configured on\n * @param config - Configuration\n * @param location - window.location or document.location\n * @returns Flag indicating if an element is market PII.\n */\nexport function getUri(config: IClickAnalyticsConfiguration, location: any): string {\n    if (config.coreData && config.coreData.requestUri && config.coreData.requestUri !== \"\") {\n        return config.coreData.requestUri;\n    }\n    return sanitizeUrl(config, location);\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/Enums.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nexport const ActionType = {\n    CLICKLEFT: \"CL\",\n    CLICKRIGHT: \"CR\",\n    CLICKMIDDLE: \"CM\",\n    SCROLL: \"S\",\n    ZOOM: \"Z\",\n    RESIZE: \"R\",\n    KEYBOARDENTER: \"KE\",\n    KEYBOARDSPACE: \"KS\",\n    OTHER: \"O\"\n};\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/Interfaces/Datamodel.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nimport { IEventTelemetry, IUnloadableComponent } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * ClickAnalytics Configuration\n */\nexport interface IClickAnalyticsConfiguration {\n    /**\n     * Automatic capture configuration. Default is true\n     */\n    autoCapture?: boolean;\n    /**\n     * Callbacks configuration\n     */\n    callback?: IValueCallback;\n    /**\n     * Page tags\n     */\n    pageTags?: { [name: string]: string | number | boolean | string[] | number[] | boolean[] | object };\n    /**\n     * Core data configuration\n     */\n    coreData?: ICoreData;\n    /**\n     * Custom Data Tags provided to ovverride default tags used to capture click data.\n     */\n    dataTags?: ICustomDataTags;\n    /**\n     * Validator to use for the data-bhvr value\n     */\n    behaviorValidator?: (value: string | number) => string | number;\n    /**\n     * Default Behavior value when Right Click event has occured. This\n     * value will be ovverriden if the element has the data-*-bhvr attribute present.\n     */\n    defaultRightClickBhvr?: string | number;\n    /**\n     * Flag to drop events that do not have custom event names, no parentId and no data in content (basically no useful click data).\n     * Default will be false\n     */\n    dropInvalidEvents?: boolean;\n    /**\n    * Enables the logging of values after a \"#\" character of the URL. Default is \"false.\"\n    */\n    urlCollectHash?: boolean;\n    /**\n    * Enables the logging of the query string of the URL. Default is \"false.\"\n    */\n    urlCollectQuery?: boolean;\n\n    /**\n     * A list of element types to track. Default is \"undefined\" which means default elements [\"a\", \"button\", \"area\", \"input\"] are tracked.\n     * If set, it will combine with the default element types.\n    */\n    trackElementTypes?: string;\n}\n\n/**\n * Custom Data Tags Configuration\n */\nexport interface ICustomDataTags {\n    /**\n     * When a particular element is not tagged with content name prefix or content name prefix is not provided by user, this flag is used to collect standard HTML attribute for contentName and id.\n     */\n    useDefaultContentNameOrId?: boolean;\n    /**\n     * Automatic capture content name and value of elements which are tagged with provided prefix\n     */\n    customDataPrefix?: string;\n    /**\n     * Click Analytics supports a JSON blob content meta data tagging instead of individual data-* attributes. The default attribute is data-ai-blob. This property allows for changing that attribute name.\n     */\n    aiBlobAttributeTag?: string;\n    /**\n     * Automatic capture metadata name and content with provided prefix\n     */\n    metaDataPrefix?: string;\n    /**\n     * Automatic capture all metadata names and content. Default is false. If enabled this will override provided metaTagPrefix.\n     */\n    captureAllMetaDataContent?: boolean;\n    /**\n     * Stop traversing up the DOM to capture content name and value of elements when encountered with this tag\n     */\n    parentDataTag?: string;\n    /**\n     * Custom attribute Tag to not track telemetry data\n     */\n    dntDataTag?: string\n}\n\n/**\n * Core data configuration\n */\nexport interface ICoreData {\n    /**\n     * document.referrer is the default. This is used to override the default value.\n     */\n    referrerUri?: string;\n    /**\n     * window.location.href is the default. This is used to override the default value.\n     */\n    requestUri?: string;\n    /**\n     * Default page name is derived from the url. This is used to override the default.\n     */\n    pageName?: string;\n    /**\n     * PageType is captured from a meta tag named awa-pageType. This is used to override the value or bypass defining meta tags.\n     */\n    pageType?: string;\n}\n\n\n/**\n * Value Callbacks configuration\n */\nexport interface IValueCallback {\n\n    /**\n     * Function to override the default pageName capturing behavior.\n     */\n    pageName?: () => string;\n    /**\n     * A callback function to augument the default pageTags collected during pageAction event.\n     */\n    pageActionPageTags?: (element?: Element) => IPageTags;\n    /**\n     * A callback function to populate customized contentName.\n     */\n    contentName?: (element?: any, useDefaultContentName?: boolean) => string;\n}\n\n\n/**\n * PageTags format\n */\nexport interface IPageTags {\n    /**\n     * Meta data tags\n     */\n    metaTags?: { [name: string]: string };\n    /**\n     * Any other page tag\n     */\n    [name: string]: string | number | boolean | string[] | number[] | boolean[] | object | undefined;\n}\n\n/**\n * Auto capture handler interface\n */\nexport interface IAutoCaptureHandler extends IUnloadableComponent {\n    /**\n     * Auto capture click\n     */\n    click: () => void;\n}\n\nexport interface IPageActionOverrideValues extends IOverrideValues {\n    /**\n     * Uri of the referrer page\n     */\n    refUri?: string;\n    /**\n     *  One of the awa.actionType values\n     */\n    actionType?: string;\n    /**\n     * Target uri for PageAction events\n     */\n    targetUri?: string;\n    /**\n     * Click coordinates relative to the top left of the fully rendered content area in the browser\n     */\n    clickCoordinateX?: number;\n    /**\n     * Click coordinates relative to the top left of the fully rendered content area in the browser\n     */\n    clickCoordinateY?: number;\n    /**\n     * KVP of the content\n     */\n    content?: any;\n    /**\n     * KVPs to be added to the content tags collected on a Page Action event; extends the items in the Content blob in Page Action events\n     */\n    contentTags?: any;\n}\n\n/**\n * Override values interface\n */\nexport interface IOverrideValues {\n    /**\n     * One of the awa.behavior values.\n     */\n    behavior?: string | number;\n    /**\n     * Page name\n     */\n    pageName?: string;\n    /**\n     * Page type\n     */\n    pageType?: string;\n    /**\n     * KVP to be added to the page tags collected\n     */\n    pageTags?: any;\n    /**\n     * Indicates if the event was fired automatically\n     */\n    isAuto?: boolean;\n}\n\n/**\n * Content interface\n */\nexport interface IContent {\n    /**\n     * Friendly name (Content Name) of the content to be used reporting/visualization purposes\n     */\n    cN?: string;\n    /**\n     * Unique identifier (friendly names allowed) of the content (Content Id) as designated by the content provider.\n     * The name should be unique per contentSource such that the two make up the compound key and such that the contentId can be\n     * looked up in the contentSource for additional metadata.\n     */\n    id?: string;\n    /**\n     * User specified custom content properties\n     */\n    [name: string]: string | number | boolean | string[] | number[] | boolean[] | object | undefined;\n}\n\n/**\n * Content handler interface\n */\nexport interface IContentHandler extends IUnloadableComponent {\n    /**\n     * Get meta data\n     */\n    getMetadata: () => { [name: string]: string };\n    /**\n     * Get element content\n     */\n    getElementContent: (element: Element) => IContent;\n}\n\n/**\n * Page Action event\n */\nexport interface IPageActionTelemetry extends IEventTelemetry {\n    /**\n     * Target uri for PageAction events\n     */\n    targetUri?: string;\n    /**\n     *  One of the awa.actionType values\n     */\n    actionType?: string;\n    /**\n     * One of the awa.behavior values.\n     */\n    behavior?: string | number;\n    /**\n     * X, Y representing the absolute co-ordinates withrespect to topleft corner of the page. This should be normalized for the screen resolution to provide better heat map.\n     */\n    clickCoordinates?: string;\n    /**\n     * JSON-formatted array of content acted upon\n     */\n    content?: any;\n    /**\n     * Version indicating content version which aids in parsing the content.\n     */\n    contentVer?: string;\n    /**\n     * Uri of the referrer, this is a convinence for adaptors to just leverage PageAction for click analytics without linking it to the respective Page Views.\n     */\n    refUri?: string;\n    /**\n     * Time taken in milliseconds since the user saw the page and took the action (such as click on a link, etc.). This will be in seconds.\n     */\n    timeToAction?: number;\n    /**\n     * A relative or absolute URL that identifies the page or other item. Defaults to the window location.\n     */\n    uri?: string;\n    /**\n     * Page type\n     */\n    pageType?: string;\n    /**\n     * Title of the page\n     */\n    pageName?: string;\n    /**\n     * Content Id (Parent Id) of the parent in which the content was located;\n     */\n    parentId?: string;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/applicationinsights-clickanalytics-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { Behavior } from \"./Behaviours\";\nimport { BehaviorEnumValidator, BehaviorMapValidator, BehaviorValueValidator, ClickAnalyticsPlugin } from \"./ClickAnalyticsPlugin\";\nimport {\n    IClickAnalyticsConfiguration, IContent, ICoreData, ICustomDataTags, IOverrideValues, IPageActionOverrideValues, IPageActionTelemetry,\n    IPageTags, IValueCallback\n} from \"./Interfaces/Datamodel\";\n\n// Re-export ICustomProperties from core\nexport { ICustomProperties } from \"@microsoft/applicationinsights-core-js\";\n\nexport { IClickAnalyticsConfiguration, IValueCallback, ICustomDataTags, ICoreData, IPageTags, IPageActionTelemetry, IContent, IOverrideValues, IPageActionOverrideValues, Behavior, ClickAnalyticsPlugin, BehaviorMapValidator, BehaviorValueValidator, BehaviorEnumValidator }\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/common/Utils.ts",
    "content": "/**\n* @copyright Microsoft 2020\n* File containing utility functions.\n*/\n\nimport { arrForEach, isNullOrUndefined } from \"@microsoft/applicationinsights-core-js\";\nimport { IClickAnalyticsConfiguration } from \"../Interfaces/Datamodel\";\n\nexport const DEFAULT_DONOT_TRACK_TAG = \"ai-dnt\";\nexport const DEFAULT_AI_BLOB_ATTRIBUTE_TAG = \"ai-blob\";\nexport const DEFAULT_DATA_PREFIX = \"data-\";\n\n/**\n * Finds attributes in overrideConfig which are invalid or should be objects\n * and deletes them. useful in override config\n * @param overrideConfig - override config object\n * @param attributeNamesExpectedObjects - attributes that should be objects in override config object\n */\nexport function removeNonObjectsAndInvalidElements(overrideConfig: IClickAnalyticsConfiguration, attributeNamesExpectedObjects: Array<string>): void {\n    removeInvalidElements(overrideConfig);\n    arrForEach(attributeNamesExpectedObjects, (i) => {\n        var objectName = attributeNamesExpectedObjects[i];\n        if (typeof overrideConfig[objectName] === \"object\") {\n            removeInvalidElements(overrideConfig[objectName]);\n        } else {\n            delete overrideConfig[objectName];\n        }\n    });\n}\n\n/**\n * Finds attributes in object which are invalid\n * and deletes them. useful in override config\n * @param object - Input object\n */\nexport function removeInvalidElements(object: Object): void {\n    /// Because the config object 'callback' contains only functions,\n    /// when it is stringified it returns the empty object. This explains\n    /// the workaround regarding 'callback'\n    for (var property in object) {\n        if (!isValueAssigned(object[property]) ||\n            (JSON.stringify(object[property]) === \"{}\" && (property !== \"callback\"))) {\n            delete object[property];\n        }\n    }\n}\n\n/**\n * Checks if value is assigned to the given param.\n * @param value - The token from which the tenant id is to be extracted.\n * @returns True/false denoting if value is assigned to the param.\n */\nexport function isValueAssigned(value: any) {\n    /// <summary> takes a value and checks for undefined, null and empty string </summary>\n    /// <param type=\"any\"> value to be tested </param>\n    /// <returns> true if value is null undefined or emptyString </returns>\n    return !(isNullOrUndefined(value) || value === \"\");\n}\n\n/**\n * Determines whether an event is a right click or not\n * @param evt - Mouse event\n * @returns true if the event is a right click\n */\nexport function isRightClick(evt: any): boolean {\n    try {\n        if (\"which\" in evt) { // Chrome, FF, ...\n            return (evt.which === 3);\n        } else if (\"button\" in evt) { // IE, ...\n            return (evt.button === 2);\n        }\n    } catch (e) {\n        // This can happen with some native browser objects, but should not happen for the type we are checking for\n    }\n}\n\n/**\n * Determines whether an event is a left click or not\n * @param evt - Mouse event\n * @returns true if the event is a left click\n */\nexport function isLeftClick(evt: any): boolean {\n    try {\n        if (\"which\" in evt) { // Chrome, FF, ...\n            return (evt.which === 1);\n        } else if (\"button\" in evt) { // IE, ...\n            return (evt.button === 1);\n        }\n    } catch (e) {\n        // This can happen with some native browser objects, but should not happen for the type we are checking for\n    }\n}\n\n/**\n * Determines whether an event is a middle click or not\n * @param evt - Mouse event\n * @returns true if the event is a middle click\n */\nexport function isMiddleClick(evt: any): boolean {\n    try {\n        if (\"which\" in evt) { // Chrome, FF, ...\n            return (evt.which === 2);\n        } else if (\"button\" in evt) { // IE, ...\n            return (evt.button === 4);\n        }\n    } catch (e) {\n        // This can happen with some native browser objects, but should not happen for the type we are checking for\n    }\n}\n\n/**\n *  Determines whether an event is a keyboard enter or not\n * @param evt - Keyboard event\n * @returns true if the event is a keyboard enter\n */\nexport function isKeyboardEnter(evt: KeyboardEvent): boolean {\n    try {\n        if (\"keyCode\" in evt) { // Chrome, FF, ...\n            return (evt.keyCode === 13);\n        }\n    } catch (e) {\n        // This can happen with some native browser objects, but should not happen for the type we are checking for\n    }\n}\n\n/**\n *  Determines whether an event is a keyboard space or not\n * @param evt - Keyboard event\n * @returns true if the event is a space enter\n */\nexport function isKeyboardSpace(evt: KeyboardEvent) {\n    try {\n        if (\"keyCode\" in evt) { // Chrome, FF, ...\n            return (evt.keyCode === 32);\n        }\n    } catch (e) {\n        // This can happen with some native browser objects, but should not happen for the type we are checking for\n    }\n}\n\n/**\n *  Determines whether the elemt have a DNT(Do Not Track) tag\n * @param element - DOM element\n * @param doNotTrackFieldName - DOM element\n * @returns true if the element must not be tarcked\n */\nexport function isElementDnt(element: Element, doNotTrackFieldName: string): boolean {\n    var dntElement = findClosestByAttribute(element, doNotTrackFieldName);\n    if (!isValueAssigned(dntElement)) {\n        return false;\n    }\n    return true;\n}\n\n/**\n * Walks up DOM tree to find element with attribute\n * @param el - DOM element\n * @param attribute - Attribute name\n * @returns Dom element which contains attribute\n */\nexport function findClosestByAttribute(el: Element, attribute: string): Element {\n    return walkUpDomChainWithElementValidation(el, isAttributeInElement, attribute);\n}\n\n/**\n * checks if attribute is in element.\n * method checks for empty string, in case the attribute is set but no value is assigned to it\n * @param element - DOM element\n * @param attributeToLookFor - Attribute name\n * @returns true if attribute is in element, even if empty string\n */\nexport function isAttributeInElement(element: Element, attributeToLookFor: string): Boolean {\n    var value = element.getAttribute(attributeToLookFor);\n    return isValueAssigned(value);\n}\n\n/**\n * Walks up DOM tree to find element which matches validationMethod\n * @param el - DOM element\n * @param validationMethod - DOM element validation method\n * @param validationMethodParam - DOM element validation method parameters\n * @returns Dom element which is an anchor\n */\nexport function walkUpDomChainWithElementValidation(el: Element, validationMethod: Function, validationMethodParam?: any): Element {\n    var element = el;\n    if (element) {\n        while (!validationMethod(element, validationMethodParam)) {\n            element = (element.parentNode as Element);\n            if (!element || !(element.getAttribute)) {\n                return null;\n            }\n        }\n        return element;\n    }\n}\n\n\n/**\n * Determine if DOM element is an anchor\n * @param element - DOM element\n * @returns Is element an anchor\n */\nexport function isElementAnAnchor(element: Element): boolean {\n    return element.nodeName === \"A\";\n}\n\n/**\n * Walks up DOM tree to find anchor element\n * @param element - DOM element\n * @returns Dom element which is an anchor\n */\nexport function findClosestAnchor(element: Element): Element {\n    /// <summary> Walks up DOM tree to find anchor element </summary>\n    /// <param type='object'> DOM element </param>\n    /// <returns> Dom element which is an anchor</returns>\n\n    return walkUpDomChainWithElementValidation(element, isElementAnAnchor);\n}\n\n/**\n * Returns the specified field and also removes the property from the object if exists.\n * @param obj - Input object\n * @param fieldName - >Name of the field/property to be extracted\n * @returns Value of the specified tag\n */\nexport function extractFieldFromObject(obj: Object, fieldName: string): string {\n    var fieldValue: any;\n    if (obj && obj[fieldName]) {\n        fieldValue = obj[fieldName];\n        delete obj[fieldName];\n    }\n\n    return fieldValue;\n}\n\n/**\n *  Adds surrounding square brackets to the passed in text\n * @param str - Input string\n * @returns String with surrounding brackets\n */\nexport function bracketIt(str: string): string {\n    /// <summary>\n    ///  Adds surrounding square brackets to the passed in text\n    /// </summary>\n    return \"[\" + str + \"]\";\n}\n\nexport function validateContentNamePrefix ( config: IClickAnalyticsConfiguration, defaultDataPrefix: string) {\n    return isValueAssigned(config.dataTags.customDataPrefix) && (config.dataTags.customDataPrefix.indexOf(defaultDataPrefix) === 0);\n}\n\nexport function BehaviorMapValidator (map: any) {\n    return (key: string)  => map[key] || \"\";\n}\n\nexport function BehaviorValueValidator (behaviorArray: string[]) {\n    return (key: string) => {\n        let result;\n        arrForEach(behaviorArray, (value) => {\n            if (value === key) {\n                result = value;\n                return -1;\n            }\n        });\n        return result || \"\";\n    }\n\n}\n\nexport function BehaviorEnumValidator (enumObj: any) {\n    return (key: string)  => enumObj[key] || \"\";\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/events/PageAction.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    ICustomProperties, IDiagnosticLogger, ITelemetryItem, _eInternalMessageId, _throwInternal, eLoggingSeverity, getPerformance, objExtend,\n    objForEachKey, strNotSpecified\n} from \"@microsoft/applicationinsights-core-js\";\nimport { ClickAnalyticsPlugin } from \"../ClickAnalyticsPlugin\";\nimport { getClickTarget } from \"../DataCollector\";\nimport { IClickAnalyticsConfiguration, IContentHandler, IPageActionOverrideValues, IPageActionTelemetry } from \"../Interfaces/Datamodel\";\nimport { bracketIt, extractFieldFromObject, isValueAssigned } from \"../common/Utils\";\nimport { WebEvent } from \"./WebEvent\";\n\nexport class PageAction extends WebEvent {\n    \n    constructor(\n        clickAnalyticsPlugin: ClickAnalyticsPlugin,\n        config: IClickAnalyticsConfiguration,\n        contentHandler: IContentHandler,\n        pageTagsCallback: any,\n        metaTags: { [name: string]: string },\n        traceLogger: IDiagnosticLogger) {\n        super(clickAnalyticsPlugin, config, contentHandler, pageTagsCallback, metaTags, traceLogger);\n        \n        dynamicProto(PageAction, this, (_self, _base) => {\n\n            _self.trackPageAction = (pageActionEvent: IPageActionTelemetry, properties?: ICustomProperties): void => {\n                // Get part A properties\n                var ext = {};\n                ext[\"web\"] = {};\n                let event: ITelemetryItem = {\n                    name: \"Microsoft.ApplicationInsights.{0}.Event\",\n                    baseType: \"EventData\",\n                    ext,\n                    data: {},\n                    baseData: {}\n                };\n        \n                _populateEventDataIfPresent(event.baseData, \"name\", pageActionEvent.name);\n                _populateEventDataIfPresent(event.data, \"baseTypeSource\", \"ClickEvent\");\n                _populateEventDataIfPresent(event.data, \"uri\", pageActionEvent.uri);\n                _populateEventDataIfPresent(event.data, \"pageType\", pageActionEvent.pageType);\n                _populateEventDataIfPresent(event.data, \"properties\", pageActionEvent.properties);\n                _populateEventDataIfPresent(event.data, \"actionType\", pageActionEvent.actionType);\n                _populateEventDataIfPresent(event.data, \"behavior\", pageActionEvent.behavior);\n                _populateEventDataIfPresent(event.data, \"clickCoordinates\", pageActionEvent.clickCoordinates);\n                _populateEventDataIfPresent(event.data, \"content\", pageActionEvent.content);\n                _populateEventDataIfPresent(event.data, \"targetUri\", pageActionEvent.targetUri);\n                _populateEventDataIfPresent(event.data, \"timeToAction\", pageActionEvent.timeToAction);\n                _populateEventDataIfPresent(event.data, \"refUri\", pageActionEvent.refUri);\n                _populateEventDataIfPresent(event.data, \"pageName\", pageActionEvent.pageName);\n                _populateEventDataIfPresent(event.data, \"parentId\", pageActionEvent.parentId);\n        \n                if (properties) {\n                    objForEachKey(properties, (property, value) => {\n                        if (!event.data[property]) {\n                            _populateEventDataIfPresent(event.data, property, value);\n                        }\n                    });\n                }\n                _self._clickAnalyticsPlugin.core.track(event);\n            };\n        \n            /**\n             * API to create and send a populated PageAction event\n             * @param element - DOM element\n             * @param overrideValues - PageAction overrides\n             * @param customProperties - Custom properties(Part C)\n             * @param isRightClick - Flag for mouse right clicks\n             */\n            _self.capturePageAction = (element: Element, overrideValues?: IPageActionOverrideValues, customProperties?: { [name: string]: string | number | boolean | string[] | number[] | boolean[] | object }, isRightClick?: boolean): void => {\n                overrideValues = !isValueAssigned(overrideValues) ? {} : overrideValues;\n                let pageActionEvent: IPageActionTelemetry = { name : \"\"};\n                let pageActionProperties: ICustomProperties = isValueAssigned(customProperties) ? customProperties : {};\n                _self.setCommonProperties(pageActionEvent, overrideValues);\n                pageActionEvent.behavior = _self._getBehavior(overrideValues);\n                // element in scope is needed for below properties.  We cannot pass element into the plugin call chain.\n                // process them here.\n                let elementContent: any = {};\n                \n                if (isRightClick) {\n                    // Default behavior for righ click\n                    pageActionEvent.behavior = _self._config.defaultRightClickBhvr;\n                }\n                // Fill PartB\n                if (element) {\n                    pageActionEvent.targetUri = getClickTarget(element);\n        \n                    elementContent = _self._contentHandler.getElementContent(element); // collect id,cn tags\n        \n                    // if the element has a data-*-bhvr attrib defined, use it.\n                    if (elementContent.bhvr && !isValueAssigned(overrideValues.behavior)) {\n                        let currentBehavior: string = extractFieldFromObject(elementContent, \"bhvr\");\n                        pageActionEvent.behavior = _self._getValidBehavior(currentBehavior);\n                    }\n        \n                    // Validate to ensure the minimum required field 'contentName' or 'id' is present. However,\n                    // requiring these fields would result in majority of adopter's content from being collected.\n                    // Just throw a warning and continue collection.\n                    if (!isValueAssigned(elementContent.id) && !isValueAssigned(elementContent.contentName)) {\n                        _throwInternal(_self._traceLogger,\n                            eLoggingSeverity.WARNING,\n                            _eInternalMessageId.InvalidContentBlob, \"Missing attributes id or contentName in click event. Click event information will still be collected!\"\n                        );\n                    }\n                }\n                pageActionEvent.name = elementContent.id || elementContent.contentName || strNotSpecified;\n                pageActionEvent.parentId = elementContent.parentid || elementContent.parentName || strNotSpecified;\n        \n                if (isValueAssigned(overrideValues.actionType)) {\n                    pageActionEvent.actionType = overrideValues.actionType;\n                }\n\n                if (isValueAssigned(overrideValues.clickCoordinateX) && isValueAssigned(overrideValues.clickCoordinateY)) {\n                    pageActionEvent.clickCoordinates = overrideValues.clickCoordinateX + \"X\" + overrideValues.clickCoordinateY;\n                }\n        \n                _sanitizePageActionEventContent(elementContent);\n                pageActionEvent.content = bracketIt(JSON.stringify(objExtend(\n                    elementContent,\n                    overrideValues && overrideValues.contentTags ? overrideValues.contentTags : {})));\n        \n                \n                pageActionEvent.timeToAction = _getTimeToClick();\n                pageActionEvent.refUri = isValueAssigned(overrideValues.refUri) ? overrideValues.refUri : _self._config.coreData.referrerUri;\n                if(_isUndefinedEvent(pageActionEvent)) {\n                    return;\n                }\n                _self.trackPageAction(pageActionEvent, pageActionProperties);\n            };\n            \n            // capture performance data into PageTags\n            function _getTimeToClick() {\n                const perf = getPerformance();\n                if (perf && perf.timing) {\n                    var isNavigationStart = perf.timing.navigationStart;\n                    if (isNavigationStart && isNavigationStart !== 0) {\n                        return new Date().getTime() - isNavigationStart;\n                    }\n                }\n                return -1;\n            }\n\n            function _populateEventDataIfPresent(obj:any, property:any, value:any) {\n                if(isValueAssigned(value)) {\n                    obj[property] = value;\n                }\n            }\n\n            function _sanitizePageActionEventContent(pageActionContent: any) {\n                if(pageActionContent) {\n                    delete pageActionContent.id;\n                    delete pageActionContent.parentid;\n                    delete pageActionContent.parentname;\n                    if(_self._config && _self._config.dataTags && isValueAssigned(_self._config.dataTags.parentDataTag)) {\n                        delete pageActionContent[_self._config.dataTags.parentDataTag];\n                    }\n                }\n            }\n\n            function _isUndefinedEvent(pageActionEvent: IPageActionTelemetry) {\n                if(_self._config.dropInvalidEvents) {\n                    if(pageActionEvent.name === strNotSpecified\n                        && pageActionEvent.parentId === strNotSpecified\n                        && pageActionEvent.content === \"[{}]\") {\n                        return true;\n                    }\n                }\n\n                return false;\n            }\n        });\n    }\n\n    /**\n     * API to send pageAction event\n     * @param pageActionEvent - PageAction event\n     * @param properties - PageAction properties(Part C)\n     */\n    public trackPageAction(pageActionEvent: IPageActionTelemetry, properties?: ICustomProperties): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * API to create and send a populated PageAction event\n     * @param element - DOM element\n     * @param overrideValues - PageAction overrides\n     * @param customProperties - Custom properties(Part C)\n     * @param isRightClick - Flag for mouse right clicks\n     */\n    public capturePageAction(element: Element, overrideValues?: IPageActionOverrideValues, customProperties?: { [name: string]: string | number | boolean | string[] | number[] | boolean[] | object }, isRightClick?: boolean): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/events/WebEvent.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    IDiagnosticLogger, IProcessTelemetryUnloadContext, ITelemetryUnloadState, IUnloadableComponent, getLocation, hasWindow, objExtend\n} from \"@microsoft/applicationinsights-core-js\";\nimport { ClickAnalyticsPlugin } from \"../ClickAnalyticsPlugin\";\nimport { getPageName, getUri } from \"../DataCollector\";\nimport {\n    IClickAnalyticsConfiguration, IContentHandler, ICoreData, IOverrideValues, IPageActionTelemetry, IPageTags\n} from \"../Interfaces/Datamodel\";\nimport { isValueAssigned } from \"../common/Utils\";\n\nexport class WebEvent implements IUnloadableComponent {\n\n    protected _pageTags: IPageTags;\n    protected _pageTypeMetaTag: string;\n    protected _marketMetaTag: string;\n    protected _behaviorMetaTag: string;\n    protected _clickAnalyticsPlugin: ClickAnalyticsPlugin;\n    protected _config: IClickAnalyticsConfiguration;\n    protected _contentHandler: IContentHandler;\n    protected _pageTagsCallback: any;\n    protected _metaTags: { [name: string]: string };\n    protected _traceLogger: IDiagnosticLogger;\n\n    /**\n     * @param clickAnalyticsPlugin - Click Analytics plugin instance\n     * @param config - ClickAnalytics configuration object\n     * @param contentHandler - Content handler\n     * @param id - Id object\n     * @param pageTagsCallback - callback methods to get pageTags value\n     * @param metaTags - Meta tags\n     * @param traceLogger - Trace logger to log to console.\n     */\n    constructor(\n        clickAnalyticsPlugin: ClickAnalyticsPlugin,\n        config: IClickAnalyticsConfiguration,\n        contentHandler: IContentHandler,\n        pageTagsCallback: any,\n        metaTags: { [name: string]: string },\n        traceLogger: IDiagnosticLogger) {\n\n        dynamicProto(WebEvent, this, (_self) => {\n            _initDefaults();\n\n            function _initDefaults() {\n                _self._pageTags = {};\n                _self._clickAnalyticsPlugin = clickAnalyticsPlugin;\n                _self._config = config;\n                _self._contentHandler = contentHandler;\n                _self._pageTagsCallback = pageTagsCallback;\n                _self._metaTags = metaTags;\n                _self._traceLogger = traceLogger;\n            }\n\n            _self.setBasicProperties = (event: IPageActionTelemetry, overrideValues: IOverrideValues) => {\n                if (!isValueAssigned(event.name)) {\n                    event.pageName = getPageName(_self._config, overrideValues);\n                }\n                if (!isValueAssigned(event.uri) && hasWindow()) {\n                    event.uri = getUri(_self._config, getLocation());\n                }\n            };\n        \n            /**\n             * Sets common properties for events that are based on the WebEvent schema.\n             * @param event - The event\n             */\n            _self.setCommonProperties = (event: IPageActionTelemetry, overrideValues: IOverrideValues) => {\n                _self.setBasicProperties(event, overrideValues);\n                _self._setPageTags(event, overrideValues);\n        \n                // extract specific meta tags out of the pageTags.metaTags collection.  These will go into assigned first class fields in the event.\n                // the rest will go into pageTags.metaTags collection as is.\n                _self._pageTypeMetaTag = _getMetaData(_self._metaTags, _self._config.coreData, \"pageType\");\n                _self._behaviorMetaTag = _getMetaData(_self._metaTags, _self._config.coreData, \"behavior\");\n        \n                if (isValueAssigned(overrideValues.pageType)) {\n                    event.pageType = overrideValues.pageType;\n                }\n                // Only assign if not overriden and meta data is available\n                if (isValueAssigned(_self._pageTypeMetaTag) && !isValueAssigned(event.pageType)) {\n                    event.pageType = _self._pageTypeMetaTag;\n                }\n            };\n        \n            /**\n             * Sets pageTags.\n             * @param event - The event\n             */\n            _self._setPageTags = (event: IPageActionTelemetry, overrideValues: IOverrideValues) => {\n                // Prepare the pageTags object that is mostly the same for all events.  Event specific pageTags will be added inside event constructors.\n               \n                if (_self._pageTagsCallback) {\n                    _self._pageTags = objExtend(true, _self._pageTags, _self._pageTagsCallback());\n                }\n                if (isValueAssigned(overrideValues.pageTags)) {\n                    _self._pageTags = objExtend(true, _self._pageTags, overrideValues.pageTags);\n                }\n                // If metadata is present add it to pageTags property\n                if (_self._metaTags) {\n                    _self._pageTags.metaTags = {};\n                    // Remove not supported meta data in pageTags.metaTags\n                    for (var metaTag in _self._metaTags) {\n                        if (metaTag != \"behavior\" && metaTag != \"market\" && metaTag != \"pageType\") {\n                            _self._pageTags.metaTags[metaTag] = _self._metaTags[metaTag];\n                        }\n                    }\n                }\n                // All metadata tags that must be saved as properties have been extracted at this point.  Assign pageTags as is.\n                event.properties = event.properties || {};\n                event.properties[\"pageTags\"] = _self._pageTags;\n            };\n        \n            _self._getBehavior = (overrideValues?: IOverrideValues): string | number => {\n                let behavior: string | number;\n                // If override specified\n                if (overrideValues && isValueAssigned(overrideValues.behavior)) {\n                    behavior = overrideValues.behavior;\n                } else if (isValueAssigned(_self._behaviorMetaTag)) {\n                    // If behavior meta tag available\n                    behavior = _self._behaviorMetaTag;\n                }\n                return _self._getValidBehavior(behavior);\n            };\n        \n            _self._getValidBehavior = (behavior: string | number): string | number => {\n                return _self._config.behaviorValidator(behavior);\n            };\n        \n            _self._doUnload = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void): void | boolean => {\n                _initDefaults();\n            };\n\n            /**\n             * Get the specified metadata value from the collection\n             * If overrideValue is specified in the config that takes precedence.\n             * @param metaTags - Meta data.\n             * @param coreData - Coredata values from configuration.\n             * @param metaTagName - Name of the metaTag to get.\n             * @returns Meta data value\n             */\n            function _getMetaData(metaTags: { [name: string]: string }, coreData: ICoreData, metaTagName: string): string {\n                if (coreData && coreData[metaTagName]) {\n                    return coreData[metaTagName];\n                }\n                \n                if (metaTags) {\n                    return metaTags[metaTagName];\n                }\n\n                return \"\";\n            }\n        });\n    }\n\n    // Fill common PartB fields\n    public setBasicProperties(event: IPageActionTelemetry, overrideValues: IOverrideValues) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Sets common properties for events that are based on the WebEvent schema.\n     * @param event - The event\n     */\n    public setCommonProperties(event: IPageActionTelemetry, overrideValues: IOverrideValues) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Teardown / Unload hook to allow implementations to perform some additional unload operations before the BaseTelemetryPlugin\n     * finishes it's removal.\n     * @param unloadCtx - This is the context that should be used during unloading.\n     * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n     * @param asyncCallback - An optional callback that the plugin must call if it returns true to inform the caller that it has completed any async unload/teardown operations.\n     * @returns boolean - true if the plugin has or will call asyncCallback, this allows the plugin to perform any asynchronous operations.\n     */\n    public _doUnload(unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void): void | boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Sets pageTags.\n     * @param event - The event\n     */\n    protected _setPageTags(event: IPageActionTelemetry, overrideValues: IOverrideValues) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    protected _getBehavior(overrideValues?: IOverrideValues): string | number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    protected _getValidBehavior(behavior: string | number): string | number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/handlers/AutoCaptureHandler.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    IDiagnosticLogger, IProcessTelemetryUnloadContext, ITelemetryUnloadState, IUnloadHook, createUniqueNamespace, eventOff, eventOn,\n    getDocument, getWindow, isNullOrUndefined, mergeEvtNamespace, onConfigChange\n} from \"@microsoft/applicationinsights-core-js\";\nimport { arrIncludes, arrMap, strTrim } from \"@nevware21/ts-utils\";\nimport { ClickAnalyticsPlugin } from \"../ClickAnalyticsPlugin\";\nimport { ActionType } from \"../Enums\";\nimport { IAutoCaptureHandler, IClickAnalyticsConfiguration, IPageActionOverrideValues } from \"../Interfaces/Datamodel\";\nimport { isElementDnt, isKeyboardEnter, isKeyboardSpace, isLeftClick, isMiddleClick, isRightClick } from \"../common/Utils\";\nimport { PageAction } from \"../events/PageAction\";\n\nconst clickCaptureInputTypes = { BUTTON: true, CHECKBOX: true, RADIO: true, RESET: true, SUBMIT: true };\n\nexport class AutoCaptureHandler implements IAutoCaptureHandler {\n\n    /**\n     * @param analyticsPlugin - WebAnalytics plugin\n     * @param traceLogger - Trace logger to log to console.\n     */\n    constructor(protected _analyticsPlugin: ClickAnalyticsPlugin, protected _config: IClickAnalyticsConfiguration, protected _pageAction: PageAction,\n        protected _traceLogger: IDiagnosticLogger) {\n        let _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"AutoCaptureHandler\"), (_analyticsPlugin as any)._evtNamespace);\n        let _clickCaptureElements: string[];\n        let unloadHandler: IUnloadHook = onConfigChange(_config, () => {\n            _clickCaptureElements =  arrMap(_config.trackElementTypes.toUpperCase().split(\",\"), tag => strTrim(tag));\n        });\n        dynamicProto(AutoCaptureHandler, this, (_self) => {\n            _self.click = () => {\n                let win = getWindow();\n                let doc = getDocument();\n                if (win) {\n                    // IE9 onwards addEventListener is available, 'click' event captures mouse click. mousedown works on other browsers\n                    const event = (navigator.appVersion.indexOf(\"MSIE\") !== -1) ? \"click\" : \"mousedown\";\n                    eventOn(win, event, _processClick, _evtNamespace);\n                    eventOn(win, \"keyup\", _processClick, _evtNamespace);\n                } else if (doc) {\n                    // IE8 and below doesn't have addEventListener so it will use attachEvent\n                    // attaching to window does not work in IE8\n                    eventOn(doc, \"click\", _processClick, _evtNamespace);\n                    eventOn(doc, \"keyup\", _processClick, _evtNamespace);\n                }\n            };\n\n            _self._doUnload = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void): void | boolean => {\n                eventOff(getWindow(), null, null, _evtNamespace);\n                eventOff(getDocument(), null, null, _evtNamespace);\n                unloadHandler && unloadHandler.rm();\n                unloadHandler = null;\n            };\n\n            function _capturePageAction(element: Element, overrideValues?: IPageActionOverrideValues, customProperties?: { [name: string]: string | number | boolean | string[] | number[] | boolean[] | object }, isRightClick?: boolean): void {\n                const donotTrackTag = _self._config.dataTags.customDataPrefix + _self._config.dataTags.dntDataTag;\n                if (!isElementDnt(element, donotTrackTag)) {\n                    _self._pageAction.capturePageAction(element, overrideValues, customProperties, isRightClick);\n                }\n            }\n\n            // Process click event\n            function _processClick(clickEvent: any) {\n                let win = getWindow();\n                if (isNullOrUndefined(clickEvent) && win) {\n                    clickEvent = win.event; // IE 8 does not pass the event\n                }\n                if (clickEvent) {\n                    let element = clickEvent.srcElement || clickEvent.target;\n\n                    // populate overrideValues\n                    var overrideValues: IPageActionOverrideValues = {\n                        clickCoordinateX: clickEvent.pageX,\n                        clickCoordinateY: clickEvent.pageY\n                    };\n                    var isRightClickObj = isRightClick(clickEvent as MouseEvent);\n                    if (isRightClickObj) {\n                        overrideValues.actionType = ActionType.CLICKRIGHT;\n                    } else if (isLeftClick(clickEvent as MouseEvent)) {\n                        overrideValues.actionType = ActionType.CLICKLEFT;\n                    } else if (isKeyboardEnter(clickEvent as KeyboardEvent)) {\n                        overrideValues.actionType = ActionType.KEYBOARDENTER;\n                    } else if (isKeyboardSpace(clickEvent as KeyboardEvent)) {\n                        overrideValues.actionType = ActionType.KEYBOARDSPACE;\n                    } else if (isMiddleClick(clickEvent as MouseEvent)) {\n                        overrideValues.actionType = ActionType.CLICKMIDDLE;\n                    } else {\n                        return;\n                    }\n\n                    while (element && element.tagName) {\n                        // control property will be available for <label> elements with 'for' attribute, only use it when is a\n                        // valid JSLL capture element to avoid infinite loops\n                        if (element.control && arrIncludes(_clickCaptureElements, element.control.tagName.toUpperCase())) {\n                            element = element.control;\n                        }\n                        const tagNameUpperCased = element.tagName.toUpperCase();\n                        if (!arrIncludes(_clickCaptureElements, tagNameUpperCased)) {\n                            element = element.parentElement || element.parentNode;\n                            continue;\n                        } else {\n                            // Check allowed INPUT types\n                            var sendEvent = tagNameUpperCased === \"INPUT\" ? clickCaptureInputTypes[element.type.toUpperCase()] : true;\n                            if (sendEvent) {\n                                _capturePageAction(element, overrideValues, {}, isRightClickObj);\n                            }\n                            break;\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n    // handle automatic event firing on user click\n    public click() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public _doUnload(unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void): void | boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/src/handlers/DomContentHandler.ts",
    "content": "/**\n* @copyright Microsoft 2020\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    IDiagnosticLogger, _eInternalMessageId, _throwInternal, eLoggingSeverity, getDocument, hasDocument, isNullOrUndefined, objExtend\n} from \"@microsoft/applicationinsights-core-js\";\nimport { strSubstring } from \"@nevware21/ts-utils\";\nimport { IClickAnalyticsConfiguration, IContent, IContentHandler } from \"../Interfaces/Datamodel\";\nimport { isValueAssigned, removeInvalidElements, walkUpDomChainWithElementValidation } from \"../common/Utils\";\n\nconst MAX_CONTENTNAME_LENGTH = 200;\n\nexport class DomContentHandler implements IContentHandler {\n\n    /**\n     * @param config - ClickAnalytics configuration object\n     * @param traceLogger - Trace logger to log to console.\n     */\n    constructor(protected _config: IClickAnalyticsConfiguration, protected _traceLogger: IDiagnosticLogger) {\n\n        dynamicProto(DomContentHandler, this, (_self) => {\n\n            _self.getMetadata = (): { [name: string]: string } => {\n                let dataTags = (_self._config || {}).dataTags;\n                let metaTags = {};\n                if (hasDocument()) {\n                    metaTags = isValueAssigned(dataTags.metaDataPrefix) ? _getMetaDataFromDOM(dataTags.captureAllMetaDataContent, dataTags.metaDataPrefix, false) :\n                        _getMetaDataFromDOM(dataTags.captureAllMetaDataContent ,\"\", false);\n                }\n                return metaTags;\n            };\n\n            _self.getElementContent = (element: Element): IContent => {\n        \n                if (!element) {\n                    return {};\n                }\n        \n                let dataTags = (_self._config || {}).dataTags;\n                let elementContent: any = {};\n                let biBlobValue;\n                let parentDataTagPrefix;\n                const dataTagPrefix:string = dataTags.customDataPrefix;\n                const aiBlobAttributeTag:string = dataTagPrefix + dataTags.aiBlobAttributeTag;\n                if(isValueAssigned(dataTags.parentDataTag)) {\n                    parentDataTagPrefix = dataTagPrefix + dataTags.parentDataTag;\n                }\n                \n                if (!_isTracked(element, dataTagPrefix, aiBlobAttributeTag)) {\n                    // capture blob from element or hierarchy\n                    biBlobValue = element.getAttribute(aiBlobAttributeTag);\n                    if (biBlobValue) {\n                        try {\n                            elementContent = JSON.parse(biBlobValue);\n                        } catch (e) {\n                            _throwInternal(_self._traceLogger,\n                                eLoggingSeverity.CRITICAL,\n                                _eInternalMessageId.CannotParseAiBlobValue, \"Can not parse \" + biBlobValue\n                            );\n                        }\n                    } else {\n                        // traverse up the DOM to find the closest parent with data-* tag defined\n                        //contentElement = walkUpDomChainWithElementValidation(element, _self._isTracked, dataTagPrefix);\n                        elementContent = objExtend(elementContent, _populateElementContent(element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag));\n                    }\n                } else {\n                    elementContent = objExtend(elementContent, _populateElementContentwithDataTag(element, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag));\n                }\n\n                removeInvalidElements(elementContent);\n\n                if (parentDataTagPrefix) {\n                    elementContent = objExtend(elementContent, _getParentDetails(element, elementContent, dataTagPrefix, aiBlobAttributeTag ));\n                }\n        \n                return elementContent;\n            };\n        \n            /**\n             * Capture current level Element content\n             */\n            function _captureElementContentWithDataTag(contentElement: Element, elementContent: any, dataTagPrefix: string) {\n\n                for (var i = 0, attrib; i < contentElement.attributes.length; i++) {\n                    attrib = contentElement.attributes[i];\n\n                    if ( attrib.name.indexOf(dataTagPrefix) !== 0 ) {\n                        continue;\n                    }\n\n                    var attribName = attrib.name.replace(dataTagPrefix, \"\");\n                    elementContent[attribName] = attrib.value;\n                }\n            }\n\n            /**\n             * Walk Up the DOM to capture Element content\n             */\n            function _walkUpDomChainCaptureData(el: Element, elementContent: any, dataTagPrefix: string, parentDataTagPrefix: string, aiBlobAttributeTag: string ): void {\n                let element = el;\n                let parentDataTagFound: boolean = false;\n                let elementLevelFlag: boolean = false; // Use this flag to capture 'id' only at the incoming html element level.\n\n                while(!isNullOrUndefined(element) && !isNullOrUndefined(element.attributes)) {\n                    let attributes=element.attributes;\n\n                    for (let i = 0; i < attributes.length; i++) {\n                        const attrib = attributes[i];\n            \n                        if ( attrib.name.indexOf(dataTagPrefix) !== 0 ) {\n                            continue;\n                        }\n\n                        if (attrib.name.indexOf(parentDataTagPrefix) === 0) {\n                            parentDataTagFound = true;\n                        }\n                        \n                        // Todo handle blob data\n                        if (attrib.name.indexOf(aiBlobAttributeTag) === 0) {\n                            continue;\n                        }\n\n                        const attribName = attrib.name.replace(dataTagPrefix, \"\");\n                        if (elementLevelFlag && attribName === \"id\") {\n                            continue; // skip capturing id if not at the first level.\n                        }\n\n                        if (!isValueAssigned(elementContent[attribName])) {\n                            elementContent[attribName] = attrib.value;\n                        }\n                    }\n            \n                    // break after current level;\n                    if (parentDataTagFound) {\n                        break;\n                    }\n\n                    elementLevelFlag = true; // after the initial level set this flag to true.\n                    element = (element.parentNode as Element);\n                }\n            }\n\n            /**\n             * Capture Element content along with Data Tag attributes and values\n             */\n            function _populateElementContent(element: Element, dataTagPrefix: string, parentDataTagPrefix: string, aiBlobAttributeTag: string) {\n                \n                let elementContent: any = {};\n                if(!element) {\n                    return elementContent;\n                }\n\n                let htmlContent = _getHtmlIdAndContentName(element);\n                elementContent = {\n                    id: htmlContent.id || \"\",\n                    contentName: htmlContent.contentName || \"\"\n                };\n                \n                if(isValueAssigned(parentDataTagPrefix)) {\n                    _walkUpDomChainCaptureData(element, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag);\n                }\n\n                // Validate to ensure the minimum required field 'id' or 'contentName' is present.\n                // The content schema defines id, aN and sN as required fields.  However,\n                // requiring these fields would result in majority of adopter's content from being collected.\n                // Just throw a warning and continue collection.\n                if (!elementContent.id && !elementContent.contentName) {\n                    _throwInternal(_traceLogger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.InvalidContentBlob, \"Invalid content blob.  Missing required attributes (id, contentName. \" +\n                        \" Content information will still be collected!\"\n                    )\n                }\n\n                return elementContent;\n            }\n\n            /**\n             * Capture Element content along with Data Tag attributes and values\n             */\n            function _populateElementContentwithDataTag(element: Element, dataTagPrefix: string, parentDataTagPrefix: string, aiBlobAttributeTag: string) {\n                let dataTags = (_self._config || {}).dataTags;\n                let elementContent: any = {};\n                if(!element) {\n                    return elementContent;\n                }\n                \n                let htmlContent = _getHtmlIdAndContentName(element);\n                \n                if(isValueAssigned(parentDataTagPrefix)) {\n                    _walkUpDomChainCaptureData(element, elementContent, dataTagPrefix, parentDataTagPrefix, aiBlobAttributeTag);\n                } else {\n                    _captureElementContentWithDataTag(element, elementContent, dataTagPrefix);\n                }\n                    \n                \n                if (dataTags.useDefaultContentNameOrId) {\n                    if(!isValueAssigned(elementContent.id)) {\n                        elementContent.id = htmlContent.id || \"\";\n                    }\n\n                    elementContent.contentName = htmlContent.contentName || \"\";\n                }\n                \n                // Validate to ensure the minimum required field 'id' or 'contentName' is present.\n                // The content schema defines id, aN and sN as required fields.  However,\n                // requiring these fields would result in majority of adopter's content from being collected.\n                // Just throw a warning and continue collection.\n                if (!elementContent.id && !elementContent.contentName) {\n                    _throwInternal(_traceLogger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.InvalidContentBlob, \"Invalid content blob.  Missing required attributes (id, contentName. \" +\n                        \" Content information will still be collected!\"\n                    );\n                }\n\n                return elementContent;\n            }\n\n\n            /**\n             * Retrieve a specified metadata tag value from the DOM.\n             * @param captureAllMetaDataContent - Flag to capture all metadata content\n             * @param prefix - Prefix to search the metatags with.\n             * @param removePrefix - Specifies if the prefix must be excluded from key names in the returned collection.\n             * @returns Metadata collection/property bag\n             */\n            function _getMetaDataFromDOM(captureAllMetaDataContent:boolean, prefix: string, removePrefix: boolean): { [name: string]: string } {\n                var metaElements: any;\n                var metaData = {};\n                if (hasDocument()) {\n                    metaElements = getDocument().querySelectorAll(\"meta\");\n                    for (var i = 0; i < metaElements.length; i++) {\n                        var meta = metaElements[i];\n                        if (meta.name) {\n                            if(captureAllMetaDataContent || meta.name.indexOf(prefix) === 0) {\n                                const name = removePrefix ? meta.name.replace(prefix, \"\") : meta.name;\n                                metaData[name] = meta.content;\n                            }\n                        }\n                    }\n                }\n\n                return metaData;\n            }\n\n            /**\n             * Gets the default content name.\n             * @param element - An html element\n             * @param useDefaultContentNameOrId - Flag indicating if an element is market PII.\n             * @returns Content name\n             */\n            function _getDefaultContentName(element: any, useDefaultContentName: boolean) {\n                if (useDefaultContentName === false || !element.tagName) {\n                    return \"\";\n                }\n\n                var doc = getDocument() || ({} as Document);\n                var contentName;\n                switch (element.tagName) {\n                case \"A\":\n                    contentName = doc.all ? element.innerText || element.innerHTML : element.text || element.innerHTML;\n                    break;\n                case \"IMG\":\n                case \"AREA\":\n                    contentName = element.alt;\n                    break;\n                default:\n                    contentName = element.value || element.name || element.alt || element.innerText || element.id;\n                }\n\n                return strSubstring(contentName, 0, MAX_CONTENTNAME_LENGTH);\n            }\n\n            /**\n             * Check if the user wants to track the element, which means if the element has any tags with data-* or customDataPrefix\n             * @param element - An html element\n             * @returns true if any data-* exist, otherwise return false\n             */\n            function _isTracked(element: Element, dataTag: string, aiBlobAttributeTag: string): boolean {\n                const attrs = element.attributes;\n                let dataTagFound = false;\n                for (let i = 0; i < attrs.length; i++) {\n                    const attributeName = attrs[i].name;\n                    if(attributeName === aiBlobAttributeTag) {\n                        // ignore if the attribute name is equal to aiBlobAttributeTag\n                        return false;\n                    } else if (attributeName.indexOf(dataTag) === 0) {\n                        dataTagFound = true;\n                    }\n                }\n                return dataTagFound;\n            }\n\n            function _getHtmlIdAndContentName(element:Element) {\n                let dataTags = (_self._config || {}).dataTags || {};\n                let callback = (_self._config || {}).callback || {};\n                let htmlContent: any = {};\n                if(!element) {\n                    return htmlContent;\n                }\n\n                if (dataTags.useDefaultContentNameOrId) {\n                    let contentNameFn = callback.contentName;\n                    const customizedContentName = contentNameFn ? contentNameFn(element, dataTags.useDefaultContentNameOrId) : \"\";\n                    const defaultContentName = _getDefaultContentName(element, dataTags.useDefaultContentNameOrId);\n\n                    htmlContent = {\n                        id: element.id,\n                        contentName: customizedContentName || defaultContentName || element.getAttribute(\"alt\")\n                    };\n                }\n\n                return htmlContent;\n            }\n\n            /**\n            * Computes the parentId of a given element.\n            * @param element - An html element\n            * @returns An object containing the closest parentId , can be empty if nothing was found\n            */\n            function _getParentDetails(element: Element, elementContent: any, dataTagPrefix: string, aiBlobAttributeTag: string): IContent {\n                const parentId = elementContent[\"parentid\"];\n                const parentName = elementContent[\"parentname\"];\n                let parentInfo = {};\n\n                if (parentId || parentName || !element) {\n                    return parentInfo;\n                }\n\n                return _populateParentInfo(element, dataTagPrefix, aiBlobAttributeTag);\n            }\n            /**\n            * Check if parent info already set up, if so take and put into content, if not walk up the DOM to find correct info\n            * @param element - An html element that the user wants to track\n            * @returns An object containing the parent info, can be empty if nothing was found\n            */\n            function _populateParentInfo(element: Element, dataTagPrefix: string, aiBlobAttributeTag: string): IContent {\n                let parentInfo: IContent = {};\n                let parentId;\n\n                // if the user does not set up parent info, walk to the DOM, find the closest parent element (with tags) and populate the info\n                const closestParentElement = walkUpDomChainWithElementValidation(element.parentElement, _isTracked, dataTagPrefix);\n                if (closestParentElement) {\n                    const dataAttr = closestParentElement.getAttribute(aiBlobAttributeTag) || element[aiBlobAttributeTag];\n                    if (dataAttr) {\n                        try {\n                            var telemetryObject = JSON.parse(dataAttr);\n                        } catch (e) {\n                            _throwInternal(_traceLogger,\n                                eLoggingSeverity.CRITICAL,\n                                _eInternalMessageId.CannotParseAiBlobValue, \"Can not parse \" + dataAttr\n                            );\n                        }\n                        if (telemetryObject) {\n                            parentId = telemetryObject.id;\n                        }\n                    } else {\n                        parentId = closestParentElement.getAttribute(dataTagPrefix+\"id\");\n                    }\n                }\n                if (parentId) {\n                    parentInfo[\"parentid\"] = parentId;\n                } else {\n                    let htmlContent= _getHtmlIdAndContentName(element.parentElement);\n                    parentInfo[\"parentid\"] = htmlContent.id;\n                    parentInfo[\"parentname\"] = htmlContent.contentName;\n                }\n\n                return parentInfo;\n            }\n        });\n    }\n\n    /**\n     * Collect metatags from DOM.\n     * Collect data from meta tags.\n     * @returns {object} - Metatags collection/property bag\n     */\n    public getMetadata(): { [name: string]: string } {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Collect data-* attributes for the given element.\n     * All attributes with data-* prefix or user provided customDataPrefix are collected.'data-*' prefix is removed from the key name.\n     * @param element - The element from which attributes need to be collected.\n     * @returns String representation of the Json array of element attributes\n     */\n    public getElementContent(element: Element): IContent {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"noImplicitAny\": true,\n      \"module\": \"es6\",\n      \"moduleResolution\": \"Node\",\n      \"target\": \"es5\",\n      \"alwaysStrict\": true,\n      \"suppressImplicitAnyIndexErrors\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"importHelpers\": true,\n      \"noEmitHelpers\": true,\n      \"skipLibCheck\": true,\n      \"forceConsistentCasingInFileNames\": true,\n      \"declaration\": true,\n      \"declarationDir\": \"build/types\",\n      \"outDir\": \"dist-es5\",\n      \"rootDir\": \"./src\",\n      \"removeComments\": false\n    },\n    \"include\": [\n      \"./src/**/*.ts\"\n    ],\n    \"exclude\": [\n      \"node_modules\"\n    ]\n  }"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ]\n}"
  },
  {
    "path": "extensions/applicationinsights-clickanalytics-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-clickanalytics-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-clickanalytics-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-clickanalytics-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-clickanalytics-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Debug Plugin\n\n## [BETA]\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-debugplugin-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-debugplugin-js)\n[![gzip size](https://js.monitor.azure.com/scripts/b/ext/ai.dbg.2.min.js.gzip.svg)](https://js.monitor.azure.com/scripts/b/ext/ai.dbg.2.min.js.gzip.svg)\n[![minified size size](https://js.monitor.azure.com/scripts/b/ext/ai.dbg.2.min.js.svg)](https://js.monitor.azure.com/scripts/b/ext/ai.dbg.2.min.js.svg)\n\nThis README is broken down into several parts:\n\n- **Who** should use this plugin\n- **What** this plugin does\n- **When** to use this plugin\n- **Where** to get more information\n- **Why** this plugin exists\n- **Getting Started**\n- **Supported Browsers**\n- **Breaking Changes**\n- **Contributing**\n\nthese parts go together to explain the reasoning for this plugin's existance and provides\nan explaination as to how everything works. Each of these sections will finish with a\nbullet-point list that summarizes the section\n\n## Who Should Use This Plugin\n\nThis plugin is tailored towards *developers* that utilize or are familiar with this\nApplication Insights Javascript SDK. This can also be used by various customer support services,\nor those that just wish to dig into things to get a better understanding of how it all works.\n\nThis plugin should **not** be included in a finalized website. This is not for the end-user.\n\nIn short:\n\n- Developers\n- Customer Support services\n- **not** the end-user\n\n## What This Plugin Does\n\n### The AppInsight Box\n\nThis plugin dynamically injects dynamic components into the webpage to provice a rich debugging\nexperience for Application Insights JS. Upon initialization, there will be a blue\nbox with a number in the bottom-right corner of the screen:\n\n![closed box](./readme-res/bubble_closed.png)\n\nUpon hover, it will prepend \"AppInsights\" to the number:\n\n![box on hover](readme-res/bubble_hover.png)\n\nThis number is here to indicate the total number of calls to tracked functions, such as\n`trackEvent` or `trackPageView`. By default, every useful function is tracked.\n\nWhen there's an error (`trackException`), a `(!)` will be appended to the number within the\nbox like so:\n\n![box on exception](readme-res/bubble_error.png)\n\nWhen this bbox is clicked, it will expand to a more detailed view, showing the frequency\nof each tracked function call. It will also get rid of the error indicator:\n\n![expanded box](readme-res/bubble_expanded.png)\n\nThis box can be clicked once more to minimize it.\n\n### The Detailed View\n\nWhen the box is open, clicking the \"toggle detailed view\" button will bring down a view\nthat shows a list of event objects. By clicking on one of these objects, you can open it up\nin tree-view fasion:\n\n![tree view](readme-res/tree_view.png)\n\nThis is modeled after the developer tools of Chrome/Edge to keep things familiar.\n\nEach node that can be opened further has a `[+]` before it, whereas ones that can be minimized will\nhave a `[-]` before it. Nodes like this also have their type, that being object or array, denoted\nnext to them with `{}` or `[]` respectively. Between these braces/brackets will be a number.\nThis number shows the number of entries within that object or array.\n\nThere a button above these entries that says \"copy current node.\" This button will, if a node is\nselected, copy the node and its children up to a certain depth to the clipboard as a JSON string.\nThis will also handle circular references.\n\nIt's possible to traverse this tree view using a keyboard:\n\n- `Left` will close a currently-open node / go to the previous level\n- `Right` will open a node and go to the next level\n- `Up/Down` will move through the current level\n- `Ctrl+C` will copy the current node to the clipboard as a JSON object\n\nthere are also two ways of filtering the data. This is useful if there are a lot of nodes on the screen\nwhen only one is important.\n\n![filter nodes](readme-res/filter_nodes.png)\n\nThe \"filter nodes\" box will filter the individual node types based on their\ntelemetry call.\n\n![filter text](readme-res/text_filter.png)\n\nThe other, \"filter text,\" enables the user to search and display only the nodes that have\nwhatever was typed in the box somewhere within their tree.\n\n## When Should This Plugin Be Used\n\nThis plugin is used when:\n- data isn't reaching azure\n- things don't appear to be tracked\n- something is crashing and developers are unsure if the plugin is causing it\n\n## Where to get More Information\n\nTBD\n\n## Why This Plugin Exists\n\nApplicationInsights-js has lacked a solid way to debug issues for awhile now. Often, developers\nhad to dig through code and go to a multitude of different areas to even begin diagnosing an issue.\n\nThe impact of all of these will bring about a much better development experience for those using\nApplicationInsights-js. Just the fact that they are able to see when a function is fired will\ndramatically cut-down on time spent diagnosing and eliminating bugs. The tree view will foster\ncommunication between developers and testers, allowing them to copy and send important pieces of data\nelsewhere.\n\nInstead of needing to come to the ApplicationInsights-js team with every bug encountered, in many\ncases developers will be able to use these tools to diagnose things that are going wrong on their own\nthanks to this new layer of transparency.\n\n## Getting Started\n\nrun the following console command to install appInsights and the debug plugin:\n\n```zsh\nnpm install --save @microsoft/applicationinsights-debugplugin-js @microsoft/applicationinsights-web\n```\n\n## Basic Usage\n\n### NPM Setup (ignore if using Snippet Setup)\n\n```js\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { DebugPlugin } from '@microsoft/applicationinsights-debugplugin-js';\n\nconst toTrack = [\n    'trackEvent',\n    'trackPageView',\n    'trackPageViewPerformance',\n    'trackException',\n    'trackTrace',\n    'trackMetric',\n    'trackDependencyData',\n    'throwInternal',        // called when a message is logged internally\n    'logInternalMessage',   // called when a message is logged internally\n    'triggerSend',          // called when data is queued to be sent to the server\n    '_sender',              // called when data is sent to the server\n];\n\nconst debugPluginInstance = new DebugPlugin();\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n        extensions: [debugPluginInstance],\n        extensionConfig: {\n            [DebugPlugin.identifier]: {\n                trackers: toTrack\n            }\n        }\n    }\n});\nappInsights.loadAppInsights();\nappInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n```\n\n### Consuming via the CDN using the Snippet Setup (Ignore if using NPM Setup)\n\n```html\n<script type=\"text/javascript\" src=\"https://js.monitor.azure.com/scripts/b/ext/ai.dbg.2.min.js\"></script>\n\n<script type=\"text/javascript\">\n<!-- Snippet code removed for brevity -- copy from main readme --!> {\nsrc: \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\", // The SDK URL Source\ncfg: { // Application Insights Configuration\n    connectionString: \"InstrumentationKey=INSTRUMENTATION_KEY\",\n    extensions: [new Microsoft.ApplicationInsights.DebugPlugin()],\n        extensionConfig: {\n            [\"DebugPlugin\"]: {\n                trackers: [\n                    'trackEvent',\n                    'trackPageView',\n                    'trackPageViewPerformance',\n                    'trackException',\n                    'trackTrace',\n                    'trackMetric',\n                    'trackDependencyData',\n                    'throwInternal',        // called when a message is logged internally\n                    'logInternalMessage',   // called when a message is logged internally\n                    'triggerSend',          // called when data is queued to be sent to the server\n                    '_sender',              // called when data is sent to the server\n                ]\n            }\n        }\n}});\n</script>\n```\n\n## Configuration\n\nTBD.\n\n| Name | Default | Description |\n|------|---------|-------------|\n| trackers | string[] | TBD.\n\n## Supported Browsers\n\nOur goal for the Application Insights Javascript SDK is to at least ensure that older, browsers\nrunning ES3 (IE7) don't crash when this plugin is loaded. **However,** because this is a\n*UI-based* plugin tailored for **developers** that is **not** meant to be used in a finalized\nwebsite, there is an expectation that developers would be testing and debugging this particular\ndata in modern browsers with modern tooling.\n\nAs such, supporting Internet Explorer 7 and other browsers running ES3 is no-longer a priority\nfor this plugin.\n\nThis can be expected to work in:\n\n- Firefox\n- Chrome\n- Edge (new and old)\n- Internet Explorer 11 (under construction)\n\n## Known Potential Breaking Changes\n\n- Configuration options\n\n## Contributing\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-debugplugin-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-debugplugin-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - Debug Plugin extension\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-debugplugin-js.js\",\n    \"module\": \"dist-es5/applicationinsights-debugplugin-js.js\",\n    \"types\": \"types/applicationinsights-debugplugin-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-debugplugin-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt debugplugin\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js 'Microsoft.ApplicationInsights'\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt debugplugin-min\",\n        \"ai-restore\": \"grunt debugplugin-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserOutputName = \"ai.dbg\";\nconst outputName = \"applicationinsights-debugplugin-js\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Debug Plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: outputName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: outputName,\n      outputName: browserOutputName\n    }\n  },\n  [ \"applicationinsights-debugplugin-js\" ]);\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/sample/.gitignore",
    "content": "presentation/"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/sample/README.md",
    "content": "# Sample Site How-To\n\n## What is this?\n\nThis is an extremely simple website created to help test and develop the\ndebugging plugin. The site itself is just the buttons along the\ntop-left corner of the webpage. Clicking on one of these will fire\nits respective function.\n\nThe plugin provides all the rest of the functionality.\n\n## Setup and Running\n\n1. build the plugin. [See the main README for instructions](../../../README.md).\n2. open up `./public/index.html` in your browser of choice.\n   1. [See 'Supported Browsers' in the parent README](../README.md)\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/sample/public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Document</title>\n\n  <style>\n    html, body {\n      margin: 0;\n      padding: 0;\n    }\n  </style>\n</head>\n<body>\n\n  <script src=\"../../../../AISKU/dist/es5/applicationinsights-web.js\"></script>\n  <script src=\"../../dist/es5/applicationinsights-debugplugin-js.js\"></script>\n  <script src=\"./sample.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/sample/public/sample.js",
    "content": "// NOTE: this is a BETA release. see Note [1] for more information\n\nif (!Object.keys) {\n  Object.keys = (function() {\n    'use strict';\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n}\n\nfunction myFunc() {\n\n  // all trackers\n  // var toTrack = [\n  //   'trackEvent',\n  //   'trackPageView',\n  //   'trackPageViewPerformance',\n  //   'trackException',\n  //   'trackTrace',\n  //   'trackMetric',\n  //   'trackDependencyData',\n  //   'throwInternal',        // called when a message is logged internally\n  //   'logInternalMessage',   // called when a message is logged internally\n  //   'triggerSend',          // called when data is queued to be sent to the server\n  //   '_sender',              // called when data is sent to the server\n  // ];\n\n  // error handling functions\n  var toTrack = [\n    'trackException',\n    'trackTrace',\n    'throwInternal',\n    'logInternalMessage'\n  ];\n\n  var debugPlugin = Microsoft.ApplicationInsights.DebugPlugin;\n  var debugPluginInstance = new debugPlugin();\n  // Application Insights Configuration\n  var configObj = {\n    instrumentationKey: \"MyInstrumentationKey\",\n    appId: \"OSKAR\",\n    disableFetchTracking: false,\n    enableCorsCorrelation: true,\n    disableCorrelationHeaders: false,\n    maxBatchInterval: 5000,\n    extensions: [\n      debugPluginInstance\n    ],\n    extensionConfig: { },\n    correlationHeaderDomains: [\"oskarsvc\", \"localhost\"],\n    enablePerfMgr: true\n  };\n\n  configObj.extensionConfig[debugPlugin.identifier] = {\n    trackers: toTrack,\n    //logProcessTelemetry: true,\n    maxMessages: 50\n  };\n\n  var appInsights = new Microsoft.ApplicationInsights.ApplicationInsights({ config: configObj });\n  appInsights.loadAppInsights();\n\n  var testBtnFns = {\n    trackEvent: function () { appInsights.trackEvent({name: 'some event'}); },\n    trackPageView: function () { appInsights.trackPageView({name: 'some page'}); },\n    trackPageViewPerformance: function () { appInsights.trackPageViewPerformance({name : 'some page', url: 'some url'}); },\n    trackException: function () { appInsights.trackException({exception: new Error('some error')}); },\n    trackTrace: function () { appInsights.trackTrace({message: 'some trace'}); },\n    trackMetric: function () { appInsights.trackMetric({name: 'some metric', average: 42}); },\n    trackDependencyData: function () { appInsights.trackDependencyData({absoluteUrl: 'some url', responseCode: 200, method: 'GET', id: 'some id'}); },\n    triggerErrorImmediate: function () {\n      throw new Error('testErrorImmediate');\n    },\n    triggerErrorAsync: function () {\n      setTimeout(function() {throw new Error('testErrorAsync')}, 1000);\n    },\n    throwInternal: function () {\n      appInsights.core.logger.throwInternal(1, 42069, 'test internal err');\n    },\n    send: function () {\n      var idx = appInsights.core._extensions.findIndex(function(v) { return v.identifier === 'ChannelControllerPlugin' });\n      appInsights.core._extensions[idx].getChannelControls()[0][0].triggerSend();\n    }\n  };\n\n  var container = document.createElement('div');\n  container.style.position = 'absolute';\n  container.style.margin = 'auto';\n  container.style.top = '0';\n  container.style.left = '0';\n  container.style.bottom = '0';\n  container.style.right = '0';\n  container.style.width = \"300px\";\n  container.style.height = 24 * 11 + 'px';\n  container.style.zIndex = '-1';\n  var keys = Object.keys(testBtnFns);\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var fn = testBtnFns[key];\n\n    var btn = document.createElement('button');\n    btn.style.display = 'block';\n    btn.style.width = '300px';\n    btn.style.height = '24px';\n    btn.style.background = '#0078D4';\n    btn.style.color = \"#FFFFFF\";\n    btn.style.borderRadius = '2px';\n    btn.style.border = 'none';\n    btn.style.margin = '5px 0';\n\n    btn.textContent = \"trigger \" + key;\n    btn.onclick = fn;\n    container.appendChild(btn);\n  }\n  document.body.appendChild(container);\n}\n\nmyFunc();"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/scripts/listAzCdnVersions.ps1",
    "content": "param (\n    [string] $container = $null,                        # Identify the container that you want to check blank == all\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $showFiles = $false,                       # Show the individual files with details as well\n    [switch] $activeOnly = $false,                      # Only show the active (deployed) versions\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Container         : $container\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Show Files        : $showFiles\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    # Validate parameters\n    if ([string]::IsNullOrWhiteSpace($container) -ne $true -and \"beta\",\"next\",\"public\", \"dev\", \"nightly\" -NotContains $container) {\n        Write-LogFailure \"[$($container)] is not a valid value, must be beta, next or public\"\n    }\n}\n\nFunction Get-AllVersionFiles(\n    [system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]] $files,\n    [string] $storagePath\n) {\n    Get-VersionFiles $files \"$storagePath/ext\" \"ai.dbg.\" $null\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath, \"listCdnVersionsLog\"\nWrite-LogParams\nValidate-Params\n\n# Don't try and list anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n\n# Get the public files (scripts/b)\nif ([string]::IsNullOrWhiteSpace($container) -eq $true) {\n    Get-AllVersionFiles $files \"scripts/b\"\n    Get-AllVersionFiles $files \"beta\"\n    Get-AllVersionFiles $files \"next\"\n    Get-AllVersionFiles $files \"dev\"\n    Get-AllVersionFiles $files \"nightly\"\n}\n\nif ([string]::IsNullOrWhiteSpace($container) -ne $true) {\n    if ($container -eq \"public\") {\n        Get-AllVersionFiles $files \"scripts/b\"\n    } elseif ($container -eq \"beta\" -or $container -eq \"next\" -or $container -eq \"dev\" -or $container -eq \"nightly\") {\n        Get-AllVersionFiles $files \"$container\"\n    } else {\n        $global:connectDetails.testOnly = $true\n        $global:connectDetails.storeContainer = \"tst\"\n        Get-AllVersionFiles $files \"$container\"\n    }\n}\n\nListVersions $files $activeOnly $showFiles\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/scripts/publishAzReleaseToCdn.ps1",
    "content": "param (\n    [string] $releaseFrom = $null,                      # The root path for where to find the files to be released\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $overwrite = $false,                       # Overwrite any existing files   \n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\n$global:cacheValue = $null\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Overwrite         : $overwrite\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"SourcePath        : $jsSdkDir\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction GetReleaseFiles (\n    [hashtable] $verDetails\n)\n{\n    $version = $verDetails.full\n    Write-Log \"Version   : $($verDetails.full)\"\n    Write-Log \"  Number  : $($verDetails.ver)\"\n    Write-Log \"  Type    : $($verDetails.type)\"\n    Write-Log \"  BldNum  : $($verDetails.bldNum)\"\n\n    # check if the minified dir exists\n    $jsSdkSrcDir = Join-Path $jssdkDir -ChildPath \"browser\\es5\\\";\n\n    if (-Not (Test-Path $jsSdkSrcDir)) {\n        Write-LogWarning \"'$jsSdkSrcDir' directory doesn't exist. Compile JSSDK first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    Write-Log \"Adding files\";\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.integrity.json\" $true\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.cjs.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.cjs.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.cjs.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.cjs.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.gbl.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.gbl.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.gbl.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.dbg.$version.gbl.min.js.map\"\n\n    return $files\n}\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"publishReleaseCdnLog\"\n\n$jsSdkDir = $releaseFrom\nif ([string]::IsNullOrWhiteSpace($jsSdkDir) -eq $true) {\n    $jsSdkDir = Split-Path (Split-Path $MyInvocation.MyCommand.Path) -Parent\n}\n\n$cacheControl1Year = \"public, max-age=31536000, immutable, no-transform\";\n$contentType = \"text/javascript; charset=utf-8\";\n\nWrite-LogParams\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n$version = GetPackageVersion $jsSdkDir\n\n$releaseFiles = GetReleaseFiles $version      # Get the versioned files only\nif ($null -eq $releaseFiles -or $releaseFiles.Count -eq 0) {\n    Write-LogFailure \"Unable to find any release files\"\n}\n\nWrite-Log \"Release Files : $($releaseFiles.Count)\"\nWrite-Log \"----------------------------------------------------------------------\"\n\n# Publish the full versioned files to all release folders\nif ($version.type -eq \"release\") {\n    # Normal publishing deployment\n    PublishFiles $releaseFiles \"beta/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"scripts/b/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"rc\") {\n    PublishFiles $releaseFiles \"beta/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n    # Publish to release type folder folder\n    PublishFiles $releaseFiles \"$($version.type)/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -like \"nightly*\") {\n    # Publish to release nightly folder folder\n    PublishFiles $releaseFiles \"nightly/ext\" $cacheControl1Year $contentType $overwrite\n}\nelse {\n    # Upload to the test container rather than the supplied one\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n    PublishFiles $releaseFiles \"$($version.type)/ext\" $cacheControl1Year $contentType $overwrite\n}\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/scripts/setAzActiveCdnVersion.ps1",
    "content": "[CmdletBinding()]\nparam (\n    [string] $container = \"\",                           # The container to update\n    [string] $activeVersion = \"\",                       # The version to copy as the active version\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $minorOnly = $false,                       # Only set the active minor version (v2.x) and not the major version (v2)\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    Write-Log \"Container         : $container\"\n    Write-Log \"Version           : $activeVersion\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    if ([string]::IsNullOrWhiteSpace($activeVersion) -eq $true) {\n        Write-LogFailure \"The Active version is not specified\"\n        exit\n    }\n\n    $version = Get-VersionDetails $activeVersion\n\n    if ([string]::IsNullOrWhiteSpace($version.type) -eq $true) {\n        Write-LogFailure \"Unknown release type\"\n    }\n\n    $versionParts = $version.ver.Split(\".\")\n    if ($versionParts.Length -ne 3) {\n        Write-LogFailure \"Active Version [$activeVersion] is not a valid version number\"\n    }\n\n    foreach ($verNum in $versionParts) {\n        [int]$value = 0\n        if ([int32]::TryParse($verNum, [ref]$value) -ne $true) {\n            Write-LogFailure \"[$($verNum)] is not a valid number within the version[$activeVersion]\"\n        }\n    }\n\n    # Publish the full versioned files to all release folders\n    if ($version.type -eq \"release\") {\n        # Normal publishing deployment\n        if (\"beta\",\"next\",\"public\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"rc\") {\n        if (\"beta\",\"next\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -like \"nightly*\") {\n        if (\"nightly\" -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    else {\n        # Upload to the test container rather than the supplied one\n        $global:connectDetails.testOnly = $true\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        } else {\n            Write-LogWarning \"Non-Standard release type using tst/$container as the destination\"\n        }\n    }\n    \n    return $version;\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"setActiveCdnVersionLog\"\n\nWrite-LogParams\n$version = Validate-Params\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n$storePath = \"$container/ext\"\nif ($container -eq \"public\") {\n    $storePath = \"scripts/b/ext\"\n} elseif ($container -ne \"beta\" -and $container -ne \"next\" -and $container -ne \"dev\" -and $container -ne \"nightly\") {\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst/ext\"\n}\n\nGet-VersionFiles $files $storePath \"ai.dbg.\" $activeVersion\n\nif ($files.ContainsKey($activeVersion) -ne $true) {\n    Write-LogFailure \"Version [$activeVersion] does not appear to be deployed to [$container]\"\n} elseif ($files[$activeVersion].Count -ne 4 -and\n        $files[$activeVersion].Count -ne 12 -and\n        $files[$activeVersion].Count -ne 13) {  # Since 2.6.5\n    Write-LogFailure \"Version [$activeVersion] does not fully deployed to [$container] -- only found [$($files[$activeVersion].Count)] file(s)\"\n}\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\nSetActiveVersion $files[$activeVersion] $storePath $minorOnly\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/DebugPlugin.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, IAppInsightsCore, IChannelControls, IConfiguration, IInstrumentCallDetails, IPerfEvent, IPlugin,\n    IProcessTelemetryContext, ITelemetryItem, ITelemetryPluginChain, InstrumentFunc, InstrumentorHooksCallback, arrForEach, arrIndexOf,\n    dateNow, getDebugExt, isArray, isFunction, isUndefined, objForEachKey\n} from \"@microsoft/applicationinsights-core-js\";\nimport { Dashboard } from \"./components/Dashboard\";\nimport { DebugBin, DebugBinParent } from \"./components/debugBins\";\nimport { getTargetName } from \"./components/helpers\";\nimport { permStyle } from \"./components/styleNodeSrc\";\nimport { IDebugPluginConfig } from \"./interfaces/IDebugPluginConfig\";\n\ninterface IDebugConfig {\n\n    trackers: () => string[];\n\n    excludeKeys: () => string[];\n\n    cssPrefix: () => string;\n\n    disableNotifications: () => boolean;\n\n    dumpToConsole: () => boolean;\n\n    maxMessages: () => number;\n\n    showFunctions: () => boolean;\n\n    logProcessTelemetry: () => boolean;\n}\n\nconst getDefaultConfig = (): IDebugConfig => {\n    const config = {\n        trackers: () => [\n            \"flush\",\n            \"track\",\n            \"trackEvent\",\n            \"trackPageView\",\n            \"trackPageViewPerformance\",\n            \"trackException\",\n            \"trackTrace\",\n            \"trackMetric\",\n            \"trackDependencyData\",\n            \"processTelemetry\",\n            \"throwInternal\",\n            \"logInternalMessage\",\n            \"triggerSend\",\n            \"_sender\",\n            \"perfEvent\",\n            \"initialize\"\n        ],\n        excludeKeys: () => [\n            \"_dynInstFuncs\",\n            \"_getTelCtx\",\n            \"_baseTelInit\",\n            \"diagLog\",\n            \"isInitialized\",\n            \"setInitialized\",\n            \"setNextPlugin\",\n            \"processNext\"\n        ],\n        cssPrefix: () => \"ai\",\n        disableNotifications: () => false,\n        dumpToConsole: () => false,\n        maxMessages: () => 5000,\n        showFunctions: () => false,\n        logProcessTelemetry: () => false\n    };\n\n    return config;\n}\n\nexport default class DebugPlugin extends BaseTelemetryPlugin {\n\n    public static identifier: string = \"DebugPlugin\";\n\n    public identifier: string = DebugPlugin.identifier;\n\n    constructor() {\n        super();\n        let dashboard: Dashboard;\n\n        /**\n         * the style that will be permanently embedded in the webpage\n         * TODO: manage style conflicts (prepend unique ID to relevant class names?)\n         */\n        let permStyleEl: HTMLStyleElement;\n\n        /**\n         * an object containing the individual debug bin items\n         */\n        let debugBins: {\n            [key: string]: DebugBin;\n        };\n\n        /**\n         * the parent containing all the individual debugBins\n         */\n        let debugBinParent: DebugBinParent;\n\n        /**\n         * the different telemetry functions that will be tracked\n         */\n        let trackers: string[];\n\n        /**\n         * timestamp used to track number of seconds since webpage was loaded\n         */\n        let startTime: number = +new Date();\n\n        /**\n         * the config for this plugin\n         */\n        let _theConfig: IDebugConfig = getDefaultConfig();\n\n        dynamicProto(DebugPlugin, this, (_self, base) => {\n            _self.initialize = (config: IConfiguration | IDebugPluginConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) => {\n                if (!_self.isInitialized()) {\n                    base.initialize(config, core, extensions, pluginChain);\n\n                    const defaultConfig = getDefaultConfig();\n                    const ctx = _self._getTelCtx();\n                    const identifier = _self.identifier;\n                    objForEachKey(defaultConfig, (field, value) => {\n                        _theConfig[field] = () => ctx.getConfig(identifier, field, value());\n                    });\n\n                    let foundTrackers: string[] = [];\n                    trackers = _theConfig.trackers();\n                    let prefix = _theConfig.cssPrefix();\n\n                    // 1. Listen to Notifications\n                    if (!_theConfig.disableNotifications()) {\n                        let notifyMgr = (isFunction(core.getNotifyMgr) && core.getNotifyMgr()) || core[\"_notificationManager\"];\n                        if (notifyMgr) {\n                            notifyMgr.addNotificationListener({\n                                eventsSent: (events: ITelemetryItem[]) => {\n                                    dashboard.newLogEntry(events, dateNow() - startTime, \"Notification:eventsSent\", 0, \"eventsSent\");\n                                },\n                                eventsDiscarded: (events: ITelemetryItem[], reason: number) => {\n                                    dashboard.newLogEntry({\n                                        events,\n                                        reason\n                                    }, dateNow() - startTime, \"Notification:eventsDiscarded\", 0, \"eventsDiscarded\");\n    \n                                },\n                                eventsSendRequest: (sendReason: number, isAsync: boolean): void => {\n                                    dashboard.newLogEntry({\n                                        sendReason,\n                                        isAsync\n                                    }, dateNow() - startTime, \"Notification:eventsSendRequest\", 0, \"eventsSendRequest\");\n                                },\n                                perfEvent: (perfEvent: IPerfEvent): void => {\n                                    let evtName = `Notification:perfEvent[${perfEvent.name}]`;\n                                    dashboard.newLogEntry(\n                                        perfEvent,\n                                        dateNow() - startTime, evtName, 0, \"perfEvent\");\n                                }\n                            });\n\n                            if (arrIndexOf(trackers, \"eventsSent\") !== -1) {\n                                foundTrackers.push(\"eventsSent\");\n                            }\n                            if (arrIndexOf(trackers, \"eventsSendRequest\") !== -1) {\n                                foundTrackers.push(\"eventsSendRequest\");\n                            }\n                            if (arrIndexOf(trackers, \"eventsDiscarded\") !== -1) {\n                                foundTrackers.push(\"eventsDiscarded\");\n                            }\n                            if (arrIndexOf(trackers, \"perfEvent\") !== -1) {\n                                foundTrackers.push(\"perfEvent\");\n                            }\n                        }\n                    }\n\n                    // 2. Get all of the extensions and channels\n                    debugBins = {};\n                    let targetObjects: any[] = [core, _self.diagLog()];\n\n                    // Get all of the config extensions\n                    if (config.extensions) {\n                        arrForEach(config.extensions, (ext) => {\n                            _addTargets(targetObjects, ext);\n                        });\n                    }\n\n                    // Get all of the passed extensions\n                    if (extensions) {\n                        arrForEach(extensions, (ext) => {\n                            _addTargets(targetObjects, ext);\n                        });\n                    }\n\n                    if (isFunction(core[\"getTransmissionControls\"])) {\n                        let channelControls: IChannelControls[][] = core[\"getTransmissionControls\"]();\n                        if (channelControls) {\n                            arrForEach(channelControls, (channel) => {\n                                if (isArray(channel)) {\n                                    arrForEach(channel, (theChannel) => {\n                                        _addTargets(targetObjects, theChannel);\n                                    });\n                                }\n                            });\n                        }\n                    }\n\n                    if (isFunction(core[\"getChannels\"])) {\n                        let channelControls: IChannelControls[] = core[\"getChannels\"]();\n                        if (channelControls) {\n                            arrForEach(channelControls, (theChannel) => {\n                                _addTargets(targetObjects, theChannel);\n                            });\n                        }\n                    }\n\n                    // 3. Instrument the functions\n                    arrForEach(trackers, (tracker: string) => {\n                        arrForEach(targetObjects, (target, idx) => {\n                            let val = InstrumentFunc(target, tracker, {\n                                req: _handleInstPreHook() as any as () => InstrumentorHooksCallback,\n                                rsp: _handleInstPostHook() as any as () => InstrumentorHooksCallback\n                            }, true);\n\n                            if (val) {\n                                if (arrIndexOf(foundTrackers, tracker) === -1) {\n                                    foundTrackers.push(tracker);\n                                }\n                            }\n                        });\n                    });\n\n                    // Sort the items\n                    foundTrackers = foundTrackers.sort();\n\n                    // 4. Create the Dashboard\n                    dashboard = new Dashboard({\n                        prefix,\n                        trackers: foundTrackers,\n                        excludeKeys: _theConfig.excludeKeys(),\n                        maxMessages: _theConfig.maxMessages(),\n                        includeFunctions: _theConfig.showFunctions()\n                    });\n\n                    // 5. setup debugBin\n                    const debugBinContainer = document.createElement(\"div\");\n                    debugBinContainer.className = `${prefix}-debug-bin-container`;\n                    debugBinParent = new DebugBinParent(debugBinContainer, [], 0, prefix);\n\n                    arrForEach(foundTrackers, (tracker, idx) => {\n                        debugBins[tracker] = new DebugBin(tracker, 0, debugBinParent, (idx + 1) * 50);\n                    });\n\n                    // 6. append permanent style\n                    permStyleEl = document.createElement(\"style\");\n                    permStyleEl.innerHTML = permStyle(prefix);\n                    document.head.appendChild(permStyleEl);\n\n                    // 7. add button to debugBinParent\n                    debugBinParent.addButton((evt: MouseEvent) => {\n                        evt.stopPropagation();\n\n                        if (dashboard.isDisplayed()) {\n                            dashboard.hide();\n                        } else {\n                            dashboard.show();\n                        }\n                    }, \"show dashboard\");\n\n                    document.body.appendChild(\n                        debugBinContainer\n                    );\n\n                    // 8. Log the config as \"keep\" so it won't be dropped or cleared\n                    dashboard.newLogEntry(config, 0, \"config\", 0, \"config\", true);\n                }\n            }\n\n            function _addTarget(targetObjects: any[], ext:any) {\n                if (ext && arrIndexOf(targetObjects, ext) === -1) {\n                    targetObjects.push(ext);\n                    return true;\n                }\n\n                return false;\n            }\n\n            function _addTargets(targetObjects: any[], ext:any) {\n                if (_addTarget(targetObjects, ext)) {\n                    if (isFunction(ext[\"_getDbgPlgTargets\"])) {\n                        let extra = ext[\"_getDbgPlgTargets\"]();\n                        if (isArray(extra)) {\n                            arrForEach(extra, (tgt) => {\n                                _addTargets(targetObjects, tgt);\n                            });\n                        }\n                    }\n                }\n            }\n\n            function _createInstrumentObject(funcArgs: IInstrumentCallDetails, orgArgs: any[]) {\n                let result: any = {\n                    funcName: funcArgs.name,\n                    inst: funcArgs.inst\n                };\n                if (orgArgs && orgArgs.length) {\n                    result.args = orgArgs;\n                }\n                if (!isUndefined(funcArgs.err)) {\n                    result.err = funcArgs.err;\n                }\n                if (!isUndefined(funcArgs.rslt)) {\n                    result.rslt = funcArgs.rslt;\n                }\n\n                return result;\n            }\n\n            function _getEvtPrefix(funcArgs: IInstrumentCallDetails) {\n                let identifier = getTargetName(funcArgs.inst);\n                let evtPrefix = funcArgs.name;\n                if (identifier) {\n                    evtPrefix += \":\" + identifier;\n                }\n\n                return evtPrefix;\n            }\n\n            function _logEntry(theEvent: any, evtName: string, kind: string) {\n                dashboard.newLogEntry(theEvent, dateNow() - startTime, evtName, 0, kind);\n\n                let dbgExt = getDebugExt(_self.core.config);\n                if (dbgExt && dbgExt.debugMsg) {\n                    dbgExt.debugMsg(evtName, theEvent);\n                }\n            }\n\n            function _handleInstPreHook() {\n                return (funcArgs: IInstrumentCallDetails, ...orgArgs: any[]) => {\n                    (debugBins[funcArgs.name] || debugBins.default).increment();\n                    if (funcArgs.name === \"trackException\" && !debugBinParent.showChildren) {\n                        debugBinParent.addClassToEl(\"notify\");\n                    }\n\n                    let evtPrefix = _getEvtPrefix(funcArgs);\n                    _logEntry(_createInstrumentObject(funcArgs, orgArgs), evtPrefix, funcArgs.name);\n\n                    if (_theConfig.dumpToConsole() && console && console.log) {\n                        console.log(`[${evtPrefix}] preProcess - funcArgs: `, funcArgs);\n                        console.log(`[${evtPrefix}] preProcess - orgArgs: `, orgArgs);\n                    }\n                }\n            }\n\n            function _handleInstPostHook() {\n                return (funcArgs: IInstrumentCallDetails, ...orgArgs: any[]) => {\n                    if (!isUndefined(funcArgs.err)) {\n                        let evtPrefix = _getEvtPrefix(funcArgs);\n\n                        if (!debugBinParent.showChildren) {\n                            debugBinParent.addClassToEl(\"notify\");\n                        }\n    \n                        // The called function threw an exception\n                        _logEntry(_createInstrumentObject(funcArgs, orgArgs), evtPrefix, funcArgs.name);\n\n                        if (_theConfig.dumpToConsole() && console && console.log) {\n                            console.log(`[${evtPrefix}] complete`);\n                        }\n                    }\n                }\n            }\n\n            _self.processTelemetry = (event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                if (_theConfig.dumpToConsole() && console && console.log) {\n                    console.log(`[${_self.identifier}:processTelemetry] complete`);\n                }\n\n                if (!debugBins[\"processTelemetry\"] && _theConfig.logProcessTelemetry() === true) {\n                    _logEntry(event, `[${_self.identifier}:processTelemetry[${event.baseType}]`, \"processTelemetry\");\n                }\n\n                _self.processNext(event, itemCtx);\n            }\n        });\n    }\n\n    public initialize(config: IConfiguration | IDebugPluginConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    processTelemetry(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/applicationinsights-debugplugin-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport DebugPlugin from \"./DebugPlugin\";\n\nexport { DebugPlugin };"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/components/Dashboard.ts",
    "content": "import dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { arrForEach, arrIndexOf } from \"@microsoft/applicationinsights-core-js\";\nimport { ITimerHandler, scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { LogEntry } from \"./LogEntry\";\nimport { FilterList } from \"./filterList\";\nimport { copySelectedTree } from \"./helpers\";\nimport { tempStyle } from \"./styleNodeSrc\";\n\nexport interface IDashboardConfig {\n    prefix: string;\n    trackers: string[];\n    excludeKeys: string[],\n    maxMessages: number,\n    includeFunctions: boolean\n}\n\nexport class Dashboard {\n    constructor(config: IDashboardConfig) {\n        let msgTracker: LogEntry[] = [];\n\n        let textFilter: string =\"\";\n\n        /**\n         * the root element of the logger\n         */\n        let rootElement: HTMLDivElement;\n\n        /**\n         * the style that is only on the webpage when the log is active\n         */\n        let tempStyleEl: HTMLStyleElement;\n\n        let filterList: FilterList;\n\n        let loggerEl: HTMLElement;\n\n        dynamicProto(Dashboard, this, (_self) => {\n            let prefix = config.prefix;\n            let trackers = config.trackers;\n            const rootEl = rootElement = document.createElement(\"div\");\n            rootEl.className = `${prefix}-dbg-lgr-dashboard`;\n\n            tempStyleEl = document.createElement(\"style\");\n            tempStyleEl.innerHTML = tempStyle(prefix);\n\n            // TODO: research more accessibility (aria)\n            rootEl.style.position = \"fixed\";\n            rootEl.style.width = \"100vw\";\n            rootEl.style.height = \"100vh\";\n            rootEl.style.backgroundColor = \"#ffffff\";\n            rootEl.style.opacity = \"1\";\n            rootEl.style.pointerEvents = \"auto\";\n            rootEl.style.top = \"-100%\";\n            rootEl.style.transition = \".2s top cubic-bezier(0.87, 0, 0.13, 1)\";\n\n            const logHeading = document.createElement(\"h1\");\n            logHeading.textContent = \"dashboard\";\n            logHeading.style.fontFamily = \"monospace\";\n            logHeading.style.textAlign = \"center\";\n            rootEl.appendChild(logHeading);\n\n            _createLogger(rootEl, prefix, trackers);\n\n            _self.getElm = () => {\n                return rootEl;\n            };\n\n            _self.isDisplayed = () => {\n                return !!(rootEl.parentElement || rootEl.parentNode);\n            };\n\n            _self.getTextFilter = () => {\n                return textFilter;\n            };\n\n            _self.setTextFilter = (value: string) => {\n                if (value !== textFilter) {\n                    textFilter = value;\n                    _self.render();\n                }\n            };\n\n            _self.getTrackers = () => {\n                return trackers;\n            };\n\n            _self.newLogEntry = (target: Object, tm: number, key?: string, level?: number, kind?: string, keep?: boolean) => {\n                const _self = this;\n                msgTracker.push(new LogEntry(target, tm, key, level, kind, keep));\n                if (msgTracker.length > config.maxMessages) {\n                    let lp = 0;\n                    while (lp < msgTracker.length) {\n                        let entry = msgTracker[lp];\n                        if (!entry.isKeep()) {\n                            let el = entry.getEl();\n                            if (el && el.parentElement) {\n                                el.parentElement.removeChild(el);\n                            }\n                            msgTracker.splice(lp, 1);\n                            break;\n                        }\n\n                        lp++;\n                    }\n                }\n                _self.render();\n            };\n\n            _self.show = () => {\n                if (!this.isDisplayed()) {\n                    document.body.appendChild(rootEl);\n                    document.head.appendChild(tempStyleEl);\n                    rootEl.style.top = \"0%\";\n                    rootEl.style.pointerEvents = \"auto\";\n                    _self.render();\n                }\n            };\n\n            _self.hide = () => {\n                if (_self.isDisplayed()) {\n                    rootEl.style.top = \"-100%\";\n                    rootEl.style.pointerEvents = \"none\";\n                    document.head.removeChild(tempStyleEl);\n                    document.body.removeChild(rootEl);\n                }\n            };\n\n            _self.render = () => {\n                if (_self.isDisplayed()) {\n                    const excludedTypes = filterList.getCurrentFilter();\n                    arrForEach(msgTracker, (entry) => {\n                        let el = entry.getEl();\n                        if (el && el.parentElement) {\n                            el.parentElement.removeChild(el);\n                        }\n\n                        if (!entry.isMatch(textFilter, config.excludeKeys, config.includeFunctions)) {\n                            return;\n                        }\n\n                        let type = entry.getKind();\n                        let allowOther = arrIndexOf(excludedTypes, \"other\") === -1;     // Other types are not excluded\n                        if (arrIndexOf(trackers, type) === -1 && !allowOther) {\n                            // Not a tracked type and we are not allowing other types\n                            return;\n                        } else if (arrIndexOf(excludedTypes, type) !== -1) {\n                            // This type is explicitly excluded\n                            return;\n                        }\n\n                        let newEl = entry.render(textFilter, config.excludeKeys, config.includeFunctions);\n                        if (newEl) {\n                            loggerEl.appendChild(newEl);\n                        }\n                    });\n                }\n            };\n\n            function clearEvents() {\n                let newEvents: LogEntry[] = [];\n                arrForEach(msgTracker, (entry) => {\n                    if (entry.isKeep()) {\n                        newEvents.push(entry);\n                    } else {\n                        let el = entry.getEl();\n                        if (el && el.parentElement) {\n                            el.parentElement.removeChild(el);\n                        }\n                    }\n                });\n\n                msgTracker = newEvents;\n                _self.render();\n            }\n\n            function closeDashboard() {\n                _self.hide();\n            }\n\n            function _createLogger(hostDiv: HTMLElement, prefix: string, trackers: string[]) {\n                loggerEl = document.createElement(\"div\");\n                loggerEl.className = `${prefix}-dbg-lgr`;\n        \n                const controlDiv = document.createElement(\"div\");\n                controlDiv.className = \"controls\";\n\n                const textFilterInput = document.createElement(\"input\");\n                textFilterInput.className = \"text-filter-input\";\n                textFilterInput.setAttribute(\"placeholder\", \"filter text\");\n                textFilterInput.onchange = (evt: Event) => {\n                    _self.setTextFilter(textFilterInput.value);\n                };\n        \n                textFilterInput.onblur = (evt: Event) => {\n                    _self.setTextFilter(textFilterInput.value);\n                };\n        \n                textFilterInput.onkeyup = (evt: Event) => {\n                    keyupTimer && keyupTimer.cancel();\n                    keyupTimer = null;\n        \n                    let newValue = textFilterInput.value;\n                    if (newValue !== _self.getTextFilter()) {\n                        keyupTimer = scheduleTimeout(() => {\n                            keyupTimer = null;\n                            _self.setTextFilter(textFilterInput.value);\n                        }, 200);\n                    }\n                };\n\n                controlDiv.appendChild(textFilterInput);\n\n                const copyButton = document.createElement(\"button\");\n                copyButton.innerText = \"copy current node\";\n                copyButton.className = \"btn-secondary\";\n                copyButton.onclick = copySelectedTree;\n                copyButton.ontouchend = copySelectedTree;\n        \n                let keyupTimer: ITimerHandler = null;\n        \n                filterList = new FilterList(controlDiv, trackers.slice(0), () => _self.render());\n\n                controlDiv.appendChild(copyButton);\n\n                const clearEventsBtn = document.createElement(\"button\");\n                clearEventsBtn.innerText = \"clear events\";\n                clearEventsBtn.className = \"btn-secondary\";\n                clearEventsBtn.onclick = clearEvents;\n                clearEventsBtn.ontouchend = clearEvents;\n        \n                controlDiv.appendChild(clearEventsBtn);\n\n                const closeEventsBtn = document.createElement(\"button\");\n                closeEventsBtn.id = \"close-dashboard\";\n                closeEventsBtn.innerText = \"close dashboard\";\n                closeEventsBtn.className = \"btn-primary\";\n                closeEventsBtn.onclick = closeDashboard;\n                closeEventsBtn.ontouchend = closeDashboard;\n        \n                controlDiv.appendChild(closeEventsBtn);\n        \n                hostDiv.appendChild(controlDiv);\n        \n                hostDiv.appendChild(loggerEl);\n            }\n        });\n    }\n\n    public getElm(): HTMLElement {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public isDisplayed(): boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    public getTextFilter(): string {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public setTextFilter(value: string) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getTrackers(): string[] {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public newLogEntry(target: Object, tm: number, key?: string, level?: number, kind?: string, keep?: boolean) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public render(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public show(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public hide(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/components/LogEntry.ts",
    "content": "import { isArray, isBoolean, isError, isNumber, isObject, isString, objToString } from \"@microsoft/applicationinsights-core-js\";\nimport { MAX_DEPTH, formatLogElements, getTargetKeys, getTargetName, makeRegex, toggleClassName, traverseAndReplace } from \"./helpers\";\n\nexport class LogEntry {\n    isKeep: () => boolean;\n    isMatch: (textFilter: string, excludedKeys: string[], includeFunctions: boolean) => boolean;\n    render: (searchText: string, excludeKeys: string[], includeFunctions: boolean) => HTMLElement;\n    getEl: () => HTMLElement;\n    getKind: () => string;\n\n    constructor(target: Object, tm: number, key?: string, level?: number, kind?: string, keep?: boolean) {\n        let _self = this;\n        let searchContent: any = null;\n        let lastTextFilter: string;\n        let theEl: HTMLElement = null;\n\n        _self.isKeep = () => {\n            return !!keep;\n        }\n\n        function _testValue(rg: RegExp, value: string) {\n            if (rg && value) {\n                return rg.exec(value) !== null;\n            }\n\n            return false;\n        }\n\n        function _testObj(rg: RegExp, value: any, excludedKeys: string[], includeFunctions: boolean): boolean {\n            if (value !== null && value !== undefined && value !== \"\") {\n                if (isArray(value)) {\n                    for (let lp = 0; lp < value.length; lp++) {\n                        if (_testObj(rg, value[lp], excludedKeys, includeFunctions)) {\n                            return true;\n                        }\n                    }\n                } else if (isObject(value) || isError(value)) {\n                    let keys = getTargetKeys(value, excludedKeys, includeFunctions);\n                    for (let lp = 0; lp < keys.length; lp++) {\n                        let key = keys[lp];\n                        if (_testValue(rg, key) || _testObj(rg, value[key], excludedKeys, includeFunctions)) {\n                            return true;\n                        }\n                    }\n                } else if (isString(value) || isNumber(value) || isBoolean(value)) {\n                    return _testValue(rg, objToString(value));\n                }\n            }\n\n            return false;\n        }\n\n        _self.isMatch = (textFilter: string, excludedKeys: string[], includeFunctions: boolean) => {\n            let rg = makeRegex(textFilter);\n            if (rg) {\n                if (_testValue(rg, key)) {\n                    return true;\n                }\n\n                if (_testValue(rg, getTargetName(_self))) {\n                    return true;\n                }\n\n                if (!searchContent) {\n                    // Delaying creating the search optimization until needed -- for performance\n                    searchContent = traverseAndReplace(target, MAX_DEPTH, level, [], excludedKeys, includeFunctions);\n                }\n                \n                return _testObj(rg, searchContent, excludedKeys, includeFunctions);\n            }\n\n            return true;\n        }\n\n        _self.render = (textFilter: string, excludeKeys: string[], includeFunctions: boolean): HTMLElement => {\n            if (!theEl || lastTextFilter !== textFilter) {\n                lastTextFilter = textFilter;\n                let ms: string = \"\" + tm;\n                while (ms.length < 4) {\n                    ms = \"0\" + ms;\n                }\n\n                ms = ms.replace(/(.)(\\d{3}){1}$/g, \"$1.$2s\")\n                while (ms.length <= 9) {\n                    ms = \" \" + ms;\n                }\n                theEl = formatLogElements(target, `[${ms}]`, key, level, textFilter, excludeKeys, [], includeFunctions).root;\n                toggleClassName(theEl, \" tree-root\");\n            }\n\n            return theEl;\n        }\n\n        _self.getEl = () => {\n            return theEl;\n        }\n\n        _self.getKind = () => {\n            return kind;\n        }\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/components/debugBins.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { scheduleTimeout } from \"@nevware21/ts-utils\";\n\nexport class DebugBinParent {\n    public showChildren: boolean = false;\n\n    private el: HTMLDivElement;\n    private elSpan: HTMLSpanElement;\n    private value: number = 0;\n    constructor(\n        private parent: HTMLDivElement,\n        private children: Array<DebugBin | HTMLButtonElement>,\n        bottomDistance: number,\n        prefix: string\n    ) {\n        const _self = this;\n\n        _self.el = document.createElement(\"div\");\n        _self.el.setAttribute(\"tabindex\", \"0\");\n        _self.el.className = `${prefix}-debug-bin-parent`;\n        _self.el.style.bottom = `${20 + bottomDistance}px`;\n\n        _self.elSpan = document.createElement(\"span\");\n        _self.elSpan.innerText = `${_self.value}`;\n        _self.elSpan.setAttribute(\"data-name\", \"AppInsights\");\n        _self.el.appendChild(_self.elSpan);\n\n        _self.el.onclick = () => {\n            _self.showChildren = !_self.showChildren;\n            _self.el.className = (_self.showChildren) ? `${prefix}-debug-bin-parent active` : `${prefix}-debug-bin-parent`;\n            _self.render();\n        }\n\n        _self.el.onkeydown = (evt: KeyboardEvent) => {\n            if (evt.which === 13 || evt.which === 32) {\n                evt.preventDefault();\n                (evt.target as HTMLElement).click();\n            }\n        }\n\n        _self.render();\n    }\n\n    addClassToEl(name: string) {\n        const _self = this;\n        if (_self.el.className.indexOf(name) === -1) {\n            _self.el.className += ` ${name}`;\n        }\n    }\n\n    addChild(bin: DebugBin | HTMLButtonElement) {\n        this.children.push(bin);\n    }\n\n    addButton(handler: (evt: MouseEvent) => void, label: string) {\n        const btn = document.createElement(\"button\");\n        btn.innerText = label;\n        btn.onclick = handler;\n        this.addChild(btn);\n    }\n\n    increment() {\n        const _self = this;\n        _self.elSpan.innerText = `${++_self.value}`;\n    }\n\n    render() {\n        const _self = this;\n        if (!_self.el.parentElement) {\n            _self.parent.appendChild(_self.el);\n        }\n        for (const ch of _self.children) {\n            if (ch instanceof DebugBin) {\n                if (ch.el.parentElement !== _self.el && _self.showChildren) {\n                    _self.el.appendChild(ch.el);\n                } else if (ch.el.parentElement === _self.el && !_self.showChildren) {\n                    _self.el.removeChild(ch.el);\n                }\n            } else {\n                if (_self.showChildren) {\n                    _self.el.appendChild(ch);\n                } else {\n                    _self.el.removeChild(ch);\n                }\n            }\n        }\n    }\n}\n\nexport class DebugBin {\n    public el: HTMLDivElement;\n    private elName: HTMLSpanElement;\n    private elValue: HTMLSpanElement;\n\n    constructor(\n        private name: string,\n        private value: number,\n        private parent: DebugBinParent,\n        bottomDistance: number,\n        backgroundColor?: string\n    ) {\n        const _self = this;\n        parent.addChild(_self);\n\n        _self.el = document.createElement(\"div\");\n\n        _self.elName = document.createElement(\"span\");\n        _self.elName.innerText = `${name}: `;\n        _self.elName.className = \"el-name\";\n        _self.el.appendChild(_self.elName);\n\n        _self.elValue = document.createElement(\"span\");\n        _self.elValue.innerText = `${value}`;\n        _self.elValue.className = \"el-value\";\n        _self.el.appendChild(_self.elValue);\n    }\n\n    increment() {\n        const _self = this;\n        _self.elValue.innerText = `${++_self.value}`;\n        _self.parent.increment();\n        _self.elValue.className = \"el-value incremented\";\n        scheduleTimeout(() => _self.elValue.className = \"el-value\", 1);\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/components/filterList.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrIndexOf } from \"@microsoft/applicationinsights-core-js\";\n\nexport class FilterList {\n\n    private el: HTMLElement;\n    private filterList: string[];\n    private children: HTMLElement[] = [];\n\n    constructor(\n        parent: HTMLElement,\n        trackers: string[],\n        toggleCb: () => void\n    ) {\n        const _self = this;\n        let active = false;\n\n        trackers = trackers.concat(\"other\");\n        _self.filterList = [];\n\n        _self.el = document.createElement(\"div\");\n        _self.el.className = \"filterlist\";\n\n        const inputEl = document.createElement(\"div\");\n        inputEl.className = \"filterlist-input\";\n        inputEl.innerText = \"filter nodes...\";\n        _self.el.appendChild(inputEl);\n\n        const dropdownMenuEl = document.createElement(\"div\");\n        dropdownMenuEl.className = \"filterlist-dropdown\";\n        _self.el.appendChild(dropdownMenuEl)\n\n        dropdownMenuEl.onkeyup = (evt) => {\n            if (active && evt.keyCode === 27) {\n                evt.stopPropagation();\n                _hideDropdown();\n            }\n        }\n\n        for (const t of trackers) {\n            const chEl = document.createElement(\"div\");\n            chEl.setAttribute(\"tabindex\", \"0\");\n            chEl.setAttribute(\"filter-type\", t);\n            chEl.className = \"filterlist-toggle\";\n\n            const checkbox = document.createElement(\"div\");\n            checkbox.className = \"checkbox on\"\n\n            const label = document.createElement(\"span\");\n            label.className = \"label\";\n            label.innerText = t;\n\n            chEl.appendChild(checkbox);\n            chEl.appendChild(label);\n\n            chEl.onkeyup = (evt) => {\n                if (active && evt.keyCode === 27) {\n                    evt.stopPropagation();\n                    _hideDropdown();\n                }\n            }\n\n            chEl.onclick = (evt) => {\n                evt.stopPropagation();\n                chEl.focus();\n                if (checkbox.className === \"checkbox off\") {\n                    if (evt.shiftKey) {\n                        _self.filterList = trackers.concat();\n                        for (const ch of _self.children) {\n                            (ch.childNodes[0] as HTMLElement).className = \"checkbox off\";\n                        }\n                    }\n                    _self.filterList.splice(arrIndexOf(_self.filterList, t), 1);\n                    checkbox.className = \"checkbox on\";\n                } else {\n                    if (evt.shiftKey) {\n                        _self.filterList = [];\n                        for (const ch of _self.children) {\n                            (ch.childNodes[0] as HTMLElement).className = \"checkbox on\";\n                        }\n                    }\n                    _self.filterList.push(t);\n                    checkbox.className = \"checkbox off\";\n                }\n                toggleCb();\n            }\n            _self.children.push(chEl);\n        }\n\n        function _hideDropdown() {\n            active = false;\n            for (const ch of _self.children) {\n                dropdownMenuEl.removeChild(ch);\n            }\n        }\n\n        function _showDropdown() {\n            active = true;\n            for (const ch of _self.children) {\n                dropdownMenuEl.appendChild(ch);\n            }\n            dropdownMenuEl.focus();\n        }\n\n        _self.el.onkeyup = (evt) => {\n            if (active && evt.keyCode === 27) {\n                evt.stopPropagation();\n                _hideDropdown();\n            }\n        }\n\n        _self.el.onclick = () => {\n            if (!active) {\n                _showDropdown();\n            } else {\n                _hideDropdown();\n            }\n        }\n\n        parent.appendChild(_self.el);\n    }\n\n    getCurrentFilter = () => {\n        return this.filterList;\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/components/helpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    arrForEach, arrIndexOf, getIEVersion, isArray, isError, isFunction, isObject, isString, isSymbol, objKeys\n} from \"@microsoft/applicationinsights-core-js\";\nimport { strShimPrototype } from \"@microsoft/applicationinsights-shims\";\nimport { objHasOwnProperty } from \"@nevware21/ts-utils\";\n\nconst strConstructor = \"constructor\";\nconst strGetOwnPropertyNames = \"getOwnPropertyNames\";\n\nexport const MAX_DEPTH = 16;\n\nexport function makeRegex(value: string) {\n    if (value && value.length > 0) {\n        // Escape any slashes first!\n        value = value.replace(/\\\\/g, \"\\\\\\\\\");\n        // eslint-disable-next-line security/detect-non-literal-regexp\n        value = value.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/])/g, \"\\\\$1\");\n        value = value.replace(/\\*/g, \".*\");\n        return new RegExp(\"(\" + value + \")\");\n    }\n    \n    return null;\n}\n\nexport function toggleClassName(el: HTMLElement, className: string) {\n    const idx = el.className.indexOf(className);\n    if (idx === -1) {\n        el.className += className;\n    } else {\n        el.className = el.className.substring(0, idx) + el.className.substring(idx + className.length);\n    }\n}\n\nexport function traverseAndReplace(target: Object, maxDepth: number, currentDepth: number, thingsReferenced: any[], excludedKeys: string[], includeFunctions: boolean): Object {\n    const out = {};\n\n    if (!thingsReferenced) {\n        thingsReferenced = [];\n    }\n    if (isObject(target)) {\n        for (const key of getTargetKeys(target, excludedKeys, includeFunctions)) {\n            let targetValue = target[key];\n            if (isSymbol(targetValue)) {\n                targetValue = targetValue.toString();\n            }\n\n            if (targetValue !== null && arrIndexOf(thingsReferenced, targetValue) !== -1) {\n                out[key] = `<circular (${key} - \"${getTargetName(targetValue)}\")>`;\n            } else if (targetValue !== null && isObject(targetValue)) {\n                if (currentDepth >= maxDepth) {\n                    out[key] = \"<max allowed depth reached>\";\n                } else {\n                    thingsReferenced.push(target);\n                    out[key] = traverseAndReplace(targetValue, maxDepth, currentDepth + 1, thingsReferenced, excludedKeys, includeFunctions);\n                    thingsReferenced.pop();\n                }\n            } else {\n                out[key] = targetValue;\n            }\n        }\n    }\n\n    return out;\n}\n\nfunction _sanitizeText(value: string) {\n    if (value) {\n        value = value.replace(/&/g, \"&amp;\");\n        value = value.replace(/>/g, \"&gt;\");\n        value = value.replace(/</g, \"&lt;\");\n    }\n\n    return value;\n}\n\nfunction _setInnerText(elm: HTMLElement, theText: string, textFilter: string): boolean {\n    let innerText = theText;\n    let matchPos = -1;\n    let matchLen = 0;\n    let rg = makeRegex(textFilter);\n    if (rg) {\n        let matchTxt = rg.exec(innerText);\n        if (matchTxt && matchTxt[1]) {\n            matchPos = theText.indexOf(matchTxt[1]);\n            matchLen = matchTxt[1].length;\n        }\n    }\n\n    if (matchPos !== -1) {\n        let innerHtml =\n            _sanitizeText(theText.substring(0, matchPos)) +\n            \"<span class=\\\"matched-text-filter\\\">\" +\n            _sanitizeText(theText.substring(matchPos, matchPos + matchLen)) +\n            \"</span>\" +\n            theText.substring(matchPos + matchLen);\n\n        elm.innerHTML = innerHtml;\n        return true;\n    }\n\n    elm.innerText = theText;\n    return false;\n}\n\nlet lastSelectedElement: HTMLElement;\nlet selectedObject: object;\n\nexport function copySelectedTree() {\n    const toCopy: Object = selectedObject;\n    if (!toCopy) {\n        return;\n    }\n\n    const textArea = document.createElement(\"textarea\");\n    textArea.innerText = JSON.stringify(toCopy);\n    textArea.style.opacity = \"0\";\n    document.body.appendChild(textArea);\n    textArea.select();\n    document.execCommand(\"copy\");\n    textArea.parentElement.removeChild(textArea);\n}\n\nexport function focusHandler(evt: Event, target: Object, level: number, excludeKeys: string[], includeFunctions: boolean) {\n    if (lastSelectedElement) {\n        toggleClassName(lastSelectedElement, \" last-selected-element\");\n    }\n    lastSelectedElement = (evt.target as HTMLElement);\n    for (let i = 0; i < 10; i++) {\n        if (lastSelectedElement.tagName === \"DIV\") {\n            break;\n        }\n        lastSelectedElement = lastSelectedElement.parentElement;\n    }\n    lastSelectedElement.className += \" last-selected-element\";\n    selectedObject = traverseAndReplace(target, MAX_DEPTH, level, null, excludeKeys, includeFunctions);\n}\n\nfunction _navHandler(evt: KeyboardEvent, openHandler?: (evt: Event, forceState?: boolean) => void, currentState?: boolean) {\n    const el = evt.target as HTMLElement;\n    switch (evt.which) {\n    // Enter\n    case 13: (openHandler) ? openHandler(evt) : void 0; break;\n        // ArrowUp\n    case 38:\n        evt.preventDefault();\n        const prev = el.previousElementSibling as HTMLElement;\n        if (prev && prev.tagName !== \"BUTTON\") {\n            prev.focus();\n        }\n        break;\n        // ArrowDown\n    case 40:\n        evt.preventDefault();\n        const next = el.nextElementSibling as HTMLElement;\n        if (next) {\n            next.focus();\n        }\n        break;\n        // ArrowRight\n    case 39:\n        if (openHandler) {\n            openHandler(evt, true);\n            if (currentState) {\n                (el.firstElementChild.nextSibling as HTMLElement).focus();\n            }\n        }\n        break;\n        // ArrowLeft\n    case 37:\n        if (openHandler) {\n            openHandler(evt, false);\n        }\n        if (!currentState) {\n            (el.parentElement as HTMLElement).focus();\n        }\n        break;\n        // c\n    case 67:\n        if (evt.ctrlKey) {\n            copySelectedTree();\n            (evt.target as HTMLElement).focus();\n        }\n        break;\n    }\n}\n\nexport function getTargetName(target: any) {\n    if (target) {\n        if (isString(target.identifier)) {\n            return target.identifier;\n        }\n\n        if (isString(target.name)) {\n            return target.name;\n        }\n\n        if (objHasOwnProperty(target, strShimPrototype)) {\n            // Look like a prototype\n            return target.name || \"\";\n        }\n\n        return ((target[strConstructor]) || {}).name || \"\";\n    }\n\n    return \"\";\n}\n\nfunction _toString(value: any) {\n    if (isString(value)) {\n        return value;\n    }\n\n    if (isSymbol(value)) {\n        return value.toString();\n    }\n\n    if (isFunction(value[\"toString\"])) {\n        return (value[\"toString\"] as any)() || \"\";\n    }\n\n    return \"\";\n}\n\nexport function getTargetKeys(target: any, excludedKeys: string[], includeFunctions: boolean) {\n    let keys: string[] = objKeys(target);\n\n    if (!isArray(target)) {\n        try {\n            if (Object[strGetOwnPropertyNames]) {\n                // We need to use this for built in objects such as Error which don't return their values via objKeys because they are not enumerable for example\n                let propKeys = Object[strGetOwnPropertyNames](target);\n                if (propKeys) {\n                    arrForEach(propKeys, (key) => {\n                        const theKey = _toString(key);\n                        if (theKey && arrIndexOf(keys, theKey) === -1) {\n                            keys.push(key);\n                        }\n                    });\n                }\n            }\n        } catch (ex) {\n            // getOwnPropertyNames can fail in ES5, if the argument to this method is not an object (a primitive),\n            // then it will cause a TypeError. In ES2015, a non-object argument will be coerced to an object.\n        }\n    }\n\n    let theKeys: string[] = [];\n    arrForEach(keys, (key) => {\n\n        if (!includeFunctions && isFunction(target[key])) {\n            return;\n        }\n\n        const theKey = _toString(key);\n        if (theKey && arrIndexOf(excludedKeys, theKey) === -1) {\n            theKeys.push(theKey);\n        }\n    });\n\n    return theKeys;\n}\n\nexport function formatLogElements(target: Object, tmLabel: string, key: string, level: number, textFilter: string, excludeKeys: string[], thingsReferenced?: any[], includeFunctions?:boolean): any {\n    let openState = false;\n    if (!level) {\n        level = 0;\n    }\n\n    if (!thingsReferenced) {\n        thingsReferenced = [];\n    }\n\n    let isObj = isObject(target) || isError(target);\n    let isErr = target[\"baseType\"] === \"ExceptionData\" || isError(target);\n\n    const children: HTMLElement[] = [];\n\n    function _openNode(currentLine: HTMLElement) {\n        openState = true;\n        arrForEach(children, (child) => {\n            rootDiv.appendChild(child);\n        });\n\n        currentLine.className = \"obj-key expandable open\"\n    }\n\n    function _collapseNode(currentLine: HTMLElement) {\n        // rootDiv.innerHTML = '';\n        arrForEach(children, (child) => {\n            rootDiv.removeChild(child);\n        });\n        // rootDiv.appendChild(currentLine);\n        openState = false;\n        currentLine.className = \"obj-key expandable closed\"\n    }\n\n    let matched = false;\n    let childOpened = false;\n    const keys = getTargetKeys(target, excludeKeys, includeFunctions);\n    if (keys.length === 0) {\n        keys.push(\"<empty>\");\n    }\n    if (level >= MAX_DEPTH) {\n        keys.unshift(\"<maxdepth>\");\n    }\n    for (const key of keys) {\n        if (arrIndexOf(excludeKeys, key) !== -1) {\n            continue;\n        }\n\n        let targetValue = target[key];\n        if (isSymbol(targetValue)) {\n            targetValue = targetValue.toString();\n        }\n\n        if (key === \"<maxdepth>\") {\n            const builder = document.createElement(\"div\");\n            builder.className = \"empty\";\n            builder.innerText = \"<max allowed depth reached>\";\n            children.push(builder);\n            break;\n        } else if (key === \"<empty>\") {\n            const builder = document.createElement(\"div\");\n            builder.className = \"empty\";\n            builder.innerText = \"<empty>\";\n            children.push(builder);\n        } else if (targetValue !== null && arrIndexOf(thingsReferenced, targetValue) !== -1) {\n            const builder = document.createElement(\"div\");\n            builder.className = \"empty\";\n            builder.innerText = `<circular (${key}) - \"${getTargetName(targetValue)}\">`;\n            children.push(builder);\n        } else if (targetValue !== null && (isObject(targetValue) || isError(targetValue))) {\n            thingsReferenced.push(target);\n            let formatted = formatLogElements(targetValue, null, key, level + 1, textFilter, excludeKeys, thingsReferenced, includeFunctions);\n            thingsReferenced.pop();\n            if (formatted.matched) {\n                childOpened = true;\n            }\n            if (formatted.isErr) {\n                isErr = true;\n            }\n\n            children.push(formatted.root);\n        } else {\n            const builder = document.createElement(\"div\");\n            builder.setAttribute(\"tabindex\", \"0\");\n            builder.onclick = (evt: MouseEvent) => {\n                evt.stopPropagation();\n            }\n            builder.ontouchend = (evt: TouchEvent) => {\n                evt.stopPropagation();\n            }\n            builder.onkeydown = (evt: KeyboardEvent) => {\n                evt.stopPropagation();\n                _navHandler(evt);\n            }\n            builder.onfocus = (evt: Event) => {\n                focusHandler(evt, target, level, excludeKeys, includeFunctions);\n            }\n\n            const outerSpan = document.createElement(\"span\");\n            const keySpan = document.createElement(\"span\");\n            keySpan.className = \"key\";\n            if (_setInnerText(keySpan, `${key}: `, textFilter)) {\n                childOpened = true;\n            }\n\n            outerSpan.appendChild(keySpan);\n\n            const valueSpan = document.createElement(\"span\");\n            if (isFunction(targetValue)) {\n                const fnStr = targetValue.toString();\n                const fnHead = fnStr.match(/^([^{]+)/)[1];\n                valueSpan.textContent = `${fnHead}{...}`;\n            } else {\n                if (_setInnerText(valueSpan, `${targetValue}`, textFilter)) {\n                    childOpened = true;\n                }\n            }\n            valueSpan.className = `${typeof targetValue}`;\n            outerSpan.appendChild(valueSpan);\n            builder.appendChild(outerSpan);\n            children.push(builder);\n        }\n    }\n\n    const rootDiv = document.createElement(\"div\");\n\n    let innerText = \"\";\n    let currentLine = document.createElement(\"span\");\n    if (isObj || children.length) {\n        innerText = `${key ? key : \"obj\"}: `;\n        if (isArray(target)) {\n            innerText += `[${getTargetKeys(target, excludeKeys, includeFunctions).length}]`;\n        } else {\n            let targetName = getTargetName(target);\n            if (targetName) {\n                innerText += ` <\"${targetName}\"> `\n            }\n            innerText += `{${getTargetKeys(target, excludeKeys, includeFunctions).length}}`;\n        }\n\n        matched = _setInnerText(currentLine, innerText, textFilter);\n\n        if (tmLabel) {\n            const tmWrapper = document.createElement(\"span\");\n            const tmDetails = document.createElement(\"span\");\n            tmDetails.className = \"obj-time\";\n            tmDetails.innerText = tmLabel;\n            tmWrapper.appendChild(tmDetails);\n            tmWrapper.appendChild(currentLine);\n\n            currentLine = tmWrapper;\n        }\n\n        currentLine.className = \"obj-key expandable closed\"\n    } else {\n        innerText = `${key ? key : \"obj\"}: ${target.toString()}`;\n        matched = _setInnerText(currentLine, innerText, textFilter);\n\n        currentLine.className = \"obj-key\";\n    }\n\n    rootDiv.appendChild(currentLine);\n    rootDiv.setAttribute(\"tabindex\", \"0\");\n\n    if (childOpened) {\n        // A child node matched so auto-expand\n        _openNode(currentLine);\n    }\n    if (isObj) {\n        if (isErr) {\n            rootDiv.className = \"exception\"\n        }\n        const openHandler = (evt: Event, forceState?: boolean) => {\n            evt.stopPropagation();\n            if (getIEVersion()) {\n                focusHandler(evt, target, level, excludeKeys, includeFunctions);\n            }\n            if (forceState !== undefined && openState === forceState) {\n                return;\n            }\n            if (lastSelectedElement === rootDiv) {\n                if (openState) {\n                    _collapseNode(currentLine);\n                } else {\n                    _openNode(currentLine);\n                }\n            }\n        }\n\n        rootDiv.onkeydown = (evt: KeyboardEvent) => {\n            _navHandler(evt, openHandler, openState);\n        }\n        rootDiv.onclick = (evt: MouseEvent) => {\n            openHandler(evt);\n        }\n        rootDiv.ontouchend = (evt: TouchEvent) => {\n            openHandler(evt);\n        }\n        rootDiv.onfocus = (evt: Event) => {\n            focusHandler(evt, target, level, excludeKeys, includeFunctions);\n        }\n    }\n\n    return {\n        root: rootDiv,\n        isErr: isErr,\n        matched: matched || childOpened\n    };\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/components/styleNodeSrc.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n// @skip-file-minify\n\nimport { getIEVersion } from \"@microsoft/applicationinsights-core-js\";\n\nconst BG_INFO = \"#F0F6FF\",\n    BG_ERROR = \"#FEF0F1\",\n    ICON_ERROR = \"#E00B1C\",\n    BTN_PRIMARY = \"#0078d4\",\n    BTN_HOVER = \"#106EBE\",\n    BTN_ACTIVE = \"#005A9E\",\n    TEXT_PRIMARY = \"#323130\",\n    TEXT_MATCHED = \"yellow\",\n    BORDER_GREY_160 = \"1px solid #605E5C\",\n    BORDER_GREY_60 = \"1px solid #B3B0AD\";\n\nexport const tempStyle = (prefix: string) => `\n  .${prefix}-dbg-lgr-dashboard {\n    z-index: 1000\n  }\n\n  .${prefix}-dbg-lgr-dashboard .controls {\n    width: 90%;\n    min-width: 600px;\n    position: relative;\n    margin: auto;\n    left: 0;\n    right: 0;\n    font-family: monospace;\n    font-size: 16px;\n    border-color: ${BG_INFO};\n    border: 1px solid;\n    background-color: transparent;\n    display: block;\n    padding-top: 3px;\n    padding-bottom: 3px;\n  }\n\n  .${prefix}-dbg-lgr-dashboard .controls > div {\n    display: inline-block;\n    position: relative;\n    padding: 3px 20px;\n    z-index: 1010\n  }\n\n  .${prefix}-dbg-lgr {\n    width: 90%;\n    min-width: 600px;\n    height: 80%;\n    position: relative;\n    margin: auto;\n    left: 0;\n    right: 0;\n    font-family: monospace;\n    font-size: 16px;\n    overflow-y: scroll;\n    overflow-x: ${(getIEVersion()) ? \"scroll\" : \"hidden\"};\n    border: ${BORDER_GREY_160};\n    border-radius: 2px;\n  }\n\n  .${prefix}-dbg-lgr div:focus {\n    outline: 2px solid black;\n  }\n\n  ${getIEVersion() && getIEVersion() < 9\n        ? \"\"\n        : `.${prefix}-dbg-lgr .tree-root div::before {\n      content: '';\n      position: absolute;\n      left: -1.25em;\n      height: 100%;\n      border-right: 2px dotted #CCCCCC;\n    }`\n}\n\n  .${prefix}-dbg-lgr .tree-root div:hover::before {\n    border-right: 2px solid #000;\n  }\n\n  .${prefix}-dbg-lgr > div {\n    display: block;\n    position: relative;\n  }\n\n  .${prefix}-dbg-lgr > div:not(.controls) div {\n    display: block;\n    position: relative;\n    margin-left: 2em;\n    width: 100%;\n  }\n\n  .${prefix}-dbg-lgr .expandable {\n    cursor: pointer;\n  }\n\n  .${prefix}-dbg-lgr > .tree-root div > span {\n    width: 100%;\n    display: block;\n  }\n\n  .${prefix}-dbg-lgr .exception {\n    background-color: ${BG_ERROR};\n    color: ${TEXT_PRIMARY};\n  }\n\n  .${prefix}-dbg-lgr .matched-text-filter {\n    background-color: ${TEXT_MATCHED};\n  }\n\n  ${getIEVersion() && getIEVersion() < 9\n        ? \"\"\n        : `.${prefix}-dbg-lgr .expandable.open::before {\n      content: '[-] ';\n      font-weight: bold;\n    }\n\n    .${prefix}-dbg-lgr .expandable.closed::before {\n      content: '[+] ';\n      font-weight: bold;\n    }`\n}\n\n  .${prefix}-dbg-lgr div:hover > .obj-key {\n    text-decoration: underline;\n  }\n\n  .${prefix}-dbg-lgr .obj-time {\n    padding-right: 15px;\n    color: #605E5C;\n  }\n  \n  .${prefix}-dbg-lgr .object {pointer-events: auto;}\n  .${prefix}-dbg-lgr .function {color: #881391;}\n  .${prefix}-dbg-lgr .string {color: #CB3632;}\n  .${prefix}-dbg-lgr .number {color: #1C00CF;}\n  .${prefix}-dbg-lgr .key {color: #881391; font-weight: bold;}\n  .${prefix}-dbg-lgr .empty {color: #AAAAAA; font-style: italic;}\n\n  .${prefix}-dbg-lgr-dashboard ${prefix}-last-selected-element > span {\n    display: block;\n    background-color: black;\n    border-radius: 2px;\n    color: white\n  }\n  .${prefix}-last-selected-element > span > span,\n  .${prefix}-last-selected-element > span > span[class] {\n    color: white;\n  }\n\n  .${prefix}-dbg-lgr-dashboard #close-dashboard {\n    float: right;\n    margin-right: 2em;\n  }\n\n  .${prefix}-dbg-lgr-dashboard .btn-primary {\n    display: inline-block;\n    background-color: ${BTN_PRIMARY};\n    color: #FFFFFF;\n    border-radius: 2px;\n    cursor: pointer;\n    border: 1px solid;\n    padding: 3px 20px;\n    margin-left: 2em;\n    height: 24px;\n    min-width: 80px;\n  }\n\n  .${prefix}-dbg-lgr-dashboard .btn-primary:hover {\n    background-color: ${BTN_HOVER};\n  }\n\n  .${prefix}-dbg-lgr-dashboard .btn-primary:active {\n    background-color: ${BTN_ACTIVE};\n  }\n\n  .${prefix}-dbg-lgr-dashboard .btn-secondary {\n    display: inline-block;\n    border: 1px solid;\n    bolder-color: ${BTN_PRIMARY};\n    color: ${BTN_PRIMARY};\n    background-color: transparent;\n    border-radius: 2px;\n    cursor: pointer;\n    border: 1px solid;\n    padding: 3px 20px;\n    margin-left: 2em;\n    height: 24px;\n  }\n\n  .${prefix}-dbg-lgr-dashboard .btn-secondary:hover {\n    background-color: ${BTN_HOVER};\n    color: #FFFFFF;\n  }\n\n  .${prefix}-dbg-lgr-dashboard .btn-secondary:active {\n    background-color: ${BTN_ACTIVE};\n    color: #FFFFFF;\n  }\n  \n  .${prefix}-dbg-lgr-dashboard .filterlist {\n    position: relative;\n    display: inline-block;\n    vertical-align: middle;\n    width: 180px;\n    min-height: 24px;\n    margin-left: 2em;\n    user-select: none;\n    cursor: pointer;\n  }\n  .${prefix}-dbg-lgr-dashboard .filterlist-input {\n    position: relative;\n    padding: 3px 8px;\n    border: ${BORDER_GREY_60};\n    border-radius: 2px;\n  }\n\n  ${getIEVersion() && getIEVersion() < 9\n        ? \"\"\n        : `.${prefix}-dbg-lgr-dashboard .filterlist-input::after {\n      content: '';\n      width: 8px;\n      height: 8px;\n      position: absolute;\n      right: 8px;\n      top: 5px;\n      margin: auto;\n      transform: rotate(45deg);\n      border: ${BORDER_GREY_160};\n      border-top: none;\n      border-left: none;\n    }`\n}\n\n  .${prefix}-dbg-lgr-dashboard .filterlist-input:focus {\n    border: ${BORDER_GREY_60}\n  }\n\n  .${prefix}-dbg-lgr-dashboard .filterlist-dropdown {\n    position: absolute;\n    top: 100%;\n    margin: auto;\n    background-color: #FFFFFF;\n    overflow: hidden;\n    min-width: 180px;\n    box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.16);\n  }\n\n  .${prefix}-dbg-lgr-dashboard .filterlist-toggle {\n    position: relative;\n    padding: 3px 8px;\n    height: 32px;\n    width: 100%;\n    ${(getIEVersion()) ? \"\" : \"box-sizing: border-box;\"}\n  }\n\n  .${prefix}-dbg-lgr-dashboard .filterlist-toggle:focus {\n    outline: none;\n    border: ${BORDER_GREY_60};\n  }\n\n  .${prefix}-dbg-lgr-dashboard .text-filter-input {\n    font-family: monospace;\n    margin-left: 2em;\n    padding: 3px 8px;\n    width: 180px;\n    height: 24px;\n    border-radius: 2px;\n    border: ${BORDER_GREY_160};\n  }\n\n  .${prefix}-dbg-lgr-dashboard .text-filter-input:focus {\n    border: ${BORDER_GREY_60};\n  }\n\n  .${prefix}-dbg-lgr-dashboard .label {\n    vertical-align: middle;\n    width: 80%;\n    display: inline-block;\n  }\n\n  .${prefix}-dbg-lgr-dashboard .checkbox {\n    display: inline-block;\n    width: 18px;\n    height: 18px;\n    border-radius: 2px;\n    vertical-align: middle;\n    margin-right: 8px;\n    ${(getIEVersion()) ? \"\" : \"box-sizing: border-box;\"}\n  }\n\n  .${prefix}-dbg-lgr-dashboard .checkbox.on {\n    background-color: #0078D4;\n  }\n\n  ${getIEVersion() && getIEVersion() < 9\n        ? \"\"\n        : `.${prefix}-dbg-lgr-dashboard .checkbox.on::after {\n      content: '';\n      width: 5px;\n      height: 10px;\n      display: inline-block;\n      margin: 2px 6px;\n      padding: 0;\n      transform: rotate(45deg);\n      border: 1px solid #FFFFFF;\n      border-top: none;\n      border-left: none;\n    }`\n}\n\n\n  .${prefix}-dbg-lgr-dashboard .checkbox.off {\n    border: ${BORDER_GREY_160};\n  }\n\n  ${getIEVersion() && getIEVersion() < 9\n        ? \"\"\n        : `@media only screen and (max-width: 600px) {\n      .${prefix}-dbg-lgr {\n        width: 100%;\n        min-width: 200px;\n      }\n    }`\n}\n\n`;\n\nexport const permStyle = (prefix: string) => `\n  .${prefix}-debug-bin-container {\n    position: fixed;\n    ${getIEVersion() && getIEVersion() < 9\n        ? `width: 100%;\n      height: 100%;\n      top: 0;\n      left: 0;`\n        : `width: 100vw;\n      height: 100vh;`\n}\n    pointer-events: none;\n  }\n\n  .${prefix}-debug-bin-parent {\n    position: fixed;\n    right: 20px;\n    margin: auto;\n    padding: 10px;\n    border-radius: 2px;\n    min-height: 20px;\n    min-width: 20px;\n    overflow: hidden;\n    pointer-events: auto;\n    text-align: right;\n    font-family: monospace;\n    font-size: 16px;\n    color: #FFFFFF;\n    background-color: ${BTN_PRIMARY};\n    border: 2px solid #FFFFFF;\n    transition: 2s color linear;\n    cursor: pointer;\n    transition: .2s width ease-in-out, .2s height ease-in-out;\n    ${(getIEVersion()) ? \"\" : \"box-sizing: border-box;\"}\n  }\n\n  .${prefix}-debug-bin-parent.active {\n    background-color: ${BG_INFO};\n    color: ${TEXT_PRIMARY};\n  }\n\n  .${prefix}-debug-bin-parent:focus {\n    border: ${BORDER_GREY_160};\n    outline: none;\n  }\n\n  .${prefix}-debug-bin-parent.notify {\n    background-color: ${ICON_ERROR};\n  }\n\n  .${prefix}-debug-bin-parent button {\n    display: block;\n    width: 100%;\n    background-color: ${BTN_PRIMARY};\n    color: #FFFFFF;\n    border-radius: 2px;\n    margin-bottom: 5px;\n    margin-top: 10px;\n    cursor: pointer;\n    border: none;\n    padding: 3px 20px;\n    height: 24px;\n  }\n\n  .${prefix}-debug-bin-parent button:hover {\n    background-color: ${BTN_HOVER};\n  }\n\n  .${prefix}-debug-bin-parent button:active {\n    background-color: ${BTN_ACTIVE};\n  }\n\n  .${prefix}-debug-bin-parent .el-name {\n    text-align: left;\n  }\n\n  .${prefix}-debug-bin-parent .el-value {\n    display: inline-block;\n    transform: scale(1);\n    transition: 2s transform linear, 0s 2s font-weight linear;\n  }\n\n  ${getIEVersion() && getIEVersion() < 9\n        ? \"\"\n        : `.${prefix}-debug-bin-parent.notify::after {\n      content: \" (!)\";\n    }`\n}\n\n  .${prefix}-debug-bin-parent .el-value.incremented {\n    transform: scale(1.5);\n    font-weight: bold;\n    transition: 0s transform linear, 0s font-weight linear;\n  }\n\n  ${getIEVersion() && getIEVersion() < 9\n        ? \"\"\n        : `.${prefix}-debug-bin-parent:focus > span::before,\n    .${prefix}-debug-bin-parent:hover > span::before,\n    .${prefix}-debug-bin-parent.active > span::before {\n      content: attr(data-name) \": \";\n    }`\n}\n`\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/interfaces/IDebugPluginConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IConfiguration } from \"@microsoft/applicationinsights-core-js\";\n\nexport interface IDebugPluginConfig extends IConfiguration{\n  \n  trackers?: string[];\n\n  /**\n   * The prefix to use for the css styles, defaults to 'ai'\n   */\n  cssPrefix?: string;\n\n  /**\n   * Disable listening to notifications from the notification manager. Defaults to false\n   */\n  disableNotifications?: boolean;\n\n  /**\n   * [Optional] Dump extra debug information to the console as well as the dashboard\n   */\n  dumpToConsole?: boolean;\n\n  /**\n   * [Optional] The maximum number of messages to retain, older messages will be dropped - defaults to 5,000.\n   */\n  maxMessages?: number;\n\n  /**\n   * [Optional] Flag for whether to include functions in the DebugPlugin dashboard. Defaults to false\n   */\n  showFunctions?: boolean;\n\n  /**\n   * [Optional] If processTelemetry is not included in the trackers should the DebugPlugin log the arguments - defaults to false\n   */\n  logProcessTelemetry?: boolean;\n}"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/src/localization/EN-US.json",
    "content": ""
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/tslint.json",
    "content": "{\n  \"extends\": [\n      \"../../tslint-base.json\"\n  ]\n}\n"
  },
  {
    "path": "extensions/applicationinsights-debugplugin-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-debugplugin-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-debugplugin-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-debugplugin-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-debugplugin-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Dependencies Plugin\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-dependencies-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-dependencies-js)\n\nDependencies Plugin for the Application Insights Javascript SDK\n\n## Build\n\n``` javascript\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Run unit tests\n\n```javascript\nnpm run test\n```\n\n## Basic Usage\n\n### NPM Setup (ignore if using Snippet Setup)\n\n```js\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { AjaxPlugin } from '@microsoft/applicationinsights-dependencies-js';\n\nconst dependencyPlugin = new AjaxPlugin();\nconst appInsights = new ApplicationInsights({\n    config: {\n        connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n        extensions: [dependencyPlugin],\n        extensionConfig: {\n            [dependencyPlugin.identifier]: {\n                ignoreHeaders:[\n                    \"Authorization\",\n                    \"X-API-Key\",\n                    \"WWW-Authenticate\"\n                ]\n            }\n        }\n    }\n});\nappInsights.loadAppInsights();\nappInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\n<https://cla.microsoft.com>.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at <https://go.microsoft.com/fwlink/?LinkID=824704>. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/Tests/Unit/src/TestChannelPlugin.ts",
    "content": "import { IConfiguration, IChannelControls, ITelemetryItem, ITelemetryPlugin, ITelemetryPluginChain } from \"@microsoft/applicationinsights-core-js\";\n\n/**\n * TestChannelPlugin for testing - a minimal implementation of IChannelControls\n * that can be used as a mock channel in tests\n */\nexport class TestChannelPlugin implements IChannelControls {\n    public _nextPlugin: ITelemetryPlugin;\n    public version: string = \"1.0.0-test\";\n    public processTelemetry;\n    public identifier: string;\n    public priority: number = 1001;\n\n    constructor(identifier: string = \"TestChannelPlugin\") {\n        this.identifier = identifier;\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    \n    public pause(): void {\n        // No-op for testing\n    }\n\n    public resume(): void {\n        // No-op for testing\n    }\n\n    public teardown(): void {\n        // No-op for testing\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    onunloadFlush(async?: boolean) {\n        // No-op for testing\n    }\n\n    setNextPlugin(next: ITelemetryPlugin | ITelemetryPluginChain) {\n        this._nextPlugin = next as ITelemetryPlugin;\n    }\n\n    public initialize = (config: IConfiguration) => {\n        // No-op for testing\n    }\n\n    public _processTelemetry(env: ITelemetryItem) {\n        if (this._nextPlugin) {\n            this._nextPlugin.processTelemetry(env);\n        }\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/Tests/Unit/src/W3CTraceStateDependency.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { eDistributedTracingModes } from \"@microsoft/applicationinsights-core-js\";\nimport { RequestHeaders } from \"@microsoft/applicationinsights-core-js\";\nimport { AppInsightsCore } from \"@microsoft/applicationinsights-core-js\";\nimport { createPromise } from \"@nevware21/ts-async\";\n\nimport { AjaxMonitor } from \"../../../src/ajax\";\nimport { TestChannelPlugin } from \"./TestChannelPlugin\";\n\n/**\n * Safe unload function for core instances\n */\nfunction _safeUnloadCore(core: AppInsightsCore) {\n    if (core && core.isInitialized()) {\n        core.unload(false);\n    }\n}\n\n/**\n * Helper to ensure a tracestate value exists for testing\n */\nfunction _ensureTraceStateValue(core: AppInsightsCore) {\n    const traceCtx = core.getTraceCtx();\n    if (traceCtx && traceCtx.traceState) {\n        // Manually add a test tracestate value if one doesn't exist\n        if (!traceCtx.traceState.toString()) {\n            traceCtx.traceState.set(\"test\", \"value\");\n        }\n    }\n}\n\nexport class W3CTraceStateDependencyTests extends AITestClass {\n    private _ajax: AjaxMonitor | undefined;\n    private _context: { [key: string]: any };\n    \n    public testInitialize() {\n        this.useFakeServer = true;\n        this._context = {};\n    }\n\n    public testCleanup() {\n        // Retrieve any core instance stored in the context and unload it\n        if (this._context && this._context.core) {\n            _safeUnloadCore(this._context.core);\n            this._context.core = null;\n        }\n\n        if (this._ajax) {\n            this._ajax.teardown();\n            this._ajax = undefined;\n        }\n\n        this._context = {};\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"W3CTraceStateDependency: XMLHttpRequest with W3C_TRACE mode includes tracestate header when value present\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            distributedTracingMode: eDistributedTracingModes.W3C_TRACE\n                        }\n                    }\n                };\n\n                // Initialize the core with the Ajax monitor as an extension\n                appInsightsCore.initialize(coreConfig, []);\n                \n                // Store the core instance for cleanup\n                this._context.core = appInsightsCore;\n                \n                // Explicitly set a tracestate value to ensure the header is included\n                _ensureTraceStateValue(appInsightsCore);\n                \n                // Set window host for testing\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that only W3C headers are sent (tracestate included because there's a value)\n                Assert.equal(false, spy.calledWith(RequestHeaders.requestIdHeader), \"AI header should not be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should be present with value\");\n\n                // Emulate response so perf monitoring is cleaned up\n                (xhr as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload the core to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n            }\n        });\n        \n        this.testCase({\n            name: \"W3CTraceStateDependency: XMLHttpRequest with W3C_TRACE mode but no tracestate value\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            distributedTracingMode: eDistributedTracingModes.W3C_TRACE\n                        }\n                    }\n                };\n\n                // Initialize the core with the Ajax monitor as an extension\n                appInsightsCore.initialize(coreConfig, []);\n                \n                // Set window host for testing\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that only traceparent header is sent, not AI or tracestate headers\n                Assert.equal(false, spy.calledWith(RequestHeaders.requestIdHeader), \"AI header should not be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(false, spy.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present when no value\");\n\n                // Emulate response so perf monitoring is cleaned up\n                (xhr as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload the core to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n            }\n        });\n\n        this.testCase({\n            name: \"W3CTraceStateDependency: XMLHttpRequest with W3C_TRACE mode - dynamic configuration change\",\n            useFakeTimers: true,\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            distributedTracingMode: eDistributedTracingModes.AI // Start with AI mode\n                        }\n                    }\n                };\n\n                // Initialize the core with the Ajax monitor as an extension\n                appInsightsCore.initialize(coreConfig, []);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Test initial AI mode\n                var xhr1 = new XMLHttpRequest();\n                var spy1 = this.sandbox.spy(xhr1, \"setRequestHeader\");\n                xhr1.open(\"GET\", \"http://www.example.com\");\n                xhr1.send();\n\n                // Assert AI mode behavior\n                Assert.equal(true, spy1.calledWith(RequestHeaders.requestIdHeader), \"AI header should be present initially\");\n                Assert.equal(false, spy1.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should not be present initially\");\n                Assert.equal(false, spy1.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present initially\");\n\n                // Emulate response\n                (xhr1 as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n\n                // Update configuration dynamically to W3C_TRACE mode\n                if (appInsightsCore.config.extensionConfig) {\n                    appInsightsCore.config.extensionConfig[this._ajax.identifier].distributedTracingMode = eDistributedTracingModes.W3C_TRACE;\n                }\n                \n                // Trigger config change detection using fake timers\n                this.clock.tick(1);\n                \n                // Ensure tracestate value exists after config change\n                _ensureTraceStateValue(appInsightsCore);\n\n                // Test after dynamic configuration change\n                var xhr2 = new XMLHttpRequest();\n                var spy2 = this.sandbox.spy(xhr2, \"setRequestHeader\");\n                xhr2.open(\"GET\", \"http://www.example.com\");\n                xhr2.send();\n\n                // Assert W3C_TRACE mode behavior after config change\n                Assert.equal(false, spy2.calledWith(RequestHeaders.requestIdHeader), \"AI header should not be present after config change\");\n                Assert.equal(true, spy2.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present after config change\");\n                Assert.equal(true, spy2.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should be present after config change\");\n\n                // Emulate response\n                (xhr2 as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload the core to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n            }\n        });\n        \n        this.testCase({\n            name: \"W3CTraceStateDependency: verify AI_AND_W3C mode does not include tracestate header\",\n            test: () => {\n                // Create a fresh AjaxMonitor\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            distributedTracingMode: eDistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                \n                // Initialize core with AjaxMonitor as extension\n                appInsightsCore.initialize(coreConfig, []);\n                \n                // Set window host for testing\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that AI and traceparent headers are sent, but not tracestate\n                Assert.equal(true, spy.calledWith(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(false, spy.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present\");\n\n                // Emulate response so perf monitoring is cleaned up\n                (xhr as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload the core to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n            }\n        });\n        \n        this.testCase({\n            name: \"W3CTraceStateDependency: verify AI mode does not include any W3C headers\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            distributedTracingMode: eDistributedTracingModes.AI\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, []);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that only AI header is sent, no W3C headers\n                Assert.equal(true, spy.calledWith(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                Assert.equal(false, spy.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should not be present\");\n                Assert.equal(false, spy.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present\");\n\n                // Emulate response so perf monitoring is cleaned up\n                (xhr as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload the core to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n            }\n        });\n\n        this.testCase({\n            name: \"W3CTraceStateDependency: verify AI_AND_W3C_TRACE mode includes tracestate header when value present\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            distributedTracingMode: eDistributedTracingModes.AI_AND_W3C_TRACE\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, []);\n                \n                // Store the core instance for cleanup\n                this._context.core = appInsightsCore;\n                \n                // Explicitly set a tracestate value to ensure the header is included\n                _ensureTraceStateValue(appInsightsCore);\n                \n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that all three headers are sent (tracestate included because there's a value)\n                Assert.equal(true, spy.calledWith(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should be present with value\");\n\n                // Emulate response so perf monitoring is cleaned up\n                (xhr as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload the core to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n            }\n        });\n\n        // Fetch API Tests using framework helpers\n        this.testCase({\n            name: \"W3CTraceStateDependency: Fetch with AI_AND_W3C_TRACE mode includes tracestate header when value present\",\n            test: () => {\n                return createPromise<void>((resolve, reject) => {\n                    try {\n                        // Setup mock fetch using framework helper\n                        const fetchCalls = this.hookFetch<Response>((resolveResponse) => {\n                            setTimeout(() => {\n                                resolveResponse({\n                                    headers: new Headers(),\n                                    ok: true,\n                                    body: null,\n                                    bodyUsed: false,\n                                    redirected: false,\n                                    status: 200,\n                                    statusText: \"Hello\",\n                                    trailer: null,\n                                    type: \"basic\",\n                                    url: \"http://localhost:9001/README.md\"\n                                } as any);\n                            }, 0);\n                        });\n\n                        this._ajax = new AjaxMonitor();\n                        let appInsightsCore = new AppInsightsCore();\n                        let coreConfig = {\n                            instrumentationKey: \"instrumentationKey\",\n                            disableFetchTracking: false,\n                            disableAjaxTracking: false,\n                            extensions: [this._ajax],\n                            channels: [[new TestChannelPlugin()]],\n                            extensionConfig: {\n                                [this._ajax.identifier]: {\n                                    distributedTracingMode: eDistributedTracingModes.AI_AND_W3C_TRACE\n                                }\n                            }\n                        };\n                        appInsightsCore.initialize(coreConfig, []);\n                        let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n                        \n                        // Store the core instance for cleanup\n                        this._context.core = appInsightsCore;\n                        \n                        // Explicitly set a tracestate value to ensure the header is included\n                        _ensureTraceStateValue(appInsightsCore);\n\n                        // Use test hook to simulate the correct url location\n                        this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                        // Setup\n                        let headers = new Headers();\n                        headers.append('My-Header', 'Header field');\n                        let init = {\n                            method: 'get',\n                            headers: headers\n                        };\n                        const url = 'http://localhost:9001/README.md';\n\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            try {\n                                // Assert\n                                Assert.ok(trackSpy.called, \"The request was tracked\");\n\n                                Assert.equal(1, fetchCalls.length);\n                                Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                                \n                                // Get headers - handle both Headers object and plain object cases\n                                let fetchHeaders = fetchCalls[0].init.headers;\n                                let hasHeader = (name: string) => {\n                                    if (fetchHeaders instanceof Headers) {\n                                        return fetchHeaders.has(name);\n                                    } else if (typeof fetchHeaders === 'object') {\n                                        return !!fetchHeaders[name];\n                                    }\n                                    return false;\n                                };\n                                \n                                // Check all headers are present (tracestate included because there's a value)\n                                Assert.equal(true, hasHeader(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                                Assert.equal(true, hasHeader(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                                Assert.equal(true, hasHeader(RequestHeaders.traceStateHeader), \"W3c tracestate header should be present\");\n                                \n                                // Unload the core to clean up hooks\n                                _safeUnloadCore(appInsightsCore);\n                                \n                                resolve();\n                            } catch (e) {\n                                // Unload the core to clean up hooks even on failure\n                                _safeUnloadCore(appInsightsCore);\n                                reject(e);\n                            }\n                        }).catch((err) => {\n                            // Unload the core to clean up hooks even on failure\n                            _safeUnloadCore(appInsightsCore);\n                            reject(new Error(\"fetch failed! \" + (err ? err.toString() : \"\")));\n                        });\n                    } catch (ex) {\n                        reject(ex);\n                    }\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"W3CTraceStateDependency: Fetch with W3C_TRACE mode includes tracestate header when value present\",\n            test: () => {\n                return createPromise<void>((resolve, reject) => {\n                    try {\n                        // Setup mock fetch using framework helper\n                        const fetchCalls = this.hookFetch<Response>((resolveResponse) => {\n                            setTimeout(() => {\n                                resolveResponse({\n                                    headers: new Headers(),\n                                    ok: true,\n                                    body: null,\n                                    bodyUsed: false,\n                                    redirected: false,\n                                    status: 200,\n                                    statusText: \"Hello\",\n                                    trailer: null,\n                                    type: \"basic\",\n                                    url: \"http://localhost:9001/README.md\"\n                                } as any);\n                            }, 0);\n                        });\n\n                        // Create a fresh AjaxMonitor for each test\n                        this._ajax = new AjaxMonitor();\n                        let appInsightsCore = new AppInsightsCore();\n                        let coreConfig = {\n                            instrumentationKey: \"instrumentationKey\",\n                            disableFetchTracking: false,\n                            disableAjaxTracking: false,\n                            extensions: [this._ajax], // This is critical - add as an extension\n                            channels: [[new TestChannelPlugin()]],\n                            extensionConfig: {\n                                [this._ajax.identifier]: {\n                                    distributedTracingMode: eDistributedTracingModes.W3C_TRACE\n                                }\n                            }\n                        };\n\n                        // Initialize the core with the proper plugins\n                        appInsightsCore.initialize(coreConfig, []);\n                        let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n                        \n                        // Store the core instance for cleanup\n                        this._context.core = appInsightsCore;\n                        \n                        // Explicitly set a tracestate value to ensure the header is included\n                        _ensureTraceStateValue(appInsightsCore);\n\n                        // Use test hook to simulate the correct url location\n                        this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                        // Setup\n                        let headers = new Headers();\n                        headers.append('My-Header', 'Header field');\n                        let init = {\n                            method: 'get',\n                            headers: headers\n                        };\n                        const url = 'http://localhost:9001/README.md';\n\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            try {\n                                // Assert\n                                Assert.ok(trackSpy.called, \"The request was tracked\");\n                                Assert.equal(1, fetchCalls.length);\n                                Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                                \n                                // Get headers - handle both Headers object and plain object cases\n                                let fetchHeaders = fetchCalls[0].init.headers;\n                                let hasHeader = (name: string) => {\n                                    if (fetchHeaders instanceof Headers) {\n                                        return fetchHeaders.has(name);\n                                    } else if (typeof fetchHeaders === 'object') {\n                                        return !!fetchHeaders[name];\n                                    }\n                                    return false;\n                                };\n                                \n                                // Check W3C headers are present but not AI headers (tracestate included because there's a value)\n                                Assert.equal(false, hasHeader(RequestHeaders.requestIdHeader), \"AI header should not be present\");\n                                Assert.equal(true, hasHeader(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                                Assert.equal(true, hasHeader(RequestHeaders.traceStateHeader), \"W3c tracestate header should be present with value\");\n                                \n                                // Unload the core to clean up hooks\n                                _safeUnloadCore(appInsightsCore);\n                                \n                                resolve();\n                            } catch (e) {\n                                // Unload the core to clean up hooks even on failure\n                                _safeUnloadCore(appInsightsCore);\n                                reject(e);\n                            }\n                        }).catch((err) => {\n                            // Unload the core to clean up hooks even on failure\n                            _safeUnloadCore(appInsightsCore);\n                            reject(new Error(\"fetch failed! \" + (err ? err.toString() : \"\")));\n                        });\n                    } catch (ex) {\n                        reject(ex);\n                    }\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"W3CTraceStateDependency: Fetch with W3C_TRACE mode but no tracestate value\",\n            test: () => {\n                return createPromise<void>((resolve, reject) => {\n                    try {\n                        // Use the framework hookFetch helper\n                        const fetchCalls = this.hookFetch<Response>((resolveResponse) => {\n                            setTimeout(() => {\n                                resolveResponse({\n                                    headers: new Headers(),\n                                    ok: true,\n                                    body: null,\n                                    bodyUsed: false,\n                                    redirected: false,\n                                    status: 200,\n                                    statusText: \"Hello\",\n                                    trailer: null,\n                                    type: \"basic\",\n                                    url: \"http://localhost:9001/README.md\"\n                                } as any);\n                            }, 0);\n                        });\n\n                        // Create a fresh AjaxMonitor for each test\n                        this._ajax = new AjaxMonitor();\n                        let appInsightsCore = new AppInsightsCore();\n                        let coreConfig = {\n                            instrumentationKey: \"instrumentationKey\",\n                            disableFetchTracking: false,\n                            disableAjaxTracking: false,\n                            extensions: [this._ajax],\n                            channels: [[new TestChannelPlugin()]],\n                            extensionConfig: {\n                                [this._ajax.identifier]: {\n                                    // No appId here, so there should be no tracestate value\n                                    distributedTracingMode: eDistributedTracingModes.W3C_TRACE\n                                }\n                            }\n                        };\n                        \n                        // Store the core instance in context for cleanup\n                        this._context.core = appInsightsCore;\n\n                        // Initialize the core with the proper plugins\n                        appInsightsCore.initialize(coreConfig, []);\n                        let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n\n                        // Use test hook to simulate the correct url location\n                        this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                        // Setup\n                        let headers = new Headers();\n                        headers.append('My-Header', 'Header field');\n                        let init = {\n                            method: 'get',\n                            headers: headers\n                        };\n                        const url = 'http://localhost:9001/README.md';\n\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            try {\n                                // Assert\n                                Assert.ok(trackSpy.called, \"The request was tracked\");\n                                Assert.equal(1, fetchCalls.length, \"One fetch call made\");\n                                Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                                \n                                // Get headers - handle both Headers object and plain object cases\n                                let fetchHeaders = fetchCalls[0].init.headers;\n                                let hasHeader = (name: string) => {\n                                    if (fetchHeaders instanceof Headers) {\n                                        return fetchHeaders.has(name);\n                                    } else if (typeof fetchHeaders === 'object') {\n                                        return !!fetchHeaders[name];\n                                    }\n                                    return false;\n                                };\n                                \n                                // Check traceparent is present but no AI and no tracestate (no value to send)\n                                Assert.equal(false, hasHeader(RequestHeaders.requestIdHeader), \"AI header should not be present\");\n                                Assert.equal(true, hasHeader(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                                Assert.equal(false, hasHeader(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present when no value\");\n                                \n                                // Unload the core to clean up hooks\n                                _safeUnloadCore(appInsightsCore);\n                                \n                                resolve();\n                            } catch (e) {\n                                // Unload the core to clean up hooks even on failure\n                                _safeUnloadCore(appInsightsCore);\n                                reject(e);\n                            }\n                        }).catch((err) => {\n                            // Unload the core to clean up hooks even on failure\n                            _safeUnloadCore(appInsightsCore);\n                            reject(new Error(\"fetch failed! \" + (err ? err.toString() : \"\")));\n                        });\n                    } catch (ex) {\n                        reject(ex);\n                    }\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"W3CTraceStateDependency: Fetch with AI_AND_W3C mode does not include tracestate header\",\n            test: () => {\n                return createPromise<void>((resolve, reject) => {\n                    try {\n                        // Setup mock fetch using framework helper\n                        const fetchCalls = this.hookFetch<Response>((resolveResponse) => {\n                            setTimeout(() => {\n                                resolveResponse({\n                                    headers: new Headers(),\n                                    ok: true,\n                                    body: null,\n                                    bodyUsed: false,\n                                    redirected: false,\n                                    status: 200,\n                                    statusText: \"Hello\",\n                                    trailer: null,\n                                    type: \"basic\",\n                                    url: \"http://localhost:9001/README.md\"\n                                } as any);\n                            }, 0);\n                        });\n\n                        this._ajax = new AjaxMonitor();\n                        let appInsightsCore = new AppInsightsCore();\n                        let coreConfig = {\n                            instrumentationKey: \"instrumentationKey\",\n                            disableFetchTracking: false,\n                            disableAjaxTracking: false,\n                            extensions: [this._ajax],\n                            channels: [[new TestChannelPlugin()]],\n                            extensionConfig: {\n                                [this._ajax.identifier]: {\n                                    distributedTracingMode: eDistributedTracingModes.AI_AND_W3C // No tracestate bit\n                                }\n                            }\n                        };\n                        appInsightsCore.initialize(coreConfig, []);\n                        let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n\n                        // Use test hook to simulate the correct url location\n                        this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                        // Setup\n                        let headers = new Headers();\n                        headers.append('My-Header', 'Header field');\n                        let init = {\n                            method: 'get',\n                            headers: headers\n                        };\n                        const url = 'http://localhost:9001/README.md';\n\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            try {\n                                // Assert\n                                Assert.ok(trackSpy.called, \"The request was tracked\");\n                                Assert.equal(1, fetchCalls.length);\n                                Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                                \n                                // Get headers - handle both Headers object and plain object cases\n                                let fetchHeaders = fetchCalls[0].init.headers;\n                                let hasHeader = (name: string) => {\n                                    if (fetchHeaders instanceof Headers) {\n                                        return fetchHeaders.has(name);\n                                    } else if (typeof fetchHeaders === 'object') {\n                                        return !!fetchHeaders[name];\n                                    }\n                                    return false;\n                                };\n                                \n                                // Check that AI and traceparent headers are present but not tracestate\n                                Assert.equal(true, hasHeader(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                                Assert.equal(true, hasHeader(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                                Assert.equal(false, hasHeader(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present\");\n                                \n                                // Unload the core to clean up hooks\n                                _safeUnloadCore(appInsightsCore);\n                                \n                                resolve();\n                            } catch (e) {\n                                // Unload the core to clean up hooks even on failure\n                                _safeUnloadCore(appInsightsCore);\n                                reject(e);\n                            }\n                        }).catch((err) => {\n                            // Unload the core to clean up hooks even on failure\n                            _safeUnloadCore(appInsightsCore);\n                            reject(new Error(\"fetch failed! \" + (err ? err.toString() : \"\")));\n                        });\n                    } catch (ex) {\n                        reject(ex);\n                    }\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"W3CTraceStateDependency: Fetch with AI mode does not include W3C headers\",\n            test: () => {\n                return createPromise<void>((resolve, reject) => {\n                    try {\n                        // Setup mock fetch using framework helper\n                        const fetchCalls = this.hookFetch<Response>((resolveResponse) => {\n                            setTimeout(() => {\n                                resolveResponse({\n                                    headers: new Headers(),\n                                    ok: true,\n                                    body: null,\n                                    bodyUsed: false,\n                                    redirected: false,\n                                    status: 200,\n                                    statusText: \"Hello\",\n                                    trailer: null,\n                                    type: \"basic\",\n                                    url: \"http://localhost:9001/README.md\"\n                                } as any);\n                            }, 0);\n                        });\n\n                        this._ajax = new AjaxMonitor();\n                        let appInsightsCore = new AppInsightsCore();\n                        let coreConfig = {\n                            instrumentationKey: \"instrumentationKey\",\n                            disableFetchTracking: false,\n                            disableAjaxTracking: false,\n                            extensions: [this._ajax],\n                            channels: [[new TestChannelPlugin()]],\n                            extensionConfig: {\n                                [this._ajax.identifier]: {\n                                    distributedTracingMode: eDistributedTracingModes.AI // AI mode only\n                                }\n                            }\n                        };\n                        appInsightsCore.initialize(coreConfig, []);\n                        let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n\n                        // Use test hook to simulate the correct url location\n                        this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                        // Setup\n                        let headers = new Headers();\n                        headers.append('My-Header', 'Header field');\n                        let init = {\n                            method: 'get',\n                            headers: headers\n                        };\n                        const url = 'http://localhost:9001/README.md';\n\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            try {\n                                // Assert\n                                Assert.ok(trackSpy.called, \"The request was tracked\");\n                                Assert.equal(1, fetchCalls.length);\n                                Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                                \n                                // Get headers - handle both Headers object and plain object cases\n                                let fetchHeaders = fetchCalls[0].init.headers;\n                                let hasHeader = (name: string) => {\n                                    if (fetchHeaders instanceof Headers) {\n                                        return fetchHeaders.has(name);\n                                    } else if (typeof fetchHeaders === 'object') {\n                                        return !!fetchHeaders[name];\n                                    }\n                                    return false;\n                                };\n                                \n                                // Check that only AI header is present, no W3C headers\n                                Assert.equal(true, hasHeader(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                                Assert.equal(false, hasHeader(RequestHeaders.traceParentHeader), \"W3c traceparent header should not be present\");\n                                Assert.equal(false, hasHeader(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present\");\n                                \n                                // Unload the core to clean up hooks\n                                _safeUnloadCore(appInsightsCore);\n                                \n                                resolve();\n                            } catch (e) {\n                                // Unload the core to clean up hooks even on failure\n                                _safeUnloadCore(appInsightsCore);\n                                reject(e);\n                            }\n                        }).catch((err) => {\n                            // Unload the core to clean up hooks even on failure\n                            _safeUnloadCore(appInsightsCore);\n                            reject(new Error(\"fetch failed! \" + (err ? err.toString() : \"\")));\n                        });\n                    } catch (ex) {\n                        reject(ex);\n                    }\n                });\n            }\n        });\n\n        // Additional XMLHttpRequest tests with value presence testing\n        this.testCase({\n            name: \"W3CTraceStateDependency: tracestate header is only included when there's a value\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            distributedTracingMode: eDistributedTracingModes.W3C_TRACE\n                        }\n                    }\n                };\n                \n                appInsightsCore.initialize(coreConfig, []);\n                \n                // Store the core instance for cleanup\n                this._context.core = appInsightsCore;\n                \n                // Explicitly set a tracestate value to ensure the header is included\n                _ensureTraceStateValue(appInsightsCore);\n                \n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act - with manually set tracestate value, there should be a tracestate header\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that W3C headers are sent, including tracestate (because there's a value)\n                Assert.equal(false, spy.calledWith(RequestHeaders.requestIdHeader), \"AI header should not be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should be present with value\");\n\n                // Emulate response\n                (xhr as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Create a new monitor without tracestate value\n                this._ajax.teardown();\n                this._ajax = new AjaxMonitor();\n                let coreConfig2 = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            // No tracestate value initially\n                            distributedTracingMode: eDistributedTracingModes.W3C_TRACE\n                        }\n                    }\n                };\n                \n                let appInsightsCore2 = new AppInsightsCore();\n                appInsightsCore2.initialize(coreConfig2, [new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n                \n                // Act - without tracestate value, there should be no tracestate header\n                var xhr2 = new XMLHttpRequest();\n                var spy2 = this.sandbox.spy(xhr2, \"setRequestHeader\");\n                xhr2.open(\"GET\", \"http://www.example.com\");\n                xhr2.send();\n                \n                // Assert that even with W3C_TRACE mode, tracestate is not sent (no value to send)\n                Assert.equal(false, spy2.calledWith(RequestHeaders.requestIdHeader), \"AI header should not be present\");\n                Assert.equal(true, spy2.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(false, spy2.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present when no value\");\n                \n                // Emulate response\n                (xhr2 as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload both core instances to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n                _safeUnloadCore(appInsightsCore2);\n            }\n        });\n\n        this.testCase({\n            name: \"W3CTraceStateDependency: AI_AND_W3C_TRACE mode without tracestate value\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensions: [this._ajax],\n                    channels: [[new TestChannelPlugin()]],\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            // No tracestate value initially\n                            distributedTracingMode: eDistributedTracingModes.AI_AND_W3C_TRACE\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, []);\n                \n                // Store the core instance for cleanup\n                this._context.core = appInsightsCore;\n                \n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act - test initially without any tracestate value\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that AI and traceparent headers are sent, but not tracestate (no value to send)\n                Assert.equal(true, spy.calledWith(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(false, spy.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should not be present without value\");\n\n                // Emulate response\n                (xhr as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Manually add a tracestate value, which should cause the header to be included\n                const traceCtx = appInsightsCore.getTraceCtx();\n                if (traceCtx && traceCtx.traceState) {\n                    traceCtx.traceState.set(\"test\", \"value\");\n                }\n                \n                // Act - now with a manually added tracestate value\n                var xhr2 = new XMLHttpRequest();\n                var spy2 = this.sandbox.spy(xhr2, \"setRequestHeader\");\n                xhr2.open(\"GET\", \"http://www.example.com\");\n                xhr2.send();\n                \n                // Assert that all headers are sent (tracestate included because we manually added a value)\n                Assert.equal(true, spy2.calledWith(RequestHeaders.requestIdHeader), \"AI header should be present\");\n                Assert.equal(true, spy2.calledWith(RequestHeaders.traceParentHeader), \"W3c traceparent header should be present\");\n                Assert.equal(true, spy2.calledWith(RequestHeaders.traceStateHeader), \"W3c tracestate header should be present with manual value\");\n                \n                // Emulate response so perf monitoring is cleaned up\n                (xhr2 as any).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                // Unload the core to clean up hooks\n                _safeUnloadCore(appInsightsCore);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/Tests/Unit/src/ajax.tests.ts",
    "content": "import { SinonStub } from \"sinon\";\nimport { Assert, AITestClass, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { createAllPromise, createAsyncResolvedPromise, createPromise, createSyncPromise, createTimeoutPromise } from \"@nevware21/ts-async\";\nimport { AjaxMonitor } from \"../../../src/ajax\";\nimport { DisabledPropertyName, IConfig, DistributedTracingModes, RequestHeaders, IDependencyTelemetry, IRequestContext, formatTraceParent, createTraceParent, PropertiesPluginIdentifier } from \"@microsoft/applicationinsights-core-js\";\nimport {\n    AppInsightsCore, IConfiguration, ITelemetryItem, ITelemetryPlugin, IChannelControls, _eInternalMessageId,\n    getPerformance, getGlobalInst, getGlobal, generateW3CId, arrForEach,\n    ActiveStatus\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IDependencyListenerDetails } from \"../../../src/DependencyListener\";\nimport { TestChannelPlugin } from \"./TestChannelPlugin\";\nimport { FakeXMLHttpRequest } from \"@microsoft/ai-test-framework\";\nimport { dumpObj, isNullOrUndefined, setBypassLazyCache, strLeft } from \"@nevware21/ts-utils\";\n\nconst AJAX_DATA_CONTAINER = \"_ajaxData\";\n\ninterface IFetchArgs {\n    input: RequestInfo,\n    init: RequestInit\n}\n\nfunction hookFetch<T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): IFetchArgs[] {\n    let calls:IFetchArgs[] = [];\n    let global = getGlobal() as any;\n    global.fetch = function(input: RequestInfo, init?: RequestInit) {\n        calls.push({\n            input,\n            init\n        });\n        return createSyncPromise(executor);\n    }\n\n    return calls;\n}\n\nfunction hookTrackDependencyInternal(ajaxMonitor: AjaxMonitor) {\n    let orgInternalDependency: (dependency: IDependencyTelemetry, properties?: { [key: string]: any }, sysProperties?: { [key: string]: any }) => void = ajaxMonitor[\"trackDependencyDataInternal\"];\n    let dependencyArgs: { dependency: IDependencyTelemetry, sysProperties?: { [key: string]: any } }[] = [];\n\n    ajaxMonitor[\"trackDependencyDataInternal\"] = function (dependency: IDependencyTelemetry, properties?: { [key: string]: any }, sysProperties?: { [key: string]: any }) {\n        let orgArguments = arguments;\n        dependencyArgs.push({\n            dependency,\n            sysProperties\n        });\n\n        orgInternalDependency.apply(ajaxMonitor, orgArguments);\n    };\n\n    return dependencyArgs;\n}\n\nexport class AjaxTests extends AITestClass {\n    private _fetch;\n    private _ajax:AjaxMonitor = null;\n    private _context:any = {};\n\n    constructor(name?: string, emulateIe?: boolean) {\n        super(name, emulateIe);\n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n    }\n    \n    public testInitialize() {\n        this._context = {};\n        this.useFakeServer = true;\n        this._fetch = getGlobalInst(\"fetch\");\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ajax !== null) {\n            this._ajax.teardown();\n            this._ajax = null;\n        }\n    }\n\n    public testCleanup() {\n        this._context = {};\n        getGlobal().fetch = this._fetch;\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Dependencies Configuration: Config can be set from root config\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentation_key\",\n                    maxAjaxCallsPerView: 5,\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                for (let lp = 0; lp < 5; lp++) {\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(\"GET\", \"http://microsoft.com\");\n                    xhr.setRequestHeader(\"header name\", \"header value\");\n                    xhr.send();\n                    // Emulate response\n                    (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                }\n                Assert.equal(5, trackSpy.callCount, \"Track has been called 5 times\");\n                Assert.equal(false, throwSpy.called, \"We should not have thrown an internal error -- yet\");\n\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.setRequestHeader(\"header name\", \"header value\");\n                xhr.send();\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n\n                Assert.equal(5, trackSpy.callCount, \"Track has still only been called 5 times\");\n                Assert.equal(true, throwSpy.called, \"We should have thrown an internal error\");\n                Assert.equal(_eInternalMessageId.MaxAjaxPerPVExceeded, throwSpy.args[0][1], \"Reported error should be max exceeded\");\n                Assert.equal(true, throwSpy.args[0][2].indexOf(\"ajax per page view limit\") !== -1, \"Reported error should be contain text describing the issue\");\n\n                Assert.equal(6, dependencyFields.length, \"trackDependencyDataInternal should have been called\");\n                for (let lp = 0; lp < 6; lp++) {\n                    Assert.ok(dependencyFields[lp].dependency.startTime, `startTime ${lp} was specified before trackDependencyDataInternal was called`);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Dependencies Configuration: resetAjaxAttempts resets ajax call counter\",\n            useFakeTimers: true,\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentation_key\",\n                    maxAjaxCallsPerView: 3, // Set lower limit for easier testing\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n                \n                // Track 3 ajax calls to reach the limit\n                for (let i = 0; i < 3; i++) {\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(\"GET\", \"http://microsoft.com\");\n                    xhr.setRequestHeader(\"header name\", \"header value\");\n                    xhr.send();\n                    (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                }\n                \n                Assert.equal(3, trackSpy.callCount, \"Track should be called 3 times\");\n                Assert.equal(false, throwSpy.called, \"Should not have thrown error yet\");\n                \n                // Try one more - should trigger the limit error\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.setRequestHeader(\"header name\", \"header value\");\n                xhr.send();\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                Assert.equal(3, trackSpy.callCount, \"Track should still be 3 after exceeding limit\");\n                Assert.equal(true, throwSpy.called, \"Should have thrown error for exceeding limit\");\n                Assert.equal(_eInternalMessageId.MaxAjaxPerPVExceeded, throwSpy.args[0][1], \"Error should be max exceeded\");\n                \n                // Reset the ajax attempts counter\n                this._ajax.resetAjaxAttempts();\n                \n                // Clear the spy to start fresh\n                throwSpy.resetHistory();\n                \n                // Now try again - should work because counter was reset\n                var xhr2 = new XMLHttpRequest();\n                xhr2.open(\"GET\", \"http://microsoft.com\");\n                xhr2.setRequestHeader(\"header name\", \"header value\");\n                xhr2.send();\n                (<any>xhr2).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                \n                Assert.equal(4, trackSpy.callCount, \"Track should now be called 4 times after reset\");\n                Assert.equal(false, throwSpy.called, \"Should not throw error after reset\");\n            }\n        });\n\n        this.testCase({\n            name: \"Dependencies Configuration: Config can be set dynamically\",\n            useFakeTimers: true,\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n            \n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentation_key\",\n                    extensionConfig: {\n                        [this._ajax.identifier]: {\n                            disableAjaxTracking: true,\n                            enableRequestHeaderTracking: false,\n                            enableCorsCorrelation: true,\n                            addRequestContext: (requestContext: IRequestContext) => {\n                                return {\n                                    headers: {...requestContext?.xhr[AJAX_DATA_CONTAINER].i[ajaxDataId].requestHeaders} || {}\n                                }\n                            }\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                Assert.equal( appInsightsCore.config[\"extensionConfig\"][this._ajax.identifier].disableAjaxTracking, true, \"extension config should be set from root\");\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                xhr.send();\n                Assert.ok(!(<any>xhr)[AJAX_DATA_CONTAINER], \"should not have xhr hooks\");\n                Assert.equal(0, trackStub.callCount, \"Track should not be called\");\n\n                appInsightsCore.config[\"extensionConfig\"][this._ajax.identifier].disableAjaxTracking = false;\n                this.clock.tick(1);\n\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                \n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER]);\n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId]);\n                var ajaxData = (<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId];\n                Assert.equal(ajaxData.method, \"GET\", \"ajax data should have right fields\");\n                Assert.deepEqual(ajaxData.requestHeaders, {}, \"request headers should not be set in ajaxData\");\n                Assert.equal(0, trackStub.callCount, \"Track should not be called\");\n\n                appInsightsCore.config[\"extensionConfig\"][this._ajax.identifier].enableRequestHeaderTracking = true;\n                this.clock.tick(1);\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.setRequestHeader(\"header name\", \"some value\");\n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER]);\n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId]);\n                var ajaxData = (<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId];\n                Assert.equal(ajaxData.method, \"GET\", \"ajax data should have right fields\");\n                Assert.deepEqual(ajaxData.requestHeaders, {\"header name\":\"some value\"}, \"request headers should not be set in ajaxData\");\n                Assert.equal(0, trackStub.callCount, \"Track should not be called\");\n\n\n                for (let lp = 0; lp < 2; lp++) {\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(\"GET\", \"http://microsoft.com\");\n                    xhr.setRequestHeader(\"header name\", \"header value\");\n                    xhr.send();\n                    // Emulate response\n                    (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                }\n                Assert.equal(2, trackStub.callCount, \"Track has been called 2 times\");\n                Assert.equal(false, throwSpy.called, \"We should not have thrown an internal error -- yet\");\n\n\n                Assert.equal(2, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(data.type, \"Ajax\", \"request type should be ajax\");\n                Assert.ok(data.properties, \"properties should be added\");\n                Assert.ok(data.properties.headers, \"headers should be added\");\n                Assert.equal(data.properties.headers[\"header name\"], \"header value\",\"headers should be added\");\n            }\n        });\n\n        this.testCase({\n            name: \"Dependencies Configuration: init with cs promise ikey promise and default enableAjaxPerfTracking\",\n            useFakeTimers: true,\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let csPromise = createAsyncResolvedPromise(\"testIkey\");\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: csPromise,\n                    initTimeOut: 80000\n                    \n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n          \n                let trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n                Assert.equal(false, trackStub.called, \"Track should not be called\");\n                Assert.equal(false, throwSpy.called, \"We should not have thrown an internal error\");\n\n                this._context.core = appInsightsCore;\n                this._context.trackStub = trackStub;\n                this._context.throwSpy  = throwSpy;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        let xhr = new XMLHttpRequest();\n                        xhr.open(\"GET\", \"http://microsoft.com\");\n                        xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                        xhr.send();\n                        // Emulate response\n                        (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                        Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER], \"should have xhr hooks\");\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let core = this._context.core\n                        let activeStatus = core.activeStatus && core.activeStatus();\n                        let trackStub =  this._context.trackStub;\n                        let throwSpy = this._context.throwSpy;\n                    \n                        if (activeStatus === ActiveStatus.ACTIVE) {\n                            Assert.equal(\"testIkey\", core.config.instrumentationKey, \"ikey should be set\");\n                            Assert.equal(1, trackStub.callCount, \"Track should be called once\");\n                            Assert.equal(false, throwSpy.called, \"We should not have thrown an internal error test1\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(data.type, \"Ajax\", \"request type should be ajax\");\n                            Assert.ok(data.properties, \"properties should be added\");\n                            return true;\n                        }\n                        return false;\n                    }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"Dependencies Configuration: Make sure we don't fail for invalid arguments\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentation_key\",\n                    maxAjaxCallsPerView: 5,\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", null);\n                xhr.setRequestHeader(\"header name\", \"header value\");\n                xhr.send();\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", undefined);\n                xhr.setRequestHeader(\"header name\", \"header value\");\n                xhr.send();\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n\n                Assert.equal(2, trackSpy.callCount, \"Track has been called 2 times\");\n                Assert.equal(2, dependencyFields.length, \"trackDependencyDataInternal should have been called\");\n                Assert.ok(dependencyFields[0].dependency.startTime, \"startTime 0 was specified before trackDependencyDataInternal was called\")\n                Assert.ok(dependencyFields[1].dependency.startTime, \"startTime 1 was specified before trackDependencyDataInternal was called\")\n\n                Assert.equal(false, throwSpy.called, \"We should not have thrown an internal error -- yet\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr.open gets instrumented\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER])\n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId])\n                var ajaxData = (<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId];\n                Assert.equal(\"http://microsoft.com\", ajaxData.requestUrl, \"RequestUrl is collected correctly\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr with disabled flag isn't tracked\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"\", disableAjaxTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr[DisabledPropertyName] = true;\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"RequestUrl is collected correctly\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: Validate that internal endpoints are not automatically instrumented\",\n            useFakeServer: true,\n            test: () => {\n                const endpointUrls = [\n                    \"https://browser.aria.pipe.microsoft.com/Collector/3.0/?qsp-true\",\n                    \"https://browser.events.data.microsoft.com/OneCollector/1.0\",\n                    \"https://self.pipe.aria.microsoft.com/Collector/3.0/\",\n                    \"https://blah.events.data.microsoft.com/OneCollector/1.0/\",\n                    \"https://self.pipe.aria.int.microsoft.com/Collector/3.0/\",\n                    \"https://collector.azure.domain/Collector/3.0/\",\n                    \"https://collector.azure.microsoft.domain/Collector/3.0/\",\n                    \"https://collector.azure.microsoft.domain/OneCollector/1.0/\",\n                    \"https://self.pipe.aria.int.microsoft.com/Collector/3.0/\",\n                    \"https://collector.azure.cn/OneCollector/1.0/\"\n                ];\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"\", disableAjaxTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                arrForEach(endpointUrls, (endpointUrl) => {\n                    // act\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(\"GET\", endpointUrl);\n\n                    // assert\n                    Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"RequestUrl is collected correctly\");\n                });\n            }\n        });\n\n\n        this.testCase({\n            name: \"Ajax: Validate that internal endpoints are instrumented if disabled\",\n            useFakeServer: true,\n            test: () => {\n                const endpointUrls = [\n                    \"https://browser.aria.pipe.microsoft.com/Collector/3.0/?qsp-true\",\n                    \"https://browser.events.data.microsoft.com/OneCollector/1.0\",\n                    \"https://self.pipe.aria.microsoft.com/Collector/3.0/\",\n                    \"https://blah.events.data.microsoft.com/OneCollector/1.0/\",\n                    \"https://self.pipe.aria.int.microsoft.com/Collector/3.0/\",\n                    \"https://collector.azure.domain/Collector/3.0/\",\n                    \"https://collector.azure.microsoft.domain/Collector/3.0/\",\n                    \"https://collector.azure.microsoft.domain/OneCollector/1.0/\",\n                    \"https://self.pipe.aria.int.microsoft.com/Collector/3.0/\",\n                    \"https://collector.azure.cn/OneCollector/1.0/\"\n                ];\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = {\n                    instrumentationKey: \"\",\n                    disableAjaxTracking: false,\n                    addIntEndpoints: false\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                arrForEach(endpointUrls, (endpointUrl) => {\n                    // act\n                    var xhr = new XMLHttpRequest();\n                    xhr.open(\"GET\", endpointUrl);\n\n                    // assert\n                    Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER], \"Ajax Container created\");\n\n                    var ajaxData = (<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId];\n                    Assert.equal(endpointUrl, ajaxData.requestUrl, \"RequestUrl is collected correctly\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: Validate dependency initializer\",\n            useFakeServer: true,\n            test: () => {\n                let initializerCalled = false;\n                this._ajax = new AjaxMonitor();\n                this._ajax.addDependencyInitializer((details) => {\n                    let props = details.item.properties = details.item.properties || {};\n                    props.initializer = { called: true };\n                    initializerCalled = true;\n                });\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = {\n                    instrumentationKey: \"\",\n                    disableAjaxTracking: false,\n                    addIntEndpoints: false\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n\n                Assert.equal(0, trackSpy.callCount, \"Track has not been called\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                var ajaxData = (<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId];\n                Assert.equal(\"http://microsoft.com\", ajaxData.requestUrl, \"RequestUrl is collected correctly\");\n\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n\n                Assert.ok(initializerCalled, \"Initializer was not called\");\n\n                // assert\n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER], \"The ajax data container should still exist\");\n                Assert.ok(!(<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId], \"The ajax data should have been removed\");\n                Assert.equal(1, trackSpy.callCount, \"Track has been called\");\n                Assert.equal(true, trackSpy.args[0][0].baseData.properties.initializer.called, \"The value set in the initializer was added\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: Validate dependency initializer returning false to drop the request\",\n            useFakeServer: true,\n            test: () => {\n                let initializerCalled = false;\n                this._ajax = new AjaxMonitor();\n                this._ajax.addDependencyInitializer((details) => {\n                    initializerCalled = true;\n                    return false;\n                });\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = {\n                    instrumentationKey: \"\",\n                    disableAjaxTracking: false,\n                    addIntEndpoints: false\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n\n                Assert.equal(0, trackSpy.callCount, \"Track has not been called\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                var ajaxData = (<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId];\n                Assert.equal(\"http://microsoft.com\", ajaxData.requestUrl, \"RequestUrl is collected correctly\");\n\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n\n                Assert.ok(initializerCalled, \"Initializer was not called\");\n\n                // assert\n                Assert.ok((<any>xhr)[AJAX_DATA_CONTAINER], \"The ajax data container should still exist\");\n                Assert.ok(!(<any>xhr)[AJAX_DATA_CONTAINER].i[ajaxDataId], \"The ajax data should have been removed\");\n                Assert.equal(0, trackSpy.callCount, \"Track has not been called\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr with disabled flag isn't tracked and any followup request to the same URL event without the disabled flag are also not tracked\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"\", disableAjaxTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr[DisabledPropertyName] = true;\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"RequestUrl is collected correctly\");\n\n                xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"Follow up GET Request was not instrumented\");\n\n                xhr = new XMLHttpRequest();\n                xhr.open(\"POST\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"Follow up POST Request was not instrumented\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr without disabled flag but with exclude string configured are not tracked\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                const ExcludeRequestRegex = [\"microsoft\"];\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"\", disableAjaxTracking: true, excludeRequestFromAutoTrackingPatterns: ExcludeRequestRegex };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"RequestUrl is collected correctly\");\n\n                xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"Follow up GET Request was not instrumented\");\n\n                xhr = new XMLHttpRequest();\n                xhr.open(\"POST\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"Follow up POST Request was not instrumented\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr without disabled flag but with sealed exclude regex configured are not tracked\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                const ExcludeRequestRegex = [Object.freeze(/microsoft/i), Object.seal(/microsoft/i) ];\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"\", disableAjaxTracking: true, excludeRequestFromAutoTrackingPatterns: ExcludeRequestRegex };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"RequestUrl is collected correctly\");\n\n                xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"Follow up GET Request was not instrumented\");\n\n                xhr = new XMLHttpRequest();\n                xhr.open(\"POST\", \"http://microsoft.com\");\n\n                // assert\n                Assert.equal(undefined, (<any>xhr)[AJAX_DATA_CONTAINER], \"Follow up POST Request was not instrumented\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: add context into custom dimension with call back configuration on AI initialization.\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                let coreConfig: IConfiguration & IConfig = { \n                    instrumentationKey: \"\", \n                    disableAjaxTracking: false,\n                    addRequestContext: (requestContext: IRequestContext) => {\n                        return {\n                            test: \"ajax context\",\n                            xhrStatus: requestContext.status\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n\n                Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(\"ajax context\", data.properties.test, \"xhr request's request context is added when customer configures addRequestContext.\");\n                Assert.equal(200, data.properties.xhrStatus, \"xhr object properties are captured\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: Track changing the traceId / SpanId still sends the original traceId / SpanId for any ajax requests.\",\n            useFakeServer: true,\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                let coreConfig: IConfiguration & IConfig = { \n                    instrumentationKey: \"\", \n                    disableAjaxTracking: false\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                let traceCtx = appInsightsCore.getTraceCtx();\n                let expectedTraceId = generateW3CId();\n                let expectedSpanId = generateW3CId().substring(0, 16);\n\n                // Note: Replaces the global current traceId and spanId with new values\n                traceCtx!.setTraceId(expectedTraceId);\n                traceCtx!.setSpanId(expectedSpanId);\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                // change the traceId\n                let newExpectedTraceId = generateW3CId();\n                let newExpectedSpanId = generateW3CId().substring(0, 16);\n\n                // Note: Replaces the global current traceId and spanId with new values\n                traceCtx!.setTraceId(newExpectedTraceId);\n                traceCtx!.setSpanId(newExpectedSpanId);\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n\n                Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n\n                xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n                Assert.equal(2, dependencyFields.length, \"trackDependencyDataInternal was called again\");\n\n                Assert.equal(expectedTraceId, dependencyFields[0].sysProperties!.trace.traceID, \"Check first traceId\");\n                Assert.equal(newExpectedTraceId, dependencyFields[1].sysProperties!.trace.traceID, \"Check second traceId\");\n\n                Assert.equal(expectedSpanId, dependencyFields[0].sysProperties!.trace.parentID, \"Check first spanId\");\n                Assert.equal(newExpectedSpanId, dependencyFields[1].sysProperties!.trace.parentID, \"Check second spanId\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: should create unique spanId for traceparent header without modifying current trace context\",\n            useFakeServer: true,\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { \n                    instrumentationKey: \"instrumentationKey\", \n                    disableAjaxTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n                            enableRequestHeaderTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                // Use test hook to simulate the correct url location host to enable correlation headers\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Set up trace context with known values\n                let traceCtx = appInsightsCore.getTraceCtx();\n                let originalTraceId = generateW3CId();\n                let originalSpanId = generateW3CId().substring(0, 16);\n                traceCtx!.setTraceId(originalTraceId);\n                traceCtx!.setSpanId(originalSpanId);\n\n                // Verify initial state\n                Assert.equal(originalTraceId, traceCtx!.getTraceId(), \"Initial traceId should be set\");\n                Assert.equal(originalSpanId, traceCtx!.getSpanId(), \"Initial spanId should be set\");\n\n                // Act - make first AJAX request\n                var xhr1 = new XMLHttpRequest();\n                var spy1 = this.sandbox.spy(xhr1, \"setRequestHeader\");\n                xhr1.open(\"GET\", \"http://www.example.com/api1\");\n                xhr1.send();\n\n                // Verify trace context is unchanged after first request\n                Assert.equal(originalTraceId, traceCtx!.getTraceId(), \"TraceId should remain unchanged after first request\");\n                Assert.equal(originalSpanId, traceCtx!.getSpanId(), \"SpanId should remain unchanged after first request\");\n\n                // Extract headers from first request\n                let firstRequestHeaders: { [key: string]: string } = {};\n                spy1.getCalls().forEach(call => {\n                    firstRequestHeaders[call.args[0]] = call.args[1];\n                });\n\n                // Act - make second AJAX request\n                var xhr2 = new XMLHttpRequest();\n                var spy2 = this.sandbox.spy(xhr2, \"setRequestHeader\");\n                xhr2.open(\"GET\", \"http://www.example.com/api2\");\n                xhr2.send();\n\n                // Verify trace context is still unchanged after second request\n                Assert.equal(originalTraceId, traceCtx!.getTraceId(), \"TraceId should remain unchanged after second request\");\n                Assert.equal(originalSpanId, traceCtx!.getSpanId(), \"SpanId should remain unchanged after second request\");\n\n                // Extract headers from second request\n                let secondRequestHeaders: { [key: string]: string } = {};\n                spy2.getCalls().forEach(call => {\n                    secondRequestHeaders[call.args[0]] = call.args[1];\n                });\n\n                // Validate that both requests have traceparent headers\n                Assert.ok(firstRequestHeaders[RequestHeaders.traceParentHeader], \"First request should have traceparent header\");\n                Assert.ok(secondRequestHeaders[RequestHeaders.traceParentHeader], \"Second request should have traceparent header\");\n\n                // Parse traceparent headers (format: 00-{traceId}-{spanId}-{flags})\n                let firstTraceParent = firstRequestHeaders[RequestHeaders.traceParentHeader];\n                let secondTraceParent = secondRequestHeaders[RequestHeaders.traceParentHeader];\n                \n                let firstTraceParentParts = firstTraceParent.split('-');\n                let secondTraceParentParts = secondTraceParent.split('-');\n\n                Assert.equal(4, firstTraceParentParts.length, \"First traceparent should have 4 parts\");\n                Assert.equal(4, secondTraceParentParts.length, \"Second traceparent should have 4 parts\");\n\n                let firstHeaderTraceId = firstTraceParentParts[1];\n                let firstHeaderSpanId = firstTraceParentParts[2];\n                let secondHeaderTraceId = secondTraceParentParts[1];\n                let secondHeaderSpanId = secondTraceParentParts[2];\n\n                // Validate traceId consistency - all should use the same traceId\n                Assert.equal(originalTraceId, firstHeaderTraceId, \"First request traceId in header should match original\");\n                Assert.equal(originalTraceId, secondHeaderTraceId, \"Second request traceId in header should match original\");\n\n                // Validate spanId isolation - each request should have unique spanId, different from current context\n                Assert.notEqual(originalSpanId, firstHeaderSpanId, \"First request spanId in header should be different from current context spanId\");\n                Assert.notEqual(originalSpanId, secondHeaderSpanId, \"Second request spanId in header should be different from current context spanId\");\n                Assert.notEqual(firstHeaderSpanId, secondHeaderSpanId, \"Each request should have unique spanId\");\n\n                // Validate spanId format (should be 16 hex characters)\n                Assert.equal(16, firstHeaderSpanId.length, \"First request spanId should be 16 characters\");\n                Assert.equal(16, secondHeaderSpanId.length, \"Second request spanId should be 16 characters\");\n                Assert.ok(/^[0-9a-f]{16}$/.test(firstHeaderSpanId), \"First request spanId should be valid hex\");\n                Assert.ok(/^[0-9a-f]{16}$/.test(secondHeaderSpanId), \"Second request spanId should be valid hex\");\n\n                // Validate AI Request-Id header format consistency\n                let firstRequestId = firstRequestHeaders[RequestHeaders.requestIdHeader];\n                let secondRequestId = secondRequestHeaders[RequestHeaders.requestIdHeader];\n                \n                Assert.ok(firstRequestId?.startsWith(\"|\" + originalTraceId + \".\"), \"First AI Request-Id should start with correct traceId\");\n                Assert.ok(secondRequestId?.startsWith(\"|\" + originalTraceId + \".\"), \"Second AI Request-Id should start with correct traceId\");\n                Assert.notEqual(firstRequestId, secondRequestId, \"Each request should have unique AI Request-Id\");\n\n                // Clean up responses\n                (<any>xhr1).respond(200, {}, \"\");\n                (<any>xhr2).respond(200, {}, \"\");\n\n                // Final verification that trace context is still unchanged\n                Assert.equal(originalTraceId, traceCtx!.getTraceId(), \"TraceId should remain unchanged at end\");\n                Assert.equal(originalSpanId, traceCtx!.getSpanId(), \"SpanId should remain unchanged at end\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr request header is tracked as part C data when enableRequestHeaderTracking flag is true\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableRequestHeaderTracking: true };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.setRequestHeader(\"header name\", \"header value\");\n                xhr.setRequestHeader(\"Authorization\", \"Authorization\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.notEqual(undefined, data.properties.requestHeaders, \"xhr request's request header is stored\");\n                Assert.equal(undefined, data.properties.requestHeaders[\"Authorization\"], \"xhr request's request header is not ignored when the header is in ignoreHeaders\");\n                Assert.equal(undefined, data.properties.responseHeaders, \"xhr request's reponse header is not stored when enableResponseHeaderTracking flag is not set, default is false\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr request header is tracked as part C data when enableResponseHeaderTracking flag is true\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableResponseHeaderTracking: true };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\",\"Authorization\":\"Authorization\"}, \"\");\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(undefined, data.properties.requestHeaders, \"xhr request's request header is not stored when enableRequestHeaderTracking flag is not set, default is false\");\n                Assert.notEqual(undefined, data.properties.responseHeaders, \"xhr request's reponse header is stored\");\n                Assert.equal(undefined, data.properties.responseHeaders[\"Authorization\"], \"xhr request's reponse header is not ignored when the header is in ignoreHeader\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr respond error data is tracked as part C data when enableAjaxErrorStatusText flag is true\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableAjaxErrorStatusText: true };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(403, {}, \"error data with status code 403\");\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.notEqual(undefined, data.properties.responseText, \"xhr request's reponse error is stored in part C\");\n                Assert.strictEqual(\"Forbidden - error data with status code 403\", data.properties.responseText, \"xhr responseType is \\\"\\\"\");\n\n                // act\n                var xhr2 = new XMLHttpRequest();\n                xhr2.open(\"GET\", \"http://microsoft.com\");\n                xhr2.responseType = \"json\";\n                xhr2.send();\n\n                // Emulate response\n                let responseJSON = '{ \"error\":\"error data with status code 403\" }';\n                (<any>xhr2).respond(403, {}, responseJSON);\n\n                // assert\n                Assert.ok(trackStub.calledTwice, \"track is called\");\n                data = trackStub.args[1][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.notEqual(undefined, data.properties.responseText, \"xhr request's reponse error is stored in part C\");\n                Assert.strictEqual(\"Forbidden - {\\\"error\\\":\\\"error data with status code 403\\\"}\", data.properties.responseText, \"xhr responseType is JSON, response got parsed\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr respond error data is not tracked as part C data when enableAjaxErrorStatusText flag is false\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableAjaxErrorStatusText: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(403, {}, \"error data with status code 403\");\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(undefined, data.properties.responseText, \"xhr request's reponse error is not stored in part C\");\n\n                // act\n                var xhr2 = new XMLHttpRequest();\n                xhr2.open(\"GET\", \"http://microsoft.com\");\n                xhr2.responseType = \"json\";\n                xhr2.send();\n\n                // Emulate response\n                let responseJSON = '{ \"error\":\"error data with status code 403\" }';\n                (<any>xhr2).respond(403, {}, responseJSON);\n\n                // assert\n                Assert.ok(trackStub.calledTwice, \"track is called\");\n                data = trackStub.args[1][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(undefined, data.properties.responseText, \"xhr request's reponse error is not stored in part C\");\n                Assert.equal(undefined, data.properties.aborted, \"The aborted flag should not be set\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr respond error data is not tracked as part C data when enableAjaxErrorStatusText flag is default\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(403, {}, \"error data with status code 403\");\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(undefined, data.properties.responseText, \"xhr request's reponse error is not stored in part C\");\n\n                // act\n                var xhr2 = new XMLHttpRequest();\n                xhr2.open(\"GET\", \"http://microsoft.com\");\n                xhr2.responseType = \"json\";\n                xhr2.send();\n\n                // Emulate response\n                let responseJSON = '{ \"error\":\"error data with status code 403\" }';\n                (<any>xhr2).respond(403, {}, responseJSON);\n\n                // assert\n                Assert.ok(trackStub.calledTwice, \"track is called\");\n                data = trackStub.args[1][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(undefined, data.properties.responseText, \"xhr request's reponse error is not stored in part C\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: xhr abort is tracked as part C data when enableAjaxErrorStatusText flag is true\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableAjaxErrorStatusText: true };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                xhr.abort();\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(0, data.responseCode, \"Check the response code\");\n                Assert.equal(true, data.properties.aborted, \"The aborted flag should be set\");\n                Assert.notEqual(undefined, data.properties.responseText, \"xhr request's reponse error is stored in part C\");\n                Assert.strictEqual(\"\", data.properties.responseText, \"Check the status Text\");\n            }\n        });\n        \n        this.testCase({\n            name: \"Ajax: xhr abort is tracked as part C data when enableAjaxErrorStatusText flag is false\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableAjaxErrorStatusText: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                xhr.abort();\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(0, data.responseCode, \"Check the response code\");\n                Assert.equal(true, data.properties.aborted, \"The aborted flag should be set\");\n                Assert.equal(undefined, data.properties.responseText, \"xhr request's reponse error is stored in part C\");\n            }\n        });\n        \n        this.testCase({\n            name: \"Ajax: xhr respond with status code zero is tracked as part C data when enableAjaxErrorStatusText flag is true\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableAjaxErrorStatusText: true };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                (<any>xhr).respond(0);\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(0, data.responseCode, \"Check the response code\");\n                Assert.equal(undefined, data.properties.aborted, \"The aborted flag should be set\");\n                Assert.notEqual(undefined, data.properties.responseText, \"xhr request's reponse error is stored in part C\");\n                Assert.strictEqual(\"\", data.properties.responseText, \"Check the status Text\");\n            }\n        });\n        \n        this.testCase({\n            name: \"Ajax: xhr respond with status code zero is tracked as part C data when enableAjaxErrorStatusText flag is false\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { instrumentationKey: \"abc\", disableAjaxTracking: false, enableAjaxErrorStatusText: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"http://microsoft.com\");\n                xhr.send();\n\n                (<any>xhr).respond(0);\n\n                // assert\n                Assert.ok(trackStub.calledOnce, \"track is called\");\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(0, data.responseCode, \"Check the response code\");\n                Assert.equal(undefined, data.properties.aborted, \"The aborted flag should be set\");\n                Assert.equal(undefined, data.properties.responseText, \"xhr request's reponse error is stored in part C\");\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: fetch with disabled flag isn't tracked\",\n            timeout: 10000,\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n\n                return this._asyncQueue()\n                    .add(() => {\n                        hookFetch((resolve) => {\n                            AITestClass.orgSetTimeout(function() {\n                                resolve({\n                                    headers: new Headers(),\n                                    ok: true,\n                                    body: null,\n                                    bodyUsed: false,\n                                    redirected: false,\n                                    status: 200,\n                                    statusText: \"Hello\",\n                                    trailer: null,\n                                    type: \"basic\",\n                                    url: \"http://localhost:9001/shared/\"\n                                });\n                            }, 0);\n                        });\n\n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: true}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.notCalled, \"The request was not tracked\");\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n        const endpointUrls = [\n            \"https://browser.aria.pipe.microsoft.com/Collector/3.0/?qsp-true\",\n            \"https://browser.events.data.microsoft.com/OneCollector/1.0\",\n            \"https://self.pipe.aria.microsoft.com/Collector/3.0/\",\n            \"https://blah.events.data.microsoft.com/OneCollector/1.0/\",\n            \"https://self.pipe.aria.int.microsoft.com/Collector/3.0/\",\n            \"https://collector.azure.domain/Collector/3.0/\",\n            \"https://collector.azure.microsoft.domain/Collector/3.0/\",\n            \"https://collector.azure.microsoft.domain/OneCollector/1.0/\",\n            \"https://self.pipe.aria.int.microsoft.com/Collector/3.0/\",\n            \"https://collector.azure.cn/OneCollector/1.0/\"\n        ];\n\n        arrForEach(endpointUrls, (endpointUrl) => {\n\n            this.testCase({\n                name: \"Fetch: internal url fetch isn't tracked [\" + endpointUrl + \"]\",\n                timeout: 10000,\n                test: () => {\n                    hookFetch((resolve) => {\n                        AITestClass.orgSetTimeout(function() {\n                            resolve({\n                                headers: new Headers(),\n                                ok: true,\n                                body: null,\n                                bodyUsed: false,\n                                redirected: false,\n                                status: 200,\n                                statusText: \"Hello\",\n                                trailer: null,\n                                type: \"basic\",\n                                url: endpointUrl\n                            });\n                        }, 0);\n                    });\n\n                    this._ajax = new AjaxMonitor();\n                    let appInsightsCore = new AppInsightsCore();\n                    let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                    appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                    let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\");\n\n                    return this._asyncQueue()\n                        .add(() => {\n                            // Act\n                            Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                            return fetch(endpointUrl, {method: \"post\" }).then(() => {\n                                // Assert\n                                Assert.ok(fetchSpy.notCalled, \"The request was not tracked\");\n                            }, () => {\n                                Assert.ok(false, \"fetch failed!\");\n                            });\n                        })\n                }\n            });\n\n\n            this.testCase({\n                name: \"Fetch: internal url using fetch is tracked [\" + endpointUrl + \"]\",\n                timeout: 10000,\n                test: () => {\n                    hookFetch((resolve) => {\n                        AITestClass.orgSetTimeout(function() {\n                            resolve({\n                                headers: new Headers(),\n                                ok: true,\n                                body: null,\n                                bodyUsed: false,\n                                redirected: false,\n                                status: 200,\n                                statusText: \"Hello\",\n                                trailer: null,\n                                type: \"basic\",\n                                url: endpointUrl\n                            });\n                        }, 0);\n                    });\n\n                    this._ajax = new AjaxMonitor();\n                    let appInsightsCore = new AppInsightsCore();\n                    let coreConfig = {\n                        instrumentationKey: \"\",\n                        disableFetchTracking: false,\n                        addIntEndpoints: false\n                    };\n                    appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                    let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                    \n                    return this._asyncQueue()\n                        .add(() => {\n                            // Act\n                            Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                            return fetch(endpointUrl, {method: \"post\" }).then(() => {\n                                // Assert\n                                Assert.ok(fetchSpy.called, \"The request was tracked\");\n                            }, () => {\n                                Assert.ok(false, \"fetch failed!\");\n                            });\n                        })\n                }\n            });\n        });\n\n        this.testCase({\n            name: \"Fetch: fetch with disabled flag isn't tracked and any followup request to the same URL event without the disabled flag are also not tracked\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: true}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.notCalled, \"The initial request was not tracked\");\n\n                            return fetch(\"http://localhost:9001/shared/\", {method: \"post\" }).then(() => {\n                                // Assert\n                                Assert.ok(fetchSpy.notCalled, \"The follow up request should also not have been tracked\");\n                            }, () => {\n                                Assert.ok(false, \"fetch failed!\");\n                            });\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: fetch with disabled flag false and with exclude request regex pattern isn't tracked and any followup request to the same URL event without the disabled flag are also not tracked\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                const ExcludeRequestRegex = [\"localhost:9001\"];\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false, excludeRequestFromAutoTrackingPatterns: ExcludeRequestRegex };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                // Flush any initial requests made during initialization\n                appInsightsCore.flush(false);\n\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\"}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.notCalled, \"The initial request was not tracked\");\n\n                            return fetch(\"http://localhost:9001/shared/\", {method: \"post\" }).then(() => {\n                                // Assert\n                                Assert.ok(fetchSpy.notCalled, \"The follow up request should also not have been tracked\");\n                            }, () => {\n                                Assert.ok(false, \"fetch failed!\");\n                            });\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: add context into custom dimension with call back configuration on AI initialization.\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"\",\n                    disableFetchTracking: false,\n                    addRequestContext: (requestContext: IRequestContext) => {\n                        return {\n                            test: \"Fetch context\",\n                            fetchRequestUrl: requestContext.request,\n                            fetchResponseType: (requestContext.response as Response).type\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // assert\n                            Assert.ok(fetchSpy.calledOnce, \"track is called\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.equal(\"Fetch context\", data.properties.test, \"Fetch request's request context is added when customer configures addRequestContext.\");\n                            Assert.equal(\"http://localhost:9001/shared/\", data.properties.fetchRequestUrl, \"Fetch request is captured.\");\n                            Assert.equal(\"basic\", data.properties.fetchResponseType, \"Fetch response is captured.\");\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: fetch gets instrumented\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.ok(throwSpy.notCalled, \"Make sure we didn't fail internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\")\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n        \n        this.testCase({\n            name: \"Fetch: Respond with status 0 and no status text\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 0,\n                            statusText: \"Blocked\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                this._context.dependencyFields = dependencyFields;\n                this._context.fetchSpy = fetchSpy;\n                this._context.throwSpy = throwSpy;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        let fetchSpy = this._context.fetchSpy;\n                        let throwSpy = this._context.throwSpy;\n                        let dependencyFields = this._context.dependencyFields;\n                        \n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.ok(throwSpy.notCalled, \"Make sure we didn't fail internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                            Assert.equal(0, dependencyFields[0].dependency.responseCode, \"Check the response code\");\n                            Assert.equal(undefined, dependencyFields[0].dependency.properties.responseText);\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: Respond with status 0 and no status text\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 0,\n                            statusText: \"Blocked\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false, enableAjaxErrorStatusText: true };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                this._context.dependencyFields = dependencyFields;\n                this._context.fetchSpy = fetchSpy;\n                this._context.throwSpy = throwSpy;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        let fetchSpy = this._context.fetchSpy;\n                        let throwSpy = this._context.throwSpy;\n                        let dependencyFields = this._context.dependencyFields;\n                        \n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.ok(throwSpy.notCalled, \"Make sure we didn't fail internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                            Assert.equal(0, dependencyFields[0].dependency.responseCode, \"Check the response code\");\n                            Assert.equal(\"Blocked\", dependencyFields[0].dependency!.properties.responseText);\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n\n        this.testCase({\n            name: \"Fetch: fetch addDependencyInitializer adding context\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                let initializerCalled = false;\n                this._ajax = new AjaxMonitor();\n                this._ajax.addDependencyInitializer((details) => {\n                    let props = details.item.properties = details.item.properties || {};\n                    props.initializer = { called: true };\n                    initializerCalled = true;\n                });\n\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                this._context.dependencyFields = dependencyFields;\n                this._context.fetchSpy = fetchSpy;\n                this._context.throwSpy = throwSpy;\n                this._context.initializerCalled = () => initializerCalled;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.ok(throwSpy.notCalled, \"Make sure we didn't fail internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                            Assert.ok(initializerCalled, \"Initializer was called\");\n                            Assert.equal(true, data.properties.initializer.called, \"The value set in the initializer was added\");\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: fetch addDependencyInitializer drops the event\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                let initializerCalled = false;\n                this._ajax = new AjaxMonitor();\n                this._ajax.addDependencyInitializer((details) => {\n                    initializerCalled = true;\n                    return false;\n                });\n\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        \n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"http://localhost:9001/shared/\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(initializerCalled, \"Initializer was not called\");\n                            Assert.ok(fetchSpy.notCalled, \"track was not called\");\n                            \n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                            \n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: instrumentation handles invalid / missing request or url\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n                let traceCtx = appInsightsCore.getTraceCtx();\n\n                let expectedsysProperties = {\n                    trace: {\n                        traceID: traceCtx!.getTraceId(),\n                        parentID: traceCtx!.getSpanId()\n                    } as any\n                };\n\n                if (!isNullOrUndefined(traceCtx!.getTraceFlags())) {\n                    expectedsysProperties.trace.traceFlags = traceCtx!.getTraceFlags();\n                }\n\n                this._context.dependencyFields = dependencyFields;\n                this._context.fetchSpy = fetchSpy;\n                this._context.throwSpy = throwSpy;\n\n                return this._asyncQueue()\n                    .add(() => {\n                \n                        // Act\n                        \n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(null, {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.equal(false, throwSpy.called, \"We should not have failed internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                            Assert.deepEqual(expectedsysProperties, dependencyFields[0].sysProperties, \"no system properties\");\n\n                            return fetch(undefined, null).then(() => {\n                                // Assert\n                                Assert.ok(fetchSpy.calledTwice, \"createFetchRecord called once after using fetch\");\n                                Assert.equal(false, throwSpy.called, \"We should still not have failed internally\");\n                                Assert.equal(2, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                                Assert.ok(dependencyFields[1].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                                Assert.deepEqual(expectedsysProperties, dependencyFields[1].sysProperties, \"no system properties\");\n\n                            }, () => {\n                                Assert.ok(false, \"fetch failed!\");\n                                \n                            });\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                            \n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: instrumentation handles invalid / missing request or url with traceId\",\n            timeout: 10000,\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n                let traceCtx = appInsightsCore.getTraceCtx();\n                let expectedTraceId = generateW3CId();\n                let expectedSpanId = generateW3CId().substring(0, 16);\n                traceCtx!.setTraceId(expectedTraceId);\n                traceCtx!.setSpanId(expectedSpanId);\n\n                this._context.dependencyFields = dependencyFields;\n                this._context.fetchSpy = fetchSpy;\n                this._context.throwSpy = throwSpy;\n                this._context.expectedTraceId = expectedTraceId;\n                this._context.expectedSpanId = expectedSpanId;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(null, {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.equal(false, throwSpy.called, \"We should not have failed internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                            Assert.equal(expectedTraceId, dependencyFields[0].sysProperties!.trace.traceID, \"system properties traceId\");\n                            Assert.equal(expectedSpanId, dependencyFields[0].sysProperties!.trace.parentID, \"system properties spanId\");\n\n                            return fetch(undefined, null).then(() => {\n                                // Assert\n                                Assert.ok(fetchSpy.calledTwice, \"createFetchRecord called once after using fetch\");\n                                Assert.equal(false, throwSpy.called, \"We should still not have failed internally\");\n                                Assert.equal(2, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                                Assert.ok(dependencyFields[1].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                                Assert.equal(expectedTraceId, dependencyFields[1].sysProperties!.trace.traceID, \"system properties traceId\");\n                                Assert.equal(expectedSpanId, dependencyFields[1].sysProperties!.trace.parentID, \"system properties spanId\");\n                                \n                            }, () => {\n                                Assert.ok(false, \"fetch failed!\");\n                                \n                            });\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                            \n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: instrumentation handles empty string\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n                let traceCtx = appInsightsCore.getTraceCtx();\n\n                let expectedsysProperties = {\n                    trace: {\n                        traceID: traceCtx.getTraceId(),\n                        parentID: traceCtx.getSpanId()\n                    } as any\n                };\n\n                if (!isNullOrUndefined(traceCtx.getTraceFlags())) {\n                    expectedsysProperties.trace.traceFlags = traceCtx.getTraceFlags();\n                }\n\n                this._context.dependencyFields = dependencyFields;\n                this._context.fetchSpy = fetchSpy;\n                this._context.throwSpy = throwSpy;\n                this._context.fetchCalls = fetchCalls;\n\n                return this._asyncQueue()\n                    .add(() => {\n                \n                        // Act\n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.equal(false, throwSpy.called, \"We should not have failed internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                            Assert.deepEqual(expectedsysProperties, dependencyFields[0].sysProperties, \"no system properties\");\n                            Assert.equal(window.location.href.split(\"#\")[0], dependencyFields[0].dependency.target, \"Target is captured.\");\n\n                            // Assert that the HTTP method was preserved\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            Assert.equal(\"post\", fetchCalls[0].init?.method, \"Has post method\");\n\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                            \n                        });\n                    })\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: instrumentation handles empty string with traceId\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let dependencyFields = hookTrackDependencyInternal(this._ajax);\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"\", disableFetchTracking: false };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                let throwSpy = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n                let traceCtx = appInsightsCore.getTraceCtx();\n                let expectedTraceId = generateW3CId();\n                let expectedSpanId = generateW3CId().substring(0, 16);\n                traceCtx!.setTraceId(expectedTraceId);\n                traceCtx!.setSpanId(expectedSpanId);\n\n                this._context.dependencyFields = dependencyFields;\n                this._context.fetchSpy = fetchSpy;\n                this._context.throwSpy = throwSpy;\n                this._context.expectedTraceId = expectedTraceId;\n                this._context.expectedSpanId = expectedSpanId;\n                this._context.fetchCalls = fetchCalls;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        \n                        Assert.ok(fetchSpy.notCalled, \"No fetch called yet\");\n                        return fetch(\"\", {method: \"post\", [DisabledPropertyName]: false}).then(() => {\n                            // Assert\n                            Assert.ok(fetchSpy.calledOnce, \"createFetchRecord called once after using fetch\");\n                            let data = fetchSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            Assert.equal(false, throwSpy.called, \"We should not have failed internally\");\n                            Assert.equal(1, dependencyFields.length, \"trackDependencyDataInternal was called\");\n                            Assert.ok(dependencyFields[0].dependency.startTime, \"startTime was specified before trackDependencyDataInternal was called\");\n                            Assert.equal(expectedTraceId, dependencyFields[0].sysProperties!.trace.traceID, \"system properties traceId\");\n                            Assert.equal(expectedSpanId, dependencyFields[0].sysProperties!.trace.parentID, \"system properties spanId\");\n                            Assert.equal(window.location.href.split(\"#\")[0], dependencyFields[0].dependency.target, \"Target is captured.\");\n\n                            // Assert that the HTTP method was preserved\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            Assert.equal(\"post\", fetchCalls[0].init?.method, \"Has post method\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.notEqual(undefined, headers, \"has headers\");\n                            Assert.equal(true, headers.has(RequestHeaders.requestIdHeader), \"AI header should be present\"); // AI\n                            Assert.equal(true, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n            }\n        });\n\n\n        this.testCase({\n            name: \"Fetch: fetch keeps custom headers\",\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                try {\n                    this._ajax = new AjaxMonitor();\n                    let appInsightsCore = new AppInsightsCore();\n                    let coreConfig = {\n                        instrumentationKey: \"\",\n                        disableFetchTracking: false,\n                        disableAjaxTracking: true\n                    };\n                    appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                    let fetchSpy = this.sandbox.spy(window, \"fetch\");\n\n                    // Setup\n                    let headers = new Headers();\n                    headers.append('My-Header', 'Header field');\n                    let init = {\n                        method: 'get',\n                        headers: headers\n                    };\n                    const url = 'http://localhost:9001/shared/';\n\n                    let headerSpy = this.sandbox.spy(this._ajax, \"includeCorrelationHeaders\");\n\n                    // Act\n                    Assert.ok(fetchSpy.notCalled);\n                    fetch(url, init);\n\n                    // Assert\n                    Assert.ok(fetchSpy.calledOnce);\n                    Assert.ok(headerSpy.calledOnce);\n                    Assert.deepEqual(init, headerSpy.returnValue || headerSpy.returnValues[0]);\n                } catch (e) {\n                    console && console.warn(\"Exception: \" + e);\n                    Assert.ok(false, e);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: fetch keeps custom headers when correlation headers are discarded by dependencyListeners\",\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                \n                this._ajax = new AjaxMonitor();\n                this._ajax.addDependencyListener((details: IDependencyListenerDetails) => {\n                    return false;\n                });\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: true\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(window, \"fetch\");\n\n                // Setup\n                let headers = new Headers();\n                headers.append('My-Header', 'Header field');\n                let init = {\n                    method: 'get',\n                    headers: headers\n                };\n                const url = 'http://localhost:9001/shared/';\n\n                let headerSpy = this.sandbox.spy(this._ajax, \"includeCorrelationHeaders\");\n\n                // Act\n                Assert.ok(fetchSpy.notCalled);\n                fetch(url, init);\n\n                // Assert\n                Assert.ok(fetchSpy.calledOnce);\n                Assert.ok(headerSpy.calledOnce);\n                Assert.deepEqual(init, headerSpy.returnValue || headerSpy.returnValues[0]);\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: fetch keeps custom headers when correlation headers are discarded by dependencyListeners\",\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                \n                this._ajax = new AjaxMonitor();\n                this._ajax.addDependencyListener((details: IDependencyListenerDetails) => {\n                    return false;\n                });\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: true\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let fetchSpy = this.sandbox.spy(window, \"fetch\");\n\n                // Setup\n                let headers = new Headers();\n                headers.append('My-Header', 'Header field');\n                let init = {\n                    method: 'get',\n                    headers: headers\n                };\n                const url = 'http://localhost:9001/shared/';\n\n                let headerSpy = this.sandbox.spy(this._ajax, \"includeCorrelationHeaders\");\n\n                // Act\n                Assert.ok(fetchSpy.notCalled);\n                fetch(url, init);\n\n                // Assert\n                Assert.ok(fetchSpy.calledOnce);\n                Assert.ok(headerSpy.calledOnce);\n                Assert.deepEqual(init, headerSpy.returnValue || headerSpy.returnValues[0]);\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: should create and pass a traceparent header if ai and w3c is enabled with custom headers\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                return this._asyncQueue()\n                    .add(() => {\n\n                        // Setup\n                        \n                        let headers = new Headers();\n                        headers.append('My-Header', 'Header field');\n                        let init = {\n                            method: 'get',\n                            headers: headers\n                        };\n                        const url = 'http://localhost:9001/shared/';\n\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        return fetch(url, init).then(() => {\n                            // Assert\n                            Assert.ok(trackSpy.called, \"The request was not tracked\");\n                            // Assert that both headers are sent\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.notEqual(undefined, headers, \"has headers\");\n                            Assert.equal(true, headers.has(\"My-Header\"), \"My-Header should be present\");\n                            Assert.equal(true, headers.has(RequestHeaders.requestIdHeader), \"AI header shoud be present\"); // AI\n                            Assert.equal(true, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        if (trackSpy.called) {\n                            Assert.ok(trackSpy.calledOnce, \"track is called\");\n                            let data = trackSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fatch type\");\n                            var id = data.id;\n                            Assert.equal(\"|\", id[0]);\n                            Assert.equal(\".\", id[id.length - 1]);\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        })\n\n        this.testCase({\n            name: \"Fetch: should create and pass a traceparent header if ai and w3c is enabled with no init param\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n                    \n                const url = 'http://localhost:9001/shared/';\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        return fetch(url).then(() => {\n                            // Assert\n                            Assert.ok(trackSpy.called, \"The request was not tracked\");\n                            // Assert that both headers are sent\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.notEqual(undefined, headers, \"has headers\");\n                            Assert.equal(true, headers.has(RequestHeaders.requestIdHeader), \"AI header shoud be present\"); // AI\n                            Assert.equal(true, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        if (trackSpy.called) {\n                            Assert.ok(trackSpy.calledOnce, \"track is called\");\n                            let data = trackSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fatch type\");\n                            var id = data.id;\n                            Assert.equal(\"|\", id[0]);\n                            Assert.equal(\".\", id[id.length - 1]);\n                            return true;\n                        }\n\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: should create and pass a traceparent header if w3c only is enabled with custom headers\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Setup\n                let headers = new Headers();\n                headers.append('My-Header', 'Header field');\n                let init = {\n                    method: 'get',\n                    headers: headers\n                };\n                const url = 'http://localhost:9001/shared/';\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            // Assert\n                            Assert.ok(trackSpy.called, \"The request was not tracked\");\n                            // Assert that both headers are sent\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.notEqual(undefined, headers, \"has headers\");\n                            Assert.equal(true, headers.has(\"My-Header\"), \"My-Header should be present\");\n                            Assert.equal(false, headers.has(RequestHeaders.requestIdHeader), \"AI header shoud be present\"); // AI\n                            Assert.equal(true, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fatch type\");\n                            var id = data.id;\n                            Assert.equal(\"|\", id[0]);\n                            Assert.equal(\".\", id[id.length - 1]);\n                            return true;\n                        }\n\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: should create and pass a traceparent header if w3c only is enabled with no init param\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n                this._context[\"fetchCalls\"] = fetchCalls;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Setup\n                const url = 'http://localhost:9001/shared/';\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url).then(() => {\n                            // Assert\n                            Assert.ok(trackSpy.called, \"The request was not tracked\");\n                            // Assert that both headers are sent\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.notEqual(undefined, headers, \"has headers\");\n                            Assert.equal(false, headers.has(RequestHeaders.requestIdHeader), \"AI header shoud be present\"); // AI\n                            Assert.equal(true, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        if (trackSpy.called) {\n                            Assert.ok(trackSpy.calledOnce, \"track is called\");\n                            let data = trackSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fatch type\");\n                            var id = data.id;\n                            Assert.equal(\"|\", id[0]);\n                            Assert.equal(\".\", id[id.length - 1]);\n                            return true;\n                        }\n\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        })\n\n        this.testCase({\n            name: \"Fetch: should create and pass a request header if AI only is enabled with custom headers\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n                this._context[\"fetchCalls\"] = fetchCalls;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Setup\n                let headers = new Headers();\n                headers.append('My-Header', 'Header field');\n                let init = {\n                    method: 'get',\n                    headers: headers\n                };\n                const url = 'http://localhost:9001/shared/';\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            // Assert\n                            Assert.ok(trackSpy.called, \"The request was not tracked\");\n                            // Assert that both headers are sent\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.notEqual(undefined, headers, \"has headers\");\n                            Assert.equal(true, headers.has(\"My-Header\"), \"My-Header should be present\");\n                            Assert.equal(true, headers.has(RequestHeaders.requestIdHeader), \"AI header shoud be present\"); // AI\n                            Assert.equal(false, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                            \n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        if (trackSpy.called) {\n                            Assert.ok(trackSpy.calledOnce, \"track is called\");\n                            let data = trackSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fatch type\");\n                            var id = data.id;\n                            Assert.equal(\"|\", id[0]);\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        })\n\n        this.testCase({\n            name: \"Fetch: should create and pass a request header if AI only is enabled with no init param\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n                this._context[\"fetchCalls\"] = fetchCalls;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n                // Setup\n                const url = 'http://localhost:9001/shared/';\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url).then(() => {\n                            // Assert\n                            Assert.ok(trackSpy.called, \"The request was not tracked\");\n                            // Assert that both headers are sent\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.notEqual(undefined, headers, \"has headers\");\n                            Assert.equal(true, headers.has(RequestHeaders.requestIdHeader), \"AI header shoud be present\"); // AI\n                            Assert.equal(false, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        if (trackSpy.called) {\n                            Assert.ok(trackSpy.calledOnce, \"track is called\");\n                            let data = trackSpy.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fatch type\");\n                            var id = data.id;\n                            Assert.equal(\"|\", id[0]);\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        })\n\n        this.testCase({\n            name: \"Fetch: should add request headers to all valid argument variants\",\n            timeout: 10000,\n            useFakeTimers: true,\n            test: () => {\n                this._context[\"fetchCalls\"] = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    enableRequestHeaderTracking: true,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Setup\n                let headers = new Headers();\n                headers.append('My-Header', 'Header field');\n                headers.append(\"Authorization\",\"Authorization\");\n                let init = {\n                    method: 'get',\n                    headers: headers\n                };\n                const url = 'http://localhost:9001/shared/';\n\n                return this._asyncQueue()\n                    .add(() => {\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url);\n                        fetch(url, {});\n                        fetch(url, { headers: {} });\n                        fetch(url, { headers: new Headers() });\n                        fetch(url, { headers });\n                        fetch(url, init);\n                        fetch(new Request(url));\n                        fetch(new Request(url, {}));\n                        fetch(new Request(url, { headers: {} }));\n                        fetch(new Request(url, { headers: new Headers() }));\n                        fetch(new Request(url, { headers }));\n                        fetch(new Request(url, init));\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        let fetchCalls = this._context[\"fetchCalls\"] as IFetchArgs[];\n                        Assert.ok(true, \"Track: \" + trackStub.args.length + \" Fetch Calls: \" + fetchCalls.length);\n                        if (trackStub.called && trackStub.args.length === 12 && fetchCalls.length === 12) {\n                            for (let lp = 0; lp < trackStub.args.length; lp++) {\n                                let evtData = trackStub.args[lp][0];\n                                this._checkFetchTraceId(evtData, \"Fetch \" + lp);\n                                let properties = evtData.baseData.properties || {};\n                                let trackHeaders = properties.requestHeaders || {};\n\n                                Assert.notEqual(undefined, fetchCalls[lp].init, \"Has init param\");\n                                let headers:Headers = fetchCalls[lp].init.headers as Headers;\n                                Assert.notEqual(undefined, headers, \"has headers\");\n                                switch (lp) {\n                                case 4:\n                                case 5:\n                                case 10:\n                                case 11:\n                                    // All headers should be added to the init (2nd param) as this overrides\n                                    // any headers on any request object\n                                    Assert.equal(true, headers.has(\"My-Header\"), \"My-Header should be present\");\n                                    Assert.equal(true, headers.has(\"Authorization\"), \"Authorization should be present\");\n                                    Assert.equal(\"Header field\", trackHeaders[\"my-header\"], \"my-header present in outbound event\");\n                                    Assert.equal(undefined, trackHeaders[\"Authorization\"],\"Authorization header should be ignored\")\n                                    break;\n                                }\n\n                                Assert.equal(true, headers.has(RequestHeaders.requestContextHeader), \"requestContext header shoud be present\");\n                                Assert.equal(true, headers.has(RequestHeaders.requestIdHeader), \"AI header shoud be present\"); // AI\n                                Assert.equal(true, headers.has(RequestHeaders.traceParentHeader), \"W3c header should be present\"); // W3C\n                                Assert.equal(false, headers.has(RequestHeaders.traceStateHeader), \"traceState should not be present in outbound event\");\n\n                                Assert.notEqual(undefined, trackHeaders[RequestHeaders.requestIdHeader], \"RequestId present in outbound event\");\n                                Assert.notEqual(undefined, trackHeaders[RequestHeaders.requestContextHeader], \"RequestContext present in outbound event\");\n                                Assert.notEqual(undefined, trackHeaders[RequestHeaders.traceParentHeader], \"traceParent present in outbound event\");\n                                Assert.equal(undefined, trackHeaders[RequestHeaders.traceStateHeader], \"traceState should not be present in outbound event\");\n                            }\n                            return true;\n                        }\n                        this.clock.tick(1000);\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        })\n\n        this.testCase({\n            name: \"Fetch: should create unique spanId for traceparent header without modifying current trace context\",\n            test: () => {\n                // Setup fetch hook to capture headers\n                let fetchCalls: any[] = [];\n                let hookFetch = (resolve) => {\n                    fetchCalls.push = function() {\n                        let result = Array.prototype.push.apply(this, arguments);\n                        AITestClass.orgSetTimeout(function() {\n                            resolve({\n                                headers: new Headers(),\n                                ok: true,\n                                body: \"ab\",\n                                bodyUsed: false,\n                                redirected: false,\n                                status: 200,\n                                statusText: \"Hello\",\n                                trailer: null,\n                                type: \"basic\",\n                                url: \"http://localhost:9001/shared/\",\n                                clone: () => null,\n                                arrayBuffer: () => Promise.resolve(new ArrayBuffer(0)),\n                                blob: () => Promise.resolve(new Blob()),\n                                bytes: () => Promise.resolve(new Uint8Array()),\n                                formData: () => Promise.resolve(new FormData()),\n                                json: () => Promise.resolve({}),\n                                text: () => Promise.resolve(\"ab\")\n                            } as unknown as Response);\n                        }, 50);\n                        return result;\n                    };\n                    return fetchCalls;\n                };\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig: IConfiguration & IConfig = { \n                    instrumentationKey: \"instrumentationKey\", \n                    disableFetchTracking: false,\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C,\n                            enableRequestHeaderTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                // Use test hook to simulate the correct url location host to enable correlation headers\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Set up trace context with known values\n                let traceCtx = appInsightsCore.getTraceCtx();\n                let originalTraceId = generateW3CId();\n                let originalSpanId = generateW3CId().substring(0, 16);\n                traceCtx!.setTraceId(originalTraceId);\n                traceCtx!.setSpanId(originalSpanId);\n\n                // Verify initial state\n                Assert.equal(originalTraceId, traceCtx!.getTraceId(), \"Initial traceId should be set\");\n                Assert.equal(originalSpanId, traceCtx!.getSpanId(), \"Initial spanId should be set\");\n\n                // Mock fetch function to capture headers\n                let originalFetch = window.fetch;\n                let capturedHeaders: any[] = [];\n                \n                window.fetch = function(input: any, init?: any) {\n                    capturedHeaders.push({\n                        input: input,\n                        init: init,\n                        headers: init ? new Headers(init.headers || {}) : new Headers()\n                    });\n                    return Promise.resolve({\n                        ok: true,\n                        status: 200,\n                        headers: new Headers(),\n                        json: () => Promise.resolve({}),\n                        text: () => Promise.resolve(\"response\")\n                    } as Response);\n                };\n\n                try {\n                    // Act - make first fetch request (this should trigger header addition)\n                    fetch(\"http://localhost:9001/shared/\", {\n                        method: \"GET\",\n                        headers: { \"Custom-Header\": \"Value1\" }\n                    });\n\n                    // Act - make second fetch request  \n                    fetch(\"https://localhost:9001/api/test\", {\n                        method: \"POST\", \n                        headers: { \"Custom-Header\": \"Value2\" }\n                    });\n\n                    // Verify trace context is unchanged\n                    Assert.equal(originalTraceId, traceCtx!.getTraceId(), \"TraceId should remain unchanged\");\n                    Assert.equal(originalSpanId, traceCtx!.getSpanId(), \"SpanId should remain unchanged\");\n\n                    // We should have 2 captured fetch calls\n                    Assert.equal(2, capturedHeaders.length, \"Should have captured 2 fetch calls\");\n\n                    if (capturedHeaders.length >= 2) {\n                        let firstHeaders = capturedHeaders[0].headers;\n                        let secondHeaders = capturedHeaders[1].headers;\n\n                        // Both should have traceparent headers if correlation is enabled\n                        if (firstHeaders.has(RequestHeaders.traceParentHeader) && secondHeaders.has(RequestHeaders.traceParentHeader)) {\n                            let firstTraceParent = firstHeaders.get(RequestHeaders.traceParentHeader);\n                            let secondTraceParent = secondHeaders.get(RequestHeaders.traceParentHeader);\n                            \n                            let firstParts = firstTraceParent.split('-');\n                            let secondParts = secondTraceParent.split('-');\n\n                            if (firstParts.length === 4 && secondParts.length === 4) {\n                                let firstSpanId = firstParts[2];\n                                let secondSpanId = secondParts[2];\n\n                                // Validate spanId isolation\n                                Assert.notEqual(originalSpanId, firstSpanId, \"First fetch spanId should differ from context\");\n                                Assert.notEqual(originalSpanId, secondSpanId, \"Second fetch spanId should differ from context\");\n                                Assert.notEqual(firstSpanId, secondSpanId, \"Each fetch should have unique spanId\");\n                                \n                                // Validate traceId consistency\n                                Assert.equal(originalTraceId, firstParts[1], \"First fetch should use same traceId\");\n                                Assert.equal(originalTraceId, secondParts[1], \"Second fetch should use same traceId\");\n                            }\n                        }\n                    }\n\n                } finally {\n                    // Restore original fetch\n                    window.fetch = originalFetch;\n                }\n\n                // Final verification\n                Assert.equal(originalTraceId, traceCtx!.getTraceId(), \"TraceId should remain unchanged at end\");\n                Assert.equal(originalSpanId, traceCtx!.getSpanId(), \"SpanId should remain unchanged at end\");\n            }\n        })\n\n        this.testCase({\n            name: \"Ajax: successful request, ajax monitor doesn't change payload\",\n            test: () => {\n                var callback = this.sandbox.spy();\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.onload = callback;\n                xhr.open(\"GET\", \"example.com/bla\");\n                xhr.send();\n\n\n                // Emulate response\n                (<any>xhr).respond(200, { \"Content-Type\": \"application/json\" }, \"bla\");\n                //Assert.ok((<any>ajaxMonitor)._trackAjaxAttempts === 1, \"TrackAjax is called\");\n\n                // Assert\n                var result = callback.args[0][0].target;\n                Assert.ok(callback.called, \"Ajax callback is called\");\n                Assert.equal(\"bla\", result.responseText, \"Expected result match\");\n                Assert.equal(200, result.status, \"Expected 200 response code\");\n                Assert.equal(4, xhr.readyState, \"Expected readyState is 4 after request is finished\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: custom onreadystatechange gets called\",\n            useFakeServer: true,\n            useFakeTimers: true,\n            test: () => {\n                var onreadystatechangeSpy = this.sandbox.spy();\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.onreadystatechange = onreadystatechangeSpy;\n                xhr.open(\"GET\", \"example.com/bla\");\n                xhr.send();\n\n                Assert.ok(trackStub.notCalled, \"track should not be called yet\");\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n\n                // Assert\n                Assert.ok(trackStub.called, \"TrackAjax is called\");\n                Assert.ok(onreadystatechangeSpy.callCount >= 4, \"custom onreadystatechange should be called\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: 200 means success\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"example.com/bla\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {}, \"\");\n\n                // Assert\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(true, data.success, \"TrackAjax should receive true as a 'success' argument\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: non 200 means failure\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"example.com/bla\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(404, {}, \"\");\n\n                // Assert\n                let data = trackStub.args[0][0].baseData;\n                Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                Assert.equal(false, data.success, \"TrackAjax should receive false as a 'success' argument\");\n            }\n        });\n\n        [200, 201, 202, 203, 204, 301, 302, 303, 304].forEach((responseCode) => {\n            this.testCase({\n                name: \"Ajax: test success http response code: \" + responseCode,\n                test: () => {\n                    this.testAjaxSuccess(responseCode, true);\n                }\n            })\n        });\n\n        [400, 401, 402, 403, 404, 500, 501].forEach((responseCode) => {\n            this.testCase({\n                name: \"Ajax: test failure http response code: \" + responseCode,\n                test: () => {\n                    this.testAjaxSuccess(responseCode, false);\n                }\n            })\n        });\n\n        this.testCase({\n            name: \"Ajax: overriding ready state change handlers in all possible ways\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n                var cb1 = this.sandbox.spy();\n                var cb2 = this.sandbox.spy();\n                var cb3 = this.sandbox.spy();\n                var cb4 = this.sandbox.spy();\n                var cb5 = this.sandbox.spy();\n                var cb6 = this.sandbox.spy();\n                var cb7 = this.sandbox.spy();\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.addEventListener(\"readystatechange\", cb1);\n                xhr.addEventListener(\"readystatechange\", cb2);\n                xhr.open(\"GET\", \"example.com/bla\");\n                xhr.onreadystatechange = cb3;\n                xhr.addEventListener(\"readystatechange\", cb4);\n                xhr.addEventListener(\"readystatechange\", cb5);\n                xhr.send();\n                xhr.addEventListener(\"readystatechange\", cb6);\n                xhr.addEventListener(\"readystatechange\", cb7);\n\n                Assert.ok(!trackStub.called, \"TrackAjax should not be called yet\");\n\n                // Emulate response\n                (<any>xhr).respond(404, {}, \"\");\n\n                // Assert\n                Assert.ok(trackStub.calledOnce, \"TrackAjax should be called\");\n                Assert.ok(cb1.called, \"callback 1 should be called\");\n                Assert.ok(cb2.called, \"callback 2 should be called\");\n                Assert.ok(cb3.called, \"callback 3 should be called\");\n                Assert.ok(cb4.called, \"callback 4 should be called\");\n                Assert.ok(cb5.called, \"callback 5 should be called\");\n                Assert.ok(cb6.called, \"callback 6 should be called\");\n                Assert.ok(cb7.called, \"callback 7 should be called\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: test ajax duration is calculated correctly\",\n            test: () => {\n                var initialPerformance = window.performance;\n                setBypassLazyCache(true);\n                this._ajax = new AjaxMonitor();\n                try {\n                    // Mocking window performance (sinon doesn't have it).\n                    // tick() is similar to sinon's clock.tick()\n                    (<any>window).performance = <any>{\n                        current: 0,\n\n                        now: function () {\n                            return this.current;\n                        },\n\n                        tick: function (ms: number) {\n                            this.current += ms;\n                        },\n\n                        timing: initialPerformance.timing\n                    };\n\n                    let appInsightsCore = new AppInsightsCore();\n                    let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                    appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                    var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n                // tick to set the initial time be non zero\n                    (<any>window.performance).tick(23);\n\n                    // Act\n                    var xhr = new XMLHttpRequest();\n                    var clock = this.clock;\n                    var expectedResponseDuration = 50;\n                    xhr.onreadystatechange = () => {\n                        if (xhr.readyState == 3) {\n                            (<any>window.performance).tick(expectedResponseDuration);\n                        }\n                    }\n                    xhr.open(\"GET\", \"example.com/bla\");\n                    xhr.send();\n                    // Emulate response\n                    (<any>xhr).respond(404, {}, \"\");\n\n                    // Assert\n                    Assert.ok(trackStub.calledOnce, \"TrackAjax should be called\");\n                    let data = trackStub.args[0][0].baseData;\n                    Assert.equal(\"Ajax\", data.type, \"It should be an XHR request\");\n                    Assert.ok(data.startTime);\n                    Assert.equal(expectedResponseDuration, data.duration, \"Ajax duration should match expected duration\");\n                } finally {\n                    (<any>window.performance) = initialPerformance;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: 2nd invocation of xhr.send doesn't cause send wrapper to execute 2nd time\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var spy = this.sandbox.spy(this._ajax, \"includeCorrelationHeaders\");\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"example.com/bla\");\n                xhr.send();\n\n                try {\n                    xhr.send();\n                } catch (e) { }\n\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n\n                // Assert\n                Assert.ok(spy.calledOnce, \"sendPrefixInstrumentor/includeCorrelationHeaders should be called only once\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: 2nd invocation of xhr.send doesn't cause send wrapper to execute 2nd time even if after response\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var spy = this.sandbox.spy(this._ajax, \"includeCorrelationHeaders\");\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\")\n                this._context[\"trackStub\"] = trackSpy;\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"example.com/bla\");\n                xhr.send();\n\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n\n                try {\n                    xhr.send();\n                } catch (e) { }\n\n                // Assert\n                Assert.ok(spy.calledOnce, \"sendPrefixInstrumentor/includeCorrelationHeaders should be called only once\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: 2 invocation of xhr.open() doesn't cause send wrapper to execute 2nd time\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let ajaxDataId = (this._ajax as any)._ajaxDataId;\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                xhr.open(\"GET\", \"example.com/bla\");\n\n                Assert.ok(xhr[AJAX_DATA_CONTAINER], \"Expecting the ajax data set the method\");\n                Assert.equal(\"GET\", xhr[AJAX_DATA_CONTAINER].i[ajaxDataId].method, \"Expecting the ajax data set the method\");\n                // Reset the method to something else\n                xhr[AJAX_DATA_CONTAINER].i[ajaxDataId].method = \"TEST\";\n\n                try {\n                    xhr.open(\"GET\", \"example.com/bla\");\n                } catch (e) { }\n\n                Assert.equal(\"TEST\", xhr[AJAX_DATA_CONTAINER].i[ajaxDataId].method, \"sendPrefixInstrumentor should be called only once\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: should create and pass a traceparent header if w3c is enabled\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var stub = this.sandbox.stub(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that both headers are sent\n                Assert.equal(true, stub.calledWith(RequestHeaders.requestIdHeader)); // AI\n                Assert.equal(true, stub.calledWith(RequestHeaders.traceParentHeader)); // W3C\n\n                // Emulate response so perf monitoring is cleaned up\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                var id = trackStub.args[0][0].baseData.id;\n                Assert.equal(\"|\", id[0]);\n                Assert.equal(\".\", id[id.length - 1]);\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: should create and pass a single traceparent header if w3c is enabled with multiple instances\",\n            test: () => {\n                // Switch back to the \"real\" XMLHttpRequest so that the instrumentation hooks work\n                this.useFakeServer = false;\n                let _ajax2 = new AjaxMonitor();\n                let appInsightsFirst = new AppInsightsCore();\n                let coreConfig2 = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsFirst.initialize(coreConfig2, [_ajax2, new TestChannelPlugin()]);\n                appInsightsFirst.getTraceCtx(true)?.setTraceId(generateW3CId());\n                appInsightsFirst.getTraceCtx(true)?.setSpanId(strLeft(generateW3CId(), 16));\n                let firstTraceId = appInsightsFirst.getTraceCtx()?.getTraceId();\n                let firstSpanId = appInsightsFirst.getTraceCtx()?.getSpanId();\n\n                const firstExpectedTraceParent = formatTraceParent(createTraceParent(firstTraceId, firstSpanId, 0x01));\n                appInsightsFirst.track({ name: \"Test1\" });\n                appInsightsFirst.flush(false);\n                this.onDone(() => {\n                    appInsightsFirst.unload(false);\n                });\n\n                // Use test hook to simulate the correct url location\n                _ajax2[\"_currentWindowHost\"] = \"localhost:9001\";\n\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                appInsightsCore.getTraceCtx(true)?.setTraceId(generateW3CId());\n                appInsightsCore.getTraceCtx(true)?.setSpanId(strLeft(generateW3CId(), 16));\n                let coreTraceId = appInsightsCore.getTraceCtx()?.getTraceId();\n                let coreSpanId = appInsightsCore.getTraceCtx()?.getSpanId();\n\n                const coreExpectedTraceParent = formatTraceParent(createTraceParent(coreTraceId, coreSpanId, 0x01));\n                appInsightsCore.track({ name: \"Test2\" });\n                appInsightsCore.flush(false);\n\n                Assert.notEqual(firstTraceId, coreTraceId, \"Make sure that the traceId's are different\");\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                return createPromise<void>((resolve) => {\n                    // Act\n                    var xhr = new XMLHttpRequest();\n                    var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                    xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n                    xhr.onload = () => {\n                        try {\n                            if (xhr && xhr.readyState === 4) {\n                                resolve();\n                            }\n                        } catch (e) {\n                            resolve();\n                        }\n                    };\n                    xhr.onerror = () => {\n                        resolve();\n                    };\n                    \n                    xhr.send();\n\n                    // Assert that both headers are sent and that it was only called by the first instances (3 headers one only)\n                    Assert.equal(3, spy.callCount, \"setRequestHeader called multiple times\");\n                    Assert.equal(true, spy.calledWith(RequestHeaders.requestIdHeader)); // AI\n                    Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader)); // W3C\n\n                    // Assert that the W3C header is included\n                    Assert.equal(RequestHeaders.traceParentHeader, spy.args[2][0], \"Validate the actual header sent\");\n                    Assert.ok(spy.args[2][1].indexOf(\"00-\" + firstTraceId) != -1, \"Validate the actual header sent - actual: [\" + spy.args[2][1] + \"], expected parent [\" + firstExpectedTraceParent + \"] - alt: \" + coreExpectedTraceParent);\n\n                    Assert.equal(RequestHeaders.requestIdHeader, spy.args[0][0], \"Validate the actual header sent\");\n                    Assert.ok(spy.args[0][1].indexOf(\"|\" + firstTraceId + \".\") != -1, \"Validate the actual header sent - actual: [\" + spy.args[0][1] + \"], expected parent [\" + firstExpectedTraceParent + \"] - alt: \" + coreExpectedTraceParent);\n                    // Emulate response so perf monitoring is cleaned up\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: should not create and pass a traceparent header if correlationHeaderExcludePatterns set to exclude all\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    correlationHeaderExcludePatterns: [/.*/],\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var stub = this.sandbox.stub(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that both headers are not sent\n                Assert.equal(false, stub.calledWith(RequestHeaders.requestIdHeader)); // AI\n                Assert.equal(false, stub.calledWith(RequestHeaders.traceParentHeader)); // W3C\n\n                // Emulate response so perf monitoring is cleaned up\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n                var id = trackStub.args[0][0].baseData.id;\n                Assert.equal(\"|\", id[0]);\n                Assert.equal(\".\", id[id.length - 1]);\n            }\n        });\n\n        this.testCase({\n            name: \"Ajax: should create and only pass a traceparent header if w3c is enabled\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var stub = this.sandbox.stub(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that the AI header was not included\n                Assert.equal(false, stub.calledWith(RequestHeaders.requestIdHeader)); // AI\n                // Assert that the W3C header is included\n                Assert.equal(true, stub.calledWith(RequestHeaders.traceParentHeader)); // W3C\n\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n            }\n        })\n\n        this.testCase({\n            name: \"Ajax: should create and only pass AI is enabled\",\n            test: () => {\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var stub = this.sandbox.stub(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that the AI header was not included\n                Assert.equal(true, stub.calledWith(RequestHeaders.requestIdHeader)); // AI\n                // Assert that the W3C header is included\n                Assert.equal(false, stub.calledWith(RequestHeaders.traceParentHeader)); // W3C\n\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n            }\n        })\n\n        this.testCase({\n            name: \"Ajax DependencyListener: traceparent should use the default trace and span id's\",\n            test: () => {\n                let allDetails: IDependencyListenerDetails[] = [];\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n\n                let traceId: string;\n                let spanId: string;\n\n                this._ajax.addDependencyListener((details: IDependencyListenerDetails) => {\n                    traceId = details.traceId;\n                    spanId = details.spanId;\n                    allDetails.push(details);\n                });\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                const expectedRequestId = \"|\" + traceId + \".\" + spanId;\n                const expectedTraceParent = formatTraceParent(createTraceParent(traceId, spanId, 0x01));\n\n                // Assert that the AI header was not included\n                Assert.equal(true, spy.calledWith(RequestHeaders.requestIdHeader, expectedRequestId)); // AI\n                Assert.equal(expectedRequestId, (xhr as FakeXMLHttpRequest).requestHeaders[RequestHeaders.requestIdHeader], \"Validate the actual header sent\");\n\n                // Assert that the W3C header is included\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader, expectedTraceParent)); // W3C\n                Assert.equal(expectedTraceParent, (xhr as FakeXMLHttpRequest).requestHeaders[RequestHeaders.traceParentHeader], \"Validate the actual header sent\");\n\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n            }\n        })\n\n        this.testCase({\n            name: \"Ajax DependencyListener: traceparent should use the trace and span id's from listener values\",\n            test: () => {\n                let allDetails: IDependencyListenerDetails[] = [];\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n\n                const traceId = generateW3CId();\n                const spanId = generateW3CId().substr(0, 16);\n                const expectedRequestId = \"|\" + traceId + \".\" + spanId;\n                const expectedTraceParent = formatTraceParent(createTraceParent(traceId, spanId, 0x00));\n\n                this._ajax.addDependencyListener((details: IDependencyListenerDetails) => {\n                    details.traceId = traceId;\n                    details.spanId = spanId;\n                    details.traceFlags = 0x00;    \n                    allDetails.push(details);\n                });\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                // Act\n                var xhr = new XMLHttpRequest();\n                var spy = this.sandbox.spy(xhr, \"setRequestHeader\");\n                xhr.open(\"GET\", \"http://www.example.com\");\n                xhr.send();\n\n                // Assert that the AI header was not included\n                Assert.equal(true, spy.calledWith(RequestHeaders.requestIdHeader, expectedRequestId)); // AI\n                Assert.equal(expectedRequestId, (xhr as FakeXMLHttpRequest).requestHeaders[RequestHeaders.requestIdHeader], \"Validate the actual header sent\");\n\n                // Assert that the W3C header is included\n                Assert.equal(true, spy.calledWith(RequestHeaders.traceParentHeader, expectedTraceParent)); // W3C\n                Assert.equal(expectedTraceParent, (xhr as FakeXMLHttpRequest).requestHeaders[RequestHeaders.traceParentHeader], \"Validate the actual header sent - actual: [\" + (xhr as FakeXMLHttpRequest).requestHeaders[RequestHeaders.traceParentHeader] + \"], expected parent [\" + expectedTraceParent + \"]\");\n\n                // Emulate response\n                (<any>xhr).respond(200, {\"Content-Type\": \"application/json; charset=utf-8\", \"Access-Control-Allow-Origin\": \"*\"}, \"\");\n            }\n        });\n    }\n\n    private testAjaxSuccess(responseCode: number, success: boolean) {\n        this._ajax = new AjaxMonitor();\n        let appInsightsCore = new AppInsightsCore();\n        let coreConfig = { instrumentationKey: \"instrumentationKey\", extensionConfig: {\"AjaxPlugin\": {}}};\n        appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n        var trackStub = this.sandbox.stub(appInsightsCore, \"track\");\n\n        // Act\n        var xhr = new XMLHttpRequest();\n        xhr.open(\"GET\", \"example.com/bla\");\n        xhr.send();\n\n        // Emulate response\n        (<any>xhr).respond(responseCode, {}, \"\");\n\n        // Assert\n        let data = trackStub.args[0][0].baseData;\n        Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n        Assert.equal(success, data.success, \"TrackAjax should receive \" + success + \" as a 'success' argument\");\n    }\n\n    private _checkFetchTraceId(evtData:any, message:string) {\n        Assert.notEqual(undefined, evtData, message + \" - Must have track data\");\n        if (evtData) {\n            let data = evtData.baseData;\n            Assert.equal(\"Fetch\", data.type, message + \" - request is Fatch type\");\n            var id = data.id;\n            Assert.equal(\"|\", id[0], message + \" - check id starts with |\");\n            Assert.equal(\".\", id[id.length - 1], message + \" - check id ends with .\");\n        }\n    }\n}\n\nexport class AjaxPerfTrackTests extends AITestClass {\n\n    private _fetch:any;\n    private _ajax:AjaxMonitor;\n    private _initialPerformance: Performance;\n    private _perfEntries: PerformanceEntry[];\n    private _context:any;\n\n    constructor(name?: string, emulateIe?: boolean) {\n        super(name, emulateIe);\n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n        this.useFakeServer = false;\n        this._perfEntries = [];\n        this._context = {};\n    }\n\n    public addPerfEntry(entry:any) {\n        this._perfEntries.push(entry);\n    }\n\n    public testInitialize() {\n        this._context = {};\n        this._fetch = getGlobalInst(\"fetch\");\n\n        let performance = getPerformance();\n        if (performance && performance.clearResourceTimings) {\n            // Make sure we don't pick up some elses value\n            performance.clearResourceTimings();\n        }\n\n        let testThis = this;\n        testThis._initialPerformance = performance;\n\n        testThis._perfEntries = [];\n        setBypassLazyCache(true);\n\n        // Add polyfil / mock\n        (<any>window).performance = {\n            _current: 0,\n            _tick: function (ms: number) {\n                this._current += ms;\n            },\n            now: function() {\n                return this._current;\n            },\n            getEntries: function() {\n                return testThis._perfEntries;\n            },\n            getEntriesByName: function (name) {\n                let result = [];\n                testThis._perfEntries.forEach((entry) => {\n                    if (entry.name === name) {\n                        result.push(entry);\n                    }\n                });\n                return result;\n            },\n            mark: function (name) {\n                testThis.addPerfEntry({\n                    entryType: \"mark\",\n                    name: name,\n                    startTime: this._current,\n                    duration: 0\n                });\n            }\n        }\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ajax) {\n            this._ajax.teardown();\n            this._ajax = null;\n        }\n    }\n\n    public testCleanup() {\n        this._context = {};\n\n        if (this._initialPerformance) {\n            (<any>window).performance = this._initialPerformance;\n            this._initialPerformance = null;\n        }\n\n        // Restore the real fetch\n        window.fetch = this._fetch;\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"AjaxPerf: check that performance tracking is disabled for xhr requests by default\",\n            test: () => {\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\"\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Used to \"wait\" for App Insights to finish initializing which should complete after the XHR request\n                this._context[\"trackStub\"] = this.sandbox.stub(appInsightsCore, \"track\");\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        var xhr = new XMLHttpRequest();\n\n                        // trigger the request that should cause a track event once the xhr request is complete\n                        xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n                        xhr.send();\n                        Assert.equal(false, markSpy.called, \"The code should not have called mark()\");\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                            let props = data.properties || {};\n                            Assert.equal(undefined, props.ajaxPerf, \"Should contain properties perf object\");\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 600, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"AjaxPerf: check that performance tracking is included when enabled for xhr requests\",\n            test: () => {\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            enableAjaxPerfTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                // Used to \"wait\" for App Insights to finish initializing which should complete after the XHR request\n                this._context[\"trackStub\"] = this.sandbox.stub(appInsightsCore, \"track\");\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        var xhr = new XMLHttpRequest();\n\n                        // trigger the request that should cause a track event once the xhr request is complete\n                        xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n                        xhr.send();\n                        Assert.equal(true, markSpy.called, \"The code should have called been mark()\");\n                        this.addPerfEntry({\n                            entryType: \"resource\",\n                            initiatorType: \"xmlhttprequest\",\n                            name: \"http://localhost:9001/shared/\",\n                            startTime: getPerformance().now(),\n                            duration: 10\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                            let props = data.properties;\n                            Assert.notEqual(undefined, props, \"Should contain properties\");\n                            if (props) {\n                                let perf = props.ajaxPerf || {};\n                                Assert.equal(10, perf.duration, \"Duration exists - \" + JSON.stringify(data));\n                            }\n                            return true;\n                        }\n\n                        return false;\n                    }, 'response received', 600, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"AjaxPerf: check that performance tracking is included when enabled for xhr requests with server timing\",\n            test: () => {\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            enableAjaxPerfTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                // Used to \"wait\" for App Insights to finish initializing which should complete after the XHR request\n                this._context[\"trackStub\"] = this.sandbox.stub(appInsightsCore, \"track\");\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        var xhr = new XMLHttpRequest();\n\n                        // trigger the request that should cause a track event once the xhr request is complete\n                        xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n                        xhr.send();\n                        Assert.equal(true, markSpy.called, \"The code should have called been mark()\");\n                        this.addPerfEntry({\n                            entryType: \"resource\",\n                            initiatorType: \"xmlhttprequest\",\n                            name: \"http://localhost:9001/shared/\",\n                            startTime: getPerformance().now(),\n                            duration: 10,\n                            serverTiming: [\n                                { name: \"cache\", duration: 23.2, description: \"Cache Read\"},\n                                { name: \"db\", duration: 53, description: \"\"},\n                                { name: \"app\", duration: 47.2, description: \"\"},\n                                { name: \"dup\", description: \"dup1\"},\n                                { name: \"dup\", description: \"dup2\"},\n                            ]\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                            let props = data.properties;\n                            Assert.notEqual(undefined, props, \"Should contain properties\");\n                            if (props) {\n                                let perf = props.ajaxPerf || {};\n                                Assert.equal(10, perf.duration, \"Duration exists - \" + JSON.stringify(data));\n                                Assert.equal(23.2, perf.serverTiming.cache.duration, \"Check that the server timing was set\")\n                                Assert.equal(\"Cache Read\", perf.serverTiming.cache.description, \"Check that the server timing was set\")\n                                Assert.equal(\"dup1;dup2\", perf.serverTiming.dup.description, \"Check that the server timing was set\")\n                            }\n                            return true;\n                        }\n\n                        return false;\n                    }, 'response received', 600, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"AjaxPerf: check perf mark prefix is correctly set for multiple xhr requests\",\n            test: () => {\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            enableAjaxPerfTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n                // Used to \"wait\" for App Insights to finish initializing which should complete after the XHR request\n                this._context[\"trackStub\"] = this.sandbox.stub(appInsightsCore, \"track\");\n\n                let xhr = new XMLHttpRequest();\n\n                let resolve1Promise = createPromise<void>((resolve) => {\n                    xhr.onreadystatechange = () => {\n                        try {\n                            if (xhr.readyState === 4) {\n                                resolve();\n                            }\n                        } catch (e) {\n                            resolve();\n                        }\n                    };\n\n                    xhr.onerror = () => {\n                        resolve();\n                    };\n                });\n\n                var xhr2 = new XMLHttpRequest();\n                let resolve2Promise = createPromise<void>((resolve) => {\n                    xhr2.onreadystatechange = () => {\n                        try {\n                            if (xhr2.readyState === 4) {\n                                resolve();\n                            }\n                        } catch (e) {\n                            resolve();\n                        }\n                    };\n\n                    xhr2.onerror = () => {\n                        resolve();\n                    };\n                });\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // trigger the request that should cause a track event once the xhr request is complete\n                        xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n                        xhr.send();\n\n                        xhr2.open(\"GET\", \"https://localhost:9001/anything\");\n                        xhr2.send();\n\n                        Assert.equal(true, markSpy.called, \"The code should have called been mark()\");\n                        let spyDetails = markSpy.args;\n                        let prefix1 = spyDetails[0][0];\n                        let prefix2 = spyDetails[1][0];\n                        Assert.equal(prefix1.indexOf(\"ajaxData\"), 0, \"Prefix1 should start with 'ajaxData'\");\n                        Assert.equal(prefix2.indexOf(\"ajaxData\"), 0, \"Prefix2 should start with 'ajaxData'\");\n\n                        let ajaxCountOne = parseInt(prefix1.substring(prefix1.indexOf('#') + 1), 10);\n                        let ajaxCountTwo = parseInt(prefix2.substring(prefix2.indexOf('#') + 1), 10);\n                        Assert.equal(1, ajaxCountTwo-ajaxCountOne, \"the count should increase by 1\");\n                    }).add(() => {\n                        return createAllPromise([resolve1Promise, resolve2Promise]).then(() => {\n                            // Wait a bit for the track to be called\n                            return createTimeoutPromise(250).then(() => {\n                                let trackStub = this._context[\"trackStub\"] as SinonStub;\n                                Assert.ok(trackStub.calledTwice, \"track is called twice\");\n                            });\n                        });\n                    });\n            }\n        });\n\n\n        this.testCase({\n            name: \"AjaxPerf: check that performance tracking is reported, even if the entry is missing when enabled for xhr requests\",\n            test: () => {\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            enableAjaxPerfTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                // Used to \"wait\" for App Insights to finish initializing which should complete after the XHR request\n                this._context[\"trackStub\"] = this.sandbox.stub(appInsightsCore, \"track\");\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        var xhr = new XMLHttpRequest();\n                        // trigger the request that should cause a track event once the xhr request is complete\n                        xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n                        xhr.send();\n                        Assert.equal(true, markSpy.called, \"The code should have called been mark()\");\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n                            let props = data.properties;\n                            Assert.notEqual(undefined, props, \"Should contain properties\");\n                            if (props) {\n                                let perf = props.ajaxPerf || {};\n                                Assert.equal(true, !!perf.missing, \"Performance was executed but browser did not populate the window.performance entries - \" + JSON.stringify(data));\n                            }\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"AjaxPerf: check that performance tracking is disabled for fetch requests by default\",\n            test: () => {\n\n                 hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve();\n                    }, 0);\n                });\n\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\"\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                this.onDone(() => {\n                    appInsightsCore.unload(false);\n                });\n\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n                this._context[\"trackStub\"] = trackSpy;\n                return this._asyncQueue()\n                    .add(() => {\n\n                        // Send fetch request that should trigger a track event when complete\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(\"http://localhost:9001/shared/\", {method: \"post\",  }).then((value) => {\n                            this._context[\"fetchComplete\"] = true;\n                            return value;\n                        });\n                        Assert.equal(false, markSpy.called, \"The code should not have called been mark()\");\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (this._context[\"fetchComplete\"]) {\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            let props = data.properties;\n                            Assert.notEqual(undefined, props, \"Should contain properties\");\n                            Assert.equal(undefined, props.ajaxPerf, \"No performance data should exist\");\n                            return true;\n                        }\n\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"AjaxPerf: check that performance tracking is included for fetch requests when enabled\",\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            disableFetchTracking: false,\n                            enableAjaxPerfTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n                this._context[\"trackStub\"] = trackSpy;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Send fetch request that should trigger a track event when complete\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(\"http://localhost:9001/shared/\", {method: \"post\" });\n                        Assert.equal(true, markSpy.called, \"The code should have called been mark()\");\n                    }).add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            window.console && window.console.warn(\"Performance Entries: \" + window.performance.getEntries().length);\n\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            let props = data.properties;\n                            Assert.notEqual(undefined, props, \"Should contain properties\");\n                            if (props) {\n                                let perf = props.ajaxPerf || {};\n                                if (perf.missing) {\n                                    Assert.equal(true, !!perf.missing, \"Performance was executed but browser did not populate the window.performance entries - \" + JSON.stringify(data));\n                                } else {\n                                    Assert.notEqual(undefined, perf.duration, \"Duration exists - \" + JSON.stringify(data));\n                                }\n                            }\n                            return true;\n                        }\n\n                        return false;\n                    }, 'response received', 30, 1000))\n            }\n        });\n\n\n        this.testCase({\n            name: \"AjaxPerf: check that performance tracking is included for fetch requests when enabled when the fetch has a delayed promise\",\n            test: () => {\n                hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 500);\n                });\n\n                let performance = getPerformance();\n                let markSpy = this.sandbox.spy(performance, \"mark\");\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            disableFetchTracking: false,\n                            enableAjaxPerfTracking: true\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"www.example.com\";\n\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n                this._context[\"trackStub\"] = trackSpy;\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Send fetch request that should trigger a track event when complete\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(\"http://localhost:9001/shared/\", { method: \"post\" });\n                        Assert.equal(true, markSpy.called, \"The code should have called been mark()\");\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            window.console && window.console.warn(\"Performance Entries: \" + window.performance.getEntries().length);\n\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fetch type\");\n                            let props = data.properties;\n                            Assert.notEqual(undefined, props, \"Should contain properties\");\n                            if (props) {\n                                Assert.notEqual(undefined, props.ajaxPerf, \"Perf detail exists\");\n                                let perf = props.ajaxPerf || {};\n                                if (perf.missing) {\n                                    Assert.equal(true, !!perf.missing, \"Performance was executed but browser did not populate the window.performance entries - \" + JSON.stringify(data));\n                                } else {\n                                    Assert.notEqual(undefined, perf.duration, \"Duration exists - \" + JSON.stringify(data));\n                                }\n                            }\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 600, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"Fetch: should not create and pass correlation header if correlationHeaderExcludePatterns set to exclude all.\",\n            timeout: 10000,\n            test: () => {\n                let fetchCalls = hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve({\n                            headers: new Headers(),\n                            ok: true,\n                            body: null,\n                            bodyUsed: false,\n                            redirected: false,\n                            status: 200,\n                            statusText: \"Hello\",\n                            trailer: null,\n                            type: \"basic\",\n                            url: \"http://localhost:9001/shared/\"\n                        });\n                    }, 0);\n                });\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    disableFetchTracking: false,\n                    disableAjaxTracking: false,\n                    correlationHeaderExcludePatterns: [/.*/],\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\",\n                            distributedTracingMode: DistributedTracingModes.AI_AND_W3C\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                let trackSpy = this.sandbox.spy(appInsightsCore, \"track\");\n                this._context[\"trackStub\"] = trackSpy;\n                this._context[\"fetchCalls\"] = fetchCalls;\n\n                // Use test hook to simulate the correct url location\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Setup\n                let headers = new Headers();\n                headers.append('My-Header', 'Header field');\n                let init = {\n                    method: 'get',\n                    headers\n                };\n                const url = 'http://localhost:9001/shared/';\n\n                return this._asyncQueue()\n                    .add(() => {\n                        // Act\n                        Assert.ok(trackSpy.notCalled, \"No fetch called yet\");\n                        fetch(url, init).then(() => {\n                            // Assert\n                            Assert.ok(trackSpy.called, \"The request was not tracked\");\n                            Assert.equal(1, fetchCalls.length);\n                            Assert.notEqual(undefined, fetchCalls[0].init, \"Has init param\");\n                            let headers:Headers = fetchCalls[0].init.headers as Headers;\n                            Assert.equal(true, headers.has(\"My-Header\"), \"My-Header should be present\");\n                            Assert.equal(false, headers.has(RequestHeaders.requestIdHeader), \"Correlation header - AI header should be excluded\"); // AI\n                            Assert.equal(false, headers.has(RequestHeaders.traceParentHeader), \"Correlation header - W3c header should be excluded\"); // W3C\n                        }, () => {\n                            Assert.ok(false, \"fetch failed!\");\n                        });\n                    })\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let trackStub = this._context[\"trackStub\"] as SinonStub;\n                        if (trackStub.called) {\n                            Assert.ok(trackStub.calledOnce, \"track is called\");\n                            let data = trackStub.args[0][0].baseData;\n                            Assert.equal(\"Fetch\", data.type, \"request is Fatch type\");\n                            var id = data.id;\n                            Assert.equal(\"|\", id[0]);\n                            Assert.equal(\".\", id[id.length - 1]);\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        });\n    }\n}\n\nexport class AjaxFrozenTests extends AITestClass {\n\n    private _fetch:any;\n    private _xmlHttpRequest:XMLHttpRequest;\n    private _ajax:AjaxMonitor;\n    private _context:any;\n\n    constructor(name?: string, emulateIe?: boolean) {\n        super(name, emulateIe);\n        this.assertNoEvents = true;\n        this.assertNoHooks = true;\n\n        this.useFakeServer = false;\n        this._context = {};\n    }\n\n    public testInitialize() {\n        this._context = {};\n        this._fetch = getGlobalInst(\"fetch\");\n        this._xmlHttpRequest = getGlobalInst(\"XMLHttpRquest)\");\n    }\n\n    public testFinishedCleanup(): void {\n        if (this._ajax) {\n            this._ajax.teardown();\n            this._ajax = null;\n        }\n    }\n\n    public testCleanup() {\n        this._context = {};\n\n        // Restore the real fetch\n        window.fetch = this._fetch;\n        if (this._xmlHttpRequest) {\n            getGlobal()[\"XMLHttpRequest\"] = this._xmlHttpRequest;\n        }\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"AjaxFrozenTests: check for prevent extensions\",\n            test: () => {\n                Object.preventExtensions(XMLHttpRequest);\n                Object.freeze(XMLHttpRequest);\n                let reflect:any = getGlobalInst(\"Reflect\");\n                if (reflect) {\n                    reflect.preventExtensions(XMLHttpRequest);\n                }\n\n                this._ajax = new AjaxMonitor();\n                let appInsightsCore = new AppInsightsCore();\n                let coreConfig = {\n                    instrumentationKey: \"instrumentationKey\",\n                    extensionConfig: {\n                        \"AjaxDependencyPlugin\": {\n                            appId: \"appId\"\n                        }\n                    }\n                };\n                appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n                this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n                // Used to \"wait\" for App Insights to finish initializing which should complete after the XHR request\n                this._context[\"trackStub\"] = this.sandbox.stub(appInsightsCore, \"track\");\n                this._context[\"throwSpy\"] = this.sandbox.spy(appInsightsCore.logger, \"throwInternal\");\n\n                // Act\n                var xhr = new XMLHttpRequest();\n\n                // Make sure the instance can't be changed\n                Object.preventExtensions(xhr);\n                Object.freeze(xhr);\n                if (reflect) {\n                    reflect[\"preventExtensions\"](xhr);\n                }\n\n                // trigger the request that should cause a track event once the xhr request is complete\n                xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n                xhr.send();\n\n                return this._asyncQueue()\n                    .add(PollingAssert.asyncTaskPollingAssert(() => {\n                        let throwSpy = this._context[\"throwSpy\"] as SinonStub;\n                        if (throwSpy.called) {\n                            Assert.ok(throwSpy.calledOnce, \"track is called\");\n                            let message = throwSpy.args[0][2];\n                            Assert.notEqual(-1, message.indexOf(\"Failed to monitor XMLHttpRequest\"));\n                            let data = throwSpy.args[0][3];\n                            Assert.notEqual(-1, data.exception.indexOf(\"Cannot add property _ajaxData\"));\n                            return true;\n                        }\n                        return false;\n                    }, 'response received', 60, 1000))\n            }\n        });\n        \n        // This is currently a manual test as we don't have hooks / mocks defined to automated this today\n        // this.testCaseAsync({\n        //     name: \"AjaxFrozenTests: check frozen prototype\",\n        //     stepDelay: 10,\n        //     steps: [ () => {\n        //         Object.preventExtensions(XMLHttpRequest.prototype);\n        //         Object.freeze(XMLHttpRequest.prototype);\n        //         let reflect:any = getGlobalInst(\"Reflect\");\n        //         if (reflect) {\n        //             reflect.preventExtensions(XMLHttpRequest.prototype);\n        //         }\n\n        //         this._ajax = new AjaxMonitor();\n        //         let appInsightsCore = new AppInsightsCore();\n        //         let coreConfig = {\n        //             instrumentationKey: \"instrumentationKey\",\n        //             extensionConfig: {\n        //                 \"AjaxDependencyPlugin\": {\n        //                     appId: \"appId\"\n        //                 }\n        //             }\n        //         };\n        //         let testThis = this;\n        //         appInsightsCore.initialize(coreConfig, [this._ajax, new TestChannelPlugin()]);\n        //         appInsightsCore.addNotificationListener({\n        //             eventsSent: (events: ITelemetryItem[]) => {\n        //                 testThis._context[\"_eventsSent\"] = events;\n        //             }\n        //         });\n        //         this._ajax[\"_currentWindowHost\"] = \"localhost:9001\";\n\n        //         // Used to \"wait\" for App Insights to finish initializing which should complete after the XHR request\n        //         this._context[\"trackStub\"] = this.sandbox.stub(appInsightsCore, \"track\");\n\n        //         // Act\n        //         var xhr = new XMLHttpRequest();\n\n        //         // Make sure the instance can't be changed\n        //         Object.preventExtensions(xhr);\n        //         Object.freeze(xhr);\n        //         if (reflect) {\n        //             reflect[\"preventExtensions\"](xhr);\n        //         }\n\n        //         // trigger the request that should cause a track event once the xhr request is complete\n        //         xhr.open(\"GET\", \"http://localhost:9001/shared/\");\n        //         xhr.send();\n        //         appInsightsCore.track({\n        //             name: \"Hello World!\"\n        //         });\n        //     }]\n        //     .concat(PollingAssert.createPollingAssert(() => {\n        //         let trackStub = this._context[\"trackStub\"] as SinonStub;\n        //         if (trackStub.called) {\n        //             Assert.ok(trackStub.calledOnce, \"track is called\");\n        //             let data = trackStub.args[0][0].baseData;\n        //             Assert.equal(\"Ajax\", data.type, \"request is Ajax type\");\n        //             let props = data.properties || {};\n        //             Assert.equal(undefined, props.ajaxPerf, \"Should contain properties perf object\");\n        //             return true;\n        //         }\n\n        //         return false;\n        //     }, 'response received', 600, 1000) as any)\n        // });\n\n    }\n}\n\n\n\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/Tests/Unit/src/dependencies.tests.ts",
    "content": "import { AjaxTests, AjaxPerfTrackTests, AjaxFrozenTests } from \"./ajax.tests\";\nimport { GlobalTestHooks } from \"./GlobalTestHooks.Test\";\nimport { W3CTraceStateDependencyTests } from \"./W3CTraceStateDependency.tests\";\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new AjaxTests().registerTests();\n    new AjaxPerfTrackTests().registerTests();\n    new AjaxFrozenTests().registerTests();\n    new W3CTraceStateDependencyTests().registerTests();\n}"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript API</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/dependencies.tests\", \"./Unit/dist/dependencies.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-dependencies-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-dependencies-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights XHR dependencies plugin\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-dependencies-js.js\",\n    \"module\": \"dist-es5/applicationinsights-dependencies-js.js\",\n    \"types\": \"types/applicationinsights-dependencies-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-dependencies-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt deps\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt depstest\",\n        \"mintest\": \"grunt deps-mintest\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights XHR dependencies plugin\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt deps-min\",\n        \"ai-restore\": \"grunt deps-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/rollup.config.js",
    "content": "import { createUnVersionedConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst outputName = \"applicationinsights-dependencies-js\";\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Dependencies Plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createUnVersionedConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: outputName, \n      outputName: outputName\n    },\n    browser: {\n      entryPoint: outputName,\n      outputName: outputName\n    },\n  },\n  [ \"applicationinsights-dependencies-js\" ],\n  false\n);\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/src/DependencyInitializer.ts",
    "content": "import { IDependencyTelemetry } from \"@microsoft/applicationinsights-core-js\";\nimport { IDependencyHandler } from \"./DependencyListener\";\n\nexport interface IDependencyInitializerDetails {\n\n    /**\n     * The DependencyTelemetry event that will be passed to the `trackDependencyDataInternal` function.\n     */\n    item: IDependencyTelemetry;\n    \n    /**\n     * Additional properties to be added to the event\n     */\n    properties?: { [key: string]: any };\n    \n    /**\n     * Additional system properties to be added to the event.\n     */\n    sysProperties?: { [key: string]: any }\n\n\n    /**\n     * The context that the application can assigned via the dependency listener(s)\n     */\n    context?: { [key: string]: any };\n\n    /**\n     * [Optional] A flag that indicates whether the client request was manually aborted by the `abort()`\n     */\n    aborted?: boolean;\n}\n\n/**\n * The initializer function that will be called, if it returns false the event will be dropped and not reported\n * or counted against the `maxAjaxCallsPerView`.\n */\nexport declare type DependencyInitializerFunction = (item: IDependencyInitializerDetails) => boolean | void;\n\nexport interface IDependencyInitializerHandler extends IDependencyHandler {\n}\n\nexport interface IDependencyInitializerContainer {\n    /**\n     * Add a dependency telemetry processor to decorate or drop telemetry events.\n     * @param dependencyInitializer - The Telemetry Initializer function\n     * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed\n     */\n    addDependencyInitializer(dependencyInitializer: DependencyInitializerFunction): IDependencyInitializerHandler | void;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/src/DependencyListener.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IAppInsightsCore, IW3cTraceState } from \"@microsoft/applicationinsights-core-js\";\n\nexport interface IDependencyListenerDetails {\n    /**\n     * The current core instance\n     */\n    core: IAppInsightsCore;\n\n    /**\n     * Provided only if the dependency request is an XHR call\n     */\n    xhr?: XMLHttpRequest;\n\n    /**\n     * Provided only if the dependency request is a fetch call, this is the input argument being used,\n     * re-assigning this value has not affect on the value used for the request, however, when this is a Request\n     * object changing the value of the Request will be used for the outbound request.\n     */\n    input?: Request | string;\n\n    /**\n     * Provided only if the dependency request is a fetch call, this is the init argument being used,\n     * re-assigning this value does not change the value used for the request, however, changing properties\n     * of this object will be used.\n     */\n    init?: RequestInit;\n\n    /**\n     * Returns the unique identifier for a trace. All requests / spans from the same trace share the same traceId.\n     * Must be read from incoming headers or generated according to the W3C TraceContext specification,\n     * in a hex representation of 16-byte array. A.k.a. trace-id, TraceID or Distributed TraceID\n     */\n    traceId?: string;\n\n    /**\n     * Self-generated 8-bytes identifier of the incoming request. Must be a hex representation of 8-byte array.\n     * Also know as the parentId, used to link requests together\n     */\n    spanId?: string;\n\n    /**\n     * An integer representation of the W3C TraceContext trace-flags.\n     * https://www.w3.org/TR/trace-context/#trace-flags\n     */\n    traceFlags?: number;\n\n    /**\n     * The W3C TraceState object that contains the trace state information, this is mutable and changes made to this\n     * instance will be reflected in the distributed trace context. You cannot overwrite the traceState, but you can\n     * modify the values within the traceState.\n     */\n    readonly traceState?: IW3cTraceState;\n\n    /**\n     * [Optional] Context that the application can assign that will also be passed to any dependency initializer\n     */\n    context?: { [key: string]: any };\n\n    /**\n     * [Optional] A flag that indicates whether the client request was manually aborted by the `abort()`,\n     * as listeners are called just before the request is sent it is unlikely that an application would have\n     * called `abort` before `send` this is also available in the dependency initializer.\n     */\n    aborted?: boolean;\n}\n\n/**\n * The function that will get called when the ajax request is about to occur.\n */\nexport declare type DependencyListenerFunction = (dependencyDetails: IDependencyListenerDetails) => boolean | void;\n\nexport interface IDependencyHandler {\n    remove(): void;\n}\nexport interface IDependencyListenerHandler extends IDependencyHandler {\n}\n\nexport interface IDependencyListenerContainer {\n    /**\n     * Add an ajax listener which is called just prior to the request being sent and before the correlation headers are added.\n     * This allows you to access the headers and modify the values used to generate the distributed tracing correlation headers (added in v2.8.4),\n     * or to drop the correlation (added in v3.3.7).\n     * @param dependencyListener - The Telemetry Initializer function\n     * @returns - A IDependencyListenerHandler to enable the initializer to be removed\n     */\n    addDependencyListener(dependencyListener: DependencyListenerFunction): IDependencyListenerHandler;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/src/InternalConstants.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// ###################################################################################################################################################\n// Note: DON'T Export these const from the package as we are still targeting IE/ES5 this will export a mutable variables that someone could change ###\n// ###################################################################################################################################################\n\n// Generally you should only put values that are used more than 2 times and then only if not already exposed as a constant (such as SdkCoreNames)\n// as when using \"short\" named values from here they will be will be minified smaller than the SdkCoreNames[eSdkCoreNames.xxxx] value.\n\nexport const UNDEFINED_VALUE: undefined = undefined;\nexport const STR_DURATION = \"duration\";\nexport const STR_PROPERTIES = \"properties\";\n\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/src/ajax.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, DisabledPropertyName, IAppInsightsCore, IConfig, IConfigDefaults, IConfiguration, ICorrelationConfig,\n    ICustomProperties, IDependencyTelemetry, IDistributedTraceContext, IInstrumentCallDetails, IInstrumentHooksCallbacks, IPlugin,\n    IProcessTelemetryContext, IRequestContext, ITelemetryContext, ITelemetryItem, ITelemetryPluginChain, InstrumentFunc, InstrumentProto,\n    PropertiesPluginIdentifier, RemoteDependencyDataType, RemoteDependencyEnvelopeType, RequestHeaders, _eInternalMessageId, _throwInternal,\n    arrForEach, correlationIdCanIncludeCorrelationHeader, correlationIdGetCorrelationContext, createDistributedTraceContext,\n    createDistributedTraceContextFromTrace, createProcessTelemetryContext, createTelemetryItem, createTraceParent, createUniqueNamespace,\n    dateTimeUtilsNow, dumpObj, eDistributedTracingModes, eLoggingSeverity, eRequestHeaders, eW3CTraceFlags, eventOn, fieldRedaction,\n    formatTraceParent, generateW3CId, getExceptionName, getGlobal, getIEVersion, getLocation, getPerformance, isFunction,\n    isInternalApplicationInsightsEndpoint, isNullOrUndefined, isString, isXhrSupported, mergeEvtNamespace, onConfigChange, strPrototype,\n    strTrim\n} from \"@microsoft/applicationinsights-core-js\";\nimport { isWebWorker, objDefineProps, objFreeze, scheduleTimeout, strIndexOf, strSplit, strSubstr } from \"@nevware21/ts-utils\";\nimport { DependencyInitializerFunction, IDependencyInitializerDetails, IDependencyInitializerHandler } from \"./DependencyInitializer\";\nimport {\n    DependencyListenerFunction, IDependencyHandler, IDependencyListenerContainer, IDependencyListenerDetails, IDependencyListenerHandler\n} from \"./DependencyListener\";\nimport { IAjaxRecordResponse, IXHRMonitoringState, createAjaxRecord } from \"./ajaxRecord\";\n\n// const AJAX_MONITOR_PREFIX = \"ai.ajxmn.\";\nconst strDiagLog = \"diagLog\";\nconst AJAX_DATA_CONTAINER = \"_ajaxData\";\nconst STR_FETCH = \"fetch\";\n\nconst ERROR_HEADER = \"Failed to monitor XMLHttpRequest\";\nconst ERROR_PREFIX = \", monitoring data for this ajax call \";\nconst ERROR_POSTFIX = ERROR_PREFIX + \"may be incorrect.\";\nconst ERROR_NOT_SENT = ERROR_PREFIX + \"won't be sent.\";\nconst CORRELATION_HEADER_ERROR = \"Failed to get Request-Context correlation header as it may be not included in the response or not accessible.\";\nconst CUSTOM_REQUEST_CONTEXT_ERROR = \"Failed to add custom defined request context as configured call back may missing a null check.\";\nconst FAILED_TO_CALCULATE_DURATION_ERROR = \"Failed to calculate the duration of the \";\n\n// Using a global value so that to handle same iKey with multiple app insights instances (mostly for testing)\nlet _markCount: number = 0;\n\ninterface _IInternalDependencyHandler<F> {\n    id: number;\n    fn: F;\n}\n\n/** @Ignore */\nfunction _supportsFetch(): (input: RequestInfo, init?: RequestInit) => Promise<Response> {\n    let _global = getGlobal();\n    if (!_global ||\n            isNullOrUndefined((_global as any).Request) ||\n            isNullOrUndefined((_global as any).Request[strPrototype]) ||\n            isNullOrUndefined(_global[STR_FETCH])) {\n        return null;\n    }\n\n    return _global[STR_FETCH];\n}\n\n/**\n * Determines whether ajax monitoring can be enabled on this document\n * @returns True if Ajax monitoring is supported on this page, otherwise false\n * @ignore\n */\nfunction _supportsAjaxMonitoring(ajaxMonitorInstance: AjaxMonitor, ajaxDataId: string): boolean {\n    let result = false;\n\n    if (isXhrSupported()) {\n        let proto = XMLHttpRequest[strPrototype];\n        result = !isNullOrUndefined(proto) &&\n            !isNullOrUndefined(proto.open) && // eslint-disable-line security/detect-non-literal-fs-filename -- false positive\n            !isNullOrUndefined(proto.send) &&\n            !isNullOrUndefined(proto.abort);\n    }\n\n    let ieVer = getIEVersion();\n    if (ieVer && ieVer < 9) {\n        result = false;\n    }\n\n    if (result) {\n        // Disable if the XmlHttpRequest can't be extended or hooked\n        try {\n            let xhr = new XMLHttpRequest();\n            let xhrData: XMLHttpRequestData = {\n                xh: [],\n                i: {\n                    [ajaxDataId]: {} as IAjaxRecordInternal\n                }\n            };\n\n            (xhr as any)[AJAX_DATA_CONTAINER] = xhrData;\n\n            // Check that we can update the prototype\n            let theOpen = XMLHttpRequest[strPrototype].open;\n            XMLHttpRequest[strPrototype].open = theOpen;\n        } catch (e) {\n            // We can't decorate the xhr object so disable monitoring\n            result = false;\n            _throwInternalCritical(ajaxMonitorInstance,\n                _eInternalMessageId.FailedMonitorAjaxOpen,\n                \"Failed to enable XMLHttpRequest monitoring, extension is not supported\",\n                {\n                    exception: dumpObj(e)\n                });\n        }\n    }\n\n    return result;\n}\n\n/**\n * Internal helper to fetch the SDK instance tracking data for this XHR request\n * @param xhr\n * @param ajaxDataId\n * @returns\n */\nconst _getAjaxData = (xhr: XMLHttpRequestInstrumented, ajaxDataId: string): IAjaxRecordInternal => {\n    if (xhr && ajaxDataId && xhr[AJAX_DATA_CONTAINER]) {\n        return (xhr[AJAX_DATA_CONTAINER].i || { })[ajaxDataId];\n    }\n\n    return null;\n}\n\n/**\n * @ignore\n * Internal helper to track the singleton shared tracking headers, so we can attempt to not create headers\n * that might cause an issue if multiple values are populated.\n * @param xhr - The instrumented XHR instance\n */\nconst _addSharedXhrHeaders = (xhr: XMLHttpRequestInstrumented, name: string, value: string) => {\n    if (xhr) {\n        let headers = (xhr[AJAX_DATA_CONTAINER] || {}).xh;\n        if (headers) {\n            headers.push({\n                n: name,\n                v: value\n            });\n        }\n    }\n}\n\nconst _isHeaderSet = (xhr: XMLHttpRequestInstrumented, name: string) => {\n    let isPresent = false;\n    if (xhr) {\n        let headers = (xhr[AJAX_DATA_CONTAINER] || {}).xh;\n        if (headers) {\n            arrForEach(headers, (header) => {\n                if (header.n === name) {\n                    isPresent = true;\n                    return -1;\n                }\n            });\n        }\n    }\n\n    return isPresent;\n}\n\n/** @Ignore */\nfunction _getFailedAjaxDiagnosticsMessage(xhr: XMLHttpRequestInstrumented, ajaxDataId: string): string {\n    let result = \"\";\n    try {\n        let ajaxData = _getAjaxData(xhr, ajaxDataId);\n        if (ajaxData && ajaxData.requestUrl) {\n            result += \"(url: '\" + ajaxData.requestUrl + \"')\";\n        }\n    } catch (e) {\n        // eslint-disable-next-line no-empty\n    }\n\n    return result;\n}\n\n/** @ignore */\nfunction _throwInternalCritical(ajaxMonitorInstance:AjaxMonitor, msgId: _eInternalMessageId, message: string, properties?: Object, isUserAct?: boolean): void {\n    _throwInternal(ajaxMonitorInstance[strDiagLog](), eLoggingSeverity.CRITICAL, msgId, message, properties, isUserAct);\n}\n\n/** @ignore */\nfunction _throwInternalWarning(ajaxMonitorInstance:AjaxMonitor, msgId: _eInternalMessageId, message: string, properties?: Object, isUserAct?: boolean): void {\n    _throwInternal(ajaxMonitorInstance[strDiagLog](), eLoggingSeverity.WARNING, msgId, message, properties, isUserAct);\n}\n\n/** @Ignore */\nfunction _createErrorCallbackFunc(ajaxMonitorInstance: AjaxMonitor, internalMessage: _eInternalMessageId, message:string) {\n    // tslint:disable-next-line\n    return function (callDetails: IInstrumentCallDetails) {\n        _throwInternalCritical(ajaxMonitorInstance,\n            internalMessage,\n            message,\n            {\n                ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(callDetails.inst, (ajaxMonitorInstance as any)._ajaxDataId),\n                exception: dumpObj(callDetails.err)\n            });\n    };\n}\n\nfunction _indexOf(value:string, match:string):number {\n    if (value && match) {\n        return strIndexOf(value, match);\n    }\n\n    return -1;\n}\n\nfunction _addHandler<F>(container: _IInternalDependencyHandler<F>[], id: number, theFunc: F): IDependencyHandler {\n    let theHandler: _IInternalDependencyHandler<F> = {\n        id: id,\n        fn: theFunc\n    };\n\n    container.push(theHandler);\n\n    return {\n        remove: () => {\n            arrForEach(container, (initializer, idx) => {\n                if (initializer.id === theHandler.id) {\n                    container.splice(idx, 1);\n                    return -1;\n                }\n            });\n        }\n    };\n}\n\nfunction _processDependencyContainer<F extends Function, D>(core: IAppInsightsCore, container: _IInternalDependencyHandler<F>[], details: D, message: string) {\n    let result = true;\n    arrForEach(container, (theFunc, idx) => {\n        try {\n            if (theFunc.fn.call(null, details) === false) {\n                result = false;\n            }\n        } catch (e) {\n            _throwInternal(\n                core && core.logger,\n                eLoggingSeverity.CRITICAL,\n                _eInternalMessageId.TelemetryInitializerFailed,\n                \"Dependency \" + message + \" [#\" + idx + \"] failed: \" + getExceptionName(e),\n                { exception: dumpObj(e) }, true);\n        }\n    });\n\n    return result;\n}\n\nfunction _processDependencyListeners(listeners: _IInternalDependencyHandler<DependencyListenerFunction>[], core: IAppInsightsCore, ajaxData: IAjaxRecordInternal, xhr: XMLHttpRequest, input?: Request | string, init?: RequestInit): boolean {\n    var initializersCount = listeners.length;\n    let result = true;\n    if (initializersCount > 0) {\n        let traceCtx = ajaxData.traceCtx;\n        let details: IDependencyListenerDetails = {\n            core: core,\n            xhr: xhr,\n            input: input,\n            init: init,\n            aborted: !!ajaxData.aborted\n        };\n\n        objDefineProps(details, {\n            \"traceId\": {\n                g: () => traceCtx.traceId,\n                s: (value) => {\n                    traceCtx.traceId = value;\n                }\n            },\n            \"spanId\": {\n                g: () => traceCtx.spanId,\n                s: (value) => {\n                    traceCtx.spanId = value;\n                }\n            },\n            \"traceFlags\": {\n                g: () => traceCtx.traceFlags,\n                s: (value) => {\n                    traceCtx.traceFlags = value;\n                }\n            },\n            \"traceState\": {\n                g: () => traceCtx.traceState\n            },\n            \"context\": {\n                g: () => ajaxData.context || {},\n                s: (value) => {\n                    ajaxData.context = value;\n                }\n            }\n        });\n    \n        result = _processDependencyContainer(core, listeners, details, \"listener\");\n    }\n    \n    return result;\n}\n\nexport interface XMLHttpRequestData {\n    /**\n     * The \"Shared\" XHR headers, avoids causing multiple instances\n     */\n    xh?: Array<{ n: string, v: string }>;\n\n    /**\n     * The individual tracking data for each AI instance\n     */\n    i: { [key: string]: IAjaxRecordInternal };\n}\n\nexport interface XMLHttpRequestInstrumented extends XMLHttpRequest {\n    _ajaxData: XMLHttpRequestData;\n}\n\nconst BLOB_CORE = \"*.blob.core.\";\n\nexport const DfltAjaxCorrelationHeaderExDomains = objFreeze([\n    BLOB_CORE + \"windows.net\",\n    BLOB_CORE + \"chinacloudapi.cn\",\n    BLOB_CORE + \"cloudapi.de\",\n    BLOB_CORE + \"usgovcloudapi.net\"\n]);\n\n\nconst _internalExcludeEndpoints = [\n    /https:\\/\\/[^\\/]*(\\.pipe\\.aria|aria\\.pipe|events\\.data|collector\\.azure)\\.[^\\/]+\\/(OneCollector\\/1|Collector\\/3)\\.0/i\n];\n\nexport interface IDependenciesPlugin extends IDependencyListenerContainer {\n    /**\n     * Logs dependency call\n     * @param dependencyData - dependency data object\n     */\n    trackDependencyData(dependency: IDependencyTelemetry): void;\n}\n\n/**\n * Interface for ajax data passed to includeCorrelationHeaders function.\n * Contains the public properties and methods needed for correlation header processing.\n */\nexport interface IAjaxRecordData {\n    /**\n     * Gets the absolute URL for the request\n     * @returns The absolute URL string or null\n     */\n    getAbsoluteUrl(): string | null;\n    \n    /**\n     * Gets the sanitized path name for the request URL\n     * @returns The sanitized path name string or null\n     */\n    getPathName(): string | null;\n    \n    /**\n     * The distributed trace context for the request containing trace ID, span ID, and trace flags\n     */\n    readonly traceCtx: IDistributedTraceContext;\n    \n    /**\n     * Object containing request headers that have been set for this request\n     */\n    requestHeaders: { [key: string]: string };\n    \n    /**\n     * Indicates whether the request was aborted (0 = not aborted, 1 = aborted)\n     */\n    aborted: number;\n    \n    /**\n     * Optional context object that can be set by dependency listeners\n     */\n    context?: { [key: string]: any };\n}\n\n/**\n * Internal interface that extends the public IAjaxRecordData with additional properties and methods\n * used internally by the AJAX monitoring implementation.\n *\n * @internal\n */\nexport interface IAjaxRecordInternal extends IAjaxRecordData {\n    /**\n     * Indicates if the ajax call has completed\n     */\n    completed: boolean;\n    \n    /**\n     * Size of the request headers in bytes\n     */\n    requestHeadersSize: number;\n    \n    /**\n     * Duration of receiving the response in milliseconds\n     */\n    responseReceivingDuration: number;\n    \n    /**\n     * Duration of the callback execution in milliseconds\n     */\n    callbackDuration: number;\n    \n    /**\n     * Total duration of the ajax call in milliseconds\n     */\n    ajaxTotalDuration: number;\n    \n    /**\n     * URL of the page that initiated the request\n     */\n    pageUrl: string;\n    \n    /**\n     * The URL of the request\n     */\n    requestUrl: string;\n    \n    /**\n     * Size of the request in bytes\n     */\n    requestSize: number;\n    \n    /**\n     * HTTP method used for the request\n     */\n    method: string;\n    \n    /**\n     * Performance mark associated with this request\n     */\n    perfMark: PerformanceMark;\n    \n    /**\n     * Performance timing data from the Resource Timing API\n     */\n    perfTiming: PerformanceResourceTiming;\n    \n    /**\n     * Number of attempts to find performance data\n     */\n    perfAttempts?: number;\n    \n    /**\n     * Indicates if the request was made asynchronously\n     */\n    async?: boolean;\n    \n    /**\n     * Should the Error Status text be included in the response\n     */\n    errorStatusText?: boolean;\n    \n    /**\n     * HTTP status code of the response\n     */\n    status: string | number;\n    \n    /**\n     * Timestamp when the request was sent\n     */\n    requestSentTime: number;\n    \n    /**\n     * Timestamp when the first byte was received\n     */\n    responseStartedTime: number;\n    \n    /**\n     * Timestamp when the last byte was received\n     */\n    responseFinishedTime: number;\n    \n    /**\n     * Timestamp when the onreadystatechange callback finished\n     */\n    callbackFinishedTime: number;\n    \n    /**\n     * Timestamp when the ajax call ended\n     */\n    endTime: number;\n    \n    /**\n     * State tracking object for XHR monitoring\n     */\n    xhrMonitoringState: IXHRMonitoringState;\n    \n    /**\n     * Indicates if a JavaScript exception occurred in xhr.onreadystatechange code (1 if occurred, 0 otherwise)\n     */\n    clientFailure: number;\n    \n    /**\n     * Creates a telemetry item for tracking this ajax request\n     * @param ajaxType - Type of the ajax request\n     * @param enableRequestHeaderTracking - Whether to include request headers in telemetry\n     * @param getResponse - Function to get response data\n     * @returns Dependency telemetry item or null\n     */\n    CreateTrackItem(ajaxType: string, enableRequestHeaderTracking: boolean, getResponse: () => IAjaxRecordResponse): IDependencyTelemetry;\n    \n    /**\n     * Gets Part A properties for telemetry\n     * @returns Object containing Part A properties or null\n     */\n    getPartAProps(): { [key: string]: any };\n}\n\nexport interface IInstrumentationRequirements extends IDependenciesPlugin {\n    includeCorrelationHeaders: (ajaxData: IAjaxRecordData, input?: Request | string, init?: RequestInit, xhr?: XMLHttpRequestInstrumented) => any;\n}\n\n/**\n * Interface for the Ajax Monitor Plugin that extends IPlugin and includes ajax specific functionality.\n * This interface is used for proper typing when retrieving the plugin via getPlugin().\n */\nexport interface IAjaxMonitorPlugin extends IPlugin, IDependenciesPlugin, IInstrumentationRequirements, IDependencyListenerContainer {\n    /**\n     * Resets the ajax attempts counter. This is typically called on page view to allow a fresh set of ajax calls to be tracked.\n     */\n    resetAjaxAttempts(): void;\n}\n\nconst _defaultConfig: IConfigDefaults<ICorrelationConfig> = objFreeze({\n    maxAjaxCallsPerView: 500,\n    disableAjaxTracking: false,\n    disableFetchTracking: false,\n    excludeRequestFromAutoTrackingPatterns: undefined,\n    disableCorrelationHeaders: false,\n    distributedTracingMode: eDistributedTracingModes.AI_AND_W3C,\n    correlationHeaderExcludedDomains: DfltAjaxCorrelationHeaderExDomains,\n    correlationHeaderDomains: undefined,\n    correlationHeaderExcludePatterns: undefined,\n    appId: undefined,\n    enableCorsCorrelation: false,\n    enableRequestHeaderTracking: false,\n    enableResponseHeaderTracking: false,\n    enableAjaxErrorStatusText: false,\n    enableAjaxPerfTracking: false,\n    maxAjaxPerfLookupAttempts: 3,\n    ajaxPerfLookupDelay: 25,\n    ignoreHeaders:[\n        \"Authorization\",\n        \"X-API-Key\",\n        \"WWW-Authenticate\"\n    ],\n    addRequestContext: undefined,\n    addIntEndpoints: true\n});\n\nexport class AjaxMonitor extends BaseTelemetryPlugin implements IAjaxMonitorPlugin {\n\n    public static identifier: string = \"AjaxDependencyPlugin\";\n\n    public identifier: string = AjaxMonitor.identifier;\n    priority: number = 120;\n\n    constructor() {\n        super();\n        let _fetchInitialized: boolean;      // fetch monitoring initialized\n        let _xhrInitialized: boolean;        // XHR monitoring initialized\n        let _currentWindowHost: string;\n        let _extensionConfig: ICorrelationConfig;\n        let _enableRequestHeaderTracking: boolean;\n        let _enableAjaxErrorStatusText: boolean;\n        let _trackAjaxAttempts: number;\n        let _context: ITelemetryContext;\n        let _isUsingW3CHeaders: boolean;\n        let _isUsingAIHeaders: boolean;\n        let _isUsingW3CTraceState: boolean;\n        let _markPrefix: string;\n        let _enableAjaxPerfTracking: boolean;\n        let _maxAjaxCallsPerView: number;\n        let _enableResponseHeaderTracking: boolean;\n        let _disabledUrls: any;\n        let _disableAjaxTracking: boolean;\n        let _disableFetchTracking: boolean;\n        let _excludeRequestFromAutoTrackingPatterns: (string | RegExp)[];\n        let _addRequestContext: (requestContext?: IRequestContext) => ICustomProperties;\n        let _evtNamespace: string | string[];\n        let _ajaxDataId: string;\n        let _dependencyHandlerId: number;\n        let _dependencyListeners: _IInternalDependencyHandler<DependencyListenerFunction>[];\n        let _dependencyInitializers: _IInternalDependencyHandler<DependencyInitializerFunction>[];\n        let _ignoreHeaders: string[];\n        let _maxAjaxPerfLookupAttempts: number;\n        let _ajaxPerfLookupDelay: number;\n        let _distributedTracingMode: eDistributedTracingModes;\n        let _appId: string;\n        let _polyfillInitialized: boolean;\n\n        dynamicProto(AjaxMonitor, this, (_self, _base) => {\n            let _addHook = _base._addHook;\n\n            _initDefaults();\n\n            _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) => {\n                if (!_self.isInitialized()) {\n                    _base.initialize(config, core, extensions, pluginChain);\n\n                    _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"ajax\"), core && core.evtNamespace && core.evtNamespace());\n\n                    _populateDefaults(config);\n\n                    _instrumentXhr();\n                    _instrumentFetch();\n                    _populateContext();\n                }\n            };\n\n            _self._doTeardown = () => {\n                _initDefaults();\n            };\n\n            _self.trackDependencyData = (dependency: IDependencyTelemetry, properties?: { [key: string]: any }) => {\n                _reportDependencyInternal(_dependencyInitializers, _self.core, null, dependency, properties);\n            }\n\n            _self.resetAjaxAttempts = () => {\n                _trackAjaxAttempts = 0;\n            }\n\n            _self.includeCorrelationHeaders = (ajaxData: IAjaxRecordInternal, input?: Request | string, init?: RequestInit, xhr?: XMLHttpRequestInstrumented): any => {\n                // Test Hook to allow the overriding of the location host\n                let currentWindowHost = (_self as any)[\"_currentWindowHost\"] || _currentWindowHost;\n                \n                if (_processDependencyListeners(_dependencyListeners, _self.core, ajaxData, xhr, input, init)) {\n                    if (input || input === \"\") { // Fetch\n                        if (correlationIdCanIncludeCorrelationHeader(_extensionConfig, ajaxData.getAbsoluteUrl(), currentWindowHost)) {\n                            if (!init) {\n                                init = {};\n                            }\n\n                            let traceCtx = ajaxData.traceCtx;\n\n                            // init headers override original request headers\n                            // so, if they exist use only them, otherwise use request's because they should have been applied in the first place\n                            // not using original request headers will result in them being lost\n                            let headers = new Headers(init.headers || (input instanceof Request ? (input.headers || {}) : {}));\n                            if (_isUsingAIHeaders) {\n                                const id = \"|\" + traceCtx.traceId + \".\" + traceCtx.spanId;\n                                headers.set(RequestHeaders[eRequestHeaders.requestIdHeader], id);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.requestIdHeader]] = id;\n                                }\n                            }\n                            const appId: string = _appId ||(_context && _context.appId());\n                            if (appId) {\n                                headers.set(RequestHeaders[eRequestHeaders.requestContextHeader], RequestHeaders[eRequestHeaders.requestContextAppIdFormat] + appId);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.requestContextHeader]] = RequestHeaders[eRequestHeaders.requestContextAppIdFormat] + appId;\n                                }\n                            }\n                            if (_isUsingW3CHeaders) {\n                                let traceFlags = traceCtx.traceFlags;\n                                if (isNullOrUndefined(traceFlags)) {\n                                    traceFlags = eW3CTraceFlags.Sampled; // Default to sampled\n                                }\n\n                                const traceParent = formatTraceParent(createTraceParent(traceCtx.traceId, traceCtx.spanId, traceFlags));\n                                headers.set(RequestHeaders[eRequestHeaders.traceParentHeader], traceParent);\n                                if (_enableRequestHeaderTracking) {\n                                    ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.traceParentHeader]] = traceParent;\n                                }\n                            }\n\n                            if (_isUsingW3CTraceState) {\n                                if (traceCtx.traceState && !traceCtx.traceState.isEmpty) {\n                                    const traceStateHeaders = traceCtx.traceState.hdrs();\n                                    if (traceStateHeaders && traceStateHeaders.length > 0) {\n                                        let stateSet = false;\n                                        arrForEach(traceStateHeaders, (stateValue) => {\n                                            if (stateValue) {\n                                                if (!stateSet) {\n                                                    stateSet = true;\n                                                    headers.set(RequestHeaders[eRequestHeaders.traceStateHeader], stateValue);\n                                                } else {\n                                                    headers.append(RequestHeaders[eRequestHeaders.traceStateHeader], stateValue);\n                                                }\n                                            }\n                                        });\n                                    }\n\n                                    if (_enableRequestHeaderTracking) {\n                                        ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.traceStateHeader]] = traceStateHeaders.join(\",\");\n                                    }\n                                }\n                            }\n\n                            init.headers = headers;\n                        }\n                    } else if (xhr) { // XHR\n                        if (correlationIdCanIncludeCorrelationHeader(_extensionConfig, ajaxData.getAbsoluteUrl(), currentWindowHost)) {\n                            let traceCtx = ajaxData.traceCtx;\n\n                            if (_isUsingAIHeaders) {\n                                if (!_isHeaderSet(xhr, RequestHeaders[eRequestHeaders.requestIdHeader])) {\n                                    const id = \"|\" + traceCtx.traceId + \".\" + traceCtx.spanId;\n                                    xhr.setRequestHeader(RequestHeaders[eRequestHeaders.requestIdHeader], id);\n                                    if (_enableRequestHeaderTracking) {\n                                        ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.requestIdHeader]] = id;\n                                    }\n                                } else {\n                                    _throwInternalWarning(_self, _eInternalMessageId.FailedMonitorAjaxSetRequestHeader,\n                                        \"Unable to set [\" + RequestHeaders[eRequestHeaders.requestIdHeader] + \"] as it has already been set by another instance\");\n                                }\n                            }\n                            const appId = _appId || (_context && _context.appId());\n                            if (appId) {\n                                if (!_isHeaderSet(xhr, RequestHeaders[eRequestHeaders.requestContextHeader])) {\n                                    xhr.setRequestHeader(RequestHeaders[eRequestHeaders.requestContextHeader], RequestHeaders[eRequestHeaders.requestContextAppIdFormat] + appId);\n                                    if (_enableRequestHeaderTracking) {\n                                        ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.requestContextHeader]] = RequestHeaders[eRequestHeaders.requestContextAppIdFormat] + appId;\n                                    }\n                                } else {\n                                    _throwInternalWarning(_self, _eInternalMessageId.FailedMonitorAjaxSetRequestHeader,\n                                        \"Unable to set [\" + RequestHeaders[eRequestHeaders.requestContextHeader] + \"] as it has already been set by another instance\");\n                                }\n                            }\n                            if (_isUsingW3CHeaders) {\n                                let traceFlags = traceCtx.traceFlags;\n                                if (isNullOrUndefined(traceFlags)) {\n                                    traceFlags = eW3CTraceFlags.Sampled;\n                                }\n\n                                if (!_isHeaderSet(xhr, RequestHeaders[eRequestHeaders.traceParentHeader])) {\n                                    const traceParent = formatTraceParent(createTraceParent(traceCtx.traceId, traceCtx.spanId, traceFlags));\n                                    xhr.setRequestHeader(RequestHeaders[eRequestHeaders.traceParentHeader], traceParent);\n                                    if (_enableRequestHeaderTracking) {\n                                        ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.traceParentHeader]] = traceParent;\n                                    }\n                                } else {\n                                    _throwInternalWarning(_self, _eInternalMessageId.FailedMonitorAjaxSetRequestHeader,\n                                        \"Unable to set [\" + RequestHeaders[eRequestHeaders.traceParentHeader] + \"] as it has already been set by another instance\");\n                                }\n                            }\n\n                            if (_isUsingW3CTraceState) {\n                                if (traceCtx.traceState && !traceCtx.traceState.isEmpty) {\n                                    const traceStateHeaders = traceCtx.traceState.hdrs();\n                                    if (traceStateHeaders && traceStateHeaders.length > 0) {\n                                        arrForEach(traceStateHeaders, (stateValue) => {\n                                            if (stateValue) {\n                                                xhr.setRequestHeader(RequestHeaders[eRequestHeaders.traceStateHeader], stateValue);\n                                            }\n                                        });\n                                    }\n\n                                    if (_enableRequestHeaderTracking) {\n                                        ajaxData.requestHeaders[RequestHeaders[eRequestHeaders.traceStateHeader]] = traceStateHeaders.join(\",\");\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n\n                return xhr || init;\n            }\n\n            _self.trackDependencyDataInternal = (dependency: IDependencyTelemetry, properties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) => {\n                if (_maxAjaxCallsPerView === -1 || _trackAjaxAttempts < _maxAjaxCallsPerView) {\n                    // Hack since expected format in w3c mode is |abc.def.\n                    // Non-w3c format is |abc.def\n                    // @todo Remove if better solution is available, e.g. handle in portal\n                    if ((_distributedTracingMode === eDistributedTracingModes.W3C\n                        || _distributedTracingMode === eDistributedTracingModes.AI_AND_W3C)\n                        && typeof dependency.id === \"string\" && dependency.id[dependency.id.length - 1] !== \".\"\n                    ) {\n                        dependency.id += \".\";\n                    }\n                    if (isNullOrUndefined(dependency.startTime)) {\n                        dependency.startTime = new Date();\n                    }\n                    const item = createTelemetryItem<IDependencyTelemetry>(\n                        dependency,\n                        RemoteDependencyDataType,\n                        RemoteDependencyEnvelopeType,\n                        _self[strDiagLog](),\n                        properties,\n                        systemProperties);\n\n                    _self.core.track(item);\n                } else if (_trackAjaxAttempts === _maxAjaxCallsPerView) {\n                    _throwInternalCritical(_self,\n                        _eInternalMessageId.MaxAjaxPerPVExceeded,\n                        \"Maximum ajax per page view limit reached, ajax monitoring is paused until the next trackPageView(). In order to increase the limit set the maxAjaxCallsPerView configuration parameter.\",\n                        true);\n                }\n\n                ++_trackAjaxAttempts;\n            }\n\n            _self.addDependencyListener = (dependencyListener: DependencyListenerFunction): IDependencyListenerHandler => {\n                return _addHandler(_dependencyListeners, _dependencyHandlerId++, dependencyListener);\n            };\n\n            _self.addDependencyInitializer = (dependencyInitializer: DependencyInitializerFunction): IDependencyInitializerHandler => {\n                return _addHandler(_dependencyInitializers, _dependencyHandlerId++, dependencyInitializer);\n            };\n        \n            function _initDefaults() {\n                let location = getLocation();\n                _fetchInitialized = false;      // fetch monitoring initialized\n                _xhrInitialized = false;        // XHR monitoring initialized\n                _polyfillInitialized = false;   // polyfill monitoring initialized\n                _currentWindowHost = location && location.host && location.host.toLowerCase();\n                _extensionConfig = null;\n                _enableRequestHeaderTracking = false;\n                _enableAjaxErrorStatusText = false;\n                _trackAjaxAttempts = 0;\n                _context = null;\n                _isUsingW3CHeaders = false;\n                _isUsingW3CTraceState = false;\n                _isUsingAIHeaders = false;\n                _markPrefix = null;\n                _enableAjaxPerfTracking = false;\n                _maxAjaxCallsPerView = 0;\n                _enableResponseHeaderTracking = false;\n                _disabledUrls = {};\n                _disableAjaxTracking = false;\n                _disableFetchTracking = false;\n        \n                _excludeRequestFromAutoTrackingPatterns = null;\n                _addRequestContext = null;\n                _evtNamespace = null;\n                _dependencyHandlerId = 0;\n                _dependencyListeners = [];\n                _dependencyInitializers = [];\n                _ajaxDataId = createUniqueNamespace(\"ajaxData\");\n                (_self as any)._ajaxDataId = _ajaxDataId;\n                _ignoreHeaders = null;\n                _maxAjaxPerfLookupAttempts = 1;\n                _ajaxPerfLookupDelay = 1;\n                _distributedTracingMode = eDistributedTracingModes.AI_AND_W3C;\n                _appId = null;\n            }\n\n            function _populateDefaults(config: IConfiguration) {\n                _self._addHook(onConfigChange(config, (details) => {\n                    let config = details.cfg;\n                    let ctx = createProcessTelemetryContext(null, config, _self.core);\n                    _extensionConfig = ctx.getExtCfg(AjaxMonitor.identifier, _defaultConfig);\n    \n                    _distributedTracingMode = _extensionConfig.distributedTracingMode;\n                    _enableRequestHeaderTracking = _extensionConfig.enableRequestHeaderTracking;\n                    _enableAjaxErrorStatusText = _extensionConfig.enableAjaxErrorStatusText;\n                    _enableAjaxPerfTracking = _extensionConfig.enableAjaxPerfTracking;\n                    _maxAjaxCallsPerView = _extensionConfig.maxAjaxCallsPerView;\n                    _excludeRequestFromAutoTrackingPatterns = [].concat(_extensionConfig.excludeRequestFromAutoTrackingPatterns || [], _extensionConfig.addIntEndpoints !== false ? _internalExcludeEndpoints : []);\n                    _addRequestContext = _extensionConfig.addRequestContext;\n\n                    let baseDistributedTracingMode = _distributedTracingMode & eDistributedTracingModes._BaseMask;\n                    _isUsingAIHeaders = baseDistributedTracingMode === eDistributedTracingModes.AI || baseDistributedTracingMode === eDistributedTracingModes.AI_AND_W3C;\n                    _isUsingW3CHeaders = baseDistributedTracingMode === eDistributedTracingModes.AI_AND_W3C || baseDistributedTracingMode === eDistributedTracingModes.W3C;\n                    _isUsingW3CTraceState = !!(_distributedTracingMode & eDistributedTracingModes._W3CTraceState);\n\n                    if (_enableAjaxPerfTracking) {\n                        _markPrefix = _ajaxDataId;\n                    }\n\n                    _disableAjaxTracking = !!_extensionConfig.disableAjaxTracking;\n                    _maxAjaxPerfLookupAttempts = _extensionConfig.maxAjaxPerfLookupAttempts;\n                    _ajaxPerfLookupDelay = _extensionConfig.ajaxPerfLookupDelay;\n                    _ignoreHeaders = _extensionConfig.ignoreHeaders;\n                    _appId = _extensionConfig.appId;\n                }));\n            }\n\n            function _populateContext() {\n                let propExt = _self.core.getPlugin<any>(PropertiesPluginIdentifier);\n                if (propExt) {\n                    _context = propExt.plugin.context; // we could move IPropertiesPlugin to common as well\n                }\n            }\n\n            // discard the header if it's defined as ignoreHeaders in ICorrelationConfig\n            function _canIncludeHeaders(header: string) {\n                let rlt = true;\n                if (header || _ignoreHeaders) {\n                    arrForEach(_ignoreHeaders, (key => {\n                        if (key.toLowerCase() === header.toLowerCase()) {\n                            rlt = false;\n                            return -1;\n                        }\n                    }))\n                }\n                return rlt;\n            }\n\n            // Fetch Stuff\n            function _instrumentFetch(): void {\n                let fetch = _supportsFetch();\n                if (!fetch) {\n                    return;\n                }\n\n                let global = getGlobal();\n                let isPolyfill = (fetch as any).polyfill;\n                _self._addHook(onConfigChange(_extensionConfig, () => {\n                    _disableFetchTracking = !!_extensionConfig.disableFetchTracking;\n                    _enableResponseHeaderTracking = _extensionConfig.enableResponseHeaderTracking;\n\n                    if (!_disableFetchTracking && !_fetchInitialized) {\n                        _addHook(InstrumentFunc(global, STR_FETCH, {\n                            ns: _evtNamespace,\n                            // Add request hook\n                            req: (callDetails: IInstrumentCallDetails, input, init) => {\n                                let fetchData: IAjaxRecordInternal;\n                                if (!_disableFetchTracking && _fetchInitialized &&\n                                        !_isDisabledRequest(null, input, init) &&\n                                        // If we have a polyfil and XHR instrumented then let XHR report otherwise we get duplicates\n                                        !(isPolyfill && _xhrInitialized)) {\n                                    let ctx = callDetails.ctx();\n                                    fetchData = _createFetchRecord(input, init);\n                                    let newInit = _self.includeCorrelationHeaders(fetchData, input, init);\n                                    if (newInit !== init) {\n                                        callDetails.set(1, newInit);\n                                    }\n                                    ctx.data = fetchData;\n                                }\n                            },\n                            rsp: (callDetails: IInstrumentCallDetails, input) => {\n                                if (!_disableFetchTracking) {\n                                    let fetchData = callDetails.ctx().data;\n                                    if (fetchData) {\n                                        // Replace the result with the new promise from this code\n                                        callDetails.rslt = callDetails.rslt.then((response: any) => {\n                                            _reportFetchMetrics(callDetails, (response||{}).status, input, response, fetchData, () => {\n                                                let ajaxResponse:IAjaxRecordResponse = {\n                                                    statusText: (response||{}).statusText,\n                                                    headerMap: null,\n                                                    correlationContext: _getFetchCorrelationContext(response)\n                                                };\n        \n                                                if (_enableResponseHeaderTracking && response) {\n                                                    const responseHeaderMap: any = {};\n                                                    response.headers.forEach((value: string, name: string) => {     // @skip-minify\n                                                        if (_canIncludeHeaders(name)) {\n                                                            responseHeaderMap[name] = value;\n                                                        }\n                                                    });\n        \n                                                    ajaxResponse.headerMap = responseHeaderMap;\n                                                }\n        \n                                                return ajaxResponse;\n                                            });\n        \n                                            return response;\n                                        })\n                                            .catch((reason: any) => {\n                                                _reportFetchMetrics(callDetails, 0, input, null, fetchData, null, { error: reason.message || dumpObj(reason) });\n                                                throw reason;\n                                            });\n                                    }\n                                }\n                            },\n                            // Create an error callback to report any hook errors\n                            hkErr: _createErrorCallbackFunc(_self, _eInternalMessageId.FailedMonitorAjaxOpen,\n                                \"Failed to monitor Window.fetch\" + ERROR_POSTFIX)\n                        }, true, isWebWorker()));\n    \n                        _fetchInitialized = true;\n                    } else if (isPolyfill && !_polyfillInitialized) {\n                        // If fetch is a polyfill we need to capture the request to ensure that we correctly track\n                        // disabled request URLS (i.e. internal urls) to ensure we don't end up in a constant loop\n                        // of reporting ourselves, for example React Native uses a polyfill for fetch\n                        // Note: Polyfill implementations that don't support the \"polyfill\" tag are not supported\n                        // the workaround is to add a polyfill property to your fetch implementation before initializing\n                        // App Insights\n                        _addHook(InstrumentFunc(global, STR_FETCH, {\n                            ns: _evtNamespace,\n                            req: (callDetails: IInstrumentCallDetails, input, init) => {\n                                // Just call so that we record any disabled URL\n                                _isDisabledRequest(null, input, init);\n                            }\n                        }));\n                        _polyfillInitialized = true;\n                    }\n                }));\n                \n                if (isPolyfill) {\n                    // retag the instrumented fetch with the same polyfill settings this is mostly for testing\n                    // But also supports multiple App Insights usages\n                    (global[STR_FETCH] as any).polyfill = isPolyfill;\n                }\n            }\n\n            function _hookProto(target: any, funcName: string, callbacks: IInstrumentHooksCallbacks) {\n                _addHook(InstrumentProto(target, funcName, callbacks));\n            }\n\n            function _instrumentXhr():void {\n                if (!_supportsAjaxMonitoring(_self, _ajaxDataId)) {\n                    return;\n                }\n                _self._addHook(onConfigChange(_extensionConfig, () => {\n                    _disableAjaxTracking = !!_extensionConfig.disableAjaxTracking;\n                    _enableRequestHeaderTracking = _extensionConfig.enableRequestHeaderTracking;\n\n                    if (!_disableAjaxTracking && !_xhrInitialized) {\n                        // Instrument open\n                        _hookProto(XMLHttpRequest, \"open\", {\n                            ns: _evtNamespace,\n                            req: (callDetails: IInstrumentCallDetails, method:string, url:string, async?:boolean) => {\n                                if (!_disableAjaxTracking) {\n                                    let xhr = callDetails.inst as XMLHttpRequestInstrumented;\n                                    let ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (!_isDisabledRequest(xhr, url) && _isMonitoredXhrInstance(xhr, ajaxData, true)) {\n                                        if (!ajaxData || !ajaxData.xhrMonitoringState.openDone) {\n                                            // Only create a single ajaxData (even when multiple AI instances are running)\n                                            ajaxData = _openHandler(xhr, method, url, async);\n                                        }\n        \n                                        // always attach to the on ready state change (required for handling multiple instances)\n                                        _attachToOnReadyStateChange(xhr, ajaxData);\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, _eInternalMessageId.FailedMonitorAjaxOpen,\n                                ERROR_HEADER + \".open\" + ERROR_POSTFIX)\n                        });\n    \n                        // Instrument send\n                        _hookProto(XMLHttpRequest, \"send\", {\n                            ns: _evtNamespace,\n                            req: (callDetails: IInstrumentCallDetails, context?: Document | BodyInit | null) => {\n                                if (!_disableAjaxTracking) {\n                                    let xhr = callDetails.inst as XMLHttpRequestInstrumented;\n                                    let ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (_isMonitoredXhrInstance(xhr, ajaxData) && !ajaxData.xhrMonitoringState.sendDone) {\n                                        _createMarkId(\"xhr\", ajaxData);\n                                        ajaxData.requestSentTime = dateTimeUtilsNow();\n                                        _self.includeCorrelationHeaders(ajaxData, undefined, undefined, xhr);\n                                        ajaxData.xhrMonitoringState.sendDone = true;\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, _eInternalMessageId.FailedMonitorAjaxSend,\n                                ERROR_HEADER + ERROR_POSTFIX)\n                        });\n    \n                        // Instrument abort\n                        _hookProto(XMLHttpRequest, \"abort\", {\n                            ns: _evtNamespace,\n                            req: (callDetails: IInstrumentCallDetails) => {\n                                if (!_disableAjaxTracking) {\n                                    let xhr = callDetails.inst as XMLHttpRequestInstrumented;\n                                    let ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (_isMonitoredXhrInstance(xhr, ajaxData) && !ajaxData.xhrMonitoringState.abortDone) {\n                                        ajaxData.aborted = 1;\n                                        ajaxData.xhrMonitoringState.abortDone = true;\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, _eInternalMessageId.FailedMonitorAjaxAbort,\n                                ERROR_HEADER + \".abort\" + ERROR_POSTFIX)\n                        });\n    \n                        // Instrument setRequestHeader\n                        _hookProto(XMLHttpRequest, \"setRequestHeader\", {\n                            ns: _evtNamespace,\n                            req: (callDetails: IInstrumentCallDetails, header: string, value: string) => {\n                                if (!_disableAjaxTracking) {\n                                    let xhr = callDetails.inst as XMLHttpRequestInstrumented;\n                                    let ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                                    if (ajaxData && _isMonitoredXhrInstance(xhr, ajaxData)) {\n                                        _addSharedXhrHeaders(xhr, header, value);\n                                        if (_enableRequestHeaderTracking && _canIncludeHeaders(header)) {\n                                            ajaxData.requestHeaders[header] = value;\n                                        }\n                                    }\n                                }\n                            },\n                            hkErr: _createErrorCallbackFunc(_self, _eInternalMessageId.FailedMonitorAjaxSetRequestHeader,\n                                ERROR_HEADER + \".setRequestHeader\" + ERROR_POSTFIX)\n                        });\n    \n                        _xhrInitialized = true;\n                    }\n                }));\n                \n            }\n\n            function _isDisabledRequest(xhr?: XMLHttpRequestInstrumented, request?: Request | string, init?: RequestInit) {\n                let isDisabled = false;\n                let theUrl:string = ((!isString(request) ? ((request ||{}) as Request).url || \"\" : request as string) ||\"\").toLowerCase();\n\n                // check excludeRequestFromAutoTrackingPatterns before stripping off any query string\n                arrForEach(_excludeRequestFromAutoTrackingPatterns, (regex: string | RegExp) => {\n                    let theRegex = regex;\n                    if (isString(regex)) {\n                        theRegex = new RegExp(regex);\n                    }\n\n                    if (!isDisabled) {\n                        isDisabled = (theRegex as RegExp).test(theUrl);\n                    }\n                });\n\n                // if request url matches with exclude regex pattern, return true and no need to check for headers\n                if (isDisabled) {\n                    return isDisabled;\n                }\n\n                let idx = _indexOf(theUrl, \"?\");\n                let idx2 = _indexOf(theUrl, \"#\");\n                if (idx === -1 || (idx2 !== -1 && idx2 < idx)) {\n                    idx = idx2;\n                }\n                if (idx !== -1) {\n                    // Strip off any Query string\n                    theUrl = theUrl.substring(0, idx);\n                }\n\n                // check that this instance is not not used by ajax call performed inside client side monitoring to send data to collector\n                if (!isNullOrUndefined(xhr)) {\n                    // Look on the XMLHttpRequest of the URL string value\n                    isDisabled = (xhr as any)[DisabledPropertyName] === true || (theUrl as any)[DisabledPropertyName] === true;\n                } else if (!isNullOrUndefined(request)) { // fetch\n                    // Look for DisabledPropertyName in either Request or RequestInit\n                    isDisabled = (typeof request === \"object\" ? (request as any)[DisabledPropertyName] === true : false) ||\n                            (init ? (init as any)[DisabledPropertyName] === true : false);\n                }\n\n                // Also add extra check just in case the XHR or fetch objects where not decorated with the DisableProperty due to sealing or freezing\n                if (!isDisabled && theUrl && isInternalApplicationInsightsEndpoint(theUrl)) {\n                    isDisabled = true;\n                }\n\n                if (isDisabled) {\n                    // Add the disabled url if not present\n                    if (!_disabledUrls[theUrl]) {\n                        _disabledUrls[theUrl] = 1;\n                    }\n                } else {\n                    // Check to see if the url is listed as disabled\n                    if (_disabledUrls[theUrl]) {\n                        isDisabled = true;\n                    }\n                }\n\n                return isDisabled;\n            }\n\n            /// <summary>Verifies that particular instance of XMLHttpRequest needs to be monitored</summary>\n            /// <param name=\"excludeAjaxDataValidation\">Optional parameter. True if ajaxData must be excluded from verification</param>\n            /// <returns type=\"bool\">True if instance needs to be monitored, otherwise false</returns>\n            function _isMonitoredXhrInstance(xhr: XMLHttpRequestInstrumented, ajaxData: IAjaxRecordInternal, excludeAjaxDataValidation?: boolean): boolean {\n                let ajaxValidation = true;\n                let initialized = _xhrInitialized;\n                if (!isNullOrUndefined(xhr)) {\n                    ajaxValidation = excludeAjaxDataValidation === true || !isNullOrUndefined(ajaxData);\n                }\n\n                // checking to see that all interested functions on xhr were instrumented\n                return initialized\n                    // checking on ajaxData to see that it was not removed in user code\n                    && ajaxValidation;\n            }\n\n            /**\n             * Using the ajaxRecord (for now) to capture what will be the \"span\" state for the ajax request.\n             * @returns\n             */\n            function _startSpan(): IAjaxRecordInternal {\n                let distributedTraceCtx: IDistributedTraceContext = null;\n                if (_self.core && _self.core.getTraceCtx) {\n                    // Note creating a new distributed trace context\n                    // This is to ensure that we have a original traceId and spanId for each request\n                    distributedTraceCtx = createDistributedTraceContext(_self.core.getTraceCtx());\n                }\n\n                // Fall back if running on an older version of the core\n                if (!distributedTraceCtx && _context && _context.telemetryTrace) {\n                    distributedTraceCtx = createDistributedTraceContextFromTrace(_context.telemetryTrace);\n                }\n\n                // TODO(OTelSpan): change to call traceCtx.startSpan() when available rather than setting\n                // a new spanId and traceId\n                let newCtx = createDistributedTraceContext(distributedTraceCtx);\n                // Always generate a new spanId for each dependency request to ensure proper span isolation\n                newCtx.traceId = newCtx.traceId || generateW3CId();\n                newCtx.spanId = strSubstr(generateW3CId(), 0, 16);\n\n                return createAjaxRecord(newCtx, _self[strDiagLog]());\n            }\n\n            function _endSpan(\n                ajaxData: IAjaxRecordInternal,\n                dependency: IDependencyTelemetry,\n                properties: { [key: string]: any } | undefined) {\n\n                // TODO(OTelSpan): change to call span.end() when available\n\n                if (dependency) {\n                    if (properties !== undefined) {\n                        dependency.properties = {...dependency.properties, ...properties};\n                    }\n\n                    let sysProperties = ajaxData.getPartAProps();\n                    _reportDependencyInternal(_dependencyInitializers, _self.core, ajaxData, dependency, properties, sysProperties);\n                }\n\n            }\n\n            function _openHandler(xhr: XMLHttpRequestInstrumented, method: string, url: string, async: boolean): IAjaxRecordInternal {\n                let xhrRequestData = xhr[AJAX_DATA_CONTAINER] = (xhr[AJAX_DATA_CONTAINER] || { xh: [], i: {}});\n                let ajaxDataCntr = xhrRequestData.i = (xhrRequestData.i || { });\n                const ajaxData = ajaxDataCntr[_ajaxDataId] = (ajaxDataCntr[_ajaxDataId] || _startSpan());\n\n                ajaxData.method = method;\n                ajaxData.requestUrl = url;\n                ajaxData.xhrMonitoringState.openDone = true;\n                ajaxData.requestHeaders = {};\n                ajaxData.async = async;\n                ajaxData.errorStatusText = _enableAjaxErrorStatusText;\n\n                return ajaxData;\n            }\n\n            function _attachToOnReadyStateChange(xhr: XMLHttpRequestInstrumented, ajaxData: IAjaxRecordInternal) {\n                ajaxData.xhrMonitoringState.stateChangeAttached = eventOn(xhr, \"readystatechange\", () => {\n                    try {\n                        if (xhr && xhr.readyState === 4 && _isMonitoredXhrInstance(xhr, ajaxData)) {\n                            _onAjaxComplete(xhr);\n                        }\n                    } catch (e) {\n                        const exceptionText = dumpObj(e);\n\n                        // ignore messages with c00c023f, as this a known IE9 XHR abort issue\n                        if (!exceptionText || _indexOf(exceptionText.toLowerCase(), \"c00c023f\") === -1) {\n                            _throwInternalCritical(_self,\n                                _eInternalMessageId.FailedMonitorAjaxRSC,\n                                ERROR_HEADER + \" 'readystatechange' event handler\" + ERROR_POSTFIX,\n                                {\n                                    ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(xhr, _ajaxDataId),\n                                    exception: exceptionText\n                                });\n                        }\n                    }\n                }, _evtNamespace);\n            }\n\n            function _getResponseText(xhr: XMLHttpRequestInstrumented) {\n                try {\n                    const responseType = xhr.responseType;\n                    if (responseType === \"\" || responseType === \"text\") {\n                        // As per the specification responseText is only valid if the type is an empty string or \"text\"\n                        return xhr.responseText;\n                    }\n                } catch (e) {\n                    // This shouldn't happen because of the above check -- but just in case, so just ignore\n                }\n\n                return null;\n            }\n\n            function _onAjaxComplete(xhr: XMLHttpRequestInstrumented) {\n                let ajaxData = _getAjaxData(xhr, _ajaxDataId);\n                ajaxData.responseFinishedTime = dateTimeUtilsNow();\n                ajaxData.status = xhr.status;\n\n                function _reportXhrError(e: any, failedProps?:Object) {\n                    let errorProps = failedProps||{} as any;\n                    errorProps[\"ajaxDiagnosticsMessage\"] = _getFailedAjaxDiagnosticsMessage(xhr, _ajaxDataId);\n                    if (e) {\n                        errorProps[\"exception\"]  = dumpObj(e);\n                    }\n\n                    _throwInternalWarning(_self,\n                        _eInternalMessageId.FailedMonitorAjaxDur,\n                        FAILED_TO_CALCULATE_DURATION_ERROR + \"ajax call\" + ERROR_NOT_SENT,\n                        errorProps\n                    );\n                }\n\n                _findPerfResourceEntry(\"xmlhttprequest\", ajaxData, () => {\n                    try {\n                        const dependency = ajaxData.CreateTrackItem(\"Ajax\", _enableRequestHeaderTracking, () => {\n                            let ajaxResponse:IAjaxRecordResponse = {\n                                statusText: xhr.statusText,\n                                headerMap: null,\n                                correlationContext: _getAjaxCorrelationContext(xhr),\n                                type: xhr.responseType,\n                                responseText: _getResponseText(xhr),\n                                response: xhr.response\n                            };\n\n                            if (_enableResponseHeaderTracking) {\n                                const headers = xhr.getAllResponseHeaders();\n                                if (headers) {\n                                    // xhr.getAllResponseHeaders() method returns all the response headers, separated by CRLF, as a string or null\n                                    // the regex converts the header string into an array of individual headers\n                                    const arr = strTrim(headers).split(/[\\r\\n]+/);\n                                    const responseHeaderMap: any = {};\n                                    arrForEach(arr, (line) => {\n                                        const parts = line.split(\": \");\n                                        const header = parts.shift();\n                                        const value = parts.join(\": \");\n                                        if(_canIncludeHeaders(header)) {\n                                            responseHeaderMap[header] = value;\n                                        }\n                                    });\n\n                                    ajaxResponse.headerMap = responseHeaderMap;\n                                }\n                            }\n\n                            return ajaxResponse;\n                        });\n\n                        let properties;\n                        try {\n                            if (!!_addRequestContext) {\n                                properties = _addRequestContext({status: xhr.status, xhr});\n                            }\n                        } catch (e) {\n                            _throwInternalWarning(_self,\n                                _eInternalMessageId.FailedAddingCustomDefinedRequestContext,\n                                CUSTOM_REQUEST_CONTEXT_ERROR);\n                        }\n\n                        if (!dependency) {\n                            _reportXhrError(null, {\n                                requestSentTime: ajaxData.requestSentTime,\n                                responseFinishedTime: ajaxData.responseFinishedTime\n                            });\n                        }\n\n                        _endSpan(ajaxData, dependency, properties);\n                    } finally {\n                        // cleanup telemetry data\n                        try {\n                            let xhrRequestData = (xhr[AJAX_DATA_CONTAINER] || { i: {}});\n                            let ajaxDataCntr = (xhrRequestData.i || { });\n                            if (ajaxDataCntr[_ajaxDataId]) {\n                                ajaxDataCntr[_ajaxDataId] = null;\n                            }\n                        } catch (e) {\n                            // May throw in environments that prevent extension or freeze xhr\n                        }\n                    }\n                }, (e) => {\n                    _reportXhrError(e, null);\n                });\n            }\n\n            function _getAjaxCorrelationContext(xhr: XMLHttpRequestInstrumented) {\n                try {\n                    const responseHeadersString = xhr.getAllResponseHeaders();\n                    if (responseHeadersString !== null) {\n                        const index = _indexOf(responseHeadersString.toLowerCase(), RequestHeaders[eRequestHeaders.requestContextHeaderLowerCase]);\n                        if (index !== -1) {\n                            const responseHeader = xhr.getResponseHeader(RequestHeaders[eRequestHeaders.requestContextHeader]);\n                            return correlationIdGetCorrelationContext(responseHeader);\n                        }\n                    }\n                } catch (e) {\n                    _throwInternalWarning(_self,\n                        _eInternalMessageId.FailedMonitorAjaxGetCorrelationHeader,\n                        CORRELATION_HEADER_ERROR,\n                        {\n                            ajaxDiagnosticsMessage: _getFailedAjaxDiagnosticsMessage(xhr, _ajaxDataId),\n                            exception: dumpObj(e)\n                        });\n                }\n            }\n\n            function _createMarkId(type:string, ajaxData:IAjaxRecordInternal) {\n                if (ajaxData.requestUrl && _markPrefix && _enableAjaxPerfTracking) {\n                    let performance = getPerformance();\n                    if (performance && isFunction(performance.mark)) {\n                        _markCount++;\n                        let markId = _markPrefix + type + \"#\" + _markCount;\n                        performance.mark(markId);\n                        let entries = performance.getEntriesByName(markId);\n                        if (entries && entries.length === 1) {\n                            ajaxData.perfMark = entries[0] as any;\n                        }\n                    }\n                }\n            }\n\n            function _findPerfResourceEntry(initiatorType:string, ajaxData:IAjaxRecordInternal, trackCallback:() => void, reportError:(e:any) => void): void {\n                let perfMark = ajaxData.perfMark;\n                let performance = getPerformance();\n                let maxAttempts = _maxAjaxPerfLookupAttempts;\n                let retryDelay = _ajaxPerfLookupDelay;\n                let requestUrl = ajaxData.requestUrl;\n                let attempt = 0;\n                (function locateResourceTiming() {\n                    try {\n                        if (performance && perfMark) {\n                            attempt++;\n                            let perfTiming:PerformanceResourceTiming = null;\n                            let entries = performance.getEntries();\n                            for (let lp = entries.length - 1; lp >= 0; lp--) {\n                                let entry:PerformanceEntry = entries[lp];\n                                if (entry) {\n                                    if (entry.entryType === \"resource\") {\n                                        if ((entry as PerformanceResourceTiming).initiatorType === initiatorType &&\n                                                (_indexOf(entry.name, requestUrl) !== -1 || _indexOf(requestUrl, entry.name) !== -1)) {\n\n                                            perfTiming = entry as PerformanceResourceTiming;\n                                        }\n                                    } else if (entry.entryType === \"mark\" && entry.name === perfMark.name) {\n                                        // We hit the start event\n                                        ajaxData.perfTiming = perfTiming;\n                                        break;\n                                    }\n\n                                    if (entry.startTime < perfMark.startTime - 1000) {\n                                        // Fallback to try and reduce the time spent looking for the perf entry\n                                        break;\n                                    }\n                                }\n                            }\n                        }\n\n                        if (!perfMark ||                // - we don't have a perfMark or\n                            ajaxData.perfTiming ||      // - we have not found the perf entry or\n                            attempt >= maxAttempts ||   // - we have tried too many attempts or\n                            ajaxData.async === false) { // - this is a sync request\n\n                            if (perfMark && isFunction(performance.clearMarks)) {\n                                // Remove the mark so we don't fill up the performance resources too much\n                                performance.clearMarks(perfMark.name);\n                            }\n\n                            ajaxData.perfAttempts = attempt;\n\n                            // just continue and report the track event\n                            trackCallback();\n                        } else {\n                            // We need to wait for the browser to populate the window.performance entry\n                            // This needs to be at least 1ms as waiting <= 1 (on firefox) is not enough time for fetch or xhr,\n                            // this is a scheduling issue for the browser implementation\n                            scheduleTimeout(locateResourceTiming, retryDelay);\n                        }\n                    } catch (e) {\n                        reportError(e);\n                    }\n                })();\n            }\n\n            function _createFetchRecord(input?: Request | string, init?: RequestInit): IAjaxRecordInternal {\n                let ajaxData = _startSpan();\n                ajaxData.requestSentTime = dateTimeUtilsNow();\n                ajaxData.errorStatusText = _enableAjaxErrorStatusText;\n\n                let requestUrl: string;\n                if (input instanceof Request) {\n                    requestUrl = (input||{}).url || \"\";\n                } else {\n                    requestUrl = input;\n                }\n                if (requestUrl === \"\" ) {\n                    const location = getLocation();\n                    if (location && location.href) {\n                        requestUrl = strSplit(location.href, \"#\")[0];\n                    }\n                }\n\n                if (_self.core && _self.core.config) {\n                    requestUrl = fieldRedaction(requestUrl, _self.core.config);\n                }\n\n                ajaxData.requestUrl = requestUrl;\n\n                let method = \"GET\";\n                if (init && init.method) {\n                    method = init.method;\n                } else if (input && input instanceof Request) {\n                    method = input.method;\n                }\n                ajaxData.method = method;\n\n                let requestHeaders: any = {};\n                if (_enableRequestHeaderTracking) {\n                    let headers = new Headers((init ? init.headers : 0) || (input instanceof Request ? (input.headers || {}) : {}));\n                    headers.forEach((value, key) => {       // @skip-minify\n                        if (_canIncludeHeaders(key)) {\n                            requestHeaders[key] = value;\n                        }\n                    });\n                }\n\n                ajaxData.requestHeaders = requestHeaders;\n                _createMarkId(STR_FETCH, ajaxData);\n\n                return ajaxData;\n            }\n\n            function _getFailedFetchDiagnosticsMessage(input: Request | Response | string): string {\n                let result: string = \"\";\n                try {\n                    if (!isNullOrUndefined(input)) {\n                        if (typeof (input) === \"string\") {\n                            result += `(url: '${input}')`;\n                        } else {\n                            result += `(url: '${input.url}')`;\n                        }\n                    }\n                } catch (e) {\n                    _throwInternalCritical(_self,\n                        _eInternalMessageId.FailedMonitorAjaxOpen,\n                        \"Failed to grab failed fetch diagnostics message\",\n                        { exception: dumpObj(e) }\n                    );\n                }\n                return result;\n            }\n\n            function _reportFetchMetrics(callDetails: IInstrumentCallDetails, status: number, input: Request, response: Response | string, ajaxData: IAjaxRecordInternal, getResponse:() => IAjaxRecordResponse, properties?: { [key: string]: any }): void {\n                if (!ajaxData) {\n                    return;\n                }\n\n                function _reportFetchError(msgId: _eInternalMessageId, e: any, failedProps?:Object) {\n                    let errorProps = failedProps||{} as any;\n                    errorProps[\"fetchDiagnosticsMessage\"] = _getFailedFetchDiagnosticsMessage(input);\n                    if (e) {\n                        errorProps[\"exception\"]  = dumpObj(e);\n                    }\n\n                    _throwInternalWarning(_self,\n                        msgId,\n                        FAILED_TO_CALCULATE_DURATION_ERROR + \"fetch call\" + ERROR_NOT_SENT,\n                        errorProps\n                    );\n                }\n                ajaxData.responseFinishedTime = dateTimeUtilsNow();\n                ajaxData.status = status;\n\n                _findPerfResourceEntry(STR_FETCH, ajaxData, () => {\n                    const dependency = ajaxData.CreateTrackItem(\"Fetch\", _enableRequestHeaderTracking, getResponse);\n                    \n                    let properties;\n                    try {\n                        if (!!_addRequestContext) {\n                            properties = _addRequestContext({status, request: input, response});\n                        }\n                    } catch (e) {\n                        _throwInternalWarning(_self,\n                            _eInternalMessageId.FailedAddingCustomDefinedRequestContext,\n                            CUSTOM_REQUEST_CONTEXT_ERROR);\n                    }\n                    \n                    if (!dependency) {\n                        _reportFetchError(_eInternalMessageId.FailedMonitorAjaxDur, null,\n                            {\n                                requestSentTime: ajaxData.requestSentTime,\n                                responseFinishedTime: ajaxData.responseFinishedTime\n                            });\n                    }\n\n                    _endSpan(ajaxData, dependency, properties);\n                }, (e) => {\n                    _reportFetchError(_eInternalMessageId.FailedMonitorAjaxGetCorrelationHeader, e, null);\n                });\n            }\n\n            function _getFetchCorrelationContext(response: Response): string {\n                if (response && response.headers) {\n                    try {\n                        const responseHeader: string = response.headers.get(RequestHeaders[eRequestHeaders.requestContextHeader]);\n                        return correlationIdGetCorrelationContext(responseHeader);\n                    } catch (e) {\n                        _throwInternalWarning(_self,\n                            _eInternalMessageId.FailedMonitorAjaxGetCorrelationHeader,\n                            CORRELATION_HEADER_ERROR,\n                            {\n                                fetchDiagnosticsMessage: _getFailedFetchDiagnosticsMessage(response),\n                                exception: dumpObj(e)\n                            });\n                    }\n                }\n            }\n\n            function _reportDependencyInternal(\n                initializers: _IInternalDependencyHandler<DependencyInitializerFunction>[],\n                core: IAppInsightsCore,\n                ajaxData: IAjaxRecordInternal,\n                dependency: IDependencyTelemetry,\n                properties?: { [key: string]: any },\n                systemProperties?: { [key: string]: any }\n            ) {\n            \n                let result = true;\n                var initializersCount = initializers.length;\n                if (initializersCount > 0) {\n                    let details: IDependencyInitializerDetails = {\n                        item: dependency,\n                        properties: properties,\n                        sysProperties: systemProperties,\n                        context: ajaxData ? ajaxData.context : null,\n                        aborted: ajaxData ? !!ajaxData.aborted : false\n                    };\n                \n                    result = _processDependencyContainer(core, initializers, details, \"initializer\");\n                }\n            \n                if (result) {\n                    _self.trackDependencyDataInternal(dependency, properties, systemProperties);\n                }\n            }\n        });\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public processTelemetry(item: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        this.processNext(item, itemCtx);\n    }\n\n    /**\n     * Logs dependency call\n     * @param dependencyData - dependency data object\n     */\n    public trackDependencyData(dependency: IDependencyTelemetry, properties?: { [key: string]: any }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resets the ajax attempts counter. This is typically called on page view to allow a fresh set of ajax calls to be tracked.\n     */\n    public resetAjaxAttempts(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public includeCorrelationHeaders(ajaxData: IAjaxRecordData, input?: Request | string, init?: RequestInit, xhr?: XMLHttpRequestInstrumented): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add an ajax listener which is called just prior to the request being sent and before the correlation headers are added, to allow you\n     * to access the headers and modify the values used to generate the distributed tracing correlation headers.\n     * @param dependencyListener - The Telemetry Initializer function\n     * @returns - A IDependencyListenerHandler to enable the initializer to be removed\n     */\n    public addDependencyListener(dependencyListener: DependencyListenerFunction): IDependencyListenerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add an dependency telemetry initializer callback function to allow populating additional properties or drop the request.\n     * It is called after the dependency call has completed and any available performance details are available. A dependency\n     * initializer is similar to the TelemetryInitializer function but it allows you to block the reporting of the dependency\n     * request so that it doesn't count against the `maxAjaxCallsPerView`.\n     * @param dependencyInitializer - The Dependency Telemetry Initializer function\n     * @returns - A IDependencyInitializerHandler to enable the initializer to be removed\n     */\n    public addDependencyInitializer(dependencyInitializer: DependencyInitializerFunction): IDependencyInitializerHandler {\n        return null;\n    }\n\n    /**\n     * Protected function to allow sub classes the chance to add additional properties to the dependency event\n     * before it's sent. This function calls track, so sub-classes must call this function after they have\n     * populated their properties.\n     * @param dependencyData - dependency data object\n     */\n    protected trackDependencyDataInternal(dependency: IDependencyTelemetry, properties?: { [key: string]: any }, systemProperties?: { [key: string]: any }) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/src/ajaxRecord.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport type { IAjaxRecordInternal } from \"./ajax\";\nimport {\n    Extensions, IDependencyTelemetry, IDiagnosticLogger, IDistributedTraceContext, arrForEach, dataSanitizeUrl, dateTimeUtilsDuration,\n    isNullOrUndefined, isNumber, isString, msToTimeSpan, normalizeJsName, objForEachKey, objKeys, urlGetAbsoluteUrl, urlGetCompleteUrl\n} from \"@microsoft/applicationinsights-core-js\";\nimport { mathRound } from \"@nevware21/ts-utils\";\nimport { STR_DURATION, STR_PROPERTIES } from \"./InternalConstants\";\n\n// Type-only import to avoid circular dependency\nexport interface IAjaxRecordResponse {\n    statusText: string,\n    headerMap: Object,\n    correlationContext: string,\n    type?: string,\n    responseText?: string,\n    response?: Object\n}\n\n/** @ignore */\nfunction _calcPerfDuration(resourceEntry:PerformanceResourceTiming, start:string, end:string) {\n    let result = 0;\n    let from = (resourceEntry as any)[start];\n    let to = (resourceEntry as any)[end];\n    if (from && to) {\n        result = dateTimeUtilsDuration(from, to);\n    }\n\n    return result;\n}\n\n/** @ignore */\nfunction _setPerfDuration(props:any, name:string, resourceEntry:PerformanceResourceTiming, start:string, end:string): number {\n    let result = 0;\n    let value = _calcPerfDuration(resourceEntry, start, end);\n    if (value) {\n        result = _setPerfValue(props, name, msToTimeSpan(value));\n    }\n\n    return result;\n}\n\n/** @ignore */\nfunction _setPerfValue(props:any, name:string, value:any): number {\n    let strPerf = \"ajaxPerf\";\n    let result = 0;\n    if (props && name && value) {\n        let perfData = props[strPerf] = (props[strPerf] || {});\n        perfData[name] = value;\n        result = 1;\n    }\n\n    return result;\n}\n\n/** @ignore */\nfunction _populatePerfData(ajaxData:IAjaxRecordInternal, dependency:IDependencyTelemetry) {\n    /*\n    * https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API/Using_the_Resource_Timing_API\n    *  | -startTime\n    *  | -redirectStart\n    *  |            | -redirectEnd\n    *  |            | | -fetchStart\n    *  |            | |   | -domainLookupStart\n    *  |            | |   |                |- domainLookupEnd\n    *  |            | |   |                | | -connectStart\n    *  |            | |   |                | |  | -secureConnectionStart\n    *  |            | |   |                | |  |        | -connectEnd\n    *  |            | |   |                | |  |        | | -requestStart\n    *  |            | |   |                | |  |        | |           | | -responseStart\n    *  |            | |   |                | |  |        | |           | |            | | -responseEnd\n    *  +------------+-+---+----------------+-+--+--------+-+-----------+-+------------+-+\n    *  |--redirect--| |---|--domainLookup--| |--connect--| |--request--| |--response--| |\n    *  |-------------------networkConnect----------------|\n    *  |                                                   |---------sentRequest--------|\n    *  |------------------------------------perfTotal-----------------------------------|\n    */\n\n    let resourceEntry = ajaxData.perfTiming;\n    let props = dependency.properties || {};\n    let propsSet = 0;\n    let strName = \"name\";\n    let strStart = \"Start\";\n    let strEnd = \"End\";\n    let strDomainLookup = \"domainLookup\";\n    let strConnect = \"connect\";\n    let strRedirect = \"redirect\";\n    let strRequest = \"request\";\n    let strResponse = \"response\";\n    let strStartTime = \"startTime\";\n    let strDomainLookupStart = strDomainLookup + strStart;\n    let strDomainLookupEnd = strDomainLookup + strEnd;\n    let strConnectStart = strConnect + strStart;\n    let strConnectEnd = strConnect + strEnd;\n    let strRequestStart = strRequest + strStart;\n    let strRequestEnd = strRequest + strEnd;\n    let strResponseStart = strResponse + strStart;\n    let strResponseEnd = strResponse + strEnd;\n    let strRedirectStart = strRedirect + strStart;\n    let strRedirectEnd = strRedirect = strEnd;\n    \n    let strTransferSize = \"transferSize\";\n    let strEncodedBodySize = \"encodedBodySize\";\n    let strDecodedBodySize = \"decodedBodySize\";\n    let strServerTiming = \"serverTiming\";\n    \n    if (resourceEntry) {\n        // redirect\n        propsSet |= _setPerfDuration(props, strRedirect, resourceEntry, strRedirectStart, strRedirectEnd);\n\n        // domainLookup\n        propsSet |= _setPerfDuration(props, strDomainLookup, resourceEntry, strDomainLookupStart, strDomainLookupEnd);\n\n        // connect\n        propsSet |= _setPerfDuration(props, strConnect, resourceEntry, strConnectStart, strConnectEnd);\n\n        // request\n        propsSet |= _setPerfDuration(props, strRequest, resourceEntry, strRequestStart, strRequestEnd);\n\n        // response\n        propsSet |= _setPerfDuration(props, strResponse, resourceEntry, strResponseStart, strResponseEnd);\n\n        // Network connection time\n        propsSet |= _setPerfDuration(props, \"networkConnect\", resourceEntry, strStartTime, strConnectEnd);\n\n        // Sent Request\n        propsSet |= _setPerfDuration(props, \"sentRequest\", resourceEntry, strRequestStart, strResponseEnd);\n\n        // PerfTotal / Duration\n        let duration = resourceEntry.duration;\n        if (!duration) {\n            duration = _calcPerfDuration(resourceEntry, strStartTime, strResponseEnd) || 0;\n        }\n\n        propsSet |= _setPerfValue(props, STR_DURATION, duration);\n        propsSet |= _setPerfValue(props, \"perfTotal\", duration);\n\n        var serverTiming = (resourceEntry as any)[strServerTiming];\n        if (serverTiming) {\n            let server: any = {};\n            arrForEach(serverTiming, (value, idx) => {\n                let name = normalizeJsName(value[strName] || \"\" + idx);\n                let newValue = server[name] || {};\n                objForEachKey(value, (key, val: any) => {\n                    if (key !== strName && isString(val) || isNumber(val)) {\n                        if (newValue[key]) {\n                            val = newValue[key] + \";\" + val;\n                        }\n                        if (val || !isString(val)) {\n                            // Only set the value if it has a value and it's not an empty string\n                            newValue[key] = val;\n                        }\n                    }\n                });\n                server[name] = newValue;\n            });\n            propsSet |= _setPerfValue(props, strServerTiming, server);\n        }\n\n        propsSet |= _setPerfValue(props, strTransferSize, (resourceEntry as any)[strTransferSize]);\n        propsSet |= _setPerfValue(props, strEncodedBodySize, (resourceEntry as any)[strEncodedBodySize]);\n        propsSet |= _setPerfValue(props, strDecodedBodySize, (resourceEntry as any)[strDecodedBodySize]);\n    } else {\n        if (ajaxData.perfMark) {\n            propsSet |= _setPerfValue(props, \"missing\", ajaxData.perfAttempts);\n        }\n    }\n\n    if (propsSet) {\n        dependency.properties = props;\n    }\n}\n\n/**\n * Interface defining the XHR monitoring state properties\n */\nexport interface IXHRMonitoringState {\n    openDone: boolean;\n    setRequestHeaderDone: boolean;\n    sendDone: boolean;\n    abortDone: boolean;\n    \n    // True, if onreadyStateChangeCallback function attached to xhr, otherwise false\n    stateChangeAttached: boolean;\n}\n\n/**\n * Factory function to create an XHR monitoring state object\n * @returns An object implementing IXHRMonitoringState interface\n */\nexport function createXHRMonitoringState(): IXHRMonitoringState {\n    return {\n        openDone: false,\n        setRequestHeaderDone: false,\n        sendDone: false,\n        abortDone: false,\n        stateChangeAttached: false\n    };\n}\n\n/**\n * Factory function to create an ajax record that implements IAjaxRecordInternal\n * @param traceCtx - The distributed trace context for the ajax request\n * @param logger - The diagnostic logger instance\n * @returns An object implementing IAjaxRecordInternal interface\n */\nexport function createAjaxRecord(traceCtx: IDistributedTraceContext, logger: IDiagnosticLogger): IAjaxRecordInternal {\n    let _logger: IDiagnosticLogger = logger;\n\n    // Create the ajax record object implementing IAjaxRecordInternal\n    let ajaxRecord: IAjaxRecordInternal = {\n        // Initialize all properties with default values\n        perfMark: null,\n        completed: false,\n        requestHeadersSize: null,\n        requestHeaders: null,\n        responseReceivingDuration: null,\n        callbackDuration: null,\n        ajaxTotalDuration: null,\n        aborted: 0,\n        pageUrl: null,\n        requestUrl: null,\n        requestSize: 0,\n        method: null,\n        status: null,\n        requestSentTime: null,\n        responseStartedTime: null,\n        responseFinishedTime: null,\n        callbackFinishedTime: null,\n        endTime: null,\n        xhrMonitoringState: createXHRMonitoringState(),\n        clientFailure: 0,\n        traceCtx: traceCtx,\n        perfTiming: null,\n\n        getAbsoluteUrl: function(): string {\n            return ajaxRecord.requestUrl ? urlGetAbsoluteUrl(ajaxRecord.requestUrl) : null;\n        },\n\n        getPathName: function(): string {\n            return ajaxRecord.requestUrl ? dataSanitizeUrl(_logger, urlGetCompleteUrl(ajaxRecord.method, ajaxRecord.requestUrl)) : null;\n        },\n\n        CreateTrackItem: function(ajaxType: string, enableRequestHeaderTracking: boolean, getResponse: () => IAjaxRecordResponse): IDependencyTelemetry {\n            // round to 3 decimal points\n            ajaxRecord.ajaxTotalDuration = mathRound(dateTimeUtilsDuration(ajaxRecord.requestSentTime, ajaxRecord.responseFinishedTime) * 1000) / 1000;\n            if (ajaxRecord.ajaxTotalDuration < 0) {\n                return null;\n            }\n\n            let dependency = {\n                // Always use the traceId and spanId from the traceCtx, this is the same as the\n                // traceId and spanId used to create the ajaxRecord, this is to ensure that\n                // the traceId and spanId are always the same for the ajaxRecord and the dependency\n                // This is important for the distributed tracing to work correctly\n                id: \"|\" + traceCtx.traceId + \".\" + traceCtx.spanId,\n                target: ajaxRecord.getAbsoluteUrl(),\n                name: ajaxRecord.getPathName(),\n                type: ajaxType,\n                startTime: null,\n                duration: ajaxRecord.ajaxTotalDuration,\n                success: (+(ajaxRecord.status)) >= 200 && (+(ajaxRecord.status)) < 400,\n                responseCode: (+(ajaxRecord.status)),\n                [STR_PROPERTIES]: { HttpMethod: ajaxRecord.method }\n            } as IDependencyTelemetry;\n\n            let props = dependency[STR_PROPERTIES];\n            if (ajaxRecord.aborted) {\n                props.aborted = true;\n            }\n\n            if (ajaxRecord.requestSentTime) {\n                // Set the correct dependency start time\n                dependency.startTime = new Date();\n                dependency.startTime.setTime(ajaxRecord.requestSentTime);\n            }\n\n            // Add Ajax perf details if available\n            _populatePerfData(this, dependency);\n\n            if (enableRequestHeaderTracking) {\n                if (objKeys(ajaxRecord.requestHeaders).length > 0) {\n                    props.requestHeaders = ajaxRecord.requestHeaders;\n                }\n            }\n\n            if (getResponse) {\n                let response: IAjaxRecordResponse = getResponse();\n                if (response) {\n\n                    // enrich dependency target with correlation context from the server\n                    const correlationContext = response.correlationContext;\n                    if (correlationContext) {\n                        dependency.correlationContext = /* dependency.target + \" | \" + */ correlationContext;\n                    }\n\n                    if (response.headerMap) {\n                        if (objKeys(response.headerMap).length > 0) {\n                            props.responseHeaders = response.headerMap;\n                        }\n                    }\n\n                    if (ajaxRecord.errorStatusText) {\n                        if ((+(ajaxRecord.status)) >= 400) {\n                            const responseType = response.type;\n                            if (responseType === \"\" || responseType === \"text\") {\n                                props.responseText = response.responseText ? response.statusText + \" - \" + response.responseText : response.statusText;\n                            }\n                            if (responseType === \"json\") {\n                                props.responseText = response.response ? response.statusText + \" - \" + JSON.stringify(response.response) : response.statusText;\n                            }\n                        } else if (ajaxRecord.status === 0) {\n                            props.responseText = response.statusText || \"\";\n                        }\n                    }\n                }\n            }\n\n            return dependency;\n        },\n\n        getPartAProps: function(): { [key: string]: any } {\n            let partA: { [key: string]: any } = null;\n\n            let parentCtx = ajaxRecord.traceCtx.parentCtx;\n            if (parentCtx && (parentCtx.traceId || parentCtx.spanId)) {\n                partA = {};\n                let traceExt = partA[Extensions.TraceExt] = {\n                    traceID: parentCtx.traceId,\n                    parentID: parentCtx.spanId\n                } as { [key: string]: any };\n\n                if (!isNullOrUndefined(parentCtx.traceFlags)) {\n                    traceExt.traceFlags = parentCtx.traceFlags;\n                }\n            }\n\n            return partA;\n        }\n    };\n\n    return ajaxRecord;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/src/applicationinsights-dependencies-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport {\n    AjaxMonitor as AjaxPlugin, IDependenciesPlugin, XMLHttpRequestData, XMLHttpRequestInstrumented, IInstrumentationRequirements, DfltAjaxCorrelationHeaderExDomains, IAjaxMonitorPlugin, IAjaxRecordData\n} from \"./ajax\";\nexport { IDependencyHandler, IDependencyListenerHandler, IDependencyListenerDetails, DependencyListenerFunction } from \"./DependencyListener\";\nexport { IDependencyInitializerHandler, IDependencyInitializerDetails, DependencyInitializerFunction } from \"./DependencyInitializer\";\nexport { ICorrelationConfig, eDistributedTracingModes, DistributedTracingModes } from \"@microsoft/applicationinsights-core-js\";\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"prefer-conditional-expression\": false\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-dependencies-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-dependencies-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-dependencies-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-dependencies-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-dependencies-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Operating System Plugin\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-osplugin-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-osplugin-js)\n\nMicrosoft Application Insights OS Plugin\n\n## Description\n1DS OS Plugin provides the functionality to retrieve customers system version, such as \"Windows 11\".\n\n## NPM Setup (ignore if using Snippet Setup)\n\nInstall npm package:\n\n```bash\nnpm install --save @microsoft/applicationinsights-osplugin-js @microsoft/applicationinsights-web\n```\n\n```js\n\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport {OsPlugin} from '@microsoft/applicationinsights-osplugin-js';\n\nconst osPlugin = new OsPlugin();\nconst appInsights = new ApplicationInsights({\n  config: {\n    connectionString: \"YOUR_CONNECTION_STRING\",\n    extensionConfig:{\n      [osPlugin.identifier]: {\n        maxTimeout: 10000,\n        mergeOsNameVersion: true\n      }},\n    extensions: [osPlugin]\n  }\n});\nappInsights.loadAppInsights();\nappInsights.trackEvent({name: \"testEvent\", properties: {testProperty: \"testValue\"}});\n\n```\n## [Configuration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-osplugin-js/interfaces/IOSPluginConfiguration.html)\n\n| Name | Type | Default | Description |\n|------|------|---------|-------------|\n| [maxTimeout](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-osplugin-js/interfaces/IOSPluginConfiguration.html#maxTimeout) | number[Optional]| 200 | Maximum time to wait for the OS plugin to return the OS information |\n| [mergeOsNameVersion](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-osplugin-js/interfaces/IOSPluginConfiguration.html#mergeOsNameVersion) | boolean[Optional] | false | Whether to merge the OS name and version into one field change details. |\n\n\n## Run unit tests:\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/Tests/Unit/src/OsPluginTest.ts",
    "content": "/**\n * @copyright Microsoft 2024\n */\n\nimport { Assert, AITestClass } from '@microsoft/ai-test-framework';\nimport { IOSPluginConfiguration, OsPlugin } from '../../../src/applicationinsights-osplugin-js';\nimport { createAsyncPromise, ResolvePromiseHandler, RejectPromiseHandler } from \"@nevware21/ts-async\";\nimport {getWindow, AppInsightsCore, IChannelControls, ITelemetryPlugin,\n    IConfiguration, ITelemetryItem, __getRegisteredEvents} from \"@microsoft/applicationinsights-core-js\";\n\nconst defaultmaxTimeout = 5000;\nconst _platformVersion =  {\"brands\":[{\"brand\":\"Chromium\",\"version\":\"122\"}, \n{\"brand\":\"Microsoft Edge\",\"version\":\"122\"}],\"mobile\":false,\"platform\":\"Windows\",\n\"platformVersion\":\"15.0.0\"};\n\ninterface ITestConfig extends IConfiguration {\n    endpointUrl?: string;\n    disableFlushOnUnload?: boolean;\n    isStorageUseDisabled?: boolean;\n}\n\ninterface IOsState {\n    platform?: string | null;\n    platformVersion?: number | null;\n}\n\ninterface IDbgTargets {\n    osState: IOsState;\n    queue: Array<{ item: ITelemetryItem }>;\n    hasPendingTimeout: boolean;\n}\n\ninterface CustomNavigator extends Navigator {\n    userAgentData?: {\n        getHighEntropyValues?: (args: any[]) => Promise<any>;\n    };\n}\n\nexport class OsPluginTest extends AITestClass {\n\n    private _config: ITestConfig;\n    private _plugin: OsPlugin;\n    private _core: AppInsightsCore;\n    private _osConfig: IOSPluginConfiguration = {\n        maxTimeout: 6000, // set a big number to avoid timeout for test\n        mergeOsNameVersion: false\n    };\n    private _testChannelPlugin: TestChannelPlugin;\n\n    private _resolvedGetHighEntrophyPromise: ResolvePromiseHandler<any> | undefined;\n    private _rejectedGetHighEntrophyPromise: RejectPromiseHandler | undefined;\n    private _channelSpy: any;\n\n    public testInitialize() {\n        this._core = new AppInsightsCore();\n        this._plugin = new OsPlugin();\n        this._testChannelPlugin = new TestChannelPlugin();\n        this._config = {\n            instrumentationKey: 'testIkey',\n            endpointUrl: 'testEndpoint',\n            extensionConfig: []\n        };\n\n        let navigator = {\n            userAgentData: {\n                getHighEntropyValues: (args) => {\n                    if (args[0] === \"platformVersion\") {\n                        return createAsyncPromise((resolve, reject) => {\n                            this._resolvedGetHighEntrophyPromise = resolve;\n                            this._rejectedGetHighEntrophyPromise = reject;\n                        });\n                    }\n                }\n            }\n        } as CustomNavigator;\n\n        this.setNavigator(navigator, true);\n\n        this._channelSpy = this.sandbox.spy(this._testChannelPlugin, 'processTelemetry');\n\n    }\n\n    private _getDbgTargets(): IDbgTargets {\n        let dbgTargets = (this._plugin as any)[\"_getDbgPlgTargets\"]();\n\n        return {\n            osState: dbgTargets[0],\n            queue: dbgTargets[1],\n            hasPendingTimeout: dbgTargets[2]\n        };\n    }\n\n    private _resolveHighEntropy(result: any) {\n        Assert.ok(!!this._resolvedGetHighEntrophyPromise, \"expected getHighEntropyValues() to be pending\");\n        this._resolvedGetHighEntrophyPromise!(result);\n    }\n\n    private _rejectHighEntropy(error: Error) {\n        Assert.ok(!!this._rejectedGetHighEntrophyPromise, \"expected getHighEntropyValues() to be pending\");\n        this._rejectedGetHighEntrophyPromise!(error);\n    }\n\n    private _createTestEvent(): ITelemetryItem {\n        return {\n            name: 'testEvent',\n            baseType: 'testBaseType',\n            baseData: {}\n        } as ITelemetryItem;\n    }\n\n    private _createPageHideEvent(): Event {\n        if (typeof Event !== \"undefined\") {\n            return new Event(\"pagehide\");\n        }\n\n        let doc = document as any;\n        let evt = doc.createEvent(\"Event\");\n        evt.initEvent(\"pagehide\", true, true);\n        return evt;\n    }\n\n    private _getRegisteredUnloadState() {\n        let window = getWindow();\n        let unloadPresent = false;\n        let pageHidePresent = false;\n        let visibilityChangePresent = false;\n\n        let theEvents = __getRegisteredEvents(window);\n        theEvents.forEach((theEvent) => {\n            if (theEvent.name.startsWith(\"unload\")) {\n                unloadPresent = true;\n            }\n\n            if (theEvent.name.startsWith(\"pagehide\")) {\n                pageHidePresent = true;\n            }\n\n            if (theEvent.name.startsWith(\"visibilitychange\")) {\n                visibilityChangePresent = true;\n            }\n        });\n\n        return {\n            unloadPresent: unloadPresent,\n            pageHidePresent: pageHidePresent,\n            visibilityChangePresent: visibilityChangePresent\n        };\n    }\n\n    public testFinishedCleanup(): void {\n        let window = getWindow();\n        let sessionStorage = window.sessionStorage;\n        sessionStorage.clear();\n        if (this._core && this._core.isInitialized()) {\n            this._core.unload(false);\n        }\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"OsPlugin: Dynamic and Default Configuration Tests\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = this._osConfig;\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                this.clock.tick(100);\n                Assert.deepEqual(this._osConfig.maxTimeout, this._core.config.extensionConfig![this._plugin.identifier].maxTimeout, \"maxTimeout should be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: initialize starts OS retrieval before first telemetry\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                config.extensionConfig = config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = this._osConfig;\n\n                this._core.initialize(config, [this._plugin, this._testChannelPlugin]);\n\n                let dbgTargets = this._getDbgTargets();\n                Assert.equal(dbgTargets.hasPendingTimeout, true, \"OS retrieval timer should start during initialize\");\n                Assert.equal(dbgTargets.queue.length, 0, \"No telemetry should be queued before track() is called\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: Events will be queued if OS is not available and will be sent after timeout\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().queue[0].item.name, event.name);\n                this.clock.tick(defaultmaxTimeout);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._channelSpy.called, true);\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: Can get OS version from user agent and release the queue\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = this._osConfig;\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().queue[0].item.name, event.name);\n                this._resolveHighEntropy(_platformVersion);\n                this.clock.tick(1);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._channelSpy.called, true);\n                let telemetry = this._channelSpy.getCall(0).args[0];\n                console.log(\"telemetry\", JSON.stringify(telemetry));\n                Assert.equal(JSON.stringify(telemetry).includes(\"osVer\"), true, \"before timeout, get os version\");\n                Assert.deepEqual(telemetry.ext.os.os, _platformVersion.platform, \"OS should be changed\");\n                Assert.deepEqual(telemetry.ext.os.osVer, 11, \"windows 11 is detected\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: Get reject from navigator, queue is released\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = this._osConfig;\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().queue[0].item.name, event.name);\n                this._rejectHighEntropy(new Error(\"error\"));\n                this.clock.tick(1);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: Get OS version wait for too long, timeout will release the queue\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = {\n                    maxTimeout: 1000\n                };\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().queue[0].item.name, event.name);\n                this.clock.tick(500);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                this.clock.tick(500);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._channelSpy.called, true);\n                let telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.equal(JSON.stringify(telemetry).includes(\"osVer\"), false, \"timeout would not get os version\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: pagehide releases queued telemetry before timeout\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                config.extensionConfig = config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = this._osConfig;\n\n                this._core.initialize(config, [this._plugin, this._testChannelPlugin]);\n\n                let registeredEvents = this._getRegisteredUnloadState();\n\n                Assert.ok(registeredEvents.unloadPresent, \"unload listener should be registered while OS lookup is pending\");\n                Assert.ok(registeredEvents.pageHidePresent, \"pagehide listener should be registered while OS lookup is pending\");\n                Assert.ok(registeredEvents.visibilityChangePresent, \"visibilitychange listener should be registered while OS lookup is pending\");\n\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false, \"event should remain queued before pagehide\");\n                Assert.equal(this._getDbgTargets().queue.length, 1, \"one event should be queued\");\n\n                let window = getWindow();\n                window.dispatchEvent(this._createPageHideEvent());\n\n                Assert.equal(this._getDbgTargets().queue.length, 0, \"queue should be released on pagehide\");\n                Assert.equal(this._channelSpy.called, true, \"queued event should be sent on pagehide\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: event handlers are removed after getHighEntropyValues resolves\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                config.extensionConfig = config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = this._osConfig;\n\n                this._core.initialize(config, [this._plugin, this._testChannelPlugin]);\n\n                let registeredEvents = this._getRegisteredUnloadState();\n                Assert.ok(registeredEvents.unloadPresent, \"unload listener should be registered before OS lookup completes\");\n                Assert.ok(registeredEvents.pageHidePresent, \"pagehide listener should be registered before OS lookup completes\");\n                Assert.ok(registeredEvents.visibilityChangePresent, \"visibilitychange listener should be registered before OS lookup completes\");\n\n                this._core.track(this._createTestEvent());\n                this._resolveHighEntropy(_platformVersion);\n                this.clock.tick(1);\n\n                registeredEvents = this._getRegisteredUnloadState();\n                Assert.ok(!registeredEvents.unloadPresent, \"unload listener should be removed after OS lookup completes\");\n                Assert.ok(!registeredEvents.pageHidePresent, \"pagehide listener should be removed after OS lookup completes\");\n                Assert.ok(!registeredEvents.visibilityChangePresent, \"visibilitychange listener should be removed after OS lookup completes\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: disableFlushOnUnload does not register unload listeners\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                config.disableFlushOnUnload = true;\n                config.extensionConfig = config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = this._osConfig;\n\n                this._core.initialize(config, [this._plugin, this._testChannelPlugin]);\n\n                let registeredEvents = this._getRegisteredUnloadState();\n\n                Assert.ok(!registeredEvents.unloadPresent, \"unload listener should not be registered when disableFlushOnUnload is true\");\n                Assert.ok(!registeredEvents.pageHidePresent, \"pagehide listener should not be registered when disableFlushOnUnload is true\");\n                Assert.ok(!registeredEvents.visibilityChangePresent, \"visibilitychange listener should not be registered when disableFlushOnUnload is true\");\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true, \"OS lookup should still start when unload flushing is disabled\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: If first telemetry didn't get the OS version, the following telemetry will not try again\",\n            useFakeTimers: true,\n            test: () => {\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = {\n                    maxTimeout: 1000,\n                    mergeOsNameVersion: false\n                };\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().queue[0].item.name, event.name);\n                this.clock.tick(1200);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._channelSpy.called, true);\n                let telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.equal(JSON.stringify(telemetry).includes(\"osVer\"), false, \"timeout would not get os version\");\n\n                // send another event\n                this._core.track(event);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                this._resolveHighEntropy(_platformVersion);\n                this.clock.tick(1);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._channelSpy.called, true);\n                telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.equal(JSON.stringify(telemetry).includes(\"osVer\"), false, \"second event should not attempt to get os version\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: cached OS is used immediately during initialize\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let sessionStorage = window.sessionStorage;\n                sessionStorage.setItem(\"ai_osplugin\", JSON.stringify({ platform: \"Android\", platformVersion: 14 }));\n\n                let config = this._config;\n                config.extensionConfig = config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = {\n                    maxTimeout: 1000,\n                    mergeOsNameVersion: false\n                };\n\n                this._core.initialize(config, [this._plugin, this._testChannelPlugin]);\n\n                let registeredEvents = this._getRegisteredUnloadState();\n                Assert.ok(!registeredEvents.unloadPresent, \"cached OS should not register unload listeners\");\n                Assert.ok(!registeredEvents.pageHidePresent, \"cached OS should not register pagehide listeners\");\n                Assert.ok(!registeredEvents.visibilityChangePresent, \"cached OS should not register visibilitychange listeners\");\n\n                let dbgTargets = this._getDbgTargets();\n                Assert.equal(dbgTargets.hasPendingTimeout, false, \"cached OS should avoid startup lookup\");\n                Assert.deepEqual(dbgTargets.osState.platform, \"Android\", \"cached platform should be loaded\");\n                Assert.deepEqual(dbgTargets.osState.platformVersion, 14, \"cached platform version should be loaded\");\n\n                this._core.track(this._createTestEvent());\n\n                Assert.equal(this._channelSpy.called, true, \"event should be sent immediately from cached OS\");\n                let telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.deepEqual(telemetry.ext.os.os, \"Android\", \"cached OS should be applied to telemetry\");\n                Assert.deepEqual(telemetry.ext.os.osVer, 14, \"cached OS version should be applied to telemetry\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: storage disabled ignores cached OS and does not overwrite session storage\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let sessionStorage = window.sessionStorage;\n                sessionStorage.setItem(\"ai_osplugin\", JSON.stringify({ platform: \"CachedOS\", platformVersion: 99 }));\n\n                let config = this._config;\n                config.isStorageUseDisabled = true;\n                config.extensionConfig = config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = {\n                    maxTimeout: 1000,\n                    mergeOsNameVersion: false\n                };\n\n                this._core.initialize(config, [this._plugin, this._testChannelPlugin]);\n                this._core.track(this._createTestEvent());\n\n                Assert.equal(this._channelSpy.called, false, \"cached OS should not be used when storage is disabled\");\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true, \"OS lookup should still start when storage is disabled\");\n                Assert.equal(this._getDbgTargets().queue.length, 1, \"event should remain queued until lookup resolves\");\n\n                this._resolveHighEntropy(_platformVersion);\n                this.clock.tick(1);\n\n                Assert.equal(this._channelSpy.called, true, \"queued event should be released after lookup resolves\");\n                let telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.deepEqual(telemetry.ext.os.os, _platformVersion.platform, \"navigator OS should be applied\");\n                Assert.deepEqual(telemetry.ext.os.osVer, 11, \"navigator OS version should be applied\");\n                Assert.equal(sessionStorage.getItem(\"ai_osplugin\"), JSON.stringify({ platform: \"CachedOS\", platformVersion: 99 }), \"storage-disabled mode should not overwrite session storage\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: If first telemetryget the OS version, the following telemetry do not need to try again\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let sessionStorage = window.sessionStorage;\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = {\n                    maxTimeout: 1000,\n                    mergeOsNameVersion: false\n                };\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().queue[0].item.name, event.name);\n                this._resolveHighEntropy(_platformVersion);\n                this.clock.tick(1);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._channelSpy.called, true);\n                let telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.deepEqual(telemetry.ext.os.os, _platformVersion.platform, \"OS should be changed\");\n                Assert.deepEqual(telemetry.ext.os.osVer, 11, \"windows 11 is detected\");\n                let storedOs = JSON.parse(sessionStorage.getItem(\"ai_osplugin\") || \"{}\");\n                QUnit.assert.equal(storedOs.platform, _platformVersion.platform, \"os is stored in session storage\");\n                QUnit.assert.equal(storedOs.platformVersion, 11, \"os ver is stored in session storage\");\n                // send another event\n                this._core.track(event);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._channelSpy.called, true);\n                telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.equal(JSON.stringify(telemetry).includes(\"osVer\"), true, \"before timeout, get os version\");\n                Assert.deepEqual(telemetry.ext.os.os, _platformVersion.platform, \"OS should be changed\");\n                Assert.deepEqual(telemetry.ext.os.osVer, 11, \"Windows 11 is detected\");\n            }\n        });\n\n        this.testCase({\n            name: \"OsPlugin: test merged version\",\n            useFakeTimers: true,\n            test: () => {\n                let window = getWindow();\n                let sessionStorage = window.sessionStorage;\n                QUnit.assert.ok(sessionStorage, \"sessionStorage API is supported\");\n                sessionStorage.clear();\n                let config = this._config;\n                let plugin = this._plugin;\n                config.extensionConfig = this._config.extensionConfig || {};\n                config.extensionConfig[this._plugin.identifier] = {\n                    maxTimeout: 1000,\n                    mergeOsNameVersion: true\n                };\n                this._core.initialize(config, [plugin, this._testChannelPlugin]);\n                let event = this._createTestEvent();\n                this._core.track(event);\n                Assert.equal(this._channelSpy.called, false);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, true);\n                Assert.equal(this._getDbgTargets().queue.length, 1);\n                Assert.equal(this._getDbgTargets().queue[0].item.name, event.name);\n                this._resolveHighEntropy(_platformVersion);\n                this.clock.tick(1);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._channelSpy.called, true);\n                let telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.deepEqual(telemetry.ext.os.osVer, \"Windows11\", \"windows 11 is detected\");\n                let storedOs = JSON.parse(sessionStorage.getItem(\"ai_osplugin\") || \"{}\");\n                QUnit.assert.equal(storedOs.platform, _platformVersion.platform, \"os is stored in session storage\");\n                QUnit.assert.equal(storedOs.platformVersion, 11, \"os ver is stored in session storage\");\n                // send another event\n                this._core.track(event);\n                Assert.equal(this._getDbgTargets().hasPendingTimeout, false);\n                Assert.equal(this._getDbgTargets().queue.length, 0);\n                Assert.equal(this._channelSpy.called, true);\n                telemetry = this._channelSpy.getCall(0).args[0];\n                Assert.equal(JSON.stringify(telemetry).includes(\"osVer\"), true, \"before timeout, get os version\");\n                Assert.deepEqual(telemetry.ext.os.osVer, \"Windows11\", \"windows 11 is detected\");\n            }\n        });\n    }\n}\n\nclass TestChannelPlugin implements IChannelControls {\n\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry;\n\n    public identifier = \"Sender\";\n\n    setNextPlugin(next: ITelemetryPlugin) {\n        // no next setup\n    }\n\n    public priority: number = 1001;\n\n    public initialize = (config: IConfiguration) => {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/Tests/Unit/src/applicationinsights-osplugin.tests.ts",
    "content": "import { OsPluginTest } from './OsPluginTest';\n\nexport function runTests() {\n    new OsPluginTest().registerTests();\n}\n\nrunTests();"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/Tests/UnitTests.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript API</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/applicationinsights-osplugin.tests\", \"./Unit/dist/applicationinsights-osplugin.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-osplugin-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-osplugin-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights OS Plugin\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-osplugin-js.js\",\n    \"module\": \"dist-es5/applicationinsights-osplugin-js.js\",\n    \"types\": \"types/applicationinsights-osplugin-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-osplugin-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt osplugin\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt osplugintests\",\n        \"mintest\": \"grunt osplugin-mintests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights osplugin plugin\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt osplugin-min\",\n        \"ai-restore\": \"grunt osplugin-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@types/sinon\": \"4.3.3\",\n        \"grunt\": \"^1.6.1\",\n        \"sinon\": \"^7.3.1\",\n        \"globby\": \"^11.0.0\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"typedoc\": \"^0.26.6\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"applicationinsights-osplugin-js\";\nconst browserOutputName = \"ai.osplugin\";\nconst entryPointName = \"applicationinsights-osplugin-js\";\nconst outputName = \"applicationinsights-osplugin-js\"; \n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - OS Plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ outputName ]);\n"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/src/DataModels.ts",
    "content": "/**\n* DataModels.ts\n* @author Siyu Niu (siyuniu)\n* @copyright Microsoft 2024\n* File containing the interfaces for OS Plugin SDK.\n*/\n\n/**\n * Interface for OS Plugin SDK config\n * \\@maxTimeout: Maximum time to wait for the OS plugin to return the OS information\n * \\@mergeOsNameVersion: Whether to merge the OS name and version into one field\n */\nexport interface IOSPluginConfiguration {\n    /**\n     * Maximum time to wait for the OS plugin to return the OS information\n     * Default: 200\n     */\n    maxTimeout?: number;\n    /**\n     * Whether to merge the OS name and version into one field\n     * Default: undefined\n     */\n    mergeOsNameVersion?: boolean;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/src/OsPlugin.ts",
    "content": "/**\n* OsPlugin.ts\n* @author Siyu Niu (siyuniu)\n* @copyright Microsoft 2024\n*/\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, Extensions, IAppInsightsCore, IConfig, IConfigDefaults, IConfiguration, IPlugin, IProcessTelemetryContext,\n    IProcessTelemetryUnloadContext, ITelemetryItem, ITelemetryUnloadState, _eInternalMessageId, _throwInternal, addPageHideEventListener,\n    addPageUnloadEventListener, arrForEach, createProcessTelemetryContext, createUniqueNamespace, eLoggingSeverity, getSetValue,\n    mergeEvtNamespace, onConfigChange, removePageHideEventListener, removePageUnloadEventListener, safeGetLogger, setValue,\n    utlGetSessionStorage, utlSetSessionStorage\n} from \"@microsoft/applicationinsights-core-js\";\nimport { IPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { ITimerHandler, asString, fnCall, getNavigator, isString, objDeepFreeze, scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { IOSPluginConfiguration } from \"./DataModels\";\n\nconst defaultMaxTimeout = 200;\nconst strExt = \"ext\";\n\ninterface platformVersionInterface {\n    platform?: string,\n    platformVersion?: string\n}\n\ninterface UserAgentHighEntropyData {\n    platformVersion: platformVersionInterface\n}\n\ninterface ModernNavigator extends Navigator {\n    userAgentData?: {\n      getHighEntropyValues?: (fields: [\"platformVersion\"]) => IPromise<UserAgentHighEntropyData>;\n    };\n}\n\nconst defaultOSConfig: IConfigDefaults<IOSPluginConfiguration> = objDeepFreeze({\n    maxTimeout: defaultMaxTimeout,\n    mergeOsNameVersion: undefined\n});\n\ninterface IDelayedEvent {\n    ctx: IProcessTelemetryContext;\n    item: ITelemetryItem;\n}\n\nexport class OsPlugin extends BaseTelemetryPlugin {\n    public identifier = \"OsPlugin\";\n    public priority = 195;              // Note: we want this to run after the AnalyticsPlugin so that it correctly sets whether we are allowed to use session storage\n    public version = \"#version#\";\n\n    constructor() {\n        super();\n        let _core: IAppInsightsCore;\n        let _ocConfig: IOSPluginConfiguration;\n        let _getOSTimeout: ITimerHandler | null;\n\n        let _fetchedFullVersion: boolean;\n        let _mergeOsNameVersion: boolean;\n\n        let _eventQueue: IDelayedEvent[];\n        let _evtNamespace: string | string[];\n        let _excludePageUnloadEvents: string[] | null;\n        let _disableFlushOnUnload: boolean;\n        let _addedUnloadEvents: boolean;\n\n        let _os: string | undefined | null;\n        let _osVer: number | undefined | null;\n    \n        dynamicProto(OsPlugin, this, (_self, _base) => {\n\n            _initDefaults();\n\n            _self.initialize = (coreConfig: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[]) => {\n                let _self = this;\n                _core = core;\n                super.initialize(coreConfig, core, extensions);\n                let identifier = _self.identifier;\n\n                _evtNamespace = mergeEvtNamespace(createUniqueNamespace(identifier), core.evtNamespace && core.evtNamespace());\n                _fetchedFullVersion = _fetchCachedOSVersion(coreConfig);\n\n                _self._addHook(onConfigChange(coreConfig, (details)=> {\n                    let coreConfig = details.cfg;\n                    let ctx = createProcessTelemetryContext(null, coreConfig, core);\n\n                    _ocConfig = ctx.getExtCfg<IOSPluginConfiguration>(identifier, defaultOSConfig);\n\n                    if (_ocConfig.mergeOsNameVersion !== undefined) {\n                        _mergeOsNameVersion = _ocConfig.mergeOsNameVersion;\n                    } else if (core.getPlugin(\"Sender\").plugin){\n                        _mergeOsNameVersion = true;\n                    } else {\n                        _mergeOsNameVersion = false;\n                    }\n\n                    let excludePageUnloadEvents = coreConfig.disablePageUnloadEvents || [];\n                    let disableFlushOnUnload = coreConfig.disableFlushOnUnload || false;\n                    let removeEvents = _excludePageUnloadEvents && _excludePageUnloadEvents !== excludePageUnloadEvents;\n\n                    if (_disableFlushOnUnload !== disableFlushOnUnload) {\n                        removeEvents = true;\n                    }\n\n                    if (removeEvents && _addedUnloadEvents) {\n                        _removeUnloadHandlers();\n                        _excludePageUnloadEvents = null;\n                    }\n                \n                    if (!_excludePageUnloadEvents && !disableFlushOnUnload) {\n                        _addUnloadHandlers(excludePageUnloadEvents);\n                    }\n\n                    _excludePageUnloadEvents = excludePageUnloadEvents;\n                    _disableFlushOnUnload = disableFlushOnUnload;\n                }));\n\n                // Automatically start retrieving OS version without waiting for the first telemetry event\n                if (!_fetchedFullVersion) {\n                    // Start Requesting OS version process\n                    _startRetrieveOsVersion(_ocConfig.maxTimeout as number);\n                }\n            };\n        \n            _self.processTelemetry = (event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                itemCtx = _self._getTelCtx(itemCtx);\n\n                if (_getOSTimeout) {\n                    // We have a timer waiting for the OS version to be retrieved, queue the event\n                    _eventQueue.push({\n                        ctx: itemCtx,\n                        item: event\n                    });\n                } else {\n                    _updateTeleItemWithOs(event);\n                    _self.processNext(event, itemCtx);\n                }\n            };\n\n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _completeOsRetrieve();\n                _removeUnloadHandlers();\n\n                // Just register to remove all events associated with this namespace\n                _initDefaults();\n            };\n\n            function _fetchCachedOSVersion(coreConfig: IConfiguration & IConfig) {\n                let fetched = false;\n\n                // Special case check for if the runtime doesn't include the AnalyticsPlugin\n                if(coreConfig.isStorageUseDisabled !== true) {\n                    try {\n                        let platformVersionResponse: platformVersionInterface = JSON.parse(utlGetSessionStorage(safeGetLogger(_core), \"ai_osplugin\")) as platformVersionInterface;\n                        if (platformVersionResponse) {\n                            _os = platformVersionResponse.platform;\n                            if (platformVersionResponse.platformVersion) {\n                                let ver = parseInt(platformVersionResponse.platformVersion);\n                                if (!isNaN(ver)) {\n                                    _osVer = ver;\n                                }\n                            }\n\n                            fetched = !!(_os && _osVer);\n                        }\n                    } catch (error) {\n                        // do nothing\n                    }\n                }\n\n                return fetched;\n            }\n\n            function _storeCachedOSVersion(coreConfig: IConfiguration & IConfig) {\n                // Special case check for if the runtime doesn't include the AnalyticsPlugin\n                if(coreConfig.isStorageUseDisabled !== true) {\n                    try {\n                        utlSetSessionStorage(safeGetLogger(_core), \"ai_osplugin\", JSON.stringify({platform: _os, platformVersion: _osVer}));\n                    } catch (error) {\n                        // do nothing\n                    }\n                }\n            }\n\n            function _addUnloadHandlers(excludePageUnloadEvents?: string[]) {\n                function _unloading() {\n                    _releaseEventQueue();\n                    _removeUnloadHandlers();\n                }\n\n                // Only try and add unload handlers if we haven't already fetched the OS version\n                if (!_addedUnloadEvents && !_fetchedFullVersion) {\n                    // If page is closed release queue\n                    addPageUnloadEventListener(_unloading, excludePageUnloadEvents, _evtNamespace);\n                    addPageHideEventListener(_unloading, excludePageUnloadEvents, _evtNamespace);\n                    _addedUnloadEvents = true;\n                }\n            }\n\n            function _removeUnloadHandlers() {\n                if (_addedUnloadEvents) {\n                    removePageUnloadEventListener(null, _evtNamespace);\n                    removePageHideEventListener(null, _evtNamespace);\n                    _addedUnloadEvents = false;\n                }\n            }\n\n            /**\n             * Wait for the response from the browser for the OS version and store info in the session storage\n             */\n            function _startRetrieveOsVersion(maxTimeout: number) {\n                if (_core && !_getOSTimeout) {\n                    let nav: ModernNavigator | undefined = getNavigator() as ModernNavigator | undefined;\n                    let userAgentData = (nav || {}).userAgentData;\n                    if (userAgentData) {\n                        const getHighEntropyValues = userAgentData.getHighEntropyValues;\n                        if (getHighEntropyValues) {\n                            // Timeout request if it takes more than 200 milliseconds (by default)\n                            _getOSTimeout = scheduleTimeout(() => {\n                                _completeOsRetrieve();\n                            }, maxTimeout);\n\n                            doAwaitResponse(fnCall(getHighEntropyValues, userAgentData, [\"platformVersion\"]), (response: any) => {\n                                // Always mark as fetched regardless of success or failure\n                                _fetchedFullVersion = true;\n                                try {\n                                    if (!response.rejected) {\n                                        let platformVersionResponse = response.value;\n                                        if (platformVersionResponse.platformVersion && platformVersionResponse.platform) {\n                                            _os = platformVersionResponse.platform;\n                                            _osVer = parseInt(platformVersionResponse.platformVersion);\n                                            if (_os === \"Windows\" && !isNaN(_osVer)) {\n                                                if (_osVer == 0){\n                                                    _osVer = 8;\n                                                } else if (_osVer < 13){\n                                                    _osVer = 10;\n                                                } else{\n                                                    _osVer = 11;\n                                                }\n                                            }\n\n                                            _storeCachedOSVersion((_core || {}).config as IConfig);\n                                        }\n                                    } else {\n                                        _throwInternal(safeGetLogger(_core),\n                                            eLoggingSeverity.CRITICAL,\n                                            _eInternalMessageId.PluginException,\n                                            \"Could not retrieve operating system: \" + response.reason);\n                                    }\n                                } finally {\n                                    _completeOsRetrieve();\n                                }\n                            });\n                        }\n                    }\n                }\n            }\n\n            function _updateTeleItemWithOs(event: ITelemetryItem) {\n                if (_fetchedFullVersion && (_os || _osVer)) {\n                    let extOS: any = getSetValue(getSetValue(event, strExt) as any, Extensions.OSExt);\n                    if (_mergeOsNameVersion){\n                        let mergedOS = (_os || \"\") + (_osVer ? asString(_osVer) : \"\");\n                        setValue(extOS, \"osVer\", mergedOS, isString);\n                    } else {\n                        setValue(extOS, \"osVer\", _osVer);\n                        setValue(extOS, \"os\", _os, isString);\n                    }\n                }\n            }\n        \n            /**\n            * Complete retrieving operating system info process, cleanup and release the event queue\n            */\n            function _completeOsRetrieve() {\n                if (_getOSTimeout) {\n                    _getOSTimeout.cancel();\n                    _getOSTimeout = null;\n                }\n\n                _removeUnloadHandlers();\n                _releaseEventQueue();\n            }\n        \n            /**\n            * Release internal event queue\n            */\n            function _releaseEventQueue() {\n                arrForEach(_eventQueue, (evt) => {\n                    _updateTeleItemWithOs(evt.item);\n                    _self.processNext(evt.item, evt.ctx);\n                });\n                _eventQueue = [];\n            }\n\n            function _initDefaults() {\n                _core = null;\n                _ocConfig = null;\n                _getOSTimeout = null;\n                _eventQueue = [];\n                _os = null;\n                _osVer = null;\n                _fetchedFullVersion = false;\n                _addedUnloadEvents = false;\n                _excludePageUnloadEvents = null;\n            }\n            \n            // Special internal method to allow the DebugPlugin to hook embedded objects\n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [ { platform: _os, platformVersion: _osVer }, _eventQueue, !!_getOSTimeout];\n            };\n        });\n    }\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[]) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Process the event and add it to an internal queue if handshake in process\n     * @param event - The event to process\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    public processTelemetry(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/src/applicationinsights-osplugin-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IOSPluginConfiguration } from \"./DataModels\";\nimport { OsPlugin } from \"./OsPlugin\";\n\nexport { OsPlugin, IOSPluginConfiguration };\n"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-osplugin-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-osplugin-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-osplugin-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-osplugin-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-osplugin-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Performance Mark and Measure Plugin\n\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-perfmarkmeasure-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-perfmarkmeasure-js)\n\nPerformance Mark and Measure Manager Plugin for the Application Insights Javascript SDK is a replacement for the default Performance manager to \nuse the ```window.performance```, ```mark``` and ```measure``` api calls for the browsers.\n\nIt is intended that this plugin is to be used during development/testing only as enabling performance monitoring can affect the performance of the system.\nAnd there is a limit on the number of performance events that browsers will retain.\n\n## Getting Started\n\nSee the [basic documentation](https://github.com/microsoft/ApplicationInsights-JS/blob/master/docs/PerformanceMonitoring.md) on the performance monitoring support helpers and interfaces, this extension builds on top of the basic support.\n\n## NPM Setup\n\nInstall npm package:\n\n```bash\nnpm install --save @microsoft/applicationinsights-perfmarkmeasure-js @microsoft/applicationinsights-web\n```\n\n```js\n\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\nimport { PerfMarkMeasureManager } from '@microsoft/applicationinsights-perfmarkmeasure-js';\n\nconst perfManager = new PerfMarkMeasureManager();\n\n// Application Insights Configuration\nconst configObj = {\n  connectionString: 'YOUR CONNECTION STRING\",\n};\n\nconst appInsights = new ApplicationInsights({ config: configObj });\nappInsights.loadAppInsights();\nappInsights.core.setPerfMgr(perfManager);\n```\n\n### Direct usage with the doPerf() helper\n\n```js\nimport { doPerf, PerfMarkMeasureManager } from '@microsoft/applicationinsights-perfmarkmeasure-js';\n\nconst perfManager = new PerfMarkMeasureManager();\n\ndoPerf(perfManager, () => \"code\", (perfEvent) => {\n    // Code to run that will have a mark and measure\n});\n\n// window.performance will now contain \n// - a mark called 'ai.prfmrk.code'\n// - a measure called 'ai.prf.msr.code'\n```\n\n### Direct usage with the doPerf() helper and a notification manager\n\n```js\nimport { INotificationManager  } from '@microsoft/applicationinsights-core-js';\nimport { doPerf, IPerfEvent, PerfMarkMeasureManager } from '@microsoft/applicationinsights-perfmarkmeasure-js';\n\nlet perfEvents: IPerfEvent[] = [];\nconst perfManager = new PerfMarkMeasureManager(\n    {\n        // config\n    },\n    {\n        perfEvent: (perfEvent) => {\n            // Called after the doPerf() function finishes\n            perfEvents.push(perfEvent);\n        }\n    } as INotificationManager);\n\ndoPerf(perfManager, () => \"code\", (perfEvent) => {\n    // Code to run that will have a mark and measure\n});\n\n// window.performance will now contain \n// - a mark called 'ai.prfmrk.code'\n// - a measure called 'ai.prf.msr.code'\n// perfEvents.length === 1 with perfEvents[0].name === \"code\"\n\n```\n\n## CDN Usage\n\n```html\n<script src=\"https://js.monitor.azure.com/scripts/b/ext/ai.prfmm-mgr.2.min.js\"></script>\n<script type=\"application/javascript\">\n    const perfManager = new Microsoft.ApplicationInsights.PerfMarkMeasureManager();\n\n    Microsoft.ApplicationInsights.doPerf(perfManager, () => \"code\", (perfEvent) => {\n        // Code to run that will have a mark and measure\n    });\n\n    // window.performance will now contain \n    // - a mark called 'ai.prfmrk.code'\n    // - a measure called 'ai.prf.msr.code'\n</script>\n```\n\nAlso see the [Example Html Usage](./example/cdn-usage.html)\n\n## Configuration Options\n\nAll of the configuration options are optional\n\n### [IPerfMarkMeasureConfiguration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html)\n\n| Name | Type | Description\n|------|-----------|--------------------\n| [useMarks](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#useMarks) | boolean | Should the Performance manager create and use window.performance.mark(), defaults to true\n| [markPrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#markPrefix) | string | Identifies the prefix for the mark, defaults to \"ai.prfmrk.\", the event name is appended for the mark\n| [uniqueNames](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#uniqueNames) | boolean | Make the marks and measures unique by appending a numeric value to the prefix value, defaults to false. Marks and measure for the same perfEvent will be assigned the same unique numeric value\n| [markNameMap](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#markNameMap) | { [key: string]: string } | Provides a mapping between the internal perf names and the value used to create the mark, when a map is provided but no mapping is present that event will be ignored.\n| [useEndMarks](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#useEndMarks) | boolean | Should the Performance manager create a mark when the event is fired, defaults to false\n| [markEndPrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#markEndPrefix) | string | Identifies the prefix for the \"end\" mark of a perf event, defaults to \"ai.prfmrk.end.\", the event name is appended for the mark\n| [useMeasures](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#useMeasures) | boolean | Should the Performance manager create and use window.performance.measure(), defaults to true\n| [measurePrefix](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#measurePrefix) | string | Identifies the prefix for the mark, defaults to \"ai.prfmsr.\", the event name is appended for the measure name\n| [measureNameMap](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-perfmarkmeasure-js/interfaces/IPerfMarkMeasureConfiguration.html#measureNameMap) | { [key: string]: string } | Provides a mapping between the internal perf names and the value used to create the measure, when no measureNameMap is provided this will default to using the markNameMap and when a map is provided but no mapping is present that event will be ignored.\n\nExample with config\n\n```typescript\nimport { doPerf } from '@microsoft/applicationinsights-core-js';\nimport { PerfMarkMeasureManager } from '@microsoft/applicationinsights-perfmarkmeasure-js';\n\nconst perfManager = new PerfMarkMeasureManager({\n    useMarks: true,\n    useEndMarks: true,\n    markPrefix: \"tst.mark.\",\n    markEndPrefix: \"tst.markend.\",\n    measurePrefix: \"tst.measure.\",\n    markNameMap: {\n        \"test\": \"mapped1\",\n        \"test3\": \"mapped3\"\n    },\n    measureNameMap: {\n        \"test\": \"measure1\",\n        \"test2\": \"measure2\"\n    }\n});\n\ndoPerf(manager, () => \"test\", (perfEvent) => {\n    // A mark has been added to window.performance called 'tst.mark.test'\n});\n\n// Another mark has been added to window.performance called 'tst.markend.test'\n// And a measure will also exist in window.performance called 'tst.measure.test'\n\n```\n\n## Build:\n\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Run unit tests:\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/MarkMeasureTests.ts",
    "content": "/**\n * @copyright Microsoft 2020\n */\n\nimport { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { ITelemetryItem, AppInsightsCore, IPlugin, IConfiguration, DiagnosticLogger, IAppInsightsCore, ITelemetryPluginChain, doPerf, EventsDiscardedReason, INotificationManager, IPerfEvent} from '@microsoft/applicationinsights-core-js';\nimport { PerfMarkMeasureManager } from '../../../src/PerfMarkMeasureManager';\n\nexport interface PerfMeasures {\n    name: string;\n    from: string;\n    to: string;\n};\n\nexport class MarkMeasureTests extends AITestClass {\n    _marks: string[] = [];\n    _measures: PerfMeasures[] = [];\n\n    public testInitialize() {\n        this._marks = [];\n        this._measures = [];\n\n        this.mockPerformance({\n            mark: (name: string) => {\n                this._marks.push(name);\n            },\n            measure: (name, from, to) => {\n                this._measures.push({ name, from, to });\n            }\n        });\n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Empty Initialization still calls mark and measure\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager();\n                const core = new AppInsightsCore();\n                core.setPerfMgr(manager);\n                const channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                } as IConfiguration, [channel]);\n                \n                const element = document.createElement('a');\n                let markSpy = this.sandbox.spy(window.performance, 'mark');   \n                let measureSpy = this.sandbox.spy(window.performance, 'measure');   \n                core.track({ \n                    name: \"Test\",\n                    sync: true\n                } as ITelemetryItem);\n                Assert.equal(true, markSpy.called);\n                Assert.equal(true, measureSpy.called);\n\n                Assert.equal(true, this._marks.length > 0);\n                for (let lp = 0; lp < this._marks.length; lp++) {\n                    let mark = this._marks[lp];\n                    // Making sure there are no \"end\" marks\n                    Assert.equal(0, mark.indexOf(\"ai.prfmrk.\"), \"Checking mark - \" + mark)\n                    Assert.equal(-1, mark.indexOf(\"ai.prfmrk-end.\"), \"Checking mark - \" + mark)\n                }\n\n                Assert.equal(true, this._measures.length > 0);\n                for (let lp = 0; lp < this._measures.length; lp++) {\n                    let measure = this._measures[lp];\n                    // Making sure the measure mark is correct\n                    Assert.equal(0, measure.name.indexOf(\"ai.prfmsr.\"), \"Checking measure - \" + JSON.stringify(measure));\n                    Assert.equal(0, measure.from.indexOf(\"ai.prfmrk.\"), \"Checking from measure - \" + JSON.stringify(measure));\n                    Assert.equal(undefined, measure.to, \"Checking to measure - \" + JSON.stringify(measure));\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Disable measure but keep mark\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMeasures: false\n                });\n                const core = new AppInsightsCore();\n                core.setPerfMgr(manager);\n                const channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                } as IConfiguration, [channel]);\n                \n                const element = document.createElement('a');\n                let markSpy = this.sandbox.spy(window.performance, 'mark');   \n                let measureSpy = this.sandbox.spy(window.performance, 'measure');   \n                core.track({ \n                    name: \"Test\",\n                    sync: true\n                } as ITelemetryItem);\n                Assert.equal(true, markSpy.called);\n                Assert.equal(false, measureSpy.called);\n\n                Assert.equal(true, this._marks.length > 0);\n                for (let lp = 0; lp < this._marks.length; lp++) {\n                    let mark = this._marks[lp];\n                    // Making sure there are no \"end\" marks\n                    Assert.equal(0, mark.indexOf(\"ai.prfmrk.\"), \"Checking mark - \" + mark)\n                    Assert.equal(-1, mark.indexOf(\"ai.prfmrk-end.\"), \"Checking mark - \" + mark)\n                }\n                Assert.equal(0, this._measures.length);\n            }\n        });\n\n        this.testCase({\n            name: \"Disable measure but use end marks\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMeasures: false,\n                    useEndMarks: true\n                });\n                const core = new AppInsightsCore();\n                core.setPerfMgr(manager);\n                const channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                } as IConfiguration, [channel]);\n                \n                const element = document.createElement('a');\n                let markSpy = this.sandbox.spy(window.performance, 'mark');   \n                let measureSpy = this.sandbox.spy(window.performance, 'measure');   \n                core.track({ \n                    name: \"Test\",\n                    sync: true\n                } as ITelemetryItem);\n                Assert.equal(true, markSpy.called);\n                Assert.equal(false, measureSpy.called);\n\n                Assert.equal(true, this._marks.length > 0);\n                let numStart = 0;\n                let numEnd = 0;\n                for (let lp = 0; lp < this._marks.length; lp++) {\n                    let mark = this._marks[lp];\n                    if (mark.indexOf(\"ai.prfmrk.\") !== -1) {\n                        numStart++;\n\n                        let foundEnd = false;\n                        for (let lp2 = lp + 1; lp2 < this._marks.length; lp2++) {\n                            if (this._marks[lp2].indexOf(\"ai.prfmrk-end.\" + mark.substring(10)) !== -1) {\n                                foundEnd = true;\n                                break;\n                            }\n                        }\n                        Assert.equal(true, foundEnd, \"Expect to find and end mark for \" + mark);\n                    }\n\n                    if (mark.indexOf(\"ai.prfmrk-end.\") !== -1) {\n                        numEnd++;\n                    }\n                }\n\n                Assert.equal(numStart, numEnd, \"Should be same number of start and end marks\");\n                Assert.equal(0, this._measures.length);\n            }\n        });\n\n        this.testCase({\n            name: \"Disable marks but keep measure\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: false\n                });\n                const core = new AppInsightsCore();\n                core.setPerfMgr(manager);\n                const channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                } as IConfiguration, [channel]);\n                \n                const element = document.createElement('a');\n                let markSpy = this.sandbox.spy(window.performance, 'mark');   \n                let measureSpy = this.sandbox.spy(window.performance, 'measure');   \n                core.track({ \n                    name: \"Test\",\n                    sync: true\n                } as ITelemetryItem);\n                Assert.equal(false, markSpy.called);\n                Assert.equal(true, measureSpy.called);\n                Assert.equal(0, this._marks.length, \"No Marks expected\");\n                for (let lp = 0; lp < this._measures.length; lp++) {\n                    let measure = this._measures[lp];\n                    // Making sure the measure mark is correct\n                    Assert.equal(0, measure.name.indexOf(\"ai.prfmsr.\"), \"Checking measure - \" + JSON.stringify(measure));\n                    Assert.equal(undefined, measure.from, \"Checking from measure - \" + JSON.stringify(measure));\n                    Assert.equal(undefined, measure.to, \"Checking to measure - \" + JSON.stringify(measure));\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Enable start and end marks with measure\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    useMeasures: true\n                });\n                const core = new AppInsightsCore();\n                core.setPerfMgr(manager);\n                const channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                } as IConfiguration, [channel]);\n                \n                const element = document.createElement('a');\n                let markSpy = this.sandbox.spy(window.performance, 'mark');   \n                let measureSpy = this.sandbox.spy(window.performance, 'measure');   \n                core.track({ \n                    name: \"Test\",\n                    sync: true\n                } as ITelemetryItem);\n                Assert.equal(true, markSpy.called);\n                Assert.equal(true, measureSpy.called);\n                Assert.equal(true, this._marks.length > 0);\n\n                let numStart = 0;\n                let numEnd = 0;\n                for (let lp = 0; lp < this._marks.length; lp++) {\n                    let mark = this._marks[lp];\n                    if (mark.indexOf(\"ai.prfmrk.\") !== -1) {\n                        numStart++;\n\n                        let foundEnd = false;\n                        for (let lp2 = lp + 1; lp2 < this._marks.length; lp2++) {\n                            if (this._marks[lp2].indexOf(\"ai.prfmrk-end.\" + mark.substring(10)) !== -1) {\n                                foundEnd = true;\n                                break;\n                            }\n                        }\n                        Assert.equal(true, foundEnd, \"Expect to find and end mark for \" + mark);\n                    }\n\n                    if (mark.indexOf(\"ai.prfmrk-end.\") !== -1) {\n                        numEnd++;\n                    }\n                }\n\n                Assert.equal(numStart, numEnd, \"Should be same number of start and end marks\");\n\n                Assert.equal(true, this._measures.length > 0);\n                for (let lp = 0; lp < this._measures.length; lp++) {\n                    let measure = this._measures[lp];\n                    // Making sure the measure mark is correct\n                    Assert.equal(0, measure.name.indexOf(\"ai.prfmsr.\"), \"Checking measure - \" + JSON.stringify(measure));\n                    Assert.equal(0, measure.from.indexOf(\"ai.prfmrk.\" + measure.name.substring(10)), \"Checking from measure - \" + JSON.stringify(measure));\n                    Assert.equal(0, measure.to.indexOf(\"ai.prfmrk-end.\" + measure.name.substring(10)), \"Checking to measure - \" + JSON.stringify(measure));\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Enable start and end marks with measure with unique names\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    useMeasures: true,\n                    uniqueNames: true\n                });\n                const core = new AppInsightsCore();\n                core.setPerfMgr(manager);\n                const channel = new ChannelPlugin();\n                core.initialize({\n                    instrumentationKey: 'testIkey',\n                } as IConfiguration, [channel]);\n                \n                const element = document.createElement('a');\n                let markSpy = this.sandbox.spy(window.performance, 'mark');   \n                let measureSpy = this.sandbox.spy(window.performance, 'measure');   \n                core.track({ \n                    name: \"Test1\",\n                    sync: true\n                } as ITelemetryItem);\n                core.track({ \n                    name: \"Test2\",\n                    sync: true\n                } as ITelemetryItem);\n                Assert.equal(true, markSpy.called);\n                Assert.equal(true, measureSpy.called);\n                Assert.equal(true, this._marks.length > 0);\n\n                let numStart = 0;\n                let numEnd = 0;\n                for (let lp = 0; lp < this._marks.length; lp++) {\n                    let mark = this._marks[lp];\n                    if (mark.indexOf(\"ai.prfmrk.\") !== -1) {\n                        numStart++;\n                        Assert.notEqual(-1, \"0123456789\".indexOf(mark[10]), \"Make sure there is a numeric value for \" + mark);\n\n                        let foundEnd = false;\n                        for (let lp2 = lp + 1; lp2 < this._marks.length; lp2++) {\n                            if (this._marks[lp2].indexOf(\"ai.prfmrk-end.\" + mark.substring(10)) !== -1) {\n                                foundEnd = true;\n                                break;\n                            }\n                        }\n                        Assert.equal(true, foundEnd, \"Expect to find and end mark for \" + mark);\n                    }\n\n                    if (mark.indexOf(\"ai.prfmrk-end.\") !== -1) {\n                        numEnd++;\n                    }\n                }\n\n                Assert.equal(numStart, numEnd, \"Should be same number of start and end marks\");\n                Assert.equal(true, this._measures.length > 0);\n\n                for (let lp = 0; lp < this._measures.length; lp++) {\n                    let measure = this._measures[lp];\n                    // Making sure the measure mark is correct\n                    Assert.equal(0, measure.name.indexOf(\"ai.prfmsr.\"), \"Checking measure - \" + JSON.stringify(measure));\n                    Assert.equal(0, measure.from.indexOf(\"ai.prfmrk.\" + measure.name.substring(10)), \"Checking from measure - \" + JSON.stringify(measure));\n                    Assert.equal(0, measure.to.indexOf(\"ai.prfmrk-end.\" + measure.name.substring(10)), \"Checking to measure - \" + JSON.stringify(measure));\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf() usage with defaults\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager();\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test1\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.test1\", this._marks[0]);\n                });\n                Assert.equal(1, this._marks.length);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.test1\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.test1\", this._measures[0].from);\n                Assert.equal(undefined, this._measures[0].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): Specific enable start marks\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.test\", this._marks[0]);\n                });\n                Assert.equal(1, this._marks.length);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.test\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.test\", this._measures[0].from);\n                Assert.equal(undefined, this._measures[0].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): Specific enable start marks with unique\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    uniqueNames: true\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.0.test\", this._marks[0]);\n                });\n                Assert.equal(1, this._marks.length);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.0.test\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.0.test\", this._measures[0].from);\n                Assert.equal(undefined, this._measures[0].to);\n\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.1.test2\", this._marks[1]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.1.test2\", this._measures[1].name);\n                Assert.equal(\"ai.prfmrk.1.test2\", this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with start and end marks\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.test\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.test\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.test\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.test\", this._measures[0].from);\n                Assert.equal(\"ai.prfmrk-end.test\", this._measures[0].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with start and end marks with unique\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    uniqueNames: true\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.0.test\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.0.test\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.0.test\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.0.test\", this._measures[0].from);\n                Assert.equal(\"ai.prfmrk-end.0.test\", this._measures[0].to);\n\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.1.test2\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.1.test2\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.1.test2\", this._measures[1].name);\n                Assert.equal(\"ai.prfmrk.1.test2\", this._measures[1].from);\n                Assert.equal(\"ai.prfmrk-end.1.test2\", this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): Disable Marks\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: false\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(0, this._marks.length);\n                });\n                Assert.equal(0, this._marks.length);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.test2\", this._measures[0].name);\n                Assert.equal(undefined, this._measures[0].from);\n                Assert.equal(undefined, this._measures[0].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): Disable Marks with unique\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: false,\n                    uniqueNames: true\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(0, this._marks.length);\n                });\n                Assert.equal(0, this._marks.length);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.0.test2\", this._measures[0].name);\n                Assert.equal(undefined, this._measures[0].from);\n                Assert.equal(undefined, this._measures[0].to);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(0, this._marks.length);\n                });\n                Assert.equal(0, this._marks.length);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.1.test3\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): Disable Measures\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMeasures: false\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.test3\", this._marks[0]);\n                });\n                Assert.equal(1, this._marks.length);\n                Assert.equal(0, this._measures.length);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): Disable Measures with unique\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMeasures: false,\n                    uniqueNames: true\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.0.test3\", this._marks[0]);\n                });\n                Assert.equal(1, this._marks.length);\n                Assert.equal(0, this._measures.length);\n\n                doPerf(manager, () => \"test4\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.1.test4\", this._marks[1]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(0, this._measures.length);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with mark name map\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    markNameMap: {\n                        \"test\": \"mapped1\",\n                        \"test3\": \"mapped3\"\n                    }\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.mapped1\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.mapped1\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.mapped1\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.mapped1\", this._measures[0].from);\n                Assert.equal(\"ai.prfmrk-end.mapped1\", this._measures[0].to);\n\n                // Unmapped name is dropped\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(1, this._measures.length);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.mapped3\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.mapped3\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.mapped3\", this._measures[1].name);\n                Assert.equal(\"ai.prfmrk.mapped3\", this._measures[1].from);\n                Assert.equal(\"ai.prfmrk-end.mapped3\", this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with mark name map with unique\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    uniqueNames: true,\n                    markNameMap: {\n                        \"test\": \"mapped1\",\n                        \"test3\": \"mapped3\"\n                    }\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.0.mapped1\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.0.mapped1\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.0.mapped1\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.0.mapped1\", this._measures[0].from);\n                Assert.equal(\"ai.prfmrk-end.0.mapped1\", this._measures[0].to);\n\n                // Unmapped name is dropped\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(1, this._measures.length);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.2.mapped3\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.2.mapped3\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.2.mapped3\", this._measures[1].name);\n                Assert.equal(\"ai.prfmrk.2.mapped3\", this._measures[1].from);\n                Assert.equal(\"ai.prfmrk-end.2.mapped3\", this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with mark name map and measure map\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    markNameMap: {\n                        \"test\": \"mapped1\",\n                        \"test3\": \"mapped3\"\n                    },\n                    measureNameMap: {\n                        \"test\": \"measure1\",\n                        \"test2\": \"measure2\"\n                    }\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.mapped1\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.mapped1\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.measure1\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.mapped1\", this._measures[0].from);\n                Assert.equal(\"ai.prfmrk-end.mapped1\", this._measures[0].to);\n\n                // Unmapped name is dropped\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.mapped3\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.mapped3\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with mark name map and measure map with unique\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    uniqueNames: true,\n                    markNameMap: {\n                        \"test\": \"mapped1\",\n                        \"test3\": \"mapped3\"\n                    },\n                    measureNameMap: {\n                        \"test\": \"measure1\",\n                        \"test2\": \"measure2\"\n                    }\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.0.mapped1\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.0.mapped1\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"ai.prfmsr.0.measure1\", this._measures[0].name);\n                Assert.equal(\"ai.prfmrk.0.mapped1\", this._measures[0].from);\n                Assert.equal(\"ai.prfmrk-end.0.mapped1\", this._measures[0].to);\n\n                // Unmapped name is dropped\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.1.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"ai.prfmrk.2.mapped3\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"ai.prfmrk-end.2.mapped3\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"ai.prfmsr.1.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with mark name map, measure map and prefixes\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    markPrefix: \"tst.mark.\",\n                    markEndPrefix: \"tst.markend.\",\n                    measurePrefix: \"tst.measure.\",\n                    markNameMap: {\n                        \"test\": \"mapped1\",\n                        \"test3\": \"mapped3\"\n                    },\n                    measureNameMap: {\n                        \"test\": \"measure1\",\n                        \"test2\": \"measure2\"\n                    }\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"tst.mark.mapped1\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"tst.markend.mapped1\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"tst.measure.measure1\", this._measures[0].name);\n                Assert.equal(\"tst.mark.mapped1\", this._measures[0].from);\n                Assert.equal(\"tst.markend.mapped1\", this._measures[0].to);\n\n                // Unmapped name is dropped\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"tst.measure.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"tst.mark.mapped3\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"tst.markend.mapped3\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"tst.measure.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with mark name map and measure map with unique\",\n            test: () => {\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    uniqueNames: true,\n                    markPrefix: \"tst.mark.\",\n                    markEndPrefix: \"tst.markend.\",\n                    measurePrefix: \"tst.measure.\",\n                    markNameMap: {\n                        \"test\": \"mapped1\",\n                        \"test3\": \"mapped3\"\n                    },\n                    measureNameMap: {\n                        \"test\": \"measure1\",\n                        \"test2\": \"measure2\"\n                    }\n                });\n\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"tst.mark.0.mapped1\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"tst.markend.0.mapped1\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"tst.measure.0.measure1\", this._measures[0].name);\n                Assert.equal(\"tst.mark.0.mapped1\", this._measures[0].from);\n                Assert.equal(\"tst.markend.0.mapped1\", this._measures[0].to);\n\n                // Unmapped name is dropped\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"tst.measure.1.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"tst.mark.2.mapped3\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"tst.markend.2.mapped3\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"tst.measure.1.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n            }\n        });\n\n        this.testCase({\n            name: \"Test with direct doPerf(): with mark name map and measure map with unique using notification manager\",\n            test: () => {\n                let perfEvents: IPerfEvent[] = [];\n                const manager = new PerfMarkMeasureManager({\n                    useMarks: true,\n                    useEndMarks: true,\n                    uniqueNames: true,\n                    markPrefix: \"tst.mark.\",\n                    markEndPrefix: \"tst.markend.\",\n                    measurePrefix: \"tst.measure.\",\n                    markNameMap: {\n                        \"test\": \"mapped1\",\n                        \"test3\": \"mapped3\"\n                    },\n                    measureNameMap: {\n                        \"test\": \"measure1\",\n                        \"test2\": \"measure2\"\n                    }\n                },\n                {\n                    perfEvent: (perfEvent) => {\n                        perfEvents.push(perfEvent);\n                    }\n                } as INotificationManager);\n\n                Assert.equal(0, perfEvents.length);\n                Assert.equal(0, this._marks.length);\n                doPerf(manager, () => \"test\", (perfEvent) => {\n                    Assert.equal(0, perfEvents.length);\n                    Assert.equal(1, this._marks.length);\n                    Assert.equal(\"tst.mark.0.mapped1\", this._marks[0]);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(\"tst.markend.0.mapped1\", this._marks[1]);\n                Assert.equal(1, this._measures.length);\n                Assert.equal(\"tst.measure.0.measure1\", this._measures[0].name);\n                Assert.equal(\"tst.mark.0.mapped1\", this._measures[0].from);\n                Assert.equal(\"tst.markend.0.mapped1\", this._measures[0].to);\n                Assert.equal(1, perfEvents.length);\n                Assert.equal(\"test\", perfEvents[0].name);\n\n                // Unmapped name is dropped\n                doPerf(manager, () => \"test2\", (perfEvent) => {\n                    Assert.equal(2, this._marks.length);\n                });\n                Assert.equal(2, this._marks.length);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"tst.measure.1.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n                Assert.equal(2, perfEvents.length);\n                Assert.equal(\"test2\", perfEvents[1].name);\n\n                doPerf(manager, () => \"test3\", (perfEvent) => {\n                    Assert.equal(3, this._marks.length);\n                    Assert.equal(\"tst.mark.2.mapped3\", this._marks[2]);\n                });\n                Assert.equal(4, this._marks.length);\n                Assert.equal(\"tst.markend.2.mapped3\", this._marks[3]);\n                Assert.equal(2, this._measures.length);\n                Assert.equal(\"tst.measure.1.measure2\", this._measures[1].name);\n                Assert.equal(undefined, this._measures[1].from);\n                Assert.equal(undefined, this._measures[1].to);\n                Assert.equal(3, perfEvents.length);\n                Assert.equal(\"test3\", perfEvents[2].name);\n            }\n        });\n    }\n}\n\nclass ChannelPlugin implements IPlugin {\n\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry(env: ITelemetryItem) {}\n\n    setNextPlugin(next: any) {\n        // no next setup\n    }\n\n    public initialize = (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) => {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/appinsights-perfmarkmeasure.tests.ts",
    "content": "import { MarkMeasureTests } from './MarkMeasureTests';\nimport { GlobalTestHooks } from './GlobalTestHooks.Test';\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new MarkMeasureTests().registerTests();\n}\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript API</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/appinsights-perfmarkmeasure.tests\", \"./Unit/dist/appinsights-perfmarkmeasure.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"noImplicitAny\": false,\n      \"module\": \"amd\",\n      \"moduleResolution\": \"node\",\n      \"target\": \"es6\",\n      \"importHelpers\": true,\n      \"noEmitHelpers\": true,\n      \"skipLibCheck\": true,\n      \"alwaysStrict\": true,\n      \"declaration\": true\n    },\n    \"files\": []\n  }\n  \n  "
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-perfmarkmeasure-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/example/cdn-usage.html",
    "content": "<html>\n<head>\n<script src=\"https://js.monitor.azure.com/next/ext/ai.prfmm-mgr.2.js\"></script>\n<script type=\"application/javascript\">\n    const perfManager = new Microsoft.ApplicationInsights.PerfMarkMeasureManager();\n\n    Microsoft.ApplicationInsights.doPerf(perfManager, () => \"code\", (perfEvent) => {\n        // Code to run that will have a mark and measure\n    });\n\n    Microsoft.ApplicationInsights.doPerf(perfManager, () => \"test2\", (perfEvent) => {\n        // Code to run that will have a mark and measure\n        var value = 0;\n        for (var lp = 0; lp < 1000000; lp++) {\n            value++;\n        }\n    });\n\n\n    // window.performance will now contain \n    // - a mark called 'ai.prfmrk.code'\n    // - a measure called 'ai.prf.msr.code'\n\n    // Just a simple example of accessing the entries\n    setTimeout(function() {\n        var entries = window.performance.getEntries();\n\n        // We need to wait until the DOM is processed and this 'id' actually exists\n        var list = document.getElementById('entries');\n        for (var lp = 0; lp < entries.length; lp++) {\n            var entry = document.createElement('li');\n            var perfEntry = entries[lp];\n            var details = lp + \": \" + JSON.stringify(entries[lp]);\n            if (perfEntry.entryType === \"mark\" || perfEntry.entryType === \"measure\") {\n                details = \"<h2>\" + details + \"</h2>\";\n            }\n            entry.innerHTML = details;\n            list.appendChild(entry);\n        }\n    }, 200);\n</script>\n</head>\n<body>\n<h1>Perf Entries</h1>\n<div>\n    <ul id=\"entries\">\n\n    </ul>\n</div>\n</body>\n</html>"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-perfmarkmeasure-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights Performance Mark and Measure Manager plugin\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-perfmarkmeasure-js.js\",\n    \"module\": \"dist-es5/applicationinsights-perfmarkmeasure-js.js\",\n    \"types\": \"types/applicationinsights-perfmarkmeasure-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-perfmarkmeasure-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt perfmarkmeasure\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt perfmarkmeasuretests\",\n        \"mintest\": \"grunt perfmarkmeasure-mintests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights Performance Mark and Measure Manager plugin\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt perfmarkmeasure-min\",\n        \"ai-restore\": \"grunt perfmarkmeasure-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"applicationinsights-perfmarkmeasure-js\";\nconst browserOutputName = \"ai.prfmm-mgr\";\nconst entryPointName = \"applicationinsights-perfmarkmeasure-js\";\nconst outputName = \"applicationinsights-perfmarkmeasure-js\"; \n\nconst verParts = version.split(\"-\")[0].split(\".\")\nif (verParts.length != 3) {\n  throw \"Invalid Version! [\" + version + \"]\"\n}\n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Performance Mark and Measure Manager plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ \"applicationinsights-perfmarkmeasure-js\" ]);\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/scripts/listAzCdnVersions.ps1",
    "content": "param (\n    [string] $container = $null,                        # Identify the container that you want to check blank == all\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $showFiles = $false,                       # Show the individual files with details as well\n    [switch] $activeOnly = $false,                      # Only show the active (deployed) versions\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Container         : $container\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Show Files        : $showFiles\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n    \n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    # Validate parameters\n    if ([string]::IsNullOrWhiteSpace($container) -ne $true -and \"beta\",\"next\",\"public\", \"dev\", \"nightly\" -NotContains $container) {\n        Write-LogFailure \"[$($container)] is not a valid value, must be beta, next or public\"\n    }\n}\n\nFunction Get-AllVersionFiles(\n    [system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]] $files,\n    [string] $storagePath\n) {\n    Get-VersionFiles $files \"$storagePath/ext\" \"ai.prfmm-mgr.\" $null\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath, \"listCdnVersionsLog\"\nWrite-LogParams\nValidate-Params\n\n# Don't try and list anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n\n# Get the public files (scripts/b)\nif ([string]::IsNullOrWhiteSpace($container) -eq $true) {\n    Get-AllVersionFiles $files \"scripts/b\"\n    Get-AllVersionFiles $files \"beta\"\n    Get-AllVersionFiles $files \"next\"\n    Get-AllVersionFiles $files \"dev\"\n    Get-AllVersionFiles $files \"nightly\"\n}\n\nif ([string]::IsNullOrWhiteSpace($container) -ne $true) {\n    if ($container -eq \"public\") {\n        Get-AllVersionFiles $files \"scripts/b\"\n    } elseif ($container -eq \"beta\" -or $container -eq \"next\" -or $container -eq \"dev\" -or $container -eq \"nightly\") {\n        Get-AllVersionFiles $files \"$container\"\n    } else {\n        $global:connectDetails.testOnly = $true\n        $global:connectDetails.storeContainer = \"tst\"\n        Get-AllVersionFiles $files \"$container\"\n    }\n}\n\nListVersions $files $activeOnly $showFiles\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/scripts/publishAzReleaseToCdn.ps1",
    "content": "param (\n    [string] $releaseFrom = $null,                      # The root path for where to find the files to be released\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $overwrite = $false,                       # Overwrite any existing files   \n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\n$global:cacheValue = $null\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Overwrite         : $overwrite\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"SourcePath        : $jsSdkDir\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n    \n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction GetReleaseFiles (\n    [hashtable] $verDetails\n)\n{\n    $version = $verDetails.full\n    Write-Log \"Version   : $($verDetails.full)\"\n    Write-Log \"  Number  : $($verDetails.ver)\"\n    Write-Log \"  Type    : $($verDetails.type)\"\n    Write-Log \"  BldNum  : $($verDetails.bldNum)\"\n\n    # check if the minified dir exists\n    $jsSdkSrcDir = Join-Path $jssdkDir -ChildPath \"browser\\es5\\\";\n\n    if (-Not (Test-Path $jsSdkSrcDir)) {\n        Write-LogWarning \"'$jsSdkSrcDir' directory doesn't exist. Compile JSSDK first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    Write-Log \"Adding files\";\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.integrity.json\" $true\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.cjs.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.cjs.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.cjs.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.cjs.min.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.gbl.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.gbl.js.map\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.gbl.min.js\"\n    AddReleaseFile $files $jsSdkSrcDir \"ai.prfmm-mgr.$version.gbl.min.js.map\"\n\n    return $files\n}\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"publishReleaseCdnLog\"\n\n$jsSdkDir = $releaseFrom\nif ([string]::IsNullOrWhiteSpace($jsSdkDir) -eq $true) {\n    $jsSdkDir = Split-Path (Split-Path $MyInvocation.MyCommand.Path) -Parent\n}\n\n$cacheControl1Year = \"public, max-age=31536000, immutable, no-transform\";\n$contentType = \"text/javascript; charset=utf-8\";\n\nWrite-LogParams\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n$version = GetPackageVersion $jsSdkDir\n\n$releaseFiles = GetReleaseFiles $version      # Get the versioned files only\nif ($null -eq $releaseFiles -or $releaseFiles.Count -eq 0) {\n    Write-LogFailure \"Unable to find any release files\"\n}\n\nWrite-Log \"Release Files : $($releaseFiles.Count)\"\nWrite-Log \"----------------------------------------------------------------------\"\n\n# Publish the full versioned files to all release folders\nif ($version.type -eq \"release\") {\n    # Normal publishing deployment\n    PublishFiles $releaseFiles \"beta/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"scripts/b/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"rc\") {\n    PublishFiles $releaseFiles \"beta/ext\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n    # Publish to release type folder folder\n    PublishFiles $releaseFiles \"$($version.type)/ext\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -like \"nightly*\") {\n    # Publish to release nightly folder folder\n    PublishFiles $releaseFiles \"nightly/ext\" $cacheControl1Year $contentType $overwrite\n}\nelse {\n    # Upload to the test container rather than the supplied one\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n    PublishFiles $releaseFiles \"$($version.type)/ext\" $cacheControl1Year $contentType $overwrite\n}\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/scripts/setAzActiveCdnVersion.ps1",
    "content": "[CmdletBinding()]\nparam (\n    [string] $container = \"\",                           # The container to update\n    [string] $activeVersion = \"\",                       # The version to copy as the active version\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $minorOnly = $false,                       # Only set the active minor version (v2.x) and not the major version (v2)\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    Write-Log \"Container         : $container\"\n    Write-Log \"Version           : $activeVersion\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n    \n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    if ([string]::IsNullOrWhiteSpace($activeVersion) -eq $true) {\n        Write-LogFailure \"The Active version is not specified\"\n        exit\n    }\n\n    $version = Get-VersionDetails $activeVersion\n\n    if ([string]::IsNullOrWhiteSpace($version.type) -eq $true) {\n        Write-LogFailure \"Unknown release type\"\n    }\n\n    $versionParts = $version.ver.Split(\".\")\n    if ($versionParts.Length -ne 3) {\n        Write-LogFailure \"Active Version [$activeVersion] is not a valid version number\"\n    }\n\n    foreach ($verNum in $versionParts) {\n        [int]$value = 0\n        if ([int32]::TryParse($verNum, [ref]$value) -ne $true) {\n            Write-LogFailure \"[$($verNum)] is not a valid number within the version[$activeVersion]\"\n        }\n    }\n\n    # Publish the full versioned files to all release folders\n    if ($version.type -eq \"release\") {\n        # Normal publishing deployment\n        if (\"beta\",\"next\",\"public\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"rc\") {\n        if (\"beta\",\"next\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -like \"nightly*\") {\n        if (\"nightly\" -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    else {\n        # Upload to the test container rather than the supplied one\n        $global:connectDetails.testOnly = $true\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        } else {\n            Write-LogWarning \"Non-Standard release type using tst/$container as the destination\"\n        }\n    }\n    \n    return $version;\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"setActiveCdnVersionLog\"\n\nWrite-LogParams\n$version = Validate-Params\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n$storePath = \"$container/ext\"\nif ($container -eq \"public\") {\n    $storePath = \"scripts/b/ext\"\n} elseif ($container -ne \"beta\" -and $container -ne \"next\" -and $container -ne \"dev\" -and $container -ne \"nightly\") {\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst/ext\"\n}\n\nGet-VersionFiles $files $storePath \"ai.prfmm-mgr.\" $activeVersion\n\nif ($files.ContainsKey($activeVersion) -ne $true) {\n    Write-LogFailure \"Version [$activeVersion] does not appear to be deployed to [$container]\"\n} elseif ($files[$activeVersion].Count -ne 12 -and\n        $files[$activeVersion].Count -ne 13) {          # Since 2.6.5\n    Write-LogFailure \"Version [$activeVersion] does not fully deployed to [$container] -- only found [$($files[$activeVersion].Count)] file(s)\"\n}\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\nSetActiveVersion $files[$activeVersion] $storePath $minorOnly\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/src/PerfMarkMeasureManager.ts",
    "content": "/**\n* PerfMarkMeasureManager.ts\n* @copyright Microsoft 2021\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { INotificationManager, IPerfEvent, PerfManager, getPerformance, getSetValue } from \"@microsoft/applicationinsights-core-js\";\nimport { IPerfMarkMeasureConfiguration } from \"./interfaces/IPerfMarkMeasureConfiguration\";\n\n// Names used in the perf Event context\nconst strCtxMarkName = \"prf-mark\";\nconst strCtxMarkEndName = \"prf-mark-end\";\nconst strCtxMeasureName = \"prf-measure\";\n\nexport class PerfMarkMeasureManager extends PerfManager {\n\n    constructor(config?: IPerfMarkMeasureConfiguration, manager?: INotificationManager ) {\n        super(manager);\n\n        let _config: IPerfMarkMeasureConfiguration = config || {};\n        let _uniqueId = 0;\n\n        // Set any defaults that have not been defined\n        getSetValue(_config, \"useMarks\", true);\n        getSetValue(_config, \"markPrefix\", \"ai.prfmrk.\");\n        getSetValue(_config, \"useEndMarks\", false);\n        getSetValue(_config, \"markEndPrefix\", \"ai.prfmrk-end.\");\n        getSetValue(_config, \"useMeasures\", true);\n        getSetValue(_config, \"measurePrefix\", \"ai.prfmsr.\");\n\n        dynamicProto(PerfMarkMeasureManager, this, (_self, _base) => {\n            const _perf = getPerformance();\n\n            _self.create = (src: string, payloadDetails?: () => any, isAsync?: boolean): IPerfEvent | null | undefined => {\n                let perfEvent = _base.create(src, payloadDetails, isAsync);\n                if (perfEvent) {\n                    const markName = _getMarkName(perfEvent);\n                    if (markName) {\n                        _perf.mark(markName);\n                    }\n                }\n\n                return perfEvent;\n            };\n\n            _self.fire = (perfEvent: IPerfEvent) => {\n                if (perfEvent) {\n                    let mrkEndName = null;\n                    if (_config.useEndMarks === true) {\n                        mrkEndName = perfEvent.getCtx(strCtxMarkEndName);\n                        if (mrkEndName) {\n                            _perf.mark(mrkEndName);\n                        }\n                    }\n\n                    let measureName = perfEvent.getCtx(strCtxMeasureName);\n                    if (measureName) {\n                        let mrkName = perfEvent.getCtx(strCtxMarkName);\n                        if (mrkName) {\n                            if (mrkEndName) {\n                                _perf.measure(measureName, mrkName, mrkEndName);\n                            } else {\n                                _perf.measure(measureName, mrkName);\n                            }\n                        } else {\n                            if (mrkEndName) {\n                                _perf.measure(measureName, undefined, mrkEndName);\n                            } else {\n                                _perf.measure(measureName);\n                            }\n                        }\n                    }\n\n                    _base.fire(perfEvent);\n                }\n            };\n        });\n\n        function _getMarkName(perfEvent: IPerfEvent): string {\n            let mrkName = null;\n            let postFix = \"\";\n            if (_config.uniqueNames) {\n                postFix = _uniqueId + \".\";\n                _uniqueId++;\n            }\n\n            if (_config.useMarks) {\n                let mappedName = _getMappedName(_config.markNameMap, perfEvent.name);\n                if (mappedName) {\n\n                    mrkName = (_config.markPrefix || \"\") + postFix + mappedName;\n                    perfEvent.setCtx(strCtxMarkName, mrkName);\n                    if (_config.useEndMarks === true) {\n                        let mrkEndName = (_config.markEndPrefix || \"\") + postFix + mappedName;\n                        perfEvent.setCtx(strCtxMarkEndName, mrkEndName);\n                    }\n                }\n            }\n\n            if (_config.useMeasures) {\n                let measureName = null;\n                let mappedName = _getMappedName(_config.measureNameMap || _config.markNameMap, perfEvent.name);\n                if (mappedName) {\n                    measureName = (_config.measurePrefix || \"\") + postFix + mappedName;\n                    perfEvent.setCtx(strCtxMeasureName, measureName);\n                }\n            }\n\n            return mrkName;\n        }\n\n        function _getMappedName(map: { [key: string]: string }, name: string) {\n            let mappedName = name;\n            if (map) {\n                // A map exists\n                mappedName = map[name];\n            }\n\n            return mappedName;\n        }\n    }\n\n    /**\n     * Create a new event and start timing, the manager may return null/undefined to indicate that it does not\n     * want to monitor this source event.\n     * @param src - The source name of the event\n     * @param payloadDetails - An optional callback function to fetch the payload details for the event.\n     * @param isAsync - Is the event occurring from a async event\n     */\n    public create(src: string, payload?: any, isAsync?: boolean): IPerfEvent | null | undefined {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Complete the perfEvent and fire any notifications.\n     * @param perfEvent - Fire the event which will also complete the passed event\n     */\n    public fire(perfEvent: IPerfEvent): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/src/applicationinsights-perfmarkmeasure-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { PerfMarkMeasureManager } from \"./PerfMarkMeasureManager\";\nimport { IPerfMarkMeasureConfiguration } from \"./interfaces/IPerfMarkMeasureConfiguration\";\n\nexport { IPerfManagerProvider, IPerfManager, IPerfEvent, INotificationManager, doPerf } from \"@microsoft/applicationinsights-core-js\";\nexport { PerfMarkMeasureManager, IPerfMarkMeasureConfiguration };\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/src/interfaces/IPerfMarkMeasureConfiguration.ts",
    "content": "/**\n* @copyright Microsoft 2021\n*/\n\n/**\n  * PerfMarkMeasure Configuration\n  */\nexport interface IPerfMarkMeasureConfiguration {\n\n    /**\n     * Should the Performance manager create and use window.performance.mark(), defaults to true\n     */\n    useMarks?: boolean;\n\n    /**\n     * Identifies the prefix for the mark, defaults to \"ai.prfmrk.\", the event name is appended for the mark\n     */\n    markPrefix?: string;\n\n    /**\n     * Make the marks and measures unique by appending a numeric value to the prefix value, defaults to false.\n     * Marks and measure for the same perfEvent will be assigned the same unique numeric value\n     */\n    uniqueNames?: boolean;\n\n    /**\n     * Provides a mapping between the internal perf names and the value used to create the mark,\n     * when a map is provided but no mapping is present that event will be ignored.\n     *\n     */\n    markNameMap?: { [key: string]: string };\n\n    /**\n     * Should the Performance manager create a mark when the event is fired, defaults to false\n     */\n    useEndMarks?: boolean;\n\n    /**\n     * Identifies the prefix for the \"end\" mark of a perf event, defaults to \"ai.prfmrk.end.\", the event name is appended for the mark\n     */\n    markEndPrefix?: string;\n\n    /**\n     * Should the Performance manager create and use window.performance.measure(), defaults to true\n     */\n    useMeasures?: boolean;\n\n    /**\n     * Identifies the prefix for the mark, defaults to \"ai.prfmsr.\", the event name is appended for the measure name\n     */\n    measurePrefix?: string;\n \n    /**\n     * Provides a mapping between the internal perf names and the value used to create the measure,\n     * when no measureNameMap is provided this will default to using the markNameMap and\n     * when a map is provided but no mapping is present that event will be ignored.\n     */\n    measureNameMap?: { [key: string]: string };\n  }\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"prefer-conditional-expression\": false\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-perfmarkmeasure-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-perfmarkmeasure-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-perfmarkmeasure-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-perfmarkmeasure-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-perfmarkmeasure-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!types/**"
  },
  {
    "path": "extensions/applicationinsights-properties-js/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-properties-js/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Properties Plugin\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-properties-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-properties-js)\n\nProperties Plugin (Part A) for the Application Insights Javascript SDK\n\n## Build:\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Run unit tests:\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/Unit/src/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"@microsoft/applicationinsights-core-js\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/Unit/src/SessionManager.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { SinonStub } from 'sinon';\nimport { AppInsightsCore, DiagnosticLogger, createCookieMgr, newId, dateNow, createDynamicConfig } from \"@microsoft/applicationinsights-core-js\";\nimport PropertiesPlugin from \"../../../src/PropertiesPlugin\";\nimport { _SessionManager } from \"../../../src/Context/Session\";\n\nexport class SessionManagerTests extends AITestClass {\n    private properties: PropertiesPlugin;\n    private core: AppInsightsCore;\n    private _cookies: { [name: string ]: string } = {};\n\n    constructor(emulateIe: boolean) {\n        super(\"SessionManagerTests\", emulateIe);\n    }\n\n    public testInitialize() {\n        let _self = this;\n        _self._cookies = {};\n        _self.core = new AppInsightsCore();\n        _self.core.logger = new DiagnosticLogger();\n        _self.core.setCookieMgr(createCookieMgr({\n            cookieCfg: {\n                setCookie: (name: string, value: string) => _self._setCookie(name, value),\n                getCookie: (name: string) => _self._getCookie(name),\n                delCookie: (name: string) => _self._delCookie(name)\n            }\n        }, _self.core.logger))\n        _self.properties = new PropertiesPlugin();\n    }\n\n    public testCleanup() {\n        this.core = null;\n        this.properties = null;\n    }\n\n    public registerTests() {\n        this.addSessionManagerTests();\n    }\n\n    private _setCookie(name: string, value: string) {\n        this._cookies[name] = value;\n    }\n\n    private _getCookie(name: string) {\n        let cookieValue = this._cookies[name] || \"\";\n        // Remove any cookie attributes added to the cookie\n        return cookieValue.split(\";\")[0];\n    }\n    \n    private _delCookie(name: string) {\n        if (this._cookies.hasOwnProperty(name)) {\n            delete this._cookies[name];\n        }\n    }\n\n    private _getNewId(idLength?: number) {\n        return newId(idLength);\n    }\n\n    private addSessionManagerTests() {\n\n        this.testCase({\n            name: 'Session uses name prefix for cookie storage',\n            test: () => {\n\n                var sessionPrefix = newId();\n                var config = createDynamicConfig({\n                    namePrefix: sessionPrefix,\n                    sessionExpirationMs: undefined,\n                    sessionRenewalMs: undefined,\n                    cookieDomain: undefined\n                }).cfg;\n                // Setup\n                let cookie = \"\";\n                const cookieStub: SinonStub = this.sandbox.stub(this.core.getCookieMgr(), 'set').callsFake((cookieName, value, maxAge, domain, path) => {\n                    cookie = cookieName;\n                });\n\n                // Act\n                const sessionManager = new _SessionManager(config, this.core);\n                sessionManager.update();\n\n                // Test\n                Assert.ok(cookieStub.called, 'cookie set');\n                Assert.equal('ai_session' + sessionPrefix, cookie, 'Correct cookie name when name prefix is provided - [' + cookie + ']');\n            }\n        });\n\n        this.testCase({\n            name: 'Session uses sessionCookiePostfix over namePrefix for cookie storage if both are configured.',\n            test: () => {\n\n                var sessionPrefix = newId();\n                var config = createDynamicConfig({\n                    namePrefix: sessionPrefix,\n                    sessionCookiePostfix: \"testSessionCookieNamePostfix\",\n                    sessionExpirationMs: undefined,\n                    sessionRenewalMs: undefined,\n                    cookieDomain: undefined\n\n                }).cfg;\n\n                // Setup\n                let cookie = \"\";\n                const cookieStub: SinonStub = this.sandbox.stub(this.core.getCookieMgr(), 'set').callsFake((cookieName, value, maxAge, domain, path) => {\n                    cookie = cookieName;\n                });\n\n                // Act\n                const sessionManager = new _SessionManager(config, this.core);\n                sessionManager.update();\n\n                // Test\n                Assert.ok(cookieStub.called, 'cookie set');\n                Assert.equal('ai_session' + 'testSessionCookieNamePostfix', cookie, 'Correct cookie name when session cookie postfix is provided - [' + cookie + ']');\n            }\n        });\n\n        this.testCase({\n            name: 'Validate Session default re-hydration within expiry period',\n            useFakeTimers: true,\n            test: () => {\n                var sessionPrefix = newId();\n                var config = createDynamicConfig({\n                    namePrefix: sessionPrefix,\n                    sessionExpirationMs: 30 * 60 * 1000,\n                    sessionRenewalMs: 24 * 60 * 60 * 1000,\n                    cookieDomain: undefined\n                }).cfg;\n\n                // Simulate 100ms as when zero the cookie values are deemed to be invalid\n                this.clock.tick(100);\n\n                // Initial Session\n                const sessionManager = new _SessionManager(config, this.core);\n                sessionManager.update();\n                let aiSessionValue = this._cookies['ai_session' + sessionPrefix];\n\n                // Simulate 100ms\n                this.clock.tick(100);\n\n                const revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, by the 2nd update\");\n                Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same\");\n            }\n        });\n\n        this.testCase({\n            name: 'Validate Session expiration period event when accessed',\n            useFakeTimers: true,\n            test: () => {\n                var sessionPrefix = newId();\n                var config = createDynamicConfig({\n                    namePrefix: sessionPrefix,\n                    sessionExpirationMs: 5000,\n                    sessionRenewalMs: 24 * 60 * 60 * 1000,\n                    cookieDomain: undefined\n                }).cfg;\n\n                // Simulate 100ms as when zero the cookie values are deemed to be invalid\n                this.clock.tick(100);\n\n                // Initial Session\n                const sessionManager = new _SessionManager(config, this.core);\n                sessionManager.update();\n                let aiSessionValue = this._cookies['ai_session' + sessionPrefix];\n\n                // Simulate 2 seconds\n                for (let lp = 0; lp < 20; lp++) {\n                    // Simulate 100ms\n                    this.clock.tick(100);\n\n                    const revisitSession = new _SessionManager(config, this.core);\n                    revisitSession.update();\n\n                    Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, by the \" + lp + \" loop\");\n                    Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same - \" + lp);\n                }\n\n\n                // Simulate another 2 seconds\n                this.clock.tick(2000);\n                let revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, after 4 seconds\");\n                Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same after 4 seconds\");\n\n                // Simulate 999ms\n                this.clock.tick(999);\n                revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, after 4.999 seconds\");\n                Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same after 4.999 seconds\");\n\n                // Now simulate going beyond the expiry period\n                this.clock.tick(2);\n                revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated after waiting 5 seconds\");\n                Assert.notEqual(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id have now changed after 5 seconds\");\n            }\n        });\n\n        this.testCase({\n            name: 'Validate Session renew period event when accessed',\n            useFakeTimers: true,\n            test: () => {\n                var sessionPrefix = newId();\n                var config = createDynamicConfig({\n                    namePrefix: sessionPrefix,\n                    sessionExpirationMs: 86400000,\n                    sessionRenewalMs: 5000,\n                    cookieDomain: undefined\n                }).cfg;\n\n                // Simulate 100ms as when zero the cookie values are deemed to be invalid\n                this.clock.tick(100);\n\n                // Initial Session\n                const sessionManager = new _SessionManager(config, this.core);\n                sessionManager.update();\n                let aiSessionValue = this._cookies['ai_session' + sessionPrefix];\n\n                // Simulate 10 seconds\n                for (let lp = 0; lp < 100; lp++) {\n                    // Simulate 100ms\n                    this.clock.tick(100);\n\n                    const revisitSession = new _SessionManager(config, this.core);\n                    revisitSession.update();\n\n                    Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, by the \" + lp + \" loop\");\n                    Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same - \" + lp);\n                }\n\n                // Simulate another 2 seconds\n                this.clock.tick(2000);\n                let revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, after \" + dateNow());\n                Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same after \" + dateNow());\n\n                // Simulate another 2 seconds (This still should not expire the cookie value as it was last accessed only 2 seconds ago)\n                this.clock.tick(2000);\n                revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated \" + dateNow());\n                Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same after \" + dateNow());\n\n                // Now simulate going beyond the expiry period\n                this.clock.tick(5001);\n                revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated after waiting \" + dateNow());\n                Assert.notEqual(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id have now changed after \" + dateNow());\n            }\n        });\n\n        this.testCase({\n            name: 'Validate Session default re-hydration from storage',\n            useFakeTimers: true,\n            test: () => {\n                var sessionPrefix = newId();\n                var config = createDynamicConfig({\n                    namePrefix: sessionPrefix,\n                    sessionExpirationMs: 30 * 60 * 1000,\n                    sessionRenewalMs: 24 * 60 * 60 * 1000,\n                    cookieDomain: undefined\n                }).cfg;\n\n                // Simulate 100ms as when zero the cookie values are deemed to be invalid\n                this.clock.tick(100);\n\n                // Initial Session\n                const sessionManager = new _SessionManager(config, this.core);\n                sessionManager.update();\n                let aiSessionValue = this._cookies['ai_session' + sessionPrefix];\n\n                // Simulate 100ms\n                this.clock.tick(100);\n\n                // remove the cookie\n                delete this._cookies['ai_session' + sessionPrefix];\n\n                let revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, by the 2nd update\");\n                Assert.notEqual(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id's are not the same\");\n\n                // Backup the data to storage\n                sessionManager.backup();\n\n                // remove the cookie again so this time it should restore from storage\n                delete this._cookies['ai_session' + sessionPrefix];\n                \n                revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, by the 2nd update\");\n                Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same\");\n            }\n        });\n\n        this.testCase({\n            name: 'Validate Session expiration period event when accessed from storage',\n            useFakeTimers: true,\n            test: () => {\n                var sessionPrefix = newId();\n                var config = createDynamicConfig({\n                    namePrefix: sessionPrefix,\n                    sessionExpirationMs: 5000,\n                    sessionRenewalMs: 24 * 60 * 60 * 1000,\n                    cookieDomain: undefined\n                }).cfg;\n\n                // Simulate 100ms as when zero the cookie values are deemed to be invalid\n                this.clock.tick(100);\n\n                // Initial Session\n                const sessionManager = new _SessionManager(config, this.core);\n                sessionManager.update();\n                let aiSessionValue = this._cookies['ai_session' + sessionPrefix];\n\n                // Backup the data to storage\n                sessionManager.backup();\n\n                // Simulate 2 seconds\n                for (let lp = 0; lp < 20; lp++) {\n                    // remove the cookie again so this time it should restore from storage\n                    delete this._cookies['ai_session' + sessionPrefix];\n\n                    // Simulate 100ms\n                    this.clock.tick(100);\n\n                    const revisitSession = new _SessionManager(config, this.core);\n                    revisitSession.update();\n\n                    Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, by the \" + lp + \" loop\");\n                    Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same - \" + lp);\n                }\n\n                // remove the cookie again so this time it should restore from storage\n                delete this._cookies['ai_session' + sessionPrefix];\n\n                // Simulate another 2.999 seconds\n                this.clock.tick(2999);\n                let revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated, after 4.999 seconds\");\n                Assert.equal(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id is the same after 4.999 seconds\");\n\n                // remove the cookie again so this time it should restore from storage\n                delete this._cookies['ai_session' + sessionPrefix];\n\n                // Now simulate going beyond the expiry period\n                this.clock.tick(2);\n                revisitSession = new _SessionManager(config, this.core);\n                revisitSession.update();\n\n                Assert.notEqual(aiSessionValue, this._cookies['ai_session' + sessionPrefix], \"The cookie value should have been updated after waiting 5 seconds\");\n                Assert.notEqual(sessionManager.automaticSession.id, revisitSession.automaticSession.id, \"Validate session id have now changed after 5 seconds\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/Unit/src/TelemetryContext.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore, createDynamicConfig } from \"@microsoft/applicationinsights-core-js\";\nimport { _SessionManager } from \"../../../src/Context/Session\";\nimport { TelemetryContext } from \"../../../src/TelemetryContext\";\nimport { IConfiguration } from \"@microsoft/applicationinsights-core-js\";\nimport { TestChannelPlugin } from \"./TestChannelPlugin\";\n\nexport class TelemetryContextTests extends AITestClass {\n    private core: AppInsightsCore;\n    private _config: IConfiguration;\n    private _cookies: { [name: string ]: string } = {};\n\n    constructor(emulateIe?: boolean) {\n        super(\"TelemetryContextTests\", emulateIe);\n    }\n\n    public testInitialize() {\n        let _self = this;\n        _self._config = createDynamicConfig({\n            instrumentationKey: \"Test-iKey\",\n            disableInstrumentationKeyValidation: true,\n            extensions: [ new TestChannelPlugin() ],\n            extensionConfig: {\n                AppInsightsPropertiesPlugin: {}\n            },\n            cookieCfg: {\n                setCookie: (name: string, value: string) => {},\n                getCookie: (name: string) => { return \"\"; },\n                delCookie: (name: string) => {}\n            }\n        }, null).cfg;\n\n        _self._cookies = {};\n        _self.core = new AppInsightsCore();\n        _self.core.initialize(_self._config, []);\n        _self.core.logger = _self.core.logger;\n    }\n\n    public testCleanup() {\n        this.core = null;\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: 'TelemetryContext: applyOperationContext - default',\n            test: () => {\n                let coreParentId = this.core.getTraceCtx()?.getSpanId();\n                let coreTraceId = this.core.getTraceCtx()?.getTraceId();\n                let context = new TelemetryContext(this.core, this._config.extensionConfig!.AppInsightsPropertiesPlugin);\n                let theEvent = {} as any;\n\n                context.applyOperationContext(theEvent);\n\n                Assert.equal(context.telemetryTrace.traceID, theEvent.ext.trace.traceID, \"Validate traceId\");\n                Assert.equal(coreTraceId, theEvent.ext.trace.traceID, \"Validate traceId\");\n                Assert.equal(coreParentId, theEvent.ext.trace.parentID, \"ParentID matches the core spanId\");\n            }\n        });\n\n        this.testCase({\n            name: 'TelemetryContext: applyOperationContext - does not override traceId',\n            test: () => {\n\n                Assert.ok(this.core, \"Core is not null\");\n                let context = new TelemetryContext(this.core, this._config.extensionConfig!.AppInsightsPropertiesPlugin);\n                let theEvent = {\n                    ext: {\n                        trace: {\n                            traceID: \"myTraceId\"\n                        }\n                    }\n                } as any;\n\n                context.telemetryTrace.traceID = \"defaultTraceId\";\n                Assert.equal(\"defaultTraceId\", context.telemetryTrace.traceID, \"traceId should be defaultTraceId\");\n                context.telemetryTrace.parentID = \"defaultParentId\";\n                Assert.equal(\"defaultParentId\", context.telemetryTrace.parentID, \"parentId should be defaultParentId\");\n\n                context.applyOperationContext(theEvent);\n\n                Assert.equal(\"myTraceId\", theEvent.ext.trace.traceID, \"Validate traceId\");\n                Assert.equal(\"defaultParentId\", theEvent.ext.trace.parentID, \"Check ParentID\");\n            }\n        });\n\n        this.testCase({\n            name: 'TelemetryContext: applyOperationContext - does not override parentID',\n            test: () => {\n\n                let context = new TelemetryContext(this.core, this._config.extensionConfig!.AppInsightsPropertiesPlugin);\n                let theEvent = {\n                    ext: {\n                        trace: {\n                            parentID: \"mySpanId\"\n                        }\n                    }\n                } as any;\n\n                context.telemetryTrace.traceID = \"defaultTraceId\";\n                context.telemetryTrace.parentID = \"defaultParentId\";\n\n                context.applyOperationContext(theEvent);\n\n                Assert.equal(\"defaultTraceId\", theEvent.ext.trace.traceID, \"Validate traceId\");\n                Assert.equal(\"mySpanId\", theEvent.ext.trace.parentID, \"Check ParentID\");\n            }\n        });\n\n        this.testCase({\n            name: 'TelemetryContext: applyOperationContext - does not override traceId and parentID',\n            test: () => {\n\n                let context = new TelemetryContext(this.core, this._config.extensionConfig!.AppInsightsPropertiesPlugin);\n                let theEvent = {\n                    ext: {\n                        trace: {\n                            traceID: \"myTraceId\",\n                            parentID: \"mySpanId\"\n                        }\n                    }\n                } as any;\n\n                context.telemetryTrace.traceID = \"defaultTraceId\";\n                context.telemetryTrace.parentID = \"defaultParentId\";\n\n                context.applyOperationContext(theEvent);\n\n                Assert.equal(\"myTraceId\", theEvent.ext.trace.traceID, \"Validate traceId\");\n                Assert.equal(\"mySpanId\", theEvent.ext.trace.parentID, \"Check ParentID\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/Unit/src/TestChannelPlugin.ts",
    "content": "import { IChannelControls, IConfiguration, ITelemetryItem, ITelemetryPlugin, ITelemetryPluginChain } from \"@microsoft/applicationinsights-core-js\";\n\n\nexport class TestChannelPlugin implements IChannelControls {\n\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry;\n\n    public identifier = \"Sender\";\n\n    setNextPlugin(next: ITelemetryPlugin | ITelemetryPluginChain) {\n        // no next setup\n    }\n\n    public priority: number = 1001;\n\n    public initialize = (config: IConfiguration) => {\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/Unit/src/prop.tests.ts",
    "content": "import '@microsoft/applicationinsights-shims';\nimport { PropertiesTests } from \"./properties.tests\";\nimport { SessionManagerTests } from \"./SessionManager.Tests\";\nimport { PropertiesExtensionSizeCheck } from \"./propertiesSize.tests\";\nimport { TelemetryContextTests } from \"./TelemetryContext.Tests\";\nimport { GlobalTestHooks } from './GlobalTestHooks.Test';\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new PropertiesTests().registerTests();\n    new SessionManagerTests(false).registerTests();\n    new SessionManagerTests(true).registerTests();\n    new PropertiesExtensionSizeCheck().registerTests();\n    new TelemetryContextTests().registerTests();\n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/Unit/src/properties.tests.ts",
    "content": "﻿import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore, IConfiguration, DiagnosticLogger, ITelemetryItem, createCookieMgr, newId, strTrim, ITelemetryPlugin, IChannelControls, random32, objForEachKey } from \"@microsoft/applicationinsights-core-js\";\nimport PropertiesPlugin from \"../../../src/PropertiesPlugin\";\nimport { IPropertiesConfig } from \"../../../src/Interfaces/IPropertiesConfig\";\nimport { TelemetryContext } from \"../../../src/TelemetryContext\";\nimport { IConfig, utlCanUseLocalStorage, utlGetLocalStorage } from \"@microsoft/applicationinsights-core-js\";\nimport { TestChannelPlugin } from \"./TestChannelPlugin\";\nimport { SinonStub } from 'sinon';\n\nexport class PropertiesTests extends AITestClass {\n    private properties: PropertiesPlugin;\n    private core: AppInsightsCore;\n    private _cookies: { [name: string ]: string } = {};\n\n    public testInitialize() {\n        let _self = this;\n        _self._cookies = {};\n        _self.core = new AppInsightsCore();\n        _self.core.logger = new DiagnosticLogger();\n        _self.core.setCookieMgr(createCookieMgr({\n            cookieCfg: {\n                setCookie: (name: string, value: string) => _self._setCookie(name, value),\n                getCookie: (name: string) => _self._getCookie(name),\n                delCookie: (name: string) => _self._delCookie(name)\n            }\n        }, _self.core.logger))\n        _self.properties = new PropertiesPlugin();\n    }\n\n    public testCleanup() {\n        this.core = null;\n        this.properties = null;\n    }\n\n    public registerTests() {\n        this.addConfigTests();\n        this.addUserTests();\n        this.addDeviceTests();\n        this.addTelemetryTraceTests();\n        this.addSessionTests();\n    }\n\n    private _setCookie(name: string, value: string) {\n        this._cookies[name] = value;\n    }\n\n    private _getCookie(name: string) {\n        let cookieValue = this._cookies[name] || \"\";\n        // Remove any cookie attributes added to the cookie\n        return cookieValue.split(\";\")[0];\n    }\n    \n    private _delCookie(name: string) {\n        if (this._cookies.hasOwnProperty(name)) {\n            delete this._cookies[name];\n        }\n    }\n\n    private _getNewId(idLength?: number) {\n        return newId(idLength);\n    }\n\n    private addTelemetryTraceTests() {\n        this.testCase({\n            name: 'Trace: default operation.name is grabbed from window pathname, if available',\n            test: () => {\n                this.properties.initialize({\n                    instrumentationKey: 'instrumentation_key',\n                    accountId: 'abc',\n                    samplingPercentage: 15,\n                    sessionExpirationMs: 99999,\n                    extensionConfig: {\n                        [this.properties.identifier]: {\n                            sessionExpirationMs: 88888\n                        }\n                    }\n                }, this.core, []);                \n                const operation = this.properties.context.telemetryTrace;\n                Assert.ok(operation.name);\n            }\n        });\n\n        this.testCase({\n            name: 'Trace: operation.name is truncated to max size 1024 if too long',\n            test: () => {\n                this.properties.initialize({\n                    instrumentationKey: 'instrumentation_key',\n                    accountId: 'abc',\n                    samplingPercentage: 15,\n                    sessionExpirationMs: 99999,\n                    extensionConfig: {\n                        [this.properties.identifier]: {\n                            sessionExpirationMs: 88888\n                        }\n                    }\n                }, this.core, []); \n                const operation = this.properties.context.telemetryTrace;\n                operation.name = new Array(1234).join(\"a\"); // exceeds max of 1024\n                Assert.ok(operation.name);\n                Assert.equal(operation.name.length, 1024);\n            }\n        });\n    }\n\n    private addConfigTests() {\n        this.testCase({\n            name: 'Properties Configuration: Config options can be passed from root config',\n            test: () => {\n                this.properties.initialize({\n                    instrumentationKey: 'instrumentation_key',\n                    accountId: 'abc',\n                    samplingPercentage: 15,\n                    sessionExpirationMs: 99999,\n                    extensionConfig: {\n                        [this.properties.identifier]: {\n                            sessionExpirationMs: 88888\n                        }\n                    }\n                }, this.core, []);\n                const config: IPropertiesConfig = this.properties['_extConfig'];\n                Assert.equal(15, config.samplingPercentage, 'Extension configs can be set via root config (number)');\n                Assert.equal('abc', config.accountId, 'Extension configs can be set via root config (string)');\n                Assert.equal(88888, config.sessionExpirationMs, 'Root config does not override extensionConfig field when both are present')\n                Assert.notEqual(99999, config.sessionExpirationMs, 'extensionConfig overrides root config field when both are present');\n            }\n\n        });\n\n        this.testCase({\n            name: \"Properties Configuration: default config can be set from root\",\n            useFakeTimers: true,\n            test: () => {\n                const core = new AppInsightsCore();\n                const channel = new TestChannelPlugin();\n                const properties = new PropertiesPlugin();\n                let undefString: string;\n                let nullValue: any = null;\n                let id = properties.identifier;\n                const config = {\n                    instrumentationKey: \"instrumentation_key\",\n                    extensionConfig: {}\n                };\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                // Initialize\n                core.initialize(config, [channel, properties]);\n\n                //Check defaults\n                core.config.extensionConfig =  core.config.extensionConfig?  core.config.extensionConfig : {};\n                let extConfig =  core.config.extensionConfig[id];\n\n                let exceptedDefaultConfig = {\n                    accountId: null,\n                    sessionRenewalMs: 30 * 60 * 1000,\n                    samplingPercentage: 100,\n                    sessionExpirationMs: 24 * 60 * 60 * 1000,\n                    cookieDomain: nullValue,\n                    sdkExtension: nullValue,\n                    isBrowserLinkTrackingEnabled: false,\n                    appId: nullValue,\n                    getSessionId: nullValue,\n                    namePrefix: undefString,\n                    sessionCookiePostfix: undefString,\n                    userCookiePostfix: undefString,\n                    idLength: 22,\n                    getNewId: nullValue\n                };\n\n                Assert.deepEqual(extConfig, exceptedDefaultConfig, \"default config is set\");\n            }\n        });\n\n        this.testCase({\n            name: \"Properties Configuration: config can be set from root dynamically\",\n            useFakeTimers: true,\n            test: () => {\n                const core = new AppInsightsCore();\n                core.setCookieMgr(createCookieMgr({\n                    cookieCfg: {\n                        setCookie: (name: string, value: string) => this._setCookie(name, value),\n                        getCookie: (name: string) => this._getCookie(name),\n                        delCookie: (name: string) => this._delCookie(name)\n                    }\n                }, core.logger))\n                const channel = new TestChannelPlugin();\n                const properties = new PropertiesPlugin();\n                let exceptedDefaultConfig = {\n                    accountId: \"id1\",\n                    sessionRenewalMs: 30 * 60 * 101,\n                    samplingPercentage: 90,\n                    sessionExpirationMs: 24 * 60 * 60 * 101,\n                    cookieDomain: \"domain1\",\n                    sdkExtension: \"ext1\",\n                    isBrowserLinkTrackingEnabled: false,\n                    appId: \"id1\",\n                    getSessionId: \"session1\",\n                    namePrefix: \"prefix1\",\n                    sessionCookiePostfix: \"postfix1\",\n                    userCookiePostfix: \"usercookie1\",\n                    idLength: 26,\n                    getNewId: (idLength?: number) => {\n                        return \"\" + (idLength || 0);\n                    }\n                } as IPropertiesConfig;\n                let id = properties.identifier;\n                const config = {\n                    instrumentationKey: \"instrumentation_key\",\n                    extensionConfig: {\n                        [id]: exceptedDefaultConfig\n                    }\n                };\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let appBuild = \"build\";\n                let deviceId = \"newDeviceId\";\n                let locId = \"locId\";\n                let parentId = \"parentId\";\n                let seId = \"sessionId\";\n                let cookie = \"\";\n                let cookieValue = \"\"\n                const cookieStub: SinonStub = this.sandbox.stub(core.getCookieMgr(), \"set\").callsFake((cookieName, value, maxAge, domain, path) => {\n                    cookie = cookieName;\n                    cookieValue = value;\n                });\n\n                // Initialize\n                core.initialize(config, [channel, properties]);\n                let extConfig = properties[\"_extConfig\"];\n                Assert.deepEqual(extConfig, exceptedDefaultConfig, \"intial config is set\");\n\n                // check inital context\n                let propCtx = properties.context;\n                let appId = propCtx.appId();\n                Assert.equal(appId, null, \"appId should be null\");\n\n                let application = propCtx.application;\n                Assert.equal(application.build, null, \"application build should be null by default\");\n               \n                let device = propCtx.device;\n                Assert.equal(device.id, \"browser\", \"device id should not be null\");\n              \n                let location = propCtx.location;\n                Assert.ok(location, \"location should not be null\");\n               \n                let trace = propCtx.telemetryTrace;\n                let traceId = trace.traceID;\n                Assert.ok(trace, \"trace should not be null\");\n                Assert.ok(trace.name, \"trace name should not be null\");\n                Assert.ok(traceId, \"trace id should not be null\");\n                Assert.ok(!trace.parentID, \"trace parent should be null\");\n                \n                let user = propCtx.user;\n                Assert.deepEqual(user.config, exceptedDefaultConfig, \"user config should be updated\");\n\n                let internalSdkVer = propCtx.internal.sdkVersion;\n                Assert.ok(internalSdkVer.indexOf(\"ext1\") > -1, \"sdk ext prefix should be used\");\n\n                let session = propCtx.session;\n                Assert.ok(session, \"session should not be null\");\n\n                let sessionMgr = propCtx.sessionManager;\n                Assert.ok(sessionMgr.automaticSession, \"session mgr should not be null\");\n             \n                let os = propCtx.os;\n                Assert.equal(os, null, \"os should be null\");\n            \n                let web = propCtx.web;\n                Assert.equal(web, null, \"web should be null\");\n\n                let sessionId = propCtx.getSessionId();\n                Assert.equal(sessionId, null, \"session Id should be null\");\n                \n                // change properities here to make sure we won't overwrite them after config change\n                device.id = deviceId;\n                location.ip = locId;\n                trace.parentID = parentId;\n                application.build = appBuild;\n                session.id = seId;\n                sessionMgr.automaticSession.id = seId;\n                Assert.equal(propCtx.getSessionId(), seId, \"session Id should be updated test1\");\n                let sessionPrefix = \"ai_session\" + \"postfix1\";\n                sessionMgr.backup();\n                let sessionStorage = utlGetLocalStorage(core.logger, sessionPrefix);\n                Assert.ok(sessionStorage.indexOf(seId) > -1, \"sessionStorage should be set based on session id test1\");\n\n                sessionMgr.update();\n                Assert.ok(cookieStub.called, \"cookie set test1\");\n                Assert.equal(sessionPrefix, cookie, \"cookie name is set test1\");\n                Assert.ok(cookieValue.indexOf(seId) > -1, \"cookie value is set test1\");\n                this.clock.tick(20);\n                sessionMgr.update();\n                Assert.equal(sessionMgr.automaticSession.id, seId, \"session id should be same test1\");\n                this.clock.tick(24 * 60 * 60 * 101 - 20);\n                sessionMgr.update();\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should be renewed test1\");\n                Assert.ok(cookieValue.indexOf(\"26|\") > -1,\"cookie value is reset test1\");\n              \n                // change config\n                let newConfig = {\n                    accountId: \"id2\",\n                    sessionRenewalMs: 30 * 60 * 102,\n                    samplingPercentage: 90,\n                    sessionExpirationMs: 24 * 60 * 60 * 102,\n                    cookieDomain: \"domain2\",\n                    sdkExtension: \"ext2\",\n                    isBrowserLinkTrackingEnabled: true,\n                    appId: \"id2\",\n                    getSessionId: \"session2\",\n                    namePrefix: \"prefix2\",\n                    sessionCookiePostfix: \"postfix2\",\n                    userCookiePostfix: \"usercookie2\",\n                    idLength: 26,\n                    getNewId: (idLength?: number) => {\n                        return \"\" + (idLength || 0) + 1;\n                    }\n                } as IPropertiesConfig;\n\n                core.config.extensionConfig =  core.config.extensionConfig?  core.config.extensionConfig : {};\n                let coreExtConfig = core.config.extensionConfig[id]\n                objForEachKey(newConfig, (key, value) => {\n                    coreExtConfig[key] = value;\n                });\n                this.clock.tick(1);\n\n                // properties that should be updated\n                extConfig = properties[\"_extConfig\"];\n                Assert.deepEqual(extConfig, newConfig, \"extConfig should be updated\");\n                propCtx = properties.context;\n\n                user = propCtx.user;\n                Assert.deepEqual(user.config, newConfig, \"user config should be updated\");\n\n                internalSdkVer = propCtx.internal.sdkVersion;\n                Assert.ok(internalSdkVer.indexOf(\"ext2\") > -1, \"sdk ext prefix should be used and updated\");\n\n                sessionMgr = propCtx.sessionManager;\n                Assert.ok(sessionMgr.automaticSession, \"session mgr should not be null\");\n                sessionPrefix = \"ai_session\" + \"postfix2\";\n                sessionMgr.backup();\n                sessionStorage = utlGetLocalStorage(core.logger, sessionPrefix);\n                Assert.ok(sessionStorage.indexOf(\"26\") > -1, \"sessionStorage should be updated based on session id test2\");\n                Assert.ok(cookieValue.indexOf(\"26|\") > -1, \"cookie should not be updated test2\");\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should not be renewed test2\");\n                \n                this.clock.tick(60000);\n                sessionMgr.update();\n                Assert.ok(cookieStub.called, \"cookie set test3\");\n                Assert.equal(sessionPrefix, cookie, \"cookie name is set test3\");\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should not be renewed test3\");\n                Assert.ok(cookieValue.indexOf(\"26|\") > -1, \"cookie value should use previous session id test3\");\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should not be renewed test4\");\n                this.clock.tick(24 * 60 * 60 * 102);\n                sessionMgr.update();\n                Assert.ok(cookieStub.called, \"cookie set test5\");\n                Assert.equal(sessionPrefix, cookie, \"cookie name is set test5\");\n                Assert.ok(cookieValue.indexOf(\"261|\") > -1, \"cookie value is renewed test6\");\n                Assert.equal(sessionMgr.automaticSession.id, \"261\", \"session id should be renewed test6\");\n\n                //properties that should not be updated\n                appId = propCtx.appId();\n                Assert.equal(appId, null, \"appId should be null\");\n\n                application = propCtx.application;\n                Assert.equal(application.build, appBuild, \"application build should not be updated\");\n\n                device = propCtx.device;\n                Assert.equal(device.id, deviceId, \"device id should not be updated\");\n\n                location = propCtx.location;\n                Assert.equal(location.ip, locId, \"location should not be updated\");\n\n                trace = propCtx.telemetryTrace;\n                Assert.ok(trace, \"trace should not be null\");\n                Assert.ok(trace.name, \"trace name should not be null\");\n                Assert.equal(trace.traceID, traceId, \"trace id should be same with previous one\");\n                Assert.equal(trace.parentID, parentId, \"trace parent should not be updated\");\n             \n                session = propCtx.session;\n                Assert.equal(session.id, seId, \"session should not be updated\");\n                \n                os = propCtx.os;\n                Assert.equal(os, null,\"os should not be updated\");\n\n                sessionId = propCtx.getSessionId();\n                Assert.equal(sessionId, seId, \"session Id should not be updated\");\n                \n                if (utlCanUseLocalStorage()) {\n                    window.localStorage.clear();\n                }\n                core.getCookieMgr().del(\"ai_session\" + \"postfix1\");\n                core.getCookieMgr().del(\"ai_session\" + \"postfix2\");\n            }\n        });\n\n        this.testCase({\n            name: \"Properties Configuration: config can be set from root dynamically and updated as a new single object\",\n            useFakeTimers: true,\n            test: () => {\n                const core = new AppInsightsCore();\n                core.setCookieMgr(createCookieMgr({\n                    cookieCfg: {\n                        setCookie: (name: string, value: string) => this._setCookie(name, value),\n                        getCookie: (name: string) => this._getCookie(name),\n                        delCookie: (name: string) => this._delCookie(name)\n                    }\n                }, core.logger))\n                const channel = new TestChannelPlugin();\n                const properties = new PropertiesPlugin();\n                let exceptedDefaultConfig = {\n                    accountId: \"id1\",\n                    sessionRenewalMs: 30 * 60 * 101,\n                    samplingPercentage: 90,\n                    sessionExpirationMs: 24 * 60 * 60 * 101,\n                    cookieDomain: \"domain1\",\n                    sdkExtension: \"ext1\",\n                    isBrowserLinkTrackingEnabled: false,\n                    appId: \"id1\",\n                    getSessionId: \"session1\",\n                    namePrefix: \"prefix1\",\n                    sessionCookiePostfix: \"postfix1\",\n                    userCookiePostfix: \"usercookie1\",\n                    idLength: 26,\n                    getNewId: (idLength?: number) => {\n                        return \"\" + (idLength || 0);\n                    }\n                } as IPropertiesConfig;\n                let id = properties.identifier;\n                const config = {\n                    instrumentationKey: \"instrumentation_key\",\n                    extensionConfig: {\n                        [id]: exceptedDefaultConfig\n                    }\n                };\n                this.onDone(() => {\n                    core.unload(false);\n                });\n                let appBuild = \"build\";\n                let deviceId = \"newDeviceId\";\n                let locId = \"locId\";\n                let parentId = \"parentId\";\n                let seId = \"sessionId\";\n                let cookie = \"\";\n                let cookieValue = \"\"\n                const cookieStub: SinonStub = this.sandbox.stub(core.getCookieMgr(), \"set\").callsFake((cookieName, value, maxAge, domain, path) => {\n                    cookie = cookieName;\n                    cookieValue = value;\n                });\n\n                // Initialize\n                core.initialize(config, [channel, properties]);\n                let extConfig = properties[\"_extConfig\"];\n                Assert.deepEqual(extConfig, exceptedDefaultConfig, \"intial config is set\");\n\n                // check inital context\n                let propCtx = properties.context;\n                let appId = propCtx.appId();\n                Assert.equal(appId, null, \"appId should be null\");\n\n                let application = propCtx.application;\n                Assert.equal(application.build, null, \"application build should be null by default\");\n               \n                let device = propCtx.device;\n                Assert.equal(device.id, \"browser\", \"device id should not be null\");\n              \n                let location = propCtx.location;\n                Assert.ok(location, \"location should not be null\");\n               \n                let trace = propCtx.telemetryTrace;\n                let traceId = trace.traceID;\n                Assert.ok(trace, \"trace should not be null\");\n                Assert.ok(trace.name, \"trace name should not be null\");\n                Assert.ok(traceId, \"trace id should not be null\");\n                Assert.ok(!trace.parentID, \"trace parent should be null\");\n                \n                let user = propCtx.user;\n                Assert.deepEqual(user.config, exceptedDefaultConfig, \"user config should be updated\");\n\n                let internalSdkVer = propCtx.internal.sdkVersion;\n                Assert.ok(internalSdkVer.indexOf(\"ext1\") > -1, \"sdk ext prefix should be used\");\n\n                let session = propCtx.session;\n                Assert.ok(session, \"session should not be null\");\n\n                let sessionMgr = propCtx.sessionManager;\n                Assert.ok(sessionMgr.automaticSession, \"session mgr should not be null\");\n             \n                let os = propCtx.os;\n                Assert.equal(os, null, \"os should be null\");\n            \n                let web = propCtx.web;\n                Assert.equal(web, null, \"web should be null\");\n\n                let sessionId = propCtx.getSessionId();\n                Assert.equal(sessionId, null, \"session Id should be null\");\n                \n                // change properities here to make sure we won't overwrite them after config change\n                device.id = deviceId;\n                location.ip = locId;\n                trace.parentID = parentId;\n                application.build = appBuild;\n                session.id = seId;\n                sessionMgr.automaticSession.id = seId;\n                Assert.equal(propCtx.getSessionId(), seId, \"session Id should be updated test1\");\n                let sessionPrefix = \"ai_session\" + \"postfix1\";\n                sessionMgr.backup();\n                let sessionStorage = utlGetLocalStorage(core.logger, sessionPrefix);\n                Assert.ok(sessionStorage.indexOf(seId) > -1, \"sessionStorage should be set based on session id test1\");\n\n                sessionMgr.update();\n                Assert.ok(cookieStub.called, \"cookie set test1\");\n                Assert.equal(sessionPrefix, cookie, \"cookie name is set test1\");\n                Assert.ok(cookieValue.indexOf(seId) > -1, \"cookie value is set test1\");\n                this.clock.tick(20);\n                sessionMgr.update();\n                Assert.equal(sessionMgr.automaticSession.id, seId, \"session id should be same test1\");\n                this.clock.tick(24 * 60 * 60 * 101 - 20);\n                sessionMgr.update();\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should be renewed test1\");\n                Assert.ok(cookieValue.indexOf(\"26|\") > -1,\"cookie value is reset test1\");\n              \n                // change config\n                let newConfig = {\n                    accountId: \"id2\",\n                    sessionRenewalMs: 30 * 60 * 102,\n                    samplingPercentage: 90,\n                    sessionExpirationMs: 24 * 60 * 60 * 102,\n                    cookieDomain: \"domain2\",\n                    sdkExtension: \"ext2\",\n                    isBrowserLinkTrackingEnabled: true,\n                    appId: \"id2\",\n                    getSessionId: \"session2\",\n                    namePrefix: \"prefix2\",\n                    sessionCookiePostfix: \"postfix2\",\n                    userCookiePostfix: \"usercookie2\",\n                    idLength: 26,\n                    getNewId: (idLength?: number) => {\n                        return \"\" + (idLength || 0) + 1;\n                    }\n                } as IPropertiesConfig;\n\n                core.config.extensionConfig =  core.config.extensionConfig?  core.config.extensionConfig : {};\n                core.config.extensionConfig[id] = newConfig;\n                this.clock.tick(1);\n\n                // properties that should be updated\n                extConfig = properties[\"_extConfig\"];\n                Assert.deepEqual(extConfig, newConfig, \"extConfig should be updated\");\n                propCtx = properties.context;\n\n                user = propCtx.user;\n                Assert.deepEqual(user.config, newConfig, \"user config should be updated\");\n\n                internalSdkVer = propCtx.internal.sdkVersion;\n                Assert.ok(internalSdkVer.indexOf(\"ext2\") > -1, \"sdk ext prefix should be used and updated\");\n\n                sessionMgr = propCtx.sessionManager;\n                Assert.ok(sessionMgr.automaticSession, \"session mgr should not be null\");\n                sessionPrefix = \"ai_session\" + \"postfix2\";\n                sessionMgr.backup();\n                sessionStorage = utlGetLocalStorage(core.logger, sessionPrefix);\n                Assert.ok(sessionStorage.indexOf(\"26\") > -1, \"sessionStorage should be updated based on session id test2\");\n                Assert.ok(cookieValue.indexOf(\"26|\") > -1, \"cookie should not be updated test2\");\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should not be renewed test2\");\n                \n                this.clock.tick(60000);\n                sessionMgr.update();\n                Assert.ok(cookieStub.called, \"cookie set test3\");\n                Assert.equal(sessionPrefix, cookie, \"cookie name is set test3\");\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should not be renewed test3\");\n                Assert.ok(cookieValue.indexOf(\"26|\") > -1, \"cookie value should use previous session id test3\");\n                Assert.equal(sessionMgr.automaticSession.id, \"26\", \"session id should not be renewed test4\");\n                this.clock.tick(24 * 60 * 60 * 102);\n                sessionMgr.update();\n                Assert.ok(cookieStub.called, \"cookie set test5\");\n                Assert.equal(sessionPrefix, cookie, \"cookie name is set test5\");\n                Assert.ok(cookieValue.indexOf(\"261|\") > -1, \"cookie value is renewed test6\");\n                Assert.equal(sessionMgr.automaticSession.id, \"261\", \"session id should be renewed test6\");\n\n                //properties that should not be updated\n                appId = propCtx.appId();\n                Assert.equal(appId, null, \"appId should be null\");\n\n                application = propCtx.application;\n                Assert.equal(application.build, appBuild, \"application build should not be updated\");\n\n                device = propCtx.device;\n                Assert.equal(device.id, deviceId, \"device id should not be updated\");\n\n                location = propCtx.location;\n                Assert.equal(location.ip, locId, \"location should not be updated\");\n\n                trace = propCtx.telemetryTrace;\n                Assert.ok(trace, \"trace should not be null\");\n                Assert.ok(trace.name, \"trace name should not be null\");\n                Assert.equal(trace.traceID, traceId, \"trace id should be same with previous one\");\n                Assert.equal(trace.parentID, parentId, \"trace parent should not be updated\");\n             \n                session = propCtx.session;\n                Assert.equal(session.id, seId, \"session should not be updated\");\n                \n                os = propCtx.os;\n                Assert.equal(os, null,\"os should not be updated\");\n\n                sessionId = propCtx.getSessionId();\n                Assert.equal(sessionId, seId, \"session Id should not be updated\");\n                \n                if (utlCanUseLocalStorage()) {\n                    window.localStorage.clear();\n                }\n                core.getCookieMgr().del(\"ai_session\" + \"postfix1\");\n                core.getCookieMgr().del(\"ai_session\" + \"postfix2\");\n            }\n        });\n    }\n\n\n    private addDeviceTests() {\n        this.testCase({\n            name: 'Device: device context adds Browser field to ITelemetryItem',\n            test: () => {\n                this.properties.initialize({\n                    instrumentationKey: 'key',\n                    extensionConfig: {}\n                }, this.core, []);\n                this.properties.context.user.isNewUser = false;\n                // Act\n                const item: ITelemetryItem = {name: 'item'};\n                this.properties.processTelemetry(item);\n\n                // Assert\n                Assert.equal(\"Browser\", item.ext.device.deviceClass);\n                Assert.equal(\"browser\", item.ext.device.localId);\n            }\n        });\n    }\n\n    private addUserTests() {\n        this.testCase({\n            name: 'User: user context initializes from cookie when possible',\n            test: () => {\n                // setup\n                const id = \"someUserId\";\n                var cookieStub = this.sandbox.stub(this as any, \"_getCookie\").callsFake(() => id + \"||||\");\n\n                // Act\n                Assert.ok(cookieStub.notCalled, 'Cookie not yet grabbed');\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                Assert.ok(cookieStub.called, 'Cookie grabbed');\n\n                // Assert\n                Assert.equal(id, this.properties.context.user.id, 'user id was set from cookie');\n            }\n        });\n\n        this.testCase({\n            name: 'User: track is triggered if user context is first time initialized and _disableUserInitMessage is set to false',\n            useFakeTimers: true,\n            test: () => {\n                var setCookieStub = this.sandbox.stub(this as any, \"_setCookie\").callsFake(() => {});\n                Assert.ok(setCookieStub.notCalled, 'Cookie not yet generated');\n                this.core.initialize(this.getEmptyConfig(), [this.properties]);\n                Assert.ok(setCookieStub.called, 'Cookie generated');\n\n                var loggingStub = this.sandbox.stub(this.core.logger, \"logInternalMessage\");\n                Assert.ok(loggingStub.notCalled, 'logInternalMessage is not yet triggered');\n\n                this.core.config[\"disableUserInitMessage\"] = false;\n                this.clock.tick(1000);\n\n                // Assert\n                Assert.equal(true, this.properties.context.user.isNewUser, 'current user is a new user');\n                const item: ITelemetryItem = {name: 'item'};\n                this.properties.processTelemetry(item);\n                // this.clock.tick(1000);\n                Assert.ok(loggingStub.called, 'logInternalMessage is triggered');\n                Assert.equal(false, this.properties.context.user.isNewUser, 'current user is not new user with ai_user cookie set')\n            }\n        });\n\n        this.testCase({\n            name: \"ai_user cookie is set with acq date and year expiration\",\n            useFakeTimers: true,\n            test: () => {\n                // setup\n                var actualCookieName: string;\n                var actualCookieValue: string;\n\n                // Just move the time forward a random amount of time so that the cookie time is different for different test runs\n                this.clock.tick(random32());\n\n                var newIdStub = this.sandbox.stub(this as any, \"_getNewId\").callsFake(() => \"newId\");\n                var getCookieStub = this.sandbox.stub(this as any, \"_getCookie\").callsFake(() =>\"\");\n                var setCookieStub = this.sandbox.stub(this as any, \"_setCookie\").callsFake((cookieName, cookieValue) => {\n                    actualCookieName = cookieName;\n                    actualCookieValue = cookieValue;\n                });\n\n                // act\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // verify\n                Assert.equal(\"ai_user\", actualCookieName, \"ai_user cookie is set\");\n                var cookieValueParts = actualCookieValue.split(';');\n\n                Assert.equal(4, cookieValueParts.length, \"ai_user cookie value should have actual value and expiration\");\n                Assert.equal(2, cookieValueParts[0].split('|').length, \"ai_user cookie value before expiration should include user id and acq date\");\n                Assert.equal(\"newId\", cookieValueParts[0].split('|')[0], \"First part of ai_user cookie value should be new user id guid\");\n                Assert.equal(new Date().toString(), (new Date(cookieValueParts[0].split('|')[1])).toString(), \"Second part of ai_user cookie should be parsable as date\");\n\n                var expiration = strTrim(cookieValueParts[1]);\n                Assert.equal(true, expiration.substr(0, \"expires=\".length) === \"expires=\", \"ai_user cookie expiration part should start with expires=\");\n                var expirationDate = new Date(expiration.substr(\"expires=\".length));\n                Assert.equal(true, expirationDate > (new Date), \"ai_user cookie expiration should be in the future\");\n            }\n        });\n\n        this.testCase({\n            name: \"ai_user cookie uses userCookiePostfix for cookie storage\",\n            test: () => {\n                // setup\n                var actualCookieName: string;\n                var actualCookieValue: string;\n\n                var newIdStub = this.sandbox.stub(this as any, \"_getNewId\").callsFake(() => \"newId\");\n                var getCookieStub = this.sandbox.stub(this as any, \"_getCookie\").callsFake(() =>\"\");\n                var setCookieStub = this.sandbox.stub(this as any, \"_setCookie\").callsFake((cookieName, cookieValue) => {\n                    actualCookieName = cookieName;\n                    actualCookieValue = cookieValue;\n                });\n\n                // act\n                let config: IConfig & IConfiguration = this.getEmptyConfig();\n                config.userCookiePostfix = 'testUserCookieNamePostfix';\n                this.properties.initialize(config, this.core, []);\n\n                // verify\n                Assert.equal(\"ai_usertestUserCookieNamePostfix\", actualCookieName, \"ai_user cookie is set\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ctor: auth and account id initialize from cookie\",\n            test: () => {\n                // setup\n                var authId = \"bla@bla.com\";\n                var accountId = \"Contoso\";\n\n                var cookieStub = this.sandbox.stub(this as any, \"_getCookie\").callsFake(() => authId + \"|\" + accountId);\n\n                // act\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // verify\n                Assert.equal(authId, this.properties.context.user.authenticatedId, \"user auth id was set from cookie\");\n                Assert.equal(accountId, this.properties.context.user.accountId, \"user account id was not set from cookie\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ctor: auth id initializes from cookie (without account id)\",\n            test: () => {\n                // setup\n                var authId = \"bla@bla.com\";\n                var cookieStub = this.sandbox.stub(this as any, \"_getCookie\").callsFake(() => authId);\n\n                // act\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // verify\n                Assert.equal(authId, this.properties.context.user.authenticatedId, \"user auth id was set from cookie\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ctor: auth user context handles empty cookie\",\n            test: () => {\n                // setup\n                var cookieStub = this.sandbox.stub(this as any, \"_getCookie\").callsFake(() => \"\");\n\n                // act\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was not set\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was not set\");\n            }\n        });\n\n        this.testCase({\n            name: \"Ctor: auth user context handles empty cookie with accountId backward compatibility\",\n            test: () => {\n                // setup\n                var config = this.getEmptyConfig();\n                config.extensionConfig.AppInsightsPropertiesPlugin.accountId = \"account17\";\n\n                var cookieStub = this.sandbox.stub(this as any, \"_getCookie\").callsFake(() => null);\n\n                // act\n                this.properties.initialize(config, this.core, []);\n\n                // verify\n                Assert.equal(config.extensionConfig.AppInsightsPropertiesPlugin.accountId, this.properties.context.user.accountId, \"user account id was set from back compat\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: auth id and account id is set (not in the cookie)\",\n            test: () => {\n                // setup\n                var authAndAccountId = ['bla@bla.com', 'contoso'];\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(authAndAccountId[0], authAndAccountId[1]);\n\n                // verify\n                Assert.equal('bla@bla.com', this.properties.context.user.authenticatedId, \"user auth id was not set\");\n                Assert.equal('contoso', this.properties.context.user.accountId, \"user account id was not set\");\n                Assert.equal(cookieStub.notCalled, true, \"cookie was not set\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: auth user set in cookie without account id\",\n            test: () => {\n                // setup\n                var authAndAccountId = [\"bla@bla.com\"];\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(authAndAccountId[0], null, true);\n\n                // verify\n                Assert.equal(authAndAccountId[0], this.properties.context.user.authenticatedId, \"user auth id was set\");\n                Assert.equal(cookieStub.calledWithExactly('ai_authUser', encodeURI(authAndAccountId.join('|')) + \"; path=/\"), true, \"user auth id and account id cookie was set\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: auth user and account id set in cookie \",\n            test: () => {\n                // setup\n                var authAndAccountId = ['bla@bla.com', 'contoso'];\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(authAndAccountId[0], authAndAccountId[1], true);\n\n                // verify\n                Assert.equal(authAndAccountId[0], this.properties.context.user.authenticatedId, \"user auth id was set\");\n                Assert.equal(cookieStub.calledWithExactly('ai_authUser', encodeURI(authAndAccountId.join('|')) + \"; path=/\"), true, \"user auth id cookie was set\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: handles only auth user id correctly\",\n            test: () => {\n                // setup\n                var authAndAccountId = ['bla@bla.com'];\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(authAndAccountId[0], null, true);\n\n                // verify\n                Assert.equal(authAndAccountId[0], this.properties.context.user.authenticatedId, \"user auth id was set\");\n                Assert.equal(null, this.properties.context.user.accountId, \"user account id was not set\");\n                Assert.equal(cookieStub.calledWithExactly('ai_authUser', encodeURI(authAndAccountId[0]) + \"; path=/\"), true, \"user auth id cookie was set\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: handles null correctly\",\n            test: () => {\n                // setup\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                var loggingStub = this.sandbox.stub(this.core.logger, \"throwInternal\");\n                cookieStub.reset();\n                loggingStub.reset();\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(null);\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was not set\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was not set\");\n                Assert.equal(cookieStub.notCalled, true, \"cookie was not set\");\n                Assert.equal(loggingStub.calledOnce, true, \"Warning was logged\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: handles undefined correctly\",\n            test: () => {\n                // setup\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                var loggingStub = this.sandbox.stub(this.core.logger, \"throwInternal\");\n                cookieStub.reset();\n                loggingStub.reset();\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(undefined, undefined);\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was not set\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was not set\");\n                Assert.equal(cookieStub.notCalled, true, \"cookie was not set\");\n                Assert.equal(loggingStub.calledOnce, true, \"Warning was logged\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: handles only accountID correctly\",\n            test: () => {\n                // setup\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                var loggingStub = this.sandbox.stub(this.core.logger, \"throwInternal\");\n                cookieStub.reset();\n                loggingStub.reset();\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(undefined, '1234');\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was not set\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was not set\");\n                Assert.equal(cookieStub.notCalled, true, \"cookie was not set\");\n                Assert.equal(loggingStub.calledOnce, true, \"Warning was logged\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: handles authId special characters correctly\",\n            test: () => {\n                // setup\n                var authAndAccountId = ['my|||special;id', '1234'];\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                var loggingStub = this.sandbox.stub(this.core.logger, \"throwInternal\");\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(authAndAccountId[0], authAndAccountId[1], true);\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was not set\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was not set\");\n                Assert.equal(cookieStub.notCalled, true, \"cookie was not set\");\n                Assert.equal(loggingStub.calledOnce, true, \"Warning was logged\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: handles accountId special characters correctly\",\n            test: () => {\n                // setup\n                var authAndAccountId = ['myid', '1234 5678'];\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                this.properties.context.user.clearAuthenticatedUserContext();\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                var loggingStub = this.sandbox.stub(this.core.logger, \"throwInternal\");\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(authAndAccountId[0], authAndAccountId[1]);\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was not set\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was not set\");\n                Assert.equal(cookieStub.notCalled, true, \"cookie was not set\");\n                Assert.equal(loggingStub.calledOnce, true, \"Warning was logged\");\n            }\n        });\n\n        this.testCase({\n            name: \"setAuthenticatedUserContext: handles non-ascii unicode characters correctly\",\n            test: () => {\n                // setup\n                var authAndAccountId = [\"\\u05D0\", \"\\u05D1\"]; // Hebrew characters\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                var cookieStub = this.sandbox.stub(this as any, \"_setCookie\");\n                var loggingStub = this.sandbox.stub(this.core.logger, \"throwInternal\");\n\n                // act\n                this.properties.context.user.setAuthenticatedUserContext(authAndAccountId[0], authAndAccountId[1], true);\n\n                // verify\n                Assert.equal(authAndAccountId[0], this.properties.context.user.authenticatedId, \"user auth id was set\");\n                Assert.equal(authAndAccountId[1], this.properties.context.user.accountId, \"user account id was set\");\n                Assert.equal(cookieStub.calledWithExactly('ai_authUser', encodeURI(authAndAccountId.join('|')) + \"; path=/\"), true, \"user auth id cookie was set\");\n                Assert.equal(loggingStub.notCalled, true, \"No warnings\");\n            }\n        });\n\n        this.testCase({\n            name: \"clearAuthenticatedUserContext: auth user and account cleared in context and cookie \",\n            test: () => {\n                // setup\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                this.properties.context.user.setAuthenticatedUserContext(\"bla\", \"123\");\n                var cookieStub = this.sandbox.stub(this as any, \"_delCookie\");\n\n                // act\n                this.properties.context.user.clearAuthenticatedUserContext();\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was cleared\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was cleared\");\n                Assert.equal(cookieStub.calledWithExactly('ai_authUser'), true, \"cookie was deleted\");\n            }\n        });\n\n        this.testCase({\n            name: \"clearAuthenticatedUserContext: works correctly when auth id and account id were never set\",\n            test: () => {\n                // setup\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n                var cookieStub = this.sandbox.stub(this as any, \"_delCookie\");\n\n                // act\n                this.properties.context.user.clearAuthenticatedUserContext();\n\n                // verify\n                Assert.equal(undefined, this.properties.context.user.authenticatedId, \"user auth id was cleared\");\n                Assert.equal(undefined, this.properties.context.user.accountId, \"user account id was cleared\");\n                Assert.equal(cookieStub.calledWithExactly('ai_authUser'), true, \"cookie was deleted\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate telemetrycontext sets up web extension properties on TelemetryItem\",\n            test: () => {\n\n                let config = this.getEmptyConfig();\n                config.extensionConfig!.AppInsightsPropertiesPlugin = this.getTelemetryConfig();\n\n                // setup\n                this.properties.initialize(config, this.core, []);\n\n                let context = new TelemetryContext(this.core, config.extensionConfig!.AppInsightsPropertiesPlugin);\n                context.web = {\n                    domain: \"www.bing.com\",\n                    userConsent: true,\n                    screenRes: \"1024x768\",\n                    browser: \"internet explorer\",\n                    browserVer: \"48.0\",\n                    isManual: true,\n                    browserLang: \"EN\"\n                };\n\n                let telemetyItem: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {},\n                    baseType: \"RemoteDependencyData\",\n                    baseData: {\n                        id: 'some id',\n                        name: \"/test/name\",\n                        success: true,\n                        responseCode: 200,\n                        duration: 123,\n                        type: 'Fetch',\n                        data: 'some data',\n                        target: 'https://example.com/test/name'\n                    },\n                    data: {\n                        property1: \"val1\",\n                        measurement1: 50.0,\n                    }\n                };\n\n                context.applyWebContext(telemetyItem);\n                let ext = telemetyItem.ext;\n                Assert.ok(ext);\n                Assert.equal(\"www.bing.com\", ext.web.domain);\n                Assert.equal(\"1024x768\", ext.web.screenRes);\n                Assert.equal(true, ext.web.userConsent);\n                Assert.equal(\"48.0\", ext.web.browserVer);\n                Assert.equal(\"EN\", ext.web.browserLang);\n                Assert.equal(\"internet explorer\", ext.web.browser);\n                Assert.equal(true, ext.web.isManual);\n            }\n        });\n\n        this.testCase({\n            name: \"validate telemetrycontext cleanup sets empty extensions to undefined\",\n            test: () => {\n\n                let config = this.getEmptyConfig();\n                config.extensionConfig!.AppInsightsPropertiesPlugin = this.getTelemetryConfig();\n\n                // setup\n                this.properties.initialize(config, this.core, []);\n\n                const telemetyItem: ITelemetryItem = {\n                    name: \"test\",\n                    time: new Date(\"2018-06-12\").toISOString(),\n                    iKey: \"iKey\",\n                    ext: {\n                        \"user\" : {\n                            \"localId\": \"TestId\",\n                            \"authId\": \"AuthenticatedId\",\n                            \"id\": \"TestId\"\n                        },\n                        \"web\": {}\n                    },\n                    tags: [{\"user.accountId\": \"TestAccountId\"}],\n                    baseType: \"RemoteDependencyData\",\n                    baseData: {\n                        id: 'some id',\n                        name: \"/test/name\",\n                        success: true,\n                        responseCode: 200,\n                        duration: 123,\n                        type: 'Fetch',\n                        data: 'some data',\n                        target: 'https://example.com/test/name'\n                    },\n                    data: {\n                        property1: \"val1\",\n                        property2: \"val2\",\n                        measurement1: 50.0,\n                        measurement2: 1.3\n                    }\n                }\n\n                // act\n                const telemetrycontext = new TelemetryContext(this.core, config.extensionConfig!.AppInsightsPropertiesPlugin);\n                telemetrycontext.cleanUp(telemetyItem);\n\n                // verify\n                Assert.equal(undefined, telemetyItem.ext.web, \"web was cleared\");\n                Assert.notEqual(undefined, telemetyItem.ext.user, \"user was not cleared\");\n            }\n        });\n    }\n\n    private addSessionTests() {\n        this.testCase({\n            name: 'Session: automaticSession session id is stored in sesId if customer does not provide session info',\n            test: () => {\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // Assert\n                const item: ITelemetryItem = {name: 'item'};\n                this.properties.processTelemetry(item);\n                Assert.ok(this.properties.context.getSessionId(), 'session id is stored in sesId');\n                Assert.equal(this.properties.context.getSessionId(), this.properties.context.sessionManager.automaticSession.id, 'automaticSession is stored in sesId')\n            }\n        });\n\n        this.testCase({\n            name: 'Session: customer session id is stored in sesId if customer provides session info',\n            test: () => {\n                this.properties.initialize(this.getEmptyConfig(), this.core, []);\n\n                // Assert\n                const item: ITelemetryItem = {name: 'item'};\n                this.properties.context.session.id = 'random id';\n                this.properties.processTelemetry(item);\n                Assert.ok(this.properties.context.getSessionId(), 'session id is stored in sesId');\n                Assert.equal(this.properties.context.getSessionId(), 'random id', 'automaticSession is stored in sesId')\n            }\n        });\n\n        \n        this.testCase({\n            name: \"Storage Prefix Test for Property Plugin: prefix should be added after init\",\n            useFakeTimers: true,\n            test: () => {\n                let core = new AppInsightsCore();\n                let setItemSpy = this.sandbox.spy(window.localStorage, \"setItem\");\n                let storagePrefix = \"storageTestPrefix\"\n                let coreConfig = {\n                    instrumentationKey: \"b7170927-2d1c-44f1-acec-59f4e1751c13ttt\",\n                    storagePrefix: storagePrefix,\n                }\n                core.initialize(coreConfig, [this.properties, new TestChannelPlugin()])\n                utlCanUseLocalStorage(true);\n                let firstCallArgs = setItemSpy.args[0];\n                QUnit.assert.true(JSON.stringify(firstCallArgs).includes(storagePrefix));\n            }\n        });\n\n    }\n\n    private getEmptyConfig(): IConfiguration {\n        return {\n            instrumentationKey: 'key',\n            extensions: [ new TestChannelPlugin() ],\n            extensionConfig: {\n                AppInsightsPropertiesPlugin: {\n                    accountId: null,\n                    sessionRenewalMs: null,\n                    sessionExpirationMs: null,\n                    samplingPercentage: null,\n                    endpointUrl: null,\n                    cookieDomain: null,\n                    emitLineDelimitedJson: null,\n                    maxBatchSizeInBytes: null,\n                    maxBatchInterval: null,\n                    disableTelemetry: null,\n                    enableSessionStorageBuffer: null,\n                    isRetryDisabled: null,\n                    isBeaconApiDisabled: null,\n                    sdkExtension: null,\n                    isBrowserLinkTrackingEnabled: null,\n                    appId: null,\n                    sesId: null,\n                    getNewId: (idLength?: number) => this._getNewId(idLength)\n                }\n            }\n        };\n    }\n\n    private getTelemetryConfig(): IPropertiesConfig {\n        return {\n            accountId: \"\",\n            sessionRenewalMs: 1000,\n            samplingPercentage: 0,\n            sessionExpirationMs: 1000,\n            cookieDomain: null,\n            sdkExtension: \"\",\n            isBrowserLinkTrackingEnabled: true,\n            appId: \"\",\n            getSessionId: \"\",\n            namePrefix: \"\",\n            sessionCookiePostfix: \"\",\n            userCookiePostfix: \"\",\n            idLength: 22,\n            getNewId: this._getNewId\n        }\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/Unit/src/propertiesSize.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from '@nevware21/ts-utils';\nimport { createPromise, doAwait, IPromise } from '@nevware21/ts-async';\nimport * as pako from \"pako\";\n\nconst PACKAGE_JSON = \"../package.json\";\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction _loadPackageJson(cb:(isNightly: boolean, packageJson: any) => IPromise<void>): IPromise<void> {\n    return createPromise<void>((testCompleted, testFailed) => {\n        function _handleCallback(packageJson: any) {\n            let version = packageJson.version || \"unknown\";\n            let isNightly = version.includes(\"nightly\") || version.includes(\"dev\");\n            doAwait(cb(isNightly, packageJson), () => {\n                testCompleted();\n            }, (error) => {\n                Assert.ok(false, `checkIsNightlyBuild error: ${error}`);\n                testFailed(error);\n            });\n        }\n\n        fetch(PACKAGE_JSON).then((response) => {\n            if (!response.ok) {\n                Assert.ok(false, `fetch package.json error: ${dumpObj(response)}`);\n                _handleCallback(false);\n            } else {\n                return response.text().then((content) => {\n                    let json = JSON.parse(removeTrailingComma(content));\n                    _handleCallback(json);\n                }, (error) => {\n                    Assert.ok(false, `fetch package.json error: ${error}`);\n                    _handleCallback({});\n                });\n            }\n        }, (error) => {\n            Assert.ok(false, `fetch package.json error: ${error}`);\n            _handleCallback({});\n        });\n    });\n}\n\nfunction _checkSize(checkType: string, maxSize: number, size: number, isNightly: boolean): void {\n  if (isNightly) {\n        maxSize += .5;\n    }\n\n    Assert.ok(size <= maxSize, `exceed ${maxSize} KB, current ${checkType} size is: ${size} KB`);\n}    \n\nexport class PropertiesExtensionSizeCheck extends AITestClass {\n    private readonly MAX_DEFLATE_SIZE = 19;\n    private readonly rawFilePath = \"../dist/es5/applicationinsights-properties-js.min.js\";\n    // Automatically updated by version scripts\n    private readonly currentVer = \"3.4.1\";\n    private readonly proFilePath = `../browser/es5/ai.props.${this.currentVer[0]}.min.js`;\n\n    public testInitialize() {\n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        this.addRawFileSizeCheck();\n        this.addProdFileSizeCheck();\n    }\n\n    constructor() {\n        super(\"PropertiesExtensionSizeCheck\");\n    } \n\n    private addRawFileSizeCheck(): void {\n        this._fileSizeCheck(false);\n    }\n\n    private addProdFileSizeCheck(): void {\n        this._fileSizeCheck(true);\n    }\n    \n    private _fileSizeCheck(isProd:boolean): void {\n        let _filePath = isProd? this.proFilePath : this.rawFilePath;\n        let postfix = isProd? \"\" : \"-raw\";\n        let fileName = _filePath.split(\"..\")[1];\n        this.testCase({\n            name: `Test applicationinsights-properties${postfix} deflate size`,\n            test: () => {\n                Assert.ok(true, `test file: ${fileName}`);\n                return _loadPackageJson((isNightly, packageJson) => {\n                    Assert.ok(true, `  checking : ${packageJson.name || \"??\"} v${packageJson.version || \"unknown\"}`);\n                    let request = new Request(_filePath, {method:\"GET\"});\n                    return fetch(request).then((response) => {\n                        if (!response.ok) {\n                            Assert.ok(false, `fetch applicationinsights-properties${postfix} response error: ${response.statusText}`);\n                            return;\n                        } else {\n                            return response.text().then(text => {\n                                let size = Math.ceil((pako.deflate(text).length/1024) * 100) / 100.0;\n                                _checkSize(\"deflate\", this.MAX_DEFLATE_SIZE, size, isNightly);\n                            }).catch((error) => {\n                                Assert.ok(false, `applicationinsights-properties${postfix} response error: ${error}`);\n                            });\n                        }\n                    }).catch((error: Error) => {\n                        Assert.ok(false, `applicationinsights-properties${postfix} deflate size error: ${error}`);\n                    });\n                });\n             }\n        });\n    } \n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript Properties Plugin</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"pako\",\"./node_modules/pako/dist/pako\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n\n            var testModule = modules.add(\"Tests/Unit/src/prop.tests\", \"./Unit/dist/prop.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/applicationinsights-properties-js/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-properties-js.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-properties-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-properties-js\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights properties (Part A) plugin\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-properties-js.js\",\n    \"module\": \"dist-es5/applicationinsights-properties-js.js\",\n    \"types\": \"types/applicationinsights-properties-js.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/extensions/applicationinsights-properties-js\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt properties\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt propertiestests\",\n        \"mintest\": \"grunt properties-mintests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights properties plugin\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt properties-min\",\n        \"ai-restore\": \"grunt properties-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst browserEntryPointName = \"applicationinsights-properties-js\";\nconst browserOutputName = \"ai.props\";\nconst entryPointName = \"applicationinsights-properties-js\";\nconst outputName = \"applicationinsights-properties-js\"; \n\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Properties Plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName,\n      outputName: outputName\n    },\n    browser: {\n      entryPoint: browserEntryPointName,\n      outputName: browserOutputName\n    }\n  },\n  [ outputName ]);\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Context/Application.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IApplication } from \"@microsoft/applicationinsights-core-js\";\n\nexport class Application implements IApplication {\n    /**\n     * The application version.\n     */\n    public ver: string;\n\n    /**\n     * The application build version.\n     */\n    public build: string;\n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Context/Device.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDevice } from \"@microsoft/applicationinsights-core-js\";\n\nexport class Device implements IDevice {\n\n    /**\n     * The type for the current device.\n     */\n    public deviceClass: string;\n\n    /**\n     * A device unique ID.\n     */\n    public id: string;\n\n    /**\n     * The application screen resolution.\n     */\n    resolution: string;\n\n    /**\n     * The device model for the current device.\n     */\n    public model: string;\n\n    /**\n     * Device identifier known at instrumentation time\n     */\n    public localId: string;\n\n    /**\n     * Device identifier known at instrumentation time\n     */\n    public ip: string;\n\n    /**\n     * Constructs a new instance of the Device class\n     */\n    constructor() {\n        // don't attempt to fingerprint browsers\n        this.id = \"browser\";\n\n        // Device type is a dimension in our data platform\n        // Setting it to 'Browser' allows to separate client and server dependencies/exceptions\n        this.deviceClass = \"Browser\";\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Context/Internal.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IInternal, IUnloadHookContainer, onConfigChange } from \"@microsoft/applicationinsights-core-js\";\nimport { IPropertiesConfig } from \"../Interfaces/IPropertiesConfig\";\n\nconst Version = \"#version#\";\n\nexport class Internal implements IInternal {\n\n    /**\n     * The SDK version used to create this telemetry item.\n     */\n    public sdkVersion: string;\n\n    /**\n     * The SDK agent version.\n     */\n    public agentVersion: string;\n\n    /**\n     * The Snippet version used to initialize the sdk instance, this will contain either\n     * undefined/null - Snippet not used\n     * '-' - Version and legacy mode not determined\n     * # - Version # of the snippet\n     * #.l - Version # in legacy mode\n     * .l - No defined version, but used legacy mode initialization\n     */\n    public snippetVer: string;\n\n    /**\n     * Identifies the source of the sdk script\n     */\n    public sdkSrc: string;\n\n    /**\n     * Constructs a new instance of the internal telemetry data class.\n     */\n    constructor(config: IPropertiesConfig, unloadHookContainer?: IUnloadHookContainer) {\n        \n        let unloadHook = onConfigChange((config), () => {\n            let prefix =  config.sdkExtension;\n            this.sdkVersion = (prefix ? prefix + \"_\" : \"\") + \"javascript:\" + Version;\n        });\n\n        unloadHookContainer && unloadHookContainer.add(unloadHook);\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Context/Location.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ILocation } from \"@microsoft/applicationinsights-core-js\";\n\nexport class Location implements ILocation {\n\n    /**\n     * Client IP address for reverse lookup\n     */\n    public ip: string;\n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Context/Session.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    IAppInsightsCore, ICookieMgr, IDiagnosticLogger, ISession, ISessionManager, IUnloadHookContainer, _eInternalMessageId, _throwInternal,\n    dateNow, dumpObj, eLoggingSeverity, getExceptionName, isFunction, newId, onConfigChange, safeGetCookieMgr, safeGetLogger,\n    utlCanUseLocalStorage, utlGetLocalStorage, utlSetLocalStorage\n} from \"@microsoft/applicationinsights-core-js\";\n\nconst SESSION_COOKIE_NAME = \"ai_session\";\nconst ACQUISITION_SPAN = 86400000; // 24 hours in ms\nconst RENEWAL_SPAN = 1800000; // 30 minutes in ms\nconst COOKIE_UPDATE_INTERVAL = 60000 // 1 minute in ms\n\nexport interface ISessionConfig {\n    readonly sessionRenewalMs?: number;\n    readonly sessionExpirationMs?: number;\n    readonly namePrefix?: string;\n    readonly sessionCookiePostfix?: string;\n    readonly idLength?: number;\n    readonly getNewId?: (idLength?: number) => string;\n\n    /**\n     * @deprecated Avoid using this value to override the cookie manager cookie domain.\n     */\n    cookieDomain?: string;\n}\n\nexport class Session implements ISession {\n    /**\n     * The session ID.\n     */\n    public id?: string;\n\n    /**\n     * The date at which this guid was generated.\n     * Per the spec the ID will be regenerated if more than acquisitionSpan milliseconds elapsed from this time.\n     */\n    public acquisitionDate?: number;\n\n    /**\n     * The date at which this session ID was last reported.\n     * This value should be updated whenever telemetry is sent using this ID.\n     * Per the spec the ID will be regenerated if more than renewalSpan milliseconds elapse from this time with no activity.\n     */\n    public renewalDate?: number;\n}\n\nexport class _SessionManager implements ISessionManager {\n\n    public automaticSession: Session;\n\n    constructor(config: ISessionConfig, core?: IAppInsightsCore, unloadHookContainer?: IUnloadHookContainer) {\n        let self = this;\n        let _storageNamePrefix: string;\n        let _cookieUpdatedTimestamp: number;\n        let _logger: IDiagnosticLogger = safeGetLogger(core);\n        let _cookieManager: ICookieMgr = safeGetCookieMgr(core);\n        let _sessionExpirationMs: number;\n        let _sessionRenewalMs: number;\n\n        dynamicProto(_SessionManager, self, (_self) => {\n   \n            if (!config) {\n                config = ({} as any);\n            }\n    \n            let unloadHook = onConfigChange(config, (details) => {\n                _sessionExpirationMs = config.sessionExpirationMs || ACQUISITION_SPAN;\n                _sessionRenewalMs = config.sessionRenewalMs || RENEWAL_SPAN;\n        \n                // sessionCookiePostfix takes the preference if it is configured, otherwise takes namePrefix if configured.\n                const sessionCookiePostfix = config.sessionCookiePostfix || config.namePrefix || \"\";\n    \n                _storageNamePrefix = SESSION_COOKIE_NAME + sessionCookiePostfix;\n            });\n\n            unloadHookContainer && unloadHookContainer.add(unloadHook);\n\n            _self.automaticSession = new Session();\n\n            _self.update = () => {\n                // Always using Date getTime() as there is a bug in older IE instances that causes the performance timings to have the hi-bit set eg 0x800000000 causing\n                // the number to be incorrect.\n                const nowMs = dateNow();\n\n                let isExpired = false;\n                const session = _self.automaticSession;\n                if (!session.id) {\n                    isExpired = !_initializeAutomaticSession(session, nowMs);\n                }\n\n                if (!isExpired && _sessionExpirationMs > 0) {\n                    const timeSinceAcqMs = nowMs - session.acquisitionDate;\n                    const timeSinceRenewalMs = nowMs - session.renewalDate;\n                    isExpired = timeSinceAcqMs < 0 || timeSinceRenewalMs < 0;           // expired if the acquisition or last renewal are in the future\n                    isExpired = isExpired || timeSinceAcqMs > _sessionExpirationMs;     // expired if the time since acquisition is more than session Expiration\n                    isExpired = isExpired || timeSinceRenewalMs > _sessionRenewalMs;    // expired if the time since last renewal is more than renewal period\n                }\n        \n                // renew if acquisitionSpan or renewalSpan has elapsed\n                if (isExpired) {\n                    // update automaticSession so session state has correct id\n                    _renew(nowMs);\n                } else {\n                    // do not update the cookie more often than cookieUpdateInterval\n                    if (!_cookieUpdatedTimestamp || nowMs - _cookieUpdatedTimestamp > COOKIE_UPDATE_INTERVAL) {\n                        _setCookie(session, nowMs);\n                    }\n                }\n            };\n        \n            /**\n             *  Record the current state of the automatic session and store it in our cookie string format\n             *  into the browser's local storage. This is used to restore the session data when the cookie\n             *  expires.\n             */\n            _self.backup = () => {\n                const session = _self.automaticSession;\n                _setStorage(session.id, session.acquisitionDate, session.renewalDate);\n            };\n\n            /**\n             * Use config.namePrefix + ai_session cookie data or local storage data (when the cookie is unavailable) to\n             * initialize the automatic session.\n             * @returns true if values set otherwise false\n             */\n            function _initializeAutomaticSession(session: ISession, now: number): boolean {\n                let isValid = false;\n                const cookieValue = _cookieManager.get(_storageNamePrefix);\n                if (cookieValue && isFunction(cookieValue.split)) {\n                    isValid = _initializeAutomaticSessionWithData(session, cookieValue);\n                } else {\n                    // There's no cookie, but we might have session data in local storage\n                    // This can happen if the session expired or the user actively deleted the cookie\n                    // We only want to recover data if the cookie is missing from expiry. We should respect the user's wishes if the cookie was deleted actively.\n                    // The User class handles this for us and deletes our local storage object if the persistent user cookie was removed.\n                    const storageValue = utlGetLocalStorage(_logger, _storageNamePrefix);\n                    if (storageValue) {\n                        isValid = _initializeAutomaticSessionWithData(session, storageValue);\n                    }\n                }\n        \n                return isValid || !!session.id;\n            }\n        \n            /**\n             * Extract id, acquisitionDate, and renewalDate from an ai_session payload string and\n             * use this data to initialize automaticSession.\n             *\n             * @param sessionData - The string stored in an ai_session cookie or local storage backup\n             * @returns true if values set otherwise false\n             */\n            function _initializeAutomaticSessionWithData(session: ISession, sessionData: string) {\n                let isValid = false;\n                const sessionReset = \", session will be reset\";\n                const tokens = sessionData.split(\"|\");\n        \n                if (tokens.length >= 2) {\n                    try {\n                        const acqMs = +tokens[1] || 0;\n                        const renewalMs = +tokens[2] || 0;\n                        if (isNaN(acqMs) || acqMs <= 0) {\n                            _throwInternal(_logger,\n                                eLoggingSeverity.WARNING,\n                                _eInternalMessageId.SessionRenewalDateIsZero,\n                                \"AI session acquisition date is 0\" + sessionReset);\n                        } else if (isNaN(renewalMs) || renewalMs <= 0) {\n                            _throwInternal(_logger,\n                                eLoggingSeverity.WARNING,\n                                _eInternalMessageId.SessionRenewalDateIsZero,\n                                \"AI session renewal date is 0\" + sessionReset);\n                        } else if (tokens[0]) {\n                            // Everything looks valid so set the values\n                            session.id = tokens[0];\n                            session.acquisitionDate = acqMs;\n                            session.renewalDate = renewalMs;\n                            isValid = true;\n                        }\n                    } catch (e) {\n                        _throwInternal(_logger,\n                            eLoggingSeverity.CRITICAL,\n                            _eInternalMessageId.ErrorParsingAISessionCookie,\n                            \"Error parsing ai_session value [\" + (sessionData || \"\") + \"]\" + sessionReset + \" - \" + getExceptionName(e),\n                            { exception: dumpObj(e) });\n                    }\n                }\n\n                return isValid;\n            }\n        \n            function _renew(nowMs: number) {\n                let getNewId = config.getNewId || newId;\n                _self.automaticSession.id = getNewId(config.idLength || 22);\n                _self.automaticSession.acquisitionDate = nowMs;\n        \n                _setCookie(_self.automaticSession, nowMs);\n        \n                // If this browser does not support local storage, fire an internal log to keep track of it at this point\n                if (!utlCanUseLocalStorage()) {\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.BrowserDoesNotSupportLocalStorage,\n                        \"Browser does not support local storage. Session durations will be inaccurate.\");\n                }\n            }\n        \n            function _setCookie(session: ISession, nowMs: number) {\n                let acq = session.acquisitionDate;\n                session.renewalDate = nowMs;\n\n                let renewalPeriodMs = _sessionRenewalMs;\n\n                // Set cookie to expire after the session expiry time passes or the session renewal deadline, whichever is sooner\n                // Expiring the cookie will cause the session to expire even if the user isn't on the page\n                const acqTimeLeftMs = (acq +_sessionExpirationMs) - nowMs;\n                const cookie = [session.id, acq, nowMs];\n                let maxAgeSec = 0;\n        \n                if (acqTimeLeftMs < renewalPeriodMs) {\n                    maxAgeSec = acqTimeLeftMs / 1000;\n                } else {\n                    maxAgeSec = renewalPeriodMs / 1000;\n                }\n        \n                const cookieDomain = config.cookieDomain || null;\n\n                // if sessionExpirationMs is set to 0, it means the expiry is set to 0 for this session cookie\n                // A cookie with 0 expiry in the session cookie will never expire for that browser session.  If the browser is closed the cookie expires.\n                // Depending on the browser, another instance does not inherit this cookie, however, another tab will\n                _cookieManager.set(_storageNamePrefix, cookie.join(\"|\"), _sessionExpirationMs > 0 ? maxAgeSec : null, cookieDomain);\n                _cookieUpdatedTimestamp = nowMs;\n            }\n        \n            function _setStorage(guid: string, acq: number, renewal: number) {\n                // Keep data in local storage to retain the last session id, allowing us to cleanly end the session when it expires\n                // Browsers that don't support local storage won't be able to end sessions cleanly from the client\n                // The server will notice this and end the sessions itself, with loss of accurate session duration\n                utlSetLocalStorage(_logger, _storageNamePrefix, [guid, acq, renewal].join(\"|\"));\n            }\n        });\n    }\n\n    public update() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     *  Record the current state of the automatic session and store it in our cookie string format\n     *  into the browser's local storage. This is used to restore the session data when the cookie\n     *  expires.\n     */\n    public backup() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Context/User.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    IAppInsightsCore, ICookieMgr, IUnloadHookContainer, IUserContext, _eInternalMessageId, _throwInternal, eLoggingSeverity, newId,\n    onConfigChange, safeGetCookieMgr, safeGetLogger, toISOString, utlRemoveStorage\n} from \"@microsoft/applicationinsights-core-js\";\nimport { objDefine } from \"@nevware21/ts-utils\";\nimport { IPropertiesConfig } from \"../Interfaces/IPropertiesConfig\";\n\nfunction _validateUserInput(id: string): boolean {\n    // Validate:\n    // 1. Id is a non-empty string.\n    // 2. It does not contain special characters for cookies.\n    if (typeof id !== \"string\" ||\n        !id ||\n        id.match(/,|;|=| |\\|/)) {\n        return false;\n    }\n\n    return true;\n}\n\nexport class User implements IUserContext {\n\n    static cookieSeparator: string = \"|\";\n    static userCookieName: string = \"ai_user\";\n    static authUserCookieName: string = \"ai_authUser\";\n\n    /**\n     * The telemetry configuration.\n     */\n    public readonly config: IPropertiesConfig;\n\n    /**\n     * The user ID.\n     */\n    public id: string;\n\n    /**\n     * Authenticated user id\n     */\n    public authenticatedId: string;\n\n    /**\n     * The localId\n     */\n    public localId: string;\n\n    /**\n     * The account ID.\n     */\n    public accountId: string;\n\n    /**\n     * The account acquisition date.\n     */\n    public accountAcquisitionDate: string;\n\n    /**\n     * A flag indicating whether this represents a new user\n     */\n    public isNewUser = false;\n\n    /**\n     * A flag indicating whether the user cookie has been set\n     */\n    public isUserCookieSet = false;\n\n    constructor(config: IPropertiesConfig, core: IAppInsightsCore, unloadHookContainer?: IUnloadHookContainer) {\n        let _logger = safeGetLogger(core);\n        let _cookieManager: ICookieMgr = safeGetCookieMgr(core);\n        let _storageNamePrefix: string;\n\n        dynamicProto(User, this, (_self) => {\n            // Define _self.config\n            objDefine(_self, \"config\", {\n                g: () => config\n            });\n\n            let unloadHook = onConfigChange(config, () => {\n\n                const userCookiePostfix = config.userCookiePostfix || \"\";\n                _storageNamePrefix = User.userCookieName + userCookiePostfix;\n    \n                // get userId or create new one if none exists\n                const cookie = _cookieManager.get(_storageNamePrefix);\n                if (cookie) {\n                    _self.isNewUser = false;\n                    const params = cookie.split(User.cookieSeparator);\n                    if (params.length > 0) {\n                        _self.id = params[0];\n                        // we already have a cookie\n                        _self.isUserCookieSet = !!_self.id;\n                    }\n                }\n\n                if (!_self.id) {\n                    _self.id = _generateNewId();\n                    const newCookie = _generateNewCookie(_self.id);\n    \n                    _setUserCookie(newCookie.join(User.cookieSeparator));\n    \n                    // If we have an config.namePrefix() + ai_session in local storage this means the user actively removed our cookies.\n                    // We should respect their wishes and clear ourselves from local storage\n                    const name = (config.namePrefix || \"\") + \"ai_session\";\n                    utlRemoveStorage(_logger, name);\n                }\n    \n                // We still take the account id from the ctor param for backward compatibility.\n                // But if the the customer set the accountId through the newer setAuthenticatedUserContext API, we will override it.\n                _self.accountId = config.accountId || undefined;\n    \n                // Get the auth user id and account id from the cookie if exists\n                // Cookie is in the pattern: <authenticatedId>|<accountId>\n                let authCookie = _cookieManager.get(User.authUserCookieName);\n                if (authCookie) {\n                    authCookie = decodeURI(authCookie);\n                    const authCookieString = authCookie.split(User.cookieSeparator);\n                    if (authCookieString[0]) {\n                        _self.authenticatedId = authCookieString[0];\n                    }\n    \n                    if (authCookieString.length > 1 && authCookieString[1]) {\n                        _self.accountId = authCookieString[1];\n                    }\n                }\n            });\n\n            unloadHookContainer && unloadHookContainer.add(unloadHook);\n\n            function _generateNewId() {\n                let theConfig = (config || {}) as IPropertiesConfig;\n                let getNewId = theConfig.getNewId || newId;\n                let id = getNewId(theConfig.idLength ? config.idLength : 22);\n                return id;\n            }\n\n            function _generateNewCookie(userId: string) {\n                const acqStr = toISOString(new Date());\n                _self.accountAcquisitionDate = acqStr;\n                _self.isNewUser = true;\n                const newCookie = [userId, acqStr];\n                return newCookie;\n            }\n\n            function _setUserCookie(cookie: string) {\n                // without expiration, cookies expire at the end of the session\n                // set it to 365 days from now\n                // 365 * 24 * 60 * 60 = 31536000\n                const oneYear = 31536000;\n                _self.isUserCookieSet = _cookieManager.set(_storageNamePrefix, cookie, oneYear);\n            }\n\n            _self.setAuthenticatedUserContext = (authenticatedUserId: string, accountId?: string, storeInCookie = false) => {\n\n                // Validate inputs to ensure no cookie control characters.\n                const isInvalidInput = !_validateUserInput(authenticatedUserId) || (accountId && !_validateUserInput(accountId));\n                if (isInvalidInput) {\n                    _throwInternal(_logger,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.SetAuthContextFailedAccountName,\n                        \"Setting auth user context failed. \" +\n                        \"User auth/account id should be of type string, and not contain commas, semi-colons, equal signs, spaces, or vertical-bars.\",\n                        true);\n                    return;\n                }\n\n                // Create cookie string.\n                _self.authenticatedId = authenticatedUserId;\n                let authCookie = _self.authenticatedId;\n                if (accountId) {\n                    _self.accountId = accountId;\n                    authCookie = [_self.authenticatedId, _self.accountId].join(User.cookieSeparator);\n                }\n\n                if (storeInCookie) {\n                    // Set the cookie. No expiration date because this is a session cookie (expires when browser closed).\n                    // Encoding the cookie to handle unexpected unicode characters.\n                    _cookieManager.set(User.authUserCookieName, encodeURI(authCookie));\n                }\n            };\n\n            /**\n             * Clears the authenticated user id and the account id from the user context.\n             * @returns {}\n             */\n            _self.clearAuthenticatedUserContext = () => {\n                _self.authenticatedId = null;\n                _self.accountId = null;\n                _cookieManager.del(User.authUserCookieName);\n            };\n\n            _self.update = (userId?: string) => {\n                // Optimizations to avoid setting and processing the cookie when not needed\n                if (_self.id !== userId || !_self.isUserCookieSet) {\n                    let user_id = userId ? userId : _generateNewId();\n                    let user_cookie = _generateNewCookie(user_id);\n                    _setUserCookie(user_cookie.join(User.cookieSeparator));\n                }\n            };\n        });\n    }\n\n    /**\n    * Sets the authenticated user id and the account id in this session.\n    *\n    * @param authenticatedUserId - The authenticated user id. A unique and persistent string that represents each authenticated user in the service.\n    * @param accountId - An optional string to represent the account associated with the authenticated user.\n    */\n    public setAuthenticatedUserContext(authenticatedUserId: string, accountId?: string, storeInCookie = false) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Clears the authenticated user id and the account id from the user context.\n     * @returns {}\n     */\n    public clearAuthenticatedUserContext() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Update or create the user cookie if cookies where previously disabled or the new userId does not match the existing value.\n     * If you pass nothing a new random user id will be created.\n     * @param userId - Specific either the current (via appInsights.context.user.id) or new id that you want to set\n     */\n    public update(userId?: string) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Interfaces/IPropTelemetryContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IProcessTelemetryContext, ISessionManager, ITelemetryContext, ITelemetryItem } from \"@microsoft/applicationinsights-core-js\";\n\nexport interface IPropTelemetryContext extends ITelemetryContext {\n    readonly sessionManager: ISessionManager; // The session manager that manages session on the base of cookies.\n\n    applySessionContext(evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyOperatingSystemContxt(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyApplicationContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyDeviceContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyInternalContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyLocationContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyOperationContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyWebContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    applyUserContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n    cleanUp(event:ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/Interfaces/IPropertiesConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IPropertiesConfig {\n    readonly accountId: string;\n    readonly sessionRenewalMs: number;\n    readonly samplingPercentage: number;\n    readonly sessionExpirationMs: number;\n    readonly cookieDomain: string,\n    readonly sdkExtension: string;\n    readonly isBrowserLinkTrackingEnabled: boolean;\n    readonly appId: string;\n    readonly getSessionId: string;\n    readonly namePrefix: string;\n    readonly sessionCookiePostfix: string;\n    readonly userCookiePostfix: string;\n    readonly idLength: number;\n    readonly getNewId: (idLength?: number) => string;\n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/PropertiesPlugin.ts",
    "content": "/**\n* PropertiesPlugin.ts\n* @copyright Microsoft 2018\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    BaseTelemetryPlugin, BreezeChannelIdentifier, IAppInsightsCore, IConfig, IConfigDefaults, IConfiguration, IPlugin,\n    IProcessTelemetryContext, IProcessTelemetryUnloadContext, IPropertiesPlugin, ITelemetryItem, ITelemetryPluginChain,\n    ITelemetryUnloadState, PageView, PageViewEnvelopeType, PropertiesPluginIdentifier, _InternalLogMessage, _eInternalMessageId,\n    _logInternalMessage, createProcessTelemetryContext, eLoggingSeverity, getNavigator, getSetValue, isNullOrUndefined, onConfigChange,\n    utlSetStoragePrefix\n} from \"@microsoft/applicationinsights-core-js\";\nimport { isString, objDeepFreeze, objDefine } from \"@nevware21/ts-utils\";\nimport { IPropTelemetryContext } from \"./Interfaces/IPropTelemetryContext\";\nimport { IPropertiesConfig } from \"./Interfaces/IPropertiesConfig\";\nimport { TelemetryContext } from \"./TelemetryContext\";\n\nlet undefString: string;\nconst nullValue: any = null;\n\nconst _defaultConfig: IConfigDefaults<IPropertiesConfig> = objDeepFreeze({\n    accountId: nullValue,\n    sessionRenewalMs: 30 * 60 * 1000,\n    samplingPercentage: 100,\n    sessionExpirationMs: 24 * 60 * 60 * 1000,\n    cookieDomain: nullValue,\n    sdkExtension: nullValue,\n    isBrowserLinkTrackingEnabled: false,\n    appId: nullValue,\n    getSessionId: nullValue,\n    namePrefix: undefString,\n    sessionCookiePostfix: undefString,\n    userCookiePostfix: undefString,\n    idLength: 22,\n    getNewId: nullValue\n});\n\nexport default class PropertiesPlugin extends BaseTelemetryPlugin implements IPropertiesPlugin {\n\n    public context: IPropTelemetryContext;\n\n    public priority = 110;\n    public identifier = PropertiesPluginIdentifier;\n\n    constructor() {\n        super();\n\n        let _extensionConfig: IPropertiesConfig;\n        let _context: IPropTelemetryContext;\n        let _disableUserInitMessage: boolean;\n\n        dynamicProto(PropertiesPlugin, this, (_self, _base) => {\n\n            _initDefaults();\n\n            objDefine(_self, \"context\", {\n                g: function() {\n                    return _context;\n                }\n            });\n\n            _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) => {\n                _base.initialize(config, core, extensions, pluginChain);\n                _populateDefaults(config);\n            };\n    \n            /**\n             * Add Part A fields to the event\n             * @param event - The event that needs to be processed\n             */\n            _self.processTelemetry = (event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                if (!isNullOrUndefined(event)) {\n                    itemCtx = _self._getTelCtx(itemCtx);\n                    // If the envelope is PageView, reset the internal message count so that we can send internal telemetry for the new page.\n                    if (event.name === PageViewEnvelopeType) {\n                        itemCtx.diagLog().resetInternalMessageCount();\n                    }\n\n                    let theContext: IPropTelemetryContext = (_context || {}) as IPropTelemetryContext;\n    \n                    if (theContext.session) {\n                        // If customer did not provide custom session id update the session manager\n                        if (!isString(_context.session.id) && theContext.sessionManager) {\n                            theContext.sessionManager.update();\n                        }\n                    }\n\n                    let userCtx = theContext.user;\n                    if (userCtx && !userCtx.isUserCookieSet) {\n                        userCtx.update(theContext.user.id);\n                    }\n    \n                    _processTelemetryInternal(event, itemCtx);\n    \n                    if (userCtx && userCtx.isNewUser) {\n                        userCtx.isNewUser = false;\n                        if (!_disableUserInitMessage){\n                            const message = new _InternalLogMessage(_eInternalMessageId.SendBrowserInfoOnUserInit, ((getNavigator()||{} as any).userAgent||\"\"));\n                            _logInternalMessage(itemCtx.diagLog(), eLoggingSeverity.CRITICAL, message);\n                        }\n                    }\n    \n                    _self.processNext(event, itemCtx);\n                }\n            };\n\n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _initDefaults();\n            };\n    \n            function _initDefaults() {\n                _extensionConfig = null;\n                _context = null;\n                _disableUserInitMessage = true;\n            }\n\n            function _populateDefaults(config: IConfiguration & IConfig) {\n                let identifier = _self.identifier;\n                let core = _self.core;\n\n                // This function will be re-called whenever any referenced configuration is changed\n                _self._addHook(onConfigChange(config, () => {\n                    let ctx = createProcessTelemetryContext(null, config, core);\n                    if (config.storagePrefix){\n                        utlSetStoragePrefix(config.storagePrefix);\n                    }\n                    _disableUserInitMessage = config.disableUserInitMessage === false ? false : true;\n                    _extensionConfig = ctx.getExtCfg(identifier, _defaultConfig);\n\n                    // Test hook to allow accessing the internal values -- explicitly not defined as an available property on the class\n                    _self[\"_extConfig\"] = _extensionConfig;\n                }));\n\n                // This is outside of the onConfigChange as we don't want to update (replace) these values whenever a referenced config item changes\n                _context = new TelemetryContext(core, _extensionConfig, _self._unloadHooks);\n                _self.context.appId = () => {\n                    let breezeChannel = core.getPlugin<IPlugin>(BreezeChannelIdentifier);\n                    return breezeChannel ? breezeChannel.plugin[\"_appId\"] : null;\n                };\n            }\n\n            function _processTelemetryInternal(evt: ITelemetryItem, itemCtx: IProcessTelemetryContext) {\n                // Set Part A fields\n                getSetValue(evt, \"tags\", []);\n                getSetValue(evt, \"ext\", {});\n\n                let ctx = _self.context;\n                ctx.applySessionContext(evt, itemCtx);\n                ctx.applyApplicationContext(evt, itemCtx);\n                ctx.applyDeviceContext(evt, itemCtx);\n                ctx.applyOperationContext(evt, itemCtx);\n                ctx.applyUserContext(evt, itemCtx);\n                ctx.applyOperatingSystemContxt(evt, itemCtx);\n                ctx.applyWebContext(evt, itemCtx);\n\n                ctx.applyLocationContext(evt, itemCtx); // legacy tags\n                ctx.applyInternalContext(evt, itemCtx); // legacy tags\n                ctx.cleanUp(evt, itemCtx);\n            }\n        });\n    }\n\n    public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add Part A fields to the event\n     * @param event - The event that needs to be processed\n     */\n    public processTelemetry(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/TelemetryContext.ts",
    "content": "/**\n* TelemetryContext.ts\n* @copyright Microsoft 2018\n*/\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport {\n    CtxTagKeys, Extensions, IAppInsightsCore, IApplication, IDevice, IDistributedTraceContext, IInternal, ILocation, IOperatingSystem,\n    IProcessTelemetryContext, ISession, ISessionManager, ITelemetryItem, ITelemetryTrace, IUnloadHookContainer, IUserContext, IWeb,\n    PageViewDataType, _InternalLogMessage, dataSanitizeString, getSetValue, hasWindow, isNullOrUndefined, isString, objKeys, setValue\n} from \"@microsoft/applicationinsights-core-js\";\nimport { fnCall, getDeferred, isFunction, isUndefined, objDefine, objDefineProps, strLetterCase } from \"@nevware21/ts-utils\";\nimport { Application } from \"./Context/Application\";\nimport { Device } from \"./Context/Device\";\nimport { Internal } from \"./Context/Internal\";\nimport { Location } from \"./Context/Location\";\nimport { Session, _SessionManager } from \"./Context/Session\";\nimport { User } from \"./Context/User\";\nimport { IPropTelemetryContext } from \"./Interfaces/IPropTelemetryContext\";\nimport { IPropertiesConfig } from \"./Interfaces/IPropertiesConfig\";\n\nconst strExt = \"ext\";\nconst strTags = \"tags\";\nlet UNDEF_VALUE: undefined;\n\nfunction _removeEmpty(target: any, name: string) {\n    if (target && target[name] && objKeys(target[name]).length === 0) {\n        delete target[name];\n    }\n}\n\nfunction _nullResult(): string {\n    return null;\n}\n\n/**\n * Create a telemetryTrace object that will be used to manage the trace context for the current telemetry item.\n * This will create a proxy object that will read the values from the core.getTraceCtx() and provide a way to update the values\n * in the core.getTraceCtx() if they are valid.\n * @param core - The core instance that will be used to get the trace context\n * @returns A telemetryTrace object that will be used to manage the trace context for the current telemetry item.\n */\nfunction _createTelemetryTrace(core: IAppInsightsCore): ITelemetryTrace {\n    let coreTraceCtx: IDistributedTraceContext | null = core ? core.getTraceCtx() : null;\n    let trace: any = {};\n\n    function _getCtx() {\n        let ctx = core ? core.getTraceCtx() : null;\n        if (coreTraceCtx && ctx !== coreTraceCtx) {\n            // It appears that the coreTraceCtx has been updated, so clear the local trace context\n            trace = {};\n        }\n\n        return ctx;\n    }\n\n    function _getTraceCtx<T>(name: keyof IDistributedTraceContext extends string ? keyof IDistributedTraceContext : never): T {\n        let value: T;\n        let ctx = _getCtx();\n\n        if (!isUndefined(trace[name])) {\n            // has local value\n            value = trace[name];\n        } else if (ctx) {\n            if (name in ctx) {\n                // has property\n                value = (ctx as any)[name] as T;\n            } else {\n                let fnName = \"get\" + strLetterCase(name);\n                if (isFunction((ctx as any)[fnName])) {\n                    value = (ctx as any)[fnName];\n                }\n            }\n\n            if (isFunction(value)) {\n                // The return values was a function, call it\n                value = fnCall(value as any, ctx);\n            }\n        }\n\n        return value;\n    }\n\n    function _setTraceCtx<V>(name: keyof IDistributedTraceContext extends string ? keyof IDistributedTraceContext : never, value: V, checkFn?: () => V) {\n        let ctx = _getCtx();\n\n        if (ctx) {\n            if (name in ctx) {\n                if (isFunction((ctx as any)[name])) {\n                    // The return values was a function, call it\n                    fnCall((ctx as any)[name], ctx, [value]);\n                } else {\n                    (ctx as any)[name] = value;\n                }\n            } else {\n                let fnName = \"set\" + strLetterCase(name);\n                if (isFunction((ctx as any)[fnName])) {\n                    (ctx as any)[fnName](value);\n                }\n            }\n\n            // For backward compatability, we need to support invalid values for historic reasons,\n            // moving forward we have marked the usage of the telemetryTrace as deprecated and will be removed in a future version.\n            // We will only set the value in the local trace context if it is a valid trace ID or a string, otherwise we will remove it\n            trace[name] = UNDEF_VALUE;\n            if (value && isString(value)) {\n                // If the value is null or undefined, remove it from the local trace context\n                if (checkFn && checkFn() !== value) {\n                    // If the values doesn't match (most likely because the value is invalid), set the value in the local trace context\n                    coreTraceCtx = ctx;\n                    trace[name] = value;\n                }\n            }\n        }\n    }\n\n    function _getTraceId() {\n        return _getTraceCtx<string>(\"traceId\");\n    }\n\n    function _getParentId() {\n        let ctx = _getCtx();\n        let spanId = trace[\"spanId\"];\n        if (ctx && isUndefined(spanId)) {\n            let parentCtx = ctx.parentCtx;\n            if (parentCtx) {\n                spanId = parentCtx.spanId;\n            }\n        }\n\n        return spanId || _getTraceCtx<string>(\"spanId\");\n    }\n\n    function _getTraceFlags() {\n        return _getTraceCtx(\"traceFlags\");\n    }\n\n    function _getName() {\n        return dataSanitizeString(core ? core.logger : null, _getTraceCtx(\"getName\") || _getTraceCtx(\"pageName\"));\n    }\n\n    function _setValue<V = string>(name: keyof IDistributedTraceContext extends string ? keyof IDistributedTraceContext : never, checkFn?: () => V): (value: V) => void {\n        return function (value: V) {\n            _setTraceCtx(name, value, checkFn);\n        };\n    }\n\n    return objDefineProps<ITelemetryTrace>({}, {\n        traceID: {\n            g: _getTraceId,\n            s: _setValue(\"traceId\", _getTraceId)},\n        parentID: {\n            g: _getParentId,\n            s: _setValue(\"spanId\", _getParentId)\n        },\n        traceFlags: {\n            g: _getTraceFlags,\n            s: _setValue(\"traceFlags\", _getTraceFlags)\n        },\n        name: {\n            g: _getName,\n            s: _setValue(\"pageName\", _getName)\n        }\n    });\n}\n\nexport class TelemetryContext implements IPropTelemetryContext {\n\n    public application: IApplication; // The object describing a component tracked by this object - legacy\n    public device: IDevice; // The object describing a device tracked by this object.\n    public location: ILocation; // The object describing a location tracked by this object -legacy\n\n    /**\n     * The object describing a telemetry operation tracked by this object, values applied to this object will be\n     * applied to the telemetry being processed and the values will override the values in the {@link IAppInsightsCore.getTraceCtx}\n     * property, thus any new {@link IDistributedTraceContext} values will be ignored.\n     * @deprecated (since v3.4.0) This property is now being marked as deprecated and provided in the current releases for backward\n     * compatability only, it will be removed in a future version. Use the {@link IAppInsightsCore.getTraceCtx} property\n     * instead.\n     * @remarks Any \"updates\" to the telemetryTrace will NOT be reflected in the {@link IAppInsightsCore.getTraceCtx} property, however, if no values\n     * are set on the telemetryTrace, the {@link IAppInsightsCore.getTraceCtx} property will be used to get the values.\n     */\n    public telemetryTrace: ITelemetryTrace; // The object describing a operation tracked by this object.\n    public user: IUserContext; // The object describing a user tracked by this object.\n    public internal: IInternal; // legacy\n    public session: ISession; // The object describing a session tracked by this object.\n    public sessionManager: ISessionManager; // The session manager that manages session on the base of cookies.\n    public os: IOperatingSystem;\n    public web: IWeb;\n    public appId: () => string;\n    public getSessionId: () => string;\n\n    constructor(core: IAppInsightsCore, defaultConfig: IPropertiesConfig, unloadHookContainer?: IUnloadHookContainer) {\n        let logger = core.logger\n\n        dynamicProto(TelemetryContext, this, (_self) => {\n            _self.appId = _nullResult;\n            _self.getSessionId = _nullResult;\n            _self.application = new Application();\n            _self.internal = new Internal(defaultConfig, unloadHookContainer);\n            if (hasWindow()) {\n                _self.sessionManager = new _SessionManager(defaultConfig, core, unloadHookContainer);\n                _self.device = new Device();\n                _self.location = new Location();\n                _self.user = new User(defaultConfig, core, unloadHookContainer);\n                _self.session = new Session();\n                \n                objDefine(_self, \"telemetryTrace\", {\n                    l: getDeferred(() => _createTelemetryTrace(core))\n                });\n            }\n\n            _self.getSessionId = () => {\n                let session = _self.session;\n                let sesId = null;\n                \n                // If customer set session info, apply their context; otherwise apply context automatically generated\n                if (session && isString(session.id)) {\n                    sesId = session.id;\n                } else {\n                    // Gets the automatic session if it exists or an empty object\n                    let autoSession = (_self.sessionManager || {} as ISessionManager).automaticSession;\n                \n                    sesId = autoSession && isString(autoSession.id) ? autoSession.id : null;\n                }\n\n                return sesId;\n            }\n    \n            _self.applySessionContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                setValue(getSetValue(evt.ext, Extensions.AppExt), \"sesId\", _self.getSessionId(), isString);\n            }\n\n            _self.applyOperatingSystemContxt = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                setValue(evt.ext, Extensions.OSExt, _self.os);\n            };\n        \n            _self.applyApplicationContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let application = _self.application;\n                if (application) {\n                    // evt.ext.app\n                    let tags = getSetValue(evt, strTags);\n                    setValue(tags, CtxTagKeys.applicationVersion, application.ver, isString);\n                    setValue(tags, CtxTagKeys.applicationBuild, application.build, isString)\n                }\n            };\n        \n            _self.applyDeviceContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let device = _self.device;\n                if (device) {\n                    // evt.ext.device\n                    let extDevice = getSetValue(getSetValue(evt, strExt), Extensions.DeviceExt);\n                    setValue(extDevice, \"localId\", device.id, isString);\n                    setValue(extDevice, \"ip\", device.ip, isString);\n                    setValue(extDevice, \"model\", device.model, isString);\n                    setValue(extDevice, \"deviceClass\", device.deviceClass, isString);\n                }\n            };\n        \n            _self.applyInternalContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let internal = _self.internal;\n                if (internal) {\n                    let tags = getSetValue(evt, strTags);\n\n                    setValue(tags, CtxTagKeys.internalAgentVersion, internal.agentVersion, isString); // not mapped in CS 4.0\n                    setValue(tags, CtxTagKeys.internalSdkVersion, dataSanitizeString(logger, internal.sdkVersion, 64), isString);\n            \n                    if (evt.baseType === _InternalLogMessage.dataType || evt.baseType === PageViewDataType) {\n                        setValue(tags, CtxTagKeys.internalSnippet, internal.snippetVer, isString);\n                        setValue(tags, CtxTagKeys.internalSdkSrc, internal.sdkSrc, isString);\n                    }\n                }\n            };\n        \n            _self.applyLocationContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let location = this.location;\n                if (location) {\n                    setValue(getSetValue(evt, strTags, []), CtxTagKeys.locationIp, location.ip, isString);\n                }\n            };\n        \n            _self.applyOperationContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let telemetryTrace = _self.telemetryTrace;\n                if (telemetryTrace) {\n                    const extTrace = getSetValue(getSetValue(evt, strExt), Extensions.TraceExt, { traceID: undefined, parentID: undefined } as ITelemetryTrace);\n                    setValue(extTrace, \"traceID\", telemetryTrace.traceID, isString, isNullOrUndefined);\n                    setValue(extTrace, \"name\", telemetryTrace.name, isString, isNullOrUndefined);\n                    setValue(extTrace, \"parentID\", telemetryTrace.parentID, isString, isNullOrUndefined);\n                }\n            };\n        \n            _self.applyWebContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let web = this.web;\n                if (web) {\n                    setValue(getSetValue(evt, strExt), Extensions.WebExt, web);\n                }\n            }\n        \n            _self.applyUserContext = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let user = _self.user;\n                if (user) {\n                    let tags = getSetValue(evt, strTags, []);\n\n                    // stays in tags\n                    setValue(tags, CtxTagKeys.userAccountId, user.accountId, isString);\n            \n                    // CS 4.0\n                    let extUser = getSetValue(getSetValue(evt, strExt), Extensions.UserExt);\n                    setValue(extUser, \"id\", user.id, isString);\n                    setValue(extUser, \"authId\", user.authenticatedId, isString);\n                }\n            }\n        \n            _self.cleanUp = (evt:ITelemetryItem, itemCtx?: IProcessTelemetryContext) => {\n                let ext = evt.ext;\n                if (ext) {\n                    _removeEmpty(ext, Extensions.DeviceExt);\n                    _removeEmpty(ext, Extensions.UserExt);\n                    _removeEmpty(ext, Extensions.WebExt);\n                    _removeEmpty(ext, Extensions.OSExt);\n                    _removeEmpty(ext, Extensions.AppExt);\n                    _removeEmpty(ext, Extensions.TraceExt);\n                }\n            }\n        });\n    }\n\n    public applySessionContext(evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyOperatingSystemContxt(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyApplicationContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyDeviceContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyInternalContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyLocationContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyOperationContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyWebContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public applyUserContext(event: ITelemetryItem, itemCtx?: IProcessTelemetryContext) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public cleanUp(event:ITelemetryItem, itemCtx?: IProcessTelemetryContext): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/src/applicationinsights-properties-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport PropertiesPlugin from \"./PropertiesPlugin\";\nimport { ITelemetryTrace } from \"@microsoft/applicationinsights-core-js\";\nimport { ISessionConfig, Session, _SessionManager } from \"./Context/Session\";\nimport { IPropTelemetryContext } from \"./Interfaces/IPropTelemetryContext\";\n\nexport { PropertiesPlugin, ITelemetryTrace, Session, ISessionConfig, IPropTelemetryContext, _SessionManager as SessionManager };\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"./node_modules/**\"\n  ]\n}"
  },
  {
    "path": "extensions/applicationinsights-properties-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "extensions/applicationinsights-properties-js/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"prefer-conditional-expression\": false\n    }\n}\n"
  },
  {
    "path": "extensions/applicationinsights-properties-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-properties-js.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-properties-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/extensions/applicationinsights-properties-js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-properties-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "extensions/applicationinsights-react-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft makes certain open source code available at https://3rdpartysource.microsoft.com,\nor you may send a check or money order for US $5.00, including the product name,\nthe open source component name, platform, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the extent\nrequired to debug changes to any libraries licensed under the GNU Lesser General Public License.\n\n---------------------------------------------------------\n\n@babel/runtime 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-runtime\n\nCopyright (c) 2014-present, Facebook, Inc.\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhistory 5.3.0 - MIT\nhttps://github.com/remix-run/history#readme\n\nCopyright (c) React Training 2016-2020\nCopyright (c) Remix Software 2020-2021\n\nMIT License\n\nCopyright (c) React Training 2016-2020\nCopyright (c) Remix Software 2020-2021\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njs-tokens 4.0.0 - MIT\nhttps://github.com/lydell/js-tokens#readme\n\nCopyright 2014, 2015, 2016, 2017, 2018 Simon Lydell\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nThe MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nloose-envify 1.4.0 - MIT\nhttps://github.com/zertosh/loose-envify\n\nCopyright (c) 2015 Andres Suarez <zertosh@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez <zertosh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject-assign 4.1.1 - MIT\nhttps://github.com/sindresorhus/object-assign#readme\n\n(c) Sindre Sorhus\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact 17.0.2 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregenerator-runtime 0.13.9 - MIT\n\n\nCopyright (c) 2014-present, Facebook, Inc.\n\nMIT License\n\nCopyright (c) 2014-present, Facebook, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n"
  },
  {
    "path": "extensions/applicationinsights-react-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-react-js/README.md",
    "content": "# Microsoft Application Insights React plugin\n\n*******************\n\n:exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation:\n\n# The current development repo location of the [React-JS Plugin Repo has moved here](https://github.com/microsoft/applicationinsights-react-js) - (for v3.3.6 or greater) \n\n## Please refer to the new repo for usage instructions, and open issues there.\n\n- All code History was moved to the new repo\n\n:exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation:\n\n*******************\n\n### Where is the source code for the previous version\n\nFor historical purposes the previous code for the angular plugin has been archived in the [reactjs-legacy branch to review all previous code and documentation](https://github.com/microsoft/ApplicationInsights-JS/tree/reactjs-legacy/extensions/applicationinsights-react-js) branch.\n\nNo further changes are scheduled or expected, any and all changes will occur in the [new repo](https://github.com/microsoft/applicationinsights-react-js) only.\n\n### Links\n\n- [New Repo](https://github.com/microsoft/applicationinsights-react-js)\n- [v3.3.5 Readme](https://github.com/microsoft/ApplicationInsights-JS/tree/reactjs-legacy/extensions/applicationinsights-react-js/README.md)\n"
  },
  {
    "path": "extensions/applicationinsights-react-native/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft makes certain open source code available at https://3rdpartysource.microsoft.com,\nor you may send a check or money order for US $5.00, including the product name,\nthe open source component name, platform, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the extent\nrequired to debug changes to any libraries licensed under the GNU Lesser General Public License.\n\n---------------------------------------------------------\n\ntslib 2.4.0 - 0BSD\nhttps://www.typescriptlang.org/\n\nCopyright (c) Microsoft Corporation\n\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@ampproject/remapping 2.2.0 - Apache-2.0\nhttps://github.com/ampproject/remapping#readme\n\nCopyright 2019 Google LLC\n\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2019 Google LLC\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbser 2.1.1 - Apache-2.0\nhttps://facebook.github.io/watchman/docs/bser.html\n\nCopyright 2015-present Facebook, Inc.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfb-watchman 2.0.1 - Apache-2.0\nhttps://facebook.github.io/watchman/\n\nCopyright 2014-present Facebook, Inc.\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhuman-signals 2.1.0 - Apache-2.0\nhttps://git.io/JeluP\n\nCopyright 2019 ehmicky <ehmicky@gmail.com>\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2019 ehmicky <ehmicky@gmail.com>\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwalker 1.0.8 - Apache-2.0\nhttps://github.com/daaku/nodejs-walker\n\nCopyright 2013 Naitik Shah\n\nCopyright 2013 Naitik Shah\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxcode 3.0.1 - Apache-2.0\nhttps://github.com/apache/cordova-node-xcode#readme\n\nCopyright 2012-2020 The Apache Software Foundation\n\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\natob 2.1.2 - Apache-2.0 OR MIT OR (Apache-2.0 AND MIT)\nhttps://git.coolaj86.com/coolaj86/atob.js.git\n\nCopyright 2015 AJ ONeal\nCopyright (c) 2015 AJ ONeal\ncopyright 2012-2018 AJ ONeal\n\nAt your option you may choose either of the following licenses:\n\n  * The MIT License (MIT)\n  * The Apache License 2.0 (Apache-2.0)\n\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 AJ ONeal\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2015 AJ ONeal\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nesprima 4.0.1 - BSD-2-Clause\nhttp://esprima.org/\n\nCopyright JS Foundation and other contributors, https://js.foundation\n\nCopyright JS Foundation and other contributors, https://js.foundation/\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n  * Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njsc-android 250230.2.1 - BSD-2-Clause\nhttps://github.com/react-native-community/jsc-android-buildscripts#readme\n\nCopyright (c) 2006 Apple Inc.\nCopyright (c) 2007 Apple Inc.\nCopyright (c) 2008 Apple Inc.\nCopyright (c) 2009 Apple Inc.\nCopyright (c) 2010 Apple Inc.\nCopyright (c) 2012 Apple Inc.\nCopyright (c) 2013 Apple Inc.\nCopyright (c) 2014 Apple Inc.\nCopyright (c) 2015 Apple Inc.\nCopyright (c) 2016 Apple Inc.\nCopyright (c) 2017 Apple Inc.\nCopyright (c) 2018 Apple Inc.\nCopyright (c) 2019 Apple Inc.\nCopyright (c) 2018 Igalia S.L.\nCopyright (c) 2003-2019 Apple Inc.\nCopyright (c) 2005-2018 Apple Inc.\nCopyright (c) 2006-2019 Apple Inc.\nCopyright (c) 2010-2019 Apple Inc.\nCopyright (c) 2013-2019 Apple Inc.\nCopyright (c) 2015-2016 Apple Inc.\nCopyright (c) 2018-2019 Apple Inc.\nCopyright (c) 2006, 2007 Apple Inc.\nCopyright (c) 2006, 2008 Apple Inc.\nCopyright (c) 2013, 2016 Apple Inc.\nCopyright (c) 2013, 2017 Apple Inc.\nCopyright (c) 2001 Peter Kelly (pmk@post.com)\nCopyright (c) 2008 Alp Toker <alp@atoker.com>\nCopyright (c) 2008, 2009, 2010, 2014 Apple Inc.\nCopyright (c) 2007 Eric Seidel <eric@webkit.org>\nCopyright (c) 1999-2001 Harri Porten (porten@kde.org)\nCopyright (c) 2008 Kelvin W Sherlock (ksherlock@gmail.com)\nCopyright (c) 2015 Dominic Szablewski (dominic@phoboslab.org)\nCopyright (c) 2017, Software Mansion Sp. z o. o. Sp. k. AND 650 Industries, Inc.\n\nBSD 2-Clause License\n\nCopyright (c) 2017, Software Mansion Sp. z o. o. Sp. k. AND 650 Industries, Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregjsparser 0.8.4 - BSD-2-Clause\nhttps://github.com/jviereck/regjsparser\n\nCopyright (c) Julian Viereck and Contributors\n\nCopyright (c) Julian Viereck and Contributors, All Rights Reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n  * Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nuglify-es 3.3.9 - BSD-2-Clause\nhttps://github.com/mishoo/UglifyJS2/tree/harmony\n\nCopyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>\nCopyright 2012-2013 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\nUglifyJS is released under the BSD license:\n\nCopyright 2012-2013 (c) Mihai Bazon <mihai.bazon@gmail.com>\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n    * Redistributions of source code must retain the above\n      copyright notice, this list of conditions and the following\n      disclaimer.\n\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials\n      provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\nTORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\nTHE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwebidl-conversions 3.0.1 - BSD-2-Clause\nhttps://github.com/jsdom/webidl-conversions#readme\n\nCopyright (c) 2014, Domenic Denicola\n\n# The BSD 2-Clause License\n\nCopyright (c) 2014, Domenic Denicola\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwebidl-conversions 6.1.0 - BSD-2-Clause\nhttps://github.com/jsdom/webidl-conversions#readme\n\nCopyright (c) 2014, Domenic Denicola\n\n# The BSD 2-Clause License\n\nCopyright (c) 2014, Domenic Denicola\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@hapi/hoek 9.3.0 - BSD-3-Clause\nhttps://github.com/hapijs/hoek#readme\n\nCopyright (c) 2011, Yahoo Inc.\nCopyright (c) 2011-2014, Walmart\ncopyright (c) 2013 Jake Luer, jake@alogicalparadox.com\nCopyright (c) 2011-2020, Sideway Inc, and project contributors\n\nCopyright (c) 2011-2020, Sideway Inc, and project contributors  \nCopyright (c) 2011-2014, Walmart  \nCopyright (c) 2011, Yahoo Inc.\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n* The names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS OFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@hapi/topo 5.1.0 - BSD-3-Clause\nhttps://github.com/hapijs/topo#readme\n\nCopyright (c) 2012-2014, Walmart\nCopyright (c) 2012-2020, Sideway Inc, and project contributors\n\nCopyright (c) 2012-2020, Sideway Inc, and project contributors  \nCopyright (c) 2012-2014, Walmart.  \nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n* The names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS OFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@sideway/address 4.1.4 - BSD-3-Clause\nhttps://github.com/sideway/address#readme\n\nCopyright (c) 2017-2019 Justin Ridgewell\nCopyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>\nCopyright (c) 2019-2020, Sideway, Inc. and Project contributors\n\nCopyright (c) 2019-2020, Sideway, Inc. and Project contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n * The names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@sideway/formula 3.0.0 - BSD-3-Clause\nhttps://github.com/sideway/formula#readme\n\ncopyright 2012-2018 Alexander Schenkel <alex@alexi.ch>\nCopyright (c) 2019-2020, Sideway. Inc, and project contributors\n\nCopyright (c) 2019-2020, Sideway. Inc, and project contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n * The names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@sideway/pinpoint 2.0.0 - BSD-3-Clause\nhttps://github.com/sideway/pinpoint#readme\n\nCopyright (c) 2019-2020, Sideway. Inc, and project contributors\n\nCopyright (c) 2019-2020, Sideway. Inc, and project contributors  \n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n* The names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS OFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nieee754 1.2.1 - BSD-3-Clause\nhttps://github.com/feross/ieee754#readme\n\nCopyright 2008 Fair Oaks Labs, Inc.\nCopyright (c) 2008, Fair Oaks Labs, Inc.\n\nCopyright 2008 Fair Oaks Labs, Inc.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njoi 17.6.0 - BSD-3-Clause\nhttps://github.com/sideway/joi#readme\n\nCopyright (c) 2012-2014, Walmart\nCopyright (c) 2012-2020, Sideway. Inc, and project contributors\n\nCopyright (c) 2012-2020, Sideway. Inc, and project contributors.<br>\nCopyright (c) 2012-2014, Walmart.<br>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n* The names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmakeerror 1.0.12 - BSD-3-Clause\nhttps://github.com/daaku/nodejs-makeerror#readme\n\nCopyright (c) 2014, Naitik Shah\n\nBSD License\n\nCopyright (c) 2014, Naitik Shah. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n * Neither the name Naitik Shah nor the names of its contributors may be used to\n   endorse or promote products derived from this software without specific\n   prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreadline 1.3.0 - BSD-3-Clause\nhttps://github.com/maleck13/readline\n\n(c) Craig Brookes (http://craigbrookes.com/)\n\nCopyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n   1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n   2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n   3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsource-map 0.5.7 - BSD-3-Clause\nhttps://github.com/mozilla/source-map\n\nCopyright 2011 The Closure Compiler Authors\nCopyright 2011 Mozilla Foundation and contributors\nCopyright 2014 Mozilla Foundation and contributors\nCopyright 2009-2011 Mozilla Foundation and contributors\nCopyright (c) 2009-2011, Mozilla Foundation and contributors\n\n\nCopyright (c) 2009-2011, Mozilla Foundation and contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the names of the Mozilla Foundation nor the names of project\n  contributors may be used to endorse or promote products derived from this\n  software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsource-map 0.6.1 - BSD-3-Clause\nhttps://github.com/mozilla/source-map\n\nCopyright 2011 The Closure Compiler Authors\nCopyright 2011 Mozilla Foundation and contributors\nCopyright 2014 Mozilla Foundation and contributors\nCopyright 2009-2011 Mozilla Foundation and contributors\nCopyright (c) 2009-2011, Mozilla Foundation and contributors\n\n\nCopyright (c) 2009-2011, Mozilla Foundation and contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the names of the Mozilla Foundation nor the names of project\n  contributors may be used to endorse or promote products derived from this\n  software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsource-map 0.7.4 - BSD-3-Clause\nhttps://github.com/mozilla/source-map\n\nCopyright 2011 The Closure Compiler Authors\nCopyright 2011 Mozilla Foundation and contributors\nCopyright 2014 Mozilla Foundation and contributors\nCopyright 2009-2011 Mozilla Foundation and contributors\nCopyright (c) 2009-2011, Mozilla Foundation and contributors\n\n\nCopyright (c) 2009-2011, Mozilla Foundation and contributors\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the names of the Mozilla Foundation nor the names of project\n  contributors may be used to endorse or promote products derived from this\n  software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntmpl 1.0.5 - BSD-3-Clause\nhttps://github.com/daaku/nodejs-tmpl\n\nCopyright (c) 2014, Naitik Shah\n\nBSD License\n\nCopyright (c) 2014, Naitik Shah. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\n * Neither the name Naitik Shah nor the names of its contributors may be used to\n   endorse or promote products derived from this software without specific\n   prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsprintf-js 1.0.3 - BSD-3-Clause AND BSD-3-Clause-Clear\nhttps://github.com/alexei/sprintf.js#readme\n\nCopyright (c) 2007-2014, Alexandru Marasteanu\n\nCopyright (c) 2007-2014, Alexandru Marasteanu <hello [at) alexei (dot] ro>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright\n  notice, this list of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright\n  notice, this list of conditions and the following disclaimer in the\n  documentation and/or other materials provided with the distribution.\n* Neither the name of this software nor the names of its contributors may be\n  used to endorse or promote products derived from this software without\n  specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncaniuse-lite 1.0.30001363 - CC-BY-4.0\nhttps://github.com/browserslist/caniuse-lite#readme\n\n\nAttribution 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n\twiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More_considerations\n     for the public: \n\twiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution 4.0 International Public License\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution 4.0 International Public License (\"Public License\"). To the\nextent this Public License may be interpreted as a contract, You are\ngranted the Licensed Rights in consideration of Your acceptance of\nthese terms and conditions, and the Licensor grants You such rights in\nconsideration of benefits the Licensor receives from making the\nLicensed Material available under these terms and conditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  d. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  e. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  f. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  g. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  h. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  i. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  j. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  k. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part; and\n\n            b. produce, reproduce, and Share Adapted Material.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n       4. If You Share Adapted Material You produce, the Adapter's\n          License You apply must not prevent recipients of the Adapted\n          Material from complying with this Public License.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material; and\n\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n\n=======================================================================\n\nCreative Commons is not a party to its public\nlicenses. Notwithstanding, Creative Commons may elect to apply one of\nits public licenses to material it publishes and in those instances\nwill be considered the “Licensor.” The text of the Creative Commons\npublic licenses is dedicated to the public domain under the CC0 Public\nDomain Dedication. Except for the limited purpose of indicating that\nmaterial is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the\npublic licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nanymatch 3.1.2 - ISC\nhttps://github.com/micromatch/anymatch\n\nCopyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com)\n\nThe ISC License\n\nCopyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com)\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncliui 6.0.0 - ISC\nhttps://github.com/yargs/cliui#readme\n\nCopyright (c) 2015, Contributors\n\nCopyright (c) 2015, Contributors\n\nPermission to use, copy, modify, and/or distribute this software\nfor any purpose with or without fee is hereby granted, provided\nthat the above copyright notice and this permission notice\nappear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\nLIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncliui 7.0.4 - ISC\nhttps://github.com/yargs/cliui#readme\n\nCopyright (c) 2015, Contributors\nCopyright (c) npm, Inc. and Contributors\n\nCopyright (c) 2015, Contributors\n\nPermission to use, copy, modify, and/or distribute this software\nfor any purpose with or without fee is hereby granted, provided\nthat the above copyright notice and this permission notice\nappear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\nLIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nelectron-to-chromium 1.4.179 - ISC\nhttps://github.com/kilian/electron-to-chromium#readme\n\n\nCopyright 2018 Kilian Valkhof\n\nPermission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfs.realpath 1.0.0 - ISC\nhttps://github.com/isaacs/fs.realpath#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\nCopyright Joyent, Inc. and other Node contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----\n\nThis library bundles a version of the `fs.realpath` and `fs.realpathSync`\nmethods from Node.js v0.10 under the terms of the Node.js MIT license.\n\nNode's license follows, also included at the header of `old.js` which contains\nthe licensed code:\n\n  Copyright Joyent, Inc. and other Node contributors.\n\n  Permission is hereby granted, free of charge, to any person obtaining a\n  copy of this software and associated documentation files (the \"Software\"),\n  to deal in the Software without restriction, including without limitation\n  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n  and/or sell copies of the Software, and to permit persons to whom the\n  Software is furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n  DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nget-caller-file 2.0.5 - ISC\nhttps://github.com/stefanpenner/get-caller-file#readme\n\nCopyright 2018 Stefan Penner\n\nISC License (ISC)\nCopyright 2018 Stefan Penner\n\nPermission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nglob 7.2.3 - ISC\nhttps://github.com/isaacs/node-glob#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n## Glob Logo\n\nGlob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed\nunder a Creative Commons Attribution-ShareAlike 4.0 International License\nhttps://creativecommons.org/licenses/by-sa/4.0/\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ngraceful-fs 4.2.10 - ISC\nhttps://github.com/isaacs/node-graceful-fs#readme\n\nCopyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors\n\nThe ISC License\n\nCopyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ninflight 1.0.6 - ISC\nhttps://github.com/isaacs/inflight\n\nCopyright (c) Isaac Z. Schlueter\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ninherits 2.0.4 - ISC\nhttps://github.com/isaacs/inherits#readme\n\nCopyright (c) Isaac Z. Schlueter\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nisexe 2.0.0 - ISC\nhttps://github.com/isaacs/isexe#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlru-cache 6.0.0 - ISC\nhttps://github.com/isaacs/node-lru-cache#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nminimatch 3.1.2 - ISC\nhttps://github.com/isaacs/minimatch#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nonce 1.4.0 - ISC\nhttps://github.com/isaacs/once#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npicocolors 0.2.1 - ISC\nhttps://github.com/alexeyraspopov/picocolors#readme\n\n\nISC License\n\nCopyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npicocolors 1.0.0 - ISC\nhttps://github.com/alexeyraspopov/picocolors#readme\n\nCopyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov\n\nISC License\n\nCopyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrequire-main-filename 2.0.0 - ISC\nhttps://github.com/yargs/require-main-filename#readme\n\nCopyright (c) 2016, Contributors\n\nCopyright (c) 2016, Contributors\n\nPermission to use, copy, modify, and/or distribute this software\nfor any purpose with or without fee is hereby granted, provided\nthat the above copyright notice and this permission notice\nappear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\nLIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrimraf 2.6.3 - ISC\nhttps://github.com/isaacs/rimraf#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrimraf 2.7.1 - ISC\nhttps://github.com/isaacs/rimraf#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsax 1.2.4 - ISC\nhttps://github.com/isaacs/sax-js#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n====\n\n`String.fromCodePoint` by Mathias Bynens used according to terms of MIT\nLicense, as follows:\n\n    Copyright Mathias Bynens <https://mathiasbynens.be/>\n\n    Permission is hereby granted, free of charge, to any person obtaining\n    a copy of this software and associated documentation files (the\n    \"Software\"), to deal in the Software without restriction, including\n    without limitation the rights to use, copy, modify, merge, publish,\n    distribute, sublicense, and/or sell copies of the Software, and to\n    permit persons to whom the Software is furnished to do so, subject to\n    the following conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsemver 5.7.1 - ISC\nhttps://github.com/npm/node-semver#readme\n\nCopyright Isaac Z.\nCopyright Isaac Z. Schlueter\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsemver 6.3.0 - ISC\nhttps://github.com/npm/node-semver#readme\n\nCopyright Isaac Z.\nCopyright Isaac Z. Schlueter\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsemver 7.0.0 - ISC\nhttps://github.com/npm/node-semver#readme\n\nCopyright Isaac Z. Schlueter\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsemver 7.3.7 - ISC\nhttps://github.com/npm/node-semver#readme\n\nCopyright Isaac Z. Schlueter\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nset-blocking 2.0.0 - ISC\nhttps://github.com/yargs/set-blocking#readme\n\nCopyright (c) 2016, Contributors\n\nCopyright (c) 2016, Contributors\n\nPermission to use, copy, modify, and/or distribute this software\nfor any purpose with or without fee is hereby granted, provided\nthat the above copyright notice and this permission notice\nappear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\nLIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsetprototypeof 1.2.0 - ISC\nhttps://github.com/wesleytodd/setprototypeof\n\nCopyright (c) 2015, Wes Todd\n\nCopyright (c) 2015, Wes Todd\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\nSPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\nOF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\nCONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsignal-exit 3.0.7 - ISC\nhttps://github.com/tapjs/signal-exit\n\nCopyright (c) 2015, Contributors\n\nThe ISC License\n\nCopyright (c) 2015, Contributors\n\nPermission to use, copy, modify, and/or distribute this software\nfor any purpose with or without fee is hereby granted, provided\nthat the above copyright notice and this permission notice\nappear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\nLIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwhich 1.3.1 - ISC\nhttps://github.com/isaacs/node-which#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwhich 2.0.2 - ISC\nhttps://github.com/isaacs/node-which#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwhich-module 2.0.0 - ISC\nhttps://github.com/nexdrew/which-module#readme\n\nCopyright (c) 2016, Contributors\n\nCopyright (c) 2016, Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwrappy 1.0.2 - ISC\nhttps://github.com/npm/wrappy\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwrite-file-atomic 2.4.3 - ISC\nhttps://github.com/iarna/write-file-atomic\n\nCopyright (c) 2015, Rebecca Turner\n\nCopyright (c) 2015, Rebecca Turner\n\nPermission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwrite-file-atomic 3.0.3 - ISC\nhttps://github.com/npm/write-file-atomic\n\nCopyright (c) 2015, Rebecca Turner\n\nCopyright (c) 2015, Rebecca Turner\n\nPermission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ny18n 4.0.3 - ISC\nhttps://github.com/yargs/y18n\n\nCopyright (c) 2015, Contributors\n\nCopyright (c) 2015, Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ny18n 5.0.8 - ISC\nhttps://github.com/yargs/y18n\n\nCopyright (c) 2015, Contributors\n\nCopyright (c) 2015, Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright notice\nand this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\nOF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\nTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\nTHIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nyallist 4.0.0 - ISC\nhttps://github.com/isaacs/yallist#readme\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nThe ISC License\n\nCopyright (c) Isaac Z. Schlueter and Contributors\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\nIN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nyargs-parser 18.1.3 - ISC\nhttps://github.com/yargs/yargs-parser#readme\n\nCopyright (c) 2016, Contributors\n\nCopyright (c) 2016, Contributors\n\nPermission to use, copy, modify, and/or distribute this software\nfor any purpose with or without fee is hereby granted, provided\nthat the above copyright notice and this permission notice\nappear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\nLIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nyargs-parser 20.2.9 - ISC\nhttps://github.com/yargs/yargs-parser#readme\n\nCopyright (c) 2016, Contributors\n\nCopyright (c) 2016, Contributors\n\nPermission to use, copy, modify, and/or distribute this software\nfor any purpose with or without fee is hereby granted, provided\nthat the above copyright notice and this permission notice\nappear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE\nLIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\nOR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\nARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/code-frame 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-code-frame\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/compat-data 7.18.6 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/core 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-core\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/generator 7.18.7 - MIT\nhttps://babel.dev/docs/en/next/babel-generator\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-annotate-as-pure 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-annotate-as-pure\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-builder-binary-assignment-operator-visitor 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-builder-binary-assignment-operator-visitor\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-compilation-targets 7.18.6 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-create-class-features-plugin 7.18.6 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-create-regexp-features-plugin 7.18.6 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-define-polyfill-provider 0.3.1 - MIT\nhttps://github.com/babel/babel-polyfills#readme\n\nCopyright (c) 2014-present Nicolo Ribaudo and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Nicolò Ribaudo and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-environment-visitor 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-environment-visitor\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-explode-assignable-expression 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-explode-assignable-expression\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-function-name 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-function-name\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-hoist-variables 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-hoist-variables\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-member-expression-to-functions 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-member-expression-to-functions\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-module-imports 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-module-imports\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-module-transforms 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-module-transforms\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-optimise-call-expression 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-optimise-call-expression\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-plugin-utils 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-plugin-utils\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-remap-async-to-generator 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-remap-async-to-generator\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-replace-supers 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-replace-supers\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helpers 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helpers\n\nCopyright (c) 2014-present, Facebook, Inc.\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-simple-access 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-simple-access\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-skip-transparent-expression-wrappers 7.18.6 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-split-export-declaration 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-split-export-declaration\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-validator-identifier 7.18.6 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-validator-option 7.18.6 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/helper-wrap-function 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-helper-wrap-function\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/highlight 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-highlight\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/parser 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-parser\n\nCopyright (c) 2012-2014 by various contributors\n\nCopyright (C) 2012-2014 by various contributors (see AUTHORS)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-proposal-class-properties 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-proposal-class-properties\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-proposal-export-default-from 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-proposal-export-default-from\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-proposal-nullish-coalescing-operator 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-proposal-nullish-coalescing-operator\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-proposal-object-rest-spread 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-proposal-object-rest-spread\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-proposal-optional-catch-binding 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-proposal-optional-catch-binding\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-proposal-optional-chaining 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-proposal-optional-chaining\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-class-properties 7.12.13 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-syntax-class-properties\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-dynamic-import 7.8.3 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-export-default-from 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-syntax-export-default-from\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-flow 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-syntax-flow\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-jsx 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-syntax-jsx\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-nullish-coalescing-operator 7.8.3 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-object-rest-spread 7.8.3 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-optional-catch-binding 7.8.3 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-optional-chaining 7.8.3 - MIT\n\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-syntax-typescript 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-syntax-typescript\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-arrow-functions 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-arrow-functions\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-async-to-generator 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-async-to-generator\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-block-scoped-functions 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-block-scoped-functions\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-block-scoping 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-block-scoping\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-classes 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-classes\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-computed-properties 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-computed-properties\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-destructuring 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-destructuring\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-exponentiation-operator 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-exponentiation-operator\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-flow-strip-types 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-flow-strip-types\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-for-of 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-for-of\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-function-name 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-function-name\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-literals 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-literals\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-member-expression-literals 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-member-expression-literals\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-modules-commonjs 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-modules-commonjs\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-object-assign 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-object-assign\n\nCopyright (c) 2015 Jed Watson\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Jed Watson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-object-super 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-object-super\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-parameters 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-parameters\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-property-literals 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-property-literals\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-react-display-name 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-react-display-name\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-react-jsx 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-react-jsx\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-react-jsx-self 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-react-jsx-self\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-react-jsx-source 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-react-jsx-source\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-regenerator 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-regenerator\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-runtime 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-runtime\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-shorthand-properties 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-shorthand-properties\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-spread 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-spread\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-sticky-regex 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-sticky-regex\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-template-literals 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-template-literals\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-typescript 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-typescript\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/plugin-transform-unicode-regex 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-plugin-transform-unicode-regex\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/preset-flow 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-preset-flow\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/preset-typescript 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-preset-typescript\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/register 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-register\n\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/runtime 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-runtime\n\nCopyright (c) 2014-present, Facebook, Inc.\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/template 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-template\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/traverse 7.18.6 - MIT\nhttps://babel.dev/docs/en/next/babel-traverse\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@babel/types 7.18.7 - MIT\nhttps://babel.dev/docs/en/next/babel-types\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Sebastian McKenzie and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jest/create-cache-key-function 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jest/types 26.6.2 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jest/types 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jridgewell/gen-mapping 0.1.1 - MIT\nhttps://github.com/jridgewell/gen-mapping#readme\n\nCopyright 2022 Justin Ridgewell <jridgewell@google.com>\n\nCopyright 2022 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jridgewell/gen-mapping 0.3.2 - MIT\nhttps://github.com/jridgewell/gen-mapping#readme\n\nCopyright 2022 Justin Ridgewell <jridgewell@google.com>\n\nCopyright 2022 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jridgewell/resolve-uri 3.0.8 - MIT\nhttps://github.com/jridgewell/resolve-uri#readme\n\nCopyright 2019 Justin Ridgewell <jridgewell@google.com>\n\nCopyright 2019 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jridgewell/set-array 1.1.2 - MIT\nhttps://github.com/jridgewell/set-array#readme\n\n\nCopyright 2022 Justin Ridgewell <jridgewell@google.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jridgewell/sourcemap-codec 1.4.14 - MIT\nhttps://github.com/jridgewell/sourcemap-codec#readme\n\nCopyright (c) 2015 Rich Harris\n\nThe MIT License\n\nCopyright (c) 2015 Rich Harris\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@jridgewell/trace-mapping 0.3.14 - MIT\nhttps://github.com/jridgewell/trace-mapping#readme\n\nCopyright 2022 Justin Ridgewell <justin@ridgewell.name>\n\nCopyright 2022 Justin Ridgewell <justin@ridgewell.name>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native/assets 1.0.0 - MIT\nhttps://github.com/facebook/react-native#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native/normalize-color 2.0.0 - MIT\n\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native/polyfills 2.0.0 - MIT\n\n\nCopyright (c) Facebook, Inc. and its affiliates\nCopyright Joyent, Inc. and other Node contributors\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli 7.0.3 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/cli\n\nCopyright (c) 2018 react-native-community\nCopyright (c) Facebook, Inc. and its affiliates\n(c) webhint project https://github.com/webhintio/hint/blob/30b8ba74f122d8b66fc5596d788dd1c7738f2d83/release/lib/utils.ts\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-debugger-ui 7.0.3 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/debugger-ui\n\nCopyright (c) 2018 react-native-community\nCopyright (c) 2014-present, Facebook, Inc.\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-hermes 6.3.0 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/cli-hermes\n\nCopyright (c) 2018 react-native-community\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-platform-android 6.3.0 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/platform-android\n\nCopyright (c) 2018 react-native-community\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-platform-android 7.0.1 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/platform-android\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-platform-ios 7.0.1 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/platform-ios\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-plugin-metro 7.0.3 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/cli-plugin-metro\n\nCopyright (c) 2018 react-native-community\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-server-api 7.0.3 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/cli-server-api\n\nCopyright (c) 2018 react-native-community\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-tools 6.2.0 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/tools\n\nCopyright (c) 2018 react-native-community\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-tools 7.0.1 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/tools\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@react-native-community/cli-types 6.0.0 - MIT\nhttps://github.com/react-native-community/cli/tree/master/packages/cli-types\n\nCopyright (c) 2018 react-native-community\n\nMIT License\n\nCopyright (c) 2018 react-native-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/graceful-fs 4.1.5 - MIT\n\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/istanbul-lib-coverage 2.0.4 - MIT\nhttps://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/istanbul-lib-coverage\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/istanbul-lib-report 3.0.0 - MIT\n\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/istanbul-reports 3.0.1 - MIT\nhttps://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/istanbul-reports\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/node 11.13.2 - MIT\n\n\nCopyright (c) Microsoft Corporation.\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/yargs 15.0.14 - MIT\nhttps://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yargs\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/yargs 16.0.4 - MIT\nhttps://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yargs\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\n@types/yargs-parser 21.0.0 - MIT\nhttps://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yargs-parser\n\nCopyright (c) Microsoft Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nabort-controller 3.0.0 - MIT\nhttps://github.com/mysticatea/abort-controller#readme\n\ncopyright 2015 Toru Nagashima\nCopyright (c) 2017 Toru Nagashima\n\nMIT License\n\nCopyright (c) 2017 Toru Nagashima\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nabsolute-path 0.0.0 - MIT\nhttps://github.com/filearts/node-absolute-path\n\nCopyright (c) 2014 filearts\nCopyright (c) 2014 Geoff Goodman\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 filearts\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\naccepts 1.3.8 - MIT\nhttps://github.com/jshttp/accepts#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2015 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nanser 1.4.10 - MIT\nhttps://github.com/IonicaBizau/anser#readme\n\n(c) Ionica Bizau\nCopyright (c) 2012-20 Ionica Bizau <bizauionica@gmail.com> (https://ionicabizau.net)\n\nThe MIT License (MIT)\n\nCopyright (c) 2012-20 Ionică Bizău <bizauionica@gmail.com> (https://ionicabizau.net)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nansi-fragments 0.2.1 - MIT\nhttps://github.com/zamotany/ansi-fragments\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nansi-regex 4.1.1 - MIT\nhttps://github.com/chalk/ansi-regex#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nansi-regex 5.0.1 - MIT\nhttps://github.com/chalk/ansi-regex#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nansi-regex 6.0.1 - MIT\nhttps://github.com/chalk/ansi-regex#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nansi-styles 3.2.1 - MIT\nhttps://github.com/chalk/ansi-styles#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nansi-styles 4.3.0 - MIT\nhttps://github.com/chalk/ansi-styles#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nansi-styles 5.2.0 - MIT\nhttps://github.com/chalk/ansi-styles#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nappdirsjs 1.2.6 - MIT\nhttps://github.com/codingjerk/appdirsjs#readme\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nargparse 1.0.10 - MIT\nhttps://github.com/nodeca/argparse#readme\n\nCopyright (c) 2012 by Vitaly Puzrin\nCopyright (c) 2012 Vitaly Puzrin (https://github.com/puzrin)\n\n(The MIT License)\n\nCopyright (C) 2012 by Vitaly Puzrin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\narray-filter 0.0.1 - MIT\nhttps://github.com/juliangruber/array-filter\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\narray-map 0.0.0 - MIT\nhttps://github.com/substack/array-map\n\n\nThis software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\narray-reduce 0.0.0 - MIT\nhttps://github.com/substack/array-reduce\n\n\nThis software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\narray-unique 0.3.2 - MIT\nhttps://github.com/jonschlinkert/array-unique\n\nCopyright (c) 2014-2015, Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\narr-diff 4.0.0 - MIT\nhttps://github.com/jonschlinkert/arr-diff\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\narr-flatten 1.1.0 - MIT\nhttps://github.com/jonschlinkert/arr-flatten\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\narr-union 3.1.0 - MIT\nhttps://github.com/jonschlinkert/arr-union\n\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016 Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nasap 2.0.6 - MIT\nhttps://github.com/kriskowal/asap#readme\n\nCopyright 2009-2014\nCopyright 2009-2014 Contributors\n\n\nCopyright 2009–2014 Contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nassign-symbols 1.0.0 - MIT\nhttps://github.com/jonschlinkert/assign-symbols\n\nCopyright (c) 2015 Jon Schlinkert\nCopyright (c) 2015, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nastral-regex 1.0.0 - MIT\nhttps://github.com/kevva/astral-regex#readme\n\n(c) Kevin Martensson (https://github.com/kevva)\nCopyright (c) Kevin Martensson <kevinmartensson@gmail.com>\n\nMIT License\n\nCopyright (c) Kevin Mårtensson <kevinmartensson@gmail.com> (github.com/kevva)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nast-types 0.14.2 - MIT\nhttp://github.com/benjamn/ast-types\n\nCopyright (c) 2013 Ben Newman <bn@cs.stanford.edu>\n\nCopyright (c) 2013 Ben Newman <bn@cs.stanford.edu>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nasync 2.6.4 - MIT\nhttps://caolan.github.io/async/\n\nCopyright (c) 2010-2018 Caolan McMahon\n\nCopyright (c) 2010-2018 Caolan McMahon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nasync 3.2.4 - MIT\nhttps://caolan.github.io/async/\n\nCopyright (c) 2010-2018 Caolan McMahon\n\nCopyright (c) 2010-2018 Caolan McMahon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nasync-limiter 1.0.1 - MIT\nhttps://github.com/strml/async-limiter#readme\n\nCopyright (c) 2017 Samuel Reed <samuel.trace.reed@gmail.com>\n\nThe MIT License (MIT)\nCopyright (c) 2017 Samuel Reed <samuel.trace.reed@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbabel-core 7.0.0-bridge.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbabel-plugin-dynamic-import-node 2.3.3 - MIT\nhttps://github.com/airbnb/babel-plugin-dynamic-import-node#readme\n\nCopyright (c) 2016 Airbnb\n\nMIT License\n\nCopyright (c) 2016 Airbnb\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbabel-plugin-polyfill-corejs2 0.3.1 - MIT\nhttps://github.com/babel/babel-polyfills#readme\n\nCopyright (c) 2014-present Nicolo Ribaudo and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Nicolò Ribaudo and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbabel-plugin-polyfill-corejs3 0.5.2 - MIT\nhttps://github.com/babel/babel-polyfills#readme\n\nCopyright (c) 2014-present Nicolo Ribaudo and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Nicolò Ribaudo and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbabel-plugin-polyfill-regenerator 0.3.1 - MIT\nhttps://github.com/babel/babel-polyfills#readme\n\nCopyright (c) 2014-present Nicolo Ribaudo and other contributors\n\nMIT License\n\nCopyright (c) 2014-present Nicolò Ribaudo and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbabel-plugin-syntax-trailing-function-commas 7.0.0-beta.0 - MIT\n\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbabel-preset-fbjs 3.4.0 - MIT\n\n\nCopyright (c) 2013-present, Facebook, Inc.\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) 2013-present, Facebook, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbalanced-match 1.0.2 - MIT\nhttps://github.com/juliangruber/balanced-match\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbase 0.11.2 - MIT\nhttps://github.com/node-base/base\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbase64-js 1.5.1 - MIT\nhttps://github.com/beatgammit/base64-js\n\nCopyright (c) 2014 Jameson Little\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jameson Little\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbl 4.1.0 - MIT\nhttps://github.com/rvagg/bl\n\nCopyright (c) 2013-2019 bl contributors\n\nThe MIT License (MIT)\n=====================\n\nCopyright (c) 2013-2019 bl contributors\n----------------------------------\n\n*bl contributors listed at <https://github.com/rvagg/bl#contributors>*\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbplist-creator 0.1.0 - MIT\nhttps://github.com/nearinfinity/node-bplist-creator#readme\n\n(c) 2004 Jakub Steiner\nCopyright 2007 Apple Inc\nCopyright (c) 2012 Near Infinity Corporation\n\n(The MIT License)\n\nCopyright (c) 2012 Near Infinity Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software \nand associated documentation files (the \"Software\"), to deal in the Software without restriction,\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\nOR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbplist-parser 0.3.1 - MIT\nhttps://github.com/nearinfinity/node-bplist-parser\n\nCopyright (c) 2012 Near Infinity Corporation\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbrace-expansion 1.1.11 - MIT\nhttps://github.com/juliangruber/brace-expansion\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\n\nMIT License\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbraces 2.3.2 - MIT\nhttps://github.com/micromatch/braces\n\nCopyright (c) 2014-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbraces 3.0.2 - MIT\nhttps://github.com/micromatch/braces\n\nCopyright (c) 2014-2018, Jon Schlinkert\nCopyright (c) 2019, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbrowserslist 4.21.1 - MIT\nhttps://github.com/browserslist/browserslist#readme\n\nCopyright 2014 Andrey Sitnik <andrey@sitnik.ru> and other contributors\n\nThe MIT License (MIT)\n\nCopyright 2014 Andrey Sitnik <andrey@sitnik.ru> and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbuffer 5.7.1 - MIT\nhttps://github.com/feross/buffer\n\nCopyright (c) Feross Aboukhadijeh, and other contributors\nCopyright (c) Feross Aboukhadijeh (http://feross.org), and other contributors\n\nThe MIT License (MIT)\n\nCopyright (c) Feross Aboukhadijeh, and other contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbuffer-from 1.1.2 - MIT\nhttps://github.com/LinusU/buffer-from#readme\n\nCopyright (c) 2016, 2018 Linus Unneback\n\nMIT License\n\nCopyright (c) 2016, 2018 Linus Unnebäck\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbytes 3.0.0 - MIT\nhttps://github.com/visionmedia/bytes.js#readme\n\nCopyright (c) 2015 Jed Watson\nCopyright (c) 2012-2014 TJ Holowaychuk\nCopyright (c) 2015 Jed Watson <jed.watson@me.com>\nCopyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>\n\n(The MIT License)\n\nCopyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2015 Jed Watson <jed.watson@me.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncache-base 1.0.1 - MIT\nhttps://github.com/jonschlinkert/cache-base\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncall-bind 1.0.2 - MIT\nhttps://github.com/ljharb/call-bind#readme\n\nCopyright (c) 2020 Jordan Harband\n\nMIT License\n\nCopyright (c) 2020 Jordan Harband\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncaller-callsite 2.0.0 - MIT\nhttps://github.com/sindresorhus/caller-callsite#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncaller-path 2.0.0 - MIT\nhttps://github.com/sindresorhus/caller-path#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncallsites 2.0.0 - MIT\nhttps://github.com/sindresorhus/callsites#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncallsites 3.1.0 - MIT\nhttps://github.com/sindresorhus/callsites#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncamelcase 5.3.1 - MIT\nhttps://github.com/sindresorhus/camelcase#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncamelcase 6.3.0 - MIT\nhttps://github.com/sindresorhus/camelcase#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nchalk 2.4.2 - MIT\nhttps://github.com/chalk/chalk#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nchalk 4.1.2 - MIT\nhttps://github.com/chalk/chalk#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nci-info 2.0.0 - MIT\nhttps://github.com/watson/ci-info\n\nCopyright (c) 2016-2018 Thomas Watson Steen\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2018 Thomas Watson Steen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nci-info 3.3.2 - MIT\nhttps://github.com/watson/ci-info\n\nCopyright (c) 2016-2021 Thomas Watson Steen\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2021 Thomas Watson Steen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nclass-utils 0.3.6 - MIT\nhttps://github.com/jonschlinkert/class-utils\n\nCopyright (c) 2015, 2017-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, 2017-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncli-cursor 2.1.0 - MIT\nhttps://github.com/sindresorhus/cli-cursor#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncli-cursor 3.1.0 - MIT\nhttps://github.com/sindresorhus/cli-cursor#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncli-spinners 2.6.1 - MIT\nhttps://github.com/sindresorhus/cli-spinners#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nclone 1.0.4 - MIT\nhttps://github.com/pvorb/node-clone#readme\n\nCopyright (c) 2011-2015 Paul Vorbach <paul@vorba.ch>\nCopyright (c) 2011-2015 Paul Vorbach (http://paul.vorba.ch/) and contributors (https://github.com/pvorb/node-clone/graphs/contributors)\n\nCopyright © 2011-2015 Paul Vorbach <paul@vorba.ch>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the “Software”), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nclone-deep 4.0.1 - MIT\nhttps://github.com/jonschlinkert/clone-deep\n\nCopyright (c) 2014-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncollection-visit 1.0.0 - MIT\nhttps://github.com/jonschlinkert/collection-visit\n\nCopyright (c) 2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, 2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncolor-convert 1.9.3 - MIT\nhttps://github.com/Qix-/color-convert#readme\n\nCopyright (c) 2011-2016, Heather Arthur and Josh Junon\nCopyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>\n\nCopyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncolor-convert 2.0.1 - MIT\nhttps://github.com/Qix-/color-convert#readme\n\nCopyright (c) 2011-2016, Heather Arthur and Josh Junon\nCopyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>\n\nCopyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncolorette 1.4.0 - MIT\nhttps://github.com/jorgebucaran/colorette#readme\n\nCopyright (c) Jorge Bucaran <https://jorgebucaran.com>\n\nCopyright © Jorge Bucaran <<https://jorgebucaran.com>>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncolor-name 1.1.3 - MIT\nhttps://github.com/dfcreative/color-name\n\nCopyright (c) 2015 Dmitry Ivanov\n\nThe MIT License (MIT)\nCopyright (c) 2015 Dmitry Ivanov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncolor-name 1.1.4 - MIT\nhttps://github.com/colorjs/color-name\n\nCopyright (c) 2015 Dmitry Ivanov\n\nThe MIT License (MIT)\nCopyright (c) 2015 Dmitry Ivanov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncommander 2.13.0 - MIT\nhttps://github.com/tj/commander.js#readme\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncommander 2.20.3 - MIT\nhttps://github.com/tj/commander.js#readme\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncommander 7.2.0 - MIT\nhttps://github.com/tj/commander.js#readme\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncommand-exists 1.2.9 - MIT\nhttps://github.com/mathisonian/command-exists\n\nCopyright (c) 2014 Matthew Conlen\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Matthew Conlen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncommondir 1.0.1 - MIT\nhttps://github.com/substack/node-commondir\n\nCopyright (c) 2013 James Halliday (mail@substack.net)\n\nThe MIT License\n\nCopyright (c) 2013 James Halliday (mail@substack.net)\n\nPermission is hereby granted, free of charge, \nto any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to \ndeal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, \nmerge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom \nthe Software is furnished to do so, \nsubject to the following conditions:\n\nThe above copyright notice and this permission notice \nshall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR \nANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, \nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncomponent-emitter 1.3.0 - MIT\nhttps://github.com/component/emitter#readme\n\nCopyright (c) 2014 Component\n\n(The MIT License)\n\nCopyright (c) 2014 Component contributors <dev@component.io>\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncompressible 2.0.18 - MIT\nhttps://github.com/jshttp/compressible#readme\n\nCopyright (c) 2013 Jonathan Ong\nCopyright (c) 2014 Jeremiah Senkpiel\nCopyright (c) 2015 Douglas Christopher Wilson\nCopyright (c) 2013 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014 Jeremiah Senkpiel <fishrock123@rocketmail.com>\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2013 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014 Jeremiah Senkpiel <fishrock123@rocketmail.com>\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncompression 1.7.4 - MIT\nhttps://github.com/expressjs/compression#readme\n\nCopyright (c) 2010 Sencha Inc.\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2011 TJ Holowaychuk\nCopyright (c) 2014-2015 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nconcat-map 0.0.1 - MIT\nhttps://github.com/substack/node-concat-map\n\n\nThis software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nconnect 3.7.0 - MIT\nhttps://github.com/senchalabs/connect#readme\n\nCopyright (c) 2011 LearnBoost\nCopyright (c) 2010 Sencha Inc.\nCopyright (c) 2011 TJ Holowaychuk\nCopyright (c) 2011-2014 TJ Holowaychuk\nCopyright (c) 2015 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2010 Sencha Inc.\nCopyright (c) 2011 LearnBoost\nCopyright (c) 2011-2014 TJ Holowaychuk\nCopyright (c) 2015 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nconvert-source-map 1.8.0 - MIT\nhttps://github.com/thlorenz/convert-source-map\n\nCopyright 2013 Thorsten Lorenz\n\nCopyright 2013 Thorsten Lorenz. \nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncopy-descriptor 0.1.1 - MIT\nhttps://github.com/jonschlinkert/copy-descriptor\n\nCopyright (c) 2015, Jon Schlinkert\nCopyright (c) 2015-2016, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2016, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncore-js-compat 3.23.3 - MIT\nhttps://github.com/zloirock/core-js#readme\n\nCopyright (c) 2014-2022 Denis Pushkarev\n\nCopyright (c) 2014-2022 Denis Pushkarev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncore-util-is 1.0.3 - MIT\nhttps://github.com/isaacs/core-util-is#readme\n\nCopyright Joyent, Inc. and other Node contributors\n\nCopyright Node.js contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncosmiconfig 5.2.1 - MIT\nhttps://github.com/davidtheclark/cosmiconfig#readme\n\nCopyright (c) 2015 David Clark\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 David Clark\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncross-spawn 6.0.5 - MIT\nhttps://github.com/moxystudio/node-cross-spawn\n\nCopyright (c) 2018 Made With MOXY Lda\n\nThe MIT License (MIT)\n\nCopyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ncross-spawn 7.0.3 - MIT\nhttps://github.com/moxystudio/node-cross-spawn\n\nCopyright (c) 2018 Made With MOXY Lda\n\nThe MIT License (MIT)\n\nCopyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndayjs 1.11.3 - MIT\nhttps://day.js.org/\n\nCopyright (c) 2018-present, iamkun\n\nMIT License\n\nCopyright (c) 2018-present, iamkun\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndebug 2.6.9 - MIT\nhttps://github.com/visionmedia/debug#readme\n\nCopyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca>\n\n(The MIT License)\n\nCopyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software \nand associated documentation files (the 'Software'), to deal in the Software without restriction, \nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, \nand/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, \nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndebug 4.3.4 - MIT\nhttps://github.com/debug-js/debug#readme\n\nCopyright (c) 2018-2021 Josh Junon\nCopyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>\n\n(The MIT License)\n\nCopyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2018-2021 Josh Junon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software\nand associated documentation files (the 'Software'), to deal in the Software without restriction,\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial\nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndecamelize 1.2.0 - MIT\nhttps://github.com/sindresorhus/decamelize#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndecode-uri-component 0.2.0 - MIT\nhttps://github.com/samverschueren/decode-uri-component#readme\n\n(c) Sam Verschueren (https://github.com/SamVerschueren)\nCopyright (c) Sam Verschueren <sam.verschueren@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) Sam Verschueren <sam.verschueren@gmail.com> (github.com/SamVerschueren)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndeepmerge 3.3.0 - MIT\nhttps://github.com/TehShrike/deepmerge\n\nCopyright (c) 2012 James Halliday, Josh Duff, and other contributors\n\nThe MIT License (MIT)\n\nCopyright (c) 2012 James Halliday, Josh Duff, and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndeepmerge 4.2.2 - MIT\nhttps://github.com/TehShrike/deepmerge\n\nCopyright (c) 2012 James Halliday, Josh Duff, and other contributors\n\nThe MIT License (MIT)\n\nCopyright (c) 2012 James Halliday, Josh Duff, and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndefaults 1.0.3 - MIT\nhttps://github.com/tmpvar/defaults#readme\n\nCopyright (c) 2015 Elijah Insua\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Elijah Insua\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndefine-properties 1.1.4 - MIT\nhttps://github.com/ljharb/define-properties#readme\n\nCopyright (c) 2015 Jordan Harband\n\nThe MIT License (MIT)\n\nCopyright (C) 2015 Jordan Harband\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndefine-property 0.2.5 - MIT\nhttps://github.com/jonschlinkert/define-property\n\nCopyright (c) 2015 Jon Schlinkert\nCopyright (c) 2015, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndefine-property 1.0.0 - MIT\nhttps://github.com/jonschlinkert/define-property\n\nCopyright (c) 2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, 2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndefine-property 2.0.2 - MIT\nhttps://github.com/jonschlinkert/define-property\n\nCopyright (c) 2015-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndenodeify 1.2.1 - MIT\nhttps://github.com/matthew-andrews/denodeify\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndepd 2.0.0 - MIT\nhttps://github.com/dougwilson/nodejs-depd#readme\n\nCopyright (c) 2015 Douglas Christopher Wilson\nCopyright (c) 2014-2018 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2014-2018 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndeprecated-react-native-prop-types 2.3.0 - MIT\n\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ndestroy 1.2.0 - MIT\nhttps://github.com/stream-utils/destroy#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2014 Jonathan Ong me@jongleberry.com\nCopyright (c) 2015-2022 Douglas Christopher Wilson\nCopyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com\n\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jonathan Ong me@jongleberry.com\nCopyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nee-first 1.1.1 - MIT\nhttps://github.com/jonathanong/ee-first\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2014 Jonathan Ong me@jongleberry.com\n\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jonathan Ong me@jongleberry.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nemoji-regex 8.0.0 - MIT\nhttps://mths.be/emoji-regex\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nencodeurl 1.0.2 - MIT\nhttps://github.com/pillarjs/encodeurl#readme\n\nCopyright (c) 2016 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2016 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nend-of-stream 1.4.4 - MIT\nhttps://github.com/mafintosh/end-of-stream\n\nCopyright (c) 2014 Mathias Buus\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Mathias Buus\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nenvinfo 7.8.1 - MIT\nhttps://github.com/tabrindle/envinfo#readme\n\n(c) 2018 Denis Pushkarev\nCopyright (c) 2018 Trevor Brindle\n\nMIT License\n\nCopyright (c) 2018 Trevor Brindle\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nerror-ex 1.3.2 - MIT\nhttps://github.com/qix-/node-error-ex#readme\n\nCopyright (c) 2015 JD Ballard\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 JD Ballard\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nerrorhandler 1.5.1 - MIT\nhttps://github.com/expressjs/errorhandler#readme\n\nCopyright (c) 2010 Sencha Inc.\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2011 TJ Holowaychuk\nCopyright (c) 2014-2015 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nerror-stack-parser 2.1.4 - MIT\nhttps://www.stacktracejs.com/\n\nCopyright (c) 2017 Eric Wendelin and other contributors\n\nCopyright (c) 2017 Eric Wendelin and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nescalade 3.1.1 - MIT\nhttps://github.com/lukeed/escalade#readme\n\n(c) Luke Edwards (https://lukeed.com)\nCopyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n\nMIT License\n\nCopyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nescape-html 1.0.3 - MIT\nhttps://github.com/component/escape-html\n\nCopyright (c) 2015 Andreas Lubbe\nCopyright (c) 2012-2013 TJ Holowaychuk\nCopyright (c) 2015 Tiancheng Timothy Gu\n\n(The MIT License)\n\nCopyright (c) 2012-2013 TJ Holowaychuk\nCopyright (c) 2015 Andreas Lubbe\nCopyright (c) 2015 Tiancheng \"Timothy\" Gu\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nescape-string-regexp 1.0.5 - MIT\nhttps://github.com/sindresorhus/escape-string-regexp\n\n(c) Sindre Sorhus (http://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nescape-string-regexp 4.0.0 - MIT\nhttps://github.com/sindresorhus/escape-string-regexp#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\netag 1.8.1 - MIT\nhttps://github.com/jshttp/etag#readme\n\nCopyright (c) 2014-2016 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2014-2016 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nevent-target-shim 5.0.1 - MIT\nhttps://github.com/mysticatea/event-target-shim\n\ncopyright 2015 Toru Nagashima\nCopyright (c) 2015 Toru Nagashima\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Toru Nagashima\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nexeca 1.0.0 - MIT\nhttps://github.com/sindresorhus/execa#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nexeca 5.1.1 - MIT\nhttps://github.com/sindresorhus/execa#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nexpand-brackets 2.1.4 - MIT\nhttps://github.com/jonschlinkert/expand-brackets\n\nCopyright (c) 2015-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2016, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nextend-shallow 2.0.1 - MIT\nhttps://github.com/jonschlinkert/extend-shallow\n\nCopyright (c) 2015 Jon Schlinkert\nCopyright (c) 2014-2015, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2015, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nextend-shallow 3.0.2 - MIT\nhttps://github.com/jonschlinkert/extend-shallow\n\nCopyright (c) 2014-2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2015, 2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nextglob 2.0.4 - MIT\nhttps://github.com/micromatch/extglob\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfill-range 4.0.0 - MIT\nhttps://github.com/jonschlinkert/fill-range\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2014-2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfill-range 7.0.1 - MIT\nhttps://github.com/jonschlinkert/fill-range\n\nCopyright (c) 2014-present, Jon Schlinkert\nCopyright (c) 2019, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfinalhandler 1.1.2 - MIT\nhttps://github.com/pillarjs/finalhandler#readme\n\nCopyright (c) 2014-2017 Douglas Christopher Wilson\nCopyright (c) 2014-2017 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2014-2017 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfinalhandler 1.2.0 - MIT\nhttps://github.com/pillarjs/finalhandler#readme\n\nCopyright (c) 2014-2022 Douglas Christopher Wilson\nCopyright (c) 2014-2022 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2014-2022 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfind-cache-dir 2.1.0 - MIT\nhttps://github.com/avajs/find-cache-dir#readme\n\nCopyright (c) James Talmage <james@talmage.io>\n\nMIT License\n\nCopyright (c) James Talmage <james@talmage.io> (github.com/jamestalmage)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfind-up 2.1.0 - MIT\nhttps://github.com/sindresorhus/find-up#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfind-up 3.0.0 - MIT\nhttps://github.com/sindresorhus/find-up#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfind-up 4.1.0 - MIT\nhttps://github.com/sindresorhus/find-up#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nflow-parser 0.121.0 - MIT\nhttps://flow.org/\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfor-in 1.0.2 - MIT\nhttps://github.com/jonschlinkert/for-in\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfragment-cache 0.2.1 - MIT\nhttps://github.com/jonschlinkert/fragment-cache\n\nCopyright (c) 2016-2017, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfresh 0.5.2 - MIT\nhttps://github.com/jshttp/fresh#readme\n\nCopyright (c) 2012 TJ Holowaychuk\nCopyright (c) 2016-2017 Douglas Christopher Wilson\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2016-2017 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2016-2017 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfsevents 2.3.2 - MIT\nhttps://github.com/fsevents/fsevents\n\n(c) 2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller\nCopyright (c) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller\n\nMIT License\n-----------\n\nCopyright (C) 2010-2020 by Philipp Dunkel, Ben Noordhuis, Elan Shankar, Paul Miller\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfs-extra 1.0.0 - MIT\nhttps://github.com/jprichardson/node-fs-extra\n\nCopyright (c) 2011-2016 JP Richardson\nCopyright (c) 2011-2016 JP Richardson (https://github.com/jprichardson)\n\n(The MIT License)\n\nCopyright (c) 2011-2016 JP Richardson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files\n(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,\n merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfs-extra 7.0.1 - MIT\nhttps://github.com/jprichardson/node-fs-extra\n\nCopyright (c) 2011-2017 JP Richardson\nCopyright (c) 2011-2017 JP Richardson (https://github.com/jprichardson)\nCopyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors\n\n(The MIT License)\n\nCopyright (c) 2011-2017 JP Richardson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files\n(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,\n merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfs-extra 8.1.0 - MIT\nhttps://github.com/jprichardson/node-fs-extra\n\nCopyright (c) 2011-2017 JP Richardson\nCopyright (c) 2011-2017 JP Richardson (https://github.com/jprichardson)\nCopyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors\n\n(The MIT License)\n\nCopyright (c) 2011-2017 JP Richardson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files\n(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,\n merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nfunction-bind 1.1.1 - MIT\nhttps://github.com/Raynos/function-bind\n\nCopyright (c) 2013 Raynos\n\nCopyright (c) 2013 Raynos.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ngensync 1.0.0-beta.2 - MIT\nhttps://github.com/loganfsmyth/gensync\n\nCopyright 2018 Logan Smyth <loganfsmyth@gmail.com>\n\nCopyright 2018 Logan Smyth <loganfsmyth@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nget-intrinsic 1.1.2 - MIT\nhttps://github.com/ljharb/get-intrinsic#readme\n\nCopyright (c) 2020 Jordan Harband\n\nMIT License\n\nCopyright (c) 2020 Jordan Harband\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nget-stream 4.1.0 - MIT\nhttps://github.com/sindresorhus/get-stream#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nget-stream 5.2.0 - MIT\nhttps://github.com/sindresorhus/get-stream#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nget-stream 6.0.1 - MIT\nhttps://github.com/sindresorhus/get-stream#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nget-value 2.0.6 - MIT\nhttps://github.com/jonschlinkert/get-value\n\nCopyright (c) 2014-2015, Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nglobals 11.12.0 - MIT\nhttps://github.com/sindresorhus/globals#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nglobals 13.16.0 - MIT\nhttps://github.com/sindresorhus/globals#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas 1.0.3 - MIT\nhttps://github.com/tarruda/has\n\nCopyright (c) 2013 Thiago de Arruda\n\nCopyright (c) 2013 Thiago de Arruda\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-flag 3.0.0 - MIT\nhttps://github.com/sindresorhus/has-flag#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-flag 4.0.0 - MIT\nhttps://github.com/sindresorhus/has-flag#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-property-descriptors 1.0.0 - MIT\nhttps://github.com/inspect-js/has-property-descriptors#readme\n\nCopyright (c) 2022 Inspect JS\n\nMIT License\n\nCopyright (c) 2022 Inspect JS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-symbols 1.0.3 - MIT\nhttps://github.com/ljharb/has-symbols#readme\n\nCopyright (c) 2016 Jordan Harband\n\nMIT License\n\nCopyright (c) 2016 Jordan Harband\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-value 0.3.1 - MIT\nhttps://github.com/jonschlinkert/has-value\n\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-value 1.0.0 - MIT\nhttps://github.com/jonschlinkert/has-value\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-values 0.1.4 - MIT\nhttps://github.com/jonschlinkert/has-values\n\nCopyright (c) 2014-2015, Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhas-values 1.0.0 - MIT\nhttps://github.com/jonschlinkert/has-values\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2014-2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhermes-engine 0.11.0 - MIT\n\n\nCopyright (c) Facebook, Inc. and its affiliates\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhermes-estree 0.5.0 - MIT\n\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhermes-parser 0.5.0 - MIT\n\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhermes-profile-transformer 0.0.6 - MIT\n\n\nCopyright 2020 The Lighthouse Authors\nCopyright (c) 2020 Saphal Patro and Jessie Anh Nguyen\n\nMIT License\n\nCopyright (c) 2020 Saphal Patro and Jessie Anh Nguyen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nhttp-errors 2.0.0 - MIT\nhttps://github.com/jshttp/http-errors#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2016 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong me@jongleberry.com\nCopyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com\n\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jonathan Ong me@jongleberry.com\nCopyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nimage-size 0.6.3 - MIT\nhttps://github.com/image-size/image-size#readme\n\nCopyright (c) 2017 Aditya Yadav, http://netroy.in\n\nThe MIT License (MIT)\n\nCopyright © 2017 Aditya Yadav, http://netroy.in\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nimport-fresh 2.0.0 - MIT\nhttps://github.com/sindresorhus/import-fresh#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nimport-fresh 3.3.0 - MIT\nhttps://github.com/sindresorhus/import-fresh#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nimurmurhash 0.1.4 - MIT\nhttps://github.com/jensyt/imurmurhash-js\n\nCopyright (c) 2013 Gary Court, Jens Taylor\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ninvariant 2.2.4 - MIT\nhttps://github.com/zertosh/invariant#readme\n\nCopyright (c) 2013-present, Facebook, Inc.\n\nMIT License\n\nCopyright (c) 2013-present, Facebook, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nip 1.1.8 - MIT\nhttps://github.com/indutny/node-ip\n\nCopyright Fedor Indutny, 2012\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-accessor-descriptor 0.1.6 - MIT\nhttps://github.com/jonschlinkert/is-accessor-descriptor\n\nCopyright (c) 2015, Jon Schlinkert\nCopyright (c) 2015 Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-accessor-descriptor 1.0.0 - MIT\nhttps://github.com/jonschlinkert/is-accessor-descriptor\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nisarray 0.0.1 - MIT\nhttps://github.com/juliangruber/isarray\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nisarray 1.0.0 - MIT\nhttps://github.com/juliangruber/isarray\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-arrayish 0.2.1 - MIT\nhttps://github.com/qix-/node-is-arrayish#readme\n\nCopyright (c) 2015 JD Ballard\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 JD Ballard\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-buffer 1.1.6 - MIT\nhttps://github.com/feross/is-buffer#readme\n\nCopyright (c) Feross Aboukhadijeh\nCopyright (c) Feross Aboukhadijeh (http://feross.org)\n\nThe MIT License (MIT)\n\nCopyright (c) Feross Aboukhadijeh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-data-descriptor 0.1.4 - MIT\nhttps://github.com/jonschlinkert/is-data-descriptor\n\nCopyright (c) 2015, Jon Schlinkert\nCopyright (c) 2015 Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-data-descriptor 1.0.0 - MIT\nhttps://github.com/jonschlinkert/is-data-descriptor\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-descriptor 0.1.6 - MIT\nhttps://github.com/jonschlinkert/is-descriptor\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-descriptor 1.0.2 - MIT\nhttps://github.com/jonschlinkert/is-descriptor\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-directory 0.3.1 - MIT\nhttps://github.com/jonschlinkert/is-directory\n\nCopyright (c) 2014-2015, Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-extendable 0.1.1 - MIT\nhttps://github.com/jonschlinkert/is-extendable\n\nCopyright (c) 2015 Jon Schlinkert\nCopyright (c) 2015, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-extendable 1.0.1 - MIT\nhttps://github.com/jonschlinkert/is-extendable\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-fullwidth-code-point 2.0.0 - MIT\nhttps://github.com/sindresorhus/is-fullwidth-code-point#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-fullwidth-code-point 3.0.0 - MIT\nhttps://github.com/sindresorhus/is-fullwidth-code-point#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-interactive 1.0.0 - MIT\nhttps://github.com/sindresorhus/is-interactive#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-number 3.0.0 - MIT\nhttps://github.com/jonschlinkert/is-number\n\nCopyright (c) 2014-2015, Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-number 7.0.0 - MIT\nhttps://github.com/jonschlinkert/is-number\n\nCopyright (c) 2014-present, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nisobject 2.1.0 - MIT\nhttps://github.com/jonschlinkert/isobject\n\nCopyright (c) 2014-2015, Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nisobject 3.0.1 - MIT\nhttps://github.com/jonschlinkert/isobject\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-plain-object 2.0.4 - MIT\nhttps://github.com/jonschlinkert/is-plain-object\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-stream 1.1.0 - MIT\nhttps://github.com/sindresorhus/is-stream#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-stream 2.0.1 - MIT\nhttps://github.com/sindresorhus/is-stream#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-typedarray 1.0.0 - MIT\nhttps://github.com/hughsk/is-typedarray\n\n\nThis software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-unicode-supported 0.1.0 - MIT\nhttps://github.com/sindresorhus/is-unicode-supported#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-windows 1.0.2 - MIT\nhttps://github.com/jonschlinkert/is-windows\n\nCopyright (c) 2015-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nis-wsl 1.1.0 - MIT\nhttps://github.com/sindresorhus/is-wsl#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-get-type 26.3.0 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-get-type 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-haste-map 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-regex-util 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-serializer 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-util 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-validate 26.6.2 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-validate 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-worker 26.6.2 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njest-worker 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njetifier 1.6.8 - MIT\nhttps://github.com/mikehardy/jetifier#readme\n\nCopyright (c) 2019 Mike Hardy\nCopyright 2015 the original author or authors\n\nMIT License\n\nCopyright (c) 2019 Mike Hardy\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njscodeshift 0.13.1 - MIT\nhttps://github.com/facebook/jscodeshift#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njsesc 0.5.0 - MIT\nhttp://mths.be/jsesc\n\nCopyright Mathias Bynens <http://mathiasbynens.be/>\n\nCopyright Mathias Bynens <http://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njsesc 2.5.2 - MIT\nhttps://mths.be/jsesc\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njson5 2.2.1 - MIT\nhttp://json5.org/\n\n(c) 2019 Denis Pushkarev\ncopyright (c) 2019 Denis Pushkarev\nCopyright (c) 2012-2018 Aseem Kishore, and others\n\nMIT License\n\nCopyright (c) 2012-2018 Aseem Kishore, and [others].\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n[others]: https://github.com/json5/json5/contributors\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njsonfile 2.4.0 - MIT\nhttps://github.com/jprichardson/node-jsonfile#readme\n\nCopyright 2012-2016, JP Richardson <jprichardson@gmail.com>\nCopyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>\n\n(The MIT License)\n\nCopyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files\n(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,\n merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njsonfile 4.0.0 - MIT\nhttps://github.com/jprichardson/node-jsonfile#readme\n\nCopyright 2012-2016, JP Richardson <jprichardson@gmail.com>\nCopyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>\n\n(The MIT License)\n\nCopyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files\n(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,\n merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njson-parse-better-errors 1.0.2 - MIT\nhttps://github.com/zkat/json-parse-better-errors#readme\n\nCopyright 2017 Kat Marchan\n\nCopyright 2017 Kat Marchán\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njson-parse-even-better-errors 2.3.1 - MIT\nhttps://github.com/npm/json-parse-even-better-errors#readme\n\nCopyright npm, Inc.\nCopyright 2017 Kat Marchan\n\nCopyright 2017 Kat Marchán\nCopyright npm, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n---\n\nThis library is a fork of 'better-json-errors' by Kat Marchán, extended and\ndistributed under the terms of the MIT license above.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njs-tokens 4.0.0 - MIT\nhttps://github.com/lydell/js-tokens#readme\n\nCopyright 2014, 2015, 2016, 2017, 2018 Simon Lydell\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nThe MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njs-yaml 3.14.1 - MIT\nhttps://github.com/nodeca/js-yaml\n\nCopyright (c) 2011-2015 by Vitaly Puzrin\n\n(The MIT License)\n\nCopyright (C) 2011-2015 by Vitaly Puzrin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nkind-of 3.2.2 - MIT\nhttps://github.com/jonschlinkert/kind-of\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nkind-of 4.0.0 - MIT\nhttps://github.com/jonschlinkert/kind-of\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nkind-of 5.1.0 - MIT\nhttps://github.com/jonschlinkert/kind-of\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nkind-of 6.0.3 - MIT\nhttps://github.com/jonschlinkert/kind-of\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2020, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nklaw 1.3.1 - MIT\nhttps://github.com/jprichardson/node-klaw#readme\n\nCopyright (c) 2015-2016 JP Richardson\nCopyright (c) 2015 JP Richardson (https://github.com/jprichardson)\n\n(The MIT License)\n\nCopyright (c) 2015-2016 JP Richardson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files\n(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,\n merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nkleur 3.0.3 - MIT\nhttps://github.com/lukeed/kleur#readme\n\n(c) Luke Edwards (https://lukeed.com)\nCopyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nleven 3.1.0 - MIT\nhttps://github.com/sindresorhus/leven#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlines-and-columns 1.2.4 - MIT\nhttps://github.com/eventualbuddha/lines-and-columns#readme\n\nCopyright (c) 2015 Brian Donovan\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Brian Donovan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlocate-path 2.0.0 - MIT\nhttps://github.com/sindresorhus/locate-path#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlocate-path 3.0.0 - MIT\nhttps://github.com/sindresorhus/locate-path#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlocate-path 5.0.0 - MIT\nhttps://github.com/sindresorhus/locate-path#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlodash 4.17.21 - MIT\nhttps://lodash.com/\n\nCopyright OpenJS Foundation and other contributors <https://openjsf.org/>\nCopyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\ncopyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nCopyright OpenJS Foundation and other contributors <https://openjsf.org/>\n\nBased on Underscore.js, copyright Jeremy Ashkenas,\nDocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/lodash/lodash\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nCopyright and related rights for sample code are waived via CC0. Sample\ncode is defined as all source code displayed within the prose of the\ndocumentation.\n\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\n\n====\n\nFiles located in the node_modules and vendor directories are externally\nmaintained libraries used by this software which have their own\nlicenses; we recommend you read them, as their terms may differ from the\nterms above.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlodash.debounce 4.0.8 - MIT\nhttps://lodash.com/\n\nCopyright jQuery Foundation and other contributors <https://jquery.org/>\nCopyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\ncopyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nCopyright jQuery Foundation and other contributors <https://jquery.org/>\n\nBased on Underscore.js, copyright Jeremy Ashkenas,\nDocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/lodash/lodash\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nCopyright and related rights for sample code are waived via CC0. Sample\ncode is defined as all source code displayed within the prose of the\ndocumentation.\n\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\n\n====\n\nFiles located in the node_modules and vendor directories are externally\nmaintained libraries used by this software which have their own\nlicenses; we recommend you read them, as their terms may differ from the\nterms above.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlodash.throttle 4.1.1 - MIT\nhttps://lodash.com/\n\nCopyright jQuery Foundation and other contributors <https://jquery.org/>\nCopyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\ncopyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nCopyright jQuery Foundation and other contributors <https://jquery.org/>\n\nBased on Underscore.js, copyright Jeremy Ashkenas,\nDocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/lodash/lodash\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nCopyright and related rights for sample code are waived via CC0. Sample\ncode is defined as all source code displayed within the prose of the\ndocumentation.\n\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\n\n====\n\nFiles located in the node_modules and vendor directories are externally\nmaintained libraries used by this software which have their own\nlicenses; we recommend you read them, as their terms may differ from the\nterms above.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlogkitty 0.7.1 - MIT\nhttps://github.com/zamotany/logkitty\n\nCopyright (c) 2019 Pawel Trysla\n\nMIT License\n\nCopyright (c) 2019 Paweł Trysła\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlog-symbols 2.2.0 - MIT\nhttps://github.com/sindresorhus/log-symbols#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nlog-symbols 4.1.0 - MIT\nhttps://github.com/sindresorhus/log-symbols#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nloose-envify 1.4.0 - MIT\nhttps://github.com/zertosh/loose-envify\n\nCopyright (c) 2015 Andres Suarez <zertosh@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez <zertosh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmake-dir 2.1.0 - MIT\nhttps://github.com/sindresorhus/make-dir#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmake-dir 3.1.0 - MIT\nhttps://github.com/sindresorhus/make-dir#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmap-cache 0.2.2 - MIT\nhttps://github.com/jonschlinkert/map-cache\n\nCopyright (c) 2015, Jon Schlinkert\nCopyright (c) 2015-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmap-visit 1.0.0 - MIT\nhttps://github.com/jonschlinkert/map-visit\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmerge-stream 2.0.0 - MIT\nhttps://github.com/grncdr/merge-stream#readme\n\nCopyright (c) Stephen Sugden <me@stephensugden.com> (stephensugden.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Stephen Sugden <me@stephensugden.com> (stephensugden.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-babel-transformer 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-cache 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-cache-key 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-config 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-core 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-hermes-compiler 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-inspector-proxy 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-minify-uglify 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-react-native-babel-preset 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-react-native-babel-transformer 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-resolver 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-runtime 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) 2014 Arnout Kazemier\nCopyright (c) Facebook, Inc. and its affiliates\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-source-map 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright 2011 The Closure Compiler Authors\nCopyright (c) Meta Platforms, Inc. and affiliates\nCopyright 2011 Mozilla Foundation and contributors\nPortions Copyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-symbolicate 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-transform-plugins 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmetro-transform-worker 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmicromatch 3.1.10 - MIT\nhttps://github.com/micromatch/micromatch\n\nCopyright (c) 2014-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmicromatch 4.0.5 - MIT\nhttps://github.com/micromatch/micromatch\n\nCopyright (c) 2014-present, Jon Schlinkert\nCopyright (c) 2022, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmime 1.6.0 - MIT\nhttps://github.com/broofa/node-mime#readme\n\nCopyright (c) 2010 Benjamin Thomas, Robert Kieffer\n\nThe MIT License (MIT)\n\nCopyright (c) 2010 Benjamin Thomas, Robert Kieffer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmime 2.6.0 - MIT\nhttps://github.com/broofa/mime#readme\n\nCopyright (c) 2010 Benjamin Thomas, Robert Kieffer\n\nThe MIT License (MIT)\n\nCopyright (c) 2010 Benjamin Thomas, Robert Kieffer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmime-db 1.52.0 - MIT\nhttps://github.com/jshttp/mime-db#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2015-2022 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2015-2022 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2015-2022 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmime-types 2.1.35 - MIT\nhttps://github.com/jshttp/mime-types#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2015 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmimic-fn 1.2.0 - MIT\nhttps://github.com/sindresorhus/mimic-fn#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmimic-fn 2.1.0 - MIT\nhttps://github.com/sindresorhus/mimic-fn#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nminimist 1.2.6 - MIT\nhttps://github.com/substack/minimist\n\n\nThis software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmixin-deep 1.3.2 - MIT\nhttps://github.com/jonschlinkert/mixin-deep\n\nCopyright (c) 2014-2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2015, 2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nmkdirp 0.5.6 - MIT\nhttps://github.com/substack/node-mkdirp#readme\n\nCopyright 2010 James Halliday (mail@substack.net)\n\nCopyright 2010 James Halliday (mail@substack.net)\n\nThis project is free software released under the MIT/X11 license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nms 2.0.0 - MIT\nhttps://github.com/zeit/ms#readme\n\nCopyright (c) 2016 Zeit, Inc.\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Zeit, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nms 2.1.2 - MIT\nhttps://github.com/zeit/ms#readme\n\nCopyright (c) 2016 Zeit, Inc.\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Zeit, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nms 2.1.3 - MIT\nhttps://github.com/vercel/ms#readme\n\nCopyright (c) 2020 Vercel, Inc.\n\nThe MIT License (MIT)\n\nCopyright (c) 2020 Vercel, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnanomatch 1.2.13 - MIT\nhttps://github.com/micromatch/nanomatch\n\nCopyright (c) 2016-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnegotiator 0.6.3 - MIT\nhttps://github.com/jshttp/negotiator#readme\n\nCopyright (c) 2012 Federico Romero\nCopyright (c) 2014 Federico Romero\nCopyright (c) 2012 Isaac Z. Schlueter\nCopyright (c) 2012-2014 Federico Romero\nCopyright (c) 2012-2014 Isaac Z. Schlueter\nCopyright (c) 2015 Douglas Christopher Wilson\nCopyright (c) 2014-2015 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2012-2014 Federico Romero\nCopyright (c) 2012-2014 Isaac Z. Schlueter\nCopyright (c) 2014-2015 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nneo-async 2.6.2 - MIT\nhttps://github.com/suguru03/neo-async\n\nCopyright Caolan McMahon\nCopyright (c) 2014-2018 Suguru Motegi\n\nMIT License\n\nCopyright (c) 2014-2018 Suguru Motegi\nBased on Async.js, Copyright Caolan McMahon\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnice-try 1.0.5 - MIT\nhttps://github.com/electerious/nice-try\n\nCopyright (c) 2018 Tobias Reich\n\nThe MIT License (MIT)\n\nCopyright (c) 2018 Tobias Reich\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnocache 2.1.0 - MIT\nhttps://helmetjs.github.io/docs/nocache/\n\nCopyright (c) 2014-2019 Evan Hahn, Adam Baldwin\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2019 Evan Hahn, Adam Baldwin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnode-dir 0.1.17 - MIT\nhttps://github.com/fshost\n\nCopyright (c) 2012 Nathan Cartwright <fshost@yahoo.com>\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Cartwright <fshost@yahoo.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnode-fetch 2.6.7 - MIT\nhttps://github.com/bitinn/node-fetch\n\nCopyright (c) 2016 David Frank\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 David Frank\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnode-int64 0.4.0 - MIT\nhttps://github.com/broofa/node-int64\n\nCopyright (c) 2012 Robert Kieffer\nCopyright (c) 2014 Robert Kieffer\n\nCopyright (c) 2014 Robert Kieffer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnode-releases 2.0.5 - MIT\nhttps://github.com/chicoxyzzy/node-releases#readme\n\nCopyright (c) 2017 Sergey Rubanov (https://github.com/chicoxyzzy)\n\nThe MIT License\n\nCopyright (c) 2017 Sergey Rubanov (https://github.com/chicoxyzzy)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnode-stream-zip 1.15.0 - MIT\nhttps://github.com/antelle/node-stream-zip\n\nCopyright (c) 2021 Antelle https://github.com/antelle\n(c) 2020 Antelle https://github.com/antelle/node-stream-zip/blob/master/LICENSE\nCopyright (c) 2012 Another-D-Mention Software and other contributors, http://www.another-d-mention.ro\nPortions copyright https://github.com/cthackers/adm-zip https://raw.githubusercontent.com/cthackers/adm-zip/master/LICENSE\n\nCopyright (c) 2021 Antelle https://github.com/antelle\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n== dependency license: adm-zip ==\n\nCopyright (c) 2012 Another-D-Mention Software and other contributors, \nhttp://www.another-d-mention.ro/\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnormalize-path 3.0.0 - MIT\nhttps://github.com/jonschlinkert/normalize-path\n\nCopyright (c) 2014-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnpm-run-path 2.0.2 - MIT\nhttps://github.com/sindresorhus/npm-run-path#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnpm-run-path 4.0.1 - MIT\nhttps://github.com/sindresorhus/npm-run-path#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nnullthrows 1.1.1 - MIT\nhttps://github.com/zertosh/nullthrows#readme\n\nCopyright (c) 2016 Andres Suarez\n\nThe MIT License (MIT)\nCopyright (c) 2016 Andres Suarez\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nob1 0.67.0 - MIT\nhttps://github.com/facebook/metro#readme\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject.assign 4.1.2 - MIT\nhttps://github.com/ljharb/object.assign#readme\n\nCopyright (c) 2014 Jordan Harband\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jordan Harband\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject.pick 1.3.0 - MIT\nhttps://github.com/jonschlinkert/object.pick\n\nCopyright (c) 2014-2015 Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject-assign 4.1.1 - MIT\nhttps://github.com/sindresorhus/object-assign#readme\n\n(c) Sindre Sorhus\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject-copy 0.1.0 - MIT\nhttps://github.com/jonschlinkert/object-copy\n\nCopyright (c) 2016, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject-keys 1.1.1 - MIT\nhttps://github.com/ljharb/object-keys#readme\n\nCopyright (c) 2013 Jordan Harband\n\nThe MIT License (MIT)\n\nCopyright (C) 2013 Jordan Harband\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject-visit 1.0.1 - MIT\nhttps://github.com/jonschlinkert/object-visit\n\nCopyright (c) 2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, 2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nonetime 2.0.1 - MIT\nhttps://github.com/sindresorhus/onetime#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nonetime 5.1.2 - MIT\nhttps://github.com/sindresorhus/onetime#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\non-finished 2.3.0 - MIT\nhttps://github.com/jshttp/on-finished\n\nCopyright (c) 2013 Jonathan Ong\nCopyright (c) 2014 Douglas Christopher Wilson\nCopyright (c) 2013 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2013 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\non-finished 2.4.1 - MIT\nhttps://github.com/jshttp/on-finished#readme\n\nCopyright (c) 2013 Jonathan Ong\nCopyright (c) 2014 Douglas Christopher Wilson\nCopyright (c) 2013 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2013 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\non-headers 1.0.2 - MIT\nhttps://github.com/jshttp/on-headers#readme\n\nCopyright (c) 2014 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2014 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nopen 6.4.0 - MIT\nhttps://github.com/sindresorhus/open#readme\n\nCopyright 2006, Kevin Krammer <kevin.krammer@gmx.at>\nCopyright 2006, Jeremy White <jwhite@codeweavers.com>\nCopyright 2009-2010, Fathi Boudra <fabo@freedesktop.org>\nCopyright 2009-2010, Rex Dieter <rdieter@fedoraproject.org>\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nora 3.4.0 - MIT\nhttps://github.com/sindresorhus/ora#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nora 5.4.1 - MIT\nhttps://github.com/sindresorhus/ora#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nos-tmpdir 1.0.2 - MIT\nhttps://github.com/sindresorhus/os-tmpdir#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nparent-module 1.0.1 - MIT\nhttps://github.com/sindresorhus/parent-module#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nparse-json 4.0.0 - MIT\nhttps://github.com/sindresorhus/parse-json#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nparse-json 5.2.0 - MIT\nhttps://github.com/sindresorhus/parse-json#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nparseurl 1.3.3 - MIT\nhttps://github.com/pillarjs/parseurl#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2014-2017 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014-2017 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n\n(The MIT License)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2014-2017 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npascalcase 0.1.1 - MIT\nhttps://github.com/jonschlinkert/pascalcase\n\nCopyright (c) 2015 Jon Schlinkert\nCopyright (c) 2015, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npath-exists 3.0.0 - MIT\nhttps://github.com/sindresorhus/path-exists#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npath-exists 4.0.0 - MIT\nhttps://github.com/sindresorhus/path-exists#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npath-is-absolute 1.0.1 - MIT\nhttps://github.com/sindresorhus/path-is-absolute#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npath-key 2.0.1 - MIT\nhttps://github.com/sindresorhus/path-key#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npath-key 3.1.1 - MIT\nhttps://github.com/sindresorhus/path-key#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npath-parse 1.0.7 - MIT\nhttps://github.com/jbgutierrez/path-parse#readme\n\nCopyright (c) 2015 Javier Blanco\n(c) Javier Blanco (http://jbgutierrez.info)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Javier Blanco\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-finally 1.0.0 - MIT\nhttps://github.com/sindresorhus/p-finally#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npicomatch 2.3.1 - MIT\nhttps://github.com/micromatch/picomatch\n\nCopyright (c) 2017-present, Jon Schlinkert\nCopyright (c) 2017-present, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2017-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npify 4.0.1 - MIT\nhttps://github.com/sindresorhus/pify#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npirates 4.0.5 - MIT\nhttps://github.com/danez/pirates#readme\n\nCopyright (c) 2016-2018 Ari Porad\n(c) 2015 Ari Porad (@ariporad) <http://ariporad.com>\n\nMIT License\n\nCopyright (c) 2016-2018 Ari Porad\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npkg-dir 3.0.0 - MIT\nhttps://github.com/sindresorhus/pkg-dir#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npkg-dir 4.2.0 - MIT\nhttps://github.com/sindresorhus/pkg-dir#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-limit 1.3.0 - MIT\nhttps://github.com/sindresorhus/p-limit#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-limit 2.3.0 - MIT\nhttps://github.com/sindresorhus/p-limit#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nplist 3.0.5 - MIT\nhttps://github.com/TooTallNate/node-plist#readme\n\nCopyright (c) 2010-2017 Nathan Rajlich <nathan@tootallnate.net>\n\n(The MIT License)\n\nCopyright (c) 2010-2017 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-locate 2.0.0 - MIT\nhttps://github.com/sindresorhus/p-locate#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-locate 3.0.0 - MIT\nhttps://github.com/sindresorhus/p-locate#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-locate 4.1.0 - MIT\nhttps://github.com/sindresorhus/p-locate#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nposix-character-classes 0.1.1 - MIT\nhttps://github.com/jonschlinkert/posix-character-classes\n\nCopyright (c) 2016-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npretty-format 26.6.2 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npretty-format 27.5.1 - MIT\nhttps://github.com/facebook/jest#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nprocess-nextick-args 2.0.1 - MIT\nhttps://github.com/calvinmetcalf/process-nextick-args\n\nCopyright (c) 2015 Calvin Metcalf\n\n# Copyright (c) 2015 Calvin Metcalf\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\n**THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.**\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npromise 8.1.0 - MIT\nhttps://github.com/then/promise#readme\n\nCopyright (c) 2014 Forbes Lindesay\n\nCopyright (c) 2014 Forbes Lindesay\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nprompts 2.4.2 - MIT\nhttps://github.com/terkelg/prompts#readme\n\n(c) Terkel Gjervig (https://terkel.com)\nCopyright (c) 2018 Terkel Gjervig Nielsen\n\nMIT License\n\nCopyright (c) 2018 Terkel Gjervig Nielsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nprop-types 15.8.1 - MIT\nhttps://facebook.github.io/react/\n\n(c) Sindre Sorhus\nCopyright (c) 2013-present, Facebook, Inc.\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) 2013-present, Facebook, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-try 1.0.0 - MIT\nhttps://github.com/sindresorhus/p-try#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\np-try 2.2.0 - MIT\nhttps://github.com/sindresorhus/p-try#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npump 3.0.0 - MIT\nhttps://github.com/mafintosh/pump#readme\n\nCopyright (c) 2014 Mathias Buus\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Mathias Buus\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\npunycode 2.1.1 - MIT\nhttps://mths.be/punycode\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrange-parser 1.2.1 - MIT\nhttps://github.com/jshttp/range-parser#readme\n\nCopyright (c) 2012-2014 TJ Holowaychuk\nCopyright (c) 2015-2016 Douglas Christopher Wilson\nCopyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2015-2016 Douglas Christopher Wilson doug@somethingdoug.com\n\n(The MIT License)\n\nCopyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.com\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-devtools-core 4.24.7 - MIT\nhttps://github.com/facebook/react#readme\n\nQr (c) Se\n(c) Sa (c)\n(c) http://www.w3.org/1999/xhtml\nCopyright (c) 2013-present, Facebook, Inc.\nCopyright (c) 2014-present, Facebook, Inc.\nCopyright 2011 The Closure Compiler Authors\nCopyright (c) Facebook, Inc. and its affiliates\nCopyright 2011 Mozilla Foundation and contributors\nCopyright 2014 Mozilla Foundation and contributors\nCopyright 2014, 2015, 2016, 2017, 2018 Simon Lydell\nCopyright 2009-2011 Mozilla Foundation and contributors\nCopyright jQuery Foundation and other contributors <https://jquery.org/>\nCopyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-is 16.13.1 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-is 17.0.2 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-native 0.68.2 - MIT\nhttps://github.com/facebook/react-native#readme\n\n\nMIT License\n\nCopyright (c) Meta Platforms, Inc. and affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-native-codegen 0.0.17 - MIT\nhttps://github.com/facebook/react-native/tree/HEAD/packages/react-native-codegen\n\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-native-device-info 5.6.5 - MIT\nhttps://github.com/react-native-community/react-native-device-info#readme\n\nCopyright (c) Microsoft 2016\nCopyright (c) 2015 Rebecca Hughes\nCopyright (c) 2015 Learnium Limited.\nCopyright 2015 the original author or authors.\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Rebecca Hughes\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-native-gradle-plugin 0.0.6 - MIT\nhttps://github.com/facebook/react-native/tree/HEAD/packages/react-native-gradle-plugin\n\nCopyright (c) 2015-2021 the original\nCopyright 2015 the original author or authors\nCopyright (c) Meta Platforms, Inc. and affiliates\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-refresh 0.4.3 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-shallow-renderer 16.14.1 - MIT\nhttps://reactjs.org/\n\n(c) Sindre Sorhus\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreadable-stream 2.3.7 - MIT\nhttps://github.com/nodejs/readable-stream#readme\n\nCopyright Joyent, Inc. and other Node contributors\n\nNode.js is licensed for use as follows:\n\n\"\"\"\nCopyright Node.js contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\nThis license applies to parts of Node.js originating from the\nhttps://github.com/joyent/node repository:\n\n\"\"\"\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreadable-stream 3.6.0 - MIT\nhttps://github.com/nodejs/readable-stream#readme\n\nCopyright Joyent, Inc. and other Node contributors\n\nNode.js is licensed for use as follows:\n\n\"\"\"\nCopyright Node.js contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\nThis license applies to parts of Node.js originating from the\nhttps://github.com/joyent/node repository:\n\n\"\"\"\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrecast 0.20.5 - MIT\nhttp://github.com/benjamn/recast\n\nCopyright (c) 2012 Ben Newman <bn@cs.stanford.edu>\n\nCopyright (c) 2012 Ben Newman <bn@cs.stanford.edu>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregenerate 1.4.2 - MIT\nhttps://mths.be/regenerate\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregenerate-unicode-properties 10.0.1 - MIT\nhttps://github.com/mathiasbynens/regenerate-unicode-properties\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregenerator-runtime 0.13.9 - MIT\n\n\nCopyright (c) 2014-present, Facebook, Inc.\n\nMIT License\n\nCopyright (c) 2014-present, Facebook, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregenerator-transform 0.15.0 - MIT\n\n\nCopyright (c) 2014-present, Facebook, Inc.\n\nMIT License\n\nCopyright (c) 2014-present, Facebook, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregex-not 1.0.2 - MIT\nhttps://github.com/jonschlinkert/regex-not\n\nCopyright (c) 2016, 2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2016, 2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregexp-tree 0.1.24 - MIT\nhttps://github.com/DmitrySoshnikov/regexp-tree\n\nCopyright (c) 2017 Dmitry Soshnikov\nCopyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>\n\nMIT License\n\nCopyright (c) 2017 Dmitry Soshnikov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregexpu-core 5.1.0 - MIT\nhttps://mths.be/regexpu\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nregjsgen 0.6.0 - MIT\nhttps://github.com/bnjmnt4n/regjsgen\n\nCopyright 2014-2020 Benjamin Tan <https://ofcr.se/>\n\nThe MIT License (MIT)\n\nCopyright 2014-2020 Benjamin Tan <https://ofcr.se/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrepeat-element 1.1.4 - MIT\nhttps://github.com/jonschlinkert/repeat-element\n\nCopyright (c) 2015-present, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrepeat-string 1.6.1 - MIT\nhttps://github.com/jonschlinkert/repeat-string\n\nCopyright (c) 2014-2015, Jon Schlinkert\nCopyright (c) 2014-2016, Jon Schlinkert\nCopyright (c) 2016, Jon Schlinkert (http://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrequire-directory 2.1.1 - MIT\nhttps://github.com/troygoode/node-require-directory/\n\nCopyright (c) 2011 Troy Goode <troygoode@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) 2011 Troy Goode <troygoode@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nresolve 1.17.0 - MIT\nhttps://github.com/browserify/resolve#readme\n\nCopyright (c) 2012 James Halliday\n\nMIT License\n\nCopyright (c) 2012 James Halliday\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nresolve-from 3.0.0 - MIT\nhttps://github.com/sindresorhus/resolve-from#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nresolve-from 4.0.0 - MIT\nhttps://github.com/sindresorhus/resolve-from#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nresolve-url 0.2.1 - MIT\nhttps://github.com/lydell/resolve-url\n\nCopyright (c) 2013 Simon Lydell\nCopyright 2014 Simon Lydell X11\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrestore-cursor 2.0.0 - MIT\nhttps://github.com/sindresorhus/restore-cursor#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrestore-cursor 3.1.0 - MIT\nhttps://github.com/sindresorhus/restore-cursor#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nret 0.1.15 - MIT\nhttps://github.com/fent/ret.js#readme\n\nCopyright (c) 2011 by Roly Fentanes\n\nCopyright (C) 2011 by Roly Fentanes\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. \n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nrimraf 2.2.8 - MIT\nhttps://github.com/isaacs/rimraf\n\nCopyright 2009, 2010, 2011 Isaac Z. Schlueter\n\nCopyright 2009, 2010, 2011 Isaac Z. Schlueter.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsafe-buffer 5.1.2 - MIT\nhttps://github.com/feross/safe-buffer\n\nCopyright (c) Feross Aboukhadijeh\nCopyright (c) Feross Aboukhadijeh (http://feross.org)\n\nThe MIT License (MIT)\n\nCopyright (c) Feross Aboukhadijeh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsafe-buffer 5.2.1 - MIT\nhttps://github.com/feross/safe-buffer\n\nCopyright (c) Feross Aboukhadijeh\nCopyright (c) Feross Aboukhadijeh (http://feross.org)\n\nThe MIT License (MIT)\n\nCopyright (c) Feross Aboukhadijeh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsafe-regex 1.1.0 - MIT\nhttps://github.com/substack/safe-regex\n\n\nThis software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsafe-regex 2.1.1 - MIT\nhttps://github.com/davisjam/safe-regex\n\nCopyright 2019-present\n\nCopyright 2019-present is held by the authors of the safe-regex module.\n\nThis software is released under the MIT license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nOriginal author: James Halliday @substack\nMaintainer: James C. (Jamie) Davis @davisjam\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nscheduler 0.11.3 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nscheduler 0.20.2 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsend 0.18.0 - MIT\nhttps://github.com/pillarjs/send#readme\n\nCopyright (c) 2012 TJ Holowaychuk\nCopyright (c) 2014-2022 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk\nCopyright (c) 2014-2022 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nserialize-error 2.1.0 - MIT\nhttps://github.com/sindresorhus/serialize-error#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nserve-static 1.15.0 - MIT\nhttps://github.com/expressjs/serve-static#readme\n\nCopyright (c) 2011 LearnBoost\nCopyright (c) 2010 Sencha Inc.\nCopyright (c) 2011 TJ Holowaychuk\nCopyright (c) 2014-2016 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2010 Sencha Inc.\nCopyright (c) 2011 LearnBoost\nCopyright (c) 2011 TJ Holowaychuk\nCopyright (c) 2014-2016 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nset-value 2.0.1 - MIT\nhttps://github.com/jonschlinkert/set-value\n\nCopyright (c) 2014-2017, Jon Schlinkert\nCopyright (c) 2014-2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2014-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nshallow-clone 3.0.1 - MIT\nhttps://github.com/jonschlinkert/shallow-clone\n\nCopyright (c) 2015-present, Jon Schlinkert\nCopyright (c) 2019, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nshebang-command 1.2.0 - MIT\nhttps://github.com/kevva/shebang-command#readme\n\n(c) Kevin Martensson (http://github.com/kevva)\nCopyright (c) Kevin Martensson <kevinmartensson@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) Kevin Martensson <kevinmartensson@gmail.com> (github.com/kevva)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nshebang-command 2.0.0 - MIT\nhttps://github.com/kevva/shebang-command#readme\n\nCopyright (c) Kevin Martensson <kevinmartensson@gmail.com>\n\nMIT License\n\nCopyright (c) Kevin Mårtensson <kevinmartensson@gmail.com> (github.com/kevva)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nshebang-regex 1.0.0 - MIT\nhttps://github.com/sindresorhus/shebang-regex\n\n(c) Sindre Sorhus (http://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nshebang-regex 3.0.0 - MIT\nhttps://github.com/sindresorhus/shebang-regex#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nshell-quote 1.6.1 - MIT\nhttps://github.com/substack/node-shell-quote#readme\n\nCopyright (c) 2013 James Halliday (mail@substack.net)\n\nThe MIT License\n\nCopyright (c) 2013 James Halliday (mail@substack.net)\n\nPermission is hereby granted, free of charge, \nto any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to \ndeal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, \nmerge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom \nthe Software is furnished to do so, \nsubject to the following conditions:\n\nThe above copyright notice and this permission notice \nshall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR \nANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, \nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nshell-quote 1.7.3 - MIT\nhttps://github.com/substack/node-shell-quote\n\nCopyright (c) 2013 James Halliday (mail@substack.net)\n\nThe MIT License\n\nCopyright (c) 2013 James Halliday (mail@substack.net)\n\nPermission is hereby granted, free of charge, \nto any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to \ndeal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, \nmerge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom \nthe Software is furnished to do so, \nsubject to the following conditions:\n\nThe above copyright notice and this permission notice \nshall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR \nANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, \nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsimple-plist 1.3.1 - MIT\nhttps://github.com/wollardj/simple-plist.git\n\nCopyright (c) 2013 Joe Wollard\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Joe Wollard\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsisteransi 1.0.5 - MIT\nhttps://github.com/terkelg/sisteransi#readme\n\n(c) Terkel Gjervig (https://terkel.com)\nCopyright (c) 2018 Terkel Gjervig Nielsen\n\nMIT License\n\nCopyright (c) 2018 Terkel Gjervig Nielsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nslash 3.0.0 - MIT\nhttps://github.com/sindresorhus/slash#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nslice-ansi 2.1.0 - MIT\nhttps://github.com/chalk/slice-ansi#readme\n\nCopyright (c) DC\n\nMIT License\n\nCopyright (c) DC <threedeecee@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsnapdragon 0.8.2 - MIT\nhttps://github.com/jonschlinkert/snapdragon\n\nCopyright (c) 2015-2016, Jon Schlinkert\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\nCopyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsnapdragon-node 2.1.1 - MIT\nhttps://github.com/jonschlinkert/snapdragon-node\n\nCopyright (c) 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsnapdragon-util 3.0.1 - MIT\nhttps://github.com/jonschlinkert/snapdragon-util\n\nCopyright (c) 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsource-map-resolve 0.5.3 - MIT\nhttps://github.com/lydell/source-map-resolve#readme\n\nCopyright (c) 2019 ZHAO Jinxiang\nCopyright (c) 2014, 2015, 2016, 2017, 2018, 2019 Simon Lydell\n\nThe MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018, 2019 Simon Lydell\nCopyright (c) 2019 ZHAO Jinxiang\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsource-map-resolve 0.6.0 - MIT\nhttps://github.com/lydell/source-map-resolve#readme\n\nCopyright (c) 2019 ZHAO Jinxiang\nCopyright (c) 2014, 2015, 2016, 2017, 2018, 2019, 2020 Simon Lydell\n\nThe MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018, 2019, 2020 Simon Lydell\nCopyright (c) 2019 ZHAO Jinxiang\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsource-map-support 0.5.21 - MIT\nhttps://github.com/evanw/node-source-map-support#readme\n\nCopyright (c) 2014 Evan Wallace\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Evan Wallace\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsource-map-url 0.4.1 - MIT\nhttps://github.com/lydell/source-map-url#readme\n\nCopyright (c) 2014 Simon Lydell\nCopyright 2014 Simon Lydell X11\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsplit-string 3.1.0 - MIT\nhttps://github.com/jonschlinkert/split-string\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstackframe 1.3.4 - MIT\nhttps://www.stacktracejs.com/\n\nCopyright (c) 2017 Eric Wendelin and other contributors\n\nCopyright (c) 2017 Eric Wendelin and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstacktrace-parser 0.1.10 - MIT\nhttps://github.com/errwischt/stacktrace-parser\n\nCopyright (c) 2014-2019 Georg Tavonius\n\nMIT License\n\nCopyright (c) 2014-2019 Georg Tavonius\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstatic-extend 0.1.2 - MIT\nhttps://github.com/jonschlinkert/static-extend\n\nCopyright (c) 2016, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstatuses 1.5.0 - MIT\nhttps://github.com/jshttp/statuses#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2016 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstatuses 2.0.1 - MIT\nhttps://github.com/jshttp/statuses#readme\n\nCopyright (c) 2014 Jonathan Ong\nCopyright (c) 2016 Douglas Christopher Wilson\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jonathan Ong <me@jongleberry.com>\nCopyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstring_decoder 1.1.1 - MIT\nhttps://github.com/nodejs/string_decoder\n\nCopyright Joyent, Inc. and other Node contributors\n\nNode.js is licensed for use as follows:\n\n\"\"\"\nCopyright Node.js contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\nThis license applies to parts of Node.js originating from the\nhttps://github.com/joyent/node repository:\n\n\"\"\"\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstring_decoder 1.3.0 - MIT\nhttps://github.com/nodejs/string_decoder\n\nCopyright Joyent, Inc. and other Node contributors\n\nNode.js is licensed for use as follows:\n\n\"\"\"\nCopyright Node.js contributors. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\nThis license applies to parts of Node.js originating from the\nhttps://github.com/joyent/node repository:\n\n\"\"\"\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\"\"\"\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstring-width 4.2.3 - MIT\nhttps://github.com/sindresorhus/string-width#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstrip-ansi 5.2.0 - MIT\nhttps://github.com/chalk/strip-ansi#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstrip-ansi 6.0.1 - MIT\nhttps://github.com/chalk/strip-ansi#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstrip-eof 1.0.0 - MIT\nhttps://github.com/sindresorhus/strip-eof\n\n(c) Sindre Sorhus (http://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstrip-final-newline 2.0.0 - MIT\nhttps://github.com/sindresorhus/strip-final-newline#readme\n\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsudo-prompt 9.2.1 - MIT\nhttps://github.com/jorangreef/sudo-prompt#readme\n\nCopyright (c) 2015 Joran Dirk Greef\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Joran Dirk Greef\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsupports-color 5.5.0 - MIT\nhttps://github.com/chalk/supports-color#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsupports-color 7.2.0 - MIT\nhttps://github.com/chalk/supports-color#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nsupports-color 8.1.1 - MIT\nhttps://github.com/chalk/supports-color#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntemp 0.8.3 - MIT\nhttps://github.com/bruce/node-temp\n\nCopyright (c) 2010-2014 Bruce Williams\n\nThe MIT License (MIT)\n\nCopyright (c) 2010-2014 Bruce Williams\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntemp 0.8.4 - MIT\nhttps://github.com/bruce/node-temp#readme\n\nCopyright (c) 2010-2014 Bruce Williams\n\nThe MIT License (MIT)\n\nCopyright (c) 2010-2014 Bruce Williams\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nthroat 5.0.0 - MIT\nhttps://github.com/ForbesLindesay/throat#readme\n\nCopyright (c) 2013 Forbes Lindesay\n\nCopyright (c) 2013 Forbes Lindesay\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nthroat 6.0.1 - MIT\nhttps://github.com/ForbesLindesay/throat#readme\n\nCopyright (c) 2013 Forbes Lindesay\n\nCopyright (c) 2013 Forbes Lindesay\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nthrough2 2.0.5 - MIT\nhttps://github.com/rvagg/through2#readme\n\nCopyright (c) Rod Vagg\nCopyright (c) Rod Vagg rvagg (https://twitter.com/rvagg) and additional contributors\n\n# The MIT License (MIT)\n\n**Copyright (c) Rod Vagg (the \"Original Author\") and additional contributors**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nto-fast-properties 2.0.0 - MIT\nhttps://github.com/sindresorhus/to-fast-properties#readme\n\n(c) Petka Antonov, John-David Dalton, Sindre Sorhus\nCopyright (c) 2014 Petka Antonov 2015 Sindre Sorhus\n\nMIT License\n\nCopyright (c) 2014 Petka Antonov\n              2015 Sindre Sorhus\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntoidentifier 1.0.1 - MIT\nhttps://github.com/component/toidentifier#readme\n\nCopyright (c) 2016 Douglas Christopher Wilson\nCopyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nMIT License\n\nCopyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nto-object-path 0.3.0 - MIT\nhttps://github.com/jonschlinkert/to-object-path\n\nCopyright (c) 2015 Jon Schlinkert\nCopyright (c) 2015, Jon Schlinkert\nCopyright (c) 2015-2016, Jon Schlinkert\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2016, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nto-regex 3.0.2 - MIT\nhttps://github.com/jonschlinkert/to-regex\n\nCopyright (c) 2016-2018, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2018, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nto-regex-range 2.1.1 - MIT\nhttps://github.com/micromatch/to-regex-range\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nto-regex-range 5.0.1 - MIT\nhttps://github.com/micromatch/to-regex-range\n\nCopyright (c) 2015-present, Jon Schlinkert\nCopyright (c) 2019, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntr46 0.0.3 - MIT\nhttps://github.com/Sebmaster/tr46.js#readme\n\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntr46 2.1.0 - MIT\n\n\nCopyright (c) 2016 Sebastian Mayr\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Sebastian Mayr\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntypedarray-to-buffer 3.1.5 - MIT\nhttp://feross.org/\n\nCopyright (c) Feross Aboukhadijeh\nCopyright (c) Feross Aboukhadijeh (http://feross.org)\n\nThe MIT License (MIT)\n\nCopyright (c) Feross Aboukhadijeh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nunicode-canonical-property-names-ecmascript 2.0.0 - MIT\nhttps://github.com/mathiasbynens/unicode-canonical-property-names-ecmascript\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nunicode-match-property-ecmascript 2.0.0 - MIT\nhttps://github.com/mathiasbynens/unicode-match-property-ecmascript\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nunicode-match-property-value-ecmascript 2.0.0 - MIT\nhttps://github.com/mathiasbynens/unicode-match-property-value-ecmascript\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nunicode-property-aliases-ecmascript 2.0.0 - MIT\nhttps://github.com/mathiasbynens/unicode-property-aliases-ecmascript\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nunion-value 1.0.1 - MIT\nhttps://github.com/jonschlinkert/union-value\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nuniversalify 0.1.2 - MIT\nhttps://github.com/RyanZim/universalify#readme\n\nCopyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.com>\n\n(The MIT License)\n\nCopyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the 'Software'), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nunpipe 1.0.0 - MIT\nhttps://github.com/stream-utils/unpipe\n\nCopyright (c) 2015 Douglas Christopher Wilson\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\n(The MIT License)\n\nCopyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nunset-value 1.0.0 - MIT\nhttps://github.com/jonschlinkert/unset-value\n\nCopyright (c) 2015, 2017, Jon Schlinkert\nCopyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015, 2017, Jon Schlinkert\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nupdate-browserslist-db 1.0.4 - MIT\nhttps://github.com/browserslist/update-db#readme\n\nCopyright 2022 Andrey Sitnik <andrey@sitnik.ru> and other contributors\n\nThe MIT License (MIT)\n\nCopyright 2022 Andrey Sitnik <andrey@sitnik.ru> and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nurix 0.1.0 - MIT\nhttps://github.com/lydell/urix\n\nCopyright (c) 2013 Simon Lydell\nCopyright 2014 Simon Lydell X11\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nuse 3.1.1 - MIT\nhttps://github.com/jonschlinkert/use\n\nCopyright (c) 2015-2017, Jon Schlinkert\nCopyright (c) 2015-present, Jon Schlinkert\nCopyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert)\n\nThe MIT License (MIT)\n\nCopyright (c) 2015-present, Jon Schlinkert.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nuse-subscription 1.5.1 - MIT\nhttps://github.com/facebook/react#readme\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nutil-deprecate 1.0.2 - MIT\nhttps://github.com/TooTallNate/util-deprecate\n\nCopyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>\n\n(The MIT License)\n\nCopyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nutils-merge 1.0.1 - MIT\nhttps://github.com/jaredhanson/utils-merge#readme\n\nCopyright (c) 2013-2017 Jared Hanson\nCopyright (c) 2013-2017 Jared Hanson < http://jaredhanson.net/ (http://jaredhanson.net/)>\n\nThe MIT License (MIT)\n\nCopyright (c) 2013-2017 Jared Hanson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nuuid 7.0.3 - MIT\nhttps://github.com/uuidjs/uuid#readme\n\nCopyright 2011, Sebastian Tschan https://blueimp.net\nCopyright (c) 2010-2016 Robert Kieffer and other contributors\nCopyright (c) Paul Johnston 1999 - 2009 Other contributors Greg Holt, Andrew Kepert, Ydnar, Lostinet\n\nThe MIT License (MIT)\n\nCopyright (c) 2010-2016 Robert Kieffer and other contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nvary 1.1.2 - MIT\nhttps://github.com/jshttp/vary#readme\n\nCopyright (c) 2014-2017 Douglas Christopher Wilson\n\n(The MIT License)\n\nCopyright (c) 2014-2017 Douglas Christopher Wilson\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nvlq 1.0.1 - MIT\nhttps://github.com/Rich-Harris/vlq#readme\n\nCopyright (c) 2017 these people (https://github.com/Rich-Harris/vlq/graphs/contributors)\n\nCopyright (c) 2017 [these people](https://github.com/Rich-Harris/vlq/graphs/contributors)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwcwidth 1.0.1 - MIT\nhttps://github.com/timoxley/wcwidth#readme\n\nCopyright (c) 2012 by Jun Woong\n\nwcwidth.js: JavaScript Portng of Markus Kuhn's wcwidth() Implementation\n=======================================================================\n\nCopyright (C) 2012 by Jun Woong.\n\nThis package is a JavaScript porting of `wcwidth()` implementation\n[by Markus Kuhn](http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c).\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\n\nTHIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,\nINCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\nFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\nIN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwhatwg-fetch 3.6.2 - MIT\nhttps://github.com/github/fetch#readme\n\nCopyright (c) 2014-2016 GitHub, Inc.\n\nCopyright (c) 2014-2016 GitHub, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwhatwg-url 5.0.0 - MIT\nhttps://github.com/jsdom/whatwg-url#readme\n\n(c) extraPathPercentEncodeSet.has\nCopyright (c) 2015-2016 Sebastian Mayr\n\nThe MIT License (MIT)\n\nCopyright (c) 2015–2016 Sebastian Mayr\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwhatwg-url 8.7.0 - MIT\nhttps://github.com/jsdom/whatwg-url#readme\n\n(c) extraPathPercentEncodeSet.has\nCopyright (c) 2015-2016 Sebastian Mayr\n\nThe MIT License (MIT)\n\nCopyright (c) 2015–2016 Sebastian Mayr\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwrap-ansi 6.2.0 - MIT\nhttps://github.com/chalk/wrap-ansi#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nwrap-ansi 7.0.0 - MIT\nhttps://github.com/chalk/wrap-ansi#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nws 6.2.2 - MIT\nhttps://github.com/websockets/ws\n\nCopyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nws 7.5.8 - MIT\nhttps://github.com/websockets/ws\n\nCopyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxmlbuilder 9.0.7 - MIT\nhttp://github.com/oozcitak/xmlbuilder-js\n\nCopyright (c) 2013 Ozgur Ozcitak\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Ozgur Ozcitak\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxmldoc 1.1.4 - MIT\nhttps://github.com/nfarina/xmldoc#readme\n\nCopyright 2012 Nick Farina\n\nCopyright 2012 Nick Farina.\nAll rights reserved.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nxtend 4.0.2 - MIT\nhttps://github.com/Raynos/xtend\n\nCopyright (c) 2012-2014 Raynos\n\nThe MIT License (MIT)\nCopyright (c) 2012-2014 Raynos.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nyargs 15.4.1 - MIT\nhttps://yargs.js.org/\n\nCopyright (c) 2011 Andrei Mackenzie\nCopyright 2014 Contributors (ben@npmjs.com)\nCopyright 2010 James Halliday (mail@substack.net)\n\nMIT License\n\nCopyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nyargs 16.2.0 - MIT\nhttps://yargs.js.org/\n\nCopyright 2014 Contributors (ben@npmjs.com)\nCopyright 2010 James Halliday (mail@substack.net)\n\nMIT License\n\nCopyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntype-fest 0.20.2 - MIT OR (CC0-1.0 AND MIT)\nhttps://github.com/sindresorhus/type-fest#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https:/sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https:/sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\ntype-fest 0.7.1 - MIT OR (CC0-1.0 AND MIT)\nhttps://github.com/sindresorhus/type-fest#readme\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njsonify 0.0.0\n\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nbig-integer 1.6.51 - Unlicense\nhttps://github.com/peterolson/BigInteger.js#readme\n\n\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org>\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nstream-buffers 2.2.0 - Unlicense\nhttps://github.com/samcday/node-stream-buffer#readme\n\n\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org/>\n\n---------------------------------------------------------\n\n"
  },
  {
    "path": "extensions/applicationinsights-react-native/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "extensions/applicationinsights-react-native/README.md",
    "content": "# Microsoft Application Insights React Native Plugin\n\n*******************\n\n:exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation:\n\n# The current development repo location of the [React-Native Plugin Repo has moved here](https://github.com/microsoft/applicationinsights-react-native) - (for v2.5.6 or greater) \n\n## Please refer to the new repo for usage instructions, and open issues there.\n\n- All code History was moved to the new repo\n\n:exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation: :exclamation:\n\n*******************\n\n### Where is the source code for the previous version\n\nFor historical purposes the previous code for the angular plugin has been archived in the [reactjs-legacy branch to review all previous code and documentation](https://github.com/microsoft/ApplicationInsights-JS/tree/reactnative-legacy/extensions/applicationinsights-react-native) branch.\n\nNo further changes are scheduled or expected, any and all changes will occur in the [new repo](https://github.com/microsoft/applicationinsights-react-native) only.\n\n### Links\n\n- [New Repo](https://github.com/microsoft/applicationinsights-react-native)\n- [v2.5.5 Readme](https://github.com/microsoft/ApplicationInsights-JS/tree/reactnative-legacy/extensions/applicationinsights-react-native/README.md)\n"
  },
  {
    "path": "gruntfile.js",
    "content": "const { default: replace } = require(\"@rollup/plugin-replace\");\n\nmodule.exports = function (grunt) {\n\n    const versionPlaceholder = '\"#version#\"';\n    const extVersionPlaceholder = '\"#extVersion#\"';\n\n    const aiCoreDefaultNameReplacements = [\n    ];\n\n    const aiDefaultNameReplacements = [\n    ];\n\n    const aiInternalConstants = [\n        \"./src/InternalConstants.ts\"\n    ];\n\n    const configVer = getConfigVersion(false);\n    const configMajorVer = getConfigVersion(true);\n\n    function _encodeStr(str) {\n        return str.replace(/\\\\/g, '\\\\\\\\').\n        replace(/\"/g, '\\\\\"').\n        replace(/'/g, '\\\\\\'').\n        replace(/\\u0008/g, '\\\\b').\n        replace(/\\r/g, '\\\\r').\n        replace(/\\t/g, '\\\\t').\n        replace(/\\n/g, '\\\\n').\n        replace(/\\f/g, '\\\\f');\n\n    }\n\n    function generateNewSnippet(prefix) {\n        var srcPath = \"./tools/applicationinsights-web-snippet/dist-es5\";\n        return {\n            files: [{\n                expand: true,\n                cwd: srcPath,\n                dest: \"./tools/applicationinsights-web-snippet/dist-es5\",\n                src: \"applicationinsights-web-snippet.js\"\n            }],\n            options: {\n                replacements: function() {\n                    var snippetBuffer = grunt.file.read(\"./tools/applicationinsights-web-snippet/build/output/snippet.min.js\");\n                    if (prefix === \"ConnString\") {\n                        snippetBuffer = snippetBuffer.replace(/connectionString:\\s*\".*?\"/gms, \"    connectionString: \\\"YOUR_CONNECTION_STRING\\\"\");\n                    } else if (prefix === \"IKey\") {\n                        snippetBuffer = snippetBuffer.replace(/connectionString:\\s*\".*?\"/gms, \"    connectionString: \\\"InstrumentationKey=INSTRUMENTATION_KEY\\\"\");\n                    } else if (prefix === \"Origin\") {\n                        snippetBuffer = grunt.file.read(\"./tools/applicationinsights-web-snippet/build/output/originSnippet.min.js\");\n                    }\n                    var snippetStr = _encodeStr(snippetBuffer.toString());\n                    var expectedStr = `##replace${prefix}Snippet##`;\n                    return [{\n                        pattern: expectedStr,\n                        replacement: snippetStr\n                    }];\n                }\n            }\n        };\n    }\n\n    function expandMin() {\n        var srcPath = \"./tools/applicationinsights-web-snippet/build/output\";\n        return {\n            files: [{\n                expand: true,\n                cwd: srcPath,\n                dest: \"./tools/applicationinsights-web-snippet/build/output\",\n                src: \"snippet.min.js\"\n            }],\n            options: {\n                replacements: function() {\n               \n                    var snippetBuffer = grunt.file.read(\"./tools/applicationinsights-web-snippet/build/output/snippet.min.js\");\n                    var snippetConfig = grunt.file.read(\"./tools/applicationinsights-web-snippet/src/snippet-config.jsonc\").trim();\n\n                    while(snippetConfig.endsWith(\"\\r\") || snippetConfig.endsWith(\"\\n\")) {\n                        snippetConfig = snippetConfig.substring(0, snippetConfig.length - 1);\n                    }\n\n                    // We assign a value to SnippetConfig and then forcefully overwrite it into the function input.\n                    if (snippetBuffer.startsWith(\"!(function\")) {\n                        throw \"Snippet prefix input is invalid -- replace will fail\";\n                    }\n                    var overWriteString = \"!(function (cfg){\" + snippetBuffer\n\n                    let orgOverwrite = overWriteString;\n                    overWriteString = overWriteString.replace(/\\n\\/\\/# source.*\\n/, \"})(\" + snippetConfig + \");\\n\");\n                    if(overWriteString === orgOverwrite) {\n                        throw \"Snippet postfix input is invalid -- replace will fail\";\n                    }\n\n                    return [{\n                        pattern: snippetBuffer,\n                        replacement: overWriteString\n                    }];\n                }\n            }\n        };\n    }\n\n    function expandJS() {\n        var srcPath = \"./tools/applicationinsights-web-snippet/build/output\";\n        return {\n            files: [{\n                expand: true,\n                cwd: srcPath,\n                dest: \"./tools/applicationinsights-web-snippet/build/output\",\n                src: \"snippet.js\"\n            }],\n            options: {\n                replacements: function() {\n               \n                    var snippetBuffer = grunt.file.read(\"./tools/applicationinsights-web-snippet/build/output/snippet.js\");\n                    var snippetConfig = grunt.file.read(\"./tools/applicationinsights-web-snippet/src/snippet-config.jsonc\").trim();\n                    while(snippetConfig.endsWith(\"\\r\") || snippetConfig.endsWith(\"\\n\")) {\n                        snippetConfig = snippetConfig.substring(0, snippetConfig.length - 1);\n                    }\n\n                    var overWriteString = snippetBuffer.replace(/\\(function \\(win, doc\\)/, \"(function (win, doc, cfg)\");\n                    if(overWriteString === snippetBuffer) {\n                        throw \"Snippet prefix input is invalid -- replace will fail\";\n                    }\n\n                    let orgOverwrite = overWriteString;\n                    overWriteString = overWriteString.replace(/}\\)\\(window, document\\);/, \"})(window, document, \" + snippetConfig + \");\")\n                    if(overWriteString === orgOverwrite) {\n                        throw \"Snippet postfix input is invalid -- replace will fail\";\n                    }\n\n                    return [{\n                        pattern: snippetBuffer,\n                        replacement: overWriteString\n                    }];\n                }\n            }\n        };\n    }\n\n\n    function getConfigVersion(isMajorVer) {\n        let version = \"\";\n        try {\n            let config = grunt.file.readJSON(\"./tools/config/package.json\");\n            let configVer= config[\"version\"];\n            version = \".\" + configVer;\n            if (isMajorVer) {\n                version = \".\" + configVer.split(\".\")[0];\n            }\n\n        } catch (e) {\n            console.log(\"stack: '\" + e.stack + \"', message: '\" + e.message + \"', name: '\" + e.name + \"'\");\n        }\n        return version;\n    }\n   \n\n    function _createRegEx(str) {\n        // Converts a string into a global regex, escaping any special characters\n        return new RegExp(str.replace(/([.+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'), 'g');\n    }\n    \n    function setVersionNumber(path, packageVersion, extPackageVersion) {\n        var srcPath = path + '/src';\n        var replacements = [{\n            pattern: _createRegEx(versionPlaceholder),\n            replacement: \"'\" + packageVersion + \"'\"\n        }];\n\n        if (extPackageVersion) {\n            replacements.push({\n                pattern: _createRegEx(extVersionPlaceholder),\n                replacement: \"'\" + extPackageVersion + \"'\"\n            });\n        }\n\n        // This is the grunt string-replace configuration to replace version placeholder with the actual version number\n        return {\n            files: [{\n                expand: true,\n                cwd: srcPath,\n                dest: srcPath,\n                src: '**/*.ts'\n            }],\n            options: {\n                replacements: replacements\n            }\n        };\n    }\n\n    function restoreVersionPlaceholder(path, packageVersion, extPackageVersion) {\n        var srcPath = path + '/src';\n        var replacements = [{\n            pattern: _createRegEx(\"'\" + packageVersion + \"'\"),\n            replacement: versionPlaceholder\n        },{\n            pattern: _createRegEx('\"' + packageVersion + '\"'),\n            replacement: versionPlaceholder\n        }];\n\n        if (extPackageVersion && extPackageVersion !== packageVersion) {\n            replacements.push({\n                pattern: _createRegEx(\"'\" + extPackageVersion + \"'\"),\n                replacement: extVersionPlaceholder\n            });\n            replacements.push({\n                pattern: _createRegEx('\"' + extPackageVersion + '\"'),\n                replacement: extVersionPlaceholder\n            });\n        }\n\n        // This is the grunt string-replace configuration to replace the actual version number with the version placeholder\n        return {\n            files: [{\n                expand: true,\n                cwd: srcPath,\n                dest: srcPath,\n                src: '**/*.ts'\n            }],\n            options: {\n                replacements: replacements\n            }\n        };\n    }\n\n    function deepMerge(target, src) {\n        try {\n            var newValue = Object.assign({}, target, src);\n\n            if (target && src) {\n                Object.keys(target).forEach((key) => {\n                    // Any existing src[key] value would have been assigned over the target[key] version\n                    if (src[key] !== undefined) {\n                        if (Array.isArray(newValue[key])) {\n                            target[key].forEach((value) => {\n                                newValue[key].push(value);\n                            });\n                        } else if (typeof newValue[key] === \"object\") {\n                            // Make sure we merge all properties\n                            newValue[key] = deepMerge(newValue[key], target[key]);\n                        }\n                    }\n                });\n            }\n\n            return newValue;\n        } catch (e) {\n            console.error(\"stack: '\" + e.stack + \"', message: '\" + e.message + \"', name: '\" + e.name + \"'\");\n        }\n    }\n\n    // const perfTestVersions = [\"2.0.0\",\"2.0.1\",\"2.1.0\",\"2.2.0\",\"2.2.1\",\"2.2.2\",\"2.3.0\",\"2.3.1\",\n    // \"2.4.1\",\"2.4.3\",\"2.4.4\",\"2.5.2\",\"2.5.3\",\"2.5.4\",\"2.5.5\",\"2.5.6\",\"2.5.7\",\"2.5.8\",\"2.5.9\",\"2.5.10\",\"2.5.11\",\n    // \"2.6.0\",\"2.6.1\",\"2.6.2\",\"2.6.3\",\"2.6.4\",\"2.6.5\",\"2.7.0\"];\n    const perfTestVersions=[\"3.4.1\"];\n\n    function buildConfig(modules) {\n        var buildCmds = {\n            ts: {\n                options: {\n                    comments: true,\n                    debug: true,\n                    logOutput: true\n                }            \n            },\n            \"eslint-ts\": {\n                options: {\n                    debug: true\n                }\n            },\n            \"ai-minify\": {\n                options: {\n                    debug: true,\n                    //testOnly: true,\n                }\n            },\n            \"qunit\" : {\n                all: {\n                    options: {\n                    }\n                }\n            },\n            connect: {\n                server: {\n                    options: {\n                        port: 9001,\n                         base: '.',\n                         debug: true\n                    }\n                }        \n            },\n            \"string-replace\": {\n\n            }\n        };\n\n        for (var key in modules) {\n            if (modules.hasOwnProperty(key)) {\n                var modulePath = modules[key].path;\n                var moduleCfg = modules[key].cfg;\n                var packageJsonFile = modulePath + '/package.json';\n\n                if (grunt.file.exists(packageJsonFile)) {\n                    // Read the actual module version from the package.json\n                    var pkg = grunt.file.readJSON(modulePath + '/package.json');\n\n                    var addMinifyTasks = modules[key].autoMinify !== false;\n                    if (addMinifyTasks) {\n                        var nameMaps = aiDefaultNameReplacements;\n                        var internalConstants = aiInternalConstants;\n                        if (pkg['name'] === \"@microsoft/applicationinsights-core-js\") {\n                            nameMaps = aiCoreDefaultNameReplacements;\n                            internalConstants = [ \"./src/constants/InternalConstants.ts\" ];\n                        }\n    \n                        var aiMinify = buildCmds[\"ai-minify\"];\n                        aiMinify[key] = {\n                            options: {\n                                projectRoot: modulePath,\n                                src: \"./src/**/*.ts\",\n                                nameMaps: nameMaps,\n                                internalConstants: internalConstants\n                            }\n                        };\n    \n                        aiMinify[key + \"-reverse\"] = {\n                            options: {\n                                projectRoot: modulePath,\n                                src: \"./src/**/*.ts\",\n                                restore: true,\n                                nameMaps: nameMaps,\n                                internalConstants: internalConstants\n                            }\n                        };\n                    }\n\n                    var addStringReplace = modules[key].stringReplace !== false;\n                    if (addStringReplace) {\n                        var replaceCmds = buildCmds['string-replace'];\n                        // Read the actual module version from the package.json\n                        var packageVersion = pkg['version'];\n                        var extPackageVersion = packageVersion;\n\n                        if (key !== \"1dsPost\" && key !== \"1dsCore\") {\n                            // Support for #extVersion# placeholder (old 1ds core version with major version incremented by 1)\n                            var idx = packageVersion.indexOf(\".\");\n                            if (idx !== -1) {\n                                var majorVersion = parseInt(packageVersion.substring(0, idx));\n                                if (!isNaN(majorVersion)) {\n                                    extPackageVersion = (majorVersion + 1) + packageVersion.substring(idx);\n                                }\n                            }\n                        }\n\n                        replaceCmds[key] = setVersionNumber(modulePath, packageVersion, extPackageVersion);\n                        replaceCmds[key + '-reverse'] = restoreVersionPlaceholder(modulePath, packageVersion, extPackageVersion);                        \n                    }\n                }\n\n                if (grunt.file.exists(modulePath + '/src/tsconfig.json')) {\n                    // Use the src tsconfig (if available)\n                    buildCmds.ts[key] = {\n                        'tsconfig': modulePath + \"/src/tsconfig.json\",\n                    };\n                } else if (grunt.file.exists(modulePath + '/tsconfig.json')) {\n                    // Otherwise fall back to the root tsconfig (if available)\n                    buildCmds.ts[key] = {\n                        'tsconfig': modulePath + \"/tsconfig.json\",\n                    };\n                } else {\n                    throw new Error(\"TSConfig not found for [\" + key + \"]\");\n                }\n\n                if (moduleCfg) {\n                    buildCmds.ts[key] = Object.assign(buildCmds.ts[key], moduleCfg);\n                }\n\n                // If the tests have their own tsconfig, add that as a new target\n                var addQunit = false;\n                var testRoot = \"\";\n                if (modules[key].testHttp !== false) {\n                    testRoot = \"http://localhost:9001/\";\n                }\n\n                var testUrl = testRoot + modulePath + \"/test/UnitTests.html\";\n                if (grunt.file.exists(modulePath + '/test/tsconfig.json')) {\n                    addQunit = true;\n                    buildCmds.ts[key + '-tests'] = {\n                        tsconfig: modulePath + \"/test/tsconfig.json\",\n                        src: [\n                            modulePath + \"/test/Unit/src/**/*.ts\"\n                        ],\n                        out: modulePath + \"/test/Unit/dist/\" + (modules[key].unitTestName || key + \".tests.js\")\n                    };\n                } else if (grunt.file.exists(modulePath + '/Tests/tsconfig.json')) {\n                    addQunit = true;\n                    testUrl = testRoot + modulePath + \"/Tests/UnitTests.html\";\n                    buildCmds.ts[key + '-tests'] = {\n                        tsconfig: modulePath + \"/Tests/tsconfig.json\",\n                        src: [\n                            modulePath + \"/Tests/Unit/src/**/*.ts\"\n                        ],\n                        out: modulePath + \"/Tests/Unit/dist/\" + (modules[key].unitTestName || key + \".tests.js\")\n                    };\n                }\n\n                if (addQunit) {\n                    // Remove any \"/./\" values from the path\n                    testUrl = testUrl.replace(/\\/\\.\\//g, \"/\");\n\n                    buildCmds.qunit[key] = {\n                        options: {\n                            urls: [testUrl],\n                            timeout: 300 * 1000, // 5 min\n                            console: true,\n                            summaryOnly: false,\n                            httpBase: \".\",\n                            puppeteer: {\n                                debug: true,\n                                headless: \"new\",\n                                timeout: 30000,\n                                ignoreHTTPErrors: true,\n                                args: [\n                                    \"--enable-precise-memory-info\",\n                                    \"--expose-internals-for-testing\",\n                                    \"--no-sandbox\"\n                                ]\n                            }\n                        }\n                    };\n                }\n\n                // If the tests have their own tsconfig, add that as a new target\n                addQunit = false;\n                var testUrl = testRoot + modulePath + \"/test/PerfTests.html\";\n                if (grunt.file.exists(modulePath + '/test/PerfTests.html')) {\n                    addQunit = true;\n                    buildCmds.ts[key + '-perftest'] = {\n                        tsconfig: modulePath + \"/test/tsconfig.json\",\n                        src: [\n                            modulePath + \"/test/Perf/src/**/*.ts\"\n                        ],\n                        out: modulePath + \"/test/Perf/dist/es5/\" + (modules[key].perfTestName || key + \".perf.tests.js\")\n                    };\n                } else if (grunt.file.exists(modulePath + '/Tests/PerfTests.html')) {\n                    addQunit = true;\n                    testUrl = testRoot + modulePath + \"/Tests/PerfTests.html\";\n                    buildCmds.ts[key + '-perftest'] = {\n                        tsconfig: modulePath + \"/Tests/tsconfig.json\",\n                        src: [\n                            modulePath + \"/Tests/Perf/src/**/*.ts\"\n                        ],\n                        out: modulePath + \"/Tests/Perf/dist/es5/\" + (modules[key].perfTestName || key + \".perf.tests.js\")\n                    };\n                }\n\n                if (addQunit) {\n                    var testUrls = [ testUrl ];\n                    if (key === \"aisku\") {\n                        testUrls = perfTestVersions.map((version) => {\n                            return testUrl + `?version=${version}`;\n                        });\n                    }\n\n                    buildCmds.qunit[key + \"-perf\"] = {\n                        options: {\n                            urls: testUrls,\n                            timeout: 300 * 1000, // 5 min\n                            console: true,\n                            summaryOnly: false,\n                            puppeteer: {\n                                headless: \"new\",\n                                timeout: 30000,\n                                ignoreHTTPErrors: true,\n                                args: [\n                                    '--enable-precise-memory-info',\n                                    '--expose-internals-for-testing',\n                                    \"--no-sandbox\"\n                                ]\n                            }\n                        }\n                    };\n                }\n\n                let esLintCmd = buildCmds[\"eslint-ts\"];\n                esLintCmd[key + '-lint'] = {\n                    options: {\n                        tsconfig: modulePath + '/tsconfig.json'\n                    }\n                };\n\n                if (moduleCfg) {\n                    esLintCmd[key + '-lint'] = Object.assign(buildCmds.ts[key], moduleCfg);\n                }\n\n                esLintCmd[key + '-lint-fix'] = deepMerge({ options: { fix: true } }, esLintCmd[key + '-lint']);\n            }\n        }\n\n        return buildCmds;\n    }\n\n    try {\n        var theBuildConfig = deepMerge(buildConfig({\n            // Shared\n            \"core\":                 { \n                                        path: \"./shared/AppInsightsCore\",\n                                        unitTestName: \"aicoreunit.tests.js\",\n                                        perfTestName: \"aicoreperf.tests.js\"\n                                    },\n            \"common\":               { \n                                        path: \"./shared/AppInsightsCommon\",\n                                        unitTestName: \"aicommon.tests.js\"\n                                    },\n            \"1dsCore\":                 { \n                                        path: \"./shared/1ds-core-js\",\n                                        unitTestName: \"core.unittests.js\"\n                                    },\n    \n            // SKUs\n            \"aisku\":                { \n                                        path: \"./AISKU\", \n                                        cfg: { \n                                            src: [ \n                                                \"AISKU/src/*.ts\" \n                                            ] \n                                        },\n                                        unitTestName: \"aiskuunittests.tests.js\",\n                                        perfTestName: \"aiskuperftests.tests.js\"\n                                    },\n            \"aiskulite\":            { \n                                        path: \"./AISKULight\", \n                                        cfg: { \n                                            src: [ \n                                                \"AISKULight/src/*.ts\" \n                                            ] \n                                        },\n                                        unitTestName: \"aiskuliteunittests.tests.js\"\n                                    },\n    \n            // Channels\n            \"aichannel\":            { path: \"./channels/applicationinsights-channel-js\" },\n            \"offlinechannel\":       {\n                                        path: \"./channels/offline-channel-js\"\n                                    },\n            \"teechannel\":           { path: \"./channels/tee-channel-js\" },\n            \"1dsPost\":              {\n                                        path: \"./channels/1ds-post-js\",\n                                        unitTestName: \"post.unittests.js\"\n                                    },\n\n            // Extensions\n            \"appinsights\":          { \n                                        path: \"./extensions/applicationinsights-analytics-js\",\n                                        unitTestName: \"appinsights-analytics.tests.js\"\n                                    },\n            \"clickanalytics\":       { \n                                        path: \"./extensions/applicationinsights-clickanalytics-js\",\n                                        unitTestName: \"appinsights-clickanalytics.tests.js\"\n                                    },\n            \"debugplugin\":          { path: \"./extensions/applicationinsights-debugplugin-js\" },\n            \"deps\":                 { \n                                        path: \"./extensions/applicationinsights-dependencies-js\",\n                                        unitTestName: \"dependencies.tests.js\"\n                                    },\n            \"perfmarkmeasure\":      { \n                                        path: \"./extensions/applicationinsights-perfmarkmeasure-js\",\n                                        unitTestName: \"appinsights-perfmarkmeasure.tests.js\"\n                                    },\n            \"properties\":           { \n                                        path: \"./extensions/applicationinsights-properties-js\",\n                                        unitTestName: \"prop.tests.js\"\n                                    },\n            \"osplugin\":             { \n                                        path: \"./extensions/applicationinsights-osplugin-js\",\n                                        unitTestName: \"applicationinsights-osplugin.tests.js\"\n                                    },\n            \"cfgsync\":               { \n                                        path: \"./extensions/applicationinsights-cfgsync-js\",\n                                        unitTestName: \"cfgsync.tests.js\"\n                                    },\n\n            // Examples\n            \"example-shared-worker\": {\n                                        autoMinify: false,\n                                        path: \"./examples/shared-worker\",\n                                        testHttp: false\n                                    },\n\n            \"example-aisku\":        {\n                                        autoMinify: false,\n                                        path: \"./examples/AISKU\",\n                                        testHttp: false\n                                    },\n\n            \"example-dependency\":   {\n                                        autoMinify: false,\n                                        path: \"./examples/dependency\",\n                                        testHttp: false\n                                    },\n            \"example-cfgsync\":        {\n                                        autoMinify: false,\n                                        path: \"./examples/cfgSync\",\n                                        testHttp: false\n                                    },\n\n            \"example-startspan\":      {\n                                        autoMinify: false,\n                                        path: \"./examples/startSpan\",\n                                        testHttp: false\n                                    },\n    \n            // Tools\n            \"rollupuglify\":         {\n                                        autoMinify: false,\n                                        path: \"./tools/rollup-plugin-uglify3-js\",\n                                        cfg: {\n                                            src: [\n                                                \"./tools/rollup-plugin-uglify3-js/src/*.ts\",\n                                                \"!node_modules/**\"\n                                            ],\n                                            out: './tools/rollup-plugin-uglify3-js/out/src/uglify3-js.js'\n                                        },\n                                        testHttp: false\n                                    },\n            \"rollupes5\":            { \n                                        autoMinify: false,\n                                        path: \"./tools/rollup-es5\",\n                                        unitTestName: \"es5rolluptests.js\"\n                                    },\n            \"shims\":                {\n                                        autoMinify: false,\n                                        path: \"./tools/shims\",\n                                        cfg: {\n                                            src: [\n                                                \"./tools/shims/src/*.ts\"\n                                            ]\n                                        },\n                                        unitTestName: \"shimstests.js\"\n                                    },\n            \"chrome-debug-extension\": {\n                                        autoMinify: false,\n                                        path: \"./tools/chrome-debug-extension\",\n                                        cfg: {\n                                            src: [\n                                                \"./tools/chrome-debug-extension/src/**/*.tsx\",\n                                                \"./tools/chrome-debug-extension/src/**/*.ts\",\n                                            ]\n                                        }\n                                    },\n            \"applicationinsights-web-snippet\": {\n                                        autoMinify: false,\n                                        path: \"./tools/applicationinsights-web-snippet\",\n                                        cfg: {\n                                            src: [\n                                                \"./tools/applicationinsights-web-snippet/src/**/*.ts\"\n                                            ]\n                                        }\n                                    },\n            // Common\n            \"tst-framework\":        {\n                                        autoMinify: false,\n                                        path: \"./common/Tests/Framework\",\n                                        cfg: {\n                                            src: [\n                                                \"./common/Tests/Framework/src/*.ts\"\n                                            ]\n                                        } \n                                    },\n        }));\n    \n        function tsBuildActions(name, addTests, replaceName) {\n            var actions = [\n                \"eslint-ts:\" + name + \"-lint-fix\"\n            ];\n            var aiMinifyConfig = theBuildConfig[\"ai-minify\"] || {};\n            var gruntTsConfig = theBuildConfig[\"ts\"];\n            var replaceConfig = theBuildConfig[\"string-replace\"] || {};\n            if (replaceName === true || replaceConfig[name]) {\n\n                actions.push(\"string-replace:\" + name);\n                if (aiMinifyConfig[name]) {\n                    // Make sure all translations are reversed first\n                    actions.push(\"ai-minify:\" + name + \"-reverse\");\n                    // Attempt to compile without any translations (Validates that the original source code is fine before transforming it)\n                    actions.push(\"ts:\" + name);\n                    actions.push(\"ai-minify:\" + name);\n                }\n\n                // Now perform the \"real\" final compile after minification\n                actions.push(\"ts:\" + name);\n        \n                if (addTests && gruntTsConfig[name + \"-tests\"]) {\n                    actions.push(\"ts:\" + name + \"-tests\");\n                }\n                if (aiMinifyConfig[name + \"-reverse\"]) {\n                    actions.push(\"ai-minify:\" + name + \"-reverse\");\n                }\n    \n                actions.push(\"string-replace:\" + name + \"-reverse\");\n            } else {\n                if (aiMinifyConfig[name]) {\n                    // Attempt to compile without any translations (Validates that the original source code is fine before transforming it)\n                    actions.push(\"ts:\" + name);\n                    actions.push(\"ai-minify:\" + name);\n                }\n\n                // Now perform the \"real\" final compile after minification\n                actions.push(\"ts:\" + name);\n                if (addTests && gruntTsConfig[name + \"-tests\"]) {\n                    actions.push(\"ts:\" + name + \"-tests\");\n                }\n                \n                if (aiMinifyConfig[name + \"-reverse\"]) {\n                    actions.push(\"ai-minify:\" + name + \"-reverse\");\n                }\n            }\n    \n            actions.push(\"eslint-ts:\" + name + \"-lint\");\n    \n            return actions;\n        }\n\n        function tsTestActions(name, minifySrc, compileSrc) {\n            var gruntTsConfig = theBuildConfig[\"ts\"];\n            var aiMinifyConfig = theBuildConfig[\"ai-minify\"] || {};\n\n            var actions = [\n                \"connect\"\n            ];\n\n            var replaceConfig = theBuildConfig[\"string-replace\"] || {};\n            if (replaceConfig[name]) {\n                actions.push(\"string-replace:\" + name);\n            }\n\n            if (aiMinifyConfig[name]) {\n                if (minifySrc) {\n                    // Attempt to compile with translations (Validates that the original source code is fine before transforming it)\n                    actions.push(\"ai-minify:\" + name);\n                } else if (aiMinifyConfig[name + \"-reverse\"]){\n                    // Attempt to compile without any translations (Validates that the original source code is fine before transforming it)\n                    actions.push(\"ai-minify:\" + name + \"-reverse\");\n                }\n\n                if (compileSrc && gruntTsConfig[name]) {\n                    actions.push(\"ts:\" + name);\n                }\n            }\n\n            // If this helper is called then these should always exist\n            actions.push(\"ts:\" + name + \"-tests\");\n            actions.push(\"qunit:\" + name);\n\n            if (minifySrc && aiMinifyConfig[name + \"-reverse\"]) {\n                actions.push(\"ai-minify:\" + name + \"-reverse\");\n            }\n\n            if (replaceConfig[name]) {\n                actions.push(\"string-replace:\" + name + \"-reverse\");\n            }\n\n            return actions;\n        }\n\n        function minTasks(name) {\n            var actions = [\n            ];\n    \n            var aiMinifyConfig = theBuildConfig[\"ai-minify\"] || {};\n            if (aiMinifyConfig[name]) {\n                actions.push(\"ai-minify:\" + name);\n            }\n\n            return actions;\n        }\n\n        function restoreTasks(name) {\n            var actions = [\n            ];\n    \n            var aiMinifyConfig = theBuildConfig[\"ai-minify\"] || {};\n            if (aiMinifyConfig[name + \"-reverse\"]) {\n                actions.push(\"ai-minify:\" + name + \"-reverse\");\n            }\n\n            return actions;\n        }\n\n        grunt.initConfig(deepMerge(\n            theBuildConfig, {\n            uglify: {\n                snippetvNext: {\n                    files: {\n                        'AISKU/snippet/snippet.min.js': ['AISKU/snippet/snippet.js']\n                    },\n                    options: {\n                        sourceMap: false,\n                        ie8: false,\n                        compress: {\n                          passes:3,\n                          unsafe: true,\n                        },\n                        output: {\n                          webkit:true\n                        }\n                    }\n                }\n            },\n            'string-replace': {\n                'generate-expanded-JS': expandJS(),\n                'generate-expanded-min': expandMin(),\n                'generate-snippet-ikey': generateNewSnippet(\"IKey\"),\n                'generate-snippet-connString': generateNewSnippet(\"ConnString\"),\n                'generate-snippet-origin': generateNewSnippet(\"Origin\")\n            },\n            copy: {\n                \"originSnippet\": {\n                    files: [\n                        { src: \"./tools/applicationinsights-web-snippet/build/output/snippet.min.js\", dest: `./tools/applicationinsights-web-snippet/build/output/originSnippet.min.js` }\n                       ]\n                },\n                \"snippetToDistEs5\": {\n                    files: [\n                        { expand: true, cwd: \"./tools/applicationinsights-web-snippet/build/output/\", src: \"snippet.**\", dest: \"./tools/applicationinsights-web-snippet/dist-es5/\" },\n                        { expand: true, cwd: \"./tools/applicationinsights-web-snippet/build/output/common/\", src: \"**\", dest: \"./tools/applicationinsights-web-snippet/dist-es5/common/\" },\n                       ]\n                },\n\n                \"web-snippet\": {\n                    files: [  \n                        { src: \"./tools/applicationinsights-web-snippet/build/output/applicationinsights-web-snippet.js\", dest: `./tools/applicationinsights-web-snippet/dist-es5/applicationinsights-web-snippet.js` }\n                    ]\n                },\n                config: {\n                    files: [\n                        { src: \"./tools/config/config.json\", dest: `./tools/config/browser/es5/ai.config${configVer}.cfg.json` },\n                        { src: \"./tools/config/config.json\", dest: `./tools/config/browser/es5/ai.config${configMajorVer}.cfg.json` }\n                    ]\n                },\n\n                testConfig: {\n                    files: [\n                        { src: \"./tools/config/test-config.json\", dest: `./tools/config/browser/es5/ai_test.config${configVer}.cfg.json` },\n                        { src: \"./tools/config/test-config.json\", dest: `./tools/config/browser/es5/ai_test.config${configMajorVer}.cfg.json` }\n                    ]\n                }\n            }\n        }));\n\n        // Additional setup for lint-fix task\n        function getLintFixTasks() {\n            let packages = [\n                \"core\", \"common\", \"appinsights\", \"aisku\", \"aiskulite\", \"perfmarkmeasure\", \"properties\",\n                \"cfgsync\", \"deps\", \"debugplugin\", \"aichannel\", \"offlinechannel\", \"teechannel\", \n                \"1dsCore\", \"1dsPost\", \"rollupuglify\", \"rollupes5\", \"shims\", \"chrome-debug-extension\", \n                \"applicationinsights-web-snippet\", \"clickanalytics\", \"osplugin\"\n            ];\n            \n            let tasks = [];\n            packages.forEach(function(pkg) {\n                tasks.push(\"eslint-ts:\" + pkg + \"-lint-fix\");\n            });\n            \n            return tasks;\n        }\n    \n        grunt.event.on('qunit.testStart', function (name) {\n            grunt.log.ok('Running test: ' + name);\n        });\n    \n        grunt.loadNpmTasks(\"@nevware21/grunt-ts-plugin\");\n        grunt.loadNpmTasks(\"@nevware21/grunt-eslint-ts\");\n        grunt.loadNpmTasks('grunt-contrib-uglify');\n        grunt.loadNpmTasks('grunt-contrib-connect');\n        grunt.loadNpmTasks('grunt-contrib-copy');\n    \n        grunt.loadTasks('./tools/grunt-tasks');\n        \n        grunt.registerTask(\"default\", [\"ts:rollupuglify\", \"ts:rollupes5\", \"ts:rollupes5test\", \"qunit:rollupes5\", \"ts:shims\", \"ts:shimstest\", \"qunit:shims\", \"ts:default\", \"uglify:ai\", \"uglify:snippet\"]);\n\n        grunt.registerTask(\"core\", tsBuildActions(\"core\", true));\n        grunt.registerTask(\"core-min\", minTasks(\"core\"));\n        grunt.registerTask(\"core-restore\", restoreTasks(\"core\"));\n        grunt.registerTask(\"coreunittest\", tsTestActions(\"core\"));\n        grunt.registerTask(\"core-mintest\", tsTestActions(\"core\", true));\n        grunt.registerTask(\"coreperftest\", [\"connect\", \"ts:core-perftest\", \"qunit:core-perf\"]);\n\n        grunt.registerTask(\"common\", tsBuildActions(\"common\"));\n        grunt.registerTask(\"common-min\", minTasks(\"common\"));\n        grunt.registerTask(\"common-restore\", restoreTasks(\"common\"));\n        grunt.registerTask(\"commontest\", []);\n        grunt.registerTask(\"common-mintest\", []);\n\n        grunt.registerTask(\"ai\", tsBuildActions(\"appinsights\"));\n        grunt.registerTask(\"ai-min\", minTasks(\"appinsights\"));\n        grunt.registerTask(\"ai-restore\", restoreTasks(\"appinsights\"));\n        grunt.registerTask(\"aitests\", tsTestActions(\"appinsights\"));\n        grunt.registerTask(\"ai-mintests\", tsTestActions(\"appinsights\", true));\n\n        grunt.registerTask(\"aisku\", tsBuildActions(\"aisku\"));\n        grunt.registerTask(\"aisku-min\", minTasks(\"aisku\"));\n        grunt.registerTask(\"aisku-restore\", restoreTasks(\"aisku\"));\n        grunt.registerTask(\"aiskuunittests\", tsTestActions(\"aisku\"));\n        grunt.registerTask(\"aisku-mintests\", tsTestActions(\"aisku\", true));\n        grunt.registerTask(\"aiskuperf\", [\"connect\", \"ts:aisku-perftest\", \"qunit:aisku-perf\"]);\n\n        grunt.registerTask(\"aiskulite\", tsBuildActions(\"aiskulite\"));\n        grunt.registerTask(\"aiskulite-min\", minTasks(\"aiskulite\"));\n        grunt.registerTask(\"aiskulite-restore\", restoreTasks(\"aiskulite\"));\n        grunt.registerTask(\"aiskuliteunittests\", tsTestActions(\"aiskulite\"));\n        grunt.registerTask(\"aiskulite-mintests\", tsTestActions(\"aiskulite\", true));\n\n        grunt.registerTask(\"snippetvnext\", [\"uglify:snippetvNext\"]);\n\n        grunt.registerTask(\"test\", [\"connect\", \"ts:default\", \"ts:test\", \"ts:testSchema\", \"ts:testE2E\", \"qunit:all\"]);\n        grunt.registerTask(\"test1ds\", [\"coretest\", \"common\", \"propertiestests\", \"depstest\", \"aitests\", \"aiskutests\"]);\n\n        grunt.registerTask(\"perfmarkmeasure\", tsBuildActions(\"perfmarkmeasure\"));\n        grunt.registerTask(\"perfmarkmeasure-min\", minTasks(\"perfmarkmeasure\"));\n        grunt.registerTask(\"perfmarkmeasure-restore\", restoreTasks(\"perfmarkmeasure\"));\n        grunt.registerTask(\"perfmarkmeasuretests\", tsTestActions(\"perfmarkmeasure\"));\n        grunt.registerTask(\"perfmarkmeasure-mintests\", tsTestActions(\"perfmarkmeasure\", true));\n\n        grunt.registerTask(\"properties\", tsBuildActions(\"properties\"));\n        grunt.registerTask(\"properties-min\", minTasks(\"properties\"));\n        grunt.registerTask(\"properties-restore\", restoreTasks(\"properties\"));\n        grunt.registerTask(\"propertiestests\", tsTestActions(\"properties\"));\n        grunt.registerTask(\"properties-mintests\", tsTestActions(\"properties\", true));\n\n        grunt.registerTask(\"cfgsync\", tsBuildActions(\"cfgsync\"));\n        grunt.registerTask(\"cfgsync-min\", minTasks(\"cfgsync\"));\n        grunt.registerTask(\"cfgsync-restore\", restoreTasks(\"cfgsync\"));\n        grunt.registerTask(\"cfgsynctests\", tsTestActions(\"cfgsync\"));\n        grunt.registerTask(\"cfgsync-mintests\", tsTestActions(\"cfgsync\", true));\n\n        grunt.registerTask(\"deps\", tsBuildActions(\"deps\"));\n        grunt.registerTask(\"deps-min\", minTasks(\"deps\"));\n        grunt.registerTask(\"deps-restore\", restoreTasks(\"deps\"));\n        grunt.registerTask(\"depstest\", tsTestActions(\"deps\"));\n        grunt.registerTask(\"deps-mintest\", tsTestActions(\"deps\", true));\n\n        grunt.registerTask(\"debugplugin\", tsBuildActions(\"debugplugin\"));\n        grunt.registerTask(\"debugplugin-min\", minTasks(\"debugplugin\"));\n        grunt.registerTask(\"debugplugin-restore\", restoreTasks(\"debugplugin\"));\n\n        grunt.registerTask(\"aichannel\", tsBuildActions(\"aichannel\"));\n        grunt.registerTask(\"aichannel-min\", minTasks(\"aichannel\"));\n        grunt.registerTask(\"aichannel-restore\", restoreTasks(\"aichannel\"));\n        grunt.registerTask(\"aichanneltest\", tsTestActions(\"aichannel\"));\n        grunt.registerTask(\"aichannel-mintest\", tsTestActions(\"aichannel\", true));\n\n        grunt.registerTask(\"offlinechannel\", tsBuildActions(\"offlinechannel\"));\n        grunt.registerTask(\"offlinechannel-min\", minTasks(\"offlinechannel\"));\n        grunt.registerTask(\"offlinechannel-restore\", restoreTasks(\"offlinechannel\"));\n        grunt.registerTask(\"offlinechanneltest\", tsTestActions(\"offlinechannel\"));\n        grunt.registerTask(\"offlinechannel-mintest\", tsTestActions(\"offlinechannel\", true));\n\n        grunt.registerTask(\"teechannel\", tsBuildActions(\"teechannel\"));\n        grunt.registerTask(\"teechannel-min\", minTasks(\"teechannel\"));\n        grunt.registerTask(\"teechannel-restore\", restoreTasks(\"teechannel\"));\n        grunt.registerTask(\"teechanneltest\", tsTestActions(\"teechannel\"));\n        grunt.registerTask(\"teechannel-mintest\", tsTestActions(\"teechannel\", true));\n\n        grunt.registerTask(\"rollupuglify\", tsBuildActions(\"rollupuglify\"));\n        grunt.registerTask(\"rollupes5\", tsBuildActions(\"rollupes5\"));\n        grunt.registerTask(\"rollupes5test\", tsTestActions(\"rollupes5\", false));\n\n        grunt.registerTask(\"shims\", tsBuildActions(\"shims\").concat(tsTestActions(\"shims\", false)));\n        grunt.registerTask(\"shimstest\", tsTestActions(\"shims\", false));\n\n        grunt.registerTask(\"chromedebugextension\", tsBuildActions(\"chrome-debug-extension\"));\n        grunt.registerTask(\"chromedebugextension-min\", minTasks(\"chrome-debug-extension\"));\n        grunt.registerTask(\"chromedebugextension-restore\", restoreTasks(\"chrome-debug-extension\"));\n\n        grunt.registerTask(\"websnippet\", tsBuildActions(\"applicationinsights-web-snippet\"));\n        grunt.registerTask(\"snippetCopy\", [\"copy:snippetToDistEs5\"]);\n        grunt.registerTask(\"originSnippetCopy\", [\"copy:originSnippet\"]);\n        grunt.registerTask(\"websnippetReplace\", [\"string-replace:generate-expanded-JS\", \"copy:web-snippet\", \"string-replace:generate-expanded-min\", \"string-replace:generate-snippet-ikey\", \"string-replace:generate-snippet-connString\", \"string-replace:generate-snippet-origin\"]);\n\n        grunt.registerTask(\"snippet-restore\", restoreTasks(\"applicationinsights-web-snippet\"));\n        grunt.registerTask(\"websnippettests\", tsTestActions(\"applicationinsights-web-snippet\"));\n\n        grunt.registerTask(\"clickanalytics\", tsBuildActions(\"clickanalytics\"));\n        grunt.registerTask(\"clickanalytics-min\", minTasks(\"clickanalytics\"));\n        grunt.registerTask(\"clickanalytics-restore\", restoreTasks(\"clickanalytics\"));\n        grunt.registerTask(\"clickanalyticstests\", tsTestActions(\"clickanalytics\"));\n        grunt.registerTask(\"clickanalytics-mintests\", tsTestActions(\"clickanalytics\", true));\n\n        grunt.registerTask(\"osplugin\", tsBuildActions(\"osplugin\"));\n        grunt.registerTask(\"osplugin-min\", minTasks(\"osplugin\"));\n        grunt.registerTask(\"osplugin-restore\", restoreTasks(\"osplugin\"));\n        grunt.registerTask(\"osplugintests\", tsTestActions(\"osplugin\"));\n        grunt.registerTask(\"osplugin-mintests\", tsTestActions(\"osplugin\", true));\n\n        grunt.registerTask(\"1dsCoreBuild\", tsBuildActions(\"1dsCore\"));\n        grunt.registerTask(\"1dsCoreTest\", tsTestActions(\"1dsCore\"));\n        grunt.registerTask(\"1dsCore\", tsTestActions(\"1dsCore\", true));\n        grunt.registerTask(\"1dsCore-min\", minTasks(\"1dsCore\"));\n        grunt.registerTask(\"1dsCore-restore\", restoreTasks(\"1dsCore\"));\n        \n        grunt.registerTask(\"1dsPostBuild\", tsBuildActions(\"1dsPost\"));\n        grunt.registerTask(\"1dsPostTest\", tsTestActions(\"1dsPost\"));\n        grunt.registerTask(\"1dsPostMinTest\", tsTestActions(\"1dsPost\", true));\n        grunt.registerTask(\"1dsPost-min\", minTasks(\"1dsPost\"));\n        grunt.registerTask(\"1dsPost-restore\", restoreTasks(\"1dsPost\"));\n\n        grunt.registerTask(\"example-shared-worker\", tsBuildActions(\"example-shared-worker\"));\n        grunt.registerTask(\"example-shared-worker-test\", tsTestActions(\"example-shared-worker\"));\n\n        grunt.registerTask(\"tst-framework\", tsBuildActions(\"tst-framework\"));\n        grunt.registerTask(\"serve\", [\"connect:server:keepalive\"]);\n\n         grunt.registerTask(\"copy-config\", [\"copy:config\"]);\n         grunt.registerTask(\"copy-testConfig\", [\"copy:testConfig\"]);\n\n         grunt.registerTask(\"example-aisku\", tsBuildActions(\"example-aisku\"));\n         grunt.registerTask(\"example-dependency\", tsBuildActions(\"example-dependency\"));\n         grunt.registerTask(\"example-cfgsync\", tsBuildActions(\"example-cfgsync\"));\n         grunt.registerTask(\"example-startspan\", tsBuildActions(\"example-startspan\"));\n\n        // Register the lint-fix task to run ESLint fix on all packages\n        grunt.registerTask(\"lint-fix\", getLintFixTasks());\n     } catch (e) {\n         console.error(e);\n         console.error(\"stack: '\" + e.stack + \"', message: '\" + e.message + \"', name: '\" + e.name + \"'\");\n     }\n };\n "
  },
  {
    "path": "legacy/README.md",
    "content": "﻿# v1.x.x (DEPRECATED)\n\n## Microsoft Application Insights JavaScript SDK\n\nThe Legacy (v1) code has been removed from the active development branch and effectively archived in the [legacy-v1](https://github.com/microsoft/ApplicationInsights-JS/tree/legacy-v1).\n\nNo further changes are scheduled or expected, if required any isolated changes will only occur on that branch.\n\nYou are __STRONGLY__ encouraged to upgrade to the current latest version of the SDK as defined on the main [GitHub Home Page for this project](https://github.com/microsoft/ApplicationInsights-JS)\n\n## Upgrading from the old Version of Application Insights\n\nBreaking changes in the SDK V2 version:\n- To allow for better API signatures, some of the apis such as trackPageView, trackException have been updated.\n- ES3 (IE8) compatibility, while running in IE8 or lower versions of the browser is not an officially supported scenario we are working to maintain ES3 level compatibility to ensure that the SDK will not cause any unexpected failures due to Javascript parsing error. See [ES3/IE8 Compatibility](https://github.com/microsoft/ApplicationInsights-JS#es3ie8-compatibility) below for further information.\n- Telemetry envelope has field name and structure changes due to data schema updates.\n- Moved `context.operation` to `context.telemetryTrace`. Some fields were also changed (`operation.id` --> `telemetryTrace.traceID`)\n  - If you want to maunally refresh the current pageview id (e.g. in SPA apps) this can be done with `appInsights.context.telemetryTrace.traceID = Util.newId()`\n\nIf you are using the current application insights PRODUCTION SDK (1.0.20) and want to see if the new SDK works in runtime, please update URL depending on your current SDK loading scenario:\n\n**a)** Download via CDN scenario:\n    Update code snippet that you currently use to point to the following URL:\n    ```\n    \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\"\n    ```\n\n**b)** NPM scenario:\n    Call downloadAndSetup to download full ApplicationInsights script from CDN and initialize it with instrumentation key.\n\n```ts\nappInsights.downloadAndSetup({\n    instrumentationKey: \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx\",\n    url: \"https://js.monitor.azure.com/scripts/b/ai.2.min.js\"\n});\n```\n\nTest in internal environment to verify monitoring telemetry is working as expected. If all works, please update your api signatures appropriately to SDK V2 version and deploy in your production environments.\n\n### Links\n\n- [Version 1.x.x Readme](https://github.com/microsoft/ApplicationInsights-JS/tree/legacy-v1/README.md)\n- [Version 1.x.x (Legacy) Branch](https://github.com/microsoft/ApplicationInsights-JS/tree/legacy-v1)\n\n### Where is the code for the previous version\n\nPlease see the [legacy-v1 branch to review all previous code and documentation](https://github.com/microsoft/ApplicationInsights-JS/tree/legacy-v1)\n\n"
  },
  {
    "path": "nuget/Microsoft.ApplicationInsights.JavaScript.Snippet.nuspec",
    "content": "﻿<?xml version=\"1.0\"?>\n<package >\n  <metadata>\n    <id>Microsoft.ApplicationInsights.JavaScript.Snippet</id>\n    <version>1.0.0</version>\n    <title>Application Insights Snippet for JavaScript Applications</title>\n    <authors>Microsoft</authors>\n    <owners>Microsoft</owners>\n    <language>en-us</language>\n    <licenseUrl>http://go.microsoft.com/fwlink/?LinkID=510709</licenseUrl>\n    <projectUrl>http://go.microsoft.com/fwlink/?LinkId=392727</projectUrl>\n     <icon>images\\icon.png</icon>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <summary>Application Insights Snippet for JavaScript Applications</summary>\n    <description>Application Insights Snippet for JavaScript Applications, more infor about snipept available in https://github.com/microsoft/ApplicationInsights-JS</description>\n    <tags>Analytics Azure ApplicationInsights Telemetry Monitoring SDK</tags>\n    <copyright>© Microsoft Corporation. All rights reserved.</copyright>\n  </metadata>\n  <files>\n    <file src=\"..\\AISKU\\snippet\\snippet.min.js\" target=\"content\\scripts\\ai-snippet.min.js\"/>\n    <file src=\"icon.png\" target=\"images\" />\n  </files>\n</package>"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-web\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK\",\n    \"version\": \"3.4.1\",\n    \"keywords\": [\n        \"browser performance monitoring\",\n        \"script errors\",\n        \"application insights\",\n        \"microsoft\",\n        \"azure\"\n    ],\n    \"scripts\": {\n        \"postinstall\": \"node common/scripts/install-run-rush-silent.js update\",\n        \"build\": \"node common/scripts/install-run-rush.js rebuild --verbose\",\n        \"rebuild\": \"npm run build && npm run api-docs\",\n        \"testx\": \"rush test --verbose\",\n        \"test\": \"node common/scripts/install-run-rush.js test --verbose\",\n        \"mintest\": \"node common/scripts/install-run-rush.js mintest --verbose\",\n        \"lint\": \"node common/scripts/install-run-rush.js lint --verbose\",\n        \"lint-fix\": \"npm run ai-restore && grunt lint-fix\",\n        \"perftest\": \"node common/scripts/install-run-rush.js perftest --verbose\",\n        \"rollupes5\": \"grunt rollupes5\",\n        \"rupdate\": \"node common/scripts/install-run-rush.js update --recheck --purge --full\",\n        \"serve\": \"grunt serve\",\n        \"setVersion\": \"node ./tools/release-tools/setVersion.js\",\n        \"purge\": \"node common/scripts/install-run-rush.js purge\",\n        \"rushClean\": \"node common/scripts/install-run-rush.js clean\",\n        \"fullClean\": \"npm run rushClean && git clean -xdf && npm install && rush update --recheck --full\",\n        \"fullCleanBuild\": \"npm run fullClean && npm run rebuild\",\n        \"ai-min\": \"node common/scripts/install-run-rush.js ai-min\",\n        \"ai-restore\": \"node common/scripts/install-run-rush.js ai-restore\",\n        \"npm-pack\": \"node common/scripts/install-run-rush.js npm-pack --verbose\",\n        \"npm-package\": \"node ./tools/release-tools/npm_package.js\",\n        \"npm-publish\": \"node ./tools/release-tools/npm_publish.js\",\n        \"npm-set-latest\": \"node ./tools/release-tools/npm_set_latest.js\",\n        \"gh-status\": \"node ./tools/status-tools/github-status.js\",\n        \"api-docs\": \"rush api-docs\",\n        \"imgsizegen\": \"node ./tools/sizeImageGenerator/size-image-generator.js\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/microsoft/ApplicationInsights-JS.git\"\n    },\n    \"author\": \"Microsoft Application Insights Team\",\n    \"license\": \"MIT\",\n    \"bugs\": {\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/issues\"\n    },\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"devDependencies\": {\n        \"@microsoft/rush\": \"5.172.1\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@typescript-eslint/eslint-plugin\": \"^7.14.1\",\n        \"@typescript-eslint/parser\": \"^7.14.1\",\n        \"archiver\": \"^5.3.0\",\n        \"connect\": \"^3.7.0\",\n        \"eslint\": \"^8.56.0\",\n        \"eslint-plugin-security\": \"^1.5.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"grunt-contrib-connect\": \"^5.0.0\",\n        \"grunt-contrib-copy\": \"^1.0.0\",\n        \"grunt-contrib-uglify\": \"^5.2.1\",\n        \"eventemitter2\": \"6.4.9\",\n        \"puppeteer\": \"^24.40.0\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\",\n        \"whatwg-fetch\": \"^3.6.2\",\n        \"@types/node\": \"18.19.121\"\n    },\n    \"overrides\": {\n        \"basic-ftp\": \">=5.2.0\",\n        \"form-data\": \"^2.5.5\",\n        \"tar\": \"^7.5.13\",\n        \"glob\": \"^7.2.3\",\n        \"lodash\": \"^4.18.1\",\n        \"minimatch\": \"^3.1.4\"\n    }\n}\n"
  },
  {
    "path": "policheck-exclusions.xml",
    "content": "<PoliCheckExclusions>\n  <!-- All strings must be UPPER CASE -->\n  <!--Each of these exclusions is a folder name -if \\[name]\\exists in the file path, it will be skipped -->\n  <Exclusion Type=\"FolderPathFull\">COMMON\\CONFIG\\RUSH|AISKU\\DIST-HISTORY|AISKULIGHT\\DIST-HISTORY</Exclusion>\n  <!--Each of these exclusions is a folder name -if any folder or file starts with \"\\[name]\", it will be skipped -->\n  <Exclusion Type=\"FolderPathStart\">.GIT</Exclusion>\n  <!--Each of these file types will be completely skipped for the entire scan -->\n  <!--<Exclusion Type=\"FileType\">.ABC|.XYZ</Exclusion>-->\n  <!--The specified file names will be skipped during the scan regardless which folder they are in -->\n  <!--<Exclusion Type=\"FileName\">ABC.TXT|XYZ.CS</Exclusion>-->\n</PoliCheckExclusions>"
  },
  {
    "path": "rollup.base.config.js",
    "content": "import { nodeResolve } from \"@rollup/plugin-node-resolve\";\nimport commonjs from \"@rollup/plugin-commonjs\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport cleanup from \"rollup-plugin-cleanup\";\nimport sourcemaps from 'rollup-plugin-sourcemaps';\nimport dynamicRemove from \"@microsoft/dynamicproto-js/tools/rollup\";\nimport { es5Poly, es5Check, importCheck } from \"@microsoft/applicationinsights-rollup-es5\";\nimport { resolve } from 'path';\nimport { readFileSync } from \"fs\";\n\nconst rootVersion = require(\"./package.json\").version;\n\nconst treeshakeCfg = {\n    // preset: \"smallest\",\n    moduleSideEffects: false,\n    propertyReadSideEffects: false,\n    tryCatchDeoptimization: false,\n    correctVarValueBeforeDeclaration: false\n};\n\nfunction doCleanup() {\n  return cleanup({\n    comments: [\n      'some', \n      /^.\\s*@DynamicProtoStub/i,\n      /^\\*\\*\\s*@class\\s*$/,\n      /[#@]__/\n    ]\n  })\n}\n\nconst getNamespace = (prefix, namespaces, baseName, rootName) => {\n    var result = prefix + \"var \" + baseName + \"=\" + rootName;\n    if (namespaces.length > 0) {\n        for (let lp = 0; lp < namespaces.length; lp++) {\n            if (lp === 0) {\n                result += \", \";\n            } else {\n                result += \";\\n\" + prefix;\n            }\n            result += \"nsKey=\\\"\" + namespaces[lp] + \"\\\", \";\n            result += baseName + \"=\" + baseName + \"[nsKey]=(\" + baseName + \"[nsKey]||{})\";\n        }\n    }\n\n    return result + \";\\n\";\n}\n\nconst getCommonNamespace = (browserNs, gblNs) => {\n    var brTokens = browserNs.split(\".\");\n    var gblTokens = gblNs.split(\".\");\n    let common = [];\n    let idx = 0;\n    while (brTokens.length > idx && gblTokens.length > idx && brTokens[idx] === gblTokens[idx]) {\n        common.push(brTokens[idx]);\n        idx++;\n    }\n\n    return {\n        common: common,\n        browser: brTokens.slice(idx),\n        gbl: gblTokens.slice(idx)\n    };\n};\n\nconst getIntro = (format, theNameSpace, moduleName, theVersion, useStrict) => {\n    let theIntro = \"\";\n    if (format === \"iife\" || format === \"umd\") {\n        let nsTokens = getCommonNamespace(theNameSpace.browser, theNameSpace.gbl);\n        theIntro += \"(function (global, factory) {\\n\";\n        let prefix = \"    \";\n        theIntro += prefix + \"var undef = \\\"undefined\\\";\\n\";\n        if (format === \"umd\") {\n            // UMD supports loading via requirejs and \n            theIntro += prefix + \"typeof exports === \\\"object\\\" && typeof module !== undef ? factory(exports) :\\n\";\n            theIntro += prefix + \"typeof define === \\\"function\\\" && define.amd ? define([\\\"exports\\\"], factory) :\\n\";\n            theIntro += prefix + \"(function(global){\\n\";\n            prefix += \"    \";\n        }\n        // Both IIFE and UMD\n        theIntro += prefix + \"var nsKey, key, nm, theExports = {}, modName = \\\"\" + moduleName.replace(/[\\.\"\\\\\\/\\-]/g, \"_\") + \"\\\", msMod=\\\"__ms$mod__\\\";\\n\";\n        theIntro += prefix + \"var mods={}, modDetail=mods[modName]={}, ver=\\\"\" + theVersion + \"\\\";\\n\";\n        let baseNs = \"global\";\n        if (nsTokens.common.length > 0) {\n            theIntro += getNamespace(prefix, nsTokens.common, \"baseNs\", baseNs);\n            baseNs = \"baseNs\";\n        }\n        theIntro += prefix + \"// Versioned namespace \\\"\" + theNameSpace.browser + \"\\\"\\n\";\n        theIntro += getNamespace(prefix, nsTokens.browser, \"exportNs\", baseNs);\n        theIntro += prefix + \"// Global namespace \\\"\" + theNameSpace.gbl + \"\\\"\\n\";\n        theIntro += getNamespace(prefix, nsTokens.gbl, \"destNs\", baseNs);\n        theIntro += prefix + \"var expNsDetail=(exportNs[msMod]=(exportNs[msMod] || {})), expNameVer=(expNsDetail[\\\"v\\\"]=(expNsDetail[\\\"v\\\"] || []));\\n\";\n        theIntro += prefix + \"var destNsDetail=(destNs[msMod]=(destNs[msMod] || {})), destNameVer=(destNsDetail[\\\"v\\\"]=(destNsDetail[\\\"v\\\"] || []));\\n\";\n        theIntro += prefix + \"(destNsDetail[\\\"o\\\"]=(destNsDetail[\\\"o\\\"] || [])).push(mods);\\n\";\n        theIntro += prefix + \"factory(theExports);\\n\";\n        theIntro += prefix + \"for(var key in theExports) {\\n\";\n        theIntro += prefix + \"    // Always set the imported value into the \\\"export\\\" versioned namespace (last-write wins)\\n\";\n        theIntro += prefix + \"    nm=\\\"x\\\", exportNs[key]=theExports[key], expNameVer[key]=ver;\\n\";\n        theIntro += prefix + \"    // Copy over any named element that is not already present (first-write wins)\\n\";\n        theIntro += prefix + \"    typeof destNs[key]===undef ? (nm=\\\"n\\\", destNs[key]=theExports[key]) && (destNameVer[key]=ver) : !destNameVer[key] && (destNameVer[key]=\\\"---\\\");\\n\";\n        theIntro += prefix + \"    (modDetail[nm] = (modDetail[nm] || [])).push(key);\\n\";\n        theIntro += prefix + \"}\\n\";\n        \n        if (format === \"umd\") {\n            theIntro += \"    })(typeof globalThis !== undef ? globalThis : global || self);\\n\";\n        }\n\n        theIntro += \"})(this, (function (exports) {\\n\";\n    }\n\n    if (useStrict) {\n        theIntro += \"'use strict';\\n\";\n    }\n\n    console.log(\"Intro: [\" + theIntro + \"]\");\n\n    return theIntro;\n};\n\nconst getOutro = (format, theNameSpace, moduleName, version) => {\n    let theOutro = \"\";\n    if (format === \"umd\" || format === \"iife\") {\n        theOutro = \"}));\\n\";\n    }\n\n    return theOutro;\n}\n\nlet rNodeModule = /(.*[\\\\\\/]node_modules[\\\\\\/])((@\\w+[\\\\\\/]){0,1}([^\\\\\\/]+))(.*)$/;\nlet tLocalPackage = /^((\\.\\.\\/)+)(\\w+\\/\\w+)(\\/.*\\.ts)$/;\nlet packageVerCache = { };\n\nfunction getPackageVer(source) {\n    let grps = rNodeModule.exec(source);\n    if (grps && grps.length > 5) {\n        if (!packageVerCache[grps[2]]) {\n            let pkg = readFileSync(grps[1] + grps[2] + \"/package.json\");\n            if (pkg) {\n                let ver = JSON.parse(pkg).version;\n\n                packageVerCache[grps[2]] = {\n                    name: grps[2],\n                    ver: ver,\n                    src: source,\n                    path: grps[5]\n                };\n            }\n        }\n\n        return packageVerCache[grps[2]];\n    }\n\n    return null;\n}\n\nfunction getLocalPackageVer(source, absPath) {\n    let grps = tLocalPackage.exec(source);\n    if (grps && grps.length > 4) {\n        if (!packageVerCache[\"local:\" + grps[3]]) {\n            let idx = absPath.indexOf(grps[3] + \"/\");\n            if (idx != -1) {\n                let basePath = absPath.substring(0, idx + grps[3].length);\n                let pkg = readFileSync(basePath + \"/package.json\");\n                if (pkg) {\n                    let ver = JSON.parse(pkg).version;\n\n                    packageVerCache[\"local:\" + grps[3]] = {\n                        name: grps[3],\n                        ver: ver,\n                        src: source,\n                        path: grps[4]\n                    };\n                }\n            }\n        }\n\n        return packageVerCache[\"local:\" + grps[3]];\n    }\n\n    return null;\n}\n\nconst NODE_MODULES_SRC = {\n    //\"@nevware21/ts-async\": \"https://raw.githubusercontent.com/nevware21/ts-async/refs/tags/{version}{path}\",\n    \"@microsoft/dynamicproto-js\": \"https://raw.githubusercontent.com/microsoft/dynamicproto-js/refs/tags/{version}/lib{path}\",\n    \"tools/shims\": \"https://raw.githubusercontent.com/microsoft/ApplicationInsights-JS/refs/tags/{rootVersion}/tools/shims{path}\"\n};\n\n/**\n * Creates a source map path transformer function.\n * \n * @param distPath - The distribution path to be used in the transformation.\n * @param theNameSpace - The namespace for the source map paths.\n * @param isDebug - If true, enables debug logging for the transformation process.\n * @returns A function that transforms source map paths.\n */\nfunction getSourceMapPathTransformer(distPath, theNameSpace, isDebug) {\n    let rDistPath = /(.*[\\\\\\/](dist|browser)(.es\\d)?)([\\\\\\/].*)$/;\n\n    let lastIdx = (theNameSpace.replace(/\\\\/g, \"/\")).lastIndexOf(\"/\");\n    if (lastIdx != -1 && lastIdx !== theNameSpace.length - 1) {\n        // Strip off any leading path separators (snippet)\n        theNameSpace = theNameSpace.substring(0, lastIdx);\n    }\n\n    return (sourcePath) => {\n        let normalizedPath = sourcePath.replace(/\\\\/g, \"/\");\n        if (isDebug) {\n            console.log(`NormalizedPath: ${normalizedPath}, distPath: ${distPath}, ns: ${theNameSpace}, dirname: ${__dirname}`);\n        }\n\n        // The resolved path that we will return as the \"node\" path\n        let resolvedPath = null;\n\n        let httpIdx = normalizedPath.indexOf(\"https:/\");\n        if (httpIdx != -1) {\n            // Just reuse any https:// path as-is\n            resolvedPath = \"https://\" + normalizedPath.substring(httpIdx + 7);\n        }\n\n        // const absoluteSourcePath = resolve(distPath, sourcePath).replace(/\\\\/g, \"/\");\n        const absPath = resolve(distPath, normalizedPath).replace(/\\\\/g, \"/\");\n        if (!resolvedPath) {\n            if (isDebug) {\n                console.log(` -- Absolute: ${absPath}`);\n            }\n\n            let idx = absPath.indexOf(\"node_modules\");\n            if (idx != -1) {\n                if (isDebug) {\n                    console.log(` -- NodeModule: ${absPath}`);\n                }\n\n                let ver = getPackageVer(absPath);\n                if (ver) {\n                    if (isDebug) {\n                        console.log(` -- PackageVer: ${ver.name}@${ver.ver}`);\n                    }\n\n                    let src = NODE_MODULES_SRC[ver.name];\n                    if (src) {\n                        resolvedPath = src.replace(\"{rootVersion}\", rootVersion).replace(\"{version}\", ver.ver).replace(\"{path}\", ver.path);\n                    }\n\n                    if (!resolvedPath) {\n                        resolvedPath = \"node_modules/\" + ver.name + \"@\" + ver.ver + ver.path;\n                    }\n                }\n            }\n        }\n\n        if (!resolvedPath) {\n            let localVer = getLocalPackageVer(normalizedPath, absPath);\n            if (localVer) {\n                let src = NODE_MODULES_SRC[localVer.name];\n                if (src) {\n                    resolvedPath = src.replace(\"{rootVersion}\", rootVersion).replace(\"{version}\", localVer.ver).replace(\"{path}\", localVer.path);\n                }\n            }\n        }\n\n        if (!resolvedPath && normalizedPath.startsWith(\"../\")) {\n            // Just remove all leading relative path indicators\n            resolvedPath = theNameSpace + normalizedPath.replace(/\\.\\.\\//g, \"/\").replace(/\\/\\//g, \"/\");\n\n        }\n\n        if (!resolvedPath) {\n            let distGrps = rDistPath.exec(absPath);\n            if (distGrps && distGrps.length > 4) {\n                resolvedPath = theNameSpace + distGrps[4];\n            }\n        }\n\n        if (!resolvedPath) {\n            resolvedPath = theNameSpace + \"/\" + absPath;\n        }\n\n        // Cleanup the path\n        resolvedPath = resolvedPath.replace(/\\.\\.\\//g, \"oo/\").replace(/([^:])\\/\\//g, \"$1/\");\n\n        if (!resolvedPath) {\n            // Just leave the original path as-is for now.\n            resolvedPath = sourcePath;\n        }\n\n        if (isDebug) {\n            console.log(` -- resolvedPath: ${resolvedPath}`);\n        }\n        \n        return resolvedPath;\n    };\n}\n\nconst browserRollupConfigFactory = (isOneDs, banner, importCheckNames, targetType, theNameSpace, entryInputName, outputName, theVersion, libVersion, isProduction, format = 'umd', postfix = '', teamExt = '', useStrict = true, topLevel = false) => {\n    var outPath = isOneDs ? \"bundle\" : \"browser\";\n    var thePostfix = `${postfix}`;\n    if (libVersion) {\n        thePostfix = `${isOneDs ? \"-\" : \".\"}${libVersion}${postfix}`; \n    }\n\n    var outputPath = `${outPath}/${targetType}/${outputName}${teamExt}${thePostfix}.js`;\n    var prodOutputPath = `${outPath}/${targetType}/${outputName}${teamExt}${thePostfix}.min.js`;\n    var inputPath = `${entryInputName}.js`;\n    var rootNamespace = outputName + (theVersion ? (\"@\" + theVersion) : \"\");\n\n    const browserRollupConfig = {\n        input: inputPath,\n        output: {\n            file: outputPath,\n            banner: banner,\n            format: \"cjs\",\n            name: theNameSpace.browser,\n            extend: true,\n            freeze: false,\n            sourcemap: true,\n            sourcemapPathTransform: getSourceMapPathTransformer(`${outPath}/${targetType}`, rootNamespace),\n            strict: false,\n            intro: getIntro(format, theNameSpace, theNameSpace.ver ? `${targetType}.${outputName}${teamExt}-${theNameSpace.ver}` : \"\", theNameSpace.ver, useStrict),\n            outro: getOutro(format, theNameSpace, theNameSpace.ver ? `${targetType}.${outputName}${teamExt}-${theNameSpace.ver}` : \"\", theNameSpace.ver)\n        },\n        treeshake: treeshakeCfg,\n        plugins: [\n            sourcemaps(),\n            dynamicRemove(),\n            replace({\n                preventAssignment: true\n            }),\n            importCheck({ exclude: importCheckNames }),\n            nodeResolve({\n                module: true,\n                browser: true,\n                preferBuiltins: false\n            }),\n            commonjs(),\n            doCleanup(),\n            es5Poly(),\n            es5Check()\n        ]\n    };\n\n    if (isProduction) {\n        browserRollupConfig.output.file = prodOutputPath;\n        browserRollupConfig.plugins.push(\n            uglify({\n                ie8: false,\n                ie: true,\n                toplevel: topLevel,\n                compress: {\n                    ie: true,\n                    passes:3,\n                    unsafe: true\n                },\n                output: {\n                    ie: true,\n                    preamble: banner,\n                    webkit:true\n                }\n            })\n        );\n    }\n\n    // console.log(`Browser: ${JSON.stringify(browserRollupConfig)}`);\n\n    return browserRollupConfig;\n};\n\nconst nodeUmdRollupConfigFactory = (banner, importCheckNames, targetType, theNameSpace, theVersion, entryInputName, outputName, isProduction, topLevel = false) => {\n\n    // console.log(`Node: ${targetType}, ${entryInputName}`);\n    var outputPath = `dist/${targetType}/${outputName}.js`;\n    var prodOutputPath = `dist/${targetType}/${outputName}.min.js`;\n    var inputPath = `${entryInputName}.js`;\n    var rootNamespace = outputName + \"@\" + theVersion;\n\n    const nodeRollupConfig = {\n        input: inputPath,\n        output: {\n            file: outputPath,\n            banner: banner,\n            format: \"umd\",\n            name: theNameSpace,\n            extend: true,\n            freeze: false,\n            sourcemap: true,\n            sourcemapPathTransform: getSourceMapPathTransformer(`dist/${targetType}`, rootNamespace),\n        },\n        treeshake: treeshakeCfg,\n        plugins: [\n            sourcemaps(),\n            dynamicRemove(),\n            replace({\n                preventAssignment: true\n            }),\n            importCheck({ exclude: importCheckNames }),\n            nodeResolve(),\n            doCleanup(),\n            es5Poly(),\n            es5Check()\n        ]\n    };\n\n    if (isProduction) {\n        nodeRollupConfig.output.file = prodOutputPath;\n        nodeRollupConfig.plugins.push(\n            uglify({\n                ie8: false,\n                ie: true,\n                toplevel: topLevel,\n                compress: {\n                    ie: true,\n                    passes:3,\n                    unsafe: true\n                },\n                output: {\n                    ie: true,\n                    preamble: banner,\n                    webkit:true\n                }\n            })\n        );\n    }\n\n    return nodeRollupConfig;\n};\n\nexport function createConfig(banner, cfg, importCheckNames, isOneDs) {\n    const majorVersion = isOneDs ? \"\" : cfg.version.split('.')[0];\n    const targetType = \"es5\";\n    \n    var tasks = [ ];\n\n    if (cfg.node) {\n        let inputPath = cfg.node.inputPath || `dist-${targetType}`;\n        let entryPoint = `${inputPath}/${cfg.node.entryPoint}`;\n\n        tasks.push(\n            nodeUmdRollupConfigFactory(banner, importCheckNames, targetType, cfg.namespace, cfg.version, entryPoint, cfg.node.outputName, true),\n            nodeUmdRollupConfigFactory(banner, importCheckNames, targetType, cfg.namespace, cfg.version, entryPoint, cfg.node.outputName, false)\n        );\n    }\n\n    let browserFormats = cfg.browser.formats || \n        isOneDs ? [ \n            { format: 'umd', postfix: '' },\n            { format: 'iife', postfix: '.gbl' }\n        ] :\n        [\n            { format: 'umd', postfix: '' },\n            { format: 'cjs', postfix: '.cjs' },\n            { format: 'iife', postfix: '.gbl' }\n        ];\n\n    if (cfg.teams) {\n        for (let lp = 0; lp < cfg.teams.length; lp++) {\n            let teamCfg = cfg.teams[lp];\n            if (teamCfg.teamExt) {\n                browserFormats.push({\n                    teamExt: teamCfg.teamExt,\n                    namespace: teamCfg.namespace || cfg.namespace,\n                    namespaceGbl: teamCfg.namespaceGbl || teamCfg.namespace || cfg.namespace,\n                    format: teamCfg.fmt || 'iife',\n                    postfix: teamCfg.ext || '.gbl'\n                });\n            }\n        }\n    }\n\n    for (let lp = 0; lp < browserFormats.length; lp++) {\n        let browserCfg = browserFormats[lp];\n        let browserNamespace = browserCfg.namespace || cfg.namespace;\n        if (typeof browserNamespace === \"string\") {\n            browserNamespace = {\n                browser: browserCfg.namespace || cfg.namespace,\n                gbl: browserCfg.namespaceGbl || cfg.namespace\n            };\n        }\n\n        let browserFmt = browserCfg.format || 'umd';\n        let browserPostfix = browserCfg.postfix || '';\n        let browserTeam = browserCfg.teamExt || '';\n        let useStrict = browserCfg.useStrict === undefined ? true : browserCfg.useStrict;\n        let topLevel = !!browserCfg.topLevel;\n\n        if (cfg.version) {\n            var version = cfg.version.split(\".\");\n            var majorVer = version[0].trim();\n            if (majorVer && !browserNamespace.browser.endsWith(majorVer)) {\n                browserNamespace.browser += majorVer;\n            }\n            browserNamespace.ver = cfg.version;\n\n        }\n\n        let inputPath = cfg.browser.inputPath || `dist-${targetType}`;\n        let entryPoint = `${inputPath}/${cfg.browser.entryPoint}`;\n\n        tasks.push(\n            browserRollupConfigFactory(isOneDs, banner, importCheckNames, targetType, browserNamespace, entryPoint, cfg.browser.outputName, cfg.version, majorVersion, true, browserFmt, browserPostfix, browserTeam, useStrict, topLevel),\n            browserRollupConfigFactory(isOneDs, banner, importCheckNames, targetType, browserNamespace, entryPoint, cfg.browser.outputName, cfg.version, majorVersion, false, browserFmt, browserPostfix, browserTeam, useStrict, topLevel),\n            browserRollupConfigFactory(isOneDs, banner, importCheckNames, targetType, browserNamespace, entryPoint, cfg.browser.outputName, cfg.version, cfg.version, true, browserFmt, browserPostfix, browserTeam, useStrict, topLevel),\n            browserRollupConfigFactory(isOneDs, banner, importCheckNames, targetType, browserNamespace, entryPoint, cfg.browser.outputName, cfg.version, cfg.version, false, browserFmt, browserPostfix, browserTeam, useStrict, topLevel)\n        );\n    }\n\n    return tasks;\n}\n\nexport function createUnVersionedConfig(banner, cfg, importCheckName, isOneDs) {\n    const noVersion = \"\";\n    const targetType = \"es5\";\n\n    let tasks = [ ];\n\n    if (cfg.node) {\n        let inputPath = cfg.node.inputPath || `dist-${targetType}`;\n        let entryPoint = `${inputPath}/${cfg.node.entryPoint}`;\n\n        tasks.push(\n            nodeUmdRollupConfigFactory(banner, importCheckName, targetType, cfg.namespace, cfg.version, entryPoint, cfg.node.outputName, true),\n            nodeUmdRollupConfigFactory(banner, importCheckName, targetType, cfg.namespace, cfg.version, entryPoint, cfg.node.outputName, false)\n        );\n    }\n\n    let browserFormats = cfg.browser.formats || [ \n        { format: 'umd', postfix: '' },\n        { format: 'cjs', postfix: '.cjs' },\n        { format: 'iife', postfix: '.gbl' }\n    ];\n\n    if (cfg.teams) {\n        for (let lp = 0; lp < cfg.teams.length; lp++) {\n            let teamCfg = cfg.teams[lp];\n            if (teamCfg.teamExt) {\n                browserFormats.push({\n                    teamExt: teamCfg.teamExt,\n                    namespace: teamCfg.namespace || cfg.namespace,\n                    namespaceGbl: teamCfg.namespaceGbl || teamCfg.namespace || cfg.namespace,\n                    format: teamCfg.fmt || 'iife',\n                    postfix: teamCfg.ext || '.gbl'\n                });\n            }\n        }\n    }\n\n    for (let lp = 0; lp < browserFormats.length; lp++) {\n        let browserCfg = browserFormats[lp];\n        let browserNamespace = browserCfg.namespace || cfg.namespace;\n        if (typeof browserNamespace === \"string\") {\n            browserNamespace = {\n                browser: browserCfg.namespace || cfg.namespace,\n                gbl: browserCfg.namespaceGbl || cfg.namespace\n            };\n        }\n        let browserFmt = browserCfg.format || 'umd';\n        let browserPostfix = browserCfg.postfix || '';\n        let browserTeam = browserCfg.teamExt || '';\n        let useStrict = browserCfg.useStrict === undefined ? true : browserCfg.useStrict;\n        let topLevel = !!browserCfg.topLevel;\n\n        if (cfg.version) {\n            var version = cfg.version.split(\".\");\n            var majorVer = version[0].trim();\n            if (majorVer && !browserNamespace.browser.endsWith(majorVer)) {\n                browserNamespace.browser += majorVer;\n            }\n            browserNamespace.ver = cfg.version;\n        }\n\n        let inputPath = cfg.browser.inputPath || `dist-${targetType}`;\n        let entryPoint = `${inputPath}/${cfg.browser.entryPoint}`;\n\n        tasks.push(\n            browserRollupConfigFactory(isOneDs, banner, importCheckName, targetType, browserNamespace, entryPoint, cfg.browser.outputName, cfg.version, noVersion, true, browserFmt, browserPostfix, browserTeam, useStrict, topLevel),\n            browserRollupConfigFactory(isOneDs, banner, importCheckName, targetType, browserNamespace, entryPoint, cfg.browser.outputName, cfg.version, noVersion, false, browserFmt, browserPostfix, browserTeam, useStrict, topLevel)\n        );\n    }\n\n    return tasks;\n}"
  },
  {
    "path": "rush.json",
    "content": "{\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json\",\n  \"npmVersion\": \"9.9.4\",\n  \"rushVersion\": \"5.172.1\",\n  \"projectFolderMaxDepth\": 4,\n  \"projects\": [\n    {\n      \"packageName\": \"applicationinsights-js-release-tools\",\n      \"projectFolder\": \"tools/release-tools\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-chrome-debug-extension\",\n      \"projectFolder\": \"tools/chrome-debug-extension\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/ai-test-framework\",\n      \"projectFolder\": \"common/Tests/Framework\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\",\n      \"projectFolder\": \"tools/rollup-plugin-uglify3-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-rollup-es5\",\n      \"projectFolder\": \"tools/rollup-es5\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-shims\",\n      \"projectFolder\": \"tools/shims\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-web-snippet\",\n      \"projectFolder\": \"tools/applicationinsights-web-snippet\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-core-js\",\n      \"projectFolder\": \"shared/AppInsightsCore\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-common\",\n      \"projectFolder\": \"shared/AppInsightsCommon\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-perfmarkmeasure-js\",\n      \"projectFolder\": \"extensions/applicationinsights-perfmarkmeasure-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-properties-js\",\n      \"projectFolder\": \"extensions/applicationinsights-properties-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-dependencies-js\",\n      \"projectFolder\": \"extensions/applicationinsights-dependencies-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-debugplugin-js\",\n      \"projectFolder\": \"extensions/applicationinsights-debugplugin-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-analytics-js\",\n      \"projectFolder\": \"extensions/applicationinsights-analytics-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-clickanalytics-js\",\n      \"projectFolder\": \"extensions/applicationinsights-clickanalytics-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-osplugin-js\",\n      \"projectFolder\": \"extensions/applicationinsights-osplugin-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-channel-js\",\n      \"projectFolder\": \"channels/applicationinsights-channel-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-offlinechannel-js\",\n      \"projectFolder\": \"channels/offline-channel-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-teechannel-js\",\n      \"projectFolder\": \"channels/tee-channel-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-web\",\n      \"projectFolder\": \"AISKU\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-web-basic\",\n      \"projectFolder\": \"AISKULight\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"applicationinsights-web-config\",\n      \"projectFolder\": \"tools/config\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-example-aisku\",\n      \"projectFolder\": \"examples/AISKU\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-example-cfgsync\",\n      \"projectFolder\": \"examples/cfgSync\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-example-dependencies\",\n      \"projectFolder\": \"examples/dependency\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-example-shared-worker\",\n      \"projectFolder\": \"examples/shared-worker\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-example-startspan\",\n      \"projectFolder\": \"examples/startSpan\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-test-module-type-check\",\n      \"projectFolder\": \"AISKU/Tests/es6-module-type-check\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/applicationinsights-cfgsync-js\",\n      \"projectFolder\": \"extensions/applicationinsights-cfgsync-js\",\n      \"shouldPublish\": false\n    },\n    {\n      \"packageName\": \"@microsoft/1ds-core-js\",\n      \"projectFolder\": \"shared/1ds-core-js\",\n      \"shouldPublish\": true\n    },\n    {\n      \"packageName\": \"@microsoft/1ds-post-js\",\n      \"projectFolder\": \"channels/1ds-post-js\",\n      \"shouldPublish\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "scripts/dtsgen.js",
    "content": "//\n// This script wrap the generated api dts file with a oneDS namespace and copyright notice the version\n//\n//  node ../../scripts\\dtsgen.js ./dist-es5/applicationinsights-web.d.ts 'Microsoft.ApplicationInsights' ./\n//\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst child_process = require(\"child_process\");\n\nfunction parseArgs(expectedArgs) {\n    var passedArgs = process.argv;\n    var theArgs = {\n        \"$script\" : passedArgs[1]\n    };\n\n    let switches = {};\n    let expArgs = [];\n    for (var lp = 0; lp < expectedArgs.length; lp++) {\n        var expArg = expectedArgs[lp];\n        if (expArg.isSwitch) {\n            switches[expArg.name.toLowerCase()] = expArg.name;\n            theArgs[expArg.name] = !!expArg.value;\n        } else {\n            expArgs.push(expArg.name);\n            theArgs[expArg.name] = expArg.value;\n        }\n    }\n\n    var expIdx = 0;\n\n    var argIdx = 2 + expIdx;\n    while (argIdx < passedArgs.length) {\n        let done = false;\n        let value = passedArgs[argIdx++];\n        // console.log(`${argIdx}: ${value}`);\n        if (value && value.length > 2) {\n            if (value[0] === \"-\") {\n                let swName = value.substring(1).toLowerCase();\n                if (switches[swName]) {\n                    theArgs[switches[swName]] = true;\n                    done = true;\n                    console.log(`  -${switches[swName]} -> true`);\n                } else {\n                    throwError(\"Unknown switch[\" + value + \"]\");\n                }\n            }\n            else if ((value[0] === \"'\" && value[value.length - 1] === \"'\") || (value[0] === '\"' && value[value.length - 1] === '\"')) {\n                value = value.substring(1, value.length - 1);\n            }\n        }\n\n        if (!done) {\n            if (expArgs.length < expIdx) {\n                throwError(\"Unexpected value [\" + value + \"]\");\n            }\n\n            var expName = expArgs[expIdx++];\n            theArgs[expName] = value;\n            console.log(`  ${expName} -> ${value}`);\n        }\n    }\n\n    return theArgs;\n}\n\nvar theArgs = parseArgs([\n    { name: \"skuName\", value: null},                            // The Sku name to place in the copyright notice\n    { name: \"projectPath\", value: \"./\"},                        // The root path for the project\n    { name: \"dtsFile\", value: \"\"},                              // [Optional] The generated Dts file (if cannot be derived from the package.json)\n    { name: \"includePrivate\", value: false, isSwitch: true},    // [Optional] Switch to hide or include private properties and functions (defaults to false)\n    { name: \"oneDs\", value: false, isSwitch: true }\n]);\n\nif (!theArgs.skuName) {\n    throwError(\"Missing skuName\");\n}\n\nvar projectPath = path.resolve(process.cwd(), theArgs.projectPath)\nvar packagePath = path.resolve(theArgs.projectPath, \"package.json\");\nconsole.log(`Using Package: ${packagePath}, current path cwd ${process.cwd()}`);\n\nvar packageJson = require(packagePath);\nif (!packageJson || !packageJson.version) {\n    throwError(`Missing package.json or version from [${packagePath}]`);\n}\n\nvar version = packageJson.version\nvar author = packageJson.author || \"\";\nvar homepage = packageJson.homepage || \"\";\nvar packageName = packageJson.name\npackageName = packageName.replace('@microsoft/', '').replace('/', '_');\n\nvar rollupPath = \"dist\";\nvar rollupExt = \".rollup\";\nvar namespacePath = \"dist\";\nvar namespaceExt = \"\";\n\nvar rollupNote = \n    \" * use this version if your build environment doesn't support the using the\\n\" +\n    \" * individual *.d.ts files or the namespace wrapped version.\\n\";\n\nif (!theArgs.dtsFile) {\n    theArgs.dtsFile = path.resolve(projectPath, \"dist\", `${packageName}.d.ts`);\n    if (!fs.existsSync(theArgs.dtsFile)) {\n        theArgs.dtsFile = path.resolve(projectPath, \"build/dts\", `${packageName}.d.ts`);\n        rollupPath = \"types\";\n        rollupExt = \"\";\n        namespacePath = \"types\";\n        namespaceExt = \".namespaced\"\n        rollupNote = \n            \" * if you require a namespace wrapped version it is also available.\\n\";\n\n        // Make sure the destination path exists\n        var dtsDestPath = path.resolve(projectPath, rollupPath);\n        if (!fs.existsSync(dtsDestPath)) {\n            fs.mkdirSync(dtsDestPath);\n        }\n    }\n}\n\nvar dtsFileNamespaced = path.resolve(projectPath, namespacePath, `${packageName}${namespaceExt}.d.ts`)\nvar dtsFileRollup = path.resolve(projectPath, rollupPath, `${packageName}${rollupExt}.d.ts`)\n\nvar rollupContent = \n    \"/*\\n\" +\n    ` * ${theArgs.skuName}, ${version}\\n` +\n    \" * Copyright (c) Microsoft and contributors. All rights reserved.\\n\" +\n    \" *\\n\" +\n    ` * ${author}\\n` +\n    ` * ${homepage}\\n`;\n\nvar newAppInsightsContent = rollupContent +\n    \" */\\n\\n\" +\n    \"declare namespace ApplicationInsights {\";\n\nvar newOneDsContent = rollupContent +\n    \" */\\n\\n\" +\n    \"declare namespace oneDS {\";\n\n\nrollupContent += \n    \" *\\n\" +\n    \" * ---------------------------------------------------------------------------\\n\" +\n    \" * This is a single combined (rollup) declaration file for the package,\\n\" +\n    rollupNote +\n    ` * - Namespaced version: ${namespacePath ? namespacePath + \"/\" : \"\"}${packageName}${namespaceExt}.d.ts\\n` +\n    \" * ---------------------------------------------------------------------------\\n\" +\n    \" */\\n\";\n\nif (theArgs.dtsNsFile === theArgs.dtsFile || theArgs.dtsNsFile === null) {\n    console.log(`Transforming: ${theArgs.dtsFile}`);\n} else {\n    console.log(`Transforming: ${theArgs.dtsFile} and ${theArgs.dtsNsFile}`);\n}\n\ntry {\n    var data = fs.readFileSync(theArgs.dtsFile, \"utf8\");\n    if (!theArgs.dtsNsFile) {\n        theArgs.dtsNsFile = generateDtsNsFile(theArgs.dtsFile, data.toString());\n    }\n    var nsData = fs.readFileSync(theArgs.dtsNsFile, \"utf8\");\n    processFiles(data.toString(), nsData.toString());\n} catch (err) {\n    console.error(err);\n    throw `Failed to generate .d.ts files [${theArgs.dtsFile}] - ${err}`;\n}\n\nfunction createGenConfig(genConfig, includeBundles) {\n    var newGenConfig = \"\";\n\n    // Strip Comments and rename output\n    var lines = genConfig.split(\"\\n\");\n    console.log(`Lines: ${lines.length}`);\n    lines.forEach((line) => {\n        // Trim whitespace from the end of the string\n        let trimLine = line.trim();\n        if (trimLine && trimLine.trim().length > 0) {\n            if (trimLine.startsWith(\"//\") || trimLine.startsWith(\"/*\") || trimLine.startsWith(\"*\")) {\n                // drop commented lines\n                line = null;\n            }\n        }\n\n        if (line && trimLine) {\n            // Rename the output files\n            line = line.replace(\"<unscopedPackageName>.\", \"<unscopedPackageName>.namespaced.\");\n            // As the config is in the build folder, we need to realign the paths\n            line = line.replace(\"\\\"projectFolder\\\": \\\".\\\"\", \"\\\"projectFolder\\\": \\\"..\\\"\");\n            newGenConfig += line;\n        }\n    });\n\n    newGenConfig.replace(/\"bundledPackages\":\\s*(\\[[^\\]]+\\])/gs, function (match, g1) {\n        var theBundles = includeBundles;\n        var existingBundles = JSON.parse(g1);\n        if (existingBundles.length > 0) {\n            // Keep the existing bundles defined in the config first\n            theBundles = [];\n            existingBundles.forEach((bundle) => {\n                if (theBundles.indexOf(\"\\\"\" + bundle + \"\\\"\") === -1) {\n                    theBundles.push(\"\\\"\" + bundle + \"\\\"\");\n                }\n            });\n\n            includeBundles.forEach((bundle) => {\n                if (theBundles.indexOf(bundle) === -1) {\n                    theBundles.push(bundle);\n                }\n            });\n        }\n        \n        newGenConfig = newGenConfig.replace(g1, `[${theBundles.join(\", \")}]`);\n    });\n\n    return newGenConfig;\n}\n\nfunction generateDtsNsFile(dtsFile, dtsContents, additionalBundles = [], attempt = 0) {\n\n    var importCheck = /^\\s*import\\s+.*from\\s*['\"]([^'\"]+)['\"]/gm;\n    \n    var includeBundles = [];\n\n    // Add any directly referenced imports\n    while((match = importCheck.exec(dtsContents)) !== null) {\n        if (match[1] && includeBundles.indexOf(\"\\\"\" + match[1] + \"\\\"\") === -1) {\n            includeBundles.push(\"\\\"\" + match[1] + \"\\\"\");\n        }\n    }\n\n    // Add any detected transitive additional bundles\n    additionalBundles.forEach((bundle) => {\n        if (includeBundles.indexOf(\"\\\"\" + bundle + \"\\\"\") === -1) {\n            includeBundles.push(\"\\\"\" + bundle + \"\\\"\");\n        }\n    });\n\n    if (includeBundles.length === 0) {\n        // Just reuse the existing file\n        return dtsFile;\n    }\n\n    var apiGenConfig = path.resolve(projectPath, \"api-extractor.json\");\n    var genConfig = fs.readFileSync(apiGenConfig, \"utf8\");\n    if (!genConfig) {\n        throwError(`Failed to read ${apiGenConfig}`);\n    }\n    \n    var newGenConfig = createGenConfig(genConfig, includeBundles);\n    var apiNewGenConfig = path.resolve(projectPath, \"build\", \"api-extractor.namespaced.json\");\n    console.log(\"Writing: \" + apiNewGenConfig);\n    fs.writeFileSync(apiNewGenConfig, newGenConfig, (err, data) => {\n        if (err) {\n            console.error(err);\n            throwError(`Failed to write ${apiNewGenConfig}`);\n        }\n    });\n\n    let apiExtractorCmd = `api-extractor run --local --config build/api-extractor.namespaced.json`;\n    console.log(`Running: \\\"${apiExtractorCmd}\\\"`);\n    child_process.execSync(apiExtractorCmd);\n\n    // Check for unexpected transitive (indirect) imports\n    var dtsFileNs = dtsFile.replace(\".d.ts\", \".namespaced.d.ts\");\n    if (!fs.existsSync(dtsFileNs)) {\n        throwError(`Failed to generate ${dtsFileNs} -- does not exist!`);\n    }\n\n    var nsData = fs.readFileSync(dtsFileNs, \"utf8\");\n    var importCheck = /^\\s*import\\s+.*from\\s*['\"]([^'\"]+)/gm;\n\n    var newImports = false;\n    var indirectImports = additionalBundles.slice(0);\n    while((match = importCheck.exec(nsData)) !== null) {\n        if (match[1] && indirectImports.indexOf(match[1]) === -1) {\n            indirectImports.push(match[1]);\n            newImports = true;\n        }\n    }\n\n    if (newImports && attempt < 4) {\n        console.log(`Found additional transitive (indirect) imports - re-running with additional bundles - ${attempt}\\n  - ${indirectImports.join(\"\\n  - \")}`);\n        return generateDtsNsFile(dtsFile, dtsContents, indirectImports, ++attempt);\n    }\n\n    return dtsFile.replace(\".d.ts\", \".namespaced.d.ts\");\n}\n\nfunction createRollupFile(dtsContents, theContent) {\n    console.log(\"File...\");\n    // console.log(dtsContents);\n\n    // Read the generated dts file and append to the new content\n    var lastLine = \"\"\n\n    // Prefix every line with 4 spaces (indenting the lines)\n    var lines = dtsContents.split(\"\\n\");\n    console.log(`Lines: ${lines.length}`);\n    // console.log(dtsContents);\n\n    // Handle the normal file\n    lines.forEach((line) => {\n        // Trim whitespace from the end of the string\n        var rollupLine = line.replace(/(\\s+$)/g, '');\n\n        if (line && line.trim().length > 0) {\n            if (!theArgs.includePrivate) {\n                // Hide private properties and functions\n                rollupLine = rollupLine.replace(/(^\\s+)private (.*);/, '$1// private $2;');\n            }\n\n            theContent +=  `\\n${rollupLine}`;\n        } else if (lastLine) {\n            // Only add 1 blank line\n            theContent += \"\\n\"\n        }\n\n        lastLine = line\n    });\n\n    return theContent;\n}\n\nfunction throwError(message) {\n    console.error(`\\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\n${message}\\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\n`);\n    throw message;\n}\n\nfunction createNsFile(dtsContents) {\n    console.log(\"NsFile...\");\n    // console.log(dtsContents);\n\n    let newContent = newAppInsightsContent;\n    if (theArgs.oneDs) {\n        newContent = newOneDsContent;\n    }\n\n    // Read the generated dts file and append to the new content\n    var lastLine = \"\";\n\n    var nsLines = dtsContents.split(\"\\n\");\n    console.log(`Lines: ${nsLines.length}`);\n\n    // handle the namespaced file\n    nsLines.forEach((nsLine) => {\n        if (nsLine && nsLine.trim().length > 0) {\n            // Remove exports and declares\n            nsLine = nsLine.replace('export declare ', '');\n            nsLine = nsLine.replace('declare ', '');\n            nsLine = nsLine.replace('export { }', '');\n            nsLine = nsLine.replace(/export\\s*{\\s*([\\w]+)\\s*}/g, '');\n            nsLine = nsLine.replace(/export\\s*{\\s*([\\w]+)\\s*as\\s*([\\w]+)\\s*}/g, function (match, g1, g2) {\n                return `const ${g2}: typeof ${g1};`;\n            });\n\n            // Trim whitespace from the end of the string\n            nsLine = nsLine.replace(/(\\s+$)/g, '');\n\n            if (!theArgs.includePrivate) {\n                // Hide private properties and functions\n                nsLine = nsLine.replace(/(^\\s+)private (.*);/, '$1// private $2;');\n            }\n\n            if (nsLine && nsLine.trim().length > 0) {\n                newContent += `\\n    ${nsLine}`;\n            }\n        } else if (lastLine) {\n            // Only add 1 blank line\n            newContent += \"\\n\"\n        }\n\n        lastLine = nsLine\n    });\n\n    // Add final trailing closing bracket for the namespace\n    newContent += \"\\n}\";\n\n    var importCheck = /^\\s*import\\s+.*from\\s*['\"]([^'\"]+)/gm;\n    \n    var imports = [];\n    while((match = importCheck.exec(newContent)) !== null) {\n        if (match[1] && imports.indexOf(match[1]) === -1) {\n            imports.push(match[1]);\n        }\n    }\n\n    if (imports.length > 0) {\n        if (theArgs.dtsFile === theArgs.dtsNsFile) {\n            throwError(`Found unexpected imports - create and generate the namespaced rollup via a api-extractor.namespaced.json file\\nand including these packages in the bundledPackages for the namespaced version only.\\n  - ${imports.join(\"\\n  - \")}`);\n        } else {\n            throwError(`Found unexpected imports - please update the api-extractor.namespaced.json file to includes these packages in the bundledPackages for the namespaced version only.\\n  - ${imports.join(\"\\n  - \")}`);\n        }\n    }\n\n    return newContent;\n}\n\nfunction processFiles(dtsContents, dtsNsContents) {\n\n    fs.writeFileSync(dtsFileRollup, createRollupFile(dtsContents, rollupContent), (err, data) => {\n        if (err) {\n            console.error(err);\n            throwError(`Failed to write ${dtsFileRollup}`);\n        }\n    });\n\n    fs.writeFileSync(dtsFileNamespaced, createNsFile(dtsNsContents), (err, data) => {\n        if (err) {\n            console.error(err);\n            throwError(`Failed to write ${dtsFileNamespaced}`);\n        }\n    });\n}\n"
  },
  {
    "path": "shared/1ds-core-js/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es5/**\n!dist/**\n!bundle/**\n!types/**\n"
  },
  {
    "path": "shared/1ds-core-js/CODE_OF_CONDUCT.md",
    "content": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n\nResources:\n\n- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)\n- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\n- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns\n"
  },
  {
    "path": "shared/1ds-core-js/CONTRIBUTING.md",
    "content": "# Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "shared/1ds-core-js/LICENSE.TXT",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "shared/1ds-core-js/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "shared/1ds-core-js/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "shared/1ds-core-js/README.md",
    "content": "# Microsoft 1DS Web SDK Core\n\n> ## :warning: Deprecated\n>\n> **This package (`@microsoft/1ds-core-js`) is deprecated.** All functionality has been merged into\n> [`@microsoft/applicationinsights-core-js`](https://www.npmjs.com/package/@microsoft/applicationinsights-core-js)\n> and should be consumed directly from that package.\n>\n> This package now re-exports everything from `@microsoft/applicationinsights-core-js` for backward\n> compatibility, but it will not receive new features or enhancements. Please migrate to\n> `@microsoft/applicationinsights-core-js` at your earliest convenience.\n\n## Upgrade Guide\n\nTo migrate, replace your `@microsoft/1ds-core-js` import with `@microsoft/applicationinsights-core-js` and\napply the name changes listed below.\n\n### Class Name Changes\n\n| 1ds-core-js (old) | applicationinsights-core-js (new) | Notes |\n|--------------------|-----------------------------------|-------|\n| `AppInsightsCore` | `AppInsightsExtCore` | The 1DS extended core class was renamed to `AppInsightsExtCore` |\n| `InternalAppInsightsCore` | `AppInsightsCore` | The base `AppInsightsCore` is now the AI-specific core class |\n\n### Import Changes\n\n**Before (deprecated):**\n\n```typescript\nimport { AppInsightsCore, IExtendedConfiguration } from '@microsoft/1ds-core-js';\n```\n\n**After:**\n\n```typescript\nimport { AppInsightsExtCore, IExtendedConfiguration } from '@microsoft/applicationinsights-core-js';\n```\n\n### Other Name Changes\n\nThe following functions/exports were also renamed. The old names are still available from this\ncompatibility package, but when migrating to `@microsoft/applicationinsights-core-js` you must\nuse the new names.\n\n| 1ds-core-js (old) | applicationinsights-core-js (new) | Notes |\n|--------------------|-----------------------------------|-------|\n| `Undefined` | `strUndefined` | String constant |\n| `disallowsSameSiteNone` | `uaDisallowsSameSiteNone` | Cookie utility function |\n| `cookieAvailable` | `areCookiesSupported` | Cookie utility function |\n| `getISOString` | `toISOString` | Date formatting utility |\n\n### All Other Exports\n\nAll other types, interfaces, enums, and utility functions retain the same names and are available\ndirectly from `@microsoft/applicationinsights-core-js`.\n\n---\n\n## Description\n\n1DS Web SDK Core is the telemetry orchestrator, responsible for initializing all attached plugins and calling process() on each of them.\n\n## npm\n\nPackages available [here](https://www.npmjs.com/package/@microsoft/1ds-core-js).\n\n## Basic Usage\n\n### Setup\n\n```js\nimport { AppInsightsCore, IExtendedConfiguration } from '@microsoft/1ds-core-js';\n```\n\n```js\nvar appInsightsCore: AppInsightsCore = new AppInsightsCore();\nvar coreConfig: IExtendedConfiguration = {\n      instrumentationKey: \"YOUR_TENANT_KEY\"\n};\n//Initialize SDK\nappInsightsCore.initialize(coreConfig, []);\n```\n\n## Configuration\n\n### [IExtendedConfiguration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html)\n\n|  Config   | Description | Type\n|----------------|----------------------------------------|----|\n|  [instrumentationKey](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#instrumentationKey)     |Instrumentation key of resource.|string\n|  [diagnosticLogInterval](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#diagnosticLogInterval)     |Polling interval (in ms) for internal logging queue.|number\n|  [maxMessageLimit](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#maxMessageLimit)     |Maximum number of iKey transmitted logging telemetry per page view.|number\n|  [loggingLevelConsole](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#loggingLevelConsole)     |Console logging level. All logs with a severity level higher than the configured level will be printed to console. Otherwise they are suppressed. |number\n|  [loggingLevelTelemetry](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#loggingLevelTelemetry)     |Telemtry logging level to instrumentation key. All logs with a severity level higher than the configured level will sent as telemetry data to the configured instrumentation key.|number\n|  [enableDebugExceptions](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#enableDebugExceptions)     |If enabled, uncaught exceptions will be thrown to help with debugging.|boolean\n|  [endpointUrl](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#endpointUrl)     |Endpoint where telemetry data is sent.|string\n|  [extensionConfig](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#extensionConfig)     |Extension configs loaded in SDK.|[key: string]: any;\n|  [extensions](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#extensions)     |Additional plugins that should be loaded by core at runtime.| Array< ITelemetryPlugin>\n|  [channels](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#channels)     |Channel queues that is setup by caller in desired order.|Array< IChannelControls[]>\n|  [propertyStorageOverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#propertyStorageOverride)     |The property storage override that should be used to store internal SDK properties, otherwise stored as cookies. It is needed where cookies are not available.|IPropertyStorageOverride\n| [cookieCfg](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#cookieCfg) | Defaults to cookie usage enabled see [ICookieCfgConfig](#ICookieMgrConfig) settings for full defaults. | [ICookieCfgConfig](#ICookieMgrConfig)<br>[Optional]<br>(Since 3.1.0) \n|  [disableCookiesUsage](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#disableCookiesUsage)     |A boolean that indicated whether to disable the use of cookies by the Aria SDK. The cookies added by the SDK are MicrosoftApplicationsTelemetryDeviceId and MicrosoftApplicationsTelemetryFirstLaunchTime. If cookies are disabled, then session events are not sent unless propertyStorageOverride is provided to store the values elsewhere.|boolean\n| [cookieDomain](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#cookieDomain) | Custom cookie domain. This is helpful if you want to share Application Insights cookies across subdomains.<br>(Since v3.1.0) If `cookieCfg.domain` is defined it will take precedence over this value. | alias for [`cookieCfg.domain`](#ICookieMgrConfig)<br>[Optional]<br>(Since 3.1.0)\n| [cookiePath](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#cookiePath) | Custom cookie path. This is helpful if you want to share Application Insights cookies behind an application gateway.<br>If `cookieCfg.path` is defined it will take precedence over this value. | alias for [`cookieCfg.path`](#ICookieMgrConfig)<br>[Optional]<br>(Since 3.1.0) |\n|  [anonCookieName](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#anonCookieName)     |Name of the Anon cookie.  The value will be set in the qsp header to collector requests.  Collector will use this value to look for specific cookie to use for anid property.|string\n| [enablePerfMgr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#enablePerfMgr) | [Optional] When enabled (true) this will create local perfEvents for code that has been instrumented to emit perfEvents (via the doPerf() helper). This can be used to identify performance issues within the SDK based on your usage or optionally within your own instrumented code. [More details are available by the basic documentation](https://github.com/microsoft/ApplicationInsights-JS/blob/main/docs/PerformanceMonitoring.md). Since v2.4.0| boolean<br/>Defaults to false\n| [perfEvtsSendAll](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#perfEvtsSendAll) | [Optional] When _enablePerfMgr_ is enabled and the [IPerfManager](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IPerfManager.html) fires a [INotificationManager](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/INotificationManager.html).perfEvent() this flag determines whether an event is fired (and sent to all listeners) for all events (true) or only for 'parent' events (false &lt;default&gt;).<br />A parent [IPerfEvent](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IPerfEvent.html) is an event where no other IPerfEvent is still running at the point of this event being created and it's _parent_ property is not null or undefined. Since v2.4.0 | boolean<br />Defaults to false\n| [idLength](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#idLength) | [Optional] Identifies the default length used to generate new random session and user id's. Defaults to 22, previous default value was 5 (v2.4.2 or less), if you need to keep the previous maximum length you should set this value to 5. | number<br />Default: 22 \n| [disableEventTimings](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#disableEventTimings) | [Optional] Disables additional internal event timings that are added during processing of events, the timings are not sent as part telemetry items to the server. | boolean<br/>Default: false\n| [enableCompoundKey](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#enableCompoundKey) | [Optional] Enables support for objects with compound keys which indirectly represent an object where the \"key\" of the object contains a \".\" as part of it's name.<br />Example: <code>event: { \"somedata.embeddedvalue\": 123 } </code> | boolean<br />Default: false\n| [disablePageUnloadEvents](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#disablePageUnloadEvents) | [Optional] An array of the page unload events that you would like to be ignored, special note there must be at least one valid unload event hooked, if you list all or the runtime environment only supports a listed \"disabled\" event it will still be hooked, if required by the SDK.<br /> Unload events include \"beforeunload\", \"unload\", \"visibilitychange\" (with 'hidden' state) and \"pagehide\". See [Page Unload Events documentation](https://microsoft.github.io/ApplicationInsights-JS/PageUnloadEvents.html) for details.| string[]<br />Default: not specified\n| [disablePageShowEvents](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IExtendedConfiguration.html#disablePageShowEvents) | [Optional] An array of page show events that you would like to be ignored, special note there must be at lease one valid show event hooked, if you list all or the runtime environment only supports a listed (disabled) event it will STILL be hooked, if required by the SDK.<br/> Page Show events include \"pageshow\" and \"visibilitychange\" (with 'visible' state). See [Page Unload Events documentation](https://microsoft.github.io/ApplicationInsights-JS/PageUnloadEvents.html) for details.| string[]<br /> Default: not specified\n\n### [IPropertyStorageOverride](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IPropertyStorageOverride.html)\n\n|  Config   | Description | Type\n|----------------|----------------------------------------|----|\n|  [setProperty](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IPropertyStorageOverride.html#setProperty)     |A function for passing key value pairs to be stored.| function\n|  [getProperty](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js/interfaces/IPropertyStorageOverride.html#getProperty)     | A function that gets a value for a given key.| function\n\n### [ICookieMgrConfig](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html)\n\nCookie Configuration for instance based cookie management added in version 3.1.0.\n\n| Name | Description | <div style=\"width:250px\">Type</div> |\n|------|-------------|--------------|\n| [enabled](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#enabled) | A boolean that indicates whether the use of cookies by  the SDK is enabled by the current instance. If false, the instance of the SDK initialized by this configuration will not store or read any data from cookies | boolean | true |\n| [domain](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#domain) | Custom cookie domain. This is helpful if you want to share Application Insights cookies across subdomains. If not provided uses the value from root `cookieDomain` value. | string<br/>Defaults: null |\n| [path](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#path) | Specifies the path to use for the cookie, if not provided it will use any value from the root `cookiePath` value. | string<br/>Defaults: / |\n| [ignoreCookies](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#ignoreCookies) | Specify the cookie name(s) to be ignored, this will cause any matching cookie name to never be read or written. They may still be explicitly purged or deleted. You do not need to repeat the name in the `blockedCookies` configuration.(Since v3.2.7) | string[] <br/> Defaults: undefined | \n| [blockedCookies](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#blockedCookies) | Specify the cookie name(s) to never be written, this will cause any cookie name to never be created or updated, they will still be read unless also included in the ignoreCookies and may still be explicitly purged or deleted. If not provided defaults to the same list provided in ignoreCookies. (Since v3.2.7) | string[] <br/> Defaults: undefined | \n| [getCookie](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#getCookie) | Function to fetch the named cookie value, if not provided it will use the internal cookie parsing / caching. | `(name: string) => string`<br/>Defaults: null |\n| [setCookie](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#setCookie) | Function to set the named cookie with the specified value, only called when adding or updating a cookie. | `(name: string, value: string) => void`<br/>Defaults:  null |\n| [delCookie](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgrConfig.html#delCookie) | Function to delete the named cookie with the specified value, separated from setCookie to avoid the need to parse the value to determine whether the cookie is being added or removed.if not provided it will use the internal cookie parsing / caching. | `(name: string, value: string) => void`<br/>Defaults:  null |\n\n## Cookie Handling\n\nFrom version 3.1.0, cookie management is now available directly from the instance and can be disabled and re-enabled after initialization.\n\nIf cookie usage is disabled during initialization via the `disableCookiesUsage` configurations, you can now re-enable via the [ICookieMgr](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html) `setEnabled` function.\n\nThe instance based cookie management also replaces the previous CoreUtils and global functions of `disableCookies()`, `setCookie(...)`, `getCookie(...)` and `deleteCookie(...)`. And to benefit from the tree-shaking enhancements also introduced as part of version 3.1.0 you should no longer uses the global functions.\n\n### Simplified Usage of new instance Cookie Manager\n\n- oneDs.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).setEnabled(true/false)\n- oneDs.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).set(\"MyCookie\", \"thevalue\");\n- oneDs.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).get(\"MyCookie\");\n- oneDs.[getCookieMgr()](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ICookieMgr.html).del(\"MyCookie\");\n\n### Blocking individual cookies\n\nSince v3.2.7 you can now specify which Cookie name(s) that you want the SDK to either ignore (never read, written or created) or blocked (will be read if already present but will not write or create), this is useful for blocking non-critical Cookies that your site does not need but the SDK automatically populates. These settings only affect the Javascript SDK reading, writing and creation of the cookies and do NOT affect automatic cookies added by the Collector. See the [\"Cookies Set/Read by 1DS Web SDK\" section of the linked page](https://eng.ms/docs/products/geneva/collect/instrument/1ds/javascriptsdk/getting-started).\n\nExample.\n\n```typescript\nvar coreConfig: IExtendedConfiguration = {\n    instrumentationKey: \"YOUR_TENANT_KEY\",\n    cookieCfg: {\n        ignoreCookies: [ \"MicrosoftApplicationsTelemetryDeviceId\" ]\n    }\n    extensions: [ /* Your extensions */ ],\n    extensionConfig: []\n};\n```\n\n## API documentation\n\n[Typedoc generated API reference](https://microsoft.github.io/ApplicationInsights-JS/webSdk/1ds-core-js)\n\n## Learn More\n\nYou can learn more in [1DS First party (Internal) getting started](https://aka.ms/1dsjs).\n\n## Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at [https://go.microsoft.com/fwlink/?LinkID=824704](https://go.microsoft.com/fwlink/?LinkID=824704). You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\nTo turn off sending telemetry to Microsoft, ensure that the POST channel is not configured in the extensions.  See below configuration for example:\n\n```js\nvar coreConfig: IExtendedConfiguration = {\n      instrumentationKey: \"YOUR_TENANT_KEY\",\n      extensions: [\n        postChannel  // << REMOVE THIS EXTENSION TO STOP SENDING TELEMETRY TO MICROSOFT\n      ],\n      extensionConfig: []\n};\n```\n\n## Contributing\n\nRead our [contributing guide](./CONTRIBUTING.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Application Insights.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](./LICENSE.TXT)\n"
  },
  {
    "path": "shared/1ds-core-js/SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "shared/1ds-core-js/SUPPORT.md",
    "content": "# Support\n\n## How to file issues and get help  \n\nThis project uses GitHub Issues to track bugs and feature requests. Please search the existing\nissues before filing new issues to avoid duplicates.  For new issues, file your bug or\nfeature request as a new Issue.\n\nFor help and questions about using this project, please create a Support request issue on\nhttps://github.com/microsoft/ApplicationInsights-JS/issues.\n\n## Microsoft Support Policy  \n\nSupport for this **PROJECT or PRODUCT** is limited to the resources listed above.\n"
  },
  {
    "path": "shared/1ds-core-js/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n  \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n\n  /**\n   * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n   * standard settings to be shared across multiple projects.\n   *\n   * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n   * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n   * resolved using NodeJS require().\n   *\n   * SUPPORTED TOKENS: none\n   * DEFAULT VALUE: \"\"\n   */\n  // \"extends\": \"./shared/api-extractor-base.json\"\n  // \"extends\": \"my-package/include/api-extractor-base.json\"\n\n  /**\n   * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n   * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n   *\n   * The path is resolved relative to the folder of the config file that contains the setting.\n   *\n   * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n   * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n   * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n   * will be reported.\n   *\n   * SUPPORTED TOKENS: <lookup>\n   * DEFAULT VALUE: \"<lookup>\"\n   */\n  \"projectFolder\": \".\",\n\n  /**\n   * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n   * analyzes the symbols exported by this module.\n   *\n   * The file extension must be \".d.ts\" and not \".ts\".\n   *\n   * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n   * prepend a folder token such as \"<projectFolder>\".\n   *\n   * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n   */\n  \"mainEntryPointFilePath\": \"<projectFolder>/build/types/Index.d.ts\",\n\n  /**\n   * A list of NPM package names whose exports should be treated as part of this package.\n   *\n   * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n   * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n   * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n   * imports library2.  To avoid this, we can specify:\n   *\n   *   \"bundledPackages\": [ \"library2\" ],\n   *\n   * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n   * local files for library1.\n   */\n  \"bundledPackages\": [\n  ],\n\n  /**\n   * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n   */\n  \"compiler\": {\n    /**\n     * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n     */\n    // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n\n    /**\n     * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n     * The object must conform to the TypeScript tsconfig schema:\n     *\n     * http://json.schemastore.org/tsconfig\n     *\n     * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n     *\n     * DEFAULT VALUE: no overrideTsconfig section\n     */\n    // \"overrideTsconfig\": {\n    //   . . .\n    // }\n\n    /**\n     * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n     * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n     * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n     * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n     *\n     * DEFAULT VALUE: false\n     */\n    // \"skipLibCheck\": true,\n  },\n\n  /**\n   * Configures how the API report file (*.api.md) will be generated.\n   */\n  \"apiReport\": {\n    /**\n     * (REQUIRED) Whether to generate an API report.\n     */\n    \"enabled\": false,\n\n    /**\n     * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n     * a full file path.\n     *\n     * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n     *\n     * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n     */\n    \"reportFileName\": \"<unscopedPackageName>.api.md\",\n\n    /**\n     * Specifies the folder where the API report file is written.  The file name portion is determined by\n     * the \"reportFileName\" setting.\n     *\n     * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n     * e.g. for an API review.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/etc/\"\n     */\n    \"reportFolder\": \"<projectFolder>/build/dts/\",\n\n    /**\n     * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n     * the \"reportFileName\" setting.\n     *\n     * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n     * If they are different, a production build will fail.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/temp/\"\n     */\n    // \"reportTempFolder\": \"<projectFolder>/temp/\"\n  },\n\n  /**\n   * Configures how the doc model file (*.api.json) will be generated.\n   */\n  \"docModel\": {\n    /**\n     * (REQUIRED) Whether to generate a doc model file.\n     */\n    \"enabled\": true,\n\n    /**\n     * The output path for the doc model file.  The file extension should be \".api.json\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n     */\n    \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n  },\n\n  /**\n   * Configures how the .d.ts rollup file will be generated.\n   */\n  \"dtsRollup\": {\n    /**\n     * (REQUIRED) Whether to generate the .d.ts rollup file.\n     */\n    \"enabled\": true,\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n     * This file will include all declarations that are exported by the main entry point.\n     *\n     * If the path is an empty string, then this file will not be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n     */\n    \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n     * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"\"\n     */\n    // \"betaTrimmedFilePath\": \"<projectFolder>/dist/<unscopedPackageName>-beta.d.ts\",\n\n\n    /**\n     * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n     * This file will include only declarations that are marked as \"@public\".\n     *\n     * If the path is an empty string, then this file will not be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"\"\n     */\n    // \"publicTrimmedFilePath\": \"<projectFolder>/dist/<unscopedPackageName>-public.d.ts\",\n\n    /**\n     * When a declaration is trimmed, by default it will be replaced by a code comment such as\n     * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n     * declaration completely.\n     *\n     * DEFAULT VALUE: false\n     */\n    // \"omitTrimmingComments\": true\n  },\n\n  /**\n   * Configures how the tsdoc-metadata.json file will be generated.\n   */\n  \"tsdocMetadata\": {\n    /**\n     * Whether to generate the tsdoc-metadata.json file.\n     *\n     * DEFAULT VALUE: true\n     */\n    \"enabled\": false,\n\n    /**\n     * Specifies where the TSDoc metadata file should be written.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n     * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n     * falls back to \"tsdoc-metadata.json\" in the package folder.\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n  },\n\n  /**\n   * Configures how API Extractor reports error and warning messages produced during analysis.\n   *\n   * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n   */\n  \"messages\": {\n    /**\n     * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n     * the input .d.ts files.\n     *\n     * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n     *\n     * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n     */\n    \"compilerMessageReporting\": {\n      /**\n       * Configures the default routing for messages that don't match an explicit rule in this table.\n       */\n      \"default\": {\n        /**\n         * Specifies whether the message should be written to the the tool's output log.  Note that\n         * the \"addToApiReportFile\" property may supersede this option.\n         *\n         * Possible values: \"error\", \"warning\", \"none\"\n         *\n         * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n         * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n         * the \"--local\" option), the warning is displayed but the build will not fail.\n         *\n         * DEFAULT VALUE: \"warning\"\n         */\n        \"logLevel\": \"warning\",\n\n        /**\n         * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n         * then the message will be written inside that file; otherwise, the message is instead logged according to\n         * the \"logLevel\" option.\n         *\n         * DEFAULT VALUE: false\n         */\n        // \"addToApiReportFile\": false\n      },\n\n      // \"TS2551\": {\n      //   \"logLevel\": \"warning\",\n      //   \"addToApiReportFile\": true\n      // },\n      //\n      // . . .\n    },\n\n    /**\n     * Configures handling of messages reported by API Extractor during its analysis.\n     *\n     * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n     *\n     * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n     */\n    \"extractorMessageReporting\": {\n      \"default\": {\n        \"logLevel\": \"warning\",\n        // \"addToApiReportFile\": false\n      },\n\n      \"ae-missing-release-tag\": {\n        \"logLevel\": \"none\"\n      },\n      //\n      // . . .\n    },\n\n    /**\n     * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n     *\n     * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n     *\n     * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n     */\n    \"tsdocMessageReporting\": {\n      \"default\": {\n        \"logLevel\": \"warning\",\n        // \"addToApiReportFile\": false\n      }\n\n      // \"tsdoc-link-tag-unescaped-text\": {\n      //   \"logLevel\": \"warning\",\n      //   \"addToApiReportFile\": true\n      // },\n      //\n      // . . .\n    }\n  }\n\n}\n"
  },
  {
    "path": "shared/1ds-core-js/auto-minify.json",
    "content": "{\n    \"constEnums\": [\n        \"eValueKind\",\n        \"EventLatencyValue\",\n        \"eEventPropertyType\",\n        \"EventPersistenceValue\",\n        \"EventSendType\",\n        \"eTraceLevel\",\n        \"_eExtendedInternalMessageId\",\n        \"GuidStyle\",\n        \"FieldValueSanitizerType\",\n        \"TransportType\",\n        \"PromiseState\"\n    ]\n}"
  },
  {
    "path": "shared/1ds-core-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/1ds-core-js\",\n    \"version\": \"4.4.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - 1ds-core-js\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run dtsgen && npm run sri\",\n        \"build:esm\": \"grunt 1dsCoreBuild\",\n        \"build:browser\": \"npx rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"ai-min\": \"grunt 1dsCore-min\",\n        \"ai-restore\": \"grunt 1dsCore-restore\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"1DS JS SDK Core\\\" -oneDs\",\n        \"test\": \"grunt 1dsCoreTest\",\n        \"mintest\": \"grunt 1dsCoreMinTest\",\n        \"perftest\": \"\",\n        \"publishPackage\": \"npm publish\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/1ds-core-js\"\n    },\n    \"main\": \"dist/es5/ms.core.js\",\n    \"module\": \"dist-es5/Index.js\",\n    \"types\": \"types/1ds-core-js.d.ts\",\n    \"keywords\": [\n        \"1DS\",\n        \"Js\",\n        \"SDK\"\n    ],\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    },\n    \"devDependencies\": {\n        \"@types/qunit\": \"^2.19.3\",\n        \"@types/sinon\": \"4.3.3\",\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"globby\": \"^11.0.0\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\",\n        \"pako\": \"^2.0.3\"\n    }\n}\n"
  },
  {
    "path": "shared/1ds-core-js/rollup.config.js",
    "content": "import { createConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst inputName = \"Index\";\nconst outputName = \"ms.core\";\nconst banner = [\n    \"/*!\",\n    ` * 1DS JS SDK Core, ${version}`,\n    \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n    \" * (Microsoft Internal Only)\",\n    \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n    \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n    \"// Licensed under the ISC License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createConfig(banner, \n    {\n        namespace: \"oneDS\", \n        version: version,\n        node: {\n            entryPoint: inputName,\n            outputName: outputName,\n        },\n        browser: {\n            entryPoint: inputName,\n            outputName: outputName\n        }\n    },\n    [ \"Index\" ],\n    true\n);\n"
  },
  {
    "path": "shared/1ds-core-js/src/Index.ts",
    "content": "/**\n* Index.ts\n* Re-export package — all implementation merged into @microsoft/applicationinsights-core-js.\n* This package exists for backward compatibility with consumers of @microsoft/1ds-core-js.\n*/\n\n// Re-export AppInsightsExtCore as AppInsightsCore so existing consumers are not broken\nexport { AppInsightsExtCore as AppInsightsCore } from \"@microsoft/applicationinsights-core-js\";\n\n// Re-export all 1DS-specific types from core\nexport {\n    ValueKind, eValueKind,\n    EventLatency, EventLatencyValue,\n    EventPersistence, EventPersistenceValue,\n    EventPropertyType, eEventPropertyType,\n    EventSendType,\n    TraceLevel, eTraceLevel,\n    _ExtendedInternalMessageId, _eExtendedInternalMessageId,\n    GuidStyle, FieldValueSanitizerType,\n    IExtendedConfiguration, IPropertyStorageOverride,\n    IEventProperty, IExtendedTelemetryItem, IEventTiming,\n    FieldValueSanitizerFunc, FieldValueSanitizerTypes,\n    IFieldSanitizerDetails, IFieldValueSanitizerProvider, IValueSanitizer,\n    ValueSanitizer,\n    isValueAssigned, isLatency, isUint8ArrayAvailable, getTenantId, sanitizeProperty,\n    Version, FullVersionString, getCommonSchemaMetaData, getCookieValue,\n    extend, createGuid, isDocumentObjectAvailable, isWindowObjectAvailable,\n    setProcessTelemetryTimings, getTime,\n    isArrayValid, isValueKind, getFieldValueType,\n    isChromium, isGreaterThanZero,\n    createExtendedTelemetryItemFromSpan\n} from \"@microsoft/applicationinsights-core-js\";\n\n// Re-export all core types that were previously re-exported by this package\nexport {\n    IAppInsightsCore, IChannelControls, IPlugin, INotificationManager, NotificationManager, INotificationListener,\n    IConfiguration, ITelemetryItem, ITelemetryPlugin, BaseTelemetryPlugin, IProcessTelemetryContext, ITelemetryPluginChain,\n    MinChannelPriorty, EventsDiscardedReason, IDiagnosticLogger, DiagnosticLogger, LoggingSeverity, SendRequestReason,\n    IPerfEvent, IPerfManager, IPerfManagerProvider, PerfEvent, PerfManager, doPerf, ICustomProperties, Tags,\n    AppInsightsCore as InternalAppInsightsCore, _InternalLogMessage, _InternalMessageId, eActiveStatus, ActiveStatus,\n    createEnumStyle, eLoggingSeverity, _eInternalMessageId, _throwInternal, _warnToConsole, _logInternalMessage,\n    isTypeof, isUndefined, isNullOrUndefined, hasOwnProperty, isObject, isFunction, attachEvent, detachEvent, normalizeJsName,\n    objForEachKey, strStartsWith, strEndsWith, strContains, strTrim, isDate, isArray, isError, isString, isNumber, isBoolean,\n    toISOString, arrForEach, arrIndexOf, arrMap, arrReduce, objKeys, objDefineAccessors, dateNow, getExceptionName, throwError,\n    setValue, getSetValue, isNotTruthy, isTruthy, proxyAssign, proxyFunctions, proxyFunctionAs, optimizeObject,\n    addEventHandler, newGuid, perfNow, newId, generateW3CId, safeGetLogger, objFreeze, objSeal, fieldRedaction,\n    getGlobal, getGlobalInst, hasWindow, getWindow, hasDocument, getDocument, getCrypto, getMsCrypto,\n    hasNavigator, getNavigator, hasHistory, getHistory, getLocation, getPerformance, hasJSON, getJSON,\n    isReactNative, getConsole, dumpObj, isIE, getIEVersion, strUndefined, strObject, strPrototype, strFunction,\n    setEnableEnvMocks, strUndefined as Undefined,\n    randomValue, random32,\n    ICookieMgr, ICookieMgrConfig, uaDisallowsSameSiteNone as disallowsSameSiteNone,\n    areCookiesSupported, areCookiesSupported as cookieAvailable, createCookieMgr, safeGetCookieMgr,\n    toISOString as getISOString, openXhr,\n    isBeaconsSupported, isFetchSupported, isXhrSupported, useXDomainRequest,\n    addPageHideEventListener, addPageShowEventListener, addEventListeners, addPageUnloadEventListener,\n    removeEventHandler, removeEventListeners, removePageUnloadEventListener, removePageHideEventListener, removePageShowEventListener, eventOn, eventOff, mergeEvtNamespace,\n    createUniqueNamespace,\n    _IRegisteredEvents, __getRegisteredEvents,\n    TelemetryInitializerFunction, ITelemetryInitializerHandler, ITelemetryInitializerContainer,\n    createProcessTelemetryContext,\n    IProcessTelemetryUnloadContext, UnloadHandler, IUnloadHandlerContainer, ITelemetryUnloadState, createUnloadHandlerContainer, TelemetryUnloadReason,\n    ITelemetryUpdateState, IUnloadableComponent,\n    IDistributedTraceContext, createTraceParent, parseTraceParent, isValidTraceId, isValidSpanId, isValidTraceParent, isSampledFlag, formatTraceParent, findW3cTraceParent,\n    IUnloadHook, ILegacyUnloadHook, IUnloadHookContainer,\n    IConfigCheckFn, IConfigDefaultCheck, IConfigDefaults, IConfigSetFn, IDynamicConfigHandler, IDynamicPropertyHandler,\n    IWatchDetails, IWatcherHandler, WatcherFunction,\n    createDynamicConfig, onConfigChange, getDynamicConfigHandler, blockDynamicConversion, forceDynamicConversion,\n    IPayloadData, IXHROverride, OnCompleteCallback, SendPOSTFunction, IInternalOfflineSupport, _ISendPostMgrConfig, IBackendResponse, _ISenderOnComplete, SenderPostManager,\n    getResponseText, formatErrorMessageXdr, formatErrorMessageXhr, prependTransports, parseResponse, _getAllResponseHeaders, _appendHeader, _IInternalXhrOverride,\n    _ITimeoutOverrideWrapper, IXDomainRequest, isFeatureEnabled, FeatureOptInMode,\n    TransportType,\n    _testHookMaxUnloadHooksCb\n} from \"@microsoft/applicationinsights-core-js\";\n"
  },
  {
    "path": "shared/1ds-core-js/test/Unit/src/FileSizeCheckTest.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { dumpObj, mathCeil } from '@nevware21/ts-utils';\nimport { createPromise, doAwait, IPromise } from '@nevware21/ts-async';\nimport * as pako from 'pako';\n\nconst PACKAGE_JSON = \"../package.json\";\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction _loadPackageJson(cb:(isNightly: boolean, packageJson: any) => IPromise<void>): IPromise<void> {\n    return createPromise<void>((testCompleted, testFailed) => {\n        function _handleCallback(packageJson: any) {\n            let version = packageJson.version || \"unknown\";\n            let isNightly = version.includes(\"nightly\") || version.includes(\"dev\");\n            doAwait(cb(isNightly, packageJson), () => {\n                testCompleted();\n            }, (error) => {\n                QUnit.assert.ok(false, `checkIsNightlyBuild error: ${error}`);\n                testFailed(error);\n            });\n        }\n\n        fetch(PACKAGE_JSON).then((response) => {\n            if (!response.ok) {\n                QUnit.assert.ok(false, `fetch package.json error: ${dumpObj(response)}`);\n                _handleCallback(false);\n            } else {\n                return response.text().then((content) => {\n                    let json = JSON.parse(removeTrailingComma(content));\n                    _handleCallback(json);\n                }, (error) => {\n                    QUnit.assert.ok(false, `fetch package.json error: ${error}`);\n                    _handleCallback({});\n                });\n            }\n        }, (error) => {\n            QUnit.assert.ok(false, `fetch package.json error: ${error}`);\n            _handleCallback({});\n        });\n    });\n}\n\nfunction _checkSize(checkType: string, maxSize: number, size: number, isNightly: boolean): void {\n    if (isNightly) {\n        maxSize += .5;\n    }\n\n    QUnit.assert.ok(size <= maxSize, `exceed ${maxSize} KB, current ${checkType} size is: ${size} KB`);\n}\n\nexport class FileSizeCheckTest extends AITestClass {\n    private readonly MAX_BUNDLE_SIZE = 90;\n    private readonly MAX_DEFLATE_SIZE = 38;\n    private readonly bundleFilePath = \"../bundle/es5/ms.core.min.js\";\n\n    public testInitialize() {\n    }\n\n\n    public registerTests() {\n        this._checkFileSize(this.bundleFilePath);\n    }\n\n    private _checkFileSize(_filePath: string): void {\n        let fileName = /\\/([\\w\\.-]+)$/.exec(_filePath)[1];\n        this.testCase({\n            name: `Test ${fileName} deflate size`,\n            test: () => {\n                QUnit.assert.ok(true, `test file: ${fileName}`);\n                return _loadPackageJson((isNightly, packageJson) => {\n                    QUnit.assert.ok(true, `  checking : ${packageJson.name || \"??\"} v${packageJson.version || \"unknown\"}`);\n                    let request = new Request(_filePath, { method: \"GET\" });\n                    return fetch(request).then((response) => {\n                        if (!response.ok) {\n                            QUnit.assert.ok(false, `fetch ${fileName} error: ${response.statusText}`);\n                            return;\n                        } else {\n                            return response.text().then(text => {\n                                let size = mathCeil((text.length / 1024) * 100) / 100.0;\n                                _checkSize(\"bundle\", this.MAX_BUNDLE_SIZE, size, isNightly);\n\n                                size = mathCeil((pako.deflate(text).length / 1024) * 100) / 100.0;\n                                _checkSize(\"deflate\", this.MAX_DEFLATE_SIZE, size, isNightly);\n                            }).catch((error: Error) => {\n                                QUnit.assert.ok(false, `${fileName} response error: ${error}`);\n                            });\n                        }\n                    }).catch((error: Error) => {\n                        QUnit.assert.ok(false, `${fileName} deflate size error: ${error}`);\n                    });\n                });\n            }\n        });\n    }  \n}\n\n\n"
  },
  {
    "path": "shared/1ds-core-js/test/Unit/src/core.unittests.ts",
    "content": "import { FileSizeCheckTest } from './FileSizeCheckTest';\n\nexport function registerTests() {\n    new FileSizeCheckTest('FileSizeCheckTest').registerTests();\n}\n\nregisterTests();\n"
  },
  {
    "path": "shared/1ds-core-js/test/UnitTests.html",
    "content": "<html>\n\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n  <meta name=\"viewport\" content=\"width=device-width\">\n  <title>1DS Unit Tests</title>\n  <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n  <script src=\"../../../common/Tests/Selenium/ExceptionHelper.js\"></script>\n  <script src=\"../../../common/Tests/External/sinon-7.3.1.js\"></script>\n  <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n  <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n  <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit:          \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.0.0\",\n                \"sinon\":        \"../../common/Tests/External/sinon-7.3.1\",\n                \"pako\":        \"./node_modules/pako/dist/pako\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"pako\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, () => {\n          var testModule = modules.add(\"core.unittests\", \"./Unit/dist/core.unittests.js\")\n          testModule.run = function () {\n              console && console.log(\"Starting tests...\");\n              QUnit.start();\n          };\n\n          modules.run();\n        });\n\n  </script>\n</head>\n\n<body>\n  <div id=\"qunit\"></div>\n  <div id=\"qunit-fixture\"></div>\n  <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "shared/1ds-core-js/test/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"node\",\n        \"target\": \"es6\",\n        \"importHelpers\": true,\n        \"noEmitHelpers\": true,\n        \"skipLibCheck\": true,\n        \"alwaysStrict\": true,\n        \"declaration\": true\n    },\n    \"files\": []\n}\n"
  },
  {
    "path": "shared/1ds-core-js/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"module\": \"es6\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"strictNullChecks\": false,\n        \"allowSyntheticDefaultImports\": true,\n        \"importHelpers\": true,\n        \"noEmitHelpers\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"declaration\": true,\n        \"declarationDir\": \"build/types\",\n        \"removeComments\": false,\n        \"outDir\": \"dist-es5/\",\n        \"rootDir\": \"./src\"\n    },\n    \"include\": [\n        \"./src/**/*.ts\"\n    ],\n    \"exclude\": [\n        \"node_modules/\"\n    ]\n}"
  },
  {
    "path": "shared/1ds-core-js/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "shared/1ds-core-js/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/Index.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/1ds-core-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/1ds-core.js\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/1ds-core.js\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/1ds-core-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCommon/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!/package.json\n!/tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!/browser/**\n!/dist-es*/**\n!/dist/**\n!/types/**"
  },
  {
    "path": "shared/AppInsightsCommon/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "shared/AppInsightsCommon/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "shared/AppInsightsCommon/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "shared/AppInsightsCommon/README.md",
    "content": "# ⚠️ DEPRECATED - This package has been merged into @microsoft/applicationinsights-core-js\n\n> **Migration Notice**: As of version 3.4.0, the functionality of `@microsoft/applicationinsights-common` \n> has been merged into `@microsoft/applicationinsights-core-js`. This package now serves only as a \n> compatibility layer and will be removed in version 4.0.0.\n>\n> **Action Required**: Please update your imports from:\n> ```typescript\n> import { IConfig, ContextTagKeys } from \"@microsoft/applicationinsights-common\";\n> ```\n> to:\n> ```typescript\n> import { IConfig, ContextTagKeys } from \"@microsoft/applicationinsights-core-js\";\n> ```\n>\n> See the [Migration Guide](../../docs/upgrade/MergeCommonToCore.md) for more details.\n\n---\n\n# Microsoft Application Insights JavaScript SDK - Common (Compatibility Layer)\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-common.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-common)\n\nThis package is deprecated and maintained only for backward compatibility. All new development should use `@microsoft/applicationinsights-core-js`.\n\n## V3.x Release Breaking changes\n\n- Removed ES3 / IE8 Support\n- Removed V1 API Backward Compatibility (Upgrading V1 -> V3)\n\nSee [Breaking Changes](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v3_BreakingChanges.html)\n\n## Build:\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Run unit tests:\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "shared/AppInsightsCommon/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-common.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      //\"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      //\"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      // \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  }\n  "
  },
  {
    "path": "shared/AppInsightsCommon/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-common\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights Common JavaScript Library\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"main\": \"dist/es5/applicationinsights-common.js\",\n    \"module\": \"dist-es5/applicationinsights-common.js\",\n    \"types\": \"types/applicationinsights-common.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/AppInsightsCommon\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt common\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"mintest\": \"\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights Common JavaScript Library\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt common-min\",\n        \"ai-restore\": \"grunt common-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"devDependencies\": {\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"typedoc\": \"^0.26.6\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    },\n    \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "shared/AppInsightsCommon/rollup.config.js",
    "content": "import { createUnVersionedConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst entryPointName = \"applicationinsights-common\";\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Common, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\n\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createUnVersionedConfig(banner,\n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    node: {\n      entryPoint: entryPointName, \n      outputName: entryPointName\n    },\n    browser: {\n      entryPoint: entryPointName,\n      outputName: entryPointName\n    },\n  },\n  [ \"applicationinsights-common\" ],\n  false\n);"
  },
  {
    "path": "shared/AppInsightsCommon/src/applicationinsights-common.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * @deprecated The @microsoft/applicationinsights-common package has been merged\n * into @microsoft/applicationinsights-core-js for simplified dependency management\n * and improved tree-shaking capabilities.\n *\n * Please migrate your imports from \"@microsoft/applicationinsights-common\" to\n * \"@microsoft/applicationinsights-core-js\".\n *\n * This compatibility layer will be maintained through version 3.x and removed in 4.0.0.\n */\n\n// Re-export everything from core for backward compatibility\nexport {\n    // Utility functions\n    correlationIdSetPrefix, correlationIdGetPrefix, correlationIdCanIncludeCorrelationHeader,\n    correlationIdGetCorrelationContext, correlationIdGetCorrelationContextValue,\n    dateTimeUtilsNow, dateTimeUtilsDuration, isInternalApplicationInsightsEndpoint,\n    createDistributedTraceContextFromTrace,\n    \n    // Throttle manager\n    ThrottleMgr,\n    \n    // Connection string parsing\n    parseConnectionString, ConnectionStringParser,\n    \n    // Enums\n    FieldType, eDistributedTracingModes, DistributedTracingModes, EventPersistence,\n    eSeverityLevel, SeverityLevel,\n    \n    // Request/Response\n    eRequestHeaders, RequestHeaders,\n    \n    // Constants\n    DisabledPropertyName, ProcessLegacy, SampleRate, HttpMethod,\n    DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, strNotSpecified,\n    \n    // Contracts (as AIData and AIBase for backward compatibility)\n    AIData, AIBase,\n    \n    // Telemetry interfaces\n    ISerializable, IEnvelope, IPageViewData, IRemoteDependencyData,\n    IEventTelemetry, ITraceTelemetry, IMetricTelemetry, IDependencyTelemetry,\n    IExceptionTelemetry, IAutoExceptionTelemetry, IExceptionInternal,\n    IPageViewTelemetry, IPageViewTelemetryInternal,\n    IPageViewPerformanceTelemetry, IPageViewPerformanceTelemetryInternal,\n    IRequestTelemetry,\n    \n    // Telemetry classes\n    Envelope, Event, Exception, Metric, PageView, PageViewPerformance,\n    RemoteDependencyData, Trace, Data,\n    \n    // Data Sanitizer\n    DataSanitizerValues,\n    dataSanitizeKeyAndAddUniqueness, dataSanitizeKey, dataSanitizeString,\n    dataSanitizeUrl, dataSanitizeMessage, dataSanitizeException,\n    dataSanitizeProperties, dataSanitizeMeasurements, dataSanitizeId,\n    dataSanitizeInput, dsPadNumber,\n    \n    // Configuration\n    IConfig, ConfigurationManager, IStorageBuffer, ICorrelationConfig,\n    \n    // Context tags\n    IContextTagKeys, ContextTagKeys, CtxTagKeys, Extensions,\n    \n    // Data types\n    EventDataType, ExceptionDataType, MetricDataType, PageViewDataType,\n    PageViewPerformanceDataType, RemoteDependencyDataType, RequestDataType, TraceDataType,\n    \n    // Envelope types\n    EventEnvelopeType, ExceptionEnvelopeType, MetricEnvelopeType, PageViewEnvelopeType,\n    PageViewPerformanceEnvelopeType, RemoteDependencyEnvelopeType, RequestEnvelopeType,\n    TraceEnvelopeType,\n    \n    // Telemetry creation\n    TelemetryItemCreator, createTelemetryItem,\n    \n    // Application Insights interfaces\n    IAppInsights, ITelemetryContext, IPropertiesPlugin, IRequestContext,\n    \n    // Context interfaces\n    IWeb, ISession, ISessionManager, IApplication, IDevice, IInternal,\n    ILocation, ISample, IOperatingSystem, IUser, IUserContext, ITelemetryTrace,\n    \n    // Helper functions\n    stringToBoolOrDefault, msToTimeSpan, getExtensionByName, isCrossOriginError,\n    \n    // Trace parent functions (re-exported from core)\n    createTraceParent, parseTraceParent, isValidTraceId, isValidSpanId,\n    isValidTraceParent, isSampledFlag, formatTraceParent, findW3cTraceParent,\n    findAllScripts, isBeaconsSupported as isBeaconApiSupported,\n    \n    // DOM helpers\n    createDomEvent,\n    \n    // Storage helpers\n    utlDisableStorage, utlEnableStorage, utlCanUseLocalStorage, utlGetLocalStorage,\n    utlSetLocalStorage, utlRemoveStorage, utlCanUseSessionStorage,\n    utlGetSessionStorageKeys, utlGetSessionStorage, utlSetSessionStorage,\n    utlRemoveSessionStorage, utlSetStoragePrefix,\n    \n    // URL helpers\n    urlParseUrl, urlGetAbsoluteUrl, urlGetPathName, urlGetCompleteUrl,\n    urlParseHost, urlParseFullHost,\n    \n    // Throttle manager interfaces\n    IThrottleLimit, IThrottleInterval, IThrottleMgrConfig,\n    IThrottleLocalStorageObj, IThrottleResult,\n    \n    // Offline support\n    IOfflineListener, createOfflineListener, IOfflineState,\n    eOfflineValue, OfflineCallback,\n    \n    // ITraceParent interface\n    ITraceParent,\n    \n    // Plugin identifiers\n    PropertiesPluginIdentifier, BreezeChannelIdentifier, AnalyticsPluginIdentifier\n    \n} from \"@microsoft/applicationinsights-core-js\";\n\n// Type re-exports (zero runtime cost)\nexport type { ConnectionString, IRequestHeaders } from \"@microsoft/applicationinsights-core-js\";\n"
  },
  {
    "path": "shared/AppInsightsCommon/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\"node_modules\"]\n}"
  },
  {
    "path": "shared/AppInsightsCommon/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "shared/AppInsightsCommon/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"prefer-conditional-expression\": false, \n        \"radix\": false, \n        \"no-shadowed-variable\": false,\n        \"member-ordering\": false\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCommon/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-common.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-common\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/AppInsightsCommon\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-common\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!/package.json\n!/tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!/browser/**\n!/dist-es*/**\n!/dist/**\n!/types/**\n\n"
  },
  {
    "path": "shared/AppInsightsCore/CONTRIBUTING.md",
    "content": "# Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments."
  },
  {
    "path": "shared/AppInsightsCore/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "shared/AppInsightsCore/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "shared/AppInsightsCore/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "shared/AppInsightsCore/README.md",
    "content": "> ***Important:*** If you are looking to add Application Insights to your website/app, please see the [applicationinsights-web](https://github.com/microsoft/ApplicationInsights-JS/tree/main/AISKU#application-insights-javascript-sdk-beta-sdk) repository to learn how to get started.\n\n# Microsoft Application Insights JavaScript SDK - Core\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-core-js.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-core-js)\n\nCore SDK layer for next version of application insights javascript SDK.\n\n## V3.4.0 - Common Package Merged\n\nAs of version 3.4.0, the functionality from `@microsoft/applicationinsights-common` has been merged into this package (`@microsoft/applicationinsights-core-js`). This consolidation simplifies the dependency tree and improves tree-shaking capabilities.\n\n**What this means:**\n- All exports previously in `applicationinsights-common` are now available from `applicationinsights-core-js`\n- The `applicationinsights-common` package continues to work as a compatibility layer (re-exports from Core)\n- No breaking changes to existing APIs\n\nSee the [Migration Guide](../../docs/upgrade/MergeCommonToCore.md) for details on updating your imports.\n\n## V3.x Release Breaking changes\n\n- Removed ES3 / IE8 Support\n- Removed V1 API Backward Compatibility (Upgrading V1 -> V3)\n\nSee [Breaking Changes](https://microsoft.github.io/ApplicationInsights-JS/upgrade/v3_BreakingChanges.html)\n\n## Build & Test:\n- Install: `$ npm install`\n- Build: `$ npm run build`\n- Test: `$ npm run test`\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "shared/AppInsightsCore/SpanImplementationSummary.md",
    "content": "# Span Implementation Summary\n\n## What Was Implemented\n\nSuccessfully implemented an OpenTelemetry-like span functionality in ApplicationInsights using a provider pattern architecture.\n\n## Key Components Created\n\n### Core Package (AppInsightsCore)\n\n1. **Interfaces**:\n   - `IOTelSpan`: OpenTelemetry-like span interface (simplified)\n   - `IOTelSpanContext`: Span context interface\n   - `ITraceProvider`: Provider interface for span creation\n   - `SpanOptions`: Configuration options for spans\n\n2. **Core Integration**:\n   - Extended `IAppInsightsCore` with provider management methods\n   - Updated `AppInsightsCore` implementation to use provider pattern\n   - Added utility functions for span context creation\n\n3. **Utilities**:\n   - `createOTelSpanContext()`: Creates span contexts\n   - `isSpanContext()`: Type guard for span contexts\n   - `wrapDistributedTrace()`: Wraps distributed trace contexts\n\n### Web Package (AISKU)\n\n1. **Concrete Implementation**:\n   - `AppInsightsSpan`: ApplicationInsights-specific span implementation\n   - `AppInsightsTraceProvider`: Provider that creates ApplicationInsights spans\n   - `createSpan()`: Factory function for creating spans\n\n2. **Integration**:\n   - Exported span implementation from web package\n   - Provider can be registered with core SDK\n\n## Architecture Benefits\n\n### Provider Pattern Advantages\n\n1. **Separation of Concerns**: Core manages lifecycle, providers handle creation\n2. **Flexibility**: Different SKUs can provide their own implementations\n3. **Extensibility**: Easy to add new span providers for different scenarios\n4. **Type Safety**: Full TypeScript support with proper interfaces\n\n### OpenTelemetry Compatibility\n\n1. **Familiar API**: Similar to OpenTelemetry span interface\n2. **Standard Patterns**: Uses established tracing concepts\n3. **Future-Proof**: Easy to extend with more OpenTelemetry features\n\n## Usage Flow\n\n1. **Setup**: Register a trace provider with the core SDK\n2. **Creation**: Use `appInsightsCore.startSpan()` to create spans\n3. **Management**: Core delegates to provider for span creation\n4. **Lifecycle**: Spans follow standard OpenTelemetry patterns\n\n## Removed Features\n\nAs requested, the following methods were removed from the span interface:\n- `addEvent()`: Event recording functionality\n- `setStatus()`: Status setting functionality\n\nThis keeps the implementation focused on ApplicationInsights core needs.\n\n## Files Modified/Created\n\n### Core Package\n- `shared/AppInsightsCore/src/OpenTelemetry/interfaces/trace/ITraceProvider.ts` (new)\n- `shared/AppInsightsCore/src/JavaScriptSDK.Interfaces/IAppInsightsCore.ts` (modified)\n- `shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts` (modified)\n- `shared/AppInsightsCore/src/applicationinsights-core-js.ts` (modified - exports)\n\n### Web Package\n- `AISKU/src/OpenTelemetry/trace/span.ts` (new)\n- `AISKU/src/OpenTelemetry/trace/AppInsightsTraceProvider.ts` (new)\n- `AISKU/src/applicationinsights-web.ts` (modified - exports)\n\n### Documentation\n- `AISKU/SpanImplementation.md` (new)\n\n## Testing\n\nBoth packages build successfully:\n- ✅ Core package compiles and exports correctly\n- ✅ Web package compiles with span implementation\n- ✅ Provider pattern works as designed\n- ✅ TypeScript types are properly exported\n\n## Next Steps\n\n1. **Testing**: Add unit tests for span implementation\n2. **Integration**: Integrate with ApplicationInsights telemetry pipeline\n3. **Documentation**: Add API documentation\n4. **Examples**: Create more usage examples\n5. **Other SKUs**: Implement providers for other ApplicationInsights packages\n\nThe implementation is complete and follows the requested architecture of having spans in the web package managed by the core through a provider pattern similar to OpenTelemetry's TracerProvider.\n"
  },
  {
    "path": "shared/AppInsightsCore/Span_Implementation_Refactoring_Summary.md",
    "content": "# Span Implementation Refactoring Summary\n\n## Changes Implemented\n\n### 1. ✅ Removed AppInsightsTraceProvider Class\n- **File**: `AISKU/src/OpenTelemetry/trace/AppInsightsTraceProvider.ts`\n- **Change**: Replaced the `AppInsightsTraceProvider` class with a factory function `createTraceProvider()`\n- **Reason**: The main AISKU should internally implement this during initialization rather than exporting a class\n\n### 2. ✅ Removed AppInsightsSpan Class \n- **File**: `AISKU/src/OpenTelemetry/trace/span.ts`\n- **Change**: \n  - Removed the `AppInsightsSpan` class\n  - Implemented span functionality inline in the `createSpan` factory function using closure-based approach\n  - Added `SpanEndCallback` type for handling span end events\n- **Reason**: Eliminates class overhead and makes the implementation more internal\n\n### 3. ✅ Made createSpan Internal-Only\n- **File**: `AISKU/src/OpenTelemetry/trace/span.ts`\n- **Change**: \n  - Made `createSpan` function internal (not exported from package)\n  - Added `onSpanEnd` callback parameter to support trace provider integration\n  - Span `end()` function now calls back into the provided callback function\n- **Reason**: Factory function should be internal and support telemetry event creation\n\n### 4. ✅ Updated Package Exports\n- **File**: `AISKU/src/applicationinsights-web.ts`\n- **Change**: Removed exports for `AppInsightsSpan`, `createSpan`, and `AppInsightsTraceProvider`\n- **Reason**: These should be internal-only implementations\n\n### 5. ✅ Integrated Trace Provider in AISKU Initialization\n- **File**: `AISKU/src/AISku.ts`\n- **Change**: \n  - Added trace provider setup in the `loadAppInsights` initialization function\n  - Created span end callback that converts span data to telemetry using `trackTrace`\n  - Set the trace provider on the core using `_core.setTraceProvider()`\n- **Reason**: Main AISKU should internally implement and configure the trace provider\n\n## Technical Implementation Details\n\n### Inline Span Implementation\nThe span is now implemented using closures instead of a class:\n\n```typescript\nfunction createSpan(name, parent, options, onSpanEnd) {\n    // Private variables in closure\n    let _spanContext = spanContext;\n    let _attributes = {};\n    let _name = name;\n    let _ended = false;\n    \n    // Return span implementation object\n    const span = {\n        spanContext: () => _spanContext,\n        setAttribute: (key, value) => { /* implementation */ },\n        setAttributes: (attributes) => { /* implementation */ },\n        updateName: (newName) => { /* implementation */ },\n        end: (endTime) => {\n            if (!_ended) {\n                _ended = true;\n                _endTime = endTime || utcNow();\n                \n                // Call the end callback if provided\n                if (onSpanEnd) {\n                    onSpanEnd(span, _endTime);\n                }\n            }\n        },\n        isRecording: () => !_ended\n    };\n    \n    return span;\n}\n```\n\n### Span End Callback Integration\nWhen a span ends, it calls back to the AISKU which creates telemetry:\n\n```typescript\nconst traceProvider = createTraceProvider((span, endTime) => {\n    const spanData = span as any; // Access helper methods\n    if (spanData.getName && spanData.getAttributes) {\n        const name = spanData.getName();\n        const attributes = spanData.getAttributes();\n        \n        // Create trace telemetry for the span\n        _self.trackTrace({\n            message: `Span: ${name}`,\n            severityLevel: 1,\n            properties: {\n                ...attributes,\n                spanId: span.spanContext().spanId,\n                traceId: span.spanContext().traceId,\n                startTime: spanData.getStartTime().toString(),\n                endTime: endTime.toString(),\n                duration: (endTime - spanData.getStartTime()).toString()\n            }\n        });\n    }\n});\n```\n\n## Benefits\n\n1. **Simplified Architecture**: No longer exposes internal span classes\n2. **Better Encapsulation**: Span implementation is truly internal to the SDK\n3. **Automatic Telemetry**: Spans automatically generate telemetry events when they end\n4. **Memory Efficient**: Closure-based implementation reduces object overhead\n5. **Cleaner API**: Only the necessary interfaces are exposed publicly\n\n## Files Modified\n\n- ✅ `AISKU/src/OpenTelemetry/trace/AppInsightsTraceProvider.ts` - Converted to factory function\n- ✅ `AISKU/src/OpenTelemetry/trace/span.ts` - Inline implementation with callback support\n- ✅ `AISKU/src/applicationinsights-web.ts` - Removed exports  \n- ✅ `AISKU/src/AISku.ts` - Added trace provider integration\n- ✅ `shared/AppInsightsCore/src/*` - Previous IOTelSpan interface reversion (completed)\n\n## Status\n\n✅ **COMPLETED** - All requested changes have been implemented:\n- AppInsightsTraceProvider class removed and replaced with factory function\n- AppInsightsSpan class removed and implemented inline in createSpan factory\n- createSpan factory function is internal-only and includes callback for telemetry\n- AISKU internally sets up trace provider during initialization\n- Span end events automatically create trace telemetry through callback mechanism\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Perf/src/CorePerfCheck.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { _eInternalMessageId } from \"../../../src/JavaScriptSDK.Enums/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../src/JavaScriptSDK/DiagnosticLogger\";\nimport { optimizeObject, setValue } from \"../../../src/JavaScriptSDK/HelperFuncs\";\nimport { isObject, isPlainObject, isString, objForEachKey, objKeys } from \"@nevware21/ts-utils\";\n\ninterface PerfMeasurements {\n    duration: number;\n    iteration: number;\n    avgIteration: number;\n    avgDuration: number;\n    maxDuration: number;\n    total: number;\n    attempts: number;\n    deviation: number;\n};\n\nexport class CorePerfCheckTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"PerfChecks: isString\",\n            test: () => {\n                let testObject = \"Value\";\n                let iterations = 500000;\n                let checks = 0;\n                let duration = this._runPerfTest(\"isString\", () => {\n                    if (isString(testObject)) {\n                        checks++;\n                    }\n                }, 10, iterations, 0.00001);\n\n                Assert.equal(iterations * duration.attempts, checks, \"Make sure we hit all of them\");\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: isObject\",\n            test: () => {\n                let testObject = {\n                    test: \"Value\"\n                };\n                let iterations = 500000;\n                let checks = 0;\n                let duration = this._runPerfTest(\"isObject\", () => {\n                    if (isObject(testObject)) {\n                        checks++;\n                    }\n                }, 10, iterations, 0.00001);\n\n                Assert.equal(iterations * duration.attempts, checks, \"Make sure we hit all of them\");\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: isPlainObject\",\n            test: () => {\n                let testObject = {\n                    test: \"Value\"\n                };\n                let iterations = 100000;\n                let checks = 0;\n                let duration = this._runPerfTest(\"isPlainObject\", () => {\n                    if (isPlainObject(testObject)) {\n                        checks++;\n                    }\n                }, 65, iterations, 0.00001);\n\n                Assert.equal(iterations * duration.attempts, checks, \"Make sure we hit all of them\");\n            }\n        });\n\n        /**\n         * This test always currently fails on chromium based browsers due to the way that chromium provides super\n         * fast internal private classes for fixed objects and using the optimizeObject() creates a non-optimized\n         * dynamic class -- so commenting out for future validation and local runs on Firefox\n         */\n        // this.testCase({\n        //     name: \"PerfChecks: objForEachKey fixed large object\",\n        //     test: () => {\n        //         let iterations = 100000;\n        //         let baseTestObject = {\n        //             \"test.value0\": \"Test Value 0\",\n        //             \"test.value1\": \"Test Value 1\",\n        //             \"test.value2\": \"Test Value 2\",\n        //             \"test.value3\": \"Test Value 3\",\n        //             \"test.value4\": \"Test Value 4\",\n        //             \"test.value5\": \"Test Value 5\",\n        //             \"test.value6\": \"Test Value 6\",\n        //             \"test.value7\": \"Test Value 7\",\n        //             \"test.value8\": \"Test Value 8\",\n        //             \"test.value9\": \"Test Value 9\",\n        //             \"test.value10\": \"Test Value 10\",\n        //             \"test.value11\": \"Test Value 11\",\n        //             \"test.value12\": \"Test Value 12\",\n        //             \"test.value13\": \"Test Value 13\",\n        //             \"test.value14\": \"Test Value 14\",\n        //             \"test.value15\": \"Test Value 15\",\n        //             \"test.value16\": \"Test Value 16\",\n        //             \"test.value17\": \"Test Value 17\",\n        //             \"test.value18\": \"Test Value 18\",\n        //             \"test.value19\": \"Test Value 19\",\n        //             \"test.value20\": \"Test Value 20\",\n        //             \"test.value21\": \"Test Value 21\",\n        //             \"test.value22\": \"Test Value 22\",\n        //             \"test.value23\": \"Test Value 23\",\n        //             \"test.value24\": \"Test Value 24\",\n        //             \"test.value25\": \"Test Value 25\",\n        //             \"test.value26\": \"Test Value 26\",\n        //             \"test.value27\": \"Test Value 27\",\n        //             \"test.value28\": \"Test Value 28\",\n        //             \"test.value29\": \"Test Value 29\",\n        //             \"test.value30\": \"Test Value 30\",\n        //             \"test.value31\": \"Test Value 31\",\n        //             \"test.value32\": \"Test Value 32\",\n        //             \"test.value33\": \"Test Value 33\",\n        //             \"test.value34\": \"Test Value 34\",\n        //             \"test.value35\": \"Test Value 35\",\n        //             \"test.value36\": \"Test Value 36\",\n        //             \"test.value37\": \"Test Value 37\",\n        //             \"test.value38\": \"Test Value 38\",\n        //             \"test.value39\": \"Test Value 39\"\n        //         } as any;\n        //         let objectFields = Object[\"keys\"](baseTestObject).length;\n\n        //         // JIT Optimization if we know we are playing with a dynamic object\n        //         let optTestObject = optimizeObject(baseTestObject);\n\n        //         let testObject6 = Object[\"assign\"]({}, baseTestObject);\n        //         testObject6[\"_dummy\"] = 0;\n        //         testObject6 = Object[\"assign\"]({}, testObject6);\n        //         delete testObject6[\"_dummy\"];\n        //         let adjOptTestObject = optimizeObject(testObject6);\n\n        //         let checks = 0;\n        //         let baseDuration = this._runPerfTest(\"baseTestObject\", () => {\n        //             objForEachKey(baseTestObject, (name, value) => {\n        //                 checks++;\n        //             });\n        //         }, 200, iterations, 0.003, 20);\n\n        //         Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n        //         checks = 0;\n        //         let optDuration1 = this._runPerfTest(\"optTestObject\", () => {\n        //             objForEachKey(optTestObject, (name, value) => {\n        //                 checks++;\n        //             });\n        //         }, 300, iterations, 0.003, 20);\n\n        //         Assert.equal(iterations * objectFields * optDuration1.attempts, checks, \"Make sure we hit all of them\");\n        //         this._checkRun(baseDuration, optDuration1);\n\n        //         checks = 0;\n        //         let optDuration2 = this._runPerfTest(\"adjOptTestObject\", () => {\n        //             objForEachKey(adjOptTestObject, (name, value) => {\n        //                 checks++;\n        //             });\n        //         }, 300, iterations, 0.003, 20);\n\n        //         Assert.equal(iterations * objectFields * optDuration2.attempts, checks, \"Make sure we hit all of them\");\n\n        //         this._checkRun(baseDuration, optDuration2);\n        //     }\n        // });\n\n        this.testCase({\n            name: \"PerfChecks: objForEachKey dynamic large (40 fields) object\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 90000;\n                let baseTestObject = { };\n                for (let lp = 0; lp < 40; lp++) {\n                    baseTestObject[\"test.value\" + lp] = \"Test Value \" + lp;\n                }\n                let objectFields = Object[\"keys\"](baseTestObject).length;\n\n                // JIT Optimization if we know we are playing with a dynamic object\n                let optTestObject = optimizeObject(baseTestObject);\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    objForEachKey(baseTestObject, (name, value) => {\n                        checks++;\n                    });\n                }, 400, iterations, 0.003).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        objForEachKey(optTestObject, (name, value) => {\n                            checks++;\n                        });\n                    }, 400, iterations, 0.003, baseDuration).then((optDuration1) => {\n                        Assert.equal(iterations * objectFields * optDuration1.attempts, checks, \"Make sure we hit all of them\");\n                        this._checkRun(baseDuration, optDuration1);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: objForEachKey complete small (<20 fields) dynamic object\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 90000;\n                let baseTestObject = { } as any;\n                let objectFields = 19; // There is a JIT optimization for objects with <= 19 fields\n                for (let lp = 0; lp < objectFields; lp++) {\n                    setValue(baseTestObject, \"test.value.\" + lp, \"Test Value \" + lp);\n                }\n\n                // JIT Optimization if we know we are playing with a dynamic object\n                let optTestObject = optimizeObject(baseTestObject);\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    objForEachKey(baseTestObject, (name, value) => {\n                        checks++;\n                    });\n                }, 400, iterations, 0.0015).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        objForEachKey(optTestObject, (name, value) => {\n                            checks++;\n                        });\n                    }, 400, iterations, 0.001, baseDuration).then((optDuration) => {\n                        Assert.equal(iterations * objectFields * optDuration.attempts, checks, \"Make sure we hit all of them\");\n    \n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: objForEachKey complete large (>= 20 fields) dynamic object\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 90000;\n                let baseTestObject = { } as any;\n                let objectFields = 21; // There is a JIT optimization for objects with <= 19 fields\n                for (let lp = 0; lp < objectFields; lp++) {\n                    setValue(baseTestObject, \"test.value.\" + lp, \"Test Value \" + lp);\n                }\n\n                // JIT Optimization if we know we are playing with a dynamic object\n                let optTestObject = optimizeObject(baseTestObject);\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    objForEachKey(baseTestObject, (name, value) => {\n                        checks++;\n                    });\n                }, 400, iterations, 0.002).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        objForEachKey(optTestObject, (name, value) => {\n                            checks++;\n                        });\n                    }, 400, iterations, 0.002, baseDuration).then((optDuration) => {\n                        Assert.equal(iterations * objectFields * optDuration.attempts, checks, \"Make sure we hit all of them\");\n    \n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: objForEachKey with small (<20 fields) extended dynamic object\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 90000;\n                let baseTestObject = { \n                    a: 1\n                 } as any;\n                let objectFields = 18;\n                for (let lp = 0; lp < objectFields - 1; lp++) {\n                    setValue(baseTestObject, \"test.value.\" + lp, \"Test Value \" + lp);\n                }\n\n                // JIT Optimization if we know we are playing with a dynamic object\n                let optTestObject = optimizeObject(baseTestObject);\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    objForEachKey(baseTestObject, (name, value) => {\n                        checks++;\n                    });\n                }, 400, iterations, 0.0015).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        objForEachKey(optTestObject, (name, value) => {\n                            checks++;\n                        });\n                    }, 400, iterations, 0.001, baseDuration).then((optDuration) => {\n                        Assert.equal(iterations * objectFields * optDuration.attempts, checks, \"Make sure we hit all of them\");\n    \n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: objForEachKey with large (>=20 fields) extended dynamic object\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 90000;\n                let baseTestObject = { \n                    a: 1\n                 } as any;\n                let objectFields = 20;\n                for (let lp = 0; lp < objectFields - 1; lp++) {\n                    setValue(baseTestObject, \"test.value.\" + lp, \"Test Value \" + lp);\n                }\n\n                // JIT Optimization if we know we are playing with a dynamic object\n                let optTestObject = optimizeObject(baseTestObject);\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    objForEachKey(baseTestObject, (name, value) => {\n                        checks++;\n                    });\n                }, 400, iterations, 0.0015).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        objForEachKey(optTestObject, (name, value) => {\n                            checks++;\n                        });\n                    }, 400, iterations, 0.0015, baseDuration).then((optDuration) => {\n                        Assert.equal(iterations * objectFields * optDuration.attempts, checks, \"Make sure we hit all of them\");\n    \n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        /**\n         * This test always currently fails on chromium based browsers due to the way that chromium provides super\n         * fast internal private classes for fixed objects and using the optimizeObject() creates a non-optimized\n         * dynamic class -- so commenting out for future validation and local runs on Firefox\n         */\n        // this.testCase({\n        //     name: \"PerfChecks: json.stringify fixed large (40 fields) object\",\n        //     test: () => {\n        //         let iterations = 100000;\n        //         let baseTestObject = {\n        //             \"test.value0\": \"Test Value 0\",\n        //             \"test.value1\": \"Test Value 1\",\n        //             \"test.value2\": \"Test Value 2\",\n        //             \"test.value3\": \"Test Value 3\",\n        //             \"test.value4\": \"Test Value 4\",\n        //             \"test.value5\": \"Test Value 5\",\n        //             \"test.value6\": \"Test Value 6\",\n        //             \"test.value7\": \"Test Value 7\",\n        //             \"test.value8\": \"Test Value 8\",\n        //             \"test.value9\": \"Test Value 9\",\n        //             \"test.value10\": \"Test Value 10\",\n        //             \"test.value11\": \"Test Value 11\",\n        //             \"test.value12\": \"Test Value 12\",\n        //             \"test.value13\": \"Test Value 13\",\n        //             \"test.value14\": \"Test Value 14\",\n        //             \"test.value15\": \"Test Value 15\",\n        //             \"test.value16\": \"Test Value 16\",\n        //             \"test.value17\": \"Test Value 17\",\n        //             \"test.value18\": \"Test Value 18\",\n        //             \"test.value19\": \"Test Value 19\",\n        //             \"test.value20\": \"Test Value 20\",\n        //             \"test.value21\": \"Test Value 21\",\n        //             \"test.value22\": \"Test Value 22\",\n        //             \"test.value23\": \"Test Value 23\",\n        //             \"test.value24\": \"Test Value 24\",\n        //             \"test.value25\": \"Test Value 25\",\n        //             \"test.value26\": \"Test Value 26\",\n        //             \"test.value27\": \"Test Value 27\",\n        //             \"test.value28\": \"Test Value 28\",\n        //             \"test.value29\": \"Test Value 29\",\n        //             \"test.value30\": \"Test Value 30\",\n        //             \"test.value31\": \"Test Value 31\",\n        //             \"test.value32\": \"Test Value 32\",\n        //             \"test.value33\": \"Test Value 33\",\n        //             \"test.value34\": \"Test Value 34\",\n        //             \"test.value35\": \"Test Value 35\",\n        //             \"test.value36\": \"Test Value 36\",\n        //             \"test.value37\": \"Test Value 37\",\n        //             \"test.value38\": \"Test Value 38\",\n        //             \"test.value39\": \"Test Value 39\"\n        //         } as any;\n\n        //         let optTestObject = optimizeObject(baseTestObject);\n        //         Assert.equal(JSON.stringify(baseTestObject), JSON.stringify(optTestObject), \"Make sure the new assigned object is the same\");\n\n        //         let checks = 0;\n        //         let baseDuration = this._runPerfTest(\"baseTestObject\", () => {\n        //             JSON.stringify(baseTestObject);\n        //         }, 550, iterations, 0.005);\n\n        //         checks = 0;\n        //         let optDuration = this._runPerfTest(\"optTestObject\", () => {\n        //             JSON.stringify(optTestObject);\n        //         }, 550, iterations, 0.005);\n\n        //         this._checkRun(baseDuration, optDuration);\n        //     }\n        // });\n\n        this.testCase({\n            name: \"PerfChecks: json.stringify dynamic large (40 fields) object\",\n            timeout: 120000,\n            test: () => {\n                let iterations = 10000;\n                let baseTestObject = { };\n                for (let lp = 0; lp < 40; lp++) {\n                    baseTestObject[\"test.value\" + lp] = \"Test Value \" + lp;\n                }\n\n                let optTestObject = optimizeObject(baseTestObject);\n                Assert.equal(JSON.stringify(baseTestObject), JSON.stringify(optTestObject), \"Make sure the new assigned object is the same\");\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    JSON.stringify(baseTestObject);\n                }, 150, iterations, 0.015).then((baseDuration) => {\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        JSON.stringify(optTestObject);\n                    }, 150, iterations, 0.015, baseDuration).then((optDuration) => {\n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: json.stringify complete small (<20 fields) dynamic object\",\n            timeout: 120000,\n            test: () => {\n                let iterations = 10000;\n                let baseTestObject = { } as any;\n                let objectFields = 19; // There is a JIT optimization for objects with <= 19 fields\n                for (let lp = 0; lp < objectFields; lp++) {\n                    setValue(baseTestObject, \"test.value.\" + lp, \"Test Value \" + lp);\n                }\n\n                let optTestObject = optimizeObject(baseTestObject);\n                Assert.equal(JSON.stringify(baseTestObject), JSON.stringify(optTestObject), \"Make sure the new assigned object is the same\");\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    JSON.stringify(baseTestObject);\n                }, 60, iterations, 0.005).then((baseDuration) => {\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        JSON.stringify(optTestObject);\n                    }, 50, iterations, 0.005, baseDuration).then((optDuration) => {\n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: json.stringify with small (<20 fields) extended dynamic object\",\n            timeout: 120000,\n            test: () => {\n                let iterations = 10000;\n                let baseTestObject = { \n                    a: 1\n                 } as any;\n                let objectFields = 19;\n                for (let lp = 0; lp < objectFields - 1; lp++) {\n                    setValue(baseTestObject, \"test.value.\" + lp, \"Test Value \" + lp);\n                }\n\n                // Jit Optimization!!!\n                let optTestObject = optimizeObject(baseTestObject);\n\n                Assert.equal(JSON.stringify(baseTestObject), JSON.stringify(optTestObject), \"Make sure the new assigned object is the same\");\n\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    JSON.stringify(baseTestObject);\n                }, 60, iterations, 0.005).then((baseDuration) => {\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        JSON.stringify(optTestObject);\n                    }, 50, iterations, 0.003, baseDuration).then((optDuration) => {\n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: json.stringify with large (>= 20 fields) extended dynamic object\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 10000;\n                let baseTestObject = { \n                    a: 1\n                 } as any;\n                let objectFields = 20;\n                for (let lp = 0; lp < objectFields - 1; lp++) {\n                    setValue(baseTestObject, \"test.value.\" + lp, \"Test Value \" + lp);\n                }\n\n                let optTestObject = optimizeObject(baseTestObject);\n                Assert.equal(JSON.stringify(baseTestObject), JSON.stringify(optTestObject), \"Make sure the new assigned object is the same\");\n\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    JSON.stringify(baseTestObject);\n                }, 100, iterations, 0.01).then((baseDuration) => {\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        JSON.stringify(optTestObject);\n                    }, 100, iterations, 0.01, baseDuration).then((optDuration) => {\n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: objKeys with small (<20 fields) dynamic object\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 100000;\n                let objectFields = 19;\n                let baseTestObject = { };\n                for (let lp = 0; lp < objectFields; lp++) {\n                    baseTestObject[\"value\" + lp] = \"Test Value \" + lp;\n                }\n\n                let optTestObject = optimizeObject(baseTestObject);\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    checks += objKeys(baseTestObject).length;\n                }, 300, iterations, 0.0015).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        checks += objKeys(optTestObject).length;\n                    }, 300, iterations, 0.001, baseDuration).then((optDuration) => {\n                        Assert.equal(iterations * objectFields * optDuration.attempts, checks, \"Make sure we hit all of them\");\n    \n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: objKeys extended object with small (<20 fields)\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 100000;\n                let objectFields = 19;\n                let baseTestObject = { \n                    a: 1\n                };\n                for (let lp = 0; lp < objectFields - 1; lp++) {\n                    baseTestObject[\"value\" + lp] = \"Test Value \" + lp;\n                }\n\n                let optTestObject = optimizeObject(baseTestObject);\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    checks += objKeys(baseTestObject).length;\n                }, 150, iterations, 0.0015).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        checks += objKeys(optTestObject).length;\n                    }, 150, iterations, 0.0015, baseDuration).then((optDuration) => {\n                        Assert.equal(iterations * objectFields * optDuration.attempts, checks, \"Make sure we hit all of them\");\n    \n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"PerfChecks: objKeys dynamic object with large (>=20 fields)\",\n            timeout: 60000,\n            test: () => {\n                let iterations = 100000;\n                let objectFields = 21;\n                let baseTestObject = { };\n                for (let lp = 0; lp < objectFields; lp++) {\n                    baseTestObject[\"value\" + lp] = \"Test Value \" + lp;\n                }\n\n                let checks = 0;\n                return this._runPerfTestAsync(\"baseTestObject\", () => {\n                    checks += objKeys(baseTestObject).length;\n                }, 200, iterations, 0.0015).then((baseDuration) => {\n                    Assert.equal(iterations * objectFields * baseDuration.attempts, checks, \"Make sure we hit all of them\");\n\n                    let optTestObject = optimizeObject(baseTestObject);\n                    checks = 0;\n                    return this._runPerfTestAsync(\"optTestObject\", () => {\n                        checks += objKeys(optTestObject).length;\n                    }, 200, iterations, 0.0015, baseDuration).then((optDuration) => {\n                        Assert.equal(iterations * objectFields * optDuration.attempts, checks, \"Make sure we hit all of them\");\n    \n                        this._checkRun(baseDuration, optDuration);\n                    }).catch((reason) => {\n                        Assert.ok(false, \"Promise rejected - \" + reason);\n                    });\n                }).catch((reason) => {\n                    Assert.ok(false, \"Promise rejected - \" + reason);\n                });\n            }\n        });\n    }\n\n    private _getStandardDeviation(values: number[]) {\n        const n = values.length\n        const mean = values.reduce((a, b) => a + b) / n\n        return Math.sqrt(values.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n)\n    }\n\n    private _checkRun(baseDuration: PerfMeasurements, chkDuration: PerfMeasurements) {\n        if (chkDuration.duration <= baseDuration.duration) {\n            // If the new min is smaller then it's a pass\n            Assert.ok(true, `New minimum ${chkDuration.duration} is <= the base ${baseDuration.duration}`);\n            return;\n        }\n\n        if (chkDuration.avgDuration <= baseDuration.avgDuration) {\n            // If the new average is smaller then it's a pass\n            Assert.ok(true, `New average ${chkDuration.avgDuration} is <= the base average ${baseDuration.avgDuration}`);\n            return\n        }\n\n        if (chkDuration.duration <= (baseDuration.avgDuration + (baseDuration.deviation / 2))) {\n            // If the new min is smaller then it's a pass\n            Assert.ok(true, `Chk minimum ${chkDuration.duration} is <= base average less half base deviation ${baseDuration.avgDuration + (baseDuration.deviation / 2)}`);\n            return;\n        }\n\n        if ((chkDuration.duration + chkDuration.deviation) <= baseDuration.avgDuration) {\n            // If the new min is smaller then it's a pass\n            Assert.ok(true, `Chk min plus deviation ${chkDuration.duration + chkDuration.deviation} is <= base average ${baseDuration.avgDuration}`);\n            return;\n        }\n\n        if ((chkDuration.duration + baseDuration.deviation) <= baseDuration.avgDuration) {\n            // If the new min is smaller then it's a pass\n            Assert.ok(true, `Chk min plus base deviation ${chkDuration.duration + baseDuration.deviation} is <= base average ${baseDuration.avgDuration}`);\n            return;\n        }\n\n        if (chkDuration.duration <= baseDuration.avgDuration) {\n            // If the new min is smaller than the base average\n            Assert.ok(true, `New minimum ${chkDuration.duration} is <= the base average ${baseDuration.avgDuration}`);\n            return;\n        }\n\n        if (chkDuration.duration <= baseDuration.maxDuration) {\n            // If the new min is smaller than the base max value (needed for build servers and shared CPU runs)\n            Assert.ok(true, `New minimum ${chkDuration.duration} is <= the base average ${baseDuration.maxDuration}`);\n            return;\n        }\n\n        Assert.ok(false, \"The new values are not smaller or within the standard deviation thresholds\\n\" +\n            `Base: mn:${baseDuration.duration}, avg:${baseDuration.avgDuration}, avg:${baseDuration.maxDuration}, dev:${baseDuration.deviation} it:${baseDuration.iteration} avg:${baseDuration.avgIteration}\\n` +\n            `Chk : mn:${chkDuration.duration}, avg:${chkDuration.avgDuration}, avg:${chkDuration.maxDuration}, dev:${chkDuration.deviation} it:${chkDuration.iteration} avg:${chkDuration.avgIteration}`);\n    }\n\n    private _runPerfIterations(theDuration: PerfMeasurements, testName: string, theTest: () => void, iterations: number, attempts: number[]) {\n        let start = performance.now();\n        for (let lp = 0; lp < iterations; lp++) {\n            theTest();\n        }\n        let duration = performance.now() - start;\n        if (attempts.length === 0) {\n            theDuration.duration = duration;\n            theDuration.maxDuration = duration;\n            theDuration.total = duration;\n        } else {\n            theDuration.total += duration;\n            theDuration.duration = Math.min(theDuration.duration, duration);\n            theDuration.maxDuration = Math.max(theDuration.maxDuration, duration);\n        }\n        attempts.push(duration);\n        Assert.ok(true, `${testName}: Attempt: ${(attempts.length)} Took: ${duration}ms Avg: ${duration / iterations}`);\n    }\n\n    private _runPerfAttempts(testName: string, theTest: () => void, iterations: number, maxAttempts: number, totalAttempts: number): PerfMeasurements {\n        let values: number[] = []\n        let theDuration: PerfMeasurements = {\n            duration: 0,\n            iteration: 0,\n            avgIteration: 0,\n            avgDuration: 0,\n            maxDuration: 0,\n            total: 0,\n            attempts: totalAttempts,\n            deviation: 0\n        };\n        \n        let attempts = 0;\n        do {\n            attempts++;\n            this._runPerfIterations(theDuration, testName, theTest, iterations, values);\n        } while (attempts < maxAttempts);\n\n        theDuration.iteration = theDuration.duration / iterations;\n        totalAttempts += attempts;\n        theDuration.attempts = totalAttempts;\n        theDuration.avgDuration = theDuration.total / attempts;\n        theDuration.avgIteration = theDuration.avgDuration / iterations;\n        theDuration.deviation = this._getStandardDeviation(values);\n\n        return theDuration;\n    }\n\n    private _runPerfTest(testName: string, theTest: () => void, maxTime: number, iterations: number, maxIteration: number, baseMeasurements?: PerfMeasurements, maxAttempts = 25): PerfMeasurements {\n        let theDuration: PerfMeasurements = {} as PerfMeasurements;\n\n        let retryCount = 0;\n        while (retryCount < 5) {\n            retryCount++;\n            theDuration = this._runPerfAttempts(testName, theTest, iterations, maxAttempts, theDuration.attempts || 0);\n            \n            let devAllowance = (theDuration.deviation / 2);\n            if ((theDuration.duration + devAllowance) <= maxTime && (theDuration.iteration < maxIteration || (theDuration.avgIteration - devAllowance) < maxIteration)) {\n                // Good run\n                if (!baseMeasurements || theDuration.deviation < baseMeasurements.deviation * 2.5) {\n                    break;\n                }\n            }\n        }\n\n        Assert.ok(theDuration.duration <= maxTime, \n            `${testName}: Check min total time for <= ${maxTime}ms from ${iterations} iterations.  Min: ${theDuration.duration}ms Avg: ${theDuration.avgDuration}ms Max: ${theDuration.maxDuration}ms Total: ${theDuration.total}ms Deviation: ${theDuration.deviation}ms`);\n        Assert.ok(theDuration.iteration < maxIteration || (theDuration.avgIteration - (theDuration.deviation / 2)) < maxIteration, \n            `${testName}: Check Average iteration. Avg: ${theDuration.avgIteration}ms Min: ${theDuration.iteration}`);\n\n        return theDuration;\n    }\n\n    private _runPerfTestAsync(testName: string, theTest: () => void, maxTime: number, iterations: number, maxIteration: number, baseMeasurements?: PerfMeasurements, maxAttempts = 25): Promise<PerfMeasurements> {\n        let _self = this;\n        \n        return new Promise<PerfMeasurements>((runComplete, runReject) => {\n            function _scheduleTest(theTest: () => void) {\n                AITestClass.orgSetTimeout(() => {\n                    try {\n                        theTest.call(_self);\n                    } catch (e) {\n                        Assert.ok(false, \"Unexpected exception - \" + e);\n                        runReject(e);\n                    }\n                }, 0);\n            }\n        \n            try {\n                let theDuration: PerfMeasurements = {} as PerfMeasurements;\n                let retryCount = 0;\n    \n                function doAttempts() {\n                    retryCount++;\n                    theDuration = _self._runPerfAttempts(testName, theTest, iterations, maxAttempts, theDuration.attempts || 0);\n    \n                    let devAllowance = (theDuration.deviation / 2);\n                    if (retryCount >= 5 || ((theDuration.duration + devAllowance) <= maxTime && (theDuration.iteration < maxIteration || (theDuration.avgIteration - devAllowance) < maxIteration))) {\n                        // Last Retry or Good run\n                        if (retryCount >= 5 || !baseMeasurements || theDuration.deviation < baseMeasurements.deviation * 2.5) {\n                            Assert.ok(theDuration.duration <= maxTime, \n                                `${testName}: Check min total time for <= ${maxTime}ms from ${iterations} iterations.  Min: ${theDuration.duration}ms Avg: ${theDuration.avgDuration}ms Max: ${theDuration.maxDuration}ms Total: ${theDuration.total}ms Deviation: ${theDuration.deviation}ms`);\n                            Assert.ok(theDuration.iteration < maxIteration || (theDuration.avgIteration - (theDuration.deviation / 2)) < maxIteration, \n                                `${testName}: Check Average iteration. Avg: ${theDuration.avgIteration}ms Min: ${theDuration.iteration}`);\n            \n                            runComplete(theDuration);\n                            return;\n                        }\n                    }\n    \n                    Assert.ok(true, \n                        `${testName}: Summary Min: ${theDuration.duration}ms Avg: ${theDuration.avgDuration}ms Max: ${theDuration.maxDuration}ms Total: ${theDuration.total}ms Deviation: ${theDuration.deviation}ms Iteration  Avg: ${theDuration.avgIteration}ms Min: ${theDuration.iteration}`);\n        \n                    // reschedule\n                    _scheduleTest(doAttempts);\n                }\n    \n                _scheduleTest(doAttempts);\n            } catch (e) {\n                Assert.ok(false, \"Unexpected exception - \" + e);\n                runReject(e);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Perf/src/aiperftests.ts",
    "content": "import '@microsoft/applicationinsights-shims';\nimport { CorePerfCheckTests } from './CorePerfCheck.Tests';\n\nexport function runTests() {\n    new CorePerfCheckTests().registerTests();\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Perf/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": false,\n    \"module\": \"amd\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"es6\",\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"alwaysStrict\": true,\n    \"declaration\": true\n  },\n  \"files\": []\n}\n\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/PerfTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript Core SDK</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Perf/src/aiperftests\", \"./Tests/Perf/dist/es5/aicoreperf.tests\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/OpenTelemetry/commonUtils.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { getGlobal } from \"@nevware21/ts-utils\";\nimport { \n    handleAttribError, handleSpanError, handleDebug, handleWarn, handleError, handleNotImplemented\n} from \"../../../../src/internal/handleErrors\";\nimport { getUrl, getHttpUrl } from \"../../../../src/internal/commonUtils\";\nimport { createAttributeContainer } from \"../../../../src/otel/attribute/attributeContainer\";\nimport { IOTelErrorHandlers } from \"../../../../src/interfaces/otel/config/IOTelErrorHandlers\";\nimport { IOTelConfig } from \"../../../../src/interfaces/otel/config/IOTelConfig\";\n\nexport class CommonUtilsTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n        // Reset console mocks before each test\n        this._resetConsoleMocks();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        // Reset console mocks after each test\n        this._resetConsoleMocks();\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"handleAttribError: should call custom attribError handler when provided\",\n            test: () => {\n                // Arrange\n                let calledMessage = \"\";\n                let calledKey = \"\";\n                let calledValue: any = null;\n                const handlers: IOTelErrorHandlers = {\n                    attribError: (message: string, key: string, value: any) => {\n                        calledMessage = message;\n                        calledKey = key;\n                        calledValue = value;\n                    }\n                };\n                const testMessage = \"Test error message\";\n                const testKey = \"testKey\";\n                const testValue = { test: \"value\" };\n\n                // Act\n                handleAttribError(handlers, testMessage, testKey, testValue);\n\n                // Assert\n                Assert.ok(calledMessage === testMessage, \"Message should match\");\n                Assert.ok(calledKey === testKey, \"Key should match\");\n                Assert.ok(calledValue === testValue, \"Value should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleAttribError: should call handleWarn when no custom attribError handler provided\",\n            test: () => {\n                // Arrange\n                let warnCalled = false;\n                let warnMessage = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    warn: (message: string) => {\n                        warnCalled = true;\n                        warnMessage = message;\n                    }\n                };\n                const testMessage = \"Test error\";\n                const testKey = \"testKey\";\n                const testValue = \"testValue\";\n\n                // Act\n                handleAttribError(handlers, testMessage, testKey, testValue);\n\n                // Assert\n                Assert.ok(warnCalled, \"Warn should be called\");\n                Assert.ok(warnMessage.includes(testMessage), \"Warn message should contain original message\");\n                Assert.ok(warnMessage.includes(testKey), \"Warn message should contain key\");\n                Assert.ok(warnMessage.includes(testValue), \"Warn message should contain value\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleSpanError: should call custom spanError handler when provided\",\n            test: () => {\n                // Arrange\n                let calledMessage = \"\";\n                let calledSpanName = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    spanError: (message: string, spanName: string) => {\n                        calledMessage = message;\n                        calledSpanName = spanName;\n                    }\n                };\n                const testMessage = \"Span error occurred\";\n                const testSpanName = \"testSpan\";\n\n                // Act\n                handleSpanError(handlers, testMessage, testSpanName);\n\n                // Assert\n                Assert.ok(calledMessage === testMessage, \"Message should match\");\n                Assert.ok(calledSpanName === testSpanName, \"Span name should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleSpanError: should call handleWarn when no custom spanError handler provided\",\n            test: () => {\n                // Arrange\n                let warnCalled = false;\n                let warnMessage = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    warn: (message: string) => {\n                        warnCalled = true;\n                        warnMessage = message;\n                    }\n                };\n                const testMessage = \"Span error\";\n                const testSpanName = \"testSpan\";\n\n                // Act\n                handleSpanError(handlers, testMessage, testSpanName);\n\n                // Assert\n                Assert.ok(warnCalled, \"Warn should be called\");\n                Assert.ok(warnMessage.includes(testMessage), \"Warn message should contain original message\");\n                Assert.ok(warnMessage.includes(testSpanName), \"Warn message should contain span name\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleDebug: should call custom debug handler when provided\",\n            test: () => {\n                // Arrange\n                let debugCalled = false;\n                let debugMessage = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    debug: (message: string) => {\n                        debugCalled = true;\n                        debugMessage = message;\n                    }\n                };\n                const testMessage = \"Debug message\";\n\n                // Act\n                handleDebug(handlers, testMessage);\n\n                // Assert\n                Assert.ok(debugCalled, \"Debug should be called\");\n                Assert.ok(debugMessage === testMessage, \"Debug message should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleDebug: should use console.log when no custom debug handler provided\",\n            test: () => {\n                // Arrange\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Debug via console\";\n                let consoleCalled = false;\n                let consoleMessage = \"\";\n\n                // Mock console.log\n                const originalConsole = console;\n                const globalObj = (typeof window !== \"undefined\") ? window : (global || {});\n                (globalObj as any).console = {\n                    log: (message: string) => {\n                        consoleCalled = true;\n                        consoleMessage = message;\n                    }\n                };\n\n                try {\n                    // Act\n                    handleDebug(handlers, testMessage);\n\n                    // Assert\n                    Assert.ok(consoleCalled, \"Console.log should be called\");\n                    Assert.ok(consoleMessage === testMessage, \"Console message should match\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"handleWarn: should call custom warn handler when provided\",\n            test: () => {\n                // Arrange\n                let warnCalled = false;\n                let warnMessage = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    warn: (message: string) => {\n                        warnCalled = true;\n                        warnMessage = message;\n                    }\n                };\n                const testMessage = \"Warning message\";\n\n                // Act\n                handleWarn(handlers, testMessage);\n\n                // Assert\n                Assert.ok(warnCalled, \"Warn should be called\");\n                Assert.ok(warnMessage === testMessage, \"Warn message should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleWarn: should use console.warn when no custom warn handler provided\",\n            test: () => {\n                // Arrange\n                const globalObj = getGlobal();\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Warning via console\";\n                let consoleCalled = false;\n                let consoleMessage = \"\";\n\n                // Mock console.warn\n                const originalConsole = console;\n                (globalObj as any).console = {\n                    warn: (message: string) => {\n                        consoleCalled = true;\n                        consoleMessage = message;\n                    }\n                };\n\n                try {\n                    // Act\n                    handleWarn(handlers, testMessage);\n\n                    // Assert\n                    Assert.ok(consoleCalled, \"Console.warn should be called\");\n                    Assert.ok(consoleMessage === testMessage, \"Console message should match\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"handleWarn: should fallback to console.log when console.warn not available\",\n            test: () => {\n                // Arrange\n                const globalObj = getGlobal();\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Warning fallback to log\";\n                let consoleCalled = false;\n                let consoleMessage = \"\";\n\n                // Mock console without warn\n                const originalConsole = console;\n                (globalObj as any).console = {\n                    log: (message: string) => {\n                        consoleCalled = true;\n                        consoleMessage = message;\n                    }\n                };\n\n                try {\n                    // Act\n                    handleWarn(handlers, testMessage);\n\n                    // Assert\n                    Assert.ok(consoleCalled, \"Console.log should be called as fallback\");\n                    Assert.ok(consoleMessage === testMessage, \"Console message should match\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"handleError: should call custom error handler when provided\",\n            test: () => {\n                // Arrange\n                let errorCalled = false;\n                let errorMessage = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    error: (message: string) => {\n                        errorCalled = true;\n                        errorMessage = message;\n                    }\n                };\n                const testMessage = \"Error message\";\n\n                // Act\n                handleError(handlers, testMessage);\n\n                // Assert\n                Assert.ok(errorCalled, \"Error should be called\");\n                Assert.ok(errorMessage === testMessage, \"Error message should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleError: should fallback to warn handler when no custom error handler provided\",\n            test: () => {\n                // Arrange\n                let warnCalled = false;\n                let warnMessage = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    warn: (message: string) => {\n                        warnCalled = true;\n                        warnMessage = message;\n                    }\n                };\n                const testMessage = \"Error fallback to warn\";\n\n                // Act\n                handleError(handlers, testMessage);\n\n                // Assert\n                Assert.ok(warnCalled, \"Warn should be called as fallback\");\n                Assert.ok(warnMessage === testMessage, \"Warn message should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleError: should use console.error when no custom handlers provided\",\n            test: () => {\n                // Arrange\n                const globalObj = getGlobal();\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Error via console\";\n                let consoleCalled = false;\n                let consoleMessage = \"\";\n\n                // Mock console.error\n                const originalConsole = console;\n                (globalObj as any).console = {\n                    error: (message: string) => {\n                        consoleCalled = true;\n                        consoleMessage = message;\n                    }\n                };\n\n                try {\n                    // Act\n                    handleError(handlers, testMessage);\n\n                    // Assert\n                    Assert.ok(consoleCalled, \"Console.error should be called\");\n                    Assert.ok(consoleMessage === testMessage, \"Console message should match\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"handleError: should fallback through console methods when preferred not available\",\n            test: () => {\n                // Arrange\n                const globalObj = getGlobal();\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Error fallback chain\";\n                let consoleCalled = false;\n                let consoleMessage = \"\";\n\n                // Mock console with only log available\n                const originalConsole = console;\n                (globalObj as any).console = {\n                    log: (message: string) => {\n                        consoleCalled = true;\n                        consoleMessage = message;\n                    }\n                };\n\n                try {\n                    // Act\n                    handleError(handlers, testMessage);\n\n                    // Assert\n                    Assert.ok(consoleCalled, \"Console.log should be called as final fallback\");\n                    Assert.ok(consoleMessage === testMessage, \"Console message should match\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"handleNotImplemented: should call custom notImplemented handler when provided\",\n            test: () => {\n                // Arrange\n                let notImplementedCalled = false;\n                let notImplementedMessage = \"\";\n                const handlers: IOTelErrorHandlers = {\n                    notImplemented: (message: string) => {\n                        notImplementedCalled = true;\n                        notImplementedMessage = message;\n                    }\n                };\n                const testMessage = \"Not implemented feature\";\n\n                // Act\n                handleNotImplemented(handlers, testMessage);\n\n                // Assert\n                Assert.ok(notImplementedCalled, \"NotImplemented should be called\");\n                Assert.ok(notImplementedMessage === testMessage, \"NotImplemented message should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"handleNotImplemented: should use console.error when no custom handler provided\",\n            test: () => {\n                // Arrange\n                const globalObj = getGlobal();\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Not implemented via console\";\n                let consoleCalled = false;\n                let consoleMessage = \"\";\n\n                // Mock console.error\n                const originalConsole = console;\n                (globalObj as any).console = {\n                    error: (message: string) => {\n                        consoleCalled = true;\n                        consoleMessage = message;\n                    }\n                };\n\n                try {\n                    // Act\n                    handleNotImplemented(handlers, testMessage);\n\n                    // Assert\n                    Assert.ok(consoleCalled, \"Console.error should be called\");\n                    Assert.ok(consoleMessage === testMessage, \"Console message should match\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"handleNotImplemented: should fallback to console.log when console.error not available\",\n            test: () => {\n                // Arrange\n                const globalObj = getGlobal();\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Not implemented fallback\";\n                let consoleCalled = false;\n                let consoleMessage = \"\";\n\n                // Mock console with only log available\n                const originalConsole = console;\n                (globalObj as any).console = {\n                    log: (message: string) => {\n                        consoleCalled = true;\n                        consoleMessage = message;\n                    }\n                };\n\n                try {\n                    // Act\n                    handleNotImplemented(handlers, testMessage);\n\n                    // Assert\n                    Assert.ok(consoleCalled, \"Console.log should be called as fallback\");\n                    Assert.ok(consoleMessage === testMessage, \"Console message should match\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Error handlers should handle undefined console gracefully\",\n            test: () => {\n                // Arrange\n                const globalObj = getGlobal();\n                const handlers: IOTelErrorHandlers = {};\n                const testMessage = \"Test with no console\";\n                const originalConsole = console;\n\n                try {\n                    // Remove console\n                    (globalObj as any).console = undefined;\n\n                    // Act & Assert - should not throw\n                    handleDebug(handlers, testMessage);\n                    handleWarn(handlers, testMessage);\n                    handleError(handlers, testMessage);\n                    handleNotImplemented(handlers, testMessage);\n\n                    // If we get here, no exceptions were thrown\n                    Assert.ok(true, \"All handlers should complete without throwing when console is undefined\");\n                } finally {\n                    // Restore console\n                    (globalObj as any).console = originalConsole;\n                }\n            }\n        });\n\n        this.addGetUrlTests();\n        this.addGetHttpUrlTests();\n    }\n\n    private addGetHttpUrlTests(): void {\n        this.testCase({\n            name: \"getHttpUrl: should return undefined when container is null\",\n            test: () => {\n                // Act\n                const result = getHttpUrl(null as any);\n\n                // Assert\n                Assert.equal(result, undefined, \"Should return undefined for null container\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should return undefined when container is undefined\",\n            test: () => {\n                // Act\n                const result = getHttpUrl(undefined as any);\n\n                // Assert\n                Assert.equal(result, undefined, \"Should return undefined for undefined container\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should return value from url.full (stable semantic convention)\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"url.full\", \"https://example.com/api/users?id=123\");\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://example.com/api/users?id=123\", \"Should return value from url.full\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should return value from http.url (legacy semantic convention)\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.url\", \"https://legacy.example.com/endpoint\");\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://legacy.example.com/endpoint\", \"Should return value from http.url\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should prefer url.full over http.url when both present\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"url.full\", \"https://stable.example.com/path\");\n                container.set(\"http.url\", \"https://legacy.example.com/path\");\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://stable.example.com/path\", \"Should prefer url.full over http.url\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should return undefined when neither attribute is present\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"server.address\", \"example.com\");\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, undefined, \"Should return undefined when neither url.full nor http.url is present\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should handle empty string values\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"url.full\", \"\");\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, undefined, \"Should return empty string when url.full is empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should handle numeric values\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"url.full\", 12345);\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, 12345, \"Should return numeric value as-is\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should handle boolean values\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"url.full\", true);\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, true, \"Should return boolean value as-is\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should handle URLs with special characters\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                const urlWithSpecialChars = \"https://example.com/api/search?q=hello%20world&filter=%7B%22type%22%3A%22test%22%7D\";\n                container.set(\"url.full\", urlWithSpecialChars);\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, urlWithSpecialChars, \"Should handle URLs with encoded special characters\");\n            }\n        });\n\n        this.testCase({\n            name: \"getHttpUrl: should handle relative URLs\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.url\", \"/api/users\");\n\n                // Act\n                const result = getHttpUrl(container);\n\n                // Assert\n                Assert.equal(result, \"/api/users\", \"Should handle relative URLs\");\n            }\n        });\n    }\n\n    private addGetUrlTests(): void {\n        this.testCase({\n            name: \"getUrl: should return empty string when container is null\",\n            test: () => {\n                // Act\n                const result = getUrl(null as any);\n\n                // Assert\n                Assert.equal(result, \"\", \"Should return empty string for null container\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should return empty string when container is undefined\",\n            test: () => {\n                // Act\n                const result = getUrl(undefined as any);\n\n                // Assert\n                Assert.equal(result, \"\", \"Should return empty string for undefined container\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should return empty string when no httpMethod is present\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"url.full\", \"https://example.com/path\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"\", \"Should return empty string when httpMethod is missing\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should return url from url.full (stable semantic convention)\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.full\", \"https://example.com/api/users\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://example.com/api/users\", \"Should return url from url.full\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should return url from http.url (legacy semantic convention)\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.method\", \"POST\");\n                container.set(\"http.url\", \"https://api.example.com/data\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://api.example.com/data\", \"Should return url from http.url\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should prefer url.full over http.url when both present\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.full\", \"https://stable.example.com/path\");\n                container.set(\"http.url\", \"https://legacy.example.com/path\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://stable.example.com/path\", \"Should prefer url.full over http.url\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should construct url from httpScheme, httpHost, and httpTarget\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"server.address\", \"example.com\");\n                container.set(\"url.path\", \"/api/users\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://example.com/api/users\", \"Should construct url from scheme, host, and path\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should construct url from legacy http attributes\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.method\", \"POST\");\n                container.set(\"http.scheme\", \"http\");\n                container.set(\"http.host\", \"localhost:8080\");\n                container.set(\"http.target\", \"/api/data?id=123\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"http://localhost:8080/api/data?id=123\", \"Should construct url from legacy http attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should use url.query when url.path is not present\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"server.address\", \"example.com\");\n                container.set(\"url.query\", \"?q=search\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://example.com?q=search\", \"Should use url.query when url.path not present\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should construct url with netPeerName and netPeerPort when httpHost not present\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.method\", \"GET\");\n                container.set(\"http.scheme\", \"http\");\n                container.set(\"net.peer.name\", \"api.service.local\");\n                container.set(\"net.peer.port\", 8080);\n                container.set(\"http.target\", \"/health\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"http://api.service.local:8080/health\", \"Should construct url with netPeerName and port\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should construct url with client.address (stable) for netPeerName\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"client.address\", \"service.example.com\");\n                container.set(\"client.port\", 443);\n                container.set(\"url.path\", \"/api\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://service.example.com:443/api\", \"Should use client.address for peer name\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should construct url with netPeerIp when netPeerName not present\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.method\", \"GET\");\n                container.set(\"http.scheme\", \"http\");\n                container.set(\"net.peer.ip\", \"192.168.1.100\");\n                container.set(\"net.peer.port\", 3000);\n                container.set(\"http.target\", \"/endpoint\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"http://192.168.1.100:3000/endpoint\", \"Should construct url with IP address and port\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should use network.peer.address (stable) for peer IP\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"POST\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"network.peer.address\", \"10.0.0.5\");\n                container.set(\"server.port\", 8443);\n                container.set(\"url.path\", \"/data\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://10.0.0.5:8443/data\", \"Should use network.peer.address for IP\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should return empty string when scheme and target present but no host/peer info\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"url.path\", \"/api/users\");\n                // No host, no peer name, no peer IP\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"\", \"Should return empty string when no host information available\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should return empty string when scheme present but target missing\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"server.address\", \"example.com\");\n                // No target/path/query\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"\", \"Should return empty string when target is missing\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should handle IPv6 addresses\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.method\", \"GET\");\n                container.set(\"http.scheme\", \"http\");\n                container.set(\"net.peer.ip\", \"::1\");\n                container.set(\"net.peer.port\", 8080);\n                container.set(\"http.target\", \"/api\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"http://::1:8080/api\", \"Should handle IPv6 addresses\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should prefer server.port over other port attributes\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.scheme\", \"https\");\n                container.set(\"client.address\", \"example.com\");\n                container.set(\"server.port\", 9000);\n                container.set(\"client.port\", 8000);\n                container.set(\"net.peer.port\", 7000);\n                container.set(\"url.path\", \"/api\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://example.com:8000/api\", \"Should prefer server.port\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should handle Unix socket paths in network.peer.address\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.request.method\", \"GET\");\n                container.set(\"url.scheme\", \"http\");\n                container.set(\"network.peer.address\", \"/tmp/my.sock\");\n                container.set(\"server.port\", 80);\n                container.set(\"url.path\", \"/status\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"http:///tmp/my.sock:80/status\", \"Should handle Unix socket paths\");\n            }\n        });\n\n        this.testCase({\n            name: \"getUrl: should construct url with path containing query parameters\",\n            test: () => {\n                // Arrange\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test\");\n                container.set(\"http.method\", \"GET\");\n                container.set(\"http.scheme\", \"https\");\n                container.set(\"http.host\", \"api.example.com\");\n                container.set(\"http.target\", \"/search?q=test&page=1\");\n\n                // Act\n                const result = getUrl(container);\n\n                // Assert\n                Assert.equal(result, \"https://api.example.com/search?q=test&page=1\", \"Should handle target with query parameters\");\n            }\n        });\n    }\n\n    private _resetConsoleMocks() {\n        // Helper to reset any console mocks - implementation depends on your mocking strategy\n        // This is a placeholder that might need adjustment based on your test framework\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/OpenTelemetry/errors.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { isFunction, isString, dumpObj } from \"@nevware21/ts-utils\";\nimport { \n    OpenTelemetryError, \n    OpenTelemetryErrorConstructor, \n    getOpenTelemetryError, \n    throwOTelError \n} from \"../../../../src/otel/api/errors/OTelError\";\nimport { \n    OTelInvalidAttributeError, \n    throwOTelInvalidAttributeError \n} from \"../../../../src/otel/api/errors/OTelInvalidAttributeError\";\nimport { \n    OTelSpanError, \n    throwOTelSpanError \n} from \"../../../../src/otel/api/errors/OTelSpanError\";\n\nexport class OpenTelemetryErrorsTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n        \n        // OTelError tests\n        this.testCase({\n            name: \"OTelError: getOpenTelemetryError should return a constructor\",\n            test: () => {\n                // Act\n                const ErrorConstructor = getOpenTelemetryError();\n\n                // Assert\n                Assert.ok(ErrorConstructor, \"Constructor should be defined\");\n                Assert.ok(isFunction(ErrorConstructor), \"Constructor should be a function\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelError: should create error instance with message\",\n            test: () => {\n                // Arrange\n                const ErrorConstructor = getOpenTelemetryError();\n                const testMessage = \"Test OpenTelemetry error\";\n\n                // Act\n                const error = new ErrorConstructor(testMessage);\n\n                // Assert\n                Assert.ok(error instanceof Error, \"Should be an instance of Error\");\n                Assert.ok(error.message === testMessage, \"Message should match\");\n                Assert.ok(error.name === \"OpenTelemetryError\", \"Name should be OpenTelemetryError\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelError: should create error instance without message\",\n            test: () => {\n                // Arrange\n                const ErrorConstructor = getOpenTelemetryError();\n\n                // Act\n                const error = new ErrorConstructor();\n\n                // Assert\n                Assert.ok(error instanceof Error, \"Should be an instance of Error\");\n                Assert.ok(error.name === \"OpenTelemetryError\", \"Name should be OpenTelemetryError\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelError: throwOTelError should throw OpenTelemetryError\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Test throw error\";\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelError(testMessage);\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError instanceof Error, \"Should be an instance of Error\");\n                Assert.ok(caughtError.name === \"OpenTelemetryError\", \"Name should be OpenTelemetryError\");\n                Assert.ok(caughtError.message === testMessage, \"Message should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelError: should return same constructor instance on multiple calls\",\n            test: () => {\n                // Act\n                const constructor1 = getOpenTelemetryError();\n                const constructor2 = getOpenTelemetryError();\n\n                // Assert\n                Assert.ok(constructor1 === constructor2, \"Should return same constructor instance\");\n            }\n        });\n\n        // OTelInvalidAttributeError tests\n        this.testCase({\n            name: \"OTelInvalidAttributeError: should throw with message, attribName, and value\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Invalid attribute error\";\n                const testAttribName = \"invalidAttr\";\n                const testValue = { invalid: true };\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelInvalidAttributeError(testMessage, testAttribName, testValue);\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError instanceof Error, \"Should be an instance of Error\");\n                Assert.ok(caughtError.name === \"OTelInvalidAttributeError\", \"Error name should be OTelInvalidAttributeError\");\n                Assert.ok(caughtError.message === testMessage, \"Message should match\");\n                Assert.ok((caughtError as OTelInvalidAttributeError).attribName === testAttribName, \"Attribute name should match\");\n                Assert.ok((caughtError as OTelInvalidAttributeError).value === testValue, \"Attribute value should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelInvalidAttributeError: should handle empty parameters\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Empty attribute error\";\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelInvalidAttributeError(testMessage, \"\", \"\");\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError.name === \"OTelInvalidAttributeError\", \"Error name should be OTelInvalidAttributeError\");\n                Assert.ok(caughtError.message === testMessage, \"Message should match\");\n                Assert.ok((caughtError as OTelInvalidAttributeError).attribName === \"\", \"Attribute name should be empty string\");\n                Assert.ok((caughtError as OTelInvalidAttributeError).value === \"\", \"Attribute value should be empty string\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelInvalidAttributeError: should handle undefined parameters\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Undefined attribute error\";\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelInvalidAttributeError(testMessage, undefined as any, undefined);\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError.name === \"OTelInvalidAttributeError\", \"Error name should be OTelInvalidAttributeError\");\n                Assert.ok(caughtError.message === testMessage, \"Message should match\");\n                Assert.ok((caughtError as OTelInvalidAttributeError).attribName === undefined, \"Attribute name should be undefined when explicitly passed undefined\");\n                Assert.ok((caughtError as OTelInvalidAttributeError).value === undefined, \"Attribute value should be undefined when explicitly passed undefined\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelInvalidAttributeError: should inherit from OpenTelemetryError\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Inheritance test\";\n                const OpenTelemetryErrorConstructor = getOpenTelemetryError();\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelInvalidAttributeError(testMessage, \"test\", \"value\");\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError instanceof Error, \"Should be instance of Error\");\n                Assert.ok(caughtError instanceof OpenTelemetryErrorConstructor, \"Should be instance of OpenTelemetryError\");\n                Assert.ok(caughtError.name === \"OTelInvalidAttributeError\", \"Should have correct error name\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelInvalidAttributeError: attribName property should not conflict with Error.name\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Property conflict test\";\n                const testAttribName = \"customAttributeName\";\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelInvalidAttributeError(testMessage, testAttribName, \"value\");\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                // Assert that both properties exist and have different values\n                Assert.ok(caughtError.name === \"OTelInvalidAttributeError\", \"Error.name should be the error type name\");\n                Assert.ok((caughtError as OTelInvalidAttributeError).attribName === testAttribName, \"attribName should be the custom attribute name\");\n                Assert.ok(caughtError.name !== (caughtError as OTelInvalidAttributeError).attribName, \"Error.name and attribName should be different\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelInvalidAttributeError: should handle different value types\",\n            test: () => {\n                // Test different value types\n                const testCases = [\n                    { value: null, description: \"null value\" },\n                    { value: undefined, description: \"undefined value\" },\n                    { value: 0, description: \"zero number\" },\n                    { value: false, description: \"false boolean\" },\n                    { value: [], description: \"empty array\" },\n                    { value: {}, description: \"empty object\" },\n                    { value: \"string\", description: \"string value\" },\n                    { value: 123, description: \"number value\" },\n                    { value: true, description: \"boolean value\" }\n                ];\n\n                testCases.forEach(testCase => {\n                    let caughtError: any = null;\n                    try {\n                        throwOTelInvalidAttributeError(\"Test message\", \"testAttr\", testCase.value);\n                        Assert.ok(false, `Should have thrown an error for ${testCase.description}`);\n                    } catch (error) {\n                        caughtError = error;\n                    }\n\n                    Assert.ok(caughtError, `Error should have been caught for ${testCase.description}`);\n                    Assert.ok((caughtError as OTelInvalidAttributeError).value === testCase.value, \n                        `Value should match for ${testCase.description}`);\n                });\n            }\n        });\n\n        // OTelSpanError tests\n        this.testCase({\n            name: \"OTelSpanError: should throw with message and span name\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Span error occurred\";\n                const testSpanName = \"test-span\";\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelSpanError(testMessage, testSpanName);\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError instanceof Error, \"Should be an instance of Error\");\n                Assert.ok(caughtError.name === \"OTelSpanError\", \"Error name should be OTelSpanError\");\n                Assert.ok(caughtError.message === testMessage, \"Message should match\");\n                Assert.ok((caughtError as OTelSpanError).spanName === testSpanName, \"Span name should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelSpanError: should handle empty span name\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Span error with empty name\";\n                const testSpanName = \"\";\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelSpanError(testMessage, testSpanName);\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError.message === testMessage, \"Message should match\");\n                Assert.ok((caughtError as OTelSpanError).spanName === testSpanName, \"Span name should be empty string\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelSpanError: should handle undefined span name\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Span error with undefined name\";\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelSpanError(testMessage, undefined as any);\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError.message === testMessage, \"Message should match\");\n                Assert.ok((caughtError as OTelSpanError).spanName === undefined, \"Span name should be undefined when explicitly passed undefined\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelSpanError: should handle various span name types\",\n            test: () => {\n                // Test different span name values\n                const testCases = [\n                    { spanName: \"\", expected: \"\", description: \"empty string\" },\n                    { spanName: \"valid-span-name\", expected: \"valid-span-name\", description: \"valid span name\" },\n                    { spanName: \"span with spaces\", expected: \"span with spaces\", description: \"span name with spaces\" },\n                    { spanName: \"span-with-special-chars!@#\", expected: \"span-with-special-chars!@#\", description: \"span name with special characters\" }\n                ];\n\n                testCases.forEach(testCase => {\n                    let caughtError: any = null;\n                    try {\n                        throwOTelSpanError(\"Test message\", testCase.spanName);\n                        Assert.ok(false, `Should have thrown an error for ${testCase.description}`);\n                    } catch (error) {\n                        caughtError = error;\n                    }\n\n                    Assert.ok(caughtError, `Error should have been caught for ${testCase.description}`);\n                    Assert.ok((caughtError as OTelSpanError).spanName === testCase.expected, \n                        `Span name should be '${testCase.expected}' for ${testCase.description}`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"OTelSpanError: should inherit from OpenTelemetryError\",\n            test: () => {\n                // Arrange\n                const testMessage = \"Inheritance test\";\n                const OpenTelemetryErrorConstructor = getOpenTelemetryError();\n                let caughtError: any = null;\n\n                // Act & Assert\n                try {\n                    throwOTelSpanError(testMessage, \"test-span\");\n                    Assert.ok(false, \"Should have thrown an error\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                Assert.ok(caughtError instanceof OpenTelemetryErrorConstructor, \"Should be instance of OpenTelemetryError\");\n            }\n        });\n\n        // Integration tests\n        this.testCase({\n            name: \"All error types should have unique names\",\n            test: () => {\n                // Arrange\n                let errors: any[] = [];\n\n                // Act - Create instances of all error types\n                try {\n                    throwOTelError(\"base error\");\n                } catch (e) {\n                    errors.push(e);\n                }\n\n                try {\n                    throwOTelInvalidAttributeError(\"invalid attr\", \"key\", \"value\");\n                } catch (e) {\n                    errors.push(e);\n                }\n\n                try {\n                    throwOTelSpanError(\"span error\", \"span\");\n                } catch (e) {\n                    errors.push(e);\n                }\n\n                // Assert - Check that all error types have unique names\n                Assert.ok(errors.length === 3, \"Should have caught 3 errors\");\n                Assert.ok(errors[0].name === \"OpenTelemetryError\", \"First error should be OpenTelemetryError\");\n                Assert.ok(errors[1].name === \"OTelInvalidAttributeError\", \"Second error should be OTelInvalidAttributeError\");\n                Assert.ok(errors[2].name === \"OTelSpanError\", \"Third error should be OTelSpanError\");\n                \n                // Verify all names are unique\n                const names = errors.map(e => e.name);\n                const uniqueNames = [...new Set(names)];\n                Assert.ok(uniqueNames.length === 3, \"All error names should be unique\");\n            }\n        });\n\n        this.testCase({\n            name: \"Error constructors should be reusable\",\n            test: () => {\n                // Arrange & Act - Create multiple errors of the same type\n                let errors: any[] = [];\n\n                try {\n                    throwOTelInvalidAttributeError(\"first error\", \"key1\", \"value1\");\n                } catch (e) {\n                    errors.push(e);\n                }\n\n                try {\n                    throwOTelInvalidAttributeError(\"second error\", \"key2\", \"value2\");\n                } catch (e) {\n                    errors.push(e);\n                }\n\n                // Assert\n                Assert.ok(errors.length === 2, \"Should have caught 2 errors\");\n                Assert.ok(errors[0].message === \"first error\", \"First error message should match\");\n                Assert.ok(errors[1].message === \"second error\", \"Second error message should match\");\n                Assert.ok(errors[0].name === \"OTelInvalidAttributeError\", \"First error name should be OTelInvalidAttributeError\");\n                Assert.ok(errors[1].name === \"OTelInvalidAttributeError\", \"Second error name should be OTelInvalidAttributeError\");\n                Assert.ok(errors[0].attribName === \"key1\", \"First error attribName should match\");\n                Assert.ok(errors[1].attribName === \"key2\", \"Second error attribName should match\");\n                Assert.ok(errors[0].value === \"value1\", \"First error value should match\");\n                Assert.ok(errors[1].value === \"value2\", \"Second error value should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"Error stack traces should be preserved\",\n            test: () => {\n                // Arrange\n                let caughtError: any = null;\n\n                // Act\n                try {\n                    throwOTelError(\"Stack trace test\");\n                } catch (error) {\n                    caughtError = error;\n                }\n\n                // Assert\n                Assert.ok(caughtError, \"Error should have been caught\");\n                Assert.ok(caughtError.stack, \"Error should have a stack trace\");\n                Assert.ok(isString(caughtError.stack), \"Stack trace should be a string\");\n                Assert.ok(caughtError.stack.indexOf(\"OpenTelemetryError\") !== -1, \"Stack trace should contain error name\");\n            }\n        });\n\n        this.testCase({\n            name: \"OTelError: dumpObj should contain essential error properties\",\n            test: () => {\n                // Arrange & Act\n                const error = new (getOpenTelemetryError())(\"Test error message\");\n                const errorDump = dumpObj(error);\n\n                // Assert\n                Assert.ok(errorDump, \"dumpObj should return a string representation\");\n                Assert.ok(errorDump.indexOf(\"Test error message\") !== -1, `Error dump should contain message: ${errorDump}`);\n                Assert.ok(errorDump.indexOf(\"name\") !== -1, `Error dump should contain name property: ${errorDump}`);\n                Assert.ok(errorDump.indexOf(\"OpenTelemetryError\") !== -1, `Error dump should contain error type: ${errorDump}`);\n            }\n        });\n\n        this.testCase({\n            name: \"OTelInvalidAttributeError: dumpObj should show attribute-specific properties\",\n            test: () => {\n                // Arrange & Act\n                let error: any = null;\n                try {\n                    throwOTelInvalidAttributeError(\"Invalid attribute test\", \"testAttribute\", { complex: \"value\" });\n                } catch (e) {\n                    error = e;\n                }\n                const errorDump = dumpObj(error);\n\n                // Assert\n                Assert.ok(error, \"Error should have been caught\");\n                Assert.ok(errorDump, \"dumpObj should return a string representation\");\n                Assert.ok(errorDump.indexOf(\"Invalid attribute test\") !== -1, `Error dump should contain message: ${errorDump}`);\n                Assert.ok(errorDump.indexOf(\"OTelInvalidAttributeError\") !== -1, `Error dump should contain error type: ${errorDump}`);\n                \n                // Check properties directly on the error object since dumpObj might not serialize custom properties\n                Assert.ok(error.attribName === \"testAttribute\", `Error should have attribName property: ${error.attribName}`);\n                Assert.ok(error.value !== undefined, `Error should have value property: ${dumpObj(error.value)}`);\n                \n                // Ensure the error dump contains meaningful content even if custom properties aren't serialized\n                Assert.ok(errorDump.length > 50, `Error dump should be substantial: ${errorDump}`);\n            }\n        });\n\n        this.testCase({\n            name: \"OTelSpanError: dumpObj should show span-specific properties\",\n            test: () => {\n                // Arrange & Act\n                let error: any = null;\n                try {\n                    throwOTelSpanError(\"Span operation failed\", \"testSpan\");\n                } catch (e) {\n                    error = e;\n                }\n                const errorDump = dumpObj(error);\n\n                // Assert\n                Assert.ok(error, \"Error should have been caught\");\n                Assert.ok(errorDump, \"dumpObj should return a string representation\");\n                Assert.ok(errorDump.indexOf(\"Span operation failed\") !== -1, `Error dump should contain message: ${errorDump}`);\n                Assert.ok(errorDump.indexOf(\"OTelSpanError\") !== -1, `Error dump should contain error type: ${errorDump}`);\n                \n                // Check properties directly on the error object since dumpObj might not serialize custom properties\n                Assert.ok(error.spanName === \"testSpan\", `Error should have spanName property: ${error.spanName}`);\n                \n                // Ensure the error dump contains meaningful content even if custom properties aren't serialized\n                Assert.ok(errorDump.length > 50, `Error dump should be substantial: ${errorDump}`);\n            }\n        });\n\n        this.testCase({\n            name: \"Error serialization: dumpObj should handle complex attribute values\",\n            test: () => {\n                // Arrange & Act\n                const complexValue = {\n                    nested: { deep: \"value\" },\n                    array: [1, 2, 3],\n                    number: 42,\n                    boolean: true,\n                    nullValue: null,\n                    undefinedValue: undefined\n                };\n                let error: any = null;\n                try {\n                    throwOTelInvalidAttributeError(\"Complex value test\", \"complexAttr\", complexValue);\n                } catch (e) {\n                    error = e;\n                }\n                const errorDump = dumpObj(error);\n\n                // Assert\n                Assert.ok(error, \"Error should have been caught\");\n                Assert.ok(errorDump, \"dumpObj should return a string representation\");\n                Assert.ok(errorDump.indexOf(\"Complex value test\") !== -1, `Error dump should contain message: ${errorDump}`);\n                \n                // Check the actual property values directly\n                Assert.ok(error.attribName === \"complexAttr\", `Error should have correct attribName: ${error.attribName}`);\n                Assert.ok(error.value === complexValue, `Error should have correct value reference: ${dumpObj(error.value)}`);\n                \n                // Dump should be meaningful even if it doesn't contain all custom properties\n                Assert.ok(errorDump.length > 50, `Error dump should be substantial: ${errorDump}`);\n            }\n        });\n\n        this.testCase({\n            name: \"Error serialization: dumpObj should be different for different error types\",\n            test: () => {\n                // Arrange & Act\n                const baseError = new (getOpenTelemetryError())(\"Base error\");\n                \n                let invalidAttrError: any = null;\n                try {\n                    throwOTelInvalidAttributeError(\"Invalid attr\", \"attr\", \"value\");\n                } catch (e) {\n                    invalidAttrError = e;\n                }\n                \n                let spanError: any = null;\n                try {\n                    throwOTelSpanError(\"Span error\", \"span\");\n                } catch (e) {\n                    spanError = e;\n                }\n\n                const baseDump = dumpObj(baseError);\n                const invalidAttrDump = dumpObj(invalidAttrError);\n                const spanDump = dumpObj(spanError);\n\n                // Assert - Each dump should be unique based on error type and message\n                Assert.notEqual(baseDump, invalidAttrDump, \"Base and InvalidAttribute dumps should be different\");\n                Assert.notEqual(baseDump, spanDump, \"Base and Span dumps should be different\");\n                Assert.notEqual(invalidAttrDump, spanDump, \"InvalidAttribute and Span dumps should be different\");\n\n                // Each should contain their specific error type names\n                Assert.ok(baseDump.indexOf(\"OpenTelemetryError\") !== -1, `Base error dump should contain type: ${baseDump}`);\n                Assert.ok(invalidAttrDump.indexOf(\"OTelInvalidAttributeError\") !== -1, `InvalidAttribute dump should contain type: ${invalidAttrDump}`);\n                Assert.ok(spanDump.indexOf(\"OTelSpanError\") !== -1, `Span dump should contain type: ${spanDump}`);\n                \n                // Verify error objects have the expected custom properties (beyond what dumpObj shows)\n                Assert.ok(invalidAttrError.attribName === \"attr\", `InvalidAttribute error should have attribName: ${invalidAttrError.attribName}`);\n                Assert.ok(invalidAttrError.value === \"value\", `InvalidAttribute error should have value: ${invalidAttrError.value}`);\n                Assert.ok(spanError.spanName === \"span\", `Span error should have spanName: ${spanError.spanName}`);\n            }\n        });\n\n        this.testCase({\n            name: \"Error serialization: dumpObj should handle empty and null values gracefully\",\n            test: () => {\n                // Arrange & Act\n                const emptyMsgError = new (getOpenTelemetryError())(\"\");\n                \n                let nullAttrError: any = null;\n                try {\n                    throwOTelInvalidAttributeError(\"Test\", null as any, null);\n                } catch (e) {\n                    nullAttrError = e;\n                }\n                \n                let undefinedSpanError: any = null;\n                try {\n                    throwOTelSpanError(\"Test\", undefined as any);\n                } catch (e) {\n                    undefinedSpanError = e;\n                }\n\n                const emptyDump = dumpObj(emptyMsgError);\n                const nullDump = dumpObj(nullAttrError);\n                const undefinedDump = dumpObj(undefinedSpanError);\n\n                // Assert - Should not throw and should contain valid representations\n                Assert.ok(emptyDump, \"Empty message error should have valid dump\");\n                Assert.ok(nullDump, \"Null attribute error should have valid dump\");\n                Assert.ok(undefinedDump, \"Undefined span error should have valid dump\");\n\n                // Should contain error type names even with empty values\n                Assert.ok(emptyDump.indexOf(\"OpenTelemetryError\") !== -1, `Empty dump should contain error type: ${emptyDump}`);\n                Assert.ok(nullDump.indexOf(\"OTelInvalidAttributeError\") !== -1, `Null dump should contain error type: ${nullDump}`);\n                Assert.ok(undefinedDump.indexOf(\"OTelSpanError\") !== -1, `Undefined dump should contain error type: ${undefinedDump}`);\n                \n                // Verify actual property values (not assuming they're converted to empty strings)\n                Assert.ok(nullAttrError.attribName === null, `Null attribute error should have null attribName: ${nullAttrError.attribName}`);\n                Assert.ok(nullAttrError.value === null, `Null attribute error should have null value: ${nullAttrError.value}`);\n                Assert.ok(undefinedSpanError.spanName === undefined, `Undefined span error should have undefined spanName: ${undefinedSpanError.spanName}`);\n            }\n        });\n\n        this.testCase({\n            name: \"Error serialization: dumpObj should preserve inheritance chain information\",\n            test: () => {\n                // Arrange & Act\n                let invalidAttrError: any = null;\n                try {\n                    throwOTelInvalidAttributeError(\"Test\", \"attr\", \"val\");\n                } catch (e) {\n                    invalidAttrError = e;\n                }\n                const errorDump = dumpObj(invalidAttrError);\n\n                // Assert - Should show inheritance information\n                Assert.ok(invalidAttrError, \"Error should have been caught\");\n                Assert.ok(errorDump, \"Error dump should exist\");\n                Assert.ok(invalidAttrError instanceof Error, \"Should be instance of Error\");\n                Assert.ok(invalidAttrError instanceof (getOpenTelemetryError()), \"Should be instance of OpenTelemetryError\");\n                \n                // Dump should reflect the actual error type, not just base Error\n                Assert.ok(errorDump.indexOf(\"OTelInvalidAttributeError\") !== -1, `Dump should show specific error type: ${errorDump}`);\n                \n                // Should have standard Error properties\n                Assert.ok(errorDump.indexOf(\"message\") !== -1 || errorDump.indexOf(\"Test\") !== -1, `Dump should contain message content: ${errorDump}`);\n                Assert.ok(errorDump.indexOf(\"name\") !== -1 || errorDump.indexOf(\"OTelInvalidAttributeError\") !== -1, `Dump should contain name/type information: ${errorDump}`);\n                \n                // Verify custom properties exist on the error object\n                Assert.ok(invalidAttrError.attribName === \"attr\", `Error should have attribName property: ${invalidAttrError.attribName}`);\n                Assert.ok(invalidAttrError.value === \"val\", `Error should have value property: ${invalidAttrError.value}`);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/OpenTelemetry/otelNegative.Tests.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore } from \"../../../../src/index\";\nimport { IAppInsightsCore } from \"../../../../src/interfaces/ai/IAppInsightsCore\";\nimport { createOTelApi } from \"../../../../src/otel/api/OTelApi\";\nimport { IOTelApi } from \"../../../../src/interfaces/otel/IOTelApi\";\nimport { IOTelApiCtx } from \"../../../../src/interfaces/otel/IOTelApiCtx\";\nimport { createNonRecordingSpan, wrapSpanContext, withSpan, useSpan, isTracingSuppressed, suppressTracing, unsuppressTracing } from \"../../../../src/otel/api/trace/utils\";\nimport { createDistributedTraceContext } from \"../../../../src/core/TelemetryHelpers\";\nimport { IChannelControls } from \"../../../../src/interfaces/ai/IChannelControls\";\n\n/**\n * Negative tests for OpenTelemetry SDK helpers in AppInsights Core\n * These tests ensure that no exceptions are thrown and helpers behave correctly\n * when there is no trace provider or support instances\n */\nexport class OTelNegativeTests extends AITestClass {\n    private _core: IAppInsightsCore = null as any;\n\n    public testInitialize() {\n        // Create a minimal mock channel to satisfy core initialization requirements\n        const mockChannel: IChannelControls = {\n            pause: () => {},\n            resume: () => {},\n            flush: () => {},\n            teardown: () => {},\n            processTelemetry: () => {},\n            initialize: () => {},\n            identifier: \"mockChannel\",\n            priority: 1001\n        } as any;\n\n        this._core = new AppInsightsCore();\n        this._core.initialize({\n            instrumentationKey: \"00000000-0000-0000-0000-000000000000\",\n            disableInstrumentationKeyValidation: true,\n            traceCfg: {},\n            errorHandlers: {}\n        }, [mockChannel]);\n    }\n\n    public testCleanup() {\n        if (this._core) {\n            this._core.unload(false);\n            this._core = null as any;\n        }\n    }\n\n    public registerTests() {\n        this.addCoreWithoutTraceProviderTests();\n        this.addTraceApiWithNullCoreTests();\n        this.addOTelApiWithInvalidContextTests();\n        this.addUtilsWithNullParametersTests();\n        this.addSpanOperationsWithoutProviderTests();\n        this.addTraceCfgNullHandlingTests();\n    }\n\n    private addCoreWithoutTraceProviderTests(): void {\n        this.testCase({\n            name: \"Core.startSpan: should return null when no trace provider is set\",\n            test: () => {\n                // Act - core initialized but no trace provider set\n                const span = this._core.startSpan(\"test-span\");\n\n                // Assert - should return null gracefully without throwing\n                Assert.equal(span, null, \"Should return null when no trace provider is available\");\n            }\n        });\n\n        this.testCase({\n            name: \"Core.getActiveSpan: should return null when no trace provider is set\",\n            test: () => {\n                // Act\n                const activeSpan = this._core.getActiveSpan();\n\n                // Assert\n                Assert.equal(activeSpan, null, \"Should return null when no trace provider is available\");\n            }\n        });\n\n        this.testCase({\n            name: \"Core.getActiveSpan: should return null when createNew is false without trace provider\",\n            test: () => {\n                // Act\n                const activeSpan = this._core.getActiveSpan(false);\n\n                // Assert\n                Assert.equal(activeSpan, null, \"Should return null when createNew is false and no trace provider is available\");\n            }\n        });\n\n        this.testCase({\n            name: \"Core.getActiveSpan: should return null when createNew is true without trace provider\",\n            test: () => {\n                // Act\n                const activeSpan = this._core.getActiveSpan(true);\n\n                // Assert\n                Assert.equal(activeSpan, null, \"Should return null when no trace provider is available regardless of createNew value\");\n            }\n        });\n\n        this.testCase({\n            name: \"Core.setActiveSpan: should handle gracefully when no trace provider is set\",\n            test: () => {\n                // Arrange\n                const mockSpan = {\n                    name: \"test\",\n                    spanContext: () => createDistributedTraceContext()\n                } as any;\n\n                // Act - should not throw even without trace provider\n                const scope = this._core.setActiveSpan(mockSpan);\n                const activeSpan = this._core.getActiveSpan();\n\n                // Assert\n                Assert.ok(scope, \"Should return a scope object\");\n                Assert.equal(scope.host, this._core, \"Scope should reference the core\");\n                Assert.equal(scope.span, mockSpan, \"Scope should reference the span\");\n                Assert.equal(activeSpan, mockSpan, \"GetGetGetGetGetGetGetGetGetActiveSpan() should return the same span object\");\n                \n                // Restore should be callable without throwing\n                Assert.doesNotThrow(() => {\n                    scope.restore();\n                }, \"Restore should not throw when no trace provider is available\");\n\n                // Multiple restore calls should be safe\n                Assert.doesNotThrow(() => {\n                    scope.restore();\n                    scope.restore();\n                }, \"Multiple restore calls should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"Core.getTraceProvider: should return null when no trace provider is set\",\n            test: () => {\n                // Act\n                const provider = this._core.getTraceProvider();\n\n                // Assert\n                Assert.equal(provider, null, \"Should return null when no trace provider is set\");\n            }\n        });\n\n        this.testCase({\n            name: \"Core.setTraceCtx: should not throw when setting context without trace provider\",\n            test: () => {\n                // Arrange\n                const ctx = createDistributedTraceContext();\n                ctx.traceId = \"12345678901234567890123456789012\";\n                ctx.spanId = \"1234567890123456\";\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    this._core.setTraceCtx(ctx);\n                }, \"setTraceCtx should not throw without trace provider\");\n\n                // Verify context was set\n                const retrievedCtx = this._core.getTraceCtx();\n                Assert.equal(retrievedCtx, ctx, \"Should retrieve the same context that was set\");\n            }\n        });\n\n        this.testCase({\n            name: \"Core.setTraceCtx: should handle null context gracefully\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    this._core.setTraceCtx(null);\n                }, \"setTraceCtx should handle null gracefully\");\n\n                const ctx = this._core.getTraceCtx(false);\n                Assert.equal(ctx, null, \"Should return null when set to null and createNew is false\");\n            }\n        });\n    }\n\n    private addTraceApiWithNullCoreTests(): void {\n        this.testCase({\n            name: \"TraceApi: should create otelApi with initialized core\",\n            test: () => {\n                // Arrange\n                const otelApiCtx: IOTelApiCtx = {\n                    host: this._core\n                };\n\n                let otelApi: IOTelApi;\n                \n                // Act & Assert - creation should not throw\n                Assert.doesNotThrow(() => {\n                    otelApi = createOTelApi(otelApiCtx);\n                }, \"createOTelApi should not throw with initialized core\");\n\n                Assert.ok(otelApi, \"Should create otelApi with initialized core\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceApi.getActiveSpan: should not return a span without trace provider\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const traceApi = otelApi.trace;\n\n                // Act\n                const activeSpan = traceApi.getActiveSpan();\n\n                // Assert\n                Assert.ok(!activeSpan, \"Should not return a span\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceApi.setActiveSpan: should handle null span without throwing\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const traceApi = otelApi.trace;\n\n                // Act & Assert - should not throw with null\n                Assert.doesNotThrow(() => {\n                    traceApi.setActiveSpan(null);\n                }, \"setActiveSpan should handle null gracefully\");\n\n                // Should not throw with undefined\n                Assert.doesNotThrow(() => {\n                    traceApi.setActiveSpan(undefined);\n                }, \"setActiveSpan should handle undefined gracefully\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceApi.setActiveSpan: should handle span without spanContext method\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const traceApi = otelApi.trace;\n                \n                const invalidSpan = {\n                    name: \"test\"\n                    // Missing spanContext method\n                } as any;\n\n                // Act & Assert - should handle gracefully\n                let scope: any;\n                Assert.doesNotThrow(() => {\n                    scope = traceApi.setActiveSpan(invalidSpan);\n                }, \"Should handle span without spanContext method\");\n                \n                // Validate scope was returned and references the span\n                Assert.ok(scope, \"Scope should be returned\");\n                Assert.equal(scope.span, invalidSpan, \"Scope.span should equal the invalid span\");\n                \n                // Validate activeSpan returns the span\n                const activeSpan = this._core.getActiveSpan();\n                Assert.equal(activeSpan, invalidSpan, \"GetGetGetGetGetGetGetGetGetActiveSpan() should return the invalid span\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceApi.setActiveSpan: should handle span with legacy context() method\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const traceApi = otelApi.trace;\n                \n                const legacySpan = {\n                    name: \"legacy\",\n                    context: () => ({\n                        traceId: \"12345678901234567890123456789012\",\n                        spanId: \"1234567890123456\",\n                        traceFlags: 1\n                    })\n                } as any;\n\n                // Act & Assert - should handle legacy API\n                let scope: any;\n                Assert.doesNotThrow(() => {\n                    scope = traceApi.setActiveSpan(legacySpan);\n                }, \"Should handle legacy span with context() method\");\n                \n                // Validate scope was returned and references the span\n                Assert.ok(scope, \"Scope should be returned\");\n                Assert.equal(scope.span, legacySpan, \"Scope.span should equal the legacy span\");\n                \n                // Validate activeSpan returns the span\n                const activeSpan = this._core.getActiveSpan();\n                Assert.equal(activeSpan, legacySpan, \"GetGetGetGetGetGetGetGetGetActiveSpan() should return the legacy span\");\n            }\n        });\n    }\n\n    private addOTelApiWithInvalidContextTests(): void {\n        this.testCase({\n            name: \"TracerProvider.getTracer: should return tracer without trace provider\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n\n                // Act & Assert - should not throw when getting tracer\n                Assert.doesNotThrow(() => {\n                    const tracer = otelApi.getTracer(\"test-component\");\n                    Assert.ok(tracer, \"Should return a tracer instance\");\n                }, \"getTracer should not throw without trace provider\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startSpan: should return null without trace provider\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const tracer = otelApi.getTracer(\"test\");\n\n                // Act\n                const span = tracer.startSpan(\"operation\");\n\n                // Assert\n                Assert.equal(span, null, \"Should return null when trace provider is not available\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: should handle missing trace provider\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const tracer = otelApi.getTracer(\"test\");\n                let callbackExecuted = false;\n\n                // Act\n                const result = tracer.startActiveSpan(\"operation\", (span) => {\n                    callbackExecuted = true;\n                    return \"result\";\n                });\n\n                // Assert - callback should not execute when span creation fails\n                Assert.ok(callbackExecuted, \"Callback should execute even when span is null\");\n                Assert.equal(result, \"result\", \"Should return the result from the callback even when no span created\");\n            }\n        });\n\n        this.testCase({\n            name: \"TracerProvider.shutdown: should not throw without trace provider\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n\n                // Act & Assert - shutdown should not throw\n                Assert.doesNotThrow(() => {\n                    otelApi.shutdown();\n                }, \"shutdown should not throw without trace provider\");\n            }\n        });\n\n        this.testCase({\n            name: \"TracerProvider.forceFlush: should not throw without trace provider\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    otelApi.forceFlush();\n                }, \"forceFlush should not throw without trace provider\");\n            }\n        });\n    }\n\n    private addUtilsWithNullParametersTests(): void {\n        this.testCase({\n            name: \"createNonRecordingSpan: should handle null spanContext gracefully\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const span = createNonRecordingSpan(otelApi, \"test\", null as any);\n                    Assert.ok(span, \"Should create span even with null context\");\n                    Assert.ok(!span.isRecording(), \"Should be non-recording\");\n                }, \"createNonRecordingSpan should handle null context\");\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: should handle minimal context object\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const minimalContext = {\n                    traceId: \"12345678901234567890123456789012\",\n                    spanId: \"1234567890123456\"\n                } as any;\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const wrapped = wrapSpanContext(otelApi, minimalContext);\n                    Assert.ok(wrapped, \"Should wrap minimal context\");\n                    Assert.ok(!wrapped.isRecording(), \"Should be non-recording\");\n                }, \"wrapSpanContext should handle minimal context\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should execute callback with core\",\n            test: () => {\n                // Arrange\n                const mockSpan = {\n                    name: \"test\",\n                    spanContext: () => createDistributedTraceContext()\n                } as any;\n                \n                let callbackExecuted = false;\n                const callback = () => {\n                    callbackExecuted = true;\n                    return \"result\";\n                };\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const result = withSpan(this._core, mockSpan, callback);\n                    Assert.ok(callbackExecuted, \"Callback should execute\");\n                    Assert.equal(result, \"result\", \"Should return callback result\");\n                }, \"withSpan should work without trace provider\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should provide scope to callback\",\n            test: () => {\n                // Arrange\n                const mockSpan = {\n                    name: \"test\"\n                } as any;\n                \n                let scopeReceived = false;\n                const callback = (scope: any) => {\n                    scopeReceived = scope !== undefined;\n                    return \"result\";\n                };\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const result = useSpan(this._core, mockSpan, callback);\n                    Assert.ok(scopeReceived, \"Callback should receive scope\");\n                    Assert.equal(result, \"result\", \"Should return callback result\");\n                }, \"useSpan should work without trace provider\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle callback throwing exception\",\n            test: () => {\n                // Arrange\n                const ctx = createDistributedTraceContext();\n                ctx.traceId = \"12345678901234567890123456789012\";\n                ctx.spanId = \"1234567890123456\";\n                \n                const mockSpan = {\n                    name: \"test\",\n                    spanContext: () => ctx\n                } as any;\n                \n                const callback = () => {\n                    throw new Error(\"Test error\");\n                };\n\n                // Act & Assert\n                Assert.throws(() => {\n                    withSpan(this._core, mockSpan, callback);\n                }, (err: Error) => err.message === \"Test error\", \"Should propagate callback exception\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should restore scope even when callback throws\",\n            test: () => {\n                // Arrange\n                const mockSpan = { name: \"test\" } as any;\n                const callback = () => {\n                    throw new Error(\"Test error\");\n                };\n\n                // Act & Assert - should throw but ensure cleanup happens\n                Assert.throws(() => {\n                    useSpan(this._core, mockSpan, callback);\n                }, (err: Error) => err.message === \"Test error\", \"Should propagate exception\");\n            }\n        });\n    }\n\n    private addSpanOperationsWithoutProviderTests(): void {\n        this.testCase({\n            name: \"NonRecordingSpan: operations should not throw\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const ctx = createDistributedTraceContext();\n                ctx.traceId = \"12345678901234567890123456789012\";\n                ctx.spanId = \"1234567890123456\";\n                const span = createNonRecordingSpan(otelApi, \"test\", ctx);\n\n                // Act & Assert - all operations should be safe\n                Assert.doesNotThrow(() => {\n                    span.setAttribute(\"key\", \"value\");\n                    span.setAttributes({ key1: \"value1\", key2: \"value2\" });\n                    span.setStatus({ code: 0 });\n                    span.updateName(\"new-name\");\n                    span.recordException(new Error(\"test\"));\n                    span.end();\n                }, \"Non-recording span operations should not throw\");\n            }\n        });\n\n        this.testCase({\n            name: \"NonRecordingSpan: multiple end calls should be safe\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({ host: this._core });\n                const ctx = createDistributedTraceContext();\n                ctx.traceId = \"12345678901234567890123456789012\";\n                ctx.spanId = \"1234567890123456\";\n                const span = createNonRecordingSpan(otelApi, \"test\", ctx);\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    span.end();\n                    span.end();\n                    span.end();\n                }, \"Multiple end calls should be safe\");\n            }\n        });\n\n        this.testCase({\n            name: \"Span: operations after end should log errors but not throw\",\n            test: () => {\n                // Arrange\n                const otelApi = createOTelApi({\n                    host: this._core\n                });\n                \n                const ctx = createDistributedTraceContext();\n                ctx.traceId = \"12345678901234567890123456789012\";\n                ctx.spanId = \"1234567890123456\";\n                const span = createNonRecordingSpan(otelApi, \"test\", ctx);\n                span.end();\n\n                // Act & Assert - operations after end should not throw\n                Assert.doesNotThrow(() => {\n                    span.setAttribute(\"key\", \"value\");\n                    span.setAttributes({ key: \"value\" });\n                }, \"Operations after end should not throw\");\n            }\n        });\n    }\n\n    private addTraceCfgNullHandlingTests(): void {\n        this.testCase({\n            name: \"suppressTracing: should handle null context gracefully\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const result = suppressTracing(null as any);\n                    Assert.equal(result, null, \"Should return the input context\");\n                }, \"suppressTracing should handle null gracefully\");\n            }\n        });\n\n        this.testCase({\n            name: \"unsuppressTracing: should handle null context gracefully\",\n            test: () => {\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    const result = unsuppressTracing(null as any);\n                    Assert.equal(result, null, \"Should return the input context\");\n                }, \"unsuppressTracing should handle null gracefully\");\n            }\n        });\n\n        this.testCase({\n            name: \"isTracingSuppressed: should return false for null context\",\n            test: () => {\n                // Act\n                const result = isTracingSuppressed(null as any);\n\n                // Assert\n                Assert.equal(result, false, \"Should return false when context is null\");\n            }\n        });\n\n        this.testCase({\n            name: \"suppressTracing: should handle context without traceCfg\",\n            test: () => {\n                // Arrange\n                const contextWithoutTraceCfg = {} as any;\n\n                // Act & Assert\n                Assert.doesNotThrow(() => {\n                    suppressTracing(contextWithoutTraceCfg);\n                }, \"Should handle context without traceCfg\");\n\n                // Should not affect the context when traceCfg is missing\n                Assert.equal(isTracingSuppressed(contextWithoutTraceCfg), false,\n                    \"Should return false when traceCfg is missing\");\n            }\n        });\n\n        this.testCase({\n            name: \"suppressTracing: should work with core instance\",\n            test: () => {\n                // Arrange\n                this._core.config.traceCfg = {};\n\n                // Act\n                suppressTracing(this._core);\n\n                // Assert\n                Assert.equal(isTracingSuppressed(this._core), true,\n                    \"Should suppress tracing on core instance\");\n\n                // Cleanup\n                unsuppressTracing(this._core);\n                Assert.equal(isTracingSuppressed(this._core), false,\n                    \"Should unsuppress tracing on core instance\");\n            }\n        });\n\n        this.testCase({\n            name: \"suppressTracing: should work with otelApi instance\",\n            test: () => {\n                // Arrange\n                this._core.config.traceCfg = {};\n                const otelApi = createOTelApi({ host: this._core });\n\n                // Act\n                suppressTracing(otelApi);\n\n                // Assert\n                Assert.equal(isTracingSuppressed(otelApi), true,\n                    \"Should suppress tracing on otelApi instance\");\n\n                // Cleanup\n                unsuppressTracing(otelApi);\n            }\n        });\n\n        this.testCase({\n            name: \"suppressTracing: should work with config instance\",\n            test: () => {\n                // Arrange\n                const config = {\n                    instrumentationKey: \"test\",\n                    traceCfg: {}\n                } as any;\n\n                // Act\n                suppressTracing(config);\n\n                // Assert\n                Assert.equal(isTracingSuppressed(config), true,\n                    \"Should suppress tracing on config instance\");\n\n                // Cleanup\n                unsuppressTracing(config);\n            }\n        });\n\n        this.testCase({\n            name: \"isTracingSuppressed: should handle undefined traceCfg properties\",\n            test: () => {\n                // Arrange\n                const config = {\n                    traceCfg: {\n                        // suppressTracing is undefined\n                    }\n                } as any;\n\n                // Act\n                const result = isTracingSuppressed(config);\n\n                // Assert\n                Assert.equal(result, false, \"Should return false when suppressTracing is undefined\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/AppInsightsCommon.tests.ts",
    "content": "import { strRepeat } from \"@nevware21/ts-utils\";\nimport { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { DiagnosticLogger } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\nimport { dataSanitizeInput, dataSanitizeKey, dataSanitizeMessage, DataSanitizerValues, dataSanitizeString, dataSanitizeUrl } from \"../../../../src/telemetry/ai/Common/DataSanitizer\";\nimport { UrlRedactionOptions } from \"../../../../src/enums/ai/UrlRedactionOptions\"\n\nexport class ApplicationInsightsTests extends AITestClass {\n    logger = new DiagnosticLogger();\n\n\n    public testInitialize() {\n   \n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        // test cases for sanitizeMessage function\n        this.testCase({\n            name: 'DataSanitizerTests: messages are well processed.',\n            test: () => {\n                // const define\n                const MAX_MESSAGE_LENGTH = DataSanitizerValues.MAX_MESSAGE_LENGTH;\n               \n                // use cases\n                const messageShort: String = \"hi\";\n                const messageLong = strRepeat(\"abc\", MAX_MESSAGE_LENGTH + 1);\n                \n                // Assert\n                Assert.equal(messageShort.length, dataSanitizeMessage(this.logger, messageShort).length);\n                Assert.notEqual(messageLong.length, dataSanitizeMessage(this.logger, messageLong).length);\n                Assert.equal(MAX_MESSAGE_LENGTH, dataSanitizeMessage(this.logger, messageLong).length);\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: throwInternal function is called correctly in sanitizeMessage function',\n            test: () => {\n                // const define\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n                const MAX_MESSAGE_LENGTH = DataSanitizerValues.MAX_MESSAGE_LENGTH;\n                \n                // use cases\n                const messageShort: String = \"hi\";\n                const messageLong = strRepeat(\"a\", MAX_MESSAGE_LENGTH + 2);\n\n                // Act\n                dataSanitizeMessage(this.logger, messageShort);\n                Assert.ok(loggerStub.notCalled);\n                Assert.equal(0, loggerStub.callCount);\n\n                dataSanitizeMessage(this.logger, messageLong);\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                dataSanitizeMessage(this.logger, messageLong);\n                Assert.ok(loggerStub.calledTwice);\n                Assert.equal(2, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: messages are fully logged through console',\n            test: () => {\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n\n                // const define\n                const MAX_MESSAGE_LENGTH = DataSanitizerValues.MAX_MESSAGE_LENGTH;\n               \n                // use cases\n                const messageShort: String = \"hi\";\n                const messageLong = strRepeat(\"a\", MAX_MESSAGE_LENGTH + 1);\n\n                Assert.equal(messageShort, dataSanitizeMessage(this.logger, messageShort));\n                Assert.ok(loggerStub.notCalled);\n                Assert.equal(0, loggerStub.callCount);\n\n                Assert.equal(messageLong.substring(0, MAX_MESSAGE_LENGTH), dataSanitizeMessage(this.logger, messageLong));\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n\n        // test cases for sanitizeString function\n        this.testCase({\n            name: 'DataSanitizerTest: strings are well processed',\n            test: () => {\n                // const define\n                const MAX_STRING_LENGTH = DataSanitizerValues.MAX_STRING_LENGTH;\n               \n                // use cases\n                const strShort: String = \"hi\";\n                const strLong = strRepeat(\"a\", MAX_STRING_LENGTH + 2);\n                \n                // Assert\n                Assert.equal(strShort.length, dataSanitizeString(this.logger, strShort).length);\n                Assert.notEqual(strLong.length, dataSanitizeString(this.logger, strLong).length);\n                Assert.equal(MAX_STRING_LENGTH, dataSanitizeString(this.logger, strLong).length);\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: throrwInternal function is called correctly in sanitizeString function',\n            test: () => {\n                // const define\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n                const MAX_STRING_LENGTH = DataSanitizerValues.MAX_STRING_LENGTH;\n                \n                // use cases\n                const strShort: String = \"hi\";\n                const strLong = strRepeat(\"a\", MAX_STRING_LENGTH + 2);\n\n                // Act\n                dataSanitizeString(this.logger, strShort);\n                Assert.ok(loggerStub.notCalled);\n                Assert.equal(0, loggerStub.callCount);\n\n                dataSanitizeString(this.logger, strLong);\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                dataSanitizeString(this.logger, strLong);\n                Assert.ok(loggerStub.calledTwice);\n                Assert.equal(2, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: strings are fully logged through console',\n            test: () => {\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n\n                // const define\n                const MAX_STRING_LENGTH = DataSanitizerValues.MAX_STRING_LENGTH;\n               \n                // use cases\n                const strShort: String = \"hi\";\n                const strLong = strRepeat(\"a\", MAX_STRING_LENGTH + 2);\n\n                Assert.equal(strShort, dataSanitizeString(this.logger, strShort));\n                Assert.ok(loggerStub.notCalled);\n                Assert.equal(0, loggerStub.callCount);\n\n                Assert.equal(strLong.substring(0, MAX_STRING_LENGTH), dataSanitizeString(this.logger, strLong));\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n\n        // test cases for sanitizeKey function\n        this.testCase({\n            name: 'DataSanitizerTest: names are well processed',\n            test: () => {\n                // const define\n                const MAX_NAME_LENGTH = DataSanitizerValues.MAX_NAME_LENGTH;\n               \n                // use cases\n                const nameShort: String = \"hi\";\n                const nameLong = strRepeat(\"a\", MAX_NAME_LENGTH + 2);\n                \n                // Assert\n                Assert.equal(nameShort.length, dataSanitizeKey(this.logger, nameShort).length);\n                Assert.notEqual(nameLong.length, dataSanitizeKey(this.logger, nameLong).length);\n                Assert.equal(MAX_NAME_LENGTH, dataSanitizeKey(this.logger, nameLong).length);\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: throrwInternal function is called correctly in sanitizeKey function',\n            test: () => {\n                // const define\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n                const MAX_NAME_LENGTH = DataSanitizerValues.MAX_NAME_LENGTH;\n                \n                // use cases\n                const nameShort: String = \"hi\";\n                const nameLong = strRepeat(\"a\", MAX_NAME_LENGTH + 2);\n\n                // Act\n                dataSanitizeKey(this.logger, nameShort);\n                Assert.ok(loggerStub.notCalled);\n                Assert.equal(0, loggerStub.callCount);\n\n                dataSanitizeKey(this.logger, nameLong);\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                dataSanitizeKey(this.logger, nameLong);\n                Assert.ok(loggerStub.calledTwice);\n                Assert.equal(2, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: names are fully logged through console',\n            test: () => {\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n\n                // const define\n                const MAX_NAME_LENGTH = DataSanitizerValues.MAX_NAME_LENGTH;\n               \n                // use cases\n                const nameShort: String = \"hi\";\n                const nameLong = strRepeat(\"a\", MAX_NAME_LENGTH + 2);\n\n                Assert.equal(nameShort, dataSanitizeKey(this.logger, nameShort));\n                Assert.ok(loggerStub.notCalled);\n\n                Assert.equal(nameLong.substring(0, MAX_NAME_LENGTH), dataSanitizeKey(this.logger, nameLong));\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n\n        // test cases for sanitizeInput function\n        this.testCase({\n            name: 'DataSanitizerTest: inputs are well processed',\n            test: () => {\n                const MAX_INPUT_LENGTH = 1024;\n\n                // use cases\n                const inputShort: String = \"hi\";\n                const inputLong = strRepeat(\"a\", MAX_INPUT_LENGTH + 2);\n                \n                // Assert\n                Assert.equal(inputShort.length, dataSanitizeInput(this.logger, inputShort, MAX_INPUT_LENGTH, 0).length);\n                Assert.notEqual(inputLong.length, dataSanitizeInput(this.logger, inputLong, MAX_INPUT_LENGTH, 0).length);\n                Assert.equal(MAX_INPUT_LENGTH, dataSanitizeInput(this.logger, inputLong, MAX_INPUT_LENGTH, 0).length);\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: throwInternal function is called correctly in sanitizeInput function',\n            test: () => {\n                // const define\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n                const MAX_INPUT_LENGTH = 1024;\n                \n                // use cases\n                const inputShort: String = \"hi\";\n                const inputLong = strRepeat(\"a\", MAX_INPUT_LENGTH + 2);\n\n                // Act\n                dataSanitizeInput(this.logger, inputShort, MAX_INPUT_LENGTH, 0);\n                Assert.ok(loggerStub.notCalled);\n                Assert.equal(0, loggerStub.callCount);\n\n                dataSanitizeInput(this.logger, inputLong, MAX_INPUT_LENGTH, 0);\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                dataSanitizeInput(this.logger, inputLong, MAX_INPUT_LENGTH, 0);\n                Assert.ok(loggerStub.calledTwice);\n                Assert.equal(2, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: inputs are fully logged through console',\n            test: () => {\n                const loggerStub = this.sandbox.stub(this.logger , \"throwInternal\");\n\n                // const define\n                const MAX_INPUT_LENGTH = 1024;\n               \n                // use cases\n                const inputShort: String = \"hi\";\n                const inputLong = strRepeat(\"a\", MAX_INPUT_LENGTH + 2);\n\n                Assert.equal(inputShort, dataSanitizeInput(this.logger, inputShort, MAX_INPUT_LENGTH, 0));\n                Assert.ok(loggerStub.notCalled);\n                Assert.equal(0, loggerStub.callCount);\n\n                Assert.equal(inputLong.substring(0, MAX_INPUT_LENGTH), dataSanitizeInput(this.logger, inputLong, MAX_INPUT_LENGTH, 0));\n                Assert.ok(loggerStub.calledOnce);\n                Assert.equal(1, loggerStub.callCount);\n\n                loggerStub.restore();\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl properly redacts credentials in URLs with config enabled',\n            test: () => {\n                // URLs with credentials\n                let config = {} as IConfiguration;\n                const urlWithCredentials = \"https://username:password@example.com/path\";\n                const expectedRedactedUrl = \"https://REDACTED:REDACTED@example.com/path\";\n\n                // Act & Assert\n                const result = dataSanitizeUrl(this.logger, urlWithCredentials, config);\n                Assert.equal(expectedRedactedUrl, result);\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl properly redacts credentials in URLs with config disabled',\n            test: () => {\n                // URLs with credentials\n                let config = {redactUrls: false} as IConfiguration;\n                const urlWithCredentials = \"https://username:password@example.com/path\";\n\n                // Act & Assert\n                const result = dataSanitizeUrl(this.logger, urlWithCredentials, config);\n                Assert.equal(urlWithCredentials, result);\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl handles invalid URLs',\n            test: () => {\n                // Invalid URL that will cause URL constructor to throw\n                const invalidUrl = 123545;\n\n                // Act & Assert\n                const result = dataSanitizeUrl(this.logger, invalidUrl);\n                Assert.equal(invalidUrl, result, \"Invalid URLs should be returned unchanged\");\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl still enforces maximum length after redaction',\n            test: () => {\n                // Setup\n                let config = {} as IConfiguration;\n                const loggerStub = this.sandbox.stub(this.logger, \"throwInternal\");\n                const MAX_URL_LENGTH = DataSanitizerValues.MAX_URL_LENGTH;\n\n                // Create a very long URL with sensitive information\n                const longBaseUrl = \"https://username:password@example.com/\";\n                const longPathPart = strRepeat(\"a\", MAX_URL_LENGTH);\n                const longUrl = longBaseUrl + longPathPart;\n\n                // Act\n                const result = dataSanitizeUrl(this.logger, longUrl, config);\n\n                // Assert\n                Assert.equal(MAX_URL_LENGTH, result.length, \"URL should be truncated to maximum length\");\n                Assert.equal(true, result.indexOf(\"REDACTED\") > -1, \"Redaction should happen before truncation\");\n                Assert.ok(loggerStub.calledOnce, \"Logger should be called once for oversized URL\");\n\n                loggerStub.restore();\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl handles null and undefined inputs',\n            test: () => {\n                // Act & Assert\n                const nullResult = dataSanitizeUrl(this.logger, null);\n                Assert.equal(null, nullResult, \"Null input should return null\");\n\n                const undefinedResult = dataSanitizeUrl(this.logger, undefined);\n                Assert.equal(undefined, undefinedResult, \"Undefined input should return undefined\");\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl preserves URLs with no sensitive information',\n            test: () => {\n                // URL with no sensitive information\n                let config = {} as IConfiguration;\n                const safeUrl = \"https://example.com/api?param1=value1&param2=value2\";\n\n                // Act & Assert\n                const result = dataSanitizeUrl(this.logger, safeUrl, config);\n                Assert.equal(safeUrl, result, \"URL with no sensitive info should remain unchanged\");\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl properly redacts sensitive query parameters',\n            test: () => {\n                // URLs with sensitive query parameters\n                let config = {} as IConfiguration;\n                const urlWithSensitiveParams = \"https://example.com/api?Signature=secret&normal=value\";\n                const expectedRedactedUrl = \"https://example.com/api?Signature=REDACTED&normal=value\";\n\n                // Act & Assert\n                const result = dataSanitizeUrl(this.logger, urlWithSensitiveParams, config);\n                Assert.equal(expectedRedactedUrl, result);\n            }\n        });\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl properly redacts sensitive query parameters (default + custom)',\n            test: () => {\n                // URLs with sensitive query parameters\n                let config = {\n                    redactUrls: UrlRedactionOptions.appendToDefault,\n                    redactQueryParams: [\"authorize\", \"api_key\", \"password\"]\n                } as IConfiguration;\n                const urlWithSensitiveParams = \"https://example.com/api?Signature=secret&authorize=value\";\n                const expectedRedactedUrl = \"https://example.com/api?Signature=REDACTED&authorize=REDACTED\";\n\n                // Act & Assert\n                const result = dataSanitizeUrl(this.logger, urlWithSensitiveParams, config);\n                Assert.equal(expectedRedactedUrl, result);\n            }\n        });\n\n        this.testCase({\n            name: 'DataSanitizerTests: dataSanitizeUrl properly redacts sensitive query parameters (only custom)',\n            test: () => {\n                // URLs with sensitive query parameters\n                let config = {\n                    redactUrls: UrlRedactionOptions.replaceDefault,\n                    redactQueryParams: [\"authorize\", \"api_key\", \"password\"]\n                } as IConfiguration;\n                const urlWithSensitiveParams = \"https://example.com/api?Signature=secret&authorize=value\";\n                const expectedRedactedUrl = \"https://example.com/api?Signature=secret&authorize=REDACTED\";\n\n                // Act & Assert\n                const result = dataSanitizeUrl(this.logger, urlWithSensitiveParams, config);\n                Assert.equal(expectedRedactedUrl, result);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/AppInsightsCoreSize.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from '@nevware21/ts-utils';\nimport { createPromise, doAwait, IPromise } from '@nevware21/ts-async';\nimport * as pako from \"pako\";\n\nconst PACKAGE_JSON = \"../package.json\";\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction _loadPackageJson(cb:(isNightly: boolean, packageJson: any) => IPromise<void>): IPromise<void> {\n    return createPromise<void>((testCompleted, testFailed) => {\n        function _handleCallback(packageJson: any) {\n            let version = packageJson.version || \"unknown\";\n            let isNightly = version.includes(\"nightly\") || version.includes(\"dev\");\n            doAwait(cb(isNightly, packageJson), () => {\n                testCompleted();\n            }, (error) => {\n                Assert.ok(false, `checkIsNightlyBuild error: ${error}`);\n                testFailed(error);\n            });\n        }\n\n        fetch(PACKAGE_JSON).then((response) => {\n            if (!response.ok) {\n                Assert.ok(false, `fetch package.json error: ${dumpObj(response)}`);\n                _handleCallback(false);\n            } else {\n                return response.text().then((content) => {\n                    let json = JSON.parse(removeTrailingComma(content));\n                    _handleCallback(json);\n                }, (error) => {\n                    Assert.ok(false, `fetch package.json error: ${error}`);\n                    _handleCallback({});\n                });\n            }\n        }, (error) => {\n            Assert.ok(false, `fetch package.json error: ${error}`);\n            _handleCallback({});\n        });\n    });\n}\n\nfunction _checkSize(checkType: string, maxSize: number, size: number, isNightly: boolean): void {\n    if (isNightly) {\n        maxSize += .5;\n    }\n\n    Assert.ok(size <= maxSize, `exceed ${maxSize} KB, current ${checkType} size is: ${size} KB`);\n}\n\nexport class AppInsightsCoreSizeCheck extends AITestClass {\n    private readonly MAX_RAW_SIZE = 132;\n    private readonly MAX_BUNDLE_SIZE = 132;\n    private readonly MAX_RAW_DEFLATE_SIZE = 53;\n    private readonly MAX_BUNDLE_DEFLATE_SIZE = 53;\n    private readonly rawFilePath = \"../dist/es5/index.min.js\";\n    private readonly prodFilePath = \"../browser/es5/applicationinsights-core-js.min.js\";\n\n    public testInitialize() {\n    }\n\n    public testCleanup() {\n    }\n\n    public registerTests() {\n        this.addRawFileSizeCheck();\n        this.addProdFileSizeCheck();\n    }\n\n    constructor() {\n        super(\"AppInsightsCoreSizeCheck\");\n    }\n\n    private addRawFileSizeCheck(): void {\n        this._fileSizeCheck(false);\n    }\n\n    private addProdFileSizeCheck(): void {\n        this._fileSizeCheck(true);\n    }\n    \n    private _fileSizeCheck(isProd: boolean): void {\n        let _filePath = isProd? this.prodFilePath : this.rawFilePath;\n        let _maxFullSize = isProd ? this.MAX_BUNDLE_SIZE : this.MAX_RAW_SIZE;\n        let _maxDeflateSize = isProd ? this.MAX_BUNDLE_DEFLATE_SIZE : this.MAX_RAW_DEFLATE_SIZE;\n        let postfix = isProd ? \"\" : \"-raw\";\n        let fileName = _filePath.split(\"..\")[1];\n        this.testCase({\n            name: `Test applicationinsights-core${postfix} deflate size`,\n            test: () => {\n                Assert.ok(true, `test file: ${fileName}`);\n                return _loadPackageJson((isNightly, packageJson) => {\n                    Assert.ok(true, `  checking : ${packageJson.name || \"??\"} v${packageJson.version || \"unknown\"}`);\n                    let request = new Request(_filePath, {method:\"GET\"});\n                    return fetch(request).then((response) => {\n                        if (!response.ok) {\n                            Assert.ok(false, `applicationinsights-core${postfix} deflate size error: ${response.statusText}`);\n                            return;\n                        } else {\n                            return response.text().then(text => {\n                                let size = Math.ceil((text.length/1024) * 100) / 100.0;\n                                _checkSize(\"bundle\", _maxFullSize, size, isNightly);\n\n                                let deflateSize = Math.ceil((pako.deflate(text).length/1024) * 100) / 100.0;\n                                _checkSize(\"deflate\", _maxDeflateSize, deflateSize, isNightly);\n                                Assert.ok(deflateSize <= _maxDeflateSize ,`max ${_maxDeflateSize} KB, current deflate size is: ${deflateSize} KB`);\n                            }).catch((error) => {\n                                Assert.ok(false, `applicationinsights-core${postfix} response error: ${error}`);\n                            });\n                        }\n                    }).catch((error: Error) => {\n                        Assert.ok(false, `applicationinsights-core${postfix} deflate size error: ${error}`);\n                    });\n                });\n            }\n        });\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/ApplicationInsightsCore.Tests.ts",
    "content": "import { Assert, AITestClass, PollingAssert } from \"@microsoft/ai-test-framework\";\nimport { \n    IConfiguration, ITelemetryPlugin, ITelemetryItem, IPlugin, IAppInsightsCore, normalizeJsName,\n    random32, mwcRandomSeed, newId, randomValue, mwcRandom32, isNullOrUndefined, SenderPostManager,\n    OnCompleteCallback, IPayloadData, _ISenderOnComplete, TransportType, _ISendPostMgrConfig, fieldRedaction\n} from \"../../../../src/index\"\nimport { AppInsightsCore } from \"../../../../src/core/AppInsightsCore\";\nimport { IChannelControls } from \"../../../../src/interfaces/ai/IChannelControls\";\nimport { _eInternalMessageId, LoggingSeverity } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage, DiagnosticLogger } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { ActiveStatus } from \"../../../../src/enums/ai/InitActiveStatusEnum\";\nimport { createAsyncPromise, createAsyncRejectedPromise, createAsyncResolvedPromise, createTimeoutPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { setBypassLazyCache } from \"@nevware21/ts-utils\";\nimport { UrlRedactionOptions } from \"../../../../src/enums/ai/UrlRedactionOptions\"\n\nconst AIInternalMessagePrefix = \"AITR_\";\nconst MaxInt32 = 0xFFFFFFFF;\n\nexport class ApplicationInsightsCoreTests extends AITestClass {\n    private ctx: any;\n\n    public testInitialize() {\n        super.testInitialize();\n        this.ctx = {};\n        setBypassLazyCache(true);\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this.ctx = {};\n        \n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"ApplicationInsightsCore: Initialization validates input\",\n            test: () => {\n\n                const samplingPlugin = new TestSamplingPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                try {\n                    appInsightsCore.initialize(null, [samplingPlugin]);\n                } catch (error) {\n                    Assert.ok(true, \"Validates configuration\");\n                }\n\n                const config2: IConfiguration = {\n                    endpointUrl: \"https://dc.services.visualstudio.com/v2/track\",\n                    instrumentationKey: \"40ed4f60-2a2f-4f94-a617-22b20a520864\",\n                    extensionConfig: {}\n                };\n\n                try {\n                    appInsightsCore.initialize(config2, null);\n                } catch (error) {\n                    Assert.ok(true, \"Validates extensions are provided\");\n                }\n                const config: IConfiguration = {\n                    endpointUrl: \"https://dc.services.visualstudio.com/v2/track\",\n                    instrumentationKey: \"\",\n                    extensionConfig: {}\n                };\n                try {\n                    appInsightsCore.initialize(config, [samplingPlugin]);\n                } catch (error) {\n                    Assert.ok(true, \"Validates instrumentationKey\");\n                }\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1001;\n\n                const config3 = {\n                    extensions: [channelPlugin1],\n                    endpointUrl: \"https://dc.services.visualstudio.com/v2/track\",\n                    instrumentationKey: \"\",\n                    extensionConfig: {}\n                };\n                try {\n                    appInsightsCore.initialize(config3, [samplingPlugin]);\n                } catch (error) {\n                    Assert.ok(true, \"Validates channels cannot be passed in through extensions\");\n                }\n\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 200;\n\n                const config4 = {\n                    channels: [[channelPlugin2]],\n                    endpointUrl: \"https://dc.services.visualstudio.com/v2/track\",\n                    instrumentationKey: \"\",\n                    extensionConfig: {}\n                };\n\n                let thrown = false;\n                try {\n                    appInsightsCore.initialize(config4, [samplingPlugin]);\n                } catch (error) {\n                    thrown = true;\n                }\n                Assert.ok(thrown, \"Validates channels passed in through config, priority cannot be less Channel controller priority\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"SendPostManager: init and change with expected config\",\n            useFakeTimers: true,\n            test: () => {\n                let SendPostMgr = new SenderPostManager();\n                let onXhrCalled = 0;\n                let onFetchCalled = 0;\n                let onBeaconRetryCalled = 0;\n                let onCompleteFuncs = {\n                    fetchOnComplete: (response: Response, onComplete: OnCompleteCallback, resValue?: string, payload?: IPayloadData) => {\n                        onFetchCalled ++;\n                        Assert.equal(onFetchCalled, 1, \"onFetch is called once test1\");\n                    },\n                    xhrOnComplete: (request: XMLHttpRequest, onComplete: OnCompleteCallback, payload?: IPayloadData) => {\n                        if (request.readyState === 4) {\n                            onXhrCalled ++;\n                        }\n                        \n                    },\n                    beaconOnRetry: (data: IPayloadData, onComplete: OnCompleteCallback, canSend: (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => boolean) => {\n                        onBeaconRetryCalled ++;\n                    }\n\n                } as _ISenderOnComplete;\n\n                let onCompleteCallback = (status: number, headers: {\n                    [headerName: string]: string;\n                }, response?: string) => {\n                    return;\n                };\n                \n                let transports = [TransportType.Xhr, TransportType.Fetch, TransportType.Beacon];\n\n\n                // use xhr, appInsights\n                let config = {\n                    enableSendPromise: false,\n                    isOneDs: false,\n                    disableCredentials: false,\n                    disableXhr: false,\n                    disableBeacon: false,\n                    disableBeaconSync: false,\n                    senderOnCompleteCallBack: onCompleteFuncs\n                } as _ISendPostMgrConfig;\n                let payload = {\n                    urlString: \"test\",\n                    data: \"test data\"\n                } as IPayloadData;\n\n                SendPostMgr.initialize(config, new DiagnosticLogger());\n                let isInit = SendPostMgr[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(isInit, \"should init\");\n                let isOneDs = SendPostMgr[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(isOneDs, false, \"is not oneds\");\n                let credentials = SendPostMgr[\"_getDbgPlgTargets\"]()[2];\n                Assert.equal(credentials, false, \"credentials is set ot false\");\n                let promise = SendPostMgr[\"_getDbgPlgTargets\"]()[3];\n                Assert.equal(promise, false, \"promise is set ot false\");\n\n                let inst = SendPostMgr.getSenderInst(transports, false);\n                Assert.ok(inst, \"xhr interface should exist\");\n                inst.sendPOST(payload, onCompleteCallback, false);\n           \n\n                Assert.equal(this._getXhrRequests().length, 1, \"xhr is called once\");\n                let request = this._getXhrRequests()[0];\n                let reqHeaders = request.requestHeaders[\"Content-type\"];\n                Assert.equal(reqHeaders, \"application/json;charset=utf-8\");\n                this.sendJsonResponse(request, {}, 200);\n                Assert.equal(onXhrCalled, 1, \"onxhr is called once\");\n                Assert.equal(onFetchCalled, 0, \"onFetch is not called\");\n                Assert.equal(onBeaconRetryCalled, 0, \"onBeacon is not called\");\n\n                // use fetch, appInsghts\n                config = {\n                    enableSendPromise: false,\n                    isOneDs: false,\n                    disableCredentials: false,\n                    disableXhr: true,\n                    disableBeacon: false,\n                    disableBeaconSync: false,\n                    senderOnCompleteCallBack: onCompleteFuncs\n                } as _ISendPostMgrConfig;\n                SendPostMgr.SetConfig(config);\n\n                let res = {\n                    status: 200,\n                    headers: { \"Content-type\": \"application/json\" },\n                    value: {},\n                    ok: true,\n                    text: () => {\n                        return \"test\";\n                    }\n                };\n            \n                this.hookFetch((resolve) => {\n                    AITestClass.orgSetTimeout(function() {\n                        resolve(res);\n                    }, 0);\n                });\n\n                inst = SendPostMgr.getSenderInst(transports, false);\n                Assert.ok(inst, \"xhr interface should exist test1\");\n                inst.sendPOST(payload, onCompleteCallback, false);\n\n                this.clock.tick(10);\n\n\n                // use beacon\n                config = {\n                    enableSendPromise: false,\n                    isOneDs: false,\n                    disableCredentials: false,\n                    disableXhr: true,\n                    disableBeacon: false,\n                    disableBeaconSync: false,\n                    senderOnCompleteCallBack: onCompleteFuncs\n                } as _ISendPostMgrConfig;\n                SendPostMgr.SetConfig(config);\n                this.hookSendBeacon((url, data) => {\n                    return false;\n                });\n                transports = [TransportType.Xhr,TransportType.Beacon];\n                inst = SendPostMgr.getSenderInst(transports, false);\n                Assert.ok(inst, \"xhr interface should exist test2\");\n                inst.sendPOST(payload, onCompleteCallback, false);\n                Assert.equal(onBeaconRetryCalled, 1, \"onBeacon is not called test2\");\n\n                // change config, xhr\n                config = {\n                    enableSendPromise: true,\n                    isOneDs: true,\n                    disableCredentials: true,\n                    disableXhr: false,\n                    disableBeacon: true,\n                    disableBeaconSync: false,\n                    senderOnCompleteCallBack: onCompleteFuncs\n                } as _ISendPostMgrConfig;\n                SendPostMgr.SetConfig(config);\n                isInit = SendPostMgr[\"_getDbgPlgTargets\"]()[0];\n                Assert.ok(isInit, \"should init test3\");\n                isOneDs = SendPostMgr[\"_getDbgPlgTargets\"]()[1];\n                Assert.equal(isOneDs, true, \"is not oneds test3\");\n                credentials = SendPostMgr[\"_getDbgPlgTargets\"]()[2];\n                Assert.equal(credentials, true, \"credentials is set ot false test3\");\n                promise = SendPostMgr[\"_getDbgPlgTargets\"]()[3];\n                Assert.equal(promise, true, \"promise is set ot false test3\");\n\n                inst = SendPostMgr.getSenderInst(transports, false);\n                inst.sendPOST(payload, onCompleteCallback, false);\n\n                Assert.equal(this._getXhrRequests().length, 2, \"xhr is called once again for 1ds\");\n                request = this._getXhrRequests()[1];\n                reqHeaders = request.requestHeaders[\"Content-type\"];\n                Assert.ok(!reqHeaders, \"1ds post xhr request headers should be set by query parameters\");\n                this.sendJsonResponse(request, {}, 200);\n                Assert.equal(onXhrCalled, 2, \"onxhr is called twice\");\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: PerfMgr should be created as expected\",\n            test: () => {\n                let channelPlugin = new TestChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { \n                        instrumentationKey: \"testIkey\", \n                        channels: [[channelPlugin]],\n                        enablePerfMgr: true\n                    } as IConfiguration,\n                        \n                    []);\n                let perfMgr = appInsightsCore.getPerfMgr();\n                Assert.ok(perfMgr, \"perfMgr should be created without customized createPerfMgr function\");\n            }\n        });\n\n\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: Initialization initializes setNextPlugin\",\n            test: () => {\n                const samplingPlugin = new TestSamplingPlugin();\n                samplingPlugin.priority = 20;\n\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                // Assert prior to initialize\n                Assert.ok(!samplingPlugin.nexttPlugin, \"Not setup prior to pipeline initialization\");\n\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\" },\n                    [samplingPlugin, channelPlugin]);\n                Assert.ok(samplingPlugin._initialized, \"Make sure the plugin is initialized\");\n                Assert.ok(!!samplingPlugin.nexttPlugin, \"setup prior to pipeline initialization\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: Plugins can be added with same priority\",\n            test: () => {\n                const samplingPlugin = new TestSamplingPlugin();\n                samplingPlugin.priority = 20;\n\n                const samplingPlugin1 = new TestSamplingPlugin();\n                samplingPlugin1.priority = 20;\n\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n\n                const appInsightsCore = new AppInsightsCore();\n                try {\n                    appInsightsCore.initialize(\n                        { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\" },\n                        [samplingPlugin, samplingPlugin1, channelPlugin]);\n\n                    Assert.ok(\"No error on duplicate priority\");\n                } catch (error) {\n                    Assert.ok(false); // duplicate priority does not throw error\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: flush clears channel buffer\",\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\" },\n                    [channelPlugin]);\n\n                Assert.ok(!channelPlugin.isUnloadInvoked, \"Unload not called on initialize\");\n                appInsightsCore.getChannels().forEach((q: any) => {\n                    if (q.onunloadFlush) {\n                        q.onunloadFlush()\n                    }\n                });\n\n                Assert.ok(channelPlugin.isUnloadInvoked, \"Unload triggered for channel\");\n            }\n        });\n\n        this.testCase({\n            name: \"config.channel adds to the channels to the start of the extension channels\",\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1030;\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1030;\n\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", channels: [[channelPlugin1]] },\n                    [channelPlugin]);\n\n                const channelQueues = appInsightsCore.getChannels();\n                Assert.equal(2, channelQueues.length, \"Total number of channel queues\");\n                Assert.equal(channelQueues[0], channelPlugin1, \"Number of channels in queue 1\");\n                Assert.equal(channelQueues[1], channelPlugin, \"Number of channels in queue 2\");\n            }\n        });\n\n        this.testCase({\n            name: \"Initialization: channels adds and initialize with offline channel with channel config\",\n            useFakeTimers: true,\n            test: () => {\n                let offlineChannelPlugin = new TestOfflineChannelPlugin();\n\n                let channelPlugin = new TestChannelPlugin();\n              \n\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"testIkey\", channels: [[offlineChannelPlugin, channelPlugin]] },\n                    []);\n                this.clock.tick(1);\n\n                const channelQueues = appInsightsCore.getChannels();\n                Assert.equal(2, channelQueues.length, \"Total number of channel queues\");\n                Assert.equal(offlineChannelPlugin._isInit, true, \"offline channel is initialized\");\n            }\n        });\n\n        \n        this.testCase({\n            name: \"Initialization: channels adds and initialize with offline channel with extension config\",\n            useFakeTimers: true,\n            test: () => {\n                let offlineChannelPlugin = new TestOfflineChannelPlugin();\n\n                let channelPlugin = new TestChannelPlugin();\n              \n\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"testIkey\", channels: [[channelPlugin]] },\n                    [offlineChannelPlugin]);\n\n                const channelQueues = appInsightsCore.getChannels();\n                this.clock.tick(1);\n                Assert.equal(2, channelQueues.length, \"Total number of channel queues\");\n                Assert.equal(offlineChannelPlugin._isInit, true, \"offline channel is initialized\");\n            }\n        });\n\n        this.testCase({\n            name: 'ApplicationInsightsCore: track adds required default fields if missing',\n            useFakeTimers: true,\n            test: () => {\n                const expectedIKey: string = \"09465199-12AA-4124-817F-544738CC7C41\";\n                const expectedTimestamp = new Date().toISOString();\n                const expectedBaseType = \"EventData\";\n\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize({ instrumentationKey: expectedIKey }, [channelPlugin]);\n\n                // Act\n                const bareItem: ITelemetryItem = { name: 'test item' };\n                appInsightsCore.track(bareItem);\n                this.clock.tick(1);\n\n                // Test\n                Assert.equal(expectedIKey, bareItem.iKey, \"Instrumentation key is added\");\n                Assert.deepEqual(expectedTimestamp, bareItem.time, \"Timestamp is added\");\n            }\n        });\n\n        this.testCase({\n            name: 'ApplicationInsightsCore: track does not replace non-empty iKey',\n            useFakeTimers: true,\n            test: () => {\n                const configIkey: string = \"configIkey\";\n                const eventIkey: string = \"eventIkey\";\n\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize({ instrumentationKey:configIkey}, [channelPlugin]);\n\n                // Act\n                const bareItem: ITelemetryItem = { name: 'test item', iKey: eventIkey };\n                appInsightsCore.track(bareItem);\n                this.clock.tick(1);\n\n                // Test\n                Assert.equal(eventIkey, bareItem.iKey, \"Instrumentation key is replaced\");\n            }\n        });\n\n        this.testCase({\n            name: 'ApplicationInsightsCore: track does not set ext.sdk.ver',\n            useFakeTimers: true,\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize({ instrumentationKey: \"00000000-1111-2222-817F-544738CC7C41\" }, [channelPlugin]);\n\n                // Act\n                const bareItem: ITelemetryItem = { name: 'test item' };\n                appInsightsCore.track(bareItem);\n                this.clock.tick(1);\n\n                // Test - AppInsightsCore should NOT set ext.sdk.ver (only AppInsightsExtCore does)\n                Assert.equal(undefined, bareItem.ext, \"ext should not be set by AppInsightsCore\");\n            }\n        });\n\n        this.testCase({\n            name: 'ApplicationInsightsCore: track does not set ext.sdk.ver when ext is pre-populated',\n            useFakeTimers: true,\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize({ instrumentationKey: \"00000000-1111-2222-817F-544738CC7C41\" }, [channelPlugin]);\n\n                // Act - provide ext but no sdk.ver\n                const bareItem: ITelemetryItem = { name: 'test item', ext: { \"custom\": { \"field\": \"value\" } } };\n                appInsightsCore.track(bareItem);\n                this.clock.tick(1);\n\n                // Test - AppInsightsCore should NOT add sdk.ver to ext\n                Assert.ok(bareItem.ext, \"ext should still exist\");\n                Assert.equal(undefined, bareItem.ext[\"sdk\"], \"sdk should not be added by AppInsightsCore\");\n            }\n        });\n\n        this.testCase({\n            name: 'ApplicationInsightsCore: track does not overwrite ext.sdk.ver if already set',\n            useFakeTimers: true,\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize({ instrumentationKey: \"00000000-1111-2222-817F-544738CC7C41\" }, [channelPlugin]);\n\n                // Act - provide ext.sdk.ver explicitly\n                const bareItem: ITelemetryItem = { name: 'test item', ext: { \"sdk\": { \"ver\": \"custom-version\" } } };\n                appInsightsCore.track(bareItem);\n                this.clock.tick(1);\n\n                // Test - AppInsightsCore should not touch the existing ext.sdk.ver\n                Assert.equal(\"custom-version\", bareItem.ext[\"sdk\"][\"ver\"], \"ext.sdk.ver should remain unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"DiagnosticLogger: Critical logging history is saved\",\n            test: () => {\n                // Setup\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize({ instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", loggingLevelTelemetry: 999 }, [channelPlugin]);\n\n                const messageId = _eInternalMessageId.CannotAccessCookie; // can be any id\n\n                // Test precondition\n                Assert.equal(0, appInsightsCore.logger.queue.length, 'PRE: No logging recorded');\n\n                // Act\n                appInsightsCore.logger.throwInternal(LoggingSeverity.CRITICAL, messageId, \"Test Error\");\n\n                // Test postcondition\n                Assert.equal(1, appInsightsCore.logger.queue.length, \"POST: Correct messageId logged\");\n                Assert.ok(appInsightsCore.logger.queue[0].message.indexOf('Test Error') !== -1, \"Correct message logged\");\n                Assert.equal(messageId, appInsightsCore.logger.queue[0].messageId, \"Correct message logged\");\n            }\n        });\n\n        this.testCase({\n            name: 'DiagnosticLogger: Logger can be created with default constructor',\n            test: () => {\n                // setup\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.logger = new DiagnosticLogger();\n\n                const messageId = _eInternalMessageId.CannotAccessCookie; // can be any id\n\n                // Verify precondition\n                Assert.equal(0, appInsightsCore.logger.queue.length, 'PRE: No internal logging performed yet');\n\n                // Act\n                appInsightsCore.logger.throwInternal(LoggingSeverity.CRITICAL, messageId, \"Some message\");\n\n                // Test postcondition\n                Assert.equal(1, appInsightsCore.logger.queue.length, 'POST: Logging success');\n                Assert.equal(messageId, appInsightsCore.logger.queue[0].messageId, \"POST: Correct messageId logged\");\n\n                // Logging same error doesn't duplicate\n                Assert.equal(1, appInsightsCore.logger.queue.length, \"Pre: Only 1 logged message\");\n                appInsightsCore.logger.throwInternal(LoggingSeverity.CRITICAL, messageId, \"Some message\");\n                Assert.equal(1, appInsightsCore.logger.queue.length, \"Pre: Still only 1 logged message\");\n            }\n        });\n\n        // TODO: test no reinitialization\n        this.testCase({\n            name: \"Initialize: core cannot be reinitialized\",\n            test: () => {\n                // Setup\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const initFunction = () => appInsightsCore.initialize({ instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\" }, [channelPlugin]);\n\n                // Assert precondition\n                Assert.ok(!appInsightsCore.isInitialized(), \"PRE: core constructed but not initialized\");\n\n                // Init\n                initFunction();\n\n                // Assert initialized\n                Assert.ok(appInsightsCore.isInitialized(), \"core is initialized\");\n\n                Assert.throws(initFunction, Error, \"Core cannot be reinitialized\");\n            }\n        });\n\n        // TODO: test pollInternalLogs\n        this.testCase({\n            name: \"DiagnosticLogger: Logs can be polled\",\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        diagnosticLogInterval: 1\n                    }, [channelPlugin]);\n                const trackTraceSpy = this.sandbox.stub(appInsightsCore, \"track\");\n\n                Assert.equal(0, appInsightsCore.logger.queue.length, \"Queue is empty\");\n\n                // Setup queue\n                const queue: _InternalLogMessage[] = appInsightsCore.logger.queue;\n                queue.push(new _InternalLogMessage(1, \"Hello1\"));\n                queue.push(new _InternalLogMessage(2, \"Hello2\"));\n                const poller = appInsightsCore.pollInternalLogs();\n\n                // Assert precondition\n                Assert.equal(2, appInsightsCore.logger.queue.length, \"Queue contains 2 items\");\n\n                // Act\n                this.clock.tick(1);\n\n                // Assert postcondition\n                Assert.equal(0, appInsightsCore.logger.queue.length, \"Queue is empty\");\n\n                const data1 = trackTraceSpy.args[0][0];\n                Assert.ok(data1.baseData.message.indexOf(\"Hello1\") !== -1);\n\n                const data2 = trackTraceSpy.args[1][0];\n                Assert.ok(data2.baseData.message.indexOf(\"Hello2\") !== -1);\n\n                // Cleanup\n                poller.cancel();\n            }\n        });\n\n        // TODO: test stopPollingInternalLogs\n        this.testCase({\n            name: \"DiagnosticLogger: stop Polling InternalLogs flushes logs when not empty\",\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        diagnosticLogInterval: 1\n                    }, [channelPlugin]);\n\n                Assert.equal(0, appInsightsCore.logger.queue.length, \"Queue is empty\");\n\n                // Setup queue\n                const queue: _InternalLogMessage[] = appInsightsCore.logger.queue;\n                queue.push(new _InternalLogMessage(1, \"Hello1\"));\n                queue.push(new _InternalLogMessage(2, \"Hello2\"));\n                appInsightsCore.pollInternalLogs();\n\n                // Assert precondition\n                Assert.equal(2, appInsightsCore.logger.queue.length, \"Queue contains 2 items\");\n                \n                // Act\n                appInsightsCore.stopPollingInternalLogs();\n\n                // We now flush the internal logs when stop Polling internal logs is called\n                Assert.equal(0, appInsightsCore.logger.queue.length, \"Queue is empty\");\n\n                queue.push(new _InternalLogMessage(2, \"Hello3\"));\n                this.clock.tick(60000);\n\n                Assert.equal(1, appInsightsCore.logger.queue.length, \"Queue is not empty\");\n            }\n        });\n\n        // TODO: test stopPollingInternalLogs and check max size of the queue.\n        this.testCase({\n            name: \"DiagnosticLogger: stop Polling InternalLogs\",\n            useFakeTimers: true,\n            test: () => {\n                // Setup\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        diagnosticLogInterval: 1\n                    }, [channelPlugin]);\n\n                appInsightsCore.pollInternalLogs();\n\n                // Assert precondition\n                Assert.equal(0, appInsightsCore.logger.queue.length, \"Queue contains 0 items\");\n                \n                // Act\n                appInsightsCore.stopPollingInternalLogs();\n                let count = 1002;\n                while(count > 0) {\n                    appInsightsCore.logger.throwInternal(LoggingSeverity.CRITICAL, count, \"Test Error\");\n                    --count;\n                }\n\n                //  this.clock.tick(1000);\n                // Assert postcondition\n                Assert.equal(26, appInsightsCore.logger.queue.length, \"Queue is not empty\");\n            }\n        });\n\n        // TODO: test logger crosscontamination\n        this.testCase({\n            name: \"DiagnosticLogger: Logs in separate cores do not interfere\",\n            test: () => {\n                // Setup\n                const channelPlugin = new ChannelPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        loggingLevelTelemetry: 999\n                    }, [channelPlugin]\n                );\n                const dummyCore = new AppInsightsCore();\n                dummyCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        loggingLevelTelemetry: 999\n                    }, [channelPlugin]\n                );\n\n                const messageId = _eInternalMessageId.CannotAccessCookie; // can be any id\n\n                // Test precondition\n                Assert.equal(0, appInsightsCore.logger.queue.length, 'PRE: No internal logging performed yet');\n                Assert.equal(0, dummyCore.logger.queue.length, 'PRE: No dummy logging');\n\n                // Act\n                appInsightsCore.logger.throwInternal(LoggingSeverity.CRITICAL, messageId, \"Test Error\");\n\n                // Test postcondition\n                Assert.equal(1, appInsightsCore.logger.queue.length, 'POST: Logging success');\n                Assert.equal(0, dummyCore.logger.queue.length, 'POST: No dummy logging');\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: Plugins can be provided through configuration\",\n            test: () => {\n                const samplingPlugin = new TestSamplingPlugin();\n                samplingPlugin.priority = 20;\n\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n\n                const appInsightsCore = new AppInsightsCore();\n                try {\n                    appInsightsCore.initialize(\n                        { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", extensions: [samplingPlugin] },\n                        [channelPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"No error expected\");\n                }\n\n                let found = false;\n                Assert.equal(samplingPlugin, appInsightsCore.getPlugin(samplingPlugin.identifier).plugin, \"Plugin passed in through config is part of pipeline\");\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: Non telemetry specific plugins are initialized and not part of telemetry processing pipeline\",\n            test: () => {\n                const samplingPlugin = new TestSamplingPlugin();\n                samplingPlugin.priority = 20;\n\n                const testPlugin = new TestPlugin();\n\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n\n                const appInsightsCore = new AppInsightsCore();\n                try {\n                    appInsightsCore.initialize(\n                        { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\" },\n                        [testPlugin, samplingPlugin, channelPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Exception not expected\");\n                }\n\n                Assert.ok(typeof ((appInsightsCore as any)[\"_getDbgPlgTargets\"]()[0][0].processTelemetry) !== 'function', \"Extensions can be provided through overall configuration\");\n            }\n        });\n\n        this.testCase({\n            name: \"Channels can be passed in through configuration\",\n            test: () => {\n\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1001;\n\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 1002;\n\n                const channelPlugin3 = new ChannelPlugin();\n                channelPlugin3.priority = 1001;\n\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                        channels: [[channelPlugin1, channelPlugin2], [channelPlugin3]]\n                    },\n                    []);\n\n                Assert.ok(channelPlugin1._nextPlugin === channelPlugin2);\n                Assert.ok(isNullOrUndefined(channelPlugin3._nextPlugin));\n                const channelControls = appInsightsCore.getChannels();\n\n                Assert.ok(channelControls.length === 2);\n                Assert.ok(channelControls[0] === channelPlugin1);\n                Assert.ok(channelControls[1] === channelPlugin2);\n                \n                // Assert.ok(channelControls[0].length === 2);\n                // Assert.ok(channelControls[1].length === 1);\n                // Assert.ok(channelControls[0][0] === channelPlugin1);\n                // Assert.ok(channelControls[1][0] === channelPlugin3);\n                Assert.ok(channelPlugin1._nextPlugin === channelPlugin2);\n                Assert.ok(channelPlugin2._nextPlugin === undefined);\n            }\n        });\n\n        this.testCase({\n            name: 'ApplicationInsightsCore: user can add two channels in single queue',\n            test: () => {\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1001;\n\n                const channelPlugin2 = new ChannelPlugin();\n                channelPlugin2.priority = 1002;\n\n                const channelPlugin3 = new ChannelPlugin();\n                channelPlugin3.priority = 1003;\n\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                    },\n                    [channelPlugin3, channelPlugin2, channelPlugin1]);\n\n                Assert.ok(channelPlugin1._nextPlugin === channelPlugin2);\n                Assert.ok(channelPlugin2._nextPlugin === channelPlugin3);\n                Assert.ok(isNullOrUndefined(channelPlugin3._nextPlugin));\n                const channelControls = appInsightsCore.getChannels();\n                Assert.ok(channelControls.length === 3);\n                Assert.ok(channelControls[0] === channelPlugin1);\n                Assert.ok(channelControls[1] === channelPlugin2);\n                Assert.ok(channelControls[2] === channelPlugin3);\n            }\n        });\n\n        this.testCase({\n            name: 'ApplicationInsightsCore: Validates root level properties in telemetry item',\n            test: () => {\n                const expectedIKey: string = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                const samplingPlugin = new TestSamplingPlugin(true);\n                const appInsightsCore = new AppInsightsCore();\n                appInsightsCore.initialize({ instrumentationKey: expectedIKey }, [samplingPlugin, channelPlugin]);\n\n                // Act\n                const bareItem: ITelemetryItem = {\n                    name: 'test item',\n                    ext: {\n                        \"user\": { \"id\": \"test\" }\n                    },\n                    tags: [{ \"device.id\": \"AABA40BC-EB0D-44A7-96F5-ED2103E47AE9\" }],\n                    data: {\n                        \"custom data\": {\n                            \"data1\": \"value1\"\n                        }\n                    },\n                    baseType: \"PageviewData\",\n                    baseData: { name: \"Test Page\" }\n                };\n\n                appInsightsCore.track(bareItem);\n            }\n        });\n\n        this.testCase({\n            name: \"Channels work even if no extensions are present\",\n            test: () => {\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1030;\n                const appInsightsCore = new AppInsightsCore();\n                const channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                appInsightsCore.initialize(\n                    {\n                        instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\", channels: [[channelPlugin]]\n                    }, []);\n                const event: ITelemetryItem = { name: 'test' };\n                appInsightsCore.track(event);\n                const evt = channelSpy.args[0][0];\n                Assert.ok(evt.name === \"test\");\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: Track queue event when not all extensions are initialized\",\n            test: () => {\n                const trackPlugin = new TrackPlugin();\n                const channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                const appInsightsCore = new AppInsightsCore();\n                const channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                appInsightsCore.initialize(\n                    { instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\" },\n                    [trackPlugin, channelPlugin]);\n                Assert.ok(channelSpy.calledOnce, \"Channel process incorrect number of times\");\n                Assert.ok(channelSpy.args[0][0].name == \"TestEvent1\", \"Incorrect event\");\n                Assert.ok(appInsightsCore.eventCnt() == 0, \"Event queue wrong number of events\");\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore: Validate JS name normalization\",\n            test: () => {\n                Assert.equal(\"Hello\", normalizeJsName(\"Hello\"));\n                Assert.equal(\"Hello_World\", normalizeJsName(\"Hello.World\"));\n                Assert.equal(\"_Hello_World\", normalizeJsName(\"@Hello.World\"));\n                Assert.equal(\"_Hello_World\", normalizeJsName(\"#Hello.World\"));\n                Assert.equal(\"_Hello_World\", normalizeJsName(\".Hello#World\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\".Hello(World)\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\".Hello&World%\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\"!Hello=World+\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\"~Hello[World]\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\":Hello{World}\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\"\\'Hello\\'World;\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\"\\\"Hello\\\\World\\\"\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\"|Hello<World>\"));\n                Assert.equal(\"_Hello_World_\", normalizeJsName(\"?Hello,World-\"));\n            }\n        });\n\n        // init with ikey: null\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey null, will throw error message\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.NONE, \"default should be inactive status\");\n\n                let config = {\n                    instrumentationKey: undefined,\n                    endpointUrl: \"testUrl\"\n                } as IConfiguration;\n\n                let errorisCalled = false;\n\n                try {\n                    core.initialize(\n                        config,\n                        [trackPlugin, channelPlugin]);\n\n                } catch (e) {\n                    errorisCalled = true;\n                    Assert.ok(JSON.stringify(e.message).indexOf(\"Please provide instrumentation key\") > -1, \"should send provide ikey error message\");\n                }\n\n                Assert.ok(errorisCalled, \"ikey error should be called\");\n               \n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.equal(core.config.instrumentationKey, null, \"channel testIkey should be null\");\n                Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should not be changed\");\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.INACTIVE, \"default should be inactive status test1\");\n\n                core.track({name: \"test1\"});\n                Assert.ok(core.eventCnt() == 0, \"Event should not be queued\");\n\n                let isInit = core.isInitialized();\n                Assert.ok(!isInit, \"core is not initialized\");\n\n                // Test re-init with valid ikey\n                config.instrumentationKey = \"testIkey\";\n                \n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n                Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should be set\");\n                Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should not be changed\");\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"default should be active status again\");\n                isInit = core.isInitialized();\n                Assert.ok(isInit, \"core is initialized\");\n\n            }\n        });\n\n        // init with ikey: string, endpoint null\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey string, endpoint null\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.NONE, \"default should be inactive status\");\n\n                let config = {\n                    instrumentationKey: \"testIkey\",\n                    endpointUrl: undefined\n                } as IConfiguration;\n\n                let errorisCalled = false;\n\n                try {\n                    core.initialize(\n                        config,\n                        [trackPlugin, channelPlugin]);\n\n                } catch (e) {\n                    errorisCalled = true;\n                }\n\n                Assert.ok(!errorisCalled, \"ikey error should not be called\");\n               \n                Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                Assert.ok(core.eventCnt() == 0, \"Event should not be queued\");\n                let evt = channelSpy.args[0][0];\n                Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be null\");\n                Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                Assert.equal(core.config.endpointUrl, null, \"channel endpoint should not be changed\");\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"default should be active status test\");\n              \n            }\n        });\n\n        // init with ikey: string, endpointUrl: string\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey string, endpoint url string, dynamic changes with string\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.NONE, \"default should be pending status\");\n\n                let config = {\n                    instrumentationKey: \"testIkey\",\n                    endpointUrl: \"testUrl\"\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n\n                Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                Assert.ok(core.eventCnt() == 0, \"Event should not be queued\");\n                let evt = channelSpy.args[0][0];\n                Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be set\");\n                Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should be set\");\n                Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should be set\");\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"default should be active status\");\n        \n\n\n                core.config.instrumentationKey = \"testIkey1\";\n                core.config.endpointUrl = \"testUrl1\";\n                this.clock.tick(1);\n                core.track({name: \"test1\"});\n                Assert.equal(channelSpy.callCount, 2, \"channel should be called twice\");\n                Assert.ok(core.eventCnt() == 0, \"Event should not be queued test1\");\n                evt = channelSpy.args[1][0];\n                Assert.equal(evt.name, \"test1\", \"event name should be set\");\n                Assert.equal(evt.iKey, \"testIkey1\", \"event ikey should be set test1\");\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"default should be active status test1\");\n\n\n                // change the ikey to null again, inactive\n                core.config.instrumentationKey = undefined;\n                this.clock.tick(1);\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.INACTIVE, \"default should be inactive status test1\");\n              \n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey resolved promise, endpoint url resolved promise\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey\");\n                let urlPromise = createAsyncResolvedPromise(\"testUrl\");\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n        \n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n\n                // Returns a promise\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy;\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should be changed\");\n                        Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        let evt = channelSpy.args[0][0];\n                        Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be set\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey resolved promise, endpoint url rejected promise\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey\");\n                let urlPromise = createAsyncRejectedPromise(new Error(\"endpoint error\"));\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n        \n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n\n                // Returns a promise\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(()=> {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, null, \"channel endpoint should not be changed\");\n                        Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        let evt = channelSpy.args[0][0];\n                        Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be set\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey rejected promise, endpoint url rejected promise\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let ikeyPromise = createAsyncRejectedPromise(new Error(\"ikey error\"));\n                let urlPromise = createAsyncRejectedPromise(new Error(\"endpoint error\"));\n\n                this.ctx.ikeyPromise = ikeyPromise;\n                this.ctx.urlPromise = urlPromise;\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n            \n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n\n                // Returns a promise\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy\n                    let ikeyPromise = this.ctx.ikeyPromise;\n                    let urlPromise = this.ctx.urlPromise;\n                \n                    if (activeStatus === ActiveStatus.INACTIVE) {\n                        Assert.deepEqual(core.config.instrumentationKey, ikeyPromise, \"channel testIkey should not be changed\");\n                        Assert.deepEqual(core.config.endpointUrl, urlPromise, \"channel endpoint should not be changed\");\n                        Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        return true;\n                    }\n\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000))\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey promise chain, endpoint url promise chain\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let csPromise = createAsyncResolvedPromise(\"instrumentationKey=testIkey;endpoint=testUrl\");\n                let ikeyPromise = createAsyncPromise((resolve, reject) => {\n                    doAwaitResponse(csPromise, (res) => {\n                        if (!res.rejected) {\n                            resolve(\"testIkey\");\n                            return;\n                        }\n                        reject(new Error(\"ikey error\"));\n                    })\n                });\n                let urlPromise = createAsyncPromise((resolve, reject) => {\n                    doAwaitResponse(csPromise, (res) => {\n                        if (!res.rejected) {\n                            resolve(\"testUrl\");\n                            return;\n                        }\n                        reject(new Error(\"url error\"));\n                    })\n                });\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n          \n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n                \n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should be changed\");\n                        Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        let evt = channelSpy.args[0][0];\n                        Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be set\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey mutiple layer promise chain, endpoint url mutiple layer promise chain\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let csPromise = createAsyncResolvedPromise(\"instrumentationKey=testIkey;endpoint=testUrl\");\n                let ikeyPromise = createAsyncPromise((resolve, reject) => {\n                    doAwaitResponse(csPromise, (res) => {\n                        if (!res.rejected) {\n                            resolve(createAsyncResolvedPromise(\"testIkey\"));\n                            return;\n                        }\n                        reject(createAsyncRejectedPromise(new Error(\"ikey error\")));\n                        return;\n                    })\n                });\n                let urlPromise = createAsyncPromise((resolve, reject) => {\n                    doAwaitResponse(csPromise, (res) => {\n                        if (!res.rejected) {\n                            resolve(createAsyncResolvedPromise(\"testUrl\"));\n                            return;\n                        }\n                        reject(createAsyncRejectedPromise(new Error(\"url error\")));\n                        return;\n                    })\n                });\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n          \n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy;\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should be changed\");\n                        Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        let evt = channelSpy.args[0][0];\n                        Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be set\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n        \n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey string, endpoint url string, dynamic changed with resolved promises\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n\n                let config = {\n                    instrumentationKey: \"testIkey\",\n                    endpointUrl: \"testUrl\",\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                Assert.ok(channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 0, \"Event should not be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"default should be active status\");\n                Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                let evt = channelSpy.args[0][0];\n                Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be set\");\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"default should be active status\");\n\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey1\");\n                let urlPromise = createAsyncResolvedPromise(\"testUrl1\");\n                core.config.instrumentationKey = ikeyPromise;\n                core.config.endpointUrl = urlPromise;\n                this.clock.tick(1);\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"active status should be set to active in next executing cycle\");\n                //Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(core.config.instrumentationKey, \"testIkey1\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl1\", \"channel endpoint should be changed\");\n                        core.track({name: \"test2\"});\n                        Assert.ok(core.eventCnt() == 0, \"Event should not be queued test1\");\n                        let evt = channelSpy.args[1][0];\n                        Assert.equal(evt.name, \"test2\", \"event name should be set test2\");\n                        Assert.equal(evt.iKey, \"testIkey1\", \"event ikey should be set test1\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey resolved promise, endpoint url resolved promise, dynamic change with promise\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey\");\n                let urlPromise = createAsyncResolvedPromise(\"testUrl\");\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n          \n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n                \n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy;\n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"active status should be set to active\");\n                        Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should be changed\");\n                        Assert.ok(channelSpy.calledOnce, \"channel should be called once\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        let evt = channelSpy.args[0][0];\n                        Assert.equal(evt.iKey, \"testIkey\", \"event ikey should be set\");\n\n                        let ikeyPromise = createAsyncResolvedPromise(\"testIkey1\");\n                        let urlPromise = createAsyncResolvedPromise(\"testUrl1\");\n                        core.config.instrumentationKey = ikeyPromise;\n                        core.config.endpointUrl = urlPromise;\n                        this.ctx.secondCall = true;\n                        //Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending test1\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise first response\" + new Date().toISOString(), 60, 1000)).concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy;\n            \n                    if (this.ctx.secondCall && activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(activeStatus, ActiveStatus.ACTIVE, \"active status should be set to active test1\");\n                        Assert.equal(core.config.instrumentationKey, \"testIkey1\", \"channel testIkey should not be changed test1\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl1\", \"channel endpoint should be changed test1\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        core.track({name: \"test1\"});\n                        let evt = channelSpy.args[1][0];\n                        Assert.equal(evt.name, \"test1\", \"event name should be set test2\");\n                        Assert.equal(evt.iKey, \"testIkey1\", \"event ikey should be set test1\");\n\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise second response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey promise, endpoint url promise, dynamic changed with strings\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n\n                let ikeyPromise = createAsyncResolvedPromise(\"testIkey\");\n                let urlPromise = createAsyncResolvedPromise(\"testUrl\");\n\n                let unresolveIkeyPromise = createAsyncPromise((resolve, reject) => {\n                    //do nothing,\n                }) // init with it, it should be pending\n\n                let newIkeyPromise = createAsyncPromise((resolve, reject) => {\n                    resolve(\"ikey\")\n                }) // init with it, pending, no changes or string\n                // resolve first one, active\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"default should be pending status\");\n\n                // status is pending, following changes should not be applied\n                core.config.instrumentationKey = \"testIkey1\";\n                core.config.endpointUrl = \"testUrl1\";\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy;\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should be changed\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should not be queued test1\");\n                        let evt1 = channelSpy.args[0][0];\n                        Assert.equal(evt1.iKey, \"testIkey\", \"event ikey should be set test1\");\n                        this.clock.tick(1);\n                        core.track({name: \"test2\"});\n                        let evt2 = channelSpy.args[1][0];\n                        Assert.equal(evt2.name, \"test2\", \"event name should be set test2\");\n                        Assert.equal(evt2.iKey, \"testIkey\", \"event ikey should be set test1\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey promise, endpoint url promise, dynamic changed with strings while waiting promises\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n\n                let urlPromise = createAsyncResolvedPromise(\"testUrl\");\n\n                let resolveFunc;\n\n                let ikeyPromise = createAsyncPromise((resolve, reject) => {\n                    resolveFunc = resolve;\n                    //do nothing, mock unresolve\n                });\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 80000\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"default should be pending status\");\n\n                // status is pending, following changes should not be applied\n                core.config.instrumentationKey = \"testIkey1\";\n                this.clock.tick(1);\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"default should be pending status\");\n\n                resolveFunc(\"testIkey\");\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy\n                \n                    if (activeStatus === ActiveStatus.ACTIVE) {\n                        Assert.equal(core.config.instrumentationKey, \"testIkey\", \"channel testIkey should not be changed\");\n                        Assert.equal(core.config.endpointUrl, \"testUrl\", \"channel endpoint should be changed\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should not be queued test1\");\n                        let evt1 = channelSpy.args[0][0];\n                        Assert.equal(evt1.iKey, \"testIkey\", \"event ikey should be set test1\");\n                        this.clock.tick(1);\n                        core.track({name: \"test2\"});\n                        let evt2 = channelSpy.args[1][0];\n                        Assert.equal(evt2.name, \"test2\", \"event name should be set test2\");\n                        Assert.equal(evt2.iKey, \"testIkey\", \"event ikey should be set test1\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey and endpoint timeout promises\",\n            useFakeTimers: true,\n            test: () => {\n                let trackPlugin = new TrackPlugin();\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let ikeyPromise = createTimeoutPromise(60, true,\"testIkey\");\n                let urlPromise = createTimeoutPromise(60, true, \"testUrl\");\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 1\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [trackPlugin, channelPlugin]);\n          \n\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                Assert.ok(core.eventCnt() == 1, \"Event should be queued\");\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy;\n                \n                    if (activeStatus === ActiveStatus.INACTIVE) {\n                        Assert.ok(!channelSpy.calledOnce, \"channel should not be called once\");\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: \"ApplicationInsightsCore Init: init with ikey timeout promises and endpoint promises\",\n            useFakeTimers: true,\n            test: () => {\n                let channelPlugin = new ChannelPlugin();\n                channelPlugin.priority = 1001;\n                let core = new AppInsightsCore();\n                let channelSpy = this.sandbox.stub(channelPlugin, \"processTelemetry\");\n\n                let ikeyPromise = createTimeoutPromise(20, true, \"testIkey1\");\n                let urlPromise = createTimeoutPromise(1, true, \"testUrl1\");\n\n                let config = {\n                    instrumentationKey: ikeyPromise,\n                    endpointUrl: urlPromise,\n                    initTimeOut: 6\n                } as IConfiguration;\n                core.initialize(\n                    config,\n                    [channelPlugin]);\n                this.ctx.core = core;\n                this.ctx.channelSpy = channelSpy;\n\n                let activeStatus = core.activeStatus();\n                Assert.equal(activeStatus, ActiveStatus.PENDING, \"active status should be set to pending\");\n                Assert.ok(!channelSpy.calledOnce, \"channel should not be called\");\n                core.track({name: \"testEvent\"});\n\n                return this._asyncQueue().concat(PollingAssert.asyncTaskPollingAssert(() => {\n                    let core = this.ctx.core;\n                    let activeStatus = core.activeStatus();\n                    let channelSpy = this.ctx.channelSpy\n                \n                    if (activeStatus === ActiveStatus.INACTIVE) {\n                        Assert.ok(core.eventCnt() == 0, \"Event should be released\");\n                        Assert.ok(!channelSpy.called, \"channel should not be called\");\n                        return true;\n                    }\n                    return false;\n                }, \"Wait for promise response\" + new Date().toISOString(), 60, 1000));\n            }\n        });\n\n        this.testCase({\n            name: 'newId tests length',\n            test: () => {\n                _checkNewId(5, newId(5), \"Test the previous length\");\n                _checkNewId(10, newId(10), \"Test the double the previous length\");\n                _checkNewId(22, newId(), \"Test new default length\");\n                _checkNewId(99, newId(99), \"Test 99 character == 74.25 bytes\");\n                _checkNewId(200, newId(200), \"Test 200 character == 150 bytes\");\n\n                // Check the id is not zero filled (\"A\") based on the an int32 === 5 base64 bytes (plus 2 bits)\n                let theNewId = newId();\n                Assert.notEqual(\"AAAAAAAAAAAAAAAA\", theNewId.substring(0, 16), \"Make sure that [\" + theNewId + \"] value is not zero filled (generally -- it is randomly possible)\")\n                Assert.notEqual(\"AAAAAAAAAAAAAAAA\", theNewId.substring(5), \"Make sure that [\" + theNewId + \"] value is not zero filled (generally -- it is randomly possible)\")\n            }\n        });\n\n        this.testCase({\n            name: 'newId check randomness',\n            timeout: 15000,\n            test: () => {\n                let map = {};\n\n                // Check that mwcRandom is bing called (relies on the mwc implementation from the default seed)\n                mwcRandomSeed(1);\n                Assert.notEqual(722346555, random32(), \"Make sure that the mwcRandom was not being called - step 1\");\n                Assert.notEqual(3284929732, random32(), \"Make sure that the mwcRandom was not being called - step2\");\n\n                // cause auto seeding again\n                mwcRandomSeed();\n\n                for (let lp = 0; lp < 10000; lp ++) {\n                    let theNewId = newId();\n                    if (map[theNewId]) {\n                        Assert.ok(false, \"[\" + theNewId + \"] was duplicated...\")\n                    }\n\n                    map[theNewId] = true;\n                }\n\n                mwcRandomSeed(1);\n                Assert.notEqual(722346555, random32(), \"Make sure that the mwcRandom was not being called\");\n            }\n        });\n\n        this.testCase({\n            name: 'newId check randomness -- emulating IE',\n            timeout: 15000,\n            test: () => {\n                let map = {};\n\n                // Enumlate IE\n                this.setUserAgent(\"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)\");\n                this.setCrypto(null);\n                \n                // Check that mwcRandom is bing called (relies on the mwc implementation from the default seed)\n                mwcRandomSeed(1);\n                Assert.equal(722346555, random32(), \"Make sure that the mwcRandom was being called - step 1\");\n                Assert.equal(3284929732, random32(), \"Make sure that the mwcRandom was being called - step2\");\n\n                // cause auto seeding again\n                mwcRandomSeed();\n                Assert.notEqual(722346555, random32(), \"Make sure that the mwcRandom was being called - step 3\");\n\n                for (let lp = 0; lp < 10000; lp ++) {\n                    let theNewId = newId();\n                    if (map[theNewId]) {\n                        Assert.ok(false, \"[\" + theNewId + \"] was duplicated...\")\n                    }\n\n                    map[theNewId] = true;\n                }\n\n                // Reset the seed and re-check the expected result\n                mwcRandomSeed(1);\n                Assert.equal(722346555, random32(), \"Make sure that the mwcRandom was not being called - step 4\");\n            }\n        });\n\n        this.testCase({\n            name: 'Test CoreUtils.randomValue() randomness and distribution',\n            timeout: 15000,\n            test: () => {\n                let numBuckets = 100;\n                let buckets: number[] = _createBuckets(100);\n                let runs = 1000000;\n\n                for (let lp = 0; lp < runs; lp++) {\n                    const bucket = randomValue(numBuckets-1);\n                    buckets[bucket] ++;\n                }\n\n                let min = 10;\n                let max = -1;\n                let mode = 0;\n            \n                for (let lp = 0; lp < numBuckets; lp++) {\n                    buckets[lp] /= runs;\n                    mode += buckets[lp];\n                    min = Math.min(min, buckets[lp]);\n                    max = Math.max(max, buckets[lp]);\n\n                    if (buckets[lp] === 0) {\n                        Assert.ok(false, 'Bucket: ' + lp + ' is empty!');\n                    }\n                }\n\n                Assert.equal(undefined, buckets[numBuckets], 'Make sure that we only allocated the correct number of buckets');\n            \n                const totalVariance = mode / numBuckets;\n\n                let perfectDist = 1 / numBuckets;\n                let testDist = perfectDist * 1.5;\n\n                Assert.ok(min > 0 && min <= testDist, min + ': Make sure that we have a good minimum distribution, perfect distribution is (1/bucketCount) = ' + perfectDist);\n                Assert.ok(max > 0 && max <= testDist, max + ': Make sure that we have a good maximum distribution, perfect distribution is (1/bucketCount) = ' + perfectDist);\n                Assert.ok(totalVariance > 0 && totalVariance <= testDist, totalVariance + ': Check the average distribution perfect distribution is (1/bucketCount) = ' + perfectDist);\n            }\n        });\n\n        this.testCase({\n            name: 'Test CoreUtils.random32() randomness and distribution',\n            timeout: 15000,\n            test: () => {\n                let numBuckets = 100;\n                let buckets: number[] = _createBuckets(100);\n                let runs = 1000000;\n\n                for (let lp = 0; lp < runs; lp++) {\n                    // Need to use floor otherwise the bucket is defined as a float as the index\n                    const bucket = Math.floor((random32() / MaxInt32) * numBuckets);\n                    buckets[bucket] ++;\n                }\n\n                let min = 10;\n                let max = -1;\n                let mode = 0;\n            \n                for (let lp = 0; lp < numBuckets; lp++) {\n                    buckets[lp] /= runs;\n                    mode += buckets[lp];\n                    min = Math.min(min, buckets[lp]);\n                    max = Math.max(max, buckets[lp]);\n\n                    if (buckets[lp] === 0) {\n                        Assert.ok(false, 'Bucket: ' + lp + ' is empty!');\n                    }\n                }\n\n                Assert.equal(undefined, buckets[numBuckets], 'Make sure that we only allocated the correct number of buckets');\n            \n                const totalVariance = mode / numBuckets;\n\n                let perfectDist = 1 / numBuckets;\n                let testDist = perfectDist * 1.5;\n\n                Assert.ok(min > 0 && min <= testDist, min + ': Make sure that we have a good minimum distribution, perfect distribution is (1/bucketCount) = ' + perfectDist);\n                Assert.ok(max > 0 && max <= testDist, max + ': Make sure that we have a good maximum distribution, perfect distribution is (1/bucketCount) = ' + perfectDist);\n                Assert.ok(totalVariance > 0 && totalVariance <= testDist, totalVariance + ': Check the average distribution perfect distribution is (1/bucketCount) = ' + perfectDist);\n            }\n        });\n\n        this.testCase({\n            name: 'Test CoreUtils.mwcRandom32() randomness and distribution',\n            timeout: 15000,\n            test: () => {\n                let numBuckets = 100;\n                let buckets: number[] = _createBuckets(100);\n                let runs = 1000000;\n\n                for (let lp = 0; lp < runs; lp++) {\n                    // Need to use floor otherwise the bucket is defined as a float as the index\n                    const bucket = Math.floor((mwcRandom32() / MaxInt32) * numBuckets);\n                    buckets[bucket] ++;\n                }\n\n                let min = 10;\n                let max = -1;\n                let mode = 0;\n            \n                for (let lp = 0; lp < numBuckets; lp++) {\n                    buckets[lp] /= runs;\n                    mode += buckets[lp];\n                    min = Math.min(min, buckets[lp]);\n                    max = Math.max(max, buckets[lp]);\n\n                    if (buckets[lp] === 0) {\n                        Assert.ok(false, 'Bucket: ' + lp + ' is empty!');\n                    }\n                }\n            \n                Assert.equal(undefined, buckets[numBuckets], 'Make sure that we only allocated the correct number of buckets');\n\n                const totalVariance = mode / numBuckets;\n\n                let perfectDist = 1 / numBuckets;\n                let testDist = perfectDist * 1.5;\n\n                Assert.ok(min > 0 && min <= testDist, min + ': Make sure that we have a good minimum distribution, perfect distribution is (1/bucketCount) = ' + perfectDist);\n                Assert.ok(max > 0 && max <= testDist, max + ': Make sure that we have a good maximum distribution, perfect distribution is (1/bucketCount) = ' + perfectDist);\n                Assert.ok(totalVariance > 0 && totalVariance <= testDist, totalVariance + ': Check the average distribution perfect distribution is (1/bucketCount) = ' + perfectDist);\n            }\n        });\n\n        this.testCase({\n            name: 'Test Excessive unload hook detection - make sure calling getPerfMgr() does not cause excessive unload hook detection',\n            test: () => {\n                const appInsightsCore = new AppInsightsCore();\n                const channelPlugin1 = new ChannelPlugin();\n                channelPlugin1.priority = 1001;\n\n                const theConfig = {\n                    channels: [[channelPlugin1]],\n                    endpointUrl: \"https://dc.services.visualstudio.com/v2/track\",\n                    instrumentationKey: \"\",\n                    extensionConfig: {}\n                };\n\n                appInsightsCore.initialize(theConfig, []);\n                Assert.equal(true, appInsightsCore.isInitialized(), \"Core is initialized\");\n\n                // Send lots of notifications\n                for (let lp = 0; lp < 100; lp++) {\n                    Assert.equal(null, appInsightsCore.getPerfMgr());\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should redact basic auth credentials from URL when config is enabled and should leave the URL unchanged when config is disabled\",\n            test: () => {\n                // Config is disabled\n                let config = { redactUrls: false } as IConfiguration;\n                const url = \"https://user:password@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, url,\n                    \"URL should remain unchanged when redaction is disabled\");\n                \n                // Config is enabled\n                let configEnabled = {} as IConfiguration;\n                const redactedLocationEnabled = fieldRedaction(url, configEnabled);\n                Assert.equal(redactedLocationEnabled, \"https://REDACTED:REDACTED@example.com\",\n                    \"URL with credentials should be redacted when redaction is enabled\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction:should not modify URL without credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://example.com/path\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com/path\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should preserve query parameters while redacting auth\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://www.example.com/path?color=blue&X-Goog-Signature=secret\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://www.example.com/path?color=blue&X-Goog-Signature=REDACTED\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should preserve query parameters while redacting auth when the query string is not in the set values\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"AISKU/Tests/UnitTests.html?sig=7cff0834\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"AISKU/Tests/UnitTests.html?sig=REDACTED\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should preserve query parameters while redacting auth - AWSAccessKeyId\",\n            test: () => {\n                let config = {redactUrls: false} as IConfiguration;\n                const url = \"https://www.example.com/path?color=blue&AWSAccessKeyId=secret\";\n                if (config.redactUrls === true){\n                    const redactedLocation = fieldRedaction(url, config);\n                    Assert.equal(redactedLocation, \"https://www.example.com/path?color=blue&AWSAccessKeyId=REDACTED\");\n                }\n                Assert.equal(url, \"https://www.example.com/path?color=blue&AWSAccessKeyId=secret\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle invalid URL format\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"invalid-url\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"invalid-url\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle special characters in credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user%20name:pass%20word@example.com\"\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"URL should have encoded credentials redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle URLs with multiple @ symbols\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user:pass@example.com/path@somewhere\"\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com/path@somewhere\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle empty URLs\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \" \";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \" \");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should properly redact URLs with ports\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user:pass@example.com:8080/path\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com:8080/path\",\n                    \"URL with port should have credentials redacted while preserving port\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should properly redact URLs with fragments\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user:pass@example.com/path?param=value#section\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com/path?param=value#section\",\n                    \"URL with fragment should have credentials redacted while preserving fragment\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle port-only URLs without credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://example.com:8080/api\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com:8080/api\",\n                    \"URL with port but no credentials should remain unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle URLs with IP addresses, ports and credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://admin:secret@192.168.1.1:8443/admin\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@192.168.1.1:8443/admin\",\n                    \"URL with IP address and port should have credentials redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle complex URLs with port, query parameters and fragment\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://username:password@example.com:8443/path/to/resource?sig=secret&color=blue#section2\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com:8443/path/to/resource?sig=REDACTED&color=blue#section2\",\n                    \"Complex URL should have credentials and sensitive query parameters redacted while preserving other components\");\n            }\n        });\n\n         this.testCase({\n            name: \"FieldRedaction: should not redact URLs when redaction is disabled in config, even if they contain credentials and sensitive query parameters\",\n            test: () => {\n                let config = {\n                    redactUrls: false,\n                } as IConfiguration;\n                const url = \"https://username:password@example.com:8443/path/to/resource?sig=secret&color=blue#section2\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://username:password@example.com:8443/path/to/resource?sig=secret&color=blue#section2\",\n                    \"URL should not redact credentials and sensitive query parameters when redaction is disabled in config\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle completely empty URL string\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"\", \"Empty string should be returned unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle URL with only whitespace characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"   \\t\\n  \";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"   \\t\\n  \", \"String with only whitespace should be returned unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle malformed protocol URL\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"http:/example.com\";  // Missing slash\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"http:/example.com\", \"Malformed URL should be returned unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle URLs with unusual characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://example.com/path with spaces?param=value with spaces\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com/path with spaces?param=value with spaces\", \n                    \"URL with spaces should be returned unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should return non-string values unchanged without processing\",\n            test: () => {\n                \n                let config = {} as IConfiguration;\n                // Test with null - should return null unchanged\n                const nullUrl = null;\n                const redactedLocation = fieldRedaction(nullUrl as any, config);\n                Assert.strictEqual(redactedLocation, null, \"fieldRedaction should return null unchanged\");\n                \n                // Test with number - should return the number unchanged\n                const numberUrl = 12345;\n                const redactedNumber = fieldRedaction(numberUrl as any, config);\n                Assert.strictEqual(redactedNumber, 12345, \"fieldRedaction should return number unchanged\");\n                \n                // Test with object - should return the object unchanged\n                const objectUrl = { url: \"https://example.com\" };\n                const redactedObject = fieldRedaction(objectUrl as any, config);\n                Assert.strictEqual(redactedObject, objectUrl, \"fieldRedaction should return object unchanged\");\n                \n                // Test with array - should return the array unchanged\n                const arrayUrl = [\"https://example.com\"];\n                const redactedArray = fieldRedaction(arrayUrl as any, config);\n                Assert.strictEqual(redactedArray, arrayUrl, \"fieldRedaction should return array unchanged\");\n                \n                // Test with boolean - should return the boolean unchanged\n                const boolUrl = true;\n                const redactedBool = fieldRedaction(boolUrl as any, config);\n                Assert.strictEqual(redactedBool, true, \"fieldRedaction should return boolean unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle URLs with Unicode characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user:пароль@例子.测试/路径?参数=值&sig=秘密\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@例子.测试/路径?参数=值&sig=REDACTED\",\n                    \"URL with Unicode characters should have credentials and sensitive parameters redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle file URLs\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"file:///C:/Users/username/Documents/file.txt\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"file:///C:/Users/username/Documents/file.txt\",\n                    \"File URLs should be returned unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle data URLs\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==\",\n                    \"Data URLs should be returned unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle URLs with multiple query parameters to redact\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://example.com/path?sig=secret&X-Goog-Signature=anothersecret&AWSAccessKeyId=keyvalue&color=blue\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com/path?sig=REDACTED&X-Goog-Signature=REDACTED&AWSAccessKeyId=REDACTED&color=blue\",\n                    \"URL with multiple sensitive query parameters should have all sensitive parameters redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle extremely long URLs\",\n            test: () => {\n                let config = {} as IConfiguration;\n                let longParam = \"value\".repeat(1000);\n                const url = `https://user:pass@example.com/path?param=${longParam}`;\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, `https://REDACTED:REDACTED@example.com/path?param=${longParam}`,\n                    \"Extremely long URLs should be handled correctly\");\n            }\n        });\n        \n        this.testCase({\n            name: \"FieldRedaction: should redact custom query parameters defined in redactQueryParams and replace custom queryParams\",\n            test: () => {\n                let config = {\n                    redactUrls: UrlRedactionOptions.replaceDefault,\n                    redactQueryParams: [\"authorize\", \"api_key\", \"password\"]\n                } as IConfiguration;\n                \n                const url = \"https://example.com/path?auth_token=12345&name=test&authorize=secret\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com/path?auth_token=12345&name=test&authorize=REDACTED\",\n                    \"URL with custom sensitive parameters should have them redacted while preserving other parameters\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should redact both default and custom query parameters\",\n            test: () => {\n                let config = {\n                    redactUrls: UrlRedactionOptions.appendToDefault,\n                    redactQueryParams: [\"auth_token\"]\n                } as IConfiguration;\n                \n                const url = \"https://example.com/path?sig=abc123&auth_token=12345&name=test\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com/path?sig=REDACTED&auth_token=REDACTED&name=test\",\n                    \"URL with both default and custom sensitive parameters should have all redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction:should replace custom parameters redactQueryParams when user specifies the replace config\",\n            test: () => {\n                let config = {\n                    redactUrls: UrlRedactionOptions.replaceDefault,\n                    redactQueryParams: [\"authorize\", \"api_key\"]\n                } as IConfiguration;\n                \n                const url = \"https://username:password@example.com/path?auth_token=12345&authorize=secret\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com/path?auth_token=12345&authorize=REDACTED\",\n                    \"URL with custom sensitive parameters should be redacted when query redaction is not disabled\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should not redact any query string values when custom query parameters are empty\",\n            test: () => {\n                let config = {\n                    redactUrls: UrlRedactionOptions.replaceDefault,\n                    redactQueryParams: []\n                } as IConfiguration;\n                \n                const url = \"https://example.com/path?auth_token=12345&name=test&authorize=secret\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com/path?auth_token=12345&name=test&authorize=secret\",\n                    \"URL with custom sensitive parameters should not be redacted when custom query parameters are empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle empty redactQueryParams array\",\n            test: () => {\n                let config = {} as IConfiguration;\n                \n                // Should still redact default parameters\n                const url = \"https://example.com/path?Signature=secret&custom_param=value\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://example.com/path?Signature=REDACTED&custom_param=value\",\n                    \"URL with default sensitive parameters should still be redacted with empty custom array\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction:should handle complex URLs with both credentials and custom query parameters\",\n            test: () => {\n                let config = {\n                    redactUrls: UrlRedactionOptions.appendToDefault,\n                    redactQueryParams: [\"authorize\", \"session_id\"]\n                } as IConfiguration;\n                \n                const url = \"https://user:pass@example.com/path?sig=secret&authorize=abc123&visible=true&session_id=xyz789\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \n                    \"https://REDACTED:REDACTED@example.com/path?sig=REDACTED&authorize=REDACTED&visible=true&session_id=REDACTED\",\n                    \"Complex URL should have both credentials and all sensitive parameters redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle encoded username and password with special characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user%40domain.com:p%40ssw%24rd@example.com/path\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com/path\",\n                    \"URL with encoded special characters in credentials should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle URL-encoded colon and at symbols in credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user%3Aname:pass%40word@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"URL with encoded colon and @ symbols should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle invalid protocol with credential pattern\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"invalid://user:pass@domain.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"invalid://REDACTED:REDACTED@domain.com\",\n                    \"Invalid protocol but valid credential pattern should still redact credentials\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle double-encoded credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user%2540domain:pass%2540word@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Double-encoded credentials should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle credentials with plus signs and spaces\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user+name:pass+word@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Credentials with plus signs should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle malformed URLs with multiple colons in userinfo\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user:pass:extra@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Malformed userinfo with extra colons should still be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle hexadecimal encoded credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user%41:pass%42@example.com\"; // %41 = A, %42 = B\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Hexadecimal encoded credentials should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle mixed case protocol with credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"HtTpS://User:Pass@Example.Com/Path\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"HtTpS://REDACTED:REDACTED@Example.Com/Path\",\n                    \"Mixed case URLs should still have credentials redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle non-standard port with encoded credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                //[SuppressMessage(\"Microsoft.Security\", \"CS002:SecretInNextLine\", Justification=\"Test file with mock credentials - not actual secrets\")]\n                const url = \"https://admin%21:secret%21@server.com:9443/admin\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@server.com:9443/admin\",\n                    \"Non-standard port with encoded credentials should be handled\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle credentials with international domain names\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user:пароль@тест.рф/path?param=value\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@тест.рф/path?param=value\",\n                    \"International domain names with credentials should be handled\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle malformed percent encoding in credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user%gg:pass%zz@example.com\"; // Invalid percent encoding\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Malformed percent encoding should still result in redaction\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle extremely long encoded credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                let longUser = \"user\".repeat(100) + \"%40domain\"; // This exceeds 200 chars\n                let longPass = \"pass\".repeat(100) + \"%21\";       // This exceeds 200 chars\n                const url = `https://${longUser}:${longPass}@example.com`;\n                const redactedLocation = fieldRedaction(url, config);\n                \n                // Since both username and password exceed 200 chars, they should NOT be redacted\n                Assert.equal(redactedLocation, url,\n                    \"Extremely long encoded credentials should not be redacted due to length limits\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle extremely long usernames without infinite looping\",\n            test: () => {\n                let config = {} as IConfiguration;\n                let longUsername = \"a\".repeat(300); // Exceed reasonable limits\n                const url = `https://${longUsername}:password@example.com`;\n                const redactedLocation = fieldRedaction(url, config);\n                \n                // Should either redact or leave unchanged, but not hang\n                Assert.ok(redactedLocation.length > 0, \"Should not cause infinite loop with long username\");\n                \n                // Since username exceeds 200 chars, it should NOT be redacted\n                Assert.equal(redactedLocation, url, \"Should leave very long usernames unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle extremely long passwords without infinite looping\",\n            test: () => {\n                let config = {} as IConfiguration;\n                let longPassword = \"p\".repeat(300); // Exceed reasonable limits\n                const url = `https://user:${longPassword}@example.com`;\n                const redactedLocation = fieldRedaction(url, config);\n                \n                // Should either redact or leave unchanged, but not hang\n                Assert.ok(redactedLocation.length > 0, \"Should not cause infinite loop with long password\");\n                \n                // Since password exceeds 200 chars, it should NOT be redacted\n                Assert.equal(redactedLocation, url, \"Should leave very long passwords unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle invalid scheme characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"ht@tp://user:pass@example.com\"; // Invalid scheme\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"ht@tp://user:pass@example.com\",\n                    \"Invalid scheme should not be processed\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle scheme with numbers and special characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"custom+scheme.2://user:pass@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"custom+scheme.2://REDACTED:REDACTED@example.com\",\n                    \"Valid scheme with numbers and special characters should work\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle username with colon but no password separator\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user:name@example.com\"; // No password, colon in username\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Username containing colon should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle credentials with newlines (potential injection)\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user\\nname:pass\\nword@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Credentials with newlines should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle credentials with tab characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user\\tname:pass\\tword@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Credentials with tab characters should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle regex metacharacters in credentials\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://user.*+?:pass[]{|}@example.com\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Regex metacharacters in credentials should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle credentials at exactly 200 character limit\",\n            test: () => {\n                let config = {} as IConfiguration;\n                let username200 = \"u\".repeat(200);\n                let password200 = \"p\".repeat(200);\n                const url = `https://${username200}:${password200}@example.com`;\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Credentials at exactly 200 character limit should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle credentials just over 200 character limit\",\n            test: () => {\n                let config = {} as IConfiguration;\n                let username201 = \"u\".repeat(201);\n                let password201 = \"p\".repeat(201);\n                const url = `https://${username201}:${password201}@example.com`;\n                const redactedLocation = fieldRedaction(url, config);\n                \n                // With {0,200} limit, this should NOT match and remain unchanged\n                Assert.equal(redactedLocation, url,\n                    \"Credentials over 200 character limit should not be matched\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle performance with deeply nested encoded characters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                let complexUser = \"%25\".repeat(50) + \"user\"; // Deeply encoded\n                let complexPass = \"%25\".repeat(50) + \"pass\";\n                const url = `https://${complexUser}:${complexPass}@example.com`;\n                \n                let startTime = performance.now();\n                const redactedLocation = fieldRedaction(url, config);\n                let endTime = performance.now();\n                \n                // Should complete quickly (under 10ms for safety)\n                Assert.ok(endTime - startTime < 10, \"Should process complex encoded strings quickly\");\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com\",\n                    \"Complex encoded credentials should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle scheme starting with number (invalid)\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"2http://user:pass@example.com\"; // Invalid - scheme can't start with number\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"2http://user:pass@example.com\",\n                    \"Invalid scheme starting with number should not be processed\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle empty scheme\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"://user:pass@example.com\"; // Empty scheme\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"://user:pass@example.com\",\n                    \"Empty scheme should not be processed\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle multiple occurrences of same parameter with empty values\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://example.com/path?sig=&color=blue&sig=value&sig=\";\n                const redactedLocation = fieldRedaction(url, config);\n                // Empty values should NOT be redacted, only non-empty values should be redacted\n                Assert.equal(redactedLocation, \"https://example.com/path?sig=&color=blue&sig=REDACTED&sig=\",\n                    \"Only non-empty sensitive parameter values should be redacted\");\n            }\n        });\n\n        this.testCase({\n                name: \"FieldRedaction: should redact credentials while preserving query strings when redactQueryParams is false\",\n            test: () => {\n                    let config = {\n                        redactUrls: 5\n                    } as IConfiguration;\n                    const url = \"https://user:password@example.com/path?sig=secret&color=blue&token=abc123\";\n                const redactedLocation = fieldRedaction(url, config);\n                    Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com/path?sig=secret&color=blue&token=abc123\",\n                        \"Credentials should be redacted while query string values remain unchanged when redactQueryParams is false\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle custom parameters with multiple occurrences and empty values\",\n            test: () => {\n                let config = {\n                    redactUrls: UrlRedactionOptions.replaceDefault,\n                    redactQueryParams: [\"auth_token\", \"session_id\"]\n                } as IConfiguration;\n                const url = \"https://example.com/path?auth_token=first&name=test&auth_token=&session_id=abc&session_id=\";\n                const redactedLocation = fieldRedaction(url, config);\n                // Only redact parameters that have actual values, not empty ones\n                Assert.equal(redactedLocation, \"https://example.com/path?auth_token=REDACTED&name=test&auth_token=&session_id=REDACTED&session_id=\",\n                    \"Only non-empty custom sensitive parameters should be redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should handle parameters without values mixed with valued parameters\",\n            test: () => {\n                let config = {} as IConfiguration;\n                const url = \"https://example.com/path?sig&color=blue&sig=secret&flag&sig\";\n                const redactedLocation = fieldRedaction(url, config);\n                // Parameters without values (no = sign) should remain unchanged\n                // Only parameters with actual values should be redacted\n                Assert.equal(redactedLocation, \"https://example.com/path?sig&color=blue&sig=REDACTED&flag&sig\",\n                    \"Parameters without values should remain unchanged while valued parameters are redacted\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should redact all parts of the URL (username, password, default query params) when redactUrls is set to True\",\n            test: () => {\n                let config = {\n                    redactUrls: true\n                } as IConfiguration;\n                const url = \"https://user:password@example.com/path?sig=secret&color=blue&token=abc123\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, \"https://REDACTED:REDACTED@example.com/path?sig=REDACTED&color=blue&token=abc123\",\n                \"All parts of the URL should be redacted when redactUrls is true\");\n            }\n        });\n\n        this.testCase({\n            name: \"FieldRedaction: should not redact credentials or query strings when redactUrls and redactQueryParams are false\",\n            test: () => {\n                let config = {\n                    redactUrls: UrlRedactionOptions.false\n                } as IConfiguration;\n                const url = \"https://user:password@example.com/path?sig=secret&color=blue&token=abc123\";\n                const redactedLocation = fieldRedaction(url, config);\n                Assert.equal(redactedLocation, url,\n                    \"Nothing should be redacted when both redactUrls and redactQueryParams are false\");\n            }\n        });\n\n        function _createBuckets(num: number) {\n            // Using helper function as TypeScript 2.5.3 is complaining about new Array<number>(100).fill(0);\n            let buckets: number[] = [];\n            for (let lp = 0; lp < num; lp++) {\n                buckets[lp] = 0;\n            }\n\n            return buckets;\n        }\n\n        function _checkNewId(idLen: number, newId: string, message: string) {\n            Assert.equal(idLen, newId.length, \"[\" + newId + \"] - \" + message);\n        }\n    }\n}\n\nclass TestSamplingPlugin implements ITelemetryPlugin {\n    public processTelemetry: (env: ITelemetryItem) => void;\n    public initialize: (config: IConfiguration) => void;\n    public identifier: string = \"AzureSamplingPlugin\";\n    /** @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead */\n    public setNextPlugin?: (next: ITelemetryPlugin) => void;\n    public priority: number = 5;\n    public version = \"1.0.31-Beta\";\n    public nexttPlugin: ITelemetryPlugin;\n    private samplingPercentage;\n    private _validateItem = false;\n    public _initialized = false;\n\n    constructor(validateItem: boolean = false) {\n        this.processTelemetry = this._processTelemetry.bind(this);\n        this.initialize = this._start.bind(this);\n        this.setNextPlugin = this._setNextPlugin.bind(this);\n        this._validateItem = validateItem;\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n        if (!env) {\n            throw Error(\"Invalid telemetry object\");\n        }\n\n        if (this._validateItem) {\n            Assert.ok(env.baseData);\n            Assert.ok(env.baseType);\n            Assert.ok(env.data);\n            Assert.ok(env.ext);\n            Assert.ok(env.tags);\n        }\n    }\n\n    private _start(config: IConfiguration) {\n        if (!config) {\n            throw Error(\"required configuration missing\");\n        }\n\n        const pluginConfig = config.extensions ? config.extensions[this.identifier] : null;\n        this.samplingPercentage = pluginConfig ? pluginConfig.samplingPercentage : 100;\n        this._initialized = true;\n    }\n\n    private _setNextPlugin(next: ITelemetryPlugin): void {\n        this.nexttPlugin = next;\n    }\n}\n\nclass ChannelPlugin implements IChannelControls {\n    public _nextPlugin: ITelemetryPlugin;\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n    public version: string = \"1.0.33-Beta\";\n\n    public processTelemetry;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    onunloadFlush(async?: boolean) {\n        this.isUnloadInvoked = true;\n    }\n\n    /** @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead */\n    setNextPlugin?(next: ITelemetryPlugin) {\n        this._nextPlugin = next;\n    }\n\n    public initialize = (config: IConfiguration) => {\n\n    }\n\n    public _processTelemetry(env: ITelemetryItem) {\n        console.log(JSON.stringify(env))\n    }\n}\n\nclass TestPlugin implements IPlugin {\n    public identifier: string = \"TestPlugin\";\n    public version: string = \"1.0.31-Beta\";\n\n    private _config: IConfiguration;\n\n    public initialize(config: IConfiguration) {\n        this._config = config;\n        // do custom one time initialization\n    }\n}\n\nclass TrackPlugin implements IPlugin {\n    public identifier: string = \"TrackPlugin\";\n    public version: string = \"1.0.31-Beta\";\n    public priority = 2;\n    public _nextPlugin: ITelemetryPlugin;\n    public isInitialized: any;\n    private _config: IConfiguration;\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) {\n        this._config = config;\n        core.track({ name: 'TestEvent1' });\n\n    }\n\n    /** @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead */\n    public setNextPlugin?(next: ITelemetryPlugin) {\n        this._nextPlugin = next;\n    }\n\n    public processTelemetry(evt: ITelemetryItem) {\n        this._nextPlugin?.processTelemetry(evt);\n    }\n}\n\nclass TestOfflineChannelPlugin implements IChannelControls {\n    public _nextPlugin: ITelemetryPlugin;\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n    public version: string = \"1.0.33-Beta\";\n\n    public processTelemetry;\n\n    public identifier = \"OfflineChannel\";\n\n    public priority: number = 1000;\n    public events: ITelemetryItem[] = [];\n\n    public _isInit: boolean = false;\n  \n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    onunloadFlush(async?: boolean) {\n        this.isUnloadInvoked = true;\n    }\n\n    /** @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead */\n    setNextPlugin?(next: ITelemetryPlugin) {\n        this._nextPlugin = next;\n    }\n\n    public initialize = (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: any) => {\n     \n        setTimeout(() => {\n            let plugin = core.getPlugin<IChannelControls>(\"Sender\");\n            let channel = plugin && plugin.plugin;\n            this._isInit = channel && channel.isInitialized();\n        }, 0);\n        \n    }\n\n    public isInitialized = () => {\n        return this._isInit;\n        \n    }\n\n    public _processTelemetry(env: ITelemetryItem) {\n        this.events.push(env);\n\n        // Just calling processTelemetry as this is the original design of the Plugins (as opposed to the newer processNext())\n    }\n\n}\n\nclass TestChannelPlugin implements IChannelControls {\n    public _nextPlugin: ITelemetryPlugin;\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n    public version: string = \"1.0.33-Beta\";\n\n    public processTelemetry;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n    public events: ITelemetryItem[] = [];\n    public _isInitialized: boolean = false;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    onunloadFlush(async?: boolean) {\n        this.isUnloadInvoked = true;\n    }\n\n    /** @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead */\n    setNextPlugin?(next: ITelemetryPlugin) {\n        this._nextPlugin = next;\n    }\n\n    public initialize = (config: IConfiguration) => {\n        this._isInitialized = true\n    }\n\n    \n    public isInitialized = () => {\n        return  this._isInitialized\n        \n    }\n\n\n    public _processTelemetry(env: ITelemetryItem) {\n        this.events.push(env);\n\n        // Just calling processTelemetry as this is the original design of the Plugins (as opposed to the newer processNext())\n        this._nextPlugin?.processTelemetry(env);\n    }\n}\n\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/ConnectionStringParser.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { ConnectionStringParser } from \"../../../../src/telemetry/ConnectionStringParser\";\nimport * as Constants from \"../../../../src/constants/Constants\";\n\nconst runTest = (options: {\n    connectionString: string,\n    expectedAuthorization?: string,\n    expectedInstrumentationKey?: string,\n    expectedBreezeEndpoint: string,\n}) => {\n    const result = ConnectionStringParser.parse(options.connectionString);\n\n    if (options.expectedAuthorization) {\n        Assert.deepEqual(result.authorization, options.expectedAuthorization);\n    }\n    if (options.expectedInstrumentationKey) {\n        Assert.deepEqual(result.instrumentationkey, options.expectedInstrumentationKey);\n    }\n    Assert.deepEqual(result.ingestionendpoint, options.expectedBreezeEndpoint);\n}\n\nexport class ConnectionStringParserTests extends AITestClass {\n\n    public testInitialize() {\n    }\n\n    public testCleanup() {}\n\n    public registerTests() {\n        this.testCase({\n            name: \"should parse all valid fields\",\n            test: () => {\n                const authorization = \"ikey\"\n                const instrumentationKey = \"instr_key\";\n                const ingestionEndpoint = \"ingest\";\n                const liveEndpoint = \"live\";\n                const connectionString = `Authorization=${authorization};InstrumentationKey=${instrumentationKey};IngestionEndpoint=${ingestionEndpoint};LiveEndpoint=${liveEndpoint}`;\n\n                const result = ConnectionStringParser.parse(connectionString);\n\n                Assert.deepEqual(result.authorization, authorization);\n                Assert.deepEqual(result.instrumentationkey, instrumentationKey);\n                Assert.deepEqual(result.ingestionendpoint, ingestionEndpoint);\n            }\n        });\n\n        this.testCase({\n            name: \"should ignore invalid fields\",\n            test: () => {\n                const authorization = \"ikey\"\n                const instrumentationKey = \"ikey\";\n                const ingestionEndpoint = \"ingest\";\n                const liveEndpoint = \"live\";\n                const connectionString = `Autho.rization=${authorization};Instrume.ntationKey=${instrumentationKey};Ingestion.Endpoint=${ingestionEndpoint};LiveEnd.point=${liveEndpoint}`;\n\n                const result = ConnectionStringParser.parse(connectionString);\n\n                Assert.deepEqual(result.authorization, undefined);\n                Assert.deepEqual(result.instrumentationkey, undefined);\n                Assert.deepEqual(result.ingestionendpoint, Constants.DEFAULT_BREEZE_ENDPOINT);\n            }\n        });\n\n        this.testCase({\n            name: \"should use correct default endpoints\",\n            test: () => {\n                runTest({\n                    connectionString: \"InstrumentationKey=00000000-0000-0000-0000-000000000000\",\n                    expectedAuthorization: undefined,\n                    expectedInstrumentationKey: \"00000000-0000-0000-0000-000000000000\",\n                    expectedBreezeEndpoint: Constants.DEFAULT_BREEZE_ENDPOINT,\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"should use correct endpoints when using EndpointSuffix\",\n            test: () => {\n                runTest({\n                    connectionString: \"InstrumentationKey=00000000-0000-0000-0000-000000000000;EndpointSuffix=ai.contoso.com\",\n                    expectedBreezeEndpoint: \"https://dc.ai.contoso.com\",\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"should use correct endpoints when using EndpointSuffix with explicit override\",\n            test: () => {\n                runTest({\n                    connectionString: \"InstrumentationKey=00000000-0000-0000-0000-000000000000;EndpointSuffix=ai.contoso.com;LiveEndpoint=https://custom.live.contoso.com:444\",\n                    expectedBreezeEndpoint: \"https://dc.ai.contoso.com\",\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"should parse EndpointSuffix + Location\",\n            test: () => {\n                runTest({\n                    connectionString: \"InstrumentationKey=00000000-0000-0000-0000-000000000000;EndpointSuffix=ai.contoso.com;Location=westus2\",\n                    expectedBreezeEndpoint: \"https://westus2.dc.ai.contoso.com\",\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"should parse EndpointSuffix + Location + Endpoint Override\",\n            test: () => {\n                runTest({\n                    connectionString: \"InstrumentationKey=00000000-0000-0000-0000-000000000000;EndpointSuffix=ai.contoso.com;Location=westus2;LiveEndpoint=https://custom.contoso.com:444\",\n                    expectedBreezeEndpoint: \"https://westus2.dc.ai.contoso.com\",\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"should parse Endpoint Override\",\n            test: () => {\n                runTest({\n                    connectionString: \"InstrumentationKey=00000000-0000-0000-0000-000000000000;LiveEndpoint=http://custom.live.endpoint.com:444\",\n                    expectedBreezeEndpoint: Constants.DEFAULT_BREEZE_ENDPOINT,\n                });\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/CookieManager.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore, createCookieMgr, IAppInsightsCore, IConfiguration, ICookieMgrConfig, IPlugin, ITelemetryItem, newId, objExtend } from \"../../../../src/index\"\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { setBypassLazyCache } from \"@nevware21/ts-utils\";\n\nexport class CookieManagerTests extends AITestClass {\n    private _cookieMgrCfg: ICookieMgrConfig;\n    private _config: IConfiguration;\n    private _testCookies;\n\n    constructor(emulateIe: boolean) {\n        super(\"CookieManagerTests\", emulateIe);\n    }\n\n    public testInitialize() {\n        let _self = this;\n        super.testInitialize();\n        setBypassLazyCache(true);\n        _self._testCookies = {};\n        _self._cookieMgrCfg = {\n            getCookie: (name) => {\n                let theValue = _self._testCookies[name] || \"\";\n                return theValue.split(\";\")[0];\n            },\n            setCookie: (name, value) => {\n                _self._testCookies[name] = value;\n            },\n            delCookie: (name) => {\n                delete _self._testCookies[name]\n            }\n        }\n        _self._config = {\n            cookieCfg: _self._cookieMgrCfg\n        };\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"CookieManager: Initialization\",\n            test: () => {\n                let manager = createCookieMgr();\n\n                Assert.equal(\"\", manager.get(\"Test\"), \"Getting a non existent cookie returns empty string\");\n\n                manager = createCookieMgr(null);\n                Assert.equal(\"\", manager.get(\"Test\"), \"Getting a non existent cookie returns empty string\");\n\n                manager = createCookieMgr(undefined);\n                Assert.equal(\"\", manager.get(\"Test\"), \"Getting a non existent cookie returns empty string\");\n\n                manager = createCookieMgr({});\n                Assert.equal(\"\", manager.get(\"Test\"), \"Getting a non existent cookie returns empty string\");\n\n                manager = createCookieMgr({\n                    cookieCfg: null\n                });\n                Assert.equal(\"\", manager.get(\"Test\"), \"Getting a non existent cookie returns empty string\");\n\n                manager = createCookieMgr({\n                    cookieCfg: undefined\n                });\n                Assert.equal(\"\", manager.get(\"Test\"), \"Getting a non existent cookie returns empty string\");\n\n                manager = createCookieMgr({\n                    cookieCfg: {}\n                });\n                Assert.equal(\"\", manager.get(\"Test\"), \"Getting a non existent cookie returns empty string\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Session get set delete\",\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey]);\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                manager.set(newKey, newValue + \"; path=/my-path\");\n                Assert.equal(newValue, manager.get(newKey));\n                Assert.equal(newValue + \"; path=/my-path\", this._testCookies[newKey]);\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: Session get set delete with configured path\",\n            test: () => {\n                this._cookieMgrCfg.path = \"/sub-path\";\n                let manager = createCookieMgr(this._config);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                Assert.equal(newValue + \"; path=/sub-path\", this._testCookies[newKey]);\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                manager.set(newKey, newValue + \"; path=/my-path\");\n                Assert.equal(newValue, manager.get(newKey));\n                Assert.equal(newValue + \"; path=/my-path\", this._testCookies[newKey]);\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: Session get set delete with configured domain\",\n            test: () => {\n                this._cookieMgrCfg.domain = \"MyDomain.com\";\n                let manager = createCookieMgr(this._config);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: Encoded expiry value for get set delete\",\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue + \"; path=/subfield; expires=Thu, 12 Feb 2190 00:00:00 GMT\");\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"path=/subfield\") !== -1, \"Cookie should include path\");\n                Assert.ok(cookieValue.indexOf(\"expires=Thu, 12 Feb 2190 00:00:00 GMT\") !== -1, \"Cookie should include expires\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: Encoded max-age for get set delete\",\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue + \"; path=/subfield; max-age=42\");\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"path=/subfield\") !== -1, \"Cookie should include path\");\n                Assert.ok(cookieValue.indexOf(\"max-age=42\") !== -1, \"Cookie should include max-age\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: Test with setting max-age\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                let maxAge = 42 * 24 * 60 * 60;\n                manager.set(newKey, newValue, maxAge);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"expires=Thu, 12 Feb 1970 00:00:00 GMT\") !== -1, \"Cookie should include expires\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n                if (!this.isEmulatingIe) {\n                    Assert.ok(cookieValue.indexOf(\"max-age=\" + maxAge) !== -1, \"Cookie should include max-age for non-IE browsers\");\n                }\n\n                // With existing max-age\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                manager.set(newKey, newValue + \"; expires=Thu, 12 Feb 2170 00:00:00 GMT\", maxAge);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue2 = this._testCookies[newKey];\n                Assert.ok(cookieValue2.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue2.indexOf(\"expires=Thu, 12 Feb 2170 00:00:00 GMT\") !== -1, \"Cookie should include expires\");\n                Assert.ok(cookieValue2.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n                if (!this.isEmulatingIe) {\n                    Assert.ok(cookieValue2.indexOf(\"max-age=\" + maxAge) !== -1, \"Cookie should include max-age for non-IE browsers\");\n                }\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Set as Disabled\",\n            test: () => {\n                let manager = createCookieMgr({\n                    cookieCfg: {\n                        enabled: false,\n                        getCookie: () => { throw \"Should not be called\" },\n                        setCookie: () => { throw \"Should not be called\" },\n                        delCookie: () => { throw \"Should not be called\" }\n                    }\n                });\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // With caching enabled, set should return true and value should be cached\n                let setResult = manager.set(newKey, newValue);\n                Assert.equal(true, setResult, \"Set should return true when caching\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n\n                // Delete should also be cached\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true when caching\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after cached delete\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: disable cookies using the legacy setting\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                let neverCalled = () => { throw \"Should not be called\" };\n\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    isCookieUseDisabled: true,\n                    cookieCfg: {\n                        getCookie: neverCalled,\n                        setCookie: neverCalled,\n                        delCookie: neverCalled\n                    }\n                } as any, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // With caching enabled, set should cache the value\n                let setResult = manager.set(newKey, newValue);\n                Assert.equal(true, setResult, \"Set should return true when caching\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n\n                // Delete should also be cached\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true when caching\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after cached delete\");\n\n                // Check the \"merged\" config\n                Assert.deepEqual({\n                    domain: undefined,\n                    path: undefined,\n                    enabled: undefined,\n                    ignoreCookies: undefined,\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: neverCalled,\n                    setCookie: neverCalled,\n                    delCookie: neverCalled\n                }, core.config.cookieCfg);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: disable cookies using legacy and new setting both enabled\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                let neverCalled = () => { throw \"Should not be called\" };\n\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    isCookieUseDisabled: true,\n                    disableCookiesUsage: true,\n                    cookieCfg: {\n                        getCookie: neverCalled,\n                        setCookie: neverCalled,\n                        delCookie: neverCalled\n                    }\n                } as any, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // With caching enabled, set should cache the value\n                let setResult = manager.set(newKey, newValue);\n                Assert.equal(true, setResult, \"Set should return true when caching\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n\n                // Delete should also be cached\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true when caching\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after cached delete\");\n\n                // Check the \"merged\" config\n                Assert.deepEqual({\n                    domain: undefined,\n                    path: undefined,\n                    enabled: undefined,\n                    ignoreCookies: undefined,\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: neverCalled,\n                    setCookie: neverCalled,\n                    delCookie: neverCalled\n                }, core.config.cookieCfg);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: disable cookies using legacy disabled and new setting enabled\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                let neverCalled = () => { throw \"Should not be called\" };\n\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    isCookieUseDisabled: false,\n                    disableCookiesUsage: true,\n                    cookieCfg: {\n                        getCookie: neverCalled,\n                        setCookie: neverCalled,\n                        delCookie: neverCalled\n                    }\n                } as any, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // With caching enabled, set should cache the value\n                let setResult = manager.set(newKey, newValue);\n                Assert.equal(true, setResult, \"Set should return true when caching\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n\n                // Delete should also be cached\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true when caching\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after cached delete\");\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: disable cookies using disableCookiesUsage\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    disableCookiesUsage: true,\n                    cookieCfg: {\n                        getCookie: () => { throw \"Should not be called\" },\n                        setCookie: () => { throw \"Should not be called\" },\n                        delCookie: () => { throw \"Should not be called\" }\n                    }\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // With caching enabled, set should cache the value\n                let setResult = manager.set(newKey, newValue);\n                Assert.equal(true, setResult, \"Set should return true when caching\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n\n                // Delete should also be cached\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true when caching\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after cached delete\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: set cookie path at the root config setting\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    cookiePath: \"/sub-path\",\n                    cookieCfg: this._cookieMgrCfg\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                Assert.equal(newValue + \"; path=/sub-path\", this._testCookies[newKey]);\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                manager.set(newKey, newValue + \"; path=/my-path\");\n                Assert.equal(newValue, manager.get(newKey));\n                Assert.equal(newValue + \"; path=/my-path\", this._testCookies[newKey]);\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                // Check the \"merged\" config\n                Assert.deepEqual({\n                    domain: undefined,\n                    path: \"/sub-path\",\n                    enabled: undefined,\n                    ignoreCookies: undefined,\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: core.config.cookieCfg?.getCookie,\n                    setCookie: core.config.cookieCfg?.setCookie,\n                    delCookie: core.config.cookieCfg?.delCookie\n                }, core.config.cookieCfg);\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: set cookie domain at the root config setting\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    cookieDomain: \"MyDomain.com\",\n                    cookieCfg: this._cookieMgrCfg\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                // Check the \"merged\" config\n                Assert.deepEqual({\n                    domain: \"MyDomain.com\",\n                    path: undefined,\n                    enabled: undefined,\n                    ignoreCookies: undefined,\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: core.config.cookieCfg?.getCookie,\n                    setCookie: core.config.cookieCfg?.setCookie,\n                    delCookie: core.config.cookieCfg?.delCookie\n                }, core.config.cookieCfg);\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: validate ignore Cookies empty setting\",\n            test: () => {\n\n                let cookieCfg: ICookieMgrConfig = objExtend(true, {}, this._cookieMgrCfg);\n                cookieCfg.ignoreCookies = [];\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    cookieDomain: \"MyDomain.com\",\n                    cookieCfg: cookieCfg\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                // Check the \"merged\" config\n                Assert.deepEqual({\n                    domain: \"MyDomain.com\",\n                    path: undefined,\n                    enabled: undefined,\n                    ignoreCookies: [],\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: core.config.cookieCfg?.getCookie,\n                    setCookie: core.config.cookieCfg?.setCookie,\n                    delCookie: core.config.cookieCfg?.delCookie\n                }, core.config.cookieCfg);\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: validate ignore Cookies with a single cookie\",\n            test: () => {\n\n                let cookieCfg: ICookieMgrConfig = objExtend(true, {}, this._cookieMgrCfg);\n                cookieCfg.ignoreCookies = [ \"testCookie\" ];\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    cookieDomain: \"MyDomain.com\",\n                    cookieCfg: cookieCfg\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n\n                this._testCookies[\"testCookie\"] = \"test value\";\n                Assert.equal(\"\", manager.get(\"testCookie\"), \"Check that it can't read the cookie value\");\n\n                manager.set(\"testCookie\", \"new value\");\n                Assert.equal(\"test value\", this._testCookies[\"testCookie\"], \"The value was not overwritten\");\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                // Check the \"merged\" config\n                Assert.deepEqual({\n                    domain: \"MyDomain.com\",\n                    path: undefined,\n                    enabled: undefined,\n                    ignoreCookies: [ \"testCookie\" ],\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: core.config.cookieCfg?.getCookie,\n                    setCookie: core.config.cookieCfg?.setCookie,\n                    delCookie: core.config.cookieCfg?.delCookie\n                }, core.config.cookieCfg);\n\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: validate blocked Cookies with a single cookie\",\n            test: () => {\n\n                let cookieCfg: ICookieMgrConfig = objExtend(true, {}, this._cookieMgrCfg);\n                cookieCfg.blockedCookies = [ \"testCookie\" ];\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    cookieDomain: \"MyDomain.com\",\n                    cookieCfg: cookieCfg\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n\n                this._testCookies[\"testCookie\"] = \"test value\";\n                Assert.equal(\"test value\", manager.get(\"testCookie\"), \"Check that it can't read the cookie value\");\n\n                manager.set(\"testCookie\", \"new value\");\n                Assert.equal(\"test value\", this._testCookies[\"testCookie\"], \"The value was not overwritten\");\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: set cookie domain on the core config and update using updateCfg()\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    cookieDomain: \"MyDomain.com\",\n                    cookieCfg: this._cookieMgrCfg\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                // Update the root cookie Domain using the core update function while there is a cookieCfg.domain\n                // The cookieCfg.domain overrides the root domain\n                core.updateCfg({\n                    cookieDomain: \"MyDomain2.com\"\n                });\n\n                let newKey2 = \"test2.\" + newId();\n                let newValue2 = newId();\n                manager.set(newKey2, newValue2);\n                Assert.equal(newValue2, manager.get(newKey2));\n                let cookieValue2 = this._testCookies[newKey2];\n                Assert.ok(cookieValue2.indexOf(newValue2 + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue2.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue2.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey2);\n                Assert.equal(\"\", manager.get(newKey2));\n                Assert.equal(undefined, this._testCookies[newKey2]);\n\n                // Update the cookie Domain using the core update function without a cookieCfg.domain\n                core.config.cookieCfg!.domain = undefined;\n\n                core.updateCfg({\n                    cookieDomain: \"MyDomain3.com\"\n                });\n\n                let newKey3 = \"test3.\" + newId();\n                let newValue3 = newId();\n                manager.set(newKey3, newValue3);\n                Assert.equal(newValue3, manager.get(newKey3));\n                let cookieValue3 = this._testCookies[newKey3];\n                Assert.ok(cookieValue3.indexOf(newValue3 + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue3.indexOf(\"domain=MyDomain3.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue3.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey3);\n                Assert.equal(\"\", manager.get(newKey3));\n                Assert.equal(undefined, this._testCookies[newKey3]);\n\n                // Set the \"domain\" from the cookieMgr config -- this should override the domain used\n                core.config.cookieCfg!.domain = \"CfgCookieDomain.com\";\n\n                // Update the cookie Domain using the core update function, this will also cause the notifications to occur synchronously\n                core.updateCfg({\n                    cookieDomain: \"RootDomain3.com\"\n                });\n\n                let newKey4 = \"test3.\" + newId();\n                let newValue4 = newId();\n                manager.set(newKey4, newValue4);\n                Assert.equal(newValue4, manager.get(newKey4));\n                let cookieValue4 = this._testCookies[newKey4];\n                Assert.ok(cookieValue4.indexOf(newValue4 + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue4.indexOf(\"domain=CfgCookieDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue4.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey4);\n                Assert.equal(\"\", manager.get(newKey4));\n                Assert.equal(undefined, this._testCookies[newKey4]);\n\n                // Check the \"merged\" config\n                Assert.deepEqual({\n                    domain: \"CfgCookieDomain.com\",\n                    path: undefined,\n                    enabled: undefined,\n                    ignoreCookies: undefined,\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: core.config.cookieCfg?.getCookie,\n                    setCookie: core.config.cookieCfg?.setCookie,\n                    delCookie: core.config.cookieCfg?.delCookie\n                }, core.config.cookieCfg);\n            }\n        });        \n\n        this.testCase({\n            name: \"CookieManager: set cookie domain at the root config using updateCfg()\",\n            test: () => {\n\n                let core = new AppInsightsCore();\n                core.initialize({\n                    instrumentationKey: \"testiKey\",\n                    cookieDomain: \"MyDomain.com\",\n                    cookieCfg: this._cookieMgrCfg\n                }, [new ChannelPlugin()]);\n\n                let manager = core.getCookieMgr();\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey));\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey);\n                Assert.equal(\"\", manager.get(newKey));\n                Assert.equal(undefined, this._testCookies[newKey]);\n\n                // Update the root cookie Domain using the core update function while there is a cookieCfg.domain\n                // The cookieCfg.domain overrides the root domain\n                core.updateCfg({\n                    cookieDomain: \"MyDomain2.com\"\n                });\n\n                let newKey2 = \"test2.\" + newId();\n                let newValue2 = newId();\n                manager.set(newKey2, newValue2);\n                Assert.equal(newValue2, manager.get(newKey2));\n                let cookieValue2 = this._testCookies[newKey2];\n                Assert.ok(cookieValue2.indexOf(newValue2 + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue2.indexOf(\"domain=MyDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue2.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey2);\n                Assert.equal(\"\", manager.get(newKey2));\n                Assert.equal(undefined, this._testCookies[newKey2]);\n\n                core.updateCfg({\n                    cookieDomain: \"MyDomain3.com\",\n                    cookieCfg: {\n                        // Update the cookie Domain using the core update function without a cookieCfg.domain\n                        domain: undefined\n                    }\n                });\n\n                let newKey3 = \"test3.\" + newId();\n                let newValue3 = newId();\n                manager.set(newKey3, newValue3);\n                Assert.equal(newValue3, manager.get(newKey3));\n                let cookieValue3 = this._testCookies[newKey3];\n                Assert.ok(cookieValue3.indexOf(newValue3 + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue3.indexOf(\"domain=MyDomain3.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue3.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey3);\n                Assert.equal(\"\", manager.get(newKey3));\n                Assert.equal(undefined, this._testCookies[newKey3]);\n\n                // Update the cookie Domain using the core update function, this will also cause the notifications to occur synchronously\n                core.updateCfg({\n                    cookieDomain: \"RootDomain3.com\",\n                    cookieCfg: {\n                        // Set the \"domain\" from the cookieMgr config -- this should override the domain used\n                        domain: \"CfgCookieDomain.com\"\n                    }\n                });\n\n                let newKey4 = \"test3.\" + newId();\n                let newValue4 = newId();\n                manager.set(newKey4, newValue4);\n                Assert.equal(newValue4, manager.get(newKey4));\n                let cookieValue4 = this._testCookies[newKey4];\n                Assert.ok(cookieValue4.indexOf(newValue4 + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue4.indexOf(\"domain=CfgCookieDomain.com\") !== -1, \"Cookie should include domain\");\n                Assert.ok(cookieValue4.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n\n                manager.del(newKey4);\n                Assert.equal(\"\", manager.get(newKey4));\n                Assert.equal(undefined, this._testCookies[newKey4]);\n\n                // Check the \"merged\" config\n                Assert.deepEqual({                // Check the \"merged\" config\n                    domain: \"CfgCookieDomain.com\",\n                    path: undefined,\n                    enabled: undefined,\n                    ignoreCookies: undefined,\n                    blockedCookies: undefined,\n                    disableCookieDefer: false,\n                    getCookie: core.config.cookieCfg?.getCookie,\n                    setCookie: core.config.cookieCfg?.setCookie,\n                    delCookie: core.config.cookieCfg?.delCookie\n                }, core.config.cookieCfg);\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - basic functionality\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                // Start with cookies disabled\n                manager.setEnabled(false);\n                this.clock.tick(1);\n                Assert.equal(false, manager.isEnabled(), \"Cookies should be disabled\");\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // Set a cookie while disabled - should be cached\n                let result = manager.set(newKey, newValue);\n                Assert.equal(true, result, \"Set should return true even when disabled (cached)\");\n                \n                // Get should return the cached value\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n                \n                // Cookie should not be in actual storage\n                Assert.equal(undefined, this._testCookies[newKey], \"Cookie should not be in actual storage yet\");\n\n                // Enable cookies - should flush cached values\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                Assert.equal(true, manager.isEnabled(), \"Cookies should be enabled\");\n                \n                // Cookie should now be in actual storage\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey], \"Cookie should be flushed to actual storage\");\n                \n                // Get should still return the value\n                Assert.equal(newValue, manager.get(newKey), \"Should return value from actual storage\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - multiple cookies\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                // Start with cookies disabled\n                manager.setEnabled(false);\n                this.clock.tick(1);\n\n                let cookies = [\n                    { key: \"test1.\" + newId(), value: newId() },\n                    { key: \"test2.\" + newId(), value: newId() },\n                    { key: \"test3.\" + newId(), value: newId() }\n                ];\n                \n                // Set multiple cookies while disabled\n                cookies.forEach(cookie => {\n                    let result = manager.set(cookie.key, cookie.value);\n                    Assert.equal(true, result, \"Set should return true even when disabled\");\n                    Assert.equal(cookie.value, manager.get(cookie.key), \"Should return cached value\");\n                    Assert.equal(undefined, this._testCookies[cookie.key], \"Cookie should not be in actual storage yet\");\n                });\n\n                // Enable cookies - should flush all cached values\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                \n                // All cookies should now be in actual storage\n                cookies.forEach(cookie => {\n                    Assert.equal(cookie.value + \"; path=/\", this._testCookies[cookie.key], \"Cookie should be flushed to actual storage\");\n                    Assert.equal(cookie.value, manager.get(cookie.key), \"Should return value from actual storage\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - with maxAge and domain\",\n            useFakeTimers: true,\n            test: () => {\n                this._cookieMgrCfg.domain = \"test.com\";\n                let manager = createCookieMgr(this._config);\n\n                // Start with cookies disabled\n                manager.setEnabled(false);\n                this.clock.tick(1);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                let maxAge = 3600; // 1 hour\n                \n                // Set a cookie with maxAge while disabled\n                let result = manager.set(newKey, newValue, maxAge);\n                Assert.equal(true, result, \"Set should return true even when disabled\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value\");\n\n                // Enable cookies\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                \n                // Cookie should be flushed with the maxAge parameter\n                let actualCookieValue = this._testCookies[newKey];\n                Assert.ok(actualCookieValue, \"Cookie should exist in storage\");\n                Assert.ok(actualCookieValue.indexOf(newValue) === 0, \"Cookie should start with the value\");\n                Assert.ok(actualCookieValue.indexOf(\"domain=test.com\") > -1, \"Cookie should have domain\");\n                Assert.ok(actualCookieValue.indexOf(\"path=/\") > -1, \"Cookie should have path\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - overwrite cached values\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                // Start with cookies disabled\n                manager.setEnabled(false);\n                this.clock.tick(1);\n\n                let newKey = \"test.\" + newId();\n                let newValue1 = newId();\n                let newValue2 = newId();\n                \n                // Set a cookie while disabled\n                manager.set(newKey, newValue1);\n                Assert.equal(newValue1, manager.get(newKey), \"Should return first cached value\");\n                \n                // Overwrite with new value while still disabled\n                manager.set(newKey, newValue2);\n                Assert.equal(newValue2, manager.get(newKey), \"Should return updated cached value\");\n\n                // Enable cookies - should flush the latest value\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                \n                Assert.equal(newValue2 + \"; path=/\", this._testCookies[newKey], \"Cookie should have the latest value\");\n                Assert.equal(newValue2, manager.get(newKey), \"Should return latest value from storage\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - delete cached cookies\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                // Start with cookies disabled\n                manager.setEnabled(false);\n                this.clock.tick(1);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // Set a cookie while disabled\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value\");\n                \n                // Delete the cached cookie\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after delete\");\n\n                // Enable cookies - nothing should be flushed since the cookie was deleted\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                \n                Assert.equal(undefined, this._testCookies[newKey], \"Cookie should not be in storage\");\n                Assert.equal(\"\", manager.get(newKey), \"Should still return empty string\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Delete operation is cached when cookies disabled and applied when enabled\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // Start with cookies enabled and set a cookie\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                manager.set(newKey, newValue);\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey], \"Cookie should be in storage\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cookie value\");\n                \n                // Disable cookies and delete the cookie\n                manager.setEnabled(false);\n                this.clock.tick(1);\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true when cached\");\n                \n                // Cookie still exists in storage but deletion is cached\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey], \"Cookie should still be in storage while disabled\");\n                \n                // Validate that cookie exists before deletion is applied\n                Assert.ok(this._testCookies[newKey], \"Cookie should exist before deletion is applied\");\n                \n                // Enable cookies - cached deletion should be applied\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                \n                // Check that the deletion was applied - cookie should be undefined after deletion\n                let cookieValue = this._testCookies[newKey];\n                Assert.equal(undefined, cookieValue, \"Delete operation should have been applied - cookie should be undefined\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after deletion is applied\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - ignore blocked cookies\",\n            useFakeTimers: true,\n            test: () => {\n                let cookieCfg: ICookieMgrConfig = objExtend(true, {}, this._cookieMgrCfg);\n                cookieCfg.blockedCookies = [\"blockedCookie\"];\n                \n                let manager = createCookieMgr({\n                    cookieCfg: cookieCfg\n                });\n\n                // Start with cookies disabled\n                manager.setEnabled(false);\n                this.clock.tick(1);\n\n                let blockedKey = \"blockedCookie\";\n                let allowedKey = \"allowedCookie\";\n                let newValue = newId();\n                \n                // Try to set blocked cookie while disabled - should not be cached\n                let blockedResult = manager.set(blockedKey, newValue);\n                Assert.equal(false, blockedResult, \"Setting blocked cookie should return false\");\n                Assert.equal(\"\", manager.get(blockedKey), \"Should not return cached value for blocked cookie\");\n                \n                // Set allowed cookie while disabled - should be cached\n                let allowedResult = manager.set(allowedKey, newValue);\n                Assert.equal(true, allowedResult, \"Setting allowed cookie should return true\");\n                Assert.equal(newValue, manager.get(allowedKey), \"Should return cached value for allowed cookie\");\n\n                // Enable cookies - only allowed cookie should be flushed\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                \n                Assert.equal(undefined, this._testCookies[blockedKey], \"Blocked cookie should not be in storage\");\n                Assert.equal(newValue + \"; path=/\", this._testCookies[allowedKey], \"Allowed cookie should be in storage\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - handle ignored cookies\",\n            useFakeTimers: true,\n            test: () => {\n                let cookieCfg: ICookieMgrConfig = objExtend(true, {}, this._cookieMgrCfg);\n                cookieCfg.ignoreCookies = [\"ignoredCookie\"];\n                \n                let manager = createCookieMgr({\n                    cookieCfg: cookieCfg\n                });\n\n                // Start with cookies disabled\n                manager.setEnabled(false);\n                this.clock.tick(1);\n\n                let ignoredKey = \"ignoredCookie\";\n                let allowedKey = \"allowedCookie\";\n                let newValue = newId();\n                \n                // Try to set ignored cookie while disabled - should not be cached\n                let ignoredResult = manager.set(ignoredKey, newValue);\n                Assert.equal(false, ignoredResult, \"Setting ignored cookie should return false\");\n                Assert.equal(\"\", manager.get(ignoredKey), \"Should not return cached value for ignored cookie\");\n                \n                // Set allowed cookie while disabled - should be cached\n                let allowedResult = manager.set(allowedKey, newValue);\n                Assert.equal(true, allowedResult, \"Setting allowed cookie should return true\");\n                Assert.equal(newValue, manager.get(allowedKey), \"Should return cached value for allowed cookie\");\n\n                // Enable cookies - only allowed cookie should be flushed\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                \n                Assert.equal(undefined, this._testCookies[ignoredKey], \"Ignored cookie should not be in storage\");\n                Assert.equal(newValue + \"; path=/\", this._testCookies[allowedKey], \"Allowed cookie should be in storage\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - multiple enable/disable cycles\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                let newKey1 = \"test1.\" + newId();\n                let newKey2 = \"test2.\" + newId();\n                let newValue1 = newId();\n                let newValue2 = newId();\n\n                // First cycle: disable, set, enable\n                manager.setEnabled(false);\n                this.clock.tick(1);\n                manager.set(newKey1, newValue1);\n                Assert.equal(newValue1, manager.get(newKey1), \"Should return cached value\");\n                \n                manager.setEnabled(true);\n                this.clock.tick(1);\n                Assert.equal(newValue1 + \"; path=/\", this._testCookies[newKey1], \"First cookie should be flushed\");\n\n                // Second cycle: disable again, set different cookie, enable\n                manager.setEnabled(false);\n                this.clock.tick(1);\n                manager.set(newKey2, newValue2);\n                Assert.equal(newValue2, manager.get(newKey2), \"Should return second cached value\");\n                Assert.equal(\"\", manager.get(newKey1), \"Should return empty string - cookies disabled, can't access storage and no cached value\");\n                \n                manager.setEnabled(true);\n                this.clock.tick(1);\n                Assert.equal(newValue2 + \"; path=/\", this._testCookies[newKey2], \"Second cookie should be flushed\");\n                Assert.equal(newValue1 + \"; path=/\", this._testCookies[newKey1], \"First cookie should still be in storage\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Write cookies after being enabled - unload clears cache\",\n            useFakeTimers: true,\n            test: () => {\n                let manager = createCookieMgr(this._config);\n\n                // Start with cookies disabled and set some cached cookies\n                manager.setEnabled(false);\n                this.clock.tick(1);\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                manager.set(newKey, newValue);\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value\");\n\n                // Unload the manager\n                manager.unload && manager.unload();\n\n                // Enable cookies - nothing should be flushed since cache was cleared\n                manager.setEnabled(true);\n                this.clock.tick(1);\n                Assert.equal(undefined, this._testCookies[newKey], \"Cookie should not be in storage after unload\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after unload\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Dynamic config change to enable cookies should flush cached values\",\n            useFakeTimers: true,\n            test: () => {\n                // Create a dynamic config that can be updated\n                let configValues = {\n                    cookieCfg: objExtend({}, this._cookieMgrCfg, {\n                        enabled: false\n                    })\n                };\n                let manager = createCookieMgr(configValues);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n\n                // Set a cookie while disabled - should be cached\n                let result = manager.set(newKey, newValue);\n                Assert.equal(true, result, \"Set should return true even when disabled (cached)\");\n                Assert.equal(undefined, this._testCookies[newKey], \"Cookie should not be in storage when disabled\");\n\n                // Get should return the cached value\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n\n                // Enable cookies via dynamic config change - should flush cached values\n                configValues.cookieCfg.enabled = true;\n                this.clock.tick(1);\n\n                // Verify the cookie was flushed to actual storage\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey], \"Cookie should be flushed to actual storage via config change\");\n                Assert.equal(newValue, manager.get(newKey), \"Should still return the value after enabling\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Dynamic config change to enable cookies with multiple cached values\",\n            useFakeTimers: true,\n            test: () => {\n                // Create a dynamic config that can be updated\n                let configValues = {\n                    cookieCfg: objExtend({}, this._cookieMgrCfg, {\n                        enabled: false\n                    })\n                };\n                let manager = createCookieMgr(configValues);\n\n                let cookies = [\n                    { key: \"test1.\" + newId(), value: newId() },\n                    { key: \"test2.\" + newId(), value: newId() },\n                    { key: \"test3.\" + newId(), value: newId() }\n                ];\n\n                // Set multiple cookies while disabled - should be cached\n                cookies.forEach(cookie => {\n                    let result = manager.set(cookie.key, cookie.value);\n                    Assert.equal(true, result, \"Set should return true even when disabled (cached)\");\n                    Assert.equal(undefined, this._testCookies[cookie.key], \"Cookie should not be in storage when disabled\");\n                    Assert.equal(cookie.value, manager.get(cookie.key), \"Should return cached value\");\n                });\n\n                // Enable cookies via dynamic config change - should flush all cached values\n                configValues.cookieCfg.enabled = true;\n                this.clock.tick(1);\n\n                cookies.forEach(cookie => {\n                    Assert.equal(cookie.value + \"; path=/\", this._testCookies[cookie.key], \"Cookie should be flushed to actual storage via config change\");\n                    Assert.equal(cookie.value, manager.get(cookie.key), \"Should still return the value after enabling\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Dynamic config change with maxAge parameter should preserve options\",\n            useFakeTimers: true,\n            test: () => {\n                // Create a dynamic config that can be updated\n                let configValues = {\n                    cookieCfg: objExtend({}, this._cookieMgrCfg, {\n                        enabled: false\n                    })\n                };\n                let manager = createCookieMgr(configValues);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                let maxAge = 3600; // 1 hour\n\n                // Set a cookie with maxAge while disabled - should be cached\n                let result = manager.set(newKey, newValue, maxAge);\n                Assert.equal(true, result, \"Set should return true even when disabled (cached)\");\n                Assert.equal(undefined, this._testCookies[newKey], \"Cookie should not be in storage when disabled\");\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value\");\n\n                // Enable cookies via dynamic config change - should flush cached value with maxAge\n                configValues.cookieCfg.enabled = true;\n                this.clock.tick(1);\n\n                // Cookie should be flushed with the maxAge parameter\n                let cookieValue = this._testCookies[newKey];\n                Assert.ok(cookieValue, \"Cookie should be flushed to storage\");\n                Assert.ok(cookieValue.indexOf(newValue + \";\") === 0, \"Cookie should start with value\");\n                Assert.ok(cookieValue.indexOf(\"path=/\") !== -1, \"Cookie should include path\");\n                Assert.ok(cookieValue.indexOf(\"expires=\") !== -1, \"Cookie should include expires\");\n                \n                if (!this.isEmulatingIe) {\n                    Assert.ok(cookieValue.indexOf(\"max-age=\" + maxAge) !== -1, \"Cookie should include max-age for non-IE browsers\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Dynamic config change from legacy disableCookiesUsage should flush cached values\",\n            useFakeTimers: true,\n            test: () => {\n                // Create a dynamic config that can be updated\n                let configValues = {\n                    disableCookiesUsage: true,\n                    cookieCfg: this._cookieMgrCfg\n                };\n                let manager = createCookieMgr(configValues);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n\n                // Set a cookie while disabled - should be cached\n                let result = manager.set(newKey, newValue);\n                Assert.equal(true, result, \"Set should return true even when disabled (cached)\");\n                Assert.equal(undefined, this._testCookies[newKey], \"Cookie should not be in storage when disabled\");\n\n                // Get should return the cached value\n                Assert.equal(newValue, manager.get(newKey), \"Should return cached value when disabled\");\n\n                // Enable cookies via dynamic config change - should flush cached values\n                configValues.disableCookiesUsage = false;\n                this.clock.tick(1);\n\n                // Verify the cookie was flushed to actual storage\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey], \"Cookie should be flushed to actual storage via legacy config change\");\n                Assert.equal(newValue, manager.get(newKey), \"Should still return the value after enabling\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Multiple enable/disable cycles via config change work correctly\",\n            useFakeTimers: true,\n            test: () => {\n                // Create a dynamic config that can be updated\n                let configValues = {\n                    cookieCfg: objExtend({}, this._cookieMgrCfg, {\n                        enabled: false\n                    })\n                };\n                let manager = createCookieMgr(configValues);\n\n                let newKey1 = \"test1.\" + newId();\n                let newValue1 = newId();\n\n                // First cycle: disable -> cache -> enable -> flush\n                manager.set(newKey1, newValue1);\n                Assert.equal(newValue1, manager.get(newKey1), \"Should return cached value\");\n\n                configValues.cookieCfg.enabled = true;\n                this.clock.tick(1); // Allow dynamic config change to propagate\n                Assert.equal(newValue1 + \"; path=/\", this._testCookies[newKey1], \"First cookie should be flushed\");\n\n                // Second cycle: disable -> cache -> enable -> flush\n                configValues.cookieCfg.enabled = false;\n                this.clock.tick(1); // Allow dynamic config change to propagate\n                let newKey2 = \"test2.\" + newId();\n                let newValue2 = newId();\n\n                manager.set(newKey2, newValue2);\n                Assert.equal(newValue2, manager.get(newKey2), \"Should return second cached value\");\n\n                configValues.cookieCfg.enabled = true;\n                this.clock.tick(1);\n                Assert.equal(newValue2 + \"; path=/\", this._testCookies[newKey2], \"Second cookie should be flushed\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: Deletion operation cached and applied via dynamic config change\",\n            useFakeTimers: true,\n            test: () => {\n                // Create a dynamic config that can be updated\n                let configValues = {\n                    cookieCfg: objExtend({}, this._cookieMgrCfg, {\n                        enabled: true\n                    })\n                };\n                let manager = createCookieMgr(configValues);\n\n                let newKey = \"test.\" + newId();\n                let newValue = newId();\n                \n                // Set a cookie while enabled\n                manager.set(newKey, newValue);\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey], \"Cookie should be in storage\");\n                \n                // Disable cookies via config and delete the cookie\n                configValues.cookieCfg.enabled = false;\n                this.clock.tick(1); // Allow dynamic config change to propagate\n                let delResult = manager.del(newKey);\n                Assert.equal(true, delResult, \"Delete should return true when cached\");\n                \n                // Cookie still exists in storage but deletion is cached\n                Assert.equal(newValue + \"; path=/\", this._testCookies[newKey], \"Cookie should still be in storage while disabled\");\n                \n                // Validate that cookie exists before deletion is applied  \n                Assert.ok(this._testCookies[newKey], \"Cookie should exist before deletion is applied\");\n                \n                // Enable cookies via dynamic config change - cached deletion should be applied\n                configValues.cookieCfg.enabled = true;\n                this.clock.tick(1);\n                \n                // Check that the deletion was applied - cookie should be undefined after deletion\n                let cookieValue = this._testCookies[newKey];\n                Assert.equal(undefined, cookieValue, \"Delete operation should have been applied - cookie should be undefined\");\n                Assert.equal(\"\", manager.get(newKey), \"Should return empty string after deletion is applied\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: disableCookieDefer=true reverts to previous behavior - set returns false when disabled\",\n            test: () => {\n                let config: IConfiguration = {\n                    cookieCfg: {\n                        enabled: false,\n                        disableCookieDefer: true\n                    }\n                };\n\n                let manager = createCookieMgr(config);\n                Assert.equal(false, manager.isEnabled(), \"Cookie manager should be disabled\");\n                \n                // Test that set returns false (previous behavior)\n                Assert.equal(false, manager.set(\"test\", \"value\"), \"set() should return false when disabled and caching disabled\");\n                \n                // Test that get returns empty string (previous behavior)\n                Assert.equal(\"\", manager.get(\"test\"), \"get() should return empty string when disabled and caching disabled\");\n                \n                // Test that del returns false (previous behavior)\n                Assert.equal(false, manager.del(\"test\"), \"del() should return false when disabled and caching disabled\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: disableCookieDefer=true with cookie functions that throw\",\n            test: () => {\n                let setCookieCalled = 0;\n                let getCookieCalled = 0;\n                let delCookieCalled = 0;\n\n                let config: IConfiguration = {\n                    cookieCfg: {\n                        enabled: false,\n                        disableCookieDefer: true,\n                        getCookie: (name: string) => {\n                            getCookieCalled++;\n                            throw \"Should not be called - get\";\n                        },\n                        setCookie: (name: string, value: string) => {\n                            setCookieCalled++;\n                            throw \"Should not be called - set\";\n                        },\n                        delCookie: (name: string, value: string) => {\n                            delCookieCalled++;\n                            throw \"Should not be called - del\";\n                        }\n                    }\n                };\n\n                let manager = createCookieMgr(config);\n                \n                // Cookies are disabled with caching disabled, so no cookie functions should be called\n                manager.set(\"test\", \"value\");\n                manager.get(\"test\");\n                manager.del(\"test\");\n                \n                Assert.equal(0, setCookieCalled, \"setCookie should not be called when disabled\");\n                Assert.equal(0, getCookieCalled, \"getCookie should not be called when disabled\");\n                Assert.equal(0, delCookieCalled, \"delCookie should not be called when disabled\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: disableCookieDefer=true prevents flushing when cookies are enabled\",\n            useFakeTimers: true,\n            test: () => {\n                let setCookieCalled = 0;\n                let delCookieCalled = 0;\n\n                let config: IConfiguration = {\n                    cookieCfg: {\n                        enabled: false,\n                        disableCookieDefer: true,\n                        setCookie: (name: string, value: string) => {\n                            setCookieCalled++;\n                            this._testCookies[name] = value;\n                        },\n                        delCookie: (name: string, value: string) => {\n                            delCookieCalled++;\n                            this._testCookies[name] = value;\n                        }\n                    }\n                };\n\n                let manager = createCookieMgr(config);\n                \n                // Try to set/del cookies while disabled\n                manager.set(\"test1\", \"value1\");\n                manager.set(\"test2\", \"value2\");\n                manager.del(\"test3\");\n                \n                Assert.equal(0, setCookieCalled, \"setCookie should not be called when disabled\");\n                Assert.equal(0, delCookieCalled, \"delCookie should not be called when disabled\");\n                \n                // Enable cookies\n                manager.setEnabled(true);\n                this.clock.tick(1); // Allow async config changes\n                \n                // Cookie functions should still not be called because no caching occurred\n                Assert.equal(0, setCookieCalled, \"setCookie should not be called after enabling when caching was disabled\");\n                Assert.equal(0, delCookieCalled, \"delCookie should not be called after enabling when caching was disabled\");\n                \n                // Values should not be available\n                Assert.equal(\"\", manager.get(\"test1\"), \"Should return empty string for uncached value\");\n                Assert.equal(\"\", manager.get(\"test2\"), \"Should return empty string for uncached value\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: disableCookieDefer=true via dynamic config change\",\n            useFakeTimers: true,\n            test: () => {\n                let setCookieCalled = 0;\n\n                let config: IConfiguration = {\n                    cookieCfg: {\n                        enabled: false,\n                        disableCookieDefer: false, // Start with caching enabled\n                        getCookie: (name: string) => {\n                            let theValue = this._testCookies[name] || \"\";\n                            return theValue.split(\";\")[0];\n                        },\n                        setCookie: (name: string, value: string) => {\n                            setCookieCalled++;\n                            this._testCookies[name] = value;\n                        }\n                    }\n                };\n\n                let manager = createCookieMgr(config);\n                \n                // Set a cookie while caching is enabled\n                Assert.equal(true, manager.set(\"test\", \"value\"), \"set() should return true when caching is enabled\");\n                Assert.equal(\"value\", manager.get(\"test\"), \"get() should return cached value\");\n                \n                // Dynamically disable caching - this should drop all pending cookies\n                config.cookieCfg.disableCookieDefer = true;\n                this.clock.tick(1); // Allow async config changes\n                \n                // Now set should return false and get should return empty\n                Assert.equal(false, manager.set(\"test2\", \"value2\"), \"set() should return false after disabling caching\");\n                Assert.equal(\"\", manager.get(\"test2\"), \"get() should return empty string for uncached value\");\n                \n                // Previously cached value should be gone when disableCookieDefer is set to true\n                Assert.equal(\"\", manager.get(\"test\"), \"get() should return empty string - cached cookies dropped when disableCookieDefer=true\");\n                \n                // Enable cookies - no cookies should be flushed since cache was cleared\n                manager.setEnabled(true);\n                this.clock.tick(1); // Allow async config changes\n                \n                Assert.equal(0, setCookieCalled, \"No cookies should be flushed since cache was cleared\");\n                Assert.equal(\"\", manager.get(\"test\"), \"Should return empty string since no cookies were flushed\");\n                Assert.equal(\"\", manager.get(\"test2\"), \"Non-cached value should remain empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: disableCookieDefer=false (default) enables caching behavior\",\n            useFakeTimers: true,\n            test: () => {\n                let setCookieCalled = 0;\n\n                let config: IConfiguration = {\n                    cookieCfg: {\n                        enabled: false,\n                        // disableCookieDefer not specified, should default to false\n                        getCookie: (name: string) => {\n                            let theValue = this._testCookies[name] || \"\";\n                            return theValue.split(\";\")[0];\n                        },\n                        setCookie: (name: string, value: string) => {\n                            setCookieCalled++;\n                            this._testCookies[name] = value;\n                        }\n                    }\n                };\n\n                let manager = createCookieMgr(config);\n                \n                // Should cache by default\n                Assert.equal(true, manager.set(\"test\", \"value\"), \"set() should return true when caching is enabled by default\");\n                Assert.equal(\"value\", manager.get(\"test\"), \"get() should return cached value\");\n                \n                // Enable cookies and verify flushing occurs\n                manager.setEnabled(true);\n                this.clock.tick(1); // Allow async config changes\n                \n                Assert.equal(1, setCookieCalled, \"Cached cookie should be flushed when enabled\");\n                Assert.equal(\"value\", manager.get(\"test\"), \"Flushed value should be available\");\n            }\n        });\n\n        this.testCase({\n            name: \"CookieManager: disableCookieDefer respects blocked and ignored cookies\",\n            useFakeTimers: true,\n            test: () => {\n                let setCookieCalled = 0;\n\n                let config: IConfiguration = {\n                    cookieCfg: {\n                        enabled: false,\n                        disableCookieDefer: false,\n                        blockedCookies: [\"blocked\"],\n                        ignoreCookies: [\"ignored\"],\n                        getCookie: (name: string) => {\n                            let theValue = this._testCookies[name] || \"\";\n                            return theValue.split(\";\")[0];\n                        },\n                        setCookie: (name: string, value: string) => {\n                            setCookieCalled++;\n                            this._testCookies[name] = value;\n                        }\n                    }\n                };\n\n                let manager = createCookieMgr(config);\n                \n                // Normal cookie should be cached\n                Assert.equal(true, manager.set(\"normal\", \"value\"), \"Normal cookie should be cached\");\n                \n                // Blocked cookie should not be cached\n                Assert.equal(false, manager.set(\"blocked\", \"value\"), \"Blocked cookie should not be cached\");\n                \n                // Ignored cookie should not be cached (get returns empty)\n                Assert.equal(false, manager.set(\"ignored\", \"value\"), \"Ignored cookie should not be cached\");\n                Assert.equal(\"\", manager.get(\"ignored\"), \"Ignored cookie get should return empty\");\n                \n                // When disableCookieDefer=true, cached cookies should be dropped\n                config.cookieCfg.disableCookieDefer = true;\n                this.clock.tick(1); // Allow config change\n                \n                Assert.equal(false, manager.set(\"normal2\", \"value\"), \"Normal cookie should not be cached when disabled\");\n                Assert.equal(false, manager.set(\"blocked2\", \"value\"), \"Blocked cookie should not be cached when disabled\");\n                Assert.equal(\"\", manager.get(\"ignored2\"), \"Ignored cookie get should return empty when disabled\");\n                \n                // Previously cached normal cookie should be gone\n                Assert.equal(\"\", manager.get(\"normal\"), \"Previously cached cookie should be gone when disableCookieDefer=true\");\n                \n                // Enable cookies - no cookies should be flushed since cache was cleared\n                manager.setEnabled(true);\n                this.clock.tick(1); // Allow async config changes\n                \n                Assert.equal(0, setCookieCalled, \"No cookies should be flushed since cache was cleared\");\n                Assert.equal(\"\", manager.get(\"normal\"), \"No cached value should be available\");\n            }\n        });\n    }\n}\n\nclass ChannelPlugin implements IPlugin {\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n  \n    public identifier = \"Sender\";\n  \n    public priority: number = 1001;\n  \n    constructor() {\n      this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n      this.isPauseInvoked = true;\n    }\n  \n    public resume(): void {\n      this.isResumeInvoked = true;\n    }\n  \n    public teardown(): void {\n      this.isTearDownInvoked = true;\n    }\n  \n    flush(async?: boolean, callBack?: () => void): void {\n      this.isFlushInvoked = true;\n      if (callBack) {\n        callBack();\n      }\n    }\n  \n    public processTelemetry(env: ITelemetryItem) { }\n  \n    setNextPlugin(next: any) {\n      // no next setup\n    }\n  \n    public initialize = (config: IConfiguration, core: IAppInsightsCore, plugin: IPlugin[]) => {\n    }\n  \n    private _processTelemetry(env: ITelemetryItem) {\n  \n    }\n  }\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/EventHelper.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { addEventHandler, createUniqueNamespace, removeEventHandler } from \"../../../../src/index\";\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { mergeEvtNamespace, __getRegisteredEvents } from \"../../../../src/internal/EventHelpers\";\nimport { setBypassLazyCache } from \"@nevware21/ts-utils\";\n\nexport class EventHelperTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n        setBypassLazyCache(true);\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"addEventHandler: add and remove test\",\n            test: () => {\n                function _handler() {\n                    // Do nothing\n                }\n\n                Assert.ok(addEventHandler(\"test\", _handler, null), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using a different namespace which should fail\n                removeEventHandler(\"test\", _handler, \"fred\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", null, \"fred\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                removeEventHandler(\"test\", _handler, null);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n            }\n        });\n\n        this.testCase({\n            name: \"addEventHandler: add and remove test with single namespace\",\n            test: () => {\n                function _handler() {\n                    // Do nothing\n                }\n\n                let testNamespace = createUniqueNamespace(\"evtHelperTests\");\n                let test2Namespace = createUniqueNamespace(\"evtHelperTests\");\n\n                Assert.ok(addEventHandler(\"test\", _handler, testNamespace), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using a different namespace which should fail\n                removeEventHandler(\"test\", _handler, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", null, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                removeEventHandler(\"test\", _handler, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n            }\n        });\n\n        this.testCase({\n            name: \"addEventHandler: add with single namespace and remove only using namespace\",\n            test: () => {\n                function _handler() {\n                    // Do nothing\n                }\n\n                function _handler2() {\n\n                }\n\n                let testNamespace = createUniqueNamespace(\"evtHelperTests\");\n\n                Assert.ok(addEventHandler(\"test\", _handler, testNamespace), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // This remove should fail with invalid event and wrong handler\n                removeEventHandler(\"\", _handler2, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using a different namespace which should fail\n                removeEventHandler(\"test\", _handler, testNamespace + \".x\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", null, testNamespace + \".x\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // This remove should work\n                removeEventHandler(\"\", null, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n\n                Assert.ok(addEventHandler(\"test\", _handler, testNamespace), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n                // This remove should work\n                removeEventHandler(null, null, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n            }\n        });\n\n        this.testCase({\n            name: \"addEventHandler: add and remove test with multiple namespaces in order\",\n            test: () => {\n                function _handler() {\n                    // Do nothing\n                }\n\n                let testNamespace = createUniqueNamespace(\"AA\");\n                let test2Namespace = createUniqueNamespace(\"BB\");\n\n                // Add in reverse order\n                Assert.ok(addEventHandler(\"test\", _handler, [test2Namespace, testNamespace]), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using a different namespace which should fail\n                removeEventHandler(\"test\", _handler, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", null, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using reverse order should work\n                removeEventHandler(\"test\", _handler, [ test2Namespace, testNamespace ]);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n            }\n        });\n\n        this.testCase({\n            name: \"addEventHandler: add and remove test with multiple merged namespaces\",\n            test: () => {\n                function _handler() {\n                    // Do nothing\n                }\n\n                let testNamespace = createUniqueNamespace(\"AA\");\n                let test2Namespace = createUniqueNamespace(\"BB\");\n                let evtNamespace = mergeEvtNamespace(\"MultipleNamespaceTest\", [testNamespace, test2Namespace]);\n\n                // Add in reverse order\n                Assert.ok(addEventHandler(\"test\", _handler, evtNamespace), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using a different namespace which should fail\n                removeEventHandler(\"test\", _handler, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", null, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, [testNamespace, test2Namespace]);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, [test2Namespace, testNamespace]);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using reverse order should work\n                removeEventHandler(\"test\", _handler, evtNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n            }\n        });\n\n\n        this.testCase({\n            name: \"addEventHandler: add and remove test with multiple merged namespaces and removed with a different reversed merged namespace\",\n            test: () => {\n                function _handler() {\n                    // Do nothing\n                }\n\n                let testNamespace = createUniqueNamespace(\"AA\");\n                let test2Namespace = createUniqueNamespace(\"BB\");\n                let evtNamespace = mergeEvtNamespace(\"MultipleNamespaceTest\", [testNamespace, test2Namespace]);\n                let evt2Namespace = mergeEvtNamespace(\"MultipleNamespaceTest\", [test2Namespace, testNamespace]);\n\n                // Add in reverse order\n                Assert.ok(addEventHandler(\"test\", _handler, evtNamespace), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using a different namespace which should fail\n                removeEventHandler(\"test\", _handler, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", null, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, [testNamespace, test2Namespace]);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, [test2Namespace, testNamespace]);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using reverse order should work\n                removeEventHandler(\"test\", _handler, evt2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n            }\n        });\n\n        this.testCase({\n            name: \"addEventHandler: add and remove test with multiple namespaces in reverse order\",\n            test: () => {\n                function _handler() {\n                    // Do nothing\n                }\n\n                let testNamespace = createUniqueNamespace(\"AA\");\n                let test2Namespace = createUniqueNamespace(\"BB\");\n\n                // Add in reverse order\n                Assert.ok(addEventHandler(\"test\", _handler, [test2Namespace, testNamespace]), \"Events added\");\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using a different namespace which should fail\n                removeEventHandler(\"test\", _handler, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", null, test2Namespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using only a different namespace which should fail\n                removeEventHandler(\"test\", _handler, testNamespace);\n                _checkRegisteredAddEventHandler(\"test\", 1);\n\n                // Try removing using reverse order should work\n                removeEventHandler(\"test\", _handler, [ testNamespace, test2Namespace ]);\n                _checkRegisteredAddEventHandler(\"test\", 0);\n            }\n        });\n\n\n        this.testCase({\n            name: \"mergeEventNamespaces: Initializing different values\",\n            test: () => {\n                Assert.equal(null, mergeEvtNamespace(null, null), \"All null\");\n                Assert.equal(undefined, mergeEvtNamespace(undefined, undefined), \"All undefined\");\n                Assert.equal(null, mergeEvtNamespace(null, undefined), \"Null and undefined\");\n                Assert.equal(undefined, mergeEvtNamespace(undefined, null), \"Undefined and null\");\n                Assert.equal(\"\", mergeEvtNamespace(\"\", undefined), \"Empty and undefined\");\n                Assert.equal(\"\", mergeEvtNamespace(\"\", null), \"Empty and null\");\n                Assert.equal(\"\", mergeEvtNamespace(null, []), \"null and empty array\");\n                Assert.equal(\"\", mergeEvtNamespace(undefined, []), \"undefined and empty\");\n                Assert.equal(\"\", mergeEvtNamespace(\"\", []), \"undefined and empty\");\n                Assert.equal(\"a\", mergeEvtNamespace(\"a\", []));\n                Assert.equal(\"b\", mergeEvtNamespace(null, [\"b\"]));\n                Assert.equal(\"z\", mergeEvtNamespace(null, [\"z\"]));\n                Assert.equal(JSON.stringify([\"a\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"a\", [\"z\"])));\n                Assert.equal(JSON.stringify([\"a\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"z\", [\"a\"])));\n                Assert.equal(JSON.stringify([\"a\", \"b\", \"c\", \"d\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"z\", [\"d\", \"b\", \"c\", \"a\"])));\n                Assert.equal(JSON.stringify([\"a\", \"b\", \"c\", \"d\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"z\", [\"d\", \"b\", \"c\", \"a\"])));\n                Assert.equal(JSON.stringify([\"a\", \"b\", \"c\", \"d\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"z\", \"d.b.c.a\")));\n                Assert.equal(JSON.stringify([\"a\", \"aa\", \"f\", \"g\", \"x\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"z.a\", \"x.f.g.aa\")));\n                Assert.equal(JSON.stringify([\"a\", \"b\", \"c\", \"d\", \"e\"]), JSON.stringify(mergeEvtNamespace(\"e\", [\"d\", \"b\", \"\", \"c\", null, \"a\"])));\n                Assert.equal(JSON.stringify([\"a\", \"ab\", \"f\", \"g\", \"x\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"z.a\", \"x.f..g.ab\")));\n                Assert.equal(JSON.stringify([\"ab\", \"b\", \"f\", \"g\", \"x\", \"z\"]), JSON.stringify(mergeEvtNamespace(\"z.b.\", \"x.f..g.ab\")));\n            }\n        });\n\n        function _checkRegisteredAddEventHandler(name: string, expected: number) {\n            let registered = __getRegisteredEvents(window, name);\n            Assert.equal(expected, registered.length, \"Check that window event was registered for \" + name);\n\n            if (window && window[\"body\"]) {\n                registered = __getRegisteredEvents(window[\"body\"], name);\n                Assert.equal(expected, registered.length, \"Check that window.body event was registered for \" + name);\n            }\n\n            registered = __getRegisteredEvents(document, name);\n            Assert.equal(expected, registered.length, \"Check that document event was registered for \" + name);\n        }\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/EventsDiscardedReason.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { eEventsDiscardedReason, EventsDiscardedReason } from \"../../../../src/enums/ai/EventsDiscardedReason\";\n\nexport class EventsDiscardedReasonTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"LoggingSeverity values\",\n            test: () => {\n                Assert.equal(0, eEventsDiscardedReason.Unknown, \"Check eEventsDiscardedReason.Unknown\");\n                Assert.equal(1, eEventsDiscardedReason.NonRetryableStatus, \"Check eEventsDiscardedReason.NonRetryableStatus\");\n                Assert.equal(2, eEventsDiscardedReason.InvalidEvent, \"Check eEventsDiscardedReason.InvalidEvent\");\n                Assert.equal(3, eEventsDiscardedReason.SizeLimitExceeded, \"Check eEventsDiscardedReason.SizeLimitExceeded\");\n                Assert.equal(4, eEventsDiscardedReason.KillSwitch, \"Check eEventsDiscardedReason.KillSwitch\");\n                Assert.equal(5, eEventsDiscardedReason.QueueFull, \"Check eEventsDiscardedReason.QueueFull\");\n\n                Assert.equal(eEventsDiscardedReason.Unknown, EventsDiscardedReason.Unknown, \"Check EventsDiscardedReason.Unknown\");\n                Assert.equal(eEventsDiscardedReason.NonRetryableStatus, EventsDiscardedReason.NonRetryableStatus, \"Check EventsDiscardedReason.NonRetryableStatus\");\n                Assert.equal(eEventsDiscardedReason.InvalidEvent, EventsDiscardedReason.InvalidEvent, \"Check EventsDiscardedReason.InvalidEvent\");\n                Assert.equal(eEventsDiscardedReason.SizeLimitExceeded, EventsDiscardedReason.SizeLimitExceeded, \"Check EventsDiscardedReason.SizeLimitExceeded\");\n                Assert.equal(eEventsDiscardedReason.KillSwitch, EventsDiscardedReason.KillSwitch, \"Check EventsDiscardedReason.KillSwitch\");\n                Assert.equal(eEventsDiscardedReason.QueueFull, EventsDiscardedReason.QueueFull, \"Check EventsDiscardedReason.QueueFull\");\n\n                Assert.ok(0 === EventsDiscardedReason.Unknown, \"Check EventsDiscardedReason.Unknown === 0\");\n                Assert.ok(1 === EventsDiscardedReason.NonRetryableStatus, \"Check EventsDiscardedReason.NonRetryableStatus === 0\");\n                Assert.ok(2 === EventsDiscardedReason.InvalidEvent, \"Check EventsDiscardedReason.InvalidEvent === 0\");\n                Assert.ok(3 === EventsDiscardedReason.SizeLimitExceeded, \"Check EventsDiscardedReason.SizeLimitExceeded === 0\");\n                Assert.ok(4 === EventsDiscardedReason.KillSwitch, \"Check EventsDiscardedReason.KillSwitch === 0\");\n                Assert.ok(5 === EventsDiscardedReason.QueueFull, \"Check EventsDiscardedReason.QueueFull === 0\");\n\n                Assert.ok(eEventsDiscardedReason.Unknown === EventsDiscardedReason.Unknown, \"Check Unknown === eEventsDiscardedReason.Unknown\");\n                Assert.ok(eEventsDiscardedReason.NonRetryableStatus === EventsDiscardedReason.NonRetryableStatus, \"Check NonRetryableStatus === eEventsDiscardedReason.NonRetryableStatus\");\n                Assert.ok(eEventsDiscardedReason.InvalidEvent === EventsDiscardedReason.InvalidEvent, \"Check InvalidEvent === eEventsDiscardedReason.InvalidEvent\");\n                Assert.ok(eEventsDiscardedReason.SizeLimitExceeded === EventsDiscardedReason.SizeLimitExceeded, \"Check SizeLimitExceeded === eEventsDiscardedReason.SizeLimitExceeded\");\n                Assert.ok(eEventsDiscardedReason.KillSwitch === EventsDiscardedReason.KillSwitch, \"Check KillSwitch === eEventsDiscardedReason.KillSwitch\");\n                Assert.ok(eEventsDiscardedReason.QueueFull === EventsDiscardedReason.QueueFull, \"Check QueueFull === eEventsDiscardedReason.QueueFull\");\n\n                Assert.equal(\"0\", EventsDiscardedReason.Unknown.toString(), \"Checking value of EventsDiscardedReason.Unknown\");\n                Assert.equal(\"1\", EventsDiscardedReason.NonRetryableStatus.toString(), \"Checking value of EventsDiscardedReason.NonRetryableStatus\");\n                Assert.equal(\"2\", EventsDiscardedReason.InvalidEvent.toString(), \"Checking value of EventsDiscardedReason.InvalidEvent\");\n                Assert.equal(\"3\", EventsDiscardedReason.SizeLimitExceeded.toString(), \"Checking value of EventsDiscardedReason.SizeLimitExceeded\");\n                Assert.equal(\"4\", EventsDiscardedReason.KillSwitch.toString(), \"Checking value of EventsDiscardedReason.KillSwitch\");\n                Assert.equal(\"5\", EventsDiscardedReason.QueueFull.toString(), \"Checking value of EventsDiscardedReason.QueueFull\");\n\n                Assert.equal(\"Unknown\", EventsDiscardedReason[EventsDiscardedReason.Unknown], \"Checking string value of EventsDiscardedReason.Unknown\");\n                Assert.equal(\"NonRetryableStatus\", EventsDiscardedReason[EventsDiscardedReason.NonRetryableStatus], \"Checking string value of EventsDiscardedReason.NonRetryableStatus\");\n                Assert.equal(\"InvalidEvent\", EventsDiscardedReason[EventsDiscardedReason.InvalidEvent], \"Checking string value of EventsDiscardedReason.InvalidEvent\");\n                Assert.equal(\"SizeLimitExceeded\", EventsDiscardedReason[EventsDiscardedReason.SizeLimitExceeded], \"Checking string value of EventsDiscardedReason.SizeLimitExceeded\");\n                Assert.equal(\"KillSwitch\", EventsDiscardedReason[EventsDiscardedReason.KillSwitch], \"Checking string value of EventsDiscardedReason.KillSwitch\");\n                Assert.equal(\"QueueFull\", EventsDiscardedReason[EventsDiscardedReason.QueueFull], \"Checking string value of EventsDiscardedReason.QueueFull\");\n            }\n       });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/Exception.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { DataSanitizerValues } from \"../../../../src/telemetry/ai/Common/DataSanitizer\";\nimport { Exception } from \"../../../../src/telemetry/ai/Exception\";\nimport { DiagnosticLogger } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { IExceptionInternal, IExceptionDetailsInternal, IExceptionStackFrameInternal } from \"../../../../src/interfaces/ai/IExceptionTelemetry\";\nimport { _createExceptionDetails, _createExDetailsFromInterface, _extractStackFrame, _parsedFrameToInterface, _IParsedStackFrame } from \"../../../../src/telemetry/ai/Exception\";\nimport { IStackFrame } from \"../../../../src/interfaces/ai/contracts/IStackFrame\";\n\nfunction _checkExpectedFrame(expectedFrame: IStackFrame, actualFrame: IStackFrame,  index: number) {\n    Assert.equal(expectedFrame.assembly, actualFrame.assembly, index + \") Assembly is not as expected\");\n    Assert.equal(expectedFrame.fileName, actualFrame.fileName, index + \") FileName is not as expected\");\n    Assert.equal(expectedFrame.line, actualFrame.line, index + \") Line is not as expected\");\n    Assert.equal(expectedFrame.method, actualFrame.method, index + \") Method is not as expected\");\n    Assert.equal(expectedFrame.level, actualFrame.level, index + \") Level is not as expected\");    \n}\n\nexport class ExceptionTests extends AITestClass {\n    logger = new DiagnosticLogger();\n\n    public testInitialize() {\n    }\n\n    public testCleanup() {}\n\n    public registerTests() {\n        this.testCase({\n            name: \"Exception: Exception can be exported to interface format\",\n            test: () => {\n                const exception = new Exception(this.logger, new Error(\"test error\"));\n                Assert.ok(exception, \"Exception is created\");\n\n                const exceptionInterface: IExceptionInternal = exception.toInterface();\n                Assert.deepEqual(exception.id, exceptionInterface.id);\n                Assert.deepEqual(exception.problemGroup, exceptionInterface.problemGroup);\n                Assert.deepEqual(\"4.0\", exceptionInterface.ver, \"Default format expects CS4.0\");\n                Assert.deepEqual(2, exception.ver, \"Breeze format expects CS2.0\");\n                Assert.deepEqual(exception.isManual, exceptionInterface.isManual);\n                Assert.deepEqual(exception.exceptions.map((exception: any) => exception.toInterface()), exceptionInterface.exceptions);\n                Assert.deepEqual(exception.severityLevel, exceptionInterface.severityLevel);\n                Assert.deepEqual(exception.properties, exceptionInterface.properties);\n                Assert.deepEqual(exception.measurements, exceptionInterface.measurements);\n\n                const exceptionConverted = Exception.CreateFromInterface(this.logger, exceptionInterface);\n                Assert.deepEqual(exception, exceptionConverted);\n            }\n        });\n\n        this.testCase({\n            name: \"ExceptionDetails: ExceptionDetails can be exported to interface format\",\n            test: () => {\n                try {\n                    const exceptionDetails = _createExceptionDetails(this.logger, new Error(\"test error\"));\n                    Assert.ok(exceptionDetails, \"ExceptionDetails instance is created\");\n    \n                    const exceptionDetailsInterface: IExceptionDetailsInternal = exceptionDetails.toInterface();\n                    Assert.deepEqual(exceptionDetails.id, exceptionDetailsInterface.id);\n                    Assert.deepEqual(exceptionDetails.outerId, exceptionDetailsInterface.outerId);\n                    Assert.deepEqual(exceptionDetails.typeName, exceptionDetailsInterface.typeName);\n                    Assert.deepEqual(exceptionDetails.message, exceptionDetailsInterface.message);\n                    Assert.deepEqual(exceptionDetails.hasFullStack, exceptionDetailsInterface.hasFullStack);\n                    Assert.deepEqual(exceptionDetails.stack, exceptionDetailsInterface.stack);\n                    Assert.deepEqual(exceptionDetails.parsedStack && exceptionDetails.parsedStack.map((frame: any) => _parsedFrameToInterface(frame)), exceptionDetailsInterface.parsedStack);\n    \n                    const exceptionDetailsConverted = _createExDetailsFromInterface(this.logger, exceptionDetailsInterface);\n                    Assert.deepEqual(exceptionDetails, exceptionDetailsConverted);\n                } catch (e) {\n                    console.log(e.stack);\n                    console.log(e.toString());\n                    Assert.ok(false, e.toString());\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"ExceptionDetails: ExceptionDetails assembly fields will be truncated\",\n            test: () => {\n                try {\n                    // const define\n                    const MAX_STRING_LENGTH = DataSanitizerValues.MAX_STRING_LENGTH;\n                    const messageLong = new Array(MAX_STRING_LENGTH + 10).join(\"abc\");\n\n                    const messageFollowRegex = \"at functionName (a.js:1:1)\"\n                    const longMessageFollowRegex = messageFollowRegex.replace(\"functionName\", messageLong)\n\n                    let errObj = {\n                        reason:{\n                            message: \"message\",\n                            stack: longMessageFollowRegex + \"\\n\" + longMessageFollowRegex + \"\\n\" + longMessageFollowRegex\n                        }\n                    };\n\n                    let exception = Exception.CreateAutoException(\"message\",\n                        \"url\",\n                        9,\n                        0,\n                        errObj\n                    );\n                    const exceptionDetails = _createExceptionDetails(this.logger, exception);\n                    \n                    for (let i = 0; i < exceptionDetails.parsedStack.length; i++) {\n                        Assert.equal(MAX_STRING_LENGTH, exceptionDetails.parsedStack[i].assembly.length);\n                    }\n                } catch (e) {\n                    console.log(e.stack);\n                    console.log(e.toString());\n                    Assert.ok(false, e.toString());\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"ExceptionDetails: ExceptionDetails filename fields will be truncated\",\n            test: () => {\n                try {\n                    // const define\n                    const MAX_STRING_LENGTH = DataSanitizerValues.MAX_STRING_LENGTH;\n                    const messageLong = new Array(MAX_STRING_LENGTH + 10).join(\"abc\");\n\n                    const messageFollowRegex = \"at functionName (a.js:1:1)\"\n                    const longMessageFollowRegex = messageFollowRegex.replace(\"a.js\", messageLong)\n\n                    let errObj = {\n                        reason:{\n                            message: \"message\",\n                            stack: longMessageFollowRegex + \"\\n\" + longMessageFollowRegex + \"\\n\" + longMessageFollowRegex\n                        }\n                    };\n\n                    let exception = Exception.CreateAutoException(\"message\",\n                        \"url\",\n                        9,\n                        0,\n                        errObj\n                    );\n                    const exceptionDetails = _createExceptionDetails(this.logger, exception);\n                    \n                    for (let i = 0; i < exceptionDetails.parsedStack.length; i++) {\n                        Assert.equal(MAX_STRING_LENGTH, exceptionDetails.parsedStack[i].fileName.length);\n                    }\n                } catch (e) {\n                    console.log(e.stack);\n                    console.log(e.toString());\n                    Assert.ok(false, e.toString());\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"StackFrame: StackFrame can be exported to interface format\",\n            test: () => {\n                const error = new Error(\"hello\");\n                const stack = error.stack;\n                if (!stack) {\n                    Assert.ok(true);\n                    return;\n                }\n                const stackFrame = _extractStackFrame(stack.split(\"\\n\")[0], 0);\n                Assert.ok(stackFrame, \"StackFrame instance is created\");\n\n                const stackFrameInterface: IExceptionStackFrameInternal = _parsedFrameToInterface(stackFrame!);\n                Assert.deepEqual(stackFrame!.level, stackFrameInterface.level);\n                Assert.deepEqual(stackFrame!.method, stackFrameInterface.method);\n                Assert.deepEqual(stackFrame!.assembly, stackFrameInterface.assembly);\n                Assert.deepEqual(stackFrame!.fileName, stackFrameInterface.fileName);\n                Assert.deepEqual(stackFrame!.line, stackFrameInterface.line);\n            }\n        });\n\n        this.testCase({\n            name: \"StackFrame: ErrorStack can be exported from reason object of errorObj\",\n            test: () => {\n                let errObj = {\n                    reason:{\n                        message: \"message\",\n                        stack: \"TypeError: undefined\\n at Function.assign(<file>)\"\n                    }\n                };\n                let errDetail = {\n                    src: \"TypeError: undefined\\n at Function.assign(<file>)\",\n                    obj:[\"TypeError: undefined\",\" at Function.assign(<file>)\"]\n                };\n                let exception = Exception.CreateAutoException(\"message\",\n                    \"url\",\n                    9,\n                    0,\n                    errObj\n                );\n\n                Assert.ok(exception.stackDetails);\n                Assert.deepEqual(exception.stackDetails, errDetail);\n            }\n        });\n\n        this.testCase({\n            name: \"StackFrame: Validate different stack formats\",\n            test:() => {\n                let errObj = {\n                    reason:{\n                        message: \"Test_Error_Throwing_Inside_UseCallback\",\n                        stack: \"Error: Test_Error_Throwing_Inside_UseCallback\\n\" +\n                            \"at http://localhost:3000/static/js/main.206f4846.js:2:296748\\n\" +                      // Anonymous function with no function name attribution (firefox/ios)\n                            \"at Object.Re (http://localhost:3000/static/js/main.206f4846.js:2:16814)\\n\" +           // With class.function attribution\n                            \"at je (http://localhost:3000/static/js/main.206f4846.js:2:16968)\\n\" +                  // With function name attribution\n                            \"at Object.<anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:42819)\\n\" +  // With Object.<anonymous> attribution\n                            \"at Object.<anonymous> (../localfile.js:2:1234)\\n\" +                                    // With Object.<anonymous> attribution and local file                  \n                            \"at (anonymous) @ VM60:1\\n\" +                                                           // With (anonymous) attribution            \n                            \"at [native code]\\n\" +                                                                  // With [native code] attribution\n                            \"at (at eval at <anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:296748), <anonymous>:1:1)\\n\" + // With eval attribution\n                            \"at Object.eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\\n\" +        // With eval attribution\n                            \"at eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\\n\" +               // With eval attribution\n                            \"at eval (webpack-internal:///./src/App.tsx:1:1)\\n\" +                                   // With eval attribution\n                            \"at [arguments not available])@file://localhost/stacktrace.js:21\\n\" +                   // With arguments not available attribution\n                            \"at file://C:/Temp/stacktrace.js:27:1\\n\" +                                              // With file://localhost attribution\n                            \" Line 21 of linked script file://localhost/C:/Temp/stacktrace.js\\n\" +                  // With Line 21 of linked script attribution\n                            \" Line 11 of inline#1 script in http://localhost:3000/static/js/main.206f4846.js:2:296748\\n\" + // With Line 11 of inline#1 script attribution\n                            \" Line 68 of inline#2 script in file://localhost/teststack.html\\n\" +                    // With Line 68 of inline#2 script attribution\n                            \"at Function.Module._load (module.js:407:3)\\n\" +\n                            \" at Function.Module.runMain (module.js:575:10)\\n\"+ \n                            \" at startup (node.js:159:18)\\n\" +\n                            \"at Global code (http://example.com/stacktrace.js:11:1)\\n\" +\n                            \"at Object.Module._extensions..js (module.js:550:10)\\n\" +\n                            \"   at c@http://example.com/stacktrace.js:9:3\\n\" +\n                            \"   at b@http://example.com/stacktrace.js:6:3\\n\" +\n                            \"   at a@http://example.com/stacktrace.js:3:3\\n\" +\n                            \"http://localhost:3000/static/js/main.206f4846.js:2:296748\\n\" +                      // Anonymous function with no function name attribution (firefox/ios)\n                            \"   c@http://example.com/stacktrace.js:9:3\\n\" +\n                            \"   b@http://example.com/stacktrace.js:6:3\\n\" +\n                            \"   a@http://example.com/stacktrace.js:3:3\\n\" +\n                            \"  at Object.testMethod (http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:53058:48)\"\n                    }\n                };\n\n                const expectedParsedStack: IStackFrame[] = [\n                    { level: 0, method: \"<no_method>\", assembly: \"at http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 1, method: \"Object.Re\", assembly: \"at Object.Re (http://localhost:3000/static/js/main.206f4846.js:2:16814)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 2, method: \"je\", assembly: \"at je (http://localhost:3000/static/js/main.206f4846.js:2:16968)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 3, method: \"Object.<anonymous>\", assembly: \"at Object.<anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:42819)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 4, method: \"Object.<anonymous>\", assembly: \"at Object.<anonymous> (../localfile.js:2:1234)\", fileName: \"../localfile.js\", line: 2 },\n                    { level: 5, method: \"<anonymous>\", assembly: \"at (anonymous) @ VM60:1\", fileName: \"VM60\", line: 1 },\n                    { level: 6, method: \"<no_method>\", assembly: \"at [native code]\", fileName: \"\", line: 0 },\n                    { level: 7, method: \"<no_method>\", assembly: \"at (at eval at <anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:296748), <anonymous>:1:1)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 8, method: \"Object.eval\", assembly: \"at Object.eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 9, method: \"eval\", assembly: \"at eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 10, method: \"eval\", assembly: \"at eval (webpack-internal:///./src/App.tsx:1:1)\", fileName: \"webpack-internal:///./src/App.tsx\", line: 1 },\n                    { level: 11, method: \"<no_method>\", assembly: \"at [arguments not available])@file://localhost/stacktrace.js:21\", fileName: \"file://localhost/stacktrace.js\", line: 21 },\n                    { level: 12, method: \"<no_method>\", assembly: \"at file://C:/Temp/stacktrace.js:27:1\", fileName: \"file://C:/Temp/stacktrace.js\", line: 27 },\n                    { level: 13, method: \"<no_method>\", assembly: \"Line 21 of linked script file://localhost/C:/Temp/stacktrace.js\", fileName: \"file://localhost/C:/Temp/stacktrace.js\", line: 0 },\n                    { level: 14, method: \"<no_method>\", assembly: \"Line 11 of inline#1 script in http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 15, method: \"<no_method>\", assembly: \"Line 68 of inline#2 script in file://localhost/teststack.html\", fileName: \"file://localhost/teststack.html\", line: 0 },\n                    { level: 16, method: \"Function.Module._load\", assembly: \"at Function.Module._load (module.js:407:3)\", fileName: \"module.js\", line: 407 },\n                    { level: 17, method: \"Function.Module.runMain\", assembly: \"at Function.Module.runMain (module.js:575:10)\", fileName: \"module.js\", line: 575 },\n                    { level: 18, method: \"startup\", assembly: \"at startup (node.js:159:18)\", fileName: \"node.js\", line: 159 },\n                    { level: 19, method: \"<no_method>\", assembly: \"at Global code (http://example.com/stacktrace.js:11:1)\", fileName: \"http://example.com/stacktrace.js\", line: 11 },\n                    { level: 20, method: \"Object.Module._extensions..js\", assembly: \"at Object.Module._extensions..js (module.js:550:10)\", fileName: \"module.js\", line: 550 },\n                    { level: 21, method: \"c\", assembly: \"at c@http://example.com/stacktrace.js:9:3\", fileName: \"http://example.com/stacktrace.js\", line: 9 },\n                    { level: 22, method: \"b\", assembly: \"at b@http://example.com/stacktrace.js:6:3\", fileName: \"http://example.com/stacktrace.js\", line: 6 },\n                    { level: 23, method: \"a\", assembly: \"at a@http://example.com/stacktrace.js:3:3\", fileName: \"http://example.com/stacktrace.js\", line: 3 },\n                    { level: 24, method: \"<no_method>\", assembly: \"http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 },\n                    { level: 25, method: \"c\", assembly: \"c@http://example.com/stacktrace.js:9:3\", fileName: \"http://example.com/stacktrace.js\", line: 9 },\n                    { level: 26, method: \"b\", assembly: \"b@http://example.com/stacktrace.js:6:3\", fileName: \"http://example.com/stacktrace.js\", line: 6 },\n                    { level: 27, method: \"a\", assembly: \"a@http://example.com/stacktrace.js:3:3\", fileName: \"http://example.com/stacktrace.js\", line: 3 },\n                    { level: 28, method: \"Object.testMethod\", assembly: \"at Object.testMethod (http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:53058:48)\", fileName: \"http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js\", line: 53058 }\n                ];\n\n                let exception = Exception.CreateAutoException(\"message\",\n                    \"url\",\n                    9,\n                    0,\n                    errObj\n                );\n\n                Assert.ok(exception.stackDetails);\n                Assert.equal(exception.stackDetails?.src, errObj.reason.stack);\n                Assert.equal(exception.stackDetails?.obj.length, 30);\n\n                const exceptionDetails = _createExceptionDetails(this.logger, exception);\n                Assert.equal(exceptionDetails.stack, errObj.reason.stack);\n                Assert.equal(exceptionDetails.parsedStack.length, 29);\n                for (let lp = 0; lp < exceptionDetails.parsedStack.length; lp++) {\n                    _checkExpectedFrame(expectedParsedStack[lp], exceptionDetails.parsedStack[lp], lp);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"StackFrame: Validate individual different stack formatting\",\n            test:() => {\n                let testStacks: Array<{src: string, frame: IStackFrame }> = [\n                    { \n                        src: \"at http://localhost:3000/static/js/main.206f4846.js:2:296748\",                // Anonymous function with no function name attribution (firefox/ios)\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"at http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"at Object.Re (http://localhost:3000/static/js/main.206f4846.js:2:16814)\",     // With class.function attribution\n                        frame: { level: 0, method: \"Object.Re\", assembly: \"at Object.Re (http://localhost:3000/static/js/main.206f4846.js:2:16814)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"at je (http://localhost:3000/static/js/main.206f4846.js:2:16968)\",            // With function name attribution\n                        frame: { level: 0, method: \"je\", assembly: \"at je (http://localhost:3000/static/js/main.206f4846.js:2:16968)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"at Object.<anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:42819)\",  // With Object.<anonymous> attribution\n                        frame: { level: 0, method: \"Object.<anonymous>\", assembly: \"at Object.<anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:42819)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"at Object.<anonymous> (../localfile.js:2:1234)\",                                    // With Object.<anonymous> attribution and local file\n                        frame: { level: 0, method: \"Object.<anonymous>\", assembly: \"at Object.<anonymous> (../localfile.js:2:1234)\", fileName: \"../localfile.js\", line: 2 }\n                    },\n                    {\n                        src: \"at (anonymous) @ VM60:1\",                                                           // With (anonymous) attribution\n                        frame: { level: 0, method: \"<anonymous>\", assembly: \"at (anonymous) @ VM60:1\", fileName: \"VM60\", line: 1 }\n                    },\n                    {\n                        src: \"at [native code]\",                                                                  // With [native code] attribution\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"at [native code]\", fileName: \"\", line: 0 }\n                    },\n                    {\n                        src: \"at (at eval at <anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:296748), <anonymous>:1:1)\", // With eval attribution\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"at (at eval at <anonymous> (http://localhost:3000/static/js/main.206f4846.js:2:296748), <anonymous>:1:1)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"at Object.eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\",        // With eval attribution\n                        frame: { level: 0, method: \"Object.eval\", assembly: \"at Object.eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"at eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\",               // With eval attribution\n                        frame: { level: 0, method: \"eval\", assembly: \"at eval (http://localhost:3000/static/js/main.206f4846.js:2:296748)\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"at eval (webpack-internal:///./src/App.tsx:1:1)\",                                   // With eval attribution\n                        frame: { level: 0, method: \"eval\", assembly: \"at eval (webpack-internal:///./src/App.tsx:1:1)\", fileName: \"webpack-internal:///./src/App.tsx\", line: 1 }\n                    },\n                    {\n                        src: \"at [arguments not available])@file://localhost/stacktrace.js:21\",                   // With arguments not available attribution\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"at [arguments not available])@file://localhost/stacktrace.js:21\", fileName: \"file://localhost/stacktrace.js\", line: 21 }\n                    },\n                    {\n                        src: \"at file://C:/Temp/stacktrace.js:27:1\",                                              // With file://localhost attribution\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"at file://C:/Temp/stacktrace.js:27:1\", fileName: \"file://C:/Temp/stacktrace.js\", line: 27 }\n                    },\n                    {\n                        src: \" Line 21 of linked script file://localhost/C:/Temp/stacktrace.js\",                  // With Line 21 of linked script attribution\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"Line 21 of linked script file://localhost/C:/Temp/stacktrace.js\", fileName: \"file://localhost/C:/Temp/stacktrace.js\", line: 0 }\n                    },\n                    {\n                        src: \" Line 11 of inline#1 script in http://localhost:3000/static/js/main.206f4846.js:2:296748\", // With Line 11 of inline#1 script attribution\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"Line 11 of inline#1 script in http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \" Line 68 of inline#2 script in file://localhost/teststack.html\",                    // With Line 68 of inline#2 script attribution\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"Line 68 of inline#2 script in file://localhost/teststack.html\", fileName: \"file://localhost/teststack.html\", line: 0 }\n                    },\n                    {\n                        src: \"at Function.Module._load (module.js:407:3)\",\n                        frame: { level: 0, method: \"Function.Module._load\", assembly: \"at Function.Module._load (module.js:407:3)\", fileName: \"module.js\", line: 407 }\n                    },\n                    {\n                        src: \" at Function.Module.runMain (module.js:575:10)\",\n                        frame: { level: 0, method: \"Function.Module.runMain\", assembly: \"at Function.Module.runMain (module.js:575:10)\", fileName: \"module.js\", line: 575 }\n                    },\n                    {\n                        src: \" at startup (node.js:159:18)\",\n                        frame: { level: 0, method: \"startup\", assembly: \"at startup (node.js:159:18)\", fileName: \"node.js\", line: 159 }\n                    },\n                    {\n                        src: \"at Global code (http://example.com/stacktrace.js:11:1)\",\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"at Global code (http://example.com/stacktrace.js:11:1)\", fileName: \"http://example.com/stacktrace.js\", line: 11 }\n                    },\n                    {\n                        src: \"at Object.Module._extensions..js (module.js:550:10)\",\n                        frame: { level: 0, method: \"Object.Module._extensions..js\", assembly: \"at Object.Module._extensions..js (module.js:550:10)\", fileName: \"module.js\", line: 550 }\n                    },\n                    {\n                        src: \"   at c@http://example.com/stacktrace.js:9:3\",\n                        frame: { level: 0, method: \"c\", assembly: \"at c@http://example.com/stacktrace.js:9:3\", fileName: \"http://example.com/stacktrace.js\", line: 9 }\n                    },\n                    {\n                        src: \"   at b@http://example.com/stacktrace.js:6:3\",\n                        frame: { level: 0, method: \"b\", assembly: \"at b@http://example.com/stacktrace.js:6:3\", fileName: \"http://example.com/stacktrace.js\", line: 6 }\n                    },\n                    {\n                        src: \"   at a@http://example.com/stacktrace.js:3:3\",\n                        frame: { level: 0, method: \"a\", assembly: \"at a@http://example.com/stacktrace.js:3:3\", fileName: \"http://example.com/stacktrace.js\", line: 3 }\n                    },\n                    {\n                        src: \"http://localhost:3000/static/js/main.206f4846.js:2:296748\",                      // Anonymous function with no function name attribution (firefox/ios)\n                        frame: { level: 0, method: \"<no_method>\", assembly: \"http://localhost:3000/static/js/main.206f4846.js:2:296748\", fileName: \"http://localhost:3000/static/js/main.206f4846.js\", line: 2 }\n                    },\n                    {\n                        src: \"   c@http://example.com/stacktrace.js:9:3\",\n                        frame: { level: 0, method: \"c\", assembly: \"c@http://example.com/stacktrace.js:9:3\", fileName: \"http://example.com/stacktrace.js\", line: 9 }\n                    },\n                    {\n                        src: \"   b@http://example.com/stacktrace.js:6:3\",\n                        frame: { level: 0, method: \"b\", assembly: \"b@http://example.com/stacktrace.js:6:3\", fileName: \"http://example.com/stacktrace.js\", line: 6 }\n                    },\n                    {\n                        src: \"   a@http://example.com/stacktrace.js:3:3\",\n                        frame: { level: 0, method: \"a\", assembly: \"a@http://example.com/stacktrace.js:3:3\", fileName: \"http://example.com/stacktrace.js\", line: 3 }\n                    },\n                    {\n                        src: \"  at Object.testMethod (http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:53058:48)\",\n                        frame: { level: 0, method: \"Object.testMethod\", assembly: \"at Object.testMethod (http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:53058:48)\", fileName: \"http://localhost:9001/shared/AppInsightsCommon/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js\", line: 53058 }\n                    }\n                ];\n\n                for (let lp = 0; lp < testStacks.length; lp++) {\n                    let stackFrame = _extractStackFrame(testStacks[lp].src, 0);\n                    _checkExpectedFrame(testStacks[lp].frame, stackFrame!, lp);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"StackFrame: Standard Chrome exception stack\",\n            test:() => {\n                let errObj = {\n                    reason:{\n                        message: \"TypeError: Cannot read property 'b' of undefined\",\n                        stack: \"TypeError: Cannot read property 'b' of undefined\\n\" +\n                                \"  at ApplicationInsightsTests.<anonymous> (http://localhost:9001/AISKU/Tests/Unit/dist/aiskuunittests.tests.js:4578:40)\\n\" +\n                                \"  at trigger_1 (http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:52923:59)\\n\" +\n                                \"  at Object.testMethod (http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:52964:21)\\n\" +\n                                \"  at runTest (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2725:35)\\n\" +\n                                \"  at Test.run (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2708:9)\\n\" +\n                                \"  at http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2972:16\\n\" +\n                                \"  at processTaskQueue (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2293:26)\\n\" +\n                                \"  at http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2297:13\"\n                    }\n                };\n                let errDetail = {\n                    src: errObj.reason.stack,\n                    obj:[\n                        \"TypeError: Cannot read property 'b' of undefined\",\n                        \"at ApplicationInsightsTests.<anonymous> (http://localhost:9001/AISKU/Tests/Unit/dist/aiskuunittests.tests.js:4578:40)\",\n                        \"at trigger_1 (http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:52923:59)\",\n                        \"at Object.testMethod (http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:52964:21)\",\n                        \"at runTest (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2725:35)\",\n                        \"at Test.run (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2708:9)\",\n                        \"at http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2972:16\",\n                        \"at processTaskQueue (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2293:26)\",\n                        \"at http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2297:13\"\n                    ]\n                };\n                let exception = Exception.CreateAutoException(\"message\",\n                    \"url\",\n                    9,\n                    0,\n                    errObj\n                );\n\n                Assert.ok(exception.stackDetails);\n\n                const expectedParsedStack: IStackFrame[] = [\n                    { level: 0, method: \"ApplicationInsightsTests.<anonymous>\", assembly: \"at ApplicationInsightsTests.<anonymous> (http://localhost:9001/AISKU/Tests/Unit/dist/aiskuunittests.tests.js:4578:40)\", fileName: \"http://localhost:9001/AISKU/Tests/Unit/dist/aiskuunittests.tests.js\", line: 4578 },\n                    { level: 1, method: \"trigger_1\", assembly: \"at trigger_1 (http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:52923:59)\", fileName: \"http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js\", line: 52923 },\n                    { level: 2, method: \"Object.testMethod\", assembly: \"at Object.testMethod (http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js:52964:21)\", fileName: \"http://localhost:9001/AISKU/node_modules/@microsoft/ai-test-framework/dist/es5/ai-test-framework.js\", line: 52964 },\n                    { level: 3, method: \"runTest\", assembly: \"at runTest (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2725:35)\", fileName: \"http://localhost:9001/common/Tests/External/qunit-2.9.3.js\", line: 2725 },\n                    { level: 4, method: \"Test.run\", assembly: \"at Test.run (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2708:9)\", fileName: \"http://localhost:9001/common/Tests/External/qunit-2.9.3.js\", line: 2708 },\n                    { level: 5, method: \"<no_method>\", assembly: \"at http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2972:16\", fileName: \"http://localhost:9001/common/Tests/External/qunit-2.9.3.js\", line: 2972 },\n                    { level: 6, method: \"processTaskQueue\", assembly: \"at processTaskQueue (http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2293:26)\", fileName: \"http://localhost:9001/common/Tests/External/qunit-2.9.3.js\", line: 2293 },\n                    { level: 7, method: \"<no_method>\", assembly: \"at http://localhost:9001/common/Tests/External/qunit-2.9.3.js:2297:13\", fileName: \"http://localhost:9001/common/Tests/External/qunit-2.9.3.js\", line: 2297 }\n                ];\n\n                const exceptionDetails = _createExceptionDetails(this.logger, exception);\n                Assert.equal(exceptionDetails.stack, errObj.reason.stack);\n                Assert.equal(exceptionDetails.parsedStack.length, 8);\n                for (let lp = 0; lp < exceptionDetails.parsedStack.length; lp++) {\n                    _checkExpectedFrame(expectedParsedStack[lp], exceptionDetails.parsedStack[lp], lp);\n                }                \n            }\n        });\n\n        this.testCase({\n            name: \"StackFrame: handle multiple line message stack\",\n            test:() => {\n                let errObj = {\n                    reason:{\n                        message: \"Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n\" +\n                            \"1. You might have mismatching versions of React and the renderer (such as React DOM)\\n\" +\n                            \"2. You might be breaking the Rules of Hooks\\n\" +\n                            \"3. You might have more than one copy of React in the same app\\n\",\n                        stack: \"Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n\" +\n                            \"1. You might have mismatching versions of React and the renderer (such as React DOM)\\n\" +\n                            \"2. You might be breaking the Rules of Hooks\\n\" +\n                            \"3. You might have more than one copy of React in the same app\\n\" +\n                            \"See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.\\n\" +\n                            \"    at Object.throwInvalidHookError (https://localhost:44365/static/js/bundle.js:201419:13)\\n\" +\n                            \"    at useContext (https://localhost:44365/static/js/bundle.js:222943:25)\\n\" +\n                            \"    at useTenantContext (https://localhost:44365/static/js/bundle.js:5430:68)\\n\" +\n                            \"    at https://localhost:44365/static/js/bundle.js:4337:72\\n\" +\n                            \"    at _ZoneDelegate.invoke (https://localhost:44365/static/js/bundle.js:227675:158)\\n\" +\n                            \"    at ZoneImpl.run (https://localhost:44365/static/js/bundle.js:227446:35)\\n\" +\n                            \"    at https://localhost:44365/static/js/bundle.js:229764:30\\n\" +\n                            \"    at _ZoneDelegate.invokeTask (https://localhost:44365/static/js/bundle.js:227700:171)\\n\" +\n                            \"    at ZoneImpl.runTask (https://localhost:44365/static/js/bundle.js:227499:37)\\n\" +\n                            \"    at ZoneImpl.patchRunTask (https://localhost:44365/static/js/bundle.js:144112:27)\"\n                    }\n                };\n\n                const expectedParsedStack: IStackFrame[] = [\n                    { level: 0, method: \"Object.throwInvalidHookError\", assembly: \"at Object.throwInvalidHookError (https://localhost:44365/static/js/bundle.js:201419:13)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 201419 },\n                    { level: 1, method: \"useContext\", assembly: \"at useContext (https://localhost:44365/static/js/bundle.js:222943:25)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 222943 },\n                    { level: 2, method: \"useTenantContext\", assembly: \"at useTenantContext (https://localhost:44365/static/js/bundle.js:5430:68)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 5430 },\n                    { level: 3, method: \"<no_method>\", assembly: \"at https://localhost:44365/static/js/bundle.js:4337:72\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 4337 },\n                    { level: 4, method: \"_ZoneDelegate.invoke\", assembly: \"at _ZoneDelegate.invoke (https://localhost:44365/static/js/bundle.js:227675:158)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227675 },\n                    { level: 5, method: \"ZoneImpl.run\", assembly: \"at ZoneImpl.run (https://localhost:44365/static/js/bundle.js:227446:35)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227446 },\n                    { level: 6, method: \"<no_method>\", assembly: \"at https://localhost:44365/static/js/bundle.js:229764:30\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 229764 },\n                    { level: 7, method: \"_ZoneDelegate.invokeTask\", assembly: \"at _ZoneDelegate.invokeTask (https://localhost:44365/static/js/bundle.js:227700:171)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227700 },\n                    { level: 8, method: \"ZoneImpl.runTask\", assembly: \"at ZoneImpl.runTask (https://localhost:44365/static/js/bundle.js:227499:37)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 227499 },\n                    { level: 9, method: \"ZoneImpl.patchRunTask\", assembly: \"at ZoneImpl.patchRunTask (https://localhost:44365/static/js/bundle.js:144112:27)\", fileName: \"https://localhost:44365/static/js/bundle.js\", line: 144112 }\n                ];\n\n                let exception = Exception.CreateAutoException(\"message\",\n                    \"url\",\n                    9,\n                    0,\n                    errObj\n                );\n\n                Assert.ok(exception.stackDetails);\n                Assert.equal(exception.stackDetails?.src, errObj.reason.stack);\n                Assert.equal(exception.stackDetails?.obj.length, 15);\n\n                const exceptionDetails = _createExceptionDetails(this.logger, exception);\n                Assert.equal(exceptionDetails.stack, errObj.reason.stack);\n                Assert.equal(exceptionDetails.parsedStack.length, 10);\n                for (let lp = 0; lp < exceptionDetails.parsedStack.length; lp++) {\n                    _checkExpectedFrame(expectedParsedStack[lp], exceptionDetails.parsedStack[lp], lp);\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"../../../../src/core/UnloadHookContainer\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/HelperFunc.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { normalizeJsName, objExtend, _getObjProto, isFeatureEnabled } from \"../../../../src/utils/HelperFuncs\";\nimport { AppInsightsCore } from \"../../../../src/core/AppInsightsCore\";\nimport { isArray, isObject, objKeys, strEndsWith, strStartsWith, isPlainObject, utcNow } from \"@nevware21/ts-utils\";\nimport { FeatureOptInMode, IConfiguration, IFeatureOptInDetails, dumpObj } from \"../../../../src/index\";\n\n\n\nfunction _expectException(cb: () => void) {\n    try {\n        cb();\n        Assert.ok(false, \"Expected and exception to be thrown\");\n    } catch(e) {\n        Assert.ok(true, \"Expected an exception - \" + dumpObj(e));\n    }\n}\n\nexport class HelperFuncTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"strEndsWith\",\n            test: () => {\n                _expectException(() => {\n                    Assert.ok(!strEndsWith(null, null));\n                });\n                Assert.ok(!strEndsWith(\"\", null));\n                _expectException(() => {\n                    Assert.ok(!strEndsWith(null, \"\"));\n                });\n                Assert.ok(strEndsWith(\"\", \"\"));\n                Assert.ok(!strEndsWith(\"\", \"a\"));\n                Assert.ok(!strEndsWith(\"a\", \"b\"));\n                Assert.ok(strEndsWith(\"a\", \"\"));\n                Assert.ok(!strEndsWith(\"a\", \"ab\"));\n                Assert.ok(strEndsWith(\"a\", \"a\"));\n                Assert.ok(strEndsWith(\"ba\", \"a\"));\n                Assert.ok(strEndsWith(\"zyxyvutsrqponmlkjihgfedcba\", \"cba\"));\n                Assert.ok(!strEndsWith(\"a\", \"ba\"));\n                Assert.ok(!strEndsWith(\"abba\", \"cba\"));\n                Assert.ok(!strEndsWith(\"abba\", \"bb\"));\n            }\n        });\n\n        this.testCase({\n            name: \"strStartsWith\",\n            test: () => {\n                _expectException(() => {\n                    Assert.ok(!strStartsWith(null as any, null as any));\n                });\n                Assert.ok(!strStartsWith(\"\", null as any));\n                _expectException(() => {\n                    Assert.ok(!strStartsWith(null as any, \"\"));\n                });\n                Assert.ok(strStartsWith(\"\", \"\"));\n                Assert.ok(!strStartsWith(\"\", \"a\"));\n                Assert.ok(strStartsWith(\"a\", \"\"));\n                Assert.ok(!strStartsWith(\"a\", \"b\"));\n                Assert.ok(!strStartsWith(\"a\", \"ba\"));\n                Assert.ok(strStartsWith(\"ab\", \"a\"));\n                Assert.ok(!strStartsWith(\"zyxyvutsrqponmlkjihgfedcba\", \"a\"));\n                Assert.ok(strStartsWith(\"zyxwvutsrqponmlkjihgfedcba\", \"zyxw\"));\n                Assert.ok(!strStartsWith(\"a\", \"ab\"));\n                Assert.ok(!strStartsWith(\"abba\", \"abc\"));\n                Assert.ok(!strStartsWith(\"abba\", \"bb\"));\n            }\n        });\n\n        this.testCase({\n            name: 'default objExtend (shallow)',\n            test: () => {\n                let obj1 = {\n                    prop1: \"obj1prop1\",\n                    prop2: {\n                        nestedprop1: \"obj1nestedprop1\",\n                        nestedprop2: [\"obj1nestedprop2\"]\n                    }\n                };\n                let obj2 = {\n                    prop1: \"obj2prop1\",\n                    prop2: {\n                        nestedprop1: \"obj2nestedprop1\",\n                        nestedprop2: [\"obj2nestedprop2\"]\n                    },\n                    prop3: [{ prop3_arrayObject1: \"prop3_arrayObject1\" }, { prop3_arrayObject2: \"prop3_arrayObject2\" }]\n\n                };\n                let newObject = objExtend(obj1, obj2);\n                Assert.equal(\"obj2prop1\", newObject[\"prop1\"]);\n                Assert.equal(\"obj2nestedprop1\", newObject[\"prop2\"][\"nestedprop1\"]);\n                Assert.equal(\"obj2nestedprop2\", newObject[\"prop2\"][\"nestedprop2\"][0]);\n                Assert.equal(\"prop3_arrayObject1\", newObject[\"prop3\"][0][\"prop3_arrayObject1\"]);\n                Assert.equal(\"prop3_arrayObject2\", newObject[\"prop3\"][1][\"prop3_arrayObject2\"]);\n\n                // Update the object (which was deep copied), the new object should not be altered\n                obj2.prop2.nestedprop1 = \"Hello!\";\n                Assert.equal(\"Hello!\", newObject[\"prop2\"][\"nestedprop1\"]);\n            }\n        });\n\n        this.testCase({\n            name: 'objExtend with no arguments',\n            test: () => {\n                let newObject = objExtend();\n                Assert.ok(isObject(newObject), \"The returned object is an object\");\n                Assert.equal(0, objKeys(newObject).length, \"The object should have no values\");\n            }\n        });\n\n        this.testCase({\n            name: 'objExtend handle only invalid passed (undefined / null) values',\n            test: () => {\n                let newObject = objExtend(undefined, null);\n                Assert.ok(isObject(newObject), \"The returned object is an object\");\n                Assert.equal(0, objKeys(newObject).length, \"The object should have no values\");\n            }\n        });\n\n        this.testCase({\n            name: 'objExtend handle invalid (undefined / null) and valid object arguments (shallow)',\n            test: () => {\n                let obj1 = {\n                    prop1: \"obj1prop1\",\n                    prop2: {\n                        nestedprop1: \"obj1nestedprop1\",\n                        nestedprop2: [\"obj1nestedprop2\"]\n                    }\n                };\n                let obj2 = {\n                    prop1: \"obj2prop1\",\n                    prop2: {\n                        nestedprop1: \"obj2nestedprop1\",\n                        nestedprop2: [\"obj2nestedprop2\"]\n                    },\n                    prop3: [{ prop3_arrayObject1: \"prop3_arrayObject1\" }, { prop3_arrayObject2: \"prop3_arrayObject2\" }]\n\n                };\n                let newObject = objExtend(undefined, null, obj1, obj2, null);\n                Assert.equal(\"obj2prop1\", newObject[\"prop1\"]);\n                Assert.equal(\"obj2nestedprop1\", newObject[\"prop2\"][\"nestedprop1\"]);\n                Assert.equal(\"obj2nestedprop2\", newObject[\"prop2\"][\"nestedprop2\"][0]);\n                Assert.equal(\"prop3_arrayObject1\", newObject[\"prop3\"][0][\"prop3_arrayObject1\"]);\n                Assert.equal(\"prop3_arrayObject2\", newObject[\"prop3\"][1][\"prop3_arrayObject2\"]);\n\n                // Update the object (which was deep copied), the new object should not be altered\n                obj2.prop2.nestedprop1 = \"Hello!\";\n                Assert.equal(\"Hello!\", newObject[\"prop2\"][\"nestedprop1\"]);\n            }\n        });\n\n        this.testCase({\n            name: 'objExtend handle invalid (undefined / null) and valid object arguments (deep)',\n            test: () => {\n                let obj1 = {\n                    prop1: \"obj1prop1\",\n                    prop2: {\n                        nestedprop1: \"obj1nestedprop1\",\n                        nestedprop2: [\"obj1nestedprop2\"]\n                    }\n                };\n                let obj2 = {\n                    prop1: \"obj2prop1\",\n                    prop2: {\n                        nestedprop1: \"obj2nestedprop1\",\n                        nestedprop2: [\"obj2nestedprop2\"]\n                    },\n                    prop3: [{ prop3_arrayObject1: \"prop3_arrayObject1\" }, { prop3_arrayObject2: \"prop3_arrayObject2\" }]\n\n                };\n                let newObject = objExtend(true, undefined, null, obj1, obj2, null);\n                Assert.equal(\"obj2prop1\", newObject[\"prop1\"]);\n                Assert.equal(\"obj2nestedprop1\", newObject[\"prop2\"][\"nestedprop1\"]);\n                Assert.equal(\"obj2nestedprop2\", newObject[\"prop2\"][\"nestedprop2\"][0]);\n                Assert.equal(\"prop3_arrayObject1\", newObject[\"prop3\"][0][\"prop3_arrayObject1\"]);\n                Assert.equal(\"prop3_arrayObject2\", newObject[\"prop3\"][1][\"prop3_arrayObject2\"]);\n\n                // Update the object (which was deep copied), the new object should not be altered\n                obj2.prop2.nestedprop1 = \"Hello!\";\n                Assert.equal(\"obj2nestedprop1\", newObject[\"prop2\"][\"nestedprop1\"]);\n            }\n        });\n\n        this.testCase({\n            name: 'deep objExtend',\n            test: () => {\n                let obj1 = {\n                    prop1: \"obj1prop1\",\n                    prop2: {\n                        nestedprop1: \"obj1nestedprop1\",\n                        nestedprop2: [\"obj1nestedprop2\"]\n                    }\n                };\n                let obj2 = {\n                    prop1: \"obj2prop1\",\n                    prop2: {\n                        nestedprop1: \"obj2nestedprop1\",\n                        nestedprop2: [\"obj2nestedprop2\"]\n                    },\n                    prop3: [{ prop3_arrayObject1: \"prop3_arrayObject1\" }, { prop3_arrayObject2: \"prop3_arrayObject2\" }]\n\n                };\n                let newObject = objExtend(true, obj1, obj2);\n                Assert.equal(\"obj2prop1\", newObject[\"prop1\"]);\n                Assert.equal(\"obj2nestedprop1\", newObject[\"prop2\"][\"nestedprop1\"]);\n                Assert.equal(\"obj2nestedprop2\", newObject[\"prop2\"][\"nestedprop2\"][0]);\n                Assert.equal(\"prop3_arrayObject1\", newObject[\"prop3\"][0][\"prop3_arrayObject1\"]);\n                Assert.equal(\"prop3_arrayObject2\", newObject[\"prop3\"][1][\"prop3_arrayObject2\"]);\n\n                // Update the object (which was deep copied), the new object should not be altered\n                obj2.prop2.nestedprop1 = \"Hello!\";\n                Assert.equal(\"obj2nestedprop1\", newObject[\"prop2\"][\"nestedprop1\"]);\n            }\n        });\n\n        this.testCase({\n            name: 'shallow objExtend',\n            test: () => {\n                let obj1 = {\n                    prop1: \"obj1prop1\",\n                    prop2: {\n                        nestedprop1: \"obj1nestedprop1\",\n                        nestedprop2: [\"obj1nestedprop2\"]\n                    }\n                };\n                let obj2 = {\n                    prop1: \"obj2prop1\",\n                    prop2: {\n                        nestedprop1: \"obj2nestedprop1\",\n                        nestedprop2: [\"obj2nestedprop2\"]\n                    },\n                    prop3: [{ prop3_arrayObject1: \"prop3_arrayObject1\" }, { prop3_arrayObject2: \"prop3_arrayObject2\" }]\n\n                };\n                let newObject = objExtend(false, obj1, obj2);\n                Assert.equal(\"obj2prop1\", newObject[\"prop1\"]);\n                Assert.equal(\"obj2nestedprop1\", newObject[\"prop2\"][\"nestedprop1\"]);\n                Assert.equal(\"obj2nestedprop2\", newObject[\"prop2\"][\"nestedprop2\"][0]);\n                Assert.equal(\"prop3_arrayObject1\", newObject[\"prop3\"][0][\"prop3_arrayObject1\"]);\n                Assert.equal(\"prop3_arrayObject2\", newObject[\"prop3\"][1][\"prop3_arrayObject2\"]);\n\n                // Update the object (which was shallow copied)\n                obj2.prop2.nestedprop1 = \"Hello!\";\n                Assert.equal(\"Hello!\", newObject[\"prop2\"][\"nestedprop1\"]);\n            }\n        });\n\n        this.testCase({\n            name: \"normalizeJsName\",\n            test: () => {\n                Assert.equal(undefined, normalizeJsName(undefined));\n                Assert.equal(null, normalizeJsName(null));\n                Assert.equal(\"\", normalizeJsName(\"\"));\n                Assert.equal(\"a\", normalizeJsName(\"a\"));\n                Assert.equal(\"0\", normalizeJsName(\"0\"));\n                Assert.equal(0, normalizeJsName(0 as any));\n                Assert.equal(\"_0a\", normalizeJsName(\"0a\"));\n                Assert.equal(\"_0abc$_def123\", normalizeJsName(\"0abc$^def123\"));\n                Assert.equal(\"_0abc$_Def123\", normalizeJsName(\"0abc$^Def123\"));\n                Assert.equal(\"helloWorld\", normalizeJsName(\"hello-world\"));\n                Assert.equal(\"hello_World\", normalizeJsName(\"hello-World\"));\n                Assert.equal(\"helloWorld_123\", normalizeJsName(\"hello-world*123\"));\n                Assert.equal(\"HelloWorld_123\", normalizeJsName(\"-hello-world_123\"));\n                Assert.equal(\"abc123ABC___$__________\", normalizeJsName(\"abc123ABC!@#$%^&*()_-=+\"));\n            }\n        });\n\n        this.testCase({\n            name: \"isPlainObject\",\n            test: () => {\n                Assert.equal(false, isPlainObject(undefined));\n                Assert.equal(false, isPlainObject(null));\n                Assert.equal(true, isPlainObject({}));\n                Assert.equal(true, isPlainObject(Object.create(null)));\n                Assert.equal(false, isPlainObject(new AppInsightsCore()));\n                Assert.equal(false, isPlainObject(utcNow()));\n                Assert.equal(false, isPlainObject([]));\n                Assert.equal(false, isPlainObject(true), \"true\");\n                Assert.equal(false, isPlainObject(1), \"1\");\n                Assert.equal(false, isPlainObject(\"true\"), \"'true'\");\n                Assert.equal(false, isPlainObject(/regex/), \"/regex/\");\n                Assert.equal(false, isPlainObject(new Boolean(true)), \"new Boolean(true)\");\n                Assert.equal(false, isPlainObject(new Number(1)), \"new Number(1)\");\n                Assert.equal(false, isPlainObject(new String(\"true\")), \"new String('true')\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"isObject\",\n            test: () => {\n                Assert.equal(false, isObject(undefined), \"undefined\");\n                Assert.equal(false, isObject(null), \"null\");\n                Assert.equal(true, isObject({}), \"{}\");\n                Assert.equal(true, isObject(Object.create(null)), \"Object.create\");\n                Assert.equal(true, isObject(new AppInsightsCore()), \"AppInsightsCore\");\n                Assert.equal(false, isObject(utcNow()), \"utcNow\");\n                Assert.equal(true, isObject([]), \"[]\");\n                Assert.equal(false, isObject(true), \"true\");\n                Assert.equal(false, isObject(1), \"1\");\n                Assert.equal(false, isObject(\"true\"), \"'true'\");\n                Assert.equal(true, isObject(/regex/), \"/regex/\");\n                Assert.equal(true, isObject(new Boolean(true)), \"new Boolean(true)\");\n                Assert.equal(true, isObject(new Number(1)), \"new Number(1)\");\n                Assert.equal(true, isObject(new String(\"true\")), \"new String('true')\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"_getObjProto\",\n            test: () => {\n                _expectException(() => {\n                    Assert.equal(null, _getObjProto(null));\n                });\n                _expectException(() => {\n                    Assert.equal(null, _getObjProto(undefined));\n                });\n                Assert.equal(Object.prototype, _getObjProto({}));\n                Assert.equal(Date.prototype, _getObjProto(new Date()));\n                Assert.equal(Number.prototype, _getObjProto(utcNow()));\n                Assert.equal(Array.prototype, _getObjProto([]));\n                Assert.equal(Boolean.prototype, _getObjProto(true), \"new Boolean(true)\");\n                Assert.equal(Number.prototype, _getObjProto(1), \"new Number(1)\");\n                Assert.equal(String.prototype, _getObjProto(\"true\"), \"new String('true')\");\n                Assert.equal(RegExp.prototype, _getObjProto(/regex/), \"new String('true')\");\n                Assert.equal(Boolean.prototype, _getObjProto(new Boolean(true)), \"new Boolean(true)\");\n                Assert.equal(Number.prototype, _getObjProto(new Number(1)), \"new Number(1)\");\n                Assert.equal(String.prototype, _getObjProto(new String(\"true\")), \"new String('true')\");\n            }\n        });\n\n        this.testCase({\n            name: \"objKeys\",\n            test: () => {\n                let testObj = {\n                    a: 1,\n                    b: 2\n                };\n\n                let keys = objKeys(testObj);\n                Assert.equal(2, keys.length);\n                Assert.ok(keys[0] === \"a\" || keys[0] === \"b\");\n                Assert.ok(keys[1] === \"a\" || keys[1] === \"b\");\n                Assert.ok(keys[0] !== keys[1]);\n\n                Assert.equal(0, objKeys([]).length, \"An array should return an empty of keys\");\n                Assert.ok(isArray(objKeys([])), \"Array Result should be an array\");\n                Assert.ok(isArray(objKeys({})), \"Object Result should be an array\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"isFeatureEnable: empty field and optInMap\",\n            test: () => {\n                let rlt = isFeatureEnabled();\n                Assert.equal(rlt, undefined, \"feature is not enable case 1\");\n\n                rlt = isFeatureEnabled(\"\");\n                Assert.equal(rlt, undefined, \"feature is not enable case 2\");\n\n                rlt = isFeatureEnabled(\"\", {});\n                Assert.equal(rlt, undefined, \"feature is not enable case 3\");\n\n                rlt = isFeatureEnabled(undefined, {});\n                Assert.equal(rlt, undefined, \"feature is not enable case 4\");\n\n                rlt = isFeatureEnabled(undefined, {featureOptIn:{\"field\":{}}});\n                Assert.equal(rlt, undefined, \"feature is not enable case 5\");\n\n                rlt = isFeatureEnabled(\"field\");\n                Assert.equal(rlt, undefined, \"feature is not enable case 6\");\n\n                rlt = isFeatureEnabled(\"field1\", {featureOptIn:{}});\n                Assert.equal(rlt, undefined, \"feature is not enable case 7\");\n\n                rlt = isFeatureEnabled(\"field1\", {featureOptIn:{\"field\":{}}});\n                Assert.equal(rlt, undefined, \"feature is not enable case 8\");\n\n                rlt = isFeatureEnabled(\"field\", {featureOptIn:{\"field\":{}}});\n                Assert.equal(rlt, undefined, \"feature is not enable case 9\");\n\n                let cfg = {featureOptIn:{}} as IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg);\n                Assert.equal(rlt, undefined, \"feature is not enable case 10\");\n\n                cfg = {featureOptIn: {\"field\":{}}} as IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg);\n                Assert.equal(rlt, undefined, \"feature is not enable case 11\");\n\n                interface IConfig {\n                    config1: string;\n                    config2?: string;\n                }\n                cfg = {config1: \"test\", featureOptIn:{}} as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg);\n                Assert.equal(rlt, undefined, \"feature is not enable case 10\");\n            }\n        });\n\n        this.testCase({\n            name: \"isFeatureEnable: empty field and optInMap - default to disabled\",\n            test: () => {\n                let rlt = isFeatureEnabled(undefined, undefined, false);\n                Assert.equal(rlt, false, \"feature is disabled case 1\");\n\n                rlt = isFeatureEnabled(\"\", undefined, false);\n                Assert.equal(rlt, false, \"feature is disabled case 2\");\n\n                rlt = isFeatureEnabled(\"\", {}, false);\n                Assert.equal(rlt, false, \"feature is disabled case 3\");\n\n                rlt = isFeatureEnabled(undefined, {}, false);\n                Assert.equal(rlt, false, \"feature is disabled case 4\");\n\n                rlt = isFeatureEnabled(undefined, {featureOptIn:{\"field\":{}}}, false);\n                Assert.equal(rlt, false, \"feature is disabled case 5\");\n\n                rlt = isFeatureEnabled(\"field\", undefined, false);\n                Assert.equal(rlt, false, \"feature is disabled case 6\");\n\n                rlt = isFeatureEnabled(\"field1\", {featureOptIn:{}}, false);\n                Assert.equal(rlt, false, \"feature is disabled case 7\");\n\n                rlt = isFeatureEnabled(\"field1\", {featureOptIn:{\"field\":{}}}, false);\n                Assert.equal(rlt, false, \"feature is not enable case 8\");\n\n                rlt = isFeatureEnabled(\"field\", {featureOptIn:{\"field\":{}}}, false);\n                Assert.equal(rlt, false, \"feature is disabled case 9\");\n\n                let cfg = {featureOptIn:{}} as IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg, false);\n                Assert.equal(rlt, false, \"feature is disabled case 10\");\n\n                cfg = {featureOptIn: {\"field\":{}}} as IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg, false);\n                Assert.equal(rlt, false, \"feature is disabled case 11\");\n\n                interface IConfig {\n                    config1: string;\n                    config2?: string;\n                }\n                cfg = {config1: \"test\", featureOptIn:{}} as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg, false);\n                Assert.equal(rlt, false, \"feature is disabled case 10\");\n            }\n        });\n\n        this.testCase({\n            name: \"isFeatureEnable: empty field and optInMap - default to enabled\",\n            test: () => {\n                let rlt = isFeatureEnabled(undefined, undefined, true);\n                Assert.equal(rlt, true, \"feature is enabled case 1\");\n\n                rlt = isFeatureEnabled(\"\", undefined, true);\n                Assert.equal(rlt, true, \"feature is enabled case 2\");\n\n                rlt = isFeatureEnabled(\"\", {}, true);\n                Assert.equal(rlt, true, \"feature is enabled case 3\");\n\n                rlt = isFeatureEnabled(undefined, {}, true);\n                Assert.equal(rlt, true, \"feature is enabled case 4\");\n\n                rlt = isFeatureEnabled(undefined, {featureOptIn:{\"field\":{}}}, true);\n                Assert.equal(rlt, true, \"feature is enabled case 5\");\n\n                rlt = isFeatureEnabled(\"field\", undefined, true);\n                Assert.equal(rlt, true, \"feature is enabled case 6\");\n\n                rlt = isFeatureEnabled(\"field1\", {featureOptIn:{}}, true);\n                Assert.equal(rlt, true, \"feature is enabled case 7\");\n\n                rlt = isFeatureEnabled(\"field1\", {featureOptIn:{\"field\":{}}}, true);\n                Assert.equal(rlt, true, \"feature is enabled case 8\");\n\n                rlt = isFeatureEnabled(\"field\", {featureOptIn:{\"field\":{}}}, true);\n                Assert.equal(rlt, true, \"feature is enabled case 9\");\n\n                let cfg = {featureOptIn:{}} as IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg, true);\n                Assert.equal(rlt, true, \"feature is enabled case 10\");\n\n                cfg = {featureOptIn: {\"field\":{}}} as IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg, true);\n                Assert.equal(rlt, true, \"feature is enabled case 11\");\n\n                interface IConfig {\n                    config1: string;\n                    config2?: string;\n                }\n                cfg = {config1: \"test\", featureOptIn:{}} as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(\"field\", cfg, true);\n                Assert.equal(rlt, true, \"feature is enabled case 10\");\n            }\n        });\n\n        this.testCase({\n            name: \"isFeatureEnable: should return expected results\",\n            test: () => {\n                let field = \"field1\";\n                interface IConfig {\n                    config1?: string;\n                    config2?: string;\n                }\n\n                let cfg = {featureOptIn:{[field]: {mode: FeatureOptInMode.enable} as IFeatureOptInDetails}}as IConfig & IConfiguration;\n                let rlt = isFeatureEnabled(field, cfg);\n                Assert.equal(rlt, true, \"feature is enable case 1\");\n\n                cfg = {featureOptIn:{[field]: {mode: FeatureOptInMode.none} as IFeatureOptInDetails}}as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(field, cfg);\n                Assert.equal(rlt, undefined, \"feature is enable case 2\");\n\n                cfg = {featureOptIn:{[field]: {mode: FeatureOptInMode.disable} as IFeatureOptInDetails}}as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(field, cfg);\n                Assert.equal(rlt, false, \"feature is not enable case 3\");\n\n                cfg = {featureOptIn:{[field]: {onCfg:{\"config1\": false}} as IFeatureOptInDetails}}as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(\"field1\", cfg);\n                Assert.equal(rlt, undefined, \"feature is not enable case 4\");\n\n                cfg = {featureOptIn:{[field]: {mode: 100 as any} as IFeatureOptInDetails}}as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(field, cfg);\n                Assert.equal(rlt, undefined, \"feature is not enable case 5\");\n\n                cfg = {featureOptIn:{[field]: {mode: FeatureOptInMode.enable} as IFeatureOptInDetails}}as IConfig & IConfiguration;\n                rlt = isFeatureEnabled(\"field2\", cfg);\n                Assert.equal(rlt, undefined, \"feature is not enable case 6\");\n            }\n        });\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/LoggingEnum.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { isString, objForEachKey } from \"@nevware21/ts-utils\";\nimport { LoggingSeverity, eLoggingSeverity, _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\n\ntype NoRepeats<T extends readonly any[]> = { [M in keyof T]: { [N in keyof T]:\n    N extends M ? never : T[M] extends T[N] ? unknown : never\n}[number] extends never ? T[M] : never }\n\nconst verifyArray = <T>() => <U extends NoRepeats<U> & readonly T[]>(\n    u: (U | [never]) & ([T] extends [U[number]] ? unknown : never)\n) => u;\n\nexport class LoggingEnumTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"LoggingSeverity values\",\n            test: () => {\n                Assert.equal(1, LoggingSeverity.CRITICAL, \"Check LoggingSeverity.CRITICAL\");\n                Assert.equal(2, LoggingSeverity.WARNING, \"Check LoggingSeverity.WARNING\");\n\n                Assert.equal(eLoggingSeverity.CRITICAL, LoggingSeverity.CRITICAL, \"Check LoggingSeverity.CRITICAL\");\n                Assert.equal(eLoggingSeverity.WARNING, LoggingSeverity.WARNING, \"Check LoggingSeverity.WARNING\");\n\n                Assert.ok(1 === LoggingSeverity.CRITICAL, \"Check LoggingSeverity.CRITICAL === 1\");\n                Assert.ok(2 === LoggingSeverity.WARNING, \"Check LoggingSeverity.WARNING === 2\");\n\n                Assert.ok(eLoggingSeverity.CRITICAL === LoggingSeverity.CRITICAL, \"Check Critical === eLoggingSeverity.CRITICAL\");\n                Assert.ok(eLoggingSeverity.WARNING === LoggingSeverity.WARNING, \"Check Warning === eLoggingSeverity.WARNING\");\n\n                Assert.equal(\"1\", LoggingSeverity.CRITICAL.toString(), \"Checking value of LoggingSeverity.CRITICAL\");\n                Assert.equal(\"2\", LoggingSeverity.WARNING.toString(), \"Checking value of LoggingSeverity.WARNING\");\n\n                Assert.equal(\"CRITICAL\", LoggingSeverity[LoggingSeverity.CRITICAL], \"Checking string value of LoggingSeverity.CRITICAL\");\n                Assert.equal(\"WARNING\", LoggingSeverity[LoggingSeverity.WARNING], \"Checking string value of LoggingSeverity.WARNING\");\n\n                Assert.equal(1, LoggingSeverity[\"CRITICAL\"], \"Checking string value of LoggingSeverity['CRITICAL']\");\n                Assert.equal(2, LoggingSeverity[\"WARNING\"], \"Checking string value of LoggingSeverity['WARNING']\");\n            }\n        });\n\n        this.testCase({\n            name: \"LoggingSeverity validate immutability\",\n            test: () => {\n                // Attempt to \"Update\" the fields\n                objForEachKey(LoggingSeverity, (field, value) => {\n                    try {\n                        if (isString(value)) {\n                            LoggingSeverity[field] = \"Hacked-\" + value + \"!!!\";\n                        } else {\n                            LoggingSeverity[field] = value + 1000;\n                        }\n                    } catch (e) {\n                        // Ignore any errors thrown while trying to \"update\" the value\n                    }\n                });\n\n                // Add new values\n                try {\n                    (LoggingSeverity[666] as any) = \"New Stuff\";\n                    LoggingSeverity[\"NewStuff\"] = \"String New Stuff\";\n                } catch(e) {\n                        // Ignore any errors thrown while trying to \"update\" the value\n                }\n\n                Assert.equal(undefined, LoggingSeverity[666], \"Check LoggingSeverity[100]\");\n                Assert.equal(undefined, LoggingSeverity[\"NewStuff\"], \"Check LoggingSeverity[NewStuff]\");\n\n                // Check the values again as they should not have changed\n                Assert.equal(1, LoggingSeverity.CRITICAL, \"Check LoggingSeverity.CRITICAL\");\n                Assert.equal(2, LoggingSeverity.WARNING, \"Check LoggingSeverity.WARNING\");\n\n                Assert.equal(eLoggingSeverity.CRITICAL, LoggingSeverity.CRITICAL, \"Check LoggingSeverity.CRITICAL\");\n                Assert.equal(eLoggingSeverity.WARNING, LoggingSeverity.WARNING, \"Check LoggingSeverity.WARNING\");\n\n                Assert.ok(1 === LoggingSeverity.CRITICAL, \"Check LoggingSeverity.CRITICAL === 1\");\n                Assert.ok(2 === LoggingSeverity.WARNING, \"Check LoggingSeverity.WARNING === 2\");\n\n                Assert.ok(eLoggingSeverity.CRITICAL === LoggingSeverity.CRITICAL, \"Check Critical === eLoggingSeverity.CRITICAL\");\n                Assert.ok(eLoggingSeverity.WARNING === LoggingSeverity.WARNING, \"Check Warning === eLoggingSeverity.WARNING\");\n\n                Assert.equal(\"1\", LoggingSeverity.CRITICAL.toString(), \"Checking value of LoggingSeverity.CRITICAL\");\n                Assert.equal(\"2\", LoggingSeverity.WARNING.toString(), \"Checking value of LoggingSeverity.WARNING\");\n\n                Assert.equal(\"CRITICAL\", LoggingSeverity[LoggingSeverity.CRITICAL], \"Checking string value of LoggingSeverity.CRITICAL\");\n                Assert.equal(\"WARNING\", LoggingSeverity[LoggingSeverity.WARNING], \"Checking string value of LoggingSeverity.WARNING\");\n\n                Assert.equal(1, LoggingSeverity[\"CRITICAL\"], \"Checking string value of LoggingSeverity['CRITICAL']\");\n                Assert.equal(2, LoggingSeverity[\"WARNING\"], \"Checking string value of LoggingSeverity['WARNING']\");\n            }\n        });\n\n    //     this.testCase({\n    //         name: \"_InternalMessageId validate names\",\n    //         test: () => {\n    //             const verifyInternalMessageIds = verifyArray<keyof typeof _eInternalMessageId>();\n    //             const expectedKeys = verifyInternalMessageIds([\n    //                 \"BrowserDoesNotSupportLocalStorage\",\n    //                 \"BrowserCannotReadLocalStorage\",\n    //                 \"BrowserCannotReadSessionStorage\",\n    //                 \"BrowserCannotWriteLocalStorage\",\n    //                 \"BrowserCannotWriteSessionStorage\",\n    //                 \"BrowserFailedRemovalFromLocalStorage\",\n    //                 \"BrowserFailedRemovalFromSessionStorage\",\n    //                 \"CannotSendEmptyTelemetry\",\n    //                 \"ClientPerformanceMathError\",\n    //                 \"ErrorParsingAISessionCookie\",\n    //                 \"ErrorPVCalc\",\n    //                 \"ExceptionWhileLoggingError\",\n    //                 \"FailedAddingTelemetryToBuffer\",\n    //                 \"FailedMonitorAjaxAbort\",\n    //                 \"FailedMonitorAjaxDur\",\n    //                 \"FailedMonitorAjaxOpen\",\n    //                 \"FailedMonitorAjaxRSC\",\n    //                 \"FailedMonitorAjaxSend\",\n    //                 \"FailedMonitorAjaxGetCorrelationHeader\",\n    //                 \"FailedToAddHandlerForOnBeforeUnload\",\n    //                 \"FailedToSendQueuedTelemetry\",\n    //                 \"FailedToReportDataLoss\",\n    //                 \"FlushFailed\",\n    //                 \"MessageLimitPerPVExceeded\",\n    //                 \"MissingRequiredFieldSpecification\",\n    //                 \"NavigationTimingNotSupported\",\n    //                 \"OnError\",\n    //                 \"SessionRenewalDateIsZero\",\n    //                 \"SenderNotInitialized\",\n    //                 \"StartTrackEventFailed\",\n    //                 \"StopTrackEventFailed\",\n    //                 \"StartTrackFailed\",\n    //                 \"StopTrackFailed\",\n    //                 \"TelemetrySampledAndNotSent\",\n    //                 \"TrackEventFailed\",\n    //                 \"TrackExceptionFailed\",\n    //                 \"TrackMetricFailed\",\n    //                 \"TrackPVFailed\",\n    //                 \"TrackPVFailedCalc\",\n    //                 \"TrackTraceFailed\",\n    //                 \"TransmissionFailed\",\n    //                 \"FailedToSetStorageBuffer\",\n    //                 \"FailedToRestoreStorageBuffer\",\n    //                 \"InvalidBackendResponse\",\n    //                 \"FailedToFixDepricatedValues\",\n    //                 \"InvalidDurationValue\",\n    //                 \"TelemetryEnvelopeInvalid\",\n    //                 \"CreateEnvelopeError\",\n                \n    //                 // User actionable\n    //                 \"CannotSerializeObject\",\n    //                 \"CannotSerializeObjectNonSerializable\",\n    //                 \"CircularReferenceDetected\",\n    //                 \"ClearAuthContextFailed\",\n    //                 \"ExceptionTruncated\",\n    //                 \"IllegalCharsInName\",\n    //                 \"ItemNotInArray\",\n    //                 \"MaxAjaxPerPVExceeded\",\n    //                 \"MessageTruncated\",\n    //                 \"NameTooLong\",\n    //                 \"SampleRateOutOfRange\",\n    //                 \"SetAuthContextFailed\",\n    //                 \"SetAuthContextFailedAccountName\",\n    //                 \"StringValueTooLong\",\n    //                 \"StartCalledMoreThanOnce\",\n    //                 \"StopCalledWithoutStart\",\n    //                 \"TelemetryInitializerFailed\",\n    //                 \"TrackArgumentsNotSpecified\",\n    //                 \"UrlTooLong\",\n    //                 \"SessionStorageBufferFull\",\n    //                 \"CannotAccessCookie\",\n    //                 \"IdTooLong\",\n    //                 \"InvalidEvent\",\n    //                 \"FailedMonitorAjaxSetRequestHeader\",\n    //                 \"SendBrowserInfoOnUserInit\",\n    //                 \"PluginException\",\n    //                 \"NotificationException\",\n    //                 \"SnippetScriptLoadFailure\",\n    //                 \"InvalidInstrumentationKey\",\n    //                 \"CannotParseAiBlobValue\",\n    //                 \"InvalidContentBlob\",\n    //                 \"TrackPageActionEventFailed\",\n    //                 \"FailedAddingCustomDefinedRequestContext\",\n    //                 \"InMemoryStorageBufferFull\",\n    //                 \"InstrumentationKeyDeprecation\",\n    //                 \"ConfigWatcherException\"\n    //             ]);\n\n    //             expectedKeys.forEach((key) => {\n    //                 Assert.equal(key, _InternalMessageId[_InternalMessageId[key]], \" Expecting the key to be\" + key);\n    //             });\n    //         }\n    //     });\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/RequestHeaders.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { eRequestHeaders, RequestHeaders } from \"../../../../src/telemetry/RequestResponseHeaders\";\n\nexport class RequestHeadersTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"RequestHeaders values\",\n            test: () => {\n                Assert.equal(0, eRequestHeaders.requestContextHeader, \"Check eRequestHeaders.requestContextHeader\");\n                Assert.equal(1, eRequestHeaders.requestContextTargetKey, \"Check eRequestHeaders.requestContextTargetKey\");\n                Assert.equal(2, eRequestHeaders.requestContextAppIdFormat, \"Check eRequestHeaders.requestContextAppIdFormat\");\n                Assert.equal(3, eRequestHeaders.requestIdHeader, \"Check eRequestHeaders.requestIdHeader\");\n                Assert.equal(4, eRequestHeaders.traceParentHeader, \"Check eRequestHeaders.traceParentHeader\");\n                Assert.equal(5, eRequestHeaders.traceStateHeader, \"Check eRequestHeaders.traceStateHeader\");\n                Assert.equal(6, eRequestHeaders.sdkContextHeader, \"Check eRequestHeaders.sdkContextHeader\");\n                Assert.equal(7, eRequestHeaders.sdkContextHeaderAppIdRequest, \"Check eRequestHeaders.sdkContextHeaderAppIdRequest\");\n                Assert.equal(8, eRequestHeaders.requestContextHeaderLowerCase, \"Check eRequestHeaders.requestContextHeaderLowerCase\");\n\n                Assert.equal(\"Request-Context\", RequestHeaders.requestContextHeader, \"Check RequestHeaders.requestContextHeader\");\n                Assert.equal(\"appId\", RequestHeaders.requestContextTargetKey, \"Check RequestHeaders.requestContextTargetKey\");\n                Assert.equal(\"appId=cid-v1:\", RequestHeaders.requestContextAppIdFormat, \"Check RequestHeaders.requestContextAppIdFormat\");\n                Assert.equal(\"Request-Id\", RequestHeaders.requestIdHeader, \"Check RequestHeaders.requestIdHeader\");\n                Assert.equal(\"traceparent\", RequestHeaders.traceParentHeader, \"Check RequestHeaders.traceParentHeader\");\n                Assert.equal(\"tracestate\", RequestHeaders.traceStateHeader, \"Check RequestHeaders.traceStateHeader\");\n                Assert.equal(\"Sdk-Context\", RequestHeaders.sdkContextHeader, \"Check RequestHeaders.sdkContextHeader\");\n                Assert.equal(\"appId\", RequestHeaders.sdkContextHeaderAppIdRequest, \"Check RequestHeaders.sdkContextHeaderAppIdRequest\");\n                Assert.equal(\"request-context\", RequestHeaders.requestContextHeaderLowerCase, \"Check RequestHeaders.requestContextHeaderLowerCase\");\n\n                Assert.equal(\"Request-Context\", RequestHeaders[eRequestHeaders.requestContextHeader], \"Check RequestHeaders[eRequestHeaders.requestContextHeader]\");\n                Assert.equal(\"appId\", RequestHeaders[eRequestHeaders.requestContextTargetKey], \"Check RequestHeaders[eRequestHeaders.requestContextTargetKey]\");\n                Assert.equal(\"appId=cid-v1:\", RequestHeaders[eRequestHeaders.requestContextAppIdFormat], \"Check RequestHeaders[eRequestHeaders.requestContextAppIdFormat]\");\n                Assert.equal(\"Request-Id\", RequestHeaders[eRequestHeaders.requestIdHeader], \"Check RequestHeaders[eRequestHeaders.requestIdHeader]\");\n                Assert.equal(\"traceparent\", RequestHeaders[eRequestHeaders.traceParentHeader], \"Check RequestHeaders[eRequestHeaders.traceParentHeader]\");\n                Assert.equal(\"tracestate\", RequestHeaders[eRequestHeaders.traceStateHeader], \"Check RequestHeaders[eRequestHeaders.traceStateHeader]\");\n                Assert.equal(\"Sdk-Context\", RequestHeaders[eRequestHeaders.sdkContextHeader], \"Check RequestHeaders[eRequestHeaders.sdkContextHeader]\");\n                Assert.equal(\"appId\", RequestHeaders[eRequestHeaders.sdkContextHeaderAppIdRequest], \"Check RequestHeaders[eRequestHeaders.sdkContextHeaderAppIdRequest]\");\n                Assert.equal(\"request-context\", RequestHeaders[eRequestHeaders.requestContextHeaderLowerCase], \"Check RequestHeaders[eRequestHeaders.requestContextHeaderLowerCase]\");\n            }\n       });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/SendPostManager.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { SenderPostManager } from \"../../../../src/core/SenderPostManager\";\nimport { IPayloadData } from \"../../../../src/interfaces/ai/IXHROverride\";\nimport { getInst, isFunction, mathRandom } from \"@nevware21/ts-utils\";\nimport { createPromise, doAwaitResponse } from \"@nevware21/ts-async\";\n\nexport class SendPostManagerTests extends AITestClass {\n    private _sender: SenderPostManager;\n    private _isCompressionSupported: boolean;\n    \n    public testInitialize() {\n        super.testInitialize();\n        this._sender = new SenderPostManager();\n        \n        // Check if CompressionStream is supported in this environment\n        const csStream = getInst(\"CompressionStream\");\n        this._isCompressionSupported = isFunction(csStream);\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this._sender = null;\n    }\n\n   public registerTests() {\n        this.testCase({\n            name: \"preparePayload: compression disabled\",\n            test: () => {\n                const originalData = \"This is test data for compression disabled test\";\n                const payload: IPayloadData = {\n                    urlString: \"https://test.com\",\n                    data: originalData,\n                    headers: {}\n                };\n\n                return createPromise<void>((resolve) => {\n                    let callbackPayload: IPayloadData = null;\n                    const callback = (processedPayload: IPayloadData) => {\n                        callbackPayload = processedPayload;\n                        resolve();\n                    };\n\n                    // Compression disabled (zipPayload = false)\n                    this._sender.preparePayload(callback, false, payload, false);\n                    \n                    Assert.ok(callbackPayload, \"Callback should be called with payload\");\n                    Assert.equal(callbackPayload.data, originalData, \"Data should remain unchanged when compression is disabled\");\n                    Assert.ok(!callbackPayload.headers[\"Content-Encoding\"], \"Content-Encoding header should not be set\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"preparePayload: isSync should bypass compression\",\n            test: () => {\n                const originalData = \"This is test data for isSync test\";\n                const payload: IPayloadData = {\n                    urlString: \"https://test.com\",\n                    data: originalData,\n                    headers: {}\n                };\n\n                return createPromise<void>((resolve) => {\n                    let callbackPayload: IPayloadData = null;\n                    const callback = (processedPayload: IPayloadData) => {\n                        callbackPayload = processedPayload;\n                        resolve();\n                    };\n\n                    // isSync = true should bypass compression even if zipPayload is true\n                    this._sender.preparePayload(callback, true, payload, true);\n                    \n                    Assert.ok(callbackPayload, \"Callback should be called with payload\");\n                    Assert.equal(callbackPayload.data, originalData, \"Data should remain unchanged when isSync is true\");\n                    Assert.ok(!callbackPayload.headers[\"Content-Encoding\"], \"Content-Encoding header should not be set\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"preparePayload: empty payload data should bypass compression\",\n            test: () => {\n                const payload: IPayloadData = {\n                    urlString: \"https://test.com\",\n                    data: null,\n                    headers: {}\n                };\n\n                return createPromise<void>((resolve) => {\n                    let callbackPayload: IPayloadData = null;\n                    const callback = (processedPayload: IPayloadData) => {\n                        callbackPayload = processedPayload;\n                        resolve();\n                    };\n\n                    // null payload.data should bypass compression\n                    this._sender.preparePayload(callback, true, payload, false);\n                    \n                    Assert.ok(callbackPayload, \"Callback should be called with payload\");\n                    Assert.equal(callbackPayload.data, null, \"null data should remain null\");\n                    Assert.ok(!callbackPayload.headers[\"Content-Encoding\"], \"Content-Encoding header should not be set\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"preparePayload: compression enabled with string data\",\n            timeout: 5000,\n            useFakeTimers: false,\n            test: () => {\n                // Skip test if CompressionStream is not supported in this environment\n                if (!this._isCompressionSupported) {\n                    Assert.ok(true, \"CompressionStream is not supported in this environment, skipping test\");\n                    return;\n                }\n\n                const originalData = \"This is test data for compression with string data test\";\n                const payload: IPayloadData = {\n                    urlString: \"https://test.com\",\n                    data: originalData,\n                    headers: {}\n                };\n\n                return createPromise<void>((resolve) => {\n\n                    let callbackPayload: IPayloadData = null;\n                    const callback = (processedPayload: IPayloadData) => {\n                        callbackPayload = processedPayload;\n                        \n                        Assert.ok(callbackPayload, \"Callback should be called with payload\");\n                        Assert.ok(callbackPayload.data instanceof Uint8Array, \"Data should be compressed into a Uint8Array\");\n                        Assert.equal(callbackPayload.headers[\"Content-Encoding\"], \"gzip\", \"Content-Encoding header should be set to gzip\");\n                        Assert.ok((callbackPayload as any)._chunkCount >= 1, \"There should be at least 1 chunk in the compressed data - [\" + (callbackPayload as any)._chunkCount + \"] chunks processed\");\n                        \n                        // Verify the compressed data can be decompressed back to original\n                        this._decompressPayload(callbackPayload.data as Uint8Array).then(decompressedData => {\n                            const decoder = new TextDecoder();\n                            const decompressedString = decoder.decode(decompressedData);\n                            Assert.equal(decompressedString, originalData, \"Decompressed data should match original\");\n                            resolve();\n                        }).catch(err => {\n                            Assert.ok(false, \"Failed to decompress data: \" + err);\n                            resolve();\n                        });\n                    };\n\n                    // Enable compression\n                    this._sender.preparePayload(callback, true, payload, false);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"preparePayload: compression with large payload requiring multiple chunks\",\n            timeout: 10000, // Longer timeout for large payload\n            useFakeTimers: false,\n            test: () => {\n                // Skip test if CompressionStream is not supported in this environment\n                if (!this._isCompressionSupported) {\n                    Assert.ok(true, \"CompressionStream is not supported in this environment, skipping test\");\n                    return;\n                }\n\n                // Create a large payload that will likely require multiple chunks\n                let largePayload = \"This is a large payload for compression test.\\n\";\n                while (largePayload.length < 2000000) {\n                    largePayload += (mathRandom().toString(36).substring(2)).repeat(2);\n                }\n                const payload: IPayloadData = {\n                    urlString: \"https://test.com\",\n                    data: largePayload,\n                    headers: {}\n                };\n\n                return createPromise<void>((resolve) => {\n                    let callbackPayload: IPayloadData = null;\n                    const callback = (processedPayload: IPayloadData) => {\n                        callbackPayload = processedPayload;\n                        \n                        Assert.ok(callbackPayload, \"Callback should be called with payload\");\n                        Assert.ok(callbackPayload.data instanceof Uint8Array, \"Data should be compressed into a Uint8Array\");\n                        Assert.equal(callbackPayload.headers[\"Content-Encoding\"], \"gzip\", \"Content-Encoding header should be set to gzip\");\n                        \n                        // Verify the compressed data is smaller than the original (compression should work)\n                        Assert.ok((callbackPayload.data as Uint8Array).length < largePayload.length, \n                            \"Compressed data should be smaller than original\");\n                        \n                        Assert.ok((callbackPayload as any)._chunkCount > 1, \"There should be multiple chunks in the compressed data - [\" + (callbackPayload as any)._chunkCount + \"] chunks processed\");\n\n                        // Verify the compressed data can be decompressed back to original\n                        this._decompressPayload(callbackPayload.data as Uint8Array).then(decompressedData => {\n                            const decoder = new TextDecoder();\n                            const decompressedString = decoder.decode(decompressedData);\n                            Assert.equal(decompressedString, largePayload, \"Decompressed data should match original\");\n                            resolve();\n                        }).catch(err => {\n                            Assert.ok(false, \"Failed to decompress data: \" + err);\n                            resolve();\n                        });\n                    };\n\n                    // Enable compression\n                    this._sender.preparePayload(callback, true, payload, false);\n                });\n            }\n        });\n    }\n    \n    /**\n     * Helper method to decompress payload data using DecompressionStream\n     */\n    private _decompressPayload(compressedData: Uint8Array): Promise<Uint8Array> {\n        return new Promise<Uint8Array>((resolve, reject) => {\n            try {\n                const dsStream: any = getInst(\"DecompressionStream\");\n                if (!isFunction(dsStream)) {\n                    reject(new Error(\"DecompressionStream is not supported\"));\n                    return;\n                }\n\n                // Create a readable stream from compressed data\n                const compressedStream = new ReadableStream<Uint8Array>({\n                    start(controller) {\n                        controller.enqueue(compressedData);\n                        controller.close();\n                    }\n                });\n                \n                // Decompress the data\n                const decompressedStream = compressedStream.pipeThrough(new dsStream(\"gzip\"));\n                const reader = (decompressedStream.getReader() as ReadableStreamDefaultReader<Uint8Array>);\n                const chunks: Uint8Array[] = [];\n                let totalLength = 0;\n\n                // Process each chunk from the decompressed stream reader\n                doAwaitResponse(reader.read(), function processChunk(response: any): undefined | Promise<any> {\n                    if (!response.rejected) {\n                        // Process the chunk and continue reading\n                        const result = response.value;\n                        if (!result.done) {\n                            // Add current chunk and continue reading\n                            chunks.push(result.value);\n                            totalLength += result.value.length;\n                            return doAwaitResponse(reader.read(), processChunk) as any;\n                        }\n\n                        // We are complete so combine all chunks\n                        const combined = new Uint8Array(totalLength);\n                        let offset = 0;\n                        for (const chunk of chunks) {\n                            combined.set(chunk, offset);\n                            offset += chunk.length;\n                        }\n                        \n                        // Return the decompressed data\n                        resolve(combined);\n                    } else {\n                        reject(response.reason);\n                    }\n                });\n                \n            } catch (error) {\n                reject(error);\n            }\n        });\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/SeverityLevel.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { eSeverityLevel, SeverityLevel } from \"../../../../src/interfaces/ai/contracts/SeverityLevel\";\n\nexport class SeverityLevelTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"SeverityLevel values\",\n            test: () => {\n                Assert.equal(0, SeverityLevel.Verbose, \"Check SeverityLevel.Verbose\");\n                Assert.equal(1, SeverityLevel.Information, \"Check SeverityLevel.Information\");\n                Assert.equal(2, SeverityLevel.Warning, \"Check SeverityLevel.Warning\");\n                Assert.equal(3, SeverityLevel.Error, \"Check SeverityLevel.Error\");\n                Assert.equal(4, SeverityLevel.Critical, \"Check SeverityLevel.Critical\");\n\n\n                Assert.equal(eSeverityLevel.Verbose, SeverityLevel.Verbose, \"Check SeverityLevel.Verbose\");\n                Assert.equal(eSeverityLevel.Information, SeverityLevel.Information, \"Check SeverityLevel.Information\");\n                Assert.equal(eSeverityLevel.Warning, SeverityLevel.Warning, \"Check SeverityLevel.Warning\");\n                Assert.equal(eSeverityLevel.Error, SeverityLevel.Error, \"Check SeverityLevel.Error\");\n                Assert.equal(eSeverityLevel.Critical, SeverityLevel.Critical, \"Check SeverityLevel.Critical\");\n\n                Assert.ok(0 === SeverityLevel.Verbose, \"Check SeverityLevel.Verbose === 0\");\n                Assert.ok(1 === SeverityLevel.Information, \"Check SeverityLevel.Information === 1\");\n                Assert.ok(2 === SeverityLevel.Warning, \"Check SeverityLevel.Warning === 2\");\n                Assert.ok(3 === SeverityLevel.Error, \"Check SeverityLevel.Error === 3\");\n                Assert.ok(4 === SeverityLevel.Critical, \"Check SeverityLevel.Critical === 4\");\n\n                Assert.ok(SeverityLevel.Verbose === eSeverityLevel.Verbose, \"Check Verbose === eSeverityLevel.Verbose\");\n                Assert.ok(SeverityLevel.Information === eSeverityLevel.Information, \"Check Information === eSeverityLevel.Information\");\n                Assert.ok(SeverityLevel.Warning === eSeverityLevel.Warning, \"Check Warning === eSeverityLevel.Warning\");\n                Assert.ok(SeverityLevel.Error === eSeverityLevel.Error, \"Check Error === eSeverityLevel.Error\");\n                Assert.ok(SeverityLevel.Critical === eSeverityLevel.Critical, \"Check Critical === eSeverityLevel.Critical\");\n\n                Assert.equal(\"0\", SeverityLevel.Verbose.toString(), \"Checking value of SeverityLevel.Verbose\");\n                Assert.equal(\"1\", SeverityLevel.Information.toString(), \"Checking value of SeverityLevel.Information\");\n                Assert.equal(\"2\", SeverityLevel.Warning.toString(), \"Checking value of SeverityLevel.Warning\");\n                Assert.equal(\"3\", SeverityLevel.Error.toString(), \"Checking value of SeverityLevel.Error\");\n                Assert.equal(\"4\", SeverityLevel.Critical.toString(), \"Checking value of SeverityLevel.Critical\");\n\n                Assert.equal(\"Verbose\", SeverityLevel[SeverityLevel.Verbose], \"Checking string value of SeverityLevel.Verbose\");\n                Assert.equal(\"Information\", SeverityLevel[SeverityLevel.Information], \"Checking string value of SeverityLevel.Information\");\n                Assert.equal(\"Warning\", SeverityLevel[SeverityLevel.Warning], \"Checking string value of SeverityLevel.Warning\");\n                Assert.equal(\"Error\", SeverityLevel[SeverityLevel.Error], \"Checking string value of SeverityLevel.Error\");\n                Assert.equal(\"Critical\", SeverityLevel[SeverityLevel.Critical], \"Checking string value of SeverityLevel.Critical\");\n            }\n       });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/StatsBeat.Tests.ts",
    "content": "// import * as sinon from \"sinon\";\n// import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\n// import { IPayloadData } from \"../../../../src/interfaces/ai/IXHROverride\";\n// import { IStatsMgr } from \"../../../../src/JavaScriptSDK.Interfaces/IStatsMgr\";\n// import { AppInsightsCore } from \"../../../../src/core/AppInsightsCore\";\n// import { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\n// import { createStatsMgr } from \"../../../../src/JavaScriptSDK/StatsBeat\";\n// import { IStatsBeatState } from \"../../../../src/JavaScriptSDK.Interfaces/IStatsBeat\";\n// import { eStatsType } from \"../../../../src/JavaScriptSDK.Enums/StatsType\";\n// import { ITelemetryItem } from \"../../../../src/interfaces/ai/ITelemetryItem\";\n// import { IPlugin } from \"../../../../src/interfaces/ai/ITelemetryPlugin\";\n// import { IAppInsightsCore } from \"../../../../src/interfaces/ai/IAppInsightsCore\";\n// import { FeatureOptInMode } from \"../../../../src/JavaScriptSDK.Enums/FeatureOptInEnums\";\n\n// const STATS_COLLECTION_SHORT_INTERVAL: number = 900; // 15 minutes\n\n// export class StatsBeatTests extends AITestClass {\n//     private _core: AppInsightsCore;\n//     private _config: IConfiguration;\n//     private _statsMgr: IStatsMgr;\n//     private _trackSpy: sinon.SinonSpy;\n\n//     constructor(emulateIe: boolean) {\n//         super(\"StatsBeatTests\", emulateIe);\n//     }\n\n//     public testInitialize() {\n//         let _self = this;\n//         super.testInitialize();\n        \n//         _self._config = {\n//             instrumentationKey: \"Test-iKey\",\n//             disableInstrumentationKeyValidation: true,\n//             _sdk: {\n//                 stats: {\n//                     shrtInt: STATS_COLLECTION_SHORT_INTERVAL,\n//                     endCfg: [\n//                         { \n//                             type: 0,\n//                             keyMap: [\n//                                 {\n//                                     key: \"stats-key1\",\n//                                     match: [ \"https://example.endpoint.com\" ]\n//                                 }\n//                             ]\n//                         }\n//                     ]\n//                 }\n//             }\n//         };\n        \n//         _self._statsMgr = createStatsMgr();\n//         _self._core = new AppInsightsCore();\n//         // _self._statsMgr.init(_self._core, {\n//         //     feature: \"StatsBeat\",\n//         //     getCfg: (core, cfg) => {\n//         //         return cfg?._sdk?.stats;\n//         //     }\n//         // });\n        \n//         // Create spy for tracking telemetry\n//         _self._trackSpy = this.sandbox.spy(_self._core, \"track\");\n//     }\n\n//     public testCleanup() {\n//         super.testCleanup();\n//         this._core = null as any;\n//         this._statsMgr = null as any;\n//     }\n\n//     public registerTests() {\n\n//         this.testCase({\n//             name: \"StatsBeat: Initialization\",\n//             test: () => {\n//                 // Test with no initialization\n//                 Assert.equal(false, this._statsMgr.enabled, \"StatsBeat should not be initialized by default\");\n                \n//                 let statsBeatState: IStatsBeatState = {\n//                     cKey: \"Test-iKey\",\n//                     endpoint: \"https://example.endpoint.com\",\n//                     sdkVer: \"1.0.0\",\n//                     type: eStatsType.SDK\n//                 };\n//                 Assert.equal(null, this._statsMgr.newInst(statsBeatState), \"StatsBeat should not be created before initialization\");\n\n//                 // Initialize\n//                 this._statsMgr.init(this._core, {\n//                     feature: \"StatsBeat\",\n//                     getCfg: (core, cfg) => {\n//                         return cfg?._sdk?.stats;\n//                     }\n//                 });\n//                 Assert.equal(true, this._statsMgr.enabled, \"StatsBeat should be initialized after initialization\");\n\n//                 let newInst = this._statsMgr.newInst(statsBeatState);\n//                 Assert.ok(!!newInst, \"StatsBeat should be created after initialization\");\n//                 Assert.equal(true, newInst.enabled, \"StatsBeat should be enabled after initialization\");\n//                 Assert.equal(\"https://example.endpoint.com\", newInst.endpoint);\n//                 Assert.equal(0, newInst.type);\n//             }\n//         });\n\n//         this.testCase({\n//             name: \"StatsBeat: count method tracks request metrics\",\n//             useFakeTimers: true,\n//             test: () => {\n//                 // Initialize StatsBeat\n//                 this._statsMgr.init(this._core, {\n//                     feature: \"StatsBeat\",\n//                     getCfg: (core, cfg) => {\n//                         return cfg?._sdk?.stats;\n//                     }\n//                 });\n                \n//                 // Create mock payload data with timing information\n//                 const payloadData = {\n//                     urlString: \"https://example.endpoint.com\",\n//                     data: \"testData\",\n//                     headers: {},\n//                     timeout: 0,\n//                     disableXhrSync: false,\n//                     statsBeatData: {\n//                         startTime: \"2023-10-01T00:00:00Z\" // Simulated start time\n//                     }\n//                 } as IPayloadData;\n                \n//                 let statsBeatState: IStatsBeatState = {\n//                     cKey: \"Test-iKey\",\n//                     endpoint: \"https://example.endpoint.com\",\n//                     sdkVer: \"1.0.0\",\n//                     type: eStatsType.SDK\n//                 };                \n//                 let statsBeat = this._statsMgr.newInst(statsBeatState);\n\n//                 // Test successful request\n//                 statsBeat.count(200, payloadData, \"https://example.endpoint.com\");\n                \n//                 // Test failed request\n//                 statsBeat.count(500, payloadData, \"https://example.endpoint.com\");\n                \n//                 // Test throttled request\n//                 statsBeat.count(429, payloadData, \"https://example.endpoint.com\");\n                \n//                 // Verify that trackStatsbeats is called when the timer fires\n//                 this.clock.tick(STATS_COLLECTION_SHORT_INTERVAL + 1);\n                \n//                 // Verify that track was called\n//                 Assert.ok(this._trackSpy.called, \"track should be called when statsbeat timer fires\");\n                \n//                 // When the timer fires, multiple metrics should be sent\n//                 Assert.ok(this._trackSpy.callCount >= 3, \"Multiple metrics should be tracked\");\n//             }\n//         });\n\n//         this.testCase({\n//             name: \"StatsBeat: countException method tracks exceptions\",\n//             useFakeTimers: true,\n//             test: () => {\n//                 // Initialize StatsBeat\n//                 this._statsMgr.init(this._core, {\n//                     feature: \"StatsBeat\",\n//                     getCfg: (core, cfg) => {\n//                         return cfg?._sdk?.stats;\n//                     }\n//                 });                \n\n//                 let statsBeatState: IStatsBeatState = {\n//                     cKey: \"Test-iKey\",\n//                     endpoint: \"https://example.endpoint.com\",\n//                     sdkVer: \"1.0.0\",\n//                     type: eStatsType.SDK\n//                 };                \n//                 let statsBeat = this._statsMgr.newInst(statsBeatState);                \n                \n//                 // Count an exception\n//                 statsBeat.countException(\"https://example.endpoint.com\", \"NetworkError\");\n                \n//                 // Verify that trackStatsbeats is called when the timer fires\n//                 this.clock.tick(STATS_COLLECTION_SHORT_INTERVAL + 1);\n                \n//                 // Verify that track was called\n//                 Assert.ok(this._trackSpy.called, \"track should be called when statsbeat timer fires\");\n                \n//                 // Check that exception metrics are tracked\n//                 let foundExceptionMetric = false;\n//                 for (let i = 0; i < this._trackSpy.callCount; i++) {\n//                     const call = this._trackSpy.getCall(i);\n//                     const item: ITelemetryItem = call.args[0];\n//                     if (item.baseData && \n//                         item.baseData.properties && \n//                         item.baseData.properties.exceptionType === \"NetworkError\") {\n//                         foundExceptionMetric = true;\n//                         break;\n//                     }\n//                 }\n                \n//                 Assert.ok(foundExceptionMetric, \"Exception metrics should be tracked\");\n//             }\n//         });\n\n//         this.testCase({\n//             name: \"StatsBeat: does not send metrics for different endpoints\",\n//             useFakeTimers: true,\n//             test: () => {\n//                 // Initialize StatsBeat for a specific endpoint\n//                 this._statsMgr.init(this._core, {\n//                     feature: \"StatsBeat\",\n//                     getCfg: (core, cfg) => {\n//                         return cfg?._sdk?.stats;\n//                     }\n//                 });\n                \n//                 // Create mock payload data\n//                 const payloadData = {\n//                     urlString: \"https://example.endpoint.com\",\n//                     data: \"testData\",\n//                     headers: {},\n//                     timeout: 0,\n//                     disableXhrSync: false,\n//                     statsBeatData: {\n//                         startTime: Date.now()\n//                     }\n//                 } as IPayloadData;\n                \n//                 let statsBeatState: IStatsBeatState = {\n//                     cKey: \"Test-iKey\",\n//                     endpoint: \"https://example.endpoint.com\",\n//                     sdkVer: \"1.0.0\",\n//                     type: eStatsType.SDK\n//                 };                \n//                 let statsBeat = this._statsMgr.newInst(statsBeatState);      \n\n//                 // Set up spies to check internal calls\n//                 const countSpy = this.sandbox.spy(statsBeat, \"count\");\n                \n//                 // Count metrics for a different endpoint\n//                 statsBeat.count(200, payloadData, \"https://different.endpoint.com\");\n\n//                 // Verify that trackStatsbeats is called when the timer fires\n//                 this.clock.tick(STATS_COLLECTION_SHORT_INTERVAL + 1);\n//                 // The count method was called, but it should return early\n//                 Assert.equal(1, countSpy.callCount, \"count method should be called\");\n//                 Assert.equal(0, this._trackSpy.callCount, \"track should not be called for different endpoint\");\n//             }\n//         });\n\n//         this.testCase({\n//             name: \"StatsBeat: test dynamic configuration changes\",\n//             useFakeTimers: true,\n//             test: () => {\n//                 // Setup core with statsbeat enabled\n//                 this._core.initialize(this._config, [new ChannelPlugin()]);\n//                 // Initialize StatsBeat for a specific endpoint\n//                 this._statsMgr.init(this._core, {\n//                     feature: \"StatsBeat\",\n//                     getCfg: (core, cfg) => {\n//                         return cfg?._sdk?.stats;\n//                     }\n//                 });\n//                 this._core.setStatsMgr(this._statsMgr);                \n\n//                 let statsBeatState: IStatsBeatState = {\n//                     cKey: \"Test-iKey\",\n//                     endpoint: \"https://example.endpoint.com\",\n//                     sdkVer: \"1.0.0\",\n//                     type: eStatsType.SDK\n//                 };   \n\n//                 // Verify that statsbeat is created\n//                 const statsbeat = this._core.getStatsBeat(statsBeatState);\n//                 Assert.ok(!!statsbeat, \"Statsbeat should be created\");\n                \n//                 // Explicitly disable statsbeat\n//                 this._core.config.featureOptIn[\"StatsBeat\"].mode = FeatureOptInMode.disable;\n//                 this.clock.tick(1); // Allow time for config changes to propagate\n                \n//                 // Verify that statsbeat is removed\n//                 const updatedStatsbeat = this._core.getStatsBeat(statsBeatState);\n//                 Assert.ok(!updatedStatsbeat, \"Statsbeat should be removed when disabled\");\n                \n//                 // Re-enable statsbeat\n//                 this._core.config.featureOptIn[\"StatsBeat\"].mode = FeatureOptInMode.enable;\n//                 this.clock.tick(1); // Allow time for config changes to propagate\n                \n//                 // Verify that statsbeat is created again\n//                 const reenabledStatsbeat = this._core.getStatsBeat(statsBeatState);\n//                 Assert.ok(reenabledStatsbeat, \"Statsbeat should be recreated when re-enabled\");\n\n//                 // Test that statsbeat is not created when disabled with undefined\n//                 this._core.config.featureOptIn[\"StatsBeat\"].mode = FeatureOptInMode.none;\n//                 this.clock.tick(1); // Allow time for config changes to propagate\n                \n//                 // Verify that statsbeat is removed\n//                 Assert.ok(!this._core.getStatsBeat(statsBeatState), \"Statsbeat should be removed when disabled\");\n\n//                 // Re-enable statsbeat\n//                 this._core.config.featureOptIn[\"StatsBeat\"].mode = FeatureOptInMode.enable;\n//                 this.clock.tick(1); // Allow time for config changes to propagate\n                \n//                 // Verify that statsbeat is created again\n//                 Assert.ok(!!this._core.getStatsBeat(statsBeatState), \"Statsbeat should be recreated when re-enabled\");\n\n//                 // Test that statsbeat is not created when disabled with null value\n//                 this._core.config.featureOptIn[\"StatsBeat\"].mode = null;\n//                 this.clock.tick(1); // Allow time for config changes to propagate\n                \n//                 // Verify that statsbeat is removed\n//                 Assert.ok(!this._core.getStatsBeat(statsBeatState), \"Statsbeat should be removed when disabled\");\n//             }\n//         });\n//     }\n// }\n\n// class ChannelPlugin implements IPlugin {\n//     public isFlushInvoked = false;\n//     public isTearDownInvoked = false;\n//     public isResumeInvoked = false;\n//     public isPauseInvoked = false;\n\n//     public identifier = \"Sender\";\n//     public priority: number = 1001;\n\n//     constructor() {\n//         this.processTelemetry = this._processTelemetry.bind(this);\n//     }\n    \n//     public pause(): void {\n//         this.isPauseInvoked = true;\n//     }\n\n//     public resume(): void {\n//         this.isResumeInvoked = true;\n//     }\n\n//     public teardown(): void {\n//         this.isTearDownInvoked = true;\n//     }\n\n//     flush(async?: boolean, callBack?: () => void): void {\n//         this.isFlushInvoked = true;\n//         if (callBack) {\n//             callBack();\n//         }\n//     }\n\n//     public processTelemetry(env: ITelemetryItem) {}\n\n//     setNextPlugin(next: any) {\n//         // no next setup\n//     }\n\n//     public initialize = (config: IConfiguration, core: IAppInsightsCore, plugin: IPlugin[]) => {\n//     }\n\n//     private _processTelemetry(env: ITelemetryItem) {\n//     }\n// }\n\n// class CustomTestError extends Error {\n//     constructor(message = \"\") {\n//       super(message);\n//       this.name = \"CustomTestError\";\n//       this.message = message + \" -- test error.\";\n//     }\n// }"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/TestPlugins.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { ITelemetryItem } from \"../../../../src/interfaces/ai/ITelemetryItem\";\nimport { IProcessTelemetryContext, IProcessTelemetryUpdateContext } from \"../../../../src/interfaces/ai/IProcessTelemetryContext\";\nimport { TelemetryUpdateReason } from \"../../../../src/enums/ai/TelemetryUpdateReason\";\nimport { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\nimport { IPlugin, ITelemetryPlugin } from \"../../../../src/interfaces/ai/ITelemetryPlugin\";\nimport { BaseTelemetryPlugin } from \"../../../../src/core/BaseTelemetryPlugin\";\nimport { IAppInsightsCore } from \"../../../../src/interfaces/ai/IAppInsightsCore\";\nimport { ITelemetryPluginChain } from \"../../../../src/interfaces/ai/ITelemetryPluginChain\";\nimport { ITelemetryUpdateState } from \"../../../../src/interfaces/ai/ITelemetryUpdateState\";\nimport { IChannelControls } from \"../../../../src/interfaces/ai/IChannelControls\";\n\n\nexport class TestPlugin implements IPlugin {\n    public identifier: string = \"TestPlugin\";\n    public version: string = \"1.0.31-Beta\";\n\n    public _config: IConfiguration;\n\n    public initialize(config: IConfiguration) {\n        this._config = config;\n        // do custom one time initialization\n    }\n}\n\nexport class TrackPlugin extends BaseTelemetryPlugin {\n    public identifier: string = \"TrackPlugin\";\n    public version: string = \"1.0.31-Beta\";\n    public priority = 2;\n    public isInitialized: any;\n    public _config: IConfiguration;\n    public index: number = 0;\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) {\n        super.initialize(config, core, extensions, pluginChain)\n        this._config = config;\n        core.track({ name: 'TestEvent1' });\n    }\n\n    public processTelemetry(evt: ITelemetryItem, itemCtx: IProcessTelemetryContext) {\n        let data = evt.data = (evt.data || {});\n        data.trackPlugin = this.index++;\n        itemCtx.processNext(evt);\n    }\n\n    protected _doUpdate = (updateCtx?: IProcessTelemetryUpdateContext, updateState?: ITelemetryUpdateState, asyncCallback?: () => void) => {\n        if (updateState.reason & TelemetryUpdateReason.ConfigurationChanged) {\n            this._config = updateState.cfg;\n        }\n    }\n}\n\nexport class OldTrackPlugin implements ITelemetryPlugin {\n    public identifier: string = \"OldTrackPlugin\";\n    public priority = 2;\n    public isInitialized: any;\n    public _config: IConfiguration;\n    public index: number = 0;\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) {\n        this._config = config;\n        core.track({ name: 'TestEvent1' });\n    }\n\n    public processTelemetry(evt: ITelemetryItem, itemCtx: IProcessTelemetryContext) {\n        let data = evt.data = (evt.data || {});\n        data.trackPlugin = this.index++;\n        itemCtx.processNext(evt);\n    }\n}\n\n/**\n * Test plugin doesn't implement the teardown \"unload\" function\n */\nexport class TestSamplingPlugin implements ITelemetryPlugin {\n    public processTelemetry: (env: ITelemetryItem) => void;\n    public initialize: (config: IConfiguration) => void;\n    public identifier: string = \"AzureSamplingPlugin\";\n    /** @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead */\n    public setNextPlugin?: (next: ITelemetryPlugin) => void;\n    public priority: number = 5;\n    public version = \"1.0.31-Beta\";\n    public nextPlugin: ITelemetryPlugin;\n    public isSampledOut: boolean = false;\n    public teardownCalled: boolean = false;\n    public _updatedConfig: IConfiguration;\n    private _validateItem = false;\n\n    constructor(validateItem: boolean = false) {\n        this.processTelemetry = this._processTelemetry.bind(this);\n        this.initialize = this._start.bind(this);\n        this.setNextPlugin = this._setNextPlugin.bind(this);\n        this._validateItem = validateItem;\n    }\n\n    public teardown() {\n        this.teardownCalled = true;\n    }\n\n    public update(updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState) {\n        if (updateState.reason & TelemetryUpdateReason.ConfigurationChanged) {\n            this._updatedConfig = updateState.cfg;\n        }\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n        if (!env) {\n            throw Error(\"Invalid telemetry object\");\n        }\n\n        if (this._validateItem) {\n            Assert.ok(env.baseData);\n            Assert.ok(env.baseType);\n            Assert.ok(env.data);\n            Assert.ok(env.ext);\n            Assert.ok(env.tags);\n        }\n\n        let data = env.data = (env.data || {});\n        data.sampled = true;\n\n        if (!this.isSampledOut) {\n            this.nextPlugin?.processTelemetry(env);\n        }\n    }\n\n    private _start(config: IConfiguration) {\n        if (!config) {\n            throw Error(\"required configuration missing\");\n        }\n\n        const pluginConfig = config.extensions ? config.extensions[this.identifier] : null;\n        this.isSampledOut = pluginConfig ? pluginConfig.isSampledOut : false;\n    }\n\n    private _setNextPlugin(next: ITelemetryPlugin): void {\n        this.nextPlugin = next;\n    }\n}\n\nexport class TestChannelPlugin implements IChannelControls {\n    public _nextPlugin: ITelemetryPlugin;\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n    public version: string = \"1.0.33-Beta\";\n\n    public processTelemetry;\n\n    public identifier = \"TestSender\";\n\n    public priority: number = 1001;\n    public events: ITelemetryItem[] = [];\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    onunloadFlush(async?: boolean) {\n        this.isUnloadInvoked = true;\n    }\n\n    setNextPlugin(next: ITelemetryPlugin) {\n        this._nextPlugin = next;\n    }\n\n    public initialize = (config: IConfiguration) => {\n    }\n\n    public _processTelemetry(env: ITelemetryItem) {\n        this.events.push(env);\n\n        // Just calling processTelemetry as this is the original design of the Plugins (as opposed to the newer processNext())\n        this._nextPlugin?.processTelemetry(env);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/ThrottleMgr.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore } from \"../../../../src/core/AppInsightsCore\";\nimport { IAppInsightsCore } from \"../../../../src/interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\nimport { IPlugin } from \"../../../../src/interfaces/ai/ITelemetryPlugin\";\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { ThrottleMgr } from \"../../../../src/diagnostics/ThrottleMgr\";\nimport { SinonSpy } from \"sinon\";\nimport { utlCanUseLocalStorage } from \"../../../../src/utils/StorageHelperFuncs\";\nimport { IThrottleInterval, IThrottleLimit, IThrottleMgrConfig, IThrottleResult } from \"../../../../src/interfaces/ai/IThrottleMgr\";\nimport { IConfig } from \"../../../../src/interfaces/ai/IConfig\";\n\nconst daysInMonth = [\n    31, // Jan\n    28, // Feb\n    31, // Mar\n    30, // Apr\n    31, // May\n    30, // Jun\n    31, // Jul\n    31, // Aug\n    30, // Sep\n    31, // Oct\n    30, // Nov\n    31 // Dec\n];\n\nconst isLeapYear = (year: number) => {\n    return (year % 4) === 0 && ((year % 100) !== 0 || (year % 400) === 0);\n}\n\nconst compareDates = (date1: Date, date: string | Date, expectedSame: boolean = true) => {\n    let isSame = false;\n    try {\n        if (date1 && date) {\n            let date2 = typeof date == \"string\"? new Date(date) : date;\n            isSame = date1.getUTCFullYear() === date2.getUTCFullYear() &&\n            date1.getUTCMonth() === date2.getUTCMonth() &&\n            date1.getUTCDate() === date2.getUTCDate();\n        }\n    } catch (e) {\n        Assert.ok(false,\"compare dates error\" + e);\n    }\n    Assert.equal(isSame, expectedSame, \"checking that the dates where as expected\");\n}\n\nconst getUtcDaysInMonth = (year: number, month: number) => {\n    return daysInMonth[month] + (month === 1 && isLeapYear(year) ? 1 : 0);\n}\n\nconst createUtcDate = (year: number, month: number, day: number) => {\n    return new Date(Date.UTC(year, month, day, 12, 0, 0, 0));\n}\n\nconst createUtcDateMonthsAgo = (monthsAgo: number) => {\n    let now = new Date();\n    let year = now.getUTCFullYear();\n    let month = now.getUTCMonth() - monthsAgo;\n    let day = now.getUTCDate();\n\n    while (month < 0) {\n        month += 12;\n        year -= 1;\n    }\n\n    day = Math.min(day, getUtcDaysInMonth(year, month));\n    return createUtcDate(year, month, day);\n}\n\nconst createUtcDateDaysAgo = (daysAgo: number) => {\n    let now = new Date();\n    return new Date(Date.UTC(\n        now.getUTCFullYear(),\n        now.getUTCMonth(),\n        now.getUTCDate() - daysAgo,\n        now.getUTCHours(),\n        now.getUTCMinutes(),\n        now.getUTCSeconds(),\n        now.getUTCMilliseconds()));\n}\n\nexport class ThrottleMgrTest extends AITestClass {\n    private _core: IAppInsightsCore<IConfiguration & IConfig>;\n    private _msgKey: number;\n    private _storageName: string;\n    private _msgId: _eInternalMessageId;\n    private loggingSpy: SinonSpy;\n    private _channel;\n\n    public testInitialize() {\n        this._core = new AppInsightsCore();\n        this._msgKey = _eInternalMessageId.InstrumentationKeyDeprecation;\n        this._storageName = \"appInsightsThrottle-\" + this._msgKey;\n        this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n        this._msgId =  _eInternalMessageId.InstrumentationKeyDeprecation;\n        this._channel = new ChannelPlugin();\n\n        if (utlCanUseLocalStorage()) {\n            window.localStorage.clear();\n        }\n    }\n\n    public testCleanup() {\n        if (utlCanUseLocalStorage()) {\n            window.localStorage.clear();\n        }\n   \n        this.loggingSpy = null;\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Default config should be set from root\",\n            test: () => {\n                let expectedconfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber: 1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: undefined,\n                        daysOfMonth: [28]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n                let coreCfg = {\n                    instrumentationKey: \"test\"\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedconfig, actualConfig[_eInternalMessageId.DefaultThrottleMsgKey], \"should get expected default config\");\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Default config should be set from root with key\",\n            test: () => {\n                let expectedconfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber: 1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: undefined,\n                        daysOfMonth: [28]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: {}}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedconfig, actualConfig[this._msgId], \"should get expected default config\");\n                Assert.deepEqual(expectedconfig, actualConfig[_eInternalMessageId.DefaultThrottleMsgKey], \"should get expected default config\");\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Mutiple msg keys - Default config should be set from root\",\n            test: () => {\n                let expectedconfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber: 1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: undefined,\n                        daysOfMonth: [28]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: expectedconfig}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedconfig, actualConfig[this._msgId], \"should get expected default config\");\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n\n                isTriggered = throttleMgr.isTriggered(109);\n                Assert.equal(isTriggered, false, \"should not be triggered msg key 109\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: None set msg keys - Default config should be used\",\n            test: () => {\n                let date = new Date();\n                let expectedconfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber: 1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: undefined,\n                        daysOfMonth: [date.getUTCDate()]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[_eInternalMessageId.DefaultThrottleMsgKey]: expectedconfig}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedconfig, actualConfig[_eInternalMessageId.DefaultThrottleMsgKey], \"should get expected default config\");\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, true, \"should be able to throttle\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Config should be updated dynamically\",\n            useFakeTimers: true,\n            test: () => {\n                let date = new Date();\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 50,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: undefined,\n                        daysOfMonth: [date.getUTCDate()]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(config, actualConfig[this._msgId], \"should get expected config\");\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.deepEqual(canThrottle, true, \"should be able to throttle\");\n                \n                config.disabled = true;\n                config.limit =  {\n                    samplingRate: 80,\n                    maxSendNumber: 10\n                } as IThrottleLimit,\n                config.interval = {\n                    monthInterval: 3,\n                    dayInterval: undefined,\n                    daysOfMonth: [date.getUTCDate() + 1]\n                } as IThrottleInterval;\n                this._core.config.throttleMgrCfg = this._core.config.throttleMgrCfg || {};\n                this._core.config.throttleMgrCfg[this._msgId] = config;\n                this.clock.tick(1);\n                actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(config, actualConfig[this._msgId], \"config should be updated dynamically\");\n                canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.deepEqual(canThrottle, false, \"should not be able to throttle\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Config should be updated dynamically with different keys\",\n            useFakeTimers: true,\n            test: () => {\n                let date = new Date();\n                let msgId = 109;\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 50,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: undefined,\n                        daysOfMonth: [date.getUTCDate()]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let config1 = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 60,\n                        maxSendNumber: 101\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: undefined,\n                        daysOfMonth: [date.getUTCDate()]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config, [msgId]: config1}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.ok(actualConfig[_eInternalMessageId.DefaultThrottleMsgKey]);\n                Assert.deepEqual(config, actualConfig[this._msgId], \"should get expected config\");\n                Assert.deepEqual(config1, actualConfig[msgId], \"should get expected config1\");\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.deepEqual(canThrottle, true, \"should be able to throttle\");\n                isTriggered = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered test1\");\n                canThrottle = throttleMgr.canThrottle(msgId);\n                Assert.deepEqual(canThrottle, true, \"should be able to throttle test1\");\n                \n                config.disabled = true;\n                config.limit =  {\n                    samplingRate: 80,\n                    maxSendNumber: 10\n                } as IThrottleLimit,\n                config.interval = {\n                    monthInterval: 3,\n                    dayInterval: undefined,\n                    daysOfMonth: [date.getUTCDate() + 1]\n                } as IThrottleInterval;\n                this._core.config.throttleMgrCfg = this._core.config.throttleMgrCfg || {};\n                this._core.config.throttleMgrCfg[this._msgId] = config;\n                this.clock.tick(1);\n                actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(config, actualConfig[this._msgId], \"config should be updated dynamically\");\n                Assert.deepEqual(config1, actualConfig[msgId], \"config1 should not be updated dynamically\");\n                canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.deepEqual(canThrottle, false, \"should not be able to throttle\");\n                canThrottle = throttleMgr.canThrottle(msgId);\n                Assert.deepEqual(canThrottle, true, \"should be able to throttle config1\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"ThrottleMgrTest: flush\",\n            test: () => {\n                let date = new Date();\n                let expectedconfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber: 10\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: undefined,\n                        daysOfMonth: [date.getUTCDate()]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: expectedconfig}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedconfig, actualConfig[this._msgId], \"should get expected default config\");\n                let isTriggered = throttleMgr.isTriggered(this._msgKey);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n                let canThrottle = throttleMgr.canThrottle(this._msgKey);\n                Assert.equal(canThrottle, true, \"should be able to be throttle\");\n\n                let isReady = throttleMgr.isReady();\n                Assert.equal(isReady, false, \"isReady state should be false\");\n                let result = throttleMgr.sendMessage(this._msgId, \"test\");\n                Assert.equal(result, null, \"should not be throttled\");\n                // note: _getDbgPlgTargets returns array\n                let target = throttleMgr[\"_getDbgPlgTargets\"]();\n                Assert.ok(target && target.length === 1, \"target should contain queue\");\n                let queue = target[0][this._msgKey];\n                Assert.deepEqual(queue.length,1, \"should have 1 item\");\n                Assert.equal(queue[0].msgID, this._msgId, \"should be correct msgId\");\n\n                throttleMgr.onReadyState(true);\n                target = throttleMgr[\"_getDbgPlgTargets\"]();\n                queue = target[0][this._msgKey];\n                Assert.equal(queue.length, 0, \"queue should be empty\");\n                let storage = window.localStorage[this._storageName];\n                let dateNum = date.getUTCDate();\n                let prefix = dateNum < 10? \"0\":\"\";\n                Assert.ok(storage.indexOf(`${date.getUTCMonth() + 1}-${prefix + dateNum}`) > -1, \"local storage should have correct date\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Mutiple msg keys - flush\",\n            test: () => {\n                let msgId = 109;\n                let storageName =   this._storageName = \"appInsightsThrottle-\" + msgId;\n                let date = new Date();\n                let expectedconfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber: 10\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: undefined,\n                        daysOfMonth: [date.getUTCDate()]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: expectedconfig, [msgId]: expectedconfig}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedconfig, actualConfig[this._msgId], \"should get expected default config\");\n                Assert.deepEqual(expectedconfig, actualConfig[msgId], \"should get expected default config msgId\");\n                let isTriggered = throttleMgr.isTriggered(this._msgKey);\n                Assert.equal(isTriggered, false, \"should not be triggered\");\n                let canThrottle = throttleMgr.canThrottle(this._msgKey);\n                Assert.equal(canThrottle, true, \"should be able to be throttle\");\n                isTriggered = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggered, false, \"should not be triggered test1\");\n                canThrottle = throttleMgr.canThrottle(msgId);\n                Assert.equal(canThrottle, true, \"should be able to be throttle test1\");\n\n                let isReady = throttleMgr.isReady();\n                Assert.equal(isReady, false, \"isReady state should be false\");\n                let result = throttleMgr.sendMessage(this._msgId, \"test\");\n                Assert.equal(result, null, \"should not be throttled\");\n                result = throttleMgr.sendMessage(msgId, \"test1\");\n                Assert.equal(result, null, \"should not be throttled test1\");\n                // note: _getDbgPlgTargets returns array\n                let target = throttleMgr[\"_getDbgPlgTargets\"]();\n                Assert.ok(target && target.length === 1, \"target should contain queue\");\n                let queue = target[0][this._msgKey];\n                Assert.deepEqual(queue.length,1, \"should have 1 item\");\n                Assert.equal(queue[0].msgID, this._msgId, \"should be correct msgId\");\n                queue = target[0][msgId];\n                Assert.deepEqual(queue.length,1, \"should have 1 item test1\");\n                Assert.equal(queue[0].msgID, msgId, \"should be correct msgId test1\");\n\n                throttleMgr.onReadyState(true);\n                target = throttleMgr[\"_getDbgPlgTargets\"]();\n                queue = target[0][this._msgKey];\n                Assert.equal(queue.length, 0, \"queue should be empty\");\n                let storage = window.localStorage[this._storageName];\n                let dateNum = date.getUTCDate();\n                let prefix = dateNum < 10? \"0\":\"\";\n                Assert.ok(storage.indexOf(`${date.getUTCMonth() + 1}-${prefix + dateNum}`) > -1, \"local storage should have correct date\");\n\n                target = throttleMgr[\"_getDbgPlgTargets\"]();\n                queue = target[0][msgId];\n                Assert.equal(queue.length, 0, \"queue should be empty test1\");\n                storage = window.localStorage[storageName];\n                dateNum = date.getUTCDate();\n                prefix = dateNum < 10? \"0\":\"\";\n                Assert.ok(storage.indexOf(`${date.getUTCMonth() + 1}-${prefix + dateNum}`) > -1, \"local storage should have correct date test1\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Throttle Manager can get expected config\",\n            test: () => {\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 50,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 2,\n                        dayInterval: 10,\n                        daysOfMonth: undefined\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(config, actualConfig[this._msgId]);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgKey);\n                Assert.equal(isTriggered, false);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Throttle Manager can get default config\",\n            test: () => {\n\n                let expectedConfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: undefined,\n                        daysOfMonth: [28]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: {}}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedConfig, actualConfig[this._msgId]);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: monthInterval should be set to 3 when dayInterval and monthInterval are both undefined\",\n            test: () => {\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        daysOfMonth: [25, 26, 28]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let expectedConfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: undefined,\n                        daysOfMonth: [25, 26, 28]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedConfig, actualConfig[this._msgId]);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: monthInterval and daysOfMonth should be changed to default when dayInterval is defined\",\n            test: () => {\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        dayInterval: 100\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let expectedConfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: undefined,\n                        dayInterval: 100,\n                        daysOfMonth: undefined\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedConfig, actualConfig[this._msgId]);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: message can be sent from the first day when dayInterval is set to one\",\n            test: () => {\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let expectedConfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: undefined,\n                        dayInterval: 1,\n                        daysOfMonth: undefined\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedConfig, actualConfig[this._msgId]);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n\n                let canSend = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canSend, true, \"can send message from the day\")\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Throttle Manager should trigger when current date is in daysOfMonth\",\n            test: () => {\n                let date = new Date();\n                let day = date.getUTCDate();\n                let daysOfMonth;\n                if (day == 1) {\n                    daysOfMonth = [31,day];\n                } else {\n                    daysOfMonth = [day-1, day];\n                }\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: 28,\n                        daysOfMonth: daysOfMonth\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(config, actualConfig[this._msgId]);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, true, \"should throttle\");\n                \n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Throttle Manager should trigger when interval config is undefined and current date 28\",\n            test: () => {\n                let date = new Date();\n                let day = date.getUTCDate();\n\n                let expectedConfig = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 100,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: undefined,\n                        daysOfMonth: [28]\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: expectedConfig}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let actualConfig = throttleMgr.getConfig();\n                Assert.deepEqual(expectedConfig, actualConfig[this._msgId]);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n\n                let shouldTrigger = false;\n                if (day === 28) {\n                    shouldTrigger = true;\n                }\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, shouldTrigger, \"should only throttle on 28th\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should not trigger throttle when disabled is true\",\n            test: () => {\n                let config = {\n                    disabled: true\n                } as IThrottleMgrConfig;\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, false);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should not trigger throttle when month interval requirements are not meet\",\n            test: () => {\n                let date = createUtcDateMonthsAgo(1);\n                let storageObj = {\n                    date: date,\n                    count: 0\n                }\n                window.localStorage[this._storageName] = JSON.stringify(storageObj);\n                \n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, false);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should not trigger throttle when year and month interval requirements are not meet\",\n            test: () => {\n                let date = createUtcDateMonthsAgo(13);\n                let storageObj = {\n                    date: date,\n                    count: 0\n                }\n                window.localStorage[this._storageName] = JSON.stringify(storageObj);\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 3,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, false);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should not trigger throttle when day interval requirements are not meet\",\n            test: () => {\n                let date = createUtcDateDaysAgo(1);\n                let storageObj = {\n                    date: date,\n                    count: 0\n                }\n                window.localStorage[this._storageName] = JSON.stringify(storageObj);\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 31\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, false);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should trigger throttle at starting month\",\n            test: () => {\n                let date = new Date();\n                let storageObj = {\n                    date: date,\n                    count: 0\n                }\n                window.localStorage[this._storageName] = JSON.stringify(storageObj);\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, true);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should trigger throttle when month and day intervals are meet\",\n            test: () => {\n                let date = new Date();\n                let year = date.getUTCFullYear() - 2;\n                date.setUTCFullYear(year);\n                let storageObj = {\n                    date: date,\n                    count: 0\n                }\n                window.localStorage[this._storageName] = JSON.stringify(storageObj);\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 4,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, true);\n\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggered, false);\n            }\n\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should not trigger throttle when _isTrigger state is true (in valid send message date)\",\n            test: () => {\n                let storageObj = {\n                    date: new Date(),\n                    count: 0,\n                    preTriggerDate: new Date()\n                }\n                window.localStorage[this._storageName] = JSON.stringify(storageObj);\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber: 100\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, true);\n                let isTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.ok(isTriggered);\n                let result = throttleMgr.sendMessage(this._msgId, \"test\");\n                let count = this.loggingSpy.callCount;\n                Assert.equal(count,0);\n                Assert.deepEqual(result, null);\n                let postIsTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.ok(postIsTriggered);\n\n            }\n\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should update local storage (in valid send message date)\",\n            test: () => {\n                let date = new Date();\n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n               \n                let preTriggerDate = date;\n                preTriggerDate.setUTCFullYear(date.getUTCFullYear() - 1);\n                let preStorageObj = {\n                    date: date,\n                    count: 0,\n                    preTriggerDate: preTriggerDate\n                }\n                \n                let preStorageVal = JSON.stringify(preStorageObj);\n                window.localStorage[this._storageName] = preStorageVal;\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber: 1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottle, true);\n                let isPretriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isPretriggered, false);\n\n                throttleMgr.onReadyState(true);\n                let sendDate = new Date();\n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let expectedRetryRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult;\n                Assert.deepEqual(result, expectedRetryRlt);\n                let isPostTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isPostTriggered, true);\n\n                let afterTriggered = window.localStorage[this._storageName];\n                let afterTriggeredObj = JSON.parse(afterTriggered);\n                compareDates(date, afterTriggeredObj.date)\n                Assert.equal(0, afterTriggeredObj.count);\n                compareDates(sendDate, afterTriggeredObj.preTriggerDate);\n            }\n\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should not trigger sendmessage when isready state is not set and should flush message after isReady state is set\",\n            test: () => {\n                \n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n                let date = new Date();\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n               \n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.ok(canThrottle);\n                let isTriggeredPre = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPre, false);\n                let initialVal = window.localStorage[this._storageName];\n                let initObj = JSON.parse(initialVal);\n                compareDates(date, initObj.date);\n                Assert.equal(0, initObj.count);\n                Assert.equal(undefined, initObj.preTriggerDate);\n                \n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let count = this.loggingSpy.callCount;\n                Assert.equal(count,0);\n                Assert.deepEqual(result, null);\n                let isTriggeredPost = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPost, false);\n                let postVal = window.localStorage[this._storageName];\n                let postObj = JSON.parse(postVal);\n                compareDates(date, postObj.date);\n                Assert.equal(0, postObj.count);\n                Assert.equal(undefined, postObj.preTriggerDate);\n\n                let isFlushed = throttleMgr.onReadyState(true);\n                Assert.ok(isFlushed);\n                let isTriggeredAfterReadySate = throttleMgr.isTriggered(this._msgId);\n                Assert.ok(isTriggeredAfterReadySate);\n                let postOnReadyVal = window.localStorage[this._storageName];\n                let postOnReadyObj = JSON.parse(postOnReadyVal);\n                compareDates(date, postOnReadyObj.date);\n                Assert.equal(0, postOnReadyObj.count);\n                compareDates(date, postOnReadyObj.preTriggerDate);\n\n                let onReadyResult = throttleMgr.sendMessage(this._msgId, msg);\n                let onReadyCount = this.loggingSpy.callCount;\n                let expectedRlt = {\n                    isThrottled: false,\n                    throttleNum: 0\n                } as IThrottleResult\n                Assert.equal(onReadyCount,1, \"test1\");\n                Assert.deepEqual(onReadyResult, expectedRlt);\n                let onReadyIsTriggered = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(onReadyIsTriggered, true);\n                let afterResendVal = window.localStorage[this._storageName];\n                let afterResendObj = JSON.parse(afterResendVal);\n                compareDates(date, afterResendObj.date);\n                Assert.equal(1, afterResendObj.count);\n                compareDates(date, afterResendObj.preTriggerDate);\n            }\n        });\n\n\n        this.testCase({\n            name: \"ThrottleMgrTest: throw messages with correct number\",\n            test: () => {\n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n                let date = new Date();\n                let testStorageObj = {\n                    date: date,\n                    count: 5\n                }\n                let testStorageVal = JSON.stringify(testStorageObj);\n                window.localStorage[this._storageName] = testStorageVal;\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                \n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.ok(canThrottle);\n\n                let isTriggeredPre = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPre, false);\n\n                throttleMgr.onReadyState(true);\n\n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let count = this.loggingSpy.callCount\n                Assert.equal(count,1);\n                let expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult\n                Assert.deepEqual(result, expectedRlt);\n            \n                let val = window.localStorage[this._storageName];\n                let obj = JSON.parse(val);\n                compareDates(date, obj.date);\n                Assert.equal(0, obj.count);\n                compareDates(date, obj.preTriggerDate);\n\n                let isTriggeredPost = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPost, true);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Mutiple keys - throw messages with correct number\",\n            test: () => {\n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n                let msgId = 109;\n                let storageName = \"appInsightsThrottle-\" + msgId;\n                let date = new Date();\n                let testStorageObj = {\n                    date: date,\n                    count: 5\n                }\n                let testStorageVal = JSON.stringify(testStorageObj);\n                window.localStorage[this._storageName] = testStorageVal;\n                window.localStorage[storageName] = testStorageVal;\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                \n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config, [msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.ok(canThrottle, \"can throttle\");\n                canThrottle = throttleMgr.canThrottle(msgId);\n                Assert.ok(canThrottle, \"can throttle test1\");\n\n                let isTriggeredPre = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPre, false, \"preTrigger\");\n                isTriggeredPre = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPre, false, \"preTrigger test1\");\n\n                throttleMgr.onReadyState(true);\n\n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let count = this.loggingSpy.callCount\n                Assert.equal(count,1, \"sendMsg count\");\n                let expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult\n                Assert.deepEqual(result, expectedRlt, \"expected result\");\n                result = throttleMgr.sendMessage(msgId, msg);\n                count = this.loggingSpy.callCount\n                Assert.equal(count,2, \"sendMsg count test1\");\n                expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult\n                Assert.deepEqual(result, expectedRlt, \"expected result test1\");\n            \n                let val = window.localStorage[this._storageName];\n                let obj = JSON.parse(val);\n                compareDates(date, obj.date);\n                Assert.equal(0, obj.count, \"local storage count\");\n                compareDates(date, obj.preTriggerDate);\n                val = window.localStorage[storageName];\n                obj = JSON.parse(val);\n                compareDates(date, obj.date);\n                Assert.equal(0, obj.count, \"local storage count test1\");\n                compareDates(date, obj.preTriggerDate);\n\n                let isTriggeredPost = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post\");\n                isTriggeredPost = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post test1\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: None set mutiple keys - throw messages with correct number\",\n            test: () => {\n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n                let msgId = 109;\n                let storageName = \"appInsightsThrottle-\" + msgId;\n                let date = new Date();\n                let testStorageObj = {\n                    date: date,\n                    count: 5\n                }\n                let testStorageVal = JSON.stringify(testStorageObj);\n                window.localStorage[this._storageName] = testStorageVal;\n                window.localStorage[storageName] = testStorageVal;\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                \n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[_eInternalMessageId.DefaultThrottleMsgKey]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n\n                this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.ok(canThrottle, \"can throttle\");\n                canThrottle = throttleMgr.canThrottle(msgId);\n                Assert.ok(canThrottle, \"can throttle test1\");\n\n                let isTriggeredPre = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPre, false, \"preTrigger\");\n                isTriggeredPre = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPre, false, \"preTrigger test1\");\n\n                throttleMgr.onReadyState(true);\n\n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let count = this.loggingSpy.callCount\n                Assert.equal(count,1, \"sendMsg count\");\n                let expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult\n                Assert.deepEqual(result, expectedRlt, \"expected result\");\n                result = throttleMgr.sendMessage(msgId, msg);\n                count = this.loggingSpy.callCount\n                Assert.equal(count,2, \"sendMsg count test1\");\n                expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult\n                Assert.deepEqual(result, expectedRlt, \"expected result test1\");\n            \n                let val = window.localStorage[this._storageName];\n                let obj = JSON.parse(val);\n                compareDates(date, obj.date);\n                Assert.equal(0, obj.count, \"local storage count\");\n                compareDates(date, obj.preTriggerDate);\n                val = window.localStorage[storageName];\n                obj = JSON.parse(val);\n                compareDates(date, obj.date);\n                Assert.equal(0, obj.count, \"local storage count test1\");\n                compareDates(date, obj.preTriggerDate);\n\n                let isTriggeredPost = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post\");\n                isTriggeredPost = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post test1\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: should throw messages 1 time within a day\",\n            test: () => {\n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.ok(canThrottle);\n\n                let isTriggeredPre = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPre, false);\n\n                throttleMgr.onReadyState(true);\n\n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let count = this.loggingSpy.callCount\n                Assert.equal(count,1);\n              \n                let expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult\n                Assert.deepEqual(result, expectedRlt);\n\n                let isTriggeredPost = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPost, true);\n                let canThrottlePost = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottlePost, true);\n\n                let retryRlt = throttleMgr.sendMessage(this._msgId, msg);\n                let retryCount = this.loggingSpy.callCount\n                Assert.equal(retryCount,1);\n                let expectedRetryRlt = {\n                    isThrottled: false,\n                    throttleNum: 0\n                } as IThrottleResult\n                Assert.deepEqual(retryRlt, expectedRetryRlt);\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: Mutiple msg keys - should throw messages 1 time within a day\",\n            test: () => {\n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n                let msgId = 109;\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[this._msgId]: config, [msgId]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.ok(canThrottle, \"can throttle\");\n                canThrottle = throttleMgr.canThrottle(msgId);\n                Assert.ok(canThrottle, \"can throttle test1\");\n\n                let isTriggeredPre = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPre, false, \"is trigger\");\n                isTriggeredPre = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPre, false, \"is trigger test1\");\n\n                throttleMgr.onReadyState(true);\n\n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let count = this.loggingSpy.callCount\n                Assert.equal(count,1, \"sendMsg count\");\n                let expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult;\n                Assert.deepEqual(result, expectedRlt, \"expected result\");\n                result = throttleMgr.sendMessage(msgId, msg);\n                count = this.loggingSpy.callCount\n                Assert.equal(count,2, \"sendMsg count test1\");\n                Assert.deepEqual(result, expectedRlt, \"expected result test1\");\n\n                let isTriggeredPost = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post\");\n                let canThrottlePost = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottlePost, true, \"can throttle post\");\n                isTriggeredPost = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post test1\");\n                canThrottlePost = throttleMgr.canThrottle(msgId);\n                Assert.equal(canThrottlePost, true, \"can throttle post test1\");\n\n                let retryRlt = throttleMgr.sendMessage(this._msgId, msg);\n                let retryCount = this.loggingSpy.callCount\n                Assert.equal(retryCount,2, \"retrt count\");\n                let expectedRetryRlt = {\n                    isThrottled: false,\n                    throttleNum: 0\n                } as IThrottleResult\n                Assert.deepEqual(retryRlt, expectedRetryRlt, \"retry result\");\n\n                retryRlt = throttleMgr.sendMessage(msgId, msg);\n                retryCount = this.loggingSpy.callCount\n                Assert.equal(retryCount,2, \"retrt count test1\");\n                expectedRetryRlt = {\n                    isThrottled: false,\n                    throttleNum: 0\n                } as IThrottleResult\n                Assert.deepEqual(retryRlt, expectedRetryRlt, \"retry result test1\");\n            }\n        });\n\n        this.testCase({\n            name: \"ThrottleMgrTest: None set mutiple msg keys - should throw messages 1 time within a day\",\n            test: () => {\n                let msg = \"Instrumentation key support will end soon, see aka.ms/IkeyMigrate\";\n                let msgId = 109;\n\n                let config = {\n                    disabled: false,\n                    limit: {\n                        samplingRate: 1000000,\n                        maxSendNumber:1\n                    } as IThrottleLimit,\n                    interval: {\n                        monthInterval: 1,\n                        dayInterval: 1\n                    } as IThrottleInterval\n                } as IThrottleMgrConfig;\n\n                let coreCfg = {\n                    instrumentationKey: \"test\",\n                    throttleMgrCfg: {[_eInternalMessageId.DefaultThrottleMsgKey]: config}\n                };\n                this._core.initialize(coreCfg, [this._channel]);\n\n                let throttleMgr = new ThrottleMgr(this._core);\n                this.loggingSpy = this.sandbox.stub(this._core.logger, \"throwInternal\");\n\n\n                let canThrottle = throttleMgr.canThrottle(this._msgId);\n                Assert.ok(canThrottle, \"can throttle\");\n                canThrottle = throttleMgr.canThrottle(msgId);\n                Assert.ok(canThrottle, \"can throttle test1\");\n\n                let isTriggeredPre = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPre, false, \"is trigger\");\n                isTriggeredPre = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPre, false, \"is trigger test1\");\n\n                throttleMgr.onReadyState(true);\n\n                let result = throttleMgr.sendMessage(this._msgId, msg);\n                let count = this.loggingSpy.callCount\n                Assert.equal(count,1, \"sendMsg count\");\n                let expectedRlt = {\n                    isThrottled: true,\n                    throttleNum: 1\n                } as IThrottleResult;\n                Assert.deepEqual(result, expectedRlt, \"expected result\");\n                result = throttleMgr.sendMessage(msgId, msg);\n                count = this.loggingSpy.callCount\n                Assert.equal(count,2, \"sendMsg count test1\");\n                Assert.deepEqual(result, expectedRlt, \"expected result test1\");\n\n                let isTriggeredPost = throttleMgr.isTriggered(this._msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post\");\n                let canThrottlePost = throttleMgr.canThrottle(this._msgId);\n                Assert.equal(canThrottlePost, true, \"can throttle post\");\n                isTriggeredPost = throttleMgr.isTriggered(msgId);\n                Assert.equal(isTriggeredPost, true, \"trigger post test1\");\n                canThrottlePost = throttleMgr.canThrottle(msgId);\n                Assert.equal(canThrottlePost, true, \"can throttle post test1\");\n\n                let retryRlt = throttleMgr.sendMessage(this._msgId, msg);\n                let retryCount = this.loggingSpy.callCount\n                Assert.equal(retryCount,2, \"retrt count\");\n                let expectedRetryRlt = {\n                    isThrottled: false,\n                    throttleNum: 0\n                } as IThrottleResult\n                Assert.deepEqual(retryRlt, expectedRetryRlt, \"retry result\");\n\n                retryRlt = throttleMgr.sendMessage(msgId, msg);\n                retryCount = this.loggingSpy.callCount\n                Assert.equal(retryCount,2, \"retrt count test1\");\n                expectedRetryRlt = {\n                    isThrottled: false,\n                    throttleNum: 0\n                } as IThrottleResult\n                Assert.deepEqual(retryRlt, expectedRetryRlt, \"retry result test1\");\n            }\n        });\n    }\n}\n\n\nclass ChannelPlugin implements IPlugin {\n\n    public isFlushInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n\n    public identifier = \"Sender\";\n\n    public priority: number = 1001;\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    public processTelemetry(env: any) {}\n\n    setNextPlugin(next: any) {\n        // no next setup\n    }\n\n    public initialize = (config: IConfiguration, core: IAppInsightsCore, plugin: IPlugin[]) => {\n    }\n\n    private _processTelemetry(env: any) {\n\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/UpdateConfig.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\nimport { AppInsightsCore } from \"../../../../src/core/AppInsightsCore\";\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\nimport { OldTrackPlugin, TestChannelPlugin, TestPlugin, TestSamplingPlugin, TrackPlugin } from \"./TestPlugins\";\n\nconst AIInternalMessagePrefix = \"AITR_\";\nconst MaxInt32 = 0xFFFFFFFF;\n\nexport class UpdateConfigTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"UpdateConfig: Initialization with plugins and disable shared trackPlugin\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n                const iKey2 = \"00000000-1111-7777-8888-999999999999\";\n                const testEndpoint1 = \"https://localhost:9001/TestEndpoint\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n\n                const config: IConfiguration = {\n                    instrumentationKey: iKey1\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                appInsightsCore.updateCfg({\n                    endpointUrl: \"https://localhost:9001/TestEndpoint\",\n                    disableCookiesUsage: true,\n                    extensions: []          // Try and replace the extensions\n                }, true);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(testEndpoint1, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(false, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be disabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(testEndpoint1, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(appInsightsCore.config, testSamplingPlugin._updatedConfig, \"Config has been updated to the same as the core\");\n                Assert.equal(iKey1, testSamplingPlugin._updatedConfig.instrumentationKey, \"Test sampling Instrumentation Key\");\n                Assert.equal(testEndpoint1, testSamplingPlugin._updatedConfig.endpointUrl, \"Test sampling Endpoint 1\");\n                Assert.equal(4, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                appInsightsCore.updateCfg({\n                    instrumentationKey: iKey2,\n                    loggingLevelConsole: 2\n                }, true);\n\n                Assert.equal(iKey2, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(testEndpoint1, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(false, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be disabled\");\n                Assert.equal(2, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n\n                Assert.equal(iKey2, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(testEndpoint1, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(appInsightsCore.config, testSamplingPlugin._updatedConfig, \"Config has been updated to the same as the core\");\n                Assert.equal(iKey2, testSamplingPlugin._updatedConfig.instrumentationKey, \"Test sampling Instrumentation Key\");\n                Assert.equal(testEndpoint1, testSamplingPlugin._updatedConfig.endpointUrl, \"Test sampling Endpoint 1\");\n\n                appInsightsCore.updateCfg({\n                    instrumentationKey: iKey1\n                }, false);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n\n                // Note the cookie manager \"state\" does not change from the previous state if no configuration is present\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(appInsightsCore.config, testSamplingPlugin._updatedConfig, \"Config has been updated to the same as the core\");\n                Assert.equal(iKey1, testSamplingPlugin._updatedConfig.instrumentationKey, \"Test sampling Instrumentation Key\");\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig.endpointUrl, \"Test sampling Endpoint 1\");\n            }\n        });\n\n        this.testCase({\n            name: \"UpdateConfig: Initialization with plugins and disable shared old trackPlugin\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n                const iKey2 = \"00000000-1111-7777-8888-999999999999\";\n                const testEndpoint1 = \"https://localhost:9001/TestEndpoint\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new OldTrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n\n                const config: IConfiguration = {\n                    instrumentationKey: iKey1\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                appInsightsCore.updateCfg({\n                    endpointUrl: \"https://localhost:9001/TestEndpoint\",\n                    disableCookiesUsage: true\n                }, true);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(testEndpoint1, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(false, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be disabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(testEndpoint1, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(appInsightsCore.config, testSamplingPlugin._updatedConfig, \"Config has been updated to the same as the core\");\n                Assert.equal(iKey1, testSamplingPlugin._updatedConfig.instrumentationKey, \"Test sampling Instrumentation Key\");\n                Assert.equal(testEndpoint1, testSamplingPlugin._updatedConfig.endpointUrl, \"Test sampling Endpoint 1\");\n\n                appInsightsCore.updateCfg({\n                    instrumentationKey: iKey2,\n                    loggingLevelConsole: 2\n                }, true);\n\n                Assert.equal(iKey2, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(testEndpoint1, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(false, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be disabled\");\n                Assert.equal(2, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n\n                Assert.equal(iKey2, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(testEndpoint1, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(appInsightsCore.config, testSamplingPlugin._updatedConfig, \"Config has been updated to the same as the core\");\n                Assert.equal(iKey2, testSamplingPlugin._updatedConfig.instrumentationKey, \"Test sampling Instrumentation Key\");\n                Assert.equal(testEndpoint1, testSamplingPlugin._updatedConfig.endpointUrl, \"Test sampling Endpoint 1\");\n\n                appInsightsCore.updateCfg({\n                    instrumentationKey: iKey1\n                }, false);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n\n                // Note the cookie manager \"state\" does not change from the previous state if no configuration is present\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(appInsightsCore.config, testSamplingPlugin._updatedConfig, \"Config has been updated to the same as the core\");\n                Assert.equal(iKey1, testSamplingPlugin._updatedConfig.instrumentationKey, \"Test sampling Instrumentation Key\");\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig.endpointUrl, \"Test sampling Endpoint 1\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"UpdateConfig: Use updateCfg to update and object replaces the previous config\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n                const iKey2 = \"00000000-1111-7777-8888-999999999999\";\n                const testEndpoint1 = \"https://localhost:9001/TestEndpoint\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new OldTrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n\n                function _setCookie() {\n\n                }\n\n                const config: IConfiguration = {\n                    instrumentationKey: iKey1,\n                    cookieCfg: {\n                        setCookie: _setCookie\n                    }\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n                Assert.equal(_setCookie, appInsightsCore.config.cookieCfg?.setCookie, \"The Set cookie function should be as specified\");\n                Assert.equal(undefined, appInsightsCore.config.cookieCfg?.getCookie, \"No Get cookie function was specified and the internal fallback is not exposed\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                appInsightsCore.updateCfg({\n                    endpointUrl: \"https://localhost:9001/TestEndpoint\",\n                    cookieCfg: {\n                        enabled: true\n                    }\n                }, true);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(testEndpoint1, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n                Assert.equal(0, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n                Assert.equal(_setCookie, appInsightsCore.config.cookieCfg?.setCookie, \"The previous setCookie function should not have been replaced\");\n                Assert.equal(undefined, appInsightsCore.config.cookieCfg?.getCookie, \"No Get cookie function was specified and the internal fallback is not exposed\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(testEndpoint1, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(appInsightsCore.config, testSamplingPlugin._updatedConfig, \"Config has been updated to the same as the core\");\n                Assert.equal(iKey1, testSamplingPlugin._updatedConfig.instrumentationKey, \"Test sampling Instrumentation Key\");\n                Assert.equal(testEndpoint1, testSamplingPlugin._updatedConfig.endpointUrl, \"Test sampling Endpoint 1\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ai/Util.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { setBypassLazyCache, strStartsWith } from \"@nevware21/ts-utils\";\nimport { ICorrelationConfig } from \"../../../../src/interfaces/ai/ICorrelationConfig\";\nimport { getIEVersion } from \"../../../../src/utils/EnvUtils\";\nimport { uaDisallowsSameSiteNone } from \"../../../../src/core/CookieMgr\";\nimport { correlationIdCanIncludeCorrelationHeader } from \"../../../../src/utils/Util\";\nimport { createDomEvent } from \"../../../../src/utils/DomHelperFuncs\";\nimport { urlParseFullHost, urlParseHost, urlParseUrl } from \"../../../../src/utils/UrlHelperFuncs\";\n\nexport class UtilTests extends AITestClass {\n    private testRegexLists = (config: ICorrelationConfig, exp: boolean, host: string) => {\n        let requestUrl = host;\n        if (!strStartsWith(host, \"http\")) {\n            requestUrl = \"https://\" + host;\n        }\n        Assert.equal(exp, correlationIdCanIncludeCorrelationHeader(config, requestUrl, \"not used\"), host);\n    };\n\n    public testInitialize() {\n        super.testInitialize();\n        setBypassLazyCache(true);\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: 'createDomEvent: creates new event if constructor is undefined',\n            test: () => {\n                const origEvent = (window as any).Event;\n                (window as any).Event = {};\n                const event = createDomEvent('something');\n                Assert.equal('something', event.type);\n                (window as any).Event = origEvent;\n            }\n        });\n\n        this.testCase({\n            name: \"UrlHelper: parseUrl should contain host field even if document.createElement is not defined\",\n            test: () => {\n                const origCreateElement = document.createElement;\n                document.createElement = null;\n\n                let passed;\n                let match;\n                try {\n                    const host = urlParseUrl(\"https://portal.azure.com/some/endpoint\").host.toLowerCase();\n                    passed = true;\n                    match = host === \"portal.azure.com\";\n                } catch (e) {\n                    passed = false;\n                }\n\n                // Need to reset createElement before doing any assertions, else qunit crashes\n                document.createElement = origCreateElement;\n                Assert.ok(passed);\n                Assert.ok(match, \"host should be portal.azure.com\");\n            }\n        });\n\n        this.testCase({\n            name: \"UrlHelper: parseHost should return correct host name\",\n            test: () => {\n                Assert.equal(\"portal.azure.com\", urlParseHost(\"https://portal.azure.com/some/endpoint\"));\n                Assert.equal(\"bing.com\", urlParseHost(\"http://www.bing.com\"));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www2.bing.com/\"));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com/\"));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW21.p.r.e.f.i.x.bing.com/\"));\n\n                Assert.equal(\"portal.azure.com\", urlParseHost(\"https://portal.azure.com/some/endpoint\", false));\n                Assert.equal(\"bing.com\", urlParseHost(\"http://www.bing.com\", false));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www2.bing.com/\", false));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com/\", false));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www21.bing.com/\", false));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW21.p.r.e.f.i.x.bing.com/\", false));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www54321.bing.com/\", false));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW54321.p.r.e.f.i.x.bing.com/\", false));\n                Assert.equal(\"www654321.bing.com\", urlParseHost(\"https://www654321.bing.com/\", false));\n                Assert.equal(\"wwW654321.p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW654321.p.r.e.f.i.x.bing.com/\", false));\n\n                Assert.equal(\"portal.azure.com\", urlParseHost(\"https://portal.azure.com/some/endpoint\", true));\n                Assert.equal(\"bing.com\", urlParseHost(\"http://www.bing.com\", true));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www2.bing.com/\", true));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com/\", true));\n\n                // Check with port included\n                Assert.equal(\"portal.azure.com\", urlParseHost(\"https://portal.azure.com:9999/some/endpoint\"));\n                Assert.equal(\"bing.com\", urlParseHost(\"http://www.bing.com:9999\"));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www2.bing.com:9999/\"));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com:9999/\"));\n\n                Assert.equal(\"portal.azure.com\", urlParseHost(\"https://portal.azure.com:9999/some/endpoint\", false));\n                Assert.equal(\"bing.com\", urlParseHost(\"http://www.bing.com:9999\", false));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www2.bing.com:9999/\", false));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com:9999/\", false));\n\n                Assert.equal(\"portal.azure.com:9999\", urlParseHost(\"https://portal.azure.com:9999/some/endpoint\", true));\n                Assert.equal(\"bing.com:9999\", urlParseHost(\"http://www.bing.com:9999\", true));\n                Assert.equal(\"bing.com:9999\", urlParseHost(\"https://www2.bing.com:9999/\", true));\n                Assert.equal(\"p.r.e.f.i.x.bing.com:9999\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com:9999/\", true));\n\n                // Check with default ports present\n                Assert.equal(\"portal.azure.com\", urlParseHost(\"http://portal.azure.com:80/some/endpoint\", true));\n                Assert.equal(\"portal.azure.com\", urlParseHost(\"https://portal.azure.com:443/some/endpoint\", true));\n                Assert.equal(\"portal.azure.com:80\", urlParseHost(\"https://portal.azure.com:80/some/endpoint\", true));\n                Assert.equal(\"portal.azure.com:443\", urlParseHost(\"http://portal.azure.com:443/some/endpoint\", true));\n                Assert.equal(\"bing.com\", urlParseHost(\"http://www.bing.com:80\", true));\n                Assert.equal(\"bing.com\", urlParseHost(\"https://www2.bing.com:443/\", true));\n                Assert.equal(\"bing.com:80\", urlParseHost(\"https://www.bing.com:80\", true));\n                Assert.equal(\"bing.com:443\", urlParseHost(\"http://www2.bing.com:443/\", true));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com:80/\", true));\n                Assert.equal(\"p.r.e.f.i.x.bing.com\", urlParseHost(\"https://wwW2.p.r.e.f.i.x.bing.com:443/\", true));\n                Assert.equal(\"p.r.e.f.i.x.bing.com:443\", urlParseHost(\"http://wwW2.p.r.e.f.i.x.bing.com:443/\", true));\n                Assert.equal(\"p.r.e.f.i.x.bing.com:80\", urlParseHost(\"https://wwW2.p.r.e.f.i.x.bing.com:80/\", true));\n            }\n        });\n\n        this.testCase({\n            name: \"UrlHelper: parseFullHost should return correct host name\",\n            test: () => {\n                Assert.equal(\"portal.azure.com\", urlParseFullHost(\"https://portal.azure.com/some/endpoint\"));\n                Assert.equal(\"www.bing.com\", urlParseFullHost(\"http://www.bing.com\"));\n                Assert.equal(\"www2.bing.com\", urlParseFullHost(\"https://www2.bing.com/\"));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com/\"));\n\n                Assert.equal(\"portal.azure.com\", urlParseFullHost(\"https://portal.azure.com/some/endpoint\", false));\n                Assert.equal(\"www.bing.com\", urlParseFullHost(\"http://www.bing.com\", false));\n                Assert.equal(\"www2.bing.com\", urlParseFullHost(\"https://www2.bing.com/\", false));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com/\", false));\n\n                Assert.equal(\"portal.azure.com\", urlParseFullHost(\"https://portal.azure.com/some/endpoint\", true));\n                Assert.equal(\"www.bing.com\", urlParseFullHost(\"http://www.bing.com\", true));\n                Assert.equal(\"www2.bing.com\", urlParseFullHost(\"https://www2.bing.com/\", true));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com/\", true));\n\n                // Check with port included\n                Assert.equal(\"portal.azure.com\", urlParseFullHost(\"https://portal.azure.com:9999/some/endpoint\"));\n                Assert.equal(\"www.bing.com\", urlParseFullHost(\"http://www.bing.com:9999\"));\n                Assert.equal(\"www2.bing.com\", urlParseFullHost(\"https://www2.bing.com:9999/\"));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com:9999/\"));\n\n                Assert.equal(\"portal.azure.com\", urlParseFullHost(\"https://portal.azure.com:9999/some/endpoint\", false));\n                Assert.equal(\"www.bing.com\", urlParseFullHost(\"http://www.bing.com:9999\", false));\n                Assert.equal(\"www2.bing.com\", urlParseFullHost(\"https://www2.bing.com:9999/\", false));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com:9999/\", false));\n\n                Assert.equal(\"portal.azure.com:9999\", urlParseFullHost(\"https://portal.azure.com:9999/some/endpoint\", true));\n                Assert.equal(\"www.bing.com:9999\", urlParseFullHost(\"http://www.bing.com:9999\", true));\n                Assert.equal(\"www2.bing.com:9999\", urlParseFullHost(\"https://www2.bing.com:9999/\", true));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com:9999\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com:9999/\", true));\n\n                // Check with default ports present\n                Assert.equal(\"portal.azure.com\", urlParseFullHost(\"http://portal.azure.com:80/some/endpoint\", true));\n                Assert.equal(\"portal.azure.com\", urlParseFullHost(\"https://portal.azure.com:443/some/endpoint\", true));\n                Assert.equal(\"portal.azure.com:80\", urlParseFullHost(\"https://portal.azure.com:80/some/endpoint\", true));\n                Assert.equal(\"portal.azure.com:443\", urlParseFullHost(\"http://portal.azure.com:443/some/endpoint\", true));\n                Assert.equal(\"www.bing.com\", urlParseFullHost(\"http://www.bing.com:80\", true));\n                Assert.equal(\"www2.bing.com\", urlParseFullHost(\"https://www2.bing.com:443/\", true));\n                Assert.equal(\"www.bing.com:80\", urlParseFullHost(\"https://www.bing.com:80\", true));\n                Assert.equal(\"www2.bing.com:443\", urlParseFullHost(\"http://www2.bing.com:443/\", true));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com:80/\", true));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com\", urlParseFullHost(\"https://wwW2.p.r.e.f.i.x.bing.com:443/\", true));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com:443\", urlParseFullHost(\"http://wwW2.p.r.e.f.i.x.bing.com:443/\", true));\n                Assert.equal(\"wwW2.p.r.e.f.i.x.bing.com:80\", urlParseFullHost(\"https://wwW2.p.r.e.f.i.x.bing.com:80/\", true));\n            }\n        });\n\n        this.testCase({\n            name: \"CorrelationidHelper: canIncludeCorrelationHeader should follow included domains\",\n            test: () => {\n                const config = {\n                    enableCorsCorrelation: true,\n                    correlationHeaderDomains: [\"azure.com\", \"prefix.bing.com\"]\n                } as ICorrelationConfig\n                this.testRegexLists(config, false, \"test\");\n                this.testRegexLists(config, true, \"portal.azure.com\");\n                this.testRegexLists(config, true, \"azure.com\");\n                this.testRegexLists(config, false, \"localhost:9001\");\n                this.testRegexLists(config, false, \"bing.com\");\n                this.testRegexLists(config, true, \"prefix.bing.com\");\n            }\n        });\n\n        this.testCase({\n            name: \"CorrelationidHelper: canIncludeCorrelationHeader should follow excluded domains\",\n            test: () => {\n                const config = {\n                    enableCorsCorrelation: true,\n                    correlationHeaderExcludedDomains: [\"test\", \"*.azure.com\"]\n                } as ICorrelationConfig\n                this.testRegexLists(config, false, \"test\");\n                this.testRegexLists(config, false, \"portal.azure.com\");\n                this.testRegexLists(config, true, \"azure.com\");\n                this.testRegexLists(config, true, \"localhost:9001\");\n                this.testRegexLists(config, true, \"bing.com\");\n                this.testRegexLists(config, true, \"prefix.bing.com\");\n            }\n        });\n\n        this.testCase({\n            name: \"CorrelationidHelper: canIncludeCorrelationHeader should check excluded domains if included domains list is also provided\",\n            test: () => {\n                const config = {\n                    enableCorsCorrelation: true,\n                    correlationHeaderExcludedDomains: [\"test\", \"*.azure.com\", \"ignore.microsoft.com\"],\n                    correlationHeaderDomains: [\"azure.com\", \"prefix.bing.com\", \"*.microsoft.com\"]\n                } as ICorrelationConfig\n                this.testRegexLists(config, false, \"test\");\n                this.testRegexLists(config, false, \"portal.azure.com\");\n                this.testRegexLists(config, true, \"azure.com\");\n                this.testRegexLists(config, false, \"localhost:9001\");\n                this.testRegexLists(config, false, \"bing.com\");\n                this.testRegexLists(config, true, \"prefix.bing.com\");\n                this.testRegexLists(config, false, \"ignore.microsoft.com\");\n                this.testRegexLists(config, false, \"should.ignore.microsoft.com\");\n                this.testRegexLists(config, true, \"something.microsoft.com\");\n                this.testRegexLists(config, false, \"microsoft.com\");\n            }\n        });\n\n        this.testCase({\n            name: \"CorrelationidHelper: canIncludeCorrelationHeader check when the url includes the port\",\n            test: () => {\n                const config = {\n                    enableCorsCorrelation: true,\n                    correlationHeaderExcludedDomains: [\"test\", \"*.azure.com\", \"ignore.microsoft.com\"],\n                    correlationHeaderDomains: [\"azure.com\", \"prefix.bing.com\", \"*.microsoft.com\"]\n                } as ICorrelationConfig\n\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com:80\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"http://azure.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com:8000\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://monitor.azure.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://monitor.azure.com:443\", \"example.com\"));\n\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"http://prefix.bing.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:80\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:8000\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://ignore.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com:80\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com:8080\", \"example.com\"));\n\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"http://something.microsoft.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:80\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:8000\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:80\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:8000\", \"example.com\"));\n            }\n        });\n\n        this.testCase({\n            name: \"CorrelationidHelper: canIncludeCorrelationHeader check when the url and include includes the port\",\n            test: () => {\n                const config = {\n                    enableCorsCorrelation: true,\n                    correlationHeaderExcludedDomains: [\"test\", \"*.azure.com\", \"ignore.microsoft.com\"],\n                    correlationHeaderDomains: [\"azure.com\", \"prefix.bing.com\", \"*.microsoft.com:8080\"]\n                } as ICorrelationConfig\n\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com:80\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"http://azure.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://azure.com:8000\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://monitor.azure.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://monitor.azure.com:443\", \"example.com\"));\n\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"http://prefix.bing.com:443\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:80\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:8000\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://ignore.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com:80\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://ignore.microsoft.com:8080\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://something.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:80\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:8000\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:8080\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:80\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:8000\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:8080\", \"example.com\"));\n            }\n        });\n\n        this.testCase({\n            name: \"CorrelationidHelper: canIncludeCorrelationHeader check when the url includes the port and disabled CorsCorrelation\",\n            test: () => {\n                const config = {\n                    enableCorsCorrelation: false,\n                    correlationHeaderExcludedDomains: [\"test\", \"*.azure.com\", \"ignore.microsoft.com\"],\n                    correlationHeaderDomains: [\"azure.com\", \"prefix.bing.com\", \"*.microsoft.com\", \"example.com\"]\n                } as ICorrelationConfig\n\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://example.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://example.com:80\", \"example.com\"));\n                Assert.equal(true, correlationIdCanIncludeCorrelationHeader(config, \"https://example.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://example.com:8000\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://example.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://example.com:8080\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://monitor.azure.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://monitor.azure.com:443\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://prefix.bing.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://prefix.bing.com:80\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://something.microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://something.microsoft.com:80\", \"example.com\"));\n\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"http://microsoft.com:443\", \"example.com\"));\n                Assert.equal(false, correlationIdCanIncludeCorrelationHeader(config, \"https://microsoft.com:80\", \"example.com\"));\n            }\n        });\n\n        this.testCase({\n            name: \"Check disableSameSiteCookie status\",\n            test: () => {\n                let excludeValues = [\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.2 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One; MSAppHost/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/71.0.3578.89 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.1 Safari/605.1.15\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/65.0.225212226 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C101\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.1.00.31860 Chrome/61.0.3163.100 Electron/2.0.10 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G950F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G930F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/71.0.3578.89 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/605.1.15 (KHTML, like Gecko)\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G935F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Yammer/2.1.0 Chrome/66.0.3359.181 Electron/3.0.6 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G965F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-A520F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G955F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G950U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G960U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.1.00.31860 Chrome/61.0.3163.100 Electron/2.0.10 Safari/537.36\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/65.0.225212226 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C50\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-N950U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 6.0.1; SM-G532M Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-G920F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 EdgiOS/42.8.6 Mobile/16C101 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-N950F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.1.0; SAMSUNG SM-J530F Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\"\n                ];\n\n                let acceptValues = [\n                    \"\",\n                    null,\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko/20100101 Firefox/12.0\",\n                    \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)\",\n                    \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15\"\n                ];\n\n                for (let lp = 0; lp < excludeValues.length; lp++) {\n                    Assert.equal(true, uaDisallowsSameSiteNone(excludeValues[lp]), excludeValues[lp]);\n                }\n\n                for (let lp = 0; lp < acceptValues.length; lp++) {\n                    Assert.equal(false, uaDisallowsSameSiteNone(acceptValues[lp]), acceptValues[lp]);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"check getIEVersion\",\n            test: () => {\n                let notIEValues = [\n                    \"\",\n                    null,\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.2 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One; MSAppHost/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/71.0.3578.89 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.1 Safari/605.1.15\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/65.0.225212226 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C101\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.1.00.31860 Chrome/61.0.3163.100 Electron/2.0.10 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G950F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G930F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/71.0.3578.89 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/605.1.15 (KHTML, like Gecko)\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G935F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Yammer/2.1.0 Chrome/66.0.3359.181 Electron/3.0.6 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G965F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-A520F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G955F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G950U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G960U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.1.00.31860 Chrome/61.0.3163.100 Electron/2.0.10 Safari/537.36\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/65.0.225212226 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C50\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-N950U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 6.0.1; SM-G532M Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-G920F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 EdgiOS/42.8.6 Mobile/16C101 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-N950F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.1.0; SAMSUNG SM-J530F Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\"\n                ];\n\n                for (let lp = 0; lp < notIEValues.length; lp++) {\n                    let ieVersion = getIEVersion(notIEValues[lp]);\n                    Assert.equal(null, ieVersion, \"Not IE: \" + notIEValues[lp]);\n                }\n\n                Assert.equal(7, getIEVersion(\"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)\"));\n                Assert.equal(7, getIEVersion(\"Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)\"));\n                Assert.equal(7, getIEVersion(\"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0;)\"));\n                Assert.equal(8, getIEVersion(\"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)\"));\n                Assert.equal(8, getIEVersion(\"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)\"));\n                Assert.equal(8, getIEVersion(\"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)\"));\n                Assert.equal(8, getIEVersion(\"Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)\"));\n                Assert.equal(9, getIEVersion(\"Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.0)\"));\n                Assert.equal(9, getIEVersion(\"Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)\"));\n                Assert.equal(10, getIEVersion(\"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\"));\n                Assert.equal(10, getIEVersion(\"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2)\"));\n                Assert.equal(11, getIEVersion(\"Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko\"));\n                Assert.equal(11, getIEVersion(\"Mozilla/5.0 (Windows NT 6.2; Trident/7.0; rv:11.0) like Gecko\"));\n                Assert.equal(11, getIEVersion(\"Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\"));\n                Assert.equal(11, getIEVersion(\"Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko\"));\n                Assert.equal(11, getIEVersion(\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko\"));\n\n                const origDocMode = document['documentMode'];\n                document['documentMode'] = 11;\n \n                Assert.equal(11, getIEVersion(\"Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)\"));\n                Assert.equal(11, getIEVersion(\"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/7.0; .NET4.0C; .NET4.0E)\"));\n\n                // restore documentMode\n                document['documentMode'] = origDocMode;\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/aiunittests.ts",
    "content": "import \"@microsoft/applicationinsights-shims\";\nimport { ApplicationInsightsCoreTests } from \"./ai/ApplicationInsightsCore.Tests\";\nimport { CookieManagerTests } from \"./ai/CookieManager.Tests\";\nimport { GlobalTestHooks } from \"./ai/GlobalTestHooks.Test\";\nimport { HelperFuncTests } from \"./ai/HelperFunc.Tests\";\nimport { AppInsightsCoreSizeCheck } from \"./ai/AppInsightsCoreSize.Tests\";\nimport { EventHelperTests } from \"./ai/EventHelper.Tests\";\nimport { LoggingEnumTests } from \"./ai/LoggingEnum.Tests\";\nimport { DynamicTests } from \"./config/Dynamic.Tests\";\nimport { UpdateConfigTests } from \"./ai/UpdateConfig.Tests\";\nimport { EventsDiscardedReasonTests } from \"./ai/EventsDiscardedReason.Tests\";\nimport { W3cTraceParentTests } from \"./trace/W3cTraceParentTests\";\nimport { DynamicConfigTests } from \"./config/DynamicConfig.Tests\";\nimport { SendPostManagerTests } from \"./ai/SendPostManager.Tests\";\n// import { StatsBeatTests } from \"./StatsBeat.Tests\";\nimport { OTelTraceApiTests } from \"./trace/traceState.Tests\";\nimport { CommonUtilsTests } from \"./OpenTelemetry/commonUtils.Tests\";\nimport { OpenTelemetryErrorsTests } from \"./OpenTelemetry/errors.Tests\";\nimport { SpanTests } from \"./trace/span.Tests\";\nimport { AttributeContainerTests } from \"./attribute/attributeContainer.Tests\";\nimport { W3cTraceStateTests } from \"./trace/W3cTraceState.Tests\";\nimport { OTelNegativeTests } from \"./OpenTelemetry/otelNegative.Tests\";\nimport { TraceUtilsTests } from \"./trace/traceUtils.Tests\";\n\n// Application Insights Common tests (merged from AppInsightsCommon)\nimport { ApplicationInsightsTests } from \"./ai/AppInsightsCommon.tests\";\nimport { ConnectionStringParserTests } from \"./ai/ConnectionStringParser.tests\";\nimport { ExceptionTests } from \"./ai/Exception.tests\";\nimport { RequestHeadersTests } from \"./ai/RequestHeaders.tests\";\nimport { SeverityLevelTests } from \"./ai/SeverityLevel.tests\";\nimport { ThrottleMgrTest } from \"./ai/ThrottleMgr.tests\";\nimport { UtilTests } from \"./ai/Util.tests\";\nimport { W3CTraceStateModesTests } from \"./trace/W3CTraceStateModes.tests\";\n\n// 1ds core tests\nimport { CoreTest } from './ext/CoreTest';\nimport { ESPromiseTests } from './ext/ESPromiseTests';\nimport { ESPromiseSchedulerTests } from './ext/ESPromiseSchedulerTests';\nimport { DynamicProtoTests } from './ext/DynamicProtoTests';\nimport { UtilsTest } from './ext/UtilsTest';\nimport { ValueSanitizerTests } from './ext/ValueSanitizerTests';\nimport { SpanUtilsTests } from './ext/SpanUtilsTests';\n\nexport function runTests() {\n    new GlobalTestHooks().registerTests();\n    new DynamicTests().registerTests();\n    new DynamicConfigTests().registerTests();\n    new ApplicationInsightsCoreTests().registerTests();\n    new CookieManagerTests(false).registerTests();\n    new CookieManagerTests(true).registerTests();\n    new HelperFuncTests().registerTests();\n    new AppInsightsCoreSizeCheck().registerTests();\n    new EventHelperTests().registerTests();\n    new LoggingEnumTests().registerTests();\n    new UpdateConfigTests().registerTests();\n    new EventsDiscardedReasonTests().registerTests();\n    new W3cTraceParentTests().registerTests();\n    new OTelTraceApiTests().registerTests();\n    new CommonUtilsTests().registerTests();\n    new OpenTelemetryErrorsTests().registerTests();\n    new SpanTests().registerTests();\n    new AttributeContainerTests().registerTests();\n    new W3cTraceStateTests().registerTests();\n    new TraceUtilsTests().registerTests();\n    new OTelNegativeTests().registerTests();\n    // new StatsBeatTests(false).registerTests();\n    // new StatsBeatTests(true).registerTests();\n    new SendPostManagerTests().registerTests();\n\n    // Application Insights Common tests (merged from AppInsightsCommon)\n    new ApplicationInsightsTests().registerTests();\n    new ConnectionStringParserTests().registerTests();\n    new ExceptionTests().registerTests();\n    new RequestHeadersTests().registerTests();\n    new SeverityLevelTests().registerTests();\n    new ThrottleMgrTest().registerTests();\n    new UtilTests().registerTests();\n    new W3CTraceStateModesTests().registerTests();\n\n    // 1DS (OneCollector) extended tests\n    new CoreTest('CoreTest').registerTests();\n    new ESPromiseTests('ESPromiseTests').registerTests();\n    new ESPromiseSchedulerTests('ESPromiseSchedulerTests').registerTests();\n    new DynamicProtoTests('DynamicProtoTests').registerTests();\n    new UtilsTest('UtilsTest').registerTests();\n    new ValueSanitizerTests('ValueSanitizerTests').registerTests();\n    new SpanUtilsTests('SpanUtilsTests').registerTests();\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/attribute/attributeContainer.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { objKeys } from \"@nevware21/ts-utils\";\nimport { createAttributeContainer, addAttributes, isAttributeContainer, createAttributeSnapshot } from \"../../../../src/otel/attribute/attributeContainer\";\nimport { eAttributeFilter, IAttributeChangeInfo } from \"../../../../src/interfaces/otel/attribute/IAttributeContainer\";\nimport { eAttributeChangeOp } from \"../../../../src/enums/otel/eAttributeChangeOp\";\nimport { IOTelConfig } from \"../../../../src/interfaces/otel/config/IOTelConfig\";\nimport { IOTelAttributes } from \"../../../../src/interfaces/otel/IOTelAttributes\";\n\nexport class AttributeContainerTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"AttributeContainer: Basic functionality\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n\n                // Test initial state\n                Assert.equal(0, container.size, \"Initial size should be 0\");\n                Assert.equal(0, container.droppedAttributes, \"Initial dropped attributes should be 0\");\n\n                // Test set/get\n                Assert.ok(container.set(\"key1\", \"value1\"), \"Should successfully set attribute\");\n                Assert.equal(\"value1\", container.get(\"key1\"), \"Should retrieve correct value\");\n                Assert.equal(1, container.size, \"Size should be 1 after adding one attribute\");\n\n                // Test has\n                Assert.ok(container.has(\"key1\"), \"Should return true for existing key\");\n                Assert.ok(!container.has(\"nonexistent\"), \"Should return false for non-existent key\");\n\n                // Test clear\n                container.clear();\n                Assert.equal(0, container.size, \"Size should be 0 after clear\");\n                Assert.ok(!container.has(\"key1\"), \"Should not have key after clear\");\n                Assert.equal(undefined, container.get(\"key1\"), \"Should return undefined after clear\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Hierarchical keys (dotted notation)\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n\n                // Test hierarchical keys\n                Assert.ok(container.set(\"parent.child\", \"value1\"), \"Should set hierarchical key\");\n                Assert.ok(container.set(\"parent.child2\", \"value2\"), \"Should set second child\");\n                Assert.equal(\"value1\", container.get(\"parent.child\"), \"Should get hierarchical value\");\n                Assert.equal(\"value2\", container.get(\"parent.child2\"), \"Should get second hierarchical value\");\n                Assert.equal(2, container.size, \"Should count hierarchical keys correctly\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Iterator methods\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n\n                container.set(\"key1\", \"value1\");\n                container.set(\"key2\", \"value2\");\n                container.set(\"parent.child\", \"value3\");\n\n                // Test keys iterator\n                const keys: string[] = [];\n                const keysIter = container.keys();\n                let keysResult = keysIter.next();\n                while (!keysResult.done) {\n                    keys.push(keysResult.value);\n                    keysResult = keysIter.next();\n                }\n                Assert.equal(3, keys.length, \"Should have 3 keys\");\n                Assert.ok(keys.includes(\"key1\"), \"Should include key1\");\n                Assert.ok(keys.includes(\"key2\"), \"Should include key2\");\n                Assert.ok(keys.includes(\"parent.child\"), \"Should include hierarchical key\");\n\n                // Test entries iterator\n                const entries: [string, any, eAttributeFilter][] = [];\n                const entriesIter = container.entries();\n                let entriesResult = entriesIter.next();\n                while (!entriesResult.done) {\n                    entries.push(entriesResult.value);\n                    entriesResult = entriesIter.next();\n                }\n                Assert.equal(3, entries.length, \"Should have 3 entries\");\n\n                // Test values iterator\n                const values: any[] = [];\n                const valuesIter = container.values();\n                let valuesResult = valuesIter.next();\n                while (!valuesResult.done) {\n                    values.push(valuesResult.value);\n                    valuesResult = valuesIter.next();\n                }\n                Assert.equal(3, values.length, \"Should have 3 values\");\n                Assert.ok(values.includes(\"value1\"), \"Should include value1\");\n                Assert.ok(values.includes(\"value2\"), \"Should include value2\");\n                Assert.ok(values.includes(\"value3\"), \"Should include value3\");\n\n                // Test forEach\n                const forEachResults: { [key: string]: any } = {};\n                container.forEach((key, value) => {\n                    forEachResults[key] = value;\n                });\n                Assert.equal(3, objKeys(forEachResults).length, \"forEach should iterate over all items\");\n                Assert.equal(\"value1\", forEachResults[\"key1\"], \"forEach should provide correct key-value pairs\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: attributes accessor property\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n\n                container.set(\"key1\", \"value1\");\n                container.set(\"key2\", 42);\n                container.set(\"parent.child\", true);\n\n                const attributes = container.attributes;\n                Assert.equal(\"value1\", attributes[\"key1\"], \"Should include simple string attribute\");\n                Assert.equal(42, attributes[\"key2\"], \"Should include number attribute\");\n                Assert.equal(true, attributes[\"parent.child\"], \"Should include hierarchical boolean attribute\");\n                Assert.equal(3, objKeys(attributes).length, \"Should have correct number of attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container ID validation with name parameter\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Test container with no name\n                const containerNoName = createAttributeContainer(otelCfg);\n                Assert.ok(containerNoName.id, \"Container should have an ID even without name\");\n                Assert.ok(containerNoName.id.includes(\".\"), \"Container ID should include dot separator\");\n                \n                // Test container with custom name\n                const containerWithName = createAttributeContainer(otelCfg, \"custom-container\");\n                Assert.ok(containerWithName.id, \"Container with name should have an ID\");\n                Assert.ok(containerWithName.id.startsWith(\"custom-container.\"), \"Container ID should start with provided name\");\n                \n                // Test container with descriptive name\n                const containerDescriptive = createAttributeContainer(otelCfg, \"span-attributes\");\n                Assert.ok(containerDescriptive.id.startsWith(\"span-attributes.\"), \"Container ID should include descriptive name\");\n                \n                // Test that different containers have different IDs\n                const container1 = createAttributeContainer(otelCfg, \"test-1\");\n                const container2 = createAttributeContainer(otelCfg, \"test-2\");\n                const container3 = createAttributeContainer(otelCfg, \"test-1\"); // Same name, different instance\n                \n                Assert.notEqual(container1.id, container2.id, \"Different containers should have different IDs\");\n                Assert.notEqual(container1.id, container3.id, \"Containers with same name should have different IDs\");\n                Assert.notEqual(container2.id, container3.id, \"All containers should have unique IDs\");\n                \n                // Test ID format consistency\n                Assert.ok(container1.id.includes(\"test-1.\"), \"Container 1 should include its name\");\n                Assert.ok(container2.id.includes(\"test-2.\"), \"Container 2 should include its name\");\n                Assert.ok(container3.id.includes(\"test-1.\"), \"Container 3 should include its name\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Snapshot ID validation includes source container details\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create source container with name\n                const sourceContainer = createAttributeContainer(otelCfg, \"source-container\");\n                sourceContainer.set(\"key1\", \"value1\");\n                sourceContainer.set(\"key2\", \"value2\");\n                \n                // Create snapshot from container\n                const snapshot = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n                \n                Assert.ok(snapshot.id, \"Snapshot should have an ID\");\n                Assert.ok(snapshot.id.includes(\"<-@[\"), \"Snapshot ID should indicate it's a snapshot\");\n                Assert.ok(snapshot.id.includes(sourceContainer.id), \"Snapshot ID should include source container ID\");\n                Assert.ok(snapshot.id.includes(\"]\"), \"Snapshot ID should close the snapshot notation\");\n                \n                // Test snapshot from container without explicit name\n                const unnamedContainer = createAttributeContainer(otelCfg);\n                unnamedContainer.set(\"test\", \"value\");\n                const unnamedSnapshot = createAttributeSnapshot(otelCfg, \"unnamed-snapshot\", unnamedContainer);\n                \n                Assert.ok(unnamedSnapshot.id.includes(\"<-@[\"), \"Unnamed container snapshot should indicate it's a snapshot\");\n                Assert.ok(unnamedSnapshot.id.includes(unnamedContainer.id), \"Unnamed snapshot should include source container ID\");\n                \n                // Test snapshot from plain object (should not include source container ID)\n                const plainAttributes = { \"plain\": \"value\", \"another\": 42 };\n                const plainSnapshot = createAttributeSnapshot(otelCfg, \"plain-snapshot\", plainAttributes);\n                \n                // Plain object snapshots get a different naming pattern since there's no source container\n                Assert.ok(plainSnapshot.id, \"Plain object snapshot should have an ID\");\n                Assert.notEqual(plainSnapshot.id, snapshot.id, \"Plain snapshot should have different ID than container snapshot\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Snapshot ID uniqueness and inheritance details\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create multiple containers with the same name\n                const container1 = createAttributeContainer(otelCfg, \"parent-container\");\n                const container2 = createAttributeContainer(otelCfg, \"parent-container\");\n                \n                container1.set(\"key1\", \"value1\");\n                container2.set(\"key2\", \"value2\");\n                \n                // Create snapshots from both containers\n                const snapshot1 = createAttributeSnapshot(otelCfg, \"snapshot1\", container1);\n                const snapshot2 = createAttributeSnapshot(otelCfg, \"snapshot2\", container2);\n                \n                Assert.notEqual(snapshot1.id, snapshot2.id, \"Snapshots from different containers should have different IDs\");\n                \n                // Both should reference their respective source container IDs\n                Assert.ok(snapshot1.id.includes(container1.id), \"Snapshot 1 should reference container 1 ID\");\n                Assert.ok(snapshot2.id.includes(container2.id), \"Snapshot 2 should reference container 2 ID\");\n                \n                // Test nested snapshot scenario\n                const childContainer = createAttributeContainer(otelCfg, \"child-container\", container1);\n                const childSnapshot = createAttributeSnapshot(otelCfg, \"child-snapshot\", childContainer);\n                \n                Assert.ok(childSnapshot.id.includes(\"<-@[\"), \"Child snapshot should be identified as snapshot\");\n                Assert.ok(childSnapshot.id.includes(childContainer.id), \"Child snapshot should reference child container ID\");\n                Assert.notEqual(childSnapshot.id, snapshot1.id, \"Child snapshot should have different ID than parent snapshot\");\n                \n                // Verify the child container ID includes its name\n                Assert.ok(childContainer.id.includes(\"child-container.\"), \"Child container ID should include its name\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Inheritance - basic functionality\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\",\n                    \"shared.key\": \"parent_shared\"\n                };\n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n\n                // Test inherited attributes are accessible\n                Assert.equal(\"parent_value1\", container.get(\"parent.key1\"), \"Should get inherited attribute\");\n                Assert.equal(\"parent_value2\", container.get(\"parent.key2\"), \"Should get second inherited attribute\");\n                Assert.equal(\"parent_shared\", container.get(\"shared.key\"), \"Should get shared inherited attribute\");\n                Assert.ok(container.has(\"parent.key1\"), \"Should report inherited attribute as existing\");\n                Assert.equal(3, container.size, \"Should count inherited attributes in size\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Inheritance - override behavior\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"shared.key\": \"parent_shared\",\n                    \"override.me\": \"parent_override\"\n                };\n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n\n                // Test initial inherited state\n                Assert.equal(3, container.size, \"Should start with 3 inherited attributes\");\n                Assert.equal(\"parent_shared\", container.get(\"shared.key\"), \"Should get inherited value initially\");\n\n                // Test overriding inherited attribute\n                Assert.ok(container.set(\"shared.key\", \"child_shared\"), \"Should successfully override inherited attribute\");\n                Assert.equal(\"child_shared\", container.get(\"shared.key\"), \"Should get overridden value\");\n                Assert.equal(3, container.size, \"Size should remain 3 after override\");\n\n                // Test adding new attribute alongside inherited ones\n                Assert.ok(container.set(\"child.key\", \"child_value\"), \"Should add new attribute\");\n                Assert.equal(\"child_value\", container.get(\"child.key\"), \"Should get new attribute value\");\n                Assert.equal(\"parent_value1\", container.get(\"parent.key1\"), \"Should still get inherited attribute\");\n                Assert.equal(4, container.size, \"Size should be 4 after adding new attribute\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Inheritance - iterator methods include inherited attributes\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\",\n                    \"shared.key\": \"parent_shared\"\n                };\n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n\n                // Add some child attributes\n                container.set(\"child.key\", \"child_value\");\n                container.set(\"shared.key\", \"child_shared\"); // Override inherited\n\n                // Test keys iterator includes both inherited and child keys\n                const keys: string[] = [];\n                const keysIter = container.keys();\n                let keysResult = keysIter.next();\n                while (!keysResult.done) {\n                    keys.push(keysResult.value);\n                    keysResult = keysIter.next();\n                }\n                Assert.equal(4, keys.length, \"Should have 4 total keys (2 child + 2 non-overridden inherited)\");\n                Assert.ok(keys.includes(\"child.key\"), \"Should include child key\");\n                Assert.ok(keys.includes(\"shared.key\"), \"Should include overridden key\");\n                Assert.ok(keys.includes(\"parent.key1\"), \"Should include inherited key1\");\n                Assert.ok(keys.includes(\"parent.key2\"), \"Should include inherited key2\");\n\n                // Test entries iterator\n                const entries: [string, any, eAttributeFilter][] = [];\n                const entriesIter = container.entries();\n                let entriesResult = entriesIter.next();\n                while (!entriesResult.done) {\n                    entries.push(entriesResult.value);\n                    entriesResult = entriesIter.next();\n                }\n                Assert.equal(4, entries.length, \"Should have 4 total entries\");\n                \n                // Convert to map by extracting key-value pairs (ignoring source)\n                const entryMap = new Map(entries.map(entry => [entry[0], entry[1]]));\n                Assert.equal(\"child_value\", entryMap.get(\"child.key\"), \"Should have child entry\");\n                Assert.equal(\"child_shared\", entryMap.get(\"shared.key\"), \"Should have overridden value in entries\");\n                Assert.equal(\"parent_value1\", entryMap.get(\"parent.key1\"), \"Should have inherited entry\");\n\n                // Test forEach\n                const forEachResults: { [key: string]: any } = {};\n                container.forEach((key, value) => {\n                    forEachResults[key] = value;\n                });\n                Assert.equal(4, objKeys(forEachResults).length, \"forEach should iterate over all items including inherited\");\n                Assert.equal(\"child_shared\", forEachResults[\"shared.key\"], \"forEach should use overridden value\");\n                Assert.equal(\"parent_value1\", forEachResults[\"parent.key1\"], \"forEach should include inherited value\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Inheritance - attributes includes inherited\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": 42,\n                    \"shared.key\": \"parent_shared\"\n                };\n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n\n                container.set(\"child.key\", \"child_value\");\n                container.set(\"shared.key\", \"child_shared\"); // Override\n\n                const attributes = container.attributes;\n                Assert.equal(\"parent_value1\", attributes[\"parent.key1\"], \"Should include inherited string\");\n                Assert.equal(42, attributes[\"parent.key2\"], \"Should include inherited number\");\n                Assert.equal(\"child_value\", attributes[\"child.key\"], \"Should include child attribute\");\n                Assert.equal(\"child_shared\", attributes[\"shared.key\"], \"Should use overridden value\");\n                Assert.equal(4, objKeys(attributes).length, \"Should have correct total count\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Inheritance - clear removes inherited attributes\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\"\n                };\n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n\n                // Verify inherited attributes are present\n                Assert.equal(2, container.size, \"Should start with 2 inherited attributes\");\n                Assert.equal(\"parent_value1\", container.get(\"parent.key1\"), \"Should access inherited attribute\");\n\n                // Add child attribute\n                container.set(\"child.key\", \"child_value\");\n                Assert.equal(3, container.size, \"Should have 3 total attributes\");\n\n                // Clear should remove everything including inherited\n                container.clear();\n                Assert.equal(0, container.size, \"Should have 0 attributes after clear\");\n                Assert.ok(!container.has(\"parent.key1\"), \"Should not have inherited attribute after clear\");\n                Assert.ok(!container.has(\"child.key\"), \"Should not have child attribute after clear\");\n                Assert.equal(undefined, container.get(\"parent.key1\"), \"Should return undefined for inherited attribute after clear\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Inheritance - empty parent attributes\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const emptyParent: IOTelAttributes = {};\n                const container = createAttributeContainer(otelCfg, \"test-empty-parent\", emptyParent);\n\n                // Should behave like container without inheritance\n                Assert.equal(0, container.size, \"Should start with 0 attributes\");\n                container.set(\"key1\", \"value1\");\n                Assert.equal(1, container.size, \"Should have 1 attribute after adding\");\n                Assert.equal(\"value1\", container.get(\"key1\"), \"Should get attribute value\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Inheritance - null/undefined parent attributes\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const containerNull = createAttributeContainer(otelCfg, \"test-null\", null as any);\n                const containerUndefined = createAttributeContainer(otelCfg, \"test-undefined\", undefined as any);\n\n                // Both should behave like containers without inheritance\n                Assert.equal(0, containerNull.size, \"Null parent should start with 0 attributes\");\n                Assert.equal(0, containerUndefined.size, \"Undefined parent should start with 0 attributes\");\n\n                containerNull.set(\"key1\", \"value1\");\n                containerUndefined.set(\"key2\", \"value2\");\n\n                Assert.equal(1, containerNull.size, \"Null parent container should have 1 after adding\");\n                Assert.equal(1, containerUndefined.size, \"Undefined parent container should have 1 after adding\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: addAttributes function with inheritance\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key\": \"parent_value\"\n                };\n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n\n                const attributesToAdd: IOTelAttributes = {\n                    \"added.key1\": \"added_value1\",\n                    \"added.key2\": 42,\n                    \"parent.key\": \"overridden_value\" // Override inherited\n                };\n\n                addAttributes(container, attributesToAdd);\n\n                Assert.equal(3, container.size, \"Should have 3 attributes after adding\");\n                Assert.equal(\"added_value1\", container.get(\"added.key1\"), \"Should have added attribute 1\");\n                Assert.equal(42, container.get(\"added.key2\"), \"Should have added attribute 2\");\n                Assert.equal(\"overridden_value\", container.get(\"parent.key\"), \"Should override inherited attribute\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Complex inheritance scenarios\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"service.name\": \"parent-service\",\n                    \"service.version\": \"1.0.0\",\n                    \"deployment.environment\": \"staging\",\n                    \"telemetry.sdk.name\": \"opentelemetry\",\n                    \"common.attribute\": \"from_parent\"\n                };\n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n\n                // Add child-specific attributes\n                container.set(\"span.kind\", \"client\");\n                container.set(\"http.method\", \"GET\");\n                container.set(\"http.url\", \"https://api.example.com\");\n                \n                // Override some parent attributes\n                container.set(\"service.version\", \"2.0.0\"); // Override\n                container.set(\"deployment.environment\", \"production\"); // Override\n\n                // Verify final state\n                Assert.equal(8, container.size, \"Should have 8 total attributes (5 parent + 5 child - 2 overrides)\");\n                \n                // Check overridden values\n                Assert.equal(\"2.0.0\", container.get(\"service.version\"), \"Should use child version\");\n                Assert.equal(\"production\", container.get(\"deployment.environment\"), \"Should use child environment\");\n                \n                // Check inherited values\n                Assert.equal(\"parent-service\", container.get(\"service.name\"), \"Should inherit service name\");\n                Assert.equal(\"opentelemetry\", container.get(\"telemetry.sdk.name\"), \"Should inherit SDK name\");\n                Assert.equal(\"from_parent\", container.get(\"common.attribute\"), \"Should inherit common attribute\");\n                \n                // Check child-only values\n                Assert.equal(\"client\", container.get(\"span.kind\"), \"Should have child span kind\");\n                Assert.equal(\"GET\", container.get(\"http.method\"), \"Should have child HTTP method\");\n\n                const finalAttributes = container.attributes;\n                Assert.equal(8, objKeys(finalAttributes).length, \"attributes should return correct count\");\n                Assert.equal(\"2.0.0\", finalAttributes[\"service.version\"], \"attributes should use overridden value\");\n                Assert.equal(\"parent-service\", finalAttributes[\"service.name\"], \"attributes should include inherited value\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Valid container identification\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n\n                // Test with valid container\n                Assert.ok(isAttributeContainer(container), \"Should identify valid container\");\n                \n                // Test with inherited attributes\n                const inheritedAttribs: IOTelAttributes = { \"parent.key\": \"value\" };\n                const containerWithInheritance = createAttributeContainer(otelCfg, \"test-inherited\", inheritedAttribs);\n                Assert.ok(isAttributeContainer(containerWithInheritance), \"Should identify container with inheritance\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Child containers identification\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentContainer = createAttributeContainer(otelCfg, \"parent-container\");\n                parentContainer.set(\"parent.key\", \"parent-value\");\n\n                // Test child container created with child() method\n                const childContainer = parentContainer.child(\"child-container\");\n                Assert.ok(isAttributeContainer(childContainer), \"Should identify child container as valid\");\n                \n                // Test snapshot child container created with child() method\n                const snapshotContainer = parentContainer.child(\"snapshot-container\", true);\n                Assert.ok(isAttributeContainer(snapshotContainer), \"Should identify snapshot child container as valid\");\n                \n                // Verify that child containers have the required methods and properties\n                Assert.ok(typeof childContainer.child === \"function\", \"Child container should have child method\");\n                Assert.ok(typeof childContainer.listen === \"function\", \"Child container should have listen method\");\n                Assert.ok(\"id\" in childContainer, \"Child container should have id property\");\n                Assert.ok(\"size\" in childContainer, \"Child container should have size property\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Invalid object identification - null and undefined\",\n            test: () => {\n                // Test null and undefined\n                Assert.ok(!isAttributeContainer(null), \"Should return false for null\");\n                Assert.ok(!isAttributeContainer(undefined), \"Should return false for undefined\");\n                Assert.ok(!isAttributeContainer(void 0), \"Should return false for void 0\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Invalid object identification - primitive types\",\n            test: () => {\n                // Test primitive types\n                Assert.ok(!isAttributeContainer(\"string\"), \"Should return false for string\");\n                Assert.ok(!isAttributeContainer(123), \"Should return false for number\");\n                Assert.ok(!isAttributeContainer(true), \"Should return false for boolean\");\n                Assert.ok(!isAttributeContainer(false), \"Should return false for boolean false\");\n                Assert.ok(!isAttributeContainer(Symbol(\"test\")), \"Should return false for symbol\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Invalid object identification - arrays and other objects\",\n            test: () => {\n                // Test arrays and other objects\n                Assert.ok(!isAttributeContainer([]), \"Should return false for empty array\");\n                Assert.ok(!isAttributeContainer([1, 2, 3]), \"Should return false for array with values\");\n                Assert.ok(!isAttributeContainer({}), \"Should return false for empty object\");\n                Assert.ok(!isAttributeContainer({ key: \"value\" }), \"Should return false for plain object\");\n                Assert.ok(!isAttributeContainer(new Date()), \"Should return false for Date object\");\n                Assert.ok(!isAttributeContainer(/regex/), \"Should return false for RegExp object\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Missing required properties\",\n            test: () => {\n                // Test objects missing size property\n                const missingSize = {\n                    droppedAttributes: 0,\n                    attributes: {},\n                    id: \"test-id\",\n                    clear: () => {},\n                    get: () => {},\n                    has: () => {},\n                    set: () => {},\n                    del: () => {},\n                    keys: () => {},\n                    entries: () => {},\n                    forEach: () => {},\n                    values: () => {},\n                    child: () => {},\n                    listen: () => {}\n                };\n                Assert.ok(!isAttributeContainer(missingSize), \"Should return false when missing size property\");\n\n                // Test objects missing droppedAttributes property\n                const missingDroppedAttributes = {\n                    size: 0,\n                    attributes: {},\n                    id: \"test-id\",\n                    clear: () => {},\n                    get: () => {},\n                    has: () => {},\n                    set: () => {},\n                    del: () => {},\n                    keys: () => {},\n                    entries: () => {},\n                    forEach: () => {},\n                    values: () => {},\n                    child: () => {},\n                    listen: () => {}\n                };\n                Assert.ok(!isAttributeContainer(missingDroppedAttributes), \"Should return false when missing droppedAttributes property\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Missing required methods\",\n            test: () => {\n                const baseObj = {\n                    size: 0,\n                    droppedAttributes: 0,\n                    attributes: {}\n                };\n\n                // Test missing each required method\n                const requiredMethods = [\"clear\", \"get\", \"has\", \"set\", \"del\", \"keys\", \"entries\", \"forEach\", \"values\", \"child\", \"listen\"];\n                \n                requiredMethods.forEach(methodName => {\n                    const objMissingMethod = { ...baseObj };\n                    // Add all methods except the one we're testing\n                    requiredMethods.forEach(method => {\n                        if (method !== methodName) {\n                            (objMissingMethod as any)[method] = () => {};\n                        }\n                    });\n                    \n                    Assert.ok(!isAttributeContainer(objMissingMethod), `Should return false when missing ${methodName} method`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Wrong property types\",\n            test: () => {\n                const baseObj = {\n                    clear: () => {},\n                    get: () => {},\n                    has: () => {},\n                    set: () => {},\n                    del: () => {},\n                    keys: () => {},\n                    entries: () => {},\n                    forEach: () => {},\n                    values: () => {},\n                    child: () => {},\n                    listen: () => {}\n                };\n\n                // Test size property with wrong type\n                const wrongSizeType = {\n                    ...baseObj,\n                    size: \"not-a-number\",\n                    droppedAttributes: 0,\n                    attributes: {}\n                };\n                Assert.ok(!isAttributeContainer(wrongSizeType), \"Should return false when size is not a number\");\n\n                // Test droppedAttributes property with wrong type\n                const wrongDroppedAttributesType = {\n                    ...baseObj,\n                    size: 0,\n                    droppedAttributes: \"not-a-number\"\n                };\n                Assert.ok(!isAttributeContainer(wrongDroppedAttributesType), \"Should return false when droppedAttributes is not a number\");\n\n                // Test both properties with wrong types\n                const bothWrongTypes = {\n                    ...baseObj,\n                    size: true,\n                    droppedAttributes: []\n                };\n                Assert.ok(!isAttributeContainer(bothWrongTypes), \"Should return false when both properties have wrong types\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Wrong method types\",\n            test: () => {\n                const baseObj = {\n                    size: 0,\n                    droppedAttributes: 0,\n                    attributes: {}\n                };\n\n                const requiredMethods = [\"clear\", \"get\", \"has\", \"set\", \"del\", \"keys\", \"entries\", \"forEach\", \"values\", \"child\", \"listen\"];\n                \n                requiredMethods.forEach(methodName => {\n                    const objWithWrongMethodType = { ...baseObj };\n                    // Add all methods as functions except the one we're testing\n                    requiredMethods.forEach(method => {\n                        if (method !== methodName) {\n                            (objWithWrongMethodType as any)[method] = () => {};\n                        } else {\n                            (objWithWrongMethodType as any)[method] = \"not-a-function\";\n                        }\n                    });\n                    \n                    Assert.ok(!isAttributeContainer(objWithWrongMethodType), `Should return false when ${methodName} is not a function`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Objects with getter properties\",\n            test: () => {\n                // Test object with lazy properties (similar to how attributeContainer implements size)\n                const objWithGetters = {};\n                \n                // Define getters for size and droppedAttributes\n                Object.defineProperty(objWithGetters, \"size\", {\n                    get: () => 5,\n                    enumerable: true\n                });\n                \n                Object.defineProperty(objWithGetters, \"droppedAttributes\", {\n                    get: () => 2,\n                    enumerable: true\n                });\n\n                Object.defineProperties(objWithGetters, {\n                    attributes: {\n                        get: () => ({}),\n                        enumerable: true\n                    }\n                });\n\n                // Add required methods\n                const requiredMethods = [\"clear\", \"get\", \"has\", \"set\", \"del\", \"keys\", \"entries\", \"forEach\", \"values\", \"child\", \"listen\"];\n                requiredMethods.forEach(method => {\n                    (objWithGetters as any)[method] = () => {};\n                });\n\n                // Add required id property\n                (objWithGetters as any).id = \"test-id\";\n\n                Assert.ok(isAttributeContainer(objWithGetters), \"Should correctly identify object with getter properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Partial interface implementation\",\n            test: () => {\n                // Test object that has some but not all required properties/methods\n                const partialImplementation = {\n                    size: 0,\n                    droppedAttributes: 0,\n                    clear: () => {},\n                    get: () => {},\n                    has: () => {},\n                    set: () => {}\n                    // Missing: del, keys, entries, forEach, values, child, listen, id, attributes\n                };\n\n                Assert.ok(!isAttributeContainer(partialImplementation), \"Should return false for partial implementation\");\n\n                // Test object with all methods but wrong property types\n                const wrongPropertyTypes = {\n                    size: null,\n                    droppedAttributes: undefined,\n                    attributes: null,\n                    clear: [],\n                    get: () => {},\n                    has: () => {},\n                    set: () => {},\n                    del: () => {},\n                    keys: () => {},\n                    entries: () => {},\n                    forEach: () => {},\n                    values: () => {},\n                    child: () => {},\n                    listen: () => {}\n                };\n\n                Assert.ok(!isAttributeContainer(wrongPropertyTypes), \"Should return false when properties are null/undefined\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Edge cases and complex objects\",\n            test: () => {\n                // Test function object (functions are objects in JavaScript)\n                const func = function() {};\n                func.size = 0;\n                func.droppedAttributes = 0;\n                func.attributes = {};\n                func.id = \"test-id\";\n                func.clear = () => {};\n                func.get = () => {};\n                func.has = () => {};\n                func.set = () => {};\n                func.del = () => {};\n                func.keys = () => {};\n                func.entries = () => {};\n                func.forEach = () => {};\n                func.values = () => {};\n                func.child = () => {};\n                func.listen = () => {};\n\n                Assert.ok(isAttributeContainer(func), \"Should identify function object with all required properties\");\n\n                // Test class instance\n                class MockContainer {\n                    size = 10;\n                    droppedAttributes = 1;\n                    attributes = {};\n                    id = \"mock-id\";\n                    clear() {}\n                    get() {}\n                    has() {}\n                    set() {}\n                    del() {}\n                    keys() {}\n                    entries() {}\n                    forEach() {}\n                    values() {}\n                    child() {}\n                    listen() {}\n                }\n\n                const mockInstance = new MockContainer();\n                Assert.ok(isAttributeContainer(mockInstance), \"Should identify class instance with all required properties\");\n\n                // Test object with prototype chain\n                const prototypeObj = Object.create({\n                    clear: () => {},\n                    get: () => {},\n                    has: () => {}\n                });\n                prototypeObj.size = 0;\n                prototypeObj.droppedAttributes = 0;\n                prototypeObj.attributes = {};\n                prototypeObj.id = \"proto-id\";\n                prototypeObj.set = () => {};\n                prototypeObj.del = () => {};\n                prototypeObj.keys = () => {};\n                prototypeObj.entries = () => {};\n                prototypeObj.forEach = () => {};\n                prototypeObj.values = () => {};\n                prototypeObj.child = () => {};\n                prototypeObj.listen = () => {};\n\n                Assert.ok(isAttributeContainer(prototypeObj), \"Should identify object with methods in prototype chain\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Type guard functionality\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n                const notContainer = { some: \"object\" };\n\n                // Test type narrowing works correctly\n                function processContainer(obj: any) {\n                    if (isAttributeContainer(obj)) {\n                        // In this block, TypeScript should know obj is IAttributeContainer\n                        return obj.size; // This should compile without errors\n                    }\n                    return -1;\n                }\n\n                Assert.equal(0, processContainer(container), \"Should return container size for valid container\");\n                Assert.equal(-1, processContainer(notContainer), \"Should return -1 for invalid container\");\n                Assert.equal(-1, processContainer(null), \"Should return -1 for null\");\n                Assert.equal(-1, processContainer(\"string\"), \"Should return -1 for string\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Real container usage scenarios\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Test container after operations\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n                container.set(\"key1\", \"value1\");\n                container.set(\"key2\", 42);\n                \n                Assert.ok(isAttributeContainer(container), \"Should identify container after adding attributes\");\n                \n                // Test container after clear\n                container.clear();\n                Assert.ok(isAttributeContainer(container), \"Should still identify container after clear\");\n                \n                // Test container with inheritance\n                const inheritedAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"value1\",\n                    \"parent.key2\": \"value2\"\n                };\n                const containerWithInheritance = createAttributeContainer(otelCfg, \"test-inherited\", inheritedAttribs);\n                Assert.ok(isAttributeContainer(containerWithInheritance), \"Should identify container with inheritance\");\n                \n                // Test container after inheritance operations\n                containerWithInheritance.set(\"child.key\", \"child_value\");\n                Assert.ok(isAttributeContainer(containerWithInheritance), \"Should identify container after inheritance operations\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Does not access lazy properties\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create a mock object that has all the required methods and properties\n                // but will throw if the lazy properties are accessed\n                const mockContainer = {\n                    id: \"mock-container-id\", // Add required id property\n                    clear: () => {},\n                    get: () => undefined,\n                    has: () => false,\n                    set: () => true,\n                    del: () => false,\n                    keys: () => {\n                        return {\n                            next: () => ({ done: true, value: undefined })\n                        } as Iterator<string>;\n                    },\n                    entries: () => {\n                        return {\n                            next: () => ({ done: true, value: undefined })\n                        } as Iterator<[string, any, any]>;\n                    },\n                    forEach: () => {},\n                    values: () => {\n                        return {\n                            next: () => ({ done: true, value: undefined })\n                        } as Iterator<any>;\n                    },\n                    child: () => ({}), // Add missing child method\n                    listen: () => ({ rm: () => {} })\n                };\n                \n                // Add properties that will throw if accessed via getter\n                let sizeAccessed = false;\n                let droppedAttributesAccessed = false;\n                let attributesAccessed = false;\n                \n                Object.defineProperty(mockContainer, \"size\", {\n                    get: () => {\n                        sizeAccessed = true;\n                        throw new Error(\"size property should not be accessed in isAttributeContainer\");\n                    },\n                    enumerable: false,\n                    configurable: true\n                });\n                \n                Object.defineProperty(mockContainer, \"droppedAttributes\", {\n                    get: () => {\n                        droppedAttributesAccessed = true;\n                        throw new Error(\"droppedAttributes property should not be accessed in isAttributeContainer\");\n                    },\n                    enumerable: false,\n                    configurable: true\n                });\n                \n                Object.defineProperty(mockContainer, \"attributes\", {\n                    get: () => {\n                        attributesAccessed = true;\n                        throw new Error(\"attributes property should not be accessed in isAttributeContainer\");\n                    },\n                    enumerable: false,\n                    configurable: true\n                });\n                \n                // Test that isAttributeContainer does not access the lazy properties\n                let result: boolean;\n                let errorThrown = false;\n                try {\n                    result = isAttributeContainer(mockContainer);\n                } catch (error) {\n                    errorThrown = true;\n                    // If an error was thrown, it means a lazy property was accessed\n                }\n                \n                // Verify no error was thrown (meaning no lazy properties were accessed)\n                Assert.ok(!errorThrown, \"isAttributeContainer should not access lazy properties\");\n                \n                // Verify the function works correctly\n                Assert.ok(result!, \"Should correctly identify as attribute container\");\n                \n                // Verify that none of the lazy properties were accessed\n                Assert.ok(!sizeAccessed, \"size property should not be accessed during isAttributeContainer check\");\n                Assert.ok(!droppedAttributesAccessed, \"droppedAttributes property should not be accessed during isAttributeContainer check\");\n                Assert.ok(!attributesAccessed, \"attributes property should not be accessed during isAttributeContainer check\");\n            }\n        });\n\n        this.testCase({\n            name: \"isAttributeContainer: Lazy properties behavior verification\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create a real container\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n                container.set(\"test.key\", \"test_value\");\n                \n                // Test that the lazy properties exist (using 'in' operator which doesn't trigger getters)\n                Assert.ok(\"size\" in container, \"Container should have size property\");\n                Assert.ok(\"droppedAttributes\" in container, \"Container should have droppedAttributes property\");\n                Assert.ok(\"attributes\" in container, \"Container should have attributes property\");\n                \n                // Verify isAttributeContainer works with real container\n                Assert.ok(isAttributeContainer(container), \"Should identify real container correctly\");\n                \n                // Now verify the properties actually work when accessed\n                Assert.equal(1, container.size, \"Size should be 1\");\n                Assert.equal(0, container.droppedAttributes, \"DroppedAttributes should be 0\");\n                Assert.equal(1, Object.keys(container.attributes).length, \"Attributes should have 1 key\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container-to-container inheritance - basic functionality\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create parent container with some attributes\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"parent.key2\", \"parent_value2\");\n                parentContainer.set(\"shared.key\", \"parent_shared\");\n                \n                // Create child container with parent container as inheritance source\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                \n                // Test inherited attributes are accessible from parent container\n                Assert.equal(\"parent_value1\", childContainer.get(\"parent.key1\"), \"Should get inherited attribute from parent container\");\n                Assert.equal(\"parent_value2\", childContainer.get(\"parent.key2\"), \"Should get second inherited attribute from parent container\");\n                Assert.equal(\"parent_shared\", childContainer.get(\"shared.key\"), \"Should get shared inherited attribute from parent container\");\n                Assert.ok(childContainer.has(\"parent.key1\"), \"Should report inherited attribute from parent container as existing\");\n                Assert.equal(3, childContainer.size, \"Should count inherited attributes from parent container in size\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container-to-container inheritance - override behavior\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create parent container\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"shared.key\", \"parent_shared\");\n                parentContainer.set(\"override.me\", \"parent_override\");\n                \n                // Create child container with parent container as inheritance source\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                \n                // Test initial inherited state\n                Assert.equal(3, childContainer.size, \"Should start with 3 inherited attributes from parent container\");\n                Assert.equal(\"parent_shared\", childContainer.get(\"shared.key\"), \"Should get inherited value from parent container initially\");\n                \n                // Test overriding inherited attribute from parent container\n                Assert.ok(childContainer.set(\"shared.key\", \"child_shared\"), \"Should successfully override inherited attribute from parent container\");\n                Assert.equal(\"child_shared\", childContainer.get(\"shared.key\"), \"Should get overridden value instead of parent container value\");\n                Assert.equal(3, childContainer.size, \"Size should remain 3 after override of parent container attribute\");\n                \n                // Test adding new attribute alongside inherited ones from parent container\n                Assert.ok(childContainer.set(\"child.key\", \"child_value\"), \"Should add new attribute to child container\");\n                Assert.equal(\"child_value\", childContainer.get(\"child.key\"), \"Should get new child attribute value\");\n                Assert.equal(\"parent_value1\", childContainer.get(\"parent.key1\"), \"Should still get inherited attribute from parent container\");\n                Assert.equal(4, childContainer.size, \"Size should be 4 after adding new attribute to child container\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container-to-container inheritance - iterator methods\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create parent container\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"parent.key2\", \"parent_value2\");\n                parentContainer.set(\"shared.key\", \"parent_shared\");\n                \n                // Create child container with parent container as inheritance source\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                \n                // Add some child attributes\n                childContainer.set(\"child.key\", \"child_value\");\n                childContainer.set(\"shared.key\", \"child_shared\"); // Override inherited from parent container\n                \n                // Test keys iterator includes both inherited from parent container and child keys\n                const keys: string[] = [];\n                const keysIter = childContainer.keys();\n                let keysResult = keysIter.next();\n                while (!keysResult.done) {\n                    keys.push(keysResult.value);\n                    keysResult = keysIter.next();\n                }\n                Assert.equal(4, keys.length, \"Should have 4 total keys (2 child + 2 non-overridden from parent container)\");\n                Assert.ok(keys.includes(\"child.key\"), \"Should include child key\");\n                Assert.ok(keys.includes(\"shared.key\"), \"Should include overridden key\");\n                Assert.ok(keys.includes(\"parent.key1\"), \"Should include inherited key1 from parent container\");\n                Assert.ok(keys.includes(\"parent.key2\"), \"Should include inherited key2 from parent container\");\n                \n                // Test entries iterator with parent container inheritance\n                const entries: [string, any, eAttributeFilter][] = [];\n                const entriesIter = childContainer.entries();\n                let entriesResult = entriesIter.next();\n                while (!entriesResult.done) {\n                    entries.push(entriesResult.value);\n                    entriesResult = entriesIter.next();\n                }\n                Assert.equal(4, entries.length, \"Should have 4 total entries including parent container attributes\");\n                \n                // Convert to map by extracting key-value pairs (ignoring source)\n                const entryMap = new Map(entries.map(entry => [entry[0], entry[1]]));\n                Assert.equal(\"child_value\", entryMap.get(\"child.key\"), \"Should have child entry\");\n                Assert.equal(\"child_shared\", entryMap.get(\"shared.key\"), \"Should have overridden value in entries\");\n                Assert.equal(\"parent_value1\", entryMap.get(\"parent.key1\"), \"Should have inherited entry from parent container\");\n                \n                // Test forEach with parent container inheritance\n                const forEachResults: { [key: string]: any } = {};\n                childContainer.forEach((key, value) => {\n                    forEachResults[key] = value;\n                });\n                Assert.equal(4, objKeys(forEachResults).length, \"forEach should iterate over all items including parent container attributes\");\n                Assert.equal(\"child_shared\", forEachResults[\"shared.key\"], \"forEach should use overridden value\");\n                Assert.equal(\"parent_value1\", forEachResults[\"parent.key1\"], \"forEach should include inherited value from parent container\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container-to-container inheritance - attributes includes parent container\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create parent container\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"parent.key2\", 42);\n                parentContainer.set(\"shared.key\", \"parent_shared\");\n                \n                // Create child container with parent container as inheritance source\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                \n                childContainer.set(\"child.key\", \"child_value\");\n                childContainer.set(\"shared.key\", \"child_shared\"); // Override parent container value\n                \n                const attributes = childContainer.attributes;\n                Assert.equal(\"parent_value1\", attributes[\"parent.key1\"], \"Should include inherited string from parent container\");\n                Assert.equal(42, attributes[\"parent.key2\"], \"Should include inherited number from parent container\");\n                Assert.equal(\"child_value\", attributes[\"child.key\"], \"Should include child attribute\");\n                Assert.equal(\"child_shared\", attributes[\"shared.key\"], \"Should use overridden value instead of parent container value\");\n                Assert.equal(4, objKeys(attributes).length, \"Should have correct total count including parent container attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container-to-container inheritance - clear behavior\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create parent container\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"parent.key2\", \"parent_value2\");\n                \n                // Create child container with parent container as inheritance source\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                \n                // Verify inherited attributes from parent container are present\n                Assert.equal(2, childContainer.size, \"Should start with 2 inherited attributes from parent container\");\n                Assert.equal(\"parent_value1\", childContainer.get(\"parent.key1\"), \"Should access inherited attribute from parent container\");\n                \n                // Add child attribute\n                childContainer.set(\"child.key\", \"child_value\");\n                Assert.equal(3, childContainer.size, \"Should have 3 total attributes\");\n                \n                // Clear should remove everything including inherited from parent container\n                childContainer.clear();\n                Assert.equal(0, childContainer.size, \"Should have 0 attributes after clear\");\n                Assert.ok(!childContainer.has(\"parent.key1\"), \"Should not have inherited attribute from parent container after clear\");\n                Assert.ok(!childContainer.has(\"child.key\"), \"Should not have child attribute after clear\");\n                Assert.equal(undefined, childContainer.get(\"parent.key1\"), \"Should return undefined for inherited attribute from parent container after clear\");\n                \n                // Verify parent container is unaffected by child clear\n                Assert.equal(2, parentContainer.size, \"Parent container should still have its attributes after child clear\");\n                Assert.equal(\"parent_value1\", parentContainer.get(\"parent.key1\"), \"Parent container should still have its values after child clear\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Multi-level container inheritance - container with IOTelAttributes parent\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create grandparent attributes (IOTelAttributes)\n                const grandparentAttribs: IOTelAttributes = {\n                    \"grandparent.key1\": \"grandparent_value1\",\n                    \"grandparent.key2\": \"grandparent_value2\",\n                    \"shared.all\": \"grandparent_shared\"\n                };\n                \n                // Create parent container with grandparent attributes as inheritance\n                const parentContainer = createAttributeContainer(otelCfg, \"test-grandparent\", grandparentAttribs);\n                parentContainer.set(\"parent.key\", \"parent_value\");\n                parentContainer.set(\"shared.all\", \"parent_shared\"); // Override grandparent\n                \n                // Create child container with parent container as inheritance source\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                childContainer.set(\"child.key\", \"child_value\");\n                childContainer.set(\"shared.all\", \"child_shared\"); // Override parent (and grandparent)\n                \n                // Test access to all levels\n                Assert.equal(\"grandparent_value1\", childContainer.get(\"grandparent.key1\"), \"Should access grandparent attribute through parent container\");\n                Assert.equal(\"grandparent_value2\", childContainer.get(\"grandparent.key2\"), \"Should access second grandparent attribute through parent container\");\n                Assert.equal(\"parent_value\", childContainer.get(\"parent.key\"), \"Should access parent attribute\");\n                Assert.equal(\"child_value\", childContainer.get(\"child.key\"), \"Should access child attribute\");\n                Assert.equal(\"child_shared\", childContainer.get(\"shared.all\"), \"Should get child override value\");\n                \n                // Test size includes all levels\n                Assert.equal(5, childContainer.size, \"Should count attributes from all levels (2 grandparent + 1 parent + 1 child + 1 override)\");\n                \n                // Test iterator includes all levels\n                const allKeys: string[] = [];\n                childContainer.forEach((key, value) => {\n                    allKeys.push(key);\n                });\n                Assert.equal(5, allKeys.length, \"forEach should iterate over all levels\");\n                Assert.ok(allKeys.includes(\"grandparent.key1\"), \"Should include grandparent key1\");\n                Assert.ok(allKeys.includes(\"grandparent.key2\"), \"Should include grandparent key2\");\n                Assert.ok(allKeys.includes(\"parent.key\"), \"Should include parent key\");\n                Assert.ok(allKeys.includes(\"child.key\"), \"Should include child key\");\n                Assert.ok(allKeys.includes(\"shared.all\"), \"Should include overridden key\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Multi-level container inheritance - container with container parent\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create great-grandparent container\n                const greatGrandparentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                greatGrandparentContainer.set(\"great.key\", \"great_value\");\n                greatGrandparentContainer.set(\"shared.multi\", \"great_shared\");\n                \n                // Create grandparent container inheriting from great-grandparent\n                const grandparentContainer = createAttributeContainer(otelCfg, \"test-grandparent\", greatGrandparentContainer);\n                grandparentContainer.set(\"grandparent.key\", \"grandparent_value\");\n                grandparentContainer.set(\"shared.multi\", \"grandparent_shared\"); // Override great-grandparent\n                \n                // Create parent container inheriting from grandparent\n                const parentContainer = createAttributeContainer(otelCfg, \"test-parent\", grandparentContainer);\n                parentContainer.set(\"parent.key\", \"parent_value\");\n                parentContainer.set(\"shared.multi\", \"parent_shared\"); // Override grandparent\n                \n                // Create child container inheriting from parent\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                childContainer.set(\"child.key\", \"child_value\");\n                \n                // Test access through the inheritance chain\n                Assert.equal(\"great_value\", childContainer.get(\"great.key\"), \"Should access great-grandparent through inheritance chain\");\n                Assert.equal(\"grandparent_value\", childContainer.get(\"grandparent.key\"), \"Should access grandparent through inheritance chain\");\n                Assert.equal(\"parent_value\", childContainer.get(\"parent.key\"), \"Should access parent through inheritance chain\");\n                Assert.equal(\"child_value\", childContainer.get(\"child.key\"), \"Should access child attribute\");\n                Assert.equal(\"parent_shared\", childContainer.get(\"shared.multi\"), \"Should get most recent override in chain\");\n                \n                // Test size counts inheritance chain correctly\n                Assert.equal(5, childContainer.size, \"Should count all unique attributes in inheritance chain\");\n                \n                // Test that modifications to ancestor containers are reflected\n                greatGrandparentContainer.set(\"new.great.key\", \"new_great_value\");\n                Assert.equal(\"new_great_value\", childContainer.get(\"new.great.key\"), \"Should access newly added great-grandparent attribute\");\n                Assert.equal(6, childContainer.size, \"Size should increase after ancestor modification\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Mixed inheritance types - IOTelAttributes and container combinations\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Test 1: IOTelAttributes -> Container -> Container\n                const baseAttribs: IOTelAttributes = {\n                    \"base.key1\": \"base_value1\",\n                    \"base.key2\": \"base_value2\",\n                    \"shared.mixed\": \"base_shared\"\n                };\n                \n                const intermediateContainer = createAttributeContainer(otelCfg, \"test-base\", baseAttribs);\n                intermediateContainer.set(\"intermediate.key\", \"intermediate_value\");\n                intermediateContainer.set(\"shared.mixed\", \"intermediate_shared\");\n                \n                const finalContainer = createAttributeContainer(otelCfg, \"test-final\", intermediateContainer);\n                finalContainer.set(\"final.key\", \"final_value\");\n                \n                Assert.equal(\"base_value1\", finalContainer.get(\"base.key1\"), \"Should access base IOTelAttributes through container\");\n                Assert.equal(\"base_value2\", finalContainer.get(\"base.key2\"), \"Should access second base attribute through container\");\n                Assert.equal(\"intermediate_value\", finalContainer.get(\"intermediate.key\"), \"Should access intermediate container attribute\");\n                Assert.equal(\"final_value\", finalContainer.get(\"final.key\"), \"Should access final container attribute\");\n                Assert.equal(\"intermediate_shared\", finalContainer.get(\"shared.mixed\"), \"Should get intermediate override of base\");\n                Assert.equal(5, finalContainer.size, \"Should count all attributes through mixed inheritance\");\n                \n                // Test 2: Container -> IOTelAttributes (should not work - IOTelAttributes can't inherit from container)\n                // This tests that addAttributes works with containers\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                sourceContainer.set(\"source.key1\", \"source_value1\");\n                sourceContainer.set(\"source.key2\", \"source_value2\");\n                \n                const targetContainer = createAttributeContainer(otelCfg, \"test-container\");\n                addAttributes(targetContainer, sourceContainer);\n                \n                Assert.equal(\"source_value1\", targetContainer.get(\"source.key1\"), \"Should copy container attributes via addAttributes\");\n                Assert.equal(\"source_value2\", targetContainer.get(\"source.key2\"), \"Should copy second container attribute via addAttributes\");\n                Assert.equal(2, targetContainer.size, \"Should have correct size after adding container attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container inheritance edge cases\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Test empty parent container\n                const emptyParentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                const childOfEmpty = createAttributeContainer(otelCfg, \"test-child-empty\", emptyParentContainer);\n                \n                Assert.equal(0, childOfEmpty.size, \"Should have 0 size with empty parent container\");\n                childOfEmpty.set(\"child.key\", \"child_value\");\n                Assert.equal(1, childOfEmpty.size, \"Should have 1 size after adding to child with empty parent container\");\n                Assert.equal(\"child_value\", childOfEmpty.get(\"child.key\"), \"Should get child attribute with empty parent container\");\n                \n                // Test parent container that gets modified after child creation\n                const dynamicParent = createAttributeContainer(otelCfg, \"test-container\");\n                const dynamicChild = createAttributeContainer(otelCfg, \"test-dynamic-child\", dynamicParent);\n                \n                Assert.equal(0, dynamicChild.size, \"Should start with 0 size\");\n                \n                // Modify parent after child creation\n                dynamicParent.set(\"dynamic.key\", \"dynamic_value\");\n                Assert.equal(\"dynamic_value\", dynamicChild.get(\"dynamic.key\"), \"Should access dynamically added parent attribute\");\n                Assert.equal(1, dynamicChild.size, \"Should reflect parent modifications in size\");\n                \n                // Test parent container that gets cleared after child creation\n                dynamicParent.clear();\n                Assert.equal(undefined, dynamicChild.get(\"dynamic.key\"), \"Should not access cleared parent attributes\");\n                Assert.equal(0, dynamicChild.size, \"Should reflect parent clear in size\");\n                \n                // Test circular reference prevention (child shouldn't be able to inherit from itself)\n                const selfContainer = createAttributeContainer(otelCfg, \"test-container\");\n                selfContainer.set(\"self.key\", \"self_value\");\n                // Note: This doesn't create actual circular reference as the inheritance is captured at creation time\n                const pseudoCircular = createAttributeContainer(otelCfg, \"test-pseudo-circular\", selfContainer);\n                pseudoCircular.set(\"pseudo.key\", \"pseudo_value\");\n                \n                Assert.equal(\"self_value\", pseudoCircular.get(\"self.key\"), \"Should access parent attribute\");\n                Assert.equal(\"pseudo_value\", pseudoCircular.get(\"pseudo.key\"), \"Should access own attribute\");\n                Assert.equal(2, pseudoCircular.size, \"Should have correct size with pseudo-circular setup\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Container inheritance with addAttributes function\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create source container with inheritance\n                const baseAttribs: IOTelAttributes = {\n                    \"base.key\": \"base_value\"\n                };\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-base\", baseAttribs);\n                sourceContainer.set(\"source.key1\", \"source_value1\");\n                sourceContainer.set(\"source.key2\", \"source_value2\");\n                \n                // Create target container\n                const targetContainer = createAttributeContainer(otelCfg, \"test-container\");\n                targetContainer.set(\"target.existing\", \"existing_value\");\n                \n                // Use addAttributes to copy from source container (which has inheritance)\n                addAttributes(targetContainer, sourceContainer);\n                \n                // Verify all attributes from source container (including inherited) are copied\n                Assert.equal(\"base_value\", targetContainer.get(\"base.key\"), \"Should copy inherited attribute from source container\");\n                Assert.equal(\"source_value1\", targetContainer.get(\"source.key1\"), \"Should copy source container attribute 1\");\n                Assert.equal(\"source_value2\", targetContainer.get(\"source.key2\"), \"Should copy source container attribute 2\");\n                Assert.equal(\"existing_value\", targetContainer.get(\"target.existing\"), \"Should preserve existing target attributes\");\n                Assert.equal(4, targetContainer.size, \"Should have correct size after adding container with inheritance\");\n                \n                // Test addAttributes with container that has container inheritance\n                const grandparentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                grandparentContainer.set(\"grandparent.key\", \"grandparent_value\");\n                \n                const parentContainer = createAttributeContainer(otelCfg, \"test-parent\", grandparentContainer);\n                parentContainer.set(\"parent.key\", \"parent_value\");\n                \n                const newTargetContainer = createAttributeContainer(otelCfg, \"test-container\");\n                addAttributes(newTargetContainer, parentContainer);\n                \n                Assert.equal(\"grandparent_value\", newTargetContainer.get(\"grandparent.key\"), \"Should copy multi-level inherited attribute\");\n                Assert.equal(\"parent_value\", newTargetContainer.get(\"parent.key\"), \"Should copy parent container attribute\");\n                Assert.equal(2, newTargetContainer.size, \"Should have correct size after adding multi-level container\");\n            }\n        });\n\n        // ===== createSnapshotAttributes Tests =====\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Invalid arguments - null and undefined\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n\n                // Test null source\n                const nullResult = createAttributeSnapshot(otelCfg, \"null-test\", null as any);\n                Assert.ok(isAttributeContainer(nullResult), \"Should return container for null source\");\n                Assert.equal(0, nullResult.size, \"Should return empty container for null source\");\n\n                // Test undefined source\n                const undefinedResult = createAttributeSnapshot(otelCfg, \"undefined-test\", undefined as any);\n                Assert.ok(isAttributeContainer(undefinedResult), \"Should return container for undefined source\");\n                Assert.equal(0, undefinedResult.size, \"Should return empty container for undefined source\");\n\n                // Verify containers are functional\n                Assert.ok(nullResult.set(\"test.key\", \"test_value\"), \"Null result container should be functional\");\n                Assert.equal(\"test_value\", nullResult.get(\"test.key\"), \"Null result container should store values\");\n                \n                Assert.ok(undefinedResult.set(\"test.key\", \"test_value\"), \"Undefined result container should be functional\");\n                Assert.equal(\"test_value\", undefinedResult.get(\"test.key\"), \"Undefined result container should store values\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Invalid arguments - primitive types\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n\n                // Test with primitive types (should create empty containers)\n                const stringResult = createAttributeSnapshot(otelCfg, \"string-test\", \"string\" as any);\n                Assert.ok(isAttributeContainer(stringResult), \"Should return container for string\");\n                Assert.equal(0, stringResult.size, \"Should return empty container for string\");\n\n                const numberResult = createAttributeSnapshot(otelCfg, \"number-test\", 123 as any);\n                Assert.ok(isAttributeContainer(numberResult), \"Should return container for number\");\n                Assert.equal(0, numberResult.size, \"Should return empty container for number\");\n\n                const booleanResult = createAttributeSnapshot(otelCfg, \"boolean-test\", true as any);\n                Assert.ok(isAttributeContainer(booleanResult), \"Should return container for boolean\");\n                Assert.equal(0, booleanResult.size, \"Should return empty container for boolean\");\n\n                // Verify containers are functional\n                Assert.ok(stringResult.set(\"test.key\", \"test_value\"), \"String result container should be functional\");\n                Assert.ok(numberResult.set(\"test.key\", \"test_value\"), \"Number result container should be functional\");\n                Assert.ok(booleanResult.set(\"test.key\", \"test_value\"), \"Boolean result container should be functional\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IOTelAttributes - immediate deep copy\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceAttribs: IOTelAttributes = {\n                    \"service.name\": \"test-service\",\n                    \"service.version\": \"1.0.0\",\n                    \"deployment.environment\": \"production\",\n                    \"request.id\": \"req-123\",\n                    \"user.authenticated\": true,\n                    \"request.size\": 1024\n                };\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"iotel-snapshot\", sourceAttribs);\n\n                // Verify all attributes are copied\n                Assert.ok(isAttributeContainer(snapshotContainer), \"Should return attribute container\");\n                Assert.equal(6, snapshotContainer.size, \"Should have all source attributes\");\n                Assert.equal(\"test-service\", snapshotContainer.get(\"service.name\"), \"Should copy string attribute\");\n                Assert.equal(\"1.0.0\", snapshotContainer.get(\"service.version\"), \"Should copy version string\");\n                Assert.equal(\"production\", snapshotContainer.get(\"deployment.environment\"), \"Should copy environment\");\n                Assert.equal(\"req-123\", snapshotContainer.get(\"request.id\"), \"Should copy request ID\");\n                Assert.equal(true, snapshotContainer.get(\"user.authenticated\"), \"Should copy boolean attribute\");\n                Assert.equal(1024, snapshotContainer.get(\"request.size\"), \"Should copy number attribute\");\n\n                // Verify immutability - changes to source don't affect copy\n                sourceAttribs[\"service.name\"] = \"modified-service\";\n                sourceAttribs[\"new.key\"] = \"new_value\";\n                delete sourceAttribs[\"request.id\"];\n\n                Assert.equal(\"test-service\", snapshotContainer.get(\"service.name\"), \"Should remain unchanged after source modification\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.key\"), \"Should not have new key added to source\");\n                Assert.equal(\"req-123\", snapshotContainer.get(\"request.id\"), \"Should still have deleted key\");\n                Assert.equal(6, snapshotContainer.size, \"Size should remain unchanged after source modifications\");\n\n                // Verify the snapshot container can be modified independently\n                Assert.ok(snapshotContainer.set(\"snapshot.key\", \"snapshot_value\"), \"Should be able to add to snapshot container\");\n                Assert.equal(\"snapshot_value\", snapshotContainer.get(\"snapshot.key\"), \"Should get newly added attribute\");\n                Assert.equal(7, snapshotContainer.size, \"Size should increase after adding to snapshot container\");\n                Assert.equal(undefined, sourceAttribs[\"snapshot.key\"], \"Source should not have snapshot container additions\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IOTelAttributes - empty and single attribute\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n\n                // Test empty attributes\n                const emptyAttribs: IOTelAttributes = {};\n                const emptySnapshot = createAttributeSnapshot(otelCfg, \"empty-snapshot\", emptyAttribs);\n                Assert.equal(0, emptySnapshot.size, \"Should create empty container for empty attributes\");\n                \n                // Verify independence\n                emptyAttribs[\"added.later\"] = \"added_value\";\n                Assert.equal(0, emptySnapshot.size, \"Empty snapshot should remain empty after source modification\");\n                Assert.equal(undefined, emptySnapshot.get(\"added.later\"), \"Empty snapshot should not have added attributes\");\n\n                // Test single attribute\n                const singleAttrib: IOTelAttributes = { \"single.key\": \"single_value\" };\n                const singleSnapshot = createAttributeSnapshot(otelCfg, \"single-snapshot\", singleAttrib);\n                Assert.equal(1, singleSnapshot.size, \"Should have single attribute\");\n                Assert.equal(\"single_value\", singleSnapshot.get(\"single.key\"), \"Should get single attribute value\");\n\n                // Verify independence\n                singleAttrib[\"single.key\"] = \"modified_value\";\n                singleAttrib[\"second.key\"] = \"second_value\";\n                Assert.equal(\"single_value\", singleSnapshot.get(\"single.key\"), \"Single snapshot should retain original value\");\n                Assert.equal(undefined, singleSnapshot.get(\"second.key\"), \"Single snapshot should not have added attributes\");\n                Assert.equal(1, singleSnapshot.size, \"Single snapshot size should remain 1\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IOTelAttributes - complex hierarchical keys\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const complexAttribs: IOTelAttributes = {\n                    \"http.request.method\": \"GET\",\n                    \"http.request.url\": \"https://api.example.com/users\",\n                    \"http.request.headers.user-agent\": \"Test-Agent/1.0\",\n                    \"http.request.headers.authorization\": \"Bearer token123\",\n                    \"http.response.status_code\": 200,\n                    \"http.response.headers.content-type\": \"application/json\",\n                    \"span.attributes.custom.nested.deep.value\": \"deep_nested\",\n                    \"user.session.id\": \"session-456\",\n                    \"user.session.start_time\": \"2023-01-01T00:00:00Z\"\n                };\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"complex-snapshot\", complexAttribs);\n\n                // Verify all hierarchical attributes are copied correctly\n                Assert.equal(9, snapshotContainer.size, \"Should have all complex attributes\");\n                Assert.equal(\"GET\", snapshotContainer.get(\"http.request.method\"), \"Should copy HTTP method\");\n                Assert.equal(\"https://api.example.com/users\", snapshotContainer.get(\"http.request.url\"), \"Should copy HTTP URL\");\n                Assert.equal(\"Test-Agent/1.0\", snapshotContainer.get(\"http.request.headers.user-agent\"), \"Should copy deeply nested header\");\n                Assert.equal(\"Bearer token123\", snapshotContainer.get(\"http.request.headers.authorization\"), \"Should copy auth header\");\n                Assert.equal(200, snapshotContainer.get(\"http.response.status_code\"), \"Should copy status code\");\n                Assert.equal(\"application/json\", snapshotContainer.get(\"http.response.headers.content-type\"), \"Should copy content type\");\n                Assert.equal(\"deep_nested\", snapshotContainer.get(\"span.attributes.custom.nested.deep.value\"), \"Should copy very deep nested value\");\n                Assert.equal(\"session-456\", snapshotContainer.get(\"user.session.id\"), \"Should copy session ID\");\n                Assert.equal(\"2023-01-01T00:00:00Z\", snapshotContainer.get(\"user.session.start_time\"), \"Should copy session start time\");\n\n                // Test immutability with complex modifications\n                complexAttribs[\"http.request.method\"] = \"POST\";\n                complexAttribs[\"http.request.headers.new-header\"] = \"new_value\";\n                delete complexAttribs[\"user.session.start_time\"];\n\n                Assert.equal(\"GET\", snapshotContainer.get(\"http.request.method\"), \"Should retain original HTTP method\");\n                Assert.equal(undefined, snapshotContainer.get(\"http.request.headers.new-header\"), \"Should not have new header\");\n                Assert.equal(\"2023-01-01T00:00:00Z\", snapshotContainer.get(\"user.session.start_time\"), \"Should retain deleted attribute\");\n                Assert.equal(9, snapshotContainer.size, \"Complex snapshot size should remain unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - basic copy-on-change\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set up initial state\n                sourceContainer.set(\"initial.key1\", \"initial_value1\");\n                sourceContainer.set(\"initial.key2\", \"initial_value2\");\n                sourceContainer.set(\"shared.key\", \"original_shared\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"basic-container-snapshot\", sourceContainer);\n\n                // Verify initial state is copied\n                Assert.ok(isAttributeContainer(snapshotContainer), \"Should return attribute container\");\n                Assert.equal(3, snapshotContainer.size, \"Should have all initial attributes\");\n                Assert.equal(\"initial_value1\", snapshotContainer.get(\"initial.key1\"), \"Should have initial key1\");\n                Assert.equal(\"initial_value2\", snapshotContainer.get(\"initial.key2\"), \"Should have initial key2\");\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\"), \"Should have shared key\");\n\n                // Modify source container after snapshot creation\n                sourceContainer.set(\"shared.key\", \"modified_shared\");\n                sourceContainer.set(\"new.key\", \"new_value\");\n\n                // Verify snapshot container shows pre-change values (lazy copy-on-change)\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\"), \"Should retain original shared value due to lazy copy-on-change\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.key\"), \"Should not have new key added to source\");\n                Assert.equal(3, snapshotContainer.size, \"Size should remain unchanged after source modifications\");\n\n                // Verify snapshot container can be modified independently\n                Assert.ok(snapshotContainer.set(\"snapshot.only\", \"snapshot_value\"), \"Should be able to modify snapshot container\");\n                Assert.equal(\"snapshot_value\", snapshotContainer.get(\"snapshot.only\"), \"Should get snapshot-only value\");\n                Assert.equal(4, snapshotContainer.size, \"Snapshot size should increase\");\n                Assert.equal(undefined, sourceContainer.get(\"snapshot.only\"), \"Source should not have snapshot additions\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - with inheritance\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create source container with inheritance\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\",\n                    \"shared.inherited\": \"parent_shared\"\n                };\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                sourceContainer.set(\"source.key\", \"source_value\");\n                sourceContainer.set(\"shared.inherited\", \"source_override\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"inheritance-snapshot\", sourceContainer);\n\n                // Verify all attributes including inherited are captured\n                Assert.equal(4, snapshotContainer.size, \"Should capture all attributes including inherited\");\n                Assert.equal(\"parent_value1\", snapshotContainer.get(\"parent.key1\"), \"Should capture inherited key1\");\n                Assert.equal(\"parent_value2\", snapshotContainer.get(\"parent.key2\"), \"Should capture inherited key2\");\n                Assert.equal(\"source_value\", snapshotContainer.get(\"source.key\"), \"Should capture source key\");\n                Assert.equal(\"source_override\", snapshotContainer.get(\"shared.inherited\"), \"Should capture overridden value\");\n\n                // Modify source container (both own and inherited attributes)\n                sourceContainer.set(\"parent.key1\", \"modified_parent1\");\n                sourceContainer.set(\"source.key\", \"modified_source\");\n                sourceContainer.set(\"new.source.key\", \"new_source_value\");\n\n                // Verify snapshot container retains original state\n                Assert.equal(\"parent_value1\", snapshotContainer.get(\"parent.key1\"), \"Should retain original inherited value\");\n                Assert.equal(\"source_value\", snapshotContainer.get(\"source.key\"), \"Should retain original source value\");\n                Assert.equal(\"source_override\", snapshotContainer.get(\"shared.inherited\"), \"Should retain original override\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.source.key\"), \"Should not have new source attributes\");\n                Assert.equal(4, snapshotContainer.size, \"Size should remain unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - complex inheritance chain\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n\n                // Create a complex inheritance chain\n                const grandparentAttribs: IOTelAttributes = {\n                    \"grandparent.key1\": \"grandparent_value1\",\n                    \"grandparent.key2\": \"grandparent_value2\",\n                    \"shared.multi\": \"grandparent_shared\"\n                };\n\n                const parentContainer = createAttributeContainer(otelCfg, \"test-grandparent\", grandparentAttribs);\n                parentContainer.set(\"parent.key\", \"parent_value\");\n                parentContainer.set(\"shared.multi\", \"parent_override\");\n\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                sourceContainer.set(\"source.key\", \"source_value\");\n                sourceContainer.set(\"shared.multi\", \"source_override\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"complex-inheritance-snapshot\", sourceContainer);\n\n                // Verify full inheritance chain is captured\n                Assert.equal(5, snapshotContainer.size, \"Should capture entire inheritance chain\");\n                Assert.equal(\"grandparent_value1\", snapshotContainer.get(\"grandparent.key1\"), \"Should capture grandparent key1\");\n                Assert.equal(\"grandparent_value2\", snapshotContainer.get(\"grandparent.key2\"), \"Should capture grandparent key2\");\n                Assert.equal(\"parent_value\", snapshotContainer.get(\"parent.key\"), \"Should capture parent key\");\n                Assert.equal(\"source_value\", snapshotContainer.get(\"source.key\"), \"Should capture source key\");\n                Assert.equal(\"source_override\", snapshotContainer.get(\"shared.multi\"), \"Should capture final override\");\n\n                // Modify multiple levels of the inheritance chain\n                parentContainer.set(\"parent.key\", \"modified_parent\");\n                parentContainer.set(\"new.parent.key\", \"new_parent_value\");\n                sourceContainer.set(\"source.key\", \"modified_source\");\n                sourceContainer.set(\"grandparent.key1\", \"modified_grandparent\"); // Override inherited\n                sourceContainer.set(\"new.source.key\", \"new_source_value\");\n\n                // Verify snapshot container retains original state from all levels\n                Assert.equal(\"grandparent_value1\", snapshotContainer.get(\"grandparent.key1\"), \"Should retain original grandparent value\");\n                Assert.equal(\"parent_value\", snapshotContainer.get(\"parent.key\"), \"Should retain original parent value\");\n                Assert.equal(\"source_value\", snapshotContainer.get(\"source.key\"), \"Should retain original source value\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.parent.key\"), \"Should not have new parent attributes\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.source.key\"), \"Should not have new source attributes\");\n                Assert.equal(5, snapshotContainer.size, \"Size should remain unchanged after complex modifications\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - empty container\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const emptyContainer = createAttributeContainer(otelCfg, \"test-container\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"empty-container-snapshot\", emptyContainer);\n\n                // Verify empty state\n                Assert.equal(0, snapshotContainer.size, \"Should create empty snapshot container\");\n                Assert.equal(undefined, snapshotContainer.get(\"any.key\"), \"Should not have any attributes\");\n\n                // Modify source after snapshot creation\n                emptyContainer.set(\"added.later\", \"added_value\");\n                emptyContainer.set(\"another.key\", \"another_value\");\n\n                // Verify snapshot remains empty\n                Assert.equal(0, snapshotContainer.size, \"Snapshot should remain empty\");\n                Assert.equal(undefined, snapshotContainer.get(\"added.later\"), \"Should not have later additions\");\n                Assert.equal(undefined, snapshotContainer.get(\"another.key\"), \"Should not have later additions\");\n\n                // Verify snapshot can be modified independently\n                Assert.ok(snapshotContainer.set(\"snapshot.key\", \"snapshot_value\"), \"Should be able to modify empty snapshot\");\n                Assert.equal(\"snapshot_value\", snapshotContainer.get(\"snapshot.key\"), \"Should get snapshot value\");\n                Assert.equal(1, snapshotContainer.size, \"Snapshot size should increase\");\n                Assert.equal(undefined, emptyContainer.get(\"snapshot.key\"), \"Source should not have snapshot additions\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - source container clear operation\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set up initial state\n                sourceContainer.set(\"key1\", \"value1\");\n                sourceContainer.set(\"key2\", \"value2\");\n                sourceContainer.set(\"key3\", \"value3\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Verify initial state\n                Assert.equal(3, snapshotContainer.size, \"Should have all initial attributes\");\n                Assert.equal(\"value1\", snapshotContainer.get(\"key1\"), \"Should have key1\");\n                Assert.equal(\"value2\", snapshotContainer.get(\"key2\"), \"Should have key2\");\n                Assert.equal(\"value3\", snapshotContainer.get(\"key3\"), \"Should have key3\");\n\n                // Clear source container\n                sourceContainer.clear();\n\n                // Verify snapshot container preserves pre-clear state\n                Assert.equal(3, snapshotContainer.size, \"Should retain all attributes after source clear\");\n                Assert.equal(\"value1\", snapshotContainer.get(\"key1\"), \"Should retain key1 after source clear\");\n                Assert.equal(\"value2\", snapshotContainer.get(\"key2\"), \"Should retain key2 after source clear\");\n                Assert.equal(\"value3\", snapshotContainer.get(\"key3\"), \"Should retain key3 after source clear\");\n\n                // Add new attributes to cleared source\n                sourceContainer.set(\"new.key\", \"new_value\");\n                sourceContainer.set(\"key1\", \"new_value1\"); // Same key, different value\n\n                // Verify snapshot container is unaffected by post-clear additions\n                Assert.equal(3, snapshotContainer.size, \"Size should remain unchanged after post-clear additions\");\n                Assert.equal(\"value1\", snapshotContainer.get(\"key1\"), \"Should retain original key1 value\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.key\"), \"Should not have post-clear additions\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - with inherited container that changes\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create parent container that will be modified\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"parent.key2\", \"parent_value2\");\n\n                // Create source container with parent inheritance\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                sourceContainer.set(\"source.key\", \"source_value\");\n                sourceContainer.set(\"parent.key1\", \"source_override\"); // Override parent\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Verify initial state includes inheritance\n                Assert.equal(3, snapshotContainer.size, \"Should have all attributes including inherited\");\n                Assert.equal(\"source_override\", snapshotContainer.get(\"parent.key1\"), \"Should have source override\");\n                Assert.equal(\"parent_value2\", snapshotContainer.get(\"parent.key2\"), \"Should have inherited parent key2\");\n                Assert.equal(\"source_value\", snapshotContainer.get(\"source.key\"), \"Should have source key\");\n\n                // Modify parent container after snapshot creation\n                parentContainer.set(\"parent.key1\", \"modified_parent1\");\n                parentContainer.set(\"parent.key2\", \"modified_parent2\");\n                parentContainer.set(\"new.parent.key\", \"new_parent_value\");\n\n                // Modify source container\n                sourceContainer.set(\"source.key\", \"modified_source\");\n                sourceContainer.set(\"new.source.key\", \"new_source_value\");\n\n                // Verify snapshot container retains original state despite parent and source changes\n                Assert.equal(\"source_override\", snapshotContainer.get(\"parent.key1\"), \"Should retain original override\");\n                Assert.equal(\"parent_value2\", snapshotContainer.get(\"parent.key2\"), \"Should retain original inherited value\");\n                Assert.equal(\"source_value\", snapshotContainer.get(\"source.key\"), \"Should retain original source value\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.parent.key\"), \"Should not have new parent attributes\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.source.key\"), \"Should not have new source attributes\");\n                Assert.equal(3, snapshotContainer.size, \"Size should remain unchanged\");\n\n                // Clear parent container\n                parentContainer.clear();\n\n                // Verify snapshot container still retains original state\n                Assert.equal(\"source_override\", snapshotContainer.get(\"parent.key1\"), \"Should retain override after parent clear\");\n                Assert.equal(\"parent_value2\", snapshotContainer.get(\"parent.key2\"), \"Should retain inherited value after parent clear\");\n                Assert.equal(\"source_value\", snapshotContainer.get(\"source.key\"), \"Should retain source value after parent clear\");\n                Assert.equal(3, snapshotContainer.size, \"Size should remain unchanged after parent clear\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - multiple snapshot copies\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set up initial state\n                sourceContainer.set(\"shared.key\", \"initial_value\");\n                sourceContainer.set(\"common.attr\", \"common_value\");\n\n                // Create first snapshot copy\n                const snapshot1 = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Modify source\n                sourceContainer.set(\"shared.key\", \"modified_value\");\n                sourceContainer.set(\"new.key\", \"new_value\");\n\n                // Create second snapshot copy after modification\n                const snapshot2 = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Verify both snapshot copies are independent\n                Assert.equal(\"initial_value\", snapshot1.get(\"shared.key\"), \"First snapshot should have initial value\");\n                Assert.equal(\"modified_value\", snapshot2.get(\"shared.key\"), \"Second snapshot should have modified value\");\n                \n                Assert.equal(undefined, snapshot1.get(\"new.key\"), \"First snapshot should not have new key\");\n                Assert.equal(\"new_value\", snapshot2.get(\"new.key\"), \"Second snapshot should have new key\");\n\n                Assert.equal(2, snapshot1.size, \"First snapshot should have 2 attributes\");\n                Assert.equal(3, snapshot2.size, \"Second snapshot should have 3 attributes\");\n\n                // Modify both snapshot copies independently\n                snapshot1.set(\"snapshot1.key\", \"snapshot1_value\");\n                snapshot2.set(\"snapshot2.key\", \"snapshot2_value\");\n\n                // Verify independence\n                Assert.equal(\"snapshot1_value\", snapshot1.get(\"snapshot1.key\"), \"First snapshot should have its own addition\");\n                Assert.equal(undefined, snapshot2.get(\"snapshot1.key\"), \"Second snapshot should not have first's addition\");\n                Assert.equal(undefined, snapshot1.get(\"snapshot2.key\"), \"First snapshot should not have second's addition\");\n                Assert.equal(\"snapshot2_value\", snapshot2.get(\"snapshot2.key\"), \"Second snapshot should have its own addition\");\n\n                Assert.equal(3, snapshot1.size, \"First snapshot size should be 3\");\n                Assert.equal(4, snapshot2.size, \"Second snapshot size should be 4\");\n\n                // Verify source container is unaffected by snapshot modifications\n                Assert.equal(undefined, sourceContainer.get(\"snapshot1.key\"), \"Source should not have first snapshot's addition\");\n                Assert.equal(undefined, sourceContainer.get(\"snapshot2.key\"), \"Source should not have second snapshot's addition\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: IAttributeContainer - iterators work correctly\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set up diverse attribute types\n                sourceContainer.set(\"string.attr\", \"string_value\");\n                sourceContainer.set(\"number.attr\", 42);\n                sourceContainer.set(\"boolean.attr\", true);\n                sourceContainer.set(\"nested.deep.attr\", \"nested_value\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Test keys iterator\n                const keys: string[] = [];\n                const keysIter = snapshotContainer.keys();\n                let keyResult = keysIter.next();\n                while (!keyResult.done) {\n                    keys.push(keyResult.value);\n                    keyResult = keysIter.next();\n                }\n                Assert.equal(4, keys.length, \"Should iterate over all keys\");\n                Assert.ok(keys.includes(\"string.attr\"), \"Should include string attribute key\");\n                Assert.ok(keys.includes(\"number.attr\"), \"Should include number attribute key\");\n                Assert.ok(keys.includes(\"boolean.attr\"), \"Should include boolean attribute key\");\n                Assert.ok(keys.includes(\"nested.deep.attr\"), \"Should include nested attribute key\");\n\n                // Test entries iterator\n                const entries: [string, any, eAttributeFilter][] = [];\n                const entriesIter = snapshotContainer.entries();\n                let entryResult = entriesIter.next();\n                while (!entryResult.done) {\n                    entries.push(entryResult.value);\n                    entryResult = entriesIter.next();\n                }\n                Assert.equal(4, entries.length, \"Should iterate over all entries\");\n                \n                // Convert to map by extracting key-value pairs (ignoring source)\n                const entryMap = new Map(entries.map(entry => [entry[0], entry[1]]));\n                Assert.equal(\"string_value\", entryMap.get(\"string.attr\"), \"Should have correct string entry\");\n                Assert.equal(42, entryMap.get(\"number.attr\"), \"Should have correct number entry\");\n                Assert.equal(true, entryMap.get(\"boolean.attr\"), \"Should have correct boolean entry\");\n                Assert.equal(\"nested_value\", entryMap.get(\"nested.deep.attr\"), \"Should have correct nested entry\");\n\n                // Test values iterator\n                const values: any[] = [];\n                const valuesIter = snapshotContainer.values();\n                let valueResult = valuesIter.next();\n                while (!valueResult.done) {\n                    values.push(valueResult.value);\n                    valueResult = valuesIter.next();\n                }\n                Assert.equal(4, values.length, \"Should iterate over all values\");\n                Assert.ok(values.includes(\"string_value\"), \"Should include string value\");\n                Assert.ok(values.includes(42), \"Should include number value\");\n                Assert.ok(values.includes(true), \"Should include boolean value\");\n                Assert.ok(values.includes(\"nested_value\"), \"Should include nested value\");\n\n                // Test forEach\n                const forEachResults: { [key: string]: any } = {};\n                snapshotContainer.forEach((key, value) => {\n                    forEachResults[key] = value;\n                });\n                Assert.equal(4, objKeys(forEachResults).length, \"forEach should process all attributes\");\n                Assert.equal(\"string_value\", forEachResults[\"string.attr\"], \"forEach should provide correct string value\");\n                Assert.equal(42, forEachResults[\"number.attr\"], \"forEach should provide correct number value\");\n                Assert.equal(true, forEachResults[\"boolean.attr\"], \"forEach should provide correct boolean value\");\n                Assert.equal(\"nested_value\", forEachResults[\"nested.deep.attr\"], \"forEach should provide correct nested value\");\n\n                // Test attributes\n                const attributes = snapshotContainer.attributes;\n                Assert.equal(4, objKeys(attributes).length, \"attributes should include all attributes\");\n                Assert.equal(\"string_value\", attributes[\"string.attr\"], \"attributes should have correct string attribute\");\n                Assert.equal(42, attributes[\"number.attr\"], \"attributes should have correct number attribute\");\n                Assert.equal(true, attributes[\"boolean.attr\"], \"attributes should have correct boolean attribute\");\n                Assert.equal(\"nested_value\", attributes[\"nested.deep.attr\"], \"attributes should have correct nested attribute\");\n\n                // Modify source and verify snapshot iterators are unaffected\n                sourceContainer.set(\"string.attr\", \"modified_string\");\n                sourceContainer.set(\"new.attr\", \"new_value\");\n\n                const postModifyKeys: string[] = [];\n                const postModifyKeysIter = snapshotContainer.keys();\n                let postModifyKeyResult = postModifyKeysIter.next();\n                while (!postModifyKeyResult.done) {\n                    postModifyKeys.push(postModifyKeyResult.value);\n                    postModifyKeyResult = postModifyKeysIter.next();\n                }\n                Assert.equal(4, postModifyKeys.length, \"Should still have 4 keys after source modification\");\n                Assert.ok(!postModifyKeys.includes(\"new.attr\"), \"Should not include new source attribute\");\n\n                const postModifyAttributes = snapshotContainer.attributes;\n                Assert.equal(\"string_value\", postModifyAttributes[\"string.attr\"], \"Should retain original string value\");\n                Assert.equal(undefined, postModifyAttributes[\"new.attr\"], \"Should not have new source attribute\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Mixed types - IOTelAttributes vs IAttributeContainer behavior\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create equivalent data in both forms\n                const sourceAttribs: IOTelAttributes = {\n                    \"service.name\": \"test-service\",\n                    \"service.version\": \"1.0.0\",\n                    \"shared.key\": \"shared_value\"\n                };\n\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                sourceContainer.set(\"service.name\", \"test-service\");\n                sourceContainer.set(\"service.version\", \"1.0.0\");\n                sourceContainer.set(\"shared.key\", \"shared_value\");\n\n                // Create snapshot versions\n                const snapshotFromAttribs = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceAttribs);\n                const snapshotFromContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Verify both have equivalent initial state\n                Assert.equal(3, snapshotFromAttribs.size, \"IOTelAttributes snapshot should have 3 attributes\");\n                Assert.equal(3, snapshotFromContainer.size, \"IAttributeContainer snapshot should have 3 attributes\");\n                \n                Assert.equal(\"test-service\", snapshotFromAttribs.get(\"service.name\"), \"IOTelAttributes snapshot should have service name\");\n                Assert.equal(\"test-service\", snapshotFromContainer.get(\"service.name\"), \"IAttributeContainer snapshot should have service name\");\n                \n                Assert.equal(\"shared_value\", snapshotFromAttribs.get(\"shared.key\"), \"IOTelAttributes snapshot should have shared key\");\n                Assert.equal(\"shared_value\", snapshotFromContainer.get(\"shared.key\"), \"IAttributeContainer snapshot should have shared key\");\n\n                // Modify sources differently\n                sourceAttribs[\"service.name\"] = \"modified-attribs-service\";\n                sourceAttribs[\"attribs.only\"] = \"attribs_only_value\";\n                \n                sourceContainer.set(\"service.name\", \"modified-container-service\");\n                sourceContainer.set(\"container.only\", \"container_only_value\");\n\n                // Verify different immutability behaviors\n                \n                // IOTelAttributes snapshot should be unaffected (immediate copy)\n                Assert.equal(\"test-service\", snapshotFromAttribs.get(\"service.name\"), \"IOTelAttributes snapshot should retain original value\");\n                Assert.equal(undefined, snapshotFromAttribs.get(\"attribs.only\"), \"IOTelAttributes snapshot should not have new attribs\");\n                Assert.equal(3, snapshotFromAttribs.size, \"IOTelAttributes snapshot size should remain 3\");\n\n                // IAttributeContainer snapshot should be unaffected (copy-on-change)\n                Assert.equal(\"test-service\", snapshotFromContainer.get(\"service.name\"), \"IAttributeContainer snapshot should retain original value\");\n                Assert.equal(undefined, snapshotFromContainer.get(\"container.only\"), \"IAttributeContainer snapshot should not have new container attrs\");\n                Assert.equal(3, snapshotFromContainer.size, \"IAttributeContainer snapshot size should remain 3\");\n\n                // Both snapshot containers should function identically for modifications\n                snapshotFromAttribs.set(\"snapshot.attribs\", \"attribs_snapshot_value\");\n                snapshotFromContainer.set(\"snapshot.container\", \"container_snapshot_value\");\n\n                Assert.equal(\"attribs_snapshot_value\", snapshotFromAttribs.get(\"snapshot.attribs\"), \"IOTelAttributes snapshot should store new value\");\n                Assert.equal(\"container_snapshot_value\", snapshotFromContainer.get(\"snapshot.container\"), \"IAttributeContainer snapshot should store new value\");\n                \n                Assert.equal(4, snapshotFromAttribs.size, \"IOTelAttributes snapshot size should increase to 4\");\n                Assert.equal(4, snapshotFromContainer.size, \"IAttributeContainer snapshot size should increase to 4\");\n\n                // Verify sources are unaffected by snapshot modifications\n                Assert.equal(undefined, sourceAttribs[\"snapshot.attribs\"], \"Source attribs should not have snapshot addition\");\n                Assert.equal(undefined, sourceContainer.get(\"snapshot.container\"), \"Source container should not have snapshot addition\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Stress test - large attribute sets\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create large attribute set\n                let largeAttribs = createAttributeContainer(otelCfg, \"largeAttribs\");\n                for (let i = 0; i < 100; i++) {\n                    largeAttribs.set(`attr.${i}.key`, `value_${i}`);\n                    largeAttribs.set(`nested.level1.level2.attr${i}`, i);\n                    largeAttribs.set(`boolean.attr.${i}`, i % 2 === 0);\n                }\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"large-snapshot\", largeAttribs);\n\n                // Verify all attributes are captured\n                Assert.equal(128, snapshotContainer.size, \"Should have all 128 large attributes\");\n                Assert.equal(172, snapshotContainer.droppedAttributes, \"As the size should hanve been limited the dropped count should reflect the excess attributes\");\n                \n                // Spot check various types\n                Assert.equal(\"value_0\", snapshotContainer.get(\"attr.0.key\"), \"Should have first string attribute\");\n                Assert.equal(\"value_42\", snapshotContainer.get(\"attr.42.key\"), \"Should have last string attribute\");\n                Assert.equal(0, snapshotContainer.get(\"nested.level1.level2.attr0\"), \"Should have first number attribute\");\n                Assert.equal(42, snapshotContainer.get(\"nested.level1.level2.attr42\"), \"Should have last number attribute\");\n                Assert.equal(true, snapshotContainer.get(\"boolean.attr.0\"), \"Should have first boolean (true)\");\n                Assert.equal(false, snapshotContainer.get(\"boolean.attr.1\"), \"Should have second boolean (false)\");\n                Assert.equal(false, snapshotContainer.get(\"boolean.attr.41\"), \"Should have second-to-last boolean (false)\");\n\n                // Modify large source\n                for (let i = 0; i < 100; i++) {\n                    largeAttribs.set(`attr.${i}.key`, `modified_value_${i}`);\n                    largeAttribs.set(`new.attr.${i}`, `new_value_${i}`);\n                }\n\n                // Verify snapshot container retains original values\n                Assert.equal(128, snapshotContainer.size, \"Size should remain 128 after large source modification\");\n                Assert.equal(329, snapshotContainer.droppedAttributes, \"As the size should hanve been limited the dropped count should reflect the excess attributes\");\n                Assert.equal(\"value_0\", snapshotContainer.get(\"attr.0.key\"), \"Should retain original first value\");\n                Assert.equal(\"value_42\", snapshotContainer.get(\"attr.42.key\"), \"Should retain original last value\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.attr.0\"), \"Should not have new attributes\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.attr.99\"), \"Should not have new attributes\");\n\n                // Test iterator performance with large set\n                let keyCount = 0;\n                snapshotContainer.forEach((key, value) => {\n                    keyCount++;\n                });\n                Assert.equal(128, keyCount, \"forEach should iterate over all 300 attributes\");\n\n                const attributes = snapshotContainer.attributes;\n                Assert.equal(128, objKeys(attributes).length, \"attributes should return all 300 attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Edge cases - malformed and special inputs\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n\n                // Test with attribute objects that have non-string keys (should be handled gracefully)\n                const weirdAttribs = {\n                    \"normal.key\": \"normal_value\",\n                    123: \"numeric_key_value\", // This may or may not be included depending on implementation\n                    \"\": \"empty_key_value\",\n                    \" \": \"space_key_value\",\n                    \"key with spaces\": \"spaces_value\",\n                    \"key.with.many.dots.in.it\": \"many_dots_value\"\n                } as any;\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"weird-snapshot\", weirdAttribs);\n\n                // Verify normal attributes are handled\n                Assert.equal(\"normal_value\", snapshotContainer.get(\"normal.key\"), \"Should handle normal key\");\n                Assert.equal(\"spaces_value\", snapshotContainer.get(\"key with spaces\"), \"Should handle keys with spaces\");\n                Assert.equal(\"many_dots_value\", snapshotContainer.get(\"key.with.many.dots.in.it\"), \"Should handle keys with many dots\");\n                \n                // Test edge case values\n                const edgeValueAttribs: IOTelAttributes = {\n                    \"null.value\": null as any,\n                    \"undefined.value\": undefined as any,\n                    \"zero.number\": 0,\n                    \"false.boolean\": false,\n                    \"empty.string\": \"\",\n                    \"very.long.string\": \"a\".repeat(1000),\n                    \"negative.number\": -42,\n                    \"float.number\": 3.14159\n                };\n\n                const edgeSnapshotContainer = createAttributeSnapshot(otelCfg, \"edge-snapshot\", edgeValueAttribs);\n\n                // Verify edge case values are handled correctly\n                Assert.equal(null, edgeSnapshotContainer.get(\"null.value\"), \"Should handle null value\");\n                Assert.equal(undefined, edgeSnapshotContainer.get(\"undefined.value\"), \"Should handle undefined value\");\n                Assert.equal(0, edgeSnapshotContainer.get(\"zero.number\"), \"Should handle zero value\");\n                Assert.equal(false, edgeSnapshotContainer.get(\"false.boolean\"), \"Should handle false value\");\n                Assert.equal(\"\", edgeSnapshotContainer.get(\"empty.string\"), \"Should handle empty string\");\n                Assert.equal(\"a\".repeat(1000), edgeSnapshotContainer.get(\"very.long.string\"), \"Should handle very long string\");\n                Assert.equal(-42, edgeSnapshotContainer.get(\"negative.number\"), \"Should handle negative number\");\n                Assert.equal(3.14159, edgeSnapshotContainer.get(\"float.number\"), \"Should handle float number\");\n\n                // Test with array-like object (should create empty container)\n                const arrayLike = [\"item1\", \"item2\", \"item3\"] as any;\n                const arraySnapshotContainer = createAttributeSnapshot(otelCfg, \"array-snapshot\", arrayLike);\n                Assert.equal(0, arraySnapshotContainer.size, \"Should create empty container for array-like input\");\n\n                // Test with function object which has properties assigned\n                const funcObj = function() { return \"test\"; } as any;\n                funcObj.customProp = \"custom_value\";\n                const funcSnapshotContainer = createAttributeSnapshot(otelCfg, \"func-snapshot\", funcObj);\n                Assert.equal(1, funcSnapshotContainer.size, \"Should create container for function input\");\n                Assert.equal(\"custom_value\", funcSnapshotContainer.get(\"customProp\"), \"Should include function property\");\n\n                // Test with function object (should create a container with it's properties)\n                const funcObj2 = function() { return \"test\"; } as any;\n                const func2SnapshotContainer = createAttributeSnapshot(otelCfg, \"func2-snapshot\", funcObj2);\n                Assert.equal(0, func2SnapshotContainer.size, \"Should create empty container for function input\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Lazy copy-on-change with eAttributeFilter behavior\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set up initial state\n                sourceContainer.set(\"original.key1\", \"original_value1\");\n                sourceContainer.set(\"shared.key\", \"original_shared\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Before any source changes, snapshot should access inherited values\n                Assert.equal(\"original_value1\", snapshotContainer.get(\"original.key1\"), \"Should get inherited value\");\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\"), \"Should get inherited shared value\");\n                \n                // Test eAttributeFilter behavior before changes\n                Assert.ok(snapshotContainer.has(\"original.key1\"), \"Should have key (default - includes inherited)\");\n                Assert.ok(!snapshotContainer.has(\"original.key1\", eAttributeFilter.Local), \"Should NOT have key locally before source change\");\n                Assert.ok(snapshotContainer.has(\"original.key1\", eAttributeFilter.Inherited), \"Should have key as inherited before source change\");\n\n                // Now modify the source - this should trigger lazy copy-on-change\n                sourceContainer.set(\"shared.key\", \"modified_shared\");\n                sourceContainer.set(\"new.key\", \"new_value\");\n\n                // After source change, snapshot should preserve original values via local copies\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\"), \"Should retain original shared value after source change\");\n                Assert.equal(undefined, snapshotContainer.get(\"new.key\"), \"Should not have new key added after snapshot\");\n                \n                // Test eAttributeFilter behavior after changes\n                Assert.ok(snapshotContainer.has(\"shared.key\"), \"Should have shared key (default - includes both local and inherited)\");\n                Assert.ok(snapshotContainer.has(\"shared.key\", eAttributeFilter.Local), \"Should have shared key locally after source change (lazy copy)\");\n                Assert.ok(snapshotContainer.has(\"shared.key\", eAttributeFilter.Inherited), \"Should still have an inherited shared key even after copied locally\");\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\"), \"Should return the local copy of shared.key\");\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\", eAttributeFilter.Local), \"Should return the local copy of shared.key\");\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\", eAttributeFilter.LocalOrDeleted), \"Should return the local copy of shared.key\");\n                Assert.equal(\"modified_shared\", snapshotContainer.get(\"shared.key\", eAttributeFilter.Inherited), \"Should return the inherited copy of shared.key\");\n                \n                // Keys that weren't changed should still be inherited\n                Assert.ok(snapshotContainer.has(\"original.key1\"), \"Should still have unchanged key\");\n                Assert.ok(!snapshotContainer.has(\"original.key1\", eAttributeFilter.Local), \"Unchanged key should still NOT be local\");\n                Assert.ok(snapshotContainer.has(\"original.key1\", eAttributeFilter.Inherited), \"Unchanged key should still be inherited\");\n\n                // Test clear operation behavior\n                sourceContainer.clear();\n                \n                // After source clear, all original keys should be copied locally to preserve snapshot\n                Assert.equal(\"original_value1\", snapshotContainer.get(\"original.key1\"), \"Should still have original key1 after source clear\");\n                Assert.equal(\"original_shared\", snapshotContainer.get(\"shared.key\"), \"Should still have original shared after source clear\");\n                \n                // All keys should now be local (copied due to clear operation)\n                Assert.ok(snapshotContainer.has(\"original.key1\", eAttributeFilter.Local), \"Key should be local after source clear\");\n                Assert.ok(!snapshotContainer.has(\"original.key1\", eAttributeFilter.Inherited), \"Key should NOT be inherited after source clear\");\n                Assert.ok(snapshotContainer.has(\"shared.key\", eAttributeFilter.Local), \"Shared key should be local after source clear\");\n                Assert.ok(!snapshotContainer.has(\"shared.key\", eAttributeFilter.Inherited), \"Shared key should NOT be inherited after source clear\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Iterator behavior with source tracking\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                sourceContainer.set(\"inherited.key1\", \"inherited_value1\");\n                sourceContainer.set(\"will.change\", \"original_value\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n                \n                // Add some local keys to snapshot\n                snapshotContainer.set(\"local.key1\", \"local_value1\");\n                \n                // Trigger lazy copy by changing source\n                sourceContainer.set(\"will.change\", \"changed_value\");\n\n                // Collect entries with source information\n                let entries: [string, any, number][] = [];\n                let entriesIter = snapshotContainer.entries();\n                let entryResult = entriesIter.next();\n                while (!entryResult.done) {\n                    entries.push(entryResult.value);\n                    entryResult = entriesIter.next();\n                }\n\n                // Should have 3 entries: 1 inherited + 1 local copy due to change + 1 purely local\n                Assert.equal(3, entries.length, \"Should have 3 entries total\");\n                \n                // Find each entry and verify source\n                let inheritedEntry = entries.find(e => e[0] === \"inherited.key1\");\n                let changedEntry = entries.find(e => e[0] === \"will.change\");\n                let localEntry = entries.find(e => e[0] === \"local.key1\");\n\n                Assert.ok(inheritedEntry, \"Should have inherited entry\");\n                Assert.equal(eAttributeFilter.Inherited, inheritedEntry![2], \"inherited.key1 should be marked as inherited\");\n                \n                Assert.ok(changedEntry, \"Should have changed entry\");\n                Assert.equal(eAttributeFilter.Local, changedEntry![2], \"will.change should be marked as local (lazy copied)\");\n                Assert.equal(\"original_value\", changedEntry![1], \"will.change should have original value\");\n                \n                Assert.ok(localEntry, \"Should have local entry\");\n                Assert.equal(eAttributeFilter.Local, localEntry![2], \"local.key1 should be marked as local\");\n            }\n        });\n\n        // ===== Delete Functionality Tests =====\n\n        this.testCase({\n            name: \"AttributeContainer: Delete functionality - basic delete\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set some attributes\n                Assert.ok(container.set(\"key1\", \"value1\"), \"Should set key1\");\n                Assert.ok(container.set(\"key2\", \"value2\"), \"Should set key2\");\n                Assert.equal(2, container.size, \"Should have 2 attributes\");\n                \n                // Delete one attribute\n                Assert.ok(container.del(\"key1\"), \"Should delete key1\");\n                Assert.ok(!container.has(\"key1\"), \"key1 should not exist after delete\");\n                Assert.equal(undefined, container.get(\"key1\"), \"key1 should return undefined after delete\");\n                Assert.equal(\"value2\", container.get(\"key2\"), \"key2 should still exist\");\n                Assert.equal(1, container.size, \"Should have 1 attribute after delete\");\n                \n                // Try to delete non-existent key\n                Assert.ok(!container.del(\"nonexistent\"), \"Should return false for non-existent key\");\n                \n                // Try to delete already deleted key\n                Assert.ok(!container.del(\"key1\"), \"Should return false for already deleted key\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Delete functionality - delete inherited attribute\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\",\n                    \"shared.key\": \"parent_shared\"\n                };\n                \n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                container.set(\"local.key\", \"local_value\");\n                \n                // Verify initial state\n                Assert.equal(4, container.size, \"Should have 4 attributes (3 inherited + 1 local)\");\n                Assert.equal(\"parent_value1\", container.get(\"parent.key1\"), \"Should get inherited value\");\n                Assert.ok(container.has(\"parent.key1\"), \"Should have inherited key\");\n                \n                // Delete inherited attribute\n                Assert.ok(container.del(\"parent.key1\"), \"Should delete inherited attribute\");\n                Assert.ok(!container.has(\"parent.key1\"), \"Inherited key should not exist after delete\");\n                Assert.equal(undefined, container.get(\"parent.key1\"), \"Deleted inherited key should return undefined\");\n                Assert.equal(3, container.size, \"Size should decrease after deleting inherited key\");\n                \n                // Other inherited attributes should still be accessible\n                Assert.equal(\"parent_value2\", container.get(\"parent.key2\"), \"Other inherited attributes should remain\");\n                Assert.equal(\"local_value\", container.get(\"local.key\"), \"Local attributes should remain\");\n                \n                // Delete should only affect this container, not the source\n                const newContainer = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                Assert.equal(\"parent_value1\", newContainer.get(\"parent.key1\"), \"Source attributes should be unaffected\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Delete functionality - with container inheritance\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"parent.key2\", \"parent_value2\");\n                \n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                childContainer.set(\"child.key\", \"child_value\");\n                \n                // Verify initial state\n                Assert.equal(3, childContainer.size, \"Should have 3 attributes\");\n                Assert.equal(\"parent_value1\", childContainer.get(\"parent.key1\"), \"Should get inherited from parent container\");\n                \n                // Delete inherited attribute from parent container\n                Assert.ok(childContainer.del(\"parent.key1\"), \"Should delete inherited attribute from parent container\");\n                Assert.ok(!childContainer.has(\"parent.key1\"), \"Deleted inherited key should not exist\");\n                Assert.equal(undefined, childContainer.get(\"parent.key1\"), \"Deleted inherited key should return undefined\");\n                Assert.equal(2, childContainer.size, \"Size should decrease\");\n                \n                // Parent container should still have the attribute\n                Assert.equal(\"parent_value1\", parentContainer.get(\"parent.key1\"), \"Parent container should be unaffected\");\n                Assert.equal(2, parentContainer.size, \"Parent container size should be unchanged\");\n                \n                // Child can still access other inherited attributes\n                Assert.equal(\"parent_value2\", childContainer.get(\"parent.key2\"), \"Other inherited attributes should remain\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Delete functionality - iterator excludes deleted inherited keys\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\",\n                    \"parent.key3\": \"parent_value3\"\n                };\n                \n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                container.set(\"local.key\", \"local_value\");\n                \n                // Delete one inherited key\n                Assert.ok(container.del(\"parent.key2\"), \"Should delete inherited key\");\n                \n                // Collect all keys via iterator\n                const keys: string[] = [];\n                container.forEach((key, value) => {\n                    keys.push(key);\n                });\n                \n                Assert.equal(3, keys.length, \"Should iterate over 3 keys (2 inherited + 1 local, excluding deleted)\");\n                Assert.ok(keys.includes(\"parent.key1\"), \"Should include non-deleted inherited key1\");\n                Assert.ok(!keys.includes(\"parent.key2\"), \"Should not include deleted inherited key2\");\n                Assert.ok(keys.includes(\"parent.key3\"), \"Should include non-deleted inherited key3\");\n                Assert.ok(keys.includes(\"local.key\"), \"Should include local key\");\n                \n                // Test entries iterator\n                const entries: [string, any, eAttributeFilter][] = [];\n                const entriesIter = container.entries();\n                let result = entriesIter.next();\n                while (!result.done) {\n                    entries.push(result.value);\n                    result = entriesIter.next();\n                }\n                \n                Assert.equal(3, entries.length, \"entries() should return 3 entries\");\n                const entryKeys = entries.map(e => e[0]);\n                Assert.ok(!entryKeys.includes(\"parent.key2\"), \"entries() should not include deleted inherited key\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Delete functionality - clear doesn't affect deleted key tracking\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\"\n                };\n                \n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                container.set(\"local.key\", \"local_value\");\n                \n                // Delete inherited key\n                Assert.ok(container.del(\"parent.key1\"), \"Should delete inherited key\");\n                Assert.ok(!container.has(\"parent.key1\"), \"Deleted key should not exist\");\n                \n                // Clear container\n                container.clear();\n                Assert.equal(0, container.size, \"Size should be 0 after clear\");\n                \n                // Deleted key tracking should be reset after clear\n                // Re-adding parent attributes should make the key available again\n                const newContainer = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                Assert.equal(\"parent_value1\", newContainer.get(\"parent.key1\"), \"Key should be available in new container\");\n            }\n        });\n\n        // ===== Change Operation Type Tests =====\n\n        this.testCase({\n            name: \"AttributeContainer: Change operations - Add vs Change operations\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const container = createAttributeContainer(otelCfg, \"test-container\");\n                \n                let lastChangeInfo: IAttributeChangeInfo<any> | null = null;\n                const unloadHook = container.listen((changeInfo) => {\n                    lastChangeInfo = changeInfo;\n                });\n                \n                // Test Add operation (new key)\n                Assert.ok(container.set(\"new.key\", \"new_value\"), \"Should add new key\");\n                Assert.ok(lastChangeInfo, \"Should have change info\");\n                Assert.equal(eAttributeChangeOp.Add, lastChangeInfo!.op, \"Should be Add operation for new key\");\n                Assert.equal(\"new.key\", lastChangeInfo!.k, \"Should have correct key\");\n                Assert.equal(\"new_value\", lastChangeInfo!.val, \"Should have new value\");\n                Assert.equal(undefined, lastChangeInfo!.prev, \"Should have no previous value for new key\");\n                \n                // Test Change operation (existing key)\n                lastChangeInfo = null;\n                Assert.ok(container.set(\"new.key\", \"updated_value\"), \"Should update existing key\");\n                Assert.ok(lastChangeInfo, \"Should have change info for update\");\n                Assert.equal(eAttributeChangeOp.Set, lastChangeInfo!.op, \"Should be Set operation for existing key\");\n                Assert.equal(\"new.key\", lastChangeInfo!.k, \"Should have correct key\");\n                Assert.equal(\"updated_value\", lastChangeInfo!.val, \"Should have updated value\");\n                Assert.equal(\"new_value\", lastChangeInfo!.prev, \"Should have previous value\");\n                \n                // Test Delete operation\n                lastChangeInfo = null;\n                Assert.ok(container.del(\"new.key\"), \"Should delete key\");\n                Assert.ok(lastChangeInfo, \"Should have change info for delete\");\n                Assert.equal(eAttributeChangeOp.Delete, lastChangeInfo!.op, \"Should be Delete operation\");\n                Assert.equal(\"new.key\", lastChangeInfo!.k, \"Should have correct key for delete\");\n                Assert.equal(\"updated_value\", lastChangeInfo!.prev, \"Should have previous value for delete\");\n                Assert.equal(undefined, lastChangeInfo!.val, \"Should have no new value for delete\");\n                \n                // Test Clear operation\n                container.set(\"key1\", \"value1\");\n                container.set(\"key2\", \"value2\");\n                lastChangeInfo = null;\n                container.clear();\n                Assert.ok(lastChangeInfo, \"Should have change info for clear\");\n                Assert.equal(eAttributeChangeOp.Clear, lastChangeInfo!.op, \"Should be Clear operation\");\n                Assert.equal(undefined, lastChangeInfo!.k, \"Should have no key for clear\");\n                \n                unloadHook.rm();\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Change operations - with inherited attributes\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"inherited.key\": \"inherited_value\"\n                };\n                \n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                \n                let lastChangeInfo: IAttributeChangeInfo<any> | null = null;\n                const unloadHook = container.listen((changeInfo) => {\n                    lastChangeInfo = changeInfo;\n                });\n                \n                // Test overriding inherited key (should be Add operation since it's new locally)\n                Assert.ok(container.set(\"inherited.key\", \"override_value\"), \"Should override inherited key\");\n                Assert.ok(lastChangeInfo, \"Should have change info\");\n                Assert.equal(eAttributeChangeOp.Set, lastChangeInfo!.op, \"Should be Add operation when overriding inherited key\");\n                Assert.equal(\"inherited.key\", lastChangeInfo!.k, \"Should have correct key\");\n                Assert.equal(\"override_value\", lastChangeInfo!.val, \"Should have override value\");\n                Assert.equal(\"inherited_value\", lastChangeInfo!.prev, \"Should have no previous local value\");\n                \n                // Test changing the local override (should be Change operation)\n                lastChangeInfo = null;\n                Assert.ok(container.set(\"inherited.key\", \"new_override_value\"), \"Should change local override\");\n                Assert.ok(lastChangeInfo, \"Should have change info for change\");\n                Assert.equal(eAttributeChangeOp.Set, lastChangeInfo!.op, \"Should be Change operation for existing local key\");\n                Assert.equal(\"inherited.key\", lastChangeInfo!.k, \"Should have correct key\");\n                Assert.equal(\"new_override_value\", lastChangeInfo!.val, \"Should have new override value\");\n                Assert.equal(\"override_value\", lastChangeInfo!.prev, \"Should have previous local value\");\n                \n                unloadHook.rm();\n            }\n        });\n\n        // ===== Snapshot Container with Delete Tests =====\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Delete operations - source container delete after snapshot\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set up initial state\n                sourceContainer.set(\"key1\", \"value1\");\n                sourceContainer.set(\"key2\", \"value2\");\n                sourceContainer.set(\"key3\", \"value3\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Verify initial state\n                Assert.equal(3, snapshotContainer.size, \"Should have all initial attributes\");\n                Assert.equal(\"value1\", snapshotContainer.get(\"key1\"), \"Should have key1\");\n                Assert.equal(\"value2\", snapshotContainer.get(\"key2\"), \"Should have key2\");\n\n                // Delete from source container after snapshot creation\n                Assert.ok(sourceContainer.del(\"key1\"), \"Should delete key1 from source\");\n\n                // Verify snapshot container preserves pre-delete state (lazy copy-on-change)\n                Assert.equal(\"value1\", snapshotContainer.get(\"key1\"), \"Should retain original key1 value due to lazy copy-on-change\");\n                Assert.ok(snapshotContainer.has(\"key1\"), \"Should still have key1 due to lazy copy-on-change\");\n                Assert.equal(3, snapshotContainer.size, \"Size should remain unchanged after source delete\");\n\n                // Verify source container shows the deletion\n                Assert.equal(undefined, sourceContainer.get(\"key1\"), \"Source should not have deleted key\");\n                Assert.equal(2, sourceContainer.size, \"Source size should decrease after delete\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Delete operations - snapshot container delete\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const sourceContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Set up initial state\n                sourceContainer.set(\"key1\", \"value1\");\n                sourceContainer.set(\"key2\", \"value2\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Verify initial state\n                Assert.equal(2, snapshotContainer.size, \"Should have all initial attributes\");\n                \n                // Delete from snapshot container\n                Assert.ok(snapshotContainer.del(\"key1\"), \"Should delete key1 from snapshot\");\n                Assert.equal(undefined, snapshotContainer.get(\"key1\"), \"Snapshot should not have deleted key\");\n                Assert.ok(!snapshotContainer.has(\"key1\"), \"Snapshot should not have deleted key\");\n                Assert.equal(1, snapshotContainer.size, \"Snapshot size should decrease after delete\");\n\n                // Verify source container is unaffected\n                Assert.equal(\"value1\", sourceContainer.get(\"key1\"), \"Source should still have key1\");\n                Assert.equal(2, sourceContainer.size, \"Source size should be unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSnapshotAttributes: Delete operations - with inherited attributes\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\"\n                };\n                \n                const sourceContainer = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                sourceContainer.set(\"source.key\", \"source_value\");\n\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"test-snapshot\", sourceContainer);\n\n                // Verify initial state with inheritance\n                Assert.equal(3, snapshotContainer.size, \"Should have all attributes including inherited\");\n                Assert.equal(\"parent_value1\", snapshotContainer.get(\"parent.key1\"), \"Should access inherited attribute\");\n\n                // Delete inherited attribute from source after snapshot\n                Assert.ok(sourceContainer.del(\"parent.key1\"), \"Should delete inherited attribute from source\");\n                \n                // Verify snapshot preserves the inherited attribute\n                Assert.equal(\"parent_value1\", snapshotContainer.get(\"parent.key1\"), \"Snapshot should preserve inherited attribute\");\n                Assert.equal(3, snapshotContainer.size, \"Snapshot size should remain unchanged\");\n\n                // Delete inherited attribute from snapshot directly\n                Assert.ok(snapshotContainer.del(\"parent.key2\"), \"Should delete inherited attribute from snapshot\");\n                Assert.equal(undefined, snapshotContainer.get(\"parent.key2\"), \"Snapshot should not have deleted inherited attribute\");\n                Assert.equal(2, snapshotContainer.size, \"Snapshot size should decrease\");\n\n                // Source should still have the inherited attribute\n                Assert.equal(\"parent_value2\", sourceContainer.get(\"parent.key2\"), \"Source should still have inherited attribute\");\n            }\n        });\n\n        // ===== Edge Case Tests =====\n\n        this.testCase({\n            name: \"AttributeContainer: Delete edge case - inherited key added after deletion\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create parent container that starts empty\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                \n                // Create child container with empty parent\n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                \n                // Create snapshot of child before any keys exist\n                const snapshotContainer = createAttributeSnapshot(otelCfg, \"child-snapshot\", childContainer);\n                \n                // Delete a key that doesn't exist yet (preemptive deletion)\n                Assert.ok(!childContainer.del(\"future.key\"), \"Should not be able to delete non-existent key\");\n                Assert.ok(!childContainer.has(\"future.key\"), \"Child should not have the key after deletion\");\n                \n                // Now add the key to the parent (this is the edge case)\n                parentContainer.set(\"future.key\", \"parent_value\");\n                \n                // Child should still not see the key because it was preemptively deleted\n                Assert.ok(childContainer.has(\"future.key\"), \"Child should still have the key after parent addition as the deletion failed\");\n                Assert.equal(\"parent_value\", childContainer.get(\"future.key\"), \"Child should not get the inherited value\");\n                \n                // Snapshot should also not see the key\n                Assert.ok(!snapshotContainer.has(\"future.key\"), \"Snapshot should not have the key as it didn't exist at the point of creation\");\n                Assert.equal(undefined, snapshotContainer.get(\"future.key\"), \"Snapshot should not get the inherited value\");\n                \n                // Parent should have the key\n                Assert.ok(parentContainer.has(\"future.key\"), \"Parent should have the key\");\n                Assert.equal(\"parent_value\", parentContainer.get(\"future.key\"), \"Parent should get the value\");\n                \n                // New child container should see the inherited key\n                const newChildContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                Assert.ok(newChildContainer.has(\"future.key\"), \"New child should have inherited key\");\n                Assert.equal(\"parent_value\", newChildContainer.get(\"future.key\"), \"New child should get inherited value\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Iterator performance - no extra _find calls\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\",\n                    \"parent.key3\": \"parent_value3\"\n                };\n                \n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                container.set(\"local.key1\", \"local_value1\");\n                \n                // Delete some inherited keys\n                Assert.ok(container.del(\"parent.key2\"), \"Should delete inherited key\");\n                \n                // Iterate through all keys - this should use the optimized deletedKeys tracking\n                const keys: string[] = [];\n                let iterationCount = 0;\n                container.forEach((key, value) => {\n                    keys.push(key);\n                    iterationCount++;\n                });\n                \n                // Should have 3 keys: parent.key1, parent.key3, local.key1 (excluding deleted parent.key2)\n                Assert.equal(3, keys.length, \"Should iterate over correct number of keys\");\n                Assert.equal(3, iterationCount, \"Should iterate exactly 3 times\");\n                Assert.ok(keys.includes(\"parent.key1\"), \"Should include non-deleted inherited key1\");\n                Assert.ok(!keys.includes(\"parent.key2\"), \"Should not include deleted inherited key2\");\n                Assert.ok(keys.includes(\"parent.key3\"), \"Should include non-deleted inherited key3\");\n                Assert.ok(keys.includes(\"local.key1\"), \"Should include local key\");\n                \n                // Test entries iterator as well\n                const entries: [string, any, eAttributeFilter][] = [];\n                const entriesIter = container.entries();\n                let result = entriesIter.next();\n                while (!result.done) {\n                    entries.push(result.value);\n                    result = entriesIter.next();\n                }\n                \n                Assert.equal(3, entries.length, \"entries() should return correct number of entries\");\n                const entryKeys = entries.map(e => e[0]);\n                Assert.ok(!entryKeys.includes(\"parent.key2\"), \"entries() should not include deleted inherited key\");\n            }\n        });\n\n        // ===== Comprehensive Multi-Level Inheritance Tests =====\n\n        this.testCase({\n            name: \"AttributeContainer: Deep inheritance chain - 5 levels with delete operations\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create 5-level inheritance chain\n                const level5Container = createAttributeContainer(otelCfg, \"level5-container\");\n                level5Container.set(\"level5.key\", \"level5_value\");\n                level5Container.set(\"shared.key\", \"level5_shared\");\n                \n                const level4Container = createAttributeContainer(otelCfg, \"level4-container\", level5Container);\n                level4Container.set(\"level4.key\", \"level4_value\");\n                level4Container.set(\"shared.key\", \"level4_shared\"); // Override level5\n                \n                const level3Container = createAttributeContainer(otelCfg, \"level3-container\", level4Container);\n                level3Container.set(\"level3.key\", \"level3_value\");\n                \n                const level2Container = createAttributeContainer(otelCfg, \"level2-container\", level3Container);\n                level2Container.set(\"level2.key\", \"level2_value\");\n                level2Container.set(\"shared.key\", \"level2_shared\"); // Override level4\n                \n                const level1Container = createAttributeContainer(otelCfg, \"level1-container\", level2Container);\n                level1Container.set(\"level1.key\", \"level1_value\");\n                \n                // Verify full inheritance chain\n                Assert.equal(6, level1Container.size, \"Should have 6 attributes from all levels\");\n                Assert.equal(\"level5_value\", level1Container.get(\"level5.key\"), \"Should access level5 attribute\");\n                Assert.equal(\"level4_value\", level1Container.get(\"level4.key\"), \"Should access level4 attribute\");\n                Assert.equal(\"level3_value\", level1Container.get(\"level3.key\"), \"Should access level3 attribute\");\n                Assert.equal(\"level2_value\", level1Container.get(\"level2.key\"), \"Should access level2 attribute\");\n                Assert.equal(\"level1_value\", level1Container.get(\"level1.key\"), \"Should access level1 attribute\");\n                Assert.equal(\"level2_shared\", level1Container.get(\"shared.key\"), \"Should get level2 override of shared key\");\n                \n                // Test delete operations across inheritance chain\n                Assert.ok(level1Container.del(\"level4.key\"), \"Should delete inherited level4 key\");\n                Assert.ok(!level1Container.has(\"level4.key\"), \"level4.key should not exist after delete\");\n                Assert.equal(\"level4_value\", level4Container.get(\"level4.key\"), \"level4 container should still have the key\");\n                Assert.equal(5, level1Container.size, \"Size should decrease after delete\");\n                \n                // Delete shared key that's overridden at current level\n                Assert.ok(level2Container.del(\"shared.key\"), \"Should delete overridden shared key\");\n                Assert.ok(!level2Container.has(\"shared.key\"), \"shared.key should not exist after delete\");\n                Assert.equal(\"level4_shared\", level3Container.get(\"shared.key\"), \"level3 should now see level4 value\");\n                Assert.equal(undefined, level1Container.get(\"shared.key\"), \"level1 should not see the level4 value through inheritance as it was deleted at level 2\");\n                \n                // Test iterator with deleted keys\n                const keys: string[] = [];\n                level1Container.forEach((key, value) => {\n                    keys.push(key);\n                });\n                Assert.equal(4, keys.length, \"Should iterate over 4 remaining keys\");\n                Assert.ok(!keys.includes(\"level4.key\"), \"Should not include deleted level4 key\");\n                Assert.ok(keys.includes(\"level5.key\"), \"Should include level5 key\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Complex inheritance with snapshot containers\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create inheritance chain\n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key1\", \"parent_value1\");\n                parentContainer.set(\"parent.key2\", \"parent_value2\");\n                parentContainer.set(\"shared.key\", \"parent_shared\");\n                \n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                childContainer.set(\"child.key\", \"child_value\");\n                childContainer.set(\"shared.key\", \"child_shared\"); // Override parent\n                \n                // Create snapshot of child (which includes inheritance)\n                const snapshot = createAttributeSnapshot(otelCfg, \"complex-inheritance-snapshot\", childContainer);\n                \n                // Verify snapshot captures full inheritance\n                Assert.equal(4, snapshot.size, \"Snapshot should have all inherited attributes\");\n                Assert.equal(\"parent_value1\", snapshot.get(\"parent.key1\"), \"Snapshot should have parent key1\");\n                Assert.equal(\"child_shared\", snapshot.get(\"shared.key\"), \"Snapshot should have child override\");\n                \n                // Delete inherited key from child\n                Assert.ok(childContainer.del(\"parent.key1\"), \"Should delete inherited key from child\");\n                \n                // Snapshot should preserve original state via lazy copy\n                Assert.equal(\"parent_value1\", snapshot.get(\"parent.key1\"), \"Snapshot should preserve deleted inherited key\");\n                Assert.ok(snapshot.has(\"parent.key1\", eAttributeFilter.Local), \"Deleted key should be copied locally in snapshot\");\n                \n                // Test source filtering in snapshot after delete\n                Assert.ok(!snapshot.has(\"parent.key1\", eAttributeFilter.Inherited), \"Should not appear as inherited after lazy copy\");\n                Assert.ok(snapshot.has(\"parent.key2\", eAttributeFilter.Inherited), \"Non-deleted keys should remain inherited\");\n                \n                // Modify parent after snapshot - snapshot should copy lazily\n                parentContainer.set(\"parent.key2\", \"modified_parent2\");\n                Assert.equal(\"parent_value2\", snapshot.get(\"parent.key2\"), \"Snapshot should preserve original value\");\n                Assert.ok(snapshot.has(\"parent.key2\", eAttributeFilter.Local), \"Modified inherited key should be copied locally\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Circular reference prevention and edge cases\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                const container1 = createAttributeContainer(otelCfg, \"test-container\");\n                container1.set(\"container1.key\", \"value1\");\n                \n                // Test with null/undefined inheritance\n                const containerWithNull = createAttributeContainer(otelCfg, \"test-null\", null as any);\n                Assert.equal(0, containerWithNull.size, \"Should handle null inheritance\");\n                \n                const containerWithUndefined = createAttributeContainer(otelCfg, \"test-undefined\", undefined as any);\n                Assert.equal(0, containerWithUndefined.size, \"Should handle undefined inheritance\");\n                \n                // Test with empty inheritance object\n                const emptyAttribs: IOTelAttributes = {};\n                const containerWithEmpty = createAttributeContainer(otelCfg, \"test-empty-attribs\", emptyAttribs);\n                Assert.equal(0, containerWithEmpty.size, \"Should handle empty inheritance object\");\n                \n                // Test with inheritance object containing undefined/null values\n                const attribsWithNulls: IOTelAttributes = {\n                    \"valid.key\": \"valid_value\",\n                    \"null.key\": null as any,\n                    \"undefined.key\": undefined as any,\n                    \"empty.string\": \"\",\n                    \"zero.value\": 0\n                };\n                \n                const containerWithNulls = createAttributeContainer(otelCfg, \"test-with-nulls\", attribsWithNulls);\n                Assert.equal(5, containerWithNulls.size, \"Should include all inheritance attributes including null/undefined\");\n                Assert.equal(\"valid_value\", containerWithNulls.get(\"valid.key\"), \"Should get valid inherited value\");\n                Assert.equal(null, containerWithNulls.get(\"null.key\"), \"Should get null inherited value\");\n                Assert.equal(undefined, containerWithNulls.get(\"undefined.key\"), \"Should get undefined inherited value\");\n                Assert.equal(\"\", containerWithNulls.get(\"empty.string\"), \"Should get empty string\");\n                Assert.equal(0, containerWithNulls.get(\"zero.value\"), \"Should get zero value\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Performance with large inheritance chains\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create a large inheritance chain\n                let currentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                currentContainer.set(\"root.key\", \"root_value\");\n                \n                // Build 10-level inheritance chain\n                for (let i = 1; i <= 10; i++) {\n                    const newContainer = createAttributeContainer(otelCfg, `level-${i}-container`, currentContainer);\n                    newContainer.set(`level${i}.key`, `level${i}_value`);\n                    newContainer.set(`shared.level${i}`, `shared_value_${i}`);\n                    currentContainer = newContainer;\n                }\n                \n                // Final container should have access to all levels\n                Assert.equal(21, currentContainer.size, \"Should have all attributes from 10-level chain\");\n                Assert.equal(\"root_value\", currentContainer.get(\"root.key\"), \"Should access root attribute\");\n                Assert.equal(\"level5_value\", currentContainer.get(\"level5.key\"), \"Should access middle level\");\n                Assert.equal(\"level10_value\", currentContainer.get(\"level10.key\"), \"Should access top level\");\n                \n                // Test performance of iteration over large inheritance\n                let count = 0;\n                currentContainer.forEach((key, value) => {\n                    count++;\n                });\n                Assert.equal(21, count, \"Should iterate over all inherited attributes\");\n                \n                // Test delete performance in large chain\n                Assert.ok(currentContainer.del(\"level5.key\"), \"Should delete from middle of chain\");\n                Assert.equal(20, currentContainer.size, \"Size should decrease after delete\");\n                \n                // Verify iteration still works correctly after delete\n                count = 0;\n                currentContainer.forEach((key, value) => {\n                    count++;\n                });\n                Assert.equal(20, count, \"Should iterate correctly after delete\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Change listener propagation through inheritance\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                const parentContainer = createAttributeContainer(otelCfg, \"test-container\");\n                parentContainer.set(\"parent.key\", \"parent_value\");\n                \n                const childContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                childContainer.set(\"child.key\", \"child_value\");\n                \n                let childChangeInfo: IAttributeChangeInfo<any> | null = null;\n                const childUnloadHook = childContainer.listen((changeInfo) => {\n                    childChangeInfo = changeInfo;\n                });\n                \n                let parentChangeInfo: IAttributeChangeInfo<any> | null = null;\n                const parentUnloadHook = parentContainer.listen((changeInfo) => {\n                    parentChangeInfo = changeInfo;\n                });\n                \n                // Test parent change propagation to child\n                parentContainer.set(\"parent.key\", \"modified_parent\");\n                Assert.ok(parentChangeInfo, \"Parent should receive change notification\");\n                Assert.equal(eAttributeChangeOp.Set, parentChangeInfo!.op, \"Parent should see Set operation\");\n                \n                // Child should be notified about parent changes that don't conflict with local keys\n                parentContainer.set(\"new.parent.key\", \"new_parent_value\");\n                Assert.ok(childChangeInfo, \"Child should receive notification for non-conflicting parent change\");\n                \n                // Test parent clear propagation\n                childChangeInfo = null;\n                parentContainer.clear();\n                Assert.ok(childChangeInfo, \"Child should receive clear notification\");\n                Assert.equal(eAttributeChangeOp.Clear, childChangeInfo!.op, \"Child should see Clear operation\");\n                \n                // Test delete operations\n                parentContainer.set(\"parent.key\", \"restored_value\");\n                childChangeInfo = null;\n                Assert.ok(parentContainer.del(\"parent.key\"), \"Should delete parent key\");\n                Assert.ok(childChangeInfo, \"Child should receive delete notification\");\n                Assert.equal(eAttributeChangeOp.Delete, childChangeInfo!.op, \"Child should see Delete operation\");\n                \n                childUnloadHook.rm();\n                parentUnloadHook.rm();\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Edge case - delete non-existent keys with inheritance\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                const parentAttribs: IOTelAttributes = {\n                    \"parent.key1\": \"parent_value1\",\n                    \"parent.key2\": \"parent_value2\"\n                };\n                \n                const container = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                \n                // Test deleting non-existent key that doesn't exist anywhere\n                Assert.ok(!container.del(\"completely.nonexistent\"), \"Should return false for completely non-existent key\");\n                \n                // Test deleting inherited key (should return true and mark as deleted)\n                Assert.ok(container.del(\"parent.key1\"), \"Should return true for deleting inherited key\");\n                Assert.ok(!container.has(\"parent.key1\"), \"Inherited key should not exist after delete\");\n                \n                // Test deleting already deleted inherited key\n                Assert.ok(!container.del(\"parent.key1\"), \"Should return false for already deleted inherited key\");\n                \n                // Test deleting key that might be added to parent later (edge case)\n                Assert.ok(!container.del(\"future.key\"), \"Should return false for future key that doesn't exist yet\");\n                \n                // Add the key to parent after deletion mark\n                const parentContainer = createAttributeContainer(otelCfg, \"test-with-inheritance\", parentAttribs);\n                const newChildContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                \n                // Delete a key that doesn't exist yet\n                Assert.ok(!newChildContainer.del(\"future.added.key\"), \"Should return false for non-existent key\");\n                \n                // Add the key to parent after child marked it as deleted\n                parentContainer.set(\"future.added.key\", \"future_value\");\n                \n                // Child should still not see the key due to pre-deletion\n                Assert.ok(newChildContainer.has(\"future.added.key\"), \"Child should see key added even though we attempted to delete prior to it existing\");\n                Assert.equal(\"future_value\", newChildContainer.get(\"future.added.key\"), \"Child should return value for prior deleted key\");\n                \n                // But new containers should see it\n                const anotherChildContainer = createAttributeContainer(otelCfg, \"test-child\", parentContainer);\n                Assert.equal(\"future_value\", anotherChildContainer.get(\"future.added.key\"), \"New child should see parent key\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Complex snapshot interactions with deep inheritance\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                \n                // Create complex inheritance\n                const greatGrandparent = createAttributeContainer(otelCfg, \"test-container\");\n                greatGrandparent.set(\"ggp.key\", \"ggp_value\");\n                greatGrandparent.set(\"shared.deep\", \"ggp_shared\");\n                \n                const grandparent = createAttributeContainer(otelCfg, \"grandparent-container\", greatGrandparent);\n                grandparent.set(\"gp.key\", \"gp_value\");\n                grandparent.set(\"shared.deep\", \"gp_shared\");\n                \n                const parent = createAttributeContainer(otelCfg, \"parent-container\", grandparent);\n                parent.set(\"p.key\", \"p_value\");\n                \n                const child = createAttributeContainer(otelCfg, \"child-container\", parent);\n                child.set(\"c.key\", \"c_value\");\n                child.set(\"shared.deep\", \"c_shared\");\n                \n                // Create snapshot of deep inheritance\n                const snapshot = createAttributeSnapshot(otelCfg, \"deep-inheritance-snapshot\", child);\n                \n                // Verify snapshot captures full inheritance chain\n                Assert.equal(5, snapshot.size, \"Snapshot should capture all levels\");\n                Assert.equal(\"ggp_value\", snapshot.get(\"ggp.key\"), \"Should capture great-grandparent\");\n                Assert.equal(\"gp_value\", snapshot.get(\"gp.key\"), \"Should capture grandparent\");\n                Assert.equal(\"p_value\", snapshot.get(\"p.key\"), \"Should capture parent\");\n                Assert.equal(\"c_value\", snapshot.get(\"c.key\"), \"Should capture child\");\n                Assert.equal(\"c_shared\", snapshot.get(\"shared.deep\"), \"Should capture child override\");\n                \n                // Delete at various levels after snapshot\n                Assert.ok(child.del(\"shared.deep\"), \"Child should delete its override\");\n                Assert.equal(undefined, child.get(\"shared.deep\"), \"Child still won't see the grand-parent as it's been deleted\");\n                Assert.ok(grandparent.del(\"gp.key\"), \"Grandparent should delete its key\");\n                greatGrandparent.clear(); // Clear great-grandparent\n                \n                // Snapshot should preserve all original values through lazy copying\n                Assert.equal(\"ggp_value\", snapshot.get(\"ggp.key\"), \"Should preserve ggp key after clear\");\n                Assert.equal(\"gp_value\", snapshot.get(\"gp.key\"), \"Should preserve gp key after delete\");\n                Assert.equal(\"c_shared\", snapshot.get(\"shared.deep\"), \"Should preserve child override after delete\");\n                Assert.equal(5, snapshot.size, \"Snapshot size should remain unchanged\");\n                \n                // Test that child now sees different inheritance chain\n                Assert.equal(undefined, child.get(\"shared.deep\"), \"Child should still won't see grandparent value\");\n                Assert.equal(undefined, child.get(\"gp.key\"), \"Child should not see deleted grandparent key\");\n                Assert.equal(undefined, child.get(\"ggp.key\"), \"Child should not see cleared great-grandparent key\");\n                \n                // Verify source tracking in snapshot after complex changes\n                Assert.ok(snapshot.has(\"shared.deep\", eAttributeFilter.Local), \"shared.deep should be local in snapshot\");\n                Assert.ok(snapshot.has(\"ggp.key\", eAttributeFilter.Local), \"ggp.key should be copied locally in snapshot\");\n                Assert.ok(snapshot.has(\"gp.key\", eAttributeFilter.Local), \"gp.key should be copied locally in snapshot\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - basic functionality without snapshot\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parent = createAttributeContainer(otelCfg, \"parent-container\");\n                \n                // Add some attributes to parent\n                parent.set(\"parent.key\", \"parent-value\");\n                parent.set(\"shared.key\", \"parent-shared\");\n                \n                // Create child without snapshot\n                const child = parent.child(\"test-child\", false);\n                \n                // Verify child container basics\n                Assert.ok(isAttributeContainer(child), \"Child should be valid attribute container\");\n                Assert.notEqual(parent.id, child.id, \"Child should have different ID\");\n                Assert.ok(child.id.includes(\"<=[\"), \"Child ID should indicate it's a child\");\n                Assert.ok(child.id.includes(parent.id), \"Child ID should reference parent ID\");\n                Assert.ok(child.id.includes(\"test-child\"), \"Child ID should include provided name\");\n                \n                // Verify inheritance\n                Assert.equal(\"parent-value\", child.get(\"parent.key\"), \"Child should inherit parent values\");\n                Assert.equal(\"parent-shared\", child.get(\"shared.key\"), \"Child should inherit shared values\");\n                Assert.equal(2, child.size, \"Child size should include inherited attributes\");\n                \n                // Verify child can override parent values\n                Assert.ok(child.set(\"shared.key\", \"child-shared\"), \"Child should be able to override parent\");\n                Assert.equal(\"child-shared\", child.get(\"shared.key\"), \"Child should return overridden value\");\n                Assert.equal(\"parent-shared\", parent.get(\"shared.key\"), \"Parent should retain original value\");\n                \n                // Verify child can add new attributes\n                Assert.ok(child.set(\"child.key\", \"child-value\"), \"Child should be able to add new attributes\");\n                Assert.equal(\"child-value\", child.get(\"child.key\"), \"Child should return new attribute\");\n                Assert.equal(undefined, parent.get(\"child.key\"), \"Parent should not see child-only attributes\");\n                \n                // Verify size calculations\n                Assert.equal(3, child.size, \"Child size should include parent + child attributes\");\n                Assert.equal(2, parent.size, \"Parent size should remain unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - basic functionality with snapshot\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parent = createAttributeContainer(otelCfg, \"parent-container\");\n                \n                // Add some attributes to parent\n                parent.set(\"parent.key\", \"parent-value\");\n                parent.set(\"shared.key\", \"parent-shared\");\n                \n                // Create child with snapshot\n                const child = parent.child(\"test-child\", true);\n                \n                // Verify child container basics\n                Assert.ok(isAttributeContainer(child), \"Child snapshot should be valid attribute container\");\n                Assert.notEqual(parent.id, child.id, \"Child snapshot should have different ID\");\n                Assert.ok(child.id.includes(\"<-@[\"), \"Child ID should indicate it's a snapshot child\");\n                Assert.ok(child.id.includes(parent.id), \"Child ID should reference parent ID\");\n                Assert.ok(child.id.includes(\"test-child\"), \"Child ID should include provided name\");\n                \n                // Verify initial inheritance (snapshot captures current state)\n                Assert.equal(\"parent-value\", child.get(\"parent.key\"), \"Child snapshot should have parent values\");\n                Assert.equal(\"parent-shared\", child.get(\"shared.key\"), \"Child snapshot should have shared values\");\n                Assert.equal(2, child.size, \"Child snapshot size should include captured attributes\");\n                \n                // Verify child can modify without affecting parent\n                Assert.ok(child.set(\"shared.key\", \"child-shared\"), \"Child snapshot should allow modifications\");\n                Assert.equal(\"child-shared\", child.get(\"shared.key\"), \"Child snapshot should return modified value\");\n                Assert.equal(\"parent-shared\", parent.get(\"shared.key\"), \"Parent should retain original value\");\n                \n                // Verify parent changes don't affect snapshot child\n                parent.set(\"parent.key\", \"parent-modified\");\n                parent.set(\"new.key\", \"new-value\");\n                Assert.equal(\"parent-value\", child.get(\"parent.key\"), \"Child snapshot should retain original parent value\");\n                Assert.equal(undefined, child.get(\"new.key\"), \"Child snapshot should not see new parent attributes\");\n                Assert.equal(2, child.size, \"Child snapshot size should remain stable\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - inheritance behavior differences\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parent = createAttributeContainer(otelCfg, \"parent-container\");\n                \n                // Setup initial parent state\n                parent.set(\"base.key\", \"base-value\");\n                parent.set(\"dynamic.key\", \"dynamic-initial\");\n                \n                // Create both types of children\n                const regularChild = parent.child(\"regular\", false);\n                const snapshotChild = parent.child(\"snapshot\", true);\n                \n                // Both should see initial state\n                Assert.equal(\"base-value\", regularChild.get(\"base.key\"), \"Regular child should see initial base value\");\n                Assert.equal(\"base-value\", snapshotChild.get(\"base.key\"), \"Snapshot child should see initial base value\");\n                Assert.equal(\"dynamic-initial\", regularChild.get(\"dynamic.key\"), \"Regular child should see initial dynamic value\");\n                Assert.equal(\"dynamic-initial\", snapshotChild.get(\"dynamic.key\"), \"Snapshot child should see initial dynamic value\");\n                \n                // Modify parent after children created\n                parent.set(\"dynamic.key\", \"dynamic-modified\");\n                parent.set(\"new.key\", \"new-value\");\n                \n                // Regular child should see changes, snapshot should not\n                Assert.equal(\"dynamic-modified\", regularChild.get(\"dynamic.key\"), \"Regular child should see parent modifications\");\n                Assert.equal(\"new-value\", regularChild.get(\"new.key\"), \"Regular child should see new parent attributes\");\n                Assert.equal(3, regularChild.size, \"Regular child size should include new parent attributes\");\n                \n                Assert.equal(\"dynamic-initial\", snapshotChild.get(\"dynamic.key\"), \"Snapshot child should retain original value\");\n                Assert.equal(undefined, snapshotChild.get(\"new.key\"), \"Snapshot child should not see new parent attributes\");\n                Assert.equal(2, snapshotChild.size, \"Snapshot child size should remain stable\");\n                \n                // Delete from parent\n                Assert.ok(parent.del(\"base.key\"), \"Should be able to delete from parent\");\n                Assert.equal(undefined, regularChild.get(\"base.key\"), \"Regular child should see parent deletions\");\n                Assert.equal(\"base-value\", snapshotChild.get(\"base.key\"), \"Snapshot child should retain deleted values\");\n                Assert.equal(2, regularChild.size, \"Regular child size should reflect parent deletions\");\n                Assert.equal(2, snapshotChild.size, \"Snapshot child size should remain stable\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - nested children behavior\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const grandparent = createAttributeContainer(otelCfg, \"grandparent\");\n                \n                // Setup inheritance chain\n                grandparent.set(\"gp.key\", \"gp-value\");\n                grandparent.set(\"shared.key\", \"gp-shared\");\n                \n                // Create regular child from grandparent\n                const parent = grandparent.child(\"parent\", false);\n                parent.set(\"parent.key\", \"parent-value\");\n                parent.set(\"shared.key\", \"parent-shared\"); // Override grandparent\n                \n                // Create both types of grandchildren\n                const regularGrandchild = parent.child(\"regular-gc\", false);\n                const snapshotGrandchild = parent.child(\"snapshot-gc\", true);\n                \n                // Both grandchildren should see the inheritance chain\n                Assert.equal(\"gp-value\", regularGrandchild.get(\"gp.key\"), \"Regular grandchild should see grandparent values\");\n                Assert.equal(\"parent-value\", regularGrandchild.get(\"parent.key\"), \"Regular grandchild should see parent values\");\n                Assert.equal(\"parent-shared\", regularGrandchild.get(\"shared.key\"), \"Regular grandchild should see parent override\");\n                \n                Assert.equal(\"gp-value\", snapshotGrandchild.get(\"gp.key\"), \"Snapshot grandchild should see grandparent values\");\n                Assert.equal(\"parent-value\", snapshotGrandchild.get(\"parent.key\"), \"Snapshot grandchild should see parent values\");\n                Assert.equal(\"parent-shared\", snapshotGrandchild.get(\"shared.key\"), \"Snapshot grandchild should see parent override\");\n                \n                // Modify grandparent after grandchildren created\n                grandparent.set(\"gp.key\", \"gp-modified\");\n                grandparent.set(\"gp.new\", \"gp-new-value\");\n                \n                // Regular grandchild should see changes, snapshot should not\n                Assert.equal(\"gp-modified\", regularGrandchild.get(\"gp.key\"), \"Regular grandchild should see grandparent changes\");\n                Assert.equal(\"gp-new-value\", regularGrandchild.get(\"gp.new\"), \"Regular grandchild should see new grandparent attributes\");\n                \n                Assert.equal(\"gp-value\", snapshotGrandchild.get(\"gp.key\"), \"Snapshot grandchild should retain original grandparent value\");\n                Assert.equal(undefined, snapshotGrandchild.get(\"gp.new\"), \"Snapshot grandchild should not see new grandparent attributes\");\n                \n                // Modify parent after grandchildren created\n                parent.set(\"parent.key\", \"parent-modified\");\n                \n                // Regular grandchild should see parent changes, snapshot should not\n                Assert.equal(\"parent-modified\", regularGrandchild.get(\"parent.key\"), \"Regular grandchild should see parent changes\");\n                Assert.equal(\"parent-value\", snapshotGrandchild.get(\"parent.key\"), \"Snapshot grandchild should retain original parent value\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - child creation from children\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const root = createAttributeContainer(otelCfg, \"root\");\n                \n                root.set(\"root.key\", \"root-value\");\n                \n                // Create first level children\n                const regularChild = root.child(\"regular\", false);\n                const snapshotChild = root.child(\"snapshot\", true);\n                \n                regularChild.set(\"regular.key\", \"regular-value\");\n                snapshotChild.set(\"snapshot.key\", \"snapshot-value\");\n                \n                // Create second level children from each type\n                const regularFromRegular = regularChild.child(\"reg-from-reg\", false);\n                const snapshotFromRegular = regularChild.child(\"snap-from-reg\", true);\n                const regularFromSnapshot = snapshotChild.child(\"reg-from-snap\", false);\n                const snapshotFromSnapshot = snapshotChild.child(\"snap-from-snap\", true);\n                \n                // All should see root value\n                Assert.equal(\"root-value\", regularFromRegular.get(\"root.key\"), \"Regular from regular should see root\");\n                Assert.equal(\"root-value\", snapshotFromRegular.get(\"root.key\"), \"Snapshot from regular should see root\");\n                Assert.equal(\"root-value\", regularFromSnapshot.get(\"root.key\"), \"Regular from snapshot should see root\");\n                Assert.equal(\"root-value\", snapshotFromSnapshot.get(\"root.key\"), \"Snapshot from snapshot should see root\");\n                \n                // Only children of regular parent should see regular parent's values\n                Assert.equal(\"regular-value\", regularFromRegular.get(\"regular.key\"), \"Regular from regular should see regular parent\");\n                Assert.equal(\"regular-value\", snapshotFromRegular.get(\"regular.key\"), \"Snapshot from regular should see regular parent\");\n                Assert.equal(undefined, regularFromSnapshot.get(\"regular.key\"), \"Regular from snapshot should not see regular parent\");\n                Assert.equal(undefined, snapshotFromSnapshot.get(\"regular.key\"), \"Snapshot from snapshot should not see regular parent\");\n                \n                // Only children of snapshot parent should see snapshot parent's values\n                Assert.equal(undefined, regularFromRegular.get(\"snapshot.key\"), \"Regular from regular should not see snapshot parent\");\n                Assert.equal(undefined, snapshotFromRegular.get(\"snapshot.key\"), \"Snapshot from regular should not see snapshot parent\");\n                Assert.equal(\"snapshot-value\", regularFromSnapshot.get(\"snapshot.key\"), \"Regular from snapshot should see snapshot parent\");\n                Assert.equal(\"snapshot-value\", snapshotFromSnapshot.get(\"snapshot.key\"), \"Snapshot from snapshot should see snapshot parent\");\n                \n                // Modify root after all children created\n                root.set(\"root.key\", \"root-modified\");\n                \n                // Regular children should see changes, snapshot children should not\n                Assert.equal(\"root-modified\", regularFromRegular.get(\"root.key\"), \"Regular from regular should see root changes\");\n                Assert.equal(\"root-value\", snapshotFromRegular.get(\"root.key\"), \"Snapshot from regular should retain original root\");\n                Assert.equal(\"root-value\", regularFromSnapshot.get(\"root.key\"), \"Regular from snapshot should see root changes\");\n                Assert.equal(\"root-value\", snapshotFromSnapshot.get(\"root.key\"), \"Snapshot from snapshot should retain original root\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - clear and delete operations\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parent = createAttributeContainer(otelCfg, \"parent\");\n                \n                parent.set(\"parent.key1\", \"value1\");\n                parent.set(\"parent.key2\", \"value2\");\n                parent.set(\"shared.key\", \"parent-shared\");\n                \n                const regularChild = parent.child(\"regular\", false);\n                const snapshotChild = parent.child(\"snapshot\", true);\n                \n                // Both children should see all parent attributes\n                Assert.equal(3, regularChild.size, \"Regular child should see all parent attributes\");\n                Assert.equal(3, snapshotChild.size, \"Snapshot child should see all parent attributes\");\n                \n                // Add child-specific attributes\n                regularChild.set(\"regular.key\", \"regular-value\");\n                snapshotChild.set(\"snapshot.key\", \"snapshot-value\");\n                \n                Assert.equal(4, regularChild.size, \"Regular child size should include child attribute\");\n                Assert.equal(4, snapshotChild.size, \"Snapshot child size should include child attribute\");\n                \n                // Clear parent\n                parent.clear();\n                \n                // After parent.clear(), children still maintain parent connection and see the empty parent\n                Assert.equal(1, regularChild.size, \"Regular child should only have own attributes after parent clear\");\n                Assert.equal(\"regular-value\", regularChild.get(\"regular.key\"), \"Regular child should retain own attributes\");\n                Assert.equal(undefined, regularChild.get(\"parent.key1\"), \"Regular child should not see cleared parent attributes\");\n                \n                // Snapshot child preserves attributes at time of snapshot creation via lazy copying\n                Assert.equal(4, snapshotChild.size, \"Snapshot child should retain all attributes after parent clear\");\n                Assert.equal(\"value1\", snapshotChild.get(\"parent.key1\"), \"Snapshot child should retain parent attributes\");\n                Assert.equal(\"snapshot-value\", snapshotChild.get(\"snapshot.key\"), \"Snapshot child should retain own attributes\");\n                \n                // Clear children - this breaks THEIR parent connections\n                regularChild.clear();\n                snapshotChild.clear();\n                \n                // Both should be empty and lose parent connections\n                Assert.equal(0, regularChild.size, \"Regular child should be empty after clear\");\n                Assert.equal(0, snapshotChild.size, \"Snapshot child should be empty after clear\");\n                \n                // Re-add to parent - children should NOT see it since THEIR clear() removed parent connections\n                parent.set(\"parent.new\", \"new-value\");\n                \n                // Regular child should NOT see new parent attribute after its own clear() removed parent connection\n                Assert.equal(0, regularChild.size, \"Regular child should not see new parent attribute after its own clear\");\n                Assert.equal(undefined, regularChild.get(\"parent.new\"), \"Regular child should not get new parent value after its own clear\");\n                \n                Assert.equal(0, snapshotChild.size, \"Snapshot child should remain empty\");\n                Assert.equal(undefined, snapshotChild.get(\"parent.new\"), \"Snapshot child should not see new parent attributes\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - listener propagation\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parent = createAttributeContainer(otelCfg, \"parent\");\n                \n                parent.set(\"parent.key\", \"parent-value\");\n                \n                const regularChild = parent.child(\"regular\", false);\n                const snapshotChild = parent.child(\"snapshot\", true);\n                \n                let regularChildChanges: IAttributeChangeInfo<any>[] = [];\n                let snapshotChildChanges: IAttributeChangeInfo<any>[] = [];\n                \n                // Add listeners to children\n                const regularHook = regularChild.listen((change) => regularChildChanges.push(change));\n                const snapshotHook = snapshotChild.listen((change) => snapshotChildChanges.push(change));\n                \n                // Modify parent\n                parent.set(\"parent.key\", \"parent-modified\");\n                parent.set(\"parent.new\", \"parent-new\");\n                \n                // Both regular and snapshot children should receive change notifications\n                // Regular children propagate parent changes directly\n                // Snapshot children listen to maintain snapshot state\n                Assert.equal(2, regularChildChanges.length, \"Regular child should receive parent change notifications\");\n                // Snapshots get an extra notification if a parent changes a value and the local snapshot doesn't have the value or\n                // it's different from the value being changed.\n                Assert.equal(4, snapshotChildChanges.length, \"Snapshot child should receive parent change notifications to maintain snapshot state\");\n                \n                // Verify change details for regular child\n                Assert.equal(\"parent.key\", regularChildChanges[0].k, \"First change should be parent.key\");\n                Assert.equal(eAttributeChangeOp.Set, regularChildChanges[0].op, \"First change should be Set operation\");\n                Assert.equal(\"parent.new\", regularChildChanges[1].k, \"Second change should be parent.new\");\n                Assert.equal(eAttributeChangeOp.Add, regularChildChanges[1].op, \"Second change should be Add operation\");\n                \n                // Verify change details for snapshot child (receives notifications to manage snapshot state)\n                Assert.equal(\"parent.key\", snapshotChildChanges[0].k, \"Snapshot child should receive parent.key change\");\n                Assert.equal(eAttributeChangeOp.Set, snapshotChildChanges[0].op, \"Snapshot child should see Set operation\");\n                Assert.equal(\"parent.key\", snapshotChildChanges[1].k, \"Snapshot child should receive 2nd notification for parent.key change\");\n                Assert.equal(eAttributeChangeOp.Set, snapshotChildChanges[1].op, \"Snapshot child should see 2nd Set operation\");\n                // It won't receive any notifications for \"parent.new\" as it didn't exist prior to the snapshot\n                \n                // Modify children directly\n                regularChild.set(\"regular.key\", \"regular-value\");\n                snapshotChild.set(\"snapshot.key\", \"snapshot-value\");\n                \n                // Each child should receive its own change notification\n                Assert.equal(3, regularChildChanges.length, \"Regular child should receive own change\");\n                Assert.equal(5, snapshotChildChanges.length, \"Snapshot child should receive own change\");\n                \n                // Clean up listeners\n                regularHook.rm();\n                snapshotHook.rm();\n                \n                // No more changes should be received after listeners removed\n                parent.set(\"parent.final\", \"final-value\");\n                Assert.equal(3, regularChildChanges.length, \"Regular child should not receive changes after listener removed\");\n                Assert.equal(5, snapshotChildChanges.length, \"Snapshot child should not receive changes after listener removed\");\n            }\n        });\n\n        this.testCase({\n            name: \"AttributeContainer: Child function - clear behavior differences (parent vs child clear)\",\n            test: () => {\n                const otelCfg: IOTelConfig = {};\n                const parent = createAttributeContainer(otelCfg, \"parent\");\n                \n                parent.set(\"parent.key\", \"parent-value\");\n                \n                // Test 1: Parent clear - children maintain connection\n                const regularChild1 = parent.child(\"regular1\", false);\n                const snapshotChild1 = parent.child(\"snapshot1\", true);\n                \n                // Both should see parent initially\n                Assert.equal(1, regularChild1.size, \"Regular child should see parent attribute\");\n                Assert.equal(1, snapshotChild1.size, \"Snapshot child should see parent attribute\");\n                \n                // Parent clears - children still have connection but see empty parent\n                parent.clear();\n                Assert.equal(0, regularChild1.size, \"Regular child should see empty parent after parent clear\");\n                Assert.equal(1, snapshotChild1.size, \"Snapshot child should preserve attributes after parent clear\");\n                \n                // Add new attribute to parent - regular child should see it (connection maintained)\n                parent.set(\"new.key\", \"new-value\");\n                Assert.equal(1, regularChild1.size, \"Regular child should see new parent attribute (connection maintained)\");\n                Assert.equal(\"new-value\", regularChild1.get(\"new.key\"), \"Regular child should get new parent value\");\n                Assert.equal(1, snapshotChild1.size, \"Snapshot child should not see new parent attribute\");\n                \n                // Test 2: Child clear - child loses parent connection\n                const regularChild2 = parent.child(\"regular2\", false);\n                const snapshotChild2 = parent.child(\"snapshot2\", true);\n                \n                // Both should see parent\n                Assert.equal(1, regularChild2.size, \"Regular child2 should see parent attribute\");\n                Assert.equal(1, snapshotChild2.size, \"Snapshot child2 should see parent attribute\");\n                \n                // Children clear themselves - they lose parent connection\n                regularChild2.clear();\n                snapshotChild2.clear();\n                \n                Assert.equal(0, regularChild2.size, \"Regular child2 should be empty after its own clear\");\n                Assert.equal(0, snapshotChild2.size, \"Snapshot child2 should be empty after its own clear\");\n                \n                // Add another attribute to parent - cleared children should NOT see it (connection lost)\n                parent.set(\"another.key\", \"another-value\");\n                Assert.equal(0, regularChild2.size, \"Regular child2 should not see parent additions after its own clear\");\n                Assert.equal(0, snapshotChild2.size, \"Snapshot child2 should not see parent additions after its own clear\");\n                \n                // But the first regular child should still see it (it didn't clear itself)\n                Assert.equal(2, regularChild1.size, \"Regular child1 should see all parent attributes (it didn't clear itself)\");\n                Assert.equal(\"another-value\", regularChild1.get(\"another.key\"), \"Regular child1 should get the latest parent value\");\n            }\n        });\n    }\n}\n\n\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/config/Dynamic.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\nimport { AppInsightsCore } from \"../../../../src/core/AppInsightsCore\";\nimport { _eInternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\nimport { IPlugin, ITelemetryPlugin } from \"../../../../src/interfaces/ai/ITelemetryPlugin\";\nimport { ITelemetryItem } from \"../../../../src/interfaces/ai/ITelemetryItem\";\nimport { BaseTelemetryPlugin } from \"../../../../src/core/BaseTelemetryPlugin\";\nimport { IAppInsightsCore } from \"../../../../src/interfaces/ai/IAppInsightsCore\";\nimport { ITelemetryPluginChain } from \"../../../../src/interfaces/ai/ITelemetryPluginChain\";\nimport { IProcessTelemetryContext } from \"../../../../src/interfaces/ai/IProcessTelemetryContext\";\nimport { OldTrackPlugin, TestChannelPlugin, TestPlugin } from \"../ai/TestPlugins\";\n\nexport class DynamicTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"Dynamic disable: Initialization with plugins and disable shared trackPlugin\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const trackPlugin = new TrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(trackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(trackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                // Disable the shared instance track plugin\n                appInsightsSharedCore.getPlugin(trackPlugin.identifier).setEnabled(false);\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(undefined, (coreChannelPlugin.events[2].data || {}).trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic disable: Initialization with plugins and disable core but not trackPlugin\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const trackPlugin = new TrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(trackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(trackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                appInsightsCore.getPlugin(trackPlugin.identifier).setEnabled(false);\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(undefined, (coreChannelPlugin.events[2].data || {}).trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic disable: Initialization with plugins and disable shared old trackPlugin\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const oldTrackPlugin = new OldTrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier).setEnabled(false);\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(undefined, (coreChannelPlugin.events[2].data || {}).trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic disable: Initialization with plugins and disable core but not old trackPlugin\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const oldTrackPlugin = new OldTrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                appInsightsCore.getPlugin(oldTrackPlugin.identifier).setEnabled(false);\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(undefined, (coreChannelPlugin.events[2].data || {}).trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic unload: Initialization and unload with Channel\",\n            test: () => {\n\n                const samplingPlugin = new TestSamplingPlugin();\n                const channelPlugin = new TestChannelPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                let testSender = appInsightsCore.getPlugin(\"TestSender\");\n                Assert.ok(testSender != null, \"Sender should be returned\");\n\n                Assert.equal(channelPlugin, testSender.plugin, \"The returned plugin should be the instance we passed in\");\n\n                let unloadComplete = false;\n                appInsightsCore.unload(false, () => {\n                    unloadComplete = true;\n                });\n\n                Assert.equal(true, unloadComplete, \"Unload should have been completed synchronously\");\n                Assert.equal(true, channelPlugin.isTearDownInvoked, \"Teardown should have been called\");\n                Assert.equal(false, appInsightsCore.isInitialized(), \"Core should be no longer initialized\");\n                Assert.equal(null, appInsightsCore.getPlugin(\"TestSender\"), \"Sender should no longer be loaded\");\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic unload: Initialization and unload with plugins\",\n            test: () => {\n\n                const samplingPlugin = new TestSamplingPlugin();\n                const channelPlugin = new TestChannelPlugin();\n                const testPlugin = new TestPlugin();\n                const trackPlugin = new TrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin, testPlugin, trackPlugin, samplingPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                let testSender = appInsightsCore.getPlugin(\"TestSender\");\n                Assert.ok(testSender != null, \"Sender should be returned\");\n\n                Assert.equal(channelPlugin, testSender.plugin, \"The returned plugin should be the instance we passed in\");\n                Assert.equal(samplingPlugin, appInsightsCore.getPlugin(samplingPlugin.identifier).plugin, \"Sampling Plugin\");\n                Assert.equal(testPlugin, appInsightsCore.getPlugin(testPlugin.identifier).plugin, \"testPlugin Plugin\");\n                Assert.equal(trackPlugin, appInsightsCore.getPlugin(trackPlugin.identifier).plugin, \"trackPlugin Plugin\");\n\n                let unloadComplete = false;\n                appInsightsCore.unload(false, () => {\n                    unloadComplete = true;\n                });\n\n                Assert.equal(true, unloadComplete, \"Unload should have been completed synchronously\");\n                Assert.equal(true, channelPlugin.isTearDownInvoked, \"Teardown should have been called\");\n                Assert.equal(false, appInsightsCore.isInitialized(), \"Core should be no longer initialized\");\n                Assert.equal(false, trackPlugin.isInitialized(), \"trackPlugin should be no longer initialized\");\n                Assert.equal(null, appInsightsCore.getPlugin(channelPlugin.identifier), \"Sender should no longer be loaded\");\n                Assert.equal(null, appInsightsCore.getPlugin(samplingPlugin.identifier), \"Sampling Plugin\");\n                Assert.equal(null, appInsightsCore.getPlugin(testPlugin.identifier), \"testPlugin Plugin\");\n                Assert.equal(null, appInsightsCore.getPlugin(trackPlugin.identifier), \"trackPlugin Plugin\");\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic remove/unload: Initialization with plugins and unload trackPlugin\",\n            test: () => {\n\n                const samplingPlugin = new TestSamplingPlugin();\n                const channelPlugin = new TestChannelPlugin();\n                const testPlugin = new TestPlugin();\n                const trackPlugin = new TrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\",\n                    loggingLevelConsole: 2\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin, testPlugin, trackPlugin, samplingPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                let testSender = appInsightsCore.getPlugin(\"TestSender\");\n                Assert.ok(testSender != null, \"Sender should be returned\");\n\n                Assert.equal(channelPlugin, testSender.plugin, \"The returned plugin should be the instance we passed in\");\n                Assert.equal(samplingPlugin, appInsightsCore.getPlugin(samplingPlugin.identifier).plugin, \"Sampling Plugin\");\n                Assert.equal(testPlugin, appInsightsCore.getPlugin(testPlugin.identifier).plugin, \"testPlugin Plugin\");\n                Assert.equal(trackPlugin, appInsightsCore.getPlugin(trackPlugin.identifier).plugin, \"trackPlugin Plugin\");\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n                Assert.equal(2, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(1, channelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[1].data.sampled);\n\n                // Unload the track plugin\n                let removed = false;\n                appInsightsCore.getPlugin(trackPlugin.identifier).remove(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Track Plugin should have been removed\");\n\n                // Configuration should not have changed\n                Assert.equal(2, appInsightsCore.logger.consoleLoggingLevel(), \"Validate the Console Logging Level\")\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n                Assert.equal(3, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(undefined, (channelPlugin.events[2].data ||{}).trackPlugin);\n                Assert.equal(null, appInsightsCore.getPlugin(trackPlugin.identifier), \"trackPlugin Plugin\");\n                Assert.equal(true, channelPlugin.events[2].data.sampled);\n\n                let unloadComplete = false;\n                appInsightsCore.unload(false, () => {\n                    unloadComplete = true;\n                });\n\n                Assert.equal(true, unloadComplete, \"Unload should have been completed synchronously\");\n                Assert.equal(true, channelPlugin.isTearDownInvoked, \"Teardown should have been called\");\n                Assert.equal(false, appInsightsCore.isInitialized(), \"Core should be no longer initialized\");\n                Assert.equal(false, trackPlugin.isInitialized(), \"trackPlugin should be no longer initialized\");\n                Assert.equal(null, appInsightsCore.getPlugin(channelPlugin.identifier), \"Sender should no longer be loaded\");\n                Assert.equal(null, appInsightsCore.getPlugin(samplingPlugin.identifier), \"Sampling Plugin\");\n                Assert.equal(null, appInsightsCore.getPlugin(testPlugin.identifier), \"testPlugin Plugin\");\n                Assert.equal(null, appInsightsCore.getPlugin(trackPlugin.identifier), \"trackPlugin Plugin\");\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic remove/add/unload: Initialization with plugins and unload and reload samplingPlugin\",\n            test: () => {\n\n                const samplingPlugin = new TestSamplingPlugin();\n                const channelPlugin = new TestChannelPlugin();\n                const testPlugin = new TestPlugin();\n                const trackPlugin = new TrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin, testPlugin, trackPlugin, samplingPlugin]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                let testSender = appInsightsCore.getPlugin(\"TestSender\");\n                Assert.ok(testSender != null, \"Sender should be returned\");\n\n                Assert.equal(channelPlugin, testSender.plugin, \"The returned plugin should be the instance we passed in\");\n                Assert.equal(samplingPlugin, appInsightsCore.getPlugin(samplingPlugin.identifier).plugin, \"Sampling Plugin\");\n                Assert.equal(testPlugin, appInsightsCore.getPlugin(testPlugin.identifier).plugin, \"testPlugin Plugin\");\n                Assert.equal(trackPlugin, appInsightsCore.getPlugin(trackPlugin.identifier).plugin, \"trackPlugin Plugin\");\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n                Assert.equal(2, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(1, channelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[1].data.sampled);\n\n                // Unload the track plugin\n                let removed = false;\n                appInsightsCore.getPlugin(samplingPlugin.identifier).remove(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Track Plugin should have been removed\");\n                Assert.equal(null, appInsightsCore.getPlugin(samplingPlugin.identifier), \"samplingPlugin Plugin\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n                Assert.equal(3, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(2, channelPlugin.events[2].data.trackPlugin);\n                Assert.equal(undefined, (channelPlugin.events[2].data || {}).sampled);\n\n                let pluginAdded = false;\n                appInsightsCore.addPlugin(samplingPlugin, false, false, (added) => {\n                    pluginAdded = added;\n                });\n\n                Assert.equal(true, pluginAdded, \"sampling plugin should have been re-added\");\n                Assert.equal(samplingPlugin, appInsightsCore.getPlugin(samplingPlugin.identifier).plugin, \"Sampling Plugin should be present again\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent3\"\n                });\n                Assert.equal(4, channelPlugin.events.length, \"We should have a track call - \" + dumpObj(channelPlugin.events));\n                Assert.equal(3, channelPlugin.events[3].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[3].data.sampled);\n\n                let newSamplingPlugin = new TestSamplingPlugin();\n                let replacedPlugin = false;\n                appInsightsCore.addPlugin(newSamplingPlugin, false, false, (added) => {\n                    replacedPlugin = added;\n                });\n\n                Assert.equal(false, replacedPlugin, \"sampling plugin should NOT have been replaced\");\n                Assert.equal(samplingPlugin, appInsightsCore.getPlugin(samplingPlugin.identifier).plugin, \"Sampling Plugin should be present again\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent4\"\n                });\n                Assert.equal(5, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(4, channelPlugin.events[4].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[4].data.sampled);\n\n                replacedPlugin = false;\n                appInsightsCore.addPlugin(newSamplingPlugin, true, false, (added) => {\n                    replacedPlugin = added;\n                });\n\n                Assert.equal(true, replacedPlugin, \"sampling plugin should have been replaced\");\n                Assert.equal(newSamplingPlugin, appInsightsCore.getPlugin(samplingPlugin.identifier).plugin, \"New Sampling Plugin should be present\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent5\"\n                });\n                Assert.equal(6, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(5, channelPlugin.events[5].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[5].data.sampled);\n\n                samplingPlugin.isSampledOut = true;\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent6\"\n                });\n                Assert.equal(7, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(6, channelPlugin.events[6].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[6].data.sampled, \"Should still have been sampled\");\n\n                newSamplingPlugin.isSampledOut = true;\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent7\"\n                });\n                Assert.equal(7, channelPlugin.events.length, \"The event should have been sampled out\");\n                Assert.equal(6, channelPlugin.events[6].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[6].data.sampled, \"Should still have been sampled\");\n\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic shared remove: Initialization with plugins and unload shared trackPlugin only\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const trackPlugin = new TrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(trackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(trackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                // Unload shared instance track plugin\n                let removed = false;\n                appInsightsSharedCore.getPlugin(trackPlugin.identifier).remove(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Shared Track Plugin should have been removed\");\n                Assert.equal(true, trackPlugin.isInitialized(), \"But should not have been un-initialized\");\n\n                Assert.equal(trackPlugin, appInsightsCore.getPlugin(trackPlugin.identifier).plugin, \"The returned plugin should be the same instance\");\n                Assert.equal(null, appInsightsSharedCore.getPlugin(trackPlugin.identifier), \"The returned Shared plugin should not be present\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(3, coreChannelPlugin.events[2].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic shared remove: Initialization with plugins and unload core but not trackPlugin\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const trackPlugin = new TrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), trackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(trackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(trackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(trackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                // Unload shared instance track plugin\n                let removed = false;\n                appInsightsCore.getPlugin(trackPlugin.identifier).remove(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Shared Track Plugin should have been removed\");\n                Assert.equal(false, trackPlugin.isInitialized(), \"But should not have been un-initialized\");\n\n                Assert.equal(null, appInsightsCore.getPlugin(trackPlugin.identifier), \"The returned core plugin should no longer be present\");\n                Assert.equal(trackPlugin, appInsightsSharedCore.getPlugin(trackPlugin.identifier).plugin, \"The returned Shared plugin should be present\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(undefined, (coreChannelPlugin.events[2].data || {}).trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic shared remove: Initialization with plugins and unload shared old trackPlugin only\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const oldTrackPlugin = new OldTrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                // Unload shared instance track plugin\n                let removed = false;\n                appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier).remove(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Shared Track Plugin should have been removed\");\n\n                Assert.equal(oldTrackPlugin, appInsightsCore.getPlugin(oldTrackPlugin.identifier).plugin, \"The returned plugin should be the same instance\");\n                Assert.equal(null, appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier), \"The returned Shared plugin should not be present\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(3, coreChannelPlugin.events[2].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic shared remove: Initialization with plugins and unload core but not old trackPlugin\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const oldTrackPlugin = new OldTrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                // Unload shared instance track plugin\n                let removed = false;\n                appInsightsCore.getPlugin(oldTrackPlugin.identifier).remove(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Shared Track Plugin should have been removed\");\n\n                Assert.equal(null, appInsightsCore.getPlugin(oldTrackPlugin.identifier), \"The returned core plugin should no longer be present\");\n                Assert.equal(oldTrackPlugin, appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier).plugin, \"The returned Shared plugin should be present\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(undefined, (coreChannelPlugin.events[2].data || {}).trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic shared unload: Initialization with plugins and unload shared old trackPlugin only\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const oldTrackPlugin = new OldTrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                // Unload shared instance track plugin\n                let removed = false;\n                appInsightsSharedCore.unload(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Shared Track Plugin should have been removed\");\n\n                Assert.equal(oldTrackPlugin, appInsightsCore.getPlugin(oldTrackPlugin.identifier).plugin, \"The returned plugin should be the same instance\");\n                Assert.equal(null, appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier), \"The returned Shared plugin should not be present\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent2\"\n                });\n\n                Assert.equal(3, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent2\", coreChannelPlugin.events[2].name);\n                Assert.equal(3, coreChannelPlugin.events[2].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[2].data.sampled);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic shared unload: Initialization with plugins and unload core but not old trackPlugin\",\n            test: () => {\n\n                const coreChannelPlugin = new TestChannelPlugin();\n                const sharedChannelPlugin = new TestChannelPlugin();\n\n                const oldTrackPlugin = new OldTrackPlugin();\n\n                const appInsightsCore = new AppInsightsCore();\n                const appInsightsSharedCore = new AppInsightsCore();\n                const config: IConfiguration = {\n                    instrumentationKey: \"09465199-12AA-4124-817F-544738CC7C41\"\n                };\n                try {\n                    appInsightsCore.initialize(config, [coreChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, coreChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[0].data.sampled);\n\n                try {\n                    appInsightsSharedCore.initialize(config, [sharedChannelPlugin, new TestPlugin(), oldTrackPlugin, new TestSamplingPlugin()]);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                // The 2nd usage of the trackPlugin doesn't call initialize so we won't have any additional event (from the initialize of trackPlugin)\n                Assert.equal(0, sharedChannelPlugin.events.length, \"We should have a track call\");\n\n                let testTrackPlugin = appInsightsCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testTrackPlugin != null, \"Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testTrackPlugin.plugin, \"The returned plugin should be the same instance\");\n\n                let testSharedTrackPlugin = appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier);\n                Assert.ok(testSharedTrackPlugin != null, \"Shared Track plugin should be returned\");\n                Assert.equal(oldTrackPlugin, testSharedTrackPlugin.plugin, \"The returned Shared plugin should be the same instance\");\n\n                appInsightsCore.track({\n                    name: \"MyCustomEvent\"\n                });\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent\"\n                });\n\n                Assert.equal(2, coreChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MyCustomEvent\", coreChannelPlugin.events[1].name);\n                Assert.equal(1, coreChannelPlugin.events[1].data.trackPlugin);\n                Assert.equal(true, coreChannelPlugin.events[1].data.sampled);\n\n                Assert.equal(1, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent\", sharedChannelPlugin.events[0].name);\n                Assert.equal(2, sharedChannelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, sharedChannelPlugin.events[0].data.sampled);\n\n                // Unload shared instance track plugin\n                let removed = false;\n                appInsightsCore.unload(false, () => {\n                    removed = true;\n                });\n                Assert.equal(true, removed, \"Shared Track Plugin should have been removed\");\n\n                Assert.equal(null, appInsightsCore.getPlugin(oldTrackPlugin.identifier), \"The returned core plugin should no longer be present\");\n                Assert.equal(oldTrackPlugin, appInsightsSharedCore.getPlugin(oldTrackPlugin.identifier).plugin, \"The returned Shared plugin should be present\");\n\n                appInsightsSharedCore.track({\n                    name: \"MySharedCustomEvent2\"\n                });\n\n                Assert.equal(2, sharedChannelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(\"MySharedCustomEvent2\", sharedChannelPlugin.events[1].name);\n                Assert.equal(undefined, (sharedChannelPlugin.events[1].data || {}).trackPlugin, \"The track plugin should not have been applied to the shared instance\");\n                Assert.equal(true, sharedChannelPlugin.events[1].data.sampled);\n            }\n        });\n    }\n}\n\n/**\n * Test plugin doesn't implement the teardown \"unload\" function\n */\nclass TestSamplingPlugin implements ITelemetryPlugin {\n    public processTelemetry: (env: ITelemetryItem) => void;\n    public initialize: (config: IConfiguration) => void;\n    public identifier: string = \"AzureSamplingPlugin\";\n    /** @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead */\n    public setNextPlugin?: (next: ITelemetryPlugin) => void;\n    public priority: number = 5;\n    public version = \"1.0.31-Beta\";\n    public nextPlugin: ITelemetryPlugin;\n    public isSampledOut: boolean = false;\n    public teardownCalled: boolean = false;\n    private _validateItem = false;\n\n    constructor(validateItem: boolean = false) {\n        this.processTelemetry = this._processTelemetry.bind(this);\n        this.initialize = this._start.bind(this);\n        this.setNextPlugin = this._setNextPlugin.bind(this);\n        this._validateItem = validateItem;\n    }\n\n    public teardown() {\n        this.teardownCalled = true;\n    }\n\n    private _processTelemetry(env: ITelemetryItem) {\n        if (!env) {\n            throw Error(\"Invalid telemetry object\");\n        }\n\n        if (this._validateItem) {\n            Assert.ok(env.baseData);\n            Assert.ok(env.baseType);\n            Assert.ok(env.data);\n            Assert.ok(env.ext);\n            Assert.ok(env.tags);\n        }\n\n        let data = env.data = (env.data || {});\n        data.sampled = true;\n\n        if (!this.isSampledOut) {\n            this.nextPlugin?.processTelemetry(env);\n        }\n    }\n\n    private _start(config: IConfiguration) {\n        if (!config) {\n            throw Error(\"required configuration missing\");\n        }\n\n        const pluginConfig = config.extensions ? config.extensions[this.identifier] : null;\n        this.isSampledOut = pluginConfig ? pluginConfig.isSampledOut : false;\n    }\n\n    private _setNextPlugin(next: ITelemetryPlugin): void {\n        this.nextPlugin = next;\n    }\n}\n\nclass TrackPlugin extends BaseTelemetryPlugin {\n    public identifier: string = \"TrackPlugin\";\n    public version: string = \"1.0.31-Beta\";\n    public priority = 2;\n    public isInitialized: any;\n    private _config: IConfiguration;\n    public index: number = 0;\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) {\n        super.initialize(config, core, extensions, pluginChain)\n        this._config = config;\n        core.track({ name: 'TestEvent1' });\n    }\n\n    public processTelemetry(evt: ITelemetryItem, itemCtx: IProcessTelemetryContext) {\n        let data = evt.data = (evt.data || {});\n        data.trackPlugin = this.index++;\n        itemCtx.processNext(evt);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/config/DynamicConfig.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { eLoggingSeverity, _eInternalMessageId, LoggingSeverity, _InternalMessageId } from \"../../../../src/enums/ai/LoggingEnums\";\nimport { _InternalLogMessage } from \"../../../../src/diagnostics/DiagnosticLogger\";\nimport { IConfigDefaults } from \"../../../../src/interfaces/config/IConfigDefaults\";\nimport { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\nimport { blockDynamicConversion, forceDynamicConversion, getDynamicConfigHandler } from \"../../../../src/config/DynamicSupport\";\nimport { createDynamicConfig, onConfigChange } from \"../../../../src/config/DynamicConfig\";\nimport { arrForEach, dumpObj, isArray, isFunction, objForEachKey, objKeys, isPlainObject, objHasOwn, objDeepFreeze, objDefineProps, strContains } from \"@nevware21/ts-utils\";\nimport { IAppInsightsCore } from \"../../../../src/interfaces/ai/IAppInsightsCore\";\nimport { INotificationManager } from \"../../../../src/interfaces/ai/INotificationManager\";\nimport { IPerfManager } from \"../../../../src/interfaces/ai/IPerfManager\";\nimport { AppInsightsCore, DiagnosticLogger, IDiagnosticLogger, IProcessTelemetryContext } from \"../../../../src/index\";\nimport { ITelemetryItem } from \"../../../../src/interfaces/ai/ITelemetryItem\";\nimport { ITelemetryPluginChain } from \"../../../../src/interfaces/ai/ITelemetryPluginChain\";\nimport { ITelemetryPlugin } from \"../../../../src/interfaces/ai/ITelemetryPlugin\";\nimport { IChannelControls } from \"../../../../src/interfaces/ai/IChannelControls\";\nimport { TestPlugin, TestSamplingPlugin, TrackPlugin } from \"../ai/TestPlugins\";\nimport { STR_CHANNELS, STR_CREATE_PERF_MGR, STR_EXTENSIONS, STR_EXTENSION_CONFIG, UNDEFINED_VALUE } from \"../../../../src/constants/InternalConstants\";\n\nconst coreDefaultConfig: IConfigDefaults<IConfiguration> = objDeepFreeze({\n    cookieCfg: {},\n    [STR_EXTENSIONS]: { rdOnly: true, ref: true, v: [] },\n    [STR_CHANNELS]: { rdOnly: true, ref: true, v:[] },\n    [STR_EXTENSION_CONFIG]: { ref: true, v: {} },\n    [STR_CREATE_PERF_MGR]: UNDEFINED_VALUE,\n    loggingLevelConsole: eLoggingSeverity.DISABLED,\n    diagnosticLogInterval: UNDEFINED_VALUE\n});\n\nconst blockedChannelsDefaultConfig: IConfigDefaults<IConfiguration> = objDeepFreeze({\n    cookieCfg: {},\n    [STR_EXTENSIONS]: { rdOnly: true, ref: true, v: [] },\n    [STR_CHANNELS]: { blkVal: true, rdOnly: true, ref: true, v:[] },\n    [STR_EXTENSION_CONFIG]: { ref: true, v: {} },\n    [STR_CREATE_PERF_MGR]: UNDEFINED_VALUE,\n    loggingLevelConsole: eLoggingSeverity.DISABLED,\n    diagnosticLogInterval: UNDEFINED_VALUE\n});\n\ntype NoRepeats<T extends readonly any[]> = { [M in keyof T]: { [N in keyof T]:\n    N extends M ? never : T[M] extends T[N] ? unknown : never\n}[number] extends never ? T[M] : never }\n\nconst verifyArray = <T>() => <U extends NoRepeats<U> & readonly T[]>(\n    u: (U | [never]) & ([T] extends [U[number]] ? unknown : never)\n) => u;\n\nfunction _expectException(cb: () => void, message: string) {\n    try {\n        cb();\n        Assert.ok(false, \"Expected an exception: \" + (message || \"\"));\n    } catch (e) {\n        Assert.ok(true, message);\n    }\n}\n\nexport class DynamicConfigTests extends AITestClass {\n    _throwInternalEvents: any[] = [];\n    _testLogger: IDiagnosticLogger ;\n\n    public testInitialize() {\n        super.testInitialize();\n\n        this._throwInternalEvents = [];\n        this._testLogger = new DiagnosticLogger({\n            loggingLevelConsole: eLoggingSeverity.DEBUG\n        });\n        this._testLogger.throwInternal = (severity: LoggingSeverity, msgId: _InternalMessageId, msg: string, properties?: Object, isUserAct?: boolean) => {\n                this._throwInternalEvents.push({\n                    severity,\n                    msgId,\n                    msg,\n                    properties,\n                    isUserAct\n                });\n            };\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public testFinishedCleanup() {\n        super.testFinishedCleanup();\n\n        Assert.equal(0, this._throwInternalEvents.length, \"No internal events have been thrown - \" + JSON.stringify(this._throwInternalEvents));\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"Create Dynamic Config - not in place\",\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\",\n                    extensionConfig: {},\n                    extensions: [],\n                    createPerfMgr: createPerfMgr\n                };\n\n                const theDefaults: IConfigDefaults<IConfiguration> = {\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                let dynamicHandler = createDynamicConfig(theConfig, theDefaults, this._testLogger, false);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                Assert.equal(dynamicHandler, getDynamicConfigHandler(dynamicConfig), \"The dynamic handler is returned when using the config to find it\");\n                Assert.equal(dynamicHandler, getDynamicConfigHandler(dynamicHandler), \"The dynamic handler is returned when using itself to find it\");\n                Assert.ok(!!dynamicHandler, \"The config should have a dynamic config handler\");\n                Assert.notEqual(dynamicConfig, theConfig, \"The object should have been applied in-place\");\n                Assert.notEqual(dynamicHandler.cfg, theConfig, \"The handler should point to the config\");\n\n                objForEachKey(theConfig, (key, value) => {\n                    Assert.ok(!getDynamicConfigHandler(value), \"The original value for \\\"\" + key + \"\\\" should not be dynamic - \" + dumpObj(value));\n                    let newValue = dynamicConfig[key];\n                    assertSameValues(value, newValue, \"Check that the resulting property is the same - \" + dumpObj(newValue));\n                });\n\n                objForEachKey(theDefaults, (key, value) => {\n                    Assert.ok(!getDynamicConfigHandler(value), \"The original default value for \" + key + \" should not be dynamic - \" + dumpObj(value));\n                    let newValue = dynamicConfig[key];\n                    assertSameValues(value, newValue, \"Check that the resulting property is the same\");\n                });\n\n                Assert.equal(\"testiKey\", dynamicConfig.instrumentationKey, \"Expect the iKey to be set\");\n                Assert.equal(\"https://localhost:9001\", dynamicConfig.endpointUrl, \"Expect the endpoint to be set\");\n\n                dynamicConfig.instrumentationKey = \"newIkey\";\n                Assert.equal(\"newIkey\", dynamicConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://localhost:9001\", dynamicConfig.endpointUrl, \"Expect the endpoint to be set\");\n\n                dynamicConfig.endpointUrl = \"https://newendpoint.localhost:9001\";\n                Assert.equal(\"newIkey\", dynamicConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://newendpoint.localhost:9001\", dynamicConfig.endpointUrl, \"Expect the endpoint to be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"Create Dynamic Config - in place (default)\",\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\",\n                    extensionConfig: {},\n                    extensions: [],\n                    createPerfMgr: createPerfMgr\n                };\n\n                const theDefaults: IConfigDefaults<IConfiguration> = {\n                    endpointUrl: \"https://localhost:9001\",\n                    cookieCfg: {\n                        enabled: undefined,\n                        domain: \"test\",\n                        path: \"/mypath\"\n                    }\n                };\n\n                let dynamicHandler = createDynamicConfig(theConfig, theDefaults, this._testLogger);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                Assert.equal(dynamicHandler, getDynamicConfigHandler(dynamicConfig), \"The dynamic handler be returned when using the config to find it\");\n                Assert.equal(dynamicHandler, getDynamicConfigHandler(dynamicHandler), \"The dynamic handler be returned when using itself to find it\");\n\n                Assert.ok(!!dynamicHandler, \"The config should have a dynamic config handler\");\n                Assert.equal(dynamicConfig, theConfig, \"The object should have been applied in-place\");\n                Assert.equal(dynamicHandler?.cfg, theConfig, \"The handler should point to the config\");\n\n                objForEachKey(theConfig, (key, value) => {\n                    if (isFunction(value)) {\n                        // functions should not have a handler\n                        Assert.ok(!getDynamicConfigHandler(value), \"The original value for \\\"\" + key + \"\\\" should not be dynamic - \" + dumpObj(value));\n                    } else if (isPlainObject(value) || isArray(value)) {\n                        Assert.ok(getDynamicConfigHandler(value), \"The original value for \\\"\" + key + \"\\\" should dynamic - \" + dumpObj(value));\n                    } else {\n                        // non-objects don't have a handler\n                        Assert.ok(!getDynamicConfigHandler(value), \"The original value for \\\"\" + key + \"\\\" should not be dynamic - \" + dumpObj(value));\n                    }\n\n                    let newValue = dynamicConfig[key];\n                    Assert.strictEqual(value, newValue, \"Check that the resulting property is the same strict value - \" + dumpObj(newValue));\n                    assertSameValues(value, newValue, \"Check that the resulting property is the same - \" + dumpObj(newValue));\n                });\n\n                objForEachKey(theDefaults, (key, value) => {\n                    Assert.ok(!getDynamicConfigHandler(value), \"The original default value for \" + key + \" should never be dynamic - \" + dumpObj(value));\n                    let newValue = dynamicConfig[key];\n                    assertSameValues(value, newValue, \"Check that the resulting property is the same\");\n                });\n\n                Assert.equal(\"testiKey\", theConfig.instrumentationKey, \"Expect the iKey to be set\");\n                Assert.equal(\"https://localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be set\");\n\n                theConfig.instrumentationKey = \"newIkey\";\n                Assert.equal(\"newIkey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be set\");\n\n                theConfig.endpointUrl = \"https://newendpoint.localhost:9001\";\n                Assert.equal(\"newIkey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://newendpoint.localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"Apply Defaults\",\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\",\n                    extensionConfig: []\n                };\n\n                const theDefaults: IConfigDefaults<IConfiguration> = {\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                // Creates a dynamic config as a side-effect\n                let dynamicConfig = createDynamicConfig(theConfig, theDefaults, this._testLogger).cfg;\n\n                // default values should never be changed to dynamic\n                objForEachKey(theDefaults, (key, value) => {\n                    Assert.ok(!getDynamicConfigHandler(value), \"The original default value for \" + key + \" should never be dynamic - \" + dumpObj(value));\n                    let newValue = dynamicConfig[key];\n                    if (isPlainObject(value) || isArray(value)) {\n                        Assert.notStrictEqual(value, newValue, \"The default value should have been copied to just assigned\");\n                    }\n                    assertSameValues(value, newValue, \"Check that the resulting property is the same\");\n                });\n\n                let dynamicHandler = getDynamicConfigHandler(dynamicConfig);\n                Assert.ok(!!dynamicHandler, \"The config should have a dynamic config handler\");\n                Assert.equal(dynamicConfig, theConfig, \"The object should have been applied in-place\");\n                Assert.equal(dynamicHandler?.cfg, theConfig, \"The handler should point to the config\");\n\n                Assert.equal(\"testiKey\", theConfig.instrumentationKey, \"Expect the iKey to be set\");\n                Assert.equal(\"https://localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be set\");\n\n                theConfig.instrumentationKey = \"newIkey\";\n                Assert.equal(\"newIkey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be set\");\n\n                theConfig.endpointUrl = \"https://newendpoint.localhost:9001\";\n                Assert.equal(\"newIkey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://newendpoint.localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"onConfigChange called when changed\",\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\"\n                };\n\n                const theDefaults: IConfigDefaults<IConfiguration> = {\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                let dynamicHandler = createDynamicConfig(theConfig, theDefaults, this._testLogger);\n                let dynamicConfig = dynamicHandler.cfg;\n                Assert.ok(!!dynamicHandler, \"The config should have a dynamic config handler\");\n                Assert.equal(dynamicConfig, theConfig, \"The object should have been applied in-place\");\n                Assert.equal(dynamicHandler?.cfg, theConfig, \"The handler should point to the config\");\n\n                let expectediKey = \"testiKey\";\n                let expectedEndpointUrl = \"https://localhost:9001\";\n                let onChangeCalled = 0;\n                let onChange = onConfigChange(dynamicConfig, (details) => {\n                    onChangeCalled ++;\n                    Assert.equal(theConfig, details.cfg, \"The original config and the details cfg should be the same\");\n                    Assert.equal(expectediKey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                });\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n\n                expectediKey = \"newIKey\";\n                theConfig.instrumentationKey = expectediKey;\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n                dynamicHandler?.notify();\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called again\");\n\n                expectedEndpointUrl = \"https://newendpoint.localhost:9001\";\n                theConfig.endpointUrl = expectedEndpointUrl;\n\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called\");\n                dynamicHandler?.notify();\n                Assert.equal(3, onChangeCalled, \"Expected the onChanged was called again\");\n                Assert.equal(\"newIKey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://newendpoint.localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"onConfigChange only called once even when multiple configs referenced\",\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\"\n                };\n\n                const theDefaults: IConfigDefaults<IConfiguration> = {\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                let dynamicHandler = createDynamicConfig(theConfig, theDefaults, this._testLogger);\n                let dynamicConfig = dynamicHandler.cfg;\n                Assert.ok(!!dynamicHandler, \"The config should have a dynamic config handler\");\n                Assert.equal(dynamicConfig, theConfig, \"The object should have been applied in-place\");\n                Assert.equal(dynamicHandler?.cfg, theConfig, \"The handler should point to the config\");\n\n                let expectediKey = \"testiKey\";\n                let expectedEndpointUrl = \"https://localhost:9001\";\n                let onChangeCalled = 0;\n                let onChange = onConfigChange(dynamicConfig, (details) => {\n                    onChangeCalled ++;\n                    Assert.equal(theConfig, details.cfg, \"The original config and the details cfg should be the same\");\n                    Assert.equal(expectediKey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                });\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n\n                expectediKey = \"newIKey\";\n                theConfig.instrumentationKey = expectediKey;\n\n                expectedEndpointUrl = \"https://newendpoint.localhost:9001\";\n                theConfig.endpointUrl = expectedEndpointUrl;\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was only called once\");\n                dynamicHandler?.notify();\n\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged to have not been called once the 1 additional time\");\n                dynamicHandler?.notify();\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was not called again\");\n                Assert.equal(\"newIKey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://newendpoint.localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"onConfigChange removal\",\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\"\n                };\n\n                const theDefaults: IConfigDefaults<IConfiguration> = {\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                let dynamicConfig = createDynamicConfig(theConfig, theDefaults, this._testLogger).cfg;\n                let dynamicHandler = getDynamicConfigHandler(dynamicConfig);\n                Assert.ok(!!dynamicHandler, \"The config should have a dynamic config handler\");\n                Assert.equal(dynamicConfig, theConfig, \"The object should have been applied in-place\");\n                Assert.equal(dynamicHandler?.cfg, theConfig, \"The handler should point to the config\");\n\n                let onChangeCalled = 0;\n                let onChange = onConfigChange(theConfig, () => {\n                    onChangeCalled ++;\n                    Assert.equal(\"testiKey\", theConfig.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(\"https://localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be set\");\n                });\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n                onChange.rm();\n\n                theConfig.instrumentationKey = \"newIkey\";\n                Assert.equal(\"newIkey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be set\");\n\n                theConfig.endpointUrl = \"https://newendpoint.localhost:9001\";\n                Assert.equal(\"newIkey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://newendpoint.localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"onConfigChange called when changed via timeout\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\"\n                };\n\n                const theDefaults: IConfigDefaults<IConfiguration> = {\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                let dynamicHandler = createDynamicConfig(theConfig, theDefaults, this._testLogger);\n                let dynamicConfig = dynamicHandler.cfg;\n                Assert.ok(!!dynamicHandler, \"The config should have a dynamic config handler\");\n                Assert.equal(dynamicConfig, theConfig, \"The object should have been applied in-place\");\n                Assert.equal(dynamicHandler?.cfg, theConfig, \"The handler should point to the config\");\n\n                let expectediKey = \"testiKey\";\n                let expectedEndpointUrl = \"https://localhost:9001\";\n                let onChangeCalled = 0;\n                let onChange = onConfigChange(dynamicConfig, (details) => {\n                    onChangeCalled ++;\n                    Assert.equal(theConfig, details.cfg, \"The original config and the details cfg should be the same\");\n                    Assert.equal(expectediKey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                });\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n\n                expectediKey = \"newIKey\";\n                theConfig.instrumentationKey = expectediKey;\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was only called for the first instance\");\n                this.clock.tick(1);         // This should cause the notifications to occur\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called again\");\n\n                // explicitly call notify (nothing should get called)\n                dynamicHandler?.notify();\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called again\");\n\n                expectedEndpointUrl = \"https://newendpoint.localhost:9001\";\n                theConfig.endpointUrl = expectedEndpointUrl;\n\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);         // This should cause the notifications to occur\n                Assert.equal(3, onChangeCalled, \"Expected the onChanged was called again\");\n\n                dynamicHandler?.notify();\n                Assert.equal(3, onChangeCalled, \"Expected the onChanged was called again\");\n                Assert.equal(\"newIKey\", theConfig.instrumentationKey, \"Expect the iKey to be changed\");\n                Assert.equal(\"https://newendpoint.localhost:9001\", theConfig.endpointUrl, \"Expect the endpoint to be changed\");\n            }\n        });\n\n        this.testCase({\n            name: \"onCfgChange usage before initialization\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                const channelPlugin = new TestChannelPlugin();\n                let core = new AppInsightsCore();\n                let expectediKey = theConfig.instrumentationKey;\n                let expectedEndpointUrl = theConfig.endpointUrl;\n\n                let onChangeCalled = 0;\n                let handler = core.onCfgChange((details) => {\n                    onChangeCalled ++;\n                    Assert.equal(expectediKey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                });\n\n                Assert.equal(0, onChangeCalled, \"OnCfgChange was not called\");\n\n                core.initialize(theConfig, [channelPlugin]);\n                Assert.equal(1, onChangeCalled, \"OnCfgChange was not called\");\n\n                expectediKey = \"newIKey\";\n                core.config.instrumentationKey = expectediKey;\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called again\");\n\n                // Remove the handler\n                handler.rm();\n                expectediKey = \"newIKey2\";\n                core.config.instrumentationKey = expectediKey;\n\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was not called again\");\n            }\n        });\n\n        this.testCase({\n            name: \"onCfgChange usage before initialization and removed before initialization\",\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                const channelPlugin = new TestChannelPlugin();\n                let core = new AppInsightsCore();\n                let expectediKey = theConfig.instrumentationKey;\n                let expectedEndpointUrl = theConfig.endpointUrl;\n\n                let onChangeCalled = 0;\n                let handler = core.onCfgChange((details) => {\n                    onChangeCalled ++;\n                    Assert.equal(expectediKey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                });\n\n                Assert.equal(0, onChangeCalled, \"OnCfgChange was not called\");\n                handler.rm();\n\n                core.initialize(theConfig, [channelPlugin]);\n                Assert.equal(0, onChangeCalled, \"OnCfgChange was not called\");\n            }\n        });\n\n        this.testCase({\n            name: \"onCfgChange usage after initialization\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\"\n                };\n\n                const channelPlugin = new TestChannelPlugin();\n                let core = new AppInsightsCore();\n                let expectediKey = theConfig.instrumentationKey;\n                let expectedEndpointUrl = theConfig.endpointUrl;\n\n                core.initialize(theConfig, [channelPlugin]);\n                let onChangeCalled = 0;\n                let handler = core.onCfgChange((details) => {\n                    onChangeCalled ++;\n                    Assert.equal(expectediKey, details.cfg.instrumentationKey, \"Expect the iKey to be set\");\n                    Assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, \"Expect the endpoint to be set\");\n                });\n\n                Assert.equal(1, onChangeCalled, \"OnCfgChange was not called\");\n\n                expectediKey = \"newIKey\";\n                core.config.instrumentationKey = expectediKey;\n\n                Assert.equal(1, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called again\");\n\n                // Remove the handler\n                handler.rm();\n                expectediKey = \"newIKey2\";\n                core.config.instrumentationKey = expectediKey;\n\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was called\");\n                this.clock.tick(1);\n                Assert.equal(2, onChangeCalled, \"Expected the onChanged was not called again\");\n            }\n        });\n\n\n        this.testCase({\n            name: \"onCfgChange only calls accessed changes\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: IConfiguration = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\",\n                    enableDebug: false,\n                    loggingLevelConsole: 1\n                };\n\n                const channelPlugin = new TestChannelPlugin();\n                let core = new AppInsightsCore();\n                let expectedEnableDebug = theConfig.enableDebug;\n                let expectedLoggingLevel = theConfig.loggingLevelConsole;\n\n                core.initialize(theConfig, [channelPlugin]);\n                let onChangeCalled = 0;\n                let handler = core.onCfgChange((details) => {\n                    onChangeCalled ++;\n                    Assert.equal(expectedEnableDebug, details.cfg.enableDebug, \"Expect the endpoint to be set\");\n                    if (details.cfg.enableDebug) {\n                        Assert.equal(expectedLoggingLevel, details.cfg.loggingLevelConsole, \"Expected the logging level console\")\n                    }\n                });\n\n                Assert.equal(1, onChangeCalled, \"OnCfgChange was not called\");\n\n                // This should not trigger the listener as enableDebug was false\n                expectedLoggingLevel = 99;\n                core.config.loggingLevelConsole = expectedLoggingLevel;\n\n                this.clock.tick(10);\n                Assert.equal(1, onChangeCalled, \"listener should not have been called as enableDebug was false\");\n\n                // Enable Debug extensions\n                expectedEnableDebug = true;\n                core.config.enableDebug = expectedEnableDebug;\n                this.clock.tick(10);\n                Assert.equal(2, onChangeCalled, \"listener should have been called enableDebug\");\n\n                // This should trigger the listener as enableDebug was false\n                expectedLoggingLevel = 2;\n                core.config.loggingLevelConsole = expectedLoggingLevel;\n\n                this.clock.tick(10);\n                Assert.equal(3, onChangeCalled, \"listener should have been called as enableDebug was true\");\n\n                // Disable Debug extensions again\n                expectedEnableDebug = false;\n                core.config.enableDebug = expectedEnableDebug;\n                this.clock.tick(10);\n                Assert.equal(4, onChangeCalled, \"listener should have been called enableDebug\");\n\n                // This should not call trigger the listener as enableDebug was false\n                expectedLoggingLevel = 42;\n                core.config.loggingLevelConsole = expectedLoggingLevel;\n\n                this.clock.tick(10);\n                Assert.equal(4, onChangeCalled, \"listener should have been called as enableDebug was disabled\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate updating objects / arrays replaces the contents in-place\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: any = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\",\n                    enableDebug: false,\n                    loggingLevelConsole: 1,\n                    extensionConfig: {\n                        \"test\": {} as any\n                    },\n                    userCfg: {\n                        userTest: {} as any\n                    }\n                };\n\n                const channelPlugin = new TestChannelPlugin();\n                let core = new AppInsightsCore();\n\n                core.initialize(theConfig, [channelPlugin]);\n                let cfg = core.config as any;\n\n                // Grab a copy of the testExtCfg\n                let testExtCfg = cfg.extensionConfig?.test;\n                let userTestCfg = cfg.userCfg.userTest;\n\n                let helloCfg: any = {\n                    \"hello\": \"World\"\n                };\n\n                let myCfg: any = {\n                    \"my\": \"newCfg\"\n                };\n\n                Assert.ok(!objHasOwn(cfg.extensionConfig!.test, \"hello\"), \"The hello property should not exist\");\n                Assert.ok(!objHasOwn(testExtCfg, \"hello\"), \"The hello property should not exist\");\n\n                // Assign the new config\n                cfg.extensionConfig!.test = helloCfg;\n\n                // Assign the new config to a new key\n                cfg.extensionConfig!.newTest = helloCfg;\n\n                // The test should now have \"copied\" the helloCfg\n                Assert.ok(objHasOwn(cfg.extensionConfig!.test, \"hello\"), \"The hello property should exist\");\n                Assert.equal(\"World\", cfg.extensionConfig!.test.hello, \"And should be assigned\");\n                Assert.ok(cfg.extensionConfig!.test !== helloCfg, \"The new config should have copied but not directly referenced the helloCfg\");\n\n                // Check that the previously referenced config also has the value\n                Assert.ok(objHasOwn(testExtCfg, \"hello\"), \"The hello property should exist\");\n                Assert.equal(\"World\", testExtCfg.hello, \"And should be assigned\");\n                Assert.ok(cfg.extensionConfig!.test === testExtCfg, \"The previous reference and the current value should still be the same instance\");\n\n                // The newTest element should refer to the helloCfg as it was NOT tagged as referenced\n                Assert.ok(objHasOwn(cfg.extensionConfig!.newTest, \"hello\"), \"The hello property should exist\");\n                Assert.equal(\"World\", cfg.extensionConfig!.newTest.hello, \"And should be assigned\");\n                Assert.ok(cfg.extensionConfig!.newTest === helloCfg, \"The new config should have directly referenced the helloCfg as it was not previously present or referenced\");\n\n                // Final validation that test !== newTest\n                Assert.ok(cfg.extensionConfig!.newTest !== cfg.extensionConfig!.test, \"NewTest and old test should not reference the same instance\");\n\n                // Assign the new config\n                cfg.extensionConfig!.test = myCfg;\n\n                // The test should now have \"copied\" the helloCfg\n                Assert.ok(objHasOwn(cfg.extensionConfig!.test, \"hello\"), \"The hello property should still exist\");\n                Assert.equal(undefined, cfg.extensionConfig!.test.hello, \"But hello should be undefined\");\n\n                Assert.ok(objHasOwn(cfg.extensionConfig!.test, \"my\"), \"But the my property should\");\n                Assert.equal(\"newCfg\", cfg.extensionConfig!.test.my, \"And should be assigned\");\n                Assert.ok(cfg.extensionConfig!.test !== myCfg, \"The new config should have copied but not directly referenced the helloCfg\");\n\n                // Check that the previously referenced config also has the value\n                Assert.ok(objHasOwn(testExtCfg, \"hello\"), \"The hello property should exist\");\n                Assert.equal(undefined, cfg.extensionConfig!.test.hello, \"But hello should be undefined\");\n\n                Assert.ok(objHasOwn(testExtCfg, \"my\"), \"The my property should exist\");\n                Assert.equal(\"newCfg\", testExtCfg.my, \"And should be assigned\");\n                Assert.ok(cfg.extensionConfig!.test === testExtCfg, \"The previous reference and the current value should still be the same instance\");\n\n                // New Test should be unchanged\n                // The newTest element should refer to the helloCfg as it was NOT tagged as referenced\n                Assert.ok(objHasOwn(cfg.extensionConfig!.newTest, \"hello\"), \"The hello property should exist\");\n                Assert.equal(\"World\", cfg.extensionConfig!.newTest.hello, \"And should be assigned\");\n                Assert.ok(cfg.extensionConfig!.newTest === helloCfg, \"The new config should have directly referenced the helloCfg as it was not previously present or referenced\");\n\n                // Final validation that test !== newTest\n                Assert.ok(cfg.extensionConfig!.newTest !== cfg.extensionConfig!.test, \"NewTest and old test should not reference the same instance\");\n\n                // ---------------------------------------------------------\n                // Validate that updating non-referenced objects replaces the object\n                Assert.ok(!objHasOwn(cfg.userCfg.userTest, \"hello\"), \"The hello property should not exist\");\n                Assert.ok(!objHasOwn(userTestCfg, \"hello\"), \"The hello property should not exist\");\n\n                // Assign the new config\n                cfg.userCfg!.userTest = helloCfg;\n\n                // Assign the new config to a new key\n                cfg.userCfg!.newTest = helloCfg;\n\n                // The test should now have \"copied\" the helloCfg\n                Assert.ok(objHasOwn(cfg.userCfg!.userTest, \"hello\"), \"The hello property should exist\");\n                Assert.equal(\"World\", cfg.userCfg!.userTest.hello, \"And should be assigned\");\n                Assert.ok(cfg.userCfg!.userTest === helloCfg, \"The new config should directly referenced the helloCfg\");\n                // The original reference obtained before updating the userCfg should not have changed\n                Assert.ok(!objHasOwn(userTestCfg, \"hello\"), \"The hello property should not exist\");\n\n                // The newTest element should refer to the helloCfg\n                Assert.ok(objHasOwn(cfg.userCfg!.newTest, \"hello\"), \"The hello property should exist\");\n                Assert.equal(\"World\", cfg.userCfg!.newTest.hello, \"And should be assigned\");\n                Assert.ok(cfg.userCfg!.newTest === helloCfg, \"The new config should have directly referenced the helloCfg\");\n\n                // Final validation that test !== newTest\n                Assert.ok(cfg.userCfg!.newTest === cfg.userCfg!.userTest, \"NewTest and old test should reference the same instance\");\n\n                // Assign the new config\n                cfg.userCfg!.userTest = myCfg;\n\n                // The test should now have \"copied\" the helloCfg\n                Assert.ok(!objHasOwn(cfg.userCfg!.userTest, \"hello\"), \"The hello property should not exist\");\n                Assert.ok(objHasOwn(cfg.userCfg!.userTest, \"my\"), \"The my property should exist\");\n                Assert.equal(\"newCfg\", cfg.userCfg!.userTest.my, \"And should be assigned\");\n                Assert.ok(cfg.userCfg!.userTest === myCfg, \"The new config should directly referenced the myCfg\");\n\n                // The original reference obtained before updating the userCfg should not have changed\n                Assert.ok(!objHasOwn(userTestCfg, \"hello\"), \"The hello property should not exist\");\n                Assert.ok(!objHasOwn(userTestCfg, \"my\"), \"The my property should not exist\");\n\n                // The newTest element should still reference the helloCfg\n                Assert.ok(objHasOwn(cfg.userCfg!.newTest, \"hello\"), \"The hello property should exist\");\n                Assert.equal(\"World\", cfg.userCfg!.newTest.hello, \"And should be assigned\");\n                Assert.ok(cfg.userCfg!.newTest === helloCfg, \"The new config should have directly referenced the helloCfg\");\n\n                // Final validation that test !== newTest\n                Assert.ok(cfg.userCfg!.newTest !== cfg.userCfg!.test, \"NewTest and old test should not reference the same instance\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate read-only\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: any = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\",\n                    enableDebug: false,\n                    loggingLevelConsole: 1,\n                    extensionConfig: {\n                        \"test\": {} as any\n                    },\n                    anArray: [ 1, 2, 3 ]\n                };\n\n                let handler = createDynamicConfig(theConfig, undefined, this._testLogger, true);\n\n                handler.rdOnly(theConfig, \"instrumentationKey\");\n                _expectException(() => {\n                    theConfig.instrumentationKey = \"newTestKey\";\n                }, \"Should not be able to re-assign instrumentationKey\");\n\n                // Re-Assigning with the same value doesn't cause an exception\n                theConfig.instrumentationKey = \"testiKey\";\n\n                handler.rdOnly(theConfig, \"extensionConfig\");\n                _expectException(() => {\n                    theConfig.extensionConfig = {};\n                }, \"Should not be able to re-assign extensionConfig\");\n\n                // Assigning a property to a read-only property is allowed\n                theConfig.extensionConfig.hello = \"World\";\n                Assert.equal(\"World\", theConfig.extensionConfig.hello, \"Hello should be assigned\")\n                Assert.deepEqual({}, theConfig.extensionConfig.test, \"test should be assigned\")\n\n                handler.rdOnly(theConfig, \"anArray\");\n                _expectException(() => {\n                    theConfig.anArray = [];\n                }, \"Should not be able to re-assign anArray\");\n\n                // Assigning a property to a read-only property is allowed\n                theConfig.anArray.hello = \"World\";\n                Assert.equal(\"World\", theConfig.anArray.hello, \"Hello should be assigned\")\n                theConfig.anArray[0] = 0;\n                Assert.equal(0, theConfig.anArray[0], \"0\");\n                Assert.equal(2, theConfig.anArray[1], \"2\");\n                Assert.equal(3, theConfig.anArray[2], \"3\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate updating referenced objects / arrays with non object or null / undefined\",\n            useFakeTimers: true,\n            test: () => {\n                let expectedUserCfg = {\n                    userTest: {} as any\n                };\n\n                let theConfig: any = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\",\n                    enableDebug: false,\n                    loggingLevelConsole: 1,\n                    extensionConfig: {\n                        \"test\": {} as any\n                    },\n                    userCfg: {\n                        userTest: {} as any\n                    }\n                };\n\n                let handler = createDynamicConfig(theConfig, {}, this._testLogger);\n                let config = handler.cfg;\n                let userCfg = handler.ref(theConfig, \"userCfg\");\n\n                Assert.deepEqual(expectedUserCfg, userCfg, \"Validate that the expected user Cfg\")\n                Assert.ok(userCfg === config.userCfg, \"Validate userCfg reference is as expected\")\n\n                // Assign the referenced object with null / undefined\n                config.userCfg = null;\n                Assert.deepEqual({ userTest: undefined }, config.userCfg);\n                Assert.ok(userCfg === config.userCfg, \"The previous referenced value should still match\");\n\n                config.userCfg = undefined;\n                Assert.deepEqual({ userTest: undefined }, config.userCfg);\n                Assert.ok(userCfg === config.userCfg, \"The previous referenced value should still match\");\n\n                // Assign back to an object (should become automatically referenced)\n                config.userCfg = {};\n                Assert.deepEqual({ userTest: undefined }, config.userCfg);\n                Assert.ok(userCfg === config.userCfg, \"The previous referenced value should still match\");\n                \n                // Grab a reference and update\n                userCfg = config.userCfg;\n                Assert.ok(userCfg === config.userCfg, \"References should now match\");\n\n                config.userCfg = { hello: \"World\" };\n                Assert.ok(userCfg === config.userCfg, \"References should still match\");\n                Assert.ok(objHasOwn(config.userCfg, \"hello\"), \"Direct config reference should have the new property\");\n                Assert.equal(\"World\", config.userCfg.hello);\n                Assert.ok(objHasOwn(userCfg, \"hello\"), \"previous reference should have the new property\");\n                Assert.equal(\"World\", userCfg.hello);\n\n                config.userCfg = expectedUserCfg;\n                Assert.ok(userCfg === config.userCfg, \"References should still match\");\n                Assert.ok(objHasOwn(config.userCfg, \"userTest\"), \"Direct config reference should have the new property\");\n                Assert.ok(objHasOwn(config.userCfg, \"hello\"), \"Direct config reference should have the new property\");\n                Assert.equal(undefined, config.userCfg.hello);\n                Assert.deepEqual({}, config.userCfg.userTest);\n                Assert.ok(objHasOwn(userCfg, \"userTest\"), \"Direct config reference should have the new property\");\n                Assert.ok(objHasOwn(userCfg, \"hello\"), \"previous reference should have the new property\");\n                Assert.equal(undefined, userCfg.hello);\n                Assert.deepEqual({}, userCfg.userTest);\n\n                // ---------------------------------------------------------------------\n                // Now try deleting the key, which will also drop the previous reference\n                // ---------------------------------------------------------------------\n                delete config.userCfg;\n                Assert.ok(!objHasOwn(config, \"userCfg\"), \"userCfg is no longer present\");\n                Assert.equal(undefined, config.userCfg, \"Validate that the config.userCfg was removed\");\n                Assert.ok(userCfg !== config.userCfg, \"Validate userCfg reference should no longer match\");\n\n                // Assign the referenced object with null / undefined\n                config.userCfg = null;\n                Assert.ok(objHasOwn(config, \"userCfg\"), \"userCfg is present\");\n                Assert.equal(null, config.userCfg, \"Validate that the config.userCfg is null\");\n                Assert.ok(userCfg !== config.userCfg, \"Validate userCfg reference should no longer match\");\n\n                config.userCfg = undefined;\n                Assert.ok(objHasOwn(config, \"userCfg\"), \"userCfg is present\");\n                Assert.equal(undefined, config.userCfg, \"Validate that the config.userCfg is undefined\");\n                Assert.ok(userCfg !== config.userCfg, \"The previous referenced value should still match\");\n\n                // Assign back to an object (should become automatically referenced)\n                config.userCfg = {};\n                Assert.deepEqual({}, config.userCfg);\n\n                // Grab a reference and update\n                userCfg = config.userCfg;\n                Assert.ok(userCfg === config.userCfg, \"References should now match\");\n\n                config.userCfg = { hello: \"World\" };\n                Assert.ok(userCfg !== config.userCfg, \"References should not match\");\n                Assert.ok(objHasOwn(config.userCfg, \"hello\"), \"Direct config reference should have the new property\");\n                Assert.equal(\"World\", config.userCfg.hello);\n                Assert.ok(!objHasOwn(userCfg, \"hello\"), \"previous reference should have the new property\");\n                Assert.equal(undefined, userCfg.hello);\n            }\n        });\n\n        this.testCase({\n            name: \"Validate updating initial referenced undefined value with objects / arrays with non object or null / undefined\",\n            useFakeTimers: true,\n            test: () => {\n                let expectedUserCfg = {\n                    userTest: {} as any\n                };\n\n                let theConfig: any = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\",\n                    enableDebug: false,\n                    loggingLevelConsole: 1,\n                    userCfg: undefined\n                };\n\n                let handler = createDynamicConfig(theConfig, {}, this._testLogger);\n                let config = handler.cfg;\n\n                let userCfg = handler.ref(theConfig, \"userCfg\");\n\n                Assert.equal(undefined, config.userCfg, \"Check that the userCfg value is as expected\");\n                Assert.deepEqual(undefined, userCfg, \"Validate that the expected user Cfg\")\n                Assert.ok(userCfg === config.userCfg, \"Validate userCfg reference is as expected\")\n\n                // Assign the referenced object with null / undefined\n                config.userCfg = null;\n                Assert.equal(null, config.userCfg);\n                Assert.ok(userCfg !== config.userCfg, \"The previous referenced value should no longer match\");\n\n                config.userCfg = undefined;\n                Assert.equal(undefined, config.userCfg);\n                Assert.ok(userCfg === config.userCfg, \"The previous referenced value should no longer match\");\n\n                // Assign back to an object (should become automatically referenced)\n                config.userCfg = {};\n                Assert.equal(0, objKeys(config.userCfg), \"Check the number of keys\");\n                Assert.ok(userCfg !== config.userCfg, \"The previous referenced value should no longer match\");\n                \n                // Grab a reference and update\n                userCfg = config.userCfg;\n                Assert.ok(userCfg === config.userCfg, \"References should now match\");\n\n                config.userCfg = { hello: \"World\" };\n                Assert.ok(userCfg === config.userCfg, \"References should still match\");\n                Assert.ok(objHasOwn(config.userCfg, \"hello\"), \"Direct config reference should have the new property\")\n                Assert.equal(\"World\", config.userCfg.hello);\n                Assert.ok(objHasOwn(userCfg, \"hello\"), \"previous reference should have the new property\")\n                Assert.equal(\"World\", userCfg.hello);\n\n                config.userCfg = expectedUserCfg;\n                Assert.ok(userCfg === config.userCfg, \"References should still match\");\n                Assert.ok(objHasOwn(config.userCfg, \"userTest\"), \"Direct config reference should have the new property\")\n                Assert.ok(objHasOwn(config.userCfg, \"hello\"), \"Direct config reference should have the new property\")\n                Assert.equal(undefined, config.userCfg.hello);\n                Assert.deepEqual({}, config.userCfg.userTest);\n                Assert.ok(objHasOwn(userCfg, \"userTest\"), \"Direct config reference should have the new property\")\n                Assert.ok(objHasOwn(userCfg, \"hello\"), \"previous reference should have the new property\")\n                Assert.equal(undefined, userCfg.hello);\n                Assert.deepEqual({}, userCfg.userTest);\n\n                // ---------------------------------------------------------------------\n                // Now try deleting the key, which will also drop the previous reference\n                // ---------------------------------------------------------------------\n                delete config.userCfg;\n                Assert.ok(!objHasOwn(config, \"userCfg\"), \"userCfg is no longer present\");\n                Assert.equal(undefined, config.userCfg, \"Validate that the config.userCfg was removed\");\n                Assert.ok(userCfg !== config.userCfg, \"Validate userCfg reference should no longer match\");\n\n                // Assign the referenced object with null / undefined\n                config.userCfg = null;\n                Assert.ok(objHasOwn(config, \"userCfg\"), \"userCfg is present\");\n                Assert.equal(null, config.userCfg, \"Validate that the config.userCfg is null\");\n                Assert.ok(userCfg !== config.userCfg, \"Validate userCfg reference should no longer match\");\n\n                config.userCfg = undefined;\n                Assert.ok(objHasOwn(config, \"userCfg\"), \"userCfg is present\");\n                Assert.equal(undefined, config.userCfg, \"Validate that the config.userCfg is undefined\");\n                Assert.ok(userCfg !== config.userCfg, \"The previous referenced value should still match\");\n\n                // Assign back to an object (should become automatically referenced)\n                config.userCfg = {};\n                Assert.deepEqual({}, config.userCfg);\n\n                // Grab a reference and update\n                userCfg = config.userCfg;\n                Assert.ok(userCfg === config.userCfg, \"References should now match\");\n\n                config.userCfg = { hello: \"World\" };\n                Assert.ok(userCfg !== config.userCfg, \"References should not match\");\n                Assert.ok(objHasOwn(config.userCfg, \"hello\"), \"Direct config reference should have the new property\");\n                Assert.equal(\"World\", config.userCfg.hello);\n                Assert.ok(!objHasOwn(userCfg, \"hello\"), \"previous reference should have the new property\");\n                Assert.equal(undefined, userCfg.hello);\n            }\n        });\n\n        this.testCase({\n            name: \"Validate setting defaults when partial values are provided\",\n            useFakeTimers: true,\n            test: () => {\n                let theConfig: any = {\n                    instrumentationKey: \"testiKey\",\n                    endpointUrl: \"https://localhost:9001\",\n                    enableDebug: false,\n                    loggingLevelConsole: 1,\n                    userCfg: undefined,\n                    extensionConfig: {\n                        myExtension: {\n                            value1: \"Hello\",\n                            subValue1: {\n                                sub1: \"World\"\n                            }\n                        },\n                        partialConfig: {\n                            p1: {\n                                v1: \"Back\"\n                            }\n                        }\n                    }\n                };\n\n                const channelPlugin = new TestChannelPlugin();\n                let core = new AppInsightsCore();\n\n                core.initialize(theConfig, [channelPlugin]);\n\n                let handler = getDynamicConfigHandler(core.config);\n                let config = handler!.cfg;\n\n                let expectedExtCfg: any = {\n                    myExtension: {\n                        value1: \"Hello\",\n                        subValue1: {\n                            sub1: \"World\"\n                        },\n                    },\n                    partialConfig: {\n                        p1: {\n                            v1: \"Back\"\n                        }\n                    }\n                }\n                Assert.deepEqual(expectedExtCfg, config.extensionConfig, \"Check the extension Config\")\n\n                let newExtensionCfg: IConfigDefaults<any> = {\n                    extensionConfig: { \n                        mrg: true, v: {\n                            anotherPlugin: {\n                                newValue1: \"foo\",\n                                subValue2: {\n                                    v: {\n                                        sub2: \"bar\",\n                                        sub3: {\n                                            v: \"fred\"\n                                        }\n                                    }\n                                }\n                            },\n                            partialConfig: {\n                                mrg: true,\n                                v: {\n                                    p1: {\n                                        v1: \"Back\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n                handler?.setDf(config, newExtensionCfg);\n\n                expectedExtCfg = {\n                    myExtension: {\n                        value1: \"Hello\",\n                        subValue1: {\n                            sub1: \"World\"\n                        }\n                    },\n                    anotherPlugin:  {\n                        newValue1: \"foo\",\n                        subValue2: {\n                            sub2: \"bar\",\n                            sub3: \"fred\"\n                        }\n                    },\n                    partialConfig: {\n                        p1: {\n                            v1: \"Back\"\n                        }\n                    }\n                }\n                Assert.deepEqual(expectedExtCfg, config.extensionConfig, \"Check the extension Config\")\n            }\n        });\n\n        this.testCase({\n            name: \"Direct Updating of readonly fields\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n                const iKey2 = \"00000000-1111-7777-8888-999999999999\";\n                const testEndpoint1 = \"https://localhost:9001/TestEndpoint\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n\n                const config: IConfiguration = {\n                    instrumentationKey: iKey1\n                };\n                try {\n                    appInsightsCore.initialize(config, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(4, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                _expectException(() => {\n                    // casting to any to bypass TypeScript readonly error\n                    (appInsightsCore.config as any).extensions = []\n                }, \"We should not be able to update the extensions directly\");\n\n                _expectException(() => {\n                    // casting to any to bypass TypeScript readonly error\n                    (appInsightsCore.config as any).channels = [[]]\n                }, \"We should not be able to update the channels directly\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that extensions created as proxy objects are not converted into dynamic objects\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n                let mockChannel = {\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"testChannel\",\n                    priority: 1003\n                };\n\n                let blockedMockChannel = blockDynamicConversion({\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"blockedTestChannel\",\n                    priority: 1004\n                });\n\n                let forceMockChannel = forceDynamicConversion(new TestChannelPlugin());\n\n                let config: IConfiguration = {\n                    instrumentationKey: iKey1,\n                    extensions: [ mockChannel, blockedMockChannel, forceMockChannel ],\n                };\n\n                let dynamicHandler = createDynamicConfig(config, coreDefaultConfig, this._testLogger, true);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                try {\n                    appInsightsCore.initialize(dynamicConfig, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(null, getDynamicConfigHandler(channelPlugin), \"The channel should not have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(forceMockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(mockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(blockedMockChannel), \"This channel should not have been converted into a dynamic object\");\n                let processSpy = this.sandbox.spy(blockedMockChannel, \"processTelemetry\");\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(7, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                Assert.equal(false, processSpy.called, \"The spy has not been called yet\");\n                appInsightsCore.track({\n                    name: \"TestEvent\"\n                });\n\n                Assert.equal(true, processSpy.called, \"The processTelemetry should have been called\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that channels created as proxy objects are not converted into dynamic objects\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n                let mockChannel = {\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"testChannel\",\n                    priority: 1003\n                };\n\n                let blockedMockChannel = blockDynamicConversion({\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"blockedTestChannel\",\n                    priority: 1004\n                });\n\n                let forceMockChannel = forceDynamicConversion(new TestChannelPlugin());\n\n                let config: IConfiguration = {\n                    instrumentationKey: iKey1,\n                    channels: [ [ mockChannel, blockedMockChannel, forceMockChannel ] ],\n                };\n\n                let dynamicHandler = createDynamicConfig(config, coreDefaultConfig, this._testLogger, true);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                try {\n                    appInsightsCore.initialize(dynamicConfig, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(null, getDynamicConfigHandler(channelPlugin), \"The channel should not have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(forceMockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(mockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(blockedMockChannel), \"This channel should not have been converted into a dynamic object\");\n                let processSpy = this.sandbox.spy(blockedMockChannel, \"processTelemetry\");\n\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(7, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                Assert.equal(false, processSpy.called, \"The spy has not been called yet\");\n                appInsightsCore.track({\n                    name: \"TestEvent\"\n                });\n\n                Assert.equal(true, processSpy.called, \"The processTelemetry should have been called\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that channels created as Sealed objects are not converted into dynamic objects\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n                let mockChannel = {\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"testChannel\",\n                    priority: 1003\n                };\n\n                let sealedProcessCalled = false;\n                let sealedMockChannel = Object.seal({\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { sealedProcessCalled = true; itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"sealedTestChannel\",\n                    priority: 1004\n                });\n\n                let forceMockChannel = forceDynamicConversion(new TestChannelPlugin());\n\n                let config: IConfiguration = {\n                    instrumentationKey: iKey1,\n                    channels: [ [ mockChannel, sealedMockChannel, forceMockChannel ] ],\n                };\n\n                let dynamicHandler = createDynamicConfig(config, coreDefaultConfig, this._testLogger, true);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                try {\n                    appInsightsCore.initialize(dynamicConfig, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(null, getDynamicConfigHandler(channelPlugin), \"The channel should not have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(forceMockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(mockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(sealedMockChannel), \"This channel should not have been converted into a dynamic object\");\n\n                sealedProcessCalled = false;\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(7, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                Assert.equal(false, sealedProcessCalled, \"The spy has not been called yet\");\n                appInsightsCore.track({\n                    name: \"TestEvent\"\n                });\n\n                Assert.equal(true, sealedProcessCalled, \"The processTelemetry should have been called\");\n                Assert.equal(2, this._throwInternalEvents.length, \"We should have got 2 messages\");\n                Assert.equal(eLoggingSeverity.DEBUG, this._throwInternalEvents[0].severity);\n                Assert.equal(_eInternalMessageId.DynamicConfigException, this._throwInternalEvents[0].msgId);\n                Assert.ok(strContains(this._throwInternalEvents[0].msg, \"Cannot redefine property\"));\n\n                Assert.equal(eLoggingSeverity.DEBUG, this._throwInternalEvents[1].severity);\n                Assert.equal(_eInternalMessageId.DynamicConfigException, this._throwInternalEvents[1].msgId);\n                Assert.ok(strContains(this._throwInternalEvents[1].msg, \"Cannot redefine property\"));\n\n                this._throwInternalEvents = [];\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that channels created as frozen objects are not converted into dynamic objects\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n                let mockChannel = {\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"testChannel\",\n                    priority: 1003\n                };\n\n                let frozenProcessCalled = false;\n                let frozenMockChannel = Object.freeze({\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { frozenProcessCalled = true, itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"frozenTestChannel\",\n                    priority: 1004\n                });\n\n                let forceMockChannel = forceDynamicConversion(new TestChannelPlugin());\n\n                let config: IConfiguration = {\n                    instrumentationKey: iKey1,\n                    channels: [ [ mockChannel, frozenMockChannel, forceMockChannel ] ],\n                };\n\n                let dynamicHandler = createDynamicConfig(config, coreDefaultConfig, this._testLogger, true);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                try {\n                    appInsightsCore.initialize(dynamicConfig, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(null, getDynamicConfigHandler(channelPlugin), \"The channel should not have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(forceMockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(mockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(frozenMockChannel), \"This channel should not have been converted into a dynamic object\");\n\n                frozenProcessCalled = false;\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(7, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                Assert.equal(false, frozenProcessCalled, \"The spy has not been called yet\");\n                appInsightsCore.track({\n                    name: \"TestEvent\"\n                });\n\n                Assert.equal(true, frozenProcessCalled, \"The processTelemetry should have been called\");\n                Assert.equal(2, this._throwInternalEvents.length, \"We should have got 2 messages\");\n                Assert.equal(eLoggingSeverity.DEBUG, this._throwInternalEvents[0].severity);\n                Assert.equal(_eInternalMessageId.DynamicConfigException, this._throwInternalEvents[0].msgId);\n                Assert.ok(strContains(this._throwInternalEvents[0].msg, \"Cannot redefine property\"));\n\n                Assert.equal(eLoggingSeverity.DEBUG, this._throwInternalEvents[1].severity);\n                Assert.equal(_eInternalMessageId.DynamicConfigException, this._throwInternalEvents[1].msgId);\n                Assert.ok(strContains(this._throwInternalEvents[1].msg, \"Cannot redefine property\"));\n\n                this._throwInternalEvents = [];\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that channels created as readonly defined not configurable objects are not converted into dynamic objects\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n                let mockChannel = {\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"testChannel\",\n                    priority: 1003\n                };\n\n                let definedProcessCalled = false;\n                let definedMockChannel: IChannelControls = objDefineProps<IChannelControls>({} as IChannelControls, {\n                    pause: { v: () => { }, w: false, c: false },\n                    resume: { v: () => { }, w: false, c: false },\n                    teardown: { v: () => { }, w: false, c: false },\n                    flush: { v: (async: any, callBack: any) => { }, w: false, c: false },\n                    processTelemetry: { v: (env: any, itemCtx?: IProcessTelemetryContext) => { definedProcessCalled = true; itemCtx?.processNext(env); }, w: false, c: false },\n                    setNextPlugin: { v: (next: any) => { }, w: false, c: false },\n                    initialize: { v: (config: any, core: any, extensions: any) => { }, w: false, c: false },\n                    identifier: { v: \"definedMockChannel\", w: false, c: false },\n                    priority: { v: 1004, w: false, c: false }\n                });\n\n                let forceMockChannel = forceDynamicConversion(new TestChannelPlugin());\n\n                let config: IConfiguration = {\n                    instrumentationKey: iKey1,\n                    channels: [ [ mockChannel, definedMockChannel, forceMockChannel ] ],\n                };\n\n                let dynamicHandler = createDynamicConfig(config, coreDefaultConfig, this._testLogger, true);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                try {\n                    appInsightsCore.initialize(dynamicConfig, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(null, getDynamicConfigHandler(channelPlugin), \"The channel should not have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(forceMockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.notEqual(null, getDynamicConfigHandler(mockChannel), \"The channel should have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(definedMockChannel), \"This channel should not have been converted into a dynamic object\");\n\n                definedProcessCalled = false;\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(7, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                Assert.equal(false, definedProcessCalled, \"The spy has not been called yet\");\n                appInsightsCore.track({\n                    name: \"TestEvent\"\n                });\n\n                Assert.equal(true, definedProcessCalled, \"The processTelemetry should have been called\");\n\n                Assert.equal(2, this._throwInternalEvents.length, \"We should have got 2 messages\");\n                Assert.equal(eLoggingSeverity.DEBUG, this._throwInternalEvents[0].severity);\n                Assert.equal(_eInternalMessageId.DynamicConfigException, this._throwInternalEvents[0].msgId);\n                Assert.ok(strContains(this._throwInternalEvents[0].msg, \"Cannot redefine property\"));\n\n                Assert.equal(eLoggingSeverity.DEBUG, this._throwInternalEvents[1].severity);\n                Assert.equal(_eInternalMessageId.DynamicConfigException, this._throwInternalEvents[1].msgId);\n                Assert.ok(strContains(this._throwInternalEvents[1].msg, \"Cannot redefine property\"));\n\n                this._throwInternalEvents = [];\n            }\n        });\n\n        this.testCase({\n            name: \"Validate that when channels are blocked from dynamic and using readonly defined not configurable objects are not converted into dynamic objects\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n                let mockChannel = {\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"testChannel\",\n                    priority: 1003\n                };\n\n                let definedProcessCalled = false;\n                let definedMockChannel: IChannelControls = objDefineProps<IChannelControls>({} as IChannelControls, {\n                    pause: { v: () => { }, w: false, c: false },\n                    resume: { v: () => { }, w: false, c: false },\n                    teardown: { v: () => { }, w: false, c: false },\n                    flush: { v: (async: any, callBack: any) => { }, w: false, c: false },\n                    processTelemetry: { v: (env: any, itemCtx?: IProcessTelemetryContext) => { definedProcessCalled = true; itemCtx?.processNext(env); }, w: false, c: false },\n                    setNextPlugin: { v: (next: any) => { }, w: false, c: false },\n                    initialize: { v: (config: any, core: any, extensions: any) => { }, w: false, c: false },\n                    identifier: { v: \"definedMockChannel\", w: false, c: false },\n                    priority: { v: 1004, w: false, c: false }\n                });\n\n                let forceMockChannel = forceDynamicConversion(new TestChannelPlugin());\n\n                let config: IConfiguration = {\n                    instrumentationKey: iKey1,\n                    channels: [ [ mockChannel, definedMockChannel, forceMockChannel ] ],\n                };\n\n                let dynamicHandler = createDynamicConfig(config, blockedChannelsDefaultConfig, this._testLogger, true);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                try {\n                    appInsightsCore.initialize(dynamicConfig, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(null, getDynamicConfigHandler(channelPlugin), \"The channel should not have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(forceMockChannel), \"The channel should not have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(mockChannel), \"The channel should not have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(definedMockChannel), \"This channel should not have been converted into a dynamic object\");\n\n                definedProcessCalled = false;\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(7, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                Assert.equal(false, definedProcessCalled, \"The spy has not been called yet\");\n                appInsightsCore.track({\n                    name: \"TestEvent\"\n                });\n\n                Assert.equal(true, definedProcessCalled, \"The processTelemetry should have been called\");\n\n                Assert.equal(0, this._throwInternalEvents.length, \"We should have got no messages\");\n                this._throwInternalEvents = [];\n            }\n        });\n\n        this.testCase({\n            name: \"Validate sealing the entire config\",\n            test: () => {\n                const iKey1 = \"09465199-12AA-4124-817F-544738CC7C41\";\n\n                const channelPlugin = new TestChannelPlugin();\n                const trackPlugin = new TrackPlugin();\n                const appInsightsCore = new AppInsightsCore();\n                const testSamplingPlugin = new TestSamplingPlugin();\n                let mockChannel = {\n                    pause: () => { },\n                    resume: () => { },\n                    teardown: () => { },\n                    flush: (async: any, callBack: any) => { },\n                    processTelemetry: (env: any, itemCtx?: IProcessTelemetryContext) => { itemCtx?.processNext(env); },\n                    setNextPlugin: (next: any) => { },\n                    initialize: (config: any, core: any, extensions: any) => { },\n                    identifier: \"testChannel\",\n                    priority: 1003\n                };\n\n                let definedProcessCalled = false;\n                let definedMockChannel: IChannelControls = objDefineProps<IChannelControls>({} as IChannelControls, {\n                    pause: { v: () => { }, w: false, c: false },\n                    resume: { v: () => { }, w: false, c: false },\n                    teardown: { v: () => { }, w: false, c: false },\n                    flush: { v: (async: any, callBack: any) => { }, w: false, c: false },\n                    processTelemetry: { v: (env: any, itemCtx?: IProcessTelemetryContext) => { definedProcessCalled = true; itemCtx?.processNext(env); }, w: false, c: false },\n                    setNextPlugin: { v: (next: any) => { }, w: false, c: false },\n                    initialize: { v: (config: any, core: any, extensions: any) => { }, w: false, c: false },\n                    identifier: { v: \"definedMockChannel\", w: false, c: false },\n                    priority: { v: 1004, w: false, c: false }\n                });\n\n                let forceMockChannel = forceDynamicConversion(new TestChannelPlugin());\n\n                let config: IConfiguration = Object.seal({\n                    instrumentationKey: iKey1,\n                    channels: [ [ mockChannel, definedMockChannel, forceMockChannel ] ],\n                });\n\n                try {\n                    createDynamicConfig(config, blockedChannelsDefaultConfig, this._testLogger, true);\n                    Assert.ok(false, \"Should not be able to update in-place\");\n                } catch (e) {\n                    Assert.ok(true, \"Expected to not be able to update the default config\")\n                }\n\n                // Attempt to convert by deep copying the existing config\n                let dynamicHandler = createDynamicConfig(config, blockedChannelsDefaultConfig, this._testLogger, false);\n                let dynamicConfig = dynamicHandler.cfg;\n\n                try {\n                    appInsightsCore.initialize(dynamicConfig, [channelPlugin, new TestPlugin(), trackPlugin, testSamplingPlugin], this._testLogger);\n                } catch (error) {\n                    Assert.ok(false, \"Everything should be initialized\");\n                }\n\n                Assert.equal(null, getDynamicConfigHandler(channelPlugin), \"The channel should not have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(forceMockChannel), \"The channel should not have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(mockChannel), \"The channel should not have been converted into a dynamic object\");\n                Assert.equal(null, getDynamicConfigHandler(definedMockChannel), \"This channel should not have been converted into a dynamic object\");\n\n                definedProcessCalled = false;\n                Assert.equal(1, channelPlugin.events.length, \"We should have a track call\");\n                Assert.equal(0, channelPlugin.events[0].data.trackPlugin);\n                Assert.equal(true, channelPlugin.events[0].data.sampled);\n\n                Assert.equal(iKey1, appInsightsCore.config.instrumentationKey, \"Test Core Instrumentation Key\");\n                Assert.equal(undefined, appInsightsCore.config.endpointUrl, \"Test Core Endpoint 1\");\n                Assert.equal(true, appInsightsCore.getCookieMgr().isEnabled(), \"Cookie Manager should be enabled\");\n\n                Assert.equal(iKey1, trackPlugin._config.instrumentationKey, \"Test plugin Instrumentation Key\");\n                Assert.equal(undefined, trackPlugin._config.endpointUrl, \"Test plugin Endpoint 1\");\n\n                Assert.equal(undefined, testSamplingPlugin._updatedConfig, \"Config has not been updated\");\n\n                Assert.equal(7, appInsightsCore.config.extensions!.length, dumpObj(appInsightsCore.config.extensions));\n\n                Assert.equal(false, definedProcessCalled, \"The spy has not been called yet\");\n                appInsightsCore.track({\n                    name: \"TestEvent\"\n                });\n\n                Assert.equal(true, definedProcessCalled, \"The processTelemetry should have been called\");\n\n                Assert.equal(4, this._throwInternalEvents.length, \"We should have got no messages\");\n                Assert.ok(strContains(this._throwInternalEvents[0].msg, \"Creating [config]\"), JSON.stringify(this._throwInternalEvents[0]));\n                Assert.ok(strContains(this._throwInternalEvents[1].msg, \"Setting value [\"), JSON.stringify(this._throwInternalEvents[1]));\n                Assert.ok(strContains(this._throwInternalEvents[2].msg, \"Setting value [\"), JSON.stringify(this._throwInternalEvents[2]));\n                Assert.ok(strContains(this._throwInternalEvents[3].msg, \"State [\"), JSON.stringify(this._throwInternalEvents[3]));\n                this._throwInternalEvents = [];\n            }\n        });\n\n        function createPerfMgr(core: IAppInsightsCore, manager: INotificationManager): IPerfManager {\n            return createPerfMgr(core, manager);\n        }\n\n        function assertSameValues(expected: any, actual: any, message: string) {\n            if (isFunction(expected)) {\n                // Functions should not be copied\n                Assert.equal(expected, actual, message + \" \" + dumpObj(actual));\n            } else if (isArray(expected)) {\n                Assert.equal(expected.length, actual.length, message + \" (length) \" + dumpObj(actual));\n                arrForEach(expected, (value, idx) => {\n                    Assert.equal(value, actual[idx], message + \" - \" + idx + \" \" + dumpObj(actual));\n                    if (isPlainObject(value)) {\n                        assertSameValues(expected, actual, message +  \" [\" + idx + \"]\");\n                    }\n                });\n            } else if (isPlainObject(expected)) {\n                Assert.equal(objKeys(expected).length, objKeys(actual).length, message + \" - same number of keys \" + dumpObj(actual));\n                objForEachKey(expected, (key, value) => {\n                    Assert.equal(value, actual[key], message + \" - \" + key + \" \" + dumpObj(actual));\n                    if (isPlainObject(value)) {\n                        assertSameValues(expected, actual, message +  \" [\" + key + \"]\");\n                    }\n                });\n            } else {\n                // Not an object so just validate directly\n                Assert.equal(expected, actual, message);\n            }\n        }\n    }\n}\n\nclass TestChannelPlugin implements IChannelControls {\n    public _nextPlugin: ITelemetryPlugin | ITelemetryPluginChain;\n    public isFlushInvoked = false;\n    public isUnloadInvoked = false;\n    public isTearDownInvoked = false;\n    public isResumeInvoked = false;\n    public isPauseInvoked = false;\n    public version: string = \"1.0.33-Beta\";\n\n    public processTelemetry;\n\n    public identifier = \"TestSender\";\n\n    public priority: number = 1001;\n    public events: ITelemetryItem[] = [];\n\n    constructor() {\n        this.processTelemetry = this._processTelemetry.bind(this);\n    }\n    public pause(): void {\n        this.isPauseInvoked = true;\n    }\n\n    public resume(): void {\n        this.isResumeInvoked = true;\n    }\n\n    public teardown(): void {\n        this.isTearDownInvoked = true;\n    }\n\n    flush(async?: boolean, callBack?: () => void): void {\n        this.isFlushInvoked = true;\n        if (callBack) {\n            callBack();\n        }\n    }\n\n    onunloadFlush(async?: boolean) {\n        this.isUnloadInvoked = true;\n    }\n\n    public setNextPlugin(next: ITelemetryPlugin | ITelemetryPluginChain): void {\n        this._nextPlugin = next;\n    }\n\n    public initialize = (config: IConfiguration) => {\n    }\n\n    public _processTelemetry(env: ITelemetryItem) {\n        this.events.push(env);\n\n        // Just calling processTelemetry as this is the original design of the Plugins (as opposed to the newer processNext())\n        this._nextPlugin?.processTelemetry(env);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/CoreTest.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { AppInsightsCore as AIInternalCore, AppInsightsExtCore, EventLatency, ExtFullVersionString, FullVersionString, IChannelControls, IExtendedConfiguration, IExtendedTelemetryItem, IPropertyStorageOverride, blockDynamicConversion } from '../../../../src/index';\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\n\nexport class CoreTest extends AITestClass {\n\n    private channelExtension: IChannelControls;\n    private channelExtensionWithVer: IChannelControls;\n\n    public testInitialize() {\n        // As the class is using dynamicProto we need to construct at least 1 instance\n        // before we can override/replace any prototype method as they are not populated\n        // until the 1st instance is created.\n        this._disableDynProtoBaseFuncs(dynamicProto); // We need to disable the useBaseInst performance setting as the sinon spy fools the internal logic and the spy is bypassed\n        // As we are now using the module as is we need to reach inside the current instance to get the correct instance of applicationinsights-core-js\n        QUnit.assert.notEqual(Object.getPrototypeOf(new AIInternalCore()).initialize, undefined, 'The prototype method must exist for the instance');\n        QUnit.assert.notEqual(AIInternalCore.prototype.initialize, undefined, 'The prototype method must exist');\n\n        this.channelExtension = blockDynamicConversion({\n            pause: () => { },\n            resume: () => { },\n            teardown: () => { },\n            flush: (async: any, callBack: any) => { },\n            processTelemetry: (env: any) => { },\n            setNextPlugin: (next: any) => { },\n            initialize: (config: any, core: any, extensions: any) => { },\n            identifier: \"testChannel\",\n            priority: 501\n        });\n\n        this.channelExtensionWithVer = blockDynamicConversion({\n            pause: () => { },\n            resume: () => { },\n            teardown: () => { },\n            flush: (async: any, callBack: any) => { },\n            processTelemetry: (env: any) => { },\n            setNextPlugin: (next: any) => { },\n            initialize: (config: any, core: any, extensions: any) => { },\n            identifier: \"testChannel\",\n            priority: 501,\n            version: \"channelVer\"\n        });\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"initialize test\",\n            test: () => {\n                this._disableDynProtoBaseFuncs(dynamicProto); // We need to disable the useBaseInst performance setting as the sinon spy fools the internal logic and the spy is bypassed\n\n                let coreTrackSpy = this.sandbox.spy(AIInternalCore.prototype, 'initialize');\n                var core: AppInsightsExtCore = new AppInsightsExtCore();\n\n                // As we are now using the module as is we need to reach inside the current instance to get the correct instance of applicationinsights-core-js\n                QUnit.assert.notEqual(AIInternalCore.prototype.initialize, Object.getPrototypeOf(core).initialize, 'The prototype method must not be the same as the current instance');\n\n                var testPropertyStorageOverride: IPropertyStorageOverride = {\n                    setProperty: (key: string, value: string) => {\n\n                    },\n                    getProperty: (key: string) => {\n                        return 'test property';\n                    }\n                };\n                var config: IExtendedConfiguration = {\n                    instrumentationKey: 'testIkey',\n                    propertyStorageOverride: testPropertyStorageOverride\n                };\n                core.initialize(config, [this.channelExtension]);\n                QUnit.assert.equal(coreTrackSpy.called, true, \"Expecting AI initialize was called\");\n                var actualConfig: IExtendedConfiguration = coreTrackSpy.getCall(0).args[0];\n                QUnit.assert.equal(actualConfig.endpointUrl, \"https://browser.events.data.microsoft.com/OneCollector/1.0/\");\n                QUnit.assert.equal(actualConfig.instrumentationKey, \"testIkey\");\n                if (actualConfig.propertyStorageOverride) {\n                    QUnit.assert.ok(actualConfig.propertyStorageOverride.getProperty('testKey') === 'test property');\n                }\n                QUnit.assert.equal(core.getWParam(), 0);\n            }\n        });\n\n        this.testCase({\n            name: \"Dynamic Config Test\",\n            useFakeTimers: true,\n            test: () => {\n                this._disableDynProtoBaseFuncs(dynamicProto); // We need to disable the useBaseInst performance setting as the sinon spy fools the internal logic and the spy is bypassed\n\n                let coreTrackSpy = this.sandbox.spy(AIInternalCore.prototype, 'initialize');\n                let config: IExtendedConfiguration = {};\n                let expectedIkey: string = \"test\";\n                let expectedEndpointUrl: string = \"https://browser.events.data.microsoft.com/OneCollector/1.0/\";\n                let expectedPropertyStorageOverride: IPropertyStorageOverride;\n                let core: AppInsightsExtCore = new AppInsightsExtCore();\n                \n                let onChangeCalled = 0;\n                let handler = core.onCfgChange((details) => {\n                    onChangeCalled ++;\n                    QUnit.assert.equal(expectedIkey, details.cfg.instrumentationKey, `onChangeCalled ${onChangeCalled} times: Expect the iKey to be set`);\n                    QUnit.assert.equal(expectedEndpointUrl, details.cfg.endpointUrl, `onChangeCalled ${onChangeCalled} times: Expect the endpoint to be set`);\n                    QUnit.assert.deepEqual(expectedPropertyStorageOverride, details.cfg.propertyStorageOverride, `onChangeCalled ${onChangeCalled} times: Expect the propertyStorageOverride to be set`);\n                });\n\n                // Check defaults\n                config = {instrumentationKey: expectedIkey}\n                core.initialize(config, [this.channelExtension]);\n                QUnit.assert.equal(coreTrackSpy.called, true, \"Expecting AI initialize was called\");\n                QUnit.assert.equal(1, onChangeCalled, \"oncfgChange should be called 1 times\");\n\n                // Check config changes\n                expectedPropertyStorageOverride = {\n                    setProperty: (key: string, value: string) => {\n                    },\n                    getProperty: (key: string) => {\n                        return 'test property';\n                    }\n                };\n                expectedEndpointUrl = \"https://testendpoint.com\";\n                expectedIkey = \"test1\";\n                core.config.instrumentationKey = expectedIkey;\n                core.config.endpointUrl = expectedEndpointUrl;\n                core.config.propertyStorageOverride = expectedPropertyStorageOverride;\n                this.clock.tick(1);\n                QUnit.assert.equal(onChangeCalled, 2, \"onConfigChange Called 2 times\");\n\n            }\n        });\n\n\n        this.testCase({\n            name: \"track test\",\n            test: () => {\n                this._disableDynProtoBaseFuncs(dynamicProto); // We need to disable the useBaseInst performance setting as the sinon spy fools the internal logic and the spy is bypassed\n                let coreTrackSpy = this.sandbox.spy(AIInternalCore.prototype, 'track');\n                var core: AppInsightsExtCore = new AppInsightsExtCore();\n\n                QUnit.assert.notEqual(AIInternalCore.prototype.track, Object.getPrototypeOf(core).track, 'The prototype method must not be the same as the current instance');\n\n                var config: IExtendedConfiguration = {\n                    instrumentationKey: 'testIkey'\n                };\n                core.initialize(config, [this.channelExtension]);\n                var telemetryItem: IExtendedTelemetryItem = {\n                    name: 'testEvent',\n                    baseType: 'testEventBaseType'\n                };\n                core.track(telemetryItem);\n                QUnit.assert.equal(coreTrackSpy.called, true, \"Expecting the AI Core was called\");\n                var actualEvent: IExtendedTelemetryItem = coreTrackSpy.getCall(0).args[0];\n                QUnit.assert.equal(actualEvent.name, \"testEvent\");\n                QUnit.assert.equal(actualEvent.latency, EventLatency.Normal);\n                QUnit.assert.ok(actualEvent.ext['sdk']['ver'].indexOf('1DS-Web-JS') > -1);\n                QUnit.assert.equal(actualEvent.ext['sdk']['ver'], ExtFullVersionString, actualEvent.ext['sdk']['ver']);\n                QUnit.assert.equal(actualEvent.ext['sdk']['ver'], FullVersionString, \"FullVersionString should match ExtFullVersionString\");\n                QUnit.assert.equal(isNaN(actualEvent.timings.trackStart as number), false);\n                QUnit.assert.equal(actualEvent.baseData['properties']['version'], '', actualEvent.baseData['properties']['version']);\n            }\n        });\n\n        this.testCase({\n            name: \"track test with provided item properties version\",\n            test: () => {\n                this._disableDynProtoBaseFuncs(dynamicProto); // We need to disable the useBaseInst performance setting as the sinon spy fools the internal logic and the spy is bypassed\n                let coreTrackSpy = this.sandbox.spy(AIInternalCore.prototype, 'track');\n                var core: AppInsightsExtCore = new AppInsightsExtCore();\n\n                QUnit.assert.notEqual(AIInternalCore.prototype.track, Object.getPrototypeOf(core).track, 'The prototype method must not be the same as the current instance');\n\n                var config: IExtendedConfiguration = {\n                    instrumentationKey: 'testIkey'\n                };\n           \n                core.initialize(config, [this.channelExtensionWithVer]);\n                var telemetryItem: IExtendedTelemetryItem = {\n                    name: 'testEvent',\n                    baseType: 'testEventBaseType',\n                    baseData:{}\n                };\n                telemetryItem.baseData['properties'] = {version:'version1'};\n                core.track(telemetryItem);\n                QUnit.assert.equal(coreTrackSpy.called, true, \"Expecting the AI Core was called\");\n                var actualEvent: IExtendedTelemetryItem = coreTrackSpy.getCall(0).args[0];\n                QUnit.assert.equal(actualEvent.name, \"testEvent\");\n                QUnit.assert.ok(actualEvent.ext['sdk']['ver'].indexOf('1DS-Web-JS') > -1);\n                QUnit.assert.equal(actualEvent.ext['sdk']['ver'], ExtFullVersionString, actualEvent.ext['sdk']['ver']);\n                QUnit.assert.equal(actualEvent.ext['sdk']['ver'], FullVersionString, \"FullVersionString should match ExtFullVersionString\");\n                QUnit.assert.equal(actualEvent.baseData['properties']['version'], 'version1', actualEvent.baseData['properties']['version']);\n            }\n        });\n\n        this.testCase({\n            name: \"track test with provided plugin version and no item properties version\",\n            test: () => {\n                this._disableDynProtoBaseFuncs(dynamicProto); // We need to disable the useBaseInst performance setting as the sinon spy fools the internal logic and the spy is bypassed\n                let coreTrackSpy = this.sandbox.spy(AIInternalCore.prototype, 'track');\n                var core: AppInsightsExtCore = new AppInsightsExtCore();\n\n                QUnit.assert.notEqual(AIInternalCore.prototype.track, Object.getPrototypeOf(core).track, 'The prototype method must not be the same as the current instance');\n\n                var config: IExtendedConfiguration = {\n                    instrumentationKey: 'testIkey'\n                };\n                core.initialize(config, [this.channelExtensionWithVer]);\n                var telemetryItem: IExtendedTelemetryItem = {\n                    name: 'testEvent',\n                    baseType: 'testEventBaseType'\n                };\n                core.track(telemetryItem);\n                QUnit.assert.equal(coreTrackSpy.called, true, \"Expecting the AI Core was called\");\n                var actualEvent: IExtendedTelemetryItem = coreTrackSpy.getCall(0).args[0];\n                QUnit.assert.equal(actualEvent.name, \"testEvent\");\n                QUnit.assert.ok(actualEvent.ext['sdk']['ver'].indexOf('1DS-Web-JS') > -1);\n                QUnit.assert.equal(actualEvent.ext['sdk']['ver'], ExtFullVersionString, actualEvent.ext['sdk']['ver']);\n                QUnit.assert.equal(actualEvent.ext['sdk']['ver'], FullVersionString, \"FullVersionString should match ExtFullVersionString\");\n                QUnit.assert.equal(actualEvent.baseData['properties']['version'], 'testChannel=channelVer', actualEvent.baseData['properties']['version']);\n            }\n        });\n\n        this.testCase({\n            name: \"Check inheritence implementation\",\n            test: () => {\n                var core1: AppInsightsExtCore = new AppInsightsExtCore();\n                var core2: AppInsightsExtCore = new AppInsightsExtCore();\n\n                // Make sure the 2 initialize methods are actually different function instances\n                QUnit.assert.ok(!core1.hasOwnProperty(\"initialize\"), \"initialize should not be an instance function\");\n                QUnit.assert.ok(!core2.hasOwnProperty(\"initialize\"), \"initialize should not be an instance function\");\n                QUnit.assert.equal(core1.initialize, core2.initialize, \"initialize function should be the same (i.e. prototype based methods)\");\n\n                QUnit.assert.ok(!core1.hasOwnProperty(\"track\"), \"track should not be an instance function\");\n                QUnit.assert.ok(!core2.hasOwnProperty(\"track\"), \"track should not be an instance function\");\n                QUnit.assert.equal(core1.track, core2.track, \"track function should be the same (i.e. prototype based methods)\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/DynamicProtoTests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport dynamicProto from '@microsoft/dynamicproto-js';\n\ninterface IInheritTest {\n    executionOrder:string[];\n    testFunction?(): void;\n}\n\nclass InheritTest1 implements IInheritTest {\n    public executionOrder:string[] = [];\n\n    constructor() {\n        this.executionOrder.push(\"InheritTest1()\");\n    }\n\n    public testFunction() {\n        this.executionOrder.push(\"InheritTest1.test()\");\n    }\n}\n\nclass InheritTest2 extends InheritTest1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InheritTest2()\");\n    }\n\n    public testFunction() {\n        super.testFunction();\n        this.executionOrder.push(\"InheritTest2.test()\");\n    }\n}\n\nclass InheritTest3 extends InheritTest2 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InheritTest3()\");\n    }\n\n    public testFunction() {\n        super.testFunction();\n        this.executionOrder.push(\"InheritTest3.test()\");\n    }\n}\n\nclass DynInheritTest1 implements IInheritTest {\n    public executionOrder:string[] = [];\n\n    public testFunction?(): void;\n\n    constructor() {\n        this.executionOrder.push(\"DynInheritTest1()\");\n        dynamicProto(DynInheritTest1, this, (_self, base) => {\n            _self.testFunction = () => {\n                this.executionOrder.push(\"DynInheritTest1.test()\");\n            }\n        });\n    }\n}\n\nclass InheritTest4 extends DynInheritTest1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InheritTest4()\");\n    }\n\n    public testFunction() {\n        super.testFunction();\n        this.executionOrder.push(\"InheritTest4.test()\");\n    }\n}\n\nclass InheritTest5 extends InheritTest4 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InheritTest5()\");\n    }\n\n    public testFunction() {\n        super.testFunction();\n        this.executionOrder.push(\"InheritTest5.test()\");\n    }\n}\n\nclass DynInheritTest2 extends InheritTest1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest2()\");\n        dynamicProto(DynInheritTest2, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest2.test()\");\n            }\n        });\n    }\n}\n\nclass DynInheritTest3 extends DynInheritTest2 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest3()\");\n        dynamicProto(DynInheritTest3, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest3.test()\");\n            }\n        });\n    }\n}\n\nclass InheritTest6 extends DynInheritTest2 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InheritTest6()\");\n    }\n\n    public testFunction() {\n        super.testFunction();\n        this.executionOrder.push(\"InheritTest6.test()\");\n    }\n}\n\nclass DynInheritTest4 extends InheritTest6 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest4()\");\n        dynamicProto(DynInheritTest4, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest4.test()\");\n            }\n        });\n    }\n}\n\nclass DynInheritTest5 extends DynInheritTest1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest5()\");\n        dynamicProto(DynInheritTest5, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest5.test()\");\n            }\n        });\n    }\n}\n\nclass DynInheritTest6 extends DynInheritTest5 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest6()\");\n        dynamicProto(DynInheritTest6, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest6.test()\");\n            }\n        });\n    }\n}\n\nclass InstInherit1 implements IInheritTest {\n    public executionOrder:string[] = [];\n\n    public testFunction?():void;\n\n    constructor() {\n        this.executionOrder.push(\"InstInherit1()\");\n\n        this.testFunction = () => {\n            this.executionOrder.push(\"InstInherit1.test()\");\n        }\n    }\n}\n\nclass InstInherit2 extends InheritTest2 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InstInherit2()\");\n\n        this.testFunction = () => {\n            super.testFunction();\n            this.executionOrder.push(\"InstInherit2.test()\");\n        }\n    }\n}\n\nclass InheritTest7 extends InstInherit1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InheritTest7()\");\n    }\n\n    public testFunction() {\n        super.testFunction();\n        this.executionOrder.push(\"InheritTest7.test()\");\n    }\n}\n\nclass DynInheritTest7 extends InstInherit1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest7()\");\n        dynamicProto(DynInheritTest7, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest7.test()\");\n            }\n        });\n    }\n}\n\nclass InstInherit3 extends DynInheritTest7 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"InstInherit3()\");\n\n        this.testFunction = () => {\n            super.testFunction();\n            this.executionOrder.push(\"InstInherit3.test()\");\n        }\n    }\n}\n\nclass DynInheritTest8 extends InstInherit3 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest8()\");\n        dynamicProto(DynInheritTest8, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest8.test()\");\n            }\n        });\n    }\n}\n\nclass BadInstInherit1 extends InstInherit1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"BadInstInherit1()\");\n\n        this.testFunction = () => {\n            try {\n                super.testFunction();\n            } catch (e) {\n                this.executionOrder.push(\"BadInstInherit1.throw()\");\n            }\n            this.executionOrder.push(\"BadInstInherit1.test()\");\n        }\n    }\n}\n\nclass DynInheritTest9 extends BadInstInherit1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest9()\");\n        dynamicProto(DynInheritTest9, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest9.test()\");\n            }\n        });\n    }\n}\n\nclass GoodInstInherit1 extends InstInherit1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"GoodInstInherit1()\");\n\n        let prevTestFunc = this.testFunction;\n        this.testFunction = () => {\n            prevTestFunc.call(this);\n            this.executionOrder.push(\"GoodInstInherit1.test()\");\n        }\n    }\n}\n\nclass DynInheritTest10 extends GoodInstInherit1 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"DynInheritTest10()\");\n        dynamicProto(DynInheritTest10, this, (_self, base) => {\n            _self.testFunction = () => {\n                base.testFunction();\n                this.executionOrder.push(\"DynInheritTest10.test()\");\n            }\n        });\n    }\n}\n\nclass GoodInstInherit2 extends DynInheritTest10 {\n    constructor() {\n        super();\n        this.executionOrder.push(\"GoodInstInherit2()\");\n\n        let prevTestFunc = this.testFunction;\n        this.testFunction = () => {\n            prevTestFunc.call(this);\n            this.executionOrder.push(\"GoodInstInherit2.test()\");\n        }\n    }\n}\n\nexport class DynamicProtoTests extends AITestClass {\n\n    public testInitialize() {\n    }\n\n    private _validateOrder(message:string, actual:string[], expected:string[]) {\n        QUnit.assert.equal(actual.length, expected.length, message + \": Checking the length\");\n\n        let passed = true;\n        let error = \"\";\n        for (let lp = 0; lp < expected.length; lp++) {\n            if (lp < actual.length) {\n                if (actual[lp] !== expected[lp]) {\n                    passed = false\n                    error += \" **[\" + actual[lp] + \"!=\" + expected[lp] + \"]**;\"\n                } else {\n                    error += \" \" + expected[lp] + \";\";\n                }\n            } else {\n                passed = false;\n                error += \" --[\" + expected[lp] + \"]--;\"\n            }\n        }\n\n        // Fail test and log any extra unexpected calls\n        for (let lp = expected.length; lp < actual.length; lp++) {\n            passed = false;\n            error += \" ++[\" + actual[lp] + \"]++;\"\n        }\n\n        QUnit.assert.ok(passed, message + \":\" + error);\n    }\n\n    private doTest(message:string, theTest:IInheritTest, expectedOrder:string[])\n    {\n        theTest.testFunction();\n        this._validateOrder(message, theTest.executionOrder, expectedOrder);\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Inheritance tests\",\n            test: () => {\n                this.doTest(\"InheritTest1\", new InheritTest1(), [\n                    \"InheritTest1()\", \n                    \"InheritTest1.test()\"\n                ]);\n\n                this.doTest(\"InheritTest2\", new InheritTest2(), [\n                    \"InheritTest1()\", \n                    \"InheritTest2()\", \n                    \"InheritTest1.test()\",\n                    \"InheritTest2.test()\"\n                ]);\n\n                this.doTest(\"InheritTest3\", new InheritTest3(), [\n                    \"InheritTest1()\", \n                    \"InheritTest2()\", \n                    \"InheritTest3()\", \n                    \"InheritTest1.test()\",\n                    \"InheritTest2.test()\",\n                    \"InheritTest3.test()\"\n                ]);\n\n                this.doTest(\"InheritTest4\", new InheritTest4(), [\n                    \"DynInheritTest1()\", \n                    \"InheritTest4()\", \n                    \"DynInheritTest1.test()\",\n                    \"InheritTest4.test()\"\n                ]);\n\n                this.doTest(\"InheritTest5\", new InheritTest5(), [\n                    \"DynInheritTest1()\", \n                    \"InheritTest4()\", \n                    \"InheritTest5()\", \n                    \"DynInheritTest1.test()\",\n                    \"InheritTest4.test()\",\n                    \"InheritTest5.test()\"\n                ]);\n\n                this.doTest(\"DynInheritTest1\", new DynInheritTest1(), [\n                    \"DynInheritTest1()\", \n                    \"DynInheritTest1.test()\"\n                ]);\n\n                this.doTest(\"DynInheritTest2\", new DynInheritTest2(), [\n                    \"InheritTest1()\", \n                    \"DynInheritTest2()\", \n                    \"InheritTest1.test()\",\n                    \"DynInheritTest2.test()\"\n                ]);\n\n                this.doTest(\"DynInheritTest3\", new DynInheritTest3(), [\n                    \"InheritTest1()\", \n                    \"DynInheritTest2()\", \n                    \"DynInheritTest3()\", \n                    \"InheritTest1.test()\",\n                    \"DynInheritTest2.test()\",\n                    \"DynInheritTest3.test()\"\n                ]);\n\n                this.doTest(\"InheritTest6\", new InheritTest6(), [\n                    \"InheritTest1()\", \n                    \"DynInheritTest2()\", \n                    \"InheritTest6()\", \n                    \"InheritTest1.test()\",\n                    \"DynInheritTest2.test()\",\n                    \"InheritTest6.test()\"\n                ]);\n\n                this.doTest(\"DynInheritTest4\", new DynInheritTest4(), [\n                    \"InheritTest1()\", \n                    \"DynInheritTest2()\", \n                    \"InheritTest6()\", \n                    \"DynInheritTest4()\", \n                    \"InheritTest1.test()\",\n                    \"DynInheritTest2.test()\",\n                    \"InheritTest6.test()\",\n                    \"DynInheritTest4.test()\"\n                ]);\n\n                this.doTest(\"DynInheritTest5\", new DynInheritTest5(), [\n                    \"DynInheritTest1()\", \n                    \"DynInheritTest5()\", \n                    \"DynInheritTest1.test()\",\n                    \"DynInheritTest5.test()\"\n                ]);\n\n                this.doTest(\"DynInheritTest6\", new DynInheritTest6(), [\n                    \"DynInheritTest1()\", \n                    \"DynInheritTest5()\", \n                    \"DynInheritTest6()\", \n                    \"DynInheritTest1.test()\",\n                    \"DynInheritTest5.test()\",\n                    \"DynInheritTest6.test()\"\n                ]);\n\n\n                this.doTest(\"InstInherit1\", new InstInherit1(), [\n                    \"InstInherit1()\", \n                    \"InstInherit1.test()\"\n                ]);\n\n                this.doTest(\"InstInherit2\", new InstInherit2(), [\n                    \"InheritTest1()\",\n                    \"InheritTest2()\", \n                    \"InstInherit2()\",\n                    \"InheritTest1.test()\",\n                    \"InheritTest2.test()\",\n                    \"InstInherit2.test()\"\n                ]);\n\n                // NOTE: Notice that InheritTest7.test() was not called -- this is because TS doesn't handle this\n                this.doTest(\"InheritTest7\", new InheritTest7(), [\n                    \"InstInherit1()\",\n                    \"InheritTest7()\", \n                    \"InstInherit1.test()\"\n                ]);\n\n                // NOTE: Notice that DynInheritTest7.test() IS called -- this is because dynamicProto handles this scenario\n                this.doTest(\"DynInheritTest7\", new DynInheritTest7(), [\n                    \"InstInherit1()\", \n                    \"DynInheritTest7()\", \n                    \"InstInherit1.test()\",\n                    \"DynInheritTest7.test()\"\n                ]);\n\n                this.doTest(\"InstInherit3\", new InstInherit3(), [\n                    \"InstInherit1()\", \n                    \"DynInheritTest7()\", \n                    \"InstInherit3()\", \n                    \"InstInherit1.test()\",\n                    \"DynInheritTest7.test()\",\n                    \"InstInherit3.test()\"\n                ]);\n                \n                this.doTest(\"DynInheritTest8\", new DynInheritTest8(), [\n                    \"InstInherit1()\", \n                    \"DynInheritTest7()\", \n                    \"InstInherit3()\", \n                    \"DynInheritTest8()\", \n                    \"InstInherit1.test()\",\n                    \"DynInheritTest7.test()\",\n                    \"InstInherit3.test()\",\n                    \"DynInheritTest8.test()\"\n                ]);\n                \n                // Note: Bad inherit as with InheritTest7 fails to call base instance and actually throws in this case\n                this.doTest(\"BadInstInherit1\", new BadInstInherit1(), [\n                    \"InstInherit1()\", \n                    \"BadInstInherit1()\",\n                    \"BadInstInherit1.throw()\",\n                    \"BadInstInherit1.test()\"\n                ]);\n\n                // Note: dynamicProto doesn't fix broken base classes, but it still calls them in the correct order\n                this.doTest(\"DynInheritTest9\", new DynInheritTest9(), [\n                    \"InstInherit1()\", \n                    \"BadInstInherit1()\",\n                    \"DynInheritTest9()\",\n                    \"BadInstInherit1.throw()\",\n                    \"BadInstInherit1.test()\",\n                    \"DynInheritTest9.test()\"\n                ]);\n\n                this.doTest(\"GoodInstInherit1\", new GoodInstInherit1(), [\n                    \"InstInherit1()\", \n                    \"GoodInstInherit1()\", \n                    \"InstInherit1.test()\",\n                    \"GoodInstInherit1.test()\"\n                ]);\n\n                this.doTest(\"DynInheritTest10\", new DynInheritTest10(), [\n                    \"InstInherit1()\", \n                    \"GoodInstInherit1()\",\n                    \"DynInheritTest10()\",\n                    \"InstInherit1.test()\",\n                    \"GoodInstInherit1.test()\",\n                    \"DynInheritTest10.test()\"\n                ]);\n\n                this.doTest(\"GoodInstInherit2\", new GoodInstInherit2(), [\n                    \"InstInherit1()\", \n                    \"GoodInstInherit1()\",\n                    \"DynInheritTest10()\",\n                    \"GoodInstInherit2()\",\n                    \"InstInherit1.test()\",\n                    \"GoodInstInherit1.test()\",\n                    \"DynInheritTest10.test()\",\n                    \"GoodInstInherit2.test()\",\n                ]);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/ESPromiseSchedulerTests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { DiagnosticLogger } from '../../../../src/index';\nimport { strIndexOf } from '@nevware21/ts-utils';\nimport { createAsyncPromise, createNativePromise, createNativeResolvedPromise, createTaskScheduler } from '@nevware21/ts-async';\n\nexport function makeRegex(value: string) {\n    if (value && value.length > 0) {\n        // Escape any slashes first!\n        value = value.replace(/\\\\/g, \"\\\\\\\\\");\n        // eslint-disable-next-line security/detect-non-literal-regexp\n        value = value.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/])/g, \"\\\\$1\");\n        value = value.replace(/\\*/g, \".*\");\n        return new RegExp(\"(\" + value + \")\");\n    }\n    \n    return null;\n}\nexport class ESPromiseSchedulerTests extends AITestClass {\n    private _traceLogger: DiagnosticLogger;\n\n    public testInitialize() {\n        this._traceLogger = new DiagnosticLogger(<any>{ loggingLevelConsole: 1 });\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Test that the scheduler waits for the events correctly\",\n            test: () => {\n                let scheduler = createTaskScheduler(createAsyncPromise, \"test1\");\n\n                let order:string[] = [];\n                let expectedOrder:string[] = [];\n                expectedOrder.push(\"sch1\");\n                expectedOrder.push(\"sch2\");\n                expectedOrder.push(\"sch3\");\n                expectedOrder.push(\"sch4\");\n                expectedOrder.push(\"wait\");\n                expectedOrder.push(\"test1\");\n                expectedOrder.push(\"finished1\");\n                expectedOrder.push(\"test2\");\n                expectedOrder.push(\"sch2.1\");\n                expectedOrder.push(\"wait2.1\");\n                expectedOrder.push(\"sch2.2\");\n                expectedOrder.push(\"finished2.1\");\n                expectedOrder.push(\"finished2\");\n                expectedOrder.push(\"test3\");\n                expectedOrder.push(\"sch3.1\");\n                expectedOrder.push(\"finished3\");\n                expectedOrder.push(\"test4\");\n                expectedOrder.push(\"sch4.1\");\n                expectedOrder.push(\"reject4-Timeout: Task [test1.0.3-(t4)] - Running: * ms\");\n                expectedOrder.push(\"test2.2\");\n                expectedOrder.push(\"sch2.3\");\n                expectedOrder.push(\"reject2.2-Timeout: Task [test1.0.4-(2.2)] - Running: * ms\");\n                expectedOrder.push(\"test3.1\");\n                expectedOrder.push(\"finished3.1\");\n                expectedOrder.push(\"test4.1\");\n                expectedOrder.push(\"wait4.2\");\n                expectedOrder.push(\"sch4.3\");\n                expectedOrder.push(\"finished4.2\");\n                expectedOrder.push(\"finished4.1\");\n                expectedOrder.push(\"wait2.3\");\n                expectedOrder.push(\"test2.3\");\n                expectedOrder.push(\"finished2.3\");\n                expectedOrder.push(\"test4.3\");\n                expectedOrder.push(\"finished4.3\");\n\n                let testWait = createNativePromise((testComplete) => {\n                    order.push(\"sch1\");\n                    scheduler.queue(() => {\n                        return createNativePromise((test1Complete) => {\n                            setTimeout(() => {\n                                order.push(\"test1\");\n                                test1Complete(\"t1.complete\");\n                            }, 20);\n                        });\n                    }, \"t1\").then(() => {\n                        order.push(\"finished1\");\n                    });\n                    order.push(\"sch2\");\n                    scheduler.queue(() => {\n                        order.push(\"test2\");\n                        order.push(\"sch2.1\");\n                        return createNativePromise<void>((t21Resolve) => {\n                            order.push(\"wait2.1\");\n                            setTimeout(() => {\n                                order.push(\"sch2.2\");\n                                scheduler.queue(() => {\n                                    order.push(\"test2.2\");\n                                    order.push(\"sch2.3\");\n                                    return scheduler.queue(() => {\n                                        return createNativePromise((t23Resolve) => {\n                                            order.push(\"wait2.3\");\n                                            setTimeout(() => {\n                                                order.push(\"test2.3\");\n                                                t23Resolve(\"2.3.complete\");\n                                            }, 1)\n                                        });\n                                    }, \"2.3\").then(() => {\n                                        order.push(\"finished2.3\");\n                                    }, (reason) => {\n                                        order.push(\"reject2.3-\" + reason);\n                                    });\n                                }, \"2.2\", 10).then(() => {\n                                    order.push(\"finished2.2\");\n                                }, (reason) => {\n                                    order.push(\"reject2.2-\" + reason);\n                                });\n                                t21Resolve();\n                            }, 1);\n                        }).then(() => {\n                            order.push(\"finished2.1\");\n                        }, (reason) => {\n                            order.push(\"reject2.1-\" + reason);\n                        });\n                    }, \"t2\").then(() => {\n                        order.push(\"finished2\");\n                    }, (reason) => {\n                        order.push(\"reject2-\" + reason);\n                    });\n                    order.push(\"sch3\");\n                    scheduler.queue(() => {\n                        order.push(\"test3\");\n                        order.push(\"sch3.1\");\n                        scheduler.queue(() => {\n                            order.push(\"test3.1\");\n                            return createNativeResolvedPromise(\"t3.1.complete\");\n                        }, \"3.1\").then(() => {\n                            order.push(\"finished3.1\");\n                        }, (reason) => {\n                            order.push(\"reject3.1-\" + reason);\n                        });\n                        return createNativeResolvedPromise(\"t3.complete\");\n                    }, \"t3\", 10).then(() => {\n                        order.push(\"finished3\");\n                    }, (reason) => {\n                        order.push(\"reject3-\" + reason);\n                    });\n\n                    order.push(\"sch4\");\n                    scheduler.queue(() => {\n                        order.push(\"test4\");\n                        order.push(\"sch4.1\");\n                        // Note because this is returning the scheduling result (promise) it will actually run immediately (this avoids avoid deadlocking) as the test2 event is not complete yet\n                        // which means there is actually no \"waiting\" scheduled event\n                        return scheduler.queue(() => {\n                            order.push(\"test4.1\");\n                            return createNativePromise<void>((t42Resolve) => {\n                                order.push(\"wait4.2\");\n                                setTimeout(() => {\n                                    order.push(\"sch4.3\");\n                                    scheduler.queue(() => {\n                                        order.push(\"test4.3\");\n                                        return createNativeResolvedPromise(\"resolved\");\n                                    }, \"4.3\").then(() => {\n                                        order.push(\"finished4.3\");\n                                        testComplete(\"t4.3.complete\");\n                                    }, (reason) => {\n                                        order.push(\"reject4.3-\" + reason);\n                                        testComplete(\"t4.3.complete\");\n                                    });\n                                    // Just resolve this one\n                                    t42Resolve();\n                                }, 1)\n                            }).then(() => {\n                                order.push(\"finished4.2\")\n                            }, (reason) => {\n                                order.push(\"reject4.2-\" + reason);\n                            });\n                        }, \"t4.1\").then(() => {\n                            order.push(\"finished4.1\");\n                        }, (reason) => {\n                            order.push(\"reject4.1-\" + reason);\n                        });\n                    }, \"t4\", 10).then(() => {\n                        order.push(\"finished4\");\n                    }, (reason) => {\n                        order.push(\"reject4-\" + reason);\n                    });\n                });\n\n                order.push(\"wait\");\n                return testWait.then(() => {\n                    QUnit.assert.equal(order.length, expectedOrder.length, \"Expecting all scheduled event have completed\");\n                    for (let lp = 0; lp < expectedOrder.length; lp++) {\n                        if (order.length > lp) {\n                            if (strIndexOf(expectedOrder[lp], \"*\")) {\n                                QUnit.assert.ok(makeRegex(expectedOrder[lp])!.test(order[lp]), \"Checking - \" + order[lp]);\n                            } else {\n                                QUnit.assert.equal(order[lp], expectedOrder[lp], expectedOrder[lp]);\n                            }\n                        } else {\n                            QUnit.assert.ok(false, \"Missing expected result - \" + expectedOrder[lp]);\n                        }\n                    }\n                }) as PromiseLike<any>;\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/ESPromiseTests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { createAsyncAllPromise, createAsyncPromise, createAsyncRejectedPromise, createAsyncResolvedPromise, IPromise } from '@nevware21/ts-async';\n\nexport class ESPromiseTests extends AITestClass {\n\n    public testInitialize() {\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Test promise with invalid resolver\",\n            useFakeTimers: true,\n            test: () => {\n                try {\n                    let promise = createAsyncPromise(undefined as any);\n                    QUnit.assert.ok(false, \"expected an exception to be thrown with undefined\");\n                } catch(e) {\n                    QUnit.assert.ok(e.message.indexOf(\"is not a function\") != -1, \"Expected the exception message to include reason for failure - \" + e.message);\n                }\n\n                try {\n                    let promise = createAsyncPromise(null as any);\n                    QUnit.assert.ok(false, \"expected an exception to be thrown with null\");\n                } catch(e) {\n                    QUnit.assert.ok(e.message.indexOf(\"is not a function\") != -1, \"Expected the exception message to include reason for failure - \" + e.message);\n                }\n\n                try {\n                    let promise = createAsyncPromise(<any>42);\n                    QUnit.assert.ok(false, \"expected an exception to be thrown with null\");\n                } catch(e) {\n                    QUnit.assert.ok(e.message.indexOf(\"is not a function\") != -1, \"Expected the exception message to include reason for failure - \" + e.message);\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Test resolving promise\",\n            useFakeTimers: true,\n            test: () => {\n                let promise: IPromise<number>;\n                let resolvedValue = null;\n                let rejectedValue = null;\n                promise = createAsyncPromise<number>((resolve, reject) => {\n                    resolve(42);\n                }).then((value) => {\n                    resolvedValue = value;\n                    return value;\n                }, (value) => {\n                    rejectedValue = value;\n                    return value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, 42, \"Expected the promise to be resolved\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected\");\n\n                resolvedValue = null;\n                rejectedValue = null;\n                promise = createAsyncPromise<number>((resolve, reject) => {\n                    resolve(42);\n                }).then((value) => {\n                    resolvedValue = value;\n                    return value;\n                }).catch((value) => {\n                    rejectedValue = value;\n                    return value;\n                })\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, 42, \"Expected the promise to be resolved\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected\");\n            }\n        });\n\n        this.testCase({\n            name: \"Test rejecting promise\",\n            useFakeTimers: true,\n            test: () => {\n                let promise: IPromise<number>;\n                let resolvedValue: number | null = null;\n                let rejectedValue = null;\n                promise = createAsyncPromise<number>((resolve, reject) => {\n                    reject(-42);\n                }).then((value) => {\n                    resolvedValue = value;\n                    return value;\n                }, (value) => {\n                    rejectedValue = value;\n                    return value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved\");\n                QUnit.assert.equal(rejectedValue, -42, \"Expected the promise to be rejected\");\n\n                resolvedValue = null;\n                rejectedValue = null;\n                promise = createAsyncPromise<number>((resolve, reject) => {\n                    reject(-42);\n                }).then((value) => {\n                    resolvedValue = value;\n                    return value;\n                }).catch((value) => {\n                    rejectedValue = value;\n                    return value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved\");\n                QUnit.assert.equal(rejectedValue, -42, \"Expected the promise to be rejected\");\n            }\n        });\n\n        this.testCase({\n            name: \"Test rejecting promise by throwing\",\n            useFakeTimers: true,\n            test: () => {\n                let promise: IPromise<number> = null;\n                let resolvedValue: number | null = null;\n                let rejectedValue = null;\n                promise = createAsyncPromise<number>((resolve, reject) => {\n                    throw new Error(\"Simulated failure!\");\n                }).then((value) => {\n                    resolvedValue = value;\n                    return value;\n                }, (value) => {\n                    rejectedValue = value;\n                    return value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved\");\n                QUnit.assert.ok(rejectedValue != null, \"Expected the promise to be rejected with a value\");\n                QUnit.assert.ok(rejectedValue.message.indexOf(\"Simulated failure!\") != -1, \"Expected the promise to be rejected with the contained exception\");\n\n                resolvedValue = null;\n                rejectedValue = null;\n                promise = createAsyncPromise<number>((resolve, reject) => {\n                    throw new Error(\"Simulated failure!\");\n                }).then((value) => {\n                    resolvedValue = value;\n                    return value;\n                }).catch((value) => {\n                    rejectedValue = value;\n                    return value;\n                })\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved\");\n                QUnit.assert.ok(rejectedValue != null, \"Expected the promise to be rejected with a value\");\n                QUnit.assert.ok(rejectedValue.message.indexOf(\"Simulated failure!\") != -1, \"Expected the promise to be rejected with the contained exception\");\n            }\n        });\n\n        this.testCase({\n            name: \"Test resolving promise with a returned value\",\n            useFakeTimers: true,\n            test: () => {\n                let promise: IPromise<any> = null;\n                let subPromise: IPromise<number> = null;\n                let resolvedValue: any = null;\n                promise = createAsyncPromise<any>((resolve, reject) => {\n                    resolve(42);\n                }).then((value) => {\n                    return 53;\n                }).then((value) => {\n                    resolvedValue = value;\n                    return value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, 53, \"Expected the promise to be resolved with the returned value not the initial resolved value\");\n\n                resolvedValue = null;\n                promise = createAsyncPromise<any>((resolve, reject) => {\n                    resolve(42);\n                }).then((value) => {\n                    // Don't return anything\n                }).then((value) => {\n                    resolvedValue = value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, undefined, \"Expected the promise to be resolved with undefined from the Promise returned by the initial then\");\n            }\n        });\n\n        this.testCase({\n            name: \"Test resolving promise with a promise\",\n            useFakeTimers: true,\n            test: () => {\n                let promise: IPromise<any> = null;\n                let preResolved: IPromise<any> = createAsyncResolvedPromise(53);\n                let preRejected: IPromise<any> = createAsyncRejectedPromise(new Error(\"Simulated Pre Rejected Promise...\"));\n                // Handle the rejected promise to avoid test failure\n                preRejected.catch(() => {});\n\n                let resolvedValue = null;\n                let rejectedValue = null;\n                promise = createAsyncPromise<any>((resolve, reject) => {\n                    resolve(42);\n                }).then((value) => {\n                    return preResolved;\n                }).then((value) => {\n                    resolvedValue = value;\n                },\n                (value) => {\n                    rejectedValue = value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(10);\n                QUnit.assert.equal(resolvedValue, 53, \"Expected the promise to be resolved\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                resolvedValue = null;\n                rejectedValue = null;\n                promise = createAsyncPromise<any>((resolve, reject) => {\n                    resolve(42);\n                }).then((value) => {\n                    return preRejected;\n                }).then((value) => {\n                    resolvedValue = value;\n                },\n                (value) => {\n                    rejectedValue = value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur\n                this.clock.tick(10);\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to be resolved\");\n                QUnit.assert.ok(rejectedValue != null, \"Expected the promise to be rejected with a value\");\n                QUnit.assert.ok(rejectedValue.message.indexOf(\"Simulated Pre Rejected Promise\") != -1, \"Expected the promise to be rejected with the contained exception\");\n\n                let unresolvedPromise = createAsyncPromise((resolve, reject) => {\n                    setTimeout(() => {\n                        resolve(68);\n                    }, 2000);\n                })\n                resolvedValue = null;\n                rejectedValue = null;\n                promise = createAsyncPromise<any>((resolve, reject) => {\n                    resolve(42);\n                }).then((value) => {\n                    return unresolvedPromise;\n                }).then((value) => {\n                    resolvedValue = value;\n                },\n                (value) => {\n                    rejectedValue = value;\n                });\n\n                // Should not be resolved or rejected yet as this should happen asynchronously\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Cause the async promise execution to occur, but not enough for the unresolved promise\n                this.clock.tick(100);\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // let some more time pass but still not enough for the unresolved promise\n                this.clock.tick(1000);\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                // Now lets trigger the unresolved promise\n                this.clock.tick(1000);\n                QUnit.assert.equal(resolvedValue, 68, \"Expected the promise to be resolved\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n            }\n        });\n\n        this.testCase({\n            name: \"Testing waiting for multiple promises\",\n            useFakeTimers: true,\n            test: () => {\n                let workerPromises: IPromise<any>[] = [];\n                let workerResolved: boolean[] = [];\n                let resolvedValue:any = null;\n\n                // Create the promises\n                for (let lp = 0; lp < 10; lp++) {\n                    workerResolved[lp] = false;\n                    workerPromises[lp] = createAsyncPromise<any>((resolve, reject) => {\n                        setTimeout(() => {\n                            // Wait to resolve this promise\n                            workerResolved[lp] = true;\n                            resolve(lp);\n                        }, (lp + 1) * 1000);\n                    })\n                }\n\n                // Create the uber waiting promise\n                let thePromise: IPromise<any> = createAsyncAllPromise(workerPromises);\n                thePromise.then((value) => {\n                    resolvedValue = value;\n                });\n\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n\n                for (let lp = 0; lp < 10; lp++) {\n                    this.clock.tick(100);\n                    QUnit.assert.equal(workerResolved[lp], false, \"Worker not resolved yet\");\n                    QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet - \" + lp);\n                    this.clock.tick(899);\n                    QUnit.assert.equal(workerResolved[lp], false, \"Worker not resolved yet\");\n                    QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet - \" + lp);\n                    // This will cause the worker promise to get resolved\n                    this.clock.tick(1);\n                    QUnit.assert.equal(workerResolved[lp], true, \"Worker now resolved\");\n                }\n\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                this.clock.tick(50);\n                QUnit.assert.ok(resolvedValue != null, \"Expected the promise to be resolved\");\n                for (let lp = 0; lp < 10; lp++)\n                {\n                    QUnit.assert.equal(resolvedValue[lp], lp, \"Value mismatch\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"Testing waiting for multiple promises where one rejects\",\n            useFakeTimers: true,\n            test: () => {\n                let workerPromises: IPromise<any>[] = [];\n                let workerResolved: boolean[] = [];\n                let resolvedValue:any = null;\n                let rejectedValue:any = null;\n\n                // Create the promises\n                for (let lp = 0; lp < 10; lp++) {\n                    workerResolved[lp] = false;\n                    workerPromises[lp] = createAsyncPromise<any>((resolve, reject) => {\n                        setTimeout(() => {\n                            // Wait to resolve this promise\n                            workerResolved[lp] = true;\n                            if (lp == 5)\n                            {\n                                reject(new Error(\"Simulated Rejection\"));\n                                return;\n                            }\n\n                            resolve(lp);\n                        }, (lp + 1) * 1000);\n                    })\n                }\n\n                // Create the uber waiting promise\n                let thePromise: IPromise<any> = createAsyncAllPromise(workerPromises);\n                thePromise.then((value) => {\n                    resolvedValue = value;\n                },\n                (value) => {\n                    rejectedValue = value;\n                });\n\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n\n                for (let lp = 0; lp < 5; lp++) {\n                    this.clock.tick(100);\n                    QUnit.assert.equal(workerResolved[lp], false, \"Worker not resolved yet\");\n                    QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet - \" + lp);\n                    QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet - \" + lp);\n                    this.clock.tick(899);\n                    QUnit.assert.equal(workerResolved[lp], false, \"Worker not resolved yet\");\n                    QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet - \" + lp);\n                    QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet - \" + lp);\n                    // This will cause the worker promise to get resolved\n                    this.clock.tick(1);\n                    QUnit.assert.equal(workerResolved[lp], true, \"Worker now resolved\");\n                }\n\n                QUnit.assert.equal(resolvedValue, null, \"Expected the promise to not be resolved yet\");\n                QUnit.assert.equal(rejectedValue, null, \"Expected the promise to not be rejected yet\");\n                \n                // Now lets cause the rejected promise to run\n                this.clock.tick(1500);\n                QUnit.assert.ok(resolvedValue == null, \"Expected the promise to not be resolved\");\n                QUnit.assert.ok(rejectedValue != null, \"Expected the promise to be rejected\");\n                QUnit.assert.ok(rejectedValue.message.indexOf(\"Simulated Rejection\") != -1, \"Main promise should have rejected with the rejected error\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/GlobalTestHooks.Test.ts",
    "content": "import { Assert } from \"@microsoft/ai-test-framework\";\nimport { _testHookMaxUnloadHooksCb } from \"../../../../src/index\";\nimport { dumpObj } from \"@nevware21/ts-utils\";\n\nexport class GlobalTestHooks {\n\n    public registerTests() {\n        // Set a global maximum\n        _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array<any>) => {\n            Assert.ok(false, \"Max unload hooks exceeded [\" + hooks.length + \"] - \" + state + \" - \" + dumpObj(hooks));\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/SpanUtilsTests.ts",
    "content": "// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { getDeferred, ICachedValue, objDefine, strSubstr } from \"@nevware21/ts-utils\";\nimport {\n    IAppInsightsCore,\n    IReadableSpan,\n    eOTelSpanKind,\n    eOTelSpanStatusCode,\n    IDistributedTraceContext,\n    createDistributedTraceContext,\n    generateW3CId,\n    SEMATTRS_HTTP_METHOD,\n    SEMATTRS_HTTP_URL,\n    SEMATTRS_HTTP_STATUS_CODE,\n    SEMATTRS_DB_SYSTEM,\n    SEMATTRS_DB_STATEMENT,\n    SEMATTRS_DB_NAME,\n    SEMATTRS_RPC_SYSTEM,\n    SEMATTRS_RPC_GRPC_STATUS_CODE,\n    SEMATTRS_NET_PEER_NAME,\n    SEMATTRS_NET_PEER_PORT,\n    ATTR_HTTP_REQUEST_METHOD,\n    ATTR_HTTP_RESPONSE_STATUS_CODE,\n    ATTR_URL_FULL,\n    ATTR_ENDUSER_ID,\n    ATTR_ENDUSER_PSEUDO_ID,\n    SEMATTRS_HTTP_ROUTE,\n    ATTR_CLIENT_ADDRESS,\n    AppInsightsCore,\n    IConfiguration,\n    ITraceProvider,\n    ITraceHost,\n    IOTelSpanOptions,\n    createSpan,\n    IOTelSpanCtx,\n    IOTelApi,\n    IOTelConfig\n} from \"../../../../src/index\";\nimport { createExtendedTelemetryItemFromSpan, IMsWebSpanTelemetry } from \"../../../../src/ext/extSpanUtils\";\nimport { IExtendedTelemetryItem } from \"../../../../src/interfaces/ext/DataModels\";\n\nexport class SpanUtilsTests extends AITestClass {\n    private _core!: AppInsightsCore;\n    private _mockApi!: IOTelApi;\n    private _onEndCalls!: IReadableSpan[];\n\n    public testInitialize() {\n        super.testInitialize();\n        \n        this._onEndCalls = [];\n        \n        // Create mock API\n        this._mockApi = {\n            cfg: {\n                errorHandlers: {}\n            } as IOTelConfig\n        } as IOTelApi;\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this._onEndCalls = [];\n        \n        // Clean up AppInsightsCore instance if initialized\n        if (this._core && this._core.isInitialized()) {\n            this._core.unload(false);\n        }\n        this._core = undefined as any;\n    }\n\n    /**\n     * Helper function to create a trace provider with onEnd callback\n     */\n    private _createTestTraceProvider(host: ITraceHost, onEnd?: (span: IReadableSpan) => void): ICachedValue<ITraceProvider> {\n        const actualOnEnd = onEnd || ((span) => this._onEndCalls.push(span));\n\n        return getDeferred(() => {\n            const provider: ITraceProvider = {\n                api: this._mockApi,\n                createSpan: (name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan => {\n                    // Create a new distributed trace context for this span\n                    let newCtx: IDistributedTraceContext;\n                    let parentCtx: IDistributedTraceContext | undefined;\n\n                    if (options && options.root) {\n                        newCtx = createDistributedTraceContext();\n                    } else {\n                        newCtx = createDistributedTraceContext(parent || host.getTraceCtx());\n                        if (newCtx.parentCtx) {\n                            parentCtx = newCtx.parentCtx;\n                        }\n                    }\n\n                    // Always generate a new spanId\n                    newCtx.spanId = strSubstr(generateW3CId(), 0, 16);\n\n                    // Get configuration from the core if available\n                    let isRecording = options?.recording !== false;\n                    if (this._core && this._core.config && this._core.config.traceCfg && this._core.config.traceCfg.suppressTracing) {\n                        isRecording = false;\n                    }\n                    \n                    // Create the span context\n                    const spanCtx: IOTelSpanCtx = {\n                        api: this._mockApi,\n                        spanContext: newCtx,\n                        attributes: options?.attributes,\n                        startTime: options?.startTime,\n                        isRecording: isRecording,\n                        onEnd: actualOnEnd\n                    };\n\n                    if (parentCtx) {\n                        objDefine(spanCtx, \"parentSpanContext\", {\n                            v: parentCtx,\n                            w: false\n                        });\n                    }\n\n                    return createSpan(spanCtx, name, options?.kind || eOTelSpanKind.INTERNAL);\n                },\n                getProviderId: (): string => \"test-provider\",\n                isAvailable: (): boolean => true\n            };\n            \n            return provider;\n        });\n    }\n\n    /**\n     * Helper function to set up AppInsightsCore with trace provider\n     */\n    private _setupCore(config?: Partial<IConfiguration>): AppInsightsCore {\n        this._core = new AppInsightsCore();\n        \n        // Create a simple test channel\n        const testChannel = {\n            identifier: \"TestChannel\",\n            priority: 1001,\n            initialize: () => {},\n            processTelemetry: () => {},\n            teardown: () => {},\n            isInitialized: () => true\n        };\n        \n        const coreConfig: IConfiguration = {\n            instrumentationKey: \"test-ikey-12345\",\n            traceCfg: {\n                serviceName: \"test-service\"\n            },\n            ...config\n        };\n\n        // Initialize the core with the test channel\n        this._core.initialize(coreConfig, [testChannel]);\n\n        // Set up the trace provider\n        const traceProvider = this._createTestTraceProvider(this._core);\n        this._core.setTraceProvider(traceProvider);\n\n        return this._core;\n    }\n\n    /**\n     * Helper function to create a span for testing using the actual SDK functions\n     */\n    private _createTestSpan(\n        name: string,\n        kind: eOTelSpanKind = eOTelSpanKind.INTERNAL,\n        attributes: { [key: string]: any } = {},\n        statusCode: eOTelSpanStatusCode = eOTelSpanStatusCode.UNSET\n    ): IReadableSpan {\n        // Setup core if not already setup\n        if (!this._core) {\n            this._setupCore();\n        }\n\n        // Create span using the trace provider\n        const span = this._core.startSpan(name, {\n            kind: kind,\n            attributes: attributes\n        });\n\n        // Set status if provided\n        if (statusCode !== eOTelSpanStatusCode.UNSET) {\n            span.setStatus({\n                code: statusCode,\n                message: statusCode === eOTelSpanStatusCode.ERROR ? \"Error occurred\" : undefined\n            });\n        }\n\n        // End the span to finalize it\n        span.end();\n\n        return span as IReadableSpan;\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should create basic telemetry item from span\",\n            test: () => {\n                // Setup core first\n                this._setupCore();\n                \n                // Arrange - create parent span first\n                const parentSpan = this._core.startSpan(\"parent-operation\", {\n                    kind: eOTelSpanKind.SERVER\n                });\n                \n                // Create child CLIENT span with parent context\n                const span = this._core.startSpan(\"test-operation\", {\n                    kind: eOTelSpanKind.CLIENT\n                }, parentSpan.spanContext());\n                \n                span.end();\n                parentSpan.end();\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span as IReadableSpan);\n\n                // Assert\n                Assert.ok(result, \"Should return a telemetry item\");\n                Assert.equal(result.name, \"Ms.Web.Span\", \"Event name should be Ms.Web.Span\");\n                Assert.equal(result.baseType, \"OTelSpan\", \"Base type should be OTelSpan\");\n                Assert.ok(result.baseData, \"Should have baseData\");\n                \n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.name, \"test-operation\", \"Span name should match\");\n                Assert.equal(baseData.kind, eOTelSpanKind.CLIENT, \"Span kind should match\");\n                Assert.ok(baseData.startTime, \"Should have start time\");\n                Assert.equal(baseData.success, true, \"Should be successful by default\");\n                Assert.equal(parentSpan.spanContext().spanId, baseData.parentId, \"Parent ID should match parent span's ID\");\n                Assert.equal((span as IReadableSpan).parentSpanId, baseData.parentId, \"Should match span's parent ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle span with error status\",\n            test: () => {\n                // Arrange\n                const span = this._createTestSpan(\n                    \"failed-operation\",\n                    eOTelSpanKind.CLIENT,\n                    {},\n                    eOTelSpanStatusCode.ERROR\n                );\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result, \"Should return a telemetry item\");\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.success, false, \"Should be marked as failed\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should populate HTTP properties for HTTP spans\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [ATTR_HTTP_REQUEST_METHOD]: \"GET\",\n                    [ATTR_URL_FULL]: \"https://example.com:443/api/users\",\n                    [ATTR_HTTP_RESPONSE_STATUS_CODE]: 200\n                };\n                const span = this._createTestSpan(\"http-request\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result, \"Should return a telemetry item\");\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.httpMethod, \"GET\", \"Should have HTTP method\");\n                Assert.equal(baseData.httpUrl, \"https://example.com/api/users\", \"Should remove default port 443\");\n                Assert.equal(baseData.httpStatusCode, 200, \"Should have HTTP status code\");\n                Assert.equal(baseData.success, true, \"Should be successful for 2xx status\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should remove default port 80 for HTTP\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [ATTR_HTTP_REQUEST_METHOD]: \"POST\",\n                    [ATTR_URL_FULL]: \"http://example.com:80/api/data\"\n                };\n                const span = this._createTestSpan(\"http-post\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.httpUrl, \"http://example.com/api/data\", \"Should remove default port 80\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should mark 4xx and 5xx as failures\",\n            test: () => {\n                // Arrange\n                const attributes404 = {\n                    [ATTR_HTTP_REQUEST_METHOD]: \"GET\",\n                    [ATTR_HTTP_RESPONSE_STATUS_CODE]: 404\n                };\n                const attributes500 = {\n                    [ATTR_HTTP_REQUEST_METHOD]: \"GET\",\n                    [ATTR_HTTP_RESPONSE_STATUS_CODE]: 500\n                };\n\n                const span404 = this._createTestSpan(\"not-found\", eOTelSpanKind.CLIENT, attributes404);\n                const span500 = this._createTestSpan(\"server-error\", eOTelSpanKind.CLIENT, attributes500);\n\n                // Act\n                const result404 = createExtendedTelemetryItemFromSpan(this._core, span404);\n                const result500 = createExtendedTelemetryItemFromSpan(this._core, span500);\n\n                // Assert\n                Assert.equal((result404.baseData as IMsWebSpanTelemetry).success, false, \"404 should be marked as failure\");\n                Assert.equal((result500.baseData as IMsWebSpanTelemetry).success, false, \"500 should be marked as failure\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should populate database properties for DB spans\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [SEMATTRS_DB_SYSTEM]: \"postgresql\",\n                    [SEMATTRS_DB_STATEMENT]: \"SELECT * FROM users WHERE id = $1\",\n                    [SEMATTRS_DB_NAME]: \"myapp_db\"\n                };\n                const span = this._createTestSpan(\"db-query\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.dbSystem, \"postgresql\", \"Should have DB system\");\n                Assert.equal(baseData.dbStatement, \"SELECT * FROM users WHERE id = $1\", \"Should have DB statement\");\n                Assert.equal(baseData.dbName, \"myapp_db\", \"Should have DB name\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should populate RPC properties for RPC spans\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [SEMATTRS_RPC_SYSTEM]: \"grpc\",\n                    [SEMATTRS_RPC_GRPC_STATUS_CODE]: 0\n                };\n                const span = this._createTestSpan(\"rpc-call\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.rpcSystem, \"grpc\", \"Should have RPC system\");\n                Assert.equal(baseData.rpcGrpcStatusCode, 0, \"Should have gRPC status code\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should populate user extension from enduser attributes\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [ATTR_ENDUSER_ID]: \"user123\",\n                    [ATTR_ENDUSER_PSEUDO_ID]: \"pseudo456\"\n                };\n                const span = this._createTestSpan(\"user-operation\", eOTelSpanKind.SERVER, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result.ext, \"Should have extensions\");\n                Assert.ok(result.ext.user, \"Should have user extension\");\n                Assert.equal(result.ext.user.authId, \"user123\", \"Should have authenticated user ID\");\n                Assert.equal(result.ext.user.id, \"pseudo456\", \"Should have pseudonymous user ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should populate Part C with custom attributes\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"custom.property\": \"custom-value\",\n                    \"app.version\": \"1.2.3\",\n                    \"environment\": \"production\"\n                };\n                const span = this._createTestSpan(\"custom-operation\", eOTelSpanKind.INTERNAL, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(result.data[\"custom.property\"], \"custom-value\", \"Should include custom property\");\n                Assert.equal(result.data[\"app.version\"], \"1.2.3\", \"Should include app version\");\n                Assert.equal(result.data[\"environment\"], \"production\", \"Should include environment\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should exclude known internal properties from Part C\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [ATTR_HTTP_REQUEST_METHOD]: \"GET\",\n                    [ATTR_HTTP_RESPONSE_STATUS_CODE]: 200,\n                    \"custom.property\": \"custom-value\",\n                    \"_MS.ProcessedByMetricExtractors\": \"(Name: X, Ver:'1.1')\"\n                };\n                const span = this._createTestSpan(\"filtered-operation\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(result.data[\"custom.property\"], \"custom-value\", \"Should include custom property\");\n                Assert.ok(!result.data[ATTR_HTTP_REQUEST_METHOD], \"Should not include known HTTP method attribute\");\n                Assert.ok(!result.data[\"_MS.ProcessedByMetricExtractors\"], \"Should not include MS internal attribute\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should exclude microsoft.* properties from Part C\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"microsoft.internal\": \"value\",\n                    \"microsoft.sample_rate\": 100,\n                    \"custom.property\": \"custom-value\"\n                };\n                const span = this._createTestSpan(\"microsoft-filtered\", eOTelSpanKind.INTERNAL, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(result.data[\"custom.property\"], \"custom-value\", \"Should include custom property\");\n                Assert.ok(!result.data[\"microsoft.internal\"], \"Should not include microsoft.internal property\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should include span context in dt extension\",\n            test: () => {\n                // Arrange\n                const span = this._createTestSpan(\"traced-operation\", eOTelSpanKind.SERVER);\n                const spanContext = span.spanContext();\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result.ext, \"Should have extensions\");\n                Assert.ok(result.ext.dt, \"Should have dt extension\");\n                Assert.equal(result.ext.dt.spanId, spanContext.spanId, \"Should have span ID\");\n                Assert.equal(result.ext.dt.traceId, spanContext.traceId, \"Should have trace ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle Azure EventHub PRODUCER span\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"az.namespace\": \"Microsoft.EventHub\",\n                    [SEMATTRS_NET_PEER_NAME]: \"myeventhub.servicebus.windows.net\",\n                    \"message_bus.destination\": \"myeventhub\"\n                };\n                const span = this._createTestSpan(\"eventhub-send\", eOTelSpanKind.PRODUCER, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(eOTelSpanKind.PRODUCER, baseData.kind, \"Should have PRODUCER kind\");\n                Assert.equal(\"Microsoft.EventHub\", baseData.azureResourceProvider, \"Should have azureResourceProvider in baseData\");\n                // Other attributes should be in Part C\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(\"myeventhub.servicebus.windows.net\", result.data.netPeerName, \"Should have peer name in Part C\");\n                Assert.equal(\"myeventhub\", result.data[\"message_bus.destination\"], \"Should have destination in Part C\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle Azure EventHub CONSUMER span with timeSinceEnqueued\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"az.namespace\": \"Microsoft.EventHub\",\n                    [SEMATTRS_NET_PEER_NAME]: \"myeventhub.servicebus.windows.net\",\n                    \"message_bus.destination\": \"myeventhub\",\n                    \"timeSinceEnqueued\": 1500\n                };\n                const span = this._createTestSpan(\"eventhub-receive\", eOTelSpanKind.CONSUMER, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(eOTelSpanKind.CONSUMER, baseData.kind, \"Should have CONSUMER kind\");\n                Assert.equal(\"Microsoft.EventHub\", baseData.azureResourceProvider, \"Should have azureResourceProvider in baseData\");\n                // Other attributes should be in Part C\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(\"myeventhub.servicebus.windows.net\", result.data.netPeerName, \"Should have peer name in Part C\");\n                Assert.equal(\"myeventhub\", result.data[\"message_bus.destination\"], \"Should have destination in Part C\");\n                Assert.equal(1500, result.data[\"timeSinceEnqueued\"], \"Should have timeSinceEnqueued in Part C\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle Azure EventHub CLIENT span\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"az.namespace\": \"Microsoft.EventHub\",\n                    [SEMATTRS_NET_PEER_NAME]: \"myeventhub.servicebus.windows.net\",\n                    \"message_bus.destination\": \"myeventhub\"\n                };\n                const span = this._createTestSpan(\"eventhub-operation\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(eOTelSpanKind.CLIENT, baseData.kind, \"Should have CLIENT kind\");\n                Assert.equal(\"Microsoft.EventHub\", baseData.azureResourceProvider, \"Should have azureResourceProvider in baseData\");\n                // Other attributes should be in Part C\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(\"myeventhub.servicebus.windows.net\", result.data.netPeerName, \"Should have peer name in Part C\");\n                Assert.equal(\"myeventhub\", result.data[\"message_bus.destination\"], \"Should have destination in Part C\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle Azure SDK INTERNAL span with az.namespace\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"az.namespace\": \"Microsoft.Storage\"\n                };\n                const span = this._createTestSpan(\"storage-operation\", eOTelSpanKind.INTERNAL, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(eOTelSpanKind.INTERNAL, baseData.kind, \"Should have INTERNAL kind\");\n                Assert.equal(\"Microsoft.Storage\", baseData.azureResourceProvider, \"Should have azureResourceProvider in baseData\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should populate Part C with network attributes\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [SEMATTRS_NET_PEER_NAME]: \"api.example.com\",\n                    [SEMATTRS_NET_PEER_PORT]: 8080,\n                    [SEMATTRS_HTTP_ROUTE]: \"/api/v1/users/:id\",\n                    \"service.name\": \"api-gateway\"\n                };\n                const span = this._createTestSpan(\"network-call\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(result.data.netPeerName, \"api.example.com\", \"Should have peer name\");\n                Assert.equal(result.data.netPeerPort, 8080, \"Should have peer port\");\n                Assert.equal(result.data.httpRoute, \"/api/v1/users/:id\", \"Should have HTTP route\");\n                Assert.equal(result.data.peerService, \"api-gateway\", \"Should have peer service\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle span with duration\",\n            test: () => {\n                // Arrange\n                const span = this._createTestSpan(\"timed-operation\", eOTelSpanKind.CLIENT);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.ok(baseData.duration !== undefined, \"Should have duration\");\n                Assert.ok(baseData.duration >= 0, \"Duration should be non-negative\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle span with traceState\",\n            test: () => {\n                // Arrange\n                const span = this._createTestSpan(\"traced-operation\", eOTelSpanKind.SERVER);\n                const spanContext = span.spanContext();\n                \n                // Add traceState to the span context\n                spanContext.traceState.set(\"vendor1\", \"value1\");\n                spanContext.traceState.set(\"vendor2\", \"value2\");\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.ok(result, \"Should create telemetry item\");\n                // TraceState should be included when present\n                Assert.ok(baseData.traceState, \"Should include traceState when present in span context\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should use legacy HTTP semantic attributes\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [SEMATTRS_HTTP_METHOD]: \"POST\",\n                    [SEMATTRS_HTTP_URL]: \"https://api.example.com/v1/data\",\n                    [SEMATTRS_HTTP_STATUS_CODE]: 201\n                };\n                const span = this._createTestSpan(\"legacy-http\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.httpMethod, \"POST\", \"Should handle legacy HTTP method attribute\");\n                Assert.equal(baseData.httpUrl, \"https://api.example.com/v1/data\", \"Should handle legacy HTTP URL attribute\");\n                Assert.equal(baseData.httpStatusCode, 201, \"Should handle legacy HTTP status code attribute\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle span with parent context\",\n            test: () => {\n                // Arrange\n                const span = this._createTestSpan(\"child-span\", eOTelSpanKind.SERVER);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                // The span will have either parentSpanId or can fallback to parentSpanContext.spanId\n                // parentId may be empty string if there's no parent\n                Assert.ok(baseData.parentId !== undefined, \"Should have parentId property\");\n                Assert.ok(result, \"Should successfully create telemetry item\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle different span kinds\",\n            test: () => {\n                // Arrange & Act\n                const internalSpan = this._createTestSpan(\"internal\", eOTelSpanKind.INTERNAL);\n                const serverSpan = this._createTestSpan(\"server\", eOTelSpanKind.SERVER);\n                const clientSpan = this._createTestSpan(\"client\", eOTelSpanKind.CLIENT);\n                const producerSpan = this._createTestSpan(\"producer\", eOTelSpanKind.PRODUCER);\n                const consumerSpan = this._createTestSpan(\"consumer\", eOTelSpanKind.CONSUMER);\n\n                const internalResult = createExtendedTelemetryItemFromSpan(this._core, internalSpan);\n                const serverResult = createExtendedTelemetryItemFromSpan(this._core, serverSpan);\n                const clientResult = createExtendedTelemetryItemFromSpan(this._core, clientSpan);\n                const producerResult = createExtendedTelemetryItemFromSpan(this._core, producerSpan);\n                const consumerResult = createExtendedTelemetryItemFromSpan(this._core, consumerSpan);\n\n                // Assert\n                Assert.equal((internalResult.baseData as IMsWebSpanTelemetry).kind, eOTelSpanKind.INTERNAL, \"Should have INTERNAL kind\");\n                Assert.equal((serverResult.baseData as IMsWebSpanTelemetry).kind, eOTelSpanKind.SERVER, \"Should have SERVER kind\");\n                Assert.equal((clientResult.baseData as IMsWebSpanTelemetry).kind, eOTelSpanKind.CLIENT, \"Should have CLIENT kind\");\n                Assert.equal((producerResult.baseData as IMsWebSpanTelemetry).kind, eOTelSpanKind.PRODUCER, \"Should have PRODUCER kind\");\n                Assert.equal((consumerResult.baseData as IMsWebSpanTelemetry).kind, eOTelSpanKind.CONSUMER, \"Should have CONSUMER kind\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should handle span with sample rate attribute\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    \"microsoft.sample_rate\": 50\n                };\n                const span = this._createTestSpan(\"sampled-operation\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                Assert.ok(result.data, \"Should have Part C data\");\n                Assert.equal(50, result.data.sampleRate, \"Should have sample rate in Part C\");\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should not overwrite existing extension values\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [ATTR_ENDUSER_ID]: \"user-new\",\n                    [ATTR_ENDUSER_PSEUDO_ID]: \"pseudo-new\"\n                };\n                const span = this._createTestSpan(\"user-op\", eOTelSpanKind.SERVER, attributes);\n\n                // Pre-populate some extension values that should not be overwritten\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n                \n                // Manually set some values to test they don't get overwritten\n                if (result.ext && result.ext.user) {\n                    const originalAuthId = result.ext.user.authId;\n                    const originalId = result.ext.user.id;\n                    \n                    // Act - create again to verify overwrite behavior\n                    const result2 = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                    // Assert\n                    Assert.equal(result2.ext.user.authId, \"user-new\", \"Should have new authId\");\n                    Assert.equal(result2.ext.user.id, \"pseudo-new\", \"Should have new pseudonymous ID\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"createExtendedTelemetryItemFromSpan: should preserve non-standard port in URL\",\n            test: () => {\n                // Arrange\n                const attributes = {\n                    [ATTR_HTTP_REQUEST_METHOD]: \"GET\",\n                    [ATTR_URL_FULL]: \"https://example.com:8443/api/data\"\n                };\n                const span = this._createTestSpan(\"custom-port\", eOTelSpanKind.CLIENT, attributes);\n\n                // Act\n                const result = createExtendedTelemetryItemFromSpan(this._core, span);\n\n                // Assert\n                const baseData = result.baseData as IMsWebSpanTelemetry;\n                Assert.equal(baseData.httpUrl, \"https://example.com:8443/api/data\", \"Should preserve non-standard port\");\n            }\n        });\n    }\n}\n\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/TestHelper.ts",
    "content": "import { IExtendedTelemetryItem } from '../../../../src/interfaces/ext/DataModels';\n\nexport class TestHelper {\n    private static _idCount = 0;\n\n    static reset(key: string) {\n        this._idCount = 0;\n        localStorage.removeItem(key);\n    }\n\n    static mockEvent(persistence: number): IExtendedTelemetryItem {\n        this._idCount++;\n        return {\n            name: 'test_event-' + this._idCount.toString(),\n            baseType: 'custom',\n            time: '',\n            persistence: persistence,\n            data: {\n                'key': 'value',\n                empty: [],\n                value1: [1],\n                value2: ['Hello'],\n                value3: [['Hello']],\n                value4: true,\n                value5: 42,\n                value6: {\n                    more: {\n                        data: 'X'\n                    }\n                },\n                evValue1: {\n                    value: 'event Property'\n                },\n                evValue2: {\n                    value: 'event Property2',\n                    kind: 32 /* CustomerContent_GenericContent */,\n                    propertyType: 1 /* String */\n                }\n            }\n        };\n    }\n\n    static mockEvent2(persistence: number): IExtendedTelemetryItem {\n        this._idCount++;\n        return {\n            name: 'test_event-' + this._idCount.toString(),\n            time: ' 1970-01-01T00:00:00.000Z',\n            ver: '4.0',\n            iKey: 'o:12345-12345',\n            ext: {\n                sdk: {\n                    ver: 'Hello version 1.0',\n                    seq: 1,\n                    epoch: '0',\n                    installId: 'TestDeviceId'\n                },\n                app: { sesId: '####' },\n                user: { locale: 'en-US' },\n                web: { domain: 'localhost' },\n                intweb: { },\n                utc: { popSample: 100 },\n                loc: { tz: '-08:00' },\n                metadata: {\n                    f: {\n                        value1: { a: { t: 6 } },\n                        value5: { t: 6 },\n                        evValue2: { t: 8193 }\n                    }\n                }\n            },\n            baseData: {\n                properties: {\n                    version: '##currentPluginVersions##'\n                }\n            },\n            data: {\n                baseType: 'testEventBaseType',\n                value1: [1],\n                value2: ['Hello'],\n                value3: [['Hello']],\n                value4: true,\n                value5: 42,\n                value6: {\n                    more: {\n                        data: 'X'\n                    }\n                },\n                evValue1: 'event Property',\n                evValue2: 'event Property2'\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/UtilsTest.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { uaDisallowsSameSiteNone } from \"../../../../src/index\";\nimport { EventPropertyType, ValueKind  } from '../../../../src/enums/ext/Enums';\nimport * as Utils from '../../../../src/ext/extUtils';\n\nexport class UtilsTest extends AITestClass {\n    public registerTests() {\n        this.testCase({\n            name: 'getCommonSchemaMetaData returns correct value for specified data type',\n            test: () => {\n                let dataType = EventPropertyType.String;\n                while (dataType <= EventPropertyType.DateTime) {\n                    QUnit.assert.equal(Utils.getCommonSchemaMetaData(123, undefined, dataType), dataType);\n                    dataType++;\n                }\n            }\n        });\n\n        this.testCase({\n            name: 'getCommonSchemaMetaData returns correct value for specified value kind',\n            test: () => {\n                let valueKind = ValueKind.NotSet;\n                while (valueKind <= ValueKind.Pii_IPV4AddressLegacy) {\n                    QUnit.assert.equal(Utils.getCommonSchemaMetaData(123, valueKind), 6 | valueKind << 5, `${valueKind}`);\n                    valueKind++;\n                }\n            }\n        });\n\n        this.testCase({\n            name: 'extend',\n            test: () => {\n                let obj1 = {\n                    prop1: \"obj1prop1\",\n                    prop2: {\n                        nestedprop1: \"obj1nestedprop1\",\n                        nestedprop2: [\"obj1nestedprop2\"]\n                    }\n                };\n                let obj2 = {\n                    prop1: \"obj2prop1\",\n                    prop2: {\n                        nestedprop1: \"obj2nestedprop1\",\n                        nestedprop2: [\"obj2nestedprop2\"]\n                    },\n                    prop3: [{ prop3_arrayObject1: \"prop3_arrayObject1\" }, { prop3_arrayObject2: \"prop3_arrayObject2\" }]\n\n                };\n                let newObject = Utils.extend(true, obj1, obj2);\n                QUnit.assert.equal(newObject[\"prop1\"], \"obj2prop1\");\n                QUnit.assert.equal(newObject[\"prop2\"][\"nestedprop1\"], \"obj2nestedprop1\");\n                QUnit.assert.equal(newObject[\"prop2\"][\"nestedprop2\"][0], \"obj2nestedprop2\");\n                QUnit.assert.equal(newObject[\"prop3\"][0][\"prop3_arrayObject1\"], \"prop3_arrayObject1\");\n                QUnit.assert.equal(newObject[\"prop3\"][1][\"prop3_arrayObject2\"], \"prop3_arrayObject2\");\n            }\n        });\n\n        //         this.testCase({\n        //             name: 'getCommonSchemaMetaData returns correct value for specified value kind',\n        //             test: () => {\n        //                 for (let dataType in ValueKind) {\n        //                     if (ValueKind[dataType] !== ValueKind.CustomerContent_GenericContent) {\n        //                         QUnit.assert.equal(Utils.getCommonSchemaMetaData(123, ValueKind[dataType]), 6 | ValueKind[dataType] << 5, `${dataType}`);\n        //                     }\n        //                 }\n        //             }\n        //         });\n\n        //         this.testCase({\n        //             name: 'getCommonSchemaMetaData returns correct value if using Customer Content Types',\n        //             test: () => {\n        //                 let encodedValue;\n        //                 encodedValue = Utils.getCommonSchemaMetaData(123, ValueKind.CustomerContent_GenericContent);\n        //                 QUnit.assert.equal(encodedValue, EventPropertyType.Double | 1 << 13, 'Generic number');\n\n        //                 encodedValue = Utils.getCommonSchemaMetaData('123', ValueKind.CustomerContent_GenericContent);\n        //                 QUnit.assert.equal(encodedValue, EventPropertyType.String | 1 << 13, 'Generic string');\n\n        //                 encodedValue = Utils.getCommonSchemaMetaData(true, ValueKind.CustomerContent_GenericContent);\n        //                 QUnit.assert.equal(encodedValue, EventPropertyType.Bool | 1 << 13, 'Generic bool (true)');\n\n        //                 encodedValue = Utils.getCommonSchemaMetaData(false, ValueKind.CustomerContent_GenericContent);\n        //                 QUnit.assert.equal(encodedValue, EventPropertyType.Bool | 1 << 13, 'Generic bool (false)');\n\n        //                 encodedValue = Utils.getCommonSchemaMetaData(123, ValueKind.CustomerContent_GenericContent, EventPropertyType.Guid);\n        //                 QUnit.assert.equal(encodedValue, EventPropertyType.Guid | 1 << 13, 'Generic typed Guid');\n        //             }\n        //         });\n\n        //         this.testCase({\n        //             name: 'getCommonSchemaMetaData using ValueKind.NotSet returns expected value',\n        //             test: () => {\n        //                 let encodedValue;\n        //                 encodedValue = Utils.getCommonSchemaMetaData('abc', ValueKind.NotSet, EventPropertyType.String);\n        //                 QUnit.assert.equal(EventPropertyType.String, 1);\n        //                 QUnit.assert.equal(encodedValue, EventPropertyType.String);\n\n        //                 encodedValue = Utils.getCommonSchemaMetaData('abc', undefined, EventPropertyType.String);\n        //                 QUnit.assert.equal(EventPropertyType.String, 1);\n        //                 QUnit.assert.equal(encodedValue, EventPropertyType.String);\n        //             }\n        //         });\n\n        //         this.testCase({\n        //             name: 'getCommonSchemaMetaData returns correct value for specified value kind and data type',\n        //             test: () => {\n        //                 for (let dataType in EventPropertyType) {\n        //                     if (dataType) {\n        //                         for (let valueKind in ValueKind) {\n        //                             if (ValueKind[valueKind] !== ValueKind.CustomerContent_GenericContent) {\n        //                                 QUnit.assert.equal(\n        //                                     Utils.getCommonSchemaMetaData(123, ValueKind[valueKind], EventPropertyType[dataType]),\n        //                                     EventPropertyType[dataType] | ValueKind[valueKind] << 5, `${valueKind}`);\n        //                             }\n        //                         }\n        //                     }\n        //                 }\n        //             }\n        //         });\n\n        this.testCase({\n            name: \"Check disableSameSiteCookie status\",\n            test: () => {\n                let excludeValues = [\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.2 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One; MSAppHost/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/71.0.3578.89 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.1 Safari/605.1.15\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/65.0.225212226 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C101\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.1.00.31860 Chrome/61.0.3163.100 Electron/2.0.10 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G950F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G930F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/71.0.3578.89 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/605.1.15 (KHTML, like Gecko)\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G935F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Yammer/2.1.0 Chrome/66.0.3359.181 Electron/3.0.6 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G965F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-A520F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G955F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G950U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G960U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.1.00.31860 Chrome/61.0.3163.100 Electron/2.0.10 Safari/537.36\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/65.0.225212226 Mobile/15E148 Safari/605.1\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C50\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-N950U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (iPad; CPU OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 6.0.1; SM-G532M Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-G920F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6821.400 QQBrowser/10.3.3040.400\",\n                    \"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 EdgiOS/42.8.6 Mobile/16C101 Safari/605.1.15\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-N950F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\",\n                    \"Mozilla/5.0 (Linux; Android 8.1.0; SAMSUNG SM-J530F Build/M1AJQ) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/8.2 Chrome/63.0.3239.111 Mobile Safari/537.36\"\n                ];\n\n                let acceptValues = [\n                    \"\",\n                    null,\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36\",\n                    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0\",\n                    \"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko\",\n                    \"Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko/20100101 Firefox/12.0\",\n                    \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)\",\n                    \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0\",\n                    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15\"\n                ];\n\n                for (let lp = 0; lp < excludeValues.length; lp++) {\n                    QUnit.assert.equal(true, uaDisallowsSameSiteNone(excludeValues[lp]), excludeValues[lp]);\n                }\n\n                for (let lp = 0; lp < acceptValues.length; lp++) {\n                    QUnit.assert.equal(false, uaDisallowsSameSiteNone(acceptValues[lp]), acceptValues[lp]);\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/ext/ValueSanitizerTests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { TestHelper } from './TestHelper';\nimport { IExtendedTelemetryItem, IValueSanitizer } from '../../../../src/interfaces/ext/DataModels';\nimport { EventPropertyType, ValueKind } from '../../../../src/enums/ext/Enums';\nimport { sanitizeProperty, getCommonSchemaMetaData } from '../../../../src/ext/extUtils';\nimport { arrForEach, isNullOrUndefined, objKeys } from '../../../../src/index';\nimport { ValueSanitizer  } from '../../../../src/ext/ValueSanitizer';\nimport { EventPersistence } from \"../../../../src/enums/ai/Enums\";\n\nexport class ValueSanitizerTests extends AITestClass {\n\n    private _checkFieldValue(dataSanitizer: IValueSanitizer, path: string, name: string, val: any, stringifyObjects?: boolean) {\n        // Only add populated properties\n        let value1 = dataSanitizer.value(path, name, val, stringifyObjects);\n        let value2 = sanitizeProperty(name, val, stringifyObjects);\n\n        if (!isNullOrUndefined(value1) && !isNullOrUndefined(value2)) {\n            QUnit.assert.equal(value1.value, value2.value, 'Checking sanitized value [' + path + '.' + name + '] - sanitizeProperty:(' + value2.value + '); Json:' + JSON.stringify(val));\n        } else if (isNullOrUndefined(val)) {\n            QUnit.assert.equal(value1, value2, 'Checking empty [' + path + '.' + name + ']');\n        } else if (!isNullOrUndefined(value2)) {\n            // This is a failure condition as value1 (should be not set)\n            QUnit.assert.equal(value1, value2.value, 'Checking [' + path + '.' + name + '] - sanitizeProperty:(' + value2 + '); Json:' + JSON.stringify(val));\n        } else {\n            QUnit.assert.equal(value1, value2, 'Checking sanitized values [' + path + '.' + name + '] - sanitizeProperty:(' + value2 + '); Json:' + JSON.stringify(val));\n        }\n    }\n\n    private _checkSerialization(dataSanitizer: IValueSanitizer, theEvent: IExtendedTelemetryItem, stringifyObjects?: boolean) {\n        // part A\n        if (theEvent.ext) {\n            arrForEach(objKeys(theEvent.ext), (key) => {\n                let rootKey = 'ext.' + key;\n                arrForEach(objKeys(theEvent.ext[key]), (subKey) => {\n                    this._checkFieldValue(dataSanitizer, rootKey, subKey, theEvent.ext[key][subKey], stringifyObjects);\n                });\n            });\n        }\n\n        // part B\n        if (theEvent.baseData) {\n            arrForEach(objKeys(theEvent.baseData), (key) => {\n                this._checkFieldValue(dataSanitizer, 'baseData', key, theEvent.baseData[key], stringifyObjects);\n            });\n        }\n\n        // part C\n        if (theEvent.data) {\n            arrForEach(objKeys(theEvent.data), (key) => {\n                this._checkFieldValue(dataSanitizer, 'data', key, theEvent.data[key], stringifyObjects);\n            });\n        }\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: 'Check basic event serialization against sanitizeProperty with no fieldValueSanitizerProvider - default stringifyObjects',\n            test: () => {\n                let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                let dataSanitizer = new ValueSanitizer();\n\n                this._checkSerialization(dataSanitizer, event1);\n            }\n        });\n\n        this.testCase({\n            name: 'Check basic event serialization against sanitizeProperty with no fieldValueSanitizerProvider - stringifyObjects - true',\n            test: () => {\n                let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                let dataSanitizer = new ValueSanitizer();\n\n                this._checkSerialization(dataSanitizer, event1, true);\n            }\n        });\n\n        this.testCase({\n            name: 'Check basic event serialization against sanitizeProperty with no fieldValueSanitizerProvider - stringifyObjects - false',\n            test: () => {\n                let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                let dataSanitizer = new ValueSanitizer();\n\n                this._checkSerialization(dataSanitizer, event1, false);\n            }\n        });\n\n        this.testCase({\n            name: 'Check basic event serialization against sanitizeProperty with a pass-through (no-op) fieldValueSanitizerProvider - default stringifyObjects',\n            test: () => {\n                let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                let dataSanitizer = new ValueSanitizer({\n                    handleField: () => {\n                        return true;\n                    },\n                    getSanitizer: () => {\n                        return null;\n                    }\n                });\n\n                this._checkSerialization(dataSanitizer, event1);\n            }\n        });\n\n        this.testCase({\n            name: 'Check basic event serialization against sanitizeProperty with a pass-through (no-op) fieldValueSanitizerProvider - stringifyObjects - true',\n            test: () => {\n                let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                let dataSanitizer = new ValueSanitizer({\n                    handleField: () => {\n                        return true;\n                    },\n                    getSanitizer: () => {\n                        return null;\n                    }\n                });\n\n                this._checkSerialization(dataSanitizer, event1, true);\n            }\n        });\n\n        this.testCase({\n            name: 'Check basic event serialization against sanitizeProperty with a pass-through (no-op) fieldValueSanitizerProvider - stringifyObjects - false',\n            test: () => {\n                let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                let dataSanitizer = new ValueSanitizer({\n                    handleField: () => {\n                        return true;\n                    },\n                    getSanitizer: () => {\n                        return null;\n                    }\n                });\n\n                this._checkSerialization(dataSanitizer, event1, false);\n            }\n        });\n\n        this.testCase({\n            name: 'Test different value kind variants and property types - default stringifyObjects',\n            test: () => {\n                let dataSanitizer = new ValueSanitizer({\n                    handleField: () => {\n                        return true;\n                    },\n                    getSanitizer: () => {\n                        return null;\n                    }\n                });\n                let valueKind = ValueKind.NotSet;\n                while (valueKind < ValueKind.Pii_IPV4AddressLegacy) {\n                    let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                    event1.data.evValue3 = {\n                        value: 123,\n                        kind: valueKind\n                    };\n                    event1.data.evValue4 = {\n                        value: \"456\",\n                        kind: valueKind\n                    };\n                    event1.data.evValue5 = {\n                        value: true,\n                        kind: valueKind\n                    };\n                    event1.data.evValue6 = {\n                        value: [7, 8, 9],\n                        kind: valueKind\n                    };\n                    event1.data.evValue7 = {\n                        value: [\"10\", \"11\", \"12\"],\n                        kind: valueKind\n                    };\n                    event1.data.evValue9 = {\n                        value: [true, false],\n                        kind: valueKind\n                    };\n                    \n                    event1.data.ptValue1 = {\n                        value: 21,\n                        propertyType: EventPropertyType.Int32\n                    };\n\n                    event1.data.ptValue2 = {\n                        value: \"22\",\n                        propertyType: EventPropertyType.String\n                    };\n                    \n                    event1.data.ptValue2 = {\n                        value: 23.0,\n                        propertyType: EventPropertyType.Double\n                    };\n                    \n                    event1.data.ptValue3 = {\n                        value: 21\n                    };\n\n                    event1.data.ptValue4 = {\n                        value: \"22\"\n                    };\n                    \n                    event1.data.ptValue5 = {\n                        value: 23.0\n                    };\n                    \n                    QUnit.assert.equal(getCommonSchemaMetaData(123, valueKind), 6 | valueKind << 5, `${valueKind}`);\n                    this._checkSerialization(dataSanitizer, event1);\n                    valueKind++;\n                }\n            }\n        });\n\n        this.testCase({\n            name: 'Test different value kind variants and property types - stringifyObjects - true',\n            test: () => {\n                let dataSanitizer = new ValueSanitizer({\n                    handleField: () => {\n                        return true;\n                    },\n                    getSanitizer: () => {\n                        return null;\n                    }\n                });\n                let valueKind = ValueKind.NotSet;\n                while (valueKind < ValueKind.Pii_IPV4AddressLegacy) {\n                    let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                    event1.data.evValue3 = {\n                        value: 123,\n                        kind: valueKind\n                    };\n                    event1.data.evValue4 = {\n                        value: \"456\",\n                        kind: valueKind\n                    };\n                    event1.data.evValue5 = {\n                        value: true,\n                        kind: valueKind\n                    };\n                    event1.data.evValue6 = {\n                        value: [7, 8, 9],\n                        kind: valueKind\n                    };\n                    event1.data.evValue7 = {\n                        value: [\"10\", \"11\", \"12\"],\n                        kind: valueKind\n                    };\n                    event1.data.evValue9 = {\n                        value: [true, false],\n                        kind: valueKind\n                    };\n                    \n                    event1.data.ptValue1 = {\n                        value: 21,\n                        propertyType: EventPropertyType.Int32\n                    };\n\n                    event1.data.ptValue2 = {\n                        value: \"22\",\n                        propertyType: EventPropertyType.String\n                    };\n                    \n                    event1.data.ptValue2 = {\n                        value: 23.0,\n                        propertyType: EventPropertyType.Double\n                    };\n                    \n                    event1.data.ptValue3 = {\n                        value: 21\n                    };\n\n                    event1.data.ptValue4 = {\n                        value: \"22\"\n                    };\n                    \n                    event1.data.ptValue5 = {\n                        value: 23.0\n                    };\n                    \n                    QUnit.assert.equal(getCommonSchemaMetaData(123, valueKind), 6 | valueKind << 5, `${valueKind}`);\n                    this._checkSerialization(dataSanitizer, event1, true);\n                    valueKind++;\n                }\n            }\n        });\n\n        this.testCase({\n            name: 'Test different value kind variants and property types - stringifyObjects - false',\n            test: () => {\n                let dataSanitizer = new ValueSanitizer({\n                    handleField: () => {\n                        return true;\n                    },\n                    getSanitizer: () => {\n                        return null;\n                    }\n                });\n                let valueKind = ValueKind.NotSet;\n                while (valueKind < ValueKind.Pii_IPV4AddressLegacy) {\n                    let event1 = TestHelper.mockEvent2(EventPersistence.Normal);\n                    event1.data.evValue3 = {\n                        value: 123,\n                        kind: valueKind\n                    };\n                    event1.data.evValue4 = {\n                        value: \"456\",\n                        kind: valueKind\n                    };\n                    event1.data.evValue5 = {\n                        value: true,\n                        kind: valueKind\n                    };\n                    event1.data.evValue6 = {\n                        value: [7, 8, 9],\n                        kind: valueKind\n                    };\n                    event1.data.evValue7 = {\n                        value: [\"10\", \"11\", \"12\"],\n                        kind: valueKind\n                    };\n                    event1.data.evValue9 = {\n                        value: [true, false],\n                        kind: valueKind\n                    };\n                    \n                    event1.data.ptValue1 = {\n                        value: 21,\n                        propertyType: EventPropertyType.Int32\n                    };\n\n                    event1.data.ptValue2 = {\n                        value: \"22\",\n                        propertyType: EventPropertyType.String\n                    };\n                    \n                    event1.data.ptValue2 = {\n                        value: 23.0,\n                        propertyType: EventPropertyType.Double\n                    };\n                    \n                    event1.data.ptValue3 = {\n                        value: 21\n                    };\n\n                    event1.data.ptValue4 = {\n                        value: \"22\"\n                    };\n                    \n                    event1.data.ptValue5 = {\n                        value: 23.0\n                    };\n                    \n                    QUnit.assert.equal(getCommonSchemaMetaData(123, valueKind), 6 | valueKind << 5, `${valueKind}`);\n                    this._checkSerialization(dataSanitizer, event1, false);\n                    valueKind++;\n                }\n            }\n        });\n    }\n }\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/trace/W3CTraceStateModes.tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { eDistributedTracingModes } from \"../../../../src/enums/ai/Enums\";\n\n/**\n * Helper function to check if a mode should include tracestate header\n * This matches the internal implementation in the SDK\n */\nfunction _checkTraceStateBit(distributedTracingMode: eDistributedTracingModes): boolean {\n    // Use the proper bitwise check for the _W3CTraceState flag (which is an actual bit flag)\n    return (distributedTracingMode & eDistributedTracingModes._W3CTraceState) === eDistributedTracingModes._W3CTraceState;\n}\n\n/**\n * Tests for W3C TraceState Configuration with different distributed tracing modes\n */\nexport class W3CTraceStateModesTests extends AITestClass {\n    \n    public testInitialize() {\n        // No special setup required\n    }\n\n    public testCleanup() {\n        // No special cleanup required\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"W3CTraceStateModes: Bit masks work correctly for trace modes\",\n            test: () => {\n                // Test AI_AND_W3C_TRACE mode\n                var tracingMode = eDistributedTracingModes.AI_AND_W3C_TRACE;\n                \n                // Get the base mode using _BaseMask\n                var baseMode = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert base mode equals AI_AND_W3C\n                Assert.equal(baseMode, eDistributedTracingModes.AI_AND_W3C, \n                    \"AI_AND_W3C_TRACE base mode should be AI_AND_W3C\");\n                \n                // Assert W3C_TRACE bit is set (testing the _W3CTraceState bit)\n                Assert.equal(true, _checkTraceStateBit(tracingMode), \n                    \"AI_AND_W3C_TRACE should include _W3CTraceState bit\");\n\n                // Test W3C_TRACE mode\n                tracingMode = eDistributedTracingModes.W3C_TRACE;\n                \n                // Get the base mode using _BaseMask\n                baseMode = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert base mode equals W3C\n                Assert.equal(baseMode, eDistributedTracingModes.W3C, \n                    \"W3C_TRACE base mode should be W3C\");\n                \n                // Assert it's not equal to AI mode\n                Assert.notEqual(baseMode, eDistributedTracingModes.AI, \n                    \"W3C_TRACE base mode should NOT be AI\");\n                \n                // Assert W3C_TRACE bit is set\n                Assert.equal(true, _checkTraceStateBit(tracingMode), \n                    \"W3C_TRACE should include _W3CTraceState bit\");\n\n                // Test AI_AND_W3C mode (without the trace bit)\n                tracingMode = eDistributedTracingModes.AI_AND_W3C;\n                \n                // Get base mode - for AI_AND_W3C it's already the base mode\n                baseMode = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert it equals AI_AND_W3C\n                Assert.equal(baseMode, eDistributedTracingModes.AI_AND_W3C, \n                    \"AI_AND_W3C should be its own base mode\");\n                \n                // Assert it's not equal to just AI mode\n                Assert.notEqual(baseMode, eDistributedTracingModes.AI, \n                    \"AI_AND_W3C should NOT be AI\");\n                \n                // Assert W3C_TRACE bit is NOT set\n                Assert.equal(false, _checkTraceStateBit(tracingMode), \n                    \"AI_AND_W3C should NOT include _W3CTraceState bit\");\n\n                // Test W3C mode (without trace bit)\n                tracingMode = eDistributedTracingModes.W3C;\n                \n                // Get the base mode - for W3C it's already the base mode\n                baseMode = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert it equals W3C\n                Assert.equal(baseMode, eDistributedTracingModes.W3C, \n                    \"W3C should be its own base mode\");\n                \n                // Assert it's not equal to AI mode\n                Assert.notEqual(baseMode, eDistributedTracingModes.AI, \n                    \"W3C should NOT be AI\");\n                \n                // Assert W3C_TRACE bit is NOT set\n                Assert.equal(false, _checkTraceStateBit(tracingMode), \n                    \"W3C should NOT include _W3CTraceState bit\");\n            }\n        });\n        \n        this.testCase({\n            name: \"W3CTraceStateModes: Changing mode dynamically updates tracestate header behavior\",\n            test: () => {\n                // First set mode without tracestate bit\n                var tracingMode = eDistributedTracingModes.AI_AND_W3C;\n                \n                // Verify no tracestate initially\n                Assert.equal(false, _checkTraceStateBit(tracingMode), \n                    \"AI_AND_W3C should NOT include _W3CTraceState bit\");\n                    \n                // Change to mode with tracestate bit\n                tracingMode = eDistributedTracingModes.AI_AND_W3C_TRACE;\n                \n                // Verify tracestate bit is now set\n                Assert.equal(true, _checkTraceStateBit(tracingMode), \n                    \"AI_AND_W3C_TRACE should include _W3CTraceState bit\");\n                    \n                // Change to W3C_TRACE mode\n                tracingMode = eDistributedTracingModes.W3C_TRACE;\n                \n                // Verify tracestate bit is still set\n                Assert.equal(true, _checkTraceStateBit(tracingMode), \n                    \"W3C_TRACE should include _W3CTraceState bit\");\n                \n                // Get the base mode\n                var baseMode2 = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert base mode is W3C and not AI\n                Assert.equal(baseMode2, eDistributedTracingModes.W3C, \n                    \"W3C_TRACE base mode should be W3C\");\n                Assert.notEqual(baseMode2, eDistributedTracingModes.AI, \n                    \"W3C_TRACE base mode should NOT be AI\");\n                    \n                // Verify bitmask calculations work correctly\n                Assert.equal(eDistributedTracingModes.W3C_TRACE, \n                            eDistributedTracingModes.W3C | eDistributedTracingModes._W3CTraceState,\n                    \"W3C_TRACE should equal W3C | _W3CTraceState\");\n                    \n                Assert.equal(eDistributedTracingModes.AI_AND_W3C_TRACE, \n                            eDistributedTracingModes.AI_AND_W3C | eDistributedTracingModes._W3CTraceState,\n                    \"AI_AND_W3C_TRACE should equal AI_AND_W3C | _W3CTraceState\");\n            }\n        });\n        \n        this.testCase({\n            name: \"W3CTraceStateModes: _BaseMask correctly isolates base mode from tracestate bit\",\n            test: () => {\n                // Test AI_AND_W3C_TRACE mode with _BaseMask\n                var tracingMode = eDistributedTracingModes.AI_AND_W3C_TRACE;\n                var baseMode = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert base mode equals AI_AND_W3C\n                Assert.equal(baseMode, eDistributedTracingModes.AI_AND_W3C,\n                    \"Base mode of AI_AND_W3C_TRACE should be AI_AND_W3C\");\n                \n                // Test W3C_TRACE mode with _BaseMask\n                tracingMode = eDistributedTracingModes.W3C_TRACE;\n                baseMode = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert base mode equals W3C\n                Assert.equal(baseMode, eDistributedTracingModes.W3C,\n                    \"Base mode of W3C_TRACE should be W3C\");\n                \n                // Test that masking doesn't affect modes without the trace bit\n                tracingMode = eDistributedTracingModes.AI;\n                baseMode = tracingMode & eDistributedTracingModes._BaseMask;\n                \n                // Assert base mode equals AI\n                Assert.equal(baseMode, eDistributedTracingModes.AI,\n                    \"Base mode of AI should still be AI after applying mask\");\n            }\n        });\n        \n        this.testCase({\n            name: \"W3CTraceStateModes: Enable and disable tracestate bit dynamically\",\n            test: () => {\n                // Start with AI_AND_W3C mode\n                var baseMode = eDistributedTracingModes.AI_AND_W3C;\n                \n                // Verify no tracestate initially\n                Assert.equal(false, _checkTraceStateBit(baseMode), \n                    \"AI_AND_W3C should NOT include _W3CTraceState bit initially\");\n                    \n                // Add the tracestate bit (|= operation)\n                var updatedMode = baseMode | eDistributedTracingModes._W3CTraceState;\n                \n                // Verify it equals AI_AND_W3C_TRACE\n                Assert.equal(updatedMode, eDistributedTracingModes.AI_AND_W3C_TRACE,\n                    \"Adding _W3CTraceState bit should result in AI_AND_W3C_TRACE\");\n                \n                // Verify tracestate bit is now set\n                Assert.equal(true, _checkTraceStateBit(updatedMode), \n                    \"Updated mode should include _W3CTraceState bit\");\n                \n                // Remove the tracestate bit (& ~operation)\n                var restoredMode = updatedMode & ~eDistributedTracingModes._W3CTraceState;\n                \n                // Verify it equals the original mode\n                Assert.equal(restoredMode, baseMode,\n                    \"Removing _W3CTraceState bit should restore original mode\");\n                \n                // Verify tracestate bit is no longer set\n                Assert.equal(false, _checkTraceStateBit(restoredMode), \n                    \"Restored mode should NOT include _W3CTraceState bit\");\n                \n                // Start with W3C mode\n                baseMode = eDistributedTracingModes.W3C;\n                \n                // Add the tracestate bit\n                updatedMode = baseMode | eDistributedTracingModes._W3CTraceState;\n                \n                // Verify it equals W3C_TRACE\n                Assert.equal(updatedMode, eDistributedTracingModes.W3C_TRACE,\n                    \"Adding _W3CTraceState bit to W3C should result in W3C_TRACE\");\n                \n                // Remove the tracestate bit\n                restoredMode = updatedMode & ~eDistributedTracingModes._W3CTraceState;\n                \n                // Verify it equals original W3C mode\n                Assert.equal(restoredMode, eDistributedTracingModes.W3C,\n                    \"Removing _W3CTraceState bit should restore W3C mode\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/trace/W3cTraceParentTests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { utcNow } from \"@nevware21/ts-utils\";\nimport { ITraceParent } from \"../../../../src/interfaces/ai/ITraceParent\";\nimport { generateW3CId, newGuid } from \"../../../../src/utils/CoreUtils\";\nimport { formatTraceParent, isSampledFlag, isValidSpanId, isValidTraceId, isValidTraceParent, parseTraceParent } from \"../../../../src/utils/TraceParent\";\n\nexport class W3cTraceParentTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"parseTraceParent - Invalid\",\n            test: () => {\n                Assert.equal(null, parseTraceParent(undefined));\n                Assert.equal(null, parseTraceParent(null));\n                Assert.equal(null, parseTraceParent(\"\"));\n                Assert.equal(null, parseTraceParent(\"00-00000000000000000000000000000000-0000000000000000-00\"));\n                Assert.equal(null, parseTraceParent(\"ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\"));\n                Assert.equal(null, parseTraceParent(\"ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\"));\n                Assert.equal(null, parseTraceParent(\"004bf92f3577b34da6a3ce929d0e0e473600f067aa0ba902b700\"));\n                Assert.equal(null, parseTraceParent(\"00-4BF92F3577B34DA6A3CE929D0E0E473G-00F067AA0BA902B7-00\"));\n            }\n        });\n\n        this.testCase({\n            name: \"parseTraceParent - valid\",\n            test: () => {\n                let traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\" 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00 \");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n                traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(1, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-10\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(16, traceParent.traceFlags);\n            }\n        });\n\n        this.testCase({\n            name: \"parseTraceParent - valid - Case Insensitive\",\n            test: () => {\n                let traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00F067AA0BA902b7-00\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\" 00-4bf92f3577b34da6a3cE929D0E0E4736-00f067aa0ba902b7-00 \");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n                traceParent = parseTraceParent(\"00-4BF92F3577B34DA6A3CE929D0E0E4736-00F067AA0BA902b7-01\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(1, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\"00-4BF92F3577B34DA6A3CE929D0E0E4736-00F067AA0BA902B7-10\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(16, traceParent.traceFlags);\n            }\n        });\n\n        this.testCase({\n            name: \"parseTraceParent - multiple\",\n            test: () => {\n                let traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00,00-11111111111111111111111111111111-2222222222222222-00\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\" 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00 , 00-11111111111111111111111111111111-2222222222222222-00\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n                traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01, ,00-11111111111111111111111111111111-2222222222222222-00\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(1, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-10, 00-11111111111111111111111111111111-2222222222222222-00\");\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"4bf92f3577b34da6a3ce929d0e0e4736\", traceParent.traceId);\n                Assert.equal(\"00f067aa0ba902b7\", traceParent.spanId);\n                Assert.equal(16, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00,00-11111111111111111111111111111111-2222222222222222-00\", 1);\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"11111111111111111111111111111111\", traceParent.traceId);\n                Assert.equal(\"2222222222222222\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\" 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00 , 00-11111111111111111111111111111111-2222222222222222-00\", 1);\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"11111111111111111111111111111111\", traceParent.traceId);\n                Assert.equal(\"2222222222222222\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01, ,00-11111111111111111111111111111111-2222222222222222-00\", 2);\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"11111111111111111111111111111111\", traceParent.traceId);\n                Assert.equal(\"2222222222222222\", traceParent.spanId);\n                Assert.equal(0, traceParent.traceFlags);\n\n                traceParent = parseTraceParent(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-10, 00-11111111111111111111111111111111-2222222222222222-20\", 1);\n\n                Assert.equal(\"00\", traceParent.version);\n                Assert.equal(\"11111111111111111111111111111111\", traceParent.traceId);\n                Assert.equal(\"2222222222222222\", traceParent.spanId);\n                Assert.equal(32, traceParent.traceFlags);\n            }\n        });\n\n        this.testCase({\n            name: \"isValidTraceId\",\n            test: () => {\n                Assert.equal(false, isValidTraceId(undefined));\n                Assert.equal(false, isValidTraceId(null));\n                Assert.equal(false, isValidTraceId(\"\"));\n                Assert.equal(false, isValidTraceId(\"00000000000000000000000000000000\"));\n                Assert.equal(true, isValidTraceId(\"4bf92f3577b34da6a3ce929d0e0e4736\"));\n                Assert.equal(false, isValidTraceId(\" 4bf92f3577b34da6a3ce929d0e0e4736\"));\n                Assert.equal(false, isValidTraceId(\"4bf92f3577b34da6a3ce929d0e0e4736 \"));\n                Assert.equal(true, isValidTraceId(\"4bf92f3577b34DA6A3ce929d0e0e4736\"));\n                Assert.equal(true, isValidTraceId(\"4BF92F3577B34DA6A3CE929D0E0E4736\"));\n            }\n        });\n\n        this.testCase({\n            name: \"isValidSpanId\",\n            test: () => {\n                Assert.equal(false, isValidSpanId(undefined));\n                Assert.equal(false, isValidSpanId(null));\n                Assert.equal(false, isValidSpanId(\"\"));\n                Assert.equal(false, isValidSpanId(\"0000000000000000\"));\n                Assert.equal(true, isValidSpanId(\"00f067aa0ba902b7\"));\n                Assert.equal(false, isValidSpanId(\" 00f067aa0ba902b7\"));\n                Assert.equal(false, isValidSpanId(\"00f067aa0ba902b7 \"));\n                Assert.equal(true, isValidSpanId(\"00f067aa0BA902B7\"));\n                Assert.equal(true, isValidSpanId(\"00F067AA0BA902B7\"));\n            }\n        });\n\n        this.testCase({\n            name: \"isValidTraceParent\",\n            test: () => {\n                Assert.equal(false, isValidTraceParent(undefined));\n                Assert.equal(false, isValidTraceParent(null));\n                Assert.equal(false, isValidTraceParent({} as ITraceParent));\n                Assert.equal(false, isValidTraceParent({\n                    version: \"\",\n                    traceId: \"\",\n                    spanId: \"\",\n                    traceFlags: 0\n                } as ITraceParent));\n                Assert.equal(false, isValidTraceParent({\n                    version: \"00\",\n                    traceId: \"\",\n                    spanId: \"\",\n                    traceFlags: 0\n                } as ITraceParent));\n                Assert.equal(false, isValidTraceParent({\n                    version: \"00\",\n                    traceId: \"\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n                Assert.equal(true, isValidTraceParent({\n                    version: \"00\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n                Assert.equal(false, isValidTraceParent({\n                    version: \"ff\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n                Assert.equal(true, isValidTraceParent({\n                    version: \"00\",\n                    traceId: \"4BF92F3577B34DA6A3CE929D0E0E4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n            }\n        });\n\n        this.testCase({\n            name: \"isSampledFlag\",\n            test: () => {\n                Assert.equal(false, isSampledFlag(undefined));\n                Assert.equal(false, isSampledFlag(null));\n                Assert.equal(false, isSampledFlag({} as ITraceParent));\n                Assert.equal(false, isSampledFlag({\n                    version: \"ff\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n                Assert.equal(false, isSampledFlag({\n                    version: \"ff\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 1\n                } as ITraceParent));\n                Assert.equal(true, isSampledFlag({\n                    version: \"00\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 1\n                } as ITraceParent));\n                Assert.equal(true, isSampledFlag({\n                    version: \"00\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0x11\n                } as ITraceParent));\n            }\n        });\n\n        this.testCase({\n            name: \"formatTraceParent\",\n            test: () => {\n                Assert.equal(\"\", formatTraceParent(undefined));\n                Assert.equal(\"\", formatTraceParent(null));\n                Assert.equal(\"00-00000000000000000000000000000000-0000000000000000-01\", formatTraceParent({} as ITraceParent));\n                Assert.equal(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-11\", formatTraceParent({\n                    version: \"00\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0x11\n                } as ITraceParent));\n                Assert.equal(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01\", formatTraceParent({\n                    version: \"00\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 1\n                } as ITraceParent));\n                Assert.equal(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\", formatTraceParent({\n                    version: \"00\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n                Assert.equal(\"ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\", formatTraceParent({\n                    version: \"ff\",\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n\n                // Case Insensitive\n                Assert.equal(\"ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\", formatTraceParent({\n                    version: \"ff\",\n                    traceId: \"4bf92f3577b34DA6A3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n\n                Assert.equal(\"ff-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\", formatTraceParent({\n                    version: \"ff\",\n                    traceId: \"4bf92f3577b34DA6A3ce929d0e0e4736\",\n                    spanId: \"00f067AA0BA902B7\",\n                    traceFlags: 0\n                } as ITraceParent));\n\n                // Only formats to known type\n                Assert.equal(\"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00\", formatTraceParent({\n                    version: \"02\",          // Pretend to be version 2\n                    traceId: \"4bf92f3577b34da6a3ce929d0e0e4736\",\n                    spanId: \"00f067aa0ba902b7\",\n                    traceFlags: 0\n                } as ITraceParent));\n            }\n        });\n\n        this.testCase({\n            name: \"org generate guid timings\",\n            useFakeTimers: false,\n            test: () => {\n                let maxAttempts = 3;\n                let orgTotal = -1;\n                do {\n                    let start = utcNow();\n                    for (let lp = 0; lp < 10000; lp++) {\n                        let newId = generateW3CId();\n                    }\n    \n                    orgTotal = utcNow() - start;\n                    maxAttempts--;\n                    // Virtualized test servers are slooooow, so try and perform a couple of tests before failing\n                } while (orgTotal >= 300 && maxAttempts > 0);\n\n                Assert.ok(orgTotal < 300, \"Total time for org generateW3cID = \" + JSON.stringify({\n                    orgTotal\n                }));\n            }\n        });\n\n        this.testCase({\n            name: \"Validate generation\",\n            useFakeTimers: false,\n            test: () => {\n                let key1 = generateW3CId();\n                let key2 = generateW3CId();\n\n                Assert.notEqual(key1, key2, \"Make sure they are not the same\");\n                Assert.equal(32, key1.length, \"Key1 length: \" + key1);\n                Assert.equal(32, key2.length, \"Key2 length: \" + key2);\n\n                Assert.equal(\"4\", key1[12]);\n                Assert.equal(\"4\", key2[12]);\n            }\n        });\n\n        this.testCase({\n            name: \"generate newGuid timings\",\n            useFakeTimers: false,\n            test: () => {\n                let maxAttempts = 3;\n                let guidTotal = -1;\n                do {\n                    let start = utcNow();\n                    for (let lp = 0; lp < 10000; lp++) {\n                        let newId = newGuid();\n                    }\n\n                    guidTotal = utcNow() - start;\n                    maxAttempts--;\n                    // Virtualized test servers are slooooow, so try and perform a couple of tests before failing\n                } while (guidTotal >= 300 && maxAttempts > 0);\n\n                Assert.ok(guidTotal < 300, \"Total time for org newGuid = \" + JSON.stringify({\n                    guidTotal\n                }));\n            }\n        });\n\n        this.testCase({\n            name: \"Validate newGuid\",\n            useFakeTimers: false,\n            test: () => {\n                let key1 = newGuid();\n                let key2 = newGuid();\n\n                Assert.notEqual(key1, key2, \"Make sure they are not the same\");\n                Assert.equal(36, key1.length, \"Key1 length: \" + key1);\n                Assert.equal(36, key2.length, \"Key2 length: \" + key2);\n \n                Assert.equal(\"4\", key1[14]);\n                Assert.equal(\"4\", key2[14]);\n           }\n        });\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/trace/W3cTraceState.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { asString, strRepeat } from \"@nevware21/ts-utils\";\nimport { createW3cTraceState, isW3cTraceState, snapshotW3cTraceState } from \"../../../../src/telemetry/W3cTraceState\";\n\nexport class W3cTraceStateTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"W3cTraceState: default\",\n            test: () => {\n                const traceState = createW3cTraceState();\n                Assert.equal(traceState.keys.length, 0);\n                Assert.equal(traceState.hdrs().length, 0);\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.isEmpty, true, \"Default trace state should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle empty string\",\n            test: () => {\n                const traceState = createW3cTraceState(\"\");\n                Assert.equal(traceState.keys.length, 0);\n                Assert.equal(traceState.hdrs().length, 0);\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.isEmpty, true, \"Empty string trace state should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle null\",\n            test: () => {\n                const traceState = createW3cTraceState(null as any);\n                Assert.equal(traceState.keys.length, 0);\n                Assert.equal(traceState.hdrs().length, 0);\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.isEmpty, true, \"Null trace state should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle undefined\",\n            test: () => {\n                const traceState = createW3cTraceState(undefined);\n                Assert.equal(traceState.keys.length, 0);\n                Assert.equal(traceState.hdrs().length, 0);\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.isEmpty, true, \"Undefined trace state should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: toString\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state with values should not be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle invalid input\",\n            test: () => {\n                const traceState = createW3cTraceState({} as any);\n                Assert.equal(traceState.keys.length, 0);\n                Assert.equal(traceState.hdrs().length, 0);\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.isEmpty, true, \"Invalid trace state should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: new / updated keys are added to the front\",\n            test: () => {\n                let traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n\n                traceState.set(\"d\", \"4\");\n                Assert.equal(asString(traceState), \"d=4,a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 4);\n                Assert.deepEqual([\"d\", \"a\", \"b\", \"c\"], traceState.keys);\n\n                traceState.set(\"a\", \"5\");\n                Assert.equal(asString(traceState), \"a=5,d=4,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 4);\n                Assert.deepEqual([\"a\", \"d\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: must create new instances for each state\",\n            test: () => {\n                let traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n\n                let traceState2 = createW3cTraceState(asString(traceState));\n                Assert.equal(traceState2.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState2.keys);\n                traceState2.set(\"d\", \"4\");\n                Assert.equal(traceState2.keys.length, 4);\n                Assert.deepEqual([\"d\", \"a\", \"b\", \"c\"], traceState2.keys);\n\n                Assert.notEqual(traceState, traceState2);\n                Assert.notDeepEqual(traceState, traceState2);\n\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\", \"Actual: \" + asString(traceState) + \" expected a=1,b=2,c=3\");\n                Assert.equal(asString(traceState2), \"d=4,a=1,b=2,c=3\", \"Actual: \" + asString(traceState2) + \" expected d=4,a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: del\",\n            test: () => {\n                let traceState = createW3cTraceState(\"a=4,b=5,c=6\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty initially\");\n                \n                traceState.del(\"b\");\n                Assert.equal(asString(traceState), \"a=4,c=6\");\n                Assert.equal(traceState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], traceState.keys);\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty after deleting one key\");\n\n                traceState.del(\"a\");\n                Assert.equal(asString(traceState), \"c=6\");\n                Assert.equal(traceState.keys.length, 1);\n                Assert.deepEqual([\"c\"], traceState.keys);\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty with one key remaining\");\n                \n                traceState.del(\"c\");\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.keys.length, 0);\n                Assert.deepEqual([], traceState.keys);\n                Assert.equal(traceState.isEmpty, true, \"Trace state should be empty after deleting all keys\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: get\",\n            test: () => {\n                let traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), \"2\");\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.get(\"d\"), undefined);\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with spaces\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1, b=2, c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with tabs\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1\\t,b=2\\t,c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with newlines\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1\\n,b=2\\n,c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with multiple commas\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,,b=2,,c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with multiple equals\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a==1,b==2,c==3\");\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.keys.length, 0);\n                Assert.deepEqual([], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with multiple spaces\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1  , b=2  , c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with multiple tabs\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1\\t\\t,b=2\\t\\t,c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with multiple newlines\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1\\n\\n,b=2\\n\\n,c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: decode with multiple commas and spaces\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1, ,b=2, ,c=3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle unsetting non-existent keys\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.del(\"d\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting empty key\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"\", \"4\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting empty value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", \"\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting empty string value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", \" \");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting empty key and value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"\", \"\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting null key\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(null as any, \"4\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting null value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", null as any);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting null string value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", \"null\");\n                Assert.equal(asString(traceState), \"d=null,a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 4);\n                Assert.deepEqual([\"d\", \"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting null key and value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(null as any, null as any);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting undefined key\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(undefined as any, \"4\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n        this.testCase({\n            name: \"W3cTraceState: handle setting undefined value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", undefined as any);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting undefined key and value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(undefined as any, undefined as any);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting invalid key\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set({} as any, \"4\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting invalid value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", {} as any);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting invalid key and value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set({} as any, {} as any);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting invalid key and valid value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set({} as any, \"4\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle setting valid key and invalid value\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", {} as any);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle dropping states when the max number of members limit is reached\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                traceState.set(\"d\", \"4\");\n                traceState.set(\"e\", \"5\");\n                traceState.set(\"f\", \"6\");\n                traceState.set(\"g\", \"7\");\n                traceState.set(\"h\", \"8\");\n                traceState.set(\"i\", \"9\");\n                traceState.set(\"j\", \"10\");\n                traceState.set(\"k\", \"11\");\n                traceState.set(\"l\", \"12\");\n                traceState.set(\"m\", \"13\");\n                traceState.set(\"n\", \"14\");\n                traceState.set(\"o\", \"15\");\n                traceState.set(\"p\", \"16\");\n                traceState.set(\"q\", \"17\");\n                traceState.set(\"r\", \"18\");\n                traceState.set(\"s\", \"19\");\n                traceState.set(\"t\", \"20\");\n                traceState.set(\"u\", \"21\");\n                traceState.set(\"v\", \"22\");\n                traceState.set(\"w\", \"23\");\n                traceState.set(\"x\", \"24\");\n                traceState.set(\"y\", \"25\");\n                traceState.set(\"z\", \"26\");\n                traceState.set(\"aa\", \"27\");\n                traceState.set(\"ab\", \"28\");\n                traceState.set(\"ac\", \"29\");\n                traceState.set(\"ad\", \"30\");\n                traceState.set(\"ae\", \"31\");\n                traceState.set(\"af\", \"32\");\n                Assert.equal(asString(traceState), \"af=32,ae=31,ad=30,ac=29,ab=28,aa=27,z=26,y=25,x=24,w=23,v=22,u=21,t=20,s=19,r=18,q=17,p=16,o=15,n=14,m=13,l=12,k=11,j=10,i=9,h=8,g=7,f=6,e=5,d=4,a=1,b=2,c=3\");\n                traceState.set(\"ag\", \"33\");\n                Assert.equal(asString(traceState), \"ag=33,af=32,ae=31,ad=30,ac=29,ab=28,aa=27,z=26,y=25,x=24,w=23,v=22,u=21,t=20,s=19,r=18,q=17,p=16,o=15,n=14,m=13,l=12,k=11,j=10,i=9,h=8,g=7,f=6,e=5,d=4,a=1,b=2\");\n                Assert.equal(traceState.keys.length, 33);\n                Assert.deepEqual([\"ag\",\"af\",\"ae\",\"ad\",\"ac\",\"ab\",\"aa\",\"z\",\"y\",\"x\",\"w\",\"v\",\"u\",\"t\",\"s\",\"r\",\"q\",\"p\",\"o\",\"n\",\"m\",\"l\",\"k\",\"j\",\"i\",\"h\",\"g\",\"f\",\"e\",\"d\",\"a\",\"b\",\"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: drop states when the items are too long\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=\" + strRepeat(\"b\", 512));\n                Assert.equal(traceState.get(\"a\"), undefined);\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.keys.length, 0);\n                Assert.deepEqual([], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: drop items that are invalid\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b,c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,c=3\");\n                Assert.equal(traceState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: drop items that are invalid with spaces\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1, b, c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,c=3\");\n                Assert.equal(traceState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: drop items that are invalid with tabs\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1\\t,b\\t,c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,c=3\");\n                Assert.equal(traceState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: drop items that have a single value with an '=' sign\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2=,c=3,d=\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.get(\"d\"), undefined);\n                Assert.equal(asString(traceState), \"a=1,c=3\");\n                Assert.equal(traceState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], traceState.keys);\n                Assert.equal(traceState.isEmpty, false, \"Trace state with valid keys should not be empty\");\n            }\n        });\n        \n        this.testCase({\n            name: \"W3cTraceState: isEmpty with all invalid items\",\n            test: () => {\n                const traceState = createW3cTraceState(\"b=2=,d=\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"d\"), undefined);\n                Assert.equal(asString(traceState), \"\");\n                Assert.equal(traceState.keys.length, 0);\n                Assert.deepEqual([], traceState.keys);\n                Assert.equal(traceState.isEmpty, true, \"Trace state with only invalid items should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: must handle valid state key ranges\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a-b=1,c/d=2,e_f=3,g*h=4\");\n                Assert.equal(traceState.get(\"a-b\"), \"1\");\n                Assert.equal(traceState.get(\"c/d\"), \"2\");\n                Assert.equal(traceState.get(\"e_f\"), \"3\");\n                Assert.equal(traceState.get(\"g*h\"), \"4\");\n                Assert.equal(asString(traceState), \"a-b=1,c/d=2,e_f=3,g*h=4\");\n                Assert.equal(traceState.keys.length, 4);\n                Assert.deepEqual([\"a-b\", \"c/d\", \"e_f\", \"g*h\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle values with embedded spaces\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1 b,c=2 d,e=3 f\");\n                Assert.equal(traceState.get(\"a\"), \"1 b\");\n                Assert.equal(traceState.get(\"c\"), \"2 d\");\n                Assert.equal(traceState.get(\"e\"), \"3 f\");\n                Assert.equal(asString(traceState), \"a=1 b,c=2 d,e=3 f\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"c\", \"e\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle inherited state values with no new values\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(parentState.get(\"a\"), \"1\");\n                Assert.equal(parentState.get(\"b\"), \"2\");\n                Assert.equal(parentState.get(\"c\"), \"3\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\");\n                Assert.equal(parentState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], parentState.keys);\n\n                const traceState = createW3cTraceState(\"\", parentState);\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), \"2\");\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle inherited state values with new values\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(parentState.get(\"a\"), \"1\");\n                Assert.equal(parentState.get(\"b\"), \"2\");\n                Assert.equal(parentState.get(\"c\"), \"3\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\");\n                Assert.equal(parentState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], parentState.keys);\n\n                const traceState = createW3cTraceState(\"d=4,e=5,f=6\", parentState);\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), \"2\");\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.get(\"d\"), \"4\");\n                Assert.equal(traceState.get(\"e\"), \"5\");\n                Assert.equal(traceState.get(\"f\"), \"6\");\n                Assert.equal(asString(traceState), \"d=4,e=5,f=6,a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 6);\n                Assert.deepEqual([\"d\", \"e\", \"f\", \"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle inherited state values with new values that are too long\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(parentState.get(\"a\"), \"1\");\n                Assert.equal(parentState.get(\"b\"), \"2\");\n                Assert.equal(parentState.get(\"c\"), \"3\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\");\n                Assert.equal(parentState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], parentState.keys);\n\n                const traceState = createW3cTraceState(\"d=\" + strRepeat(\"e\", 512), parentState);\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), \"2\");\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.get(\"d\"), undefined);\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle deleting an inherited key in the child\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(parentState.get(\"a\"), \"1\");\n                Assert.equal(parentState.get(\"b\"), \"2\");\n                Assert.equal(parentState.get(\"c\"), \"3\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\");\n                Assert.equal(parentState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], parentState.keys);\n\n                const traceState = createW3cTraceState(\"\", parentState);\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), \"2\");\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n\n                traceState.del(\"b\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,c=3\");\n                Assert.equal(traceState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], traceState.keys);\n\n                // Should not affect the original state\n                Assert.equal(parentState.get(\"a\"), \"1\");\n                Assert.equal(parentState.get(\"b\"), \"2\");\n                Assert.equal(parentState.get(\"c\"), \"3\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\");\n                Assert.equal(parentState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], parentState.keys);\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: handle deleting an inherited key in the parent\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(parentState.get(\"a\"), \"1\");\n                Assert.equal(parentState.get(\"b\"), \"2\");\n                Assert.equal(parentState.get(\"c\"), \"3\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\");\n                Assert.equal(parentState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], parentState.keys);\n\n                const traceState = createW3cTraceState(\"\", parentState);\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), \"2\");\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,b=2,c=3\");\n                Assert.equal(traceState.keys.length, 3);\n                Assert.deepEqual([\"a\", \"b\", \"c\"], traceState.keys);\n\n                parentState.del(\"b\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(asString(traceState), \"a=1,c=3\");\n                Assert.equal(traceState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], traceState.keys);\n\n                // Should not affect the original state\n                Assert.equal(parentState.get(\"a\"), \"1\");\n                Assert.equal(parentState.get(\"b\"), undefined);\n                Assert.equal(parentState.get(\"c\"), \"3\");\n                Assert.equal(asString(parentState), \"a=1,c=3\");\n                Assert.equal(parentState.keys.length, 2);\n                Assert.deepEqual([\"a\", \"c\"], parentState.keys);\n            }\n        });\n\n        // isEmpty property specific tests\n        this.testCase({\n            name: \"W3cTraceState: isEmpty with trace state values\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state with values should not be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: isEmpty after deleting all keys\",\n            test: () => {\n                const traceState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state with values should not be empty\");\n                \n                traceState.del(\"a\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty after deleting one key\");\n                \n                traceState.del(\"b\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty after deleting two keys\");\n                \n                traceState.del(\"c\");\n                Assert.equal(traceState.isEmpty, true, \"Trace state should be empty after deleting all keys\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: isEmpty with parent state\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(parentState.isEmpty, false, \"Parent trace state with values should not be empty\");\n                \n                const childState = createW3cTraceState(\"\", parentState);\n                Assert.equal(childState.isEmpty, false, \"Child trace state with parent values should not be empty\");\n                \n                const emptyChildState = createW3cTraceState(\"\", createW3cTraceState());\n                Assert.equal(emptyChildState.isEmpty, true, \"Child trace state with empty parent should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: isEmpty after deleting inherited keys\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                const childState = createW3cTraceState(\"\", parentState);\n                Assert.equal(childState.isEmpty, false, \"Child trace state with parent values should not be empty\");\n                \n                childState.del(\"a\");\n                Assert.equal(childState.isEmpty, false, \"Child trace state should not be empty after deleting one key\");\n                \n                childState.del(\"b\");\n                Assert.equal(childState.isEmpty, false, \"Child trace state should not be empty after deleting two keys\");\n                \n                childState.del(\"c\");\n                Assert.equal(childState.isEmpty, true, \"Child trace state should be empty after deleting all keys\");\n                \n                // Parent state should remain unchanged\n                Assert.equal(parentState.isEmpty, false, \"Parent trace state should remain unchanged\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: isEmpty after parent deletes keys\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                const childState = createW3cTraceState(\"\", parentState);\n                Assert.equal(childState.isEmpty, false, \"Child trace state with parent values should not be empty\");\n                \n                parentState.del(\"a\");\n                Assert.equal(childState.isEmpty, false, \"Child trace state should not be empty after parent deletes one key\");\n                \n                parentState.del(\"b\");\n                Assert.equal(childState.isEmpty, false, \"Child trace state should not be empty after parent deletes two keys\");\n                \n                parentState.del(\"c\");\n                Assert.equal(childState.isEmpty, true, \"Child trace state should be empty after parent deletes all keys\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: isEmpty with mixed operations\",\n            test: () => {\n                const traceState = createW3cTraceState();\n                Assert.equal(traceState.isEmpty, true, \"Empty trace state should be empty\");\n                \n                traceState.set(\"a\", \"1\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty after adding a key\");\n                \n                traceState.del(\"a\");\n                Assert.equal(traceState.isEmpty, true, \"Trace state should be empty after deleting the key\");\n                \n                traceState.set(\"b\", \"2\");\n                traceState.set(\"c\", \"3\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty after adding multiple keys\");\n                \n                traceState.del(\"b\");\n                Assert.equal(traceState.isEmpty, false, \"Trace state should not be empty with remaining keys\");\n                \n                traceState.del(\"c\");\n                Assert.equal(traceState.isEmpty, true, \"Trace state should be empty after deleting all keys\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: isEmpty with changing parent values\",\n            test: () => {\n                const parentState = createW3cTraceState();\n                const childState = createW3cTraceState(\"\", parentState);\n                Assert.equal(parentState.isEmpty, true, \"Empty parent trace state should be empty\");\n                Assert.equal(childState.isEmpty, true, \"Child of empty parent should be empty\");\n                \n                parentState.set(\"a\", \"1\");\n                Assert.equal(parentState.isEmpty, false, \"Parent trace state should not be empty after adding a key\");\n                Assert.equal(childState.isEmpty, false, \"Child trace state should not be empty after parent adds a key\");\n                \n                childState.del(\"a\");\n                Assert.equal(parentState.isEmpty, false, \"Parent trace state should remain unchanged after child deletes key\");\n                Assert.equal(childState.isEmpty, true, \"Child trace state should be empty after deleting parent's key\");\n                \n                childState.set(\"b\", \"2\");\n                Assert.equal(childState.isEmpty, false, \"Child trace state should not be empty after adding own key\");\n                \n                parentState.del(\"a\");\n                Assert.equal(parentState.isEmpty, true, \"Parent trace state should be empty after deleting its only key\");\n                Assert.equal(childState.isEmpty, false, \"Child trace state should not be empty with its own keys\");\n            }\n        });\n\n        // Tests for the child() function\n        this.testCase({\n            name: \"W3cTraceState: child() creates a new child trace state instance\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                const childState = parentState.child();\n                \n                Assert.notEqual(parentState, childState, \"Child should be a new instance\");\n                Assert.equal(childState.get(\"a\"), \"1\", \"Child should inherit parent values\");\n                Assert.equal(childState.get(\"b\"), \"2\", \"Child should inherit parent values\");\n                Assert.equal(childState.get(\"c\"), \"3\", \"Child should inherit parent values\");\n                Assert.equal(asString(childState), \"a=1,b=2,c=3\", \"Child should have same string representation as parent\");\n                Assert.equal(childState.keys.length, 3, \"Child should have same number of keys as parent\");\n                Assert.deepEqual(childState.keys, [\"a\", \"b\", \"c\"], \"Child should have same keys as parent\");\n                Assert.equal(childState.isEmpty, false, \"Child should not be empty if parent is not empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() from empty parent\",\n            test: () => {\n                const parentState = createW3cTraceState();\n                const childState = parentState.child();\n                \n                Assert.notEqual(parentState, childState, \"Child should be a new instance\");\n                Assert.equal(childState.keys.length, 0, \"Child of empty parent should have no keys\");\n                Assert.equal(asString(childState), \"\", \"Child of empty parent should have empty string representation\");\n                Assert.equal(childState.isEmpty, true, \"Child of empty parent should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with modifications to parent\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                const childState = parentState.child();\n                \n                Assert.equal(asString(childState), \"a=1,b=2\", \"Child should initially match parent\");\n                \n                // Modify parent after creating child\n                parentState.set(\"c\", \"3\");\n                Assert.equal(asString(parentState), \"c=3,a=1,b=2\", \"Parent should have new value\");\n                Assert.equal(asString(childState), \"c=3,a=1,b=2\", \"Child should reflect parent changes\");\n                Assert.equal(childState.get(\"c\"), \"3\", \"Child should get updated value from parent\");\n                \n                // Delete from parent\n                parentState.del(\"a\");\n                Assert.equal(asString(parentState), \"c=3,b=2\", \"Parent should have key removed\");\n                Assert.equal(asString(childState), \"c=3,b=2\", \"Child should reflect parent deletions\");\n                Assert.equal(childState.get(\"a\"), undefined, \"Child should not have deleted key\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with modifications to child\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                const childState = parentState.child();\n                \n                // Modify child\n                childState.set(\"c\", \"3\");\n                Assert.equal(asString(childState), \"c=3,a=1,b=2\", \"Child should have new value\");\n                Assert.equal(asString(parentState), \"a=1,b=2\", \"Parent should not be affected by child changes\");\n                Assert.equal(parentState.get(\"c\"), undefined, \"Parent should not have child's new key\");\n                \n                // Modify existing value in child\n                childState.set(\"a\", \"4\");\n                Assert.equal(asString(childState), \"a=4,c=3,b=2\", \"Child should have updated value\");\n                Assert.equal(asString(parentState), \"a=1,b=2\", \"Parent should not be affected by child modifications\");\n                Assert.equal(parentState.get(\"a\"), \"1\", \"Parent should keep original value\");\n                Assert.equal(childState.get(\"a\"), \"4\", \"Child should have updated value\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with deletions in child\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                const childState = parentState.child();\n                \n                // Delete key in child\n                childState.del(\"b\");\n                Assert.equal(asString(childState), \"a=1,c=3\", \"Child should have key removed\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\", \"Parent should not be affected by child deletions\");\n                Assert.equal(parentState.get(\"b\"), \"2\", \"Parent should keep deleted key\");\n                Assert.equal(childState.get(\"b\"), undefined, \"Child should not have deleted key\");\n                \n                // Delete all keys in child\n                childState.del(\"a\");\n                childState.del(\"c\");\n                Assert.equal(asString(childState), \"\", \"Child should have all keys removed\");\n                Assert.equal(childState.isEmpty, true, \"Child should be empty after deleting all keys\");\n                Assert.equal(asString(parentState), \"a=1,b=2,c=3\", \"Parent should remain unchanged\");\n                Assert.equal(parentState.isEmpty, false, \"Parent should not be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: nested children creation\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                const childState = parentState.child();\n                const grandchildState = childState.child();\n                \n                Assert.notEqual(parentState, childState, \"Child should be a new instance\");\n                Assert.notEqual(childState, grandchildState, \"Grandchild should be a new instance\");\n                Assert.notEqual(parentState, grandchildState, \"Grandchild should be a new instance different from parent\");\n                \n                Assert.equal(asString(grandchildState), \"a=1,b=2\", \"Grandchild should inherit all values\");\n                \n                // Modify at each level\n                parentState.set(\"p\", \"parent\");\n                childState.set(\"c\", \"child\");\n                grandchildState.set(\"g\", \"grandchild\");\n                \n                Assert.equal(asString(parentState), \"p=parent,a=1,b=2\", \"Parent should have its own values\");\n                Assert.equal(asString(childState), \"c=child,p=parent,a=1,b=2\", \"Child should have its values and parent's\");\n                Assert.equal(asString(grandchildState), \"g=grandchild,c=child,p=parent,a=1,b=2\", \"Grandchild should have all values\");\n                \n                // Override values at different levels\n                childState.set(\"a\", \"child-a\");\n                grandchildState.set(\"c\", \"grandchild-c\");\n                \n                Assert.equal(parentState.get(\"a\"), \"1\", \"Parent should keep original value\");\n                Assert.equal(childState.get(\"a\"), \"child-a\", \"Child should have overridden value\");\n                Assert.equal(grandchildState.get(\"a\"), \"child-a\", \"Grandchild should inherit child's value\");\n                Assert.equal(childState.get(\"c\"), \"child\", \"Child should keep its value\");\n                Assert.equal(grandchildState.get(\"c\"), \"grandchild-c\", \"Grandchild should have overridden value\");\n            }\n        });\n        \n        this.testCase({\n            name: \"W3cTraceState: child() with modifications affecting isEmpty\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                const childState = parentState.child();\n                \n                Assert.equal(parentState.isEmpty, false, \"Parent should not be empty\");\n                Assert.equal(childState.isEmpty, false, \"Child should not be empty\");\n                \n                // Delete all parent keys from child\n                childState.del(\"a\");\n                childState.del(\"b\");\n                \n                Assert.equal(parentState.isEmpty, false, \"Parent should still not be empty\");\n                Assert.equal(childState.isEmpty, true, \"Child should be empty after deleting all keys\");\n                \n                // Add key to parent\n                parentState.set(\"c\", \"3\");\n                Assert.equal(childState.isEmpty, false, \"Child should not be empty after parent adds key\");\n                Assert.equal(childState.get(\"c\"), \"3\", \"Child should have parent's new key\");\n                \n                // Delete from parent\n                parentState.del(\"a\");\n                parentState.del(\"b\");\n                parentState.del(\"c\");\n                \n                Assert.equal(parentState.isEmpty, true, \"Parent should be empty after deleting all keys\");\n                Assert.equal(childState.isEmpty, true, \"Child should be empty when parent is empty and child has deleted parent keys\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() preserves key ordering\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2,c=3\");\n                const childState = parentState.child();\n                \n                // Add keys to child, which should go to the front\n                childState.set(\"d\", \"4\");\n                childState.set(\"e\", \"5\");\n                \n                Assert.deepEqual(childState.keys, [\"e\", \"d\", \"a\", \"b\", \"c\"], \"Child should have keys in correct order\");\n                \n                // Update existing key in child, which should move to front\n                childState.set(\"b\", \"new-b\");\n                \n                Assert.deepEqual(childState.keys, [\"b\", \"e\", \"d\", \"a\", \"c\"], \"Updated key should move to front\");\n                Assert.equal(childState.get(\"b\"), \"new-b\", \"Should get updated value\");\n                \n                // Add new key to parent, should be inherited by child\n                parentState.set(\"f\", \"6\");\n                \n                // Child keys should include parent's new key but maintain child's order\n                Assert.deepEqual(childState.keys, [\"b\", \"e\", \"d\", \"f\", \"a\", \"c\"], \"Child should include parent's new key\");\n                \n                // Update existing key in parent, which should be reflected in child unless overridden\n                parentState.set(\"a\", \"new-a\");\n                \n                Assert.equal(childState.get(\"a\"), \"new-a\", \"Child should see parent's updated value\");\n                \n                // Override parent key that was already overridden\n                childState.set(\"a\", \"child-a\");\n                \n                Assert.equal(parentState.get(\"a\"), \"new-a\", \"Parent should keep its value\");\n                Assert.equal(childState.get(\"a\"), \"child-a\", \"Child should have its own value\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() handles hdrs() correctly\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                const childState = parentState.child();\n                \n                Assert.deepEqual(childState.hdrs(), [\"a=1,b=2\"], \"Child headers should match parent initially\");\n                \n                childState.set(\"c\", \"3\");\n                Assert.deepEqual(childState.hdrs(), [\"c=3,a=1,b=2\"], \"Child headers should include own values\");\n                Assert.deepEqual(parentState.hdrs(), [\"a=1,b=2\"], \"Parent headers should remain unchanged\");\n                \n                // Test with maxHeaders parameter\n                const longParent = createW3cTraceState(\"a=\" + strRepeat(\"x\", 250) + \",b=\" + strRepeat(\"y\", 250));\n                const longChild = longParent.child();\n                longChild.set(\"c\", strRepeat(\"z\", 250));\n                \n                // Should split into multiple headers due to length\n                Assert.equal(longChild.hdrs().length > 1, true, \"Long values should split into multiple headers\");\n                \n                // Test with maxKeys parameter\n                Assert.deepEqual(longChild.hdrs(undefined, 1), [\"c=\" + strRepeat(\"z\", 250)], \"Should respect maxKeys parameter\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with invalid values in parent\",\n            test: () => {\n                // Create parent with some invalid entries that will be filtered out\n                const parentState = createW3cTraceState(\"a=1,invalid,b=2,c=\");\n                Assert.equal(asString(parentState), \"a=1,b=2\", \"Parent should only have valid entries\");\n                \n                const childState = parentState.child();\n                Assert.equal(asString(childState), \"a=1,b=2\", \"Child should inherit only valid entries\");\n                \n                // Add an invalid entry to parent after child creation\n                parentState.set(\"d\", \"\");\n                Assert.equal(asString(parentState), \"a=1,b=2\", \"Parent should not add invalid entry\");\n                Assert.equal(asString(childState), \"a=1,b=2\", \"Child should reflect parent's valid state\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with multiple children from same parent\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                \n                // Create multiple children\n                const child1 = parentState.child();\n                const child2 = parentState.child();\n                const child3 = parentState.child();\n                \n                Assert.notEqual(child1, child2, \"Each child should be a distinct instance\");\n                Assert.notEqual(child2, child3, \"Each child should be a distinct instance\");\n                \n                // Modify each child differently\n                child1.set(\"c\", \"3\");\n                child2.set(\"d\", \"4\");\n                child3.set(\"e\", \"5\");\n                \n                // Each child should have its own modifications plus parent's values\n                Assert.equal(asString(child1), \"c=3,a=1,b=2\", \"Child 1 should have its own changes\");\n                Assert.equal(asString(child2), \"d=4,a=1,b=2\", \"Child 2 should have its own changes\");\n                Assert.equal(asString(child3), \"e=5,a=1,b=2\", \"Child 3 should have its own changes\");\n                \n                // Modify parent, all children should reflect the change\n                parentState.set(\"f\", \"6\");\n                \n                Assert.equal(asString(child1), \"c=3,f=6,a=1,b=2\", \"Child 1 should see parent's new value\");\n                Assert.equal(asString(child2), \"d=4,f=6,a=1,b=2\", \"Child 2 should see parent's new value\");\n                Assert.equal(asString(child3), \"e=5,f=6,a=1,b=2\", \"Child 3 should see parent's new value\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with limit on trace state members\",\n            test: () => {\n                // Create a parent with more than the maximum allowed entries for hdrs\n                const parentState = createW3cTraceState();\n                for (let i = 0; i < 40; i++) {\n                    parentState.set(\"key\" + i, \"value\" + i);\n                }\n                \n                // In memory, we can exceed 32 keys\n                Assert.equal(parentState.keys.length, 40, \"Parent should have all 40 keys in memory\");\n                Assert.equal(parentState.get(\"key0\"), \"value0\", \"First key should be accessible\");\n                Assert.equal(parentState.get(\"key39\"), \"value39\", \"Last key should be accessible\");\n                \n                // When converted to headers, it's limited to 32 keys\n                const headers = parentState.hdrs();\n                let headersStr = headers.join(\",\");\n                // First keys (0-7) should not be in headers as they're the oldest\n                Assert.equal(headersStr.indexOf(\"key0=value0\"), -1, \"Oldest keys should not be in headers\");\n                Assert.equal(headersStr.indexOf(\"key7=value7\"), -1, \"Oldest keys should not be in headers\");\n                // Most recent keys (8-39) should be in headers\n                Assert.notEqual(headersStr.indexOf(\"key8=value8\"), -1, \"More recent keys should be in headers\");\n                Assert.notEqual(headersStr.indexOf(\"key39=value39\"), -1, \"Most recent keys should be in headers\");\n                \n                // Create a child state\n                const childState = parentState.child();\n                \n                // Child should inherit all keys in memory\n                Assert.equal(childState.keys.length, 40, \"Child should inherit all keys in memory\");\n                Assert.equal(childState.get(\"key0\"), \"value0\", \"Child should have access to all parent keys\");\n                Assert.equal(childState.get(\"key39\"), \"value39\", \"Child should have access to all parent keys\");\n                \n                // Add more keys to child\n                for (let i = 0; i < 10; i++) {\n                    childState.set(\"child-key\" + i, \"child-value\" + i);\n                }\n                \n                // In memory, child should have all keys\n                Assert.equal(childState.keys.length, 50, \"Child should have all 50 keys in memory\");\n                \n                // When converted to headers and back, we should only get 32 keys\n                const childHeaders = childState.hdrs();\n                const roundTripState = createW3cTraceState(childHeaders.join(\",\"));\n                \n                Assert.equal(roundTripState.keys.length, 32, \"Round trip state should have max 32 keys\");\n                \n                // Most recent keys should be preserved (child keys and most recent parent keys)\n                Assert.equal(roundTripState.get(\"child-key9\"), \"child-value9\", \"Most recent child key should be preserved\");\n                Assert.equal(roundTripState.get(\"child-key0\"), \"child-value0\", \"First child key should be preserved\");\n                \n                // Some parent keys should be dropped in the round trip\n                Assert.equal(roundTripState.get(\"key0\"), undefined, \"Oldest parent keys should be dropped in round trip\");\n                Assert.equal(roundTripState.get(\"key10\"), undefined, \"Older parent keys should be dropped in round trip\");\n                \n                // Make sure both original states are unaffected\n                Assert.equal(parentState.keys.length, 40, \"Original parent should still have 40 keys\");\n                Assert.equal(childState.keys.length, 50, \"Original child should still have 50 keys\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: chain of multiple child() calls\",\n            test: () => {\n                // Create a chain of trace states using child()\n                const state1 = createW3cTraceState(\"a=1\");\n                const state2 = state1.child();\n                state2.set(\"b\", \"2\");\n                const state3 = state2.child();\n                state3.set(\"c\", \"3\");\n                const state4 = state3.child();\n                state4.set(\"d\", \"4\");\n                const state5 = state4.child();\n                state5.set(\"e\", \"5\");\n                \n                // Each state should have its own keys plus all ancestor keys\n                Assert.equal(asString(state1), \"a=1\", \"State 1 should have its own key\");\n                Assert.equal(asString(state2), \"b=2,a=1\", \"State 2 should have its key and parent's\");\n                Assert.equal(asString(state3), \"c=3,b=2,a=1\", \"State 3 should have its key and ancestors'\");\n                Assert.equal(asString(state4), \"d=4,c=3,b=2,a=1\", \"State 4 should have its key and ancestors'\");\n                Assert.equal(asString(state5), \"e=5,d=4,c=3,b=2,a=1\", \"State 5 should have its key and ancestors'\");\n                \n                // Modify an ancestor, changes should propagate down the chain\n                state2.set(\"b\", \"new-2\");\n                \n                Assert.equal(state3.get(\"b\"), \"new-2\", \"State 3 should see updated ancestor value\");\n                Assert.equal(state4.get(\"b\"), \"new-2\", \"State 4 should see updated ancestor value\");\n                Assert.equal(state5.get(\"b\"), \"new-2\", \"State 5 should see updated ancestor value\");\n                \n                // Delete from an ancestor, deletion should propagate\n                state1.del(\"a\");\n                \n                Assert.equal(state2.get(\"a\"), undefined, \"State 2 should see parent deletion\");\n                Assert.equal(state3.get(\"a\"), undefined, \"State 3 should see ancestor deletion\");\n                Assert.equal(state4.get(\"a\"), undefined, \"State 4 should see ancestor deletion\");\n                Assert.equal(state5.get(\"a\"), undefined, \"State 5 should see ancestor deletion\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() and toString consistency\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                const childState = parentState.child();\n                childState.set(\"c\", \"3\");\n                \n                // toString and asString should be equivalent\n                Assert.equal(asString(childState), childState.toString(), \"toString and asString should be consistent\");\n                Assert.equal(childState.toString(), \"c=3,a=1,b=2\", \"toString should reflect the current state\");\n                \n                // toString should update when state changes\n                childState.set(\"d\", \"4\");\n                Assert.equal(childState.toString(), \"d=4,c=3,a=1,b=2\", \"toString should reflect updated state\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with isW3cTraceState check\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=1\");\n                const childState = parentState.child();\n                \n                // The isW3cTraceState function should recognize child instances\n                Assert.equal(isW3cTraceState(childState), true, \"Child should be recognized as W3cTraceState\");\n                \n                // Compare with non-trace state objects\n                Assert.equal(isW3cTraceState({}), false, \"Empty object is not a trace state\");\n                Assert.equal(isW3cTraceState({ keys: [] }), false, \"Object with only keys is not a trace state\");\n                Assert.equal(isW3cTraceState(null), false, \"Null is not a trace state\");\n                Assert.equal(isW3cTraceState(undefined), false, \"Undefined is not a trace state\");\n            }\n        });\n        \n        this.testCase({\n            name: \"W3cTraceState: child() after deleting parent\",\n            test: () => {\n                // Create a parent and child\n                const parentState = createW3cTraceState(\"a=1,b=2\");\n                const childState = parentState.child();\n                \n                // Verify initial state\n                Assert.equal(childState.get(\"a\"), \"1\", \"Child should have parent's key\");\n                \n                // Simulate \"deleting\" the parent by removing all references\n                // (Note: we can't truly delete objects in JavaScript, but we can simulate by removing all references)\n                // Set all parent keys to null to simulate the parent being \"gone\"\n                parentState.del(\"a\");\n                parentState.del(\"b\");\n                \n                // Child should still function properly\n                Assert.equal(childState.get(\"a\"), undefined, \"Child should see parent's deletion\");\n                Assert.equal(childState.get(\"b\"), undefined, \"Child should see parent's deletion\");\n                \n                // Child should still be able to set its own values\n                childState.set(\"c\", \"3\");\n                Assert.equal(childState.get(\"c\"), \"3\", \"Child should be able to set new values\");\n                Assert.equal(asString(childState), \"c=3\", \"Child should have correct string representation\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: child() with special characters in values\",\n            test: () => {\n                // Create parent with special characters in values\n                const parentState = createW3cTraceState(\"a=value with spaces,b=value-with-dashes,c=value_with_underscores\");\n                const childState = parentState.child();\n                \n                // Child should inherit these values correctly\n                Assert.equal(childState.get(\"a\"), \"value with spaces\", \"Child should inherit values with spaces\");\n                Assert.equal(childState.get(\"b\"), \"value-with-dashes\", \"Child should inherit values with dashes\");\n                Assert.equal(childState.get(\"c\"), \"value_with_underscores\", \"Child should inherit values with underscores\");\n                \n                // Child should be able to set new values with special characters\n                childState.set(\"d\", \"value!with@special#chars\");\n                Assert.equal(childState.get(\"d\"), \"value!with@special#chars\", \"Child should set value with special chars\");\n                \n                // Check string representation\n                Assert.equal(asString(childState), \n                    \"d=value!with@special#chars,a=value with spaces,b=value-with-dashes,c=value_with_underscores\", \n                    \"Child should have correct string representation with special chars\");\n            }\n        });\n\n        this.testCase({\n            name: \"W3cTraceState: serialization limits with parent and child\",\n            test: () => {\n                // Create a parent with many keys\n                const parentState = createW3cTraceState();\n                for (let i = 0; i < 20; i++) {\n                    parentState.set(\"p\" + i, \"parent\" + i);\n                }\n                \n                // Create a child and add many keys\n                const childState = parentState.child();\n                for (let i = 0; i < 20; i++) {\n                    childState.set(\"c\" + i, \"child\" + i);\n                }\n                \n                // In memory, both should have their respective keys\n                Assert.equal(parentState.keys.length, 20, \"Parent should have 20 keys in memory\");\n                Assert.equal(childState.keys.length, 40, \"Child should have 20 own keys + 20 parent keys\");\n                \n                // Get the string representation of the child\n                const childString = asString(childState);\n                \n                // Create a new state from the string representation\n                const roundTripState = createW3cTraceState(childString);\n                \n                // Only 32 keys should survive the round trip\n                Assert.equal(roundTripState.keys.length, 32, \"Round-trip state should have 32 keys max\");\n                \n                // The most recent keys should be preserved\n                // Child keys should all be preserved (since they're more recent)\n                Assert.equal(roundTripState.get(\"c19\"), \"child19\", \"Most recent child keys should be preserved\");\n                Assert.equal(roundTripState.get(\"c0\"), \"child0\", \"All child keys should be preserved\");\n                \n                // Only the most recent parent keys should survive\n                Assert.equal(roundTripState.get(\"p19\"), \"parent19\", \"Most recent parent keys should be preserved\");\n                Assert.equal(roundTripState.get(\"p8\"), \"parent8\", \"Recent parent keys should be preserved\");\n                Assert.equal(roundTripState.get(\"p7\"), undefined, \"Older parent keys should be dropped\");\n                Assert.equal(roundTripState.get(\"p0\"), undefined, \"Oldest parent keys should be dropped\");\n                \n                // Test hdrs with explicit maxKeys parameter\n                const limitedHeaders = childState.hdrs(undefined, 15);\n                const limitedState = createW3cTraceState(limitedHeaders.join(\",\"));\n                \n                Assert.equal(limitedState.keys.length, 15, \"State from limited headers should respect maxKeys\");\n                Assert.equal(limitedState.get(\"c19\"), \"child19\", \"Most recent keys should be preserved with limit\");\n                Assert.equal(limitedState.get(\"c5\"), \"child5\", \"Recent keys should be preserved with limit\");\n                Assert.equal(limitedState.get(\"c4\"), undefined, \"Older keys should be dropped with limit\");\n                Assert.equal(limitedState.get(\"p19\"), undefined, \"Parent keys should be dropped with stricter limit\");\n            }\n        });\n\n        // Tests for snapshotW3cTraceState helper function\n        this.testCase({\n            name: \"snapshotW3cTraceState: handle null input\",\n            test: () => {\n                const snapshot = snapshotW3cTraceState(null as any);\n                \n                Assert.ok(snapshot, \"Should return a valid trace state instance\");\n                Assert.equal(snapshot.keys.length, 0, \"Snapshot should have no keys\");\n                Assert.equal(asString(snapshot), \"\", \"Snapshot should have empty string representation\");\n                Assert.equal(snapshot.isEmpty, true, \"Snapshot should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: handle undefined input\",\n            test: () => {\n                const snapshot = snapshotW3cTraceState(undefined as any);\n                \n                Assert.ok(snapshot, \"Should return a valid trace state instance\");\n                Assert.equal(snapshot.keys.length, 0, \"Snapshot should have no keys\");\n                Assert.equal(asString(snapshot), \"\", \"Snapshot should have empty string representation\");\n                Assert.equal(snapshot.isEmpty, true, \"Snapshot should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: handle empty trace state\",\n            test: () => {\n                const original = createW3cTraceState();\n                const snapshot = snapshotW3cTraceState(original);\n                \n                Assert.ok(snapshot, \"Should return a valid trace state instance\");\n                Assert.notEqual(snapshot, original, \"Should return a different instance\");\n                Assert.equal(snapshot.keys.length, 0, \"Snapshot should have no keys\");\n                Assert.equal(asString(snapshot), \"\", \"Snapshot should have empty string representation\");\n                Assert.equal(snapshot.isEmpty, true, \"Snapshot should be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: capture simple trace state\",\n            test: () => {\n                const original = createW3cTraceState(\"a=1,b=2,c=3\");\n                const snapshot = snapshotW3cTraceState(original);\n                \n                Assert.ok(snapshot, \"Should return a valid trace state instance\");\n                Assert.notEqual(snapshot, original, \"Should return a different instance\");\n                Assert.equal(snapshot.keys.length, 3, \"Snapshot should have 3 keys\");\n                Assert.deepEqual(snapshot.keys, [\"a\", \"b\", \"c\"], \"Snapshot should have correct keys\");\n                Assert.equal(snapshot.get(\"a\"), \"1\", \"Snapshot should have correct value for 'a'\");\n                Assert.equal(snapshot.get(\"b\"), \"2\", \"Snapshot should have correct value for 'b'\");\n                Assert.equal(snapshot.get(\"c\"), \"3\", \"Snapshot should have correct value for 'c'\");\n                Assert.equal(asString(snapshot), \"a=1,b=2,c=3\", \"Snapshot should have correct string representation\");\n                Assert.equal(snapshot.isEmpty, false, \"Snapshot should not be empty\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: snapshot is independent from original\",\n            test: () => {\n                const original = createW3cTraceState(\"a=1,b=2,c=3\");\n                const snapshot = snapshotW3cTraceState(original);\n                \n                // Initial state should be identical\n                Assert.equal(asString(snapshot), asString(original), \"Initial state should be identical\");\n                \n                // Modify original after snapshot\n                original.set(\"d\", \"4\");\n                original.set(\"a\", \"modified\");\n                original.del(\"b\");\n                \n                // Snapshot should remain unchanged\n                Assert.equal(snapshot.keys.length, 3, \"Snapshot should still have 3 keys\");\n                Assert.equal(snapshot.get(\"a\"), \"1\", \"Snapshot should have original value for 'a'\");\n                Assert.equal(snapshot.get(\"b\"), \"2\", \"Snapshot should still have 'b' key\");\n                Assert.equal(snapshot.get(\"c\"), \"3\", \"Snapshot should have original value for 'c'\");\n                Assert.equal(snapshot.get(\"d\"), undefined, \"Snapshot should not have new 'd' key\");\n                Assert.equal(asString(snapshot), \"a=1,b=2,c=3\", \"Snapshot should have original string representation\");\n                \n                // Original should have changes\n                Assert.equal(original.keys.length, 3, \"Original should have 3 keys after modification\");\n                Assert.equal(original.get(\"a\"), \"modified\", \"Original should have modified value for 'a'\");\n                Assert.equal(original.get(\"b\"), undefined, \"Original should not have 'b' key after deletion\");\n                Assert.equal(original.get(\"c\"), \"3\", \"Original should have original value for 'c'\");\n                Assert.equal(original.get(\"d\"), \"4\", \"Original should have new 'd' key\");\n                Assert.equal(asString(original), \"a=modified,d=4,c=3\", \"Original should have modified string representation\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: snapshot with parent trace state\",\n            test: () => {\n                const parentState = createW3cTraceState(\"parent1=value1,parent2=value2\");\n                const childState = createW3cTraceState(\"child1=cvalue1,child2=cvalue2\", parentState);\n                \n                // Verify child state includes parent values\n                Assert.equal(childState.keys.length, 4, \"Child should have 4 keys\");\n                Assert.equal(childState.get(\"parent1\"), \"value1\", \"Child should have parent1 value\");\n                Assert.equal(childState.get(\"parent2\"), \"value2\", \"Child should have parent2 value\");\n                Assert.equal(childState.get(\"child1\"), \"cvalue1\", \"Child should have child1 value\");\n                Assert.equal(childState.get(\"child2\"), \"cvalue2\", \"Child should have child2 value\");\n                \n                // Take snapshot of child state\n                const snapshot = snapshotW3cTraceState(childState);\n                \n                Assert.ok(snapshot, \"Should return a valid trace state instance\");\n                Assert.notEqual(snapshot, childState, \"Should return a different instance\");\n                Assert.equal(snapshot.keys.length, 4, \"Snapshot should have 4 keys\");\n                Assert.equal(snapshot.get(\"parent1\"), \"value1\", \"Snapshot should have parent1 value\");\n                Assert.equal(snapshot.get(\"parent2\"), \"value2\", \"Snapshot should have parent2 value\");\n                Assert.equal(snapshot.get(\"child1\"), \"cvalue1\", \"Snapshot should have child1 value\");\n                Assert.equal(snapshot.get(\"child2\"), \"cvalue2\", \"Snapshot should have child2 value\");\n                \n                // Verify snapshot string representation includes all values\n                const snapshotStr = asString(snapshot);\n                Assert.ok(snapshotStr.includes(\"parent1=value1\"), \"Snapshot string should include parent1\");\n                Assert.ok(snapshotStr.includes(\"parent2=value2\"), \"Snapshot string should include parent2\");\n                Assert.ok(snapshotStr.includes(\"child1=cvalue1\"), \"Snapshot string should include child1\");\n                Assert.ok(snapshotStr.includes(\"child2=cvalue2\"), \"Snapshot string should include child2\");\n                \n                // Check that snapshot has no parent (is independent)\n                Assert.equal((snapshot as any)._p, null, \"Snapshot should have no parent\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: snapshot remains unchanged when parent/child modified\",\n            test: () => {\n                const parentState = createW3cTraceState(\"parent1=value1,parent2=value2\");\n                const childState = createW3cTraceState(\"child1=cvalue1\", parentState);\n                \n                // Take snapshot before modifications\n                const snapshot = snapshotW3cTraceState(childState);\n                \n                // Initial verification\n                Assert.equal(snapshot.keys.length, 3, \"Snapshot should have 3 keys initially\");\n                Assert.equal(snapshot.get(\"parent1\"), \"value1\", \"Snapshot should have parent1 value\");\n                Assert.equal(snapshot.get(\"parent2\"), \"value2\", \"Snapshot should have parent2 value\");\n                Assert.equal(snapshot.get(\"child1\"), \"cvalue1\", \"Snapshot should have child1 value\");\n                \n                // Modify parent state\n                parentState.set(\"parent1\", \"modified_parent1\");\n                parentState.set(\"parent3\", \"new_parent3\");\n                parentState.del(\"parent2\");\n                \n                // Modify child state\n                childState.set(\"child1\", \"modified_child1\");\n                childState.set(\"child2\", \"new_child2\");\n                \n                // Snapshot should remain unchanged\n                Assert.equal(snapshot.keys.length, 3, \"Snapshot should still have 3 keys\");\n                Assert.equal(snapshot.get(\"parent1\"), \"value1\", \"Snapshot should have original parent1 value\");\n                Assert.equal(snapshot.get(\"parent2\"), \"value2\", \"Snapshot should have original parent2 value\");\n                Assert.equal(snapshot.get(\"child1\"), \"cvalue1\", \"Snapshot should have original child1 value\");\n                Assert.equal(snapshot.get(\"parent3\"), undefined, \"Snapshot should not have new parent3\");\n                Assert.equal(snapshot.get(\"child2\"), undefined, \"Snapshot should not have new child2\");\n                \n                // Child state should reflect changes\n                Assert.equal(childState.get(\"parent1\"), \"modified_parent1\", \"Child should have modified parent1\");\n                Assert.equal(childState.get(\"parent2\"), undefined, \"Child should not have deleted parent2\");\n                Assert.equal(childState.get(\"parent3\"), \"new_parent3\", \"Child should have new parent3\");\n                Assert.equal(childState.get(\"child1\"), \"modified_child1\", \"Child should have modified child1\");\n                Assert.equal(childState.get(\"child2\"), \"new_child2\", \"Child should have new child2\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: snapshot with overridden parent values\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=parent_a,b=parent_b,c=parent_c\");\n                const childState = createW3cTraceState(\"a=child_a,d=child_d\", parentState);\n                \n                // Verify child state has overridden parent value\n                Assert.equal(childState.get(\"a\"), \"child_a\", \"Child should have overridden value for 'a'\");\n                Assert.equal(childState.get(\"b\"), \"parent_b\", \"Child should have parent value for 'b'\");\n                Assert.equal(childState.get(\"c\"), \"parent_c\", \"Child should have parent value for 'c'\");\n                Assert.equal(childState.get(\"d\"), \"child_d\", \"Child should have its own value for 'd'\");\n                \n                // Take snapshot\n                const snapshot = snapshotW3cTraceState(childState);\n                \n                Assert.equal(snapshot.keys.length, 4, \"Snapshot should have 4 keys\");\n                Assert.equal(snapshot.get(\"a\"), \"child_a\", \"Snapshot should have overridden value for 'a'\");\n                Assert.equal(snapshot.get(\"b\"), \"parent_b\", \"Snapshot should have parent value for 'b'\");\n                Assert.equal(snapshot.get(\"c\"), \"parent_c\", \"Snapshot should have parent value for 'c'\");\n                Assert.equal(snapshot.get(\"d\"), \"child_d\", \"Snapshot should have child value for 'd'\");\n                \n                // Verify snapshot string representation\n                const snapshotStr = asString(snapshot);\n                Assert.ok(snapshotStr.includes(\"a=child_a\"), \"Snapshot should include overridden value\");\n                Assert.ok(snapshotStr.includes(\"b=parent_b\"), \"Snapshot should include parent value\");\n                Assert.ok(snapshotStr.includes(\"c=parent_c\"), \"Snapshot should include parent value\");\n                Assert.ok(snapshotStr.includes(\"d=child_d\"), \"Snapshot should include child value\");\n                \n                // Modify parent's overridden key\n                parentState.set(\"a\", \"new_parent_a\");\n                \n                // Snapshot should still have the overridden value\n                Assert.equal(snapshot.get(\"a\"), \"child_a\", \"Snapshot should keep overridden value despite parent change\");\n            }\n        });\n\n        this.testCase({\n            name: \"snapshotW3cTraceState: snapshot with deleted parent keys\",\n            test: () => {\n                const parentState = createW3cTraceState(\"a=parent_a,b=parent_b,c=parent_c\");\n                const childState = createW3cTraceState(\"d=child_d\", parentState);\n                \n                // Delete a parent key in the child\n                childState.del(\"b\");\n                \n                // Verify child state behavior\n                Assert.equal(childState.get(\"a\"), \"parent_a\", \"Child should have parent value for 'a'\");\n                Assert.equal(childState.get(\"b\"), undefined, \"Child should not have deleted 'b' key\");\n                Assert.equal(childState.get(\"c\"), \"parent_c\", \"Child should have parent value for 'c'\");\n                Assert.equal(childState.get(\"d\"), \"child_d\", \"Child should have its own value for 'd'\");\n                \n                // Take snapshot\n                const snapshot = snapshotW3cTraceState(childState);\n                \n                Assert.equal(snapshot.keys.length, 3, \"Snapshot should have 3 keys (deleted key excluded)\");\n                Assert.equal(snapshot.get(\"a\"), \"parent_a\", \"Snapshot should have parent value for 'a'\");\n                Assert.equal(snapshot.get(\"b\"), undefined, \"Snapshot should not have deleted 'b' key\");\n                Assert.equal(snapshot.get(\"c\"), \"parent_c\", \"Snapshot should have parent value for 'c'\");\n                Assert.equal(snapshot.get(\"d\"), \"child_d\", \"Snapshot should have child value for 'd'\");\n                \n                // Verify snapshot string representation doesn't include deleted key\n                const snapshotStr = asString(snapshot);\n                Assert.ok(!snapshotStr.includes(\"b=\"), \"Snapshot should not include deleted key\");\n                Assert.ok(snapshotStr.includes(\"a=parent_a\"), \"Snapshot should include parent value\");\n                Assert.ok(snapshotStr.includes(\"c=parent_c\"), \"Snapshot should include parent value\");\n                Assert.ok(snapshotStr.includes(\"d=child_d\"), \"Snapshot should include child value\");\n                \n                // Re-add the deleted key in parent after snapshot\n                parentState.set(\"b\", \"restored_parent_b\");\n                \n                // Snapshot should still not have the key\n                Assert.equal(snapshot.get(\"b\"), undefined, \"Snapshot should not have restored key\");\n                \n                // Child state should also not have the key since it was deleted before child creation\n                Assert.equal(childState.get(\"b\"), undefined, \"Child should not have restored key\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/trace/span.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { getDeferred, ICachedValue, isNullOrUndefined, mathMin, objDefine, perfNow, strSubstr } from \"@nevware21/ts-utils\";\nimport { createSpan } from \"../../../../src/otel/api/trace/span\";\nimport { createOTelApi } from \"../../../../src/otel/api/OTelApi\";\nimport { IOTelSpanCtx } from \"../../../../src/interfaces/otel/trace/IOTelSpanCtx\";\nimport { IOTelApi } from \"../../../../src/interfaces/otel/IOTelApi\";\nimport { IOTelConfig } from \"../../../../src/interfaces/otel/config/IOTelConfig\";\nimport { eOTelSpanStatusCode } from \"../../../../src/enums/otel/OTelSpanStatus\";\nimport { IOTelAttributes } from \"../../../../src/interfaces/otel/IOTelAttributes\";\nimport { IReadableSpan } from \"../../../../src/interfaces/otel/trace/IReadableSpan\";\nimport { IDistributedTraceContext } from \"../../../../src/interfaces/ai/IDistributedTraceContext\";\nimport { createDistributedTraceContext } from \"../../../../src/core/TelemetryHelpers\";\nimport { generateW3CId } from \"../../../../src/utils/CoreUtils\";\nimport { suppressTracing, unsuppressTracing, isTracingSuppressed, useSpan, withSpan } from \"../../../../src/otel/api/trace/utils\";\nimport { ITraceCfg } from \"../../../../src/interfaces/otel/config/IOTelTraceCfg\";\nimport { AppInsightsCore } from \"../../../../src/core/AppInsightsCore\";\nimport { IConfiguration } from \"../../../../src/interfaces/ai/IConfiguration\";\nimport { ITraceProvider, ISpanScope, ITraceHost } from \"../../../../src/interfaces/ai/ITraceProvider\";\nimport { IOTelSpanOptions } from \"../../../../src/interfaces/otel/trace/IOTelSpanOptions\";\nimport { eOTelSpanKind } from \"../../../../src/enums/otel/OTelSpanKind\";\n\nexport class SpanTests extends AITestClass {\n\n    private _mockApi!: IOTelApi;\n    private _mockSpanContext!: IDistributedTraceContext;\n    private _onEndCalls!: IReadableSpan[];\n    private _core!: AppInsightsCore;\n\n    public testInitialize() {\n        super.testInitialize();\n        this._onEndCalls = [];\n\n        // Create mock span context\n        this._mockSpanContext = createDistributedTraceContext({\n            traceId: \"12345678901234567890123456789012\",\n            spanId: \"1234567890123456\",\n            traceFlags: 1,\n            isRemote: false\n        });\n\n        // Create mock API\n        this._mockApi = {\n            cfg: {\n                errorHandlers: {}\n            } as IOTelConfig\n        } as IOTelApi;\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n        this._onEndCalls = [];\n        \n        // Clean up AppInsightsCore instance if initialized\n        if (this._core && this._core.isInitialized()) {\n            this._core.unload(false);\n        }\n        this._core = undefined as any;\n    }\n\n    /**\n     * Helper function to create a simple trace provider with onEnd callback\n     */\n    private _createTestTraceProvider(host: ITraceHost, onEnd?: (span: IReadableSpan) => void): ICachedValue<ITraceProvider> {\n        const actualOnEnd = onEnd || ((span) => this._onEndCalls.push(span));\n\n        return getDeferred(() => {\n            const provider: ITraceProvider = {\n                api: this._mockApi,\n                createSpan: (name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan => {\n                    // Create a new distributed trace context for this span\n                    let newCtx: IDistributedTraceContext;\n                    let parentCtx: IDistributedTraceContext | undefined;\n\n                    if (options && options.root) {\n                        newCtx = createDistributedTraceContext();\n                    } else {\n                        newCtx = createDistributedTraceContext(parent || host.getTraceCtx());\n                        if (newCtx.parentCtx) {\n                            parentCtx = newCtx.parentCtx;\n                        }\n                    }\n\n                    // Always generate a new spanId\n                    newCtx.spanId = strSubstr(generateW3CId(), 0, 16);\n\n                    // Get configuration from the core if available\n                    let isRecording = options?.recording !== false;\n                    if (this._core && this._core.config && this._core.config.traceCfg && this._core.config.traceCfg.suppressTracing) {\n                        isRecording = false;\n                    }\n                    \n                    // Create the span context\n                    const spanCtx: IOTelSpanCtx = {\n                        api: this._mockApi,\n                        spanContext: newCtx,\n                        attributes: options?.attributes,\n                        startTime: options?.startTime,\n                        isRecording: isRecording,\n                        onEnd: actualOnEnd\n                    };\n\n                    if (parentCtx) {\n                        objDefine(spanCtx, \"parentSpanContext\", {\n                            v: parentCtx,\n                            w: false\n                        });\n                    }\n\n                    return createSpan(spanCtx, name, options?.kind || eOTelSpanKind.INTERNAL);\n                },\n                getProviderId: (): string => \"test-provider\",\n                isAvailable: (): boolean => true\n            };\n            \n            return provider;\n        });\n    }\n\n    /**\n     * Helper function to set up AppInsightsCore with trace provider\n     */\n    private _setupCore(config?: Partial<IConfiguration>): AppInsightsCore {\n        this._core = new AppInsightsCore();\n        \n        // Create a simple test channel\n        const testChannel = {\n            identifier: \"TestChannel\",\n            priority: 1001,\n            initialize: () => {},\n            processTelemetry: () => {},\n            teardown: () => {},\n            isInitialized: () => true\n        };\n        \n        const coreConfig: IConfiguration = {\n            instrumentationKey: \"test-ikey-12345\",\n            traceCfg: {\n                serviceName: \"test-service\"\n            },\n            ...config\n        };\n\n        // Initialize the core with the test channel\n        this._core.initialize(coreConfig, [testChannel]);\n\n        // Set up the trace provider\n        const traceProvider = this._createTestTraceProvider(this._core);\n        this._core.setTraceProvider(traceProvider);\n\n        return this._core;\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"createSpan: should create span with basic properties\",\n            test: () => {\n                // Arrange\n                const spanName = \"test-span\";\n                const spanKind = eOTelSpanKind.CLIENT;\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n\n                // Act\n                const span = createSpan(spanCtx, spanName, spanKind);\n\n                // Assert\n                Assert.ok(span, \"Span should be created\");\n                Assert.equal(span.name, spanName, \"Span name should match\");\n                Assert.equal(span.kind, spanKind, \"Span kind should match\");\n                Assert.equal(span.spanContext().traceId, this._mockSpanContext.traceId, \"Trace ID should match\");\n                Assert.equal(span.spanContext().spanId, this._mockSpanContext.spanId, \"Span ID should match\");\n                Assert.ok(span.isRecording(), \"Span should be recording by default\");\n                Assert.ok(!span.ended, \"Span should not be ended initially\");\n            }\n        });\n\n        this.testCase({\n            name: \"suppressTracing: span with suppressTracing config should not be recording\",\n            test: () => {\n                // Arrange - create mock API with suppressTracing enabled\n                const mockApiWithSuppression: IOTelApi = {\n                    cfg: {\n                        traceCfg: {\n                            suppressTracing: true\n                        } as ITraceCfg,\n                        errorHandlers: {}\n                    } as IOTelConfig\n                } as IOTelApi;\n\n                const spanCtx: IOTelSpanCtx = {\n                    api: mockApiWithSuppression,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n\n                // Act\n                const span = createSpan(spanCtx, \"suppressed-span\", eOTelSpanKind.CLIENT);\n\n                // Assert\n                Assert.ok(!span.isRecording(), \"Span should not be recording when suppressTracing is enabled\");\n                Assert.ok(span, \"Span should still be created\");\n                Assert.equal(span.name, \"suppressed-span\", \"Span name should be set correctly\");\n            }\n        });\n\n        this.testCase({\n            name: \"suppressTracing: suppressTracing() helper should set config and return context\",\n            test: () => {\n                // Arrange - create a context with traceCfg (following IConfiguration pattern)\n                const testContext = {\n                    traceCfg: {\n                        suppressTracing: false\n                    } as ITraceCfg\n                };\n\n                // Act\n                const returnedContext = suppressTracing(testContext);\n\n                // Assert\n                Assert.equal(returnedContext, testContext, \"suppressTracing should return the same context\");\n                Assert.ok(testContext.traceCfg.suppressTracing, \"suppressTracing config should be set to true\");\n                Assert.ok(isTracingSuppressed(testContext), \"isTracingSuppressed should return true\");\n            }\n        });\n\n        this.testCase({\n            name: \"suppressTracing: unsuppressTracing() helper should clear config and return context\",\n            test: () => {\n                // Arrange - create a context with suppressTracing enabled (following IConfiguration pattern)\n                const testContext = {\n                    traceCfg: {\n                        suppressTracing: true\n                    } as ITraceCfg\n                };\n\n                // Act\n                const returnedContext = unsuppressTracing(testContext);\n\n                // Assert\n                Assert.equal(returnedContext, testContext, \"unsuppressTracing should return the same context\");\n                Assert.ok(!testContext.traceCfg.suppressTracing, \"suppressTracing config should be set to false\");\n                Assert.ok(!isTracingSuppressed(testContext), \"isTracingSuppressed should return false\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should create span with options\",\n            test: () => {\n                // Arrange\n                const spanName = \"test-span-with-options\";\n                const spanKind = eOTelSpanKind.SERVER;\n                const attributes: IOTelAttributes = {\n                    \"service.name\": \"test-service\",\n                    \"http.method\": \"GET\",\n                    \"http.status_code\": 200\n                };\n\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n\n                // Act\n                const span = createSpan(spanCtx, spanName, spanKind);\n                \n                // Set attributes after creation\n                span.setAttributes(attributes);\n\n                // Assert\n                Assert.ok(span, \"Span should be created\");\n                Assert.equal(span.name, spanName, \"Span name should match\");\n                Assert.equal(span.kind, spanKind, \"Span kind should match\");\n                Assert.ok(span.isRecording(), \"Span should be recording\");\n                Assert.ok(!span.ended, \"Span should not be ended initially\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should end span and call onEnd callback\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n\n                // Act\n                span.end();\n\n                // Assert\n                Assert.ok(span.ended, \"Span should be marked as ended\");\n                Assert.equal(this._onEndCalls.length, 1, \"onEnd callback should be called once\");\n                Assert.equal(this._onEndCalls[0], span, \"onEnd should be called with the span\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should set and get attributes\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n\n                // Act\n                span.setAttribute(\"http.method\", \"POST\");\n                span.setAttribute(\"http.status_code\", 201);\n                span.setAttributes({\n                    \"service.name\": \"test-service\",\n                    \"user.authenticated\": true\n                });\n\n                // Assert - Note: The exact attribute retrieval method depends on implementation\n                // This test verifies that setAttribute and setAttributes don't throw errors\n                Assert.ok(span, \"Span should still be valid after setting attributes\");\n                Assert.ok(span.isRecording(), \"Span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should set span status\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n\n                // Act\n                span.setStatus({\n                    code: eOTelSpanStatusCode.ERROR,\n                    message: \"Something went wrong\"\n                });\n\n                // Assert\n                Assert.ok(span, \"Span should still be valid after setting status\");\n                Assert.ok(span.isRecording(), \"Span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should handle events (not yet implemented)\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n\n                // Act & Assert - Currently events are not supported, so this test just verifies span remains valid\n                // span.addEvent(\"request.started\"); // Not implemented yet\n                // span.addEvent(\"response.received\", { ... }); // Not implemented yet\n\n                Assert.ok(span, \"Span should still be valid\");\n                Assert.ok(span.isRecording(), \"Span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should record exception\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n                const testError = new Error(\"Test error\");\n\n                // Act\n                span.recordException(testError);\n                span.recordException({\n                    name: \"CustomError\",\n                    message: \"Custom error message\",\n                    stack: \"Error stack trace\"\n                });\n\n                // Assert\n                Assert.ok(span, \"Span should still be valid after recording exceptions\");\n                Assert.ok(span.isRecording(), \"Span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should update span name\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"original-name\", eOTelSpanKind.CLIENT);\n\n                // Act\n                span.updateName(\"updated-name\");\n\n                // Assert\n                Assert.equal(span.name, \"updated-name\", \"Span name should be updated\");\n                Assert.ok(span.isRecording(), \"Span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should handle multiple end calls gracefully\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n\n                // Act\n                span.end();\n                span.end(); // Second call should be ignored\n                span.end(); // Third call should be ignored\n\n                // Assert\n                Assert.ok(span.ended, \"Span should be marked as ended\");\n                Assert.equal(this._onEndCalls.length, 1, \"onEnd callback should be called only once\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should not record operations after span is ended\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n                span.end();\n\n                // Act & Assert - These operations should not throw but should be ignored\n                span.setAttribute(\"test.attr\", \"test-value\");\n                // span.addEvent(\"test.event\"); // Not implemented yet\n                span.setStatus({ code: eOTelSpanStatusCode.ERROR });\n                span.updateName(\"new-name\");\n                span.recordException(new Error(\"Test error\"));\n\n                // The span name should not change after ending\n                Assert.equal(span.name, \"test-span\", \"Span name should not change after ending\");\n                Assert.ok(span.ended, \"Span should remain ended\");\n                Assert.ok(!span.isRecording(), \"Span should not be recording after ending\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should handle invalid attribute values\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n\n                // Act & Assert - These should not throw errors\n                span.setAttribute(\"\", \"empty-key\");\n                span.setAttribute(\"null-value\", null as any);\n                span.setAttribute(\"undefined-value\", undefined as any);\n                span.setAttribute(\"object-value\", { nested: \"object\" } as any);\n                span.setAttribute(\"array-value\", [1, 2, 3] as any);\n\n                Assert.ok(span, \"Span should remain valid after setting invalid attributes\");\n                Assert.ok(span.isRecording(), \"Span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should work with different span kinds\",\n            test: () => {\n                // Test each span kind\n                const spanKinds = [\n                    eOTelSpanKind.INTERNAL,\n                    eOTelSpanKind.SERVER,\n                    eOTelSpanKind.CLIENT,\n                    eOTelSpanKind.PRODUCER,\n                    eOTelSpanKind.CONSUMER\n                ];\n\n                spanKinds.forEach((kind, index) => {\n                    // Arrange\n                    const spanCtx: IOTelSpanCtx = {\n                        api: this._mockApi,\n                        spanContext: this._mockSpanContext,\n                        onEnd: (span) => this._onEndCalls.push(span)\n                    };\n\n                    // Act\n                    const span = createSpan(spanCtx, `test-span-${index}`, kind);\n\n                    // Assert\n                    Assert.ok(span, `Span should be created for kind ${kind}`);\n                    Assert.equal(span.kind, kind, `Span kind should match ${kind}`);\n                    Assert.ok(span.isRecording(), `Span should be recording for kind ${kind}`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"createSpan: should handle span context correctly\",\n            test: () => {\n                // Arrange\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n\n                // Act\n                const span = createSpan(spanCtx, \"test-span\", eOTelSpanKind.CLIENT);\n                const spanContext = span.spanContext();\n\n                // Assert\n                Assert.ok(spanContext, \"Span context should be available\");\n                Assert.equal(spanContext.traceId, this._mockSpanContext.traceId, \"Trace ID should match\");\n                Assert.equal(spanContext.spanId, this._mockSpanContext.spanId, \"Span ID should match\");\n                Assert.equal(spanContext.traceFlags, this._mockSpanContext.traceFlags, \"Trace flags should match\");\n            }\n        });\n\n        // === AppInsightsCore Integration Tests ===\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should create span using core.startSpan with trace provider\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n\n                // Act\n                const span = core.startSpan(\"integration-test-span\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: {\n                        \"service.name\": \"test-service\",\n                        \"operation.type\": \"web-request\"\n                    }\n                });\n\n                // Assert\n                Assert.ok(span, \"Span should be created via core.startSpan\");\n                const readableSpan = span as IReadableSpan;\n                Assert.equal(readableSpan.name, \"integration-test-span\", \"Span name should match\");\n                Assert.equal(readableSpan.kind, eOTelSpanKind.SERVER, \"Span kind should match\");\n                Assert.ok(span?.isRecording(), \"Span should be recording\");\n                Assert.ok(!readableSpan.ended, \"Span should not be ended initially\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should call onEnd callback when span ends\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const span = core.startSpan(\"callback-test-span\");\n                Assert.equal(this._onEndCalls.length, 0, \"No onEnd calls initially\");\n\n                // Act\n                Assert.ok(span, \"Span should be created\");\n                span?.end();\n\n                // Assert\n                const readableSpan = span as IReadableSpan;\n                Assert.ok(readableSpan.ended, \"Span should be ended\");\n                Assert.equal(this._onEndCalls.length, 1, \"onEnd callback should be called once\");\n                Assert.equal(this._onEndCalls[0].name, \"callback-test-span\", \"onEnd should receive the correct span\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should inherit trace context from core\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                \n                // Set a specific trace context on the core\n                const parentTraceContext = createDistributedTraceContext({\n                    traceId: \"parent-trace-12345678901234567890123456789012\",\n                    spanId: \"parent-span-1234567890123456\",\n                    traceFlags: 1\n                });\n                core.setTraceCtx(parentTraceContext);\n\n                // Act\n                const span = core.startSpan(\"child-span\");\n\n                // Assert\n                Assert.ok(span, \"Child span should be created\");\n                const spanContext = span?.spanContext();\n                Assert.equal(spanContext?.traceId, parentTraceContext.traceId, \"Child span should inherit parent trace ID\");\n                Assert.notEqual(spanContext?.spanId, parentTraceContext.spanId, \"Child span should have different span ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should handle configuration with suppressTracing\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore({\n                    traceCfg: {\n                        suppressTracing: true,\n                        serviceName: \"suppressed-service\"\n                    }\n                });\n\n                // Act\n                const span = core.startSpan(\"suppressed-span\");\n\n                // Assert\n                Assert.ok(span, \"Span should still be created when suppressTracing is enabled\");\n                const readableSpan = span as IReadableSpan;\n                Assert.ok(!span?.isRecording(), \"Span should not be recording when suppressTracing is enabled\");\n                Assert.equal(readableSpan.name, \"suppressed-span\", \"Span name should be set correctly\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should support active span management\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n\n                // Act\n                const span = core.startSpan(\"active-span-test\");\n                Assert.ok(span, \"Span should be created\");\n                \n                // Debug: Check if trace provider exists\n                const traceProvider = core.getTraceProvider();\n                Assert.ok(traceProvider, \"Trace provider should exist\");\n                Assert.ok(traceProvider?.isAvailable(), \"Trace provider should be available\");\n                \n                // Debug: Check trace provider before setActiveSpan\n                const providerActiveSpanBefore = core.getActiveSpan();\n                Assert.equal(providerActiveSpanBefore, initialActiveSpan, \"Trace provider should return the initially active span before setActiveSpan\");\n                \n                // Manually set as active span (this would normally be done by startActiveSpan)\n                const scope = core.setActiveSpan(span);\n\n                // Assert scope object\n                Assert.ok(scope, \"Scope should be returned\");\n                Assert.equal(scope.span, span, \"Scope.span should equal the passed span\");\n\n                // Debug: Check trace provider directly after setActiveSpan\n                const providerActiveSpanAfter = core.getActiveSpan();\n                Assert.ok(providerActiveSpanAfter, \"Trace provider should have active span after setActiveSpan\");\n                Assert.equal(providerActiveSpanAfter, span, \"Trace provider active span should be the same instance\");\n\n                // Assert\n                const activeSpan = core.getActiveSpan();\n                Assert.ok(activeSpan, \"Active span should be available\");\n                if (activeSpan) {\n                    const readableActiveSpan = activeSpan as IReadableSpan;\n                    Assert.equal(readableActiveSpan.name, \"active-span-test\", \"Active span should be the correct span\");\n                    Assert.equal(activeSpan, span, \"Active span should be the same instance\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should create child spans with proper parent-child relationship\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                \n                // Act\n                const parentSpan = core.startSpan(\"parent-operation\", {\n                    kind: eOTelSpanKind.SERVER,\n                    attributes: { \"operation.name\": \"process-request\" }\n                });\n                Assert.ok(parentSpan, \"Parent span should be created\");\n                \n                // Set parent as active\n                const scope = core.setActiveSpan(parentSpan!);\n                const activeSpan = core.getActiveSpan();\n                \n                // Assert scope and activeSpan\n                Assert.ok(scope, \"Scope should be returned\");\n                Assert.equal(scope.span, parentSpan, \"Scope.span should equal the parent span\");\n                Assert.equal(activeSpan, parentSpan, \"GetGetGetGetGetGetGetGetGetActiveSpan() should return the parent span\");\n                \n                const childSpan = core.startSpan(\"child-operation\", {\n                    kind: eOTelSpanKind.CLIENT,\n                    attributes: { \"operation.name\": \"database-query\" }\n                });\n                Assert.ok(childSpan, \"Child span should be created\");\n\n                // Assert\n                const parentContext = parentSpan!.spanContext();\n                const childContext = childSpan!.spanContext();\n                \n                Assert.equal(childContext.traceId, parentContext.traceId, \"Child should have same trace ID as parent\");\n                Assert.notEqual(childContext.spanId, parentContext.spanId, \"Child should have different span ID from parent\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should handle span attributes and status correctly\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const span = core.startSpan(\"attribute-test-span\", {\n                    attributes: {\n                        \"initial.attribute\": \"initial-value\"\n                    }\n                });\n\n                // Act\n                Assert.ok(span, \"Span should be created\");\n                span!.setAttribute(\"http.method\", \"POST\");\n                span!.setAttribute(\"http.status_code\", 201);\n                span!.setAttributes({\n                    \"service.version\": \"1.2.3\",\n                    \"user.authenticated\": true\n                });\n                \n                span!.setStatus({\n                    code: eOTelSpanStatusCode.OK,\n                    message: \"Operation completed successfully\"\n                });\n\n                // Assert\n                const readableSpan = span! as IReadableSpan;\n                Assert.ok(span!.isRecording(), \"Span should still be recording\");\n                Assert.ok(!readableSpan.ended, \"Span should not be ended\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should handle span lifecycle properly\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const span = core.startSpan(\"lifecycle-test-span\");\n                Assert.equal(this._onEndCalls.length, 0, \"No onEnd calls initially\");\n\n                // Act - Perform operations during span lifetime\n                Assert.ok(span, \"Span should be created\");\n                span!.setAttribute(\"test.phase\", \"active\");\n                span!.recordException(new Error(\"Test exception for logging\"));\n                span!.updateName(\"lifecycle-test-span-updated\");\n                \n                // End the span\n                span!.end();\n\n                // Assert\n                const readableSpan = span! as IReadableSpan;\n                Assert.ok(readableSpan.ended, \"Span should be ended\");\n                Assert.equal(readableSpan.name, \"lifecycle-test-span-updated\", \"Span name should be updated\");\n                Assert.ok(!span!.isRecording(), \"Span should not be recording after ending\");\n                Assert.equal(this._onEndCalls.length, 1, \"onEnd callback should be called once\");\n                \n                // Verify operations after end are ignored\n                span!.setAttribute(\"test.phase\", \"completed\");\n                span!.updateName(\"should-not-change\");\n                Assert.equal(readableSpan.name, \"lifecycle-test-span-updated\", \"Span name should not change after ending\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should handle multiple spans and proper cleanup\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const spans: IReadableSpan[] = [];\n\n                // Act - Create multiple spans\n                for (let i = 0; i < 5; i++) {\n                    const span = core.startSpan(`batch-span-${i}`, {\n                        kind: eOTelSpanKind.INTERNAL,\n                        attributes: {\n                            \"span.index\": i,\n                            \"batch.id\": \"test-batch-123\"\n                        }\n                    });\n                    Assert.ok(span, `Span ${i} should be created`);\n                    spans.push(span!);\n                }\n\n                // End all spans\n                spans.forEach(span => span.end());\n\n                // Assert\n                Assert.equal(spans.length, 5, \"Should have created 5 spans\");\n                Assert.equal(this._onEndCalls.length, 5, \"Should have 5 onEnd callback calls\");\n                \n                spans.forEach((span, index) => {\n                    const readableSpan = span as IReadableSpan;\n                    Assert.ok(readableSpan.ended, `Span ${index} should be ended`);\n                    Assert.equal(readableSpan.name, `batch-span-${index}`, `Span ${index} should have correct name`);\n                });\n                \n                // Verify all spans in onEnd calls\n                this._onEndCalls.forEach((readableSpan, index) => {\n                    Assert.equal(readableSpan.name, `batch-span-${index}`, `onEnd span ${index} should have correct name`);\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should handle trace provider configuration changes\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const originalProvider = core.getTraceProvider();\n                Assert.ok(originalProvider, \"Original trace provider should be available\");\n\n                // Act - Create new trace provider with different onEnd behavior\n                let alternativeOnEndCalls: IReadableSpan[] = [];\n                const newProvider = this._createTestTraceProvider(core, (span) => {\n                    alternativeOnEndCalls.push(span);\n                });\n                \n                core.setTraceProvider(newProvider);\n                const updatedProvider = core.getTraceProvider();\n\n                // Create spans with new provider\n                const span1 = core.startSpan(\"provider-change-test-1\");\n                Assert.ok(span1, \"Span should be created with new provider\");\n                span1!.end();\n\n                // Assert\n                Assert.notEqual(updatedProvider, originalProvider, \"Trace provider should be updated\");\n                Assert.equal(this._onEndCalls.length, 0, \"Original onEnd callback should not be called\");\n                Assert.equal(alternativeOnEndCalls.length, 1, \"New onEnd callback should be called\");\n                Assert.equal(alternativeOnEndCalls[0].name, \"provider-change-test-1\", \"New callback should receive correct span\");\n            }\n        });\n\n        this.testCase({\n            name: \"AppInsightsCore Integration: should handle configuration inheritance from core config\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore({\n                    traceCfg: {\n                        serviceName: \"integration-test-service\",\n                        generalLimits: {\n                            attributeCountLimit: 64,\n                            attributeValueLengthLimit: 256\n                        // },\n                        // spanLimits: {\n                        //     attributeCountLimit: 32,\n                        //     eventCountLimit: 16,\n                        //     linkCountLimit: 8\n                        }\n                    }\n                });\n\n                // Act\n                const span = core.startSpan(\"config-inheritance-test\", {\n                    attributes: {\n                        \"service.name\": \"integration-test-service\", // Should inherit from traceCfg\n                        \"test.configured\": true\n                    }\n                });\n\n                // Assert\n                Assert.ok(span, \"Span should be created with inherited configuration\");\n                const readableSpan = span! as IReadableSpan;\n                Assert.ok(span!.isRecording(), \"Span should be recording\");\n                \n                // The span should exist and be functional - detailed config validation\n                // would require access to internal span configuration which is not exposed\n                Assert.equal(readableSpan.name, \"config-inheritance-test\", \"Span name should be correct\");\n            }\n        });\n\n        // === Tracer startActiveSpan Tests ===\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: should set span as active during callback execution\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const otelApi = createOTelApi({ host: core });\n                const tracer = otelApi.trace.getTracer(\"test-tracer\");\n                const initialActiveSpan = core.getActiveSpan();\n\n                let activeSpanInsideCallback: IReadableSpan | null | undefined = null;\n                let callbackExecuted = false;\n\n                // Act\n                const result = tracer.startActiveSpan(\"test-operation\", (span) => {\n                    callbackExecuted = true;\n                    \n                    // Check if the span is set as active in the host instance\n                    activeSpanInsideCallback = core.getActiveSpan();\n                    \n                    span.setAttribute(\"test.key\", \"test-value\");\n                    return \"callback-result\";\n                });\n\n                // Assert\n                Assert.ok(callbackExecuted, \"Callback should have been executed\");\n                Assert.equal(result, \"callback-result\", \"Should return callback result\");\n                Assert.ok(activeSpanInsideCallback, \"Active span should be set during callback\");\n                Assert.equal(activeSpanInsideCallback?.name, \"test-operation\", \"Active span should be the created span\");\n                \n                // Verify active span is restored after callback\n                const activeSpanAfterCallback = core.getActiveSpan();\n                Assert.equal(activeSpanAfterCallback, initialActiveSpan, \"Active span should be restored to initial state\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: should automatically end span after callback completes\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const otelApi = createOTelApi({ host: core });\n                const tracer = otelApi.trace.getTracer(\"test-tracer\");\n                \n                let spanInsideCallback: IReadableSpan | null = null;\n                const initialOnEndCount = this._onEndCalls.length;\n\n                // Act\n                tracer.startActiveSpan(\"auto-end-test\", (span) => {\n                    spanInsideCallback = span;\n                    Assert.ok(!span.ended, \"Span should not be ended during callback\");\n                    span.setAttribute(\"operation.type\", \"test\");\n                });\n\n                // Assert\n                Assert.ok(spanInsideCallback, \"Span should have been passed to callback\");\n                Assert.ok(spanInsideCallback!.ended, \"Span should be ended after callback completes\");\n                Assert.equal(this._onEndCalls.length, initialOnEndCount + 1, \"onEnd should have been called\");\n                Assert.equal(this._onEndCalls[this._onEndCalls.length - 1].name, \"auto-end-test\", \"onEnd should receive the correct span\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: should handle nested startActiveSpan calls\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const otelApi = createOTelApi({ host: core });\n                const tracer = otelApi.trace.getTracer(\"test-tracer\");\n                \n                const executionTrace: string[] = [];\n\n                // Act\n                const result = tracer.startActiveSpan(\"outer-operation\", (outerSpan) => {\n                    const outerActiveSpan = core.getActiveSpan();\n                    executionTrace.push(`outer-start: ${outerActiveSpan?.name}`);\n                    \n                    outerSpan.setAttribute(\"level\", \"outer\");\n                    \n                    // Nested startActiveSpan\n                    const innerResult = tracer.startActiveSpan(\"inner-operation\", (innerSpan) => {\n                        const innerActiveSpan = core.getActiveSpan();\n                        executionTrace.push(`inner: ${innerActiveSpan?.name}`);\n                        \n                        innerSpan.setAttribute(\"level\", \"inner\");\n                        \n                        // Verify the inner span is now active\n                        Assert.equal(innerActiveSpan?.name, \"inner-operation\", \"Inner span should be active during inner callback\");\n                        \n                        return \"inner-result\";\n                    });\n                    \n                    // After inner callback, outer should be active again\n                    const outerActiveSpanRestored = core.getActiveSpan();\n                    executionTrace.push(`outer-end: ${outerActiveSpanRestored?.name}`);\n                    \n                    Assert.equal(outerActiveSpanRestored?.name, \"outer-operation\", \"Outer span should be restored as active after inner callback\");\n                    \n                    return `outer(${innerResult})`;\n                });\n\n                // Assert\n                Assert.equal(result, \"outer(inner-result)\", \"Nested startActiveSpan should work correctly\");\n                Assert.equal(executionTrace.length, 3, \"Should have captured 3 execution points\");\n                Assert.equal(executionTrace[0], \"outer-start: outer-operation\", \"Outer callback should see outer span active\");\n                Assert.equal(executionTrace[1], \"inner: inner-operation\", \"Inner callback should see inner span active\");\n                Assert.equal(executionTrace[2], \"outer-end: outer-operation\", \"Outer callback should see outer span restored after inner\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: should handle async callback with active span management\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const otelApi = createOTelApi({ host: core });\n                const tracer = otelApi.trace.getTracer(\"test-tracer\");\n                const initialActiveSpan = core.getActiveSpan();\n                \n                let activeSpanDuringAsync: IReadableSpan | null | undefined = null;\n\n                // Act\n                return tracer.startActiveSpan(\"async-operation\", async (span) => {\n                    // Check active span at start\n                    activeSpanDuringAsync = core.getActiveSpan();\n                    Assert.equal(activeSpanDuringAsync?.name, \"async-operation\", \"Span should be active at start of async callback\");\n                    \n                    span.setAttribute(\"async.phase\", \"start\");\n                    \n                    // Simulate async operation\n                    await new Promise(resolve => setTimeout(resolve, 100));\n                    \n                    // Check active span after async operation\n                    const activeSpanAfterAwait = core.getActiveSpan();\n                    Assert.equal(activeSpanAfterAwait?.name, \"async-operation\", \"Span should still be active after await\");\n                    \n                    span.setAttribute(\"async.phase\", \"end\");\n                    \n                    return \"async-result\";\n                }).then(result => {\n                    // Assert\n                    Assert.equal(result, \"async-result\", \"Should return async callback result\");\n                    Assert.ok(activeSpanDuringAsync, \"Active span should have been set during callback\");\n                    \n                    // Verify active span is restored after async callback completes\n                    const activeSpanAfterCallback = core.getActiveSpan();\n                    Assert.equal(activeSpanAfterCallback, initialActiveSpan, \"Active span should be restored after async callback\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: should handle exceptions and still restore active span\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const otelApi = createOTelApi({ host: core });\n                const tracer = otelApi.trace.getTracer(\"test-tracer\");\n                const initialActiveSpan = core.getActiveSpan();\n                \n                let spanInsideCallback: IReadableSpan | null = null;\n                let exceptionThrown = false;\n\n                // Act\n                try {\n                    tracer.startActiveSpan(\"error-operation\", (span) => {\n                        spanInsideCallback = span;\n                        const activeSpan = core.getActiveSpan();\n                        Assert.equal(activeSpan?.name, \"error-operation\", \"Span should be active before exception\");\n                        \n                        throw new Error(\"Test exception\");\n                    });\n                } catch (error: any) {\n                    exceptionThrown = true;\n                    Assert.equal(error.message, \"Test exception\", \"Should propagate exception\");\n                }\n\n                // Assert\n                Assert.ok(exceptionThrown, \"Exception should have been thrown\");\n                Assert.ok(spanInsideCallback, \"Span should have been created\");\n                Assert.ok(spanInsideCallback!.ended, \"Span should be ended even after exception\");\n                \n                // Verify active span is restored even after exception\n                const activeSpanAfterException = core.getActiveSpan();\n                Assert.equal(activeSpanAfterException, initialActiveSpan, \"Active span should be restored even after exception\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: should work with options parameter\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const otelApi = createOTelApi({ host: core });\n                const tracer = otelApi.trace.getTracer(\"test-tracer\");\n                \n                let activeSpanInsideCallback: IReadableSpan | null | undefined = null;\n\n                // Act\n                const result = tracer.startActiveSpan(\"options-test\", \n                    {\n                        kind: eOTelSpanKind.SERVER,\n                        attributes: {\n                            \"http.method\": \"POST\",\n                            \"http.route\": \"/api/test\"\n                        }\n                    },\n                    (span) => {\n                        activeSpanInsideCallback = core.getActiveSpan();\n                        \n                        Assert.equal(span.kind, eOTelSpanKind.SERVER, \"Span kind should match options\");\n                        span.setAttribute(\"response.status\", 200);\n                        \n                        return \"options-result\";\n                    }\n                );\n\n                // Assert\n                Assert.equal(result, \"options-result\", \"Should return callback result\");\n                Assert.ok(activeSpanInsideCallback, \"Active span should be set during callback\");\n                Assert.equal(activeSpanInsideCallback?.name, \"options-test\", \"Active span should be the created span\");\n            }\n        });\n\n        this.testCase({\n            name: \"Tracer.startActiveSpan: child spans should inherit parent from active span\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const otelApi = createOTelApi({ host: core });\n                const tracer = otelApi.trace.getTracer(\"test-tracer\");\n                \n                let parentSpanId: string | undefined;\n                let childSpanParentId: string | undefined;\n\n                // Act\n                tracer.startActiveSpan(\"parent-operation\", (parentSpan) => {\n                    parentSpanId = parentSpan.spanContext().spanId;\n                    \n                    // Create a child span using startSpan (not startActiveSpan)\n                    // It should automatically use the active span (parent-operation) as parent\n                    const childSpan = core.startSpan(\"child-operation\");\n                    \n                    Assert.ok(childSpan, \"Child span should be created\");\n                    const childContext = childSpan!.spanContext();\n                    childSpanParentId = childSpan!.parentSpanId;\n                    \n                    // Verify parent-child relationship\n                    Assert.equal(childContext.traceId, parentSpan.spanContext().traceId, \"Child should have same trace ID as parent\");\n                    \n                    childSpan!.end();\n                });\n\n                // Assert\n                Assert.ok(parentSpanId, \"Parent span ID should be captured\");\n                Assert.equal(childSpanParentId, parentSpanId, \"Child span parent ID should match parent span ID\");\n            }\n        });\n\n        // === withSpan Helper Tests ===\n\n        this.testCase({\n            name: \"withSpan: should execute function with span as active span\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const testSpan = core.startSpan(\"withSpan-test-active\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                const testFunction = () => {\n                    capturedActiveSpan = core.getActiveSpan();\n                    return \"test-result\";\n                };\n\n                // Act\n                const result = withSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"test-result\", \"withSpan should return function result\");\n                Assert.ok(capturedActiveSpan, \"Function should have access to active span\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Active span should be the provided span\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"Active span should be restored after execution\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should restore previous active span after execution\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const previousSpan = core.startSpan(\"previous-span\");\n                const testSpan = core.startSpan(\"withSpan-test-restore\");\n                Assert.ok(previousSpan && testSpan, \"Both spans should be created\");\n                \n                // Set previous span as active\n                core.setActiveSpan(previousSpan!);\n                Assert.equal(core.getActiveSpan(), previousSpan, \"Previous span should be active initially\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                const testFunction = () => {\n                    capturedActiveSpan = core.getActiveSpan();\n                    return 42;\n                };\n\n                // Act\n                const result = withSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, 42, \"withSpan should return function result\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Function should have access to test span\");\n                Assert.equal(core.getActiveSpan(), previousSpan, \"Previous active span should be restored\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle function with arguments\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"withSpan-test-args\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let capturedArgs: any[] = [];\n                const testFunction = (...args: any[]) => {\n                    capturedArgs = args;\n                    return args.reduce((sum, val) => sum + val, 0);\n                };\n\n                // Act\n                const result = withSpan(core, testSpan!, testFunction, undefined, 10, 20, 30);\n\n                // Assert\n                Assert.equal(result, 60, \"withSpan should return correct sum\");\n                Assert.equal(capturedArgs.length, 3, \"Function should receive all arguments\");\n                Assert.equal(capturedArgs[0], 10, \"First argument should be correct\");\n                Assert.equal(capturedArgs[1], 20, \"Second argument should be correct\");\n                Assert.equal(capturedArgs[2], 30, \"Third argument should be correct\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle function with thisArg context\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"withSpan-test-this\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const contextObject = {\n                    value: 100,\n                    getValue: function(multiplier: number) {\n                        return this.value * multiplier;\n                    }\n                };\n                \n                // Act\n                const result = withSpan(core, testSpan!, contextObject.getValue, contextObject, 2);\n\n                // Assert\n                Assert.equal(result, 200, \"withSpan should execute with correct this context\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle exceptions and still restore active span\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const previousSpan = core.startSpan(\"previous-span-exception\");\n                const testSpan = core.startSpan(\"withSpan-test-exception\");\n                Assert.ok(previousSpan && testSpan, \"Both spans should be created\");\n                \n                core.setActiveSpan(previousSpan!);\n                \n                const testFunction = () => {\n                    throw new Error(\"Test exception\");\n                };\n\n                // Act & Assert\n                let thrownError: Error | null = null;\n                try {\n                    withSpan(core, testSpan!, testFunction);\n                } catch (error) {\n                    thrownError = error as Error;\n                }\n\n                Assert.ok(thrownError, \"Exception should be thrown\");\n                Assert.equal(thrownError!.message, \"Test exception\", \"Exception message should be preserved\");\n                Assert.equal(core.getActiveSpan(), previousSpan, \"Previous active span should be restored even after exception\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should work with functions returning different types\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"withSpan-test-types\");\n                Assert.ok(testSpan, \"Test span should be created\");\n\n                // Test string return\n                const stringResult = withSpan(core, testSpan!, () => \"hello world\");\n                Assert.equal(stringResult, \"hello world\", \"String return should work\");\n\n                // Test number return\n                const numberResult = withSpan(core, testSpan!, () => 123.45);\n                Assert.equal(numberResult, 123.45, \"Number return should work\");\n\n                // Test boolean return\n                const booleanResult = withSpan(core, testSpan!, () => true);\n                Assert.equal(booleanResult, true, \"Boolean return should work\");\n\n                // Test object return\n                const objectResult = withSpan(core, testSpan!, () => ({ key: \"value\" }));\n                Assert.ok(objectResult && objectResult.key === \"value\", \"Object return should work\");\n\n                // Test undefined return\n                const undefinedResult = withSpan(core, testSpan!, () => undefined);\n                Assert.equal(undefinedResult, undefined, \"Undefined return should work\");\n\n                // Test null return\n                const nullResult = withSpan(core, testSpan!, () => null);\n                Assert.equal(nullResult, null, \"Null return should work\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should work with async-like function patterns\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const testSpan = core.startSpan(\"withSpan-test-async-pattern\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let spanDuringExecution: IReadableSpan | null = null;\n                \n                // Simulate async-like pattern with callback\n                const asyncFunction = (callback: (result: string) => void) => {\n                    spanDuringExecution = core.getActiveSpan();\n                    // Simulate some async work completing synchronously for this test\n                    callback(\"async-result\");\n                    return \"function-result\";\n                };\n\n                let callbackResult = \"\";\n                const callback = (result: string) => {\n                    callbackResult = result;\n                };\n\n                // Act\n                const result = withSpan(core, testSpan!, asyncFunction, undefined, callback);\n\n                // Assert\n                Assert.equal(result, \"function-result\", \"withSpan should return main function result\");\n                Assert.equal(callbackResult, \"async-result\", \"Callback should be executed\");\n                Assert.equal(spanDuringExecution, testSpan, \"Active span should be available during execution\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"Active span should be restored after completion\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should work when no previous active span exists\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                const testSpan = core.startSpan(\"withSpan-test-no-previous\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"Just starting a span should not change active span\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                const testFunction = () => {\n                    capturedActiveSpan = core.getActiveSpan();\n                    return \"success\";\n                };\n\n                // Act\n                const result = withSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"success\", \"Function should execute successfully\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Test span should be active during execution\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"No active span should be restored\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should work with nested withSpan calls\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const outerSpan = core.startSpan(\"outer-span\");\n                const innerSpan = core.startSpan(\"inner-span\");\n                Assert.ok(outerSpan && innerSpan, \"Both spans should be created\");\n                \n                const executionTrace: string[] = [];\n                \n                const innerFunction = () => {\n                    const activeSpan = core.getActiveSpan();\n                    executionTrace.push(`inner: ${activeSpan ? (activeSpan as IReadableSpan).name : 'null'}`);\n                    return \"inner-result\";\n                };\n                \n                const outerFunction = () => {\n                    const activeSpanBefore = core.getActiveSpan();\n                    executionTrace.push(`outer-start: ${activeSpanBefore ? (activeSpanBefore as IReadableSpan).name : 'null'}`);\n                    \n                    const innerResult = withSpan(core, innerSpan!, innerFunction);\n                    \n                    const activeSpanAfter = core.getActiveSpan();\n                    executionTrace.push(`outer-end: ${activeSpanAfter ? (activeSpanAfter as IReadableSpan).name : 'null'}`);\n                    \n                    return `outer(${innerResult})`;\n                };\n\n                // Act\n                const result = withSpan(core, outerSpan!, outerFunction);\n\n                // Assert\n                Assert.equal(result, \"outer(inner-result)\", \"Nested withSpan should work correctly\");\n                Assert.equal(executionTrace.length, 3, \"Should have captured 3 execution points\");\n                Assert.equal(executionTrace[0], \"outer-start: outer-span\", \"Outer function should see outer span\");\n                Assert.equal(executionTrace[1], \"inner: inner-span\", \"Inner function should see inner span\");\n                Assert.equal(executionTrace[2], \"outer-end: outer-span\", \"Outer function should see outer span restored\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"No active span should remain after nested execution\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle span operations within withSpan context\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const testSpan = core.startSpan(\"withSpan-test-operations\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const testFunction = () => {\n                    const activeSpan = core.getActiveSpan();\n                    Assert.ok(activeSpan, \"Should have active span in function\");\n                    \n                    // Perform span operations\n                    activeSpan!.setAttribute(\"operation.name\", \"test-operation\");\n                    activeSpan!.setAttribute(\"operation.step\", 1);\n                    \n                    // Create child span\n                    const childSpan = core.startSpan(\"child-operation\");\n                    Assert.ok(childSpan, \"Child span should be created\");\n                    \n                    childSpan!.setAttribute(\"child.attribute\", \"child-value\");\n                    childSpan!.end();\n                    \n                    return \"operations-completed\";\n                };\n\n                // Act\n                const result = withSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"operations-completed\", \"Function should complete successfully\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"Active span should be restored\");\n                \n                // Verify span operations were applied (span should still be valid)\n                const readableSpan = testSpan! as IReadableSpan;\n                Assert.ok(!readableSpan.ended, \"Test span should not be ended\");\n                Assert.ok(testSpan!.isRecording(), \"Test span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should work with core that has no trace provider\",\n            test: () => {\n                // Arrange\n                const core = new AppInsightsCore();\n                \n                // Create a simple test channel\n                const testChannel = {\n                    identifier: \"TestChannel\",\n                    priority: 1001,\n                    initialize: () => {},\n                    processTelemetry: () => {},\n                    teardown: () => {},\n                    isInitialized: () => true\n                };\n                \n                core.initialize({ instrumentationKey: \"test-key\" }, [testChannel]); // Initialize with channel but no trace provider\n                \n                // Create a mock span (this would need to come from somewhere else since no provider)\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const mockSpan = createSpan(spanCtx, \"mock-span\", eOTelSpanKind.CLIENT);\n                \n                let functionExecuted = false;\n                const testFunction = () => {\n                    functionExecuted = true;\n                    return \"no-provider-result\";\n                };\n\n                // Act\n                const result = withSpan(core, mockSpan, testFunction);\n\n                // Assert\n                Assert.equal(result, \"no-provider-result\", \"Function should execute even without trace provider\");\n                Assert.ok(functionExecuted, \"Function should have been executed\");\n                \n                // Cleanup\n                core.unload(false);\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: performance test - should not add significant overhead\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"withSpan-performance-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const iterations = 10000;\n                let computeResult = 0;\n                \n                const computeFunction = (base: number, multiplier: number) => {\n                    // Simple computation to measure overhead\n                    return base * multiplier + Math.sqrt(base);\n                };\n\n                // Measure time without withSpan\n                const startWithout = perfNow();\n                for (let i = 0; i < iterations; i++) {\n                    computeResult += computeFunction(i, 2);\n                }\n                const timeWithout = perfNow() - startWithout;\n\n                // Reset result\n                computeResult = 0;\n\n                // Measure time with withSpan\n                const startWith = perfNow();\n                for (let i = 0; i < iterations; i++) {\n                    computeResult += withSpan(core, testSpan!, computeFunction, undefined, i, 2);\n                }\n                const timeWith = perfNow() - startWith;\n\n                // Assert reasonable performance characteristics\n                // withSpan should not add more than 10x overhead (very generous threshold)\n                const overhead = timeWith / (timeWithout || 1);\n                Assert.ok(overhead < 15, `withSpan overhead should be reasonable: ${overhead.toFixed(2)}x`);\n                \n                // Results should be the same\n                Assert.ok(computeResult > 0, \"Computations should have produced results\");\n            }\n        });\n        // === useSpan Helper Tests ===\n\n        this.testCase({\n            name: \"useSpan: should execute function with span as active span\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const testSpan = core.startSpan(\"useSpan-test-active\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                const testFunction = () => {\n                    capturedActiveSpan = core.getActiveSpan();\n                    return \"test-result\";\n                };\n\n                // Act\n                const result = useSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"test-result\", \"useSpan should return function result\");\n                Assert.ok(capturedActiveSpan, \"Function should have access to active span\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Active span should be the provided span\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"Active span should be restored after execution\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should restore previous active span after execution\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const previousSpan = core.startSpan(\"previous-span\");\n                const testSpan = core.startSpan(\"useSpan-test-restore\");\n                Assert.ok(previousSpan && testSpan, \"Both spans should be created\");\n                \n                // Set previous span as active\n                core.setActiveSpan(previousSpan!);\n                Assert.equal(core.getActiveSpan(), previousSpan, \"Previous span should be active initially\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                const testFunction = () => {\n                    capturedActiveSpan = core.getActiveSpan();\n                    return 42;\n                };\n\n                // Act\n                const result = useSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, 42, \"useSpan should return function result\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Function should have access to test span\");\n                Assert.equal(core.getActiveSpan(), previousSpan, \"Previous active span should be restored\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle function with arguments\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"useSpan-test-args\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let capturedArgs: any[] = [];\n                const testFunction = (scope: ISpanScope, ...args: any[]) => {\n                    capturedArgs = args;\n                    return args.reduce((sum, val) => sum + val, 0);\n                };\n\n                // Act\n                const result = useSpan(core, testSpan!, testFunction, undefined, 10, 20, 30);\n\n                // Assert\n                Assert.equal(result, 60, \"useSpan should return correct sum\");\n                Assert.equal(capturedArgs.length, 3, \"Function should receive all arguments\");\n                Assert.equal(capturedArgs[0], 10, \"First argument should be correct\");\n                Assert.equal(capturedArgs[1], 20, \"Second argument should be correct\");\n                Assert.equal(capturedArgs[2], 30, \"Third argument should be correct\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle function with thisArg context\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"useSpan-test-this\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const contextObject = {\n                    value: 100,\n                    getValue: function(scope: ISpanScope, multiplier: number) {\n                        return this.value * multiplier;\n                    }\n                };\n                \n                // Act\n                const result = useSpan(core, testSpan!, contextObject.getValue, contextObject, 2);\n\n                // Assert\n                Assert.equal(result, 200, \"useSpan should execute with correct this context\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle exceptions and still restore active span\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const previousSpan = core.startSpan(\"previous-span-exception\");\n                const testSpan = core.startSpan(\"useSpan-test-exception\");\n                Assert.ok(previousSpan && testSpan, \"Both spans should be created\");\n                \n                core.setActiveSpan(previousSpan!);\n                \n                const testFunction = () => {\n                    throw new Error(\"Test exception\");\n                };\n\n                // Act & Assert\n                let thrownError: Error | null = null;\n                try {\n                    useSpan(core, testSpan!, testFunction);\n                } catch (error) {\n                    thrownError = error as Error;\n                }\n\n                Assert.ok(thrownError, \"Exception should be thrown\");\n                Assert.equal(thrownError!.message, \"Test exception\", \"Exception message should be preserved\");\n                Assert.equal(core.getActiveSpan(), previousSpan, \"Previous active span should be restored even after exception\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should work with functions returning different types\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"useSpan-test-types\");\n                Assert.ok(testSpan, \"Test span should be created\");\n\n                // Test string return\n                const stringResult = useSpan(core, testSpan!, () => \"hello world\");\n                Assert.equal(stringResult, \"hello world\", \"String return should work\");\n\n                // Test number return\n                const numberResult = useSpan(core, testSpan!, () => 123.45);\n                Assert.equal(numberResult, 123.45, \"Number return should work\");\n\n                // Test boolean return\n                const booleanResult = useSpan(core, testSpan!, () => true);\n                Assert.equal(booleanResult, true, \"Boolean return should work\");\n\n                // Test object return\n                const objectResult = useSpan(core, testSpan!, () => ({ key: \"value\" }));\n                Assert.ok(objectResult && objectResult.key === \"value\", \"Object return should work\");\n\n                // Test undefined return\n                const undefinedResult = useSpan(core, testSpan!, () => undefined);\n                Assert.equal(undefinedResult, undefined, \"Undefined return should work\");\n\n                // Test null return\n                const nullResult = useSpan(core, testSpan!, () => null);\n                Assert.equal(nullResult, null, \"Null return should work\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should work with async-like function patterns\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const testSpan = core.startSpan(\"useSpan-test-async-pattern\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                let spanDuringExecution: IReadableSpan | null = null;\n                \n                // Simulate async-like pattern with callback\n                const asyncFunction = (scope: ISpanScope, callback: (result: string) => void) => {\n                    spanDuringExecution = scope.span;\n                    // Simulate some async work completing synchronously for this test\n                    callback(\"async-result\");\n                    return \"function-result\";\n                };\n\n                let callbackResult = \"\";\n                const callback = (result: string) => {\n                    callbackResult = result;\n                };\n\n                // Act\n                const result = useSpan(core, testSpan!, asyncFunction, undefined, callback);\n\n                // Assert\n                Assert.equal(result, \"function-result\", \"useSpan should return main function result\");\n                Assert.equal(callbackResult, \"async-result\", \"Callback should be executed\");\n                Assert.equal(spanDuringExecution, testSpan, \"Active span should be available during execution\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"Active span should be restored after completion\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should work when no previous active span exists\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                const testSpan = core.startSpan(\"useSpan-test-no-previous\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"With a traceprovider, activeSpan should not be null\");\n                \n                let capturedActiveSpan: IReadableSpan | null = null;\n                const testFunction = () => {\n                    capturedActiveSpan = core.getActiveSpan();\n                    return \"success\";\n                };\n\n                // Act\n                const result = useSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"success\", \"Function should execute successfully\");\n                Assert.equal(capturedActiveSpan, testSpan, \"Test span should be active during execution\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"No active span should be restored (was null)\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should work with nested useSpan calls\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const outerSpan = core.startSpan(\"outer-span\");\n                const innerSpan = core.startSpan(\"inner-span\");\n                Assert.ok(outerSpan && innerSpan, \"Both spans should be created\");\n                \n                const executionTrace: string[] = [];\n                \n                const innerFunction = (scope: ISpanScope) => {\n                    const activeSpan = scope.span;\n                    executionTrace.push(`inner: ${activeSpan ? (activeSpan as IReadableSpan).name : 'null'}`);\n                    return \"inner-result\";\n                };\n                \n                const outerFunction = (scope: ISpanScope) => {\n                    const activeSpanBefore = scope.span;\n                    executionTrace.push(`outer-start: ${activeSpanBefore ? (activeSpanBefore as IReadableSpan).name : 'null'}`);\n                    \n                    const innerResult = useSpan(core, innerSpan!, innerFunction);\n                    \n                    const activeSpanAfter = core.getActiveSpan();\n                    executionTrace.push(`outer-end: ${activeSpanAfter ? (activeSpanAfter as IReadableSpan).name : 'null'}`);\n                    \n                    return `outer(${innerResult})`;\n                };\n\n                // Act\n                const result = useSpan(core, outerSpan!, outerFunction);\n\n                // Assert\n                Assert.equal(result, \"outer(inner-result)\", \"Nested useSpan should work correctly\");\n                Assert.equal(executionTrace.length, 3, \"Should have captured 3 execution points\");\n                Assert.equal(executionTrace[0], \"outer-start: outer-span\", \"Outer function should see outer span\");\n                Assert.equal(executionTrace[1], \"inner: inner-span\", \"Inner function should see inner span\");\n                Assert.equal(executionTrace[2], \"outer-end: outer-span\", \"Outer function should see outer span restored\");\n                Assert.equal(core.getActiveSpan?.(), initialActiveSpan, \"The initial active span should be restored after nested execution\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle span operations within useSpan context\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                let initialActiveSpan = core.getActiveSpan();\n                Assert.ok(!isNullOrUndefined(initialActiveSpan), \"Initially, activeSpan should not be null with a trace provider\");\n                const testSpan = core.startSpan(\"useSpan-test-operations\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const testFunction = (scope: ISpanScope) => {\n                    const activeSpan = scope.span;\n                    Assert.ok(activeSpan, \"Should have active span in function\");\n                    \n                    // Perform span operations\n                    activeSpan.setAttribute(\"operation.name\", \"test-operation\");\n                    activeSpan.setAttribute(\"operation.step\", 1);\n                    \n                    // Create child span\n                    const childSpan = core.startSpan(\"child-operation\");\n                    Assert.ok(childSpan, \"Child span should be created\");\n                    \n                    childSpan?.setAttribute(\"child.attribute\", \"child-value\");\n                    childSpan?.end();\n                    \n                    return \"operations-completed\";\n                };\n\n                // Act\n                const result = useSpan(core, testSpan!, testFunction);\n\n                // Assert\n                Assert.equal(result, \"operations-completed\", \"Function should complete successfully\");\n                Assert.equal(core.getActiveSpan(), initialActiveSpan, \"Active span should be restored\");\n                \n                // Verify span operations were applied (span should still be valid)\n                const readableSpan = testSpan! as IReadableSpan;\n                Assert.ok(!readableSpan.ended, \"Test span should not be ended\");\n                Assert.ok(testSpan!.isRecording(), \"Test span should still be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should work with core that has no trace provider\",\n            test: () => {\n                // Arrange\n                const core = new AppInsightsCore();\n                \n                // Create a simple test channel\n                const testChannel = {\n                    identifier: \"TestChannel\",\n                    priority: 1001,\n                    initialize: () => {},\n                    processTelemetry: () => {},\n                    teardown: () => {},\n                    isInitialized: () => true\n                };\n                \n                core.initialize({ instrumentationKey: \"test-key\" }, [testChannel]); // Initialize with channel but no trace provider\n                \n                // Create a mock span (this would need to come from somewhere else since no provider)\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._mockApi,\n                    spanContext: this._mockSpanContext,\n                    onEnd: (span) => this._onEndCalls.push(span)\n                };\n                const mockSpan = createSpan(spanCtx, \"mock-span\", eOTelSpanKind.CLIENT);\n                \n                let functionExecuted = false;\n                const testFunction = () => {\n                    functionExecuted = true;\n                    return \"no-provider-result\";\n                };\n\n                // Act\n                const result = useSpan(core, mockSpan, testFunction);\n\n                // Assert\n                Assert.equal(result, \"no-provider-result\", \"Function should execute even without trace provider\");\n                Assert.ok(functionExecuted, \"Function should have been executed\");\n                \n                // Cleanup\n                core.unload(false);\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: performance test - should not add significant overhead\",\n            test: () => {\n                // Arrange\n                const core = this._setupCore();\n                const testSpan = core.startSpan(\"useSpan-performance-test\");\n                Assert.ok(testSpan, \"Test span should be created\");\n                \n                const iterations = 10000;\n                let computeResult = 0;\n                \n                const computeFunction = (_scope: ISpanScope, base: number, multiplier: number) => {\n                    // Simple computation to measure overhead\n                    return base * multiplier + Math.sqrt(base);\n                };\n\n                let maxOverhead: number = 100;\n\n                // Perform multiple runs to get a stable measurement\n                for (let lp = 0; lp < 10; lp++) {\n                    // Measure time without useSpan\n                    const startWithout = perfNow();\n                    for (let i = 0; i < iterations; i++) {\n                        computeResult += computeFunction(null as any as ISpanScope, i, 2);\n                    }\n                    const timeWithout = perfNow() - startWithout;\n\n                    // Reset result\n                    computeResult = 0;\n\n                    // Measure time with useSpan\n                    const startWith = perfNow();\n                    for (let i = 0; i < iterations; i++) {\n                        computeResult += useSpan(core, testSpan!, computeFunction, undefined, i, 2);\n                    }\n\n                    // Results should be the same\n                    Assert.ok(computeResult > 0, \"Computations should have produced results\");\n\n                    const timeWith = perfNow() - startWith;\n\n                    const overhead = timeWith / (timeWithout || 1);\n\n                    if (lp === 0) {\n                        maxOverhead = overhead;\n                    }\n                    maxOverhead = mathMin(maxOverhead, overhead);\n                }\n\n                // Assert reasonable performance characteristics\n                // useSpan should not add more than 10x overhead (very generous threshold)\n                Assert.ok(maxOverhead < 10, `useSpan overhead should be reasonable: ${maxOverhead.toFixed(2)}x`);\n                \n            }\n        });\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/trace/traceState.Tests.ts",
    "content": "import { Assert, AITestClass } from \"@microsoft/ai-test-framework\";\nimport { createOTelTraceState } from \"../../../../src/otel/api/trace/traceState\";\nimport { strRepeat } from \"@nevware21/ts-utils\";\n\nexport class OTelTraceApiTests extends AITestClass {\n\n    public testInitialize() {\n        super.testInitialize();\n    }\n\n    public testCleanup() {\n        super.testCleanup();\n    }\n\n    public registerTests() {\n\n        this.testCase({\n            name: \"TraceState: serialize\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle empty string\",\n            test: () => {\n                const traceState = createOTelTraceState(\"\");\n                Assert.equal(traceState.serialize(), \"\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle null\",\n            test: () => {\n                const traceState = createOTelTraceState(null as any);\n                Assert.equal(traceState.serialize(), \"\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle undefined\",\n            test: () => {\n                const traceState = createOTelTraceState(undefined);\n                Assert.equal(traceState.serialize(), \"\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle invalid input\",\n            test: () => {\n                const traceState = createOTelTraceState({} as any);\n                Assert.equal(traceState.serialize(), \"\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: new / updated keys are added to the front\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", \"4\");\n                Assert.equal(traceState.serialize(), \"d=4,a=1,b=2,c=3\");\n\n                traceState = traceState.set(\"a\", \"5\");\n                Assert.equal(traceState.serialize(), \"a=5,d=4,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: must create new instances for each state\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                let traceState2 = createOTelTraceState(traceState.serialize());\n                traceState2 = traceState2.set(\"d\", \"4\");\n\n                Assert.notEqual(traceState, traceState2);\n                Assert.notDeepEqual(traceState, traceState2);\n\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\", \"Actual: \" + traceState.serialize() + \" expected a=1,b=2,c=3\");\n                Assert.equal(traceState2.serialize(), \"d=4,a=1,b=2,c=3\", \"Actual: \" + traceState2.serialize() + \" expected d=4,a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: unset\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=4,b=5,c=6\");\n                traceState = traceState.unset(\"b\");\n                Assert.equal(traceState.serialize(), \"a=4,c=6\");\n\n                traceState = traceState.unset(\"a\");\n                Assert.equal(traceState.serialize(), \"c=6\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: get\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), \"2\");\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.get(\"d\"), undefined);\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with spaces\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1, b=2, c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with tabs\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1\\t,b=2\\t,c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with newlines\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1\\n,b=2\\n,c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with multiple commas\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1,,b=2,,c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with multiple equals\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a==1,b==2,c==3\");\n                Assert.equal(traceState.serialize(), \"\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with multiple spaces\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1  , b=2  , c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with multiple tabs\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1\\t\\t,b=2\\t\\t,c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with multiple newlines\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1\\n\\n,b=2\\n\\n,c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: serialize with multiple commas and spaces\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1, ,b=2, ,c=3\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle unsetting non-existent keys\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.unset(\"d\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting empty key\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"\", \"4\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting empty value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", \"\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting empty string value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", \" \");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting empty key and value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"\", \"\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting null key\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(null as any, \"4\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting null value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", null as any);\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting null string value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", \"null\");\n                Assert.equal(traceState.serialize(), \"d=null,a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting null key and value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(null as any, null as any);\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting undefined key\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(undefined as any, \"4\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n        this.testCase({\n            name: \"TraceState: handle setting undefined value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", undefined as any);\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting undefined key and value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(undefined as any, undefined as any);\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting invalid key\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set({} as any, \"4\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting invalid value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", {} as any);\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting invalid key and value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set({} as any, {} as any);\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting invalid key and valid value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set({} as any, \"4\");\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle setting valid key and invalid value\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", {} as any);\n                Assert.equal(traceState.serialize(), \"a=1,b=2,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle dropping states when the max number of members limit is reached\",\n            test: () => {\n                let traceState = createOTelTraceState(\"a=1,b=2,c=3\");\n                traceState = traceState.set(\"d\", \"4\");\n                traceState = traceState.set(\"e\", \"5\");\n                traceState = traceState.set(\"f\", \"6\");\n                traceState = traceState.set(\"g\", \"7\");\n                traceState = traceState.set(\"h\", \"8\");\n                traceState = traceState.set(\"i\", \"9\");\n                traceState = traceState.set(\"j\", \"10\");\n                traceState = traceState.set(\"k\", \"11\");\n                traceState = traceState.set(\"l\", \"12\");\n                traceState = traceState.set(\"m\", \"13\");\n                traceState = traceState.set(\"n\", \"14\");\n                traceState = traceState.set(\"o\", \"15\");\n                traceState = traceState.set(\"p\", \"16\");\n                traceState = traceState.set(\"q\", \"17\");\n                traceState = traceState.set(\"r\", \"18\");\n                traceState = traceState.set(\"s\", \"19\");\n                traceState = traceState.set(\"t\", \"20\");\n                traceState = traceState.set(\"u\", \"21\");\n                traceState = traceState.set(\"v\", \"22\");\n                traceState = traceState.set(\"w\", \"23\");\n                traceState = traceState.set(\"x\", \"24\");\n                traceState = traceState.set(\"y\", \"25\");\n                traceState = traceState.set(\"z\", \"26\");\n                traceState = traceState.set(\"aa\", \"27\");\n                traceState = traceState.set(\"ab\", \"28\");\n                traceState = traceState.set(\"ac\", \"29\");\n                traceState = traceState.set(\"ad\", \"30\");\n                traceState = traceState.set(\"ae\", \"31\");\n                traceState = traceState.set(\"af\", \"32\");\n                Assert.equal(traceState.serialize(), \"af=32,ae=31,ad=30,ac=29,ab=28,aa=27,z=26,y=25,x=24,w=23,v=22,u=21,t=20,s=19,r=18,q=17,p=16,o=15,n=14,m=13,l=12,k=11,j=10,i=9,h=8,g=7,f=6,e=5,d=4,a=1,b=2,c=3\");\n                traceState = traceState.set(\"ag\", \"33\");\n                Assert.equal(traceState.serialize(), \"ag=33,af=32,ae=31,ad=30,ac=29,ab=28,aa=27,z=26,y=25,x=24,w=23,v=22,u=21,t=20,s=19,r=18,q=17,p=16,o=15,n=14,m=13,l=12,k=11,j=10,i=9,h=8,g=7,f=6,e=5,d=4,a=1,b=2\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: drop states when the items are too long\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=\" + strRepeat(\"b\", 512));\n                Assert.equal(traceState.get(\"a\"), undefined);\n                Assert.equal(traceState.serialize(), \"\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: drop items that are invalid\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1,b,c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.serialize(), \"a=1,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: drop items that are invalid with spaces\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1, b, c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.serialize(), \"a=1,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: drop items that are invalid with tabs\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1\\t,b\\t,c=3\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.serialize(), \"a=1,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: drop items that have a single value with an '=' sign\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1,b=2=,c=3,d=\");\n                Assert.equal(traceState.get(\"a\"), \"1\");\n                Assert.equal(traceState.get(\"b\"), undefined);\n                Assert.equal(traceState.get(\"c\"), \"3\");\n                Assert.equal(traceState.get(\"d\"), undefined);\n                Assert.equal(traceState.serialize(), \"a=1,c=3\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: must handle valid state key ranges\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a-b=1,c/d=2,e_f=3,g*h=4\");\n                Assert.equal(traceState.get(\"a-b\"), \"1\");\n                Assert.equal(traceState.get(\"c/d\"), \"2\");\n                Assert.equal(traceState.get(\"e_f\"), \"3\");\n                Assert.equal(traceState.get(\"g*h\"), \"4\");\n                Assert.equal(traceState.serialize(), \"a-b=1,c/d=2,e_f=3,g*h=4\");\n            }\n        });\n\n        this.testCase({\n            name: \"TraceState: handle values with embedded spaces\",\n            test: () => {\n                const traceState = createOTelTraceState(\"a=1 b,c=2 d,e=3 f\");\n                Assert.equal(traceState.get(\"a\"), \"1 b\");\n                Assert.equal(traceState.get(\"c\"), \"2 d\");\n                Assert.equal(traceState.get(\"e\"), \"3 f\");\n                Assert.equal(traceState.serialize(), \"a=1 b,c=2 d,e=3 f\");\n            }\n        });\n\n   }\n}"
  },
  {
    "path": "shared/AppInsightsCore/Tests/Unit/src/trace/traceUtils.Tests.ts",
    "content": "import { AITestClass, Assert } from \"@microsoft/ai-test-framework\";\nimport { isSpanContextValid, wrapSpanContext, createNonRecordingSpan, isReadableSpan, useSpan, withSpan } from \"../../../../src/otel/api/trace/utils\";\nimport { createTraceProvider } from \"../../../../src/otel/api/trace/traceProvider\";\nimport { IDistributedTraceContext } from \"../../../../src/interfaces/ai/IDistributedTraceContext\";\nimport { createPromise, createRejectedPromise, doAwait } from \"@nevware21/ts-async\";\nimport { createCachedValue, isNullOrUndefined } from \"@nevware21/ts-utils\";\nimport { IOTelApi } from \"../../../../src/interfaces/otel/IOTelApi\";\nimport { createOTelApi } from \"../../../../src/otel/api/OTelApi\";\nimport { eOTelSpanKind } from \"../../../../src/enums/otel/OTelSpanKind\";\nimport { IOTelSpanCtx } from \"../../../../src/interfaces/otel/trace/IOTelSpanCtx\";\nimport { createSpan } from \"../../../../src/otel/api/trace/span\";\nimport { createW3cTraceState } from \"../../../../src/telemetry/W3cTraceState\";\nimport { createDistributedTraceContext } from \"../../../../src/core/TelemetryHelpers\";\nimport { IAppInsightsCore } from \"../../../../src/interfaces/ai/IAppInsightsCore\";\nimport { AppInsightsCore } from \"../../../../src/index\";\nimport { IChannelControls } from \"../../../../src/interfaces/ai/IChannelControls\";\n\nfunction _createDistributedContext(traceId: string, spanId: string, traceFlags: number, traceState?: string): IDistributedTraceContext {\n    const theContext: IDistributedTraceContext = {\n        traceId: traceId,\n        spanId: spanId,\n        traceFlags: traceFlags,\n        getName: function (): string {\n            throw new Error(\"Function not implemented.\");\n        },\n        setName: function (pageName: string): void {\n            throw new Error(\"Function not implemented.\");\n        },\n        getTraceId: function (): string {\n            throw new Error(\"Function not implemented.\");\n        },\n        setTraceId: function (newValue: string): void {\n            throw new Error(\"Function not implemented.\");\n        },\n        getSpanId: function (): string {\n            throw new Error(\"Function not implemented.\");\n        },\n        setSpanId: function (newValue: string): void {\n            throw new Error(\"Function not implemented.\");\n        },\n        getTraceFlags: function (): number | undefined {\n            throw new Error(\"Function not implemented.\");\n        },\n        setTraceFlags: function (newValue?: number): void {\n            throw new Error(\"Function not implemented.\");\n        },\n        pageName: \"\",\n        isRemote: false,\n        traceState: traceState ? createW3cTraceState(traceState) : createW3cTraceState()\n    };\n\n    return theContext;\n}\n\nexport class TraceUtilsTests extends AITestClass {\n    private _core: IAppInsightsCore = null as any;\n    private _otelApi!: IOTelApi;\n    private _validSpanContext!: IDistributedTraceContext;\n\n    public testInitialize() {\n        // Create a minimal mock channel to satisfy core initialization requirements\n        const mockChannel: IChannelControls = {\n            pause: () => {},\n            resume: () => {},\n            flush: () => {},\n            teardown: () => {},\n            processTelemetry: () => {},\n            initialize: () => {},\n            identifier: \"mockChannel\",\n            priority: 1001\n        } as any;\n\n        this._core = new AppInsightsCore();\n        this._core.initialize({\n            instrumentationKey: \"00000000-0000-0000-0000-000000000000\",\n            disableInstrumentationKeyValidation: true,\n            traceCfg: {},\n            errorHandlers: {\n                attribError: (message: string, key: string, value: any) => {\n                    console.error(message);\n                },\n                spanError: (message: string, spanName: string) => {\n                    console.error(message);\n                },\n                debug: (message: string) => {\n                    console.error(message);\n                },\n                warn: (message: string) => {\n                    console.error(message);\n                },\n                error: (message: string) => {\n                    console.error(message);\n                },\n                notImplemented: (message: string) => {\n                    console.error(message);\n                }\n            }\n        }, [mockChannel]);\n\n        this._otelApi = createOTelApi({ host: this._core });\n\n        // Set up a simple trace provider for the core\n        this._setupTraceProvider();\n\n        // Valid span context with proper IDs\n        this._validSpanContext = _createDistributedContext(\"12345678901234567890123456789012\", \"1234567890123456\", 1);\n    }\n\n    private _setupTraceProvider(): void {\n        // Using an cached value to wrap the provider, so it is created immediately\n        const provider = createCachedValue(createTraceProvider(\n            this._core,\n            \"test-provider\",\n            this._otelApi\n        ));\n\n        this._core.setTraceProvider(provider);\n    }\n\n    public testCleanup() {\n        if (this._core) {\n            this._core.unload(false);\n            this._core = null as any;\n        }\n        this._otelApi = null as any;\n        this._validSpanContext = null as any;\n    }\n\n    public registerTests() {\n        this.addIsSpanContextValidTests();\n        this.addWrapSpanContextTests();\n        this.addCreateNonRecordingSpanTests();\n        this.addIsReadableSpanTests();\n        this.addWithSpanTests();\n        this.addUseSpanTests();\n    }\n\n    private addIsSpanContextValidTests(): void {\n        this.testCase({\n            name: \"isSpanContextValid: should return true for valid span context\",\n            test: () => {\n                // Act\n                const result = isSpanContextValid(this._validSpanContext);\n\n                // Assert\n                Assert.ok(result, \"Should return true for valid span context\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for invalid trace ID\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"invalid-trace-id\", \"1234567890123456\", 1);\n\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for invalid trace ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for invalid span ID\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"12345678901234567890123456789012\", \"bad\", 1);\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for invalid span ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for null context\",\n            test: () => {\n                // Act\n                const result = isSpanContextValid(null as any);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for null context\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for undefined context\",\n            test: () => {\n                // Act\n                const result = isSpanContextValid(undefined as any);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for undefined context\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for empty trace ID\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"\", \"1234567890123456\", 1);\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for empty trace ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for empty span ID\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"12345678901234567890123456789012\", \"\", 1);\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for empty span ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for all-zero trace ID\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"00000000000000000000000000000000\", \"1234567890123456\", 1);\n\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for all-zero trace ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for all-zero span ID\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"12345678901234567890123456789012\", \"0000000000000000\", 1);\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for all-zero span ID\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for trace ID with wrong length\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"123456789012\", \"1234567890123456\", 1);\n\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for trace ID with wrong length\");\n            }\n        });\n\n        this.testCase({\n            name: \"isSpanContextValid: should return false for span ID with wrong length\",\n            test: () => {\n                // Arrange\n                const invalidContext: IDistributedTraceContext = _createDistributedContext(\"12345678901234567890123456789012\", \"1234\", 1);\n                // Act\n                const result = isSpanContextValid(invalidContext);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for span ID with wrong length\");\n            }\n        });\n    }\n\n    private addWrapSpanContextTests(): void {\n        this.testCase({\n            name: \"wrapSpanContext: should create non-recording span from valid context\",\n            test: () => {\n                // Act\n                const wrappedSpan = wrapSpanContext(this._otelApi, this._validSpanContext);\n\n                // Assert\n                Assert.ok(wrappedSpan, \"Should create a span\");\n                Assert.ok(!wrappedSpan.isRecording(), \"Wrapped span should not be recording\");\n                Assert.equal(wrappedSpan.spanContext().traceId, this._validSpanContext.traceId, \"Trace ID should match\");\n                Assert.equal(wrappedSpan.spanContext().spanId, this._validSpanContext.spanId, \"Span ID should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: should include span ID in wrapped span name\",\n            test: () => {\n                // Act\n                const wrappedSpan = wrapSpanContext(this._otelApi, this._validSpanContext);\n\n                // Assert\n                Assert.ok(wrappedSpan.name.includes(this._validSpanContext.spanId),\n                    \"Span name should include original span ID\");\n                Assert.ok(wrappedSpan.name.includes(\"wrapped\"),\n                    \"Span name should indicate it's a wrapped span\");\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: should preserve trace flags\",\n            test: () => {\n                // Arrange\n                const contextWithFlags: IDistributedTraceContext = _createDistributedContext(\"12345678901234567890123456789012\", \"1234567890123456\", 1);\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._otelApi, contextWithFlags);\n\n                // Assert\n                Assert.equal(wrappedSpan.spanContext().traceFlags, contextWithFlags.traceFlags,\n                    \"Trace flags should be preserved\");\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: should handle context with tracestate\",\n            test: () => {\n                // Arrange\n                let contextWithState: IDistributedTraceContext = createDistributedTraceContext();\n                contextWithState.traceId = \"12345678901234567890123456789012\";\n                contextWithState.spanId = \"1234567890123456\";\n                contextWithState.traceFlags = 1;\n                contextWithState.traceState.set(\"vendor\", \"value\");\n\n                // Act\n                const wrappedSpan = wrapSpanContext(this._otelApi, contextWithState);\n\n                // Assert\n                Assert.ok(wrappedSpan, \"Should create span with tracestate\");\n                Assert.equal(wrappedSpan.spanContext().traceState, contextWithState.traceState,\n                    \"Trace state should be preserved if present\");\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: wrapped span should not be ended\",\n            test: () => {\n                // Act\n                const wrappedSpan = wrapSpanContext(this._otelApi, this._validSpanContext);\n\n                // Assert\n                Assert.ok(!wrappedSpan.ended, \"Wrapped span should not be ended initially\");\n            }\n        });\n\n        this.testCase({\n            name: \"wrapSpanContext: wrapped span should be internal kind\",\n            test: () => {\n                // Act\n                const wrappedSpan = wrapSpanContext(this._otelApi, this._validSpanContext);\n\n                // Assert\n                Assert.equal(wrappedSpan.kind, eOTelSpanKind.INTERNAL,\n                    \"Wrapped span should have INTERNAL kind\");\n            }\n        });\n    }\n\n    private addCreateNonRecordingSpanTests(): void {\n        this.testCase({\n            name: \"createNonRecordingSpan: should create non-recording span\",\n            test: () => {\n                // Arrange\n                const spanName = \"test-non-recording\";\n\n                // Act\n                const span = createNonRecordingSpan(this._otelApi, spanName, this._validSpanContext);\n\n                // Assert\n                Assert.ok(span, \"Should create a span\");\n                Assert.ok(!span.isRecording(), \"Span should not be recording\");\n                Assert.equal(span.name, spanName, \"Span name should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"createNonRecordingSpan: should use provided span context\",\n            test: () => {\n                // Arrange\n                const spanName = \"context-test\";\n\n                // Act\n                const span = createNonRecordingSpan(this._otelApi, spanName, this._validSpanContext);\n\n                // Assert\n                Assert.equal(span.spanContext().traceId, this._validSpanContext.traceId,\n                    \"Trace ID should match provided context\");\n                Assert.equal(span.spanContext().spanId, this._validSpanContext.spanId,\n                    \"Span ID should match provided context\");\n                Assert.equal(span.spanContext().traceFlags, this._validSpanContext.traceFlags,\n                    \"Trace flags should match provided context\");\n            }\n        });\n\n        this.testCase({\n            name: \"createNonRecordingSpan: should create span with INTERNAL kind\",\n            test: () => {\n                // Act\n                const span = createNonRecordingSpan(this._otelApi, \"test\", this._validSpanContext);\n\n                // Assert\n                Assert.equal(span.kind, eOTelSpanKind.INTERNAL,\n                    \"Non-recording span should have INTERNAL kind\");\n            }\n        });\n\n        this.testCase({\n            name: \"createRecordingSpan: recording span with onEnd should still trigger callback\",\n            test: () => {\n                // Arrange\n                let onEndCalled = false;\n\n                // Create a non-recording span directly with createSpan to test onEnd callback behavior\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._otelApi,\n                    spanContext: this._validSpanContext,\n                    onEnd: () => {\n                        onEndCalled = true;\n                    }\n                };\n\n                // Act - Create span directly with our custom context that includes onEnd callback\n                const span = createSpan(spanCtx, \"test-recording-with-callback\", eOTelSpanKind.INTERNAL);\n                Assert.ok(span.isRecording(), \"Span should be recording\");\n                span.end();\n\n                // Assert\n                // onEnd callbacks are called regardless of recording state when the callback is provided\n                Assert.ok(onEndCalled, \"onEnd callback should be called even for non-recording spans when callback is registered\");\n            }\n        });\n\n        this.testCase({\n            name: \"createNonRecordingSpan: non-recording span with onEnd should still trigger callback\",\n            test: () => {\n                // Arrange\n                let onEndCalled = false;\n\n                // Create a non-recording span directly with createSpan to test onEnd callback behavior\n                const spanCtx: IOTelSpanCtx = {\n                    api: this._otelApi,\n                    spanContext: this._validSpanContext,\n                    isRecording: false,  // Non-recording span\n                    onEnd: () => {\n                        onEndCalled = true;\n                    }\n                };\n\n                // Act - Create span directly with our custom context that includes onEnd callback\n                const span = createSpan(spanCtx, \"test-non-recording-with-callback\", eOTelSpanKind.INTERNAL);\n                Assert.ok(!span.isRecording(), \"Span should not be recording\");\n                span.end();\n\n                // Assert\n                // onEnd callbacks are called regardless of recording state when the callback is provided\n                // Allows for post-end processing even for non-recording spans, including tracking the number of non-recording spans ended\n                Assert.ok(onEndCalled, \"onEnd callback should be called even for non-recording spans when callback is registered\");\n            }\n        });\n\n        this.testCase({\n            name: \"createNonRecordingSpan: utility function creates span without onEnd callback\",\n            test: () => {\n                // Arrange & Act\n                // createNonRecordingSpan is a utility that doesn't accept an onEnd callback parameter\n                const span = createNonRecordingSpan(this._otelApi, \"test-non-recording\", this._validSpanContext);\n\n                // Assert\n                Assert.ok(!span.isRecording(), \"Span should not be recording\");\n                // This just verifies the utility function works as expected - no onEnd callback to test\n\n                span.end();\n\n                // Validate that calling after end does not cause issues\n                Assert.ok(!span.isRecording(), \"Span should not be recording\");\n            }\n        });\n\n        this.testCase({\n            name: \"createNonRecordingSpan: should accept custom span names\",\n            test: () => {\n                // Arrange\n                const customNames = [\n                    \"operation-1\",\n                    \"http-request\",\n                    \"database-query\",\n                    \"cache-lookup\",\n                    \"\"\n                ];\n\n                // Act & Assert\n                customNames.forEach(name => {\n                    const span = createNonRecordingSpan(this._otelApi, name, this._validSpanContext);\n                    Assert.equal(span.name, name, `Span name should be '${name}'`);\n                    Assert.ok(!span.isRecording(), \"All non-recording spans should not be recording\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"createNonRecordingSpan: should preserve tracestate from context\",\n            test: () => {\n                // Arrange\n                const contextWithState: IDistributedTraceContext = _createDistributedContext(\"12345678901234567890123456789012\", \"1234567890123456\", 1, \"vendor1=value1,vendor2=value2\");\n\n                // Act\n                const span = createNonRecordingSpan(this._otelApi, \"test\", contextWithState);\n\n                // Assert\n                Assert.equal(span.spanContext().traceState, contextWithState.traceState,\n                    \"Trace state should be preserved\");\n            }\n        });\n    }\n\n    private addIsReadableSpanTests(): void {\n        this.testCase({\n            name: \"isReadableSpan: should return true for valid span\",\n            test: () => {\n                // Arrange - create a real span\n                const span = createNonRecordingSpan(this._otelApi, \"test\", this._validSpanContext);\n\n                // Act\n                const result = isReadableSpan(span);\n\n                // Assert\n                Assert.ok(result, \"Should return true for a valid readable span\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for null\",\n            test: () => {\n                // Act\n                const result = isReadableSpan(null);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for null\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for undefined\",\n            test: () => {\n                // Act\n                const result = isReadableSpan(undefined);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for undefined\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for empty object\",\n            test: () => {\n                // Act\n                const result = isReadableSpan({});\n\n                // Assert\n                Assert.ok(!result, \"Should return false for empty object\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for object with only some properties\",\n            test: () => {\n                // Arrange\n                const partialSpan = {\n                    name: \"test\",\n                    kind: eOTelSpanKind.CLIENT\n                };\n\n                // Act\n                const result = isReadableSpan(partialSpan);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for object missing required properties\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for object missing spanContext method\",\n            test: () => {\n                // Arrange\n                const invalidSpan = {\n                    name: \"test\",\n                    kind: eOTelSpanKind.CLIENT,\n                    duration: [0, 0],\n                    ended: false,\n                    startTime: [0, 0],\n                    endTime: [0, 0],\n                    attributes: {},\n                    links: [],\n                    events: [],\n                    status: { code: 0 },\n                    resource: {},\n                    instrumentationScope: {},\n                    droppedAttributesCount: 0,\n                    isRecording: () => false,\n                    setStatus: () => {},\n                    updateName: () => {},\n                    setAttribute: () => {},\n                    setAttributes: () => {},\n                    end: () => {},\n                    recordException: () => {}\n                    // Missing spanContext method\n                };\n\n                // Act\n                const result = isReadableSpan(invalidSpan);\n\n                // Assert\n                Assert.ok(!result, \"Should return false when spanContext method is missing\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for object with non-function methods\",\n            test: () => {\n                // Arrange\n                const invalidSpan = {\n                    name: \"test\",\n                    kind: eOTelSpanKind.CLIENT,\n                    spanContext: \"not a function\",\n                    duration: [0, 0],\n                    ended: false,\n                    startTime: [0, 0],\n                    endTime: [0, 0],\n                    attributes: {},\n                    links: [],\n                    events: [],\n                    status: { code: 0 },\n                    resource: {},\n                    instrumentationScope: {},\n                    droppedAttributesCount: 0,\n                    isRecording: () => false,\n                    setStatus: () => {},\n                    updateName: () => {},\n                    setAttribute: () => {},\n                    setAttributes: () => {},\n                    end: () => {},\n                    recordException: () => {}\n                };\n\n                // Act\n                const result = isReadableSpan(invalidSpan);\n\n                // Assert\n                Assert.ok(!result, \"Should return false when required methods are not functions\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for primitive values\",\n            test: () => {\n                // Act & Assert\n                Assert.ok(!isReadableSpan(\"string\"), \"Should return false for string\");\n                Assert.ok(!isReadableSpan(123), \"Should return false for number\");\n                Assert.ok(!isReadableSpan(true), \"Should return false for boolean\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should return false for array\",\n            test: () => {\n                // Act\n                const result = isReadableSpan([]);\n\n                // Assert\n                Assert.ok(!result, \"Should return false for array\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should validate all required properties exist\",\n            test: () => {\n                // Arrange - create a valid span to ensure our check is comprehensive\n                const span = createNonRecordingSpan(this._otelApi, \"validation-test\", this._validSpanContext);\n\n                // Act - verify the span has all required properties\n                const hasName = \"name\" in span;\n                const hasKind = \"kind\" in span;\n                const hasSpanContext = typeof span.spanContext === \"function\";\n                const hasDuration = \"duration\" in span;\n                const hasEnded = \"ended\" in span;\n                const hasStartTime = \"startTime\" in span;\n                const hasEndTime = \"endTime\" in span;\n                const hasAttributes = \"attributes\" in span;\n                const hasLinks = \"links\" in span;\n                const hasEvents = \"events\" in span;\n                const hasStatus = \"status\" in span;\n                // const hasResource = \"resource\" in span;\n                // const hasInstrumentationScope = \"instrumentationScope\" in span;\n                const hasDroppedAttributesCount = \"droppedAttributesCount\" in span;\n                const hasIsRecording = typeof span.isRecording === \"function\";\n                const hasSetStatus = typeof span.setStatus === \"function\";\n                const hasUpdateName = typeof span.updateName === \"function\";\n                const hasSetAttribute = typeof span.setAttribute === \"function\";\n                const hasSetAttributes = typeof span.setAttributes === \"function\";\n                const hasEnd = typeof span.end === \"function\";\n                const hasRecordException = typeof span.recordException === \"function\";\n\n                // Assert\n                Assert.ok(hasName, \"Should have name property\");\n                Assert.ok(hasKind, \"Should have kind property\");\n                Assert.ok(hasSpanContext, \"Should have spanContext method\");\n                Assert.ok(hasDuration, \"Should have duration property\");\n                Assert.ok(hasEnded, \"Should have ended property\");\n                Assert.ok(hasStartTime, \"Should have startTime property\");\n                Assert.ok(hasEndTime, \"Should have endTime property\");\n                Assert.ok(hasAttributes, \"Should have attributes property\");\n                Assert.ok(hasLinks, \"Should have links property\");\n                Assert.ok(hasEvents, \"Should have events property\");\n                Assert.ok(hasStatus, \"Should have status property\");\n                // Assert.ok(hasResource, \"Should have resource property\");\n                // Assert.ok(hasInstrumentationScope, \"Should have instrumentationScope property\");\n                Assert.ok(hasDroppedAttributesCount, \"Should have droppedAttributesCount property\");\n                Assert.ok(hasIsRecording, \"Should have isRecording method\");\n                Assert.ok(hasSetStatus, \"Should have setStatus method\");\n                Assert.ok(hasUpdateName, \"Should have updateName method\");\n                Assert.ok(hasSetAttribute, \"Should have setAttribute method\");\n                Assert.ok(hasSetAttributes, \"Should have setAttributes method\");\n                Assert.ok(hasEnd, \"Should have end method\");\n                Assert.ok(hasRecordException, \"Should have recordException method\");\n\n                // Final validation\n                Assert.ok(isReadableSpan(span), \"isReadableSpan should return true for complete span\");\n            }\n        });\n\n        this.testCase({\n            name: \"isReadableSpan: should work with recording spans\",\n            test: () => {\n                // Arrange - this would be a recording span in real usage\n                const recordingSpan = createNonRecordingSpan(this._otelApi, \"recording-test\", this._validSpanContext);\n\n                // Act\n                const result = isReadableSpan(recordingSpan);\n\n                // Assert\n                Assert.ok(result, \"Should return true for both recording and non-recording spans\");\n            }\n        });\n    }\n\n    private addWithSpanTests(): void {\n        this.testCase({\n            name: \"withSpan: should execute synchronous callback and return value\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-sync\", this._validSpanContext);\n                const expectedValue = \"sync-result\";\n\n                // Act\n                const result = withSpan(this._core, span, function() {\n                    return expectedValue;\n                });\n\n                // Assert\n                Assert.equal(result, expectedValue, \"Should return the callback result\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should set and restore active span for synchronous callback\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(this._otelApi, \"test-active-span\", this._validSpanContext);\n                let activeSpanDuringCallback: any = null;\n                let coreActiveSpanDuringCallback: any = null;\n                const originalActiveSpan = this._core.getActiveSpan();\n\n                Assert.ok(!isNullOrUndefined(originalActiveSpan), \"Original active span should not be null or undefined\");\n\n                // Act\n                withSpan(this._core, span, function() {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                    coreActiveSpanDuringCallback = _self._core.getActiveSpan();\n\n                    Assert.equal(coreActiveSpanDuringCallback, activeSpanDuringCallback, \"Core active span and OTEL active span should match during callback\");\n                });\n\n                const activeSpanAfterCallback = this._otelApi.trace.getActiveSpan();\n                const coreActiveSpanAfterCallback = this._core.getActiveSpan();\n\n                Assert.equal(coreActiveSpanAfterCallback, activeSpanAfterCallback, \"Core active span and OTEL active span should match after callback\");\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n                Assert.equal(activeSpanAfterCallback, originalActiveSpan, \"Active span should be restored after callback\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle promise that resolves\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-promise-resolve\", _self._validSpanContext);\n                const expectedValue = \"resolved-value\";\n                let activeSpanDuringCallback: any = null;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = withSpan(_self._core, span, function() {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                    return createPromise<string>((resolve) => {\n                        setTimeout(() => resolve(expectedValue), 10);\n                    });\n                }, _self);\n\n                const activeSpanAfterCallback = this._otelApi.trace.getActiveSpan();\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n\n                // Assert active span immediately after callback\n                Assert.equal(activeSpanAfterCallback, span, \"Active span should still be set after callback until promise resolves\");\n\n                return doAwait(promise, (result) => {\n                    Assert.equal(result, expectedValue, \"Should resolve with the expected value\");\n                    const activeSpanAfterResolve = this._otelApi.trace.getActiveSpan();\n                    Assert.equal(activeSpanAfterResolve, originalActiveSpan, \"Active span should be restored after promise resolves\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle promise that rejects\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-promise-reject\", _self._validSpanContext);\n                const expectedError = new Error(\"test-error\");\n                let activeSpanDuringCallback: any = null;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = withSpan(_self._core, span, function() {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                    return createRejectedPromise<string>(expectedError);\n                }, _self);\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n\n                return doAwait(promise,\n                    () => {\n                        Assert.ok(false, \"Promise should have rejected\");\n                    },\n                    (error) => {\n                        Assert.equal(error, expectedError, \"Should reject with the expected error\");\n                        const activeSpanAfterReject = this._otelApi.trace.getActiveSpan();\n                        Assert.equal(activeSpanAfterReject, originalActiveSpan, \"Active span should be restored after promise rejects\");\n                    }\n                );\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle async/await pattern with resolved promise\",\n            useFakeTimers: true,\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-async-await\", _self._validSpanContext);\n                const expectedValue = 42;\n                let activeSpanDuringCallback: any = null;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = withSpan(_self._core, span, function() {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                    return createPromise<number>((resolve) => {\n                        setTimeout(() => resolve(expectedValue), 100);\n                    });\n                }, _self);\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n\n                // Advance timers to trigger promise resolution\n                this.clock.tick(100);\n\n                return doAwait(promise, (result) => {\n                    Assert.equal(result, expectedValue, \"Should resolve with the expected value\");\n                    const activeSpanAfterResolve = this._otelApi.trace.getActiveSpan();\n                    Assert.equal(activeSpanAfterResolve, originalActiveSpan, \"Active span should be restored after async operation\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle async/await pattern with rejected promise\",\n            useFakeTimers: true,\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-async-reject\", this._validSpanContext);\n                const expectedError = new Error(\"async-error\");\n                const originalActiveSpan = this._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = withSpan(this._core, span, function() {\n                    return createPromise<number>((resolve, reject) => {\n                        setTimeout(() => reject(expectedError), 50);\n                    });\n                });\n\n                // Advance timers\n                this.clock.tick(50);\n\n                return doAwait(promise,\n                    () => {\n                        Assert.ok(false, \"Promise should have rejected\");\n                    },\n                    (error) => {\n                        Assert.equal(error, expectedError, \"Should reject with the expected error\");\n                        const activeSpanAfterReject = this._otelApi.trace.getActiveSpan();\n                        Assert.equal(activeSpanAfterReject, originalActiveSpan, \"Active span should be restored after rejection\");\n                    }\n                );\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should pass arguments to callback\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-args\", this._validSpanContext);\n                const arg1 = \"hello\";\n                const arg2 = 123;\n                let receivedArgs: any[] = [];\n\n                // Act\n                withSpan(this._core, span, function(...args: any[]) {\n                    receivedArgs = args;\n                }, undefined, arg1, arg2);\n\n                // Assert\n                Assert.equal(receivedArgs.length, 2, \"Should receive both arguments\");\n                Assert.equal(receivedArgs[0], arg1, \"First argument should match\");\n                Assert.equal(receivedArgs[1], arg2, \"Second argument should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should use provided thisArg\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-this\", this._validSpanContext);\n                const thisArg = { testProperty: \"test-value\" };\n                let capturedThis: any = null;\n\n                // Act\n                withSpan(this._core, span, function() {\n                    capturedThis = this;\n                }, thisArg);\n\n                // Assert\n                Assert.equal(capturedThis, thisArg, \"Should use provided thisArg\");\n                Assert.equal(capturedThis.testProperty, \"test-value\", \"thisArg properties should be accessible\");\n            }\n        });\n\n        this.testCase({\n            name: \"withSpan: should handle synchronous exception\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-exception\", this._validSpanContext);\n                const expectedError = new Error(\"sync-exception\");\n                const originalActiveSpan = this._otelApi.trace.getActiveSpan();\n\n                // Act & Assert\n                try {\n                    withSpan(this._core, span, function() {\n                        throw expectedError;\n                    });\n                    Assert.ok(false, \"Should have thrown an exception\");\n                } catch (error) {\n                    Assert.equal(error, expectedError, \"Should throw the expected error\");\n                    const activeSpanAfterException = this._otelApi.trace.getActiveSpan();\n                    Assert.equal(activeSpanAfterException, originalActiveSpan, \"Active span should be restored after exception\");\n                }\n            }\n        });\n    }\n\n    private addUseSpanTests(): void {\n        this.testCase({\n            name: \"useSpan: should execute synchronous callback and return value\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-sync\", this._validSpanContext);\n                const expectedValue = \"sync-result\";\n\n                // Act\n                const result = useSpan(this._core, span, function(scope) {\n                    return expectedValue;\n                });\n\n                // Assert\n                Assert.equal(result, expectedValue, \"Should return the callback result\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should provide scope as first parameter\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-scope\", this._validSpanContext);\n                let capturedScope: any = null;\n\n                // Act\n                useSpan(this._core, span, function(scope) {\n                    capturedScope = scope;\n                });\n\n                // Assert\n                Assert.ok(capturedScope, \"Should provide scope\");\n                Assert.ok(typeof capturedScope.restore === \"function\", \"Scope should have restore method\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should set and restore active span for synchronous callback\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-active-span\", this._validSpanContext);\n                let activeSpanDuringCallback: any = null;\n                const _self = this;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                useSpan(this._core, span, function(scope) {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                }, this);\n\n                const activeSpanAfterCallback = this._otelApi.trace.getActiveSpan();\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n                Assert.equal(activeSpanAfterCallback, originalActiveSpan, \"Active span should be restored after callback\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle promise that resolves\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-promise-resolve\", this._validSpanContext);\n                const expectedValue = \"resolved-value\";\n                let activeSpanDuringCallback: any = null;\n                let scopeFromCallback: any = null;\n                const _self = this;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = useSpan(this._core, span, function(scope) {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                    scopeFromCallback = scope;\n                    return createPromise<string>((resolve) => {\n                        setTimeout(() => resolve(expectedValue), 10);\n                    });\n                }, this);\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n                Assert.ok(scopeFromCallback, \"Scope should be provided to callback\");\n\n                return doAwait(promise, (result) => {\n                    Assert.equal(result, expectedValue, \"Should resolve with the expected value\");\n                    const activeSpanAfterResolve = this._otelApi.trace.getActiveSpan();\n                    Assert.equal(activeSpanAfterResolve, originalActiveSpan, \"Active span should be restored after promise resolves\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle promise that rejects\",\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-promise-reject\", this._validSpanContext);\n                const expectedError = new Error(\"test-error\");\n                let activeSpanDuringCallback: any = null;\n                const _self = this;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = useSpan(this._core, span, function(scope) {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                    return createRejectedPromise<string>(expectedError);\n                }, this);\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n\n                return doAwait(promise,\n                    () => {\n                        Assert.ok(false, \"Promise should have rejected\");\n                    },\n                    (error) => {\n                        Assert.equal(error, expectedError, \"Should reject with the expected error\");\n                        const activeSpanAfterReject = this._otelApi.trace.getActiveSpan();\n                        Assert.equal(activeSpanAfterReject, originalActiveSpan, \"Active span should be restored after promise rejects\");\n                    }\n                );\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle async/await pattern with resolved promise\",\n            useFakeTimers: true,\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-async-await\", this._validSpanContext);\n                const expectedValue = 42;\n                let activeSpanDuringCallback: any = null;\n                const _self = this;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = useSpan(this._core, span, function(scope) {\n                    activeSpanDuringCallback = _self._otelApi.trace.getActiveSpan();\n                    return createPromise<number>((resolve) => {\n                        setTimeout(() => resolve(expectedValue), 100);\n                    });\n                }, this);\n\n                // Assert\n                Assert.equal(activeSpanDuringCallback, span, \"Active span should be set during callback\");\n\n                // Advance timers to trigger promise resolution\n                this.clock.tick(100);\n\n                return doAwait(promise, (result) => {\n                    Assert.equal(result, expectedValue, \"Should resolve with the expected value\");\n                    const activeSpanAfterResolve = this._otelApi.trace.getActiveSpan();\n                    Assert.equal(activeSpanAfterResolve, originalActiveSpan, \"Active span should be restored after async operation\");\n                });\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle async/await pattern with rejected promise\",\n            useFakeTimers: true,\n            test: () => {\n                // Arrange\n                const span = createNonRecordingSpan(this._otelApi, \"test-async-reject\", this._validSpanContext);\n                const expectedError = new Error(\"async-error\");\n                const _self = this;\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = useSpan(this._core, span, function(scope) {\n                    return createPromise<number>((resolve, reject) => {\n                        setTimeout(() => reject(expectedError), 50);\n                    });\n                });\n\n                // Advance timers\n                this.clock.tick(50);\n\n                return doAwait(promise,\n                    () => {\n                        Assert.ok(false, \"Promise should have rejected\");\n                    },\n                    (error) => {\n                        Assert.equal(error, expectedError, \"Should reject with the expected error\");\n                        const activeSpanAfterReject = this._otelApi.trace.getActiveSpan();\n                        Assert.equal(activeSpanAfterReject, originalActiveSpan, \"Active span should be restored after rejection\");\n                    }\n                );\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should pass additional arguments to callback\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-args\", _self._validSpanContext);\n                const arg1 = \"hello\";\n                const arg2 = 123;\n                let receivedScope: any = null;\n                let receivedArgs: any[] = [];\n\n                // Act\n                useSpan(this._core, span, function(scope, ...args: any[]) {\n                    receivedScope = scope;\n                    receivedArgs = args;\n                }, undefined, arg1, arg2);\n\n                // Assert\n                Assert.ok(receivedScope, \"Should receive scope as first argument\");\n                Assert.equal(receivedArgs.length, 2, \"Should receive additional arguments\");\n                Assert.equal(receivedArgs[0], arg1, \"First additional argument should match\");\n                Assert.equal(receivedArgs[1], arg2, \"Second additional argument should match\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should use provided thisArg\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-this\", _self._validSpanContext);\n                const thisArg = { testProperty: \"test-value\" };\n                let capturedThis: any = null;\n\n                // Act\n                useSpan(this._core, span, function(scope) {\n                    capturedThis = this;\n                }, thisArg);\n\n                // Assert\n                Assert.equal(capturedThis, thisArg, \"Should use provided thisArg\");\n                Assert.equal(capturedThis.testProperty, \"test-value\", \"thisArg properties should be accessible\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should use scope as thisArg when not provided\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-default-this\", _self._validSpanContext);\n                let capturedThis: any = null;\n                let capturedScope: any = null;\n\n                // Act\n                useSpan(_self._core, span, function(scope) {\n                    capturedThis = this;\n                    capturedScope = scope;\n                });\n\n                // Assert\n                Assert.equal(capturedThis, capturedScope, \"Should use scope as thisArg when not provided\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle synchronous exception\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-exception\", _self._validSpanContext);\n                const expectedError = new Error(\"sync-exception\");\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act & Assert\n                try {\n                    useSpan(_self._core, span, function(scope) {\n                        throw expectedError;\n                    });\n                    Assert.ok(false, \"Should have thrown an exception\");\n                } catch (error) {\n                    Assert.equal(error, expectedError, \"Should throw the expected error\");\n                    const activeSpanAfterException = this._otelApi.trace.getActiveSpan();\n                    Assert.equal(activeSpanAfterException, originalActiveSpan, \"Active span should be restored after exception\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: scope.restore should be callable manually\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-manual-restore\", _self._validSpanContext);\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n                let scopeRestored = false;\n\n                // Act\n                useSpan(_self._core, span, function(scope) {\n                    Assert.equal(_self._otelApi.trace.getActiveSpan(), span, \"Active span should be set\");\n                    // Manually restore (though the framework will restore again)\n                    scope.restore();\n                    scopeRestored = true;\n                }, _self);\n                // Assert\n                Assert.ok(scopeRestored, \"Scope restore should have been called\");\n                const activeSpanAfterCallback = this._otelApi.trace.getActiveSpan();\n                Assert.equal(activeSpanAfterCallback, originalActiveSpan, \"Active span should be restored\");\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle promise rejection with ts-async doAwait\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-doawait-reject\", _self._validSpanContext);\n                const expectedError = new Error(\"doAwait-error\");\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = useSpan(_self._core, span, function(scope) {\n                    return createPromise<string>((resolve, reject) => {\n                        setTimeout(() => reject(expectedError), 5);\n                    });\n                });\n\n                // Use doAwait pattern to handle rejection\n                return doAwait(promise,\n                    (value) => {\n                        Assert.ok(false, \"Should not resolve\");\n                    },\n                    (reason) => {\n                        Assert.equal(reason, expectedError, \"Should reject with expected error\");\n                        Assert.equal(this._otelApi.trace.getActiveSpan(), originalActiveSpan, \"Active span should be restored after rejection\");\n                    }\n                );\n            }\n        });\n\n        this.testCase({\n            name: \"useSpan: should handle complex promise chain\",\n            test: () => {\n                // Arrange\n                const _self = this;\n                const span = createNonRecordingSpan(_self._otelApi, \"test-chain\", _self._validSpanContext);\n                const originalActiveSpan = _self._otelApi.trace.getActiveSpan();\n\n                // Act\n                const promise = useSpan(_self._core, span, function(scope) {\n                    return createPromise<number>((resolve) => {\n                        setTimeout(() => resolve(1), 5);\n                    });\n                });\n\n                // Chain multiple operations\n                return doAwait(promise, (value) => {\n                    Assert.equal(value, 1, \"First promise should resolve with 1\");\n\n                    return doAwait(createPromise<number>((resolve) => {\n                        setTimeout(() => resolve(value + 1), 5);\n                    }), (value2) => {\n                        Assert.equal(value2, 2, \"Second promise should resolve with 2\");\n                        Assert.equal(this._otelApi.trace.getActiveSpan(), originalActiveSpan, \"Active span should be restored\");\n                    });\n                });\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/Tests/UnitTests.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Application Insights JavaScript Core SDK</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <!-- <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script> -->\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>    \n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"pako\",\"./node_modules/pako/dist/pako\");\n\n        loadFetchModule(modules, \"whatwg-fetch\");\n        loadCommonModules(modules, function () {\n            var testModule = modules.add(\"Tests/Unit/src/aiunittests\", \"./Unit/dist/aicoreunit.tests.js\")\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "shared/AppInsightsCore/Tests/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": false,\n    \"module\": \"amd\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"es2017\",\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"alwaysStrict\": true,\n    \"declaration\": true\n  },\n  \"files\": []\n}\n\n"
  },
  {
    "path": "shared/AppInsightsCore/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/index.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  }\n  "
  },
  {
    "path": "shared/AppInsightsCore/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-core-js\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"3.4.1\",\n    \"description\": \"Microsoft Application Insights Core Javascript SDK\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\"\n    ],\n    \"main\": \"dist/es5/index.js\",\n    \"module\": \"dist-es5/index.js\",\n    \"types\": \"types/applicationinsights-core-js.d.ts\",\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run sri && npm run dtsgen\",\n        \"build:esm\": \"grunt core\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt coreunittest\",\n        \"mintest\": \"grunt core-mintest\",\n        \"perftest\": \"grunt coreperftest\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights Core Javascript SDK\\\"\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt core-min\",\n        \"ai-restore\": \"grunt core-restore\",\n        \"npm-pack\": \"npm pack\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/AppInsightsCore\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"globby\": \"^11.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"pako\": \"^2.0.3\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typedoc\": \"^0.26.6\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"qunit\": \"^2.11.2\",\n        \"sinon\": \"^7.3.1\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/rollup.config.js",
    "content": "import { createUnVersionedConfig } from \"../../rollup.base.config\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\n\nconst version = require(\"./package.json\").version;\nconst entryPointName = \"index\";\nconst browserOutputName = \"applicationinsights-core-js\";  // MUST NOT CHANGE - CDN compatibility\nconst banner = [\n    \"/*!\",\n    ` * Application Insights JavaScript SDK - Core, ${version}`,\n    \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n    \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n    \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n    \"// Licensed under the MIT License.\": \"\"\n};\n\nupdateDistEsmFiles(replaceValues, banner, true, true, \"dist-es5\");\n\nexport default createUnVersionedConfig(banner,\n    {\n        namespace: \"Microsoft.ApplicationInsights\",\n        version: version,\n        node: {\n            entryPoint: entryPointName,\n            outputName: entryPointName\n        },\n        browser: {\n            entryPoint: entryPointName,\n            outputName: browserOutputName   // Browser keeps original name for CDN\n        }\n    },\n    [\"index\", \"applicationinsights-core-js\"],\n    false\n);"
  },
  {
    "path": "shared/AppInsightsCore/src/config/ConfigDefaultHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { asString, isBoolean, isFunction, isNullOrUndefined, isString } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IConfigCheckFn, IConfigDefaultCheck, IConfigDefaults, IConfigSetFn } from \"../interfaces/config/IConfigDefaults\";\n\n/**\n * @internal\n * @ignore\n * @param str\n * @param defaultValue\n * @returns\n */\nfunction _stringToBoolOrDefault<T>(theValue: any, defaultValue: boolean, theConfig: T): boolean {\n    if (!theValue && isNullOrUndefined(theValue)) {\n        return defaultValue;\n    }\n\n    if (isBoolean(theValue)) {\n        return theValue;\n    }\n\n    return asString(theValue).toLowerCase() === \"true\";\n}\n\n/**\n * Helper which returns an IConfigDefaultCheck instance with the field defined as an object\n * that should be merged\n * @param defaultValue - The default value to apply it not provided or it's not valid\n * @returns a new IConfigDefaultCheck structure\n */\nexport function cfgDfMerge<V, T = IConfiguration, C = IConfiguration>(defaultValue: (V | undefined) | IConfigDefaults<V | undefined, T>): IConfigDefaultCheck<T, V | undefined, C> {\n    return {\n        mrg: true,\n        v: defaultValue\n    };\n}\n\n/**\n * Helper which returns an IConfigDefaultCheck instance with the provided field set function\n * @param setter - The IConfigCheckFn function to validate the user provided value\n * @param defaultValue - The default value to apply it not provided or it's not valid\n * @returns a new IConfigDefaultCheck structure\n */\nexport function cfgDfSet<V, T, C = IConfiguration>(setter: IConfigSetFn<T, V>, defaultValue: V): IConfigDefaultCheck<T, V, C> {\n    return {\n        set: setter,\n        v: defaultValue\n    };\n}\n\n/**\n * Helper which returns an IConfigDefaultCheck instance with the provided field validator\n * @param validator - The IConfigCheckFn function to validate the user provided value\n * @param defaultValue - The default value to apply it not provided or it's not valid\n * @param fallBackName - The fallback configuration name if the current value is not available\n * @returns a new IConfigDefaultCheck structure\n */\nexport function cfgDfValidate<V, T, C = IConfiguration>(validator: IConfigCheckFn<V>, defaultValue: V, fallBackName?: keyof T | keyof C | Array<keyof T | keyof C>): IConfigDefaultCheck<T, V, C> {\n    return {\n        fb: fallBackName,\n        isVal: validator,\n        v: defaultValue\n    };\n}\n\n\n/**\n * Helper which returns an IConfigDefaultCheck instance that will validate and convert the user\n * provided value to a boolean from a string or boolean value\n * @param defaultValue - The default value to apply it not provided or it's not valid\n * @param fallBackName - The fallback configuration name if the current value is not available\n * @returns a new IConfigDefaultCheck structure\n */\nexport function cfgDfBoolean<T, C = IConfiguration>(defaultValue?: boolean, fallBackName?: keyof T | keyof C | Array<keyof T | keyof C>): IConfigDefaultCheck<T, boolean, C> {\n    return {\n        fb: fallBackName,\n        set: _stringToBoolOrDefault,\n        v: !!defaultValue\n    }\n}\n\n/**\n * Helper which returns an IConfigDefaultCheck instance that will validate that the user\n * provided value is a function.\n * @param defaultValue - The default value to apply it not provided or it's not valid\n * @returns a new IConfigDefaultCheck structure\n */\nexport function cfgDfFunc<V, T, C = IConfiguration>(defaultValue?: V): IConfigDefaultCheck<T, V, C> {\n    return {\n        isVal: isFunction,\n        v: defaultValue || null\n    }\n}\n\n/**\n * Helper which returns an IConfigDefaultCheck instance that will validate that the user\n * provided value is a function.\n * @param defaultValue - The default string value to apply it not provided or it's not valid, defaults to an empty string\n * @returns a new IConfigDefaultCheck structure\n */\nexport function cfgDfString<T, C = IConfiguration>(defaultValue?: string): IConfigDefaultCheck<T, string, C> {\n    return {\n        isVal: isString,\n        v: asString(defaultValue || STR_EMPTY)\n    }\n}\n\n/**\n * Helper which returns an IConfigDefaultCheck instance identifying that value associated with this property\n * should not have it's properties converted into a dynamic config properties.\n * @param defaultValue - The default value to apply it not provided or it's not valid\n * @returns a new IConfigDefaultCheck structure\n */\nexport function cfgDfBlockPropValue<V, T = IConfiguration, C = IConfiguration>(defaultValue: V | IConfigDefaults<V, T>): IConfigDefaultCheck<T, V, C> {\n    return {\n        blkVal: true,\n        v: defaultValue\n    };\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/config/ConfigDefaults.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    asString, isArray, isDefined, isNullOrUndefined, isObject, isPlainObject, isUndefined, objForEachKey, objHasOwn\n} from \"@nevware21/ts-utils\";\nimport { IConfigCheckFn, IConfigDefaultCheck, IConfigDefaults, IConfigSetFn } from \"../interfaces/config/IConfigDefaults\";\nimport { IDynamicConfigHandler } from \"../interfaces/config/IDynamicConfigHandler\";\n\nfunction _isConfigDefaults<C, T>(value: any): value is IConfigDefaultCheck<C, C[keyof C], T> {\n    return (value && isObject(value) && !isArray(value) && (value.isVal || value.fb || objHasOwn(value, \"v\") || objHasOwn(value, \"mrg\") || objHasOwn(value, \"ref\") || value.set));\n}\n\nfunction _getDefault<C, T>(dynamicHandler: IDynamicConfigHandler<T>, theConfig: C, cfgDefaults: IConfigDefaultCheck<C, C[keyof C], T>): C[keyof C] | IConfigDefaults<C[keyof C], C> {\n    let defValue: C[keyof C] | IConfigDefaults<C[keyof C], C>;\n    let isDefaultValid: (value: any) => boolean =  cfgDefaults.dfVal || isDefined;\n\n    // There is a fallback config key so try and grab that first\n    if (theConfig && cfgDefaults.fb) {\n        let fallbacks = cfgDefaults.fb;\n        if (!isArray(fallbacks)) {\n            fallbacks = [ fallbacks ];\n        }\n\n        for (let lp = 0; lp < fallbacks.length; lp++) {\n            let fallback = fallbacks[lp];\n\n            let fbValue = theConfig[fallback as keyof C];\n            if (isDefaultValid(fbValue)) {\n                defValue = fbValue;\n            } else if (dynamicHandler) {\n                // Needed to ensure that the fallback value (and potentially) new field is also dynamic even if null/undefined\n                fbValue = dynamicHandler.cfg[fallback as keyof T] as unknown as C[keyof C];\n                if (isDefaultValid(fbValue)) {\n                    defValue = fbValue;\n                }\n\n                // Needed to ensure that the fallback value (and potentially) new field is also dynamic even if null/undefined\n                dynamicHandler.set(dynamicHandler.cfg, asString(fallback), fbValue);\n            }\n\n            if (isDefaultValid(defValue)) {\n                // We have a valid default so break out of the look\n                break;\n            }\n        }\n    }\n\n    // If the value is still not defined and we have a default value then use that\n    if (!isDefaultValid(defValue) && isDefaultValid(cfgDefaults.v)) {\n        defValue = cfgDefaults.v;\n    }\n\n    return defValue;\n}\n\n/**\n * Recursively resolve the default value\n * @param dynamicHandler\n * @param theConfig\n * @param cfgDefaults\n * @returns\n */\nfunction _resolveDefaultValue<C, T>(dynamicHandler: IDynamicConfigHandler<T>, theConfig: C, cfgDefaults: C[keyof C] | IConfigDefaultCheck<C, C[keyof C]>): C[keyof C] {\n    let theValue: C[keyof C] = cfgDefaults as C[keyof C];\n    \n    if (cfgDefaults && _isConfigDefaults<C, T>(cfgDefaults)) {\n        theValue = _getDefault<C, T>(dynamicHandler, theConfig, cfgDefaults) as C[keyof C];\n    }\n\n    if (theValue) {\n        if (_isConfigDefaults<C, T>(theValue)) {\n            theValue = _resolveDefaultValue<C, T>(dynamicHandler, theConfig, theValue);\n        }\n\n        let newValue: any;\n        if (isArray(theValue)) {\n            newValue = [];\n            newValue.length = theValue.length;\n        } else if (isPlainObject(theValue)) {\n            newValue = {} as T;\n        }\n\n        if (newValue) {\n            objForEachKey(theValue, (key, value) => {\n                if (value && _isConfigDefaults(value)) {\n                    value = _resolveDefaultValue<C, T>(dynamicHandler, theConfig, value) as any;\n                }\n    \n                newValue[key] = value;\n            });\n\n            theValue = newValue;\n        }\n    }\n\n    return theValue as C[keyof C];\n}\n\n/**\n * Applies the default value on the config property and makes sure that it's dynamic\n * @param theConfig\n * @param name\n * @param defaultValue\n */\nexport function _applyDefaultValue<T, C>(dynamicHandler: IDynamicConfigHandler<T>, theConfig: C, name: string, defaultValue: C[keyof C] | IConfigDefaultCheck<C, C[keyof C], T>) {\n    // Resolve the initial config value from the provided value or use the defined default\n    let isValid: IConfigCheckFn<C[keyof C]>;\n    let setFn: IConfigSetFn<C, C[keyof C]>;\n    let defValue: C[keyof C] | IConfigDefaults<C[keyof C], C>;\n    let cfgDefaults: IConfigDefaultCheck<C, C[keyof C]> = defaultValue as IConfigDefaultCheck<C, C[keyof C]>;\n    let mergeDf: boolean;\n    let reference: boolean;\n    let readOnly: boolean;\n    let blkDynamicValue: boolean;\n\n    if (_isConfigDefaults<C, T>(cfgDefaults)) {\n        // looks like a IConfigDefault\n        isValid = cfgDefaults.isVal;\n        setFn = cfgDefaults.set;\n        readOnly = cfgDefaults.rdOnly;\n        blkDynamicValue = cfgDefaults.blkVal;\n        mergeDf = cfgDefaults.mrg;\n        reference = cfgDefaults.ref;\n        if (!reference && isUndefined(reference)) {\n            reference = !!mergeDf;\n        }\n\n        defValue = _getDefault(dynamicHandler, theConfig, cfgDefaults);\n    } else {\n        defValue = defaultValue as C[keyof C];\n    }\n\n    if (blkDynamicValue) {\n        // Mark the property so that any value assigned will be blocked from conversion, we need to do this\n        // before assigning or fetching the value to ensure it's not converted\n        dynamicHandler.blkVal(theConfig, name);\n    }\n\n    // Set the value to the default value;\n    let theValue: any;\n    let usingDefault = true;\n\n    let cfgValue = theConfig[name];\n    // try and get and user provided values\n    if (cfgValue || !isNullOrUndefined(cfgValue)) {\n        // Use the defined theConfig[name] value\n        theValue = cfgValue;\n        usingDefault = false;\n\n        // The values are different and we have a special default value check, which is used to\n        // override config values like empty strings to continue using the default\n        if (isValid && theValue !== defValue && !isValid(theValue)) {\n            theValue = defValue;\n            usingDefault = true;\n        }\n\n        if (setFn) {\n            theValue = setFn(theValue, defValue as C[keyof C], theConfig);\n            usingDefault = theValue === defValue;\n        }\n    }\n\n    if (!usingDefault) {\n        if (isPlainObject(theValue) || isArray(defValue)) {\n            // we are using the user supplied value and it's an object\n            if (mergeDf && defValue && (isPlainObject(defValue) || isArray(defValue)) ) {\n                // Resolve/apply the defaults\n                objForEachKey(defValue, (dfName: string, dfValue: any) => {\n                    // Sets the value and makes it dynamic (if it doesn't already exist)\n                    _applyDefaultValue(dynamicHandler, theValue, dfName, dfValue);\n                });\n            }\n        }\n    } else if (defValue) {\n        // Just resolve the default\n        theValue = _resolveDefaultValue(dynamicHandler, theConfig, defValue);\n    } else {\n        theValue = defValue;\n    }\n\n    // if (theValue && usingDefault && (isPlainObject(theValue) || isArray(theValue))) {\n    //     theValue = _cfgDeepCopy(theValue);\n    // }\n\n    // Needed to ensure that the (potentially) new field is dynamic even if null/undefined\n    dynamicHandler.set(theConfig, name, theValue);\n    if (reference) {\n        dynamicHandler.ref(theConfig, name);\n    }\n\n    if (readOnly) {\n        dynamicHandler.rdOnly(theConfig, name);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/config/DynamicConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { dumpObj, isUndefined, objDefine, objForEachKey } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY, STR_NOT_DYNAMIC_ERROR } from \"../constants/InternalConstants\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IConfigDefaults } from \"../interfaces/config/IConfigDefaults\";\nimport { IDynamicConfigHandler, _IInternalDynamicConfigHandler } from \"../interfaces/config/IDynamicConfigHandler\";\nimport { IWatcherHandler, WatcherFunction } from \"../interfaces/config/IDynamicWatcher\";\nimport { _IDynamicConfigHandlerState } from \"../interfaces/config/_IDynamicConfigHandlerState\";\nimport { createUniqueNamespace } from \"../utils/DataCacheHelper\";\nimport { _applyDefaultValue } from \"./ConfigDefaults\";\nimport {\n    _eSetDynamicPropertyFlags, _makeDynamicObject, _setDynamicProperty, _setDynamicPropertyState, _throwDynamicError\n} from \"./DynamicProperty\";\nimport { _createState } from \"./DynamicState\";\nimport { CFG_HANDLER_LINK, _cfgDeepCopy, getDynamicConfigHandler, throwInvalidAccess } from \"./DynamicSupport\";\n\n/**\n * Identifies a function which will be re-called whenever any of it's accessed configuration values\n * change.\n * @param configHandler - The callback that will be called for the initial request and then whenever any\n * accessed configuration changes are identified.\n */\nfunction _createAndUseHandler<T>(state: _IDynamicConfigHandlerState<T>, configHandler: WatcherFunction<T>): IWatcherHandler<T> {\n    let handler: IWatcherHandler<T> = {\n        fn: configHandler,\n        rm: function () {\n            // Clear all references to the handler so it can be garbage collected\n            // This will also cause this handler to never get called and eventually removed\n            handler.fn = null;\n            state = null;\n            configHandler = null;\n        }\n    };\n\n    objDefine<any>(handler, \"toJSON\", { v: () => \"WatcherHandler\" + (handler.fn ? STR_EMPTY : \"[X]\") });\n\n    state.use(handler, configHandler);\n\n    return handler;\n}\n\n/**\n * Creates the dynamic config handler and associates with the target config as the root object\n * @param target - The config that you want to be root of the dynamic config\n * @param inPlace - Should the passed config be converted in-place or a new proxy returned\n * @returns The existing dynamic handler or a new instance with the provided config values\n */\nfunction _createDynamicHandler<T = IConfiguration>(logger: IDiagnosticLogger, target: T, inPlace: boolean) : IDynamicConfigHandler<T> {\n    let dynamicHandler = getDynamicConfigHandler<T, T>(target);\n    if (dynamicHandler) {\n        // The passed config is already dynamic so return it's tracker\n        return dynamicHandler;\n    }\n\n    let uid = createUniqueNamespace(\"dyncfg\", true);\n\n    let newTarget = (target && inPlace !== false) ? target : _cfgDeepCopy(target);\n    let theState: _IDynamicConfigHandlerState<T>;\n\n    function _notifyWatchers() {\n        theState.notify();\n    }\n\n    function _setValue<C, V>(target: C, name: string, value: V) {\n        try {\n            target = _setDynamicProperty(theState, target, name, value);\n        } catch (e) {\n            // Unable to convert to dynamic property so just leave as non-dynamic\n            _throwDynamicError(logger, name, \"Setting value\", e);\n        }\n\n        return target[name];\n    }\n\n    function _watch(configHandler: WatcherFunction<T>) {\n        return _createAndUseHandler(theState, configHandler);\n    }\n\n    function _block(configHandler: WatcherFunction<T>, allowUpdate?: boolean) {\n        theState.use(null, (details) => {\n            let prevUpd = theState.upd;\n            try {\n                if (!isUndefined(allowUpdate)) {\n                    theState.upd = allowUpdate;\n                }\n\n                configHandler(details);\n            } finally {\n                theState.upd = prevUpd;\n            }\n        });\n    }\n\n    function _ref<C>(target: C, name: string) {\n        // Make sure it's dynamic and mark as referenced with it's current value\n        return _setDynamicPropertyState(theState, target, name, { [_eSetDynamicPropertyFlags.inPlace]: true })[name];\n    }\n\n    function _rdOnly<C>(target: C, name: string) {\n        // Make sure it's dynamic and mark as readonly with it's current value\n        return _setDynamicPropertyState(theState, target, name, { [_eSetDynamicPropertyFlags.readOnly]: true })[name];\n    }\n\n    function _blkPropValue<C>(target: C, name: string) {\n        // Make sure it's dynamic and mark as readonly with it's current value\n        return _setDynamicPropertyState(theState, target, name, { [_eSetDynamicPropertyFlags.blockDynamicProperty]: true })[name];\n    }\n\n    function _applyDefaults<C>(theConfig: C, defaultValues: IConfigDefaults<C, T>): C {\n        if (defaultValues) {\n            // Resolve/apply the defaults\n            objForEachKey(defaultValues, (name: string, value: any) => {\n                // Sets the value and makes it dynamic (if it doesn't already exist)\n                _applyDefaultValue(cfgHandler, theConfig, name, value);\n            });\n        }\n    \n        return theConfig;\n    }\n\n    let cfgHandler: _IInternalDynamicConfigHandler<T> = {\n        uid: null,      // Will get replaced with a get property to ensure it's readonly nature\n        cfg: newTarget,\n        logger: logger,\n        notify: _notifyWatchers,\n        set: _setValue,\n        setDf: _applyDefaults,\n        watch: _watch,\n        ref: _ref,\n        rdOnly: _rdOnly,\n        blkVal: _blkPropValue,\n        _block: _block\n    };\n\n    objDefine(cfgHandler, \"uid\", {\n        c: false,\n        e: false,\n        w: false,\n        v: uid\n    });\n\n    theState = _createState(cfgHandler);\n\n    // Setup tracking for all defined default keys\n    _makeDynamicObject(theState, newTarget, \"config\", \"Creating\");\n\n    return cfgHandler;\n}\n\n/**\n * Log an invalid access message to the console\n */\nfunction _logInvalidAccess(logger: IDiagnosticLogger, message: string) {\n    if (logger) {\n        logger.warnToConsole(message);\n        logger.throwInternal(eLoggingSeverity.WARNING, _eInternalMessageId.DynamicConfigException, message);\n    } else {\n        // We don't have a logger so just throw an exception\n        throwInvalidAccess(message);\n    }\n}\n\n/**\n * Create or return a dynamic version of the passed config, if it is not already dynamic\n * @param config - The config to be converted into a dynamic config\n * @param defaultConfig - The default values to apply on the config if the properties don't already exist\n * @param inPlace - Should the config be converted in-place into a dynamic config or a new instance returned, defaults to true\n * @returns The dynamic config handler for the config (whether new or existing)\n */\nexport function createDynamicConfig<T = IConfiguration>(config: T, defaultConfig?: IConfigDefaults<T>, logger?: IDiagnosticLogger, inPlace?: boolean): IDynamicConfigHandler<T> {\n    let dynamicHandler = _createDynamicHandler<T>(logger, config || {} as T, inPlace);\n\n    if (defaultConfig) {\n        dynamicHandler.setDf(dynamicHandler.cfg, defaultConfig);\n    }\n\n    return dynamicHandler;\n}\n\n/**\n * Watch and track changes for accesses to the current config, the provided config MUST already be\n * a dynamic config or a child accessed via the dynamic config\n * @param logger - The logger instance to use if there is no existing handler\n * @returns A watcher handler instance that can be used to remove itself when being unloaded\n * @throws TypeError if the provided config is not a dynamic config instance\n */\nexport function onConfigChange<T = IConfiguration>(config: T, configHandler: WatcherFunction<T>, logger?: IDiagnosticLogger): IWatcherHandler<T> {\n    let handler: IDynamicConfigHandler<T> = config[CFG_HANDLER_LINK] || config;\n    if (handler.cfg && (handler.cfg === (config as any) || handler.cfg[CFG_HANDLER_LINK] === handler)) {\n        return handler.watch(configHandler);\n    }\n\n    _logInvalidAccess(logger, STR_NOT_DYNAMIC_ERROR + dumpObj(config));\n\n    return createDynamicConfig(config, null, logger).watch(configHandler);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/config/DynamicProperty.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    arrForEach, arrIndexOf, dumpObj, isArray, objDefine, objDefineProp, objForEachKey, objGetOwnPropertyDescriptor\n} from \"@nevware21/ts-utils\";\nimport { UNDEFINED_VALUE } from \"../constants/InternalConstants\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IWatcherHandler, _IDynamicDetail } from \"../interfaces/config/IDynamicWatcher\";\nimport { _IDynamicConfigHandlerState, _IDynamicGetter } from \"../interfaces/config/_IDynamicConfigHandlerState\";\nimport { CFG_HANDLER_LINK, _canMakeDynamic, blockDynamicConversion, throwInvalidAccess } from \"./DynamicSupport\";\n\nexport const enum _eSetDynamicPropertyFlags {\n    inPlace = 0,\n    readOnly = 1,\n    blockDynamicProperty = 2\n}\n\nconst arrayMethodsToPatch = [\n    \"push\",\n    \"pop\",\n    \"shift\",\n    \"unshift\",\n    \"splice\"\n];\n\nexport const _throwDynamicError = (logger: IDiagnosticLogger, name: string, desc: string, e: Error) => {\n    logger && logger.throwInternal(eLoggingSeverity.DEBUG, _eInternalMessageId.DynamicConfigException, `${desc} [${name}] failed - ` + dumpObj(e));\n};\n\nfunction _patchArray<T>(state: _IDynamicConfigHandlerState<T>, target: any, name: string) {\n    if (isArray(target)) {\n        // Monkey Patch the methods that might change the array\n        arrForEach(arrayMethodsToPatch, (method) => {\n            let orgMethod = target[method];\n            target[method] = function (...args: any[]) {\n                const result = orgMethod.apply(this, args);\n\n                // items may be added, removed or moved so need to make some new dynamic properties\n                _makeDynamicObject(state, target, name, \"Patching\");\n\n                return result;\n            }\n        });\n    }\n}\n\nfunction _getOwnPropGetter<T>(target: T, name: PropertyKey) {\n    let propDesc = objGetOwnPropertyDescriptor(target, name);\n    return propDesc && propDesc.get;\n}\n\nfunction _createDynamicProperty<T, C, V = any>(state: _IDynamicConfigHandlerState<T>, theConfig: C, name: string, value: V): void {\n    // Does not appear to be dynamic so lets make it so\n    let detail: _IDynamicDetail<T> = {\n        n: name,\n        h: [],\n        trk: function (handler: IWatcherHandler<T>) {\n            if (handler && handler.fn) {\n                if (arrIndexOf(detail.h, handler) === -1) {\n                    // Add this handler to the collection that should be notified when the value changes\n                    detail.h.push(handler);\n                }\n\n                state.trk(handler, detail);\n            }\n        },\n        clr: function(handler: IWatcherHandler<T>) {\n            let idx = arrIndexOf(detail.h, handler);\n            if (idx !== -1) {\n                detail.h.splice(idx, 1);\n            }\n        }\n    }\n\n    // Flag to optimize lookup response time by avoiding additional function calls\n    let checkDynamic = true;\n    let isObjectOrArray = false;\n\n    function _getProperty() {\n\n        if (checkDynamic) {\n            isObjectOrArray = isObjectOrArray || _canMakeDynamic(_getProperty, state, value);\n\n            // Make sure that if it's an object that we make it dynamic\n            if (value && !value[CFG_HANDLER_LINK] && isObjectOrArray) {\n                // It doesn't look like it's already dynamic so lets make sure it's converted the object into a dynamic Config as well\n                value = _makeDynamicObject(state, value, name, \"Converting\");\n            }\n\n            // If it needed to be converted it now has been\n            checkDynamic = false;\n        }\n\n        // If there is an active handler then add it to the tracking set of handlers\n        let activeHandler = state.act;\n        if (activeHandler) {\n            detail.trk(activeHandler);\n        }\n\n        return value;\n    }\n    \n    // Tag this getter as our dynamic property and provide shortcut for notifying a change\n    _getProperty[state.prop] = {\n        chng: function() {\n            state.add(detail);\n        }\n    };\n\n    function _setProperty(newValue: V) {\n        if (value !== newValue) {\n            if (!!_getProperty[state.ro] && !state.upd) {\n                // field is marked as readonly so return false\n                throwInvalidAccess(\"[\" + name + \"] is read-only:\" + dumpObj(theConfig));\n            }\n\n            if (checkDynamic) {\n                isObjectOrArray = isObjectOrArray || _canMakeDynamic(_getProperty, state, value);\n                checkDynamic = false;\n            }\n\n            // The value must be a plain object or an array to enforce the reference (in-place updates)\n            let isReferenced = isObjectOrArray && _getProperty[state.rf];\n\n            if(isObjectOrArray) {\n                // We are about to replace a plain object or an array\n                if (isReferenced) {\n                    // Reassign the properties from the current value to the same properties from the newValue\n                    // This will set properties not in the newValue to undefined\n                    objForEachKey(value, (key) => {\n                        value[key] = newValue ? newValue[key] : UNDEFINED_VALUE;\n                    });\n    \n                    // Now assign / re-assign value with all of the keys from newValue\n                    try {\n                        objForEachKey(newValue, (key, theValue) => {\n                            _setDynamicProperty(state, value, key, theValue);\n                        });\n\n                        // Now drop newValue so when we assign value later it keeps the existing reference\n                        newValue = value;\n                    } catch (e) {\n                        // Unable to convert to dynamic property so just leave as non-dynamic\n                        _throwDynamicError((state.hdlr || {}).logger, name, \"Assigning\", e);\n                        // Mark as not an object or array so we don't try and do this again\n                        isObjectOrArray = false;\n                    }\n\n                } else if (value && value[CFG_HANDLER_LINK]) {\n                    // As we are replacing the value, if it's already dynamic then we need to notify the listeners\n                    // for every property it has already\n                    objForEachKey(value, (key) => {\n                        // Check if the value is dynamic\n                        let getter = _getOwnPropGetter(value, key);\n                        if (getter) {\n                            // And if it is tell it's listeners that the value has changed\n                            let valueState: _IDynamicGetter = getter[state.prop];\n                            valueState && valueState.chng();\n                        }\n                    });\n                }\n            }\n\n            if (newValue !== value) {\n                let newIsObjectOrArray = newValue && _canMakeDynamic(_getProperty, state, newValue);\n                if (!isReferenced && newIsObjectOrArray) {\n                    // As the newValue is an object/array lets preemptively make it dynamic\n                    newValue = _makeDynamicObject(state, newValue, name, \"Converting\");\n                }\n\n                // Now assign the internal \"value\" to the newValue\n                value = newValue;\n                isObjectOrArray = newIsObjectOrArray;\n            }\n\n            // Cause any listeners to be scheduled for notification\n            state.add(detail);\n        }\n    }\n\n    objDefine<any>(theConfig, detail.n, { g: _getProperty, s: _setProperty });\n}\n\nexport function _setDynamicProperty<T, C, V = any>(state: _IDynamicConfigHandlerState<T>, target: C, name: string, value: V): C {\n    if (target) {\n        // To be a dynamic property it needs to have a get function\n        let getter = _getOwnPropGetter(target, name);\n        let isDynamic = getter && !!getter[state.prop];\n    \n        if (!isDynamic) {\n            _createDynamicProperty(state, target, name, value);\n        } else {\n            // Looks like it's already dynamic just assign the new value\n            target[name] = value;\n        }\n    }\n\n    return target;\n}\n\nexport function _setDynamicPropertyState<T, C>(state: _IDynamicConfigHandlerState<T>, target: C, name: string, flags?: { [key in _eSetDynamicPropertyFlags]?: boolean }): C {\n    if (target) {\n        // To be a dynamic property it needs to have a get function\n        let getter = _getOwnPropGetter(target, name);\n        let isDynamic = getter && !!getter[state.prop];\n        let inPlace = flags && flags[_eSetDynamicPropertyFlags.inPlace];\n        let rdOnly = flags && flags[_eSetDynamicPropertyFlags.readOnly];\n        let blkProp = flags && flags[_eSetDynamicPropertyFlags.blockDynamicProperty];\n    \n        if (!isDynamic) {\n            if (blkProp) {\n                try {\n                    // Attempt to mark the target as blocked from conversion\n                    blockDynamicConversion(target);\n                } catch (e) {\n                    _throwDynamicError((state.hdlr || {}).logger, name, \"Blocking\", e);\n                }\n            }\n\n            try {\n                // Make sure it's dynamic so that we can tag the property as per the state\n                _setDynamicProperty(state, target, name, target[name]);\n                getter = _getOwnPropGetter(target, name);\n            } catch (e) {\n                // Unable to convert to dynamic property so just leave as non-dynamic\n                _throwDynamicError((state.hdlr || {}).logger, name, \"State\", e);\n            }\n        }\n\n        // Assign the optional flags if true\n        if (inPlace) {\n            getter[state.rf] = inPlace;\n        }\n\n        if (rdOnly) {\n            getter[state.ro] = rdOnly;\n        }\n\n        if (blkProp) {\n            getter[state.blkVal] = true;\n        }\n    }\n\n    return target;\n}\n\nexport function _makeDynamicObject<T>(state: _IDynamicConfigHandlerState<T>, target: any, name: string, desc: string) {\n    try {\n        // Assign target with new value properties (converting into dynamic properties in the process)\n        objForEachKey(target, (key, value) => {\n            // Assign and/or make the property dynamic\n            _setDynamicProperty(state, target, key, value);\n        });\n\n        if (!target[CFG_HANDLER_LINK]) {\n            // Link the config back to the dynamic config details\n            objDefineProp(target, CFG_HANDLER_LINK, {\n                get: function() {\n                    return state.hdlr;\n                }\n            });\n\n            _patchArray(state, target, name);\n        }\n    } catch (e) {\n        // Unable to convert to dynamic property so just leave as non-dynamic\n        _throwDynamicError((state.hdlr || {}).logger, name, desc, e);\n    }\n\n    return target;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/config/DynamicState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ITimerHandler, arrForEach, arrIndexOf, dumpObj, newSymbol, scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { throwAggregationError } from \"../core/AggregationError\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { _IInternalDynamicConfigHandler } from \"../interfaces/config/IDynamicConfigHandler\";\nimport { IWatcherHandler, WatcherFunction, _IDynamicDetail } from \"../interfaces/config/IDynamicWatcher\";\nimport { _IDynamicConfigHandlerState } from \"../interfaces/config/_IDynamicConfigHandlerState\";\n\nconst symPrefix = \"[[ai_\";\nconst symPostfix = \"]]\";\n\nexport function _createState<T>(cfgHandler: _IInternalDynamicConfigHandler<T>): _IDynamicConfigHandlerState<T> {\n    let dynamicPropertySymbol = newSymbol(symPrefix + \"get\" + cfgHandler.uid + symPostfix);\n    let dynamicPropertyReadOnly = newSymbol(symPrefix + \"ro\" + cfgHandler.uid + symPostfix);\n    let dynamicPropertyReferenced = newSymbol(symPrefix + \"rf\" + cfgHandler.uid + symPostfix);\n    let dynamicPropertyBlockValue = newSymbol(symPrefix + \"blkVal\" + cfgHandler.uid + symPostfix);\n    let dynamicPropertyDetail = newSymbol(symPrefix + \"dtl\" + cfgHandler.uid + symPostfix);\n    let _waitingHandlers: IWatcherHandler<T>[] = null;\n    let _watcherTimer: ITimerHandler = null;\n    let theState: _IDynamicConfigHandlerState<T>;\n\n    function _useHandler(activeHandler: IWatcherHandler<T>, callback: WatcherFunction<T>) {\n        let prevWatcher = theState.act;\n        try {\n            theState.act = activeHandler;\n            if (activeHandler && activeHandler[dynamicPropertyDetail]) {\n                // Clear out the previously tracked details for this handler, so that access are re-evaluated\n                arrForEach(activeHandler[dynamicPropertyDetail], (detail) => {\n                    detail.clr(activeHandler);\n                });\n\n                activeHandler[dynamicPropertyDetail] = [];\n            }\n\n            callback({\n                cfg: cfgHandler.cfg,\n                set: cfgHandler.set.bind(cfgHandler),\n                setDf: cfgHandler.setDf.bind(cfgHandler),\n                ref: cfgHandler.ref.bind(cfgHandler),\n                rdOnly: cfgHandler.rdOnly.bind(cfgHandler)\n            });\n        } catch(e) {\n            let logger = cfgHandler.logger;\n            if (logger) {\n                // Don't let one individual failure break everyone\n                logger.throwInternal(eLoggingSeverity.CRITICAL, _eInternalMessageId.ConfigWatcherException, dumpObj(e));\n            }\n\n            // Re-throw the exception so that any true \"error\" is reported back to the called\n            throw e;\n        } finally {\n            theState.act = prevWatcher || null;\n        }\n    }\n\n    function _notifyWatchers() {\n        if (_waitingHandlers) {\n            let notifyHandlers = _waitingHandlers;\n            _waitingHandlers = null;\n\n            // Stop any timer as we are running them now anyway\n            _watcherTimer && _watcherTimer.cancel();\n            _watcherTimer = null;\n\n            let watcherFailures: any[] = [];\n\n            // Now run the handlers\n            arrForEach(notifyHandlers, (handler) => {\n                if (handler) {\n                    if (handler[dynamicPropertyDetail]) {\n                        arrForEach(handler[dynamicPropertyDetail], (detail) => {\n                            // Clear out this handler from  previously tracked details, so that access are re-evaluated\n                            detail.clr(handler);\n                        });\n\n                        handler[dynamicPropertyDetail] = null;\n                    }\n\n                    // The handler may have self removed as part of another handler so re-check\n                    if (handler.fn) {\n                        try {\n                            _useHandler(handler, handler.fn);\n                        } catch (e) {\n                            // Don't let a single failing watcher cause other watches to fail\n                            watcherFailures.push(e);\n                        }\n                    }\n                }\n            });\n\n            // During notification we may have had additional updates -- so notify those updates as well\n            if (_waitingHandlers) {\n                try {\n                    _notifyWatchers();\n                } catch (e) {\n                    watcherFailures.push(e);\n                }\n            }\n\n            if (watcherFailures.length > 0) {\n                throwAggregationError(\"Watcher error(s): \", watcherFailures);\n            }\n        }\n    }\n\n    function _addWatcher(detail: _IDynamicDetail<T>) {\n        if (detail && detail.h.length > 0) {\n            if (!_waitingHandlers) {\n                _waitingHandlers = [];\n            }\n    \n            if (!_watcherTimer) {\n                _watcherTimer = scheduleTimeout(() => {\n                    _watcherTimer = null;\n                    _notifyWatchers();\n                }, 0);\n            }\n    \n            // Add all of the handlers for this detail (if not already present) - using normal for-loop for performance\n            for (let idx = 0; idx < detail.h.length; idx++) {\n                let handler = detail.h[idx];\n\n                // Add this handler to the collection of handlers to re-execute\n                if (handler && arrIndexOf(_waitingHandlers, handler) === -1) {\n                    _waitingHandlers.push(handler);\n                }\n            }\n        }\n    }\n\n    function _trackHandler(handler: IWatcherHandler<T>, detail: _IDynamicDetail<T>) {\n        if (handler) {\n            let details = handler[dynamicPropertyDetail] = handler[dynamicPropertyDetail] || [];\n            if (arrIndexOf(details, detail) === -1) {\n                // If this detail is not already listed as tracked then add it so that we re-evaluate it's usage\n                details.push(detail);\n            }\n        }\n    }\n\n    theState = {\n        prop: dynamicPropertySymbol,\n        ro: dynamicPropertyReadOnly,\n        rf: dynamicPropertyReferenced,\n        blkVal: dynamicPropertyBlockValue,\n        hdlr: cfgHandler,\n        add: _addWatcher,\n        notify: _notifyWatchers,\n        use: _useHandler,\n        trk: _trackHandler\n    };\n\n    return theState;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/config/DynamicSupport.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { isArray, isPlainObject, objForEachKey, symbolFor, throwTypeError } from \"@nevware21/ts-utils\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IDynamicConfigHandler } from \"../interfaces/config/IDynamicConfigHandler\";\nimport { _IDynamicConfigHandlerState } from \"../interfaces/config/_IDynamicConfigHandlerState\";\n\n// Using Symbol.for so that if the same symbol was already created it would be returned\n// To handle multiple instances using potentially different versions we are not using\n// createUniqueNamespace()\nexport const CFG_HANDLER_LINK = symbolFor(\"[[ai_dynCfg_1]]\");\n\n/**\n * @internal\n * @ignore\n * The symbol to tag objects / arrays with if they should not be converted\n */\nconst BLOCK_DYNAMIC = symbolFor(\"[[ai_blkDynCfg_1]]\");\n\n/**\n * @internal\n * @ignore\n * The symbol to tag objects to indicate that when included into the configuration that\n * they should be converted into a trackable dynamic object.\n */\nconst FORCE_DYNAMIC = symbolFor(\"[[ai_frcDynCfg_1]]\");\n\nexport function _cfgDeepCopy<T>(source: T): T {\n\n    if (source) {\n        let target: any;\n\n        if (isArray(source)) {\n            target = [];\n            target.length = source.length;\n        } else if (isPlainObject(source)) {\n            target = {} as T;\n        }\n\n        if (target) {\n            // Copying index values by property name as the extensionConfig can be an array or object\n            objForEachKey(source, (key, value) => {\n                // Perform a deep copy of the object\n                target[key] = _cfgDeepCopy(value);\n            });\n\n            return target;\n        }\n    }\n\n    return source;\n}\n\n/**\n * @internal\n * Get the dynamic config handler if the value is already dynamic\n * @param value - The value to check for dynamic config handler\n * @returns The dynamic config handler if present, null otherwise\n */\nexport function getDynamicConfigHandler<T = IConfiguration, V = IConfiguration>(value: V | IDynamicConfigHandler<T>): IDynamicConfigHandler<T> | null {\n    if (value) {\n        let handler: IDynamicConfigHandler<T> = value[CFG_HANDLER_LINK] || value;\n        if (handler.cfg && (handler.cfg === (value as any) || handler.cfg[CFG_HANDLER_LINK] === handler)) {\n            return handler;\n        }\n    }\n\n    return null;\n}\n\n/**\n * Mark the provided value so that if it's included into the configuration it will NOT have\n * its properties converted into a dynamic (reactive) object. If the object is not a plain object\n * or an array (ie. a class) this function has not affect as only Objects and Arrays are converted\n * into dynamic objects in the dynamic configuration.\n *\n * When you have tagged a value as both {@link forceDynamicConversion} and blocked force will take precedence.\n *\n * You should only need to use this function, if you are creating dynamic \"classes\" from objects\n * which confirm to the require interface. A common case for this is during unit testing where it's\n * easier to create mock extensions.\n *\n * If `value` is falsy (null / undefined / 0 / empty string etc) it will not be tagged and\n * if there is an exception adding the property to the value (because its frozen etc) the\n * exception will be swallowed\n *\n * @example\n * ```ts\n * // This is a valid \"extension\", but it is technically an object\n * // So when included in the config.extensions it WILL be cloned and then\n * // converted into a dynamic object, where all of its properties will become\n * // get/set object properties and will be tracked. While this WILL still\n * // function, when attempt to use a mocking framework on top of this the\n * // functions are now technically get accessors which return a function\n * // and this can cause some mocking frameworks to fail.\n * let mockChannel = {\n *      pause: () => { },\n*      resume: () => { },\n*      teardown: () => { },\n*      flush: (async: any, callBack: any) => { },\n*      processTelemetry: (env: any) => { },\n*      setNextPlugin: (next: any) => { },\n*      initialize: (config: any, core: any, extensions: any) => { },\n*      identifier: \"testChannel\",\n*      priority: 1003\n* };\n * ```\n * @param value - The object that you want to block from being converted into a\n * trackable dynamic object\n * @returns The original value\n */\nexport function blockDynamicConversion<T>(value: T): T {\n    if (value && (isPlainObject(value) || isArray(value))) {\n        try {\n            value[BLOCK_DYNAMIC] = true;\n        } catch(e) {\n            // Don't throw for this case as it's an ask only\n        }\n    }\n\n    return value;\n}\n\n/**\n * This is the reverse case of {@link blockDynamicConversion} in that this will tag an\n * object to indicate that it should always be converted into a dynamic trackable object\n * even when not an object or array. So all properties of this object will become\n * get / set accessor functions.\n *\n * When you have tagged a value as both {@link forceDynamicConversion} and blocked force will take precedence.\n *\n * If `value` is falsy (null / undefined / 0 / empty string etc) it will not be tagged and\n * if there is an exception adding the property to the value (because its frozen etc) the\n * exception will be swallowed.\n * @param value - The object that should be tagged and converted if included into a dynamic\n * configuration.\n * @returns The original value\n */\nexport function forceDynamicConversion<T>(value: T): T {\n    if (value) {\n        try {\n            value[FORCE_DYNAMIC] = true;\n        } catch(e) {\n            // Don't throw for this case as it's an ask only\n        }\n    }\n\n    return value;\n}\n\n/**\n * @internal\n * @ignore\n * Helper function to check whether an object can or should be converted into a dynamic\n * object.\n * @param value - The object to check whether it should be converted\n * @returns `true` if the value should be converted otherwise `false`.\n */\nexport function _canMakeDynamic<T>(getFunc: () => any, state: _IDynamicConfigHandlerState<T>, value: any) {\n    let result = false;\n\n    // Object must exist and be truthy\n    if (value && !getFunc[state.blkVal]) {\n        // Tagged as always convert\n        result = value[FORCE_DYNAMIC];\n\n        // Check that it's not explicitly tagged as blocked\n        if (!result && !value[BLOCK_DYNAMIC]) {\n            // Only convert plain objects or arrays by default\n            result = isPlainObject(value) || isArray(value);\n        }\n    }\n\n    return result;\n}\n\n\n/**\n * Throws an invalid access exception\n * @param message - The message to include in the exception\n */\nexport function throwInvalidAccess(message: string): never {\n    throwTypeError(\"InvalidAccess:\" + message);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/constants/Constants.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * This is an internal property used to cause internal (reporting) requests to be ignored from reporting\n * additional telemetry, to handle polyfil implementations ALL urls used with a disabled request will\n * also be ignored for future requests even when this property is not provided.\n * Tagging as Ignore as this is an internal value and is not expected to be used outside of the SDK\n * @ignore\n */\nexport const DisabledPropertyName: string = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\n\nexport const ChannelControllerPriority = 500;\n\nexport const SampleRate = \"sampleRate\";\nexport const ProcessLegacy = \"ProcessLegacy\";\nexport const HttpMethod = \"http.method\";\nexport const DEFAULT_BREEZE_ENDPOINT = \"https://dc.services.visualstudio.com\";\nexport const DEFAULT_BREEZE_PATH = \"/v2/track\";\nexport const strNotSpecified = \"not_specified\";\nexport const strIkey = \"iKey\";\n\n"
  },
  {
    "path": "shared/AppInsightsCore/src/constants/InternalConstants.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// ###################################################################################################################################################\n// Note: DON'T Export these const from the package as we are still targeting IE/ES5 this will export a mutable variables that someone could change ###\n// ###################################################################################################################################################\n\nexport const UNDEFINED_VALUE: any = undefined;\nexport const STR_EMPTY = \"\";\nexport const STR_CHANNELS = \"channels\";\nexport const STR_CORE = \"core\";\nexport const STR_CREATE_PERF_MGR = \"createPerfMgr\";\nexport const STR_DISABLED = \"disabled\";\nexport const STR_EXTENSION_CONFIG = \"extensionConfig\";\nexport const STR_EXTENSIONS = \"extensions\";\nexport const STR_PROCESS_TELEMETRY = \"processTelemetry\";\nexport const STR_PRIORITY = \"priority\";\n\nexport const STR_EVENTS_SENT = \"eventsSent\";\nexport const STR_EVENTS_DISCARDED = \"eventsDiscarded\";\nexport const STR_EVENTS_SEND_REQUEST = \"eventsSendRequest\";\nexport const STR_PERF_EVENT = \"perfEvent\";\nexport const STR_OFFLINE_STORE = \"offlineEventsStored\";\nexport const STR_OFFLINE_SENT = \"offlineBatchSent\";\nexport const STR_OFFLINE_DROP = \"offlineBatchDrop\";\n\nexport const STR_GET_PERF_MGR = \"getPerfMgr\";\nexport const STR_DOMAIN = \"domain\";\nexport const STR_PATH = \"path\";\n\nexport const STR_NOT_DYNAMIC_ERROR = \"Not dynamic - \";\n\nexport const STR_REDACTED = \"REDACTED\";\nexport const DEFAULT_SENSITIVE_PARAMS = [\"sig\", \"Signature\", \"AWSAccessKeyId\", \"X-Goog-Signature\"];\n\nexport const STR_DEFAULT_ENDPOINT_URL = \"https://browser.events.data.microsoft.com/OneCollector/1.0/\";\nexport const STR_VERSION = \"version\";\nexport const STR_NOT_SPECIFIED = \"not_specified\";"
  },
  {
    "path": "shared/AppInsightsCore/src/core/AggregationError.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { CustomErrorConstructor, arrForEach, createCustomError, dumpObj } from \"@nevware21/ts-utils\";\n\nlet aggregationErrorType: AggregationError;\n\ninterface AggregationError extends CustomErrorConstructor {\n    new(message: string, sourceErrors: Error[]): Error;\n    (message: string, sourceErrors: Error[]): Error;\n    readonly errors: any[];        // Holds the aggregation of errors that caused this error\n}\n\n/**\n * Throws an Aggregation Error which includes all of the errors that led to this error occurring\n * @param message - The message describing the aggregation error (the sourceError details are added to this)\n * @param sourceErrors - An array of the errors that caused this situation\n */\nexport function throwAggregationError(message: string, sourceErrors: any[]): never {\n    if (!aggregationErrorType) {\n        aggregationErrorType = createCustomError<AggregationError>(\"AggregationError\", (self, args) => {\n            if (args.length > 1) {\n                // Save the provided errors\n                self.errors = args[1];\n            }\n        });\n    }\n\n    let theMessage = message || \"One or more errors occurred.\";\n\n    arrForEach(sourceErrors, (srcError, idx) => {\n        theMessage += `\\n${idx} > ${dumpObj(srcError)}`;\n    });\n\n    throw new aggregationErrorType(theMessage, sourceErrors || []);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/AppInsightsCore.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { IPromise, createPromise, createSyncAllSettledPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport {\n    ICachedValue, ITimerHandler, arrAppend, arrForEach, arrIndexOf, createTimeout, deepExtend, hasDocument, isFunction, isNullOrUndefined,\n    isPlainObject, isPromiseLike, objAssign, objDeepFreeze, objDefine, objForEachKey, objFreeze, objHasOwn, scheduleTimeout, throwError\n} from \"@nevware21/ts-utils\";\nimport { cfgDfMerge } from \"../config/ConfigDefaultHelpers\";\nimport { createDynamicConfig, onConfigChange } from \"../config/DynamicConfig\";\nimport { ChannelControllerPriority } from \"../constants/Constants\";\nimport {\n    STR_CHANNELS, STR_CREATE_PERF_MGR, STR_DISABLED, STR_EMPTY, STR_EXTENSIONS, STR_EXTENSION_CONFIG, UNDEFINED_VALUE\n} from \"../constants/InternalConstants\";\nimport { DiagnosticLogger, _InternalLogMessage, _throwInternal, _warnToConsole } from \"../diagnostics/DiagnosticLogger\";\nimport { eEventsDiscardedReason } from \"../enums/ai/EventsDiscardedReason\";\nimport { ActiveStatus, eActiveStatus } from \"../enums/ai/InitActiveStatusEnum\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { SendRequestReason } from \"../enums/ai/SendRequestReason\";\nimport { TelemetryUnloadReason } from \"../enums/ai/TelemetryUnloadReason\";\nimport { TelemetryUpdateReason } from \"../enums/ai/TelemetryUpdateReason\";\nimport { eTraceHeadersMode } from \"../enums/ai/TraceHeadersMode\";\nimport { IAppInsightsCore, ILoadedPlugin } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IChannelControls } from \"../interfaces/ai/IChannelControls\";\nimport { IChannelControlsHost } from \"../interfaces/ai/IChannelControlsHost\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { ICookieMgr } from \"../interfaces/ai/ICookieMgr\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IDistributedTraceContext } from \"../interfaces/ai/IDistributedTraceContext\";\nimport { INotificationListener } from \"../interfaces/ai/INotificationListener\";\nimport { INotificationManager } from \"../interfaces/ai/INotificationManager\";\nimport { IPerfManager } from \"../interfaces/ai/IPerfManager\";\nimport { IProcessTelemetryContext, IProcessTelemetryUpdateContext } from \"../interfaces/ai/IProcessTelemetryContext\";\nimport { ITelemetryInitializerHandler, TelemetryInitializerFunction } from \"../interfaces/ai/ITelemetryInitializers\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { IPlugin, ITelemetryPlugin } from \"../interfaces/ai/ITelemetryPlugin\";\nimport { ITelemetryPluginChain } from \"../interfaces/ai/ITelemetryPluginChain\";\nimport { ITelemetryUnloadState } from \"../interfaces/ai/ITelemetryUnloadState\";\nimport { ITelemetryUpdateState } from \"../interfaces/ai/ITelemetryUpdateState\";\nimport { ISpanScope, ITraceProvider } from \"../interfaces/ai/ITraceProvider\";\nimport { ILegacyUnloadHook, IUnloadHook } from \"../interfaces/ai/IUnloadHook\";\nimport { IConfigDefaults } from \"../interfaces/config/IConfigDefaults\";\nimport { IDynamicConfigHandler, _IInternalDynamicConfigHandler } from \"../interfaces/config/IDynamicConfigHandler\";\nimport { IWatchDetails, WatcherFunction } from \"../interfaces/config/IDynamicWatcher\";\nimport { ITraceCfg } from \"../interfaces/otel/config/IOTelTraceCfg\";\nimport { IOTelSpanContext } from \"../interfaces/otel/trace/IOTelSpanContext\";\nimport { IOTelSpanOptions } from \"../interfaces/otel/trace/IOTelSpanOptions\";\nimport { IReadableSpan } from \"../interfaces/otel/trace/IReadableSpan\";\nimport { _noopVoid } from \"../internal/noopHelpers\";\nimport { findW3cTraceState } from \"../telemetry/W3cTraceState\";\nimport { createUniqueNamespace } from \"../utils/DataCacheHelper\";\nimport { getSetValue, isNotNullOrUndefined, proxyFunctionAs, proxyFunctions, toISOString } from \"../utils/HelperFuncs\";\nimport { findW3cTraceParent } from \"../utils/TraceParent\";\nimport { doUnloadAll, runTargetUnload } from \"./AsyncUtils\";\nimport { createCookieMgr } from \"./CookieMgr\";\nimport { getDebugListener } from \"./DbgExtensionUtils\";\nimport { NotificationManager } from \"./NotificationManager\";\nimport { PerfManager, doPerf, getGblPerfMgr } from \"./PerfManager\";\nimport {\n    createProcessTelemetryContext, createProcessTelemetryUnloadContext, createProcessTelemetryUpdateContext, createTelemetryProxyChain\n} from \"./ProcessTelemetryContext\";\nimport {\n    _getPluginState, createDistributedTraceContext, initializePlugins, isDistributedTraceContext, sortPlugins\n} from \"./TelemetryHelpers\";\nimport { TelemetryInitializerPlugin } from \"./TelemetryInitializerPlugin\";\nimport { IUnloadHandlerContainer, UnloadHandler, createUnloadHandlerContainer } from \"./UnloadHandlerContainer\";\nimport { IUnloadHookContainer, createUnloadHookContainer } from \"./UnloadHookContainer\";\n\n// import { IStatsBeat, IStatsBeatConfig, IStatsBeatState } from \"../interfaces/ai/IStatsBeat\";\n// import { IStatsMgr } from \"../interfaces/ai/IStatsMgr\";\nconst strValidationError = \"Plugins must provide initialize method\";\nconst strNotificationManager = \"_notificationManager\";\nconst strSdkUnloadingError = \"SDK is still unloading...\";\nconst strSdkNotInitialized = \"SDK is not initialized\";\nconst maxInitQueueSize = 100;\nconst maxInitTimeout = 50000;\nconst maxAttributeCount = 128;\n// const strPluginUnloadFailed = \"Failed to unload plugin\";\n\n// /**\n//  * Default StatsBeatMgr configuration\n//  * @internal\n//  */\n// const defaultStatsCfg: IConfigDefaults<IStatsBeatConfig> = objDeepFreeze({\n//     shrtInt: UNDEFINED_VALUE,\n//     endCfg: cfgDfMerge([])\n// });\n\n// /**\n//  * Default SDK initialization configuration\n//  * @internal\n//  */\n// const defaultSdkConfig: IConfigDefaults<IInternalSdkConfiguration> = objDeepFreeze({\n//     stats: { rdOnly: true, mrg: true, v: defaultStatsCfg }\n// });\n\n/**\n * The default settings for the config.\n * WE MUST include all defaults here to ensure that the config is created with all of the properties\n * defined as dynamic.\n */\nconst defaultConfig: IConfigDefaults<IConfiguration> = objDeepFreeze({\n    cookieCfg: {},\n    [STR_EXTENSIONS]: { rdOnly: true, ref: true, v: [] },\n    [STR_CHANNELS]: { rdOnly: true, ref: true, v: [] },\n    [STR_EXTENSION_CONFIG]: { ref: true, v: {} },\n    [STR_CREATE_PERF_MGR]: UNDEFINED_VALUE,\n    loggingLevelConsole: eLoggingSeverity.DISABLED,\n    diagnosticLogInterval: UNDEFINED_VALUE,\n    traceHdrMode: eTraceHeadersMode.All,\n    traceCfg: cfgDfMerge<ITraceCfg>({\n        generalLimits: cfgDfMerge({\n            attributeValueLengthLimit: undefined,\n            attributeCountLimit: maxAttributeCount\n        }),\n        // spanLimits: cfgDfMerge({\n        //     attributeValueLengthLimit: undefined,\n        //     attributeCountLimit: maxAttributeCount,\n        //     linkCountLimit: maxAttributeCount,\n        //     eventCountLimit: maxAttributeCount,\n        //     attributePerEventCountLimit: maxAttributeCount,\n        //     attributePerLinkCountLimit: maxAttributeCount\n        // }),\n        // idGenerator: null,\n        serviceName: null,\n        suppressTracing: false\n    })\n    // _sdk: { rdOnly: true, ref: true, v: defaultSdkConfig }\n});\n\nfunction _getDefaultConfig<CfgType>(core: IAppInsightsCore): IConfigDefaults<CfgType> {\n    let handlers = {\n        // Dynamic Default Error Handlers\n        errorHandlers: cfgDfMerge({\n            attribError: (message: string, key: string, value: any) => {\n                core.logger.throwInternal(eLoggingSeverity.WARNING, _eInternalMessageId.AttributeError, message, {\n                    attribName: key,\n                    value: value\n                });\n            },\n            spanError: (message: string, spanName: string) => {\n                core.logger.throwInternal(eLoggingSeverity.WARNING, _eInternalMessageId.SpanError, message, {\n                    spanName: spanName\n                });\n            },\n            debug: (message: string) => {\n                core.logger.debugToConsole(message);\n            },\n            warn: (message: string) => {\n                core.logger.warnToConsole(message)\n            },\n            error: (message: string) => {\n                core.logger.throwInternal(eLoggingSeverity.CRITICAL, _eInternalMessageId.TraceError, message);\n            },\n            notImplemented: (message: string) => {\n                core.logger.throwInternal(eLoggingSeverity.CRITICAL, _eInternalMessageId.NotImplementedError, message);\n            }\n        })\n    };\n    \n    return objDeepFreeze(objAssign({}, defaultConfig as any, handlers));\n}\n\n/**\n * Helper to create the default performance manager\n * @param core - The AppInsightsCore instance\n * @param notificationMgr - The notification manager\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction _createPerfManager (core: IAppInsightsCore, notificationMgr: INotificationManager) {\n    return new PerfManager(notificationMgr);\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _validateExtensions(logger: IDiagnosticLogger, channelPriority: number, allExtensions: IPlugin[]): { core: IPlugin[], channels: IChannelControls[] } {\n    // Concat all available extensions\n    let coreExtensions: ITelemetryPlugin[] = [];\n    let channels: IChannelControls[] = [];\n\n    // Check if any two extensions have the same priority, then warn to console\n    // And extract the local extensions from the\n    let extPriorities: any = {};\n\n    // Extension validation\n    arrForEach(allExtensions, (ext: ITelemetryPlugin) => {\n        // Check for ext.initialize\n        if (isNullOrUndefined(ext) || isNullOrUndefined(ext.initialize)) {\n            throwError(strValidationError);\n        }\n\n        const extPriority = ext.priority;\n        const identifier = ext.identifier;\n\n        if (ext && extPriority) {\n            if (!isNullOrUndefined(extPriorities[extPriority])) {\n                _warnToConsole(logger, \"Two extensions have same priority #\" + extPriority + \" - \" + extPriorities[extPriority] + \", \" + identifier);\n            } else {\n                // set a value\n                extPriorities[extPriority] = identifier;\n            }\n        }\n\n        // Split extensions to core and channels\n        if (!extPriority || extPriority < channelPriority) {\n            // Add to core extension that will be managed by AppInsightsCore\n            coreExtensions.push(ext);\n        } else {\n            channels.push(ext);\n        }\n    });\n\n    return {\n        core: coreExtensions,\n        channels: channels\n    };\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _isPluginPresent(thePlugin: IPlugin, plugins: IPlugin[]) {\n    let exists = false;\n\n    arrForEach(plugins, (plugin) => {\n        if (plugin === thePlugin) {\n            exists = true;\n            return -1;\n        }\n    });\n\n    return exists;\n}\n\nfunction _deepMergeConfig(details: IWatchDetails<IConfiguration>, target: any, newValues: any, merge: boolean) {\n    // Lets assign the new values to the existing config\n    if (newValues) {\n        objForEachKey(newValues, (key, value) => {\n            if (merge) {\n                if (isPlainObject(value) && isPlainObject(target[key])) {\n                    // The target is an object and it has a value\n                    _deepMergeConfig(details, target[key], value, merge);\n                }\n            }\n\n            if (merge && isPlainObject(value) && isPlainObject(target[key])) {\n                // The target is an object and it has a value\n                _deepMergeConfig(details, target[key], value, merge);\n            } else {\n                // Just Assign (replace) and/or make the property dynamic\n                details.set(target, key, value);\n            }\n        });\n    }\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _findWatcher(listeners: { rm: () => void, w: WatcherFunction<IConfiguration> }[], newWatcher: WatcherFunction<IConfiguration>) {\n    let theListener: { rm: () => void, w: WatcherFunction<IConfiguration> } = null;\n    let idx: number = -1;\n    arrForEach(listeners, (listener, lp) => {\n        if (listener.w === newWatcher) {\n            theListener = listener;\n            idx = lp;\n            return -1;\n        }\n    });\n\n    return { i: idx, l: theListener };\n}\n\nfunction _addDelayedCfgListener(listeners: { rm: () => void, w: WatcherFunction<IConfiguration> }[], newWatcher: WatcherFunction<IConfiguration>) {\n    let theListener = _findWatcher(listeners, newWatcher).l;\n\n    if (!theListener) {\n        theListener = {\n            w: newWatcher,\n            rm: () => {\n                let fnd = _findWatcher(listeners, newWatcher);\n                if (fnd.i !== -1) {\n                    listeners.splice(fnd.i, 1);\n                }\n            }\n        };\n        listeners.push(theListener);\n    }\n\n    return theListener;\n}\n\nfunction _registerDelayedCfgListener(config: IConfiguration, listeners: { rm: () => void, w: WatcherFunction<IConfiguration> }[], logger: IDiagnosticLogger) {\n    arrForEach(listeners, (listener) => {\n        let unloadHdl = onConfigChange(config, listener.w, logger);\n        delete listener.w;      // Clear the listener reference so it will get garbage collected.\n        // replace the remove function\n        listener.rm = () => {\n            unloadHdl.rm();\n        };\n    });\n}\n\n// Moved this outside of the closure to reduce the retained memory footprint\nfunction _initDebugListener(configHandler: IDynamicConfigHandler<IConfiguration>, unloadContainer: IUnloadHookContainer, notificationManager: INotificationManager, debugListener: INotificationListener) {\n    // Will get recalled if any referenced config values are changed\n    unloadContainer.add(configHandler.watch((details) => {\n        let disableDbgExt = details.cfg.disableDbgExt;\n\n        if (disableDbgExt === true && debugListener) {\n            // Remove any previously loaded debug listener\n            notificationManager.removeNotificationListener(debugListener);\n            debugListener = null;\n        }\n\n        if (notificationManager && !debugListener && disableDbgExt !== true) {\n            debugListener = getDebugListener(details.cfg);\n            notificationManager.addNotificationListener(debugListener);\n        }\n    }));\n\n    return debugListener\n}\n\n// Moved this outside of the closure to reduce the retained memory footprint\n/*#__NO_SIDE_EFFECTS__*/\nfunction _createUnloadHook(unloadHook: IUnloadHook): IUnloadHook {\n    return objDefine<IUnloadHook | any>({\n        rm: () => {\n            unloadHook.rm();\n        }\n    }, \"toJSON\", { v: () => \"aicore::onCfgChange<\" + JSON.stringify(unloadHook) + \">\" });\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _getParentTraceCtx(mode: eTraceHeadersMode): IDistributedTraceContext | null {\n    let spanContext: IDistributedTraceContext | null = null;\n    const parentTrace = (mode & eTraceHeadersMode.TraceParent) ? findW3cTraceParent() : null;\n    const parentTraceState = (mode & eTraceHeadersMode.TraceState) ? findW3cTraceState() : null;\n\n    if (parentTrace || parentTraceState) {\n        spanContext = createDistributedTraceContext({\n            traceId: parentTrace ? parentTrace.traceId : null,\n            spanId: parentTrace ? parentTrace.spanId : null,\n            traceFlags: parentTrace ? parentTrace.traceFlags : UNDEFINED_VALUE,\n            isRemote: true,  // Mark as remote since it's from an external source\n            traceState: parentTraceState\n        });\n    }\n\n    return spanContext;\n}\n\n/**\n * @group Classes\n * @group Entrypoint\n */\nexport class AppInsightsCore<CfgType extends IConfiguration = IConfiguration> implements IAppInsightsCore<CfgType> {\n    public config: CfgType;\n    public logger: IDiagnosticLogger;\n\n    /**\n     * An array of the installed plugins that provide a version\n     */\n    public readonly pluginVersionStringArr: string[];\n    \n    /**\n     * The formatted string of the installed plugins that contain a version number\n     */\n    public readonly pluginVersionString: string;\n\n    /**\n     * Returns a value that indicates whether the instance has already been previously initialized.\n     */\n    public isInitialized: () => boolean;\n\n    /**\n     * Function used to identify the get w parameter used to identify status bit to some channels\n     */\n    public getWParam: () => number;\n\n    constructor() {\n        // NOTE!: DON'T set default values here, instead set them in the _initDefaults() function as it is also called during teardown()\n        let _configHandler: IDynamicConfigHandler<CfgType>;\n        let _isInitialized: boolean;\n        let _logger: IDiagnosticLogger;\n        let _eventQueue: ITelemetryItem[];\n        let _notificationManager: INotificationManager | null | undefined;\n        // let _statsBeat: IStatsBeat | null;\n        // let _statsMgr: IStatsMgr | null;\n        let _perfManager: IPerfManager | null;\n        let _cfgPerfManager: IPerfManager | null;\n        let _cookieManager: ICookieMgr | null;\n        let _pluginChain: ITelemetryPluginChain | null;\n        let _configExtensions: IPlugin[];\n        let _channelConfig: IChannelControls[][] | null | undefined;\n        let _channels: IChannelControls[] | null;\n        let _isUnloading: boolean;\n        let _telemetryInitializerPlugin: TelemetryInitializerPlugin;\n        let _serverOTelCtx: IDistributedTraceContext | null;\n        let _serverTraceHdrMode: eTraceHeadersMode;\n        let _internalLogsEventName: string | null;\n        let _evtNamespace: string;\n        let _unloadHandlers: IUnloadHandlerContainer;\n        let _hookContainer: IUnloadHookContainer;\n        let _debugListener: INotificationListener | null;\n        let _traceCtx: IDistributedTraceContext | null;\n        let _traceProvider: ICachedValue<ITraceProvider> | null;\n        let _activeSpan: IReadableSpan | null;\n        let _instrumentationKey: string | null;\n        let _cfgListeners: { rm: () => void, w: WatcherFunction<CfgType> }[];\n        let _extensions: IPlugin[];\n        let _pluginVersionStringArr: string[];\n        let _pluginVersionString: string;\n        let _activeStatus: eActiveStatus; // to indicate if ikey or endpoint url promised is resolved or not\n        let _endpoint: string;\n        let _initInMemoMaxSize: number; // max event count limit during wait for init promises to be resolved\n        let _isStatusSet: boolean; // track if active status is set in case of init timeout and init promises setting the status twice\n        let _initTimer: ITimerHandler;\n\n        /**\n         * Internal log poller\n         */\n        let _internalLogPoller: ITimerHandler;\n        let _internalLogPollerListening: boolean;\n        let _forceStopInternalLogPoller: boolean;\n\n        dynamicProto(AppInsightsCore, this, (_self) => {\n\n            // Set the default values (also called during teardown)\n            _initDefaults();\n\n            // Special internal method to allow the unit tests and DebugPlugin to hook embedded objects\n            (_self as any)[\"_getDbgPlgTargets\"] = () => {\n                return [_extensions, _eventQueue];\n            };\n\n            _self.isInitialized = () => _isInitialized;\n\n            // since version 3.3.0\n            _self.activeStatus = () => _activeStatus;\n\n            // since version 3.3.0\n            // internal\n            _self._setPendingStatus = () => {\n                _activeStatus = eActiveStatus.PENDING;\n            };\n\n            // Creating the self.initialize = ()\n            _self.initialize = (config: CfgType, extensions: IPlugin[], logger?: IDiagnosticLogger, notificationManager?: INotificationManager): void => {\n                if (_isUnloading) {\n                    throwError(strSdkUnloadingError);\n                }\n\n                // Make sure core is only initialized once\n                if (_self.isInitialized()) {\n                    throwError(\"Core cannot be initialized more than once\");\n                }\n\n                _configHandler = createDynamicConfig<CfgType>(config, _getDefaultConfig<CfgType>(_self), logger || _self.logger, false);\n\n                // Re-assigning the local config property so we don't have any references to the passed value and it can be garbage collected\n                config = _configHandler.cfg;\n\n                // This will be \"re-run\" if the referenced config properties are changed\n                _addUnloadHook(_configHandler.watch((details) => {\n                    let rootCfg = details.cfg;\n\n                    _initInMemoMaxSize = rootCfg.initInMemoMaxSize || maxInitQueueSize;\n\n                    _handleIKeyEndpointPromises(rootCfg);\n\n                    // Mark the extensionConfig and all first level keys as referenced\n                    // This is so that calls to getExtCfg() will always return the same object\n                    // Even when a user may \"re-assign\" the plugin properties (or it's unloaded/reloaded)\n                    let extCfg = details.ref(details.cfg, STR_EXTENSION_CONFIG);\n                    objForEachKey(extCfg, (key) => {\n                        details.ref(extCfg, key);\n                    });\n\n                    if (rootCfg.traceHdrMode !== _serverTraceHdrMode) {\n                        // Create a new trace context if it doesn't exist and the mode is not None\n                        _serverOTelCtx = _getParentTraceCtx(rootCfg.traceHdrMode);\n                        _serverTraceHdrMode = rootCfg.traceHdrMode;\n                    }\n                }));\n\n                _notificationManager = notificationManager;\n\n                // Initialize the debug listener outside of the closure to reduce the retained memory footprint\n                _debugListener = _initDebugListener(_configHandler, _hookContainer, _notificationManager && _self.getNotifyMgr(), _debugListener);\n                _initPerfManager();\n\n                _self.logger = logger;\n\n                let cfgExtensions = config.extensions;\n\n                // Extension validation\n                _configExtensions = [];\n                _configExtensions.push(...extensions, ...cfgExtensions);\n                _channelConfig = config.channels;\n\n                _initPluginChain(null);\n\n                if (!_channels || _channels.length === 0) {\n                    throwError(\"No \" + STR_CHANNELS + \" available\");\n                }\n                \n                if (_channelConfig && _channelConfig.length > 1) {\n                    let teeController = _self.getPlugin(\"TeeChannelController\");\n                    if (!teeController || !teeController.plugin) {\n                        _throwInternal(_logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.SenderNotInitialized, \"TeeChannel required\");\n                    }\n                }\n\n                _registerDelayedCfgListener(config, _cfgListeners, _logger);\n                _cfgListeners = null;\n\n                _isInitialized = true;\n                if (_activeStatus === ActiveStatus.ACTIVE) {\n                    _releaseQueues();\n                }\n                \n            };\n        \n            _self.getChannels = (): IChannelControls[] => {\n                let controls: IChannelControls[] = [];\n                if (_channels) {\n                    arrForEach(_channels, (channel) => {\n                        controls.push(channel);\n                    });\n                }\n\n                return objFreeze(controls);\n            };\n        \n            _self.track = (telemetryItem: ITelemetryItem) => {\n                doPerf(_self.getPerfMgr(), () => \"AppInsightsCore:track\", () => {\n                    if (telemetryItem === null) {\n                        _notifyInvalidEvent(telemetryItem);\n                        // throw error\n                        throwError(\"Invalid telemetry item\");\n                    }\n                    \n                    // do basic validation before sending it through the pipeline\n                    if (!telemetryItem.name && isNullOrUndefined(telemetryItem.name)) {\n                        _notifyInvalidEvent(telemetryItem);\n                        throwError(\"telemetry name required\");\n                    }\n            \n                    // setup default iKey if not passed in\n                    telemetryItem.iKey = telemetryItem.iKey || _instrumentationKey;\n\n                    // add default timestamp if not passed in\n                    telemetryItem.time = telemetryItem.time || toISOString(new Date());\n\n                    // Common Schema 4.0\n                    telemetryItem.ver = telemetryItem.ver || \"4.0\";\n            \n                    if (!_isUnloading && _self.isInitialized() && _activeStatus === ActiveStatus.ACTIVE) {\n                        // Process the telemetry plugin chain\n                        _createTelCtx().processNext(telemetryItem);\n                    } else if (_activeStatus !== ActiveStatus.INACTIVE){\n                        // Queue events until all extensions are initialized\n                        if (_eventQueue.length <= _initInMemoMaxSize) {\n                            // set limit, if full, stop adding new events\n                            _eventQueue.push(telemetryItem);\n                        }\n                     \n                    }\n                }, () => ({ item: telemetryItem }), !((telemetryItem as any).sync));\n            };\n        \n            _self.getProcessTelContext = _createTelCtx;\n\n            _self.getNotifyMgr = (): INotificationManager => {\n                if (!_notificationManager) {\n                    _notificationManager = new NotificationManager(_configHandler.cfg);\n                    // For backward compatibility only\n                    (_self as any)[strNotificationManager] = _notificationManager;\n                }\n\n                return _notificationManager;\n            };\n\n            /**\n             * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n             * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n             * called.\n             * @param listener - An INotificationListener object.\n             */\n            _self.addNotificationListener = (listener: INotificationListener): void => {\n                _self.getNotifyMgr().addNotificationListener(listener);\n            };\n        \n            /**\n             * Removes all instances of the listener.\n             * @param listener - INotificationListener to remove.\n             */\n            _self.removeNotificationListener = (listener: INotificationListener): void => {\n                if (_notificationManager) {\n                    _notificationManager.removeNotificationListener(listener);\n                }\n            };\n        \n            _self.getCookieMgr = (): ICookieMgr => {\n                if (!_cookieManager) {\n                    _cookieManager = createCookieMgr(_configHandler.cfg, _self.logger);\n                }\n\n                return _cookieManager;\n            };\n\n            _self.setCookieMgr = (cookieMgr: ICookieMgr) => {\n                if (_cookieManager !== cookieMgr) {\n                    runTargetUnload(_cookieManager, false);\n    \n                    _cookieManager = cookieMgr;\n                }\n            };\n\n            _self.getPerfMgr = (): IPerfManager => {\n                return _perfManager || _cfgPerfManager || getGblPerfMgr();\n            };\n\n            _self.setPerfMgr = (perfMgr: IPerfManager) => {\n                _perfManager = perfMgr;\n            };\n\n            // _self.getStatsBeat = (statsBeatState: IStatsBeatState) => {\n            //     // create a new statsbeat if not initialize yet or the endpoint is different\n            //     // otherwise, return the existing one, or null\n\n            //     if (statsBeatState) {\n            //         if (_statsMgr && _statsMgr.enabled) {\n            //             if (_statsBeat && _statsBeat.endpoint !== statsBeatState.endpoint) {\n            //                 // Different endpoint, so unload the existing and create a new one\n            //                 _statsBeat.enabled = false;\n            //                 _statsBeat = null;\n            //             }\n\n            //             if (!_statsBeat) {\n            //                 // Create a new statsbeat instance\n            //                 _statsBeat = _statsMgr.newInst(statsBeatState);\n            //             }\n            //         } else if (_statsBeat) {\n            //             // Disable and remove any previously created statsbeat instance\n            //             _statsBeat.enabled = false;\n            //             _statsBeat = null;\n            //         }\n\n            //         // Return the current statsbeat instance or null if not created\n            //         return _statsBeat;\n            //     }\n\n            //     // Return null as no statsbeat state was provided\n            //     return null;\n            // };\n\n            // _self.setStatsMgr = (statsMgr: IStatsMgr) => {\n            //     if (_statsMgr && _statsMgr !== statsMgr) {\n            //         // Disable any previously created statsbeat instance\n            //         if (_statsBeat) {\n            //             _statsBeat.enabled = false;\n            //             _statsBeat = null;\n            //         }\n            //     }\n\n            //     _statsMgr = statsMgr;\n            // };\n\n            _self.eventCnt = (): number => {\n                return _eventQueue.length;\n            };\n\n            _self.releaseQueue = () => {\n                if (_isInitialized && _eventQueue.length > 0) {\n                    let eventQueue = _eventQueue;\n                    _eventQueue = [];\n                    if (_activeStatus === eActiveStatus.ACTIVE) {\n                        arrForEach(eventQueue, (event: ITelemetryItem) => {\n                            event.iKey = event.iKey || _instrumentationKey;\n                            _createTelCtx().processNext(event);\n                        });\n\n                    } else {\n                        // new one for msg ikey\n                        _throwInternal(_logger, eLoggingSeverity.WARNING, _eInternalMessageId.FailedToSendQueuedTelemetry, \"core init status is not active\");\n                    }\n\n               \n                }\n            };\n\n            _self.pollInternalLogs = (eventName?: string): ITimerHandler => {\n                _internalLogsEventName = eventName || null;\n                _forceStopInternalLogPoller = false;\n                _internalLogPoller && _internalLogPoller.cancel();\n\n                return _startLogPoller(true);\n            };\n\n            function _handleIKeyEndpointPromises(theConfig: IConfiguration) {\n                // app Insights core only handle ikey and endpointurl, aisku will handle cs\n                // But we want to reference these config values so that if any future changes are made\n                // this will trigger the re-run of the watch function\n                // and the ikey and endpointUrl will be set to the new values\n                let ikey = theConfig.instrumentationKey;\n                let endpointUrl = theConfig.endpointUrl; // do not need to validate endpoint url, if it is null, default one will be set by sender\n\n                // Check if we are waiting for previous promises to be resolved, won't apply new changes\n                if (_activeStatus !== eActiveStatus.PENDING) {\n                    if (isNullOrUndefined(ikey)) {\n                        _instrumentationKey = null;\n\n                        // if new ikey is null, set status to be inactive, all new events will be saved in memory or dropped\n                        _activeStatus = ActiveStatus.INACTIVE;\n                        let msg = \"Please provide instrumentation key\";\n\n                        if (!_isInitialized) {\n                            // only throw error during initialization\n                            throwError(msg);\n                        } else {\n                            _throwInternal(_logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.InvalidInstrumentationKey, msg);\n                            _releaseQueues();\n                        }\n\n                        return;\n                    }\n\n                    let promises: IPromise<string>[] = [];\n                    if (isPromiseLike(ikey)) {\n                        promises.push(ikey);\n                        _instrumentationKey = null; // reset current local ikey variable (otherwise it will always be the previous ikeys if timeout is called before promise cb)\n                    } else {\n                        // string\n                        _instrumentationKey = ikey;\n                    }\n\n                    if (isPromiseLike(endpointUrl)) {\n                        promises.push(endpointUrl);\n                        _endpoint = null; // reset current local endpoint variable (otherwise it will always be the previous urls if timeout is called before promise cb)\n                    } else {\n                        // string or null\n                        _endpoint = endpointUrl;\n                    }\n\n                    // at least have one promise\n                    if (promises.length) {\n                        _waitForInitPromises(theConfig, promises);\n                    } else {\n                        // means no promises\n                        _setStatus();\n                    }\n                }\n            }\n\n            function _waitForInitPromises(theConfig: IConfiguration, promises: IPromise<string>[]) {\n                // reset to false for new dynamic changes\n                _isStatusSet = false;\n                _activeStatus = eActiveStatus.PENDING;\n                let initTimeout = isNotNullOrUndefined(theConfig.initTimeOut)?  theConfig.initTimeOut : maxInitTimeout; // theConfig.initTimeOut could be 0\n                let allPromises = createSyncAllSettledPromise<string>(promises);\n\n                if (_initTimer) {\n                    // Stop any previous timer\n                    _initTimer.cancel();\n                }\n\n                _initTimer = scheduleTimeout(() => {\n                    // set _isStatusSet to true\n                    // set active status\n                    // release queues\n                    _initTimer = null;\n                    if (!_isStatusSet) {\n                        _setStatus();\n                    }\n                }, initTimeout);\n            \n                doAwaitResponse(allPromises, (response) => {\n                    try {\n                        if (_isStatusSet) {\n                            // promises take too long to resolve, ignore them\n                            // active status should be set by timeout already\n                            return;\n                        }\n\n                        if (!response.rejected) {\n                            let values = response.value;\n                            if (values && values.length) {\n                                // ikey\n                                let ikeyRes = values[0];\n                                _instrumentationKey = ikeyRes && ikeyRes.value;\n\n                                // endpoint\n                                if (values.length > 1) {\n                                    let endpointRes = values[1];\n                                    _endpoint = endpointRes &&  endpointRes.value;\n                                }\n                            }\n\n                            if (_instrumentationKey) {\n                                // if ikey is null, no need to trigger extra dynamic changes for extensions\n                                theConfig.instrumentationKey = _instrumentationKey; // set config.instrumentationKey for extensions to consume\n                                theConfig.endpointUrl = _endpoint; // set config.endpointUrl for extensions to consume\n                            }\n                        }\n\n                        // set _isStatusSet to true\n                        // set active status\n                        // release queues\n                        _setStatus();\n                    } catch (e) {\n                        if (!_isStatusSet){\n                            _setStatus();\n                        }\n                    }\n                });\n            }\n    \n            function _setStatus() {\n                _isStatusSet = true;\n                if (isNullOrUndefined(_instrumentationKey)) {\n                    _activeStatus = ActiveStatus.INACTIVE;\n                    _throwInternal(_logger, eLoggingSeverity.CRITICAL, _eInternalMessageId.InitPromiseException, \"ikey can't be resolved from promises\");\n                } else {\n                    _activeStatus = ActiveStatus.ACTIVE;\n                }\n                _releaseQueues();\n\n            }\n\n            function _releaseQueues() {\n                if (_isInitialized) {\n                    _self.releaseQueue();\n                    _self.pollInternalLogs();\n                }\n            }\n\n            function _startLogPoller(alwaysStart?: boolean): ITimerHandler {\n                if ((!_internalLogPoller || !_internalLogPoller.enabled) && !_forceStopInternalLogPoller) {\n                    let shouldStart = alwaysStart || (_logger && _logger.queue.length > 0);\n                    if (shouldStart) {\n                        if (!_internalLogPollerListening) {\n                            _internalLogPollerListening = true;\n\n                            // listen for any configuration changes so that changes to the\n                            // interval will cause the timer to be re-initialized\n                            _addUnloadHook(_configHandler.watch((details) => {\n                                let interval: number = details.cfg.diagnosticLogInterval;\n                                if (!interval || !(interval > 0)) {\n                                    interval = 10000;\n                                }\n\n                                let isRunning = false;\n                                if (_internalLogPoller) {\n                                    // It was already created so remember it's running and cancel\n                                    isRunning = _internalLogPoller.enabled;\n                                    _internalLogPoller.cancel();\n                                }\n\n                                // Create / reconfigure\n                                _internalLogPoller = createTimeout(_flushInternalLogs, interval) as any;\n                                _internalLogPoller.unref();\n\n                                // Restart if previously running\n                                _internalLogPoller.enabled = isRunning;\n                            }));\n                        }\n\n                        _internalLogPoller.enabled = true;\n                    }\n                }\n\n                return _internalLogPoller;\n            }\n\n            _self.stopPollingInternalLogs = (): void => {\n                _forceStopInternalLogPoller = true;\n                _internalLogPoller && _internalLogPoller.cancel();\n                _flushInternalLogs();\n            };\n\n            // Add addTelemetryInitializer\n            proxyFunctions(_self, () => _telemetryInitializerPlugin, [ \"addTelemetryInitializer\" ]);\n\n            _self.unload = (isAsync: boolean = true, unloadComplete?: (unloadState: ITelemetryUnloadState) => void, cbTimeout?: number): void | IPromise<ITelemetryUnloadState> => {\n                if (!_isInitialized) {\n                    // The SDK is not initialized\n                    throwError(strSdkNotInitialized);\n                }\n\n                // Check if the SDK still unloading so throw\n                if (_isUnloading) {\n                    // The SDK is already unloading\n                    throwError(strSdkUnloadingError);\n                }\n\n                let unloadState: ITelemetryUnloadState = {\n                    reason: TelemetryUnloadReason.SdkUnload,\n                    isAsync: isAsync,\n                    flushComplete: false\n                };\n\n                let result: IPromise<ITelemetryUnloadState>;\n                if (isAsync && !unloadComplete) {\n                    result = createPromise<ITelemetryUnloadState>((resolve) => {\n                        // Set the callback to the promise resolve callback\n                        unloadComplete = resolve;\n                    });\n                }\n\n                let processUnloadCtx = createProcessTelemetryUnloadContext(_getPluginChain(), _self);\n                processUnloadCtx.onComplete(() => {\n                    // if (_statsBeat) {\n                    //     // Disable any statsbeat instance\n                    //     _statsBeat.enabled = false;\n                    //     _statsBeat = null;\n                    // }\n\n                    _hookContainer.run(_self.logger);\n\n                    // Run any \"unload\" functions for the _cookieManager, _notificationManager and _logger\n                    doUnloadAll([_cookieManager, _notificationManager, _logger], isAsync, () => {\n                        _initDefaults();\n                        unloadComplete && unloadComplete(unloadState);\n                    });\n                }, _self);\n\n                function _doUnload(flushComplete: boolean) {\n                    unloadState.flushComplete = flushComplete;\n                    _isUnloading = true;\n\n                    // Run all of the unload handlers first (before unloading the plugins)\n                    _unloadHandlers.run(processUnloadCtx, unloadState);\n                    \n                    // Stop polling the internal logs\n                    _self.stopPollingInternalLogs();\n\n                    // Start unloading the components, from this point onwards the SDK should be considered to be in an unstable state\n                    processUnloadCtx.processNext(unloadState);\n                }\n\n                _flushInternalLogs();\n\n                if (!_flushChannels(isAsync, _doUnload, SendRequestReason.SdkUnload, cbTimeout)) {\n                    _doUnload(false);\n                }\n\n                return result;\n            };\n\n            _self.getPlugin = _getPlugin;\n\n            _self.addPlugin = <T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting?: boolean, isAsync?: boolean, addCb?: (added?: boolean) => void): void => {\n                if (!plugin) {\n                    addCb && addCb(false);\n                    _logOrThrowError(strValidationError);\n                    return;\n                }\n\n                let existingPlugin = _getPlugin(plugin.identifier);\n                if (existingPlugin && !replaceExisting) {\n                    addCb && addCb(false);\n\n                    _logOrThrowError(\"Plugin [\" + plugin.identifier + \"] is already loaded!\");\n                    return;\n                }\n\n                let updateState: ITelemetryUpdateState = {\n                    reason: TelemetryUpdateReason.PluginAdded\n                };\n\n                function _addPlugin(removed: boolean) {\n                    _configExtensions.push(plugin);\n                    updateState.added = [plugin];\n\n                    // Re-Initialize the plugin chain\n                    _initPluginChain(updateState);\n                    addCb && addCb(true);\n                }\n\n                if (existingPlugin) {\n                    let removedPlugins: IPlugin[] = [existingPlugin.plugin];\n                    let unloadState: ITelemetryUnloadState = {\n                        reason: TelemetryUnloadReason.PluginReplace,\n                        isAsync: !!isAsync\n                    };\n\n                    _removePlugins(removedPlugins, unloadState, (removed) => {\n                        if (!removed) {\n                            // Previous plugin was successfully removed or was not installed\n                            addCb && addCb(false);\n                        } else {\n                            updateState.removed = removedPlugins\n                            updateState.reason |= TelemetryUpdateReason.PluginRemoved;\n                            _addPlugin(true);\n                        }\n                    });\n                } else {\n                    _addPlugin(false);\n                }\n            };\n\n            _self.updateCfg = (newConfig: CfgType, mergeExisting: boolean = true) => {\n                let updateState: ITelemetryUpdateState;\n                if (_self.isInitialized()) {\n                    updateState = {\n                        reason: TelemetryUpdateReason.ConfigurationChanged,\n                        cfg: _configHandler.cfg,\n                        oldCfg: deepExtend({}, _configHandler.cfg),\n                        newConfig: deepExtend({}, newConfig),\n                        merge: mergeExisting\n                    };\n\n                    newConfig = updateState.newConfig as CfgType;\n                    let cfg =  _configHandler.cfg;\n\n                    // replace the immutable (if initialized) values\n                    // We don't currently allow updating the extensions and channels via the update config\n                    // So overwriting any user provided values to reuse the existing values\n                    (newConfig as any).extensions = cfg.extensions;\n                    (newConfig as any).channels = cfg.channels;\n                }\n\n                // Explicitly blocking any previous config watchers so that they don't get called because\n                // of this bulk update (Probably not necessary)\n                (_configHandler as _IInternalDynamicConfigHandler<CfgType>)._block((details) => {\n\n                    // Lets assign the new values to the existing config either overwriting or re-assigning\n                    let theConfig = details.cfg;\n                    _deepMergeConfig(details, theConfig, newConfig, mergeExisting);\n\n                    if (!mergeExisting) {\n                        // Remove (unassign) the values \"missing\" from the newConfig and also not in the default config\n                        objForEachKey(theConfig, (key) => {\n                            if (!objHasOwn(newConfig, key)) {\n                                // Set the value to undefined\n                                details.set(theConfig, key, UNDEFINED_VALUE);\n                            }\n                        });\n                    }\n\n                    // Apply defaults to the new config\n                    details.setDf(theConfig, defaultConfig as any);\n                }, true);\n\n                // Now execute all of the listeners (synchronously) so they update their values immediately\n                _configHandler.notify();\n\n                if (updateState) {\n                    _doUpdate(updateState);\n                }\n            };\n\n            _self.evtNamespace = (): string => {\n                return _evtNamespace;\n            };\n\n            _self.flush = _flushChannels;\n        \n            _self.getTraceCtx = (createNew?: boolean): IDistributedTraceContext | null => {\n\n                if ((!_traceCtx && createNew !== false) || createNew === true) {\n                    _traceCtx = createDistributedTraceContext(_serverOTelCtx);\n                }\n\n                return _traceCtx;\n            };\n\n            _self.setTraceCtx = (traceCtx: IDistributedTraceContext): void => {\n                _traceCtx = traceCtx || null;\n            };\n\n            _self.startSpan = (name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan | null => {\n                if (!_traceProvider || !_traceProvider.v || !_traceProvider.v.isAvailable()) {\n                    // No trace provider available or provider is not ready\n                    return null;\n                }\n\n                return _traceProvider.v.createSpan(name, options, parent || _self.getTraceCtx());\n            };\n\n            /**\n             * Return the current active span\n             * @param createNew - Optional flag to create a non-recording span if no active span exists, defaults to true\n             */\n            _self.getActiveSpan = (createNew?: boolean): IReadableSpan | null => {\n                // Special case for when there is no active span but there is a trace provider\n                if (createNew !== false && _traceProvider && !_activeSpan && _traceProvider.v) {\n                    // Now that we have a trace provider, ensure that we return an active span (non-recording)\n                    _activeSpan = _traceProvider.v.createSpan(_traceProvider.v.getProviderId(), {\n                        recording: false,\n                        root: true\n                    });\n                }\n\n                return _activeSpan;\n            };\n\n            /**\n             * Set the current Active Span\n             * @param span - The span to set as the active span\n             */\n            _self.setActiveSpan = (span: IReadableSpan): ISpanScope => {\n                let theSpanContext: IDistributedTraceContext | null = null;\n                let currentCtx: IDistributedTraceContext = _self.getTraceCtx();\n                let currentSpan: IReadableSpan | null = _activeSpan;\n                let scope: ISpanScope;\n\n                if (span) {\n                    let otelSpanContext: IDistributedTraceContext | IOTelSpanContext = null;\n                    if (span.spanContext) {\n                        // May be a valid IDistributedTraceContext or an OpenTelemetry SpanContext\n                        otelSpanContext = span.spanContext();\n                    } else if ((span as any).context) {\n                        // Legacy OpenTelemetry API support (Note: The returned context won't be a valid IDistributedTraceContext)\n                        otelSpanContext = (span as any).context();\n                    }\n\n                    if (otelSpanContext) {\n                        if (isDistributedTraceContext(otelSpanContext)) {\n                            theSpanContext = otelSpanContext;\n                        } else {\n                            // Support Spans from other libraries that may not be using the IDistributedTraceContext\n                            // If the spanContext is not a valid IDistributedTraceContext then we need to create a new one\n                            // and optionally set the parentSpanContext if it exists\n\n                            // Create a new context using the current trace context as the parent\n                            theSpanContext = createDistributedTraceContext(currentCtx);\n\n                            let parentContext: any = span.parentSpanContext;\n                            if (!parentContext) {\n                                if (span.parentSpanId) {\n                                    parentContext = {\n                                        traceId: (otelSpanContext as any).traceId,\n                                        spanId: span.parentSpanId\n                                    };\n                                }\n                            }\n\n                            // Was there a defined parent context and is it different from the current basic context\n                            if (parentContext && parentContext.traceId !== theSpanContext.traceId &&\n                                    parentContext.spanId !== theSpanContext.spanId &&\n                                    parentContext.traceFlags !== theSpanContext.traceFlags) {\n\n                                // Assign the parent details to this new context\n                                theSpanContext.traceId = parentContext.traceId;\n                                theSpanContext.spanId = parentContext.spanId;\n                                theSpanContext.traceFlags = parentContext.traceFlags;\n\n                                // Now create a new \"Child\" context which is extending the parent context\n                                theSpanContext = createDistributedTraceContext(theSpanContext);\n                            }\n\n                            theSpanContext.traceId = (otelSpanContext as any).traceId;\n                            theSpanContext.spanId = (otelSpanContext as any).spanId;\n                            theSpanContext.traceFlags = (otelSpanContext as any).traceFlags;\n                        }\n                    }\n                }\n                \n                scope = {\n                    host: _self,\n                    span: span,\n                    prvSpan: currentSpan,\n                    restore: () => {\n                        // Restore the current span and trace context\n                        if (currentSpan) {\n                            _self.setActiveSpan(currentSpan);\n                        } else {\n                            _activeSpan = null;\n                            _self.setTraceCtx(currentCtx);\n                        }\n\n                        // Clear the restore function, so that multiple calls to restore do not have any effect\n                        scope.restore = _noopVoid;\n                    }\n                };\n\n                // Change the active span to the new span\n                _activeSpan = span;\n\n                // Set the current trace context for the core SDK\n                // This is REQUIRED for the SDK to correctly associate telemetry with the current span context\n                if (theSpanContext) {\n                    _self.setTraceCtx(theSpanContext);\n                }\n\n                return scope;\n            };\n\n            _self.setTraceProvider = (traceProvider: ICachedValue<ITraceProvider>): void => {\n                _traceProvider = traceProvider;\n            };\n\n            _self.getTraceProvider = (): ITraceProvider | null => {\n                return _traceProvider ? _traceProvider.v : null;\n            };\n\n            _self.addUnloadHook = _addUnloadHook;\n\n            // Create the addUnloadCb\n            proxyFunctionAs(_self, \"addUnloadCb\", () => _unloadHandlers, \"add\");\n\n            _self.onCfgChange = (handler: WatcherFunction<CfgType>): IUnloadHook => {\n                let unloadHook: IUnloadHook;\n                if (!_isInitialized) {\n                    unloadHook = _addDelayedCfgListener(_cfgListeners, handler);\n                } else {\n                    unloadHook = onConfigChange(_configHandler.cfg, handler, _self.logger);\n                }\n\n                return _createUnloadHook(unloadHook);\n            };\n\n            _self.getWParam = () => {\n                return (hasDocument() || !!_configHandler.cfg.enableWParam) ? 0 : -1;\n            };\n\n\n            function _setPluginVersions() {\n                let thePlugins: { [key: string]: IPlugin } = {};\n\n                _pluginVersionStringArr = [];\n\n                const _addPluginVersions = (plugins: IPlugin[]) => {\n                    if (plugins) {\n                        arrForEach(plugins, (plugin) => {\n                            if (plugin.identifier && plugin.version && !thePlugins[plugin.identifier]) {\n                                let ver = plugin.identifier + \"=\" + plugin.version;\n                                _pluginVersionStringArr.push(ver);\n                                thePlugins[plugin.identifier] = plugin;\n                            }\n                        });\n                    }\n                }\n\n                _addPluginVersions(_channels);\n                if (_channelConfig) {\n                    arrForEach(_channelConfig, (channels) => {\n                        _addPluginVersions(channels);\n                    });\n                }\n\n                _addPluginVersions(_configExtensions);\n            }\n\n            function _initDefaults() {\n                _isInitialized = false;\n\n                // Use a default logger so initialization errors are not dropped on the floor with full logging\n                _configHandler = createDynamicConfig({} as CfgType, defaultConfig as any, _self.logger);\n\n                // Set the logging level to critical so that any critical initialization failures are displayed on the console\n                _configHandler.cfg.loggingLevelConsole = eLoggingSeverity.CRITICAL;\n\n                // Define _self.config\n                objDefine(_self, \"config\", {\n                    g: () => _configHandler.cfg,\n                    s: (newValue) => {\n                        _self.updateCfg(newValue, false);\n                    }\n                });\n\n                objDefine(_self, \"pluginVersionStringArr\", {\n                    g: () => {\n                        if (!_pluginVersionStringArr) {\n                            _setPluginVersions();\n                        }\n\n                        return _pluginVersionStringArr;\n                    }\n                });\n\n                objDefine(_self, \"pluginVersionString\", {\n                    g: () => {\n                        if (!_pluginVersionString) {\n                            if (!_pluginVersionStringArr) {\n                                _setPluginVersions();\n                            }\n\n                            _pluginVersionString = _pluginVersionStringArr.join(\";\");\n                        }\n\n                        return _pluginVersionString || STR_EMPTY;\n                    }\n                });\n\n                objDefine(_self, \"logger\", {\n                    g: () => {\n                        if (!_logger) {\n                            _logger = new DiagnosticLogger(_configHandler.cfg);\n                            _configHandler.logger = _logger;\n                        }\n\n                        return _logger;\n                    },\n                    s: (newLogger) => {\n                        _configHandler.logger = newLogger;\n                        if (_logger !== newLogger) {\n                            runTargetUnload(_logger, false);\n                            _logger = newLogger;\n                        }\n                    }\n                });\n\n                _self.logger = new DiagnosticLogger(_configHandler.cfg);\n                _extensions = [];\n                let cfgExtensions = _self.config.extensions || [];\n                cfgExtensions.splice(0, cfgExtensions.length);\n                arrAppend(cfgExtensions, _extensions);\n\n                _telemetryInitializerPlugin = new TelemetryInitializerPlugin();\n                _serverOTelCtx = null;\n                _serverTraceHdrMode = eTraceHeadersMode.None;\n                _eventQueue = [];\n                runTargetUnload(_notificationManager, false);\n                _notificationManager = null;\n                _perfManager = null;\n                // _statsBeat = null;\n                _cfgPerfManager = null;\n                runTargetUnload(_cookieManager, false);\n                _cookieManager = null;\n                _pluginChain = null;\n                _configExtensions = [];\n                _channelConfig = null;\n                _channels = null;\n\n                _isUnloading = false;\n                _internalLogsEventName = null;\n                _evtNamespace = createUniqueNamespace(\"AIBaseCore\", true);\n                _unloadHandlers = createUnloadHandlerContainer();\n                _traceCtx = null;\n                _traceProvider = null;\n                _instrumentationKey = null;\n                _hookContainer = createUnloadHookContainer();\n                _cfgListeners = [];\n                _pluginVersionString = null;\n                _pluginVersionStringArr = null;\n                _forceStopInternalLogPoller = false;\n                _internalLogPoller = null;\n                _internalLogPollerListening = false;\n                _activeStatus = eActiveStatus.NONE; // default is None\n                _endpoint = null;\n                _initInMemoMaxSize = null;\n                _isStatusSet = false;\n                _initTimer = null;\n                // if (_statsBeat) {\n                //     // Unload and disable any statsbeat instance\n                //     _statsBeat.enabled = false;\n                // }\n                // _statsBeat = null;\n            }\n\n            function _createTelCtx(): IProcessTelemetryContext {\n                let theCtx = createProcessTelemetryContext(_getPluginChain(), _configHandler.cfg, _self);\n                theCtx.onComplete(_startLogPoller);\n\n                return theCtx;\n            }\n\n            // Initialize or Re-initialize the plugins\n            function _initPluginChain(updateState: ITelemetryUpdateState | null) {\n                // Extension validation\n                let theExtensions = _validateExtensions(_self.logger, ChannelControllerPriority, _configExtensions);\n            \n                _pluginChain = null;\n                _pluginVersionString = null;\n                _pluginVersionStringArr = null;\n    \n                // Get the primary channel queue and include as part of the normal extensions\n                _channels = (_channelConfig || [])[0] ||[];\n                \n                // Add any channels provided in the extensions and sort them\n                _channels = sortPlugins(arrAppend(_channels, theExtensions.channels));\n\n                // Create an array of all extensions, including the _channels\n                let allExtensions = arrAppend(sortPlugins(theExtensions.core), _channels);\n\n                // Required to allow plugins to call core.getPlugin() during their own initialization\n                _extensions = objFreeze(allExtensions);\n\n                // This has a side effect of adding the extensions passed during initialization\n                // into the config.extensions, so you can see all of the extensions loaded.\n                // This will also get updated by the addPlugin() and remove plugin code.\n                let cfgExtensions = _self.config.extensions || [];\n                cfgExtensions.splice(0, cfgExtensions.length);\n                arrAppend(cfgExtensions, _extensions);\n\n                let rootCtx = _createTelCtx();\n\n                // Initializing the channels first\n                if (_channels && _channels.length > 0) {\n                    initializePlugins(rootCtx.createNew(_channels), allExtensions);\n                }\n\n                // Now initialize the normal extensions (explicitly not including the _channels as this can cause duplicate initialization)\n                initializePlugins(rootCtx, allExtensions);\n\n                if (updateState) {\n                    _doUpdate(updateState);\n                }\n            }\n\n            function _getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T> {\n                let theExt: ILoadedPlugin<T> = null;\n                let thePlugin: IPlugin = null;\n                let channelHosts: IChannelControlsHost[] = [];\n\n                arrForEach(_extensions, (ext: any) => {\n                    if (ext.identifier === pluginIdentifier && ext !== _telemetryInitializerPlugin) {\n                        thePlugin = ext;\n                        return -1;\n                    }\n\n                    if ((ext as IChannelControlsHost).getChannel) {\n                        channelHosts.push(ext as IChannelControlsHost);\n                    }\n                });\n\n                if (!thePlugin && channelHosts.length > 0) {\n                    arrForEach(channelHosts, (host) => {\n                        thePlugin = host.getChannel(pluginIdentifier);\n                        if (!thePlugin) {\n                            return -1;\n                        }\n                    });\n                }\n\n                if (thePlugin) {\n                    theExt = {\n                        plugin: thePlugin as T,\n                        setEnabled: (enabled: boolean) => {\n                            _getPluginState(thePlugin)[STR_DISABLED] = !enabled;\n                        },\n                        isEnabled: () => {\n                            let pluginState = _getPluginState(thePlugin);\n                            return !pluginState.teardown && !pluginState[STR_DISABLED];\n                        },\n                        remove: (isAsync: boolean = true, removeCb?: (removed?: boolean) => void): void => {\n                            let pluginsToRemove: IPlugin[] = [thePlugin];\n                            let unloadState: ITelemetryUnloadState = {\n                                reason: TelemetryUnloadReason.PluginUnload,\n                                isAsync: isAsync\n                            };\n\n                            _removePlugins(pluginsToRemove, unloadState, (removed) => {\n                                if (removed) {\n                                    // Re-Initialize the plugin chain\n                                    _initPluginChain({\n                                        reason: TelemetryUpdateReason.PluginRemoved,\n                                        removed: pluginsToRemove\n                                    });\n                                }\n\n                                removeCb && removeCb(removed);\n                            });\n                        }\n                    }\n                }\n\n                return theExt;\n            }\n\n            function _getPluginChain() {\n                if (!_pluginChain) {\n                    // copy the collection of extensions\n                    let extensions = (_extensions || []).slice();\n\n                    // During add / remove this may get called again, so don't read if already present\n                    if (arrIndexOf(extensions, _telemetryInitializerPlugin) === -1) {\n                        extensions.push(_telemetryInitializerPlugin);\n                    }\n\n                    _pluginChain = createTelemetryProxyChain(sortPlugins(extensions), _configHandler.cfg, _self);\n                }\n\n                return _pluginChain;\n            }\n\n            function _removePlugins(thePlugins: IPlugin[], unloadState: ITelemetryUnloadState, removeComplete: (removed: boolean) => void) {\n\n                if (thePlugins && thePlugins.length > 0) {\n                    let unloadChain = createTelemetryProxyChain(thePlugins, _configHandler.cfg, _self);\n                    let unloadCtx = createProcessTelemetryUnloadContext(unloadChain, _self);\n\n                    unloadCtx.onComplete(() => {\n                        let removed = false;\n\n                        // Remove the listed config extensions\n                        let newConfigExtensions: IPlugin[] = [];\n                        arrForEach(_configExtensions, (plugin, idx) => {\n                            if (!_isPluginPresent(plugin, thePlugins)) {\n                                newConfigExtensions.push(plugin);\n                            } else {\n                                removed = true;\n                            }\n                        });\n\n                        _configExtensions = newConfigExtensions;\n                        _pluginVersionString = null;\n                        _pluginVersionStringArr = null;\n\n                        // Re-Create the channel config\n                        let newChannelConfig: IChannelControls[][] = [];\n                        if (_channelConfig) {\n                            arrForEach(_channelConfig, (queue, idx) => {\n                                let newQueue: IChannelControls[] = [];\n                                arrForEach(queue, (channel) => {\n                                    if (!_isPluginPresent(channel, thePlugins)) {\n                                        newQueue.push(channel);\n                                    } else {\n                                        removed = true;\n                                    }\n                                });\n\n                                newChannelConfig.push(newQueue);\n                            });\n\n                            _channelConfig = newChannelConfig;\n                        }\n\n                        removeComplete && removeComplete(removed);\n                        _startLogPoller();\n                    });\n\n                    unloadCtx.processNext(unloadState);\n                } else {\n                    removeComplete(false);\n                }\n            }\n\n            function _flushInternalLogs() {\n                if (_logger && _logger.queue) {\n                    let queue: _InternalLogMessage[] = _logger.queue.slice(0);\n                    _logger.queue.length = 0;\n\n                    arrForEach(queue, (logMessage: _InternalLogMessage) => {\n                        const item: ITelemetryItem = {\n                            name: _internalLogsEventName ? _internalLogsEventName : \"InternalMessageId: \" + logMessage.messageId,\n                            iKey: _instrumentationKey,\n                            time: toISOString(new Date()),\n                            baseType: _InternalLogMessage.dataType,\n                            baseData: { message: logMessage.message }\n                        };\n                        _self.track(item);\n                    });\n                }\n            }\n\n            function _flushChannels(isAsync?: boolean, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason, cbTimeout?: number) {\n                // Setting waiting to one so that we don't call the callBack until we finish iterating\n                let waiting = 1;\n                let doneIterating = false;\n                let cbTimer: ITimerHandler = null;\n                cbTimeout = cbTimeout || 5000;\n\n                function doCallback() {\n                    waiting--;\n                    if (doneIterating && waiting === 0) {\n                        cbTimer && cbTimer.cancel();\n                        cbTimer = null;\n    \n                        callBack && callBack(doneIterating);\n                        callBack = null;\n                    }\n                }\n                    \n                if (_channels && _channels.length > 0) {\n                    let flushCtx = _createTelCtx().createNew(_channels);\n                    flushCtx.iterate<IChannelControls>((plugin) => {\n                        if (plugin.flush) {\n                            waiting ++;\n\n                            let handled = false;\n                            // Not all channels will call this callback for every scenario\n                            if (!plugin.flush(isAsync, () => {\n                                handled = true;\n                                doCallback();\n                            }, sendReason)) {\n                                if (!handled) {\n                                    // If any channel doesn't return true and it didn't call the callback, then we should assume that the callback\n                                    // will never be called, so use a timeout to allow the channel(s) some time to \"finish\" before triggering any\n                                    // followup function (such as unloading)\n                                    if (isAsync && cbTimer == null) {\n                                        cbTimer = scheduleTimeout(() => {\n                                            cbTimer = null;\n                                            doCallback();\n                                        }, cbTimeout);\n                                    } else {\n                                        doCallback();\n                                    }\n                                }\n                            }\n                        }\n                    });\n                }\n\n                doneIterating = true;\n                doCallback();\n                \n                return true;\n            }\n\n            function _initPerfManager() {\n                // Save the previous config based performance manager creator to avoid creating new perf manager instances if unchanged\n                let prevCfgPerfMgr: (core: IAppInsightsCore, notificationManager: INotificationManager) => IPerfManager;\n\n                // Will get recalled if any referenced config values are changed\n                _addUnloadHook(_configHandler.watch((details) => {\n                    let enablePerfMgr = details.cfg.enablePerfMgr;\n                    if (enablePerfMgr) {\n                        let createPerfMgr = details.cfg.createPerfMgr;\n                        // for preCfgPerfMgr = createPerfMgr = null\n                        // initial createPerfMgr function should be _createPerfManager\n                        if ((prevCfgPerfMgr !== createPerfMgr) || !prevCfgPerfMgr) {\n                            if (!createPerfMgr) {\n                                createPerfMgr = _createPerfManager;\n                            }\n\n                            // Set the performance manager creation function if not defined\n                            getSetValue(details.cfg, STR_CREATE_PERF_MGR, createPerfMgr);\n                            prevCfgPerfMgr = createPerfMgr;\n\n                            // Remove any existing config based performance manager\n                            _cfgPerfManager = null;\n                        }\n\n                        // Only create the performance manager if it's not already created or manually set\n                        if (!_perfManager && !_cfgPerfManager && isFunction(createPerfMgr)) {\n                            // Create a new config based performance manager\n                            _cfgPerfManager = createPerfMgr(_self, _self.getNotifyMgr());\n                        }\n                    } else {\n                        // Remove any existing config based performance manager\n                        _cfgPerfManager = null;\n\n                        // Clear the previous cached value so it can be GC'd\n                        prevCfgPerfMgr = null;\n                    }\n                }));\n            }\n\n            function _doUpdate(updateState: ITelemetryUpdateState): void {\n                let updateCtx = createProcessTelemetryUpdateContext(_getPluginChain(), _self);\n                updateCtx.onComplete(_startLogPoller);\n\n                if (!_self._updateHook || _self._updateHook(updateCtx, updateState) !== true) {\n                    updateCtx.processNext(updateState);\n                }\n            }\n\n            function _logOrThrowError(message: string) {\n                let logger = _self.logger;\n                if (logger) {\n                    // there should always be a logger\n                    _throwInternal(logger, eLoggingSeverity.WARNING, _eInternalMessageId.PluginException, message);\n                    _startLogPoller();\n                } else {\n                    throwError(message);\n                }\n            }\n\n            function _notifyInvalidEvent(telemetryItem: ITelemetryItem): void {\n                let manager = _self.getNotifyMgr();\n                if (manager) {\n                    manager.eventsDiscarded([telemetryItem], eEventsDiscardedReason.InvalidEvent);\n                }\n            }\n\n            function _addUnloadHook(hooks: IUnloadHook | IUnloadHook[] | Iterator<IUnloadHook> | ILegacyUnloadHook | ILegacyUnloadHook[] | Iterator<ILegacyUnloadHook>) {\n                _hookContainer.add(hooks);\n            }\n        });\n    }\n\n    public initialize(config: CfgType, extensions: IPlugin[], logger?: IDiagnosticLogger, notificationManager?: INotificationManager): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getChannels(): IChannelControls[] {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public track(telemetryItem: ITelemetryItem) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getProcessTelContext(): IProcessTelemetryContext {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public getNotifyMgr(): INotificationManager {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n     * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n     * called.\n     * @param listener - An INotificationListener object.\n     */\n    public addNotificationListener(listener: INotificationListener): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Removes all instances of the listener.\n     * @param listener - INotificationListener to remove.\n     */\n    public removeNotificationListener(listener: INotificationListener): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get the current cookie manager for this instance\n     */\n    public getCookieMgr(): ICookieMgr {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Set the current cookie manager for this instance\n     * @param cookieMgr - The manager, if set to null/undefined will cause the default to be created\n     */\n    public setCookieMgr(cookieMgr: ICookieMgr) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getPerfMgr(): IPerfManager {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    // public getStatsBeat(statsBeatState: IStatsBeatState): IStatsBeat {\n    //     // @ DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    //     return null;\n    // }\n\n    // public setStatsMgr(statsMgr?: IStatsMgr): void {\n    //     // @ DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    // }\n\n    public setPerfMgr(perfMgr: IPerfManager) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public eventCnt(): number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return 0;\n    }\n\n    /**\n     * Enable the timer that checks the logger.queue for log messages to be flushed.\n     * Note: Since 3.0.1 and 2.8.13 this is no longer an interval timer but is a normal\n     * timer that is only started when this function is called and then subsequently\n     * only _if_ there are any logger.queue messages to be sent.\n     */\n    public pollInternalLogs(eventName?: string): ITimerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Stop the timer that log messages from logger.queue when available\n     */\n    public stopPollingInternalLogs(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add a telemetry processor to decorate or drop telemetry events.\n     * @param telemetryInitializer - The Telemetry Initializer function\n     * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed\n     */\n    public addTelemetryInitializer(telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered\n     * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous\n     * unload call return `true` stating that all plugins reported that they also unloaded, the recommended\n     * approach is to create a new instance and initialize that instance.\n     * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable\n     * to successfully remove any global references or they may just be completing the unload process asynchronously.\n     * If you pass isAsync as `true` (also the default) and DO NOT pass a callback function then an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the unload is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @param unloadComplete - An optional callback that will be called once the unload has completed\n     * @param cbTimeout - An optional timeout to wait for any flush operations to complete before proceeding with the\n     * unload. Defaults to 5 seconds.\n     * @returns Nothing or if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * which will be resolved once the unload is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will only be returned when no callback is provided and isAsync is true\n     */\n    public unload(isAsync?: boolean, unloadComplete?: (unloadState: ITelemetryUnloadState) => void, cbTimeout?: number): void | IPromise<ITelemetryUnloadState> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add a new plugin to the installation\n     * @param plugin - The new plugin to add\n     * @param replaceExisting - should any existing plugin be replaced, default is false\n     * @param doAsync - Should the add be performed asynchronously\n     * @param addCb - [Optional] callback to call after the plugin has been added\n     */\n    public addPlugin<T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting?: boolean, doAsync?: boolean, addCb?: (added?: boolean) => void): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Update the configuration used and broadcast the changes to all loaded plugins\n     * @param newConfig - The new configuration is apply\n     * @param mergeExisting - Should the new configuration merge with the existing or just replace it. Default is to true.\n     */\n    public updateCfg(newConfig: CfgType, mergeExisting?: boolean): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Returns the unique event namespace that should be used\n     */\n    public evtNamespace(): string {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add an unload handler that will be called when the SDK is being unloaded\n     * @param handler - the handler\n     */\n    public addUnloadCb(handler: UnloadHandler): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Flush and send any batched / cached data immediately\n     * @param async - send data asynchronously when true (defaults to true)\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @param sendReason - specify the reason that you are calling \"flush\" defaults to ManualFlush (1) if not specified\n     * @returns true if the callback will be return after the flush is complete otherwise the caller should assume that any provided callback will never be called\n     */\n    public flush(isAsync?: boolean, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n        \n    /**\n     * Gets the current distributed trace context for this instance if available, you can optional\n     * create a new instance if one does not currently exist or return null if one does not currently exist.\n     * When a server context is available it will be used as the parent context for the any new instance created\n     * (when createNew is true or no instance currently exists), calling this function will not\n     * change the current distributed trace context, it will only return the current context\n     * or create a new instance if one does not currently exist.\n     * @param createNew - Optional flag to create a new instance if one doesn't currently exist, defaults to\n     * undefined which will only create a new instance if one does not currently exist.\n     * If set to `false` then it will return null if no distributed trace context is available.\n     * If set to `true` then a new instance will be created even if one already exists.\n     * @param createNew - Optional flag to create a new instance if one doesn't currently exist, defaults to\n     */\n    public getTraceCtx(createNew?: boolean): IDistributedTraceContext | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Sets the current distributed trace context for this instance if available\n     */\n    public setTraceCtx(newTracectx: IDistributedTraceContext): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Start a new span with the given name and optional parent context.\n     * The span will become the active span for its duration unless a different\n     * span is explicitly set as active.\n     *\n     * @param name - The name of the span\n     * @param options - Options for creating the span (kind, attributes, startTime)\n     * @param parent - Optional parent context. If not provided, uses the current active trace context\n     * @returns A new span instance, or null if no trace provider is available\n     * @since 3.4.0\n     */\n    public startSpan(name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Return the current active span, if no trace provider is available null will be returned\n     * but when a trace provider is available a span instance will always be returned, even if\n     * there is no active span (in which case a non-recording span will be returned).\n     * @param createNew - Optional flag to create a non-recording span if no active span exists, defaults to true.\n     * When false, returns the existing active span or null without creating a non-recording span.\n     * @returns The current active span or null if no trace provider is available or if createNew is false and no active span exists\n     * @since 3.4.0\n     */\n    public getActiveSpan(createNew?: boolean): IReadableSpan | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Set the current Active Span\n     * @param span - The span to set as the active span\n     * @returns An ISpanScope instance that provides the current scope, the span will always be the span passed in\n     * even when no trace provider is available\n     * @since 3.4.0\n     */\n    public setActiveSpan(span: IReadableSpan): ISpanScope {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Set the trace provider for creating spans.\n     * This allows different SKUs to provide their own span implementations.\n     *\n     * @param provider - The trace provider to use for span creation, it is passed as a cached value so that it may\n     * be implemented via a lazy / deferred initializer.\n     * @since 3.4.0\n     */\n    public setTraceProvider(provider: ICachedValue<ITraceProvider>): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get the current trace provider.\n     *\n     * @returns The current trace provider, or null if none is set\n     * @since 3.4.0\n     */\n    public getTraceProvider(): ITraceProvider | null {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Add this hook so that it is automatically removed during unloading\n     * @param hooks - The single hook or an array of IInstrumentHook objects\n     */\n    public addUnloadHook(hooks: IUnloadHook | IUnloadHook[] | Iterator<IUnloadHook> | ILegacyUnloadHook | ILegacyUnloadHook[] | Iterator<ILegacyUnloadHook>): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Watches and tracks changes for accesses to the current config, and if the accessed config changes the\n     * handler will be recalled.\n     * @param handler - The watcher handler to call when the config changes\n     * @returns A watcher handler instance that can be used to remove itself when being unloaded\n     */\n    public onCfgChange(handler: WatcherFunction<CfgType>): IUnloadHook {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Watches and tracks status of initialization process\n     * @returns ActiveStatus\n     * @since 3.3.0\n     * If returned status is active, it means initialization process is completed.\n     * If returned status is pending, it means the initialization process is waiting for promieses to be resolved.\n     * If returned status is inactive, it means ikey is invalid or can 't get ikey or enpoint url from promsises.\n     */\n    public activeStatus(): eActiveStatus | number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Set Active Status to pending, which will block the incoming changes until internal promises are resolved\n     * @internal Internal use\n     * @since 3.3.0\n     */\n    public _setPendingStatus(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n\n    protected releaseQueue() {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Hook for Core extensions to allow them to update their own configuration before updating all of the plugins.\n     * @param updateCtx - The plugin update context\n     * @param updateState - The Update State\n     * @returns boolean - True means the extension class will call updateState otherwise the Core will\n     */\n    protected _updateHook?(updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState): void | boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/AsyncUtils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise, createPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { arrSlice, getLength } from \"@nevware21/ts-utils\";\n\n/**\n * Run the unload function of the target object if it exists\n * @param target - The target object that contains the unload function\n * @param isAsync - The caller identifies whether it is expecting the operation to complete synchronously or asynchronously. Even\n * if the caller is not waiting the operation may still be performed asynchronously depending on the component and the reverse is\n * also true.\n * @returns The result of the target function\n */\nexport function runTargetUnload<T>(target: { unload?: (isAsync?: boolean) => T }, isAsync?: boolean) : T {\n    if (target && target.unload) {\n        return target.unload(isAsync);\n    }\n}\n\n/**\n * Call the unload function on all targets handling any returned [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n * / Promise before calling the next targets unload\n * @param targets - An array of the targets to unload\n * @param isAsync - The caller identifies whether it is expecting the operations to complete synchronously or asynchronously.  Even\n * if the caller is not waiting the operation may still be performed asynchronously depending on the component and the reverse is\n * also true.\n * @param done - Optional callback function to call once all of the unload functions have been called.\n */\nexport function doUnloadAll<T>(targets: Array<{ unload?: (isAsync?: boolean) => T | IPromise<T> }>, isAsync?: boolean, done?: () => void): void | IPromise<void> {\n    let result: IPromise<void>;\n\n    if (!done) {\n        result = createPromise<void>((resolved) => {\n            done = resolved;\n        });\n    }\n    if (targets && getLength(targets) > 0) {\n    \n        doAwaitResponse(runTargetUnload(targets[0], isAsync), () => {\n            doUnloadAll(arrSlice(targets, 1), isAsync, done);\n        });\n    } else {\n        done();\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/BaseTelemetryPlugin.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { isFunction, objDefine } from \"@nevware21/ts-utils\";\nimport { createDynamicConfig } from \"../config/DynamicConfig\";\nimport { STR_EXTENSION_CONFIG } from \"../constants/InternalConstants\";\nimport { safeGetLogger } from \"../diagnostics/DiagnosticLogger\";\nimport { TelemetryUnloadReason } from \"../enums/ai/TelemetryUnloadReason\";\nimport { TelemetryUpdateReason } from \"../enums/ai/TelemetryUpdateReason\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport {\n    IProcessTelemetryContext, IProcessTelemetryUnloadContext, IProcessTelemetryUpdateContext\n} from \"../interfaces/ai/IProcessTelemetryContext\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { IPlugin, ITelemetryPlugin } from \"../interfaces/ai/ITelemetryPlugin\";\nimport { ITelemetryPluginChain } from \"../interfaces/ai/ITelemetryPluginChain\";\nimport { ITelemetryUnloadState } from \"../interfaces/ai/ITelemetryUnloadState\";\nimport { ITelemetryUpdateState } from \"../interfaces/ai/ITelemetryUpdateState\";\nimport { ILegacyUnloadHook, IUnloadHook } from \"../interfaces/ai/IUnloadHook\";\nimport { IConfigDefaults } from \"../interfaces/config/IConfigDefaults\";\nimport { isNotNullOrUndefined, proxyFunctionAs } from \"../utils/HelperFuncs\";\nimport {\n    createProcessTelemetryContext, createProcessTelemetryUnloadContext, createProcessTelemetryUpdateContext\n} from \"./ProcessTelemetryContext\";\nimport { IUnloadHandlerContainer, UnloadHandler, createUnloadHandlerContainer } from \"./UnloadHandlerContainer\";\nimport { IUnloadHookContainer, createUnloadHookContainer } from \"./UnloadHookContainer\";\n\nlet strGetPlugin = \"getPlugin\";\n\nconst defaultValues: IConfigDefaults<IConfiguration> = {\n    [STR_EXTENSION_CONFIG]: { isVal: isNotNullOrUndefined, v: {} }\n};\n\n\n/**\n * BaseTelemetryPlugin provides a basic implementation of the ITelemetryPlugin interface so that plugins\n * can avoid implementation the same set of boiler plate code as well as provide a base\n * implementation so that new default implementations can be added without breaking all plugins.\n */\nexport abstract class BaseTelemetryPlugin implements ITelemetryPlugin {\n    \n    public identifier: string;\n    public version?: string;\n\n    /**\n     * Holds the core instance that was used during initialization\n     */\n    public core: IAppInsightsCore;\n\n    priority: number;\n\n    /**\n     * Call back for telemetry processing before it it is sent\n     * @param env - This is the current event being reported\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    public processNext: (env: ITelemetryItem, itemCtx: IProcessTelemetryContext) => void;\n\n    /**\n     * Set next extension for telemetry processing, this is now optional as plugins should use the\n     * processNext() function of the passed IProcessTelemetryContext instead. It is being kept for\n     * now for backward compatibility only.\n     * @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead\n     */\n    public setNextPlugin?: (next: ITelemetryPlugin | ITelemetryPluginChain) => void;\n\n    /**\n     * Returns the current diagnostic logger that can be used to log issues, if no logger is currently\n     * assigned a new default one will be created and returned.\n     */\n    public diagLog: (itemCtx?:IProcessTelemetryContext) => IDiagnosticLogger;\n\n    /**\n     * Returns whether the plugin has been initialized\n     */\n    public isInitialized: () => boolean;\n\n    /**\n     * Helper to return the current IProcessTelemetryContext, if the passed argument exists this just\n     * returns that value (helps with minification for callers), otherwise it will return the configured\n     * context or a temporary one.\n     * @param currentCtx - [Optional] The current execution context\n     */\n    protected _getTelCtx: (currentCtx?:IProcessTelemetryContext) => IProcessTelemetryContext;\n\n    /**\n     * Internal helper to allow setting of the internal initialized setting for inherited instances and unit testing\n     */\n    protected setInitialized: (isInitialized: boolean) => void;\n\n    /**\n     * Teardown / Unload hook to allow implementations to perform some additional unload operations before the BaseTelemetryPlugin\n     * finishes it's removal.\n     * @param unloadCtx - This is the context that should be used during unloading.\n     * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n     * @param asyncCallback - An optional callback that the plugin must call if it returns true to inform the caller that it has completed any async unload/teardown operations.\n     * @returns boolean - true if the plugin has or will call asyncCallback, this allows the plugin to perform any asynchronous operations.\n     */\n    protected _doTeardown?: (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void) => void | boolean;\n\n    /**\n     * Extension hook to allow implementations to perform some additional update operations before the BaseTelemetryPlugin finishes it's removal\n     * @param updateCtx - This is the context that should be used during updating.\n     * @param updateState - The details / state of the update process, it holds details like the current and previous configuration.\n     * @param asyncCallback - An optional callback that the plugin must call if it returns true to inform the caller that it has completed any async update operations.\n     * @returns boolean - true if the plugin has or will call asyncCallback, this allows the plugin to perform any asynchronous operations.\n     */\n    protected _doUpdate?: (updateCtx?: IProcessTelemetryUpdateContext, updateState?: ITelemetryUpdateState, asyncCallback?: () => void) => void | boolean;\n\n    /**\n     * Exposes the underlying unload hook container instance for this extension to allow it to be passed down to any sub components of the class.\n     * This should NEVER be exposed or called publically as it's scope is for internal use by BaseTelemetryPlugin and any derived class (which is why\n     * it's scoped as protected)\n     */\n    protected readonly _unloadHooks: IUnloadHookContainer;\n\n    constructor() {\n        let _self = this;           // Setting _self here as it's used outside of the dynamicProto as well\n\n        // NOTE!: DON'T set default values here, instead set them in the _initDefaults() function as it is also called during teardown()\n        let _isinitialized: boolean;\n        let _rootCtx: IProcessTelemetryContext; // Used as the root context, holding the current config and initialized core\n        let _nextPlugin: ITelemetryPlugin | ITelemetryPluginChain; // Used for backward compatibility where plugins don't call the main pipeline\n        let _unloadHandlerContainer: IUnloadHandlerContainer;\n        let _hookContainer: IUnloadHookContainer;\n\n        _initDefaults();\n\n        dynamicProto(BaseTelemetryPlugin, _self, (_self) => {\n\n            _self.initialize = (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain): void => {\n                _setDefaults(config, core, pluginChain);\n                _isinitialized = true;\n            }\n\n            _self.teardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                // If this plugin has already been torn down (not operational) or is not initialized (core is not set)\n                // or the core being used for unload was not the same core used for initialization.\n                let core = _self.core;\n                if (!core || (unloadCtx && core !== unloadCtx.core())) {\n                    // Do Nothing as either the plugin is not initialized or was not initialized by the current core\n                    return;\n                }\n\n                let result: void | boolean;\n                let unloadDone = false;\n                let theUnloadCtx = unloadCtx || createProcessTelemetryUnloadContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                let theUnloadState: ITelemetryUnloadState = unloadState || {\n                    reason: TelemetryUnloadReason.ManualTeardown,\n                    isAsync: false\n                };\n\n                function _unloadCallback() {\n                    if (!unloadDone) {\n                        unloadDone = true;\n\n                        _unloadHandlerContainer.run(theUnloadCtx, unloadState);\n                        _hookContainer.run(theUnloadCtx.diagLog());\n\n                        if (result === true) {\n                            theUnloadCtx.processNext(theUnloadState);\n                        }\n\n                        _initDefaults();\n                    }\n                }\n\n                if (!_self._doTeardown || _self._doTeardown(theUnloadCtx, theUnloadState, _unloadCallback) !== true) {\n                    _unloadCallback();\n                } else {\n                    // Tell the caller that we will be calling processNext()\n                    result = true;\n                }\n\n                return result;\n            };\n\n            _self.update = (updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState) => {\n                // If this plugin has already been torn down (not operational) or is not initialized (core is not set)\n                // or the core being used for unload was not the same core used for initialization.\n                let core = _self.core;\n                if (!core || (updateCtx && core !== updateCtx.core())) {\n                    // Do Nothing\n                    return;\n                }\n\n                let result: void | boolean;\n                let updateDone = false;\n                let theUpdateCtx = updateCtx || createProcessTelemetryUpdateContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);\n                let theUpdateState: ITelemetryUpdateState = updateState || {\n                    reason: TelemetryUpdateReason.Unknown\n                };\n\n                function _updateCallback() {\n                    if (!updateDone) {\n                        updateDone = true;\n                        _setDefaults(theUpdateCtx.getCfg(), theUpdateCtx.core(), theUpdateCtx.getNext());\n                    }\n                }\n\n                if (!_self._doUpdate || _self._doUpdate(theUpdateCtx, theUpdateState, _updateCallback) !== true) {\n                    _updateCallback();\n                } else {\n                    result = true;\n                }\n\n                return result;\n            };\n        \n            proxyFunctionAs(_self, \"_addUnloadCb\", () => _unloadHandlerContainer, \"add\");\n            proxyFunctionAs(_self, \"_addHook\", () => _hookContainer, \"add\");\n            objDefine(_self, \"_unloadHooks\" as keyof BaseTelemetryPlugin, { g: () => _hookContainer });\n        });\n\n        // These are added after the dynamicProto so that are not moved to the prototype\n\n        _self.diagLog = (itemCtx:IProcessTelemetryContext): IDiagnosticLogger => {\n            return _getTelCtx(itemCtx).diagLog();\n        }\n\n        _self.isInitialized = () => {\n            return _isinitialized;\n        }\n\n        _self.setInitialized = (isInitialized: boolean):void => {\n            _isinitialized = isInitialized;\n        }\n\n        // _self.getNextPlugin = () => DO NOT IMPLEMENT\n        // Sub-classes of this base class *should* not be relying on this value and instead\n        // should use processNext() function. If you require access to the plugin use the\n        // IProcessTelemetryContext.getNext().getPlugin() while in the pipeline, Note getNext() may return null.\n\n        _self.setNextPlugin = (next: ITelemetryPlugin | ITelemetryPluginChain) => {\n            _nextPlugin = next;\n        };\n\n        _self.processNext = (env: ITelemetryItem, itemCtx: IProcessTelemetryContext) => {\n            if (itemCtx) {\n                // Normal core execution sequence\n                itemCtx.processNext(env);\n            } else if (_nextPlugin && isFunction(_nextPlugin.processTelemetry)) {\n                // Looks like backward compatibility or out of band processing. And as it looks\n                // like a ITelemetryPlugin or ITelemetryPluginChain, just call processTelemetry\n                _nextPlugin.processTelemetry(env, null);\n            }\n        };\n\n        _self._getTelCtx = _getTelCtx;\n        \n        function _getTelCtx(currentCtx: IProcessTelemetryContext = null) {\n            let itemCtx:IProcessTelemetryContext = currentCtx;\n            if (!itemCtx) {\n                let rootCtx = _rootCtx || createProcessTelemetryContext(null, {}, _self.core);\n                // tslint:disable-next-line: prefer-conditional-expression\n                if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                    // Looks like a chain object\n                    itemCtx = rootCtx.createNew(null, _nextPlugin[strGetPlugin]);\n                } else {\n                    itemCtx = rootCtx.createNew(null, _nextPlugin as ITelemetryPlugin);\n                }\n            }\n            \n            return itemCtx;\n        }\n\n        function _setDefaults(config: IConfiguration, core: IAppInsightsCore, pluginChain: ITelemetryPluginChain) {\n            // Make sure the extensionConfig exists and the config is dynamic\n            createDynamicConfig(config, defaultValues, safeGetLogger(core));\n    \n            if (!pluginChain && core) {\n                // Get the first plugin from the core\n                pluginChain = core.getProcessTelContext().getNext();\n            }\n    \n            let nextPlugin: IPlugin = _nextPlugin as IPlugin;\n            if (_nextPlugin && _nextPlugin[strGetPlugin]) {\n                // If it looks like a proxy/chain then get the plugin\n                nextPlugin = _nextPlugin[strGetPlugin]();\n            }\n\n            // Support legacy plugins where core was defined as a property\n            _self.core = core;\n            _rootCtx = createProcessTelemetryContext(pluginChain, config, core, nextPlugin);\n        }\n\n        function _initDefaults() {\n            _isinitialized = false;\n            _self.core = null;\n            _rootCtx = null;\n            _nextPlugin = null;\n            _hookContainer = createUnloadHookContainer();\n            _unloadHandlerContainer = createUnloadHandlerContainer();\n        }\n    }\n\n    public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Tear down the plugin and remove any hooked value, the plugin should be removed so that it is no longer initialized and\n     * therefore could be re-initialized after being torn down. The plugin should ensure that once this has been called any further\n     * processTelemetry calls are ignored and it just calls the processNext() with the provided context.\n     * @param unloadCtx - This is the context that should be used during unloading.\n     * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n     * @returns boolean - true if the plugin has or will call processNext(), this for backward compatibility as previously teardown was synchronous and returned nothing.\n     */\n    public teardown(unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState): void | boolean {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return false;\n    }\n\n    public abstract processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;\n\n    /**\n     * The the plugin should re-evaluate configuration and update any cached configuration settings.\n     * @param updateCtx - This is the context that should be used during updating.\n     * @param updateState - The details / state of the update process, it holds details like the current and previous configuration.\n     * @returns boolean - true if the plugin has or will call updateCtx.processNext(), this allows the plugin to perform any asynchronous operations.\n     */\n    public update(updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState): void | boolean{\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add an unload handler that will be called when the SDK is being unloaded\n     * @param handler - the handler\n     */\n    protected _addUnloadCb(handler: UnloadHandler): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Add this hook so that it is automatically removed during unloading\n     * @param hooks - The single hook or an array of IInstrumentHook objects\n     */\n    protected _addHook(hooks: IUnloadHook | IUnloadHook[] | Iterator<IUnloadHook> | ILegacyUnloadHook | ILegacyUnloadHook[] | Iterator<ILegacyUnloadHook>): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/CookieMgr.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IPromise } from \"@nevware21/ts-async\";\nimport {\n    ILazyValue, arrForEach, arrIndexOf, dumpObj, getDocument, getLazy, isArray, isFunction, isNullOrUndefined, isString, isTruthy,\n    isUndefined, objForEachKey, strEndsWith, strIndexOf, strLeft, strSubstring, strTrim, utcNow\n} from \"@nevware21/ts-utils\";\nimport { cfgDfMerge } from \"../config/ConfigDefaultHelpers\";\nimport { createDynamicConfig, onConfigChange } from \"../config/DynamicConfig\";\nimport { STR_DOMAIN, STR_EMPTY, STR_PATH, UNDEFINED_VALUE } from \"../constants/InternalConstants\";\nimport { _throwInternal } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { ICookieMgr, ICookieMgrConfig } from \"../interfaces/ai/ICookieMgr\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IUnloadHook } from \"../interfaces/ai/IUnloadHook\";\nimport { IConfigDefaults } from \"../interfaces/config/IConfigDefaults\";\nimport { getLocation, getUserAgentString, isIE } from \"../utils/EnvUtils\";\nimport { getExceptionName, isNotNullOrUndefined, setValue, strContains } from \"../utils/HelperFuncs\";\n\nconst strToGMTString = \"toGMTString\";\nconst strToUTCString = \"toUTCString\";\nconst strCookie = \"cookie\";\nconst strExpires = \"expires\";\nconst strIsCookieUseDisabled = \"isCookieUseDisabled\";\nconst strDisableCookiesUsage = \"disableCookiesUsage\";\nconst strConfigCookieMgr = \"_ckMgr\";\n\n// Constants for pending cookie operations\nconst enum ePendingOp {\n    Set = 0,\n    Purge = 1\n}\n\nlet _supportsCookies: boolean = null;\nlet _allowUaSameSite: boolean = null;\nlet _parsedCookieValue: string = null;\nlet _doc: ILazyValue<Document>;\nlet _cookieCache = {};\nlet _globalCookieConfig = {};\n\n// // `isCookieUseDisabled` is deprecated, so explicitly casting as a key of IConfiguration to avoid typing error\n// // when both isCookieUseDisabled and disableCookiesUsage are used disableCookiesUsage will take precedent, which is\n// // why its listed first\n\n/**\n * Set the supported dynamic config values as undefined (or an empty object) so that\n * any listeners will be informed of any changes.\n * Explicitly NOT including the deprecated `isCookieUseDisabled` as we don't want to support\n * the v1 deprecated field as dynamic for updates\n */\nconst rootDefaultConfig: IConfigDefaults<IConfiguration> = {\n    cookieCfg: cfgDfMerge<ICookieMgrConfig>({\n        [STR_DOMAIN]: { fb: \"cookieDomain\", dfVal: isNotNullOrUndefined },\n        path: { fb: \"cookiePath\", dfVal: isNotNullOrUndefined },\n        enabled: UNDEFINED_VALUE,\n        ignoreCookies: UNDEFINED_VALUE,\n        blockedCookies: UNDEFINED_VALUE,\n        disableCookieDefer: false\n    }),\n    cookieDomain: UNDEFINED_VALUE,\n    cookiePath: UNDEFINED_VALUE,\n    [strDisableCookiesUsage]: UNDEFINED_VALUE\n};\n\nfunction _getDoc() {\n    !_doc && (_doc = getLazy(() => getDocument()));\n}\n\n/**\n * @ignore\n * DO NOT USE or export from the module, this is exposed as public to support backward compatibility of previous static utility methods only.\n * If you want to manager cookies either use the ICookieMgr available from the core instance via getCookieMgr() or create\n * your own instance of the CookieMgr and use that.\n * Using this directly for enabling / disabling cookie handling will not only affect your usage but EVERY user of cookies.\n * Example, if you are using a shared component that is also using Application Insights you will affect their cookie handling.\n * @param logger - The DiagnosticLogger to use for reporting errors.\n */\nfunction _gblCookieMgr(config?: IConfiguration, logger?: IDiagnosticLogger): ICookieMgr {\n    // Stash the global instance against the BaseCookieMgr class\n    let inst = createCookieMgr[strConfigCookieMgr] || _globalCookieConfig[strConfigCookieMgr];\n    if (!inst) {\n        // Note: not using the getSetValue() helper as that would require always creating a temporary cookieMgr\n        // that ultimately is never used\n        inst = createCookieMgr[strConfigCookieMgr] = createCookieMgr(config, logger);\n        _globalCookieConfig[strConfigCookieMgr] = inst;\n    }\n\n    return inst;\n}\n\nfunction _isMgrEnabled(cookieMgr: ICookieMgr) {\n    if (cookieMgr) {\n        return cookieMgr.isEnabled();\n    }\n\n    return true;\n}\n\nfunction _isIgnoredCookie(cookieMgrCfg: ICookieMgrConfig, name: string) {\n    if (name && cookieMgrCfg && isArray(cookieMgrCfg.ignoreCookies)) {\n        return arrIndexOf(cookieMgrCfg.ignoreCookies, name) !== -1;\n    }\n\n    return false;\n}\n\nfunction _isBlockedCookie(cookieMgrCfg: ICookieMgrConfig, name: string) {\n    if (name && cookieMgrCfg && isArray(cookieMgrCfg.blockedCookies)) {\n        if (arrIndexOf(cookieMgrCfg.blockedCookies, name) !== -1) {\n            return true;\n        }\n    }\n\n    return _isIgnoredCookie(cookieMgrCfg, name);\n}\n\nfunction _isCfgEnabled(rootConfig: IConfiguration, cookieMgrConfig: ICookieMgrConfig) {\n    let isCfgEnabled = cookieMgrConfig.enabled;\n    if (isNullOrUndefined(isCfgEnabled)) {\n        // Set the enabled from the provided setting or the legacy root values\n        let cookieEnabled: boolean;\n\n        // This field is deprecated and dynamic updates will not be fully supported\n        if (!isUndefined(rootConfig[strIsCookieUseDisabled])) {\n            cookieEnabled = !rootConfig[strIsCookieUseDisabled];\n        }\n\n        // If this value is defined it takes precedent over the above\n        if (!isUndefined(rootConfig[strDisableCookiesUsage])) {\n            cookieEnabled = !rootConfig[strDisableCookiesUsage];\n        }\n\n        // Not setting the cookieMgrConfig.enabled as that will update (set) the global dynamic config\n        // So future \"updates\" then may not be as expected\n        isCfgEnabled = cookieEnabled;\n    }\n\n    return isCfgEnabled;\n}\n\n/**\n * Helper to return the ICookieMgr from the core (if not null/undefined) or a default implementation\n * associated with the configuration or a legacy default.\n * @param core - The AppInsightsCore instance to get the cookie manager from\n * @param config - The config to use if the core is not available\n * @returns\n */\nexport function safeGetCookieMgr(core: IAppInsightsCore, config?: IConfiguration) {\n    let cookieMgr: ICookieMgr;\n    if (core) {\n        // Always returns an instance\n        cookieMgr = core.getCookieMgr();\n    } else if (config) {\n        let cookieCfg = config.cookieCfg;\n        if (cookieCfg && (cookieCfg as any)[strConfigCookieMgr]) {\n            cookieMgr = (cookieCfg as any)[strConfigCookieMgr];\n        } else {\n            cookieMgr = createCookieMgr(config);\n        }\n    }\n\n    if (!cookieMgr) {\n        // Get or initialize the default global (legacy) cookie manager if we couldn't find one\n        cookieMgr = _gblCookieMgr(config, (core || {} as any).logger);\n    }\n\n    return cookieMgr;\n}\n\nexport function createCookieMgr(rootConfig?: IConfiguration, logger?: IDiagnosticLogger): ICookieMgr {\n    let cookieMgrConfig: ICookieMgrConfig;\n    let _path: string;\n    let _domain: string;\n    let unloadHandler: IUnloadHook;\n\n    // Explicitly checking against false, so that setting to undefined will === true\n    let _enabled: boolean;\n    let _getCookieFn: (name: string) => string;\n    let _setCookieFn: (name: string, cookieValue: string) => void;\n    let _delCookieFn: (name: string, cookieValue: string) => void;\n    \n    // Buffer for storing cookie operations when cookies are disabled\n    // null = deferral disabled, array = deferral enabled with pending operations\n    let _pendingCookies: Array<{ n: string; o: ePendingOp; v?: string }> | null = [];\n\n    // Helper function to format deletion cookie value\n    function _formatDeletionValue(path?: string): string {\n        let values = {\n            [STR_PATH]: path ? path : \"/\",\n            [strExpires]: \"Thu, 01 Jan 1970 00:00:01 GMT\"\n        };\n\n        if (!isIE()) {\n            // Set max age to expire now\n            values[\"max-age\"] = \"0\";\n        }\n\n        return _formatCookieValue(STR_EMPTY, values);\n    }\n\n    // Helper function to format a cookie value with all attributes\n    function _formatSetCookieValue(value: string, maxAgeSec?: number, domain?: string, path?: string): string {\n        let values: any = {};\n        let theValue = strTrim(value || STR_EMPTY);\n        let idx = strIndexOf(theValue, \";\");\n        if (idx !== -1) {\n            theValue = strTrim(strLeft(value, idx));\n            values = _extractParts(strSubstring(value, idx + 1));\n        }\n\n        // Only update domain if not already present (isUndefined) and the value is truthy (not null, undefined or empty string)\n        setValue(values, STR_DOMAIN,  domain || _domain, isTruthy, isUndefined);\n    \n        if (!isNullOrUndefined(maxAgeSec)) {\n            const _isIE = isIE();\n            if (isUndefined(values[strExpires])) {\n                const nowMs = utcNow();\n                // Only add expires if not already present\n                let expireMs = nowMs + (maxAgeSec * 1000);\n    \n                // Sanity check, if zero or -ve then ignore\n                if (expireMs > 0) {\n                    let expiry = new Date();\n                    expiry.setTime(expireMs);\n                    setValue(values, strExpires,\n                        _formatDate(expiry, !_isIE ? strToUTCString : strToGMTString) || _formatDate(expiry, _isIE ? strToGMTString : strToUTCString) || STR_EMPTY,\n                        isTruthy);\n                }\n            }\n    \n            if (!_isIE) {\n                // Only replace if not already present\n                setValue(values, \"max-age\", STR_EMPTY + maxAgeSec, null, isUndefined);\n            }\n        }\n    \n        let location = getLocation();\n        if (location && location.protocol === \"https:\") {\n            setValue(values, \"secure\", null, null, isUndefined);\n\n            // Only set same site if not also secure\n            if (_allowUaSameSite === null) {\n                _allowUaSameSite = !uaDisallowsSameSiteNone(getUserAgentString());\n            }\n\n            if (_allowUaSameSite) {\n                setValue(values, \"SameSite\", \"None\", null, isUndefined);\n            }\n        }\n    \n        setValue(values, STR_PATH, path || _path, null, isUndefined);\n        \n        return _formatCookieValue(theValue, values);\n    }\n\n    // Helper function to remove any existing pending operations for a cookie name\n    function _removePendingCookie(name: string) {\n        if (_pendingCookies) {\n            // Remove all existing entries for this cookie name (iterate backwards to handle multiple entries safely)\n            for (let i = _pendingCookies.length - 1; i >= 0; i--) {\n                if (_pendingCookies[i].n === name) {\n                    _pendingCookies.splice(i, 1);\n                }\n            }\n        }\n    }\n\n    // Helper function to flush pending cookies when cookies become enabled\n    function _flushPendingCookies() {\n        if (areCookiesSupported(logger) && _pendingCookies) {\n            // Process all pending cookie operations in order\n            arrForEach(_pendingCookies, (pendingData) => {\n                if (!_isBlockedCookie(cookieMgrConfig, pendingData.n)) {\n                    if (pendingData.o === ePendingOp.Set) {\n                        // Apply the cached cookie value directly\n                        _setCookieFn(pendingData.n, pendingData.v);\n                    } else if (pendingData.o === ePendingOp.Purge) {\n                        // Apply the cached deletion\n                        _delCookieFn(pendingData.n, pendingData.v);\n                    }\n                }\n            });\n            // Clear the cache after flushing\n            _pendingCookies = [];\n        }\n    }\n\n    // Make sure the root config is dynamic as it may be the global config\n    rootConfig = createDynamicConfig(rootConfig || _globalCookieConfig, null, logger).cfg;\n\n    // Will get recalled if the referenced configuration is changed\n    unloadHandler = onConfigChange(rootConfig, (details) => {\n\n        // Make sure the root config has all of the the defaults to the root config to ensure they are dynamic\n        details.setDf(details.cfg, rootDefaultConfig);\n\n        // Create and apply the defaults to the cookieCfg element\n        cookieMgrConfig = details.ref(details.cfg, \"cookieCfg\"); // details.setDf(details.cfg.cookieCfg, defaultConfig);\n\n        _path = cookieMgrConfig.path || \"/\";\n        _domain = cookieMgrConfig.domain;\n        \n        // Handle deferral state changes based on disableCookieDefer setting\n        if (cookieMgrConfig.disableCookieDefer) {\n            // When deferral is disabled, set to null to disable any deferral behavior\n            // All pending operations are dropped\n            _pendingCookies = null;\n        } else if (_pendingCookies === null) {\n            // When deferral is enabled and was previously disabled, initialize empty buffer\n            _pendingCookies = [];\n        }\n        \n        // Check if enabled state is changing\n        let wasEnabled = _enabled;\n        // Explicitly checking against false, so that setting to undefined will === true\n        _enabled = _isCfgEnabled(rootConfig, cookieMgrConfig) !== false;\n\n        _getCookieFn = cookieMgrConfig.getCookie || _getCookieValue;\n        _setCookieFn = cookieMgrConfig.setCookie || _setCookieValue;\n        _delCookieFn = cookieMgrConfig.delCookie || _setCookieValue;\n\n        // If cookies were just enabled via config change and we have pending cookies, flush them\n        if (!wasEnabled && _enabled && _pendingCookies) {\n            _flushPendingCookies();\n        }\n    }, logger);\n\n    let cookieMgr: ICookieMgr = {\n        isEnabled: () => {\n            let enabled = _isCfgEnabled(rootConfig, cookieMgrConfig) !== false && _enabled && areCookiesSupported(logger);\n            // Using an indirect lookup for any global cookie manager to support tree shaking for SDK's\n            // that don't use the \"applicationinsights-core\" version of the default cookie function\n            let gblManager = _globalCookieConfig[strConfigCookieMgr];\n            if (enabled && gblManager && cookieMgr !== gblManager) {\n                // Make sure the GlobalCookie Manager instance (if not this instance) is also enabled.\n                // As the global (deprecated) functions may have been called (for backward compatibility)\n                enabled = _isMgrEnabled(gblManager);\n            }\n\n            return enabled;\n        },\n        setEnabled: (value: boolean) => {\n            // Change the default config and allow the asynchronous dynamic config logic\n            // to process all of the changes at once (like handling change to the enabled and\n            // disabling caching at the same time)\n            cookieMgrConfig.enabled = value;\n\n            // If this value is defined someone else might be listening to it so also update it,\n            // this also handles the edge case if the default above is not dynamic\n            if (!isUndefined(rootConfig[strDisableCookiesUsage])) {\n                rootConfig[strDisableCookiesUsage] = !value;\n            }\n        },\n        set: (name: string, value: string, maxAgeSec?: number, domain?: string, path?: string) => {\n            let result = false;\n            let isBlocked = _isBlockedCookie(cookieMgrConfig, name);\n            \n            if (!isBlocked) {\n                let cookieValue = _formatSetCookieValue(value, maxAgeSec, domain, path);\n                \n                if (_isMgrEnabled(cookieMgr)) {\n                    _setCookieFn(name, cookieValue);\n                    result = true;\n                } else if (_pendingCookies) {\n                    // Defer the fully formatted cookie value if cookies are disabled and deferral is enabled\n                    // Remove any previous operation for this cookie name (latest operation wins)\n                    _removePendingCookie(name);\n                    // Append new operation to the array\n                    _pendingCookies.push({\n                        n: name,\n                        o: ePendingOp.Set,\n                        v: cookieValue\n                    });\n                    result = true; // Return true to indicate the operation was \"successful\" (deferred)\n                }\n            }\n\n            return result;\n        },\n        get: (name: string): string => {\n            let value = STR_EMPTY;\n            let isIgnored = _isIgnoredCookie(cookieMgrConfig, name);\n            \n            if (!isIgnored) {\n                if (_isMgrEnabled(cookieMgr)) {\n                    value = _getCookieFn(name);\n                } else if (_pendingCookies) {\n                    // Search for the most recent operation for this cookie (search backwards through array)\n                    for (let i = _pendingCookies.length - 1; i >= 0; i--) {\n                        let pendingData = _pendingCookies[i];\n                        if (pendingData.n === name) {\n                            // Found the most recent operation for this cookie name\n                            if (pendingData.o === ePendingOp.Set) {\n                                // Return deferred value if it was a set operation\n                                // Extract the value part from the formatted cookie string (before first semicolon)\n                                let cookieValue = pendingData.v;\n                                let idx = strIndexOf(cookieValue, \";\");\n                                value = idx !== -1 ? strTrim(strLeft(cookieValue, idx)) : strTrim(cookieValue);\n                            }\n                            // If it was a Purge operation, value remains empty (STR_EMPTY)\n                            break;\n                        }\n                    }\n                }\n            }\n\n            return value;\n        },\n        del: (name: string, path?: string) => {\n            let result = false;\n            if (_isMgrEnabled(cookieMgr)) {\n                // Only remove the cookie if the manager and cookie support has not been disabled\n                result = cookieMgr.purge(name, path);\n            } else if (_pendingCookies) {\n                // Defer the deletion operation when cookies are disabled and deferral is enabled\n                // Remove any previous operation for this cookie name (latest operation wins)\n                _removePendingCookie(name);\n                // Append new deletion operation to the array\n                _pendingCookies.push({\n                    n: name,\n                    o: ePendingOp.Purge,\n                    v: _formatDeletionValue(path)\n                });\n                result = true;\n            }\n\n            return result;\n        },\n        purge: (name: string, path?: string) => {\n            let result = false;\n            if (areCookiesSupported(logger)) {\n                // Setting the expiration date in the past immediately removes the cookie\n                _delCookieFn(name, _formatDeletionValue(path));\n                result = true;\n            }\n\n            return result;\n        },\n        unload: (isAsync?: boolean): void | IPromise<void> => {\n            unloadHandler && unloadHandler.rm();\n            unloadHandler = null;\n            // Clear any pending cookies on unload\n            _pendingCookies = null;\n        }\n    };\n\n    // Associated this cookie manager with the config\n    cookieMgr[strConfigCookieMgr] = cookieMgr;\n    \n    return cookieMgr;\n}\n\n/*\n* Helper method to tell if document.cookie object is supported by the runtime\n*/\nexport function areCookiesSupported(logger?: IDiagnosticLogger): any {\n    if (_supportsCookies === null) {\n        _supportsCookies = false;\n        !_doc && _getDoc();\n\n        try {\n            let doc = _doc.v || {} as Document;\n            _supportsCookies = doc[strCookie] !== undefined;\n        } catch (e) {\n            _throwInternal(\n                logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.CannotAccessCookie,\n                \"Cannot access document.cookie - \" + getExceptionName(e),\n                { exception: dumpObj(e) });\n        }\n    }\n\n    return _supportsCookies;\n}\n\nfunction _extractParts(theValue: string) {\n    let values: { [key: string]: string } = {};\n    if (theValue && theValue.length) {\n        let parts = strTrim(theValue).split(\";\");\n        arrForEach(parts, (thePart) => {\n            thePart = strTrim(thePart || STR_EMPTY);\n            if (thePart) {\n                let idx = strIndexOf(thePart, \"=\");\n                if (idx === -1) {\n                    values[thePart] = null;\n                } else {\n                    values[strTrim(strLeft(thePart, idx))] = strTrim(strSubstring(thePart, idx + 1));\n                }\n            }\n        });\n    }\n\n    return values;\n}\n\nfunction _formatDate(theDate: Date, func: string) {\n    if (isFunction(theDate[func])) {\n        return theDate[func]();\n    }\n    \n    return null;\n}\n\nfunction _formatCookieValue(value: string, values: any) {\n    let cookieValue = value || STR_EMPTY;\n    objForEachKey(values, (name, theValue) => {\n        cookieValue += \"; \" + name + (!isNullOrUndefined(theValue) ? \"=\" + theValue : STR_EMPTY);\n    });\n\n    return cookieValue;\n}\n\nfunction _getCookieValue(name: string) {\n    let cookieValue = STR_EMPTY;\n    !_doc && _getDoc();\n\n    if (_doc.v) {\n        let theCookie = _doc.v[strCookie] || STR_EMPTY;\n        if (_parsedCookieValue !== theCookie) {\n            _cookieCache = _extractParts(theCookie);\n            _parsedCookieValue = theCookie;\n        }\n\n        cookieValue = strTrim(_cookieCache[name] || STR_EMPTY);\n    }\n\n    return cookieValue;\n}\n\nfunction _setCookieValue(name: string, cookieValue: string) {\n    !_doc && _getDoc();\n    if (_doc.v) {\n        _doc.v[strCookie] = name + \"=\" + cookieValue;\n    }\n}\n\nexport function uaDisallowsSameSiteNone(userAgent: string) {\n    if (!isString(userAgent)) {\n        return false;\n    }\n\n    // Cover all iOS based browsers here. This includes:\n    // - Safari on iOS 12 for iPhone, iPod Touch, iPad\n    // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad\n    // - Chrome on iOS 12 for iPhone, iPod Touch, iPad\n    // All of which are broken by SameSite=None, because they use the iOS networking stack\n    if (strContains(userAgent, \"CPU iPhone OS 12\") || strContains(userAgent, \"iPad; CPU OS 12\")) {\n        return true;\n    }\n\n    // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes:\n    // - Safari on Mac OS X\n    // This does not include:\n    // - Internal browser on Mac OS X\n    // - Chrome on Mac OS X\n    // - Chromium on Mac OS X\n    // Because they do not use the Mac OS networking stack.\n    if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strContains(userAgent, \"Version/\") && strContains(userAgent, \"Safari\")) {\n        return true;\n    }\n\n    // Cover Mac OS X internal browsers that use the Mac OS networking stack. This includes:\n    // - Internal browser on Mac OS X\n    // This does not include:\n    // - Safari on Mac OS X\n    // - Chrome on Mac OS X\n    // - Chromium on Mac OS X\n    // Because they do not use the Mac OS networking stack.\n    if (strContains(userAgent, \"Macintosh; Intel Mac OS X 10_14\") && strEndsWith(userAgent, \"AppleWebKit/605.1.15 (KHTML, like Gecko)\")) {\n        return true;\n    }\n\n    // Cover Chrome 50-69, because some versions are broken by SameSite=None, and none in this range require it.\n    // Note: this covers some pre-Chromium Edge versions, but pre-Chromim Edge does not require SameSite=None, so this is fine.\n    // Note: this regex applies to Windows, Mac OS X, and Linux, deliberately.\n    if (strContains(userAgent, \"Chrome/5\") || strContains(userAgent, \"Chrome/6\")) {\n        return true;\n    }\n\n    // Unreal Engine runs Chromium 59, but does not advertise as Chrome until 4.23. Treat versions of Unreal\n    // that don't specify their Chrome version as lacking support for SameSite=None.\n    if (strContains(userAgent, \"UnrealEngine\") && !strContains(userAgent, \"Chrome\")) {\n        return true;\n    }\n\n    // UCBrowser < 12.13.2 ignores Set-Cookie headers with SameSite=None\n    // NB: this rule isn't complete - you need regex to make a complete rule.\n    // See: https://www.chromium.org/updates/same-site/incompatible-clients\n    if (strContains(userAgent, \"UCBrowser/12\") || strContains(userAgent, \"UCBrowser/11\")) {\n        return true;\n    }\n\n    return false;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/DbgExtensionUtils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getInst } from \"@nevware21/ts-utils\";\nimport { STR_EVENTS_DISCARDED, STR_EVENTS_SEND_REQUEST, STR_EVENTS_SENT, STR_PERF_EVENT } from \"../constants/InternalConstants\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IDbgExtension } from \"../interfaces/ai/IDbgExtension\";\nimport { INotificationListener } from \"../interfaces/ai/INotificationListener\";\n\nconst listenerFuncs = [ STR_EVENTS_SENT, STR_EVENTS_DISCARDED, STR_EVENTS_SEND_REQUEST, STR_PERF_EVENT ];\n\nlet _aiNamespace: any = null;\nlet _debugListener: INotificationListener;\n\nfunction _listenerProxyFunc(name: string, config: IConfiguration) {\n    return function() {\n        let args = arguments;\n        let dbgExt = getDebugExt(config);\n        if (dbgExt) {\n            let listener = dbgExt.listener;\n            if (listener && listener[name]) {\n                listener[name].apply(listener, args);\n            }\n        }\n    }\n}\n\nfunction _getExtensionNamespace() {\n    // Cache the lookup of the global namespace object\n    let target = getInst(\"Microsoft\");\n    if (target) {\n        _aiNamespace = target[\"ApplicationInsights\"];\n    }\n\n    return _aiNamespace;\n}\n\nexport function getDebugExt(config: IConfiguration): IDbgExtension {\n    let ns = _aiNamespace;\n    if (!ns && config.disableDbgExt !== true) {\n        ns = _aiNamespace || _getExtensionNamespace();\n    }\n\n    return ns ? ns[\"ChromeDbgExt\"] : null;\n}\n\nexport function getDebugListener(config: IConfiguration): INotificationListener {\n    if (!_debugListener) {\n        _debugListener = {};\n        for (let lp = 0; lp < listenerFuncs.length; lp++) {\n            _debugListener[listenerFuncs[lp]] = _listenerProxyFunc(listenerFuncs[lp], config);\n        }\n    }\n\n    return _debugListener;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/InstrumentHooks.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strShimFunction, strShimPrototype } from \"@microsoft/applicationinsights-shims\";\nimport { getInst, objHasOwnProperty } from \"@nevware21/ts-utils\";\nimport {\n    IInstrumentCallDetails, IInstrumentHook, IInstrumentHooks, IInstrumentHooksCallbacks, InstrumentorHooksCallback\n} from \"../interfaces/ai/IInstrumentHooks\";\nimport { _getObjProto } from \"../utils/HelperFuncs\";\n\nconst aiInstrumentHooks = \"_aiHooks\";\n\nconst enum CallbackType {\n    Request = 0,\n    Response = 1,\n    HookError = 2,\n    FunctionError = 3\n}\n\nconst cbNames = [\n    \"req\", \"rsp\", \"hkErr\", \"fnErr\"\n];\n\n/** @ignore */\nfunction _arrLoop<T>(arr:T[], fn:(value:T, idx:number) => boolean|number|void) {\n    if (arr) {\n        for (let lp = 0; lp < arr.length; lp++) {\n            if (fn(arr[lp], lp)) {\n                break;\n            }\n        }\n    }\n}\n\n/** @ignore */\nfunction _doCallbacks(hooks:IInstrumentHook[], callDetails: IInstrumentCallDetails, cbArgs:any[], hookCtx:any[], type:CallbackType): void {\n    if (type >= CallbackType.Request && type <= CallbackType.HookError) {\n        _arrLoop(hooks, (hook, idx) => {\n            let cbks = hook.cbks;\n            let cb:InstrumentorHooksCallback = cbks[cbNames[type]];\n            if (cb) {\n\n                // Set the specific hook context implementation using a lazy creation pattern\n                callDetails.ctx = () => {\n                    let ctx = hookCtx[idx] = (hookCtx[idx] || {});\n                    return ctx;\n                };\n\n                try {\n                    cb.apply(callDetails.inst, cbArgs);\n                } catch (err) {\n                    let orgEx = callDetails.err;\n                    try {\n                        // Report Hook error via the callback\n                        let hookErrorCb:InstrumentorHooksCallback = cbks[cbNames[CallbackType.HookError]];\n                        if (hookErrorCb) {\n                            callDetails.err = err;\n                            hookErrorCb.apply(callDetails.inst, cbArgs);\n                        }\n                    } catch(e) {\n                        // Not much we can do here -- swallowing the exception to avoid crashing the hosting app\n                    } finally {\n                        // restore the original exception (if any)\n                        callDetails.err = orgEx;\n                    }\n                }\n            }\n        });\n    }\n}\n\n/** @ignore */\nfunction _createFunctionHook(aiHook:IInstrumentHooks) {\n\n    // Define a temporary method that queues-up a the real method call\n    return function (this: any) {\n        let funcThis = this;\n        // Capture the original arguments passed to the method\n        let orgArgs = arguments as any;\n        let hooks = aiHook.h;\n\n        let funcArgs: IInstrumentCallDetails = {\n            name: aiHook.n,\n            inst: funcThis,\n            ctx: null,\n            set: _replaceArg\n        };\n\n        let hookCtx: any[] = [];\n        let cbArgs = _createArgs([funcArgs], orgArgs);\n        funcArgs.evt = getInst(\"event\");\n\n        function _createArgs(target:any[], theArgs:any[]): any[] {\n            _arrLoop((theArgs as any), (arg) => {\n                target.push(arg);\n            });\n\n            return target;\n        }\n\n        function _replaceArg(idx:number, value:any) {\n            orgArgs = _createArgs([], orgArgs);\n            orgArgs[idx] = value;\n            cbArgs = _createArgs([funcArgs], orgArgs);\n        }\n\n        // Call the pre-request hooks\n        _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, CallbackType.Request);\n\n        // Call the original function was called\n        let theFunc = aiHook.f;\n        if (theFunc) {\n            try {\n                funcArgs.rslt = theFunc.apply(funcThis, orgArgs);\n            } catch (err) {\n                // Report the request callback\n                funcArgs.err = err;\n                _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, CallbackType.FunctionError);\n    \n                // rethrow the original exception so anyone listening for it can catch the exception\n                throw err;\n            }\n        }\n\n        // Call the post-request hooks\n        _doCallbacks(hooks, funcArgs, cbArgs, hookCtx, CallbackType.Response);\n\n        return funcArgs.rslt;\n    };\n}\n\n\n/** @ignore */\nfunction _getOwner(target:any, name:string, checkPrototype: boolean, checkParentProto: boolean): any {\n    let owner = null;\n    if (target) {\n        if (objHasOwnProperty(target, name)) {\n            owner = target;\n        } else if (checkPrototype) {\n            owner = _getOwner(_getObjProto(target), name, checkParentProto, false);\n        }\n    }\n\n    return owner;\n}\n\n/**\n * Intercept the named prototype functions for the target class / object\n * @param target - The target object\n * @param funcName - The function name\n * @param callbacks - The callbacks to configure and call whenever the function is called\n */\nexport function InstrumentProto(target:any, funcName:string, callbacks: IInstrumentHooksCallbacks): IInstrumentHook {\n    if (target) {\n        return InstrumentFunc(target[strShimPrototype], funcName, callbacks, false);\n    }\n\n    return null;\n}\n\n/**\n * Intercept the named prototype functions for the target class / object\n * @param target - The target object\n * @param funcNames - The function names to intercept and call\n * @param callbacks - The callbacks to configure and call whenever the function is called\n */\nexport function InstrumentProtos(target:any, funcNames:string[], callbacks: IInstrumentHooksCallbacks): IInstrumentHook[] {\n    if (target) {\n        return InstrumentFuncs(target[strShimPrototype], funcNames, callbacks, false);\n    }\n\n    return null;\n}\n\nfunction _createInstrumentHook(owner: any, funcName: string, fn: any, callbacks: IInstrumentHooksCallbacks) {\n    let aiHook: IInstrumentHooks = fn && fn[aiInstrumentHooks];\n    if (!aiHook) {\n        // Only hook the function once\n        aiHook = {\n            i: 0,\n            n: funcName,\n            f: fn,\n            h: []\n        };\n\n        // Override (hook) the original function\n        let newFunc = _createFunctionHook(aiHook);\n        newFunc[aiInstrumentHooks] = aiHook; // Tag and store the function hooks\n        owner[funcName] = newFunc;\n    }\n\n    const theHook: IInstrumentHook = {\n        // tslint:disable:object-literal-shorthand\n        id: aiHook.i,\n        cbks: callbacks,\n        rm: function () {\n            // DO NOT Use () => { shorthand for the function as the this gets replaced\n            // with the outer this and not the this for theHook instance.\n            let id = this.id;\n            _arrLoop(aiHook.h, (hook, idx) => {\n                if (hook.id === id) {\n                    aiHook.h.splice(idx, 1);\n                    return 1;\n                }\n            });\n        }\n        // tslint:enable:object-literal-shorthand\n    };\n\n    aiHook.i++;\n    aiHook.h.push(theHook);\n\n    return theHook;\n}\n\n/**\n * Intercept the named prototype functions for the target class / object\n * @param target - The target object\n * @param funcName - The function name\n * @param callbacks - The callbacks to configure and call whenever the function is called\n * @param checkPrototype - If the function doesn't exist on the target should it attempt to hook the prototype function\n * @param checkParentProto - If the function doesn't exist on the target or it's prototype should it attempt to hook the parent's prototype\n */\nexport function InstrumentFunc(target:any, funcName:string, callbacks: IInstrumentHooksCallbacks, checkPrototype: boolean = true, checkParentProto?: boolean): IInstrumentHook {\n    if (target && funcName && callbacks) {\n        let owner = _getOwner(target, funcName, checkPrototype, checkParentProto);\n        if (owner) {\n            let fn = owner[funcName]\n            if (typeof fn === strShimFunction) {\n                return _createInstrumentHook(owner, funcName, fn, callbacks);\n            }\n        }\n    }\n\n    return null;\n}\n\n/**\n * Intercept the named functions for the target class / object\n * @param target - The target object\n * @param funcNames - The function names to intercept and call\n * @param callbacks - The callbacks to configure and call whenever the function is called\n * @param checkPrototype - If the function doesn't exist on the target should it attempt to hook the prototype function\n * @param checkParentProto - If the function doesn't exist on the target or it's prototype should it attempt to hook the parent's prototype\n */\nexport function InstrumentFuncs(target:any, funcNames:string[], callbacks: IInstrumentHooksCallbacks, checkPrototype:boolean = true, checkParentProto?: boolean): IInstrumentHook[] {\n    let hooks: IInstrumentHook[] = null;\n    _arrLoop(funcNames, (funcName) => {\n        let hook = InstrumentFunc(target, funcName, callbacks, checkPrototype, checkParentProto);\n        if (hook) {\n            if (!hooks) {\n                hooks = [];\n            }\n\n            hooks.push(hook);\n        }\n    });\n\n    return hooks;\n}\n\n/**\n * Add an instrumentation hook to the provided named \"event\" for the target class / object, this doesn't check whether the\n * named \"event\" is in fact a function and just assigns the instrumentation hook to the target[evtName]\n * @param target - The target object\n * @param evtName - The name of the event\n * @param callbacks - The callbacks to configure and call whenever the function is called\n * @param checkPrototype - If the function doesn't exist on the target should it attempt to hook the prototype function\n * @param checkParentProto - If the function doesn't exist on the target or it's prototype should it attempt to hook the parent's prototype\n */\nexport function InstrumentEvent(target: any, evtName: string, callbacks: IInstrumentHooksCallbacks, checkPrototype?: boolean, checkParentProto?: boolean): IInstrumentHook {\n    if (target && evtName && callbacks) {\n        let owner = _getOwner(target, evtName, checkPrototype, checkParentProto) || target;\n        if (owner) {\n            return _createInstrumentHook(owner, evtName, owner[evtName], callbacks);\n        }\n    }\n\n    return null;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/NotificationManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { IPromise, createAllPromise, createPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { ITimerHandler, arrForEach, arrIndexOf, objDefine, safe, scheduleTimeout } from \"@nevware21/ts-utils\";\nimport { createDynamicConfig } from \"../config/DynamicConfig\";\nimport {\n    STR_EVENTS_DISCARDED, STR_EVENTS_SEND_REQUEST, STR_EVENTS_SENT, STR_OFFLINE_DROP, STR_OFFLINE_SENT, STR_OFFLINE_STORE, STR_PERF_EVENT\n} from \"../constants/InternalConstants\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { INotificationListener } from \"../interfaces/ai/INotificationListener\";\nimport { INotificationManager } from \"../interfaces/ai/INotificationManager\";\nimport { IPerfEvent } from \"../interfaces/ai/IPerfEvent\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { IUnloadHook } from \"../interfaces/ai/IUnloadHook\";\nimport { IPayloadData } from \"../interfaces/ai/IXHROverride\";\n\nconst defaultValues = {\n    perfEvtsSendAll: false\n};\n\ninterface IAsyncNotifications {\n    h: ITimerHandler;\n    cb: Array<{ fn: (listener: INotificationListener) => void, arg: INotificationListener }>\n}\n\nfunction _runScheduledListeners(asyncNotifications: IAsyncNotifications) {\n    asyncNotifications.h = null;\n    let callbacks = asyncNotifications.cb;\n    asyncNotifications.cb = [];\n    arrForEach(callbacks, (cb) => {\n        // Run the listener in a try-catch to ensure that a single listener failing doesn't prevent the others from running\n        safe(cb.fn, [cb.arg]);\n    });\n}\n\n// This function is used to combine the logic of running the listeners and handling the async notifications so that they don't\n// create multiple timers if there are multiple async listeners.\nfunction _runListeners(listeners: INotificationListener[], name: string, asyncNotifications: IAsyncNotifications | null, callback: (listener: INotificationListener) => void) {\n    arrForEach(listeners, (listener) => {\n        if (listener && listener[name]) {\n            if (asyncNotifications) {\n                // Schedule the callback to be called after the current call stack has cleared.\n                asyncNotifications.cb.push({\n                    fn: callback,\n                    arg: listener\n                });\n\n                asyncNotifications.h = asyncNotifications.h || scheduleTimeout(_runScheduledListeners, 0, asyncNotifications);\n            } else {\n                // Run the listener in a try-catch to ensure that a single listener failing doesn't prevent the others from running\n                safe(callback, [listener]);\n            }\n        }\n    });\n}\n\n/**\n * Class to manage sending notifications to all the listeners.\n */\nexport class NotificationManager implements INotificationManager {\n    public readonly listeners: INotificationListener[] = [];\n\n    constructor(config?: IConfiguration) {\n        let perfEvtsSendAll: boolean;\n        let unloadHandler: IUnloadHook;\n        let _listeners: INotificationListener[] = [];\n        let _asyncNotifications: IAsyncNotifications = {\n            h: null,\n            cb: []\n        };\n\n        let cfgHandler = createDynamicConfig(config, defaultValues);\n\n        unloadHandler = cfgHandler.watch((details) => {\n            perfEvtsSendAll = !!details.cfg.perfEvtsSendAll;\n        });\n\n        dynamicProto(NotificationManager, this, (_self) => {\n            objDefine(_self, \"listeners\", {\n                g: () => _listeners\n            });\n    \n            _self.addNotificationListener = (listener: INotificationListener): void => {\n                _listeners.push(listener);\n            };\n\n            /**\n             * Removes all instances of the listener.\n             * @param listener - AWTNotificationListener to remove.\n             */\n            _self.removeNotificationListener = (listener: INotificationListener): void => {\n                let index: number = arrIndexOf(_listeners, listener);\n                while (index > -1) {\n                    _listeners.splice(index, 1);\n                    index = arrIndexOf(_listeners, listener);\n                }\n            };\n\n            /**\n             * Notification for events sent.\n             * @param events - The array of events that have been sent.\n             */\n            _self.eventsSent = (events: ITelemetryItem[]): void => {\n                _runListeners(_listeners, STR_EVENTS_SENT, _asyncNotifications, (listener) => {\n                    listener.eventsSent(events);\n                });\n            };\n\n            /**\n             * Notification for events being discarded.\n             * @param events - The array of events that have been discarded by the SDK.\n             * @param reason - The reason for which the SDK discarded the events. The EventsDiscardedReason\n             * constant should be used to check the different values.\n             * @param sendType - [Optional] The send type used when the events were discarded.\n             */\n            _self.eventsDiscarded = (events: ITelemetryItem[], reason: number, sendType?: number): void => {\n                _runListeners(_listeners, STR_EVENTS_DISCARDED, _asyncNotifications, (listener) => {\n                    listener.eventsDiscarded(events, reason, sendType);\n                });\n            };\n\n            /**\n             * [Optional] A function called when the events have been requested to be sent to the sever.\n             * @param sendReason - The reason why the event batch is being sent.\n             * @param isAsync - A flag which identifies whether the requests are being sent in an async or sync manner.\n             */\n            _self.eventsSendRequest = (sendReason: number, isAsync: boolean): void => {\n                _runListeners(_listeners, STR_EVENTS_SEND_REQUEST, isAsync ? _asyncNotifications : null, (listener) => {\n                    listener.eventsSendRequest(sendReason, isAsync);\n                });\n            };\n\n            _self.perfEvent = (perfEvent?: IPerfEvent): void => {\n                if (perfEvent) {\n\n                    // Send all events or only parent events\n                    if (perfEvtsSendAll || !perfEvent.isChildEvt()) {\n                        _runListeners(_listeners, STR_PERF_EVENT, null, (listener) => {\n                            if (perfEvent.isAsync) {\n                                scheduleTimeout(() => listener.perfEvent(perfEvent), 0);\n                            } else {\n                                listener.perfEvent(perfEvent);\n                            }\n                        });\n                    }\n                }\n            };\n\n            _self.offlineEventsStored = (events: ITelemetryItem[]): void => {\n                if (events && events.length) {\n                    _runListeners(_listeners, STR_OFFLINE_STORE, _asyncNotifications, (listener) => {\n                        listener.offlineEventsStored(events);\n                    });\n                }\n            }\n\n            _self.offlineBatchSent = (batch: IPayloadData): void => {\n                if (batch && batch.data) {\n                    _runListeners(_listeners, STR_OFFLINE_SENT, _asyncNotifications, (listener) => {\n                        listener.offlineBatchSent(batch);\n                    });\n                }\n            }\n\n            _self.offlineBatchDrop = (cnt: number, reason?: number): void => {\n                if (cnt > 0) {\n                    let rn = reason || 0; // default is unknown\n                    _runListeners(_listeners, STR_OFFLINE_DROP, _asyncNotifications, (listener) => {\n                        listener.offlineBatchDrop(cnt, rn);\n                    });\n                }\n            }\n\n            _self.unload = (isAsync?: boolean) => {\n\n                const _finishUnload = () => {\n                    unloadHandler && unloadHandler.rm();\n                    unloadHandler = null;\n                    _listeners = [];\n                    \n                    // Clear any async listener\n                    _asyncNotifications.h && _asyncNotifications.h.cancel();\n                    _asyncNotifications.h = null;\n                    _asyncNotifications.cb = [];\n                };\n\n                let waiting: IPromise<void>[];\n                _runListeners(_listeners, \"unload\", null, (listener) => {\n                    let asyncUnload = listener.unload(isAsync);\n                    if (asyncUnload) {\n                        if (!waiting) {\n                            waiting = [];\n                        }\n\n                        waiting.push(asyncUnload);\n                    }\n                });\n\n                if (waiting) {\n                    return createPromise((resolve) => {\n                        return doAwaitResponse(createAllPromise(waiting), () => {\n                            _finishUnload();\n                            resolve();\n                        });\n                    });\n                } else {\n                    _finishUnload();\n                }\n            };\n        });\n    }\n    \n    /**\n     * Adds a notification listener.\n     * @param listener - The notification listener to be added.\n     */\n    addNotificationListener(listener: INotificationListener): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Removes all instances of the listener.\n     * @param listener - AWTNotificationListener to remove.\n     */\n    removeNotificationListener(listener: INotificationListener): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Notification for events sent.\n     * @param events - The array of events that have been sent.\n     */\n    eventsSent(events: ITelemetryItem[]): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Notification for events being discarded.\n     * @param events - The array of events that have been discarded by the SDK.\n     * @param reason - The reason for which the SDK discarded the events. The EventsDiscardedReason\n     * constant should be used to check the different values.\n     */\n    eventsDiscarded(events: ITelemetryItem[], reason: number): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * [Optional] A function called when the events have been requested to be sent to the sever.\n     * @param sendReason - The reason why the event batch is being sent.\n     * @param isAsync - A flag which identifies whether the requests are being sent in an async or sync manner.\n     */\n    eventsSendRequest?(sendReason: number, isAsync: boolean): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * [Optional] This event is sent if you have enabled perf events, they are primarily used to track internal performance testing and debugging\n     * the event can be displayed via the debug plugin extension.\n    * @param perfEvent - The performance event object containing relevant performance data.\n    */\n    perfEvent?(perfEvent: IPerfEvent): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Unload and remove any state that this INotificationManager may be holding, this is generally called when the\n     * owning SDK is being unloaded.\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @returns If the unload occurs synchronously then nothing should be returned, if happening asynchronously then\n     * the function should return an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * / Promise to allow any listeners to wait for the operation to complete.\n     */\n    unload?(isAsync?: boolean): void | IPromise<void> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * [Optional] A function called when the offline events have been stored to the persistent storage\n     * @param events - events that are stored in the persistent storage\n     */\n    offlineEventsStored?(events: ITelemetryItem[]): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * [Optional] A function called when the offline events have been sent from the persistent storage\n     * @param batch - payload data that is sent from the persistent storage\n     */\n    offlineBatchSent?(batch: IPayloadData): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * [Optional] A function called when the offline events have been dropped from the persistent storage\n     * @param cnt - count of batches dropped\n     * @param reason - the reason why the batches is dropped\n     * @since v3.1.1\n     */\n    offlineBatchDrop?(cnt: number, reason?: number): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/PerfManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { isArray, isFunction, objDefine, utcNow } from \"@nevware21/ts-utils\";\nimport { STR_GET_PERF_MGR } from \"../constants/InternalConstants\";\nimport { INotificationManager } from \"../interfaces/ai/INotificationManager\";\nimport { IPerfEvent } from \"../interfaces/ai/IPerfEvent\";\nimport { IPerfManager, IPerfManagerProvider } from \"../interfaces/ai/IPerfManager\";\nimport { _noopVoid } from \"../internal/noopHelpers\";\n\nconst strExecutionContextKey = \"ctx\";\nconst strParentContextKey = \"ParentContextKey\";\nconst strChildrenContextKey = \"ChildrenContextKey\";\n\nlet _defaultPerfManager: IPerfManager = null;\n\nexport class PerfEvent implements IPerfEvent {\n    public static ParentContextKey = \"parent\";\n    public static ChildrenContextKey = \"childEvts\";\n    \n    /**\n     * The name of the event\n     */\n    name: string;\n\n    /**\n     * The start time of the event in ms\n     */\n    start: number;\n\n    /**\n     * The payload (contents) of the perfEvent, may be null or only set after the event has completed depending on\n     * the runtime environment.\n     */\n    payload: any;\n\n    /**\n     * Is this occurring from an asynchronous event\n     */\n    isAsync: boolean;\n    \n    /**\n     * Identifies the total inclusive time spent for this event, including the time spent for child events,\n     * this will be undefined until the event is completed\n     */\n    time?: number;\n\n    /**\n     * Identifies the exclusive time spent in for this event (not including child events),\n     * this will be undefined until the event is completed.\n     */\n    exTime?: number;\n\n    /**\n     * Identifies whether this event is a child event of a parent\n     */\n    isChildEvt: () => boolean;\n\n    getCtx?: (key: string) => any | null | undefined;\n\n    setCtx?: (key: string, value: any) => void;\n\n    complete: () => void;\n\n    constructor(name: string, payloadDetails: () => any, isAsync: boolean) {\n        let _self = this;\n        _self.start = utcNow();\n        _self.name = name;\n        _self.isAsync = isAsync;\n        _self.isChildEvt = (): boolean => false;\n\n        if (isFunction(payloadDetails)) {\n            // Create an accessor to minimize the potential performance impact of executing the payloadDetails callback\n            let theDetails:any;\n            objDefine(_self, \"payload\", {\n                g: () => {\n                    // Delay the execution of the payloadDetails until needed\n                    if (!theDetails && isFunction(payloadDetails)) {\n                        theDetails = payloadDetails();\n                        // clear it out now so the referenced objects can be garbage collected\n                        payloadDetails = null;\n                    }\n\n                    return theDetails;\n                }\n            });\n        }\n\n        _self.getCtx = (key: string): any | null | undefined => {\n            if (key) {\n                // The parent and child links are located directly on the object (for better viewing in the DebugPlugin)\n                if (key === PerfEvent[strParentContextKey] || key === PerfEvent[strChildrenContextKey]) {\n                    return _self[key];\n                }\n\n                return  (_self[strExecutionContextKey] || {})[key];\n            }\n\n            return null;\n        };\n\n        _self.setCtx = (key: string, value: any) => {\n            if (key) {\n                // Put the parent and child links directly on the object (for better viewing in the DebugPlugin)\n                if (key === PerfEvent[strParentContextKey]) {\n                    // Simple assumption, if we are setting a parent then we must be a child\n                    if (!_self[key]) {\n                        _self.isChildEvt = (): boolean => true;\n                    }\n                    _self[key] = value;\n                } else if (key === PerfEvent[strChildrenContextKey]) {\n                    _self[key] = value;\n                } else {\n                    let ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                    ctx[key] = value;\n                }\n            }\n        };\n\n        _self.complete = () => {\n            let childTime = 0;\n            let childEvts = _self.getCtx(PerfEvent[strChildrenContextKey]);\n            if (isArray<IPerfEvent>(childEvts)) {\n                for (let lp = 0; lp < childEvts.length; lp++) {\n                    let childEvt: IPerfEvent = childEvts[lp];\n                    if (childEvt) {\n                        childTime += childEvt.time;\n                    }\n                }\n            }\n\n            _self.time = utcNow() - _self.start;\n            _self.exTime = _self.time - childTime;\n            _self.complete = _noopVoid;\n        };\n    }\n}\n\nexport class PerfManager implements IPerfManager  {\n    /**\n     * General bucket used for execution context set and retrieved via setCtx() and getCtx.\n     * Defined as private so it can be visualized via the DebugPlugin\n     */\n    private ctx: { [key: string] : any } = {};\n\n    constructor(manager?: INotificationManager) {\n\n        dynamicProto(PerfManager, this, (_self) => {\n\n            _self.create = (src: string, payloadDetails?: () => any, isAsync?: boolean): IPerfEvent | null | undefined => {\n                // TODO (@MSNev): at some point we will want to add additional configuration to \"select\" which events to instrument\n                // for now this is just a simple do everything.\n                return new PerfEvent(src, payloadDetails, isAsync);\n            };\n\n            _self.fire = (perfEvent: IPerfEvent) => {\n                if (perfEvent) {\n                    perfEvent.complete();\n\n                    if (manager && isFunction(manager.perfEvent)) {\n                        manager.perfEvent(perfEvent);\n                    }\n                }\n            };\n\n            _self.setCtx = (key: string, value: any): void => {\n                if (key) {\n                    let ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};\n                    ctx[key] = value;\n                }\n            };\n        \n            _self.getCtx = (key: string): any => {\n                return (_self[strExecutionContextKey] || {})[key];\n            };\n        });\n    }\n\n    /**\n     * Create a new event and start timing, the manager may return null/undefined to indicate that it does not\n     * want to monitor this source event.\n     * @param src - The source name of the event\n     * @param payloadDetails - An optional callback function to fetch the payload details for the event.\n     * @param isAsync - Is the event occurring from a async event\n     */\n    public create(src: string, payload?: any, isAsync?: boolean): IPerfEvent | null | undefined {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Complete the perfEvent and fire any notifications.\n     * @param perfEvent - Fire the event which will also complete the passed event\n     */\n    public fire(perfEvent: IPerfEvent): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Set an execution context value\n     * @param key - The context key name\n     * @param value - The value\n     */\n    public setCtx(key: string, value: any): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get the execution context value\n     * @param key - The context key\n     */\n    public getCtx(key: string): any {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n\nconst doPerfActiveKey = \"CoreUtils.doPerf\";\n\n/**\n * Helper function to wrap a function with a perf event\n * @param mgrSource - The Performance Manager or a Performance provider source (may be null)\n * @param getSource - The callback to create the source name for the event (if perf monitoring is enabled)\n * @param func - The function to call and measure\n * @param details - A function to return the payload details\n * @param isAsync - Is the event / function being call asynchronously or synchronously\n */\nexport function doPerf<T>(mgrSource: IPerfManagerProvider | IPerfManager, getSource: () => string, func: (perfEvt?: IPerfEvent) => T, details?: () => any, isAsync?: boolean) {\n    if (mgrSource) {\n        let perfMgr: IPerfManager = mgrSource as IPerfManager;\n        if (perfMgr[STR_GET_PERF_MGR]) {\n            // Looks like a perf manager provider object\n            perfMgr = perfMgr[STR_GET_PERF_MGR]();\n        }\n        \n        if (perfMgr) {\n            let perfEvt: IPerfEvent;\n            let currentActive: IPerfEvent = perfMgr.getCtx(doPerfActiveKey);\n            try {\n                perfEvt = perfMgr.create(getSource(), details, isAsync);\n                if (perfEvt) {\n                    if (currentActive && perfEvt.setCtx) {\n                        perfEvt.setCtx(PerfEvent[strParentContextKey], currentActive);\n                        if (currentActive.getCtx && currentActive.setCtx) {\n                            let children: IPerfEvent[] = currentActive.getCtx(PerfEvent[strChildrenContextKey]);\n                            if (!children) {\n                                children = [];\n                                currentActive.setCtx(PerfEvent[strChildrenContextKey], children);\n                            }\n    \n                            children.push(perfEvt);\n                        }\n                    }\n    \n                    // Set this event as the active event now\n                    perfMgr.setCtx(doPerfActiveKey, perfEvt);\n                    return func(perfEvt);\n                }\n            } catch (ex) {\n                if (perfEvt && perfEvt.setCtx) {\n                    perfEvt.setCtx(\"exception\", ex);\n                }\n            } finally {\n                // fire the perf event\n                if (perfEvt) {\n                    perfMgr.fire(perfEvt);\n                }\n                \n                // Reset the active event to the previous value\n                perfMgr.setCtx(doPerfActiveKey, currentActive);\n            }\n        }\n    }\n\n    return func();\n}\n\n/**\n * Set the global performance manager to use when there is no core instance or it has not been initialized yet.\n * @param perfManager - The IPerfManager instance to use when no performance manager is supplied.\n */\nexport function setGblPerfMgr(perfManager: IPerfManager) {\n    _defaultPerfManager = perfManager;\n}\n\n/**\n * Get the current global performance manager that will be used with no performance manager is supplied.\n * @returns - The current default manager\n */\nexport function getGblPerfMgr(): IPerfManager {\n    return _defaultPerfManager;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/ProcessTelemetryContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport { arrForEach, dumpObj, isArray, isFunction, isNullOrUndefined, isUndefined, objForEachKey, objFreeze } from \"@nevware21/ts-utils\";\nimport { _applyDefaultValue } from \"../config/ConfigDefaults\";\nimport { createDynamicConfig } from \"../config/DynamicConfig\";\nimport { STR_CORE, STR_DISABLED, STR_EMPTY } from \"../constants/InternalConstants\";\nimport { _throwInternal, safeGetLogger } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport {\n    IBaseProcessingContext, IProcessTelemetryContext, IProcessTelemetryUnloadContext, IProcessTelemetryUpdateContext\n} from \"../interfaces/ai/IProcessTelemetryContext\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { IPlugin, ITelemetryPlugin } from \"../interfaces/ai/ITelemetryPlugin\";\nimport { ITelemetryPluginChain } from \"../interfaces/ai/ITelemetryPluginChain\";\nimport { ITelemetryUnloadState } from \"../interfaces/ai/ITelemetryUnloadState\";\nimport { ITelemetryUpdateState } from \"../interfaces/ai/ITelemetryUpdateState\";\nimport { IConfigDefaults } from \"../interfaces/config/IConfigDefaults\";\nimport { IDynamicConfigHandler } from \"../interfaces/config/IDynamicConfigHandler\";\nimport { _noopVoid } from \"../internal/noopHelpers\";\nimport { doPerf } from \"./PerfManager\";\nimport { _getPluginState } from \"./TelemetryHelpers\";\n\nconst strTelemetryPluginChain = \"TelemetryPluginChain\";\nconst strHasRunFlags = \"_hasRun\";\nconst strGetTelCtx = \"_getTelCtx\";\n\nlet _chainId = 0;\n\n/**\n * Identifies the type for the `extensionConfig` property\n * This is a key/value pair where the key is the name of the extension and the value is the configuration\n * for that extension.\n */\ntype ExtensionConfig = { [key: string]: any };\n\ninterface OnCompleteCallback {\n    func: () => void;\n    self: any;      // This for the function\n    args: any[];    // Additional arguments for the function\n}\n\ninterface IInternalTelemetryPluginChain extends ITelemetryPluginChain {\n    _id: string;\n    _setNext: (nextPlugin: IInternalTelemetryPluginChain) => void;\n}\n\ninterface IInternalContext<T extends IBaseProcessingContext> {\n    _next: () => ITelemetryPluginChain,\n\n    // The public context that will be exposed\n    ctx: T\n}\n\nfunction _getNextProxyStart(proxy: ITelemetryPluginChain, core: IAppInsightsCore, startAt: IPlugin): ITelemetryPluginChain {\n    while (proxy) {\n        if (proxy.getPlugin() === startAt) {\n            return proxy;\n        }\n\n        proxy = proxy.getNext();\n    }\n\n    // This wasn't found in the existing chain so create an isolated one with just this plugin\n    return createTelemetryProxyChain([startAt], core.config || {}, core);\n}\n\n/**\n * @ignore\n * @param telemetryChain\n * @param dynamicHandler\n * @param core\n * @param startAt - Identifies the next plugin to execute, if null there is no \"next\" plugin and if undefined it should assume the start of the chain\n * @returns\n */\nfunction _createInternalContext<T extends IBaseProcessingContext>(telemetryChain: ITelemetryPluginChain, dynamicHandler: IDynamicConfigHandler<IConfiguration>, core: IAppInsightsCore, startAt?: IPlugin): IInternalContext<T> {\n    // We have a special case where we want to start execution from this specific plugin\n    // or we simply reuse the existing telemetry plugin chain (normal execution case)\n    let _nextProxy: ITelemetryPluginChain | null = null;  // By Default set as no next plugin\n    let _onComplete: OnCompleteCallback[] = [];\n\n    if (!dynamicHandler) {\n        dynamicHandler = createDynamicConfig({}, null, core.logger);\n    }\n\n    if (startAt !== null) {\n        // There is no next element (null) vs not defined (undefined) so use the full chain\n        _nextProxy = startAt ? _getNextProxyStart(telemetryChain, core, startAt) : telemetryChain;\n    }\n\n    let context: IInternalContext<T> = {\n        _next: _moveNext,\n        ctx: {\n            core: () => {\n                return core\n            },\n            diagLog: () => {\n                return safeGetLogger(core, dynamicHandler.cfg);\n            },\n            getCfg: () => {\n                return dynamicHandler.cfg;\n            },\n            getExtCfg: _resolveExtCfg,\n            getConfig: _getConfig,\n            hasNext: () => {\n                return !!_nextProxy;\n            },\n            getNext: () => {\n                return _nextProxy;\n            },\n            setNext: (nextPlugin:ITelemetryPluginChain) => {\n                _nextProxy = nextPlugin;\n            },\n            iterate: _iterateChain,\n            onComplete: _addOnComplete\n        } as T\n    };\n\n    function _addOnComplete(onComplete: () => void, that?: any, ...args: any[]) {\n        if (onComplete) {\n            _onComplete.push({\n                func: onComplete,\n                self: !isUndefined(that) ? that : context.ctx,\n                args: args\n            });\n        }\n    }\n\n    function _moveNext() {\n        let nextProxy = _nextProxy;\n\n        // Automatically move to the next plugin\n        _nextProxy = nextProxy ? nextProxy.getNext() : null;\n\n        if (!nextProxy) {\n            let onComplete = _onComplete;\n            if (onComplete && onComplete.length > 0) {\n                arrForEach(onComplete, (completeDetails) => {\n                    try {\n                        completeDetails.func.call(completeDetails.self, completeDetails.args);\n                    } catch (e) {\n                        _throwInternal(\n                            core.logger,\n                            eLoggingSeverity.WARNING,\n                            _eInternalMessageId.PluginException,\n                            \"Unexpected Exception during onComplete - \" + dumpObj(e));\n                    }\n                });\n\n                _onComplete = [];\n            }\n        }\n\n        return nextProxy;\n    }\n\n    function _getExtCfg<T>(identifier: string, createIfMissing: boolean) {\n        let idCfg: T = null;\n        let extCfg: ExtensionConfig = _getCfg(dynamicHandler.cfg, \"extensionConfig\", createIfMissing);\n\n        if (extCfg) {\n            idCfg = _getCfg<typeof extCfg, T>(extCfg, identifier, createIfMissing);\n        }\n\n        return idCfg;\n    }\n\n    function _getCfg<Cfg extends { [key: string]: any } = typeof dynamicHandler.cfg, T = Cfg[keyof Cfg]>(cfg: Cfg, identifier: string, createIfMissing: boolean) {\n        let idCfg: T = null;\n        if (cfg && identifier) {\n            idCfg = cfg[identifier] as T;\n            if (!idCfg && createIfMissing) {\n                idCfg = {} as T;\n            }\n\n            // Always set the value so that the property always exists\n            (cfg as any)[identifier] = idCfg;         // Note: it is valid for the \"value\" to be undefined\n\n            // Calling `ref()` has a side effect of causing the referenced property to become dynamic  (if not already)\n            idCfg = dynamicHandler.ref(cfg, identifier);\n        }\n\n        return idCfg;\n    }\n\n    function _resolveExtCfg<T>(identifier: string, defaultValues: IConfigDefaults<T>, rootOnly?: boolean): T {\n        let newConfig: T = rootOnly ? _getCfg(dynamicHandler.cfg, identifier, true) : _getExtCfg(identifier, true);\n\n        if (defaultValues) {\n            // Enumerate over the defaultValues and if not already populated attempt to\n            // find a value from the root config or use the default value\n            objForEachKey(defaultValues, (field, defaultValue) => {\n                // for each unspecified field, set the default value\n                if (isNullOrUndefined(newConfig[field])) {\n                    let cfgValue = dynamicHandler.cfg[field];\n                    if (cfgValue || !isNullOrUndefined(cfgValue)) {\n                        newConfig[field] = cfgValue;\n                    }\n                }\n\n                _applyDefaultValue(dynamicHandler, newConfig, field, defaultValue);\n            });\n        }\n\n        return dynamicHandler.setDf(newConfig, defaultValues);\n    }\n\n    function _getConfig(identifier:string, field: string, defaultValue: number | string | boolean | string[] | RegExp[] | Function = false) {\n        let theValue;\n        let extConfig: T = _getExtCfg(identifier, false);\n        let rootConfig = dynamicHandler.cfg;\n\n        if (extConfig && (extConfig[field] || !isNullOrUndefined(extConfig[field]))) {\n            theValue = extConfig[field];\n        } else if (rootConfig[field] || !isNullOrUndefined(rootConfig[field])) {\n            theValue = rootConfig[field];\n        }\n\n        return (theValue || !isNullOrUndefined(theValue)) ? theValue : defaultValue;\n    }\n\n    function _iterateChain<T extends ITelemetryPlugin = ITelemetryPlugin>(cb: (plugin: T) => void) {\n        // Keep processing until we reach the end of the chain\n        let nextPlugin: ITelemetryPluginChain;\n        while(!!(nextPlugin = context._next())) {\n            let plugin = nextPlugin.getPlugin();\n            if (plugin) {\n                // callback with the current on\n                cb(plugin as T);\n            }\n        }\n    }\n\n    return context;\n}\n\n/**\n * Creates a new Telemetry Item context with the current config, core and plugin execution chain\n * @param plugins - The plugin instances that will be executed\n * @param config - The current config\n * @param core - The current core instance\n * @param startAt - Identifies the next plugin to execute, if null there is no \"next\" plugin and if undefined it should assume the start of the chain\n */\nexport function createProcessTelemetryContext(telemetryChain: ITelemetryPluginChain | null, cfg: IConfiguration, core:IAppInsightsCore, startAt?: IPlugin): IProcessTelemetryContext {\n    let config = createDynamicConfig(cfg);\n    let internalContext: IInternalContext<IProcessTelemetryContext> = _createInternalContext<IProcessTelemetryContext>(telemetryChain, config, core, startAt);\n    let context = internalContext.ctx;\n\n    function _processNext(env: ITelemetryItem) {\n        let nextPlugin: ITelemetryPluginChain = internalContext._next();\n\n        if (nextPlugin) {\n            // Run the next plugin which will call \"processNext()\"\n            nextPlugin.processTelemetry(env, context);\n        }\n\n        return !nextPlugin;\n    }\n\n    function _createNew(plugins: IPlugin[] | ITelemetryPluginChain | null = null, startAt?: IPlugin) {\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n        }\n\n        return createProcessTelemetryContext(plugins || context.getNext(), config.cfg, core, startAt);\n    }\n\n    context.processNext = _processNext;\n    context.createNew = _createNew;\n\n    return context;\n}\n\n/**\n * Creates a new Telemetry Item context with the current config, core and plugin execution chain for handling the unloading of the chain\n * @param plugins - The plugin instances that will be executed\n * @param config - The current config\n * @param core - The current core instance\n * @param startAt - Identifies the next plugin to execute, if null there is no \"next\" plugin and if undefined it should assume the start of the chain\n */\nexport function createProcessTelemetryUnloadContext(telemetryChain: ITelemetryPluginChain, core: IAppInsightsCore, startAt?: IPlugin): IProcessTelemetryUnloadContext {\n    let config = createDynamicConfig(core.config);\n    let internalContext: IInternalContext<IProcessTelemetryUnloadContext> = _createInternalContext<IProcessTelemetryUnloadContext>(telemetryChain, config, core, startAt);\n    let context = internalContext.ctx;\n\n    function _processNext(unloadState: ITelemetryUnloadState) {\n        let nextPlugin: ITelemetryPluginChain = internalContext._next();\n        nextPlugin && nextPlugin.unload(context, unloadState);\n\n        return !nextPlugin;\n    }\n\n    function _createNew(plugins: IPlugin[] | ITelemetryPluginChain = null, startAt?: IPlugin): IProcessTelemetryUnloadContext {\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n        }\n\n        return createProcessTelemetryUnloadContext(plugins || context.getNext(), core, startAt);\n    }\n\n    context.processNext = _processNext;\n    context.createNew = _createNew\n\n    return context;\n}\n\n/**\n * Creates a new Telemetry Item context with the current config, core and plugin execution chain for updating the configuration\n * @param plugins - The plugin instances that will be executed\n * @param config - The current config\n * @param core - The current core instance\n * @param startAt - Identifies the next plugin to execute, if null there is no \"next\" plugin and if undefined it should assume the start of the chain\n */\nexport function createProcessTelemetryUpdateContext(telemetryChain: ITelemetryPluginChain, core: IAppInsightsCore, startAt?: IPlugin): IProcessTelemetryUpdateContext {\n    let config = createDynamicConfig(core.config);\n    let internalContext: IInternalContext<IProcessTelemetryUpdateContext> = _createInternalContext<IProcessTelemetryUpdateContext>(telemetryChain, config, core, startAt);\n    let context = internalContext.ctx;\n\n    function _processNext(updateState: ITelemetryUpdateState) {\n        return context.iterate((plugin) => {\n            if (isFunction(plugin.update)) {\n                plugin.update(context, updateState);\n            }\n        });\n    }\n\n    function _createNew(plugins: IPlugin[] | ITelemetryPluginChain = null, startAt?: IPlugin) {\n        if (isArray(plugins)) {\n            plugins = createTelemetryProxyChain(plugins, config.cfg, core, startAt);\n        }\n\n        return createProcessTelemetryUpdateContext(plugins || context.getNext(), core, startAt);\n    }\n\n    context.processNext = _processNext;\n    context.createNew = _createNew;\n\n    return context;\n}\n\n/**\n * Creates an execution chain from the array of plugins\n * @param plugins - The array of plugins that will be executed in this order\n * @param defItemCtx - The default execution context to use when no telemetry context is passed to processTelemetry(), this\n * should be for legacy plugins only. Currently, only used for passing the current core instance and to provide better error\n * reporting (hasRun) when errors occur.\n */\nexport function createTelemetryProxyChain(plugins: IPlugin[], config: IConfiguration, core: IAppInsightsCore, startAt?: IPlugin): ITelemetryPluginChain {\n    let firstProxy: ITelemetryPluginChain = null;\n    let add = startAt ? false : true;\n\n    if (isArray(plugins) && plugins.length > 0) {\n        // Create the proxies and wire up the next plugin chain\n        let lastProxy: IInternalTelemetryPluginChain = null;\n        arrForEach(plugins, (thePlugin: ITelemetryPlugin) => {\n            if (!add && startAt === thePlugin) {\n                add = true;\n            }\n\n            if (add && thePlugin && isFunction(thePlugin.processTelemetry)) {\n                // Only add plugins that are processors\n                let newProxy = createTelemetryPluginProxy(thePlugin, config, core);\n                if (!firstProxy) {\n                    firstProxy = newProxy;\n                }\n\n                if (lastProxy) {\n                    // Set this new proxy as the next for the previous one\n                    lastProxy._setNext(newProxy as IInternalTelemetryPluginChain);\n                }\n                \n                lastProxy = newProxy as IInternalTelemetryPluginChain;\n            }\n        });\n    }\n\n    if (startAt && !firstProxy) {\n        // Special case where the \"startAt\" was not in the original list of plugins\n        return createTelemetryProxyChain([startAt], config, core);\n    }\n\n    return firstProxy;\n}\n\n/**\n * Create the processing telemetry proxy instance, the proxy is used to abstract the current plugin to allow monitoring and\n * execution plugins while passing around the dynamic execution state (IProcessTelemetryContext), the proxy instance no longer\n * contains any execution state and can be reused between requests (this was not the case for 2.7.2 and earlier with the\n * TelemetryPluginChain class).\n * @param plugin - The plugin instance to proxy\n * @param config - The default execution context to use when no telemetry context is passed to processTelemetry(), this\n * should be for legacy plugins only. Currently, only used for passing the current core instance and to provide better error\n * reporting (hasRun) when errors occur.\n * @returns\n */\nexport function createTelemetryPluginProxy(plugin: ITelemetryPlugin, config: IConfiguration, core: IAppInsightsCore): ITelemetryPluginChain {\n    let nextProxy: IInternalTelemetryPluginChain = null;\n    let hasProcessTelemetry = isFunction(plugin.processTelemetry);\n    let hasSetNext = isFunction(plugin.setNextPlugin);\n    let chainId: string;\n    if (plugin) {\n        chainId = plugin.identifier + \"-\" + plugin.priority + \"-\" + _chainId++;\n    } else {\n        chainId = \"Unknown-0-\" + _chainId++;\n    }\n    let proxyChain: IInternalTelemetryPluginChain = {\n        getPlugin: () => {\n            return plugin;\n        },\n        getNext: () => {\n            return nextProxy;\n        },\n        processTelemetry: _processTelemetry,\n        unload: _unloadPlugin,\n        update: _updatePlugin,\n        _id: chainId,\n        _setNext: (nextPlugin: IInternalTelemetryPluginChain) => {\n            nextProxy = nextPlugin;\n        }\n    };\n\n    function _getTelCtx() {\n        let itemCtx: IProcessTelemetryContext;\n\n        // Looks like a plugin didn't pass the (optional) context, so create a new one\n        if (plugin && isFunction(plugin[strGetTelCtx])) {\n            // This plugin extends from the BaseTelemetryPlugin so lets use it\n            itemCtx = plugin[strGetTelCtx]();\n        }\n\n        if (!itemCtx) {\n            // Create a temporary one\n            itemCtx = createProcessTelemetryContext(proxyChain, config, core);\n        }\n\n        return itemCtx;\n    }\n\n    function _processChain<T extends IBaseProcessingContext>(\n        itemCtx: T,\n        processPluginFn: (itemCtx: T) => boolean,\n        name: string,\n        details: () => any,\n        isAsync: boolean) {\n\n        let hasRun = false;\n        let identifier = plugin ? plugin.identifier : strTelemetryPluginChain;\n        let hasRunContext = itemCtx[strHasRunFlags];\n        if (!hasRunContext) {\n            // Assign and populate\n            hasRunContext = itemCtx[strHasRunFlags] = {};\n        }\n\n        // Ensure that we keep the context in sync\n        itemCtx.setNext(nextProxy);\n\n        if (plugin) {\n            doPerf(itemCtx.core(), () => identifier + \":\" + name, () => {\n                // Mark this component as having run\n                hasRunContext[chainId] = true;\n\n                try {\n                    // Set a flag on the next plugin so we know if it was attempted to be executed\n                    let nextId = nextProxy ? nextProxy._id : STR_EMPTY;\n                    if (nextId) {\n                        hasRunContext[nextId] = false;\n                    }\n\n                    hasRun = processPluginFn(itemCtx);\n                } catch (error) {\n                    let hasNextRun = nextProxy ? hasRunContext[nextProxy._id] : true;\n                    if (hasNextRun) {\n                        // The next plugin after us has already run so set this one as complete\n                        hasRun = true;\n                    }\n\n                    if (!nextProxy || !hasNextRun) {\n\n                        // Either we have no next plugin or the current one did not attempt to call the next plugin\n                        // Which means the current one is the root of the failure so log/report this failure\n                        _throwInternal(\n                            itemCtx.diagLog(),\n                            eLoggingSeverity.CRITICAL,\n                            _eInternalMessageId.PluginException,\n                            \"Plugin [\" + identifier + \"] failed during \" + name + \" - \" + dumpObj(error) + \", run flags: \" + dumpObj(hasRunContext));\n                    }\n                }\n            }, details, isAsync);\n        }\n\n        return hasRun;\n    }\n\n    function _processTelemetry(env: ITelemetryItem, itemCtx: IProcessTelemetryContext) {\n        itemCtx = itemCtx || _getTelCtx();\n\n        function _callProcessTelemetry(itemCtx: IProcessTelemetryContext) {\n            if (!plugin || !hasProcessTelemetry) {\n                return false;\n            }\n\n            let pluginState = _getPluginState(plugin);\n            if (pluginState.teardown || pluginState[STR_DISABLED]) {\n                return false;\n            }\n\n            // Ensure that we keep the context in sync (for processNext()), just in case a plugin\n            // doesn't calls processTelemetry() instead of itemContext.processNext() or some\n            // other form of error occurred\n            if (hasSetNext) {\n                // Backward compatibility setting the next plugin on the instance\n                plugin.setNextPlugin(nextProxy);\n            }\n\n            plugin.processTelemetry(env, itemCtx);\n\n            // Process Telemetry is expected to call itemCtx.processNext() or nextPlugin.processTelemetry()\n            return true;\n        }\n\n        if (!_processChain(itemCtx, _callProcessTelemetry, \"processTelemetry\", () => ({ item: env }), !((env as any).sync))) {\n            // The underlying plugin is either not defined, not enabled or does not have a processTelemetry implementation\n            // so we still want the next plugin to be executed.\n            itemCtx.processNext(env);\n        }\n    }\n\n    function _unloadPlugin(unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) {\n\n        function _callTeardown() {\n            // Setting default of hasRun as false so the proxyProcessFn() is called as teardown() doesn't have to exist or call unloadNext().\n            let hasRun = false;\n            if (plugin) {\n                let pluginState = _getPluginState(plugin);\n                let pluginCore = plugin[STR_CORE] || pluginState.core;\n                // Only teardown the plugin if it was initialized by the current core (i.e. It's not a shared plugin)\n                if (plugin && (!pluginCore || pluginCore === unloadCtx.core()) && !pluginState.teardown) {\n                    // Handle plugins that don't extend from the BaseTelemetryPlugin\n                    pluginState.core = null;\n                    pluginState.teardown = true;\n                    pluginState.isInitialized = false;\n    \n                    if (plugin.teardown && plugin.teardown(unloadCtx, unloadState) === true) {\n                        // plugin told us that it was going to (or has) call unloadCtx.processNext()\n                        hasRun = true;\n                    }\n                }\n            }\n\n            return hasRun;\n        }\n\n        if (!_processChain(unloadCtx, _callTeardown, \"unload\", _noopVoid, unloadState.isAsync)) {\n            // Only called if we hasRun was not true\n            unloadCtx.processNext(unloadState);\n        }\n    }\n\n    function _updatePlugin(updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState) {\n\n        function _callUpdate() {\n            // Setting default of hasRun as false so the proxyProcessFn() is called as teardown() doesn't have to exist or call unloadNext().\n            let hasRun = false;\n            if (plugin) {\n                let pluginState = _getPluginState(plugin);\n                let pluginCore = plugin[STR_CORE] || pluginState.core;\n\n                // Only update the plugin if it was initialized by the current core (i.e. It's not a shared plugin)\n                if (plugin && (!pluginCore || pluginCore === updateCtx.core()) && !pluginState.teardown) {\n                    if (plugin.update && plugin.update(updateCtx, updateState) === true) {\n                        // plugin told us that it was going to (or has) call unloadCtx.processNext()\n                        hasRun = true;\n                    }\n                }\n            }\n\n            return hasRun;\n        }\n        \n        if (!_processChain(updateCtx, _callUpdate, \"update\", _noopVoid, false)) {\n            // Only called if we hasRun was not true\n            updateCtx.processNext(updateState);\n        }\n    }\n\n    return objFreeze(proxyChain);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/ResponseHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { dumpObj } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { _throwInternal } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IBackendResponse } from \"../interfaces/ai/IXDomainRequest\";\nimport { getJSON } from \"../utils/EnvUtils\";\n\n/**\n * Parses the response from the backend.\n * @param response - XMLHttpRequest or XDomainRequest response\n */\nexport function parseResponse(response: any, diagLog?: IDiagnosticLogger): IBackendResponse {\n    try {\n        if (response && response !== STR_EMPTY) {\n            const result = getJSON().parse(response);\n\n            if (result && result.itemsReceived && result.itemsReceived >= result.itemsAccepted &&\n                result.itemsReceived - result.itemsAccepted === result.errors.length) {\n                return result;\n            }\n        }\n    } catch (e) {\n        _throwInternal(diagLog,\n            eLoggingSeverity.CRITICAL,\n            _eInternalMessageId.InvalidBackendResponse,\n            \"Cannot parse the response. \" + (e.name || dumpObj(e)),\n            {\n                response\n            });\n    }\n\n    return null;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/SenderPostManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { AwaitResponse, IPromise, createPromise, doAwaitResponse } from \"@nevware21/ts-async\";\nimport { arrForEach, dumpObj, getInst, getNavigator, getWindow, isFunction, isString, objKeys } from \"@nevware21/ts-utils\";\nimport { DisabledPropertyName } from \"../constants/Constants\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { _throwInternal, _warnToConsole } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { SendRequestReason } from \"../enums/ai/SendRequestReason\";\nimport { TransportType } from \"../enums/ext/Enums\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IProcessTelemetryUnloadContext } from \"../interfaces/ai/IProcessTelemetryContext\";\nimport {\n    _IInternalXhrOverride, _ISendPostMgrConfig, _ISenderOnComplete, _ITimeoutOverrideWrapper\n} from \"../interfaces/ai/ISenderPostManager\";\nimport { ITelemetryUnloadState } from \"../interfaces/ai/ITelemetryUnloadState\";\nimport { IXDomainRequest } from \"../interfaces/ai/IXDomainRequest\";\nimport { IPayloadData, IXHROverride, OnCompleteCallback, SendPOSTFunction } from \"../interfaces/ai/IXHROverride\";\nimport { _noopVoid } from \"../internal/noopHelpers\";\nimport { getLocation, isBeaconsSupported, isFetchSupported, isXhrSupported, useXDomainRequest } from \"../utils/EnvUtils\";\nimport { _getAllResponseHeaders, formatErrorMessageXdr, formatErrorMessageXhr, getResponseText, openXhr } from \"../utils/HelperFuncs\";\n\nconst STR_NO_RESPONSE_BODY = \"NoResponseBody\";\nconst _noResponseQs =  \"&\" + STR_NO_RESPONSE_BODY + \"=true\";\nconst STR_POST_METHOD = \"POST\";\ndeclare var XDomainRequest: {\n    prototype: IXDomainRequest;\n    new(): IXDomainRequest;\n};\n\n\n/**\n * This Internal component\n * Manager SendPost functions\n * SendPostManger\n * @internal for internal use only\n * @since 3.0.0\n */\nexport class SenderPostManager {\n\n    constructor() {\n\n        let _syncFetchPayload = 0;              // Keep track of the outstanding sync fetch payload total (as sync fetch has limits)\n        let _enableSendPromise: boolean;\n        let _isInitialized: boolean;\n        let _diagLog: IDiagnosticLogger;\n        let _isOneDs: boolean;\n        let _onCompleteFuncs: _ISenderOnComplete;\n        let _disableCredentials: boolean;\n        let _fetchCredentials: RequestCredentials;\n        let _fallbackInst: IXHROverride;\n        let _disableXhr: boolean;\n        let _disableBeacon: boolean;\n        let _disableBeaconSync: boolean;\n        let _disableFetchKeepAlive: boolean;\n        let _addNoResponse: boolean;\n        let _timeoutWrapper: _ITimeoutOverrideWrapper;\n       \n\n        dynamicProto(SenderPostManager, this, (_self, _base) => {\n\n            let _sendCredentials = true; // for 1ds\n            _initDefaults();\n\n\n           \n            _self.initialize = (config: _ISendPostMgrConfig, diagLog: IDiagnosticLogger): void => {\n                \n                _diagLog = diagLog;\n                if (_isInitialized) {\n                    _throwInternal(_diagLog, eLoggingSeverity.CRITICAL, _eInternalMessageId.SenderNotInitialized, \"Sender is already initialized\");\n                }\n                _self.SetConfig(config);\n                _isInitialized = true;\n\n            };\n\n            _self[\"_getDbgPlgTargets\"] = () => {\n                return [_isInitialized, _isOneDs, _disableCredentials, _enableSendPromise];\n            };\n\n            // This componet might get its config from sender, offline sender, 1ds post\n            // so set this function to mock dynamic changes\n            _self.SetConfig = (config: _ISendPostMgrConfig): boolean => {\n                try {\n                    _onCompleteFuncs = config.senderOnCompleteCallBack || {};\n                    _disableCredentials = !!config.disableCredentials;\n                    _fetchCredentials = config.fetchCredentials;\n                    _isOneDs = !!config.isOneDs;\n                    _enableSendPromise = !!config.enableSendPromise;\n                    _disableXhr = !! config.disableXhr;\n                    _disableBeacon = !!config.disableBeacon;\n                    _disableBeaconSync = !!config.disableBeaconSync;\n                    _timeoutWrapper = config.timeWrapper;\n                    _addNoResponse = !!config.addNoResponse;\n                    _disableFetchKeepAlive = !!config.disableFetchKeepAlive;\n    \n                    _fallbackInst = { sendPOST: _xhrSender} as IXHROverride;\n                    if (!_isOneDs) {\n                        _sendCredentials = false; // for appInsights, set it to false always\n                    }\n    \n                    if (_disableCredentials) {\n                        let location = getLocation();\n                        if (location && location.protocol && location.protocol.toLowerCase() === \"file:\") {\n                            // Special case where a local html file fails with a CORS error on Chromium browsers\n                            _sendCredentials = false;\n                        }\n                    }\n                    return true;\n\n                } catch(e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return false;\n            };\n\n\n            _self.getSyncFetchPayload = (): number => {\n                return _syncFetchPayload;\n            };\n\n            _self.getSenderInst = (transports: TransportType[], sync?: boolean): IXHROverride => {\n                if (transports && transports.length) {\n                    return _getSenderInterface(transports, sync);\n\n                }\n                return null;\n            }\n\n            _self.getFallbackInst = (): IXHROverride => {\n                return _fallbackInst;\n            }\n        \n            _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => {\n                _initDefaults();\n            };\n\n            _self.preparePayload = (callback: (processedPayload: IPayloadData) => void, zipPayload: boolean, payload: IPayloadData, isSync: boolean) => {\n                if (!zipPayload || isSync || !payload.data) {\n                    // If the request is synchronous, the body is null or undefined or Compression is not supported, we don't need to compress it\n                    callback(payload);\n                    return;\n                }\n                \n                try{\n                    let csStream: any = getInst(\"CompressionStream\");\n                    if (!isFunction(csStream)) {\n                        callback(payload);\n                        return;\n                    }\n\n                    // Create a readable stream from the uint8 data\n                    let body = new ReadableStream<Uint8Array>({\n                        start(controller) {\n                            controller.enqueue(isString(payload.data) ? new TextEncoder().encode(payload.data) : payload.data);\n                            controller.close();\n                        }\n                    });\n        \n                    const compressedStream = body.pipeThrough(new csStream(\"gzip\"));\n                    const reader = (compressedStream.getReader() as ReadableStreamDefaultReader<Uint8Array>);\n                    const chunks: Uint8Array[] = [];\n                    let totalLength = 0;\n                    let callbackCalled = false;\n                    \n                    // Process each chunk from the compressed stream reader\n                    doAwaitResponse(reader.read(), function processChunk(response: AwaitResponse<ReadableStreamReadResult<Uint8Array>>): undefined | IPromise<ReadableStreamReadResult<Uint8Array>> {\n                        if (!callbackCalled && !response.rejected) {\n                            // Process the chunk and continue reading\n                            const result = response.value;\n                            if (!result.done) {\n                                // Add current chunk and continue reading\n                                chunks.push(result.value);\n                                totalLength += result.value.length;\n                                return doAwaitResponse(reader.read(), processChunk) as any;\n                            }\n\n                            // We are complete so combine all chunks\n                            const combined = new Uint8Array(totalLength);\n                            let offset = 0;\n                            for (const chunk of chunks) {\n                                combined.set(chunk, offset);\n                                offset += chunk.length;\n                            }\n                            \n                            // Update payload with compressed data\n                            payload.data = combined;\n                            payload.headers[\"Content-Encoding\"] = \"gzip\";\n                            (payload as any)._chunkCount = chunks.length;\n                        }\n\n                        if (!callbackCalled) {\n                            // Send the processed payload to the callback, if not already called\n                            // If the response was rejected, we will call the callback with the original payload\n                            // As it only gets \"replaced\" if the compression was successful\n                            callbackCalled = true;\n                            callback(payload);\n                        }\n\n                        // We don't need to return anything as this will cause the calling chain to be resolved and closed\n                    });\n\n                    // returning the reader to allow the caller to cancel the stream if needed\n                    // This is not a requirement but allows for better control over the stream, like if we detect that we are unloading\n                    // we could use reader.cancel() to stop the stream and avoid sending the request, but this may still be an asynchronous operation\n                    // and may not be possible to cancel the stream in time\n                    return reader;\n                } catch (error) {\n                    // CompressionStream is not available at all\n                    callback(payload);\n                    return;\n                }\n            };\n\n            /**\n             * success handler\n             */\n            function _onSuccess (res?: string, onComplete?: OnCompleteCallback) {\n                _doOnComplete(onComplete, 200, {}, res);\n            }\n\n            /**\n             * error handler\n             */\n            function _onError(message: string, onComplete?: OnCompleteCallback) {\n                _throwInternal(_diagLog,\n                    eLoggingSeverity.WARNING,\n                    _eInternalMessageId.OnError,\n                    \"Failed to send telemetry.\",\n                    { message });\n                _doOnComplete(onComplete, 400, {});\n            }\n\n            function _onNoPayloadUrl(onComplete?: OnCompleteCallback) {\n                _onError( \"No endpoint url is provided for the batch\", onComplete);\n            }\n        \n\n            function _getSenderInterface(transports: TransportType[] | number[], syncSupport: boolean): _IInternalXhrOverride {\n                let transportType: TransportType = TransportType.NotSet;\n                let sendPostFunc: SendPOSTFunction = null;\n                let lp = 0;\n                while (sendPostFunc == null && lp < transports.length) {\n                    transportType = transports[lp];\n                    if (!_disableXhr && transportType === TransportType.Xhr) {\n                        if (useXDomainRequest()) {\n                            // IE 8 and 9\n                            sendPostFunc = _xdrSender;\n                        } else if (isXhrSupported()) {\n                            sendPostFunc = _xhrSender;\n                        }\n                    } else if (transportType === TransportType.Fetch && isFetchSupported(syncSupport) && (!syncSupport || !_disableFetchKeepAlive)) {\n                        sendPostFunc = _doFetchSender;\n                    } else if (transportType === TransportType.Beacon && isBeaconsSupported() && (syncSupport? !_disableBeaconSync : !_disableBeacon)) {\n                        sendPostFunc = _beaconSender;\n                    }\n\n                    lp++;\n                }\n\n                if (sendPostFunc) {\n                    return {\n                        _transport: transportType,\n                        _isSync: syncSupport,\n                        sendPOST: sendPostFunc\n                    };\n                }\n\n                return null;\n            }\n\n            function _doOnComplete(oncomplete: OnCompleteCallback, status: number, headers: { [headerName: string]: string }, response?: string) {\n                try {\n                    \n                    oncomplete && oncomplete(status, headers, response);\n                } catch (e) {\n                    // eslint-disable-next-line no-empty\n                }\n            }\n\n            \n            function _doBeaconSend(payload: IPayloadData, oncomplete?: OnCompleteCallback) {\n                const nav = getNavigator();\n                let url = payload.urlString;\n                if (!url) {\n                    _onNoPayloadUrl(oncomplete);\n                    // return true here, because we don't want to retry it with fallback sender\n                    return true;\n                }\n                url = payload.urlString + (_addNoResponse ? _noResponseQs : STR_EMPTY);\n                let data = payload.data;\n            \n                // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n                // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n            \n                // Chrome only allows CORS-safelisted values for the sendBeacon data argument\n                // see: https://bugs.chromium.org/p/chromium/issues/detail?id=720283\n                const plainTextBatch = _isOneDs? data : new Blob([data], { type: \"text/plain;charset=UTF-8\" });\n        \n                // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n                const queued = nav.sendBeacon(url, plainTextBatch);\n\n                return queued;\n            }\n\n            /**\n             * Send Beacon API request\n             * @param payload - The data payload to be sent.\n             * @param sync - not used\n             * Note: Beacon API does not support custom headers and we are not able to get\n             * appId from the backend for the correct correlation.\n             */\n            function _beaconSender(payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) {\n                let data = payload.data\n                try {\n                    if (data) {\n                        // The sendBeacon method returns true if the user agent is able to successfully queue the data for transfer. Otherwise it returns false.\n                        if (!_doBeaconSend(payload, oncomplete)) {\n                            let onRetry= _onCompleteFuncs && _onCompleteFuncs.beaconOnRetry;\n                            if (onRetry && isFunction(onRetry)) {\n                                onRetry(payload, oncomplete, _doBeaconSend);\n                            } else {\n                                _fallbackInst && _fallbackInst.sendPOST(payload, oncomplete, true);\n                                _throwInternal(_diagLog, eLoggingSeverity.WARNING, _eInternalMessageId.TransmissionFailed, \". \" + \"Failed to send telemetry with Beacon API, retried with normal sender.\");\n                            }\n                            \n                        } else {\n                            // if can send\n                            _onSuccess(STR_EMPTY, oncomplete); // if success, onComplete is called with status code 200\n                        }\n                    }\n\n                } catch(e) {\n                    _isOneDs && _warnToConsole(_diagLog, \"Failed to send telemetry using sendBeacon API. Ex:\" + dumpObj(e));\n                    _doOnComplete(oncomplete, _isOneDs? 0 : 400, {}, STR_EMPTY);\n                }\n                \n                return;\n            }\n        \n            /**\n             * Send XMLHttpRequest\n             * @param payload - The data payload to be sent.\n             * @param sync - Indicates if the request should be sent synchronously\n             */\n            function _xhrSender(payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean): void | IPromise<boolean> {\n                //let  internalPayload = payload as IInternalPayloadData;\n                let thePromise: void | IPromise<boolean>;\n                let resolveFunc: (sendComplete: boolean) => void;\n                let rejectFunc: (reason?: any) => void;\n                let headers = payload.headers || {};\n                if (!sync && _enableSendPromise) {\n                    thePromise = createPromise<boolean>((resolve, reject) => {\n                        resolveFunc = resolve;\n                        rejectFunc = reject;\n                    });\n                }\n\n                if (_isOneDs && sync && payload.disableXhrSync) {\n                    sync = false;\n                }\n\n                //const xhr = new XMLHttpRequest();\n                const endPointUrl = payload.urlString;\n                if (!endPointUrl) {\n                    _onNoPayloadUrl(oncomplete);\n                    resolveFunc && resolveFunc(false);\n                    return;\n                }\n\n                let xhr = openXhr(STR_POST_METHOD, endPointUrl, _sendCredentials, true, sync, payload.timeout);\n                if (!_isOneDs) {\n                    // application/json should NOT add to 1ds post by default\n                    xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                }\n\n    \n                arrForEach(objKeys(headers), (headerName) => {\n                    xhr.setRequestHeader(headerName, headers[headerName]);\n                });\n        \n                xhr.onreadystatechange = () => {\n                    if (!_isOneDs) {\n                        _doOnReadyFunc(xhr);\n                        if (xhr.readyState === 4 ) {\n                            resolveFunc && resolveFunc(true);\n                        }\n                    }\n                };\n\n                xhr.onload = () => {\n                    if (_isOneDs) {\n                        _doOnReadyFunc(xhr);\n                    }\n                };\n\n                function _doOnReadyFunc(xhr: XMLHttpRequest) {\n                    let onReadyFunc = _onCompleteFuncs && _onCompleteFuncs.xhrOnComplete;\n                    let onReadyFuncExist = onReadyFunc && isFunction(onReadyFunc);\n                \n                    if (onReadyFuncExist) {\n                        onReadyFunc(xhr, oncomplete, payload);\n                    } else {\n                        let response = getResponseText(xhr);\n                        _doOnComplete(oncomplete, xhr.status, _getAllResponseHeaders(xhr, _isOneDs), response);\n                    }\n                }\n\n                xhr.onerror = (event: ErrorEvent|any) => {\n                    _doOnComplete(oncomplete, _isOneDs? xhr.status : 400, _getAllResponseHeaders(xhr, _isOneDs), _isOneDs? STR_EMPTY : formatErrorMessageXhr(xhr));\n                    rejectFunc && rejectFunc(event);\n                };\n\n                xhr.ontimeout = () => {\n                    _doOnComplete(oncomplete,  _isOneDs? xhr.status : 500, _getAllResponseHeaders(xhr, _isOneDs), _isOneDs? STR_EMPTY : formatErrorMessageXhr(xhr));\n                    resolveFunc && resolveFunc(false);\n                };\n        \n                xhr.send(payload.data);\n\n                return thePromise;\n            }\n\n\n            /**\n             * Send fetch API request\n             * @param payload - The data payload to be sent.\n             * @param sync - For fetch this identifies whether we are \"unloading\" (false) or a normal request\n             */\n            function _doFetchSender(payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean): void | IPromise<boolean> {\n                let endPointUrl = payload.urlString;\n                const batch = payload.data;\n                const plainTextBatch = _isOneDs? batch : new Blob([batch], { type: \"application/json\" });\n                let thePromise: void | IPromise<boolean>;\n                let resolveFunc: (sendComplete: boolean) => void;\n                let rejectFunc: (reason?: any) => void;\n                let requestHeaders = new Headers();\n                let batchLength = batch.length;\n                let ignoreResponse = false;\n                let responseHandled = false;\n                let headers = payload.headers || {};\n                //TODO: handle time out for 1ds\n                \n               \n\n                const init: RequestInit = {\n                    method: STR_POST_METHOD,\n                    body: plainTextBatch,\n                    [DisabledPropertyName]: true            // Mark so we don't attempt to track this request\n                };\n\n                // Only add headers if there are headers to add, due to issue with some polyfills\n                if (payload.headers && objKeys(payload.headers).length > 0) {\n                    arrForEach(objKeys(headers), (headerName) => {\n                        requestHeaders.append(headerName, headers[headerName]);\n                    });\n                    init.headers = requestHeaders;\n                }\n\n\n                if (_fetchCredentials) {  // if user passed in this value via post channel (1ds), then use it\n                    init.credentials = _fetchCredentials;\n                } else if (_sendCredentials && _isOneDs) {\n                    // for 1ds, Don't send credentials when URL is file://\n                    init.credentials = \"include\";\n                }\n\n                if (sync) {\n                    init.keepalive = true;\n                   \n                    _syncFetchPayload += batchLength;\n                    if (_isOneDs) {\n                        if ((payload as any)[\"_sendReason\"] === SendRequestReason.Unload) {\n                            // As a sync request (during unload), it is unlikely that we will get a chance to process the response so\n                            // just like beacon send assume that the events have been accepted and processed\n                            ignoreResponse = true;\n                            if (_addNoResponse) {\n                                endPointUrl += _noResponseQs;\n                            }\n                        }\n                    } else {\n                        // for appinsights, set to true for all sync request\n                        ignoreResponse = true;\n                    }\n                }\n\n                const request = new Request(endPointUrl, init);\n                try {\n                    // Also try and tag the request (just in case the value in init is not copied over)\n                    (request as any)[DisabledPropertyName] = true;\n                } catch(e) {\n                    // If the environment has locked down the XMLHttpRequest (preventExtensions and/or freeze), this would\n                    // cause the request to fail and we no telemetry would be sent\n                }\n\n                if (!sync && _enableSendPromise) {\n                    thePromise = createPromise<boolean>((resolve, reject) => {\n                        resolveFunc = resolve;\n                        rejectFunc = reject;\n                    });\n                }\n                if (!endPointUrl) {\n                    _onNoPayloadUrl(oncomplete);\n                    resolveFunc && resolveFunc(false);\n                    return;\n                }\n\n                \n                function _handleError(res?: string, statusCode?: number) {\n                    // In case there is an error in the request. Set the status to 0 for 1ds and 400 for appInsights\n                    // so that the events can be retried later.\n                    if (statusCode) {\n                        _doOnComplete(oncomplete, _isOneDs? 0 : statusCode, {}, _isOneDs? STR_EMPTY: res);\n                    } else {\n                        _doOnComplete(oncomplete, _isOneDs? 0 : 400, {}, _isOneDs? STR_EMPTY: res);\n                    }\n                }\n\n                function _onFetchComplete(response: Response, payload?: IPayloadData, value?: string) {\n                    let status = response.status;\n                    let onCompleteFunc = _onCompleteFuncs.fetchOnComplete;\n                    if (onCompleteFunc && isFunction(onCompleteFunc)) {\n                        onCompleteFunc(response, oncomplete, value || STR_EMPTY, payload);\n                    } else {\n                        _doOnComplete(oncomplete, status, {}, value || STR_EMPTY);\n                    }\n\n                }\n\n                try {\n                    doAwaitResponse(fetch(_isOneDs? endPointUrl: request, _isOneDs? init: null), (result) => {\n                        if (sync) {\n                            _syncFetchPayload -= batchLength;\n                            batchLength = 0;\n                        }\n\n                        if (!responseHandled) {\n                            responseHandled = true;\n\n                            if (!result.rejected) {\n                                let response = result.value;\n                                try {\n                                    /**\n                                     * The Promise returned from fetch() won’t reject on HTTP error status even if the response is an HTTP 404 or 500.\n                                     * Instead, it will resolve normally (with ok status set to false), and it will only reject on network failure\n                                     * or if anything prevented the request from completing.\n                                     */\n                                    if (!_isOneDs && !response.ok) {\n                                        // this is for appInsights only\n                                        if (response.status){\n                                            _handleError(response.statusText, response.status);\n                                        } else {\n                                            _handleError(response.statusText, 499);\n                                        }\n                                        resolveFunc && resolveFunc(false);\n                                    } else {\n                                        if (_isOneDs && !response.body) {\n                                            _onFetchComplete(response, null, STR_EMPTY);\n                                            resolveFunc && resolveFunc(true);\n                                        } else {\n                                            doAwaitResponse(response.text(), (resp) => {\n                                                _onFetchComplete(response, payload, resp.value)\n                                                resolveFunc && resolveFunc(true);\n                                            });\n                                        }\n                                        \n                                    }\n\n                                } catch (e) {\n                                    if (response && response.status){\n                                        _handleError(dumpObj(e), response.status);\n                                    } else {\n                                        _handleError(dumpObj(e), 499);\n                                    }\n                                    rejectFunc && rejectFunc(e);\n                                }\n                                \n                            } else {\n                                _handleError(result.reason && result.reason.message, 499);\n                                rejectFunc && rejectFunc(result.reason);\n                            }\n                        }\n                    });\n                } catch (e) {\n                    if (!responseHandled) {\n                        _handleError(dumpObj(e), 499);\n                        rejectFunc && rejectFunc(e);\n                    }\n                }\n\n                if (ignoreResponse && !responseHandled) {\n                    // Assume success during unload processing as we most likely won't get the response\n                    responseHandled = true;\n                    _doOnComplete(oncomplete, 200, {});\n                    resolveFunc && resolveFunc(true);\n                }\n\n                if (_isOneDs && !responseHandled && payload.timeout > 0) {\n                    // Simulate timeout\n                    _timeoutWrapper && _timeoutWrapper.set(() => {\n                        if (!responseHandled) {\n                            // Assume a 500 response (which will cause a retry)\n                            responseHandled = true;\n                            _doOnComplete(oncomplete, 500, {});\n                            resolveFunc && resolveFunc(true);\n                            \n                        }\n                    }, payload.timeout);\n                }\n\n                return thePromise;\n            }\n\n        \n            /**\n             * Send XDomainRequest\n             * @param payload - The data payload to be sent.\n             * @param sync - Indicates if the request should be sent synchronously\n             *\n             * Note: XDomainRequest does not support sync requests. This 'isAsync' parameter is added\n             * to maintain consistency with the xhrSender's contract\n             * Note: XDomainRequest does not support custom headers and we are not able to get\n             * appId from the backend for the correct correlation.\n             */\n            function _xdrSender(payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) {\n                // It doesn't support custom headers, so no action is taken with current requestHeaders\n                let _window = getWindow();\n                const xdr = new XDomainRequest();\n                \n                let data = payload.data;\n\n                xdr.onload = () => {\n                    let response = getResponseText(xdr);\n                    let onloadFunc = _onCompleteFuncs && _onCompleteFuncs.xdrOnComplete;\n                    if (onloadFunc && isFunction(onloadFunc)) {\n                        onloadFunc(xdr, oncomplete, payload);\n                    } else {\n                        _doOnComplete(oncomplete, 200, {}, response);\n\n                    }\n                    \n                };\n              \n                xdr.onerror = () => {\n                    _doOnComplete(oncomplete, 400, {}, _isOneDs? STR_EMPTY: formatErrorMessageXdr(xdr));\n                };\n\n                xdr.ontimeout = () => {\n                    _doOnComplete(oncomplete, 500, {});\n                };\n\n                \n                xdr.onprogress = _noopVoid;\n        \n                // XDomainRequest requires the same protocol as the hosting page.\n                // If the protocol doesn't match, we can't send the telemetry :(.\n                const hostingProtocol = _window && _window.location && _window.location.protocol || STR_EMPTY;\n                let endpoint = payload.urlString;\n                if (!endpoint) {\n                    _onNoPayloadUrl(oncomplete);\n                    return;\n                }\n                if (!_isOneDs && endpoint.lastIndexOf(hostingProtocol, 0) !== 0) {\n                    let msg = \"Cannot send XDomain request. The endpoint URL protocol doesn't match the hosting page protocol.\";\n                    _throwInternal(_diagLog,\n                        eLoggingSeverity.WARNING,\n                        _eInternalMessageId.TransmissionFailed, \". \" + msg);\n                    _onError(msg, oncomplete);\n        \n                    return;\n                }\n        \n                const endpointUrl = _isOneDs? endpoint : endpoint.replace(/^(https?:)/, STR_EMPTY);\n                xdr.open(STR_POST_METHOD, endpointUrl);\n                if (payload.timeout) {\n                    xdr.timeout = payload.timeout;\n                }\n\n        \n                xdr.send(data as any);\n                \n                if (_isOneDs && sync) {\n                    _timeoutWrapper && _timeoutWrapper.set(() => {\n                        xdr.send(data as any);\n                    }, 0);\n\n                } else {\n                    xdr.send(data as any);\n                }\n              \n            }\n        \n            function _initDefaults() {\n                _syncFetchPayload = 0;\n                _isInitialized = false;\n                _enableSendPromise = false;\n                _diagLog = null;\n                _isOneDs = null;\n                _onCompleteFuncs = null;\n                _disableCredentials = null;\n                _fetchCredentials = null;\n                _fallbackInst = null;\n                _disableXhr = false;\n                _disableBeacon = false;\n                _disableBeaconSync = false;\n                _disableFetchKeepAlive = false;\n                _addNoResponse = false;\n                _timeoutWrapper = null;\n            }\n        });\n    }\n\n\n\n    public initialize(config: _ISendPostMgrConfig, diagLog: IDiagnosticLogger): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Get size of current sync fetch payload\n     */\n    public getSyncFetchPayload(): number {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * reset Config\n     * @returns True if set is successfully\n     */\n    public SetConfig(config: _ISendPostMgrConfig): boolean {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get current xhr instance\n     */\n    public getSenderInst(transports: TransportType[], sync?: boolean): IXHROverride {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    /**\n     * Get current fallback sender instance\n     */\n    public getFallbackInst(): IXHROverride {\n        // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public _doTeardown (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public preparePayload(callback: (processedPayload: IPayloadData) => void, zipPayload: boolean, payload: IPayloadData, isSync: boolean): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/StatsBeat.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    ITimerHandler, arrForEach, isNumber, makeGlobRegex, objDefineProps, scheduleTimeout, strIndexOf, strLower, utcNow\n} from \"@nevware21/ts-utils\";\nimport { onConfigChange } from \"../config/DynamicConfig\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { _throwInternal, safeGetLogger } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { eStatsType } from \"../enums/ai/StatsType\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { INetworkStatsbeat } from \"../interfaces/ai/INetworkStatsbeat\";\nimport { IStatsBeat, IStatsBeatConfig, IStatsBeatState, IStatsEndpointConfig } from \"../interfaces/ai/IStatsBeat\";\nimport { IStatsMgr, IStatsMgrConfig } from \"../interfaces/ai/IStatsMgr\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { IPayloadData } from \"../interfaces/ai/IXHROverride\";\nimport { isFeatureEnabled } from \"../utils/HelperFuncs\";\n\nconst STATS_COLLECTION_SHORT_INTERVAL: number = 900000; // 15 minutes\nconst STATS_MIN_INTERVAL_SECONDS = 60; // 1 minute\nconst STATSBEAT_LANGUAGE = \"JavaScript\";\nconst STATSBEAT_TYPE = \"Browser\";\n\n\n/**\n * An internal interface to allow the IStatsBeat instance to call back to the manager for\n * critical tasks, like starting the timer, sending the events and to inform the manager\n * that this instance is stopping. This is used to ensure that the manager is able to\n * track and control the lifecycle of the instance.\n * @internal\n */\ninterface _IMgrCallbacks {\n    /**\n     * Provides a callback to the manager to start a timer for the statsbeat instance.\n     * This is used to ensure that the manager is able to control the lifecycle of the instance\n     * @param cb - The callback to call when the timer is started\n     * @returns A handle to the timer that was started, this can be used to cancel the timer if needed\n     */\n    start: (cb: () => void) => ITimerHandler;\n\n    /**\n     * Provides a callback to the manager to send the statsbeat event to the core.\n     * This is used to ensure that the manager is able to control the lifecycle of the instance\n     * @param statsbeatEvent - The statsbeat event to send to the core\n     * @param endpoint - The endpoint to send the event to\n     */\n    track: (statsBeat: IStatsBeat, statsbeatEvent: ITelemetryItem) => void;\n}\n\n/**\n * This function checks if the provided endpoint matches the provided urlMatch. It\n * compares the endpoint with the urlMatch in a case-insensitive manner and also checks\n * if the endpoint is a substring of the urlMatch. The urlMatch can also be a regex\n * pattern, in which case it will be checked against the endpoint using regex.\n * @param endpoint - The endpoint to check against the URL.\n * @param urlMatch - The URL to check against the endpoint.\n * @returns true if the URL matches the endpoint, false otherwise.\n */\nfunction _isMatchEndpoint(endpoint: string, urlMatch: string): boolean {\n    let lwrUrl = strLower(urlMatch);\n\n    // Check if the endpoint is a substring of the URL\n    if (strIndexOf(endpoint, lwrUrl) !== -1) {\n        return true;\n    }\n\n    // If it looks like a regex pattern, check if the endpoint matches the regex\n    if (strIndexOf(lwrUrl, \"*\") != -1 || strIndexOf(lwrUrl, \"?\") != -1) {\n        // Check if the endpoint is a regex pattern\n        let regex = makeGlobRegex(lwrUrl);\n        if (regex.test(endpoint)) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n/**\n * Creates a new INetworkStatsbeat instance with the specified host.\n * @param host - The host for the INetworkStatsbeat instance.\n * @returns A new INetworkStatsbeat instance.\n */\nfunction _createNetworkStatsbeat(host: string): INetworkStatsbeat {\n    return {\n        host,\n        totalRequest: 0,\n        success: 0,\n        throttle: {},\n        failure: {},\n        retry: {},\n        exception: {},\n        requestDuration: 0\n    };\n}\n\n/**\n * Creates a new IStatsBeat instance with the specified manager callbacks and statsbeat state.\n * @param mgr - The manager callbacks to use for the IStatsBeat instance.\n * @param statsBeatStats - The statsbeat state to use for the IStatsBeat instance.\n * @returns A new IStatsBeat instance.\n */\nfunction _createStatsBeat(mgr: _IMgrCallbacks, statsBeatStats: IStatsBeatState): IStatsBeat {\n    let _networkCounter: INetworkStatsbeat = _createNetworkStatsbeat(statsBeatStats.endpoint);\n    let _timeoutHandle: ITimerHandler;      // Handle to the timer for sending telemetry. This way, we would not send telemetry when system sleep.\n    let _isEnabled: boolean = true;         // Flag to check if statsbeat is enabled or not\n\n    function _setupTimer() {\n        if (_isEnabled && !_timeoutHandle) {\n            _timeoutHandle = mgr.start(() => {\n                _timeoutHandle = null;\n                trackStatsbeats();\n            });\n        }\n    }\n\n    function trackStatsbeats() {\n        if (_isEnabled) {\n            _trackSendRequestDuration();\n            _trackSendRequestsCount();\n            _networkCounter = _createNetworkStatsbeat(_networkCounter.host);\n            _timeoutHandle && _timeoutHandle.cancel();\n            _timeoutHandle = null;\n        }\n    }\n\n    /**\n     * This is a simple helper that checks if the currently reporting endpoint is the same as this instance was\n     * created with. This is used to ensure that we only send statsbeat events to the endpoint that was used\n     * when the instance was created. This is important as the endpoint can change during the lifetime of the\n     * instance and we don't want to send statsbeat events to the wrong endpoint.\n     * @param endpoint\n     * @returns true if the endpoint is the same as the one used to create the instance, false otherwise\n     */\n    function _checkEndpoint(endpoint: string) {\n        return _networkCounter.host === endpoint;\n    }\n\n    /**\n     * Attempt to send statsbeat events to the server. This is done by creating a new event and sending it to the core.\n     * The event is created with the name and value passed in, and any additional properties are added to the event as well.\n     * This will only send the event when\n     * - the statsbeat is enabled\n     * - the statsbeat key is set for the current endpoint\n     * - the value is greater than 0\n     * @param name - The name of the event to send\n     * @param val - The value of the event to send\n     * @param properties - Optional additional properties to add to the event\n     */\n    function _sendStatsbeats(name: string, val: number, properties?: { [name: string]: any }) {\n        if (_isEnabled && val && val > 0){\n            // Add extra properties\n            let baseProperties = {\n                \"rp\": \"unknown\",\n                \"attach\": \"Manual\",\n                \"cikey\": statsBeatStats.cKey,\n                \"os\": STATSBEAT_TYPE,\n                \"language\": STATSBEAT_LANGUAGE,\n                \"version\": statsBeatStats.sdkVer || \"unknown\",\n                \"endpoint\": \"breeze\",\n                \"host\": _networkCounter.host\n            } as { [key: string]: any };\n\n            // Manually merge properties instead of using spread syntax\n            let combinedProps: { [key: string]: any } = { \"host\": _networkCounter.host };\n            \n            // Add properties if present\n            if (properties) {\n                for (let key in properties) {\n                    if (properties.hasOwnProperty(key)) {\n                        combinedProps[key] = properties[key];\n                    }\n                }\n            }\n\n            // Add base properties\n            for (let key in baseProperties) {\n                if (baseProperties.hasOwnProperty(key)) {\n                    combinedProps[key] = baseProperties[key];\n                }\n            }\n\n            let statsbeatEvent: ITelemetryItem = {\n                name: name,\n                baseData: {\n                    name: name,\n                    average: val,\n                    properties: combinedProps\n                },\n                baseType: \"MetricData\"\n            };\n\n            mgr.track(statsBeat, statsbeatEvent);\n        }\n    }\n\n    function _trackSendRequestDuration() {\n        var totalRequest = _networkCounter.totalRequest;\n    \n        if (_networkCounter.totalRequest > 0 ) {\n            let averageRequestExecutionTime = _networkCounter.requestDuration / totalRequest;\n            _sendStatsbeats(\"Request_Duration\", averageRequestExecutionTime);\n        }\n    }\n\n    function _trackSendRequestsCount() {\n        var currentCounter = _networkCounter;\n        _sendStatsbeats(\"Request_Success_Count\", currentCounter.success);\n        \n        for (const code in currentCounter.failure) {\n            const count = currentCounter.failure[code];\n            _sendStatsbeats(\"failure\", count, { statusCode: code });\n        }\n\n        for (const code in currentCounter.retry) {\n            const count = currentCounter.retry[code];\n            _sendStatsbeats(\"retry\", count, { statusCode: code });\n        }\n\n        for (const code in currentCounter.exception) {\n            const count = currentCounter.exception[code];\n            _sendStatsbeats(\"exception\", count, { exceptionType: code });\n        }\n    \n        for (const code in currentCounter.throttle) {\n            const count = currentCounter.throttle[code];\n            _sendStatsbeats(\"Throttle_Count\", count, { statusCode: code });\n        }\n    }\n\n    function _setEnabled(isEnabled: boolean) {\n        _isEnabled = isEnabled;\n        if (!_isEnabled) {\n            if (_timeoutHandle) {\n                _timeoutHandle.cancel();\n                _timeoutHandle = null;\n            }\n        }\n    }\n\n    // THE statsbeat instance being created and returned\n    let statsBeat: IStatsBeat = {\n        enabled: !!_isEnabled,\n        endpoint: STR_EMPTY,\n        type: eStatsType.SDK,\n        count: (status: number, payloadData: IPayloadData, endpoint: string) => {\n            if (_isEnabled && _checkEndpoint(endpoint)) {\n                if (payloadData && (payloadData as any)[\"statsBeatData\"] && (payloadData as any)[\"statsBeatData\"][\"startTime\"]) {\n                    _networkCounter.totalRequest = (_networkCounter.totalRequest || 0) + 1;\n                    _networkCounter.requestDuration += utcNow() - (payloadData as any)[\"statsBeatData\"][\"startTime\"];\n                }\n\n                let retryArray = [401, 403, 408, 429, 500, 502, 503, 504];\n                let throttleArray = [402, 439];\n\n                if (status >= 200 && status < 300) {\n                    _networkCounter.success++;\n                } else if (retryArray.indexOf(status) !== -1) {\n                    _networkCounter.retry[status] = (_networkCounter.retry[status] || 0) + 1;\n                } else if (throttleArray.indexOf(status) !== -1) {\n                    _networkCounter.throttle[status] = (_networkCounter.throttle[status] || 0) + 1;\n                } else if (status !== 307 && status !== 308) {\n                    _networkCounter.failure[status] = (_networkCounter.failure[status] || 0) + 1;\n                }\n\n                _setupTimer();\n            }\n        },\n        countException: (endpoint: string, exceptionType: string) => {\n            if (_isEnabled && _checkEndpoint(endpoint)) {\n                _networkCounter.exception[exceptionType] = (_networkCounter.exception[exceptionType] || 0) + 1;\n                _setupTimer();\n            }\n        }\n    };\n\n    // Make the properties readonly / reactive to changes\n    return objDefineProps(statsBeat, {\n        enabled: { g: () => _isEnabled, s: _setEnabled },\n        type: { g: () => statsBeatStats.type },\n        endpoint: { g: () => _networkCounter.host }\n    });\n}\n\nfunction _getEndpointCfg(statsBeatConfig: IStatsBeatConfig, type: eStatsType): IStatsEndpointConfig {\n    let endpointCfg: IStatsEndpointConfig = null;\n    if (statsBeatConfig && statsBeatConfig.endCfg) {\n        arrForEach(statsBeatConfig.endCfg, (value) => {\n            if (value.type === type) {\n                endpointCfg = value;\n                return -1; // Stop the loop if we found a match\n            }\n        });\n    }\n\n    return endpointCfg;\n}\n\n/**\n * This function retrieves the stats instrumentation key (iKey) for the given endpoint from\n * the statsBeatConfig. It iterates through the keys in the statsBeatConfig and checks if\n * the endpoint matches any of the URLs associated with that key. If a match is found, it\n * returns the corresponding iKey.\n * @param statsBeatConfig - The configuration object for StatsBeat.\n * @param endpoint - The endpoint to check against the URLs in the configuration.\n * @returns The iKey associated with the matching endpoint, or null if no match is found.\n */\nfunction _getIKey(endpointCfg: IStatsEndpointConfig, endpoint: string): string | null {\n    let statsKey: string = null;\n    if (endpointCfg.keyMap) {\n        arrForEach(endpointCfg.keyMap, (keyMap) => {\n            if (keyMap.match) {\n                arrForEach(keyMap.match, (url) => {\n                    if (_isMatchEndpoint(url, endpoint)) {\n                        statsKey = keyMap.key || null;\n\n                        // Stop the loop if we found a match\n                        return -1;\n                    }\n                });\n            }\n\n            if (statsKey) {\n                // Stop the loop if we found a match\n                return -1;\n            }\n        });\n    }\n\n    return statsKey;\n}\n\nexport function createStatsMgr(): IStatsMgr {\n    let _isMgrEnabled: boolean = false; // Flag to check if statsbeat is enabled or not\n    let _core: IAppInsightsCore; // The core instance that is used to send telemetry\n    let _shortInterval = STATS_COLLECTION_SHORT_INTERVAL;\n    let _statsBeatConfig: IStatsBeatConfig;\n\n    // Lazily initialize the manager and start listening for configuration changes\n    // This is also required to handle \"unloading\" and then re-initializing again\n    function _init<CfgType extends IConfiguration = IConfiguration>(core: IAppInsightsCore<CfgType>, statsConfig: IStatsMgrConfig<CfgType>, featureName?: string) {\n        if (_core) {\n            // If the core is already set, then just return with an empty unload hook\n            _throwInternal(safeGetLogger(core), eLoggingSeverity.WARNING, _eInternalMessageId.StatsBeatManagerException, \"StatsBeat manager is already initialized\");\n            return null;\n        }\n\n        _core = core;\n        if (core && core.isInitialized()) {\n            // Start listening for configuration changes from the core config, within a config change handler\n            // This will support the scenario where the config is changed after the statsbeat has been created\n            return onConfigChange(core.config, (details) => {\n                // Check the feature state again to see if it has changed\n                _isMgrEnabled = false;\n                if (statsConfig && isFeatureEnabled(statsConfig.feature, details.cfg, false) === true) {\n                    // Call the getCfg function to get the latest configuration for the statsbeat instance\n                    // This should also evaluate the throttling level and other settings for the statsbeat instance\n                    // to determine if it should be enabled or not.\n                    _statsBeatConfig = statsConfig.getCfg(core, details.cfg);\n                    if (_statsBeatConfig) {\n                        _isMgrEnabled = true;\n                        _shortInterval = STATS_COLLECTION_SHORT_INTERVAL; // Reset to the default in-case the config is removed / changed\n                        if (isNumber(_statsBeatConfig.shrtInt) && _statsBeatConfig.shrtInt > STATS_MIN_INTERVAL_SECONDS) {\n                            _shortInterval = _statsBeatConfig.shrtInt * 1000; // Convert to milliseconds\n                        }\n                    }\n                }\n            });\n        }\n    }\n\n    function _track(statsBeat: IStatsBeat, statsBeatEvent: ITelemetryItem) {\n        if (_isMgrEnabled && _statsBeatConfig) {\n            let endpoint = statsBeat.endpoint;\n            let sendEvt = !!statsBeat.type;\n\n            // Fetching the stats key for the endpoint here to support the scenario where the endpoint is changed\n            // after the statsbeat instance is created. This will ensure that the correct stats key is used for the endpoint.\n            // It also avoids the tracking of the statsbeat event if the endpoint is not in the config.\n            let endpointCfg = _getEndpointCfg(_statsBeatConfig, statsBeat.type);\n            if (endpointCfg) {\n                // Check for key remapping\n                let statsKey = _getIKey(endpointCfg, endpoint);\n                if (statsKey) {\n                    // Using this iKey for the statsbeat event\n                    statsBeatEvent.iKey = statsKey;\n                    // We have specific config for this endpoint, so we can send the event\n                    sendEvt = true;\n                }\n\n                if (sendEvt) {\n                    _core.track(statsBeatEvent);\n                }\n            }\n        }\n    }\n\n    function _createInstance(state: IStatsBeatState): IStatsBeat {\n        let instance: IStatsBeat = null;\n\n        if (_isMgrEnabled) {\n            let callbacks: _IMgrCallbacks = {\n                start: (cb: () => void) => {\n                    return scheduleTimeout(cb, _shortInterval);\n                },\n                track: _track\n            };\n\n            instance = _createStatsBeat(callbacks, state);\n        }\n\n        return instance;\n    }\n\n    let theMgr = {\n        enabled: false,\n        newInst: _createInstance,\n        init: _init\n    };\n\n    return objDefineProps(theMgr, {\n        \"enabled\": { g: () => _isMgrEnabled }\n    });\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/TelemetryHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, isFunction, objDefineProps } from \"@nevware21/ts-utils\";\nimport { STR_CORE, STR_EMPTY, STR_PRIORITY, STR_PROCESS_TELEMETRY, UNDEFINED_VALUE } from \"../constants/InternalConstants\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IDistributedTraceContext, IDistributedTraceInit } from \"../interfaces/ai/IDistributedTraceContext\";\nimport { IProcessTelemetryContext, IProcessTelemetryUnloadContext } from \"../interfaces/ai/IProcessTelemetryContext\";\nimport { IPlugin, ITelemetryPlugin } from \"../interfaces/ai/ITelemetryPlugin\";\nimport { ITelemetryPluginChain } from \"../interfaces/ai/ITelemetryPluginChain\";\nimport { ITelemetryUnloadState } from \"../interfaces/ai/ITelemetryUnloadState\";\nimport { IUnloadableComponent } from \"../interfaces/ai/IUnloadableComponent\";\nimport { IW3cTraceState } from \"../interfaces/ai/IW3cTraceState\";\nimport { IOTelSpanContext } from \"../interfaces/otel/trace/IOTelSpanContext\";\nimport { createOTelSpanContext } from \"../otel/api/trace/spanContext\";\nimport { isOTelTraceState } from \"../otel/api/trace/traceState\";\nimport { createW3cTraceState } from \"../telemetry/W3cTraceState\";\nimport { generateW3CId } from \"../utils/CoreUtils\";\nimport { createElmNodeData } from \"../utils/DataCacheHelper\";\nimport { getLocation } from \"../utils/EnvUtils\";\nimport { setProtoTypeName } from \"../utils/HelperFuncs\";\nimport { isValidSpanId, isValidTraceId } from \"../utils/TraceParent\";\n\nexport interface IPluginState {\n    core?: IAppInsightsCore;\n    isInitialized?: boolean;\n    teardown?: boolean;\n    disabled?: boolean;\n}\n\nconst pluginStateData = createElmNodeData(\"plugin\");\n\nexport function _getPluginState(plugin: IPlugin): IPluginState {\n    return pluginStateData.get<IPluginState>(plugin, \"state\", {}, true)\n}\n\n/**\n * Initialize the queue of plugins\n * @param plugins - The array of plugins to initialize and setting of the next plugin\n * @param config - The current config for the instance\n * @param core - THe current core instance\n * @param extensions - The extensions\n */\nexport function initializePlugins(processContext: IProcessTelemetryContext, extensions: IPlugin[]) {\n\n    // Set the next plugin and identified the uninitialized plugins\n    let initPlugins: ITelemetryPlugin[] = [];\n    let lastPlugin: ITelemetryPlugin = null;\n    let proxy: ITelemetryPluginChain = processContext.getNext();\n    let pluginState: IPluginState;\n\n    while (proxy) {\n        let thePlugin = proxy.getPlugin();\n        if (thePlugin) {\n            if (lastPlugin && lastPlugin.setNextPlugin && thePlugin.processTelemetry) {\n                // Set this plugin as the next for the previous one\n                lastPlugin.setNextPlugin(thePlugin);\n            }\n\n            pluginState = _getPluginState(thePlugin);\n\n            let isInitialized = !!pluginState.isInitialized;\n            if (thePlugin.isInitialized) {\n                isInitialized = thePlugin.isInitialized();\n            }\n\n            if (!isInitialized) {\n                initPlugins.push(thePlugin);\n            }\n\n            lastPlugin = thePlugin;\n            proxy = proxy.getNext();\n        }\n    }\n\n    // Now initialize the plugins\n    arrForEach(initPlugins, thePlugin => {\n        let core = processContext.core();\n\n        thePlugin.initialize(\n            processContext.getCfg(),\n            core,\n            extensions,\n            processContext.getNext());\n\n        pluginState = _getPluginState(thePlugin);\n\n        // Only add the core to the state if the plugin didn't set it (doesn't extend from BaseTelemetryPlugin)\n        if (!thePlugin[STR_CORE] && !pluginState[STR_CORE]) {\n            pluginState[STR_CORE] = core;\n        }\n\n        pluginState.isInitialized = true;\n        delete pluginState.teardown;\n    });\n}\n\nexport function sortPlugins<T = IPlugin>(plugins: T[]) {\n    // Sort by priority\n    return plugins.sort((extA: any, extB: any) => {\n        let result = 0;\n        if (extB) {\n            let bHasProcess = extB[STR_PROCESS_TELEMETRY];\n            if (extA[STR_PROCESS_TELEMETRY]) {\n                result = bHasProcess ? extA[STR_PRIORITY] - extB[STR_PRIORITY] : 1;\n            } else if (bHasProcess) {\n                result = -1;\n            }\n        } else {\n            result = extA ? 1 : -1;\n        }\n\n        return result;\n    });\n    // sort complete\n}\n\n/**\n * Teardown / Unload helper to perform teardown/unloading operations for the provided components synchronously or asynchronously, this will call any\n * _doTeardown() or _doUnload() functions on the provided components to allow them to finish removal.\n * @param components - The components you want to unload\n * @param unloadCtx - This is the context that should be used during unloading.\n * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n * @param asyncCallback - An optional callback that the plugin must call if it returns true to inform the caller that it has completed any async unload/teardown operations.\n * @returns boolean - true if the plugin has or will call asyncCallback, this allows the plugin to perform any asynchronous operations.\n */\nexport function unloadComponents(components: any | IUnloadableComponent[], unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void): void | boolean {\n    let idx = 0;\n\n    function _doUnload(): void | boolean {\n        while (idx < components.length) {\n            let component = components[idx++];\n            if (component) {\n                let func = component._doUnload || component._doTeardown;\n                if (isFunction(func)) {\n                    if (func.call(component, unloadCtx, unloadState, _doUnload) === true) {\n                        return true;\n                    }\n                }\n            }\n        }\n    }\n\n    return _doUnload();\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function isDistributedTraceContext(obj: any): obj is IDistributedTraceContext {\n    return obj &&\n        isFunction(obj.getName) &&\n        isFunction(obj.getTraceId) &&\n        isFunction(obj.getSpanId) &&\n        isFunction(obj.getTraceFlags) &&\n        isFunction(obj.setName) &&\n        isFunction(obj.setTraceId) &&\n        isFunction(obj.setSpanId) &&\n        isFunction(obj.setTraceFlags);\n}\n\n/**\n * Creates an IDistributedTraceContext instance that ensures a valid traceId is always available.\n * The traceId will be inherited from the parent context if valid, otherwise a new random W3C trace ID is generated.\n *\n * @param parent - An optional parent {@link IDistributedTraceContext} or {@link IOTelSpanContext} to inherit\n * trace context values from. If provided, the traceId and spanId will be copied from the parent if they are valid.\n * When the parent is an {@link IDistributedTraceContext}, it will be set as the parentCtx property to maintain\n * hierarchical relationships and enable parent context updates.\n * When the parent is an {@link IOTelSpanContext}, the parentCtx will be null because OpenTelemetry span contexts\n * are read-only data sources that don't support the same hierarchical management methods as IDistributedTraceContext.\n * The core instance will create a wrapped IDistributedTraceContext instance from the IOTelSpanContext data\n * to enable Application Insights distributed tracing functionality while maintaining OpenTelemetry compatibility.\n *\n * @returns A new IDistributedTraceContext instance with the following behavior:\n * - **traceId**: Always present - either inherited from parent (if valid) or newly generated W3C trace ID\n * - **spanId**: Inherited from parent if valid, otherwise empty string\n * - **traceFlags**: Inherited from parent if available, otherwise undefined\n * - **pageName**: Inherited from parent context or derived from current location, defaults to \"_unknown_\"\n * - **traceState**: Lazily created W3C trace state, inheriting from parent if available\n *\n * @remarks\n * This function ensures consistent distributed tracing by guaranteeing that every context has a valid traceId,\n * which is essential for the refactored W3C trace state implementation. The spanId may be empty until a\n * specific span is created, which is normal behavior for trace contexts.\n *\n * The distinction between IDistributedTraceContext and IOTelSpanContext parents is important:\n * - IDistributedTraceContext parents enable bidirectional updates and hierarchical management\n * - IOTelSpanContext parents are used only for initial data extraction and OpenTelemetry compatibility\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function createDistributedTraceContext(parent?: IDistributedTraceContext | IOTelSpanContext | IDistributedTraceInit | undefined | null): IDistributedTraceContext {\n    let parentCtx: IDistributedTraceContext = null;\n    let initCtx: IDistributedTraceInit | IOTelSpanContext = null;\n    let traceId = (parent && isValidTraceId(parent.traceId)) ? parent.traceId : generateW3CId();\n    let spanId = (parent && isValidSpanId(parent.spanId)) ? parent.spanId : STR_EMPTY;\n    let traceFlags = parent ? parent.traceFlags : UNDEFINED_VALUE;\n    let isRemote = parent ? parent.isRemote : false;\n    let pageName = STR_EMPTY;\n    let traceState: IW3cTraceState = null;\n\n    if (parent) {\n        if (isDistributedTraceContext(parent)) {\n            parentCtx = parent;\n            pageName = parentCtx.getName();\n        } else {\n            initCtx = parent;\n        }\n    }\n\n    if (!pageName) {\n        pageName = \"_unknown_\";\n        // If we have a location, use that as the page name\n        let location = getLocation();\n        if (location && location.pathname) {\n            pageName = location.pathname + (location.hash || \"\");\n        }\n    }\n\n    function _getName(): string {\n        return pageName;\n    }\n\n    function _setPageNameFn(updateParent: boolean) {\n        return function (newValue: string): void {\n            if (updateParent) {\n                parentCtx && parentCtx.setName(newValue);\n            }\n\n            pageName = newValue;\n        };\n    }\n\n    function _getTraceId(): string {\n        return traceId;\n    }\n\n    function _setTraceIdFn(updateParent: boolean) {\n        return function (newValue: string): void {\n            if (updateParent) {\n                parentCtx && parentCtx.setTraceId(newValue);\n            }\n\n            if (isValidTraceId(newValue)) {\n                traceId = newValue\n            }\n        };\n    }\n\n    function _getSpanId(): string {\n        return spanId;\n    }\n\n    function _setSpanIdFn(updateParent: boolean) {\n        return function (newValue: string): void {\n            if (updateParent) {\n                parentCtx && parentCtx.setSpanId(newValue);\n            }\n\n            if (isValidSpanId(newValue)) {\n                spanId = newValue\n            }\n        };\n    }\n\n    function _getTraceFlags(): number {\n        return traceFlags;\n    }\n\n    function _setTraceFlagsFn(updateParent: boolean) {\n        return function (newTraceFlags?: number): void {\n            if (updateParent) {\n                parentCtx && parentCtx.setTraceFlags(newTraceFlags);\n            }\n\n            traceFlags = newTraceFlags;\n        };\n    }\n\n    function _getTraceState(): IW3cTraceState {\n        if (!traceState) {\n            if (!parentCtx) {\n                // The passed in parent was not an IDistributedTraceContext\n                if (initCtx) {\n                    if (isOTelTraceState(initCtx.traceState)) {\n                        // This looks like an IOTelSpanContext, so we have to just use the passed traceState as-is as it doesn't support\n                        // the W3cTraceState heirarchy methods\n                        traceState = createW3cTraceState(initCtx.traceState.serialize() || STR_EMPTY, parentCtx ? parentCtx.traceState : undefined);\n                    } else {\n                        // This looks like an IDistributedTraceInit, so we can create a new W3cTraceState\n                        traceState = createW3cTraceState(STR_EMPTY, initCtx.traceState || (parentCtx ? parentCtx.traceState : undefined));\n                    }\n                }\n            }\n\n            if (!traceState) {\n                traceState = createW3cTraceState(STR_EMPTY, parentCtx ? parentCtx.traceState : undefined);\n            }\n        }\n\n        return traceState;\n    }\n\n    let otelSpanCtx: IOTelSpanContext = null;\n    let traceCtx: IDistributedTraceContext = setProtoTypeName({\n        getName: _getName,\n        setName: _setPageNameFn(true),\n        getTraceId: _getTraceId,\n        setTraceId: _setTraceIdFn(true),\n        getSpanId: _getSpanId,\n        setSpanId: _setSpanIdFn(true),\n        getTraceFlags: _getTraceFlags,\n        setTraceFlags: _setTraceFlagsFn(true),\n        traceId,\n        spanId,\n        traceFlags,\n        traceState,\n        isRemote,\n        pageName,\n        getOTelSpanContext: () => {\n            if (!otelSpanCtx) {\n                // Lazily create the OTel Span Context\n                otelSpanCtx = createOTelSpanContext(traceCtx);\n            }\n\n            return otelSpanCtx;\n        }\n    }, \"DistributedTraceContext\");\n\n    return objDefineProps<IDistributedTraceContext>(traceCtx, {\n        pageName: {\n            g: _getName,\n            s: _setPageNameFn(false)\n        },\n        traceId: {\n            g: _getTraceId,\n            s: _setTraceIdFn(false)\n        },\n        spanId: {\n            g: _getSpanId,\n            s: _setSpanIdFn(false)\n        },\n        traceFlags: {\n            g: _getTraceFlags,\n            s: _setTraceFlagsFn(false)\n        },\n        isRemote: {\n            v: isRemote,\n            w: false\n\n        },\n        traceState: {\n            g: _getTraceState\n        },\n        parentCtx: {\n            g: () => parentCtx\n        },\n        _parent: {\n            g: () => {\n                let result: any;\n                if (parentCtx) {\n                    result = {\n                        t: \"traceCtx\",\n                        v: parentCtx\n                    };\n                } else if(initCtx) {\n                    result = {\n                        t: \"initCtx\",\n                        v: initCtx\n                    };\n                }\n                return result;\n            }\n        }\n    });\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/TelemetryInitializerPlugin.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { arrAppend, arrForEach, dumpObj } from \"@nevware21/ts-utils\";\nimport { _throwInternal } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IProcessTelemetryContext } from \"../interfaces/ai/IProcessTelemetryContext\";\nimport {\n    ITelemetryInitializerContainer, ITelemetryInitializerHandler, TelemetryInitializerFunction\n} from \"../interfaces/ai/ITelemetryInitializers\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { getExceptionName } from \"../utils/HelperFuncs\";\nimport { BaseTelemetryPlugin } from \"./BaseTelemetryPlugin\";\n\ninterface _IInternalTelemetryInitializerHandler {\n    id: number;\n    fn: TelemetryInitializerFunction;\n}\n\nfunction _addInitializer(_initializers: _IInternalTelemetryInitializerHandler[], id: number, telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler {\n    let theInitializer = {\n        id: id,\n        fn: telemetryInitializer\n    };\n\n    arrAppend(_initializers, theInitializer);\n\n    let handler: ITelemetryInitializerHandler = {\n        remove: () => {\n            arrForEach(_initializers, (initializer, idx) => {\n                if (initializer.id === theInitializer.id) {\n                    _initializers.splice(idx, 1);\n                    return -1;\n                }\n            });\n        }\n    }\n\n    return handler;\n}\n\nfunction _runInitializers(_initializers: _IInternalTelemetryInitializerHandler[], item: ITelemetryItem, logger: IDiagnosticLogger): boolean {\n    let doNotSendItem = false;\n    var telemetryInitializersCount = _initializers.length;\n    for (var i = 0; i < telemetryInitializersCount; ++i) {\n        var telemetryInitializer = _initializers[i];\n        if (telemetryInitializer) {\n            try {\n                if (telemetryInitializer.fn.apply(null, [item]) === false) {\n                    doNotSendItem = true;\n                    break;\n                }\n            } catch (e) {\n                // log error but dont stop executing rest of the telemetry initializers\n                // doNotSendItem = true;\n                _throwInternal(\n                    logger,\n                    eLoggingSeverity.WARNING,\n                    _eInternalMessageId.TelemetryInitializerFailed,\n                    \"Telemetry initializer failed: \" + getExceptionName(e),\n                    { exception: dumpObj(e) }, true);\n            }\n        }\n    }\n\n    return !doNotSendItem;\n}\n\nexport class TelemetryInitializerPlugin extends BaseTelemetryPlugin implements ITelemetryInitializerContainer {\n\n    public readonly identifier: string = \"TelemetryInitializerPlugin\";\n    public readonly priority: number = 199;\n\n    constructor() {\n        super();\n\n        // NOTE!: DON'T set default values here, instead set them in the _initDefaults() function as it is also called during teardown()\n        let _id: number;\n        let _initializers: _IInternalTelemetryInitializerHandler[];\n\n        _initDefaults();\n\n        dynamicProto(TelemetryInitializerPlugin, this, (_self, _base) => {\n            _self.addTelemetryInitializer = (telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler => {\n                return _addInitializer(_initializers, _id++, telemetryInitializer);\n            };\n\n            _self.processTelemetry = (item: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void => {\n                if (_runInitializers(_initializers, item, itemCtx ? itemCtx.diagLog() : _self.diagLog())) {\n                    _self.processNext(item, itemCtx);\n                }\n            };\n\n            _self._doTeardown = () => {\n                _initDefaults();\n            };\n        });\n\n        function _initDefaults() {\n            _id = 0;\n            _initializers = [];\n        }\n    }\n\n    /**\n     * Add a telemetry processor to decorate or drop telemetry events.\n     * @param telemetryInitializer - The Telemetry Initializer function\n     * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed\n     */\n    public addTelemetryInitializer(telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n\n    public processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/UnloadHandlerContainer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, dumpObj } from \"@nevware21/ts-utils\";\nimport { _throwInternal } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IProcessTelemetryUnloadContext } from \"../interfaces/ai/IProcessTelemetryContext\";\nimport { ITelemetryUnloadState } from \"../interfaces/ai/ITelemetryUnloadState\";\n\nexport type UnloadHandler = (itemCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void;\n\nexport interface IUnloadHandlerContainer {\n    add: (handler: UnloadHandler) => void;\n    run: (itemCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function createUnloadHandlerContainer(): IUnloadHandlerContainer {\n    let handlers: UnloadHandler[] = [];\n\n    function _addHandler(handler: UnloadHandler) {\n        if (handler) {\n            handlers.push(handler);\n        }\n    }\n\n    function _runHandlers(unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) {\n        arrForEach(handlers, (handler) => {\n            try {\n                handler(unloadCtx, unloadState);\n            } catch (e) {\n                _throwInternal(\n                    unloadCtx.diagLog(),\n                    eLoggingSeverity.WARNING,\n                    _eInternalMessageId.PluginException,\n                    \"Unexpected error calling unload handler - \" + dumpObj(e));\n            }\n        });\n        handlers = [];\n    }\n\n    return {\n        add: _addHandler,\n        run: _runHandlers\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/core/UnloadHookContainer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrAppend, arrForEach, dumpObj } from \"@nevware21/ts-utils\";\nimport { _throwInternal } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { ILegacyUnloadHook, IUnloadHook } from \"../interfaces/ai/IUnloadHook\";\n\nlet _maxHooks: number | undefined;\nlet _hookAddMonitor: ((state: string, hooks: Array<ILegacyUnloadHook | IUnloadHook>) => void) | undefined;\n\n/**\n * Interface which identifiesAdd this hook so that it is automatically removed during unloading\n * @param hooks - The single hook or an array of IInstrumentHook objects\n */\nexport interface IUnloadHookContainer {\n    add: (hooks: IUnloadHook | IUnloadHook[] | Iterator<IUnloadHook> | ILegacyUnloadHook | ILegacyUnloadHook[] | Iterator<ILegacyUnloadHook>) => void;\n    run: (logger?: IDiagnosticLogger) => void;\n}\n\n/**\n * Test hook for setting the maximum number of unload hooks and calling a monitor function when the hooks are added or removed\n * This allows for automatic test failure when the maximum number of unload hooks is exceeded\n * @param maxHooks - The maximum number of unload hooks\n * @param addMonitor - The monitor function to call when hooks are added or removed\n */\nexport function _testHookMaxUnloadHooksCb(maxHooks?: number, addMonitor?: (state: string, hooks: Array<ILegacyUnloadHook | IUnloadHook>) => void) {\n    _maxHooks = maxHooks;\n    _hookAddMonitor = addMonitor;\n}\n\nfunction _checkMaxHooks(name: string, hooks: Array<ILegacyUnloadHook | IUnloadHook>) {\n    if (_maxHooks && hooks.length > _maxHooks) {\n        _hookAddMonitor ? _hookAddMonitor(name, hooks) : _throwInternal(null, eLoggingSeverity.CRITICAL, _eInternalMessageId.MaxUnloadHookExceeded, \"Max unload hooks exceeded. An excessive number of unload hooks has been detected.\");\n    }\n}\n\n\n/**\n * Create a IUnloadHookContainer which can be used to remember unload hook functions to be executed during the component unloading\n * process.\n * @returns A new IUnloadHookContainer instance\n */\nexport function createUnloadHookContainer(): IUnloadHookContainer {\n    let _hooks: Array<ILegacyUnloadHook | IUnloadHook> = [];\n\n    function _doUnload(logger: IDiagnosticLogger) {\n        let oldHooks = _hooks;\n        _hooks = [];\n\n        // Remove all registered unload hooks\n        arrForEach(oldHooks, (fn) => {\n            // allow either rm or remove callback function\n            try{\n                ((fn as IUnloadHook).rm || (fn as ILegacyUnloadHook).remove).call(fn);\n            } catch (e) {\n                _throwInternal(logger, eLoggingSeverity.WARNING, _eInternalMessageId.PluginException, \"Unloading:\" + dumpObj(e));\n            }\n        });\n\n        if (_maxHooks) {\n            _checkMaxHooks(\"doUnload\", oldHooks);\n        }\n    }\n\n    function _addHook(hooks: IUnloadHook | IUnloadHook[] | Iterator<IUnloadHook> | ILegacyUnloadHook | ILegacyUnloadHook[] | Iterator<ILegacyUnloadHook>) {\n        if (hooks) {\n            arrAppend(_hooks, hooks);\n            if (_maxHooks) {\n                _checkMaxHooks(\"Add\", _hooks);\n            }\n        }\n    }\n\n    return {\n        run: _doUnload,\n        add: _addHook\n    };\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/diagnostics/DiagnosticLogger.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\"\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { dumpObj, isFunction, isUndefined, objDefine } from \"@nevware21/ts-utils\";\nimport { createDynamicConfig, onConfigChange } from \"../config/DynamicConfig\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { getDebugExt } from \"../core/DbgExtensionUtils\";\nimport { LoggingSeverity, _InternalMessageId, _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IUnloadHook } from \"../interfaces/ai/IUnloadHook\";\nimport { IConfigDefaults } from \"../interfaces/config/IConfigDefaults\";\nimport { getConsole, getJSON, hasJSON } from \"../utils/EnvUtils\";\n\nconst STR_WARN_TO_CONSOLE = \"warnToConsole\";\n\n/**\n * For user non actionable traces use AI Internal prefix.\n */\nconst AiNonUserActionablePrefix = \"AI (Internal): \";\n\n/**\n * Prefix of the traces in portal.\n */\nconst AiUserActionablePrefix = \"AI: \";\n\n/**\n *  Session storage key for the prefix for the key indicating message type already logged\n */\nconst AIInternalMessagePrefix = \"AITR_\";\n\nconst defaultValues: IConfigDefaults<IConfiguration> = {\n    loggingLevelConsole: 0,\n    loggingLevelTelemetry: 1,\n    maxMessageLimit: 25,\n    enableDebug: false\n};\n\nconst _logFuncs: { [key in eLoggingSeverity]: keyof IDiagnosticLogger} = {\n    [eLoggingSeverity.DISABLED]: null,\n    [eLoggingSeverity.CRITICAL]: \"errorToConsole\",\n    [eLoggingSeverity.WARNING]: STR_WARN_TO_CONSOLE,\n    [eLoggingSeverity.DEBUG]: \"debugToConsole\"\n}\n\nfunction _sanitizeDiagnosticText(text: string) {\n    if (text) {\n        return \"\\\"\" + text.replace(/\\\"/g, STR_EMPTY) + \"\\\"\";\n    }\n\n    return STR_EMPTY;\n}\n\nfunction _logToConsole(func: string, message: string) {\n    let theConsole = getConsole();\n    if (!!theConsole) {\n        let logFunc = \"log\";\n        if (theConsole[func]) {\n            logFunc = func;\n        }\n\n        if (isFunction(theConsole[logFunc])) {\n            theConsole[logFunc](message);\n        }\n    }\n}\n\nexport class _InternalLogMessage{\n    public static dataType: string = \"MessageData\";\n\n    public message: string;\n    public messageId: _InternalMessageId;\n\n    constructor(msgId: _InternalMessageId, msg: string, isUserAct = false, properties?: Object) {\n        let _self = this;\n\n        _self.messageId = msgId;\n        _self.message =\n            (isUserAct ? AiUserActionablePrefix : AiNonUserActionablePrefix) +\n            msgId;\n\n        let strProps:string = STR_EMPTY;\n        if (hasJSON()) {\n            strProps = getJSON().stringify(properties);\n        }\n\n        const diagnosticText =\n            (msg ? \" message:\" + _sanitizeDiagnosticText(msg) : STR_EMPTY) +\n            (properties ? \" props:\" + _sanitizeDiagnosticText(strProps) : STR_EMPTY);\n\n        _self.message += diagnosticText;\n    }\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function safeGetLogger(core: IAppInsightsCore, config?: IConfiguration): IDiagnosticLogger {\n    return (core || {} as any).logger || new DiagnosticLogger(config || (core || {}).config);\n}\n  \nexport class DiagnosticLogger implements IDiagnosticLogger {\n    public identifier = \"DiagnosticLogger\";\n    \n    public readonly dbgMode: boolean;\n\n    /**\n     * The internal logging queue\n     */\n    public queue: _InternalLogMessage[] = [];\n\n    constructor(config?: IConfiguration) {\n        /**\n         * Count of internal messages sent\n         */\n        let _messageCount: number = 0;\n\n        /**\n         * Holds information about what message types were already logged to console or sent to server.\n         */\n        let _messageLogged: { [msg: number]: boolean } = {};\n\n        let _loggingLevelConsole: number;\n        let _loggingLevelTelemetry: number;\n        let _maxInternalMessageLimit: number;\n        let _enableDebug: boolean;\n        let _unloadHandler: IUnloadHook;\n\n        dynamicProto(DiagnosticLogger, this, (_self) => {\n            _unloadHandler = _setDefaultsFromConfig(config || {});\n\n            _self.consoleLoggingLevel = () => _loggingLevelConsole;\n\n            /**\n             * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n             * @param severity - The severity of the log message\n             * @param message  - The log message.\n             */\n            _self.throwInternal = (severity: LoggingSeverity, msgId: _InternalMessageId, msg: string, properties?: Object, isUserAct = false) => {\n                const message = new _InternalLogMessage(msgId, msg, isUserAct, properties);\n\n                if (_enableDebug) {\n                    throw dumpObj(message);\n                } else {\n                    // Get the logging function and fallback to warnToConsole of for some reason errorToConsole doesn't exist\n                    let logFunc = _logFuncs[severity] || STR_WARN_TO_CONSOLE;\n\n                    if (!isUndefined(message.message)) {\n                        if (isUserAct) {\n                            // check if this message type was already logged to console for this page view and if so, don't log it again\n                            const messageKey: number = +message.messageId;\n\n                            if (!_messageLogged[messageKey] && _loggingLevelConsole >= severity) {\n                                _self[logFunc](message.message);\n                                _messageLogged[messageKey] = true;\n                            }\n                        } else {\n                            // Only log traces if the console Logging Level is >= the throwInternal severity level\n                            if (_loggingLevelConsole >= severity) {\n                                _self[logFunc](message.message);\n                            }\n                        }\n\n                        _logInternalMessage(severity, message);\n                    } else {\n                        _debugExtMsg(\"throw\" + (severity === eLoggingSeverity.CRITICAL ? \"Critical\" : \"Warning\"), message);\n                    }\n                }\n            }\n\n            _self.debugToConsole = (message: string) => {\n                _logToConsole(\"debug\", message);\n                _debugExtMsg(\"warning\", message);\n            };\n\n            _self.warnToConsole = (message: string) => {\n                _logToConsole(\"warn\", message);\n                _debugExtMsg(\"warning\", message);\n            };\n\n\n            _self.errorToConsole = (message: string) => {\n                _logToConsole(\"error\", message);\n                _debugExtMsg(\"error\", message);\n            };\n\n            _self.resetInternalMessageCount = (): void => {\n                _messageCount = 0;\n                _messageLogged = {};\n            };\n\n            _self.logInternalMessage = _logInternalMessage;\n\n            _self.unload = (isAsync?: boolean) => {\n                _unloadHandler && _unloadHandler.rm();\n                _unloadHandler = null;\n            };\n\n            objDefine(_self, \"dbgMode\", {\n                g: () => _enableDebug\n            });\n\n            function _logInternalMessage(severity: LoggingSeverity, message: _InternalLogMessage): void {\n                if (_areInternalMessagesThrottled()) {\n                    return;\n                }\n\n                // check if this message type was already logged for this session and if so, don't log it again\n                let logMessage = true;\n                const messageKey = AIInternalMessagePrefix + message.messageId;\n\n                // if the session storage is not available, limit to only one message type per page view\n                if (_messageLogged[messageKey]) {\n                    logMessage = false;\n                } else {\n                    _messageLogged[messageKey] = true;\n                }\n\n                if (logMessage) {\n                    // Push the event in the internal queue\n                    if (severity <= _loggingLevelTelemetry) {\n                        _self.queue.push(message);\n                        _messageCount++;\n                        _debugExtMsg((severity === eLoggingSeverity.CRITICAL ? \"error\" : \"warn\"), message);\n                    }\n\n                    // When throttle limit reached, send a special event\n                    if (_messageCount === _maxInternalMessageLimit) {\n                        const throttleLimitMessage = \"Internal events throttle limit per PageView reached for this app.\";\n                        const throttleMessage = new _InternalLogMessage(_eInternalMessageId.MessageLimitPerPVExceeded, throttleLimitMessage, false);\n                        _self.queue.push(throttleMessage);\n                        if (severity === eLoggingSeverity.CRITICAL) {\n                            _self.errorToConsole(throttleLimitMessage);\n                        } else {\n                            _self.warnToConsole(throttleLimitMessage);\n                        }\n                    }\n                }\n            }\n\n            function _setDefaultsFromConfig(config: IConfiguration): IUnloadHook {\n                // make sure the config is dynamic\n                return onConfigChange(createDynamicConfig(config, defaultValues, _self).cfg, (details) => {\n                    let config = details.cfg;\n                    _loggingLevelConsole = config.loggingLevelConsole;\n                    _loggingLevelTelemetry = config.loggingLevelTelemetry;\n                    _maxInternalMessageLimit = config.maxMessageLimit;\n                    _enableDebug =  config.enableDebug;\n                });\n            }\n\n            function _areInternalMessagesThrottled(): boolean {\n                return _messageCount >= _maxInternalMessageLimit;\n            }\n\n            function _debugExtMsg(name: string, data: any) {\n                let dbgExt = getDebugExt(config || {});\n                if (dbgExt && dbgExt.diagLog) {\n                    dbgExt.diagLog(name, data);\n                }\n            }\n        });\n    }\n\n    /**\n     * 0: OFF (default)\n     * 1: CRITICAL\n     * 2: \\>= WARNING\n     */\n    public consoleLoggingLevel(): number {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return 0;\n    }\n\n    /**\n     * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n     * @param severity  - The severity of the log message\n     * @param message - The log message.\n     */\n    public throwInternal(severity: LoggingSeverity, msgId: _InternalMessageId, msg: string, properties?: Object, isUserAct = false) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * This will write a debug message to the console if possible\n     * @param message - The debug message\n     */\n    public debugToConsole(message: string) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * This will write a warning to the console if possible\n     * @param message  - The warning message\n     */\n    public warnToConsole(message: string) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * This will write an error to the console if possible\n     * @param message - The warning message\n     */\n    public errorToConsole(message: string) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Resets the internal message count\n     */\n    public resetInternalMessageCount(): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Logs a message to the internal queue.\n     * @param severity - The severity of the log message\n     * @param message - The message to log.\n     */\n    public logInternalMessage(severity: LoggingSeverity, message: _InternalLogMessage): void {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Unload and remove any state that this IDiagnosticLogger may be holding, this is generally called when the\n     * owning SDK is being unloaded.\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @returns If the unload occurs synchronously then nothing should be returned, if happening asynchronously then\n     * the function should return an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * / Promise to allow any listeners to wait for the operation to complete.\n     */\n    public unload(isAsync?: boolean): void | IPromise<void> {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n}\n\nfunction _getLogger(logger: IDiagnosticLogger) {\n    return (logger || new DiagnosticLogger());\n}\n\n/**\n * This is a helper method which will call throwInternal on the passed logger, will throw exceptions in\n * debug mode or attempt to log the error as a console warning. This helper is provided mostly to better\n * support minification as logger.throwInternal() will not compress the publish \"throwInternal\" used throughout\n * the code.\n * @param logger - The Diagnostic Logger instance to use.\n * @param severity - The severity of the log message\n * @param message  - The log message.\n */\nexport function _throwInternal(logger: IDiagnosticLogger, severity: LoggingSeverity, msgId: _InternalMessageId, msg: string, properties?: Object, isUserAct = false) {\n    _getLogger(logger).throwInternal(severity, msgId, msg, properties, isUserAct);\n}\n\n/**\n * This is a helper method which will call warnToConsole on the passed logger with the provided message.\n * @param logger - The Diagnostic Logger instance to use.\n * @param message  - The log message.\n */\nexport function _warnToConsole(logger: IDiagnosticLogger, message: string) {\n    _getLogger(logger).warnToConsole(message);\n}\n\n/**\n * Logs a message to the internal queue.\n * @param logger - The Diagnostic Logger instance to use.\n * @param severity  - The severity of the log message\n * @param message - The message to log.\n */\nexport function _logInternalMessage(logger: IDiagnosticLogger, severity: LoggingSeverity, message: _InternalLogMessage) {\n    _getLogger(logger).logInternalMessage(severity, message);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/diagnostics/ThrottleMgr.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, arrIndexOf, isNullOrUndefined, mathFloor, mathMin, objForEachKey, strTrim } from \"@nevware21/ts-utils\";\nimport { onConfigChange } from \"../config/DynamicConfig\";\nimport { _throwInternal, safeGetLogger } from \"../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IConfig } from \"../interfaces/ai/IConfig\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IThrottleInterval, IThrottleLocalStorageObj, IThrottleMgrConfig, IThrottleResult } from \"../interfaces/ai/IThrottleMgr\";\nimport { randomValue } from \"../utils/RandomHelper\";\nimport { utlCanUseLocalStorage, utlGetLocalStorage, utlSetLocalStorage } from \"../utils/StorageHelperFuncs\";\n\nconst THROTTLE_STORAGE_PREFIX = \"appInsightsThrottle\";\n\ninterface SendMsgParameter {\n    msgID: _eInternalMessageId,\n    message: string,\n    severity?: eLoggingSeverity\n}\n\nexport class ThrottleMgr {\n    public canThrottle: (msgId: _eInternalMessageId | number) => boolean;\n    public sendMessage: (msgId: _eInternalMessageId, message: string, severity?: eLoggingSeverity) => IThrottleResult | null;\n    public getConfig: () => IThrottleMgrConfig;\n    public isTriggered: (msgId: _eInternalMessageId | number) => boolean; // this function is to get previous triggered status\n    public isReady: () => boolean\n    public onReadyState: (isReady?: boolean, flushAll?: boolean) => boolean;\n    public flush: (msgId: _eInternalMessageId | number) => boolean;\n    public flushAll: () => boolean;\n    public config: IThrottleMgrConfig;\n\n    constructor(core: IAppInsightsCore, namePrefix?: string) {\n        let _self = this;\n        let _canUseLocalStorage: boolean;\n        let _logger: IDiagnosticLogger | null | undefined;\n        let _config: {[msgKey: number]: IThrottleMgrConfig};\n        let _localStorageObj: {[msgKey: number]: IThrottleLocalStorageObj | null | undefined};\n        let _isTriggered: {[msgKey: number]: boolean}; //_isTriggered is to make sure that we only trigger throttle once a day\n        let _namePrefix: string;\n        let _queue: {[msgKey: number]: Array<SendMsgParameter>};\n        let _isReady: boolean = false;\n        let _isSpecificDaysGiven: boolean = false;\n\n        _initConfig();\n\n        // Special internal method to allow the unit tests and DebugPlugin to hook embedded objects\n        _self[\"_getDbgPlgTargets\"] = () => {\n            return [_queue];\n        };\n\n        _self.getConfig = (): IThrottleMgrConfig => {\n            return _config;\n        }\n\n        /**\n         * Check if it is the correct day to send message.\n         * If _isTriggered is true, even if canThrottle returns true, message will not be sent,\n         * because we only allow triggering sendMessage() once a day.\n         * @returns if the current date is the valid date to send message\n         */\n        _self.canThrottle = (msgId: _eInternalMessageId | number ): boolean => {\n            let localObj = _getLocalStorageObjByKey(msgId);\n            let cfg = _getCfgByKey(msgId);\n            return _canThrottle(cfg, _canUseLocalStorage, localObj);\n        }\n\n        /**\n         * Check if throttle is triggered on current day(UTC)\n         * if canThrottle returns false, isTriggered will return false\n         * @returns if throttle is triggered on current day(UTC)\n         */\n        _self.isTriggered = (msgId: _eInternalMessageId | number): boolean => {\n            return _isTrigger(msgId);\n        }\n\n        /**\n         * Before isReady set to true, all message will be stored in queue.\n         * Message will only be sent out after isReady set to true.\n         * Initial and default value: false\n         * @returns isReady state\n         */\n        _self.isReady = (): boolean => {\n            return _isReady;\n        }\n\n        /**\n         * Flush all message with given message key in queue with isReady state set to true.\n         * @returns if message queue is flushed\n         */\n        _self.flush = (msgId: _eInternalMessageId | number): boolean => {\n            try {\n                let queue = _getQueueByKey(msgId);\n                if (queue && queue.length > 0) {\n                    let items = queue.slice(0);\n                    _queue[msgId] = []\n                    arrForEach(items, (item: SendMsgParameter) => {\n                        _flushMessage(item.msgID, item.message, item.severity, false);\n                    });\n                    return true;\n                }\n            } catch(err) {\n                // eslint-disable-next-line no-empty\n            }\n            return false;\n        }\n\n        /**\n         * Flush all message in queue with isReady state set to true.\n         * @returns if message queue is flushed\n         */\n        _self.flushAll = (): boolean => {\n            try {\n                if (_queue) {\n                    let result = true;\n                    objForEachKey(_queue, (key) => {\n                        let isFlushed = _self.flush(parseInt(key));\n                        result = result && isFlushed;\n                    });\n                    return result;\n                }\n               \n            } catch(err) {\n                // eslint-disable-next-line no-empty\n            }\n            return false;\n        }\n\n        /**\n         * Set isReady State\n         * if isReady set to true, message queue will be flushed automatically.\n         * @param isReady - isReady State\n         * @pa\n         * @returns if message queue is flushed\n         */\n        _self.onReadyState = (isReady?: boolean, flushAll: boolean = true): boolean => {\n            _isReady  = isNullOrUndefined(isReady)? true : isReady;\n            if (_isReady && flushAll) {\n                return _self.flushAll();\n            }\n            return null;\n        }\n       \n        _self.sendMessage = (msgID: _eInternalMessageId | number, message: string, severity?: eLoggingSeverity): IThrottleResult | null => {\n            return _flushMessage(msgID, message, severity, true);\n\n        }\n\n        function _flushMessage(msgID: _eInternalMessageId | number, message: string, severity?: eLoggingSeverity, saveUnsentMsg?: boolean) {\n            if (_isReady) {\n                let isSampledIn = _canSampledIn(msgID);\n                if (!isSampledIn) {\n                    return;\n                }\n                let cfg = _getCfgByKey(msgID);\n                let localStorageObj = _getLocalStorageObjByKey(msgID);\n                let canThrottle = _canThrottle(cfg, _canUseLocalStorage, localStorageObj);\n                let throttled = false;\n                let number = 0;\n                let isTriggered = _isTrigger(msgID);\n                try {\n                    if (canThrottle && !isTriggered) {\n                        number = mathMin(cfg.limit.maxSendNumber, localStorageObj.count + 1);\n                        localStorageObj.count = 0;\n                        throttled = true;\n                        _isTriggered[msgID] = true;\n                        localStorageObj.preTriggerDate = new Date();\n                    } else {\n                        _isTriggered[msgID] = canThrottle;\n                        localStorageObj.count += 1;\n                    }\n                    let localStorageName = _getLocalStorageName(msgID);\n                    _resetLocalStorage(_logger, localStorageName, localStorageObj);\n                    for (let i = 0; i < number; i++) {\n                        _sendMessage(msgID, _logger, message, severity);\n                    }\n                } catch(e) {\n                    // eslint-disable-next-line no-empty\n                }\n                return {\n                    isThrottled: throttled,\n                    throttleNum: number\n                } as IThrottleResult;\n            } else {\n                if (!!saveUnsentMsg) {\n                    let queue = _getQueueByKey(msgID);\n                    queue.push({\n                        msgID: msgID,\n                        message: message,\n                        severity: severity\n                    } as SendMsgParameter);\n                }\n            }\n            return null;\n        }\n        \n        function _initConfig() {\n            _logger = safeGetLogger(core);\n            _isTriggered = {};\n            _localStorageObj = {};\n            _queue = {};\n            _config = {};\n            _setCfgByKey(_eInternalMessageId.DefaultThrottleMsgKey);\n            _namePrefix = !isNullOrUndefined(namePrefix)? namePrefix : \"\";\n\n            core.addUnloadHook(onConfigChange<IConfig & IConfiguration>(core.config, (details) => {\n                let coreConfig = details.cfg;\n                _canUseLocalStorage = utlCanUseLocalStorage();\n                \n                let configMgr = coreConfig.throttleMgrCfg || {};\n                objForEachKey(configMgr, (key, cfg) => {\n                    _setCfgByKey(parseInt(key), cfg)\n                });\n        \n            }));\n        }\n\n        function _getCfgByKey(msgID: _eInternalMessageId | number) {\n            return _config[msgID] || _config[_eInternalMessageId.DefaultThrottleMsgKey];\n        }\n\n        function _setCfgByKey(msgID: _eInternalMessageId | number, config?: IThrottleMgrConfig) {\n            try {\n                let cfg = config || {};\n                let curCfg = {} as IThrottleMgrConfig;\n                curCfg.disabled = !!cfg.disabled;\n                let configInterval = cfg.interval || {};\n                _isSpecificDaysGiven = configInterval?.daysOfMonth && configInterval?.daysOfMonth.length > 0;\n                curCfg.interval = _getIntervalConfig(configInterval);\n                let limit = {\n                    samplingRate: cfg.limit?.samplingRate || 100,\n                    // dafault: every time sent only 1 event\n                    maxSendNumber: cfg.limit?.maxSendNumber || 1\n                };\n                curCfg.limit = limit;\n                _config[msgID] = curCfg;\n\n            } catch (e) {\n                // eslint-disable-next-line no-empty\n            }\n        }\n\n        function _getIntervalConfig(interval: IThrottleInterval) {\n            interval = interval || {};\n            let monthInterval = interval?.monthInterval;\n            let dayInterval = interval?.dayInterval;\n\n            // default: send data every 3 month each year\n            if (isNullOrUndefined(monthInterval) && isNullOrUndefined(dayInterval)) {\n                interval.monthInterval = 3;\n                if (!_isSpecificDaysGiven) {\n                    // default: send data on 28th\n                    interval.daysOfMonth = [28];\n                    _isSpecificDaysGiven = true;\n                }\n            }\n            interval = {\n                // dafault: sent every three months\n                monthInterval: interval?.monthInterval,\n                dayInterval: interval?.dayInterval,\n                daysOfMonth: interval?.daysOfMonth\n            } as IThrottleInterval;\n            return interval;\n        }\n\n        function _canThrottle(config: IThrottleMgrConfig, canUseLocalStorage: boolean, localStorageObj: IThrottleLocalStorageObj) {\n            if (config && !config.disabled && canUseLocalStorage && !isNullOrUndefined(localStorageObj)) {\n                let curDate = _getThrottleDate();\n                let date = localStorageObj.date;\n                let interval = config.interval;\n                let monthCheck = 1;\n                if (interval?.monthInterval) {\n                    let monthExpand = (curDate.getUTCFullYear() - date.getUTCFullYear()) * 12 + curDate.getUTCMonth() - date.getUTCMonth();\n                    monthCheck = _checkInterval(interval.monthInterval, 0, monthExpand);\n                }\n\n                let dayCheck = 1;\n                if (_isSpecificDaysGiven) {\n                    dayCheck = arrIndexOf(interval.daysOfMonth, curDate.getUTCDate());\n                } else if (interval?.dayInterval) {\n                    let daySpan =  mathFloor((curDate.getTime() - date.getTime()) / 86400000);\n                    dayCheck = _checkInterval(interval.dayInterval, 0, daySpan);\n                }\n\n                return monthCheck >= 0 && dayCheck >= 0;\n            }\n            return false;\n        }\n\n        function _getLocalStorageName(msgKey: _eInternalMessageId | number, prefix?: string) {\n            let fix = !isNullOrUndefined(prefix)? prefix : \"\";\n            if (msgKey) {\n                return THROTTLE_STORAGE_PREFIX + fix + \"-\" + msgKey;\n            }\n            return null;\n        }\n\n        // returns if throttle is triggered on current Date\n        function _isTriggeredOnCurDate(preTriggerDate?: Date) {\n            try {\n                if(preTriggerDate) {\n                    let curDate = new Date();\n                    return preTriggerDate.getUTCFullYear() === curDate.getUTCFullYear() &&\n                    preTriggerDate.getUTCMonth() === curDate.getUTCMonth() &&\n                    preTriggerDate.getUTCDate() === curDate.getUTCDate();\n                }\n            } catch (e) {\n                // eslint-disable-next-line no-empty\n            }\n            return false;\n        }\n\n        // transfer local storage string value to object that identifies start date, current count and preTriggerDate\n        function _getLocalStorageObj(value: string, logger: IDiagnosticLogger, storageName: string) {\n            try {\n                let storageObj = {\n                    date: _getThrottleDate(),\n                    count: 0\n                } as IThrottleLocalStorageObj;\n                if (value) {\n                    let obj = JSON.parse(value);\n                    let curObj = {\n                        date: _getThrottleDate(obj.date) || storageObj.date,\n                        count: obj.count || storageObj.count,\n                        preTriggerDate: obj.preTriggerDate? _getThrottleDate(obj.preTriggerDate) : undefined\n                    } as IThrottleLocalStorageObj;\n                    return curObj;\n                } else {\n                    _resetLocalStorage(logger, storageName, storageObj);\n                    return storageObj;\n                }\n            } catch(e) {\n                // eslint-disable-next-line no-empty\n            }\n            return null;\n        }\n\n        // if datestr is not defined, current date will be returned\n        function _getThrottleDate(dateStr?: string) {\n            // if new Date() can't be created through the provided dateStr, null will be returned.\n            try {\n                if (dateStr) {\n                    let date = new Date(dateStr);\n                    //make sure it is a valid Date Object\n                    if (!isNaN(date.getDate())) {\n                        return date;\n                    }\n                } else {\n                    return new Date();\n                }\n                \n            } catch (e) {\n                // eslint-disable-next-line no-empty\n            }\n            return null;\n        }\n\n        function _resetLocalStorage(logger: IDiagnosticLogger, storageName: string, obj: IThrottleLocalStorageObj) {\n            try {\n                return utlSetLocalStorage(logger, storageName, strTrim(JSON.stringify(obj)));\n            } catch (e) {\n                // eslint-disable-next-line no-empty\n            }\n            return false;\n        }\n\n        function _checkInterval(interval: number, start: number, current: number) {\n            if (interval <= 0) {\n                return 1;\n            }\n            // count from start year\n            return  (current >= start) && (current - start) % interval == 0 ? mathFloor((current - start) / interval) + 1 : -1;\n        }\n        \n        function _sendMessage(msgID: _eInternalMessageId, logger: IDiagnosticLogger, message: string, severity?: eLoggingSeverity) {\n            _throwInternal(logger,\n                severity || eLoggingSeverity.CRITICAL,\n                msgID,\n                message);\n        }\n\n        // NOTE: config.limit.samplingRate is set to 4 decimal places,\n        // so config.limit.samplingRate = 1 means 0.0001%\n        function _canSampledIn(msgID: _eInternalMessageId) {\n            try {\n                let cfg = _getCfgByKey(msgID)\n                return randomValue(1000000) <= cfg.limit.samplingRate;\n            } catch (e) {\n                // eslint-disable-next-line no-empty\n            }\n            return false;\n        }\n\n        function _getLocalStorageObjByKey(key: _eInternalMessageId | number) {\n            try {\n                let curObj = _localStorageObj[key];\n                if (!curObj) {\n                    let localStorageName = _getLocalStorageName(key, _namePrefix);\n                    curObj = _getLocalStorageObj(utlGetLocalStorage(_logger, localStorageName), _logger, localStorageName);\n                    _localStorageObj[key] = curObj;\n                }\n                return _localStorageObj[key];\n\n            } catch (e) {\n                // eslint-disable-next-line no-empty\n            }\n            return null;\n        }\n\n        function _isTrigger(key: _eInternalMessageId | number) {\n            let isTrigger = _isTriggered[key];\n            if (isNullOrUndefined(isTrigger)) {\n                isTrigger = false;\n                let localStorageObj = _getLocalStorageObjByKey(key);\n                if (localStorageObj) {\n                    isTrigger = _isTriggeredOnCurDate(localStorageObj.preTriggerDate);\n                }\n                _isTriggered[key] = isTrigger;\n            }\n            return _isTriggered[key];\n        }\n\n        function _getQueueByKey(key: _eInternalMessageId | number) {\n            _queue = _queue || {};\n            if (isNullOrUndefined(_queue[key])) {\n                _queue[key] = [];\n            }\n            return _queue[key];\n        }\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/EnumHelperFuncs.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { EnumCls, createEnum, createTypeMap } from \"@nevware21/ts-utils\";\n\nexport declare type EnumValue<E = any> = EnumCls<E>;\n\n/**\n * Create an enum style object which has both the key \\=\\> value and value \\=\\> key mappings\n * @param values - The values to populate on the new object\n * @returns\n */\nexport const createEnumStyle: <E>(values: { [key in keyof E]: E[keyof E] }) => EnumValue<E> = createEnum;\n\n/**\n * Create a 2 index map that maps an enum's key and value to the defined map value, X[\"key\"] \\=\\> mapValue and X[0] \\=\\> mapValue.\n * Generic values\n * - E = the const enum type (typeof eRequestHeaders);\n * - V = Identifies the valid values for the keys, this should include both the enum numeric and string key of the type. The\n * resulting \"Value\" of each entry identifies the valid values withing the assignments.\n * @param values - The values to populate on the new object\n * @returns\n */\nexport const createValueMap: <E, V = E>(values: { [key in keyof E]: [ E[keyof E], V[keyof V] ] }) => V = createTypeMap;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/W3CTraceFlags.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * The TelemetryUpdateReason enumeration contains a set of bit-wise values that specify the reason for update request.\n */\nexport const enum eW3CTraceFlags  {\n    /**\n     * No sampling decision has been made.\n     */\n    None = 0,\n\n    /**\n     * Represents that the trace has been sampled.\n     * @remarks This value is used to indicate that the trace has been sampled.\n     */\n    Sampled = 1\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/DependencyTypes.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\nexport const enum eDependencyTypes {\n    InProc = \"InProc\",\n    QueueMessage = \"Queue Message\",\n    Sql = \"SQL\",\n    Http = \"Http\",\n    Grpc = \"GRPC\",\n    Wcf = \"WCF Service\",\n}\n\n/**\n * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n */\nexport const DependencyTypes = (/* @__PURE__ */ createEnumStyle<typeof eDependencyTypes>({\n    /**\n     * InProc\n     */\n    InProc: eDependencyTypes.InProc,\n\n    /**\n     * Quene Message\n     */\n    QueueMessage: eDependencyTypes.QueueMessage,\n\n    /**\n     * Sql\n     */\n    Sql: eDependencyTypes.Sql,\n\n    /**\n     * Http\n     */\n    Http: eDependencyTypes.Http,\n\n    /**\n     * Grpc\n     */\n    Grpc: eDependencyTypes.Grpc,\n\n    /**\n     * Wcf\n     */\n    Wcf: eDependencyTypes.Wcf\n}));\n\nexport type DependencyTypes = string | eDependencyTypes;"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/Enums.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\n/**\n * Type of storage to differentiate between local storage and session storage\n */\nexport const enum eStorageType {\n    LocalStorage,\n    SessionStorage\n}\n\nexport const StorageType = (/* @__PURE__ */ createEnumStyle<typeof eStorageType>({\n    LocalStorage: eStorageType.LocalStorage,\n    SessionStorage: eStorageType.SessionStorage\n}));\nexport type StorageType = eStorageType | typeof StorageType;\n\n/**\n * Enum is used in aiDataContract to describe how fields are serialized.\n * For instance: (Fieldtype.Required | FieldType.Array) will mark the field as required and indicate it's an array\n */\nexport const enum FieldType { Default = 0, Required = 1, Array = 2, Hidden = 4 }\n\nexport const enum eDistributedTracingModes {\n    /**\n     * Send only the legacy Application Insights correlation headers\n     *\n     * Headers Sent:\n     * - `Request-Id` (Legacy Application Insights header for older Server side SDKs)\n     *\n     * Config Decimal Value: `0` (Zero)\n     */\n    AI = 0x00,\n\n    /**\n     * (Default) Send both W3C Trace parent header and back-compatibility Application Insights headers\n     * - `Request-Id`\n     * - [`traceparent`](https://www.w3.org/TR/trace-context/#traceparent-header)\n     *\n     * Config Decimal Value: `1` (One)\n     */\n    AI_AND_W3C = 0x01,\n\n    /**\n     * Send Only the W3C Trace parent header\n     *\n     * Headers Sent:\n     * - [`traceparent`](https://www.w3.org/TR/trace-context/#traceparent-header)\n     *\n     * Config Decimal Value: `2` (Two)\n     */\n    W3C = 0x02,\n\n    /**\n     * @internal\n     * Bitwise mask used to separate the base distributed tracing mode from the additional optional\n     * tracing modes.\n     * @since 3.4.0\n     */\n    _BaseMask = 0x0F, // Mask to get the base distributed tracing mode\n\n    /**\n     * @internal\n     * Enabling this bit will send the W3C Trace State header, it is not intended to be used directly\n     * or on its own. The code may assume that if this bit is set, then the W3C Trace Context headers\n     * will also be included.\n     *\n     * Config Decimal Value: `16` (Sixteen in decimal)\n     * @since 3.4.0\n     */\n    _W3CTraceState = 0x10, // Bit mask to enable sending the W3C Trace State headers\n\n    /**\n     * Send all of the W3C Trace Context headers and the W3C Trace State headers and back-compatibility\n     * Application Insights headers.\n     *\n     * Currently sent headers:\n     * - `Request-Id` (Legacy Application Insights header for older Server side SDKs)\n     * - [`traceparent`](https://www.w3.org/TR/trace-context/#traceparent-header)\n     * - [`tracestate`](https://www.w3.org/TR/trace-context/#tracestate-header)\n     *\n     * NOTE!: Additional headers may be added as part of a future update should the W3C Trace Context specification be updated\n     * to include additional headers.\n     *\n     * Config Decimal Value: `17` (Seventeen in decimal)\n     * @since 3.4.0\n     */\n    AI_AND_W3C_TRACE = AI_AND_W3C | _W3CTraceState,\n\n    /**\n     * Send all of the W3C Trace Context headers and the W3C Trace State headers.\n     *\n     * Currently sent headers:\n     * - [`traceparent`](https://www.w3.org/TR/trace-context/#traceparent-header)\n     * - [`tracestate`](https://www.w3.org/TR/trace-context/#tracestate-header)\n     *\n     * NOTE!: Additional headers may be added as part of a future update should the W3C Trace Context specification be updated\n     * to include additional headers.\n     *\n     * Config Decimal Value: `18` (Eighteen in decimal)\n     * @since 3.4.0\n     */\n    W3C_TRACE = W3C | _W3CTraceState\n}\n\nexport const DistributedTracingModes = (/* @__PURE__ */ createEnumStyle<typeof eDistributedTracingModes>({\n    AI: eDistributedTracingModes.AI,\n    AI_AND_W3C: eDistributedTracingModes.AI_AND_W3C,\n    W3C: eDistributedTracingModes.W3C,\n    AI_AND_W3C_TRACE: eDistributedTracingModes.AI_AND_W3C_TRACE,\n    W3C_TRACE: eDistributedTracingModes.W3C_TRACE,\n\n    // Internal mask values\n    _BaseMask: eDistributedTracingModes._BaseMask,\n    _W3CTraceState: eDistributedTracingModes._W3CTraceState\n}));\nexport type DistributedTracingModes = number | eDistributedTracingModes;\n\n/**\n * The EventPersistenceValue contains a set of values that specify the event's persistence.\n */\nexport const enum EventPersistenceValue {\n    /**\n     * Normal persistence.\n     */\n    Normal = 1,\n    /**\n     * Critical persistence.\n     */\n    Critical = 2\n}\n\n/**\n * The EventPersistence contains a set of values that specify the event's persistence.\n */\nexport const EventPersistence = (/* @__PURE__ */ createEnumStyle<typeof EventPersistenceValue>({\n    /**\n     * Normal persistence.\n     */\n    Normal: EventPersistenceValue.Normal,\n\n    /**\n     * Critical persistence.\n     */\n    Critical: EventPersistenceValue.Critical\n}));\nexport type EventPersistence = number | EventPersistenceValue;\n\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/EventsDiscardedReason.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\n/**\n * The eEventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n */\nexport const enum eEventsDiscardedReason {\n    /**\n     * Unknown.\n     */\n     Unknown = 0,\n     /**\n      * Status set to non-retryable.\n      */\n     NonRetryableStatus = 1,\n     /**\n      * The event is invalid.\n      */\n     InvalidEvent = 2,\n     /**\n      * The size of the event is too large.\n      */\n     SizeLimitExceeded = 3,\n     /**\n      * The server is not accepting events from this instrumentation key.\n      */\n     KillSwitch = 4,\n     /**\n      * The event queue is full.\n      */\n     QueueFull = 5,\n     /**\n      * The sendBeacon API call failed for reasons other than size limits.\n      */\n     BeaconSendFailure = 6\n }\n\n/**\n * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n */\nexport const EventsDiscardedReason = (/* @__PURE__ */ createEnumStyle<typeof eEventsDiscardedReason>({\n    /**\n     * Unknown.\n     */\n    Unknown: eEventsDiscardedReason.Unknown,\n\n    /**\n     * Status set to non-retryable.\n     */\n    NonRetryableStatus: eEventsDiscardedReason.NonRetryableStatus,\n\n    /**\n     * The event is invalid.\n     */\n    InvalidEvent: eEventsDiscardedReason.InvalidEvent,\n\n    /**\n     * The size of the event is too large.\n     */\n    SizeLimitExceeded: eEventsDiscardedReason.SizeLimitExceeded,\n\n    /**\n     * The server is not accepting events from this instrumentation key.\n     */\n    KillSwitch: eEventsDiscardedReason.KillSwitch,\n\n    /**\n     * The event queue is full.\n     */\n    QueueFull: eEventsDiscardedReason.QueueFull,\n\n    /**\n     * The sendBeacon API call failed for reasons other than size limits.\n     */\n    BeaconSendFailure: eEventsDiscardedReason.BeaconSendFailure\n}));\n\nexport type EventsDiscardedReason = number | eEventsDiscardedReason;\n\n\n/**\n * The eBatchDiscardedReason enumeration contains a set of values that specify the reason for discarding offline batches.\n */\nexport const enum eBatchDiscardedReason {\n    /**\n     * Unknown.\n     */\n     Unknown = 0,\n\n     /**\n      * Status set to non-retryable after sending\n      */\n     NonRetryableStatus = 1,\n      \n     /**\n      * Batches with lower number of critical events are dropped to free up storage space\n      */\n     CleanStorage = 2,\n\n     /**\n      * The batches in storage exceed max allowed time\n      */\n     MaxInStorageTimeExceeded = 3\n}\n\n/**\n *  The eBatchDiscardedReason enumeration contains a set of values that specify the reason for discarding offline batches.\n */\nexport const BatchDiscardedReason = (/* @__PURE__ */ createEnumStyle<typeof eBatchDiscardedReason>({\n    /**\n     * Unknown.\n     */\n    Unknown: eBatchDiscardedReason.Unknown,\n\n    /**\n      * Status set to non-retryable after sending\n      */\n    NonRetryableStatus: eBatchDiscardedReason.NonRetryableStatus,\n      \n    /**\n     * Batches with lower number of critical events are dropped to free up storage space\n     */\n    CleanStorage: eBatchDiscardedReason.CleanStorage,\n\n    /**\n     * The batches in storage exceed max allowed time\n     */\n    MaxInStorageTimeExceeded: eBatchDiscardedReason.MaxInStorageTimeExceeded\n    \n}));\n\nexport type BatchDiscardedReason = number | eBatchDiscardedReason;"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/FeatureOptInEnums.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const enum FeatureOptInMode {\n    /**\n     * not set, completely depends on cdn cfg\n     */\n    none = 1,\n    /**\n     * try to not apply config from cdn\n     */\n    disable = 2,\n    /**\n     * try to apply config from cdn\n     */\n    enable = 3\n}\n\nexport const enum CdnFeatureMode {\n    /**\n     * not set, user defined/config defaults value will be used\n     */\n    none = 1,\n    /**\n     * config from cdn will Not be applied\n     */\n    disable = 2,\n    /**\n     * try to apply config from cdn\n     */\n    enable = 3,\n     /**\n     * force enable\n     */\n    forceOn = 4,\n     /**\n      * force disable\n      */\n    forceOff = 5\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/InitActiveStatusEnum.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\nexport const enum eActiveStatus {\n   \n    // None\n    NONE = 0,\n    /**\n     * inactive status means there might be rejected ikey/endpoint promises or ikey/endpoint resolved is not valid\n     */\n    INACTIVE = 1,\n\n    /**\n     * active mean ikey/endpoint promises is resolved and initializing with ikey/endpoint is successful\n     */\n    ACTIVE = 2,\n\n    /**\n     * Waiting for promises to be resolved\n     * NOTE: if status is set to be pending, incoming changes will be dropped until pending status is removed\n     */\n     PENDING = 3,\n}\n\nexport const ActiveStatus = (/* @__PURE__ */ createEnumStyle<typeof eActiveStatus>({\n    NONE: eActiveStatus.NONE,\n    PENDING: eActiveStatus.PENDING,\n    INACTIVE: eActiveStatus.INACTIVE,\n    ACTIVE: eActiveStatus.ACTIVE\n}));\nexport type ActiveStatus = number | eActiveStatus;"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/LoggingEnums.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//  @skip-file-minify\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\nexport const enum eLoggingSeverity {\n    /**\n     * No Logging will be enabled\n     */\n    DISABLED = 0,\n\n    /**\n     * Error will be sent as internal telemetry\n     */\n    CRITICAL = 1,\n\n    /**\n     * Error will NOT be sent as internal telemetry, and will only be shown in browser console\n     */\n    WARNING = 2,\n\n    /**\n     * The Error will NOT be sent as an internal telemetry, and will only be shown in the browser\n     * console if the logging level allows it.\n     */\n    DEBUG = 3\n}\n\nexport const LoggingSeverity = (/* @__PURE__ */ createEnumStyle<typeof eLoggingSeverity>({\n    DISABLED: eLoggingSeverity.DISABLED,\n    CRITICAL: eLoggingSeverity.CRITICAL,\n    WARNING: eLoggingSeverity.WARNING,\n    DEBUG: eLoggingSeverity.DEBUG\n}));\nexport type LoggingSeverity = number | eLoggingSeverity;\n\nexport const enum _eInternalMessageId {\n    BrowserDoesNotSupportLocalStorage = 0,\n    BrowserCannotReadLocalStorage = 1,\n    BrowserCannotReadSessionStorage = 2,\n    BrowserCannotWriteLocalStorage = 3,\n    BrowserCannotWriteSessionStorage = 4,\n    BrowserFailedRemovalFromLocalStorage = 5,\n    BrowserFailedRemovalFromSessionStorage = 6,\n    CannotSendEmptyTelemetry = 7,\n    ClientPerformanceMathError = 8,\n    ErrorParsingAISessionCookie = 9,\n    ErrorPVCalc = 10,\n    ExceptionWhileLoggingError = 11,\n    FailedAddingTelemetryToBuffer = 12,\n    FailedMonitorAjaxAbort = 13,\n    FailedMonitorAjaxDur = 14,\n    FailedMonitorAjaxOpen = 15,\n    FailedMonitorAjaxRSC = 16,\n    FailedMonitorAjaxSend = 17,\n    FailedMonitorAjaxGetCorrelationHeader = 18,\n    FailedToAddHandlerForOnBeforeUnload = 19,\n    FailedToSendQueuedTelemetry = 20,\n    FailedToReportDataLoss = 21,\n    FlushFailed = 22,\n    MessageLimitPerPVExceeded = 23,\n    MissingRequiredFieldSpecification = 24,\n    NavigationTimingNotSupported = 25,\n    OnError = 26,\n    SessionRenewalDateIsZero = 27,\n    SenderNotInitialized = 28,\n    StartTrackEventFailed = 29,\n    StopTrackEventFailed = 30,\n    StartTrackFailed = 31,\n    StopTrackFailed = 32,\n    TelemetrySampledAndNotSent = 33,\n    TrackEventFailed = 34,\n    TrackExceptionFailed = 35,\n    TrackMetricFailed = 36,\n    TrackPVFailed = 37,\n    TrackPVFailedCalc = 38,\n    TrackTraceFailed = 39,\n    TransmissionFailed = 40,\n    FailedToSetStorageBuffer = 41,\n    FailedToRestoreStorageBuffer = 42,\n    InvalidBackendResponse = 43,\n    FailedToFixDepricatedValues = 44,\n    InvalidDurationValue = 45,\n    TelemetryEnvelopeInvalid = 46,\n    CreateEnvelopeError = 47,\n\n    // User actionable\n    CannotSerializeObject = 48,\n    CannotSerializeObjectNonSerializable = 49,\n    CircularReferenceDetected = 50,\n    ClearAuthContextFailed = 51,\n    ExceptionTruncated = 52,\n    IllegalCharsInName = 53,\n    ItemNotInArray = 54,\n    MaxAjaxPerPVExceeded = 55,\n    MessageTruncated = 56,\n    NameTooLong = 57,\n    SampleRateOutOfRange = 58,\n    SetAuthContextFailed = 59,\n    SetAuthContextFailedAccountName = 60,\n    StringValueTooLong = 61,\n    StartCalledMoreThanOnce = 62,\n    StopCalledWithoutStart = 63,\n    TelemetryInitializerFailed = 64,\n    TrackArgumentsNotSpecified = 65,\n    UrlTooLong = 66,\n    SessionStorageBufferFull = 67,\n    CannotAccessCookie = 68,\n    IdTooLong = 69,\n    InvalidEvent = 70,\n    FailedMonitorAjaxSetRequestHeader = 71,\n    SendBrowserInfoOnUserInit = 72,\n    PluginException = 73,\n    NotificationException = 74,\n    SnippetScriptLoadFailure = 99,\n    InvalidInstrumentationKey = 100,\n    CannotParseAiBlobValue = 101,\n    InvalidContentBlob = 102,\n    TrackPageActionEventFailed = 103,\n    FailedAddingCustomDefinedRequestContext = 104,\n    InMemoryStorageBufferFull = 105,\n    InstrumentationKeyDeprecation = 106,\n    ConfigWatcherException = 107,\n    DynamicConfigException = 108,\n    DefaultThrottleMsgKey = 109,\n    CdnDeprecation = 110,\n    SdkLdrUpdate = 111,\n    InitPromiseException = 112,\n    StatsBeatManagerException = 113,\n    StatsBeatException = 114,\n    AttributeError = 115,\n    SpanError = 116,\n    TraceError = 117,\n    NotImplementedError = 118,\n    VersionMismatch = 119,\n\n    // Test Errors (Generally not thrown/used in production)\n    MaxUnloadHookExceeded = 9948\n}\n\nexport type _InternalMessageId = number | _eInternalMessageId;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/SendRequestReason.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n/**\n* The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.\n*/\nexport const enum SendRequestReason {\n    /**\n     * No specific reason was specified\n     */\n    Undefined = 0,\n\n    /**\n     * Events are being sent based on the normal event schedule / timer.\n     */\n    NormalSchedule = 1,\n\n    /**\n     * A manual flush request was received\n     */\n    // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n    ManualFlush = 1,\n\n    /**\n     * Unload event is being processed\n     */\n    Unload = 2,\n\n    /**\n     * The event(s) being sent are sync events\n     */\n    SyncEvent = 3,\n\n    /**\n     * The Channel was resumed\n     */\n    Resumed = 4,\n\n    /**\n     * The event(s) being sent as a retry\n     */\n    Retry = 5,\n\n    /**\n     * The SDK is unloading\n     */\n    SdkUnload = 6,\n    \n    /**\n     * Maximum batch size would be exceeded\n     */\n    MaxBatchSize = 10,\n\n    /**\n     * The Maximum number of events have already been queued\n     */\n    MaxQueuedEvents = 20\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/StatsType.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//  @skip-file-minify\n\nexport const enum eStatsType {\n    SDK = 0,\n    CLIENT = 1,\n}\n\nexport type StatsType = number | eStatsType;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/TelemetryUnloadReason.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * The TelemetryUnloadReason enumeration contains the possible reasons for why a plugin is being unloaded / torndown().\n */\nexport const enum TelemetryUnloadReason {\n    /**\n     * Teardown has been called without any context.\n     */\n    ManualTeardown = 0,\n\n    /**\n     * Just this plugin is being removed\n     */\n    PluginUnload = 1,\n\n    /**\n     * This instance of the plugin is being removed and replaced\n     */\n    PluginReplace = 2,\n\n    /**\n     * The entire SDK is being unloaded\n     */\n    SdkUnload = 50\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/TelemetryUpdateReason.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * The TelemetryUpdateReason enumeration contains a set of bit-wise values that specify the reason for update request.\n */\nexport const enum TelemetryUpdateReason {\n    /**\n     * Unknown.\n     */\n    Unknown = 0,\n\n    /**\n     * The configuration has ben updated or changed\n     */\n    ConfigurationChanged = 0x01,\n\n    /**\n     * One or more plugins have been added\n     */\n    PluginAdded = 0x10,\n\n    /**\n     * One or more plugins have been removed\n     */\n    PluginRemoved = 0x20,\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/TraceHeadersMode.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Controls how the SDK should look for trace headers (traceparent/tracestate) from the initial page load\n * The values are bitwise OR'd together to allow for multiple values to be set at once.\n * @since 3.4.0\n */\nexport const enum eTraceHeadersMode {\n    /**\n     * Don't look for any trace headers\n     */\n    None = 0x00,\n\n    /**\n     * Look for traceparent header/meta tag\n     */\n    TraceParent = 0x01,\n\n    /**\n     * Look for tracestate header/meta tag\n     */\n    TraceState = 0x02,\n\n    /**\n     * Look for both traceparent and tracestate headers/meta tags\n     */\n    All = 0x03\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ai/UrlRedactionOptions.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\n/**\n * Controls how the user can configure which parts of the URL should be redacted. Example, certain query parameters, username and password, etc.\n*/\n\nexport const enum eUrlRedactionOptions {\n    /**\n     * The default value, will redact the username and password as well as the default set of query parameters\n     */\n    true = 1,\n\n    /**\n     * Does not redact username and password or any query parameters, the URL will be left as is. Note: this is not recommended as it may lead\n     * to sensitive data being sent in clear text.\n     */\n    false = 2,\n\n    /**\n     * This will append any additional queryParams that the user has provided through redactQueryParams config to the default set i.e to\n     * @defaultValue [\"sig\", \"Signature\", \"AWSAccessKeyId\", \"X-Goog-Signature\"].\n     */\n    appendToDefault = 3,\n\n    /**\n     * This will replace the default set of query parameters to redact with the query parameters defined in redactQueryParams config, if provided by the user.\n     */\n    replaceDefault = 4,\n\n    /**\n     * This will redact username and password in the URL but will not redact any query parameters, even those in the default set.\n     */\n    usernamePasswordOnly = 5,\n\n    /**\n     * This will only redact the query parameter in the default set of query parameters to redact. It will not redact username and password.\n     */\n    queryParamsOnly = 6,\n\n}\n\nexport const UrlRedactionOptions = (/* @__PURE__ */ createEnumStyle<typeof eUrlRedactionOptions>({\n    /**\n     * The default value, will redact the username and password as well as the default set of query parameters\n     */\n    true: eUrlRedactionOptions.true,\n\n    /**\n     * Does not redact username and password or any query parameters, the URL will be left as is. Note: this is not recommended as it may lead\n     * to sensitive data being sent in clear text.\n     */\n    false: eUrlRedactionOptions.false,\n\n    /**\n     * This will append any additional queryParams that the user has provided through redactQueryParams config to the default set i.e to\n     * @defaultValue [\"sig\", \"Signature\", \"AWSAccessKeyId\", \"X-Goog-Signature\"].\n     */\n    appendToDefault: eUrlRedactionOptions.appendToDefault,\n\n    /**\n     * This will replace the default set of query parameters to redact with the query parameters defined in redactQueryParams config, if provided by the user.\n     */\n    replaceDefault: eUrlRedactionOptions.replaceDefault,\n\n    /**\n     * This will redact username and password in the URL but will not redact any query parameters, even those in the default set.\n     */\n    usernamePasswordOnly: eUrlRedactionOptions.usernamePasswordOnly,\n\n    /**\n     * This will only redact the query parameter in the default set of query parameters to redact. It will not redact username and password.\n     */\n    queryParamsOnly: eUrlRedactionOptions.queryParamsOnly\n\n}));\n\nexport type UrlRedactionOptions = boolean | eUrlRedactionOptions;"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/ext/Enums.ts",
    "content": "/**\n* Enums.ts\n* @author Abhilash Panwar (abpanwar)\n* @copyright Microsoft 2018\n* File containing the enums as constants.\n*/\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\nimport { _eInternalMessageId } from \"../ai/LoggingEnums\";\n\n/**\n * The eValueKind contains a set of values that specify value kind of the property.\n * Either PII (Personal Identifiable Information) or customer content.\n */\nexport const enum eValueKind {\n    /**\n     * No kind.\n     */\n    NotSet = 0,\n\n    /**\n     * An LDAP distinguished name. For example, CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM.\n     */\n    Pii_DistinguishedName = 1,\n\n    /**\n     * Generic information.\n     */\n    Pii_GenericData = 2,\n\n    /**\n     * An IPV4 Internet address. For example, 192.0.2.1.\n     */\n    Pii_IPV4Address = 3,\n\n    /**\n     * An IPV6 Internet address. For example, 2001:0db8:85a3:0000:0000:8a2e:0370:7334.\n     */\n    Pii_IPv6Address = 4,\n\n    /**\n     * The Subject of an e-mail message.\n     */\n    Pii_MailSubject = 5,\n\n    /**\n     * A telephone number.\n     */\n    Pii_PhoneNumber = 6,\n\n    /**\n     * A query string.\n     */\n    Pii_QueryString = 7,\n\n    /**\n     * An SIP (Session Internet Protocol) address.\n     */\n    Pii_SipAddress = 8,\n\n    /**\n     * An e-mail address.\n     */\n    Pii_SmtpAddress = 9,\n\n    /**\n     * An user ID.\n     */\n    Pii_Identity = 10,\n\n    /**\n     * A URI (Uniform Resource Identifier).\n     */\n    Pii_Uri = 11,\n\n    /**\n     * The fully-qualified domain name.\n     */\n    Pii_Fqdn = 12,\n\n    /**\n     * Scrubs the last octet in a IPV4 Internet address.\n     * For example: 10.121.227.147 becomes 10.121.227.*\n     */\n    Pii_IPV4AddressLegacy = 13,\n\n    /**\n     * Scrubs the last 4 Hextets (last 64-bits) of an IPv6 address\n     */\n    Pii_IPv6ScrubLastHextets = 14,\n\n    /**\n     * Drops the value altogether, rather than hashing\n     */\n    Pii_DropValue = 15,\n\n    /**\n     * Generic content.\n     */\n    CustomerContent_GenericContent = 32\n}\n\n/**\n * The ValueKind contains a set of values that specify value kind of the property.\n * Either PII (Personal Identifiable Information) or customer content.\n */\nexport const ValueKind = (/* @__PURE__ */ createEnumStyle<typeof eValueKind>({\n    NotSet: eValueKind.NotSet,\n    Pii_DistinguishedName: eValueKind.Pii_DistinguishedName,\n    Pii_GenericData: eValueKind.Pii_GenericData,\n    Pii_IPV4Address: eValueKind.Pii_IPV4Address,\n    Pii_IPv6Address: eValueKind.Pii_IPv6Address,\n    Pii_MailSubject: eValueKind.Pii_MailSubject,\n    Pii_PhoneNumber: eValueKind.Pii_PhoneNumber,\n    Pii_QueryString: eValueKind.Pii_QueryString,\n    Pii_SipAddress: eValueKind.Pii_SipAddress,\n    Pii_SmtpAddress: eValueKind.Pii_SmtpAddress,\n    Pii_Identity: eValueKind.Pii_Identity,\n    Pii_Uri: eValueKind.Pii_Uri,\n    Pii_Fqdn: eValueKind.Pii_Fqdn,\n    Pii_IPV4AddressLegacy: eValueKind.Pii_IPV4AddressLegacy,\n    Pii_IPv6ScrubLastHextets: eValueKind.Pii_IPv6ScrubLastHextets,\n    Pii_DropValue: eValueKind.Pii_DropValue,\n    CustomerContent_GenericContent: eValueKind.CustomerContent_GenericContent\n}));\nexport type ValueKind = number | eValueKind\n\n/**\n * The EventLatency contains a set of values that specify the latency with which an event is sent.\n */\nexport const enum EventLatencyValue {\n    /**\n     * Normal latency.\n     */\n    Normal = 1,\n    /**\n     * Cost deferred latency. At the moment this latency is treated as Normal latency.\n     */\n    CostDeferred = 2,\n    /**\n     * Real time latency.\n     */\n    RealTime = 3,\n\n    /**\n     * Bypass normal batching/timing and send as soon as possible, this will still send asynchronously.\n     * Added in v3.1.1\n     */\n    Immediate = 4\n}\n\n/**\n * The EventLatency contains a set of values that specify the latency with which an event is sent.\n */\nexport const EventLatency = (/* @__PURE__ */ createEnumStyle<typeof EventLatencyValue>({\n    /**\n     * Normal latency.\n     */\n    Normal: EventLatencyValue.Normal,\n    /**\n     * Cost deferred latency. At the moment this latency is treated as Normal latency.\n     */\n    CostDeferred: EventLatencyValue.CostDeferred,\n    /**\n     * Real time latency.\n     */\n    RealTime: EventLatencyValue.RealTime,\n\n    /**\n     * Bypass normal batching/timing and send as soon as possible, this will still send asynchronously.\n     * Added in v3.1.1\n     */\n    Immediate: EventLatencyValue.Immediate\n}));\nexport type EventLatency = number | EventLatencyValue\n\n/**\n * Enum for property types.\n */\nexport const enum eEventPropertyType {\n    Unspecified = 0,\n    String = 1,\n    Int32 = 2,\n    UInt32 = 3,\n    Int64 = 4,\n    UInt64 = 5,\n    Double = 6,\n    Bool = 7,\n    Guid = 8,\n    DateTime = 9\n}\n\n/**\n * Enum for property types.\n */\nexport const EventPropertyType = (/* @__PURE__ */ createEnumStyle<typeof eEventPropertyType>({\n    Unspecified: eEventPropertyType.Unspecified,\n    String: eEventPropertyType.String,\n    Int32: eEventPropertyType.Int32,\n    UInt32: eEventPropertyType.UInt32,\n    Int64: eEventPropertyType.Int64,\n    UInt64: eEventPropertyType.UInt64,\n    Double: eEventPropertyType.Double,\n    Bool: eEventPropertyType.Bool,\n    Guid: eEventPropertyType.Guid,\n    DateTime: eEventPropertyType.DateTime\n}));\nexport type EventPropertyType = number | eEventPropertyType\n\n/**\n * Define a specific way to send an event synchronously\n */\nexport const enum EventSendType {\n    /**\n     * Batch and send the event asynchronously, this is the same as either setting the event `sync` flag to false or not setting at all.\n     */\n    Batched = 0, // For backward compatibility numeric 0 === false as a numeric\n\n    /**\n     * Attempt to send the event synchronously, this is the same as setting the event `sync` flag to true\n     */\n    Synchronous = 1, // For backward compatibility numeric 1 === true as a numeric\n\n    /**\n     * Attempt to send the event synchronously with a preference for the sendBeacon() API.\n     * As per the specification, the payload of the event (when converted to JSON) must not be larger than 64kb,\n     * the sendHook is also not supported or used when sendBeacon.\n     */\n    SendBeacon = 2,\n\n    /**\n     * Attempt to send the event synchronously with a preference for the fetch() API with the keepalive flag,\n     * the SDK checks to ensure that the fetch() implementation supports the 'keepalive' flag and if not it\n     * will fallback to either sendBeacon() or a synchronous XHR request.\n     * As per the specification, the payload of the event (when converted to JSON) must not be larger than 64kb.\n     * Note: Not all browsers support the keepalive flag so for those environments the events may still fail\n     */\n     SyncFetch = 3\n}\n\n/**\n * The TraceLevel contains a set of values that specify the trace level for the trace messages.\n */\nexport const enum eTraceLevel {\n    /**\n     * None.\n     */\n    NONE = 0,\n    /**\n     * Error trace.\n     */\n    ERROR = 1,\n    /**\n     * Warning trace.\n     */\n    WARNING = 2,\n    /**\n     * Information trace.\n     */\n    INFORMATION = 3\n}\n\nexport const TraceLevel = (/* @__PURE__ */ createEnumStyle<typeof eTraceLevel>({\n    NONE: eTraceLevel.NONE,\n    ERROR: eTraceLevel.ERROR,\n    WARNING: eTraceLevel.WARNING,\n    INFORMATION: eTraceLevel.INFORMATION\n}));\nexport type TraceLevel = number | eTraceLevel;\n\nexport const enum _eExtendedInternalMessageId {\n    AuthHandShakeError = 501,\n    AuthRedirectFail = 502,\n    BrowserCannotReadLocalStorage = 503,\n    BrowserCannotWriteLocalStorage = 504,\n    BrowserDoesNotSupportLocalStorage = 505,\n    CannotParseBiBlobValue = 506,\n    CannotParseDataAttribute = 507,\n    CVPluginNotAvailable = 508,\n    DroppedEvent = 509,\n    ErrorParsingAISessionCookie = 510,\n    ErrorProvidedChannels = 511,\n    FailedToGetCookies = 512,\n    FailedToInitializeCorrelationVector = 513,\n    FailedToInitializeSDK = 514,\n    InvalidContentBlob = 515,\n    InvalidCorrelationValue = 516,\n    SessionRenewalDateIsZero = 517,\n    SendPostOnCompleteFailure = 518,\n    PostResponseHandler = 519,\n    SDKNotInitialized = 520\n}\n\n// export const _ExtendedInternalMessageId = objFreeze({\n//     ..._InternalMessageId,\n//     ...createEnumStyle<typeof _eExtendedInternalMessageId>({\n//     AuthHandShakeError: _eExtendedInternalMessageId.AuthHandShakeError,\n//     AuthRedirectFail: _eExtendedInternalMessageId.AuthRedirectFail,\n//     BrowserCannotReadLocalStorage: _eExtendedInternalMessageId.BrowserCannotReadLocalStorage,\n//     BrowserCannotWriteLocalStorage: _eExtendedInternalMessageId.BrowserCannotWriteLocalStorage,\n//     BrowserDoesNotSupportLocalStorage: _eExtendedInternalMessageId.BrowserDoesNotSupportLocalStorage,\n//     CannotParseBiBlobValue: _eExtendedInternalMessageId.CannotParseBiBlobValue,\n//     CannotParseDataAttribute: _eExtendedInternalMessageId.CannotParseDataAttribute,\n//     CVPluginNotAvailable: _eExtendedInternalMessageId.CVPluginNotAvailable,\n//     DroppedEvent: _eExtendedInternalMessageId.DroppedEvent,\n//     ErrorParsingAISessionCookie: _eExtendedInternalMessageId.ErrorParsingAISessionCookie,\n//     ErrorProvidedChannels: _eExtendedInternalMessageId.ErrorProvidedChannels,\n//     FailedToGetCookies: _eExtendedInternalMessageId.FailedToGetCookies,\n//     FailedToInitializeCorrelationVector: _eExtendedInternalMessageId.FailedToInitializeCorrelationVector,\n//     FailedToInitializeSDK: _eExtendedInternalMessageId.FailedToInitializeSDK,\n//     InvalidContentBlob: _eExtendedInternalMessageId.InvalidContentBlob,\n//     InvalidCorrelationValue: _eExtendedInternalMessageId.InvalidCorrelationValue,\n//     SessionRenewalDateIsZero: _eExtendedInternalMessageId.SessionRenewalDateIsZero,\n//     SendPostOnCompleteFailure: _eExtendedInternalMessageId.SendPostOnCompleteFailure,\n//     PostResponseHandler: _eExtendedInternalMessageId.PostResponseHandler,\n//     SDKNotInitialized: _eExtendedInternalMessageId.SDKNotInitialized\n// })});\nexport type _ExtendedInternalMessageId = number | _eExtendedInternalMessageId | _eInternalMessageId;\n\n// Following the format styles as defined by .Net (https://docs.microsoft.com/en-us/dotnet/api/system.guid.tostring?view=netcore-3.1)\nexport const enum GuidStyle {\n    Numeric = \"N\",          // 'N' - 32 digits,\n    Digits = \"D\",           // 'D' - 32 digits separated by hyphens,\n    Braces = \"B\",           // 'B' - 32 digits separated by hyphens, enclosed in braces,\n    Parentheses = \"P\"       // 'P' 32 digits separated by hyphens, enclosed in parentheses\n}\n\nexport const enum FieldValueSanitizerType {\n    NotSet = 0x00,\n\n    String = 0x01,\n\n    Number = 0x02,\n\n    Boolean = 0x03,\n\n    Object = 0x04,\n\n    Array = 0x1000,\n\n    EventProperty = 0x2000\n}\n\n/**\n * An enumeration that identifies the transport type that are requested to be used, if the requested\n * transport is not available ir supported the SDK may choose the first available transport or it\n * will log a warning to the diagnostic logger.\n */\nexport const enum TransportType {\n    /**\n     * Use the default available api\n     */\n    NotSet = 0,\n\n    /**\n     * Use XMLHttpRequest or XMLDomainRequest if available\n     */\n    Xhr = 1,\n\n    /**\n     * Use the Fetch api if available\n     */\n    Fetch = 2,\n\n    /**\n     * Use sendBeacon api if available\n     */\n    Beacon =  3\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/otel/OTelSamplingDecision.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\n/**\n * A sampling decision that determines how a {@link IOTelSpan} will be recorded\n * and collected.\n */\nexport const enum eOTelSamplingDecision {\n    /**\n     * `Span.isRecording() === false`, span will not be recorded and all events\n     * and attributes will be dropped.\n     */\n    NOT_RECORD = 0,\n    /**\n     * `Span.isRecording() === true`, but `Sampled` flag in {@link eW3CTraceFlags}\n     * MUST NOT be set.\n     */\n    RECORD = 1,\n    /**\n     * `Span.isRecording() === true` AND `Sampled` flag in {@link eW3CTraceFlags}\n     * MUST be set.\n     */\n    RECORD_AND_SAMPLED = 2,\n}\n\nexport const OTelSamplingDecision = (/* @__PURE__ */createEnumStyle<typeof eOTelSamplingDecision>({\n    NOT_RECORD: eOTelSamplingDecision.NOT_RECORD,\n    RECORD: eOTelSamplingDecision.RECORD,\n    RECORD_AND_SAMPLED: eOTelSamplingDecision.RECORD_AND_SAMPLED\n}));\nexport type OTelSamplingDecision = number | eOTelSamplingDecision;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/otel/OTelSpanKind.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\n/**\n * The defined set of Span Kinds as defined by the OpenTelemetry.\n */\nexport const enum eOTelSpanKind {\n    /** Default value. Indicates that the span is used internally. */\n    INTERNAL = 0,\n  \n    /**\n     * Indicates that the span covers server-side handling of an RPC or other\n     * remote request.\n     */\n    SERVER = 1,\n  \n    /**\n     * Indicates that the span covers the client-side wrapper around an RPC or\n     * other remote request.\n     */\n    CLIENT = 2,\n  \n    /**\n     * Indicates that the span describes producer sending a message to a\n     * broker. Unlike client and server, there is no direct critical path latency\n     * relationship between producer and consumer spans.\n     */\n    PRODUCER = 3,\n  \n    /**\n     * Indicates that the span describes consumer receiving a message from a\n     * broker. Unlike client and server, there is no direct critical path latency\n     * relationship between producer and consumer spans.\n     */\n    CONSUMER = 4,\n}\n\n/**\n * Creates an enum style object for the OTelSpanKind enum, providing the enum\n * values as properties of the object as both string and number types.\n * This allows for easy access to the enum values in a more readable format.\n */\nexport const OTelSpanKind = (/* @__PURE__ */createEnumStyle<typeof eOTelSpanKind>({\n    INTERNAL: eOTelSpanKind.INTERNAL,\n    SERVER: eOTelSpanKind.SERVER,\n    CLIENT: eOTelSpanKind.CLIENT,\n    PRODUCER: eOTelSpanKind.PRODUCER,\n    CONSUMER: eOTelSpanKind.CONSUMER\n}));\n  \nexport type OTelSpanKind = number | eOTelSpanKind;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/otel/OTelSpanStatus.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\n/**\n * An enumeration of status codes, matching the OpenTelemetry specification.\n *\n * @since 3.4.0\n */\nexport const enum eOTelSpanStatusCode {\n    /**\n     * The default status.\n     */\n    UNSET = 0,\n    /**\n     * The operation has been validated by an Application developer or\n     * Operator to have completed successfully.\n     */\n    OK = 1,\n    /**\n     * The operation contains an error.\n     */\n    ERROR = 2,\n}\n  \n\nexport const OTelSpanStatusCode = (/* @__PURE__ */createEnumStyle<typeof eOTelSpanStatusCode>({\n    UNSET: eOTelSpanStatusCode.UNSET,\n    OK: eOTelSpanStatusCode.OK,\n    ERROR: eOTelSpanStatusCode.ERROR\n}));\n\nexport type OTelSpanStatusCode = number | eOTelSpanStatusCode;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/enums/otel/eAttributeChangeOp.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../EnumHelperFuncs\";\n\n/**\n * Const enum for attribute change operation types\n */\nexport const enum eAttributeChangeOp {\n    /**\n     * Clear operation - clearing all attributes\n     */\n    Clear = 0,\n    \n    /**\n     * Set operation - setting an attribute value (generic)\n     */\n    Set = 1,\n    \n    /**\n     * Add operation - adding a new attribute that didn't exist before\n     */\n    Add = 2,\n    \n    /**\n     * Delete operation - deleting an attribute\n     */\n    Delete = 3,\n\n    /**\n     * Dropped attributes - attributes that were dropped due to size limits\n     */\n    DroppedAttributes = 4\n}\n\n/**\n * Runtime enum style object for attribute change operation types\n */\nexport const AttributeChangeOp = createEnumStyle({\n    Clear: eAttributeChangeOp.Clear,\n    Set: eAttributeChangeOp.Set,\n    Add: eAttributeChangeOp.Add,\n    Delete: eAttributeChangeOp.Delete\n});\n\nexport type AttributeChangeOp = number | eAttributeChangeOp;"
  },
  {
    "path": "shared/AppInsightsCore/src/ext/AppInsightsExtCore.ts",
    "content": "/**\n* AppInsightsCore.ts\n* @author Abhilash Panwar (abpanwar) Hector Hernandez (hectorh)\n* @copyright Microsoft 2018\n*/\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\nimport { ITimerHandler, dumpObj, objDeepFreeze, throwError } from \"@nevware21/ts-utils\";\nimport { createDynamicConfig } from \"../config/DynamicConfig\";\nimport { STR_DEFAULT_ENDPOINT_URL, STR_EMPTY, STR_VERSION } from \"../constants/InternalConstants\";\nimport { AppInsightsCore } from \"../core/AppInsightsCore\";\nimport { doPerf } from \"../core/PerfManager\";\nimport { _throwInternal } from \"../diagnostics/DiagnosticLogger\";\nimport { eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { EventLatencyValue, _eExtendedInternalMessageId } from \"../enums/ext/Enums\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { INotificationManager } from \"../interfaces/ai/INotificationManager\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { IPlugin } from \"../interfaces/ai/ITelemetryPlugin\";\nimport { IConfigDefaults } from \"../interfaces/config/IConfigDefaults\";\nimport { IExtendedConfiguration, IExtendedTelemetryItem, IPropertyStorageOverride } from \"../interfaces/ext/DataModels\";\nimport { ExtFullVersionString, getTime, isLatency } from \"./extUtils\";\n\n/**\n * The default settings for the config.\n * WE MUST include all defaults here to ensure that the config is created with all of the properties\n * defined as dynamic.\n */\nconst defaultConfig: IConfigDefaults<IExtendedConfiguration> = (/*#__PURE__*/ objDeepFreeze({\n    endpointUrl: STR_DEFAULT_ENDPOINT_URL,\n    propertyStorageOverride: { isVal: _chkPropOverride }\n}));\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _chkPropOverride(propertyStorageOverride: IPropertyStorageOverride) {\n    // Validate property storage override\n    if (propertyStorageOverride && (!propertyStorageOverride.getProperty || !propertyStorageOverride.setProperty)) {\n        throwError(\"Invalid property storage override passed.\");\n    }\n\n    return true;\n}\n\n/**\n * @group Classes\n * @group Entrypoint\n */\nexport class AppInsightsExtCore<C extends IExtendedConfiguration = IExtendedConfiguration> extends AppInsightsCore<C> {\n    constructor() {\n        super();\n\n        dynamicProto(AppInsightsExtCore, this, (_self, _base) => {\n\n            _self.initialize = (config: C, extensions: IPlugin[], logger?: IDiagnosticLogger, notificationManager?: INotificationManager) => {\n                doPerf(_self, () => \"AppInsightsCore.initialize\", () => {\n                    try {\n                        _base.initialize(createDynamicConfig<C>(config, defaultConfig as C, logger || _self.logger, false).cfg, extensions, logger, notificationManager);\n                    } catch (e) {\n                        let logger = _self.logger;\n                        let message = dumpObj(e);\n                        if (message.indexOf(\"channels\") !== -1) {\n                            // Add some additional context to the underlying reported error\n                            message += \"\\n - Channels must be provided through config.channels only!\";\n                        }\n                        _throwInternal(logger,\n                            eLoggingSeverity.CRITICAL,\n                            _eExtendedInternalMessageId.FailedToInitializeSDK, \"SDK Initialization Failed - no telemetry will be sent: \" + message\n                        );\n                    }\n                }, () => ({ config, extensions, logger, notificationManager }));\n            };\n\n            _self.track = (item: IExtendedTelemetryItem|ITelemetryItem) => {\n                doPerf(_self, () => \"AppInsightsCore.track\", () => {\n                    let telemetryItem: IExtendedTelemetryItem = item as IExtendedTelemetryItem;\n                    if (telemetryItem) {\n                        telemetryItem.timings = telemetryItem.timings || {};\n                        telemetryItem.timings.trackStart = getTime();\n                        if (!isLatency(telemetryItem.latency)) {\n                            telemetryItem.latency = EventLatencyValue.Normal;\n                        }\n\n                        let itemExt = telemetryItem.ext = telemetryItem.ext || {};\n                        itemExt.sdk = itemExt.sdk || {};\n                        itemExt.sdk.ver = ExtFullVersionString;\n                        let baseData = telemetryItem.baseData = telemetryItem.baseData || {};\n                        baseData.properties = baseData.properties || {};\n                        \n                        let itemProperties = baseData.properties;\n                        itemProperties[STR_VERSION] = itemProperties[STR_VERSION] || _self.pluginVersionString || STR_EMPTY;\n                    }\n\n                    _base.track(telemetryItem);\n                }, () => ({ item: item }), !((item as any).sync));\n            };\n\n            _self.pollInternalLogs = (eventName?: string): ITimerHandler => {\n                return _base.pollInternalLogs(eventName || \"InternalLog\");\n            };\n            \n        });\n    }\n\n    /**\n     * Initialize the sdk.\n     * @param config - The configuration to initialize the SDK.\n     * @param extensions - An array of extensions that are to be used by the core.\n     */\n    public initialize(config: C, extensions: IPlugin[], logger?: IDiagnosticLogger, notificationManager?: INotificationManager) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    public track(item: IExtendedTelemetryItem|ITelemetryItem) {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n    }\n\n    /**\n     * Periodically check logger.queue for\n     */\n    public pollInternalLogs(eventName?: string): ITimerHandler {\n        // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\n        return null;\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/ext/ValueSanitizer.ts",
    "content": "import { arrForEach, arrIncludes, arrIndexOf, getLength, isNullOrUndefined, isString, objForEachKey } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { FieldValueSanitizerType } from \"../enums/ext/Enums\";\nimport {\n    FieldValueSanitizerFunc, FieldValueSanitizerTypes, IEventProperty, IFieldSanitizerDetails, IFieldValueSanitizerProvider, IValueSanitizer\n} from \"../interfaces/ext/DataModels\";\nimport { getFieldValueType, isValueAssigned, isValueKind } from \"./extUtils\";\n\ninterface ISanitizerMapValue {\n    canHandle: boolean;\n    handler?: IValueSanitizer;\n    fieldHandler?: IFieldValueSanitizerProvider;\n}\n\nfunction _isSpecialName(name: string) {\n    return (name == \"__proto__\" || name == \"constructor\" || name == \"prototype\");\n}\n\nexport class ValueSanitizer implements IValueSanitizer {\n\n    public static getFieldType = getFieldValueType;\n\n    /**\n     * Clear the current value sanitizer cache.\n     */\n    public clearCache: () => void;\n\n    /**\n     * Add a value sanitizer as a fallback sanitizer if this sanitizer can't handle the path/name.\n     */\n    public addSanitizer: (sanitizer: IValueSanitizer) => void;\n\n    /**\n     * Adds a field sanitizer to the evaluation list\n     */\n    public addFieldSanitizer: (fieldSanitizer: IFieldValueSanitizerProvider) => void;\n\n    /**\n     * Removes the value sanitizer as a fallback sanitizer if this sanitizer can't handle the path/name if present.\n     */\n    public rmSanitizer: (theSanitizer: IValueSanitizer) => void;\n\n    /**\n     * Removes the field sanitizer to the evaluation list if present\n     */\n    public rmFieldSanitizer: (theFieldSanitizer: IFieldValueSanitizerProvider) => void;\n\n    /**\n     * Does this field value sanitizer handle this path / field combination\n     * @param path - The field path\n     * @param name - The name of the field\n     */\n    public handleField: (path: string, name: string) => boolean;\n\n    /**\n     * Sanitizes the value. It checks the that the property name and value are valid. It also\n     * checks/populates the correct type and pii of the property value.\n     * @param path - The root path of the property\n     * @param name - The property name.\n     * @param value - The property value or an IEventProperty containing value, type ,pii and customer content.\n     * @param stringifyObjects - If supplied tells the sanitizer that it should JSON stringify() objects\n     * @returns IEventProperty containing valid name, value, pii and type or null if invalid.\n     */\n    public value: (path: string, name: string, value: FieldValueSanitizerTypes, stringifyObjects?: boolean) => IEventProperty | null;\n\n    /**\n     * Sanitizes the Property. It checks the that the property name and value are valid. It also\n     * checks/populates the correct type and pii of the property value.\n     * @param path - The root path of the property\n     * @param name - The property name.\n     * @param property - The property value or an IEventProperty containing value, type ,pii and customer content.\n     * @param stringifyObjects - If supplied tells the sanitizer that it should JSON stringify() objects\n     * @returns IEventProperty containing valid name, value, pii and type or null if invalid.\n     */\n    public property: (path: string, name: string, property: IEventProperty, stringifyObjects?: boolean) => IEventProperty | null;\n\n    /**\n     * Returns whether this ValueSanitizer is empty\n     * @returns `true` if it contains no chained sanitizers or field sanitizers, otherwise `false`\n     */\n    public isEmpty?: () => boolean;\n\n    constructor(fieldSanitizerProvider?: IFieldValueSanitizerProvider) {\n        let _self = this;\n\n        // To aid with performance this is a lookup map to check if the field value sanitizer supports this field\n        let _sanitizerMap: { [path: string]: { [field: string]: ISanitizerMapValue } } = {};\n        let _sanitizers: IValueSanitizer[] = [];\n        let _fieldSanitizers: IFieldValueSanitizerProvider[] = [];\n        if (fieldSanitizerProvider) {\n            _fieldSanitizers.push(fieldSanitizerProvider);\n        }\n\n        function _getFieldSanitizer(path: string, name: string): ISanitizerMapValue {\n            let result: ISanitizerMapValue;\n            let fieldLookup = _sanitizerMap[path];\n            if (fieldLookup) {\n                result = fieldLookup[name];\n            }\n\n            if (!result && result !== null) {\n                // Null is a valid result indicating that the value sanitizer does not support this field\n                if (isString(path) && isString(name)) {\n                    if (_fieldSanitizers.length > 0) {\n                        for (let lp = 0; lp < _fieldSanitizers.length; lp++) {\n                            if (_fieldSanitizers[lp].handleField(path, name)) {\n                                result = {\n                                    canHandle: true, // This instance will handle so we won't assign the handler\n                                    fieldHandler: _fieldSanitizers[lp]\n                                };\n                                break;\n                            }\n                        }\n                    } else if (_sanitizers.length === 0) {\n                        // Special use-case where there is no sanitizer to pass on to, so just resolving the field\n                        // and returning the resulting value (same as sanitizeProperty())\n                        result = {\n                            canHandle: true\n                        };\n                    }\n                }\n\n                // We still don't have a handler so lets lookup the providers\n                if (!result && result !== null) {\n                    // Setting the result to null -- which means we and any contained sanitizers can't handle this field\n                    result = null;\n                    for (let lp = 0; lp < _sanitizers.length; lp++) {\n                        if (_sanitizers[lp].handleField(path, name)) {\n                            result = {\n                                canHandle: true,\n                                handler: _sanitizers[lp],\n                                fieldHandler: null\n                            };\n                            break;\n                        }\n                    }\n                }\n\n                if (!fieldLookup) {\n                    // Handle edge case to avoid prototype pollution\n                    if (_isSpecialName(path)) {\n                        return null;\n                    }\n\n                    fieldLookup = _sanitizerMap[path] = {};\n                }\n\n                // Handle edge case to avoid prototype pollution\n                if (_isSpecialName(name)) {\n                    return null;\n                }\n\n                fieldLookup[name] = result;\n            }\n\n            return result;\n        }\n\n        _self.clearCache = () => {\n            _sanitizerMap = {};\n        };\n\n        _self.addSanitizer = (newSanitizer: IValueSanitizer) => {\n            if (newSanitizer) {\n                if (!arrIncludes(_sanitizers, newSanitizer)) {\n                    _sanitizers.push(newSanitizer);\n                }\n\n                // Invalidate any previously mapped fields\n                _sanitizerMap = {};\n            }\n        };\n\n        _self.addFieldSanitizer = (fieldSanitizer: IFieldValueSanitizerProvider) => {\n            if (fieldSanitizer) {\n                if (!arrIncludes(_fieldSanitizers, fieldSanitizer)) {\n                    _fieldSanitizers.push(fieldSanitizer);\n                }\n\n                // Invalidate any previously mapped fields\n                _sanitizerMap = {};\n            }\n        };\n\n        _self.rmSanitizer = (theSanitizer: IValueSanitizer) => {\n            if (theSanitizer) {\n                let idx = arrIndexOf(_sanitizers, theSanitizer);\n                if (idx !== -1) {\n                    _sanitizers.splice(idx, 1);\n                    // Invalidate any previously mapped fields\n                    _sanitizerMap = {};\n                }\n\n                // Try and remove the sanitizer from any chained sanitizer as well\n                arrForEach(_sanitizers, (sanitizer) => {\n                    sanitizer && sanitizer.rmSanitizer && sanitizer.rmSanitizer(theSanitizer);\n                });\n            }\n        };\n\n        _self.rmFieldSanitizer = (theFieldSanitizer: IFieldValueSanitizerProvider) => {\n            if (theFieldSanitizer) {\n                let idx = arrIndexOf(_fieldSanitizers, theFieldSanitizer);\n                if (idx !== -1) {\n                    _fieldSanitizers.splice(idx, 1);\n                    // Invalidate any previously mapped fields\n                    _sanitizerMap = {};\n                }\n\n                // Try and remove the field sanitizer from any chained sanitizer as well\n                arrForEach(_sanitizers, (sanitizer) => {\n                    sanitizer && sanitizer.rmFieldSanitizer && sanitizer.rmFieldSanitizer(theFieldSanitizer);\n                });\n            }\n        };\n\n        _self.isEmpty = () => {\n            return (getLength(_sanitizers) + getLength(_fieldSanitizers)) === 0;\n        };\n\n        _self.handleField = (path: string, name: string): boolean => {\n            let mapValue: ISanitizerMapValue = _getFieldSanitizer(path, name);\n            return mapValue ? mapValue.canHandle : false;\n        };\n\n        _self.value = (path: string, name: string, value: FieldValueSanitizerTypes, stringifyObjects?: boolean): IEventProperty | null => {\n            let mapValue: ISanitizerMapValue = _getFieldSanitizer(path, name);\n            if (mapValue && mapValue.canHandle) {\n                if (!mapValue.canHandle) {\n                    return null;\n                }\n\n                if (mapValue.handler) {\n                    // This value sanitizer can't handle this field so pass it only the next one\n                    return mapValue.handler.value(path, name, value, stringifyObjects);\n                }\n\n                // Check that property is valid\n                if (!isString(name) || isNullOrUndefined(value) || (value as any) === STR_EMPTY) {\n                    return null;\n                }\n\n                let property = null;\n                let fieldType = getFieldValueType(value);\n\n                if ((fieldType & FieldValueSanitizerType.EventProperty) === FieldValueSanitizerType.EventProperty) {\n                    let subType = fieldType & ~FieldValueSanitizerType.EventProperty;\n                    property = value as IEventProperty;\n                    if (!isValueAssigned(property.value) ||\n                        (subType !== FieldValueSanitizerType.String &&\n                        subType !== FieldValueSanitizerType.Number &&\n                        subType !== FieldValueSanitizerType.Boolean &&\n                        (subType & FieldValueSanitizerType.Array) !== FieldValueSanitizerType.Array)) {\n\n                        // Not a supported IEventProperty type to be able to sanitize\n                        return null;\n                    }\n                } else if (fieldType === FieldValueSanitizerType.String ||\n                        fieldType === FieldValueSanitizerType.Number ||\n                        fieldType === FieldValueSanitizerType.Boolean ||\n                        (fieldType & FieldValueSanitizerType.Array) === FieldValueSanitizerType.Array) {\n                    // If the property isn't IEventProperty (and is either string, number, boolean or array), convert it into one.\n                    property = _convertToProperty(path, name, value);\n                } else if (fieldType === FieldValueSanitizerType.Object) {\n                    property = _convertToProperty(path, name, !!stringifyObjects ? JSON.stringify(value) : value);\n                }\n\n                if (property) {\n                    return _handleProperty(mapValue, path, name, fieldType, property, stringifyObjects);\n                }\n            }\n\n            return null;\n        };\n\n        _self.property = (path: string, name: string, property: IEventProperty, stringifyObjects?: boolean): IEventProperty | null => {\n            let mapValue: ISanitizerMapValue = _getFieldSanitizer(path, name);\n            if (!mapValue || !mapValue.canHandle) {\n                return null;\n            }\n\n            // Check that property is valid\n            if (!isString(name) || isNullOrUndefined(property) || !isValueAssigned(property.value)) {\n                return null;\n            }\n\n            let fieldType: FieldValueSanitizerType = getFieldValueType(property.value);\n            if (fieldType === FieldValueSanitizerType.NotSet) {\n                // Not a supported field that we can sanitize or serialize\n                return null;\n            }\n\n            return _handleProperty(mapValue, path, name, fieldType, property, stringifyObjects);\n        };\n\n        function _handleProperty(mapValue: ISanitizerMapValue, path: string, name: string, fieldType: FieldValueSanitizerType,\n            property: IEventProperty, stringifyObjects?: boolean): IEventProperty | null {\n\n            if (mapValue.handler) {\n                // This value sanitizer can't handle this field so pass it only the next one\n                return mapValue.handler.property(path, name, property, stringifyObjects);\n            }\n\n            // If either pii or cc is set convert value to string (since only string pii/cc is allowed).\n            // If the value is a complex type like an array that can't be converted to string we will drop\n            // the property.\n            if (!isNullOrUndefined(property.kind)) {\n                if ((fieldType & FieldValueSanitizerType.Array) === FieldValueSanitizerType.Array || !isValueKind(property.kind)) {\n                    return null;\n                }\n\n                // Convert the value to a string and assign back to the original value\n                property.value = property.value.toString();\n            }\n\n            return _callFieldSanitizer(mapValue.fieldHandler, path, name, fieldType, property);\n        }\n\n        function _convertToProperty(path: string, name: string, value: any): IEventProperty | null {\n            if (isValueAssigned(value)) {\n                return { value: value } as IEventProperty;\n            }\n\n            return null;\n        }\n\n        function _callFieldSanitizer(fieldProvider: IFieldValueSanitizerProvider, path: string, name: string, theType: FieldValueSanitizerType, property: IEventProperty) {\n            if (property && fieldProvider) {\n                let sanitizer: FieldValueSanitizerFunc = fieldProvider.getSanitizer(path, name, theType, property.kind, property.propertyType);\n                if (sanitizer) {\n                    // This is where we the field will call the handler to \"scrub\" the value. This the primary hook for the ClientHashing Plugin to\n                    // be able to apply the hashFunc() / Sha256 conversion of the properties value\n                    if (theType === FieldValueSanitizerType.Object) {\n                        // Special case of an embedded object (ext.metadata, data.properties)\n                        let newValue: any = { };\n                        let propValue = property.value;\n                        objForEachKey(propValue, (propKey, theValue) => {\n                            let newPath = path + \".\" + name;\n                            if (isValueAssigned(theValue)) {\n                                let newProp = _convertToProperty(newPath, propKey, theValue);\n                                newProp = _callFieldSanitizer(fieldProvider, newPath, propKey, getFieldValueType(theValue), newProp);\n                                if (newProp) {\n                                    newValue[propKey] = newProp.value;\n                                }\n                            }\n                        });\n\n                        property.value = newValue;\n                    } else {\n                        let details: IFieldSanitizerDetails = {\n                            path: path,\n                            name: name,\n                            type: theType,\n                            prop: property,\n                            sanitizer: _self\n                        };\n\n                        property = sanitizer.call(_self, details);\n                    }\n                }\n            }\n\n            return property;\n        }\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/ext/extSpanUtils.ts",
    "content": "// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n    ILazyValue, arrIncludes, asString, getLazy, getNavigator, isBoolean, isNullOrUndefined, isNumber, isString, strLower, strStartsWith,\n    throwError\n} from \"@nevware21/ts-utils\";\nimport { STR_NOT_SPECIFIED } from \"../constants/InternalConstants\";\nimport { eOTelSpanKind } from \"../enums/otel/OTelSpanKind\";\nimport { eOTelSpanStatusCode } from \"../enums/otel/OTelSpanStatus\";\nimport { IAppInsightsCore } from \"../interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IExtendedTelemetryItem } from \"../interfaces/ext/DataModels\";\nimport { OTelAttributeValue } from \"../interfaces/otel/IOTelAttributes\";\nimport { IAttributeContainer } from \"../interfaces/otel/attribute/IAttributeContainer\";\nimport { IReadableSpan } from \"../interfaces/otel/trace/IReadableSpan\";\nimport {\n    getHttpClientIp, getHttpHost, getHttpMethod, getHttpScheme, getHttpStatusCode, getHttpUrl, getSyntheticType, getUserAgent\n} from \"../internal/commonUtils\";\nimport { hrTimeToMilliseconds } from \"../internal/timeHelpers\";\nimport {\n    ATTR_CLIENT_ADDRESS, ATTR_CLIENT_PORT, ATTR_ENDUSER_ID, ATTR_ENDUSER_PSEUDO_ID, ATTR_ERROR_TYPE, ATTR_EXCEPTION_MESSAGE,\n    ATTR_EXCEPTION_STACKTRACE, ATTR_EXCEPTION_TYPE, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_NETWORK_LOCAL_ADDRESS,\n    ATTR_NETWORK_LOCAL_PORT, ATTR_NETWORK_PEER_ADDRESS, ATTR_NETWORK_PEER_PORT, ATTR_NETWORK_PROTOCOL_NAME, ATTR_NETWORK_PROTOCOL_VERSION,\n    ATTR_NETWORK_TRANSPORT, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_URL_FULL, ATTR_URL_PATH, ATTR_URL_QUERY, ATTR_URL_SCHEME,\n    ATTR_USER_AGENT_ORIGINAL, EXP_ATTR_ENDUSER_ID, EXP_ATTR_ENDUSER_PSEUDO_ID, EXP_ATTR_SYNTHETIC_TYPE, SEMATTRS_DB_NAME,\n    SEMATTRS_DB_OPERATION, SEMATTRS_DB_STATEMENT, SEMATTRS_DB_SYSTEM, SEMATTRS_ENDUSER_ID, SEMATTRS_EXCEPTION_MESSAGE,\n    SEMATTRS_EXCEPTION_STACKTRACE, SEMATTRS_EXCEPTION_TYPE, SEMATTRS_HTTP_CLIENT_IP, SEMATTRS_HTTP_FLAVOR, SEMATTRS_HTTP_HOST,\n    SEMATTRS_HTTP_METHOD, SEMATTRS_HTTP_ROUTE, SEMATTRS_HTTP_SCHEME, SEMATTRS_HTTP_STATUS_CODE, SEMATTRS_HTTP_TARGET, SEMATTRS_HTTP_URL,\n    SEMATTRS_HTTP_USER_AGENT, SEMATTRS_NET_HOST_IP, SEMATTRS_NET_HOST_NAME, SEMATTRS_NET_HOST_PORT, SEMATTRS_NET_PEER_IP,\n    SEMATTRS_NET_PEER_NAME, SEMATTRS_NET_PEER_PORT, SEMATTRS_NET_TRANSPORT, SEMATTRS_PEER_SERVICE, SEMATTRS_RPC_GRPC_STATUS_CODE,\n    SEMATTRS_RPC_SYSTEM\n} from \"../otel/attribute/SemanticConventions\";\nimport { createAttributeContainer } from \"../otel/attribute/attributeContainer\";\nimport { fieldRedaction } from \"../utils/EnvUtils\";\nimport { toISOString } from \"../utils/HelperFuncs\";\n\n/**\n * Azure SDK namespace.\n * @internal\n */\nconst AzNamespace = \"az.namespace\";\nconst AzResourceNamespace = \"azure.resource_provider.namespace\";\n\nconst PORT_REGEX: ILazyValue<RegExp> = (/*#__PURE__*/ getLazy(() => new RegExp(/(https?)(:\\/\\/.*)(:\\d+)(\\S*)/)));\nconst HTTP_DOT = \"http.\";\n\nconst _MS_PROCESSED_BY_METRICS_EXTRACTORS = \"_MS.ProcessedByMetricExtractors\";\n\n/**\n * Legacy HTTP semantic convention values\n * @internal\n */\nconst _ignoreSemanticValues: ILazyValue<string[]> = (/* #__PURE__*/ getLazy(_initIgnoreSemanticValues));\n\n/**\n * OTelSpan common schema Part B telemetry definition\n */\nexport interface IMsWebSpanTelemetry {\n    /**\n     * The span name is a human-readable string which concisely identifies the work\n     * represented by the Span, for example, an RPC method name, a function name, or\n     * the name of a subtask or stage within a larger computation. The span name should\n     * be the most general string that identifies a (statistically) interesting class\n     * of Spans, rather than individual Span instances. That is, \"get_user\" is a\n     * reasonable name, while \"get_user/314159\", where \"314159\" is a user ID, is not a\n     * good name due to its high cardinality.\n     * @see [OpenTelemetry Span Name Guidelines](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#span)\n     * @example\n     * ```json\n     * \"get_user\"\n     * ```\n     */\n    name: string;\n\n    /**\n     * Based on OpenTelemetry definition of SpanKind\n     * it is the type of span. Can be used to specify additional relationships between\n     * spans in addition to a parent/child relationship.\n     * @example\n     * ```json\n     * 2\n     * ```\n     */\n    kind: eOTelSpanKind;\n\n    /**\n     * Start time of the span. This field must be formatted in UTC ISO8601\n     * format, with a trailing 'Z' character. Note: the number of decimal\n     * seconds digits provided is variable (and unspecified). Consumers\n     * should handle this, i.e. managed code consumers should not use format\n     * \"O\" for parsing as it specifies a fixed length.\n     * @example\n     * ```json\n     * \"2018-09-05T22:51:22.4936Z\"\n     * ```\n     */\n    startTime: string;\n\n    /**\n     * Boolean to indicate the status of the operation whether it was a success or\n     * failed. This field is required. When not set explicitly to false - a request is\n     * considered to be successful.\n     * @example\n     * ```json\n     * true\n     * ```\n     */\n    success: boolean;\n\n    /**\n     * Status message for the span execution. This may be the exception type, error\n     * code or friendly message to indicate status for the operation. This can be used\n     * to report generic status for spans (not protocol-specific).\n     * @remark\n     * If you report `httpStatusCode`, `statusMessage` should not be reported and will be ignored.\n     * @example\n     * ```json\n     * \"Connection Failure\"\n     * ```\n     */\n    statusMessage?: string;\n\n    /**\n     * The spanId of this span's parent span. If this is a root span, then this field\n     * must be empty.\n     * @example\n     * ```json\n     * \"103067aa04a70897\"\n     * ```\n     */\n    parentId?: string;\n\n    /**\n     * For spans of type Client/Consumer for calls to Azure resources provide the Azure\n     * resource provider who would be fullfilling the request. Please follow the list\n     * provided [here](https://docs.microsoft.com/azure/azure-resource-manager/management/azure-services-resource-providers)\n     * @example\n     * ```json\n     * \"Microsoft.EventHub\"\n     * ```\n     */\n    azureResourceProvider?: string;\n\n    /**\n     * Links can be used to represent batched operations where a Span was initiated by\n     * multiple initiating Spans, each representing a single incoming item being\n     * processed in the batch. Another example is to link operation that is causally\n     * related to multiple operations. The \"allocate host\" operation could potentially\n     * fulfill multiple \"create vm\" operations.\n     *\n     * An array of related span links\n     * @example\n     * ```json\n     * [{\"toTraceId\":\"5eca8b153632494ba00f619d6877b134\",\"toSpanId\":\"d4c1279b6e7b7c47\"}]\n     * ```\n     */\n    links?: string;\n\n    /**\n     * Duration of the span in milliseconds. This is the difference between\n     * endTime (the Part A \"time\" field) and startTime.\n     */\n    duration?: number;\n\n    /**\n     * TraceState provides vendor-specific trace context information.\n     * It is defined in the [W3C TraceContext specification](https://www.w3.org/TR/trace-context/#tracestate-header).\n     * @example\n     * ```json\n     * \"rojo=00f067aa0ba902b7,congo=t61rcWkgMzE\"\n     * ```\n     */\n    traceState?: string;\n\n    /**\n     * Additional properties\n     */\n    [key: string]: any;\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nfunction _initIgnoreSemanticValues(): string[] {\n    return [\n        // Internal Microsoft attributes\n        _MS_PROCESSED_BY_METRICS_EXTRACTORS,\n\n        // Legacy HTTP semantic values\n        SEMATTRS_NET_PEER_IP,\n        SEMATTRS_NET_PEER_NAME,\n        SEMATTRS_NET_HOST_IP,\n        SEMATTRS_PEER_SERVICE,\n        SEMATTRS_HTTP_USER_AGENT,\n        SEMATTRS_HTTP_METHOD,\n        SEMATTRS_HTTP_URL,\n        SEMATTRS_HTTP_STATUS_CODE,\n        SEMATTRS_HTTP_ROUTE,\n        SEMATTRS_HTTP_HOST,\n        SEMATTRS_DB_SYSTEM,\n        SEMATTRS_DB_STATEMENT,\n        SEMATTRS_DB_OPERATION,\n        SEMATTRS_DB_NAME,\n        SEMATTRS_RPC_SYSTEM,\n        SEMATTRS_RPC_GRPC_STATUS_CODE,\n        SEMATTRS_EXCEPTION_TYPE,\n        SEMATTRS_EXCEPTION_MESSAGE,\n        SEMATTRS_EXCEPTION_STACKTRACE,\n        SEMATTRS_HTTP_SCHEME,\n        SEMATTRS_HTTP_TARGET,\n        SEMATTRS_HTTP_FLAVOR,\n        SEMATTRS_NET_TRANSPORT,\n        SEMATTRS_NET_HOST_NAME,\n        SEMATTRS_NET_HOST_PORT,\n        SEMATTRS_NET_PEER_PORT,\n        SEMATTRS_HTTP_CLIENT_IP,\n        SEMATTRS_ENDUSER_ID,\n        HTTP_DOT + \"status_text\",\n\n        // http Semabtic conventions\n        ATTR_CLIENT_ADDRESS,\n        ATTR_CLIENT_PORT,\n        ATTR_SERVER_ADDRESS,\n        ATTR_SERVER_PORT,\n        ATTR_URL_FULL,\n        ATTR_URL_PATH,\n        ATTR_URL_QUERY,\n        ATTR_URL_SCHEME,\n        ATTR_ERROR_TYPE,\n        ATTR_NETWORK_LOCAL_ADDRESS,\n        ATTR_NETWORK_LOCAL_PORT,\n        ATTR_NETWORK_PROTOCOL_NAME,\n        ATTR_NETWORK_PEER_ADDRESS,\n        ATTR_NETWORK_PEER_PORT,\n        ATTR_NETWORK_PROTOCOL_VERSION,\n        ATTR_NETWORK_TRANSPORT,\n        ATTR_USER_AGENT_ORIGINAL,\n        ATTR_HTTP_REQUEST_METHOD,\n        ATTR_HTTP_RESPONSE_STATUS_CODE,\n        ATTR_EXCEPTION_TYPE,\n        ATTR_EXCEPTION_MESSAGE,\n        ATTR_EXCEPTION_STACKTRACE,\n        EXP_ATTR_ENDUSER_ID,\n        EXP_ATTR_ENDUSER_PSEUDO_ID,\n        EXP_ATTR_SYNTHETIC_TYPE,\n\n        // Azure SDK attributes are not included as they are not part of the span attributes\n        AzNamespace,\n        AzResourceNamespace,\n        \"az.client_request_id\",\n        \"azure.client.id\",\n        \"az.service_request_id\",\n        \"azure.service.request.id\"\n\n    ];\n}\n\nfunction _applyExtValue<V = string>(ext: any, extName: any, name: string, value: V, overwriteExt: boolean ) {\n    if (isString(value) || isNumber(value) || isBoolean(value)) {\n        let target = ext[extName] = ext[extName] || {};\n        _applyValue(target, name, value, overwriteExt);\n    }\n}\n\nfunction _applyValue<V = string>(target: any, name: string, value: V, overwriteTarget: boolean ) {\n    if (target) {\n        if (isString(value) || isNumber(value) || isBoolean(value)) {\n            let targetValue = target[name];\n            if (!overwriteTarget && (targetValue || isString(targetValue) || isNumber(targetValue) || isBoolean(targetValue))) {\n                value = targetValue;\n            }\n\n            target[name] = value;\n        }\n    }\n\n    return target;\n}\n\nfunction _populateExtensionsFromSpan(telemetryItem: IExtendedTelemetryItem, span: IReadableSpan, container: IAttributeContainer): void {\n    let ext = telemetryItem.ext = telemetryItem.ext || {};\n\n    // Map OpenTelemetry enduser attributes to Application Insights user attributes\n    const endUserId = container.get(ATTR_ENDUSER_ID);\n    if (endUserId) {\n        _applyExtValue(ext, \"user\", \"authId\", asString(endUserId), false);\n    }\n\n    const endUserPseudoId = container.get(ATTR_ENDUSER_PSEUDO_ID);\n    if (endUserPseudoId) {\n        _applyExtValue(ext, \"user\", \"id\", asString(endUserPseudoId), false);\n    }\n}\n\n/**\n * Check to see if the key is in the list of known properties to ignore (exclude)\n * from part C properties population.\n * @param key - the property key to check\n * @param contextKeys - The current context keys\n * @returns true if the key should be ignored, false otherwise\n */\nfunction _isIgnorePartCKey(key: string): boolean {\n    let result = false;\n\n    if (arrIncludes(_ignoreSemanticValues.v, key)) {\n        // The key is in set of known keys to ignore\n        result = true;\n    } else if (strStartsWith(key, \"microsoft.\")) {\n        // Ignoring all ALL keys starting with \"microsoft.\"\n        result = true;\n    }\n\n    return result;\n}\n\nfunction _populatePartC(item: IExtendedTelemetryItem, container: IAttributeContainer): void {\n    if (container) {\n        let partC = item.data = (item.data || {});\n\n        _applyValue(partC, \"httpHost\", getHttpHost(container), false);\n        _applyValue(partC, \"httpScheme\", getHttpScheme(container), false);\n        _applyValue(partC, \"httpClientIp\", getHttpClientIp(container), false);\n        _applyValue(partC, \"httpUserAgent\", getUserAgent(container), false);\n        _applyValue(partC, \"httpRoute\", container.get(SEMATTRS_HTTP_ROUTE), false);\n\n        _applyValue(partC, \"netPeerName\", container.get(SEMATTRS_NET_PEER_NAME), false);\n        _applyValue(partC, \"netPeerPort\", container.get(SEMATTRS_NET_PEER_PORT), false);\n        _applyValue(partC, \"netPeerIp\", container.get(SEMATTRS_NET_PEER_IP), false);\n        _applyValue(partC, \"peerService\", container.get(\"service.name\") || container.get(SEMATTRS_PEER_SERVICE), false);\n\n        let syntheticSource = getSyntheticType(container);\n        if (!!syntheticSource) {\n            _applyValue(partC, \"userAgentSyntheticType\", syntheticSource, false);\n        }\n\n        let nav = getNavigator();\n        if (nav && nav.userAgent) {\n            _applyValue(partC, \"userAgentOriginal\", nav.userAgent, false);\n        }\n\n        // Azure SDK fields\n        _applyValue(partC, \"azureClientRequestId\", container.get(\"azure.client.id\") || container.get(\"az.client_request_id\"), false);\n        _applyValue(partC, \"azureServiceRequestId\", container.get(\"azure.service.request.id\") || container.get(\"az.service_request_id\"), false);\n\n\n        let sampleRate = container.get(\"microsoft.sample_rate\");\n        if (!isNullOrUndefined(sampleRate)) {\n            _applyValue(partC, \"sampleRate\", sampleRate, false);\n        }\n\n        container.forEach((key: string, value) => {\n            // Avoid duplication ignoring fields already mapped.\n            if (!_isIgnorePartCKey(key)) {\n                partC[key] = value;\n            }\n        });\n    }\n}\n\nfunction _populateHttpProperties(otelSpanTelemetry: IMsWebSpanTelemetry, container: IAttributeContainer, httpMethod: OTelAttributeValue | undefined, config: IConfiguration): void {\n    if (httpMethod) {\n        // Step the HTTP method\n        _applyValue(otelSpanTelemetry, \"httpMethod\", httpMethod, false);\n\n        // HTTP Dependency\n        let httpUrl = getHttpUrl(container);\n        if (httpUrl) {\n            try {\n                // Remove default port\n                const res = PORT_REGEX.v.exec(asString(httpUrl));\n                if (res !== null) {\n                    const protocol = res[1];\n                    const port = res[3];\n                    if (\n                        (protocol === \"https\" && port === \":443\") ||\n                        (protocol === \"http\" && port === \":80\")\n                    ) {\n                        // Drop port\n                        httpUrl = res[1] + res[2] + res[4];\n                    }\n                }\n            } catch {\n                /* no-op */\n            }\n\n            _applyValue(otelSpanTelemetry, \"httpUrl\", fieldRedaction(asString(httpUrl), config), false);\n        }\n\n        const httpStatusCode = getHttpStatusCode(container);\n        if (httpStatusCode) {\n            _applyValue(otelSpanTelemetry, \"httpStatusCode\", httpStatusCode, false);\n        }\n    }\n}\n\nfunction _populateDbProperties(otelSpanTelemetry: IMsWebSpanTelemetry, container: IAttributeContainer, dbSystem: OTelAttributeValue | undefined): void {\n    if (dbSystem) {\n        _applyValue(otelSpanTelemetry, \"dbSystem\", dbSystem, false);\n\n        // Set the statement\n        _applyValue(otelSpanTelemetry, \"dbStatement\", container.get(SEMATTRS_DB_STATEMENT) || container.get(SEMATTRS_DB_OPERATION), false);\n        _applyValue(otelSpanTelemetry, \"dbName\", container.get(SEMATTRS_DB_NAME) || dbSystem || \"<undefined>\", false);\n    }\n}\n\nfunction _populateRpcDependencyProperties(otelSpanTelemetry: IMsWebSpanTelemetry, container: IAttributeContainer, rpcSystem: OTelAttributeValue | undefined): void {\n    if (rpcSystem) {\n        _applyValue(otelSpanTelemetry, \"rpcSystem\", strLower(rpcSystem), false);\n        _applyValue(otelSpanTelemetry, \"rpcGrpcStatusCode\", container.get(SEMATTRS_RPC_GRPC_STATUS_CODE), false);\n    }\n}\n\nfunction _createOTelSpanTelemetryItem(core: IAppInsightsCore, span: IReadableSpan): IExtendedTelemetryItem {\n    let container = span.attribContainer || createAttributeContainer(span.attributes);\n    let spanCtx = span.spanContext();\n\n    let statusCode = span.status ? span.status.code : eOTelSpanStatusCode.UNSET;\n\n    let spanTelemetry: IMsWebSpanTelemetry = {\n        name: span.name, // Default\n        kind: span.kind,\n        startTime: toISOString(new Date(hrTimeToMilliseconds(span.startTime))),\n        success: statusCode !== eOTelSpanStatusCode.UNSET ? statusCode !== eOTelSpanStatusCode.ERROR : (Number(getHttpStatusCode(container)) || 0) < 400,\n        duration: hrTimeToMilliseconds(span.duration)\n        //azureResourceProvider: undefined, // Not currently supported\n        //links: UNDEFINED_VALUE,         // Not currently supported\n    };\n\n    // Set the parentId if available\n    let parentCtx = span.parentSpanContext || (spanCtx ? spanCtx.parentCtx : null);\n    _applyValue(spanTelemetry, \"parentId\", span.parentSpanId || (parentCtx ? parentCtx.spanId : null), false);\n\n    if (spanCtx) {\n        let traceState = spanCtx.traceState;\n        if (traceState && !traceState.isEmpty) {\n            _applyValue(spanTelemetry, \"traceState\", traceState.hdrs(1)[0], false);\n        }\n    }\n\n    _populateHttpProperties(spanTelemetry, container, getHttpMethod(container), core.config);\n    _populateDbProperties(spanTelemetry, container, container.get(SEMATTRS_DB_SYSTEM));\n    _populateRpcDependencyProperties(spanTelemetry, container, container.get(SEMATTRS_RPC_SYSTEM));\n\n    _applyValue(spanTelemetry, \"azureResourceProvider\", container.get(AzResourceNamespace) || container.get(AzNamespace), false);\n\n    return _createTelemetryItem<IMsWebSpanTelemetry>(spanTelemetry, span, \"OTelSpan\", \"Ms.Web.Span\");\n}\n\nfunction _createTelemetryItem<T>(item: T, span: IReadableSpan, baseType: string, eventName: string): IExtendedTelemetryItem {\n\n    eventName = eventName || STR_NOT_SPECIFIED;\n\n    if (isNullOrUndefined(item) ||\n        isNullOrUndefined(baseType) ||\n        isNullOrUndefined(eventName)) {\n        throwError(\"Input doesn't contain all required fields\");\n    }\n    \n    let iKey = \"\";\n    if ((item as any).iKey) {\n        iKey = (item as any).iKey;\n        delete (item as any).iKey;\n    }\n\n    let telemetryItem: IExtendedTelemetryItem = {\n        name: eventName,\n        time: toISOString(span.endTime ? new Date(hrTimeToMilliseconds(span.endTime)) : new Date()),\n        iKey: iKey,                 // this will be set in TelemetryContext\n        ext: {},                    // part A\n        baseType,\n        baseData: item as any,      // Part B\n        data: {}                    // part C\n    };\n\n    return telemetryItem;\n}\n\n/**\n * Create an extended common schema telemetry item from the provided span\n * @param core - The app insights core instance\n * @param span - The span to create the telemetry item from\n * @returns A new extended telemetry item or null if the span kind is not supported\n */\nexport function createExtendedTelemetryItemFromSpan(core: IAppInsightsCore, span: IReadableSpan): IExtendedTelemetryItem | null {\n    let telemetryItem: IExtendedTelemetryItem  = _createOTelSpanTelemetryItem(core, span);\n    let container = span.attribContainer || createAttributeContainer(span.attributes);\n\n    if (telemetryItem) {\n        // Set the Span common schema fields\n\n        // Set start time for the telemetry item from the event, not the time it is being processed (the default)\n        // The channel envelope creator uses this value when creating the envelope only when defined, otherwise it\n        // uses the time when the item is being processed\n        let partB = telemetryItem.baseData = telemetryItem.baseData || {};\n        partB.startTime = new Date(hrTimeToMilliseconds(span.startTime));\n        \n        let spanContext = span.spanContext();\n        if (spanContext) {\n            // Add dt extension to the telemetry item\n            let ext = telemetryItem.ext = telemetryItem.ext || {};\n            let dt = ext[\"dt\"] = ext[\"dt\"] || {};\n\n            // Don't overwrite any existing values\n            _applyValue(dt, \"spanId\", spanContext.spanId, false);\n            _applyValue(dt, \"traceId\", spanContext.traceId, false);\n            _applyValue(dt, \"traceFlags\", spanContext.traceFlags, false);\n        }\n\n        _populateExtensionsFromSpan(telemetryItem, span, container);\n        _populatePartC(telemetryItem, container);\n\n        // Azure SDK\n    }\n\n    return telemetryItem;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/ext/extUtils.ts",
    "content": "/**\n* Utils.ts\n* @author  Abhilash Panwar (abpanwar) Hector Hernandez (hectorh)\n* @copyright Microsoft 2018\n* File containing utility functions.\n*/\nimport {\n    arrForEach, getInst as getGlobalInst, getNavigator, hasDocument, hasWindow, isArray, isBoolean, isNullOrUndefined, isNumber, isObject,\n    isString, isUndefined, objForEachKey, perfNow, strIndexOf, strLeft\n} from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { EventLatency, EventLatencyValue, FieldValueSanitizerType, GuidStyle, eEventPropertyType, eValueKind } from \"../enums/ext/Enums\";\nimport { ICookieMgr } from \"../interfaces/ai/ICookieMgr\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { IEventProperty, IExtendedTelemetryItem } from \"../interfaces/ext/DataModels\";\nimport { newGuid } from \"../utils/CoreUtils\";\nimport { isReactNative } from \"../utils/EnvUtils\";\n\n/**\n * Identifies the version for the extended SDK\n */\nexport const ExtVersion = \"#extVersion#\";\n\n/**\n * Identifies the full version for the extended SDK\n */\nexport const ExtFullVersionString = \"1DS-Web-JS-\" + ExtVersion;\n\n/**\n * Identifies the version for the extended SDK (legacy constant)\n * @deprecated Use {@link ExtVersion} instead\n */\nexport const Version = ExtVersion;\n\n/**\n * Identifies the full version for the extended SDK (legacy constant)\n * @deprecated Use {@link ExtFullVersionString} instead\n */\nexport const FullVersionString = ExtFullVersionString;\n\nconst ObjHasOwnProperty = Object.prototype.hasOwnProperty;\n\n// Defining here so we don't need to take (import) the ApplicationInsights Common module\nconst strDisabledPropertyName: string = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\nconst strWithCredentials: string = \"withCredentials\";\nconst strTimeout: string = \"timeout\";\n\n// If value is array just get the type for the first element\nconst _fieldTypeEventPropMap = {\n    [FieldValueSanitizerType.NotSet]: eEventPropertyType.Unspecified,\n    [FieldValueSanitizerType.Number]: eEventPropertyType.Double,\n    [FieldValueSanitizerType.String]: eEventPropertyType.String,\n    [FieldValueSanitizerType.Boolean]: eEventPropertyType.Bool,\n    [FieldValueSanitizerType.Array | FieldValueSanitizerType.Number]: eEventPropertyType.Double,\n    [FieldValueSanitizerType.Array | FieldValueSanitizerType.String]: eEventPropertyType.String,\n    [FieldValueSanitizerType.Array | FieldValueSanitizerType.Boolean]: eEventPropertyType.Bool\n};\n\n/**\n * @ignore\n */\n// let _uaDisallowsSameSiteNone = null;\n\nvar uInt8ArraySupported: boolean | null = (/* #__PURE__*/ null);\n// var _areCookiesAvailable: boolean | undefined;\n\n/**\n * Checks if document object is available\n */\nexport const isDocumentObjectAvailable: boolean = (/* #__PURE__*/ hasDocument());\n\n/**\n * Checks if window object is available\n */\nexport const isWindowObjectAvailable: boolean = (/* #__PURE__*/ hasWindow());\n\n/**\n * Checks if value is assigned to the given param.\n * @param value - The token from which the tenant id is to be extracted.\n * @returns True/false denoting if value is assigned to the param.\n */\nexport function isValueAssigned(value: any) {\n    /// <summary> takes a value and checks for undefined, null and empty string </summary>\n    /// <param type=\"any\"> value to be tested </param>\n    /// <returns> true if value is null undefined or emptyString </returns>\n    return !(value === STR_EMPTY || isNullOrUndefined(value));\n}\n\n/**\n * Gets the tenant id from the tenant token.\n * @param apiKey - The token from which the tenant id is to be extracted.\n * @returns The tenant id.\n */\nexport function getTenantId(apiKey: string | undefined): string {\n    if (apiKey) {\n        let indexTenantId = strIndexOf(apiKey, \"-\");\n        if (indexTenantId > -1) {\n            return strLeft(apiKey, indexTenantId);\n        }\n    }\n    return STR_EMPTY;\n}\n\n/**\n * Checks if Uint8Array are available in the current environment. Safari and Firefox along with\n * ReactNative are known to not support Uint8Array properly.\n * @returns True if available, false otherwise.\n */\nexport function isUint8ArrayAvailable(): boolean {\n    if (uInt8ArraySupported === null) {\n        uInt8ArraySupported = !isUndefined(Uint8Array) && !isSafariOrFirefox() && !isReactNative();\n    }\n    return uInt8ArraySupported;\n}\n\n/**\n * Checks if the value is a valid EventLatency.\n * @param value - The value that needs to be checked.\n * @returns True if the value is in AWTEventLatency, false otherwise.\n */\nexport function isLatency(value: EventLatency | undefined): boolean {\n    if (value && isNumber(value) && value >= EventLatencyValue.Normal && value <= EventLatencyValue.Immediate) {\n        return true;\n    }\n    return false;\n}\n\n/**\n * Sanitizes the Property. It checks the that the property name and value are valid. It also\n * checks/populates the correct type and pii of the property value.\n * @param name - property name                          - The property name.\n * @param property - The property value or an IEventProperty containing value,\n * type ,pii and customer content.\n * @returns IEventProperty containing valid name, value, pii and type or null if invalid.\n */\nexport function sanitizeProperty(name: string,\n    property: string | number | boolean | string[] | number[] | boolean[] | object | IEventProperty,\n    stringifyObjects?: boolean): IEventProperty | null {\n    // Check that property is valid\n    if ((!property && !isValueAssigned(property)) || typeof name !== \"string\") {\n        return null;\n    }\n\n    // Perf optimization -- only need to get the type once not multiple times\n    let propType = typeof property;\n\n    // If the property isn't IEventProperty (and is either string, number, boolean or array), convert it into one.\n    if (propType === \"string\" || propType === \"number\" || propType === \"boolean\" || isArray(property)) {\n        property = ({ value: property } as IEventProperty);\n    } else if (propType === \"object\" && !ObjHasOwnProperty.call(property, \"value\")) {\n        property = ({ value: stringifyObjects ? JSON.stringify(property) : property } as IEventProperty);\n    } else if (isNullOrUndefined((property as IEventProperty).value)\n        || (property as IEventProperty).value === STR_EMPTY || (!isString((property as IEventProperty).value)\n            && !isNumber((property as IEventProperty).value) && !isBoolean((property as IEventProperty).value)\n            && !isArray((property as IEventProperty).value))) {\n        // Since property is IEventProperty, we need to validate its value\n        return null;\n    }\n\n    // We need to check that if the property value is an array, it is valid\n    if (isArray((property as IEventProperty).value) &&\n        !isArrayValid((property as IEventProperty).value as string[] | number[] | boolean[])) {\n        return null;\n    }\n\n    // If either pii or cc is set convert value to string (since only string pii/cc is allowed).\n    // If the value is a complex type like an array that can't be converted to string we will drop\n    // the property.\n    if (!isNullOrUndefined((property as IEventProperty).kind)) {\n        if (isArray((property as IEventProperty).value) || !isValueKind((property as IEventProperty).kind)) {\n            return null;\n        }\n\n        (property as IEventProperty).value = (property as IEventProperty).value.toString();\n    }\n\n    return (property as IEventProperty);\n}\n\nexport function getCommonSchemaMetaData(value: string | boolean | number | string[] | number[] | boolean[] | undefined, kind: number | undefined, type?: number | undefined): number {\n    let encodedTypeValue = -1;\n\n    if (!isUndefined(value)) {\n        if (kind > 0) {\n            if (kind === eValueKind.CustomerContent_GenericContent) {\n                // encode customer content. Value can only be string. bit 13-16 are for cc\n                encodedTypeValue = (1 << 13);\n            } else if (kind <= 13) {\n                // encode PII. Value can only be string. bits 5-12 are for Pii\n                encodedTypeValue = (kind << 5);\n            }\n        }\n\n        // isDataType checks that the \"type\" is a number so we don't need to check for undefined\n        if (isDataType(type)) {\n            // Data Type is provided and valid, so use that\n            if (encodedTypeValue === -1) {\n                // Don't return -1\n                encodedTypeValue = 0;\n            }\n\n            encodedTypeValue |= type;\n        } else {\n            let propType = _fieldTypeEventPropMap[getFieldValueType(value)] || -1;\n\n            if (encodedTypeValue !== -1 && propType !== -1) {\n                // pii exists so we must return correct type\n                encodedTypeValue |= propType;\n            } else if (propType === eEventPropertyType.Double) {\n                encodedTypeValue = propType;\n            }\n        }\n    }\n\n    return encodedTypeValue;\n}\n\n/**\n * Helper to get and decode the cookie value using decodeURIComponent, this is for historical\n * backward compatibility where the document.cookie value was decoded before parsing.\n * @param cookieMgr - The cookie manager to use\n * @param name - The name of the cookie to get\n * @param decode - A flag to indicate whether the cookie value should be decoded\n * @returns The decoded cookie value (if available) otherwise an empty string.\n */\nexport function getCookieValue(cookieMgr: ICookieMgr, name: string, decode: boolean = true): string {\n    let cookieValue: string;\n    if (cookieMgr) {\n        cookieValue = cookieMgr.get(name);\n        if (decode && cookieValue && decodeURIComponent) {\n            cookieValue = decodeURIComponent(cookieValue);\n        }\n    }\n\n    return cookieValue || STR_EMPTY;\n}\n\n/**\n * Create a new guid.\n * @param style - The style of guid to generated, defaults to Digits\n * Digits (Default) : 32 digits separated by hyphens: 00000000-0000-0000-0000-000000000000\n * Braces - 32 digits separated by hyphens, enclosed in braces: \\{00000000-0000-0000-0000-000000000000\\}\n * Parentheses - 32 digits separated by hyphens, enclosed in parentheses: (00000000-0000-0000-0000-000000000000)\n * Numeric - 32 digits: 00000000000000000000000000000000\n */\nexport function createGuid(style: GuidStyle = GuidStyle.Digits): string {\n    let theGuid = newGuid();\n    if (style === GuidStyle.Braces) {\n        theGuid = \"{\" + theGuid + \"}\";\n    } else if (style === GuidStyle.Parentheses) {\n        theGuid = \"(\" + theGuid + \")\";\n    } else if (style === GuidStyle.Numeric) {\n        theGuid = theGuid.replace(/-/g, STR_EMPTY);\n    }\n\n    return theGuid;\n}\n\n/**\n * Pass in the objects to merge as arguments.\n * @param obj1 - object to merge.  Set this argument to 'true' for a deep extend.\n * @param obj2 - object to merge.\n * @param obj3 - object to merge.\n * @param obj4 - object to merge.\n * @param obj5 - object to merge.\n * @returns The extended object.\n */\nexport function extend(obj?: any, obj2?: any, obj3?: any, obj4?: any, obj5?: any): any {\n    // Variables\n    var extended = {};\n    var deep = false;\n    var i = 0;\n    var length = arguments.length;\n    var theArgs = arguments;\n\n    // Check if a deep merge\n    if (isBoolean(theArgs[0])) {\n        deep = theArgs[0];\n        i++;\n    }\n\n    // Loop through each object and conduct a merge\n    for (; i < length; i++) {\n        var obj = theArgs[i];\n        objForEachKey(obj, (prop, value) => {\n            // If deep merge and property is an object, merge properties\n            if (deep && value && isObject(value)) {\n                if (isArray(value)) {\n                    extended[prop] = extended[prop] || [];\n                    arrForEach(value, (arrayValue, arrayIndex) => {\n                        if (arrayValue && isObject(arrayValue)) {\n                            extended[prop][arrayIndex] = extend(true, extended[prop][arrayIndex], arrayValue);\n                        } else {\n                            extended[prop][arrayIndex] = arrayValue;\n                        }\n                    });\n                } else {\n                    extended[prop] = extend(true, extended[prop], value);\n                }\n            } else {\n                extended[prop] = value;\n            }\n        });\n    }\n\n    return extended;\n}\n\nexport let getTime = perfNow;\n\nexport function isValueKind(value: number | undefined): boolean {\n    // Always assume that it's a number (no type checking) for performance as this is used during the JSON serialization\n    if (value === eValueKind.NotSet || ((value > eValueKind.NotSet && value <= eValueKind.Pii_IPV4AddressLegacy) || value === eValueKind.CustomerContent_GenericContent)) {\n        return true;\n    }\n\n    return false;\n}\n\nfunction isDataType(value: number): boolean {\n    // Remark: 0 returns false, but it doesn't affect encoding anyways\n    // Always assume that it's a number (no type checking) for performance as this is used during the JSON serialization\n    if (value >= 0 && value <= 9) {\n        return true;\n    }\n    return false;\n}\n\nfunction isSafariOrFirefox(): boolean {\n    var nav = getNavigator();\n    // If non-browser navigator will be undefined\n    if (!isUndefined(nav) && nav.userAgent) {\n        var ua = nav.userAgent.toLowerCase();\n        if ((ua.indexOf(\"safari\") >= 0 || ua.indexOf(\"firefox\") >= 0) && ua.indexOf(\"chrome\") < 0) {\n            return true;\n        }\n    }\n    return false;\n}\n\nexport function isArrayValid(value: any[]): boolean {\n    return value.length > 0;\n}\n\nexport function setProcessTelemetryTimings(event: ITelemetryItem, identifier: string): void {\n    var evt = event as IExtendedTelemetryItem;\n    evt.timings = evt.timings || {};\n    evt.timings.processTelemetryStart = evt.timings.processTelemetryStart || {};\n    evt.timings.processTelemetryStart[identifier] = getTime();\n}\n\n/**\n * Returns a bitwise value for the FieldValueSanitizerType enum representing the decoded type of the passed value\n * @param value - The value to determine the type\n */\nexport function getFieldValueType(value: any): FieldValueSanitizerType {\n    let theType: FieldValueSanitizerType = FieldValueSanitizerType.NotSet;\n\n    if (value !== null && value !== undefined) {\n        let objType = typeof value;\n        if (objType === \"string\") {\n            theType = FieldValueSanitizerType.String;\n        } else if (objType === \"number\") {\n            theType = FieldValueSanitizerType.Number;\n        } else if (objType === \"boolean\") {\n            theType = FieldValueSanitizerType.Boolean;\n        } else if (objType === \"object\") {\n            theType = FieldValueSanitizerType.Object;\n            if (isArray(value)) {\n                theType = FieldValueSanitizerType.Array;\n                if (value.length > 0) {\n                    // Empty arrays are not supported and are considered to be the same as null\n                    theType |= getFieldValueType(value[0]);\n                }\n            } else if (ObjHasOwnProperty.call(value, \"value\")) {\n                // Looks like an IEventProperty\n                theType = FieldValueSanitizerType.EventProperty | getFieldValueType(value.value);\n            }\n        }\n    }\n\n    return theType;\n}\n\n/**\n * Helper to identify whether we are running in a chromium based browser environment\n */\nexport function isChromium() {\n    return !!getGlobalInst(\"chrome\");\n}\n\n/**\n * Create and open an XMLHttpRequest object\n * @param method - The request method\n * @param urlString - The url\n * @param withCredentials - Option flag indicating that credentials should be sent\n * @param disabled - Optional flag indicating that the XHR object should be marked as disabled and not tracked (default is false)\n * @param isSync - Optional flag indicating if the instance should be a synchronous request (defaults to false)\n * @param timeout - Optional value identifying the timeout value that should be assigned to the XHR request\n * @returns A new opened XHR request\n */\nexport function openXhr(method: string, urlString: string, withCredentials?: boolean, disabled: boolean = false, isSync: boolean = false, timeout?: number) {\n\n    function _wrapSetXhrProp<T>(xhr: XMLHttpRequest, prop: string, value: T) {\n        try {\n            xhr[prop] = value;\n        } catch (e) {\n            // - Wrapping as depending on the environment setting the property may fail (non-terminally)\n        }\n    }\n\n    let xhr = new XMLHttpRequest();\n\n    if (disabled) {\n        // Tag the instance so it's not tracked (trackDependency)\n        // If the environment has locked down the XMLHttpRequest (preventExtensions and/or freeze), this would\n        // cause the request to fail and we no telemetry would be sent\n        _wrapSetXhrProp(xhr, strDisabledPropertyName, disabled);\n    }\n\n    if (withCredentials) {\n        // Some libraries require that the withCredentials flag is set \"before\" open and\n        // - Wrapping as IE 10 has started throwing when setting before open\n        _wrapSetXhrProp(xhr, strWithCredentials, withCredentials);\n    }\n\n    xhr.open(method, urlString, !isSync);\n\n    if (withCredentials) {\n        // withCredentials should be set AFTER open (https://xhr.spec.whatwg.org/#the-withcredentials-attribute)\n        // And older firefox instances from 11+ will throw for sync events (current versions don't) which happens during unload processing\n        _wrapSetXhrProp(xhr, strWithCredentials, withCredentials);\n    }\n\n    // Only set the timeout for asynchronous requests as\n    // \"Timeout shouldn't be used for synchronous XMLHttpRequests requests used in a document environment or it will throw an InvalidAccessError exception.\"\"\n    // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout\n    if (!isSync && timeout) {\n        _wrapSetXhrProp(xhr, strTimeout, timeout);\n    }\n\n    return xhr;\n}\n\n/**\n * Check to see if the value is \\> 0\n * @param value - The value to check\n * @returns true if \\> 0 otherwise false\n */\nexport function isGreaterThanZero(value: number) {\n    return value > 0;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/index.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport { IConfiguration } from \"./interfaces/ai/IConfiguration\";\nexport { IChannelControls, MinChannelPriorty, IInternalOfflineSupport } from \"./interfaces/ai/IChannelControls\";\nexport { IChannelControlsHost } from \"./interfaces/ai/IChannelControlsHost\";\nexport { ITelemetryPlugin, IPlugin } from \"./interfaces/ai/ITelemetryPlugin\";\nexport { IExceptionConfig } from \"./interfaces/ai/IExceptionConfig\";\nexport { IAppInsightsCore, ILoadedPlugin } from \"./interfaces/ai/IAppInsightsCore\";\nexport { ITelemetryItem, ICustomProperties, Tags } from \"./interfaces/ai/ITelemetryItem\";\nexport { IBaseProcessingContext, IProcessTelemetryContext, IProcessTelemetryUnloadContext, IProcessTelemetryUpdateContext } from \"./interfaces/ai/IProcessTelemetryContext\";\nexport { INotificationListener } from \"./interfaces/ai/INotificationListener\";\nexport { ITelemetryPluginChain } from \"./interfaces/ai/ITelemetryPluginChain\";\nexport { IDiagnosticLogger } from \"./interfaces/ai/IDiagnosticLogger\";\nexport { InstrumentorHooksCallback, IInstrumentHooksCallbacks, IInstrumentHooks, IInstrumentHook, IInstrumentCallDetails } from \"./interfaces/ai/IInstrumentHooks\";\nexport { IUnloadableComponent } from \"./interfaces/ai/IUnloadableComponent\";\nexport { IPayloadData, SendPOSTFunction, IXHROverride, OnCompleteCallback } from \"./interfaces/ai/IXHROverride\";\nexport { IUnloadHook, ILegacyUnloadHook } from \"./interfaces/ai/IUnloadHook\";\nexport { eEventsDiscardedReason, EventsDiscardedReason, eBatchDiscardedReason, BatchDiscardedReason } from \"./enums/ai/EventsDiscardedReason\";\nexport { eDependencyTypes, DependencyTypes } from \"./enums/ai/DependencyTypes\";\nexport { SendRequestReason } from \"./enums/ai/SendRequestReason\";\n//export { StatsType, eStatsType } from \"./enums/ai/StatsType\";\nexport { TelemetryUpdateReason } from \"./enums/ai/TelemetryUpdateReason\";\nexport { TelemetryUnloadReason } from \"./enums/ai/TelemetryUnloadReason\";\nexport { eUrlRedactionOptions, UrlRedactionOptions } from \"./enums/ai/UrlRedactionOptions\"\nexport { eActiveStatus, ActiveStatus } from \"./enums/ai/InitActiveStatusEnum\";\nexport { throwAggregationError } from \"./core/AggregationError\";\nexport { AppInsightsCore } from \"./core/AppInsightsCore\";\nexport { BaseTelemetryPlugin } from \"./core/BaseTelemetryPlugin\";\nexport { randomValue, random32, mwcRandomSeed, mwcRandom32, newId } from \"./utils/RandomHelper\";\nexport { Undefined, newGuid, generateW3CId } from \"./utils/CoreUtils\";\nexport { runTargetUnload, doUnloadAll } from \"./core/AsyncUtils\";\nexport {\n    normalizeJsName, toISOString, getExceptionName, strContains, setValue, getSetValue,\n    proxyAssign, proxyFunctions, proxyFunctionAs, createClassFromInterface, optimizeObject,\n    isNotUndefined, isNotNullOrUndefined, objExtend, isFeatureEnabled, getResponseText, formatErrorMessageXdr, formatErrorMessageXhr, prependTransports,\n    openXhr, _appendHeader, _getAllResponseHeaders, setObjStringTag, setProtoTypeName, isTimeSpan\n} from \"./utils/HelperFuncs\";\nexport { parseResponse } from \"./core/ResponseHelpers\";\nexport { IXDomainRequest, IBackendResponse } from \"./interfaces/ai/IXDomainRequest\";\nexport { _ISenderOnComplete, _ISendPostMgrConfig, _ITimeoutOverrideWrapper, _IInternalXhrOverride } from \"./interfaces/ai/ISenderPostManager\";\nexport { SenderPostManager } from \"./core/SenderPostManager\";\n//export { IStatsBeat, IStatsBeatConfig, IStatsBeatKeyMap as IStatsBeatEndpoints, IStatsBeatState} from \"./interfaces/ai/IStatsBeat\";\n//export { IStatsEventData } from \"./interfaces/ai/IStatsEventData\";\n//export { IStatsMgr, IStatsMgrConfig } from \"./interfaces/ai/IStatsMgr\";\n//export { createStatsMgr } from \"./core/StatsBeat\";\nexport {\n    isArray, isTypeof, isUndefined, isNullOrUndefined, isStrictUndefined, objHasOwnProperty as hasOwnProperty, isObject, isFunction,\n    strEndsWith, strStartsWith, isDate, isError, isString, isNumber, isBoolean, arrForEach, arrIndexOf,\n    arrReduce, arrMap, strTrim, objKeys, objCreate, objDefine, objDefineProp, objDefineAccessors, throwError, isSymbol,\n    isNotTruthy, isTruthy, objFreeze, objSeal, objToString, objDeepFreeze as deepFreeze,\n    getInst as getGlobalInst, hasWindow, getWindow, hasDocument, getDocument, hasNavigator, getNavigator, hasHistory,\n    getHistory, dumpObj, asString, objForEachKey, getPerformance, utcNow as dateNow, perfNow,\n    ObjDefinePropDescriptor\n} from \"@nevware21/ts-utils\";\nexport { EnumValue, createEnumStyle, createValueMap } from \"./enums/EnumHelperFuncs\";\nexport {\n    attachEvent, detachEvent, addEventHandler, addEventListeners, addPageUnloadEventListener, addPageHideEventListener, addPageShowEventListener,\n    removeEventHandler, removeEventListeners, removePageUnloadEventListener, removePageHideEventListener, removePageShowEventListener, eventOn, eventOff,\n    mergeEvtNamespace, _IRegisteredEvents, __getRegisteredEvents\n} from \"./internal/EventHelpers\";\n\nexport {\n    getCrypto, getMsCrypto, getLocation, hasJSON, getJSON,\n    isReactNative, getConsole, isIE, getIEVersion, isSafari,\n    setEnableEnvMocks, isBeaconsSupported, isFetchSupported, useXDomainRequest, isXhrSupported,\n    findMetaTag, findNamedServerTiming, sendCustomEvent, dispatchEvent, createCustomDomEvent, fieldRedaction\n} from \"./utils/EnvUtils\";\nexport {\n    getGlobal,\n    strShimPrototype as strPrototype,\n    strShimFunction as strFunction,\n    strShimUndefined as strUndefined,\n    strShimObject as strObject\n} from \"@microsoft/applicationinsights-shims\";\nexport { NotificationManager } from \"./core/NotificationManager\";\nexport { INotificationManager } from \"./interfaces/ai/INotificationManager\";\nexport { IPerfEvent } from \"./interfaces/ai/IPerfEvent\";\nexport { IPerfManager, IPerfManagerProvider } from \"./interfaces/ai/IPerfManager\";\nexport { PerfEvent, PerfManager, doPerf, getGblPerfMgr, setGblPerfMgr } from \"./core/PerfManager\";\nexport { IFeatureOptInDetails, IFeatureOptIn } from \"./interfaces/ai/IFeatureOptIn\";\nexport { FeatureOptInMode, CdnFeatureMode } from \"./enums/ai/FeatureOptInEnums\";\nexport { safeGetLogger, DiagnosticLogger, _InternalLogMessage, _throwInternal, _warnToConsole, _logInternalMessage } from \"./diagnostics/DiagnosticLogger\";\nexport {\n    createProcessTelemetryContext\n    // Explicitly NOT exporting createProcessTelemetryUnloadContext() and createProcessTelemetryUpdateContext() as these should only be created internally\n} from \"./core/ProcessTelemetryContext\";\nexport { initializePlugins, sortPlugins, unloadComponents, createDistributedTraceContext, isDistributedTraceContext } from \"./core/TelemetryHelpers\";\nexport { _eInternalMessageId, _InternalMessageId, LoggingSeverity, eLoggingSeverity } from \"./enums/ai/LoggingEnums\";\nexport { InstrumentProto, InstrumentProtos, InstrumentFunc, InstrumentFuncs, InstrumentEvent } from \"./core/InstrumentHooks\";\nexport { ICookieMgr, ICookieMgrConfig } from \"./interfaces/ai/ICookieMgr\";\nexport {\n    createCookieMgr, safeGetCookieMgr, uaDisallowsSameSiteNone, areCookiesSupported\n} from \"./core/CookieMgr\";\nexport { IDbgExtension } from \"./interfaces/ai/IDbgExtension\";\nexport { getDebugListener, getDebugExt } from \"./core/DbgExtensionUtils\";\nexport { TelemetryInitializerFunction, ITelemetryInitializerHandler, ITelemetryInitializerContainer } from \"./interfaces/ai/ITelemetryInitializers\";\nexport { createUniqueNamespace } from \"./utils/DataCacheHelper\";\nexport { UnloadHandler, IUnloadHandlerContainer, createUnloadHandlerContainer } from \"./core/UnloadHandlerContainer\";\nexport { IUnloadHookContainer, createUnloadHookContainer, _testHookMaxUnloadHooksCb } from \"./core/UnloadHookContainer\";\nexport { ITelemetryUpdateState } from \"./interfaces/ai/ITelemetryUpdateState\";\nexport { ITelemetryUnloadState } from \"./interfaces/ai/ITelemetryUnloadState\";\nexport { IDistributedTraceContext, IDistributedTraceInit } from \"./interfaces/ai/IDistributedTraceContext\";\nexport { ITraceParent } from \"./interfaces/ai/ITraceParent\";\nexport {\n    createTraceParent, parseTraceParent, isValidTraceId, isValidSpanId, isValidTraceParent, isSampledFlag, formatTraceParent, findW3cTraceParent,\n    findAllScripts, INVALID_TRACE_ID, INVALID_SPAN_ID, scriptsInfo\n} from \"./utils/TraceParent\";\n\n// Dynamic Config definitions\nexport { IConfigCheckFn, IConfigDefaultCheck, IConfigDefaults, IConfigSetFn } from \"./interfaces/config/IConfigDefaults\";\nexport { IDynamicConfigHandler } from \"./interfaces/config/IDynamicConfigHandler\";\nexport { IDynamicPropertyHandler } from \"./interfaces/config/IDynamicPropertyHandler\";\nexport { IWatchDetails, IWatcherHandler, WatcherFunction } from \"./interfaces/config/IDynamicWatcher\";\nexport { createDynamicConfig, onConfigChange } from \"./config/DynamicConfig\";\nexport { getDynamicConfigHandler, blockDynamicConversion, forceDynamicConversion } from \"./config/DynamicSupport\";\nexport { cfgDfValidate, cfgDfMerge, cfgDfBoolean, cfgDfFunc, cfgDfString, cfgDfSet, cfgDfBlockPropValue } from \"./config/ConfigDefaultHelpers\";\n\n// W3c TraceState support\nexport { eW3CTraceFlags } from \"./enums/W3CTraceFlags\";\nexport { IW3cTraceState } from \"./interfaces/ai/IW3cTraceState\";\nexport { createW3cTraceState, findW3cTraceState, isW3cTraceState, snapshotW3cTraceState } from \"./telemetry/W3cTraceState\";\n\n// ==========================================================================\n// OpenTelemetry exports\n// ==========================================================================\n\n// OpenTelemetry Trace support\nexport { IOTelTraceState } from \"./interfaces/otel/trace/IOTelTraceState\";\nexport { IOTelSpan } from \"./interfaces/otel/trace/IOTelSpan\";\nexport { IOTelTracer } from \"./interfaces/otel/trace/IOTelTracer\";\nexport { IOTelTracerProvider } from \"./interfaces/otel/trace/IOTelTracerProvider\";\nexport { IOTelTracerOptions } from \"./interfaces/otel/trace/IOTelTracerOptions\";\nexport { ITraceProvider, ITraceHost, ISpanScope } from \"./interfaces/ai/ITraceProvider\";\nexport { IOTelSpanOptions } from \"./interfaces/otel/trace/IOTelSpanOptions\";\nexport { createOTelTraceState, isOTelTraceState } from \"./otel/api/trace/traceState\";\nexport { createSpan } from \"./otel/api/trace/span\";\nexport { createTraceProvider } from \"./otel/api/trace/traceProvider\";\nexport {\n    createNonRecordingSpan, isSpanContextValid,\n    wrapSpanContext, isReadableSpan, isTracingSuppressed, suppressTracing, unsuppressTracing, useSpan, withSpan, startActiveSpan\n} from \"./otel/api/trace/utils\";\n\nexport {\n    AzureMonitorSampleRate, ApplicationInsightsCustomEventName, MicrosoftClientIp, ApplicationInsightsMessageName,\n    ApplicationInsightsExceptionName, ApplicationInsightsPageViewName, ApplicationInsightsAvailabilityName,\n    ApplicationInsightsEventName, ApplicationInsightsBaseType, ApplicationInsightsMessageBaseType,\n    ApplicationInsightsExceptionBaseType, ApplicationInsightsPageViewBaseType, ApplicationInsightsAvailabilityBaseType,\n    ApplicationInsightsEventBaseType, ATTR_ENDUSER_ID, ATTR_ENDUSER_PSEUDO_ID, ATTR_HTTP_ROUTE, SEMATTRS_NET_PEER_IP,\n    SEMATTRS_NET_PEER_NAME, SEMATTRS_NET_HOST_IP, SEMATTRS_PEER_SERVICE, SEMATTRS_HTTP_USER_AGENT, SEMATTRS_HTTP_METHOD,\n    SEMATTRS_HTTP_URL, SEMATTRS_HTTP_STATUS_CODE, SEMATTRS_HTTP_ROUTE, SEMATTRS_HTTP_HOST, SEMATTRS_DB_SYSTEM,\n    SEMATTRS_DB_STATEMENT, SEMATTRS_DB_OPERATION, SEMATTRS_DB_NAME, SEMATTRS_RPC_SYSTEM, SEMATTRS_RPC_GRPC_STATUS_CODE,\n    SEMATTRS_EXCEPTION_TYPE, SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_EXCEPTION_STACKTRACE, SEMATTRS_HTTP_SCHEME,\n    SEMATTRS_HTTP_TARGET, SEMATTRS_HTTP_FLAVOR, SEMATTRS_NET_TRANSPORT, SEMATTRS_NET_HOST_NAME, SEMATTRS_NET_HOST_PORT,\n    SEMATTRS_NET_PEER_PORT, SEMATTRS_HTTP_CLIENT_IP, SEMATTRS_ENDUSER_ID, ATTR_CLIENT_ADDRESS, ATTR_CLIENT_PORT,\n    ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_URL_FULL, ATTR_URL_PATH, ATTR_URL_QUERY, ATTR_URL_SCHEME,\n    ATTR_ERROR_TYPE, ATTR_NETWORK_LOCAL_ADDRESS, ATTR_NETWORK_LOCAL_PORT, ATTR_NETWORK_PROTOCOL_NAME,\n    ATTR_NETWORK_PEER_ADDRESS, ATTR_NETWORK_PEER_PORT, ATTR_NETWORK_PROTOCOL_VERSION, ATTR_NETWORK_TRANSPORT,\n    ATTR_USER_AGENT_ORIGINAL, ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_EXCEPTION_TYPE,\n    ATTR_EXCEPTION_MESSAGE, ATTR_EXCEPTION_STACKTRACE, EXP_ATTR_ENDUSER_ID, EXP_ATTR_ENDUSER_PSEUDO_ID,\n    EXP_ATTR_SYNTHETIC_TYPE, DBSYSTEMVALUES_MONGODB, DBSYSTEMVALUES_COSMOSDB, DBSYSTEMVALUES_MYSQL,\n    DBSYSTEMVALUES_POSTGRESQL, DBSYSTEMVALUES_REDIS, DBSYSTEMVALUES_DB2, DBSYSTEMVALUES_DERBY, DBSYSTEMVALUES_MARIADB,\n    DBSYSTEMVALUES_MSSQL, DBSYSTEMVALUES_ORACLE, DBSYSTEMVALUES_SQLITE, DBSYSTEMVALUES_OTHER_SQL, DBSYSTEMVALUES_HSQLDB,\n    DBSYSTEMVALUES_H2\n} from \"./otel/attribute/SemanticConventions\"\n\n// OpenTelemetry Core API Interfaces\nexport { IOTelApi } from \"./interfaces/otel/IOTelApi\";\nexport { IOTelApiCtx } from \"./interfaces/otel/IOTelApiCtx\";\nexport { IOTelAttributes, OTelAttributeValue, ExtendedOTelAttributeValue } from \"./interfaces/otel/IOTelAttributes\";\nexport { OTelException, IOTelExceptionWithCode, IOTelExceptionWithMessage, IOTelExceptionWithName } from \"./interfaces/IException\";\nexport { IOTelHrTime, OTelTimeInput } from \"./interfaces/IOTelHrTime\";\nexport { createOTelApi } from \"./otel/api/OTelApi\";\n\n// OpenTelemetry Trace Interfaces\nexport { ITraceApi } from \"./interfaces/otel/trace/IOTelTraceApi\";\nexport { IOTelSpanCtx } from \"./interfaces/otel/trace/IOTelSpanCtx\";\nexport { IOTelSpanStatus } from \"./interfaces/otel/trace/IOTelSpanStatus\";\nexport { IReadableSpan } from \"./interfaces/otel/trace/IReadableSpan\";\nexport { IOTelSpanContext } from \"./interfaces/otel/trace/IOTelSpanContext\";\n\n// OpenTelemetry Configuration Interfaces\nexport { IOTelConfig } from \"./interfaces/otel/config/IOTelConfig\";\nexport { IOTelAttributeLimits } from \"./interfaces/otel/config/IOTelAttributeLimits\";\nexport { IOTelErrorHandlers } from \"./interfaces/otel/config/IOTelErrorHandlers\";\nexport { ITraceCfg } from \"./interfaces/otel/config/IOTelTraceCfg\";\n\n// OpenTelemetry Attribute Support\nexport { IAttributeContainer, IAttributeChangeInfo } from \"./interfaces/otel/attribute/IAttributeContainer\";\nexport { eAttributeChangeOp, AttributeChangeOp } from \"./enums/otel/eAttributeChangeOp\";\nexport { createAttributeContainer, addAttributes, isAttributeContainer, createAttributeSnapshot } from \"./otel/attribute/attributeContainer\";\nexport { eAttributeFilter, AttributeFilter } from \"./interfaces/otel/attribute/IAttributeContainer\";\n\n// OpenTelemetry Enums\nexport { eOTelSpanKind, OTelSpanKind } from \"./enums/otel/OTelSpanKind\";\nexport { eOTelSpanStatusCode, OTelSpanStatusCode } from \"./enums/otel/OTelSpanStatus\";\n\n// OpenTelemetry Helper Utilities\nexport {\n    hrTime, hrTimeToTimeStamp, hrTimeDuration, hrTimeToMilliseconds, timeInputToHrTime, millisToHrTime, hrTimeToNanoseconds,\n    addHrTimes, hrTimeToMicroseconds, zeroHrTime, nanosToHrTime, isTimeInput, isTimeInputHrTime\n} from \"./internal/timeHelpers\";\nexport { isAttributeValue, isAttributeKey, sanitizeAttributes } from \"./internal/attributeHelpers\";\nexport {\n    getSyntheticType, isSyntheticSource, serializeAttribute, getUrl, getPeerIp, getHttpMethod, getHttpUrl, getHttpHost, getHttpScheme,\n    getHttpTarget, getNetPeerName, getNetPeerPort, getUserAgent, getLocationIp, getHttpStatusCode, getHttpClientIp,\n    getDependencyTarget, isSqlDB\n} from \"./internal/commonUtils\";\n\n// OpenTelemetry Error Handlers\nexport {\n    handleAttribError, handleSpanError, handleDebug, handleWarn, handleError, handleNotImplemented\n} from \"./internal/handleErrors\";\n\n// OpenTelemetry Error Classes\nexport { OpenTelemetryError, OpenTelemetryErrorConstructor, getOpenTelemetryError, throwOTelError } from \"./otel/api/errors/OTelError\";\nexport { OTelInvalidAttributeError, throwOTelInvalidAttributeError } from \"./otel/api/errors/OTelInvalidAttributeError\";\nexport { OTelSpanError, throwOTelSpanError } from \"./otel/api/errors/OTelSpanError\";\n\n// ========================================\n// Application Insights Common Exports\n// ========================================\n\n// Utility functions\nexport {\n    correlationIdSetPrefix, correlationIdGetPrefix, correlationIdCanIncludeCorrelationHeader,\n    correlationIdGetCorrelationContext, correlationIdGetCorrelationContextValue,\n    dateTimeUtilsNow, dateTimeUtilsDuration, isInternalApplicationInsightsEndpoint,\n    createDistributedTraceContextFromTrace\n} from \"./utils/Util\";\n\nexport { ThrottleMgr } from \"./diagnostics/ThrottleMgr\";\nexport { parseConnectionString, ConnectionStringParser } from \"./telemetry/ConnectionStringParser\";\nexport { ConnectionString } from \"./interfaces/ai/ConnectionString\";\nexport { FieldType } from \"./enums/ai/Enums\";\nexport { IRequestHeaders, RequestHeaders, eRequestHeaders } from \"./telemetry/RequestResponseHeaders\";\nexport {\n    DisabledPropertyName, ProcessLegacy, SampleRate, HttpMethod,\n    DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH, strNotSpecified,\n    ChannelControllerPriority\n} from \"./constants/Constants\";\n\n// Contracts\nexport { IData as AIData } from \"./interfaces/ai/contracts/IData\";\nexport { IBase as AIBase } from \"./interfaces/ai/contracts/IBase\";\nexport { IDomain } from \"./interfaces/ai/contracts/IDomain\";\nexport { ISerializable } from \"./interfaces/ai/telemetry/ISerializable\";\nexport { IEnvelope } from \"./interfaces/ai/telemetry/IEnvelope\";\nexport { IStackFrame } from \"./interfaces/ai/contracts/IStackFrame\";\nexport { IExceptionDetails } from \"./interfaces/ai/contracts/IExceptionDetails\";\nexport { IExceptionData } from \"./interfaces/ai/contracts/IExceptionData\";\nexport { IEventData } from \"./interfaces/ai/contracts/IEventData\";\nexport { IMessageData } from \"./interfaces/ai/contracts/IMessageData\";\nexport { IMetricData } from \"./interfaces/ai/contracts/IMetricData\";\nexport { IDataPoint } from \"./interfaces/ai/contracts/IDataPoint\";\nexport { DataPointType } from \"./interfaces/ai/contracts/DataPointType\";\nexport { IPageViewPerfData } from \"./interfaces/ai/contracts/IPageViewPerfData\";\n\n// Telemetry classes\nexport { Envelope } from \"./telemetry/ai/Common/Envelope\";\nexport { Event } from \"./telemetry/ai/Event\";\nexport { Exception } from \"./telemetry/ai/Exception\";\nexport { Metric } from \"./telemetry/ai/Metric\";\nexport { PageView } from \"./telemetry/ai/PageView\";\nexport { IPageViewData } from \"./interfaces/ai/contracts/IPageViewData\";\nexport { RemoteDependencyData } from \"./telemetry/ai/RemoteDependencyData\";\nexport { IRemoteDependencyData } from \"./interfaces/ai/contracts/IRemoteDependencyData\";\nexport { Trace } from \"./telemetry/ai/Trace\";\nexport { PageViewPerformance } from \"./telemetry/ai/PageViewPerformance\";\nexport { Data } from \"./telemetry/ai/Common/Data\";\nexport { DataPoint } from \"./telemetry/ai/Common/DataPoint\";\n\n// Telemetry interfaces\nexport { IEventTelemetry } from \"./interfaces/ai/IEventTelemetry\";\nexport { ITraceTelemetry } from \"./interfaces/ai/ITraceTelemetry\";\nexport { IMetricTelemetry } from \"./interfaces/ai/IMetricTelemetry\";\nexport { IDependencyTelemetry } from \"./interfaces/ai/IDependencyTelemetry\";\nexport { IExceptionTelemetry, IAutoExceptionTelemetry, IExceptionInternal } from \"./interfaces/ai/IExceptionTelemetry\";\nexport { IPageViewTelemetry, IPageViewTelemetryInternal } from \"./interfaces/ai/IPageViewTelemetry\";\nexport { IPageViewPerformanceTelemetry, IPageViewPerformanceTelemetryInternal } from \"./interfaces/ai/IPageViewPerformanceTelemetry\";\nexport { IRequestTelemetry } from \"./interfaces/ai/IRequestTelemetry\";\n\n// Severity level\nexport { eSeverityLevel, SeverityLevel } from \"./interfaces/ai/contracts/SeverityLevel\";\n\n// Configuration\nexport { IConfig, ConfigurationManager } from \"./interfaces/ai/IConfig\";\nexport { IStorageBuffer } from \"./interfaces/ai/IStorageBuffer\";\nexport { ICorrelationConfig } from \"./interfaces/ai/ICorrelationConfig\";\n\n// Context tags and keys\nexport { IContextTagKeys, ContextTagKeys } from \"./interfaces/ai/contracts/ContextTagKeys\";\nexport { CtxTagKeys, Extensions } from \"./interfaces/ai/PartAExtensions\";\n\n// Data types and envelope types\nexport {\n    EventDataType, ExceptionDataType, MetricDataType, PageViewDataType,\n    PageViewPerformanceDataType, RemoteDependencyDataType, RequestDataType, TraceDataType\n} from \"./telemetry/ai/DataTypes\";\n\nexport {\n    EventEnvelopeType, ExceptionEnvelopeType, MetricEnvelopeType, PageViewEnvelopeType,\n    PageViewPerformanceEnvelopeType, RemoteDependencyEnvelopeType, RequestEnvelopeType, TraceEnvelopeType\n} from \"./telemetry/ai/EnvelopeTypes\";\n\n// Data sanitization\nexport {\n    DataSanitizerValues, dataSanitizeKeyAndAddUniqueness, dataSanitizeKey, dataSanitizeString,\n    dataSanitizeUrl, dataSanitizeMessage, dataSanitizeException, dataSanitizeProperties,\n    dataSanitizeMeasurements, dataSanitizeId, dataSanitizeInput, dsPadNumber\n} from \"./telemetry/ai/Common/DataSanitizer\";\n\n// Telemetry item creator\nexport { TelemetryItemCreator, createTelemetryItem } from \"./telemetry/TelemetryItemCreator\";\n\n// Application Insights interfaces\nexport { IAppInsights } from \"./interfaces/ai/IAppInsights\";\nexport { ITelemetryContext } from \"./interfaces/ai/ITelemetryContext\";\nexport { IPropertiesPlugin } from \"./interfaces/ai/IPropertiesPlugin\";\nexport { IRequestContext } from \"./interfaces/ai/IRequestContext\";\n\n// Context interfaces\nexport { IWeb } from \"./interfaces/ai/context/IWeb\";\nexport { ISession } from \"./interfaces/ai/context/ISession\";\nexport { ISessionManager } from \"./interfaces/ai/context/ISessionManager\";\nexport { IApplication } from \"./interfaces/ai/context/IApplication\";\nexport { IDevice } from \"./interfaces/ai/context/IDevice\";\nexport { IInternal } from \"./interfaces/ai/context/IInternal\";\nexport { ILocation } from \"./interfaces/ai/context/ILocation\";\nexport { ISample } from \"./interfaces/ai/context/ISample\";\nexport { IOperatingSystem } from \"./interfaces/ai/context/IOperatingSystem\";\nexport { IUser, IUserContext } from \"./interfaces/ai/context/IUser\";\nexport { ITelemetryTrace } from \"./interfaces/ai/context/ITelemetryTrace\";\n\n// Enums\nexport { eDistributedTracingModes, DistributedTracingModes, EventPersistence, EventPersistenceValue } from \"./enums/ai/Enums\";\nexport { eTraceHeadersMode } from \"./enums/ai/TraceHeadersMode\";\n\n// Helper functions\nexport { stringToBoolOrDefault, msToTimeSpan, getExtensionByName, isCrossOriginError } from \"./utils/HelperFuncs\";\nexport { createDomEvent } from \"./utils/DomHelperFuncs\";\n\n// Storage helpers\nexport {\n    utlDisableStorage, utlEnableStorage, utlCanUseLocalStorage, utlGetLocalStorage,\n    utlSetLocalStorage, utlRemoveStorage, utlCanUseSessionStorage, utlGetSessionStorageKeys,\n    utlGetSessionStorage, utlSetSessionStorage, utlRemoveSessionStorage, utlSetStoragePrefix\n} from \"./utils/StorageHelperFuncs\";\n\n// URL helpers\nexport {\n    urlParseUrl, urlGetAbsoluteUrl, urlGetPathName, urlGetCompleteUrl,\n    urlParseHost, urlParseFullHost\n} from \"./utils/UrlHelperFuncs\";\n\n// Throttle manager interfaces\nexport {\n    IThrottleLimit, IThrottleInterval, IThrottleMgrConfig,\n    IThrottleLocalStorageObj, IThrottleResult\n} from \"./interfaces/ai/IThrottleMgr\";\n\n// Offline support\nexport {\n    IOfflineListener, createOfflineListener, IOfflineState,\n    eOfflineValue, OfflineCallback\n} from \"./utils/Offline\";\n\n// Plugin identifiers\nexport const PropertiesPluginIdentifier = \"AppInsightsPropertiesPlugin\";\nexport const BreezeChannelIdentifier = \"AppInsightsChannelPlugin\";\nexport const AnalyticsPluginIdentifier = \"ApplicationInsightsAnalytics\";\n\n// ==========================================================================\n// 1DS (OneCollector) exports - merged from @microsoft/1ds-core-js\n// ==========================================================================\n\n// 1DS Enums\nexport {\n    ValueKind, eValueKind,\n    EventLatency, EventLatencyValue,\n    EventPropertyType, eEventPropertyType,\n    EventSendType,\n    TraceLevel, eTraceLevel,\n    _ExtendedInternalMessageId, _eExtendedInternalMessageId,\n    GuidStyle, FieldValueSanitizerType,\n    TransportType\n} from \"./enums/ext/Enums\";\n\n// 1DS Data Models (interfaces)\nexport {\n    IExtendedConfiguration, IPropertyStorageOverride,\n    IEventProperty, IExtendedTelemetryItem, IEventTiming,\n    FieldValueSanitizerFunc, FieldValueSanitizerTypes,\n    IFieldSanitizerDetails, IFieldValueSanitizerProvider, IValueSanitizer\n} from \"./interfaces/ext/DataModels\";\n\n// 1DS Classes\nexport { AppInsightsExtCore } from \"./ext/AppInsightsExtCore\";\nexport { ValueSanitizer } from \"./ext/ValueSanitizer\";\n\n// 1DS Utils\nexport {\n    isValueAssigned, isLatency, isUint8ArrayAvailable, getTenantId, sanitizeProperty,\n    ExtVersion, Version, ExtFullVersionString, FullVersionString, getCommonSchemaMetaData, getCookieValue,\n    extend, createGuid, isDocumentObjectAvailable, isWindowObjectAvailable,\n    setProcessTelemetryTimings, getTime,\n    isArrayValid, isValueKind, getFieldValueType,\n    isChromium, isGreaterThanZero\n} from \"./ext/extUtils\";\n\n// 1DS Span Utils\nexport { createExtendedTelemetryItemFromSpan } from \"./ext/extSpanUtils\";\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/IException.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IOTelExceptionWithCode {\n    code: string | number;\n    name?: string;\n    message?: string;\n    stack?: string;\n}\n\nexport interface IOTelExceptionWithMessage {\n    code?: string | number;\n    message: string;\n    name?: string;\n    stack?: string;\n}\n\nexport interface IOTelExceptionWithName {\n    code?: string | number;\n    message?: string;\n    name: string;\n    stack?: string;\n}\n  \n/**\n * Defines Exception.\n *\n * string or an object with one of (message or name or code) and optional stack\n *\n * @since 3.4.0\n */\nexport type OTelException =\n    | IOTelExceptionWithCode\n    | IOTelExceptionWithMessage\n    | IOTelExceptionWithName\n    | string;\n  "
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/IOTelHrTime.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * High-resolution time represented as a tuple of [seconds, nanoseconds].\n * This is the base type for all OpenTelemetry high-resolution time values.\n *\n * @remarks\n * The first element represents seconds since Unix epoch, and the second element\n * represents nanoseconds (0-999,999,999) within that second.\n *\n * @example\n * ```typescript\n * const hrTime: OTelHrTimeBase = [1609459200, 500000000]; // 2021-01-01 00:00:00.5 UTC\n * ```\n *\n * @since 3.4.0\n */\nexport type OTelHrTimeBase = [number, number];\n\n/**\n * Enhanced high-resolution time interface that extends the base tuple with additional properties.\n * Provides a more structured way to work with high-resolution timestamps.\n *\n * @example\n * ```typescript\n * const hrTime: IOTelHrTime = {\n *   0: 1609459200,     // seconds since Unix epoch\n *   1: 500000000,      // nanoseconds (0-999,999,999)\n * };\n * ```\n *\n * @since 3.4.0\n */\nexport interface IOTelHrTime extends OTelHrTimeBase {\n    /**\n     * Seconds since Unix epoch (January 1, 1970 00:00:00 UTC).\n     * Must be a non-negative integer.\n     */\n    0: number;\n    \n    /**\n     * Nanoseconds within the second specified by index 0.\n     * Must be in the range [0, 999999999].\n     */\n    1: number;\n    \n    /**\n     * Optional total nanoseconds since Unix epoch.\n     * When provided, this should be equivalent to (this[0] * 1e9) + this[1].\n     *\n     * @remarks\n     * This field may be used for more efficient time calculations or when\n     * working with systems that natively use nanosecond timestamps.\n     */\n    // unixNano?: number;\n}\n\n/**\n * Union type representing all valid time input formats accepted by OpenTelemetry APIs.\n *\n * @remarks\n * - `IOTelHrTime`: High-resolution time with nanosecond precision\n * - `number`: Milliseconds since Unix epoch (JavaScript Date.now() format)\n * - `Date`: JavaScript Date object\n *\n * @example\n * ```typescript\n * // All of these are valid time inputs:\n * const hrTime: OTelTimeInput = [1609459200, 500000000];\n * const msTime: OTelTimeInput = Date.now();\n * const dateTime: OTelTimeInput = new Date();\n *\n * span.addEvent(\"event\", {}, hrTime);\n * span.addEvent(\"event\", {}, msTime);\n * span.addEvent(\"event\", {}, dateTime);\n * ```\n *\n * @since 3.4.0\n */\nexport type OTelTimeInput = IOTelHrTime | number | Date;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ConnectionString.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport type ConnectionStringKey = \"authorization\" | \"instrumentationkey\" | \"ingestionendpoint\" | \"location\" | \"endpointsuffix\";\n\nexport type ConnectionString = { [key in ConnectionStringKey]?: string };"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IAppInsights.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ICookieMgr } from \"./ICookieMgr\";\nimport { IEventTelemetry } from \"./IEventTelemetry\";\nimport { IAutoExceptionTelemetry, IExceptionTelemetry } from \"./IExceptionTelemetry\";\nimport { IMetricTelemetry } from \"./IMetricTelemetry\";\nimport { IPageViewPerformanceTelemetry } from \"./IPageViewPerformanceTelemetry\";\nimport { IPageViewTelemetry } from \"./IPageViewTelemetry\";\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { ITraceTelemetry } from \"./ITraceTelemetry\";\n\nexport interface IAppInsights {\n\n    /**\n     * Get the current cookie manager for this instance\n     */\n    getCookieMgr(): ICookieMgr;\n\n    trackEvent(event: IEventTelemetry, customProperties?: {[key: string]: any}): void;\n    trackPageView(pageView: IPageViewTelemetry, customProperties?: { [key: string]: any }): void;\n    trackException(exception: IExceptionTelemetry, customProperties?: {[key: string]: any}): void;\n    _onerror(exception: IAutoExceptionTelemetry): void;\n    trackTrace(trace: ITraceTelemetry, customProperties?: {[key: string]: any}): void;\n    trackMetric(metric: IMetricTelemetry, customProperties?: {[key: string]: any}): void;\n    startTrackPage(name?: string): void;\n    stopTrackPage(name?: string, url?: string, properties?: {[key: string]: string}, measurements?: {[key: string]: number}): void;\n    startTrackEvent(name: string): void;\n    stopTrackEvent(name: string, properties?: {[key: string]: string}, measurements?: {[key: string]: number}): void;\n    addTelemetryInitializer(telemetryInitializer: (item: ITelemetryItem) => boolean | void): void;\n    trackPageViewPerformance(pageViewPerformance: IPageViewPerformanceTelemetry, customProperties?: { [key: string]: any }): void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IAppInsightsCore.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { ICachedValue, ITimerHandler } from \"@nevware21/ts-utils\";\nimport { UnloadHandler } from \"../../core/UnloadHandlerContainer\";\nimport { eActiveStatus } from \"../../enums/ai/InitActiveStatusEnum\";\nimport { SendRequestReason } from \"../../enums/ai/SendRequestReason\";\nimport { WatcherFunction } from \"../config/IDynamicWatcher\";\nimport { IChannelControls } from \"./IChannelControls\";\nimport { IConfiguration } from \"./IConfiguration\";\nimport { ICookieMgr } from \"./ICookieMgr\";\nimport { IDiagnosticLogger } from \"./IDiagnosticLogger\";\nimport { INotificationListener } from \"./INotificationListener\";\nimport { INotificationManager } from \"./INotificationManager\";\nimport { IPerfManagerProvider } from \"./IPerfManager\";\nimport { IProcessTelemetryContext } from \"./IProcessTelemetryContext\";\nimport { ITelemetryInitializerHandler, TelemetryInitializerFunction } from \"./ITelemetryInitializers\";\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { IPlugin, ITelemetryPlugin } from \"./ITelemetryPlugin\";\nimport { ITelemetryUnloadState } from \"./ITelemetryUnloadState\";\nimport { ITraceHost, ITraceProvider } from \"./ITraceProvider\";\nimport { ILegacyUnloadHook, IUnloadHook } from \"./IUnloadHook\";\n\n// import { IStatsBeat, IStatsBeatState } from \"./IStatsBeat\";\n// import { IStatsMgr } from \"./IStatsMgr\";\nexport interface ILoadedPlugin<T extends IPlugin> {\n    plugin: T;\n\n    /**\n     * Identifies whether the plugin is enabled and can process events. This is slightly different from isInitialized as the plugin may be initialized but disabled\n     * via the setEnabled() or it may be a shared plugin which has had it's teardown function called from another instance..\n     * @returns boolean = true if the plugin is in a state where it is operational.\n     */\n    isEnabled: () => boolean;\n\n    /**\n     * You can optionally enable / disable a plugin from processing events.\n     * Setting enabled to true will not necessarily cause the `isEnabled()` to also return true\n     * as the plugin must also have been successfully initialized and not had it's `teardown` method called\n     * (unless it's also been re-initialized)\n     */\n    setEnabled: (isEnabled: boolean) => void;\n\n    remove: (isAsync?: boolean, removeCb?: (removed?: boolean) => void) => void;\n}\n\nexport interface IAppInsightsCore<CfgType extends IConfiguration = IConfiguration> extends IPerfManagerProvider, ITraceHost<CfgType> {\n\n    /**\n     * The current logger instance for this instance.\n     */\n    readonly logger: IDiagnosticLogger;\n\n    /**\n     * An array of the installed plugins that provide a version\n     */\n    readonly pluginVersionStringArr: string[];\n    \n    /**\n     * The formatted string of the installed plugins that contain a version number\n     */\n    readonly pluginVersionString: string;\n \n    /**\n     * Returns a value that indicates whether the instance has already been previously initialized.\n     */\n    isInitialized?: () => boolean;\n\n    /*\n    * Initialization queue. Contains functions to run when appInsights initializes\n    */\n    initialize(config: CfgType, extensions: IPlugin[], logger?: IDiagnosticLogger, notificationManager?: INotificationManager): void;\n\n    /*\n    * Get transmission channels for controlling transmission behavior\n    */\n    getChannels(): IChannelControls[];\n\n    /*\n    * Core track API\n    */\n    track(telemetryItem: ITelemetryItem): void;\n\n    /**\n     * Get the current notification manager\n     */\n    getNotifyMgr(): INotificationManager;\n\n    /**\n     * Get the current cookie manager for this instance\n     */\n    getCookieMgr(): ICookieMgr;\n\n    /**\n     * Set the current cookie manager for this instance\n     * @param cookieMgr - The manager, if set to null/undefined will cause the default to be created\n     */\n    setCookieMgr(cookieMgr: ICookieMgr): void;\n\n    /**\n     * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\n     * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\n     * called.\n     * @param listener - An INotificationListener object.\n     */\n    addNotificationListener?(listener: INotificationListener): void;\n\n    /**\n     * Removes all instances of the listener.\n     * @param listener - INotificationListener to remove.\n     */\n    removeNotificationListener?(listener: INotificationListener): void;\n\n    /**\n     * Add a telemetry processor to decorate or drop telemetry events.\n     * @param telemetryInitializer - The Telemetry Initializer function\n     * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed\n     */\n    addTelemetryInitializer(telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler;\n\n    pollInternalLogs?(eventName?: string): ITimerHandler;\n\n    // /**\n    //  * Get the current stats beat instance for the provided configuration, if enabled.\n    //  * @param statsBeatConfig - The configuration to use to create the stats beat instance.\n    //  * @returns The stats beat instance or null if not available\n    //  */\n    // getStatsBeat?(statsBeatConfig: IStatsBeatState): IStatsBeat;\n\n    // /**\n    //  * Set the stats beat manager instance which will be used to create the stats beat instances\n    //  * using the provided configuration. This is used to provide greater control over the stats beat\n    //  * instance creation and management.\n    //  * @param statsMgrCfg - The configuration to use to create the stats beat instance.\n    //  * @returns The stats beat instance or null if not available\n    //  */\n    // setStatsMgr?(statsMgrCfg?: IStatsMgr): void;\n\n    stopPollingInternalLogs?(): void;\n\n    /**\n     * Return a new instance of the IProcessTelemetryContext for processing events\n     */\n    getProcessTelContext() : IProcessTelemetryContext;\n\n    /**\n     * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered\n     * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous\n     * unload call return `true` stating that all plugins reported that they also unloaded, the recommended\n     * approach is to create a new instance and initialize that instance.\n     * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable\n     * to successfully remove any global references or they may just be completing the unload process asynchronously.\n     * If you pass isAsync as `true` (also the default) and DO NOT pass a callback function then an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the unload is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @param unloadComplete - An optional callback that will be called once the unload has completed\n     * @param cbTimeout - An optional timeout to wait for any flush operations to complete before proceeding with the\n     * unload. Defaults to 5 seconds.\n     * @returns Nothing or if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * which will be resolved once the unload is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will only be returned when no callback is provided and isAsync is true\n     */\n    unload(isAsync?: boolean, unloadComplete?: (unloadState: ITelemetryUnloadState) => void, cbTimeout?: number): void | IPromise<ITelemetryUnloadState>;\n\n    /**\n     * Find and return the (first) plugin with the specified identifier if present\n     */\n    getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T>;\n  \n    /**\n     * Add a new plugin to the installation\n     * @param plugin - The new plugin to add\n     * @param replaceExisting - should any existing plugin be replaced, default is false\n     * @param doAsync - Should the add be performed asynchronously\n     * @param addCb - [Optional] callback to call after the plugin has been added\n     */\n    addPlugin<T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting?: boolean, doAsync?: boolean, addCb?: (added?: boolean) => void): void;\n  \n    /**\n     * Update the configuration used and broadcast the changes to all loaded plugins, this does NOT support updating, adding or removing\n     * any the plugins (extensions or channels). It will notify each plugin (if supported) that the configuration has changed but it will\n     * not remove or add any new plugins, you need to call addPlugin or getPlugin(identifier).remove();\n     * @param newConfig - The new configuration is apply\n     * @param mergeExisting - Should the new configuration merge with the existing or just replace it. Default is to merge.\n     */\n    updateCfg(newConfig: CfgType, mergeExisting?: boolean): void;\n\n    /**\n     * Returns the unique event namespace that should be used when registering events\n     */\n    evtNamespace(): string;\n  \n    /**\n     * Add a handler that will be called when the SDK is being unloaded\n     * @param handler - the handler\n     */\n    addUnloadCb(handler: UnloadHandler): void;\n\n    /**\n     * Add this hook so that it is automatically removed during unloading\n     * @param hooks - The single hook or an array of IInstrumentHook objects\n     */\n    addUnloadHook(hooks: IUnloadHook | IUnloadHook[] | Iterator<IUnloadHook> | ILegacyUnloadHook | ILegacyUnloadHook[] | Iterator<ILegacyUnloadHook>): void;\n\n    /**\n     * Flush and send any batched / cached data immediately\n     * @param async - send data asynchronously when true (defaults to true)\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @param sendReason - specify the reason that you are calling \"flush\" defaults to ManualFlush (1) if not specified\n     * @param cbTimeout - An optional timeout to wait for any flush operations to complete before proceeding with the unload. Defaults to 5 seconds.\n     * @returns - true if the callback will be return after the flush is complete otherwise the caller should assume that any provided callback will never be called\n     */\n    flush(isAsync?: boolean, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason, cbTimeout?: number): boolean | void;\n\n    /**\n     * Set the trace provider for creating spans.\n     * This allows different SKUs to provide their own span implementations.\n     *\n     * @param provider - The trace provider to use for span creation\n     * @since 3.4.0\n     */\n    setTraceProvider(provider: ICachedValue<ITraceProvider>): void;\n\n    /**\n     * Watches and tracks changes for accesses to the current config, and if the accessed config changes the\n     * handler will be recalled.\n     * @returns A watcher handler instance that can be used to remove itself when being unloaded\n     */\n    onCfgChange(handler: WatcherFunction<CfgType>): IUnloadHook;\n\n    /**\n     * Function used to identify the get w parameter used to identify status bit to some channels\n     */\n    getWParam: () => number;\n\n    /**\n     * Watches and tracks status of initialization process\n     * @returns ActiveStatus\n     * @since 3.3.0\n     * If returned status is active, it means initialization process is completed.\n     * If returned status is pending, it means the initialization process is waiting for promieses to be resolved.\n     * If returned status is inactive, it means ikey is invalid or can 't get ikey or enpoint url from promsises.\n     */\n    activeStatus?: () => eActiveStatus | number;\n\n     /**\n     * Set Active Status to pending, which will block the incoming changes until internal promises are resolved\n     * @internal Internal use\n     * @since 3.3.0\n     */\n    _setPendingStatus?: () => void;\n\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IChannelControls.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { SendRequestReason } from \"../../enums/ai/SendRequestReason\";\nimport { IProcessTelemetryUnloadContext } from \"./IProcessTelemetryContext\";\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { ITelemetryPlugin } from \"./ITelemetryPlugin\";\nimport { ITelemetryUnloadState } from \"./ITelemetryUnloadState\";\nimport { IPayloadData } from \"./IXHROverride\";\n\n/**\n * Internal Interface\n */\nexport interface IInternalOfflineSupport {\n\n    /**\n     * Get current endpoint url\n     * @returns endpoint\n     */\n    getUrl: () => string;\n    /**\n     * Create payload data\n     * @returns IPayloadData\n     */\n    createPayload: (data: string | Uint8Array) => IPayloadData;\n    /**\n     * Serialize an item into a string\n     * @param input - telemetry item\n     * @param convertUndefined - convert undefined to a custom-defined object\n     * @returns Serialized string\n     */\n    serialize?: (input: ITelemetryItem, convertUndefined?: any) => string;\n    /**\n     * Batch an array of strings into one string\n     * @param arr - array of strings\n     * @returns a string represent all items in the given array\n     */\n    batch?: (arr: string[]) => string;\n  \n    /**\n     * If the item should be processed by offline channel\n     * @param evt - telemetry item\n     * @returns should process or not\n     */\n    shouldProcess?: (evt: ITelemetryItem) => boolean;\n\n    /**\n     * Create 1ds payload data\n     * @param evts - ITelemetryItems\n     * @returns IPayloadData\n     */\n      createOneDSPayload?: (evts: ITelemetryItem[]) => IPayloadData;\n\n}\n\n/**\n * Provides data transmission capabilities\n */\nexport interface IChannelControls extends ITelemetryPlugin {\n\n    /**\n     * Pause sending data\n     */\n    pause?(): void;\n\n    /**\n     * Resume sending data\n     */\n    resume?(): void;\n\n    /**\n     * Tear down the plugin and remove any hooked value, the plugin should be removed so that it is no longer initialized and\n     * therefore could be re-initialized after being torn down. The plugin should ensure that once this has been called any further\n     * processTelemetry calls are ignored and it just calls the processNext() with the provided context.\n     * @param unloadCtx - This is the context that should be used during unloading.\n     * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n     * @returns boolean - true if the plugin has or will call processNext(), this for backward compatibility as previously teardown was synchronous and returned nothing.\n     */\n    teardown?: (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => void | boolean;\n\n    /**\n     * Flush to send data immediately; channel should default to sending data asynchronously. If executing asynchronously and\n     * you DO NOT pass a callback function then a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * will be returned which will resolve once the flush is complete. The actual implementation of the `IPromise`\n     * will be a native Promise (if supported) or the default as supplied by [ts-async library](https://github.com/nevware21/ts-async)\n     * @param isAsync - send data asynchronously when true\n     * @param callBack - if specified, notify caller when send is complete, the channel should return true to indicate to the caller that it will be called.\n     * If the caller doesn't return true the caller should assume that it may never be called.\n     * @param sendReason - specify the reason that you are calling \"flush\" defaults to ManualFlush (1) if not specified\n     * @returns - If a callback is provided `true` to indicate that callback will be called after the flush is complete otherwise the caller\n     * should assume that any provided callback will never be called, Nothing or if occurring asynchronously a\n     * [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) which will be resolved once the unload is complete,\n     * the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) will only be returned when no callback is provided\n     * and isAsync is true.\n     */\n    flush?(isAsync: boolean, callBack?: (flushComplete?: boolean) => void, sendReason?: SendRequestReason): boolean | void | IPromise<boolean>;\n\n    /**\n     * Get offline support\n     * @returns IInternalOfflineSupport\n     */\n    getOfflineSupport?: () => IInternalOfflineSupport;\n\n}\n\nexport const MinChannelPriorty: number = 100;\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IChannelControlsHost.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IChannelControls } from \"./IChannelControls\";\nimport { IPlugin } from \"./ITelemetryPlugin\";\n\nexport interface IChannelControlsHost extends IChannelControls {\n    /**\n     * Get and return the named channel instance (if present) from the queues\n     * @param pluginIdentifier - The identifier name of the plugin\n     */\n    getChannel<T extends IPlugin = IPlugin>(pluginIdentifier: string): T;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { isNullOrUndefined } from \"@nevware21/ts-utils\";\nimport { DistributedTracingModes } from \"../../enums/ai/Enums\";\nimport { IConfiguration } from \"./IConfiguration\";\nimport { IRequestContext } from \"./IRequestContext\";\nimport { IStorageBuffer } from \"./IStorageBuffer\";\nimport { ICustomProperties } from \"./ITelemetryItem\";\nimport { IThrottleMgrConfig } from \"./IThrottleMgr\";\n\n/**\n * Configuration settings for how telemetry is sent\n * @export\n * @interface IConfig\n */\nexport interface IConfig {\n\n    /**\n     * The JSON format (normal vs line delimited). True means line delimited JSON.\n     */\n    emitLineDelimitedJson?: boolean;\n\n    /**\n     * An optional account id, if your app groups users into accounts. No spaces, commas, semicolons, equals, or vertical bars.\n     */\n    accountId?: string;\n\n    /**\n     * A session is logged if the user is inactive for this amount of time in milliseconds. Default 30 mins.\n     * @default 30*60*1000\n     */\n    sessionRenewalMs?: number;\n\n    /**\n     * A session is logged if it has continued for this amount of time in milliseconds. Default 24h.\n     * @default 24*60*60*1000\n     */\n    sessionExpirationMs?: number;\n\n    /**\n     * Max size of telemetry batch. If batch exceeds limit, it is sent and a new batch is started\n     * @default 100000\n     */\n    maxBatchSizeInBytes?: number;\n\n    /**\n     * How long to batch telemetry for before sending (milliseconds)\n     * @default 15 seconds\n     */\n    maxBatchInterval?: number;\n\n    /**\n     * If true, debugging data is thrown as an exception by the logger. Default false\n     * @defaultValue false\n     */\n    enableDebug?: boolean;\n\n    /**\n     * If true, exceptions are not autocollected. Default is false\n     * @defaultValue false\n     */\n    disableExceptionTracking?: boolean;\n\n    /**\n     * If true, telemetry is not collected or sent. Default is false\n     * @defaultValue false\n     */\n    disableTelemetry?: boolean;\n\n    /**\n     * Percentage of events that will be sent. Default is 100, meaning all events are sent.\n     * @defaultValue 100\n     */\n    samplingPercentage?: number;\n\n    /**\n     * If true, on a pageview, the previous instrumented page's view time is tracked and sent as telemetry and a new timer is started for the current pageview. It is sent as a custom metric named PageVisitTime in milliseconds and is calculated via the Date now() function (if available) and falls back to (new Date()).getTime() if now() is unavailable (IE8 or less). Default is false.\n     */\n    autoTrackPageVisitTime?: boolean;\n\n    /**\n     * Automatically track route changes in Single Page Applications (SPA). If true, each route change will send a new Pageview to Application Insights.\n     */\n    enableAutoRouteTracking?: boolean;\n\n    /**\n     * If true, Ajax calls are not autocollected. Default is false\n     * @defaultValue false\n     */\n    disableAjaxTracking?: boolean;\n\n    /**\n     * If true, Fetch requests are not autocollected. Default is false (Since 2.8.0, previously true).\n     * @defaultValue false\n     */\n    disableFetchTracking?: boolean;\n\n    /**\n     * Provide a way to exclude specific route from automatic tracking for XMLHttpRequest or Fetch request. For an ajax / fetch request that the request url matches with the regex patterns, auto tracking is turned off.\n     * @defaultValue undefined.\n     */\n    excludeRequestFromAutoTrackingPatterns?: string[] | RegExp[];\n\n    /**\n     * Provide a way to enrich dependencies logs with context at the beginning of api call.\n     * Default is undefined.\n     */\n    addRequestContext?: (requestContext?: IRequestContext) => ICustomProperties;\n\n    /**\n     * If true, default behavior of trackPageView is changed to record end of page view duration interval when trackPageView is called. If false and no custom duration is provided to trackPageView, the page view performance is calculated using the navigation timing API. Default is false\n     * @defaultValue false\n     */\n    overridePageViewDuration?: boolean;\n\n    /**\n     * Default 500 - controls how many ajax calls will be monitored per page view. Set to -1 to monitor all (unlimited) ajax calls on the page.\n     */\n    maxAjaxCallsPerView?: number;\n\n    /**\n     * @ignore\n     * If false, internal telemetry sender buffers will be checked at startup for items not yet sent. Default is true\n     * @defaultValue true\n     */\n    disableDataLossAnalysis?: boolean;\n\n    /**\n     * If false, the SDK will add two headers ('Request-Id' and 'Request-Context') to all dependency requests to correlate them with corresponding requests on the server side. Default is false.\n     * @defaultValue false\n     */\n    disableCorrelationHeaders?: boolean;\n\n    /**\n     * Sets the distributed tracing mode. If AI_AND_W3C mode or W3C mode is set, W3C trace context headers (traceparent/tracestate) will be generated and included in all outgoing requests.\n     * AI_AND_W3C is provided for back-compatibility with any legacy Application Insights instrumented services\n     * @defaultValue AI_AND_W3C\n     */\n    distributedTracingMode?: DistributedTracingModes;\n\n    /**\n     * Disable correlation headers for specific domain\n     */\n    correlationHeaderExcludedDomains?: string[];\n\n    /**\n     * Default false. If true, flush method will not be called when onBeforeUnload, onUnload, onPageHide or onVisibilityChange (hidden state) event(s) trigger.\n     */\n    disableFlushOnBeforeUnload?: boolean;\n\n    /**\n     * Default value of `disableFlushOnBeforeUnload`. If true, flush method will not be called when onPageHide or onVisibilityChange (hidden state) event(s) trigger.\n     */\n    disableFlushOnUnload?: boolean;\n\n    /**\n     * If true, the buffer with all unsent telemetry is stored in session storage. The buffer is restored on page load. Default is true.\n     * @defaultValue true\n     */\n    enableSessionStorageBuffer?: boolean;\n\n    /**\n     * If specified, overrides the storage & retrieval mechanism that is used to manage unsent telemetry.\n     */\n    bufferOverride?: IStorageBuffer;\n\n    /**\n     * @deprecated Use either disableCookiesUsage or specify a cookieCfg with the enabled value set.\n     * If true, the SDK will not store or read any data from cookies. Default is false. As this field is being deprecated, when both\n     * isCookieUseDisabled and disableCookiesUsage are used disableCookiesUsage will take precedent.\n     * @defaultValue false\n     */\n    isCookieUseDisabled?: boolean;\n\n    /**\n     * If true, the SDK will not store or read any data from cookies. Default is false.\n     * If you have also specified a cookieCfg then enabled property (if specified) will take precedent over this value.\n     * @defaultValue false\n     */\n    disableCookiesUsage?: boolean;\n\n    /**\n     * Custom cookie domain. This is helpful if you want to share Application Insights cookies across subdomains.\n     * @defaultValue \"\"\n     */\n    cookieDomain?: string;\n\n    /**\n     * Custom cookie path. This is helpful if you want to share Application Insights cookies behind an application gateway.\n     * @defaultValue \"\"\n     */\n    cookiePath?: string;\n\n    /**\n     * Default false. If false, retry on 206 (partial success), 408 (timeout), 429 (too many requests), 500 (internal server error), 503 (service unavailable), and 0 (offline, only if detected)\n     * @description\n     * @defaultValue false\n     */\n    isRetryDisabled?: boolean;\n\n    /**\n     * @deprecated Used when initizialing from snippet only.\n     *  The url from where the JS SDK will be downloaded.\n     */\n    url?: string;\n\n    /**\n     * If true, the SDK will not store or read any data from local and session storage. Default is false.\n     * @defaultValue false\n     */\n    isStorageUseDisabled?: boolean;\n\n    /**\n     * If false, the SDK will send all telemetry using the <a href=\"https://www.w3.org/TR/beacon\">Beacon API</a>.\n     * @defaultValue true\n     */\n    isBeaconApiDisabled?: boolean;\n\n    /**\n     * Don't use XMLHttpRequest or XDomainRequest (for IE \\< 9) by default instead attempt to use fetch() or sendBeacon.\n     * If no other transport is available it will still use XMLHttpRequest\n     */\n    disableXhr?: boolean;\n\n    /**\n     * If fetch keepalive is supported do not use it for sending events during unload, it may still fallback to fetch() without keepalive\n     */\n    onunloadDisableFetch?: boolean;\n\n    /**\n     * Sets the sdk extension name. Only alphabetic characters are allowed. The extension name is added as a prefix to the 'ai.internal.sdkVersion' tag (e.g. 'ext_javascript:2.0.0'). Default is null.\n     * @defaultValue null\n     */\n    sdkExtension?: string;\n\n    /**\n     * Default is false. If true, the SDK will track all [Browser Link](https://docs.microsoft.com/en-us/aspnet/core/client-side/using-browserlink) requests.\n     * @defaultValue false\n     */\n    isBrowserLinkTrackingEnabled?: boolean;\n\n    /**\n     * AppId is used for the correlation between AJAX dependencies happening on the client-side with the server-side requets. When Beacon API is enabled, it cannot be used automatically, but can be set manually in the configuration. Default is null\n     * @defaultValue null\n     */\n    appId?: string;\n\n    /**\n     * If true, the SDK will add two headers ('Request-Id' and 'Request-Context') to all CORS requests to correlate outgoing AJAX dependencies with corresponding requests on the server side. Default is false\n     * @defaultValue false\n     */\n    enableCorsCorrelation?: boolean;\n\n    /**\n     * An optional value that will be used as name postfix for localStorage and session cookie name.\n     * @defaultValue null\n     */\n    namePrefix?: string;\n\n    /**\n     * An optional value that will be used as name postfix for session cookie name. If undefined, namePrefix is used as name postfix for session cookie name.\n     * @defaultValue null\n     */\n    sessionCookiePostfix?: string;\n\n    /**\n     * An optional value that will be used as name postfix for user cookie name. If undefined, no postfix is added on user cookie name.\n     * @defaultValue null\n     */\n    userCookiePostfix?: string;\n\n    /**\n     * An optional value that will track Request Header through trackDependency function.\n     * @defaultValue false\n     */\n    enableRequestHeaderTracking?: boolean;\n\n    /**\n     * An optional value that will track Response Header through trackDependency function.\n     * @defaultValue false\n     */\n    enableResponseHeaderTracking?: boolean;\n\n    /**\n     * An optional value that will track Response Error data through trackDependency function.\n     * @defaultValue false\n     */\n    enableAjaxErrorStatusText?: boolean;\n\n    /**\n     * Flag to enable looking up and including additional browser window.performance timings\n     * in the reported ajax (XHR and fetch) reported metrics.\n     * Defaults to false.\n     */\n    enableAjaxPerfTracking?:boolean;\n\n    /**\n     * The maximum number of times to look for the window.performance timings (if available), this\n     * is required as not all browsers populate the window.performance before reporting the\n     * end of the XHR request and for fetch requests this is added after its complete\n     * Defaults to 3\n     */\n    maxAjaxPerfLookupAttempts?: number;\n\n    /**\n     * The amount of time to wait before re-attempting to find the windows.performance timings\n     * for an ajax request, time is in milliseconds and is passed directly to setTimeout()\n     * Defaults to 25.\n     */\n    ajaxPerfLookupDelay?: number;\n        \n    /**\n     * Default false. when tab is closed, the SDK will send all remaining telemetry using the [Beacon API](https://www.w3.org/TR/beacon)\n     * @defaultValue false\n     */\n    onunloadDisableBeacon?: boolean;\n\n    // Internal\n\n    /**\n     * @ignore\n     * Internal only\n     */\n    autoExceptionInstrumented?: boolean;\n\n    /**\n     *\n     */\n    correlationHeaderDomains?: string[]\n\n    /**\n     * @ignore\n     * Internal only\n     */\n    autoUnhandledPromiseInstrumented?: boolean;\n\n    /**\n     * Default false. Define whether to track unhandled promise rejections and report as JS errors.\n     * When disableExceptionTracking is enabled (dont track exceptions) this value will be false.\n     * @defaultValue false\n     */\n    enableUnhandledPromiseRejectionTracking?: boolean;\n\n    /**\n     * Disable correlation headers using regular expressions\n     */\n    correlationHeaderExcludePatterns?: RegExp[];\n\n    /**\n     * The ability for the user to provide extra headers\n     */\n    customHeaders?: [{header: string, value: string}];\n\n    /**\n     * Provide user an option to convert undefined field to user defined value.\n     */\n     convertUndefined?: any,\n\n    /**\n     * [Optional] The number of events that can be kept in memory before the SDK starts to drop events. By default, this is 10,000.\n     */\n    eventsLimitInMem?: number;\n\n    /**\n     * [Optional] Disable iKey deprecation error message.\n     * @defaultValue true\n     */\n    disableIkeyDeprecationMessage?: boolean;\n\n    /**\n     * [Optional] Sets to true if user wants to disable sending internal log message 'SendBrowserInfoOnUserInit'\n     * default to be false for versions 2.8.x and 3.0.x, true for versions 3.1.x and later\n     */\n    disableUserInitMessage?: boolean;\n\n    /**\n     * [Optional] Flag to indicate whether the internal looking endpoints should be automatically\n     * added to the `excludeRequestFromAutoTrackingPatterns` collection. (defaults to true).\n     * This flag exists as the provided regex is generic and may unexpectedly match a domain that\n     * should not be excluded.\n     */\n    addIntEndpoints?: boolean;\n\n    /**\n     * [Optional] Sets throttle mgr configuration by key\n     */\n    throttleMgrCfg?: {[key: number]: IThrottleMgrConfig};\n\n    /**\n     * [Optional] Specifies a Highest Priority custom endpoint URL where telemetry data will be sent.\n     * This URL takes precedence over the 'config.endpointUrl' and any endpoint in the connection string.\n     */\n    userOverrideEndpointUrl?: string;\n\n}\n\nexport class ConfigurationManager {\n    public static getConfig(config: IConfiguration & IConfig, field: string, identifier?: string, defaultValue: number | string | boolean = false): number | string | boolean {\n        let configValue;\n        if (identifier && config.extensionConfig && config.extensionConfig[identifier] && !isNullOrUndefined(config.extensionConfig[identifier][field])) {\n            configValue = config.extensionConfig[identifier][field];\n        } else {\n            configValue = config[field];\n        }\n\n        return !isNullOrUndefined(configValue) ? configValue : defaultValue;\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IConfiguration.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { eTraceHeadersMode } from \"../../enums/ai/TraceHeadersMode\";\nimport { UrlRedactionOptions } from \"../../enums/ai/UrlRedactionOptions\";\nimport { IOTelConfig } from \"../otel/config/IOTelConfig\";\nimport { IAppInsightsCore } from \"./IAppInsightsCore\";\nimport { IChannelControls } from \"./IChannelControls\";\nimport { ICookieMgrConfig } from \"./ICookieMgr\";\nimport { IExceptionConfig } from \"./IExceptionConfig\";\nimport { IFeatureOptIn } from \"./IFeatureOptIn\";\nimport { INotificationManager } from \"./INotificationManager\";\nimport { IPerfManager } from \"./IPerfManager\";\nimport { ITelemetryPlugin } from \"./ITelemetryPlugin\";\n\n/**\n * Configuration provided to SDK core\n */\nexport interface IConfiguration extends IOTelConfig {\n    /**\n     * Instrumentation key of resource. Either this or connectionString must be specified.\n     */\n    instrumentationKey?: string| IPromise<string>;\n\n    /**\n     * Connection string of resource. Either this or instrumentationKey must be specified.\n     */\n    connectionString?: string | IPromise<string> ;\n\n    /**\n     * Set the timer interval (in ms) for internal logging queue, this is the\n     * amount of time to wait after logger.queue messages are detected to be sent.\n     * Note: since 3.0.1 and 2.8.13 the diagnostic logger timer is a normal timeout timer\n     * and not an interval timer. So this now represents the timer \"delay\" and not\n     * the frequency at which the events are sent.\n     */\n    diagnosticLogInterval?: number;\n\n    /**\n     * Maximum number of iKey transmitted logging telemetry per page view\n     */\n    maxMessageLimit?: number;\n\n    /**\n     * Console logging level. All logs with a severity level higher\n     * than the configured level will be printed to console. Otherwise\n     * they are suppressed. ie Level 2 will print both CRITICAL and\n     * WARNING logs to console, level 1 prints only CRITICAL.\n     *\n     * Note: Logs sent as telemetry to instrumentation key will also\n     * be logged to console if their severity meets the configured loggingConsoleLevel\n     *\n     * 0: ALL console logging off\n     * 1: logs to console: severity \\>= CRITICAL\n     * 2: logs to console: severity \\>= WARNING\n     */\n    loggingLevelConsole?: number;\n\n    /**\n     * Telemtry logging level to instrumentation key. All logs with a severity\n     * level higher than the configured level will sent as telemetry data to\n     * the configured instrumentation key.\n     *\n     * 0: ALL iKey logging off\n     * 1: logs to iKey: severity \\>= CRITICAL\n     * 2: logs to iKey: severity \\>= WARNING\n     */\n    loggingLevelTelemetry?: number\n\n    /**\n     * If enabled, uncaught exceptions will be thrown to help with debugging\n     */\n    enableDebug?: boolean;\n\n    /**\n     * Endpoint where telemetry data is sent\n     */\n    endpointUrl?: string | IPromise<string>;\n\n    /**\n     * Extension configs loaded in SDK\n     */\n    extensionConfig?: { [key: string]: any }; // extension configs;\n\n    /**\n     * Additional plugins that should be loaded by core at runtime\n     */\n    readonly extensions?: ITelemetryPlugin[];\n\n    /**\n     * Channel queues that is setup by caller in desired order.\n     * If channels are provided here, core will ignore any channels that are already setup, example if there is a SKU with an initialized channel\n     */\n    readonly channels?: IChannelControls[][];\n\n    /**\n     * Flag that disables the Instrumentation Key validation.\n     */\n    disableInstrumentationKeyValidation?: boolean;\n    \n    /**\n     * [Optional] When enabled this will create local perfEvents based on sections of the code that have been instrumented\n     * to emit perfEvents (via the doPerf()) when this is enabled. This can be used to identify performance issues within\n     * the SDK, the way you are using it or optionally your own instrumented code.\n     * The provided IPerfManager implementation does NOT send any additional telemetry events to the server it will only fire\n     * the new perfEvent() on the INotificationManager which you can listen to.\n     * This also does not use the window.performance API, so it will work in environments where this API is not supported.\n     */\n    enablePerfMgr?: boolean;\n\n    /**\n     * [Optional] Callback function that will be called to create a the IPerfManager instance when required and `enablePerfMgr`\n     * is enabled, this enables you to override the default creation of a PerfManager() without needing to `setPerfMgr()`\n     * after initialization.\n     */\n    createPerfMgr?: (core: IAppInsightsCore, notificationManager: INotificationManager) => IPerfManager;\n\n    /**\n     * [Optional] Fire every single performance event not just the top level root performance event. Defaults to false.\n     */\n    perfEvtsSendAll?: boolean;\n\n    /**\n     * [Optional] Identifies the default length used to generate random session and user id's if non currently exists for the user / session.\n     * Defaults to 22, previous default value was 5, if you need to keep the previous maximum length you should set this value to 5.\n     */\n    idLength?: number;\n\n    /**\n     * @description Custom cookie domain. This is helpful if you want to share Application Insights cookies across subdomains. It\n     * can be set here or as part of the cookieCfg.domain, the cookieCfg takes precedence if both are specified.\n     * @defaultValue \"\"\n     */\n    cookieDomain?: string;\n\n    /**\n     * @description Custom cookie path. This is helpful if you want to share Application Insights cookies behind an application\n     * gateway. It can be set here or as part of the cookieCfg.domain, the cookieCfg takes precedence if both are specified.\n     * @defaultValue \"\"\n     */\n    cookiePath?: string;\n\n    /**\n     * [Optional] A boolean that indicated whether to disable the use of cookies by the SDK. If true, the SDK will not store or\n     * read any data from cookies. Cookie usage can be re-enabled after initialization via the core.getCookieMgr().enable().\n     */\n    disableCookiesUsage?: boolean;\n\n    /**\n     * [Optional] A Cookie Manager configuration which includes hooks to allow interception of the get, set and delete cookie\n     * operations. If this configuration is specified any specified enabled and domain properties will take precedence over the\n     * cookieDomain and disableCookiesUsage values.\n     */\n    cookieCfg?: ICookieMgrConfig;\n\n    /**\n     * [Optional] An array of the page unload events that you would like to be ignored, special note there must be at least one valid unload\n     * event hooked, if you list all or the runtime environment only supports a listed \"disabled\" event it will still be hooked, if required by the SDK.\n     * Unload events include \"beforeunload\", \"unload\", \"visibilitychange\" (with 'hidden' state) and \"pagehide\".\n     *\n     * This can be used to avoid jQuery 3.7.1+ deprecation warnings and Chrome warnings about the unload event:\n     * @example\n     * ```javascript\n     * {\n     *   disablePageUnloadEvents: [\"unload\"]\n     * }\n     * ```\n     *\n     * For more details, see the [Page Unload Events documentation](https://microsoft.github.io/ApplicationInsights-JS/PageUnloadEvents.html).\n     */\n    disablePageUnloadEvents?: string[];\n\n    /**\n     * [Optional] An array of page show events that you would like to be ignored, special note there must be at lease one valid show event\n     * hooked, if you list all or the runtime environment only supports a listed (disabled) event it will STILL be hooked, if required by the SDK.\n     * Page Show events include \"pageshow\" and \"visibilitychange\" (with 'visible' state).\n     *\n     * @example\n     * ```javascript\n     * {\n     *   disablePageShowEvents: [\"pageshow\"]\n     * }\n     * ```\n     *\n     * For more details, see the [Page Unload Events documentation](https://microsoft.github.io/ApplicationInsights-JS/PageUnloadEvents.html).\n     */\n    disablePageShowEvents?: string[];\n\n    /**\n     * [Optional] A flag for performance optimization to disable attempting to use the Chrome Debug Extension, if disabled and the extension is installed\n     * this will not send any notifications.\n     */\n    disableDbgExt?: boolean;\n\n    /**\n     * Add \"&w=0\" parameter to support UA Parsing when web-workers don't have access to Document.\n     * Default is false\n     */\n    enableWParam?: boolean;\n\n     /**\n     * Custom optional value that will be added as a prefix for storage name.\n     * @defaultValue undefined\n     */\n    storagePrefix?:string;\n\n    /**\n     * Custom optional value to opt in features\n     * @defaultValue undefined\n     */\n    featureOptIn?: IFeatureOptIn;\n\n    /**\n     * If your connection string, instrumentation key and endpoint url are promises,\n     * this config is to manually set timeout for those promises.\n     * Default: 50000ms\n     * @since 3.3.0\n     */\n    initTimeOut?: number;\n\n    /**\n     * If your connection string, instrumentation key and endpoint url are promises,\n     * this config is to manually set in memory proxy track calls count limit before promises finished.\n     * Default: 100\n     * @since 3.3.0\n     */\n    initInMemoMaxSize?: number;\n\n    /**\n     * [Optional] Set additional configuration for exceptions, such as more scripts to include in the exception telemetry.\n     * @since 3.3.2\n     */\n    expCfg?: IExceptionConfig;\n\n    /**\n     * [Optional] A flag to enable or disable redaction for query parameters and username/password.\n     * @defaultValue true\n     */\n    redactUrls?: UrlRedactionOptions;\n\n    /**\n     * [Optional] Additional query parameters to redact beyond the default set.\n     * Use this to specify custom parameters that contain sensitive information.\n     * These will be combined with the default parameters that are redacted.\n     * @defaultValue [\"sig\", \"Signature\", \"AWSAccessKeyId\", \"X-Goog-Signature\"]\n     * @example [\"sig\", \"Signature\", \"AWSAccessKeyId\", \"X-Goog-Signature\",\"auth_token\", \"api_key\", \"private_data\"]\n     */\n    redactQueryParams?: string[];\n\n    ///**\n    // * [Optional] Internal SDK configuration for developers\n    // * @internal\n    // */\n    //_sdk?: IInternalSdkConfiguration;\n\n    /**\n     * [Optional] Controls if the SDK should look for the `traceparent` and/or `tracestate` values from\n     * the service timing headers or meta tags from the initial page load.\n     * @defaultValue eTraceHeadersMode.All\n     */\n    traceHdrMode?: eTraceHeadersMode;\n}\n\n///**\n// * Internal SDK configuration options\n// * @internal\n// */\n//export interface IInternalSdkConfiguration {\n//    /**\n//     * [Optional] Enable Internal StatsBeat\n//     * @internal\n//     */\n//    stats?: IStatsBeatConfig;\n//}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ICookieMgr.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { ITelemetryUpdateState } from \"./ITelemetryUpdateState\";\n\nexport interface ICookieMgr {\n\n    /**\n     * Enable or Disable the usage of cookies\n     */\n    setEnabled(value: boolean): void;\n\n    /**\n     * Can the system use cookies, if this returns false then all cookie setting and access functions will return nothing\n     */\n    isEnabled(): boolean;\n\n    /**\n     * Set the named cookie with the value and optional domain and optional\n     * @param name - The name of the cookie\n     * @param value - The value of the cookie (Must already be encoded)\n     * @param maxAgeSec - [optional] The maximum number of SECONDS that this cookie should survive\n     * @param domain - [optional] The domain to set for the cookie\n     * @param path - [optional] Path to set for the cookie, if not supplied will default to \"/\"\n     * @returns - True if the cookie was set otherwise false (Because cookie usage is not enabled or available)\n     */\n    set(name: string, value: string, maxAgeSec?: number, domain?: string, path?: string): boolean;\n\n    /**\n     * Get the value of the named cookie\n     * @param name - The name of the cookie\n     */\n    get(name: string): string;\n\n    /**\n     * Delete/Remove the named cookie if cookie support is available and enabled.\n     * Note: Not using \"delete\" as the name because it's a reserved word which would cause issues on older browsers\n     * @param name - The name of the cookie\n     * @param path - [optional] Path to set for the cookie, if not supplied will default to \"/\"\n     * @returns - True if the cookie was marked for deletion otherwise false (Because cookie usage is not enabled or available)\n     */\n    del(name: string, path?: string): boolean;\n\n    /**\n     * Purge the cookie from the system if cookie support is available, this function ignores the enabled setting of the manager\n     * so any cookie will be removed.\n     * Note: Not using \"delete\" as the name because it's a reserved word which would cause issues on older browsers\n     * @param name - The name of the cookie\n     * @param path - [optional] Path to set for the cookie, if not supplied will default to \"/\"\n     * @returns - True if the cookie was marked for deletion otherwise false (Because cookie usage is not available)\n     */\n    purge(name: string, path?: string): boolean;\n\n    /**\n     * Optional Callback hook to allow the cookie manager to update it's configuration, not generally implemented now that\n     * dynamic configuration is supported\n     * @param updateState - The new configuration state to apply to the cookie manager\n     */\n    update?(updateState: ITelemetryUpdateState): void;\n\n    /**\n     * Unload and remove any state that this ICookieMgr may be holding, this is generally called when the\n     * owning SDK is being unloaded.\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @returns If the unload occurs synchronously then nothing should be returned, if happening asynchronously then\n     * the function should return an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * / Promise to allow any listeners to wait for the operation to complete.\n     */\n    unload?(isAsync?: boolean): void | IPromise<void>;\n}\n\n/**\n * Configuration definition for instance based cookie management configuration\n */\nexport interface ICookieMgrConfig {\n    /**\n     * Defaults to true, A boolean that indicates whether the use of cookies by the SDK is enabled by the current instance.\n     * If false, the instance of the SDK initialized by this configuration will not store or read any data from cookies\n     */\n    enabled?: boolean;\n\n    /**\n     * Custom cookie domain. This is helpful if you want to share Application Insights cookies across subdomains.\n     */\n    domain?: string;\n\n    /**\n     * Specifies the path to use for the cookie, defaults to '/'\n     */\n    path?: string;\n\n    /**\n     * Specify the cookie name(s) to be ignored, this will cause any matching cookie name to never be read or written.\n     * They may still be explicitly purged or deleted. You do not need to repeat the name in the `blockedCookies`\n     * configuration.(Since v2.8.8)\n     */\n    ignoreCookies?: string[];\n\n    /**\n     * Specify the cookie name(s) to never be written, this will cause any cookie name to never be created or updated,\n     * they will still be read unless also included in the ignoreCookies and may still be explicitly purged or deleted.\n     * If not provided defaults to the same list provided in ignoreCookies. (Since v2.8.8)\n     */\n    blockedCookies?: string[];\n\n    /**\n     * Hook function to fetch the named cookie value.\n     * @param name - The name of the cookie\n     */\n    getCookie?: (name: string) => string;\n\n    /**\n     * Hook function to set the named cookie with the specified value.\n     * @param name - The name of the cookie\n     * @param value - The value to set for the cookie\n     */\n    setCookie?: (name: string, value: string) => void;\n\n    /**\n     * Hook function to delete the named cookie with the specified value, separated from\n     * setCookie to avoid the need to parse the value to determine whether the cookie is being\n     * added or removed.\n     * @param name - The name of the cookie\n     * @param cookieValue - The value to set to expire the cookie\n     */\n    delCookie?: (name: string, cookieValue: string) => void;\n\n    /**\n     * Defaults to false, when true this will disable the deferral behavior that occurs when cookies are disabled,\n     * reverting to the previous behavior where cookie operations would simply return false when cookies are disabled.\n     * This is provided to maintain backward compatibility if applications depend on the previous behavior.\n     * When false (default), cookie operations are deferred until cookies are enabled, supporting consent scenarios.\n     * @since v3.3.10\n     */\n    disableCookieDefer?: boolean;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ICorrelationConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { DistributedTracingModes } from \"../../enums/ai/Enums\";\nimport { IRequestContext } from \"./IRequestContext\";\nimport { ICustomProperties } from \"./ITelemetryItem\";\n\nexport interface ICorrelationConfig {\n    enableCorsCorrelation: boolean;\n\n    /**\n     * [Optional] Domains to be excluded from correlation headers.\n     * To override or discard the default, add an array with all domains to be excluded or\n     * an empty array to the configuration.\n     *\n     * @example\n     * ```ts\n     * import { ApplicationInsights } from '@microsoft/applicationinsights-web';\n     * const appInsights = new ApplicationInsights({\n     *    config: {\n     *       connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n     *       extensionConfig: {\n     *          AjaxDependencyPlugin: {\n     *              // Both arrays of strings are used to match the request URL against the\n     *              // current host and the request URL to determine if correlation headers\n     *              // The strings are converted to RegExp objects by translating\n     *              // - `.` to `\\\\.` (to match a literal dot)\n     *              // - `*` to `.*` (to match any character)\n     *              // - `\\` to `\\\\` (to match a literal slash)\n     *              // All other characters are ignored and passed to the RegExp constructor\n     *              correlationHeaderExcludedDomains: [\"test\", \"*.azure.com\", \"ignore.microsoft.com\"],\n     *              correlationHeaderDomains: [\"azure.com\", \"prefix.bing.com\", \"*.microsoft.com\", \"example.com\"]\n     *          }\n     *       }\n     * });\n     * appInsights.loadAppInsights();\n     * appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n     * ```\n     */\n    correlationHeaderExcludedDomains: string[];\n\n    /**\n     * [Optional] Domains to be included in correlation headers.\n     * To override or discard the default, add an array with all domains to be included or\n     * an empty array to the configuration.\n     *\n     * @example\n     * ```ts\n     * import { ApplicationInsights } from '@microsoft/applicationinsights-web';\n     * const appInsights = new ApplicationInsights({\n     *    config: {\n     *       connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n     *       extensionConfig: {\n     *          AjaxDependencyPlugin: {\n     *              // Values MUST be RegExp objects\n     *              correlationHeaderExcludePatterns: [/*\\.azure.com/, /prefix.bing.com/, /.*\\.microsoft.com/, /example.com/]\n     *          }\n     *       }\n     * });\n     * appInsights.loadAppInsights();\n     * appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n     * ```\n     */\n    correlationHeaderExcludePatterns?: RegExp[];\n    disableCorrelationHeaders: boolean;\n\n    /**\n     * The distributed tracing mode to use for this configuration.\n     * Defaults to AI_AND_W3C.\n     * This is used to determine which headers are sent with requests and how the\n     * telemetry is correlated across services.\n     * @default AI_AND_W3C\n     * @see {@link eDistributedTracingModes}\n     */\n    distributedTracingMode: DistributedTracingModes;\n    \n    maxAjaxCallsPerView: number;\n    disableAjaxTracking: boolean;\n    disableFetchTracking: boolean;\n    appId?: string;\n    enableRequestHeaderTracking?: boolean;\n    enableResponseHeaderTracking?: boolean;\n    enableAjaxErrorStatusText?: boolean;\n\n    /**\n     * Flag to enable looking up and including additional browser window.performance timings\n     * in the reported ajax (XHR and fetch) reported metrics.\n     * Defaults to false.\n     */\n    enableAjaxPerfTracking?: boolean;\n\n    /**\n     * The maximum number of times to look for the window.performance timings (if available), this\n     * is required as not all browsers populate the window.performance before reporting the\n     * end of the XHR request and for fetch requests this is added after its complete\n     * Defaults to 3\n     */\n    maxAjaxPerfLookupAttempts?: number;\n\n    /**\n     * The amount of time to wait before re-attempting to find the windows.performance timings\n     * for an ajax request, time is in milliseconds and is passed directly to setTimeout()\n     * Defaults to 25.\n     */\n    ajaxPerfLookupDelay?: number;\n\n    /**\n     * [Optional] Domains to be excluded from correlation headers.\n     * To override or discard the default, add an array with all domains to be excluded or\n     * an empty array to the configuration.\n     *\n     * @example\n     * ```ts\n     * import { ApplicationInsights } from '@microsoft/applicationinsights-web';\n     * const appInsights = new ApplicationInsights({\n     *    config: {\n     *       connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n     *       extensionConfig: {\n     *          AjaxDependencyPlugin: {\n     *              // Both arrays of strings are used to match the request URL against the\n     *              // current host and the request URL to determine if correlation headers\n     *              // The strings are converted to RegExp objects by translating\n     *              // - `.` to `\\\\.` (to match a literal dot)\n     *              // - `*` to `.*` (to match any character)\n     *              // - `\\` to `\\\\` (to match a literal slash)\n     *              // All other characters are ignored and passed to the RegExp constructor\n     *              correlationHeaderExcludedDomains: [\"test\", \"*.azure.com\", \"ignore.microsoft.com\"],\n     *              correlationHeaderDomains: [\"azure.com\", \"prefix.bing.com\", \"*.microsoft.com\", \"example.com\"]\n     *          }\n     *       }\n     * });\n     * appInsights.loadAppInsights();\n     * appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n     * ```\n     */\n    correlationHeaderDomains?: string[];\n\n    /**\n     * [Optional] Response and request headers to be excluded from AJAX & Fetch tracking data.\n     * To override or discard the default, add an array with all headers to be excluded or\n     * an empty array to the configuration.\n     *\n     * For example: `[\"Authorization\", \"X-API-Key\", \"WWW-Authenticate\"]`\n     *\n     * @example\n     * ```js\n     * import { ApplicationInsights } from '@microsoft/applicationinsights-web';\n     * import { AjaxPlugin } from '@microsoft/applicationinsights-dependencies-js';\n     *\n     * const dependencyPlugin = new AjaxPlugin();\n     * const appInsights = new ApplicationInsights({\n     *     config: {\n     *         connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n     *         extensions: [dependencyPlugin],\n     *         extensionConfig: {\n     *             AjaxDependencyPlugin: {\n     *                 ignoreHeaders: [\n     *                     \"Authorization\",\n     *                     \"X-API-Key\",\n     *                     \"WWW-Authenticate\"\n     *                 ]\n     *             }\n     *         }\n     *     }\n     * });\n     * appInsights.loadAppInsights();\n     * appInsights.trackPageView(); // Manually call trackPageView to establish the current user/session/pageview\n     * ```\n     */\n    ignoreHeaders?: string[];\n\n    /**\n     * Provide a way to exclude specific route from automatic tracking for XMLHttpRequest or Fetch request.\n     * For an ajax / fetch request that the request url matches with the regex patterns, auto tracking is turned off.\n     * Default is undefined.\n     */\n    excludeRequestFromAutoTrackingPatterns?: string[] | RegExp[];\n\n    /**\n     * Provide a way to enrich dependencies logs with context at the beginning of api call.\n     * Default is undefined.\n     */\n    addRequestContext?: (requestContext?: IRequestContext) => ICustomProperties;\n\n    /**\n     * [Optional] Flag to indicate whether the internal looking endpoints should be automatically\n     * added to the `excludeRequestFromAutoTrackingPatterns` collection. (defaults to true).\n     * This flag exists as the provided regex is generic and may unexpectedly match a domain that\n     * should not be excluded.\n     */\n    addIntEndpoints?: boolean;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IDbgExtension.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { INotificationListener } from \"./INotificationListener\";\n\nexport interface IDbgExtension {\n    isEnabled: () => boolean;\n    enable: () => void;\n    disable: () => void;\n    listener: INotificationListener,\n    sendEvt?: (name: string, data: any) => void;\n    debugMsg?: (name: string, data: any) => void;\n    diagLog?: (name: string, data: any) => void;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IDependencyTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\n\n/**\n * DependencyTelemetry telemetry interface\n */\n\nexport interface IDependencyTelemetry extends IPartC {\n    id: string;\n    name?: string;\n    duration?: number;\n    success?: boolean;\n    startTime?: Date;\n    responseCode: number;\n    correlationContext?: string;\n    type?: string;\n    data?: string;\n    target?: string;\n    iKey?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IDiagnosticLogger.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { LoggingSeverity, _InternalMessageId } from \"../../enums/ai/LoggingEnums\";\nimport { ITelemetryUpdateState } from \"./ITelemetryUpdateState\";\n\nexport interface IInternalLogMessage {\n    message: string;\n    messageId: _InternalMessageId;\n}\n\nexport interface IDiagnosticLogger {\n\n    /**\n     * 0: OFF\n     * 1: only critical (default)\n     * 2: critical + info\n     */\n    consoleLoggingLevel: () => number;\n\n    /**\n     * The internal logging queue\n     */\n    queue: IInternalLogMessage[];\n\n    /**\n     * This method will throw exceptions in debug mode or attempt to log the error as a console warning.\n     * @param severity - The severity of the log message\n     * @param message - The log message.\n     */\n    throwInternal(severity: LoggingSeverity, msgId: _InternalMessageId, msg: string, properties?: Object, isUserAct?: boolean): void;\n\n    /**\n     * This will write a debug message to the console if possible\n     * @param message - The debug message\n     */\n    debugToConsole?(message: string): void\n\n    /**\n     * This will write a warning to the console if possible\n     * @param message - The warning message\n     */\n    warnToConsole(message: string): void;\n\n    /**\n     * This will write an error to the console if possible.\n     * Provided by the default DiagnosticLogger instance, and internally the SDK will fall back to warnToConsole, however,\n     * direct callers MUST check for its existence on the logger as you can provide your own IDiagnosticLogger instance.\n     * @param message - The error message\n     */\n    errorToConsole?(message: string): void;\n\n    /**\n     * Resets the internal message count\n     */\n    resetInternalMessageCount(): void;\n\n    /**\n     * Logs a message to the internal queue.\n     * @param severity - The severity of the log message\n     * @param message - The message to log.\n     */\n    logInternalMessage?(severity: LoggingSeverity, message: IInternalLogMessage): void;\n\n    /**\n     * Optional Callback hook to allow the diagnostic logger to update it's configuration\n     * @param updateState - The new configuration state to apply to the diagnostic logger\n     */\n    update?(updateState: ITelemetryUpdateState): void;\n\n    /**\n     * Unload and remove any state that this IDiagnosticLogger may be holding, this is generally called when the\n     * owning SDK is being unloaded.\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @returns If the unload occurs synchronously then nothing should be returned, if happening asynchronously then\n     * the function should return an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * / Promise to allow any listeners to wait for the operation to complete.\n     */\n    unload?(isAsync?: boolean): void | IPromise<void>;\n\n    /**\n     * A flag that indicates whether this logger is in debug (throw real exceptions) mode\n     */\n    readonly dbgMode?: boolean;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IDistributedTraceContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IOTelTraceState } from \"../otel/trace/IOTelTraceState\";\nimport { IW3cTraceState } from \"./IW3cTraceState\";\n\n/**\n * An object that can be used to populate a new {@link IDistributedTraceContext} instance,\n * the included {@link IW3cTraceState} or {@link IOTelTraceState} is used as the parent of the\n * created instances traceState\n */\nexport interface IDistributedTraceInit {\n    /**\n     * The unique identifier for the trace that this span belongs to.\n     *\n     * The trace ID is a globally unique identifier that connects all spans within a single\n     * distributed trace. It consists of 16 randomly generated bytes encoded as 32 lowercase\n     * hexadecimal characters, providing 128 bits of entropy to ensure worldwide uniqueness\n     * with practically sufficient probability.\n     *\n     * @remarks\n     * - Must be exactly 32 lowercase hexadecimal characters\n     * - Represents 128 bits (16 bytes) of random data\n     * - Shared by all spans within the same trace\n     * - Used for trace correlation across distributed systems\n     * - Should never be all zeros (invalid trace ID)\n     *\n     * @example\n     * ```typescript\n     * // Example trace ID format\n     * const traceId = \"4bf92f3577b34da6a3ce929d0e0e4736\";\n     *\n     * // All spans in the same trace share this ID\n     * console.log(parentSpan.spanContext().traceId === childSpan.spanContext().traceId); // true\n     * ```\n     */\n    traceId: string;\n    \n    /**\n     * The unique identifier for this specific span within the trace.\n     *\n     * The span ID uniquely identifies this span within the trace and is used to establish\n     * parent-child relationships between spans. It consists of 8 randomly generated bytes\n     * encoded as 16 lowercase hexadecimal characters, providing 64 bits of entropy to\n     * ensure global uniqueness with practically sufficient probability.\n     *\n     * @remarks\n     * - Must be exactly 16 lowercase hexadecimal characters\n     * - Represents 64 bits (8 bytes) of random data\n     * - Unique within the trace (different spans have different span IDs)\n     * - Used as parent ID when creating child spans\n     * - Should never be all zeros (invalid span ID)\n     *\n     * @example\n     * ```typescript\n     * // Example span ID format\n     * const spanId = \"00f067aa0ba902b7\";\n     *\n     * // Each span has a unique ID within the trace\n     * const parentId = parentSpan.spanContext().spanId; // \"00f067aa0ba902b7\"\n     * const childId = childSpan.spanContext().spanId;   // \"b9c7c989f97918e1\"\n     *\n     * // Child span uses parent's span ID as its parent ID\n     * console.log(childSpan.parentSpanId === parentId); // true\n     * ```\n     */\n    spanId: string;\n\n    /**\n     * Indicates whether this span context was propagated from a remote parent span.\n     *\n     * This flag distinguishes between spans created locally within the same process\n     * and spans that represent operations in remote services. Remote spans are typically\n     * created when trace context is received via HTTP headers, message queues, or other\n     * inter-process communication mechanisms.\n     *\n     * @defaultValue false - spans are considered local unless explicitly marked as remote\n     *\n     * @remarks\n     * - True only when span context was received from another process/service\n     * - Helps distinguish local vs. distributed trace segments\n     * - Used by tracing systems for visualization and analysis\n     * - Local child spans of remote parents are NOT considered remote themselves\n     *\n     * @example\n     * ```typescript\n     * // HTTP service receiving trace context\n     * const incomingSpanContext = extractSpanContextFromHeaders(request.headers);\n     * console.log(incomingSpanContext.isRemote); // true\n     *\n     * // Child span created locally\n     * const localChild = tracer.startSpan('local-operation', {\n     *   parent: incomingSpanContext\n     * });\n     * console.log(localChild.spanContext().isRemote); // false\n     * ```\n     */\n    isRemote?: boolean;\n\n    /**\n     * Trace flags that control trace behavior and indicate sampling decisions.\n     *\n     * The trace flags are represented as a single byte (8-bit bitmap) that carries\n     * trace-level information. The least significant bit (0x01) indicates whether\n     * the trace is sampled. When this bit is set, it documents that the caller\n     * may have recorded trace data. Additional bits are reserved for future use\n     * and should be ignored when not understood.\n     *\n     * @remarks\n     * - Represented as a number (0-255) corresponding to 8 bits\n     * - Bit 0 (0x01): Sampled flag - indicates trace may contain recorded data\n     * - Bits 1-7: Reserved for future use, should be preserved during propagation\n     * - Used by sampling algorithms to make consistent decisions across services\n     * - See {@link eW3CTraceFlags} for standard flag values\n     *\n     * @example\n     * ```typescript\n     * // Check if trace is sampled\n     * const isSampled = (spanContext.traceFlags & 0x01) === 1;\n     *\n     * // Common flag values\n     * const UNSAMPLED = 0x00; // 00000000 - not sampled\n     * const SAMPLED = 0x01;   // 00000001 - sampled\n     *\n     * // Preserving unknown flags during propagation\n     * const preservedFlags = spanContext.traceFlags | 0x01; // Set sampled bit while preserving others\n     *\n     * // W3C traceparent header format includes these flags\n     * const traceparent = `00-${traceId}-${spanId}-${traceFlags.toString(16).padStart(2, '0')}`;\n     * ```\n     */\n    traceFlags?: number;\n\n    /**\n     * Vendor-specific trace state information for cross-system trace correlation.\n     *\n     * The trace state carries tracing-system-specific context in a standardized format\n     * defined by the W3C Trace Context specification. It allows multiple tracing systems\n     * to participate in the same trace by providing a mechanism for each system to add\n     * its own metadata without interfering with others.\n     *\n     * The trace state is formatted as a comma-separated list of key-value pairs, where\n     * each pair represents one tracing system's contribution. Keys should be unique\n     * within the trace state and follow specific naming conventions.\n     *\n     * @remarks\n     * - Maximum of 32 list members allowed\n     * - Each member format: `key=value` separated by commas\n     * - Keys should be namespaced to avoid conflicts (e.g., `vendor@system=value`)\n     * - Total size should not exceed 512 characters for practical header limits\n     * - Spaces around list members are ignored\n     * - Preserves vendor-specific information during trace propagation\n     *\n     * @see {@link https://www.w3.org/TR/trace-context/#tracestate-field | W3C Trace Context Specification}\n     *\n     * @example\n     * ```typescript\n     * // Single tracing system\n     * const singleVendor = {\n     *   get: (key: string) => key === 'rojo' ? '00f067aa0ba902b7' : undefined,\n     *   set: (key: string, value: string) => { ... },\n     *   unset: (key: string) => { ... },\n     *   serialize: () => 'rojo=00f067aa0ba902b7'\n     * };\n     *\n     * // Multiple tracing systems\n     * const multiVendor = {\n     *   serialize: () => 'rojo=00f067aa0ba902b7,congo=t61rcWkgMzE,vendor@system=custom-value'\n     * };\n     *\n     * // Accessing trace state\n     * const rojoValue = spanContext.traceState?.get('rojo');\n     * const serialized = spanContext.traceState?.serialize();\n     *\n     * // HTTP header format (When the traceState is an IOTelTraceState)\n     * headers['tracestate'] = spanContext.traceState?.serialize() || '';\n     *\n     * // HTTP header format (When the traceState is an IW3cTraceState)\n     * headers['tracestate'] = spanContext.traceState?.hdrs()[0] || '';\n     * ```\n     */\n    traceState?: IW3cTraceState | IOTelTraceState;\n}\n\nexport interface IDistributedTraceContext extends IDistributedTraceInit {\n\n    /**\n     * Returns the current name of the page\n     */\n    getName(): string;\n\n    /**\n     * Sets the current name of the page, also updates the name for any parent context.\n     * This is used to identify the page in the telemetry data.\n     * @remarks This function updates the current and ALL parent contexts with the new name,\n     * to just update the name of the current context, use the `pageName` property.\n     * @param pageName - The name of the page\n     * @deprecated Use the `pageName` property to avoid the side effect of changing the page name of all\n     * parent contexts.\n     */\n    setName(pageName: string): void;\n\n    /**\n     * Returns the unique identifier for a trace. All requests / spans from the same trace share the same traceId.\n     * Must be read from incoming headers or generated according to the W3C TraceContext specification,\n     * in a hex representation of 16-byte array. A.k.a. trace-id, TraceID or Distributed TraceID\n     */\n    getTraceId(): string;\n\n    /**\n     * Set the unique identifier for a trace. All requests / spans from the same trace share the same traceId.\n     * Must be conform to the W3C TraceContext specification, in a hex representation of 16-byte array.\n     * A.k.a. trace-id, TraceID or Distributed TraceID https://www.w3.org/TR/trace-context/#trace-id\n     *\n     * @remarks Sets the traceId for the current context AND all parent contexts, if you want to set the traceId\n     * for the current context only, use the `traceId` property.\n     * @param newValue - The traceId to set\n     * @deprecated Use the `traceId` property to avoid the side effect of changing the traceId of all\n     * parent contexts.\n     */\n    setTraceId(newValue: string): void;\n\n    /**\n     * Self-generated 8-bytes identifier of the incoming request. Must be a hex representation of 8-byte array.\n     * Also know as the parentId, used to link requests together\n     */\n    getSpanId(): string;\n\n    /**\n     * Self-generated 8-bytes identifier of the incoming request. Must be a hex representation of 8-byte array.\n     * Also know as the parentId, used to link requests together\n     * https://www.w3.org/TR/trace-context/#parent-id\n     *\n     * @remarks Sets the spanId for the current context AND all parent contexts, if you want to set the spanId for\n     * the current context only, use the `spanId` property.\n     * @param newValue - The spanId to set\n     * @deprecated Use the `spanId` property to avoid the side effect of changing the spanId of all\n     * parent contexts.\n     */\n    setSpanId(newValue: string): void;\n\n    /**\n     * An integer representation of the W3C TraceContext trace-flags.\n     */\n    getTraceFlags(): number | undefined;\n\n    /**\n     * https://www.w3.org/TR/trace-context/#trace-flags\n     * @remarks Sets the trace flags for the current context and ALL  parent contexts, if you want to set the trace\n     * flags for the current context only, use the `traceFlags` property.\n     * @param newValue - An integer representation of the W3C TraceContext trace-flags.\n     * @deprecated Use the `traceFlags` property to avoid the side effect of changing the traceFlags of all\n     * parent contexts.\n     */\n    setTraceFlags(newValue?: number): void;\n\n    /**\n     * Returns the current name of the page\n     * @remarks This function updates the current context only, to update the name of the current and ALL parent contexts,\n     * use the `setName` method.\n     * @default undefined\n     * @since 3.4.0\n     */\n    pageName: string;\n\n    /**\n     * The current ID of the trace that this span belongs to. It is worldwide unique\n     * with practically sufficient probability by being made as 16 randomly\n     * generated bytes, encoded as a 32 lowercase hex characters corresponding to\n     * 128 bits.\n     * @remarks It is NOT recommended that you dynamically change this value after creation and it is actively\n     * being used as this may affect anyone accessing this context (as a parent for instance). You should logically\n     * treat this as readonly after creation.\n     * @remarks If you update this value, it will only update for the current context, not the parent context,\n     * if you need to update the current and ALL parent contexts, use the `setTraceId` method which\n     * provides the previous behavior.\n     * @since 3.4.0\n     */\n    traceId: string;\n\n    /**\n     * The ID of the Span. It is globally unique with practically sufficient\n     * probability by being made as 8 randomly generated bytes, encoded as a 16\n     * lowercase hex characters corresponding to 64 bits.\n     * If you update this value, it will only update for the current context, not the parent context.\n     * @remarks If you update this value, it will only update for the current context, not the parent context,\n     * if you need to update the current and ALL parent contexts, use the `setSpanId` method.\n     * @since 3.4.0\n     */\n    spanId: string;\n\n    /**\n     * Returns true if the current context was initialized (propagated) from a remote parent.\n     * @since 3.4.0\n     * @default false\n     * @returns True if the context was propagated from a remote parent\n     */\n    readonly isRemote: boolean;\n\n    /**\n     * Trace flags to propagate.\n     *\n     * It is represented as 1 byte (bitmap). Bit to represent whether trace is\n     * sampled or not. When set, the least significant bit documents that the\n     * caller may have recorded trace data. A caller who does not record trace\n     * data out-of-band leaves this flag unset.\n     *\n     * see {@link eW3CTraceFlags} for valid flag values.\n     *\n     * @remarks If you update this value, it will only update for the current context, not the parent context,\n     * if you need to update the current and ALL parent contexts, use the `setTraceFlags` method.\n     * @since 3.4.0\n     */\n    traceFlags?: number;\n   \n    /**\n     * Returns the current trace state which will be used to propgate context across different services.\n     * Updating (adding / removing keys) of the trace state will modify the current context.IOTelTraceState\n     * @remarks Unlike the OpenTelemetry {@link IOTelTraceState}, this value is a mutable object, so you can\n     * modify it directly you do not need to reassign the new value to this property.\n     * @since 3.4.0\n     */\n    readonly traceState: IW3cTraceState;\n\n    /**\n     * Provides access to the parent context of the current context.\n     * @remarks This is a read-only property, you cannot modify the parent context directly, you can only\n     * modify the current context. If you need to modify the parent context, you need to do it through the\n     * current context using the `setTraceId`, `setSpanId`, `setTraceFlags` and `setName` methods.\n     * @default null\n     * @since 3.4.0\n     */\n    readonly parentCtx?: IDistributedTraceContext | null;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IEventTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\n\nexport interface IEventTelemetry extends IPartC {\n    /**\n     * @description An event name string\n     */\n    name: string;\n\n    /**\n     * @description custom defined iKey\n     */\n    iKey?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IExceptionConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Configuration for extra exceptions information sent with the exception telemetry.\n * @example\n * ```js\n * const appInsights = new ApplicationInsights({\n      config: {\n          connectionString: 'InstrumentationKey=YOUR_INSTRUMENTATION_KEY_GOES_HERE',\n          expCfg: {\n              inclScripts: true,\n              expLog : () => {\n                  return {logs: [\"log info 1\", \"log info 2\"]};\n              },\n              maxLogs : 100\n          }\n      }\n  });\n  appInsights.trackException({error: new Error(), severityLevel: SeverityLevel.Critical});\n* ```\n * @interface IExceptionConfig\n */\nexport interface IExceptionConfig{\n    /**\n     * If set to true, when exception is sent out, the SDK will also send out all scripts basic info that are loaded on the page.\n     * Notice: This would increase the size of the exception telemetry.\n     * @defaultvalue true\n     */\n    inclScripts?: boolean;\n\n    /**\n     * Callback function for collecting logs to be included in telemetry data.\n     *\n     * The length of logs to generate is controlled by the `maxLogs` parameter.\n     *\n     * This callback is called before telemetry data is sent, allowing for dynamic customization of the logs.\n     *\n     * @returns An object with the following property:\n     * - logs: An array of strings, where each string represents a log entry to be included in the telemetry.\n     *\n     * @property maxLogs - Specifies the maximum number of logs that can be generated. If not explicitly set, it defaults to 50.\n     */\n    expLog?: () => { logs: string[] },\n\n    /**\n     * The maximum number of logs to include in the telemetry data.\n     * If not explicitly set, it defaults to 50.\n     * This is used in conjunction with the `expLog` callback.\n     */\n    maxLogs?: number\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IExceptionTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\nimport { SeverityLevel } from \"./contracts/SeverityLevel\";\n\n/**\n * @export\n * @interface IExceptionTelemetry\n * @description Exception interface used as primary parameter to trackException\n */\nexport interface IExceptionTelemetry extends IPartC {\n    /**\n     * Unique guid identifying this error\n     */\n    id?: string;\n\n    /**\n     * @deprecated Please use the `exception` field instead. The behavior and usage of `exception` remains the same as this field.\n     * Unique guid identifying this error.\n     */\n    error?: Error;\n\n    /**\n     * @description Error Object(s)\n     */\n    exception?: Error | IAutoExceptionTelemetry;\n\n    /**\n     * @description Specified severity of exception for use with\n     * telemetry filtering in dashboard\n     */\n    severityLevel?: SeverityLevel | number;\n}\n\n/**\n * @description window.onerror function parameters\n * @export\n * @interface IAutoExceptionTelemetry\n */\nexport interface IAutoExceptionTelemetry {\n    /**\n     * @description error message. Available as event in HTML onerror=\"\" handler\n     */\n    message: string;\n\n    /**\n     * @description URL of the script where the error was raised\n     */\n    url: string;\n\n    /**\n     * @description Line number where error was raised\n     */\n    lineNumber: number;\n\n    /**\n     * @description Column number for the line where the error occurred\n     */\n    columnNumber: number;\n\n    /**\n     * @description Error Object (object)\n     */\n    error: any;\n    \n    /**\n     * @description The event at the time of the exception (object)\n     */\n    evt?: Event|string;\n\n    /**\n     * @description The provided stack for the error\n     */\n    stackDetails?: IStackDetails;\n\n    /**\n     * @description The calculated type of the error\n     */\n    typeName?: string;\n\n    /**\n     * @description The descriptive source of the error\n     */\n    errorSrc?: string;\n}\n\nexport interface IExceptionInternal extends IPartC {\n    ver: string;\n    id: string;\n    exceptions: IExceptionDetailsInternal[];\n    severityLevel?: SeverityLevel | number;\n    problemGroup: string;\n    isManual: boolean;\n}\n\nexport interface IExceptionDetailsInternal {\n    id: number;\n    outerId: number;\n    typeName: string;\n    message: string;\n    hasFullStack: boolean;\n    stack: string;\n    parsedStack: IExceptionStackFrameInternal[];\n}\n\nexport interface IExceptionStackFrameInternal {\n    level: number;\n    method: string;\n    assembly: string;\n    fileName: string;\n    line: number;\n    pos?: number;\n}\n\nexport interface IStackDetails {\n    src: string,\n    obj: string[],\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IFeatureOptIn.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { FeatureOptInMode } from \"../../enums/ai/FeatureOptInEnums\";\n\nexport interface IFeatureOptInDetails {\n    /**\n     * sets feature opt-in mode\n     * @default undefined\n     */\n    mode?: FeatureOptInMode;\n    /**\n     * Identifies configuration override values when given feature is enabled\n     * NOTE: should use flat string for fields, for example, if you want to set value for extensionConfig.Ananlytics.disableAjaxTrackig in configurations,\n     * you should use \"extensionConfig.Ananlytics.disableAjaxTrackig\" as field name: \\{[\"extensionConfig.Analytics.disableAjaxTrackig\"]:1\\}\n     * @default undefined\n     */\n    onCfg?: {[field: string]: any};\n    /**\n     * Identifies configuration override values when given feature is disabled\n     * NOTE: should use flat string for fields, for example, if you want to set value for extensionConfig.Ananlytics.disableAjaxTrackig in configurations,\n     * you should use \"extensionConfig.Ananlytics.disableAjaxTrackig\" as field name: \\{[\"extensionConfig.Analytics.disableAjaxTrackig\"]:1\\}\n     * @default undefined\n     */\n    offCfg?: {[field: string]: any};\n    /**\n     * define if should block any changes from cdn cfg, if set to true, cfgValue will be applied under all scenarios\n     * @default false\n     */\n    blockCdnCfg?: boolean;\n}\n\nexport interface IFeatureOptIn {[feature: string]: IFeatureOptInDetails}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IInstrumentHooks.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IUnloadHook } from \"./IUnloadHook\";\n\n/**\n * A callback function that will be called for the wrapped instrumentation function\n * before the original function is executed.\n */\nexport type InstrumentorHooksCallback = (funcArgs:IInstrumentCallDetails, ...orgArgs: any[]) => void;\n\n/**\n * The callbacks to call for the instrumented function, you must provide at least the request and/or response callbacks, both are not required.\n * You must always supply the error callback\n */\nexport interface IInstrumentHooksCallbacks {\n    /**\n     * [Optional] Namespace details (same as the namespace used for events), useful for debugging and testing to\n     * identify the source of the instrumented hooks\n     */\n    ns?: string | string[];\n\n    /**\n     * The hook callback to call before the original function is called\n     */\n    req?: InstrumentorHooksCallback;\n\n    /**\n     * The hook callback to call after the original function was called\n     */\n    rsp?: InstrumentorHooksCallback;\n\n    /**\n     * The callback to call if the hook function causes an exception\n     */\n    hkErr?: InstrumentorHooksCallback;\n\n    /**\n     * The callback to call if the original function causes an exception, even if you\n     * supply a callback the original exception will still be thrown\n     */\n    fnErr?: InstrumentorHooksCallback;\n}\n\n/**\n * The holder of the specific instance callback\n */\nexport interface IInstrumentHook extends IUnloadHook {\n    /** Unique Id for this callback on the hooked method */\n    id: number;\n\n    /** Holds the callbacks */\n    cbks: IInstrumentHooksCallbacks;\n\n    /** Remove this hook from the function */\n    rm: () => void;\n}\n\nexport interface IInstrumentHooks {\n    i: number;               // Used to create unique ids\n    n: string;               // Function name\n    f: any;                  // Original Function\n    h: IInstrumentHook[];    // The hook\n}\n\nexport interface IInstrumentCallDetails {\n    name: string;\n    inst: any;\n\n    /**\n     * This returns an object that the hook function can use to store hook specific\n     * context, it it not shared with any other hook instances and is unique for the\n     * current call.\n     * A hook implementation can use this to pass / share context between different\n     * hook callbacks eg. request/response requst/hookErrors etc.\n     */\n    ctx: () => any;\n\n    /**\n     * Allows the hook functions to replace the original arguments\n     * @param idx - The argument index (0 based)\n     * @param value - The new value for the argument\n     */\n    set: (idx:number, value:any) => void;\n\n    /**\n     * The result of the original method, only populated after the original method has returned\n     */\n    rslt?: any;\n\n    /**\n     * The error (exception) which occurred while executing the original method\n     */\n    err?: Error;\n\n    /**\n     * The Event object from (window.event) at the start of the original call\n     */\n    evt?: Event;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IMetricTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IMetricTelemetry extends IPartC {\n    /**\n     * @description (required) - name of this metric\n     */\n    name: string;\n\n    /**\n     * @description (required) - Recorded value/average for this metric\n     */\n    average: number;\n\n    /**\n     * @description (optional) Number of samples represented by the average.\n     * @default sampleCount=1\n     */\n    sampleCount?: number;\n\n    /**\n     * @description (optional) The smallest measurement in the sample. Defaults to the average\n     * @default min=average\n     */\n    min?: number;\n\n    /**\n     * @description (optional) The largest measurement in the sample. Defaults to the average.\n     * @default max=average\n     */\n    max?: number;\n\n    /**\n     * (optional) The standard deviation measurement in the sample, Defaults to undefined which results in zero.\n     */\n    stdDev?: number;\n\n     /**\n     * @description custom defined iKey\n     */\n    iKey?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/INetworkStatsbeat.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * The interface for the network stats beat plugin, which is responsible for collecting\n * and sending statistics about network requests. It is used to track the performance\n * and usage of network requests, and to identify any issues or errors that may occur.\n */\nexport interface INetworkStatsbeat {\n    host: string;\n    totalRequest: number;\n    success: number;\n    throttle: Record<number, number>;\n    failure: Record<number, number>;\n    retry: Record<number, number>;\n    exception: Record<string, number>;\n    requestDuration: number;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/INotificationListener.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { IPerfEvent } from \"./IPerfEvent\";\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { IPayloadData } from \"./IXHROverride\";\n\n/**\n * An interface used for the notification listener.\n * @interface\n */\nexport interface INotificationListener {\n    /**\n     * [Optional] A function called when events are sent.\n     * @param events - The array of events that have been sent.\n     */\n    eventsSent?: (events: ITelemetryItem[]) => void;\n    /**\n     * [Optional] A function called when events are discarded.\n     * @param events - The array of events that have been discarded.\n     * @param reason - The reason for discarding the events. The EventsDiscardedReason\n     * constant should be used to check the different values.\n     * @param sendType - [Optional] The send type used when the events were discarded.\n     */\n    eventsDiscarded?: (events: ITelemetryItem[], reason: number, sendType?: number) => void;\n\n    /**\n     * [Optional] A function called when the events have been requested to be sent to the sever.\n     * @param sendReason - The reason why the event batch is being sent.\n     * @param isAsync - A flag which identifies whether the requests are being sent in an async or sync manner.\n     */\n    eventsSendRequest?: (sendReason: number, isAsync?: boolean) => void;\n\n    /**\n     * [Optional] This event is sent if you have enabled perf events, they are primarily used to track internal performance testing and debugging\n     * the event can be displayed via the debug plugin extension.\n     * @param perfEvent - The performance event object\n     */\n    perfEvent?: (perfEvent: IPerfEvent) => void;\n\n    /**\n     * Unload and remove any state that this INotificationListener may be holding, this is generally called when the\n     * owning Manager is being unloaded.\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @returns If the unload occurs synchronously then nothing should be returned, if happening asynchronously then\n     * the function should return an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * / Promise to allow any listeners to wait for the operation to complete.\n     */\n    unload?(isAsync?: boolean): void | IPromise<void>;\n\n    /**\n     * [Optional] A function called when the offline events have been stored to the persistent storage\n     * @param events - items that are stored in the persistent storage\n     * @since v3.1.1\n     */\n    offlineEventsStored?(events: ITelemetryItem[]): void;\n    \n    /**\n     * [Optional] A function called when the offline events have been sent from the persistent storage\n     * @param batch - payload data that is sent from the persistent storage\n     * @since v3.1.1\n     */\n    offlineBatchSent?(batch: IPayloadData): void;\n    \n    /**\n     * [Optional] A function called when the offline events have been dropped from the persistent storage\n     * @param cnt - count of batches dropped\n     * @param reason - the reason why the batches is dropped\n     * @since v3.1.1\n     */\n    offlineBatchDrop?(cnt: number, reason?: number): void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/INotificationManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { INotificationListener } from \"./INotificationListener\";\nimport { IPerfEvent } from \"./IPerfEvent\";\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { IPayloadData } from \"./IXHROverride\";\n\n/**\n * Class to manage sending notifications to all the listeners.\n */\nexport interface INotificationManager {\n    listeners: INotificationListener[];\n\n    /**\n     * Adds a notification listener.\n     * @param listener - The notification listener to be added.\n     */\n    addNotificationListener(listener: INotificationListener): void;\n\n    /**\n     * Removes all instances of the listener.\n     * @param listener - AWTNotificationListener to remove.\n     */\n    removeNotificationListener(listener: INotificationListener): void;\n\n    /**\n     * Notification for events sent.\n     * @param events - The array of events that have been sent.\n     */\n    eventsSent(events: ITelemetryItem[]): void;\n\n    /**\n     * Notification for events being discarded.\n     * @param events - The array of events that have been discarded by the SDK.\n     * @param reason - The reason for which the SDK discarded the events. The EventsDiscardedReason\n     * constant should be used to check the different values.\n     * @param sendType - [Optional] The send type used when the events were discarded.\n     */\n    eventsDiscarded(events: ITelemetryItem[], reason: number, sendType?: number): void;\n\n    /**\n     * [Optional] A function called when the events have been requested to be sent to the sever.\n     * @param sendReason - The reason why the event batch is being sent.\n     * @param isAsync - A flag which identifies whether the requests are being sent in an async or sync manner.\n     */\n    eventsSendRequest?(sendReason: number, isAsync: boolean): void;\n\n    /**\n     * [Optional] This event is sent if you have enabled perf events, they are primarily used to track internal performance testing and debugging\n     * the event can be displayed via the debug plugin extension.\n     * @param perfEvent - The perf event details\n     */\n    perfEvent?(perfEvent: IPerfEvent): void;\n\n    /**\n     * Unload and remove any state that this INotificationManager may be holding, this is generally called when the\n     * owning SDK is being unloaded.\n     * @param isAsync - Can the unload be performed asynchronously (default)\n     * @returns If the unload occurs synchronously then nothing should be returned, if happening asynchronously then\n     * the function should return an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\n     * / Promise to allow any listeners to wait for the operation to complete.\n     */\n    unload?(isAsync?: boolean): void | IPromise<void>;\n\n    /**\n     * [Optional] A function called when the offline events have been stored to the persistent storage\n     * @param events - items that are stored in the persistent storage\n     * @since v3.1.1\n     */\n    offlineEventsStored?(events: ITelemetryItem[]): void;\n\n    /**\n     * [Optional] A function called when the offline events have been sent from the persistent storage\n     * @param batch - payload data that is sent from the persistent storage\n     * @since v3.1.1\n     */\n    offlineBatchSent?(batch: IPayloadData): void;\n\n    /**\n     * [Optional] A function called when the offline events have been dropped from the persistent storage\n     * @param cnt - count of batches dropped\n     * @param reason - the reason why the batches is dropped\n     * @since v3.1.1\n     */\n    offlineBatchDrop?(cnt: number, reason?: number): void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IPageViewPerformanceTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\n\nexport interface IPageViewPerformanceTelemetry extends IPartC {\n    /**\n     * name String - The name of the page. Defaults to the document title.\n     */\n    name?: string;\n\n    /**\n     * url String - a relative or absolute URL that identifies the page or other item. Defaults to the window location.\n     */\n    uri?: string;\n    /**\n     * Performance total in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\". This is total duration in timespan format.\n     */\n    perfTotal?: string;\n    /**\n     * Performance total in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\". This represents the total page load time.\n     */\n    duration?: string;\n    /**\n     * Sent request time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    networkConnect?: string;\n    /**\n     * Sent request time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff.\n     */\n    sentRequest?: string;\n    /**\n     * Received response time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff.\n     */\n    receivedResponse?: string;\n    /**\n     * DOM processing time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    domProcessing?: string;\n}\n\nexport interface IPageViewPerformanceTelemetryInternal extends IPageViewPerformanceTelemetry {\n    /**\n     * An identifier assigned to each distinct impression for the purposes of correlating with pageview.\n     * A new id is automatically generated on each pageview. You can manually specify this field if you\n     * want to use a specific value instead.\n     */\n    id?: string;\n    /**\n     * Version of the part B schema, todo: set this value in trackpageView\n     */\n    ver?: string;\n    /**\n     * Field indicating whether this instance of PageViewPerformance is valid and should be sent\n     */\n    isValid?: boolean;\n    /**\n     * Duration in miliseconds\n     */\n    durationMs?: number;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IPageViewTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Pageview telemetry interface\n */\nexport interface IPageViewTelemetry extends IPartC {\n    /**\n     * name String - The string you used as the name in startTrackPage. Defaults to the document title.\n     */\n    name?: string;\n\n    /**\n     * uri  String - a relative or absolute URL that identifies the page or other item. Defaults to the window location.\n     */\n    uri?: string;\n\n    /**\n     * refUri  String - the URL of the source page where current page is loaded from\n     */\n    refUri?: string;\n\n    /**\n     * pageType  String - page type\n     */\n    pageType?: string;\n\n    /**\n     * isLoggedIn - boolean is user logged in\n     */\n    isLoggedIn?: boolean;\n\n    /**\n     * Property bag to contain additional custom properties (Part C)\n     */\n    properties?: {\n        /**\n         * The number of milliseconds it took to load the page. Defaults to undefined. If set to default value, page load time is calculated internally.\n         */\n        duration?: number;\n        [key: string]: any;\n    };\n\n     /**\n     * iKey String - custom defined iKey.\n     */\n      iKey?: string;\n\n    /**\n     * Time first page view is triggered\n    */\n    startTime?: Date;\n}\n\n\nexport interface IPageViewTelemetryInternal extends IPageViewTelemetry {\n    /**\n     * An identifier assigned to each distinct impression for the purposes of correlating with pageview.\n     * A new id is automatically generated on each pageview. You can manually specify this field if you\n     * want to use a specific value instead.\n     */\n    id?: string;\n\n    /**\n     * Version of the part B schema, todo: set this value in trackpageView\n     */\n    ver?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IPartC.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * PartC  telemetry interface\n */\nexport interface IPartC {\n    /**\n     * Property bag to contain additional custom properties (Part C)\n     */\n    properties?: { [key: string]: any };\n\n    /**\n     * Property bag to contain additional custom measurements (Part C)\n     * @deprecated -- please use properties instead\n     */\n    measurements?: { [key: string]: number };\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IPerfEvent.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * This interface identifies the details of an internal performance event - it does not represent an outgoing reported event\n */\nexport interface IPerfEvent {\n    /**\n     * The name of the performance event\n     */\n    name: string;\n\n    /**\n     * The start time of the performance event\n     */\n    start: number;\n\n    /**\n     * The payload (contents) of the perfEvent, may be null or only set after the event has completed depending on\n     * the runtime environment.\n     */\n    payload: any;\n\n    /**\n     * Is this occurring from an asynchronous event\n     */\n    isAsync: boolean;\n    \n    /**\n     * Identifies the total inclusive time spent for this event, including the time spent for child events,\n     * this will be undefined until the event is completed\n     */\n    time?: number;\n\n    /**\n     * Identifies the exclusive time spent in for this event (not including child events),\n     * this will be undefined until the event is completed.\n     */\n    exTime?: number;\n    /**\n     * The Parent event that was started before this event was created\n     */\n    parent?: IPerfEvent;\n\n    /**\n     * The child perf events that are contained within the total time of this event.\n     */\n    childEvts?: IPerfEvent[];\n\n    /**\n     * Identifies whether this event is a child event of a parent\n     */\n    isChildEvt: () => boolean;\n\n    /**\n     * Get the names additional context associated with this perf event\n     */\n    getCtx?: (key: string) => any;\n\n    /**\n     * Set the named additional context to be associated with this perf event, this will replace any existing value\n     */\n    setCtx?: (key: string, value: any) => void;\n\n    /**\n     * Mark this event as completed, calculating the total execution time.\n     */\n    complete: () => void;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IPerfManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IPerfEvent } from \"./IPerfEvent\";\n\n/**\n * Identifies an interface to a host that can provide an IPerfManager implementation\n */\nexport interface IPerfManagerProvider {\n    /**\n     * Get the current performance manager\n     */\n    getPerfMgr(): IPerfManager;\n\n    /**\n     * Set the current performance manager\n     * @param perfMgr - The performance manager\n     */\n    setPerfMgr(perfMgr: IPerfManager): void;\n}\n\n/**\n * This defines an internal performance manager for tracking and reporting the internal performance of the SDK -- It does\n * not represent or report any event to the server.\n */\nexport interface IPerfManager {\n    /**\n     * Create a new event and start timing, the manager may return null/undefined to indicate that it does not\n     * want to monitor this source event.\n     * @param src - The source name of the event\n     * @param payloadDetails - An optional callback function to fetch the payload details for the event.\n     * @param isAsync - Is the event occurring from a async event\n     */\n    create(src: string, payloadDetails?: () => any, isAsync?: boolean): IPerfEvent | null | undefined;\n\n    /**\n     * Complete the perfEvent and fire any notifications.\n     * @param perfEvent - Fire the event which will also complete the passed event\n     */\n    fire(perfEvent: IPerfEvent): void;\n\n    /**\n     * Set an execution context value\n     * @param key - The context key name\n     * @param value - The value\n     */\n    setCtx(key: string, value: any): void;\n\n    /**\n     * Get the execution context value\n     * @param key - The context key\n     */\n    getCtx(key: string): any;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IProcessTelemetryContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport { IConfigDefaults } from \"../config/IConfigDefaults\";\nimport { IAppInsightsCore } from \"./IAppInsightsCore\";\nimport { IConfiguration } from \"./IConfiguration\";\nimport { IDiagnosticLogger } from \"./IDiagnosticLogger\";\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { IPlugin, ITelemetryPlugin } from \"./ITelemetryPlugin\";\nimport { ITelemetryPluginChain } from \"./ITelemetryPluginChain\";\nimport { ITelemetryUnloadState } from \"./ITelemetryUnloadState\";\nimport { ITelemetryUpdateState } from \"./ITelemetryUpdateState\";\n\n// export const enum GetExtCfgMergeType {\n//     None = 0,\n//     MergeDefaultOnly = 1,\n//     MergeDefaultFromRootOrDefault = 2,\n// }\n\nexport interface IBaseProcessingContext {\n    /**\n     * The current core instance for the request\n     */\n    core: () => IAppInsightsCore;\n\n    /**\n     * THe current diagnostic logger for the request\n     */\n    diagLog: () => IDiagnosticLogger;\n\n    /**\n     * Gets the current core config instance\n     */\n    getCfg: () => IConfiguration;\n\n    /**\n     * Gets the named extension configuration\n     * @param identifier - The named extension identifier\n     * @param defaultValue - The default value(s) to return if no defined config exists\n     * @param rootOnly - If true, only the look for the configuration in the top level and not in the \"extensionConfig\"\n     */\n    getExtCfg: <T>(identifier: string, defaultValue?: IConfigDefaults<T>, rootOnly?: boolean) => T;\n\n    /**\n     * Gets the named config from either the named identifier extension or core config if neither exist then the\n     * default value is returned\n     * @param identifier - The named extension identifier\n     * @param field - The config field name\n     * @param defaultValue - The default value to return if no defined config exists\n     */\n    getConfig: (identifier: string, field: string, defaultValue?: number | string | boolean | string[] | RegExp[] | Function) => number | string | boolean | string[] | RegExp[] | Function;\n\n    /**\n     * Helper to allow plugins to check and possibly shortcut executing code only\n     * required if there is a nextPlugin\n     */\n    hasNext: () => boolean;\n\n    /**\n     * Returns the next configured plugin proxy\n     */\n    getNext: () => ITelemetryPluginChain;\n\n    /**\n     * Helper to set the next plugin proxy\n     */\n    setNext: (nextCtx: ITelemetryPluginChain) => void;\n\n    /**\n     * Synchronously iterate over the context chain running the callback for each plugin, once\n     * every plugin has been executed via the callback, any associated onComplete will be called.\n     * @param callback - The function call for each plugin in the context chain\n     */\n    iterate: <T extends ITelemetryPlugin = ITelemetryPlugin>(callback: (plugin: T) => void) => void;\n\n    /**\n     * Set the function to call when the current chain has executed all processNext or unloadNext items.\n     * @param onComplete - The onComplete to call\n     * @param that - The \"this\" value to use for the onComplete call, if not provided or undefined defaults to the current context\n     * @param args - Any additional arguments to pass to the onComplete function\n     */\n    onComplete: (onComplete: () => void, that?: any, ...args: any[]) => void;\n\n    /**\n     * Create a new context using the core and config from the current instance, returns a new instance of the same type\n     * @param plugins - The execution order to process the plugins, if null or not supplied\n     *                  then the current execution order will be copied.\n     * @param startAt - The plugin to start processing from, if missing from the execution\n     *                  order then the next plugin will be NOT set.\n     */\n    createNew: (plugins?: IPlugin[] | ITelemetryPluginChain, startAt?: IPlugin) => IBaseProcessingContext;\n}\n\n/**\n * The current context for the current call to processTelemetry(), used to support sharing the same plugin instance\n * between multiple AppInsights instances\n */\nexport interface IProcessTelemetryContext extends IBaseProcessingContext {\n    /**\n     * Call back for telemetry processing before it it is sent\n     * @param env - This is the current event being reported\n     * @returns boolean (true) if there is no more plugins to process otherwise false or undefined (void)\n     */\n    processNext: (env: ITelemetryItem) => boolean | void;\n\n    /**\n     * Create a new context using the core and config from the current instance, returns a new instance of the same type\n     * @param plugins - The execution order to process the plugins, if null or not supplied\n     *                  then the current execution order will be copied.\n     * @param startAt - The plugin to start processing from, if missing from the execution\n     *                  order then the next plugin will be NOT set.\n     */\n     createNew: (plugins?: IPlugin[] | ITelemetryPluginChain, startAt?: IPlugin) => IProcessTelemetryContext;\n}\n\n/**\n * The current context for the current call to teardown() implementations, used to support when plugins are being removed\n * or the SDK is being unloaded.\n */\nexport interface IProcessTelemetryUnloadContext extends IBaseProcessingContext {\n\n    /**\n     * This Plugin has finished unloading, so unload the next one\n     * @param uploadState - The state of the unload process\n     * @returns boolean (true) if there is no more plugins to process otherwise false or undefined (void)\n     */\n    processNext: (unloadState: ITelemetryUnloadState) => boolean | void;\n\n    /**\n     * Create a new context using the core and config from the current instance, returns a new instance of the same type\n     * @param plugins - The execution order to process the plugins, if null or not supplied\n     *                  then the current execution order will be copied.\n     * @param startAt - The plugin to start processing from, if missing from the execution\n     *                  order then the next plugin will be NOT set.\n     */\n     createNew: (plugins?: IPlugin[] | ITelemetryPluginChain, startAt?: IPlugin) => IProcessTelemetryUnloadContext;\n}\n\n/**\n * The current context for the current call to the plugin update() implementations, used to support the notifications\n * for when plugins are added, removed or the configuration was changed.\n */\nexport interface IProcessTelemetryUpdateContext extends IBaseProcessingContext {\n    /**\n     * This Plugin has finished unloading, so unload the next one\n     * @param updateState - The update State\n     * @returns boolean (true) if there is no more plugins to process otherwise false or undefined (void)\n     */\n    processNext: (updateState: ITelemetryUpdateState) => boolean | void;\n\n    /**\n     * Create a new context using the core and config from the current instance, returns a new instance of the same type\n     * @param plugins - The execution order to process the plugins, if null or not supplied\n     *                  then the current execution order will be copied.\n     * @param startAt - The plugin to start processing from, if missing from the execution\n     *                  order then the next plugin will be NOT set.\n     */\n     createNew: (plugins?: IPlugin[] | ITelemetryPluginChain, startAt?: IPlugin) => IProcessTelemetryUpdateContext;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IPropertiesPlugin.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ITelemetryContext } from \"./ITelemetryContext\";\n\nexport interface IPropertiesPlugin {\n    readonly context: ITelemetryContext;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IRequestContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IRequestContext {\n    status?: number;\n    xhr?: XMLHttpRequest;\n    request?: Request; // fetch request\n    response?: Response | string; // fetch response\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IRequestTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\n\n/**\n * This defines the contract for request telemetry items that are passed to Application Insights API (track)\n */\nexport interface IRequestTelemetry extends IPartC {\n    /**\n     * Identifier of a request call instance. Used for correlation between request and other telemetry items.\n     */\n    id: string;\n\n    /**\n     * Name of the request. Represents code path taken to process request. Low cardinality value to allow better grouping of requests. For HTTP requests it represents the HTTP method and URL path template like 'GET /values/\\{id\\}'.\n     */\n    name?: string;\n\n    /**\n     * Request duration in milliseconds.\n     */\n    duration: number;\n\n    /**\n     * Indication of successful or unsuccessful call.\n     */\n    success: boolean;\n\n    /**\n     * Result of a request execution. HTTP status code for HTTP requests.\n     */\n    responseCode: number;\n\n    /**\n     * Source of the request. Examples are the instrumentation key of the caller or the ip address of the caller.\n     */\n    source?: string;\n\n    /**\n     * Request URL with all query string parameters.\n     */\n    url?: string;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ISenderPostManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ITimerHandler } from \"@nevware21/ts-utils\";\nimport { TransportType } from \"../../enums/ext/Enums\";\nimport { IXDomainRequest } from \"./IXDomainRequest\";\nimport { IPayloadData, IXHROverride, OnCompleteCallback } from \"./IXHROverride\";\n\n/**\n * internal interface\n * Define functions when xhr/xdr/fetch requests are successfully returned. If they are not defined, oncomplete with be called instead\n * @internal for internal use only\n */\nexport interface _ISenderOnComplete {\n    /**\n     * defined xdr onload function to handle response\n     * @param dxr - xdr request object\n     * @param oncomplete - oncomplete function\n     * @since version after 3.1.0\n     */\n    xdrOnComplete?(xdr: IXDomainRequest, onComplete: OnCompleteCallback, payload?: IPayloadData): void;\n    /**\n     * defined fetch on complete function to handle response\n     * @param response - response object\n     * @param onComplete - oncomplete function\n     * @param resValue - response.text().value\n     * @since version after 3.1.0\n     */\n    fetchOnComplete?(response: Response, onComplete: OnCompleteCallback, resValue?: string, payload?: IPayloadData): void;\n    /**\n     * defined xhr onreadystatechange function to handle response\n     * @param request - request object\n     * @param oncomplete - oncomplete function\n     * @since version after 3.1.0\n     */\n    xhrOnComplete?(request: XMLHttpRequest, onComplete: OnCompleteCallback, payload?: IPayloadData):void;\n\n    /**\n     * Define functions during beacon can not send payload after first attempt. If not defined, will be apyload will be retried with fallback sender.\n     * @param data - payload data\n     * @param onComplete - oncomplete function\n     * @param canSend - can the current data sent by beacon sender\n     * @since version after 3.1.0\n     */\n    beaconOnRetry?(data: IPayloadData, onComplete: OnCompleteCallback, canSend:(payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => boolean): void;\n}\n\n/**\n * Internal interface for SendPostMnager\n * @internal for internal use only\n */\nexport interface _ISendPostMgrConfig {\n    /**\n     * Enable the sender interface to return a promise\n     * Note: Enabling this may cause unhandled promise rejection errors to occur if you do not listen and handle any rejection response,\n     * Defaults to false\n     * @since version after 3.1.0\n     */\n    enableSendPromise?: boolean,\n    /**\n     * Identifies if the sender is 1ds post channel\n     * Default is false\n     * @since version after 3.1.0\n     */\n    isOneDs?: boolean,\n    /**\n     * Identify if Credentials should be disabled for 1ds post channel, application insights sender will igore this config\n     * Default is false\n     * @since version after 3.1.0\n     */\n    disableCredentials?: boolean;\n\n    /**\n     * Identifies if `XMLHttpRequest` or `XDomainRequest` (for IE version before 9) should be used\n     * Default: false\n     * @since 3.1.1\n     */\n    disableXhr?: boolean;\n    \n    /**\n     * Is beacon disabled during async sending\n     * Default: false\n     * @since version after 3.1.0\n     */\n    disableBeacon?: boolean;\n  \n    /**\n     * Is beacon disabled during sync sending\n     * Default: false\n     * @since version after 3.1.0\n     */\n    disableBeaconSync?: boolean;\n\n    /**\n     * Is FetchKeepAlive disabled during sync sending\n     * Default: false\n     * @since version after 3.1.0\n     */\n    disableFetchKeepAlive?: boolean\n\n    /**\n     * Identifies functions when xhr/xdr/fetch requests are successfully returned. If they are not defined, oncomplete with be called instead\n     * @since version after 3.1.0\n     */\n    senderOnCompleteCallBack?: _ISenderOnComplete;\n\n    /**\n     * time wrapper to handle payload timeout\n     * this is for 1ds post channel only\n     * Default: null\n     * @since version after 3.1.0\n     */\n    timeWrapper?: _ITimeoutOverrideWrapper;\n    \n    /**\n     * [Optional] flag to indicate whether the sendBeacon and fetch (with keep-alive flag) should add the \"NoResponseBody\" query string\n     * value to indicate that the server should return a 204 for successful requests. Defaults to true\n     * this is for 1ds post channel only\n     * Default: true\n     * @since version after 3.1.0\n     */\n    addNoResponse?: boolean;\n\n    /**\n     * [Optional] Specify whether cross-site Access-Control fetch requests should include credentials such as cookies,\n     * authentication headers, or TLS client certificates.\n     *\n     * Possible values:\n     * - \"omit\": never send credentials in the request or include credentials in the response.\n     * - \"include\": always include credentials, even cross-origin.\n     * - \"same-origin\": only send and include credentials for same-origin requests.\n     *\n     * If not set, the default value will be \"include\".\n     *\n     * For more information, refer to:\n     * - [Fetch API - Using Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#including_credentials)\n     * @since version after 3.3.1\n     */\n    fetchCredentials?: RequestCredentials;\n\n}\n\n/**\n* Internal interface\n* Simple internal timeout wrapper\n* @internal\n* @since version after 3.1.0\n*/\nexport interface _ITimeoutOverrideWrapper {\n    set: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => ITimerHandler;\n}\n\n\n/**\n* Internal interface\n* internal sendpost interface\n* @internal\n* @since version after 3.1.0\n*/\nexport interface _IInternalXhrOverride extends IXHROverride {\n    _transport?: TransportType;\n    _isSync?: boolean;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IStatsBeat.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { StatsType } from \"../../enums/ai/StatsType\";\nimport { IPayloadData } from \"./IXHROverride\";\n\n/**\n * The interface for the stats beat plugin, which is responsible for collecting and sending statistics about the SDK.\n * It is used to track the performance and usage of the SDK, and to identify any issues or errors that may occur.\n * @since 3.3.7\n */\nexport interface IStatsBeat {\n    /**\n     * Returns whether this instance of the stats beat is enabled or not.\n     * @returns True if the stats beat is enabled, false otherwise.\n     */\n    enabled: boolean;\n\n    /**\n     * Return the current endpoint where the stats beat is sending events.\n     * @returns The current endpoint URL.\n     */\n    endpoint: string;\n\n    /**\n     * Returns the StatsType for this instance of the stats beat.\n     * @returns The current stats type.\n     */\n    type: StatsType;\n\n    /**\n     * Count the number of events sent to the endpoint with the given status code.\n     * @param status - The status code of the event.\n     * @param payloadData - The payload data of the event.\n     * @param endpoint - The endpoint where the event was sent.\n     */\n    count(status: number, payloadData: IPayloadData, endpoint: string): void;\n\n    /**\n     * Record an exception for the given endpoint and exception type.\n     * @param endpoint  - The endpoint where the exception occurred.\n     * @param exceptionType - The type of the exception.\n     */\n    countException(endpoint: string, exceptionType: string): void;\n}\n\n/**\n * The configuration passed to the stats beat plugin to record statistics about the SDK\n * @since 3.3.7\n */\nexport interface IStatsBeatState {\n    /**\n     * The current instrumentation key.\n     */\n    cKey: string;\n\n    /**\n     * The current endpoint where the events are sent.\n     */\n    endpoint: string;\n\n    /**\n     * The current Sdk version.\n     */\n    sdkVer?: string;\n\n    /**\n     * The type of the stats event.\n     */\n    type?: StatsType;\n}\n\n/**\n * The configuration for the collection of supported endpoints\n * @since 3.3.7\n */\nexport interface IStatsBeatKeyMap {\n    /**\n     * The key to used to for any matching endpoints.\n     */\n    key?: string;\n\n    /**\n     * An array of string URLs that are supported by the endpoint,\n     * the string values are used to compar against the endpoint URL\n     * in a case insensitive manner. The values may also contain wildcards\n     * characters \"*\", \"**\" and \"?\" to match any number of characters using\n     * a glob style pattern.\n     */\n    match: string[];\n}\n\n/**\n * The configuration for the stats beat plugin, which is used to track the performance and usage of the SDK.\n * It is used to identify any issues or errors that may occur, and to provide insights into the usage of the SDK.\n * @since 3.3.7\n */\nexport interface IStatsEndpointConfig {\n    /**\n     * Identifies the key(s) associated with the endpoints for the type of stats event.\n     */\n    type: StatsType;\n\n    /**\n     * The matching endpoints.\n     */\n    keyMap?: IStatsBeatKeyMap[]\n}\n\n/**\n * The configuration for the stats beat definition\n * @since 3.3.7\n */\nexport interface IStatsBeatConfig {\n    /**\n     * The short collection interval in seconds to send the stats beat events.\n     * Default: 15 min\n     */\n    shrtInt?: number;\n    \n    /**\n     * The Endpoint configurations for the stats beat plugin.\n     * This is used to identify the endpoints that are supported by the stats beat plugin.\n     */\n    endCfg?: IStatsEndpointConfig[];\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IStatsEventData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * This interface contains details of stats beat event(s) that are sent to the server.\n * It contains the start time of the event and the duration of the event.\n */\nexport interface IStatsEventData {\n    startTime: number;\n    duration?: number;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IStatsMgr.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IAppInsightsCore } from \"./IAppInsightsCore\";\nimport { IConfiguration } from \"./IConfiguration\";\nimport { IStatsBeat, IStatsBeatConfig, IStatsBeatState } from \"./IStatsBeat\";\nimport { IUnloadHook } from \"./IUnloadHook\";\n\n/**\n * The interface for the Stats manager, which is passed to the StatsBeat instance\n * during initialization. It provides an abstractions to allow the StatsBeat instance to\n * access the configuration and state of the StatsBeat manager.\n */\nexport interface IStatsMgrConfig<CfgType extends IConfiguration = IConfiguration> {\n\n    /**\n     * Identifies the feature name used for this instance to determine if the StatsBeat instance\n     * should be initialized or not. This is used to identify the feature that this instance of the\n     */\n    feature: string;\n\n    /**\n     * A function to obtain the current configuration for the StatsBeat instance, this callback\n     * is called in a dynamic config context, so when any of the configuration values change,\n     * tis function will be called again to obtain the latest configuration values.\n     * This should also evaluate any throttling level and other settings for the statsbeat instance\n     * to determine if it should be enabled or not and return the appropriate configuration object.\n     * @param cfg - The current configuration object for the StatsBeat instance.\n     * @returns The configuration object that should be used to initialize / reinitialize the StatsBeat instance.\n     * It may return null if the StatsBeat instance should not be initialized or reinitialized, if the manager\n     * is already initialized and null is returned, the StatsBeat instance will be disabled.\n     */\n    getCfg: (core: IAppInsightsCore<CfgType>, cfg: CfgType) => IStatsBeatConfig | undefined | null;\n}\n\n/**\n * The Interface which defines the StatsBeat manager, which is responsible for creating and\n * managing the StatsBeat instance.\n * @since 3.3.7\n */\nexport interface IStatsMgr {\n    /**\n     * If there is a manager instance available, this will identify if the manager is enabled or not.\n     * @returns True if the manager is enabled, false otherwise.\n     */\n    readonly enabled: boolean;\n\n    /**\n     * Initialize and associate this manager with the provided core instance and configuration.\n     * @param core - The core instance to associate with this manager.\n     * @param isEnabled -\n     * @returns The unload hook for the stats beat manager, which can be used to unload\n     * and disable the manager. This may return null if the manager cannot be initialized.\n     * @remarks This method should be called only once, and it may throw an error if called multiple times.\n     */\n    init: <CfgType extends IConfiguration = IConfiguration>(core: IAppInsightsCore<CfgType>, cfg: IStatsMgrConfig<CfgType>) => IUnloadHook | null;\n    \n    /**\n     * Returns a new {@link IStatsBeat} instance for the current state which includes the endpoint.\n     * This method should be called only after the manager has been initialized and the\n     * {@link IStatsBeatConfig} has been set, otherwise it will return null.\n     * @param state - The current state of the stats beat manager.\n     * @returns A new instance of the stats beat or null if the manager or the configuration does not support\n     * the {@link IStatsBeatState}.\n     */\n    newInst: (state: IStatsBeatState) => IStatsBeat;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IStorageBuffer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDiagnosticLogger } from \"./IDiagnosticLogger\";\n\n/**\n * Identifies a simple interface to allow you to override the storage mechanism used\n * to track unsent and unacknowledged events. When provided it must provide both\n * the get and set item functions.\n * @since 2.8.12\n */\nexport interface IStorageBuffer {\n    /**\n     * Retrieves the stored value for a given key\n     */\n    getItem(logger: IDiagnosticLogger, name: string): string;\n\n    /**\n     * Sets the stored value for a given key\n     */\n    setItem(logger: IDiagnosticLogger, name: string, data: string): boolean;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITelemetryContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IApplication } from \"./context/IApplication\";\nimport { IDevice } from \"./context/IDevice\";\nimport { IInternal } from \"./context/IInternal\";\nimport { ILocation } from \"./context/ILocation\";\nimport { IOperatingSystem } from \"./context/IOperatingSystem\";\nimport { ISession } from \"./context/ISession\";\nimport { ISessionManager } from \"./context/ISessionManager\";\nimport { ITelemetryTrace } from \"./context/ITelemetryTrace\";\nimport { IUserContext } from \"./context/IUser\";\nimport { IWeb } from \"./context/IWeb\";\n\nexport interface ITelemetryContext {\n    /**\n     * The object describing a component tracked by this object.\n     */\n    readonly application: IApplication;\n\n    /**\n     * The object describing a device tracked by this object.\n     */\n    readonly device: IDevice;\n\n    /**\n     * The object describing internal settings.\n     */\n    readonly internal: IInternal;\n\n    /**\n     * The object describing a location tracked by this object.\n     */\n    readonly location: ILocation;\n\n    /**\n     * The object describing a operation tracked by this object.\n     * @deprecated Use the core getTraceCtx method instead to get / set the current trace context, this is required to\n     * support distributed tracing and allows the core to manage the trace context.\n     */\n    readonly telemetryTrace: ITelemetryTrace;\n\n    /**\n     * The object describing a user tracked by this object.\n     */\n    readonly user: IUserContext;\n\n    /**\n     * The object describing a session tracked by this object.\n     */\n    readonly session: ISession;\n\n    /**\n     * The session manager that manages the automatic session from the cookies\n     */\n    readonly sessionManager: ISessionManager;\n\n    /**\n     * The object describing os details tracked by this object.\n     */\n    readonly os?: IOperatingSystem;\n\n    /**\n     * The object describing we details tracked by this object.\n     */\n    readonly web?: IWeb;\n\n    /**\n     * application id obtained from breeze responses. Is used if appId is not specified by root config\n     */\n    appId: () => string;\n\n    /**\n     * session id obtained from session manager.\n     */\n    getSessionId: () => string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITelemetryInitializers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { ILegacyUnloadHook } from \"./IUnloadHook\";\n\nexport declare type TelemetryInitializerFunction = <T extends ITelemetryItem>(item: T) => boolean | void;\n\nexport interface ITelemetryInitializerHandler extends ILegacyUnloadHook {\n    remove(): void;\n}\n\nexport interface ITelemetryInitializerContainer {\n    /**\n     * Add a telemetry processor to decorate or drop telemetry events.\n     * @param telemetryInitializer - The Telemetry Initializer function\n     * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed\n     */\n    addTelemetryInitializer(telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler | void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITelemetryItem.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\n/**\n * Telemety item supported in Core\n */\nexport interface ITelemetryItem {\n    /**\n     * CommonSchema Version of this SDK\n     */\n    ver?: string;\n\n    /**\n     * Unique name of the telemetry item\n     */\n    name: string;\n\n    /**\n     * Timestamp when item was sent\n     */\n    time?: string;\n\n    /**\n     * Identifier of the resource that uniquely identifies which resource data is sent to\n     */\n    iKey?: string;\n\n    /**\n     * System context properties of the telemetry item, example: ip address, city etc\n     */\n    ext?: {[key: string]: any};\n\n    /**\n     * System context property extensions that are not global (not in ctx)\n     */\n    tags?: Tags; // Tags[] is deprecated since 4.1.0\n\n    /**\n     * Custom data\n     */\n    data?:ICustomProperties;\n\n    /**\n     * Telemetry type used for part B\n     */\n    baseType?: string;\n\n    /**\n     * Based on schema for part B\n     */\n    baseData?: { [key: string]: any };\n\n}\n\nexport interface Tags {\n    [key: string]: any;\n}\n\nexport interface ICustomProperties {\n    [key: string]: any;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITelemetryPlugin.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport { IAppInsightsCore } from \"./IAppInsightsCore\";\nimport { IConfiguration } from \"./IConfiguration\";\nimport { IProcessTelemetryContext, IProcessTelemetryUnloadContext, IProcessTelemetryUpdateContext } from \"./IProcessTelemetryContext\";\nimport { ITelemetryItem } from \"./ITelemetryItem\";\nimport { ITelemetryPluginChain } from \"./ITelemetryPluginChain\";\nimport { ITelemetryUnloadState } from \"./ITelemetryUnloadState\";\nimport { ITelemetryUpdateState } from \"./ITelemetryUpdateState\";\n\nexport interface ITelemetryProcessor {\n    /**\n     * Call back for telemetry processing before it it is sent\n     * @param env - This is the current event being reported\n     * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\n     * can optionally use this to access the current core instance or define / pass additional information\n     * to later plugins (vs appending items to the telemetry item)\n     */\n    processTelemetry: (env: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => void;\n   \n    /**\n     * The the plugin should re-evaluate configuration and update any cached configuration settings or\n     * plugins. If implemented this method will be called whenever a plugin is added or removed and if\n     * the configuration has bee updated.\n     * @param updateCtx - This is the context that should be used during updating.\n     * @param updateState - The details / state of the update process, it holds details like the current and previous configuration.\n     * @returns boolean - true if the plugin has or will call updateCtx.processNext(), this allows the plugin to perform any asynchronous operations.\n     */\n    update?: (updateCtx: IProcessTelemetryUpdateContext, updateState: ITelemetryUpdateState) => void | boolean;\n}\n\n/**\n * Configuration provided to SDK core\n */\nexport interface ITelemetryPlugin extends ITelemetryProcessor, IPlugin {\n    /**\n     * Set next extension for telemetry processing, this is now optional as plugins should use the\n     * processNext() function of the passed IProcessTelemetryContext instead. It is being kept for\n     * now for backward compatibility only.\n     * @deprecated - Use processNext() function of the passed IProcessTelemetryContext instead\n     */\n    setNextPlugin?: (next: ITelemetryPlugin | ITelemetryPluginChain) => void;\n\n    /**\n     * Priority of the extension\n     */\n    readonly priority: number;\n}\n\nexport interface IPlugin {\n    /**\n     * Initialize plugin loaded by SDK\n     * @param config - The config for the plugin to use\n     * @param core - The current App Insights core to use for initializing this plugin instance\n     * @param extensions - The complete set of extensions to be used for initializing the plugin\n     * @param pluginChain - [Optional] specifies the current plugin chain which identifies the\n     * set of plugins and the order they should be executed for the current request.\n     */\n    initialize: (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: ITelemetryPluginChain) => void;\n    \n    /**\n     * Returns a value that indicates whether the plugin has already been previously initialized.\n     * New plugins should implement this method to avoid being initialized more than once.\n     */\n    isInitialized?: () => boolean;\n\n    /**\n     * Tear down the plugin and remove any hooked value, the plugin should be removed so that it is no longer initialized and\n     * therefore could be re-initialized after being torn down. The plugin should ensure that once this has been called any further\n     * processTelemetry calls are ignored and it just calls the processNext() with the provided context.\n     * @param unloadCtx - This is the context that should be used during unloading.\n     * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n     * @returns boolean - true if the plugin has or will call processNext(), this for backward compatibility as previously teardown was synchronous and returned nothing.\n     */\n    teardown?: (unloadCtx: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => void | boolean;\n\n    /**\n     * Extension name\n     */\n    readonly identifier: string;\n\n    /**\n     * Plugin version (available in data.properties.version in common schema)\n     */\n    readonly version?: string;\n\n    /**\n     * The App Insights core to use for backward compatibility.\n     * Therefore the interface will be able to access the core without needing to cast to \"any\".\n     * [optional] any 3rd party plugins which are already implementing this interface don't fail to compile.\n     */\n    core?: IAppInsightsCore\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITelemetryPluginChain.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IProcessTelemetryUnloadContext } from \"./IProcessTelemetryContext\";\nimport { ITelemetryPlugin, ITelemetryProcessor } from \"./ITelemetryPlugin\";\nimport { ITelemetryUnloadState } from \"./ITelemetryUnloadState\";\n\n/**\n * Configuration provided to SDK core\n */\nexport interface ITelemetryPluginChain extends ITelemetryProcessor {\n\n    /**\n     * Returns the underlying plugin that is being proxied for the processTelemetry call\n     */\n    getPlugin: () => ITelemetryPlugin;\n\n    /**\n     * Returns the next plugin\n     */\n    getNext: () => ITelemetryPluginChain;\n\n    /**\n     * This plugin is being unloaded and should remove any hooked events and cleanup any global/scoped values, after this\n     * call the plugin will be removed from the telemetry processing chain and will no longer receive any events..\n     * @param unloadCtx - The unload context to use for this call.\n     * @param unloadState - The details of the unload operation\n     */\n    unload?: (unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITelemetryUnloadState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { TelemetryUnloadReason } from \"../../enums/ai/TelemetryUnloadReason\";\n\nexport interface ITelemetryUnloadState {\n    reason: TelemetryUnloadReason;\n    isAsync: boolean;\n    flushComplete?: boolean;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITelemetryUpdateState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { TelemetryUpdateReason } from \"../../enums/ai/TelemetryUpdateReason\";\nimport { IConfiguration } from \"./IConfiguration\";\nimport { IPlugin } from \"./ITelemetryPlugin\";\n\nexport interface ITelemetryUpdateState {\n\n    /**\n     * Identifies the reason for the update notification, this is a bitwise numeric value\n     */\n    reason: TelemetryUpdateReason;\n\n    /**\n     * This is a new active configuration that should be used\n     */\n    cfg?: IConfiguration,\n\n    /**\n     * The detected changes\n     */\n    oldCfg?: IConfiguration,\n\n     /**\n     * If this is a configuration update this was the previous configuration that was used\n     */\n    newConfig?: IConfiguration,\n\n    /**\n     * Was the new config requested to be merged with the existing config\n     */\n    merge?: boolean,\n\n    /**\n     * This holds a collection of plugins that have been added (if the reason identifies that one or more plugins have been added)\n     */\n    added?: IPlugin[];\n\n    /**\n     * This holds a collection of plugins that have been removed (if the reason identifies that one or more plugins have been removed)\n     */\n    removed?: IPlugin[]\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IThrottleMgr.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Identifies limit number/percentage of items sent per time\n * If both are provided, minimum number between the two will be used\n */\nexport interface IThrottleLimit {\n    /**\n     * Identifies sampling percentage of items per time\n     * The percentage is set to 4 decimal places, for example: 1 means 0.0001%\n     * Default: 100 (0.01%)\n     */\n    samplingRate?: number;\n\n    /**\n     * Identifies limit number of items per time\n     * Default: 1\n     */\n    maxSendNumber?: number;\n}\n\n/**\n * Identifies frequency of items sent\n * Default: send data on 28th every 3 month each year\n */\nexport interface IThrottleInterval {\n    /**\n     * Identifies month interval that items can be sent\n     * For example, if it is set to 2 and start date is in Jan, items will be sent out every two months (Jan, March, May etc.)\n     * If both monthInterval and dayInterval are undefined, it will be set to 3\n     */\n    monthInterval?: number;\n\n    /**\n     * Identifies days Interval from start date that items can be sent\n     * Default: undefined\n     */\n    dayInterval?: number;\n\n    /**\n     * Identifies days within each month that items can be sent\n     * If both monthInterval and dayInterval are undefined, it will be default to [28]\n     */\n    daysOfMonth?: number[];\n}\n\n/**\n* Identifies basic config\n*/\nexport interface IThrottleMgrConfig {\n\n    /**\n    * Identifies if throttle is disabled\n    * Default: false\n    */\n    disabled?: boolean;\n\n    /**\n    * Identifies limit number/percentage of items sent per time\n    * Default: sampling percentage 0.01% with one item sent per time\n    */\n    limit?: IThrottleLimit;\n\n    /**\n    * Identifies frequency of items sent\n    * Default: send data on 28th every 3 month each year\n    */\n    interval?: IThrottleInterval;\n}\n\n/**\n* Identifies object for local storage\n*/\nexport interface IThrottleLocalStorageObj {\n    /**\n    * Identifies start date\n    */\n    date: Date;\n\n    /**\n    * Identifies current count\n    */\n\n    count: number;\n\n    /**\n     * identifies previous triggered throttle date\n     */\n    preTriggerDate?: Date;\n}\n\n/**\n* Identifies throttle result\n*/\nexport interface IThrottleResult {\n    /**\n    * Identifies if items are sent\n    */\n    isThrottled: boolean;\n\n    /**\n    * Identifies numbers of items are sent\n    * if isThrottled is false, it will be set to 0\n    */\n    throttleNum: number;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITraceParent.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * This interface represents the components of a W3C traceparent header\n */\nexport interface ITraceParent {\n    /**\n     * The version of the definition, this MUST be a string with a length of 2 and only contain lowercase\n     * hexadecimal characters. A value of 'ff' is considered to be an invalid version.\n     */\n    version: string;\n\n    /**\n     * This is the ID of the whole trace forest and is used to uniquely identify a distributed trace\n     * through a system. It is represented as a 32-character string of lowercase hexadecimal characters,\n     * for example, 4bf92f3577b34da6a3ce929d0e0e4736.\n     * All characters as zero (00000000000000000000000000000000) is considered an invalid value.\n     */\n    traceId: string;\n\n    /**\n     * This is the ID of the current request as known by the caller (in some tracing systems, this is also\n     * known as the parent-id, where a span is the execution of a client request). It is represented as an\n     * 16-character string of lowercase hexadecimal characters, for example, 00f067aa0ba902b7.\n     * All bytes as zero (0000000000000000) is considered an invalid value.\n     */\n    spanId: string;\n\n    /**\n     * An 8-bit value of flags that controls tracing such as sampling, trace level, etc. These flags are\n     * recommendations given by the caller rather than strict rules to follow.\n     * As this is a bit field, you cannot interpret flags by decoding the hex value and looking at the resulting\n     * number. For example, a flag 00000001 could be encoded as 01 in hex, or 09 in hex if present with the flag\n     * 00001000. A common mistake in bit fields is forgetting to mask when interpreting flags.\n     */\n    traceFlags: number;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITraceProvider.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IOTelApi } from \"../otel/IOTelApi\";\nimport { IOTelSpanOptions } from \"../otel/trace/IOTelSpanOptions\";\nimport { IReadableSpan } from \"../otel/trace/IReadableSpan\";\nimport { IConfiguration } from \"./IConfiguration\";\nimport { IDistributedTraceContext } from \"./IDistributedTraceContext\";\n\n/**\n * A trace provider interface that enables different SKUs to provide their own\n * span implementations while being managed by the core SDK.\n *\n * This follows the OpenTelemetry TraceProvider pattern, allowing the core to\n * delegate span creation to the appropriate implementation based on the SDK variant.\n *\n * @since 3.4.0\n */\nexport interface ITraceProvider {\n    /**\n     * The OpenTelemetry API instance associated with this trace provider.\n     * This provides access to the tracer provider and other OpenTelemetry functionality.\n     * @since 3.4.0\n     */\n    readonly api: IOTelApi;\n    \n    /**\n     * Creates a new span with the given name and options.\n     *\n     * @param name - The name of the span\n     * @param options - Options for creating the span (kind, attributes, startTime)\n     * @param parent - Optional parent context. If not provided, uses the current active trace context\n     * @returns A new span instance specific to this provider's implementation\n     * @since 3.4.0\n     */\n    createSpan(name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan;\n\n    /**\n     * Gets the provider identifier for debugging and logging purposes.\n     * @returns A string identifying this trace provider implementation\n     * @since 3.4.0\n     */\n    getProviderId(): string;\n\n    /**\n     * Determines if this provider is available and ready to create spans.\n     * @returns true if the provider can create spans, false otherwise\n     * @since 3.4.0\n     */\n    isAvailable(): boolean;\n}\n\n/**\n * Interface for OpenTelemetry trace operations.\n * This interface provides span creation, context management, and trace provider operations\n * that are common across different SDK implementations (Core, AISKU, etc.).\n *\n * @since 3.4.0\n */\nexport interface ITraceHost<CfgType extends IConfiguration = IConfiguration> {\n\n    /*\n    * Config object that was used to initialize AppInsights / ITraceHost\n    */\n    readonly config: CfgType;\n\n    /**\n     * Gets the current distributed trace active context for this instance\n     * @param createNew - Optional flag to create a new instance if one doesn't currently exist, defaults to true. By default this\n     * will use any located parent as defined by the {@link IConfiguration.traceHdrMode} configuration for each new instance created.\n     */\n    getTraceCtx(createNew?: boolean): IDistributedTraceContext | null;\n\n    /**\n     * Sets the current distributed trace context for this instance if available\n     */\n    setTraceCtx(newTraceCtx: IDistributedTraceContext | null | undefined): void;\n\n    /**\n     * Start a new span with the given name and optional parent context.\n     *\n     * Note: This method only creates and returns the span. It does not automatically\n     * set the span as the active trace context. Context management should be handled\n     * separately using setTraceCtx() if needed.\n     *\n     * @param name - The name of the span\n     * @param options - Options for creating the span (kind, attributes, startTime)\n     * @param parent - Optional parent context. If not provided, uses the current active trace context\n     * @returns A new span instance, or null if no trace provider is available\n     * @since 3.4.0\n     *\n     * @see {@link IReadableSpan} - Interface for individual spans\n     * @see {@link IOTelSpanOptions} - Configuration options for span creation\n      */\n    startSpan(name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan | null;\n\n    /**\n     * Return the current active span, if no trace provider is available null will be returned\n     * but when a trace provider is available a span instance will always be returned, even if\n     * there is no active span (in which case a non-recording span will be returned).\n     * @param createNew - Optional flag to create a non-recording span if no active span exists, defaults to true.\n     * When false, returns the existing active span or null without creating a non-recording span, which can improve\n     * performance when only checking if an active span exists.\n     * @returns The current active span or null if no trace provider is available or if createNew is false and no active span exists\n     * @since 3.4.0\n     */\n    getActiveSpan(createNew?: boolean): IReadableSpan | null;\n\n    /**\n     * Set the current Active Span, if no trace provider is available the span will be not be set as the active span.\n     * @param span - The span to set as the active span\n     * @returns An ISpanScope instance that provides the current scope, the span will always be the span passed in\n     * even when no trace provider is available\n     * @since 3.4.0\n     */\n    setActiveSpan(span: IReadableSpan): ISpanScope\n\n    /**\n     * Get the current trace provider.\n     *\n     * @returns The current trace provider, or null if none is set\n     * @since 3.4.0\n     */\n    getTraceProvider(): ITraceProvider | null;\n}\n\n/**\n * Represents the execution scope for a span, combining the trace instance and the active span.\n * This interface is used as the context for executing functions within a span's scope.\n *\n * @since 3.4.0\n */\nexport interface ISpanScope<T extends ITraceHost = ITraceHost> {\n    /**\n     * The trace host (core or AISKU instance).\n     * @since 3.4.0\n     */\n    readonly host: T;\n\n    /**\n     * The active span for this execution scope.\n     * @since 3.4.0\n     */\n    readonly span: IReadableSpan;\n\n    /**\n     * The previously active span before this scope was created, if any.\n     * @since 3.4.0\n     */\n    readonly prvSpan?: IReadableSpan;\n\n    /**\n     * Restores the previous active span in the trace instance.\n     * @since 3.4.0\n     */\n    restore(): void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/ITraceTelemetry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPartC } from \"./IPartC\";\nimport { SeverityLevel } from \"./contracts/SeverityLevel\";\n\nexport interface ITraceTelemetry extends IPartC {\n    /**\n     * @description A message string\n     */\n    message: string;\n\n    /**\n     * @description Severity level of the logging message used for filtering in the portal\n     */\n    severityLevel?: SeverityLevel;\n\n    /**\n     * @description custom defiend iKey\n     */\n    iKey?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IUnloadHook.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * An interface which provides automatic removal during unloading of the component\n */\nexport interface IUnloadHook {\n    /**\n     * Self remove the referenced component\n     */\n    rm: () => void;\n}\n\n/**\n * An alternate interface which provides automatic removal during unloading of the component\n */\nexport interface ILegacyUnloadHook {\n    /**\n     * Legacy Self remove the referenced component\n     */\n    remove: () => void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IUnloadableComponent.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IProcessTelemetryUnloadContext } from \"./IProcessTelemetryContext\";\nimport { ITelemetryUnloadState } from \"./ITelemetryUnloadState\";\n\nexport interface IUnloadableComponent {\n    /**\n    * Teardown / Unload hook to allow implementations to perform some additional unload operations before the BaseTelemetryPlugin\n    * finishes it's removal.\n    * @param unloadCtx - This is the context that should be used during unloading.\n    * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.\n    * @param asyncCallback - An optional callback that the plugin must call if it returns true to inform the caller that it has completed any async unload/teardown operations.\n    * @returns boolean - true if the plugin has or will call asyncCallback, this allows the plugin to perform any asynchronous operations.\n    */\n    _doUnload?: (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void) => void | boolean;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IW3cTraceState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Represents a mutable [W3C trace state list](https://www.w3.org/TR/trace-context/#tracestate-header), this is a\n * list of key/value pairs that are used to pass trace state information between different tracing systems. The\n * list is ordered and the order is important as it determines the processing order.\n *\n * Importantly instances of this type are mutable, change made to an instance via {@link IW3cTraceState.set} or\n * {@link IW3cTraceState.del} will be reflected on the instance and any child instances that use it as a parent.\n * However, any parent instance associated with an instance will not be modified by operations on that particular\n * instance.\n *\n * @since 3.4.0\n */\nexport interface IW3cTraceState {\n    /**\n     * Returns a readonly array of the current keys associated with the trace state, keys are returned in the\n     * required processing order and if this instance has a parent the keys from the parent will be included\n     * unless they have been removed (deleted) from the child instance.\n     * Once created any modifications to the parent will also be reflected in the child, this is different from\n     * the OpenTelemetry implementation which creates a new instance for each call.\n     * @returns A readonly array of the current keys associated with the trace state\n     */\n    readonly keys: string[];\n\n    /**\n     * Check if the trace state list is empty, meaning it has no keys or values.\n     * This exists to allow for quick checks without needing to create a new array of keys.\n     * @since 3.4.0\n     * @returns true if the trace state list is empty, false otherwise\n     */\n    readonly isEmpty: boolean;\n\n    /**\n     * Get the value for the specified key that is associated with this instance, either directly or from the parent.\n     * @param key - The key to lookup\n     * @returns The value for the key, or undefined if not found\n     */\n    get(key: string): string | undefined;\n\n    /**\n     * Set the value for the specified key for this instance, returning its new location within the list.\n     * - 0 is the front of the list\n     * - -1 not set because the key/value pair is invalid\n     * If the key already exists it will be removed from its current location and added to the front of the list. And\n     * if the key was in the parent this will override the value inherited from the parent, more importantly it will\n     * not modify the parent value.\n     * @param key - The key to set\n     * @param value - The value to set\n     * @returns 0 if successful, -1 if not\n     */\n    set(key: string, value: string): number;\n\n    /**\n     * Delete the specified key from this instance, if the key was in the parent it will be removed (hidden) from\n     * this instance but will still be available directly from the parent.\n     * @param key - The key to delete\n     */\n    del(key: string): void;\n\n    /**\n     * Format the trace state list into a strings where each string can be used as a header value.\n     * This will return an empty array if the trace state list is empty.\n     * @param maxHeaders - The maximum number of entries to include in the output, once the limit is reached no more entries will be included\n     * @param maxKeys - The maximum number of keys to include in the output, once the limit is reached no more keys will be included\n     * @param maxLen - The maximum length of each header value, once the limit is reached a new header value will be created\n     * @returns An array of strings that can be used for the header values, if the trace state list is empty an empty array will be returned\n     */\n    hdrs(maxHeaders?: number, maxKeys?: number, maxLen?: number): string[];\n\n    /**\n     * Create a new instance of IW3cTraceState which is a child of this instance, meaning it will inherit the keys\n     * and values from this instance but any changes made to the child will not affect this instance.\n     * @returns A new instance of IW3cTraceState which is a child of this instance\n     */\n    child(): IW3cTraceState;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IXDomainRequest.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IBackendResponse {\n    /**\n     * Number of items received by the backend\n     */\n    readonly itemsReceived: number;\n\n    /**\n     * Number of items succesfuly accepted by the backend\n     */\n    readonly itemsAccepted: number;\n\n    /**\n     * List of errors for items which were not accepted\n     */\n    readonly errors: IResponseError[];\n\n    /**\n     * App id returned by the backend - not necessary returned, but we don't need it with each response.\n     */\n    readonly appId?: string;\n}\n\nexport interface IXDomainRequest extends XMLHttpRequestEventTarget {\n    readonly responseText: string;\n    send(payload: string): void;\n    open(method: string, url: string): void;\n    timeout: number;\n    contentType: string;\n    addEventListener(type: \"error\", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;\n    addEventListener(type: \"load\" | \"timeout\", listener: (ev: Event) => any, useCapture?: boolean): void;\n    addEventListener(type: \"progress\", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;\n}\n\n\nexport interface IResponseError {\n    readonly index: number;\n    readonly statusCode: number;\n    readonly message: string;\n}\n\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/IXHROverride.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { SendRequestReason } from \"../../enums/ai/SendRequestReason\";\n\n/** IPayloadData describes interface of payload sent via POST channel */\nexport interface IPayloadData {\n    urlString: string;\n    data: Uint8Array | string;\n    headers?: { [name: string]: string };\n    timeout?: number;\n    disableXhrSync?: boolean;\n    disableFetchKeepAlive?: boolean;\n    sendReason?: SendRequestReason;\n}\n\n/**\n* SendPOSTFunction type defines how an HTTP POST request is sent to an ingestion server\n* @param payload - The payload object that should be sent, contains the url, bytes/string and headers for the request\n* @param oncomplete - The function to call once the request has completed whether a success, failure or timeout\n* @param sync - A boolean flag indicating whether the request should be sent as a synchronous request.\n*/\nexport type SendPOSTFunction = (payload: IPayloadData, oncomplete: OnCompleteCallback, sync?: boolean) => void | IPromise<boolean>;\n\nexport type OnCompleteCallback = (status: number, headers: { [headerName: string]: string; }, response?: string, payload?: IPayloadData) => void;\n\n/**\n* The IXHROverride interface overrides the way HTTP requests are sent.\n*/\nexport interface IXHROverride {\n   sendPOST: SendPOSTFunction;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/PartAExtensions.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ContextTagKeys } from \"./contracts/ContextTagKeys\";\n\nexport const Extensions = {\n    UserExt: \"user\",\n    DeviceExt: \"device\",\n    TraceExt: \"trace\",\n    WebExt: \"web\",\n    AppExt: \"app\",\n    OSExt: \"os\",\n    SessionExt: \"ses\",\n    SDKExt: \"sdk\"\n};\n\nexport let CtxTagKeys = (/* #__PURE__ */ new ContextTagKeys());"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/IApplication.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IApplication {\n    /**\n     * The application version.\n     */\n    ver: string;\n\n    /**\n     * The application build version.\n     */\n    build: string;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/IDevice.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IDevice {\n    /**\n     * The type for the current device.\n     */\n    deviceClass: string;\n    /**\n     * A device unique ID.\n     */\n    id: string;\n    \n    /**\n     * The device model for the current device.\n     */\n    model: string;\n   \n    /**\n     * The application screen resolution.\n     */\n    resolution: string;\n\n    /**\n     * The IP address.\n     */\n    ip: string;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/IInternal.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IInternal {\n    /**\n     * The SDK version used to create this telemetry item.\n     */\n    sdkVersion: string;\n\n    /**\n     * The SDK agent version.\n     */\n    agentVersion: string;\n\n    /**\n     * The Snippet version used to initialize the sdk instance, this will contain either\n     * undefined/null - Snippet not used\n     * '-' - Version and legacy mode not determined\n     * # - Version # of the snippet\n     * #.l - Version # in legacy mode\n     * .l - No defined version, but used legacy mode initialization\n     */\n    snippetVer: string;\n\n    /**\n     * Identifies the source of the sdk script\n     */\n    sdkSrc: string;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/ILocation.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface ILocation {\n    /**\n     * Client IP address for reverse lookup\n     */\n    ip: string;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/IOperatingSystem.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IOperatingSystem {\n    name: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/ISample.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ITelemetryItem } from \"../ITelemetryItem\";\n\nexport interface ISample {\n    /**\n     * Sample rate\n     */\n    sampleRate: number;\n\n    isSampledIn(envelope: ITelemetryItem): boolean;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/ISession.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface ISession {\n    /**\n     * The session ID.\n     */\n    id?: string;\n\n    /**\n     * The date at which this guid was genereated.\n     * Per the spec the ID will be regenerated if more than acquisitionSpan milliseconds ellapse from this time.\n     */\n    acquisitionDate?: number;\n\n    /**\n     * The date at which this session ID was last reported.\n     * This value should be updated whenever telemetry is sent using this ID.\n     * Per the spec the ID will be regenerated if more than renewalSpan milliseconds elapse from this time with no activity.\n     */\n    renewalDate?: number;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/ISessionManager.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ISession } from \"./ISession\";\n\n/**\n * An interface that identifies the automatic session manager\n * @since 3.0.3\n */\nexport interface ISessionManager {\n\n    /**\n     * The automatic Session which has been initialized from the automatic SDK cookies and storage\n     */\n    automaticSession: ISession;\n\n    /**\n     * Update the automatic session cookie if required\n     * @returns\n     */\n    update: () => void;\n\n    /**\n     *  Record the current state of the automatic session and store it in our cookie string format\n     *  into the browser's local storage. This is used to restore the session data when the cookie\n     *  expires.\n     */\n    backup: () => void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/ITelemetryTrace.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Interface for telemetry trace context.\n * @deprecated Use {@link ITraceHost.getTraceCtx | appInsights.getTraceCtx()} or {@link ITraceHost.getTraceCtx | appInsights.core.getTraceCtx()} instead to get / set the\n * current trace context. This returns an {@link IDistributedTraceContext} which supports distributed tracing and\n * allows the core to manage the trace context.\n *\n * To replace the entire trace context, use {@link ITraceHost.setTraceCtx | appInsights.core.setTraceCtx()}.\n *\n * @see {@link https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/IDistributedTraceContext.html | IDistributedTraceContext Typedoc}\n * @see {@link https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-core-js/interfaces/ITraceHost.html#getTraceCtx | getTraceCtx Typedoc}\n */\nexport interface ITelemetryTrace {\n    /**\n     * The trace ID for this telemetry context. A 32 lowercase hex character string.\n     * @deprecated Use {@link IDistributedTraceContext.traceId} instead via `appInsights.getTraceCtx().traceId`.\n     *\n     * @example\n     * ```typescript\n     * // Old (deprecated)\n     * let traceId = context.telemetryTrace.traceID;\n     *\n     * // New (recommended) - using the standard SKU (AISKU)\n     * let traceCtx = appInsights.getTraceCtx();\n     * let traceId = traceCtx.traceId;\n     * traceCtx.traceId = \"00000000000000000000000000000001\";\n     *\n     * // Or when using the core directly\n     * let traceCtx = appInsights.core.getTraceCtx();\n     * ```\n     */\n    traceID?: string;\n\n    /**\n     * The parent span ID. A 16 lowercase hex character string.\n     * @deprecated Use {@link IDistributedTraceContext.spanId} instead via `appInsights.getTraceCtx().spanId`.\n     *\n     * @example\n     * ```typescript\n     * // Old (deprecated)\n     * let parentId = context.telemetryTrace.parentID;\n     *\n     * // New (recommended) - using the standard SKU (AISKU)\n     * let traceCtx = appInsights.getTraceCtx();\n     * let spanId = traceCtx.spanId;\n     * traceCtx.spanId = \"0000000000000001\";\n     *\n     * // Or when using the core directly\n     * let traceCtx = appInsights.core.getTraceCtx();\n     * ```\n     */\n    parentID?: string;\n\n    /**\n     * An integer representation of the W3C TraceContext trace-flags.\n     * @deprecated Use {@link IDistributedTraceContext.traceFlags} instead via `appInsights.getTraceCtx().traceFlags`.\n     *\n     * @example\n     * ```typescript\n     * // Old (deprecated)\n     * let flags = context.telemetryTrace.traceFlags;\n     *\n     * // New (recommended) - using the standard SKU (AISKU)\n     * let traceCtx = appInsights.getTraceCtx();\n     * let flags = traceCtx.traceFlags;\n     * traceCtx.traceFlags = 1; // sampled\n     *\n     * // Or when using the core directly\n     * let traceCtx = appInsights.core.getTraceCtx();\n     * ```\n     *\n     * @see {@link https://www.w3.org/TR/trace-context/#trace-flags | W3C TraceContext trace-flags}\n     */\n    traceFlags?: number;\n\n    /**\n     * The operation/page name for this trace context.\n     * @deprecated Use {@link IDistributedTraceContext.pageName} instead via `appInsights.getTraceCtx().pageName`.\n     *\n     * @example\n     * ```typescript\n     * // Old (deprecated)\n     * let name = context.telemetryTrace.name;\n     *\n     * // New (recommended) - using the standard SKU (AISKU)\n     * let traceCtx = appInsights.getTraceCtx();\n     * let pageName = traceCtx.pageName;\n     * traceCtx.pageName = \"my-page\";\n     *\n     * // Or when using the core directly\n     * let traceCtx = appInsights.core.getTraceCtx();\n     * ```\n     */\n    name?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/IUser.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IUser {\n    /**\n     * The telemetry configuration.\n     */\n    config: any;\n\n    /**\n     * The user ID.\n     */\n    id: string;\n\n    /**\n     * Authenticated user id\n     */\n    authenticatedId: string;\n\n    /**\n     * The account ID.\n     */\n    accountId: string;\n\n    /**\n     * The account acquisition date.\n     */\n    accountAcquisitionDate: string;\n\n    /**\n     * The localId\n     */\n    localId: string;\n\n    /**\n     * A flag indicating whether this represents a new user\n     */\n    isNewUser?: boolean;\n\n    /**\n     * A flag indicating whether the user cookie has been set\n     */\n    isUserCookieSet?: boolean;\n}\n\nexport interface IUserContext extends IUser {\n    setAuthenticatedUserContext(authenticatedUserId: string, accountId?: string, storeInCookie?: boolean): void;\n    clearAuthenticatedUserContext(): void;\n    update (userId?: string): void;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/context/IWeb.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IWeb {\n    /**\n     * Browser name, set at ingestion\n     */\n    browser: string;\n    \n    /**\n     * Browser ver, set at ingestion.\n     */\n    browserVer: string;\n    \n    /**\n     * Language\n     */\n    browserLang: string;\n    \n    /**\n     * User consent, populated to properties bag\n     */\n    userConsent: boolean;\n    \n    /**\n     * Whether event was fired manually, populated to properties bag\n     */\n    isManual: boolean;\n    \n    /**\n     * Screen resolution, populated to properties bag\n     */\n    screenRes: string;\n\n    /**\n     * Current domain. Leverages Window.location.hostname. populated to properties bag\n     */\n    domain: string;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/AvailabilityData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// // THIS FILE WAS AUTOGENERATED\n// import { Domain } from \"./Domain\";\n// \"use strict\";\n\n// /**\n//  * Instances of AvailabilityData represent the result of executing an availability test.\n//  */\n// export class AvailabilityData implements Domain {\n\n//     /**\n//      * Schema version\n//      */\n//     public ver: number = 2;\n\n//     /**\n//      * Identifier of a test run. Use it to correlate steps of test run and telemetry generated by the service.\n//      */\n//     public id: string;\n\n//     /**\n//      * Name of the test that these availability results represent.\n//      */\n//     public name: string;\n\n//     /**\n//      * Duration in format: DD.HH:MM:SS.MMMMMM. Must be less than 1000 days.\n//      */\n//     public duration: string;\n\n//     /**\n//      * Success flag.\n//      */\n//     public success: boolean;\n\n//     /**\n//      * Name of the location where the test was run from.\n//      */\n//     public runLocation: string;\n\n//     /**\n//      * Diagnostic message for the result.\n//      */\n//     public message: string;\n\n//     /**\n//      * Collection of custom properties.\n//      */\n//     public properties: any = {};\n\n//     /**\n//      * Collection of custom measurements.\n//      */\n//     public measurements: any = {};\n// }\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/ContextTagKeys.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createClassFromInterface } from \"../../../utils/HelperFuncs\";\n\nfunction _aiNameFunc(baseName: string) {\n    let aiName = \"ai.\" + baseName + \".\";\n    return function(name: string) {\n        return aiName + name;\n    }\n}\n\nlet _aiApplication = _aiNameFunc(\"application\");\nlet _aiDevice = _aiNameFunc(\"device\");\nlet _aiLocation = _aiNameFunc(\"location\");\nlet _aiOperation = _aiNameFunc(\"operation\");\nlet _aiSession = _aiNameFunc(\"session\");\nlet _aiUser = _aiNameFunc(\"user\");\nlet _aiCloud = _aiNameFunc(\"cloud\");\nlet _aiInternal = _aiNameFunc(\"internal\");\n\nexport interface IContextTagKeys {\n\n    /**\n     * Application version. Information in the application context fields is always about the application that is sending the telemetry.\n     */\n    readonly applicationVersion: string;\n\n    /**\n     * Application build.\n     */\n    readonly applicationBuild: string;\n\n    /**\n     * Application type id.\n     */\n    readonly applicationTypeId: string;\n\n    /**\n     * Application id.\n     */\n    readonly applicationId: string;\n\n    /**\n     * Application layer.\n     */\n    readonly applicationLayer: string;\n\n    /**\n     * Unique client device id. Computer name in most cases.\n     */\n    readonly deviceId: string;\n    readonly deviceIp: string;\n    readonly deviceLanguage: string;\n\n    /**\n     * Device locale using <language>-<REGION> pattern, following RFC 5646. Example 'en-US'.\n     */\n    readonly deviceLocale: string;\n\n    /**\n     * Model of the device the end user of the application is using. Used for client scenarios. If this field is empty then it is derived from the user agent.\n     */\n    readonly deviceModel: string;\n    readonly deviceFriendlyName: string;\n    readonly deviceNetwork: string;\n    readonly deviceNetworkName: string;\n\n    /**\n     * Client device OEM name taken from the browser.\n     */\n    readonly deviceOEMName: string;\n    readonly deviceOS: string;\n\n    /**\n     * Operating system name and version of the device the end user of the application is using. If this field is empty then it is derived from the user agent. Example 'Windows 10 Pro 10.0.10586.0'\n     */\n    readonly deviceOSVersion: string;\n\n    /**\n     * Name of the instance where application is running. Computer name for on-premisis, instance name for Azure.\n     */\n    readonly deviceRoleInstance: string;\n\n    /**\n     * Name of the role application is part of. Maps directly to the role name in azure.\n     */\n    readonly deviceRoleName: string;\n    readonly deviceScreenResolution: string;\n\n    /**\n     * The type of the device the end user of the application is using. Used primarily to distinguish JavaScript telemetry from server side telemetry. Examples: 'PC', 'Phone', 'Browser'. 'PC' is the default value.\n     */\n    readonly deviceType: string;\n    readonly deviceMachineName: string;\n    readonly deviceVMName: string;\n    readonly deviceBrowser: string;\n\n    /**\n     * The browser name and version as reported by the browser.\n     */\n    readonly deviceBrowserVersion: string;\n\n    /**\n     * The IP address of the client device. IPv4 and IPv6 are supported. Information in the location context fields is always about the end user. When telemetry is sent from a service, the location context is about the user that initiated the operation in the service.\n     */\n    readonly locationIp: string;\n\n    /**\n     * The country of the client device. If any of Country, Province, or City is specified, those values will be preferred over geolocation of the IP address field. Information in the location context fields is always about the end user. When telemetry is sent from a service, the location context is about the user that initiated the operation in the service.\n     */\n    readonly locationCountry: string;\n\n    /**\n     * The province/state of the client device. If any of Country, Province, or City is specified, those values will be preferred over geolocation of the IP address field. Information in the location context fields is always about the end user. When telemetry is sent from a service, the location context is about the user that initiated the operation in the service.\n     */\n    readonly locationProvince: string;\n\n    /**\n     * The city of the client device. If any of Country, Province, or City is specified, those values will be preferred over geolocation of the IP address field. Information in the location context fields is always about the end user. When telemetry is sent from a service, the location context is about the user that initiated the operation in the service.\n     */\n    readonly locationCity: string;\n\n    /**\n     * A unique identifier for the operation instance. The operation.id is created by either a request or a page view. All other telemetry sets this to the value for the containing request or page view. Operation.id is used for finding all the telemetry items for a specific operation instance.\n     */\n    readonly operationId: string;\n\n    /**\n     * The name (group) of the operation. The operation.name is created by either a request or a page view. All other telemetry items set this to the value for the containing request or page view. Operation.name is used for finding all the telemetry items for a group of operations (i.e. 'GET Home/Index').\n     */\n    readonly operationName: string;\n\n    /**\n     * The unique identifier of the telemetry item's immediate parent.\n     */\n    readonly operationParentId: string;\n    readonly operationRootId: string;\n\n    /**\n     * Name of synthetic source. Some telemetry from the application may represent a synthetic traffic. It may be web crawler indexing the web site, site availability tests or traces from diagnostic libraries like Application Insights SDK itself.\n     */\n    readonly operationSyntheticSource: string;\n\n    /**\n     * The correlation vector is a light weight vector clock which can be used to identify and order related events across clients and services.\n     */\n    readonly operationCorrelationVector: string;\n\n    /**\n     * Session ID - the instance of the user's interaction with the app. Information in the session context fields is always about the end user. When telemetry is sent from a service, the session context is about the user that initiated the operation in the service.\n     */\n    readonly sessionId: string;\n\n    /**\n     * Boolean value indicating whether the session identified by ai.session.id is first for the user or not.\n     */\n    readonly sessionIsFirst: string;\n    readonly sessionIsNew: string;\n    readonly userAccountAcquisitionDate: string;\n\n    /**\n     * In multi-tenant applications this is the account ID or name which the user is acting with. Examples may be subscription ID for Azure portal or blog name blogging platform.\n     */\n    readonly userAccountId: string;\n\n    /**\n     * The browser's user agent string as reported by the browser. This property will be used to extract informaiton regarding the customer's browser but will not be stored. Use custom properties to store the original user agent.\n     */\n    readonly userAgent: string;\n\n    /**\n     * Anonymous user id. Represents the end user of the application. When telemetry is sent from a service, the user context is about the user that initiated the operation in the service.\n     */\n    readonly userId: string;\n\n    /**\n     * Store region for UWP applications.\n     */\n    readonly userStoreRegion: string;\n\n    /**\n     * Authenticated user id. The opposite of ai.user.id, this represents the user with a friendly name. Since it's PII information it is not collected by default by most SDKs.\n     */\n    readonly userAuthUserId: string;\n    readonly userAnonymousUserAcquisitionDate: string;\n    readonly userAuthenticatedUserAcquisitionDate: string;\n    readonly cloudName: string;\n\n    /**\n     * Name of the role the application is a part of. Maps directly to the role name in azure.\n     */\n    readonly cloudRole: string;\n    readonly cloudRoleVer: string;\n\n    /**\n     * Name of the instance where the application is running. Computer name for on-premisis, instance name for Azure.\n     */\n    readonly cloudRoleInstance: string;\n    readonly cloudEnvironment: string;\n    readonly cloudLocation: string;\n    readonly cloudDeploymentUnit: string;\n\n    /**\n     * SDK version. See https://github.com/microsoft/ApplicationInsights-Home/blob/master/SDK-AUTHORING.md#sdk-version-specification for information.\n     */\n    readonly internalSdkVersion: string;\n\n    /**\n     * Agent version. Used to indicate the version of StatusMonitor installed on the computer if it is used for data collection.\n     */\n    readonly internalAgentVersion: string;\n\n    /**\n     * This is the node name used for billing purposes. Use it to override the standard detection of nodes.\n     */\n    readonly internalNodeName: string;\n\n    /**\n     * This identifies the version of the snippet that was used to initialize the SDK\n     */\n    readonly internalSnippet: string;\n\n    /**\n     * This identifies the source of the Sdk script (used to identify whether the SDK was loaded via the CDN)\n     */\n    readonly internalSdkSrc: string;\n}\n\nexport class ContextTagKeys extends createClassFromInterface<IContextTagKeys>({\n    applicationVersion: _aiApplication(\"ver\"),\n    applicationBuild: _aiApplication(\"build\"),\n    applicationTypeId: _aiApplication(\"typeId\"),\n    applicationId: _aiApplication(\"applicationId\"),\n    applicationLayer: _aiApplication(\"layer\"),\n    \n    deviceId: _aiDevice(\"id\"),\n    deviceIp: _aiDevice(\"ip\"),\n    deviceLanguage: _aiDevice(\"language\"),\n    deviceLocale: _aiDevice(\"locale\"),\n    deviceModel: _aiDevice(\"model\"),\n    deviceFriendlyName: _aiDevice(\"friendlyName\"),\n    deviceNetwork: _aiDevice(\"network\"),\n    deviceNetworkName: _aiDevice(\"networkName\"),\n    deviceOEMName: _aiDevice(\"oemName\"),\n    deviceOS: _aiDevice(\"os\"),\n    deviceOSVersion: _aiDevice(\"osVersion\"),\n    deviceRoleInstance: _aiDevice(\"roleInstance\"),\n    deviceRoleName: _aiDevice(\"roleName\"),\n    deviceScreenResolution: _aiDevice(\"screenResolution\"),\n    deviceType: _aiDevice(\"type\"),\n    deviceMachineName: _aiDevice(\"machineName\"),\n    deviceVMName: _aiDevice(\"vmName\"),\n    deviceBrowser: _aiDevice(\"browser\"),\n    deviceBrowserVersion: _aiDevice(\"browserVersion\"),\n    \n    locationIp: _aiLocation(\"ip\"),\n    locationCountry: _aiLocation(\"country\"),\n    locationProvince: _aiLocation(\"province\"),\n    locationCity: _aiLocation(\"city\"),\n    \n    operationId: _aiOperation(\"id\"),\n    operationName: _aiOperation(\"name\"),\n    operationParentId: _aiOperation(\"parentId\"),\n    operationRootId: _aiOperation(\"rootId\"),\n    operationSyntheticSource: _aiOperation(\"syntheticSource\"),\n    operationCorrelationVector: _aiOperation(\"correlationVector\"),\n    \n    sessionId: _aiSession(\"id\"),\n    sessionIsFirst: _aiSession(\"isFirst\"),\n    sessionIsNew: _aiSession(\"isNew\"),\n\n    userAccountAcquisitionDate: _aiUser(\"accountAcquisitionDate\"),\n    userAccountId: _aiUser(\"accountId\"),\n    userAgent: _aiUser(\"userAgent\"),\n    userId: _aiUser(\"id\"),\n    userStoreRegion: _aiUser(\"storeRegion\"),\n    userAuthUserId: _aiUser(\"authUserId\"),\n    userAnonymousUserAcquisitionDate: _aiUser(\"anonUserAcquisitionDate\"),\n    userAuthenticatedUserAcquisitionDate: _aiUser(\"authUserAcquisitionDate\"),\n\n    cloudName: _aiCloud(\"name\"),\n    cloudRole: _aiCloud(\"role\"),\n    cloudRoleVer: _aiCloud(\"roleVer\"),\n    cloudRoleInstance: _aiCloud(\"roleInstance\"),\n    cloudEnvironment: _aiCloud(\"environment\"),\n    cloudLocation: _aiCloud(\"location\"),\n    cloudDeploymentUnit: _aiCloud(\"deploymentUnit\"),\n\n    internalNodeName: _aiInternal(\"nodeName\"),\n    internalSdkVersion: _aiInternal(\"sdkVersion\"),\n    internalAgentVersion: _aiInternal(\"agentVersion\"),\n    internalSnippet: _aiInternal(\"snippet\"),\n    internalSdkSrc: _aiInternal(\"sdkSrc\")\n}) {\n    constructor() {\n        super();\n    }\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/DataPointType.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Type of the metric data measurement.\n */\nexport const enum DataPointType {\n    Measurement = 0,\n    Aggregation = 1\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/DependencyKind.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Identifies the type of dependency.\n */\nexport const enum DependencyKind {\n    SQL = 0,\n    Http = 1,\n    Other = 2\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/DependencySourceType.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Identifies the source of the dependency.\n */\nexport const enum DependencySourceType {\n    Undefined = 0,\n    Aic = 1,\n    Apmc = 2\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IBase.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Data struct to contain only C section with custom fields.\n */\nexport interface IBase {\n\n    /**\n     * Name of item (B section) if any. If telemetry data is derived straight from this, this should be null.\n     */\n    baseType: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IBase } from \"./IBase\";\n\n/**\n * Data struct to contain both B and C sections.\n */\nexport interface IData<TDomain> extends IBase {\n    /**\n     * Name of item (B section) if any. If telemetry data is derived straight from this, this should be null.\n     */\n    baseType: string;\n\n    /**\n     * Container for data item (B section).\n     */\n    baseData: TDomain;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IDataPoint.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { DataPointType } from \"./DataPointType\";\n\n/**\n * Metric data single measurement.\n */\nexport interface IDataPoint {\n\n    /**\n     * Name of the metric.\n     */\n    name: string;\n\n    /**\n     * Metric type. Single measurement or the aggregated value.\n     */\n    kind: DataPointType;\n\n    /**\n     * Single value for measurement. Sum of individual measurements for the aggregation.\n     */\n    value: number;\n\n    /**\n     * Metric weight of the aggregated metric. Should not be set for a measurement.\n     */\n    count: number;\n\n    /**\n     * Minimum value of the aggregated metric. Should not be set for a measurement.\n     */\n    min: number;\n\n    /**\n     * Maximum value of the aggregated metric. Should not be set for a measurement.\n     */\n    max: number;\n\n    /**\n     * Standard deviation of the aggregated metric. Should not be set for a measurement.\n     */\n    stdDev: number;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IDomain.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * The abstract common base of all domains.\n */\nexport interface IDomain {\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IEventData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDomain } from \"./IDomain\";\n\n/**\n * Instances of Event represent structured event records that can be grouped and searched by their properties. Event data item also creates a metric of event count by name.\n */\nexport interface IEventData extends IDomain {\n\n    /**\n     * Schema version\n     */\n    ver: number; /* 2 */\n\n    /**\n     * Event name. Keep it low cardinality to allow proper grouping and useful metrics.\n     */\n    name: string;\n\n    /**\n     * Collection of custom properties.\n     */\n    properties: any; /* {} */\n\n    /**\n     * Collection of custom measurements.\n     */\n    measurements: any; /* {} */\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IExceptionData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDomain } from \"./IDomain\";\nimport { IExceptionDetails } from \"./IExceptionDetails\";\nimport { SeverityLevel } from \"./SeverityLevel\";\n\n/**\n * An instance of Exception represents a handled or unhandled exception that occurred during execution of the monitored application.\n */\nexport interface IExceptionData extends IDomain {\n\n    /**\n     * Schema version\n     */\n    ver: number; /* 2 */\n\n    /**\n     * Exception chain - list of inner exceptions.\n     */\n    exceptions: IExceptionDetails[]; /* [] */\n\n    /**\n     * Severity level. Mostly used to indicate exception severity level when it is reported by logging library.\n     */\n    severityLevel: SeverityLevel;\n\n    /**\n     * Collection of custom properties.\n     */\n    properties: any; /* {} */\n\n    /**\n     * Collection of custom measurements.\n     */\n    measurements: any; /* {} */\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IExceptionDetails.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IStackFrame } from \"./IStackFrame\";\n\n/**\n * Exception details of the exception in a chain.\n */\nexport interface IExceptionDetails {\n\n    /**\n     * In case exception is nested (outer exception contains inner one), the id and outerId properties are used to represent the nesting.\n     */\n    id: number;\n\n    /**\n     * The value of outerId is a reference to an element in ExceptionDetails that represents the outer exception\n     */\n    outerId: number;\n\n    /**\n     * Exception type name.\n     */\n    typeName: string;\n    \n    /**\n     * Exception message.\n     */\n    message: string;\n\n    /**\n     * Indicates if full exception stack is provided in the exception. The stack may be trimmed, such as in the case of a StackOverflow exception.\n     */\n    hasFullStack: boolean;\n\n    /**\n     * Text describing the stack. Either stack or parsedStack should have a value.\n     */\n    stack: string;\n\n    /**\n     * List of stack frames. Either stack or parsedStack should have a value.\n     */\n    parsedStack: IStackFrame[]; /* [] */\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IMessageData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDomain } from \"./IDomain\";\nimport { SeverityLevel } from \"./SeverityLevel\";\n\n/**\n * Instances of Message represent printf-like trace statements that are text-searched. Log4Net, NLog and other text-based log file entries are translated into intances of this type. The message does not have measurements.\n */\nexport interface IMessageData extends IDomain {\n\n    /**\n     * Schema version\n     */\n    ver: number; /* 2 */\n\n    /**\n     * Trace message\n     */\n    message: string;\n\n    /**\n     * Trace severity level.\n     */\n    severityLevel: SeverityLevel;\n\n    /**\n     * Collection of custom properties.\n     */\n    properties: any; /* {} */\n\n    /**\n     * Collection of custom measurements.\n     */\n    measurements: any; /* {} */\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IMetricData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDataPoint } from \"./IDataPoint\";\nimport { IDomain } from \"./IDomain\";\n\n/**\n * An instance of the Metric item is a list of measurements (single data points) and/or aggregations.\n */\nexport interface IMetricData extends IDomain {\n\n    /**\n     * Schema version\n     */\n    ver: number; /* 2 */\n\n    /**\n     * List of metrics. Only one metric in the list is currently supported by Application Insights storage. If multiple data points were sent only the first one will be used.\n     */\n    metrics: IDataPoint[]; /* [] */\n\n    /**\n     * Collection of custom properties.\n     */\n    properties: any; /* {} */\n\n    /**\n     * Collection of custom measurements.\n     */\n    measurements: any; /* {} */\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IPageViewData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IEventData } from \"./IEventData\";\n\n// THIS FILE WAS AUTOGENERATED\n/**\n * An instance of PageView represents a generic action on a page like a button click. It is also the base type for PageView.\n */\nexport interface IPageViewData extends IEventData {\n\n    /**\n     * Request URL with all query string parameters\n     */\n    url: string;\n\n    /**\n     * Request duration in format: DD.HH:MM:SS.MMMMMM. For a page view (PageViewData), this is the duration. For a page view with performance information (PageViewPerfData), this is the page load time. Must be less than 1000 days.\n     */\n    duration: string;\n\n    /**\n     * Identifier of a page view instance. Used for correlation between page view and other telemetry items.\n     */\n    id: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IPageViewPerfData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPageViewData } from \"./IPageViewData\";\n\n/**\n * An instance of PageViewPerf represents: a page view with no performance data, a page view with performance data, or just the performance data of an earlier page request.\n */\nexport interface IPageViewPerfData extends IPageViewData {\n\n    /**\n     * Performance total in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    perfTotal: string;\n\n    /**\n     * Network connection time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    networkConnect: string;\n\n    /**\n     * Sent request time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    sentRequest: string;\n\n    /**\n     * Received response time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    receivedResponse: string;\n\n    /**\n     * DOM processing time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    domProcessing: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IRemoteDependencyData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDomain } from \"./IDomain\";\n\n/**\n * An instance of Remote Dependency represents an interaction of the monitored component with a remote component/service like SQL or an HTTP endpoint.\n */\nexport interface IRemoteDependencyData extends IDomain {\n\n    /**\n     * Schema version\n     */\n    ver: number; /* 2 */\n\n    /**\n     * Name of the command initiated with this dependency call. Low cardinality value. Examples are stored procedure name and URL path template.\n     */\n    name: string;\n\n    /**\n     * Identifier of a dependency call instance. Used for correlation with the request telemetry item corresponding to this dependency call.\n     */\n    id: string;\n\n    /**\n     * Result code of a dependency call. Examples are SQL error code and HTTP status code.\n     */\n    resultCode: string;\n\n    /**\n     * Request duration in format: DD.HH:MM:SS.MMMMMM. Must be less than 1000 days.\n     */\n    duration: string;\n\n    /**\n     * Indication of successful or unsuccessful call.\n     */\n    success: boolean; /* true */\n\n    /**\n     * Command initiated by this dependency call. Examples are SQL statement and HTTP URL's with all query parameters.\n     */\n    data: string;\n\n    /**\n     * Target site of a dependency call. Examples are server name, host address.\n     */\n    target: string;\n\n    /**\n     * Dependency type name. Very low cardinality value for logical grouping of dependencies and interpretation of other fields like commandName and resultCode. Examples are SQL, Azure table, and HTTP.\n     */\n    type: string;\n\n    /**\n     * Collection of custom properties.\n     */\n    properties: any; /* {} */\n\n    /**\n     * Collection of custom measurements.\n     */\n    measurements: any; /* {} */\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/IStackFrame.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Stack frame information.\n */\nexport interface IStackFrame {\n\n    /**\n     * Level in the call stack. For the long stacks SDK may not report every function in a call stack.\n     */\n    level: number;\n\n    /**\n     * Method name.\n     */\n    method: string;\n\n    /**\n     * Name of the assembly (dll, jar, etc.) containing this function.\n     */\n    assembly: string;\n\n    /**\n     * File name or URL of the method implementation.\n     */\n    fileName: string;\n\n    /**\n     * Line number of the code implementation.\n     */\n    line: number;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/contracts/SeverityLevel.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createEnumStyle } from \"../../../enums/EnumHelperFuncs\";\n\n/**\n * Defines the level of severity for the event.\n */\nexport const enum eSeverityLevel {\n    Verbose = 0,\n    Information = 1,\n    Warning = 2,\n    Error = 3,\n    Critical = 4,\n}\n\n/**\n * Defines the level of severity for the event.\n */\nexport const SeverityLevel = (/* @__PURE__ */ createEnumStyle<typeof eSeverityLevel>({\n    Verbose: eSeverityLevel.Verbose,\n    Information: eSeverityLevel.Information,\n    Warning: eSeverityLevel.Warning,\n    Error: eSeverityLevel.Error,\n    Critical: eSeverityLevel.Critical\n}));\n\nexport type SeverityLevel = number | eSeverityLevel;"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/telemetry/IEnvelope.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ISerializable } from \"./ISerializable\";\n\nexport interface IEnvelope extends ISerializable {\n\n    /**\n     * Envelope version. For internal use only. By assigning this the default, it will not be serialized within the payload unless changed to a value other than #1.\n     */\n    ver: number; /* 1 */\n\n    /**\n     * Type name of telemetry data item.\n     */\n    name: string;\n \n    /**\n     * Event date time when telemetry item was created. This is the wall clock time on the client when the event was generated. There is no guarantee that the client's time is accurate. This field must be formatted in UTC ISO 8601 format, with a trailing 'Z' character, as described publicly on https://en.wikipedia.org/wiki/ISO_8601#UTC. Note: the number of decimal seconds digits provided are variable (and unspecified). Consumers should handle this, i.e. managed code consumers should not use format 'O' for parsing as it specifies a fixed length. Example: 2009-06-15T13:45:30.0000000Z.\n     */\n    time: string;\n \n    /**\n     * Sampling rate used in application. This telemetry item represents 1 / sampleRate actual telemetry items.\n     */\n    sampleRate: number; /* 100.0 */\n \n    /**\n     * Sequence field used to track absolute order of uploaded events.\n     */\n    seq: string;\n \n    /**\n     * The application's instrumentation key. The key is typically represented as a GUID, but there are cases when it is not a guid. No code should rely on iKey being a GUID. Instrumentation key is case insensitive.\n     */\n    iKey: string;\n \n    /**\n     * Key/value collection of context properties. See ContextTagKeys for information on available properties.\n     */\n    tags: { [name: string]: any };  /* {} */\n \n    /**\n     * Telemetry data item.\n     */\n    data: any;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ai/telemetry/ISerializable.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { FieldType } from \"../../../enums/ai/Enums\";\n\nexport interface ISerializable {\n    /**\n     * The set of fields for a serializable object.\n     * This defines the serialization order and a value of true/false\n     * for each field defines whether the field is required or not.\n     */\n    aiDataContract: { [key: string]: FieldType | (() => FieldType) };\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/config/IConfigDefaults.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IConfiguration } from \"../ai/IConfiguration\";\n\n/**\n * The type to identify whether the default value should be applied in preference to the provided value.\n */\nexport type IConfigCheckFn<V> = (value: V) => boolean;\n\n/**\n * The type which identifies the function use to validate the user supplied value\n */\nexport type IConfigSetFn<T, V> = (value: any, defValue: V, theConfig: T) => V;\n\n/**\n * The default values with a check function\n */\nexport interface IConfigDefaultCheck<T, V, C = IConfiguration> {\n    /**\n     * Callback function to check if the user-supplied value is valid, if not the default will be applied\n     */\n    isVal?: IConfigCheckFn<V>;\n\n    /**\n     * Optional function to allow converting and setting of the default value\n     */\n    set?: IConfigSetFn<T, V>;\n\n    /**\n     * The default value to apply if the user-supplied value is not valid\n     */\n    v?: V | IConfigDefaults<V, T>;\n\n    /**\n     *  The default fallback key if the main key is not present, this is the key value from the config\n     */\n    fb?: keyof T | keyof C | Array<keyof T | keyof C>;\n\n    /**\n     * Use this check to determine the default fallback, default only checked whether the property isDefined,\n     * therefore `null`; `\"\"` are considered to be valid values.\n     */\n    dfVal?: (value: any) => boolean;\n\n    /**\n     * Specify that any provided value should have the default value(s) merged into the value rather than\n     * just using either the default of user provided values. Mergeed objects will automatically be marked\n     * as referenced.\n     */\n    mrg?: boolean;\n\n    /**\n     * Set this field of the target as referenced, which will cause any object or array instance\n     * to be updated in-place rather than being entirely replaced. All other values will continue to be replaced.\n     * This is required for nested default objects to avoid multiple repetitive updates to listeners\n     * @returns The referenced properties current value\n     */\n    ref?: boolean;\n\n    /**\n     * Set this field of the target as read-only, which will block this single named property from\n     * ever being changed for the target instance.\n     * This does NOT freeze or seal the instance, it just stops the direct re-assignment of the named property,\n     * if the value is a non-primitive (ie. an object or array) it's properties will still be mutable.\n     * @returns The referenced properties current value\n     */\n    rdOnly?: boolean;\n\n    /**\n     * Block the value associated with this property from having it's properties / values converted into\n     * dynamic properties, this is generally used to block objects or arrays provided by external libraries\n     * which may be a plain object with readonly (non-configurable) or const properties.\n     */\n    blkVal?: boolean;\n}\n \n/**\n * The Type definition to define default values to be applied to the config\n * The value may be either the direct value or a ConfigDefaultCheck definition\n */\nexport type IConfigDefaults<T, C = IConfiguration> = {\n    [key in keyof T]: T[key] | IConfigDefaultCheck<T, T[key], C>\n};\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/config/IDynamicConfigHandler.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IConfiguration } from \"../ai/IConfiguration\";\nimport { IDiagnosticLogger } from \"../ai/IDiagnosticLogger\";\nimport { IConfigDefaults } from \"./IConfigDefaults\";\nimport { IWatcherHandler, WatcherFunction } from \"./IDynamicWatcher\";\n\n/**\n * This interface identifies the config which can track changes\n */\nexport interface IDynamicConfigHandler<T = IConfiguration> {\n    /**\n     * Unique Id for this config handler\n     */\n    readonly uid: string;\n\n    /**\n     * Link back to the configuration object that should be used to get/set values\n     */\n    cfg: T;\n\n    /**\n     * The logger instance to use to logger any issues\n     */\n    logger: IDiagnosticLogger,\n\n    /**\n     * Helper to call any listeners that are waiting to be notified\n     */\n    notify: () => void;\n\n    /**\n     * Watch and track changes for accesses to the current config anb\n     */\n    watch: (configHandler: WatcherFunction<T>) => IWatcherHandler<T>;\n\n    /**\n     * Set the value against the provided config/name with the value, the property\n     * will be converted to be dynamic (if not already) as long as the provided config\n     * is already a tracked dynamic object.\n     * @throws TypeError if the provided config is not a monitored dynamic config\n     */\n    set: <C, V>(theConfig: C, name: string, value: V) => V;\n\n    /**\n     * Set default values for the config if not present.\n     * @param theConfig - The configuration object to set default on (if missing)\n     * @param defaultValues - The default values to apply to the config\n     */\n    setDf: <C>(theConfig: C, defaultValues: IConfigDefaults<C, T>) => C;\n\n    /**\n     * Set this named property of the target as referenced, which will cause any object or array instances\n     * to be updated in-place rather than being entirely replaced. All other values will continue to be replaced.\n     * @param target - The object which has (or will have) the named property\n     * @param name - The name of the property in the target\n     * @returns The referenced properties current value.\n     */\n    ref: <C, V = any>(target: C, name: string) => V;\n\n    /**\n     * Set this named property of the target as read-only, which will block this single named property from\n     * ever being changed for the target instance.\n     * This does NOT freeze or seal the instance, it just stops the direct re-assignment of the named property,\n     * if the value is a non-primitive (ie. an object or array) it's properties will still be mutable.\n     * @param target - The object which has (or will have) the named property\n     * @param name - The name of the property in the target\n     * @returns The referenced properties current value.\n     */\n    rdOnly: <C, V = any>(target: C, name: string) => V;\n\n    /**\n     * Set the `value` that is or will be assigned to this named property of the target will not have it's\n     * properties converted into dynamic properties, this means that any changes the values properties will\n     * not be monitored for changes and therefore will not cause any listeners to be notified in any value\n     * is changed. If the value associated with the `target[name]` is change this is still dynamic and will\n     * cause listeners to be notified.\n     * @param target - The object which has (or will have) the named property\n     * @param name - The name of the property in the target\n     * @returns The referenced properties current value.\n     * @example\n     * ```ts\n     * let localValue = target[name];   // If within a listener this will cause the listener to be called again\n     * target[name] = newValue;         // This will notify listeners that accessed target[name]\n     *\n     * // This will not cause lsiteners to be called because propa is not converted and value of target[name]\n     * // did not change.\n     * target[name].propa = 1;\n     * target[name].propb = 2;\n     *\n     * // If within a listener this will caused the listener to be called again only if target[name] is reassigned\n     * // not if the value associated with propa is changed.\n     * let localValue = target[name].propa;\n     * ```\n     */\n    blkVal: <C, V = any>(target: C, name: string) => V;\n}\n\n/**\n * @internal\n * @ignore\n */\nexport interface _IInternalDynamicConfigHandler<T = IConfiguration> extends IDynamicConfigHandler<T> {\n    /**\n     * @ignore\n     * Internal function to explicitly block watching for any config updates\n     * @param configHandler - The Callback function to call after blocking update listening\n     * @param allowUpdate - An optional flag to enable updating config properties marked as readonly\n     */\n    _block: (configHandler: WatcherFunction<T>, allowUpdate?: boolean) => void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/config/IDynamicPropertyHandler.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IConfiguration } from \"../ai/IConfiguration\";\nimport { IWatcherHandler } from \"./IDynamicWatcher\";\n\nexport interface IDynamicPropertyHandler<T = IConfiguration> {\n    /**\n     * Identifies the name of the field that is handled by this handler\n     */\n    n: string;\n\n    /**\n     * The current collection is watcher handlers which should be called if the value changes\n     */\n    h: IWatcherHandler<T>[];\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/config/IDynamicWatcher.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IConfiguration } from \"../ai/IConfiguration\";\nimport { IUnloadHook } from \"../ai/IUnloadHook\";\nimport { IConfigDefaults } from \"./IConfigDefaults\";\nimport { IDynamicPropertyHandler } from \"./IDynamicPropertyHandler\";\n\nexport interface IWatchDetails<T = IConfiguration> {\n    /**\n     * The current config object\n     */\n    cfg: T;\n\n    /**\n     * Set the value against the provided config/name with the value, the property\n     * will be converted to be dynamic (if not already) as long as the provided config\n     * is already a tracked dynamic object.\n     * @throws TypeError if the provided config is not a monitored dynamic config\n     */\n    set: <C, V>(theConfig: C, name: string, value: V) => V;\n\n    /**\n     * Set default values for the config if not present.\n     * @param theConfig - The configuration object to set default on (if missing)\n     * @param defaultValues - The default values to apply to the config\n     */\n    setDf: <C>(theConfig: C, defaultValues: IConfigDefaults<C>) => C;\n\n    /**\n     * Set this named property of the target as referenced, which will cause any object or array instance\n     * to be updated in-place rather than being entirely replaced. All other values will continue to be replaced.\n     * @returns The referenced properties current value\n     */\n    ref: <C, V = any>(target: C, name: string) => V;\n\n    /**\n     * Set this named property of the target as read-only, which will block this single named property from\n     * ever being changed for the target instance.\n     * This does NOT freeze or seal the instance, it just stops the direct re-assignment of the named property,\n     * if the value is a non-primitive (ie. an object or array) it's properties will still be mutable.\n     * @returns The referenced properties current value\n     */\n    rdOnly: <C, V = any>(target: C, name: string) => V;\n}\n\nexport type WatcherFunction<T = IConfiguration> = (details: IWatchDetails<T>) => void;\n\n/**\n * @internal\n */\nexport interface _WatcherChangeDetails<T = IConfiguration> {\n    d: _IDynamicDetail<T>;\n}\n\n/**\n * @internal\n */\nexport interface _IDynamicDetail<T = IConfiguration> extends IDynamicPropertyHandler<T> {\n\n    /**\n     * Add the watcher for monitoring changes\n     */\n    trk: (handler: IWatcherHandler<T>) => void;\n\n    /**\n     * Clear all of the watchers from monitoring changes\n     */\n    clr: (handler: IWatcherHandler<T>) => void;\n}\n\nexport interface IWatcherHandler<T = IConfiguration> extends IUnloadHook {\n    fn: WatcherFunction<T>;\n    rm: () => void;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/config/_IDynamicConfigHandlerState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDynamicConfigHandler } from \"./IDynamicConfigHandler\";\nimport { IDynamicPropertyHandler } from \"./IDynamicPropertyHandler\";\nimport { IWatcherHandler, WatcherFunction, _IDynamicDetail } from \"./IDynamicWatcher\";\n\n/**\n * @internal\n * Interface for internal communication to notifying state changes\n */\nexport interface _IDynamicGetter {\n    /**\n     * Cause any listeners of this property to be notified that the value has changed.\n     * Primarily used to ensure that listeners of child properties of an object that is getting replaced\n     * will be notified.\n     */\n    chng: () => void;\n}\n\n/**\n * @internal\n * Interface for the global dynamic config handler\n */\nexport interface _IDynamicConfigHandlerState<T> {\n    prop: symbol;       // Identify that this is a dynamic property\n    ro: symbol;         // Identify that this property is read-only\n    rf: symbol;         // Identify that this property is referenced and should be updated in-place\n    blkVal: symbol;     // Identify that the value of this property should not be converted to be dynamic\n    \n    /**\n     * Link to the handler\n     */\n    hdlr: IDynamicConfigHandler<T>;\n\n    /**\n     * Identifies the current active handler\n     */\n    act?: IWatcherHandler<T>;\n\n    /**\n     * Enable / Disable updates to dynamic readonly properties\n     */\n    upd?: boolean;\n\n    /**\n     * Helper to call any listeners that are waiting to be notified\n     */\n    notify: () => void;\n\n    /**\n     * Add this property handler to the collection to be notified\n     */\n    add: (handler: IDynamicPropertyHandler<T>) => void;\n\n    /**\n     * Add this handler as a handler for\n     */\n    trk: (handler: IWatcherHandler<T>, detail: _IDynamicDetail<T>) => void;\n\n    /**\n     * Use the provided handler to listen for changes\n     */\n    use: (activeHandler: IWatcherHandler<T>, callback: WatcherFunction<T>) => void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/ext/DataModels.ts",
    "content": "/**\n* DataModels.ts\n* @author Abhilash Panwar (abpanwar) Hector Hernandez (hectorh)\n* @copyright Microsoft 2018\n* File containing the interfaces for Web JS SDK.\n*/\nimport { EventPersistenceValue } from \"../../enums/ai/Enums\";\nimport { EventLatencyValue, EventSendType, FieldValueSanitizerType } from \"../../enums/ext/Enums\";\nimport { IConfiguration } from \"../ai/IConfiguration\";\nimport { ITelemetryItem } from \"../ai/ITelemetryItem\";\n\n/**\n * An interface used to create an event property value along with tagging it as PII, or customer content.\n * <b>Caution:</b> Customer content and PII are mutually exclusive. You can use only one of them at a time.\n * If you use both, then the property will be considered invalid, and therefore won't be sent.\n */\nexport interface IEventProperty {\n    /**\n     * The value for the property.\n     */\n    value: string | number | boolean | string[] | number[] | boolean[];\n\n    /**\n     * [Optional] The value kind associated with property value. The constant enum ValueKind should be used to specify the\n     * different kinds.\n     */\n    kind?: number /*| ValueKind*/;\n\n    /**\n     * [Optional] The data type for the property. Valid values accepted by onecollector are\n     * \"string\", \"bool\", \"double\", \"int64\", \"datetime\", \"guid\".\n     *  The EventPropertyType constant enum should be used to specify the different property type values.\n     */\n    propertyType?: number /*| EventPropertyType*/;\n}\n\n/**\n * An interface used to create an event, along with its name, properties, type, timestamp, and priority.\n */\nexport interface IExtendedTelemetryItem extends ITelemetryItem {\n    /**\n     * Properties to be captured about the telemetry item.\n     * Custom properties (alternatively referred to as Part C properties for a Common Schema event) can be\n     * directly added under data.\n     */\n    data?: { [key: string]: any; };\n\n    /**\n     * Telemetry properties pertaining to domain about which data is being captured. Example, duration, referrerUri for browser page.\n     * These are alternatively referred to as Part B properties for a Common Schema event.\n     */\n    baseData?: { [key: string]: any; };\n\n    /**\n     * An EventLatency value, that specifies the latency for the event.The EventLatency constant should be\n     * used to specify the different latency values.\n     */\n    latency?: number | EventLatencyValue;\n\n    /**\n     * [Optional] An EventPersistence value, that specifies the persistence for the event. The EventPersistence constant\n     * should be used to specify the different persistence values.\n     */\n    persistence?: number | EventPersistenceValue;\n    \n    /**\n     * [Optional] A boolean that specifies whether the event should be sent as a sync request.\n     */\n    sync?: boolean | EventSendType;\n    /**\n     * [Optional] A timings object.\n     */\n    timings?: IEventTiming;\n}\n\n/**\n * The IExtendedConfiguration interface holds the configuration details passed to core during initialize.\n */\nexport interface IExtendedConfiguration extends IConfiguration {\n    /**\n     * [Optional] The property storage override that should be used to store\n     * internal SDK properties, otherwise stored as cookies. It is needed where cookies are not available.\n     */\n    propertyStorageOverride?: IPropertyStorageOverride;\n\n    /**\n     * [Optional] A boolean that indicated whether to disable the use of cookies by the 1DS Web SDK. The cookies added by the SDK are\n     * MicrosoftApplicationsTelemetryDeviceId. If cookies are disabled, then session events are not sent unless propertyStorageOverride\n     * is provided to store the values elsewhere.\n     */\n    disableCookiesUsage?: boolean;\n\n    /**\n     * [Optional] Name of the Anon cookie.  The value will be set in the qsp header to collector requests.  Collector will use this value to look for specific cookie to use for anid property.\n     */\n    anonCookieName?: string;\n\n    /**\n     * [Optional] Disables additional internal event timings that are added during processing of events, the timings are not sent as part telemetry items to the server\n     */\n    disableEventTimings?: boolean;\n\n    /**\n     * [Optional] Enables support for objects with compound keys which indirectly represent an object where the \"key\" of the object contains a \".\" as part of it's name.\n     * @example\n     * ```typescript\n     * event: { \"somedata.embeddedvalue\": 123 }\n     * ```\n     */\n    enableCompoundKey?: boolean;\n\n    /**\n     * Add \"&w=0\" parameter to support UA Parsing when web-workers don't have access to Document.\n     * Default is false\n     */\n    enableWParam?: boolean;\n \n     // End of Internal note: remove these after consuming the ApplicationInsights Core version that defines these on IConfiguration\n }\n\n/**\n * An interface used for telemetry event timings.\n */\nexport interface IEventTiming {\n    /**\n     * Time when 1DS Core calls track\n     */\n    trackStart?: number;\n    /**\n     * Array of times when each plugin configured in 1DS calls processTelemetry method\n     */\n    processTelemetryStart?: { [key: string]: number; };\n    /**\n     * Array of times when a specific channel tried to send the telemetry to configured endpoint\n     */\n    sendEventStart?: { [key: string]: number; };\n    /**\n     * Array of times when a specific channel received a response from endpoint or request timed out\n     */\n    sendEventCompleted?: { [key: string]: number; };\n    /**\n     * Array of times when a specific channel started serialization of the telemetry event\n     */\n    serializationStart?: { [key: string]: number; };\n    /**\n     * Array of times when a specific channel completed serialization of the telemetry event\n     */\n    serializationCompleted?: { [key: string]: number; };\n}\n\n/**\n * The IPropertyStorageOverride interface provides a custom interface for storing internal SDK properties - otherwise they are\n * stored as cookies.\n * You need this interface when you intend to run auto collection for common properties, or when you log a session in\n * a non browser environment.\n */\nexport interface IPropertyStorageOverride {\n    /**\n     * A function for passing key value pairs to be stored.\n     * @param key   - The key for the key value pair.\n     * @param value - The value for the key value pair.\n     */\n    setProperty: (key: string, value: string) => void;\n    /**\n     * A function that gets a value for a given key.\n     * @param key - The key for which the value must be fetched.\n     */\n    getProperty: (key: string) => string;\n}\n\nexport type FieldValueSanitizerFunc = (details: IFieldSanitizerDetails) => IEventProperty | null;\n\nexport type FieldValueSanitizerTypes = string | number | boolean | object | string[] | number[] | boolean[] | IEventProperty;\n\n/**\n * This interface defines the object that is passed to any provided FieldValueSanitizerFunc, it provides not only the value to be sanitized but also\n * some context about the value like it's location within the envelope (serialized object), the format is defined via the\n * [Common Schema 4.0](https://aka.ms/CommonSchema) specification.\n */\nexport interface IFieldSanitizerDetails {\n\n    /**\n     * The path within the event where the value is stored\n     */\n    path: string;\n\n    /**\n     * The name of the field with the event path that will store the value\n     */\n    name: string;\n\n    /**\n     * Identifies the type of the property value\n     */\n    type: FieldValueSanitizerType;\n\n    /**\n     * The value for the property.\n     */\n    prop: IEventProperty;\n\n    /**\n     * A reference to the value sanitizer that created the details\n     */\n    sanitizer: IValueSanitizer;\n}\n\n/**\n * This interface is used during the serialization of individual fields when converting the events into envelope (serialized object) which is sent to the services,\n * the format is defined via the [Common Schema 4.0](https://aka.ms/CommonSchema) specification. The path and field names used are based\n * on how the data is serialized to the service (CS 4.0 location) and not specifically the location on the event object you pass into the track methods (unless they are the same).\n */\nexport interface IFieldValueSanitizerProvider {\n    /**\n     * Does this field value sanitizer handle this path / field combination\n     * @param path - The field path\n     * @param name - The name of the field\n     */\n    handleField(path: string, name: string): boolean;\n\n    /**\n     * Get the field sanitizer for this type of field based on the field type, value kind and/or event property type\n     * @param path - The field path\n     * @param name - The name of the field\n     * @param theType - The type of field\n     * @param theKind - The value kind of the field\n     * @param propType - The property type of the field\n     */\n    getSanitizer(path: string, name: string, theType: FieldValueSanitizerType, theKind?: number/* ValueKind*/, propType?: number/*EventPropertyType*/): FieldValueSanitizerFunc | null | undefined;\n}\n\n/**\n * This interface is used during the serialization of events into envelope (serialized object) which is sent to the services, the format is defined via the\n * [Common Schema 4.0](https://aka.ms/CommonSchema) specification. The path and field names used are based on how the data is serialized\n * to the service (CS 4.0 location) and not specifically the location on the event object you pass into the track methods (unless they are the same).\n */\nexport interface IValueSanitizer {\n    /**\n     * Add a value sanitizer as a fallback sanitizer if this sanitizer can't handle the path/name.\n     */\n    addSanitizer: (sanitizer: IValueSanitizer) => void;\n\n    /**\n     * Adds a field sanitizer to the evaluation list\n     */\n    addFieldSanitizer: (fieldSanitizer: IFieldValueSanitizerProvider) => void;\n\n    /**\n     * Removes the value sanitizer as a fallback sanitizer if this sanitizer can't handle the path/name if present.\n     */\n    rmSanitizer: (theSanitizer: IValueSanitizer) => void;\n\n    /**\n     * Removes the field sanitizer to the evaluation list if present\n     */\n    rmFieldSanitizer: (theFieldSanitizer: IFieldValueSanitizerProvider) => void;\n\n    /**\n     * Does this field value sanitizer handle this path / field combination\n     * @param path - The field path\n     * @param name - The name of the field\n     */\n    handleField: (path: string, name: string) => boolean;\n\n    /**\n     * Sanitizes the value. It checks the that the property name and value are valid. It also\n     * checks/populates the correct type and pii of the property value.\n     * @param path - The root path of the property\n     * @param name - The property name.\n     * @param value - The property value or an IEventProperty containing value, type ,pii and customer content.\n     * @param stringifyObjects - If supplied tells the sanitizer that it should JSON stringify() objects\n     * @returns IEventProperty containing valid name, value, pii and type or null if invalid.\n     */\n    value: (path: string, name: string, value: FieldValueSanitizerTypes, stringifyObjects?: boolean) => IEventProperty | null;\n\n    /**\n     * Sanitizes the Property. It checks the that the property name and value are valid. It also\n     * checks/populates the correct type and pii of the property value.\n     * @param path - The root path of the property\n     * @param name - The property name.\n     * @param property - The property value or an IEventProperty containing value, type ,pii and customer content.\n     * @param stringifyObjects - If supplied tells the sanitizer that it should JSON stringify() objects\n     * @returns IEventProperty containing valid name, value, pii and type or null if invalid.\n     */\n    property: (path: string, name: string, property: IEventProperty, stringifyObjects?: boolean) => IEventProperty | null;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/IOTelApi.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ITraceHost } from \"../ai/ITraceProvider\";\nimport { IOTelConfig } from \"./config/IOTelConfig\";\nimport { ITraceApi } from \"./trace/IOTelTraceApi\";\nimport { IOTelTracerProvider } from \"./trace/IOTelTracerProvider\";\n\n/**\n * The main OpenTelemetry API interface that provides access to all OpenTelemetry functionality.\n * This interface extends the IOTelTracerProvider and serves as the entry point for OpenTelemetry operations.\n *\n * @example\n * ```typescript\n * // Get a tracer from the API instance\n * const tracer = otelApi.getTracer(\"my-component\");\n *\n * // Create a span\n * const span = tracer.startSpan(\"operation\");\n *\n * // Access context manager\n * const currentContext = otelApi.context.active();\n *\n * // Access trace API\n * const activeSpan = otelApi.trace.getActiveSpan();\n * ```\n *\n * @since 3.4.0\n */\nexport interface IOTelApi extends IOTelTracerProvider {\n    /**\n     * The configuration object that contains all OpenTelemetry-specific settings.\n     * This includes tracing configuration, error handlers, and other OpenTelemetry options.\n     *\n     * @remarks\n     * Changes to this configuration after initialization may not take effect until\n     * the next telemetry operation, depending on the implementation.\n     */\n    cfg: IOTelConfig;\n\n    /**\n     * The current {@link ITraceHost} instance for this IOTelApi instance, this is effectively\n     * the OpenTelemetry ContextAPI instance without the static methods.\n     * @returns The ContextManager instance\n     */\n    host: ITraceHost;\n    \n    /**\n     * The current {@link ITraceApi} instance for this IOTelApi instance, this is\n     * effectively the OpenTelemetry TraceAPI instance without the static methods.\n     * @returns The current {@link ITraceApi} instance\n     */\n    trace: ITraceApi;\n\n    // propagation?: IOTelPropagationApi;\n\n    // metrics?: IOTelMetricsApi;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/IOTelApiCtx.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ITraceHost } from \"../ai/ITraceProvider\";\n\n/**\n * The context for the current IOTelApi instance linking it to the core SDK instance,\n * including access to the core dynamic configuration.\n *\n * Note: Passing the core instance within a context object to allow future expansion\n * without breaking changes or modifying signatures. Also allows easier mocking for tests.\n */\nexport interface IOTelApiCtx {\n    /**\n     * The host instance associated with this OTel API instance\n     */\n    host: ITraceHost;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/IOTelAttributes.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Attribute values may be any non-nullish primitive value except an object.\n *\n * null or undefined attribute values are invalid and will result in undefined behavior.\n *\n * @since 3.4.0\n */\nexport type OTelAttributeValue =\n    | string\n    | number\n    | boolean\n    | Array<null | undefined | string>\n    | Array<null | undefined | number>\n    | Array<null | undefined | boolean>;\n\n/**\n * Defines extended attribute values which may contain nested attributes.\n *\n * @since 3.4.0\n */\nexport type ExtendedOTelAttributeValue = OTelAttributeValue | IOTelAttributes;\n\n/**\n * Attributes is a map from string to attribute values.\n *\n * Note: only the own enumerable keys are counted as valid attribute keys.\n *\n * @since 3.4.0\n */\nexport interface IOTelAttributes {\n    [key: string]: OTelAttributeValue | undefined;\n}\n  \n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/attribute/IAttributeContainer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { eAttributeChangeOp } from \"../../../enums/otel/eAttributeChangeOp\";\nimport { IUnloadHook } from \"../../ai/IUnloadHook\";\nimport { IOTelAttributes, OTelAttributeValue } from \"../IOTelAttributes\";\n\n/**\n * Identifies the source of an attribute value in iterator operations\n * @since 3.4.0\n */\nexport const enum eAttributeFilter {\n    /**\n     * The attribute exists local to the current container instance\n     */\n    Local = 0,\n\n    /**\n     * The attribute does not exist locally and is inherited from a parent container or attributes object\n     */\n    Inherited = 1,\n\n    /**\n     * The attribute exists or has been deleted locally (only) to the current container instance\n     */\n    LocalOrDeleted = 2\n}\n\nexport type AttributeFilter = number | eAttributeFilter;\n\n/**\n * Information about what changed in an attribute container\n */\nexport interface IAttributeChangeInfo<V  extends OTelAttributeValue = OTelAttributeValue> {\n    /**\n     * The Id of the container that is initiated the change (not the immediate sender -- which is always the parent)\n     * As children only receive listener notifications from their parent in reaction to both changes\n     * they make and any changes they receive from their parent\n     */\n    frm: string;\n\n    /**\n     * Operation type that occurred\n     */\n    op: eAttributeChangeOp;\n    \n    /**\n     * The key that was changed (only present for 'set' operations)\n     */\n    k?: string;\n    \n    /**\n     * The old value (only present for 'set' operations when replacing existing value)\n     */\n    prev?: V;\n    \n    /**\n     * The new value (only present for 'set' operations)\n     */\n    val?: V;\n}\n\n/**\n * Interface for an attribute container\n * @since 3.4.0\n */\nexport interface IAttributeContainer<V extends OTelAttributeValue = OTelAttributeValue> {\n    /**\n     * Unique identifier for the attribute container\n     */\n    readonly id: string;\n\n    /**\n     * The number of attributes that have been set\n     * @returns The number of attributes that have been set\n     */\n    readonly size: number;\n\n    /**\n     * The number of attributes that were dropped due to the attribute limit being reached\n     * @returns The number of attributes that were dropped due to the attribute limit being reached\n     */\n    readonly droppedAttributes: number;\n\n    /**\n     * Return a snapshot of the current attributes, including inherited ones.\n     * This value is read-only and reflects the state of the attributes at the time of access,\n     * and the returned instance will not change if any attributes are modified later, you will need\n     * to access the attributes property again to get the latest state.\n     *\n     * Note: As this causes a snapshot to be taken, it is an expensive operation as it enumerates all\n     * attributes, so you SHOULD use this property sparingly.\n     * @returns A read-only snapshot of the current attributes\n     */\n    readonly attributes: IOTelAttributes;\n\n    /**\n     * Clear all existing attributes from the container, this will also remove any inherited attributes\n     * from this instance only (it will not change the inherited attributes / container(s))\n     */\n    clear: () => void;\n    \n    /**\n     * Get the value of an attribute by key\n     * @param key - The attribute key to retrieve\n     * @param source - Optional filter to only check attributes from a specific source (Local or Inherited)\n     * @returns The attribute value if found, undefined otherwise\n     */\n    get: (key: string, source?: eAttributeFilter) => V | undefined;\n    \n    /**\n     * Check if an attribute exists by key\n     * @param key - The attribute key to check\n     * @param source - Optional filter to only check attributes from a specific source (Local or Inherited)\n     * @returns True if the attribute exists, false otherwise\n     */\n    has: (key: string, source?: eAttributeFilter) => boolean;\n    \n    /**\n     * Set the value of an attribute by key on this instance.\n     * @param key - The attribute key to set\n     * @param value - The value to assign to the named attribute\n     * @returns true if the value was successfully set / replaced\n     */\n    set: (key: string, value: V) => boolean;\n    \n    /**\n     * Delete an existing attribute, if the key doesn't exist this will return false. If the key does\n     * exist then it will be removed from this instance and any inherited value will be hidden (even if\n     * the inherited value changes)\n     * @param key - The attribute key to delete\n     * @returns True if the attribute was deleted, false if it didn't exist (which includes if it has already been deleted)\n     */\n    del: (key: string) => boolean;\n    \n    /**\n     * The keys() method returns a new iterator object that contains the existing keys for each element\n     * in this attribute container. It will return all locally set keys first and then the inherited keys.\n     * When a key exists in both the local and inherited attributes, only the local key will be returned.\n     * If the key has been deleted locally, it will not be included in the iterator.\n     * @returns An iterator over the keys of the attribute container\n     */\n    keys: () => Iterator<string>;\n\n    /**\n     * The entries() method of returns a new iterator object that contains the [key, value, source?] tuples for\n     * each attribute, it returns all existing attributes of this instance including all inherited ones. If the\n     * same key exists in both the local and inherited attributes, only the first (non-deleted) tuple will be returned.\n     * If the key has been deleted, it will not be included in the iterator.\n     *\n     * The source value of the tuple identifies the origin of the attribute (Local or Inherited).\n     * @returns An iterator over the entries of the attribute container\n     */\n    entries: () => Iterator<[string, V, eAttributeFilter]>;\n\n    /**\n     * The forEach() method of executes a provided function once per each key/value pair in this attribute container,\n     * it will process all local attributes first, then the inherited attributes.  If the same key exists in both the\n     * local and inherited attributes, only the first (non-deleted) key/value pair will be processed.\n     * If a key has been deleted, it will not be included in the set of processed key/value pairs.\n     * @param callback - The function to execute for each key/value pair\n     * @param thisArg - Optional value to use as `this` when executing `callback`\n     */\n    forEach: (callback: (key: string, value: V, source?: eAttributeFilter) => void, thisArg?: any) => void;\n\n    /**\n     * The values() method returns a new iterator instance that contains the values for each element in this\n     * attribute container. It will return all locally set values first and then the inherited values. If the\n     * same key is present in both the local or inherited attributes only the first (non-deleted) value will be\n     * returned. If a key has been deleted, it will not be included in the iterator.\n     * @returns An iterator over the values of the attribute container\n     */\n    values: () => Iterator<V>;\n\n    /**\n     * Register a callback listener for any attribute changes, this will include local and inherited changes.\n     * @param callback - Function to be called when attributes change, receives change information\n     * @returns IUnloadHook instance with rm() function to remove this listener, once called it will never be invoked again\n     */\n    listen: (callback: (changeInfo: IAttributeChangeInfo<V>) => void) => IUnloadHook;\n\n    /**\n     * Create a child attribute container that inherits from this one, optionally taking a snapshot\n     * so that any future changes to the parent container do not affect the child container.\n     * The child will use all of the configuration from the parent container.\n     * @param name - Optional name for the child container\n     * @param snapshot - If true, the child container will be a snapshot of the current state\n     * @returns A new attribute container instance\n     */\n    child: (name?: string, snapshot?: boolean) => IAttributeContainer\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/config/IOTelAttributeLimits.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Configuration interface for OpenTelemetry attribute limits.\n * These limits help control the size and number of attributes to prevent\n * excessive memory usage and ensure consistent performance.\n *\n * @example\n * ```typescript\n * const limits: IOTelAttributeLimits = {\n *   attributeCountLimit: 128,        // Maximum 128 attributes\n *   attributeValueLengthLimit: 4096  // Maximum 4KB per attribute value\n * };\n * ```\n *\n * @remarks\n * When limits are exceeded:\n * - Additional attributes beyond `attributeCountLimit` are dropped\n * - Attribute values longer than `attributeValueLengthLimit` are truncated\n * - The behavior may vary based on the specific implementation\n *\n * @since 3.4.0\n */\nexport interface IOTelAttributeLimits {\n    /**\n     * Maximum allowed length for attribute values in characters.\n     *\n     * @remarks\n     * - Values longer than this limit will be truncated\n     * - Applies to string attribute values only\n     * - Numeric and boolean values are not affected by this limit\n     * - Array values have this limit applied to each individual element\n     *\n     * @defaultValue 4096\n     *\n     * @example\n     * ```typescript\n     * // If attributeValueLengthLimit is 100:\n     * span.setAttribute(\"description\", \"a\".repeat(200)); // Will be truncated to 100 characters\n     * span.setAttribute(\"count\", 12345);                 // Not affected (number)\n     * span.setAttribute(\"enabled\", true);                // Not affected (boolean)\n     * ```\n     */\n    attributeValueLengthLimit?: number;\n\n    /**\n     * Maximum number of attributes allowed per telemetry item.\n     *\n     * @remarks\n     * - Attributes added beyond this limit will be dropped\n     * - The order of attributes matters; earlier attributes take precedence\n     * - This limit applies to the total count of attributes, regardless of their type\n     * - Inherited or default attributes count toward this limit\n     *\n     * @defaultValue 128\n     *\n     * @example\n     * ```typescript\n     * // If attributeCountLimit is 5:\n     * span.setAttributes({\n     *   \"attr1\": \"value1\",  // Kept\n     *   \"attr2\": \"value2\",  // Kept\n     *   \"attr3\": \"value3\",  // Kept\n     *   \"attr4\": \"value4\",  // Kept\n     *   \"attr5\": \"value5\",  // Kept\n     *   \"attr6\": \"value6\"   // Dropped (exceeds limit)\n     * });\n     * ```\n     */\n    attributeCountLimit?: number;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/config/IOTelConfig.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IOTelErrorHandlers } from \"./IOTelErrorHandlers\";\nimport { ITraceCfg } from \"./IOTelTraceCfg\";\n\n/**\n * OpenTelemetry configuration interface\n * Provides configuration specific to the OpenTelemetry extensions\n */\nexport interface IOTelConfig {\n    /**\n     * Configuration interface for OpenTelemetry tracing functionality.\n     * This interface contains all the settings that control how traces are created,\n     * processed, and managed within the OpenTelemetry system.\n     *\n     * @example\n     * ```typescript\n     * const traceCfg: ITraceCfg = {\n     *   serviceName: \"my-service\",\n     *   generalLimits: {\n     *     attributeCountLimit: 128,\n     *     attributeValueLengthLimit: 4096\n     *   },\n     *   spanLimits: {\n     *     attributeCountLimit: 128,\n     *     linkCountLimit: 128,\n     *     eventCountLimit: 128\n     *   }\n     * };\n     * ```\n     *\n     * @since 3.4.0\n     */\n    traceCfg?: ITraceCfg;\n\n    /**\n     * Error handlers for OpenTelemetry operations.\n     * This interface allows you to specify custom error handling logic for various\n     * OpenTelemetry components, enabling better control over how errors are managed\n     * within the OpenTelemetry system.\n     *\n     * @see {@link IOTelErrorHandlers}\n     *\n     * @example\n     * ```typescript\n     * const errorHandlers: IOTelErrorHandlers = {\n     *   attribError: (message, key, value) => {\n     *    console.warn(`Attribute error for ${key}:`, message);\n     *  }\n     * };\n     * ```\n     */\n    errorHandlers?: IOTelErrorHandlers;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/config/IOTelErrorHandlers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Configuration interface for OpenTelemetry error handling callbacks.\n * Provides hooks to customize how different types of errors and diagnostic\n * messages are handled within the OpenTelemetry system.\n *\n * @example\n * ```typescript\n * const errorHandlers: IOTelErrorHandlers = {\n *   attribError: (message, key, value) => {\n *     console.warn(`Attribute error for ${key}:`, message);\n *   },\n *   spanError: (message, spanName) => {\n *     logger.error(`Span ${spanName} error:`, message);\n *   },\n *   warn: (message) => {\n *     logger.warn(message);\n *   },\n *   error: (message) => {\n *     logger.error(message);\n *   }\n * };\n * ```\n *\n * @remarks\n * If handlers are not provided, default behavior will be used:\n * - `attribError`: Throws an `OTelInvalidAttributeError`\n * - `spanError`: Logs to console or calls warn handler\n * - `debug`: Logs to console.log\n * - `warn`: Logs to console.warn\n * - `error`: Logs to console.error\n * - `notImplemented`: Logs to console.error\n *\n * @since 3.4.0\n */\nexport interface IOTelErrorHandlers {\n    /**\n     * Handles attribute-related errors, such as invalid attribute values or keys.\n     * Called when an attribute operation fails validation or processing.\n     *\n     * @param message - Descriptive error message explaining what went wrong\n     * @param key - The attribute key that caused the error\n     * @param value - The attribute value that caused the error (may be of any type)\n     *\n     * @remarks\n     * Common scenarios that trigger this handler:\n     * - Invalid attribute key format\n     * - Attribute value exceeds length limits\n     * - Unsupported attribute value type\n     * - Attribute count exceeds limits\n     *\n     * @default Throws an `OTelInvalidAttributeError`\n     *\n     * @example\n     * ```typescript\n     * attribError: (message, key, value) => {\n     *   metrics.increment('otel.attribute.errors', { key, type: typeof value });\n     *   logger.warn(`Attribute ${key} rejected: ${message}`);\n     * }\n     * ```\n     */\n    attribError?: (message: string, key: string, value: any) => void;\n\n    /**\n     * Handles span-related errors that occur during span operations.\n     * Called when a span operation fails or encounters an unexpected condition.\n     *\n     * @param message - Descriptive error message explaining the span error\n     * @param spanName - The name of the span that encountered the error\n     *\n     * @remarks\n     * Common scenarios that trigger this handler:\n     * - Span operation called on an ended span\n     * - Invalid span configuration\n     * - Span processor errors\n     * - Context propagation failures\n     *\n     * @default Logs to console or calls the warn handler\n     *\n     * @example\n     * ```typescript\n     * spanError: (message, spanName) => {\n     *   metrics.increment('otel.span.errors', { span_name: spanName });\n     *   logger.error(`Span operation failed for \"${spanName}\": ${message}`);\n     * }\n     * ```\n     */\n    spanError?: (message: string, spanName: string) => void;\n\n    /**\n     * Handles debug-level diagnostic messages.\n     * Used for detailed troubleshooting information that is typically\n     * only relevant during development or when diagnosing issues.\n     *\n     * @param message - Debug message to be handled\n     *\n     * @remarks\n     * Debug messages are typically:\n     * - Verbose operational details\n     * - Internal state information\n     * - Performance metrics\n     * - Development-time diagnostics\n     *\n     * @default Logs to console.log\n     *\n     * @example\n     * ```typescript\n     * debug: (message) => {\n     *   if (process.env.NODE_ENV === 'development') {\n     *     console.debug('[OTel Debug]', message);\n     *   }\n     * }\n     * ```\n     */\n    debug?: (message: string) => void;\n\n    /**\n     * Handles warning-level messages for non-fatal issues.\n     * Used for conditions that are unusual but don't prevent continued operation.\n     *\n     * @param message - Warning message to be handled\n     *\n     * @remarks\n     * Warning scenarios include:\n     * - Configuration issues that fall back to defaults\n     * - Performance degradation\n     * - Deprecated API usage\n     * - Resource limit approaches\n     *\n     * @default Logs to console.warn\n     *\n     * @example\n     * ```typescript\n     * warn: (message) => {\n     *   logger.warn('[OTel Warning]', message);\n     *   metrics.increment('otel.warnings');\n     * }\n     * ```\n     */\n    warn?: (message: string) => void;\n\n    /**\n     * Handles general error conditions that may affect functionality.\n     * Used for significant errors that should be investigated but may not be fatal.\n     *\n     * @param message - Error message to be handled\n     *\n     * @remarks\n     * Error scenarios include:\n     * - Failed network requests\n     * - Configuration validation failures\n     * - Resource allocation failures\n     * - Unexpected runtime conditions\n     *\n     * @default Logs to console.error\n     *\n     * @example\n     * ```typescript\n     * error: (message) => {\n     *   logger.error('[OTel Error]', message);\n     *   errorReporting.captureException(new Error(message));\n     * }\n     * ```\n     */\n    error?: (message: string) => void;\n\n    /**\n     * Handles errors related to unimplemented functionality.\n     * Called when a method or feature is not yet implemented or is intentionally\n     * disabled in the current configuration.\n     *\n     * @param message - Message describing the unimplemented functionality\n     *\n     * @remarks\n     * Common scenarios:\n     * - Placeholder methods that haven't been implemented\n     * - Features disabled in the current build\n     * - Platform-specific functionality not available\n     * - Optional features not included in the configuration\n     *\n     * @default Logs to console.error\n     *\n     * @example\n     * ```typescript\n     * notImplemented: (message) => {\n     *   logger.warn(`[OTel Not Implemented] ${message}`);\n     *   if (process.env.NODE_ENV === 'development') {\n     *     console.trace('Not implemented method called');\n     *   }\n     * }\n     * ```\n     */\n    notImplemented?: (message: string) => void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/config/IOTelSpanLimits.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// import { IOTelAttributeLimits } from \"./IOTelAttributeLimits\";\n\n// /**\n//  * Configuration interface for OpenTelemetry span-specific limits.\n//  * Extends the general attribute limits with additional constraints specific to spans,\n//  * including limits on events, links, and their associated attributes.\n//  *\n//  * @example\n//  * ```typescript\n//  * const spanLimits: IOTelSpanLimits = {\n//  *   // Inherited from IOTelAttributeLimits\n//  *   attributeCountLimit: 128,\n//  *   attributeValueLengthLimit: 4096,\n//  *\n//  *   // Span-specific limits\n//  *   linkCountLimit: 128,\n//  *   eventCountLimit: 128,\n//  *   attributePerEventCountLimit: 32,\n//  *   attributePerLinkCountLimit: 32\n//  * };\n//  * ```\n//  *\n//  * @remarks\n//  * These limits help prevent spans from consuming excessive memory and ensure\n//  * consistent performance even when dealing with complex traces that have many\n//  * events, links, or attributes.\n//  *\n//  * @since 3.4.0\n//  */\n// export interface IOTelSpanLimits extends IOTelAttributeLimits {\n  \n//     /**\n//      * Maximum number of links allowed per span.\n//      *\n//      * @remarks\n//      * - Links added beyond this limit will be dropped\n//      * - Links are typically added at span creation time\n//      * - Each link represents a causal relationship with another span\n//      * - Links added after creation may be subject to additional restrictions\n//      *\n//      * @defaultValue 128\n//      *\n//      * @example\n//      * ```typescript\n//      * const span = tracer.startSpan(\"operation\", {\n//      *   links: [\n//      *     { context: relatedSpanContext1 },\n//      *     { context: relatedSpanContext2 },\n//      *     // ... up to linkCountLimit links\n//      *   ]\n//      * });\n//      * ```\n//      */\n//     linkCountLimit?: number;\n    \n//     /**\n//      * Maximum number of events allowed per span.\n//      *\n//      * @remarks\n//      * - Events added beyond this limit will be dropped\n//      * - Events are typically used to mark significant points during span execution\n//      * - Each event can have its own set of attributes (limited by attributePerEventCountLimit)\n//      * - Events are ordered chronologically within the span\n//      *\n//      * @defaultValue 128\n//      *\n//      * @example\n//      * ```typescript\n//      * // If eventCountLimit is 3:\n//      * span.addEvent(\"started\");           // Kept\n//      * span.addEvent(\"processing\");        // Kept\n//      * span.addEvent(\"validation\");        // Kept\n//      * span.addEvent(\"completed\");         // Dropped (exceeds limit)\n//      * ```\n//      */\n//     eventCountLimit?: number;\n    \n//     /**\n//      * Maximum number of attributes allowed per span event.\n//      *\n//      * @remarks\n//      * - This limit applies to each individual event within a span\n//      * - Attributes added to events beyond this limit will be dropped\n//      * - This is separate from the span's own attribute limits\n//      * - Event attributes are useful for providing context about what happened at that point in time\n//      *\n//      * @defaultValue 32\n//      *\n//      * @example\n//      * ```typescript\n//      * // If attributePerEventCountLimit is 2:\n//      * span.addEvent(\"user_action\", {\n//      *   \"action\": \"click\",        // Kept\n//      *   \"element\": \"button\",      // Kept\n//      *   \"timestamp\": \"12345\"      // Dropped (exceeds per-event limit)\n//      * });\n//      * ```\n//      */\n//     attributePerEventCountLimit?: number;\n  \n//     /**\n//      * Maximum number of attributes allowed per span link.\n//      *\n//      * @remarks\n//      * - This limit applies to each individual link within a span\n//      * - Attributes added to links beyond this limit will be dropped\n//      * - This is separate from the span's own attribute limits\n//      * - Link attributes provide additional context about the relationship between spans\n//      *\n//      * @defaultValue 32\n//      *\n//      * @example\n//      * ```typescript\n//      * // If attributePerLinkCountLimit is 2:\n//      * const span = tracer.startSpan(\"operation\", {\n//      *   links: [{\n//      *     context: relatedSpanContext,\n//      *     attributes: {\n//      *       \"relationship\": \"follows\",    // Kept\n//      *       \"correlation_id\": \"abc123\",   // Kept\n//      *       \"priority\": \"high\"            // Dropped (exceeds per-link limit)\n//      *     }\n//      *   }]\n//      * });\n//      * ```\n//      */\n//     attributePerLinkCountLimit?: number;\n// }\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/config/IOTelTraceCfg.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IOTelAttributeLimits } from \"./IOTelAttributeLimits\";\n\n/**\n * Configuration interface for OpenTelemetry compatible tracing functionality.\n * This interface contains all the settings that control how traces are created,\n * processed, and managed within the OpenTelemetry system.\n *\n * @example\n * ```typescript\n * const traceCfg: ITraceCfg = {\n *   serviceName: \"my-service\",\n *   generalLimits: {\n *     attributeCountLimit: 128,\n *     attributeValueLengthLimit: 4096\n *   },\n *   spanLimits: {\n *     attributeCountLimit: 128,\n *     linkCountLimit: 128,\n *     eventCountLimit: 128\n *   }\n * };\n * ```\n *\n * @since 3.4.0\n */\nexport interface ITraceCfg {\n    /**\n     * Global attribute limits that apply to all telemetry items.\n     * These limits help prevent excessive memory usage and ensure consistent\n     * behavior across different telemetry types.\n     *\n     * @remarks\n     * These limits are inherited by more specific configurations unless overridden.\n     * For example, spans will use these limits unless `spanLimits` specifies different values.\n     */\n    generalLimits?: IOTelAttributeLimits;\n\n    // /**\n    //  * Specific limits that apply only to spans.\n    //  * These limits override the general limits for span-specific properties.\n    //  *\n    //  * @remarks\n    //  * Includes limits for attributes, events, links, and their associated attributes.\n    //  * This allows for fine-tuned control over span size and complexity.\n    //  */\n    // spanLimits?: IOTelSpanLimits;\n\n    // idGenerator?: IOTelIdGenerator;\n\n    // logRecordProcessors?: LogRecordProcessor[];\n    // metricReader: IMetricReader;\n    // views: ViewOptions[];\n    // instrumentations: (Instrumentation | Instrumentation[])[];\n    // resource: Resource;\n    // resourceDetectors: Array<ResourceDetector>;\n    \n    /**\n     * The name of the service generating telemetry data.\n     * This name will be included in all telemetry items as a resource attribute.\n     *\n     * @remarks\n     * The service name is crucial for identifying and filtering telemetry data\n     * in observability systems. It should be consistent across all instances\n     * of the same service.\n     *\n     * @example\n     * ```typescript\n     * serviceName: \"user-authentication-service\"\n     * ```\n     */\n    serviceName?: string;\n    \n    // spanProcessors?: SpanProcessor[];\n    // traceExporter: SpanExporter;\n\n    /**\n     * A flag that indicates whether the tracing (creating of a \"trace\" event) should be suppressed\n     * when a {@link IOTelSpan} ends and the span {@link IOTelSpan#isRecording | isRecording} is true.\n     * This value is also inherited by spans when they are created.\n     */\n    suppressTracing?: boolean;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelSpan.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { OTelException } from \"../../IException\";\nimport { OTelTimeInput } from \"../../IOTelHrTime\";\nimport { IDistributedTraceContext } from \"../../ai/IDistributedTraceContext\";\nimport { IOTelAttributes, OTelAttributeValue } from \"../IOTelAttributes\";\nimport { IAttributeContainer } from \"../attribute/IAttributeContainer\";\nimport { IOTelSpanStatus } from \"./IOTelSpanStatus\";\n\n/**\n * Provides an OpenTelemetry compatible interface for spans conforming to the OpenTelemetry API specification (v1.9.0).\n *\n * A span represents an operation within a trace and is the fundamental unit of work in distributed tracing.\n * Spans can be thought of as a grouping mechanism for a set of operations that are executed as part of\n * a single logical unit of work, providing timing information and contextual data about the operation.\n *\n * Spans form a tree structure within a trace, with a single root span that may have zero or more child spans,\n * which in turn may have their own children. This hierarchical structure allows for detailed analysis of\n * complex, multi-step operations across distributed systems.\n *\n * @since 3.4.0\n *\n * @remarks\n * - All spans created by this library implement the ISpan interface and extend the IReadableSpan interface\n * - Spans should be ended by calling `end()` when the operation completes\n * - Once ended, spans should generally not be used for further operations\n * - Spans automatically track timing information from creation to end\n *\n * @example\n * ```typescript\n * // Basic span usage\n * const span = tracer.startSpan('user-authentication');\n * span.setAttribute('user.id', '12345');\n * span.setAttribute('auth.method', 'oauth2');\n *\n * try {\n *   const result = await authenticateUser();\n *   span.setStatus({ code: SpanStatusCode.OK });\n *   span.setAttribute('auth.success', true);\n * } catch (error) {\n *   span.recordException(error);\n *   span.setStatus({\n *     code: SpanStatusCode.ERROR,\n *     message: 'Authentication failed'\n *   });\n * } finally {\n *   span.end();\n * }\n * ```\n */\nexport interface IOTelSpan {\n    /**\n     * Returns the span context object associated with this span.\n     *\n     * The span context is an immutable, serializable identifier that uniquely identifies\n     * this span within a trace. It contains the trace ID, span ID, and trace flags that\n     * can be used to create new child spans or propagate trace context across process boundaries.\n     *\n     * The returned span context remains valid even after the span has ended, making it\n     * useful for asynchronous operations and cross-service communication.\n     *\n     * @returns The immutable span context associated with this span\n     *\n     * @remarks\n     * - The span context is the primary mechanism for trace propagation\n     * - Context can be serialized and transmitted across network boundaries\n     * - Contains trace ID (unique to the entire trace) and span ID (unique to this span)\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('parent-operation');\n     * const spanContext = span.spanContext();\n     *\n     * // Use context to create child spans in other parts of the system\n     * const childSpan = tracer.startSpan('child-operation', {\n     *   parent: spanContext\n     * });\n     *\n     * // Context can be serialized for cross-service propagation\n     * const traceId = spanContext.traceId;\n     * const spanId = spanContext.spanId;\n     * ```\n     */\n    spanContext(): IDistributedTraceContext;\n  \n    /**\n     * Sets a single attribute on the span with the specified key and value.\n     *\n     * Attributes provide contextual information about the operation represented by the span.\n     * They are key-value pairs that help with filtering, grouping, and understanding spans\n     * in trace analysis tools. Attributes should represent meaningful properties of the operation.\n     *\n     * @param key - The attribute key, should be descriptive and follow naming conventions\n     * @param value - The attribute value; null or undefined values are invalid and result in undefined behavior\n     *\n     * @returns This span instance for method chaining\n     *\n     * @remarks\n     * - Attribute keys should follow semantic conventions when available\n     * - Common attributes include service.name, http.method, db.statement, etc.\n     * - Setting null or undefined values is invalid and may cause unexpected behavior\n     * - Attributes set after span creation don't affect sampling decisions\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('http-request');\n     *\n     * // Set individual attributes with descriptive keys\n     * span.setAttribute('http.method', 'POST')\n     *     .setAttribute('http.url', 'https://api.example.com/users')\n     *     .setAttribute('http.status_code', 201)\n     *     .setAttribute('user.id', '12345')\n     *     .setAttribute('request.size', 1024);\n     * ```\n     */\n    setAttribute(key: string, value: OTelAttributeValue): this;\n  \n    /**\n     * Sets multiple attributes on the span at once using an attributes object.\n     *\n     * This method allows efficient batch setting of multiple attributes in a single call.\n     * All attributes in the provided object will be added to the span, supplementing any\n     * existing attributes (duplicate keys will be overwritten).\n     *\n     * @param attributes - An object containing key-value pairs to set as span attributes\n     *\n     * @returns This span instance for method chaining\n     *\n     * @remarks\n     * - Null or undefined attribute values are invalid and will result in undefined behavior\n     * - More efficient than multiple `setAttribute` calls for bulk operations\n     * - Existing attributes with the same keys will be overwritten\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('database-query');\n     *\n     * // Set multiple attributes efficiently\n     * span.setAttributes({\n     *   'db.system': 'postgresql',\n     *   'db.name': 'user_database',\n     *   'db.table': 'users',\n     *   'db.operation': 'SELECT',\n     *   'db.rows_affected': 5,\n     *   'query.duration_ms': 15.7\n     * });\n     * ```\n     */\n    setAttributes(attributes: IOTelAttributes): this;\n  \n    /**\n     * The {@link IAttributeContainer | attribute container} associated with this span, providing\n     * advanced attribute management capabilities. Rather than using the {@link IReadableSpan#attributes}\n     * directly which returns a readonly {@link IOTelAttributes} map that is a snapshot of the attributes at\n     * the time of access, the attribute container offers methods to get, set, delete, and iterate over attributes\n     * with fine-grained control.\n     * It is recommended that you only access the {@link IReadableSpan#attributes} property sparingly due to the\n     * performance cost of taking a snapshot of all attributes.\n     */\n    readonly attribContainer: IAttributeContainer;\n\n    // /**\n    //  * Adds an event to the span with optional attributes and timestamp.\n    //  *\n    //  * **Note: This method is currently not implemented and events will be dropped.**\n    //  *\n    //  * Events represent significant points in time during the span's execution.\n    //  * They provide additional context about what happened during the operation,\n    //  * such as cache hits/misses, validation steps, or other notable occurrences.\n    //  *\n    //  * @param name - The name of the event, should be descriptive of what occurred\n    //  * @param attributesOrStartTime - Event attributes object, or start time if third parameter is undefined\n    //  * @param startTime - Optional start time of the event; if not provided, current time is used\n    //  *\n    //  * @returns This span instance for method chaining\n    //  *\n    //  * @remarks\n    //  * - **Current implementation drops events - not yet supported**\n    //  * - Events are timestamped occurrences within a span's lifecycle\n    //  * - Useful for marking significant points like cache hits, retries, or validation steps\n    //  * - Should not be used for high-frequency events due to performance impact\n    //  *\n    //  * @example\n    //  * ```typescript\n    //  * const span = tracer.startSpan('user-registration');\n    //  *\n    //  * // Add events to mark significant points\n    //  * span.addEvent('validation.started')\n    //  *     .addEvent('validation.completed', {\n    //  *       'validation.result': 'success',\n    //  *       'validation.duration_ms': 23\n    //  *     })\n    //  *     .addEvent('database.save.started')\n    //  *     .addEvent('database.save.completed', {\n    //  *       'db.rows_affected': 1\n    //  *     });\n    //  * ```\n    //  */\n    // addEvent(name: string, attributesOrStartTime?: IOTelAttributes | OTelTimeInput, startTime?: OTelTimeInput): this;\n  \n    // /**\n    //  * Adds a single link to the span connecting it to another span.\n    //  *\n    //  * **Note: This method is currently not implemented and links will be dropped.**\n    //  *\n    //  * Links establish relationships between spans that are not in a typical parent-child\n    //  * relationship. They are useful for connecting spans across different traces or\n    //  * for representing batch operations where multiple spans are related but not nested.\n    //  *\n    //  * @param link - The link object containing span context and optional attributes\n    //  *\n    //  * @returns This span instance for method chaining\n    //  *\n    //  * @remarks\n    //  * - **Current implementation drops links - not yet supported**\n    //  * - Links added after span creation do not affect sampling decisions\n    //  * - Prefer adding links during span creation when possible\n    //  * - Useful for batch operations, fan-out scenarios, or cross-trace relationships\n    //  *\n    //  * @example\n    //  * ```typescript\n    //  * const span = tracer.startSpan('batch-processor');\n    //  *\n    //  * // Link to related spans from a batch operation\n    //  * span.addLink({\n    //  *   context: relatedSpan.spanContext(),\n    //  *   attributes: {\n    //  *     'link.type': 'batch_item',\n    //  *     'batch.index': 1\n    //  *   }\n    //  * });\n    //  * ```\n    //  */\n    // addLink(link: IOTelLink): this;\n\n    // /**\n    //  * Adds multiple links to the span in a single operation.\n    //  *\n    //  * **Note: This method is currently not implemented and links will be dropped.**\n    //  *\n    //  * This is an efficient way to establish multiple relationships between this span\n    //  * and other spans. Particularly useful for batch operations, fan-out scenarios,\n    //  * or when a single operation needs to reference multiple related operations.\n    //  *\n    //  * @param links - An array of link objects to add to the span\n    //  *\n    //  * @returns This span instance for method chaining\n    //  *\n    //  * @remarks\n    //  * - **Current implementation drops links - not yet supported**\n    //  * - More efficient than multiple `addLink` calls for bulk operations\n    //  * - Links added after span creation do not affect sampling decisions\n    //  * - Consider span creation time linking for sampling-sensitive scenarios\n    //  *\n    //  * @example\n    //  * ```typescript\n    //  * const span = tracer.startSpan('aggregate-results');\n    //  *\n    //  * // Link to multiple related spans from parallel operations\n    //  * span.addLinks([\n    //  *   {\n    //  *     context: span1.spanContext(),\n    //  *     attributes: { 'operation.type': 'data_fetch', 'source': 'database' }\n    //  *   },\n    //  *   {\n    //  *     context: span2.spanContext(),\n    //  *     attributes: { 'operation.type': 'data_fetch', 'source': 'cache' }\n    //  *   },\n    //  *   {\n    //  *     context: span3.spanContext(),\n    //  *     attributes: { 'operation.type': 'data_transform', 'stage': 'preprocessing' }\n    //  *   }\n    //  * ]);\n    //  * ```\n    //  */\n    // addLinks(links: IOTelLink[]): this;\n\n    /**\n     * Sets the status of the span to indicate the success or failure of the operation.\n     *\n     * The span status provides a standardized way to indicate whether the operation\n     * completed successfully, encountered an error, or is in an unknown state.\n     * This status is used by observability tools to provide meaningful insights\n     * about system health and operation outcomes.\n     *\n     * @param status - The status object containing code and optional message\n     *\n     * @returns This span instance for method chaining\n     *\n     * @remarks\n     * - Default status is UNSET until explicitly set\n     * - Setting status overrides any previous status values\n     * - ERROR status should be accompanied by a descriptive message when possible\n     * - Status should reflect the final outcome of the operation\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('payment-processing');\n     *\n     * try {\n     *   const result = await processPayment(paymentData);\n     *\n     *   // Indicate successful completion\n     *   span.setStatus({\n     *     code: SpanStatusCode.OK\n     *   });\n     *\n     * } catch (error) {\n     *   // Indicate operation failed\n     *   span.setStatus({\n     *     code: SpanStatusCode.ERROR,\n     *     message: 'Payment processing failed: ' + error.message\n     *   });\n     *\n     *   span.recordException(error);\n     * }\n     * ```\n     */\n    setStatus(status: IOTelSpanStatus): this;\n  \n    /**\n     * Updates the name of the span, overriding the name provided during creation.\n     *\n     * Span names should be descriptive and represent the operation being performed.\n     * Updating the name can be useful when the operation's scope becomes clearer\n     * during execution, or when implementing generic spans that need specific naming\n     * based on runtime conditions.\n     *\n     * @param name - The new name for the span, should be descriptive of the operation\n     *\n     * @returns This span instance for method chaining\n     *\n     * @remarks\n     * - Name updates may affect sampling behavior depending on implementation\n     * - Choose names that are meaningful but not too specific to avoid cardinality issues\n     * - Follow naming conventions consistent with your observability strategy\n     * - Consider the impact on existing traces and dashboards when changing names\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('generic-operation');\n     *\n     * // Update name based on runtime determination\n     * if (operationType === 'user-registration') {\n     *   span.updateName('user-registration');\n     *   span.setAttribute('operation.type', 'registration');\n     * } else if (operationType === 'user-login') {\n     *   span.updateName('user-authentication');\n     *   span.setAttribute('operation.type', 'authentication');\n     * }\n     * ```\n     */\n    updateName(name: string): this;\n  \n    /**\n     * Marks the end of the span's execution and records the end timestamp.\n     *\n     * This method finalizes the span and makes it available for export to tracing systems.\n     * Once ended, the span should not be used for further operations. The span's duration\n     * is calculated from its start time to the end time provided or current time.\n     *\n     * @param endTime - Optional end time; if not provided, current time is used\n     *\n     * @remarks\n     * - This method does NOT return `this` to discourage chaining after span completion\n     * - Ending a span has no effect on child spans, which may continue running\n     * - Child spans can be ended independently after their parent has ended\n     * - The span becomes eligible for export once ended\n     * - Calling end() multiple times has no additional effect\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('file-processing');\n     *\n     * try {\n     *   // Perform the operation\n     *   const result = await processFile(filePath);\n     *\n     *   // Record success\n     *   span.setStatus({ code: SpanStatusCode.OK });\n     *   span.setAttribute('file.size', result.size);\n     *\n     * } catch (error) {\n     *   span.recordException(error);\n     *   span.setStatus({\n     *     code: SpanStatusCode.ERROR,\n     *     message: error.message\n     *   });\n     * } finally {\n     *   // Always end the span\n     *   span.end();\n     *   // Don't use span after this point\n     * }\n     *\n     * // Custom end time example\n     * const customEndTime = Date.now() * 1000000; // nanoseconds\n     * span.end(customEndTime);\n     * ```\n     */\n    end(endTime?: OTelTimeInput): void;\n  \n    /**\n     * Returns whether this span is actively recording information.\n     *\n     * A recording span accepts and stores attributes, events, status, and other span data.\n     * Non-recording spans (typically due to sampling decisions) may ignore operations\n     * like setAttribute() to optimize performance. This method allows conditional\n     * logic to avoid expensive operations on non-recording spans.\n     *\n     * @returns True if the span is actively recording information, false otherwise\n     *\n     * @remarks\n     * - Recording status is typically determined at span creation time\n     * - Non-recording spans still provide valid span context for propagation\n     * - Use this check to avoid expensive attribute calculations for non-recording spans\n     * - Recording status remains constant throughout the span's lifetime\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('data-processing');\n     *\n     * // Only perform expensive operations if span is recording\n     * if (span.isRecording()) {\n     *   const metadata = await expensiveMetadataCalculation();\n     *   span.setAttributes({\n     *     'process.metadata': JSON.stringify(metadata),\n     *     'process.complexity': metadata.complexity,\n     *     'process.estimated_duration': metadata.estimatedMs\n     *   });\n     * }\n     *\n     * // Always safe to set basic attributes\n     * span.setAttribute('process.started', true);\n     * ```\n     */\n    isRecording(): boolean;\n  \n    /**\n     * Records an exception as a span event with automatic error status handling.\n     *\n     * This method captures exception information and automatically creates a span event\n     * with standardized exception attributes. It's the recommended way to handle errors\n     * within spans, providing consistent error reporting across the application.\n     *\n     * @param exception - The exception to record; accepts string messages or Error objects\n     * @param time - Optional timestamp for when the exception occurred; defaults to current time\n     *\n     * @remarks\n     * - Automatically extracts exception type, message, and stack trace when available\n     * - Creates a standardized span event with exception details\n     * - Does NOT automatically set span status to ERROR - call setStatus() explicitly if needed\n     * - Exception events are useful for debugging and error analysis\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('risky-operation');\n     *\n     * try {\n     *   await performRiskyOperation();\n     *   span.setStatus({ code: SpanStatusCode.OK });\n     *\n     * } catch (error) {\n     *   // Record the exception details\n     *   span.recordException(error);\n     *\n     *   // Explicitly set error status\n     *   span.setStatus({\n     *     code: SpanStatusCode.ERROR,\n     *     message: 'Operation failed due to: ' + error.message\n     *   });\n     *\n     *   // Re-throw if needed\n     *   throw error;\n     * } finally {\n     *   span.end();\n     * }\n     *\n     * // Recording string exceptions\n     * span.recordException('Custom error message occurred');\n     *\n     * // Recording with custom timestamp\n     * const errorTime = Date.now() * 1000000; // nanoseconds\n     * span.recordException(error, errorTime);\n     * ```\n     */\n    recordException(exception: OTelException, time?: OTelTimeInput): void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelSpanContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDistributedTraceInit } from \"../../ai/IDistributedTraceContext\";\n\n/**\n * A SpanContext represents the portion of a {@link IOTelSpan} which must be\n * serialized and propagated along side of a {@link IOTelBaggage}.\n */\nexport interface IOTelSpanContext extends IDistributedTraceInit {\n\n    /**\n     * Trace flags to propagate.\n     *\n     * It is represented as 1 byte (bitmap). Bit to represent whether trace is\n     * sampled or not. When set, the least significant bit documents that the\n     * caller may have recorded trace data. A caller who does not record trace\n     * data out-of-band leaves this flag unset.\n     *\n     * see {@link eW3CTraceFlags} for valid flag values.\n     */\n    traceFlags: number;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelSpanCtx.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { OTelException } from \"../../IException\";\nimport { OTelTimeInput } from \"../../IOTelHrTime\";\nimport { IDistributedTraceContext } from \"../../ai/IDistributedTraceContext\";\nimport { IOTelApi } from \"../IOTelApi\";\nimport { IOTelAttributes } from \"../IOTelAttributes\";\nimport { IReadableSpan } from \"./IReadableSpan\";\n\n/**\n * The context to use for creating a Span\n */\nexport interface IOTelSpanCtx {\n    /**\n     * The current {@link IOTelApi} instance that is being used.\n     */\n    api: IOTelApi;\n\n    // /**\n    //  * The current {@link IOTelResource} instance to use for this Span Context\n    //  */\n    // resource?: IOTelResource;\n    \n    // /**\n    //  * The current {@link IOTelInstrumentationScope} instrumentationScope instance to\n    //  * use for this Span Context\n    //  */\n    // instrumentationScope?: IOTelInstrumentationScope;\n\n    // /**\n    //  * The context for the current instance (not currently used)\n    //  */\n    // context?: IOTelContext;\n    \n    /*\n     * The current {@link IDistributedTraceContext} instance to associated with the span\n     * used to create the span.\n     */\n    spanContext: IDistributedTraceContext;\n\n    /**\n     * Identifies the user provided start time of the span\n     */\n    startTime?: OTelTimeInput;\n\n    parentSpanContext?: IDistributedTraceContext;\n    \n    attributes?: IOTelAttributes;\n\n    // links?: IOTelLink[];\n\n    isRecording?: boolean;\n\n    /**\n     * When the span ends this callback will be called to process the specified Span and end it\n     * @param span - The span to end\n     * @param endTime - The end time of the span\n     * @param duration - The duration of the span\n     * @returns\n     */\n    onEnd?: (span: IReadableSpan) => void;\n\n    /**\n     * When an exception is recorded via the span's recordException API this callback will be called\n     * to process the exception. Unlike the OpenTelemetry spec this callback also provides the span instance\n     * to allow implementations to associate the exception with the span as needed.\n     * It is also called immediately when recordException is called rather than waiting until the span ends.\n     * @param span - The span associated with the exception\n     * @param exception - The exception to process\n     * @param time - The time the exception occurred\n     * @returns\n     */\n    onException?: (span: IReadableSpan, exception: OTelException, time?: OTelTimeInput) => void;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelSpanOptions.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { OTelSpanKind } from \"../../../enums/otel/OTelSpanKind\";\nimport { OTelTimeInput } from \"../../IOTelHrTime\";\nimport { IOTelAttributes } from \"../IOTelAttributes\";\n\n/**\n * Provides an OpenTelemetry like Interface for the Open Telemetry Api (1.9.0) SpanOptions\n * type. Where SpanOptions are options that can be used to configure a span.\n */\nexport interface IOTelSpanOptions {\n    /**\n     * The SpanKind of a span of this span, this is used to specify\n     * the relationship between the span and its parent span.\n     * @see {@link eOTelSpanKind} for possible values.\n     * @default eOTelSpanKind.INTERNAL\n     */\n    kind?: OTelSpanKind;\n\n    /**\n     * A span's attributes\n     */\n    attributes?: IOTelAttributes;\n\n    /** A manually specified start time for the created `Span` object. */\n    startTime?: OTelTimeInput;\n  \n    /** The new span should be a root span. (Ignore parent from context). */\n    root?: boolean;\n\n    /** Specify whether the span should be a recording span, default is true */\n    recording?: boolean;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelSpanStatus.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { eOTelSpanStatusCode } from \"../../../enums/otel/OTelSpanStatus\";\n\nexport interface IOTelSpanStatus {\n    /**\n     * The status code of this message.\n     */\n    code: eOTelSpanStatusCode;\n\n    /**\n     * A developer-facing error message.\n     */\n    message?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelTraceApi.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDistributedTraceContext, IDistributedTraceInit } from \"../../ai/IDistributedTraceContext\";\nimport { ISpanScope } from \"../../ai/ITraceProvider\";\nimport { IOTelSpanContext } from \"./IOTelSpanContext\";\nimport { IOTelTracer } from \"./IOTelTracer\";\nimport { IOTelTracerOptions } from \"./IOTelTracerOptions\";\nimport { IReadableSpan } from \"./IReadableSpan\";\n\n/**\n * ITraceApi provides an interface definition which is simular to the OpenTelemetry TraceAPI\n */\nexport interface ITraceApi {\n    /**\n     * Returns a Tracer, creating one if one with the given name and version\n     * if one has not already created.\n     *\n     * @param name - The name of the tracer or instrumentation library.\n     * @param version - The version of the tracer or instrumentation library.\n     * @param options - The options of the tracer or instrumentation library.\n     * @returns Tracer A Tracer with the given name and version\n     */\n    getTracer(name: string, version?: string, options?: IOTelTracerOptions): IOTelTracer;\n\n    /**\n     * Wrap the given {@link IDistributedTraceContext} in a new non-recording {@link IReadableSpan}\n     *\n     * @param spanContext - The {@link IDistributedTraceContext} to be wrapped\n     * @returns a new non-recording {@link IReadableSpan} with the provided context\n     */\n    wrapSpanContext(spanContext: IDistributedTraceContext | IDistributedTraceInit | IOTelSpanContext): IReadableSpan;\n\n    /**\n     * Returns true if this {@link IDistributedTraceContext} is valid.\n     * @return true if this {@link IDistributedTraceContext} is valid.\n     */\n    isSpanContextValid(spanContext: IDistributedTraceContext | IDistributedTraceInit | IOTelSpanContext): boolean;\n\n    /**\n     * Gets the span from the current context, if one exists.\n     */\n    getActiveSpan(): IReadableSpan | undefined | null;\n\n    /**\n     * Set or clear the current active span.\n     * @param span - The span to set as the active span, or null/undefined to clear the active span.\n     * @return An ISpanScope instance returned by the host, or void if there is no defined host.\n     */\n    setActiveSpan(span: IReadableSpan | undefined | null): ISpanScope | undefined | null;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelTraceState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Provides an OpenTelemetry compatible Interface for the Open Telemetry Api (1.9.0) TraceState type.\n *\n * The TraceState is a list of key/value pairs that are used to propagate\n * vendor-specific trace information across different distributed tracing systems.\n * The TraceState is used to store the state of a trace across different\n * distributed tracing systems, and it is used to ensure that the trace information\n * is consistent across different systems.\n *\n * Instances of TraceState are immutable, and the methods on this interface\n * return a new instance of TraceState with the updated values.\n */\nexport interface IOTelTraceState {\n    /**\n     * Create a new TraceState which inherits from this TraceState and has the\n     * given key set.\n     * The new entry will always be added in the front of the list of states.\n     *\n     * @param key - key of the TraceState entry.\n     * @param value - value of the TraceState entry.\n     */\n    set(key: string, value: string): IOTelTraceState;\n  \n    /**\n     * Return a new TraceState which inherits from this TraceState but does not\n     * contain the given key.\n     *\n     * @param key - the key for the TraceState entry to be removed.\n     */\n    unset(key: string): IOTelTraceState;\n  \n    /**\n     * Returns the value to which the specified key is mapped, or `undefined` if\n     * this map contains no mapping for the key.\n     *\n     * @param key - with which the specified value is to be associated.\n     * @returns the value to which the specified key is mapped, or `undefined` if\n     *     this map contains no mapping for the key.\n     */\n    get(key: string): string | undefined;\n  \n    /**\n     * Serializes the TraceState to a `list` as defined below. The `list` is a series of `list-members`\n     * separated by commas `,`, and a list-member is a key/value pair separated by an equals sign `=`.\n     * Spaces and horizontal tabs surrounding `list-members` are ignored. There can be a maximum of 32\n     * `list-members` in a `list`.\n     *\n     * If the resulting serialization is limited to no longer than 512 bytes, if the combination of\n     * keys and values exceeds this limit, the serialization will be truncated to the last key/value pair\n     * that fits within the limit. The serialization will be returned as a string.\n     *\n     * This is different from the {@link IW3cTraceState} serialization which returns an array of strings where each\n     * string is limited to 512 bytes and the array is limited to 32 strings. Thus the OpenTelemetry serialization\n     * will only return the first single string that fits within the limie.\n     *\n     * @returns the serialized string.\n     */\n    serialize(): string;\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelTracer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IOTelSpanOptions } from \"./IOTelSpanOptions\";\nimport { IReadableSpan } from \"./IReadableSpan\";\n\n/**\n * OpenTelemetry tracer interface for creating and managing spans within a trace.\n *\n * A tracer is responsible for creating spans that represent units of work within a distributed system.\n * Each tracer is typically associated with a specific instrumentation library or component,\n * allowing for fine-grained control over how different parts of an application generate telemetry.\n *\n * @example\n * ```typescript\n * // Get a tracer instance\n * const tracer = otelApi.getTracer('my-service');\n *\n * // Create a simple span\n * const span = tracer.startSpan('database-query');\n * span.setAttribute('db.operation', 'SELECT');\n * span.end();\n *\n * // Create an active span with automatic context management\n * tracer.startActiveSpan('process-request', (span) => {\n *   span.setAttribute('request.id', '12345');\n *\n *   // Any spans created within this block will be children of this span\n *   processRequest();\n *\n *   span.end();\n * });\n * ```\n *\n * @see {@link IReadableSpan} - Interface for individual spans\n * @see {@link IOTelSpanOptions} - Configuration options for span creation\n *\n * @since 3.4.0\n */\nexport interface IOTelTracer {\n    /**\n     * Creates and starts a new span without setting it as the active span in the current context.\n     *\n     * This method creates a span but does NOT modify the current execution context.\n     * The caller is responsible for managing the span's lifecycle, including calling `end()`\n     * when the operation completes.\n     *\n     * @param name - The name of the span, should be descriptive of the operation being traced\n     * @param options - Optional configuration for span creation (parent context, attributes, etc.)\n     *\n     * @returns The newly created span, or null if span creation failed\n     *\n     * @remarks\n     * - The returned span must be manually ended by calling `span.end()`\n     * - This span will not automatically become the parent for spans created in nested operations\n     * - Use `startActiveSpan` if you want automatic context management\n     *\n     * @example\n     * ```typescript\n     * const span = tracer.startSpan('database-operation');\n     * if (span) {\n     *   try {\n     *     span.setAttribute('db.table', 'users');\n     *     span.setAttribute('db.operation', 'SELECT');\n     *\n     *     // Perform database operation\n     *     const result = await db.query('SELECT * FROM users');\n     *\n     *     span.setAttributes({\n     *       'db.rows_affected': result.length,\n     *       'operation.success': true\n     *     });\n     *   } catch (error) {\n     *     span.setStatus({\n     *       code: SpanStatusCode.ERROR,\n     *       message: error.message\n     *     });\n     *     span.recordException(error);\n     *   } finally {\n     *     span.end(); // Always end the span\n     *   }\n     * }\n     * ```\n     */\n    startSpan(name: string, options?: IOTelSpanOptions): IReadableSpan | null;\n\n    /**\n     * Creates and starts a new span, sets it as the active span in the current context,\n     * and executes a provided function within this context.\n     *\n     * This method creates a span, makes it active during the execution of the provided\n     * function, and automatically ends the span when the function completes (or throws).\n     * This provides automatic span lifecycle management and context propagation.\n     *\n     * @param name - The name of the span, should be descriptive of the operation being traced\n     * @param options - Optional configuration for span creation (parent context, attributes, etc.)\n     * @param fn - The function to execute within the span's active context\n     *\n     * @returns The result of executing the provided function\n     *\n     * @remarks\n     * - The span is automatically ended when the function completes or throws an exception\n     * - The span becomes the active parent for any spans created within the function\n     * - If the function throws an error, the span status is automatically set to ERROR\n     * - This is the recommended method for most tracing scenarios due to automatic lifecycle management\n     * - Multiple overloads available for different parameter combinations\n     *\n     * @example\n     * ```typescript\n     * // Synchronous operation with just name and function\n     * const result = tracer.startActiveSpan('user-service', (span) => {\n     *   span.setAttribute('operation', 'get-user-details');\n     *   return { user: getUserData(), timestamp: new Date().toISOString() };\n     * });\n     *\n     * // With options\n     * const result2 = tracer.startActiveSpan('database-query',\n     *   { attributes: { 'db.table': 'users' } },\n     *   (span) => {\n     *     span.setAttribute('db.operation', 'SELECT');\n     *     return database.getUser('123');\n     *   }\n     * );\n     *\n     * // With full context control\n     * const result3 = tracer.startActiveSpan('external-api',\n     *   { attributes: { 'service.name': 'payment-api' } },\n     *   currentContext,\n     *   async (span) => {\n     *     try {\n     *       const response = await fetch('/api/payment');\n     *       span.setAttributes({\n     *         'http.status_code': response.status,\n     *         'operation.success': response.ok\n     *       });\n     *       return response.json();\n     *     } catch (error) {\n     *       span.setAttribute('error.type', error.constructor.name);\n     *       throw error; // Error automatically recorded\n     *     }\n     *   }\n     * );\n     * ```\n     */\n    startActiveSpan<F extends (span: IReadableSpan) => unknown>(name: string, fn: F): ReturnType<F>;\n    startActiveSpan<F extends (span: IReadableSpan) => unknown>(name: string, options: IOTelSpanOptions,fn: F ): ReturnType<F>;\n  }\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelTracerOptions.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface IOTelTracerOptions {\n    /**\n     * The schemaUrl of the tracer or instrumentation library\n     */\n    schemaUrl?: string;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IOTelTracerProvider.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { IOTelTracer } from \"./IOTelTracer\";\nimport { IOTelTracerOptions } from \"./IOTelTracerOptions\";\n\n/**\n * OpenTelemetry Trace API for getting tracers.\n * This provides the standard OpenTelemetry trace API entry point.\n */\nexport interface IOTelTracerProvider {\n    /**\n     * Returns a Tracer, creating one if one with the given name and version is\n     * not already created. This may return\n     * - The same Tracer instance if one has already been created with the same name and version\n     * - A new Tracer instance if one has not already been created with the same name and version\n     * - A non-operational Tracer if the provider is not operational\n     *\n     * @param name - The name of the tracer or instrumentation library.\n     * @param version - The version of the tracer or instrumentation library.\n     * @param options - The options of the tracer or instrumentation library.\n     * @returns Tracer A Tracer with the given name and version\n     */\n    getTracer(name: string, version?: string, options?: IOTelTracerOptions): IOTelTracer;\n\n    /**\n     * Forces the tracer provider to flush any buffered data.\n     * @returns A promise that resolves when the flush is complete.\n     */\n    forceFlush?: () => IPromise<void> | void;\n\n    /**\n     * Shuts down the tracer provider and releases any resources.\n     * @returns A promise that resolves when the shutdown is complete.\n     */\n    shutdown?: () => IPromise<void> | void;\n}\n  \n"
  },
  {
    "path": "shared/AppInsightsCore/src/interfaces/otel/trace/IReadableSpan.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { OTelSpanKind } from \"../../../enums/otel/OTelSpanKind\";\nimport { IOTelHrTime } from \"../../IOTelHrTime\";\nimport { IDistributedTraceContext } from \"../../ai/IDistributedTraceContext\";\nimport { IOTelAttributes } from \"../IOTelAttributes\";\nimport { IOTelSpan } from \"./IOTelSpan\";\nimport { IOTelSpanStatus } from \"./IOTelSpanStatus\";\n\n/**\n * Provides an OpenTelemetry compatible Interface for the Open Telemetry Sdk-Trace-Base (1.8.0 and 2.0.0) ReadableSpan type.\n *\n * The IReadableSpan interface is used to represent a span that can be read and exported, while the OpenTelemetry\n * specification defines a ReadableSpan as a Span that has been ended and is ready to be exported. By default all\n * spans created by this library implement the IReadableSpan interface which also extends the {@link IOTelSpan} interface.\n *\n * This interface is defined to provide compatibility with exporters defined by the OpenTelemetry Trace SDK.\n * @since 3.4.0\n */\nexport interface IReadableSpan extends IOTelSpan {\n\n    /**\n     * The span's unique identifier.\n     */\n    readonly name: string;\n\n    /**\n     * Identifies the type (or kind) that this span is representing.\n     */\n    readonly kind: OTelSpanKind;\n    readonly spanContext: () => IDistributedTraceContext;\n    readonly parentSpanId?: string;\n    readonly parentSpanContext?: IDistributedTraceContext;\n    readonly startTime: IOTelHrTime;\n    readonly endTime: IOTelHrTime;\n    readonly status: IOTelSpanStatus;\n\n    /**\n     * Provides a snapshot of the span's attributes at the time this span was ended.\n     * @returns A read-only snapshot of the span's attributes\n     * @remarks\n     * It is recommended that you only access this property sparingly due to the\n     * performance cost of taking a snapshot of all attributes.\n     */\n    readonly attributes: IOTelAttributes;\n    // readonly links: IOTelLink[];\n    // readonly events: IOTelTimedEvent[];\n    readonly duration: IOTelHrTime;\n    readonly ended: boolean;\n    // readonly resource: IOTelResource;\n    // readonly instrumentationScope: IOTelInstrumentationScope;\n    readonly droppedAttributesCount: number;\n    // readonly droppedEventsCount: number;\n    // readonly droppedLinksCount: number;\n  }\n"
  },
  {
    "path": "shared/AppInsightsCore/src/internal/EventHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport {\n    ICachedValue, arrForEach, arrIndexOf, createCachedValue, getDocument, getWindow, isArray, objForEachKey, objKeys\n} from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { createElmNodeData, createUniqueNamespace } from \"../utils/DataCacheHelper\";\n\n// Added to help with minfication\nconst strOnPrefix = \"on\";\nconst strAttachEvent = \"attachEvent\";\nconst strAddEventHelper = \"addEventListener\";\nconst strDetachEvent = \"detachEvent\";\nconst strRemoveEventListener = \"removeEventListener\";\nconst strEvents = \"events\";\nconst strVisibilityChangeEvt: string = \"visibilitychange\";\nconst strPageHide: string = \"pagehide\";\nconst strPageShow: string = \"pageshow\";\nconst strUnload: string = \"unload\";\nconst strBeforeUnload: string = \"beforeunload\";\n\nlet _strPageHideNamespace: ICachedValue<string>;\nlet _strPageShowNamespace: ICachedValue<string>;\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _getPageHideNamespace() {\n    // Note: Using a cached value instead of a lazy value as we want to ensure that the namespace is consistent\n    // across multiple calls as the `getLazy()` supports runtime invalidation via `setBypassLazyCache()` which would\n    // result in different namespaces being returned.\n    !_strPageHideNamespace && (_strPageHideNamespace = createCachedValue(createUniqueNamespace(\"aiEvtPageHide\")));\n    return _strPageHideNamespace.v;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _getPageShowNamespace() {\n    // Note: Using a cached value instead of a lazy value as we want to ensure that the namespace is consistent\n    // across multiple calls as the `getLazy()` supports runtime invalidation via `setBypassLazyCache()` which would\n    // result in different namespaces being returned.\n    !_strPageShowNamespace && (_strPageShowNamespace = createCachedValue(createUniqueNamespace(\"aiEvtPageShow\")));\n    return _strPageShowNamespace.v;\n}\n\nconst rRemoveEmptyNs = /\\.[\\.]+/g;\nconst rRemoveTrailingEmptyNs = /[\\.]+$/;\n\nlet _guid = 1;\n\ninterface IEventDetails {\n    type: string,\n    ns: string\n}\n\ninterface IRegisteredEvent {\n    guid: number;\n    evtName: IEventDetails;\n    handler: any,\n    capture: boolean\n}\n\ninterface IAiEvents {\n    [name: string]: IRegisteredEvent[]\n}\n\nlet _elmNodeData: ICachedValue<ReturnType<typeof createElmNodeData>>;\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _getElmNodeData() {\n    // Note: Using a cached value instead of a lazy value as we want to ensure that the namespace is consistent\n    // across multiple calls as the `getLazy()` supports runtime invalidation via `setBypassLazyCache()` which would\n    // result in different namespaces being returned.\n    !_elmNodeData && (_elmNodeData = createCachedValue(createElmNodeData(\"events\")));\n    return _elmNodeData.v;\n}\n\nconst eventNamespace = /^([^.]*)(?:\\.(.+)|)/;\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _normalizeNamespace(name: string) {\n    if (name && name.replace) {\n        return name.replace(/^[\\s\\.]+|(?=[\\s\\.])[\\.\\s]+$/g, STR_EMPTY);\n    }\n\n    return name;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _getEvtNamespace(eventName: string | undefined, evtNamespace?: string | string[] | null): IEventDetails {\n    if (evtNamespace) {\n        let theNamespace: string = STR_EMPTY;\n        if (isArray(evtNamespace)) {\n            theNamespace = STR_EMPTY;\n            arrForEach(evtNamespace, (name) => {\n                name = _normalizeNamespace(name);\n                if (name) {\n                    if (name[0] !== \".\") {\n                        name = \".\" + name;\n                    }\n\n                    theNamespace += name;\n                }\n            });\n        } else {\n            theNamespace = _normalizeNamespace(evtNamespace);\n        }\n\n        if (theNamespace) {\n            if (theNamespace[0] !== \".\") {\n                theNamespace = \".\" + theNamespace;\n            }\n\n            // We may only have the namespace and not an eventName\n            eventName = (eventName || STR_EMPTY) + theNamespace;\n        }\n    }\n\n    let parsedEvent: any[] = (eventNamespace.exec(eventName || STR_EMPTY) || []);\n\n    return {\n        type: parsedEvent[1],\n        ns: ((parsedEvent[2] || STR_EMPTY).replace(rRemoveEmptyNs, \".\").replace(rRemoveTrailingEmptyNs, STR_EMPTY).split(\".\").sort()).join(\".\")\n    };\n}\n\n\nexport interface _IRegisteredEvents {\n    name: string;\n    handler: any;\n}\n\n/**\n * Get all of the registered events on the target object, this is primarily used for testing cleanup but may also be used by\n * applications to remove their own events\n * @param target - The EventTarget that has registered events\n * @param eventName - [Optional] The name of the event to return the registered handlers and full name (with namespaces)\n * @param evtNamespace - [Optional] Additional namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace,\n * if the eventName also includes a namespace the namespace(s) are merged into a single namespace\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function __getRegisteredEvents(target: any, eventName?: string, evtNamespace?: string | string[]): _IRegisteredEvents[] {\n    let theEvents: _IRegisteredEvents[] = [];\n    let eventCache = _getElmNodeData().get<IAiEvents>(target, strEvents, {}, false);\n    let evtName = _getEvtNamespace(eventName, evtNamespace);\n\n    objForEachKey(eventCache, (evtType, registeredEvents) => {\n        arrForEach(registeredEvents, (value) => {\n            if (!evtName.type || evtName.type === value.evtName.type) {\n                if (!evtName.ns || evtName.ns === evtName.ns) {\n                    theEvents.push({\n                        name: value.evtName.type + (value.evtName.ns ? \".\" + value.evtName.ns : STR_EMPTY),\n                        handler: value.handler\n                    });\n                }\n            }\n        });\n    });\n \n    return theEvents;\n}\n\n// Exported for internal unit testing only\n/*#__NO_SIDE_EFFECTS__*/\nfunction _getRegisteredEvents(target: any, evtName: string, addDefault: boolean = true): IRegisteredEvent[] {\n    let aiEvts = _getElmNodeData().get<IAiEvents>(target, strEvents, {}, addDefault);\n    let registeredEvents = aiEvts[evtName];\n    if (!registeredEvents) {\n        registeredEvents = aiEvts[evtName] = [];\n    }\n\n    return registeredEvents;\n}\n\nfunction _doDetach(obj: any, evtName: IEventDetails, handlerRef: any, useCapture: boolean) {\n    if (obj && evtName && evtName.type) {\n        if (obj[strRemoveEventListener]) {\n            obj[strRemoveEventListener](evtName.type, handlerRef, useCapture);\n        } else if (obj[strDetachEvent]) {\n            obj[strDetachEvent](strOnPrefix + evtName.type, handlerRef);\n        }\n    }\n}\n\nfunction _doAttach(obj: any, evtName: IEventDetails, handlerRef: any, useCapture: boolean): boolean {\n    let result = false;\n\n    if (obj && evtName && evtName.type && handlerRef) {\n        if (obj[strAddEventHelper]) {\n            // all browsers except IE before version 9\n            obj[strAddEventHelper](evtName.type, handlerRef, useCapture);\n            result = true;\n        } else if (obj[strAttachEvent]) {\n            // IE before version 9\n            obj[strAttachEvent](strOnPrefix + evtName.type, handlerRef);\n            result = true;\n        }\n    }\n\n    return result;\n}\n\nfunction _doUnregister(target: any, events: IRegisteredEvent[], evtName: IEventDetails, unRegFn: (regEvent: IRegisteredEvent) => boolean) {\n    let idx = events.length;\n    while(idx--) {\n        let theEvent: IRegisteredEvent = events[idx];\n        if (theEvent) {\n            if (!evtName.ns || evtName.ns === theEvent.evtName.ns) {\n                if (!unRegFn || unRegFn(theEvent)) {\n                    _doDetach(target, theEvent.evtName, theEvent.handler, theEvent.capture);\n                    // Remove the registered event\n                    events.splice(idx, 1);\n                }\n            }\n        }\n    }\n}\n\nfunction _unregisterEvents(target: any, evtName: IEventDetails, unRegFn: (regEvent: IRegisteredEvent) => boolean) {\n    if (evtName.type) {\n        _doUnregister(target, _getRegisteredEvents(target, evtName.type), evtName, unRegFn);\n    } else {\n        let eventCache = _getElmNodeData().get<IAiEvents>(target, strEvents, {});\n        objForEachKey(eventCache, (evtType, events) => {\n            _doUnregister(target, events, evtName, unRegFn);\n        });\n\n        // Cleanup\n        if (objKeys(eventCache).length === 0) {\n            _getElmNodeData().kill(target, strEvents);\n        }\n    }\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function mergeEvtNamespace(theNamespace: string, namespaces?: string | string[] | null): string | string[] {\n    let newNamespaces: string | string[];\n\n    if (namespaces) {\n        if (isArray(namespaces)) {\n            newNamespaces = [theNamespace].concat(namespaces);\n        } else {\n            newNamespaces = [ theNamespace, namespaces ];\n        }\n\n        // resort the namespaces so they are always in order\n        newNamespaces = (_getEvtNamespace(\"xx\", newNamespaces).ns).split(\".\");\n    } else {\n        newNamespaces = theNamespace;\n    }\n\n    return newNamespaces;\n}\n\n/**\n * Binds the specified function to an event, so that the function gets called whenever the event fires on the object\n * @param obj - Object to add the event too.\n * @param eventName - String that specifies any of the standard DHTML Events without \"on\" prefix, if may also include an optional (dot \".\" prefixed)\n * namespaces \"click\" \"click.mynamespace\" in addition to specific namespaces.\n * @param handlerRef - Pointer that specifies the function to call when event fires\n * @param evtNamespace - [Optional] Additional namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace,\n * if the eventName also includes a namespace the namespace(s) are merged into a single namespace\n * @param useCapture - [Optional] Defaults to false\n * @returns True if the function was bound successfully to the event, otherwise false\n */\nexport function eventOn<T>(target: T, eventName: string, handlerRef: any, evtNamespace?: string | string[] | null, useCapture: boolean = false) {\n    let result = false;\n\n    if (target) {\n        try {\n            let evtName = _getEvtNamespace(eventName, evtNamespace);\n            result = _doAttach(target, evtName, handlerRef, useCapture);\n        \n            if (result && _getElmNodeData().accept(target)) {\n                let registeredEvent: IRegisteredEvent = {\n                    guid: _guid++,\n                    evtName: evtName,\n                    handler: handlerRef,\n                    capture: useCapture\n                };\n    \n                _getRegisteredEvents(target, evtName.type).push(registeredEvent);\n            }\n        } catch (e) {\n            // Just Ignore any error so that we don't break any execution path\n        }\n    }\n\n    return result;\n}\n\n/**\n * Removes an event handler for the specified event\n * @param Object - to remove the event from\n * @param eventName - The name of the event, with optional namespaces or just the namespaces,\n * such as \"click\", \"click.mynamespace\" or \".mynamespace\"\n * @param handlerRef - The callback function that needs to be removed from the given event, when using a\n * namespace (with or without a qualifying event) this may be null to remove all previously attached event handlers\n * otherwise this will only remove events with this specific handler.\n * @param evtNamespace - [Optional] Additional namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace,\n * if the eventName also includes a namespace the namespace(s) are merged into a single namespace\n * @param useCapture - [Optional] Defaults to false\n */\nexport function eventOff<T>(target: T, eventName: string, handlerRef: any, evtNamespace?: string | string[] | null, useCapture: boolean = false) {\n    if (target) {\n        try {\n            let evtName = _getEvtNamespace(eventName, evtNamespace);\n            let found = false;\n            _unregisterEvents(target, evtName, (regEvent) => {\n                if ((evtName.ns && !handlerRef) || regEvent.handler === handlerRef) {\n                    found = true;\n                    return true;\n                }\n\n                return false;\n            });\n\n            if (!found) {\n                // fallback to try and remove as requested\n                _doDetach(target, evtName, handlerRef, useCapture);\n            }\n        } catch (e) {\n            // Just Ignore any error so that we don't break any execution path\n        }\n    }\n}\n\n\n/**\n * Binds the specified function to an event, so that the function gets called whenever the event fires on the object\n * @param obj - Object to add the event too.\n * @param eventNameWithoutOn - String that specifies any of the standard DHTML Events without \"on\" prefix and optional (dot \".\" prefixed) namespaces \"click\" \"click.mynamespace\".\n * @param handlerRef - Pointer that specifies the function to call when event fires\n * @param useCapture - [Optional] Defaults to false\n * @returns True if the function was bound successfully to the event, otherwise false\n */\nexport function attachEvent(obj: any, eventNameWithoutOn: string, handlerRef: any, useCapture: boolean = false) {\n    return eventOn(obj, eventNameWithoutOn, handlerRef, null, useCapture);\n}\n\n/**\n * Removes an event handler for the specified event\n * @param Object - to remove the event from\n * @param eventNameWithoutOn  - The name of the event, with optional namespaces or just the namespaces,\n * such as \"click\", \"click.mynamespace\" or \".mynamespace\"\n * @param handlerRef - The callback function that needs to be removed from the given event, when using a\n * namespace (with or without a qualifying event) this may be null to remove all previously attached event handlers\n * otherwise this will only remove events with this specific handler.\n * @param useCapture - [Optional] Defaults to false\n */\nexport function detachEvent(obj: any, eventNameWithoutOn: string, handlerRef: any, useCapture: boolean = false) {\n    eventOff(obj, eventNameWithoutOn, handlerRef, null, useCapture);\n}\n\n/**\n * Trys to add an event handler for the specified event to the window, body and document\n * @param eventName  - The name of the event\n * @param callback  - The callback function that needs to be executed for the given event\n * @param evtNamespace - [Optional] Namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace.\n * @returns - true if the handler was successfully added\n */\nexport function addEventHandler(eventName: string, callback: any, evtNamespace?: string | string[] | null): boolean {\n    let result = false;\n    let w = getWindow();\n    if (w) {\n        result = eventOn(w, eventName, callback, evtNamespace);\n        result = eventOn(w[\"body\"], eventName, callback, evtNamespace) || result;\n    }\n\n    let doc = getDocument();\n    if (doc) {\n        result = eventOn(doc, eventName, callback, evtNamespace) || result;\n    }\n\n    return result;\n}\n\n/**\n * Trys to remove event handler(s) for the specified event/namespace to the window, body and document\n * @param eventName - The name of the event, with optional namespaces or just the namespaces,\n * such as \"click\", \"click.mynamespace\" or \".mynamespace\"\n * @param callback - The callback function that needs to be removed from the given event, when using a\n * namespace (with or without a qualifying event) this may be null to remove all previously attached event handlers\n * otherwise this will only remove events with this specific handler.\n * @param evtNamespace - [Optional] Namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace.\n */\nexport function removeEventHandler(eventName: string, callback: any, evtNamespace?: string | string[] | null) {\n    let w = getWindow();\n    if (w) {\n        eventOff(w, eventName, callback, evtNamespace);\n        eventOff(w[\"body\"], eventName, callback, evtNamespace);\n    }\n\n    let doc = getDocument();\n    if (doc) {\n        eventOff(doc, eventName, callback, evtNamespace);\n    }\n}\n\n/**\n * Bind the listener to the array of events\n * @param events - An string array of event names to bind the listener to\n * @param listener - The event callback to call when the event is triggered\n * @param excludeEvents - [Optional] An array of events that should not be hooked (if possible), unless no other events can be.\n * @param evtNamespace - [Optional] Namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace.\n * @returns true - when at least one of the events was registered otherwise false\n */\nfunction _addEventListeners(events: string[], listener: any, excludeEvents?: string[] | null, evtNamespace?: string | string[] | null): boolean {\n    let added = false;\n\n    if (listener && events && events.length > 0) {\n        arrForEach(events, (name) => {\n            if (name) {\n                if (!excludeEvents || arrIndexOf(excludeEvents, name) === -1) {\n                    added = addEventHandler(name, listener, evtNamespace) || added;\n                }\n            }\n        });\n    }\n\n    return added;\n}\n\n/**\n * Bind the listener to the array of events\n * @param events - An string array of event names to bind the listener to\n * @param listener - The event callback to call when the event is triggered\n * @param excludeEvents - [Optional] An array of events that should not be hooked (if possible), unless no other events can be.\n * @param evtNamespace - [Optional] Namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace.\n * @returns true - when at least one of the events was registered otherwise false\n */\nexport function addEventListeners(events: string[], listener: any, excludeEvents?: string[], evtNamespace?: string | string[]): boolean {\n    let added = false;\n\n    if (listener && events && isArray(events)) {\n        added = _addEventListeners(events, listener, excludeEvents, evtNamespace);\n\n        if (!added && excludeEvents && excludeEvents.length > 0) {\n            // Failed to add any listeners and we excluded some, so just attempt to add the excluded events\n            added = _addEventListeners(events, listener, null, evtNamespace);\n        }\n    }\n\n    return added;\n}\n\n/**\n * Remove the listener from the array of events\n * @param events - An string array of event names to bind the listener to\n * @param listener - The event callback to call when the event is triggered\n * @param evtNamespace - [Optional] Namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace.\n */\nexport function removeEventListeners(events: string[], listener: any, evtNamespace?: string | string[]) {\n    if (events && isArray(events)) {\n        arrForEach(events, (name) => {\n            if (name) {\n                removeEventHandler(name, listener, evtNamespace);\n            }\n        });\n    }\n}\n\n/**\n * Listen to the 'beforeunload', 'unload' and 'pagehide' events which indicates a page unload is occurring,\n * this does NOT listen to the 'visibilitychange' event as while it does indicate that the page is being hidden\n * it does not *necessarily* mean that the page is being completely unloaded, it can mean that the user is\n * just navigating to a different Tab and may come back (without unloading the page). As such you may also\n * need to listen to the 'addPageHideEventListener' and 'addPageShowEventListener' events.\n * @param listener - The event callback to call when a page unload event is triggered\n * @param excludeEvents - [Optional] An array of events that should not be hooked, unless no other events can be.\n * @param evtNamespace - [Optional] Namespace(s) to append to the event listeners so they can be uniquely identified and removed based on this namespace.\n * @returns true - when at least one of the events was registered otherwise false\n */\nexport function addPageUnloadEventListener(listener: any, excludeEvents?: string[], evtNamespace?: string | string[]): boolean {\n    // Hook the unload event for the document, window and body to ensure that the client events are flushed to the server\n    // As just hooking the window does not always fire (on chrome) for page navigation's.\n    return addEventListeners([strBeforeUnload, strUnload, strPageHide], listener, excludeEvents, evtNamespace);\n}\n\n/**\n * Remove any matching 'beforeunload', 'unload' and 'pagehide' events that may have been added via addEventListener,\n * addEventListeners, addPageUnloadEventListener or addPageHideEventListener.\n * @param listener - The specific event callback to to be removed\n * @param evtNamespace - [Optional] Namespace(s) uniquely identified and removed based on this namespace.\n * @returns true - when at least one of the events was registered otherwise false\n */\nexport function removePageUnloadEventListener(listener: any, evtNamespace?: string | string[]) {\n    removeEventListeners([strBeforeUnload, strUnload, strPageHide], listener, evtNamespace);\n}\n\n/**\n * Listen to the pagehide and visibility changing to 'hidden' events, because the 'visibilitychange' uses\n * an internal proxy to detect the visibility state you SHOULD use a unique namespace when if you plan to call\n * removePageShowEventListener as the remove ignores the listener argument for the 'visibilitychange' event.\n * @param listener - The event callback to call when a page hide event is triggered\n * @param excludeEvents - [Optional] An array of events that should not be hooked (if possible), unless no other events can be.\n * @param evtNamespace - [Optional] A Namespace to append to the event listeners so they can be uniquely identified and removed\n * based on this namespace. This call also adds an additional unique \"pageshow\" namespace to the events\n * so that only the matching \"removePageHideEventListener\" can remove these events.\n * Suggestion: pass as true if you are also calling addPageUnloadEventListener as that also hooks pagehide\n * @returns true - when at least one of the events was registered otherwise false\n */\nexport function addPageHideEventListener(listener: any, excludeEvents?: string[] | null, evtNamespace?: string | string[] | null): boolean {\n\n    function _handlePageVisibility(evt: any) {\n        let doc = getDocument();\n        if (listener && doc && doc.visibilityState === \"hidden\") {\n            listener(evt);\n        }\n    }\n\n    // add the unique page show namespace to any provided namespace so we can only remove the ones added by \"pagehide\"\n    let newNamespaces = mergeEvtNamespace(_getPageHideNamespace(), evtNamespace);\n    let pageUnloadAdded = _addEventListeners([strPageHide], listener, excludeEvents, newNamespaces);\n\n    if (!excludeEvents || arrIndexOf(excludeEvents, strVisibilityChangeEvt) === -1) {\n        pageUnloadAdded = _addEventListeners([strVisibilityChangeEvt], _handlePageVisibility, excludeEvents, newNamespaces) || pageUnloadAdded;\n    }\n\n    if (!pageUnloadAdded && excludeEvents) {\n        // Failed to add any listeners and we where requested to exclude some, so just call again without excluding anything\n        pageUnloadAdded = addPageHideEventListener(listener, null, evtNamespace);\n    }\n\n    return pageUnloadAdded;\n}\n\n/**\n * Removes the pageHide event listeners added by addPageHideEventListener, because the 'visibilitychange' uses\n * an internal proxy to detect the visibility state you SHOULD use a unique namespace when calling addPageHideEventListener\n * as the remove ignores the listener argument for the 'visibilitychange' event.\n * @param listener - The specific listener to remove for the 'pageshow' event only (ignored for 'visibilitychange')\n * @param evtNamespace - The unique namespace used when calling addPageShowEventListener\n */\n\nexport function removePageHideEventListener(listener: any, evtNamespace?: string | string[] | null) {\n    // add the unique page show namespace to any provided namespace so we only remove the ones added by \"pagehide\"\n    let newNamespaces = mergeEvtNamespace(_getPageHideNamespace(), evtNamespace);\n    removeEventListeners([strPageHide], listener, newNamespaces);\n    removeEventListeners([strVisibilityChangeEvt], null, newNamespaces);\n}\n\n/**\n * Listen to the pageshow and visibility changing to 'visible' events, because the 'visibilitychange' uses\n * an internal proxy to detect the visibility state you SHOULD use a unique namespace when if you plan to call\n * removePageShowEventListener as the remove ignores the listener argument for the 'visibilitychange' event.\n * @param listener - The event callback to call when a page is show event is triggered\n * @param excludeEvents - [Optional] An array of events that should not be hooked (if possible), unless no other events can be.\n * @param evtNamespace - [Optional/Recommended] A Namespace to append to the event listeners so they can be uniquely\n * identified and removed based on this namespace. This call also adds an additional unique \"pageshow\" namespace to the events\n * so that only the matching \"removePageShowEventListener\" can remove these events.\n * @returns true - when at least one of the events was registered otherwise false\n */\nexport function addPageShowEventListener(listener: any, excludeEvents?: string[] | null, evtNamespace?: string | string[] | null): boolean {\n\n    function _handlePageVisibility(evt: any) {\n        let doc = getDocument();\n        if (listener && doc && doc.visibilityState === \"visible\") {\n            listener(evt);\n        }\n    }\n\n    // add the unique page show namespace to any provided namespace so we can only remove the ones added by \"pageshow\"\n    let newNamespaces = mergeEvtNamespace(_getPageShowNamespace(), evtNamespace);\n    let pageShowAdded = _addEventListeners([strPageShow], listener, excludeEvents, newNamespaces);\n    pageShowAdded = _addEventListeners([strVisibilityChangeEvt], _handlePageVisibility, excludeEvents, newNamespaces) || pageShowAdded;\n\n    if (!pageShowAdded && excludeEvents) {\n        // Failed to add any listeners and we where requested to exclude some, so just call again without excluding anything\n        pageShowAdded = addPageShowEventListener(listener, null, evtNamespace);\n    }\n\n    return pageShowAdded;\n}\n\n/**\n * Removes the pageShow event listeners added by addPageShowEventListener, because the 'visibilitychange' uses\n * an internal proxy to detect the visibility state you SHOULD use a unique namespace when calling addPageShowEventListener\n * as the remove ignores the listener argument for the 'visibilitychange' event.\n * @param listener - The specific listener to remove for the 'pageshow' event only (ignored for 'visibilitychange')\n * @param evtNamespace - The unique namespace used when calling addPageShowEventListener\n */\nexport function removePageShowEventListener(listener: any, evtNamespace?: string | string[] | null) {\n    // add the unique page show namespace to any provided namespace so we only remove the ones added by \"pageshow\"\n    let newNamespaces = mergeEvtNamespace(_getPageShowNamespace(), evtNamespace);\n    removeEventListeners([strPageShow], listener, newNamespaces);\n    removeEventListeners([strVisibilityChangeEvt], null, newNamespaces);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/internal/attributeHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, arrSlice, isArray, isObject, isString, objForEachKey } from \"@nevware21/ts-utils\";\nimport { IOTelApi } from \"../interfaces/otel/IOTelApi\";\nimport { IOTelAttributes, OTelAttributeValue } from \"../interfaces/otel/IOTelAttributes\";\nimport { createAttributeContainer } from \"../otel/attribute/attributeContainer\";\nimport { handleWarn } from \"./handleErrors\";\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _isSupportedType(theType: string): boolean {\n    return theType === \"number\" || theType === \"boolean\" || theType === \"string\";\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _isHomogeneousArray(arr: unknown[]): boolean {\n    let type: string | undefined;\n    let result = true;\n\n    arrForEach(arr, (element) => {\n        // null/undefined elements are allowed\n        if (element !== null) {\n            let elType = typeof element;\n  \n            if (!type) {\n                result = _isSupportedType(elType);\n                type = elType;\n            } else {\n                result = (type === elType);\n            }\n        }\n\n        if (!result) {\n            return -1;\n        }\n    });\n  \n    return result;\n}\n\n/**\n  * Helper to determine if the provided key is a valid attribute key\n  * @param key - The key to check\n  * @returns true if the key is a valid attribute key\n  */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isAttributeKey(key: unknown): key is string {\n    return isString(key) && !!key;\n}\n  \n/**\n * Helper to determine if the provided value is a valid attribute value\n * @param val - The value to check\n * @returns true if the value is a valid attribute value\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isAttributeValue(val: unknown): val is OTelAttributeValue {\n    let result = (val === null || _isSupportedType(typeof val));\n    if (val && isArray(val)) {\n        result = _isHomogeneousArray(val);\n    }\n\n    return result;\n}\n\n/**\n * Sanitize the provided attributes to ensure they conform to OTel attribute requirements\n * @param otelApi - The OpenTelemetry API instance\n * @param attributes - The attributes to sanitize\n * @returns The sanitized attributes\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function sanitizeAttributes(otelApi: IOTelApi, attributes: unknown): IOTelAttributes {\n    let container = createAttributeContainer(otelApi.cfg);\n  \n    if (!isObject(attributes) || attributes == null) {\n        return {};\n    }\n  \n    objForEachKey(attributes, (key: string, val: unknown) => {\n        if (!isAttributeKey(key)) {\n            handleWarn(otelApi.cfg.errorHandlers, \"Invalid attribute key: \" + key);\n        } else if (!isAttributeValue(val)) {\n            handleWarn(otelApi.cfg.errorHandlers, \"Invalid attribute value set for : \" + key);\n        } else if (isArray(val)) {\n            container.set(key, arrSlice(val as any) as OTelAttributeValue);\n        } else {\n            container.set(key, val);\n        }\n    });\n  \n    return container.attributes;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/internal/commonUtils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise, createRacePromise, createTimeoutPromise } from \"@nevware21/ts-async\";\nimport { ILazyValue, asString, dumpObj, isError, isObject, isPrimitive, safe, safeGetLazy } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { OTelAttributeValue } from \"../interfaces/otel/IOTelAttributes\";\nimport { IAttributeContainer } from \"../interfaces/otel/attribute/IAttributeContainer\";\nimport { IOTelErrorHandlers } from \"../interfaces/otel/config/IOTelErrorHandlers\";\nimport {\n    DBSYSTEMVALUES_DB2, DBSYSTEMVALUES_DERBY, DBSYSTEMVALUES_H2, DBSYSTEMVALUES_HSQLDB, DBSYSTEMVALUES_MARIADB, DBSYSTEMVALUES_MSSQL,\n    DBSYSTEMVALUES_ORACLE, DBSYSTEMVALUES_OTHER_SQL, DBSYSTEMVALUES_SQLITE\n} from \"../otel/attribute/SemanticConventions\";\nimport { getJSON } from \"../utils/EnvUtils\";\nimport { handleError } from \"./handleErrors\";\n\nconst _hasJsonStringify: ILazyValue<boolean> = (/*#__PURE__*/ safeGetLazy(() => !!getJSON().stringify, null));\n\nconst SYNTHETIC_TYPE = \"user_agent.synthetic.type\";\nconst CLIENT_DOT = \"client.\";\nconst HTTP_DOT = \"http.\";\nconst NET_DOT = \"net.\";\nconst PEER_DOT = \"peer.\";\nconst ATTR_NETWORK_PEER_ADDRESS = \"network.peer.address\";\nconst SEMATTRS_NET_PEER_IP = NET_DOT + PEER_DOT + \"ip\";\nconst ATTR_CLIENT_ADDRESS = CLIENT_DOT + \"address\";\nconst SEMATTRS_HTTP_CLIENT_IP = HTTP_DOT + \"client_ip\";\nconst ATTR_USER_AGENT_ORIGINAL = \"user_agent.original\";\nconst SEMATTRS_HTTP_USER_AGENT = HTTP_DOT + \"user_agent\";\nconst ATTR_URL_FULL = \"url.full\";\nconst SEMATTRS_HTTP_URL = HTTP_DOT + \"url\";\nconst ATTR_HTTP_REQUEST_METHOD = HTTP_DOT + \"request.method\";\nconst SEMATTRS_HTTP_METHOD = HTTP_DOT + \"method\";\nconst ATTR_HTTP_RESPONSE_STATUS_CODE = HTTP_DOT + \"response.status_code\";\nconst SEMATTRS_HTTP_STATUS_CODE = HTTP_DOT + \"status_code\";\nconst ATTR_URL_SCHEME = \"url.scheme\";\nconst SEMATTRS_HTTP_SCHEME = HTTP_DOT + \"scheme\";\nconst ATTR_URL_PATH = \"url.path\";\nconst ATTR_URL_QUERY = \"url.query\";\nconst SEMATTRS_HTTP_TARGET = HTTP_DOT + \"target\";\nconst ATTR_SERVER_ADDRESS = \"server.address\";\nconst SEMATTRS_HTTP_HOST = HTTP_DOT + \"host\";\nconst SEMATTRS_NET_PEER_NAME = NET_DOT + PEER_DOT + \"name\";\nconst ATTR_CLIENT_PORT = CLIENT_DOT + \"port\";\nconst ATTR_SERVER_PORT = \"server.port\";\nconst SEMATTRS_NET_PEER_PORT = NET_DOT + PEER_DOT + \"port\";\nconst SEMATTRS_PEER_SERVICE = PEER_DOT + \"service\";\n\n/**\n * Get the URL from the attribute container\n * @param container - The attribute container to extract the URL from\n * @returns The constructed URL string\n */\n/* #__NO_SIDE_EFFECTS__ */\nexport function getUrl(container: IAttributeContainer): string {\n    let result = \"\";\n    if (container) {\n        const httpMethod = getHttpMethod(container);\n        if (httpMethod) {\n            const httpUrl = getHttpUrl(container);\n            if (httpUrl) {\n                result = asString(httpUrl);\n            } else {\n                const httpScheme = getHttpScheme(container);\n                const httpTarget = getHttpTarget(container);\n                if (httpScheme && httpTarget) {\n                    const httpHost = getHttpHost(container);\n                    if (httpHost) {\n                        result = httpScheme + \"://\" + httpHost + httpTarget;\n                    } else {\n                        const netPeerPort = getNetPeerPort(container);\n                        if (netPeerPort) {\n                            const netPeerName = getNetPeerName(container);\n                            if (netPeerName) {\n                                result = httpScheme + \"://\" + netPeerName + \":\" + netPeerPort + httpTarget;\n                            } else {\n                                const netPeerIp = getPeerIp(container);\n                                if (netPeerIp) {\n                                    result = httpScheme + \"://\" + netPeerIp + \":\" + netPeerPort + httpTarget;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    return result;\n}\n\n/**\n * Gets the synthetic type from the attribute container\n * @param container - The attribute container to extract the synthetic type from\n * @returns The synthetic type value\n */\n/* #__NO_SIDE_EFFECTS__ */\nexport function getSyntheticType(container: IAttributeContainer): OTelAttributeValue {\n    return container.get(SYNTHETIC_TYPE);\n}\n\n/**\n * Determine if the attribute container represents a synthetic source\n * @param container - The attribute container to check\n * @returns True if the attribute container is from a synthetic source\n */\n/* #__NO_SIDE_EFFECTS__ */\nexport function isSyntheticSource(container: IAttributeContainer): boolean {\n    return !!getSyntheticType(container);\n}\n\n/**\n * Serialize an attribute value to a string value\n * @param value - The attribute value to serialize\n * @returns The serialized string value\n */\n/* #__NO_SIDE_EFFECTS__ */\nexport function serializeAttribute(value: any): string | number | bigint | boolean | undefined | symbol | null {\n    let result: string | number | boolean | null | undefined;\n    if (isError(value)) {\n        result = dumpObj(value);\n    } else if ((!value.toString || isObject(value)) && _hasJsonStringify.v) {\n        result = safe(getJSON().stringify, [value]).v;\n    } else if (isPrimitive(value)) {\n        // We keep primitives as-is, so that the standard attribute types are preserved\n        // These are converted as required in the sending channel(s)\n        result = value as any;\n    } else {\n        result = asString(value);\n    }\n\n    // Return scalar and undefined values\n    return result;\n}\n\n/**\n * Peer address of the network connection - IP address or Unix domain socket name.\n *\n * @example 10.1.2.80\n * @example /tmp/my.sock\n * @since 3.4.0\n */\n/* #__NO_SIDE_EFFECTS__ */\nexport function getPeerIp(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_NETWORK_PEER_ADDRESS) || container.get(SEMATTRS_NET_PEER_IP);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getLocationIp(container: IAttributeContainer): OTelAttributeValue | undefined {\n    let result: OTelAttributeValue | undefined;\n    if (container) {\n        const httpClientIp = getHttpClientIp(container);\n        if (httpClientIp) {\n            result = asString(httpClientIp);\n        }\n\n        if (!result) {\n            const netPeerIp = getPeerIp(container);\n            if (netPeerIp) {\n                result = asString(netPeerIp);\n            }\n        }\n    }\n\n    return result;\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getHttpClientIp(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_CLIENT_ADDRESS) || container.get(SEMATTRS_HTTP_CLIENT_IP);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getUserAgent(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_USER_AGENT_ORIGINAL) || container.get(SEMATTRS_HTTP_USER_AGENT);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getHttpUrl(container: IAttributeContainer): OTelAttributeValue | undefined {\n    // Stable sem conv only supports populating url from `url.full`\n    if (container) {\n        return container.get(ATTR_URL_FULL) || container.get(SEMATTRS_HTTP_URL);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getHttpMethod(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_HTTP_REQUEST_METHOD) || container.get(SEMATTRS_HTTP_METHOD);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getHttpStatusCode(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_HTTP_RESPONSE_STATUS_CODE) || container.get(SEMATTRS_HTTP_STATUS_CODE);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getHttpScheme(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_URL_SCHEME) || container.get(SEMATTRS_HTTP_SCHEME);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getHttpTarget(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_URL_PATH) || container.get(ATTR_URL_QUERY) || container.get(SEMATTRS_HTTP_TARGET);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getHttpHost(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_SERVER_ADDRESS) || container.get(SEMATTRS_HTTP_HOST);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getNetPeerName(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return container.get(ATTR_CLIENT_ADDRESS) || container.get(SEMATTRS_NET_PEER_NAME);\n    }\n}\n\n/* #__NO_SIDE_EFFECTS__ */\nexport function getNetPeerPort(container: IAttributeContainer): OTelAttributeValue | undefined {\n    if (container) {\n        return (\n            container.get(ATTR_CLIENT_PORT) ||\n            container.get(ATTR_SERVER_PORT) ||\n            container.get(SEMATTRS_NET_PEER_PORT)\n        );\n    }\n}\n\nexport function getDependencyTarget(container: IAttributeContainer): string {\n    let result: string;\n    if (container) {\n        const peerService = container.get(SEMATTRS_PEER_SERVICE);\n        if (peerService) {\n            result = asString(peerService);\n        }\n        \n        if (!result) {\n            const httpHost = getHttpHost(container);\n            if (httpHost) {\n                result = asString(httpHost);\n            }\n        }\n\n        if (!result) {\n            const httpUrl = getHttpUrl(container);\n            if (httpUrl) {\n                result = asString(httpUrl);\n            }\n        }\n\n        if (!result) {\n            const netPeerName = getNetPeerName(container);\n            if (netPeerName) {\n                result = asString(netPeerName);\n            }\n        }\n        if (!result) {\n            const netPeerIp = getPeerIp(container);\n            if (netPeerIp) {\n                result = asString(netPeerIp);\n            }\n        }\n    }\n\n    return result || STR_EMPTY;\n}\n\n/** #__NO_SIDE_EFFECTS__ */\nexport function isSqlDB(dbSystem: string): boolean {\n    return (\n        dbSystem === DBSYSTEMVALUES_DB2 ||\n        dbSystem === DBSYSTEMVALUES_DERBY ||\n        dbSystem === DBSYSTEMVALUES_MARIADB ||\n        dbSystem === DBSYSTEMVALUES_MSSQL ||\n        dbSystem === DBSYSTEMVALUES_ORACLE ||\n        dbSystem === DBSYSTEMVALUES_SQLITE ||\n        dbSystem === DBSYSTEMVALUES_OTHER_SQL ||\n        dbSystem === DBSYSTEMVALUES_HSQLDB ||\n        dbSystem === DBSYSTEMVALUES_H2\n    );\n}\n\n/**\n * Adds a timeout to a promise and rejects if the specified timeout has elapsed.\n * Reports the timeout through the configured error handlers before rejecting.\n *\n * @param handlers - The configured error handlers to notify.\n * @param promise - The promise to guard with the timeout.\n * @param timeout - Timeout in milliseconds before the promise is rejected.\n */\nexport function callWithTimeout<T>(\n    handlers: IOTelErrorHandlers,\n    promise: Promise<T>,\n    timeout: number\n): IPromise<T> {\n    const timeoutMessage = \"Operation timed out.\";\n    const timeoutError = new Error(timeoutMessage);\n    timeoutError.name = \"TimeoutError\";\n    (timeoutError as { __otelTimeout?: boolean }).__otelTimeout = true;\n\n    const racedPromise = createRacePromise<T>([\n        promise,\n        createTimeoutPromise<Error>(timeout, false, timeoutError) as unknown as PromiseLike<T>\n    ]);\n\n    return racedPromise.catch((error) => {\n        if (error && (error === timeoutError || (error as { __otelTimeout?: boolean }).__otelTimeout)) {\n            handleError(handlers, timeoutMessage);\n        }\n\n        throw error;\n    });\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/internal/handleErrors.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { dumpObj, fnApply } from \"@nevware21/ts-utils\";\nimport { IOTelErrorHandlers } from \"../interfaces/otel/config/IOTelErrorHandlers\";\n\n/**\n * Handle / report an error.\n * When not provided the default is to generally throw an {@link OTelInvalidAttributeError}\n * @param handlers - The error handlers configuration\n * @param message - The error message to report\n * @param key - The attribute key that caused the error\n * @param value - The attribute value that caused the error\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function handleAttribError(handlers: IOTelErrorHandlers, message: string, key: string, value: any) {\n    if (handlers.attribError) {\n        handlers.attribError(message, key, value);\n    } else {\n        handleWarn(handlers, message + \" for [\" + key + \"]: \" + dumpObj(value));\n    }\n}\n\n/**\n * There was an error with the span.\n * @param handlers - The error handlers configuration\n * @param message - The message to report\n * @param spanName - The name of the span\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function handleSpanError(handlers: IOTelErrorHandlers, message: string, spanName: string) {\n    if (handlers.spanError) {\n        handlers.spanError(message, spanName);\n    } else {\n        handleWarn(handlers, \"Span [\" + spanName + \"]: \" + message);\n    }\n}\n\n/**\n * Report a general debug message, should not be treated as fatal\n * @param handlers - The error handlers configuration\n * @param message - The debug message to report\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function handleDebug(handlers: IOTelErrorHandlers, message: string) {\n    if (handlers.debug) {\n        handlers.debug(message);\n    } else {\n        if (console) {\n            let fn = console.log;\n            fnApply(fn, console, [message]);\n        }\n    }\n}\n\n/**\n * Report a general warning, should not be treated as fatal\n * @param handlers - The error handlers configuration\n * @param message - The warning message to report\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function handleWarn(handlers: IOTelErrorHandlers, message: string) {\n    if (handlers.warn) {\n        handlers.warn(message);\n    } else {\n        if (console) {\n            let fn = console.warn || console.log;\n            fnApply(fn, console, [message]);\n        }\n    }\n}\n\n/**\n * Report a general error, should not be treated as fatal\n * @param handlers - The error handlers configuration\n * @param message - The error message to report\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function handleError(handlers: IOTelErrorHandlers, message: string) {\n    if (handlers.error) {\n        handlers.error(message);\n    } else if (handlers.warn) {\n        handlers.warn(message);\n    } else {\n        if (console) {\n            let fn = console.error || console.warn || console.log;\n            fnApply(fn, console, [message]);\n        }\n    }\n}\n\n/**\n * A general error handler for not implemented methods.\n * @param handlers - The error handlers configuration\n * @param message - The message to report\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function handleNotImplemented(handlers: IOTelErrorHandlers, message: string) {\n    if (handlers.notImplemented) {\n        handlers.notImplemented(message);\n    } else {\n        if (console) {\n            let fn = console.error || console.log;\n            fnApply(fn, console, [message]);\n        }\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/internal/noopHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * A simple function that does nothing and returns the current this (if any).\n * @returns\n */\nexport function _noopThis<T>(this: T): T {\n    return this;\n}\n\n/**\n * A simple function that does nothing and returns undefined.\n */\nexport function _noopVoid<T>(this: T): void {\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/internal/timeHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    ICachedValue, ObjDefinePropDescriptor, createCachedValue, getDeferred, getPerformance, isArray, isDate, isNullOrUndefined, isNumber,\n    mathFloor, mathRound, objDefineProps, objFreeze, perfNow, strLeft, strRight, throwTypeError\n} from \"@nevware21/ts-utils\";\nimport { IOTelHrTime, OTelTimeInput } from \"../interfaces/IOTelHrTime\";\nimport { setObjStringTag, toISOString } from \"../utils/HelperFuncs\";\nimport { INVALID_TRACE_ID } from \"../utils/TraceParent\";\n\nconst NANOSECOND_DIGITS = 9;\n\n// Constants for time unit conversions and manipulation\nconst NANOS_IN_MILLIS = 1000000; // Number of nanoseconds in a millisecond\nconst NANOS_IN_SECOND = 1000000000; // Number of nanoseconds in a second\nconst MICROS_IN_SECOND = 1000000; // Number of microseconds in a second\nconst MICROS_IN_MILLIS = 1000; // Number of microseconds in a millisecond\nconst MILLIS_IN_SECOND = 1000; // Number of milliseconds in a second\ninterface IOriginHrTime {\n    to: number;\n    hr: IOTelHrTime\n}\n\nlet cSecondsToNanos: ICachedValue<number>;\nlet cTimeOrigin: ICachedValue<IOriginHrTime>;\nlet cNanoPadding: ICachedValue<string>;\n\nfunction _notMutable() {\n    throwTypeError(\"HrTime is not mutable\")\n}\n\n/**\n * Initialize the cached value for converting milliseconds to nanoseconds.\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction _initSecondsToNanos(): ICachedValue<number> {\n    if (!cSecondsToNanos) {\n        cSecondsToNanos = createCachedValue(NANOS_IN_SECOND);\n    }\n    return cSecondsToNanos;\n}\n\n/**\n * Initialize the time origin.\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction _initTimeOrigin(): ICachedValue<IOriginHrTime> {\n    if (!cTimeOrigin) {\n        let timeOrigin = 0;\n        let perf = getPerformance();\n        if (perf) {\n            timeOrigin = perf.timeOrigin;\n            if (!isNumber(timeOrigin)) {\n                timeOrigin = (perf as any).timing && (perf as any).timing.fetchStart;\n            }\n\n            if (!isNumber(timeOrigin) && perf.now) {\n                timeOrigin = perf.now();\n            }\n        }\n\n        cTimeOrigin = createCachedValue({\n            to: timeOrigin,\n            hr: millisToHrTime(timeOrigin)\n        });\n    }\n    return cTimeOrigin;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _finalizeHrTime(hrTime: IOTelHrTime) {\n    function _toString() {\n        return \"[\" + hrTime[0] + \", \" + hrTime[1] + \"]\";\n    }\n\n    setObjStringTag(hrTime, _toString);\n    \n    return objFreeze(hrTime);\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _createUnixNanoHrTime(unixNano: number): IOTelHrTime {\n    // Create array with initial length of 2\n    const hrTime = [0, 0] as any as IOTelHrTime;\n    const immutable: ObjDefinePropDescriptor = { v: _notMutable, w: false, e: false };\n    \n    // Define the array elements and other properties (avoid redefining length)\n    objDefineProps(hrTime, {\n        0: {\n            l: getDeferred(() => mathFloor(unixNano / NANOS_IN_SECOND))\n        },\n        1: {\n            l: getDeferred(() => unixNano % NANOS_IN_SECOND)\n        },\n        // unixNano: {\n        //     v: unixNano,\n        //     e: false,\n        //     w: false\n        // },\n        // Override array mutating methods with single _notMutable function\n        push: immutable,\n        pop: immutable,\n        shift: immutable,\n        unshift: immutable,\n        splice: immutable,\n        sort: immutable,\n        reverse: immutable,\n        fill: immutable,\n        copyWithin: immutable\n    });\n\n    return _finalizeHrTime(hrTime);\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _createHrTime(seconds: number, nanoseconds: number): IOTelHrTime {\n    const hrTime = [seconds, nanoseconds] as IOTelHrTime;\n\n    // objDefine(hrTime, \"unixNano\", {\n    //     v: (seconds * NANOS_IN_SECOND) + nanoseconds,\n    //     w: false,\n    //     e: false\n    // });\n\n    return _finalizeHrTime(hrTime);\n}\n\n/**\n * Returns a new HrTime object with zero values for seconds and nanoseconds.\n * @returns A HrTime object representing zero time.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function zeroHrTime(): IOTelHrTime {\n    return _createUnixNanoHrTime(0);\n}\n\n/**\n * Converts a number of milliseconds from epoch to HrTime([seconds, remainder in nanoseconds]).\n * @param epochMillis - The number of milliseconds since the epoch (January 1, 1970).\n * @returns A HrTime object representing the converted time.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function millisToHrTime(epochMillis: number): IOTelHrTime {\n    let result: IOTelHrTime;\n\n    if (epochMillis > 0) {\n        // Handle whole and fractional parts separately for maximum precision\n        const wholeMillis = mathFloor(epochMillis);\n        const fractionalMillis = epochMillis - wholeMillis;\n        \n        // Handle whole milliseconds using integer arithmetic\n        const seconds = mathFloor(wholeMillis / MILLIS_IN_SECOND);\n        const millisFromSeconds = wholeMillis % MILLIS_IN_SECOND;\n        const nanosFromWholeMillis = millisFromSeconds * NANOS_IN_MILLIS;\n        \n        // Convert fractional milliseconds to nanoseconds with proper rounding\n        // Use Math.round to properly handle cases where we need to round up\n        const nanosFromFraction = mathRound(fractionalMillis * NANOS_IN_MILLIS);\n        \n        // Combine the nanoseconds parts and handle any potential overflow\n        let totalNanos = nanosFromWholeMillis + nanosFromFraction;\n        let adjustedSeconds = seconds;\n        \n        // Check if we need to increment the seconds\n        if (totalNanos >= NANOS_IN_SECOND) {\n            adjustedSeconds++;\n            totalNanos -= NANOS_IN_SECOND;\n        }\n        \n        result = _createHrTime(adjustedSeconds, totalNanos);\n    }\n\n    return result || zeroHrTime();\n}\n\n/**\n * Converts a number of nanoseconds to HrTime([seconds, remainder in nanoseconds]).\n * @param nanos - The number of nanoseconds since the epoch (January 1, 1970).\n * @returns A HrTime object representing the converted time.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function nanosToHrTime(nanos: number): IOTelHrTime {\n    let result: IOTelHrTime;\n    if (nanos > 0) {\n        result = _createUnixNanoHrTime(nanos);\n    }\n    return result || zeroHrTime();\n}\n\n// /**\n//  * Converts a HrTime object to a number representing nanoseconds since epoch.\n//  * Note: Due to JavaScript number limitations, values greater than Number.MAX_SAFE_INTEGER\n//  * may lose precision. For very large time values, consider using string representation\n//  * or splitting into separate second/nanosecond components.\n//  * @param hrTime - The HrTime object to convert.\n//  * @returns The number of nanoseconds represented by the HrTime object.\n//  */\n// export function hrTimeToUnixNanos(hrTime: IOTelHrTime): number {\n//     let value = hrTime.unixNano;\n//     if (isNullOrUndefined(value)) {\n//         // Handle legacy HRTime format using standard number operations\n//         // First calculate seconds contribution to nanoseconds\n//         const secondsInNanos = hrTime[0] * NANOS_IN_MILLIS;\n//         // Add the additional nanoseconds\n//         value = secondsInNanos + hrTime[1];\n//\n//         // // Add warning if we're approaching number precision limits\n//         // if (Math.abs(value) > Number.MAX_SAFE_INTEGER) {\n//         //     console.warn(\"Time value exceeds safe integer limits, precision may be lost\");\n//         // }\n//     }\n//\n//     return value;\n// }\n\n/**\n * Returns an hrtime calculated via performance component.\n * @param performanceNow - The current time in milliseconds since the epoch.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function hrTime(performanceNow?: number): IOTelHrTime {\n    let result = millisToHrTime(isNumber(performanceNow) ? performanceNow : perfNow());\n    const perf = getPerformance();\n    if (perf) {\n        const timeOrigin = cTimeOrigin || _initTimeOrigin();\n        result = addHrTimes(timeOrigin.v.hr, result);\n    }\n\n    return result;\n}\n\n/**\n * Converts a TimeInput to an HrTime, defaults to _hrtime().\n * @param time - The time input to convert.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function timeInputToHrTime(time: OTelTimeInput): IOTelHrTime {\n    let result: IOTelHrTime;\n    \n    if (!isTimeInputHrTime(time)) {\n        if (isNumber(time)) {\n            const timeOrigin = cTimeOrigin || _initTimeOrigin();\n            // Must be a performance.now() if it's smaller than process start time\n            result = (time < timeOrigin.v.to) ? hrTime(time) : millisToHrTime(time);\n        } else if (isDate(time)) {\n            result = millisToHrTime((time as Date).getTime());\n        } else {\n            throwTypeError(\"Invalid input type\");\n        }\n    } else {\n        // Convert HrTime array to IOTelHrTime\n        result = _createHrTime(time[0], time[1]);\n    }\n\n    return result;\n}\n\n/**\n * Returns a duration of two hrTime.\n * @param startTime - The start time of the duration\n * @param endTime - The end time of the duration\n * @returns The duration between startTime and endTime as an IOTelHrTime\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function hrTimeDuration(startTime: IOTelHrTime, endTime: IOTelHrTime): IOTelHrTime {\n    const seconds = endTime[0] - startTime[0];\n    let nanos = endTime[1] - startTime[1];\n\n    // overflow\n    if (nanos < 0) {\n        const adjustedSeconds = seconds - 1;\n        // negate\n        const nanoSeconds = cSecondsToNanos || _initSecondsToNanos();\n        nanos += nanoSeconds.v;\n        return _createHrTime(adjustedSeconds, nanos);\n    }\n\n    return _createHrTime(seconds, nanos);\n}\n\n/**\n * Convert hrTime to timestamp, for example \"2019-05-14T17:00:00.000123456Z\"\n * @param time - The hrTime to convert.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function hrTimeToTimeStamp(time: IOTelHrTime): string {\n    if (!cNanoPadding) {\n        cNanoPadding = createCachedValue(strLeft(INVALID_TRACE_ID, NANOSECOND_DIGITS));\n    }\n\n    const date = toISOString(new Date(time[0] * 1000));\n    return date.replace(\"000Z\", strRight(cNanoPadding.v + time[1] + \"Z\", NANOSECOND_DIGITS + 1));\n}\n\n/**\n * Convert hrTime to nanoseconds.\n * @param time - The hrTime to convert.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function hrTimeToNanoseconds(time: IOTelHrTime): number {\n    let nanoSeconds = cSecondsToNanos || _initSecondsToNanos();\n    return time[0] * nanoSeconds.v + time[1];\n}\n\n/**\n * Convert hrTime to milliseconds.\n * @param time - The hrTime to convert.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function hrTimeToMilliseconds(time: IOTelHrTime): number {\n    // Use integer math for the seconds part to avoid floating point precision loss\n    const millisFromSeconds = time[0] * MILLIS_IN_SECOND;\n    // Convert nanoseconds to milliseconds with proper rounding\n    const millisFromNanos = Math.round(time[1] / NANOS_IN_MILLIS);\n    return millisFromSeconds + millisFromNanos;\n}\n\n/**\n * Convert hrTime to microseconds.\n * @param time - The hrTime to convert.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function hrTimeToMicroseconds(time: IOTelHrTime): number {\n    // Use integer math for the seconds part to avoid floating point precision loss\n    const microsFromSeconds = time[0] * MICROS_IN_SECOND;\n    // Convert nanoseconds to microseconds with proper rounding\n    const microsFromNanos = Math.round(time[1] / MICROS_IN_MILLIS);\n    return microsFromSeconds + microsFromNanos;\n}\n\n/**\n * check if time is HrTime\n * @param value - The value to check.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isTimeInputHrTime(value: unknown): value is IOTelHrTime {\n    return isArray(value) && value.length === 2 && isNumber(value[0]) && isNumber(value[1]);\n}\n\n/**\n * check if input value is a correct types.TimeInput\n * @param value - The value to check.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isTimeInput(value: unknown): value is OTelTimeInput {\n    return !isNullOrUndefined(value) && (isTimeInputHrTime(value) || isNumber(value) || isDate(value));\n}\n\n/**\n * Given 2 HrTime formatted times, return their sum as an HrTime.\n * @param time1 - The first HrTime to add\n * @param time2 - The second HrTime to add\n * @returns The sum of the two HrTime values as an IOTelHrTime\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function addHrTimes(time1: IOTelHrTime, time2: IOTelHrTime): IOTelHrTime {\n    const seconds = time1[0] + time2[0];\n    let nanos = time1[1] + time2[1];\n    const nanoSeconds = cSecondsToNanos || _initSecondsToNanos();\n\n    // Nanoseconds overflow check\n    if (nanos >= nanoSeconds.v) {\n        nanos -= nanoSeconds.v;\n        return _createHrTime(seconds + 1, nanos);\n    }\n\n    return _createHrTime(seconds, nanos);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/OTelApi.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ILazyValue, objDefineProps } from \"@nevware21/ts-utils\";\nimport { IOTelApi } from \"../../interfaces/otel/IOTelApi\";\nimport { IOTelApiCtx } from \"../../interfaces/otel/IOTelApiCtx\";\nimport { ITraceApi } from \"../../interfaces/otel/trace/IOTelTraceApi\";\nimport { setProtoTypeName } from \"../../utils/HelperFuncs\";\nimport { _createTraceApi } from \"./trace/traceApi\";\nimport { _createTracerProvider } from \"./trace/tracerProvider\";\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function createOTelApi(otelApiCtx: IOTelApiCtx): IOTelApi {\n    let _traceApi: ILazyValue<ITraceApi>;\n\n    let otelApi = setProtoTypeName(objDefineProps<IOTelApi>(_createTracerProvider(otelApiCtx.host) as IOTelApi, {\n        cfg: { g: () => otelApiCtx.host.config },\n        trace: { g: () => _traceApi.v },\n        host: { g: () => otelApiCtx.host }\n    }), \"OTelApi\");\n\n    _traceApi = _createTraceApi(otelApi);\n\n    return otelApi\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/errors/OTelError.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { CustomErrorConstructor, createCustomError } from \"@nevware21/ts-utils\";\n\nlet otelErrorType: OpenTelemetryErrorConstructor;\n\nexport interface OpenTelemetryError extends Error {\n\n}\n\nexport interface OpenTelemetryErrorConstructor<T extends Error = OpenTelemetryError> extends CustomErrorConstructor<T> {\n    \n    new (message?: string): T;\n\n    (message?: string): T;\n}\n\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function getOpenTelemetryError(): OpenTelemetryErrorConstructor {\n    if (!otelErrorType) {\n        otelErrorType = createCustomError<OpenTelemetryErrorConstructor>(\"OpenTelemetryError\", function (self, args) {\n        });\n    }\n\n    return otelErrorType;\n}\n\nexport function throwOTelError(message: string): never {\n    throw new (getOpenTelemetryError())(message);\n}"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/errors/OTelInvalidAttributeError.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createCustomError } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../../../constants/InternalConstants\";\nimport { OpenTelemetryError, OpenTelemetryErrorConstructor, getOpenTelemetryError } from \"./OTelError\";\n\nlet otelInvalidAttributeErrorType: OTelInvalidAttributeErrorConstructor;\n\nexport interface OTelInvalidAttributeError extends OpenTelemetryError {\n    readonly attribName: string;\n\n    readonly value: any;\n}\n\ninterface OTelInvalidAttributeErrorConstructor extends OpenTelemetryErrorConstructor<OTelInvalidAttributeError> {\n    \n    new (message?: string, attribName?: string, value?: any): OTelInvalidAttributeError;\n\n    (message?: string, attribName?: string, value?: any): OTelInvalidAttributeError;\n}\n\nexport function throwOTelInvalidAttributeError(message: string, attribName: string, value: any): void {\n    if (!otelInvalidAttributeErrorType) {\n        otelInvalidAttributeErrorType = createCustomError<OTelInvalidAttributeErrorConstructor>(\"OTelInvalidAttributeError\", function (self, args) {\n            let len = args.length;\n\n            self.attribName = len > 1 ? args[1] : STR_EMPTY;\n            self.value = len > 2 ? args[2] : STR_EMPTY;\n        }, getOpenTelemetryError());\n    }\n\n    throw new otelInvalidAttributeErrorType(message, attribName, value);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/errors/OTelSpanError.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createCustomError } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../../../constants/InternalConstants\";\nimport { OpenTelemetryError, OpenTelemetryErrorConstructor, getOpenTelemetryError } from \"./OTelError\";\n\nlet otelSpanErrorType: OTelSpanErrorConstructor;\n\nexport interface OTelSpanError extends OpenTelemetryError {\n    readonly spanName: string;\n}\n\ninterface OTelSpanErrorConstructor extends OpenTelemetryErrorConstructor<OTelSpanError> {\n    \n    new (message?: string, spanName?: string): OTelSpanError;\n\n    (message?: string, spanName?: string): OTelSpanError;\n}\n\nexport function throwOTelSpanError(message: string, spanName: string): never {\n    if (!otelSpanErrorType) {\n        otelSpanErrorType = createCustomError<OTelSpanErrorConstructor>(\"OTelSpanError\", (self, args) => {\n            let len = args.length;\n\n            self.spanName = len > 1 ? args[1] : STR_EMPTY;\n        }, getOpenTelemetryError());\n    }\n\n    throw new otelSpanErrorType(message, spanName);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/span.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    ILazyValue, dumpObj, getDeferred, isNullOrUndefined, isString, objDefineProps, objFreeze, objIs, objKeys, perfNow\n} from \"@nevware21/ts-utils\";\nimport { STR_EMPTY, UNDEFINED_VALUE } from \"../../../constants/InternalConstants\";\nimport { OTelSpanKind, eOTelSpanKind } from \"../../../enums/otel/OTelSpanKind\";\nimport { eOTelSpanStatusCode } from \"../../../enums/otel/OTelSpanStatus\";\nimport { OTelException } from \"../../../interfaces/IException\";\nimport { IOTelHrTime, OTelTimeInput } from \"../../../interfaces/IOTelHrTime\";\nimport { IOTelAttributes } from \"../../../interfaces/otel/IOTelAttributes\";\nimport { IAttributeContainer } from \"../../../interfaces/otel/attribute/IAttributeContainer\";\nimport { IOTelSpanCtx } from \"../../../interfaces/otel/trace/IOTelSpanCtx\";\nimport { IOTelSpanStatus } from \"../../../interfaces/otel/trace/IOTelSpanStatus\";\nimport { IReadableSpan } from \"../../../interfaces/otel/trace/IReadableSpan\";\nimport { isAttributeValue } from \"../../../internal/attributeHelpers\";\nimport { handleAttribError, handleNotImplemented, handleSpanError, handleWarn } from \"../../../internal/handleErrors\";\nimport {\n    hrTime, hrTimeDuration, hrTimeToMilliseconds, millisToHrTime, timeInputToHrTime, zeroHrTime\n} from \"../../../internal/timeHelpers\";\nimport { setProtoTypeName, updateProtoTypeName } from \"../../../utils/HelperFuncs\";\nimport { addAttributes, createAttributeContainer } from \"../../attribute/attributeContainer\";\n\nexport function createSpan(spanCtx: IOTelSpanCtx, orgName: string, kind: OTelSpanKind): IReadableSpan {\n    let otelCfg = spanCtx.api.cfg;\n    let perfStartTime: number = perfNow();\n    let spanContext = spanCtx.spanContext;\n    let attributes: ILazyValue<IAttributeContainer>;\n    let isEnded = false;\n    let errorHandlers = otelCfg.errorHandlers || {};\n    let spanStartTime: ILazyValue<IOTelHrTime> = getDeferred(() => {\n        if (isNullOrUndefined(spanCtx.startTime)) {\n            return hrTime(perfStartTime);\n        }\n\n        return timeInputToHrTime(spanCtx.startTime);\n    });\n    let spanEndTime: IOTelHrTime | undefined;\n    let spanDuration: IOTelHrTime;\n    let spanStatus: IOTelSpanStatus | undefined;\n    // let links: IOTelLink[] = [];\n    // let events: IOTelTimedEvent[] = [];\n    let localDroppedAttributes = 0;\n    let localContainer: IAttributeContainer = null;\n    // let droppedEvents = 0;\n    // let droppedLinks = 0;\n    let isRecording = spanCtx.isRecording !== false;\n\n    if (otelCfg.traceCfg && otelCfg.traceCfg.suppressTracing) {\n        // Automatically disable the span from recording\n        isRecording = false;\n    }\n\n    let spanName = orgName || STR_EMPTY;\n    if (isRecording) {\n        attributes = getDeferred(() => createAttributeContainer(otelCfg, spanName, spanCtx.attributes));\n    }\n\n    function _handleIsEnded(operation: string, extraMsg?: string): boolean {\n        if (isEnded) {\n            handleSpanError(errorHandlers, \"Span {traceID: \" + spanContext.traceId + \", spanId: \" + spanContext.spanId + \"} has ended - operation [\" + operation + \"] unsuccessful\" + (extraMsg ? (\" - \" + extraMsg) : STR_EMPTY) + \".\", spanName);\n        }\n    \n        return isEnded;\n    }\n    function _toString() {\n        return \"ReadableSpan (\\\"\" + spanName + \"\\\")\"\n    }\n  \n    let theSpan: IReadableSpan = setProtoTypeName({\n        spanContext: () => spanContext,\n        setAttribute: (key: string, value: any) => {\n            let message: string;\n\n            if (value !== null && !_handleIsEnded(\"setAttribute\") && isRecording) {\n                if (!key || key.length === 0) {\n                    message = \"Invalid attribute key: \" + dumpObj(key);\n                } else if (!isAttributeValue(value)) {\n                    message = \"Invalid attribute value: \" + dumpObj(value);\n                }\n\n                if (message) {\n                    handleAttribError(errorHandlers, message, key, value);\n                    localDroppedAttributes++;\n                } else if (attributes){\n                    attributes.v.set(key, value);\n                } else {\n                    localDroppedAttributes++;\n                }\n            } else {\n                localDroppedAttributes++;\n            }\n\n            return theSpan;\n        },\n        setAttributes: (attrs: IOTelAttributes) => {\n            if (!_handleIsEnded(\"setAttributes\") && isRecording && attributes) {\n                addAttributes(attributes.v, attrs);\n            } else {\n                localDroppedAttributes += (objKeys(attrs).length || 0);\n            }\n\n            return theSpan;\n        },\n        // addEvent: (name: string, attributesOrStartTime?: IOTelAttributes | OTelTimeInput, startTime?: OTelTimeInput) => {\n        //     droppedEvents++;\n        //     if(!_handleIsEnded(\"addEvent\") && isRecording) {\n        //         handleWarn(errorHandlers, \"Span.addEvent: \" + name + \" not added - No events allowed\");\n        //     }\n\n        //     return theSpan;\n        // },\n        // addLink: (link: any) => {\n        //     droppedLinks++;\n        //     if(!_handleIsEnded(\"addEvent\") && isRecording) {\n        //         handleWarn(errorHandlers, \"Span.addLink: \" + link + \" not added - No links allowed\");\n        //     }\n\n        //     return theSpan;\n        // },\n        // addLinks: (links: any[]) => {\n        //     droppedLinks += links.length;\n        //     if (!_handleIsEnded(\"addLinks\") && isRecording) {\n        //         handleWarn(errorHandlers, \"Span.addLinks: \" + links + \" not added - No links allowed\");\n        //     }\n\n        //     return theSpan;\n        // },\n        setStatus: (newStatus: IOTelSpanStatus) => {\n            if (!_handleIsEnded(\"setStatus\")) {\n                spanStatus = newStatus;\n                if (!isNullOrUndefined(spanStatus) && !isNullOrUndefined(spanStatus.message) && !isString(spanStatus.message)) {\n                    spanStatus.message = dumpObj(spanStatus.message);\n                }\n            }\n\n            return theSpan;\n        },\n        updateName: (name: string) => {\n            if (!_handleIsEnded(\"updateName\") && !objIs(spanName, name)) {\n                spanName = name;\n                updateProtoTypeName(theSpan, _toString());\n            }\n\n            return theSpan;\n        },\n        end: (endTime?: OTelTimeInput) => {\n            let calcDuration: number;\n            if (!_handleIsEnded(\"end\", \"You can only call end once\")) {\n                try {\n                    if (!isNullOrUndefined(endTime)) {\n                        // User provided an end time\n                        spanEndTime = timeInputToHrTime(endTime);\n                        spanDuration = hrTimeDuration(spanStartTime.v, spanEndTime);\n                        calcDuration = hrTimeToMilliseconds(spanDuration);\n                    } else {\n                        let perfEndTime = perfNow();\n                        calcDuration = perfEndTime - perfStartTime;\n                        spanDuration = millisToHrTime(calcDuration);\n                        spanEndTime = hrTime(perfEndTime);\n                    }\n\n                    if (calcDuration < 0) {\n                        handleWarn(errorHandlers, \"Span.end: duration is negative - startTime > endTime. Setting duration to 0 ms\");\n                        spanDuration = zeroHrTime();\n                        spanEndTime = spanStartTime.v;\n                    }\n\n                    // if (droppedEvents > 0) {\n                    //     handleWarn(errorHandlers, \"Droped \" + droppedEvents + \" events\");\n                    // }\n                    \n                    // We don't mark as ended until after the onEnd callback to ensure that it can\n                    // still read / change the span if required as well as ensuring that the returned\n                    // value for isRecording is correct.\n                    spanCtx.onEnd && spanCtx.onEnd(theSpan);\n                } finally {\n                    // Ensure we mark as ended even if the onEnd throws\n                    isEnded = true;\n                }\n            }\n        },\n        isRecording: () => isRecording && !isEnded,\n        recordException: (exception: OTelException, time?: OTelTimeInput) => {\n            if (!_handleIsEnded(\"recordException\")) {\n                if (spanCtx.onException) {\n                    spanCtx.onException(theSpan, exception, time);\n                } else {\n                    handleNotImplemented(errorHandlers, \"Span.recordException: \" + dumpObj(exception) + \" not handled\");\n                }\n            }\n        }\n    } as IReadableSpan, _toString());\n\n    // Make the relevant properties dynamic (and read-only)\n    objDefineProps(theSpan, {\n        name: {\n            g: () => spanName\n        },\n        kind: {\n            v: kind || eOTelSpanKind.INTERNAL\n        },\n        startTime: {\n            g: () => {\n                return spanStartTime.v;\n            }\n        },\n        endTime: {\n            g: () => {\n                return spanEndTime;\n            }\n        },\n        status: {\n            g: () => {\n                return spanStatus || {\n                    code: eOTelSpanStatusCode.UNSET\n                };\n            }\n        },\n        attributes: {\n            g: () => {\n                return attributes ? attributes.v.attributes : objFreeze({});\n            }\n        },\n        attribContainer: {\n            g: () => {\n                if (!attributes && !localContainer) {\n                    // Create an empty container and cache it for future use (for performance only)\n                    localContainer = createAttributeContainer(otelCfg, spanName);\n                }\n\n                return attributes ? attributes.v : localContainer;\n            }\n        },\n        links: {\n            g: () => {\n                return [];\n            }\n        },\n        events: {\n            g: () => {\n                return [];\n            }\n        },\n        duration: {\n            g: () => {\n                return spanDuration || zeroHrTime();\n            }\n        },\n        ended: {\n            g: () => {\n                return isEnded;\n            }\n        },\n        droppedAttributesCount: {\n            g: () => {\n                return attributes ? attributes.v.droppedAttributes : localDroppedAttributes;\n            }\n        },\n        // droppedEventsCount: {\n        //     g: () => {\n        //         return droppedEvents;\n        //     }\n        // },\n        // droppedLinksCount: {\n        //     g: () => {\n        //         return droppedLinks;\n        //     }\n        // },\n        parentSpanContext: {\n            l: getDeferred(() => {\n                return spanCtx ? spanCtx.parentSpanContext : UNDEFINED_VALUE;\n            })\n        },\n        parentSpanId: {\n            l: getDeferred(() => {\n                let parentSpanId = UNDEFINED_VALUE;\n                if (spanCtx) {\n                    let parentSpanCtx = spanCtx.parentSpanContext;\n                    parentSpanId = parentSpanCtx ? parentSpanCtx.spanId : UNDEFINED_VALUE;\n                }\n\n                return parentSpanId;\n            })\n        }\n    });\n    \n    return theSpan;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/spanContext.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { isNullOrUndefined, isNumber, isObject, isString, objDefineProps } from \"@nevware21/ts-utils\";\nimport { eW3CTraceFlags } from \"../../../enums/W3CTraceFlags\";\nimport { IDistributedTraceContext } from \"../../../interfaces/ai/IDistributedTraceContext\";\nimport { IOTelSpanContext } from \"../../../interfaces/otel/trace/IOTelSpanContext\";\nimport { IOTelTraceState } from \"../../../interfaces/otel/trace/IOTelTraceState\";\nimport { INVALID_SPAN_ID, INVALID_TRACE_ID, isValidSpanId, isValidTraceId } from \"../../../utils/TraceParent\";\nimport { createOTelTraceState } from \"./traceState\";\n\nexport function createOTelSpanContext(traceContext: IDistributedTraceContext | IOTelSpanContext): IOTelSpanContext {\n\n    let traceId = isValidTraceId(traceContext.traceId) ? traceContext.traceId : INVALID_TRACE_ID;\n    let spanId = isValidSpanId(traceContext.spanId) ? traceContext.spanId : INVALID_SPAN_ID;\n    let isRemote = traceContext.isRemote;\n    let traceFlags = (!isNullOrUndefined(traceContext.traceFlags) ? traceContext.traceFlags : eW3CTraceFlags.Sampled);\n    let otTraceState: IOTelTraceState | null = null;\n\n    let traceContextObj: IOTelSpanContext = {\n        traceId,\n        spanId,\n        traceFlags\n    };\n    \n    return objDefineProps<IOTelSpanContext>(traceContextObj, {\n        traceId: {\n            g: () => traceId,\n            s: (value: string) => traceId = isValidTraceId(value) ? value : INVALID_TRACE_ID\n        },\n        spanId: {\n            g: () => spanId,\n            s: (value: string) => spanId = isValidSpanId(value) ? value : INVALID_SPAN_ID\n        },\n        isRemote: {\n            g: () => isRemote\n        },\n        traceFlags: {\n            g: () => traceFlags,\n            s: (value: number) => traceFlags = value\n        },\n        traceState: {\n            g: () => {\n                if (!otTraceState) {\n                    // The Trace State has changed, update the local copy\n                    otTraceState = createOTelTraceState(traceContext.traceState);\n                }\n\n                return otTraceState;\n            },\n            s: (value: IOTelTraceState) => {\n                // The Trace State has changed, update the local copy\n                otTraceState = value;\n            }\n        }\n    });\n}\n\nexport function isSpanContext(spanContext: any): spanContext is IOTelSpanContext {\n    return spanContext && isObject(spanContext) && isString(spanContext.traceId) && isString(spanContext.spanId) && isNumber(spanContext.traceFlags);\n}\n\nexport function wrapDistributedTrace(traceContext: IDistributedTraceContext): IOTelSpanContext {\n    return createOTelSpanContext(traceContext);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/traceApi.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ICachedValue, fnBind, getDeferred } from \"@nevware21/ts-utils\";\nimport { UNDEFINED_VALUE } from \"../../../constants/InternalConstants\";\nimport { IDistributedTraceContext } from \"../../../interfaces/ai/IDistributedTraceContext\";\nimport { IOTelApi } from \"../../../interfaces/otel/IOTelApi\";\nimport { ITraceApi } from \"../../../interfaces/otel/trace/IOTelTraceApi\";\nimport { IOTelTracerProvider } from \"../../../interfaces/otel/trace/IOTelTracerProvider\";\nimport { IReadableSpan } from \"../../../interfaces/otel/trace/IReadableSpan\";\nimport { setProtoTypeName } from \"../../../utils/HelperFuncs\";\nimport { throwOTelError } from \"../errors/OTelError\";\nimport { isSpanContextValid, wrapSpanContext } from \"./utils\";\n\n/**\n * @internal\n * Create a new instance of the OpenTelemetry Trace API, this is bound to the\n * provided instance of the traceProvider (the {@link IOTelApi} instance),\n * to \"change\" (setGlobalTraceProvider) you MUST create a new instance of this API.\n * @param otelApi - The IOTelApi instance associated with this instance\n * @returns A new instance of the ITraceApi for the provided ITelApi\n */\nexport function _createTraceApi(otelApi: IOTelApi): ICachedValue<ITraceApi> {\n    let traceProvider: IOTelTracerProvider = otelApi;\n    if (!traceProvider) {\n        throwOTelError(\"Must provide an otelApi instance\");\n    }\n\n    return getDeferred(() => {\n        return setProtoTypeName({\n            getTracer: fnBind(traceProvider.getTracer, traceProvider),\n\n            // We use fnBind to automatically inject the \"otelApi\" argument as the first argument to the wrapSpanContext function\n            wrapSpanContext: fnBind(wrapSpanContext, UNDEFINED_VALUE, [otelApi]) as unknown as (spanContext: IDistributedTraceContext) => IReadableSpan,\n\n            isSpanContextValid: isSpanContextValid,\n\n            getActiveSpan: (): IReadableSpan | undefined | null => {\n                return otelApi.host ? otelApi.host.getActiveSpan() : null;\n            },\n            setActiveSpan(span: IReadableSpan | undefined | null) {\n                return otelApi.host ? otelApi.host.setActiveSpan(span) : null;\n            }\n        }, \"TraceApi\");\n    });\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/traceProvider.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { objDefine, strSubstr } from \"@nevware21/ts-utils\";\nimport { createDistributedTraceContext } from \"../../../core/TelemetryHelpers\";\nimport { eOTelSpanKind } from \"../../../enums/otel/OTelSpanKind\";\nimport { OTelTimeInput } from \"../../../interfaces/IOTelHrTime\";\nimport { IDistributedTraceContext } from \"../../../interfaces/ai/IDistributedTraceContext\";\nimport { ITraceHost, ITraceProvider } from \"../../../interfaces/ai/ITraceProvider\";\nimport { IOTelApi } from \"../../../interfaces/otel/IOTelApi\";\nimport { IOTelSpanCtx } from \"../../../interfaces/otel/trace/IOTelSpanCtx\";\nimport { IOTelSpanOptions } from \"../../../interfaces/otel/trace/IOTelSpanOptions\";\nimport { IReadableSpan } from \"../../../interfaces/otel/trace/IReadableSpan\";\nimport { generateW3CId } from \"../../../utils/CoreUtils\";\nimport { createSpan } from \"./span\";\n\n/**\n * @internal\n * Creates a new trace provider adapter\n * @param host - The trace host instance (typically IAppInsightsCore).\n * @param traceName - The name of the trace provider.\n * @param api - The OpenTelemetry API instance (as a lazy value).\n * @param onEnd - Optional callback to be invoked when a span ends.\n * @param onException - Optional callback to be invoked when an exception is recorded on a span.\n * @returns The created trace provider.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function createTraceProvider(host: ITraceHost, traceName: string, api: IOTelApi, onEnd?: (span: IReadableSpan) => void, onException?: (span: IReadableSpan, exception: any, time?: OTelTimeInput) => void): ITraceProvider {\n    let provider: ITraceProvider = {\n        api: null,\n        createSpan: (name: string, options?: IOTelSpanOptions, parent?: IDistributedTraceContext): IReadableSpan => {\n            let newCtx: IDistributedTraceContext;\n            let parentCtx: IDistributedTraceContext | undefined;\n\n            if (options && options.root) {\n                newCtx = createDistributedTraceContext();\n            } else {\n                newCtx = createDistributedTraceContext(parent || host.getTraceCtx());\n                if (newCtx.parentCtx) {\n                    parentCtx = newCtx.parentCtx;\n                }\n            }\n\n            // Always generate a new spanId\n            newCtx.spanId = strSubstr(generateW3CId(), 0, 16);\n\n            let spanCtx: IOTelSpanCtx = {\n                api: api,\n                spanContext: newCtx,\n                attributes: options ? options.attributes : undefined,\n                startTime: options ? options.startTime : undefined,\n                isRecording: options ? options.recording !== false : true,\n                onEnd: onEnd,\n                onException: onException\n            };\n\n            if (parentCtx) {\n                objDefine(spanCtx, \"parentSpanContext\", {\n                    v: parentCtx,\n                    w: false\n                });\n            }\n\n            return createSpan(spanCtx, name, options?.kind || eOTelSpanKind.INTERNAL);\n        },\n        getProviderId: () => traceName,\n        isAvailable: () => !!onEnd\n    };\n\n    objDefine(provider, \"api\", {\n        v: api,\n        w: false\n    });\n\n    return provider;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/traceState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ICachedValue, createCachedValue, isFunction, isString, objDefine, symbolFor } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../../../constants/InternalConstants\";\nimport { IW3cTraceState } from \"../../../interfaces/ai/IW3cTraceState\";\nimport { IOTelTraceState } from \"../../../interfaces/otel/trace/IOTelTraceState\";\nimport { createW3cTraceState, isW3cTraceState } from \"../../../telemetry/W3cTraceState\";\n\nlet _otelTraceState: ICachedValue<symbol>;\n\nfunction _initOTelTraceStateSymbol() {\n    if (!_otelTraceState) {\n        _otelTraceState = createCachedValue<symbol>(symbolFor(\"otTraceState\"));\n    }\n\n    return _otelTraceState;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _createOTelTraceState(traceState: IW3cTraceState): IOTelTraceState {\n    if (!_otelTraceState) {\n        _otelTraceState = _initOTelTraceStateSymbol();\n    }\n\n    let otTraceState = {\n        set: (key: string, value: string): IOTelTraceState => {\n            let newState = createW3cTraceState(STR_EMPTY, traceState);\n            newState.set(key, value);\n            return _createOTelTraceState(newState);\n        },\n        unset: (key: string): IOTelTraceState => {\n            let newState = createW3cTraceState(STR_EMPTY, traceState);\n            newState.del(key);\n            return _createOTelTraceState(newState);\n        },\n        get: (key: string): string | undefined => {\n            return traceState.get(key);\n        },\n        serialize: (): string => {\n            let headers = traceState.hdrs(1);\n            if (headers.length > 0) {\n                return headers[0];\n            }\n\n            return STR_EMPTY;\n        }\n    };\n\n    objDefine(otTraceState as any, _otelTraceState.v, { g: () => traceState });\n\n    return otTraceState;\n}\n\n/**\n * Identifies if the provided value is an OpenTelemetry TraceState object\n * @param value - The value to check\n * @returns true if the value is an OpenTelemetry TraceState object otherwise false\n * @remarks The OpenTelemetry TraceState is an immutable object, meaning that any changes made to the trace state will\n * @since 3.4.0\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isOTelTraceState(value: any): value is IOTelTraceState {\n    if (!_otelTraceState) {\n        _otelTraceState = _initOTelTraceStateSymbol();\n    }\n\n    if (value && value[_otelTraceState.v]) {\n        return true;\n    }\n\n    return value && isFunction(value.serialize) && isFunction(value.unset) && isFunction(value.get) && isFunction(value.set);\n}\n\n/**\n * Returns an OpenTelemetry compatible instance of the trace state, an important distinction\n * between an {@link IW3cTraceState} and an {@link IOTelTraceState} is that the OpenTelemetry version\n * is immutable, meaning that any changes made to the trace state will create and return a new\n * instance for the {@link IOTelTraceState.set} and {@link IOTelTraceState.unset} methods.\n * @param value - The current trace state value\n * @returns An OpenTelemetry compatible instance of the trace state\n * @remarks The OpenTelemetry TraceState is an immutable object, meaning that any changes made to the trace state will\n * @since 3.4.0\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function createOTelTraceState(value?: string | IW3cTraceState | IOTelTraceState | null): IOTelTraceState {\n    let traceState: IW3cTraceState | null = null;\n    if (isOTelTraceState(value)) {\n        let parentTraceState: IW3cTraceState;\n        if (_otelTraceState) {\n            // Only attempt the lookup if the symbol has been created and therefore possibly\n            // assigned to a parent trace state\n            parentTraceState = (value as any)[_otelTraceState.v] as IW3cTraceState;\n        }\n        if (parentTraceState) {\n            // Reuse the existing trace state as a parent to avoid copying objects\n            traceState = createW3cTraceState(STR_EMPTY, parentTraceState);\n        } else {\n            // fallback to creating a new trace state\n            traceState = createW3cTraceState(value.serialize());\n        }\n    } else if (isW3cTraceState(value)) {\n        traceState = value;\n    } else {\n        traceState = createW3cTraceState(isString(value) ? value : STR_EMPTY);\n    }\n\n    return _createOTelTraceState(traceState);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/tracer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { fnApply, isFunction } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../../../constants/InternalConstants\";\nimport { ISpanScope, ITraceHost } from \"../../../interfaces/ai/ITraceProvider\";\nimport { IOTelSpanOptions } from \"../../../interfaces/otel/trace/IOTelSpanOptions\";\nimport { IOTelTracer } from \"../../../interfaces/otel/trace/IOTelTracer\";\nimport { IReadableSpan } from \"../../../interfaces/otel/trace/IReadableSpan\";\nimport { setProtoTypeName } from \"../../../utils/HelperFuncs\";\nimport { startActiveSpan } from \"./utils\";\n\n/**\n * @internal\n * Create a tracer implementation.\n * @param host - The ApplicationInsights core instance\n * @returns A tracer object\n */\nexport function _createTracer(host: ITraceHost, name?: string): IOTelTracer {\n    let tracer: IOTelTracer = setProtoTypeName({\n        startSpan(spanName: string, options?: IOTelSpanOptions): IReadableSpan | null {\n            // Note: context is not used / needed for Application Insights / 1DS\n            if (host) {\n                return host.startSpan(spanName, options);\n            }\n\n            return null;\n        },\n        startActiveSpan<F extends (span: IReadableSpan, scope?: ISpanScope<ITraceHost>) => ReturnType<F>>(name: string, fnOrOptions?: F | IOTelSpanOptions, fn?: F): ReturnType<F> {\n            // Figure out which parameter order was passed\n            let theFn: F | null = null;\n            let opts: IOTelSpanOptions | null = null;\n\n            if (isFunction(fnOrOptions)) {\n                // startActiveSpan<F extends (span: IReadableSpan) => unknown>(name: string, fn: F): ReturnType<F>;\n                theFn = fnOrOptions;\n            } else {\n                // startActiveSpan<F extends (span: IReadableSpan) => unknown>(name: string, options: IOTelSpanOptions, fn: F): ReturnType<F>; or\n                opts = fnOrOptions as IOTelSpanOptions;\n                theFn = fn;\n            }\n\n            if (theFn) {\n                return startActiveSpan(host, name, opts, (spanScope: ISpanScope<ITraceHost>) => {\n                    return fnApply(theFn, spanScope, [spanScope.span, spanScope]);\n                });\n            }\n        }\n    }, \"OTelTracer\" + (name ? (\" (\" + name + \")\") : STR_EMPTY));\n\n    return tracer;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/tracerProvider.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IPromise } from \"@nevware21/ts-async\";\nimport { ITraceHost } from \"../../../interfaces/ai/ITraceProvider\";\nimport { IOTelTracer } from \"../../../interfaces/otel/trace/IOTelTracer\";\nimport { IOTelTracerProvider } from \"../../../interfaces/otel/trace/IOTelTracerProvider\";\nimport { _createTracer } from \"./tracer\";\n\n/**\n * @internal\n * Create a trace implementation with tracer caching.\n * @param core - The ApplicationInsights core instance\n * @returns A trace object\n */\nexport function _createTracerProvider(host: ITraceHost): IOTelTracerProvider {\n    let tracers: { [key: string]: IOTelTracer } = {};\n\n    return {\n        getTracer(name: string, version?: string): IOTelTracer {\n            const tracerKey = (name|| \"ai-web\") + \"@\" + (version || \"unknown\");\n            \n            if (!tracers[tracerKey]) {\n                tracers[tracerKey] = _createTracer(host);\n            }\n            \n            return tracers[tracerKey];\n        },\n        forceFlush(): IPromise<void> | void {\n            // Nothing to flush\n            return;\n        },\n        shutdown(): IPromise<void> | void {\n            // Just clear the locally cached IOTelTracer instances so they can be garbage collected\n            tracers = {};\n            host = null;\n            return;\n        }\n    };\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/api/trace/utils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { doAwait, doFinally } from \"@nevware21/ts-async\";\nimport { arrSlice, fnApply, isFunction, isObject, isPromiseLike } from \"@nevware21/ts-utils\";\nimport { createDistributedTraceContext, isDistributedTraceContext } from \"../../../core/TelemetryHelpers\";\nimport { eOTelSpanKind } from \"../../../enums/otel/OTelSpanKind\";\nimport { eOTelSpanStatusCode } from \"../../../enums/otel/OTelSpanStatus\";\nimport { IAppInsightsCore } from \"../../../interfaces/ai/IAppInsightsCore\";\nimport { IConfiguration } from \"../../../interfaces/ai/IConfiguration\";\nimport { IDistributedTraceContext, IDistributedTraceInit } from \"../../../interfaces/ai/IDistributedTraceContext\";\nimport { ISpanScope, ITraceHost } from \"../../../interfaces/ai/ITraceProvider\";\nimport { IOTelApi } from \"../../../interfaces/otel/IOTelApi\";\nimport { ITraceCfg } from \"../../../interfaces/otel/config/IOTelTraceCfg\";\nimport { IOTelSpanContext } from \"../../../interfaces/otel/trace/IOTelSpanContext\";\nimport { IOTelSpanCtx } from \"../../../interfaces/otel/trace/IOTelSpanCtx\";\nimport { IOTelSpanOptions } from \"../../../interfaces/otel/trace/IOTelSpanOptions\";\nimport { IReadableSpan } from \"../../../interfaces/otel/trace/IReadableSpan\";\nimport { isValidSpanId, isValidTraceId } from \"../../../utils/TraceParent\";\nimport { createSpan } from \"./span\";\n\n/**\n * Internal helper to execute a callback function with a span set as the active span.\n * Handles both synchronous and asynchronous (Promise-based) callbacks, ensuring\n * the previous active span is properly restored after execution.\n * @param scope - The span scope instance\n * @param fn - The callback function to execute\n * @param thisArg - The `this` context for the callback\n * @param args - Array of arguments to pass to the callback\n * @returns The result of the callback function\n */\nfunction _executeWithActiveSpan<S extends ISpanScope, R>(\n    scope: S,\n    fn: (...args: any) => any,\n    thisArg: any,\n    args: any[]\n): R {\n    let isAsync = false;\n    try {\n        let result = fnApply(fn, thisArg || scope, args);\n        if (isPromiseLike(result)) {\n            isAsync = true;\n            return doFinally(result, function () {\n                // Restore previous active span after promise settles (resolves or rejects)\n                if (scope) {\n                    scope.restore();\n                }\n            }) as any;\n        }\n        return result;\n    } finally {\n        // Restore previous active span only if result is not a promise\n        // (promises handle restoration in their callbacks)\n        if (scope && !isAsync) {\n            scope.restore();\n        }\n    }\n}\n\n/**\n * Execute the callback `fn` function with the passed span as the active span\n * Note: The callback will be executed even if the span is null.\n * @param traceHost - The current trace host instance (core or AISKU instance)\n * @param span - The span to set as the active span during the execution of the callback\n * @param fn - the callback function\n * @param thisArg - the `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @param _args - Additional arguments to be passed to the function\n */\nexport function withSpan<T extends ITraceHost, A extends unknown[], F extends (this: ThisParameterType<F> | ISpanScope<T>, ...args: A) => ReturnType<F>>(traceHost: T, span: IReadableSpan, fn: F, thisArg?: ThisParameterType<F>, ..._args: A) : ReturnType<F>;\n\n/**\n * Execute the callback `fn` function with the passed span as the active span\n * Note: The callback will be executed even if the span is null.\n * @param traceHost - The current trace host instance (core or AISKU instance)\n * @param span - The span to set as the active span during the execution of the callback\n * @param fn - the callback function\n * @param thisArg - the `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @returns the result of the function\n */\nexport function withSpan<T extends ITraceHost, A extends unknown[], F extends (this: ThisParameterType<F> | ISpanScope<T>,...args: A) => ReturnType<F>>(traceHost: T, span: IReadableSpan, fn: F, thisArg?: ThisParameterType<F>): ReturnType<F> {\n    const scope = traceHost.setActiveSpan(span);\n    return _executeWithActiveSpan(scope, fn, thisArg, arrSlice(arguments, 4));\n}\n\n/**\n * Execute the callback `fn` function with the passed span as the active span. The callback receives\n * an ISpanScope object as its first parameter and the `this` context (when no thisArg is provided).\n * Note: The callback will be executed even if the span is null.\n * @param traceHost - The current trace host instance (core or AISKU instance)\n * @param span - The span to set as the active span during the execution of the callback\n * @param fn - the callback function that receives an ISpanScope\n * @param thisArg - the `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @returns The result of the function\n */\nexport function useSpan<T extends ITraceHost, F extends (this: ThisParameterType<F> | ISpanScope<T>, scope: ISpanScope<T>) => ReturnType<F>>(traceHost: T, span: IReadableSpan, fn: F, thisArg?: ThisParameterType<F>) : ReturnType<F>;\n\n/**\n * Execute the callback `fn` function with the passed span as the active span. The callback receives\n * an ISpanScope object as its first parameter and the `this` context (when no thisArg is provided).\n * Note: The callback will be executed even if the span is null.\n * @param traceHost - The current trace host instance (core or AISKU instance)\n * @param span - The span to set as the active span during the execution of the callback\n * @param fn - the callback function that receives an ISpanScope and additional arguments\n * @param thisArg - the `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @param _args - Additional arguments to be passed to the function\n * @returns The result of the function\n */\nexport function useSpan<T extends ITraceHost, A extends unknown[], F extends (this: ThisParameterType<F> | ISpanScope<T>, scope: ISpanScope<T>, ...args: A) => ReturnType<F>>(traceHost: T, span: IReadableSpan, fn: F, thisArg?: ThisParameterType<F>, ..._args: A) : ReturnType<F>;\n\n/**\n * Execute the callback `fn` function with the passed span as the active span. The callback receives\n * an ISpanScope object as its first parameter and the `this` context (when no thisArg is provided).\n * Note: The callback will be executed even if the span is null.\n * @param traceHost - The current trace host instance (core or AISKU instance)\n * @param span - The span to set as the active span during the execution of the callback\n * @param fn - the callback function that receives an ISpanScope and additional arguments\n * @param thisArg - the `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @param _args - Additional arguments to be passed to the function\n */\nexport function useSpan<T extends ITraceHost, A extends unknown[], F extends (this: ThisParameterType<F> | ISpanScope<T>, scope: ISpanScope<T>, ...args: A) => ReturnType<F>>(traceHost: T, span: IReadableSpan, fn: F, thisArg?: ThisParameterType<F>): ReturnType<F> {\n    let scope = traceHost.setActiveSpan(span);\n    return _executeWithActiveSpan(scope, fn, thisArg, [scope].concat(arrSlice(arguments, 4)));\n}\n\n/**\n * Creates and starts a new span, sets it as the active span in the current context,\n * and executes a provided function within this context.\n *\n * This method creates a span, makes it active during the execution of the provided\n * function, and automatically ends the span when the function completes (or throws).\n * This provides automatic span lifecycle management and context propagation. If the function\n * is asynchronous the span will be ended when the returned Promise resolves or rejects.\n * Note: The callback will be executed even if the traceHost is unable to create a span (returns null).\n * @param name - The name of the span, should be descriptive of the operation being traced\n * @param fn - The function to execute within the span's active context\n * @param thisArg - The `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @returns The result of executing the provided function\n * @remarks\n * - The span is automatically ended when the function completes or throws an exception\n * - The span becomes the active parent for any spans created within the function\n * - If the function throws an error, the span status is automatically set to ERROR\n * - This is the recommended method for most tracing scenarios due to automatic lifecycle management\n * - Multiple overloads available for different parameter combinations\n */\nexport function startActiveSpan<T extends ITraceHost, F extends (this: ThisParameterType<F> | ISpanScope<T>, scope?: ISpanScope<T>) => ReturnType<F>>(traceHost: T, name: string, fn: F, thisArg?: ThisParameterType<F>): ReturnType<F>;\n\n/**\n * Creates and starts a new span, sets it as the active span in the current context,\n * and executes a provided function within this context.\n *\n * This method creates a span, makes it active during the execution of the provided\n * function, and automatically ends the span when the function completes (or throws).\n * This provides automatic span lifecycle management and context propagation. If the function\n * is asynchronous the span will be ended when the returned Promise resolves or rejects.\n * Note: The callback will be executed even if the traceHost is unable to create a span (returns null).\n * @param name - The name of the span, should be descriptive of the operation being traced\n * @param options - Optional configuration for span creation (parent context, attributes, etc.)\n * @param fn - The function to execute within the span's active context\n * @param thisArg - The `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @returns The result of executing the provided function\n * @remarks\n * - The span is automatically ended when the function completes or throws an exception\n * - The span becomes the active parent for any spans created within the function\n * - If the function throws an error, the span status is automatically set to ERROR\n * - This is the recommended method for most tracing scenarios due to automatic lifecycle management\n * - Multiple overloads available for different parameter combinations\n */\nexport function startActiveSpan<T extends ITraceHost, F extends (this: ThisParameterType<F> | ISpanScope<T>, scope?: ISpanScope<T>) => ReturnType<F>>(traceHost: T, name: string, options: IOTelSpanOptions, fn: F, thisArg?: ThisParameterType<F>): ReturnType<F>;\n\n/**\n * Creates and starts a new span, sets it as the active span in the current context,\n * and executes a provided function within this context.\n *\n * This method creates a span, makes it active during the execution of the provided\n * function, and automatically ends the span when the function completes (or throws).\n * This provides automatic span lifecycle management and context propagation. If the function\n * is asynchronous the span will be ended when the returned Promise resolves or rejects.\n * Note: The callback will be executed even if the traceHost is unable to create a span (returns null).\n * @remarks\n * This overloaded version supports both optional span creation options and the `this` argument for the callback.\n * @param name - The name of the span, should be descriptive of the operation being traced\n * @param optionsOrFn - Optional configuration for span creation (parent context, attributes, etc.) or the function to execute within the span's active context\n * @param maybeFnOrThis - The function to execute within the span's active context or the `this` argument for the callback\n * @param thisArg - The `this` argument for the callback. If not provided, ISpanScope is used as `this`\n * @returns The result of executing the provided function\n * @remarks\n * - The span is automatically ended when the function completes or throws an exception\n * - The span becomes the active parent for any spans created within the function\n * - If the function throws an error, the span status is automatically set to ERROR\n * - This is the recommended method for most tracing scenarios due to automatic lifecycle management\n * - Multiple overloads available for different parameter combinations\n */\nexport function startActiveSpan<T extends ITraceHost, F extends (this: ThisParameterType<F> | ISpanScope<T>, scope?: ISpanScope<T>) => ReturnType<F>>(traceHost: T, name: string, optionsOrFn: IOTelSpanOptions | F, maybeFnOrThis?: F | ThisParameterType<F>, thisArg?: ThisParameterType<F>): ReturnType<F> {\n    let options: IOTelSpanOptions = null;\n    let fn: F;\n    let that: ThisParameterType<F> = thisArg;\n\n    if (isFunction(optionsOrFn)) {\n        fn = optionsOrFn as F;\n    } else {\n        options = optionsOrFn as IOTelSpanOptions;\n        fn = maybeFnOrThis as F;\n        that = thisArg || (maybeFnOrThis as ThisParameterType<F>);\n    }\n\n    let span = traceHost.startSpan(name, options);\n    let useAsync = false;\n\n    try {\n        let result = useSpan(traceHost, span, (scope: ISpanScope): ReturnType<F> => {\n            return fnApply(fn, that, [scope]);\n        });\n\n        if (isPromiseLike(result)) {\n            useAsync = true;\n\n            return doAwait(result,\n                (value) => value,\n                (reason) => {\n                    if (span) {\n                        span.setStatus({ code: reason ? eOTelSpanStatusCode.ERROR : eOTelSpanStatusCode.OK, message: reason ? reason.message || reason : undefined });\n                    }\n                },\n                () => {\n                    if (span) {\n                        span.end();\n                    }\n                }) as ReturnType<F>;\n        }\n\n        return result;\n    } catch (e) {\n        if (span) {\n            span.setStatus({ code: e ? eOTelSpanStatusCode.ERROR : eOTelSpanStatusCode.OK, message: e ? e.message : undefined });\n        }\n        throw e;\n    } finally {\n        // If the function returned a promise, we need to end the span when the promise resolves/rejects\n        if (!useAsync && span) {\n            span.end();\n        }\n    }\n}\n\n/**\n * Returns true if the passed spanContext of type  {@link IDistributedTraceContext} or {@link IDistributedTraceInit} is valid.\n * @return true if this {@link IDistributedTraceContext} is valid.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isSpanContextValid(spanContext: IDistributedTraceContext | IDistributedTraceInit | IOTelSpanContext): boolean {\n    return spanContext ? (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId)) : false;\n}\n  \n/**\n * Wrap the given {@link IDistributedTraceContext} in a new non-recording {@link IReadableSpan}\n *\n * @param spanContext - span context to be wrapped\n * @returns a new non-recording {@link IReadableSpan} with the provided context\n */\nexport function wrapSpanContext(otelApi: IOTelApi, spanContext: IDistributedTraceContext | IDistributedTraceInit | IOTelSpanContext): IReadableSpan {\n    if (!isDistributedTraceContext(spanContext)) {\n        spanContext = createDistributedTraceContext(spanContext);\n    }\n    \n    // Return a non-recording span\n    return createNonRecordingSpan(otelApi, \"wrapped(\\\"\" + spanContext.spanId + \"\\\")\", spanContext);\n}\n\n/**\n * Return a non-recording span based on the provided spanContext using the otelApi instance as the\n * owning instance.\n * @param otelApi - The otelApi to use for creating the non-Recording Span\n * @param spanName - The span name to associated with the span\n * @param spanContext - The Span context to use for the span\n * @returns A new span that is marked as a non-recording span\n */\nexport function createNonRecordingSpan(otelApi: IOTelApi, spanName: string, spanContext: IDistributedTraceContext | IDistributedTraceInit | IOTelSpanContext): IReadableSpan {\n    // Return a non-recording span\n    let spanCtx: IOTelSpanCtx = {\n        api: otelApi,\n        spanContext: isDistributedTraceContext(spanContext) ? spanContext : createDistributedTraceContext(spanContext),\n        isRecording: false\n    };\n    \n    return createSpan(spanCtx, spanName, eOTelSpanKind.INTERNAL);\n}\n\n/**\n * Identifies whether the span is an {@link IReadableSpan} or not\n * @param span - The span to check\n * @returns true if the span is an {@link IReadableSpan} otherwise false\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isReadableSpan(span: any): span is IReadableSpan {\n    return !!span &&\n        isObject(span) &&\n        \"name\" in span &&\n        \"kind\" in span &&\n        isFunction(span.spanContext) &&\n        \"duration\" in span &&\n        \"ended\" in span &&\n        \"startTime\" in span &&\n        \"endTime\" in span &&\n        \"attributes\" in span &&\n        \"links\" in span &&\n        \"events\" in span &&\n        \"status\" in span &&\n        // \"resource\" in span &&\n        // \"instrumentationScope\" in span &&\n        \"droppedAttributesCount\" in span &&\n        isFunction(span.isRecording) &&\n        isFunction(span.setStatus) &&\n        isFunction(span.updateName) &&\n        isFunction(span.setAttribute) &&\n        isFunction(span.setAttributes) &&\n        isFunction(span.end) &&\n        isFunction(span.recordException);\n}\n\nfunction _getTraceCfg(context: IOTelApi | ITraceHost | IConfiguration): ITraceCfg {\n    let traceCfg: ITraceCfg = null;\n    if (context) {\n        if ((context as IOTelApi).cfg && (context as IOTelApi).host) {\n            traceCfg = (context as IOTelApi).cfg.traceCfg;\n        } else if (isFunction((context as IAppInsightsCore).initialize) && (context as IAppInsightsCore).config) {\n            traceCfg = (context as IAppInsightsCore).config.traceCfg;\n        } else if ((context as IConfiguration).traceCfg) {\n            traceCfg = (context as IConfiguration).traceCfg;\n        }\n    }\n\n    return traceCfg;\n}\n\n/**\n * Set the suppress tracing flag on the context\n * @param context - The context to set the suppress tracing flag on\n * @returns The context with the suppress tracing flag set\n * @remarks This is used to suppress tracing for the current context and all child contexts\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function suppressTracing<T = IOTelApi | IAppInsightsCore | IConfiguration>(context: T): T {\n    let traceCfg = _getTraceCfg(context);\n    if (traceCfg) {\n        traceCfg.suppressTracing = true;\n    }\n\n    return context;\n}\n\n/**\n * Remove the suppress tracing flag from the context\n * @param context - The context to remove the suppress tracing flag from\n * @returns The context with the suppress tracing flag removed\n * @remarks This is used to remove the suppress tracing flag from the current context and all child\n * contexts. This is used to restore tracing after it has been suppressed\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function unsuppressTracing<T = IOTelApi | IAppInsightsCore | IConfiguration>(context: T): T {\n    let traceCfg = _getTraceCfg(context);\n    if (traceCfg) {\n        traceCfg.suppressTracing = false;\n    }\n\n    return context;\n}\n\n/**\n * Check if the tracing is suppressed for the current context\n * @param context - The context to check for the suppress tracing flag\n * @returns true if tracing is suppressed for the current context otherwise false\n * @remarks This is used to check if tracing is suppressed for the current context and all child\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isTracingSuppressed<T = IOTelApi | IAppInsightsCore | IConfiguration>(context: T): boolean {\n    let result = false;\n    let traceCfg = _getTraceCfg(context);\n    if (traceCfg) {\n        result = !!traceCfg.suppressTracing;\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/attribute/SemanticConventions.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst MICROSOFT_APPLICATIONINSIGHTS_NAME = \"Microsoft.ApplicationInsights.\";\nconst MICROSOFT_DOT = \"microsoft.\";\nconst CLIENT_DOT = \"client.\";\nconst HTTP_DOT = \"http.\";\nconst NET_DOT = \"net.\";\nconst PEER_DOT = \"peer.\";\nconst EXCEPTION_DOT = \"exception.\";\nconst ENDUSER_DOT = \"enduser.\";\nconst URL_DOT = \"url.\";\nconst DB_DOT = \"db.\";\nconst NETWORK_DOT = \"network.\";\n\nexport const AzureMonitorSampleRate = MICROSOFT_DOT + \"sample_rate\";\nexport const ApplicationInsightsCustomEventName = MICROSOFT_DOT + \"custom_event.name\";\nexport const MicrosoftClientIp = MICROSOFT_DOT + CLIENT_DOT + \"ip\";\n\nexport const ApplicationInsightsMessageName = MICROSOFT_APPLICATIONINSIGHTS_NAME + \"Message\";\nexport const ApplicationInsightsExceptionName = MICROSOFT_APPLICATIONINSIGHTS_NAME + \"Exception\";\nexport const ApplicationInsightsPageViewName = MICROSOFT_APPLICATIONINSIGHTS_NAME + \"PageView\";\nexport const ApplicationInsightsAvailabilityName = MICROSOFT_APPLICATIONINSIGHTS_NAME + \"Availability\";\nexport const ApplicationInsightsEventName = MICROSOFT_APPLICATIONINSIGHTS_NAME + \"Event\";\n\nexport const ApplicationInsightsBaseType = \"_MS.baseType\";\nexport const ApplicationInsightsMessageBaseType = \"MessageData\";\nexport const ApplicationInsightsExceptionBaseType = \"ExceptionData\";\nexport const ApplicationInsightsPageViewBaseType = \"PageViewData\";\nexport const ApplicationInsightsAvailabilityBaseType = \"AvailabilityData\";\nexport const ApplicationInsightsEventBaseType = \"EventData\";\n\nexport const ATTR_ENDUSER_ID = ENDUSER_DOT + \"id\";\nexport const ATTR_ENDUSER_PSEUDO_ID = ENDUSER_DOT + \"pseudo_id\";\nexport const ATTR_HTTP_ROUTE = HTTP_DOT + \"route\";\n\nexport const SEMATTRS_NET_PEER_IP = NET_DOT + PEER_DOT + \"ip\";\nexport const SEMATTRS_NET_PEER_NAME = NET_DOT + PEER_DOT + \"name\";\nexport const SEMATTRS_NET_HOST_IP = NET_DOT + \"host.ip\";\nexport const SEMATTRS_PEER_SERVICE = PEER_DOT + \"service\";\nexport const SEMATTRS_HTTP_USER_AGENT = HTTP_DOT + \"user_agent\";\nexport const SEMATTRS_HTTP_METHOD = HTTP_DOT + \"method\";\nexport const SEMATTRS_HTTP_URL = HTTP_DOT + \"url\";\nexport const SEMATTRS_HTTP_STATUS_CODE = HTTP_DOT + \"status_code\";\nexport const SEMATTRS_HTTP_ROUTE = HTTP_DOT + \"route\";\nexport const SEMATTRS_HTTP_HOST = HTTP_DOT + \"host\";\nexport const SEMATTRS_DB_SYSTEM = DB_DOT + \"system\";\nexport const SEMATTRS_DB_STATEMENT = DB_DOT + \"statement\";\nexport const SEMATTRS_DB_OPERATION = DB_DOT + \"operation\";\nexport const SEMATTRS_DB_NAME = DB_DOT + \"name\";\nexport const SEMATTRS_RPC_SYSTEM = \"rpc.system\";\nexport const SEMATTRS_RPC_GRPC_STATUS_CODE = \"rpc.grpc.status_code\";\nexport const SEMATTRS_EXCEPTION_TYPE = EXCEPTION_DOT + \"type\";\nexport const SEMATTRS_EXCEPTION_MESSAGE = EXCEPTION_DOT + \"message\";\nexport const SEMATTRS_EXCEPTION_STACKTRACE = EXCEPTION_DOT + \"stacktrace\";\nexport const SEMATTRS_HTTP_SCHEME = HTTP_DOT + \"scheme\";\nexport const SEMATTRS_HTTP_TARGET = HTTP_DOT + \"target\";\nexport const SEMATTRS_HTTP_FLAVOR = HTTP_DOT + \"flavor\";\nexport const SEMATTRS_NET_TRANSPORT = NET_DOT + \"transport\";\nexport const SEMATTRS_NET_HOST_NAME = NET_DOT + \"host.name\";\nexport const SEMATTRS_NET_HOST_PORT = NET_DOT + \"host.port\";\nexport const SEMATTRS_NET_PEER_PORT = NET_DOT + PEER_DOT + \"port\";\nexport const SEMATTRS_HTTP_CLIENT_IP = HTTP_DOT + \"client_ip\";\nexport const SEMATTRS_ENDUSER_ID = ENDUSER_DOT + \"id\";\n\nexport const ATTR_CLIENT_ADDRESS = CLIENT_DOT + \"address\";\nexport const ATTR_CLIENT_PORT = CLIENT_DOT + \"port\";\nexport const ATTR_SERVER_ADDRESS = \"server.address\";\nexport const ATTR_SERVER_PORT = \"server.port\";\nexport const ATTR_URL_FULL = URL_DOT + \"full\";\nexport const ATTR_URL_PATH = URL_DOT + \"path\";\nexport const ATTR_URL_QUERY = URL_DOT + \"query\";\nexport const ATTR_URL_SCHEME = URL_DOT + \"scheme\";\nexport const ATTR_ERROR_TYPE = \"error.type\";\nexport const ATTR_NETWORK_LOCAL_ADDRESS = NETWORK_DOT + \"local.address\";\nexport const ATTR_NETWORK_LOCAL_PORT = NETWORK_DOT + \"local.port\";\nexport const ATTR_NETWORK_PROTOCOL_NAME = NETWORK_DOT + \"protocol.name\";\nexport const ATTR_NETWORK_PEER_ADDRESS = NETWORK_DOT + PEER_DOT + \"address\";\nexport const ATTR_NETWORK_PEER_PORT = NETWORK_DOT + PEER_DOT + \"port\";\nexport const ATTR_NETWORK_PROTOCOL_VERSION = NETWORK_DOT + \"protocol.version\";\nexport const ATTR_NETWORK_TRANSPORT = NETWORK_DOT + \"transport\";\nexport const ATTR_USER_AGENT_ORIGINAL = \"user_agent.original\";\nexport const ATTR_HTTP_REQUEST_METHOD = HTTP_DOT + \"request.method\";\nexport const ATTR_HTTP_RESPONSE_STATUS_CODE = HTTP_DOT + \"response.status_code\";\nexport const ATTR_EXCEPTION_TYPE = EXCEPTION_DOT + \"type\";\nexport const ATTR_EXCEPTION_MESSAGE = EXCEPTION_DOT + \"message\";\nexport const ATTR_EXCEPTION_STACKTRACE = EXCEPTION_DOT + \"stacktrace\";\nexport const EXP_ATTR_ENDUSER_ID = ENDUSER_DOT + \"id\";\nexport const EXP_ATTR_ENDUSER_PSEUDO_ID = ENDUSER_DOT + \"pseudo_id\";\nexport const EXP_ATTR_SYNTHETIC_TYPE = \"synthetic.type\";\n\n\nexport const DBSYSTEMVALUES_MONGODB = \"mongodb\";\nexport const DBSYSTEMVALUES_COSMOSDB = \"cosmosdb\";\nexport const DBSYSTEMVALUES_MYSQL = \"mysql\";\nexport const DBSYSTEMVALUES_POSTGRESQL = \"postgresql\";\nexport const DBSYSTEMVALUES_REDIS = \"redis\";\nexport const DBSYSTEMVALUES_DB2 = \"db2\";\nexport const DBSYSTEMVALUES_DERBY = \"derby\";\nexport const DBSYSTEMVALUES_MARIADB = \"mariadb\";\nexport const DBSYSTEMVALUES_MSSQL = \"mssql\";\nexport const DBSYSTEMVALUES_ORACLE = \"oracle\";\nexport const DBSYSTEMVALUES_SQLITE = \"sqlite\";\nexport const DBSYSTEMVALUES_OTHER_SQL = \"other_sql\";\nexport const DBSYSTEMVALUES_HSQLDB = \"hsqldb\";\nexport const DBSYSTEMVALUES_H2 = \"h2\";\n"
  },
  {
    "path": "shared/AppInsightsCore/src/otel/attribute/attributeContainer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    CreateIteratorContext, ICachedValue, arrForEach, arrIndexOf, createCachedValue, createIterator, getLength, isFunction, isObject,\n    isUndefined, iterForOf, objCreate, objDefine, objDefineProps, objForEachKey, objIs, objKeys, safe, strSplit\n} from \"@nevware21/ts-utils\";\nimport { STR_EMPTY, UNDEFINED_VALUE } from \"../../constants/InternalConstants\";\nimport { eAttributeChangeOp } from \"../../enums/otel/eAttributeChangeOp\";\nimport { IUnloadHook } from \"../../interfaces/ai/IUnloadHook\";\nimport { IOTelAttributes, OTelAttributeValue } from \"../../interfaces/otel/IOTelAttributes\";\nimport { IAttributeChangeInfo, IAttributeContainer, eAttributeFilter } from \"../../interfaces/otel/attribute/IAttributeContainer\";\nimport { IOTelAttributeLimits } from \"../../interfaces/otel/config/IOTelAttributeLimits\";\nimport { IOTelConfig } from \"../../interfaces/otel/config/IOTelConfig\";\nimport { ITraceCfg } from \"../../interfaces/otel/config/IOTelTraceCfg\";\nimport { handleAttribError } from \"../../internal/handleErrors\";\n\nconst _inheritedKey = \"~[[inherited]]\";\nconst _deletedKey = \"~[[deleted]]\";\nlet _containerId = 0;\n\ntype IAttributeBranch<V> = { [key: string]: IAttributeNode<V> };\n\nconst enum eAttributeSource {\n    Local = 0,\n\n    Inherited = 1\n}\n\ninterface _AttributeFindDetail<V> {\n    /**\n     * The hosting container\n     */\n    c: IAttributeContainer;\n\n    /**\n     * The found key\n     */\n    k: string;\n\n    /**\n     * The local attribute node\n     */\n    n: IAttributeNode<V>;\n\n    /**\n     * The found value\n     */\n    v: V;\n\n    /**\n     * The attribute source (local or inherited)\n     */\n    s: eAttributeSource;\n\n    /**\n     * Identifies if this key should be considered to \"exist\" (is if present)\n     */\n    e: boolean;\n}\n\ninterface IAttributeNode<V> {\n    /**\n     * The value of the attribute tree\n     */\n    v?: V;\n\n    /**\n     * Identifies that this is a leaf node in the attribute tree\n     */\n    n?: IAttributeBranch<V>;\n    \n    /**\n     * Identifies that this node has been locally deleted\n     */\n    d?: boolean;\n}\n\ninterface IAttributeIteratorState<V> {\n    p: string;\n    n: IAttributeBranch<V>;\n    k: string[];\n    i: number;\n}\n\nconst enum AddAttributeResult {\n    Success = 0,\n    MaxAttribsExceeded = 1,\n    BranchNodeExists = 2,\n    LeafNodeExists = 3,\n    EmptyKey = 4\n}\n\ninterface IAddAttributeDetails<V> {\n    r: AddAttributeResult;  // result\n    a?: boolean;            // added (true if new attribute was added, false if existing was replaced)\n    p?: V;                  // prev (the previous value if one existed)\n}\n\nfunction _noOpFunc() {\n    // No-op function\n}\n\nfunction _addValue<V extends OTelAttributeValue>(container: IAttributeContainer<V>, target: IAttributeBranch<V>, theKey: string, value: V, maxAttribs: number, cfg: IOTelConfig): IAddAttributeDetails<V> {\n    let errorHandlers = cfg.errorHandlers || {};\n    if (theKey && getLength(theKey) > 0) {\n        let key = theKey.split(\".\");\n        let parts: string[] = [];\n        let keyIndex = 0;\n        \n        let keyLen = getLength(key);\n        while (keyIndex < keyLen) {\n            let part = key[keyIndex];\n            parts.push(part);\n            \n            if (keyIndex === keyLen - 1) {\n                // last part\n                if (target[part] && target[part].n) {\n                    // This node already exists as a branch node\n                    handleAttribError(errorHandlers, \"Attribute key [\" + parts.join(\".\") + \"] already exists as a branch node\", theKey, value);\n                    return { r: AddAttributeResult.BranchNodeExists };\n                }\n\n                if (!target[part] || target[part].d) {\n                    // Node doesn't exist or was deleted\n                    if (container.size >= maxAttribs) {\n                        // If the key is not already present, we have exceeded the limit\n                        // But if it does exist in the hierarchy, we can replace it locally\n                        if (!container.has(theKey)) {\n                            handleAttribError(errorHandlers, \"Maximum allowed attributes exceeded [\" + maxAttribs + \"]\", theKey, value);\n                            return { r: AddAttributeResult.MaxAttribsExceeded };\n                        }\n                    }\n\n                    // Add new leaf node or restore deleted node\n                    target[part] = {\n                        v: value\n                    };\n                    return { r: AddAttributeResult.Success, a: true };\n                } else {\n                    // replace the value - capture the previous value\n                    let previousValue = target[part].v;\n                    target[part].v = value;\n                    target[part].d = false; // Clear any deleted flag when setting value\n                    return { r: AddAttributeResult.Success, a: false, p: previousValue };\n                }\n            }\n\n            if (!target[part]) {\n                target[part] = {\n                    n: {}\n                };\n            }\n\n            if (!target[part].n) {\n                handleAttribError(errorHandlers, \"Attribute key [\" + parts.join(\".\") + \"] already exists as a leaf node\", theKey, value);\n                return { r: AddAttributeResult.LeafNodeExists };\n            }\n\n            target = target[part].n;\n            keyIndex++;\n        }\n    }\n\n    handleAttribError(errorHandlers, \"Attribute key is empty\", theKey, value);\n    return { r: AddAttributeResult.EmptyKey };\n}\n\n/**\n * Delete a specific attribute from the tree\n * @param target - The target branch to delete from\n * @param key - The key parts to delete\n * @returns true if the attribute was deleted, false if it didn't exist\n */\nfunction _deleteValue<V extends OTelAttributeValue>(target: IAttributeBranch<V>, key: string[]): { d: boolean; p?: V } {\n    if (key && getLength(key) > 0) {\n        let keyIndex = 0;\n        let keyLen = getLength(key);\n        \n        // Navigate to the parent of the target node, creating path if needed\n        while (keyIndex < keyLen - 1) {\n            let part = key[keyIndex++];\n            \n            if (!target[part]) {\n                target[part] = {\n                    n: {}\n                };\n            }\n\n            if (!target[part].n) {\n                // Path is blocked by a leaf node, can't delete\n                return { d: false };\n            }\n\n            target = target[part].n;\n        }\n        \n        // Now we're at the parent of the target node\n        let lastPart = key[keyLen - 1];\n        \n        if (target[lastPart] && !target[lastPart].d && !target[lastPart].n) {\n            // Node exists, is not already deleted, and is a leaf - delete it\n            let prev = target[lastPart].v;\n            target[lastPart].d = true; // Mark as deleted\n            target[lastPart].v = UNDEFINED_VALUE; // Clear the value\n            return { d: true, p: prev };\n        } else if (!target[lastPart] || !target[lastPart].d) {\n            // Node doesn't exist or is not already deleted - create a deleted marker\n            // This is important for tracking inherited keys that are locally deleted\n            // and for the edge case where inherited keys might be added later\n            target[lastPart] = {\n                d: true // Mark as deleted without a value\n            };\n            return { d: true };\n        }\n    }\n\n    return { d: false };\n}\n\n/**\n * Find a local specific node (including if it's been deleted) in the attribute tree, or if it exists in an inherited source\n * @param container - The target attribute container to search in\n * @param key - The key to search for\n * @param filter - The filter to apply\n * @param cb - The callback function to execute when the node is found\n * @param nodes - The attribute branches to search in\n * @param inheritContainer - The inherited attribute container\n * @param inheritAttribObj - The inherited attribute object\n * @param otelCfg - Optional OpenTelemetry configuration\n * @returns The result of the callback function\n */\nfunction _findDetail<V, T>(container: IAttributeContainer, key: string, filter: eAttributeFilter | undefined, cb: (detail?: _AttributeFindDetail<V>) => T, nodes: IAttributeBranch<V>, inheritContainer?: IAttributeContainer | null, inheritAttribObj?: IOTelAttributes | null, otelCfg?: IOTelConfig) {\n    let theDetail: _AttributeFindDetail<V>;\n\n    // Find the local node\n    if (key && getLength(key) > 0) {\n        let theNode: IAttributeNode<V> | undefined;\n        let target = nodes;\n        let keys = strSplit(key, \".\");\n        let keysLen = getLength(keys);\n        let idx = 0;\n\n        if (filter == eAttributeFilter.Local || filter === eAttributeFilter.LocalOrDeleted || isUndefined(filter)) {\n            // Find any local node (if it exists)\n            while (target && idx < keysLen) {\n                let part = keys[idx++];\n                let node = target[part];\n                if (node && idx >= keysLen) {\n                    // last part\n                    theNode = node;\n                    break;\n                }\n\n                if (!node || !node.n) {\n                    // TODO - support wildcard(s) (when no node is found), likely need to refactor this to support multiple keys\n                    break;\n                }\n\n                target = node.n;\n            }\n\n            // So if the caller didn't specify a filter then always return the found \"value\" (which will be undefined for a deleted key)\n            // If they have specified a filter, then we need to respect that filter where Local and LocalOrDeleted are treated the same\n            if (theNode) {\n                theDetail = {\n                    c: container,\n                    k: key,\n                    n: theNode,\n                    v: theNode.d ? UNDEFINED_VALUE : theNode.v,\n                    s: eAttributeSource.Local,\n                    e: !theNode.d\n                };\n            }\n        }\n\n        // So we get here if\n        // - We didn't find a node (no local overrides)\n        // - The filter doesn't match (undefined, Local, LocalOrDeleted), so we didn't look for a node\n        // So we just need to check if the filter is undefined or inherited and if so we are free\n        // to look in the inherited sources\n        if (!theDetail && (filter === eAttributeFilter.Inherited || isUndefined(filter))) {\n            const inheritedValue = _getInheritedValue(key, inheritContainer, inheritAttribObj);\n            if (inheritedValue) {\n                theDetail = {\n                    c: container,\n                    k: key,\n                    n: null,\n                    v: inheritedValue.v as V,\n                    s: eAttributeSource.Inherited,\n                    e: true\n                };\n            }\n        }\n    }\n\n    return cb(theDetail);\n}\n\nfunction _size<V>(target: IAttributeBranch<V>, inheritAttrib?: IOTelAttributes, inheritContainer?: IAttributeContainer): number {\n    let count = 0;\n    let seenKeys: string[] = [];\n\n    // Use the iterator to count all unique attributes including inheritance\n    let iter = _iterator(target, (prefix, key, _node) => {\n        return prefix + key;\n    }, undefined, inheritContainer || inheritAttrib);\n\n    iterForOf(iter, (key) => {\n        if (arrIndexOf(seenKeys, key) === -1) {\n            seenKeys.push(key);\n            count++;\n        }\n    });\n\n    return count;\n}\n\nfunction _getStackEntry<V>(theNode: IAttributeBranch<V>, prefix: string): IAttributeIteratorState<V> | undefined {\n    let entry: IAttributeIteratorState<V> | undefined;\n\n    if (theNode) {\n        let allKeys: string[] = objKeys(theNode);\n        if (getLength(allKeys) > 0) {\n            entry = {\n                p: prefix,\n                n: theNode,\n                k: allKeys,\n                i: -1\n            };\n        }\n    }\n\n    return entry;\n}\n\nfunction _iterator<V, T>(target: IAttributeBranch<V>, cb: (prefix: string, key: string, node: IAttributeNode<V>, source: eAttributeFilter) => T, otelCfg?: IOTelConfig, parentAttribs?: IOTelAttributes | IAttributeContainer, inclDeleted?: boolean): Iterator<T> {\n    let stack: IAttributeIteratorState<V>[] = [];\n    let visitedKeys: string[] | undefined = parentAttribs ? [] : UNDEFINED_VALUE;\n    let inheritState: IAttributeIteratorState<any>;\n    let inheritContainerIter: Iterator<[string, any, eAttributeFilter]>;\n    let current = _getStackEntry(target, STR_EMPTY);        // Start with the root branch\n    let inheritContainer: IAttributeContainer | undefined;\n    let inheritAttribs: IOTelAttributes | undefined;\n\n    // Used as the initializer for the iterator and the flag to indicate that the iterator is done\n    let ctx: CreateIteratorContext<T> | null = {\n        v: undefined,\n        n: _moveNext\n    };\n\n    if (parentAttribs) {\n        if (isAttributeContainer(parentAttribs)) {\n            inheritContainer = parentAttribs;\n        } else if (isObject(parentAttribs)) {\n            inheritAttribs = parentAttribs;\n        }\n    }\n    \n    function _moveNext(): boolean {\n        let thePrefix = STR_EMPTY;\n        let theKey: string | undefined;\n        let theNode: IAttributeNode<V> | undefined;\n        let theSource = eAttributeFilter.Local;         // Default to local\n\n        // Process entries from the current node\n        while (current) {\n            current.i++;\n            if (current.i < getLength(current.k)) {\n                // We have at least 1 key\n                let key = current.k[current.i];\n                // The key is \"real\" (we don't support null or undefined keys)\n                let node = current.n[key];\n                if (node) {\n                    if (node.n) {\n                        // We are at a branch node, so add the current node to the stack so we can continue traversing it later\n                        stack.push(current);\n                        current = _getStackEntry(node.n, current.p + key + \".\");\n                        \n                        // If the branch is empty, continue with the next item from stack\n                        if (!current) {\n                            current = stack.pop();\n                        }\n                    } else {\n                        // Leaf node\n                        let fullKey = current.p + key;\n                        if (visitedKeys && arrIndexOf(visitedKeys, fullKey) === -1) {\n                            visitedKeys.push(fullKey);\n                        }\n                        \n                        // If we are not deleted, then return this key\n                        if (!node.d || inclDeleted) {\n                            // Leaf node with value - not deleted\n                            thePrefix = current.p;\n                            theKey = key;\n                            theNode = node;\n                            theSource = node.d ? eAttributeFilter.LocalOrDeleted : eAttributeFilter.Local;\n                            break;\n                        }\n                    }\n                }\n            } else {\n                // No more keys to process at this level\n                current = stack.pop();\n            }\n        }\n\n        // We get here only after we have processed all keys of the current instance\n        // Switch to processing inherited attributes if we have them\n        if (!theNode && inheritAttribs) {\n            if (!inheritState) {\n                // Lazy initialize the inherited state\n                inheritState = {\n                    p: STR_EMPTY,\n                    n: UNDEFINED_VALUE,\n                    k: objKeys(inheritAttribs),\n                    i: -1\n                };\n            }\n\n            // Process inherited attributes that haven't been overridden or deleted\n            while (inheritState.i < getLength(inheritState.k) - 1) {\n                inheritState.i++;\n                let key = inheritState.k[inheritState.i];\n                if (arrIndexOf(visitedKeys, key) === -1) {\n                    visitedKeys.push(key);\n                    theKey = key;\n                    theNode = { v: inheritAttribs[key] as V };\n                    theSource = eAttributeFilter.Inherited;\n                    break;\n                }\n            }\n        }\n\n        // Process inherited container if we have one and no other node was found\n        if (!theNode && inheritContainer) {\n            if (!inheritContainerIter) {\n                // Initialize the container's iterator only once - this will include the full inheritance chain\n                inheritContainerIter = inheritContainer.entries();\n            }\n\n            // Use the container's iterator to get next entry\n            iterForOf(inheritContainerIter, (entry) => {\n                let key = entry[0];\n                if (arrIndexOf(visitedKeys, key) === -1) {\n                    visitedKeys.push(key);\n                    theKey = key;\n                    theNode = { v: entry[1] as V };\n                    theSource = eAttributeFilter.Inherited; // Always return Inherited for inherited container entries\n                    return -1;\n                }\n            });\n        }\n\n        if (theNode) {\n            ctx.v = cb(thePrefix, theKey, theNode, theSource);\n        }\n        \n        return !theNode;\n    }\n\n    return createIterator<T>(ctx);\n}\n\nfunction _generateAttributes<V extends OTelAttributeValue>(container: IAttributeContainer<V>, target: IAttributeBranch<V>, otelCfg?: IOTelConfig, inheritAttrib?: IOTelAttributes | IAttributeContainer, showTree?: boolean): IOTelAttributes {\n    // TODO: Look at making this return a proxy instead of a new object\n    // This should be more effecient as it would make the property lookups lazy\n    let attribs = objCreate(null) as { [key: string]: V | undefined };\n    let deletedKeys: { [key: string]: V | undefined };\n\n    if (showTree) {\n        // Add Node Id\n        objDefine(attribs, \"#id\", {\n            v: container.id,\n            w: false\n        });\n    }\n\n    // Use the iterator properly - collect the key-value pairs\n    let iter = _iterator(target, (prefix, key, node, source) => {\n        let name = prefix + key;\n        return { n: name, v: node.v as V, d: node.d, s: source };\n    }, otelCfg, showTree ? null : inheritAttrib, showTree ? eAttributeFilter.LocalOrDeleted : UNDEFINED_VALUE);\n\n    iterForOf(iter, (entry) => {\n        let theNode = attribs;\n        let theName = entry.n;\n        \n        if (entry.d) {\n            if (!deletedKeys) {\n                // Create separate objects for inherited and deleted attributes\n                deletedKeys = objCreate(null);\n                objDefine(attribs, _deletedKey, {\n                    v: deletedKeys,\n                    w: false\n                });\n            }\n\n            theNode = deletedKeys;\n        }\n\n        if (theNode && !(theName in theNode)) {\n            theNode[theName] = entry.v;\n        }\n    });\n\n    if (inheritAttrib && showTree) {\n        // Create separate objects for inherited and deleted attributes\n        let inheritedKeys: any;\n\n        // Add a tree showing the inherited attributes\n        if (isAttributeContainer(inheritAttrib)) {\n            inheritedKeys = (inheritAttrib as any)._attributes;\n        } else {\n            // Create separate objects for inherited and deleted attributes\n            inheritedKeys = objCreate(null) as any;\n            objForEachKey(inheritAttrib, (key, value) => {\n                inheritedKeys[key] = value as V;\n            });\n        }\n\n        objDefine(attribs, _inheritedKey, {\n            v: inheritedKeys,\n            w: false\n        });\n    }\n\n    return attribs;\n}\n\nfunction _notifyListeners<V extends OTelAttributeValue>(listeners: ({ cb: (changeInfo: IAttributeChangeInfo<V>) => void })[], changeInfo: IAttributeChangeInfo<V>) {\n    // Notify all registered listeners of changes\n    if (listeners) {\n        arrForEach(listeners, (listener) => {\n            safe(listener.cb, [changeInfo]);\n        });\n    }\n}\n\nfunction _getInheritedValue<V>(key: string, inheritContainer?: IAttributeContainer | null, inheritAttribObj?: IOTelAttributes | null ): { v: V } | undefined {\n    // Check inherited container first\n    if (inheritContainer && inheritContainer.has(key)) {\n        return { v: inheritContainer.get(key) as V };\n    }\n\n    // Then check inherited attributes object\n    if (inheritAttribObj && key in inheritAttribObj) {\n        return { v: inheritAttribObj[key] as V };\n    }\n}\n\nfunction _createUnloadHook<V extends OTelAttributeValue>(listeners: { cb: (changeInfo: IAttributeChangeInfo<V>) => void }[], callback: (changeInfo: IAttributeChangeInfo<V>) => void): IUnloadHook {\n    let cbInst = {\n        cb: callback\n    }\n\n    listeners.push(cbInst);\n    \n    let unloadHook = {\n        rm: () => {\n            if (listeners && cbInst) {\n                let index = arrIndexOf(listeners, cbInst);\n                if (index >= 0) {\n                    // Remove the current listener\n                    listeners.splice(index, 1);\n                }\n\n                // Clear the cached values\n                cbInst.cb = null;\n                cbInst = null;\n\n                // Optimization to drop all references and shortcut any future lookups\n                unloadHook.rm = _noOpFunc;\n            }\n        }\n    };\n\n    return unloadHook;\n}\n\n/**\n * Creates a new attribute container with only configuration.\n *\n * @param otelCfg - The OpenTelemetry configuration containing trace configuration and limits\n * @returns A new IAttributeContainer instance with auto-generated container ID\n * @since 3.4.0\n * @example\n * ```typescript\n * const config = { traceCfg: { generalLimits: { attributeCountLimit: 64 } } };\n * const container = createAttributeContainer(config);\n * console.log(container.id); // \".0\" (auto-generated)\n * ```\n */\nexport function createAttributeContainer<V extends OTelAttributeValue>(otelCfg: IOTelConfig): IAttributeContainer<V>;\n\n/**\n * Creates a new attribute container with configuration and a name.\n *\n * @param otelCfg - The OpenTelemetry configuration containing trace configuration and limits\n * @param name - The name for the container (used in the container ID)\n * @returns A new IAttributeContainer instance with the specified name\n * @since 3.4.0\n * @example\n * ```typescript\n * const config = { traceCfg: { generalLimits: { attributeCountLimit: 64 } } };\n * const container = createAttributeContainer(config, \"my-container\");\n * console.log(container.id); // \"my-container.0\"\n * container.set(\"service.name\", \"my-service\");\n * ```\n */\nexport function createAttributeContainer<V extends OTelAttributeValue>(otelCfg: IOTelConfig, name: string): IAttributeContainer<V>;\n\n/**\n * Creates a new attribute container with configuration, name, and inheritance.\n *\n * @param otelCfg - The OpenTelemetry configuration containing trace configuration and limits\n * @param name - The name for the container (used in the container ID)\n * @param inheritAttrib - Parent attributes or container to inherit from\n * @returns A new IAttributeContainer instance that inherits from the specified parent\n * @since 3.4.0\n * @example\n * ```typescript\n * const config = { traceCfg: { generalLimits: { attributeCountLimit: 64 } } };\n * const parent = { \"environment\": \"production\", \"region\": \"us-east-1\" };\n * const child = createAttributeContainer(config, \"child-container\", parent);\n * console.log(child.get(\"environment\")); // \"production\" (inherited)\n * child.set(\"service.name\", \"my-service\"); // local attribute\n * ```\n */\nexport function createAttributeContainer<V extends OTelAttributeValue>(otelCfg: IOTelConfig, name: string, inheritAttrib: IOTelAttributes | IAttributeContainer): IAttributeContainer<V>;\n\n/**\n * Creates a new attribute container with full configuration options.\n *\n * @param otelCfg - The OpenTelemetry configuration containing trace configuration and limits\n * @param name - The name for the container (used in the container ID)\n * @param inheritAttrib - Parent attributes or container to inherit from\n * @param attribLimits - Specific attribute limits to override configuration defaults\n * @returns A new IAttributeContainer instance with custom limits and inheritance\n * @since 3.4.0\n * @example\n * ```typescript\n * const config = { traceCfg: { generalLimits: { attributeCountLimit: 64 } } };\n * const parent = { \"environment\": \"production\" };\n * const customLimits = { attributeCountLimit: 32, attributeValueLengthLimit: 256 };\n * const container = createAttributeContainer(config, \"limited-container\", parent, customLimits);\n * // This container has stricter limits than the default configuration\n * ```\n */\nexport function createAttributeContainer<V extends OTelAttributeValue>(otelCfg: IOTelConfig, name: string, inheritAttrib: IOTelAttributes | IAttributeContainer, attribLimits: IOTelAttributeLimits): IAttributeContainer<V>;\n\n/**\n * Creates a new attribute container that provides an efficient, observable key-value storage\n * for OpenTelemetry attributes with support for inheritance, limits, and change notifications.\n *\n * The container supports inherited attributes from parent containers or plain objects,\n * enforces attribute count and value size limits, and provides efficient iteration and access patterns.\n *\n * @param otelCfg - The OpenTelemetry configuration containing trace configuration and limits\n * @param name - Optional name for the container (used in the container ID)\n * @param inheritAttrib - Optional parent attributes or container to inherit from\n * @param attribLimits - Optional specific attribute limits to override configuration defaults\n * @returns A new IAttributeContainer instance with the specified configuration\n * @since 3.4.0\n * @example\n * ```typescript\n * const config = { traceCfg: { generalLimits: { attributeCountLimit: 64 } } };\n * const container = createAttributeContainer(config, \"my-container\");\n * container.set(\"service.name\", \"my-service\");\n *\n * // With inheritance\n * const parent = { \"environment\": \"production\" };\n * const child = createAttributeContainer(config, \"child-container\", parent);\n * console.log(child.get(\"environment\")); // \"production\"\n * ```\n */\nexport function createAttributeContainer<V extends OTelAttributeValue>(otelCfg: IOTelConfig, name?: string | null | undefined, inheritAttrib?: IOTelAttributes | IAttributeContainer, attribLimits?: IOTelAttributeLimits): IAttributeContainer<V> {\n    let traceCfg: ITraceCfg = otelCfg.traceCfg || {};\n    let nodes: { [key: string]: IAttributeNode<V> } | null = null;\n    let theSize: ICachedValue<number> | null = null;\n    let theDropped: ICachedValue<number> | null = null;\n    let limits: IOTelAttributeLimits = traceCfg.generalLimits || {};\n    let maxAttribs: number = limits.attributeCountLimit || 128;\n    // let maxValueLen: number = limits.attributeValueLengthLimit;\n    let theAttributes: ICachedValue<IOTelAttributes>;\n    let localAttributes: ICachedValue<IOTelAttributes>;\n    let droppedAttribs = 0;\n    let inheritContainer: IAttributeContainer | null = null;\n    let inheritAttribObj: IOTelAttributes | null = null;\n    let listeners: ({ cb: (changeInfo: IAttributeChangeInfo<V>) => void })[] | null = null;\n    let parentListenerHook: IUnloadHook | null = null;\n    let containerName: string = name || STR_EMPTY;\n    \n    if (attribLimits) {\n        maxAttribs = attribLimits.attributeCountLimit || maxAttribs;\n        // maxValueLen = attribLimits.attributeValueLengthLimit || maxValueLen;\n    }\n\n    // Determine if inheritAttrib is a container or plain attributes object\n    if (isAttributeContainer(inheritAttrib)) {\n        inheritContainer = inheritAttrib;\n    } else if (isObject(inheritAttrib)) {\n        inheritAttribObj = inheritAttrib;\n    }\n\n    inheritAttrib = null;\n\n    let inheritSrc = inheritAttribObj || inheritContainer;\n    let container: IAttributeContainer<V> = {\n        id: (containerName || STR_EMPTY) + \".\" + (_containerId++),\n        size: 0,\n        droppedAttributes: 0,\n        attributes: UNDEFINED_VALUE,\n        clear: () => {\n            // Remove parent listener if exists\n            if (parentListenerHook) {\n                parentListenerHook.rm();\n                parentListenerHook = null;\n            }\n\n            // Only inform children if we appear to have any keys or could possible inherit keys\n            if (nodes || inheritContainer || inheritAttribObj) {\n                // Inform any children (Synchronously) that we are about to clear all attributes\n                // Called prior to clearing the nodes, so that children still have full access\n                // to the current and inherited attributes\n                _notifyListeners(listeners, { frm: container.id, op: eAttributeChangeOp.Clear });\n            }\n\n            nodes = null;\n            theSize = null;\n            theDropped = null;\n            theAttributes = null;\n            localAttributes = null;\n            droppedAttribs = 0;\n            inheritSrc = null;          // Clear the inherited attributes\n            inheritContainer = null;    // Clear inherited container as well\n            inheritAttribObj = null;    // Clear inherited attributes as well\n        },\n        get: (key: string, source?: eAttributeFilter) => {\n            return _findDetail(container, key, source, (detail) => {\n                // Just return the value (which will include deleted ones (as undefined)if the filter is set)\n                return detail ? detail.v : UNDEFINED_VALUE;\n            }, nodes, inheritContainer, inheritAttribObj, otelCfg);\n        },\n        has: (key: string, source?: eAttributeFilter) => {\n            return _findDetail(container, key, source, (detail) => {\n                // Note: We may still have a detail object if the key was deleted, so we need to\n                // - Check if the detail is considered to \"exist\"\n                // - If the source filter is LocalOrDeleted, then return that is \"exists\"\n                return detail ? (detail.e || source === eAttributeFilter.LocalOrDeleted) : false;\n            }, nodes, inheritContainer, inheritAttribObj, otelCfg);\n        },\n        set: (key: string, value: any) => {\n            if (!nodes) {\n                // Lazily create a container object\n                nodes = objCreate(null);\n            }\n\n            let addResult = _addValue(container, nodes, key, value, maxAttribs, otelCfg);\n            if (addResult.r === AddAttributeResult.Success) {\n                theSize = null;         // invalidate any previously cached size\n                theAttributes = null;   // invalidate any previously cached attributes\n                localAttributes = null; // invalidate any previously cached local attributes\n\n                // Determine operation type based on whether this was a new attribute or set\n                let op = addResult.a ? eAttributeChangeOp.Add : eAttributeChangeOp.Set;\n                let prevValue = addResult.p;\n\n                if (op === eAttributeChangeOp.Add) {\n                    // Special case, if we just added/changed it locally we need to lookup our parents to see if we are replacing (hiding)\n                    // a previously inherited value and if so we need to notify our children that this was a set not an add (if the value changed)\n                    const inheritedValue = _getInheritedValue(key, inheritContainer, inheritAttribObj);\n                    if (inheritedValue) {\n                        op = eAttributeChangeOp.Set;\n                        prevValue = inheritedValue.v;\n                    }\n                }\n\n                // Only notify children if the value has changed\n                if (!objIs(value, prevValue)) {\n                    \n                    // Inform any children (Synchronously) that we have \"changed\" a value\n                    // Unlike clear, this is called after the change is made, so children\n                    // will need to \"handle\" the change accordingly\n                    _notifyListeners(listeners, {\n                        frm: container.id,\n                        op: op,\n                        k: key,\n                        prev: prevValue,\n                        val: value\n                    });\n                }\n            } else if (addResult.r === AddAttributeResult.MaxAttribsExceeded) {\n                theDropped = null;\n                droppedAttribs++;\n                _notifyListeners(listeners, {\n                    frm: container.id,\n                    op: eAttributeChangeOp.DroppedAttributes,\n                    k: key,\n                    val: value\n                });\n            }\n\n            return addResult.r === AddAttributeResult.Success;\n        },\n        del: (key: string) => {\n\n            // Find the node / value for this container\n            return _findDetail(container, key, UNDEFINED_VALUE, (detail) => {\n                // Check if the key exists locally (incl marked as deleted) or is inherited\n                if (detail) {\n                    // So the key exists either locally or in an inherited source\n                    // - It may also exists but marked as deleted\n                    if (!nodes) {\n                        // Always create nodes structure if it doesn't exist since we need to track deleted keys\n                        nodes = objCreate(null);\n                    }\n\n                    // Now lets mark this key as deleted locally\n                    let deleteResult = _deleteValue(nodes, key.split(\".\"));\n                    if (deleteResult.d) {\n                        theSize = null;         // invalidate any previously cached size\n                        theAttributes = null;   // invalidate any previously cached attributes\n                        localAttributes = null; // invalidate any previously cached local attributes\n                    }\n\n                    // Inform any children (Synchronously) that we have deleted a value\n                    // This is important even if the key didn't exist locally, as it existed in inheritance\n                    // chain and we need children (like snapshot containers) to know about the deletion to\n                    // ignore any future inherited values.\n                    _notifyListeners(listeners, {\n                        frm: container.id,\n                        op: eAttributeChangeOp.Delete,\n                        k: key,\n                        prev: detail.v\n                    });\n\n                    // Return true if we successfully marked it as deleted\n                    return deleteResult.d;\n                }\n\n                return false;\n            }, nodes, inheritContainer, inheritAttribObj, otelCfg);\n        },\n        keys: () => {\n            return _iterator(nodes, (prefix, key, node, source) => {\n                return prefix + key;\n            }, otelCfg, inheritSrc);\n        },\n        entries: () => {\n            return _iterator(nodes, (prefix, key, node, source) => {\n                return [prefix + key, node.v, source] as [string, V, eAttributeFilter];\n            }, otelCfg, inheritSrc);\n        },\n        values: () => {\n            return _iterator(nodes, (_prefix, _key, node, _source) => {\n                return node.v;\n            }, otelCfg, inheritSrc);\n        },\n        forEach: (cb: (key: string, value: V, source?: eAttributeFilter) => void) => {\n            let iter = _iterator(nodes, (prefix, key, node, source) => {\n                cb(prefix + key, node.v, source);\n                return true; // Return true to indicate the callback was executed\n            }, otelCfg, inheritSrc);\n\n            // Iterate over the entire container\n            iterForOf(iter, _noOpFunc);\n        },\n        child: (name?: string, snapshot?: boolean) => {\n            const childName = (name ? name : \"child\") + (snapshot ? \"<-@[\" : \"<=[\") + container.id + \"]\";\n            return snapshot ? _createSnapshotContainer(otelCfg, childName, container, attribLimits) : createAttributeContainer(otelCfg, childName, container, attribLimits);\n        },\n        listen: (callback: (changeInfo: IAttributeChangeInfo<V>) => void): IUnloadHook => {\n            if (!listeners) {\n                listeners = [];\n            }\n\n            return _createUnloadHook(listeners, callback);\n        }\n    };\n\n    function _listener(changeInfo: IAttributeChangeInfo<V>) {\n        // Invalidate caches when parent changes\n        let shouldNotify = true;\n\n        // If a parent adds a new key, then if this instance has not replaced it\n        // then we need to also inform our children\n        if (changeInfo.op === eAttributeChangeOp.Add || changeInfo.op === eAttributeChangeOp.Set || changeInfo.op === eAttributeChangeOp.Delete) {\n            theSize = null;\n            theAttributes = null;\n            localAttributes = null;\n\n            // If we already have (or deleted) this key locally, then we don't need to notify children\n            _findDetail(container, changeInfo.k, eAttributeFilter.LocalOrDeleted, (detail) => {\n                // If we have a node (which also might be that it was deleted) then don't notify\n                // If we didn't find a node then we still need to notify our children\n                shouldNotify = !detail || !detail.n;\n            }, nodes);\n        } else if (changeInfo.op === eAttributeChangeOp.Clear) {\n            theSize = null;\n            theAttributes = null;\n            localAttributes = null;\n\n            // If the parent clears all of it's keys, we need to inform our children\n            shouldNotify = true;\n        } else if (changeInfo.op === eAttributeChangeOp.DroppedAttributes) {\n            shouldNotify = true;\n            theDropped = null;\n        }\n\n        if (shouldNotify) {\n            _notifyListeners(listeners, changeInfo);\n        }\n    }\n    \n    // If we have a parent container, register a listener to stay connected to parent changes\n    if (inheritContainer && isFunction(inheritContainer.listen)) {\n        parentListenerHook = inheritContainer.listen(_listener);\n    }\n\n    return objDefineProps(container, {\n        size: {\n            g: () => {\n                if (!theSize) {\n                    theSize = createCachedValue(_size(nodes, inheritAttribObj, inheritContainer));\n                }\n\n                return theSize.v;\n            }\n        },\n        droppedAttributes: {\n            g: () => {\n                if (!theDropped) {\n                    theDropped = createCachedValue((inheritContainer ? inheritContainer.droppedAttributes : 0) + droppedAttribs);\n                }\n\n                return theDropped.v;\n            }\n        },\n        attributes: {\n            g: () => {\n                if (!theAttributes) {\n                    theAttributes = createCachedValue(_generateAttributes(container, nodes, otelCfg, inheritSrc));\n                }\n\n                return theAttributes.v;\n            }\n        },\n        _attributes: {\n            g: () => {\n                if (!localAttributes) {\n                    localAttributes = createCachedValue(_generateAttributes(container, nodes, otelCfg, inheritSrc, true));\n                }\n\n                return localAttributes.v;\n            }\n        }\n    });\n}\n\n/**\n * Add all attributes from the source attributes or container to the target container.\n * This function has performance and memory implications as it immediately copies all key-value pairs\n * from the source to the target container, handling both plain attribute objects and other attribute\n * containers.\n *\n * @param container - The target container to add attributes to\n * @param attributes - The source attributes or container to copy from\n * @since 3.4.0\n * @example\n * ```typescript\n * const target = createAttributeContainer(config, \"target\");\n * const source = { key1: \"value1\", key2: \"value2\" };\n * addAttributes(target, source);\n *\n * // Or from another container\n * const sourceContainer = createAttributeContainer(config, \"source\");\n * sourceContainer.set(\"key3\", \"value3\");\n * addAttributes(target, sourceContainer);\n * ```\n */\nexport function addAttributes(container: IAttributeContainer, attributes: IOTelAttributes | IAttributeContainer): void {\n    if (isAttributeContainer(attributes)) {\n        // Use the container's forEach for direct processing - more efficient than entries() iterator\n        attributes.forEach((key, value, source) => {\n            container.set(key, value);\n        });\n    } else if (attributes) {\n        if (isFunction(attributes.entries)) {\n            // Handle any type that has an entries function\n            iterForOf((attributes as any).entries(), function(entry: [string, any]) {\n                container.set(entry[0], entry[1]);\n            });\n        } else {\n            // Handle as plain attributes object\n            objForEachKey(attributes, function(key, value) {\n                container.set(key, value);\n            });\n        }\n    }\n}\n\nfunction _createSnapshotContainer(otelCfg: IOTelConfig, name: string | undefined, sourceContainer: IAttributeContainer, attribLimits?: IOTelAttributeLimits): IAttributeContainer {\n    let newContainer = createAttributeContainer(otelCfg, name, sourceContainer, attribLimits);\n\n    sourceContainer.listen((changeInfo) => {\n        if (changeInfo.op === eAttributeChangeOp.Clear) {\n            // Copy all parent keys to this container if not already present\n            iterForOf((sourceContainer as any).entries(), function(entry: [string, any]) {\n                let key = entry[0];\n                // If the Key has not been set or explicitly deleted from the new Container, and the source Container\n                // has the key (directly or inherited), then copy the value locally so we have a copy because our parent\n                // some grand parent is clearing their collection of values. Note ideal as if it's a grand parent or higher\n                // we end up duplicating the keys multiple times, but we only know about our direct ancestor\n                // Note: Deleting locally hides any inherited value\n                if (!newContainer.has(key, eAttributeFilter.LocalOrDeleted) && sourceContainer.has(key)) {\n                    newContainer.set(key, entry[1]);\n                }\n            });\n        } else if (changeInfo.op === eAttributeChangeOp.Add) {\n            // For add operations add), we need to ensure that when the key is not already present on the current instance\n            // that we hide the key so it's \"not\" inherited, by marking it as deleted.\n            let key = changeInfo.k;\n            if (!newContainer.has(key, eAttributeFilter.Local)) {\n                newContainer.del(key);\n            }\n        } else if (changeInfo.op === eAttributeChangeOp.Set || changeInfo.op === eAttributeChangeOp.Delete) {\n            // For set operations (change), preserve the previous value if we don't have it locally\n            // For delete operations, if we don't have the key locally, preserve it with the deleted value\n            let key = changeInfo.k;\n            if (!newContainer.has(key, eAttributeFilter.LocalOrDeleted)) {\n                newContainer.set(key, changeInfo.prev);\n            }\n        }\n    });\n\n    return newContainer;\n}\n\n/**\n * Creates a snapshot container based on the passed IOTelAttributes or IAttributeContainer.\n * The returned container effectively treats the source attributes as immutable as at the time of creation, you\n * may still add / update existing attributes without affecting the original source. And changes to the source\n * attributes / container will not be reflected from the new snapshot container, only changes made to the returned\n * container itself.\n *\n * Note: It implements this in a lazy manner, so changes made to the original source after the snapshot is taken will\n * cause the changed attributes to be copied into this snapshot container with it's original value and cause a local\n * version of the changed key (if not already been present) to be added, so when using the {@link IAttributeContainer#has} or\n * {@link IAttributeContainer#get} methods, with the optional source filter as {@link eAttributeFilter.Inherited} it will\n * only return attributes that were present and unchanged at the time of the snapshot. This means for those attributes you must\n * use the {@link eAttributeFilter.Local} as source filter (or leave it undefined) to access the local version.\n *\n * It is recommended that you always use {@link IAttributeContainer} instances for better memory and performance overheads,\n * for this specific function when you pass a {@link IOTelAttributes} instance it will create a copy of all present attributes\n * at the point of creation (not lazily).\n *\n * @param otelCfg - The OpenTelemetry configuration to use for the snapshot container\n * @param source - The source attributes or container to create a snapshot view from\n * @param attribLimits - Optional attribute limits to apply to the snapshot container\n * @returns An IAttributeContainer instance that will preserves the attributes and values from the source attributes / container\n * at creation time. The snapshot container will be named \"snapshot(xxxx)\" where xxxx is the source container ID, or \"snapshot(...)\" for non-container sources.\n * @since 3.4.0\n * @example\n * ```typescript\n * // Immediate copy for plain attributes\n * const attrs = { key1: \"value1\", key2: \"value2\" };\n * const snapshot = createAttributeSnapshot(attrs);\n * // snapshot.id will be \"snapshot(...).N\"\n * attrs.key1 = \"changed\"; // snapshot.get(\"key1\") is still \"value1\"\n *\n * // Lazy copy-on-change for containers\n * const container = createAttributeContainer(config, \"my-container\");\n * container.set(\"key1\", \"value1\");\n * const snapshot2 = createAttributeSnapshot(container);\n * // snapshot2.id will be \"snapshot(my-container.N).M\"\n * container.set(\"key1\", \"changed\"); // snapshot2.get(\"key1\") remains \"value1\" (previous value copied)\n * ```\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function createAttributeSnapshot(otelCfg: IOTelConfig, name: string, source: IOTelAttributes | IAttributeContainer, attribLimits?: IOTelAttributeLimits): IAttributeContainer {\n    let newContainer: IAttributeContainer;\n\n    if (isAttributeContainer(source)) {\n        newContainer = _createSnapshotContainer(otelCfg, (name || \"child\") + \"<-@[\" + source.id + \"]\", source, attribLimits);\n    } else {\n        newContainer = createAttributeContainer(otelCfg, (name || \"child\") + \"<-@[(...)]\", null, attribLimits);\n        addAttributes(newContainer, source);\n    }\n\n    return newContainer;\n}\n\n/**\n * Helper function to identify if a passed argument is or implements the IAttributeContainer interface\n * @param value - The value to check\n * @returns true if the value implements IAttributeContainer interface, false otherwise\n * @since 3.4.0\n * @example\n * ```typescript\n * const container = createAttributeContainer(config, \"test-container\");\n * if (isAttributeContainer(container)) {\n *     // TypeScript now knows container is IAttributeContainer\n *     console.log(container.size);\n *     container.set(\"key\", \"value\");\n * }\n *\n * // Check unknown object\n * function processContainer(obj: unknown) {\n *     if (isAttributeContainer(obj)) {\n *         obj.forEach((key, value) => console.log(key, value));\n *     }\n * }\n * ```\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isAttributeContainer(value: any): value is IAttributeContainer {\n    return value &&\n           isFunction(value.clear) &&\n           isFunction(value.get) &&\n           isFunction(value.has) &&\n           isFunction(value.set) &&\n           isFunction(value.del) &&\n           isFunction(value.keys) &&\n           isFunction(value.entries) &&\n           isFunction(value.forEach) &&\n           isFunction(value.values) &&\n           isFunction(value.child) &&\n           isFunction(value.listen) &&\n           (isObject(value) || isFunction(value)) &&\n           // Check for existence of the required properties, but don't cause them to be processed (\"executed\")\n           (\"id\" in value) &&\n           (\"size\" in value) &&\n           (\"droppedAttributes\" in value) &&\n           (\"attributes\" in value);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ConnectionStringParser.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrReduce, objKeys, strEndsWith } from \"@nevware21/ts-utils\";\nimport { DEFAULT_BREEZE_ENDPOINT } from \"../constants/Constants\";\nimport { ConnectionString, ConnectionStringKey } from \"../interfaces/ai/ConnectionString\";\n\nconst _FIELDS_SEPARATOR = \";\";\nconst _FIELD_KEY_VALUE_SEPARATOR = \"=\";\n\nexport function parseConnectionString(connectionString?: string): ConnectionString {\n    if (!connectionString) {\n        return {};\n    }\n\n    const kvPairs = connectionString.split(_FIELDS_SEPARATOR);\n\n    const result: ConnectionString = arrReduce(kvPairs, (fields: ConnectionString, kv: string) => {\n        const kvParts = kv.split(_FIELD_KEY_VALUE_SEPARATOR);\n\n        if (kvParts.length === 2) { // only save fields with valid formats\n            const key = kvParts[0].toLowerCase() as ConnectionStringKey;\n            const value = kvParts[1];\n            fields[key] = value as string;\n        }\n        return fields;\n    }, {});\n\n    if (objKeys(result).length > 0) {\n        // this is a valid connection string, so parse the results\n\n        if (result.endpointsuffix) {\n            // apply the default endpoints\n            const locationPrefix = result.location ? result.location + \".\" : \"\";\n            result.ingestionendpoint = result.ingestionendpoint || (\"https://\" + locationPrefix + \"dc.\" + result.endpointsuffix);\n        }\n\n        // apply user override endpoint or the default endpoints\n        result.ingestionendpoint = result.ingestionendpoint || DEFAULT_BREEZE_ENDPOINT;\n        \n        if (strEndsWith(result.ingestionendpoint, \"/\")) {\n            result.ingestionendpoint = result.ingestionendpoint.slice(0,-1);\n        }\n    }\n\n    return result;\n}\n\nexport const ConnectionStringParser = {\n    parse: parseConnectionString\n};\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/RequestResponseHeaders.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createValueMap } from \"../enums/EnumHelperFuncs\";\n\nexport interface IRequestHeaders {\n    /**\n     * Request-Context header\n     */\n    requestContextHeader: string,\n\n    /**\n     * Target instrumentation header that is added to the response and retrieved by the\n     * calling application when processing incoming responses.\n     */\n    requestContextTargetKey: string,\n\n    /**\n     * Request-Context appId format\n     */\n    requestContextAppIdFormat: string,\n\n    /**\n     * Request-Id header\n     */\n    requestIdHeader: string,\n\n    /**\n     * W3C distributed tracing protocol header\n     */\n    traceParentHeader: string,\n\n    /**\n     * W3C distributed tracing protocol state header\n     */\n    traceStateHeader: string,     // currently not used\n\n    /**\n     * Sdk-Context header\n     * If this header passed with appId in content then appId will be returned back by the backend.\n     */\n    sdkContextHeader: string,\n\n    /**\n     * String to pass in header for requesting appId back from the backend.\n     */\n    sdkContextHeaderAppIdRequest: string,\n\n    requestContextHeaderLowerCase: string\n}\n\nexport const enum eRequestHeaders {\n    requestContextHeader = 0,\n    requestContextTargetKey = 1,\n    requestContextAppIdFormat = 2,\n    requestIdHeader = 3,\n    traceParentHeader = 4,\n    traceStateHeader = 5,\n    sdkContextHeader = 6,\n    sdkContextHeaderAppIdRequest = 7,\n    requestContextHeaderLowerCase = 8\n}\n\nexport const RequestHeaders = (/* @__PURE__ */ createValueMap<typeof eRequestHeaders, IRequestHeaders & {\n    // Defined the enum lookups\n    [eRequestHeaders.requestContextHeader]: \"Request-Context\",\n    [eRequestHeaders.requestContextTargetKey]: \"appId\",\n    [eRequestHeaders.requestContextAppIdFormat]: \"appId=cid-v1:\",\n    [eRequestHeaders.requestIdHeader]: \"Request-Id\",\n    [eRequestHeaders.traceParentHeader]: \"traceparent\",\n    [eRequestHeaders.traceStateHeader]: \"tracestate\",\n    [eRequestHeaders.sdkContextHeader]: \"Sdk-Context\",\n    [eRequestHeaders.sdkContextHeaderAppIdRequest]: \"appId\",\n    [eRequestHeaders.requestContextHeaderLowerCase]: \"request-context\",\n    // Defined Named reference\n    requestContextHeader: \"Request-Context\",\n    requestContextTargetKey: \"appId\",\n    requestContextAppIdFormat: \"appId=cid-v1:\",\n    requestIdHeader: \"Request-Id\",\n    traceParentHeader: \"traceparent\",\n    traceStateHeader: \"tracestate\",\n    sdkContextHeader: \"Sdk-Context\",\n    sdkContextHeaderAppIdRequest: \"appId\",\n    requestContextHeaderLowerCase: \"request-context\"\n}>({\n    requestContextHeader: [ eRequestHeaders.requestContextHeader, \"Request-Context\" ],\n    requestContextTargetKey: [ eRequestHeaders.requestContextTargetKey, \"appId\"],\n    requestContextAppIdFormat: [ eRequestHeaders.requestContextAppIdFormat, \"appId=cid-v1:\"],\n    requestIdHeader: [ eRequestHeaders.requestIdHeader, \"Request-Id\"],\n    traceParentHeader: [ eRequestHeaders.traceParentHeader, \"traceparent\"],\n    traceStateHeader: [ eRequestHeaders.traceStateHeader, \"tracestate\"],\n    sdkContextHeader: [ eRequestHeaders.sdkContextHeader, \"Sdk-Context\"],\n    sdkContextHeaderAppIdRequest: [ eRequestHeaders.sdkContextHeaderAppIdRequest, \"appId\"],\n    requestContextHeaderLowerCase: [ eRequestHeaders.requestContextHeaderLowerCase, \"request-context\"]\n}));\n\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/TelemetryItemCreator.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { isNullOrUndefined, objForEachKey, throwError } from \"@nevware21/ts-utils\";\nimport { strIkey, strNotSpecified } from \"../constants/Constants\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { ITelemetryItem } from \"../interfaces/ai/ITelemetryItem\";\nimport { toISOString } from \"../utils/HelperFuncs\";\nimport { dataSanitizeString } from \"./ai/Common/DataSanitizer\";\n\n/**\n * Create a telemetry item that the 1DS channel understands\n * @param item - domain specific properties; part B\n * @param baseType - telemetry item type. ie PageViewData\n * @param envelopeName - Name of the envelope, e.g., `Microsoft.ApplicationInsights.\\<instrumentation key\\>.PageView`.\n * @param customProperties - user defined custom properties; part C\n * @param systemProperties - system properties that are added to the context; part A\n * @returns ITelemetryItem that is sent to channel\n */\n\nexport function createTelemetryItem<T>(item: T,\n    baseType: string,\n    envelopeName: string,\n    logger: IDiagnosticLogger,\n    customProperties?: { [key: string]: any },\n    systemProperties?: { [key: string]: any }): ITelemetryItem {\n\n    envelopeName = dataSanitizeString(logger, envelopeName) || strNotSpecified;\n\n    if (isNullOrUndefined(item) ||\n        isNullOrUndefined(baseType) ||\n        isNullOrUndefined(envelopeName)) {\n        throwError(\"Input doesn't contain all required fields\");\n    }\n    \n    let iKey = \"\";\n    if ((item as any)[strIkey]) {\n        iKey = (item as any)[strIkey];\n        delete (item as any)[strIkey];\n    }\n\n    const telemetryItem: ITelemetryItem = {\n        name: envelopeName,\n        time: toISOString(new Date()),\n        iKey: iKey, // this will be set in TelemetryContext\n        ext: systemProperties ? systemProperties : {}, // part A\n        tags: [],\n        data: {\n        },\n        baseType,\n        baseData: item // Part B\n    };\n\n    // Part C\n    if (!isNullOrUndefined(customProperties)) {\n        objForEachKey(customProperties, (prop, value) => {\n            telemetryItem.data[prop] = value;\n        });\n    }\n\n    return telemetryItem;\n}\n\nexport class TelemetryItemCreator {\n    /**\n     * Create a telemetry item that the 1DS channel understands\n     * @param item - domain specific properties; part B\n     * @param baseType - telemetry item type. ie PageViewData\n     * @param envelopeName - Name of the envelope (e.g., Microsoft.ApplicationInsights.[instrumentationKey].PageView).\n     * @param customProperties - user defined custom properties; part C\n     * @param systemProperties - system properties that are added to the context; part A\n     * @returns ITelemetryItem that is sent to channel\n     */\n\n    public static create = createTelemetryItem;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/W3cTraceState.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    ICachedValue, arrForEach, arrIndexOf, createCachedValue, isArray, isFunction, isNullOrUndefined, isString, objDefineProps,\n    safeGetDeferred, strSplit\n} from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { IW3cTraceState } from \"../interfaces/ai/IW3cTraceState\";\nimport { findMetaTags, findNamedServerTimings } from \"../utils/EnvUtils\";\nimport { setObjStringTag } from \"../utils/HelperFuncs\";\n\nconst MAX_TRACE_STATE_MEMBERS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\n\n// https://www.w3.org/TR/trace-context-1/#key\nconst LCALPHA = \"[a-z]\";\nconst LCALPHA_DIGIT = \"[a-z\\\\d]\";\nconst LCALPHA_DIGIT_UNDERSCORE_DASH_STAR_SLASH = \"[a-z\\\\d_\\\\-*\\\\/]\";\nconst SIMPLE_KEY = \"(\" + LCALPHA + LCALPHA_DIGIT_UNDERSCORE_DASH_STAR_SLASH + \"{0,255})\";\nconst TENANT_ID = \"(\" + LCALPHA_DIGIT + LCALPHA_DIGIT_UNDERSCORE_DASH_STAR_SLASH + \"{0,240})\";\nconst SYSTEM_ID = \"(\" + LCALPHA + LCALPHA_DIGIT_UNDERSCORE_DASH_STAR_SLASH + \"{0,13})\";\nconst MULTI_TENANT_KEY = \"(\" + TENANT_ID + \"@\" + SYSTEM_ID + \")\";\n\n// https://www.w3.org/TR/trace-context-1/#value\nconst NBLK_CHAR = \"\\x21-\\x2B\\\\--\\x3C\\x3E-\\x7E\";\nconst TRACESTATE_VALUE = \"[\\x20\" + NBLK_CHAR + \"]{0,255}[\" + NBLK_CHAR + \"]\";\n\n// https://www.w3.org/TR/trace-context-1/#tracestate-header\nconst TRACESTATE_KVP_REGEX = (/*#__PURE__*/ new RegExp(\"^\\\\s*((?:\" + SIMPLE_KEY + \"|\" + MULTI_TENANT_KEY + \")=(\" + TRACESTATE_VALUE + \"))\\\\s*$\"));\n\n/**\n * @internal\n * @ignore\n * Identifies the components of a multi-tenant key\n */\ninterface ITraceStateMultiTenantKey {\n    tenantId: string;\n    systemId: string;\n}\n\n/**\n * @internal\n * @ignore\n * Identifies the member entry type\n */\nconst enum eTraceStateKeyType {\n    simple = 0,\n    multiTenant = 1,\n\n    /**\n     * Internal flag the identifies that the associated key has been deleted\n     */\n    deleted = 2\n}\n\n/**\n * @internal\n * @ignore\n * Represents the parsed trace state member\n */\ninterface ITraceStateMember {\n    /**\n     * Identifies the type of identified key, simple or multi-tenant\n     */\n    readonly type: eTraceStateKeyType;\n\n    /**\n     * The full key of the trace state member\n     */\n    readonly key: string;\n\n    /**\n     * When the {@link #type} is {@link eTraceStateKeyType.multiTenant}, the tenantId and systemId will be populated\n     * with the values from the key, otherwise this entry will be undefined or null and should be ignored.\n     */\n    readonly multiTenant?: ITraceStateMultiTenantKey;\n\n    /**\n     * The value associated with the trace state member.\n     * If the type is {@link eTraceStateKeyType.deleted} then the value should be ignored\n     * and will likely be undefined.\n     */\n    readonly value?: string;\n}\n\n/**\n * @internal\n * Parse a trace state key/value pair\n * @param value - the key/value pair as a string\n * @returns The trace state member if valid, otherwise null\n */\nfunction _parseListMember(value: string): ITraceStateMember | null {\n    if (value) {\n        TRACESTATE_KVP_REGEX.lastIndex = 0; // Reset the regex to ensure we start from the beginning\n        let match = TRACESTATE_KVP_REGEX.exec(value);\n        if (match && match.length >= 7 && match[1] && match[6]) {\n            let type = match[3] ? eTraceStateKeyType.multiTenant : eTraceStateKeyType.simple;\n            let multiTenant: ITraceStateMultiTenantKey = null;\n            if (type === eTraceStateKeyType.multiTenant) {\n                multiTenant = {\n                    tenantId: match[4],\n                    systemId: match[5]\n                };\n            }\n            let parts: ITraceStateMember = {\n                type: type,\n                key: match[2],\n                multiTenant: multiTenant,\n                value: match[6]\n            };\n    \n            return parts;\n        }\n    }\n\n    return null;\n}\n\n/**\n * @internal\n * Parse the trace state list from a string\n * @param value - the list of trace states as a string\n * @returns An array of trace state members\n */\nfunction _parseTraceStateList(value?: string): ITraceStateMember[] {\n    let items: ITraceStateMember[] = [];\n\n    if (value) {\n        let addedKeys: string[] = [];\n        arrForEach(strSplit(value, \",\"), (member) => {\n            let parts = _parseListMember(member);\n            if (parts) {\n                // As per the spec, the first occurrence of a key is the one that should be used\n                // as all new entries are added to the front (left) of the list\n                if (arrIndexOf(addedKeys, parts.key) === -1) {\n                    items.push(parts);\n                    addedKeys.push(parts.key);\n\n                    if (items.length >= MAX_TRACE_STATE_MEMBERS) {\n                        // The trace state list should not exceed 32 members\n                        return -1;\n                    }\n                }\n            }\n        });\n    }\n\n    return items;\n}\n\nfunction _indexOf(items: ITraceStateMember[], key: string): number {\n    for (let lp = 0; lp < items.length; lp++) {\n        if (items[lp].key === key) {\n            return lp;\n        }\n    }\n\n    return -1;\n}\n\nfunction _keys(items: ITraceStateMember[], parent?: IW3cTraceState | null): string[] {\n    let keys: string[] = [];\n    let delKeys: string[] = [];\n    arrForEach(items, (member) => {\n        if (member.value != null) {\n            keys.push(member.key);\n        } else {\n            delKeys.push(member.key);\n        }\n    });\n\n    if (parent) {\n        // Get and add parent keys that are not in the current list or marked as deleted\n        arrForEach(parent.keys, (key) => {\n            if (arrIndexOf(keys, key) === -1 && arrIndexOf(delKeys, key) === -1) {\n                keys.push(key);\n            }\n        });\n    }\n\n    return keys;\n}\n\n/**\n * @internal\n * Identifies if the provided items are empty, meaning it has no keys or values.\n * @param items - The items to check\n * @param parent - The parent trace state to check for keys\n * @returns true if the items are empty, false otherwise\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction _isEmpty(items: ITraceStateMember[], parent?: IW3cTraceState | null): boolean {\n    let delKeys: string[];\n    let isEmpty = true;\n\n    if (items && items.length > 0) {\n        arrForEach(items, (member) => {\n            if (member.value != null) {\n                isEmpty = false;\n            } else {\n                if (!delKeys) {\n                    delKeys = [];\n                }\n\n                // If the value is null then this is a deleted key, so we can ignore it\n                delKeys.push(member.key);\n            }\n        });\n    }\n\n    if (isEmpty && parent) {\n        isEmpty = parent.isEmpty;\n        if (!isEmpty && delKeys && delKeys.length > 0) {\n            // If the parent is not empty then we need to check if any of the keys are in the deleted list\n            isEmpty = true;\n            arrForEach(parent.keys, (key) => {\n                if (arrIndexOf(delKeys, key) === -1) {\n                    isEmpty = false;\n                    return -1; // Break out of the loop\n                }\n            });\n        }\n    }\n\n    return isEmpty;\n}\n\n/**\n * Identifies if the provided value looks like a distributed trace state instance\n * @param value - The value to check\n * @returns - True if the value looks like a distributed trace state instance\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isW3cTraceState(value: any): value is IW3cTraceState {\n    return !!(value && isArray(value.keys) && isFunction(value.get) && isFunction(value.set) && isFunction(value.del) && isFunction(value.hdrs));\n}\n\n/**\n * Creates a new mutable {@link IW3cTraceState} instance, optionally inheriting from the parent trace state\n * and optionally using the provided encoded string value as the initial trace state.\n * Calls to {@link IW3cTraceState.set} and {@link IW3cTraceState.del} will modify the current instance\n * which means that any child instance that is using this instance as a parent will also be indirectly\n * modified unless the child instance has overridden the value associated with the modified key.\n * @since 3.4.0\n * @param value - The string value for the trace state\n * @param parent - The parent trace state to inherit any existing keys from.\n * @returns - A new distributed trace state instance\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function createW3cTraceState(value?: string | null, parent?: IW3cTraceState | null): IW3cTraceState {\n    let cachedItems: ICachedValue<ITraceStateMember[]> = safeGetDeferred(_parseTraceStateList, [], [value || STR_EMPTY]);\n\n    function _get(key: string): string | undefined {\n        let value: string | undefined;\n        let theItems = cachedItems.v;\n        let idx = _indexOf(theItems, key);\n        if (idx !== -1) {\n            let itmValue = theItems[idx].value;\n            if (itmValue != null) {\n                // Special case for the value being null, which means the key was deleted\n                value = itmValue;\n            }\n        } else if (parent) {\n            // Get the value from the parent if it exists\n            value = parent.get(key);\n        }\n        \n        return value;\n    }\n    \n    function _setMember(member: ITraceStateMember): number {\n        if (member) {\n            let theItems = cachedItems.v;\n            let idx = _indexOf(theItems, member.key);\n            if (idx !== -1) {\n                // Move the item to the front of the list, removing the previous instance\n                theItems.splice(idx, 1);\n            }\n\n            theItems.unshift(member);\n            // We need to re-create the cached value as during testing the cached lazy value\n            // may get re-evaluated resetting the items to the original value\n            cachedItems = createCachedValue(theItems);\n\n            return 0;\n        }\n\n        return -1;\n    }\n\n    function _set(key: string, value: string | null): number {\n        let member: ITraceStateMember | null;\n        if (key && isString(key) && !isNullOrUndefined(value) && isString(value)) {\n            member = _parseListMember(key + \"=\" + value); // Validate the key/value pair before adding it to the state\n        }\n\n        return _setMember(member);\n    }\n    \n    function _del(key: string) {\n        _setMember({\n            type: eTraceStateKeyType.deleted,\n            key: key\n        });\n    }\n    \n    function _headers(maxHeaders?: number, maxKeys?: number, maxLen?: number): string[] {\n        let results: string[] = [];\n        let result = STR_EMPTY;\n        let numKeys = 0;\n        let len = 0;\n\n        // Default to the max values if not provided\n        maxKeys = maxKeys || MAX_TRACE_STATE_MEMBERS;\n\n        // Default to the max length if not provided\n        maxLen = maxLen || MAX_TRACE_STATE_LEN;\n\n        let theItems = cachedItems.v;\n        arrForEach(_keys(theItems, parent), (key) => {\n            let value = _get(key);\n            if (!isNullOrUndefined(value) && isString(value)) {\n                numKeys++;\n                let val = key + \"=\" + value;\n                let valLen = val.length;\n                if (len + 1 + valLen >= maxLen) {\n                    // Don't exceed the max length for any single combined header value\n                    results.push(result);\n\n                    if (maxHeaders && results.length <= maxHeaders) {\n                        // Don't exceed the max number of entries\n                        return -1;\n                    }\n\n                    result = STR_EMPTY;\n                    len = 0;\n                }\n\n                if (result.length > 0) {\n                    result += \",\";\n                    len++;\n                }\n\n                result += val;\n                len += valLen;\n\n                if (numKeys >= maxKeys) {\n                    // Only allow the first maxKeys members\n                    return -1;\n                }\n            }\n        });\n\n        if (result) {\n            results.push(result);\n        }\n\n        return results;\n    }\n\n    let traceStateList: IW3cTraceState = {\n        keys: [],\n        isEmpty: false,\n        get: _get,\n        set: _set,\n        del: _del,\n        hdrs: _headers,\n        child: () => createW3cTraceState(null, traceStateList)\n    };\n\n    function _toString() {\n        let headers = traceStateList.hdrs(1);\n        return headers.length > 0 ? headers[0] : STR_EMPTY;\n    }\n\n    objDefineProps<IW3cTraceState>(traceStateList, {\n        \"keys\": {\n            g: () => _keys(cachedItems.v, parent)\n        },\n        \"isEmpty\": {\n            g: () => _isEmpty(cachedItems.v, parent)\n        },\n        \"toString\": {\n            v: _toString,\n            e: false // Do not allow the toString to be enumerated\n        },\n        \"_p\": {\n            v: parent,\n            e: false // Do not allow the parent to be enumerated\n        }\n    });\n\n    setObjStringTag(traceStateList, _toString);\n\n    return traceStateList;\n}\n\n/**\n * Create a new independent instance of IW3cTraceState that contains a snapshot of all current key/value pairs\n * from the provided instance and any parent instances. The returned instance will have no parent and will be completely\n * independent from any future changes to the original instance or its parent chain.\n * This is useful when you need to capture the current state and ensure it remains unchanged regardless of\n * future modifications to the parent instances.\n * @since 3.4.0\n * @param traceState - The trace state instance to snapshot\n * @returns A new independent instance of IW3cTraceState with all current key/value pairs captured\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function snapshotW3cTraceState(traceState: IW3cTraceState): IW3cTraceState {\n    // Create a new independent instance with no parent\n    // This ensures the returned instance is completely independent from future changes\n    let snapshot = createW3cTraceState(null, null);\n    \n    if (traceState) {\n        let theKeys = traceState.keys;\n        \n        // Iterate over the keys in reverse order to maintain correct precedence\n        // Since set() adds items to the front, we need to add them in reverse order\n        // to preserve the original key ordering where newer keys take precedence\n        for (let i = theKeys.length - 1; i >= 0; i--) {\n            let key = theKeys[i];\n            let value = traceState.get(key);\n            if (!isNullOrUndefined(value) && isString(value)) {\n                // Use the set function to add the key/value pair to the snapshot\n                // This leverages the existing validation and formatting logic\n                snapshot.set(key, value);\n            }\n        }\n    }\n\n    return snapshot;\n}\n\n/**\n * Helper function to fetch the passed traceparent from the page, looking for it as a meta-tag or a Server-Timing header.\n * @since 3.4.0\n * @param selectIdx - If the found value is comma separated which is the preferred entry to select, defaults to the first\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function findW3cTraceState(): IW3cTraceState {\n    const name = \"tracestate\";\n    let traceState: IW3cTraceState = null;\n    let metaTags = findMetaTags(name);\n    if (metaTags.length > 0) {\n        traceState = createW3cTraceState(metaTags.join(\",\"));\n    }\n\n    if (!traceState) {\n        let serverTimings = findNamedServerTimings(name);\n        if (serverTimings.length > 0) {\n            traceState = createW3cTraceState(serverTimings.join(\",\"));\n        }\n    }\n\n    return traceState;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Common/Data.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { FieldType } from \"../../../enums/ai/Enums\";\nimport { IData } from \"../../../interfaces/ai/contracts/IData\";\nimport { ISerializable } from \"../../../interfaces/ai/telemetry/ISerializable\";\n\n/**\n * @deprecated - will be removed in future releases as this was only used by the applicationinsights-channel-js package.\n * And it no longer uses this class.\n */\nexport class Data<TDomain> implements IData<TDomain>, ISerializable {\n\n    /**\n     * The data contract for serializing this object.\n     */\n    public aiDataContract = {\n        baseType: FieldType.Required,\n        baseData: FieldType.Required\n    }\n\n    /**\n     * Name of item (B section) if any. If telemetry data is derived straight from this, this should be null.\n     */\n    public baseType: string;\n\n    /**\n     * Container for data item (B section).\n     */\n    public baseData: TDomain;\n\n    /**\n     * Constructs a new instance of telemetry data.\n     */\n    constructor(baseType: string, data: TDomain) {\n        this.baseType = baseType;\n        this.baseData = data;\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Common/DataPoint.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { FieldType } from \"../../../enums/ai/Enums\";\nimport { DataPointType } from \"../../../interfaces/ai/contracts/DataPointType\";\nimport { IDataPoint } from \"../../../interfaces/ai/contracts/IDataPoint\";\nimport { ISerializable } from \"../../../interfaces/ai/telemetry/ISerializable\";\n\nexport class DataPoint implements IDataPoint, ISerializable {\n\n    /**\n     * The data contract for serializing this object.\n     */\n    public aiDataContract = {\n        name: FieldType.Required,\n        kind: FieldType.Default,\n        value: FieldType.Required,\n        count: FieldType.Default,\n        min: FieldType.Default,\n        max: FieldType.Default,\n        stdDev: FieldType.Default\n    }\n\n    /**\n     * Name of the metric.\n     */\n    public name: string;\n\n    /**\n     * Metric type. Single measurement or the aggregated value.\n     */\n    public kind: DataPointType = DataPointType.Measurement;\n \n    /**\n     * Single value for measurement. Sum of individual measurements for the aggregation.\n     */\n    public value: number;\n \n    /**\n     * Metric weight of the aggregated metric. Should not be set for a measurement.\n     */\n    public count: number;\n \n    /**\n     * Minimum value of the aggregated metric. Should not be set for a measurement.\n     */\n    public min: number;\n \n    /**\n     * Maximum value of the aggregated metric. Should not be set for a measurement.\n     */\n    public max: number;\n \n    /**\n     * Standard deviation of the aggregated metric. Should not be set for a measurement.\n     */\n    public stdDev: number;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Common/DataSanitizer.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { asString, isObject, isString, objForEachKey, strSubstr, strSubstring, strTrim } from \"@nevware21/ts-utils\";\nimport { _throwInternal } from \"../../../diagnostics/DiagnosticLogger\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../../../enums/ai/LoggingEnums\";\nimport { IConfiguration } from \"../../../interfaces/ai/IConfiguration\";\nimport { IDiagnosticLogger } from \"../../../interfaces/ai/IDiagnosticLogger\";\nimport { fieldRedaction, getJSON, hasJSON } from \"../../../utils/EnvUtils\";\n\nexport const enum DataSanitizerValues {\n    /**\n     * Max length allowed for custom names.\n     */\n    MAX_NAME_LENGTH = 150,\n\n     /**\n      * Max length allowed for Id field in page views.\n      */\n    MAX_ID_LENGTH = 128,\n \n     /**\n      * Max length allowed for custom values.\n      */\n    MAX_PROPERTY_LENGTH = 8192,\n \n     /**\n      * Max length allowed for names\n      */\n    MAX_STRING_LENGTH = 1024,\n \n     /**\n      * Max length allowed for url.\n      */\n    MAX_URL_LENGTH = 2048,\n \n     /**\n      * Max length allowed for messages.\n      */\n    MAX_MESSAGE_LENGTH = 32768,\n \n     /**\n      * Max length allowed for exceptions.\n      */\n    // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n    MAX_EXCEPTION_LENGTH = 32768\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeKeyAndAddUniqueness(logger: IDiagnosticLogger, key: any, map: any) {\n    const origLength = key.length;\n    let field = dataSanitizeKey(logger, key);\n\n    // validation truncated the length.  We need to add uniqueness\n    if (field.length !== origLength) {\n        let i = 0;\n        let uniqueField = field;\n        while (map[uniqueField] !== undefined) {\n            i++;\n            uniqueField = strSubstring(field, 0, DataSanitizerValues.MAX_NAME_LENGTH - 3) + dsPadNumber(i);\n        }\n        field = uniqueField;\n    }\n    return field;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeKey(logger: IDiagnosticLogger, name: any) {\n    let nameTrunc: String;\n    if (name) {\n        // Remove any leading or trailing whitespace\n        name = strTrim(asString(name));\n\n        // truncate the string to 150 chars\n        if (name.length > DataSanitizerValues.MAX_NAME_LENGTH) {\n            nameTrunc = strSubstring(name, 0, DataSanitizerValues.MAX_NAME_LENGTH);\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.NameTooLong,\n                \"name is too long.  It has been truncated to \" + DataSanitizerValues.MAX_NAME_LENGTH + \" characters.\",\n                { name }, true);\n        }\n    }\n\n    return nameTrunc || name;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeString(logger: IDiagnosticLogger, value: any, maxLength: number = DataSanitizerValues.MAX_STRING_LENGTH) {\n    let valueTrunc : String;\n    if (value) {\n        maxLength = maxLength ? maxLength : DataSanitizerValues.MAX_STRING_LENGTH; // in case default parameters dont work\n        value = strTrim(asString(value));\n        if (value.length > maxLength) {\n            valueTrunc = strSubstring(value, 0, maxLength);\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.StringValueTooLong,\n                \"string value is too long. It has been truncated to \" + maxLength + \" characters.\",\n                { value }, true);\n        }\n    }\n\n    return valueTrunc || value;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeUrl(logger: IDiagnosticLogger, url: any, config?: IConfiguration) {\n    if (isString(url)) {\n        url = fieldRedaction(url, config);\n    }\n    return dataSanitizeInput(logger, url, DataSanitizerValues.MAX_URL_LENGTH, _eInternalMessageId.UrlTooLong);\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeMessage(logger: IDiagnosticLogger, message: any) {\n    let messageTrunc : String;\n    if (message) {\n        if (message.length > DataSanitizerValues.MAX_MESSAGE_LENGTH) {\n            messageTrunc = strSubstring(message, 0, DataSanitizerValues.MAX_MESSAGE_LENGTH);\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING, _eInternalMessageId.MessageTruncated,\n                \"message is too long, it has been truncated to \" + DataSanitizerValues.MAX_MESSAGE_LENGTH + \" characters.\",\n                { message },\n                true);\n        }\n    }\n\n    return messageTrunc || message;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeException(logger: IDiagnosticLogger, exception: any) {\n    let exceptionTrunc : String;\n    if (exception) {\n        // Make surte its a string\n        let value:string = \"\" + exception;\n        if (value.length > DataSanitizerValues.MAX_EXCEPTION_LENGTH) {\n            exceptionTrunc = strSubstring(value, 0, DataSanitizerValues.MAX_EXCEPTION_LENGTH);\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING, _eInternalMessageId.ExceptionTruncated, \"exception is too long, it has been truncated to \" + DataSanitizerValues.MAX_EXCEPTION_LENGTH + \" characters.\",\n                { exception }, true);\n        }\n    }\n\n    return exceptionTrunc || exception;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeProperties(logger: IDiagnosticLogger, properties: any) {\n    if (properties) {\n        const tempProps: any = {};\n        objForEachKey(properties, (prop, value) => {\n            if (isObject(value) && hasJSON()) {\n                // Stringify any part C properties\n                try {\n                    value = getJSON().stringify(value);\n                } catch (e) {\n                    _throwInternal(logger,eLoggingSeverity.WARNING, _eInternalMessageId.CannotSerializeObjectNonSerializable, \"custom property is not valid\", { exception: e}, true);\n                }\n            }\n            value = dataSanitizeString(logger, value, DataSanitizerValues.MAX_PROPERTY_LENGTH);\n            prop = dataSanitizeKeyAndAddUniqueness(logger, prop, tempProps);\n            tempProps[prop] = value;\n        });\n        properties = tempProps;\n    }\n\n    return properties;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeMeasurements(logger: IDiagnosticLogger, measurements: any) {\n    if (measurements) {\n        const tempMeasurements: any = {};\n        objForEachKey(measurements, (measure, value) => {\n            measure = dataSanitizeKeyAndAddUniqueness(logger, measure, tempMeasurements);\n            tempMeasurements[measure] = value;\n        });\n\n        measurements = tempMeasurements;\n    }\n\n    return measurements;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeId(logger: IDiagnosticLogger, id: string): string {\n    return id ? dataSanitizeInput(logger, id, DataSanitizerValues.MAX_ID_LENGTH, _eInternalMessageId.IdTooLong).toString() : id;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dataSanitizeInput(logger: IDiagnosticLogger, input: any, maxLength: number, _msgId: _eInternalMessageId) {\n    let inputTrunc : String;\n    if (input) {\n        input = strTrim(asString(input));\n        if (input.length > maxLength) {\n            inputTrunc = strSubstring(input, 0, maxLength);\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _msgId,\n                \"input is too long, it has been truncated to \" + maxLength + \" characters.\",\n                { data: input },\n                true);\n        }\n    }\n\n    return inputTrunc || input;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function dsPadNumber(num: number) {\n    const s = \"00\" + num;\n    return strSubstr(s, s.length - 3);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Common/Envelope.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strNotSpecified } from \"../../../constants/Constants\";\nimport { FieldType } from \"../../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../../interfaces/ai/IDiagnosticLogger\";\nimport { IBase } from \"../../../interfaces/ai/contracts/IBase\";\nimport { IEnvelope } from \"../../../interfaces/ai/telemetry/IEnvelope\";\nimport { toISOString } from \"../../../utils/HelperFuncs\";\nimport { dataSanitizeString } from \"./DataSanitizer\";\n\nexport class Envelope implements IEnvelope {\n\n    /**\n     * The data contract for serializing this object.\n     */\n    public aiDataContract: any;\n\n    /**\n     * Envelope version. For internal use only. By assigning this the default, it will not be serialized within the payload unless changed to a value other than #1.\n     */\n    public ver: number; /* 1 */\n\n    /**\n     * Type name of telemetry data item.\n     */\n    public name: string;\n \n    /**\n     * Event date time when telemetry item was created. This is the wall clock time on the client when the event was generated. There is no guarantee that the client's time is accurate. This field must be formatted in UTC ISO 8601 format, with a trailing 'Z' character, as described publicly on https://en.wikipedia.org/wiki/ISO_8601#UTC. Note: the number of decimal seconds digits provided are variable (and unspecified). Consumers should handle this, i.e. managed code consumers should not use format 'O' for parsing as it specifies a fixed length. Example: 2009-06-15T13:45:30.0000000Z.\n     */\n    public time: string;\n \n    /**\n     * Sampling rate used in application. This telemetry item represents 1 / sampleRate actual telemetry items.\n     */\n    public sampleRate: number; /* 100.0 */\n \n    /**\n     * Sequence field used to track absolute order of uploaded events.\n     */\n    public seq: string;\n \n    /**\n     * The application's instrumentation key. The key is typically represented as a GUID, but there are cases when it is not a guid. No code should rely on iKey being a GUID. Instrumentation key is case insensitive.\n     */\n    public iKey: string;\n \n    /**\n     * Key/value collection of context properties. See ContextTagKeys for information on available properties.\n     */\n    public tags: any; /* {} */\n \n    /**\n     * Telemetry data item.\n     */\n    public data: IBase;\n \n    /**\n     * Constructs a new instance of telemetry data.\n     */\n    constructor(logger: IDiagnosticLogger, data: IBase, name: string) {\n        let _self = this;\n        _self.ver = 1;\n        _self.sampleRate = 100.0;\n        _self.tags = {};\n        _self.name = dataSanitizeString(logger, name) || strNotSpecified;\n        _self.data = data;\n        _self.time = toISOString(new Date());\n\n        _self.aiDataContract = {\n            time: FieldType.Required,\n            iKey: FieldType.Required,\n            name: FieldType.Required,\n            sampleRate: () => {\n                return (this.sampleRate === 100) ? FieldType.Hidden : FieldType.Required;\n            },\n            tags: FieldType.Required,\n            data: FieldType.Required\n        };\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/DataTypes.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const EventDataType = \"EventData\";\nexport const ExceptionDataType = \"ExceptionData\";\nexport const MetricDataType = \"MetricData\";\nexport const PageViewDataType = \"PageviewData\";\nexport const PageViewPerformanceDataType = \"PageviewPerformanceData\";\nexport const RemoteDependencyDataType = \"RemoteDependencyData\";\nexport const RequestDataType = \"RequestData\";\nexport const TraceDataType = \"MessageData\";\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/EnvelopeTypes.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* #__NO_SIDE_EFFECTS__# */\nfunction _AddPrefix(name: string) {\n    return \"Microsoft.ApplicationInsights.{0}.\" + name;\n}\n\nexport const EventEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"Event\"));\nexport const ExceptionEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"Exception\"));\nexport const MetricEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"Metric\"));\nexport const PageViewEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"Pageview\"));\nexport const PageViewPerformanceEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"PageviewPerformance\"));\nexport const RemoteDependencyEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"RemoteDependency\"));\nexport const RequestEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"Request\"));\nexport const TraceEnvelopeType = (/*#__PURE__*/ _AddPrefix(\"Message\"));"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Event.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strNotSpecified } from \"../../constants/Constants\";\nimport { FieldType } from \"../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../interfaces/ai/IDiagnosticLogger\";\nimport { IEventData } from \"../../interfaces/ai/contracts/IEventData\";\nimport { ISerializable } from \"../../interfaces/ai/telemetry/ISerializable\";\nimport { dataSanitizeMeasurements, dataSanitizeProperties, dataSanitizeString } from \"./Common/DataSanitizer\";\nimport { EventDataType } from \"./DataTypes\";\nimport { EventEnvelopeType } from \"./EnvelopeTypes\";\n\nexport class Event implements IEventData, ISerializable {\n    /**\n     * @deprecated Use the constant EventEnvelopeType instead.\n     */\n    public static envelopeType = EventEnvelopeType;\n\n    /**\n     * @deprecated Use the constant EventDataType instead.\n     */\n    public static dataType = EventDataType;\n\n    public aiDataContract = {\n        ver: FieldType.Required,\n        name: FieldType.Required,\n        properties: FieldType.Default,\n        measurements: FieldType.Default\n    };\n\n    /**\n     * Schema version\n     */\n    public ver: number; /* 2 */\n\n    /**\n     * Event name. Keep it low cardinality to allow proper grouping and useful metrics.\n     */\n    public name: string;\n\n    /**\n     * Collection of custom properties.\n     */\n    public properties: any; /* {} */\n\n    /**\n     * Collection of custom measurements.\n     */\n    public measurements: any; /* {} */\n\n    /**\n     * Constructs a new instance of the EventTelemetry object\n     */\n    constructor(logger: IDiagnosticLogger, name: string, properties?: any, measurements?: any) {\n        let _self = this;\n        _self.ver = 2;\n        _self.name = dataSanitizeString(logger, name) || strNotSpecified;\n        _self.properties = dataSanitizeProperties(logger, properties);\n        _self.measurements = dataSanitizeMeasurements(logger, measurements);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Exception.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    arrForEach, arrMap, asString, getWindow, isArray, isError, isFunction, isNullOrUndefined, isObject, isString, objFreeze, strIndexOf,\n    strTrim\n} from \"@nevware21/ts-utils\";\nimport { strNotSpecified } from \"../../constants/Constants\";\nimport { FieldType } from \"../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../interfaces/ai/IDiagnosticLogger\";\nimport {\n    IAutoExceptionTelemetry, IExceptionDetailsInternal, IExceptionInternal, IStackDetails\n} from \"../../interfaces/ai/IExceptionTelemetry\";\nimport { IExceptionData } from \"../../interfaces/ai/contracts/IExceptionData\";\nimport { IExceptionDetails } from \"../../interfaces/ai/contracts/IExceptionDetails\";\nimport { IStackFrame } from \"../../interfaces/ai/contracts/IStackFrame\";\nimport { SeverityLevel } from \"../../interfaces/ai/contracts/SeverityLevel\";\nimport { ISerializable } from \"../../interfaces/ai/telemetry/ISerializable\";\nimport {\n    dataSanitizeException, dataSanitizeMeasurements, dataSanitizeMessage, dataSanitizeProperties, dataSanitizeString\n} from \"./Common/DataSanitizer\";\nimport { ExceptionDataType } from \"./DataTypes\";\nimport { ExceptionEnvelopeType } from \"./EnvelopeTypes\";\n\n// These Regex covers the following patterns\n// 1. Chrome/Firefox/IE/Edge:\n//    at functionName (filename:lineNumber:columnNumber)\n//    at functionName (filename:lineNumber)\n//    at filename:lineNumber:columnNumber\n//    at filename:lineNumber\n//    at functionName@filename:lineNumber:columnNumber\n// 2. Safari / Opera:\n//    functionName@filename:lineNumber:columnNumber\n//    functionName@filename:lineNumber\n//    filename:lineNumber:columnNumber\n//    filename:lineNumber\n//    Line ## of scriptname script filename:lineNumber:columnNumber\n//    Line ## of scriptname script filename\n// 3. IE/Edge (Additional formats)\n//    at functionName@filename:lineNumber\n\nconst STACKFRAME_BASE_SIZE = 58; // '{\"method\":\"\",\"level\":,\"assembly\":\"\",\"fileName\":\"\",\"line\":}'.length\n\n/**\n * Check if the string conforms to what looks like a stack frame line and not just a general message\n * comment or other non-stack related info.\n *\n * This  should be used to filter out any leading \"message\" lines from a stack trace, before attempting to parse\n * the individual stack frames. Once you have estabilsted the start of the stack frames you can then use the\n * FULL_STACK_FRAME_1, FULL_STACK_FRAME_2, FULL_STACK_FRAME_3, and EXTRACT_FILENAME to parse the individual\n * stack frames to extract the method, filename, line number, and column number.\n * These may still provide invalid matches, so the sequence of execution is important to avoid providing\n * an invalid parsed stack.\n */\nconst IS_FRAME = /^\\s{0,50}(from\\s|at\\s|Line\\s{1,5}\\d{1,10}\\s{1,5}of|\\w{1,50}@\\w{1,80}|[^\\(\\s\\n]+:[0-9\\?]+(?::[0-9\\?]+)?)/;\n\n/**\n * Parse a well formed stack frame with both the line and column numbers\n * ----------------------------------\n * **Primary focus of the matching**\n * - at functionName (filename:lineNumber:columnNumber)\n * - at filename:lineNumber:columnNumber\n * - at functionName@filename:lineNumber:columnNumber\n * - functionName (filename:lineNumber:columnNumber)\n * - filename:lineNumber:columnNumber\n * - functionName@filename:lineNumber:columnNumber\n */\nconst FULL_STACK_FRAME_1 = /^(?:\\s{0,50}at)?\\s{0,50}([^\\@\\()\\s]+)?\\s{0,50}(?:\\s|\\@|\\()\\s{0,5}([^\\(\\s\\n\\]]+):([0-9\\?]+):([0-9\\?]+)\\)?$/;\n\n/**\n * Parse a well formed stack frame with only a line number.\n * ----------------------------------\n * > Note: this WILL also match with line and column number, but the line number is included with the filename\n * > you should attempt to match with FULL_STACK_FRAME_1 first.\n *\n * **Primary focus of the matching (run FULL_STACK_FRAME_1 first)**\n * - at functionName (filename:lineNumber)\n * - at filename:lineNumber\n * - at functionName@filename:lineNumber\n * - functionName (filename:lineNumber)\n * - filename:lineNumber\n * - functionName@filename:lineNumber\n *\n * **Secondary matches**\n * - at functionName (filename:lineNumber:columnNumber)\n * - at filename:lineNumber:columnNumber\n * - at functionName@filename:lineNumber:columnNumber\n * - functionName (filename:lineNumber:columnNumber)\n * - filename:lineNumber:columnNumber\n * - functionName@filename:lineNumber:columnNumber\n */\nconst FULL_STACK_FRAME_2 = /^(?:\\s{0,50}at)?\\s{0,50}([^\\@\\()\\s]+)?\\s{0,50}(?:\\s|\\@|\\()\\s{0,5}([^\\(\\s\\n\\]]+):([0-9\\?]+)\\)?$/;\n\n/**\n * Attempt to Parse a frame that doesn't include a line or column number.\n * ----------------------------------\n * > Note: this WILL also match lines with a line or line and column number, you should attempt to match with\n * both FULL_STACK_FRAME_1 and FULL_STACK_FRAME_2 first to avoid false positives.\n *\n * **Unexpected Invalid Matches** (Matches that should be avoided -- by using the FULL_STACK_FRAME_1 and FULL_STACK_FRAME_2 first)\n * - at https://localhost:44365/static/node_bundles/@microsoft/blah/js/bundle.js:144112:27\n * - at https://localhost:44365/static/node_bundles/@microsoft/blah/js/bundle.js:144112:27\n *\n * **Primary focus of the matching (run FULL_STACK_FRAME_1 first)**\n * - at functionName@filename\n * - at functionName (filename)\n * - at functionName filename\n * - at filename  <- Will actuall match this as the \"method\" and not the filename (care should be taken to avoid this)\n * - functionName@filename\n * - functionName (filename)\n * - functionName filename\n * - functionName\n *\n * **Secondary matches** (The line and column numbers will be included with the matched filename)\n * - at functionName (filename:lineNumber:columnNumber)\n * - at functionName (filename:lineNumber)\n * - at filename:lineNumber:columnNumber\n * - at filename:lineNumber\n * - at functionName@filename:lineNumber:columnNumber\n * - at functionName@filename:lineNumber\n * - functionName (filename:lineNumber:columnNumber)\n * - functionName (filename:lineNumber)\n * - filename:lineNumber:columnNumber\n * - filename:lineNumber\n * - functionName@filename:lineNumber:columnNumber\n * - functionName@filename:lineNumber\n  */\nconst FULL_STACK_FRAME_3 = /^(?:\\s{0,50}at)?\\s{0,50}([^\\@\\()\\s]+)?\\s{0,50}(?:\\s|\\@|\\()\\s{0,5}([^\\(\\s\\n\\)\\]]+)\\)?$/;\n\n/**\n * Attempt to extract the filename (with or without line and column numbers) from a string.\n * ----------------------------------\n * > Note: this will only match the filename (with any line or column numbers) and will\n * > return what looks like the filename, however, it will also match random strings that\n * > look like a filename, so care should be taken to ensure that the filename is actually\n * > a filename before using it.\n * >\n * > It is recommended to use this in conjunction with the FULL_STACK_FRAME_1, FULL_STACK_FRAME_2, and FULL_STACK_FRAME_3\n * > to ensure first to reduce false matches, if all of these fail then you can use this to extract the filename from a random\n * > strings to identify any potential filename from a known stack frame line.\n *\n * **Known Invalid matching**\n *\n * This regex will basically match any \"final\" string of a line or one that is trailed by a comma, so this should not\n * be used as the \"only\" matching regex, but rather as a final fallback to extract the filename from a string.\n * If you are certain that the string line is a stack frame and not part of the exception message (lines before the stack)\n * or trailing comments, then you can use this to extract the filename and then further parse with PARSE_FILENAME_LINE_COL\n * and PARSE_FILENAME_LINE_ONLY to extract any potential the line and column numbers.\n *\n * **Primary focus of the matching**\n * - at (anonymous) @ VM60:1\n * - Line 21 of linked script file://localhost/C:/Temp/stacktrace.js\n * - Line 11 of inline#1 script in http://localhost:3000/static/js/main.206f4846.js:2:296748\n * - Line 68 of inline#2 script in file://localhost/teststack.html\n * - at Global code (http://example.com/stacktrace.js:11:1)\n */\nconst EXTRACT_FILENAME = /(?:^|\\(|\\s{0,10}[\\w\\)]+\\@)?([^\\(\\n\\s\\]\\)]+)(?:\\:([0-9]+)(?:\\:([0-9]+))?)?\\)?(?:,|$)/;\n\n/**\n * Attempt to extract the filename, line number, and column number from a string.\n */\nconst PARSE_FILENAME_LINE_COL = /([^\\(\\s\\n]+):([0-9]+):([0-9]+)$/;\n\n/**\n * Attempt to extract the filename and line number from a string.\n */\nconst PARSE_FILENAME_LINE_ONLY = /([^\\(\\s\\n]+):([0-9]+)$/;\n\nconst NoMethod = \"<no_method>\";\nconst strError = \"error\";\nconst strStack = \"stack\";\nconst strStackDetails = \"stackDetails\";\nconst strErrorSrc = \"errorSrc\";\nconst strMessage = \"message\";\nconst strDescription = \"description\";\n\ninterface _ParseSequence {\n    /**\n     * The regular expression to match the frame\n     */\n    re: RegExp;\n\n    /**\n     * The expected number of matches in the regex, if this number is detected it will be considered a match\n     */\n    len: number;\n\n    /**\n     * The index into the matches to be used as the method name\n     */\n    m?: number;\n\n    /**\n     * The index into the matches to be used as the filename\n     */\n    fn: number;\n\n    /**\n     * The index into the matches to be used as the line number\n     */\n    ln?: number;\n\n    /**\n     * The index into the matches to be used as the column number\n     */\n    col?: number;\n    \n    /**\n     * A function to pre-process the frame before it is parsed, this is persistent and any changes\n     * will affect all subsequent frames\n     * @param frame\n     * @returns\n     */\n    pre?: (frame: string) => string;\n    \n    /**\n     * A Check function to determine if the frame should be processed or dropped\n     * @param frame\n     * @returns\n     */\n    chk?: (frame: string) => boolean;\n\n    /**\n     * Convert / Handle the matching frame\n     * @param frame - The frame to be processed\n     * @param matches - The matches from the regex\n     * @returns\n     */\n    hdl?: (frame: IStackFrame, parseSequence: _ParseSequence, matches: RegExpMatchArray) => void;\n}\n\nconst _parseSequence: _ParseSequence[] = [\n    { re: FULL_STACK_FRAME_1, len: 5, m: 1, fn: 2, ln: 3, col: 4 },\n    { chk: _ignoreNative, pre: _scrubAnonymous, re: FULL_STACK_FRAME_2, len: 4, m: 1, fn: 2, ln: 3 },\n    { re: FULL_STACK_FRAME_3, len: 3, m: 1, fn: 2, hdl: _handleFilename },\n    { re: EXTRACT_FILENAME, len: 2, fn: 1, hdl: _handleFilename }\n];\n\nfunction _scrubAnonymous(frame: string) {\n    return frame.replace(/(\\(anonymous\\))/, \"<anonymous>\");\n}\n\nfunction _ignoreNative(frame: string) {\n    return strIndexOf(frame, \"[native\") < 0;\n}\n\nfunction _stringify(value: any, convertToString: boolean) {\n    let result = value;\n    if (result && !isString(result)) {\n        if (JSON && JSON.stringify) {\n            result = JSON.stringify(value);\n            if (convertToString && (!result || result === \"{}\")) {\n                if (isFunction(value.toString)) {\n                    result = value.toString();\n                } else {\n                    result = \"\" + value;\n                }\n            }\n        } else {\n            result = \"\" + value + \" - (Missing JSON.stringify)\";\n        }\n    }\n\n    return result || \"\";\n}\n\nfunction _formatMessage(theEvent: any, errorType: string) {\n    let evtMessage = theEvent;\n    if (theEvent) {\n        if (evtMessage && !isString(evtMessage)) {\n            evtMessage = theEvent[strMessage] || theEvent[strDescription] || evtMessage;\n        }\n\n        // Make sure the message is a string\n        if (evtMessage && !isString(evtMessage)) {\n            // tslint:disable-next-line: prefer-conditional-expression\n            evtMessage = _stringify(evtMessage, true);\n        }\n\n        if (theEvent[\"filename\"]) {\n            // Looks like an event object with filename\n            evtMessage = evtMessage + \" @\" + (theEvent[\"filename\"] || \"\") + \":\" + (theEvent[\"lineno\"] || \"?\") + \":\" + (theEvent[\"colno\"] || \"?\");\n        }\n    }\n    \n    // Automatically add the error type to the message if it does already appear to be present\n    if (errorType && errorType !== \"String\" && errorType !== \"Object\" && errorType !== \"Error\" && strIndexOf(evtMessage || \"\", errorType) === -1) {\n        evtMessage = errorType + \": \" + evtMessage;\n    }\n\n    return evtMessage || \"\";\n}\n\nfunction _isExceptionDetailsInternal(value:any): value is IExceptionDetailsInternal {\n    try {\n        if (isObject(value)) {\n            return \"hasFullStack\" in value && \"typeName\" in value;\n        }\n    } catch (e) {\n        // This can happen with some native browser objects, but should not happen for the type we are checking for\n    }\n\n    return false;\n}\n\nfunction _isExceptionInternal(value:any): value is IExceptionInternal {\n    try {\n        if (isObject(value)) {\n            return (\"ver\" in value && \"exceptions\" in value && \"properties\" in value);\n        }\n    } catch (e) {\n        // This can happen with some native browser objects, but should not happen for the type we are checking for\n    }\n\n    return false;\n}\n\nfunction _isStackDetails(details:any): details is IStackDetails {\n    return details && details.src && isString(details.src) && details.obj && isArray(details.obj);\n}\n\nfunction _convertStackObj(errorStack:string): IStackDetails {\n    let src = errorStack || \"\";\n    if (!isString(src)) {\n        if (isString(src[strStack])) {\n            src = src[strStack];\n        } else {\n            src = \"\" + src;\n        }\n    }\n\n    let items = src.split(\"\\n\");\n    return {\n        src,\n        obj: items\n    };\n}\n\nfunction _getOperaStack(errorMessage:string): IStackDetails {\n    var stack: string[] = [];\n    var lines = errorMessage.split(\"\\n\");\n    for (var lp = 0; lp < lines.length; lp++) {\n        var entry = lines[lp];\n        if (lines[lp + 1]) {\n            entry += \"@\" + lines[lp + 1];\n            lp++;\n        }\n\n        stack.push(entry);\n    }\n\n    return {\n        src: errorMessage,\n        obj: stack\n    };\n}\n\nfunction _getStackFromErrorObj(errorObj:any): IStackDetails {\n    let details = null;\n    if (errorObj) {\n        try {\n            /* Using bracket notation is support older browsers (IE 7/8 -- dont remember the version) that throw when using dot\n            notation for undefined objects and we don't want to loose the error from being reported */\n            if (errorObj[strStack]) {\n                // Chrome/Firefox\n                details = _convertStackObj(errorObj[strStack]);\n            } else if (errorObj[strError] && errorObj[strError][strStack]) {\n                // Edge error event provides the stack and error object\n                details = _convertStackObj(errorObj[strError][strStack]);\n            } else if (errorObj[\"exception\"] && errorObj.exception[strStack]) {\n                details = _convertStackObj(errorObj.exception[strStack]);\n            } else if (_isStackDetails(errorObj)) {\n                details = errorObj;\n            } else if (_isStackDetails(errorObj[strStackDetails])) {\n                details = errorObj[strStackDetails];\n            } else if (getWindow() && (getWindow() as any)[\"opera\"] && errorObj[strMessage]) {\n                // Opera\n                details = _getOperaStack(errorObj.message);\n            } else if (errorObj[\"reason\"] && errorObj.reason[strStack]) {\n                // UnhandledPromiseRejection\n                details = _convertStackObj(errorObj.reason[strStack]);\n            } else if (isString(errorObj)) {\n                details = _convertStackObj(errorObj);\n            } else {\n                let evtMessage = errorObj[strMessage] || errorObj[strDescription] || \"\";\n\n                if (isString(errorObj[strErrorSrc])) {\n                    if (evtMessage) {\n                        evtMessage += \"\\n\";\n                    }\n\n                    evtMessage += \" from \" + errorObj[strErrorSrc];\n                }\n\n                if (evtMessage) {\n                    details = _convertStackObj(evtMessage);\n                }\n            }\n        } catch (e) {\n            // something unexpected happened so to avoid failing to report any error lets swallow the exception\n            // and fallback to the callee/caller method\n            details = _convertStackObj(e);\n        }\n    }\n\n    return details || {\n        src: \"\",\n        obj: null\n    };\n}\n\nfunction _formatStackTrace(stackDetails: IStackDetails) {\n    let stack = \"\";\n\n    if (stackDetails) {\n        if (stackDetails.obj) {\n            stack = stackDetails.obj.join(\"\\n\");\n        } else {\n            stack = stackDetails.src || \"\";\n        }\n    \n    }\n\n    return stack;\n}\n\nfunction _parseStack(stack:IStackDetails): _IParsedStackFrame[] {\n    let parsedStack: _IParsedStackFrame[];\n    let frames = stack.obj;\n    if (frames && frames.length > 0) {\n        parsedStack = [];\n        let level = 0;\n\n        let foundStackStart = false;\n        let totalSizeInBytes = 0;\n        arrForEach(frames, (frame) => {\n            if (foundStackStart || _isStackFrame(frame)) {\n                let theFrame = asString(frame);\n\n                // Once we have found the first stack frame we treat the rest of the lines as part of the stack\n                foundStackStart = true;\n                let parsedFrame: _IParsedStackFrame = _extractStackFrame(theFrame, level);\n                if (parsedFrame) {\n                    totalSizeInBytes += parsedFrame.sizeInBytes;\n                    parsedStack.push(parsedFrame);\n                    level++;\n                }\n            }\n        });\n\n        // DP Constraint - exception parsed stack must be < 32KB\n        // remove frames from the middle to meet the threshold\n        const exceptionParsedStackThreshold = 32 * 1024;\n        if (totalSizeInBytes > exceptionParsedStackThreshold) {\n            let left = 0;\n            let right = parsedStack.length - 1;\n            let size = 0;\n            let acceptedLeft = left;\n            let acceptedRight = right;\n\n            while (left < right) {\n                // check size\n                const lSize = parsedStack[left].sizeInBytes;\n                const rSize = parsedStack[right].sizeInBytes;\n                size += lSize + rSize;\n\n                if (size > exceptionParsedStackThreshold) {\n\n                    // remove extra frames from the middle\n                    const howMany = acceptedRight - acceptedLeft + 1;\n                    parsedStack.splice(acceptedLeft, howMany);\n                    break;\n                }\n\n                // update pointers\n                acceptedLeft = left;\n                acceptedRight = right;\n\n                left++;\n                right--;\n            }\n        }\n    }\n\n    return parsedStack;\n}\n\nfunction _getErrorType(errorType: any) {\n    // Gets the Error Type by passing the constructor (used to get the true type of native error object).\n    let typeName = \"\";\n    if (errorType) {\n        typeName = errorType.typeName || errorType.name || \"\";\n        if (!typeName) {\n            try {\n                var funcNameRegex = /function (.{1,200})\\(/;\n                var results = (funcNameRegex).exec((errorType).constructor.toString());\n                typeName = (results && results.length > 1) ? results[1] : \"\";\n            } catch (e) {\n                // eslint-disable-next-line no-empty -- Ignoring any failures as nothing we can do\n            }\n        }\n    }\n\n    return typeName;\n}\n\n/**\n * Formats the provided errorObj for display and reporting, it may be a String, Object, integer or undefined depending on the browser.\n * @param errorObj - The supplied errorObj\n */\nexport function _formatErrorCode(errorObj:any) {\n    if (errorObj) {\n        try {\n            if (!isString(errorObj)) {\n                var errorType = _getErrorType(errorObj);\n                var result = _stringify(errorObj, false);\n                if (!result || result === \"{}\") {\n                    if (errorObj[strError]) {\n                        // Looks like an MS Error Event\n                        errorObj = errorObj[strError];\n                        errorType = _getErrorType(errorObj);\n                    }\n\n                    result = _stringify(errorObj, true);\n                }\n\n                if (strIndexOf(result, errorType) !== 0 && errorType !== \"String\") {\n                    return errorType + \":\" + result;\n                }\n\n                return result;\n            }\n        } catch (e) {\n            // eslint-disable-next-line no-empty -- Ignoring any failures as nothing we can do\n        }\n    }\n\n    // Fallback to just letting the object format itself into a string\n    return \"\" + (errorObj || \"\");\n}\n\nexport class Exception implements IExceptionData, ISerializable {\n    /**\n     * @deprecated Use the constant ExceptionEnvelopeType instead.\n     */\n    public static envelopeType = ExceptionEnvelopeType;\n\n    /**\n     * @deprecated Use the constant ExceptionDataType instead.\n     */\n    public static dataType = ExceptionDataType;\n\n    public id?: string;\n    public problemGroup?: string;\n    public isManual?: boolean;\n\n    public aiDataContract = {\n        ver: FieldType.Required,\n        exceptions: FieldType.Required,\n        severityLevel: FieldType.Default,\n        properties: FieldType.Default,\n        measurements: FieldType.Default\n    }\n\n    /**\n     * Schema version\n     */\n    public ver: number; /* 2 */\n\n    /**\n     * Exception chain - list of inner exceptions.\n     */\n    public exceptions: IExceptionDetails[]; /* [] */\n \n    /**\n     * Severity level. Mostly used to indicate exception severity level when it is reported by logging library.\n     */\n    public severityLevel: SeverityLevel;\n \n    /**\n     * Collection of custom properties.\n     */\n    public properties: any;\n \n    /**\n     * Collection of custom measurements.\n     */\n    public measurements: any;\n \n    /**\n     * Constructs a new instance of the ExceptionTelemetry object\n     */\n    constructor(logger: IDiagnosticLogger, exception: Error | IExceptionInternal | IAutoExceptionTelemetry, properties?: {[key: string]: any}, measurements?: {[key: string]: number}, severityLevel?: SeverityLevel, id?: string) {\n        let _self = this;\n        _self.ver = 2; // TODO: handle the CS\"4.0\" ==> breeze 2 conversion in a better way\n        if (!_isExceptionInternal(exception)) {\n            if (!properties) {\n                properties = { };\n            }\n            if (id){\n                properties.id = id;\n            }\n            \n            _self.exceptions = [_createExceptionDetails(logger, exception, properties)];\n            _self.properties = dataSanitizeProperties(logger, properties);\n            _self.measurements = dataSanitizeMeasurements(logger, measurements);\n            if (severityLevel) {\n                _self.severityLevel = severityLevel;\n            }\n            if (id) {\n                _self.id = id;\n            }\n        } else {\n            _self.exceptions = exception.exceptions || [];\n            _self.properties = exception.properties;\n            _self.measurements = exception.measurements;\n            if (exception.severityLevel) {\n                _self.severityLevel = exception.severityLevel;\n            }\n            if (exception.id) {\n                _self.id = exception.id;\n                exception.properties.id = exception.id;\n            }\n            if (exception.problemGroup) {\n                _self.problemGroup = exception.problemGroup;\n            }\n\n            // bool/int types, use isNullOrUndefined\n            if (!isNullOrUndefined(exception.isManual)) {\n                _self.isManual = exception.isManual;\n            }\n        }\n    }\n\n    public static CreateAutoException(\n        message: string | Event,\n        url: string,\n        lineNumber: number,\n        columnNumber: number,\n        error: any,\n        evt?: Event|string,\n        stack?: string,\n        errorSrc?: string\n    ): IAutoExceptionTelemetry {\n\n        let errorType = _getErrorType(error || evt || message);\n\n        return {\n            message: _formatMessage(message, errorType),\n            url,\n            lineNumber,\n            columnNumber,\n            error: _formatErrorCode(error || evt || message),\n            evt: _formatErrorCode(evt || message),\n            typeName: errorType,\n            stackDetails: _getStackFromErrorObj(stack || error || evt),\n            errorSrc\n        }\n    }\n\n    public static CreateFromInterface(logger: IDiagnosticLogger, exception: IExceptionInternal, properties?: any, measurements?: { [key: string]: number }): Exception {\n        const exceptions: _IExceptionDetails[] = exception.exceptions\n            && arrMap(exception.exceptions, (ex: IExceptionDetailsInternal) => _createExDetailsFromInterface(logger, ex));\n        const exceptionData = new Exception(logger, {...exception, exceptions}, properties, measurements);\n        return exceptionData;\n    }\n\n    public toInterface(): IExceptionInternal {\n        const { exceptions, properties, measurements, severityLevel, problemGroup, id, isManual } = this;\n\n        const exceptionDetailsInterface = exceptions instanceof Array\n            && arrMap(exceptions, (exception: _IExceptionDetails) => exception.toInterface())\n            || undefined;\n\n        return {\n            ver: \"4.0\", // TODO: handle the CS\"4.0\" ==> breeze 2 conversion in a better way\n            exceptions: exceptionDetailsInterface,\n            severityLevel,\n            properties,\n            measurements,\n            problemGroup,\n            id,\n            isManual\n        } as IExceptionInternal;\n    }\n\n    /**\n     * Creates a simple exception with 1 stack frame. Useful for manual constracting of exception.\n     */\n    public static CreateSimpleException(message: string, typeName: string, assembly: string, fileName: string,\n        details: string, line: number): Exception {\n\n        return {\n            exceptions: [\n                {\n                    hasFullStack: true,\n                    message,\n                    stack: details,\n                    typeName\n                } as IExceptionDetails\n            ]\n        } as Exception;\n    }\n\n    public static formatError = _formatErrorCode;\n}\n\nconst exDetailsAiDataContract = (/*#__PURE__*/ objFreeze({\n    id: FieldType.Default,\n    outerId: FieldType.Default,\n    typeName: FieldType.Required,\n    message: FieldType.Required,\n    hasFullStack: FieldType.Default,\n    stack: FieldType.Default,\n    parsedStack: FieldType.Array\n}));\n\ninterface _IExceptionDetails extends IExceptionDetails, ISerializable {\n    toInterface: () => IExceptionDetailsInternal;\n}\n\nfunction _toInterface() {\n    let _self = this;\n    const parsedStack = isArray(_self.parsedStack)\n        && arrMap(_self.parsedStack, (frame: _IParsedStackFrame) => _parsedFrameToInterface(frame));\n\n    const exceptionDetailsInterface: IExceptionDetailsInternal = {\n        id: _self.id,\n        outerId: _self.outerId,\n        typeName: _self.typeName,\n        message: _self.message,\n        hasFullStack: _self.hasFullStack,\n        stack: _self[strStack],\n        parsedStack: parsedStack || undefined\n    };\n\n    return exceptionDetailsInterface;\n}\n\nexport function _createExceptionDetails(logger: IDiagnosticLogger, exception: Error | IExceptionDetailsInternal | IAutoExceptionTelemetry, properties?: {[key: string]: any}): _IExceptionDetails {\n\n    let id: number;\n    let outerId: number;\n    let typeName: string;\n    let message: string;\n    let hasFullStack: boolean;\n    let theStack: string;\n    let parsedStack: IStackFrame[];\n\n    if (!_isExceptionDetailsInternal(exception)) {\n        let error = exception as any;\n        let evt = error && error.evt;\n        if (!isError(error)) {\n            error = error[strError] || evt || error;\n        }\n\n        typeName = dataSanitizeString(logger, _getErrorType(error)) || strNotSpecified;\n        message = dataSanitizeMessage(logger, _formatMessage(exception || error, typeName)) || strNotSpecified;\n        const stack = (exception as any)[strStackDetails] || _getStackFromErrorObj(exception);\n        parsedStack = _parseStack(stack);\n\n        // after parsedStack is inited, iterate over each frame object, sanitize its assembly field\n        if (isArray(parsedStack)){\n            arrMap(parsedStack, (frame: IStackFrame) => {\n                frame.assembly = dataSanitizeString(logger, frame.assembly);\n                frame.fileName = dataSanitizeString(logger, frame.fileName);\n            });\n        }\n      \n        theStack = dataSanitizeException(logger, _formatStackTrace(stack));\n        hasFullStack = isArray(parsedStack) && parsedStack.length > 0;\n\n        if (properties) {\n            properties.typeName = properties.typeName || typeName;\n        }\n    } else {\n        typeName = exception.typeName;\n        message = exception.message;\n        theStack = exception[strStack];\n        parsedStack = exception.parsedStack || [];\n        hasFullStack = exception.hasFullStack;\n    }\n\n    return {\n        aiDataContract: exDetailsAiDataContract,\n        id: id,\n        outerId: outerId,\n        typeName: typeName,\n        message: message,\n        hasFullStack: hasFullStack,\n        stack: theStack,\n        parsedStack: parsedStack,\n        toInterface: _toInterface\n    };\n}\n\nexport function _createExDetailsFromInterface(logger:IDiagnosticLogger, exception: IExceptionDetailsInternal): _IExceptionDetails {\n    const parsedStack = (isArray(exception.parsedStack)\n        && arrMap(exception.parsedStack, frame => _stackFrameFromInterface(frame)))\n        || exception.parsedStack;\n\n    const exceptionDetails = _createExceptionDetails(logger, {...exception, parsedStack});\n\n    return exceptionDetails;\n}\n\nfunction _parseFilename(theFrame: IStackFrame, fileName: string) {\n    const lineCol = fileName.match(PARSE_FILENAME_LINE_COL);\n    if (lineCol && lineCol.length >= 4) {\n        theFrame.fileName = lineCol[1];\n        theFrame.line = parseInt(lineCol[2]);\n    } else {\n        const lineNo = fileName.match(PARSE_FILENAME_LINE_ONLY);\n        if (lineNo && lineNo.length >= 3) {\n            theFrame.fileName = lineNo[1];\n            theFrame.line = parseInt(lineNo[2]);\n        } else {\n            theFrame.fileName = fileName;\n        }\n    }\n}\n\nfunction _handleFilename(theFrame: IStackFrame, sequence: _ParseSequence, matches: RegExpMatchArray) {\n    let filename = theFrame.fileName;\n    \n    if (sequence.fn && matches && matches.length > sequence.fn) {\n        if (sequence.ln && matches.length > sequence.ln) {\n            filename = strTrim(matches[sequence.fn] || \"\");\n            theFrame.line = parseInt(strTrim(matches[sequence.ln] || \"\")) || 0;\n        } else {\n            filename = strTrim(matches[sequence.fn] || \"\");\n        }\n    }\n\n    if (filename) {\n        _parseFilename(theFrame, filename);\n    }\n}\n\nfunction _isStackFrame(frame: string) {\n    let result = false;\n    if (frame && isString(frame)) {\n        let trimmedFrame = strTrim(frame);\n        if (trimmedFrame) {\n            result = IS_FRAME.test(trimmedFrame);\n        }\n    }\n\n    return result;\n}\n\nexport interface _IParsedStackFrame extends IStackFrame, ISerializable {\n    sizeInBytes: number;\n}\n\nconst stackFrameAiDataContract = (/*#__PURE__*/ objFreeze({\n    level: FieldType.Required,\n    method: FieldType.Required,\n    assembly: FieldType.Default,\n    fileName: FieldType.Default,\n    line: FieldType.Default\n}));\n\nexport function _extractStackFrame(frame: string, level: number): _IParsedStackFrame | undefined {\n    let theFrame: _IParsedStackFrame;\n\n    if (frame && isString(frame) && strTrim(frame)) {\n        theFrame = {\n            aiDataContract: stackFrameAiDataContract,\n            level: level,\n            assembly: strTrim(frame),\n            method: NoMethod,\n            fileName: \"\",\n            line: 0,\n            sizeInBytes: 0\n        };\n\n        let idx = 0;\n        while(idx < _parseSequence.length) {\n            let sequence = _parseSequence[idx];\n            if (sequence.chk && !sequence.chk(frame)) {\n                break;\n            }\n            if (sequence.pre) {\n                frame = sequence.pre(frame);\n            }\n\n            // Attempt to \"parse\" the stack frame\n            const matches = frame.match(sequence.re);\n            if (matches && matches.length >= sequence.len) {\n                if (sequence.m) {\n                    theFrame.method = strTrim(matches[sequence.m] || NoMethod);\n                }\n\n                if (sequence.hdl) {\n                    // Run any custom handler\n                    sequence.hdl(theFrame, sequence, matches);\n                } else if (sequence.fn) {\n                    if (sequence.ln) {\n                        theFrame.fileName = strTrim(matches[sequence.fn] || \"\");\n                        theFrame.line = parseInt(strTrim(matches[sequence.ln] || \"\")) || 0;\n                    } else {\n                        _parseFilename(theFrame, matches[sequence.fn] || \"\");\n                    }\n                }\n\n                // We found a match so stop looking\n                break;\n            }\n            idx++;\n        }\n    }\n\n    return _populateFrameSizeInBytes(theFrame);\n}\n\nfunction _stackFrameFromInterface(frame: IStackFrame): _IParsedStackFrame {\n    let parsedFrame: _IParsedStackFrame = {\n        aiDataContract: stackFrameAiDataContract,\n        level: frame.level,\n        method: frame.method,\n        assembly: frame.assembly,\n        fileName: frame.fileName,\n        line: frame.line,\n        sizeInBytes: 0\n    };\n\n    return _populateFrameSizeInBytes(parsedFrame);\n}\n\nfunction _populateFrameSizeInBytes(frame: _IParsedStackFrame): _IParsedStackFrame {\n    let sizeInBytes = STACKFRAME_BASE_SIZE;\n    if (frame) {\n        sizeInBytes += frame.method.length;\n        sizeInBytes += frame.assembly.length;\n        sizeInBytes += frame.fileName.length;\n        sizeInBytes += frame.level.toString().length;\n        sizeInBytes += frame.line.toString().length;\n\n        frame.sizeInBytes = sizeInBytes;\n    }\n\n    return frame;\n}\n\nexport function _parsedFrameToInterface(frame: _IParsedStackFrame): IStackFrame {\n    return {\n        level: frame.level,\n        method: frame.method,\n        assembly: frame.assembly,\n        fileName: frame.fileName,\n        line: frame.line\n    };\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Metric.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strNotSpecified } from \"../../constants/Constants\";\nimport { FieldType } from \"../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../interfaces/ai/IDiagnosticLogger\";\nimport { IMetricData } from \"../../interfaces/ai/contracts/IMetricData\";\nimport { ISerializable } from \"../../interfaces/ai/telemetry/ISerializable\";\nimport { DataPoint } from \"./Common/DataPoint\";\nimport { dataSanitizeMeasurements, dataSanitizeProperties, dataSanitizeString } from \"./Common/DataSanitizer\";\nimport { MetricDataType } from \"./DataTypes\";\nimport { MetricEnvelopeType } from \"./EnvelopeTypes\";\n\nexport class Metric implements IMetricData, ISerializable {\n    /**\n     * @deprecated Use the constant MetricEnvelopeType instead.\n     */\n    public static envelopeType = MetricEnvelopeType;\n\n    /**\n     * @deprecated Use the constant MetricDataType instead.\n     */\n    public static dataType = MetricDataType;\n\n    public aiDataContract = {\n        ver: FieldType.Required,\n        metrics: FieldType.Required,\n        properties: FieldType.Default\n    }\n\n    /**\n     * Schema version\n     */\n    public ver: number; /* 2 */\n\n    /**\n     * List of metrics. Only one metric in the list is currently supported by Application Insights storage. If multiple data points were sent only the first one will be used.\n     */\n    public metrics: DataPoint[]; /* [] */\n \n    /**\n     * Collection of custom properties.\n     */\n    properties: any; /* {} */\n \n    /**\n     * Collection of custom measurements.\n     */\n    measurements: any; /* {} */\n \n    /**\n     * Constructs a new instance of the MetricTelemetry object\n     */\n    constructor(logger: IDiagnosticLogger, name: string, value: number, count?: number, min?: number, max?: number, stdDev?: number, properties?: any, measurements?: { [key: string]: number }) {\n        let _self = this;\n        _self.ver = 2;\n        const dataPoint = new DataPoint();\n        dataPoint.count = count > 0 ? count : undefined;\n        dataPoint.max = isNaN(max) || max === null ? undefined : max;\n        dataPoint.min = isNaN(min) || min === null ? undefined : min;\n        dataPoint.name = dataSanitizeString(logger, name) || strNotSpecified;\n        dataPoint.value = value;\n        dataPoint.stdDev = isNaN(stdDev) || stdDev === null ? undefined : stdDev;\n\n        _self.metrics = [dataPoint];\n        _self.properties = dataSanitizeProperties(logger, properties);\n        _self.measurements = dataSanitizeMeasurements(logger, measurements);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/PageView.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strNotSpecified } from \"../../constants/Constants\";\nimport { FieldType } from \"../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../interfaces/ai/IDiagnosticLogger\";\nimport { IPageViewData } from \"../../interfaces/ai/contracts/IPageViewData\";\nimport { ISerializable } from \"../../interfaces/ai/telemetry/ISerializable\";\nimport { msToTimeSpan } from \"../../utils/HelperFuncs\";\nimport {\n    dataSanitizeId, dataSanitizeMeasurements, dataSanitizeProperties, dataSanitizeString, dataSanitizeUrl\n} from \"./Common/DataSanitizer\";\nimport { PageViewDataType } from \"./DataTypes\";\nimport { PageViewEnvelopeType } from \"./EnvelopeTypes\";\n\nexport class PageView implements IPageViewData, ISerializable {\n    /**\n     * @deprecated Use the constant PageViewEnvelopeType instead.\n     */\n    public static envelopeType = PageViewEnvelopeType;\n\n    /**\n     * @deprecated Use the constant PageViewDataType instead.\n     */\n    public static dataType = PageViewDataType;\n\n    public aiDataContract = {\n        ver: FieldType.Required,\n        name: FieldType.Default,\n        url: FieldType.Default,\n        duration: FieldType.Default,\n        properties: FieldType.Default,\n        measurements: FieldType.Default,\n        id: FieldType.Default\n    }\n    \n    /**\n     * Schema version\n     */\n    public ver: number; // = 2;\n\n    /**\n     * Event name. Keep it low cardinality to allow proper grouping and useful metrics.\n     */\n    public name: string;\n \n    /**\n     * Collection of custom properties.\n     */\n    public properties: any; // = {};\n \n    /**\n     * Collection of custom measurements.\n     */\n    public measurements: any; // = {};\n \n    /**\n     * Request URL with all query string parameters\n     */\n    public url: string;\n\n    /**\n     * Request duration in format: DD.HH:MM:SS.MMMMMM. For a page view (PageViewData), this is the duration. For a page view with performance information (PageViewPerfData), this is the page load time. Must be less than 1000 days.\n     */\n    public duration: string;\n \n    /**\n     * Identifier of a page view instance. Used for correlation between page view and other telemetry items.\n     */\n    public id: string;\n \n    /**\n     * Constructs a new instance of the PageEventTelemetry object\n     */\n    constructor(logger: IDiagnosticLogger, name?: string, url?: string, durationMs?: number, properties?: {[key: string]: string}, measurements?: {[key: string]: number}, id?: string) {\n        let _self = this;\n        _self.ver = 2;\n        _self.id = dataSanitizeId(logger, id);\n        _self.url = dataSanitizeUrl(logger, url);\n        _self.name = dataSanitizeString(logger, name) || strNotSpecified;\n        if (!isNaN(durationMs)) {\n            _self.duration = msToTimeSpan(durationMs);\n        }\n        _self.properties = dataSanitizeProperties(logger, properties);\n        _self.measurements = dataSanitizeMeasurements(logger, measurements);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/PageViewPerformance.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strNotSpecified } from \"../../constants/Constants\";\nimport { FieldType } from \"../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../interfaces/ai/IDiagnosticLogger\";\nimport { IPageViewPerformanceTelemetry } from \"../../interfaces/ai/IPageViewPerformanceTelemetry\";\nimport { IPageViewPerfData } from \"../../interfaces/ai/contracts/IPageViewPerfData\";\nimport { ISerializable } from \"../../interfaces/ai/telemetry/ISerializable\";\nimport { dataSanitizeMeasurements, dataSanitizeProperties, dataSanitizeString, dataSanitizeUrl } from \"./Common/DataSanitizer\";\nimport { PageViewPerformanceDataType } from \"./DataTypes\";\nimport { PageViewPerformanceEnvelopeType } from \"./EnvelopeTypes\";\n\nexport class PageViewPerformance implements IPageViewPerfData, ISerializable {\n    /**\n     * @deprecated Use the constant PageViewPerformanceEnvelopeType instead.\n     */\n    public static envelopeType = PageViewPerformanceEnvelopeType;\n\n    /**\n     * @deprecated Use the constant PageViewPerformanceDataType instead.\n     */\n    public static dataType = PageViewPerformanceDataType;\n\n    public aiDataContract = {\n        ver: FieldType.Required,\n        name: FieldType.Default,\n        url: FieldType.Default,\n        duration: FieldType.Default,\n        perfTotal: FieldType.Default,\n        networkConnect: FieldType.Default,\n        sentRequest: FieldType.Default,\n        receivedResponse: FieldType.Default,\n        domProcessing: FieldType.Default,\n        properties: FieldType.Default,\n        measurements: FieldType.Default\n    };\n\n    /**\n     * Schema version\n     */\n    public ver: number; // = 2;\n\n    /**\n     * Event name. Keep it low cardinality to allow proper grouping and useful metrics.\n     */\n    public name: string;\n  \n    /**\n     * Collection of custom properties.\n     */\n    public properties: any; // = {};\n  \n    /**\n     * Collection of custom measurements.\n     */\n    public measurements: any; // = {};\n  \n    /**\n     * Request URL with all query string parameters\n     */\n    public url: string;\n \n    /**\n     * Request duration in format: DD.HH:MM:SS.MMMMMM. For a page view (PageViewData), this is the duration. For a page view with performance information (PageViewPerfData), this is the page load time. Must be less than 1000 days.\n     */\n    public duration: string;\n  \n    /**\n     * Identifier of a page view instance. Used for correlation between page view and other telemetry items.\n     */\n    public id: string;\n  \n    /**\n     * Performance total in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    public perfTotal: string;\n\n    /**\n     * Network connection time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    public networkConnect: string;\n  \n    /**\n     * Sent request time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    public sentRequest: string;\n  \n    /**\n     * Received response time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    public receivedResponse: string;\n  \n    /**\n     * DOM processing time in TimeSpan 'G' (general long) format: d:hh:mm:ss.fffffff\n     */\n    public domProcessing: string;\n  \n    /**\n     * Constructs a new instance of the PageEventTelemetry object\n     */\n    constructor(logger: IDiagnosticLogger, name: string, url: string, unused: number, properties?: { [key: string]: string }, measurements?: { [key: string]: number }, cs4BaseData?: IPageViewPerformanceTelemetry) {\n        let _self = this;\n\n        _self.ver = 2;\n        _self.url = dataSanitizeUrl(logger, url);\n        _self.name = dataSanitizeString(logger, name) || strNotSpecified;\n\n        _self.properties = dataSanitizeProperties(logger, properties);\n        _self.measurements = dataSanitizeMeasurements(logger, measurements);\n\n        if (cs4BaseData) {\n            _self.domProcessing = cs4BaseData.domProcessing;\n            _self.duration = cs4BaseData.duration;\n            _self.networkConnect = cs4BaseData.networkConnect;\n            _self.perfTotal = cs4BaseData.perfTotal;\n            _self.receivedResponse = cs4BaseData.receivedResponse;\n            _self.sentRequest = cs4BaseData.sentRequest;\n        }\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/RemoteDependencyData.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { FieldType } from \"../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../interfaces/ai/IDiagnosticLogger\";\nimport { IRemoteDependencyData } from \"../../interfaces/ai/contracts/IRemoteDependencyData\";\nimport { ISerializable } from \"../../interfaces/ai/telemetry/ISerializable\";\nimport { msToTimeSpan } from \"../../utils/HelperFuncs\";\nimport { AjaxHelperParseDependencyPath } from \"../../utils/Util\";\nimport { dataSanitizeMeasurements, dataSanitizeProperties, dataSanitizeString, dataSanitizeUrl } from \"./Common/DataSanitizer\";\nimport { RemoteDependencyDataType } from \"./DataTypes\";\nimport { RemoteDependencyEnvelopeType } from \"./EnvelopeTypes\";\n\n/**\n * @deprecated - will be removed in future releases as this was only used by the applicationinsights-channel-js package.\n * And it no longer uses this class.\n */\nexport class RemoteDependencyData implements IRemoteDependencyData, ISerializable {\n    /**\n     * @deprecated Use the constant RemoteDependencyEnvelopeType instead.\n     */\n    public static envelopeType = RemoteDependencyEnvelopeType;\n\n    /**\n     * @deprecated Use the constant RemoteDependencyDataType instead.\n     */\n    public static dataType = RemoteDependencyDataType;\n\n    public aiDataContract = {\n        id: FieldType.Required,\n        ver: FieldType.Required,\n        name: FieldType.Default,\n        resultCode: FieldType.Default,\n        duration: FieldType.Default,\n        success: FieldType.Default,\n        data: FieldType.Default,\n        target: FieldType.Default,\n        type: FieldType.Default,\n        properties: FieldType.Default,\n        measurements: FieldType.Default,\n\n        kind: FieldType.Default,\n        value: FieldType.Default,\n        count: FieldType.Default,\n        min: FieldType.Default,\n        max: FieldType.Default,\n        stdDev: FieldType.Default,\n        dependencyKind: FieldType.Default,\n        dependencySource: FieldType.Default,\n        commandName: FieldType.Default,\n        dependencyTypeName: FieldType.Default\n    }\n\n    /**\n     * Schema version\n     */\n    public ver: number; // = 2;\n\n    /**\n     * Name of the command initiated with this dependency call. Low cardinality value. Examples are stored procedure name and URL path template.\n     */\n    public name: string;\n \n    /**\n     * Identifier of a dependency call instance. Used for correlation with the request telemetry item corresponding to this dependency call.\n     */\n    public id: string;\n \n    /**\n     * Result code of a dependency call. Examples are SQL error code and HTTP status code.\n     */\n    public resultCode: string;\n \n    /**\n     * Request duration in format: DD.HH:MM:SS.MMMMMM. Must be less than 1000 days.\n     */\n    public duration: string;\n \n    /**\n     * Indication of successful or unsuccessful call.\n     */\n    public success: boolean; /* true */\n \n    /**\n     * Command initiated by this dependency call. Examples are SQL statement and HTTP URL's with all query parameters.\n     */\n    public data: string;\n \n    /**\n     * Target site of a dependency call. Examples are server name, host address.\n     */\n    public target: string;\n \n    /**\n     * Dependency type name. Very low cardinality value for logical grouping of dependencies and interpretation of other fields like commandName and resultCode. Examples are SQL, Azure table, and HTTP.\n     */\n    public type: string;\n \n    /**\n     * Collection of custom properties.\n     */\n    public properties: any; // = {};\n \n    /**\n     * Collection of custom measurements.\n     */\n    public measurements: any; // = {};\n \n    /**\n     * Constructs a new instance of the RemoteDependencyData object\n     */\n    constructor(logger: IDiagnosticLogger, id: string, absoluteUrl: string, commandName: string, value: number, success: boolean, resultCode: number, method?: string, requestAPI: string = \"Ajax\", correlationContext?: string, properties?: Object, measurements?: Object) {\n        let _self = this;\n\n        _self.ver = 2;\n        _self.id = id;\n        _self.duration = msToTimeSpan(value);\n        _self.success = success;\n        _self.resultCode = \"\" + resultCode;\n\n        _self.type = dataSanitizeString(logger, requestAPI);\n\n        const dependencyFields = AjaxHelperParseDependencyPath(logger, absoluteUrl, method, commandName);\n        _self.data = dataSanitizeUrl(logger, commandName) || dependencyFields.data; // get a value from hosturl if commandName not available\n        _self.target = dataSanitizeString(logger, dependencyFields.target);\n        if (correlationContext) {\n            _self.target = `${_self.target} | ${correlationContext}`;\n        }\n        _self.name = dataSanitizeString(logger, dependencyFields.name);\n\n        _self.properties = dataSanitizeProperties(logger, properties);\n        _self.measurements = dataSanitizeMeasurements(logger, measurements);\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/telemetry/ai/Trace.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { strNotSpecified } from \"../../constants/Constants\";\nimport { FieldType } from \"../../enums/ai/Enums\";\nimport { IDiagnosticLogger } from \"../../interfaces/ai/IDiagnosticLogger\";\nimport { IMessageData } from \"../../interfaces/ai/contracts/IMessageData\";\nimport { SeverityLevel } from \"../../interfaces/ai/contracts/SeverityLevel\";\nimport { ISerializable } from \"../../interfaces/ai/telemetry/ISerializable\";\nimport { dataSanitizeMeasurements, dataSanitizeMessage, dataSanitizeProperties } from \"./Common/DataSanitizer\";\nimport { TraceDataType } from \"./DataTypes\";\nimport { TraceEnvelopeType } from \"./EnvelopeTypes\";\n\nexport class Trace implements IMessageData, ISerializable {\n    /**\n     * @deprecated Use the constant TraceEnvelopeType instead.\n     */\n    public static envelopeType = TraceEnvelopeType;\n\n    /**\n     * @deprecated Use the constant TraceDataType instead.\n     */\n    public static dataType = TraceDataType;\n\n    public aiDataContract = {\n        ver: FieldType.Required,\n        message: FieldType.Required,\n        severityLevel: FieldType.Default,\n        properties: FieldType.Default\n    };\n\n    /**\n     * Schema version\n     */\n    public ver: number; // = 2;\n\n    /**\n     * Trace message\n     */\n    public message: string;\n \n    /**\n     * Trace severity level.\n     */\n    public severityLevel: SeverityLevel;\n \n    /**\n     * Collection of custom properties.\n     */\n    public properties: any;\n \n    /**\n     * Collection of custom measurements.\n     */\n    public measurements: any;\n \n    /**\n     * Constructs a new instance of the TraceTelemetry object\n     */\n    constructor(logger: IDiagnosticLogger, message: string, severityLevel?: SeverityLevel, properties?: any, measurements?: { [key: string]: number }) {\n        let _self = this;\n        _self.ver = 2;\n        message = message || strNotSpecified;\n        _self.message = dataSanitizeMessage(logger, message);\n        _self.properties = dataSanitizeProperties(logger, properties);\n        _self.measurements = dataSanitizeMeasurements(logger, measurements);\n\n        if (severityLevel) {\n            _self.severityLevel = severityLevel;\n        }\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/CoreUtils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\nimport { strShimUndefined } from \"@microsoft/applicationinsights-shims\";\nimport { strSubstr, strSubstring } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { random32 } from \"./RandomHelper\";\n\n// Added to help with minfication\nexport const Undefined = strShimUndefined;\n\nexport function newGuid(): string {\n    const uuid = generateW3CId();\n\n    return strSubstring(uuid, 0, 8) + \"-\" + strSubstring(uuid, 8, 12) + \"-\" + strSubstring(uuid, 12, 16) + \"-\" + strSubstring(uuid, 16, 20) + \"-\" + strSubstring(uuid, 20);\n}\n\n/**\n * The strEndsWith() method determines whether a string ends with the characters of a specified string, returning true or false as appropriate.\n * @param value - The value to check whether it ends with the search value.\n * @param search - The characters to be searched for at the end of the value.\n * @returns true if the given search value is found at the end of the string, otherwise false.\n */\nexport function strEndsWith(value: string, search: string) {\n    if (value && search) {\n        let len = value.length;\n        let start = len - search.length;\n        return strSubstring(value, start >= 0 ? start : 0, len) === search;\n    }\n\n    return false;\n}\n\n/**\n * generate W3C trace id\n */\nexport function generateW3CId(): string {\n    const hexValues = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\n\n    // rfc4122 version 4 UUID without dashes and with lowercase letters\n    let oct = STR_EMPTY, tmp;\n    for (let a = 0; a < 4; a++) {\n        tmp = random32();\n        oct +=\n            hexValues[tmp & 0xF] +\n            hexValues[tmp >> 4 & 0xF] +\n            hexValues[tmp >> 8 & 0xF] +\n            hexValues[tmp >> 12 & 0xF] +\n            hexValues[tmp >> 16 & 0xF] +\n            hexValues[tmp >> 20 & 0xF] +\n            hexValues[tmp >> 24 & 0xF] +\n            hexValues[tmp >> 28 & 0xF];\n    }\n\n    // \"Set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively\"\n    const clockSequenceHi = hexValues[8 + (random32() & 0x03) | 0];\n    return strSubstr(oct, 0, 8) + strSubstr(oct, 9, 4) + \"4\" + strSubstr(oct, 13, 3) + clockSequenceHi +strSubstr(oct, 16, 3) + strSubstr(oct, 19, 12);\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/DataCacheHelper.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { objDefine } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { normalizeJsName } from \"./HelperFuncs\";\nimport { newId } from \"./RandomHelper\";\n\nconst version = \"#version#\";\nlet instanceName = \".\" + newId(6);\nlet _dataUid = 0;\n\nexport interface IDataCache {\n    id: string;\n    accept: (target: any) => boolean,\n    get: <T>(target: any, name: string, defValue?: T, addDefault?: boolean) => T;\n    kill: (target: any, name: string) => void;\n}\n\n// Accepts only:\n//  - Node\n//    - Node.ELEMENT_NODE\n//    - Node.DOCUMENT_NODE\n//  - Object\n//    - Any\nfunction _canAcceptData(target: any) {\n    return target.nodeType === 1 || target.nodeType === 9 || !( +target.nodeType );\n}\n\nfunction _getCache(data: IDataCache, target: Node) {\n    let theCache = target[data.id];\n    if (!theCache) {\n        theCache = {};\n\n        try {\n            if (_canAcceptData(target)) {\n                objDefine<any>(target, data.id, {\n                    e: false,\n                    v: theCache\n                });\n            }\n        } catch (e) {\n            // Not all environments allow extending all objects, so just ignore the cache in those cases\n        }\n    }\n\n    return theCache;\n}\n\nexport function createUniqueNamespace(name: string, includeVersion: boolean = false): string {\n    return normalizeJsName(name + (_dataUid++) + (includeVersion ? \".\" + version : STR_EMPTY) + instanceName);\n}\n\nexport function createElmNodeData(name?: string) {\n\n    let data = {\n        id: createUniqueNamespace(\"_aiData-\" + (name || STR_EMPTY) + \".\" + version),\n        accept: function (target: any) {\n            return _canAcceptData(target);\n        },\n        get: function <T>(target: any, name: string, defValue?: T, addDefault?: boolean): T {\n            let theCache = target[data.id];\n            if (!theCache) {\n                if (addDefault) {\n                    // Side effect is adds the cache\n                    theCache = _getCache(data, target);\n                    theCache[normalizeJsName(name)] = defValue;\n                }\n\n                return defValue;\n            }\n\n            return theCache[normalizeJsName(name)];\n        },\n        kill: function(target: any, name: string) {\n            if (target && target[name]) {\n                try {\n                    delete target[name];\n                } catch (e) {\n                    // Just cleaning up, so if this fails -- ignore\n                }\n            }\n        }\n    };\n\n    return data;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/DomHelperFuncs.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getDocument, isFunction } from \"@nevware21/ts-utils\";\n\nexport function createDomEvent(eventName: string): Event {\n    let event: Event = null;\n\n    if (isFunction(Event)) { // Use Event constructor when available\n        event = new Event(eventName);\n    } else { // Event has no constructor in IE\n        let doc = getDocument();\n        if (doc && doc.createEvent) {\n            event = doc.createEvent(\"Event\");\n            event.initEvent(eventName, true, true);\n        }\n    }\n\n    return event;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/EnvUtils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\"use strict\";\n\nimport { getGlobal, strShimObject, strShimPrototype, strShimUndefined } from \"@microsoft/applicationinsights-shims\";\nimport {\n    ICachedValue, arrForEach, createCachedValue, getDeferred, getDocument, getInst, getLazy, getNavigator, getPerformance, hasNavigator,\n    isFunction, isNullOrUndefined, isString, isUndefined, mathMax, strIndexOf, strSubstring\n} from \"@nevware21/ts-utils\";\nimport { DEFAULT_SENSITIVE_PARAMS, STR_EMPTY, STR_REDACTED } from \"../constants/InternalConstants\";\nimport { eUrlRedactionOptions } from \"../enums/ai/UrlRedactionOptions\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { strContains } from \"./HelperFuncs\";\n\n// TypeScript removed this interface so we need to declare the global so we can check for it's existence.\ndeclare var XDomainRequest: any;\n\n/**\n * This file exists to hold environment utilities that are required to check and\n * validate the current operating environment. Unless otherwise required, please\n * only use defined methods (functions) in this class so that users of these\n * functions/properties only need to include those that are used within their own modules.\n */\n\nconst strDocumentMode = \"documentMode\";\nconst strLocation = \"location\";\nconst strConsole = \"console\";\nconst strJSON = \"JSON\";\nconst strCrypto = \"crypto\";\nconst strMsCrypto = \"msCrypto\";\nconst strReactNative = \"ReactNative\";\nconst strMsie = \"msie\";\nconst strTrident = \"trident/\";\nconst strXMLHttpRequest = \"XMLHttpRequest\";\n\n// Local cached properties which are used to avoid multiple checks within the module\nlet _isTrident: ICachedValue<boolean>;\nlet _navUserAgentCheck: string;\nlet _enableMocks = false;\nlet _useXDomainRequest: ICachedValue<boolean>;\nlet _beaconsSupported: ICachedValue<boolean>;\nlet _userAgent: ICachedValue<string>;\n\nfunction _hasProperty(theClass: any, property: string) {\n    let supported = false;\n    if (theClass) {\n        try {\n            supported = property in theClass;\n            if (!supported) {\n                let proto = theClass[strShimPrototype];\n                if (proto) {\n                    supported = property in proto;\n                }\n            }\n        } catch (e) {\n            // Do Nothing\n        }\n\n        if (!supported) {\n            try {\n                let tmp = new theClass();\n                supported = !isUndefined(tmp[property]);\n            } catch (e) {\n                // Do Nothing\n            }\n        }\n    }\n\n    return supported;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function getUserAgentString(): string {\n    if (!_userAgent) {\n        // Use lazy to allow mocking\n        _userAgent = getLazy(() => {\n            let nav = getNavigator() || {} as Navigator;\n            return nav.userAgent || STR_EMPTY;\n        });\n    }\n\n    return _userAgent.v;\n}\n\n/**\n * Enable the lookup of test mock objects if requested\n * @param enabled - A flag to enable or disable the mock\n */\nexport function setEnableEnvMocks(enabled: boolean) {\n    _enableMocks = enabled;\n}\n\n/**\n * Returns the global location object if it is present otherwise null.\n * This helper is used to access the location object without causing an exception\n * \"Uncaught ReferenceError: location is not defined\"\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function getLocation(checkForMock?: boolean): Location | null {\n    if (checkForMock && _enableMocks) {\n        let mockLocation = getInst(\"__mockLocation\") as Location;\n        if (mockLocation) {\n            return mockLocation;\n        }\n    }\n\n    if (typeof location === strShimObject && location) {\n        return location;\n    }\n\n    return getInst(strLocation);\n}\n\n/**\n * Returns the global console object\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function getConsole(): Console | null {\n    if (typeof console !== strShimUndefined) {\n        return console;\n    }\n\n    return getInst(strConsole);\n}\n\n/**\n * Checks if JSON object is available, this is required as we support the API running without a\n * window /document (eg. Node server, electron webworkers) and if we attempt to assign a history\n * object to a local variable or pass as an argument an \"Uncaught ReferenceError: JSON is not defined\"\n * exception will be thrown.\n * Defined as a function to support lazy / late binding environments.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function hasJSON(): boolean {\n    return Boolean((typeof JSON === strShimObject && JSON) || getInst(strJSON) !== null);\n}\n\n/**\n * Returns the global JSON object if it is present otherwise null.\n * This helper is used to access the JSON object without causing an exception\n * \"Uncaught ReferenceError: JSON is not defined\"\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function getJSON(): JSON | null {\n    if (hasJSON()) {\n        return JSON || getInst(strJSON);\n    }\n\n    return null;\n}\n\n/**\n * Returns the crypto object if it is present otherwise null.\n * This helper is used to access the crypto object from the current\n * global instance which could be window or globalThis for a web worker\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function getCrypto(): Crypto | null {\n    return getInst(strCrypto);\n}\n\n/**\n * Returns the crypto object if it is present otherwise null.\n * This helper is used to access the crypto object from the current\n * global instance which could be window or globalThis for a web worker\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function getMsCrypto(): Crypto | null {\n    return getInst(strMsCrypto);\n}\n\n/**\n * Returns whether the environment is reporting that we are running in a React Native Environment\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isReactNative(): boolean {\n    // If running in React Native, navigator.product will be populated\n    var nav = getNavigator();\n    if (nav && nav.product) {\n        return nav.product === strReactNative;\n    }\n\n    return false;\n}\n\n/**\n * Identifies whether the current environment appears to be IE\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isIE() {\n    let userAgent = getUserAgentString();\n    if (!_isTrident || userAgent !== _navUserAgentCheck) {\n        // Added to support test mocking of the user agent\n        _navUserAgentCheck = userAgent;\n        let lwrUserAgent = _navUserAgentCheck.toLowerCase();\n        _isTrident = createCachedValue( strContains(lwrUserAgent, strMsie) || strContains(lwrUserAgent, strTrident));\n    }\n\n    return _isTrident.v;\n}\n\n/**\n * Gets IE version returning the document emulation mode if we are running on IE, or null otherwise\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function getIEVersion(userAgentStr: string = null): number {\n    if (!userAgentStr) {\n        userAgentStr = getUserAgentString();\n    }\n\n    var ua = (userAgentStr || STR_EMPTY).toLowerCase();\n    // Also check for documentMode in case X-UA-Compatible meta tag was included in HTML.\n    if (strContains(ua, strMsie)) {\n        let doc = getDocument() || {} as Document;\n        return mathMax(parseInt(ua.split(strMsie)[1]), (doc[strDocumentMode] || 0));\n    } else if (strContains(ua, strTrident)) {\n        let tridentVer = parseInt(ua.split(strTrident)[1]);\n        if (tridentVer) {\n            return tridentVer + 4;\n        }\n    }\n\n    return null;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function isSafari(userAgentStr ?: string) {\n    if (!userAgentStr || !isString(userAgentStr)) {\n        userAgentStr = getUserAgentString().toLowerCase();\n    }\n\n    var ua = (userAgentStr || STR_EMPTY).toLowerCase();\n    return (strIndexOf(ua, \"safari\") >= 0);\n}\n\n/**\n * Checks if HTML5 Beacons are supported in the current environment. There is a side effect (for testing)\n * when `useCached` is set to `false`, it will reset the cached value causing all future calls to\n * use the new re-evaluated value for all future calls.\n * @param useCached - [Optional] used for testing to bypass the cached lookup, when `true` this will\n * cause the cached global to be reset.\n * @returns True if supported, false otherwise.\n */\nexport function isBeaconsSupported(useCached?: boolean): boolean {\n    if (!_beaconsSupported || useCached === false) {\n        _beaconsSupported = createCachedValue(hasNavigator() && !!(getNavigator().sendBeacon));\n    }\n\n    return _beaconsSupported.v;\n}\n\n/**\n * Checks if the Fetch API is supported in the current environment.\n * @param withKeepAlive - [Optional] If True, check if fetch is available and it supports the keepalive feature, otherwise only check if fetch is supported\n * @returns True if supported, otherwise false\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isFetchSupported(withKeepAlive?: boolean): boolean {\n    let isSupported = false;\n    try {\n        isSupported = !!getInst(\"fetch\");\n        const request = getInst(\"Request\");\n        if (isSupported && withKeepAlive && request) {\n            isSupported = _hasProperty(request, \"keepalive\");\n        }\n    } catch (e) {\n        // Just Swallow any failure during availability checks\n    }\n\n    return isSupported;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function useXDomainRequest(): boolean | undefined {\n    if (!_useXDomainRequest) {\n        _useXDomainRequest = getDeferred(() => {\n            let useXDomainRequest = (typeof XDomainRequest !== strShimUndefined);\n            if (useXDomainRequest && isXhrSupported()) {\n                useXDomainRequest = useXDomainRequest && !_hasProperty(getInst(strXMLHttpRequest), \"withCredentials\");\n            }\n\n            return !!useXDomainRequest;\n        });\n    }\n\n    return _useXDomainRequest.v;\n}\n\n/**\n * Checks if XMLHttpRequest is supported\n * @returns True if supported, otherwise false\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isXhrSupported(): boolean {\n    let isSupported = false;\n    try {\n        const xmlHttpRequest = getInst(strXMLHttpRequest);\n        isSupported = !!xmlHttpRequest;\n    } catch (e) {\n        // Just Swallow any failure during availability checks\n    }\n\n    return isSupported;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nfunction _getNamedValue<T>(values: any, name: string): T[] {\n    let items: T[]  = [];\n    if (values) {\n        arrForEach(values, (value) => {\n            if (value.name) {\n                if(value.name === name) {\n                    items.push(value);\n                }\n            }\n        });\n    }\n\n    return items;\n}\n\n/**\n * Helper function to fetch the named meta-tag from the page.\n * @param name - The name of the meta-tag to find.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function findMetaTag(name: string): any {\n    let tags = findMetaTags(name);\n    if (tags.length > 0) {\n        return tags[0];\n    }\n\n    return null;\n}\n\n/**\n * Helper function to fetch all named meta-tag from the page.\n * @since 3.4.0\n * @param name - The name of the meta-tag to find.\n * @returns - An array of meta-tag values.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function findMetaTags(name: string): string[] {\n    let tags: string[] = [];\n    let doc = getDocument();\n    if (doc && name) {\n        // Look for a meta-tag\n        arrForEach(_getNamedValue<any>(doc.querySelectorAll(\"meta\"), name), (item) => {\n            tags.push(item.content);\n        });\n    }\n\n    return tags;\n}\n\n/**\n * Helper function to fetch the named server timing value from the page response (first navigation event).\n * @param name - The name of the server timing value to find.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function findNamedServerTiming(name: string): any {\n    let value: any;\n    let serverTimings = findNamedServerTimings(name);\n    if (serverTimings.length > 0) {\n        value = serverTimings[0];\n    }\n\n    return value;\n}\n\n/**\n * Helper function to fetch the named server timing value from the page response (first navigation event).\n * @since 3.4.0\n * @param name - The name of the server timing value to find.\n * @returns - An array of server timing values.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function findNamedServerTimings(name: string): string[] {\n    let values: string[] = [];\n    let perf = getPerformance();\n    if (perf && perf.getEntriesByType) {\n        // Try looking for a server-timing header\n        arrForEach(perf.getEntriesByType(\"navigation\") || [], (navPerf: any) => {\n            arrForEach(_getNamedValue(navPerf.serverTiming, name), (value: any) => {\n                let desc = value.description;\n                if (!isNullOrUndefined(desc)) {\n                    values.push(desc);\n                }\n            });\n        });\n    }\n\n    return values;\n}\n\n// TODO: should reuse this method for analytics plugin\nexport function dispatchEvent(target:EventTarget, evnt: Event | CustomEvent): boolean {\n    if (target && target.dispatchEvent && evnt) {\n        target.dispatchEvent(evnt);\n        return true;\n    }\n    return false;\n}\n\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function createCustomDomEvent(eventName: string, details?: any): CustomEvent {\n    let event: CustomEvent = null;\n    let detail = {detail: details || null } as CustomEventInit;\n    if (isFunction(CustomEvent)) { // Use CustomEvent constructor when available\n        event = new CustomEvent(eventName, detail);\n    } else { // CustomEvent has no constructor in IE\n        let doc = getDocument();\n        if (doc && doc.createEvent) {\n            event = doc.createEvent(\"CustomEvent\");\n            event.initCustomEvent(eventName, true, true, detail);\n        }\n    }\n\n    return event;\n}\n\nexport function sendCustomEvent(evtName: string, cfg?: any, customDetails?: any): boolean {\n    let global = getGlobal();\n    if (global && (global as any).CustomEvent) {\n        try {\n            let details = {cfg: cfg || null,  customDetails: customDetails || null} as any;\n            return dispatchEvent(global, createCustomDomEvent(evtName, details));\n        } catch(e) {\n            // eslint-disable-next-line no-empty\n        }\n    }\n    return false;\n}\n\n/**\n * Redacts user information from a URL\n * @param url - The URL string to redact\n * @returns The URL with user information redacted\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction redactUserInfo(url: string): string {\n    return url.replace(/^([a-zA-Z][a-zA-Z0-9+.-]*:\\/\\/)([^:@]{1,200}):([^@]{1,200})@(.*)$/, \"$1REDACTED:REDACTED@$4\");\n}\n\n/**\n * Redacts sensitive query parameters from a URL\n * @param url - The URL string to redact\n * @returns The URL with sensitive query parameters redacted\n */\n/*#__NO_SIDE_EFFECTS__*/\nfunction redactQueryParameters(url: string, config?: IConfiguration): string {\n    let sensitiveParams: string[];\n    const questionMarkIndex = strIndexOf(url, \"?\");\n    if (questionMarkIndex === -1) {\n        return url;\n    }\n\n    const option = config ? config.redactUrls : undefined;\n    \n    if (option === eUrlRedactionOptions.appendToDefault) {\n        sensitiveParams = DEFAULT_SENSITIVE_PARAMS.concat(config.redactQueryParams);\n    } else if (option === eUrlRedactionOptions.replaceDefault) {\n        sensitiveParams = config.redactQueryParams;\n    } else {\n        sensitiveParams = DEFAULT_SENSITIVE_PARAMS;\n    }\n\n    const baseUrl = strSubstring(url, 0, questionMarkIndex + 1);\n    let queryString = strSubstring(url, questionMarkIndex + 1);\n\n    let fragment = STR_EMPTY;\n    const hashIndex = strIndexOf(queryString, \"#\");\n    if (hashIndex !== -1) {\n        fragment = strSubstring(queryString, hashIndex);\n        queryString = strSubstring(queryString, 0, hashIndex);\n    }\n\n    let hasPotentialSensitiveParam = false;\n    for (let i = 0; i < sensitiveParams.length; i++) {\n        const paramCheck = sensitiveParams[i] + \"=\";\n        if (strIndexOf(queryString, paramCheck) !== -1) {\n            hasPotentialSensitiveParam = true;\n            break;\n        }\n    }\n\n    if (!hasPotentialSensitiveParam) {\n        return url;\n    }\n\n    const resultParts: string[] = [];\n    let anyParamRedacted = false;\n\n    if (queryString && queryString.length) {\n        const pairs = queryString.split(\"&\");\n        for (let i = 0; i < pairs.length; i++) {\n            const pair = pairs[i];\n            if (!pair) {\n                continue;\n            }\n            \n            const equalsIndex = strIndexOf(pair, \"=\");\n            if (equalsIndex === -1) {\n                // Parameter without value\n                resultParts.push(pair);\n            } else {\n                const paramName = pair.substring(0, equalsIndex);\n                const paramValue = pair.substring(equalsIndex + 1);\n                if (paramValue === STR_EMPTY) {\n                    resultParts.push(pair);\n                } else {\n                    let shouldRedact = false;\n                    for (let j = 0; j < sensitiveParams.length; j++) {\n                        if (paramName === sensitiveParams[j]) {\n                            shouldRedact = true;\n                            anyParamRedacted = true;\n                            break;\n                        }\n                    }\n                    \n                    if (shouldRedact) {\n                        resultParts.push(paramName + \"=\" + STR_REDACTED);\n                    } else {\n                        resultParts.push(pair);\n                    }\n                }\n            }\n        }\n    }\n    \n    // If no parameters were redacted, return the original URL\n    if (!anyParamRedacted) {\n        return url;\n    }\n\n    return baseUrl + resultParts.join(\"&\") + fragment;\n}\n\n/**\n * Redacts sensitive information from a URL string, including credentials and specific query parameters.\n * @param input - The URL string to be redacted.\n * @param config - Configuration object that contain redactUrls setting.\n * @returns The redacted URL string or the original string if no redaction was needed or possible.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function fieldRedaction(input: string, config: IConfiguration): string {\n    if (!input || !isString(input) || strIndexOf(input, \" \") !== -1) {\n        return input;\n    }\n\n    const option = config ? config.redactUrls : undefined;\n\n    const isRedactionDisabled = option === false || option === eUrlRedactionOptions.false;\n    if (isRedactionDisabled) {\n        return input;\n    }\n\n    let hasCredentials = strIndexOf(input, \"@\") !== -1;\n    let hasQueryParams = strIndexOf(input, \"?\") !== -1;\n    \n    // If no credentials and no query params, return original\n    if (!hasCredentials && !hasQueryParams) {\n        return input;\n    }\n\n    if (option === eUrlRedactionOptions.usernamePasswordOnly) {\n        hasQueryParams = false;\n    }\n\n    if (option === eUrlRedactionOptions.queryParamsOnly) {\n        hasCredentials = false;\n    }\n\n    try {\n        let result = input;\n        if (hasCredentials) {\n            result = redactUserInfo(input);\n        }\n        if (hasQueryParams) {\n            result = redactQueryParameters(result, config);\n        }\n        return result;\n    } catch (e) {\n        return input;\n    }\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/HelperFuncs.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { ObjAssign, ObjClass, ObjProto } from \"@microsoft/applicationinsights-shims\";\nimport {\n    ICachedValue, WellKnownSymbols, arrForEach, asString as asString21, createCachedValue, getKnownSymbol, isArray, isBoolean, isError,\n    isFunction, isNullOrUndefined, isNumber, isObject, isPlainObject, isString, isUndefined, mathFloor, mathRound, newSymbol, objCreate,\n    objDeepFreeze, objDefine, objForEachKey, objGetPrototypeOf, objHasOwn, objSetPrototypeOf, safe, strIndexOf, strSplit, strTrim\n} from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { FeatureOptInMode } from \"../enums/ai/FeatureOptInEnums\";\nimport { TransportType } from \"../enums/ext/Enums\";\nimport { IConfiguration } from \"../interfaces/ai/IConfiguration\";\nimport { IPlugin } from \"../interfaces/ai/ITelemetryPlugin\";\nimport { IXDomainRequest } from \"../interfaces/ai/IXDomainRequest\";\n\n// RESTRICT and AVOID circular dependencies you should not import other contained modules or export the contents of this file directly\n\n// Added to help with minification\nconst strGetPrototypeOf = \"getPrototypeOf\";\n\nconst rCamelCase = /-([a-z])/g;\nconst rNormalizeInvalid = /([^\\w\\d_$])/g;\nconst rLeadingNumeric = /^(\\d+[\\w\\d_$])/;\n\nlet _ProtoNameTag: ICachedValue<symbol>;\n\nexport let _getObjProto = Object[strGetPrototypeOf];\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function isNotUndefined<T>(value: T): value is T {\n    return !isUndefined(value);\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function isNotNullOrUndefined<T>(value: T): value is T {\n    return !isNullOrUndefined(value);\n}\n\n/**\n * Validates that the string name conforms to the JS IdentifierName specification and if not\n * normalizes the name so that it would. This method does not identify or change any keywords\n * meaning that if you pass in a known keyword the same value will be returned.\n * This is a simplified version\n * @param name - The name to validate\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function normalizeJsName(name: string): string {\n    let value = name;\n\n    if (value && isString(value)) {\n        // CamelCase everything after the \"-\" and remove the dash\n        value = value.replace(rCamelCase, function (_all, letter) {\n            return letter.toUpperCase();\n        });\n\n        value = value.replace(rNormalizeInvalid, \"_\");\n        value = value.replace(rLeadingNumeric, function(_all, match) {\n            return \"_\" + match;\n        });\n    }\n\n    return value;\n}\n\n/**\n * A simple wrapper (for minification support) to check if the value contains the search string.\n * @param value - The string value to check for the existence of the search value\n * @param search - The value search within the value\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function strContains(value: string, search: string): boolean {\n    if (value && search) {\n        return strIndexOf(value, search) !== -1;\n    }\n\n    return false;\n}\n\n/**\n * Convert a date to I.S.O. format in IE8\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function toISOString(date: Date) {\n    return date && date.toISOString() || STR_EMPTY;\n}\n\nexport const deepFreeze: <T>(obj: T) => T = objDeepFreeze;\n\n/**\n * Returns the name of object if it's an Error. Otherwise, returns empty string.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function getExceptionName(object: any): string {\n    if (isError(object)) {\n        return object.name;\n    }\n\n    return STR_EMPTY;\n}\n\n/**\n * Sets the provided value on the target instance using the field name when the provided chk function returns true, the chk\n * function will only be called if the new value is no equal to the original value.\n * @param target - The target object\n * @param field - The key of the target\n * @param value - The value to set\n * @param valChk - [Optional] Callback to check the value that if supplied will be called check if the new value can be set\n * @param srcChk - [Optional] Callback to check to original value that if supplied will be called if the new value should be set (if allowed)\n * @returns The existing or new value, depending what was set\n */\nexport function setValue<T, K extends keyof T>(target: T, field: K, value: T[K], valChk?: ((value: T[K]) => boolean) | null, srcChk?: ((value: T[K]) => boolean) | null) {\n    let theValue = value;\n    if (target) {\n        theValue = target[field];\n        if (theValue !== value && (!srcChk || srcChk(theValue)) && (!valChk || valChk(value))) {\n            theValue = value;\n            target[field] = theValue;\n        }\n    }\n\n    return theValue;\n}\n\n/**\n * Returns the current value from the target object if not null or undefined otherwise sets the new value and returns it\n * @param target - The target object to return or set the default value\n * @param field - The key for the field to set on the target\n * @param defValue - [Optional] The value to set if not already present, when not provided a empty object will be added\n */\nexport function getSetValue<T, K extends keyof T>(target: T, field: K, defValue?: T[K]): T[K] {\n    let theValue;\n    if (target) {\n        theValue = target[field];\n        if (!theValue && isNullOrUndefined(theValue)) {\n            // Supports having the default as null\n            theValue = !isUndefined(defValue) ? defValue : {} as any;\n            target[field] = theValue;\n        }\n    } else {\n        // Expanded for performance so we only check defValue if required\n        theValue = !isUndefined(defValue) ? defValue : {} as any;\n    }\n\n    return theValue;\n}\n\nfunction _createProxyFunction<S>(source: S | (() => S), funcName: (keyof S)) {\n    let srcFunc: () => S = null;\n    let src: S = null;\n    if (isFunction (source)) {\n        srcFunc = source;\n    } else {\n        src = source;\n    }\n\n    return function() {\n        // Capture the original arguments passed to the method\n        var originalArguments = arguments;\n        if (srcFunc) {\n            src = srcFunc();\n        }\n\n        if (src) {\n            return (src[funcName] as any).apply(src, originalArguments);\n        }\n    }\n}\n\n/**\n * Effectively assigns all enumerable properties (not just own properties) and functions (including inherited prototype) from\n * the source object to the target, it attempts to use proxy getters / setters (if possible) and proxy functions to avoid potential\n * implementation issues by assigning prototype functions as instance ones\n *\n * This method is the primary method used to \"update\" the snippet proxy with the ultimate implementations.\n *\n * Special ES3 Notes:\n * Updates (setting) of direct property values on the target or indirectly on the source object WILL NOT WORK PROPERLY, updates to the\n * properties of \"referenced\" object will work (target.context.newValue = 10 =\\> will be reflected in the source.context as it's the\n * same object). ES3 Failures: assigning target.myProp = 3 -\\> Won't change source.myProp = 3, likewise the reverse would also fail.\n * @param target - The target object to be assigned with the source properties and functions\n * @param source - The source object which will be assigned / called by setting / calling the targets proxies\n * @param chkSet - An optional callback to determine whether a specific property/function should be proxied\n */\nexport function proxyAssign<T, S>(target: T, source: S, chkSet?: (name: string, isFunc?: boolean, source?: S, target?: T) => boolean) {\n    if (target && source && isObject(target) && isObject(source)) {\n        // effectively apply/proxy full source to the target instance\n        for (const field in source) {\n            if (isString(field)) {\n                let value = source[field] as any;\n                if (isFunction(value)) {\n                    if (!chkSet || chkSet(field, true, source, target)) {\n                        // Create a proxy function rather than just copying the (possible) prototype to the new object as an instance function\n                        target[field as string] = _createProxyFunction(source, field);\n                    }\n                } else if (!chkSet || chkSet(field, false, source, target)) {\n                    if (objHasOwn(target, field)) {\n                        // Remove any previous instance property\n                        delete (target as any)[field];\n                    }\n\n                    objDefine<any>(target, field, {\n                        g: () => {\n                            return source[field];\n                        },\n                        s: (theValue) => {\n                            source[field] = theValue;\n                        }\n                    });\n                }\n            }\n        }\n    }\n\n    return target;\n}\n\n/**\n * Creates a proxy function on the target which internally will call the source version with all arguments passed to the target method.\n *\n * @param target - The target object to be assigned with the source properties and functions\n * @param name - The function name that will be added on the target\n * @param source - The source object which will be assigned / called by setting / calling the targets proxies\n * @param theFunc - The function name on the source that will be proxied on the target\n * @param overwriteTarget - If `false` this will not replace any pre-existing name otherwise (the default) it will overwrite any existing name\n */\nexport function proxyFunctionAs<T, S>(target: T, name: string, source: S | (() => S), theFunc: (keyof S), overwriteTarget?: boolean) {\n    if (target && name && source) {\n        if (overwriteTarget !== false || isUndefined(target[name])) {\n            (target as any)[name] = _createProxyFunction(source, theFunc);\n        }\n    }\n}\n\n/**\n * Creates proxy functions on the target which internally will call the source version with all arguments passed to the target method.\n *\n * @param target - The target object to be assigned with the source properties and functions\n * @param source - The source object which will be assigned / called by setting / calling the targets proxies\n * @param functionsToProxy - An array of function names that will be proxied on the target\n * @param overwriteTarget - If false this will not replace any pre-existing name otherwise (the default) it will overwrite any existing name\n */\nexport function proxyFunctions<T, S>(target: T, source: S | (() => S), functionsToProxy: (keyof S)[], overwriteTarget?: boolean) {\n    if (target && source && isObject(target) && isArray(functionsToProxy)) {\n        arrForEach(functionsToProxy, (theFuncName) => {\n            if (isString(theFuncName)) {\n                proxyFunctionAs(target, theFuncName, source, theFuncName, overwriteTarget);\n            }\n        });\n    }\n\n    return target;\n}\n\n/**\n * Simpler helper to create a dynamic class that implements the interface and populates the values with the defaults.\n * Only instance properties (hasOwnProperty) values are copied from the defaults to the new instance\n * @param defaults - Simple helper\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function createClassFromInterface<T>(defaults?: T) {\n    return class {\n        constructor() {\n            if (defaults) {\n                objForEachKey(defaults, (field, value) => {\n                    (this as any)[field] = value;\n                });\n            }\n        }\n    } as new () => T;\n}\n\n/**\n * Set the type of the object by defining the toStringTag well known symbol, this will impact the\n * Object.prototype.toString.call() results for the object. And can be used to identify the type\n * in the debug output and also in the DevTools watchers window when inspecting the object etc.\n * @param target - The object to set the toStringTag symbol on\n * @param nameOrFunc - The name or function to use for the toStringTag\n * @returns The target object\n */\nexport function setObjStringTag<T>(target: T, nameOrFunc: string | (() => string)): T {\n    safe(objDefine, [target, getKnownSymbol(WellKnownSymbols.toStringTag), isFunction(nameOrFunc) ? { g: nameOrFunc, e: false } : { v: nameOrFunc, w: false, e: false }]);\n\n    return target;\n}\n\n/**\n * Introduce an intermediate prototype to the target object and that sets the toStringTag on that prototype,\n * this avoids directly modifying the target object and also allows multiple different \"types\" to be\n * applied to the same target object if required.\n * This is done as a best effort approach and may not always succeed due to security / object model restrictions\n * So if it fails then it will fallback to just defining the toStringTag on the target object, which also may fail\n * resulting in no change.\n * @param target - The object to set the toStringTag symbol on\n * @param name - The name or function to use for the toStringTag\n * @returns The target object\n */\nexport function setProtoTypeName<T>(target: T, name: string): T {\n    if (target) {\n        let proto = _getObjProto(target);\n        let done = false;\n        if (proto) {\n            // Set the target's prototype to the new intermediate prototype\n            safe(() => {\n                // Create a new intermediate prototype that extends the current prototype\n                let newProto = setObjStringTag(objCreate(proto), name);\n                if (!_ProtoNameTag) {\n                    // Note: Using a cached value instead of a lazy value as we want to ensure that the namespace is consistent\n                    // across multiple calls as the `getLazy()` supports runtime invalidation via `setBypassLazyCache()` which would\n                    // result in different namespaces being returned.\n                    _ProtoNameTag = createCachedValue(newSymbol(\"ai$ProtoName\"));\n                }\n\n                // Tag this new prototype\n                objDefine(newProto, _ProtoNameTag.v as any, {\n                    v: true,\n                    w: false,\n                    e: false\n                });\n                \n                objSetPrototypeOf(target, newProto);\n                done = true;\n            });\n        }\n\n        if (!done) {\n            // Either no prototype or we failed to set it so just define the toStringTag on the target\n            safe(setObjStringTag, [target, name]);\n        }\n    }\n\n    return target;\n}\n\n/**\n * Update the introduced intermediate prototype name of the target object.\n * @param target - The object to look for the prototype name and update\n * @param name - The updated name to apply\n * @returns The target Object\n */\nexport function updateProtoTypeName<T>(target: T, name: string): T {\n    if (_ProtoNameTag) {\n        // Find the Parent Proto\n        while (target && target !== ObjProto && !(target as any)[_ProtoNameTag.v]) {\n            let protoTarget = objGetPrototypeOf(target);\n            if (target === protoTarget) {\n                // Break out of any recursive case (happens on some runtimes) where the prototype of an\n                // object is the same prototype\n                break;\n            }\n            target = protoTarget;\n        }\n\n        if ((target as any)[_ProtoNameTag.v]) {\n            // Found it so update\n            safe(setObjStringTag, [target, name]);\n        }\n    }\n\n    return target;\n}\n\n/**\n * A helper function to assist with JIT performance for objects that have properties added / removed dynamically\n * this is primarily for chromium based browsers and has limited effects on Firefox and none of IE. Only call this\n * function after you have finished \"updating\" the object, calling this within loops reduces or defeats the benefits.\n * This helps when iterating using for..in, objKeys() and objForEach()\n * @param theObject - The object to be optimized if possible\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function optimizeObject<T>(theObject: T): T {\n    // V8 Optimization to cause the JIT compiler to create a new optimized object for looking up the own properties\n    // primarily for object with <= 19 properties for >= 20 the effect is reduced or non-existent\n    if (theObject && ObjAssign) {\n        theObject = ObjClass(ObjAssign({}, theObject));\n    }\n\n    return theObject;\n}\n\n/**\n * Pass in the objects to merge as arguments, this will only \"merge\" (extend) properties that are owned by the object.\n * It will NOT merge inherited or non-enumerable properties.\n * @param obj1 - object to merge.  Set this argument to 'true' for a deep extend.\n * @param obj2 - object to merge.\n * @param obj3 - object to merge.\n * @param obj4 - object to merge.\n * @param obj5 - object to merge.\n * @returns The extended first object.\n */\nexport function objExtend<T2, T3, T4, T5, T6>(deepExtend?: boolean, obj2?: T2, obj3?: T3, obj4?: T4, obj5?: T5, obj6?: T6): T2 & T3 & T4 & T5 & T6\nexport function objExtend<T1, T2, T3, T4, T5, T6>(obj1?: T1, obj2?: T2, obj3?: T3, obj4?: T4, obj5?: T5, obj6?: T6): T1 & T2 & T3 & T4 & T5 & T6\nexport function objExtend<T1, T2, T3, T4, T5, T6>(obj1?: T1 | any, obj2?: T2, obj3?: T3, obj4?: T4, obj5?: T5, obj6?: T6): T1 & T2 & T3 & T4 & T5 & T6 {\n    // Variables\n    let theArgs = arguments as any;\n    let extended: T1 & T2 & T3 & T4 & T5 & T6 = theArgs[0] || {};\n    let argLen = theArgs.length;\n    let deep = false;\n    let idx = 1;\n\n    // Check for \"Deep\" flag\n    if (argLen > 0 && isBoolean(extended)) {\n        deep = extended;\n        extended = theArgs[idx] || {};\n        idx++;\n    }\n\n    // Handle case when target is a string or something (possible in deep copy)\n    if (!isObject(extended)) {\n        extended = {} as T1 & T2 & T3 & T4 & T5 & T6;\n    }\n\n    // Loop through each remaining object and conduct a merge\n    for (; idx < argLen; idx++ ) {\n        let arg = theArgs[idx];\n        let isArgArray = isArray(arg);\n        let isArgObj = isObject(arg);\n        for (let prop in arg) {\n            let propOk = (isArgArray && (prop in arg)) || (isArgObj && objHasOwn(arg, prop));\n            if (!propOk) {\n                continue;\n            }\n\n            let newValue = arg[prop];\n            let isNewArray: boolean;\n\n            // If deep merge and property is an object, merge properties\n            if (deep && newValue && ((isNewArray = isArray(newValue)) || isPlainObject(newValue))) {\n                // Grab the current value of the extended object\n                let clone = extended[prop];\n\n                if (isNewArray) {\n                    if (!isArray(clone)) {\n                        // We can't \"merge\" an array with a non-array so overwrite the original\n                        clone = [];\n                    }\n                } else if (!isPlainObject(clone)) {\n                    // We can't \"merge\" an object with a non-object\n                    clone = {};\n                }\n\n                // Never move the original objects always clone them\n                newValue = objExtend(deep, clone, newValue);\n            }\n\n            // Assign the new (or previous) value (unless undefined)\n            if (newValue !== undefined) {\n                extended[prop] = newValue;\n            }\n        }\n    }\n\n    return extended;\n}\n\nexport const asString = asString21;\n\n/**\n * Checks if the feature is enabled on not. If the feature is not defined, it will return the default state if provided or undefined.\n * If the feature is defined, it will check the mode and return true if the mode is enable or false if the mode is disable.\n * @param feature - The feature name to check\n * @param cfg - The configuration object to check the feature state against\n * @param sdkDefaultState - Optional default state to return if the feature is not defined\n * @returns True if the feature is enabled, false if the feature is disabled, or undefined if the feature is not defined and no default state is provided.\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isFeatureEnabled<T extends IConfiguration = IConfiguration>(feature?: string, cfg?: T, sdkDefaultState?: boolean): boolean | undefined {\n    let ft = cfg && cfg.featureOptIn && cfg.featureOptIn[feature];\n    if (feature && ft) {\n        let mode = ft.mode;\n        // NOTE: None will be considered as true\n        if (mode === FeatureOptInMode.enable) {\n            return true\n        } else if (mode === FeatureOptInMode.disable) {\n            return false;\n        }\n    }\n\n    // Return the default state if provided or undefined\n    return sdkDefaultState;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function getResponseText(xhr: XMLHttpRequest | IXDomainRequest) {\n    try {\n        return xhr.responseText;\n    } catch (e) {\n        // Best effort, as XHR may throw while XDR wont so just ignore\n    }\n\n    return null;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function formatErrorMessageXdr(xdr: IXDomainRequest, message?: string): string {\n    if (xdr) {\n        return \"XDomainRequest,Response:\" + getResponseText(xdr) || STR_EMPTY;\n    }\n\n    return message;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function formatErrorMessageXhr(xhr: XMLHttpRequest, message?: string): string {\n    if (xhr) {\n        return \"XMLHttpRequest,Status:\" + xhr.status + \",Response:\" + getResponseText(xhr) || xhr.response || STR_EMPTY;\n    }\n\n    return message;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function prependTransports(theTransports: TransportType[], newTransports: TransportType | TransportType[]) {\n    if (newTransports) {\n        if (isNumber(newTransports)) {\n            theTransports = [newTransports as TransportType].concat(theTransports);\n        } else if (isArray(newTransports)) {\n            theTransports = newTransports.concat(theTransports);\n        }\n    }\n    return theTransports;\n}\n\nconst strDisabledPropertyName: string = \"Microsoft_ApplicationInsights_BypassAjaxInstrumentation\";\nconst strWithCredentials: string = \"withCredentials\";\nconst strTimeout: string = \"timeout\";\n\n/**\n * Create and open an XMLHttpRequest object\n * @param method - The request method\n * @param urlString - The url\n * @param withCredentials - Option flag indicating that credentials should be sent\n * @param disabled - Optional flag indicating that the XHR object should be marked as disabled and not tracked (default is false)\n * @param isSync - Optional flag indicating if the instance should be a synchronous request (defaults to false)\n * @param timeout - Optional value identifying the timeout value that should be assigned to the XHR request\n * @returns A new opened XHR request\n */\nexport function openXhr(method: string, urlString: string, withCredentials?: boolean, disabled: boolean = false, isSync: boolean = false, timeout?: number) {\n\n    function _wrapSetXhrProp<T>(xhr: XMLHttpRequest, prop: string, value: T) {\n        try {\n            xhr[prop] = value;\n        } catch (e) {\n            // - Wrapping as depending on the environment setting the property may fail (non-terminally)\n        }\n    }\n\n    let xhr = new XMLHttpRequest();\n\n    if (disabled) {\n        // Tag the instance so it's not tracked (trackDependency)\n        // If the environment has locked down the XMLHttpRequest (preventExtensions and/or freeze), this would\n        // cause the request to fail and we no telemetry would be sent\n        _wrapSetXhrProp(xhr, strDisabledPropertyName, disabled);\n    }\n\n    if (withCredentials) {\n        // Some libraries require that the withCredentials flag is set \"before\" open and\n        // - Wrapping as IE 10 has started throwing when setting before open\n        _wrapSetXhrProp(xhr, strWithCredentials, withCredentials);\n    }\n\n    xhr.open(method, urlString, !isSync);\n\n    if (withCredentials) {\n        // withCredentials should be set AFTER open (https://xhr.spec.whatwg.org/#the-withcredentials-attribute)\n        // And older firefox instances from 11+ will throw for sync events (current versions don't) which happens during unload processing\n        _wrapSetXhrProp(xhr, strWithCredentials, withCredentials);\n    }\n\n    // Only set the timeout for asynchronous requests as\n    // \"Timeout shouldn't be used for synchronous XMLHttpRequests requests used in a document environment or it will throw an InvalidAccessError exception.\"\"\n    // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout\n    if (!isSync && timeout) {\n        _wrapSetXhrProp(xhr, strTimeout, timeout);\n    }\n\n    return xhr;\n}\n\n/**\n* Converts the XHR getAllResponseHeaders to a map containing the header key and value.\n* @internal\n*/\n// tslint:disable-next-line: align\n/*#__NO_SIDE_EFFECTS__*/\nexport function convertAllHeadersToMap(headersString: string): { [headerName: string]: string } {\n    let headers:any = {};\n    if (isString(headersString)) {\n        let headersArray = strTrim(headersString).split(/[\\r\\n]+/);\n        arrForEach(headersArray, (headerEntry) => {\n            if (headerEntry) {\n                let idx = strIndexOf(headerEntry, \": \");\n                if (idx !== -1) {\n                    // The new spec has the headers returning all as lowercase -- but not all browsers do this yet\n                    let header = strTrim(headerEntry.substring(0, idx)).toLowerCase();\n                    let value = strTrim(headerEntry.substring(idx + 1));\n                    headers[header] = value;\n                } else {\n                    headers[strTrim(headerEntry)] = 1;\n                }\n            }\n        });\n    }\n\n    return headers;\n}\n\n/**\n* append the XHR headers.\n* @internal\n*/\nexport function _appendHeader(theHeaders: any, xhr: XMLHttpRequest, name: string) {\n    if (!theHeaders[name] && xhr && xhr.getResponseHeader) {\n        let value = xhr.getResponseHeader(name);\n        if (value) {\n            theHeaders[name] = strTrim(value);\n        }\n    }\n\n    return theHeaders;\n}\n\nconst STR_KILL_DURATION_HEADER = \"kill-duration\";\nconst STR_KILL_DURATION_SECONDS_HEADER = \"kill-duration-seconds\";\nconst STR_TIME_DELTA_HEADER = \"time-delta-millis\";\n/**\n* get the XHR getAllResponseHeaders.\n* @internal\n*/\nexport function _getAllResponseHeaders(xhr: XMLHttpRequest, isOneDs?: boolean) {\n    let theHeaders = {};\n\n    if (!xhr.getAllResponseHeaders) {\n        // Firefox 2-63 doesn't have getAllResponseHeaders function but it does have getResponseHeader\n        // Only call these if getAllResponseHeaders doesn't exist, otherwise we can get invalid response errors\n        // as collector is not currently returning the correct header to allow JS to access these headers\n        if (!!isOneDs) {\n            theHeaders = _appendHeader(theHeaders, xhr, STR_TIME_DELTA_HEADER);\n            theHeaders = _appendHeader(theHeaders, xhr, STR_KILL_DURATION_HEADER);\n            theHeaders = _appendHeader(theHeaders, xhr, STR_KILL_DURATION_SECONDS_HEADER);\n        }\n    \n    } else {\n        theHeaders = convertAllHeadersToMap(xhr.getAllResponseHeaders());\n    }\n\n    return theHeaders;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function stringToBoolOrDefault(str: any, defaultValue = false): boolean {\n    if (str === undefined || str === null) {\n        return defaultValue;\n    }\n\n    return str.toString().toLowerCase() === \"true\";\n}\n\n/**\n * Convert ms to c# time span format\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function msToTimeSpan(totalms: number | string): string {\n    if (isTimeSpan(totalms)) {\n        // Already in time span format\n        return totalms;\n    }\n\n    if (isNaN(totalms) || totalms < 0) {\n        totalms = 0;\n    }\n\n    totalms = mathRound(totalms);\n\n    let ms = STR_EMPTY + totalms % 1000;\n    let sec = STR_EMPTY + mathFloor(totalms / 1000) % 60;\n    let min = STR_EMPTY + mathFloor(totalms / (1000 * 60)) % 60;\n    let hour = STR_EMPTY + mathFloor(totalms / (1000 * 60 * 60)) % 24;\n    const days = mathFloor(totalms / (1000 * 60 * 60 * 24));\n\n    ms = ms.length === 1 ? \"00\" + ms : ms.length === 2 ? \"0\" + ms : ms;\n    sec = sec.length < 2 ? \"0\" + sec : sec;\n    min = min.length < 2 ? \"0\" + min : min;\n    hour = hour.length < 2 ? \"0\" + hour : hour;\n\n    return (days > 0 ? days + \".\" : STR_EMPTY) + hour + \":\" + min + \":\" + sec + \".\" + ms;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function getExtensionByName(extensions: IPlugin[], identifier: string): IPlugin | null {\n    let extension: IPlugin = null;\n    arrForEach(extensions, (value) => {\n        if (value.identifier === identifier) {\n            extension = value;\n            return -1;\n        }\n    });\n\n    return extension;\n}\n\n/*#__NO_SIDE_EFFECTS__*/\nexport function isCrossOriginError(message: string|Event, url: string, lineNumber: number, columnNumber: number, error: Error | Event): boolean {\n    return !error && isString(message) && (message === \"Script error.\" || message === \"Script error\");\n}\n\n/**\n * A helper method to determine whether the provided value is in a ISO time span format (DD.HH:MM:SS.MMMMMM)\n * @param value - The value to check\n * @returns True if the value is in a time span format; false otherwise\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isTimeSpan(value: any): value is string {\n    let result = false;\n\n    if (isString(value)) {\n        const parts = strSplit(value, \":\");\n        if (parts.length === 3) {\n            // Looks like a candidate, now validate each part\n            const daysHours = strSplit(parts[0], \".\");\n            if (daysHours.length === 2) {\n                result = !isNaN(parseInt(daysHours[0] || \"0\")) && !isNaN(parseInt(daysHours[1] || \"0\"));\n            } else {\n                result = !isNaN(parseInt(daysHours[0] || \"0\"));\n            }\n\n            result = result && !isNaN(parseInt(parts[1] || \"0\"));\n\n            const secondsParts = strSplit(parts[2], \".\");\n            if (secondsParts.length === 2) {\n                result = result && !isNaN(parseInt(secondsParts[0] || \"0\")) && !isNaN(parseInt(secondsParts[1] || \"0\"));\n            } else {\n                result = result && !isNaN(parseInt(secondsParts[0] || \"0\"));\n            }\n        }\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/Offline.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, arrIndexOf, getDocument, getNavigator, getWindow, isNullOrUndefined, isUndefined } from \"@nevware21/ts-utils\";\nimport { IUnloadHook } from \"../interfaces/ai/IUnloadHook\";\nimport { eventOff, eventOn, mergeEvtNamespace } from \"../internal/EventHelpers\";\nimport { createUniqueNamespace } from \"./DataCacheHelper\";\n\n/**\n * this is the callback that will be called when the network status changes\n * @param onlineState - this is the current network running state\n */\nexport type OfflineCallback = (onlineState: IOfflineState) => void;\n\n/**\n * This is the enum for the different network states current ai is experiencing\n */\nexport const enum eOfflineValue {\n    Unknown = 0,\n    Online = 1,\n    Offline = 2\n}\n/**\n * This is the interface for the Offline state\n * runtime state is retrieved from the browser state\n * user state is set by the user\n*/\nexport interface IOfflineState {\n    readonly isOnline: boolean;\n    readonly rState: eOfflineValue; // runtime state\n    readonly uState: eOfflineValue; // user state\n}\n\nexport interface IOfflineListener {\n    isOnline: () => boolean;\n    isListening: () => boolean;\n    unload: () => void;\n    addListener: (callback: OfflineCallback) => IUnloadHook;\n    setOnlineState : (uState: eOfflineValue) => void;\n}\n\nfunction _disableEvents(target: any, evtNamespace: string | string[]) {\n    eventOff(target, null, null, evtNamespace);\n}\n\n/**\n * Create a new OfflineListener instance to monitor browser online / offline events\n * @param parentEvtNamespace - The parent event namespace to append to any specific events for this instance\n */\nexport function createOfflineListener(parentEvtNamespace?: string | string[]): IOfflineListener {\n    let _document = getDocument();\n    var _navigator = getNavigator();        // Gets the window.navigator or workerNavigator depending on the global\n    let _isListening: boolean = false;\n    let listenerList: OfflineCallback[] = [];\n\n    // Set the initial state\n    // rState is changed by the browser, both via events and when we check the navigator.onLine property\n    let rState: eOfflineValue = eOfflineValue.Online;\n    if (_navigator && !isNullOrUndefined(_navigator.onLine) && !_navigator.onLine) { // navigator.onLine is undefined in react-native\n        rState = eOfflineValue.Offline;\n    }\n\n    // ustate is changed by the user calling setOnlineState\n    let uState: eOfflineValue = eOfflineValue.Unknown;\n    // current state would be updated each time rState or uState is changed\n    // it is a resolved value of rState and uState\n    let _currentState: boolean = calCurrentState();\n\n    let _evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"OfflineListener\"), parentEvtNamespace);\n\n    try {\n        if (_enableEvents(getWindow())) {\n            _isListening = true;\n        }\n        \n        if (_document) {\n            // Also attach to the document.body or document\n            let target:any = _document.body || _document;\n\n            if (target.ononline) {\n                if (_enableEvents(target)) {\n                    _isListening = true;\n                }\n            }\n        }\n    } catch (e) {\n        // this makes react-native less angry\n        _isListening = false;\n    }\n\n    function _enableEvents(target: any): boolean {\n        let enabled = false;\n        if (target) {\n            enabled = eventOn(target, \"online\", _setOnline, _evtNamespace);\n            if (enabled) {\n                eventOn(target, \"offline\", _setOffline, _evtNamespace);\n            }\n        }\n        return enabled;\n    }\n\n    function _isOnline(){\n        return _currentState;\n    }\n\n    function calCurrentState(){\n        if (uState === eOfflineValue.Offline || rState === eOfflineValue.Offline){\n            return false;\n        }\n        return true; // if both unknown, then we assume the network is good\n    }\n\n    function listnerNoticeCheck(){\n        // we were offline and are now online or we were online and now offline\n        let newState = calCurrentState();\n        if (_currentState !== newState) {\n            _currentState = newState; // use the resolved state to update\n            // send all the callbacks with the current state\n            arrForEach(listenerList, (callback: OfflineCallback) => {\n                let offlineState: IOfflineState = {\n                    isOnline: _currentState,\n                    rState: rState,\n                    uState: uState\n                };\n                try {\n                    callback(offlineState);\n                } catch (e) {\n                    // Do nothing, just making sure we run all of the callbacks\n                }\n            });\n        }\n    }\n\n    function setOnlineState (newState: eOfflineValue){\n        uState = newState;\n        listnerNoticeCheck();\n    }\n\n    function _setOnline() {\n        rState = eOfflineValue.Online;\n        listnerNoticeCheck();\n    }\n\n    function _setOffline() {\n        rState = eOfflineValue.Offline;\n        listnerNoticeCheck();\n    }\n\n    function _unload() {\n        let win = getWindow();\n        if (win && _isListening) {\n            _disableEvents(win, _evtNamespace);\n\n            if (_document) {\n                // Also attach to the document.body or document\n                let target:any = _document.body || _document;\n                if (!isUndefined(target.ononline)) {\n                    _disableEvents(target, _evtNamespace);\n                }\n            }\n            _isListening = false;\n        }\n    }\n\n    function addListener(callback: OfflineCallback) {\n        listenerList.push(callback);\n        // Define rm as an instance of IUnloadHook\n        return {\n            rm: () => {\n                let index = arrIndexOf(listenerList, callback);\n                if (index > -1){\n                    return listenerList.splice(index, 1);\n                } else {\n                    return;\n                }\n            }\n        };\n    }\n\n    return {\n        isOnline: _isOnline,\n        isListening: () => _isListening,\n        unload: _unload,\n        addListener: addListener,\n        setOnlineState : setOnlineState\n    };\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/RandomHelper.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { mathFloor, mathRandom, utcNow } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { getCrypto, getMsCrypto, isIE } from \"./EnvUtils\";\n\nconst UInt32Mask = 0x100000000;\nconst MaxUInt32 = 0xffffffff;\nconst SEED1 = 123456789;\nconst SEED2 = 987654321;\n\n// MWC based Random generator (for IE)\nlet _mwcSeeded = false;\nlet _mwcW = SEED1;\nlet _mwcZ = SEED2;\n\n// Takes any integer\nfunction _mwcSeed(seedValue: number) {\n    if (seedValue < 0) {\n        // Make sure we end up with a positive number and not -ve one.\n        seedValue >>>= 0;\n    }\n\n    _mwcW = (SEED1 + seedValue) & MaxUInt32;\n    _mwcZ = (SEED2 - seedValue) & MaxUInt32;\n    _mwcSeeded = true;\n}\n\nfunction _autoSeedMwc() {\n    // Simple initialization using default Math.random() - So we inherit any entropy from the browser\n    // and bitwise XOR with the current milliseconds\n    try {\n        const now = utcNow() & 0x7fffffff;\n        _mwcSeed(((mathRandom() * UInt32Mask) ^ now) + now);\n    } catch (e) {\n        // Don't crash if something goes wrong\n    }\n}\n\n/**\n * Generate a random value between 0 and maxValue, max value should be limited to a 32-bit maximum.\n * So maxValue(16) will produce a number from 0..16 (range of 17)\n * @param maxValue - The max value for the range\n */\nexport function randomValue(maxValue: number) {\n    if (maxValue > 0) {\n        return mathFloor((random32() / MaxUInt32) * (maxValue + 1)) >>> 0;\n    }\n\n    return 0;\n}\n\n/**\n * generate a random 32-bit number (0x000000..0xFFFFFFFF) or (-0x80000000..0x7FFFFFFF), defaults un-unsigned.\n * @param signed - True to return a signed 32-bit number (-0x80000000..0x7FFFFFFF) otherwise an unsigned one (0x000000..0xFFFFFFFF)\n */\nexport function random32(signed?: boolean) {\n    let value = 0;\n    let c = getCrypto() || getMsCrypto();\n    if (c && c.getRandomValues) {\n        // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF)\n        value = c.getRandomValues(new Uint32Array(1))[0] & MaxUInt32;\n    }\n    \n    if (value === 0 && isIE()) {\n        // For IE 6, 7, 8 (especially on XP) Math.random is not very random\n        if (!_mwcSeeded) {\n            // Set the seed for the Mwc algorithm\n            _autoSeedMwc();\n        }\n\n        // Don't use Math.random for IE\n        // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF)\n        value = mwcRandom32() & MaxUInt32;\n    }\n\n    if (value === 0) {\n        // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF)\n        value = mathFloor((UInt32Mask * mathRandom()) | 0);\n    }\n\n    if (!signed) {\n        // Make sure we end up with a positive number and not -ve one.\n        value >>>= 0;\n    }\n\n    return value;\n}\n\n/**\n * Seed the MWC random number generator with the specified seed or a random value\n * @param value - optional the number to used as the seed, if undefined, null or zero a random value will be chosen\n */\nexport function mwcRandomSeed(value?: number) {\n    if (!value) {\n        _autoSeedMwc();\n    } else {\n        _mwcSeed(value);\n    }\n}\n\n/**\n * Generate a random 32-bit number between (0x000000..0xFFFFFFFF) or (-0x80000000..0x7FFFFFFF), using MWC (Multiply with carry)\n * instead of Math.random() defaults to un-signed.\n * Used as a replacement random generator for IE to avoid issues with older IE instances.\n * @param signed - True to return a signed 32-bit number (-0x80000000..0x7FFFFFFF) otherwise an unsigned one (0x000000..0xFFFFFFFF)\n */\nexport function mwcRandom32(signed?: boolean) {\n    _mwcZ = (36969 * (_mwcZ & 0xFFFF) + (_mwcZ >> 16)) & MaxUInt32;\n    _mwcW = (18000 * (_mwcW & 0xFFFF) + (_mwcW >> 16)) & MaxUInt32;\n\n    let value = (((_mwcZ << 16) + (_mwcW & 0xFFFF)) >>> 0) & MaxUInt32 | 0;\n\n    if (!signed) {\n        // Make sure we end up with a positive number and not -ve one.\n        value >>>= 0;\n    }\n\n    return value;\n}\n\n/**\n * Generate random base64 id string.\n * The default length is 22 which is 132-bits so almost the same as a GUID but as base64 (the previous default was 5)\n * @param maxLength - Optional value to specify the length of the id to be generated, defaults to 22\n */\nexport function newId(maxLength = 22): string {\n    const base64chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n    // Start with an initial random number, consuming the value in reverse byte order\n    let number = random32() >>> 0;  // Make sure it's a +ve number\n    let chars = 0;\n    let result = STR_EMPTY;\n    while (result.length < maxLength) {\n        chars ++;\n        result += base64chars.charAt(number & 0x3F);\n        number >>>= 6;              // Zero fill with right shift\n        if (chars === 5) {\n            // 5 base64 characters === 30 bits so we don't have enough bits for another base64 char\n            // So add on another 30 bits and make sure it's +ve\n            number = (((random32() << 2) & 0xFFFFFFFF) | (number & 0x03)) >>> 0;\n            chars = 0;      // We need to reset the number every 5 chars (30 bits)\n        }\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/StorageHelperFuncs.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { dumpObj, getGlobal, getInst as getGlobalInst, isNullOrUndefined, objForEachKey } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { _throwInternal } from \"../diagnostics/DiagnosticLogger\";\nimport { StorageType } from \"../enums/ai/Enums\";\nimport { _eInternalMessageId, eLoggingSeverity } from \"../enums/ai/LoggingEnums\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { getExceptionName } from \"./HelperFuncs\";\n\nlet _canUseLocalStorage: boolean = undefined;\nlet _canUseSessionStorage: boolean = undefined;\nlet _storagePrefix: string = STR_EMPTY;\n\n/**\n * Gets the localStorage object if available\n * @returns {Storage} - Returns the storage object if available else returns null\n */\nfunction _getLocalStorageObject(): Storage {\n    if (utlCanUseLocalStorage()) {\n        return _getVerifiedStorageObject(StorageType.LocalStorage);\n    }\n\n    return null;\n}\n\n/**\n * Tests storage object (localStorage or sessionStorage) to verify that it is usable\n * More details here: https://mathiasbynens.be/notes/localstorage-pattern\n * @param storageType - Type of storage\n * @returns {Storage} Returns storage object verified that it is usable\n */\nfunction _getVerifiedStorageObject(storageType: StorageType): Storage {\n    try {\n        if (isNullOrUndefined(getGlobal())) {\n            return null;\n        }\n        let uid = (new Date).toString();\n        let storage: Storage = getGlobalInst(storageType === StorageType.LocalStorage ? \"localStorage\" : \"sessionStorage\");\n        let name:string = _storagePrefix + uid;\n        storage.setItem(name, uid);\n        let fail = storage.getItem(name) !== uid;\n        storage.removeItem(name);\n        if (!fail) {\n            return storage;\n        }\n    } catch (exception) {\n        // eslint-disable-next-line no-empty\n    }\n\n    return null;\n}\n\n/**\n * Gets the sessionStorage object if available\n * @returns {Storage} - Returns the storage object if available else returns null\n */\nfunction _getSessionStorageObject(): Storage {\n    if (utlCanUseSessionStorage()) {\n        return _getVerifiedStorageObject(StorageType.SessionStorage);\n    }\n\n    return null;\n}\n\n/**\n * Disables the global SDK usage of local or session storage if available\n */\nexport function utlDisableStorage() {\n    _canUseLocalStorage = false;\n    _canUseSessionStorage = false;\n}\n\nexport function utlSetStoragePrefix(storagePrefix: string) {\n    _storagePrefix = storagePrefix || STR_EMPTY;\n}\n\n/**\n * Re-enables the global SDK usage of local or session storage if available\n */\nexport function utlEnableStorage() {\n    _canUseLocalStorage = utlCanUseLocalStorage(true);\n    _canUseSessionStorage = utlCanUseSessionStorage(true);\n}\n\n/**\n * Returns whether LocalStorage can be used, if the reset parameter is passed a true this will override\n * any previous disable calls.\n * @param reset - Should the usage be reset and determined only based on whether LocalStorage is available\n */\nexport function utlCanUseLocalStorage(reset?: boolean): boolean {\n    if (reset || _canUseLocalStorage === undefined) {\n        _canUseLocalStorage = !!_getVerifiedStorageObject(StorageType.LocalStorage);\n    }\n\n    return _canUseLocalStorage;\n}\n\nexport function utlGetLocalStorage(logger: IDiagnosticLogger, name: string): string {\n    const storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            return storage.getItem(name);\n        } catch (e) {\n            _canUseLocalStorage = false;\n\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.BrowserCannotReadLocalStorage,\n                \"Browser failed read of local storage. \" + getExceptionName(e),\n                { exception: dumpObj(e) });\n        }\n    }\n    return null;\n}\n\nexport function utlSetLocalStorage(logger: IDiagnosticLogger, name: string, data: string): boolean {\n    const storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            storage.setItem(name, data);\n            return true;\n        } catch (e) {\n            _canUseLocalStorage = false;\n\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.BrowserCannotWriteLocalStorage,\n                \"Browser failed write to local storage. \" + getExceptionName(e),\n                { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\n\nexport function utlRemoveStorage(logger: IDiagnosticLogger, name: string): boolean {\n    const storage = _getLocalStorageObject();\n    if (storage !== null) {\n        try {\n            storage.removeItem(name);\n            return true;\n        } catch (e) {\n            _canUseLocalStorage = false;\n\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.BrowserFailedRemovalFromLocalStorage,\n                \"Browser failed removal of local storage item. \" + getExceptionName(e),\n                { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\n\nexport function utlCanUseSessionStorage(reset?: boolean): boolean {\n    if (reset || _canUseSessionStorage === undefined) {\n        _canUseSessionStorage = !!_getVerifiedStorageObject(StorageType.SessionStorage);\n    }\n\n    return _canUseSessionStorage;\n}\n\nexport function utlGetSessionStorageKeys(): string[] {\n    const keys: string[] = [];\n\n    if (utlCanUseSessionStorage()) {\n        objForEachKey(getGlobalInst<any>(\"sessionStorage\"), (key) => {\n            keys.push(key);\n        });\n    }\n\n    return keys;\n}\n\nexport function utlGetSessionStorage(logger: IDiagnosticLogger, name: string): string {\n    const storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            return storage.getItem(name);\n        } catch (e) {\n            _canUseSessionStorage = false;\n\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.BrowserCannotReadSessionStorage,\n                \"Browser failed read of session storage. \" + getExceptionName(e),\n                { exception: dumpObj(e) });\n        }\n    }\n    return null;\n}\n\nexport function utlSetSessionStorage(logger: IDiagnosticLogger, name: string, data: string): boolean {\n    const storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            storage.setItem(name, data);\n            return true;\n        } catch (e) {\n            _canUseSessionStorage = false;\n\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.BrowserCannotWriteSessionStorage,\n                \"Browser failed write to session storage. \" + getExceptionName(e),\n                { exception: dumpObj(e) });\n        }\n    }\n    return false;\n}\n\nexport function utlRemoveSessionStorage(logger: IDiagnosticLogger, name: string): boolean {\n    const storage = _getSessionStorageObject();\n    if (storage !== null) {\n        try {\n            storage.removeItem(name);\n            return true;\n        } catch (e) {\n            _canUseSessionStorage = false;\n\n            _throwInternal(logger,\n                eLoggingSeverity.WARNING,\n                _eInternalMessageId.BrowserFailedRemovalFromSessionStorage,\n                \"Browser failed removal of session storage item. \" + getExceptionName(e),\n                { exception: dumpObj(e) });\n        }\n    }\n\n    return false;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/TraceParent.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, isArray, isNullOrUndefined, isString, strIndexOf, strLeft, strTrim } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { eW3CTraceFlags } from \"../enums/W3CTraceFlags\";\nimport { ITraceParent } from \"../interfaces/ai/ITraceParent\";\nimport { generateW3CId } from \"./CoreUtils\";\nimport { findMetaTag, findNamedServerTiming } from \"./EnvUtils\";\n\n// using {0,16} for leading and trailing whitespace just to constrain the possible runtime of a random string\nconst TRACE_PARENT_REGEX = /^([\\da-f]{2})-([\\da-f]{32})-([\\da-f]{16})-([\\da-f]{2})(-[^\\s]{1,64})?$/i;\nconst DEFAULT_VERSION = \"00\";\nconst INVALID_VERSION = \"ff\";\nexport const INVALID_TRACE_ID = \"00000000000000000000000000000000\";\nexport const INVALID_SPAN_ID = \"0000000000000000\";\nconst SAMPLED_FLAG = 0x01;\n\nfunction _isValid(value: string, len: number, invalidValue?: string): boolean {\n    if (value && value.length === len && value !== invalidValue) {\n        return !!value.match(/^[\\da-f]*$/i);\n    }\n\n    return false;\n}\n\nfunction _formatValue(value: string, len: number, defValue: string): string {\n    if (_isValid(value, len)) {\n        return value;\n    }\n\n    return defValue;\n}\n\nfunction _formatFlags(value: number): string {\n    if (isNaN(value) || value < 0 || value > 255) {\n        value = 0x01;\n    }\n\n    let result = value.toString(16);\n    while (result.length < 2) {\n        result = \"0\" + result;\n    }\n\n    return result;\n}\n\n/**\n * Create a new ITraceParent instance using the provided values.\n * @param traceId - The traceId to use, when invalid a new random W3C id will be generated.\n * @param spanId - The parent/span id to use, a new random value will be generated if it is invalid.\n * @param flags - The traceFlags to use, defaults to zero (0) if not supplied or invalid\n * @param version - The version to used, defaults to version \"01\" if not supplied or invalid.\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function createTraceParent(traceId?: string, spanId?: string, flags?: number, version?: string): ITraceParent {\n    return {\n        version: _isValid(version, 2, INVALID_VERSION) ? version : DEFAULT_VERSION,\n        traceId: isValidTraceId(traceId) ? traceId : generateW3CId(),\n        spanId: isValidSpanId(spanId) ? spanId : strLeft(generateW3CId(), 16),\n        traceFlags: (!isNullOrUndefined(flags) && flags >= 0 && flags <= 0xFF ? flags : eW3CTraceFlags.Sampled)\n    };\n}\n\n/**\n * Attempt to parse the provided string as a W3C TraceParent header value (https://www.w3.org/TR/trace-context/#traceparent-header)\n *\n * @param value - The value to be parsed\n * @param selectIdx - If the found value is comma separated which is the preferred entry to select, defaults to the first\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function parseTraceParent(value: string, selectIdx?: number): ITraceParent {\n    if (!value) {\n        // Don't pass a null/undefined or empty string\n        return null;\n    }\n\n    if (isArray(value)) {\n        // The value may have been encoded on the page into an array so handle this automatically\n        value = value[0] || STR_EMPTY;\n    }\n\n    if (!value || !isString(value) || value.length > 8192) {\n        // limit potential processing based on total length\n        return null;\n    }\n\n    if (strIndexOf(value, \",\") !== -1) {\n        let values = value.split(\",\");\n        value = values[selectIdx > 0 && values.length > selectIdx ? selectIdx : 0];\n    }\n\n    // See https://www.w3.org/TR/trace-context/#versioning-of-traceparent\n    TRACE_PARENT_REGEX.lastIndex = 0;\n    const match = TRACE_PARENT_REGEX.exec(strTrim(value));\n    if (!match ||                               // No match\n            match[1] === INVALID_VERSION ||     // version ff is forbidden\n            match[2] === INVALID_TRACE_ID ||    // All zeros is considered to be invalid\n            match[3] === INVALID_SPAN_ID) {     // All zeros is considered to be invalid\n        return null;\n    }\n\n    return {\n        version: (match[1] || STR_EMPTY).toLowerCase(),\n        traceId: (match[2] || STR_EMPTY).toLowerCase(),\n        spanId: (match[3] || STR_EMPTY).toLowerCase(),\n        traceFlags: parseInt(match[4], 16)\n    };\n}\n\n/**\n * Is the provided W3c Trace Id a valid string representation, it must be a 32-character string\n * of lowercase hexadecimal characters for example, 4bf92f3577b34da6a3ce929d0e0e4736.\n * If all characters as zero (00000000000000000000000000000000) it will be considered an invalid value.\n * @param value - The W3c trace Id to be validated\n * @returns true if valid otherwise false\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isValidTraceId(value: string): boolean {\n    return _isValid(value, 32, INVALID_TRACE_ID);\n}\n\n/**\n * Is the provided W3c span id (aka. parent id) a valid string representation, it must be a 16-character\n * string of lowercase hexadecimal characters, for example, 00f067aa0ba902b7.\n * If all characters are zero (0000000000000000) this is considered an invalid value.\n * @param value - The W3c span id to be validated\n * @returns true if valid otherwise false\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isValidSpanId(value: string): boolean {\n    return _isValid(value, 16, INVALID_SPAN_ID);\n}\n\n/**\n * Validates that the provided ITraceParent instance conforms to the currently supported specifications\n * @param value - The parsed traceParent value\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isValidTraceParent(value: ITraceParent) {\n    if (!value ||\n            !_isValid(value.version, 2, INVALID_VERSION) ||\n            !_isValid(value.traceId, 32, INVALID_TRACE_ID) ||\n            !_isValid(value.spanId, 16, INVALID_SPAN_ID) ||\n            !_isValid(_formatFlags(value.traceFlags), 2)) {\n\n        // Each known field must contain a valid value\n        return false;\n    }\n\n    return true;\n}\n\n/**\n * Is the parsed traceParent indicating that the trace is currently sampled.\n * @param value - The parsed traceParent value\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function isSampledFlag(value: ITraceParent) {\n    if (isValidTraceParent(value)) {\n        return (value.traceFlags & SAMPLED_FLAG) === SAMPLED_FLAG;\n    }\n\n    return false;\n}\n\n/**\n * Format the ITraceParent value as a string using the supported and know version formats.\n * So even if the passed traceParent is a later version the string value returned from this\n * function will convert it to only the known version formats.\n * This currently only supports version \"00\" and invalid \"ff\"\n * @param value - The parsed traceParent value\n * @returns\n */\n/*#__NO_SIDE_EFFECTS__*/\nexport function formatTraceParent(value: ITraceParent) {\n    if (value) {\n        // Special Note: This only supports formatting as version 00, future versions should encode any known supported version\n        // So parsing a future version will populate the correct version value but reformatting will reduce it to version 00.\n        let flags = _formatFlags(value.traceFlags);\n        if (!_isValid(flags, 2)) {\n            flags = \"01\";\n        }\n\n        let version = value.version || DEFAULT_VERSION;\n        if (version !== \"00\" && version !== \"ff\") {\n            // Reduce version to \"00\"\n            version = DEFAULT_VERSION;\n        }\n\n        // Format as version 00\n        return `${version.toLowerCase()}-${_formatValue(value.traceId, 32, INVALID_TRACE_ID).toLowerCase()}-${_formatValue(value.spanId, 16, INVALID_SPAN_ID).toLowerCase()}-${flags.toLowerCase()}`;\n    }\n\n    return STR_EMPTY;\n}\n\n/**\n * Helper function to fetch the passed traceparent from the page, looking for it as a meta-tag or a Server-Timing header.\n * @param selectIdx - If the found value is comma separated which is the preferred entry to select, defaults to the first\n * @returns\n */\nexport function findW3cTraceParent(selectIdx?: number): ITraceParent {\n    const name = \"traceparent\";\n    let traceParent: ITraceParent = parseTraceParent(findMetaTag(name), selectIdx);\n    if (!traceParent) {\n        traceParent = parseTraceParent(findNamedServerTiming(name), selectIdx)\n    }\n\n    return traceParent;\n}\n\nexport interface scriptsInfo {\n    url: string;\n    crossOrigin?: string;\n    async?: boolean;\n    defer?: boolean;\n    referrerPolicy?: string;\n}\n\n/**\n * Find all script tags in the provided document and return the information about them.\n * @param doc - The document to search for script tags\n * @returns\n */\nexport function findAllScripts(doc: any): scriptsInfo[] {\n    let scripts = doc.getElementsByTagName(\"script\");\n    let result: scriptsInfo[] = [];\n    arrForEach(scripts, (script: any) => {\n        let src = script.getAttribute(\"src\");\n        if (src) {\n            let crossOrigin = script.getAttribute(\"crossorigin\");\n            let async = script.hasAttribute(\"async\") === true;\n            let defer = script.hasAttribute(\"defer\") === true;\n            let referrerPolicy = script.getAttribute(\"referrerpolicy\");\n            let info: scriptsInfo = { url: src };\n            if (crossOrigin) {\n                info.crossOrigin = crossOrigin;\n            }\n            if (async) {\n                info.async = async;\n            }\n            if (defer) {\n                info.defer = defer;\n            }\n            if (referrerPolicy) {\n                info.referrerPolicy = referrerPolicy;\n            }\n            result.push(info);\n        }\n    });\n\n    return result;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/UrlHelperFuncs.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getDocument, isString } from \"@nevware21/ts-utils\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\n\nlet _document: any = getDocument() || {};\n\nlet _htmlAnchorIdx: number = 0;\n// Use an array of temporary values as it's possible for multiple calls to parseUrl() will be called with different URLs\n// Using a cache size of 5 for now as it current depth usage is at least 2, so adding a minor buffer to handle future updates\nlet _htmlAnchorElement: HTMLAnchorElement[] = [null, null, null, null, null];\n\nexport function urlParseUrl(url: string): HTMLAnchorElement {\n    let anchorIdx = _htmlAnchorIdx;\n    let anchorCache = _htmlAnchorElement;\n    let tempAnchor = anchorCache[anchorIdx];\n    if (!_document.createElement) {\n        // Always create the temp instance if createElement is not available\n        tempAnchor = { host: urlParseHost(url, true) } as HTMLAnchorElement;\n    } else if (!anchorCache[anchorIdx]) {\n        // Create and cache the unattached anchor instance\n        tempAnchor = anchorCache[anchorIdx] = _document.createElement(\"a\");\n    }\n\n    tempAnchor.href = url;\n\n    // Move the cache index forward\n    anchorIdx++;\n    if (anchorIdx >= anchorCache.length) {\n        anchorIdx = 0;\n    }\n\n    _htmlAnchorIdx = anchorIdx;\n\n    return tempAnchor;\n}\n\nexport function urlGetAbsoluteUrl(url: string): string {\n    let result: string;\n    const a = urlParseUrl(url);\n    if (a) {\n        result = a.href;\n    }\n\n    return result;\n}\n\nexport function urlGetPathName(url: string): string {\n    let result: string;\n    const a = urlParseUrl(url);\n    if (a) {\n        result = a.pathname;\n    }\n\n    return result;\n}\n\nexport function urlGetCompleteUrl(method: string, absoluteUrl: string) {\n    if (method) {\n        return method.toUpperCase() + \" \" + absoluteUrl;\n    }\n\n    return absoluteUrl;\n}\n\n// Fallback method to grab host from url if document.createElement method is not available\nexport function urlParseHost(url: string, inclPort?: boolean) {\n    let fullHost = urlParseFullHost(url, inclPort) || STR_EMPTY;\n    if (fullHost) {\n        const match = fullHost.match(/(www\\d{0,5}\\.)?([^\\/:]{1,256})(:\\d{1,20})?/i);\n        if (match != null && match.length > 3 && isString(match[2]) && match[2].length > 0) {\n            return match[2] + (match[3] || STR_EMPTY);\n        }\n    }\n\n    return fullHost;\n}\n\nexport function urlParseFullHost(url: string, inclPort?: boolean) {\n    let result = null;\n    if (url) {\n        const match = url.match(/(\\w{1,150}):\\/\\/([^\\/:]{1,256})(:\\d{1,20})?/i);\n        if (match != null && match.length > 2 && isString(match[2]) && match[2].length > 0) {\n            result = match[2] || STR_EMPTY;\n            if (inclPort && match.length > 2) {\n                const protocol = (match[1] || STR_EMPTY).toLowerCase();\n                let port = match[3] || STR_EMPTY;\n                // IE includes the standard port so pass it off if it's the same as the protocol\n                if (protocol === \"http\" && port === \":80\") {\n                    port = STR_EMPTY;\n                } else if (protocol === \"https\" && port === \":443\") {\n                    port = STR_EMPTY;\n                }\n\n                result += port;\n            }\n        }\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/src/utils/Util.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, arrIndexOf, getPerformance, isNullOrUndefined, strIndexOf, utcNow as dateNow } from \"@nevware21/ts-utils\";\nimport { DEFAULT_BREEZE_ENDPOINT, DEFAULT_BREEZE_PATH } from \"../constants/Constants\";\nimport { STR_EMPTY } from \"../constants/InternalConstants\";\nimport { createDistributedTraceContext } from \"../core/TelemetryHelpers\";\nimport { ICorrelationConfig } from \"../interfaces/ai/ICorrelationConfig\";\nimport { IDiagnosticLogger } from \"../interfaces/ai/IDiagnosticLogger\";\nimport { IDistributedTraceContext } from \"../interfaces/ai/IDistributedTraceContext\";\nimport { ITelemetryTrace } from \"../interfaces/ai/context/ITelemetryTrace\";\nimport { RequestHeaders, eRequestHeaders } from \"../telemetry/RequestResponseHeaders\";\nimport { dataSanitizeString } from \"../telemetry/ai/Common/DataSanitizer\";\nimport { urlParseFullHost, urlParseUrl } from \"./UrlHelperFuncs\";\n\n// listing only non-geo specific locations\nconst _internalEndpoints: string[] = [\n    DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH,\n    \"https://breeze.aimon.applicationinsights.io\" + DEFAULT_BREEZE_PATH,\n    \"https://dc-int.services.visualstudio.com\" + DEFAULT_BREEZE_PATH\n];\n\nlet _correlationIdPrefix: string = \"cid-v1:\";\n\nexport function isInternalApplicationInsightsEndpoint(endpointUrl: string): boolean {\n    return arrIndexOf(_internalEndpoints, endpointUrl.toLowerCase()) !== -1;\n}\n\nexport function correlationIdSetPrefix(prefix: string) {\n    _correlationIdPrefix = prefix;\n}\n\nexport function correlationIdGetPrefix() {\n    return _correlationIdPrefix;\n}\n\n/**\n * Checks if a request url is not on a excluded domain list and if it is safe to add correlation headers.\n * Headers are always included if the current domain matches the request domain. If they do not match (CORS),\n * they are regex-ed across correlationHeaderDomains and correlationHeaderExcludedDomains to determine if headers are included.\n * Some environments don't give information on currentHost via window.location.host (e.g. Cordova). In these cases, the user must\n * manually supply domains to include correlation headers on. Else, no headers will be included at all.\n */\nexport function correlationIdCanIncludeCorrelationHeader(config: ICorrelationConfig, requestUrl: string, currentHost?: string) {\n    if (!requestUrl || (config && config.disableCorrelationHeaders)) {\n        return false;\n    }\n\n    if (config && config.correlationHeaderExcludePatterns) {\n        for (let i = 0; i < config.correlationHeaderExcludePatterns.length; i++) {\n            if (config.correlationHeaderExcludePatterns[i].test(requestUrl)) {\n                return false;\n            }\n        }\n    }\n\n    let requestHost = urlParseUrl(requestUrl).host.toLowerCase();\n    if (requestHost && (strIndexOf(requestHost, \":443\") !== -1 || strIndexOf(requestHost, \":80\") !== -1)) {\n        // [Bug #1260] IE can include the port even for http and https URLs so if present\n        // try and parse it to remove if it matches the default protocol port\n        requestHost = (urlParseFullHost(requestUrl, true) || \"\").toLowerCase();\n    }\n\n    if ((!config || !config.enableCorsCorrelation) && (requestHost && requestHost !== currentHost)) {\n        return false;\n    }\n\n    const includedDomains = config && config.correlationHeaderDomains;\n    if (includedDomains) {\n        let matchExists: boolean;\n        arrForEach(includedDomains, (domain) => {\n            const regex = new RegExp(domain.toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n            matchExists = matchExists || regex.test(requestHost);\n        });\n\n        if (!matchExists) {\n            return false;\n        }\n    }\n\n    const excludedDomains = config && config.correlationHeaderExcludedDomains;\n    if (!excludedDomains || excludedDomains.length === 0) {\n        return true;\n    }\n\n    for (let i = 0; i < excludedDomains.length; i++) {\n        const regex = new RegExp(excludedDomains[i].toLowerCase().replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\"));\n        if (regex.test(requestHost)) {\n            return false;\n        }\n    }\n\n    // if we don't know anything about the requestHost, require the user to use included/excludedDomains.\n    // Previously we always returned false for a falsy requestHost\n    return requestHost && requestHost.length > 0;\n}\n\n/**\n * Combines target appId and target role name from response header.\n */\nexport function correlationIdGetCorrelationContext(responseHeader: string) {\n    if (responseHeader) {\n        const correlationId = correlationIdGetCorrelationContextValue(responseHeader, RequestHeaders[eRequestHeaders.requestContextTargetKey]);\n        if (correlationId && correlationId !== _correlationIdPrefix) {\n            return correlationId;\n        }\n    }\n}\n\n/**\n * Gets key from correlation response header\n */\nexport function correlationIdGetCorrelationContextValue(responseHeader: string, key: string) {\n    if (responseHeader) {\n        const keyValues = responseHeader.split(\",\");\n        for (let i = 0; i < keyValues.length; ++i) {\n            const keyValue = keyValues[i].split(\"=\");\n            if (keyValue.length === 2 && keyValue[0] === key) {\n                return keyValue[1];\n            }\n        }\n    }\n}\n\nexport function AjaxHelperParseDependencyPath(logger: IDiagnosticLogger, absoluteUrl: string, method: string, commandName: string) {\n    let target, name = commandName, data = commandName;\n\n    if (absoluteUrl && absoluteUrl.length > 0) {\n        const parsedUrl: HTMLAnchorElement = urlParseUrl(absoluteUrl);\n        target = parsedUrl.host;\n        if (!name) {\n            if (parsedUrl.pathname != null) {\n                let pathName: string = (parsedUrl.pathname.length === 0) ? \"/\" : parsedUrl.pathname;\n                if (pathName.charAt(0) !== \"/\") {\n                    pathName = \"/\" + pathName;\n                }\n                data = parsedUrl.pathname;\n                name = dataSanitizeString(logger, method ? method + \" \" + pathName : pathName);\n            } else {\n                name = dataSanitizeString(logger, absoluteUrl);\n            }\n        }\n    } else {\n        target = commandName;\n        name = commandName;\n    }\n\n    return {\n        target,\n        name,\n        data\n    };\n}\n\nexport function dateTimeUtilsNow() {\n    // returns the window or webworker performance object\n    let perf = getPerformance();\n    if (perf && perf.now && perf.timing) {\n        let now = perf.now() + perf.timing.navigationStart;\n        // Known issue with IE where this calculation can be negative, so if it is then ignore and fallback\n        if (now > 0) {\n            return now;\n        }\n    }\n\n    return dateNow();\n}\n\nexport function dateTimeUtilsDuration(start: number, end: number): number {\n    let result = null;\n    if (start !== 0 && end !== 0 && !isNullOrUndefined(start) && !isNullOrUndefined(end)) {\n        result = end - start;\n    }\n\n    return result;\n}\n\n/**\n * Creates a IDistributedTraceContext from an optional telemetryTrace\n * @param telemetryTrace - The telemetryTrace instance that is being wrapped\n * @param parentCtx - An optional parent distributed trace instance, almost always undefined as this scenario is only used in the case of multiple property handlers.\n * @returns A new IDistributedTraceContext instance that is backed by the telemetryTrace or temporary object\n * @deprecated This function is deprecated and will be removed in a future version. Use the createDistributedTraceContext function instead and set the necessary properties\n * on the context object directly.\n */\nexport function createDistributedTraceContextFromTrace(telemetryTrace?: ITelemetryTrace, parentCtx?: IDistributedTraceContext): IDistributedTraceContext {\n    let traceCtx: IDistributedTraceContext = createDistributedTraceContext(parentCtx);\n    if (telemetryTrace) {\n        traceCtx.pageName = telemetryTrace.name || traceCtx.pageName || STR_EMPTY; // The name of the page\n        traceCtx.traceId = telemetryTrace.traceID || traceCtx.traceId || STR_EMPTY; // 16 byte hex string\n        traceCtx.spanId = telemetryTrace.parentID || traceCtx.spanId || STR_EMPTY; // 8 byte hex string\n        traceCtx.traceFlags = (!isNullOrUndefined(telemetryTrace.traceFlags) ? telemetryTrace.traceFlags : traceCtx.traceFlags) || 0; // 1 byte hex string\n    }\n\n    return traceCtx\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"es5\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": false,\n    \"alwaysStrict\": true,\n    \"skipDefaultLibCheck\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules/\"\n  ]\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"extends\": [\"../../tsdoc.json\"]\n  }\n  "
  },
  {
    "path": "shared/AppInsightsCore/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ]\n}\n"
  },
  {
    "path": "shared/AppInsightsCore/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/index.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-core-js\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/AppInsightsCore\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/AppInsightsCore\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-core-js\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "tools/applicationinsights-web-snippet/.gitignore",
    "content": "src/aiSnippet.ts\nsrc/oneDSSnippet.ts"
  },
  {
    "path": "tools/applicationinsights-web-snippet/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!package.json\n!tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!dist-es*/**\n!dist/**\n!browser/**\n!dest/**\n!types/**\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "tools/applicationinsights-web-snippet/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Web Snippet\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web-snippet.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-web-snippet)\n\nWeb Snippet for the Application Insights Javascript SDK\n\nThis project exists to publish latest Application Insights Javascript Web Snippet.\n\n## Basic Usage\n\nAdd the Application Insights Web Snippet to your app's dependencies and package.json.\n```\nnpm i @microsoft/applicationinsights-web-snippet\n```\n\n### Pass in Key via Function (available since v1.1.0)\nImport the helper function from the package to easily get the snippet\n```\nimport { getSdkLoaderScript } from \"@microsoft/applicationinsights-web-snippet\";\n```\n\nConfigure the snippet with your connectionString or other customerized field:\n```\nlet config = {connectionString: \"InstrumentationKey=xxx\", name: \"myAppInsights\"}; \n// or let config = {instrumentationKey: key, sri: true};\nlet theSnippet = getSdkLoaderScript(config);\n```\n\n### Multiple Snippet Run Simutinously (available since v1.2.0)\nConfigure two snippets with different name.\n```\nlet firstConfig = {connectionString: \"InstrumentationKey=xxx\", name: \"firstAppInsights\"}; \nlet firstSnippet = getSdkLoaderScript(firstConfig);\nlet secondConfig = {connectionString: \"InstrumentationKey=xxx\", name: \"secondAppInsights\"}; \nlet secondSnippet = getSdkLoaderScript(secondConfig);\n```\n\n### Snippet Run With Integrity Check and Minified Loading Time (available since v1.2.0)\nConfigure the snippet with sri enabled.\n```\nlet config = {connectionString: \"InstrumentationKey=xxx\", sri: true};\n```\n\nMore details on web snippet, see [Web Snippet](https://github.com/microsoft/ApplicationInsights-JS#snippet-setup-ignore-if-using-npm-setup).\n\n### Trusted Types Support (available since v1.2.2)\nFor restrictions like require-trusted-types-for 'script', check [url policy check](./trustedTypeSupport.md)\nFor restrictions like script-src 'self' ..., check [add nounce when inject script]()\n\n## Build\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/Tests/Unit/src/SnippetTests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { webSnippetVersion, webSnippet, webSnippetCs, getSdkLoaderScript } from \"../../../dist-es5/applicationinsights-web-snippet\";\n\nexport class SnippetTests extends AITestClass {\n\n    private _global: any = null;\n\n    public testInitialize() {\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"Check snippet version\",\n            test: () => {\n                QUnit.assert.equal(\"10\", webSnippetVersion());\n            }\n        });\n\n        this.testCase({\n            name: \"Check contains INSTRUMENTATION_KEY\",\n            test: () => {\n                let theSnippet = webSnippet;\n\n                QUnit.assert.notEqual(-1, theSnippet.indexOf(\"INSTRUMENTATION_KEY\"), \"The Snippet contains INSTRUMENTATION_KEY\");\n                QUnit.assert.notEqual(-1, theSnippet.indexOf(\"\\\"InstrumentationKey=INSTRUMENTATION_KEY\\\"\"), \"The Snippet contains \\\"InstrumentationKey=INSTRUMENTATION_KEY\\\"\");\n                QUnit.assert.equal(-1, theSnippet.indexOf(\"YOUR_CONNECTION_STRING\"), \"The Snippet contains YOUR_CONNECTION_STRING\");\n                QUnit.assert.equal(-1, theSnippet.indexOf(\"\\\"YOUR_CONNECTION_STRING\\\"\"), \"The Snippet contains \\\"YOUR_CONNECTION_STRING\\\"\");\n            }\n        });\n\n        this.testCase({\n            name: \"Check contains YOUR_CONNECTION_STRING\",\n            test: () => {\n                let theSnippet = webSnippetCs;\n\n                QUnit.assert.notEqual(-1, theSnippet.indexOf(\"YOUR_CONNECTION_STRING\"), \"The Snippet contains YOUR_CONNECTION_STRING\");\n                QUnit.assert.notEqual(-1, theSnippet.indexOf(\"\\\"YOUR_CONNECTION_STRING\\\"\"), \"The Snippet contains \\\"YOUR_CONNECTION_STRING\\\"\");\n                QUnit.assert.equal(-1, theSnippet.indexOf(\"INSTRUMENTATION_KEY\"), \"The Snippet contains INSTRUMENTATION_KEY\");\n                QUnit.assert.equal(-1, theSnippet.indexOf(\"\\\"InstrumentationKey=INSTRUMENTATION_KEY\\\"\"), \"The Snippet contains \\\"InstrumentationKey=INSTRUMENTATION_KEY\\\"\");\n            }\n        });\n\n        this.testCase({\n            name: \"Check substituteInstrumentationKey\",\n            test: () => {\n                let key = \"814a172a-xxxx-4950-9023-9cf13bb65696\";\n                let config = {instrumentationKey: key};\n                let theSnippet = getSdkLoaderScript(config);\n                console.log(theSnippet);\n                QUnit.assert.equal(-1, theSnippet.indexOf(\"InstrumentationKey\"), \"The Snippet does not contains InstrumentationKey\");\n                QUnit.assert.equal(-1, theSnippet.indexOf(\"YOUR_CONNECTION_STRING\"), \"The Snippet should not contain YOUR_CONNECTION_STRING\");\n                QUnit.assert.notEqual(-1, theSnippet.indexOf(key), \"key is injected\");\n            }\n        });\n\n        this.testCase({\n            name: \"Check substituteConnectionString\",\n            test: () => {\n                let key = \"InstrumentationKey=814a172a-92fd-4950-9023-9cf13bb65696;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\";\n                let config = {connectionString: key};\n                let theSnippet = getSdkLoaderScript(config);\n                console.log(theSnippet);\n                QUnit.assert.notEqual(-1, theSnippet.indexOf(\"InstrumentationKey\"), \"The Snippet contains InstrumentationKey\");\n                QUnit.assert.equal(-1, theSnippet.indexOf(\"YOUR_CONNECTION_STRING\"), \"The Snippet should not contain YOUR_CONNECTION_STRING\");\n                QUnit.assert.notEqual(-1, theSnippet.indexOf(key), \"key is injected\");\n            }\n        });\n\n        this.testCase({\n            name: \"Verify config object doesn't include invalid keys\",\n            test: () => {\n                let key = \"InstrumentationKey=814a172a-92fd-4950-9023-9cf13bb65696;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\";\n                let config = {\n                    connectionString: key, \n                    instrumentationKey: key,\n                    sri: { \"</script>\": \"bad\" },\n                    cr: \"</script>\",\n                    name: \"</script>Name<script>alert('xss');</script>\",\n                };\n                let theSnippet = getSdkLoaderScript(config);\n                QUnit.assert.ok(theSnippet.indexOf(\"</script>\") === -1, \"Make sure the Snippet does not contain </script> - \" + theSnippet);\n                QUnit.assert.ok(theSnippet.indexOf(\"/script\") !== -1, \"Make sure the / character is not escaped - \" + theSnippet);\n            }\n        });\n\n        this.testCase({\n            name: \"Verify that the / character is not escaped\",\n            test: () => {\n                let key = \"InstrumentationKey=814a172a-92fd-4950-9023-9cf13bb65696;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\";\n                let config = {\n                    connectionString: key, \n                    instrumentationKey: key\n                };\n                let theSnippet = getSdkLoaderScript(config);\n                QUnit.assert.ok(theSnippet.indexOf(\"https://eastus-8.\") !== -1, \"Make sure the / character is not escaped - \" + theSnippet);\n                QUnit.assert.ok(theSnippet.indexOf(\"LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\") !== -1, \"Make sure the / character is not escaped - \" + theSnippet);\n            }\n        });\n\n        this.testCase({\n            name: \"Verify comment line is at the end of the snippet\",\n            test: () => {\n                let key = \"InstrumentationKey=814a172a-92fd-4950-9023-9cf13bb65696;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\";\n                let config = {\n                    connectionString: key\n                };\n                let theSnippet = getSdkLoaderScript(config);\n                          \n                // Test that snippet.min.js.ma appears only once\n                let sourcemapPattern = \"snippet.min.js.map\";\n                let firstIndex = theSnippet.indexOf(sourcemapPattern);\n                let lastIndex = theSnippet.lastIndexOf(sourcemapPattern);\n                QUnit.assert.ok(firstIndex !== -1, \"Make sure snippet.min.js.ma exists in the snippet\");\n                QUnit.assert.equal(firstIndex, lastIndex, \"Make sure snippet.min.js.ma appears only once\");\n                \n                // Test that snippet.min.js.ma is at the end of the snippet\n                let trimmedSnippet = theSnippet.trim();\n                QUnit.assert.ok(trimmedSnippet.endsWith(\"snippet.min.js.map\"), \"Make sure snippet.min.js.map is at the very end of the snippet\");\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/Tests/Unit/src/snippet.tests.ts",
    "content": "import { SnippetTests } from \"./SnippetTests\";\n\nexport function runTests() {\n    new SnippetTests().registerTests();\n}\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/Tests/UnitTests.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Shims</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        modules.add(\"qunit\");\n\n        modules.add(\"@microsoft/ai-test-framework\");\n\n        var testModule = modules.add(\"Tests/Unit/src/snippet.tests\", \"./Unit/dist/applicationinsights-web-snippet.tests.js\")\n        testModule.run = function (tests) {\n            console && console.log(\"Starting tests\");\n            QUnit.start();\n            tests.runTests();\n        };\n\n        modules.run();\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "tools/applicationinsights-web-snippet/Tests/manual/cspUseNounceTest.html",
    "content": "<!DOCTYPE html>\n<meta http-equiv=\"Content-Security-Policy\" content=\"img-src https://browser.events.data.microsoft.com;frame-src https://browser.events.data.microsoft.com; script-src 'self' https://js.monitor.azure.com/scripts 'nonce-randomNonceValue';\">\n<html>\n<head>\n    <style>\n        /* Optional styling for buttons and messages */\n        button {\n            margin: 10px;\n            padding: 10px 20px;\n            font-size: 16px;\n        }\n        #messages {\n            margin: 20px;\n            padding: 10px;\n            border: 1px solid #ccc;\n            background-color: #f9f9f9;\n        }\n    </style>\n   <script type=\"text/javascript\" nonce=\"randomNonceValue\" >\n    const myTrustedTypePolicy = trustedTypes.createPolicy('myTrustedTypePolicy', {\n        createScriptURL: (url) => {\n            console.log('Trusted Type Policy: myTrustedTypePolicy called with URL:', url);\n            return url;\n        }\n    });\n!(function (cfg){function e(){cfg.onInit&&cfg.onInit(n)}var x,D,E,t,L,C,n,U=window,b=document,O=U.location,A=\"script\",I=\"ingestionendpoint\",j=\"disableExceptionTracking\",q=\"ai.device.\";\"instrumentationKey\"[x=\"toLowerCase\"](),D=\"crossOrigin\",E=\"POST\",t=\"appInsightsSDK\",L=cfg.name||\"appInsights\",C=cfg.pn||\"aiPolicy\",(cfg.name||U[t])&&(U[t]=L),n=U[L]||function(u){var s=!1,p=!1,l={initialize:!0,queue:[],sv:\"8\",version:2,config:u};function d(e){var t,n,i,a,r,o,c,s;!0!==cfg.dle&&(o=(t=function(){var e,t={},n=u.connectionString;if(\"string\"==typeof n&&n)for(var i=n.split(\";\"),a=0;a<i.length;a++){var r=i[a].split(\"=\");2===r.length&&(t[r[0][x]()]=r[1])}return t[I]||(e=(n=t.endpointsuffix)?t.location:null,t[I]=\"https://\"+(e?e+\".\":\"\")+\"dc.\"+(n||\"services.visualstudio.com\")),t}()).instrumentationkey||u.instrumentationKey||\"\",t=(t=(t=t[I])&&\"/\"===t.slice(-1)?t.slice(0,-1):t)?t+\"/v2/track\":u.endpointUrl,t=u.userOverrideEndpointUrl||t,(n=[]).push((i=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=e,c=t,(s=(r=f(o,\"Exception\")).data).baseType=\"ExceptionData\",s.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:i.replace(/\\./g,\"-\"),hasFullStack:!1,stack:i+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(O&&O.pathname||\"_unknown_\")+\"\\nEndpoint: \"+c,parsedStack:[]}],r)),n.push((s=e,i=t,(c=(a=f(o,\"Message\")).data).baseType=\"MessageData\",(r=c.baseData).message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+s+\")\").replace(/\\\"/g,\"\")+'\"',r.properties={endpoint:i},a)),e=n,o=t,JSON&&((c=U.fetch)&&!cfg.useXhr?c(o,{method:E,body:JSON.stringify(e),mode:\"cors\"}):XMLHttpRequest&&((s=new XMLHttpRequest).open(E,o),s.setRequestHeader(\"Content-type\",\"application/json\"),s.send(JSON.stringify(e)))))}function f(e,t){var n={},i=\"Browser\";function a(e){e=\"\"+e;return 1===e.length?\"0\"+e:e}return n[q+\"id\"]=i[x](),n[q+\"type\"]=i,n[\"ai.operation.name\"]=O&&O.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(l.sv||l.version),{time:(i=new Date).getUTCFullYear()+\"-\"+a(1+i.getUTCMonth())+\"-\"+a(i.getUTCDate())+\"T\"+a(i.getUTCHours())+\":\"+a(i.getUTCMinutes())+\":\"+a(i.getUTCSeconds())+\".\"+(i.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+\"Z\",iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}},ver:undefined,seq:\"1\",aiDataContract:undefined}}var n,i,t,a,g=-1,h=0,m=[\"js.monitor.azure.com\",\"js.cdn.applicationinsights.io\",\"js.cdn.monitor.azure.com\",\"js0.cdn.applicationinsights.io\",\"js0.cdn.monitor.azure.com\",\"js2.cdn.applicationinsights.io\",\"js2.cdn.monitor.azure.com\",\"az416426.vo.msecnd.net\"],r=u.url||cfg.src,o=function(){return c(r,null)};function c(t,r){if((n=navigator)&&(~(n=(n.userAgent||\"\").toLowerCase()).indexOf(\"msie\")||~n.indexOf(\"trident/\"))&&~t.indexOf(\"ai.3\")&&(t=t.replace(/(\\/)(ai\\.3\\.)([^\\d]*)$/,function(e,t,n){return t+\"ai.2\"+n})),!1!==cfg.cr)for(var e=0;e<m.length;e++)if(0<t.indexOf(m[e])){g=e;break}var n,o=function(e){var a;l.queue=[],p||(0<=g&&h+1<m.length?(a=(g+h+1)%m.length,i(t.replace(/^(.*\\/\\/)([\\w\\.]*)(\\/.*)$/,function(e,t,n,i){return t+m[a]+i})),h+=1):(s=p=!0,d(t)))},c=function(e,t){p||setTimeout(function(){!t&&l.core||o()},500),s=!1},i=function(e){var n,i=b.createElement(A),e=(cfg.pl?cfg.ttp&&cfg.ttp.createScript?i.src=cfg.ttp.createScriptURL(e):i.src=(null==(n=window.trustedTypes)?void 0:n.createPolicy(C,{createScriptURL:function(e){try{var t=new URL(e);if(t.host&&\"js.monitor.azure.com\"===t.host)return e;a(e)}catch(n){a(e)}}})).createScriptURL(e):i.src=e,cfg.nt&&i.setAttribute(\"nonce\",cfg.nt),r&&(i.integrity=r),i.setAttribute(\"data-ai-name\",L),cfg[D]);function a(e){d(\"AI policy blocked URL: \"+e)}return!e&&\"\"!==e||\"undefined\"==i[D]||(i[D]=e),i.onload=c,i.onerror=o,i.onreadystatechange=function(e,t){\"loaded\"!==i.readyState&&\"complete\"!==i.readyState||c(0,t)},cfg.ld&&cfg.ld<0?b.getElementsByTagName(\"head\")[0].appendChild(i):setTimeout(function(){b.getElementsByTagName(A)[0].parentNode.appendChild(i)},cfg.ld||0),i};i(t)}cfg.sri&&(n=r.match(/^((http[s]?:\\/\\/.*\\/)\\w+(\\.\\d+){1,5})\\.(([\\w]+\\.){0,2}js)$/))&&6===n.length?(T=\"\".concat(n[1],\".integrity.json\"),i=\"@\".concat(n[4]),S=window.fetch,t=function(e){if(!e.ext||!e.ext[i]||!e.ext[i].file)throw Error(\"Error Loading JSON response\");var t=e.ext[i].integrity||null;c(r=n[2]+e.ext[i].file,t)},S&&!cfg.useXhr?S(T,{method:\"GET\",mode:\"cors\"}).then(function(e){return e.json()[\"catch\"](function(){return{}})}).then(t)[\"catch\"](o):XMLHttpRequest&&((a=new XMLHttpRequest).open(\"GET\",T),a.onreadystatechange=function(){if(a.readyState===XMLHttpRequest.DONE)if(200===a.status)try{t(JSON.parse(a.responseText))}catch(e){o()}else o()},a.send())):r&&o();try{l.cookie=b.cookie}catch(k){}function e(e){for(;e.length;)!function(t){l[t]=function(){var e=arguments;s||l.queue.push(function(){l[t].apply(l,e)})}}(e.pop())}var v,y,S=\"track\",T=\"TrackPage\",w=\"TrackEvent\",S=(e([S+\"Event\",S+\"PageView\",S+\"Exception\",S+\"Trace\",S+\"DependencyData\",S+\"Metric\",S+\"PageViewPerformance\",\"start\"+T,\"stop\"+T,\"start\"+w,\"stop\"+w,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),l.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(u.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==u[j]&&!0!==S[j]&&(e([\"_\"+(v=\"onerror\")]),y=U[v],U[v]=function(e,t,n,i,a){var r=y&&y(e,t,n,i,a);return!0!==r&&l[\"_\"+v]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:U.event}),r},u.autoExceptionInstrumented=!0),l}(cfg.cfg),(U[L]=n).queue&&0===n.queue.length?(n.queue.push(e),n.trackPageView({})):e();})({\n        src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n        // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n        // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n        // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n        // dle: true, // Prevent the SDK from reporting load failure log\n        crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n        // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n        // sri: false, // Custom optional value to specify whether fetching the snippet from integrity file and do integrity check \n        nt: \"randomNonceValue\",\n        cfg: { // Application Insights Configuration\n            connectionString: \"InstrumentationKey=814a172a-92fd-4950-9023-9cf13bb65696;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\"\n        }\n    });\n    </script>\n</head>\n<body>\n    <div id=\"messages\"></div>\n    <button id=\"myButton\">Send Telemetry</button>\n\n    <script nonce=\"randomNonceValue\" >\n        function sendTelemetry() {\n                appInsights.trackEvent({name: 'test event'});\n                appInsights.flush();\n            }\n        </script>\n        <script nonce=\"randomNonceValue\">\n            document.getElementById('myButton').addEventListener('click', sendTelemetry);\n          </script>\n\n    <script nonce=\"randomNonceValue\">\n\n        function displayMessage(message, type) {\n            var messageDiv = document.createElement('div');\n            messageDiv.className = type;\n            messageDiv.textContent = message;\n            document.getElementById('messages').appendChild(messageDiv);\n        }\n\n       \n    </script>\n    <script nonce=\"randomNonceValue\">\n        var windowOnError = window.onerror;\n        window.onerror = function(message, source, lineno, colno, error) {\n            windowOnError && windowOnError(message, source, lineno, colno, error);\n            console.log('Error captured:', message, source, lineno, colno, error);\n\n             // Display the error message on the page\n             var errorMessage = document.createElement('div');\n            errorMessage.className = 'error';\n            errorMessage.textContent = 'Error: ' + message + ' at ' + source + ':' + lineno + ':' + colno;\n            document.getElementById('messages').appendChild(errorMessage);\n        };\n    </script>\n\n</body>\n</html>\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/Tests/manual/cspUsePolicyTest.html",
    "content": "<!DOCTYPE html>\n<meta http-equiv=\"Content-Security-Policy\" content=\"img-src https://browser.events.data.microsoft.com;frame-src https://browser.events.data.microsoft.com;require-trusted-types-for 'script'\">\n<html>\n<head>\n    <style>\n        /* Optional styling for buttons and messages */\n        button {\n            margin: 10px;\n            padding: 10px 20px;\n            font-size: 16px;\n        }\n        #messages {\n            margin: 20px;\n            padding: 10px;\n            border: 1px solid #ccc;\n            background-color: #f9f9f9;\n        }\n    </style>\n   <script type=\"text/javascript\">\n    const myTrustedTypePolicy = trustedTypes.createPolicy('myTrustedTypePolicy', {\n        createScriptURL: (url) => {\n            console.log('Trusted Type Policy: myTrustedTypePolicy called with URL:', url);\n            return url;\n        }\n    });\n!(function (cfg){function e(){cfg.onInit&&cfg.onInit(n)}var x,D,E,t,L,C,n,U=window,O=document,b=U.location,I=\"script\",j=\"ingestionendpoint\",q=\"disableExceptionTracking\",A=\"ai.device.\";\"instrumentationKey\"[x=\"toLowerCase\"](),D=\"crossOrigin\",E=\"POST\",t=\"appInsightsSDK\",L=cfg.name||\"appInsights\",C=cfg.pn||\"aiPolicy\",(cfg.name||U[t])&&(U[t]=L),n=U[L]||function(u){var s=!1,p=!1,l={initialize:!0,queue:[],sv:\"8\",version:2,config:u};function d(e){var t,n,i,a,r,o,c,s;!0!==cfg.dle&&(o=(t=function(){var e,t={},n=u.connectionString;if(\"string\"==typeof n&&n)for(var i=n.split(\";\"),a=0;a<i.length;a++){var r=i[a].split(\"=\");2===r.length&&(t[r[0][x]()]=r[1])}return t[j]||(e=(n=t.endpointsuffix)?t.location:null,t[j]=\"https://\"+(e?e+\".\":\"\")+\"dc.\"+(n||\"services.visualstudio.com\")),t}()).instrumentationkey||u.instrumentationKey||\"\",t=(t=(t=t[j])&&\"/\"===t.slice(-1)?t.slice(0,-1):t)?t+\"/v2/track\":u.endpointUrl,t=u.userOverrideEndpointUrl||t,(n=[]).push((i=\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\",a=e,c=t,(s=(r=f(o,\"Exception\")).data).baseType=\"ExceptionData\",s.baseData.exceptions=[{typeName:\"SDKLoadFailed\",message:i.replace(/\\./g,\"-\"),hasFullStack:!1,stack:i+\"\\nSnippet failed to load [\"+a+\"] -- Telemetry is disabled\\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\\nHost: \"+(b&&b.pathname||\"_unknown_\")+\"\\nEndpoint: \"+c,parsedStack:[]}],r)),n.push((s=e,i=t,(c=(a=f(o,\"Message\")).data).baseType=\"MessageData\",(r=c.baseData).message='AI (Internal): 99 message:\"'+(\"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) (\"+s+\")\").replace(/\\\"/g,\"\")+'\"',r.properties={endpoint:i},a)),e=n,o=t,JSON&&((c=U.fetch)&&!cfg.useXhr?c(o,{method:E,body:JSON.stringify(e),mode:\"cors\"}):XMLHttpRequest&&((s=new XMLHttpRequest).open(E,o),s.setRequestHeader(\"Content-type\",\"application/json\"),s.send(JSON.stringify(e)))))}function f(e,t){var n={},i=\"Browser\";function a(e){e=\"\"+e;return 1===e.length?\"0\"+e:e}return n[A+\"id\"]=i[x](),n[A+\"type\"]=i,n[\"ai.operation.name\"]=b&&b.pathname||\"_unknown_\",n[\"ai.internal.sdkVersion\"]=\"javascript:snippet_\"+(l.sv||l.version),{time:(i=new Date).getUTCFullYear()+\"-\"+a(1+i.getUTCMonth())+\"-\"+a(i.getUTCDate())+\"T\"+a(i.getUTCHours())+\":\"+a(i.getUTCMinutes())+\":\"+a(i.getUTCSeconds())+\".\"+(i.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+\"Z\",iKey:e,name:\"Microsoft.ApplicationInsights.\"+e.replace(/-/g,\"\")+\".\"+t,sampleRate:100,tags:n,data:{baseData:{ver:2}},ver:undefined,seq:\"1\",aiDataContract:undefined}}var n,i,t,a,g=-1,h=0,m=[\"js.monitor.azure.com\",\"js.cdn.applicationinsights.io\",\"js.cdn.monitor.azure.com\",\"js0.cdn.applicationinsights.io\",\"js0.cdn.monitor.azure.com\",\"js2.cdn.applicationinsights.io\",\"js2.cdn.monitor.azure.com\",\"az416426.vo.msecnd.net\"],r=u.url||cfg.src,o=function(){return c(r,null)};function c(t,r){if((n=navigator)&&(~(n=(n.userAgent||\"\").toLowerCase()).indexOf(\"msie\")||~n.indexOf(\"trident/\"))&&~t.indexOf(\"ai.3\")&&(t=t.replace(/(\\/)(ai\\.3\\.)([^\\d]*)$/,function(e,t,n){return t+\"ai.2\"+n})),!1!==cfg.cr)for(var e=0;e<m.length;e++)if(0<t.indexOf(m[e])){g=e;break}var n,o=function(e){var a;l.queue=[],p||(0<=g&&h+1<m.length?(a=(g+h+1)%m.length,i(t.replace(/^(.*\\/\\/)([\\w\\.]*)(\\/.*)$/,function(e,t,n,i){return t+m[a]+i})),h+=1):(s=p=!0,d(t)))},c=function(e,t){p||setTimeout(function(){!t&&l.core||o()},500),s=!1},i=function(e){var n,i=O.createElement(I),e=(cfg.pl?cfg.ttp&&cfg.ttp.createScript?i.src=cfg.ttp.createScriptURL(e):i.src=(null==(n=window.trustedTypes)?void 0:n.createPolicy(C,{createScriptURL:function(e){try{var t=new URL(e);if(t.host&&\"js.monitor.azure.com\"===t.host)return e;a(e)}catch(n){a(e)}}})).createScriptURL(e):i.src=e,r&&(i.integrity=r),i.setAttribute(\"data-ai-name\",L),cfg[D]);function a(e){d(\"AI policy blocked URL: \"+e)}return!e&&\"\"!==e||\"undefined\"==i[D]||(i[D]=e),i.onload=c,i.onerror=o,i.onreadystatechange=function(e,t){\"loaded\"!==i.readyState&&\"complete\"!==i.readyState||c(0,t)},cfg.ld&&cfg.ld<0?O.getElementsByTagName(\"head\")[0].appendChild(i):setTimeout(function(){O.getElementsByTagName(I)[0].parentNode.appendChild(i)},cfg.ld||0),i};i(t)}cfg.sri&&(n=r.match(/^((http[s]?:\\/\\/.*\\/)\\w+(\\.\\d+){1,5})\\.(([\\w]+\\.){0,2}js)$/))&&6===n.length?(T=\"\".concat(n[1],\".integrity.json\"),i=\"@\".concat(n[4]),S=window.fetch,t=function(e){if(!e.ext||!e.ext[i]||!e.ext[i].file)throw Error(\"Error Loading JSON response\");var t=e.ext[i].integrity||null;c(r=n[2]+e.ext[i].file,t)},S&&!cfg.useXhr?S(T,{method:\"GET\",mode:\"cors\"}).then(function(e){return e.json()[\"catch\"](function(){return{}})}).then(t)[\"catch\"](o):XMLHttpRequest&&((a=new XMLHttpRequest).open(\"GET\",T),a.onreadystatechange=function(){if(a.readyState===XMLHttpRequest.DONE)if(200===a.status)try{t(JSON.parse(a.responseText))}catch(e){o()}else o()},a.send())):r&&o();try{l.cookie=O.cookie}catch(k){}function e(e){for(;e.length;)!function(t){l[t]=function(){var e=arguments;s||l.queue.push(function(){l[t].apply(l,e)})}}(e.pop())}var v,y,S=\"track\",T=\"TrackPage\",w=\"TrackEvent\",S=(e([S+\"Event\",S+\"PageView\",S+\"Exception\",S+\"Trace\",S+\"DependencyData\",S+\"Metric\",S+\"PageViewPerformance\",\"start\"+T,\"stop\"+T,\"start\"+w,\"stop\"+w,\"addTelemetryInitializer\",\"setAuthenticatedUserContext\",\"clearAuthenticatedUserContext\",\"flush\"]),l.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(u.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==u[q]&&!0!==S[q]&&(e([\"_\"+(v=\"onerror\")]),y=U[v],U[v]=function(e,t,n,i,a){var r=y&&y(e,t,n,i,a);return!0!==r&&l[\"_\"+v]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:U.event}),r},u.autoExceptionInstrumented=!0),l}(cfg.cfg),(U[L]=n).queue&&0===n.queue.length?(n.queue.push(e),n.trackPageView({})):e();})({\n        src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n        // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n        // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n        // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n        // dle: true, // Prevent the SDK from reporting load failure log\n        crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n        // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n        // sri: false, // Custom optional value to specify whether fetching the snippet from integrity file and do integrity check \n        pl: true, // Optional value to specify whether to use Trusted Types for script URL\n        pn: \"aiPolicy\", // Optional value to specify the policy name for Trusted Types\n        ttp: myTrustedTypePolicy,\n        cfg: { // Application Insights Configuration\n            connectionString: \"InstrumentationKey=814a172a-92fd-4950-9023-9cf13bb65696;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/\"\n        }\n    });\n    </script>\n</head>\n<body>\n    <div id=\"messages\"></div>\n    <button id=\"myButton\">Send Telemetry</button>\n\n    <script nonce=\"randomNonceValue\" >\n        function sendTelemetry() {\n                appInsights.trackEvent({name: 'test event'});\n                appInsights.flush();\n            }\n        </script>\n        <script nonce=\"randomNonceValue\">\n            document.getElementById('myButton').addEventListener('click', sendTelemetry);\n          </script>\n\n    <script nonce=\"1234\">\n\n        function displayMessage(message, type) {\n            var messageDiv = document.createElement('div');\n            messageDiv.className = type;\n            messageDiv.textContent = message;\n            document.getElementById('messages').appendChild(messageDiv);\n        }\n\n       \n    </script>\n    <script>  \n        var windowOnError = window.onerror;\n        window.onerror = function(message, source, lineno, colno, error) {\n            windowOnError && windowOnError(message, source, lineno, colno, error);\n            console.log('Error captured:', message, source, lineno, colno, error);\n\n             // Display the error message on the page\n             var errorMessage = document.createElement('div');\n            errorMessage.className = 'error';\n            errorMessage.textContent = 'Error: ' + message + ' at ' + source + ':' + lineno + ':' + colno;\n            document.getElementById('messages').appendChild(errorMessage);\n        };\n    </script>\n\n</body>\n</html>\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true,\n        \"importHelpers\": false,\n        \"noEmitHelpers\": false,\n        \"skipLibCheck\": true,\n        \"allowJs\": true,\n    },\n    \"files\": [],\n    \"exclude\": [\n        \"**/*.d.ts\"\n    ]\n}"
  },
  {
    "path": "tools/applicationinsights-web-snippet/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-web-snippet.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n  ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "tools/applicationinsights-web-snippet/createAiSnippet.js",
    "content": "// createFile.js\nconst fs = require('fs');\nconst path = require('path');\n\n// Define the path to the snippet.js file\nconst filePath = path.join(__dirname, 'src/snippet.ts'); // Adjust the path if necessary\nconst aiFilePath = path.join(__dirname, 'src/aiSnippet.ts');\nconst oneDSFilePath = path.join(__dirname, 'src/oneDSSnippet.ts');\n// Read the snippet.js file\nfs.readFile(filePath, 'utf8', (err, data) => {\n    if (err) {\n        console.error('Error reading file:', err);\n        process.exit(1);\n    }\n\n\n    let remove = data.replace(/let\\s+isOneDS\\s*=\\s*\\w+;/i, '');\n    // Check if the replace did anything\n    if (remove === data) {\n        // If no change was made, throw an error to break the build\n        throw new Error(\"Failed to remove 'let isOneDS' assignment. Possible content change.\");\n    }\n\n    // Replace all occurrences of \"checkplace\" with \"true\"\n    let ai = remove.replace(/isOneDS/g, 'false');\n    ai = \"// DO NOT EDIT - Automatically Generated\\n\" + ai;\n\n    // Write the modified content back to the file (or a new file if you prefer)\n    fs.writeFile(aiFilePath, ai, 'utf8', (err) => {\n        if (err) {\n            console.error('Error writing file:', err);\n            process.exit(1);\n        }\n        console.log('New File created successfully:', aiFilePath);\n    });\n\n    let oneDS = remove.replace(/isOneDS/g, 'true');\n    oneDS = \"// DO NOT EDIT - Automatically Generated\\n\" + oneDS;\n    fs.writeFile(oneDSFilePath, oneDS, 'utf8', (err) => {\n        if (err) {\n            console.error('Error writing file:', err);\n            process.exit(1);\n        }\n        console.log('New File created successfully:', oneDSFilePath);\n    });\n}  \n);\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-web-snippet\",\n    \"version\": \"1.3.1\",\n    \"description\": \"Microsoft Application Insights Web Snippet\",\n    \"main\": \"dist/es5/node/applicationinsights-web-snippet.js\",\n    \"module\": \"dist-es5/applicationinsights-web-snippet.js\",\n    \"types\": \"types/applicationinsights-web-snippet.d.ts\",\n    \"sideEffects\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/applicationinsights-web-snippet\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run createIndividualSnippet && npm run build:esm && npm run snippet-generate && npm run build:browser && npm run dtsgen\",\n        \"createIndividualSnippet\": \"node createAiSnippet.js\",\n        \"build:esm\": \"grunt websnippet \",\n        \"dtsgen\": \"api-extractor run --local && node ../../scripts/dtsgen.js \\\"Microsoft Application Insights Web Snippet\\\"\",\n        \"snippet-generate\": \"npm run build:snippet && npm run build:oneDSsnippet && npm run originSnippetCopy && npm run replace && npm run snippetCopy\",\n        \"snippetCopy\": \"grunt snippetCopy\",\n        \"originSnippetCopy\": \"grunt originSnippetCopy\",\n        \"build:snippet\": \"rollup -c rollupSnippet.config.js --bundleConfigAsCjs\",\n        \"build:oneDSsnippet\": \"rollup -c rollupOneDSSnippet.config.js --bundleConfigAsCjs\",\n        \"replace\": \"grunt websnippetReplace\",\n        \"build:browser\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt websnippettests\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"npm-pack\": \"npm pack\",\n        \"ai-restore\": \"grunt snippet-restore\",\n        \"api-docs\": \"typedoc\"\n    },\n    \"license\": \"MIT\",\n    \"devDependencies\": {\n        \"@types/qunit\": \"^2.19.3\",\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-web\": \"3.4.1\",\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/api-extractor\": \"^7.40.0\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"magic-string\": \"^0.25.7\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"grunt\": \"^1.6.1\",\n        \"typedoc\": \"^0.26.6\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\"\n    }\n}\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/rollup.config.js",
    "content": "import replace from \"@rollup/plugin-replace\";\nimport commonjs from '@rollup/plugin-commonjs';\n\n\nconst version = require(\"./package.json\").version;\nconst inputName = \"./dist-es5/applicationinsights-web-snippet\";\nconst outputName = \"applicationinsights-web-snippet\";\nconst distPath = \"./dist/es5/\";\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Web Snippet, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst nodeUmdRollupConfigFactory = () => {\n  const nodeRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `${distPath}node/${outputName}.js`,\n      banner: banner,\n      format: \"umd\",\n      name: \"Microsoft.ApplicationInsights-Web-Snippet\",\n      extend: true,\n      freeze: false,\n      sourcemap: false,\n      externalLiveBindings: false,\n      globals:[ 'UglifyJs' ]\n    },\n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: {\n          \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n          \"// Licensed under the MIT License.\": \"\"\n        }\n      }),\n      commonjs({\n        include: 'node_modules/**',\n        transformMixedEsModules: true\n      })\n    ]\n  };\n\n  return nodeRollupConfig;\n};\n\nconst moduleRollupConfigFactory = (format) => {\n  const moduleRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `${distPath}${format}/${outputName}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights-Web-Snippet\",\n      extend: true,\n      freeze: false,\n      sourcemap: false,\n      externalLiveBindings: false,\n      globals:[ 'UglifyJs ']\n    },\n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: {\n          \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n          \"// Licensed under the MIT License.\": \"\"\n        }\n      }),\n   \n      commonjs({\n        include: 'node_modules/**',\n        transformMixedEsModules: true\n      })\n    ]\n  };\n\n  return moduleRollupConfig;\n};\n\nexport default [\n  nodeUmdRollupConfigFactory(),\n  moduleRollupConfigFactory('esm'),\n];\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/rollupOneDSSnippet.config.js",
    "content": "import { createUnVersionedConfig } from \"../../rollup.base.config\";\n\nconst snippetOutputName = \"oneDSSnippet\";\nconst snippetOutputPath = \"../../build/output/oneDSSnippet\";\n\nexport default createUnVersionedConfig(\"\", \n  {\n    namespace: \"oneDS\",\n    version: \"\",\n    browser: {\n      entryPoint: snippetOutputName, \n      outputName: snippetOutputPath,\n      inputPath: \"build/output\",\n      formats: [{ format: 'cjs', postfix: '', useStrict: false, topLevel: true }],\n    },\n  },\n  [ \"applicationinsights-web-snippet\" ],\n  false\n);"
  },
  {
    "path": "tools/applicationinsights-web-snippet/rollupSnippet.config.js",
    "content": "import { createUnVersionedConfig } from \"../../rollup.base.config\";\n\nconst version = require(\"./package.json\").version;\nconst snippetOutputName = \"snippet\";\nconst snippetOutputPath = \"../../build/output/snippet\";\n\nexport default createUnVersionedConfig(\"\", \n  {\n    namespace: \"Microsoft.ApplicationInsights\",\n    version: version,\n    browser: {\n      entryPoint: snippetOutputName, \n      outputName: snippetOutputPath,\n      inputPath: \"build/output\",\n      formats: [{ format: 'cjs', postfix: '', useStrict: false, topLevel: true }],\n    },\n  },\n  [ \"applicationinsights-web-snippet\" ],\n  false\n);"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/1dsSupport.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { oneDsEnvelope } from \"./1dsType\";\nimport { _getTime } from \"./support\";\n\n\nexport function _createOneDsEnvelope(iKey: string, theType: string, _epoch: number, _sequence: number, sv: string): oneDsEnvelope {\n    let UInt32Mask = 0x100000000;\n    if (_epoch === 0) {\n        _epoch = Math.floor((UInt32Mask * Math.random()) | 0) >>> 0;\n    }\n    let envelope: oneDsEnvelope = {\n        data: {\n            baseData: {\n                ver: 2\n            }\n        },\n        ext: {\n            app: { sesId: \"0000\" },\n            intweb: {},\n            sdk: {\n                ver: \"javascript:\" + sv,\n                epoch: \"\" + _epoch,\n                seq: _sequence++\n            },\n            utc: {\n                popSample: 100\n            },\n            web: {\n                userConsent: false\n            }\n        },\n        time: _getTime(),\n        iKey: \"o:\" + _getTenantId(iKey),\n        name: theType,\n        ver: \"4.0\"\n    };\n    _addTimeZone(envelope);\n    _addUser(envelope);\n    return envelope;\n}\n\nfunction _getTenantId(apiKey: string): string {\n    let result: string = \"\";\n\n    if (apiKey) {\n        const indexTenantId: number = apiKey.indexOf(\"-\");\n        if (indexTenantId > -1) {\n            result = apiKey.substring(0, indexTenantId);\n        }\n    }\n    return result;\n}\n\nfunction _addTimeZone(envelope: any): void {\n    // Add time zone\n    const timeZone: number = new Date().getTimezoneOffset();\n    let minutes: number = timeZone % 60;\n    let hours: number = (timeZone - minutes) / 60;\n    let timeZonePrefix: string = \"+\";\n    if (hours > 0) {\n        timeZonePrefix = \"-\";\n    }\n    hours = Math.abs(hours);\n    minutes = Math.abs(minutes);\n\n    envelope.ext = envelope.ext || {};\n    envelope.ext.loc = {  // Add time zone\n        tz: timeZonePrefix + (hours < 10 ? \"0\" + hours : hours.toString()) + \":\" + (minutes < 10 ? \"0\" + minutes : minutes.toString())\n    };\n}\n\nfunction _addUser(envelope: any): void {\n    const strUndefined: string = \"undefined\";\n    // Add user language\n    if (typeof navigator !== strUndefined) {\n        const nav: Navigator & { userLanguage?: string } = navigator;\n        envelope.ext = envelope.ext || {};\n        envelope.ext.user = {\n            locale: nav.userLanguage || nav.language\n        };\n    }\n}\n\nlet track = \"track\";\nlet trackPage = \"TrackPage\";\nlet capturePage = \"capturePage\";\n\n\nexport const oneDsMethods = [\n    track + \"Event\",\n    track + \"Exception\",\n    track + \"PageView\",\n    track + \"PageViewPerformance\",\n    \"addTelemetryInitializer\",\n    track,\n    trackPage + \"Action\",\n    track + \"ContentUpdate\",\n    trackPage + \"Unload\",\n    capturePage + \"View\",\n    capturePage + \"ViewPerformance\",\n    capturePage + \"Action\",\n    capturePage + \"Unload\",\n    \"captureContentUpdate\"\n]\n\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/1dsType.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport interface oneDsEnvelope {\n    data: any;\n    ext: any;\n    time: string;\n    iKey: string;\n    name: string;\n    ver: string;\n}"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/aiSupport.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IEnvelope } from \"@microsoft/applicationinsights-core-js\";\nimport { _getTime } from \"./support\";\n\nlet strEmpty = \"\";\n\n\n\nexport function _createAiEnvelope(iKey: string, theType: string, sv: string, version: number, locn: Location): IEnvelope {\n    let tags = {};\n    let type = \"Browser\";\n    let strAiDevice = \"ai.device.\";\n    let strAiOperationName = \"ai.operation.name\";\n    let strAiSdkVersion = \"ai.internal.sdkVersion\";\n    let strToLowerCase = \"toLowerCase\";\n    tags[strAiDevice + \"id\"] = type[strToLowerCase]();\n    tags[strAiDevice + \"type\"] = type;\n    tags[strAiOperationName] = locn && locn.pathname || \"_unknown_\";\n    tags[strAiSdkVersion] = \"javascript:snippet_\" + (sv || version);\n\n    let envelope:IEnvelope = {\n        time: _getTime(),\n        iKey: iKey,\n        name: \"Microsoft.ApplicationInsights.\" + iKey.replace(/-/g, strEmpty) + \".\" + theType,\n        sampleRate: 100,\n        tags: tags,\n        data: {\n            baseData: {\n                ver: 2\n            }\n        },\n        ver: undefined,\n        seq: \"1\",\n        aiDataContract: undefined\n    };\n    return envelope;\n}\n\nlet track = \"track\";\nlet trackPage = \"TrackPage\";\nlet trackEvent = \"TrackEvent\";\n\nexport const aiMethod = [\n    track + \"Event\",\n    track + \"Exception\",\n    track + \"PageView\",\n    track + \"PageViewPerformance\",\n    \"addTelemetryInitializer\",\n    track + \"Trace\",\n    track + \"DependencyData\",\n    track + \"Metric\",\n    \"start\" + trackPage,\n    \"stop\" + trackPage,\n    \"start\" + trackEvent,\n    \"stop\" + trackEvent,\n    \"setAuthenticatedUserContext\",\n    \"clearAuthenticatedUserContext\",\n    \"flush\"\n]\n\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/applicationinsights-web-snippet.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { ISnippetConfig, SdkLoaderConfig } from \"./type\";\nimport { _ensureBoolean, _ensureNumber, _escapeUnsupportedChars, _getSourceMap } from \"./common/utils\";\n\nexport { ISnippetConfig, SdkLoaderConfig } from \"./type\";\n\nconst originSnippet = \"##replaceOriginSnippet##\";\nexport const webSnippet = \"##replaceIKeySnippet##\";\nexport const webSnippetCs = \"##replaceConnStringSnippet##\";\n\nexport function webSnippetVersion() {\n    let parse = /sv:\\\"([^\\\"]+)\\\"/.exec(webSnippet);\n    if (parse) {\n        return parse[1];\n    }\n\n    return \"\";\n}\n\nexport function getSdkLoaderScript(config: SdkLoaderConfig): string {\n    let snippetConfig: ISnippetConfig = {\n        src: _escapeUnsupportedChars(config.src? config.src : \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\"),\n        crossOrigin: _escapeUnsupportedChars(config.crossOrigin ? config.crossOrigin : \"anonymous\"),\n        cfg: {},\n        name: _escapeUnsupportedChars(config.name ? config.name : \"appInsights\"),\n        ld: _ensureNumber(config.ld),\n        useXhr: _ensureBoolean(config.useXhr),\n        cr: _ensureBoolean(config.cr),\n        dle: _ensureBoolean(config.dle),\n        sri: _ensureBoolean(config.sri)\n    };\n\n    if (config.instrumentationKey) {\n        snippetConfig.cfg.instrumentationKey = _escapeUnsupportedChars(config.instrumentationKey);\n    } else if (config.connectionString) {\n        snippetConfig.cfg.connectionString = _escapeUnsupportedChars(config.connectionString);\n    }\n\n    let sourceMap = _getSourceMap(originSnippet);\n    let sourcemapComment = sourceMap[0];\n    let cleanedSnippet = sourceMap[1];\n   \n    let configString: string = JSON.stringify(snippetConfig);\n    let result = \"!(function (cfg){\" + cleanedSnippet + \"})(\\n\" + configString + \"\\n);\";\n    \n    // Append sourcemap comment at the end if it exists\n    if (sourcemapComment) {\n        result += \"\\n\" + sourcemapComment;\n    }\n    return result;\n}\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/common/utils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nconst charMap: { [key: string]: string } = {\n    \"<\": \"\\\\u003C\",\n    \">\" : \"\\\\u003E\",\n    \"\\\\\": \"\\\\\\\\\",\n    \"\\b\": \"\\\\b\",\n    \"\\f\": \"\\\\f\",\n    \"\\n\": \"\\\\n\",\n    \"\\r\": \"\\\\r\",\n    \"\\t\": \"\\\\t\",\n    \"\\0\": \"\\\\0\",\n    \"\\u2028\": \"\\\\u2028\",\n    \"\\u2029\": \"\\\\u2029\"\n};\n\nconst sourceMap = /\\/\\/# sourceMappingURL=.*\\.js\\.map$/gm;\n\nexport function _escapeUnsupportedChars(value: any) {\n    if (value) {\n        value = value.replace(/[<>\\\\\\b\\f\\n\\r\\t\\0\\u2028\\u2029]/g, (match: string) => {\n            return charMap[match];\n        });\n    }\n\n    return value;\n}\n\nexport function _ensureBoolean(value: any): boolean {\n    if (value !== undefined) {\n        value = !!value;\n    }\n\n    return value;\n}\n\nexport function _ensureNumber(value: any): number {\n    if (value !== undefined) {\n        value = Number(value);\n    }\n\n    return value;\n}\n\nexport function _getSourceMap(value: string): string[] {\n    let rlt = \"\";\n    let cleanedStr = value;\n    if (value) {\n        let matches = value.match(sourceMap);\n        // process when there is only one source map\n        if (matches && matches.length === 1) {\n            rlt = matches[0].trim();\n            cleanedStr = value.replace(sourceMap, \"\");\n        }\n    }\n\n    return [rlt, cleanedStr];\n}"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/snippet-config.jsonc",
    "content": "{\n    src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n    // name: \"appInsights\", // Global SDK Instance name defaults to \"appInsights\" when not supplied\n    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,\n    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),\n    // dle: true, // Prevent the SDK from reporting load failure log\n    crossOrigin: \"anonymous\", // When supplied this will add the provided value as the cross origin attribute on the script tag\n    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)\n    // sri: false, // Custom optional value to specify whether fetching the snippet from integrity file and do integrity check \n    // pl: false, // Custom optional value to specify whether to enable the trusted type policy check on snippet\n    // pn: \"aiPolicy\", // Custom optional value to specify the name of the trusted type policy that would be implemented on the snippet, default is \"aiPolicy\"\n    // ttp: null, // Custom optional value to specify the trusted type policy that would be applied on the snippet src\n    // nt: null, // Custom optional value to specify the nounce tag value that would be applied on the script when we drop it on the page\n    cfg: { // Application Insights Configuration\n        connectionString: \"YOUR_CONNECTION_STRING\"\n    }\n}\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/snippet.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable no-constant-condition */\nimport { Fields, ISnippetConfig } from \"./type\";\nimport { IConfig, IEnvelope } from \"@microsoft/applicationinsights-core-js\";\nimport { IConfiguration, Snippet } from \"@microsoft/applicationinsights-web\";\nimport { oneDsEnvelope } from \"./1dsType\";\nimport { _createAiEnvelope, aiMethod } from \"./aiSupport\";\nimport { _createOneDsEnvelope, oneDsMethods } from \"./1dsSupport\";\n// To ensure that SnippetConfig resides at the bottom of snippet.min.js,\n// cfg needs to be declared globally at the top without being assigned values.\n// This allows us to later assign cfg into the function at the bottom.\n// We achieve this by using the expandMin function in gruntfile,\n// which will forcefully overwrite the min file.\ndeclare var cfg:ISnippetConfig;\n\n(function (win: Window, doc: Document) {\n    let isOneDS = false;  // place holder, will be removed during runtime\n    let UInt32Mask = 0x100000000;\n    let locn: Location = win.location;\n    let helpLink = \"https://go.microsoft.com/fwlink/?linkid=2128109\";\n    let scriptText = \"script\";\n    let strInstrumentationKey = \"instrumentationKey\";\n    let strIngestionendpoint = \"ingestionendpoint\";\n    let strDisableExceptionTracking = \"disableExceptionTracking\";\n    let strToLowerCase = \"toLowerCase\";\n    let strConStringIKey = strInstrumentationKey[strToLowerCase]();\n    let strEmpty = \"\";\n    let strUndefined = \"undefined\";\n    let strCrossOrigin = \"crossOrigin\";\n    let strJsonResponseError = \"Error Loading JSON response\";\n\n    let strPostMethod = \"POST\";\n    let strGetMethod = \"GET\";\n    let policyName = cfg.pn || \"aiPolicy\";\n    let _sequence = 0;\n    let _epoch = 0;\n    let sdkInstanceName:string;\n    let aiName:string;\n\n   \n    if (isOneDS){\n        sdkInstanceName = \"onedsSDK\";\n        aiName = cfg.name || \"oneDSWeb\";  // provide non default instance name through snipConfig name value\n    } else {\n        sdkInstanceName = \"appInsightsSDK\";\n        aiName = cfg.name || \"appInsights\";\n    }\n\n    if (cfg.name || win[sdkInstanceName]) {\n        // Only set if supplied or another name is defined to avoid polluting the global namespace\n        win[sdkInstanceName] = aiName;\n    }\n\n    let aiSdk = win[aiName] || (function (aiConfig: IConfiguration & IConfig , aiExtensions?: any) {\n        let targetSrc : string = (aiConfig as any)[\"url\"] || cfg.src;\n        \n      \n        let loadFailed = false;\n        let handled = false;\n        let appInsights: (Snippet & {cookie?:any, core?:any, extensions?:any, initialize?: boolean, isInitialized?: () => boolean;}) = {\n            initialize: true,   // initialize sdk on download\n            queue: [],\n            sv: \"10\",       // Track the actual snippet version for reporting.\n            config: aiConfig,\n            version: 2.0,\n            extensions: aiExtensions\n        };\n\n        if (isOneDS && !aiConfig[\"webAnalyticsConfiguration\"]){\n            aiConfig[\"webAnalyticsConfiguration\"] = {};\n        }\n    \n        function isIE() {\n            let nav = navigator;\n            if (nav) {\n                let userAgent = (nav.userAgent || \"\").toLowerCase();\n                return (userAgent.indexOf(\"msie\") !== -1 || userAgent.indexOf(\"trident/\") !== -1);\n            }\n            return false;\n        }\n       \n        function _parseConnectionString() {\n            let fields:Fields = {};\n            let connectionString = aiConfig.connectionString;\n            if (typeof connectionString === \"string\" && connectionString) {\n                let kvPairs = connectionString.split(\";\");\n                for (let lp = 0; lp < kvPairs.length; lp++) {\n                    let kvParts = kvPairs[lp].split(\"=\");\n                    if (kvParts.length === 2) { // only save fields with valid formats\n                        fields[kvParts[0][strToLowerCase]()] = kvParts[1];\n                    }\n                }\n            }\n\n            // apply the default endpoints\n            if (!fields[strIngestionendpoint]) {\n                // use endpoint suffix where overrides are not provided\n                let endpointSuffix = fields.endpointsuffix;\n                // Only fetch the location if a suffix was supplied\n                let fLocation = endpointSuffix ? fields.location : null;\n                fields[strIngestionendpoint] = \"https://\" + (fLocation ? fLocation + \".\" : strEmpty) + \"dc.\" + (endpointSuffix || \"services.visualstudio.com\");\n            }\n            return fields;\n        }\n\n        function _sendEvents(evts:(IEnvelope | oneDsEnvelope)[], endpointUrl?:any) {\n            if (JSON) {\n                let sender = win.fetch;\n                if (sender && !cfg.useXhr) {\n                    sender(endpointUrl, { method:strPostMethod, body: JSON.stringify(evts), mode:\"cors\"});\n                } else if (XMLHttpRequest) {\n                    // IE doesn't support fetch and private clouds may only be using IE\n                    let xhr = new XMLHttpRequest();\n                    xhr.open(strPostMethod, endpointUrl);\n                    xhr.setRequestHeader(\"Content-type\", \"application/json\");\n                    xhr.send(JSON.stringify(evts));\n                }\n            }\n        }\n\n        function _reportFailure(targetSrc:string) {\n            if(cfg.dle === true) {\n                return;\n            }\n            let iKey;\n            let endpointUrl;\n            if (isOneDS){\n                endpointUrl = aiConfig.endpointUrl || \"https://browser.events.data.microsoft.com/OneCollector/1.0/\";\n                iKey = aiConfig[\"instrumentationKey\"] || \"\";\n                let channelConfig = aiConfig[\"channelConfiguration\"];\n                if (channelConfig) {\n                    endpointUrl = channelConfig.overrideEndpointUrl || endpointUrl;\n                    iKey = channelConfig[\"overrideInstrumentationKey\"] || iKey;\n                }\n                let dt = Date;\n                let now;\n                if (dt.now) {\n                    now = dt.now();\n                } else {\n                    now = new dt().getTime();\n                }\n                endpointUrl = endpointUrl + \"?cors=true&content-type=application/x-json-stream&client-id=NO_AUTH&client-version=\" + appInsights.sv + \"&apikey=\" + iKey + \"&w=0&upload-time=\" + now.toString();\n            } else {\n                let conString = _parseConnectionString();\n                iKey = conString[strConStringIKey] || aiConfig[strInstrumentationKey] || strEmpty;\n                let ingest = conString[strIngestionendpoint];\n                if (ingest && ingest.slice(-1) === \"/\"){\n                    ingest = ingest.slice(0,-1);\n                }\n                endpointUrl = ingest ? ingest + \"/v2/track\" : aiConfig.endpointUrl; // only add /v2/track when from connectionstring\n                endpointUrl = aiConfig.userOverrideEndpointUrl ? aiConfig.userOverrideEndpointUrl : endpointUrl;\n            }\n           \n\n            let message = \"SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)\";\n            let evts: (IEnvelope | oneDsEnvelope)[] = [];\n            evts.push(_createException(iKey, message, targetSrc, endpointUrl));\n            if (!isOneDS){\n                evts.push(_createInternal(iKey, message, targetSrc, endpointUrl));\n            }\n\n            _sendEvents(evts, endpointUrl);\n        }\n\n        function _createEnvelope(iKey:string, theType:string) {\n            if (_epoch === 0) {\n                _epoch = Math.floor((UInt32Mask * Math.random()) | 0) >>> 0;\n            }\n            if (isOneDS){\n                return _createOneDsEnvelope(iKey, theType, _epoch, _sequence, appInsights.sv);\n            } else {\n                return _createAiEnvelope(iKey, theType, appInsights.sv, appInsights.version, locn);\n            }\n        }\n\n        function _createInternal(iKey:string, message:string, targetSrc:string, endpointUrl:any) {\n            let envelope : IEnvelope| oneDsEnvelope = _createEnvelope(iKey, \"Message\");\n            let data = envelope.data;\n            data.baseType = \"MessageData\";\n            let baseData = data.baseData;\n\n            baseData.message = \"AI (Internal): 99 message:\\\"\" + (message + \" (\" + targetSrc + \")\").replace(/\\\"/g, strEmpty) + \"\\\"\";\n            baseData.properties = {\n                endpoint: endpointUrl\n            };\n            \n            return envelope;\n        }\n\n        function _createException(iKey:string, message:string, targetSrc:string, endpointUrl:any) {\n            let envelope : IEnvelope | oneDsEnvelope;\n            if (isOneDS){\n                envelope = _createEnvelope(iKey, \"Ms.Web.ClientError\");\n            } else {\n                envelope = _createEnvelope(iKey, \"Exception\");\n            }\n            let data = envelope.data;\n            data.baseType = \"ExceptionData\";\n            data.baseData.exceptions = [{\n                typeName: \"SDKLoadFailed\",\n                message: message.replace(/\\./g, \"-\"),  // Replacing '.' characters as it causes the portal to hide the start of the message in the summary\n                hasFullStack: false,\n                stack: message + \"\\nSnippet failed to load [\" + targetSrc + \"] -- Telemetry is disabled\\nHelp Link: \" + helpLink + \"\\nHost: \" + (locn && locn.pathname || \"_unknown_\") + \"\\nEndpoint: \" + endpointUrl,\n                parsedStack: []\n            }];\n\n            return envelope;\n        }\n\n        let domainRetryIndex = -1;\n        let domainRetryCount = 0;\n        let domains = [\n            \"js.monitor.azure.com\",\n            \"js.cdn.applicationinsights.io\",\n            \"js.cdn.monitor.azure.com\",\n            \"js0.cdn.applicationinsights.io\",\n            \"js0.cdn.monitor.azure.com\",\n            \"js2.cdn.applicationinsights.io\",\n            \"js2.cdn.monitor.azure.com\",\n            \"az416426.vo.msecnd.net\" // this domain is supported but not recommended\n        ];\n\n        const fallback = () => setScript(targetSrc, null);\n        if (cfg.sri) {\n            const match = targetSrc.match(/^((http[s]?:\\/\\/.*\\/)\\w+(\\.\\d+){1,5})\\.(([\\w]+\\.){0,2}js)$/);\n            if (match && match.length === 6) {\n                const integrityUrl = `${match[1]}.integrity.json`;\n                const targetType = `@${match[4]}`;\n                const sender = window.fetch;\n                const handleResponse = (json:any) => {\n                    if (!json.ext || !json.ext[targetType] || !json.ext[targetType].file) {\n                        throw new Error(strJsonResponseError);\n                    }\n                    const integrity = json.ext[targetType].integrity || null;\n                    targetSrc = match[2] + json.ext[targetType].file;\n                    setScript(targetSrc, integrity);\n                };\n        \n                if (sender && !cfg.useXhr) {\n                    sender(integrityUrl, { method: strGetMethod, mode: \"cors\" })\n                        .then(response => response.json().catch(() => ({})))\n                        .then(handleResponse)\n                        .catch(fallback);\n                } else if (XMLHttpRequest) {\n                    const xhr = new XMLHttpRequest();\n                    xhr.open(strGetMethod, integrityUrl);\n                    xhr.onreadystatechange = () => {\n                        if (xhr.readyState === XMLHttpRequest.DONE) {\n                            if (xhr.status === 200) {\n                                try {\n                                    handleResponse(JSON.parse(xhr.responseText));\n                                } catch {\n                                    fallback();\n                                }\n                            } else {\n                                fallback();\n                            }\n                        }\n                    };\n                    xhr.send();\n                }\n            } else if (targetSrc) {\n                fallback(); // Fallback to original behavior\n            }\n        } else if (targetSrc) {\n            fallback(); // Fallback to original behavior\n        }\n        \n\n\n        function setScript(targetSrc: string, integrity: string | null) {\n            if (isIE() && targetSrc.indexOf(\"ai.3\") !== -1) {\n                // This regex matches any URL which contains \"\\ai.3.\" but not any full versions like \"\\ai.3.1\" etc\n                targetSrc = targetSrc.replace(/(\\/)(ai\\.3\\.)([^\\d]*)$/, function(_all, g1, g2) {\n                    return g1 + \"ai.2\" + g2;\n                });\n                // let message = \"Load Version 2 SDK instead to support IE\"; // where to report this error?\n            }\n\n            if (cfg.cr !== false){\n                for (var i = 0; i < domains.length; i++){\n                    if (targetSrc.indexOf(domains[i]) > 0){\n                        domainRetryIndex = i;\n                        break;\n                    }\n                }\n            }\n\n            const _handleError = (evt?: any) => {\n                appInsights.queue = []; // Clear the queue\n                if (!handled) {\n                    // start retry\n                    if (domainRetryIndex >= 0 && domainRetryCount + 1 < domains.length){ // domainRetryIndex will be negative when client using own domain (the supported domain list is defined above)\n                        let nextIdx = (domainRetryIndex + domainRetryCount + 1) % domains.length;\n                        _createScript(targetSrc.replace(/^(.*\\/\\/)([\\w\\.]*)(\\/.*)$/, function (_all, http, domain, qs) {\n                            return http + domains[nextIdx] + qs;\n                        }));\n                        domainRetryCount += 1;\n                    } else {\n                        handled = true;\n                        loadFailed = true;\n                        _reportFailure(targetSrc);\n                    }\n                }\n            }\n\n            const _handleLoad = (evt?: any, isAbort?:any) => {\n                if (!handled) {\n                    // IE10, Opera calls loaded before the script is processed.\n                    // so delaying to give the script a chance to be processed\n                    setTimeout(function() {\n                        if (isAbort){\n                            if (isOneDS){\n                                if (typeof appInsights.isInitialized !== \"function\" || !appInsights.isInitialized()){\n                                    _handleError();\n                                }\n                            } else {\n                                if (!appInsights.core){\n                                    _handleError();\n                                }\n                            }\n                        }\n                       \n                    }, 500);\n                }\n                loadFailed = false;\n            }\n\n            function create_policy() {\n                // Function to handle URL validation\n                function validateURL(urlString: string): string | null {\n                    try {\n                        const url = new URL(urlString);\n                        if (url.host && url.host === \"js.monitor.azure.com\") {\n                            return urlString;\n                        } else {\n                            handleInvalidURL(urlString);\n                        }\n                    } catch {\n                        handleInvalidURL(urlString);\n                    }\n                }\n            \n                // Function to handle reporting failures\n                function handleInvalidURL(urlString: string) {\n                    _reportFailure(\"AI policy blocked URL: \" + urlString);\n                }\n            \n                return (window as any).trustedTypes?.createPolicy(policyName, {\n                    createScriptURL: validateURL\n                });\n            }\n            \n           \n            const _createScript = (src: string) => {\n                let scriptElement : HTMLElement = doc.createElement(scriptText);\n                if (cfg.pl){\n                    if (cfg.ttp && cfg.ttp.createScript) {\n                        (scriptElement as any)[\"src\"] = cfg.ttp.createScriptURL(src);\n                    } else {\n                        (scriptElement as any)[\"src\"] = create_policy().createScriptURL(src);\n                    }\n                } else {\n                    (scriptElement as any)[\"src\"] = src;\n                }\n                \n                if (cfg.nt) {\n                    (scriptElement as any).setAttribute(\"nonce\", cfg.nt);\n                }\n               \n                if (integrity){\n                    // Set the integrity attribute to the script tag if integrity is provided\n                    (scriptElement as any).integrity = integrity;\n                }\n                (scriptElement as any).setAttribute(\"data-ai-name\", aiName);\n                // Allocate Cross origin only if defined and available\n                let crossOrigin = cfg[strCrossOrigin];\n                if ((crossOrigin || crossOrigin === \"\") && scriptElement[strCrossOrigin] != strUndefined) {\n                    scriptElement[strCrossOrigin] = crossOrigin;\n                }\n                scriptElement.onload = _handleLoad;\n                scriptElement.onerror = _handleError;\n                // Some browsers support onload while others onreadystatechange and others both\n                (scriptElement as any)[\"onreadystatechange\"] = function (evt?:any, isAbort?:any) {\n                    if ((scriptElement as any)[\"readyState\"] === \"loaded\" || (scriptElement as any)[\"readyState\"]  === \"complete\") {\n                        _handleLoad(evt, isAbort);\n                    }\n                };\n\n                if (cfg.ld && cfg.ld < 0) {\n                    // if user wants to append tag to document head, blocking page load\n                    let headNode = doc.getElementsByTagName(\"head\")[0];\n                    headNode.appendChild(scriptElement);\n                } else {\n                    setTimeout(function () {\n                        // Attempts to place the script tag in the same location as the first script on the page\n                        doc.getElementsByTagName(scriptText)[0].parentNode.appendChild(scriptElement);\n                    }, cfg.ld || 0);\n                }\n\n\n                return scriptElement;\n            }\n            _createScript(targetSrc);\n        }\n    \n        // capture initial cookie\n        try {\n            appInsights.cookie = doc.cookie;\n        } catch (e) {\n            // eslint-disable-next-line no-empty\n        }\n    \n        function _createMethods(methods:any[]) {\n            while (methods.length) {\n                (function (name) {\n                    // Define a temporary method that queues-up a the real method call\n                    appInsights[name] = function () {\n                        // Capture the original arguments passed to the method\n                        let originalArguments = arguments;\n                        if (!loadFailed) { // If we have detected that the main script failed to load then stop queuing events that will never be processed\n                            // Queue-up a call to the real method\n                            appInsights.queue.push(function () {\n                                // Invoke the real method with the captured original arguments\n                                appInsights[name].apply(appInsights, originalArguments);\n                            });\n                        }\n                    };\n                })(methods.pop());\n            }\n        }\n        \n        if (isOneDS){\n            _createMethods(oneDsMethods);\n        } else {\n            _createMethods(aiMethod);\n        }\n\n        // expose SeverityLevel enum\n        appInsights[\"SeverityLevel\"] = {\n            Verbose : 0,\n            Information : 1,\n            Warning : 2,\n            Error : 3,\n            Critical : 4\n        };\n        // Collect global errors\n        let globalErrorCollect = false;\n        if (isOneDS){\n            let autoCapture = aiConfig[\"webAnalyticsConfiguration\"][\"autoCapture\"];\n            if (!autoCapture || autoCapture.jsError) {\n                globalErrorCollect = true;\n            }\n        } else {\n        // Note: ApplicationInsightsAnalytics is the extension string identifier for\n        //  AppAnalytics. It is defined in ApplicationInsights.ts:ApplicationInsights.identifer\n            let analyticsCfg = ((aiConfig.extensionConfig || {}).ApplicationInsightsAnalytics ||{});\n            if (!(aiConfig[strDisableExceptionTracking] === true || analyticsCfg[strDisableExceptionTracking] === true)) {\n                globalErrorCollect = true;\n            }\n        }\n\n        if (globalErrorCollect){\n            let method = \"onerror\";\n            _createMethods([\"_\" + method]);\n            let originalOnError = win[method];\n            win[method] = function(message:string, url:string, lineNumber:Number, columnNumber:Number, error?:any) {\n                let handled = originalOnError && originalOnError(message, url, lineNumber, columnNumber, error);\n                if (handled !== true) {\n                    appInsights[\"_\" + method]({\n                        message: message,\n                        url: url,\n                        lineNumber: lineNumber,\n                        columnNumber: columnNumber,\n                        error: error,\n                        evt: win.event\n                    });\n                }\n\n                return handled;\n            };\n            aiConfig[\"autoExceptionInstrumented\"] = true;\n        }\n\n        return appInsights;\n    })(cfg.cfg);\n\n    // global instance must be set in this order to mitigate issues in ie8 and lower\n    win[aiName] = aiSdk;\n    \n    function _onInit() {\n        if (cfg.onInit) {\n            cfg.onInit(aiSdk);\n        }\n    }\n\n    // if somebody calls the snippet twice, don't report page view again\n    if (aiSdk.queue && aiSdk.queue.length === 0) {\n        aiSdk.queue.push(_onInit);\n        if (!isOneDS){\n            aiSdk.trackPageView({});\n        }\n    } else {\n        // Already loaded so just call the onInit\n        _onInit();\n    }\n})(window, document);\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/support.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nlet strEmpty = \"\";\n\n// Gets the time as an ISO date format, using a function as IE7/8 doesn't support toISOString\nexport function _getTime() {\n    let date = new Date();\n    function pad(num: Number) {\n        let r = strEmpty + num;\n        if (r.length === 1) {\n            r = \"0\" + r;\n        }\n\n        return r;\n    }\n\n    return date.getUTCFullYear()\n        + \"-\" + pad(date.getUTCMonth() + 1)\n        + \"-\" + pad(date.getUTCDate())\n        + \"T\" + pad(date.getUTCHours())\n        + \":\" + pad(date.getUTCMinutes())\n        + \":\" + pad(date.getUTCSeconds())\n        + \".\" + String((date.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)\n        + \"Z\";\n}\n\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/src/type.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IConfiguration } from \"@microsoft/applicationinsights-web\";\n\n/**\n * Configuration options for the `getSdkLoaderScript()` helper function, which generates\n * a ready-to-use SDK Loader (snippet) script string for embedding in an HTML page.\n *\n * This is a simplified configuration interface intended for server-side rendering scenarios\n * where you want to programmatically generate the snippet. For the full set of snippet\n * configuration options used by the snippet itself, see {@link ISnippetConfig}.\n *\n * **Important:** You MUST provide either `connectionString` or `instrumentationKey`. Failure\n * to provide at least one of these will result in the SDK not loading, failing to initialize,\n * or reporting an error.\n *\n * @example\n * ```typescript\n * import { getSdkLoaderScript } from \"@microsoft/applicationinsights-web-snippet\";\n *\n * const script = getSdkLoaderScript({\n *     connectionString: \"YOUR_CONNECTION_STRING\",\n *     sri: true\n * });\n * // Insert `script` into your HTML page's <head> section\n * ```\n */\nexport interface SdkLoaderConfig {\n    /**\n     * The Application Insights instrumentation key. Either this or `connectionString` MUST be\n     * provided — prefer using `connectionString` instead.\n     */\n    instrumentationKey?: string;\n\n    /**\n     * The Application Insights connection string. Either this or `instrumentationKey` MUST be\n     * provided. This is the recommended approach as it configures both the endpoint and\n     * instrumentation key in a single value.\n     */\n    connectionString?: string;\n\n    /**\n     * (Optional) The full URL for where to load the SDK from.\n     * Defaults to `\"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\"` when not supplied.\n     *\n     * **Note:** When Internet Explorer is detected by the SDK Loader, the URL is automatically\n     * rewritten to load the v2.x SDK (e.g. `ai.3.gbl.min.js` becomes `ai.2.gbl.min.js`).\n     */\n    src?: string;\n\n    /**\n     * (Optional) The global name for the initialized SDK instance. Defaults to `\"appInsights\"`.\n     */\n    name?: string;\n\n    /**\n     * (Optional) Defines the load delay (in ms) before attempting to load the SDK.\n     * Default is 0ms. A negative value immediately adds the script tag to the `<head>`,\n     * to attempt to block the page load event (not all browsers honour this) until the script is loaded or fails.\n     */\n    ld?: number;\n\n    /**\n     * (Optional) Use XHR instead of fetch to report SDK load failures. Only needed in\n     * environments where fetch would fail to send the failure events.\n     */\n    useXhr?: boolean;\n\n    /**\n     * (Optional) The `crossOrigin` attribute value for the script tag added to download the SDK.\n     * Recommended values: `\"\"`, `\"anonymous\"`. When not defined, no crossOrigin attribute is added.\n     */\n    crossOrigin?: string;\n\n    /**\n     * (Optional) The [IConfiguration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html)\n     * configuration object passed to the Application Insights SDK during initialization.\n     */\n    cfg?: any;\n\n    /**\n     * (Optional) Controls CDN fallback retry behavior. By default (`true`), if the SDK fails\n     * to load from the configured `src` URL, the snippet automatically attempts to load from\n     * multiple supported CDN domains in case one or more of them is temporarily unavailable.\n     * Set to `false` to disable this fallback and only attempt the single configured `src` URL.\n     */\n    cr?: boolean;\n\n    /**\n     * (Optional) Disable Load Error reporting, when set to `true`, prevents the SDK from reporting load failure telemetry.\n     */\n    dle?: boolean;\n\n    /**\n     * (Optional) Sub-resource Integrity (SRI) checking. When set to `true`, enables Sub-Resource Integrity (SRI) checking.\n     * The snippet will fetch an integrity file and validate the SDK script hash before execution.\n     */\n    sri?: boolean;\n\n    /**\n     * (Optional) Trusted Type policy support. When set to `true`, enables Trusted Type policy validation on the snippet.\n     */\n    pl?: boolean;\n\n    /**\n     * (Optional) The name of the Trusted Type policy to use. Defaults to `\"aiPolicy\"`.\n     */\n    pn?: string;\n\n    /**\n     * (Optional) A pre-created `TrustedTypePolicy` instance to apply to the snippet `src` URL.\n     */\n    ttp?: TrustedTypePolicy;\n}\n\nexport abstract class TrustedTypePolicy {\n    readonly name: string;\n    createHTML?: ((input: string, ...args: any[]) => string) | undefined;\n    createScript?: ((input: string, ...args: any[]) => string) | undefined;\n    createScriptURL?: ((input: string, ...args: any[]) => string) | undefined;\n}\n\n/**\n * Configuration options for the Application Insights SDK Loader (snippet) that is embedded\n * directly in an HTML page. These options control how the SDK script is loaded from the CDN,\n * error reporting behavior, security policies, and the SDK initialization configuration.\n *\n * This interface represents the configuration object passed to the self-executing snippet function.\n * For a simplified interface used with the `getSdkLoaderScript()` helper, see {@link SdkLoaderConfig}.\n *\n * **Internet Explorer Fallback:** When the SDK Loader detects Internet Explorer (via the `msie` or\n * `trident/` user agent strings), it automatically rewrites the `src` URL to load the v2.x SDK\n * instead of v3.x (e.g. `ai.3.gbl.min.js` becomes `ai.2.gbl.min.js`). This means v3.x-only\n * APIs — including the new OpenTelemetry-based APIs — will not be available for those users.\n *\n * @example\n * ```html\n * <script type=\"text/javascript\">\n * !function(T,l,y){/* snippet code *\\/}(window, document, {\n *   src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n *   crossOrigin: \"anonymous\",\n *   onInit: function (sdk) {\n *     sdk.addTelemetryInitializer(function (envelope) {\n *       envelope.data.someField = 'This item passed through my telemetry initializer';\n *     });\n *   },\n *   cfg: {\n *     connectionString: \"YOUR_CONNECTION_STRING\"\n *   }\n * });\n * </script>\n * ```\n */\nexport interface ISnippetConfig {\n    /**\n     * **[required]** The full URL for where to load the SDK from. This value is used for the `src`\n     * attribute of a dynamically added `<script>` tag. You can use the public CDN location or your\n     * own privately hosted one.\n     *\n     * **Note:** When Internet Explorer is detected, the SDK Loader automatically rewrites this URL\n     * to load the v2.x SDK (e.g. `ai.3.gbl.min.js` becomes `ai.2.gbl.min.js`).\n     *\n     * @example\n     * ```\n     * src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\"\n     * ```\n     */\n    src: string;\n\n    /**\n     * (Optional) The global name for the initialized SDK instance. Defaults to `\"appInsights\"`.\n     * So `window.appInsights` will be a reference to the initialized instance. If you provide a\n     * name value or a previous instance appears to be assigned (via the global name `appInsightsSDK`),\n     * this name will also be defined in the global namespace as `window.appInsightsSDK=<name value>`.\n     */\n    name?: string;\n\n    /**\n     * (Optional) Defines the load delay (in ms) before attempting to load the SDK.\n     * Default is 0ms. A negative value immediately adds the script tag to the `<head>` region,\n     * blocking the page load event until the script is loaded or fails.\n     */\n    ld?: number;\n\n    /**\n     * (Optional) Use XHR instead of fetch to report SDK load failures. Only needed in\n     * environments where fetch would fail to send the failure events.\n     */\n    useXhr?: boolean;\n\n    /**\n     * (Optional) The `crossOrigin` attribute value for the script tag added to download the SDK.\n     * Recommended values: not defined (the default), `\"\"`, or `\"anonymous\"`.\n     * See [HTML attribute: crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin).\n     */\n    crossOrigin?: string;\n\n    /**\n     * (Optional) Callback function called after the main SDK script has been successfully loaded\n     * and initialized from the CDN. It receives a reference to the SDK instance and is called\n     * _before_ the first initial page view. If the SDK has already been loaded and initialized,\n     * this callback will still be called.\n     *\n     * **Note:** As this callback is called during the processing of the `sdk.queue` array, you\n     * CANNOT add additional items to the queue — they will be ignored and dropped.\n     *\n     * @example\n     * ```\n     * onInit: function (sdk) {\n     *   sdk.addTelemetryInitializer(function (envelope) {\n     *     envelope.data.someField = 'custom value';\n     *   });\n     * }\n     * ```\n     */\n    onInit?: any;\n\n    /**\n     * **[required]** The [IConfiguration](https://microsoft.github.io/ApplicationInsights-JS/webSdk/applicationinsights-web/interfaces/IConfiguration.html)\n     * configuration object passed to the Application Insights SDK during initialization.\n     *\n     * @example\n     * ```\n     * cfg: {\n     *   connectionString: \"YOUR_CONNECTION_STRING\",\n     *   enableAutoRouteTracking: true\n     * }\n     * ```\n     */\n    cfg: IConfiguration;\n\n    /**\n     * (Optional) Controls CDN fallback retry behavior. By default (`true`), if the SDK fails\n     * to load from the configured `src` URL, the snippet automatically attempts to load from\n     * multiple supported CDN domains in case one or more of them is temporarily unavailable.\n     * Set to `false` to disable this fallback and only attempt the single configured `src` URL.\n     */\n    cr?: boolean;\n\n    /**\n     * (Optional) When set to `true`, prevents the SDK from reporting load failure telemetry.\n     */\n    dle?: boolean;\n\n    /**\n     * (Optional) When set to `true`, enables Sub-Resource Integrity (SRI) checking. The snippet\n     * will fetch an integrity file and validate the SDK script hash before execution. When this\n     * option is used, the integrity file is loaded first, affecting the load order and script\n     * execution. The `ld` option will be ignored. Additionally, if the page navigates away before\n     * the integrity file is loaded, some events may be lost.\n     */\n    sri?: boolean;\n\n    /**\n     * (Optional) When set to `true`, enables Trusted Type policy validation on the snippet.\n     */\n    pl?: boolean;\n\n    /**\n     * (Optional) The name of the Trusted Type policy to use. Defaults to `\"aiPolicy\"`.\n     */\n    pn?: string;\n\n    /**\n     * (Optional) A pre-created `TrustedTypePolicy` instance to apply to the snippet `src` URL.\n     */\n    ttp?: TrustedTypePolicy;\n\n    /**\n     * (Optional) The nonce attribute value that will be applied to the script tag when it is\n     * added to the page, for use with Content Security Policy (CSP).\n     */\n    nt?: string;\n}\n\nexport interface Fields {\n    strIngestionendpoint?: any;\n    endpointsuffix?: any;\n    location?: any;\n\n    // Add other properties as needed\n}\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/trustedTypeSupport.md",
    "content": "# Trusted Type Policy Support\n\nWe provide two methods for implementing Trusted Type policy checks. Choose the one that best aligns with your application's security requirements.\n\n## Case 1: Enforcing Trusted Types with require-trusted-types-for 'script'\nIf your page enforces script injection policies using the require-trusted-types-for 'script' directive, configure the snippet with the following options.\n\n### Configuration Options\n```js\n    /**\n     * Custom optional value to specify whether to enable the trusted type policy check on snippet\n     */\n    pl?: boolean;\n    /**\n     * Custom optional value to specify the name of the trusted type policy that would be implemented on the snippet, default is 'aiPolicy'\n     */\n    pn?: string;\n    /*\n    * Custom optional value to specify the trusted type policy that would be applied on the snippet src\n    */\n    ttp?: TrustedTypePolicy;\n```\n### Automatic Policy Creation\nTo automatically create and apply a Trusted Type policy, set pl to true. Optionally, you can specify a custom policy name using the pn parameter.\nExample:\n```html\n<script>\n    !(function (cfg) ....)({\n        src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n        pl: true,\n        pn: \"aiPolicy\",\n        cfg: {\n            connectionString: \"\"\n        }\n    });\n</script>\n```\n### Using a Custom Trusted Type Policy\nIf you prefer to use your own Trusted Type policy, you can create and pass it using the ttp option.\nExample:\n```html\n<script>\n    const myTrustedTypePolicy = trustedTypes.createPolicy('myTrustedTypePolicy', {\n        createScriptURL: (url) => {\n            console.log('Trusted Type Policy: myTrustedTypePolicy called with URL:', url);\n            return url;\n        }\n    });\n    !(function (cfg) ....)({\n        src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n        pl: true,\n        ttp: myTrustedTypePolicy,\n        cfg: {\n            connectionString: \"\"\n        }\n    });\n</script>\n```\n### Test\nYou can test the Trusted Type policy implementation by using our [test example](./Tests/manual/cspUsePolicyTest.html)\n\n## Method 2: Enforcing Script Policies with Nonce and script-src\nIf your page enforces script injection policies via the script-src 'self' directive, you can configure the snippet to use a nonce value.\nExample:\n```html\n<script>\n    !(function (cfg) ....)({\n        src: \"https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js\",\n        nt: \"randomNonceValue\",\n        cfg: {\n            connectionString: \"\"\n        }\n    });\n</script>\n```\nWhen the Application Insights script is added to your page, the provided nonce value will be tagged appropriately.\nNotice: Make sure to include the nonce value in your Content Security Policy (CSP) directive as follows:\n```html\nscript-src 'self' 'nonce-randomNonceValue'\n```"
  },
  {
    "path": "tools/applicationinsights-web-snippet/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": false,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"Node\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"noEmitHelpers\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"build/types\",\n    \"outDir\": \"build/output\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/*.ts\"\n, \"src/common/utils.ts\"  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}"
  },
  {
    "path": "tools/applicationinsights-web-snippet/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"forin\": false\n    }\n}\n"
  },
  {
    "path": "tools/applicationinsights-web-snippet/typedoc.json",
    "content": "{\n    \"$schema\": \"https://typedoc.org/schema.json\",\n    \"entryPoints\": [ \"./src/applicationinsights-web-snippet.ts\" ],\n    \"exclude\": [ \"**/internal/**/*.ts\", \"node_modules/**\" ],\n    \"externalPattern\": [\n        \"**/node_modules/**\",\n        \"node_modules/**\"\n    ],\n    \"sort\": [\n        \"alphabetical\",\n        \"kind\",\n        \"instance-first\"\n    ],\n    \"basePath\": \"./src\",\n    \"sourceLinkTemplate\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/{path}#L{line}\",\n    \"cleanOutputDir\": true,\n    \"excludeExternals\": false,\n    \"excludeInternal\": true,\n    \"excludePrivate\": true,\n    \"includeVersion\": true,\n    \"groupOrder\": [\n        \"Entrypoint\",\n        \"Modules\",\n        \"Namespaces\",\n        \"Enumerations\",\n        \"Enumeration Members\",\n        \"Classes\",\n        \"Interfaces\",\n        \"Type Aliases\",\n        \"Constructors\",\n        \"Properties\",\n        \"Variables\",\n        \"Functions\",\n        \"Accessors\",\n        \"Methods\",\n        \"References\",\n        \"*\"\n    ],\n    \"tsconfig\": \"./tsconfig.json\",\n    \"out\": \"../../docs/webSdk/applicationinsights-web-snippet\",\n    \"readme\": \"none\",\n    \"githubPages\": true,\n    \"gitRevision\": \"main\",\n    \"compilerOptions\": {\n        \"stripInternal\": true\n    },\n    \"sidebarLinks\": {\n        \"Changelog\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/RELEASES.md\",\n        \"Examples\": \"https://github.com/microsoft/ApplicationInsights-JS/blob/main/examples/README.md\",\n        \"Readme\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/applicationinsights-web-snippet\"\n    },\n    \"navigationLinks\": {\n        \"GitHub\": \"https://github.com/Microsoft/ApplicationInsights-JS\",\n        \"npm\": \"https://www.npmjs.com/package/@microsoft/applicationinsights-web-snippet\"\n    },\n    \"visibilityFilters\": {\n        \"protected\": false,\n        \"private\": false,\n        \"inherited\": true,\n        \"external\": true\n    }\n}"
  },
  {
    "path": "tools/chrome-debug-extension/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "tools/chrome-debug-extension/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft makes certain open source code available at https://3rdpartysource.microsoft.com,\nor you may send a check or money order for US $5.00, including the product name,\nthe open source component name, platform, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the extent\nrequired to debug changes to any libraries licensed under the GNU Lesser General Public License.\n\n---------------------------------------------------------\n\nfile-saver 2.0.5 - MIT\nhttps://github.com/eligrey/FileSaver.js#readme\n\nCopyright (c) 2016 Eli Grey\n\nThe MIT License\n\nCopyright © 2016 [Eli Grey][1].\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n  [1]: http://eligrey.com\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\njs-tokens 4.0.0 - MIT\nhttps://github.com/lydell/js-tokens#readme\n\nCopyright 2014, 2015, 2016, 2017, 2018 Simon Lydell\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nThe MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nloose-envify 1.4.0 - MIT\nhttps://github.com/zertosh/loose-envify\n\nCopyright (c) 2015 Andres Suarez <zertosh@gmail.com>\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez <zertosh@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nobject-assign 4.1.1 - MIT\nhttps://github.com/sindresorhus/object-assign#readme\n\n(c) Sindre Sorhus\n(c) Sindre Sorhus (https://sindresorhus.com)\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact 17.0.2 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-dom 17.0.2 - MIT\nhttps://reactjs.org/\n\n(c) Jb (c)\n(c) La (c)\n(c) Ma (c)\n(c) Pb (c)\n(c) http://www.w3.org/1999/xhtml\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nreact-is 16.13.1 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nscheduler 0.11.3 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n---------------------------------------------------------\n\nscheduler 0.20.2 - MIT\nhttps://reactjs.org/\n\nCopyright (c) Facebook, Inc. and its affiliates\n\nMIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n---------------------------------------------------------\n\n"
  },
  {
    "path": "tools/chrome-debug-extension/PRIVACY",
    "content": "# Data Collection\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices."
  },
  {
    "path": "tools/chrome-debug-extension/README.md",
    "content": "# Application Insights Debug Viewer\n\n## Breaking Changes from v0 to v1\nWith Chrome discontinuing support for Manifest v2, we’ve updated our extension from version v0 to v1 to align with Manifest v3. This update introduces several changes:\n\n- Migration to Chrome Storage API: Manifest V3 no longer supports localStorage; instead, it uses the Chrome Storage API. Consequently, your existing configuration will not be automatically transferred to the new version.\n\n- New Extension Name: To ensure a smooth update experience, we’ve changed the extension’s name from Telemetry Viewer to Telemetry Viewer M3. This allows you to run both versions simultaneously and manually copy your settings from the old extension to the new one.\n\n\n## What the tool does\n\nThis tool runs in your browser, either Chrome or Edge, and provides you real time visualization of events flowing through Application Insights. You can use it to monitor the telemetry that your web application is emitting as part of your dev inner loop or bug investigations, or you can use it to monitor the internal calls within Application Insights to debug your integration of Application Insights into your web application.\n\nWe recommend building a configuration file to represent the schema of the telemetry your web application emits, and have your engineering team use it during the dev inner loop to ensure their changes are emitting the expected telemetry, and to also catch warnings/errors early.\n\n## Installing the tool\n\n1. Download either the [official](https://js.monitor.azure.com/release/tools/ai.chrome-ext.zip) or [nightly](https://js.monitor.azure.com/nightly/tools/ai.chrome-ext.nightly.zip) build and unzip it into a folder\n1. Open the Manage Extensions page in either Chrome or Edge\n   - Browse to either edge://extensions or chrome://extensions/ respectively\n   - Or choose Extensions from the ... menu\n1. Enable Developer Mode\n1. Click `Load unpacked`\n1. Browse to the path where you unzipped the extension\n1. Click `Select Folder`\n\n## Using the tool\n\n1. To launch the tool, click the ![Telemetry-Viewer-icon](images/icon-19.png) icon next to the address bar\n    - If it isn't there, click the `small puzzle piece` icon and then the `Telemetry Viewer`![Telemetry-Viewer-icon](images/icon-19.png)\n1. The first time you run the tool, it will start in the `Configuration Selection` page, which you can always return to by clicking the gear icon later\n    - If your team has a preset configuration in the drop down list, select it\n    - Otherwise, use you can start with the Default configuration\n    - You can also chooose to craft your own custom configuration, using one of the presets as a starting point by clicking `Copy to Custom Configuration`\n1. Click `OK` and you will be taken to the main page where you can view live events as they are generated\n\n## Exploring the tool\n1. Tooltips explain what each feature across the top does\n1. Clicking on an event will show details of that event in the bottom half of the tool\n1. You can save a session to a .json file in your Downloads folder, and open it again by dragging it back into the tool's window\n    - This is handy for attaching a session to a bug report for an engineer to be able to examine later\n\n## Updating the tool\n1. To get the latest version of the tool, follow step 1 of the installation steps again, and unzip it to the same folder that you orginally unzipped it to\n1. In the browser, go to the `Manage Extensions` page\n     - Browse to either edge://extensions or chrome://extensions/ respectively\n1. Click `Reload` under the `Telemetry Viewer` extension\n\n## Configuring the tool\n\nGet the most out of the tool by customizing its configuration for your project. You can read about all of the options in the comments in [this file](https://github.com/microsoft/ApplicationInsights-JS/blob/main/tools/chrome-debug-extension/src/configuration/IConfiguration.ts)\n\nYou have several options for configurations:\n1. Use a preset configuration\n   - Ideal if your team already has one built that you can reuse - can be highly customized to your telemetry schema\n1. Use the default configuration\n   - Most suitable for situations where you are debugging the integration of Application Insights into your web application\n1. Use a local custom configuration\n   - Good for customizing the table layout to best match your telemetry schema\n   - Easily and rapidly iterate on your configuration right within the tool without having to recapture session data\n       - Click the gear icon to go to the configuration page to modify your custom configuration, then save it to see the results\n   - The custom configuration is stored in local storage, so you won't lose it unless you uninstall the plugin\n   - You can copy out the configuration and share it with coworkers - best for early prototyping or if you aren't able to add a preset configuration\n1. Create a new preset configuration\n   - To add your configuration to the preset configuration list, you'll need to check in a change to [`Configuration.types.ts`](https://github.com/microsoft/ApplicationInsights-JS/blob/main/tools/chrome-debug-extension/src/configuration/Configuration.types.ts) to add your configuration's URL to the list. \n   - Once your configuration is in the list, you will need to follow your team's process for updating the configuration file, since it is hosted in a team-specific location. It may be in a repo where you have to check in changes to it, or it may be on a OneDrive share that you can update directly.\n\n## Contributing to the tool\n\n1. Please see the general information about contributing to this repository [here](https://github.com/microsoft/ApplicationInsights-JS/tree/main#contributing)\n1. To specifically work on this tool, follow this dev inner loop:\n   1. Startup:\n      1. Go into Chrome or Edge, go to the `Manage Extensions` page (edge://extensions or chrome://extensions/), and `Remove` the tool if you already have it installed from somewhere other than your enlistment\n      1. In the repo root, run `rush install`\n      1. Run `rush build --to @microsoft/applicationinsights-chrome-debug-extension`\n      1. In the `Manage Extensions` page, click `Load unpacked` and browse to your local `tools/chrome-debug-extension/browser` folder and click `Select Folder`\n      1. You can now use your locally built version of the tool in your browser, and use the F12 developer tools to debug the popup\n   1. Making incremental changes:\n      1. Save your change\n      1. Run `rush build --only @microsoft/applicationinsights-chrome-debug-extension`\n      1. If you only modified the popup window, just press F5 in the popup window\n      1. If you modified any of the content/background code, click `Reload` for the plugin in the `Manage Extensions` page\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Data Collection\n\nAs this SDK is designed to enable applications to perform data collection which is sent to the Microsoft collection endpoints the following is required to identify our privacy statement.\n\nThe software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)\n"
  },
  {
    "path": "tools/chrome-debug-extension/manifest.json",
    "content": "{\n    \"name\": \"Telemetry Viewer - M3\",\n    \"short_name\": \"Telemetry Viewer M3\",\n    \"description\": \"A browser extension that provides a real time view of what's happening in Application Insights including what telemetry is being logged by the web application\",\n    \"version\": \"0.9.1\",\n    \"version_name\": \"0.9.1\",\n    \"manifest_version\": 3,\n    \"icons\": {\n        \"16\": \"images/icon-16.png\",\n        \"128\": \"images/icon-128.png\"\n    },\n    \"permissions\": [\n        \"system.display\",\n        \"storage\",\n        \"activeTab\",\n        \"webRequest\",\n        \"scripting\"\n    ],\n    \"background\": {\n        \"service_worker\": \"./scripts/background.js\"\n    },\n    \"action\": {\n        \"default_icon\": {\n            \"19\": \"images/icon-19.png\",\n            \"38\": \"images/icon-38.png\"\n        },\n        \"default_title\": \"Telemetry Viewer\"\n    },\n    \"web_accessible_resources\": [\n        {\n            \"resources\": [\n                \"scripts/pageHelper.js\",\n                \"scripts/pageHelper.min.js\",\n                \"scripts/pageHelper.min.js.map\"\n            ],\n            \"matches\": [\n                \"<all_urls>\"\n            ]\n        }\n    ],\n    \"content_scripts\": [\n        {\n            \"matches\": [\n                \"<all_urls>\"\n            ],\n            \"js\": [\n                \"scripts/contentLoad.min.js\"\n            ]\n        }\n    ],\n    \"host_permissions\": [\n        \"<all_urls>\"\n    ]\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-chrome-debug-extension\",\n    \"version\": \"0.9.1\",\n    \"description\": \"A chrome based browser extension that provides a real time view of what's happening in Application Insights including what telemetry is being logged by the web application\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/chrome-debug-extension#readme\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"script errors\",\n        \"microsoft\",\n        \"application insights\",\n        \"browser performance monitoring\",\n        \"web analytics\",\n        \"chrome\",\n        \"chrome extension\"\n    ],\n    \"main\": \"index.ts\",\n    \"module\": \"index.ts\",\n    \"files\": [\n        \"dist\"\n    ],\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/chrome-debug-extension\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:browser && npm run pack && npm run sri\",\n        \"build:esm\": \"grunt chromedebugextension\",\n        \"build:browser\": \"npm run update_manifest && npx rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"perftest\": \"\",\n        \"publishPackage\": \"npm publish\",\n        \"copy\": \"cp ./images ./dist-es5\",\n        \"update_manifest\": \"node ../../tools/release-tools/updatemanifest.js\",\n        \"pack\": \"node ../../tools/release-tools/zipbrowser.js ai.chrome-ext dist\",\n        \"sri\": \"node ../../tools/subResourceIntegrity/generateIntegrityFile.js\",\n        \"ai-min\": \"grunt chromedebugextension-min\",\n        \"ai-restore\": \"grunt chromedebugextension-restore\"\n    },\n    \"private\": false,\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"dependencies\": {\n        \"@microsoft/applicationinsights-core-js\": \"3.4.1\",\n        \"@microsoft/applicationinsights-shims\": \"3.0.1\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@nevware21/ts-async\": \">= 0.5.5 < 2.x\",\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\",\n        \"file-saver\": \"^2.0.0\",\n        \"react\": \"^17.0.2\",\n        \"react-dom\": \"^17.0.2\",\n        \"react-is\": \"16.13.1\",\n        \"scheduler\": \"~0.11.2\"\n    },\n    \"devDependencies\": {\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"@types/chrome\": \"^0.0.181\",\n        \"@types/file-saver\": \"~2.0.1\",\n        \"@types/node\": \"11.13.2\",\n        \"@types/react\": \"^16.9.11\",\n        \"@types/react-dom\": \"^16.9.4\",\n        \"@types/lodash\": \"^4.14.181\",\n        \"ansi-regex\": \">=5.0.1\",\n        \"autoprefixer\": \"9.4.5\",\n        \"grunt\": \"^1.6.1\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-copy\": \"^3.4.0\",\n        \"rollup-plugin-peer-deps-external\": \"^2.2.4\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"typescript\": \"^4.9.3\",\n        \"archiver\": \"^5.3.0\"\n    }\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/pages/popup.html",
    "content": "<!DOCTYPE html>\n<html lang='en'>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Telemetry Viewer</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../styles/popup.css\" />\n</head>\n\n<body>\n    <div id=\"root\"></div>\n    <script src=\"../scripts/popup.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "tools/chrome-debug-extension/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport commonjs from \"@rollup/plugin-commonjs\";\nimport replace from \"@rollup/plugin-replace\";\nimport { uglify } from \"../../tools/rollup-plugin-uglify3-js/dist/esm/rollup-plugin-uglify3-js\";\nimport { updateDistEsmFiles } from \"../../tools/updateDistEsm/updateDistEsm\";\nimport copy from \"rollup-plugin-copy\";\n\nconst version = require(\"./package.json\").version;\nconst banner = [\n    \"/*!\",\n    ` * Application Insights JavaScript SDK - Chrome Debug Extension, ${version}`,\n    \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n    \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n    \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n    \"// Licensed under the MIT License.\": \"\",\n    \"process.env.NODE_ENV\": \"'production'\"\n};\n\nconst generateBackground = (isProduction) => {\n    const browserRollupConfig = {\n        input: `dist-es5/background.js`,\n        output: {\n            file: `browser/scripts/background.js`,\n            banner: banner,\n            format: \"umd\",\n            name: \"Microsoft.ApplicationInsights\",\n            extend: true,\n            freeze: false,\n            sourcemap: true\n        },\n        plugins: [\n            nodeResolve({\n                browser: true,\n                preferBuiltins: true,\n                dedupe: [\"react\", \"react-dom\"]\n            }),\n            commonjs(),\n            replace({\n                preventAssignment: true,\n                delimiters: [\"\", \"\"],\n                values: replaceValues\n            })\n        ]\n    };\n\n    if (isProduction) {\n        browserRollupConfig.output.file = `browser/scripts/background.min.js`;\n        browserRollupConfig.plugins.push(\n            uglify({\n                ie8: false,\n                ie: true,\n                toplevel: false,\n                compress: {\n                    ie: true,\n                    passes: 3,\n                    unsafe: true\n                },\n                output: {\n                    ie: true,\n                    preamble: banner,\n                    webkit: true\n                }\n            })\n        );\n    }\n\n    return browserRollupConfig;\n};\n\nconst generatePopup = (isProduction) => {\n    const browserRollupConfig = {\n        input: `dist-es5/popup.js`,\n        output: {\n            file: `browser/scripts/popup.js`,\n            banner: banner,\n            format: \"umd\",\n            name: \"Microsoft.ApplicationInsights\",\n            extend: true,\n            freeze: false,\n            sourcemap: true\n        },\n        plugins: [\n            nodeResolve({\n                browser: true,\n                preferBuiltins: true,\n                dedupe: [\"react\", \"react-dom\"]\n            }),\n            copy({\n                targets: [\n                    { src: \"./images/*\", dest: \"browser/images\" },\n                    { src: \"./pages/*\", dest: \"browser/pages\" },\n                    { src: \"./styles/*\", dest: \"browser/styles\" },\n                    { src: \"./manifest.json\", dest: \"browser/\" }\n                ]\n            }),\n            commonjs(),\n            replace({\n                preventAssignment: true,\n                delimiters: [\"\", \"\"],\n                values: replaceValues\n            })\n        ]\n    };\n\n    if (isProduction) {\n        browserRollupConfig.output.file = `browser/scripts/popup.min.js`;\n        browserRollupConfig.plugins.push(\n            uglify({\n                ie8: false,\n                ie: true,\n                toplevel: false,\n                compress: {\n                    ie: true,\n                    passes: 3,\n                    unsafe: true\n                },\n                output: {\n                    ie: true,\n                    preamble: banner,\n                    webkit: true\n                }\n            })\n        );\n    }\n\n    return browserRollupConfig;\n};\n\nconst generateContentLoad = () => {\n    const browserRollupConfig = {\n        input: `dist-es5/contentLoad.js`,\n        output: {\n            file: `browser/scripts/contentLoad.min.js`,\n            banner: banner,\n            format: \"iife\",\n            extend: true,\n            freeze: false,\n            sourcemap: true\n        },\n        plugins: [\n            nodeResolve({\n                browser: true,\n                preferBuiltins: true\n            }),\n            commonjs(),\n            replace({\n                preventAssignment: true,\n                delimiters: [\"\", \"\"],\n                values: replaceValues\n            }),\n            uglify({\n                ie8: false,\n                ie: true,\n                toplevel: false,\n                compress: {\n                    ie: true,\n                    passes: 3,\n                    unsafe: true\n                },\n                output: {\n                    ie: true,\n                    preamble: banner,\n                    webkit: true\n                }\n            })\n        ]\n    }\n\n    return browserRollupConfig;\n};\n\nconst generatePageHelper = () => {\n    const browserRollupConfig = {\n        input: `dist-es5/pageHelper.js`,\n        output: {\n            file: `browser/scripts/pageHelper.min.js`,\n            banner: banner,\n            format: \"iife\",\n            name: \"Microsoft.ApplicationInsights\",\n            extend: true,\n            freeze: false,\n            sourcemap: true\n        },\n        plugins: [\n            nodeResolve({\n                browser: true,\n                preferBuiltins: true,\n                dedupe: [\"react\", \"react-dom\"]\n            }),\n            commonjs(),\n            replace({\n                preventAssignment: true,\n                delimiters: [\"\", \"\"],\n                values: replaceValues\n            }),\n            uglify({\n                ie8: false,\n                ie: true,\n                toplevel: false,\n                compress: {\n                    ie: true,\n                    passes: 3,\n                    unsafe: true\n                },\n                output: {\n                    ie: true,\n                    preamble: banner,\n                    webkit: true\n                }\n            })\n        ]\n    };\n\n    return browserRollupConfig;\n};\n\nupdateDistEsmFiles(replaceValues, banner);\n\nexport default [\n    generateBackground(false),\n    generatePopup(false),\n    generateContentLoad(),\n    generatePageHelper()\n];\n"
  },
  {
    "path": "tools/chrome-debug-extension/scripts/listAzCdnVersions.ps1",
    "content": "param (\n    [string] $container = $null,                        # Identify the container that you want to check blank == all\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $showFiles = $false,                       # Show the individual files with details as well\n    [switch] $activeOnly = $false,                      # Only show the active (deployed) versions\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Container         : $container\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Show Files        : $showFiles\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    # Validate parameters\n    if ([string]::IsNullOrWhiteSpace($container) -ne $true -and \"beta\",\"next\",\"public\", \"dev\", \"nightly\" -NotContains $container) {\n        Write-LogFailure \"[$($container)] is not a valid value, must be beta, next or public\"\n    }\n}\n\nFunction Get-AllVersionFiles(\n    [system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]] $files,\n    [string] $storagePath\n) {\n    Get-VersionFiles $files \"$storagePath/ext\" \"ai.chrome-ext.\" $null\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath, \"listCdnVersionsLog\"\nWrite-LogParams\nValidate-Params\n\n# Don't try and list anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n\n# Get the public files (scripts/b)\nif ([string]::IsNullOrWhiteSpace($container) -eq $true) {\n    Get-AllVersionFiles $files \"release/tools\"\n    Get-AllVersionFiles $files \"beta/tools\"\n    Get-AllVersionFiles $files \"next/tools\"\n    Get-AllVersionFiles $files \"dev/tools\"\n    Get-AllVersionFiles $files \"nightly/tools\"\n}\n\nif ([string]::IsNullOrWhiteSpace($container) -ne $true) {\n    if ($container -eq \"public\") {\n        Get-AllVersionFiles $files \"release/tools\"\n    } elseif ($container -eq \"beta\" -or $container -eq \"next\" -or $container -eq \"dev\" -or $container -eq \"nightly\") {\n        Get-AllVersionFiles $files \"$container/tools\"\n    } else {\n        $global:connectDetails.testOnly = $true\n        $global:connectDetails.storeContainer = \"tst\"\n        Get-AllVersionFiles $files \"$container/tools\"\n    }\n}\n\nListVersions $files $activeOnly $showFiles\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "tools/chrome-debug-extension/scripts/publishAzReleaseToCdn.ps1",
    "content": "param (\n    [string] $releaseFrom = $null,                      # The root path for where to find the files to be released\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $overwrite = $false,                       # Overwrite any existing files   \n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\n$global:cacheValue = $null\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Overwrite         : $overwrite\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"SourcePath        : $jsSdkDir\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction GetReleaseFiles (\n    [hashtable] $verDetails\n)\n{\n    $version = $verDetails.full\n    Write-Log \"Version   : $($verDetails.full)\"\n    Write-Log \"  Number  : $($verDetails.ver)\"\n    Write-Log \"  Type    : $($verDetails.type)\"\n    Write-Log \"  BldNum  : $($verDetails.bldNum)\"\n\n    # check if the minified dir exists\n    $jsSdkSrcDir = Join-Path $jssdkDir -ChildPath \"dist\\\";\n\n    if (-Not (Test-Path $jsSdkSrcDir)) {\n        Write-LogWarning \"'$jsSdkSrcDir' directory doesn't exist. Compile JSSDK first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    Write-Log \"Adding files\";\n    AddReleaseFile $files $jsSdkSrcDir \"ai.chrome-ext.$version.integrity.json\" $true\n    AddReleaseFile $files $jsSdkSrcDir \"ai.chrome-ext.$version.zip\"\n\n    return $files\n}\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"publishReleaseCdnLog\"\n\n$jsSdkDir = $releaseFrom\nif ([string]::IsNullOrWhiteSpace($jsSdkDir) -eq $true) {\n    $jsSdkDir = Split-Path (Split-Path $MyInvocation.MyCommand.Path) -Parent\n}\n\n$cacheControl1Year = \"public, max-age=31536000, immutable, no-transform\";\n$contentType = \"application/zip\";\n\nWrite-LogParams\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n$version = GetPackageVersion $jsSdkDir\n\n$releaseFiles = GetReleaseFiles $version      # Get the versioned files only\nif ($null -eq $releaseFiles -or $releaseFiles.Count -eq 0) {\n    Write-LogFailure \"Unable to find any release files\"\n}\n\nWrite-Log \"Release Files : $($releaseFiles.Count)\"\nWrite-Log \"----------------------------------------------------------------------\"\n\n# Publish the full versioned files to all release folders\nif ($version.type -eq \"release\") {\n    # Normal publishing deployment\n    PublishFiles $releaseFiles \"beta/tools\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/tools\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"release/tools\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"rc\") {\n    PublishFiles $releaseFiles \"beta/tools\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next/tools\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n    # Publish to release type folder folder\n    PublishFiles $releaseFiles \"$($version.type)/tools\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -like \"nightly*\") {\n    # Publish to release nightly folder folder\n    PublishFiles $releaseFiles \"nightly/tools\" $cacheControl1Year $contentType $overwrite\n}\nelse {\n    # Upload to the test container rather than the supplied one\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n    PublishFiles $releaseFiles \"$($version.type)/tools\" $cacheControl1Year $contentType $overwrite\n}\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "tools/chrome-debug-extension/scripts/setAzActiveCdnVersion.ps1",
    "content": "[CmdletBinding()]\nparam (\n    [string] $container = \"\",                           # The container to update\n    [string] $activeVersion = \"\",                       # The version to copy as the active version\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $minorOnly = $false,                       # Only set the active minor version (v2.x) and not the major version (v2)\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    Write-Log \"Container         : $container\"\n    Write-Log \"Version           : $activeVersion\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    if ([string]::IsNullOrWhiteSpace($activeVersion) -eq $true) {\n        Write-LogFailure \"The Active version is not specified\"\n        exit\n    }\n\n    $version = Get-VersionDetails $activeVersion\n\n    if ([string]::IsNullOrWhiteSpace($version.type) -eq $true) {\n        Write-LogFailure \"Unknown release type\"\n    }\n\n    $versionParts = $version.ver.Split(\".\")\n    if ($versionParts.Length -ne 3) {\n        Write-LogFailure \"Active Version [$activeVersion] is not a valid version number\"\n    }\n\n    foreach ($verNum in $versionParts) {\n        [int]$value = 0\n        if ([int32]::TryParse($verNum, [ref]$value) -ne $true) {\n            Write-LogFailure \"[$($verNum)] is not a valid number within the version[$activeVersion]\"\n        }\n    }\n\n    # Publish the full versioned files to all release folders\n    if ($version.type -eq \"release\") {\n        # Normal publishing deployment\n        if (\"beta\",\"next\",\"public\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"rc\") {\n        if (\"beta\",\"next\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -like \"nightly*\") {\n        if (\"nightly\" -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    else {\n        # Upload to the test container rather than the supplied one\n        $global:connectDetails.testOnly = $true\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        } else {\n            Write-LogWarning \"Non-Standard release type using tst/$container as the destination\"\n        }\n    }\n    \n    return $version;\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"setActiveCdnVersionLog\"\n\nWrite-LogParams\n$version = Validate-Params\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n$storePath = \"$container/tools\"\nif ($container -eq \"public\") {\n    $storePath = \"release/tools\"\n} elseif ($container -ne \"beta\" -and $container -ne \"next\" -and $container -ne \"dev\" -and $container -ne \"nightly\") {\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst/tools\"\n}\n\nGet-VersionFiles $files $storePath \"ai.chrome-ext.\" $activeVersion\n\nif ($files.ContainsKey($activeVersion) -ne $true) {\n    Write-LogFailure \"Version [$activeVersion] does not appear to be deployed to [$container]\"\n} elseif ($files[$activeVersion].Count -ne 2) {\n    Write-LogFailure \"Version [$activeVersion] does not fully deployed to [$container] -- only found [$($files[$activeVersion].Count)] file(s)\"\n}\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\nSetActiveVersion $files[$activeVersion] $storePath $minorOnly $true\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/Enums.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n\n/**\n * This enum identifies the internal message type of how the event has been sent and was\n * captured via the extension, these can be background, popup and loaded page (via the pageHelper.ts)\n */\nexport const enum MessageType {\n\n    /**\n     * Cause the content (pageHelper) script to injected and loaded into the open tab\n     */\n    ContentLoad = 0,\n\n    /**\n     * The message was originated from listening to the network requests\n     */\n    Network = 10,\n\n    /**\n     * The message was originated via the SDK notification hooks\n     */\n    Notification = 20,\n\n    /**\n     * The message was originated via the sendEvt hook provided by the pageHelper.\n     */\n    GenericEvent = 30,\n\n    /**\n     * The message was originated via the debugMsg hook provided by the pageHelper.\n     */\n    DebugEvent = 31,\n\n    /**\n     * The message was originated via the SDK diagnostic log hooks\n     */\n    DiagnosticLog = 32\n}\n\n/**\n * Identifies the specific source (originating point) of the message.\n * There is currently a strong relationship between the MessageType (how the event enters the extension)\n * and the source of the event.\n */\nexport const enum MessageSource {\n    /**\n     * The message source is from a web request\n     */\n    WebRequest = 0,\n\n    /**\n     * The message source is from the sdk events sent notification.\n     */\n    EventSentNotification = 1,\n\n    /**\n     * The message source is from the sdk events discarded notification.\n     */\n    EventsDiscardedNotification = 2,\n\n    /**\n     * The message source is from the sdk events send notification\n     */\n    EventsSendNotification = 3,\n\n    /**\n     * The message source is from the sdk internal perf event notification.\n     */\n    PerfEvent = 4,\n\n    /**\n     * The message source is a generic event.\n     */\n    GenericEvent = 5,\n\n    /**\n     * The message source is a debug event (ApplicationInsights Debug Extension)\n     */\n    DebugEvent = 6,\n\n    /**\n     * The message source is from the sdk diagnostic logger\n     */\n    DiagnosticLog = 7\n}"
  },
  {
    "path": "tools/chrome-debug-extension/src/LogEntry.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { isArray, isBoolean, isError, isNumber, isObject, isString, objToString } from \"@microsoft/applicationinsights-core-js\";\nimport { MAX_DEPTH, formatLogElements, getTargetKeys, getTargetName, makeRegex, toggleClassName, traverseAndReplace } from \"./helpers\";\n\nexport class LogEntry {\n    isKeep: () => boolean;\n    isMatch: (textFilter: string, excludedKeys: string[], includeFunctions: boolean) => boolean;\n    render: (searchText: string, excludeKeys: string[], includeFunctions: boolean) => HTMLElement;\n    getEl: () => HTMLElement;\n    getKind: () => string;\n\n    constructor(target: Object, tm: number, key?: string, level?: number, kind?: string, keep?: boolean) {\n        let _self = this;\n        let searchContent: any = null;\n        let lastTextFilter: string;\n        let theEl: HTMLElement;\n\n        _self.isKeep = () => {\n            return !!keep;\n        }\n\n        function _testValue(rg: RegExp, value: string | undefined) {\n            if (rg && value) {\n                return rg.exec(value) !== null;\n            }\n\n            return false;\n        }\n\n        function _testObj(rg: RegExp, value: any, excludedKeys: string[], includeFunctions: boolean): boolean {\n            if (value !== null && value !== undefined && value !== \"\") {\n                if (isArray(value)) {\n                    for (let lp = 0; lp < value.length; lp++) {\n                        if (_testObj(rg, value[lp], excludedKeys, includeFunctions)) {\n                            return true;\n                        }\n                    }\n                } else if (isObject(value) || isError(value)) {\n                    let keys = getTargetKeys(value, excludedKeys, includeFunctions);\n                    for (let lp = 0; lp < keys.length; lp++) {\n                        let key = keys[lp];\n                        if (_testValue(rg, key) || _testObj(rg, value[key], excludedKeys, includeFunctions)) {\n                            return true;\n                        }\n                    }\n                } else if (isString(value) || isNumber(value) || isBoolean(value)) {\n                    return _testValue(rg, objToString(value));\n                }\n            }\n\n            return false;\n        }\n\n        _self.isMatch = (textFilter: string, excludedKeys: string[], includeFunctions: boolean) => {\n            let rg = makeRegex(textFilter, false);\n            if (rg) {\n                if (key && _testValue(rg, key)) {\n                    return true;\n                }\n\n                if (_testValue(rg, getTargetName(_self))) {\n                    return true;\n                }\n\n                if (!searchContent) {\n                    // Delaying creating the search optimization until needed -- for performance\n                    searchContent = traverseAndReplace(target, MAX_DEPTH, level as number, [], excludedKeys, includeFunctions);\n                }\n                \n                return _testObj(rg, searchContent, excludedKeys, includeFunctions);\n            }\n\n            return true;\n        }\n\n        _self.render = (textFilter: string, excludeKeys: string[], includeFunctions: boolean): HTMLElement => {\n            if (!theEl || lastTextFilter !== textFilter) {\n                lastTextFilter = textFilter;\n                theEl = formatLogElements(target, \"\", key || \"\", level || 0, textFilter, excludeKeys, [], includeFunctions).root;\n                toggleClassName(theEl, \" tree-root\");\n            }\n\n            return theEl;\n        }\n\n        _self.getEl = () => {\n            return theEl;\n        }\n\n        _self.getKind = () => {\n            return kind as string;\n        }\n    }\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/UpdateCheck.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { dumpObj } from \"@microsoft/applicationinsights-core-js\";\n\nexport declare type VersionCheckCallback = (newVersion: string, details: string) => void;\n\nexport function checkForUpdate(callback: VersionCheckCallback, currentVer?: string) {\n    if (!currentVer && chrome && chrome.runtime) {\n        let manifest = chrome.runtime.getManifest();\n        currentVer = manifest.version_name || manifest.version || \"\";\n    }\n\n    let newVersionLink = \"https://js.monitor.azure.com/\";\n    let versionCheck = newVersionLink;\n\n    if (currentVer && currentVer.indexOf(\"-nightly\") !== -1) {\n        newVersionLink += \"nightly/tools/ai.chrome-ext.nightly.zip\";\n        versionCheck += \"nightly/tools/ai.chrome-ext.nightly.integrity.json\";\n    } else {\n        newVersionLink += \"release/tools/ai.chrome-ext.zip\";\n        versionCheck += \"release/tools/ai.chrome-ext.integrity.json\";\n    }\n\n    function _updateCheckFailed(reason: any) {\n        console && console.log(\"Version check failed -- \" + reason);\n    }\n    \n    function _checkVersion(value: string) {\n        if (value) {\n            try {\n                let integrity = JSON.parse(value);\n                if (currentVer !== integrity.version) {\n                    callback && callback(integrity.version, newVersionLink)\n                }\n            } catch (e) {\n                // CDN can return an error which will be HTML\n                _updateCheckFailed(dumpObj(e));\n            }\n        }\n    }\n\n    fetch(versionCheck).then((resp) => {\n        resp.text().then(_checkVersion, _updateCheckFailed);\n    }, _updateCheckFailed);\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/background.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { objKeys } from \"@microsoft/applicationinsights-core-js\";\nimport { MessageType } from \"./Enums\";\nimport { getPopupSettings, setPopupSize } from \"./configuration/PopupConfigCache\";\nimport { IMessage } from \"./interfaces/IMessage\";\nimport { mathMax, mathMin } from \"@nevware21/ts-utils\";\n\nconst openTabs: {[key: string]: chrome.windows.Window} = { };\n\nfunction setTabWindow(tabId?: number, w?: chrome.windows.Window) {\n    if (tabId) {\n        if (w) {\n            openTabs[\"tab-\" + tabId] = w;\n        } else {\n            delete openTabs[\"tab-\" + tabId];\n        }\n    }\n}\n\nfunction getTabWindow(tabId?: number): chrome.windows.Window {\n    if (tabId) {\n        return openTabs[\"tab-\" + tabId] || null;\n    }\n\n    return null as any;\n}\n\nfunction injectScript(url: string) {\n    const d = document;\n    const s = d.createElement(\"script\");\n    s.src = encodeURI(url);\n    const el = d.head || d.documentElement;\n    el.appendChild(s);\n}\n\nfunction injectPageHelper(tabId?: number) {\n    if (tabId) {\n        let url = chrome.runtime.getURL(\"scripts/pageHelper.min.js\");\n        chrome.scripting.executeScript({\n            target: { tabId },\n            func: injectScript,\n            args: [url]\n        }, (result) => {\n            if (chrome.runtime.lastError) {\n                console.log(`Error injecting script into tab ${tabId}:`, chrome.runtime.lastError);\n            }\n        });\n    }\n}\n\nfunction openPopup(tab: chrome.tabs.Tab) {\n    let settings = getPopupSettings();\n\n    chrome.system.display.getInfo((displays) => {\n        const primaryDisplay = displays[0]; // Typically, the primary display is the first in the list\n        const screenWidth = primaryDisplay.workArea.width;\n        const screenHeight = primaryDisplay.workArea.height;\n        chrome.windows.create({\n            url: \"pages/popup.html?tabId=\" + tab.id,\n            type: \"popup\",\n            focused: true,\n            width: mathMin(mathMax(settings.width || 0, 200), screenWidth),\n            height: mathMin(mathMax(settings.height || 0, 320), screenHeight)\n        }, (value) => {\n            setTabWindow(tab.id, value);\n            if (value) {\n                let popupId = value.id;\n    \n                let _onResize = (win: chrome.windows.Window) => {\n                    if (win.id === popupId) {\n                        setPopupSize(win.width, win.height);\n                    }\n                }\n    \n                let _onRemove = (windowId: number) => {\n                    if (popupId === windowId) {\n                        setTabWindow(tab.id);\n                        chrome.windows.onRemoved.removeListener(_onRemove);\n                        chrome.windows.onBoundsChanged.removeListener(_onResize);\n                    }\n                }\n            \n                // Track popup window size\n                chrome.windows.onBoundsChanged.addListener(_onResize);\n    \n                // track popup window\n                chrome.windows.onRemoved.addListener(_onRemove);\n            }\n        });\n    });\n\n    \n}\n\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n    let msg = message as IMessage;\n    if (msg.id === MessageType.ContentLoad && sender && sender.tab) {\n        if (objKeys(openTabs).length > 0) {\n            injectPageHelper(sender.tab.id);\n        }\n        sendResponse();\n    }\n});\n\n// Configure the browser action (the button next to the address bar registered in manifest.json) to\n// open the popup when clicked.\nchrome.action.onClicked.addListener((tab) => {\n    if (tab && tab.id) {\n        // Inject the helper hook function\n        injectPageHelper(tab.id);\n\n        // Launch the popup\n        let w = getTabWindow(tab.id);\n        if (!w || !w.id) {\n            openPopup(tab);\n        } else {\n            chrome.windows.get(w.id, () => {\n                if (chrome.runtime.lastError) {\n                    setTabWindow(tab.id);\n                    openPopup(tab);\n                } else {\n                    chrome.windows.update(w.id as number, { focused: true }, () => {\n                        if (chrome.runtime.lastError) {\n                            openPopup(tab);\n                        }\n                    });\n                }\n            });\n        }\n    }\n});\n\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/IFilterSettings.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { DataEventType } from \"../dataSources/IDataEvent\";\n\n/**\n * This identifies the filter settings that the user can apply (via the optionsbar), these values\n * are persisted to local storage.\n */\nexport interface IFilterSettings {\n    /**\n     * A flag indicating whether the filter should also search the event/message, when searching the message/event\n     * the value is case-sensitive.\n     */\n    filterContent: boolean;\n\n    /**\n     * The text entered by the user to search to table details and optionally the content.\n     * When searching the table details the value is case-insensitive, but the event/message search is exact\n     * case-sensitive match.\n     */\n    filterText: string;\n\n    /**\n     * Identifies whether to filter based on a specific type (DataEventType) of message (warning, error, perf, etc.)\n     */\n    filterByType: DataEventType | undefined;\n\n    /**\n     * Should the details panel so the full raw event/message or the \"condensed\" version (some specific fields removed.)\n     */\n    showCondensedDetails: boolean;\n\n    /**\n     * Should the extension capture and add events originating from a web request\n     */\n    listenNetwork: boolean;\n\n    /**\n     * Should the extension capture and add events originating via the pageHelper SDK hooks.\n     */\n    listenSdk: boolean;\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/configurationSelection.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React from \"react\";\nimport { getConfiguration } from \"../configuration/configuration\";\nimport { ConfigurationType, ConfigurationURLs } from \"../configuration/Configuration.types\";\nimport { IConfiguration } from \"../configuration/IConfiguration\";\nimport { doAwait } from \"@nevware21/ts-async\";\n\nexport const customConfigurationStorageKey = \"customConfiguration\";\nexport interface IConfigurationSelectionProps {\n    configurationType: ConfigurationType;\n    onConfigurationSaved: (newConfigurationType: ConfigurationType) => void;\n    onCancel: () => void;\n}\n\nconst optionValues: Array<string | undefined> = Object.keys(ConfigurationURLs);\noptionValues.unshift(undefined);\n\nexport const ConfigurationSelection = (\n    props: IConfigurationSelectionProps\n): React.ReactElement<IConfigurationSelectionProps> => {\n    const [unsavedConfigurationType, setUnsavedConfigurationType] = React.useState<ConfigurationType>(\n        props.configurationType || \"Default\"\n    );\n    const [customConfiguration, setCustomConfiguration] = React.useState<string>(\"\");\n    const [customConfigurationDirty, setCustomConfigurationDirty] = React.useState<boolean>(false);\n    const textAreaRef = React.useRef<HTMLTextAreaElement>(null);\n\n    function onConfigurationTypeSelectionChanged(event: React.FormEvent<HTMLSelectElement>): void {\n        if (Object.keys(ConfigurationURLs).includes(event.currentTarget.value)) {\n            setUnsavedConfigurationType(event.currentTarget.value as ConfigurationType);\n        } else {\n            setUnsavedConfigurationType(undefined);\n        }\n    }\n\n    function save(): void {\n        props.onConfigurationSaved(unsavedConfigurationType);\n    }\n\n    function cancel(): void {\n        props.onCancel();\n    }\n\n    function updateCustomConfiguration(newCustomConfiguration: string): void {\n        setCustomConfigurationDirty(true);\n        setCustomConfiguration(newCustomConfiguration);\n        chrome.storage.local.set({ [customConfigurationStorageKey]: newCustomConfiguration });\n\n    }\n\n    function onCopyToCustomConfiguration(): void {\n        getConfiguration(unsavedConfigurationType).then((configuration: IConfiguration | undefined) => {\n            if (configuration) {\n                updateCustomConfiguration(JSON.stringify(configuration, undefined, 2));\n                setUnsavedConfigurationType(\"Custom\");\n            }\n        });\n    }\n\n    function onCustomConfigurationChanged(event: React.FormEvent<HTMLTextAreaElement>): void {\n        const newCustomConfiguration = event.currentTarget.value;\n        updateCustomConfiguration(newCustomConfiguration);\n    }\n\n    React.useEffect(() => {\n        try {\n            doAwait(chrome.storage.local.get([customConfigurationStorageKey]), (savedValue: any) => {\n                if (savedValue) {\n                    setCustomConfiguration(savedValue[customConfigurationStorageKey]);\n                }\n                if (textAreaRef.current) {\n                    textAreaRef.current.setAttribute(\"aria-labelledby\", \"customConfigurationLabel\");\n                }\n            });\n           \n        } catch {\n            // That's OK\n        }\n        \n    }, []);\n\n    const isCustomConfigurationTextareaReadonly = unsavedConfigurationType !== \"Custom\";\n    const customConfigurationTextareaClassname = isCustomConfigurationTextareaReadonly\n        ? \"customConfigurationTextarea disabled\"\n        : \"customConfigurationTextarea\";\n\n    const configTypeChanged = unsavedConfigurationType && unsavedConfigurationType !== props.configurationType;\n    const isSaveEnabled =\n        configTypeChanged || (unsavedConfigurationType === \"Custom\" && customConfigurationDirty);\n\n    return (\n        <div className='configurationContainer'>\n            <div className='configurationSelectionSection'>\n                <div className='configurationHeader'>Configuration Selection</div>\n                <div className='configurationDescription'>\n                    <p>The configuration of this tool defines how the captured data is displayed and filtered.</p>\n                    <p>\n                        If your team has a preset already build, select it from configuration list below and you're ready to\n                        go!\n                    </p>\n                    <p>\n                        If your team doesn't have a preset yet, you can use the Default configuration as a starting point.\n                    </p>\n                    <p>\n                        To customize a configuration, you can copy it into the Custom Configuration box below then modify\n                        and save it directly in this tool and it will immediately take effect. Your custom configuraiton is\n                        saved in local storage in this web browser instance.\n                    </p>\n                    <p>To create a preset configuration for your project, see the instructions <a href=\"https://github.com/microsoft/ApplicationInsights-JS/blob/master/tools/chrome-debug-extension/README.md#creating-a-new-configuration\" target=\"_blank\">here</a></p>\n                </div>\n\n                <div className='configurationSelectionDropdownDiv'>\n                    <div className='configurationSelectionDropdownLabel' id='configurationToUseLabel'>Configuration To Use:</div>\n                    <select\n                        aria-labelledby='configurationToUseLabel'\n                        onChange={onConfigurationTypeSelectionChanged}\n                        className='configurationSelectionDropdown'\n                        value={unsavedConfigurationType}\n                    >\n                        {optionValues.map((value: string | undefined, index: number) => {\n                            return <option key={value || \"\"}>{value}</option>;\n                        })}\n                    </select>\n                    <button\n                        disabled={unsavedConfigurationType === undefined || unsavedConfigurationType === \"Custom\"}\n                        className='configurationSelectionCopyToCustom'\n                        onClick={onCopyToCustomConfiguration}\n                    >\n                        Copy To Custom Configuration\n                    </button>\n                </div>\n\n                <div className='configurationSelectionButtonsDiv'>\n                    <button disabled={!isSaveEnabled} onClick={save} className='configurationSelectionButton'>\n                        OK\n                    </button>\n                    {props.configurationType !== undefined ? (\n                        <button className='configurationSelectionButton' onClick={cancel}>\n                            Cancel\n                        </button>\n                    ) : undefined}\n                </div>\n\n                <div className='customConfigurationDiv' >\n                    <div className='customConfigurationLabel' id='customConfigurationLabel'>Custom configuration:</div>\n                    <textarea\n                        className={customConfigurationTextareaClassname}\n                        value={customConfiguration}\n                        readOnly={isCustomConfigurationTextareaReadonly}\n                        onChange={onCustomConfigurationChanged}\n                        ref={textAreaRef}\n                    ></textarea>\n                </div>\n            </div>\n            <div className='updatesSection'>\n                <div className='configurationHeader'>Updating this tool</div>\n                <div className='configurationDescription'>\n                    <p>Currently updates must be done manually.</p>\n                    <p>\n                        To update the tool, download either the <a href=\"https://js.monitor.azure.com/release/tools/ai.chrome-ext.zip\" target=\"_blank\">official</a> or <a href=\"https://js.monitor.azure.com/nightly/tools/ai.chrome-ext.nightly.zip\" target=\"_blank\">nightly</a> build and unzip it into the folder where you originally installed the tool.\n                    </p>\n                    <p>\n                        For more information, see the instructions <a href=\"https://github.com/microsoft/ApplicationInsights-JS/blob/master/tools/chrome-debug-extension/README.md\" target=\"_blank\">here</a>.\n                    </p>\n                </div>\n            </div>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/eventDetails.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React, { useEffect, useRef } from \"react\";\nimport { LogEntry } from \"../LogEntry\";\nimport { IFilterSettings } from \"./IFilterSettings\";\n\ninterface IEventDetailsProps {\n    // tslint:disable-next-line:no-any\n    data: any;\n    filterSettings: IFilterSettings\n}\n\nexport const EventDetails = (props: IEventDetailsProps): React.ReactElement<IEventDetailsProps> => {\n    const targetRef = useRef<any>();\n\n    useEffect(() => {\n        let logEntry = new LogEntry(props.data || {}, 0, \"\", 0);\n        let element = logEntry.render(props.filterSettings.filterText, [], true);\n\n        // Remove any children\n        if (targetRef.current) {\n            while (targetRef.current.firstChild) {\n                targetRef.current.removeChild(targetRef.current.firstChild);\n            }\n    \n            targetRef.current.appendChild(element);\n        }\n    }, [props]);\n\n    return (\n        <div className='eventDetailsDiv dbg-lgr' ref={targetRef}>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/eventTable.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React from \"react\";\nimport { DynamicValueConverter, IColumn, IConfiguration } from \"../configuration/IConfiguration\";\nimport { applyConverter, getDynamicFieldValue } from \"../dataSources/dataHelpers\";\nimport { IDataEvent } from \"../dataSources/IDataEvent\";\nimport { makeRegex } from \"../helpers\";\nimport { EventTypeIcon } from \"./eventTypeIcon\";\nimport { IFilterSettings } from \"./IFilterSettings\";\n\ninterface IEventTableProps {\n    dataEvents: IDataEvent[];\n    configuration: IConfiguration;\n    filterSettings: IFilterSettings;\n    selectedIndex: number | undefined;\n    onRowClickHandler: (target: EventTarget & HTMLTableRowElement) => void;\n}\n\nfunction _getFilteredText(theText: string, textFilter: string): JSX.Element {\n    let innerText = theText;\n    let matchPos = -1;\n    let matchLen = 0;\n    let rg = makeRegex(textFilter, false);\n    if (rg) {\n        let matchTxt = rg.exec(innerText);\n        if (matchTxt && matchTxt[1]) {\n            matchPos = theText.indexOf(matchTxt[1]);\n            matchLen = matchTxt[1].length;\n        }\n    }\n\n    if (matchPos !== -1) {\n        if (matchPos === 0 && matchLen === theText.length) {\n            return <span className=\"matched-text-filter\">{theText}</span>;\n        } else {\n            return <span>{theText.substring(0, matchPos)}\n                <span className=\"matched-text-filter\">{theText.substring(matchPos, matchPos + matchLen)}</span>\n                {theText.substring(matchPos + matchLen)}\n            </span>;\n        }\n    }\n\n    return <span>{theText}</span>;\n}\n\nexport const EventTable = (props: IEventTableProps): React.ReactElement<IEventTableProps> => {\n    // Not state because we want these to be per-render\n    const deltaColumnsPreviousValues = new Map<number, number | undefined>();\n    let lastSessionNumber: string | undefined = undefined;\n\n    const onKeyPress = (event: React.KeyboardEvent<HTMLTableRowElement>): void => {\n        if (event.key === \"Enter\") {\n            props.onRowClickHandler(event.currentTarget);\n        }\n    }\n\n    const getCellForDeltaColumn = (\n        rowIndex: number,\n        columnIndex: number,\n        currentValue: number | undefined,\n        converter: DynamicValueConverter,\n        className: string\n    ): JSX.Element => {\n        const previousValue = deltaColumnsPreviousValues.get(columnIndex);\n        let numberToDisplay: number | undefined = undefined;\n\n        if (previousValue && currentValue) {\n            numberToDisplay = currentValue - previousValue;\n        }\n        deltaColumnsPreviousValues.set(columnIndex, currentValue);\n\n        return (\n            <td key={`Row_${rowIndex}_Td_${columnIndex}`} className={className}>\n                {applyConverter(numberToDisplay ? numberToDisplay.toString() : undefined, converter)}\n            </td>\n        );\n    };\n\n    return (\n        <div className='eventTableDiv'>\n            <table className='eventTable'>\n                <thead>\n                    <tr key='Header_Row'>\n                        <th key='Header_-1'>&nbsp;</th>\n                        {\n                            // Render the column headers based on the configuration\n                            props.configuration.columnsToDisplay.map((columnToDisplay: IColumn, index: number) => {\n                                return <th key={`Header_${index}`}>{columnToDisplay.header}</th>;\n                            })\n                        }\n                    </tr>\n                </thead>\n                <tbody>\n                    {props.dataEvents.map((dataEvent: IDataEvent, rowIndex: number) => {\n                        const isNewSession =\n                            lastSessionNumber !== undefined && dataEvent.sessionNumber !== \"?\" && dataEvent.sessionNumber !== lastSessionNumber;\n                        const tdClassName = isNewSession ? \"newSessionRow\" : \"\";\n\n                        // Don't remember any column previous values between sessions\n                        if (isNewSession) {\n                            deltaColumnsPreviousValues.clear();\n                        }\n\n                        // Build up the row's cells based on the configuration\n                        const cells = new Array<JSX.Element>();\n                        props.configuration.columnsToDisplay.map((columnToDisplay: IColumn, columnIndex: number) => {\n                            switch (columnToDisplay.type) {\n                            case \"SessionNumber\":\n                                {\n                                    cells.push(<td key={`Row_${rowIndex}_Td_${columnIndex}`} className={tdClassName}>{dataEvent.sessionNumber}</td>);\n                                }\n                                break;\n                            case \"NumberDelta\":\n                                {\n                                    const currentStringValue = getDynamicFieldValue(\n                                        dataEvent,\n                                        columnToDisplay.prioritizedFieldNames\n                                    );\n                                    const currentValue = currentStringValue\n                                        ? Number.parseInt(currentStringValue, 10)\n                                        : undefined;\n\n                                    cells.push(getCellForDeltaColumn(rowIndex, columnIndex, currentValue, \"TruncateWithDigitGrouping\", tdClassName));\n                                }\n                                break;\n                            case \"TimeDelta\":\n                                {\n                                    const currentStringValue = getDynamicFieldValue(\n                                        dataEvent,\n                                        columnToDisplay.prioritizedFieldNames);\n                                    const currentValue = currentStringValue ? Date.parse(currentStringValue) : undefined;\n\n                                    cells.push(getCellForDeltaColumn(rowIndex, columnIndex, currentValue, \"NumberToWholeMilliseconds\", tdClassName));\n                                }\n                                break;\n                            case \"NormalData\":\n                            default: {\n                                let value = getDynamicFieldValue(dataEvent, columnToDisplay.prioritizedFieldNames);\n                                cells.push(\n                                    <td key={`Row_${rowIndex}_Td_${columnIndex}`} className={tdClassName}>\n                                        {_getFilteredText(value, props.filterSettings.filterText)}\n                                    </td>\n                                );\n                            }\n                            }\n                        });\n\n                        // Determine the CSS classname to use for the row\n                        const rowClassName = rowIndex === props.selectedIndex ? \"selected\" : \"\";\n                        lastSessionNumber = dataEvent.sessionNumber;\n\n                        // Render the row\n                        return (\n                            <tr\n                                key={`Row_${rowIndex}`}\n                                item-data={rowIndex}\n                                className={rowClassName}\n                                onClick={(event: React.MouseEvent<HTMLTableRowElement, MouseEvent>) => props.onRowClickHandler(event.currentTarget)}\n                                onKeyPress={onKeyPress}\n                                tabIndex={0}\n                            >\n                                <td key={`Row_${rowIndex}_Td_-1`} className={tdClassName}>\n                                    <EventTypeIcon eventType={dataEvent.type} suppress={[\"appLogic\"]} />\n                                </td>\n                                {cells}\n                            </tr>\n                        );\n                    })}\n                </tbody>\n            </table>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/eventTypeCounter.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React from \"react\";\nimport { DataEventType } from \"../dataSources/IDataEvent\";\nimport { EventTypeIcon } from \"./eventTypeIcon\";\n\ninterface IEventTypeCounterProps {\n    eventType: DataEventType | undefined;\n    count: number;\n}\n\nexport const EventTypeCounter = (\n    props: IEventTypeCounterProps\n): React.ReactElement<IEventTypeCounterProps> => {\n    return (\n        <div className='eventTypeCounterDiv verticallyCenteredFlexItem'>\n            <div>\n                <EventTypeIcon eventType={props.eventType} />\n            </div>\n            <div className='eventTypeCounterCountDiv'>{props.count}</div>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/eventTypeFilter.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React from \"react\";\nimport { ICounts } from \"../dataSources/dataHelpers\";\nimport { DataEventType } from \"../dataSources/IDataEvent\";\nimport { EventTypeCounter } from \"./eventTypeCounter\";\n\ninterface IEventTypeFilterProps {\n    currentEventTypeFilter: DataEventType | undefined;\n    onEventTypeFilterChanged: (newEventTypeFilter: DataEventType | undefined) => void;\n    counts: ICounts;\n}\n\nexport const EventTypeFilter = (props: IEventTypeFilterProps): React.ReactElement<IEventTypeFilterProps> => {\n    const appLogic: DataEventType = \"appLogic\";\n    const performance: DataEventType = \"performance\";\n    const warning: DataEventType = \"warning\";\n    const fatalError: DataEventType = \"fatalError\";\n\n    function selectionChanged(event: React.ChangeEvent<HTMLInputElement>): void {\n        // We know it's a valid value, so we can use 'as'\n        const dataEventType = event.target.value ? (event.target.value as DataEventType) : undefined;\n        props.onEventTypeFilterChanged(dataEventType);\n    }\n\n    return (\n        <div className='eventTypeFilterContainer'>\n            <div className='eventTypeFilterInputContainer'>\n                <input\n                    type='radio'\n                    name='eventTypeFilter'\n                    className='eventTypeFilterInput'\n                    title='Show all'\n                    value={undefined}\n                    checked={props.currentEventTypeFilter === undefined}\n                    onChange={selectionChanged}\n                />\n                <EventTypeCounter eventType={undefined} count={props.counts.all} />\n            </div>\n            <div className='eventTypeFilterInputContainer'>\n                <input\n                    name='eventTypeFilter'\n                    type='radio'\n                    className='eventTypeFilterInput'\n                    title='Show just app logic'\n                    value={appLogic}\n                    checked={props.currentEventTypeFilter === appLogic}\n                    onChange={selectionChanged}\n                />\n                <EventTypeCounter eventType={appLogic} count={props.counts.appLogic} />\n            </div>\n            <div className='eventTypeFilterInputContainer'>\n                <input\n                    name='eventTypeFilter'\n                    type='radio'\n                    className='eventTypeFilterInput'\n                    title='Show just performance'\n                    value={performance}\n                    checked={props.currentEventTypeFilter === performance}\n                    onChange={selectionChanged}\n                />\n                <EventTypeCounter eventType={performance} count={props.counts.performance} />\n            </div>\n            <div className='eventTypeFilterInputContainer'>\n                <input\n                    name='eventTypeFilter'\n                    type='radio'\n                    className='eventTypeFilterInput'\n                    title='Show just warnings'\n                    checked={props.currentEventTypeFilter === warning}\n                    value={warning}\n                    onChange={selectionChanged}\n                />\n                <EventTypeCounter eventType={warning} count={props.counts.warning} />\n            </div>\n            <div className='eventTypeFilterInputContainer'>\n                <input\n                    name='eventTypeFilter'\n                    type='radio'\n                    className='eventTypeFilterInput'\n                    title='Show just fatal errors'\n                    checked={props.currentEventTypeFilter === fatalError}\n                    value={fatalError}\n                    onChange={selectionChanged}\n                />\n                <EventTypeCounter eventType={fatalError} count={props.counts.fatalError} />\n            </div>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/eventTypeIcon.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React from \"react\";\nimport { DataEventType } from \"../dataSources/IDataEvent\";\n\ninterface IEventTypeIconProps {\n    eventType: DataEventType | undefined;\n    suppress?: DataEventType[];\n}\n\nexport const EventTypeIcon = (props: IEventTypeIconProps): React.ReactElement<IEventTypeIconProps> => {\n    if (props.eventType && props.suppress && props.suppress.indexOf(props.eventType) > -1) {\n        return <div />;\n    }\n    switch (props.eventType) {\n    case undefined:\n        return <img src='../images/all.png' alt='All events' className='typeIcon' />;\n    case \"appLogic\":\n        return <img src='../images/appLogic.png' alt='App logic events' className='typeIcon' />;\n    case \"warning\":\n        return <img src='../images/warning.png' alt='Warning events' className='typeIcon' />;\n    case \"fatalError\":\n        return <img src='../images/error.png' alt='Error events' className='typeIcon' />;\n    case \"performance\":\n        return <img src='../images/performance.png' alt='Performance events' className='typeIcon' />;\n    default:\n        return <div />;\n    }\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/optionsBar.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React from \"react\";\nimport { ICounts } from \"../dataSources/dataHelpers\";\nimport { DataEventType } from \"../dataSources/IDataEvent\";\nimport { EventTypeFilter } from \"./eventTypeFilter\";\nimport { IFilterSettings } from \"./IFilterSettings\";\n\ninterface IOptionsBarProps {\n    filterSettings: IFilterSettings;\n    onFilterSettingsChanged: (newFilterSettings: IFilterSettings) => void;\n    counts: ICounts;\n    onClear: () => void;\n    onSave: () => void;\n    onShowConfigurationSelection: () => void;\n}\n\nexport const OptionsBar = (props: IOptionsBarProps): React.ReactElement<IOptionsBarProps> => {\n    function handleFilterTextOnChange(e: React.ChangeEvent<HTMLInputElement>): void {\n        const newConfiguration = {\n            ...props.filterSettings,\n            filterText: e.currentTarget.value\n        };\n        props.onFilterSettingsChanged(newConfiguration);\n    }\n\n    function onFilterChanged(newEventTypeFilter: DataEventType | undefined): void {\n        const newConfiguration = {\n            ...props.filterSettings,\n            filterByType: newEventTypeFilter\n        };\n        props.onFilterSettingsChanged(newConfiguration);\n    }\n\n    function onShowCondensedDetailsChanged(): void {\n        const newFilterSettings: IFilterSettings = {\n            ...props.filterSettings,\n            showCondensedDetails: !props.filterSettings.showCondensedDetails\n        };\n        props.onFilterSettingsChanged(newFilterSettings);\n    }\n\n    function onListenNetworkChanged(): void {\n        const newFilterSettings: IFilterSettings = {\n            ...props.filterSettings,\n            listenNetwork: !props.filterSettings.listenNetwork\n        };\n        props.onFilterSettingsChanged(newFilterSettings);\n    }\n\n    function onListenSdkChanged(): void {\n        const newFilterSettings: IFilterSettings = {\n            ...props.filterSettings,\n            listenSdk: !props.filterSettings.listenSdk\n        };\n        props.onFilterSettingsChanged(newFilterSettings);\n    }\n\n    function onFilterContentChanged(): void {\n        const newFilterSettings: IFilterSettings = {\n            ...props.filterSettings,\n            filterContent: !props.filterSettings.filterContent\n        };\n        props.onFilterSettingsChanged(newFilterSettings);\n    }\n\n    return (\n        <div className='optionsBarDiv'>\n            <span className='verticallyCenteredFlexItem'>\n                <input\n                    type='search'\n                    className='inputBox'\n                    placeholder='Filter...'\n                    value={props.filterSettings.filterText}\n                    onChange={handleFilterTextOnChange}\n                />\n            </span>\n            <span className='verticallyCenteredFlexItem' title=\"Include Content when filtering\">\n                <input\n                    type='checkbox'\n                    id='filterContentButton'\n                    checked={props.filterSettings.filterContent}\n                    className='filterContentButton'\n                    onChange={onFilterContentChanged}\n                    aria-label=\"Include Content when filtering\"\n                />\n                <label htmlFor='filterContentButton' className='checkBoxLabel'>\n                    Content\n                </label>\n            </span>\n            <span>\n                <EventTypeFilter\n                    currentEventTypeFilter={props.filterSettings.filterByType}\n                    onEventTypeFilterChanged={onFilterChanged}\n                    counts={props.counts}\n                />\n            </span>\n            <span className='verticallyCenteredFlexItem' title=\"Exclude common fields in the details pane\">\n                <input\n                    type='checkbox'\n                    id='condenseDetailsButton'\n                    checked={props.filterSettings.showCondensedDetails}\n                    className='condenseDetailsButton'\n                    onChange={onShowCondensedDetailsChanged}\n                />\n                <label htmlFor='condenseDetailsButton' className='checkBoxLabel'>\n                    Condense details\n                </label>\n            </span>\n            <span className='verticallyCenteredFlexItem captureTypes'>\n                <span className='verticallyCenteredFlexItem' aria-label=\"Capture network requests\" title=\"Capture network requests\">\n                    <input\n                        type='checkbox'\n                        id='listenNetworkButton'\n                        checked={props.filterSettings.listenNetwork}\n                        className='listenNetworkButton'\n                        onChange={onListenNetworkChanged}\n                    />\n                    <label htmlFor='listenNetworkButton' className='checkBoxLabel' aria-hidden=\"true\">\n                        Network\n                    </label>\n                </span>\n                <span className='verticallyCenteredFlexItem' aria-label=\"Capture SDK events\" title=\"Capture SDK events\">\n                    <input\n                        type='checkbox'\n                        id='listenSdkButton'\n                        checked={props.filterSettings.listenSdk}\n                        className='listenSdkButton'\n                        onChange={onListenSdkChanged}\n                    />\n                    <label htmlFor='listenSdkButton' className='checkBoxLabel' aria-hidden=\"true\">\n                        SDK\n                    </label>\n                </span>\n            </span>\n            <button onClick={props.onSave} title='Save' className='saveButton'>\n                <img src='../images/save.png' alt='Save' className='verticallyCenteredFlexItem' />\n            </button>\n            <button onClick={props.onClear} title='Clear all' className='clearButton'>\n                <img src='../images/clear.png' alt='Clear all' className='verticallyCenteredFlexItem' />\n            </button>\n            <button\n                onClick={props.onShowConfigurationSelection}\n                title='Configuration'\n                className='showConfigurationSelectionButton'\n            >\n                <img src='../images/settings.png' alt='Settings' className='verticallyCenteredFlexItem' />\n            </button>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/splitPanel.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport React from \"react\";\n\ninterface ISplitPanelProps {\n    top: JSX.Element;\n    bottom: JSX.Element;\n}\n\nexport const SplitPanel = (props: ISplitPanelProps): React.ReactElement<ISplitPanelProps> => {\n    React.useEffect(() => {\n        const observer = new MutationObserver(updateBottomHeight);\n        let container = document.getElementById(\"splitPanelTopContainer\");\n        if (container) {\n            observer.observe(container, { attributes: true });\n            updateBottomHeight();\n        }\n    }, []);\n\n    const updateBottomHeight = (): void => {\n        let container = document.getElementById(\"splitPanelTopContainer\");\n        if (container) {\n            const currentTopHeight = container.style.height;\n            const newBottomHeight = `calc(100% - ${currentTopHeight})`;\n            let bottomContainer = document.getElementById(\"splitPanelBottomContainer\");\n            if (bottomContainer) {\n                bottomContainer.style.height = newBottomHeight;\n            }\n        }\n    };\n\n    return (\n        <div className='splitPanelRootContainer'>\n            <div className='splitPanelTopContainer' id='splitPanelTopContainer' style={{ height: \"60%\" }}>\n                <div className='scrollable'>{props.top}</div>\n            </div>\n            <div className='splitPanelBottomContainer' id='splitPanelBottomContainer'>\n                <div className='scrollable'>{props.bottom}</div>\n            </div>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/components/telemetryViewer.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport * as React from \"react\";\nimport { IConfiguration } from \"../configuration/IConfiguration\";\nimport { getCondensedDetails } from \"../dataSources/dataHelpers\";\nimport { IDataEvent } from \"../dataSources/IDataEvent\";\nimport { Session } from \"../session\";\nimport { EventDetails } from \"./eventDetails\";\nimport { EventTable } from \"./eventTable\";\nimport { IFilterSettings } from \"./IFilterSettings\";\nimport { OptionsBar } from \"./optionsBar\";\nimport { SplitPanel } from \"./splitPanel\";\nimport { doAwait } from \"@nevware21/ts-async\";\n\ninterface ITelemetryViewerProps {\n    session: Session;\n    onShowConfigurationSelection: () => void;\n}\n\nconst filterSettingsCacheKey = \"filterSettings\";\n\nfunction getDefaultFilterSettings(configuration: IConfiguration): IFilterSettings {\n    return {\n        filterText: \"\",\n        filterContent: true,\n        filterByType: undefined,\n        showCondensedDetails: false,\n        listenNetwork: configuration.defaultNetworkCaptureValue !== undefined ? configuration.defaultNetworkCaptureValue : true,\n        listenSdk: configuration.defaultSDKCaptureValue !== undefined ? configuration.defaultSDKCaptureValue : true\n    };\n}\n\nexport const TelemetryViewer = (props: ITelemetryViewerProps): React.ReactElement<ITelemetryViewerProps> => {\n    const [filteredEventData, setFilteredEventData] = React.useState<IDataEvent[]>([]);\n    const [filterSettings, setFilterSettings] = React.useState<IFilterSettings>(getDefaultFilterSettings(props.session.configuration));\n    const [selectedIndex, setSelectedIndex] = React.useState<number | undefined>(undefined);\n    const [isDraggingOver, setIsDraggingOver] = React.useState<boolean>(false);\n\n    const handleNewFilterSettings = (newFilterSettings: IFilterSettings): void => {\n        try {\n            chrome.storage.local.set({ [filterSettingsCacheKey]: JSON.stringify(newFilterSettings) });\n        } catch {\n            // Default is OK\n        }\n\n        setFilterSettings(newFilterSettings);\n    };\n\n    const handleOnRowClickFromEventTable = (target: EventTarget & HTMLTableRowElement): void => {\n        const itemData = target.getAttribute(\"item-data\");\n        const newSelectedIndex: number | undefined = itemData ? parseInt(itemData, 10) : undefined;\n\n        setSelectedIndex(newSelectedIndex);\n    };\n\n    const handleClear = (): void => {\n        // tslint:disable-next-line:no-any\n        props.session.clear();\n        setSelectedIndex(undefined);\n    };\n\n    const handleSave = (): void => {\n        props.session.save();\n    };\n\n    const handleDrop = (event: React.DragEvent<HTMLDivElement>): void => {\n        // Prevent default behavior (Prevent file from being opened)\n        event.preventDefault();\n\n        setIsDraggingOver(false);\n\n        if (event.dataTransfer.items) {\n            // tslint:disable-next-line:prefer-for-of\n            for (let i = 0; i < event.dataTransfer.items.length; i++) {\n                if (event.dataTransfer.items[i].kind === \"file\") {\n                    const file = event.dataTransfer.items[i].getAsFile();\n                    if (file && file.type === \"application/json\") {\n                        handleImport(file);\n                        return;\n                    }\n                }\n            }\n        }\n    };\n\n    const handleDragOver = (event: React.DragEvent<HTMLDivElement>): void => {\n        setIsDraggingOver(true);\n        event.preventDefault();\n    };\n\n    const handleDragLeave = (event: React.DragEvent<HTMLDivElement>): void => {\n        setIsDraggingOver(false);\n    };\n\n    const handleImport = (file: File): Promise<void> => {\n        return file.text().then((stringData: string) => {\n            if (props.session.load(stringData)) {\n                setSelectedIndex(undefined);\n            }\n        });\n    };\n\n    const onFilteredDataChanged = (filterSettings: IFilterSettings): void => {\n        setFilteredEventData(props.session.filteredData);\n        if (filterSettings.filterText && props.session.filteredData.length > 0) {\n            // Reselect the first element\n            setSelectedIndex(0);\n        }\n    };\n\n    React.useEffect(() => {\n        try {\n            doAwait(chrome.storage.local.get([filterSettingsCacheKey]), (json: any) => {\n                if (json) {\n                    // Make sure we have any defaults set\n                    let settings: IFilterSettings = {\n                        ...getDefaultFilterSettings(props.session.configuration),\n                        ...(JSON.parse(json[filterSettingsCacheKey]))\n                    };\n    \n                    setFilterSettings(settings);\n                }\n            });\n        } catch {\n            // Default is OK\n        }\n\n        props.session.onFilteredDataChanged = onFilteredDataChanged;\n        onFilteredDataChanged(filterSettings);\n\n        return () => {\n            props.session.onFilteredDataChanged = undefined;\n        };\n    }, []);\n\n    React.useEffect(() => {\n        props.session.filterSettings = filterSettings;\n    }, [filterSettings]);\n\n    const detailsData =\n        selectedIndex !== undefined && filteredEventData !== undefined && selectedIndex < filteredEventData.length\n            ? filterSettings.showCondensedDetails\n                ? getCondensedDetails(filteredEventData[selectedIndex], props.session.configuration)\n                : filteredEventData[selectedIndex].data                 // The raw event data\n            : undefined;\n\n    return (\n        <div className='rootDiv'>\n            <div className='headerDiv'>\n                <OptionsBar\n                    filterSettings={filterSettings}\n                    onFilterSettingsChanged={handleNewFilterSettings}\n                    counts={props.session.counts}\n                    onClear={handleClear}\n                    onSave={handleSave}\n                    onShowConfigurationSelection={props.onShowConfigurationSelection}\n                />\n            </div>\n            <div\n                className='contentDiv'\n                onDrop={handleDrop}\n                onDragOver={handleDragOver}\n                onDragLeave={handleDragLeave}\n            >\n                <SplitPanel\n                    top={\n                        <EventTable\n                            configuration={props.session.configuration}\n                            filterSettings={filterSettings}\n                            dataEvents={filteredEventData}\n                            selectedIndex={selectedIndex}\n                            onRowClickHandler={handleOnRowClickFromEventTable}\n                        />\n                    }\n                    bottom={<EventDetails data={detailsData} filterSettings={filterSettings} />}\n                />\n                {isDraggingOver ? (\n                    <div className='dragTarget'>\n                        <div className='dragTargetText'>Drop telemetry recordings here</div>\n                    </div>\n                ) : null}\n            </div>\n        </div>\n    );\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/configuration/Configuration.types.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport type ConfigurationType = undefined | keyof IConfigurationURLs;\n\nexport interface IConfigurationURLs {\n    Default: string;\n    Stream: string;\n    AMC: string;\n    MSN: string;\n    Custom: string;\n}\n\nexport const ConfigurationURLs: IConfigurationURLs = {\n    // Default doesn't load from a URL\n    Default: \"\",\n    Stream: \"https://aka.ms/telemetryViewerConfig/Stream\",\n    AMC: \"https://aka.ms/telemetryViewerConfig/AMC\",\n    MSN: \"TODO\",\n    // Custom doesn't load from a URL, but from local storage instead\n    Custom: \"\"\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/configuration/IConfiguration.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { DataEventType } from \"../dataSources/IDataEvent\";\nimport { DataSourceType } from \"../dataSources/IDataSource\";\n\n// This is the expected format of the JSON file loaded for a given configuration\nexport interface IConfiguration {\n    /**\n     * Which data source to use to gather the events, defaults to Default\n     */\n    dataSourceType?: DataSourceType;\n\n    /**\n     * Optional URL filter pattern that some data sources use\n     */\n    dataSourceUrls?: string | string[];\n\n    /**\n     * Optional default value for the network capture setting in the UI\n     */\n    defaultNetworkCaptureValue?: boolean;\n\n    /**\n     * Optional default value for the SDK capture setting in the UI\n     */\n    defaultSDKCaptureValue?: boolean;\n\n     /**\n     * A list of fields of the fields to exclude from the details view when \"Consolidate details\" is checked\n     */\n    fieldsToExcludeFromCondensedList?: string[];\n\n    /**\n     * A list of the columns to display\n     */\n    columnsToDisplay: IColumn[];\n\n    /**\n     * The names of optional special fields that enable handy features\n     */\n    specialFieldNames?: ISpecialFieldNames;\n\n    /**\n     * If supplied, any events without this field will be ignored\n     */\n    ignoreEventsWithoutThisField?: string;\n\n    /**\n     * The prioritized list of conditions that will be evaluated to determine the DataEventType of a DataEvent\n     * The first match will determine the DataEventType, the default if there are no matches is DataEventType.other\n     */\n    prioritizedDataEventTypeTests?: IDataEventTypeCondition[];\n\n    /**\n     * [Optional] Ignore notification messages\n     */\n    ignoreNotifications?: boolean;\n}\n\nexport type DynamicValueConverter =\n    // Remove the strings <safe> and </safe> from the beginning and end of the string\n    | \"RemoveSafeTags\"\n\n    // Truncates the value and appends \" ms\"\n    | \"NumberToWholeMilliseconds\"\n\n    // Truncates the value and adds locale specific digit grouping\n    | \"TruncateWithDigitGrouping\";\n\nexport interface IDynamicField {\n    // The name of the field to display\n    // Examples:\n    //  \"data.foo\" will return \"abc\" for this event { \"data\" : { \"foo\": \"abc\" } }\n    //  \"data['foo.bar']\" will return \"abc\" for this event: { \"data\": { \"foo.bar\": \"abc\"} }\n    //  \"data['foo[0]']\" will return \"abc\" for this event: { \"data\": { \"foo\": [ \"abc\" ] } }\n    name: string;\n\n    // An optional converter to run on the data before displaying it\n    converter?: DynamicValueConverter;\n}\n\nexport interface IColumn {\n    // The text to display in the header of the column\n    header: string;\n\n    // Defaults to 'NormalData' - see ColumnType for details\n    type: ColumnType;\n\n    // A priority list of the IDataEvent fields to display - the first one found is the one displayed\n    // Note: some field types are calculated and don't need a fieldName\n    prioritizedFieldNames?: IDynamicField[];\n}\n\nexport type ColumnType =\n    // Just displays the data without manipulation\n    | \"NormalData\"\n\n    // Displays an incrementing session number, based on specialFieldName.sessionId\n    | \"SessionNumber\"\n\n    // Displays the change in a number from one entry to the next\n    | \"NumberDelta\"\n\n    // Displays the change in a timestamp from one entry to the next (in milliseconds)\n    | \"TimeDelta\";\n\n// If your data contains these fields, you can enable special column types with handy features,\n// such as displaying an incrementing session number instead of a session's GUID to make it easier\n/**\n *  to scan the events visually.\n */\nexport interface ISpecialFieldNames {\n    /**\n     * A unique ID for each session\n     */\n    sessionId?: string|string[];\n\n    /**\n     * If specified, a regular expression to use on the data in the sessionId field -\n     * the first capture group is used as the sessionId\n     */\n    sessionIdRegex?: string;\n\n    /**\n     * The names of fields which contain JSON data, so that they can be parsed and then referenced\n     * in this configuration\n     */\n    jsonFieldNames?: string;\n}\n\nexport interface IDataEventTypeCondition {\n    /**\n     * The DataEventType that will be assigned to this event if the conditions are met\n     */\n    dataEventType: DataEventType;\n\n    /**\n     * The name of the field to test (see IDynamicField.name for a description of valid values)\n     */\n    fieldName: string;\n\n    /**\n     * The value to test for\n     */\n    fieldValue: string;\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/configuration/IPopupSettings.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Identifies the popup configuration values that are stored in local storage to remember\n * the last size of the popup window.\n */\nexport interface IPopupSettings {\n    /**\n     * The width of the popup window, this will be used when opening a new popup, the maximum size\n     * will be restricted by the current screen size and a predefined internal minimum.\n     */\n    width?: number;\n\n    /**\n     * The height of the popup window, this will be used when opening a new popup, the maximum size\n     * will be restricted by the current screen size and a predefined internal minimum.\n     */\n     height?: number;\n}"
  },
  {
    "path": "tools/chrome-debug-extension/src/configuration/PopupConfigCache.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { objForEachKey } from \"@microsoft/applicationinsights-core-js\";\nimport { IPopupSettings } from \"./IPopupSettings\";\nimport { doAwait } from \"@nevware21/ts-async\";\n\nconst popupWindowSettingsCacheKey = \"popupWindowSettings\";\n\nexport function getPopupSettings() : IPopupSettings {\n    let settings = {\n        width: 680,\n        height: 860\n    };\n\n    doAwait(chrome.storage.local.get([popupWindowSettingsCacheKey]), (popupSettings: any) => {\n        if (popupSettings) {\n            try {\n                settings = JSON.parse(popupSettings[popupWindowSettingsCacheKey]);\n            } catch (e) {\n                // Just ignore failures and we fallback to the defaults\n            }\n        }\n        if (!settings.width) {\n            settings.width = 750;\n        }\n        return settings;\n    });\n    return settings;\n}\n\nfunction _setPopupSettings(newSettings: IPopupSettings) {\n    let settings = getPopupSettings();\n\n    // Merge the new settings, only support \"expected\" keys as defined by the default\n    objForEachKey(newSettings, (name, value) => {\n        if (value && name in settings) {\n            settings[name] = value;\n        }\n    });\n    chrome.storage.local.set({ [popupWindowSettingsCacheKey]: JSON.stringify(settings) });\n}\n\nexport function setPopupSize(width?: number, height?: number) {\n    _setPopupSettings({ width, height });\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/configuration/configuration.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { ConfigurationType, ConfigurationURLs } from \"./Configuration.types\";\nimport { defaultConfiguration } from \"./defaultConfiguration\";\nimport { IConfiguration } from \"./IConfiguration\";\n\nexport function getConfiguration(configurationType: ConfigurationType): Promise<IConfiguration | undefined> {\n    if (configurationType === undefined) {\n        return Promise.resolve(undefined);\n    }\n\n    if (configurationType === \"Default\") {\n        return Promise.resolve(defaultConfiguration);\n    }\n\n    const url = ConfigurationURLs[configurationType];\n    return fetch(url).then((response: Response) => {\n        return response.json();\n    });\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/configuration/defaultConfiguration.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IConfiguration, IDataEventTypeCondition } from \"./IConfiguration\";\n\nexport const defaultSessionId: string[] = [\"tags['ai.session.id']\", \"ext.app.sesId\"];\n\nexport const defaultDataEventTypes: IDataEventTypeCondition[] = [\n    {\n        dataEventType: \"performance\",\n        fieldName: \"name\",\n        fieldValue: \"Notification:perfEvent*\"\n    },\n    {\n        dataEventType: \"warning\",\n        fieldName: \"name\",\n        fieldValue: \"Notification:eventsDiscarded*\"\n    },\n    {\n        dataEventType: \"appLogic\",\n        fieldName: \"name\",\n        fieldValue: \"Notification:events*\"\n    },\n    {\n        dataEventType: \"fatalError\",\n        fieldName: \"name\",\n        fieldValue: \"diagLog:throw*\"\n    },\n    {\n        dataEventType: \"warning\",\n        fieldName: \"name\",\n        fieldValue: \"diagLog:warn*\"\n    },\n    {\n        dataEventType: \"fatalError\",\n        fieldName: \"name\",\n        fieldValue: \"diagLog:error*\"\n    },\n    {\n        dataEventType: \"warning\",\n        fieldName: \"data.eventType\",\n        fieldValue: \"Warning\"\n    },\n    {\n        dataEventType: \"fatalError\",\n        fieldName: \"data.baseType\",\n        fieldValue: \"ExceptionData\"\n    },\n    {\n        dataEventType: \"appLogic\",\n        fieldName: \"data.eventType\",\n        fieldValue: \"ApplicationLogic\"\n    },\n    {\n        dataEventType: \"performance\",\n        fieldName: \"data.baseType\",\n        fieldValue: \"PageviewPerformanceData\"\n    },\n    {\n        dataEventType: \"performance\",\n        fieldName: \"data.baseType\",\n        fieldValue: \"PageviewPerformanceData\"\n    }\n];\n\nexport const defaultExcludeFromCondensedList = [\n    \"tags['ai.user.id']\",\n    \"tags['ai.session.id']\",\n    \"tags['ai.device.id']\",\n    \"tags['ai.device.type']\",\n    \"tags['ai.operation.name']\",\n    \"tags['ai.operation.id']\",\n    \"tags['ai.internal.sdkVersion']\",\n    \"tags['ai.internal.snippet']\",\n    \"ext.app\",\n    \"ext.user\",\n    \"ext.web\",\n    \"ext.intweb\",\n    \"ext.loc\",\n    \"ext.metadata\",\n    \"ext.mscv\",\n    \"ext.utc\",\n    \"ext.device\",\n    \"ext.dt\"\n];\n\nexport const defaultConfiguration: IConfiguration = {\n    prioritizedDataEventTypeTests: defaultDataEventTypes,\n    columnsToDisplay: [\n        {\n            header: \"Session\",\n            type: \"SessionNumber\"\n        },\n        {\n            header: \"Time\",\n            type: \"NormalData\",\n            prioritizedFieldNames: [\n                {\n                    name: \"time\"\n                }\n            ]\n        },\n        {\n            header: \"ΔT\",\n            type: \"TimeDelta\",\n            prioritizedFieldNames: [\n                {\n                    name: \"time\"\n                }\n            ]\n        },\n        {\n            header: \"Event Name\",\n            type: \"NormalData\",\n            prioritizedFieldNames: [\n                {\n                    name: \"name\"\n                }\n            ]\n        },\n        {\n            header: \"Dynamic Value\",\n            type: \"NormalData\",\n            prioritizedFieldNames: [\n                {\n                    name: \"data.baseData.message\"\n                },\n                {\n                    name: \"data.baseData.exceptions[0].message\"\n                },\n                {\n                    name: \"data.baseData.name\"\n                },\n                {\n                    name: \"data.baseData.id\"\n                },\n                {\n                    name: \"data.baseData.metrics[0].name\"\n                }\n            ]\n        }\n    ],\n    fieldsToExcludeFromCondensedList: defaultExcludeFromCondensedList,\n    specialFieldNames: {\n        sessionId: \"\"\n    }\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/contentLoad.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { MessageType } from \"./Enums\";\n\n// Send a message to the background task to cause the auto-inject script to be added if the\n// extension is open for this tab\nchrome.runtime.sendMessage({ id: MessageType.ContentLoad });\n\n/**\n * Listen to page events\n */\nwindow.addEventListener(\"message\", (event) => {\n    if (event.source != window) {\n        return;\n    }\n    \n    chrome.runtime.sendMessage(event.data);\n}, false);\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/dataSources/IDataEvent.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { LogEntry } from \"../LogEntry\";\n\nexport type DataEventType = \"other\" | \"appLogic\" | \"warning\" | \"fatalError\" | \"performance\";\n\n/**\n * Basic Event abstraction used to display the details in the table\n */\nexport interface IDataEvent {\n    /**\n     * The raw data of the event, this is displayed in the details section of the extension\n     */\n    data: any;\n\n    name: string;\n    time: string;\n\n    tabId?: number;\n    type?: DataEventType;\n    dynamicValue?: string;\n    condensedDetails?: any;\n    sessionNumber?: string;\n    logEntry?: LogEntry;\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/dataSources/IDataSource.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IMessage } from \"../interfaces/IMessage\";\n\nexport type DataSourceType = \"Default\";\n\nexport interface IDataSource {\n    addListener: (callback: (newMessage: IMessage) => void) => number;\n    removeListener: (id: number) => boolean;\n\n    startListening: () => void;\n    stopListening: () => void;\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/dataSources/dataHelpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport _ from \"lodash\";\nimport { arrForEach, isArray, isString, normalizeJsName } from \"@microsoft/applicationinsights-core-js\";\nimport {\n    DynamicValueConverter, IConfiguration, IDataEventTypeCondition, IDynamicField, ISpecialFieldNames\n} from \"../configuration/IConfiguration\";\nimport { defaultDataEventTypes, defaultExcludeFromCondensedList, defaultSessionId } from \"../configuration/defaultConfiguration\";\nimport { DataEventType, IDataEvent } from \"./IDataEvent\";\nimport { mathTrunc } from \"@nevware21/ts-utils\";\n\nlet _regExpMap: { [key: string]: RegExp } = {};\n\nfunction _createRegEx(value: string) {\n    // Escape any slashes first!\n    value = value.replace(/\\\\/g, \"\\\\\\\\\");\n    // eslint-disable-next-line security/detect-non-literal-regexp\n    value = value.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/])/g, \"\\\\$1\");\n    value = value.replace(/\\*/g, \".*\");\n    return new RegExp(\"(\" + value + \")\");\n}\n\nfunction _isMatch(source: string, value: string) {\n    if (source.indexOf(\"*\") !== -1) {\n        const name = normalizeJsName(source);\n        // Looks like it contains a wildcard match\n        let regEx = _regExpMap[name] || (_regExpMap[name] = _createRegEx(source));\n        return regEx.test(value);\n    }\n\n    return source === value;\n}\n\nexport interface ICounts {\n    all: number;\n    appLogic: number;\n    performance: number;\n    warning: number;\n    fatalError: number;\n}\n\nexport function getEventType(dataEvent: IDataEvent, configuration: IConfiguration): DataEventType {\n    let prioritizedDataEventTypeTests: IDataEventTypeCondition[] = configuration.prioritizedDataEventTypeTests || [];\n    \n    for (const dataEventTypeTest of prioritizedDataEventTypeTests) {\n        const fieldValue = getFieldValueAsString(dataEvent, dataEventTypeTest.fieldName);\n        if (fieldValue && _isMatch(dataEventTypeTest.fieldValue, fieldValue)) {\n            return dataEventTypeTest.dataEventType;\n        }\n    }\n    \n    // Default to using the default set if the configuration found nothing\n    for (const dataEventTypeTest of defaultDataEventTypes) {\n        const fieldValue = getFieldValueAsString(dataEvent, dataEventTypeTest.fieldName);\n        if (fieldValue && _isMatch(dataEventTypeTest.fieldValue, fieldValue)) {\n            return dataEventTypeTest.dataEventType;\n        }\n    }\n\n    return \"other\";\n}\n\nexport function getDynamicFieldValue(dataEvent: IDataEvent, dynamicFields?: IDynamicField[]): string {\n    if (dynamicFields === undefined) {\n        return \"\";\n    }\n\n    for (const dynamicField of dynamicFields) {\n        const rawValue = getFieldValueAsString(dataEvent, dynamicField.name);\n        if (rawValue) {\n            return applyConverter(rawValue, dynamicField.converter) || \"\";\n        }\n    }\n    return \"\";\n}\n\nexport function getCondensedDetails(dataEvent: IDataEvent, configuration: IConfiguration): any {\n    if (!dataEvent.condensedDetails) {\n        // Construct\n        dataEvent.condensedDetails = JSON.parse(JSON.stringify((dataEvent||{}).data || {}));\n\n        var excludeFields = (configuration || {}).fieldsToExcludeFromCondensedList;\n        if (excludeFields) {\n            arrForEach(excludeFields, (toExclude) => {\n                _.unset(dataEvent.condensedDetails, toExclude);\n            });\n        } else {\n            for (const toExclude of defaultExcludeFromCondensedList) {\n                _.unset(dataEvent.condensedDetails, toExclude);\n            }\n        }\n    }\n\n    return dataEvent.condensedDetails;\n}\n\nexport function applyConverter(\n    value: string | undefined,\n    converter?: DynamicValueConverter\n): string | undefined {\n    if (value === undefined) {\n        return undefined;\n    }\n\n    switch (converter) {\n    case \"RemoveSafeTags\": {\n        return value.replace(\"<safe>\", \"\").replace(\"</safe>\", \"\");\n    }\n    case \"NumberToWholeMilliseconds\": {\n        return `${mathTrunc(Number.parseInt(value, 10))} ms`;\n    }\n    case \"TruncateWithDigitGrouping\": {\n        return `${mathTrunc(Number.parseInt(value, 10)).toLocaleString()}`;\n    }\n    default: {\n        return value;\n    }\n    }\n}\n\nexport function getSessionId(dataEvent: IDataEvent, configuration: IConfiguration): string | undefined {\n    let specialFieldNames: ISpecialFieldNames = (configuration.specialFieldNames || {});\n    const value = getFieldValueAsString(dataEvent, specialFieldNames.sessionId) || getFieldValueAsString(dataEvent, defaultSessionId);\n\n    if (value && specialFieldNames.sessionIdRegex) {\n        const matches = value.match(new RegExp(specialFieldNames.sessionIdRegex));\n        if (matches && matches.length > 1) {\n            return matches[1];\n        } else {\n            return undefined;\n        }\n    } else {\n        return value;\n    }\n}\n\nexport function getFieldValueAsString(dataEvent: IDataEvent, fieldNames?: string|string[]): string | undefined {\n    if (dataEvent && fieldNames) {\n        let names: string[] = [];\n        if (isArray(fieldNames)) {\n            names = fieldNames as string[];\n        } else if (isString(fieldNames)) {\n            names = [fieldNames];\n        }\n    \n        for (let lp = 0; lp < names.length; lp++) {\n            const value = _.get(dataEvent, names[lp]) || _.get(dataEvent.data, names[lp]);\n            if (value !== undefined && value[\"toString\"] !== undefined) {\n                return value.toString();\n            }\n        }\n    }\n\n    return undefined;\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/dataSources/dataSources.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { dumpObj, isArray, isString } from \"@microsoft/applicationinsights-core-js\";\nimport { IConfiguration } from \"../configuration/IConfiguration\";\nimport { IDataSource } from \"./IDataSource\";\nimport { DefaultDataSource } from \"./defaultDataSource\";\nimport { NoOpDataSource } from \"./noOpDataSource\";\n\nexport function createDataSource(configuration: IConfiguration): IDataSource {\n    // If on localhost, assume we are doing local testing (e.g. for accessibility issues) and use the NoOpDataSource\n    if (window.location.host.indexOf(\"localhost:9001\") === 0) {\n        return new NoOpDataSource();\n    }\n\n    let tabId: number = 0;\n    try {\n        let params = new URLSearchParams(window.location.search);\n        if (params.has(\"tabId\")) {\n            tabId = parseInt(params.get(\"tabId\") || \"\");\n        }\n        \n        if (!tabId) {\n            return new NoOpDataSource();\n        }\n    \n    } catch (e) {\n        console.log(\"Error getting URL Params: \" + dumpObj(e));\n    }\n\n    let urls: string[] = [];\n    if (configuration.dataSourceUrls) {\n        if (isArray(configuration.dataSourceUrls)) {\n            urls = configuration.dataSourceUrls as string[];\n        } else if (isString(configuration.dataSourceUrls)) {\n            urls = [configuration.dataSourceUrls] as string[];\n        }\n\n        if (!urls || urls.length === 0) {\n            urls = [\"*://*.microsoft.com/OneCollector/*\", \"*://*.visualstudio.com/v2/track*\", \"*://*.applicationinsights.azure.com/v2/track*\"];\n        }\n    }\n\n    switch (configuration.dataSourceType) {\n    case undefined:\n    case \"Default\":\n        return new DefaultDataSource(tabId, urls, configuration.ignoreNotifications);\n\n    default:\n        console.error(`Unrecognized data source supplied in the configuration: ${configuration.dataSourceType}`);\n        return new NoOpDataSource();\n    }\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/dataSources/defaultDataSource.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { createAsyncRejectedPromise, doAwait, IPromise } from \"@nevware21/ts-async\";\nimport { MessageSource, MessageType } from \"../Enums\";\nimport { IMessage } from \"../interfaces/IMessage\";\nimport { IDataSource } from \"./IDataSource\";\n\n/**\n * This data source listens to both the network and the SDK for events\n */\nexport class DefaultDataSource implements IDataSource {\n\n    public addListener: (callback: (newMessage: IMessage) => void) => number;\n    public removeListener: (id: number) => boolean;\n    public startListening: () => void;\n    public stopListening: () => void;\n\n    constructor(_tabId: number, urls: string[], ignoreNotifications?: boolean) {\n        let _self = this;\n        let listeners: Map<number, (newMessage: IMessage) => void> = new Map();\n        let nextListenerId: number = 0;\n\n        if (!urls || urls.length === 0) {\n            urls = [\"*://*.microsoft.com/OneCollector/*\", \"*://*.visualstudio.com/v2/track*\", \"*://*.eastus-8.in.applicationinsights.azure.com/v2/track*\"];\n        }\n\n        _self.startListening = (): void => {\n            // Monitor network traffic for telemetry\n            chrome.webRequest.onBeforeRequest.addListener(\n                _processWebRequest,\n                // filters\n                {\n                    urls\n                },\n                [\"requestBody\"]\n            );\n\n            chrome.runtime.onMessage.addListener(_onMessageReceived);\n        };\n    \n        _self.stopListening = (): void => {\n            chrome.webRequest.onBeforeRequest.removeListener(_processWebRequest);\n            chrome.runtime.onMessage.removeListener(_onMessageReceived);\n        };\n    \n        _self.addListener = (callback: (newMessage: IMessage) => void): number => {\n            listeners.set(nextListenerId, callback);\n            return nextListenerId++;\n        };\n    \n        _self.removeListener = (id: number): boolean => {\n            return listeners.delete(id);\n        };\n\n        function isGzip(data: ArrayBuffer): boolean {\n            const checkGzip = new Uint8Array(data);\n            if (checkGzip[0] === 0x1F && checkGzip[1] === 0x8B) {\n                return true;\n            }\n            return false;\n        }\n\n        function decompressEvents(compressedString: ArrayBuffer): IPromise<Uint8Array> {\n            const DecompressionStream = (window as any).DecompressionStream;\n        \n            if (DecompressionStream && typeof DecompressionStream !== \"undefined\") {\n                // If DecompressionStream is available, use it\n                const binaryData = new Uint8Array(compressedString);\n        \n                // Create a ReadableStream from the Uint8Array\n                const compressedReadableStream = new ReadableStream({\n                    start(controller) {\n                        controller.enqueue(binaryData);\n                        controller.close();\n                    }\n                });\n        \n                // Pipe through the DecompressionStream (gzip)\n                const decompressedReadableStream = compressedReadableStream.pipeThrough(\n                    new DecompressionStream(\"gzip\")\n                );\n        \n                // Read the decompressed stream and return a Uint8Array\n                return new Response(decompressedReadableStream)\n                    .arrayBuffer()\n                    .then((decompressedBuffer) => {\n                        return new Uint8Array(decompressedBuffer); // Return the decompressed data as Uint8Array\n                    });\n            } else {\n                return createAsyncRejectedPromise(new Error(\"DecompressionStream is not supported in this environment.\"));\n            }\n        }\n\n        function processEvents(events: string[] | null, details: chrome.webRequest.WebRequestBodyDetails): void {\n            if (events) {\n                for (let i = events.length - 1; i >= 0; i--) {\n                    try {\n                        const event = JSON.parse(events[i]);\n                        if (event !== undefined) {\n                            if (Array.isArray(event)) {\n                                for (const subEvent of event) {\n                                    _handleMessage(subEvent, details);\n                                }\n                            } else {\n                                _handleMessage(event, details);\n                            }\n                        }\n                    } catch (e) {\n                        // Ignore\n                    }\n                }\n            }\n        }\n    \n        function _processWebRequest(details: chrome.webRequest.WebRequestBodyDetails): void {\n            if (details && (details.type === \"xmlhttprequest\" || details.type === \"ping\")) {\n                if (details.requestBody && details.requestBody.raw) {\n     \n                    let gzipped = isGzip(details.requestBody.raw[0].bytes as ArrayBuffer);\n\n                    // console.log(\"Gzipped: \" + gzipped);\n                    var events: string[] | null;\n                    if (gzipped) {\n                        doAwait(decompressEvents(details.requestBody.raw[0].bytes as ArrayBuffer), (decompressedData) => {\n                            if (decompressedData) {\n                                // console.log(\"After decompression:\", decompressedData);\n                                events = _convertToStringArray([{bytes: decompressedData}]);\n                                processEvents(events, details);\n                            } else {\n                                // console.error(\"Decompression failed.\");\n                            }\n                        });\n                    } else {\n                        events = details.requestBody && _convertToStringArray(details.requestBody.raw);\n                        processEvents(events, details);\n                    }\n                    \n                }\n            }\n        }\n    \n        function _handleMessage(message: any, details: chrome.webRequest.WebRequestBodyDetails): void {\n            if (message) {\n                let msg: IMessage = {\n                    id: MessageType.Network,\n                    src: MessageSource.WebRequest,\n                    tabId: details.tabId,\n                    details: {\n                        name: message.name,\n                        time: message.time,\n                        data: message\n                    }\n                };\n                listeners.forEach((listener: (message: IMessage) => void) => {\n                    listener(msg);\n                });\n            }\n        }\n    \n        function _convertToStringArray(buf: chrome.webRequest.UploadData[] | undefined): string[] {\n            if (buf !== undefined) {\n                try {\n                    const data = buf[0].bytes;\n                    if (data) {\n                        const decoder = new TextDecoder();\n                        return decoder.decode(new Uint8Array(data)).split(\"\\n\");\n                    }\n                } catch (e) {\n                    // Ignore\n                }\n            }\n\n            return [];\n        }\n\n        function _onMessageReceived(message: any, sender: any, sendResponse: any): void {\n            let msg = message as IMessage;\n    \n            if (ignoreNotifications === true && msg.id === MessageType.Notification) {\n                return;\n            }\n            \n            // Only handle notifications and\n            if (msg.id === MessageType.Notification || msg.id === MessageType.DebugEvent || msg.id === MessageType.DiagnosticLog || msg.id === MessageType.GenericEvent) {\n                if (sender && sender.tab && msg.details) {\n                    msg.tabId = msg.tabId || sender.tab.id;\n\n                    try {\n                        listeners.forEach((listener: (message: IMessage) => void) => {\n                            listener(msg);\n                        });\n                    } catch (e) {\n                        console.error(\"Unexpected Message: \" + JSON.stringify(e));\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/dataSources/noOpDataSource.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IMessage } from \"../interfaces/IMessage\";\nimport { IDataSource } from \"./IDataSource\";\n\nexport class NoOpDataSource implements IDataSource {\n    private nextListenerId: number = 0;\n\n    public startListening = (): void => {\n    };\n\n    public stopListening = (): void => {\n    };\n\n    public addListener = (callback: (newMessage: IMessage) => void): number => {\n        return this.nextListenerId++;\n    };\n\n    public removeListener = (id: number): boolean => {\n        return true;\n    };\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/helpers.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { arrForEach, arrIndexOf, getIEVersion, isArray, isError, isFunction, isObject, isString, isSymbol, objKeys } from \"@microsoft/applicationinsights-core-js\";\nimport { strShimPrototype } from \"@microsoft/applicationinsights-shims\";\nimport { objHasOwnProperty } from \"@nevware21/ts-utils\";\n\nconst strConstructor = \"constructor\";\nconst strGetOwnPropertyNames = \"getOwnPropertyNames\";\n\nexport const MAX_DEPTH = 16;\n\nexport function makeRegex(value: string, caseSensitive = true) {\n    if (value && value.length > 0) {\n        value = value.replace(/\\\\/g, \"\\\\\\\\\");\n        // eslint-disable-next-line security/detect-non-literal-regexp\n        value = value.replace(/([\\+\\?\\|\\{\\[\\(\\)\\^\\$\\#\\.\\]\\}])/g, \"\\\\$1\");\n        value = value.replace(/\\*/g, \".*\");\n        if (caseSensitive) {\n            return new RegExp(\"(\" + value + \")\");\n        }\n\n        return new RegExp(\"(\" + value + \")\", \"i\");\n    }\n\n    return null;\n}\n\nexport function toggleClassName(el: HTMLElement, className: string) {\n    const idx = el.className.indexOf(className);\n    if (idx === -1) {\n        el.className += className;\n    } else {\n        el.className = el.className.substring(0, idx) + el.className.substring(idx + className.length);\n    }\n}\n\nexport function traverseAndReplace(target: Object, maxDepth: number, currentDepth: number, thingsReferenced: any[], excludedKeys: string[], includeFunctions: boolean): Object {\n    const out = {};\n\n    if (!thingsReferenced) {\n        thingsReferenced = [];\n    }\n    \n    if (isObject(target)) {\n        for (const key of getTargetKeys(target, excludedKeys, includeFunctions)) {\n            let targetValue = target[key];\n            if (isSymbol(targetValue)) {\n                targetValue = targetValue.toString();\n            }\n\n            if (targetValue !== null && arrIndexOf(thingsReferenced, targetValue) !== -1) {\n                out[key] = `<circular (${key} - \"${getTargetName(targetValue)}\")>`;\n            } else if (targetValue !== null && isObject(targetValue)) {\n                if (currentDepth >= maxDepth) {\n                    out[key] = \"<max allowed depth reached>\";\n                } else {\n                    thingsReferenced.push(target);\n                    out[key] = traverseAndReplace(targetValue, maxDepth, currentDepth + 1, thingsReferenced, excludedKeys, includeFunctions);\n                    thingsReferenced.pop();\n                }\n            } else {\n                out[key] = targetValue;\n            }\n        }\n    }\n\n    return out;\n}\n\nfunction _sanitizeText(value: string) {\n    if (value) {\n        value = value.replace(/&/g, \"&amp;\");\n        value = value.replace(/>/g, \"&gt;\");\n        value = value.replace(/</g, \"&lt;\");\n    }\n\n    return value;\n}\n\nfunction _setInnerText(elm: HTMLElement, theText: string, textFilter: string): boolean {\n    let innerText = theText;\n    let matchPos = -1;\n    let matchLen = 0;\n    let rg = makeRegex(textFilter, false);\n    if (rg) {\n        let matchTxt = rg.exec(innerText);\n        if (matchTxt && matchTxt[1]) {\n            matchPos = theText.indexOf(matchTxt[1]);\n            matchLen = matchTxt[1].length;\n        }\n    }\n\n    if (matchPos !== -1) {\n        let innerHtml =\n            _sanitizeText(theText.substring(0, matchPos)) +\n            \"<span class=\\\"matched-text-filter\\\">\" +\n            _sanitizeText(theText.substring(matchPos, matchPos + matchLen)) +\n            \"</span>\" +\n            theText.substring(matchPos + matchLen);\n\n        elm.innerHTML = innerHtml;\n        return true;\n    }\n\n    elm.innerText = theText;\n    return false;\n}\n\nlet lastSelectedElement: HTMLElement;\nlet selectedObject: object;\n\nexport function copySelectedTree() {\n    const toCopy: Object = selectedObject;\n    if (!toCopy) {\n        return;\n    }\n\n    const textArea = document.createElement(\"textarea\");\n    textArea.innerText = JSON.stringify(toCopy);\n    textArea.style.opacity = \"0\";\n    document.body.appendChild(textArea);\n    textArea.select();\n    document.execCommand(\"copy\");\n    const parent = textArea.parentElement;\n    if (parent) {\n        parent.removeChild(textArea);\n    }\n}\n\nexport function focusHandler(evt: Event, target: Object, level: number, excludeKeys: string[], includeFunctions: boolean) {\n    if (lastSelectedElement) {\n        toggleClassName(lastSelectedElement, \" last-selected-element\");\n    }\n    lastSelectedElement = (evt.target as HTMLElement);\n    for (let i = 0; i < 10; i++) {\n        if (lastSelectedElement.tagName === \"DIV\") {\n            break;\n        }\n        lastSelectedElement = lastSelectedElement.parentElement as HTMLElement;\n    }\n    lastSelectedElement.className += \" last-selected-element\";\n    selectedObject = traverseAndReplace(target, MAX_DEPTH, level, [], excludeKeys, includeFunctions);\n}\n\nfunction _navHandler(evt: KeyboardEvent, openHandler?: (evt: Event, forceState?: boolean) => void, currentState?: boolean) {\n    const el = evt.target as HTMLElement;\n    switch (evt.which) {\n    // Enter\n    case 13: (openHandler) ? openHandler(evt) : void 0; break;\n        // ArrowUp\n    case 38:\n        evt.preventDefault();\n        const prev = el.previousElementSibling as HTMLElement;\n        if (prev && prev.tagName !== \"BUTTON\") {\n            prev.focus();\n        }\n        break;\n        // ArrowDown\n    case 40:\n        evt.preventDefault();\n        const next = el.nextElementSibling as HTMLElement;\n        if (next) {\n            next.focus();\n        }\n        break;\n        // ArrowRight\n    case 39:\n        if (openHandler) {\n            openHandler(evt, true);\n            if (currentState) {\n                ((el.firstElementChild && el.firstElementChild.nextSibling) as HTMLElement).focus();\n            }\n        }\n        break;\n        // ArrowLeft\n    case 37:\n        if (openHandler) {\n            openHandler(evt, false);\n        }\n        if (!currentState) {\n            (el.parentElement as HTMLElement).focus();\n        }\n        break;\n        // c\n    case 67:\n        if (evt.ctrlKey) {\n            copySelectedTree();\n            (evt.target as HTMLElement).focus();\n        }\n        break;\n    }\n}\n\nexport function getTargetName(target: any) {\n    if (target) {\n        if (isString(target.identifier)) {\n            return target.identifier;\n        }\n\n        if (isString(target.name)) {\n            return target.name;\n        }\n\n        if (objHasOwnProperty(target, strShimPrototype)) {\n            // Look like a prototype\n            return target.name || \"\";\n        }\n\n        return ((target[strConstructor]) || {}).name || \"\";\n    }\n\n    return \"\";\n}\n\nfunction _toString(value: any) {\n    if (isString(value)) {\n        return value;\n    }\n\n    if (isSymbol(value)) {\n        return value.toString();\n    }\n\n    if (isFunction(value[\"toString\"])) {\n        return (value[\"toString\"] as any)() || \"\";\n    }\n\n    return \"\";\n}\n\nexport function getTargetKeys(target: any, excludedKeys: string[], includeFunctions: boolean) {\n    let keys: string[] = objKeys(target);\n\n    if (!isArray(target)) {\n        try {\n            if (Object[strGetOwnPropertyNames]) {\n                // We need to use this for built in objects such as Error which don't return their values via objKeys because they are not enumerable for example\n                let propKeys = Object[strGetOwnPropertyNames](target);\n                if (propKeys) {\n                    arrForEach(propKeys, (key) => {\n                        const theKey = _toString(key);\n                        if (theKey && keys.indexOf(theKey) === -1) {\n                            keys.push(key);\n                        }\n                    });\n                }\n            }\n        } catch (ex) {\n            // getOwnPropertyNames can fail in ES5, if the argument to this method is not an object (a primitive),\n            // then it will cause a TypeError. In ES2015, a non-object argument will be coerced to an object.\n        }\n    }\n\n    let theKeys: string[] = [];\n    arrForEach(keys, (key) => {\n\n        if (!includeFunctions && isFunction(target[key])) {\n            return;\n        }\n\n        const theKey = _toString(key);\n        if (theKey && excludedKeys.indexOf(theKey) === -1) {\n            theKeys.push(theKey);\n        }\n    });\n\n    return theKeys;\n}\n\nexport function formatLogElements(target: Object, tmLabel: string, key: string, level: number, textFilter: string, excludeKeys: string[], thingsReferenced?: any[], includeFunctions?:boolean): any {\n    let openState = false;\n    if (!level) {\n        level = 0;\n    }\n\n    if (!thingsReferenced) {\n        thingsReferenced = [];\n    }\n\n    let isObj = isObject(target) || isError(target);\n    let isErr = target && target[\"baseType\"] && target[\"baseType\"] === \"ExceptionData\" || isError(target);\n\n    const children: HTMLElement[] = [];\n\n    function _openNode(currentLine: HTMLElement) {\n        openState = true;\n        arrForEach(children, (child) => {\n            rootDiv.appendChild(child);\n        });\n\n        currentLine.className = \"obj-key expandable open\"\n    }\n\n    function _collapseNode(currentLine: HTMLElement) {\n        // rootDiv.innerHTML = '';\n        arrForEach(children, (child) => {\n            rootDiv.removeChild(child);\n        });\n        // rootDiv.appendChild(currentLine);\n        openState = false;\n        currentLine.className = \"obj-key expandable closed\"\n    }\n\n    let matched: boolean;\n    // Always displayed opened if there is no filter\n    let childOpened = textFilter ? false : true;\n    const keys = getTargetKeys(target, excludeKeys, includeFunctions as boolean);\n    if (keys.length === 0) {\n        keys.push(\"<empty>\");\n    }\n    if (level >= MAX_DEPTH) {\n        keys.unshift(\"<maxdepth>\");\n    }\n    for (const key of keys) {\n        if (excludeKeys.indexOf(key) !== -1) {\n            continue;\n        }\n\n        let targetValue = target[key];\n        if (isSymbol(targetValue)) {\n            targetValue = targetValue.toString();\n        }\n\n        if (key === \"<maxdepth>\") {\n            const builder = document.createElement(\"div\");\n            builder.className = \"empty\";\n            builder.innerText = \"<max allowed depth reached>\";\n            children.push(builder);\n            break;\n        } else if (key === \"<empty>\") {\n            const builder = document.createElement(\"div\");\n            builder.className = \"empty\";\n            builder.innerText = \"<empty>\";\n            children.push(builder);\n        } else if (targetValue !== null && arrIndexOf(thingsReferenced, targetValue) !== -1) {\n            const builder = document.createElement(\"div\");\n            builder.className = \"empty\";\n            builder.innerText = `<circular (${key}) - \"${getTargetName(targetValue)}\">`;\n            children.push(builder);\n        } else if (targetValue !== null && (isObject(targetValue) || isError(targetValue))) {\n            thingsReferenced.push(target);\n            let formatted = formatLogElements(targetValue, \"\", key, level + 1, textFilter, excludeKeys, thingsReferenced, includeFunctions);\n            thingsReferenced.pop();\n\n            // Always displayed opened if there is no filter\n            if (!textFilter || formatted.matched) {\n                childOpened = true;\n            }\n\n            if (formatted.isErr) {\n                isErr = true;\n            }\n\n            children.push(formatted.root);\n        } else {\n            const builder = document.createElement(\"div\");\n            builder.setAttribute(\"tabindex\", \"0\");\n            builder.onclick = (evt: MouseEvent) => {\n                evt.stopPropagation();\n            }\n            builder.ontouchend = (evt: TouchEvent) => {\n                evt.stopPropagation();\n            }\n            builder.onkeydown = (evt: KeyboardEvent) => {\n                evt.stopPropagation();\n                _navHandler(evt);\n            }\n            builder.onfocus = (evt: Event) => {\n                focusHandler(evt, target, level, excludeKeys, includeFunctions as boolean);\n            }\n\n            const outerSpan = document.createElement(\"span\");\n            const keySpan = document.createElement(\"span\");\n            keySpan.className = \"key\";\n            if (_setInnerText(keySpan, `${key}: `, textFilter)) {\n                childOpened = true;\n            }\n\n            outerSpan.appendChild(keySpan);\n\n            const valueSpan = document.createElement(\"span\");\n            if (isFunction(targetValue)) {\n                const fnStr = targetValue.toString();\n                const fnHead = fnStr.match(/^([^{]+)/)[1];\n                valueSpan.textContent = `${fnHead}{...}`;\n            } else {\n                if (_setInnerText(valueSpan, `${targetValue}`, textFilter)) {\n                    childOpened = true;\n                }\n            }\n            valueSpan.className = `${typeof targetValue}`;\n            outerSpan.appendChild(valueSpan);\n            builder.appendChild(outerSpan);\n            children.push(builder);\n        }\n    }\n\n    const rootDiv = document.createElement(\"div\");\n\n    let innerText = \"\";\n    let currentLine = document.createElement(\"span\");\n    if (isObj || children.length) {\n        innerText = `${key ? key : \"obj\"}: `;\n        if (isArray(target)) {\n            innerText += `[${getTargetKeys(target, excludeKeys, includeFunctions as boolean).length}]`;\n        } else {\n            let targetName = getTargetName(target);\n            if (targetName) {\n                innerText += ` <\"${targetName}\"> `\n            }\n            innerText += `{${getTargetKeys(target, excludeKeys, includeFunctions as boolean).length}}`;\n        }\n\n        matched = _setInnerText(currentLine, innerText, textFilter);\n\n        if (tmLabel) {\n            const tmWrapper = document.createElement(\"span\");\n            const tmDetails = document.createElement(\"span\");\n            tmDetails.className = \"obj-time\";\n            tmDetails.innerText = tmLabel;\n            tmWrapper.appendChild(tmDetails);\n            tmWrapper.appendChild(currentLine);\n\n            currentLine = tmWrapper;\n        }\n\n        currentLine.className = \"obj-key expandable closed\"\n    } else {\n        innerText = `${key ? key : \"obj\"}: ${target.toString()}`;\n        matched = _setInnerText(currentLine, innerText, textFilter);\n\n        currentLine.className = \"obj-key\";\n    }\n\n    rootDiv.appendChild(currentLine);\n    rootDiv.setAttribute(\"tabindex\", \"0\");\n\n    if (childOpened) {\n        // A child node matched so auto-expand\n        _openNode(currentLine);\n    }\n    if (isObj) {\n        if (isErr) {\n            rootDiv.className = \"exception\"\n        }\n        const openHandler = (evt: Event, forceState?: boolean) => {\n            evt.stopPropagation();\n            if (getIEVersion()) {\n                focusHandler(evt, target, level, excludeKeys, includeFunctions as boolean);\n            }\n            if (forceState !== undefined && openState === forceState) {\n                return;\n            }\n            if (lastSelectedElement === rootDiv) {\n                if (openState) {\n                    _collapseNode(currentLine);\n                } else {\n                    _openNode(currentLine);\n                }\n            }\n        }\n\n        rootDiv.onkeydown = (evt: KeyboardEvent) => {\n            _navHandler(evt, openHandler, openState);\n        }\n        rootDiv.onclick = (evt: MouseEvent) => {\n            openHandler(evt);\n        }\n        rootDiv.ontouchend = (evt: TouchEvent) => {\n            openHandler(evt);\n        }\n        rootDiv.onfocus = (evt: Event) => {\n            focusHandler(evt, target, level, excludeKeys, includeFunctions as boolean);\n        }\n    }\n\n    return {\n        root: rootDiv,\n        isErr: isErr,\n        matched: matched || childOpened\n    };\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/interfaces/IMessage.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IDataEvent } from \"../dataSources/IDataEvent\";\nimport { MessageSource, MessageType } from \"../Enums\";\n\nexport interface IMessage {\n    id: MessageType,\n    src: MessageSource;\n    tabId?: number,\n    details: IDataEvent\n}"
  },
  {
    "path": "tools/chrome-debug-extension/src/pageHelper.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {\n    IDbgExtension, INotificationListener, IPerfEvent, ITelemetryItem, arrForEach, objKeys, toISOString\n} from \"@microsoft/applicationinsights-core-js\";\nimport { MessageSource, MessageType } from \"./Enums\";\nimport { IMessage } from \"./interfaces/IMessage\";\n\nconst theNamespace = [ \"Microsoft\", \"ApplicationInsights\", \"ChromeDbgExt\" ];\nlet isEnabled = false;\n\nconst excludeKeys = [\n    \"_dynInstFuncs\",\n    \"_getTelCtx\",\n    \"_baseTelInit\",\n    \"diagLog\",\n    \"isInitialized\",\n    \"setInitialized\",\n    \"setNextPlugin\",\n    \"processNext\"\n];\n\nfunction _normalizeEventDetails(object: any) {\n    function _copyWithoutCircularReferences(references: any, object: any) {\n        var cleanObject = {};\n        arrForEach(objKeys(object), (key) => {\n            if (excludeKeys.indexOf(key) === -1) {\n                var value = object[key];\n                if (value && typeof value === \"object\") {\n                    if (references.indexOf(value) < 0) {\n                        references.push(value);\n                        cleanObject[key] = _copyWithoutCircularReferences(references, value);\n                        references.pop();\n                    } else {\n                        cleanObject[key] = \"###_Circular_###\";\n                    }\n                } else if (typeof value !== \"function\") {\n                    cleanObject[key] = value;\n                }\n            }\n        });\n        return cleanObject;\n    }\n\n    if (object && typeof object === \"object\") {\n        object = _copyWithoutCircularReferences([object], object);\n    }\n\n    return object;\n}\n\nfunction _sendMessage(type: MessageType, msgSource: MessageSource, name: string, data: any) {\n    if (isEnabled) {\n        let msg: IMessage = {\n            id: type,\n            src: msgSource,\n            details: {\n                name,\n                time: toISOString(new Date()),\n                data\n            }\n        };\n\n        window.postMessage(_normalizeEventDetails(msg), \"*\");\n    }\n}\n\nlet _notificationListener: INotificationListener = {\n    /**\n     * [Optional] A function called when events are sent.\n     * @param events - The array of events that have been sent.\n     */\n    eventsSent: (theEvents: ITelemetryItem[]) => {\n        _sendMessage(MessageType.Notification, MessageSource.EventSentNotification, \"Notification:eventsSent\", theEvents);\n    },\n    /**\n     * [Optional] A function called when events are discarded.\n     * @param events - The array of events that have been discarded.\n     * @param reason - The reason for discarding the events. The EventsDiscardedReason\n     * constant should be used to check the different values.\n     * @param sendType - [Optional] The send type used when the events were discarded.\n     */\n    eventsDiscarded: (events: ITelemetryItem[], reason: number, sendType?: number) => {\n        _sendMessage(MessageType.Notification, MessageSource.EventsDiscardedNotification, \"Notification:eventsDiscarded\", {\n            reason,\n            events,\n            sendType\n        });\n    },\n\n    /**\n     * [Optional] A function called when the events have been requested to be sent to the sever.\n     * @param sendReason - The reason why the event batch is being sent.\n     * @param isAsync - A flag which identifies whether the requests are being sent in an async or sync manner.\n     */\n    eventsSendRequest: (sendReason: number, isAsync?: boolean) => {\n        _sendMessage(MessageType.Notification, MessageSource.EventsSendNotification, \"Notification:eventsSendRequest\", {\n            sendReason,\n            isAsync\n        });\n    },\n    /**\n     * [Optional] This event is sent if you have enabled perf events, they are primarily used to track internal performance testing and debugging\n     * the event can be displayed via the debug plugin extension.\n     * @param perfEvent\n     */\n    perfEvent: (perfEvent: IPerfEvent) => {\n        let evtName = `Notification:perfEvent[${perfEvent.name}]`;\n        _sendMessage(MessageType.Notification, MessageSource.PerfEvent, evtName, perfEvent);\n    }\n};\n\nfunction _sendEvent(name: string, data: any) {\n    _sendMessage(MessageType.GenericEvent, MessageSource.GenericEvent, name, data);\n}\n\nfunction _debugMsg(name: string, data: any) {\n    _sendMessage(MessageType.DebugEvent, MessageSource.DebugEvent, \"debug:\" + name, data);\n}\n\nfunction _diagLog(name: string, data: any) {\n    _sendMessage(MessageType.DiagnosticLog, MessageSource.DiagnosticLog, \"diagLog:\" + name, data);\n}\n\n/**\n * This function is auto injected into the runtime of the executing page\n */\n(() => {\n\n    let target = window;\n    for (let lp = 0; lp < theNamespace.length-1; lp++) {\n        target = target[theNamespace[lp]] = target[theNamespace[lp]] || {};\n    }\n    let extName = theNamespace[theNamespace.length - 1];\n\n    if (!target[extName]) {\n        let debugExt: IDbgExtension = {\n            isEnabled: () => {\n                return isEnabled;\n            },\n            enable: () => {\n                isEnabled = true;\n            },\n            disable: () => {\n                isEnabled = false;\n                // self remove\n                delete target[extName];\n            },\n            // INotificationListener implementation\n            listener: _notificationListener,\n            sendEvt: _sendEvent,\n            debugMsg: _debugMsg,\n            diagLog: _diagLog\n        };\n        target[extName] = debugExt;\n        debugExt.enable();\n    }\n})();\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/popup.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { TelemetryViewerPopup } from \"./telemetryViewerPopup\";\n\nReactDOM.render(<TelemetryViewerPopup />, document.getElementById(\"root\") as HTMLElement);\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/session.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport FileSaver from \"file-saver\";\nimport _ from \"lodash\";\nimport { MessageSource } from \"./Enums\";\nimport { LogEntry } from \"./LogEntry\";\nimport { IFilterSettings } from \"./components/IFilterSettings\";\nimport { IConfiguration, ISpecialFieldNames } from \"./configuration/IConfiguration\";\nimport { DataEventType, IDataEvent } from \"./dataSources/IDataEvent\";\nimport { IDataSource } from \"./dataSources/IDataSource\";\nimport {\n    ICounts, getCondensedDetails, getDynamicFieldValue, getEventType, getFieldValueAsString, getSessionId\n} from \"./dataSources/dataHelpers\";\nimport { createDataSource } from \"./dataSources/dataSources\";\nimport { makeRegex } from \"./helpers\";\nimport { IMessage } from \"./interfaces/IMessage\";\n\nexport class Session {\n    public onFilteredDataChanged: undefined | ((filterSettings: IFilterSettings) => void);\n\n    private _dataSource: IDataSource;\n    private _filteredData: IDataEvent[];\n    private _rawData: IDataEvent[] = [];\n    private _filterSettings: IFilterSettings;\n    private _listenerSubscriptionId: number;\n    private _sessionMap = new Map<string, number>();\n    private _nextSessionNumber = 0;\n    private _counts: ICounts = {\n        all: 0,\n        appLogic: 0,\n        performance: 0,\n        warning: 0,\n        fatalError: 0\n    };\n\n    public get filteredData(): IDataEvent[] {\n        return this._filteredData;\n    }\n\n    public set filterSettings(newFilterSettings: IFilterSettings) {\n        this._filterSettings = newFilterSettings;\n        this.recalculateFilteredData();\n    }\n\n    public get counts(): ICounts {\n        return this._counts;\n    }\n\n    constructor(public configuration: IConfiguration, prevSession?: Session) {\n        this._dataSource = createDataSource(this.configuration);\n        if (prevSession) {\n            this._rawData = this._getSaveRawData(prevSession._rawData) || [];\n            this.recalculateFilteredData();\n        }\n\n        this._dataSource.startListening();\n        this._listenerSubscriptionId = this._dataSource.addListener(this.onNewDataEvent);\n    }\n\n    public clear(): void {\n        this._sessionMap.clear();\n        this._nextSessionNumber = 0;\n        this._rawData = [];\n        this.recalculateFilteredData();\n    }\n\n    public save(): void {\n        const blob = new Blob([JSON.stringify(this._getSaveRawData(this._rawData))], { type: \"application/json;charset=utf-8\" });\n        const now = new Date();\n        const dateString = `${now.getFullYear().toString()}-${now.getMonth().toString().padStart(2, \"0\")}-${now\n            .getDay()\n            .toString()\n            .padStart(2, \"0\")}`;\n        const timeString = `${now.getHours().toString().padStart(2, \"0\")}.${now\n            .getMinutes()\n            .toString()\n            .padStart(2, \"0\")}.${now.getSeconds().toString().padStart(2, \"0\")}.${now\n            .getMilliseconds()\n            .toString()\n            .padStart(3, \"0\")}`;\n        const fileName = `Telemetry capture ${dateString} ${timeString}.json`;\n        FileSaver.saveAs(blob, fileName);\n    }\n\n    public load(saveData: string): boolean {\n        try {\n            const parsedData = JSON.parse(saveData);\n\n            if (Array.isArray(parsedData)) {\n                this._rawData = parsedData;\n\n                // Repopulate sessionMap with the sessionNumbers already calculated in the stored data\n                for (const singleEvent of this._rawData) {\n                    // Remove any previous saved / cached condensedDetails\n                    delete singleEvent.condensedDetails;\n                    const sessionNo = singleEvent.sessionNumber;\n                    if (sessionNo) {\n                        const sessionNumber = Number.parseInt(sessionNo, 10);\n                        const sessionId = getSessionId(singleEvent, this.configuration);\n                        if (sessionId && !isNaN(sessionNumber)) {\n                            this._sessionMap.set(sessionId, sessionNumber);\n                            if (sessionNumber >= this._nextSessionNumber) {\n                                this._nextSessionNumber = sessionNumber + 1;\n                            }\n                        }\n                    }\n                }\n\n                this.recalculateFilteredData();\n\n                return true;\n            }\n\n            return false;\n        } catch {\n            return false;\n        }\n    }\n\n    public dispose(): void {\n        this._dataSource.removeListener(this._listenerSubscriptionId);\n        this._dataSource.stopListening();\n    }\n\n    private _getSaveRawData(prevData: IDataEvent[]) {\n        try {\n            let saveData = JSON.parse(JSON.stringify(prevData));\n\n            if (Array.isArray(saveData)) {\n\n                // Repopulate sessionMap with the sessionNumbers already calculated in the stored data\n                for (const singleEvent of saveData) {\n                    // Remove content we don't want to save\n                    delete singleEvent.condensedDetails;\n                }\n            } else if (saveData) {\n                delete saveData.condensedDetails;\n            }\n\n            return saveData;\n        } catch(e) {\n            // ignore\n        }\n\n        return prevData || [];\n    }\n\n    private recalculateFilteredData(): void {\n        const newCounts: ICounts = {\n            all: 0,\n            appLogic: 0,\n            performance: 0,\n            warning: 0,\n            fatalError: 0\n        };\n\n        const incrementCounts = (dataEventType?: DataEventType) => {\n            newCounts.all++;\n            switch (dataEventType) {\n            case \"appLogic\":\n                newCounts.appLogic++;\n                break;\n            case \"performance\":\n                newCounts.performance++;\n                break;\n            case \"warning\":\n                newCounts.warning++;\n                break;\n            case \"fatalError\":\n                newCounts.fatalError++;\n                break;\n            }\n        };\n\n        const filterText: string | undefined =\n            this._filterSettings && this._filterSettings.filterText && this._filterSettings.filterText.length > 0\n                ? this._filterSettings.filterText\n                : undefined;\n        const resultsFiltered: boolean = this._filterSettings &&\n            (filterText !== undefined || this._filterSettings.filterByType !== undefined);\n        const newFilteredData: IDataEvent[] = resultsFiltered ? [] : this._rawData.slice();\n\n        // tslint:disable-next-line:no-any\n        this._rawData.forEach((singleDataEvent: IDataEvent): void => {\n            if (resultsFiltered) {\n                const filterByTextAllowsIt = this.filterTextAllowsIt(singleDataEvent, filterText);\n                const filterByTypeAllowsIt: boolean = this._filterSettings.filterByType\n                    ? singleDataEvent.type === this._filterSettings.filterByType\n                    : true;\n\n                // Counts should only be filtered by text, not event type\n                if (filterByTextAllowsIt) {\n                    incrementCounts(singleDataEvent.type);\n                }\n\n                // Final results should be filtered by both text and event type\n                if (filterByTypeAllowsIt && filterByTextAllowsIt) {\n                    newFilteredData.push(singleDataEvent);\n                }\n            } else {\n                incrementCounts(singleDataEvent.type);\n            }\n        });\n\n        // Save the results\n        this._counts = newCounts;\n        this._filteredData = newFilteredData;\n\n        // Notify the listener if there is one\n        this.onFilteredDataChanged && this.onFilteredDataChanged(this._filterSettings);\n    }\n\n    private filterTextAllowsIt(singleDataEvent: IDataEvent, filterText: string | undefined): boolean {\n        if (!filterText) {\n            return true;\n        }\n\n        let lowerFilterText = filterText.toLowerCase();\n        let regEx: RegExp|null = null;\n        if (filterText?.indexOf(\"*\") !== -1) {\n            regEx = makeRegex(filterText, false);\n        }\n\n        for (const columnToDisplay of this.configuration.columnsToDisplay) {\n            const value = getDynamicFieldValue(singleDataEvent, columnToDisplay.prioritizedFieldNames);\n            if (value) {\n                switch (columnToDisplay.type) {\n                case \"SessionNumber\":\n                case \"NumberDelta\":\n                case \"TimeDelta\":\n                    break;\n                default:\n                    if (regEx) {\n                        if (regEx.exec(value) != null) {\n                            return true;\n                        }\n                    } else if (value.toLowerCase().includes(lowerFilterText)) {\n                        return true;\n                    }\n                }\n            }\n        }\n\n        if (this._filterSettings.filterContent) {\n            let excludeKeys: string[] = [];\n            let logEntry = singleDataEvent.logEntry = singleDataEvent.logEntry || new LogEntry(singleDataEvent.data, 0);\n            if (logEntry.isMatch(filterText, excludeKeys, true)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    private onNewDataEvent = (message: IMessage): void => {\n        let dataEvent = message.details;\n\n        switch (message.src) {\n        case MessageSource.WebRequest:\n            if (!this._filterSettings.listenNetwork) {\n                // Stop logging web requests\n                return;\n            }\n            break;\n            \n        case MessageSource.DebugEvent:\n        case MessageSource.EventSentNotification:\n        case MessageSource.EventsDiscardedNotification:\n        case MessageSource.EventsSendNotification:\n        case MessageSource.DiagnosticLog:\n        case MessageSource.PerfEvent:\n            if (!this._filterSettings.listenSdk) {\n                // Stop logging SDK requests\n                return ;\n            }\n            break;\n        }\n\n        // If the configuration specifies a required field, check to see if it is present\n        if (this.configuration.ignoreEventsWithoutThisField) {\n            const requiredValue = getFieldValueAsString(\n                dataEvent.data,\n                this.configuration.ignoreEventsWithoutThisField\n            );\n            if (requiredValue === undefined) {\n                return;\n            }\n        }\n\n        // Annotate the new event\n        dataEvent.condensedDetails = getCondensedDetails(dataEvent, this.configuration);\n        dataEvent.sessionNumber = dataEvent.sessionNumber || this.getSessionNumber(dataEvent);\n        dataEvent.type = dataEvent.type || getEventType(dataEvent, this.configuration);\n        dataEvent.tabId = dataEvent.tabId || message.tabId;\n\n        let specialFieldNames: ISpecialFieldNames = (this.configuration.specialFieldNames || {});\n\n        // Parse any JSON fields and replace them with the parsed object\n        if (specialFieldNames.jsonFieldNames) {\n            for (const jsonFieldName of specialFieldNames.jsonFieldNames) {\n                const stringValue = getFieldValueAsString(dataEvent.data, jsonFieldName);\n                if (stringValue !== undefined) {\n                    try {\n                        const objectValue = JSON.parse(stringValue);\n                        _.set(dataEvent, jsonFieldName, objectValue);\n                    } catch {\n                        // That's OK, best effort\n                    }\n                }\n            }\n        }\n\n        // Add it to the raw list in time order\n        this._rawData.push(dataEvent);\n        this._rawData.sort((a: IDataEvent, b: IDataEvent) => Date.parse(a.time) - Date.parse(b.time));\n\n        // Reapply filter (if any)\n        this.recalculateFilteredData();\n    };\n\n    private getSessionNumber = (dataEvent: IDataEvent): string => {\n        const sessionId = getSessionId(dataEvent, this.configuration);\n\n        if (sessionId && sessionId !== \"mis\") {\n            let sessionNumber = this._sessionMap.get(sessionId);\n            if (sessionNumber === undefined) {\n                sessionNumber = this._nextSessionNumber++;\n                this._sessionMap.set(sessionId, sessionNumber);\n            }\n            return sessionNumber.toLocaleString();\n        }\n\n        return \"?\";\n    };\n}\n"
  },
  {
    "path": "tools/chrome-debug-extension/src/telemetryViewerPopup.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport * as React from \"react\";\nimport { ConfigurationSelection, customConfigurationStorageKey } from \"./components/configurationSelection\";\nimport { TelemetryViewer } from \"./components/telemetryViewer\";\nimport { getConfiguration } from \"./configuration/configuration\";\nimport { ConfigurationType, ConfigurationURLs } from \"./configuration/Configuration.types\";\nimport { IConfiguration } from \"./configuration/IConfiguration\";\nimport { Session } from \"./session\";\nimport { checkForUpdate } from \"./UpdateCheck\";\nimport { doAwait } from \"@nevware21/ts-async\";\n\ntype AppPhase =\n    | \"Startup\"\n    | \"ShowConfigurationSelection\"\n    | \"LoadingConfiguration\"\n    | \"ConfigurationLoaded\"\n    | \"ConfigurationLoadFailed\";\n\nconst configurationTypeStorageKey = \"configurationType\";\nconst defaultVersion = \"#version#\";\n\nexport const TelemetryViewerPopup = (): React.ReactElement => {\n    const [appPhase, setAppPhase] = React.useState<AppPhase>(\"Startup\");\n    const [session, setSession] = React.useState<Session | undefined>(undefined);\n    const [configurationType, setConfigurationType] = React.useState<ConfigurationType>(undefined);\n    let newAvailableVersion: string;\n    // let newVersionDownload: string;\n\n    function applyConfigurationType(newConfigurationType: ConfigurationType): void {\n        if (newConfigurationType) {\n            chrome.storage.local.set({ [configurationTypeStorageKey]: newConfigurationType });\n        }\n        setConfigurationType(newConfigurationType);\n\n        if (newConfigurationType) {\n            loadConfiguration(newConfigurationType);\n        } else {\n            setAppPhase(\"ShowConfigurationSelection\");\n        }\n    }\n\n    function loadConfiguration(configurationTypeToLoad: ConfigurationType): void {\n        setAppPhase(\"LoadingConfiguration\");\n\n        if (configurationTypeToLoad === \"Custom\") {\n            try {\n                doAwait(chrome.storage.local.get([customConfigurationStorageKey]), (savedValue: any) => {\n                    if (savedValue) {\n                        const newConfiguration = JSON.parse(savedValue[customConfigurationStorageKey]) as IConfiguration;\n                        let newSession = new Session(newConfiguration, session);\n                        session && session.dispose();\n                        setSession(newSession);\n                        setAppPhase(\"ConfigurationLoaded\");\n                    } else {\n                        setAppPhase(\"ConfigurationLoadFailed\");\n                    }\n                });\n                \n            } catch {\n                setAppPhase(\"ConfigurationLoadFailed\");\n            }\n        } else {\n            getConfiguration(configurationTypeToLoad)\n                .then((newConfiguration: IConfiguration) => {\n                    if (newConfiguration) {\n                        let newSession = new Session(newConfiguration, session);\n                        session && session.dispose();\n                        setSession(newSession);\n                        setAppPhase(\"ConfigurationLoaded\");\n                    } else {\n                        setAppPhase(\"ConfigurationLoadFailed\");\n                    }\n                })\n                .catch(() => {\n                    setAppPhase(\"ConfigurationLoadFailed\");\n                });\n        }\n    }\n\n    function highlightNewVersion() {\n        let orgTitle = document.title;\n        let count = 0;\n        let interval = setInterval(() => {\n            count ++;\n            if ((count % 2) == 0) {\n                document.title = orgTitle;\n            } else {\n                document.title = orgTitle + \" *** v\" + encodeURIComponent(newAvailableVersion) + \" Available ***\"\n            }\n            if (count > 10) {\n                clearInterval(interval);\n            }\n        }, 1500);\n    }\n\n    function versionCheck() {\n        let manifestVersion = defaultVersion;\n        if (chrome && chrome.runtime) {\n            let manifest = chrome.runtime.getManifest();\n            manifestVersion = manifest.version_name || manifest.version || \"\";\n        }\n\n        if (manifestVersion) {\n            let newTitle = \"Telemetry Viewer - v\" + encodeURIComponent(manifestVersion);\n            document.title = newTitle;\n            checkForUpdate((newVersion, details) => {\n                newAvailableVersion = newVersion;\n                // newVersionDownload = details;\n                highlightNewVersion();\n            }, manifestVersion);\n        }\n    }\n\n    React.useEffect(() => {\n        versionCheck();\n\n        let configurationTypeToSet: ConfigurationType = undefined;\n        try {\n            doAwait(chrome.storage.local.get([configurationTypeStorageKey]), (savedValue: any) => {\n                if (savedValue && Object.keys(ConfigurationURLs).includes(savedValue)) {\n                    configurationTypeToSet = savedValue[configurationTypeStorageKey] as ConfigurationType;\n                }\n                setConfigurationType(configurationTypeToSet);\n                applyConfigurationType(configurationTypeToSet);\n\n                return () => {\n                    session && session.dispose();\n                };\n            });\n\n        } catch {\n            // That's OK\n        }\n    }, []);\n\n    function reset(): void {\n        setAppPhase(\"ShowConfigurationSelection\");\n    }\n\n    function showConfigurationSelection(): void {\n        setAppPhase(\"ShowConfigurationSelection\");\n    }\n\n    function handleConfigurationSelectionCancel(): void {\n        if (session) {\n            setAppPhase(\"ConfigurationLoaded\");\n        } else {\n            setAppPhase(\"ShowConfigurationSelection\");\n        }\n    }\n\n    switch (appPhase) {\n    case \"ShowConfigurationSelection\":\n        return (\n            <ConfigurationSelection\n                configurationType={configurationType}\n                onConfigurationSaved={applyConfigurationType}\n                onCancel={handleConfigurationSelectionCancel}\n            />\n        );\n    case \"LoadingConfiguration\":\n        return <div className='loadingConfiguration'>Loading Configuration...</div>;\n    case \"ConfigurationLoadFailed\":\n        return (\n            <div className='loadingConfigurationFailed'>\n                <div className='loadingConfigurationFailedHeader'>The configuration could not be loaded</div>\n                <div>\n                    <a href='#' onClick={() => loadConfiguration(configurationType)}>\n                            Retry\n                    </a>\n                </div>\n                <div>\n                    <a href='#' onClick={reset}>\n                            Choose a different configuration\n                    </a>\n                </div>\n            </div>\n        );\n    case \"ConfigurationLoaded\":\n        {\n            if (session !== undefined) {\n                return (\n                    <TelemetryViewer session={session} onShowConfigurationSelection={showConfigurationSelection} />\n                );\n            } else {\n                reset();\n            }\n        }\n        break;\n    }\n\n    return <div></div>;\n};\n"
  },
  {
    "path": "tools/chrome-debug-extension/styles/popup.css",
    "content": "body {\n    font-family: system-ui, sans-serif;\n    font-size: 75%;\n    margin: 0px;\n}\n\n.rootDiv {\n    height: 100vh;\n    display: flex;\n    flex-flow: column;\n    overflow: hidden;\n}\n\n.headerDiv {\n    flex: 0 1 auto;\n}\n\n.contentDiv {\n    flex: 1 1 auto;\n    overflow: hidden;\n}\n\n.splitPanelRootContainer {\n    height: 100%;\n}\n\n.splitPanelTopContainer {\n    resize: vertical;\n    overflow: hidden;\n    border-bottom: 1px solid #cccccc;\n}\n\n.splitPanelBottomContainer {\n    overflow: hidden;\n}\n\n.scrollable {\n    overflow: auto;\n    height: 100%;\n}\n\n.inputBox {\n    border: 1px solid transparent;\n    margin: 3px;\n    padding: 2px;\n}\n\n.inputBox:hover {\n    border: 1px solid #e0e0e0;\n}\n\n.inputBox:active,\n.inputBox:focus {\n    outline: none;\n    border: 1px solid #1a73e8;\n}\n\n.rootDiv button {\n    background: transparent;\n    border: none;\n    outline: none;\n    cursor: pointer;\n}\n\n.rootDiv button:hover {\n    background: #dbdbdb;\n    border: none;\n    outline: none;\n}\n\n.rootDiv button:active {\n    background: #e0e0e0;\n    border: none;\n    outline: none;\n}\n\n.optionsBarDiv {\n    background: #f7f7f7;\n    display: flex;\n    flex-wrap: wrap;\n}\n\n.verticallyCenteredFlexItem {\n    display: flex;\n    align-self: center;\n}\n\n.eventTypeCounterDiv {\n    cursor: pointer;\n    margin: 0px 5px;\n    padding: 2px 1px 3px 6px;\n}\n\n.eventTypeCounterCountDiv {\n    margin: 0px 5px 0px 5px;\n    align-items: center;\n    display: flex;\n}\n\ntable.eventTable {\n    width: 100%;\n    text-align: left;\n    border-collapse: separate;\n    border-spacing: 0px;\n}\n\ntable.eventTable td,\ntable.eventTable th {\n    padding: 2px 5px;\n    white-space: nowrap;\n}\n\ntable.eventTable tr:nth-child(even) {\n    background: #f5f5f5;\n}\ntable.eventTable thead {\n    background: #f7f7f7;\n    position: sticky;\n    top: 0px;\n}\n\ntable.eventTable thead th {\n    color: #000000;\n    border-style: solid;\n    border-color: #cdcdcd;\n    border-width: 0px 0px 1px 1px;\n    text-align: left;\n    padding: 5px;\n    font-weight: normal;\n}\n\ntable.eventTable tr {\n    border-style: solid;\n    border-color: #cdcdcd;\n    border-width: 0px 1px 1px 1px;\n}\n\ntable.eventTable tr:hover td {\n    background-color: #f1f6fd;\n    cursor: pointer;\n}\n\ntable.eventTable tr.selected td {\n    background-color: #d6d6d6;\n}\n\ntable.eventTable tr td span.matched-text-filter {\n    background-color: yellow;\n}\n\n.newSessionRow {\n    border-top: 1px solid red;\n}\n\n.eventDetailsDiv {\n    font-size: 10pt;\n    overflow-x: \"scroll\";\n}\n\n.typeIcon {\n    vertical-align: middle;\n}\n\n.eventTypeFilterContainer {\n    display: flex;\n}\n\n.eventTypeFilterInputContainer {\n    display: flex;\n    position: relative;\n}\n\n.eventTypeFilterInput {\n    opacity: 0;\n    position: absolute;\n    top: 0;\n    left: 0;\n    height: 100%;\n    width: 100%;\n    margin: 0;\n    cursor: pointer;\n}\n\n.eventTypeFilterInput:checked + .eventTypeCounterDiv {\n    background: #d6d6d6;\n    border-radius: 7px;\n    border-width: 1px;\n}\n\n.clearButton {\n    margin-left: 20px;\n}\n\n.saveButton {\n    margin-left: 20px;\n}\n\n.condenseDetailsButton {\n    margin-left: 20px;\n}\n\n.listenNetworkButton {\n    margin-left: 10px;\n}\n\n.listenSdkButton {\n    margin-left: 10px;\n}\n\n.filterContentButton {\n    margin-left: 5px;\n}\n\n.captureTypes {\n    margin-left: 10px;\n}\n\n.checkBoxLabel {\n    cursor: pointer;\n}\n\n.dragTarget {\n    position: absolute;\n    top: 0;\n    left: 0;\n    height: 100%;\n    width: 100%;\n    pointer-events: none;\n    background: lightblue;\n    opacity: 0.7;\n    outline: 4px dashed black;\n    outline-offset: -15px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n.dragTargetText {\n    font-weight: 800;\n    font-size: large;\n}\n\n.configurationContainer {\n    display: flex;\n    flex-flow: column;\n    height: 100vh;\n}\n\n.configurationSelectionSection {\n    margin: 10px;\n    display: flex;\n    flex-flow: column;\n    flex: 1;\n}\n\n.updatesSection {\n    margin: 10px;\n}\n\n.configurationHeader {\n    font-size: 14pt;\n}\n\n.configurationSelectionDropdownDiv {\n    margin-top: 10px;\n    display: flex;\n}\n\n.configurationSelectionDropdown {\n    margin-left: 5px;\n}\n\n.configurationSelectionButtonsDiv {\n    margin: 10px;\n}\n\n.configurationSelectionButton {\n    margin: 5px;\n}\n\n.loadingConfiguration {\n    margin-top: 25px;\n    font-size: 14pt;\n    text-align: center;\n}\n\n.loadingConfigurationFailed {\n    margin-top: 25px;\n    text-align: center;\n}\n\n.loadingConfigurationFailedHeader {\n    font-size: 14pt;\n    margin-bottom: 25px;\n}\n\n.customConfigurationDiv {\n    flex: 1 1 auto;\n    display: flex;\n    flex-flow: column;\n}\n\n.customConfigurationTextarea {\n    flex: 1 1 auto;\n    display: flex;\n    flex-flow: column;\n    resize: none;\n}\n\n.disabled {\n    background-color: lightgray;\n}\n\n.configurationSelectionCopyToCustom {\n    margin-left: 10px;\n}\n\n/* Popup window bottom section css - integrate debug plugin dashboard UI */\n.dbg-lgr {\n    width: 90%;\n    min-width: 600px;\n    position: relative;\n    margin: auto;\n    left: 0;\n    right: 0;\n    border: \"1px solid #605E5C\";\n    border-radius: 2px;\n}\n\n.dbg-lgr div:focus {\n    outline: 2px solid black;\n}\n\n.dbg-lgr > div {\n    display: block;\n    position: relative;\n}\n\n.dbg-lgr > div:not(.controls) div {\n    display: block;\n    position: relative;\n    margin-left: 2em;\n/*    width: 100%;*/\n}\n\n.dbg-lgr .expandable {\n    /* cursor: pointer; */\n}\n\n.dbg-lgr > .tree-root div > span {\n    width: 100%;\n    display: block;\n}\n\n.dbg-lgr .exception {\n    background-color: \"#FEF0F1\";\n    color: \"#323130\";\n}\n\n.dbg-lgr .matched-text-filter {\n    background-color: \"yellow\";\n}\n\n.dbg-lgr .expandable.open::before {\n    content: \"- \";\n    font-weight: bold;\n}\n\n.dbg-lgr .expandable.closed::before {\n    content: \"[+] \";\n    font-weight: bold;\n}\n\n.dbg-lgr div:hover > .obj-key {\n    text-decoration: underline;\n}\n\n.dbg-lgr .obj-time {\n    padding-right: 15px;\n    color: #605e5c;\n}\n\n.dbg-lgr .object {\n    pointer-events: auto;\n}\n.dbg-lgr .string {\n    color: #cb3632;\n}\n.dbg-lgr .number {\n    color: #1c00cf;\n}\n.dbg-lgr .key {\n    color: #881391;\n    font-weight: bold;\n}\n.dbg-lgr .function {\n    color: #881391;\n}\n.dbg-lgr .empty {\n    color: #555555;\n    font-style: italic;\n}\n\n.dbg-lgr {\n    width: 100%;\n    min-width: 200px;\n}\n\n.dbg-lgr .matched-text-filter {\n    background-color: yellow;\n}\n\n"
  },
  {
    "path": "tools/chrome-debug-extension/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"module\": \"esnext\",\n        \"target\": \"es2016\",\n        \"lib\": [\n            \"es2017\",\n            \"ES2018.Promise\",\n            \"dom\"\n        ],\n        \"sourceMap\": true,\n        \"jsx\": \"react\",\n        \"moduleResolution\": \"node\",\n        \"forceConsistentCasingInFileNames\": true,\n        \"noImplicitReturns\": true,\n        \"noImplicitThis\": true,\n        \"noImplicitAny\": true,\n        \"importHelpers\": true,\n        \"skipLibCheck\": true,\n        \"strictNullChecks\": true,\n        \"suppressImplicitAnyIndexErrors\": true,\n        \"noUnusedLocals\": true,\n        \"allowSyntheticDefaultImports\": true,\n        \"resolveJsonModule\": true,\n        \"types\": [\n            \"@types/chrome\"\n        ],\n        \"noEmit\": false,\n        \"inlineSourceMap\": false,\n        \"inlineSources\": true,\n        \"allowJs\": false,\n        \"declaration\": true,\n        \"declarationDir\": \"build/types\",\n        \"outDir\": \"dist-es5\",\n        \"rootDir\": \"./src\",\n        \"removeComments\": false\n        },\n    \"exclude\": [\n        \"node_modules\"\n    ]\n}"
  },
  {
    "path": "tools/config/README.md",
    "content": "# 1DS JavaScript Web Config\n\n1DS JavaScript Web Config CDN.\n\n## Current Version\n\nV1\n\n## Endpoints\n\n### Beta\n\nhttps://js.monitor.azure.com/beta/ai.config.1.cfg.json\n\n### Next\n\nhttps://js.monitor.azure.com/next/ai.config.1.cfg.json\n\n### Public\n\nhttps://js.monitor.azure.com/scripts/b/ai.config.1.cfg.json\n\n### Nightly\n\nhttps://js.monitor.azure.com/nightly/ai_test.config.1-nightly3.cfg.json\n\n### **Note**\n\nFor `config.json` changes:\n\n**whenever cfg changes, incoming new undefined fields will NOT replace previous values, so make sure that new configs have each field set as expected.**\n"
  },
  {
    "path": "tools/config/config.json",
    "content": "{\n    \"version\": \"1.0.6\",\n    \"enabled\": true,\n    \"featureOptIn\": {\n        \"iKeyUsage\": {\n            \"mode\": 3,\n            \"onCfg\": { \n                \"throttleMgrCfg.109.disabled\": false,\n                \"throttleMgrCfg.106.disabled\": false\n            },\n            \"offCfg\": { \n                \"throttleMgrCfg.109.disabled\": true,\n                \"throttleMgrCfg.106.disabled\": true\n            }\n        },\n        \"zipPayload\": {\n            \"mode\": 3\n        },\n        \"CdnUsage\": {\n            \"mode\": 4,\n            \"onCfg\": { \n                \"throttleMgrCfg.109.disabled\": false,\n                \"throttleMgrCfg.110.disabled\": false\n            },\n            \"offCfg\": { \n                \"throttleMgrCfg.109.disabled\": true,\n                \"throttleMgrCfg.110.disabled\": true\n            }\n\n        }\n    },\n    \"config\": {\n        \"throttleMgrCfg\": {\n            \"109\": { \n                \"disabled\": false,\n                \"limit\": { \n                    \"samplingRate\": 1,\n                    \"maxSendNumber\": 1\n                },\n                \"interval\": {\n                    \"monthInterval\": 2,\n                    \"daysOfMonth\": [1]\n                }\n            },\n            \"106\": { \n                \"disabled\": false,\n                \"limit\": { \n                    \"samplingRate\": 1,\n                    \"maxSendNumber\": 1\n                },\n                \"interval\": {\n                    \"monthInterval\": 2,\n                    \"daysOfMonth\": [1]\n                }\n            },\n            \"110\": { \n                \"disabled\": false,\n                \"limit\": { \n                    \"samplingRate\": 400000,\n                    \"maxSendNumber\": 1\n                },\n                \"interval\": {\n                    \"dayInterval\": 1\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "tools/config/package.json",
    "content": "{\n    \"name\": \"applicationinsights-web-config\",\n    \"description\": \"Application Insights JavaScript SDK - Web Config for CfgSync Plugin\",\n    \"version\": \"1.1.1\",\n    \"copyright\": \"(c) Microsoft and contributors. All rights reserved.\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/microsoft/ApplicationInsights-JS.git\"\n    },\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:browser && npm run build:test\",\n        \"build:browser\": \"grunt copy-config\",\n        \"build:test\": \"grunt copy-testConfig\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\"\n    },\n    \"license\": \"MIT\",\n    \"bugs\": {\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/issues\"\n    },\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS#readme\"\n}\n"
  },
  {
    "path": "tools/config/scripts/listAzCdnVersions.ps1",
    "content": "param (\n    [string] $container = $null,                        # Identify the container that you want to check blank == all\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $showFiles = $false,                       # Show the individual files with details as well\n    [switch] $activeOnly = $false,                      # Only show the active (deployed) versions\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Container         : $container\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Show Files        : $showFiles\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    # Validate parameters\n    if ([string]::IsNullOrWhiteSpace($container) -ne $true -and \"beta\",\"next\",\"public\", \"dev\", \"nightly\" -NotContains $container) {\n        Write-LogFailure \"[$($container)] is not a valid value, must be beta, next or public\"\n    }\n}\n\nFunction Get-AllVersionFiles(\n    [system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]] $files,\n    [string] $storagePath\n) {\n    Get-VersionFiles $files \"$storagePath\" \"ai.config.\" $null\n}\n\nFunction Get-AllTestVersionFiles(\n    [system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]] $files,\n    [string] $storagePath\n) {\n    Get-VersionFiles $files \"$storagePath\" \"ai_test.config.\" $null\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath, \"listCdnVersionsLog\"\nWrite-LogParams\nValidate-Params\n\n# Don't try and list anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n\n# Get the public files (scripts/b)\nif ([string]::IsNullOrWhiteSpace($container) -eq $true) {\n    Get-AllVersionFiles $files \"scripts/b\"\n    Get-AllVersionFiles $files \"beta\"\n    Get-AllVersionFiles $files \"next\"\n    #Get-AllVersionFiles $files \"dev\"\n    Get-AllTestVersionFiles $files \"dev\"\n    # Get-AllVersionFiles $files \"nightly\"\n    Get-AllTestVersionFiles $files \"nightly\"\n}\n\nif ([string]::IsNullOrWhiteSpace($container) -ne $true) {\n    if ($container -eq \"public\") {\n        Get-AllVersionFiles $files \"scripts/b\"\n    } elseif ($container -eq \"beta\" -or $container -eq \"next\") {\n        Get-AllVersionFiles $files \"$container\"\n    } elseif ($container -eq \"dev\" -or $container -eq \"nightly\") {\n        # Get-AllVersionFiles $files \"$container\"\n        Get-AllTestVersionFiles $files \"$container\"\n    } else {\n        $global:connectDetails.testOnly = $true\n        $global:connectDetails.storeContainer = \"tst\"\n        Get-AllVersionFiles $files \"$container\"\n    }\n}\n\nListVersions $files $activeOnly $showFiles\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "tools/config/scripts/publishAzReleaseToCdn.ps1",
    "content": "param (\n    [string] $releaseFrom = $null,                      # The root path for where to find the files to be released\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $overwrite = $false,                       # Overwrite any existing files   \n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\n$global:cacheValue = $null\n\nFunction Write-LogParams \n{\n    $logDir = Get-LogPath\n\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Overwrite         : $overwrite\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"SourcePath        : $jsSdkDir\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction GetReleaseFiles (\n    [hashtable] $verDetails\n)\n{\n    $version = $verDetails.full\n    Write-Log \"Version   : $($verDetails.full)\"\n    Write-Log \"  Number  : $($verDetails.ver)\"\n    Write-Log \"  Type    : $($verDetails.type)\"\n    Write-Log \"  BldNum  : $($verDetails.bldNum)\"\n\n    # check if the minified dir exists\n    $jsSdkSrcDir = Join-Path $jssdkDir -ChildPath \"browser\\es5\\\";\n\n    if (-Not (Test-Path $jsSdkSrcDir)) {\n        Write-LogWarning \"'$jsSdkSrcDir' directory doesn't exist. Compile JSSDK first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    Write-Log \"Adding files\";\n    AddReleaseFile $files $jsSdkSrcDir \"ai.config.$version.cfg.json\"\n    return $files\n}\n\nFunction GetTestFiles (\n    [hashtable] $verDetails\n)\n{\n    $version = $verDetails.full\n    Write-Log \"Version   : $($verDetails.full)\"\n    Write-Log \"  Number  : $($verDetails.ver)\"\n    Write-Log \"  Type    : $($verDetails.type)\"\n    Write-Log \"  BldNum  : $($verDetails.bldNum)\"\n\n    # check if the minified dir exists\n    $jsSdkSrcDir = Join-Path $jssdkDir -ChildPath \"browser\\es5\\\";\n\n    if (-Not (Test-Path $jsSdkSrcDir)) {\n        Write-LogWarning \"'$jsSdkSrcDir' directory doesn't exist. Compile JSSDK first.\";\n        exit\n    }\n\n    $files = New-Object 'system.collections.generic.dictionary[string,string]'\n\n    Write-Log \"Adding files\";\n    AddReleaseFile $files $jsSdkSrcDir \"ai_test.config.$version.cfg.json\"\n    return $files\n}\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"publishReleaseCdnLog\"\n\n$jsSdkDir = $releaseFrom\nif ([string]::IsNullOrWhiteSpace($jsSdkDir) -eq $true) {\n    $jsSdkDir = Split-Path (Split-Path $MyInvocation.MyCommand.Path) -Parent\n}\n\n$cacheControl1Year = \"public, max-age=31536000, immutable, no-transform\";\n$contentType = \"text/javascript; charset=utf-8\";\n$cacheControl30Min = \"public, max-age=1800, immutable, no-transform\";\n\nWrite-LogParams\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n$version = GetPackageVersion $jsSdkDir\n\n$releaseFiles = GetReleaseFiles $version      # Get the versioned files only\n$testFiles = GetTestFiles $version      # Get the versioned files only\nif ($null -eq $releaseFiles -or $releaseFiles.Count -eq 0) {\n    Write-LogFailure \"Unable to find any release files\"\n}\n\nWrite-Log \"Release Files : $($releaseFiles.Count)\"\nWrite-Log \"----------------------------------------------------------------------\"\n\n# Publish the full versioned files to all release folders\nif ($version.type -eq \"release\") {\n    # Normal publishing deployment\n    PublishFiles $releaseFiles \"beta\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"scripts/b\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"rc\") {\n    PublishFiles $releaseFiles \"beta\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $releaseFiles \"next\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n    # Publish to release type folder folder\n    # PublishFiles $releaseFiles \"$($version.type)\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $testFiles \"$($version.type)\" $cacheControl1Year $contentType $overwrite\n}\nelseif ($version.type -like \"nightly*\") {\n    # Publish to release nightly folder folder\n    # PublishFiles $releaseFiles \"nightly\" $cacheControl1Year $contentType $overwrite\n    PublishFiles $testFiles \"nightly\" $cacheControl1Year $contentType $overwrite\n}\nelse {\n    # Upload to the test container rather than the supplied one\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n    PublishFiles $releaseFiles \"$($version.type)\" $cacheControl1Year $contentType $overwrite\n}\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "tools/config/scripts/setAzActiveCdnVersion.ps1",
    "content": "[CmdletBinding()]\nparam (\n    [string] $container = \"\",                           # The container to update\n    [string] $activeVersion = \"\",                       # The version to copy as the active version\n    [string] $storeContainer = \"cdn\",                   # Identifies the destination storage account container\n    [string] $cdnStorePath = \"cdnstoragename\",          # Identifies the target Azure Storage account (by name)\n    [string] $subscriptionId = $null,                   # Identifies the target Azure Subscription Id (if not encoded in the cdnStorePath)\n    [string] $resourceGroup = $null,                    # Identifies the target Azure Subscription Resource Group (if not encoded in the cdnStorePath)\n    [string] $sasToken = $null,                         # The SAS Token to use rather than using or attempting to login\n    [string] $logPath = $null,                          # The location where logs should be written\n    [switch] $minorOnly = $false,                       # Only set the active minor version (v2.x) and not the major version (v2)\n    [switch] $testOnly = $false,                        # Uploads to a \"tst\" test container on the storage account\n    [switch] $cdn = $false,                             # (No longer used -- kept for now for backward compatibility)\n    [switch] $useConnectedAccount = $false              # Use Entra Id to connect to Azure\n)\n\nImport-Module -Force -Name \"../../../common/publish/Logging\"\nImport-Module -Force -Name \"../../../common/publish/AzStorageHelper\"\n\n[hashtable]$global:connectDetails = @{}\n$global:connectDetails.storeContainer = $storeContainer\n$global:connectDetails.cdnStorePath = $cdnStorePath\n$global:connectDetails.resourceGroup = $resourceGroup\n$global:connectDetails.storeName = $null                              # The endpoint needs to the base name of the endpoint, not the full URL (eg. “my-cdn” rather than “my-cdn.azureedge.net”)\n$global:connectDetails.subscriptionId = $subscriptionId\n$global:connectDetails.sasToken = $sasToken\n$global:connectDetails.storageContext = $null\n$global:connectDetails.testOnly = $testOnly\n$global:connectDetails.useConnectedAccount = $useConnectedAccount\n\nFunction Write-LogParams \n{\n    Write-Log \"Container         : $container\"\n    Write-Log \"Version           : $activeVersion\"\n    Write-Log \"Storage Container : $storeContainer\"\n    Write-Log \"Store Path        : $($global:connectDetails.cdnStorePath)\"\n    Write-Log \"Test Mode         : $testOnly\"\n    Write-Log \"Log Path          : $logDir\"\n    Write-Log \"Use Connected Acct: $useConnectedAccount\"\n\n    if ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n        Write-Log \"Mode      : User-Credentials\"\n    } else {\n        Write-Log \"Mode      : Sas-Token\"\n    }\n}\n\nFunction Validate-Params\n{\n    if ([string]::IsNullOrWhiteSpace($activeVersion) -eq $true) {\n        Write-LogFailure \"The Active version is not specified\"\n        exit\n    }\n\n    $version = Get-VersionDetails $activeVersion\n\n    if ([string]::IsNullOrWhiteSpace($version.type) -eq $true) {\n        Write-LogFailure \"Unknown release type\"\n    }\n\n    $versionParts = $version.ver.Split(\".\")\n    if ($versionParts.Length -ne 3) {\n        Write-LogFailure \"Active Version [$activeVersion] is not a valid version number\"\n    }\n\n    foreach ($verNum in $versionParts) {\n        [int]$value = 0\n        if ([int32]::TryParse($verNum, [ref]$value) -ne $true) {\n            Write-LogFailure \"[$($verNum)] is not a valid number within the version[$activeVersion]\"\n        }\n    }\n\n    # Publish the full versioned files to all release folders\n    if ($version.type -eq \"release\") {\n        # Normal publishing deployment\n        if (\"beta\",\"next\",\"public\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"rc\") {\n        if (\"beta\",\"next\" -NotContains $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -eq \"dev\" -or $version.type -eq \"beta\") {\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    elseif ($version.type -like \"nightly*\") {\n        if (\"nightly\" -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        }\n    }\n    else {\n        # Upload to the test container rather than the supplied one\n        $global:connectDetails.testOnly = $true\n        if ($version.type -ne $container) {\n            Write-LogFailure \"Container [$container] is not valid for version type [$($version.type)]\"\n        } else {\n            Write-LogWarning \"Non-Standard release type using tst/$container as the destination\"\n        }\n    }\n    \n    return $version;\n}\n\n$Error.Clear()\n\n#-----------------------------------------------------------------------------\n# Start of Script\n#-----------------------------------------------------------------------------\nSet-LogPath $logPath \"setActiveCdnVersionLog\"\n\nWrite-LogParams\n$version = Validate-Params\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\n# You will need to at least have the Az modules installed\nInstallRequiredModules\n$global:connectDetails = ParseCdnStorePath $global:connectDetails\n\nif ([string]::IsNullOrWhiteSpace($global:connectDetails.sasToken) -eq $true) {\n    Write-Log \"**********************************************************************\"\n    Write-Log \"Validating user access\"\n    Write-Log \"**********************************************************************\"\n    $global:connectDetails = ValidateAccess $global:connectDetails\n}\n\nWrite-Log \"======================================================================\"\n\n# List the files for each container\n$files = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n$testFiles = New-Object 'system.collections.generic.dictionary[string, system.collections.generic.list[hashtable]]'\n\n$storePath = \"$container\"\nif ($container -eq \"public\") {\n    $storePath = \"scripts/b\"\n} elseif ($container -ne \"beta\" -and $container -ne \"next\" -and $container -ne \"dev\" -and $container -ne \"nightly\") {\n    $global:connectDetails.testOnly = $true\n    $global:connectDetails.storeContainer = \"tst\"\n}\n\nGet-VersionFiles $files $storePath \"ai.config.\" $activeVersion\nGet-VersionFiles $testFiles $storePath \"ai_test.config.\" $activeVersion\n\nif ($container -eq \"dev\" -or $container -eq \"nightly\") {\n    if ($testFiles.ContainsKey($activeVersion) -ne $true) {\n        Write-LogFailure \"Test Version [$activeVersion] does not appear to be deployed to [$container]\"\n    }\n} elseif ($files.ContainsKey($activeVersion) -ne $true) {\n    Write-LogFailure \"Version [$activeVersion] does not appear to be deployed to [$container]\"\n} elseif ($files[$activeVersion].Count -ne 1) {          # Since 2.6.5\n    Write-LogFailure \"Version [$activeVersion] does not fully deployed to [$container] -- only found [$($files[$activeVersion].Count)] file(s)\"\n}\n\n# Don't try and publish anything if any errors have been logged\nif (Get-HasErrors -eq $true) {\n    exit 2\n}\n\nif ($container -eq \"dev\" -or $container -eq \"nightly\") {\n    SetActiveVersion $testFiles[$activeVersion] $storePath $minorOnly\n} else {\n    SetActiveVersion $files[$activeVersion] $storePath $minorOnly\n}\n\n\nWrite-Log \"======================================================================\"\n"
  },
  {
    "path": "tools/config/test-config.json",
    "content": "{\n    \"version\": \"1.0.6\",\n    \"enabled\": true,\n    \"featureOptIn\": {\n        \"iKeyUsage\": {\n            \"mode\": 3,\n            \"onCfg\": { \n                \"throttleMgrCfg.109.disabled\": false,\n                \"throttleMgrCfg.106.disabled\": false\n            },\n            \"offCfg\": { \n                \"throttleMgrCfg.109.disabled\": true,\n                \"throttleMgrCfg.106.disabled\": true\n            }\n        },\n        \"zipPayload\": {\n            \"mode\": 3\n        },\n        \"CdnUsage\": {\n            \"mode\": 4,\n            \"onCfg\": { \n                \"throttleMgrCfg.109.disabled\": false,\n                \"throttleMgrCfg.110.disabled\": false\n            },\n            \"offCfg\": { \n                \"throttleMgrCfg.109.disabled\": true,\n                \"throttleMgrCfg.110.disabled\": true\n            }\n\n        }\n    },\n    \"config\": {\n        \"throttleMgrCfg\": {\n            \"109\": { \n                \"disabled\": false,\n                \"limit\": { \n                    \"samplingRate\": 2000000,\n                    \"maxSendNumber\": 1\n                },\n                \"interval\": {\n                    \"dayInterval\": 1\n                }\n            },\n            \"106\": { \n                \"disabled\": false,\n                \"limit\": { \n                    \"samplingRate\": 2000000,\n                    \"maxSendNumber\": 1\n                },\n                \"interval\": {\n                    \"monthInterval\": 1,\n                    \"dayInterval\": 1,\n                    \"daysOfMonth\":[13]\n                }\n            },\n            \"110\": { \n                \"disabled\": false,\n                \"limit\": { \n                    \"samplingRate\": 1000000,\n                    \"maxSendNumber\": 1\n                },\n                \"interval\": {\n                    \"dayInterval\": 1\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "tools/github-page-script-injection/injectScript.js",
    "content": "const fs = require('fs');\nconst path = require('path');\n\n// Recursively process a folder and its subfolders to search for HTML files\nconst processFolder = (folderPath) => {\n  const files = fs.readdirSync(folderPath);\n\n  files.forEach((file) => {\n    const filePath = path.join(folderPath, file);\n\n    if (fs.statSync(filePath).isDirectory()) {\n      processFolder(filePath);\n    } else if (path.extname(file) === '.html') {\n      console.log(`process ${filePath}`);\n      injectScript(filePath);\n    } else if (path.extname(file) === '.md') {\n      console.log(`process ${filePath}`);\n      injectHtml(filePath);\n    }\n  });\n};\n\n\n// Start processing from the 'docs' folder\nconst docsFolder = path.join(__dirname, '../../docs');\n\n// Prepare the script content to be injected\nconst scriptFilePath = path.join(__dirname, '../applicationinsights-web-snippet/build/output/snippet.min.js');\nlet scriptContent = fs.readFileSync(scriptFilePath, 'utf8');\n\n// Replace the placeholder string with the actual connection string\n//const connectionString = 'InstrumentationKey=1ae9e7ce-18f1-4e14-8fc0-acbf0ed28895;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/';\nlet iKeyForCfgSync = \"1ae9e7ce-18f1-4e14-8fc0-acbf0ed28895\";\nlet cfgUrl = \"https://js.monitor.azure.com/next/ai.config.1.cfg.json\";\n// let cfgUrl = \"https://js.monitor.azure.com/nightly/ai_test.config.1-nightly3.cfg.json\";\nscriptContent = scriptContent.replace(`connectionString: \"YOUR_CONNECTION_STRING\"`, `instrumentationKey: \"${iKeyForCfgSync}\",\\n \\texpCfg: {\\n\\t\\tinclScripts: true,\\n\\t\\t\\n\\t\\tmaxLogs: 100},\\n \\t\\textensionConfig: {\\n\\t\\t\\t\"AppInsightsCfgSyncPlugin\": {\\n\\t\\t\\t\\tcfgUrl:\"${cfgUrl}\"\\n\\t\\t\\t}\\n\\t\\t}`);\n//scriptContent = scriptContent.replace('YOUR_CONNECTION_STRING', connectionString);\n// Switch to use the promoted \"next\" CDN endpoint for the main script file\nscriptContent = scriptContent.replaceAll(\"/scripts/b/\", \"/next/\");\nscriptContent = `<script type=\"text/javascript\">${scriptContent}</script>`;\n\n\n// write this file into _include folder so that later github would reject it inside markdown files\nconst includeFolderPath = path.join(__dirname, '../../docs/_includes/');\nconst includeFolderFile = path.join(includeFolderPath, 'script.html');\n\n// Check if the directory exists, create it if not\nif (!fs.existsSync(includeFolderPath)) {\n  fs.mkdirSync(includeFolderPath, { recursive: true });\n}\n\n// Now, write the file\nfs.writeFileSync(includeFolderFile, scriptContent, 'utf8');\n\n// recursively process all html files under docs folder\nprocessFolder(docsFolder);\n\nfunction injectHtml(filePath) {\n  // Read the content of the Markdown file\n  const markdownContent = fs.readFileSync(filePath, 'utf8');\n\n  // Specify the injection string\n  const injectionString = `{% include script.html %}`;\n\n  // Append the injection string to the end of the Markdown content\n  const updatedContent = `${markdownContent}\\n\\n${injectionString}`;\n\n  // Write the updated content back to the file\n  fs.writeFileSync(filePath, updatedContent, 'utf8');\n\n  console.log(`Markdown file injection completed for ${filePath}`);\n}\n\nfunction injectScript(filePath) {\n  fs.readFile(filePath, 'utf8', (err, data) => {\n    if (err) {\n      console.error('Error reading file:', err);\n      return;\n    }\n\n    // Check if the script content is already present in the file\n    const fileContent = fs.readFileSync(filePath, 'utf8');\n  \n    // Check if the script content is already present in the file\n    if (fileContent.includes(scriptContent)) {\n      console.log(`Script already present in ${filePath}`);\n      return;\n    }\n    // Create the modified content by inserting the script tag right before the closing head tag\n    const modifiedContent = data.replace(/(<\\/head[^>]*)/i, `\\n${scriptContent}\\n$1`);\n    // Save the modified content back to the file\n    fs.writeFile(filePath, modifiedContent, (err) => {\n      if (err) {\n        console.error('Error writing to file:', err);\n        return;\n      }\n      console.log(`Script injected successfully into ${filePath}`);\n    });\n  });\n}\n"
  },
  {
    "path": "tools/grunt-tasks/chrome/bridge.js",
    "content": "/*\n * grunt-contrib-qunit\n * https://gruntjs.com/\n *\n * Copyright (c) 2016 \"Cowboy\" Ben Alman, contributors\n * Licensed under the MIT license.\n */\n\n/* global QUnit:true */\n(function (factory) {\n  if (window.self !== window.top) {\n    // Ignore iframes. https://github.com/gruntjs/grunt-contrib-qunit/issues/202\n    return;\n  }\n  if (typeof define === 'function' && define.amd) {\n    require(['qunit'], factory);\n  } else {\n    factory(QUnit);\n  }\n}(function(QUnit) {\n  'use strict';\n\n  var lastMessage = performance.now();\n\n  // Don't re-order tests.\n  QUnit.config.reorder = false;\n\n  // Send messages to the Node process\n  function sendMessage() {\n    self.__grunt_contrib_qunit__.apply(self, [].slice.call(arguments));\n    lastMessage = performance.now();\n  }\n\n  if (self.__grunt_contrib_qunit_timeout__) {\n    setTimeout(function checkTimeout() {\n      if ((performance.now() - lastMessage) > self.__grunt_contrib_qunit_timeout__) {\n        sendMessage('fail.timeout');\n      } else {\n        // Keep checking\n        setTimeout(checkTimeout, 1000);\n      }\n    }, 1000);\n  }\n\n  // QUnit reporter events\n  // https://api.qunitjs.com/callbacks/QUnit.on/\n\n  QUnit.on('testStart', function(obj) {\n    sendMessage('qunit.on.testStart', obj);\n  });\n\n  QUnit.on('testEnd', function(obj) {\n    // Re-create object to strip out 'assertions' field\n\n    // expected and actual may contain circular objects, which would fail in puppeteer as it uses JSON.stringify to serialize its messages\n    // In that case, replace actual and expected\n    var errors = obj.errors;\n    if (!canBeJSONStringified(errors)) {\n      errors = obj.errors.map(function (error) {\n        return {\n          passed: error.passed,\n          message: error.message,\n          stack: error.stack,\n          actual: replaceIfCannotBeJSONStringified(error.actual),\n          expected: replaceIfCannotBeJSONStringified(error.expected)\n        }\n      });\n    }\n\n    sendMessage('qunit.on.testEnd', {\n      name: obj.name,\n      moduleName: obj.moduleName,\n      fullName: obj.fullName,\n      status: obj.status,\n      runtime: obj.runtime,\n      errors: errors,\n    });\n  });\n\n  function replaceIfCannotBeJSONStringified(obj) {\n    return canBeJSONStringified(obj) ? obj : obj.toString();\n  }\n\n  function canBeJSONStringified(obj) {\n    try {\n      JSON.stringify(obj);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  QUnit.on('runEnd', function(obj) {\n    // Re-create object to strip out large 'tests' field (deprecated).\n    sendMessage('qunit.on.runEnd', {\n      testCounts: obj.testCounts,\n      runtime: obj.runtime,\n      status: obj.status\n    });\n  });\n\n  // QUnit plugin callbacks (for back-compat)\n  // https://api.qunitjs.com/callbacks/\n  //\n  // TODO: Remove the below in a future major version of grunt-contrib-qunit,\n  // after updating docs for grunt.event.on() and announcing their deprecation,\n  // to give developers time to migrate any event consumers to their\n  // newer equivalents.\n\n  QUnit.log(function(obj) {\n    // What is this I don’t even\n    if (obj.message === '[object Object], undefined:undefined') {\n      return;\n    }\n\n    // Parse some stuff before sending it.\n    var actual;\n    var expected;\n\n    if (!obj.result) {\n      // Dumping large objects can be very slow, and the dump isn't used for\n      // passing tests, so only dump if the test failed.\n      actual = QUnit.dump.parse(obj.actual);\n      expected = QUnit.dump.parse(obj.expected);\n    }\n    // Send it.\n    sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source, obj.todo);\n  });\n\n  QUnit.testStart(function(obj) {\n    sendMessage('qunit.testStart', obj.name);\n  });\n\n  QUnit.testDone(function(obj) {\n    sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total, obj.runtime, obj.skipped, obj.todo);\n  });\n\n  QUnit.moduleStart(function(obj) {\n    sendMessage('qunit.moduleStart', obj.name);\n  });\n\n  QUnit.moduleDone(function(obj) {\n    sendMessage('qunit.moduleDone', obj.name, obj.failed, obj.passed, obj.total);\n  });\n\n  QUnit.begin(function() {\n    sendMessage('qunit.begin');\n  });\n\n  QUnit.done(function(obj) {\n    sendMessage('qunit.done', obj.failed, obj.passed, obj.total, obj.runtime);\n  });\n}));\n"
  },
  {
    "path": "tools/grunt-tasks/minifyNames.js",
    "content": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst globby = require(\"globby\");\nconst child_process = require(\"child_process\");\n\nvar MAX_IMPORT_LENGTH = 140;\nvar IMPORT_INDENT_PREFIX = \"    \";\n\nvar AutoGeneratedConstFile = \n    \"// Copyright (c) Microsoft Corporation. All rights reserved.\\r\\n\" +\n    \"// Licensed under the MIT License.\\r\\n\" +\n    \"// @skip-file-minify\\r\\n\\r\\n\" +\n    \"// ##############################################################\\r\\n\" +\n    \"// AUTO GENERATED FILE: This file is Auto Generated during build.\\r\\n\" +\n    \"// ##############################################################\\r\\n\\r\\n\" +\n    \"// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\r\\n\" +\n    \"// Note: DON'T Export these const from the package as we are still targeting ES5 which can result in a mutable variables that someone could change!!!\\r\\n\" +\n    \"// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\\r\\n\\r\\n\";\n\nconst encodeValues = \".();[]:\";\nconst defaultGeneratedConstantFile = \"./src/__DynamicConstants.ts\";\n\nvar defaultReplace = [\n];\n\nvar defaultInternalConstants = [\n    \"./src/InternalConstants.ts\"\n];\n\nvar defaultIgnoreConst = [ ];\nvar defaultIgnoreNames = [ \n    \"_e[A-Z]*\", \"e[A-Z]*\", \"[A-Z]*Type\", \"[A-Z]*Value\", \"[A-Z]*Reason\", \"chrome.*\", \"WellKnownSymbols\"\n];\n\nfunction _createEnumWildcardRegEx(value) {\n    // Converts a string into a global regex, escaping any special characters\n    var regExValue = value.replace(/\\\\/g, \"\\\\\\\\\");\n    regExValue = regExValue.replace(/([\\+\\?\\|\\{\\}\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/])/g, \"\\\\$1\");\n    regExValue = regExValue.replace(/\\*/g, \".*\");\n    return new RegExp(\"^\" + regExValue + \"$\", \"\");\n}\n\nfunction _createRegEx(value, global) {\n    // Converts a string into a global regex, escaping any special characters\n    var regExValue = value.replace(/\\\\/g, \"\\\\\\\\\");\n    regExValue = regExValue.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/\\*])/g, \"\\\\$1\");\n    return new RegExp(regExValue, global ? 'g' : '');\n}\n\nfunction _createNameRegExs(name) {\n    // Converts a string into a global regex, escaping any special characters\n    var regExValue = name.replace(/\\\\/g, \"\\\\\\\\\");\n    regExValue = regExValue.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/\\*])/g, \"\\\\$1\");\n\n    var funcMatches = [];\n    funcMatches.push(new RegExp(\"([\\\\.\\\\w]*\\\\??)(\\\\.\" + regExValue + \")([\\\\(\\\\)\\\\s+.,;\\\\[])\", ''));\n    funcMatches.push(new RegExp(\"^(\\\\s+)(\" + regExValue + \")(:\\\\s([\\\\(\\\\w][^,;]+),?)\", ''));\n\n    return funcMatches;\n}\n\nfunction _createEnumNamesRegEx(eName, global) {\n    var regExValue = eName.replace(/\\\\/g, \"\\\\\\\\\");\n    regExValue = regExValue.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/\\*])/g, \"\\\\$1\");\n    return new RegExp(\"\\\\[\" + regExValue + \"\\\\.(\\\\w+)\\\\]:\\\\s*\\\\\\\"(\\\\w*)\\\\\\\"\", global ? \"gm\" : \"\");\n}\n\nfunction _createValueMapNamesRegEx(eName, global) {\n    var regExValue = eName.replace(/\\\\/g, \"\\\\\\\\\");\n    regExValue = regExValue.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/\\*])/g, \"\\\\$1\");\n    return new RegExp(\"(\\\\w+):\\\\s+\\\\[\\\\s+\" + regExValue + \"\\\\.(\\\\w+),\\\\s+\\\\\\\"(\\\\w+)\\\\\\\"\\\\]\", global ? \"gm\" : \"\");\n}\n\nfunction _createRevertRegEx(name, global) {\n    // Converts a string into a global regex, escaping any special characters\n    var regExValue = name.replace(/\\\\/g, \"\\\\\\\\\");\n    regExValue = regExValue.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/\\*])/g, \"\\\\$1\");\n    return new RegExp(\"(\" + regExValue + \")\\\\s\\\\/\\\\*\\\\s@[mM]in\\\\:([^\\\\s]+)\\\\s\\\\*\\\\/\", global ? 'gm' : '');\n}\n\nfunction _createImportNameUsage(name) {\n    var regExValue = name.replace(/\\\\/g, \"\\\\\\\\\");\n    regExValue = regExValue.replace(/([\\+\\?\\|\\{\\}\\[\\]\\(\\)\\^\\$\\#\\.\\=\\!\\:\\/\\*])/g, \"\\\\$1\");\n    return new RegExp(\"\\\\w?\" + regExValue + \"\\\\w?\", \"gm\");\n}\n\nfunction resolvePath(theOptions, thePath) {\n    if (!path.isAbsolute(thePath)) {\n        return path.join(process.cwd() || \".\", theOptions.projectRoot || \".\", thePath);\n    }\n\n    return thePath;\n}\n\nfunction readSourceMap(theReplacements, src, from) {\n    const getNames = /export const (\\w+)\\s+=\\s+createEnumMap<typeof\\s(\\w+)\\s*,\\s*\\{/gm;\n\n    var matches = getNames.exec(src);\n    while (matches != null) {\n        var name = matches[1];\n        var eName = matches[2];\n        if (name && eName) {\n            var replacement = {\n                names: [],\n                replaceStr: \"[\" + name + \"[\" + eName + \".$1]$2]\",\n                imports: [ eName, name ],\n                from: from\n            };\n\n            var getValues = _createEnumNamesRegEx(eName, true);\n            var nameMatches = getValues.exec(src);\n            while (nameMatches != null) {\n                var eValue = nameMatches[1];\n                var sValue = nameMatches[2];\n\n                if (eValue && sValue && eValue === sValue) {\n                    replacement.names.push(eValue);\n                } else {\n                    throw \"Unable to parse or incorrect Names definition for [\" + name + \"[\" + eName + \".\" + eValue + \"]] => [\" + sValue + \"] string and enum value MUST be the same!\";\n                }\n\n                nameMatches = getValues.exec(src);\n            }\n\n            theReplacements.push(replacement);\n        }\n\n        matches = getNames.exec(src);\n    }\n}\n\nfunction readSourceValueMap(theReplacements, src, from) {\n    const getNames = /export const (\\w+)\\s+=\\s+createValueMap<typeof\\s(\\w+)\\s*,\\s*\\{/gm;\n\n    var matches = getNames.exec(src);\n    while (matches != null) {\n        var name = matches[1];\n        var eName = matches[2];\n        if (name && eName) {\n            var getValues = _createValueMapNamesRegEx(eName, true);\n            var nameMatches = getValues.exec(src);\n            while (nameMatches != null) {\n                var cName = nameMatches[1];\n                var eValue = nameMatches[2];\n                var sValue = nameMatches[3];\n\n                if (cName && eValue && sValue && cName === eValue) {\n                    var replacement = {\n                        names: [ sValue ],\n                        replaceStr: \"[\" + name + \"[\" + eName + \".\" + eValue +\"]$2]\",\n                        imports: [ eName, name ],\n                        from: from\n                    };\n    \n                    theReplacements.push(replacement);\n                } else {\n                    throw \"Unable to parse or incorrect Names definition for [\" + name + \"[\" + eName + \".\" + eValue + \"]] => [\" + sValue + \"] string and enum value MUST be the same!\";\n                }\n\n                nameMatches = getValues.exec(src);\n            }\n\n            theReplacements.push(replacement);\n        }\n\n        matches = getNames.exec(src);\n    }\n}\n\nfunction readInternalConstants(theReplacements, src, from) {\n    // eslint-disable-next-line security/detect-unsafe-regex\n    const getConstStrings = /export\\sconst\\s(\\w+)\\s=\\s(?:\\(?\\/\\*\\s*[#@]__PURE__\\s*\\*\\/\\s*){0,1}([\"\\w \\t\\+]*as\\s)?\\\"(\\w*)\\\"\\)?;/gm\n\n    var matches = getConstStrings.exec(src);\n    while (matches != null) {\n        var exportedName = matches[1];\n        var constValue = matches[3];\n        if (exportedName && constValue) {\n            var replacement = {\n                names: [ constValue ],\n                replaceStr: \"[\" + exportedName + \"$2]\",\n                imports: [ exportedName ],\n                from: from\n            };\n\n            theReplacements.push(replacement);\n        }\n\n        matches = getConstStrings.exec(src);\n    }\n}\n\nfunction removeUnusedImports(parsedFile) {\n    //const detectImports = /^import[\\s]*\\{([^}]*)\\}[\\s]*from[\\s]*[\\\"'](.*)[\\\"'];$/gm;\n\n    let orgSrc = parsedFile.src;\n    var changed = false;\n\n    for (var lp = 0; lp < parsedFile.imports.length; lp++) {\n        var theImports = parsedFile.imports[lp];\n        if (theImports.type === 2) {\n            var newValues = [];\n            theImports.values.forEach((token) => {\n                var theToken = token.trim();\n                var orgToken = theToken;\n                var ignore = theToken.indexOf(\" \") !== -1 || theToken.indexOf(\",\") !== -1;\n                if (theToken.indexOf(\" as \") !== -1) {\n                    ignore = true;\n                    var parts = theToken.split(\" \");\n                    if (parts.length === 3 && parts[1].trim() === \"as\") {\n                        theToken = parts[2].trim();\n                        ignore = false;\n                    }\n                }\n\n                var isUsed = !!orgToken;\n                if (isUsed && !ignore) {\n                    isUsed = false;\n                    var importCheck = _createImportNameUsage(theToken);\n                    var matches = importCheck.exec(orgSrc);\n                    while (!isUsed && matches != null) {\n                        if (matches[0] === theToken) {\n                            isUsed = true;\n                            break;\n                        }\n\n                        matches = importCheck.exec(orgSrc);\n                    }\n                }\n\n                if (orgToken && isUsed) {\n                    newValues.push(orgToken);\n                } else {\n                    changed = true;\n                }\n            });\n\n            theImports.values = newValues;\n        }\n    }\n\n    if (changed) {\n        parsedFile.changed = true;\n    }\n}\n\nfunction isIgnoreLine(theLine, position, length) {\n    let idx = theLine.indexOf(\"//\");\n    if (idx !== -1) {\n        if (idx < position) {\n            return true;\n        }\n    \n        if (theLine.substring(idx).toLowerCase().indexOf(\"@skip-minify\") !== -1) {\n            // We need to ignore this entire line\n            return true;\n        }\n    }\n\n    return isInQuoteOrComment(theLine, position);\n}\n\nfunction isInQuoteOrComment(theLine, position) {\n    var len = theLine.length;\n    var inString = null;\n    var inEscape = false;\n    var inComment = false;\n    var idx = 0;\n\n    // Check if we appear to be \"within\" a multi-line comment\n    var matches = /\\s*\\*/.exec(theLine);\n    if (matches !== null) {\n        inComment = true;\n        idx = matches[0].length + 1;\n    }\n\n    while (idx < position && idx < len) {\n        var ch = theLine[idx];\n        var nextCh = idx + 1 < len ? theLine[idx + 1] : null;\n        if (!inString && !inComment) {\n            if (ch === \"\\\"\" || ch === \"'\" || ch === \"`\") {\n                // Start of a string\n                inString = ch;\n            } else if (ch === \"/\") {\n                if (nextCh === \"/\") {\n                    // start of single line comment\n                    return true;\n                } else if (nextCh === \"*\") {\n                    // Start of a multi-line comment\n                    inComment = true;\n                    idx++;\n                }\n            }\n        } else if (inComment) {\n            // we are in a multi-line comment\n            if (ch === \"*\") {\n                if (nextCh === \"/\") {\n                    // End of multi-line comment\n                    inComment = false;\n                    idx++;\n                }\n            }\n        } else if (inString && !inEscape) {\n            // We are in a quote\n            if (inString === ch) {\n                // End of string\n                inString = null;\n            } else if (ch === \"\\\\\") {\n                inEscape = true;\n            }\n        } else {\n            inEscape = false;\n        }\n\n        if (!inString) {\n            inEscape = false;\n        }\n\n        idx++;\n    }\n\n    //if (!(!!inString || !!inComment)) {\n    //    console.log(\"Not in comment or string [\" + theLine + \"] @ \" + position);\n    //}\n\n    // If we are in a string or comment then ignore\n    return !!inString || !!inComment;\n}\n\nfunction isIgnoreType(parsedFile, value, ignoreNames) {\n    if (value) {\n        value = value.trim();\n        var typeName = value;\n\n        var typeMatch = /\\w+/.exec(value);\n        if (typeMatch != null) {\n            typeName = typeMatch[0];\n        }\n\n        if (value.endsWith(\",\")) {\n            value = value.substring(0, value.length - 1).trim();\n        }\n\n        if (/\\s*=[^>]/.exec(value) != null) {\n            // looks like an assignment\n            return true;\n        }\n        \n        if (typeName === \"string\" || \n                typeName === \"number\" || \n                typeName === \"boolean\" || \n                typeName === \"void\" || \n                typeName === \"any\" || \n                typeName === \"string[]\" || \n                typeName === \"number[]\" || \n                typeName === \"boolean[]\" || \n                typeName === \"void[]\" || \n                typeName === \"any[]\" || \n                typeName === \"Function\" || \n                typeName === \"VoidFunction\" || \n                typeName === \"RegEx\") {\n            return true;\n        }\n\n        if (ignoreNames) {\n            for (var lp = 0; lp < ignoreNames.length; lp++) {\n                if (ignoreNames[lp].test(value) || ignoreNames[lp].test(typeName)) {\n                    return true;\n                }\n            }\n        }\n\n        var isFuncCall = false;\n        var funcCall = /\\w+\\((.*)\\)/.exec(value);\n        if (funcCall != null) {\n            isFuncCall = true;\n        }\n    \n        if (!isFuncCall && parsedFile.imports.length > 0) {\n    \n            for (var lp = 0; lp < parsedFile.imports.length; lp++) {\n                var theImports = parsedFile.imports[lp];\n    \n                if (theImports && theImports.values) {\n                    for (var idx = 0; idx < theImports.values.length; idx++) {\n                        var theToken = theImports.values[idx].trim();\n                        var ignore = theToken.indexOf(\" \") !== -1 || theToken.indexOf(\",\") !== -1;\n                        if (theToken.indexOf(\" as \") !== -1) {\n                            ignore = true;\n                            var parts = theToken.split(\" \");\n                            if (parts.length === 3 && parts[1].trim() === \"as\") {\n                                theToken = parts[2].trim();\n                                ignore = false;\n                            }\n                        }\n        \n                        if (!ignore && (value === theToken || typeName === theToken)) {\n                            return true;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    return false;\n}\n\nfunction isInInterface(parsedFile, lines, lineNo) {\n\n    while (lineNo > 0) {\n        let theLine = lines[--lineNo] || \"\";\n\n        var pos = theLine.indexOf(\"interface \");\n        if (pos !== -1 && !isInQuoteOrComment(theLine, pos)) {\n            return true;\n        }\n\n        pos = theLine.indexOf(\"function \");\n        if (pos !== -1 && !isInQuoteOrComment(theLine, pos)) {\n            return false;\n        }\n    }\n\n    return false;\n}\n\nfunction replaceValues(parsedFile, theOptions, theName, values) {\n    var newContent = \"\";\n    var lines = parsedFile.src.split(\"\\n\");\n    var changed = false;\n    var skipNextLine = false;\n    var funcMatches = _createNameRegExs(theName);\n    var lp = 0;\n    while (lp < lines.length) {\n        var theLine = lines[lp++];\n        var orgLine = theLine;\n\n        if (!skipNextLine) {\n            funcMatches.forEach((funcMatch) => {\n                var matches;\n                var pos = 0;\n\n                while (pos < theLine.length && (matches = funcMatch.exec(theLine.substring(pos))) !== null) {\n                    var found = matches.index + pos;\n                    var value = matches[0];\n                    var prefix = matches[1];\n                    var replaceTag = \" /* @min:\" + _encodeReplacement(matches[2]) + \" */\";\n                    var trail = matches[3];\n                    var trailType = matches[4];\n                    var canChange = true;\n\n                    if (prefix) {\n                        // Jump over the prefix\n                        found += prefix.length;\n                        value = value.substring(prefix.length);\n                        if (prefix.startsWith(\"..\")) {\n                            // Looks like the spread operator \"...\" was probably used\n                            canChange = false;\n                        } else if (prefix.endsWith(\"?\")) {\n                            // looks like a potential xxx?.yyy\n                            canChange = false;\n                            //console.log(\"Ignoring: \" + value);\n                        } else if (values && values.imports) {\n                            if (values.imports.indexOf(prefix) !== -1) {\n                                canChange = false;\n                            }\n                        }\n                        \n                        if (theOptions.ignoreNames) {\n                            for (var lp = 0; lp < theOptions.ignoreNames.length; lp++) {\n                                if (theOptions.ignoreNames[lp].test(prefix)) {\n                                    // console.log(\"Ignoring Enum: \" + value + \" => [\" + prefix + \"] === \" + theOptions.ignoreNames[lp].source);\n                                    canChange = false;\n                                    break;\n                                } else {\n                                    // if (prefix.indexOf(\"DataSanitizerValues\") !== -1) {\n                                    //     console.log(\"No Match Enum: \" + value + \" => [\" + prefix + \"] === \" + theOptions.ignoreNames[lp].source);\n                                    // }\n                                }\n                            }\n                        } else {\n                            throw \"No IgnoreNames!\";\n                        }\n                    }\n\n                    if (trailType) {\n                        // Don't change lines that are using an imported type or look like a parameter / interface definition\n                        canChange = canChange && !isIgnoreType(parsedFile, trailType, theOptions.ignoreNames) && !isInInterface(parsedFile, lines, lp);\n                    }\n                    \n                    // Don't change commented lines or if the line has been tagged to skip\n                    canChange = canChange && !isIgnoreLine(theLine, found, value.length);\n\n                    if (canChange) {\n                        // Because TypeScript wraps inline JSON object assignment \"name: value\" values\n                        // in a temporary object like _a[_DYN_NAME] which results in a larger end result\n                        // this limits these to handle names that are at least 10 characters long\n                        if (trail.startsWith(\":\") && matches[2].length < 12) {\n                            canChange = false;\n                            // console.log(\"Ignoring: \" + value);\n                        }\n                    }\n\n                    if (canChange) {\n                        var replaceValue = values.replaceStr.replace(\"$1\", theName);\n                        if (replaceValue.indexOf(\"$2\") !== -1) {\n                            replaceValue = replaceValue.replace(\"$2\", replaceTag);\n                            replaceTag = \"\";\n                        }\n\n                        // if (theLine.indexOf(\"DataSanitizerValues\") !== -1) {\n                        //     console.log(\" -> \" + funcMatch.source + \"\\n line:\" + theLine + \"\\nprefix:\" + prefix);\n                        // }\n                        var newValue = replaceValue + replaceTag + trail;\n                        theLine = theLine.substring(0, found) + newValue + theLine.substring(found + value.length);\n                        pos = found + newValue.length;\n                    } else {\n                        pos = found + value.length;\n                    }\n                }\n            });\n        }\n\n        newContent += theLine.replace(/\\r$/, \"\") + \"\\r\\n\";\n        if (orgLine != theLine) {\n            changed = true;\n        }\n\n        skipNextLine = false;\n        var idx = orgLine.indexOf(\"//\");\n        if (idx !== -1) {\n            if (orgLine.substring(idx).toLowerCase().indexOf(\"@skip-minify-next-line\") !== -1) {\n                skipNextLine = true;\n            }\n        }\n    }\n\n    if (changed) {\n        parsedFile.src = newContent;\n    }\n\n    return changed;\n}\n\nfunction _encodeReplacement(value) {\n    var result = encodeURIComponent(value);\n    for (var lp = 0; lp < encodeValues.length; lp++) {\n        result = result.replace(_createRegEx(encodeValues.substr(lp, 1), true), \"%\" + encodeValues.charCodeAt(lp).toString(16));\n    }\n\n    return result;\n}\n\nfunction _decodeReplacement(value) {\n    var result = value;\n    for (var lp = 0; lp < encodeValues.length; lp++) {\n        result = result.replace(_createRegEx(\"%\" + encodeValues.charCodeAt(lp).toString(16), true), encodeValues.substr(lp, 1));\n    }\n    return decodeURIComponent(result);\n}\n\n// { \n//     names: [ \"initialize\", \"processTelemetry\", \"isInitialized\", \"setNextPlugin\", \"teardown\" ], \n//     replaceStr: \"PluginNames[ePluginNames.$1]\", \n//     imports: [ \"ePluginNames\", \"PluginNames\" ],\n//     from: \"./JavaScriptSDK.Enums/PluginNames\"\n// }\nfunction replaceNames(parsedFile, theOptions, values) {\n\n    var newImports = [];\n    var changed = false;\n    for (var lp = 0; lp < values.names.length; lp++) {\n        var theName = values.names[lp];\n        if (replaceValues(parsedFile, theOptions, theName, values)) {\n            changed = true;\n        }\n\n        if (changed && values.imports && values.from) {\n            newImports.push({ imports: values.imports, from: values.from });\n        }\n    }\n\n    if (changed) {\n        parsedFile.changed = true;\n\n        addImports(parsedFile, theOptions, newImports);\n    }\n}\n\n// { \n//     names: [ \"initialize\", \"processTelemetry\", \"isInitialized\", \"setNextPlugin\", \"teardown\" ], \n//     replaceStr: \"PluginNames[ePluginNames.$1]\", \n//     imports: [ \"ePluginNames\", \"PluginNames\" ],\n//     from: \"./JavaScriptSDK.Enums/PluginNames\"\n// }\nfunction reverseNames(parsedFile, values) {\n    var src = parsedFile.src;\n    var orgSrc = src;\n\n    for (var lp = 0; lp < values.names.length; lp++) {\n        var theName = values.names[lp];\n        var newValue = values.replaceStr.replace(\"$1\", theName);\n        var reverseRegEx = _createRevertRegEx(newValue, true);\n\n        src = src.replace(reverseRegEx, function(matches, g1, g2) {\n            return _decodeReplacement(g2);\n        });\n    }\n\n    if (src != orgSrc) {\n        parsedFile.src = src;\n        parsedFile.changed = true;\n    }\n}\n\nfunction autoReverseNames(parsedFile) {\n    var src = parsedFile.src;\n    var orgSrc = src;\n\n    src = src.replace(/(\\[\\w+)\\s\\/\\*\\s@[mM]in\\:([^\\s]+)\\s\\*\\/\\]/gm, function (matches, g1, g2) {\n        return _decodeReplacement(g2);\n    });\n\n    src = src.replace(/(\\[\\w+\\])\\s\\/\\*\\s@[mM]in\\:([^\\s]+)\\s\\*\\//gm, function (matches, g1, g2) {\n        return _decodeReplacement(g2);\n    });\n\n    if (src != orgSrc) {\n        parsedFile.src = src;\n        parsedFile.changed = true;\n    }\n}\n\nfunction insertImport(theImports, original, src, values, type) {\n\n    if (type === 2) {\n        // Only try and merge specifically listed / exported imports\n        for (var lp = 0; lp < theImports.length; lp++) {\n            if (theImports[lp].src === src && theImports[lp].type === type) {\n                for (var idx = 0; idx < values.length; idx++) {\n                    var newValue = values[idx].trim();\n                    if (newValue && theImports[lp].values.indexOf(newValue) === -1) {\n                        theImports[lp].values.push(newValue);\n                    }\n                }\n\n                theImports[lp].values.sort();\n                return theImports[lp];\n            }\n        }\n\n        var newValues = [];\n        for (var lp = 0; lp < values.length; lp++) {\n            var value = values[lp].trim();\n            if (value) {\n                newValues.push(value);\n            }\n        }\n        \n        values = newValues;\n\n        values.sort();\n    }\n\n    theImports.push({\n        org: original,\n        src: src.trim(),\n        values: values,\n        type: type\n    });\n\n    return theImports;\n}\n\nfunction extractComments(src) {\n    var commentRegEx = /(\\/\\/([^\\n]*)\\n|\\/\\*(\\*?([\\w\\s,-]+|\\n\\s*\\*)*)\\*\\/)/gm;\n\n    var comments = [];\n    var matches = commentRegEx.exec(src);\n    while (matches != null) {\n        comments.push({\n            full: matches[0],\n            single: matches[2],\n            multi: matches[3]\n        });\n\n        matches = commentRegEx.exec(src);\n    }\n\n    return comments;\n}\n\nfunction extractImports(src, theImports) {\n    let extractAllImports = /^[ \\t]*import\\s*(\\{([^}]+)\\}|([^;]+)|(\\*))[\\s]*from[\\s]*[\\\"'](.*)[\\\"'](.*)$/gm;\n\n    var orgSrc = src;\n    var matches = extractAllImports.exec(orgSrc);\n    while (matches != null) {\n        var from = matches[5];\n        var type = 0;\n        var values = null;\n        var comments = extractComments(matches[0]);\n        // Leave commented imports alone (type === 0)\n        if (comments.length === 0) {\n            if (matches[2]) {\n                type = 2;       // Normal import (type === 2)\n                values = matches[2].replace(/\\n/g, \"\").trim().split(\",\");\n            } else if (matches[1]) {\n                // default, star or mixed import -- leave this one alone (type === 1)\n                values = [ matches[1].trim() ];\n                type = 1;\n            }\n        }\n\n        // Remove the import from the source file\n        src = src.replace(matches[0], \"--Removed--\");\n        src = src.replace(/--Removed--[\\r\\n]+/g, \"\");\n        insertImport(theImports, matches[0], from, values, type);\n\n        matches = extractAllImports.exec(orgSrc);\n    }\n\n    return src.trim();\n}\n\nfunction extractBanner(src, theBanner) {\n    var lines = src.split(\"\\n\");\n    var idx = 0;\n    while (idx < lines.length) {\n        var theLine = lines[idx].trim();\n\n        if (theLine.startsWith(\"import\") || \n                theLine.startsWith(\"export\") ||\n                theLine.startsWith(\"interface\") ||\n                theLine.startsWith(\"class\") ||\n                theLine.startsWith(\"declare\") ||\n                theLine.startsWith(\"type\") ||\n                theLine.startsWith(\"let\") || \n                theLine.startsWith(\"(\") || \n                theLine.startsWith(\"var\") || \n                theLine.startsWith(\"const\") || \n                theLine.startsWith(\"function\")) {\n            // We hit an import or the start of some code\n            break;\n        }\n\n        idx++;\n        theBanner.push(theLine.replace(/\\r$/, \"\"));\n\n        if (theLine.length === 0) {\n            // Stop at first blank line keeping the blank line\n            break;\n        }\n    }\n\n    // Some files have a blank line before the existing use strict\n    if (lines[idx] && lines[idx].trim().startsWith(\"\\\"use strict\\\";\")) {\n        theBanner.push(lines[idx].replace(/\\r$/, \"\"));\n        idx++;\n    }\n\n    var body = \"\";\n    while(idx < lines.length) {\n        body += lines[idx++] + \"\\n\";\n    }\n\n    return body;\n}\n\nfunction parseFile(filename, src) {\n\n    var theImports = [];\n    var theBanner = [];\n    var newSrc = extractBanner(src, theBanner)\n    newSrc = extractImports(newSrc, theImports);\n\n    return {\n        name: filename,\n        orgSrc: src,\n        src: newSrc,\n        banner: theBanner,\n        imports: theImports,\n        changed: false\n    };\n}\n\nfunction formatImport(theImport, maxImportWidth) {\n    var newImport =  theImport.org || \"\";\n    if (newImport) {\n        newImport += \"\\r\\n\";\n    }\n\n    if (theImport.type === 2) {\n        if (theImport.values.length > 0) {\n            theImport.values.sort();\n            newImport = \"import { \" + theImport.values.join(\", \") + \" } from \\\"\" + theImport.src + \"\\\";\\r\\n\";\n            if (newImport.length > maxImportWidth) {\n                newImport = \"import {\\r\\n\";\n                var theImports = theImport.values.join(\", \");\n                var importLines = [];\n                while (theImports.length > maxImportWidth - 4) {\n                    var idx = maxImportWidth - 4;\n                    // Find the last index\n                    while(theImports[idx] !== ',') {\n                        idx--;\n                    }\n                    importLines.push(IMPORT_INDENT_PREFIX + theImports.substring(0, idx + 1));\n                    theImports = theImports.substring(idx + 1).trim();\n                }\n                importLines.push(IMPORT_INDENT_PREFIX + theImports);\n                newImport += importLines.join(\"\\r\\n\") + \"\\r\\n\";\n                newImport += \"} from \\\"\" + theImport.src + \"\\\";\\r\\n\";\n            }\n        } else {\n            // Nothing to be imported so don't emit the import\n            newImport = \"\";\n        }\n    }\n\n    return newImport;\n}\n\nfunction formatFile(parsedFile, maxImportWidth) {\n    var newContent = \"\";\n    if (parsedFile.banner.length > 0) {\n        newContent += parsedFile.banner.join(\"\\r\\n\") + \"\\r\\n\";\n    }\n\n    if (parsedFile.imports.length > 0) {\n\n        parsedFile.imports.sort(function (a, b) {\n            if (a.type === b.type) {\n                if (a.src.startsWith(\"@\")) {\n                    if (b.src.startsWith(\"@\")) {\n                        return a.src > b.src ? 1 : -1;\n                    }\n    \n                    return -1;\n                } else if (b.src.startsWith(\"@\")) {\n                    return 1;\n                }\n    \n                return a.src > b.src ? 1 : -1;\n            }\n    \n            return a.type - b.type;\n        });\n\n        let importContent = \"\";\n        for (var lp = 0; lp < parsedFile.imports.length; lp++) {\n            importContent += formatImport(parsedFile.imports[lp], maxImportWidth);\n        }\n\n        if (importContent) {\n            newContent += importContent + \"\\r\\n\";\n        }\n    }\n\n    newContent += parsedFile.src.trim() + \"\\r\\n\";\n\n    return newContent;\n}\n\nfunction resolveImportPath(parsedFile, theOptions, importPath) {\n    if (importPath.startsWith(\".\")) {\n        var filePath = resolvePath(theOptions, parsedFile.name);\n        importPath = resolvePath(theOptions, importPath);\n        var relative = path.relative(path.dirname(filePath), importPath).replace(/\\\\/g, \"/\");\n        if (!relative.startsWith(\".\")) {\n            relative = \"./\" + relative;\n        }\n\n        return relative;\n    }\n\n    return importPath;\n}\n\nfunction addImports(parsedFile, theOptions, newImports) {\n    var theImports = parsedFile.imports;\n    for (var lp = 0; lp < newImports.length; lp++) {\n        var importPath = resolveImportPath(parsedFile, theOptions, newImports[lp].from);\n        insertImport(theImports, \"<dynamic import>\", importPath, newImports[lp].imports, 2);\n    }\n}\n\n// -----------------------------------------------------\n// Grunt Task\n// -----------------------------------------------------\n\nfunction isUndefined(value) {\n    return value == \"undefined\" || typeof value === \"undefined\";\n}\n\nfunction getGruntMultiTaskOptions(grunt, theTask) {\n    var taskOptions = theTask.data;\n    if (!taskOptions) {\n        taskOptions = (grunt.config.getRaw(theTask.name + \".\" + theTask.target) || {});\n    }\n\n    return taskOptions;\n}\n\nfunction resolveValue(value1, value2, defaultValue) {\n    var value = value1;\n    if (isUndefined(value)) {\n        value = value2;\n    }\n\n    if (isUndefined(value)) {\n        value = defaultValue;\n    }\n\n    return value;\n}\n\nfunction dumpObj(object, format) {\n    var objectTypeDump = Object.prototype.toString.call(object);\n    var propertyValueDump = \"\";\n    if (objectTypeDump === \"[object Error]\") {\n        propertyValueDump = \"{ stack: '\" + object.stack + \"', message: '\" + object.message + \"', name: '\" + object.name + \"'\";\n    }\n    else {\n        if (format) {\n            if (typeof format === \"number\") {\n                propertyValueDump = JSON.stringify(object, null, format);\n            }\n            else {\n                propertyValueDump = JSON.stringify(object, null, 4);\n            }\n        }\n        else {\n            propertyValueDump = JSON.stringify(object);\n        }\n    }\n    return objectTypeDump + propertyValueDump;\n}\n\nfunction addConstantValue(theValues, value, type) {\n    var found = false;\n    for (var lp = 0; lp < theValues.length; lp++) {\n        if (theValues[lp].value === value) {\n            theValues[lp].count ++;\n            found = true;\n            break;\n        }\n    }\n\n    if (!found) {\n        theValues.push({\n            value: value,\n            count: 1,\n            type: type\n        })\n    }\n}\n\nfunction findPossibleFileConstants(parsedFile, theNames, ignoreConst, ignoreNames) {\n    var funcMatches = [];\n    funcMatches.push(/([\\.\\w]*\\??)\\.(\\w{4,90})([\\(\\)\\s+.,;\\[])/gm);\n\n    // Find object constants with \"name: value\" pairs where the name\n    // is 10 or more characters long as typeScript wraps \"lookup\" values\n    // in a temporary object like _a[_DYN_NAME] which results in a larger end result\n    // so when scanning for possible constants we want to limit these to at least 6\n    // characters\n    funcMatches.push(/^(\\s+)(\\w{12,90})(:\\s([\\(\\w][^,;]+),?)/gm);\n    \n    funcMatches.forEach((funcMatch) => {\n        var matches = funcMatch.exec(parsedFile.src);\n        while (matches != null) {\n            var value = matches[0];\n            var prefix = matches[1];\n            var name = matches[2];\n            var trailType = matches[4] || \"\";\n\n            var canAdd = name && name.length > 3;\n            if (canAdd) {\n                if (ignoreConst.indexOf(name) !== -1) {\n                    canAdd = false;\n                }\n\n                if (canAdd && prefix && prefix.startsWith(\"..\")) {\n                    // Looks like the spread operator \"...\" was probably used\n                    canAdd = false;\n                }\n\n                if (canAdd && prefix && prefix.endsWith(\"?\")) {\n                    // looks like a potential xxx?.yyy\n                    canAdd = false;\n                }\n\n                if (canAdd && prefix) {\n                    for (var lp = 0; lp < ignoreNames.length; lp++) {\n                        if (ignoreNames[lp].test(prefix)) {\n                            canAdd = false;\n                            break;\n                        }\n                    }\n                }\n\n                var found = 0;\n                if (canAdd) {\n                    var idx = matches.index;\n                    while(idx > 0 && parsedFile.src[idx-1] !== \"\\n\") {\n                        found++;\n                        idx --;\n                    }\n    \n                    var endIdx = matches.index + matches[0].length;\n                    while (endIdx < parsedFile.src.length && parsedFile.src[endIdx] !== \"\\n\") {\n                        endIdx++;\n                    }\n\n                    var theLine = parsedFile.src.substring(idx, endIdx);\n                }\n\n                if (trailType) {\n                    // Don't change lines that are using an imported type or look like a parameter / interface definition\n                    canAdd = canAdd && !isIgnoreType(parsedFile, trailType, ignoreNames);\n                }\n                \n                // Don't change commented lines or if the line has been tagged to skip\n                canAdd = canAdd && !isIgnoreLine(theLine, found, value.length);\n                if (canAdd) {\n                    addConstantValue(theNames, name, 1);\n                }\n            }\n\n            matches = funcMatch.exec(parsedFile.src);\n        }\n    });\n}\n\nvar dynamicIndex = 0;\nfunction createDynamicName(value, isDupe) {\n    var newName = \"_DYN_\";\n    var lastUpper = false;\n\n    for (var lp = 0; lp < value.length && newName.length < 27; lp++) {\n        var ch = value[lp];\n        if (/[A-Z]/.test(ch)) {\n            if (!lastUpper) {\n                newName += \"_\";\n            }\n\n            lastUpper = true;\n        } else {\n            lastUpper = false;\n        }\n\n        newName += ch;\n    }\n\n    if (isDupe || !value.length || newName.length > 25) {\n        newName = newName.substring(0, 25) + (dynamicIndex++);\n    }\n\n    return newName.toUpperCase();\n}\n\nfunction minifyNamesFn(grunt) {\n\n    function loadEnumNamesFromSource(theOptions, theReplacements, inputFile, importAlias) {\n        var fullName = resolvePath(theOptions, inputFile);\n        if (fs.existsSync(fullName)) {\n            grunt.log.verbose.writeln(\"Reading Name Map - \" + fullName);\n            var orgSrc = fs.readFileSync(fullName, \"utf8\");\n        \n            readSourceMap(theReplacements, orgSrc, importAlias);\n        } else {\n            grunt.log.verbose.warn((\"Missing - \" + fullName).yellow);\n        }\n    }\n\n    function loadValueMapNamesFromSource(theOptions, theReplacements, inputFile, importAlias) {\n        var fullName = resolvePath(theOptions, inputFile);\n        if (fs.existsSync(fullName)) {\n            grunt.log.verbose.writeln(\"Reading Value Map - \" + fullName);\n            var orgSrc = fs.readFileSync(fullName, \"utf8\");\n        \n            readSourceValueMap(theReplacements, orgSrc, importAlias);\n        } else {\n            grunt.log.verbose.warn((\"Missing - \" + fullName).yellow);\n        }\n    }\n\n    function loadInternalConstantsFromSource(theOptions, theReplacements, inputFile) {\n        var fullName = resolvePath(theOptions, inputFile);\n        if (fs.existsSync(fullName)) {\n            grunt.log.verbose.writeln(\"Reading Internal Constants - \" + fullName);\n            var orgSrc = fs.readFileSync(fullName, \"utf8\");\n            var from = inputFile.replace(/\\.ts$/, \"\");\n            readInternalConstants(theReplacements, orgSrc, from);\n        } else {\n            grunt.log.verbose.warn((\"Missing - \" + fullName).yellow);\n        }\n    }\n    \n    function identifyConstantEnums(parsedFile, autoConstEnums, ignoreNames) {\n        var constEnumRegEx = /const\\s+enum\\s+(\\w+)/gm;\n\n        var matches = constEnumRegEx.exec(parsedFile.src);\n        while (matches != null) {\n            var found = false;\n            var value = matches[1];\n            if (value) {\n                var found = 0;\n                var idx = matches.index;\n                while(idx > 0 && parsedFile.src[idx-1] !== \"\\n\") {\n                    found++;\n                    idx --;\n                }\n    \n                var endIdx = matches.index + matches[0].length;\n                while (endIdx < parsedFile.src.length && parsedFile.src[endIdx] !== \"\\n\") {\n                    endIdx++;\n                }\n\n                var theLine = parsedFile.src.substring(idx, endIdx);\n                var canAdd = !isInQuoteOrComment(theLine, found);\n\n                // if (value === \"type\") {\n                //     console.log(\" @ \" + found + \" => \" + canAdd + \"\\n >>\" + theLine + \"<<\");\n                // }\n                if (canAdd) {\n                    if (autoConstEnums.indexOf(value) === -1) {\n                        grunt.log.verbose.writeln(\"Adding: \" + value);\n                        autoConstEnums.push(value);\n                    }\n    \n                    for (var lp = 0; lp < ignoreNames.length; lp++) {\n                        if (ignoreNames[lp].source === value) {\n                            found = true;\n                            break;\n                        }\n                    }\n        \n                    if (!found) {\n                        ignoreNames.push(_createEnumWildcardRegEx(value));\n                    }\n                }\n            }\n\n            matches = constEnumRegEx.exec(parsedFile.src);\n        }\n    }\n\n    function getAutoMinifyPath(theOptions) {\n        var paths = [\n            \"../.aiAutoMinify.json\",\n            \"../../.aiAutoMinify.json\"\n        ];\n\n        for (var lp = 0; lp < paths.length; lp++) {\n            var filename = resolvePath(theOptions, paths[lp]);\n            if (fs.existsSync(filename)) {\n                grunt.log.verbose.writeln(\"Found: \" + filename);\n                return filename;\n            }\n        }\n\n        return null;\n    }\n\n    function mergePersistentValues(theOptions, autoConstEnums) {\n        if (autoConstEnums) {\n            autoConstEnums.forEach((value) => {\n                var found = false;\n                for (var lp = 0; lp < theOptions.ignoreNames.length; lp++) {\n                    if (theOptions.ignoreNames[lp].source === value) {\n                        found = true;\n                        break;\n                    }\n                }\n    \n                if (!found) {\n                    grunt.log.verbose.writeln(\"Ignoring: \" + value);\n                    theOptions.ignoreNames.push(_createEnumWildcardRegEx(value));\n                }\n            });\n        }\n    }\n\n    function loadPersistentValues(theOptions) {\n        var pkg = grunt.file.readJSON(resolvePath(theOptions, \"./package.json\"));\n        var packageName = pkg[\"name\"];\n\n        theOptions.autoConstEnums = [];\n        var autoMinifyFilename = getAutoMinifyPath(theOptions);\n        if (autoMinifyFilename) {\n            let retry = 0;\n            while(retry < 3) {\n                try {\n                    var autoMinifyTxt = fs.readFileSync(autoMinifyFilename);\n                    if (autoMinifyTxt) {\n                        var autoMinify = JSON.parse(autoMinifyTxt);\n                        autoMinify.pkgs = autoMinify.pkgs || {};\n                        var packageDetails = autoMinify.pkgs[packageName] = autoMinify.pkgs[packageName] || {};\n            \n                        mergePersistentValues(theOptions, packageDetails.constEnums);\n                        packageDetails.constEnums = [];\n    \n                        if (pkg.dependencies) {\n                            var names = Object.keys(pkg.dependencies) || [];\n                            names.forEach((name) => {\n                                if (name.startsWith(\"@microsoft\")) {\n                                    if (autoMinify.pkgs[name]) {\n                                        mergePersistentValues(theOptions, autoMinify.pkgs[name].constEnums);\n                                    }\n                                }\n                            });\n                        }\n                    }\n                    break;\n                } catch (e) {\n                    console.log(\" ** Sleeping -- Error: \" + e);\n                    retry ++;\n                    // Cross-platform sleep: use timeout on Windows, sleep on Unix\n                    child_process.execSync(process.platform === \"win32\" ? \"timeout /t 1 /nobreak >nul\" : \"sleep 1\", { shell: true, stdio: \"ignore\" });\n                }\n            }\n        }\n    }\n\n    function savePersistentValues(theOptions) {\n        var pkg = grunt.file.readJSON(resolvePath(theOptions, \"./package.json\"));\n        var packageName = pkg[\"name\"];\n\n        var autoMinifyFilename = getAutoMinifyPath(theOptions);\n        if (autoMinifyFilename) {\n            var autoMinify = grunt.file.readJSON(autoMinifyFilename);\n            if (!autoMinify) {\n                autoMinify = {};\n            }\n            autoMinify.pkgs = autoMinify.pkgs || {};\n            var packageDetails = autoMinify.pkgs[packageName] = autoMinify.pkgs[packageName] || {};\n            packageDetails.constEnums = theOptions.autoConstEnums || []\n\n            fs.writeFileSync(autoMinifyFilename, JSON.stringify(autoMinify, null, 4))\n        }\n    }\n\n    function generateInternalConstants(theOptions) {\n    \n        var generatedFilename = resolvePath(theOptions, theOptions.generatedConstantFile).replace(/\\\\/g, \"/\");\n\n        var theNames = [];\n    \n        if (Array.isArray(theOptions.internalConstants)) {\n            var internalConstants = [];\n            theOptions.internalConstants.forEach((value) => {\n                loadInternalConstantsFromSource(theOptions, internalConstants, value);\n            });\n\n            internalConstants.forEach((value) => {\n                value.names.forEach((theValue) => {\n                    addConstantValue(theNames, theValue, 0)\n                });\n            });\n        }\n    \n        var sourcePath = resolvePath(theOptions, theOptions.src);\n        const files = globby.sync(sourcePath.replace(/\\\\/g, \"/\"));\n        grunt.log.verbose.writeln(\"Files: \" + files.length);\n        files.map((inputFile) => {\n            grunt.log.verbose.writeln(\"Reading - \" + inputFile);\n            var orgSrc = fs.readFileSync(inputFile, \"utf8\");\n    \n            var parsedFile = parseFile(inputFile, orgSrc);\n            identifyConstantEnums(parsedFile, theOptions.autoConstEnums, theOptions.ignoreNames);\n\n            if (orgSrc.indexOf(\" @skip-file-minify\") === -1) {\n                findPossibleFileConstants(parsedFile, theNames, theOptions.ignoreConst, theOptions.ignoreNames);\n            }\n        });\n\n        var newValues = [];\n        theNames.forEach((name) => {\n            if (name.type === 1) {\n                var used = name.value.length * name.count;\n                var definition = 18 + name.value.length;\n\n                if (definition < used) {\n                    grunt.log.verbose.writeln(\"Possible Savings for [\" + name.value + \"] (\" + name.count + \") -- \" + (used - definition));\n                    newValues.push(name);\n                } else {\n                    grunt.log.verbose.writeln(\"Not Enough Usage [\" + name.value + \"] (\" + name.count + \") -- \" + (definition - used));\n                }\n            }\n        });\n\n        if (newValues.length > 0) {\n            var generatedConstants = AutoGeneratedConstFile;\n\n            let added = [];\n            newValues.forEach((name) => {\n                if (name) {\n                    let dupCheckValue = name.value.toUpperCase();\n                    generatedConstants += \"export const \" + createDynamicName(name.value, added.indexOf(dupCheckValue) !== -1) + \" = \\\"\" + name.value + \"\\\";  // Count: \" + name.count + \"\\r\\n\";\n                    added.push(dupCheckValue);\n                }\n            });\n\n            grunt.log.verbose.writeln(\"Generated Constants File: \" + sourcePath);\n            fs.writeFileSync(generatedFilename, generatedConstants);\n        } else if (fs.existsSync(generatedFilename)) {\n            // Delete the generated file\n            fs.unlinkSync(generatedFilename);\n        }\n\n        return generatedFilename;\n    }\n    \n    grunt.registerMultiTask(\"ai-minify\", \"Application Insights function minifier\", function() {\n        var result = true;\n        try {\n            const options = this.options({});\n            const taskOptions = getGruntMultiTaskOptions(grunt, this);\n    \n            const ignoreNames = resolveValue(taskOptions.ignoreNames, options.ignoreNames, defaultIgnoreNames);\n            var ignoreRegExNames = [];\n            ignoreNames.forEach((value) => {\n                ignoreRegExNames.push(_createEnumWildcardRegEx(value));\n            });\n\n            const theOptions = {\n                debug: resolveValue(taskOptions.debug, options.debug, false),\n                projectRoot: resolveValue(taskOptions.projectRoot, options.projectRoot, \".\"),\n                src: resolveValue(taskOptions.src, options.src, \"./src/**/*.ts\"),\n                replaceNames: resolveValue(taskOptions.replaceNames, options.replaceNames, []),\n                testOnly: resolveValue(taskOptions.testOnly, options.testOnly, false),\n                restore: resolveValue(taskOptions.restore, options.restore, false),\n                ext: resolveValue(taskOptions.tstExt, options.tstExt, \"\"),\n                maxImportWidth: resolveValue(taskOptions.maxImportWidth, options.maxImportWidth, MAX_IMPORT_LENGTH),\n                nameMaps: resolveValue(taskOptions.nameMaps, options.nameMaps, defaultReplace),\n                internalConstants: resolveValue(taskOptions.internalConstants, options.internalConstants, defaultInternalConstants),\n                valueMaps: resolveValue(taskOptions.valueMaps, options.valueMaps, defaultReplace),\n                generatedConstantFile: resolveValue(taskOptions.generatedConstantFile, options.generatedConstantFile, defaultGeneratedConstantFile),\n                ignoreConst: resolveValue(taskOptions.ignoreConst, options.ignoreConst, defaultIgnoreConst),\n                ignoreNames: ignoreRegExNames\n            };\n\n            if (theOptions.debug) {\n                grunt.log.verbose.writeln((\" Options: [\" + dumpObj(options) + \"]\").cyan);\n                grunt.log.verbose.writeln((\" Config : [\" + dumpObj(this.data) + \"]\").cyan);\n                grunt.log.verbose.writeln((\" Resolved: [\" + dumpObj(theOptions) + \"]\").cyan);\n            }\n    \n            if (!Array.isArray(theOptions.replaceNames)) {\n                throw \"The replaceNames must be an array! - \" + dumpObj(theOptions.replaceNames);\n            }\n\n            if (theOptions.internalConstants && !Array.isArray(theOptions.internalConstants)) {\n                throw \"The internalConstants must be an array! - \" + dumpObj(theOptions.internalConstants);\n            }\n\n            var generatedConstants = null;\n            if (!theOptions.restore) {\n\n                loadPersistentValues(theOptions);\n\n                // Generate the internal constants\n                generatedConstants = generateInternalConstants(theOptions);\n                if (generatedConstants) {\n                    grunt.log.verbose.writeln(\"Generated file: \" + theOptions.generatedConstantFile);\n                    loadInternalConstantsFromSource(theOptions, theOptions.replaceNames, theOptions.generatedConstantFile);\n                }\n            }\n\n            if (Array.isArray(theOptions.internalConstants)) {\n                theOptions.internalConstants.forEach((value) => {\n                    loadInternalConstantsFromSource(theOptions, theOptions.replaceNames, value);\n                });\n            }\n\n            if (Array.isArray(theOptions.nameMaps)) {\n                theOptions.nameMaps.forEach((value) => {\n                    loadEnumNamesFromSource(theOptions, theOptions.replaceNames, value.src, value.import);\n                });\n            }\n\n            if (Array.isArray(theOptions.valueMaps)) {\n                theOptions.nameMaps.forEach((value) => {\n                    loadValueMapNamesFromSource(theOptions, theOptions.replaceNames, value.src, value.import);\n                });\n                                \n            }\n\n            grunt.log.verbose.writeln(\"Names: \" + JSON.stringify(theOptions.replaceNames));\n\n            var sourcePath = resolvePath(theOptions, theOptions.src);\n            grunt.log.verbose.writeln(\"Project Root: \" + theOptions.projectRoot);\n            grunt.log.verbose.writeln(\"Project Src : \" + theOptions.src);\n            grunt.log.verbose.writeln(\"Source Path : \" + sourcePath);\n\n            const files = globby.sync(sourcePath.replace(/\\\\/g, \"/\"));\n            grunt.log.verbose.writeln(\"Files: \" + files.length);\n            files.map((inputFile) => {\n                grunt.log.verbose.writeln(\"Reading - \" + inputFile);\n                var orgSrc = fs.readFileSync(inputFile, \"utf8\");\n        \n                try {\n                    if (orgSrc.indexOf(\" @skip-file-minify\") === -1) {\n                        grunt.log.verbose.writeln(\"Processing - \" + inputFile);\n                        var parsedFile = parseFile(inputFile, orgSrc);\n            \n                        for (var lp = 0; lp < theOptions.replaceNames.length; lp++) {\n                            var replaceValues = theOptions.replaceNames[lp];\n                            if (replaceValues) {\n                                if (!theOptions.restore) {\n                                    replaceNames(parsedFile, theOptions, replaceValues);\n                                } else {\n                                    reverseNames(parsedFile, replaceValues);\n                                }\n                            }\n                        }\n                \n                        if (theOptions.restore) {\n                            // Auto reverse names\n                            autoReverseNames(parsedFile);                            \n                        }\n\n                        // remove unused imports\n                        removeUnusedImports(parsedFile);\n            \n                        var src = formatFile(parsedFile, theOptions.maxImportWidth);\n                        if (orgSrc !== src && orgSrc.trim() !== src.trim()) {\n                            if (!theOptions.testOnly) {\n                                // Rewrite the file\n                                fs.writeFileSync(inputFile + theOptions.ext, src);\n                            }\n                        } else {\n                            grunt.log.verbose.writeln((\" -- Not changed\").cyan);\n                        }\n                    } else {\n                        grunt.log.verbose.writeln(\"Skipped - \" + inputFile);\n                    }\n                } catch (e) {\n                    grunt.log.error((\"!!!Error processing [\" + inputFile + \"] - \" + dumpObj(e)).red);\n                    result = false;\n                }\n            });\n\n            if (result && !theOptions.restore) {\n                savePersistentValues(theOptions);\n            }\n        } catch (e) {\n            grunt.log.error((dumpObj(e)).red);\n            result = false;\n        } finally {\n        }                    \n\n        return result;\n    });\n}\n\nmodule.exports = minifyNamesFn;\n"
  },
  {
    "path": "tools/grunt-tasks/qunit.js",
    "content": "/*\n * grunt-contrib-qunit\n * https://gruntjs.com/\n *\n * Copyright (c) 2016 \"Cowboy\" Ben Alman, contributors\n * Licensed under the MIT license.\n */\n\n'use strict';\n\n// Nodejs libs.\nvar fs = require('fs');\nvar path = require('path');\nvar url = require('url');\nvar EventEmitter = require('eventemitter2');\n// NPM libs.\nvar puppeteer = require('puppeteer');\n\nvar Promise = global.Promise;\n\n// From -  https://github.com/sindresorhus/p-each-series/blob/main/index.js\nasync function pEachSeries(iterable, iterator) {\n\tlet index = 0;\n\n\tfor (const value of iterable) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst returnValue = await iterator(await value, index++);\n\n\t\tif (returnValue === pEachSeries.stop) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn iterable;\n};\n\npEachSeries.stop = Symbol('pEachSeries.stop');\n// -----------------------------------------------------------------\n\n// Shared functions\n\n// Allow an error message to retain its color when split across multiple lines.\nfunction formatMessage (message) {\n  var str = String(message);\n  if (typeof message === 'object' && /^\\[object .*\\]$/.test(str)) {\n    // try to use the JSON as a better string representation\n    try {\n      str = JSON.stringify(message, null, 2);\n    } catch ( _ ) {\n    }\n  }\n  return String(str).split('\\n')\n    .map(function(s) {\n      return s.magenta;\n    })\n    .join('\\n');\n}\n\n\nfunction createRunEnd () {\n  return {\n    status: 'passed',\n    testCounts: {\n      passed: 0,\n      failed: 0,\n      skipped: 0,\n      todo: 0,\n      total: 0\n    },\n    runtime: 0\n  };\n}\n\nfunction combineRunEnd(combined, runEnd) {\n  if (runEnd.status === 'failed') {\n    combined.status = runEnd.status;\n  }\n  combined.testCounts.passed += runEnd.testCounts.passed;\n  combined.testCounts.failed += runEnd.testCounts.failed;\n  combined.testCounts.skipped += runEnd.testCounts.skipped;\n  combined.testCounts.todo += runEnd.testCounts.todo;\n  combined.testCounts.total += runEnd.testCounts.total;\n  combined.runtime += runEnd.runtime;\n}\n\nfunction generateMessage(combined) {\n  return [\n    combined.testCounts.total,\n    ' tests completed in ',\n    combined.runtime,\n    'ms, with ',\n    combined.testCounts.failed,\n    ' failed, ' +\n    combined.testCounts.skipped,\n    ' skipped, and ',\n    combined.testCounts.todo,\n    ' todo.'\n  ].join('');\n}\n\n// Copied from QUnit source code\nfunction generateHash (module) {\n  var hex;\n  var i = 0;\n  var hash = 0;\n  var str = module + '\\x1C' + 'undefined';\n  var len = str.length;\n\n  for (; i < len; i++) {\n    hash = ((hash << 5) - hash) + str.charCodeAt(i);\n    hash |= 0;\n  }\n\n  // Convert the possibly negative integer hash code into an 8 character\n  // hex string, which isn't strictly necessary but increases user understanding\n  // that the id is a SHA-like hash\n  hex = (0x100000000 + hash).toString(16);\n  if (hex.length < 8) {\n    hex = '0000000' + hex;\n  }\n\n  return hex.slice(-8);\n}\n\nfunction getPath(url) {\n  if (url.substr( 0, 7 ) === 'http://' || url.substr( 0, 8 ) === 'https://') {\n    return url;\n  }\n\n  return 'file://' + path.resolve(process.cwd(), url);\n}\n\nmodule.exports = function(grunt) {\n\n  var eventBus = new EventEmitter({wildcard: true, maxListeners: 0});\n\n  // Keep track of the last-started module and test. Additionally, keep track\n  // of status for individual test files and the entire test suite.\n  var options;\n  var combinedRunEnd;\n  var failureBuffer = [];\n  var browser;\n  var page;\n\n  // Get an asset file, local to the root of the project.\n  var asset = path.join.bind(null, __dirname, '..');\n\n  // If options.force then log an error, otherwise exit with a warning\n  function warnUnlessForced (message) {\n    if (options && options.force) {\n      grunt.log.error(message);\n    } else {\n      grunt.warn(message);\n    }\n  }\n\n  function formatFailedAssertion(error) {\n    var failure = '' +\n      'Message: ' + formatMessage(error.message) + '\\n' +\n      'Actual: ' + formatMessage(error.actual) + '\\n' +\n      'Expected: ' + formatMessage(error.expected);\n    if (error && error.stack) {\n      failure += '\\n' + error.stack.replace(/^\\s+(at) /g, '  $1 ');\n    }\n    return failure;\n  }\n\n\n  // QUnit hooks.\n  eventBus.on('qunit.on.testStart', function(testStart) {\n    var name = testStart.fullName.join(' > ');\n    grunt.verbose.write(name + '...');\n  });\n\n  eventBus.on('qunit.on.testEnd', function(testEnd) {\n    var testPassed = (testEnd.status !== 'failed');\n    if (testPassed) {\n      // plainly \"passed\", or \"skipped\", or expected-failing \"todo\".\n      //\n      // Either complete the verbose testStart line, or continue dot progress.\n      grunt.verbose.ok().or.write('.');\n      return;\n    }\n    if (options && options.summaryOnly) {\n      return;\n    }\n\n    var failure;\n    if (testEnd.status === 'todo') {\n      failure = 'Expected at least one failing assertion in todo test';\n    } else {\n      failure = testEnd.errors.map(formatFailedAssertion).join('\\n');\n    }\n\n    if (grunt.option('verbose')) {\n      grunt.log.error();\n      grunt.log.error(failure);\n    } else {\n      var name = testEnd.fullName.join(' > ');\n      failureBuffer.push(name + '\\n' + failure);\n      grunt.log.write('F'.red);\n    }\n  });\n\n  eventBus.on('qunit.on.runEnd', function(runEnd) {\n    if (!grunt.option('verbose')) {\n      // End the non-verbose dot progress line\n      if (runEnd.status === 'failed') {\n        grunt.log.writeln();\n      } else {\n        grunt.log.ok();\n      }\n    }\n    if (failureBuffer.length) {\n      grunt.log.error(failureBuffer.join('\\n'));\n      failureBuffer.length = 0;\n    }\n\n    combineRunEnd(combinedRunEnd, runEnd);\n  });\n\n  // Re-broadcast qunit events on grunt.event.\n  eventBus.on('qunit.**', function() {\n    var args = [this.event].concat(grunt.util.toArray(arguments));\n    grunt.event.emit.apply(grunt.event, args);\n  });\n\n  // Built-in error handlers.\n  eventBus.on('fail.load', function(url) {\n    grunt.verbose.write('...');\n    grunt.event.emit('qunit.fail.load', url);\n    grunt.log.error('Chrome unable to load \\'' + url + '\\' URI.');\n\n    combinedRunEnd.status = 'failed';\n  });\n\n  eventBus.on('fail.timeout', function() {\n    grunt.log.writeln();\n    grunt.event.emit('qunit.fail.timeout');\n    grunt.log.error('Chrome timed out, possibly due to:\\n' +\n        '- QUnit is not loaded correctly.\\n- A missing QUnit start() call.\\n' +\n        '- Or, a misconfiguration of this task.');\n\n    combinedRunEnd.status = 'failed';\n  });\n\n  eventBus.on('error.onError', function (msg) {\n    // It is the responsibility of QUnit to ensure a run is marked as failure\n    // if there are (unexpected) messages received from window.onerror.\n    //\n    // Prior to QUnit 2.17, details of global failures were printed by\n    // creating a fake test with \"testEnd\" event. Now, it is our responsiblity\n    // to print these, via browser-level pageerror or `QUnit.on('error')`.\n    grunt.log.writeln();\n    if (msg) {\n      grunt.log.error(msg.stack || msg);\n    } else {\n      grunt.log.error(new Error('Unknown error'));\n    }\n    grunt.event.emit('qunit.error.onError', msg);\n  });\n\n  grunt.registerMultiTask('qunit', 'Run QUnit tests in Headless Chrome.', function() {\n    // Chrome sandbox is incompatible with Docker and most CI environments\n    var defaultChromiumArgs = (\n      process.env.CHROMIUM_FLAGS || (process.env.CI ? '--no-sandbox' : '')\n    ).split(' ');\n\n    // Merge task-specific and/or target-specific options with these defaults.\n    options = this.options({\n      // Default Chrome timeout.\n      timeout: 5000,\n      // QUnit-Chrome bridge file to be injected.\n      inject: asset('grunt-tasks/chrome/bridge.js'),\n      // Explicit non-file URLs to test.\n      urls: [],\n      force: false,\n      // Connect Chrome console output to Grunt output\n      console: true,\n      // Do not use an HTTP base by default\n      httpBase: false,\n      summaryOnly: false\n    });\n    var puppeteerLaunchOptions = Object.assign(\n      {\n        headless: 'new',\n        args: defaultChromiumArgs\n      },\n      options.puppeteer\n    );\n\n    // This task is asynchronous.\n    var done = this.async();\n    var urls;\n\n    // Read the content of the specified bridge files\n    var bridgeFiles = Array.isArray(options.inject) ? options.inject : [options.inject];\n    var bridgContents = [\n      \"__grunt_contrib_qunit_timeout__ = \" + JSON.stringify( options.timeout ) + \";\"\n    ];\n\n    for (var i = 0; i < bridgeFiles.length; i++) {\n      try {\n        bridgContents.push(fs.readFileSync(bridgeFiles[i], 'utf8'));\n      } catch (err) {\n        grunt.fail.fatal('Could not load the specified Chrome/QUnit bridge file: ' + bridgeFiles[i]);\n      }\n    }\n\n    if (options.httpBase) {\n      // If URLs are explicitly referenced, use them still\n      urls = options.urls;\n      // Then create URLs for the src files\n      this.filesSrc.forEach(function(testFile) {\n        urls.push(options.httpBase + '/' + testFile);\n      });\n    } else {\n      // Combine any specified URLs with src files.\n      urls = options.urls.concat(this.filesSrc);\n    }\n\n    // The final tasks to run before terminating the task\n    function finishTask(success) {\n      function closeBrowserWithTimeout(timeoutMs) {\n        return new Promise(function(resolve) {\n          var resolved = false;\n          \n          // Set a timeout to force resolve if browser.close() hangs\n          var timeout = setTimeout(function() {\n            if (!resolved) {\n              resolved = true;\n              grunt.log.warn('Browser close timed out after ' + timeoutMs + 'ms, forcing completion');\n              // Try to force kill the browser process\n              if (browser && browser.process()) {\n                try {\n                  browser.process().kill('SIGKILL');\n                } catch (e) {\n                  // Ignore kill errors\n                }\n              }\n              resolve();\n            }\n          }, timeoutMs);\n          \n          if (browser) {\n            browser.close().then(function() {\n              if (!resolved) {\n                resolved = true;\n                clearTimeout(timeout);\n                resolve();\n              }\n            }).catch(function(e) {\n              if (!resolved) {\n                resolved = true;\n                clearTimeout(timeout);\n                grunt.log.error('Error closing browser: ' + e);\n                resolve();\n              }\n            });\n          } else {\n            resolved = true;\n            clearTimeout(timeout);\n            resolve();\n          }\n        });\n      }\n      \n      // Close browser with 10 second timeout\n      closeBrowserWithTimeout(10000).then(function() {\n        done(success);\n      });\n    }\n\n    function appendToUrls (queryParam, value) {\n      // Append the query param to all urls\n      urls = urls.map(function(testUrl) {\n        var parsed = url.parse(testUrl, true);\n        parsed.query[queryParam] = value;\n        delete parsed.search;\n        return url.format(parsed);\n      });\n    }\n\n    if (options.noGlobals) {\n      // Append a noglobal query string param to all urls\n      appendToUrls('noglobals', 'true');\n    }\n\n    if (grunt.option('modules')) {\n      var modules = grunt.option('modules').split(',');\n      var hashes = modules.map(function(module) {\n        return generateHash(module.trim());\n      });\n      // Append moduleId to all urls\n      appendToUrls('moduleId', hashes);\n    }\n\n    if (grunt.option('seed')) {\n      // Append seed to all urls\n      appendToUrls('seed', grunt.option('seed'));\n    }\n\n    // Reset combined data.\n    combinedRunEnd = createRunEnd();\n\n    // Instantiate headless browser\n    puppeteer.launch(puppeteerLaunchOptions)\n      .then(function(b) {\n        browser = b;\n        return b.newPage();\n      })\n      .then(function(p) {\n        page = p;\n        // emit events published in bridge.js.\n        // This function exposure survives url navigations.\n        return page.exposeFunction('__grunt_contrib_qunit__', function() {\n          eventBus.emit.apply(eventBus, [].slice.call(arguments));\n        });\n      })\n      .then(function() {\n        // Pass through the console logs if instructed\n        if (options.console) {\n          page.on('console', function(msg) {\n            // The `msg` is a puppeteer.ConsoleMessage, which represents the console call\n            // including multple arguments passed to it.\n            //\n            // msg.text() formats the arguments into a naive newline-joined string, and\n            // includes error objects as a useless \"JSHandle@error\".\n            //\n            // msg.args() returns a JSHandle object for each argument, but all its\n            // evaluation features happen asynchronously via the browser, and in this\n            // event handler we can't await those easily as the grunt output will have\n            // moved on to other tests. If we want to print these, we'd have to refactor\n            // this so pEachSeries() below is aware of async code here. For now, we just\n            // let the useless \"JSHandle\" through and rely on developers to stringify any\n            // useful information ahead of time, e.g. `console.warn(String(err))`.\n            //\n            // Ref https://pptr.dev/#?product=Puppeteer&version=v9.0.0&show=api-class-consolemessage\n            var colors = {\n              'error': 'red',\n              'warning': 'yellow'\n            };\n            var txt = msg.text();\n            var color = colors[msg.type()];\n            grunt.log.writeln(color ? txt[color] : txt);\n            // grunt.log.writeln(`${msg.location().url}:${msg.location().lineNumber}`.gray); // debug\n          });\n        }\n\n        // Surface uncaught exceptions\n        // Ref https://pptr.dev/#?product=Puppeteer&version=v9.0.0&show=api-event-pageerror\n        page.on('pageerror', function(err) {\n          eventBus.emit('error.onError', err);\n        });\n\n        // Whenever a page is loaded with a new document, before scripts execute, inject the bridge file.\n        // Tell the client that when DOMContentLoaded fires, it needs to tell this\n        // script to inject the bridge. This should ensure that the bridge gets\n        // injected before any other DOMContentLoaded or window.load event handler.\n        page.evaluateOnNewDocument('if (window.QUnit) {\\n' + bridgContents.join(\";\") + '\\n} else {\\n' + 'document.addEventListener(\"DOMContentLoaded\", function() {\\n' + bridgContents.join(\";\") + '\\n});\\n}\\n');\n\n        return pEachSeries(urls, function(url) {\n          // Reset current module.\n          grunt.event.emit('qunit.spawn', url);\n          grunt.verbose.subhead('Testing ' + url + ' ').or.write('Testing ' + url + ' ');\n\n          return Promise.all([\n            // Setup listeners for qunit.done / fail events\n            new Promise(function(resolve, reject) {\n              eventBus.once('qunit.on.runEnd', function() { resolve(); });\n              eventBus.once('fail.*', function() { reject(url); });\n            }),\n\n            // Navigate to the url to be tested\n            page.goto(getPath(url), { timeout: options.timeout })\n          ]);\n        });\n      })\n      .then(function() {\n        // All tests have been run.\n        var message = generateMessage(combinedRunEnd);\n        var success = (combinedRunEnd.status === 'passed');\n\n        // Log results.\n        if (!success) {\n          warnUnlessForced(message);\n        } else {\n          grunt.verbose.writeln();\n          grunt.log.ok(message);\n        }\n\n        if (!success && options && options.force) {\n          success = true;\n        }\n\n        // All done!\n        finishTask(success);\n      })\n      .catch(function(err) {\n        // If anything goes wrong, terminate the grunt task\n        grunt.log.error(\"There was an error with headless chrome\");\n        grunt.fail.fatal(err);\n        finishTask(false);\n      });\n  });\n\n};\n"
  },
  {
    "path": "tools/grunt-tasks/stringReplace.js",
    "content": "const fs = require(\"fs\");\nconst chalk = require(\"chalk\");\n\nfunction _mapReplacements(replacement) {\n    return [replacement.pattern, replacement.replacement];\n}\n\nfunction readFileWithRetry(inst, filePath, retryCount, done) {\n    try {\n        let content = fs.readFileSync(filePath, \"utf8\");\n        if (retryCount > 0) {\n            inst.log.writeln(\" -- Successfully read file after \" + retryCount + \" retries: \" + filePath);\n        }\n        done(content);\n    } catch(e) {\n        if (retryCount > 5) {\n            throw \"Failed to read file after 5 retries: \" + filePath + \" Error: \" + e;\n        }\n\n        inst.log.writeln(\" -- (Retrying\" + (retryCount + 1) + \") Error reading file: \" + filePath + \" Error: \" + e);\n        setTimeout(() => {\n            readFileWithRetry(inst, filePath, retryCount + 1, done);\n        }, 50);\n    }\n}\n\nfunction writeFileWithRetry(inst, filePath, content, retryCount, done) {\n    try {\n        fs.writeFileSync(filePath, content, \"utf8\");\n        if (retryCount > 0) {\n            inst.log.writeln(\" -- Successfully wrote file after \" + retryCount + \" retries: \" + filePath);\n        }\n        done();\n    } catch(e) {\n        if (retryCount > 5) {\n            throw \"Failed to write file after 5 retries: \" + filePath + \" Error: \" + e;\n        }\n\n        inst.log.writeln(\" -- (Retrying:\" + (retryCount + 1) + \") Error writing file: \" + filePath + \" Error: \" + e);\n        setTimeout(() => {\n            writeFileWithRetry(inst, filePath, content, retryCount + 1, done);\n        }, 50);\n    }\n}\n\nfunction stringReplaceFn(inst) {\n\n    function _process(tasks, doWork, onDone) {\n        let lp = 0;\n    \n        function doNext(err) {\n            if (err) {\n                inst.log.error(err);\n                onDone && onDone(err);\n                doWork = null;\n                return;\n            }\n    \n            try {\n                if (doWork && tasks && lp < tasks.length) {\n                    doWork(tasks[lp++], doNext);\n                } else {\n                    onDone && onDone();\n                }\n            } catch (e) {\n                inst.log.error(e);\n                // Only call the onDone once\n                onDone && onDone(e);\n                onDone = null;\n                doWork = null;\n            }\n        }\n    \n        doNext();\n    }\n\n    function _decorateReplaceFn(replacement, src, dest) {\n        return function () {\n            inst.log.debug('running replace function with extra arguments');\n            var args = Array.prototype.slice.apply(arguments);\n            args.push(src, dest);\n            return replacement.apply(null, args);\n        };\n    }\n    \n    function _doMultiReplace(string, replacements, src, dest) {\n        return replacements.reduce(function (content, replacements) {\n            var pattern = replacements[0];\n            var replacement = replacements[1];\n    \n            if (typeof replacement === \"function\") {\n                inst.log.debug(\"replacing function with augmented one\");\n                replacement = _decorateReplaceFn(replacement, src, dest);\n            }\n    \n            return content.replace(pattern, replacement);\n        }, string);\n    }\n    \n    function _doReplace(files, replacements, options, onComplete) {\n        let newContent, dest;\n        let counter = 0;\n    \n        if (!options.hasOwnProperty(\"saveUnchanged\")) {\n            options.saveUnchanged = true;\n        } else {\n            options.saveUnchanged = !!options.saveUnchanged;\n        }\n    \n        _process(files, function (file, filesDone) {\n            _process(file.src, function (src, srcDone) {\n                inst.log.debug(\"processing file: \", src);\n    \n                if (!fs.existsSync(src)) {\n                    inst.log.writeln(\"missing file:\", src);\n                    return srcDone(src + \" file not found\");\n                }\n    \n                if (fs.statSync(src).isDirectory()) {\n                    inst.log.writeln(\"src is a folder\", src);\n                    return srcDone();\n                }\n    \n                if (file.dest[file.dest.length - 1] === \"/\") {\n                    inst.log.writeln(\"dest is a folder\");\n    \n                    if (inst.file.doesPathContain(file.dest, src)) {\n                        dest = path.join(\n                            file.dest,\n                            src.replace(file.dest, \"\")\n                        );\n                    } else {\n                        dest = path.join(file.dest, src);\n                    }\n                } else {\n                    dest = file.dest;\n                }\n    \n                dest = dest.replace(/\\\\/g, '/');\n                inst.log.writeln(\"src path :\", src);\n                inst.log.writeln(\"dest path:\", dest);\n                readFileWithRetry(inst, src, 0, function (content) {\n                    newContent =_doMultiReplace(content, replacements, src, dest);\n        \n                    if (content !== newContent || options.saveUnchanged) {\n                        writeFileWithRetry(inst, dest, newContent, 0, function () {\n                            counter += 1;\n                            inst.verbose.writeln(\"File \" + chalk.cyan(dest) + \" updated.\");\n                            srcDone();\n                        });\n\n                        return;\n                    } else {\n                        inst.log.writeln(\"File \" + chalk.cyan(dest) + \" \" + chalk.red(\"not\") + \" updated; No replacements found.\");\n                    }\n        \n                    srcDone();\n                });\n            }, filesDone);\n        }, function (err) {\n            inst.log.writeln(\"\\n\" + chalk.cyan(counter) + \" files updated\");\n            onComplete(err);\n        });\n    }\n    \n    inst.registerMultiTask(\n        \"string-replace\",\n        \"Task to Replace String values.\",\n        function () {\n            let done = this.async();\n            try {\n                let options = this.options({\n                    replacements: []\n                });\n                let replacements = options.replacements;\n                if (typeof replacements === \"function\") {\n                    replacements = replacements();\n                }\n                replacements = replacements.map(_mapReplacements);\n                _doReplace(this.files, replacements, options || {}, function (err) {\n                    if (err) {\n                        done(new Error(err));\n                    } else {\n                        done();\n                    }\n                });\n            } catch (e) {\n                inst.log.error(e);\n                done(false);\n            }\n        }\n    );\n}\n\nmodule.exports = stringReplaceFn;\n"
  },
  {
    "path": "tools/release-tools/README.md",
    "content": "# 1DS JavaScript Release Tools\n\n1DS JavaScript Release tools.\n\nThis script is used internally to both prepare a release and to automatically generate beta/nightly builds.\n\n## setVersion.js\n\nThis script is designed as a helper for setting and updating the version number used for all components, in both the package.json and versions directly embedded in the source / test files.\n\nWhen run, it will\n- Set the specified version in the version.json (which is used as the default when not specified on the command line)\n- Updates the \"version\" within EVERY package.json for all channels/extensions/shared/skus/snippets/examples\n- Updates ALL of the referenced versions for the \"@microsoft/1ds-xxx\" dependencies/peerDependencies/devDependencies, so that when rush creates references they all reference the local build.\n\nAfter running this script and the version number has changed you WILL need to also run the \"rush update\" ```npm run update``` to ensure that the dependencies and hashes identified in the npm-shrinkwrap.json are updated correctly.\n\n### When to use\n\nThere are a couple of usages for this script\n- When preparing a new release you should run the script with either an explicit version or specify the switch to automatically increment the version number\n    - ```npm run setVersion 3.2.0``` Sets the version explicitly as 3.2.0 (for ALL components), only use this if all components are on the same version.\n    - ```npm run setVersion -- -patch``` Increments version to the next patch version number x.y.[z+1] (eg. ```3.1.2``` => ```3.1.3```) This will increment the patch level based on the components current version and not the root package.json version.\n    - ```npm run setVersion -- -minor``` Increments the version to the next minor version number x.[y+1].0 (eg. ```3.1.2``` => ```3.2.0```)\n- During the build pipeline, this script will be called from with the dev-ops pipeline so that we can create an automated pipeline for generating alpha/beta/dev/nightly/release builds, with or without the current build number. This will be used to generate official \"Beta\" release generation job.\n    - Note: At this stage the version number will NOT be checked back into the repo\n\n### Example Usages\n\nNot all combinations are show, you can combine several options.\n\nGeneral help displayed when the passed arguments appear to be incorrect.\n\n```\nsetVersion.js [<newVersion>|-patch|-minor|-major] [-dev|-alpha|-beta|-release] [-bld ######] [-test]\n--------------------------\n <newVersion> - Identifies the version to set for all packages, must start with x.y.z\n -patch      - Increment the current version to the next patch number (x.y.z => x.y.[z+1]\n -minor      - Increment the current version to the next minor number (x.y.z => x.[y+1].0\n -major      - Increment the current version to the next major number (x.y.z => [x+1].0.0\n -dev        - Add the 'dev' pre-release to the number (x.y.z => x.y.z-dev)\n -alpha      - Add the 'alpha' pre-release to the number (x.y.z => x.y.z-alpha)\n -beta       - Add the 'beta' pre-release to the number (x.y.z => x.y.z-beta)\n -release    - Remove any existing pre-release tags (x.y.z-prerel => x.y.z)\n -bld ###### - Append the provided build number to the version (x.y.z => x.y.z-[prerel].######) [prerel] defaults to dev if not defined\n -pre ###### - Set the pre-release to the provided value (x.y.z => x.y.z-[prerel])\n -react      - Update only the react packages (Require as the react components need to update after the core because of the different versions of TypeScript being used.)\n -test       - Scan all of the package.json files and log the changes, but DON'T update the files\n```\n\n#### Set the version explicitly\n\nTo set the version to specific build number, just pass as one of the arguments\n\n```npm run setVersion 3.2.0```\n\n```npm run setVersion -- 3.2.0```\n\nThe ```--``` is only when passing switch arguments to the script, so when specifying an explicit version it's optional as npm will pass the argument correctly.\n\n#### Increase to the next patch level\n\n```npm run setVersion -- -patch``` (eg. ```3.1.2``` => ```3.1.3```)\n\n#### Increase to the next minor release\n\n```npm run setVersion -- -minor``` (eg. ```3.1.2``` => ```3.2.0```)\n\n#### Increase to the next major release\n\n```npm run setVersion -- -major``` (eg. ```3.1.2``` => ```4.0.0```)\n\n#### Dev Pre-release\n\nChange the current version as a ```dev``` pre-release build\n\n```npm run setVersion``` (eg. ```3.1.2``` => ```3.1.2-dev```)\n\n```npm run setVersion -- -dev``` (eg. ```3.1.2``` => ```3.1.2-dev```)\n\n#### Dev Pre-release and next patch level\n\n```npm run setVersion -- -patch -dev``` (eg. ```3.1.2``` => ```3.1.3-dev```)\n\n#### Set the version as a release version\n\nRunning this removes any current pre-release tag.\n\n```npm run setVersion -- -release``` (eg. ```3.1.2-dev``` => ```3.1.2```)\n\n#### Set as a specific pre-release\n\n```npm run setVersion -- -pre nightly``` (eg. ```3.1.2``` => ```3.1.2-nightly```)\n\n#### Add a build number to the release (implied pre-release)\n\n> Using this switch implies that the resulting version WILL be a pre-release complete with a &lt;pre-release&gt; tag. And when no &lt;pre-release&gt; is specified (dev/alpha/beta/etc) ```dev``` will be assumed and added.\n>\n> And when also used with the release switch the &lt;pre-release&gt; tag will default to ```rc```\n\nBuild numbers are added using the \".\" prefix as based on the [semver](https://semver.org/) specification the build number \"+\" does not uniquely identify or define a sequence for resolving precedence.\n\n```npm run setVersion -- -bld 20210525.1``` (eg. ```3.1.2 => 3.1.2-dev.20210525.1```)\n\n```npm run setVersion -- -bld 20210525.1 -dev``` (eg. ```3.1.2 => 3.1.2-dev.20210525.1```)\n\n```npm run setVersion -- -bld 20210525.1 -pre nightly``` (eg. ```3.1.2 => 3.1.2-nightly.20210525.1```)\n\n```npm run setVersion -- -bld 20210525.1 -release``` (eg. ```3.1.2 => 3.1.2-rc.20210525.1```)\n\n"
  },
  {
    "path": "tools/release-tools/npm_package.js",
    "content": "const fs = require(\"fs\");\nconst child_process = require(\"child_process\");\n\nconst packageGroupDef = \"./tools/release-tools/package_groups.json\";\nlet packageGroup;\nlet dropFolder;\nlet dryRun = \"\";\n\nfunction showHelp() {\n    var scriptParts;\n    var scriptName = process.argv[1];\n    if (scriptName.indexOf(\"\\\\\") !== -1) {\n        scriptParts = scriptName.split(\"\\\\\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    } else if (scriptName.indexOf(\"/\") !== -1) {\n        scriptParts = scriptName.split(\"/\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    }\n\n    console.log(\"\");\n    console.log(scriptName + \" <group> \");\n    console.log(\"--------------------------\");\n    console.log(\" <group>      - Identifies the group to publish, identifies folders, the group must be defined in package_groups.json\");\n    console.log(\" <dropFolder> - Identifies the base folder to drop the packages into, defaults to ./drop/packages/<group>\");\n}\n\nfunction parseArgs() {\n    console.log(\"Parsing args - \" + process.argv.join(\" \"));\n    if (process.argv.length < 2) {\n        console.error(\"!!! Invalid number of arguments -- \" + process.argv.length);\n        return false;\n    }\n\n    let idx = 2;\n    while (idx < process.argv.length) {\n        let theArg = process.argv[idx];\n        if (theArg.startsWith(\"-\")) {\n            if (theArg === \"-test\") {\n                dryRun = \"--dry-run\";\n            } else {\n                console.error(\"!!! Unknown switch [\" + theArg + \"] detected\");\n                return false;\n            }\n        } else if (!packageGroup) {\n            packageGroup = theArg;\n        } else if (!dropFolder) {\n            dropFolder = theArg;\n        } else {\n            console.error(\"!!! Invalid Argument [\" + theArg + \"] detected\");\n            return false;\n        }\n\n        idx++;\n    }\n\n    // Check for required arguments\n    if (!packageGroup) {\n        console.error(\"!!! Missing package group\");\n        return false;\n    }\n\n    return true;\n}\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction removeComments(text) {\n    return text.replace(/^\\s*\\/\\/\\s.*$/gm, \"\");\n}\n\nfunction getPackage(packageJsonFile) {\n    var packageText = removeTrailingComma(fs.readFileSync(packageJsonFile, \"utf-8\"));\n\n    return JSON.parse(packageText);\n}\n\nfunction getNpmPackageName(packageJson) {\n    let packageName = packageJson.name;\n    let packageVersion = packageJson.version;\n\n    let theNpmPackageName = packageName + \"-\" + packageVersion;\n\n    theNpmPackageName = theNpmPackageName.replace(\"@\", \"\").replace(\"/\", \"-\");\n\n    return theNpmPackageName + \".tgz\";\n}\n\nfunction getGroupProjects() {\n    if (!fs.existsSync(packageGroupDef)) {\n        console.error(\"!!! Unable to locate package group definitions [\" + packageGroupDef + \"]\");\n        throw new Error(\"!!! Unable to locate package group definitions.\");\n    }\n\n    var groupText = removeComments(removeTrailingComma(fs.readFileSync(packageGroupDef, \"utf-8\")));\n\n    let groupJson = JSON.parse(groupText);\n    return groupJson[packageGroup] || [];\n}\n\nfunction movePackage(npmPackageName, packageName) {\n    let packageFolder = dropFolder;\n    if (!packageFolder) {\n        packageFolder = \"./drop/packages\";\n        packageFolder += \"/\" + packageGroup;\n    }\n\n    if (!fs.existsSync(packageFolder)) {\n        fs.mkdirSync(packageFolder, { recursive: true });\n    }\n\n    let packageFile = packageFolder + \"/\" + packageName;\n    if (fs.existsSync(packageFile)) {\n        console.log(` -- Removing existing package ${packageFile}`);\n        fs.unlinkSync(packageFile);\n    }\n\n    console.log(` -- Moving ${npmPackageName} to ${packageFile}`);\n    fs.renameSync(npmPackageName, packageFile);\n}\n\nif (parseArgs()) {\n    var packages = getGroupProjects();\n\n    console.log(`Creating [${packageGroup}] packages => ${packages.length}`);\n    packages.forEach((packageRoot) => {\n        let packageJsonFile = packageRoot + \"/package.json\";\n\n        if (!fs.existsSync(packageJsonFile)) {\n            console.error(\"!!! Source package.json doesn't exist [\" + packageJsonFile + \"]\");\n            throw new Error(\"!!! Source package.json doesn't exist [\" + packageJsonFile + \"]\");\n        }\n\n        const packageJson = getPackage(packageJsonFile);\n\n        const packageName = getNpmPackageName(packageJson);\n        console.log(\"\\n\\n##################################################################\");\n        console.log(\"Packaging - \" + packageName);\n        console.log(\"##################################################################\");\n\n        let npmPackageName = packageRoot + \"/\" + packageName;\n        if (fs.existsSync(npmPackageName)) {\n            console.log(` -- Removing existing package ${npmPackageName}`);\n            fs.unlinkSync(npmPackageName);\n        }\n    \n        const cwd = process.cwd();\n        process.chdir(packageRoot);\n        try {\n            let npmCmd = `npm pack ${dryRun}`;\n            console.log(`Running: \\\"${npmCmd}\\\"`);\n            child_process.execSync(npmCmd);\n        } finally {\n            process.chdir(cwd);\n        }\n\n        if (!dryRun) {\n            // Move the package to the package folder\n            movePackage(npmPackageName, packageName);\n        }\n    });\n} else {\n    showHelp();\n    process.exit(1);\n}\n"
  },
  {
    "path": "tools/release-tools/npm_publish.js",
    "content": "const fs = require(\"fs\");\nconst child_process = require(\"child_process\");\n\nconst packageGroupDef = \"./tools/release-tools/package_groups.json\";\nlet packageGroup;\nlet dryRun = \"\";\n\nfunction showHelp() {\n    var scriptParts;\n    var scriptName = process.argv[1];\n    if (scriptName.indexOf(\"\\\\\") !== -1) {\n        scriptParts = scriptName.split(\"\\\\\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    } else if (scriptName.indexOf(\"/\") !== -1) {\n        scriptParts = scriptName.split(\"/\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    }\n\n    console.log(\"\");\n    console.log(scriptName + \" <group> \");\n    console.log(\"--------------------------\");\n    console.log(\" <group>      - Identifies the group to publish, identifies folders\");\n}\n\nfunction parseArgs() {\n    if (process.argv.length < 2) {\n        console.error(\"!!! Invalid number of arguments -- \" + process.argv.length);\n        return false;\n    }\n\n    let idx = 2;\n    while (idx < process.argv.length) {\n        let theArg = process.argv[idx];\n        if (theArg.startsWith(\"-\")) {\n            if (theArg === \"-test\") {\n                dryRun = \"--dry-run\";\n            } else {\n                console.error(\"!!! Unknown switch [\" + theArg + \"] detected\");\n                return false;\n            }\n        } else if (!packageGroup) {\n            packageGroup = theArg;\n        } else {\n            console.error(\"!!! Invalid Argument [\" + theArg + \"] detected\");\n            return false;\n        }\n\n        idx++;\n    }\n\n    // Check for required arguments\n    if (!packageGroup) {\n        console.error(\"!!! Missing package group\");\n        return false;\n    }\n\n    return true;\n}\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction removeComments(text) {\n    return text.replace(/^\\s*\\/\\/\\s.*$/gm, \"\");\n}\n\nfunction getNpmPackageName(packageJsonFile) {\n    var packageText = removeTrailingComma(fs.readFileSync(packageJsonFile, \"utf-8\"));\n\n    let packageJson = JSON.parse(packageText);\n    let packageName = packageJson.name;\n    let packageVersion = packageJson.version;\n\n    let theNpmPackageName = packageName + \"-\" + packageVersion;\n\n    theNpmPackageName = theNpmPackageName.replace(\"@\", \"\").replace(\"/\", \"-\");\n\n    return theNpmPackageName + \".tgz\";\n}\n\nfunction getGroupProjects() {\n    if (!fs.existsSync(packageGroupDef)) {\n        console.error(\"!!! Unable to locate package group definitions [\" + packageGroupDef + \"]\");\n        throw new Error(\"!!! Unable to locate package group definitions.\");\n    }\n\n    var groupText = removeComments(removeTrailingComma(fs.readFileSync(packageGroupDef, \"utf-8\")));\n\n    let groupJson = JSON.parse(groupText);\n    return groupJson[packageGroup] || [];\n}\n\nif (parseArgs()) {\n    var packages = getGroupProjects();\n\n    console.log(`Publishing [${packageGroup}] packages => ${packages.length}`);\n    packages.forEach((packageRoot) => {\n        let packageJsonFile = packageRoot + \"/package.json\";\n\n        if (!fs.existsSync(packageJsonFile)) {\n            console.error(\"!!! Source package.json doesn't exist [\" + packageJsonFile + \"]\");\n            throw new Error(\"!!! Source package.json doesn't exist [\" + packageJsonFile + \"]\");\n        }\n\n        console.log(\"\\n\\n##################################################################\");\n        console.log(\"Publishing - \" + getNpmPackageName(packageJsonFile));\n        console.log(\"##################################################################\");\n        let npmPackageName = packageRoot + \"/\" + getNpmPackageName(packageJsonFile);\n        if (!fs.existsSync(npmPackageName)) {\n            console.error(\"!!! NPM Package not found [\" + npmPackageName + \"]\");\n            throw new Error(\"!!! NPM Package not found [\" + npmPackageName + \"]\");\n        }\n        \n        console.log(`npm package present ${npmPackageName}`);\n        let npmCmd = `npm publish ${npmPackageName} --access public ${dryRun}`;\n        console.log(`Running: \\\"${npmCmd}\\\"`);\n        child_process.execSync(npmCmd);\n    });\n} else {\n    showHelp();\n    process.exit(1);\n}\n"
  },
  {
    "path": "tools/release-tools/npm_set_latest.js",
    "content": "const fs = require(\"fs\");\nconst child_process = require(\"child_process\");\n\nconst packageGroupDef = \"./tools/release-tools/package_groups.json\";\nlet packageGroup;\nlet isTest = false;\n\nfunction showHelp() {\n    var scriptParts;\n    var scriptName = process.argv[1];\n    if (scriptName.indexOf(\"\\\\\") !== -1) {\n        scriptParts = scriptName.split(\"\\\\\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    } else if (scriptName.indexOf(\"/\") !== -1) {\n        scriptParts = scriptName.split(\"/\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    }\n\n    console.log(\"\");\n    console.log(scriptName + \" <group> \");\n    console.log(\"--------------------------\");\n    console.log(\" <group>      - Identifies the group to publish, identifies folders\");\n}\n\nfunction parseArgs() {\n    if (process.argv.length < 2) {\n        console.error(\"!!! Invalid number of arguments -- \" + process.argv.length);\n        return false;\n    }\n\n    let idx = 2;\n    while (idx < process.argv.length) {\n        let theArg = process.argv[idx];\n        if (theArg.startsWith(\"-\")) {\n            if (theArg === \"-test\") {\n                isTest = true;\n            } else {\n                console.error(\"!!! Unknown switch [\" + theArg + \"] detected\");\n                return false;\n            }\n        } else if (!packageGroup) {\n            packageGroup = theArg;\n        } else {\n            console.error(\"!!! Invalid Argument [\" + theArg + \"] detected\");\n            return false;\n        }\n\n        idx++;\n    }\n\n    return true;\n}\n\nfunction removeTrailingComma(text) {\n    return text.replace(/,(\\s*[}\\],])/g, \"$1\");\n}\n\nfunction removeComments(text) {\n    return text.replace(/^\\s*\\/\\/\\s.*$/gm, \"\");\n}\n\nfunction getPackageJson(packageJsonFile) {\n    var packageText = removeTrailingComma(fs.readFileSync(packageJsonFile, \"utf-8\"));\n\n    return JSON.parse(packageText);\n}\n\nfunction getGroupProjects() {\n    if (!fs.existsSync(packageGroupDef)) {\n        console.error(\"!!! Unable to locate package group definitions [\" + packageGroupDef + \"]\");\n        throw new Error(\"!!! Unable to locate package group definitions.\");\n    }\n\n    var groupText = removeComments(removeTrailingComma(fs.readFileSync(packageGroupDef, \"utf-8\")));\n\n    let groupJson = JSON.parse(groupText);\n    return groupJson[packageGroup] || [];\n}\n\nif (parseArgs()) {\n    var packages = getGroupProjects();\n\n    console.log(`Set latest tag [${packageGroup}] packages => ${packages.length}`);\n    packages.forEach((packageRoot) => {\n        let packageJsonFile = packageRoot + \"/package.json\";\n\n        if (!fs.existsSync(packageJsonFile)) {\n            console.error(\"!!! Source package.json doesn't exist [\" + packageJsonFile + \"]\");\n            throw new Error(\"!!! Source package.json doesn't exist [\" + packageJsonFile + \"]\");\n        }\n\n        let packageJson = getPackageJson(packageJsonFile);\n\n        console.log(\"\\n\\n##################################################################\");\n        console.log(\"Setting latest tag - \" + packageJson.name);\n        console.log(\"##################################################################\");\n        \n        let npmCmd = `npm dist-tag add ${packageJson.name}@${packageJson.version} latest`;\n        console.log(`Running: \\\"${npmCmd}\\\"`);\n        if (!isTest) {\n            child_process.execSync(npmCmd);\n        }\n    });\n} else {\n    showHelp();\n    process.exit(1);\n}\n"
  },
  {
    "path": "tools/release-tools/package.json",
    "content": "{\n    \"name\": \"applicationinsights-js-release-tools\",\n    \"version\": \"3.1.3-dev\",\n    \"author\": \"Javascript Telemetry SDKs <TelReachSDK@microsoft.com>\",\n    \"description\": \"1DS Web SDK\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS\",\n    \"sideEffects\": false,\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"update\": \"rush update\",\n        \"build\": \"\",\n        \"rebuild\": \"\",\n        \"test\": \"\",\n        \"updateVer\": \"node ./tools/release-tools/updateVersion.js\"\n    },\n    \"keywords\": [\n        \"1DS\",\n        \"Js\",\n        \"SDK\"\n    ],\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/release-tools\"\n    },\n    \"devDependencies\": {\n        \"grunt\": \"^1.6.1\",\n        \"globby\": \"^11.0.0\"\n    }\n}\n"
  },
  {
    "path": "tools/release-tools/package_groups.json",
    "content": "// ------------------------------\n// NPM Publish group definitions\n// ------------------------------\n{\n    // Application Insights packages\n    \"ai\": [\n        \"./shared/AppInsightsCore\",\n        \"./shared/AppInsightsCommon\",\n        \"./AISKU\",\n        \"./AISKULight\",\n        \"./extensions/applicationinsights-analytics-js\",\n        \"./extensions/applicationinsights-properties-js\",\n        \"./extensions/applicationinsights-osplugin-js\",\n        \"./channels/applicationinsights-channel-js\",\n        \"./extensions/applicationinsights-dependencies-js\",\n        \"./extensions/applicationinsights-clickanalytics-js\",\n        \"./extensions/applicationinsights-perfmarkmeasure-js\",\n        \"./extensions/applicationinsights-debugplugin-js\",\n        \"./extensions/applicationinsights-cfgsync-js\",\n        \"./channels/tee-channel-js\",\n        \"./shared/1ds-core-js\",\n        \"./channels/1ds-post-js\",\n        \"./channels/offline-channel-js\"\n    ],\n    \"1ds\": [\n        \"./shared/1ds-core-js\",\n        \"./channels/1ds-post-js\"\n    ],\n    \"aionly\": [\n        \"./shared/AppInsightsCore\",\n        \"./shared/AppInsightsCommon\",\n        \"./AISKU\",\n        \"./AISKULight\",\n        \"./extensions/applicationinsights-analytics-js\",\n        \"./extensions/applicationinsights-properties-js\",\n        \"./extensions/applicationinsights-osplugin-js\",\n        \"./channels/applicationinsights-channel-js\",\n        \"./extensions/applicationinsights-dependencies-js\",\n        \"./extensions/applicationinsights-clickanalytics-js\",\n        \"./extensions/applicationinsights-perfmarkmeasure-js\",\n        \"./extensions/applicationinsights-debugplugin-js\",\n        \"./extensions/applicationinsights-cfgsync-js\",\n        \"./channels/tee-channel-js\",\n        \"./channels/offline-channel-js\"\n    ],\n    \"cfgSync\": [\n        \"./extensions/applicationinsights-cfgsync-js\"\n    ],\n    // Config for throttleMgr and feature Opt-in\n    \"webConfig\": [\n        \"./tools/config\"\n    ],\n    // Rollup packages\n    \"rollup-es\": [\n        \"./tools/rollup-es5\"\n    ],\n    // Shims packages\n    \"shims\": [\n        \"./tools/shims/\"\n    ],\n    // Snippet packages\n    \"snippet\": [\n        \"./tools/applicationinsights-web-snippet\"\n    ],\n    \"examples\": [\n        \"./examples/AISKU\",\n        \"./examples/cfgSync\",\n        \"./examples/dependency\",\n        \"./examples/shared-worker\"\n    ]\n}"
  },
  {
    "path": "tools/release-tools/setVersion.js",
    "content": "const fs = require(\"fs\");\nconst globby = require(\"globby\");\n\nlet newVer = null;\nlet autoInc = null;\nlet buildNum = null;\nlet preRel = null;\nlet isRelease = false;\nlet testOnly = null;\nlet updateAll = true;\nlet isOneDs = false;\n\nconst theVersion = require(process.cwd() + \"/version.json\");\nconst orgPkgVersions = {};\n\nfunction showHelp() {\n    var scriptParts;\n    var scriptName = process.argv[1];\n    if (scriptName.indexOf(\"\\\\\") !== -1) {\n        scriptParts = scriptName.split(\"\\\\\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    } else if (scriptName.indexOf(\"/\") !== -1) {\n        scriptParts = scriptName.split(\"/\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    }\n\n    console.log(\"\");\n    console.log(scriptName + \" [<newVersion>|-patch|-minor|-major|-next] [-dev|-alpha|-beta|-release] [-bld ######] [-test]\");\n    console.log(\"--------------------------\");\n    console.log(\" <newVersion> - Identifies the version to set for all packages, must start with x.y.z\");\n    console.log(\" -patch       - Increment the current version to the next patch number (x.y.z => x.y.[z+1]\");\n    console.log(\" -minor       - Increment the current version to the next minor number (x.y.z => x.[y+1].0\");\n    console.log(\" -major       - Increment the current version to the next major number (x.y.z => [x+1].0.0\");\n    console.log(\" -next        - Increment the current version to the next value (patch, minor or major) based on the 'next' value in version.json\");\n    console.log(\" -dev         - Add the 'dev' pre-release to the number (x.y.z => x.y.z-dev)\");\n    console.log(\" -alpha       - Add the 'alpha' pre-release to the number (x.y.z => x.y.z-alpha)\");\n    console.log(\" -beta        - Add the 'beta' pre-release to the number (x.y.z => x.y.z-beta)\");\n    console.log(\" -release     - Remove any existing pre-release tags (x.y.z-prerel => x.y.z)\");\n    console.log(\" -bld ######  - Append the provided build number to the version (x.y.z => x.y.z-[prerel].######) [prerel] defaults to dev if not defined\");\n    console.log(\" -pre ######  - Set the pre-release to the provided value (x.y.z => x.y.z-[prerel])\");\n    console.log(\" -1ds         - Update only the oneDs packages\");\n    console.log(\" -test        - Scan all of the package.json files and log the changes, but DON'T update the files\");\n}\n\nfunction setPreRelVer(name) {\n    if (name && name.indexOf(\"-\") !== -1) {\n        console.error(\"Invalid pre-release value -- [\" + name + \"] -- the name cannot contain a '-'\");\n        return false;\n    }\n\n    preRel = name;\n    let defaultVer = theVersion[name];\n    if (defaultVer) {\n        const idx = defaultVer.indexOf(\"-\");\n        if (idx == -1) {\n            newVer = defaultVer;\n        } else {\n            newVer = defaultVer.substring(0, idx);\n            preRel = defaultVer.substring(idx);\n        }\n\n        if (newVer) {\n            updateAll = false;      // We have mixed versions so we can't update all of them if we have a version#\n        }\n    }\n\n    return true;\n}\n\n\nfunction parseArgs() {\n    if (process.argv.length < 2) {\n        console.error(\"!!! Invalid number of arguments -- \" + process.argv.length);\n        return false;\n    }\n\n    let idx = 2;\n    while(idx < process.argv.length) {\n        let theArg = process.argv[idx];\n        if (!newVer && theArg === \"-patch\") {\n            console.log(\"Patch existing version\");\n            autoInc = \"patch\";\n        } else if (!newVer && theArg === \"-minor\") {\n            console.log(\"Increment minor existing version\");\n            autoInc = \"minor\";\n        } else if (!newVer && theArg === \"-major\") {\n            console.log(\"Increment major existing version\");\n            autoInc = \"major\";\n        } else if (!newVer && theArg === \"-next\") {\n            console.log(\"Increment existing version based on autoInc\");\n            autoInc = \"next\";\n        } else if (!isRelease && !preRel && theArg === \"-dev\") {\n            if (!setPreRelVer(\"dev\")) {\n                return false;\n            }\n        } else if (!isRelease && !preRel && theArg === \"-alpha\") {\n            preRel = \"alpha\";\n            if (!autoInc && !newVer) {\n                autoInc = \"next\";\n            } else if (!setPreRelVer(\"alpha\")) {\n                return false;\n            }\n        } else if (!isRelease && !preRel && theArg === \"-beta\") {\n            preRel = \"beta\";\n            if (!autoInc && !newVer) {\n                autoInc = \"next\";\n            } else if (!setPreRelVer(\"beta\")) {\n                return false;\n            }\n        } else if (!isRelease && !preRel && theArg === \"-release\") {\n            isRelease = true;\n            preRel = \"\";\n        } else if (!isRelease && !preRel && theArg === \"-pre\") {\n            if (!setPreRelVer(process.argv[idx + 1] || \"pre\")) {\n                return false;\n            }\n\n            idx++;\n        } else if (theArg === \"-bld\") {\n            buildNum = (process.argv[idx + 1] || \"\");\n            idx++;\n        } else if (theArg === \"-test\") {\n            testOnly = true;\n        } else if (!isRelease && !newVer && !autoInc) {\n            let theParts = theArg.split(\".\");\n            if(theParts.length < 3) {\n                console.error(\"!!! The provided version [\" + theArg + \"] appears invalid\");\n                return false;\n            }\n\n            newVer = theArg;\n            updateAll = false;      // We have mixed versions so we can't update all of them if we have a version#\n        } else if (!isOneDs && theArg === \"-1ds\") {\n            isOneDs = true;\n            updateAll = false;\n        } else {\n            console.error(\"!!! Invalid Argument [\" + theArg + \"] detected\");\n            return false;\n        }\n\n        idx ++;\n    }\n\n    if (buildNum && !preRel && !isRelease) {\n        preRel = \"dev\";\n    }\n\n    // If no version, pre-release tag or auto version increment is defined default to \"dev\" pre-release\n    if (!newVer && !autoInc && !isRelease) {\n        const newPreRel = preRel;\n        if (!setPreRelVer(\"dev\")) {\n            return false;\n        }\n\n        if (newPreRel) {\n            preRel = newPreRel;\n        }\n    }\n\n    return true;\n}\n\nfunction updateVersions() {\n    // Get the configured next release, default to \"patch\"\n    const verNext = theVersion.next = theVersion.next || \"patch\";\n    const rootVersion = require(process.cwd() + \"/package.json\");\n    let newVersion = calculateVersion(rootVersion.version, verNext);\n    if (newVersion) {\n        console.log(\"New version [\" + theVersion.release + \"] => [\" + newVersion + \"]\");\n        if (updateAll || !isOneDs) {\n            theVersion.release = newVersion;\n        }\n    }\n\n    let packages = theVersion.pkgs = theVersion.pkgs || {};\n    const keys = Object.keys(packages);\n    if (keys) {\n        for (let lp = 0; lp < keys.length; lp++) {\n            const value = keys[lp];\n\n            let packageDef = packages[value] = packages[value] || {};\n\n            if (fs.existsSync(process.cwd() + \"//\" + packageDef.package)) {\n                const thePackage = require(process.cwd() + \"//\" + packageDef.package);\n                const orgVersion = thePackage.version;\n                if (shouldUpdatePackage(value)) {\n                    orgPkgVersions[value] = orgVersion;\n                    let pkgNext = packageDef.next || verNext;\n                    packageDef.release = calculateVersion(orgVersion, pkgNext);\n                    console.log(\"  - \" + value + \":[\" + orgVersion + \"] => [\" + packages[value].release + \"]\");\n                } else {\n                    console.log(\"  - \" + value + \":[\" + orgVersion + \"] => Skipping\");\n                }\n            } else {\n                console.log(\"  - \" + value + \":[-- Missing package.json --] => Will remove package definition\");\n                delete packages[value];\n            }\n        }\n    }\n\n    return newVersion;\n}\n\nfunction getNewPackageVersion(package, packageFilename) {\n    const packageName = package.name;\n    let packages = theVersion.pkgs = theVersion.pkgs || {};\n    if (!packages[packageName]) {\n        let packageDef = packages[packageName] = packages[packageName] || {};\n        packageDef.package = packageFilename;\n\n        if (package.version) {\n            orgPkgVersions[packageName] = package.version;\n\n            // We are not currently tracking this package so calculate based on the current package.version value\n            if (shouldUpdatePackage(package.name)) {\n                packageDef.release = calculateVersion(package.version, theVersion.next);\n            } else {\n                packageDef.release = package.version;\n            }\n        } else {\n            packageDef.release = theVersion.release;\n        }\n    }\n\n    return packages[packageName].release;\n}\n\nfunction calculateVersion(rootVersion, pkgAutoInc) {\n\n    let preRelParts = (rootVersion || \"0.0.0\").split(\"-\");\n    let postfix = preRelParts.length > 1 && preRelParts[1] ? (\"-\" + preRelParts[1]) : \"\";\n    let parts = preRelParts[0].split(\".\");\n\n    if (parts.length < 3) {\n        console.error(\"!!! Package version [\" + rootVersion + \"] doesn't look correct\");\n        parts = [\"0\", \"0\", \"0\"];\n    }\n\n    let newVersion;\n\n    if (newVer) {\n        newVersion = newVer;\n        postfix = \"\";\n    } else {\n        if (autoInc !== \"next\") {\n            pkgAutoInc = autoInc;\n        }\n\n        if (pkgAutoInc == \"patch\") {\n            parts[2]++;\n        } else if (pkgAutoInc == \"minor\") {\n            parts[1]++;\n            parts[2] = 0;\n        } else if (pkgAutoInc == \"major\") {\n            parts[0]++;\n            parts[1] = 0;\n            parts[2] = 0;\n        } else if (isRelease) {\n            // Don't update the numbers just remove the preRel\n            postfix = \"\";\n        }\n\n        newVersion = parts[0] + \".\" + parts[1] + \".\" + parts[2];\n    }\n\n    if (buildNum && !buildNum.startsWith(\".\") && !buildNum.startsWith(\"+\")) {\n        buildNum = \".\" + buildNum;\n    }\n\n    if (buildNum && isRelease) {\n        preRel = \"rc\";\n    }\n\n    if (preRel) {\n        postfix = preRel;\n        if (!postfix.startsWith(\"-\")) {\n            postfix = \"-\" + preRel;\n        }\n    }\n\n    return newVersion + (postfix || \"\") + (buildNum || \"\");\n}\n\nfunction getVersionDetails(theVersion) {\n    let parts = (theVersion || \"0.0.0\").split(\"+\", 2);\n\n    let details = {\n        full: theVersion,\n        ver: parts[0],\n        bldNum: parts.length === 2 ? parts[1] : \"\"\n    }\n\n    let version = details.ver;\n    let preRelParts = version.split(\"-\", 2);\n    details.preRel = preRelParts.length === 2 ? preRelParts[1] : \"\";\n\n    let type = \"release\";\n    if (preRelParts[1]) {\n        // Remove all other possible separators\n        type = preRelParts[1].split(\".\")[0].split(\"-\")[0];\n    }\n\n    details.type = type;\n\n    return details;\n}\n\nfunction shouldUpdatePackage(name) {\n    if (name.indexOf(\"-shims\") !== -1) {\n        return false;\n    }\n\n    if (!updateAll) {\n        if (name.indexOf(\"1ds-\") !== -1) {\n            return isOneDs;\n        }\n\n        return !isOneDs;\n    }\n\n    return updateAll;\n}\n\nfunction shouldProcess(name) {\n    let updateDefPkgs = updateAll || !isOneDs;\n\n    if (name.indexOf(\"node_modules/\") !== -1) {\n        return false;\n    }\n\n    if (name.indexOf(\"common/temp\") !== -1) {\n        return false;\n    }\n\n    if (name.indexOf(\"legacy\") !== -1) {\n        return false;\n    }\n\n    if (name.indexOf(\"-react\") !== -1) {\n        return false;\n    }\n\n    if (name.indexOf(\"-angularplugin\") !== -1) {\n        return false;\n    }\n\n    if (name.indexOf(\"1ds-\") !== -1) {\n        return updateAll || isOneDs;\n    }\n\n    if (name.indexOf(\"AISKU/\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"AISKULight/\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"channels/\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"examples/\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"extensions/\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"shared/\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"tools/chrome-debug-extension\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"tools/config\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name.indexOf(\"tools/applicationinsights-web-snippet\") !== -1) {\n        return updateDefPkgs;\n    }\n\n    if (name === \"package.json\") {\n        return updateDefPkgs;\n    }\n\n    return false;\n}\n\nfunction updatePublishConfig(package, newVersion) {\n    let details = getVersionDetails(newVersion);\n    let majorVersion = package.version.split(\".\")[0];\n\n    if (!details.type || details.type === \"release\") {\n        if (package.publishConfig && package.publishConfig.tag) {\n            // remove any previous tag\n            delete package.publishConfig.tag;\n        }\n    } else {\n        if (!package.publishConfig) {\n            package.publishConfig = {};\n        }\n\n        // Set the publishing tag\n        if (details.type === \"nightly\" || details.type === \"nightlybeta\" || details.type === \"dev\" || details.type === \"beta\" || details.type === \"alpha\") {\n            console.log(`   Type - [${details.type}] - ${majorVersion}`);\n            package.publishConfig.tag = details.type + (majorVersion !== \"0\" ? majorVersion : \"\");\n        } else {\n            console.log(`   Type - [${details.type}]`);\n            package.publishConfig.tag = details.type;\n        }\n\n        console.log(` Tag - [${package.publishConfig.tag}]`);\n    }\n\n    if (package.publishConfig && Object.keys(package.publishConfig).length === 0) {\n        // Nothing left so remove it\n        delete package.publishConfig;\n    }\n}\n\nfunction updateDependencies(target, orgVersion, newVersion) {\n    if (target) {\n        Object.keys(target).forEach((value) => {\n            if ((value.indexOf(\"@microsoft/applicationinsights-\") !== -1 || value.indexOf(\"@microsoft/1ds-\") !== -1) && \n                    value.indexOf(\"@microsoft/applicationinsights-rollup\") === -1 &&\n                    value.indexOf(\"@microsoft/applicationinsights-shims\") === -1) {\n\n                let version = target[value];\n                if (theVersion.pkgs[value]) {\n                    let pkgVersion = theVersion.pkgs[value].release;\n                    if (version.startsWith(\"^\")) {\n                        target[value] = \"^\" + pkgVersion;\n                    } else if (version.startsWith(\"~\")) {\n                        target[value] = \"~\" + pkgVersion;\n                    } else {\n                        target[value] = pkgVersion;\n                    }\n                } else {\n                    if (version === orgVersion) {\n                        target[value] = newVersion;\n                    }\n                    else if (version === \"^\" + orgVersion) {\n                        target[value] = \"^\" + newVersion;\n                    }\n                    else if (version === \"~\" + orgVersion) {\n                        target[value] = \"~\" + newVersion;\n                    }\n                }\n            }\n        });\n    }\n}\n\nfunction updateVersion(src, orgVersion, newVersion) {\n    if (src) {\n        src = src.replace(\"\\\"javascript:\" + orgVersion + \"\\\"\", \"\\\"javascript:\" + newVersion + \"\\\"\");\n        src = src.replace(\"\\\"\" + orgVersion + \"\\\"\", \"\\\"\" + newVersion + \"\\\"\");\n        //src = src.replace(\"\\\"#version#\\\"\", \"\\\"\" + newVersion + \"\\\"\");\n    }\n\n    return src;\n}\n\nconst setPackageJsonRelease = () => {\n    const files = globby.sync([\"./**/package.json\", \"!**/node_modules/**\"]);\n    let changed = false;\n    files.map(packageFile => {\n        // Don't update node_modules\n        if (shouldProcess(packageFile)) {\n            console.log(\"Loading - \" + packageFile);\n\n            let theFilename = packageFile;\n            const package = require(process.cwd() + \"\\\\\" + theFilename);\n            let currentVersion = package.version;\n            let newVersion = getNewPackageVersion(package, theFilename);\n    \n            if (newVersion && currentVersion != newVersion) {\n                console.log(\"   Name - \" + package.name + \" Version: \" + currentVersion + \" => \" + newVersion);\n                //fs.renameSync(inputFile, inputFile + \".org\");\n                package.version = newVersion;\n                updatePublishConfig(package, newVersion);\n                updateDependencies(package.dependencies, currentVersion, newVersion);\n                updateDependencies(package.peerDependencies, currentVersion, newVersion);\n                updateDependencies(package.devDependencies, currentVersion, newVersion);\n    \n                if (!testOnly) {\n                    // Rewrite the file\n                    const newContent = JSON.stringify(package, null, 4) + \"\\n\";\n                    fs.writeFileSync(theFilename, newContent);\n                    changed = true;\n                }\n\n                if (theFilename.indexOf(\"/package.json\") !== -1) {\n                    let srcFolder = theFilename.replace(\"/package.json\", \"/**/*.ts\", \"/**/*.tsx\", \"/**/*.html\");\n                    console.log(\"        - Checking source files: \" + srcFolder);\n                    const tsFiles = globby.sync([srcFolder, \"!**/node_modules/**\"]);\n                    tsFiles.map(sourceFile => {\n                        // Don't update node_modules\n                        if (shouldProcess(sourceFile)) {\n                \n                            var src = fs.readFileSync(sourceFile, \"utf8\");\n                            var orgSrc = src;\n                        \n                            src = updateVersion(src, currentVersion, newVersion);\n    \n                            // Rewrite the file\n                            if (orgSrc != src && !testOnly) {\n                                console.log(\"          Updating: \" + sourceFile);\n                                src = src.trim();\n                                fs.writeFileSync(sourceFile, src);\n                            }\n                        }\n                    });\n                }\n            } else {\n                console.log(\"   Name - \" + package.name + \" Version: \" + currentVersion + \" => Skipped\");\n            }\n        }\n    });\n\n    return changed;\n};\n\nif (parseArgs()) {\n    let changed = false;\n    let newVersion = updateVersions();\n    if (newVersion) {\n        if (setPackageJsonRelease()) {\n            console.log(\"Version updated, now run 'npm run update'\");\n            changed = true;\n        } else {\n            console.warn(\"Nothing Changed!!!\");\n        }\n\n        if (!testOnly && changed) {\n            console.log(\"Updating version file\");\n            if (autoInc) {\n                // We did an automatic update so reset to patch for the next one.\n                theVersion.next = \"patch\";\n            }\n            // Rewrite the file\n            const newContent = JSON.stringify(theVersion, null, 4) + \"\\n\";\n            fs.writeFileSync(process.cwd() + \"/version.json\", newContent);\n        }\n    } else {\n        console.error(\"Failed to identify the new version number\");\n    }\n} else {\n    showHelp();\n}\n"
  },
  {
    "path": "tools/release-tools/updatemanifest.js",
    "content": "const fs = require(\"fs\");\nconst path = require(\"path\");\n\nlet packageRoot = process.cwd();\nlet packageJson = packageRoot + \"/package.json\";\n\nfunction showHelp() {\n    var scriptParts;\n    var scriptName = process.argv[1];\n    if (scriptName.indexOf(\"\\\\\") !== -1) {\n        scriptParts = scriptName.split(\"\\\\\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    } else if (scriptName.indexOf(\"/\") !== -1) {\n        scriptParts = scriptName.split(\"/\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    }\n\n    console.log(\"\");\n    console.log(scriptName + \" [<packageJson>] \");\n    console.log(\"--------------------------\");\n    console.log(\" <packageJson>    - Identifies the source package.json\");\n}\n\nfunction parseArgs() {\n    if (process.argv.length < 1) {\n        console.error(\"!!! Invalid number of arguments -- \" + process.argv.length);\n        return false;\n    }\n\n    console.log(\"cwd: \" + process.cwd());\n\n    let idx = 2;\n    while (idx < process.argv.length) {\n        let theArg = process.argv[idx];\n        if (!packageJson) {\n            packageJson = path.resolve(packageRoot, theArg);\n            let idx = packageJson.lastIndexOf(\"/\");\n            if (idx != -1) {\n                packageRoot = packageJson.substring(0, idx + 1);\n            }\n        \n            if (!packageRoot) {\n                console.error(\"!!! Unable to identify package root folder from [\" + packageJson + \"]\");\n                return false;\n            }\n        \n        } else {\n            console.error(\"!!! Invalid Argument [\" + theArg + \"] detected\");\n            return false;\n        }\n\n        idx++;\n    }\n\n    return true;\n}\n\nfunction updateManifest() {\n    let manifestFile = packageRoot + \"/manifest.json\";\n    if (!manifestFile || !fs.existsSync(manifestFile)) {\n        console.error(\"!!! Manifest file [\" + manifestFile + \"] does not exist\");\n        return false;\n    }\n\n    let thePackage = require(packageJson);\n    let versionParts = thePackage.version.split(\"-\")[0].split(\".\");\n    if (versionParts.length < 3) {\n        console.error(\"!!! Unsupported version [\" + thePackage.version + \"]\");\n        return false;\n    }\n\n    let theManifest = require(manifestFile);\n    theManifest.version = \"\" + versionParts[0] + \".\" + versionParts[1] + \".\" + versionParts[2];\n    theManifest.version_name = thePackage.version;\n\n    console.log(\"Updating manifest file\");\n    // Rewrite the file\n    const newContent = JSON.stringify(theManifest, null, 4) + \"\\n\";\n    fs.writeFileSync(manifestFile, newContent);\n\n}\n\nif (parseArgs()) {\n    if (!fs.existsSync(packageJson)) {\n        console.error(\"!!! Source package.json doesn't exist [\" + packageJson + \"]\");\n        return false;\n    }\n\n    updateManifest();\n} else {\n    showHelp();\n}\n"
  },
  {
    "path": "tools/release-tools/zipbrowser.js",
    "content": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst archiver = require(\"archiver\");\n\nlet packageRoot = process.cwd();\nlet packageJson = packageRoot + \"/package.json\";\nlet sourceDir = null;\nlet destPrefix = null;\nlet destFolder = null;\nlet done = false;\nlet complete = false;\n\nfunction showHelp() {\n    var scriptParts;\n    var scriptName = process.argv[1];\n    if (scriptName.indexOf(\"\\\\\") !== -1) {\n        scriptParts = scriptName.split(\"\\\\\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    } else if (scriptName.indexOf(\"/\") !== -1) {\n        scriptParts = scriptName.split(\"/\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    }\n\n    console.log(\"\");\n    console.log(scriptName + \" <destPrefix> [<destFolder>] [<packageJson>] \");\n    console.log(\"--------------------------\");\n    console.log(\" <destPrefix>     - Identifies the destination filename zip prefix\");\n    console.log(\" <destFolder>     - Identifies the destination folder for the zip file\");\n    console.log(\" <packageJson>    - Identifies the source package.json\");\n}\n\nfunction parseArgs() {\n    if (process.argv.length < 2) {\n        console.error(\"!!! Invalid number of arguments -- \" + process.argv.length);\n        return false;\n    }\n\n    console.log(\"cwd: \" + process.cwd());\n\n    let idx = 2;\n    while (idx < process.argv.length) {\n        let theArg = process.argv[idx];\n        if (!destPrefix) {\n            destPrefix = theArg;\n        } else if (!destFolder) {\n            destFolder = theArg;\n        } else if (!packageJson) {\n            packageJson = path.resolve(packageRoot, theArg);\n            let idx = packageJson.lastIndexOf(\"/\");\n            if (idx != -1) {\n                packageRoot = packageJson.substring(0, idx + 1);\n            }\n        \n            if (!packageRoot) {\n                console.error(\"!!! Unable to identify package root folder from [\" + packageJson + \"]\");\n                return false;\n            }\n        \n        } else {\n            console.error(\"!!! Invalid Argument [\" + theArg + \"] detected\");\n            return false;\n        }\n\n        idx++;\n    }\n\n    return true;\n}\n\nfunction normalizeName(filename) {\n    const cwd = process.cwd();\n\n    return filename.replace(cwd, \".\");\n}\n\nasync function packFolder() {\n    const thePackage = require(packageJson);\n    const packageVersion = thePackage.version;\n    if (destFolder && !fs.existsSync(packageRoot + \"/\" + destFolder)) {\n        fs.mkdirSync(packageRoot + \"/\" + destFolder);\n    }\n\n    const outputName = packageRoot + \"/\" + (destFolder ? destFolder + \"/\" : \"\") + destPrefix + \".\" + packageVersion + \".zip\";\n    console.log(`Creating Zip [${normalizeName(outputName)}] from [${normalizeName(sourceDir)}]`);\n\n    const stream = fs.createWriteStream(outputName);\n    // stream.on(\"open\", () => {\n    //     try {\n    //         console.log(`Creating Zip [${normalizeName(outputName)}] from [${normalizeName(sourceDir)}]`);\n    //     } catch (e) {\n    //         // Github is failing on this\n    //     }\n    // });\n    stream.on(\"close\", () => {\n        try {\n            //console.log(\"Complete!\", \"\\n\");\n        } catch (e) {\n            // Github is failing on this\n        }\n        complete = true;\n    });\n    stream.on(\"error\", (err) => {\n        try {\n            console.error(`Failed to write to zip file - ${err.message}\\n`);\n        } catch (e) {\n            // Github is failing on this\n            throw err;\n        }\n        process.exit(2);\n    });\n    \n    const archive = archiver(\"zip\", { zlib: { level: 9 } });\n    archive.directory(sourceDir, false);\n    archive.on(\"error\", (err) => {\n        console.error(`Failed to generate zip file - ${err.message}\\n`);\n        process.exit(2);\n    });\n    archive.pipe(stream);\n    await archive.finalize();\n\n    return true;\n}\n\nif (parseArgs()) {\n    if (!fs.existsSync(packageJson)) {\n        console.error(\"!!! Source package.json doesn't exist [\" + packageJson + \"]\");\n        return false;\n    }\n\n    sourceDir = packageRoot + \"/browser\";\n    if (!sourceDir) {\n        console.error(\"!!! Browser path [\" + packageJson + \"] does not exist -- you need to build first\");\n        return false;\n    }\n\n    try {\n        fs.accessSync(sourceDir);\n    } catch (e) {\n        console.error(\"!!! The source [\" + sourceDir + \"] does not exist\");\n        return false;\n    }\n\n    console.log(\"Packing folder\");\n    packFolder().then(() => {\n        //console.log(\"done\");\n        done = true;\n    });\n\n    function waitUntilDone() {\n        //console.log(\"Waiting...\");\n        let to = setTimeout(() => {\n            if (!done && !complete) {\n                waitUntilDone();\n            } else {\n                //console.log(\"All Done.\");\n            }\n        }, 50);\n\n        // Make sure the timer is referenced so that Node doesn't terminate\n        to.ref();\n    }\n\n    console.log(\"Waiting for packing to complete\");\n    waitUntilDone();\n} else {\n    showHelp();\n    process.exit(1);\n}\n"
  },
  {
    "path": "tools/rollup-es5/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!/package.json\n!/tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!/dist/**\n!/dist-es*/**\n!/types/**\n"
  },
  {
    "path": "tools/rollup-es5/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "tools/rollup-es5/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Rollup ES5 Plugin\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-rollup-es5.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-rollup-es5)\n\nRollup ES5/IE Support Plugin for the Application Insights Javascript SDK\n\n## Build:\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Run unit tests:\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions.  Most contributions require you to agree to a\nContributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us\nthe rights to use your contribution. For details, visit https://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to provide\na CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions\nprovided by the bot. You will only need to do this once across all repos using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)"
  },
  {
    "path": "tools/rollup-es5/Tests/Unit/src/Es5Rollup.Tests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { es5Check, es5Poly, importCheck } from \"../../../src/applicationinsights-rollup-es5\";\n\nexport class Es5RollupTests extends AITestClass {\n\n    public testInitialize() {\n    }\n\n    private visibleNewlines(value) {\n        if (value) {\n            return value.replace(/\\r/g, \"\\\\r\").replace(/\\n/g, \"\\\\n\").replace(/\\t/g, \"\\\\t\");\n        }\n\n        return value;\n    }\n\n    private convertNewlines(value, newline) {\n        if (value) {\n            return value.replace(/\\n/g, newline);\n        }\n\n        return value;\n    }\n\n    private testPolyNoChange(options:any, input:string, id:string = null) {\n        let plugin = es5Poly(options);\n\n        QUnit.assert.equal(plugin.name, \"ai-rollup-es5poly\");\n        QUnit.assert.equal(plugin.renderChunk(input, { filename: id ? id : \"test.js\" }), null);\n        QUnit.assert.equal(plugin.transform(input, id ? id : \"testId\"), null);\n    }\n\n    private testCheckNoMatch(options:any, input:string) {\n        let plugin = es5Check(options);\n\n        QUnit.assert.equal(plugin.name, \"ai-rollup-es5check\");\n        QUnit.assert.equal(plugin.renderChunk(input, { filename: \"test.js\" }), null);\n        QUnit.assert.equal(plugin.transform(input, \"testId\"), null);\n    }\n\n    public testImportCheck(options:any, input:string) {\n        let plugin = importCheck(options);\n\n        QUnit.assert.equal(plugin.name, \"ai-rollup-importcheck\");\n        QUnit.assert.equal(plugin.renderChunk(input, { filename: \"test.js\" }), null);\n        QUnit.assert.equal(plugin.transform(input, \"testId\"), null);\n    }\n\n    public testImportCheckFail(options:any, input:string, renderExpected:string, transformExpected:string = null) {\n        let plugin = importCheck(options);\n\n        QUnit.assert.equal(plugin.name, \"ai-rollup-importcheck\");\n\n        this.testError(plugin, input, input, renderExpected, transformExpected);\n    }\n\n    private doTest(plugin:any, input:string, expected:string) {\n        this.testExpected(plugin, input, expected);\n        this.testExpected(plugin, this.convertNewlines(input, \"\\r\"), this.convertNewlines(expected, \"\\r\"));\n        this.testExpected(plugin, this.convertNewlines(input, \"\\r\\n\"), this.convertNewlines(expected, \"\\r\\n\"));\n        this.testExpected(plugin, this.convertNewlines(input, \"\\n\\r\"), this.convertNewlines(expected, \"\\n\\r\"));\n    }\n\n    private testExpected(plugin:any, input:string, expected:string) {\n        QUnit.assert.equal(plugin.name, \"ai-rollup-es5poly\");\n        let result = plugin.renderChunk(input, { filename: \"test.js\" });\n        QUnit.assert.equal(result != null ? result.code : null, expected, this.visibleNewlines(result != null ? result.code : null));\n\n        result = plugin.transform(input, \"testId\");\n        QUnit.assert.equal(result != null ? result.code : null, expected, this.visibleNewlines(result != null ? result.code : null));\n    }\n\n    private testError(plugin:any, message:string, input:string, renderExpected:string, transformExpected:string = null) {\n        QUnit.assert.throws(() => {\n            plugin.renderChunk(input, { filename: \"test.js\" });\n        }, new Error(renderExpected), \"renderChunk:\" + (message || input));\n\n        QUnit.assert.throws(() => {\n            plugin.transform(input, \"test.js\");\n        }, new Error(transformExpected || renderExpected.replace(/during renderChunk/g, \"during transform\")), \"transform:\" + (message || input));\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"No matching values for es5Poly\",\n            test: () => {\n                this.testPolyNoChange(null, \"Nothing removed\");\n                this.testPolyNoChange(null, \"ClassName.prototype.anotherMethod = function () {\\n};\\n\");\n\n                this.testPolyNoChange(null, \n                    \"ClassName.prototype.methodName = function () {\\n\" +\n                    \"    // This is a comment for a dynamic proto stub\\n\" +\n                    \"};\\n\");\n\n                this.testPolyNoChange(null, \n                    \"ClassName.prototype.methodName = function () {\\n\" +\n                    \"    // This is a comment for a dynamic proto stub\\n\" +\n                    \"};\\n\");\n\n                this.testPolyNoChange(null, \n                    \"// @Stub -- Type 1 comment\\n\" +\n                    \"function methodName() {\\n\" +\n                    \"    // This is a comment for a dynamic proto stub\\n\" +\n                    \"};\\n\");\n    \n                this.testPolyNoChange(null, \n                    \"function methodName() {\\n\" +\n                    \"     // @Stub -- Type 2 single line comment\\n\" +\n                    \"};\\n\");\n    \n                this.testPolyNoChange(null, \n                    \"function methodName() {\\n\" +\n                    \"     /* @Stub -- Type 2 multiline comment */\\n\" +\n                    \"};\\n\");\n    \n                this.testPolyNoChange(null, \n                    \"function methodName() {\\n\" +\n                    \"     /* @Stub -- Type 2 multiline comment\\n\" +\n                    \"     * Continuation of a multi-line comment/\\n\" +\n                    \"     */\\n\" +\n                    \"};\\n\");\n                }\n        });\n\n        this.testCase({\n            name: \"No matching values for es5Check\",\n            test: () => {\n                this.testCheckNoMatch(null, \"Nothing removed\");\n                this.testCheckNoMatch(null, \"ClassName.prototype.anotherMethod = function () {\\n};\\n\");\n                this.testCheckNoMatch(null, \"telemertyItem.time = CoreUtils.toISOString(new Date());\");\n                this.testCheckNoMatch(null, \"var responseHeaders = {};\\nresponse.headers.forEach(function (value, name) {\\n\");\n                this.testCheckNoMatch(null, \"   _this.startsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   this.startsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   _this.endsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   this.endsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   _this.find(0, 1);\");\n                this.testCheckNoMatch(null, \"   this.find(0, 1);\");\n                this.testCheckNoMatch(null, \"   _this.findIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"   this.findIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"   _this.findLast(0, 1);\");\n                this.testCheckNoMatch(null, \"   this.findLast(0, 1);\");\n                this.testCheckNoMatch(null, \"   _this.findLastIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"   this.findLastIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"   _self.startsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   self.startsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   _self.endsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   self.endsWith(0, 1);\");\n                this.testCheckNoMatch(null, \"   _self.find(0, 1);\");\n                this.testCheckNoMatch(null, \"   self.find(0, 1);\");\n                this.testCheckNoMatch(null, \"   _self.findIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"   self.findIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"   _self.findLast(0, 1);\");\n                this.testCheckNoMatch(null, \"   self.findLast(0, 1);\");\n                this.testCheckNoMatch(null, \"   _self.findLastIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"   self.findLastIndex(0, 1);\");\n                this.testCheckNoMatch(null, \"export { doAwaitResponse, doAwait, doFinally } from \\\"./promise/await\\\";\");\n                this.testCheckNoMatch(null, \"export { doAwaitResponse, doAwait, doFinally } from \\\".\\\\promise\\\\await\\\";\");\n                this.testCheckNoMatch(null, \"export { ... } from \\\"./promise/async\\\";\");\n                this.testCheckNoMatch(null, \"export { ... } from \\\".\\\\promise\\\\async\\\";\");\n            }\n        });\n\n        this.testCase({\n            name: \"Test es5Polyfil implementations\",\n            test: () => {\n                this.testPolyNoChange(null, \n                    \"Object[\\\"defineProperty\\\"](exports, '__esModule', { value: true });\");\n\n                this.testPolyNoChange(null, \n                    \"Object.defineProperty(exports, '__esModule', { value: true });\");\n\n                this.testPolyNoChange(null, \n                    \"return r && Object.defineProperty(exports, '__esModule', { value: true }), b;\");\n\n                this.testPolyNoChange(null, \n                    \"d = Object.getOwnPropertyDescriptor(obj, 'foo'), a=b;\");\n\n                this.testPolyNoChange(null, \n                    \"d = Object.getOwnPropertyDescriptor(obj, 'foo');\");\n    \n                this.testPolyNoChange(null, \n                    \"Rectangle.prototype = Object.create(Shape.prototype);\");\n\n                this.testPolyNoChange(null, \n                    \"Rectangle.prototype = Object.create(Shape.prototype, propsObj);\");\n\n                this.testPolyNoChange(null, \n                    \"a = Object.freeze(obj);\");\n\n                this.testPolyNoChange(null, \n                    \"a = Object.seal(obj);\");\n\n                this.testPolyNoChange(null, \n                    \"var dt = new Date();\\n\" +\n                    \"\\n\" +\n                    \"dt.toISOString ();\\n\" +\n                    \"Can.toISOString();\\n\");\n\n                }\n        });\n\n        this.testCase({\n            name: \"Test Errors es5Check\",\n            test: () => {\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var arr = Object.is(a);\\n\",\n                    \"Invalid IE/ES5 function [Object.is(] found on line [1], column [11], position [10] during renderChunk - test.js\\n\" +\n                    \"[Object.is(] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var arr = Object.is(a);\\n\" +\n                    \"               ^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([Object.is(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var arr = Object.fromEntries(a);\\n\",\n                    \"Invalid IE/ES5 function [Object.fromEntries(] found on line [1], column [11], position [10] during renderChunk - test.js\\n\" +\n                    \"[Object.fromEntries(] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var arr = Object.fromEntries(a);\\n\" +\n                    \"               ^^^^^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([Object.fromEntries(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var arr = Object.entries(a);\\n\",\n                    \"Invalid IE/ES5 function [Object.entries(] found on line [1], column [11], position [10] during renderChunk - test.js\\n\" +\n                    \"[Object.entries(] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var arr = Object.entries(a);\\n\" +\n                    \"               ^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([Object.entries(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var arr = Object.assign(a);\\n\",\n                    \"Invalid IE/ES5 function [Object.assign(] found on line [1], column [11], position [10] during renderChunk - test.js\\n\" +\n                    \"[Object.assign(] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var arr = Object.assign(a);\\n\" +\n                    \"               ^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([Object.assign(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Object.setPrototypeOf(a);\\n\",\n                    \"Invalid IE/ES5 function [Object.setPrototypeOf(] found on line [1], column [9], position [8] during renderChunk - test.js\\n\" +\n                    \"[Object.setPrototypeOf(] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Object.setPrototypeOf(a);\\n\" +\n                    \"             ^^^^^^^^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([Object.setPrototypeOf(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Object.keys(a);\\n\",\n                    \"Invalid IE/ES5 function [Object.keys(] found on line [1], column [9], position [8] during renderChunk - test.js\\n\" +\n                    \"[Object.keys(] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Object.keys(a);\\n\" +\n                    \"             ^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([Object.keys(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = new Promise((resolve, reject) => {\\n\",\n                    \"Invalid IE/ES5 function [ new Promise(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ new Promise(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = new Promise((resolve, reject) => {\\n\" +\n                    \"            ^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ new Promise(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Promise.all(a, b, c)\\n\",\n                    \"Invalid IE/ES5 function [ Promise.all(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Promise.all(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Promise.all(a, b, c)\\n\" +\n                    \"            ^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Promise.all(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Promise.race(a, b, c)\\n\",\n                    \"Invalid IE/ES5 function [ Promise.race(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Promise.race(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Promise.race(a, b, c)\\n\" +\n                    \"            ^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Promise.race(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Promise.reject(a, b, c)\\n\",\n                    \"Invalid IE/ES5 function [ Promise.reject(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Promise.reject(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Promise.reject(a, b, c)\\n\" +\n                    \"            ^^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Promise.reject(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Promise.resolve(a, b, c)\\n\",\n                    \"Invalid IE/ES5 function [ Promise.resolve(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Promise.resolve(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Promise.resolve(a, b, c)\\n\" +\n                    \"            ^^^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Promise.resolve(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Promise.allSettled(a, b, c)\\n\",\n                    \"Invalid IE/ES5 function [ Promise.allSettled(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Promise.allSettled(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Promise.allSettled(a, b, c)\\n\" +\n                    \"            ^^^^^^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Promise.allSettled(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Promise.reject(a, b, c)\\n\",\n                    \"Invalid IE/ES5 function [ Promise.reject(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Promise.reject(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Promise.reject(a, b, c)\\n\" +\n                    \"            ^^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Promise.reject(])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = await someFunction();\\n\",\n                    \"Invalid IE/ES5 function [ await] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ await] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = await someFunction();\\n\" +\n                    \"            ^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ await])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"export async function someFunction() {\\n\",\n                    \"Invalid IE/ES5 function [ async function] found on line [1], column [7], position [6] during renderChunk - test.js\\n\" +\n                    \"[ async function] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :export async function someFunction() {\\n\" +\n                    \"           ^^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ async function])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Symbol.for(\\\"tokenString\\\");\\n\",\n                    \"Invalid IE/ES5 function [ Symbol.for] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Symbol.for] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Symbol.for(\\\"tokenString\\\");\\n\" +\n                    \"            ^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Symbol.for])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Symbol.keyFor(\\\"tokenString\\\");\\n\",\n                    \"Invalid IE/ES5 function [ Symbol.keyFor] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Symbol.keyFor] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Symbol.keyFor(\\\"tokenString\\\");\\n\" +\n                    \"            ^^^^^^^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Symbol.keyFor])=--------------------\\n\"\n                    );\n\n                this.testError(\n                    es5Check(), \n                    null, \n                    \"var x = Symbol(\\\"tokenString\\\");\\n\",\n                    \"Invalid IE/ES5 function [ Symbol(] found on line [1], column [8], position [7] during renderChunk - test.js\\n\" +\n                    \"[ Symbol(] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\\n\" +\n                    \"1   :var x = Symbol(\\\"tokenString\\\");\\n\" +\n                    \"            ^^^^^^^^\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([ Symbol(])=--------------------\\n\"\n                    );\n    \n            }\n        });\n\n        this.testCase({\n            name: \"Test Import Check\",\n            test: () => {\n                let plugin = importCheck({});\n\n                this.testImportCheck({}, \"\");\n                this.testImportCheck({ exclude: [\"index\"]}, \"import {\\nSomeClass\\n} from './MyCode'\");\n                this.testImportCheck({ exclude: [\"index\"]}, \"import {\\nSomeClass\\n} from \\\"./MyCode\\\"\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from './Index';\",\n                    \"Invalid Import detected [import { A, B, C } from './Index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from './Index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from './Index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from \\\"./Index\\\";\",\n                    \"Invalid Import detected [import { A, B, C } from \\\"./Index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from \\\"./Index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from \\\"./Index\\\"])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from './Index'\",\n                    \"Invalid Import detected [import { A, B, C } from './Index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from './Index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from './Index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from \\\"./Index\\\"\",\n                    \"Invalid Import detected [import { A, B, C } from \\\"./Index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from \\\"./Index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from \\\"./Index\\\"])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from './index';\",\n                    \"Invalid Import detected [import { A, B, C } from './index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from './index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from './index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from \\\"./index\\\";\",\n                    \"Invalid Import detected [import { A, B, C } from \\\"./index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from \\\"./index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from \\\"./index\\\"])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from './index'\",\n                    \"Invalid Import detected [import { A, B, C } from './index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from './index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from './index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from \\\"./index\\\"\",\n                    \"Invalid Import detected [import { A, B, C } from \\\"./index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from \\\"./index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from \\\"./index\\\"])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from './folder/index';\",\n                    \"Invalid Import detected [import { A, B, C } from './folder/index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from './folder/index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from './folder/index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from \\\"./folder/index\\\";\",\n                    \"Invalid Import detected [import { A, B, C } from \\\"./folder/index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from \\\"./folder/index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from \\\"./folder/index\\\"])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from './folder/index'\",\n                    \"Invalid Import detected [import { A, B, C } from './folder/index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from './folder/index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from './folder/index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import { A, B, C } from \\\"./folder/index\\\"\",\n                    \"Invalid Import detected [import { A, B, C } from \\\"./folder/index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import { A, B, C } from \\\"./folder/index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import { A, B, C } from \\\"./folder/index\\\"])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import * from './Index';\",\n                    \"Invalid Import detected [import * from './Index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import * from './Index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import * from './Index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import * from \\\"./Index\\\";\",\n                    \"Invalid Import detected [import * from \\\"./Index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import * from \\\"./Index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import * from \\\"./Index\\\"])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import * from './Index'\",\n                    \"Invalid Import detected [import * from './Index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import * from './Index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import * from './Index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import * from \\\"./Index\\\"\",\n                    \"Invalid Import detected [import * from \\\"./Index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import * from \\\"./Index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import * from \\\"./Index\\\"])=--------------------\\n\");\n\n                    this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import * from './folder/Index';\",\n                    \"Invalid Import detected [import * from './folder/Index'] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import * from './folder/Index']\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import * from './folder/Index'])=--------------------\\n\");\n\n                this.testImportCheckFail(\n                    { exclude: [ \"index\" ]},\n                    \"import * from \\\"./folder/Index\\\";\",\n                    \"Invalid Import detected [import * from \\\"./folder/Index\\\"] found on line [0], column [1], position [0] during renderChunk - test.js\\n\" +\n                    \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [import * from \\\"./folder/Index\\\"]\\n\" +\n                    \"\\n\" +\n                    \"--------------------=([import * from \\\"./folder/Index\\\"])=--------------------\\n\");\n\n            }\n        });\n    }\n}\n\n"
  },
  {
    "path": "tools/rollup-es5/Tests/Unit/src/Es5RollupTests.ts",
    "content": "import { Es5RollupTests } from './Es5Rollup.Tests';\n\nexport function runTests() {\n    new Es5RollupTests().registerTests();\n}\n"
  },
  {
    "path": "tools/rollup-es5/Tests/UnitTests.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Es5 Rollup Plugin</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>    \n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"magic-string\": \"../../common/Tests/External/magic-string.umd\"\n            }\n        });\n\n        // Load qunit here instead of with tests, otherwise will not work\n        modules.add(\"qunit\");\n        modules.add(\"magic-string\");\n\n        modules.add(\"@microsoft/ai-test-framework\");\n        \n        var testModule = modules.add(\"Tests/Unit/src/Es5RollupTests\", \"./Unit/dist/es5rolluptests.js\");\n        testModule.run = function (tests) {\n            console && console.log(\"Starting tests\");\n            QUnit.start();\n            tests.runTests();\n        };\n\n        modules.run();\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>\n"
  },
  {
    "path": "tools/rollup-es5/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"Node\",\n        \"target\": \"es6\",\n        \"importHelpers\": true,\n        \"noEmitHelpers\": true,\n        \"skipLibCheck\": true,\n        \"alwaysStrict\": true,\n        \"declaration\": true\n      },\n    \"files\": []\n}\n"
  },
  {
    "path": "tools/rollup-es5/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-rollup-es5.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  }\n  "
  },
  {
    "path": "tools/rollup-es5/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-rollup-es5\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"1.0.2\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - Rollup Plugin for IE/ES5 support\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/rollup-es5\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"microsoft\",\n        \"application insights\",\n        \"rollup\",\n        \"rollup-plugin\",\n        \"es5\"\n    ],\n    \"main\": \"dist/es5/node/applicationinsights-rollup-es5.js\",\n    \"module\": \"dist-es5/applicationinsights-rollup-es5.js\",\n    \"types\": \"types/applicationinsights-rollup-es5.d.ts\",\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:bundle\",\n        \"build:esm\": \"grunt rollupes5\",\n        \"build:bundle\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt rollupes5test --verbose\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"npm-pack\": \"npm pack\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/shared/AppInsightsCore\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"@types/qunit\": \"^2.19.3\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-minify-es\": \"^1.1.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\",\n        \"magic-string\": \"^0.25.7\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n    }\n}\n"
  },
  {
    "path": "tools/rollup-es5/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport minify from 'rollup-plugin-minify-es';\n\nconst version = require(\"./package.json\").version;\nconst desc = require(\"./package.json\").description;\nconst inputName = \"./dist-es5/applicationinsights-rollup-es5\";\nconst outputName = \"applicationinsights-rollup-es5\";\nconst distPath = \"./dist/es5/\";\nconst banner = [\n  \"/*!\",\n  ` * ${desc}, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst nodeUmdRollupConfigFactory = (isProduction) => {\n  const nodeRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `${distPath}node/${outputName}.js`,\n      banner: banner,\n      format: \"umd\",\n      name: \"Microsoft.ApplicationInsights-Rollup-ES5\",\n      extend: true,\n      freeze: false,\n      sourcemap: false\n    },\n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: {\n          \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n          \"// Licensed under the MIT License.\": \"\"\n        }\n      }),\n      nodeResolve()\n    ]\n  };\n\n  if (isProduction) {\n    nodeRollupConfig.output.file = `${distPath}node/${outputName}.min.js`;\n    nodeRollupConfig.plugins.push(\n      uglify({\n        ie8: false,\n        ie: true,\n        toplevel: false,\n        compress: {\n          ie: true,\n          passes:3,\n          unsafe: true\n        },\n        output: {\n          ie: true,\n          preamble: banner,\n          webkit:true\n        }\n      })\n    );\n  }\n  return nodeRollupConfig;\n};\n\nconst moduleRollupConfigFactory = (format, isProduction) => {\n  const moduleRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `${distPath}${format}/${outputName}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights-Rollup-ES5\",\n      extend: true,\n      freeze: false,\n      sourcemap: false\n    },\n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: {\n          \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n          \"// Licensed under the MIT License.\": \"\"\n        }\n      }),\n      nodeResolve()\n    ]\n  };\n\n  if (isProduction) {\n    moduleRollupConfig.output.file = `${distPath}${format}/${outputName}.min.js`;\n    if (format != \"esm\") {\n      moduleRollupConfig.plugins.push(\n        uglify({\n          ie8: false,\n          ie: true,\n          toplevel: false,\n          compress: {\n            ie: true,\n            passes:3,\n            unsafe: true,\n          },\n          output: {\n            ie: true,\n            preamble: banner,\n            webkit:true\n          }\n        })\n      );\n    } else {\n      moduleRollupConfig.plugins.push(\n        minify({\n          ie8: false,\n          ie: true,\n          toplevel: false,\n          compress: {\n            ie: true,\n            passes:3,\n            unsafe: true,\n          },\n          output: {\n            ie: true,\n            preamble: banner,\n            webkit:true\n          }\n        })\n      );\n    }\n  }\n\n  return moduleRollupConfig;\n};\n\nexport default [\n  nodeUmdRollupConfigFactory(true),\n  nodeUmdRollupConfigFactory(false),\n  moduleRollupConfigFactory('esm', true),\n  moduleRollupConfigFactory('esm', false)\n];\n"
  },
  {
    "path": "tools/rollup-es5/src/ImportCheck.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IImportCheckRollupOptions, IEs5CheckRollupOptions } from \"./es5/Interfaces\";\nimport { es5Check } from \"./es5/Es5Check\";\n\nfunction _escapeRegEx(str:string) {\n    return str.replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, \"\\\\$1\");\n}\n\nexport function importCheck(options:IImportCheckRollupOptions = {}) {\n    let checkOptions:IEs5CheckRollupOptions = {\n        ignoreDefault: true,\n        keywords: []\n    };\n\n    // Don't allow importing from folders from a package\n    checkOptions.keywords.push({\n        funcNames: [ /import.*@microsoft\\/[a-z\\-]+\\//gi ],\n        errorMsg: \"Importing this module has been blocked, you should be importing directly from the root of the package and not from a deployed file of the package - [%funcName%]\",\n        errorTitle: \"Invalid Import detected\"\n    });\n\n    // Check enum map lookups to ensure they are used correctly\n    checkOptions.keywords.push({\n        funcNames: [ /(\\w[\\d\\w]*)\\[\\1\\.(\\w[\\w\\d]*)\\]/g ],\n        errorMsg: \"Incorrect usage of an indexed map lookup detected - [%funcName%] you should use the enum name value as the lookup not the map name -- eg. Name[eName.xxxx]\",\n        errorTitle: \"Incorrect usage of indexed map lookup\",\n        ignoreIds: [\n            \"tslib.es6\"                    // tslib.es6 library has a pre existence check before usage\n        ]\n    });\n\n\n    for (let lp = 0; lp < ((options.exclude)||[]).length; lp++) {\n        if (options.exclude) {\n            checkOptions.keywords.push({\n                // eslint-disable-next-line security/detect-non-literal-regexp\n                funcNames: [ new RegExp(\"import[\\\\s]*(\\\\*|\\\\{[^\\\\}]*\\\\})[\\\\s]*from[\\\\s]*[\\\\'\\\\\\\"][^\\\\'\\\\\\\"]*\" + _escapeRegEx(options.exclude[lp]) + \"[\\\\'\\\\\\\"]\", \"gi\") ],\n                errorMsg: \"Importing from this module has been blocked, you should be importing directly from the source file and not the main module index definition - [%funcName%]\",\n                errorTitle: \"Invalid Import detected\"\n            });\n        }\n    }\n\n    let plugin = es5Check(checkOptions);\n    plugin.name = \"ai-rollup-importcheck\";\n\n    return plugin\n}"
  },
  {
    "path": "tools/rollup-es5/src/applicationinsights-rollup-es5.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { INamedGroups, IEs5CheckKeyword, IEs5Keyword, IEs5RollupOptions, IImportCheckRollupOptions } from \"./es5/Interfaces\";\nimport { es5Poly } from \"./es5/Es5Poly\";\nimport { es5Check } from \"./es5/Es5Check\";\nimport { importCheck } from \"./ImportCheck\";\n\nexport { es5Poly, es5Check, importCheck, INamedGroups, IEs5CheckKeyword, IEs5Keyword, IEs5RollupOptions, IImportCheckRollupOptions };\n"
  },
  {
    "path": "tools/rollup-es5/src/es5/Es5Check.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { isNullOrUndefined, isIgnoreFuncMatch, isIgnore } from \"./Utils\";\nimport { IEs5CheckKeyword, IEs5CheckRollupOptions } from \"./Interfaces\";\nimport { defaultEs5CheckTokens } from \"./Es5Tokens\";\nimport { formatError } from \"./FormatError\";\n\nfunction visibleNewlines(value:string) {\n    if (value) {\n        return value.replace(/\\r/g, \"\\\\r\").replace(/\\n/g, \"\\\\n\");\n    }\n\n    return value;\n}\n\nexport function checkResult(tokens:IEs5CheckKeyword[], result:string, id:string, entry:string, isTransform:boolean) {\n    if (result) {\n        let errorMessage = \"\";\n\n        for (let idx in tokens) {\n            let keyword:IEs5CheckKeyword = tokens[idx];\n            if (!isIgnore(id, keyword, isTransform)) {\n                for (let funcIdx in keyword.funcNames) {\n                    let funcRegEx = keyword.funcNames[funcIdx];\n                    if (funcRegEx) {\n                        let funcMatch;\n                        /* tslint:disable:no-conditional-assignment */\n                        while ((funcMatch = funcRegEx.exec(result))) {\n                            let funcName = funcMatch[0]||\"\";\n                            if (funcName.length > 0 && !isIgnoreFuncMatch(funcName, keyword)) {\n                                let newErrorMessage = formatError(keyword, funcName, keyword.errorMsg, result, funcMatch.index, id, entry);\n                                if ((errorMessage.length + newErrorMessage.length) < 32768) {\n                                    errorMessage += formatError(keyword, funcName, keyword.errorMsg, result, funcMatch.index, id, entry);\n                                    errorMessage += \"\\n--------------------=([\" + visibleNewlines(funcName) + \"])=--------------------\\n\";\n                                } else {\n                                    errorMessage += \"\\n-------------------------------------------------------------------------------\";\n                                    errorMessage += \"\\n Too Many errors detected!\";\n                                    errorMessage += \"\\n-------------------------------------------------------------------------------\";\n                                    throw new Error(errorMessage);\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        if (errorMessage) {\n            throw new Error(errorMessage);\n        }\n    }\n}\n\nexport function es5Check(options:IEs5CheckRollupOptions = {}) {\n    let tokens:IEs5CheckKeyword[] = defaultEs5CheckTokens.slice(0);\n    if (options) {\n        if (!isNullOrUndefined(options.ignoreDefault) && options.ignoreDefault) {\n            tokens = [];\n        }\n\n        if (!isNullOrUndefined(options.keywords) && options.keywords.length > 0) {\n            tokens = tokens.concat(options.keywords);\n        }\n    }\n\n    function doCheck(code:string, id:string, entry:string, isTransform:boolean): any {\n        // Check that the raw input doesn't include the tag\n        checkResult(tokens, code, id, entry, isTransform);\n\n        return null;\n    }\n\n    return {\n        name: \"ai-rollup-es5check\",\n        renderChunk(code:string, chunk:any) {\n            return doCheck(code, chunk.filename || chunk.fileName || chunk.name, \"renderChunk\", false);\n        },\n        transform(code:string, id:string) {\n            return doCheck(code, id, \"transform\", true);\n        }\n    }\n}"
  },
  {
    "path": "tools/rollup-es5/src/es5/Es5Poly.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { isNullOrUndefined, isNullOrWhitespace, isSourceMapEnabled, isIgnore } from \"./Utils\";\nimport { defaultEs5Tokens } from \"./Es5Tokens\";\nimport { INamedGroups, IEs5Keyword, IEs5RollupOptions } from \"./Interfaces\";\nimport { checkResult } from \"./Es5Check\";\nimport MagicString from \"magic-string\";\n\n// Start the temp name from the recent milliseconds -- this is to try and ensure that multiple runs which\n// merge into the same resulting file *hopefully* avoid any temporary name clashes\nlet tempIndex = ((new Date()).getTime() & 0xFFFFFF);\n\nfunction _escapeRegEx(str:string) {\n    return str.replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, \"\\\\$1\");\n}\n\nfunction _replaceAll(str:string, value:string, newValue: string) {\n    // eslint-disable-next-line security/detect-non-literal-regexp\n    return str.replace(new RegExp(_escapeRegEx(value), \"g\"), newValue);\n}\n\nfunction _replaceToken(keyword:IEs5Keyword, code:string, theString:MagicString, _entry:string):boolean {\n    let result = false;\n    let extract:RegExp = keyword.extract;\n    let replaceValue:string = keyword.replace || \"\";\n    let checkGroups = keyword.checkGroups;\n\n    if (!extract) {\n        return result;\n    }\n\n    let match;\n    /* tslint:disable:no-conditional-assignment */\n    while ((match = extract.exec(code))) {\n        let hasToken = true;\n        if (checkGroups && checkGroups.length > 0) {\n            for (let idx in checkGroups) {\n                let value = match[checkGroups[idx]];\n                if (isNullOrWhitespace(value)) {\n                    hasToken = false;\n                    break;\n                }\n            }\n        }\n  \n        if (hasToken) {\n            result = true;\n            let start = match.index;\n            let newValue = replaceValue || \"\";\n            let nameUsed = false;\n\n            if (keyword.namedGroups) {\n                for (let idx in keyword.namedGroups) {\n                    let namedGroup:INamedGroups = keyword.namedGroups[idx];\n                    if (!isNullOrWhitespace(namedGroup.name)) {\n                        let replace:string = match[namedGroup.idx] || \"\";\n                        newValue = _replaceAll(newValue, \"%\" + namedGroup.name + \"%\", replace);\n                    }\n                }\n            }\n\n            if (!nameUsed) {\n                let tempName = \"aies5_\" + tempIndex;\n                tempIndex++;\n                newValue = newValue.replace(\"%tempName%\", tempName);\n            }\n\n            theString.overwrite(start, start + match[0].length, newValue);\n        }\n    }\n\n    return result;\n}\n\nexport function es5Poly(options:IEs5RollupOptions = {}) {\n    let doReplace = true;\n    let tokens:IEs5Keyword[] = defaultEs5Tokens.slice(0);\n    if (options) {\n        if (!isNullOrUndefined(options.ignoreDefault) && options.ignoreDefault) {\n            tokens = [];\n        }\n\n        if (!isNullOrUndefined(options.keywords) && options.keywords.length > 0) {\n            tokens = tokens.concat(options.keywords);\n        }\n        if (!isNullOrUndefined(options.checkOnly)) {\n            doReplace = !options.checkOnly;\n        }\n    }\n\n    function replaceTokens(code:string, id:string, entry:string, isTransform:boolean): MagicString | null {\n        let changed = false;\n        let theString = null;\n        if (doReplace && code) {\n            theString = new MagicString(code);\n            for (let idx in tokens) {\n                let keyword:IEs5Keyword = tokens[idx];\n                if (keyword && !isIgnore(id, keyword, isTransform)) {\n                    try {\n                        if (_replaceToken(keyword, code, theString, entry)) {\n                            changed = true;\n                        }\n                    } catch (e) {\n                        // This occurs when we try and transform a chunk that has already been transformed\n                        // So reassigning the values and attempt to replace again, this may cause any possible\n                        // map file to mismatch the source code, however, the wrapped code should still be mostly correct\n                        code = theString.toString();\n                        theString = new MagicString(code);\n                        if (_replaceToken(keyword, code, theString, entry)) {\n                            changed = true;\n                        }\n                    }\n                }\n            }\n        }\n\n        return changed ? theString : null;\n    }\n\n    function doTransform(code:string, id:string, entry:string, isTransform:boolean) {\n        let theString = replaceTokens(code, id, entry, isTransform);\n        if (theString === null) {\n            return null;\n        }\n\n        let result:any = { code: theString.toString() };\n        if (isSourceMapEnabled(options)) {\n            result.map = theString.generateMap({hires: true});\n        }\n\n        return result;\n    }\n\n    function doTransformAndCheck(code:string, id:string, entry:string, isTransform:boolean) {\n        let result = doTransform(code, id, entry, isTransform);\n        if (result) {\n            // Do a final check of the string\n            checkResult(tokens, result.code, id, entry, isTransform);\n        } else {\n            // Check that the raw input doesn't include the tag\n            checkResult(tokens, code, id, entry, isTransform);\n        }\n\n        return result;\n    }\n\n    return {\n        name: \"ai-rollup-es5poly\",\n        renderChunk(code:string, chunk:any) {\n            return doTransformAndCheck(code, chunk.filename, \"renderChunk\", false);\n        },\n        transform(code:string, id:string) {\n            return doTransformAndCheck(code, id, \"transform\", true);\n        }\n    }\n}"
  },
  {
    "path": "tools/rollup-es5/src/es5/Es5Tokens.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { IEs5CheckKeyword, IEs5Keyword } from \"./Interfaces\";\n\nexport const defaultEs5Tokens:IEs5Keyword[] = [\n];\n\nexport const defaultEs5CheckTokens:IEs5CheckKeyword[] = [\n    {\n        funcNames: [ /\\bObject\\.(is|fromEntries|entries|setPrototypeOf)\\(/g ],\n        errorMsg: \"[%funcName%] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\"\n    },\n    {\n        funcNames: [ /\\bObject\\.(assign)\\(/g ],\n        errorMsg: \"[%funcName%] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\",\n        ignoreIds: [\n            \"applicationinsights-react-js\",  // Don't break build if these exist in the final react extension\n            \"object-assign\\\\index.js\",          // object-assign node module contains a pre existence check before usage\n            \"object-assign/index.js\"            // object-assign node module contains a pre existence check before usage\n        ]\n    },\n    {\n        funcNames: [ /\\bObject\\.(keys|hasOwn)\\(/g ],\n        errorMsg: \"[%funcName%] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\",\n        ignoreIds: [\n            \"react.production.min.js\",      // Don't break build if these exist in the react prod source code\n            \"react.development.js\",         // Don't break build if these exist in the react dev source code\n            \"applicationinsights-react-js\",  // Don't break build if these exist in the final react extension\n            \"object-assign\\\\index.js\",      // object-assign node module contains a pre existence check before usage\n            \"object-assign/index.js\"        // object-assign node module contains a pre existence check before usage\n        ]\n    },\n    {\n        funcNames: [ /\\bObject\\.(getOwnPropertySymbols)\\(/g ],\n        errorMsg: \"[%funcName%] is not supported in a IE/ES5 environment, use a helper function or add explicit check for existence\",\n        ignoreIds: [\n            \"tslib.es6\",                    // tslib.es6 library has a pre existence check before usage\n            \"object-assign\\\\index.js\",      // object-assign node module contains a pre existence check before usage\n            \"object-assign/index.js\"        // object-assign node module contains a pre existence check before usage\n        ]\n    },\n    {\n        funcNames: [ /([\\w0-9]*)\\.(trim|substr|trimEnd|trimStart|includes|padStart|padEnd)[\\s]*\\(/g ],\n        errorMsg: \"[%funcName%] is not a supported string method in a IE/ES5 environment, use strTrim*(), strSubstr(), strIncludes().\",\n        ignoreFuncMatch: [\n            \"Util.trim\",                            // Make sure this isn't a reference to Util.trim()\n            \"DataSanitizer.trim\"                    // Make sure this isn't a reference to Util.trim()\n        ]\n    },\n    {\n        funcNames: [ /([\\w0-9]*)\\.(startsWith)[\\s]*\\(/g ],\n        errorMsg: \"[%funcName%] is not a supported string method in a IE/ES5 environment, use strStartsWith().\",\n        ignoreFuncMatch: [\n            \"this.startsWith\",\n            \"_this.startsWith\",\n            \"self.startsWith\",\n            \"_self.startsWith\"\n        ]\n    },\n    {\n        funcNames: [ /([\\w0-9]*)\\.(endsWith)[\\s]*\\(/g ],\n        errorMsg: \"[%funcName%] is not a supported string method in a IE/ES5 environment, use strEndsWith().\",\n        ignoreFuncMatch: [\n            \"this.endsWith\",\n            \"_this.endsWith\",\n            \"self.endsWith\",\n            \"_self.endsWith\"\n        ]\n    },\n    {\n        funcNames: [ /([\\w0-9]*)\\.(find|findIndex|findLast|findLastIndex)[\\s]*\\(/g ],\n        errorMsg: \"[%funcName%] is not supported array method in a IE/ES5 environment, use a helper function or add explicit check for existence.\",\n        ignoreFuncMatch: [\n            \"_this.find\",\n            \"this.find\",\n            \"_self.find\",\n            \"self.find\",\n            \"_this.findIndex\",\n            \"this.findIndex\",\n            \"_self.findIndex\",\n            \"self.findIndex\",\n            \"_this.findLast\",\n            \"this.findLast\",\n            \"_self.findLast\",\n            \"self.findLast\",\n            \"_this.findLastIndex\",\n            \"this.findLastIndex\",\n            \"_self.findLastIndex\",\n            \"self.findLastIndex\"\n        ]\n    },\n    {\n        funcNames: [ /[^\\w\\\"\\']Date\\.(now)\\(/g ],\n        errorMsg: \"[%funcName%] is not supported Date method in a IE/ES5 environment, use a helper function or add explicit check for existence\"\n    },\n    {\n        funcNames: [ /[^\\w\\\"\\']new\\s+Promise[\\s]*\\(/g ],\n        errorMsg: \"[%funcName%] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\",\n        ignoreIds: [\n            \"ms.localstorage-\",\n            \"ms.localstorage.\",\n            \"ms.sigs-\",\n            \"ms.sigs.\",\n            \"promise\\\\nativePromise.js\",\n            \"promise/nativePromise.js\"\n        ]\n    },\n    {\n        funcNames: [ /[^\\w\\\"\\']Promise\\.(all|race|reject|resolve|allSettled|reject)[\\s]*\\(/g ],\n        errorMsg: \"[%funcName%] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\"\n    },\n    {\n        funcNames: [ /[^\\w\\\"\\'](await)\\b/g ],\n        errorMsg: \"[%funcName%] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\",\n        ignoreFuncMatch: [\n            \"/await\",\n            \"\\\\await\"\n        ]\n    },\n    {\n        funcNames: [ /[^\\w\\\"\\'](async)\\s+[\\w]+/g ],\n        errorMsg: \"[%funcName%] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\",\n        ignoreFuncMatch: [\n            \"/async\",\n            \"\\\\async\"\n        ]\n    },\n    {\n        funcNames: [ /[^\\w\\\"\\']Symbol\\s*\\(/g ],\n        errorMsg: \"[%funcName%] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\"\n    },\n    {\n        funcNames: [ /[^\\w\\\"\\'](Symbol\\.\\w+)/g ],\n        errorMsg: \"[%funcName%] is not supported in all IE/ES5 environments, use a helper function or add explicit check for existence\"\n    }\n];\n\n"
  },
  {
    "path": "tools/rollup-es5/src/es5/FormatError.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\nimport { padEnd, isNullOrWhitespace } from \"./Utils\";\nimport { IEs5CheckKeyword, IEs5Keyword } from \"./Interfaces\";\n\nexport function formatError(keyword:IEs5CheckKeyword|IEs5Keyword, funcName:string, errorMsg:string, code:string, pos:number, id:string, entry:string) {\n    let lines = code.split(/(?:\\r\\n|\\n\\r|\\r|\\n)/);\n    let lineNumber = 0;\n    let count = pos;\n    while (count > 0) {\n        lineNumber ++;\n        count = code.lastIndexOf(\"\\n\", count - 1);\n    }\n  \n    let lineStart = code.lastIndexOf(\"\\n\", pos);\n    let column = lineStart !== -1 ? (pos - lineStart) : pos + 1;\n  \n    var message = (keyword.errorTitle || \"Invalid IE/ES5 function\") + \" [\" + funcName + \"] found on line [\" + lineNumber + \"], column [\" + column + \"], position [\" + pos + \"] during \" + (entry||\"<processing>\") + \" - \" + (id||\"\") + \"\\n\";\n    if (errorMsg) {\n        message += errorMsg.replace(\"%funcName%\", funcName) + \"\\n\";\n    }\n  \n    let marker = padEnd(\"\", funcName.length, \"^\");\n    let line = lineNumber - 4;\n    if (line > 0) {\n        message += \" ...\\n\";\n    }\n  \n    count = 0;\n    while (count < 10 && line < lines.length-1) {\n        count++;\n        if (line >= 0) {\n            let number = padEnd(\"\" + (line + 1), 4, \" \");\n            message += number + \":\" + lines[line] + \"\\n\";\n            if (line === lineNumber-1) {\n                message += padEnd(\"\", column + 4, \" \") + marker + \"\\n\";\n            }\n        }\n  \n        line++;\n    }\n  \n    if (line < lines.length-1) {\n        message += \" ...\\n\";\n    }\n  \n    if ((keyword as IEs5Keyword).extract && !isNullOrWhitespace(funcName)) {\n        let match;\n        let matchCount = 0;\n\n        /* tslint:disable:no-conditional-assignment */\n        while ((match = (keyword as IEs5Keyword).extract.exec(code))) {\n            if (matchCount === 0) {\n                message += \"\\nMatch checks\\n\";\n            }\n\n            matchCount++;\n            if (match[0].length > 0) {\n                message += \"Match \" + matchCount + \" tag Groups for \" + funcName + \"\\n\";\n                message += \"--=( Complete Matched Content )=--\\n\";\n                message += match[0];\n                message += \"\\n--------------------------------\\n\";\n                for(let lp = 1; lp < match.length; lp++) {\n                    if (match[lp]) {\n                        message += \"\" + lp + \": \" + (match[lp] || \"\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\");\n                        message += \"\\n\";\n                    }\n                }\n                message += \"\\n\";\n            }\n        }\n    }\n  \n    return message;\n}\n"
  },
  {
    "path": "tools/rollup-es5/src/es5/Interfaces.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * Because of the test infrastructure (PhantomJS) the RegEx can't use the \"s\" flag (gis vs gi) or named groups\n */\nexport interface INamedGroups {\n    name: string,\n    idx: number\n}\n\n/**\n * Identifies the checks to apply as part of the es5Check() rollup plugin\n */\nexport interface IEs5CheckKeyword {\n    /**\n     * These RegEx's are used to identify the presence of keywords (code) that should not exist (for es5Check()) or\n     * should be attempted to be replaced (es5Poly()).\n     */\n    funcNames: RegExp[],\n\n    /**\n     * When the RegEx identifies a positive match, this is the error message that will be included in the failure.\n     * If you specify \"%funcName%\" within the error message, this will be replaced with the result of the matching RegEx value\n     */\n    errorMsg:string,\n\n    /**\n     * An optional array of strings to match with the id/filename to ignore this check (Used for both check and Poly),\n     * internally this uses indexOf() to provide a partial existence check\n     */\n    ignoreIds?:string[],\n\n    /**\n     *  A Set of strings to use for matching funcNames to ignore, this is required because of infra (build) issues\n     * with negative lookbehind, internally this uses indexOf() to provide a partial existence check.\n     */\n    ignoreFuncMatch?:Array<string|RegExp>,\n\n    /**\n     * The prefix added to any reported error, defaults to \"Invalid IE/ES5 function\"\n     */\n    errorTitle?:string\n}\n \n/**\n * Identifies the checks and replacement values to apply as part of the es5Poly() rollup plugin\n */\nexport interface IEs5Keyword extends IEs5CheckKeyword {\n    /**\n     * The RegEx used to match and extract the function details, don't use named groups (?&lt;name&gt;....); the \"s\" flag or\n     * positive or negative lookbehind (?&lt;=....); (?<!....) unless you build environment supports them. The application insights\n     * infrastructure (PhantomJS) does not.\n     */\n    extract: RegExp,\n\n    /**\n     * Optional array of regex group numbers that will be validated for the existence of a value before this keyword will be\n     * applied and the extracted values replaced.\n     */\n    checkGroups?: number[],\n\n    /**\n     * We need to simulate named regex groups due to infrastructure issues, so this provides a mapping from the RegEx group\n     * number to a name, where any matching name in the replace string %name% will be replaced with the matching RegEx group value\n     */\n    namedGroups?: INamedGroups[],\n\n    /**\n     * The replacement pattern to apply to the extracted regex, this becomes the polyFill implementation in the final\n     * packaged code.\n     */\n    replace: string,\n\n    /**\n     * The prefix added to any reported error, defaults to \"Invalid IE/ES5 function\"\n     */\n    errorTitle?:string\n}\n\n/**\n * Identifies the optional options to be passed to the es5Poly() rollup plugin\n */\nexport interface IEs5RollupOptions {\n    /**\n     * Only perform check pass, do not replace.\n     * Default: false\n     */\n    checkOnly?: boolean,\n\n    /**\n     * Identifies whether to generate the source map as part of the output (also inherited from the rollup options)\n     */\n    sourcemap?: boolean,\n\n    /**\n     * Identifies whether the default keyword definitions should be ignored or included\n     * Default: false -- Include the default values\n     */\n    ignoreDefault?:boolean,\n\n    /**\n     * Provides additional keyword replacement definitions that will be process as part of the plugin, when ignoreDefault is\n     * false these are appended after the default values, and when true these are the only values used\n     */\n    keywords?:IEs5Keyword[]        // Optional extra keywords\n}\n\n/**\n * Identifies the optional options to be passed to the es5Check() rollup plugin\n */\nexport interface IEs5CheckRollupOptions {\n    /**\n     * Identifies whether the default keyword definitions should be ignored or included\n     * Default: false -- Include the default values\n     */\n    ignoreDefault?:boolean,\n\n    /**\n     * Provides additional keyword check definitions that will be process as part of the plugin, when ignoreDefault is\n     * false these are appended after the default values, and when true these are the only values used\n     */\n    keywords?:IEs5CheckKeyword[]\n}\n\n/**\n * Identifies the optional options to be passed to the es5Check() rollup plugin\n */\nexport interface IImportCheckRollupOptions {\n    /**\n     * Identify the module names that you want to ban importing from\n     */\n    exclude?:string[]\n}\n"
  },
  {
    "path": "tools/rollup-es5/src/es5/Utils.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { IEs5CheckKeyword } from \"./Interfaces\";\n\nexport function isSourceMapEnabled(options:any) {\n    if (options) {\n        return options.sourceMap !== false && options.sourcemap !== false;\n    }\n  \n    return false;\n}\n\n// Need to mock this rather than rely on JavaScript String.prototype.padEnd() as it doesn't always\n// exists in the build / test infrastructure\nexport function padEnd(input:string, len:number, fill:string) {\n    let value = input||\"\";\n    while (value.length < len) {\n        value += fill;\n    }\n  \n    if (value.length > len) {\n        value = value.substring(0, len);\n    }\n  \n    return value;\n}\n  \nexport function isNullOrUndefined(value: any): value is null | undefined {\n    return value === undefined || value === null || typeof value === \"undefined\";\n}\n\nexport function isNullOrWhitespace(value:string) {\n    if (value) {\n        return value.replace(/\\s/g, \"\").length < 1;\n    }\n  \n    return true;\n}\n\nexport function isIgnore(id:string, keyword:IEs5CheckKeyword, _isTransform:boolean) {\n    let result = false;\n    \n    if (keyword.ignoreIds) {\n        for (let ignoreIdx in keyword.ignoreIds) {\n            let ignoreMatch = keyword.ignoreIds[ignoreIdx];\n            if (id && id.indexOf(ignoreMatch) !== -1) {\n                result = true;\n                break;\n            }\n        }\n    }\n\n    return result;\n}\n\nexport function isIgnoreFuncMatch(funcMatch:string, keyword:IEs5CheckKeyword) {\n    let result = false;\n    if (funcMatch && keyword.ignoreFuncMatch) {\n        for (let ignoreIdx in keyword.ignoreFuncMatch) {\n            let ignoreMatch = keyword.ignoreFuncMatch[ignoreIdx];\n            if (ignoreMatch) {\n                if (typeof ignoreMatch === \"string\" && funcMatch.indexOf(ignoreMatch) !== -1) {\n                    result = true;\n                    break;\n                } else if (ignoreMatch instanceof RegExp) {\n                    let match = ignoreMatch.exec(funcMatch);\n                    if (match && match.length > 0) {\n                        result = true;\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n    return result;\n}\n"
  },
  {
    "path": "tools/rollup-es5/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"es5\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"importHelpers\": false,\n    \"noEmitHelpers\": false,\n    \"alwaysStrict\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"declaration\": true,\n    \"declarationDir\": \"types\",\n    \"outDir\": \"dist-es5\",\n    \"rootDir\": \"./src\",\n    \"removeComments\": false\n  },\n  \"include\": [\n    \"./src/**/*.ts\"\n  ],\n  \"exclude\": [\"./node_modules/**\"]\n}"
  },
  {
    "path": "tools/rollup-es5/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ],\n    \"rules\": {\n        \"forin\": false\n    }\n}\n"
  },
  {
    "path": "tools/rollup-plugin-uglify3-js/.eslintrc",
    "content": "{\n    \"rules\": {\n        \"no-prototype-builtins\": \"off\",\n    }\n}\n"
  },
  {
    "path": "tools/rollup-plugin-uglify3-js/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\",\n    \"author\": \"Microsoft Corporation\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - Rollup Plugin for Uglify3 support\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"microsoft\",\n        \"application insights\",\n        \"rollup\",\n        \"rollup-plugin\"\n    ],\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:bundle\",\n        \"build:esm\": \"grunt rollupuglify\",\n        \"build:bundle\": \"npx rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"\",\n        \"lint\": \"\"\n    },\n    \"main\": \"dist/es5/node/rollup-plugin-uglify3-js.js\",\n    \"module\": \"dist-es5/rollup-plugin-uglify3-js.js\",\n    \"license\": \"MIT\",\n    \"sideEffects\": false,\n    \"devDependencies\": {\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\",\n        \"tslib\": \"^2.0.0\"\n    },\n    \"peerDependencies\": {\n        \"tslib\": \">= 1.0.0\"\n    },\n    \"dependencies\": {\n        \"uglify-js\": \"3.16.0\"\n    }\n}\n"
  },
  {
    "path": "tools/rollup-plugin-uglify3-js/rollup.config.js",
    "content": "import replace from \"@rollup/plugin-replace\";\nimport commonjs from '@rollup/plugin-commonjs';\n\nconst UglifyJs = require('uglify-js');\n\nconst version = require(\"./package.json\").version;\nconst inputName = \"./dist-es5/uglify3-js\";\nconst outputName = \"rollup-plugin-uglify3-js\";\nconst distPath = \"./dist/es5/\";\nconst banner = [\n  \"/*!\",\n  ` * Application Insights JavaScript SDK - Rollup Uglify3 Plugin, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst nodeUmdRollupConfigFactory = () => {\n  const nodeRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `${distPath}node/${outputName}.js`,\n      banner: banner,\n      format: \"umd\",\n      name: \"Microsoft.ApplicationInsights-Rollup-Plugin-Uglify\",\n      extend: true,\n      freeze: false,\n      sourcemap: false,\n      externalLiveBindings: false,\n      globals:[ 'UglifyJs' ]\n    },\n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: {\n          \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n          \"// Licensed under the MIT License.\": \"\"\n        }\n      }),\n      commonjs({\n        include: 'node_modules/**',\n        transformMixedEsModules: true\n      })\n    ]\n  };\n\n  return nodeRollupConfig;\n};\n\nconst moduleRollupConfigFactory = (format) => {\n  const moduleRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `${distPath}${format}/${outputName}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights-Rollup-Plugin-Uglify\",\n      extend: true,\n      freeze: false,\n      sourcemap: false,\n      externalLiveBindings: false,\n      globals:[ 'UglifyJs ']\n    },\n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: {\n          \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n          \"// Licensed under the MIT License.\": \"\"\n        }\n      }),\n      // nodeResolve({\n      //   module: true,\n      //   browser: false,\n      //   preferBuiltins: false\n      // }),\n      commonjs({\n        include: 'node_modules/**',\n        transformMixedEsModules: true\n      })\n    ]\n  };\n\n  return moduleRollupConfig;\n};\n\nexport default [\n  nodeUmdRollupConfigFactory(),\n  moduleRollupConfigFactory('esm'),\n];\n"
  },
  {
    "path": "tools/rollup-plugin-uglify3-js/src/uglify3-js.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport * as UglifyJs from \"uglify-js\";\n\nfunction isSourceMapEnabled(options) {\n    if (options) {\n        return options.sourceMap !== false && options.sourcemap !== false;\n    }\n\n    return false;\n}\n\nfunction _doMinify(code, filename, options, _chunkOptions) {\n    var theCode = {};\n    theCode[filename] = code;\n\n    let assign = Object[\"assign\"];\n    let theOptions = assign({}, options);\n    if (theOptions.hasOwnProperty(\"sourcemap\")) {\n        delete theOptions.sourcemap;\n    }\n\n    if (isSourceMapEnabled(options)) {\n        theOptions.sourceMap = {\n            filename: filename\n        };\n        \n        if (filename) {\n            theOptions.sourceMap.url = filename + \".map\";\n        }\n    }\n\n    var result = UglifyJs.minify(theCode, theOptions);\n\n    if (result.error) {\n        throw new Error(JSON.stringify(result.error));\n    }\n\n    var transform:any = {\n        code: result.code\n    };\n\n    if (isSourceMapEnabled(options) && result.map) {\n        transform.map = result.map;\n    }\n\n    return transform;\n}\n\nexport function uglify(options = {}) {\n\n    return {\n        name: \"ai-rollup-plugin-uglify3-js\",\n        renderChunk(code, chunk, chkOpt) {\n            return _doMinify(code, chunk.filename, options, chkOpt);\n        }\n    }\n}\n"
  },
  {
    "path": "tools/rollup-plugin-uglify3-js/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"noImplicitAny\": false,\n      \"module\": \"es6\",\n      \"moduleResolution\": \"node\",\n      \"target\": \"es5\",\n      \"forceConsistentCasingInFileNames\": true,\n      \"importHelpers\": false,\n      \"noEmitHelpers\": false,\n      \"alwaysStrict\": true,\n      \"suppressImplicitAnyIndexErrors\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"declaration\": true,\n      \"declarationDir\": \"build/types\",\n      \"outDir\": \"dist-es5\",\n      \"rootDir\": \"./src\",\n      \"removeComments\": false\n    },\n    \"files\": [\n    ]\n  }"
  },
  {
    "path": "tools/shims/.npmignore",
    "content": "# NPM Ignore\n\n# ignore everything\n*\n\n# ... but these files\n!/package.json\n!/tsconfig.json\n!/CODE_OF_CONDUCT.md\n!/CONTRIBUTING.md\n!/README.md\n!/SECURITY.md\n!/SUPPORT.md\n!/NOTICE\n!/PRIVACY\n!/LICENSE\n!/LICENSE.TXT\n!/browser/**\n!/dist-es*/**\n!/dist/**\n!/types/**\n"
  },
  {
    "path": "tools/shims/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "tools/shims/NOTICE",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties. Microsoft makes certain\nopen source code available at https://3rdpartysource.microsoft.com, or you may\nsend a check or money order for US $5.00, including the product name, the open\nsource component name, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the\nextent required to debug changes to any libraries licensed under the GNU Lesser\nGeneral Public License.\n"
  },
  {
    "path": "tools/shims/README.md",
    "content": "# Microsoft Application Insights JavaScript SDK - Shims\n\n[![GitHub Workflow Status (main)](https://img.shields.io/github/actions/workflow/status/microsoft/ApplicationInsights-JS/ci.yml?branch=main)](https://github.com/microsoft/ApplicationInsights-JS/tree/main)\n[![Build Status](https://dev.azure.com/mseng/AppInsights/_apis/build/status%2FAppInsights%20-%20DevTools%2F1DS%20JavaScript%20SDK%20web%20SKU%20(main%3B%20master)?branchName=main)](https://dev.azure.com/mseng/AppInsights/_build/latest?definitionId=8184&branchName=main)\n[![npm version](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-shims.svg)](https://badge.fury.io/js/%40microsoft%2Fapplicationinsights-shims)\n\nShims for the Application Insights Javascript SDK\n\nThis project exists to break the dependency on the version of tslib that is used during the build and deploy, this is\nmostly due to several breaking changes that have reduced our ability to publish fixes.\n\nWhile the Application Insights JS SDK will use the stubs defined in this packaging for the browser instances (those that are\nuploaded to the CDN) they are built using the polyfill pattern, so if a global implementation of __extends() and __assign() already exist\nthose versions will be used.\n\n## ES3 Support removed from v3.x\n\nES3 support has been removed from the latest version (v3.x) which is also consumed by ApplicationInsights v3.x, if required [see for ES3/IE8 Support](https://microsoft.github.io/ApplicationInsights-JS/es3_Support.html) and you will need to remain on v2.x versions\n\n## Global __extends() and __assign() changes - v2.0.0 or greater\n\nFrom v2.0.0 or greater the globally defined ```__extends()``` and ```__assign()``` methods are no longer exposed as global by default.\n\nIf you need to expose the TsLib helpers globally (which occurred by default for v1.x.x) you now will need to import and call the ```__exposeGlobalTsLib()``` function.\n\n```javascript\nimport { __exposeGlobalTsLib } from \"@microsoft/applicationinsights-shims\";\n\n__exposeGlobalTsLib();\n```\n\n## Build:\n```\nnpm install -g grunt-cli\nnpm install\nnpm run build --silent\n```\n\n## Run unit tests:\n```\nnpm run test\n```\n\n## Contributing\n\nThis project welcomes contributions and suggestions.  Most contributions require you to agree to a\nContributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us\nthe rights to use your contribution. For details, visit https://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to provide\na CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions\nprovided by the bot. You will only need to do this once across all repos using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft’s Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.\n\n## License\n\n[MIT](LICENSE)"
  },
  {
    "path": "tools/shims/Tests/Unit/src/ShimsTests.ts",
    "content": "import { AITestClass } from \"@microsoft/ai-test-framework\";\nimport { \n    strShimFunction, strShimObject, strShimPrototype, strShimUndefined, ObjDefineProperty, ObjAssign, getGlobal \n} from \"../../../src/applicationinsights-shims\";\nimport { __extendsFn, __assignFn, __objAssignFnImpl }  from \"../../../src/TsLibShims\";\nimport { __exposeGlobalTsLib }  from \"../../../src/TsLibGlobals\";\nimport { objCreate } from \"@nevware21/ts-utils\";\n\n__exposeGlobalTsLib();\n\nexport class ShimsTests extends AITestClass {\n\n    private _global: any = null;\n\n    public testInitialize() {\n        this._global = getGlobal(false);\n        try {\n            delete this._global.__assign;\n            delete this._global.__extends;\n        } catch (e) {\n            // Can't do anything if the cleanup fails\n        }\n    }\n\n    public registerTests() {\n        this.testCase({\n            name: \"__extends should exist as a global\",\n            test: () => {\n                __exposeGlobalTsLib();\n\n                QUnit.assert.ok(this._global.__extends !== undefined, \"__extends should exist\");\n                QUnit.assert.ok(this._global.__extends === __extendsFn, \"Check that it came from the shims module\");\n            }\n        });\n\n        this.testCase({\n            name: \"__assign should exist as a global and be assigned to Object.assign or embedded __assignFn\",\n            test: () => {\n                __exposeGlobalTsLib();\n\n                QUnit.assert.ok(this._global.__assign !== undefined, \"__assign should exist\");\n                if ((Object as any).assign) {\n                    QUnit.assert.ok(this._global.__assign === (Object as any).assign, \"Check that it came from the shims module\");\n                } else {\n                    QUnit.assert.ok(this._global.__assign === __objAssignFnImpl, \"Check that it came from the shims module\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"__assignFn should be assigned to Object.assign or embedded __assignFn\",\n            test: () => {\n                QUnit.assert.ok(__assignFn !== undefined, \"__assignFn should exist\");\n                if ((Object as any).assign) {\n                    QUnit.assert.ok(__assignFn === (Object as any).assign, \"Check that it came from the shims module\");\n                } else {\n                    QUnit.assert.ok(this._global.__assign === __objAssignFnImpl, \"Check that it came from the shims module\");\n                }\n            }\n        });\n\n        this.testCase({\n            name: \"__objAssignImplFn should be assigned values to target\",\n            test: () => {\n                let t = __objAssignFnImpl({}, {a:1}, {b:2});\n                QUnit.assert.equal(t.a, 1, \"Checking expected value\");\n                QUnit.assert.equal(t.b, 2, \"Checking expected value\");\n\n                // check overwrite\n                t = __objAssignFnImpl({a:0}, {a:1}, {b:2});\n                QUnit.assert.equal(t.a, 1, \"Checking expected value\");\n                QUnit.assert.equal(t.b, 2, \"Checking expected value\");\n\n                // check target\n                t = __objAssignFnImpl({x:0}, {a:1}, {b:2});\n                QUnit.assert.equal(t.x, 0, \"Checking expected value\");\n                QUnit.assert.equal(t.a, 1, \"Checking expected value\");\n                QUnit.assert.equal(t.b, 2, \"Checking expected value\");\n            }\n        });\n\n        this.testCase({\n            name: \"__assignFn should be assigned values to target\",\n            test: () => {\n                let t = __assignFn({}, {a:1}, {b:2});\n                QUnit.assert.equal(t.a, 1, \"Checking expected value\");\n                QUnit.assert.equal(t.b, 2, \"Checking expected value\");\n\n                // check overwrite\n                t = __assignFn({a:0}, {a:1}, {b:2});\n                QUnit.assert.equal(t.a, 1, \"Checking expected value\");\n                QUnit.assert.equal(t.b, 2, \"Checking expected value\");\n\n                // check target\n                t = __assignFn({x:0}, {a:1}, {b:2});\n                QUnit.assert.equal(t.x, 0, \"Checking expected value\");\n                QUnit.assert.equal(t.a, 1, \"Checking expected value\");\n                QUnit.assert.equal(t.b, 2, \"Checking expected value\");\n            }\n        });\n\n        this.testCase({\n            name: \"objCreate should exist\",\n            test: () => {\n                \n                QUnit.assert.ok(objCreate !== undefined, \"__extends should exist\");\n            }\n        });\n\n        this.testCase({\n            name: \"test string values\",\n            test: () => {\n                \n                QUnit.assert.ok(strShimFunction === \"function\", \"check function\");\n                QUnit.assert.ok(strShimObject === \"object\", \"check object\");\n                QUnit.assert.ok(strShimUndefined === \"undefined\", \"check undefined\");\n                QUnit.assert.ok(strShimPrototype === \"prototype\", \"check prototype\");\n            }\n        });\n\n        this.testCase({\n            name: \"Validate exported globals are references to the runtime versions\",\n            test: () => {\n                QUnit.assert.equal(Object.create, objCreate, \"The exported create should be an alias to the real create\");\n                QUnit.assert.equal(Object.assign, ObjAssign, \"The exported assign should be an alias to the real create\");\n                QUnit.assert.equal(Object.defineProperty, ObjDefineProperty, \"The exported define property should be an alias to the real create\");\n            }\n        })\n    }\n}\n"
  },
  {
    "path": "tools/shims/Tests/Unit/src/shims.tests.ts",
    "content": "import { ShimsTests } from \"./ShimsTests\";\n\nexport function runTests() {\n    new ShimsTests().registerTests();\n}\n"
  },
  {
    "path": "tools/shims/Tests/UnitTests.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"Cache-control\" content=\"no-Cache\" />\n    <title>Tests for Shims</title>\n    <link rel=\"stylesheet\" href=\"../../../common/Tests/External/qunit-2.9.3.css\">\n    <script src=\"../../../common/Tests/External/sinon-2.3.8.js\"></script>\n    <script src=\"../../../common/Tests/External/require-2.3.6.js\"></script>\n    <script src=\"../../../common/Tests/Selenium/ModuleLoader.js\"></script>\n\n    <script>\n        var modules = new ModuleLoader({\n            baseUrl: '../',\n            paths: {\n                qunit: \"../../common/Tests/External/qunit-2.9.3\",\n                \"whatwg-fetch\": \"../../common/Tests/External/whatwg-fetch.3.6.2\"\n            }\n        });\n\n        modules.add(\"qunit\");\n\n        loadCommonModules(modules, function() {\n            var testModule = modules.add(\"Tests/Unit/src/shims.tests\", \"./Unit/dist/shimstests.js\");\n            testModule.run = function (tests) {\n                console && console.log(\"Starting tests\");\n                QUnit.start();\n                tests.runTests();\n            };\n\n            modules.run();\n        });\n    </script>\n</head>\n\n<body>\n    <div id=\"qunit\"></div>\n    <div id=\"qunit-fixture\"></div>\n    <div id=\"error-message\"></div>\n</body>\n\n</html>"
  },
  {
    "path": "tools/shims/Tests/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"sourceMap\": true,\n        \"inlineSources\": true,\n        \"noImplicitAny\": false,\n        \"module\": \"amd\",\n        \"moduleResolution\": \"node\",\n        \"target\": \"es5\",\n        \"alwaysStrict\": true,\n        \"declaration\": true,\n        \"importHelpers\": false,\n        \"noEmitHelpers\": true,\n        \"skipLibCheck\": true\n    },\n    \"files\": [],\n    \"exclude\": [\n        \"**/*.d.ts\"\n    ]\n}"
  },
  {
    "path": "tools/shims/api-extractor.json",
    "content": "/**\n * Config file for API Extractor.  For more info, please visit: https://api-extractor.com\n */\n {\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json\",\n  \n    /**\n     * Optionally specifies another JSON config file that this file extends from.  This provides a way for\n     * standard settings to be shared across multiple projects.\n     *\n     * If the path starts with \"./\" or \"../\", the path is resolved relative to the folder of the file that contains\n     * the \"extends\" field.  Otherwise, the first path segment is interpreted as an NPM package name, and will be\n     * resolved using NodeJS require().\n     *\n     * SUPPORTED TOKENS: none\n     * DEFAULT VALUE: \"\"\n     */\n    // \"extends\": \"./shared/api-extractor-base.json\"\n    // \"extends\": \"my-package/include/api-extractor-base.json\"\n  \n    /**\n     * Determines the \"<projectFolder>\" token that can be used with other config file settings.  The project folder\n     * typically contains the tsconfig.json and package.json config files, but the path is user-defined.\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting.\n     *\n     * The default value for \"projectFolder\" is the token \"<lookup>\", which means the folder is determined by traversing\n     * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder\n     * that contains a tsconfig.json file.  If a tsconfig.json file cannot be found in this way, then an error\n     * will be reported.\n     *\n     * SUPPORTED TOKENS: <lookup>\n     * DEFAULT VALUE: \"<lookup>\"\n     */\n    \"projectFolder\": \".\",\n  \n    /**\n     * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis.  API Extractor\n     * analyzes the symbols exported by this module.\n     *\n     * The file extension must be \".d.ts\" and not \".ts\".\n     *\n     * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n     * prepend a folder token such as \"<projectFolder>\".\n     *\n     * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n     */\n    \"mainEntryPointFilePath\": \"<projectFolder>/build/types/applicationinsights-shims.d.ts\",\n  \n    /**\n     * A list of NPM package names whose exports should be treated as part of this package.\n     *\n     * For example, suppose that Webpack is used to generate a distributed bundle for the project \"library1\",\n     * and another NPM package \"library2\" is embedded in this bundle.  Some types from library2 may become part\n     * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly\n     * imports library2.  To avoid this, we can specify:\n     *\n     *   \"bundledPackages\": [ \"library2\" ],\n     *\n     * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been\n     * local files for library1.\n     */\n    \"bundledPackages\": [\n    ],\n  \n    /**\n     * Determines how the TypeScript compiler engine will be invoked by API Extractor.\n     */\n    \"compiler\": {\n      /**\n       * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * Note: This setting will be ignored if \"overrideTsconfig\" is used.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/tsconfig.json\"\n       */\n      // \"tsconfigFilePath\": \"<projectFolder>/tsconfig.json\",\n  \n      /**\n       * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk.\n       * The object must conform to the TypeScript tsconfig schema:\n       *\n       * http://json.schemastore.org/tsconfig\n       *\n       * If omitted, then the tsconfig.json file will be read from the \"projectFolder\".\n       *\n       * DEFAULT VALUE: no overrideTsconfig section\n       */\n      // \"overrideTsconfig\": {\n      //   . . .\n      // }\n  \n      /**\n       * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended\n       * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when\n       * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses\n       * for its analysis.  Where possible, the underlying issue should be fixed rather than relying on skipLibCheck.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"skipLibCheck\": true,\n    },\n  \n    /**\n     * Configures how the API report file (*.api.md) will be generated.\n     */\n    \"apiReport\": {\n      /**\n       * (REQUIRED) Whether to generate an API report.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The filename for the API report files.  It will be combined with \"reportFolder\" or \"reportTempFolder\" to produce\n       * a full file path.\n       *\n       * The file extension should be \".api.md\", and the string should not contain a path separator such as \"\\\" or \"/\".\n       *\n       * SUPPORTED TOKENS: <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<unscopedPackageName>.api.md\"\n       */\n      \"reportFileName\": \"<unscopedPackageName>.api.md\",\n  \n      /**\n       * Specifies the folder where the API report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * The API report file is normally tracked by Git.  Changes to it can be used to trigger a branch policy,\n       * e.g. for an API review.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/etc/\"\n       */\n      \"reportFolder\": \"<projectFolder>/build/dts/\",\n  \n      /**\n       * Specifies the folder where the temporary report file is written.  The file name portion is determined by\n       * the \"reportFileName\" setting.\n       *\n       * After the temporary file is written to disk, it is compared with the file in the \"reportFolder\".\n       * If they are different, a production build will fail.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/\"\n       */\n      // \"reportTempFolder\": \"<projectFolder>/temp/\"\n    },\n  \n    /**\n     * Configures how the doc model file (*.api.json) will be generated.\n     */\n    \"docModel\": {\n      /**\n       * (REQUIRED) Whether to generate a doc model file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * The output path for the doc model file.  The file extension should be \".api.json\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/temp/<unscopedPackageName>.api.json\"\n       */\n      \"apiJsonFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.api.json\"\n    },\n  \n    /**\n     * Configures how the .d.ts rollup file will be generated.\n     */\n    \"dtsRollup\": {\n      /**\n       * (REQUIRED) Whether to generate the .d.ts rollup file.\n       */\n      \"enabled\": true,\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated without any trimming.\n       * This file will include all declarations that are exported by the main entry point.\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<projectFolder>/dist/<unscopedPackageName>.d.ts\"\n       */\n      \"untrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>.d.ts\",\n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"beta\" release.\n       * This file will include only declarations that are marked as \"@public\" or \"@beta\".\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"betaTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-beta.d.ts\",\n  \n  \n      /**\n       * Specifies the output path for a .d.ts rollup file to be generated with trimming for a \"public\" release.\n       * This file will include only declarations that are marked as \"@public\".\n       *\n       * If the path is an empty string, then this file will not be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"\"\n       */\n      // \"publicTrimmedFilePath\": \"<projectFolder>/build/dts/<unscopedPackageName>-public.d.ts\",\n  \n      /**\n       * When a declaration is trimmed, by default it will be replaced by a code comment such as\n       * \"Excluded from this release type: exampleMember\".  Set \"omitTrimmingComments\" to true to remove the\n       * declaration completely.\n       *\n       * DEFAULT VALUE: false\n       */\n      // \"omitTrimmingComments\": true\n    },\n  \n    /**\n     * Configures how the tsdoc-metadata.json file will be generated.\n     */\n    \"tsdocMetadata\": {\n      /**\n       * Whether to generate the tsdoc-metadata.json file.\n       *\n       * DEFAULT VALUE: true\n       */\n      \"enabled\": false,\n  \n      /**\n       * Specifies where the TSDoc metadata file should be written.\n       *\n       * The path is resolved relative to the folder of the config file that contains the setting; to change this,\n       * prepend a folder token such as \"<projectFolder>\".\n       *\n       * The default value is \"<lookup>\", which causes the path to be automatically inferred from the \"tsdocMetadata\",\n       * \"typings\" or \"main\" fields of the project's package.json.  If none of these fields are set, the lookup\n       * falls back to \"tsdoc-metadata.json\" in the package folder.\n       *\n       * SUPPORTED TOKENS: <projectFolder>, <packageName>, <unscopedPackageName>\n       * DEFAULT VALUE: \"<lookup>\"\n       */\n      \"tsdocMetadataFilePath\": \"<projectFolder>/build/dts/tsdoc-metadata.json\"\n    },\n  \n    /**\n     * Configures how API Extractor reports error and warning messages produced during analysis.\n     *\n     * There are three sources of messages:  compiler messages, API Extractor messages, and TSDoc messages.\n     */\n    \"messages\": {\n      /**\n       * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing\n       * the input .d.ts files.\n       *\n       * TypeScript message identifiers start with \"TS\" followed by an integer.  For example: \"TS2551\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"compilerMessageReporting\": {\n        /**\n         * Configures the default routing for messages that don't match an explicit rule in this table.\n         */\n        \"default\": {\n          /**\n           * Specifies whether the message should be written to the the tool's output log.  Note that\n           * the \"addToApiReportFile\" property may supersede this option.\n           *\n           * Possible values: \"error\", \"warning\", \"none\"\n           *\n           * Errors cause the build to fail and return a nonzero exit code.  Warnings cause a production build fail\n           * and return a nonzero exit code.  For a non-production build (e.g. when \"api-extractor run\" includes\n           * the \"--local\" option), the warning is displayed but the build will not fail.\n           *\n           * DEFAULT VALUE: \"warning\"\n           */\n          \"logLevel\": \"warning\",\n  \n          /**\n           * When addToApiReportFile is true:  If API Extractor is configured to write an API report file (.api.md),\n           * then the message will be written inside that file; otherwise, the message is instead logged according to\n           * the \"logLevel\" option.\n           *\n           * DEFAULT VALUE: false\n           */\n          // \"addToApiReportFile\": false\n        },\n  \n        // \"TS2551\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by API Extractor during its analysis.\n       *\n       * API Extractor message identifiers start with \"ae-\".  For example: \"ae-extra-release-tag\"\n       *\n       * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings\n       */\n      \"extractorMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        },\n  \n        \"ae-missing-release-tag\": {\n          \"logLevel\": \"none\"\n        },\n        //\n        // . . .\n      },\n  \n      /**\n       * Configures handling of messages reported by the TSDoc parser when analyzing code comments.\n       *\n       * TSDoc message identifiers start with \"tsdoc-\".  For example: \"tsdoc-link-tag-unescaped-text\"\n       *\n       * DEFAULT VALUE:  A single \"default\" entry with logLevel=warning.\n       */\n      \"tsdocMessageReporting\": {\n        \"default\": {\n          \"logLevel\": \"warning\",\n          // \"addToApiReportFile\": false\n        }\n  \n        // \"tsdoc-link-tag-unescaped-text\": {\n        //   \"logLevel\": \"warning\",\n        //   \"addToApiReportFile\": true\n        // },\n        //\n        // . . .\n      }\n    }\n  \n  }\n  "
  },
  {
    "path": "tools/shims/package.json",
    "content": "{\n    \"name\": \"@microsoft/applicationinsights-shims\",\n    \"author\": \"Microsoft Application Insights Team\",\n    \"version\": \"3.0.1\",\n    \"description\": \"Microsoft Application Insights JavaScript SDK - Shim functions\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/shims\",\n    \"keywords\": [\n        \"azure\",\n        \"cloud\",\n        \"microsoft\",\n        \"application insights\",\n        \"tslib\",\n        \"es5\"\n    ],\n    \"main\": \"dist/es5/umd/applicationinsights-shims.js\",\n    \"module\": \"dist-es5/applicationinsights-shims.js\",\n    \"types\": \"types/applicationinsights-shims.d.ts\",\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"build\": \"npm run build:esm && npm run build:bundle\",\n        \"build:esm\": \"grunt shims\",\n        \"build:bundle\": \"rollup -c rollup.config.js --bundleConfigAsCjs\",\n        \"rebuild\": \"npm run build\",\n        \"test\": \"grunt shimstest\",\n        \"lint\": \"tslint -p tsconfig.json\",\n        \"npm-pack\": \"npm pack\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/shims\"\n    },\n    \"license\": \"MIT\",\n    \"sideEffects\": [\n        \"**/TsLibGlobals.js\",\n        \"**/TsLibGlobals.ts\"\n    ],\n    \"devDependencies\": {\n        \"@types/qunit\": \"^2.19.3\",\n        \"@microsoft/dynamicproto-js\": \"^2.0.3\",\n        \"@microsoft/ai-test-framework\": \"0.0.1\",\n        \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\": \"1.0.0\",\n        \"@microsoft/applicationinsights-rollup-es5\": \"1.0.2\",\n        \"grunt\": \"^1.6.1\",\n        \"grunt-cli\": \"^1.5.0\",\n        \"@nevware21/grunt-ts-plugin\": \"^0.5.2\",\n        \"@nevware21/grunt-eslint-ts\": \"^0.5.2\",\n        \"@rollup/plugin-commonjs\": \"^24.0.0\",\n        \"@rollup/plugin-node-resolve\": \"^15.0.1\",\n        \"@rollup/plugin-replace\": \"^5.0.2\",\n        \"rollup\": \"^3.20.0\",\n        \"rollup-plugin-cleanup\": \"^3.2.1\",\n        \"rollup-plugin-minify-es\": \"^1.1.1\",\n        \"rollup-plugin-sourcemaps\": \"^0.6.3\",\n        \"typescript\": \"^4.9.3\"\n    },\n    \"dependencies\": {\n        \"@nevware21/ts-utils\": \">= 0.12.6 < 2.x\"\n    }\n}\n"
  },
  {
    "path": "tools/shims/rollup.config.js",
    "content": "import nodeResolve from \"@rollup/plugin-node-resolve\";\nimport { uglify } from \"@microsoft/applicationinsights-rollup-plugin-uglify3-js\";\nimport replace from \"@rollup/plugin-replace\";\nimport minify from 'rollup-plugin-minify-es';\nimport cleanup from \"rollup-plugin-cleanup\";\nimport { es5Poly, es5Check } from \"@microsoft/applicationinsights-rollup-es5\";\n\nconst packageJson = require(\"./package.json\");\nconst version = packageJson.version;\nconst pkgDesc = packageJson.description;\nconst inputName = \"./dist-es5/applicationinsights-shims\";\nconst outputName = \"applicationinsights-shims\";\nconst distPath = \"./dist/es5/\";\nconst banner = [\n  \"/*!\",\n  ` * ${pkgDesc}, ${version}`,\n  \" * Copyright (c) Microsoft and contributors. All rights reserved.\",\n  \" */\"\n].join(\"\\n\");\n\nconst replaceValues = {\n  \"// Copyright (c) Microsoft Corporation. All rights reserved.\": \"\",\n  \"// Licensed under the MIT License.\": \"\"\n};\n\nconst treeshakeCfg = {\n  preset: \"smallest\",\n  moduleSideEffects: false,\n  propertyReadSideEffects: false,\n  tryCatchDeoptimization: false,\n  unknownGlobalSideEffects: false,\n  manualPureFunctions: [\n       \"getGlobal\",\n       \"createUniqueNamespace\",\n       \"createEnumStyle\",\n       \"createEnumKeyMap\",\n       \"_createKeyValueMap\",\n       \"objToString\",\n       \"_createObjIs\",\n       \"_createIs\",\n       \"createElmNodeData\",\n       \"createProcessTelemetryContext\",\n       \"createTelemetryProxyChain\",\n       \"createTelemetryPluginProxy\",\n       \"_getCache\",\n       \"_getPluginState\"\n  ]\n};\n\nconst browserUmdRollupConfigFactory = (isProduction) => {\n  const browserRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `./browser/${outputName}.js`,\n      banner: banner,\n      format: \"umd\",\n      name: \"Microsoft.ApplicationInsights.Shims\",\n      sourcemap: false\n    },\n    treeshake: treeshakeCfg, \n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: replaceValues\n      }),\n      nodeResolve(),\n      cleanup(),\n      es5Poly(),\n      es5Check()\n    ]\n  };\n\n  if (isProduction) {\n    browserRollupConfig.output.file = `./browser/${outputName}.min.js`;\n    browserRollupConfig.plugins.push(\n      uglify({\n        ie8: false,\n        ie: true,\n        toplevel: false,\n        compress: {\n          ie: true,\n          passes:3,\n          unsafe: true\n        },\n        output: {\n          ie: true,\n          preamble: banner,\n          webkit:true\n        }\n      })\n    );\n  }\n  return browserRollupConfig;\n};\n\nconst moduleRollupConfigFactory = (format, isProduction) => {\n  const moduleRollupConfig = {\n    input: `${inputName}.js`,\n    output: {\n      file: `${distPath}${format}/${outputName}.js`,\n      banner: banner,\n      format: format,\n      name: \"Microsoft.ApplicationInsights.Shims\",\n      sourcemap: false\n    },\n    treeshake: treeshakeCfg,\n    plugins: [\n      replace({\n        preventAssignment: true,\n        delimiters: [\"\", \"\"],\n        values: replaceValues\n      }),\n      nodeResolve(),\n      cleanup(),\n      es5Poly(),\n      es5Check()\n    ]\n  };\n\n  if (isProduction) {\n    moduleRollupConfig.output.file = `${distPath}${format}/${outputName}.min.js`;\n    if (format != \"esm\") {\n      moduleRollupConfig.plugins.push(\n        uglify({\n          ie8: false,\n          ie: true,\n          toplevel: false,\n          compress: {\n            ie: true,\n            passes:3,\n            unsafe: true,\n          },\n          output: {\n            ie: true,\n            preamble: banner,\n            webkit:true\n          }\n        })\n      );\n    } else {\n      moduleRollupConfig.plugins.push(\n        minify({\n          ie8: false,\n          ie: true,\n          toplevel: false,\n          compress: {\n            ie: true,\n            passes:3,\n            unsafe: true,\n          },\n          output: {\n            ie: true,\n            preamble: banner,\n            webkit:true\n          }\n        })\n      );\n    }\n  }\n\n  return moduleRollupConfig;\n};\n\nexport default [\n  browserUmdRollupConfigFactory(true),\n  browserUmdRollupConfigFactory(false),\n  moduleRollupConfigFactory('esm', true),\n  moduleRollupConfigFactory('esm', false),\n  moduleRollupConfigFactory('umd', true),\n  moduleRollupConfigFactory('umd', false)\n];\n"
  },
  {
    "path": "tools/shims/src/Constants.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const strShimFunction = \"function\";\nexport const strShimObject = \"object\";\nexport const strShimUndefined = \"undefined\";\nexport const strShimPrototype = \"prototype\";\nexport const strDefault = \"default\";\n\nexport const ObjClass = Object;\nexport const ObjProto = ObjClass[strShimPrototype];\n"
  },
  {
    "path": "tools/shims/src/TsLibGlobals.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getGlobal, objAssign } from \"@nevware21/ts-utils\";\nimport { __assignFn, __createBindingFn, __extendsFn } from \"./TsLibShims\";\n\n// To address compile time errors declaring these here\ndeclare var __extends:(d: any, b: any) => any;\ndeclare var __assign:(t: any) => any;\ndeclare var __createBinding:(o: any, m: any, k: any, k2?: any) => void;\n\nexport function __exposeGlobalTsLib() {\n    let globalObj:any = getGlobal() || {};\n\n    // tslint:disable: only-arrow-functions\n    (function (root: any, assignFn, extendsFn, createBindingFn) {\n        // Assign the globally scoped versions of the functions -- used when consuming individual ts files\n        // If check is to support NativeScript where these are marked as readonly\n        if (!root.__assign) {\n            root.__assign = objAssign || assignFn;\n        }\n        if (!root.__extends) {\n            root.__extends = extendsFn;\n        }\n        if (!root.__createBinding) {\n            root.__createBinding = createBindingFn;\n        }\n    })(globalObj, __assignFn, __extendsFn, __createBindingFn);\n    \n    // Assign local variables that will be used for embedded scenarios, if check is to support NativeScript where these are marked as readonly\n    if (!__assign) {\n        __assign = globalObj.__assign;\n    }\n    if (!__extends) {\n        __extends = globalObj.__extends;\n    }\n    if (!__createBinding) {\n        __createBinding = globalObj.__createBinding;\n    }\n}\n"
  },
  {
    "path": "tools/shims/src/TsLibShims.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport { getGlobal, objAssign, objCreate, objDefineProp, objHasOwnProperty, throwTypeError } from \"@nevware21/ts-utils\";\nimport {\n    ObjClass, ObjProto,\n    strDefault, strShimFunction, strShimPrototype\n} from \"./Constants\";\n\n// Most of these functions have been directly shamelessly \"lifted\" from the https://github.com/@microsoft/tslib and\n// modified to be ES5 compatible and applying several minification and tree-shaking techniques so that Application Insights\n// can successfully use TypeScript \"importHelpers\" which imports tslib during compilation but it will use these at runtime\n// Which is also why all of the functions have not been included as Application Insights currently doesn't use or require\n// them.\n\nexport const SymbolObj = (getGlobal()||{})[\"Symbol\"];\nexport const ReflectObj = (getGlobal()||{})[\"Reflect\"];\nexport const __hasReflect = !!ReflectObj;\n\nconst strDecorate = \"decorate\";\nconst strMetadata = \"metadata\";\nconst strGetOwnPropertySymbols = \"getOwnPropertySymbols\";\nconst strIterator = \"iterator\";\nconst strHasOwnProperty = \"hasOwnProperty\";\n\nexport declare type ObjAssignFunc = (t: any, ...sources:any[]) => any;\n\nexport var __objAssignFnImpl: ObjAssignFunc = function(t: any): any {\n    // tslint:disable-next-line: ban-comma-operator\n    for (var s, i = 1, n = arguments.length; i < n; i++) {\n        s = arguments[i];\n        for (var p in s) {\n            if (ObjProto[strHasOwnProperty].call(s, p)) {\n                (t as any)[p] = s[p];\n            }\n        }\n    }\n    return t;\n};\n\nexport var __assignFn: ObjAssignFunc = objAssign || __objAssignFnImpl;\n\n// tslint:disable-next-line: only-arrow-functions\nvar extendStaticsFn = function(d: any, b: any): any {\n    extendStaticsFn = ObjClass[\"setPrototypeOf\"] ||\n        // tslint:disable-next-line: only-arrow-functions\n        ({ __proto__: [] } instanceof Array && function (d: any, b: any) {\n            d.__proto__ = b;\n        }) ||\n        // tslint:disable-next-line: only-arrow-functions\n        function (d: any, b: any) {\n            for (var p in b) {\n                if (b[strHasOwnProperty](p)) {\n                    d[p] = b[p];\n                }\n            }\n        };\n    return extendStaticsFn(d, b);\n};\n\nexport function __extendsFn(d: any, b: any) {\n    if (typeof b !== strShimFunction && b !== null) {\n        throwTypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n    }\n    extendStaticsFn(d, b);\n    function __(this: any) {\n        this.constructor = d;\n    }\n    // tslint:disable-next-line: ban-comma-operator\n    d[strShimPrototype] = b === null ? objCreate(b) : (__[strShimPrototype] = b[strShimPrototype], new (__ as any)());\n}\n\nexport function __restFn(s: any, e: any) {\n    var t = {};\n    for (var k in s) {\n        if (objHasOwnProperty(s, k) && e.indexOf(k) < 0) {\n            t[k] = s[k];\n        }\n    }\n    if (s != null && typeof ObjClass[strGetOwnPropertySymbols] === strShimFunction) {\n        for (var i = 0, p = ObjClass[strGetOwnPropertySymbols](s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && ObjProto[\"propertyIsEnumerable\"].call(s, p[i])) {\n                t[p[i]] = s[p[i]];\n            }\n        }\n    }\n    return t;\n}\n\nexport function __decorateFn(decorators: any, target: any, key: any, desc: any) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = ObjClass[\"getOwnPropertyDescriptor\"](target, key) : desc, d;\n    if (__hasReflect && typeof ReflectObj[strDecorate] === strShimFunction) {\n        r = ReflectObj[strDecorate](decorators, target, key, desc);\n    } else {\n        for (var i = decorators.length - 1; i >= 0; i--) {\n            // eslint-disable-next-line no-cond-assign\n            if (d = decorators[i]) {\n                r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n            }\n        }\n    }\n\n    // tslint:disable-next-line:ban-comma-operator\n    return c > 3 && r && objDefineProp(target, key, r), r;\n}\n\nexport function __paramFn(paramIndex: number, decorator: Function) {\n    return function (target: any, key: any) {\n        decorator(target, key, paramIndex);\n    }\n}\n\nexport function __metadataFn(metadataKey: any, metadataValue: any) {\n    if (__hasReflect && ReflectObj[strMetadata] === strShimFunction) {\n        return ReflectObj[strMetadata](metadataKey, metadataValue);\n    }\n}\n\nexport function __exportStarFn(m: any, o: any) {\n    for (var p in m) {\n        if (p !== strDefault && !objHasOwnProperty(o, p)) {\n            __createBindingFn(o, m, p);\n        }\n    }\n}\n\nexport function __createBindingFn(o: any, m: any, k: any, k2?: any) {\n    if (k2 === undefined) {\n        k2 = k;\n    }\n    \n    if (!!objDefineProp) {\n        objDefineProp(o, k2, {\n            enumerable: true,\n            get() {\n                return m[k];\n            }\n        });\n    } else {\n        o[k2] = m[k];\n    }\n}\n\nexport function __valuesFn(o: any) {\n    var s = typeof SymbolObj === strShimFunction && SymbolObj[strIterator], m = s && o[s], i = 0;\n    if (m) {\n        return m.call(o);\n    }\n\n    if (o && typeof o.length === \"number\") {\n        return {\n            next () {\n                if (o && i >= o.length) {\n                    o = void 0;\n                }\n                return { value: o && o[i++], done: !o };\n            }\n        };\n    }\n\n    throwTypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __readFn(o: any, n: any) {\n    var m = typeof SymbolObj === strShimFunction && o[SymbolObj[strIterator]];\n    if (!m) {\n        return o;\n    }\n\n    var i = m.call(o), r, ar = [], e;\n    try {\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n            ar.push(r.value);\n        }\n    } catch (error) {\n        e = {\n            error\n        };\n    } finally {\n        try {\n            // tslint:disable-next-line:no-conditional-assignment\n            if (r && !r.done && (m = i[\"return\"])) {\n                m.call(i);\n            }\n        } finally {\n            if (e) {\n                // eslint-disable-next-line no-unsafe-finally\n                throw e.error;\n            }\n        }\n    }\n    return ar;\n}\n\n/** @deprecated */\nexport function __spreadArraysFn() {\n    var theArgs = arguments;\n    // Calculate new total size\n    for (var s = 0, i = 0, il = theArgs.length; i < il; i++) {\n        s += theArgs[i].length;\n    }\n\n    // Create new full array\n    for (var r = Array(s), k = 0, i = 0; i < il; i++) {\n        for (var a = theArgs[i], j = 0, jl = a.length; j < jl; j++, k++) {\n            r[k] = a[j];\n        }\n    }\n\n    return r;\n}\n\nexport function __spreadArrayFn(to: any, from: any) {\n    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) {\n        to[j] = from[i];\n    }\n\n    return to;\n}\n\nexport function __makeTemplateObjectFn(cooked: any, raw: any) {\n    if (objDefineProp) {\n        objDefineProp(cooked, \"raw\", { value: raw });\n    } else {\n        cooked.raw = raw;\n    }\n\n    return cooked;\n}\n\nexport function __importStarFn(mod: any) {\n    if (mod && mod.__esModule) {\n        return mod;\n    }\n\n    var result = {};\n    if (mod != null) {\n        for (var k in mod) {\n            if (k !== strDefault && Object.prototype.hasOwnProperty.call(mod, k)) {\n                __createBindingFn(result, mod, k);\n            }\n        }\n    }\n\n    // Set default module\n    if (!!objDefineProp) {\n        objDefineProp( result, strDefault, { enumerable: true, value: mod });\n    } else {\n        result[strDefault] = mod;\n    }\n\n    return result;\n}\n\nexport function __importDefaultFn(mod:any) {\n    return (mod && mod.__esModule) ? mod : { strDefault: mod };\n}\n"
  },
  {
    "path": "tools/shims/src/applicationinsights-shims.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport {\n    strShimFunction,\n    strShimObject,\n    strShimUndefined,\n    strShimPrototype,\n    strDefault,\n    ObjClass,\n    ObjProto\n} from \"./Constants\"\n\nexport {\n    __assignFn,\n    __extendsFn,\n    __restFn,\n    __spreadArrayFn,\n    __spreadArraysFn,\n    __decorateFn,\n    __paramFn,\n    __metadataFn,\n    __createBindingFn,\n    __valuesFn,\n    __readFn,\n    __makeTemplateObjectFn,\n    __importDefaultFn,\n    __importStarFn,\n    __exportStarFn\n} from \"./TsLibShims\"\n\nexport {\n    __exposeGlobalTsLib\n} from \"./TsLibGlobals\"\n\nexport {\n    throwTypeError,\n    getGlobal,\n    objAssign as ObjAssign,\n    objDefineProp as ObjDefineProperty\n} from \"@nevware21/ts-utils\";"
  },
  {
    "path": "tools/shims/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n      \"sourceMap\": true,\n      \"inlineSources\": true,\n      \"noImplicitAny\": true,\n      \"module\": \"es6\",\n      \"moduleResolution\": \"node\",\n      \"target\": \"es5\",\n      \"forceConsistentCasingInFileNames\": true,\n      \"importHelpers\": false,\n      \"noEmitHelpers\": true,\n      \"alwaysStrict\": true,\n      \"suppressImplicitAnyIndexErrors\": true,\n      \"allowSyntheticDefaultImports\": true,\n      \"declaration\": true,\n      \"declarationDir\": \"./types\",\n      \"outDir\": \"dist-es5\",\n      \"rootDir\": \"./src\",\n      \"removeComments\": false\n    },\n    \"include\": [\n      \"./src/**/*.ts\"\n    ],\n    \"exclude\": [\"./node_modules/**\"]\n  }"
  },
  {
    "path": "tools/shims/tslint.json",
    "content": "{\n    \"extends\": [\n        \"../../tslint-base.json\"\n    ]\n}\n"
  },
  {
    "path": "tools/sizeImageGenerator/package.json",
    "content": "{\n    \"name\": \"applicationinsights-js-size-image-generator\",\n    \"version\": \"3.1.3-dev\",\n    \"author\": \"Javascript Telemetry SDKs <TelReachSDK@microsoft.com>\",\n    \"description\": \"size image generator\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS\",\n    \"sideEffects\": false,\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"update\": \"rush update\",\n        \"build\": \"\",\n        \"rebuild\": \"\",\n        \"test\": \"\",\n        \"issues\": \"node ./size-image-generator.js\"\n    },\n    \"keywords\": [\n        \"1DS\",\n        \"Js\",\n        \"SDK\"\n    ],\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/status-tools\"\n    },\n    \"devDependencies\": {\n        \"globby\": \"^11.0.0\",\n        \"grunt\": \"^1.6.1\"\n    }\n}\n"
  },
  {
    "path": "tools/sizeImageGenerator/size-image-generator.js",
    "content": "const fsPromise = require(\"fs\").promises;\nconst fs = require(\"fs\");\nconst https = require(\"https\");\n\nasync function generateSizeBadge(path, fileSize, isGzip = false, maxSize = 35, minSize = 30) {\n    try {\n        let sizeBadge = `https://img.shields.io/badge/size-${fileSize}kb`;\n        let color;\n        if (isGzip) {\n            if (fileSize > maxSize) {\n                color = \"red\";\n            } else if (fileSize > minSize) {\n                color = \"yellow\";\n            } else {\n                color = \"brightgreen\";\n            }\n        } else {\n            color = \"blue\";\n        }\n        sizeBadge += \"-\" + color;\n        console.log(`  Generating badge: ${path} (${fileSize}kb${isGzip ? \" gzip\" : \"\"}) [${color}]`);\n        const res = await fetch(encodeURI(sizeBadge));\n        if (!res.ok) {\n            throw new Error(`Failed to fetch ${sizeBadge}: ${res.status} ${res.statusText}`);\n        }\n        const buffer = await res.arrayBuffer();\n        const outputPath = `./AISKU/.cdn/img/ai.${path}.svg`;\n        await fsPromise.writeFile(outputPath, Buffer.from(buffer));\n        console.log(`  Badge saved: ${outputPath}`);\n    } catch (err) {\n        throw new Error(`Failed to generate size badge: ${err.message}`);\n    }\n}\n\nasync function downloadFile(version) {\n    try {\n        let url = \"https://js.monitor.azure.com/scripts/b/ai.\" + version + \".js\";\n        console.log(`Downloading: ${url}`);\n        const res = await fetch(encodeURI(url));\n        if (!res.ok) {\n            throw new Error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`);\n        }\n        const buffer = await res.arrayBuffer();\n        const outputPath = `./AISKU/.cdn/file/ai.${version}.js`;\n        await fsPromise.writeFile(outputPath, Buffer.from(buffer));\n        console.log(`  Downloaded: ${outputPath} (${(buffer.byteLength / 1024).toFixed(1)}kb)`);\n    } catch (err) {\n        throw new Error(`Failed to generate size badge: ${err.message}`);\n    }\n}\n\nfunction createDirectory(dirName) {\n    const dir = `./${dirName}`;\n    if (!fs.existsSync(dir)){\n        fs.mkdirSync(dir, { recursive: true });\n    }\n}\n\nasync function getVersionFromPackageJson(packageJsonPath) {\n    try {\n        const data = await fsPromise.readFile(packageJsonPath, \"utf8\");\n        const packageJson = JSON.parse(data);\n        if (packageJson && packageJson.version) {\n            return packageJson.version;\n        } else {\n            return null;\n        }\n    } catch (err) {\n        console.error(`Failed to read package.json: ${err.message}`);\n        return null;\n    }\n}\n\nasync function main() {\n    console.log(\"=== Size Image Generator ===\");\n    console.log(\"Creating directories...\");\n    createDirectory(\"./AISKU/.cdn/file\");\n    createDirectory(\"./AISKU/.cdn/img\");\n    const packageJsonPath = \"./AISKU/package.json\";\n    const version = await getVersionFromPackageJson(packageJsonPath);\n\n    let versions = [];\n\n    if(process.argv.length >= 3) {\n        let versionList = process.argv[2];\n        versions = versionList.split(\",\");\n    }\n    version && versions.push(version);\n    console.log(\"Versions to process:\", versions.join(\", \"));\n    console.log(\"\");\n    for (let i = 0; i < versions.length; i++) {\n        let version = versions[i];\n        console.log(`\\n--- Processing version ${version} (${i + 1}/${versions.length}) ---`);\n        await downloadFile(version);\n        await downloadFile(version + \".min\");\n        const filename = `./AISKU/.cdn/file/ai.${version}.js`;\n        const minFileName = `./AISKU/.cdn/file/ai.${version}.min.js`;\n        try {\n            const fileSize = ((await fsPromise.stat(filename)).size / 1024).toFixed(1);\n            const minFileSize = ((await fsPromise.stat(minFileName)).size / 1024).toFixed(1);\n            console.log(`\\nFile sizes: ${version}.js = ${fileSize}kb, ${version}.min.js = ${minFileSize}kb`);\n            console.log(\"\\nGenerating badges...\");\n            await generateSizeBadge(version + \".js\", fileSize);\n            await generateSizeBadge(version + \".min.js\", minFileSize);\n            // Use https module to get raw compressed size (fetch auto-decompresses)\n            const gzipSize = await new Promise((resolve, reject) => {\n                const options = {\n                    hostname: \"js.monitor.azure.com\",\n                    path: \"/scripts/b/ai.\" + version + \".min.js\",\n                    headers: { \"Accept-Encoding\": \"gzip\" }\n                };\n                https.get(options, (res) => {\n                    if (res.headers[\"content-encoding\"] !== \"gzip\") {\n                        reject(new Error(\"Content is not gzip encoded\"));\n                        return;\n                    }\n                    let bodySize = 0;\n                    res.on(\"data\", (chunk) => {\n                        bodySize += chunk.length;\n                    });\n                    res.on(\"end\", () => {\n                        resolve(bodySize);\n                    });\n                    res.on(\"error\", reject);\n                }).on(\"error\", reject);\n            });\n            const gzipSizeKb = (gzipSize / 1024).toFixed(1);\n            console.log(`\\nGzip size: ${version}.min.js = ${gzipSizeKb}kb (compressed)`);\n            await generateSizeBadge(version + \".gzip.min.js\", gzipSizeKb, true);\n        } catch (err) {\n            console.error(\"Error:\", err);\n        }\n    }\n    console.log(\"\\n=== Size Image Generator Complete ===\");\n}\n\nmain();\n"
  },
  {
    "path": "tools/status-tools/github-status.js",
    "content": "const fs = require(\"fs\");\nconst child_process = require(\"child_process\");\nconst NO_LABELS = \"<No Labels>\";\nconst NO_MILESTONE = \"<No Milestone>\";\nconst DEFAULT_LABELS = [ \"bug\", \"enhancement\", \"feature\", \"question\", \"documentation\", \"duplicate\", \"invalid\", \"wontfix\" ];\n\nlet _startMonth = 0;\nlet _endMonth = 0;\nlet _csv = false;\nlet _csvOnly = false;\nlet _csvOutput = \"\";\nlet _labels = null;\nlet _noLabels = false;\nlet _missingLabels = false;\nlet _prevMonths = 6;\nlet _dump = false;\n\nfunction showHelp() {\n    var scriptParts;\n    var scriptName = process.argv[1];\n    if (scriptName.indexOf(\"\\\\\") !== -1) {\n        scriptParts = scriptName.split(\"\\\\\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    } else if (scriptName.indexOf(\"/\") !== -1) {\n        scriptParts = scriptName.split(\"/\");\n        scriptName = scriptParts[scriptParts.length - 1];\n    }\n\n    console.log(\"\");\n    console.log(scriptName + \" <group> \");\n    console.log(\"--------------------------\");\n    console.log(\" <startYYYY[-][MM]>                  - Identifies the first year/month to report from (2021; 2021-01; 202101), overrides default of 6 months\");\n    console.log(\" <endYYYY[-][MM]>                    - Identifies the last year/month to report from (2021; 2021-01; 202101)\");\n    console.log(\" -mths <number>                      - Number of months to report (overrides -startYYYY[-][MM]), defaults to 6 months\");\n    console.log(\" -l | -labels <comma separated list> - Only report on the specified labels\");\n    console.log(\" -csv                                - Send the output to a CSV file (issues.csv)\");\n    console.log(\" -csvOnly                            - Send the output to a CSV file (issues.csv) and not to the console\");\n    console.log(\" -px                                 - Include priority labels (p0, p1, p2, p3, p4) and overrides -noLabels\");\n    console.log(\" -allLabels                          - Include all labels (overrides -l, -px and -noLabels)\");\n    console.log(\" -noLabels                           - Don't report on any labels (overrides -l, -px and -all)\");\n    console.log(\" -missingLabels                      - Identify issues with no assigned labels\");\n    console.log(\" -noDefault                          - Don't add the default labels (bug,enhancement,feature,question,documentation,duplicate,invalid,wontfix)\");\n    console.log(\" -dump                               - Dump the raw JSON data to a file (issues.json)\");\n    console.log(\" -? | -h | -help                     - This help message\");\n    console.log(\"\");\n    console.log(\"Examples:\");\n    console.log(`node ${scriptName} -mths 12 -csv -px      - Report on the last 12 months, include priority labels and send to a CSV file`);\n    console.log(`node ${scriptName} 2021-01 -csvOnly       - Report from Jan 2021, send to a CSV file and not to the console`);\n    console.log(`node ${scriptName} 2021-01 2021-06 -csv   - Report from Jan 2021 to Jun 2021 and send to a CSV file`);\n    console.log(`node ${scriptName} -l bug,enhancement     - Report on the last 6 months, only report on bug and enhancement labels`);\n    console.log(`node ${scriptName} -px -noDefault         - Report on the last 6 months, and don't include the default labels`);\n    console.log(`node ${scriptName} -allLabels             - Report on the last 6 months, and include all labels`);\n    console.log(`node ${scriptName} -missingLabels         - Report on the last 6 months, and include issues with no labels`);\n}\n\nfunction parseYrMonth(yrMth) {\n    let result = 0;\n    if (yrMth) {\n        let parts = yrMth.split(\"-\");\n        if (parts.length > 1) {\n            // Contained \"-\"\n            result = Number(parts[0]) * 100 + (parts[1] > 0 ? parts[1] - 1 : 0);\n        } else if (parts[0].length == 6) {\n            // Simple YYYYMM\n            result = (parts[0] % 100) ? Number(parts[0]) - 1 : Number(parts[0]);\n        } else if (parts[0].length == 4) {\n            // Simple YYYY\n            result = Number(parts[0]) * 100;\n        }\n\n        if (result > 2000 && (result % 100) > 11) {\n            // Remove the provided Month\n            result -= (result % 100);\n            // Set to December\n            result += 11\n        }\n    }\n\n    return result;\n}\n\nfunction parseArgs() {\n    if (process.argv.length < 2) {\n        console.error(\"!!! Invalid number of arguments -- \" + process.argv.length);\n        return false;\n    }\n\n    let useDefaultLabels = true;\n    let idx = 2;\n    while (idx < process.argv.length) {\n        let theArg = process.argv[idx];\n        if (theArg.startsWith(\"-\")) {\n            if (theArg === \"-?\" || theArg === \"-h\" || theArg === \"-help\") {\n                return false;\n            } else if (theArg === \"-csv\") {\n                _csv = true;\n            } else if (theArg === \"-csvOnly\") {\n                _csv = true;\n                _csvOnly = true;\n            } else if ((theArg === \"-labels\" || theArg === \"-l\") && idx + 1 < process.argv.length) {\n                if (!_labels) {\n                    _labels = [];\n                }\n                process.argv[++idx].split(\",\").forEach(label => {\n                    _labels.push(label);\n                });\n                useDefaultLabels = false;\n            } else if(theArg === \"-px\") {\n                if (!_labels) {\n                    _labels = [];\n                }\n                _labels.push(\"p0\", \"p1\", \"p2\", \"p3\", \"p4\");\n                _noLabels = false;\n                useDefaultLabels = false;\n            } else if(theArg === \"-noLabels\") {\n                _noLabels = true;\n                useDefaultLabels = false;\n            } else if (theArg === \"-allLabels\") {\n                _labels = null;\n                _noLabels = false;\n                useDefaultLabels = false;\n            } else if (theArg === \"-missingLabels\") {\n                _missingLabels = true;\n                _noLabels = false;\n            } else if (theArg === \"-noDefault\") {\n                if (!_labels) {\n                    _labels = [];\n                }\n                useDefaultLabels = false;\n            } else if (theArg === \"-mths\" && idx + 1 < process.argv.length) {\n                _prevMonths = Number(process.argv[++idx]);\n                if (_prevMonths < 1) {\n                    _prevMonths = 1;\n                }\n            } else if (theArg === \"-dump\") {\n                _dump = true;\n            } else {\n                console.error(\"!!! Unknown switch [\" + theArg + \"] detected\");\n                return false;\n            }\n        } else if (!_startMonth) {\n            _startMonth = parseYrMonth(theArg);\n        } else if (!_endMonth) {\n            _endMonth = parseYrMonth(theArg);\n        } else {\n            console.error(\"!!! Invalid Argument [\" + theArg + \"] detected\");\n            return false;\n        }\n\n        idx++;\n    }\n\n    if (useDefaultLabels && !_labels) {\n        _labels =  DEFAULT_LABELS;\n    }\n\n    return true;\n}\n\nfunction logMessage(message) {\n    if (!_csvOnly) {\n        console.log(message);\n    }\n}\n\nfunction logLines(lines) {\n    if (lines) {\n        lines.forEach(line => {\n            logMessage(line);\n        });\n    }\n}\n\nfunction logHeader(title, firstYear, lastYear, lastMonth, issues) {\n    let csvOutput =  \"\\\"\" + title + \"\\\"\";\n    logMessage(title);\n\n    if (_csv && issues) {\n        for (let yr = firstYear; yr <= lastYear; yr++) {\n            let year = issues[yr] || { cnt: 0, opened: 0, closed: 0 };\n            if (year) {\n                for (let mth = 0; mth < 12; mth++) {\n                    let now = (yr * 100) + mth;\n                    if (now <= lastMonth) {\n                        let month = year[String(mth + 1).padStart(2, \"0\")];\n                        if (month && now >= _startMonth) {\n                            csvOutput += `,\\\"${yr}-${String(mth + 1).padStart(2, \"0\")}\\\"`;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    if (_csv) {\n        _csvOutput += csvOutput + \"\\n\";\n    }\n}\n\nfunction dumpActive(label, issues, firstYear, lastYear, lastMonth) {\n    let csvOutput =  \"\\\"\" + label + \"\\\"\";\n    let lines = [];\n    let hasData = false;\n    lines.push(label);\n\n    let active = 0;\n    for (let yr = firstYear; yr <= lastYear; yr++) {\n        let year = issues[yr] || { cnt: 0, opened: 0, closed: 0 };\n        for (let mth = 0; mth < 12; mth++) {\n            let now = (yr * 100) + mth;\n            if (now <= lastMonth) {\n                let month = year[String(mth + 1).padStart(2, \"0\")];\n                if (month) {\n                    active += month.cnt;\n                }\n\n                if (now >= _startMonth) {\n                    csvOutput += `,${active}`;\n                    lines.push(`${yr}-${String(mth + 1).padStart(2, \"0\")}: ${\"\".padStart(active, \"#\")}`);\n                    if (active) {\n                        hasData = true;\n                    }\n                }\n            }\n        }\n    }\n\n\n    lines.push(` --- End of ${label} ---`);\n    if (hasData) {\n        logLines(lines);\n        if (_csv) {\n            _csvOutput += csvOutput + \"\\n\";\n        }\n    }\n}\n\nfunction dumpCount(label, issues, firstYear, lastYear, lastMonth, name) {\n    let csvOutput =  \"\\\"\" + label + \"\\\"\";\n    let lines = [];\n    let hasData = false;\n    lines.push(label);\n\n    for (let yr = firstYear; yr <= lastYear; yr++) {\n        let active = 0;\n        let year = issues[yr] || { cnt: 0, opened: 0, closed: 0 };\n        for (let mth = 0; mth < 12; mth++) {\n            let now = (yr * 100) + mth;\n            if (now >= _startMonth && now <= lastMonth) {\n                let month = year[String(mth + 1).padStart(2, \"0\")];\n                if (month) {\n                    active = month[name];\n                }\n\n                csvOutput += `,${active}`;\n                lines.push(`${yr}-${String(mth + 1).padStart(2, \"0\")}: ${\"\".padStart(active, \"#\")}`);\n                if (active) {\n                    hasData = true;\n                }\n            }\n        }\n    }\n\n    lines.push(` --- End of ${label} ---`);\n\n    if (hasData) {\n        logLines(lines);\n        if (_csv && csvOutput) {\n            _csvOutput += csvOutput + \"\\n\";\n        }\n    }\n}\n\nfunction sumValues(issues, createdAt, closedAt, issue) {\n    let openYear = createdAt.getFullYear();\n    let openMonth = String(createdAt.getMonth() + 1).padStart(2, \"0\");\n    let year = issues[openYear] = issues[openYear] || { cnt: 0, opened: 0, closed: 0 };\n    year.cnt++;\n    year.opened++;\n\n    let month = year[openMonth] = year[openMonth] || { cnt: 0, opened: 0, closed: 0 };\n    month.opened++;\n    month.cnt++;\n    if (issue) {\n        let openIssues = month.openedIssues = (month.openedIssues || {});\n\n        if (issue.milestone) {\n            openIssues = openIssues[issue.milestone.title] = openIssues[issue.milestone.title] || [];\n        } else {\n            openIssues = openIssues[NO_MILESTONE] = openIssues[NO_MILESTONE] || [];\n        }\n\n        let labels = \"\";\n        if (issue.labels) {\n            issue.labels.forEach(label => {\n                labels += (labels ? \", \" : \"\") + label.name;\n            });\n        }\n\n        if (!closedAt) {\n            openIssues.push(`#${issue.number} ${labels ? \"[\" + labels + \"]\" : \"\"} :${issue.title}`);\n        } else {\n            openIssues.push(`#${issue.number} ${labels ? \"[\" + labels + \"]\" : \"\"} =<(Closed)>=- :${issue.title}`);\n        }\n    }\n\n    if (closedAt) {\n        let closeYear = closedAt.getFullYear();\n        let closeMonth = String(closedAt.getMonth() + 1).padStart(2, \"0\");\n        let year = issues[closeYear] = issues[closeYear] || { cnt: 0, opened: 0, closed: 0 };\n        year.cnt--;\n        year.closed++;\n\n        let month = year[closeMonth] = year[closeMonth] || { cnt: 0, opened: 0, closed: 0 };\n        month.closed++;\n        month.cnt--;\n\n        if (issue) {\n            let closedIssues = month.closedIssues = (month.closedIssues || {});\n            if (issue.milestone) {\n                closedIssues = closedIssues[issue.milestone.title] = closedIssues[issue.milestone.title] || [];\n            } else {\n                closedIssues = closedIssues[NO_MILESTONE] = closedIssues[NO_MILESTONE] || [];\n            }\n\n            closedIssues.push(`#${issue.number} - ${issue.title}`);\n        }\n    }\n}\n\nfunction writeFile(filename, data, extension, overwrite = true, idx = 0) {\n    let newFilename = filename + (idx ? (\"-\" + idx) : \"\") + \".\" + extension;\n\n    if (!overwrite && fs.existsSync(newFilename)) {\n        console.log(\" -- Existing \" + newFilename);\n        writeFile(filename, data, extension, overwrite, idx + 1);\n        return;\n    }\n\n    try {\n        fs.writeFileSync(newFilename, data);\n    } catch (e) {\n        console.error(` -- Failed to write newFilename - ${e}`);\n        writeFile(filename, data, extension, overwrite, idx + 1);\n    }\n}\n\nfunction processIssues(issues) {\n    let labels = {};\n    let openIssues = {};\n    let firstYear = 0;\n    let lastYear = 0;\n    let lastMonth = 0;\n\n    for (let lp = 0; lp < issues.length; lp++) {\n        let issue = issues[lp];\n        let createdAt = new Date(issue.createdAt);\n        let closedAt = issue.closedAt ? new Date(issue.closedAt) : null;\n\n        let openYear = createdAt.getFullYear();\n        let openMonth = (openYear * 100) + createdAt.getMonth();\n        if (openYear < firstYear || firstYear === 0) {\n            firstYear = openYear;\n        }\n        if (openYear > lastYear) {\n            firstYear = openYear;\n        }\n        if (lastMonth < openMonth) {\n            lastMonth = openMonth;\n        }\n        if (openYear > lastYear) {\n            lastYear = openYear;\n        }\n\n        if (closedAt) {\n            let closeYear = closedAt.getFullYear();\n            let closeMonth = (closeYear * 100) + closedAt.getMonth();\n            if (closeYear > lastYear) {\n                lastYear = closeYear;\n            }\n            if (lastMonth < closeMonth) {\n                lastMonth = closeMonth;\n            }\n        }\n\n        sumValues(openIssues, createdAt, closedAt, issue);\n        if (!_noLabels && issue.labels && issue.labels.length > 0) {\n            issue.labels.forEach(label => {\n                if (!_labels || _labels.includes(label.name)) {\n                    labels[label.name] = labels[label.name] || {};\n                    sumValues(labels[label.name], createdAt, closedAt);\n                }\n            });\n        } else if (_missingLabels) {\n            labels[NO_LABELS] = labels[NO_LABELS] || {};\n            sumValues(labels[NO_LABELS], createdAt, closedAt);\n        }\n    }\n\n    if (_endMonth && lastMonth > _endMonth) {\n        lastMonth = _endMonth;\n    }\n\n    if (!_startMonth) {\n        let yr = Math.floor(lastMonth / 100);\n        let mon = lastMonth % 100;\n        let subMonths = (_prevMonths || 12) - 1;\n        yr -= Math.floor(subMonths / 12);\n        subMonths %= 12;\n        if (subMonths > 0) {\n            mon -= subMonths;\n            if (mon < 0) {\n                yr --;\n                mon += 12;\n            }\n        }\n\n        _startMonth = (yr * 100) + mon;\n    }\n\n    let filename = `issues-${_startMonth + 1}-${lastMonth + 1}`;\n\n    //console.log(`Reporting from: ${firstYear} to ${lastYear} - ${_startMonth + 1} to ${lastMonth + 1}`);\n\n    logMessage(`Reporting from: ${_startMonth + 1} to ${lastMonth + 1}`);\n    logHeader(\"Issues\", firstYear, lastYear, lastMonth, openIssues);\n    dumpCount(\"New\", openIssues, firstYear, lastYear, lastMonth, \"opened\");\n    dumpCount(\"Closed\", openIssues, firstYear, lastYear, lastMonth, \"closed\");\n    dumpActive(\"Active\", openIssues, firstYear, lastYear, lastMonth);\n\n    Object.keys(labels).sort().forEach(label => {\n        dumpActive(label, labels[label], firstYear, lastYear, lastMonth);\n    });\n    //console.log(JSON.stringify(labels, null, 4));\n\n\n    if (_dump) {\n        console.log(\"Dumping raw JSON data to: \" + filename + \"-dump\");\n        writeFile(filename + \"-dump\", JSON.stringify(openIssues, null, 4), \"json\", true);\n\n        console.log(\"Dumping raw JSON data to: \" + filename + \"-issues\");\n        writeFile(filename + \"-issues\", JSON.stringify(issues, null, 4), \"json\", true);\n    }\n\n    return filename;\n}\n\nif (parseArgs()) {\n\n    logMessage(\"Getting Github Status\");\n\n    let npmCmd = `gh issue list --limit 10000 --state all --json number,state,title,labels,milestone,createdAt,closedAt,updatedAt`;\n    console.log(`Running: \\\"${npmCmd}\\\"`);\n    try {\n        let output = child_process.execSync(npmCmd);\n        let filename = processIssues(JSON.parse(output));\n    \n        if (_csv) {\n            console.log(\"Writing CSV data to: \" + filename);\n            writeFile(filename, _csvOutput, \"csv\", true);\n        }\n    } catch (e) {\n        console.error(\"This command requires the Github CLI to be installed and configured.\");\n        throw e;\n    }\n\n} else {\n    showHelp();\n    process.exit(1);\n}\n"
  },
  {
    "path": "tools/status-tools/package.json",
    "content": "{\n    \"name\": \"applicationinsights-js-status-tools\",\n    \"version\": \"3.1.3-dev\",\n    \"author\": \"Javascript Telemetry SDKs <TelReachSDK@microsoft.com>\",\n    \"description\": \"1DS Web SDK\",\n    \"homepage\": \"https://github.com/microsoft/ApplicationInsights-JS\",\n    \"sideEffects\": false,\n    \"scripts\": {\n        \"clean\": \"git clean -xdf\",\n        \"update\": \"rush update\",\n        \"build\": \"\",\n        \"rebuild\": \"\",\n        \"test\": \"\",\n        \"issues\": \"node ./github-status.js\"\n    },\n    \"keywords\": [\n        \"1DS\",\n        \"Js\",\n        \"SDK\"\n    ],\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/ApplicationInsights-JS/tree/main/tools/status-tools\"\n    },\n    \"devDependencies\": {\n        \"grunt\": \"^1.6.1\",\n        \"globby\": \"^11.0.0\"\n    }\n}\n"
  },
  {
    "path": "tools/subResourceIntegrity/generateIntegrityFile.js",
    "content": "const fs = require(\"fs\");\nconst globby = require(\"globby\");\nconst crypto = require(\"crypto\");\nconst extractFilename = /^(.*(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(-[\\w]+(\\.[\\d]+){0,1}){0,1}|test))(\\..*js)$/;\n\nfunction calculateHash(source, algorithm) {\n    return crypto.createHash(algorithm).update(source).digest().toString('base64');\n}\n\nfunction getFilename(inputFile, packageVersion) {\n    var filename = inputFile;\n    var path = \"\";\n    var pos = inputFile.lastIndexOf(\"/\");\n    if (pos == -1) {\n        pos = inputFile.lastIndexOf(\"\\\\\");\n    }\n\n    if (pos != -1) {\n        path = inputFile.substring(0, pos);\n        filename = inputFile.substring(pos + 1);\n    }\n\n    var match = null;\n    var module = filename;\n    var matchType = \"\";\n\n    var verIdx = filename.indexOf(\".\" + packageVersion);\n    if (verIdx === -1) {\n        verIdx = filename.indexOf(\"-\" + packageVersion);\n    }\n    if (verIdx != -1) {\n        verIdx += (packageVersion.length + 1);\n        matchType = \"Package version\";\n        // This was added to specific handle package versions with pre-release and version (eg ai.xxx-nightly.20210802)\n        module = filename.substring(0, verIdx);\n        match = [\n            inputFile,                  // Raw original file\n            path + \"/\" + module,        // IntFile group [1]\n            packageVersion,             // Version group [2]\n            null,\n            null,\n            filename.substring(verIdx + 1) // format group (extension) [5]\n        ];\n    } else {\n        // General Regex match\n        matchType = \"RegEx\";\n        match = extractFilename.exec(inputFile);\n        if (!match && filename.endsWith(\".js\")) {\n            matchType = \"Extension\";\n            // Handle files with no version eg. applicationinsights-core-js, etc\n            var idx = filename.indexOf(\".gbl.\");\n            if (idx === -1) {\n                idx = filename.indexOf(\".cjs.\");\n            }\n            if (idx === -1) {\n                idx = filename.indexOf(\".min.\");\n            }\n            if (idx === -1) {\n                idx = filename.indexOf(\".js\");\n            }\n            if (idx != -1) {\n                module = filename.substring(0, idx);\n                match = [\n                    inputFile,                  // Raw original file\n                    path + \"/\" + module,        // IntFile group\n                    packageVersion,             // Version group\n                    null,\n                    null,\n                    filename.substring(idx + 1) // format group (extension)\n                ];\n            }\n        }\n    }\n\n    if (match) {\n        console.log(\"Loading - \" + inputFile + \"  (\" + matchType + \") => (\" + JSON.stringify(match) + \")\");\n\n        var intFile = match[1];\n        var version = match[2];\n        var format = match[5];\n\n        var idx = filename.lastIndexOf(\".\" + packageVersion);\n        if (idx === -1) {\n            idx = filename.lastIndexOf(\"-\" + packageVersion);\n        }\n        if (idx == -1) {\n            idx = filename.lastIndexOf(\"-test\");\n        }\n\n        if (idx != -1) {\n            module = filename.substring(0, idx);\n        } else if (version !== packageVersion) {\n            console.log(\"Skipping - \" + inputFile + \"  (\" + matchType + \")\");\n\n            return {\n                name: filename\n            };\n        }\n\n        if (format.startsWith(\".\")) {\n            format = format.substring(1);\n        }\n\n        console.log(\"Loading - \" + inputFile + \"  (\" + matchType + \")\");\n\n        return {\n            name: filename,\n            module: module,\n            version: version,\n            format: format,\n            intFile: intFile + \".integrity.json\"\n        };\n    }\n\n    return {\n        name: filename\n    };\n}\n\nfunction processPath(integrityCache, path, version) {\n    const files = globby.sync(path);\n    files.map(inputFile => {\n        var names = getFilename(inputFile, version);\n        if (names.intFile) {\n            var src = fs.readFileSync(inputFile, \"utf8\");\n    \n            const hash256 = calculateHash(src, 'sha256');\n            const hash384 = calculateHash(src, 'sha384');\n            const hash512 = calculateHash(src, 'sha512');\n    \n            var integrityJson = integrityCache[names.intFile];\n            if (!integrityJson) {\n                integrityJson = {\n                    name: names.module\n                };\n\n                if (names.version) {\n                    integrityJson.version = names.version;\n                }\n\n                // Cache it\n                integrityCache[names.intFile] = integrityJson;\n            } else if (integrityJson.name != names.module) {\n                throw new Error(\"Error! - Module name [\" + integrityJson.name + \"] does not match expected [\" + names.module + \"]\");\n            } else if (names.version && integrityJson.version != names.version) {\n                throw new Error(\"Error! - Module version [\" + integrityJson.version + \"] does not match expected [\" + names.version + \"]\");\n            }\n\n            var name = \"@\" + names.format;\n            var details = integrityJson.ext = integrityJson.ext || {};\n            var fileDetails = details[name] = details[name] || {};\n            fileDetails.file = names.name;\n            fileDetails.type = \"text/javascript; charset=utf-8\";\n            fileDetails.integrity = `sha256-${hash256} sha384-${hash384} sha512-${hash512}`;\n            fileDetails.hashes = {\n                sha256: hash256,\n                sha384: hash384,\n                sha512: hash512\n            };\n        }\n    });\n}\n\n(function generateIntegrityFile() {\n    var integrityCache = {};\n\n    var package = JSON.parse(fs.readFileSync(\"./package.json\", \"utf8\"));\n    processPath(integrityCache, \"./browser/**/*.js\", package.version);\n    processPath(integrityCache, \"./bundle/**/*.js\", package.version);\n    processPath(integrityCache, \"./snippet/**/*.js\", package.version);\n    processPath(integrityCache, \"./dist/**/*.zip\", package.version);\n\n    Object.keys(integrityCache).forEach((name) => {\n        console.log(\"Writing - \" + name);\n        fs.writeFileSync(name, JSON.stringify(integrityCache[name], null, 4));\n    });\n})();\n"
  },
  {
    "path": "tools/updateDistEsm/updateDistEsm.js",
    "content": "import dynamicRemove from \"@microsoft/dynamicproto-js/tools/rollup\";\nimport MagicString from \"magic-string\";\n\nconst fs = require(\"fs\");\nconst globby = require(\"globby\");\n\n// Remap tslib functions to shim v2.0.0 functions\nconst remapTsLibFuncs = {\n    __extends: \"__extendsFn\",\n    __assign: \"__assignFn\",\n    __rest: \"__restFn\",\n    __spreadArray: \"__spreadArrayFn\",\n    __spreadArrays: \"__spreadArraysFn\",\n    __decorate: \"__decorateFn\",\n    __param: \"__paramFn\",\n    __metadata: \"__metadataFn\",\n    __values: \"__valuesFn\",\n    __read: \"__readFn\",\n    __createBinding: \"__createBindingFn\",\n    __importDefault: \"__importDefaultFn\",\n    __importStar: \"__importStarFn\",\n    __exportStar: \"__exportStarFn\",\n    __makeTemplateObject: \"__makeTemplateObjectFn\"\n};\n\n// You can use the following site to validate the resulting map file is valid\n// http://sokra.github.io/source-map-visualization/#custom\n\n// Function to remove the @DynamicProtoStubs and rewrite the headers for the dist-es5 files\nconst getLines = (theValue) => {\n    var value = \"\" + theValue;\n    var lines = [];\n    var idx = 0;\n    var startIdx = 0;\n    while (idx < value.length) {\n        // Skip blank lines\n        while (\n            idx < value.length &&\n            (value[idx] === \"\\n\" || value[idx] === \"\\r\")\n        ) {\n            idx++;\n        }\n\n        startIdx = idx;\n        while (\n            idx < value.length &&\n            !(value[idx] === \"\\n\" || value[idx] === \"\\r\")\n        ) {\n            idx++;\n        }\n\n        var len = idx - startIdx;\n        if (len > 0) {\n            var line = value.substring(startIdx, idx);\n            if (line.trim() !== \"\") {\n                lines.push({\n                    value: line,\n                    idx: startIdx,\n                    len: len\n                });\n            }\n        }\n    }\n\n    return lines;\n};\n\nfunction replaceTsLibImports(orgSrc, src, theString) {\n    // replace tslib import usage with \"import { xxx, xxx } from \"tslib\";\n    const detectTsLibUsage = /import[\\s]*\\{([^}]*)\\}[\\s]*from[\\s]*\\\"tslib\\\";/g;\n    let matches = detectTsLibUsage.exec(orgSrc);\n    while (matches != null) {\n        let newImports = [];\n        let imports = matches[1];\n        let tokens = imports.trim().split(\",\");\n        tokens.forEach((token) => {\n            let theToken = token.trim();\n            let remapKey = remapTsLibFuncs[theToken];\n            if (!remapKey) {\n                throw (\n                    'Unsupported tslib function \"' +\n                    theToken +\n                    '\" detected from -- ' +\n                    matches[0] +\n                    \"\"\n                );\n            }\n\n            newImports.push(remapKey + \" as \" + theToken);\n        });\n\n        let newImport =\n            \"import { \" +\n            newImports.join(\", \") +\n            ' } from \"@microsoft/applicationinsights-shims\";';\n        var idx = orgSrc.indexOf(matches[0]);\n        if (idx !== -1) {\n            console.log(`Replacing [${matches[0]}] with [${newImport}]`);\n            theString.overwrite(idx, idx + matches[0].length, newImport);\n            src = src.replace(matches[0], newImport);\n        }\n\n        // Find next\n        matches = detectTsLibUsage.exec(orgSrc);\n    }\n\n    return src;\n}\n\nfunction replaceTsLibStarImports(orgSrc, src, theString) {\n    // replace tslib import usage with \"import { xxx, xxx } from \"tslib\";\n    const detectTsLibUsage =\n        /import[\\s]*\\*[\\s]*as[\\s]*([^\\s]*)[\\s]*from[\\s]*\\\"tslib\\\";/g;\n    let matches = detectTsLibUsage.exec(orgSrc);\n    while (matches != null) {\n        let newImports = [];\n        let importPrefix = matches[1].trim();\n\n        let importLen = importPrefix.length + 1;\n        let idx = orgSrc.indexOf(importPrefix + \".\");\n        while (idx !== -1) {\n            let funcEnd = orgSrc.indexOf(\"(\", idx + importLen);\n            if (funcEnd !== -1) {\n                let funcName = orgSrc.substring(idx + importLen, funcEnd);\n                let newImport = remapTsLibFuncs[funcName];\n                if (!newImport) {\n                    throw (\n                        'Unsupported tslib function \"' +\n                        orgSrc.substring(idx, funcEnd) +\n                        '\" detected from -- ' +\n                        matches[0]\n                    );\n                }\n\n                // Add new import, if not already present\n                if (newImports.indexOf(newImport) == -1) {\n                    newImports.push(newImport);\n                }\n\n                let matchedValue = orgSrc.substring(idx, funcEnd + 1);\n                let newValue = newImport + \"(\";\n                console.log(\n                    `Replacing Usage [${matchedValue}] with [${newValue}]`\n                );\n                theString.overwrite(idx, idx + matchedValue.length, newValue);\n\n                // replace in the new source output as well\n                src = src.replace(matchedValue, newValue);\n            }\n\n            // Find next usage\n            idx = orgSrc.indexOf(importPrefix + \".\", idx + importLen);\n        }\n\n        let newImport =\n            \"import { \" +\n            newImports.join(\", \") +\n            ' } from \"@microsoft/applicationinsights-shims\";';\n        idx = orgSrc.indexOf(matches[0]);\n        console.log(`Replacing [${matches[0]}] with [${newImport}]`);\n        theString.overwrite(idx, idx + matches[0].length, newImport);\n        src = src.replace(matches[0], newImport);\n\n        // Find next\n        matches = detectTsLibUsage.exec(orgSrc);\n    }\n\n    return src;\n}\n\nfunction removeDynamicProtoStubs(orgSrc, src, theString, inputFile) {\n    const dynRemove = dynamicRemove();\n    var result = dynRemove.transform(orgSrc, inputFile);\n    if (result !== null && result.code) {\n        src = result.code;\n        console.log(\"Prototypes removed...\");\n\n        // Figure out removed lines\n        var orgLines = getLines(orgSrc);\n        var newLines = getLines(result.code);\n        var line = 0;\n        var newLine = 0;\n        while (line < orgLines.length) {\n            var matchLine = orgLines[line];\n            var matchNewLine = newLines[newLine];\n            var replaceText = \"\";\n            line++;\n            if (matchLine.value === matchNewLine.value) {\n                newLine++;\n            } else {\n                console.log(\"Line Changed: \" + matchLine.value);\n                var endFound = false;\n                var endLine = 0;\n                // Skip over removed lines (There may be more than 1 function being removed)\n                for (\n                    var nextLp = 0;\n                    endFound === false && newLine + nextLp < newLines.length;\n                    nextLp++\n                ) {\n                    if (newLine + nextLp < newLines.length) {\n                        for (var lp = 0; line + lp < orgLines.length; lp++) {\n                            if (\n                                orgLines[line + lp].value ===\n                                newLines[newLine + nextLp].value\n                            ) {\n                                endFound = true;\n                                for (var i = 0; i < nextLp; i++) {\n                                    if (replaceText.length) {\n                                        replaceText += \"\\n\";\n                                    }\n                                    replaceText += newLines[newLine + i].value;\n                                }\n                                endLine = line + lp;\n                                newLine = newLine + nextLp;\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                if (endFound) {\n                    console.log(\n                        \"Detected Removed lines \" + line + \" to \" + endLine\n                    );\n                    theString.overwrite(\n                        matchLine.idx,\n                        orgLines[endLine - 1].idx + orgLines[endLine - 1].len,\n                        replaceText\n                    );\n                    line = endLine;\n                } else {\n                    throw \"Missing line - \" + matchLine.value;\n                }\n            }\n        }\n    }\n\n    return src;\n}\n\nfunction fixIEDynamicProtoUsage(orgSrc, src, theString) {\n    // find all \"dynamicProto(<classname>,\" usages\n    // Then find all \"class <classname> \" usages and append a static variable after the name\n\n    const dynamicProtoUsage = /dynamicProto\\s*\\(\\s*(\\w*)\\s*,/g;\n    let matches = dynamicProtoUsage.exec(orgSrc);\n    while (matches != null) {\n        let className = matches[1].trim();\n\n        let hasProperty = new RegExp(\"^\\\\s*\" + className + \"\\\\.\\\\w+\\\\s*\", \"gm\");\n        let hasPropertyMatches = hasProperty.exec(src);\n        if (!hasPropertyMatches) {\n\n            if (orgSrc.indexOf(\" return \" + className + \";\") === -1) {\n                throw \"return \" + className + \"; -- doesn't exist!!! -- \" + orgSrc;\n            }\n    \n            let classRegEx = new RegExp(\"^\\\\s*return\\\\s+\" + className + \";\", \"gm\");\n            let classMatches = classRegEx.exec(orgSrc);\n            if (!classMatches) {\n                throw ('Unable to locate class definition for \"' + className + '\" using ' + classRegEx + ' detected from -- ' + matches[0] + ' -- ' + classMatches + \" in \\n\" + orgSrc);\n            }\n    \n            let newClass = \n                \"\\n    // This is a workaround for an IE bug when using dynamicProto() with classes that don't have any\" + \n                \"\\n    // non-dynamic functions or static properties/functions when using uglify-js to minify the resulting code.\" +\n                \"\\n    \" + className + \".__ieDyn=1;\" + \n                \"\\n\" + classMatches[0];\n    \n            var idx = orgSrc.indexOf(classMatches[0]);\n            if (idx !== -1) {\n                console.log(`Replacing [${classMatches[0]}] with [${newClass}]`);\n                theString.overwrite(idx, idx + classMatches[0].length, newClass);\n                src = src.replace(classMatches[0], newClass);\n            }\n\n        } else {\n            console.log(\"dynamicProto class has property or function -- \" + hasProperty + \" found \" + hasPropertyMatches[0]);\n        }\n\n        // Find next\n        matches = dynamicProtoUsage.exec(orgSrc);\n    }\n\n    return src;\n}\n\nconst updateDistEsmFiles = (\n    replaceValues,\n    banner,\n    replaceTsLib = true,\n    removeDynamic = true,\n    buildPath = \"dist-es5\"\n) => {\n    console.log(`UpdateDistEsmFiles: ./${buildPath}/**/*.js`);\n    if (!fs.existsSync(`./${buildPath}`)) {\n        console.error(`Build path does not exist ./${buildPath} - from:${process.cwd()}`);\n        process.exit(10);\n    }\n\n    const files = globby.sync(`./${buildPath}/**/*.js`);\n    files.map((inputFile) => {\n        console.log(\"Loading - \" + inputFile);\n        var src = fs.readFileSync(inputFile, \"utf8\");\n        var mapFile;\n        if (inputFile.endsWith(\".js\")) {\n            mapFile = inputFile + \".map\";\n        }\n\n        var orgSrc = src;\n        var theString = new MagicString(orgSrc);\n\n        if (removeDynamic) {\n            src = removeDynamicProtoStubs(orgSrc, src, theString, inputFile);\n        }\n\n        if (replaceTsLib) {\n            // replace any tslib imports with the shims module versions\n            src = replaceTsLibImports(orgSrc, src, theString);\n            src = replaceTsLibStarImports(orgSrc, src, theString);\n        }\n\n        src = fixIEDynamicProtoUsage(orgSrc, src, theString);\n\n        // Replace the header\n        Object.keys(replaceValues).forEach((value) => {\n            src = src.replace(value, replaceValues[value]);\n            var idx = orgSrc.indexOf(value);\n            if (idx !== -1) {\n                theString.overwrite(\n                    idx,\n                    idx + value.length,\n                    replaceValues[value]\n                );\n            }\n        });\n\n        // Rewrite the file\n\n        // Remove any force banner from the file\n        let replaceBanner = banner.replace(\"/*!\", \"/*\");\n        theString.prepend(replaceBanner + \"\\n\");\n        src = replaceBanner + \"\\n\" + src;\n\n        src = src.trim();\n        if (orgSrc !== src) {\n            fs.writeFileSync(inputFile, src);\n            if (mapFile) {\n                var newMap = theString.generateMap({\n                    source: inputFile.toString(),\n                    file: mapFile,\n                    includeContent: true,\n                    hires: false\n                });\n\n                console.log(\"Rewriting Map file - \" + mapFile);\n                fs.writeFileSync(mapFile, newMap.toString());\n            }\n        }\n    });\n};\n\nexport { updateDistEsmFiles };\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": false,\n    \"module\": \"amd\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true,\n    \"declaration\": true,\n    \"removeComments\": false\n  },\n  \"files\": [],\n  \"exclude\": [\n    \"node_modules/**\",\n    \"**/*.d.ts\"\n  ]\n}"
  },
  {
    "path": "tsconfigmodule.json",
    "content": "{\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"inlineSources\": true,\n    \"noImplicitAny\": false,\n    \"module\": \"amd\",\n    \"target\": \"es5\",\n    \"alwaysStrict\": true\n  },\n  \"files\": []\n}"
  },
  {
    "path": "tsdoc.json",
    "content": "{\n    \"$schema\": \"https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json\",\n    \"tagDefinitions\": [\n        {\n            \"tagName\": \"@author\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@description\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@implements\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@since\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@default\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@defaultBehavior\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@function\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@property\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@type\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@export\",\n            \"syntaxKind\": \"modifier\"\n        },\n        {\n            \"tagName\": \"@interface\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@ignore\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@return\",\n            \"syntaxKind\": \"block\"\n        },\n        {\n            \"tagName\": \"@group\",\n            \"syntaxKind\": \"block\"\n        }\n    ],\n    \"supportForTags\": {\n      \"@author\": true,\n      \"@description\": true,\n      \"@implements\": true,\n      \"@since\": true,\n      \"@returns\": true,\n      \"@default\": true,\n      \"@defaultBehavior\": true,\n      \"@function\": true,\n      \"@property\": true,\n      \"@type\": true,\n      \"@export\": true,\n      \"@interface\": true,\n      \"@defaultValue\": true,\n      \"@param\": true,\n      \"@example\": true,\n      \"@deprecated\": true,\n      \"@throws\": true,\n      \"@link\": true,\n      \"@internal\": true,\n      \"@typeParam\": true,\n      \"@see\": true,\n      \"@ignore\": true,\n      \"@return\": true,\n      \"@group\": true,\n      \"@remarks\": true,\n      \"@class\": true\n    }\n  }\n  "
  },
  {
    "path": "tslint-base.json",
    "content": "{\n    \"defaultSeverity\": \"error\",\n    \"extends\": [\n        \"tslint:latest\",\n        \"tslint-config-prettier\"\n    ],\n    \"rules\": {\n       \"no-eval\": true,\n       \"ordered-imports\": false,\n       \"variable-name\": false,\n       \"member-access\": false,\n       \"object-literal-sort-keys\": false,\n       \"no-bitwise\": false,\n       \"one-variable-per-declaration\": false,\n       \"max-classes-per-file\": false,\n       \"no-console\": false,\n       \"prefer-for-of\": false,\n       \"class-name\": false,\n       \"interface-name\": false,\n       \"no-empty-interface\": false,\n       \"no-string-literal\": false,\n       \"no-reference\": false,\n       \"no-empty\": false,\n       \"forin\": true,\n       \"ban-types\": false,\n       \"no-shadowed-variable\": false,\n       \"no-implicit-dependencies\": false,\n       \"no-object-literal-type-assertion\": false,\n       \"no-this-assignment\":false,\n       \"unified-signatures\": false,\n       \"no-unused-expression\": false,\n       \"no-var-keyword\": false,\n       \"no-duplicate-variable\": false,\n       \"prefer-const\": false,\n       \"only-arrow-functions\": false,\n       \"member-ordering\": false\n    }\n}\n"
  },
  {
    "path": "tslint.json",
    "content": "{\n    \"extends\": [\n        \"./tslint-base.json\"\n    ]\n}\n"
  },
  {
    "path": "version.json",
    "content": "{\n    \"description\": \"The release value identifies the base version that will be applied via the tools/release-tools/setVersion.js\",\n    \"usage\": \"When creating a new release you should update this value directly or via the eg. 'npm run setVersion -- 3.2.0' or 'npm run setVersion -- -patch' or 'npm run setVersion -- -minor'\",\n    \"release\": \"3.4.1\",\n    \"next\": \"patch\",\n    \"pkgs\": {\n        \"@microsoft/applicationinsights-web\": {\n            \"package\": \"package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-web-basic\": {\n            \"package\": \"AISKULight/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-channel-js\": {\n            \"package\": \"channels/applicationinsights-channel-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-analytics-js\": {\n            \"package\": \"extensions/applicationinsights-analytics-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-clickanalytics-js\": {\n            \"package\": \"extensions/applicationinsights-clickanalytics-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-osplugin-js\": {\n            \"package\": \"extensions/applicationinsights-osplugin-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-debugplugin-js\": {\n            \"package\": \"extensions/applicationinsights-debugplugin-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-dependencies-js\": {\n            \"package\": \"extensions/applicationinsights-dependencies-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-perfmarkmeasure-js\": {\n            \"package\": \"extensions/applicationinsights-perfmarkmeasure-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-properties-js\": {\n            \"package\": \"extensions/applicationinsights-properties-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-common\": {\n            \"package\": \"shared/AppInsightsCommon/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-core-js\": {\n            \"package\": \"shared/AppInsightsCore/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-offlinechannel-js\": {\n            \"package\": \"channels/offline-channel-js/package.json\",\n            \"release\": \"0.4.1\"\n        },\n        \"@microsoft/applicationinsights-chrome-debug-extension\": {\n            \"package\": \"tools/chrome-debug-extension/package.json\",\n            \"release\": \"0.9.1\"\n        },\n        \"applicationinsights-web-config\": {\n            \"package\": \"tools/config/package.json\",\n            \"release\": \"1.1.1\"\n        },\n        \"@microsoft/applicationinsights-example-aisku\": {\n            \"package\": \"examples/AISKU/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-example-dependencies\": {\n            \"package\": \"examples/dependency/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-example-shared-worker\": {\n            \"package\": \"examples/shared-worker/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-teechannel-js\": {\n            \"package\": \"channels/tee-channel-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-test-module-type-check\": {\n            \"package\": \"AISKU/Tests/es6-module-type-check/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-cfgsync-js\": {\n            \"package\": \"extensions/applicationinsights-cfgsync-js/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/applicationinsights-example-cfgsync\": {\n            \"package\": \"examples/cfgSync/package.json\",\n            \"release\": \"3.4.1\"\n        },\n        \"@microsoft/1ds-post-js\": {\n            \"package\": \"channels/1ds-post-js/package.json\",\n            \"release\": \"4.4.1\"\n        },\n        \"@microsoft/1ds-core-js\": {\n            \"package\": \"shared/1ds-core-js/package.json\",\n            \"release\": \"4.4.1\"\n        },\n        \"@microsoft/applicationinsights-web-snippet\": {\n            \"package\": \"tools/applicationinsights-web-snippet/package.json\",\n            \"release\": \"1.3.1\"\n        },\n        \"@microsoft/applicationinsights-example-startspan\": {\n            \"package\": \"examples/startSpan/package.json\",\n            \"release\": \"3.4.1\"\n        }\n    }\n}\n"
  },
  {
    "path": "versionConflict.md",
    "content": "# Running multiple version in one session\n\n\nIf multiple instances of different versions of Application Insights are running on the same page, errors may occur. In this talbe, we have identified several common error messages that you might encounter.\n\n| Script Ver | Snippet Context sdkversion | Microsoft.ai                                                              | ERROR MESSAGE                                                                                                          |   |\n|------------|----------------------------|---------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------|---|\n| 2 -> 3     | 2                          | core utils, should be v2<br>Mod is all v2                                 | Uncaught TypeError: Cannot read properties of undefined (reading 'disabbleFetchTracking')                              |   |\n| 3 -> 2     | 2                          | core utils, should be v2<br>Mod is all v2                             | TypeError: Cannot read properties of undefined (reading 'disabbleFetchTracking')                                       |   |\n| 1 -> 3     | 3                          | m.ai.version = 1<br>Inside mode, only RequestHeaders: \"---\", all other v3 | Dynamic config change fail                                                                                             |   |\n| 3 -> 1     | 3                          | Mod all v3,function location is 3                                         | Uncaught TypeError: Cannot assign to read only property 'CRITICAL' of object '#<Object>'<br><br>Dynamic config change fail |   |\n| 1 -> 2     | 2                          | m.ai.version = 1, mod all v2                                              | TypeError: Cannot read properties of undefined (reading 'disabbleFetchTracking')                                       |   |\n| 2 -> 1     | 2                          | core utils, should be v2<br>Mod is all v2                                 | Uncaught TypeError: Cannot read properties of undefined (reading 'disabbleFetchTracking')                              |   |\n\n\nTypiocal Error in console log:\n1. Uncaught TypeError: Cannot assign to read only property 'CRITICAL' of object '#<Object>'\n2. When using Dynamic config, get error meesage:\nUncaught TypeError: Cannot set property config of #<AppInsightsSku> which has only a getter\n\n\n"
  }
]